Alex Chan

9 篇内容

工具笔记Alex Chan

gobench: a tool for comparing Go benchmark runs across branches

文章介绍作者为性能敏感团队开发的 gobench 工具,用于跨 Git 分支比较 Go benchmark 结果。原有 shell 脚本配合 benchstat 虽能多次采样并统计差异,但需要手动切换提交、遗留临时文件,还会让仓库进入 detached HEAD 状态。gobench 通过创建临时 Git worktree、在内存中捕获输出、交替采样两个分支来改善体验,并用递归与迭代 Fibonacci 的示例展示 benchstat 表格和性能差异。工具本身是 Go 程序,调用 git、go test 和 benchstat,适合需要频繁验证 Go 性能回归的开发者;边界是依赖 Git 分支与 benchstat 生态。

推荐收录,因为文章不仅介绍工具用法,还交代了现有 shell+benchstat 流程的痛点、临时 worktree、内存捕获和交替采样等设计动机,并给出可验证的 benchmark 示例。对需要频繁比较 Go 分支性能、降低本机噪声影响的开发者有直接迁移价值;主要局限是场景集中在 Git 分支对比和 benchstat 工作流。

工具笔记Alex Chan

Verifying my web archives with Playwright

文章介绍作者用 Playwright 自动验证个人网页存档是否自包含:监听 request 事件收集页面加载请求,以 is_external_request 判断是否同源,并检查页面异常、控制台错误、非 GET 请求等。作者还通过强制 reflow 触发懒加载资源,用不同 BrowserContext 模拟明暗模式和像素密度,并缓存验证结果以控制耗时。实践显示首轮检查能发现缺失字体和图片,补全后页面可通过;但响应式图片、外观设置和交互触发资源仍可能漏检。该方法适合简单静态博客存档,复杂页面需增加交互和多环境覆盖,并权衡验证时间与覆盖率。

推荐收录:文章给出了可运行的 Playwright 请求监听与同源判定代码,并说明强制 reflow、BrowserContext 多环境验证和结果缓存等工程细节,属于可迁移的工具工作流。适合做网页存档、静态站点检查、CSP 配置验证或前端资源审计的开发者参考;局限是仅覆盖初始加载场景,复杂交互页面需自行扩展,且不能保证 100% 自包含。

工程实践Alex Chan

Positive alerts in Prometheus

文章复盘 Prometheus 中一个抖动告警的处理:服务队列繁忙时 worker 线程挤占 Web 服务器,导致 /metrics 抓取间歇失败,基于 up 指标和 avg_over_time 的告警反复触发。作者没有只依赖 Alertmanager Silence,而是把故障实例从原告警排除,并新增“正向告警”:当该实例 30 分钟窗口内 up 平均值不低于 0.95 且持续 14 天时,以 info 级别提醒移除例外。文中给出完整 PromQL/YAML 示例,并说明同事修复服务、连续两周稳定后告警按预期触发。该方案适合临时抑制已知问题并需要自动提醒恢复,但若指标不能代表真实健康状态或修复周期不确定,持续时间与例外范围需谨慎设置。

推荐收录,因为它给出了可复现的 PromQL/YAML 配置和完整问题背景,不是泛泛谈告警治理,而是展示了 Silence 与正向告警之间的取舍。对负责 SRE、值班和可观测性建设的读者,这种用稳定窗口提醒清理临时例外的方法可直接迁移;风险是 14 天持续窗口和指标选择需结合真实健康语义评估。

技术文章Alex Chan

Parametrised tests in Rust with named parameters

文章介绍如何在 Rust 中实现带命名参数的参数化/表驱动测试,以缩略图工具为例,希望测试逻辑写一次、多组输入复用。作者比较 for 循环、位置参数宏与 rstest、parameterized、yare 等第三方库,但因个人项目想学习宏而手写 macro_rules!。核心是让 matcher 匹配类似结构体的命名字段,再由 transcriber 为每个用例生成独立 #[test] 函数,并解释 $(...)*、元变量与 matcher/transcriber 机制。结论是命名用例更自文档化、用例相互隔离且便于新增。边界在于示例面向小型个人 Rust 工具,未做生产级库选型或充分基准,宏模式也绑定特定测试结构。

推荐收录:文章给出完整的 macro_rules! 定义、matcher/transcriber 拆解和生成代码示例,并对比 for 循环、位置参数宏和第三方库,证据充分。适合正在写 Rust 测试或想理解声明式宏的开发者,可迁移到表驱动测试、代码生成和减少样板代码的场景。需注意作者刻意不用第三方库且项目规模小,生产选型仍需结合 rstest/yare 等方案的维护成本。

工具笔记Alex Chan

Abusing ID3 chapters to turn videos into glanceable podcasts

文章介绍一种把视频转成可在播客应用中扫读的 MP3 的工作流:先用 FFmpeg 提取音轨,并按固定间隔抽帧生成缩略图;再用 Python Mutagen 把每帧作为隐藏的 ID3 CHAP 章节封面写入 MP3。由于 Overcast 支持章节和逐章封面,播放时锁屏或 Now Playing 会以每几秒一帧的慢速定格方式呈现视频画面,从而兼顾音频收听和视觉上下文。作者说明了 CHAP/APIC 帧、FFmpeg fps/scale 滤镜、省略 CTOC 目录以避免数百章节列表等细节,并给出 glancecast 脚本。该方案依赖特定播客应用的章节展示能力,转码速度、竖屏缩放和视觉信息密度也有边界,但作为个人内容消费工具链具有可迁移性。

推荐收录:文章给出了可复现的完整工具链,包括 FFmpeg 抽帧/转码命令、Mutagen 写入 ID3 隐藏章节的代码和验证方式,不是泛泛介绍。适合愿意折腾播客播放器、音视频元数据或自动化工作流的开发者,可迁移到为音频补充视觉上下文、批量生成章节封面等场景;主要风险是强依赖 Overcast 的章节实现,且对需要高保真视频信息的场景不适用。

技术文章Alex Chan

Why can’t you combine <code>.tar.gz</code> files with <code>cat</code>?

作者在项目中需要合并多个 .tar.gz 文件,起初尝试用 cat 直接拼接字节却失败,于是深入剖析 tar 和 gzip 的格式原理。文章指出 tar 源于磁带存储,采用顺序读取、追加写入和固定块大小,文件尾部有全零 EOF 标记,读者遇到它就会停止,因此直接拼接 tar 会导致第二个归档被忽略。gzip 是受专利法影响而设计的流式压缩器,由多个成员首尾相连组成,没有 EOF 标记,所以可以安全地用 cat 拼接。但当 gzip 与 tar 结合时,解压流中 tar 的 EOF 标记依然会让 tar 提前停止。最终作者用 Python tarfile 模块解包每个归档再重新写入,生成带单一 EOF 标记的新归档,并给出了 r:gz / w:gz 的完整代码。文章还讨论了文件大小需预先声明、重复文件名覆盖行为、EOF 后内容被忽略等边界,适合需要深入理解文件格式或处理归档合并的读者。

推荐收录。文章从一个常见却易被误解的实际问题切入,清晰揭示了 tar 与 gzip 在数据组织方式上的本质差异,帮助读者建立长期可用的格式心智模型。对从事数据管道、文件工具开发或需要处理归档格式的工程师,文中的原理解释和 Python 解决方案都可直接迁移。

工程实践Alex Chan

Fixing a bug with byte order marks

作者在整理本地媒体库字幕并统一为WebVTT格式时,遇到UTF-8字节顺序标记(BOM)导致SRT转换异常的bug。文章先解释BOM的原理及其在UTF-8编码中的具体字节序列,然后展示BOM与序列号混合导致解析失败的现象。修复方案从最初手动检测和移除,优化为利用Python的encoding="utf-8-sig"自动跳过BOM,使转换代码回归纯净。对于已经生成的错误文件,作者使用ripgrep结合字节模式(?-u:\xEF\xBB\xBF)搜索文件中的BOM,并通过脚本批量清理,最后用ripgrep和Git仓库双重验证修复结果。整个过程串联了字符编码知识、工具选择和验证手段,是典型的文本处理工程调试案例。

推荐收录,因为该案例通过一个真实的文本编码陷阱,展示了从原理理解到优雅修复的完整路径。文中提供的utf-8-sig编码技巧和ripgrep字节搜索模式可直接迁移到其他处理多编码文件的场景,尤其适合需要处理外部数据来源的开发者。同时,它强调了理解底层细节对快速定位问题的重要性,对提升工程调试能力有实际参考价值。

工具笔记Alex Chan

Describing all my photos

文章先提出一个很具体的个人管理策略:作者每周整理相机胶卷,把照片分成保留、删除和“待处理”三类,并进一步要求每张保留照片都写上一两句说明,记录拍摄时的场景和心情。作者认为这种轻量元数据能显著增强照片作为“生活记录”的价值,也能反过来促使自己更谨慎地筛选照片,因为说不清意义的图片未必值得长期保留。随后文章转到工具实现:作者把这一能力加进自写的 Blink Mac 应用,通过快捷键浏览、分类,并用底部覆盖层编辑 caption,保持全程键盘操作。最后作者回顾了重返旧代码库的维护成本,强调注释和文档对长期可读性的重要性,并把这个“只为自己服务”的小软件视为成功案例。文章的边界也很明确:它主要适合个人照片归档和单用户工具,不讨论通用产品化、同步或多用户协作。

文中不仅描述了“给照片写说明”的个人习惯,还给出了可落地的工具设计:键盘优先、轻量编辑、保留上下文元数据,并在自写应用里实现。适合做个人效率工具、桌面软件和长期维护小项目的读者参考,但它的经验强依赖单用户场景,产品化和协作场景的迁移价值有限。

个人心得Alex Chan

Rebuilding the computer room

文章从作者童年“电脑房”的记忆切入,回顾计算设备如何从固定场所的台式机,逐步演化为笔记本、智能手机、穿戴设备等随身终端。作者认为,这种便携化极大提升了便利性与可达性,但也把应用和通知带到了我们生活的每个角落,使数字服务更容易持续争夺注意力。为对抗这种“无处不在”的干扰,他重新建立物理边界:严格控制通知、改用不主动打扰的健康设备、把台式机作为主电脑、将手机固定放在办公室充电、让笔记本只在离家时使用。文章最后指出,摩擦并非总是坏事,适度的距离能帮助人更主动地选择何时进入数字世界、何时回到现实生活。

推荐收录,因为文中直接给出了可执行的边界重建方法:关闭大多数通知、减少随身设备、用物理空间隔离手机与电脑。适合关注注意力管理、开发者自我约束和数字极简实践的读者参考,也能迁移到远程办公与高干扰环境下的个人工作流设计。