给已有系统加「首登强制改密」:一个跨切面开关的设计
给一套已经上线的系统加「首次登录必须改密码」,功能本身很小——但它是个跨切面需求:登录、鉴权守卫、管理员操作、初始化数据,每一处都得知道这件事。
这类需求最容易做法是「在守卫里判断一下」,然后很快发现:登录响应没告诉前端要不要跳转、管理员重置完口令用户进不去、初始化脚本种下去的管理员第一步就被拦住。
这次的做法是先把开关的语义定死,再逐处接线。记一下过程,以及容器里踩的两个坑。
给一套已经上线的系统加「首次登录必须改密码」,功能本身很小——但它是个跨切面需求:登录、鉴权守卫、管理员操作、初始化数据,每一处都得知道这件事。
这类需求最容易做法是「在守卫里判断一下」,然后很快发现:登录响应没告诉前端要不要跳转、管理员重置完口令用户进不去、初始化脚本种下去的管理员第一步就被拦住。
这次的做法是先把开关的语义定死,再逐处接线。记一下过程,以及容器里踩的两个坑。
维护一个「跟着上游走、又带自己改动」的分支,最容易低估的不是冲突数量,而是上游顺手把你依赖的基础设施也改了。
这个月的一次上游同步可以当样本:5231 个文件、+21.6 万 / −61.1 万,看着吓人,但真正与本分支有交集的只有约 80 个文件、11 个内容冲突。冲突一个下午就解完了,剩下的时间全花在「上游把测试框架整个换掉」这件事上。
这篇按这次的实际顺序记一遍。
改完代码、跑通测试、部署上线——到这一步很多人就收工了。
但这个月有四次,“看起来修好了”和”真的修好了”之间差着一次取证:一次是日志里还有旧报错、一次是打包显示成功但关键步骤没执行、一次是审计报告把数据问题写成了代码 bug、还有一次是构建失败其实是本机网络的问题。
这篇记一下取证的具体做法。
给一套跑了多年的管理后台补移动端,最常见的做法是再做一套 m.* 视图:复制一份模板、改改布局,按 UA 分流出不同的控制器。
这个方案看着干净,实际代价很高——这个项目有 488 个视图,复制一份就是 488 个新的维护点,之后每个功能改动都要改两遍。
这次换了个做法:不加视图,只重做响应式层。三个文件、一次断点调整,覆盖从 320px 手机到桌面的全部宽度。过程里踩的坑比预想的多,记一下。
用 Rust + egui 重写一个 MarkText 风格的 Markdown 编辑器,功能本身不难——难的是三件事:输入法要能用中文、导出要能看、大文件要能不卡。
这三件事有个共同点:写完不报错,用起来才发现不行。输入法不接就是打不出字,导出不处理就是一堆方块,每帧哈希就是滚动条抖。这篇把这三个方向上的具体坑记下来,顺带记两处桌面集成的连带问题。
给 AI agent 加”长期记忆”,第一版几乎都会这么做:在系统提示里约定一个 MEMORY.md,让模型”觉得重要就自己写进去”,下一轮再把它读回来。
能跑,但撑不过几周。这篇记录把它换成 SQLite 主库的过程,以及同一时期在流式管道、定时任务、客户端联网边界上踩到的坑。
一个 Fedora 上管理 Copr / OBS 第三方源的命令行工具,跑了一遍 pytest:124 个测试全绿,ruff 和 mypy 也没有意见。看起来挺健康。
但实际用起来,copa audit 稳定崩溃、多关键词搜索搜不到东西、正则搜索永远空、标着”高风险”的仓库照样能装。单元测试覆盖的是函数,不是集成路径——这些缺陷没有一个能在单元测试里暴露。
这篇记录那次审计找出的一批真实缺陷、修法,以及中文化和打包时另外两个坑。
这个月做了一堆看起来毫不相干的事:给一个模拟器写 AVX-512 优化、给桌面应用补 FreeBSD 安装包、把一个 Node 项目从空库跑起来、修一个 Electron 分支的冷启动白屏、给两本开源书提 PR。
它们的共同点是:每一个都在”看起来已经完成”的地方翻车。
这篇按”验证”这条线把它们串起来。
给一套老系统接 MCP(Model Context Protocol),让 AI 客户端能直接读写业务数据,是这两年被问得很多的需求。真正做起来会发现:协议本身不难,难的是”人”——谁在操作、怎么证明是他、出了问题怎么追溯。
本文记录一次自建 MCP 服务端的完整过程,重点在认证设计上翻过的车。
打包分发的坑分两类:CI 的「静默吞」与发行版差异。这篇把开源项目的多平台打包(RPM / DEB / Arch / Electron / AppImage)、CI 流水线,以及 overlay 隔离层与 FreeBSD 移植的经验收在一起。