出门在外,用 Cloudflare 保护好自己
出门在外,用 Cloudflare 保护好自己

一个新网站刚上线,最先出现的访客往往不是读者,而是扫描 .env、寻找 WordPress 后台和尝试 SSH 登录的自动程序。当然,检查结果一般不通知你。很多人最初接触 Cloudflare,只是把网站的 DNS 记录设为已代理(Proxied)。继续翻控制台才会发现,它管的远不止网站入口:Email Routing 处理域名邮件转发,Tunnel 接入海外托管的自建应用,Page Shield 监控第三方脚本,R2 可以存备份,Notifications 负责告警。缓存、

2026-09-07•约 10.9 千字
最近给博客做的优化
最近给博客做的优化

上一篇《博客重构》里,我把目标写得很明确:完成基础设施,把精力转回内容。博客确实能用了,修改却没有停。搜索框里的状态、手机上的目录、切换页面时的代码高亮,每个地方单看都不大,连起来却足够再折腾一轮。这也不完全是闲不下来。有些问题只有放进真正的阅读过程才会出现:输入拼音时要不要立刻搜索,点完目录后面板要不要收起,页面开始切换了,代码高亮却还没准备好。组件单独看都能用,放在同一页里,仍然有不少地方需要磨合。这一轮基本没有改变博客的用途,更多是在整理前一次重构留下的细节。先列一下范

2026-09-05•约 12.0 千字
来聊聊游泳吧
来聊聊游泳吧

很久很久之后,记录一下关于游泳的思考。怎样才算学会游泳,本身就很难定义。所以本文不聊怎么学会游泳,改聊聊其他的。游泳这项运动,对身体素质有三个方面的要求:柔韧性、力量和协调性。我们就聊聊这个对几种泳姿的影响,以及一些成人学习游泳会遇到的问题。其实第一个问题和身体素质没关系,而是已经会游泳的人往往无法理解那些不会游泳的人。就像你已经掌握了某个技能,但是教授别人的时候,如果你不会换位思考,往往也无法理解他们。换位思考的能力的是一个好东西,可惜不是人人都有。本文的角度皆在成人学习游

2026-09-04•约 4.1 千字
PostgreSQL 与 InnoDB 的存储路径
PostgreSQL 与 InnoDB 的存储路径

假设有一张再普通不过的订单表:主键是 id,用户经常按 status 查询,后台又不断更新订单状态。CREATE TABLE orders ( id bigint PRIMARY KEY, status varchar(32) NOT NULL, buyer_id bigint NOT NULL, total decimal(12, 2) NOT NULL, note varchar(500), created_a

2026-09-02•约 13.9 千字
Go 请你喝一杯绿茶
Go 请你喝一杯绿茶

如果 CPU profile 里 runtime.gcBgMarkWorker、对象扫描和分配路径长期霸榜,GC 才值得被请出来背锅。高频 JSON 解码、临时字符串和一地鸡毛的小对象,都会把 GC 累得够呛;锁竞争、网络调用和慢查询造成的延迟,则不是给 GC 换个名字就能治好的。Go 1.26 默认启用 Green Tea。它没有突然变成分代 GC,也不会把对象搬来搬去;底子仍是并发、非移动的标记—清扫。变化发生在标记阶段:以前更像追着一个个对象满堆跑,现在尽量把同一段堆内

2026-08-31•约 8.9 千字
PostgreSQL 如何选择索引
PostgreSQL 如何选择索引

明明建了索引,数据库为什么不用?这是数据库问题里最常见、也最容易误判的一类。表上有索引,查询条件里也写了索引列,EXPLAIN 却给出一个 Seq Scan。把 enable_seqscan 关掉,索引突然又能用了。于是很自然地会得出结论:规划器选错了,或者它的成本估算与实际情况不符。但「能用某个索引」和「使用它成本最低」是两回事。索引先找到的是行的位置,不一定是查询最终需要的行;找到位置之后,还可能要读取表页、检查 MVCC 可见性、过滤误命中、排序、回表取列。若条件会返回

2026-08-30•约 16.9 千字