Alex Chan

6 篇内容

技术文章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

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

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