博客
开发者指南与深度解析
围绕开发工作流、数据格式与日常工程问题的实用文章,帮助你理解方法,也更快用好工具。
- 裸眼3D / 立体视觉 / 平行法 / 交叉法
裸眼 3D 到底怎么看?平行法与交叉法入门
「裸眼 3D」这个词底下躺着三样不相干的东西。这篇讲你手里任何一块屏幕都能做的那一种:一套真能上手的自由融合方法、决定能不能融合的尺寸硬限制,以及看不出来时该怎么排查。
阅读文章 - SSL / TLS / SAN / SNI / 域名 / HTTPS
为什么 SSL 证书与域名不匹配?SAN、通配符与 SNI 排查
SSL 证书与域名不匹配,未必是证书申请错了:访问的名字、SAN、通配符层级、SNI、DNS、CDN 和负载均衡都可能让客户端拿到另一张证书。本文给出从浏览器错误到实际 TLS 入口的排查方法。
阅读文章 - SSL / TLS / 证书链 / 中间证书 / HTTPS
为什么我的证书链不完整?中间证书缺失的排查与修复
证书链不完整不只是少传一张中间证书,也可能是链上证书已过期、来自私有 CA,或公网实际送出了另一套链。本文解释浏览器、curl 和应用为何表现不同,并给出从握手结果到 TLS 终止点的排查顺序。
阅读文章 - 邮件 / 邮件头 / DMARC / 安全 / 钓鱼邮件
怎么读邮件头(顺便认出伪造的发件人)
邮件头是一封信如何抵达的唯一第一手记录。读懂 Authentication-Results、倒着走 Received 链,认出伪造发件人留下的那几处破绽。
阅读文章 - SSL / TLS / 证书 / HTTPS / 安全
为什么 SSL 证书无效?从报错到根因的排查方法
浏览器报证书错误,并不等于证书文件本身坏了。按有效期、域名覆盖、信任链、中间证书、SNI、TLS 协商和 DNS 的顺序核对,才能找到真正出问题的一层。
阅读文章 - 邮件 / DMARC / SPF / DKIM / 送达率
从 p=none 走到 p=reject,而不弄丢自己的邮件
分阶段推进 DMARC:先把聚合报告读明白,把所有合法发信方找齐并配上对齐,pct 已被移除之后改用 t=y 当刹车,最后才真正开启强制。
阅读文章 - 邮件 / SPF / DKIM / DMARC / DNS
SPF、DKIM、DMARC 到底各管什么
三条记录,三件不同的事。SPF 和 DKIM 各自验的是什么,为什么对齐才是 DMARC 真正的机关,以及一封信怎么会 SPF 通过却 DMARC 失败。
阅读文章 - chmod / Unix / 文件权限 / Linux
chmod 之后还是 Permission denied?原因在这里
明明改过 chmod,脚本或文件仍提示 Permission denied,问题往往不在文件本身。本文按路径、所有权、挂载选项、SELinux、ACL、特殊位和文件系统标记逐层排查。
阅读文章 - chmod / Unix / 文件权限 / Linux
chmod 644 和 755:文件与目录该怎么选?
644 适合普通文件,755 常用于目录和可执行程序,但这不是可以机械套用的口诀。本文解释递归 chmod 的风险、umask 如何影响默认权限,以及共享目录为什么常常需要 2775。
阅读文章 - chmod / Unix / 文件权限 / Linux
chmod 755 到底是什么意思?(顺便学会读懂任意权限)
755 那三个数字不是魔法,而是一套「谁能读、能写、能执行」的编码。这篇带你一眼读懂 755、644、700,并讲清执行位在目录上为什么是另一个意思。
阅读文章 - Cron / crontab / 定时任务 / 排障
为什么我的 cron 没跑起来?一份现场排查手册
「没跑」这三个字盖着三种完全不同的故障:压根没触发、触发了却在第一步就死、以及正常跑完但你看不到。这篇先教你分清是哪一种,第一步就从 cron 日志入手。
阅读文章 - Cron / crontab / 定时任务 / 运维
Cron 定时任务怎么写?每分钟、每小时、每天、每周、每月速查
你已经知道要什么节奏——每 5 分钟、工作日 9 点、每月 1 号——只差那一行。这里按需求列出可直接复制的 cron 表达式,以及那几个直觉写法恰好是错的情况。
阅读文章 - Cron / crontab / 定时任务 / 运维
怎么读懂 Cron 表达式(顺便写出真按你想法跑的那种)
Cron 无非是固定位置上的五个字段,加上四个符号。这篇带你一眼读懂任意调度规则,并绕开那两个会让「看着没错」的表达式在错的时间触发的坑。
阅读文章 - 哈希 / 校验和 / 编码 / 排查
同一个文件为什么哈希值不一样?
你给一个文件算了哈希,别人给一个他确信是同一个文件的副本算了哈希,两个摘要却对不上。哈希是计算机领域中最具确定性的机制之一,所以值会变,只可能是字节变了——悄无声息、看不见。本文逐一排查这些常见原因:字符编码、BOM、行尾、末尾换行、文本与二进制模式、结构化数据、重新打包的压缩包,并给出让两边重新对上的归一化做法。
阅读文章 - 哈希 / 校验和 / MD5 / SHA-256 / 安全
MD5 还是 SHA-256?校验和到底该用哪个
「MD5 不安全,别用」是你会听到的建议,它对了一半——而这恰恰让它危险。MD5 对一个校验和来说是够用还是鲁莽,完全取决于你得先回答的一个问题:有没有人想骗你?这篇把校验和干的两件事拆开,指出每件各自需要哪个哈希,并讲清为什么「换个更强的哈希」往往是错的解法。
阅读文章 - 哈希 / 校验和 / 完整性 / 排查
校验和为什么对不上?哈希不匹配的排查指南
校验和对不上,感觉像警报,可这警报只有一档:两串字节不一样。它不告诉你为什么。真正的功夫不是把哈希重算一遍,而是把「对不上」收敛到三类原因里:数据真的不同、你把两个哈希比得不对等、或者你信的那个参考值本身就错了。这篇把三类都走一遍。
阅读文章 - YAML / 字符串 / 解析 / 配置文件
YAML 多行字符串:什么时候用 |,什么时候用 >
YAML 里写多行的值,有两个块符号:一个竖线,一个大于号;此外单引号、双引号、甚至不加引号也能跨行。每种保留还是折叠换行的规则都不一样,选错就把一段脚本压成一行。这篇把它讲全,连带那些会咬人的角落。
阅读文章 - YAML / 解析 / 调试 / 配置文件
YAML 为什么老出问题?响亮的报错和静默的坑
同一个早上来了两个工单,都说「我的 YAML 挂了」。一个是第 12 行的红色解析报错——一分钟就修好。另一个是服务正常启动、却跑出了错的行为,因为一个没加引号的值悄悄变成了别的东西。这是两个相反的问题,而危险的那个恰恰是安静的那个。
阅读文章 - JSON / YAML / TOML / 配置文件
JSON、YAML、TOML 配置格式到底怎么选?
一个 PR 只加了一个小小的配置文件,review 却歪成了四十条评论——用 YAML?换 TOML?干脆 JSON 算了?——最后啥也没改。这场争论卡在了一个错的问题上:哪个格式最好?根本没有最好。每种格式的最大长处,本身就带着它最大的短板。看清这一点,选择就收敛成两个简单得多的问题。
阅读文章 - JSON / jq / 命令行
怎样从超大 JSON 文件里取值,又不用专门写脚本
为了从一个大到打不开的 JSON 导出文件里取一个值,你并不需要临时写个解析器。从 JSON 里取数据是一个「查询」问题,而
阅读文章jq、JSONPath 和 DuckDB 正好回答它——一直管到大得放不进内存的文件。 - 进制 / 十六进制 / 二进制
十六进制、二进制与十进制:程序员真正在用的数字读法
一个颜色是
阅读文章#FF5733。一个文件权限是chmod 755。一次权限检查是flags & 0x04。一个常量是0b1010、或0xFF、或255。每一种看着都像自成一派的方言,其实它们是同一个数字换了身衣服——而让这一切不再是摩擦的那点熟练,比看上去要小得多:字节用十六进制,位用二进制,给人看用十进制。 - URL 编码 / 编码 / 调试
URL 编码为什么乱了?百分号编码与 + vs %20
你把
阅读文章café放进 URL,出来变成café。空格在一处是+、在另一处是%20。值里一个&把查询串劈成两半,后半截悄悄没了。有东西被编码了两次,你盯着一串%2520。这些看着像各不相同的 bug,其实是同一个想法加两层拧劲:百分号编码把 URL 不能直接写的字节转义掉,规则随所在部位而变,而空格有两种合法写法。 - Base64 / 编码 / 调试
Base64 到底是什么?为什么我的解不出来?
你把一段 Base64 丢进解码器,回给你一句「Invalid character」;或者更糟——它「成功」了,吐出满屏乱码。多半什么都没坏。你只是搞错了 Base64 的类别:它不是加密、不是压缩,只是把字节可逆地重新打包、好让二进制穿过只收文本的通道。想通这一点,每一次解码失败就都塌缩成一份简短、能一一点名的清单。
阅读文章 - 时间戳 / ISO 8601 / 数据库 / 日期与时间
时间该存时间戳还是 ISO 字符串?
Code review 上为同一列吵起来:一个人存 Unix 时间戳整数,另一个存 ISO 字符串,第三方 API 又甩回一串带 Z 的文本。到底哪个「对」?争论几乎总卡在整数还是字符串上——可这恰恰是最不重要、也最该最后问的那个问题。真正决定成败的,是它之前的那几问。
阅读文章 - 时区 / 日期与时间 / 夏令时 / 调试
日期为什么会差一天?时区与日历日期
把生日存成 5 月 1 日,显示出来却是 4 月 30 日。把事件排在 7 月 15 日,日历上却是 14 日。跑一份日报,午夜前的那条记录算到了错误的一天。原因几乎总是同一个:日历日期不是一个时间点,而 bug 就发生在「无时区的日期」撞上「有时区的瞬间」的那道边界上。
阅读文章 - 时区 / UTC / ISO 8601 / 日期与时间
UTC、GMT、ISO 8601 与 Unix 时间戳有什么区别?
UTC、GMT、结尾的 Z、+08:00、一串十位数字,常被当成同一个东西混用,而时间的 bug 正是这么溜进来的。它们不是「时间」的几种变体,而是处在四个不同的层。这篇把参考时间尺度、时区、偏移,以及写下一个瞬间的两种记法各自归位。
阅读文章 - 时间戳 / 时区 / JavaScript / 调试
Unix 时间戳为什么不对?秒、毫秒与时区
一个显示错误的时间戳,几乎从来不是数字本身出了问题,而是搞错了类别。Unix 时间戳既不是日期,也没有时区——它只是从某个固定时刻起算的一个秒数。一旦你把「这个瞬间」和「它被渲染成的样子」分开,「差了几十年」「差了三小时」「差了一天」就各自塌缩成一个具体、能找到的原因。
阅读文章 - JWT / 身份认证 / 安全 / 会话
短有效期 token、refresh 轮换,以及如何撤销一个 JWT
JWT 通常的部署方式——作为一个自包含的、由服务端本地验证、无需查询任何状态的 access token——恰恰就是你难以把它收回的原因:它在过期前始终有效,服务端做什么都不改变这一点。这一篇讲的就是怎么管理它:短的 access token 有效期、refresh token 与带重放检测的轮换,以及撤销一个自包含 token 的几种真实选项——每一种都要在即时性和你当初选择 JWT 所看中的那份无状态性之间做取舍。
阅读文章 - JWT / 安全 / 前端 / 身份认证
JWT 应该存放在浏览器的哪里?localStorage、cookie 与 XSS/CSRF 的取舍
把 JWT 存在浏览器的哪里,常常被当成“哪个更安全”的排名来问,可它并不是排名。localStorage、cookie、内存,各自对两个问题给出不同答案——JavaScript 能不能读到 token,浏览器会不会自动带上它——而这两个问题正对应 XSS 与 CSRF。本文逐一拆解这几种存法、业界最终收敛的方案,以及为什么防住 XSS 比任何存储选择都更要紧。
阅读文章 - JWT / 安全 / 身份认证 / 调试
我的 JWT 安全吗?验签是怎么被绕过的
许多 JWT 安全事故不是密码学被破解,而是验证器被错误配置:它接受了攻击者写的 token,或根本没有执行验证。根源在于让未经验证的 token 影响代码如何校验它。本文拆解主要攻击路径,以及能阻止它们的验证规则。
阅读文章 - JWT / 身份认证 / 调试 / 安全
JWT 为什么失效?如何解码和调试一个 JSON Web Token
一个写着“invalid token”的 401,几乎从不意味着 token 是乱码,而是你和服务器之间某一项校验没过。与其攒一堆解码技巧,不如搞懂 JWT 到底是什么:一段签了名的明文——你随时能读,但只有验签之后才该信。想清楚这一点,每一种失效都会退化成一份简短、有序的排查清单。
阅读文章 - 正则表达式 / 前瞻 / JavaScript
怎样匹配一段文本却不消费它?正则的前瞻与后顾
你的正则匹配上了,
阅读文章match[0]里却少了你以为会有的那段?或者一条密码规则要同时满足好几个条件?根本上都是同一个念头:前瞻和后顾只检查文本、并不消费它。这篇把零宽断言到底怎么运作讲清楚,以及它顺手能做成的那几件事。 - 正则表达式 / ReDoS / 性能 / 安全
为什么我的正则这么慢?灾难性回溯与 ReDoS
一个正则在短输入上跑得好好的,输入稍微变长就把页面卡死——这通常不是慢,是指数级爆炸。学会从形状一眼认出灾难性回溯,看懂背后的 ReDoS 攻击,再把模式重写成安全的样子。
阅读文章 - 正则表达式 / 调试 / JavaScript
为什么我的正则匹配不上?先搞懂引擎在做什么
正则“不匹配”十有八九不是没匹配,而是匹配到了你没料到的那一段。与其逐条背 tips,不如理解引擎如何逐位置行走与回溯——贪婪、非贪婪、锚点、前瞻、灾难性回溯,都是这一个机制的侧面。
阅读文章 - JSON / 调试 / 格式化
如何修复无法解析的 JSON(并整理剩下的烂摊子)
报错往往说明输入从一开始就不是严格 JSON。本文教你读懂报错、认出五种最常见的破坏方式,再把结果整理成可读的样子。
阅读文章 - JSON / 差异比较 / 开发工作流
如何比较两个 JSON 文件,只看真正发生的变化
逐行比较 JSON 往往被缩进和键顺序淹没。本文用终端、编辑器、代码与浏览器工具说明怎样把注意力放回真正变更的数据。
阅读文章