<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>银铃的开发笔记与工具箱</title><link>https://fukalous.com</link><description>作品、文字与小工具</description><language>zh-CN</language><item><title>这个站点是怎么搭起来的</title><link>https://fukalous.com/blog/how-this-site-works/</link><guid>https://fukalous.com/blog/how-this-site-works/</guid><pubDate>Wed, 14 Oct 2026 00:00:00 GMT</pubDate><description>Astro 静态站 + GitHub Actions 定时同步贡献数据 + giscus 评论，零服务器、零数据库。</description><content:encoded><![CDATA[<p>一直想要一个地方，把 GitHub 上零散的贡献、写过的笔记，以及和其他人的交流放在一起。要求很简单：</p>
<ul>
<li><strong>不维护服务器</strong>：没有数据库，没有后端进程，挂了也不用半夜起来修</li>
<li><strong>数据自动更新</strong>：贡献图和 PR 列表不应该靠手动截图</li>
<li><strong>写作成本低</strong>：一个 Markdown 文件就是一篇文章</li>
</ul>
<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>
<aside class="article-note">
  <strong>渲染说明</strong>
  <span>上面的流程图来自 Mermaid 源码；这条提示则是直接写在 Markdown 里的原生 HTML。</span>
</aside>

<h2 id="贡献数据-构建时拉取"><a class="anchor" href="#贡献数据-构建时拉取" aria-label="链接到 贡献数据：构建时拉取">#</a>贡献数据：构建时拉取</h2><p><code>scripts/fetch-github.mjs</code> 在 <code>astro build</code> 之前运行，用 GraphQL 一次性拿到：</p>
<table>
<thead>
<tr>
<th>数据</th>
<th>GraphQL 字段</th>
</tr>
</thead>
<tbody><tr>
<td>贡献热力图</td>
<td><code>contributionsCollection.contributionCalendar</code></td>
</tr>
<tr>
<td>上游 PR</td>
<td><code>user.pullRequests</code>，过滤掉自己名下的仓库</td>
</tr>
<tr>
<td>统计数字</td>
<td><code>totalCommitContributions</code> 等</td>
</tr>
</tbody></table>
<p>拉取失败时脚本会<strong>沿用上一次的快照</strong>，而不是让整个构建失败。本地没配 token 也能正常 <code>npm run dev</code>。</p>
<p>GitHub Actions 里配置了每天一次的 <code>schedule</code>，所以即使不发文章，贡献图也会每天刷新。</p>
<p>用一个很粗略的指标描述贡献密度：</p>
<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}}
</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>
<ol>
<li>访客用 GitHub 账号登录即可评论，天然过滤掉大部分垃圾内容</li>
<li>数据在自己的仓库里，随时可以迁移</li>
<li>每篇文章按 <code>pathname</code> 映射到一个 Discussion，留言板则固定映射到一个 <code>term</code></li>
</ol>
<p>再加上一个<strong>友链页</strong>和 RSS 输出，基本覆盖了「和其他站交流」的需求。</p>
<h2 id="写一篇新文章"><a class="anchor" href="#写一篇新文章" aria-label="链接到 写一篇新文章">#</a>写一篇新文章</h2><p>在 <code>src/content/blog/</code> 下新建一个 Markdown 文件：</p>
<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>
<span class="line"><span style="color:#24292E">title: 标题</span></span>
<span class="line"><span style="color:#24292E">description: 一句话摘要，会出现在列表页和 RSS 里</span></span>
<span class="line"><span style="color:#24292E">pubDate: 2026-10-14</span></span>
<span class="line"><span style="color:#24292E">tags: [标签A, 标签B]</span></span>
<span class="line"><span style="color:#24292E">draft: false</span></span>
<span class="line"><span style="color:#005CC5;font-weight:bold">---</span></span>
<span class="line"></span>
<span class="line"><span style="color:#24292E">正文……</span></span></code></pre></div><p><code>git push</code> 之后大约一分钟，文章就会出现在站点上。</p>
]]></content:encoded><category>建站</category><category>Astro</category><category>GitHub Actions</category></item><item><title>开源贡献阶段小结：16 个项目，34 个 PR</title><link>https://fukalous.com/blog/open-source-recap/</link><guid>https://fukalous.com/blog/open-source-recap/</guid><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><description>回顾最近在 SurfSense、OpenViking、FlashRAG、ms-swift 等 AI Infra 项目上的贡献，以及踩过的坑。</description><content:encoded><![CDATA[<p>最近集中给一批 Agent / AI Infra 方向的开源项目提了 PR，借这个站点上线做一次小结。完整列表和实时数据见<a href="https://fukalous.com/github/">开源贡献</a>页面。</p>
<h2 id="数字"><a class="anchor" href="#数字" aria-label="链接到 数字">#</a>数字</h2><ul>
<li>共 <strong>34</strong> 个上游 PR，覆盖 <strong>16</strong> 个仓库</li>
<li><strong>23</strong> 个已合入，6 个仍在 review 中</li>
<li>主要语言是 Python，零星涉及 Rust、Go、C++、Ruby、TypeScript</li>
</ul>
<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>
<ul>
<li>安装受限（gated）模型仓库前先拒绝，而不是下载到一半失败</li>
<li>复制 GGUF 文件后做一致性校验</li>
<li>桌面端 sidecar 进程崩溃时上报原因</li>
<li>流式输出开始前的错误不再被吞掉</li>
</ul>
<p>这类问题的共同点是：<strong>正常路径没毛病，边界情况下的错误信息很差</strong>。修起来改动不大，但对用户体验的影响很直接。</p>
<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>
<p><a href="https://github.com/RUC-NLPIR/FlashRAG">RUC-NLPIR/FlashRAG</a> 的两个 PR 都合入了：一个修复 LLM judge 打分解析，一个新增文档级检索指标。</p>
<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>
<h2 id="几点体会"><a class="anchor" href="#几点体会" aria-label="链接到 几点体会">#</a>几点体会</h2><ol>
<li><strong>先读 CONTRIBUTING 和近期合入的 PR</strong>。每个项目对 commit 格式、测试要求、changelog 的习惯都不一样，照着最近合入的 PR 写，一次通过率高很多。</li>
<li><strong>PR 越小越好合</strong>。被关掉的几个 PR 大多是范围不够聚焦，或者和维护者的规划方向不一致。</li>
<li><strong>错误信息是被低估的贡献方向</strong>。不需要深入理解整个系统，就能实实在在地改善用户体验。</li>
</ol>
<p>后面打算挑一两个具体的 PR 单独写复盘。</p>
]]></content:encoded><category>开源</category><category>AI Infra</category><category>复盘</category></item></channel></rss>