{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "银铃的开发笔记与工具箱",
  "home_page_url": "https://fukalous.com",
  "feed_url": "https://fukalous.com/feed.json",
  "language": "zh-CN",
  "items": [
    {
      "id": "https://fukalous.com/blog/how-this-site-works/",
      "url": "https://fukalous.com/blog/how-this-site-works/",
      "title": "这个站点是怎么搭起来的",
      "summary": "Astro 静态站 + GitHub Actions 定时同步贡献数据 + giscus 评论，零服务器、零数据库。",
      "content_html": "<p>一直想要一个地方，把 GitHub 上零散的贡献、写过的笔记，以及和其他人的交流放在一起。要求很简单：</p>\n<ul>\n<li><strong>不维护服务器</strong>：没有数据库，没有后端进程，挂了也不用半夜起来修</li>\n<li><strong>数据自动更新</strong>：贡献图和 PR 列表不应该靠手动截图</li>\n<li><strong>写作成本低</strong>：一个 Markdown 文件就是一篇文章</li>\n</ul>\n<h2 id=\"整体结构\"><a class=\"anchor\" href=\"#整体结构\" aria-label=\"链接到 整体结构\">#</a>整体结构</h2><figure class=\"diagram\"><img src=\"/assets/site-architecture.svg\" alt=\"站点架构：Markdown 文章与 GitHub 数据经静态构建发布，评论由 GitHub Discussions 提供。\" loading=\"lazy\" decoding=\"async\" width=\"1005\" height=\"278\"><figcaption>文章流程图</figcaption></figure><p>三块内容各有各的数据来源，但最终都是纯静态 HTML。</p>\n<aside class=\"article-note\">\n  <strong>渲染说明</strong>\n  <span>上面的流程图来自 Mermaid 源码；这条提示则是直接写在 Markdown 里的原生 HTML。</span>\n</aside>\n\n<h2 id=\"贡献数据-构建时拉取\"><a class=\"anchor\" href=\"#贡献数据-构建时拉取\" aria-label=\"链接到 贡献数据：构建时拉取\">#</a>贡献数据：构建时拉取</h2><p><code>scripts/fetch-github.mjs</code> 在 <code>astro build</code> 之前运行，用 GraphQL 一次性拿到：</p>\n<table>\n<thead>\n<tr>\n<th>数据</th>\n<th>GraphQL 字段</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>贡献热力图</td>\n<td><code>contributionsCollection.contributionCalendar</code></td>\n</tr>\n<tr>\n<td>上游 PR</td>\n<td><code>user.pullRequests</code>，过滤掉自己名下的仓库</td>\n</tr>\n<tr>\n<td>统计数字</td>\n<td><code>totalCommitContributions</code> 等</td>\n</tr>\n</tbody></table>\n<p>拉取失败时脚本会<strong>沿用上一次的快照</strong>，而不是让整个构建失败。本地没配 token 也能正常 <code>npm run dev</code>。</p>\n<p>GitHub Actions 里配置了每天一次的 <code>schedule</code>，所以即使不发文章，贡献图也会每天刷新。</p>\n<p>用一个很粗略的指标描述贡献密度：</p>\n<div class=\"math\"><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mtext>density</mtext><mo>=</mo><mfrac><mtext>active days</mtext><mtext>days since account creation</mtext></mfrac></mrow><annotation encoding=\"application/x-tex\">\\text{density} = \\frac{\\text{active days}}{\\text{days since account creation}}\n</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8889em;vertical-align:-0.1944em;\"></span><span class=\"mord text\"><span class=\"mord\">density</span></span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.2519em;vertical-align:-0.8804em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.3714em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord text\"><span class=\"mord\">days since account creation</span></span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord text\"><span class=\"mord\">active days</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8804em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span></span></span></span></span></div><h2 id=\"交流-giscus\"><a class=\"anchor\" href=\"#交流-giscus\" aria-label=\"链接到 交流：giscus\">#</a>交流：giscus</h2><p>评论系统选了 <a href=\"https://giscus.app/zh-CN\">giscus</a>，它把评论存在仓库的 GitHub Discussions 里：</p>\n<ol>\n<li>访客用 GitHub 账号登录即可评论，天然过滤掉大部分垃圾内容</li>\n<li>数据在自己的仓库里，随时可以迁移</li>\n<li>每篇文章按 <code>pathname</code> 映射到一个 Discussion，留言板则固定映射到一个 <code>term</code></li>\n</ol>\n<p>再加上一个<strong>友链页</strong>和 RSS 输出，基本覆盖了「和其他站交流」的需求。</p>\n<h2 id=\"写一篇新文章\"><a class=\"anchor\" href=\"#写一篇新文章\" aria-label=\"链接到 写一篇新文章\">#</a>写一篇新文章</h2><p>在 <code>src/content/blog/</code> 下新建一个 Markdown 文件：</p>\n<div class=\"code-block\"><div class=\"code-label\"><span>md</span><button type=\"button\" data-copy-code>复制代码</button></div><pre class=\"shiki github-light\" style=\"background-color:#fff;color:#24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#005CC5;font-weight:bold\">---</span></span>\n<span class=\"line\"><span style=\"color:#24292E\">title: 标题</span></span>\n<span class=\"line\"><span style=\"color:#24292E\">description: 一句话摘要，会出现在列表页和 RSS 里</span></span>\n<span class=\"line\"><span style=\"color:#24292E\">pubDate: 2026-10-14</span></span>\n<span class=\"line\"><span style=\"color:#24292E\">tags: [标签A, 标签B]</span></span>\n<span class=\"line\"><span style=\"color:#24292E\">draft: false</span></span>\n<span class=\"line\"><span style=\"color:#005CC5;font-weight:bold\">---</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#24292E\">正文……</span></span></code></pre></div><p><code>git push</code> 之后大约一分钟，文章就会出现在站点上。</p>\n",
      "date_published": "2026-10-14T00:00:00.000Z",
      "tags": [
        "建站",
        "Astro",
        "GitHub Actions"
      ]
    },
    {
      "id": "https://fukalous.com/blog/open-source-recap/",
      "url": "https://fukalous.com/blog/open-source-recap/",
      "title": "开源贡献阶段小结：16 个项目，34 个 PR",
      "summary": "回顾最近在 SurfSense、OpenViking、FlashRAG、ms-swift 等 AI Infra 项目上的贡献，以及踩过的坑。",
      "content_html": "<p>最近集中给一批 Agent / AI Infra 方向的开源项目提了 PR，借这个站点上线做一次小结。完整列表和实时数据见<a href=\"https://fukalous.com/github/\">开源贡献</a>页面。</p>\n<h2 id=\"数字\"><a class=\"anchor\" href=\"#数字\" aria-label=\"链接到 数字\">#</a>数字</h2><ul>\n<li>共 <strong>34</strong> 个上游 PR，覆盖 <strong>16</strong> 个仓库</li>\n<li><strong>23</strong> 个已合入，6 个仍在 review 中</li>\n<li>主要语言是 Python，零星涉及 Rust、Go、C++、Ruby、TypeScript</li>\n</ul>\n<h2 id=\"主要投入的项目\"><a class=\"anchor\" href=\"#主要投入的项目\" aria-label=\"链接到 主要投入的项目\">#</a>主要投入的项目</h2><h3 id=\"surfsense\"><a class=\"anchor\" href=\"#surfsense\" aria-label=\"链接到 SurfSense\">#</a>SurfSense</h3><p><a href=\"https://github.com/MODSetter/SurfSense\">MODSetter/SurfSense</a> 是投入最多的项目，14 个 PR 合入了 13 个。大部分集中在本地模型管理和桌面端的健壮性上，比如：</p>\n<ul>\n<li>安装受限（gated）模型仓库前先拒绝，而不是下载到一半失败</li>\n<li>复制 GGUF 文件后做一致性校验</li>\n<li>桌面端 sidecar 进程崩溃时上报原因</li>\n<li>流式输出开始前的错误不再被吞掉</li>\n</ul>\n<p>这类问题的共同点是：<strong>正常路径没毛病，边界情况下的错误信息很差</strong>。修起来改动不大，但对用户体验的影响很直接。</p>\n<h3 id=\"openviking-与-flashrag\"><a class=\"anchor\" href=\"#openviking-与-flashrag\" aria-label=\"链接到 OpenViking 与 FlashRAG\">#</a>OpenViking 与 FlashRAG</h3><p><a href=\"https://github.com/volcengine/OpenViking\">volcengine/OpenViking</a> 是面向 Agent 的上下文数据库，PR 主要涉及记忆注入和健康检查的凭证校验。</p>\n<p><a href=\"https://github.com/RUC-NLPIR/FlashRAG\">RUC-NLPIR/FlashRAG</a> 的两个 PR 都合入了：一个修复 LLM judge 打分解析，一个新增文档级检索指标。</p>\n<h3 id=\"训练框架\"><a class=\"anchor\" href=\"#训练框架\" aria-label=\"链接到 训练框架\">#</a>训练框架</h3><p><a href=\"https://github.com/modelscope/ms-swift\">modelscope/ms-swift</a> 修复了生成出错后 ZeRO-3 hooks 没有恢复的问题；<a href=\"https://github.com/MakazhanAlpamys/Soup\">MakazhanAlpamys/Soup</a> 的诊断工具增加了对长样本记忆化的检测。</p>\n<h2 id=\"几点体会\"><a class=\"anchor\" href=\"#几点体会\" aria-label=\"链接到 几点体会\">#</a>几点体会</h2><ol>\n<li><strong>先读 CONTRIBUTING 和近期合入的 PR</strong>。每个项目对 commit 格式、测试要求、changelog 的习惯都不一样，照着最近合入的 PR 写，一次通过率高很多。</li>\n<li><strong>PR 越小越好合</strong>。被关掉的几个 PR 大多是范围不够聚焦，或者和维护者的规划方向不一致。</li>\n<li><strong>错误信息是被低估的贡献方向</strong>。不需要深入理解整个系统，就能实实在在地改善用户体验。</li>\n</ol>\n<p>后面打算挑一两个具体的 PR 单独写复盘。</p>\n",
      "date_published": "2026-10-13T00:00:00.000Z",
      "tags": [
        "开源",
        "AI Infra",
        "复盘"
      ]
    }
  ]
}