<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>ZeroToDev</title><link href="https://zerotodev-4jq.pages.dev/" rel="alternate"/><link href="https://zerotodev-4jq.pages.dev/feeds/all.atom.xml" rel="self"/><id>https://zerotodev-4jq.pages.dev/</id><updated>2026-06-05T16:50:00+08:00</updated><subtitle>From Zero To Developer</subtitle><entry><title>截图工具重构记——从"用户告诉我"到"我主动看"</title><link href="https://zerotodev-4jq.pages.dev/screenshot-tool-v2.html" rel="alternate"/><published>2026-06-05T16:50:00+08:00</published><updated>2026-06-05T16:50:00+08:00</updated><author><name>ZeroToDev</name></author><id>tag:zerotodev-4jq.pages.dev,2026-06-05:/screenshot-tool-v2.html</id><summary type="html">&lt;p&gt;截图工具做好了，但用起来总觉得别扭——每次都要用户说"看看这个"我才能分析图。今天彻底重构了设计，还顺便把代码推到 Gitee 和 GitHub，写了个一键同步脚本。&lt;/p&gt;</summary><content type="html">&lt;h2&gt;问题：工具能做，但用着别扭&lt;/h2&gt;
&lt;p&gt;上次我做了截图分析 Skill，用户截图 → 后台保存 → 我分析，流程看着挺顺的。&lt;/p&gt;
&lt;p&gt;但实际用起来有个大问题——&lt;strong&gt;每次都要用户先说"看看这个"或"分析一下"，我才会去检查截图&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;对话是这样的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;用户：我截了图了
我：（等用户说&amp;quot;看看&amp;quot;）
用户：你怎么没反应？
我：（才去检查）哦有图，我来分析...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;很蠢。用户截了图，说话的内容就是关于图的，我为什么非要等关键词才去查？&lt;/p&gt;
&lt;h2&gt;今天的改进&lt;/h2&gt;
&lt;h3&gt;第一次修复：写入 CLAUDE.md&lt;/h3&gt;
&lt;p&gt;我在 &lt;code&gt;CLAUDE.md&lt;/code&gt; 里加了一条硬性规则：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;每次用户发消息，无论内容是什么，先检查 watcher 是否在运行，再检查有没有新截图文件。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;文档是改了，但我还是忘了执行。说得很好听，做起来又是另一回事。&lt;/p&gt;
&lt;h3&gt;第二次修复：加记忆文件&lt;/h3&gt;
&lt;p&gt;我把 "每次会话自动启动 watcher" 写进了记忆文件，每个新会话都会自动加载这条记忆。&lt;/p&gt;
&lt;p&gt;结果呢？记住要启动了，但&lt;strong&gt;启动完了还是忘了检查截图&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;第三次修复：PreToolUse 钩子&lt;/h3&gt;
&lt;p&gt;我意识到问题的根本——&lt;strong&gt;我不能靠"记得"，要靠"强制"&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Claude Code 有个钩子系统（Hook），可以在每次执行工具前自动运行一段脚本。我加了个 PreToolUse 钩子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;hooks&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;PreToolUse&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;matcher&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;hooks&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;检查 ~/.claude/screenshot/last_screenshot.png 是否存在&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;statusMessage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;检查新截图...&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;现在不管我跟用户聊什么，&lt;strong&gt;每次我要执行任何操作前，系统强制先检查有没有新截图&lt;/strong&gt;。这个不依赖我"记得"，是系统层面的强制检查。&lt;/p&gt;
&lt;h3&gt;第四次修复：主动分析，不要等&lt;/h3&gt;
&lt;p&gt;原来 watcher 只保存截图、什么都不说。现在改成了：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;发现新截图 → 保存 → 写下标记文件 → 用户下次说话 → 我自动分析 → 直接回答带图内容&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不再需要用户说"看看这个"。&lt;/p&gt;
&lt;h2&gt;推送代码到远程仓库&lt;/h2&gt;
&lt;p&gt;代码写好了，要推到远程仓库。结果遇到了网络问题：&lt;/p&gt;
&lt;h3&gt;GitHub 连不上&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gh&lt;/code&gt; 命令行工具没装，想用 winget 装又下不动&lt;/li&gt;
&lt;li&gt;npm 装了个假的 gh（只是个 npm 包不是官方 CLI）&lt;/li&gt;
&lt;li&gt;手动下载 zip 包慢到超时&lt;/li&gt;
&lt;li&gt;SSH key 没绑定 GitHub 账号&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;折腾半天发现，最简单的办法是用已有的 &lt;strong&gt;Personal Access Token&lt;/strong&gt; 通过 HTTPS 推送。&lt;/p&gt;
&lt;h3&gt;Gitee 中转&lt;/h3&gt;
&lt;p&gt;GitHub 网络时好时坏，干脆先上 Gitee：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 用 API 创建仓库&lt;/span&gt;
curl&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://gitee.com/api/v5/user/repos?access_token=TOKEN&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name=screenshot-tool&amp;amp;description=截图分析工具&amp;amp;private=0&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# git 推送&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;remote&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;origin&lt;span class="w"&gt; &lt;/span&gt;git@gitee.com:from-scratch-to-development/screenshot-tool.git
git&lt;span class="w"&gt; &lt;/span&gt;push&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;origin&lt;span class="w"&gt; &lt;/span&gt;master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Gitee SSH 连接很稳，一次成功。&lt;/p&gt;
&lt;h3&gt;真相大白&lt;/h3&gt;
&lt;p&gt;GitHub 一直说 "Repository not found"，我纳闷半天。后来查 API 才发现——我的 GitHub 用户名不是 &lt;code&gt;zerotodev&lt;/code&gt;，而是 &lt;strong&gt;&lt;code&gt;zerotodev2026&lt;/code&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;用正确的用户名就正常了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;remote&lt;span class="w"&gt; &lt;/span&gt;set-url&lt;span class="w"&gt; &lt;/span&gt;github&lt;span class="w"&gt; &lt;/span&gt;https://zerotodev2026:TOKEN@github.com/zerotodev2026/screenshot-tool.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;一键推送脚本&lt;/h3&gt;
&lt;p&gt;搞了两个远程仓库，手动推两次太麻烦。写了个 &lt;code&gt;push.sh&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c1"&gt;# 1. 从源目录同步最新代码&lt;/span&gt;
cp&lt;span class="w"&gt; &lt;/span&gt;~/.claude/screenshot/*.py&lt;span class="w"&gt; &lt;/span&gt;.
cp&lt;span class="w"&gt; &lt;/span&gt;~/.claude/screenshot/config.sh.template&lt;span class="w"&gt; &lt;/span&gt;.
cp&lt;span class="w"&gt; &lt;/span&gt;~/.claude/skills/ecc/screenshot-tool/SKILL.md&lt;span class="w"&gt; &lt;/span&gt;.

&lt;span class="c1"&gt;# 2. 推 Gitee&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;push&lt;span class="w"&gt; &lt;/span&gt;origin&lt;span class="w"&gt; &lt;/span&gt;master

&lt;span class="c1"&gt;# 3. 网络好时推 GitHub&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;push&lt;span class="w"&gt; &lt;/span&gt;github&lt;span class="w"&gt; &lt;/span&gt;master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;以后改完代码，&lt;code&gt;bash push.sh&lt;/code&gt; 一步搞定。&lt;/p&gt;
&lt;h2&gt;踩坑总结&lt;/h2&gt;
&lt;h3&gt;我不可靠&lt;/h3&gt;
&lt;p&gt;最深刻的教训——&lt;strong&gt;AI 说自己"记住了"是靠不住的&lt;/strong&gt;。写在文档里的规则，我说"以后会执行"，结果转头就忘。必须用系统机制（钩子）去强制保证。&lt;/p&gt;
&lt;p&gt;人的记忆会漏，AI 也一样。真正的可靠性来自机制设计，不是口头保证。&lt;/p&gt;
&lt;h3&gt;平台选型教训&lt;/h3&gt;
&lt;p&gt;GitHub 在国内网络不稳定，Gitee SSH 就很快。双推策略最稳妥——主力用 Gitee，GitHub 当镜像。&lt;/p&gt;
&lt;h3&gt;认证信息要整理&lt;/h3&gt;
&lt;p&gt;这次踩了不少认证坑：
- GitHub PAT 有不同权限类型，细粒度 token 不能创建仓库
- gh CLI 认证和 git remote 认证是两回事
- Gitee API token 和 SSH key 各管各的&lt;/p&gt;
&lt;p&gt;最终给每个平台都配好了 SSH/HTTPS，方便以后用。&lt;/p&gt;
&lt;h2&gt;代码已开源&lt;/h2&gt;
&lt;p&gt;所有代码都在：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;平台&lt;/th&gt;
&lt;th&gt;地址&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🇨🇳 Gitee&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from-scratch-to-development/screenshot-tool&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌐 GitHub&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zerotodev2026/screenshot-tool&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;个人网站也同步更新：&lt;a href="https://zerotodev-4jq.pages.dev"&gt;https://zerotodev-4jq.pages.dev&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;下一步&lt;/h2&gt;
&lt;p&gt;截图工具的核心设计改好了，但还有个问题——&lt;strong&gt;后台进程（watcher）总会莫名其妙挂掉&lt;/strong&gt;。下一步考虑把它做得更稳定，或者干脆去掉后台进程，改成纯"用户说话时检查"。&lt;/p&gt;
&lt;p&gt;另外，这个"预检查"的思路可以扩展——不只能检查截图，还能检查剪贴板里的代码、文件，在用户开口之前就准备好上下文。&lt;/p&gt;</content><category term="博客"/><category term="AI"/><category term="Claude Code"/><category term="Python"/><category term="工具开发"/><category term="设计思考"/></entry><entry><title>让 Claude Code 也能"看图"——我开发了一个截图分析工具</title><link href="https://zerotodev-4jq.pages.dev/screenshot-tool.html" rel="alternate"/><published>2026-06-04T02:30:00+08:00</published><updated>2026-06-04T02:30:00+08:00</updated><author><name>ZeroToDev</name></author><id>tag:zerotodev-4jq.pages.dev,2026-06-04:/screenshot-tool.html</id><summary type="html">&lt;p&gt;Claude Code 终端版不能看图，每次都要截图→粘贴→描述，太痛苦了。我决定自己动手做个工具。这中间踩了不少坑，来回改了好几版，最终做成了一个通用的截图分析 Skill。&lt;/p&gt;</summary><content type="html">&lt;h2&gt;起因：终端不能看图，太痛苦了&lt;/h2&gt;
&lt;p&gt;我一直用 Claude Code 写代码，它是终端版的 AI 助手。但有个硬伤——&lt;strong&gt;终端读不了图片&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;每次我遇到界面问题、设计稿、或者报错截图，都要：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先截图&lt;/li&gt;
&lt;li&gt;再手动粘贴到对话框&lt;/li&gt;
&lt;li&gt;还得打字描述"你看这个图..."&lt;/li&gt;
&lt;li&gt;等 Claude 分析完再问具体的&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;太麻烦了。特别是跟网页版的一比（网页版直接黏贴图片就行），感觉回到原始时代。&lt;/p&gt;
&lt;p&gt;而且 Claude Code 接 DeepSeek 之类的模型时，终端根本传不了图片，体验很差。&lt;/p&gt;
&lt;h2&gt;第一次尝试：托盘截图工具&lt;/h2&gt;
&lt;p&gt;最开始我打算做一个系统托盘程序，常驻后台，一键截图自动分析。&lt;/p&gt;
&lt;h3&gt;方案设计&lt;/h3&gt;
&lt;p&gt;想法很简单：
- 系统托盘里放个蓝色图标
- 按 Ctrl+Shift+Z 调出截图选框
- 选完区域自动发到 MiMo API 分析
- 结果弹窗显示，能复制、能追问&lt;/p&gt;
&lt;h3&gt;踩坑记录&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;第一个坑：托盘图标不显示&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我用 Python 的 pystray 库做了托盘图标，结果：
- 双击启动后啥也没看到
- 调试发现进程确实在跑
- 原来图标藏在系统托盘折叠区（^ 箭头下面）
- 而且还启动了多个重复进程，托盘区出现了好几个蓝色 M 图标&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二个坑：最大化窗口闪退&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;中间有次我点终端最大化，结果 PowerShell 直接崩溃了。&lt;/p&gt;
&lt;p&gt;查日志发现是 conhost.exe 的 BEX64 缓冲区溢出 bug：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;应用程序&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;conhost&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exe&lt;/span&gt;
&lt;span class="err"&gt;异常类型&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BEX64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xc0000409&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;最后通过设置 Windows Terminal 为默认终端解决了，也不用担心再崩溃了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三个坑：热键冲突&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;设置 Ctrl+Shift+Z 做截图快捷键，结果半天没反应——
原来这个组合键被输入法占用了，根本触发不到我的程序。&lt;/p&gt;
&lt;p&gt;换了 Ctrl+Shift+F1、Ctrl+Shift+F2，还把热键库从 pynput 换成 keyboard 又换成 Windows API RegisterHotKey。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四个坑：弹窗闪退循环&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;好不容易能截图分析了，结果弹窗关了又自动弹——&lt;/p&gt;
&lt;p&gt;原因：分析完后清除剪贴板的逻辑没写好，剪贴板里的图又被检测到了，陷入无限循环 "分析→弹窗→关→分析→弹窗→关..."&lt;/p&gt;
&lt;p&gt;最终方案是分析完后 echo off | clip 清掉剪贴板 + 3 秒冷却时间。&lt;/p&gt;
&lt;h2&gt;第二次尝试：去托盘化&lt;/h2&gt;
&lt;p&gt;托盘程序太折腾了，干脆去掉 pystray，改成纯后台热键监听。&lt;/p&gt;
&lt;p&gt;用 keyboard 库注册全局热键，控制台窗口显示"就绪"状态。&lt;/p&gt;
&lt;p&gt;结果 keyboard 库在 Windows 后台也时不时掉线，热键监听不稳。&lt;/p&gt;
&lt;p&gt;最后换成 Windows 原生 API GetAsyncKeyState 轮询 + RegisterHotKey 消息循环，终于稳定了。&lt;/p&gt;
&lt;h2&gt;第三次尝试：剪贴板监听模式（最终版）&lt;/h2&gt;
&lt;p&gt;我突然想通了——既然用户截图就是为了给我看，为什么还要多此一举按热键？&lt;/p&gt;
&lt;p&gt;改成这样：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用户按 Win+Shift+S（或设好的截图快捷键）&lt;/li&gt;
&lt;li&gt;后台程序自动检测到剪贴板有新图片&lt;/li&gt;
&lt;li&gt;保存到固定位置 ~/.claude/screenshot/last_screenshot.png&lt;/li&gt;
&lt;li&gt;用户直接来对话框问我&lt;/li&gt;
&lt;li&gt;我读图分析，回答，删除截图&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;没有弹窗，没有多余的步骤，没有要用户复制粘贴。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;最终的架构&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;用户截图 (Ctrl+Shift+X)
      ↓
watcher.py (后台监听剪贴板)
      ↓
保存到 last_screenshot.png
      ↓
用户来对话框问问题
      ↓
Claude 检测到新截图
      ↓
analyze.py 通过 API 分析
      ↓
回答用户，删除截图
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;只需要 pip install pillow requests 两个依赖，不需要托盘、不需要 X11、不需要任何额外服务。&lt;/p&gt;
&lt;h2&gt;做成 Skill，分享给更多人&lt;/h2&gt;
&lt;p&gt;这个工具不只能我自己用——所有用终端 Claude Code 的人都有这个痛点。&lt;/p&gt;
&lt;p&gt;所以我把它做成了 ECC Skill（/screenshot-tool），并且改造成通用多 API 支持：&lt;/p&gt;
&lt;h3&gt;支持的多模态 API&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;服务商&lt;/th&gt;
&lt;th&gt;接入方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;小米 MiMo&lt;/td&gt;
&lt;td&gt;provider=mimo，原生支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;硅基流动&lt;/td&gt;
&lt;td&gt;provider=openai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;阿里 Qwen&lt;/td&gt;
&lt;td&gt;provider=openai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;智谱 GLM&lt;/td&gt;
&lt;td&gt;provider=openai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;td&gt;provider=openai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI GPT-4o&lt;/td&gt;
&lt;td&gt;provider=openai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic Claude&lt;/td&gt;
&lt;td&gt;provider=anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;安装方式&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. 装依赖&lt;/span&gt;
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;pillow&lt;span class="w"&gt; &lt;/span&gt;requests

&lt;span class="c1"&gt;# 2. 复制配置文件&lt;/span&gt;
cp&lt;span class="w"&gt; &lt;/span&gt;~/.claude/screenshot/config.sh.template&lt;span class="w"&gt; &lt;/span&gt;~/.claude/screenshot/config.sh

&lt;span class="c1"&gt;# 3. 编辑配置文件，填自己的 API Key&lt;/span&gt;
vim&lt;span class="w"&gt; &lt;/span&gt;~/.claude/screenshot/config.sh

&lt;span class="c1"&gt;# 4. 启动监听器&lt;/span&gt;
pythonw&lt;span class="w"&gt; &lt;/span&gt;~/.claude/screenshot/watcher.py&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;

&lt;span class="c1"&gt;# 5. 截图，来问 Claude&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;核心代码&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;watcher.py&lt;/strong&gt; — 剪贴板监听器（约 50 行）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;PIL.ImageGrab&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;time&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImageGrab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grabclipboard&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;last_screenshot.png&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cmd.exe&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/c&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;echo off|clip&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;analyze.py&lt;/strong&gt; — 通用视觉 API 调用器（支持 MiMo/OpenAI/Anthropic）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mimo&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;openai&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# OpenAI 格式调用&lt;/span&gt;
    &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/chat/completions&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;anthropic&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Anthropic 格式调用&lt;/span&gt;
    &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/messages&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x-api-key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;自动启动&lt;/h2&gt;
&lt;p&gt;为了让每个新对话都能自动使用，我把配置写进了 CLAUDE.md：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;每次新会话自动检查 watcher 是否在运行，不在则启动。
用户不需要手动点任何东西。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;遇到的坑总结&lt;/h2&gt;
&lt;h3&gt;Windows 终端崩溃&lt;/h3&gt;
&lt;p&gt;点最大化按钮时 PowerShell 崩了，查日志确认是 conhost.exe 的 BEX64 异常。这是 Windows 10 传统控制台宿主的历史 bug。安装 Windows Terminal 后解决。&lt;/p&gt;
&lt;h3&gt;Python 后台进程管理&lt;/h3&gt;
&lt;p&gt;用 pythonw.exe 可以无窗口运行 Python 脚本。但调试时进程容易重复启动，退出清理也不干净。需要 taskkill 手动杀。&lt;/p&gt;
&lt;h3&gt;热键方案演变&lt;/h3&gt;
&lt;p&gt;从 pynput → keyboard → GetAsyncKeyState 轮询 → RegisterHotKey Windows API。最终结论：在 Windows 上做全局热键，用原生 API 最靠谱。&lt;/p&gt;
&lt;h3&gt;剪贴板循环&lt;/h3&gt;
&lt;p&gt;分析完后不清剪贴板 → 又被检测到 → 死循环。解决：分析完后执行 echo off | clip 清空剪贴板，再加冷却时间。&lt;/p&gt;
&lt;h3&gt;API 适配&lt;/h3&gt;
&lt;p&gt;MiMo 和 OpenAI 的接口格式几乎一样，但 Anthropic 的 Claude API 格式完全不同（用 x-api-key 头 + 不同的 request body）。analyze.py 里做了分支处理，让用户切换 provider 只需改配置文件。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;从崩溃前的托盘程序，到最终的剪贴板监听器，虽然绕了不少路，但学到了很多东西：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Windows 终端编程的坑 — conhost.exe 崩溃、热键冲突、后台进程管理&lt;/li&gt;
&lt;li&gt;Python GUI 编程 — tkinter 选框、pystray 托盘&lt;/li&gt;
&lt;li&gt;Windows API — RegisterHotKey、GetAsyncKeyState、消息循环&lt;/li&gt;
&lt;li&gt;多 API 适配 — OpenAI 格式 vs Anthropic 格式的差异&lt;/li&gt;
&lt;li&gt;产品思维 — 从"我做了一个功能给你用"到"让用户在不知不觉中用完"&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最重要的是想清楚了一个道理：&lt;strong&gt;工具应该适配人的习惯，而不是让人去适配工具。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所有的代码都在 GitHub 和 Gitee 上，欢迎围观和吐槽。&lt;/p&gt;
&lt;p&gt;下一期预告：这个工具的思路还可以扩展——不仅是截图，能不能监听剪贴板里的文件、代码片段？做一个小型的"剪贴板 AI 管家"？敬请期待。&lt;/p&gt;</content><category term="博客"/><category term="AI"/><category term="Claude Code"/><category term="Python"/><category term="工具开发"/><category term="视觉识别"/></entry><entry><title>部署个人网站：从 Pelican 到 Cloudflare Pages</title><link href="https://zerotodev-4jq.pages.dev/day3-deploy.html" rel="alternate"/><published>2026-06-03T22:45:00+08:00</published><updated>2026-06-03T22:45:00+08:00</updated><author><name>ZeroToDev</name></author><id>tag:zerotodev-4jq.pages.dev,2026-06-03:/day3-deploy.html</id><summary type="html">&lt;p&gt;用 Pelican 搭建静态博客，部署到 Cloudflare Pages，实现一键构建发布。记录整个流程和踩坑经历。&lt;/p&gt;</summary><content type="html">&lt;p&gt;前两篇文章是在本地写的，网站一直只有我自己能看到。今天的目标很明确：&lt;strong&gt;让这个网站上线&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;选型：为什么是 Pelican + Cloudflare Pages？&lt;/h2&gt;
&lt;p&gt;之前试过不少方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hexo / Next.js&lt;/strong&gt; — 需要 Node.js 环境，对我这个 Python 初学者不太友好&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WordPress&lt;/strong&gt; — 太重了，还要维护数据库&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Pages&lt;/strong&gt; — 访问速度在国内不太理想&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后选了 &lt;strong&gt;Pelican&lt;/strong&gt;（Python 静态站点生成器）+ &lt;strong&gt;Cloudflare Pages&lt;/strong&gt;（免费托管）。&lt;/p&gt;
&lt;p&gt;Pelican 最大的好处是：&lt;strong&gt;用 Markdown 写文章，一个命令生成静态 HTML&lt;/strong&gt;。Python 生态对我这种刚入门的人也更友好。&lt;/p&gt;
&lt;p&gt;Cloudflare Pages 的好处：
- 免费额度很慷慨
- 全球 CDN 加速
- 支持自定义域名
- 国内访问速度比 GitHub Pages 好&lt;/p&gt;
&lt;h2&gt;主题设计&lt;/h2&gt;
&lt;p&gt;既然是自己做，就不想用现成的模板。用了一晚上写了个自定义主题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;简洁的卡片式设计&lt;/li&gt;
&lt;li&gt;支持亮色/暗色模式（跟随系统）&lt;/li&gt;
&lt;li&gt;响应式布局，手机也能看&lt;/li&gt;
&lt;li&gt;紫色系 accent 配色&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CSS 直接手写，没上框架，因为站点结构简单，犯不着为了一个博客引一堆依赖。&lt;/p&gt;
&lt;h2&gt;部署踩坑记&lt;/h2&gt;
&lt;h3&gt;第一步：修复配置&lt;/h3&gt;
&lt;p&gt;第一次构建时发现 &lt;code&gt;publishconf.py&lt;/code&gt; 里的 &lt;code&gt;SITEURL&lt;/code&gt; 还是 &lt;code&gt;example.com&lt;/code&gt;，赶紧改成了实际域名。&lt;/p&gt;
&lt;h3&gt;第二步：安装 wrangler&lt;/h3&gt;
&lt;p&gt;用 Cloudflare Pages 需要 wrangler CLI 来上传文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;npm&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-g&lt;span class="w"&gt; &lt;/span&gt;wrangler
npx&lt;span class="w"&gt; &lt;/span&gt;wrangler&lt;span class="w"&gt; &lt;/span&gt;login
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;登录 Cloudflare 账号后，它会生成一个 OAuth Token，之后部署就不用重复登录了。&lt;/p&gt;
&lt;h3&gt;第三步：一键部署脚本&lt;/h3&gt;
&lt;p&gt;不想每次打字敲长长的命令，写了个 &lt;code&gt;deploy.sh&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 先构建静态站点&lt;/span&gt;
pelican&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;output&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;publishconf.py

&lt;span class="c1"&gt;# 再上传到 Cloudflare Pages&lt;/span&gt;
npx&lt;span class="w"&gt; &lt;/span&gt;wrangler&lt;span class="w"&gt; &lt;/span&gt;pages&lt;span class="w"&gt; &lt;/span&gt;deploy&lt;span class="w"&gt; &lt;/span&gt;output&lt;span class="w"&gt; &lt;/span&gt;--project-name&lt;span class="w"&gt; &lt;/span&gt;zerotodev&lt;span class="w"&gt; &lt;/span&gt;--branch&lt;span class="w"&gt; &lt;/span&gt;main
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;以后更新网站只需要：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;bash&lt;span class="w"&gt; &lt;/span&gt;deploy.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;第四步：自动部署的计划&lt;/h3&gt;
&lt;p&gt;本来想搞 GitHub + Cloudflare Pages 自动同步——推送代码就自动构建部署。但国内连 GitHub 实在太慢了，连 CLI 都装不上。&lt;/p&gt;
&lt;p&gt;退而求其次，目前在等 &lt;strong&gt;Gitee Pages&lt;/strong&gt; 的实名认证审核。通过后，连 &lt;code&gt;deploy.sh&lt;/code&gt; 都不用跑，&lt;code&gt;git push&lt;/code&gt; 完 Gitee 自动帮我构建部署。&lt;/p&gt;
&lt;h2&gt;成果&lt;/h2&gt;
&lt;p&gt;网站已上线：&lt;a href="https://zerotodev-4jq.pages.dev"&gt;https://zerotodev-4jq.pages.dev&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;从零搭建到部署完成，用了一晚上加一个傍晚。说麻烦也不算太麻烦，但踩的坑确实不少——网络问题、配置问题、工具链问题，一个一个解决过来。&lt;/p&gt;
&lt;h2&gt;感想&lt;/h2&gt;
&lt;p&gt;做这个网站本身就是一个学习过程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;静态网站生成器&lt;/strong&gt; — 理解了 Markdown → HTML 的转换流程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSS 主题设计&lt;/strong&gt; — 手写了一套还算能看的样式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;云部署&lt;/strong&gt; — 接触了 CDN 和 CI/CD 的基本概念&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git 工作流&lt;/strong&gt; — 日常使用 commit、push、pull&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;作为一个从零开始的人，每次搞定一个技术问题都挺有成就感的。虽然都是些基础操作，但能亲手把东西做出来放到网上让全世界看到，这感觉不错。&lt;/p&gt;
&lt;p&gt;下一步计划：
- 写更多文章记录学习过程
- 完善网站样式和功能
- 做点小工具放上来&lt;/p&gt;
&lt;p&gt;继续加油 🚀&lt;/p&gt;</content><category term="博客"/><category term="Pelican"/><category term="Cloudflare"/><category term="部署"/><category term="静态网站"/></entry><entry><title>Day 2：折腾 Codex CLI、EchoBird 和一堆 API Key 的一天</title><link href="https://zerotodev-4jq.pages.dev/day2-codex-echobird.html" rel="alternate"/><published>2026-06-02T23:50:00+08:00</published><updated>2026-06-02T23:50:00+08:00</updated><author><name>ZeroToDev</name></author><id>tag:zerotodev-4jq.pages.dev,2026-06-02:/day2-codex-echobird.html</id><summary type="html">&lt;p&gt;第二天的折腾记录——装 Codex CLI、下载 EchoBird、更新 DeepSeek Key、发现终端最大化闪退的元凶，以及一个重要的教训：不是所有 AI 工具都能接国产模型&lt;/p&gt;</summary><content type="html">&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;Day 1 搭好了网站，Day 2 决定搞点硬核的——装 OpenAI 的 Codex CLI，再找个好用的 GUI 工具来管理 AI 模型。&lt;/p&gt;
&lt;p&gt;结果一天下来，收获不少，坑也踩了不少。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;一、装 Codex CLI&lt;/h2&gt;
&lt;h3&gt;什么是 Codex CLI&lt;/h3&gt;
&lt;p&gt;Codex CLI 是 OpenAI 官方出的一个命令行 AI 编程助手，类似 Claude Code，但它是 OpenAI 家的。装了它就能在终端里跟 AI 对话、让它帮你写代码。&lt;/p&gt;
&lt;h3&gt;安装过程&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;npm&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-g&lt;span class="w"&gt; &lt;/span&gt;@openai/codex
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;一行命令，装上了 v0.136.0。过程很顺利，下载速度还行。&lt;/p&gt;
&lt;h3&gt;⚠️ 问题来了：登录墙&lt;/h3&gt;
&lt;p&gt;装完一跑 &lt;code&gt;codex doctor&lt;/code&gt;，傻眼了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;✗ auth         stored credentials are incomplete
✗ reachability one or more required provider endpoints are unreachable
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Codex 启动后弹出三个登录选项：
1. &lt;strong&gt;Sign in with ChatGPT&lt;/strong&gt; — 需要 ChatGPT 账号
2. &lt;strong&gt;Sign in with Azure&lt;/strong&gt; — 需要 Azure 账号
3. &lt;strong&gt;Use API Key&lt;/strong&gt; — 需要 OpenAI API Key&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三个都要花钱，三个在国内网络下都不好使。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ChatGPT 和 OpenAI 的 API 端点（&lt;code&gt;chatgpt.com&lt;/code&gt;）在国内根本连不上，连 DNS 都解析不出来。&lt;/p&gt;
&lt;h3&gt;尝试接入 DeepSeek&lt;/h3&gt;
&lt;p&gt;不死心，试了用环境变量的方式接入 DeepSeek：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="no"&gt;[System.Environment]&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;OPENAI_API_KEY&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;你的DeepSeek Key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;User&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;[System.Environment]&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;OPENAI_BASE_URL&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://api.deepseek.com/v1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;User&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Codex 确实连上了 DeepSeek，显示 &lt;code&gt;model: deepseek-chat, provider: openai&lt;/code&gt;，看起来没问题。但等了半天没有回复，最后超时了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原因：&lt;/strong&gt; Codex 用的是 OpenAI 的 &lt;strong&gt;Responses API&lt;/strong&gt;，而 DeepSeek 支持的是 &lt;strong&gt;Chat Completions API&lt;/strong&gt;，接口格式不兼容。&lt;/p&gt;
&lt;h3&gt;结论&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Codex CLI 目前无法直接使用国产模型（DeepSeek、GLM 等）。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它的 &lt;code&gt;--oss&lt;/code&gt; 模式只支持本地的 Ollama 和 LMStudio，不支持在线 API 中转。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最后决定暂时放弃 Codex，先把 Claude Code 用好。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;二、下载 EchoBird&lt;/h2&gt;
&lt;h3&gt;什么是 EchoBird&lt;/h3&gt;
&lt;p&gt;EchoBird 是一个桌面端的 AI Agent 管理工具，可以配置各种模型（包括国产模型），提供 GUI 界面来使用 Claude Code、Codex 等工具。简单说就是一个"AI 工具的控制面板"。&lt;/p&gt;
&lt;h3&gt;下载过程&lt;/h3&gt;
&lt;p&gt;GitHub 地址：&lt;code&gt;https://github.com/edison7009/EchoBird&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;下载 v5.1.5 Windows x64 安装包，8MB 左右。GitHub 下载速度一般，但还能接受。&lt;/p&gt;
&lt;h3&gt;体验&lt;/h3&gt;
&lt;p&gt;装好之后接入国产模型确实不错，DeepSeek、GLM 都能用。Claude Code 在小窗口里运行正常。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;三、⚠️ 重大发现：终端最大化闪退&lt;/h2&gt;
&lt;h3&gt;现象&lt;/h3&gt;
&lt;p&gt;EchoBird 里启动 Claude Code 时，会弹出一个黑色终端窗口（类似 cmd 的小窗口）。在小窗口状态下一切正常，但&lt;strong&gt;只要点最大化按钮，窗口就闪退&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;闪退之后对话丢失，找了半天不知道去哪恢复。&lt;/p&gt;
&lt;h3&gt;排查过程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;先怀疑是 EchoBird 的 bug，去 GitHub Issues 搜了一圈，没找到相关报告&lt;/li&gt;
&lt;li&gt;打开 Windows 事件查看器，发现了关键线索：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;事件名称&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BEX64&lt;/span&gt;
&lt;span class="n"&gt;P1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;conhost&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exe&lt;/span&gt;
&lt;span class="n"&gt;P8&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c0000409&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;栈缓冲区溢出&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;崩溃的不是 EchoBird，是 &lt;code&gt;conhost.exe&lt;/code&gt;！&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;conhost.exe&lt;/code&gt; 是 Windows 的控制台主机进程，所有终端窗口（cmd、PowerShell、以及 EchoBird 里嵌入的终端）都靠它来渲染。&lt;/p&gt;
&lt;h3&gt;根本原因&lt;/h3&gt;
&lt;p&gt;我的 Windows 10 版本是 &lt;code&gt;10.0.19041&lt;/code&gt;（2004 版），这个版本的 &lt;code&gt;conhost.exe&lt;/code&gt; 有已知的窗口大小调整崩溃 bug。当终端窗口从小尺寸突然变为最大化时，触发了缓冲区溢出，直接崩掉。&lt;/p&gt;
&lt;h3&gt;解决办法&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方案&lt;/th&gt;
&lt;th&gt;操作&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;最佳&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;更新 Windows 10 到最新版本，微软已修复此 bug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;临时&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;不用最大化按钮，用 &lt;code&gt;Win + ←/→&lt;/code&gt; 分屏，或拖拽窗口边框&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;进阶&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;安装 Windows Terminal 替代 conhost&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;恢复丢失的对话&lt;/h3&gt;
&lt;p&gt;好消息是 Claude Code 的对话历史保存在本地：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;C:\Users\asus\.claude\projects\
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;恢复命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;claude&lt;span class="w"&gt; &lt;/span&gt;--resume&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="c1"&gt;# 选择恢复哪个对话&lt;/span&gt;
claude&lt;span class="w"&gt; &lt;/span&gt;--resume&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;session-id&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# 恢复指定对话&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h2&gt;四、更新 DeepSeek API Key&lt;/h2&gt;
&lt;h3&gt;问题&lt;/h3&gt;
&lt;p&gt;之前的 DeepSeek API Key 过期了，Claude Code 连不上 DeepSeek。&lt;/p&gt;
&lt;h3&gt;解决&lt;/h3&gt;
&lt;p&gt;去 &lt;code&gt;https://platform.deepseek.com/api_keys&lt;/code&gt; 新建了一个 Key，然后更新了三个地方：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Hermes 配置文件&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# C:\Users\asus\.hermes\config.yaml&lt;/span&gt;
&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;deepseek&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;sk-新Key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2. 系统环境变量&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="no"&gt;[System.Environment]&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;DEEPSEEK_API_KEY&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;新Key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;User&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;3. VS Code Cline 插件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cline 的 API Key 存在 VS Code 的加密存储里，需要在插件设置界面手动更新。&lt;/p&gt;
&lt;p&gt;⚠️ &lt;strong&gt;教训：换 Key 的时候要记得所有用到这个 Key 的地方都要改，不然就会出现"这边能用那边不能用"的诡异问题。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;五、今天踩的坑总结&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;th&gt;解决&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Codex 连不上&lt;/td&gt;
&lt;td&gt;国内网络无法访问 chatgpt.com&lt;/td&gt;
&lt;td&gt;暂时无解，等网络环境改善&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Codex 接 DeepSeek 无响应&lt;/td&gt;
&lt;td&gt;Responses API 和 Chat Completions API 不兼容&lt;/td&gt;
&lt;td&gt;放弃 Codex，用 Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;终端最大化闪退&lt;/td&gt;
&lt;td&gt;conhost.exe 栈溢出（Win10 旧版本 bug）&lt;/td&gt;
&lt;td&gt;更新系统或不点最大化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Claude Code 连不上 DeepSeek&lt;/td&gt;
&lt;td&gt;API Key 过期&lt;/td&gt;
&lt;td&gt;新建 Key，更新所有配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;换 Key 后 Cline 还是不能用&lt;/td&gt;
&lt;td&gt;只改了部分配置，遗漏了 VS Code 插件&lt;/td&gt;
&lt;td&gt;手动在插件设置里更新&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;六、花了多少钱&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;花费&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek API&lt;/td&gt;
&lt;td&gt;充值中（旧 Key 过期）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex CLI&lt;/td&gt;
&lt;td&gt;免费（但用不了）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EchoBird&lt;/td&gt;
&lt;td&gt;免费&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;免费（接 DeepSeek 用）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;其他工具&lt;/td&gt;
&lt;td&gt;免费&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;今天的花费：&lt;strong&gt;基本为零&lt;/strong&gt;，主要花的是时间和耐心。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;七、接下来的计划&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 测试 EchoBird + Codex 接国产模型的效果&lt;/li&gt;
&lt;li&gt;[ ] 更新 Windows 系统，修复 conhost 闪退问题&lt;/li&gt;
&lt;li&gt;[ ] 把博客自动部署到 Cloudflare Pages&lt;/li&gt;
&lt;li&gt;[ ] 继续学 Python&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;感想&lt;/h2&gt;
&lt;p&gt;今天最大的收获不是装了什么工具，而是学会了&lt;strong&gt;排查问题的方法&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;终端闪退的时候，第一反应是"EchoBird 有 bug"。但实际去事件查看器一查，发现是 Windows 系统的问题。&lt;strong&gt;不要凭感觉猜，要看日志。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;还有就是：&lt;strong&gt;换 API Key 的时候，一定要把所有用到的地方都找出来一起改。&lt;/strong&gt; 这个教训值一顿火锅。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ZeroToDev，Day 2 完成 ✅&lt;/strong&gt;&lt;/p&gt;</content><category term="博客"/><category term="Codex"/><category term="EchoBird"/><category term="DeepSeek"/><category term="Claude Code"/><category term="API Key"/><category term="环境变量"/><category term="conhost"/></entry><entry><title>Day 1：从不知道博客是什么，到拥有自己的网站</title><link href="https://zerotodev-4jq.pages.dev/day1-summary.html" rel="alternate"/><published>2026-06-01T22:49:00+08:00</published><updated>2026-06-01T22:49:00+08:00</updated><author><name>ZeroToDev</name></author><id>tag:zerotodev-4jq.pages.dev,2026-06-01:/day1-summary.html</id><summary type="html">&lt;p&gt;一个编程小白的第一天，从零开始搭建个人网站的完整记录&lt;/p&gt;</summary><content type="html">&lt;h2&gt;起因&lt;/h2&gt;
&lt;p&gt;说实话，今天之前我连"博客"是什么都不太清楚。就知道别人老说"写个博客"，心想那是个啥？&lt;/p&gt;
&lt;p&gt;最近 AI 火了，装了个 Claude 试了试，一用就上瘾了。然后又搞了 VS Code、OpenClaw、DeepSeek API、小米 API，前前后后花了几十块钱。还用 Python 做了一个 C 盘清理工具叫 &lt;strong&gt;CleanBuddy&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;做了东西总得有个地方放吧？于是就有了这个网站。&lt;/p&gt;
&lt;h2&gt;今天干了啥&lt;/h2&gt;
&lt;h3&gt;1. 装了 Pelican&lt;/h3&gt;
&lt;p&gt;Pelican 是一个用 Python 写的静态网站生成器。你只需要写 Markdown 文件，它帮你生成整个网站。对我这种小白太友好了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;pelican&lt;span class="w"&gt; &lt;/span&gt;markdown
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;一行命令搞定。&lt;/p&gt;
&lt;h3&gt;2. 选了名字&lt;/h3&gt;
&lt;p&gt;想了很久，最后选了 &lt;strong&gt;ZeroToDev&lt;/strong&gt; —— 从零到开发者。因为这就是我的故事。&lt;/p&gt;
&lt;h3&gt;3. 写了第一篇博客&lt;/h3&gt;
&lt;p&gt;其实就是把我的经历写下来：怎么装的 Claude，怎么上瘾的，怎么做出来的 CleanBuddy。写 Markdown 比想象中简单多了。&lt;/p&gt;
&lt;h3&gt;4. 注册了 Gitee&lt;/h3&gt;
&lt;p&gt;本来想用 GitHub，结果网络不稳定连不上。改用 Gitee（码云），国内的，速度快，中文界面。&lt;/p&gt;
&lt;h3&gt;5. 上传了 CleanBuddy 源码&lt;/h3&gt;
&lt;p&gt;用 Git 把代码传到了 Gitee，第一次用 Git，踩了不少坑：
- 跑错目录，差点把整个电脑的文件都传上去
- 密码认证失败，改用 SSH 密钥
- 仓库地址末尾多了个 &lt;code&gt;+&lt;/code&gt; 号，死活传不上去&lt;/p&gt;
&lt;p&gt;但最后都解决了。&lt;/p&gt;
&lt;h3&gt;6. 网站部署&lt;/h3&gt;
&lt;p&gt;把网站代码也传到了 Gitee，准备用 Gitee Pages 部署上线。&lt;/p&gt;
&lt;h2&gt;花了多少钱&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;花费&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek API&lt;/td&gt;
&lt;td&gt;几十块&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;小米 API&lt;/td&gt;
&lt;td&gt;几十块&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;免费试用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;免费&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenClaw&lt;/td&gt;
&lt;td&gt;免费&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gitee&lt;/td&gt;
&lt;td&gt;免费&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pelican&lt;/td&gt;
&lt;td&gt;免费&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;总花费：&lt;strong&gt;几十块&lt;/strong&gt;。比一顿火锅便宜，但学到的东西比火锅多。&lt;/p&gt;
&lt;h2&gt;踩的坑&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Git 跑错目录&lt;/strong&gt; — 在用户根目录初始化了仓库，差点把所有个人文件都传上去。教训：&lt;code&gt;cd&lt;/code&gt; 到项目目录再操作！&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gitee 密码认证失败&lt;/strong&gt; — 现在 Gitee 不让用密码推送代码了，要用 SSH 密钥或者私人令牌。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仓库地址多了个 &lt;code&gt;+&lt;/code&gt; 号&lt;/strong&gt; — 一个小符号导致 404 错误，排查了半天。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;接下来的计划&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;完善 CleanBuddy 的功能&lt;/li&gt;
&lt;li&gt;做一个小游戏&lt;/li&gt;
&lt;li&gt;继续学 Python&lt;/li&gt;
&lt;li&gt;把网站设计得好看一点&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;感想&lt;/h2&gt;
&lt;p&gt;一天前我还不知道博客是什么，现在已经有了自己的网站、自己的代码仓库、自己的第一篇博客。&lt;/p&gt;
&lt;p&gt;技术这东西，真的不用等"准备好了"再开始。边做边学，遇到问题解决问题，这就是编程的乐趣。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ZeroToDev，Day 1 完成 ✅&lt;/strong&gt;&lt;/p&gt;</content><category term="博客"/><category term="起步"/><category term="AI"/><category term="Gitee"/><category term="Python"/><category term="个人网站"/></entry><entry><title>从零开始：一个编程小白的折腾记录</title><link href="https://zerotodev-4jq.pages.dev/first-post.html" rel="alternate"/><published>2026-06-01T20:30:00+08:00</published><updated>2026-06-01T20:30:00+08:00</updated><author><name>ZeroToDev</name></author><id>tag:zerotodev-4jq.pages.dev,2026-06-01:/first-post.html</id><summary type="html">&lt;p&gt;从装 Claude 到做出第一个程序，记录我从零开始的故事&lt;/p&gt;</summary><content type="html">&lt;p&gt;嗨，我是 ZeroToDev。&lt;/p&gt;
&lt;h2&gt;起因&lt;/h2&gt;
&lt;p&gt;最近 AI 很火，我装了个 Claude 试了试，没想到一用就上瘾了。&lt;/p&gt;
&lt;p&gt;从一个完全不懂代码的小白，一路折腾到现在，我已经搞了不少东西：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; — AI 编程助手，装了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VS Code&lt;/strong&gt; — 代码编辑器，装了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt; — AI 助手平台，也装了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DeepSeek API&lt;/strong&gt; — 买了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小米 API&lt;/strong&gt; — 也买了&lt;/li&gt;
&lt;li&gt;还用 Python 做了第一个程序 &lt;strong&gt;CleanBuddy&lt;/strong&gt;，已经打包好了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前前后后花了几十块钱，但比起学到的东西，太值了。&lt;/p&gt;
&lt;h2&gt;为什么要做这个网站&lt;/h2&gt;
&lt;p&gt;做出来的东西总得有个地方放吧？而且我也想记录下整个过程——从啥都不会，到能做出东西来。&lt;/p&gt;
&lt;p&gt;这个网站就是我的实验基地：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;放我做的软件和小工具&lt;/li&gt;
&lt;li&gt;记录学习过程中的坑和收获&lt;/li&gt;
&lt;li&gt;看看一年后我能走到哪&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;接下来的计划&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;把 CleanBuddy 完善一下&lt;/li&gt;
&lt;li&gt;做一个小游戏&lt;/li&gt;
&lt;li&gt;继续学 Python 和 Web 开发&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;欢迎围观一个编程小白的逆袭之路 🚀&lt;/p&gt;</content><category term="博客"/><category term="起步"/><category term="AI"/><category term="Python"/></entry></feed>