笔记
博客
关于前端工程、SEO、AI、分析以及真实产品开发的记录。
42 篇文章
AVA Hosting 宣称“资源保证、不共享”,但我的 VPS 平均 CPU Steal 达到 32.73%
在正常生产流量下,我的 AVA Hosting KVM VPS 平均 CPU steal 为 32.73%,CPU idle 为 0%,CPU pressure 接近 99%。这不是一篇负面评价,而是一次基于实际 Linux 指标的 VPS 故障排查记录。
我的 FDCServers VPS 在传输超过 3 TB 流量后一直正常,后来磁盘读取却开始需要 18 秒
我的 FDCServers VPS 起初可以正常处理真实流量,并已传输了超过 3 TB 的数据。随后,普通 workload 开始触发严重的虚拟磁盘 stall:CPU iowait 达到 100%,Linux I/O pressure 接近 100%,读取延迟最高 18.7 秒,flush latency 超过 53 秒。
即使没有流量,我的 REGXA VPS 仍出现了 94% 的 CPU Steal
在排查 REGXA KVM VPS 的严重性能问题时,我测到 92–94% 的 CPU steal、耗时数秒的 localhost 请求、不断增长的连接队列,以及超过两分钟才返回的 HTTP 504。移除全部生产流量后,CPU steal 反而升到 94.17%,REGXA 随后将其归因于共享基础设施上的资源争用。
在 Nginx 后面使用 Bunny Storage 两个月后,我为什么把图片、视频和音频迁到独立媒体服务器
两个月里,我没有使用 Bunny CDN,而是把 Bunny Storage 当作自建 Nginx 缓存后的私有 origin。Production log 暴露了 cold media 请求中的长尾连接超时,以及 MP4 上 Nginx Slice 与 ETag 不一致的另一类问题;最终我迁移到了一个更简单的私有 media origin。
WebP 转 AVIF 时如何使用 SSIMULACRA2:为什么原始来源用 60,已损压缩派生文件用 65
当 AVIF 来自已经经过有损压缩的 WebP 时,SSIMULACRA2 只会衡量第二代压缩带来的损失。因此我对干净来源使用 60/58,对已知的有损派生文件使用 65/63。
DeepSeek 涨价后,我找到了比旧价还便宜的同款 V4 Flash
8 月 17 日早上,我发现 DeepSeek API 的实际支出突然变成平时的大约五倍。随后我找到并实测了另一家提供同一 DeepSeek-V4-Flash-0731 checkpoint 的服务商,其当前价格甚至比 DeepSeek 的旧价格低约 45%。
如何把动画 WebP、GIF 和 APNG 转成 H.264 MP4,同时不破坏帧与时间
我的生产流程会重建用户真正看到的完整帧,保留源时间,为每个最终 MP4 选择一个 CFR,在不放大的前提下使用最小公共画布,编码相互兼容的 H.264 片段,并在不进行第二次有损编码的情况下拼接;随后同时验证文件本身和 HTTP 交付。一次实测中,217 个动画 WebP、总计 1.49 GB,最终变成一个 78.49 MB 的 H.264 MP4。
我曾经对所有浏览器错误都报警:如何把错误噪声变成真正有用的生产监控
最初的前端上报器把广告拦截、GTM 故障、AbortError、信息不透明的 Script error 和真正的 Next.js 分块加载故障都当成同一级别。我后来改用归属、用户影响、证据质量、事件关联和恢复情况来判断是否需要告警。
为什么旧的 Next.js 标签页会在部署后失效:过期 HTML、缺失的分块文件与版本错位
一次部署后,我的生产监控记录到一个属于 Next.js 应用自身的分块文件加载失败。日志只证明失败发生了,并不能证明原因。本文以这次事件为出发点,说明长期打开的标签页、过期 HTML、缺失的 /_next/static 资源、版本错位、旧资源保留、deploymentId、发布顺序、监控以及受控恢复之间的关系。
一个 tick 就把我的 CFR 弄坏了:为什么 5580 不是 5625,3751 也不是 3750
我的校验器反复拒绝一个 16 fps MP4,因为某个数据包的时长是 5580 tick,而不是 5625。后来它又在 24 fps 输出中抓到 3751,而正确值本应精确等于 3750。这两次故障迫使我把源时序、CFR 量化、MP4 时间基、PTS/DTS、多路复用和数据包级校验彻底分开理解。
我如何用 H.264 把实际运行中的一个视频从约 280 MB 压到约 50 MB
实际运行环境中的一个视频,在我围绕 CRF 28、x264 veryslow、720p 级分辨率上限、真正有用的帧率以及适度的解码要求重新设计 H.264 配置后,从约 280 MB 降到了约 50 MB。更早的阶段里,同一个例子已经从约 350 MB 降到 238 MB;对旧媒体库的检查还表明,每秒数兆比特的 H.264 文件并不少见。
我做了 Gitae:不只判断网站“在线/离线”,而是继续定位 DNS、TLS、路由和端口问题
我做 Gitae 是为了回答一个实际问题:网站是真的不可用,还是只在本地环境出问题?它从莫斯科和赫尔辛基的外部 VDS 进行检查,并结合 DNS、HTTPS/TLS、端口、路由、IP、主机和 CMS 信号。每个结果都只是诊断证据,而不是最终结论。
为什么 TypeScript 在生产级开发中与 Codex 配合得特别好
在生产环境里,TypeScript 能给 Codex 提供优秀 prompt 无法替代的东西:机器可验证的契约、快速的编译器反馈,以及更安全的大规模重构路径。
我做了 Jurfi.com:一个用于结构化法律文档草稿的浏览器工作室
我做 Jurfi.com,是为了把表单和模板变成浏览器里的结构化法律工作草稿,让草稿可以保存在本地,并把审阅明确留在流程中,而不是声称软件能够取代律师。
我的第一笔 SaaS 收入:一次付款究竟证明了什么
我自己开发的 SaaS 产品收到的第一笔付款金额很小,但它改变了我手里证据的质量。本文讨论一次交易究竟能验证什么、不能证明什么,以及为什么可重复性比这个里程碑本身更重要。
我如何用 Codex 审查 15 个项目,同时保留最终人工控制
过去同时审查 15 个软件项目,意味着被大量重复检查淹没。现在 Codex 能帮助我更快地检查 Bug、测试、SEO、翻译、本地化和一致性,但我始终把 AI 的发现当作线索而不是结论,把每一次修改都当作必须由我自己验证的内容。
为什么我把 ChatGPT Plus 的 Codex 最后 3–5% 额度用在大型工程任务上 — 更新:到2026年夏天,这个方法已经失效
更新:到2026年夏天,这套 workflow 对我来说已经不再可靠。我的账户里 5 小时用量计数器消失了,只剩周限额可见,而且长任务在周限额耗尽时可能直接停止。
我用 AI 发布了 10,000 篇 SEO 文章,最后整个网站在 Google 索引中变成了 0 页面
大规模 AI 发布一开始像一条捷径:Google 抓取了全部 10,000 个生成文章 URL,但真正进入索引、出现在 Search 中并带来实际流量的只有约 1,000 个页面。之后连这些页面也逐渐消失,最终整个网站降到 0 个索引页面。这次失败彻底改变了我对 AI、SEO、翻译和编辑责任的理解。
8GB/256GB 的 M1 MacBook 用了五年:为什么我至今还没换掉它
我花大约 1000 美元买了基础款 M1 MacBook,配置是 8GB 内存和 256GB SSD,并长期每天使用约 15 小时,用于软件开发、视频与音频处理、图像处理、写作、学习和个人项目。五年后,我已经能清楚看到它的局限,但我考虑升级,是因为自己的工作负载变大了,而不是因为这台机器已经失去实用价值。
我用 ChatGPT 把博客翻译成 20 种语言后,开始获得来自世界各地的搜索流量
AI 彻底改变了我做多语言内容的成本结构。我从单语言博客扩展到每篇文章最多 20 种语言,让不同语言的页面成为新的自然搜索入口。
我把 QRViz 做成了免费的静态二维码生成器,并把获客押在 SEO 上
QRViz 是一个基于浏览器的静态二维码生成器,而不是营销活动平台。 我把 qrviz.com 做成了一个免费的二维码生成器,没有广告预算、付费获客计划,也没有盈利漏斗。项目的发现渠道完全依赖 SEO,因此最大的未知并不是能不能做出来,而是有没有人能找到它。
为什么我觉得获取客户比做出一个 SaaS 更难
这是我亲自做 SaaS 后得到的一个教训:工程开发给我的反馈清晰而且可验证,而分发、定位、表达和留存需要另一套更难预测的反馈循环。
我独自做了一个 SaaS 产品。开启付费后,工作的性质变了
我用晚上、周末和不少假期独自做出了这个产品。支付上线后,bug、onboarding、内容管理、留存和信任不再是“以后再处理”的问题,而是运营真实产品的一部分。
I Got 550 Views from One Image, Voiceover, and Subtitles: What Three Shorts Tests Actually Taught Me
A simple YouTube Short built from one static image, a voiceover, and subtitles reached 550 views. After three early tests, the useful lesson was not a proven formula, but a repeatable way to experiment without confusing a promising signal with proof.
我在莫斯科一个 Frontend 职位上看到了近 6,000 份申请。这能说明什么,又不能说明什么?
2023 年底,招聘人员告诉我,一个职位有 300–500 份申请就已经很多了。到 2026 年 1 月 20 日,我看到莫斯科一个中级 Frontend 职位在几小时内接近 6,000 份申请。本文区分这个数字真正传递的信号、它无法证明的结论,以及我现在会如何从候选人的角度解读它。
DeepSeek 如何改变了我的 Node.js 开发流程:半年 4,000+ 次 commit
我的 2025 GitHub 图表从上半年几乎空白,变成下半年超过 4,000 次 commit。本文讨论 AI coding 如何改变我的 Node.js 个人项目 workflow、它在哪些地方节省时间、在哪些地方会犯错,以及为什么验证仍然比生成速度更重要。
My First TikTok at 28: What a Vertical Product Demo Taught Me About Traffic
At 28, I posted my first TikTok and cross-posted the same product demo to Reels and Shorts. The useful lesson was not the view count: it was how much a 9:16 frame changes a desktop interface, and how to measure short-form traffic without confusing reach with acquisition.
我买了一个 25 年历史的域名:死链每天收到 1,000+ 次请求
在一个最早注册于 2000 年的域名上上线新站后,我看到旧 URL 每天收到 1,000 多次请求,Yandex Webmaster 还在一夜之间出现 900 多个错误。本文区分我真正能确认的事实和无法证明的因果关系,并解释为什么我用了定向 410,以及现在会如何审计老域名。
Yandex 已收录 12,500 个页面,但俄罗斯流量几乎为零:我忽略的 Cloudflare 问题
Yandex 已收录 12,500 个页面,但俄罗斯流量几乎为零。我把问题定位到网络路径,关闭 Cloudflare 代理,把缓存、压缩和基础防护迁到自己 VDS 上的 Nginx,并恢复了可访问性。最重要的教训是:索引、可访问性和流量必须分开看。
我的静态 Next.js 站点每天收到数千次漏洞扫描,但 Nginx 几乎没什么感觉
日志里充满了寻找 WordPress、PHP 后门、.env 和 .git/config 的探测请求。在我的静态 Next.js + Nginx 架构中,它们大多只会变成低成本的 miss 和 404,观察期间 CPU 负载也没有变化。这里真正值得讨论的是:这说明了静态架构的什么优势,又不能证明什么。
Yandex 开始给我的新网站带来流量,而 Google 几乎没有动静
在同一个新项目上,Google 在很长一段时间里只有大约 300 次点击,而 Yandex Webmaster 显示出明显增长,甚至一度显示点击数 +500%。真正值得讨论的是:这些数字能证明什么,又不能证明什么。
Yandex 一夜之间收录了我的 4,278 个 Next.js 页面:这件事真正证明了什么
Yandex 几乎一次性收录了我用 Next.js 静态生成的 4,278 个页面。这是一个真实的技术里程碑,但并不能证明排名或流量已经成功。下面是这个结果对 SSG 和程序化 SEO 真正说明了什么,以及它不能说明什么。
我的第一个 SEO 实验月:632 位自然访客,以及一次可疑的机器人流量检查
为了给工作中的大型 SEO 项目做准备,我把个人 side project 当成实验环境。一个月后有了 632 位自然访客,但某天 83 位访客的峰值让我意识到:可疑流量和分析工具的重放偏差,很容易被误读成真实增长。
我差点忽略 Yandex Webmaster。两周后,它带来的流量却超过了 Google
为了给一个 SEO 至关重要的工作项目做准备,我先用 Next.js 做了一个 side project。前两周我记录到 Google 带来 58 位访客、Yandex 带来 200 位,也因此真正理解了流量、索引和诊断必须分开看。
Yandex Metrica vs Google Analytics:并行使用一周后,我为什么更偏向 Metrica
我在一个新项目上同时运行 Google Analytics 和 Yandex Metrica 一周。让我更频繁打开 Metrica 的关键是 Webvisor 的会话回放。不过,这反映的是我的工作流偏好,并不能证明某个平台对所有人都更好。
Yandex 抓取了没有 /en 的博客路径,308 重定向避免了大量 404
在 sitemap 中加入约 3,000 个 /en/blog/... 页面后,我发现 Yandex 开始尝试对应的 /blog/... 路径。提前配置好的 308 重定向让这些请求没有以 404 结束。真正值得总结的并不是“Yandex 把 sitemap 解析坏了”,而是可靠的重定向层能给 URL 架构增加多少容错能力。
两个新站在 Google 上突然起量,几天后流量又下降了约 10 倍
连续两次上线,我都看到 Google 展示量迅速上升,而几天后流量降到最初的大约十分之一。这个模式是真实观察到的,但我无法证明原因就是所谓的“Google 蜜月期”。
Yandex 搜索一夜之间少了 2,000 个页面:这件事真正能说明什么
我在 Yandex Webmaster 里看到,约 8,000 个页面中有 2,000 个不再参与搜索。25% 的跌幅很醒目,但更重要的教训是:观察到的搜索状态变化,不等于已经证明了原因。
我在 MoscowJS 66 提了 10 多个问题,还赢得了两份奖品
在 MoscowJS 66,我围绕 Telegram 机器人、LangChain.js、网站构建器架构和 TypeScript 类型测试等分享提出了 10 多个问题。其中两个被评为最佳问题,我也因此拿到了两份奖品。
我从 PiterJS #79 带走了什么:遗留单体、FrontOps、Web 性能,以及更好的问题
圣彼得堡的 PiterJS #79 讨论的不是追逐新技术,而是如何维护已经存在的系统:遗留单体、FrontOps 和 Web 性能指标。我带走了实用笔记、Q&A 环节的两个奖品,也再次确认了线下 meetup 真正的价值来自参与。
I Launched a Next.js Blog in 21 Languages. Here’s What 439 Google Impressions Actually Told Me
In its first week, my 21-language Next.js blog recorded 439 Google impressions and 5 clicks. Later, 436 of 471 pages were indexed. The useful lesson was learning to separate visibility, indexing, and actual search performance.
使用 JavaScript 六年后参加 MoscowJS 65:我为什么仍然会去本地技术聚会
2025 年 6 月 5 日,我参加了在 T Bank 举办的 MoscowJS 65。四场分享从不同角度讨论 AI,但我最大的感受反而更简单:本地 meetup 仍然能提供一些文档和录像无法完全替代的东西。