目录穿越防护,以及容器里怎么还原宿主机路径
一个文件下载服务要回答两个「路径」问题:请求里那个路径不能越界,而页面上要显示的是宿主机上那个目录 —— 后者藏在 /proc/self/mountinfo 的第 4 个字段里。
Read more →
Notes on the judgement and trade-offs behind the work: how a problem was tracked down, why a decision was made and what is still unresolved. Every note is a Markdown article with text and screenshots.
一个文件下载服务要回答两个「路径」问题:请求里那个路径不能越界,而页面上要显示的是宿主机上那个目录 —— 后者藏在 /proc/self/mountinfo 的第 4 个字段里。
Read more →
覆盖与删除都要带当前 SHA,所以写操作必须串行;而 Git 不存目录这件事,得靠每一级放一个 .gitkeep 来补。
Read more →
打开 PerMonitorV2 只是拿到通知。真正的坑是框架会重复缩放:字号 10 → 5 → 2.5。解法是所有尺寸以 96 DPI 为基准做绝对重算。
Read more →
`netstat -ano` 给的 PID 可能是 0,也可能是一整棵进程树的父节点。前者要去问 netsh 的排除端口范围,后者要按进程树强杀。
Read more →
留全量样本算 P99,亿级请求内存就爆了。对数线性分桶把内存压到一个与请求量无关的常数(256KB),相对误差上限 0.1%。
Read more →
Windows 的系统定时器分辨率约 15.6ms,ticker 把吞吐死死卡在 60~90 req/s —— 设 5000 QPS 只跑出 88。改成「绝对时间表」后实测 4982。
Read more →
关掉 send 通道来通知出口,任何一次迟到的投递都会 panic —— 而投递方可能来自 Hub 也可能来自读循环,时序根本无法保证。
Read more →
同样是「uid → 连接」的一张表,一个用 sync.RWMutex 保护以支持多端在线,另一个用单 goroutine + channel 让 map 完全无锁。两种都能跑,代价不同。
Read more →
消息是异步落库的,逐条打已读标记会出现「标记先到、消息后到」的假未读。游标天然规避,代价是要处理「对方还没说过话」这一种回退。
Read more →
消息表换 UUID v7、用户表留雪花 ID,不是选型摇摆 —— 前者换掉了「多实例要协调节点号」这个运维负担,后者留在需要短主键的地方。
Read more →
Notes record the judgement and context of the moment, so conclusions may be out of date; images and links follow their original sources.