个人博客终于迎来了久违的更新

写了近百篇文章,顺手把博客也重做了一遍

Posted by arganzheng | | 约 7 分钟 · 3.0k 字

才发现入职菊厂以来就再也没有写过个人博客了。最近把 AI-Infra 重新捡了起来,肝了两个周末,在 AI 的帮助下写了一篇长篇巨著《大模型推理系统揭秘:从 vLLM 看 LLM Serving Infra 核心技术》。真的是长篇巨著,将近 20 万字,所以又把它拆成了十几篇文章。

然后就有点收不住了。写完 vLLM 发现前面还有一大堆东西值得系统地梳理一遍:Python 和 C++ 在 AI-Infra 里到底用到哪些语言机制、PyTorch 从 Tensor 到 Dispatcher 到编译器是怎么串起来的、Transformer 的算量和数值怎么算、CUDA Kernel 怎么从 naive 写到 FlashAttention、NCCL / RDMA 通信、千卡训练的并行与容错、AI 平台工程、最后是怎么给 PyTorch / vLLM 提第一个 PR。整理下来变成了十个系列、近百篇文章,大概是这个博客过去十年产量的总和。

写这么多,自然就想让它们好读一点。于是顺便把博客也更新了一下——本来只是想改个目录样式,结果一路改下来,几乎把能碰的地方都碰了一遍。这篇记个流水账。

一、读起来更顺手

1. 右侧目录:可收起、可过滤

把文章详情页右边的 OUTLINE 样式优化了一下,可以展开收起来,随滚动高亮当前章节;顶部多了一个过滤框,两三万字的长文,输入几个字就能直接跳到想看的小节。

右侧目录

目录过滤

2. Markdown 对齐 GitHub 风格,支持 Mermaid 和 LaTeX

整个 Markdown 样式向 GitHub 对齐,并且支持了 Mermaid 图表和 KaTeX 数学公式。考虑到 Mermaid 生成的图可能比较大,鼠标点一下会弹出单独的图层,可以拖动、滚轮缩放、双击复位——正文里的图片也是一样,点了放大。别说,Mermaid 画出的图其实还挺好看的。

Mermaid 图放大

3. 文章头部多了一行”小字”

发表日期、最后更新日期、大概要读几分钟、多少字、多少人读过、多少人觉得有用——都在标题下面那一行。阅读时长是按去掉代码块之后的字数估的,还算靠谱。

4. 系列文章导航

十个系列、近百篇文章,仅仅靠”上一篇 / 下一篇”是翻不过来的。现在系列信息写在文章的 front matter 里,页面自动生成三样东西:文首的「本文是《…》系列的第 N 篇(共 X 篇)」引用块、文末的系列目录,以及把 Previous / Next 换成系列内的上一篇 / 下一篇。

文章头部与系列引用

文末系列目录

二、Slides:用 Markdown 写 PPT

基于 reveal.js 实现了 SLIDES 功能,可以用 Markdown 在线写 PPT 了,样式参考了 SlideShare,个人感觉还挺好看的。有一个 Slides 独立页面做索引,也可以用 keynote 布局把一份幻灯片嵌进一篇文章里,上面是片子、下面是讲稿和评论。

Slides 索引页

reveal.js 幻灯片

三、搜索和归档

站内全文搜索把原来的 Google CSE 换成了本地索引 + 前端检索:支持标题 / 标签 / 正文匹配、命中高亮,速度快多了。索引第一次打开时下载一次,之后按构建版本缓存,不用每次重下。

全文搜索

Archive 新增 Go to article:实时过滤 + 键盘导航(↑ / ↓ / Enter / Esc)+ 点击跳转,三百多篇文章不用再一路往下滚。

归档页快速定位

四、悬停就能看的解释

写技术文章常碰到一个矛盾:有些名词需要解释一下,但又不想在正文里岔开去讲。以前的办法是加个链接让读者自己跳出去,现在有两种更省事的:

  • 脚注:还是用标准的 Markdown 脚注语法写,但读者把鼠标放到脚注编号上,解释会就地弹出来,卡片里可以有代码、表格、公式。点编号才会真的跳到文末。
  • ? 的虚线词:一两句话能说清的名词,直接悬停显示。

脚注就地弹出

名词解释

站外链接会带一个小 ↗,点了在新窗口打开,站内链接不带。手机上这些都是”轻触”版本。

五、划线评论:这次最想让你试的功能

这是这轮更新里花时间最多、也最想让大家试一试的部分。

以前的评论区是文末的一个 iframe(多说、Disqus、giscus 一路换过来),读者想针对某一句话说点什么,只能在底下留言”第三节第二段那里……”。现在的做法更像微信读书或者 Code Review:用鼠标选中正文里任意一段文字,选区上方浮出一个小工具条——「评论」「复制」「搜一搜」和一个分享链接图标。

选中文字的工具条

点「评论」,段落下方就地展开一个输入框,顶部引用着你选的原文。支持 Markdown,有撰写 / 预览和一排格式按钮。

就地展开的评论框

发表之后,那段文字变成淡黄色,段尾多一个带数字的小标记。点标记或点高亮,就能展开这段文字下面的全部讨论——回复、投票,作者的回复带一个「作者」小徽章。同一段文字只有一个讨论串,不会各说各的。

某一段文字下的讨论串

拉到文章底部还是传统的评论区,同一个讨论串,同一套编辑器。几个顺手加的东西:

  • 顶部的「有用」按钮和阅读数——觉得文章有用点一下,这是比阅读量更有信息量的反馈。
  • 每条评论右侧有 ▲ 分数 ▼,赞同或反对,一人一票。
  • 一篇文章被划了多处之后,评论区顶部会出现「最受关注的段落」——被划得最多、投票最高的几句话,某种意义上就是这篇文章的读者版摘要。
  • 发现我写错了,发表时勾上「同时提交 Issue」,会在博客仓库开一个 Issue 并署你的名字,评论上带一个红旗徽章——这是我处理勘误的工作队列。

文末评论区

所有数据都存在这篇文章对应的 GitHub Discussions 里,登录用 GitHub,本站不保存任何凭据。自己发的评论可以原地编辑、删除;有人回复你,GitHub 会按你的通知设置发邮件。

六、手机上也一样

页面是响应式的:手机上侧栏挪到底部、目录收成一个按钮、代码和表格左右滑动而不是挤在一起。字体跟随系统,不下载任何网络字体,所以打开很快也不会闪一下换字体。悬停解释、划线评论、图放大,在手机上都是轻触版本。

手机上的评论区

七、Tech 和 Life 分开

博客里除了技术文章,偶尔也有几篇随笔——瑜伽、感恩节、走出象牙塔之类。以前它们混在技术文章的时间线里,基本没人看得到。现在导航栏分成 TechLife 两栏:首页只放技术文章,生活类的去 Life 页面,用各篇的题图做卡片。首页还支持置顶,把《致读者的一封信》钉在了最上面——那篇是给读者看的”说明书”,上面说的这些功能怎么用,那里写得更细。

首页

Life 页面

八、看不见的部分

还有一些读者感觉不到、但让我省心不少的改动,一句话带过:

  • GitHub Pages 从自带的 Jekyll 3 构建换成了 GitHub Actions + Jekyll 4.4,本地和线上终于是同一个版本;每天凌晨定时构建一次,写好未来日期的文章会自动在那天上线。
  • 每次提交都跑一遍 CI:构建、用 lychee 检查全站两万多个内部链接和锚点、再用无头 Chrome 把改动的文章真的渲染一遍,看 Mermaid 有没有画出来、图片有没有 404。每周一还会检查一次外链,坏了就自动开一个 Issue。
  • 文章图片全部转成 WebP(20 MB → 5.8 MB),Font Awesome 改成只含用到的图标的子集(77 KB → 20 KB),静态资源按构建版本缓存。
  • 补齐了 Open Graph / Twitter Card / JSON-LD、RSS 自动发现、强制 HTTPS——分享到微信和推特时终于有正常的卡片了。

顺便说一句,这轮改动里的大部分代码是和 AI 结对写出来的:我说要什么、看效果、挑毛病,它写。写文章也是类似的分工。效率确实和以前不是一个量级——但要什么、什么是对的,还是得自己想清楚。

最后

博客地址:https://arganzheng.life/,基于 GitHub Pages 搭建,喜欢的同学可以直接 fork。

感觉还是要把博客重新捡起来,强迫自己学习和思考。与君共勉。


COMMENTS

评论存放在 GitHub Discussions, 用 GitHub 账号登录即可发表,支持 Markdown。 想针对正文某句话说?选中那段文字,点浮出的「评论」即可划线评论;觉得哪里写错了,发表时勾上「同时提交 Issue」。 有人回复你时 GitHub 会按你的通知设置发邮件,不用守在这里。

×