[{"content":"为什么是 Wireshark 网络出问题的时候，\u0026ldquo;感觉很慢\u0026quot;\u0026ldquo;连不上\u0026quot;这类描述基本没法排查，真正有用的是抓包看数据到底发生了什么。Wireshark 是这个领域的事实标准——开源、免费、跨平台，协议库覆盖了几乎所有你能遇到的协议，从最基础的 TCP/IP 到 HTTP/2、TLS、DNS，甚至各种私有协议都能解析。\n它不只是排障工具。想理解 TCP 三次握手到底长什么样、TLS 握手交换了什么、DNS 查询的完整过程，打开 Wireshark 抓一次包，比看十篇文章都直观。\n安装 Windows、macOS、Linux 都有官方安装包，官网下载即可。\nLinux 下有个细节：普通用户默认没有抓包权限，需要把自己加入 wireshark 用户组：\nsudo usermod -aG wireshark $USER 加完组之后要重新登录才生效，不然会发现列表里的网卡全是灰的，点不动。\n界面速览：从打开到抓到第一个包 打开 Wireshark，首页是网络接口列表——有线网卡、WiFi、还有一些虚拟网卡（VPN、虚拟机网卡等）。每个接口旁边有个实时流量的小波形图，大致能看出哪个接口当前有流量。\n双击想抓的接口，立刻开始实时捕获，界面会不断刷新滚动。这时候数据包已经在飞了，接下来的重点是怎么从里面找到你要的东西。\n主界面分三块：\n上方包列表：每一行是一个数据包，显示时间、源地址、目的地址、协议、长度和简要信息 中间包详情：点击某一行，下方展开这个包的分层结构——以太网帧 → IP 层 → TCP/UDP 层 → 应用层协议，逐层可以点开看具体字段 下方十六进制视图：包的原始字节内容，对应详情面板里选中的字段会高亮 刚开始不用管十六进制视图，重点在过滤器和包详情。\n过滤器：真正的核心功能 不用过滤器直接看几万个包是没法工作的。顶部的过滤器输入框（display filter）是 Wireshark 最重要的功能，输入表达式后按回车即可筛选。\n常用过滤器示例：\nip.addr == 192.168.1.1 # 只看某个 IP 相关的包（双向） ip.src == 192.168.1.1 # 只看从这个 IP 发出的包 tcp.port == 443 # 只看某端口（不区分源/目的） http # 只看 HTTP 流量 dns # 只看 DNS 请求和响应 tcp.flags.syn == 1 # 只看 TCP 握手中的 SYN 包 http.response.code == 404 # 只看 404 响应 tls.handshake.type == 1 # 只看 TLS Client Hello 过滤器支持逻辑组合：\nip.addr == 192.168.1.1 \u0026amp;\u0026amp; tcp.port == 443 http || dns 输入过滤条件时框内会有颜色提示——绿色是语法正确，红色是错误，这个反馈很及时，写复杂表达式时不用等按回车才知道对不对。\nFollow Stream：还原一次完整会话 排障时经常需要的不是单个包，而是\u0026quot;这次 HTTP 请求到底发生了什么\u0026rdquo;。右键任意一个包，选择 Follow → TCP Stream（或 HTTP Stream），Wireshark 会把这次会话的所有往来数据拼在一起，按时间顺序展示，客户端发的和服务端回的用不同颜色区分。\n这个功能对调试接口问题特别有用——比如怀疑某个请求头没发对，或者想确认服务端返回的响应体内容，Follow Stream 比逐个包翻快得多。\n统计功能：宏观视角 单个包看多了容易只见树木不见森林，Statistics 菜单提供了几个有用的宏观视图：\nProtocol Hierarchy：这次抓包里各协议分别占多少流量，一眼看出主要流量类型 Conversations：按 IP 对或端口对聚合，看谁跟谁通信最多 I/O Graph：流量随时间变化的图表，判断是持续高流量还是某个时间点突发 实战案例：排查一次\u0026quot;网站打不开\u0026rdquo; 假设遇到某个网站间歇性打不开，用 Wireshark 排查的大致思路：\n先抓包再复现问题：打开抓包，然后立刻访问那个网站，让 Wireshark 记录完整过程 过滤 DNS：输入 dns，确认域名解析是否正常返回、有没有超时重试 过滤目标 IP：解析出 IP 后，用 ip.addr == 目标IP 单独看这次连接 看 TCP 握手：搜索 tcp.flags.syn == 1，确认 SYN 包发出后有没有收到 SYN-ACK。如果只有 SYN 没有回应，说明是网络层或防火墙问题，跟应用层无关 看有没有重传：过滤 tcp.analysis.retransmission，如果这里有大量结果，说明链路存在丢包，是\u0026quot;慢\u0026quot;和\u0026quot;偶尔连不上\u0026quot;的常见原因 看 TLS 握手（如果是 HTTPS）：过滤 tls.handshake，确认握手是否顺利完成，有没有在某个阶段卡住或被重置 按这个顺序走一遍，通常能把问题定位到具体哪一层——是 DNS、是网络连通性、是丢包，还是应用层本身的问题。\n小结 Wireshark 的学习曲线主要在过滤器语法和协议知识上，但入门门槛不高：先学会几个常用过滤器、学会 Follow Stream，遇到具体问题就够用了。协议细节可以在实际抓包中慢慢积累，不需要一开始就系统学完 TCP/IP。\n它也是免费学协议最直观的方式——与其看文字描述三次握手，不如自己抓一次包，亲眼看着 SYN、SYN-ACK、ACK 三个包依次出现。\n","permalink":"/posts/wireshark-%E6%8A%93%E5%8C%85%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/","summary":"\u003ch2 id=\"为什么是-wireshark\"\u003e为什么是 Wireshark\u003c/h2\u003e\n\u003cp\u003e网络出问题的时候，\u0026ldquo;感觉很慢\u0026quot;\u0026ldquo;连不上\u0026quot;这类描述基本没法排查，真正有用的是抓包看数据到底发生了什么。Wireshark 是这个领域的事实标准——开源、免费、跨平台，协议库覆盖了几乎所有你能遇到的协议，从最基础的 TCP/IP 到 HTTP/2、TLS、DNS，甚至各种私有协议都能解析。\u003c/p\u003e\n\u003cp\u003e它不只是排障工具。想理解 TCP 三次握手到底长什么样、TLS 握手交换了什么、DNS 查询的完整过程，打开 Wireshark 抓一次包，比看十篇文章都直观。\u003c/p\u003e\n\u003ch2 id=\"安装\"\u003e安装\u003c/h2\u003e\n\u003cp\u003eWindows、macOS、Linux 都有官方安装包，\u003ca href=\"https://www.wireshark.org/\"\u003e官网\u003c/a\u003e下载即可。\u003c/p\u003e\n\u003cp\u003eLinux 下有个细节：普通用户默认没有抓包权限，需要把自己加入 \u003ccode\u003ewireshark\u003c/code\u003e 用户组：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo usermod -aG wireshark $USER\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e加完组之后要重新登录才生效，不然会发现列表里的网卡全是灰的，点不动。\u003c/p\u003e\n\u003ch2 id=\"界面速览从打开到抓到第一个包\"\u003e界面速览：从打开到抓到第一个包\u003c/h2\u003e\n\u003cp\u003e打开 Wireshark，首页是网络接口列表——有线网卡、WiFi、还有一些虚拟网卡（VPN、虚拟机网卡等）。每个接口旁边有个实时流量的小波形图，大致能看出哪个接口当前有流量。\u003c/p\u003e\n\u003cp\u003e双击想抓的接口，立刻开始实时捕获，界面会不断刷新滚动。这时候数据包已经在飞了，接下来的重点是怎么从里面找到你要的东西。\u003c/p\u003e\n\u003cp\u003e主界面分三块：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e上方包列表\u003c/strong\u003e：每一行是一个数据包，显示时间、源地址、目的地址、协议、长度和简要信息\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e中间包详情\u003c/strong\u003e：点击某一行，下方展开这个包的分层结构——以太网帧 → IP 层 → TCP/UDP 层 → 应用层协议，逐层可以点开看具体字段\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e下方十六进制视图\u003c/strong\u003e：包的原始字节内容，对应详情面板里选中的字段会高亮\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e刚开始不用管十六进制视图，重点在过滤器和包详情。\u003c/p\u003e\n\u003ch2 id=\"过滤器真正的核心功能\"\u003e过滤器：真正的核心功能\u003c/h2\u003e\n\u003cp\u003e不用过滤器直接看几万个包是没法工作的。顶部的过滤器输入框（display filter）是 Wireshark 最重要的功能，输入表达式后按回车即可筛选。\u003c/p\u003e\n\u003cp\u003e常用过滤器示例：\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eip.addr == 192.168.1.1        # 只看某个 IP 相关的包（双向）\nip.src == 192.168.1.1         # 只看从这个 IP 发出的包\ntcp.port == 443                # 只看某端口（不区分源/目的）\nhttp                            # 只看 HTTP 流量\ndns                             # 只看 DNS 请求和响应\ntcp.flags.syn == 1              # 只看 TCP 握手中的 SYN 包\nhttp.response.code == 404       # 只看 404 响应\ntls.handshake.type == 1         # 只看 TLS Client Hello\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e过滤器支持逻辑组合：\u003c/p\u003e","title":"Wireshark 抓包入门：从安装到实战排障"},{"content":"如果你用过 IFTTT、Zapier 这类自动化工具，但又对把数据交给第三方服务感到不安，n8n 是最值得考虑的开源替代。它支持可视化拖拽搭建工作流，400+ 服务集成，而且可以完全自托管，数据不出自己的服务器。\n提示：n8n 采用 fair-code 协议，核心功能开源免费，自托管不收任何费用。官方也提供付费的 n8n Cloud 托管版，本文不涉及，只讲自部署。\n准备工作 你需要：\n一台能跑 Docker 的机器（VPS、NAS、或者本地 WSL 都行） Docker 和 Docker Compose 如果你还没有 Docker 环境，可以直接在 Linux/WSL 下安装 Docker Engine，或者用 Rancher Desktop 这类带 GUI 的方案。\n部署 n8n 最简单的方式是用 Docker Compose，新建一个目录，写入 docker-compose.yml：\nversion: \u0026#39;3\u0026#39; services: n8n: image: n8nio/n8n restart: unless-stopped ports: - \u0026#34;5678:5678\u0026#34; environment: - GENERIC_TIMEZONE=Asia/Shanghai - TZ=Asia/Shanghai - N8N_SECURE_COOKIE=false volumes: - ./n8n_data:/home/node/.n8n 注意：N8N_SECURE_COOKIE=false 是因为没有配置 HTTPS 时，n8n 默认的安全 Cookie 策略会导致登录失败。如果你后续用 Nginx/Caddy 反代加了 HTTPS，可以去掉这行。\n启动：\ndocker compose up -d 打开浏览器访问 http://你的服务器IP:5678，首次访问会要求创建管理员账号，邮箱密码自己设，不需要联网验证。\n数据全部存在 ./n8n_data 目录里，包括你的工作流、凭证、执行记录，备份这个目录就等于备份了整个 n8n。\n跑通第一个工作流：RSS 推送到 Telegram 熟悉界面最快的方式是直接做一个有用的东西。这里搭建一个\u0026quot;监控 RSS 源，有新文章就推送到 Telegram\u0026quot;的自动化。\n第一步：创建 Telegram Bot 打开 Telegram，搜索 @BotFather，发送 /newbot，按提示设置 Bot 名字，完成后会拿到一个 Token，形如：\n123456789:ABCdefGHIjklMNOpqrSTUvwxYZ 记下来，之后要填进 n8n。\n然后找到你刚创建的 Bot，随便发一条消息（比如\u0026quot;hi\u0026quot;），这一步是为了让 Bot 能识别到你的 Chat ID。\n接着访问这个链接（把 Token 换成你自己的）：\nhttps://api.telegram.org/bot\u0026lt;你的Token\u0026gt;/getUpdates 返回的 JSON 里找 chat.id 字段，记下来。\n第二步：在 n8n 里搭建工作流 登录 n8n，点击 New Workflow\n添加第一个节点，搜索 RSS Feed Trigger，配置你想监控的 RSS 地址（比如你自己博客的 /index.xml，或者任何你关注的站点）\n设置触发间隔，比如每 30 分钟检查一次\n添加第二个节点，搜索 Telegram，选择 Send Message 操作\n在 Telegram 节点里创建新凭证（Credential），填入第一步的 Bot Token\nChat ID 填第一步拿到的 ID\nText 字段用表达式引用 RSS 节点的输出，比如：\n新文章：{{ $json.title }} {{ $json.link }} 连接两个节点，点击右上角 Active 开关启用工作流 完成后，RSS 源一旦有新内容，n8n 会自动检测并推送到你的 Telegram。\nn8n 的表达式系统用 {{ }} 引用上游节点数据，类似 Excel 公式，鼠标悬停在字段上会有自动补全提示，不需要死记语法。\n进阶：文件变动通知 如果你在用 Syncthing 之类的自托管同步工具，也可以用 n8n 搭一个\u0026quot;指定目录有新文件就通知\u0026quot;的流程：\n用 Local File Trigger 节点（需要装社区节点）监控目录 连接 Telegram 或 Webhook 节点做通知 n8n 的优势就在这里：几乎任何\u0026quot;A 发生时做 B\u0026quot;的场景，都能用节点拼出来，不需要写代码。\n几个实用提示 凭证管理：n8n 会加密保存所有 API Key、Token，存在数据目录里，不会明文暴露在工作流 JSON 里（除非你导出时选择包含凭证） 执行记录：左侧菜单的 Executions 可以看到每次运行的详细日志，调试报错很方便 社区节点：官方集成不够用时，可以在设置里启用社区节点（Community Nodes），生态相当丰富 备份：直接打包 n8n_data 目录即可，迁移到新服务器解压启动就能用 写在最后 n8n 比 IFTTT/Zapier 多花的这点部署成本，换来的是数据主权和无限的工作流数量限制（官方云服务通常按执行次数收费）。如果你已经有自托管的习惯，把 n8n 加入你的服务清单是很自然的一步。\n","permalink":"/posts/n8n-self-host/","summary":"\u003cp\u003e如果你用过 IFTTT、Zapier 这类自动化工具，但又对把数据交给第三方服务感到不安，n8n 是最值得考虑的开源替代。它支持可视化拖拽搭建工作流，400+ 服务集成，而且可以完全自托管，数据不出自己的服务器。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e提示\u003c/strong\u003e：n8n 采用 fair-code 协议，核心功能开源免费，自托管不收任何费用。官方也提供付费的 n8n Cloud 托管版，本文不涉及，只讲自部署。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"准备工作\"\u003e准备工作\u003c/h2\u003e\n\u003cp\u003e你需要：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e一台能跑 Docker 的机器（VPS、NAS、或者本地 WSL 都行）\u003c/li\u003e\n\u003cli\u003eDocker 和 Docker Compose\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e如果你还没有 Docker 环境，可以直接在 Linux/WSL 下安装 Docker Engine，或者用 Rancher Desktop 这类带 GUI 的方案。\u003c/p\u003e\n\u003ch2 id=\"部署-n8n\"\u003e部署 n8n\u003c/h2\u003e\n\u003cp\u003e最简单的方式是用 Docker Compose，新建一个目录，写入 \u003ccode\u003edocker-compose.yml\u003c/code\u003e：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eversion\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;3\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eservices\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f92672\"\u003en8n\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003eimage\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003en8nio/n8n\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003erestart\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003eunless-stopped\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003eports\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      - \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;5678:5678\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003eenvironment\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      - \u003cspan style=\"color:#ae81ff\"\u003eGENERIC_TIMEZONE=Asia/Shanghai\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      - \u003cspan style=\"color:#ae81ff\"\u003eTZ=Asia/Shanghai\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      - \u003cspan style=\"color:#ae81ff\"\u003eN8N_SECURE_COOKIE=false\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f92672\"\u003evolumes\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      - \u003cspan style=\"color:#ae81ff\"\u003e./n8n_data:/home/node/.n8n\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e注意\u003c/strong\u003e：\u003ccode\u003eN8N_SECURE_COOKIE=false\u003c/code\u003e 是因为没有配置 HTTPS 时，n8n 默认的安全 Cookie 策略会导致登录失败。如果你后续用 Nginx/Caddy 反代加了 HTTPS，可以去掉这行。\u003c/p\u003e","title":"n8n 自托管：搭建你的工作流自动化中心"},{"content":"ExifTool 是由 Phil Harvey 开发的开源命令行工具，能读取和写入照片、视频几乎所有格式的元数据（EXIF、GPS、IPTC、XMP 等）。最新版本为 13.59（2026年5月）。\n安装 Windows\n从 exiftool.org 下载 Windows 可执行文件 .zip，解压后将 exiftool(-k).exe 改名为 exiftool.exe，放到 C:\\tools\\ 或任意加入了 PATH 的目录即可。\n也可以用 Scoop 安装：\nscoop install exiftool 验证安装\nexiftool -ver 一、查看元数据 查看单张照片的全部信息 exiftool photo.jpg 输出会列出几十个字段，包括相机型号、拍摄时间、快门速度、光圈、ISO、GPS 等。\n只查看指定字段 exiftool -DateTimeOriginal photo.jpg exiftool -Make -Model -LensModel photo.jpg exiftool -GPSLatitude -GPSLongitude photo.jpg 批量查看一个文件夹 exiftool D:\\Photos\\ 只显示文件名和拍摄时间（表格式输出） exiftool -T -FileName -DateTimeOriginal D:\\Photos\\ -T 参数让输出按制表符分隔，方便复制到表格。\n导出为 CSV exiftool -csv -FileName -DateTimeOriginal -Make -Model D:\\Photos\\ \u0026gt; output.csv 递归扫描子文件夹 exiftool -r D:\\Photos\\ 提示：查看 RAW 文件（.ARW、.RW2、.CR3 等）同样适用，ExifTool 支持几乎所有相机品牌的原始格式。\n二、修改元数据 修改拍摄时间 exiftool -DateTimeOriginal=\u0026#34;2024:06:01 12:00:00\u0026#34; photo.jpg 时间格式固定为 YYYY:MM:DD HH:MM:SS。\n批量修改一个文件夹内所有照片的时间（偏移） 比如照片时间全部偏差了 1 小时：\nexiftool \u0026#34;-DateTimeOriginal+=0:0:0 1:0:0\u0026#34; D:\\Photos\\ 添加/修改 GPS 坐标 exiftool -GPSLatitude=39.9042 -GPSLatitudeRef=N -GPSLongitude=116.4074 -GPSLongitudeRef=E photo.jpg 修改版权和作者信息 exiftool -Copyright=\u0026#34;© 2024 Shai\u0026#34; -Artist=\u0026#34;Shai\u0026#34; photo.jpg 批量修改所有 JPG 的作者 exiftool -ext jpg -Artist=\u0026#34;Shai\u0026#34; D:\\Photos\\ 注意：ExifTool 默认会保留原始文件的备份（photo.jpg_original）。确认修改无误后可以用 -overwrite_original 跳过备份：\nexiftool -overwrite_original -Artist=\u0026#34;Shai\u0026#34; photo.jpg 三、清除元数据（去除隐私信息） 清除所有元数据 exiftool -all= photo.jpg 只清除 GPS 信息（保留其他数据） exiftool -GPS:all= photo.jpg 批量清除一个文件夹的 GPS exiftool -r -GPS:all= D:\\Photos\\ 提示：发朋友圈或上传到社交平台前，可以用这个命令批量清除 GPS，防止位置泄露。\n四、批量重命名 按拍摄时间重命名 将文件名改为 20240601_120000.jpg 格式：\nexiftool \u0026#34;-FileName\u0026lt;DateTimeOriginal\u0026#34; -d \u0026#34;%Y%m%d_%H%M%S.%%e\u0026#34; D:\\Photos\\ 参数说明：\n%Y 年、%m 月、%d 日、%H 时、%M 分、%S 秒 %%e 保留原始扩展名 加上相机型号前缀 exiftool \u0026#34;-FileName\u0026lt;${Model}_${DateTimeOriginal}\u0026#34; -d \u0026#34;%Y%m%d_%H%M%S.%%e\u0026#34; D:\\Photos\\ 预览重命名结果（不实际执行） exiftool \u0026#34;-FileName\u0026lt;DateTimeOriginal\u0026#34; -d \u0026#34;%Y%m%d_%H%M%S.%%e\u0026#34; -n D:\\Photos\\ 提示：加上 -n 参数可以预览操作结果而不真正执行，确认无误再去掉 -n 正式运行。\n五、按时间自动归类到文件夹 这是整理散乱照片最实用的功能。\n按年/月归类（推荐） 将照片整理到 D:\\Sorted\\2024\\06\\ 这样的目录结构：\nexiftool \u0026#34;-Directory\u0026lt;DateTimeOriginal\u0026#34; -d \u0026#34;D:/Sorted/%Y/%m\u0026#34; D:\\Photos\\ 按年归类（一级目录） exiftool \u0026#34;-Directory\u0026lt;DateTimeOriginal\u0026#34; -d \u0026#34;D:/Sorted/%Y\u0026#34; D:\\Photos\\ 同时重命名 + 归类 exiftool \u0026#34;-FileName\u0026lt;DateTimeOriginal\u0026#34; -d \u0026#34;%Y%m%d_%H%M%S.%%e\u0026#34; \u0026#34;-Directory\u0026lt;DateTimeOriginal\u0026#34; -d \u0026#34;D:/Sorted/%Y/%m\u0026#34; -r D:\\Photos\\ 递归处理子文件夹 加上 -r 参数：\nexiftool -r \u0026#34;-Directory\u0026lt;DateTimeOriginal\u0026#34; -d \u0026#34;D:/Sorted/%Y/%m\u0026#34; D:\\Photos\\ 注意：没有 EXIF 时间的照片（截图、微信图片等）不会被移动。可以加上 -if \u0026quot;$DateTimeOriginal\u0026quot; 只处理有时间的文件：\nexiftool -r -if \u0026#34;$DateTimeOriginal\u0026#34; \u0026#34;-Directory\u0026lt;DateTimeOriginal\u0026#34; -d \u0026#34;D:/Sorted/%Y/%m\u0026#34; D:\\Photos\\ 六、复制元数据 从一张照片复制元数据到另一张 exiftool -TagsFromFile source.jpg target.jpg 只复制时间信息 exiftool -TagsFromFile source.jpg -DateTimeOriginal target.jpg 七、常用参数速查 参数 说明 -r 递归处理子文件夹 -ext jpg 只处理指定扩展名 -n 预览模式，不实际执行 -overwrite_original 不保留备份文件 -q 静默模式，减少输出 -csv 输出为 CSV 格式 -T 制表符分隔输出 -if \u0026quot;条件\u0026quot; 条件过滤 -all= 清除所有元数据 八、常见问题 Q：照片没有 EXIF，时间是错的怎么办？\n先手动修正一张，确认格式正确，再批量偏移其他照片的时间。\nQ：处理后文件变大了？\nJPEG 写入元数据时 ExifTool 会重新整理文件结构，属于正常现象，图像质量不受影响。\nQ：如何撤销操作？\nExifTool 默认保留 _original 备份文件。恢复方法：\nexiftool -restore_original photo.jpg 批量恢复：\nexiftool -restore_original D:\\Photos\\ 延伸阅读 ExifTool 官网 ExifTool 支持的文件格式列表 ExifTool Tag Names 完整字段列表 ExifToolGUI（图形界面版本，不想用命令行可以试试） ","permalink":"/posts/exiftool-guide-hugo/","summary":"\u003cp\u003eExifTool 是由 Phil Harvey 开发的开源命令行工具，能读取和写入照片、视频几乎所有格式的元数据（EXIF、GPS、IPTC、XMP 等）。最新版本为 \u003cstrong\u003e13.59\u003c/strong\u003e（2026年5月）。\u003c/p\u003e\n\u003ch2 id=\"安装\"\u003e安装\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eWindows\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e从 \u003ca href=\"https://exiftool.org/\"\u003eexiftool.org\u003c/a\u003e 下载 Windows 可执行文件 \u003ccode\u003e.zip\u003c/code\u003e，解压后将 \u003ccode\u003eexiftool(-k).exe\u003c/code\u003e 改名为 \u003ccode\u003eexiftool.exe\u003c/code\u003e，放到 \u003ccode\u003eC:\\tools\\\u003c/code\u003e 或任意加入了 PATH 的目录即可。\u003c/p\u003e\n\u003cp\u003e也可以用 Scoop 安装：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escoop install exiftool\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e验证安装\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexiftool -ver\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"一查看元数据\"\u003e一、查看元数据\u003c/h2\u003e\n\u003ch3 id=\"查看单张照片的全部信息\"\u003e查看单张照片的全部信息\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexiftool photo.jpg\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e输出会列出几十个字段，包括相机型号、拍摄时间、快门速度、光圈、ISO、GPS 等。\u003c/p\u003e\n\u003ch3 id=\"只查看指定字段\"\u003e只查看指定字段\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexiftool -DateTimeOriginal photo.jpg\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexiftool -Make -Model -LensModel photo.jpg\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexiftool -GPSLatitude -GPSLongitude photo.jpg\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"批量查看一个文件夹\"\u003e批量查看一个文件夹\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexiftool D:\\Photos\\\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"只显示文件名和拍摄时间表格式输出\"\u003e只显示文件名和拍摄时间（表格式输出）\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexiftool -T -FileName -DateTimeOriginal D:\\Photos\\\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003e-T\u003c/code\u003e 参数让输出按制表符分隔，方便复制到表格。\u003c/p\u003e\n\u003ch3 id=\"导出为-csv\"\u003e导出为 CSV\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexiftool -csv -FileName -DateTimeOriginal -Make -Model D:\\Photos\\ \u0026gt; output.csv\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"递归扫描子文件夹\"\u003e递归扫描子文件夹\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexiftool -r D:\\Photos\\\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e提示\u003c/strong\u003e：查看 RAW 文件（\u003ccode\u003e.ARW\u003c/code\u003e、\u003ccode\u003e.RW2\u003c/code\u003e、\u003ccode\u003e.CR3\u003c/code\u003e 等）同样适用，ExifTool 支持几乎所有相机品牌的原始格式。\u003c/p\u003e","title":"ExifTool 完整使用指南"},{"content":"当 Linux 还不会说中文 2000 年前后的 Linux 桌面，与今天不是同一个世界。\nKDE 和 GNOME 正在激烈竞争，GTK 与 Qt 生态尚未成熟，发行版数量众多且碎片化。对中文用户而言，最大的麻烦甚至不是显卡驱动，而是一件更基础的事：系统装好了，却打不了中文。\n当时能用的中文输入方案有 XCIN、Chinput、MiniChinput 等，但普遍配置复杂，不同桌面环境之间兼容性差，GTK 与 Qt 支持不一致，维护者有限。很多用户第一次安装 Linux 后，需要花几个小时研究文档，才能让输入法勉强工作。\n在那个中文 Linux 用户本来就不多的年代，愿意长期维护中文输入法的人更是凤毛麟角。\n一个手滑打出来的名字 2002 年，一个网名叫 Yuking（鱼王）的开发者是五笔输入法用户。他发现现有方案不能满足自己的需求，于是做了一个后来无数程序员都做过的决定：既然没有合适的工具，那就自己写一个。\n这个项目最初叫做 gWubi——顾名思义，一个给 Linux 用的五笔输入法。但 gWubi 1.0 发布时，已经同时支持五笔、拼音和区位码输入，从一开始就超出了\u0026quot;五笔专用工具\u0026quot;的范畴。\n随着功能不断扩展，项目开始向输入法框架演化，需要一个新名字。Yuking 的想法是取 FCIT，来自\u0026quot;Free Chinese Input Tool\u0026quot;。但在提交代码时，他多敲了一个字母 x，变成了 Fcitx。\n那个年代没有 Git，代码版本控制用的是 Subversion，改名牵连太多，索性将错就错保留了下来。这个手滑打出来的名字，后来成了 Linux 中文输入法的代名词。\n2004 年，项目正式更名 Fcitx。Linux 的吉祥物是企鹅 Tux，Fcitx 也采用了企鹅形象作为图标，中文名随之定为小企鹅输入法。后来很多人只知道\u0026quot;小企鹅\u0026quot;，未必知道\u0026quot;Fcitx\u0026quot;这个英文名。\n差点死掉 2007 年，转折出现了。\n云帆论坛上有人公开批评 Fcitx 的代码写得很差。Yuking 受不了这个评价，在当年 7 月 10 日宣布终止项目。\n项目就这样停了。没有交接，没有继承者，代码扔在那里。当时的社区里弥漫着一种真实的失落感——小企鹅可能真的要没了。\n沉寂了一年多之后，2008 年 9 月，Yuking 自己回来了。他在帖子里写道，无法忘记 Fcitx。他加入了爱好者在 Google Code 上建立的新仓库，开始频繁更新，项目重新活了过来。\n但更深层的危机还埋在那里：一个人撑着的项目，终究脆弱。\n接棒的人 2009 年秋，一个大四学生在论坛上发现了 Fcitx，因为想让它更好地支持 KDE 的 Kimpanel 面板协议，便开始给这个项目提交代码。\n他叫翁学添，网名 CSSlayer。\n他后来在博客里记录了那段缘起，原话是：\u0026ldquo;总而言之，我就莫名地接手了这个项目的 fcitx 的部分，然后谁也不知道这埋下了一颗怎样的种子……\u0026rdquo;\n他给 Fcitx 的第一个 commit 时间戳是 2010 年 1 月 16 日，最初只是为了给 KDE 增加 Kimpanel 支持。这是他多年后在《我和 Fcitx 的 14 年》里翻出来的记录。\n从 Fcitx 3.6 版本开始，翁学添逐渐成为主要维护者。他做的不只是修 bug：整理历史代码、拆分模块、把编码从 GBK 迁移到 UTF-8、引入插件架构、重构通信机制。Fcitx 4 时代，它成了 Linux 桌面上最主流的中文输入法框架，被 Arch Linux、openSUSE、Fedora 等主流发行版收录。\n许多开源项目在创始人离开后迅速衰落。Fcitx 成为了少数成功完成维护权传承的案例。\nRime 的出现 2010 年后，另一个名字开始频繁出现在中文 Linux 社区：Rime（中州韵）。\nRime 本身是一个输入法引擎，而不是框架。它的特点是：高度可定制，配置文件全文本化，支持复杂的输入方案，几乎可以模拟任何一种汉字输入法的行为。对高级用户而言，它提供了接近\u0026quot;理想输入法\u0026quot;的可能。\n当 Rime 以插件形式接入 Fcitx 之后，Fcitx + Rime 成了大量技术用户的首选组合，直到今天依然如此。\nWayland：真正的大考 如果说与 IBus 的竞争带来的是压力，那么 Wayland 带来的是生存挑战。\n输入法与图形系统深度绑定。Wayland 与 X11 的设计理念完全不同，许多在 X11 时代理所当然的实现方式，在 Wayland 下全部失效：GTK 需要重新适配，Qt 需要重新适配，候选框定位机制需要重写，KDE 与 GNOME 的行为也不一致。\n许多项目选择观望或打补丁。翁学添的选择是：重构，而不是修补。\nFcitx5：第三次重生 2017 年，翁学添在博客上开始连载《The Road to Fcitx 5》系列文章。\n这不是一次普通的版本升级，而是接近完全重写的工程。他甚至为此专门从头实现了一个底层库 xcb-imdkit——一个用纯 C 写的 XCB 输入法协议库，因为当时根本没有现成的 XCB 实现可以用。Qt 和 SDL2 长期缺少 XIM 支持，根源正在于此。\n同年，他还写了 libime，一个全新的拼音和码表引擎，从零实现了分词算法和词频模型，替换掉 Fcitx 4 时代早已过时的旧引擎。整个开发过程被详细记录在博客里，是难得的一手技术文档。\n2020 年，fcitx5 正式发布。原生支持 Wayland，模块化插件架构，支持语言扩展到日文、韩文、越南文、藏文等，候选框渲染、主题系统全部重写。Fcitx 4 进入只读维护模式。\n落地手机 桌面端的问题解决了，但手机上一直是另一个缺口。\nAndroid 上早有同文输入法（Trime）——同样基于 RIME 引擎，2015 年起步，但体验长期偏粗糙：候选词界面难用，容易崩溃卡顿，对于习惯了桌面 Fcitx 的用户来说落差明显。\n2021 年，berberman 出现了。\n他是个 Haskell 程序员，NixOS 重度用户，GitHub 主页的 location 填的是\u0026quot;Gensokyo\u0026quot;——东方 Project 里的幻想乡。他还是 haskell-language-server 的贡献者，以及 Arch Linux 上 Haskell 生态维护者之一。这样背景的人，去做了一件听起来风马牛不相及的事：把 fcitx5 移植到 Android。\n技术上这并不简单。fcitx5 核心是 C++ 写的，要在 Android 上运行，需要通过 JNI 将 C++ 库接入 Android 的 Java/Kotlin 层，同时还要处理 Android InputMethodService 与 fcitx5 输入上下文之间的完整对接。berberman 与另一位开发者 rocka 等人合作，从头搭建了整套工程。\nFcitx5 for Android，中文名重新叫回\u0026quot;小企鹅输入法\u0026quot;，2022 年逐渐成熟，支持内置拼音方案开箱即用，也支持 RIME 插件。可从 F-Droid 或 Google Play 安装，项目地址：github.com/fcitx5-android/fcitx5-android。\n二十年的接力 从 2002 年 Yuking 手滑打出那个 x，到翁学添接手重构，再到 berberman 把它带进每个人的口袋——Fcitx 经历了被宣布终止、又死而复生，经历了从 X11 到 Wayland 的架构革命，经历了从桌面到移动端的跨越。\nKDE 2 已经变成了 Plasma 6，GNOME 2 已经变成了 GNOME 46，X11 正在被 Wayland 取代。许多当年的软件早已消失，许多项目停止了更新。\n而小企鹅还在。\n这中间没有公司，没有融资，没有路线图。只有一个个觉得\u0026quot;这件事值得做\u0026quot;的人，在某个时间点接过了接力棒。\n","permalink":"/posts/fcitx-story-hugo/","summary":"\u003ch2 id=\"当-linux-还不会说中文\"\u003e当 Linux 还不会说中文\u003c/h2\u003e\n\u003cp\u003e2000 年前后的 Linux 桌面，与今天不是同一个世界。\u003c/p\u003e\n\u003cp\u003eKDE 和 GNOME 正在激烈竞争，GTK 与 Qt 生态尚未成熟，发行版数量众多且碎片化。对中文用户而言，最大的麻烦甚至不是显卡驱动，而是一件更基础的事：\u003cstrong\u003e系统装好了，却打不了中文。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e当时能用的中文输入方案有 XCIN、Chinput、MiniChinput 等，但普遍配置复杂，不同桌面环境之间兼容性差，GTK 与 Qt 支持不一致，维护者有限。很多用户第一次安装 Linux 后，需要花几个小时研究文档，才能让输入法勉强工作。\u003c/p\u003e\n\u003cp\u003e在那个中文 Linux 用户本来就不多的年代，愿意长期维护中文输入法的人更是凤毛麟角。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"一个手滑打出来的名字\"\u003e一个手滑打出来的名字\u003c/h2\u003e\n\u003cp\u003e2002 年，一个网名叫 \u003cstrong\u003eYuking\u003c/strong\u003e（鱼王）的开发者是五笔输入法用户。他发现现有方案不能满足自己的需求，于是做了一个后来无数程序员都做过的决定：既然没有合适的工具，那就自己写一个。\u003c/p\u003e\n\u003cp\u003e这个项目最初叫做 \u003cstrong\u003egWubi\u003c/strong\u003e——顾名思义，一个给 Linux 用的五笔输入法。但 gWubi 1.0 发布时，已经同时支持五笔、拼音和区位码输入，从一开始就超出了\u0026quot;五笔专用工具\u0026quot;的范畴。\u003c/p\u003e\n\u003cp\u003e随着功能不断扩展，项目开始向输入法框架演化，需要一个新名字。Yuking 的想法是取 \u003cstrong\u003eFCIT\u003c/strong\u003e，来自\u0026quot;Free Chinese Input Tool\u0026quot;。但在提交代码时，他多敲了一个字母 \u003ccode\u003ex\u003c/code\u003e，变成了 \u003cstrong\u003eFcitx\u003c/strong\u003e。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e那个年代没有 Git，代码版本控制用的是 Subversion，改名牵连太多，索性将错就错保留了下来。这个手滑打出来的名字，后来成了 Linux 中文输入法的代名词。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e2004 年，项目正式更名 Fcitx。Linux 的吉祥物是企鹅 Tux，Fcitx 也采用了企鹅形象作为图标，中文名随之定为\u003cstrong\u003e小企鹅输入法\u003c/strong\u003e。后来很多人只知道\u0026quot;小企鹅\u0026quot;，未必知道\u0026quot;Fcitx\u0026quot;这个英文名。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"差点死掉\"\u003e差点死掉\u003c/h2\u003e\n\u003cp\u003e2007 年，转折出现了。\u003c/p\u003e\n\u003cp\u003e云帆论坛上有人公开批评 Fcitx 的代码写得很差。Yuking 受不了这个评价，\u003cstrong\u003e在当年 7 月 10 日宣布终止项目\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e项目就这样停了。没有交接，没有继承者，代码扔在那里。当时的社区里弥漫着一种真实的失落感——小企鹅可能真的要没了。\u003c/p\u003e\n\u003cp\u003e沉寂了一年多之后，2008 年 9 月，Yuking 自己回来了。他在帖子里写道，无法忘记 Fcitx。他加入了爱好者在 Google Code 上建立的新仓库，开始频繁更新，项目重新活了过来。\u003c/p\u003e","title":"小企鹅的二十年"},{"content":"MarkItDown 是微软开源的 Python 工具，用于将 PDF、Word、PPT、Excel、图片、音频、HTML 等多种文件格式转换为 Markdown 文本，非常适合为 LLM / RAG 知识库预处理文档。\nWindows 快速上手（三步完成） 以下流程在 D:\\V 目录下操作，可替换为你自己的项目目录。\n第一步：新建 venv\ncd D:\\V python -m venv .venv 第二步：激活并安装\n.\\.venv\\Scripts\\Activate.ps1 python -m pip install -U pip python -m pip install \u0026#34;markitdown[all]\u0026#34; 激活成功后提示符前会出现 (.venv)。\n第三步：验证安装\npython -m markitdown --version 以后每次使用，记住这一套：\ncd D:\\V .\\.venv\\Scripts\\Activate.ps1 python -m markitdown \u0026#34;中文 文件名.xlsx\u0026#34; -o \u0026#34;中文 文件名.md\u0026#34; 💡 用 python -m markitdown 而不是直接 markitdown——不依赖 PATH，不依赖 venv 是否激活，Windows 上最稳妥的写法。路径含中文或空格时务必加引号。\n安装说明 需要 Python 3.10 及以上版本。\n完整功能（推荐）\npip install \u0026#34;markitdown[all]\u0026#34; 包含 OCR、音频转写、所有文档格式支持。\n基础版\npip install markitdown 仅核心功能，体积最小。\n按需安装指定格式\npip install \u0026#34;markitdown[pdf,docx,pptx,xlsx]\u0026#34; 仅安装需要的格式依赖，按需组合。\n命令行（CLI）使用 基础转换 # 输出到终端 markitdown 报告.docx # 保存为 .md 文件 markitdown 报告.docx -o 报告.md # 使用重定向 markitdown 报告.pdf \u0026gt; 报告.md 从 URL 或管道输入 # 从 URL 转换 markitdown https://example.com -o page.md # 管道输入 cat data.xlsx | markitdown \u0026gt; data.md # 从网络文件转换 curl -sL https://example.com/doc.pdf | markitdown \u0026gt; out.md 常见格式示例 格式 命令 Word → Markdown markitdown 文档.docx -o 文档.md PPT → Markdown markitdown 幻灯片.pptx -o slides.md Excel → Markdown markitdown 表格.xlsx -o 表格.md 图片 OCR markitdown 截图.png -o 截图.md（需安装完整版） 音频转写 markitdown 录音.mp3 -o 录音.md YouTube 字幕 markitdown https://youtube.com/watch?v=xxx -o transcript.md 批量转换 Windows CMD：\nfor %i in (*.pdf) do markitdown \u0026#34;%i\u0026#34; -o \u0026#34;%~ni.md\u0026#34; Linux / macOS：\nfor f in *.docx; do markitdown \u0026#34;$f\u0026#34; -o \u0026#34;${f%.docx}.md\u0026#34;; done Python API 调用 适合在代码中集成，例如构建 RAG 流程：\n基础用法 from markitdown import MarkItDown md = MarkItDown(enable_plugins=False) result = md.convert(\u0026#34;报告.pdf\u0026#34;) print(result.text_content) 配合 LLM 识别图片内容 from markitdown import MarkItDown from openai import OpenAI client = OpenAI() md = MarkItDown(llm_client=client, llm_model=\u0026#34;gpt-4o\u0026#34;) result = md.convert(\u0026#34;图表.jpg\u0026#34;) print(result.text_content) # 包含 AI 生成的图片描述 使用 Azure Document Intelligence md = MarkItDown(docintel_endpoint=\u0026#34;https://xxx.cognitiveservices.azure.com/\u0026#34;) result = md.convert(\u0026#34;test.pdf\u0026#34;) 支持的文件格式 类别 格式 办公文档 .docx、.pptx、.xlsx、.xls、.pdf 网页 / 数据 HTML、CSV、JSON、XML、EPUB 媒体 图片（JPG / PNG，OCR）、音频（MP3 / WAV 转写） 其他 ZIP（自动解压遍历）、Outlook .msg、纯文本 图形界面（GUI）可选 MarkItDown 本身没有官方 GUI，但有以下第三方方案：\nmarkitdown-gui：基于 PySide6 + Fluent 风格界面，支持拖拽批量转换、Markdown 预览、OCR，跨平台，提供打包好的可执行文件，无需安装 Python。 MarkItDown_GUI：基于 PyQt6，内置 47 套配色主题，支持多转换引擎回退（MarkItDown / Pandoc / pymupdf4llm），需自行安装依赖运行。 markitdown-api：基于 FastAPI 的轻量 REST API 服务，提供 Docker 镜像，浏览器或 curl 即可调用，适合服务器部署场景。 ⚠️ 这些均为社区第三方项目，非微软官方出品。\n常见问题 转换后中文乱码怎么办？ 确保源文件本身编码正确。对于旧版 Office 文档，可尝试在转换时指定编码参数。\n扫描版 PDF 无法提取文字？ 安装完整版（markitdown[all]）后自动支持 OCR，或配置 Azure Document Intelligence 获得更高精度。\n转换大文件时速度慢？ 对于超大 PDF，可以尝试先拆分再逐个转换。使用 Python API 时，可以配合异步处理提高吞吐量。\n已安装但提示找不到命令？（Windows） 原因通常是 Python 环境与 PATH 不匹配，排查步骤：\nwhere.exe python python -m pip show markitdown 如果 pip show 找不到，说明当前 Python 没有安装 MarkItDown。直接用 python -m markitdown 可绕过所有 PATH 问题。\n文件名含中文或空格时报错？（Windows） 在文件所在目录执行命令，并用引号包裹路径：\ncd D:\\V python -m markitdown \u0026#34;IPD 敦煌主题-20260528.xlsx\u0026#34; -o \u0026#34;IPD 敦煌主题-20260528.md\u0026#34; 出现 puremagic.main.PureError: Not a regular file 不是文件损坏，是路径错误或不在当前目录。\n","permalink":"/posts/markitdown-blog/","summary":"\u003cp\u003e\u003ca href=\"https://github.com/microsoft/markitdown\"\u003eMarkItDown\u003c/a\u003e 是微软开源的 Python 工具，用于将 PDF、Word、PPT、Excel、图片、音频、HTML 等多种文件格式\u003cstrong\u003e转换为 Markdown 文本\u003c/strong\u003e，非常适合为 LLM / RAG 知识库预处理文档。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"windows-快速上手三步完成\"\u003eWindows 快速上手（三步完成）\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e以下流程在 \u003ccode\u003eD:\\V\u003c/code\u003e 目录下操作，可替换为你自己的项目目录。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e第一步：新建 venv\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd D:\\V\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epython -m venv .venv\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e第二步：激活并安装\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e.\\.venv\\Scripts\\Activate.ps1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epython -m pip install -U pip\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epython -m pip install \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;markitdown[all]\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e激活成功后提示符前会出现 \u003ccode\u003e(.venv)\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e第三步：验证安装\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epython -m markitdown --version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e以后每次使用\u003c/strong\u003e，记住这一套：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd D:\\V\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e.\\.venv\\Scripts\\Activate.ps1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epython -m markitdown \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;中文 文件名.xlsx\u0026#34;\u003c/span\u003e -o \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;中文 文件名.md\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e💡 用 \u003ccode\u003epython -m markitdown\u003c/code\u003e 而不是直接 \u003ccode\u003emarkitdown\u003c/code\u003e——不依赖 PATH，不依赖 venv 是否激活，Windows 上最稳妥的写法。路径含中文或空格时务必加引号。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"安装说明\"\u003e安装说明\u003c/h2\u003e\n\u003cp\u003e需要 \u003cstrong\u003ePython 3.10 及以上版本\u003c/strong\u003e。\u003c/p\u003e","title":"MarkItDown：微软开源的万能文档转 Markdown 工具"},{"content":"WinUtil 是 Chris Titus Tech 开发的开源 Windows 优化工具，6 年迭代、200+ 贡献者、3000 万次运行记录。无需安装，一条 PowerShell 命令直接启动，覆盖软件批量安装、系统减肥、隐私加固、更新策略等常见需求。\n启动 以管理员身份打开 PowerShell 或 Windows Terminal，运行：\nirm christitus.com/win | iex 提示：christitus.com/win 是官方短链，等价于从 GitHub 拉取最新脚本，每次运行都是最新版本。需开代理访问。\n注意：必须以管理员身份运行，否则大部分功能无法生效。右键开始菜单 → Windows Terminal（管理员）。\nPowerShell 7 有时会把脚本内容误判为 HTML 导致解析报错，换 powershell.exe（5.1）即可：\npowershell.exe -Command \u0026#34;irm christitus.com/win | iex\u0026#34; Install（软件安装） 底层调用 winget 批量安装，省去逐个下载和点击安装的麻烦。\n界面上按分类折叠展示（浏览器、开发工具、媒体、系统工具等），勾选需要的软件后点 Install。\nGet Installed：扫描系统已装软件，自动勾选对应条目，方便迁移新机 取消勾选后点 Uninstall 即可卸载 Tweaks（系统调整） 这是 WinUtil 的核心，分四个区块。\n快速预设 页面顶部有四个快速按钮：\n预设 说明 Standard 推荐大多数用户，安全可逆的基础优化 Minimal 低影响的最小化调整，保守首选 Advanced 针对有经验用户的进阶组合，跳过还原点和清理任务以加快执行速度 Clear 清除所有已选项 点 Get Installed Tweaks 可检测系统当前已应用的 tweak 状态。\nEssential Tweaks（基础调整） 适合所有用户，安全且可逆，从这里开始。\n项目 说明 Activity History - Disable 关闭活动历史记录，减少本地行为追踪 BitLocker - Disable 关闭 BitLocker 加密（个人机常见需求） ConsumerFeatures - Disable 关闭微软消费者推送功能（商店推荐等广告行为） Delivery Optimization - Disable 禁用 P2P 更新分发，不把你的带宽分享给其他设备 Disk Cleanup - Run 立即清理系统垃圾文件 End Task With Right Click - Enable 右键任务栏应用可直接结束任务，省去打开任务管理器 File Explorer Automatic Folder Discovery - Disable 关闭资源管理器自动检测文件夹类型，打开大文件夹更快 Hibernation - Disable 关闭休眠，释放等同内存大小的 C 盘空间（hiberfil.sys） Location Tracking - Disable 关闭系统级位置追踪 Microsoft Store Recommended Search Results - Disable 搜索栏不再弹出商店推荐结果 Restore Point - Create 执行 tweaks 前自动创建还原点（建议始终勾选） Services - Set to Manual 将非必要服务改为手动启动，减少后台进程 Start Menu Previous Layout - Enable 恢复 Windows 10 风格的开始菜单布局 Telemetry - Disable 关闭微软遥测数据收集 Temporary Files - Remove 清理 %temp% 等临时文件目录 Unwanted Pre-Installed Apps - Remove 卸载预装的臃肿软件（各种游戏、Candy Crush 等） Widgets - Remove 移除任务栏 Widgets 新闻推送 Windows Platform Binary Table (WPBT) - Disable 禁用 WPBT，阻止厂商在系统启动时强制注入程序 Advanced Tweaks（进阶调整，谨慎使用） 注意：这里的每一项都有明确适用场景，不要全勾。先理解每项的作用再决定是否启用。\n项目 说明 Adobe URL Block List - Enable 屏蔽 Adobe 的追踪域名 Background Apps - Disable 禁止后台应用运行（可能影响部分应用通知） Brave Browser - Debloat 移除 Brave 内置的 VPN、Rewards 等推广组件 Date \u0026amp; Time - Set Time to UTC 系统时钟改用 UTC，双系统（Windows + Linux）用户必选，否则两个系统时间会相互覆盖 Disable Reserved Storage 释放微软为系统更新预留的约 7GB 磁盘空间 File Explorer Home and Gallery - Disable 移除资源管理器左侧的\u0026quot;主页\u0026quot;和\u0026quot;图库\u0026quot;入口 Fullscreen Optimizations - Disable 关闭全屏优化，部分老游戏有改善，新游戏影响不大 IPv6 - Disable 完全禁用 IPv6（仅在确认不需要时启用） IPv6 - Set IPv4 as Preferred 保留 IPv6 但优先使用 IPv4 Microsoft Edge - Debloat 移除 Edge 内置的侧边栏、购物助手等冗余功能 Microsoft Edge - Remove 彻底卸载 Edge（需要备用浏览器） Microsoft OneDrive - Remove 彻底卸载 OneDrive O\u0026amp;O ShutUp10++ - Run 启动 OO ShutUp10++，更精细的隐私开关 GUI Razer Software Auto-Install - Disable 禁止 Razer 硬件自动安装 Synapse（有 Razer 设备但不想要管理软件时） Right-Click Menu Previous Layout - Enable 恢复 Windows 10 的右键菜单（不需要点\u0026quot;显示更多选项\u0026quot;） Storage Sense - Disable 关闭 Storage Sense 自动清理（避免误删文件） System Tray Notifications \u0026amp; Calendar - Disable 禁用系统托盘通知和日历弹窗 Teredo - Disable 关闭 Teredo IPv6 隧道，改善部分网络情况下的延迟 Visual Effects - Set to Best Performance 关闭动画和视觉特效，老机或虚拟机提速明显 Windows AI - Disable And Remove 移除 Copilot、Recall 等 AI 组件 Xbox \u0026amp; Gaming Components - Remove 卸载 Xbox Game Bar 等游戏组件（不玩游戏时可移除） Customize Preferences（外观与行为偏好） 小开关集合，按需勾选：\n项目 说明 Dark Theme 系统深色模式 Enable Long Paths 启用长路径支持（开发环境常见需求） File Explorer File Extensions 资源管理器显示文件扩展名 File Explorer Hidden Files 显示隐藏文件 Game Mode 开/关 Windows 游戏模式 Mouse Acceleration 鼠标加速开关（游戏玩家通常关闭） Num Lock on Startup 开机自动开启 NumLock Scrollbars Always Visible 滚动条常驻显示 Start Menu Bing Search 开始菜单 Bing 联网搜索开关 Start Menu Recommendations 开始菜单推荐内容开关 Sticky Keys 粘滞键开关 Taskbar Centered Icons 任务栏图标居中/居左切换 Taskbar Search Icon 任务栏搜索图标显示方式 DNS 设置 无需手动改网络适配器，直接在此切换 DNS，IPv4 和 IPv6 同时生效：\n选项 说明 Default ISP 默认 DNS DHCP 自动获取 Google 8.8.8.8，稳定快速 Cloudflare 1.1.1.1，速度与隐私兼顾 Cloudflare_Malware 屏蔽恶意软件域名 Cloudflare_Malware_Adult 同时屏蔽恶意软件和成人内容 Open_DNS 可定制过滤规则 Quad9 9.9.9.9，以安全为主，屏蔽已知恶意域名 AdGuard_Ads_Trackers 屏蔽广告和追踪器 AdGuard_Ads_Trackers_Malware_Adult 全面屏蔽广告、追踪、恶意软件和成人内容 Performance Plans（性能计划） Add Ultimate Performance：启用终极性能电源计划，最小化延迟、最大化效率，适合台式机 Remove Ultimate Performance：切回均衡模式（笔记本省电时使用） 撤销 Undo Selected Tweaks：仅撤销已勾选的项目 还原点：执行前创建了还原点的话，进入系统属性 → 系统保护 → 系统还原，可完整回滚 Config（功能配置） 面向有经验用户，提供组件开关和修复工具。\n可选功能开关 功能 说明 .NET Framework 2/3/4 按需启用指定版本 Hyper-V 启用 Windows 内置虚拟化 Windows Sandbox 启用沙盒隔离环境 WSL 启用 Windows Subsystem for Linux NFS 启用网络文件系统支持 Registry Backup 每天凌晨 12:30 自动备份注册表 Legacy F8 Boot Recovery 开/关 F8 启动恢复 修复工具 工具 说明 Reset Network 重置网络栈（netsh int ip reset + netsh winsock reset），网络玄学问题首选 Reset Windows Update 重新注册更新 DLL，重启更新服务 System Corruption Scan 运行 sfc /scannow 和 DISM /RestoreHealth，耗时较长，作为最后手段 WinGet Repair 修复 winget 安装失败问题 AutoLogon 配置开机自动登录 NTP Server 启用 NTP 时间同步 经典控制面板快捷入口 WinUtil 在此提供了 Windows 7 时代的经典控制面板直接入口，比现代设置 App 功能更完整：控制面板、设备管理器、声音设置、打印机、网络连接、电源选项等。\nPowerShell Profile CTT PowerShell Profile - Install：安装 Chris Titus 的 PowerShell 主题，带自动补全和 oh-my-posh 风格提示，仅支持 PowerShell 7+。\nUpdates（更新策略） 选项 说明 Default 恢复微软默认设置 Security 仅安装安全更新，跳过功能更新 Disable 完全禁用自动更新 Windows Pro 用户推荐配置：\n功能更新延迟 1 年，避免成为新版本小白鼠 安全更新延迟 4 天（周二发布 → 周六安装），给微软时间撤回问题补丁 注意：完全禁用更新会带来安全风险。有问题更新时临时禁用，问题修复后记得重新开启。\nWin11 Creator（定制 ISO） 将官方 Windows 11 ISO 重新打包为干净版本：移除 AI 组件、预装应用和遥测，保留完整的软件兼容性，输出 ISO 约 2.5–3.5 GB（原版 5–6 GB）。\n使用流程：\n挂载并验证官方 ISO，选择版本（默认 Pro） 执行定制（耗时 10–30 分钟） 导出为新 ISO 或直接写入 U 盘 可选：清理临时工作目录（约 10–15 GB） 提示：WinUtil 配置可以导出为 JSON 文件，方便在多台设备上重复应用相同设置。\n相关链接 官网文档 GitHub 仓库 Essential Tweaks 详细说明 Advanced Tweaks 详细说明 ","permalink":"/posts/winutil/","summary":"\u003cp\u003e\u003ca href=\"https://christitustech.github.io/winutil/\"\u003eWinUtil\u003c/a\u003e 是 Chris Titus Tech 开发的开源 Windows 优化工具，6 年迭代、200+ 贡献者、3000 万次运行记录。无需安装，一条 PowerShell 命令直接启动，覆盖软件批量安装、系统减肥、隐私加固、更新策略等常见需求。\u003c/p\u003e\n\u003ch2 id=\"启动\"\u003e启动\u003c/h2\u003e\n\u003cp\u003e以管理员身份打开 PowerShell 或 Windows Terminal，运行：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eirm christitus.com/win | iex\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e提示\u003c/strong\u003e：\u003ccode\u003echristitus.com/win\u003c/code\u003e 是官方短链，等价于从 GitHub 拉取最新脚本，每次运行都是最新版本。需开代理访问。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e注意\u003c/strong\u003e：必须以\u003cstrong\u003e管理员身份\u003c/strong\u003e运行，否则大部分功能无法生效。右键开始菜单 → Windows Terminal（管理员）。\u003c/p\u003e\n\u003cp\u003ePowerShell 7 有时会把脚本内容误判为 HTML 导致解析报错，换 \u003ccode\u003epowershell.exe\u003c/code\u003e（5.1）即可：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epowershell.exe -Command \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;irm christitus.com/win | iex\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"install软件安装\"\u003eInstall（软件安装）\u003c/h2\u003e\n\u003cp\u003e底层调用 \u003cstrong\u003ewinget\u003c/strong\u003e 批量安装，省去逐个下载和点击安装的麻烦。\u003c/p\u003e\n\u003cp\u003e界面上按分类折叠展示（浏览器、开发工具、媒体、系统工具等），勾选需要的软件后点 \u003cstrong\u003eInstall\u003c/strong\u003e。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eGet Installed\u003c/strong\u003e：扫描系统已装软件，自动勾选对应条目，方便迁移新机\u003c/li\u003e\n\u003cli\u003e取消勾选后点 \u003cstrong\u003eUninstall\u003c/strong\u003e 即可卸载\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"tweaks系统调整\"\u003eTweaks（系统调整）\u003c/h2\u003e\n\u003cp\u003e这是 WinUtil 的核心，分四个区块。\u003c/p\u003e\n\u003ch3 id=\"快速预设\"\u003e快速预设\u003c/h3\u003e\n\u003cp\u003e页面顶部有四个快速按钮：\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e预设\u003c/th\u003e\n          \u003cth\u003e说明\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eStandard\u003c/td\u003e\n          \u003ctd\u003e推荐大多数用户，安全可逆的基础优化\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eMinimal\u003c/td\u003e\n          \u003ctd\u003e低影响的最小化调整，保守首选\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eAdvanced\u003c/td\u003e\n          \u003ctd\u003e针对有经验用户的进阶组合，跳过还原点和清理任务以加快执行速度\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eClear\u003c/td\u003e\n          \u003ctd\u003e清除所有已选项\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e点 \u003cstrong\u003eGet Installed Tweaks\u003c/strong\u003e 可检测系统当前已应用的 tweak 状态。\u003c/p\u003e","title":"WinUtil：Windows 一键优化工具"},{"content":"建好网站之后，搜索引擎不会自动发现你——需要主动告诉它你在哪里。这篇记录三个主要搜索引擎的提交流程，以及背后的基本原理。\n原理：爬虫、sitemap、收录 搜索引擎靠爬虫（crawler）抓取网页内容，再建立索引，用户搜索时才能找到你。\n爬虫发现页面的方式有两种：\n从其他网站的外链顺藤摸瓜爬过来 你主动提交 sitemap，告诉它有哪些页面 Sitemap 是一个 XML 文件，列出网站所有页面的 URL，让爬虫不用猜。Astro 自动生成 sitemap-index.xml，里面指向 sitemap-0.xml，后者才是真正的页面列表，这是标准的两级结构。\n你的 sitemap 地址通常是：\nhttps://你的域名/sitemap-index.xml 提交 sitemap 之后不代表立刻收录，Google 一般几天到两周，Bing 稍快，百度最慢也最难预测。\nGoogle Search Console 地址：search.google.com/search-console\n验证所有权 进入后选网址前缀，输入你的完整网址（含 https://），点继续。\n推荐用 HTML 文件验证：\n下载验证文件（形如 google6cf6f7204d0d5185.html） 放进项目的 public/ 目录（或网站根目录） 部署后访问 https://你的域名/google6cf6f7204d0d5185.html 确认能打开 回到 Search Console 点验证 验证完成后不要删除这个文件，Google 会定期回来检查，删掉会导致验证失效。\n提交 sitemap 验证通过后，左侧菜单找到站点地图，在输入框填入：\nsitemap-index.xml 点提交。状态初始显示\u0026quot;无法抓取\u0026quot;是正常的，Google 还没来得及读取，等几小时后刷新会变成\u0026quot;成功\u0026quot;。\n日常使用 覆盖率 — 查看哪些页面已收录，哪些被排除或有错误 搜索结果 — 用户用什么关键词找到你，点击率如何 网址检查 — 新文章发布后可以手动输入 URL 请求立即抓取，比等爬虫自己来快 Bing Webmaster Tools 地址：bing.com/webmasters\n从 Google 导入（推荐） 已经配置好 Google Search Console 的话，Bing 支持一键导入，省去重新验证的步骤：\n登录 Bing Webmaster Tools（支持微软账号或 Google 账号） 点击从 Google Search Console 导入 授权 Google 账号，选择要导入的站点 站点和 sitemap 自动同步过来，无需额外操作 单独添加 如果不想关联 Google 账号，也可以手动添加：\n点击添加网站，输入你的网址 选 HTML 文件或 meta 标签验证（同 Google 流程） 验证通过后在站点地图页面提交 sitemap-index.xml Bing 的数据会同步给 DuckDuckGo 和 Yahoo，提交一次相当于覆盖了好几个搜索引擎。\n百度搜索资源平台 地址：ziyuan.baidu.com\n注意： 百度爬虫无法访问 pages.dev、github.io 等境外托管域名。如果你的网站部署在这些平台上，提交了也没有实际效果。绑定自定义域名并确保国内可访问后再操作。\n流程 登录后点击用户中心 → 站点管理 → 添加网站 输入域名，选择站点类型 验证方式选 HTML 文件，下载后放进网站根目录部署 验证通过后进入数据引入 → sitemap，提交你的 sitemap 地址 百度还提供主动推送功能，可以通过 API 实时推送新页面 URL，收录速度比等爬虫快，但需要额外配置。\nIndexNow（进阶） IndexNow 是微软发起的协议，支持的引擎包括 Bing、Yandex 等。原理是：你发布新内容后主动调用一个 API 通知搜索引擎，引擎很快来抓取，不用等爬虫按自己的节奏来。\n只需要生成一个 API Key，提交到任意一个支持 IndexNow 的引擎，它会自动把通知转发给其他引擎。\nAstro 目前没有官方插件，可以通过 Cloudflare Workers 或 GitHub Actions 在每次部署后自动调用 IndexNow API 实现自动化推送。Google 目前不支持 IndexNow，仍需通过 Search Console 单独处理。\n小结 搜索引擎 适合场景 优先级 Google Search Console 所有网站 ★★★ Bing Webmaster Tools 所有网站，可从 Google 一键导入 ★★★ 百度搜索资源平台 绑定自定义域名、国内可访问的网站 ★★（视情况） IndexNow 更新频繁、希望快速收录的网站 ★（进阶可选） ","permalink":"/posts/search-engine-submission/","summary":"\u003cp\u003e建好网站之后，搜索引擎不会自动发现你——需要主动告诉它你在哪里。这篇记录三个主要搜索引擎的提交流程，以及背后的基本原理。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"原理爬虫sitemap收录\"\u003e原理：爬虫、sitemap、收录\u003c/h2\u003e\n\u003cp\u003e搜索引擎靠\u003cstrong\u003e爬虫\u003c/strong\u003e（crawler）抓取网页内容，再建立索引，用户搜索时才能找到你。\u003c/p\u003e\n\u003cp\u003e爬虫发现页面的方式有两种：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e从其他网站的外链顺藤摸瓜爬过来\u003c/li\u003e\n\u003cli\u003e你主动提交 \u003cstrong\u003esitemap\u003c/strong\u003e，告诉它有哪些页面\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eSitemap\u003c/strong\u003e 是一个 XML 文件，列出网站所有页面的 URL，让爬虫不用猜。Astro 自动生成 \u003ccode\u003esitemap-index.xml\u003c/code\u003e，里面指向 \u003ccode\u003esitemap-0.xml\u003c/code\u003e，后者才是真正的页面列表，这是标准的两级结构。\u003c/p\u003e\n\u003cp\u003e你的 sitemap 地址通常是：\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ehttps://你的域名/sitemap-index.xml\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e提交 sitemap 之后不代表立刻收录，Google 一般几天到两周，Bing 稍快，百度最慢也最难预测。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"google-search-console\"\u003eGoogle Search Console\u003c/h2\u003e\n\u003cp\u003e地址：\u003ca href=\"https://search.google.com/search-console\"\u003esearch.google.com/search-console\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"验证所有权\"\u003e验证所有权\u003c/h3\u003e\n\u003cp\u003e进入后选\u003cstrong\u003e网址前缀\u003c/strong\u003e，输入你的完整网址（含 \u003ccode\u003ehttps://\u003c/code\u003e），点继续。\u003c/p\u003e\n\u003cp\u003e推荐用 \u003cstrong\u003eHTML 文件\u003c/strong\u003e验证：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e下载验证文件（形如 \u003ccode\u003egoogle6cf6f7204d0d5185.html\u003c/code\u003e）\u003c/li\u003e\n\u003cli\u003e放进项目的 \u003ccode\u003epublic/\u003c/code\u003e 目录（或网站根目录）\u003c/li\u003e\n\u003cli\u003e部署后访问 \u003ccode\u003ehttps://你的域名/google6cf6f7204d0d5185.html\u003c/code\u003e 确认能打开\u003c/li\u003e\n\u003cli\u003e回到 Search Console 点验证\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003e验证完成后不要删除这个文件，Google 会定期回来检查，删掉会导致验证失效。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"提交-sitemap\"\u003e提交 sitemap\u003c/h3\u003e\n\u003cp\u003e验证通过后，左侧菜单找到\u003cstrong\u003e站点地图\u003c/strong\u003e，在输入框填入：\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esitemap-index.xml\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e点提交。状态初始显示\u0026quot;无法抓取\u0026quot;是正常的，Google 还没来得及读取，等几小时后刷新会变成\u0026quot;成功\u0026quot;。\u003c/p\u003e\n\u003ch3 id=\"日常使用\"\u003e日常使用\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e覆盖率\u003c/strong\u003e — 查看哪些页面已收录，哪些被排除或有错误\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e搜索结果\u003c/strong\u003e — 用户用什么关键词找到你，点击率如何\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e网址检查\u003c/strong\u003e — 新文章发布后可以手动输入 URL 请求立即抓取，比等爬虫自己来快\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"bing-webmaster-tools\"\u003eBing Webmaster Tools\u003c/h2\u003e\n\u003cp\u003e地址：\u003ca href=\"https://www.bing.com/webmasters\"\u003ebing.com/webmasters\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"从-google-导入推荐\"\u003e从 Google 导入（推荐）\u003c/h3\u003e\n\u003cp\u003e已经配置好 Google Search Console 的话，Bing 支持一键导入，省去重新验证的步骤：\u003c/p\u003e","title":"把网站提交给搜索引擎"},{"content":"ShareX 是 Windows 上最强大的开源截图工具，没有之一。它免费、GPLv3 开源、持续活跃开发，功能密度远超任何付费竞品。但也正因为功能太多，很多人装上之后只用了截图，其他 90% 的能力从未触碰。\n本文的目标是把 ShareX 20.2 的所有核心功能完整跑一遍。\nShareX 仅支持 Windows，没有 macOS 或 Linux 版本。\n安装 从 getsharex.com 下载安装版或便携版。两者功能完全一致，便携版不写注册表，适合放在 U 盘或不想污染系统的场景。\n截图模式 ShareX 提供 7 种截图模式，覆盖所有使用场景。\nRegion（区域截图） 最常用的模式。按下快捷键后进入十字准星选区界面，支持像素级精确拖拽。进入选区界面后还可以切换为其他模式（窗口、全屏等），无需退出重来。\n选区时按住空格键可以移动已经画好的选区，W 键切换放大镜，滚轮缩放放大镜倍率。\nRegion (Freehand)（自由形状） 手绘任意形状截取。适合需要圈出不规则区域的场景，比如标记图片中某个具体位置。\nFullscreen（全屏） 截取所有显示器的完整画面。多显示器用户会得到一张拼合图。\nActive Window / Active Monitor 仅截取当前焦点窗口或当前鼠标所在的显示器，不包含其他内容。\nScrolling Capture（滚动截图） 长截图功能。ShareX 会自动滚动页面并拼合成一张完整图片。对现代复杂网页（尤其是含有 sticky header 或懒加载内容的页面）效果存在一定限制，简单页面和文档类内容表现良好。\nAuto Capture（自动截图） 按设定时间间隔自动截图。适合制作教程序列图、监控某个界面变化等场景。可以自定义截图区域和时间间隔。\n录屏与 GIF ShareX 使用 FFmpeg 处理视频录制，首次使用时会提示自动下载 FFmpeg。\n屏幕录制 支持录制指定区域、活动窗口或全屏，输出为 MP4。可以同时录制系统音频和麦克风输入。进入 Task Settings → Screen Recorder → Screen recording options 可以调整编码器（默认 x264）、帧率、码率等参数。\nGIF 录制 适合录制短时操作演示。ShareX 直接输出 GIF，不需要额外转换步骤。帧率和色彩质量可以在录制设置里调整。GIF 文件体积通常比 MP4 大很多，超过 5 秒的内容建议用 MP4 代替。\n图片编辑器与标注 ShareX 20 引入了基于 Avalonia UI 的新版编辑器，内置 18 种标注工具。\n主要工具：\n矩形 / 椭圆：画框圈出重点区域 箭头：支持经典样式和现代样式，可弯曲调整方向 文字：添加说明文字，支持自定义字体和颜色 高亮：半透明色块，不遮挡原始内容 马赛克 / 模糊：对隐私信息打码，马赛克比高斯模糊更彻底 步骤编号：自动递增的圆形数字标签，制作教程图非常好用 放大镜（Spotlight）：20.2 新增，圈出并放大局部区域 贴纸：内置 emoji 贴纸，支持旋转缩放 背景美化（Background Beautifier） 可以给截图添加渐变背景、阴影、圆角，适合制作展示用的截图，完全本地处理。\nAfter Capture Tasks：截图后做什么 这是 ShareX 最核心的自动化能力。截图完成后，ShareX 会按顺序执行你勾选的一系列任务。在主界面顶部菜单 After capture tasks 可以看到完整列表：\n任务 说明 Open in image editor 打开标注编辑器 Save image to file 保存到本地 Copy image to clipboard 复制图片到剪贴板 Upload image to host 上传到图床 Delete file locally 上传后删除本地文件 OCR image 提取图片中的文字 典型工作流配置：勾选 Open in image editor + Save image to file + Upload image to host + Copy URL to clipboard，这样截图后标注完成就自动上传，链接已经在剪贴板里等你粘贴。\nAfter Upload Tasks：上传后做什么 上传完成后同样可以执行自动化任务：\nCopy URL to clipboard：上传完成后自动复制链接，最常用 Open URL：在浏览器里打开上传结果 Shorten URL：使用短链服务压缩 URL Show QR code：生成二维码方便手机扫描 快捷键配置 ShareX 的所有操作都可以绑定快捷键，进入 Hotkey settings 编辑。\n操作 默认快捷键 区域截图 Print Screen 全屏截图 Ctrl + Print Screen 活动窗口截图 Alt + Print Screen 屏幕录制 Shift + Print Screen 每个快捷键可以单独配置截图模式、上传目标和 After Capture Tasks，互相独立。比如一个快捷键截图后保存本地，另一个截图后直接上传并复制链接。\n如果 Print Screen 键被 Windows 11 截图工具占用，可以在 ShareX 里换成任意组合键，比如 Ctrl + Shift + S。\n工具箱 主界面菜单 Tools 隐藏着一批独立工具，很多人不知道它们存在。\nOCR（文字识别）：从屏幕任意区域提取文字。基于 Windows 内置 OCR 引擎，识别结果直接复制到剪贴板。\n颜色拾取器（Color Picker）：取色器，支持 HEX、RGB、HSB 等多种格式输出，悬停在屏幕任意像素上即可读取颜色值。\n标尺（Ruler）：屏幕像素标尺，测量元素尺寸和间距。\n哈希校验（Hash Checker）：输入文件和期望哈希值，支持 MD5、SHA256 等算法验证文件完整性。\n图片合并（Image Combiner）：将多张图片水平或垂直拼合为一张。\n二维码生成（QR Code）：输入文字或 URL 生成二维码，也可以从屏幕扫描二维码内容。\n视频转换（Video Converter）：基于 FFmpeg 的视频格式转换工具，不需要单独安装其他软件。\n屏幕固定（Pin to Screen）：将截图以浮动窗口的形式钉在屏幕上，方便对照参考。比如对照设计稿写代码时可以把设计稿截图钉在角落，非常实用。\nDNS 更改器（DNS Changer）：快速切换 DNS 服务器，内置 Google、Cloudflare、OpenDNS 等常用 DNS 预设。\n显示器测试（Monitor Test）：显示纯色测试画面，用于检查显示器坏点和色彩均匀性。\n配置 Cloudflare R2 作为图床 相比第三方图床，R2 的优势是：数据在你自己的 Cloudflare 账户里，免费额度充足（10GB 存储 + 每月 100 万次读取），无出站流量费，不会突然跑路。\n第一步：创建 R2 存储桶 登录 Cloudflare Dashboard 左侧菜单进入 Storage \u0026amp; Databases → R2 点击 Create bucket，填写存储桶名称（例如 sharex-images），选择地区后确认创建 第二步：绑定自定义域名（可选但推荐） 在存储桶设置里进入 Settings → Custom Domains，添加你在 Cloudflare 上托管的域名的子域（例如 img.yourdomain.com）。这样图片链接会是 https://img.yourdomain.com/xxx.png 而不是默认的 R2 公共 URL。\n域名必须托管在 Cloudflare（NS 指向 Cloudflare），才能直接绑定为 R2 自定义域。\n第三步：生成 R2 API Token 在 R2 Overview 页面点击 Manage API Tokens → Create API Token 权限选择 Object Read \u0026amp; Write，范围选择 Apply to specific bucket 并选中你刚创建的存储桶 点击 Create API Token 记录下 Access Key ID 和 Secret Access Key（Secret Key 只显示一次，务必保存） 同时记录页面下方的 Account ID 第四步：在 ShareX 中配置 打开 ShareX，进入 Destinations → Destination Settings 在左侧列表找到 Amazon S3 并选中 填写以下信息： 字段 填写内容 Access Key ID 第三步获取的 Access Key ID Secret Access Key 第三步获取的 Secret Access Key Endpoint \u0026lt;Account_ID\u0026gt;.r2.cloudflarestorage.com Region auto Bucket name 你的存储桶名称 Upload path 可选，例如 screenshots/{yyyy}/{MM}/ 按年月归档 Use custom domain 勾选，填入你绑定的自定义域名 进入右侧 Advanced 标签，取消勾选 Set public-read ACL on file R2 不支持 ACL，勾选 Set public-read ACL on file 会导致上传失败，务必取消。\n第五步：设置为默认上传目标 回到 ShareX 主界面，进入 Destinations → Image Uploader，选择 File Uploader → Amazon S3。对 File Uploader 做同样设置。\n截一张图触发上传，等待完成后链接自动复制到剪贴板，用浏览器打开验证即可。\n文件名规则 进入 Task Settings → File naming → Name pattern 自定义文件名格式。\n常用变量：\n变量 说明 %y 年（4 位） %mo 月（2 位） %d 日（2 位） %h 小时 %mi 分钟 %s 秒 %ra 随机字母数字 示例：%y%mo%d_%h%mi%s_%ra 生成类似 20260623_143022_k7x 的文件名，时间戳 + 随机后缀，确保唯一且有序。\n设置备份与迁移 ShareX 的所有配置保存在 %AppData%\\ShareX 文件夹中。迁移到新电脑时直接复制整个文件夹即可，包含所有快捷键、上传器配置和个人设置。\n总结 ShareX 的功能体系可以用三层来理解：\n截图层：7 种截图模式 + 完整标注编辑器，覆盖所有截图需求 自动化层：After Capture / After Upload Tasks 构成可编程工作流，一次截图触发一串操作 工具层：OCR、颜色拾取、哈希校验、屏幕固定等独立工具，很多场景下比单独安装专用软件更方便 配合 Cloudflare R2，截图到获得可用链接的整个过程可以压缩到 2 秒以内，且数据完全在自己手里。\nGitHub：ShareX/ShareX 官网：getsharex.com 协议：GPLv3 ","permalink":"/posts/sharex-guide-blog/","summary":"\u003cp\u003eShareX 是 Windows 上最强大的开源截图工具，没有之一。它免费、GPLv3 开源、持续活跃开发，功能密度远超任何付费竞品。但也正因为功能太多，很多人装上之后只用了截图，其他 90% 的能力从未触碰。\u003c/p\u003e\n\u003cp\u003e本文的目标是把 ShareX 20.2 的所有核心功能完整跑一遍。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eShareX 仅支持 Windows，没有 macOS 或 Linux 版本。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"安装\"\u003e安装\u003c/h2\u003e\n\u003cp\u003e从 \u003ca href=\"https://getsharex.com\"\u003egetsharex.com\u003c/a\u003e 下载安装版或便携版。两者功能完全一致，便携版不写注册表，适合放在 U 盘或不想污染系统的场景。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"截图模式\"\u003e截图模式\u003c/h2\u003e\n\u003cp\u003eShareX 提供 7 种截图模式，覆盖所有使用场景。\u003c/p\u003e\n\u003ch3 id=\"region区域截图\"\u003eRegion（区域截图）\u003c/h3\u003e\n\u003cp\u003e最常用的模式。按下快捷键后进入十字准星选区界面，支持像素级精确拖拽。进入选区界面后还可以切换为其他模式（窗口、全屏等），无需退出重来。\u003c/p\u003e\n\u003cp\u003e选区时按住空格键可以移动已经画好的选区，\u003ccode\u003eW\u003c/code\u003e 键切换放大镜，滚轮缩放放大镜倍率。\u003c/p\u003e\n\u003ch3 id=\"region-freehand自由形状\"\u003eRegion (Freehand)（自由形状）\u003c/h3\u003e\n\u003cp\u003e手绘任意形状截取。适合需要圈出不规则区域的场景，比如标记图片中某个具体位置。\u003c/p\u003e\n\u003ch3 id=\"fullscreen全屏\"\u003eFullscreen（全屏）\u003c/h3\u003e\n\u003cp\u003e截取所有显示器的完整画面。多显示器用户会得到一张拼合图。\u003c/p\u003e\n\u003ch3 id=\"active-window--active-monitor\"\u003eActive Window / Active Monitor\u003c/h3\u003e\n\u003cp\u003e仅截取当前焦点窗口或当前鼠标所在的显示器，不包含其他内容。\u003c/p\u003e\n\u003ch3 id=\"scrolling-capture滚动截图\"\u003eScrolling Capture（滚动截图）\u003c/h3\u003e\n\u003cp\u003e长截图功能。ShareX 会自动滚动页面并拼合成一张完整图片。对现代复杂网页（尤其是含有 sticky header 或懒加载内容的页面）效果存在一定限制，简单页面和文档类内容表现良好。\u003c/p\u003e\n\u003ch3 id=\"auto-capture自动截图\"\u003eAuto Capture（自动截图）\u003c/h3\u003e\n\u003cp\u003e按设定时间间隔自动截图。适合制作教程序列图、监控某个界面变化等场景。可以自定义截图区域和时间间隔。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"录屏与-gif\"\u003e录屏与 GIF\u003c/h2\u003e\n\u003cp\u003eShareX 使用 FFmpeg 处理视频录制，首次使用时会提示自动下载 FFmpeg。\u003c/p\u003e\n\u003ch3 id=\"屏幕录制\"\u003e屏幕录制\u003c/h3\u003e\n\u003cp\u003e支持录制指定区域、活动窗口或全屏，输出为 MP4。可以同时录制系统音频和麦克风输入。进入 \u003cstrong\u003eTask Settings → Screen Recorder → Screen recording options\u003c/strong\u003e 可以调整编码器（默认 x264）、帧率、码率等参数。\u003c/p\u003e","title":"ShareX 完全指南：截图、录屏与自动上传 Cloudflare R2"},{"content":" 一套完全免费、无云商、端到端可控的笔记同步方案： Joplin（笔记） + Syncthing（P2P 同步） + Tailscale（异地组网）\n一、为什么要这样搭？ 最初的需求很简单：\n不想把笔记丢到商业网盘 要跨平台：Windows + Android 手机断网也要能看、有网就能同步 不想折腾公网 IP、DDNS、端口映射 最终方案选型：\n组件 作用 Joplin Markdown 笔记 + 附件管理 Syncthing 开源 P2P 文件同步（替代 Dropbox） Tailscale 零配置虚拟内网，解决 NAT 和异地直连 二、整体架构 Joplin (Windows) ↓↑ 文件系统同步 Syncthing (Windows) ↕ Tailscale 虚拟内网直连 Syncthing (Android) ↓↑ 文件系统同步 Joplin (Android) Syncthing：负责把 Joplin 的同步目录在设备间同步 Tailscale：让两台设备永远\u0026quot;在一个内网\u0026quot; Joplin：只管读写笔记，不关心网络细节 三、安装与基础配置 Windows：为什么推荐 SyncTrayzor？ Syncthing 本体（syncthing.exe）是纯后台命令行程序，没有系统托盘、没有开机自启、没有图形外壳。Windows 上直接跑会有这些麻烦：\n每次要手动启动或注册 Windows 服务 同步状态不可见（需自己开浏览器） 锁屏/注销可能中断进程 SyncTrayzor 是 Windows 社区维护的官方推荐前端封装：\n功能 SyncTrayzor ✅ 裸 syncthing.exe 内嵌 Syncthing 内核 ✅ 自动捆绑 ✅ 需自己下 系统托盘图标 + 同步状态 ✅ ❌ 开机自启（用户级） ✅ 勾选即开 ⚠️ 需手动配服务 一键升级 Syncthing ✅ ⚠️ 手动替换 SyncTrayzor 不是 fork，只是把 Syncthing 包了一层 Windows GUI/托盘壳，协议和同步逻辑完全一样，设备间 100% 互通。\n下载地址：https://github.com/canton7/SyncTrayzor/releases\n下 SyncTrayzorSetup-x64.exe → 安装 → 自动打开 http://127.0.0.1:8384\nAndroid：Syncthing-Fork 安装 Syncthing-Fork（F-Droid / GitHub） 原版已停止维护，Fork 版持续更新 打开 App，记录 Device ID（也可展示为二维码） 配对设备 在电脑 SyncTrayzor 的 Web UI 中：\n右下角 Add Remote Device 粘贴手机 Device ID Save → 手机端弹出\u0026quot;新设备请求\u0026quot; → Accept 如果手机没弹窗（常见于国产 ROM 通知被拦截）：手机 App → Folders → 右上角 ➕ 添加文件夹，Folder ID 必须与电脑端完全一致（区分大小写，如 JoplinSync），选择本地路径后保存，向电脑发送接受信号。\n四、配置 Joplin 同步目录 创建 Syncthing 同步文件夹 电脑端 Syncthing Web UI：\nAdd Folder Folder Label：JoplinSync Folder Path：C:\\Users\\你的用户名\\Syncthing\\JoplinSync Sharing 标签页 → 勾选手机设备 → Save 手机端接受共享，选择本地路径： /storage/emulated/0/Syncthing/JoplinSync Joplin 设置为「文件系统」同步 Windows / Android 通用步骤：\n设置 → 同步（Synchronization） 同步目标：选 File system（文件系统） 同步目录（填绝对路径）： Windows：C:\\Users\\你的用户名\\Syncthing\\JoplinSync Android：/storage/emulated/0/Syncthing/JoplinSync 点 同步（Synchronize） 首次同步会生成大量小文件，这是正常现象——Joplin 的笔记和资源都会写成独立文件。\n开启删除同步 注意：默认情况下，Joplin 的\u0026quot;文件系统同步\u0026quot;不会主动传播删除操作。电脑删了笔记 → Joplin 只在本机数据库标记删除 → Syncthing 没有收到删除指令 → 手机端文件还在 → 手机 Joplin 重新读入后笔记仍存在。\n解决方法：\n同步设置页 → 展开 显示高级设置 勾选 「同步时从同步目标中删除已删除的笔记/资源」 每台设备都要单独开启 五、解决\u0026quot;连上了但很慢\u0026quot;的问题（Tailscale） 问题现象 Syncthing 日志中出现：\nDetected NAT type: Symmetric NAT Joined relay 说明两边网络是严格 NAT（对称型），Syncthing 打洞失败，被迫走官方中继（relay），带宽有限，速度慢、延迟高。\nTailscale 是什么？ Tailscale = 零配置 WireGuard 虚拟内网，把你的所有设备拉进同一个虚拟局域网：\n每台设备装 Tailscale → 登录同一账号 → 自动获得固定虚拟 IP（如 100.x.x.x） 不管设备在家 WiFi、公司网还是手机 4G/5G，都像插在同一台路由器上 流量端到端加密（WireGuard 协议），控制服务器只分发密钥，看不到你的数据 免费版个人日常使用完全够用 安装 Tailscale Windows\n下载官方 MSI：https://tailscale.com/download/windows\n不要用 Scoop 安装：Scoop 版是纯命令行，无 GUI，需手动管理启动。MSI 版含系统服务 + 托盘图标 + 开机自启，安装即用。\n安装 → 托盘图标 → Login → 浏览器登录\nAndroid\nPlay Store / F-Droid 安装 Tailscale，登录同一个账号。\n安装完成后两台设备各自获得虚拟 IP（如 100.82.x.x 和 100.75.x.x）。\n让 Syncthing 走 Tailscale 直连 在电脑 Syncthing Web UI：\n点手机设备卡片 → Edit 展开 Show Advanced 找到 Addresses 字段（默认是 dynamic） 改为手机 Tailscale IP，例如： tcp://100.75.23.18:22000 Save → 等设备变绿 手机端同理（可选）：编辑电脑设备 → Addresses 改为电脑 Tailscale IP。\n成功标志：\n设备状态变绿 Connected 鼠标悬停设备 → 连接显示 tcp://100.x.x.x:22000 不再是 relay://... → 直连成功，速度接近局域网 不想手动填 IP 也可以不改 Addresses，Tailscale 连上后 Syncthing 有时会自己发现直连。手动填是强制走 Tailscale、跳过中继，更稳。\n六、Android 保活 国产 ROM 容易杀后台，需要手动配置：\n系统设置（各品牌路径略有差异）：\n设置 → 应用管理 → Syncthing-Fork → 电池 → 不允许优化 / 无限制 允许开机自动启动 + 允许后台运行 多任务界面长按 Syncthing → 锁定🔒 Syncthing App 内设置：\n打开 Syncthing-Fork → Settings → Run Conditions：\n✅ Run on WiFi ✅ Run when charging（可选） 七、最终效果 笔记跨平台实时同步（Windows ↔ Android） 手机断网可离线阅读，有网自动同步 不依赖任何商业云服务 数据全程在自己设备之间流动 异地 WiFi / 4G / 公司网络均可直连 没有月费、没有容量上限 八、常见问题 问题 解决方案 电脑删笔记手机还在 开启 Joplin 同步高级设置中的\u0026quot;删除同步\u0026quot;选项 手机不弹共享请求 手动添加文件夹，Folder ID 必须与电脑完全一致 同步速度慢 安装 Tailscale，让 Syncthing 走虚拟内网直连 手机经常断连 关闭电池优化 + 允许自启 + 锁定后台 iOS 能用吗？ ❌ iOS Joplin 不支持 File System 同步，只能用 Joplin Cloud / WebDAV / Dropbox 数据安全吗？ Syncthing TLS 加密 + Tailscale WireGuard 加密 + Joplin 可选端到端加密 首次同步特别慢 正常，Joplin 会生成大量小文件，Syncthing 初次索引需要时间 ","permalink":"/posts/syncthing-tailscale-joplin/","summary":"\u003cblockquote\u003e\n\u003cp\u003e一套\u003cstrong\u003e完全免费、无云商、端到端可控\u003c/strong\u003e的笔记同步方案：\n\u003cstrong\u003eJoplin（笔记） + Syncthing（P2P 同步） + Tailscale（异地组网）\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"一为什么要这样搭\"\u003e一、为什么要这样搭？\u003c/h2\u003e\n\u003cp\u003e最初的需求很简单：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e不想把笔记丢到商业网盘\u003c/li\u003e\n\u003cli\u003e要跨平台：Windows + Android\u003c/li\u003e\n\u003cli\u003e手机断网也要能看、有网就能同步\u003c/li\u003e\n\u003cli\u003e不想折腾公网 IP、DDNS、端口映射\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e最终方案选型：\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e组件\u003c/th\u003e\n          \u003cth\u003e作用\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eJoplin\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eMarkdown 笔记 + 附件管理\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eSyncthing\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003e开源 P2P 文件同步（替代 Dropbox）\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eTailscale\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003e零配置虚拟内网，解决 NAT 和异地直连\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"二整体架构\"\u003e二、整体架构\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eJoplin (Windows)\n   ↓↑ 文件系统同步\nSyncthing (Windows)\n   ↕  Tailscale 虚拟内网直连\nSyncthing (Android)\n   ↓↑ 文件系统同步\nJoplin (Android)\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eSyncthing\u003c/strong\u003e：负责把 Joplin 的同步目录在设备间同步\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTailscale\u003c/strong\u003e：让两台设备永远\u0026quot;在一个内网\u0026quot;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eJoplin\u003c/strong\u003e：只管读写笔记，不关心网络细节\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"三安装与基础配置\"\u003e三、安装与基础配置\u003c/h2\u003e\n\u003ch3 id=\"windows为什么推荐-synctrayzor\"\u003eWindows：为什么推荐 SyncTrayzor？\u003c/h3\u003e\n\u003cp\u003eSyncthing 本体（\u003ccode\u003esyncthing.exe\u003c/code\u003e）是纯后台命令行程序，没有系统托盘、没有开机自启、没有图形外壳。Windows 上直接跑会有这些麻烦：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e每次要手动启动或注册 Windows 服务\u003c/li\u003e\n\u003cli\u003e同步状态不可见（需自己开浏览器）\u003c/li\u003e\n\u003cli\u003e锁屏/注销可能中断进程\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eSyncTrayzor\u003c/strong\u003e 是 Windows 社区维护的官方推荐前端封装：\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n          \u003cth\u003eSyncTrayzor ✅\u003c/th\u003e\n          \u003cth\u003e裸 syncthing.exe\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e内嵌 Syncthing 内核\u003c/td\u003e\n          \u003ctd\u003e✅ 自动捆绑\u003c/td\u003e\n          \u003ctd\u003e✅ 需自己下\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e系统托盘图标 + 同步状态\u003c/td\u003e\n          \u003ctd\u003e✅\u003c/td\u003e\n          \u003ctd\u003e❌\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e开机自启（用户级）\u003c/td\u003e\n          \u003ctd\u003e✅ 勾选即开\u003c/td\u003e\n          \u003ctd\u003e⚠️ 需手动配服务\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e一键升级 Syncthing\u003c/td\u003e\n          \u003ctd\u003e✅\u003c/td\u003e\n          \u003ctd\u003e⚠️ 手动替换\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSyncTrayzor 不是 fork，只是把 Syncthing 包了一层 Windows GUI/托盘壳，协议和同步逻辑完全一样，设备间 100% 互通。\u003c/p\u003e","title":"自建私有云笔记：Syncthing + Tailscale + Joplin 全平台同步"},{"content":"最近折腾了一下在 Windows 上用 WSL2 跑 Docker，全程不依赖 Docker Desktop 或任何桌面端工具，纯命令行完成。顺带把 Immich 私有相册也部署起来了。这篇文章记录完整过程，适合第一次上手的朋友参考。\n为什么不用 Docker Desktop Docker Desktop 本身没什么问题，但它是 GUI 应用，占资源，而且商业使用需要付费授权。WSL2 里直接跑 Docker Engine 更轻量，和 Linux 原生体验几乎一致，也更适合服务器思维的使用方式。\n一、安装 WSL2 并把 Ubuntu 装到 D 盘 默认情况下，WSL 会把发行版装在 C 盘。如果你的 C 盘空间有限，可以在安装时直接指定路径。\n以管理员身份打开 PowerShell，执行：\nwsl --install Ubuntu --web-download --location \u0026#34;D:\\WSL\\Ubuntu\u0026#34; 如果网络不好导致下载失败，可以手动下载安装包再安装：\nInvoke-WebRequest -Uri https://aka.ms/wslubuntu -OutFile Ubuntu.appx Add-AppxPackage .\\Ubuntu.appx wsl --install Ubuntu --location \u0026#34;D:\\WSL\\Ubuntu\u0026#34; 安装完成后会自动进入 Ubuntu 初始化界面，按提示创建用户名和密码。输密码时屏幕不会有任何显示，这是正常的，直接输入按 Enter 就好。\n二、基础系统配置 进入 Ubuntu 后先更新软件包，再装几个常用工具：\nsudo apt update \u0026amp;\u0026amp; sudo apt upgrade -y sudo apt install -y curl wget git vim build-essential net-tools 顺手把默认目录设到家目录，避免每次打开都在根目录：\ncd ~ echo \u0026#34;cd ~\u0026#34; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc 三、安装 Docker Engine WSL2 环境下按照 Docker 官方方式安装 Docker Engine，不需要 Docker Desktop。\n# 先卸载可能存在的旧版本 for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove -y $pkg done # 添加 Docker 官方 GPG 密钥和软件源 sudo apt update \u0026amp;\u0026amp; sudo apt install -y ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc echo \\ \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \\ $(. /etc/os-release \u0026amp;\u0026amp; echo \u0026#34;$VERSION_CODENAME\u0026#34;) stable\u0026#34; | \\ sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null # 安装 Docker sudo apt update \u0026amp;\u0026amp; sudo apt install -y \\ docker-ce docker-ce-cli containerd.io \\ docker-buildx-plugin docker-compose-plugin # 把当前用户加入 docker 组，避免每次都要 sudo sudo usermod -aG docker $USER 重新登录（或执行 newgrp docker）后，测试是否安装成功：\ndocker run hello-world 设置 Docker 开机自启动：\nsudo systemctl enable --now docker 四、配置国内镜像加速 Docker Hub 在国内访问速度很慢，甚至经常超时。可以配置镜像加速器来解决这个问题。\n编辑（或新建）Docker 的 daemon 配置文件：\nsudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json \u0026lt;\u0026lt;EOF { \u0026#34;registry-mirrors\u0026#34;: [ \u0026#34;https://docker.m.daocloud.io\u0026#34;, \u0026#34;https://dockerproxy.com\u0026#34;, \u0026#34;https://mirror.baidubce.com\u0026#34; ] } EOF 重启 Docker 使配置生效：\nsudo systemctl daemon-reload sudo systemctl restart docker 验证镜像加速是否生效：\ndocker info | grep -A 5 \u0026#34;Registry Mirrors\u0026#34; 说明： 国内镜像加速节点时效性较短，若某个地址失效，可以替换为其他可用节点。DaoCloud 和百度云目前稳定性相对较好。\n五、部署 Immich 私有相册 Immich 是一个开源的自托管相册方案，功能对标 Google Photos：自动备份、人脸识别、地图视图、时间线浏览一应俱全，而且数据完全在自己手里。\n1. 创建目录并下载配置文件 mkdir -p ~/immich \u0026amp;\u0026amp; cd ~/immich # 下载官方 docker-compose 配置 wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env 2. 修改环境变量 用 vim 或 nano 打开 .env 文件，修改以下两项：\nvim .env 关键配置项：\n# 相册数据存储路径，改成你想要的目录 UPLOAD_LOCATION=./library # 数据库密码，建议改成一个强密码 DB_PASSWORD=your_strong_password_here 如果你想把照片存在 Windows 的某个盘（比如 H 盘），可以这样设置路径：\nUPLOAD_LOCATION=/mnt/h/ImmichLibrary WSL2 会自动把 Windows 的 H 盘挂载到 /mnt/h。\n3. 启动 Immich docker compose up -d 第一次启动会拉取多个镜像，国内环境配好加速后一般 5-10 分钟内完成。\n4. 访问 Web 界面 启动成功后，在 Windows 浏览器中访问：\nhttp://localhost:2283 第一次访问需要注册管理员账号。注册完成后就可以开始使用了。\n5. 常用管理命令 # 查看运行状态 docker compose ps # 查看日志 docker compose logs -f # 停止服务 docker compose down # 更新到最新版本 docker compose pull \u0026amp;\u0026amp; docker compose up -d 六、一些使用注意事项 存储位置： Ubuntu 系统文件和通过 apt 安装的软件都在 D:\\WSL\\Ubuntu 下，不占 C 盘空间。\n访问 Windows 文件： 在 Ubuntu 中，C:\\ 对应 /mnt/c/，D:\\ 对应 /mnt/d/，以此类推。\nWSL 常用命令（在 PowerShell 里执行）：\nwsl --list --verbose # 查看已安装的发行版和状态 wsl --shutdown # 关闭所有 WSL 实例 资源占用： Immich 空闲时内存占用约 500MB-1GB，主要是数据库和机器学习服务。如果机器内存紧张，可以在 .env 中禁用机器学习功能（会失去人脸识别和智能搜索）。\n手机端备份： Immich 有官方 iOS 和 Android 客户端，设置服务器地址为 http://[你的Windows内网IP]:2283 即可自动备份手机相册。查看 Windows 内网 IP 可以在 PowerShell 里执行 ipconfig。\n第一次搭 WSL2 + Docker 的组合，整个过程下来比预想的顺利很多。没有桌面端的加持反而让整个环境更干净，理解也更深。Immich 的体验也超出预期，推荐有私有部署需求的朋友试试。\n","permalink":"/posts/wsl2-docker-immich/","summary":"\u003cp\u003e最近折腾了一下在 Windows 上用 WSL2 跑 Docker，全程不依赖 Docker Desktop 或任何桌面端工具，纯命令行完成。顺带把 Immich 私有相册也部署起来了。这篇文章记录完整过程，适合第一次上手的朋友参考。\u003c/p\u003e\n\u003ch2 id=\"为什么不用-docker-desktop\"\u003e为什么不用 Docker Desktop\u003c/h2\u003e\n\u003cp\u003eDocker Desktop 本身没什么问题，但它是 GUI 应用，占资源，而且商业使用需要付费授权。WSL2 里直接跑 Docker Engine 更轻量，和 Linux 原生体验几乎一致，也更适合服务器思维的使用方式。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"一安装-wsl2-并把-ubuntu-装到-d-盘\"\u003e一、安装 WSL2 并把 Ubuntu 装到 D 盘\u003c/h2\u003e\n\u003cp\u003e默认情况下，WSL 会把发行版装在 C 盘。如果你的 C 盘空间有限，可以在安装时直接指定路径。\u003c/p\u003e\n\u003cp\u003e以管理员身份打开 PowerShell，执行：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewsl --install Ubuntu --web-download --location \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;D:\\WSL\\Ubuntu\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果网络不好导致下载失败，可以手动下载安装包再安装：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eInvoke-WebRequest -Uri https\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e:\u003c/span\u003e//aka.ms/wslubuntu -OutFile Ubuntu.appx\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAdd-AppxPackage .\\Ubuntu.appx\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewsl --install Ubuntu --location \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;D:\\WSL\\Ubuntu\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e安装完成后会自动进入 Ubuntu 初始化界面，按提示创建用户名和密码。输密码时屏幕不会有任何显示，这是正常的，直接输入按 Enter 就好。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"二基础系统配置\"\u003e二、基础系统配置\u003c/h2\u003e\n\u003cp\u003e进入 Ubuntu 后先更新软件包，再装几个常用工具：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo apt update \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e sudo apt upgrade -y\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo apt install -y curl wget git vim build-essential net-tools\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e顺手把默认目录设到家目录，避免每次打开都在根目录：\u003c/p\u003e","title":"WSL2 跑 Docker，顺手装了 Immich"},{"content":"剪视频，不用重新编码。\n用 Premiere 或剪映剪掉几段素材，等待导出的时间总让人抓狂——几分钟的片段，渲染半小时，画质还损失一代。这叫 generation loss，每次重新编码都会叠加损耗。其实大多数情况下你根本不需要重新编码，只是想掐头去尾、提取一段、拼几个片段而已。\nLosslessCut 就是为这个场景生的。它调用捆绑的 FFmpeg，用 stream copy 模式直接复制数据流，不解码不重编，几秒钟处理几 GB 的文件，零质量损失。GitHub 上 40.9k+ Stars，挪威开发者 Mikael Finstad 独立维护，被 Hacker News、Wikipedia、YouTube 大 V 多次推荐。定位介于 Avidemux 和专业 NLE 之间——比前者强大，比后者轻快。\n\u0026ldquo;The swiss army knife of lossless video/audio editing\u0026rdquo;\nGitHub 版本永久免费开源，这是项目的核心理念。\n关于作者 Mikael Finstad，挪威独立开发者，网站 mifi.no，GitHub @mifi，2k+ followers。全职 freelance，技术栈以 JavaScript 为主：React、React Native、Node.js、Electron。他曾担任 SwimClips.com 的 CTO，2009 年成立了自己的软件公司 Yankee Software，主要以承接开发外包为生。\n除了 LosslessCut（2016 年首发，持续维护至今），他还做了不少值得一提的开源项目：\nEditly（5.3k Stars）：和 LosslessCut 定位互补，后者负责无损剪切，前者负责\u0026quot;用代码剪视频\u0026quot;——基于 Node.js + FFmpeg 的声明式视频编辑工具，写一个 JSON5 配置文件就能自动合成带转场、字幕、背景音乐的视频。支持 GL shader 转场效果、Canvas/Fabric.js 自定义层、Ken Burns 效果，也可以直接当 CLI 或 npm 库用。适合批量生成视频或自动化视频制作流程。\nSimpleInstaBot：Instagram 自动化工具，现在基本因平台限制而式微。\nreactive-video：用 React 写视频，每帧渲染一个 React 组件，走浏览器无头渲染后用 FFmpeg 合成，是 Editly 的 React 版替代方案。\ninstauto：Instagram 自动化 API 库。\n其他小工具：stacktracify（混淆 stack trace 反混淆）、ical-expander（iCal 日历展开工具）、hls-vod（HLS 流媒体服务器）、cognito-backup / dynamodump（AWS 数据备份）等，基本都是他自己用得上然后开源出来的实用工具。\n他在 GitHub README 里写的一句话很能概括他的创作动机：\n\u0026ldquo;I create free and open source software to share with the world because I believe software should be available to everyone.\u0026rdquo;\n平时爱好是旅行和徒步，Instagram 上常发挪威风光照，个人网站上还做了个叫 miffy.no 的小游戏。\n功能全览 所有操作都优先尝试 stream copy，能无损就绝不重编。\n基础剪切（Lossless Cutting \u0026amp; Trimming） 在 Timeline 上用 I / O 设入出点，创建 Segments，导出时只保留选定部分。典型场景是从几 GB 的 GoPro / 无人机 / 相机文件里快速挖出精彩片段，丢弃无用素材。\n关于切割精度：切割起点会对齐到最近的前一个关键帧（GOP 对齐），不是精确到帧的切割。这是 H.264/H.265 编码结构决定的，不是 bug。需要帧级精确可以开启实验性的 Smart Cut，它会在切点附近做小范围 re-encode 来提高精度。\n反转模式与片段重排 点击左下角\u0026quot;婴儿图标\u0026quot;启用高级视图，出现 Yin Yang ☯️ 按钮。点击后从\u0026quot;保留选中片段\u0026quot;变为\u0026quot;跳过选中片段\u0026quot;——专门用来切广告、删掉中间某段。\nSegments 面板支持拖拽重新排序，导出时按新顺序合并或分别输出。\n无损合并/拼接 将多个 codec 参数相同的文件（比如同一台相机连续拍的分段文件）无损拼接成一个。底层是 FFmpeg concat demuxer，选 Merge cuts 导出模式即可。\n多轨道编辑（最强大的功能之一） 这是 LosslessCut 区别于简单切割工具的核心能力：\n从多个文件组合任意轨道：把外部音乐音频 + 字幕轨道合并进视频 移除不需要的轨道（多余语言音轨、附件等） 仅替换部分轨道：保留视频无损，只 re-encode 音频 提取所有轨道：把视频、音频、字幕、附件分离到独立文件 Tracks 面板查看每条轨道的 codec、语言、disposition 等技术信息 编辑文件级和轨道级 metadata（标题、作者、语言、GPS 等） 支持同时播放多个音频轨道 实用场景：多语言音频切换、替换背景音乐、分离/合并字幕、从视频提取纯音频剪辑。\n格式 Remux（无损容器转换） 把 H.264/H.265 的 MKV 转成 MP4 / MOV，codec 数据一字节不动，只换容器外壳，秒完成。iPhone 不认 MKV 但能播 MP4 的问题，这样解决最合适。\n快照与帧导出 全分辨率快照：当前时间点导出 JPEG / PNG（低/高质量可选） 范围帧导出：每 N 帧、每秒、按场景变化、按最佳缩略图导出图像序列 支持只从选定 Segment 范围导出 文件名可包含原始时间戳 高级用法：从 keyframes 创建 segments → 转为 markers → 批量提取为图像 Timeline 高级交互 缩略图 + 音频波形可视化 关键帧跳转，精确在 I-frame 附近定位 时间码偏移（per-file timecode offset），支持从文件自动加载 旋转/方向元数据修改：修复手机横竖屏录制方向错误，不 re-encode，只改 flag 黑场 / 静音 / 场景变化检测：FFmpeg filter 扫描后自动生成 Segments 智能分割：按固定时长、文件大小（X MB）、N 个片段数、甚至随机化来切分 Timeline Segments 管理 Segments：有 start/end 的时间片段，导出时保留 Markers：无 end time 的点标记，不参与导出 每个 Segment 可添加 label 和多个 tags，按 tag 创建输出文件夹结构 右侧面板列表显示，右键菜单可编辑、提取帧，拖拽排序影响合并顺序 项目持久化与格式互导 自动保存 per-project 数据到 .llc 文件（JSON5 格式），退出后可恢复。支持多种格式导入导出 Segments：\nMP4 / MKV 内置章节标记（chapters） 纯文本、CSV / TSV（EDL 格式：start, end, label） YouTube Chapters CUE XML（DaVinci Resolve, Final Cut Pro） 内置 MKV / MP4 章节编辑器，支持查看内嵌字幕。\nJS 表达式语言（高级功能） 可以用 JavaScript 表达式查询、筛选、修改 Segments：\nsegment.label === \u0026#39;highlight\u0026#39; \u0026amp;\u0026amp; segment.duration \u0026lt; 5 配合 selectSegmentsByExpr、edit segments by expression 等操作，实现按时长/标签过滤后批量处理。结合热键绑定可以做到\u0026quot;一次配置，重复用于多个文件\u0026quot;。\n其他值得一提的功能 速度调整：加速/减速视频或音频（支持改变 FPS） DJI GPS 轨迹地图显示（Leaflet，UI 内展示） HTTP 无损下载：支持 HLS .m3u8 等流媒体直接下载并切割 极速移除所有非关键帧：适合 timelapse 处理 Undo/Redo + FFmpeg 最后命令日志查看（可复制到终端修改后重跑） Basic CLI \u0026amp; HTTP API：支持命令行和远程 HTTP 控制 Batch list：批量打开多文件逐个编辑导出 明确不支持的操作（需要 re-encode）：水印/文字叠加、模糊打码、颜色分级、转场、音量调整、GIF 生成、烧字幕、resize/stretch。\n安装 Windows 直接下载（推荐） 去 GitHub Releases 下载 Windows x64 的 .7z 压缩包，解压即用，不需要安装程序。注意 v3.50.0 之后不再支持 Win7/8/8.1。\n配置文件、快捷键、日志、缓存存在 %APPDATA%\\LosslessCut。卸载时删掉 app 文件夹 + 这个目录就干净了。\n想要自动更新可以从 Microsoft Store 付费购买（签名版，功能相同，稍滞后 GitHub）。\n其他平台 平台 免费下载 付费（自动更新） macOS Intel / Apple Silicon DMG（注意 PKG 不工作） Mac App Store（沙盒化，稍滞后） Linux x64 tar.bz2 / AppImage / arm64 / armv7l（树莓派） Flathub / Snap Store Nightly builds（实验性）：https://mifi.no/llc/nightly/\n系统要求 Windows 10+，macOS 12+，现代 Linux 任何能跑 Electron 的机器都行，预览用 Chromium 硬件解码 处理大文件建议 SSD，项目本身很轻量，瓶颈在磁盘和 FFmpeg 从源码构建 # 克隆仓库 git clone https://github.com/mifi/lossless-cut.git cd lossless-cut # 安装依赖 yarn install # 下载对应平台的 FFmpeg（必须，项目捆绑自定义构建） yarn download-ffmpeg-win32-x64 # Windows yarn download-ffmpeg-darwin-arm64 # macOS Apple Silicon yarn download-ffmpeg-linux-x64 # Linux # 开发运行 yarn dev # 打包 yarn pack-win # Windows 7z yarn pack-mac # macOS DMG yarn pack-linux # Linux AppImage 等 项目用 TypeScript 严格模式 + ESLint + Vitest，有贡献意向看 CONTRIBUTING.md，支持多语言翻译。\n基本操作流程 打开文件：拖拽或 Ctrl + O，支持批量拖入 Batch list 导航预览：Space 播放/暂停；方向键、, . 或滚轮 seek；Timeline 支持缩放和关键帧跳转 创建 Segments： I 设入点，O 设出点 + 新增 Segment，B 在当前位置分割，Backspace 删除 Shift 拖拽可移动/调整 Segment 大小 启用高级视图：点左下角婴儿图标，展开 Tracks、Yin Yang、Export options 等按钮 轨道管理：Tracks 面板选择/添加/移除轨道，可从其他文件引入 自动检测：Tools → 场景/静音/黑场检测，或 Divide timeline into segments 导出设置： Export mode：Separate files（默认）或 Merge cuts 输出文件名模板支持变量：${SEG_NUM_INT}、${EXPORT_COUNT} 等 执行导出：E 键，查看 FFmpeg 命令日志，保存 .llc 项目 快捷键速查 操作 快捷键 设入点 I 设出点 O 新增 Segment + 在当前位置分割 B 删除 Segment Backspace 播放/暂停 Space 导出 E 查看/编辑全部快捷键 Shift + / 实战场景 去广告/删中间段：用 Yin Yang 反转模式，标出要删的部分，导出剩余内容。\n导出 YouTube Chapters：Merge cuts → Create chapters from merged segments → File → Export project → YouTube Chapters。\n仅重编音频保留视频：提取视频/音频轨道 → HandBrake 处理音频 → LosslessCut 打开视频 + include 新音频轨道 → 导出。\n多文件剪辑后合并：Batch list 配合自定义输出文件名模板（带序号）→ 分别导出 → 拖入排序后 Merge。\n提取 Keyframes 为图像序列：Tools → Create segments from keyframes → 转为 markers → Extract frames as images。\n重复性自动化：toggleStripAll + Filter tracks 表达式 + selectSegmentsByExpr + 热键绑定，一键准备 + 导出。\nLosslessCut 不是完整 NLE，多文件编辑需分步进行。但通过 CSV/EDL/XML 可以和 DaVinci / FCP 协同工作。\n技术原理 架构 ┌─────────────────────────────────────────────────────────┐ │ UI Layer │ │ React + Radix UI + 自定义 Timeline │ │ HTML5 Video 预览（Chromium 硬件解码）+ Leaflet 地图 │ ├─────────────────────────────────────────────────────────┤ │ Electron Main Process │ │ Node.js / TypeScript │ │ 项目状态管理（JSON5 .llc）、全局快捷键、CLI/HTTP API │ ├─────────────────────────────────────────────────────────┤ │ Core Media Engine │ │ Bundled FFmpeg（各平台自定义构建） │ │ stream copy、concat demuxer、-map 多轨道 │ │ blackdetect / silencedetect / scene change filters │ ├─────────────────────────────────────────────────────────┤ │ Output \u0026amp; Import/Export │ │ Separate files / Merged、Chapters、CSV/EDL/XML │ └─────────────────────────────────────────────────────────┘ 技术栈：Electron + Vite + React + TypeScript。Frontend 用 @radix-ui/themes + DND Kit（拖拽）+ @tanstack/react-virtual（虚拟列表）+ Leaflet（GPS 地图）。打包用 electron-vite + electron-builder。\n项目不依赖系统 FFmpeg，而是为每个平台捆绑自定义构建（存于 ffmpeg/\u0026lt;platform\u0026gt;/），通过 child_process.spawn 调用，保证跨平台一致性。\nLossless 的本质 Stream Copy（-c copy）：直接复制 codec 数据流，不解码不重编。这是\u0026quot;几秒完成 + 零质量损失\u0026quot;的根本原因。\n关键帧对齐：视频编码的 GOP 结构决定了切割点只能对齐到 I-frame，这就是\u0026quot;start time rounded to previous keyframe\u0026quot;的来源。\nSmart Cut：在 cut 点附近做有限 re-encode 来提高精度，可通过命令日志观察具体实现。\n多轨道：大量使用 -map 参数精确选择输入流，支持多输入文件组合。\n合并（Concat）：生成临时 concat demuxer 文件列表，然后：\nffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4 检测功能：调用 FFmpeg filters（blackdetect、silencedetect、select for scene change），解析 stdout/stderr 生成 Segments。\n元数据/旋转修改：通过 -metadata、-disposition、-rotation 等选项在 remux 时修改，不触碰 codec 数据。\n每次导出后可以查看完整的 FFmpeg 命令日志，复制到终端修改后重跑——学 FFmpeg 的好资料。\n数据模型 .llc 文件是 JSON5 格式，存储 segments 数组（含 start/end/label/tags）、tracks 配置、metadata、timecode offset 等。Segments 数据结构支持 JS 表达式直接访问属性，这是 JS 表达式语言功能的基础。\n已知限制 部分容器/codec 的精确切割困难（依赖 keyframe 位置） 某些轨道类型无法切割 App Store 版本有沙盒限制（VOB 文件、写权限提示） 不支持原地覆盖输入文件（设计上禁止，防止数据丢失） 处理超大文件时 FFmpeg 可能使用临时文件，建议预留充足磁盘空间 总结 GitHub：mifi/lossless-cut 协议：GPL-2.0 跨平台：Windows / macOS / Linux LosslessCut 没有华而不实的 UI，就是把 FFmpeg 的强大能力通过键盘驱动的工作流交给普通用户。日常粗剪大文件、多音轨混剪、EDL 工作流对接 DaVinci，还是单纯想学 FFmpeg 命令，它都是目前 GitHub 上最成熟的无损视频处理方案。\n配合 HandBrake 处理需要 re-encode 的部分，基本覆盖日常视频处理的所有场景。\n","permalink":"/posts/losslesscut-%E6%97%A0%E6%8D%9F%E8%A7%86%E9%A2%91%E5%89%AA%E8%BE%91/","summary":"\u003cp\u003e剪视频，不用重新编码。\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e用 Premiere 或剪映剪掉几段素材，等待导出的时间总让人抓狂——几分钟的片段，渲染半小时，画质还损失一代。这叫 generation loss，每次重新编码都会叠加损耗。其实大多数情况下你根本不需要重新编码，只是想掐头去尾、提取一段、拼几个片段而已。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://github.com/mifi/lossless-cut\"\u003eLosslessCut\u003c/a\u003e\u003c/strong\u003e 就是为这个场景生的。它调用捆绑的 FFmpeg，用 stream copy 模式直接复制数据流，不解码不重编，几秒钟处理几 GB 的文件，零质量损失。GitHub 上 40.9k+ Stars，挪威开发者 Mikael Finstad 独立维护，被 Hacker News、Wikipedia、YouTube 大 V 多次推荐。定位介于 Avidemux 和专业 NLE 之间——比前者强大，比后者轻快。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026ldquo;The swiss army knife of lossless video/audio editing\u0026rdquo;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eGitHub 版本永久免费开源，这是项目的核心理念。\u003c/p\u003e\n\u003ch2 id=\"关于作者\"\u003e关于作者\u003c/h2\u003e\n\u003cp\u003eMikael Finstad，挪威独立开发者，网站 \u003ca href=\"https://mifi.no/\"\u003emifi.no\u003c/a\u003e，GitHub \u003ca href=\"https://github.com/mifi\"\u003e@mifi\u003c/a\u003e，2k+ followers。全职 freelance，技术栈以 JavaScript 为主：React、React Native、Node.js、Electron。他曾担任 SwimClips.com 的 CTO，2009 年成立了自己的软件公司 Yankee Software，主要以承接开发外包为生。\u003c/p\u003e\n\u003cp\u003e除了 LosslessCut（2016 年首发，持续维护至今），他还做了不少值得一提的开源项目：\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://github.com/mifi/editly\"\u003eEditly\u003c/a\u003e\u003c/strong\u003e（5.3k Stars）：和 LosslessCut 定位互补，后者负责无损剪切，前者负责\u0026quot;用代码剪视频\u0026quot;——基于 Node.js + FFmpeg 的声明式视频编辑工具，写一个 JSON5 配置文件就能自动合成带转场、字幕、背景音乐的视频。支持 GL shader 转场效果、Canvas/Fabric.js 自定义层、Ken Burns 效果，也可以直接当 CLI 或 npm 库用。适合批量生成视频或自动化视频制作流程。\u003c/p\u003e","title":"40k Stars 开源工具 LosslessCut：把 FFmpeg 的能力装进 GUI"},{"content":"大多数播放器先比拼界面颜值，mpv 思路完全相反：原生几乎没有操作界面，但深耕底层播放十余年，画质、格式兼容性、自定义拓展能力全部拉满，是影视爱好者、动漫党、剪辑工作者公认的终极播放器。\n一、mpv 发展简史 2000 年 MPlayer 诞生，是早期跨平台万能播放器，但长期迭代后代码臃肿冗余。\n2010 年社区分叉出 mplayer2，清理老旧代码，但仍存在架构缺陷。\n2012 年开发者 wm4 再次分叉重构，全新项目命名 mpv，核心设计理念只有一句话：播放器只专注解码播放，UI、美化、附加功能全部交给用户自定义拓展。\n2013 年 mpv 0.1.0 正式发布，由全球社区长期维护，底层依赖 FFmpeg 解码，Windows / macOS / Linux / Android 配置文件通用。\n在播放器圈子里，mpv 的地位如同编辑器里的 Vim：上手有学习成本，调教完成后几乎不会再换别的播放器。\n二、mpv 四大核心优势 1. 全格式原生兼容 依托 FFmpeg 内核，AV1、HEVC、杜比视界、HDR10+、MKV、FLV、WebM 等全部直接播放，无需额外安装解码器。\n2. 专业级画面渲染 内置高精度色彩管理、HDR 自动色调映射、运动帧插值，同一段视频对比 VLC 和普通播放器，色彩与流畅度肉眼可见。\n3. 强大 Lua 脚本生态 社区海量成熟脚本，实现进度预览、自动字幕、弹幕、片段截取、播放记录等功能，可按需自由加装。\n4. 轻量化无后台 启动秒开、内存占用极低，无后台驻留进程，无广告，无任何上传行为。\n三、为什么不推荐用 Scoop / winget 安装 mpv Scoop 和 winget 安装的 mpv 存在几个实际问题：\n路径深且复杂：Scoop 默认安装到 %USERPROFILE%\\scoop\\apps\\mpv\\current\\，配置文件跟随版本目录，更新后路径变动，自定义配置容易丢失。 便携模式不生效：Scoop 管理的应用走自己的 shim 机制，portable_config 目录识别经常出问题，导致配置不生效。 右键菜单注册麻烦：官方的 mpv-install.bat 对非标准路径支持不好，Scoop 用户经常遇到右键菜单注册失败的情况。 着色器、脚本路径混乱：着色器和脚本依赖 ~~/ 相对路径，Scoop 的 shim 层会导致路径解析出错。 绿色便携安装一步解决上述所有问题，路径固定、配置保留、更新无痛。\n四、Windows 纯绿色便携安装 1. 下载正确的安装包 推荐 shinichiro 构建包，官方社区维护，兼容性最好，自带右键注册脚本。\n下载地址：https://github.com/shinchiro/mpv-winbuild-cmake/releases\n包名区分规则：\n包名特征 说明 ✅ mpv-x86_64-日期-git-xxx.7z 正确，64 位主程序包 ❌ 带 dev 字样 开发调试包，不稳定 ❌ 带 i686 字样 32 位专用，现代系统不需要 ❌ 带 ffmpeg 字样 独立 FFmpeg 库分包 ❌ 带 aarch64 字样 ARM 架构专用 下载后用 7-Zip 解压到无中文、固定路径，推荐：\nD:\\Tools\\mpv\\ 2. 一键注册右键菜单（官方批处理） 解压根目录自带 installer 文件夹，无需手动写注册表：\n打开 D:\\Tools\\mpv\\installer\\ 右键 mpv-install.bat → 以管理员身份运行 注册成功后效果： 所有视频文件右键出现「Play with mpv」 文件夹空白处右键可直接启动 mpv Windows 默认应用列表中可将 mpv 设为全局视频播放器 迁移或卸载前，先以管理员身份运行同目录的 mpv-uninstall.bat，清除全部注册表关联，避免右键菜单失效。\n3. 启用便携模式（配置永久保存） 在 mpv 根目录新建文件夹：\nD:\\Tools\\mpv\\portable_config\\ mpv 检测到此文件夹后，所有配置、脚本、着色器、字体全部从这里读取。后续更新 mpv 只需覆盖压缩包内容，portable_config 完全不动，所有自定义内容原样保留。\n完整目录结构：\nD:\\Tools\\mpv\\ ├─ mpv.exe ├─ installer\\ │ ├─ mpv-install.bat │ └─ mpv-uninstall.bat └─ portable_config\\ ├─ mpv.conf # 主配置：画质、音频、字幕 ├─ input.conf # 自定义快捷键 ├─ scripts\\ # Lua 脚本 ├─ script-opts\\ # 各脚本独立配置 ├─ shaders\\ # 画质增强着色器 └─ fonts\\ # 自定义字体 五、基础配置文件 portable_config/mpv.conf # ====== 画质渲染核心 ====== profile=high-quality vo=gpu-next video-sync=display-resync interpolation=yes tscale=oversample # 硬件解码（自动识别显卡，N卡/A卡/Intel核显均可） hwdec=auto-safe # ====== 音频设置 ====== volume=100 volume-max=150 audio-normalize-downmix=yes # ====== 字幕全局设置 ====== sub-auto=fuzzy sub-font=Noto Sans CJK SC sub-font-size=44 sub-color=1.0/1.0/1.0 sub-border-color=0.0/0.0/0.0 sub-border-size=3 sub-shadow-offset=1 sub-margin-y=36 sub-ass-force-margins=yes # ====== 截图设置 ====== screenshot-format=png screenshot-high-bit-depth=yes screenshot-directory=./screenshot # ====== 窗口与播放记忆 ====== keep-open=yes save-position-on-quit=yes autofit=90%x90% osc=no # 关闭原生简陋控制条，使用 uosc 皮肤替代 border=no # 无边框现代化窗口 portable_config/input.conf # 快速进退 60 秒 Ctrl+RIGHT seek 60 Ctrl+LEFT seek -60 # 无字幕截图 Alt+s screenshot video # Anime4K 动画画质增强开关 CTRL+1 no-osd change-list glsl-shaders set \u0026#34;~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_M.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl\u0026#34;; show-text \u0026#34;Anime4K 动画高清增强：开启\u0026#34; CTRL+0 no-osd change-list glsl-shaders clr \u0026#34;\u0026#34;; show-text \u0026#34;画质着色器：已关闭\u0026#34; 六、必装脚本 \u0026amp; 皮肤推荐 所有脚本解压后放入 portable_config/scripts/。\nuosc（必装，现代化 UI 皮肤） GitHub：tomasklaen/uosc · Releases 下载\n原生 OSC 控制条简陋到难以实用，uosc 是目前最完善的替代方案：进度条悬浮预览、音量滑块、音轨/字幕切换、播放列表面板全部一体化，且与其余脚本完美兼容。\n安装：下载 uosc.zip，将压缩包内 scripts、fonts 文件夹直接合并进 portable_config。\nthumbfast（必装，进度条缩略预览） GitHub：po5/thumbfast · 直接下载 thumbfast.lua\n鼠标悬停进度条时实时弹出视频帧预览，和主流商业播放器体验一致，原生适配 uosc。单文件脚本，下载后直接放入 scripts/ 即可。\nmpv-assrt（自动下载中文字幕） GitHub：AssrtOSS/mpv-assrt · Releases 下载\n国内字幕源，一键匹配本地影片自动下载 ASS 字幕，匹配度远高于海外字幕网站，看剧基本不用手动找字幕。按 a 键呼出字幕搜索菜单。\nuosc_danmaku（番剧弹幕） GitHub：Tony15246/uosc_danmaku · Releases 下载\n调用弹弹 play API 拉取弹幕，支持 B 站、巴哈姆特等来源，uosc 控制栏内置弹幕开关、延迟调节、繁简转换，追番必备。注意：Release 版可能因弹弹 play 接口更新而失效，若出现搜索无结果，直接下载 main 分支最新源码使用。\ncopy-time（复制时间码） GitHub：Arieleg/mpv-copyTime · 直接下载 copy-time.lua\n快捷键一键复制当前播放时间戳到剪贴板，做剪辑或标记片段非常顺手。单文件脚本，下载后放入 scripts/ 即可。\nchapters（章节面板） GitHub：dyphire/mpv-scripts\n视频内置章节在 uosc 中可视化展示，鼠标点击快速跳转，看电影、纪录片体验大幅提升。从仓库中下载 chapter-list.lua 放入 scripts/。\ntrim.lua（无损视频截取） GitHub：aerobounce/trim.lua · 直接下载 trim.lua\n无需重新转码，调用 FFmpeg 直接裁剪片段，快速保存名场面。按 h 从当前位置截到末尾，按 k 从片头截到当前位置，再次按键确认输出。Windows 用户需在脚本开头将 ffmpeg_bin 改为 FFmpeg 完整路径。\n七、画质增强着色器 着色器文件放入 portable_config/shaders/。\nAnime4K（动画专用超分） 低分辨率动漫高清修复，强化线条、消除模糊，分轻量/高性能双模式，轻薄笔记本也能流畅运行。上方 input.conf 已绑定 Ctrl+1 / Ctrl+0 开关。\n下载：https://github.com/bloc97/Anime4K/releases\nArtCNN（真人电影专用超分） 实拍电影、纪录片 AI 超分，人像肤色自然还原，GPU 资源占用比 Anime4K 更低，适合写实类内容。\n下载：https://github.com/Artoriuz/ArtCNN\nAdaptive Sharpen（自适应锐化） 轻微提升画面细节，不会产生锯齿、噪点，老电影修复常用。\n八、默认基础快捷键速查 按键 功能 空格 播放 / 暂停 ← / → 后退 / 前进 5 秒 Shift+← / Shift+→ 后退 / 前进 1 秒 ↑ / ↓ 音量增减 f 全屏切换 m 静音 s 截图（含字幕） S 截图（不含字幕） [ / ] 播放速度 ±0.1 ` 查看视频编码、分辨率、帧率信息 l 设置 A-B 循环片段 q 退出 Q 退出并保存播放进度 九、在线视频直连播放 mpv 内置 yt-dlp 支持，可直接播放网络视频链接：\n下载 yt-dlp.exe，放到 mpv 根目录（与 mpv.exe 同级）； 将视频网页链接直接拖拽到 mpv 窗口即可在线播放； 在 mpv.conf 中加入以下配置，默认拉取 1080P 画质： ytdl-format=bestvideo[height\u0026lt;=1080]+bestaudio/best[height\u0026lt;=1080] 十、实用小技巧 A-B 循环：按 l 设起点、再按 l 设终点，反复循环该片段，学外语或剪辑标记专用。\n内置控制台：按 ` 打开控制台，可实时修改音量、跳转进度、调试配置，无需重启。\n批量播放：直接把整个视频文件夹拖进 mpv，自动生成播放列表，\u0026lt; / \u0026gt; 切换上下集。\n无痛更新：下载新版 7z 压缩包，直接覆盖解压到 D:\\Tools\\mpv\\，不要删除或覆盖 portable_config 目录，所有配置、脚本、着色器全部保留。\n延伸资源 mpv 官方手册：https://mpv.io/manual/stable/ awesome-mpv 脚本合集：https://github.com/stax76/awesome-mpv 动画专项调教教程：https://thewiki.moe/tutorials/mpv shinichiro 构建包下载：https://sourceforge.net/projects/mpv-player-windows/files/ ","permalink":"/posts/mpv-the-media-player/","summary":"\u003cp\u003e大多数播放器先比拼界面颜值，mpv 思路完全相反：原生几乎没有操作界面，但深耕底层播放十余年，画质、格式兼容性、自定义拓展能力全部拉满，是影视爱好者、动漫党、剪辑工作者公认的终极播放器。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"一mpv-发展简史\"\u003e一、mpv 发展简史\u003c/h2\u003e\n\u003cp\u003e2000 年 MPlayer 诞生，是早期跨平台万能播放器，但长期迭代后代码臃肿冗余。\u003c/p\u003e\n\u003cp\u003e2010 年社区分叉出 mplayer2，清理老旧代码，但仍存在架构缺陷。\u003c/p\u003e\n\u003cp\u003e2012 年开发者 wm4 再次分叉重构，全新项目命名 mpv，核心设计理念只有一句话：\u003cstrong\u003e播放器只专注解码播放，UI、美化、附加功能全部交给用户自定义拓展。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e2013 年 mpv 0.1.0 正式发布，由全球社区长期维护，底层依赖 FFmpeg 解码，Windows / macOS / Linux / Android 配置文件通用。\u003c/p\u003e\n\u003cp\u003e在播放器圈子里，mpv 的地位如同编辑器里的 Vim：上手有学习成本，调教完成后几乎不会再换别的播放器。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"二mpv-四大核心优势\"\u003e二、mpv 四大核心优势\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e1. 全格式原生兼容\u003c/strong\u003e\n依托 FFmpeg 内核，AV1、HEVC、杜比视界、HDR10+、MKV、FLV、WebM 等全部直接播放，无需额外安装解码器。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. 专业级画面渲染\u003c/strong\u003e\n内置高精度色彩管理、HDR 自动色调映射、运动帧插值，同一段视频对比 VLC 和普通播放器，色彩与流畅度肉眼可见。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3. 强大 Lua 脚本生态\u003c/strong\u003e\n社区海量成熟脚本，实现进度预览、自动字幕、弹幕、片段截取、播放记录等功能，可按需自由加装。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4. 轻量化无后台\u003c/strong\u003e\n启动秒开、内存占用极低，无后台驻留进程，无广告，无任何上传行为。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"三为什么不推荐用-scoop--winget-安装-mpv\"\u003e三、为什么不推荐用 Scoop / winget 安装 mpv\u003c/h2\u003e\n\u003cp\u003eScoop 和 winget 安装的 mpv 存在几个实际问题：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e路径深且复杂\u003c/strong\u003e：Scoop 默认安装到 \u003ccode\u003e%USERPROFILE%\\scoop\\apps\\mpv\\current\\\u003c/code\u003e，配置文件跟随版本目录，更新后路径变动，自定义配置容易丢失。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e便携模式不生效\u003c/strong\u003e：Scoop 管理的应用走自己的 shim 机制，\u003ccode\u003eportable_config\u003c/code\u003e 目录识别经常出问题，导致配置不生效。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e右键菜单注册麻烦\u003c/strong\u003e：官方的 \u003ccode\u003empv-install.bat\u003c/code\u003e 对非标准路径支持不好，Scoop 用户经常遇到右键菜单注册失败的情况。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e着色器、脚本路径混乱\u003c/strong\u003e：着色器和脚本依赖 \u003ccode\u003e~~/\u003c/code\u003e 相对路径，Scoop 的 shim 层会导致路径解析出错。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e绿色便携安装一步解决上述所有问题，路径固定、配置保留、更新无痛。\u003c/p\u003e","title":"mpv：一个播放器的极简哲学"},{"content":" \u0026ldquo;一个开源本地语音工作室——声音克隆、全局听写、TTS 生成，数据不离本机。\u0026rdquo;\n目录 它解决了什么问题 作者与团队 目前水平如何 核心功能 引擎怎么选 与竞品对比 优势与不足 Windows 安装 使用技巧与注意事项 接入 Claude Desktop 适合谁用 小结 它解决了什么问题 想在本地跑语音合成，选项不少，但都有明显缺口：\nElevenLabs：效果好、声音克隆强，但每个字都在别人服务器上处理，免费额度用完就要订阅 WisprFlow：全局听写体验一流，但 macOS 独占，Windows 用户没得用 Azure TTS / Google TTS：API 成熟，但要联网、要计费、要信任云厂商 Voicebox 的出发点很直接：把这两件事合进一个应用，跑在你自己的机器上，一条数据不上传。\n作者与团队 Voicebox 由加拿大开发者 Jamie Pine 独立开发，同时担任 Spacedrive Technology Inc. 的 CEO。\n他不是第一次做这种事。之前的代表作 Spacedrive 是一个用 Rust 构建的开源跨平台文件管理器，38k Star，走的是同一套路线：Tauri + Rust 技术栈、本地优先、审美在线。\nGitHub 签名三个字概括了他的风格：rust, ai and nice ui。\n他每天公开直播写代码，Voicebox 的很多功能都是在直播里边做边聊出来的，社区参与度很高，Issues 和 PR 回复也比较及时。\n目前水平如何 Voicebox 在 2025 年初开源，截至 2026 年 6 月已发布 v0.5.0，GitHub Star 28k+，在本地 TTS 工具里属于第一梯队。\n跟商业产品比： 底层模型（Chatterbox、Qwen3-TTS）在多项评测里的表现已经接近甚至持平 ElevenLabs，人工检测 AI 合成语音的准确率几乎与随机猜测无异。克隆效果不输付费服务，差距主要在稳定性和易用性上。\n跟同类开源工具比： 完成度明显高于把模型简单打包进 GUI 的竞品，从声音管理、克隆流程、全局听写到 MCP 集成，形成了完整工作流，而不只是一个推理前端。\n不足在哪： 还在快速迭代，偶尔有版本更新后引擎行为变化的问题；Windows 的听写自动注入功能尚未实现；Python 后端依赖首次配置有一定门槛。\n核心功能 🎙 声音克隆 上传 3–10 秒参考音频，Voicebox 用零样本克隆技术生成声音档案，之后生成语音时选这个档案即可。参考音频越干净（无背景噪声、无混响），克隆结果越准。\n⌨️ 全局听写 绑定一个全局热键，在任意窗口按下即开始录音，松开自动转文字输出到剪贴板。底层走 Whisper，支持中英文及 20+ 语言。可以额外开启本地 LLM 润色，自动去掉\u0026quot;嗯\u0026quot;\u0026ldquo;那个\u0026quot;等口头语。\n📖 Stories 编辑器 多角色脚本编辑器，给每段台词分配不同的克隆声音，一键导出多声部播客或有声书。\n🎛 后处理效果 生成语音后可叠加变调、混响、压缩等效果，不用再开 Audacity 处理。\n🤖 MCP Server 内置 MCP 服务端，让 Claude Desktop、Cursor 等 AI 客户端可以直接调用你的声音档案朗读输出。\n引擎怎么选 Voicebox 集成了多个 TTS 引擎，按需下载，不用全装：\n引擎 大小 显存 特点 Kokoro 350 MB ~150 MB 50 个预设声音，不支持克隆，最轻量，适合快速体验 Chatterbox Turbo 1.5 GB ~1.5 GB 英语，支持 [laugh] / [sigh] 情感标签 Qwen3-TTS 0.6B 1.2 GB ~2 GB 中英文克隆，轻量版 Qwen3-TTS 1.7B 3.5 GB ~6 GB 中英文克隆，精度最高 Chatterbox Multilingual 3.2 GB ~3 GB 23 种语言，克隆稳定，适合多语言场景 Whisper Turbo（STT） 1.5 GB — 听写用，速度与质量均衡，推荐首选 最省空间的起步组合：Kokoro + Whisper Turbo，合计不到 2 GB，可以体验 TTS 预设声音和听写。\n想要克隆：中英文加 Qwen3-TTS 0.6B，英语加 Chatterbox Turbo，多语言加 Chatterbox Multilingual。\n与竞品对比 Voicebox ElevenLabs WisprFlow Whisper + Coqui 本地运行 ✅ ❌ ❌ ✅ 声音克隆 ✅ ✅ ❌ ⚠️ 需自行配置 全局听写 ✅ ❌ ✅ ❌ Windows 支持 ✅ ✅ ❌ ✅ 免费使用 ✅ 完全免费 ⚠️ 有限额 ⚠️ 订阅制 ✅ 数据隐私 ✅ 不联网 ❌ 上传云端 ❌ 上传云端 ✅ MCP 集成 ✅ ❌ ❌ ❌ 开源 ✅ MIT ❌ ❌ ✅ 上手难度 ⚠️ 中等 ✅ 简单 ✅ 简单 ❌ 较高 ⚠️ ElevenLabs 和 WisprFlow 的体验打磨比 Voicebox 成熟，但代价是数据上传、持续付费、无法离线。Voicebox 是想要隐私和免费的用户目前最接近商业体验的选择。\n优势与不足 ✅ 优势\n所有推理在本地完成，语音数据不离开你的机器 TTS + STT + 克隆 + MCP 集成，工作流完整，不需要拼接多个工具 MIT 开源，可以审计代码，也可以自行修改 多引擎支持，可以根据显存和语言需求灵活选择 作者活跃，迭代速度快 ⚠️ 不足\nWindows 听写不支持自动注入光标，松开热键后需要手动 Ctrl+V（macOS 已支持，Windows 在 Roadmap 中） 依赖 Python 后端，首次启动需要下载依赖，对环境有一定要求 部分引擎升级后偶有声音一致性问题，遇到可以降版本或换引擎 没有手机端，无法在移动设备上使用 Windows 安装 第一步：下载安装包\n前往 GitHub Releases 下载最新 .exe 安装包，直接安装即可。Python 后端随应用打包，不需要单独安装 Python。\n第二步：确认显卡驱动\n有 NVIDIA 独显的，确认驱动版本 ≥ 527。没有独显的，应用内选择 DirectML 模式，CPU 也能跑，但推理速度明显慢于 GPU。\n第三步：下载模型\n首次启动后，进入设置 → 引擎，选择需要的引擎点击下载。模型文件保存在本地，下载一次永久可用。\n推荐先装 Kokoro（350 MB）验证一下能否正常出声，再按需追加其他引擎。\n使用技巧与注意事项 声音克隆效果最大化\n参考音频控制在 5–10 秒，太短克隆不稳定，太长也没有明显提升 录音环境尽量安静，背景噪声和混响是克隆质量的主要杀手 用同一个说话人的不同录音多试几次，选择效果最好的存档 Chatterbox Multilingual 的情感参数：0.3 适合信息播报，0.7 以上适合叙事或播客 引擎稳定性\nQwen3-TTS 精度高，但部分版本有声音漂移问题（同一文本多次生成声音不一致）。遇到可以固定 seed，或换用 Chatterbox Multilingual Chatterbox Turbo 的情感标签写在文字里，格式是 [laugh]、[sigh]，注意是英文方括号 Windows 听写流程\n目前在 Windows 上听写的实际操作是：\n按下热键，开始说话 松开热键，等待转录（约 1–2 秒） 手动 Ctrl+V 粘贴到目标位置 macOS 上松开热键会直接注入光标，体验更顺滑。Windows 自动注入功能预计在后续版本跟进。\n模型存放建议\n模型文件体积大，建议提前确认下载目录有足够空间。可以在应用设置里修改模型存放路径，推荐放到非系统盘。\n接入 Claude Desktop Voicebox 内置 MCP Server，接入后 Claude 可以直接调用你的克隆声音朗读输出，屏幕上会弹出浮层提示是哪个声音档案在发言。\n在 claude_desktop_config.json 里加入：\n{ \u0026#34;mcpServers\u0026#34;: { \u0026#34;voicebox\u0026#34;: { \u0026#34;command\u0026#34;: \u0026#34;npx\u0026#34;, \u0026#34;args\u0026#34;: [\u0026#34;-y\u0026#34;, \u0026#34;voicebox-mcp\u0026#34;] } } } 重启 Claude Desktop，在对话里让 Claude 说一句话测试一下：\n用我的克隆声音说：「部署完成」 如果配置正确，应该能听到声音并看到浮层提示。\n适合谁用 ✅ 非常适合\n需要 TTS 但不想把语音数据传给第三方的用户 想要声音克隆，又不愿意持续付费的人 在 Windows 上需要全局听写的开发者（目前选择很少） 用 Claude Desktop 并且想要语音输出的人 ⚠️ 暂时不适合\n需要手机端的用户 对听写自动注入有强需求的 Windows 用户（等后续版本） 完全没有 GPU 且对速度有要求的场景 小结 Voicebox 是目前开源本地 TTS 工具里完成度最高的选择，不只是把模型打包进 GUI，而是把克隆、听写、MCP 集成做成了完整工作流。对隐私有要求、不想持续付费、或者需要 AI Agent 能出声的人，目前没有比它更合适的方案。Windows 上的体验距离 macOS 还有一步，但主线功能已经可以日常使用。\n开源地址：github.com/jamiepine/voicebox 官网：voicebox.sh 协议：MIT，免费永久使用\n","permalink":"/posts/voicebox-%E6%9C%AC%E5%9C%B0%E5%BC%80%E6%BA%90%E8%AF%AD%E9%9F%B3%E5%B7%A5%E4%BD%9C%E5%AE%A4/","summary":"\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e\u0026ldquo;一个开源本地语音工作室——声音克隆、全局听写、TTS 生成，数据不离本机。\u0026rdquo;\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"目录\"\u003e目录\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#%E5%AE%83%E8%A7%A3%E5%86%B3%E4%BA%86%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98\"\u003e它解决了什么问题\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E4%BD%9C%E8%80%85%E4%B8%8E%E5%9B%A2%E9%98%9F\"\u003e作者与团队\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E7%9B%AE%E5%89%8D%E6%B0%B4%E5%B9%B3%E5%A6%82%E4%BD%95\"\u003e目前水平如何\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%A0%B8%E5%BF%83%E5%8A%9F%E8%83%BD\"\u003e核心功能\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%BC%95%E6%93%8E%E6%80%8E%E4%B9%88%E9%80%89\"\u003e引擎怎么选\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E4%B8%8E%E7%AB%9E%E5%93%81%E5%AF%B9%E6%AF%94\"\u003e与竞品对比\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E4%BC%98%E5%8A%BF%E4%B8%8E%E4%B8%8D%E8%B6%B3\"\u003e优势与不足\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#windows-%E5%AE%89%E8%A3%85\"\u003eWindows 安装\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7%E4%B8%8E%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9\"\u003e使用技巧与注意事项\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%8E%A5%E5%85%A5-claude-desktop\"\u003e接入 Claude Desktop\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E9%80%82%E5%90%88%E8%B0%81%E7%94%A8\"\u003e适合谁用\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%B0%8F%E7%BB%93\"\u003e小结\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"它解决了什么问题\"\u003e它解决了什么问题\u003c/h2\u003e\n\u003cp\u003e想在本地跑语音合成，选项不少，但都有明显缺口：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eElevenLabs\u003c/strong\u003e：效果好、声音克隆强，但每个字都在别人服务器上处理，免费额度用完就要订阅\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWisprFlow\u003c/strong\u003e：全局听写体验一流，但 macOS 独占，Windows 用户没得用\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAzure TTS / Google TTS\u003c/strong\u003e：API 成熟，但要联网、要计费、要信任云厂商\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVoicebox 的出发点很直接：\u003cstrong\u003e把这两件事合进一个应用，跑在你自己的机器上，一条数据不上传。\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"作者与团队\"\u003e作者与团队\u003c/h2\u003e\n\u003cp\u003eVoicebox 由加拿大开发者 \u003cstrong\u003eJamie Pine\u003c/strong\u003e 独立开发，同时担任 \u003cstrong\u003eSpacedrive Technology Inc.\u003c/strong\u003e 的 CEO。\u003c/p\u003e\n\u003cp\u003e他不是第一次做这种事。之前的代表作 \u003ca href=\"https://github.com/spacedriveapp/spacedrive\"\u003eSpacedrive\u003c/a\u003e 是一个用 Rust 构建的开源跨平台文件管理器，38k Star，走的是同一套路线：Tauri + Rust 技术栈、本地优先、审美在线。\u003c/p\u003e\n\u003cp\u003eGitHub 签名三个字概括了他的风格：\u003cstrong\u003erust, ai and nice ui\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e他每天公开直播写代码，Voicebox 的很多功能都是在直播里边做边聊出来的，社区参与度很高，Issues 和 PR 回复也比较及时。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"目前水平如何\"\u003e目前水平如何\u003c/h2\u003e\n\u003cp\u003eVoicebox 在 2025 年初开源，截至 2026 年 6 月已发布 v0.5.0，GitHub Star 28k+，在本地 TTS 工具里属于第一梯队。\u003c/p\u003e","title":"Voicebox：把 ElevenLabs 和 WisprFlow 装进本地"},{"content":"维护开源项目或工具清单时，经常会遇到一个问题：数据文件改了，README 忘记同步。时间一长，两边对不上，要么手动逐条复制，要么干脆摆烂。\n这篇文章用一个真实场景——书签工具清单——来演示怎么用 GitHub Actions + Python 脚本，实现「只改 bookmarks.yaml，README 自动更新」的工作流。\n思路 整个方案分两部分：\nPython 脚本：读取 bookmarks.yaml，按固定格式生成 README.md GitHub Actions：监听 bookmarks.yaml 的变动，自动触发脚本并提交结果 改动 bookmarks.yaml 之后，不管是本地 push 还是直接在 GitHub 网页上编辑，都会自动触发，不需要手动运行任何命令。\n数据文件结构 bookmarks.yaml 的结构很简单，每个分类包含图标、名称和工具列表：\n- category: 编程工具 icon: 🛠️ items: - name: Zed url: https://zed.dev/ desc: 轻量极速的现代代码编辑器 opensource: true - name: WezTerm url: https://wezfurlong.org/wezterm desc: 高性能跨平台终端模拟器 opensource: true opensource: true 是可选字段，没有这个字段默认视为非开源。\nPython 脚本 新建 gen_readme.py，放在仓库根目录：\n#!/usr/bin/env python3 import yaml HEADER = \u0026#34;\u0026#34;\u0026#34;# 🛠️ tools \u0026gt; 精选隐私友好、开源优先的实用工具清单。 \u0026gt; A curated list of privacy-friendly, open-source tools I actually use. 🔓 = 开源 / Open Source --- \u0026#34;\u0026#34;\u0026#34; FOOTER = \u0026#34;\u0026#34;\u0026#34; --- 欢迎提 Issue 或 PR 推荐新工具。 \u0026#34;\u0026#34;\u0026#34; def generate_readme(yaml_path=\u0026#34;bookmarks.yaml\u0026#34;, output_path=\u0026#34;README.md\u0026#34;): with open(yaml_path, \u0026#34;r\u0026#34;, encoding=\u0026#34;utf-8\u0026#34;) as f: data = yaml.safe_load(f) lines = [HEADER] for category in data: icon = category.get(\u0026#34;icon\u0026#34;, \u0026#34;\u0026#34;) name = category.get(\u0026#34;category\u0026#34;, \u0026#34;\u0026#34;) items = category.get(\u0026#34;items\u0026#34;, []) lines.append(f\u0026#34;## {icon} {name}\\n\u0026#34;) lines.append(\u0026#34;| 工具 | 描述 | 开源 |\u0026#34;) lines.append(\u0026#34;|------|------|------|\u0026#34;) for item in items: tool_name = item.get(\u0026#34;name\u0026#34;, \u0026#34;\u0026#34;) url = item.get(\u0026#34;url\u0026#34;, \u0026#34;\u0026#34;) desc = item.get(\u0026#34;desc\u0026#34;, \u0026#34;\u0026#34;) opensource = \u0026#34;🔓\u0026#34; if item.get(\u0026#34;opensource\u0026#34;) else \u0026#34;\u0026#34; lines.append(f\u0026#34;| [{tool_name}]({url}) | {desc} | {opensource} |\u0026#34;) lines.append(\u0026#34;\u0026#34;) lines.append(FOOTER.strip()) with open(output_path, \u0026#34;w\u0026#34;, encoding=\u0026#34;utf-8\u0026#34;) as f: f.write(\u0026#34;\\n\u0026#34;.join(lines)) print(f\u0026#34;✅ README.md 已生成，共 {len(data)} 个分类\u0026#34;) if __name__ == \u0026#34;__main__\u0026#34;: generate_readme() 几个关键点：\nyaml.safe_load() 而不是 yaml.load()——safe 版本不会执行 YAML 中的任意 Python 对象，更安全 category.get(\u0026quot;icon\u0026quot;, \u0026quot;\u0026quot;) 用 get 加默认值，字段缺失时不会报错 \u0026quot;🔓\u0026quot; if item.get(\u0026quot;opensource\u0026quot;) else \u0026quot;\u0026quot;——get 找不到字段返回 None，条件判断直接当 False 处理，所以不需要额外判断 GitHub Actions 配置 在仓库里新建 .github/workflows/update-readme.yml。\nGitHub 网页上怎么新建带目录的文件：\nGitHub 不支持直接新建空文件夹，但可以在新建文件时顺带创建目录。在仓库主页点 Add file → Create new file，文件名输入框里直接输入完整路径：\n.github/workflows/update-readme.yml 输入 / 的时候，GitHub 会自动把前面的部分折叠成目录层级，最终效果就是在 .github/workflows/ 下创建了 update-readme.yml。粘贴内容后点右上角 Commit changes 保存。\n内容如下：\nname: Update README on: push: paths: - bookmarks.yaml jobs: generate: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: \u0026#34;3.x\u0026#34; - name: Install dependencies run: pip install pyyaml - name: Generate README run: python gen_readme.py - name: Commit and push run: | git config user.name \u0026#34;github-actions[bot]\u0026#34; git config user.email \u0026#34;github-actions[bot]@users.noreply.github.com\u0026#34; git add README.md git diff --staged --quiet || git commit -m \u0026#34;docs: auto-update README from bookmarks.yaml\u0026#34; git push 逐段说明：\n触发条件\non: push: paths: - bookmarks.yaml paths 过滤器让 Actions 只在 bookmarks.yaml 有变动时才触发，改其他文件不会白跑一次。\n运行环境\nruns-on: ubuntu-latest 在 GitHub 提供的 Ubuntu 虚拟机上运行，免费额度对个人项目完全够用。\ncheckout\n- uses: actions/checkout@v4 把仓库代码拉到虚拟机里，后续步骤才能读取文件。@v4 是版本号，锁定版本避免上游更新导致行为变化。\n提交逻辑\ngit diff --staged --quiet || git commit -m \u0026#34;...\u0026#34; 这一行是关键：git diff --staged --quiet 检查暂存区有没有变化，没变化退出码为 0（静默成功）；|| 表示前面命令失败（有变化）才执行后面的 commit。这样避免了「README 没变但强行提交空 commit」的情况。\n仓库结构 最终仓库文件结构：\ntools/ ├── bookmarks.yaml # 只需要维护这一个 ├── gen_readme.py # 生成脚本 ├── README.md # 自动生成，不要手动改 └── .github/ └── workflows/ └── update-readme.yml README.md 不再手动维护，所有改动都通过 bookmarks.yaml 进行。\n必要设置：开启写入权限 配置完之后第一次触发，可能会遇到这个报错：\nremote: Permission to xxx/tools.git denied to github-actions[bot]. fatal: unable to access \u0026#39;...\u0026#39;: The requested URL returned error: 403 原因是 GitHub Actions 默认只有只读权限，bot 无法往仓库写入。去仓库设置里开一下：\nSettings → Actions → General → Workflow permissions → Read and write permissions\n保存后重新提交一次 bookmarks.yaml 触发即可。\n效果 推送 bookmarks.yaml 后，去仓库的 Actions 标签页可以看到工作流运行状态。成功后会多出一条 bot 提交的 commit，README.md 已经同步更新。\n这套方案的核心思路——单一数据源，自动派生其他格式——可以推广到很多类似场景：用 JSON 维护数据、自动生成文档站；用 CSV 维护变更日志、自动更新 CHANGELOG 等等。\n","permalink":"/posts/auto-readme-github-actions/","summary":"\u003cp\u003e维护开源项目或工具清单时，经常会遇到一个问题：数据文件改了，README 忘记同步。时间一长，两边对不上，要么手动逐条复制，要么干脆摆烂。\u003c/p\u003e\n\u003cp\u003e这篇文章用一个真实场景——书签工具清单——来演示怎么用 GitHub Actions + Python 脚本，实现「只改 \u003ccode\u003ebookmarks.yaml\u003c/code\u003e，README 自动更新」的工作流。\u003c/p\u003e\n\u003ch2 id=\"思路\"\u003e思路\u003c/h2\u003e\n\u003cp\u003e整个方案分两部分：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003ePython 脚本\u003c/strong\u003e：读取 \u003ccode\u003ebookmarks.yaml\u003c/code\u003e，按固定格式生成 \u003ccode\u003eREADME.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGitHub Actions\u003c/strong\u003e：监听 \u003ccode\u003ebookmarks.yaml\u003c/code\u003e 的变动，自动触发脚本并提交结果\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e改动 \u003ccode\u003ebookmarks.yaml\u003c/code\u003e 之后，不管是本地 push 还是直接在 GitHub 网页上编辑，都会自动触发，不需要手动运行任何命令。\u003c/p\u003e\n\u003ch2 id=\"数据文件结构\"\u003e数据文件结构\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003ebookmarks.yaml\u003c/code\u003e 的结构很简单，每个分类包含图标、名称和工具列表：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#f92672\"\u003ecategory\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003e编程工具\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f92672\"\u003eicon\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003e🛠️\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f92672\"\u003eitems\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    - \u003cspan style=\"color:#f92672\"\u003ename\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003eZed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003eurl\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003ehttps://zed.dev/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003edesc\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003e轻量极速的现代代码编辑器\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003eopensource\u003c/span\u003e: \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    - \u003cspan style=\"color:#f92672\"\u003ename\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003eWezTerm\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003eurl\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003ehttps://wezfurlong.org/wezterm\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003edesc\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003e高性能跨平台终端模拟器\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#f92672\"\u003eopensource\u003c/span\u003e: \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eopensource: true\u003c/code\u003e 是可选字段，没有这个字段默认视为非开源。\u003c/p\u003e\n\u003ch2 id=\"python-脚本\"\u003ePython 脚本\u003c/h2\u003e\n\u003cp\u003e新建 \u003ccode\u003egen_readme.py\u003c/code\u003e，放在仓库根目录：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e#!/usr/bin/env python3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eHEADER \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u0026#34;# 🛠️ tools\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026gt; 精选隐私友好、开源优先的实用工具清单。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026gt; A curated list of privacy-friendly, open-source tools I actually use.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e🔓 = 开源 / Open Source\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFOOTER \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e欢迎提 Issue 或 PR 推荐新工具。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003egenerate_readme\u003c/span\u003e(yaml_path\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;bookmarks.yaml\u0026#34;\u003c/span\u003e, output_path\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;README.md\u0026#34;\u003c/span\u003e):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e open(yaml_path, \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;r\u0026#34;\u003c/span\u003e, encoding\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;utf-8\u0026#34;\u003c/span\u003e) \u003cspan style=\"color:#66d9ef\"\u003eas\u003c/span\u003e f:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        data \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e yaml\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esafe_load(f)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    lines \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e [HEADER]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e category \u003cspan style=\"color:#f92672\"\u003ein\u003c/span\u003e data:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        icon \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e category\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eget(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;icon\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        name \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e category\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eget(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;category\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        items \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e category\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eget(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e, [])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        lines\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eappend(\u003cspan style=\"color:#e6db74\"\u003ef\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;## \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{\u003c/span\u003eicon\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{\u003c/span\u003ename\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        lines\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eappend(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;| 工具 | 描述 | 开源 |\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        lines\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eappend(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;|------|------|------|\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e item \u003cspan style=\"color:#f92672\"\u003ein\u003c/span\u003e items:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            tool_name \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e item\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eget(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            url \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e item\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eget(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            desc \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e item\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eget(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;desc\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            opensource \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;🔓\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e item\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eget(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;opensource\u0026#34;\u003c/span\u003e) \u003cspan style=\"color:#66d9ef\"\u003eelse\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            lines\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eappend(\u003cspan style=\"color:#e6db74\"\u003ef\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;| [\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{\u003c/span\u003etool_name\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e](\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{\u003c/span\u003eurl\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e) | \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{\u003c/span\u003edesc\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e | \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{\u003c/span\u003eopensource\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e |\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        lines\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eappend(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    lines\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eappend(FOOTER\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003estrip())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003ewith\u003c/span\u003e open(output_path, \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;w\u0026#34;\u003c/span\u003e, encoding\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;utf-8\u0026#34;\u003c/span\u003e) \u003cspan style=\"color:#66d9ef\"\u003eas\u003c/span\u003e f:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        f\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ewrite(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ejoin(lines))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#e6db74\"\u003ef\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;✅ README.md 已生成，共 \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{\u003c/span\u003elen(data)\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e 个分类\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e __name__ \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;__main__\u0026#34;\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    generate_readme()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e几个关键点：\u003c/p\u003e","title":"只改一个文件，README 自动同步——用 GitHub Actions 告别手动维护"},{"content":"Tolaria：为 AI 时代而生的本地笔记软件 \u0026ldquo;一个真正属于你的第二大脑——数据在本地，版本在 Git，AI 随时可调。\u0026rdquo;\n目录 它解决了什么问题 核心设计理念 功能详解 与主流工具对比 AI 集成方案 适合谁用 如何开始 它解决了什么问题 用了多年笔记软件，很多人都卡在同一个问题上：\nNotion：界面漂亮、协作强，但数据在服务器上，断网就瘫，免费版有限制 Obsidian：本地存储、插件丰富，但编辑体验原始，上手门槛不低 Evernote / Bear：易用，但格式私有，迁移麻烦，长期订阅费用累积可观 Tolaria 的出发点很简单：把 Obsidian 的数据主权 + Notion 的编辑体验 + AI 原生集成，合三为一。\n核心设计理念 🗂 文件优先，不是数据库 每一条笔记都是一个 .md 文件，存在你的硬盘上。没有私有数据库，没有加密格式，任何文本编辑器都能打开。即使 Tolaria 明天停止开发，你的笔记也完好无损。\n🔁 Git 就是你的同步和备份 每个笔记库（vault）本身就是一个 Git 仓库。你可以：\n把它推送到 GitHub / Gitea 私有仓库免费同步 查看任意一条笔记的完整修改历史 随时回滚到任意历史版本 不需要订阅 Tolaria 的云服务，不需要相信任何第三方。\n🤖 AI 不是插件，是基础设施 Tolaria 从设计之初就把 AI 集成作为核心功能，而不是事后加上去的插件。它内置了 MCP（Model Context Protocol）服务器，让 AI 工具可以像操作文件系统一样读写你的笔记。\n功能详解 编辑器 功能 说明 块编辑 类 Notion 的斜杠命令，输入 / 插入标题、列表、代码块等 双向链接 [[笔记名]] 语法，自动补全，构建知识网络 拖拽图片 直接拖入图片，自动保存到 vault 目录 键盘优先 大量快捷键，重度用户几乎不需要鼠标 所见即所得 Markdown 实时渲染，不用在源码和预览间切换 笔记组织 Tolaria 用**类型（Type）**作为笔记的分类维度，类似轻量级数据库的\u0026quot;表\u0026quot;概念，但更灵活——类型只是导航标签，不强制校验字段。\n你可以自定义类型，比如：\n📝 日记 📚 读书笔记 💡 想法 🔧 项目文档 配合自定义视图，按类型、标签、日期等条件筛选，保存为固定视图，随时一键切换。\nGit 版本控制 vault/ ├── .git/ ← 完整 Git 历史 ├── 日记/ │ └── 2026-06-07.md ├── 读书笔记/ │ └── 深度工作.md └── AGENTS ← AI 上下文配置文件 在 Tolaria 界面内即可完成提交、推送、查看历史，不需要打开终端。\n与主流工具对比 Tolaria Obsidian Notion Logseq 数据本地存储 ✅ ✅ ❌ ✅ 块编辑体验 ✅ ⚠️ 需插件 ✅ ✅ 内置 Git ✅ ❌ ❌ ❌ 原生 AI 集成 ✅ ⚠️ 需插件 ⚠️ 有限 ❌ 免费使用 ✅ 完全免费 ✅ 基础免费 ⚠️ 有限制 ✅ 插件生态 ❌ 尚未建立 ✅ 极其丰富 ✅ 丰富 ⚠️ 一般 移动端 ❌ 暂无 ✅ ✅ ✅ 开源 ✅ AGPL-3.0 ❌ ❌ ✅ ⚠️ Tolaria 发布于 2026 年 4 月，插件生态和移动端是目前最明显的短板，但核心功能已经可以日常使用。\nAI 集成方案 Tolaria 提供三种 AI 接入方式，根据自己的情况选择：\n方案一：Claude Code（功能最强） 通过内置 MCP 服务器连接 Claude Code CLI，AI 可以：\n读取整个 vault 的目录结构 搜索、创建、编辑任意笔记 理解笔记之间的关联 适合开发者，需要额外安装 Claude Code。\n方案二：API 模型（最灵活） 在设置 → API 模型里配置，支持：\nAnthropic Claude：https://api.anthropic.com/v1 OpenRouter：可接入多个免费模型，如 Gemini、Llama 阿里云百炼 Qwen：国内直连，新用户有大量免费额度 DeepSeek：https://api.deepseek.com/v1 方案三：本地模型（完全免费） 通过 Ollama 在本机运行模型，推荐：\nollama pull qwen2.5:7b # 4.7GB，中文效果好 ollama pull qwen2.5:14b # 9GB，能力更强 Tolaria 检测到 Ollama 运行后可自动连接，完全离线，无需任何费用。\n方案四：手动配合（最简单） 不配置任何 AI，直接把笔记内容复制到 claude.ai 或其他在线工具处理，再把结果粘贴回来。对于普通用户来说，这往往是最实用的方式。\n适合谁用 ✅ 非常适合\n在意数据主权、不想被云服务绑定的用户 有 Git 基础、希望笔记也有版本控制的开发者 想把 AI 深度融入知识管理工作流的人 管理大量 Markdown 文件的内容创作者 ⚠️ 暂时不适合\n需要手机随时记录的用户（移动端尚未推出） 依赖 Obsidian 插件生态的重度用户 完全不熟悉 Markdown 的新手 如何开始 第一步：下载安装\n前往官网 tolaria.md 或 GitHub 仓库 refactoringhq/tolaria 下载对应平台安装包。\n第二步：创建或打开 vault\n首次启动时，可以选择克隆官方「入门 vault」，包含完整的功能介绍和使用示例，建议新用户从这里开始。\n第三步：配置 AI（可选）\n根据上方「AI 集成方案」选择适合自己的方式配置，或者跳过这一步，先单纯用它来写笔记。\n第四步：迁移已有笔记\n如果你原来用 Obsidian，直接把 vault 文件夹用 Tolaria 打开即可——格式完全兼容。\n小结 Tolaria 是一个很有诚意的新工具。它没有试图在所有方面都打败竞品，而是明确地选择了一条路：本地文件 + Git + AI，三者深度整合。对于认同这套理念的用户来说，它已经足够好用；对于需要成熟生态和移动端的用户，可以再等等，它的迭代速度相当快。\n开源地址：github.com/refactoringhq/tolaria\n官网：tolaria.md\n协议：AGPL-3.0，免费永久使用\n","permalink":"/posts/tolaria%E4%BB%8B%E7%BB%8D/","summary":"\u003ch1 id=\"tolaria为-ai-时代而生的本地笔记软件\"\u003eTolaria：为 AI 时代而生的本地笔记软件\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e\u0026ldquo;一个真正属于你的第二大脑——数据在本地，版本在 Git，AI 随时可调。\u0026rdquo;\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"目录\"\u003e目录\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#%E5%AE%83%E8%A7%A3%E5%86%B3%E4%BA%86%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98\"\u003e它解决了什么问题\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E6%A0%B8%E5%BF%83%E8%AE%BE%E8%AE%A1%E7%90%86%E5%BF%B5\"\u003e核心设计理念\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3\"\u003e功能详解\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E4%B8%8E%E4%B8%BB%E6%B5%81%E5%B7%A5%E5%85%B7%E5%AF%B9%E6%AF%94\"\u003e与主流工具对比\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#ai-%E9%9B%86%E6%88%90%E6%96%B9%E6%A1%88\"\u003eAI 集成方案\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E9%80%82%E5%90%88%E8%B0%81%E7%94%A8\"\u003e适合谁用\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#%E5%A6%82%E4%BD%95%E5%BC%80%E5%A7%8B\"\u003e如何开始\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"它解决了什么问题\"\u003e它解决了什么问题\u003c/h2\u003e\n\u003cp\u003e用了多年笔记软件，很多人都卡在同一个问题上：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNotion\u003c/strong\u003e：界面漂亮、协作强，但数据在服务器上，断网就瘫，免费版有限制\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eObsidian\u003c/strong\u003e：本地存储、插件丰富，但编辑体验原始，上手门槛不低\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEvernote / Bear\u003c/strong\u003e：易用，但格式私有，迁移麻烦，长期订阅费用累积可观\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTolaria 的出发点很简单：\u003cstrong\u003e把 Obsidian 的数据主权 + Notion 的编辑体验 + AI 原生集成，合三为一。\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"核心设计理念\"\u003e核心设计理念\u003c/h2\u003e\n\u003ch3 id=\"-文件优先不是数据库\"\u003e🗂 文件优先，不是数据库\u003c/h3\u003e\n\u003cp\u003e每一条笔记都是一个 \u003ccode\u003e.md\u003c/code\u003e 文件，存在你的硬盘上。没有私有数据库，没有加密格式，任何文本编辑器都能打开。即使 Tolaria 明天停止开发，你的笔记也完好无损。\u003c/p\u003e\n\u003ch3 id=\"-git-就是你的同步和备份\"\u003e🔁 Git 就是你的同步和备份\u003c/h3\u003e\n\u003cp\u003e每个笔记库（vault）本身就是一个 Git 仓库。你可以：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e把它推送到 GitHub / Gitea 私有仓库免费同步\u003c/li\u003e\n\u003cli\u003e查看任意一条笔记的完整修改历史\u003c/li\u003e\n\u003cli\u003e随时回滚到任意历史版本\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e不需要订阅 Tolaria 的云服务，不需要相信任何第三方。\u003c/p\u003e\n\u003ch3 id=\"-ai-不是插件是基础设施\"\u003e🤖 AI 不是插件，是基础设施\u003c/h3\u003e\n\u003cp\u003eTolaria 从设计之初就把 AI 集成作为核心功能，而不是事后加上去的插件。它内置了 MCP（Model Context Protocol）服务器，让 AI 工具可以像操作文件系统一样读写你的笔记。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"功能详解\"\u003e功能详解\u003c/h2\u003e\n\u003ch3 id=\"编辑器\"\u003e编辑器\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e功能\u003c/th\u003e\n          \u003cth\u003e说明\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e块编辑\u003c/td\u003e\n          \u003ctd\u003e类 Notion 的斜杠命令，输入 \u003ccode\u003e/\u003c/code\u003e 插入标题、列表、代码块等\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e双向链接\u003c/td\u003e\n          \u003ctd\u003e\u003ccode\u003e[[笔记名]]\u003c/code\u003e 语法，自动补全，构建知识网络\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e拖拽图片\u003c/td\u003e\n          \u003ctd\u003e直接拖入图片，自动保存到 vault 目录\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e键盘优先\u003c/td\u003e\n          \u003ctd\u003e大量快捷键，重度用户几乎不需要鼠标\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e所见即所得\u003c/td\u003e\n          \u003ctd\u003eMarkdown 实时渲染，不用在源码和预览间切换\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"笔记组织\"\u003e笔记组织\u003c/h3\u003e\n\u003cp\u003eTolaria 用**类型（Type）**作为笔记的分类维度，类似轻量级数据库的\u0026quot;表\u0026quot;概念，但更灵活——类型只是导航标签，不强制校验字段。\u003c/p\u003e","title":"Tolaria：为 AI 时代而生的本地笔记软件"},{"content":"在国内用 Scoop，最头疼的不是用法，是网络。官方 bucket 托管在 GitHub，git clone 慢、下载超时、更新失败，三件套缺一不可。\nscoop-cn 是什么 scoop-cn 是 GitHub 用户 duzyn 维护的一个专为国内用户设计的 Scoop 镜像库，本文的思路也完全来自这个项目。它做了两件事：\n下载地址替换：把所有应用的下载链接替换为 gh-proxy.com 镜像，绕开直连 GitHub 的问题 多库合并：把官方全部十个 bucket（main、extras、versions、nirsoft、sysinternals、php、nerd-fonts、nonportable、java、games）合并进一个库，用一个 bucket 覆盖全部官方软件 库本身每小时自动同步官方内容，基本保持同步。换完之后不需要再单独 scoop bucket add extras 之类，scoop search 直接全覆盖。\n本文记录把已有 Scoop 切换到 scoop-cn 的完整步骤。\n切换步骤 第一步：删除现有 main bucket scoop bucket rm main 删除 bucket 只是移除软件包的元数据索引，不会卸载任何已安装的程序。\n如果上面命令报错，手动删除文件夹：\nRemove-Item \u0026#34;$env:USERPROFILE\\scoop\\buckets\\main\u0026#34; -Recurse -Force -ErrorAction SilentlyContinue 第二步：添加 scoop-cn 作为 main scoop bucket add main https://gh-proxy.com/https://github.com/duzyn/scoop-cn.git 第三步：更新并验证 scoop update scoop bucket list scoop status main 指向 https://github.com/duzyn/scoop-cn，且输出 Everything is ok!，切换完成。\n配置 aria2 多线程下载 换完 bucket 之后顺手把 aria2 也配上，下载速度会明显提升：\nscoop install aria2 scoop config aria2-enabled true scoop config aria2-max-connection-per-server 16 scoop config aria2-split 16 scoop config aria2-min-split-size 1M gh-proxy 失效时的处理 gh-proxy.com 偶尔会不稳定。如果 scoop update 开始失败，用以下命令更换代理地址：\n# 更新 Scoop 自身的拉取地址 scoop config scoop_repo https://gh-proxy.com/https://github.com/ScoopInstaller/Scoop.git # 更新 main bucket 的远程地址 git -C \u0026#34;$env:USERPROFILE\\scoop\\buckets\\main\u0026#34; remote set-url origin https://gh-proxy.com/https://github.com/duzyn/scoop-cn.git 把 https://gh-proxy.com 换成当时可用的其他镜像即可。\n附：安装目录建议放 D 盘 如果是全新安装 Scoop，建议提前把目录指向 D 盘，避免 C 盘长期膨胀：\n$env:SCOOP = \u0026#39;D:\\scoop\u0026#39; [Environment]::SetEnvironmentVariable(\u0026#39;SCOOP\u0026#39;, $env:SCOOP, \u0026#39;User\u0026#39;) 设置好之后再运行 Scoop 安装脚本。\n","permalink":"/posts/%E5%9B%BD%E5%86%85%E4%BD%BF%E7%94%A8-scoop%E6%8A%8A-main-bucket-%E6%8D%A2%E6%88%90-scoop-cn-%E5%B0%B1%E5%A4%9F%E4%BA%86/","summary":"\u003cp\u003e在国内用 Scoop，最头疼的不是用法，是网络。官方 bucket 托管在 GitHub，\u003ccode\u003egit clone\u003c/code\u003e 慢、下载超时、更新失败，三件套缺一不可。\u003c/p\u003e\n\u003ch2 id=\"scoop-cn-是什么\"\u003escoop-cn 是什么\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/duzyn/scoop-cn\"\u003escoop-cn\u003c/a\u003e 是 GitHub 用户 \u003ca href=\"https://github.com/duzyn\"\u003eduzyn\u003c/a\u003e 维护的一个专为国内用户设计的 Scoop 镜像库，本文的思路也完全来自这个项目。它做了两件事：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e下载地址替换\u003c/strong\u003e：把所有应用的下载链接替换为 \u003ca href=\"https://gh-proxy.com/\"\u003egh-proxy.com\u003c/a\u003e 镜像，绕开直连 GitHub 的问题\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e多库合并\u003c/strong\u003e：把官方全部十个 bucket（\u003ccode\u003emain\u003c/code\u003e、\u003ccode\u003eextras\u003c/code\u003e、\u003ccode\u003eversions\u003c/code\u003e、\u003ccode\u003enirsoft\u003c/code\u003e、\u003ccode\u003esysinternals\u003c/code\u003e、\u003ccode\u003ephp\u003c/code\u003e、\u003ccode\u003enerd-fonts\u003c/code\u003e、\u003ccode\u003enonportable\u003c/code\u003e、\u003ccode\u003ejava\u003c/code\u003e、\u003ccode\u003egames\u003c/code\u003e）合并进一个库，用一个 bucket 覆盖全部官方软件\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e库本身每小时自动同步官方内容，基本保持同步。换完之后不需要再单独 \u003ccode\u003escoop bucket add extras\u003c/code\u003e 之类，\u003ccode\u003escoop search\u003c/code\u003e 直接全覆盖。\u003c/p\u003e\n\u003cp\u003e本文记录把已有 Scoop 切换到 scoop-cn 的完整步骤。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"切换步骤\"\u003e切换步骤\u003c/h2\u003e\n\u003ch3 id=\"第一步删除现有-main-bucket\"\u003e第一步：删除现有 main bucket\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escoop bucket rm main\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e删除 bucket 只是移除软件包的元数据索引，不会卸载任何已安装的程序。\u003c/p\u003e\n\u003cp\u003e如果上面命令报错，手动删除文件夹：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRemove-Item \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u003c/span\u003e$env:USERPROFILE\u003cspan style=\"color:#e6db74\"\u003e\\scoop\\buckets\\main\u0026#34;\u003c/span\u003e -Recurse -Force -ErrorAction SilentlyContinue\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"第二步添加-scoop-cn-作为-main\"\u003e第二步：添加 scoop-cn 作为 main\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escoop bucket add main https\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e:\u003c/span\u003e//gh-proxy.com/https\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e:\u003c/span\u003e//github.com/duzyn/scoop-cn.git\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"第三步更新并验证\"\u003e第三步：更新并验证\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escoop update\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escoop bucket list\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escoop status\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003emain\u003c/code\u003e 指向 \u003ccode\u003ehttps://github.com/duzyn/scoop-cn\u003c/code\u003e，且输出 \u003ccode\u003eEverything is ok!\u003c/code\u003e，切换完成。\u003c/p\u003e","title":"国内使用 Scoop？把 main bucket 换成 scoop-cn 就够了"},{"content":"用 Scoop 管理 Windows 软件，从此告别手动安装 每次装新电脑，你是不是也要经历这套流程：打开浏览器，搜索软件名，找到官网，下载安装包，下一步下一步完成，然后发现装到 C 盘了……\nScoop 可以终结这一切。\nScoop 是什么 Scoop 是 Windows 上的命令行包管理器，类似 macOS 上的 Homebrew。你只需要一条命令，它就能帮你下载、安装、更新、卸载软件，而且全部装在你指定的目录里，不动注册表，不需要管理员权限。\n装软件就是这样：\nscoop install git 更新所有软件就是这样：\nscoop update * 安装 Scoop 打开 PowerShell（不需要管理员），执行：\nSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser irm get.scoop.sh | iex 默认会装在 C:\\Users\\你的用户名\\scoop。如果想装到其他盘，在安装前先设置：\n$env:SCOOP=\u0026#39;D:\\scoop\u0026#39; [Environment]::SetEnvironmentVariable(\u0026#39;SCOOP\u0026#39;, $env:SCOOP, \u0026#39;User\u0026#39;) irm get.scoop.sh | iex 设置一次，之后所有 Scoop 管理的软件都在 D 盘，一劳永逸。\nBucket 是什么 Scoop 把软件分装在不同的\u0026quot;桶\u0026quot;（bucket）里。默认只有 main，收录命令行工具。日常最常用的是 extras，收录了大量 GUI 应用：\nscoop bucket add extras 其他常用 bucket：\nBucket 内容 main 命令行工具，默认已添加 extras GUI 应用，最常用 versions 软件的历史版本 nerd-fonts 编程字体，比如 JetBrains Mono 添加完 extras 之后，你能装的软件范围就覆盖了绝大多数日常需求。\n常用命令速查 # 搜索软件 scoop search mailspring # 安装软件 scoop install extras/mailspring # 更新单个软件 scoop update mailspring # 更新所有软件 scoop update * # 卸载软件 scoop uninstall mailspring # 查看已安装的软件 scoop list # 查看软件安装信息 scoop info git 哪些软件可以用 Scoop 装 开发类工具几乎全覆盖：\nscoop install git python nodejs ffmpeg yt-dlp hugo 常用 GUI 软件也有：\nscoop install extras/zen-browser scoop install extras/mailspring scoop install extras/vscode scoop install extras/obsidian scoop install extras/vlc 字体也可以：\nscoop bucket add nerd-fonts scoop install nerd-fonts/JetBrainsMono-NF 最大的隐藏好处：换电脑 Scoop 可以导出你所有已安装软件的列表：\nscoop export \u0026gt; scoopfile.json 新电脑装好 Scoop 之后，一条命令全部还原：\nscoop import scoopfile.json 把 scoopfile.json 放进云盘或 Git 仓库，重装系统再也不用痛苦地回忆\u0026quot;我之前装了什么\u0026quot;。\n和手动安装的对比 手动安装 Scoop 安装路径 由安装包决定，常常是 C 盘 完全由你控制 更新 打开软件等提示，或去官网重下 scoop update * 卸载 控制面板，残留文件难清理 scoop uninstall，干净彻底 需要管理员权限 大多数需要 不需要 换电脑迁移 手动一个个重装 导出列表，一键还原 注册表 会写入 基本不动 小技巧 不知道软件叫什么名字？ 用 scoop search 模糊搜索，或者去 scoop.sh 直接在网页上搜。\n已经手动装了一堆软件怎么办？ 不用强行迁移。等某个软件下次需要更新时，卸掉旧的，用 Scoop 重装。命令行工具可以现在就迁，GUI 软件等自然更新周期到了再换。\n软件装在哪里？ 每个软件都在 D:\\scoop\\apps\\软件名\\ 下，版本目录清晰，一目了然。\n总结 Scoop 没有学习成本，装完就能用，带来的收益却是长期的：软件统一管理、路径可控、更新方便、换机无痛。\n如果你用 Windows 做开发或者重度使用开源工具，Scoop 是目前最值得养成的使用习惯之一。\n","permalink":"/posts/%E7%94%A8scoop%E7%AE%A1%E7%90%86windows%E8%BD%AF%E4%BB%B6/","summary":"\u003ch1 id=\"用-scoop-管理-windows-软件从此告别手动安装\"\u003e用 Scoop 管理 Windows 软件，从此告别手动安装\u003c/h1\u003e\n\u003cp\u003e每次装新电脑，你是不是也要经历这套流程：打开浏览器，搜索软件名，找到官网，下载安装包，下一步下一步完成，然后发现装到 C 盘了……\u003c/p\u003e\n\u003cp\u003eScoop 可以终结这一切。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"scoop-是什么\"\u003eScoop 是什么\u003c/h2\u003e\n\u003cp\u003eScoop 是 Windows 上的命令行包管理器，类似 macOS 上的 Homebrew。你只需要一条命令，它就能帮你下载、安装、更新、卸载软件，而且全部装在你指定的目录里，不动注册表，不需要管理员权限。\u003c/p\u003e\n\u003cp\u003e装软件就是这样：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escoop install git\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e更新所有软件就是这样：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escoop update *\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"安装-scoop\"\u003e安装 Scoop\u003c/h2\u003e\n\u003cp\u003e打开 PowerShell（不需要管理员），执行：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eirm get.scoop.sh | iex\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e默认会装在 \u003ccode\u003eC:\\Users\\你的用户名\\scoop\u003c/code\u003e。如果想装到其他盘，在安装前先设置：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$env:SCOOP=\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;D:\\scoop\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#66d9ef\"\u003eEnvironment\u003c/span\u003e]::SetEnvironmentVariable(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;SCOOP\u0026#39;\u003c/span\u003e, $env:SCOOP, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;User\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eirm get.scoop.sh | iex\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e设置一次，之后所有 Scoop 管理的软件都在 D 盘，一劳永逸。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"bucket-是什么\"\u003eBucket 是什么\u003c/h2\u003e\n\u003cp\u003eScoop 把软件分装在不同的\u0026quot;桶\u0026quot;（bucket）里。默认只有 \u003ccode\u003emain\u003c/code\u003e，收录命令行工具。日常最常用的是 \u003ccode\u003eextras\u003c/code\u003e，收录了大量 GUI 应用：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escoop bucket add extras\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e其他常用 bucket：\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eBucket\u003c/th\u003e\n          \u003cth\u003e内容\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003emain\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e命令行工具，默认已添加\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eextras\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eGUI 应用，最常用\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eversions\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e软件的历史版本\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003enerd-fonts\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e编程字体，比如 JetBrains Mono\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e添加完 extras 之后，你能装的软件范围就覆盖了绝大多数日常需求。\u003c/p\u003e","title":"用 Scoop 管理 Windows 软件，从此告别手动安装"},{"content":"有些 Windows 安装包，打开直接就装了，连个路径选择都没有，默认往 C 盘塞。 下面三种方法，从简单到彻底，总有一个适合你。\n以 ABDownloadManager 为例，其他类似的安装包思路完全一样。\n方法一：命令行 /D 参数 很多安装包底层用的是 NSIS 打包工具，支持用命令行参数指定安装路径。\n在安装包所在文件夹，按住 Shift 右键空白处，选在此处打开 PowerShell 窗口（或终端窗口），然后执行：\n.\\ABDownloadManager_1.8.8_windows_x64.exe /D=D:\\ABDownloadManager 注意事项：\n/D= 后面不要加引号，即使路径有空格也不加 /D=... 必须放在命令的最后 路径必须是绝对路径 如果安装包文件名本身有空格，直接执行会报错：\n.\\Anytype: The term \u0026#39;.\\Anytype\u0026#39; is not recognized... 这是因为 PowerShell 会把空格当作参数分隔符，把文件名截断了。解决方法是用引号包住文件名，并在前面加调用运算符 \u0026amp;：\n\u0026amp; \u0026#34;.\\Anytype Setup 0.55.4.exe\u0026#34; /D=D:\\anytype \u0026amp; 是 PowerShell 的调用运算符，专门用来执行路径中含空格的程序 引号只包文件名，/D=... 参数放在引号外面，保持原样 如果安装包正常弹出安装向导，安装完成后就会出现在 D 盘指定目录。\n这个方法不是百分百有效——部分安装包会忽略 /D 参数，强制装到 C 盘。遇到这种情况，用下面的方法。\n方法二：安装后迁移 先默认装完，再把程序整体搬到 D 盘。\n步骤：\n按默认流程安装完成 确保程序已完全退出（任务管理器确认没有相关进程） 把安装目录整个文件夹剪切到 D 盘目标位置 右键桌面快捷方式 → 属性 → 修改目标路径指向新位置 大部分非系统级程序直接搬就能正常运行，不需要重装。\n可选：更新注册表\n如果你在意\u0026quot;程序和功能\u0026quot;里的卸载路径显示正确，可以顺手改一下：\n按 Win + R 输入 regedit，找到：\nHKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\ 在里面找到对应程序的项，修改 InstallLocation 的值为新路径即可。\n方法三：用 Scoop 安装（一劳永逸） 如果你经常装软件，Scoop 是更根本的解决办法。\nScoop 是 Windows 上的命令行包管理器，所有软件统一装在一个目录，这个目录可以放在任意盘。\nScoop 适合装什么：\n类型 举例 开发工具 git、node、python、go、ffmpeg、7zip 命令行工具 curl、wget、jq、fzf、ripgrep 终端美化 oh-my-posh、starship GUI 软件 ABDownloadManager、Obsidian、VSCode、Lazygit 编程字体 JetBrainsMono、CascadiaCode（需加 nerd-fonts bucket） 不适合装：Office、Adobe 全家桶、微信这类大型商业或国产软件，Scoop 里基本没有收录。\n先把 Scoop 装到 D 盘：\n在 PowerShell 里执行（顺序不能乱）：\n$env:SCOOP=\u0026#39;D:\\Scoop\u0026#39; [Environment]::SetEnvironmentVariable(\u0026#39;SCOOP\u0026#39;, $env:SCOOP, \u0026#39;User\u0026#39;) irm get.scoop.sh | iex 然后装 ABDownloadManager：\nscoop bucket add extras scoop install extras/ab-download-manager 装完就在 D:\\Scoop\\apps\\ab-download-manager\\ 下，干净，好管理。\nScoop 常用命令：\nscoop install \u0026lt;软件名\u0026gt; # 安装 scoop uninstall \u0026lt;软件名\u0026gt; # 卸载 scoop update \u0026lt;软件名\u0026gt; # 更新某个软件 scoop update * # 更新所有软件 scoop search \u0026lt;关键词\u0026gt; # 搜索 scoop list # 查看已安装 卸载彻底，不写注册表，不需要管理员权限，更新一条命令搞定。 如果你有多个软件想统一管理，值得配一下。\n三种方法对比 方法 适合场景 成功率 命令行 /D 参数 快速搞定单个软件 约 70%，看安装包是否支持 安装后迁移 通用兜底方案 高，非系统级程序基本都行 Scoop 长期管理多个软件 100%，完全掌控路径 ","permalink":"/posts/windows-%E5%AE%89%E8%A3%85%E5%8C%85%E4%B8%8D%E8%AE%A9%E9%80%89%E8%B7%AF%E5%BE%84%E4%B8%89%E6%8B%9B%E8%A3%85%E5%88%B0%E4%BB%BB%E6%84%8F%E7%9B%98/","summary":"\u003cp\u003e有些 Windows 安装包，打开直接就装了，连个路径选择都没有，默认往 C 盘塞。\n下面三种方法，从简单到彻底，总有一个适合你。\u003c/p\u003e\n\u003cp\u003e以 ABDownloadManager 为例，其他类似的安装包思路完全一样。\u003c/p\u003e\n\u003ch2 id=\"方法一命令行-d-参数\"\u003e方法一：命令行 \u003ccode\u003e/D\u003c/code\u003e 参数\u003c/h2\u003e\n\u003cp\u003e很多安装包底层用的是 NSIS 打包工具，支持用命令行参数指定安装路径。\u003c/p\u003e\n\u003cp\u003e在安装包所在文件夹，按住 \u003ccode\u003eShift\u003c/code\u003e 右键空白处，选\u003cstrong\u003e在此处打开 PowerShell 窗口\u003c/strong\u003e（或终端窗口），然后执行：\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e.\\ABDownloadManager_1.8.8_windows_x64.exe /D=D:\\ABDownloadManager\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e注意事项：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/D=\u003c/code\u003e 后面\u003cstrong\u003e不要加引号\u003c/strong\u003e，即使路径有空格也不加\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/D=...\u003c/code\u003e 必须放在命令的最后\u003c/li\u003e\n\u003cli\u003e路径必须是绝对路径\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e如果安装包文件名本身有空格\u003c/strong\u003e，直接执行会报错：\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e.\\Anytype: The term \u0026#39;.\\Anytype\u0026#39; is not recognized...\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这是因为 PowerShell 会把空格当作参数分隔符，把文件名截断了。解决方法是用引号包住文件名，并在前面加调用运算符 \u003ccode\u003e\u0026amp;\u003c/code\u003e：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026amp; \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;.\\Anytype Setup 0.55.4.exe\u0026#34;\u003c/span\u003e /D=D:\\anytype\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e\u0026amp;\u003c/code\u003e 是 PowerShell 的调用运算符，专门用来执行路径中含空格的程序\u003c/li\u003e\n\u003cli\u003e引号只包文件名，\u003ccode\u003e/D=...\u003c/code\u003e 参数放在引号外面，保持原样\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e如果安装包正常弹出安装向导，安装完成后就会出现在 D 盘指定目录。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e这个方法不是百分百有效——部分安装包会忽略 \u003ccode\u003e/D\u003c/code\u003e 参数，强制装到 C 盘。遇到这种情况，用下面的方法。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"方法二安装后迁移\"\u003e方法二：安装后迁移\u003c/h2\u003e\n\u003cp\u003e先默认装完，再把程序整体搬到 D 盘。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e步骤：\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e按默认流程安装完成\u003c/li\u003e\n\u003cli\u003e确保程序已完全退出（任务管理器确认没有相关进程）\u003c/li\u003e\n\u003cli\u003e把安装目录整个文件夹\u003cstrong\u003e剪切\u003c/strong\u003e到 D 盘目标位置\u003c/li\u003e\n\u003cli\u003e右键桌面快捷方式 → 属性 → 修改\u003cstrong\u003e目标\u003c/strong\u003e路径指向新位置\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e大部分非系统级程序直接搬就能正常运行，不需要重装。\u003c/p\u003e","title":"Windows 安装包不让选路径？三招装到任意盘"},{"content":"Hermes Agent 是目前我用过最顺手的本地 Agent 之一，支持强大的工具调用和多模型切换。\n最近把它装到了 Windows 上，踩了不少坑，整理成这篇教程，方便大家少走弯路。\n一、安装 新开一个 PowerShell 窗口，指定安装目录，然后执行安装脚本：\n$env:HERMES_HOME = \u0026#34;D:\\AI\\Hermes\u0026#34; iex (irm https://ghproxy.com/https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.ps1) 推荐装到 D 盘，空间大、好管理。安装脚本走 ghproxy 镜像，国内直连不卡。\n安装过程会依次下载 Python 3.11、Node.js 22（便携版）、ripgrep、ffmpeg 以及 Hermes 本体，总下载量 500MB～800MB，网速正常的话 10～20 分钟完成。\n安装完成后，重开一个 PowerShell 窗口，验证是否成功：\nhermes --version 二、启动 推荐用 TUI 模式，界面好看很多：\nhermes --tui 进入后会看到配置向导，按提示走一遍。\n三、配置免费模型 免费模型有三个来源可以选，按优先级排：\n方案一：OpenRouter 输入 /model 回车 选择 OpenRouter 填入 API Key（去 https://openrouter.ai/keys 获取） 模型名称从下面选一个 模型 适合场景 openrouter/free 自动选最优免费模型，日常首选 qwen/qwen3-coder:free 写代码 deepseek/deepseek-r1:free 推理、逻辑题 注意：OpenRouter 的免费模型变动比较频繁，有些标了 :free 实际用起来会报错或报 403（大陆地区限制）。如果选了跑不起来，直接换方案二。\n方案二：Gemini API（推荐备选） Google 官方免费额度，不需要绑卡，模型质量高，Gemini 2.0 Flash 速度快、能力强。\n去这里申请 Key：https://aistudio.google.com/apikey\n登录 Google 账号，点 Create API key，复制保存。\n然后在 Hermes 里：\n输入 /model 回车 选择 Google 或 Gemini 填入 API Key 模型填 gemini-2.0-flash 方案三：Groq 同样免费，跑的是 Llama、Mixtral 等开源模型，响应速度极快，注册即用。\n去这里申请 Key：https://console.groq.com/keys\n配置方式和上面一样，Provider 选 Groq，模型选 llama-3.3-70b-versatile。\n四、常用命令 命令 作用 hermes --tui 启动 TUI 界面 /model 切换模型 hermes model 模型配置向导 hermes tools 管理工具 hermes setup 重新运行完整设置 五、几个建议 工具记得开。 进 hermes tools，把 browser、code_execution、file 打开，Agent 能力会强很多，不开等于浪费了一半功能。\n跑不起来先换方案。 OpenRouter 免费模型变动频繁，报错别死磕，直接换 Gemini 或 Groq，稳定多了。\n多试几个模型。 写代码用 qwen3-coder 或 Groq 的 Llama，推理用 deepseek-r1，找到最顺手的那个。\n目前 Hermes Agent 还属于早期版本，但工具调用和 Agent 能力已经很能打了，值得长期跟进。\n你装好了吗？欢迎在评论区聊聊你用的哪个模型效果最好，或者遇到了什么问题，我会持续补充这篇文章。\n","permalink":"/posts/%E7%94%A8-hermes-agent-%E5%85%8D%E8%B4%B9%E8%B7%91-aiopenrouter--gemini--groq-%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/","summary":"\u003cp\u003eHermes Agent 是目前我用过最顺手的本地 Agent 之一，支持强大的工具调用和多模型切换。\u003c/p\u003e\n\u003cp\u003e最近把它装到了 Windows 上，踩了不少坑，整理成这篇教程，方便大家少走弯路。\u003c/p\u003e\n\u003ch2 id=\"一安装\"\u003e一、安装\u003c/h2\u003e\n\u003cp\u003e新开一个 PowerShell 窗口，指定安装目录，然后执行安装脚本：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$env:HERMES_HOME = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;D:\\AI\\Hermes\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiex (irm https\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e:\u003c/span\u003e//ghproxy.com/https\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e:\u003c/span\u003e//raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.ps1)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e推荐装到 D 盘，空间大、好管理。安装脚本走 ghproxy 镜像，国内直连不卡。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e安装过程会依次下载 Python 3.11、Node.js 22（便携版）、ripgrep、ffmpeg 以及 Hermes 本体，总下载量 500MB～800MB，网速正常的话 10～20 分钟完成。\u003c/p\u003e\n\u003cp\u003e安装完成后，重开一个 PowerShell 窗口，验证是否成功：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehermes --version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"二启动\"\u003e二、启动\u003c/h2\u003e\n\u003cp\u003e推荐用 TUI 模式，界面好看很多：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehermes --tui\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e进入后会看到配置向导，按提示走一遍。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"三配置免费模型\"\u003e三、配置免费模型\u003c/h2\u003e\n\u003cp\u003e免费模型有三个来源可以选，按优先级排：\u003c/p\u003e\n\u003ch3 id=\"方案一openrouter\"\u003e方案一：OpenRouter\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e输入 \u003ccode\u003e/model\u003c/code\u003e 回车\u003c/li\u003e\n\u003cli\u003e选择 \u003cstrong\u003eOpenRouter\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e填入 API Key（去 \u003ca href=\"https://openrouter.ai/keys\"\u003ehttps://openrouter.ai/keys\u003c/a\u003e 获取）\u003c/li\u003e\n\u003cli\u003e模型名称从下面选一个\u003c/li\u003e\n\u003c/ol\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e模型\u003c/th\u003e\n          \u003cth\u003e适合场景\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eopenrouter/free\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e自动选最优免费模型，日常首选\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eqwen/qwen3-coder:free\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e写代码\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003edeepseek/deepseek-r1:free\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e推理、逻辑题\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cblockquote\u003e\n\u003cp\u003e注意：OpenRouter 的免费模型变动比较频繁，有些标了 \u003ccode\u003e:free\u003c/code\u003e 实际用起来会报错或报 403（大陆地区限制）。如果选了跑不起来，直接换方案二。\u003c/p\u003e","title":"用 Hermes Agent 免费跑 AI：OpenRouter / Gemini / Groq 配置指南"},{"content":"默认终端能用，但不好看。一个美化过的终端不只是颜值问题——清晰的提示符显示 Git 分支、语法高亮实时报错、历史命令自动补全，都能减少实际操作失误。\n本文覆盖 Windows 和 macOS，选你的系统跟着做就行。\n一、安装终端 Windows：使用 Windows Terminal Windows 11 已预装 Windows Terminal，在开始菜单搜索 Terminal 即可找到。\nWindows 10 若没有，可以在微软商店搜索 Windows Terminal 安装。\n后续所有操作都在 Windows Terminal 里进行，不要用旧的 cmd。\nmacOS：使用自带 Terminal 或安装 iTerm2 系统自带的 Terminal 可以直接用。想要更多功能（分屏、多标签、更好的配色支持），可以装 iTerm2：\n👉 https://iterm2.com/\n下载 .zip 解压，把 iTerm2.app 拖进 应用程序 文件夹即可。\n二、Windows：升级 PowerShell Windows 自带的 PowerShell 版本较旧（5.x），建议升级到最新版（7.x），速度更快，功能更完整。\n在 Windows Terminal 里执行：\nwinget install Microsoft.PowerShell 安装完后，打开 Windows Terminal 设置 → 启动 → 默认配置文件，切换为 PowerShell（不是\u0026quot;Windows PowerShell\u0026quot;，注意区分）。\n验证版本：\n$PSVersionTable.PSVersion 显示 7.x 即为新版。\n三、Windows：安装 Oh My Posh（可选） Oh My Posh 是 Windows 上最主流的终端美化框架，可以为提示符添加 Git 状态、时间、内存占用等信息。不需要的话跳过这节，直接看字体安装。\n安装 直接去 GitHub 下载 exe 文件：\n👉 https://github.com/JanDeDobbeleer/oh-my-posh/releases/latest\n找 install-amd64.exe 下载。\nAMD64 是 64 位 x86 架构的通用叫法，Intel 和 AMD 处理器都适用，和品牌无关。不确定的话在终端执行 echo $env:PROCESSOR_ARCHITECTURE，输出 AMD64 就下 amd64，输出 ARM64 就下 arm64。\n下载后不要双击，在终端里执行以下命令，把它移到固定位置并加入 PATH：\nNew-Item -ItemType Directory -Force -Path \u0026#34;C:\\tools\u0026#34; Copy-Item \u0026#34;$env:USERPROFILE\\Downloads\\install-amd64.exe\u0026#34; \u0026#34;C:\\tools\\oh-my-posh.exe\u0026#34; $oldPath = [Environment]::GetEnvironmentVariable(\u0026#34;PATH\u0026#34;, \u0026#34;User\u0026#34;) [Environment]::SetEnvironmentVariable(\u0026#34;PATH\u0026#34;, \u0026#34;C:\\tools;\u0026#34; + $oldPath, \u0026#34;User\u0026#34;) 重启终端，验证：\nwhere.exe oh-my-posh oh-my-posh version 输出路径为 C:\\tools\\oh-my-posh.exe 且有版本号即为成功。\n配置启动文件 编辑 PowerShell 的配置文件：\nnotepad $PROFILE 如果提示文件不存在，先创建：\nNew-Item -Path $PROFILE -ItemType File -Force 再执行 notepad $PROFILE 打开，加入这一行：\noh-my-posh init pwsh --config \u0026#34;https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/tokyo.omp.json\u0026#34; | Invoke-Expression 保存，重启终端，提示符立刻变化。\n主题直接从 GitHub 远程加载。如果启动速度变慢，可以把主题文件下载到本地再加载：\nInvoke-WebRequest \u0026#34;https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/tokyo.omp.json\u0026#34; -OutFile \u0026#34;$env:USERPROFILE\\.oh-my-posh-theme.json\u0026#34; 然后把 $PROFILE 里的 URL 换成 \u0026quot;$env:USERPROFILE\\.oh-my-posh-theme.json\u0026quot;。\n切换主题 去官网选主题，有截图预览： 👉 https://ohmyposh.dev/docs/themes\n几个值得试的：\n主题名 风格 tokyo 深蓝紫，简洁 catppuccin 暖色调，柔和 agnoster 经典箭头风格 pure 极简，干净 执行以下命令打开配置文件：\nnotepad $PROFILE 把 URL 里的 tokyo 换成主题名，保存重启生效。\n取消使用 Oh My Posh 不想用了，打开配置文件：\nnotepad $PROFILE 把 oh-my-posh 那行注释掉或直接删除：\n# oh-my-posh init pwsh --config \u0026#34;...\u0026#34; | Invoke-Expression 保存，重启终端，恢复默认提示符。如果想彻底删除，把 C:\\tools\\oh-my-posh.exe 删掉，再从用户 PATH 里移除 C:\\tools 即可。\n四、安装 Nerd Font 字体 终端主题依赖图标字体，不装会显示乱码方块。\nWindows：手动下载安装 Oh My Posh 提供了终端内安装字体的命令，但国内访问 GitHub 经常超时。直接手动下载更稳：\n👉 https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/JetBrainsMono.zip\n下载完解压，全选 .ttf 文件 → 右键 → 为所有用户安装。\nmacOS：用 Homebrew 安装 brew install --cask font-jetbrains-mono-nerd-font 如果还没装 Homebrew，先执行：\n/bin/bash -c \u0026#34;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\u0026#34; 在终端里启用字体 字体装好后，在终端设置里切换：\n终端 设置路径 Windows Terminal 设置 → 配置文件 → PowerShell → 外观 → 字体 iTerm2 Preferences → Profiles → Text → Font VS Code 内置终端 settings.json → terminal.integrated.fontFamily 统一填入 JetBrainsMono Nerd Font，保存重启，图标显示正常。\n五、macOS：Oh My Zsh + Starship 安装 Oh My Zsh macOS 默认已经是 Zsh，不需要额外安装 Shell。直接执行：\nsh -c \u0026#34;$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)\u0026#34; 安装完会自动生成 ~/.zshrc 配置文件，终端重启后生效。\n安装两个必备插件 语法高亮（命令打错立刻变红）：\ngit clone https://github.com/zsh-users/zsh-syntax-highlighting.git \\ ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting 自动补全（灰色提示历史命令，按 → 接受）：\ngit clone https://github.com/zsh-users/zsh-autosuggestions \\ ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions 打开 ~/.zshrc，找到 plugins= 这行，改成：\nplugins=(git zsh-syntax-highlighting zsh-autosuggestions) 保存，执行：\nsource ~/.zshrc 安装 Starship 提示符 Oh My Zsh 自带主题，但 Starship 更快、信息更丰富，会自动显示 Git 分支、命令执行耗时、语言版本等。\ncurl -sS https://starship.rs/install.sh | sh 在 ~/.zshrc 末尾加一行：\neval \u0026#34;$(starship init zsh)\u0026#34; 再次执行 source ~/.zshrc，提示符立刻变了。\n六、配色方案 提示符改好之后，终端的背景和文字颜色也值得换一换。这些配色方案系统默认没有，需要手动导入。\n几个经典配色：\n配色方案 风格 适合 Tokyo Night 深蓝紫，对比柔和 长时间写代码 Catppuccin Mocha 暖棕，配色协调 喜欢暖色调 Dracula 高对比，颜色鲜明 白天光线强 One Dark 经典，VS Code 同款 和编辑器保持一致 Windows Terminal 去这个网站挑选，找到喜欢的点 Get theme，会复制一段 JSON：\n👉 https://windowsterminalthemes.dev/\n然后打开 Windows Terminal 的 settings.json：\n设置 → 左下角点「打开 JSON 文件」 找到 \u0026quot;schemes\u0026quot;: [ 这一行，把复制的 JSON 粘贴进数组里，保存。\n最后在设置里启用：\n设置 → 配置文件 → PowerShell → 外观 → 配色方案 下拉选择刚导入的名字即可。\niTerm2 在 Preferences → Profiles → Colors → Color Presets → Import 导入 .itermcolors 文件。\n各配色方案的 .itermcolors 文件可以在对应 GitHub 仓库找到，比如 Dracula： 👉 https://draculatheme.com/iterm\n七、可选：背景透明效果 不喜欢纯色背景，可以开启透明效果。\nWindows Terminal，在设置里直接调：\n设置 → 配置文件 → PowerShell → 外观 → Transparency → Background opacity 拖到 85% - 95% iTerm2 在 Preferences → Profiles → Window → Transparency 拖动滑块，勾选 Blur 开启模糊。\n透明度不建议调太高，字看不清反而影响使用。\n小结 Windows macOS 终端 Windows Terminal iTerm2 / 自带 Terminal Shell PowerShell 7 Zsh（系统自带） 美化框架 Oh My Posh Oh My Zsh + Starship 语法高亮 框架内置 zsh-syntax-highlighting 自动补全 框架内置 zsh-autosuggestions 字体 JetBrainsMono Nerd Font 同左 整个流程大概 20 分钟，配好之后基本不需要再动。 下次打开终端，至少不会再盯着一个黑框发呆了。\n","permalink":"/posts/%E7%BE%8E%E5%8C%96%E4%BD%A0%E7%9A%84%E7%BB%88%E7%AB%AF%E5%AD%97%E4%BD%93%E4%B8%BB%E9%A2%98%E6%8F%90%E7%A4%BA%E7%AC%A6%E4%B8%80%E6%AC%A1%E6%90%9E%E5%AE%9A/","summary":"\u003cp\u003e默认终端能用，但不好看。一个美化过的终端不只是颜值问题——清晰的提示符显示 Git 分支、语法高亮实时报错、历史命令自动补全，都能减少实际操作失误。\u003c/p\u003e\n\u003cp\u003e本文覆盖 Windows 和 macOS，选你的系统跟着做就行。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"一安装终端\"\u003e一、安装终端\u003c/h2\u003e\n\u003ch3 id=\"windows使用-windows-terminal\"\u003eWindows：使用 Windows Terminal\u003c/h3\u003e\n\u003cp\u003eWindows 11 已预装 Windows Terminal，在开始菜单搜索 \u003ccode\u003eTerminal\u003c/code\u003e 即可找到。\u003c/p\u003e\n\u003cp\u003eWindows 10 若没有，可以在微软商店搜索 \u003ccode\u003eWindows Terminal\u003c/code\u003e 安装。\u003c/p\u003e\n\u003cp\u003e后续所有操作都在 Windows Terminal 里进行，不要用旧的 \u003ccode\u003ecmd\u003c/code\u003e。\u003c/p\u003e\n\u003ch3 id=\"macos使用自带-terminal-或安装-iterm2\"\u003emacOS：使用自带 Terminal 或安装 iTerm2\u003c/h3\u003e\n\u003cp\u003e系统自带的 Terminal 可以直接用。想要更多功能（分屏、多标签、更好的配色支持），可以装 iTerm2：\u003c/p\u003e\n\u003cp\u003e👉 \u003ca href=\"https://iterm2.com/\"\u003ehttps://iterm2.com/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下载 \u003ccode\u003e.zip\u003c/code\u003e 解压，把 \u003ccode\u003eiTerm2.app\u003c/code\u003e 拖进 \u003ccode\u003e应用程序\u003c/code\u003e 文件夹即可。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"二windows升级-powershell\"\u003e二、Windows：升级 PowerShell\u003c/h2\u003e\n\u003cp\u003eWindows 自带的 PowerShell 版本较旧（5.x），建议升级到最新版（7.x），速度更快，功能更完整。\u003c/p\u003e\n\u003cp\u003e在 Windows Terminal 里执行：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewinget install Microsoft.PowerShell\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e安装完后，打开 Windows Terminal 设置 → 启动 → 默认配置文件，切换为 \u003cstrong\u003ePowerShell\u003c/strong\u003e（不是\u0026quot;Windows PowerShell\u0026quot;，注意区分）。\u003c/p\u003e\n\u003cp\u003e验证版本：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$PSVersionTable.PSVersion\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e显示 \u003ccode\u003e7.x\u003c/code\u003e 即为新版。\u003c/p\u003e","title":"美化你的终端：字体、主题、提示符一次搞定"},{"content":"每次用 Git 都要输一堆命令？git add .、git commit -m、git push…… Lazygit 把这些操作变成可视化界面，全程键盘操作，直观又高效。\n什么是 Lazygit Lazygit 是一个运行在终端里的 Git 可视化工具，开源免费。 界面分为几个区域，左边显示文件改动、分支、提交历史，右边预览具体内容。\n核心优势：\n不用记 Git 命令，按键提示全在底部 提交前能清楚看到每个文件改了哪几行 回滚历史版本只需几个按键 比 Git 命令行快很多 安装 去 GitHub 下载最新版：\nhttps://github.com/jesseduffield/lazygit/releases/latest Windows 下载 lazygit_x.x.x_windows_x86_64.zip，解压后把 lazygit.exe 放到一个固定目录，比如 C:\\tools\\。\n然后把这个目录加入系统环境变量 PATH：\n英文系统：\nWin + S 搜索 Environment Variables 点 Edit the system environment variables 右下角点 Environment Variables 上半部分 User variables 找到 Path → Edit → New 填入 C:\\tools，确定保存 重启终端 中文系统：\nWin + S 搜索 环境变量 点 编辑系统环境变量 右下角点 环境变量 上半部分 用户变量 找到 Path → 编辑 → 新建 填入 C:\\tools，确定保存 重启终端 之后在终端输入 lazygit 就能直接启动。\n打开方式 每次使用前，先在终端进入你的项目目录：\ncd D:\\code\\myblog lazygit 界面说明 打开后界面分为五个区域：\n[1] Status — 当前仓库状态 [2] Files — 改动的文件列表 [3] Branches — 本地和远程分支 [4] Commits — 提交历史 [5] Stash — 临时储藏区 按数字键 1~5 快速切换到对应区域，按 Tab 在区域间循环切换。\n日常推送流程 第一步：查看改动文件 打开 Lazygit 后，左边第 2 栏 Files 会显示所有改动的文件：\n红色 ?? — 新文件，还没被 Git 追踪 红色 M — 已有文件被修改 绿色 — 已暂存，准备提交 第二步：暂存文件 a 暂存全部文件 空格 暂存光标所在的单个文件 暂存后文件变成绿色。\n第三步：写提交信息并提交 c 打开提交信息输入框 输入本次改动的描述，比如 add bookmark page，回车确认提交。\n第四步：推送到 GitHub P（大写） 推送到远程仓库 推送成功后底部会显示确认信息。\n常用快捷键 按键 功能 a 暂存全部文件 空格 暂存/取消暂存单个文件 c 提交（写提交信息） P 推送到远程 p 从远程拉取最新代码 z 撤销上一步操作 q 退出 Lazygit ? 查看当前区域所有快捷键 ←→ 切换左右面板 ↑↓ 在列表中移动 查看提交历史和回滚 按数字键 4 进入 Commits 区域，可以看到所有历史提交记录。\n找到想回滚的那条提交，按 g 可以选择回滚方式：\nSoft reset — 回到那个版本，但保留文件改动 Hard reset — 完全回到那个版本，丢弃之后的所有改动 注意：Hard reset 不可逆，操作前确认清楚。\n拉取最新代码 在多台电脑协作时，开始工作前先拉取：\np（小写） 拉取远程最新代码 等同于命令行的 git pull。\n小结 Lazygit 的学习成本极低，记住这五个按键就能覆盖 90% 的日常操作：\na → c → P 暂存 → 提交 → 推送 配合 Zed 编辑器使用，改代码用 Zed，管理 Git 用 Lazygit， 整个博客更新流程既直观又高效。\n","permalink":"/posts/lazygit-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%E5%91%8A%E5%88%AB%E5%A4%8D%E6%9D%82%E7%9A%84-git-%E5%91%BD%E4%BB%A4/","summary":"\u003cp\u003e每次用 Git 都要输一堆命令？\u003ccode\u003egit add .\u003c/code\u003e、\u003ccode\u003egit commit -m\u003c/code\u003e、\u003ccode\u003egit push\u003c/code\u003e……\nLazygit 把这些操作变成可视化界面，全程键盘操作，直观又高效。\u003c/p\u003e\n\u003ch2 id=\"什么是-lazygit\"\u003e什么是 Lazygit\u003c/h2\u003e\n\u003cp\u003eLazygit 是一个运行在终端里的 Git 可视化工具，开源免费。\n界面分为几个区域，左边显示文件改动、分支、提交历史，右边预览具体内容。\u003c/p\u003e\n\u003cp\u003e核心优势：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e不用记 Git 命令，按键提示全在底部\u003c/li\u003e\n\u003cli\u003e提交前能清楚看到每个文件改了哪几行\u003c/li\u003e\n\u003cli\u003e回滚历史版本只需几个按键\u003c/li\u003e\n\u003cli\u003e比 Git 命令行快很多\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"安装\"\u003e安装\u003c/h2\u003e\n\u003cp\u003e去 GitHub 下载最新版：\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ehttps://github.com/jesseduffield/lazygit/releases/latest\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWindows 下载 \u003ccode\u003elazygit_x.x.x_windows_x86_64.zip\u003c/code\u003e，解压后把 \u003ccode\u003elazygit.exe\u003c/code\u003e 放到一个固定目录，比如 \u003ccode\u003eC:\\tools\\\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e然后把这个目录加入系统环境变量 PATH：\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e英文系统：\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003eWin + S\u003c/code\u003e 搜索 \u003cstrong\u003eEnvironment Variables\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e点 \u003cstrong\u003eEdit the system environment variables\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e右下角点 \u003cstrong\u003eEnvironment Variables\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e上半部分 \u003cstrong\u003eUser variables\u003c/strong\u003e 找到 \u003cstrong\u003ePath\u003c/strong\u003e → Edit → New\u003c/li\u003e\n\u003cli\u003e填入 \u003ccode\u003eC:\\tools\u003c/code\u003e，确定保存\u003c/li\u003e\n\u003cli\u003e重启终端\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e中文系统：\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003eWin + S\u003c/code\u003e 搜索 \u003cstrong\u003e环境变量\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e点 \u003cstrong\u003e编辑系统环境变量\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e右下角点 \u003cstrong\u003e环境变量\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e上半部分 \u003cstrong\u003e用户变量\u003c/strong\u003e 找到 \u003cstrong\u003ePath\u003c/strong\u003e → 编辑 → 新建\u003c/li\u003e\n\u003cli\u003e填入 \u003ccode\u003eC:\\tools\u003c/code\u003e，确定保存\u003c/li\u003e\n\u003cli\u003e重启终端\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e之后在终端输入 \u003ccode\u003elazygit\u003c/code\u003e 就能直接启动。\u003c/p\u003e","title":"Lazygit 使用指南：告别复杂的 Git 命令"},{"content":"在用 GitHub + Cloudflare Pages 管理博客时，经常需要在不同电脑上切换开发。 本文整理了多设备协作的完整工作流，以及如何控制 Cloudflare 自动部署。\n一、换了新电脑，如何拿到代码 每次在新电脑上第一次工作，需要把仓库克隆到本地：\ngit clone https://github.com/你的用户名/myblog.git cd myblog npm install 三行命令搞定——代码拉下来，依赖自动安装，直接可以开发。\nnpm install 会根据 package.json 重新下载所有依赖包，和原来完全一致， 所以 node_modules/ 不需要上传到 GitHub，换电脑也不影响。\n二、每次开始和结束工作的习惯 开始工作前，先同步最新代码：\ngit pull 把另一台电脑推上去的改动拉下来，保持两台电脑代码一致。\n工作结束后，推送到 GitHub：\ngit add . git commit -m \u0026#34;描述这次改了什么\u0026#34; git push 核心习惯：每次开始先 pull，每次结束后 push。 养成这个习惯，多台电脑之间永远不会出现代码冲突。\n三、如何控制 Cloudflare Pages 自动部署 默认情况下每次 push 都会触发 Cloudflare 构建，免费版每月 500 次。 频繁调试时容易浪费额度，有两种方式控制。\n方法一：commit 信息加 [skip ci] git commit -m \u0026#34;调整样式 [skip ci]\u0026#34; Cloudflare 识别到这个关键词会自动跳过本次构建，灵活控制每次 push 是否部署。\n方法二：关闭自动部署 进入 Cloudflare Pages 后台：\nSettings → Builds \u0026amp; deployments → Branch control 把 Production branch 的自动部署关掉，之后所有 push 都不触发构建， 需要发布时手动去 Deployments → Create deployment 触发。\n推荐方式： 两种方法结合——平时调试用 [skip ci] 跳过， 确认要上线的 commit 正常写，让自动部署触发。\n四、没有部署时如何本地预览 方法一：hugo server（最常用） hugo server 打开 http://localhost:1313 实时预览，改动文件后页面自动刷新， 不需要构建也不需要部署，是最快的开发方式。\n方法二：Cloudflare 预览链接 每次 push 到 GitHub，Cloudflare Pages 会生成一个独立的预览链接：\nhttps://[commit-hash].shaifx.pages.dev 不影响正式域名，专门用来预览测试。\n五、完整工作流总结 换新电脑？先运行：\ngit clone https://github.com/你的用户名/myblog.git cd myblog npm install 每天开始工作：\ngit pull # 同步最新代码 hugo server # 本地预览 改完代码，还在调试：\ngit add . \u0026amp;\u0026amp; git commit -m \u0026#34;xxx [skip ci]\u0026#34; \u0026amp;\u0026amp; git push 改完代码，准备上线：\ngit add . \u0026amp;\u0026amp; git commit -m \u0026#34;xxx\u0026#34; \u0026amp;\u0026amp; git push 本地预览速度最快，改完立刻看到结果。 确认没问题再正式 push，既节省构建次数，也避免把半成品推到线上。\n","permalink":"/posts/%E5%A4%9A%E5%8F%B0%E7%94%B5%E8%84%91%E5%8D%8F%E4%BD%9C%E5%BC%80%E5%8F%91github-%E5%90%8C%E6%AD%A5%E5%B7%A5%E4%BD%9C%E6%B5%81%E6%8C%87%E5%8D%97/","summary":"\u003cp\u003e在用 GitHub + Cloudflare Pages 管理博客时，经常需要在不同电脑上切换开发。\n本文整理了多设备协作的完整工作流，以及如何控制 Cloudflare 自动部署。\u003c/p\u003e\n\u003ch2 id=\"一换了新电脑如何拿到代码\"\u003e一、换了新电脑，如何拿到代码\u003c/h2\u003e\n\u003cp\u003e每次在新电脑上第一次工作，需要把仓库克隆到本地：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit clone https://github.com/你的用户名/myblog.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd myblog\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enpm install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e三行命令搞定——代码拉下来，依赖自动安装，直接可以开发。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003enpm install\u003c/code\u003e 会根据 \u003ccode\u003epackage.json\u003c/code\u003e 重新下载所有依赖包，和原来完全一致，\n所以 \u003ccode\u003enode_modules/\u003c/code\u003e 不需要上传到 GitHub，换电脑也不影响。\u003c/p\u003e\n\u003ch2 id=\"二每次开始和结束工作的习惯\"\u003e二、每次开始和结束工作的习惯\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e开始工作前，先同步最新代码：\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit pull\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e把另一台电脑推上去的改动拉下来，保持两台电脑代码一致。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e工作结束后，推送到 GitHub：\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit add .\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit commit -m \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;描述这次改了什么\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit push\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e核心习惯：\u003cstrong\u003e每次开始先 pull，每次结束后 push。\u003c/strong\u003e\n养成这个习惯，多台电脑之间永远不会出现代码冲突。\u003c/p\u003e\n\u003ch2 id=\"三如何控制-cloudflare-pages-自动部署\"\u003e三、如何控制 Cloudflare Pages 自动部署\u003c/h2\u003e\n\u003cp\u003e默认情况下每次 push 都会触发 Cloudflare 构建，免费版每月 500 次。\n频繁调试时容易浪费额度，有两种方式控制。\u003c/p\u003e\n\u003ch3 id=\"方法一commit-信息加-skip-ci\"\u003e方法一：commit 信息加 [skip ci]\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit commit -m \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;调整样式 [skip ci]\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCloudflare 识别到这个关键词会自动跳过本次构建，灵活控制每次 push 是否部署。\u003c/p\u003e","title":"多台电脑协作开发：GitHub 同步工作流指南"},{"content":" 基于 GitHub Discussions 的免费评论系统，数据在自己手里，零成本接入 Hugo PaperMod。\n为什么选 Giscus 给静态博客加评论的方案不少，常见的有 Disqus、Valine、Waline、Giscus 等。\nGiscus 的优势：\n免费：完全免费，无广告 数据自托管：评论存在你自己的 GitHub 仓库 Discussions 里，不依赖第三方服务器 无需单独注册：访客用 GitHub 账号登录即可留言 隐私友好：不追踪用户，不植入 Cookie PaperMod 原生支持：无需改模板，配置几行 toml 即可 唯一限制：访客需要有 GitHub 账号才能评论，适合技术类博客。\n一、开启仓库 Discussions 打开你的博客仓库 https://github.com/你的用户名/myblog，进入：\nSettings → 向下找到 Features → 勾选 Discussions\n保存后仓库顶部导航栏会出现 Discussions 标签。\n二、安装 Giscus App 访问 👉 https://github.com/apps/giscus\n点 Install → 选择 Only select repositories → 选你的博客仓库 → 确认安装。\n三、获取配置参数 访问 👉 https://giscus.app/zh-CN\n按如下填写：\n选项 填写内容 仓库 你的用户名/myblog Discussion 分类 Announcements 页面 ↔ Discussion 映射 pathname 主题 preferred_color_scheme（跟随系统深浅色） 语言 zh-CN 填完后页面底部会自动生成一段 \u0026lt;script\u0026gt; 代码，其中有两个关键值：\ndata-repo-id=\u0026#34;R_xxxxxxxxxx\u0026#34; data-category-id=\u0026#34;DIC_xxxxxxxxxx\u0026#34; 把这两个值复制记下来，下一步要用。\n四、修改 hugo.toml 打开博客根目录的 hugo.toml，在 [params] 里加入以下内容：\ncomments = true [params.giscus] repo = \u0026#34;你的用户名/myblog\u0026#34; repoId = \u0026#34;R_xxxxxxxxxx\u0026#34; # 替换为你的 data-repo-id category = \u0026#34;Announcements\u0026#34; categoryId = \u0026#34;DIC_xxxxxxxxxx\u0026#34; # 替换为你的 data-category-id mapping = \u0026#34;pathname\u0026#34; strict = \u0026#34;0\u0026#34; reactionsEnabled = \u0026#34;1\u0026#34; emitMetadata = \u0026#34;0\u0026#34; inputPosition = \u0026#34;bottom\u0026#34; theme = \u0026#34;preferred_color_scheme\u0026#34; lang = \u0026#34;zh-CN\u0026#34; 完整的 [params] 区域示例：\n[params] homeInfoParams = {Title = \u0026#34;0xSHAI 👋\u0026#34;, Content = \u0026#34;探索 Web 与系统的边界\u0026#34;} defaultTheme = \u0026#34;auto\u0026#34; ShowReadingTime = true ShowPostNavLinks = true ShowBreadCrumbs = true ShowCodeCopyButtons = true ShowToc = true TocOpen = false comments = true # 新增这一行 [params.giscus] # 新增这整个块 repo = \u0026#34;你的用户名/myblog\u0026#34; repoId = \u0026#34;R_xxxxxxxxxx\u0026#34; category = \u0026#34;Announcements\u0026#34; categoryId = \u0026#34;DIC_xxxxxxxxxx\u0026#34; mapping = \u0026#34;pathname\u0026#34; strict = \u0026#34;0\u0026#34; reactionsEnabled = \u0026#34;1\u0026#34; emitMetadata = \u0026#34;0\u0026#34; inputPosition = \u0026#34;bottom\u0026#34; theme = \u0026#34;preferred_color_scheme\u0026#34; lang = \u0026#34;zh-CN\u0026#34; 五、推送部署 cd D:\\shai\\blog git add . git commit -m \u0026#34;add giscus comments\u0026#34; git push Cloudflare Pages 检测到推送后会自动重新构建，几分钟内生效。\n验证 部署完成后打开任意一篇文章，滚动到底部，应该能看到评论区加载出来。\n首次有人评论时，GitHub 仓库的 Discussions 里会自动创建对应的条目，后续所有评论都会存在那里，在仓库 Discussions 标签下可以直接管理。\n注意事项 本地 hugo server 预览时评论区会正常显示，但登录功能需要真实域名才能完成 OAuth 授权 repoId 和 categoryId 必须从 giscus.app 生成，不能手动填写 如果评论区不出现，检查 comments = true 是否写在 [params] 内部，而不是其他位置 ","permalink":"/posts/%E4%B8%BA%E5%8D%9A%E5%AE%A2%E6%B7%BB%E5%8A%A0%E8%AF%84%E8%AE%BA%E5%8C%BA-giscus/","summary":"\u003cblockquote\u003e\n\u003cp\u003e基于 GitHub Discussions 的免费评论系统，数据在自己手里，零成本接入 Hugo PaperMod。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"为什么选-giscus\"\u003e为什么选 Giscus\u003c/h2\u003e\n\u003cp\u003e给静态博客加评论的方案不少，常见的有 Disqus、Valine、Waline、Giscus 等。\u003c/p\u003e\n\u003cp\u003eGiscus 的优势：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e免费\u003c/strong\u003e：完全免费，无广告\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e数据自托管\u003c/strong\u003e：评论存在你自己的 GitHub 仓库 Discussions 里，不依赖第三方服务器\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e无需单独注册\u003c/strong\u003e：访客用 GitHub 账号登录即可留言\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e隐私友好\u003c/strong\u003e：不追踪用户，不植入 Cookie\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePaperMod 原生支持\u003c/strong\u003e：无需改模板，配置几行 toml 即可\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e唯一限制：访客需要有 GitHub 账号才能评论，适合技术类博客。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"一开启仓库-discussions\"\u003e一、开启仓库 Discussions\u003c/h2\u003e\n\u003cp\u003e打开你的博客仓库 \u003ccode\u003ehttps://github.com/你的用户名/myblog\u003c/code\u003e，进入：\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSettings\u003c/strong\u003e → 向下找到 \u003cstrong\u003eFeatures\u003c/strong\u003e → 勾选 \u003cstrong\u003eDiscussions\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e保存后仓库顶部导航栏会出现 \u003cstrong\u003eDiscussions\u003c/strong\u003e 标签。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"二安装-giscus-app\"\u003e二、安装 Giscus App\u003c/h2\u003e\n\u003cp\u003e访问 👉 \u003ca href=\"https://github.com/apps/giscus\"\u003ehttps://github.com/apps/giscus\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e点 \u003cstrong\u003eInstall\u003c/strong\u003e → 选择 \u003cstrong\u003eOnly select repositories\u003c/strong\u003e → 选你的博客仓库 → 确认安装。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"三获取配置参数\"\u003e三、获取配置参数\u003c/h2\u003e\n\u003cp\u003e访问 👉 \u003ca href=\"https://giscus.app/zh-CN\"\u003ehttps://giscus.app/zh-CN\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e按如下填写：\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e选项\u003c/th\u003e\n          \u003cth\u003e填写内容\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e仓库\u003c/td\u003e\n          \u003ctd\u003e\u003ccode\u003e你的用户名/myblog\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eDiscussion 分类\u003c/td\u003e\n          \u003ctd\u003e\u003ccode\u003eAnnouncements\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e页面 ↔ Discussion 映射\u003c/td\u003e\n          \u003ctd\u003e\u003ccode\u003epathname\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e主题\u003c/td\u003e\n          \u003ctd\u003e\u003ccode\u003epreferred_color_scheme\u003c/code\u003e（跟随系统深浅色）\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e语言\u003c/td\u003e\n          \u003ctd\u003e\u003ccode\u003ezh-CN\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e填完后页面底部会自动生成一段 \u003ccode\u003e\u0026lt;script\u0026gt;\u003c/code\u003e 代码，其中有两个关键值：\u003c/p\u003e","title":"为博客添加评论区：Giscus"},{"content":" 一套给自己看，一套给访客看。用 Umami + 不蒜子为博客添加完整的访问统计。\n工具介绍 Umami Umami 是一款开源的网站统计工具，定位是 Google Analytics 的隐私友好替代品。\n开源：代码完全公开，可自部署 隐私友好：不使用 Cookie，不追踪个人信息，符合 GDPR 数据详细：访客来源、设备类型、浏览器、停留时长、实时在线人数 免费版：Umami Cloud 每月 10 万次页面浏览，个人博客完全够用 数据归属：显示在后台，只有博主自己能看 适合用来了解博客的真实流量情况。\n不蒜子 不蒜子 是一个极简的页面计数器，由国内开发者维护。\n接入极简：两行代码搞定 免费无限制：没有用量上限 双维度统计：网站总访问量 + 单篇文章浏览量 数据公开：数字直接显示在博客页面上，访客可见 缺点：不开源，数据存在作者服务器，部分广告拦截插件（如 Brave）会屏蔽 适合在博客页面直接展示浏览数字。\n两者的区别 Umami 不蒜子 数据可见性 仅博主后台 页面公开显示 统计维度 详细（来源、设备等） 仅浏览次数 隐私 极佳 一般 接入难度 中 极简 开源 ✅ ❌ 两者互补，同时使用效果最好。\n一、接入 Umami Cloud 1. 注册账号 打开 umami.is，点 Sign up 注册，选择数据存储地区（推荐 United States）。\n2. 添加网站 登录后进入 Settings → Websites → Add website：\nName：填博客名称 Domain：填你的域名（如 shaifx.pages.dev，不加 https:// 和末尾 /） 3. 获取追踪代码 添加完成后点 Edit → Tracking code，复制类似这样的代码：\n\u0026lt;script defer src=\u0026#34;https://cloud.umami.is/script.js\u0026#34; data-website-id=\u0026#34;你的ID\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 4. 注入博客 在 layouts/_partials/ 目录下新建 extend_head.html（PaperMod 专用扩展钩子，不会覆盖主题文件）：\n\u0026lt;script defer src=\u0026#34;https://cloud.umami.is/script.js\u0026#34; data-website-id=\u0026#34;你的ID\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 部署后登录 Umami 后台即可查看实时数据。\n二、接入不蒜子 1. 加载脚本 在 layouts/_partials/extend_head.html 里追加一行：\n\u0026lt;script async src=\u0026#34;//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 2. 显示网站总访问量 在 layouts/_partials/extend_footer.html 里加入：\n\u0026lt;div style=\u0026#34;text-align:center; padding: 10px; font-size: 0.85em; opacity: 0.6;\u0026#34;\u0026gt; 本站累计访问 \u0026lt;span id=\u0026#34;busuanzi_value_site_pv\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; 次 · 访客 \u0026lt;span id=\u0026#34;busuanzi_value_site_uv\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; 人 \u0026lt;/div\u0026gt; 3. 显示单篇文章浏览量 先把主题模板复制到自己的目录（以 PaperMod 新版为例）：\ncp themes\\PaperMod\\layouts\\single.html layouts\\_default\\single.html 然后找到显示阅读时间的位置，加入：\n· 浏览 \u0026lt;span id=\u0026#34;busuanzi_value_page_pv\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; 次 三、推送部署 git add . git commit -m \u0026#34;添加 Umami + 不蒜子统计\u0026#34; git push 注意事项 本地 hugo server 预览时不蒜子数字显示异常，属正常现象，部署到线上才准确 Brave 等浏览器内置拦截器会屏蔽不蒜子脚本，导致数字不显示，不影响其他普通访客 Umami 的统计数据在后台查看，不蒜子的数字直接显示在页面上，两套数据不互通 ","permalink":"/posts/umami-busuanzi-analytics/","summary":"\u003cblockquote\u003e\n\u003cp\u003e一套给自己看，一套给访客看。用 Umami + 不蒜子为博客添加完整的访问统计。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"工具介绍\"\u003e工具介绍\u003c/h2\u003e\n\u003ch3 id=\"umami\"\u003eUmami\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://umami.is\"\u003eUmami\u003c/a\u003e 是一款开源的网站统计工具，定位是 Google Analytics 的隐私友好替代品。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e开源\u003c/strong\u003e：代码完全公开，可自部署\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e隐私友好\u003c/strong\u003e：不使用 Cookie，不追踪个人信息，符合 GDPR\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e数据详细\u003c/strong\u003e：访客来源、设备类型、浏览器、停留时长、实时在线人数\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e免费版\u003c/strong\u003e：Umami Cloud 每月 10 万次页面浏览，个人博客完全够用\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e数据归属\u003c/strong\u003e：显示在后台，只有博主自己能看\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e适合用来了解博客的真实流量情况。\u003c/p\u003e\n\u003ch3 id=\"不蒜子\"\u003e不蒜子\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://busuanzi.ibruce.info\"\u003e不蒜子\u003c/a\u003e 是一个极简的页面计数器，由国内开发者维护。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e接入极简\u003c/strong\u003e：两行代码搞定\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e免费无限制\u003c/strong\u003e：没有用量上限\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e双维度统计\u003c/strong\u003e：网站总访问量 + 单篇文章浏览量\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e数据公开\u003c/strong\u003e：数字直接显示在博客页面上，访客可见\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e缺点\u003c/strong\u003e：不开源，数据存在作者服务器，部分广告拦截插件（如 Brave）会屏蔽\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e适合在博客页面直接展示浏览数字。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"两者的区别\"\u003e两者的区别\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e\u003c/th\u003e\n          \u003cth\u003eUmami\u003c/th\u003e\n          \u003cth\u003e不蒜子\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e数据可见性\u003c/td\u003e\n          \u003ctd\u003e仅博主后台\u003c/td\u003e\n          \u003ctd\u003e页面公开显示\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e统计维度\u003c/td\u003e\n          \u003ctd\u003e详细（来源、设备等）\u003c/td\u003e\n          \u003ctd\u003e仅浏览次数\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e隐私\u003c/td\u003e\n          \u003ctd\u003e极佳\u003c/td\u003e\n          \u003ctd\u003e一般\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e接入难度\u003c/td\u003e\n          \u003ctd\u003e中\u003c/td\u003e\n          \u003ctd\u003e极简\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e开源\u003c/td\u003e\n          \u003ctd\u003e✅\u003c/td\u003e\n          \u003ctd\u003e❌\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e两者互补，同时使用效果最好。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"一接入-umami-cloud\"\u003e一、接入 Umami Cloud\u003c/h2\u003e\n\u003ch3 id=\"1-注册账号\"\u003e1. 注册账号\u003c/h3\u003e\n\u003cp\u003e打开 \u003ca href=\"https://umami.is\"\u003eumami.is\u003c/a\u003e，点 \u003cstrong\u003eSign up\u003c/strong\u003e 注册，选择数据存储地区（推荐 United States）。\u003c/p\u003e\n\u003ch3 id=\"2-添加网站\"\u003e2. 添加网站\u003c/h3\u003e\n\u003cp\u003e登录后进入 \u003cstrong\u003eSettings\u003c/strong\u003e → \u003cstrong\u003eWebsites\u003c/strong\u003e → \u003cstrong\u003eAdd website\u003c/strong\u003e：\u003c/p\u003e","title":"为博客添加访问统计：Umami + 不蒜子"},{"content":" 零成本、全静态、自动部署。用 Hugo 搭建个人博客并托管到 Cloudflare Pages 的完整流程。\n准备工作 安装以下工具，并注册好账号：\nGit Hugo（Windows 用 winget install Hugo.Hugo.Extended） GitHub 账号 Cloudflare 账号 一、创建站点 hugo new site myblog cd myblog git init 二、安装 PaperMod 主题 git submodule add https://github.com/adityatelange/hugo-PaperMod themes/PaperMod 三、配置 hugo.toml 用以下内容替换根目录的 hugo.toml：\nbaseURL = \u0026#34;/\u0026#34; locale = \u0026#34;zh-CN\u0026#34; title = \u0026#34;我的博客\u0026#34; theme = \u0026#34;PaperMod\u0026#34; [params] homeInfoParams = {Title = \u0026#34;你好 👋\u0026#34;, Content = \u0026#34;欢迎来到我的博客\u0026#34;} defaultTheme = \u0026#34;auto\u0026#34; ShowReadingTime = true ShowPostNavLinks = true ShowBreadCrumbs = true ShowCodeCopyButtons = true ShowToc = true [menu] [[menu.main]] name = \u0026#34;文章\u0026#34; url = \u0026#34;/posts/\u0026#34; weight = 1 [[menu.main]] name = \u0026#34;标签\u0026#34; url = \u0026#34;/tags/\u0026#34; weight = 2 [[menu.main]] name = \u0026#34;归档\u0026#34; url = \u0026#34;/archives/\u0026#34; weight = 3 [outputs] home = [\u0026#34;HTML\u0026#34;, \u0026#34;RSS\u0026#34;, \u0026#34;JSON\u0026#34;] 四、创建归档页 hugo new content archives.md 打开文件，内容替换为：\n--- title: \u0026#34;归档\u0026#34; layout: \u0026#34;archives\u0026#34; url: \u0026#34;/archives/\u0026#34; summary: \u0026#34;archives\u0026#34; --- 五、写文章 hugo new content posts/文章标题.md 打开生成的文件，将 draft: true 改为 draft: false，然后在下方写正文。\n本地预览：\nhugo server 浏览器打开 http://localhost:1313 查看效果。\n六、推送到 GitHub 在 GitHub 新建仓库，然后在本地运行：\ngit remote add origin https://github.com/你的用户名/仓库名.git git add . git commit -m \u0026#34;初始化博客\u0026#34; git push -u origin master 网络问题？ 如果连不上 GitHub，先配置本地代理（端口替换为你实际使用的）：\ngit config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:7890 七、部署到 Cloudflare Pages 登录 Cloudflare → Workers \u0026amp; Pages → Create → Pages\n连接 GitHub，选择你的仓库\n填写构建配置：\n字段 值 Framework preset Hugo Build command hugo Build output directory public 环境变量 HUGO_VERSION 0.147.0 点击 Save and Deploy\n部署完成后会获得一个 *.pages.dev 免费域名。此后每次 git push，网站自动更新。\n后续维护 每次写完新文章，只需三条命令：\ngit add . git commit -m \u0026#34;新文章：文章标题\u0026#34; git push ","permalink":"/posts/%E7%94%A8-hugo-+-cloudflare-pages-%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/","summary":"\u003cblockquote\u003e\n\u003cp\u003e零成本、全静态、自动部署。用 Hugo 搭建个人博客并托管到 Cloudflare Pages 的完整流程。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"准备工作\"\u003e准备工作\u003c/h2\u003e\n\u003cp\u003e安装以下工具，并注册好账号：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://git-scm.com/downloads\"\u003eGit\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/installation/\"\u003eHugo\u003c/a\u003e（Windows 用 \u003ccode\u003ewinget install Hugo.Hugo.Extended\u003c/code\u003e）\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com\"\u003eGitHub\u003c/a\u003e 账号\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://cloudflare.com\"\u003eCloudflare\u003c/a\u003e 账号\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"一创建站点\"\u003e一、创建站点\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehugo new site myblog\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd myblog\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit init\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"二安装-papermod-主题\"\u003e二、安装 PaperMod 主题\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit submodule add https://github.com/adityatelange/hugo-PaperMod themes/PaperMod\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"三配置-hugotoml\"\u003e三、配置 hugo.toml\u003c/h2\u003e\n\u003cp\u003e用以下内容替换根目录的 \u003ccode\u003ehugo.toml\u003c/code\u003e：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003ebaseURL\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003elocale\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;zh-CN\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003etitle\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;我的博客\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003etheme\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;PaperMod\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#a6e22e\"\u003eparams\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#a6e22e\"\u003ehomeInfoParams\u003c/span\u003e = {\u003cspan style=\"color:#a6e22e\"\u003eTitle\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;你好 👋\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#a6e22e\"\u003eContent\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;欢迎来到我的博客\u0026#34;\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#a6e22e\"\u003edefaultTheme\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;auto\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#a6e22e\"\u003eShowReadingTime\u003c/span\u003e = \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#a6e22e\"\u003eShowPostNavLinks\u003c/span\u003e = \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#a6e22e\"\u003eShowBreadCrumbs\u003c/span\u003e = \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#a6e22e\"\u003eShowCodeCopyButtons\u003c/span\u003e = \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#a6e22e\"\u003eShowToc\u003c/span\u003e = \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#a6e22e\"\u003emenu\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  [[\u003cspan style=\"color:#a6e22e\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#a6e22e\"\u003ename\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;文章\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#a6e22e\"\u003eurl\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;/posts/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#a6e22e\"\u003eweight\u003c/span\u003e = \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  [[\u003cspan style=\"color:#a6e22e\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#a6e22e\"\u003ename\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;标签\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#a6e22e\"\u003eurl\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;/tags/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#a6e22e\"\u003eweight\u003c/span\u003e = \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  [[\u003cspan style=\"color:#a6e22e\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#a6e22e\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#a6e22e\"\u003ename\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;归档\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#a6e22e\"\u003eurl\u003c/span\u003e = \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;/archives/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#a6e22e\"\u003eweight\u003c/span\u003e = \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#a6e22e\"\u003eoutputs\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#a6e22e\"\u003ehome\u003c/span\u003e = [\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;HTML\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;RSS\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;JSON\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"四创建归档页\"\u003e四、创建归档页\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehugo new content archives.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e打开文件，内容替换为：\u003c/p\u003e","title":"用 Hugo + Cloudflare Pages 搭建个人博客"},{"content":"你好，我是 SHAIFX。\n这里现在还是一个小小的技术博客，但我更愿意把它看成一块正在生长的实验田：写代码、做游戏、搞 AI、试工具，把有用的过程留下来，把踩过的坑修成路。\n接下来会长出什么 短期内，这里会继续记录 Hugo、Git、Cloudflare Pages、开源工具和个人工作流。它们是地基，朴素、可靠、方便迁移。\n更往后，我想让这里不只是文章列表。它可能会出现一些更好玩的东西：小游戏开发笔记、AI 辅助创作实验、可交互的学习工具、面向新手的编程路线、也可能是某个突然冒出来的小作品。\n我喜欢那些“今天看起来只是折腾，明天可能真的有用”的东西。\n我的偏好 我偏爱简单、透明、能自己掌控的方案：静态优先，开源优先，本地优先。工具可以很小，但最好经得起重复使用；文章可以不长，但最好能帮人少绕一点路。\n所以这个博客会保持一种轻量的节奏：发现问题，解决问题，写下来。偶尔也会有一些意外的分支，像游戏、语言学习、AI 工具、个人网站的新玩法。\n联系我 有问题、建议，或者发现文章里哪里写得不够清楚，可以给我发邮件：\nshaifx@hotmail.com\n也欢迎在文章底部留言。这里还小，但会慢慢变热闹。\n","permalink":"/about/","summary":"\u003cp\u003e你好，我是 \u003cstrong\u003eSHAIFX\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e这里现在还是一个小小的技术博客，但我更愿意把它看成一块正在生长的实验田：写代码、做游戏、搞 AI、试工具，把有用的过程留下来，把踩过的坑修成路。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"SHAIFX 的未来路线图\" loading=\"lazy\" src=\"/images/about-map.svg\"\u003e\u003c/p\u003e\n\u003ch2 id=\"接下来会长出什么\"\u003e接下来会长出什么\u003c/h2\u003e\n\u003cp\u003e短期内，这里会继续记录 Hugo、Git、Cloudflare Pages、开源工具和个人工作流。它们是地基，朴素、可靠、方便迁移。\u003c/p\u003e\n\u003cp\u003e更往后，我想让这里不只是文章列表。它可能会出现一些更好玩的东西：小游戏开发笔记、AI 辅助创作实验、可交互的学习工具、面向新手的编程路线、也可能是某个突然冒出来的小作品。\u003c/p\u003e\n\u003cp\u003e我喜欢那些“今天看起来只是折腾，明天可能真的有用”的东西。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"博客工作流示意图\" loading=\"lazy\" src=\"/images/about-workflow.svg\"\u003e\u003c/p\u003e\n\u003ch2 id=\"我的偏好\"\u003e我的偏好\u003c/h2\u003e\n\u003cp\u003e我偏爱简单、透明、能自己掌控的方案：静态优先，开源优先，本地优先。工具可以很小，但最好经得起重复使用；文章可以不长，但最好能帮人少绕一点路。\u003c/p\u003e\n\u003cp\u003e所以这个博客会保持一种轻量的节奏：发现问题，解决问题，写下来。偶尔也会有一些意外的分支，像游戏、语言学习、AI 工具、个人网站的新玩法。\u003c/p\u003e\n\u003ch2 id=\"联系我\"\u003e联系我\u003c/h2\u003e\n\u003cp\u003e有问题、建议，或者发现文章里哪里写得不够清楚，可以给我发邮件：\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"mailto:shaifx@hotmail.com\"\u003eshaifx@hotmail.com\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e也欢迎在文章底部留言。这里还小，但会慢慢变热闹。\u003c/p\u003e","title":"About"},{"content":"","permalink":"/bookmark/","summary":"","title":"书签"}]