C盘被wsl吃干抹净

前言 说是 被 WSL 给吃干抹净是不严谨的,但是这次出现的问题是公司一台开发机器。512 拆分两个盘,而我在运行 WSL Ubuntu 的过程中突然断联,说 1 2 3 4 5 6 (base) PS C:\Users\mck-dev> wsl <3>WSL (40532 - Relay) ERROR: CreateProcessParseCommon:1003: getpwuid(1000) failed 5 <3>WSL (40532 - Relay) ERROR: ConfigUpdateLanguage:2519: fopen(/etc/default/locale) failed 5 <3>WSL (40532 - Relay) ERROR: operator():577: getpwuid(0) failed 5 <3>WSL (40532) ERROR: I/O error @util.cpp:1356 (UtilInitGroups) <3>WSL (40532 - Relay) ERROR: CreateProcessCommon:805: Create process failed 一看C盘已经不是爆红,而是彻底满了。 这让我想起来 WSL 默认的文件系统应该也是在 C 盘(上次操作docker 给客户操作了一次),那我应该迁移一次,但是这次不是docker,怎么迁移这个文件系统 在WSL setting中找到文件系统的菜单中只有大小的设置,那么看来没有什么GUI的工具能帮我啦。 遇到这种问题其实很生气,因为我当时强行合盘,在我获得一个 2T的 C盘时,给我电脑造成超多碎片垃圾到现在没有清理干净。真是丧尽天良的落后设计。 导出内容 WSL 的“默认盘符”本质上是 发行版的 ext4.vhdx 所在位置。 只要 ext4.vhdx 在 D 盘,本质就已经迁移完成。 他已经来到了8G,对于这台118GB的 C盘,之前又装了 Epic 开发UE5,爆满在意料之中 执行以下命令把他导出 1 2 3 4 5 (base) PS C:\Users\mck-dev> wsl --export Ubuntu-22.04 D:\wsl\ubuntu.tar 正在导出,这可能需要几分钟时间。 (0 MB) 无法启动分发。错误代码: 6,失败步骤: 2 错误代码: Wsl/Service/E_FAIL 结果失败了,我猜爆满的C盘已经没有能力启动 WSL 。那么通过 WSL 去导出文件已经不可能。那就只能先清理一部分了。 清理了常见的 temp 和download,没有任何改善,此时我可以抛弃wsl的数据, ...

February 2, 2026 · 1 min · 205 words · Ray

全自动替换图床链接

手动处理图片链接太痛苦了,每次都要下载、上传、替换链接,步骤多还容易出错。写个脚本让它全自动,一劳永逸。 问题 博客图片管理一直是个麻烦事: 从微信公众号转载文章,图片都是外链 外链不稳定,说不定哪天就挂了 想迁移图床,手动改链接太繁琐 一不小心就忘了某个步骤,图片上传了链接没更新 原理 其实就三步: 下载:扫描 Markdown 文件,找到所有外部图片,下载到本地 上传:把本地图片通过 PicGo 上传到图床 替换:更新 Markdown 中的图片链接 核心是用正则提取图片引用 ![](url),然后做 URL 映射替换。 加上缓存机制(基于文件 hash),避免重复上传。再加个备份功能,出问题能回滚。 实现 写了三个脚本: 1. auto_migrate.py - 一键式 最常用,自动完成所有步骤: 1 2 python3 scripts/auto_migrate.py --dry-run # 预览 python3 scripts/auto_migrate.py # 正式执行 运行前会提醒检查 PicGo 配置,避免上传到错误图床。 2. fix_current_links.py - 修复 如果图片已上传但链接没更新,用这个: 1 python3 scripts/fix_current_links.py --yes 从缓存文件 .image_cache.json 读取映射关系,批量更新链接。 3. blog_image_manager.py - 手动模式 需要精细控制时用,可以单独执行下载或上传。 使用 最简单就两步: 1 2 3 4 5 # 1. 预览(首次推荐) python3 scripts/auto_migrate.py --dry-run # 2. 正式执行 python3 scripts/auto_migrate.py 出问题可以回滚: ...

January 28, 2026 · 1 min · 129 words · Ray

ClawdBot 在 树莓派上

截止到写这篇文章,ClawdBot 已经火出圈了,被 Anthropic 告了一手后现在已经改名 Moltbot,🦞龙虾 bot。 之前在我自己的服务器上安装过,但是看到很多 skills 的配置比较繁琐(我连敲代码都很少配置外部能力。)实在是没有精力搞,所以也没觉得很牛。但是最近翻出公司的老树莓派就不一样了。废物必须利用,折腾永垂不朽。 安装 🦞bot 的作者是推崇 一键安装的,所以他们为这个努力了不少,那么理论上我应该也可以诶 curl -fsSL https://clawd.bot/install.sh | bash,果然一路畅通无阻 这其中唯一的坑就是 minimax 的官方配置是 海外的站、而我使用的账号是国内版、所以需要修改一下 baseurl、这里当时忘记截图了,总之根据官方文档改一下 json 就行 使用 写文时想到使用飞书、此时尚未有人做适配,我也为了浅尝就不折腾太多了,配置 tg bot 试试, 效果图: 叫上同事进来试了一下,没想到还真的能用。功能一切正常,简单试了一下,模型能力挺重要的,如果没有定时提醒之类的能力,agent 还是比较鸡肋,但是如果未来接入飞书、配合适当的 skills、做好持久 memory,那么个人秘书就在眼前了。 唯一的缺点是每次运行都在持续消耗 money。

January 28, 2026 · 1 min · 37 words · Updated: February 25, 2026 · Ray

PostGIS 浅尝

PostGIS 教程 1. 什么是 PostGIS PostGIS 是 PostgreSQL 数据库的一个扩展,它允许在数据库中存储和操作 GIS(地理信息系统)空间数据。它为 PostgreSQL 添加了空间数据类型、索引和大量空间函数,可以进行地理分析、距离计算、空间查询等操作。 PostGIS 2. 准备工作:安装与启用扩展 在 PostgreSQL 数据库中启用 PostGIS,需要使用 SQL 命令创建扩展。示例: 1 CREATE EXTENSION postgis; 启用后,数据库将支持空间数据类型如 geometry 和 geography。 3. 空间数据类型 坐标系统说明 SRID 4326:WGS84 坐标系,通常用于 GPS 经纬度数据。 GEOGRAPHY 类型:采用球面/椭球面计算真实地球表面距离(单位是米). GEOMETRY 类型:采用平面坐标计算,通常用于投影坐标系,不适合直接计算地球表面距离。 3.1 geometry 类型 geometry 是用于表示平面(笛卡尔)空间几何对象的数据类型,支持点、线、多边形等多种几何类型。空间行为依赖于坐标参考系统(SRID)。 常见的几何类型包括: POINT:单个点 LINESTRING:线段序列 POLYGON:多边形 MULTIPOINT、MULTILINESTRING、MULTIPOLYGON:复合几何类型 3.2 geography 类型 geography 是用于地理空间数据的类型,面向真实球面或椭球体,适合经纬度数据和真实地球距离的计算。使用此类型的距离和面积计算会基于地球模型返回现实世界的单位(如米)。 4. 空间参考系统(SRID) 空间数据的坐标依赖空间参考系统(SRID)。常见的 SRID 包括: 4326(WGS84):基于全球 GPS 坐标,经度/纬度,常用于地理坐标。 使用 SRID 能确保空间对象在正确的参考系统下解释和计算。 5. 基本操作:创建空间数据 5.1 创建几何点 1 SELECT ST_MakePoint(-121.97, 37.38); 这个函数会返回一个 geometry 类型的点对象。 ...

January 26, 2026 · 2 min · 277 words · Updated: March 18, 2026 · Ray

浅尝AI帮我分析股票

之前看到多次那种AI虚拟盘炒股大战了,今天又刷到个股市分析的项目,忍不住了,搞一个下来玩玩 以下记录折腾过程而已 GitHub - ZhuLinsen/daily_stock_analysis: LLM驱动的 A/H股智能分析器,多数据源行情 + 实时新闻 + Gemini 决策仪表盘 + 多渠道推送,零成本,纯白嫖,定时运行 我就不搞actions了,反正有服务器 第一步先拉仓库下来 配环境 随后我最近在学uv,让uv接管依赖管理。直接 uv add -r requirements.txt 然按照作者的环境配置指南,配上gemini的连接方式,由于没看到在哪里自定义gemini的调用方式,进代码一看,发现作者使用的是google.generativeai包,该包已被弃用,虽然还能用,但是我改成了使用 google.genai analyzer.py 中 _init_model 方法更新成如下 [python] 显示已折叠代码(58 行) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 def _init_model(self) -> None: """ 初始化 Gemini 模型 配置: - 使用 gemini-3-flash-preview 或 gemini-2.5-flash 模型 - 不启用 Google Search(使用外部 Tavily/SerpAPI 搜索) - 支持自定义 endpoint(通过 GEMINI_API_ENDPOINT 环境变量) Note: 使用新的 google.genai 包(旧的 google.generativeai 已弃用) """ try: from google import genai from google.genai import types # 从配置获取参数 config = get_config() model_name = config.gemini_model fallback_model = config.gemini_model_fallback # 构建客户端配置 client_kwargs = { 'api_key': self._api_key, } # 配置自定义 endpoint(如果设置) if config.gemini_api_endpoint: logger.info(f"使用自定义 Gemini Endpoint: {config.gemini_api_endpoint}") client_kwargs['http_options'] = { 'baseUrl': config.gemini_api_endpoint, # 注意:参数名是 baseUrl,不是 api_endpoint } # 如果配置了 API 版本,也添加进去 if config.gemini_api_version: client_kwargs['http_options']['apiVersion'] = config.gemini_api_version # 注意:参数名是 apiVersion # 创建 Gemini 客户端 self._genai_client = genai.Client(**client_kwargs) # 尝试初始化主模型 try: # 新版 API 不再使用 GenerativeModel,而是直接通过 client.models.generate_content # 这里我们只需要记录模型名称 self._current_model_name = model_name self._using_fallback = False self._model = self._genai_client # 保存客户端引用 logger.info(f"Gemini 模型初始化成功 (模型: {model_name})") except Exception as model_error: # 尝试备选模型 logger.warning(f"主模型 {model_name} 初始化失败: {model_error},将尝试备选模型 {fallback_model}") self._current_model_name = fallback_model self._using_fallback = True self._model = self._genai_client logger.info(f"Gemini 备选模型配置完成 (模型: {fallback_model})") except Exception as e: logger.error(f"Gemini 模型初始化失败: {e}") self._model = None self._genai_client = None config加上 ...

January 24, 2026 · 2 min · 282 words · Ray