<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>技术笔记 on 技术博客 - 有条工具</title><link>/blog/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/</link><description>Recent content in 技术笔记 on 技术博客 - 有条工具</description><generator>Hugo -- 0.147.7</generator><language>zh-cn</language><copyright>2024-2025 有条工具技术博客</copyright><lastBuildDate>Wed, 11 Nov 2026 09:30:00 +0800</lastBuildDate><atom:link href="/blog/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/feed.xml" rel="self" type="application/rss+xml"/><item><title>DPI 的真相：PNG pHYs 的「像素每米」、JFIF density，与印刷尺寸的一笔账</title><link>/blog/articles/dpi-metadata-truth/</link><pubDate>Wed, 11 Nov 2026 09:30:00 +0800</pubDate><guid>/blog/articles/dpi-metadata-truth/</guid><description>72dpi 的图改成 300dpi，文件大了吗？没有——一个像素都没变，变的只是「打印时每英寸摆多少像素」的解释权。这篇拆解 DPI 在 PNG（pHYs 块、单位竟是像素每米）与 JPEG（JFIF APP0 的 density 字段）里的真实存放位置、字节级改写为什么要重算 CRC32，以及「A4 300dpi 要多大像素」这笔印刷方最爱算的账。</description></item><item><title>重复文件查找三级漏斗：大小分桶、首尾 64KB 快哈希与诚实的「疑似」标注</title><link>/blog/articles/duplicate-finder-funnel/</link><pubDate>Wed, 11 Nov 2026 09:10:00 +0800</pubDate><guid>/blog/articles/duplicate-finder-funnel/</guid><description>找出硬盘里的重复文件，直觉做法是「每个文件算一遍哈希再比对」，但一万张照片就是上百 GB 的读取量。正确姿势是三级漏斗：先按字节大小分桶（大小不同必不重复），再对同桶文件只读首尾各 64KB 算快哈希，最后只剩极少数候选做全量 SHA-256。这篇拆每级淘汰率、为什么读首尾两头、以及超过 100MB 的文件为什么诚实标注「疑似」而不装确定。</description></item><item><title>音频变速的两条路：线性插值重采样，与 2048 采样窗的 WOLA 时间拉伸</title><link>/blog/articles/audio-time-stretch-wola/</link><pubDate>Wed, 11 Nov 2026 08:50:00 +0800</pubDate><guid>/blog/articles/audio-time-stretch-wola/</guid><description>1.5 倍速播 podcast，声音变尖了还是没变？取决于走哪条路：重采样是按倍距重读采样、音高随速度一起变，一行循环就能写完；变速不变调则要把音频切成 2048 采样的颗粒、加 Hann 窗重叠搬移、再按窗权归一化（WOLA）。这篇把两条路的数学、参数取舍与 4 倍重叠的窗和陷阱逐一拆开。</description></item><item><title>vCard 解剖：一行一属性、75 字符折行与 iPhone item1. 分组的私有方言</title><link>/blog/articles/vcard-format-anatomy/</link><pubDate>Wed, 11 Nov 2026 08:30:00 +0800</pubDate><guid>/blog/articles/vcard-format-anatomy/</guid><description>手机通讯录导出的 .vcf 是纯文本：BEGIN:VCARD 开场、一行一个属性、分号分隔结构化字段。这篇拆解 vCard 的转义次序为什么不能乱、规范折行如何用「换行加空格」回接长行、N 与 FN 谁说了算、中文名该怎么拆，以及 iPhone 导出文件里 item1.TEL 这类私有分组写法的兼容处理。</description></item><item><title>口播静音切除：50ms 窗 RMS、扫描线判定与切不坏句尾的收边算法</title><link>/blog/articles/audio-silence-detection-algorithm/</link><pubDate>Tue, 10 Nov 2026 09:15:00 +0800</pubDate><guid>/blog/articles/audio-silence-detection-algorithm/</guid><description>口播录音里「嗯——」与句间长停顿占掉两成时长，切除它们不是波形上看一眼那么简单：按 50ms 窗算 RMS 响度、与 dBFS 阈值逐窗比较、把连续低于阈值的运行段聚成静音区、两侧各收 50ms 边防止切掉气声尾音，最后按保留段把采样逐字节拼回 WAV。这篇拆解整条算法链的每一步取舍。</description></item><item><title>EPUB 解剖：一个 ZIP 如何装下一本书，mimetype 为何必须第一个且不压缩</title><link>/blog/articles/epub-container-anatomy/</link><pubDate>Tue, 10 Nov 2026 09:00:00 +0800</pubDate><guid>/blog/articles/epub-container-anatomy/</guid><description>EPUB 3 的本质是一个改了打包规矩的 ZIP：mimetype 条目必须排第一、必须 STORE 不压缩，META-INF/container.xml 指路，OPF 清单串起章节与双目录（EPUB 3 的 nav 加兼容旧阅读器的 toc.ncx）。这篇按规范逐层拆开 .epub，并讲 TXT/Markdown 按章节切分的正则细节与为什么全程可以在浏览器里完成。</description></item><item><title>ID3 标签解剖：synchsafe 整数、反同步与 MP3 乱码歌名的字节级真相</title><link>/blog/articles/id3-tag-anatomy/</link><pubDate>Tue, 10 Nov 2026 08:40:00 +0800</pubDate><guid>/blog/articles/id3-tag-anatomy/</guid><description>MP3 里显示的歌名、歌手、封面不是音频数据，是嵌在文件头部的 ID3 标签。这篇逐字节拆解 ID3v2 的帧结构：synchsafe 整数为什么要砍掉每个字节的最高位、unsynchronisation 防的是什么假警报、四种文本编码如何决定中文是正常显示还是乱码，以及文件末尾那 128 字节的 ID3v1 遗产。</description></item><item><title>DEFLATE 解剖：LZ77 与霍夫曼如何压掉七成体积，gzip 头尾字段逐个讲</title><link>/blog/articles/deflate-gzip-anatomy/</link><pubDate>Tue, 10 Nov 2026 08:20:00 +0800</pubDate><guid>/blog/articles/deflate-gzip-anatomy/</guid><description>gzip 文件 = 10 字节头 + DEFLATE 流 + 8 字节尾。这篇拆开三层：RFC 1952 的容器字段、RFC 1951 里 LZ77 滑窗与霍夫曼编码的接力、以及浏览器 CompressionStream 一行流式 API 的能力边界——为什么没有压缩级别参数、为什么多成员 gzip 只解出第一个。</description></item><item><title>节拍检测：自相关如何从波形里「听」出 BPM</title><link>/blog/articles/bpm-detection-autocorrelation/</link><pubDate>Mon, 09 Nov 2026 06:50:00 +0800</pubDate><guid>/blog/articles/bpm-detection-autocorrelation/</guid><description>人耳听 BPM 靠打拍子，机器靠统计。降混单声道、能量包络、onset 半波整流、滞后自相关——四级流水线把节拍从波形里算出来，再加上八度歧义、抛物线插值与置信度，拆解 BPM 检测的每一步。</description></item><item><title>浏览器视频处理管线：MediaRecorder 的能力与妥协</title><link>/blog/articles/browser-video-pipeline-mediarecorder/</link><pubDate>Mon, 09 Nov 2026 06:40:00 +0800</pubDate><guid>/blog/articles/browser-video-pipeline-mediarecorder/</guid><description>不装 ffmpeg、不上传云端，浏览器也能旋转、变速、拼接视频——代价是理解三个约束：录制实时进行、编码器可用性因浏览器而异、变速的音调需要专门兜底。拆解从 video 解码到 MediaRecorder 出片的完整管线，以及本地管线的适用边界。</description></item><item><title>把 Markdown 变成 Word：一条跨越 40 年的兼容链</title><link>/blog/articles/markdown-to-word-compat-chain/</link><pubDate>Mon, 09 Nov 2026 06:25:00 +0800</pubDate><guid>/blog/articles/markdown-to-word-compat-chain/</guid><description>Markdown 2004 年才出生，Word 的二进制 .doc 1983 年就有了。本文拆解两代格式之间的兼容链：OLE2、OOXML 与 Word 自家的 HTML 方言——mso 命名空间、条件注释与 @page 页面参数，缺一个命名空间 Word 就按普通网页降级打开。</description></item><item><title>WebAudio 的响度账本：RMS、dBFS 与静音切除</title><link>/blog/articles/webaudio-loudness-dbfs/</link><pubDate>Mon, 09 Nov 2026 06:20:00 +0800</pubDate><guid>/blog/articles/webaudio-loudness-dbfs/</guid><description>口播录音里「哪段是停顿」不是听出来的，是算出来的。从 PCM 采样到 dBFS 刻度、50ms 窗 RMS、门限与最短静音时长、边缘 padding，再到 44 字节 RIFF 头的手写 WAV 编码——拆解静音切除的整条账本。</description></item><item><title>MP4 文件结构：ISO-BMFF 的 box 逐层拆解</title><link>/blog/articles/mp4-box-structure-anatomy/</link><pubDate>Mon, 09 Nov 2026 06:10:00 +0800</pubDate><guid>/blog/articles/mp4-box-structure-anatomy/</guid><description>播放器能在两 GB 的文件里秒级定位画面，靠的是 MP4 的 box 索引树。从 size 与 type 两个通用字段讲起，逐层拆开 moov 里的 mvhd、tkhd、stsd、stts、stsz，解释手机竖拍的旋转藏在哪个字段、分片 fMP4 长什么样，以及为什么 MP4 压不小必须重编码。</description></item><item><title>文件取证入门：EXIF、魔数与改后缀的把戏</title><link>/blog/articles/exif-magic-numbers-file-forensics/</link><pubDate>Mon, 09 Nov 2026 05:55:00 +0800</pubDate><guid>/blog/articles/exif-magic-numbers-file-forensics/</guid><description>把 .exe 改名成 .jpg 骗得过文件管理器，骗不过文件开头的魔数。本文拆解 PNG、PDF、ZIP 的签名字节、ZIP 家族的内部伪装、JPEG 里挂载的 EXIF/TIFF 结构，以及位置隐私是怎么随一张原图泄露出去的。</description></item><item><title>AES-GCM 认证加密：为什么改动一个字节就全盘失效</title><link>/blog/articles/aes-gcm-authenticated-encryption/</link><pubDate>Mon, 09 Nov 2026 05:50:00 +0800</pubDate><guid>/blog/articles/aes-gcm-authenticated-encryption/</guid><description>大量「在线加密」是 ECB 玩具：图案守恒、篡改无感。AES-GCM 把机密性和完整性绑在一起——CTR 加密、GHASH 认证，密文改一个字节就整体失败。本文拆解 GCM 机制、IV 纪律、PBKDF2 密钥派生与自描述密文格式。</description></item><item><title>GIF 格式解剖：LZW、交织与帧合成的每一字节</title><link>/blog/articles/gif-format-anatomy/</link><pubDate>Mon, 09 Nov 2026 05:40:00 +0800</pubDate><guid>/blog/articles/gif-format-anatomy/</guid><description>一个 1987 年的格式至今撑着表情包与客服动图，靠的是 LZW 变长码、帧增量合成与交织扫描这三板斧。逐字节拆解 GIF 的文件结构、LZW 解码的 KwKwK 特例、disposal 语义与 NETSCAPE 循环扩展，并说明为什么抽帧工具要用零依赖纯 JS 从头实现。</description></item></channel></rss>