Lua 编程三十个常见错误:初级、中级、高级,逐个拆解

Posted on 四 22 10月 2026 in Tech • Tagged with tech, lua, 编程, pitfalls, 脚本, nginx, redis

解释性脚本语言的坑大多是共通的——动态类型、隐式转换、宽松的作用域、还有"够用就好"的语法。Lua 以小巧著称,一门语言只有二十来个关键字,却屡屡在游戏脚本、Nginx/OpenResty 配置、Redis 事务、各种嵌入式场景里让人栽跟头。本文把高频翻车整理成三十个常见错误,按初级、中级、高级三层排开,每一条都配了可以自己跑的代码实例。大多数坑不是语法问题,而是 Lua 的"抠门"设计——数组从 1 开始、nil 不算元素、表比较的是引用、连整数除法都是后来才补的——这些设计单独看都合理,凑到一起就成了连环陷阱。


Continue reading

PHP2Shell 漏洞:PHP 紧急发布两个高危 RCE 补丁,今天就要动手

Posted on 四 22 10月 2026 in Tech • Tagged with tech, security, php, rce, cve, opsec, web

PHP 在 2026 年 10 月 21 日紧急发布补丁,修复两个可导致未认证远程代码执行(RCE)的高危漏洞,统称 PHP2Shell,对应 CVE-2026-109618 和 CVE-2026-109619,CVSS v4.0 评分高达 9.2。漏洞位于 PHP 核心的内存管理与错误处理路径,影响几乎所有 PHP 版本,攻击可以不经过任何应用代码直接打到服务器。本文讲清楚漏洞是什么、风险有多高、哪些版本受影响,并给出今天就能做的处置清单——以及用 Docker 跑 WordPress 时,为什么"光换镜像不重建容器"能漏掉这次修复,该怎么正确升级。


Continue reading

别让经验把你坑了:老程序员的"去芜存菁"

Posted on 三 21 10月 2026 in Journal • Tagged with journal, methodology, learning, reflection

经验是把双刃剑。它让你快,也让你懒得求证。我在一个 Redis Cluster 的场景里栽过:想当然以为"一个 master 带它的副本都挂了,落在其他存活 master 上的 key 照样能读",据此写了一堆代码去算哪些 key 落在哪个 master、再逐一验证——结果因为 cluster-require-full-coverage 默认是 yes,只要有一段 slot 没人管,整个集群就停摆,所有 key 全读不了,那堆代码白写了。这篇讲清楚经验主义的坑在哪、为什么老手更容易踩,以及怎么给自己的经验库做一次"去芜存菁",并给一张随手能用的核对清单。


Continue reading

把知识库建成一座图书馆:DDD 的思想、AI 的建法,和 RAG 到 GraphRAG 的省钱之路

Posted on 三 21 10月 2026 in Tech • Tagged with journal, DDD, domain-driven-design, knowledge-base, RAG, GraphRAG, LazyGraphRAG, AI, agent, retrieval

很多团队把知识库建成了一个超大的文件仓库——文档都在,但谁也找不着、AI 也查不准。问题不在存了多少,在有没有"编目"。本文把知识库当成一座图书馆来讲:DDD 给的是图书馆的分类法(领域、上下文、实体、服务),决定书怎么摆、怎么被找到;AI 既是整理书架的馆员,也是来借书的读者,两个角色得分开对待。检索这头,朴素 RAG 像只会按书名模糊搜的检索台,能答"第几页讲了什么",答不了"这个主题整体在说什么";GraphRAG 用知识图谱加社区摘要补上了这块,但建图太贵;LazyGraphRAG 把建图挪到查询时,索引成本砍到只有全量 GraphRAG 的千分之一。一条主线串起来:知识库的价值不在存量,在可检索性,而可检索性来自结构。


Continue reading

一个 Slot 挂了,为什么整个 Redis Cluster 都不可用?讲透 cluster-require-full-coverage

Posted on 三 21 10月 2026 in Tech • Tagged with tech, redis, redis-cluster, high-availability, failover, source-code

很多人以为 cluster-require-full-coverage yes 的意思是“一个 Redis 节点挂了整个集群就挂”。这是个误会。它真正管的不是节点死活,而是 16384 个 slot 是否被完整覆盖。节点挂了集群还活着,靠的是副本 failover,不是这个配置。本文从一次线上排查讲起,配两张图、一段真实源码(clusterUpdateState),把 slot 覆盖、集群状态、failover、以及它和 cluster-allow-reads-when-down 的分工一次讲清楚,最后给一张排查清单。


Continue reading

人到中年,最可贵的领悟是克制

Posted on 二 20 10月 2026 in Journal • Tagged with journal, 中年, 克制, 人生感悟

年轻时觉得克制是软弱,是认输。人到中年才慢慢明白,克制不是压抑自己,而是看清了边界之后的选择:对身体,对别人,对信念,对那个不甘平凡的自己。写给同样在跟欲望较劲的中年人。


Continue reading

不用碰撞:读懂一段 Lua,O(1) 造出落在指定 Slot 的 Redis Key

Posted on 二 20 10月 2026 in Tech • Tagged with tech, redis, redis-cluster, crc16, algorithm, lua, gf2

把 Redis Cluster 想成一个有 16384 个抽屉的柜子:给数据起个名字,柜子算出它进几号抽屉。我们要反着来——给定抽屉号,倒推一个能落进去的名字。很多人靠瞎试,又慢又碰运气。其实这里的算法说穿了只是异或:每个“开关”对结果的影响固定、还能叠加,于是倒推就成了一道凑开关的小学游戏,一步解出。本文用“抽屉、灯开关、调音台”这些大白话,配四张图,带没学过高数、刚入门编程的人逐段读懂一段真实的 Lua 实现,代码我逐个抽屉验证过。


Continue reading

年过不惑之年的老程序员,在 AI 时代怎么重新校准

Posted on 六 17 10月 2026 in AI • Tagged with journal, AI, career

一个年过不惑之年、进了新团队的老程序员,自己啃代码读文档嫌慢,靠 AI 又常在设计上翻车。问题的答案或许是:过去的经验不是作废,而是要重新校准——AI 把敲代码这件事解放了,却把"验证和判断"的担子加重了。熟练度拼不过 AI,但口味和判断力还能高它一点,程序员这碗饭老家伙也许还能吃上几年。


Continue reading

JEV:一个不会说话的 AI 模型,专门给软件当"可靠零件"

Posted on 六 17 10月 2026 in AI • Tagged with ai, jev, typesafe, discriminative-model, calibration, zero-shot, llm

这两年所有人都在卷"生成"——生成文字、生成代码、生成图。TypeSafe 刚放出来的 JEV 偏要反着走:它不生成任何文字,只对你的输入做判断,输出带概率和置信度的类型化结果,专门给软件直接消费,不给人读。它号称比前沿 LLM 快几十到几百倍、便宜几十到几百倍,核心卖点是"校准"——让模型知道自己什么时候不知道。这篇讲清它的创新在哪、适合干什么、怎么接入(含 SDK / HTTP / 置信度门控的真实代码),以及一个诚实的提醒:它太新了,目前还没有公开的成功案例,最佳实践只能从它的技术特性里推。


Continue reading

职场工具箱之设计评审:它是一场决策会,不是一场汇报会

Posted on 五 16 10月 2026 in Life • Tagged with 职场, methodology, design-review, 架构评审, 结构化思维, communication

很多团队的设计评审,本质是作者对着文档从头念到尾,评审人点点头,散会。这种评审产不出任何决策,只产出一种"我们认真讨论过"的错觉。这篇把评审当成一个职场工具来拆:会前先定"今天要定什么",用一页纸让评审人三分钟看懂,然后把大部分时间砸在失效场景、状态归属、并发一致性和运维恢复上——这几处才是真正出事的地方,而不是 UML 和类名。最后给一份能照着念的检查清单和一个散会模板,确保走出会议室时手里有决策、必改项和负责人。


Continue reading

从 SDD、TDD、MDD 到 HDD:AI 编程的质量不靠 prompt,靠护具

Posted on 四 15 10月 2026 in Tech • Tagged with journal, AI, HDD, harness-engineering, TDD, MDD, SDD, methodology, testing, coding-agent

AI 写代码的速度早就超过了你 review 的速度,质量不能再押在提示词和人眼上。本文顺着 SDD、TDD、MDD 到 HDD(Harness-Driven Development,护具驱动开发)这条方法论的主线,讲清楚一件事:把规格、测试、度量打包成一个会自我进化的执行环境,让 agent 每犯一次错,环境就长出一条新规则。另附业界已经趟过的六条实践(含属性测试、变异测试、契约测试、混沌工程的工具链接)、按设计/架构/运维分的三类常见陷阱,以及标准、论文、工具的完整参考清单。


Continue reading

让 Codex 和 Cursor 读写你的知识库:用 FastMCP 搓一个本地 MCP Server

Posted on 二 13 10月 2026 in Tech • Tagged with journal, AI, MCP, FastMCP, knowledge-base, Sphinx, MyST, agent, code-analysis

知识库建好只是第一步,下一步是让 Codex、Cursor 这些 agent 能搜、能读、还能安全地写。我的做法是别把仓库钥匙整个塞给 agent,给它开个柜台:用 FastMCP 写一个一百多行的本地 MCP server,把 Sphinx + MyST + Mermaid 的 Markdown 知识库包成五个工具——目录、搜索、读、写、代码图查询。路径白名单、frontmatter 校验、原子写入、审计流水全在柜台上,写操作不提供删除。再把 graphify 和 Understand-Anything 的代码知识图谱挂上来,让 agent 查图而不是 grep。代码和输出都在 FastMCP 4.1.0 上逐工具验证过,可以整段抄走。


Continue reading

Web Proxy 这道关:应用怎么知道自己该走代理

Posted on 二 13 10月 2026 in Tech • Tagged with tech, proxy, network, security, tls, webrtc, turn, http

企业里的 Web Proxy 不是可有可无的中转,而是把安全策略和网络出口收口的那道关——应用“无感知”地被代理,恰恰是设计目标。真正的坑在于:Windows/macOS 上的应用到底怎么发现自己该走代理?这篇讲清 WPAD/PAC、环境变量、系统设置这三条发现路径,CONNECT 隧道为什么挡不住 TLS,代理该部署在哪、有哪些开源方案,为什么信令可以走代理而实时媒体走 HTTP 代理是反模式,以及当安全策略把媒体逼上 443 时,TURN over TLS 怎么工作、还有哪些从 443 传媒体的方案。


Continue reading

给 FreeSWITCH 这种大服务生成 ASan 报告:内存踩坑的照妖镜

Posted on 二 13 10月 2026 in Tech • Tagged with tech, c, c++, asan, addresssanitizer, freeswitch, memory, debug

C/C++ 服务线上偶发崩溃、跑几天内存涨上去、core dump 栈全是问号——这类内存问题最磨人,因为它"现在不报,等你忘了才报"。AddressSanitizer(ASan)是把这类 bug 从"偶发玄学"变成"当场报错并打出调用栈"的照妖镜:编译时加一个 flag,运行时越界、use-after-free、double-free、泄漏当场抛报告。这篇用 FreeSWITCH 这种大型 C 服务做例子,从加编译参数、跑出报告、到读懂报告,给一套能直接照抄的流程,也讲清楚它为什么不能带着上生产。


Continue reading

集群状态为什么该交给 etcd:用 Raft 从根上消除脑裂

Posted on 一 12 10月 2026 in Tech • Tagged with tech, etcd, raft, split-brain, network-partition, consensus, leader-election, distributed-lock, high-availability, architecture

很多团队用 Redis 或 MySQL 存"谁是主、锁在谁手上"这类集群状态,网络一分区就两边各自称主,出现脑裂。根因不是代码写得烂,是这两种库的复制模型本就不保证"分区的少数派会主动退位"。etcd 底层是 Raft,用多数派(quorum)把这件事写进了协议:拿不到多数派票就当不了主、提交不了写,少数派自动失效。这篇讲清楚问题、根因和解法——etcd 的拓扑怎么摆、选主/锁/配置下发怎么用、生产上的最佳实践,以及一串真能让你半夜被叫起来的坑。


Continue reading

从容灾到异地双活:数据层怎么选,以 Redis 为例细讲

Posted on 日 11 10月 2026 in Tech • Tagged with tech, redis, valkey, newsql, tidb, etcd, cassandra, mysql, architecture, high-availability, disaster-recovery, cap

很多人一上来就问"异地双活用什么库",顺序反了。先得想清楚容灾要做到什么程度(RTO/RPO),再决定要不要双活、双活怎么分层,最后才落到数据层选型。这篇按这个顺序走一遍:先讲容灾的两把尺子和五档常用做法,再讲双活为什么只是其中一档、难在分层,最后以 Redis 为例把数据层选型讲透——拓扑、故障切换、双向复制、Valkey 差异,一样不落。


Continue reading

再论 CAP:会议和实时通信为什么要选 AP,以及最终一致性怎么落地

Posted on 六 10 10月 2026 in Tech • Tagged with tech, distributed-system, cap, consistency, availability, webrtc, rtc, freeswitch, architecture

网络会出的岔子一长串——分区、脑裂、闪断、非对称路由、DNS 故障、丢包、抖动、拥塞、时钟漂移——它们全归结为 CAP 里那个躲不掉的 P,所以真正的选择题只在 C 和 A 之间。网络交易选 C,音视频会议和实时通信选 A。本文先按类把网络问题列全,再结合我最近踩的几次坑,重点讲 AP + 最终一致性在实时通信里怎么落地:媒体面为什么天生 AP、信令面的冲突怎么和解、以及什么东西绝对不能最终一致。


Continue reading

用 FreeSWITCH + MySQL 构建异地双活的音视频服务

Posted on 六 10 10月 2026 in Tech • Tagged with tech, freeswitch, mysql, voip, sip, webrtc, architecture, high-availability

很多人以为异地双活的音视频服务,难在 FreeSWITCH 怎么集群。其实 FreeSWITCH 这层信令早有成熟的无状态做法,真正的坑在两处:一是跨机房的 MySQL 怎么同时写不打架,二是活跃通话的会话和媒体流钉死在单机房、切不过去。这篇讲清这三层各自的一致性模型,为什么信令可以 AP、计费必须 CP、媒体只能就近锚定,以及一套能落地的分层方案。


Continue reading

2025 DORA 报告解读:AI 不是团队的替代品,而是组织系统的放大器

Posted on 二 06 10月 2026 in Tech • Tagged with DORA, DevOps, AI, engineering-productivity, software-engineering, SDLC, architecture

2025 年的 DORA 报告给所有狂热押注 AI 编码工具的管理者和工程师泼了一盆清醒的冷水:AI 不是团队能力的替代品,而是组织系统的放大器。成熟的工程团队借它跑得更快更稳,而流程混乱、测试匮乏、架构腐化的团队,只会被 AI 加速推向事故与返工的深渊。本文拆解 2025 DORA 报告的核心洞察:AI 改变了什么、为什么它会同时推高吞吐量与稳定性风险、企业必须具备的七项基础能力、内部上下文的关键价值,并给出一套可在团队落地的七步实操框架。


Continue reading

领域知识库:用 DDD 的思路,让人和各种 AI 工具都能读写

Posted on 一 05 10月 2026 in Tech • Tagged with journal, knowledge-base, DDD, architecture, AI, agent, MCP, documentation, governance

单个项目的知识库用 Sphinx + MyST + Mermaid 不难建,难的是一个软件业务由七八个仓库拼起来之后,那些横跨仓库的知识落进了缝里。这其实是个老问题——Eric Evans 在 2003 年就用 DDD 回答过:限界上下文、统一语言、上下文映射。本文把 DDD 的这三件武器搬到知识库上,给出一个联邦式结构(事实源在各仓库,领域层只写三类文件,索引层可重建),再详细讲人和不同 AI 工具(Cursor、Codex、Claude Code)如何通过"写-管-读"闭环共同维护它,以及 MCP 怎么做统一出口。附四类原料的处理法、业界产品对照、按链路落地的顺序、治理清单,和一份带链接的参考文献。


Continue reading