领域知识库:用 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

把 C/C++ 服务装进集装箱:用 Docker 构建、运行、分发

Posted on 日 04 10月 2026 in Tech • Tagged with tech, docker, c++, cmake, multi-stage, distroless, devops

C/C++ 最头疼的从来不是写代码,是交付——一个二进制换台机器就跑不起来,缺了某个 .so、glibc 版本对不上、编译器一升级全乱套。这篇讲怎么用 Docker 把这事根治:build 阶段锁死编译环境,run 阶段用 multi-stage 把几 GB 的构建镜像瘦成几十 MB 的运行镜像,distribute 阶段一条 docker push 把带所有依赖的服务发出去。配一个用 CMake + cpp-httplib 写的小 HTTP 服务做完整示例,顺带说清 static 链接、distroless、DNS 这些真会咬人的坑。


Continue reading

DNS,有多少问题因你而起

Posted on 六 03 10月 2026 in Tech • Tagged with journal, dns, sre, reliability, rfc

从 AWS、Facebook、Dyn 三次事故看 DNS 如何成为故障入口或放大器;结合 RFC 2308 / 8767 / 9520,讲清 libcurl 的缓存、handle 复用、旧 IP 兜底,并给出可运行的 C 示例。


Continue reading

引擎归 C++,玩法归 Lua:一个打砖块游戏的分层写法

Posted on 五 02 10月 2026 in Tech • Tagged with tech, lua, cpp, sdl, sol2, game, gamedev

想改一下小球的速度,却要等三分钟重新编译整个 C++ 工程——这是自己拿 C++ 写游戏时最劝退的一件事。这篇借一个真实的 SDL 打砖块项目(eliasdaler/sdl_breakout)讲清楚一种分层写法:C++ 只当"引擎",负责窗口、渲染、音频、输入这些慢变的底层;游戏玩法整个搬到 Lua,改了存盘就生效。文章拆解 sol2 怎么把 C++ 的类和函数暴露给 Lua、GC 怎么接管 SDL 资源,最后附上我把它移植到 macOS 时踩的三个坑和改法。代码引用来自该项目 master 分支,移植改动在 macOS + Apple clang 上实测。


Continue reading

让 Lua 插上翅膀:C 与 Lua 是怎么绑在一起的

Posted on 四 01 10月 2026 in Tech • Tagged with tech, lua, c, ffi, swig, freeswitch, openresty, luajit

Lua 自己什么都不会——不会发网络请求,不会读数据库,连打开一个文件都得靠宿主给的库。它小得可怜,却长在魔兽世界、Nginx、Redis、FreeSWITCH 这些庞然大物里,靠的就是一件事:跟 C 无缝对接,借用整个 C/C++ 生态。这篇讲清楚 C 和 Lua 到底是怎么绑在一起的——从那个来回倒数据的栈,到注册 C 函数、包装 C 对象,再落到两种真实风格:FreeSWITCH 用 SWIG 预生成胶水,OpenResty 用 LuaJIT FFI 干脆不写胶水。代码引用来自 FreeSWITCH master 分支与 LuaJIT 官方文档。


Continue reading

用 AI 跑通软件研发全流程:PDCA 里的体力活外包指南

Posted on 三 30 9月 2026 in Tech • Tagged with ai, sdlc, pdca, engineering, methodology

AI 不是来替代工程师的,它是来接管每个研发阶段里最耗体力的那部分。把 SDLC 拆成 PDCA 四段,每段挑出能安全外包给 AI 的活,人守住判断和把关,就能既快又不塌方。这篇给出每个阶段的具体做法、可复用清单,以及一张总的 checklist。


Continue reading

AI 语音客服的两道生死坎:延迟和可信度

Posted on 三 30 9月 2026 in Tech • Tagged with tech, llm, voice-agent, latency, rag, freeswitch, contact-center, asr, tts

AI 语音客服 demo 能跑,离敢上生产还隔着两道坎。一是延迟:用户对电话里的沉默极其敏感,超过一秒就觉得"卡了",得盯"首响应"而不是"总时长",靠流式和流水线把它压进一秒。二是可信度:LLM 会用完全自信的语气编造一个不存在的优惠、报错一个余额数字,在客服场景就是事故,得靠 RAG、工具调用、护栏这五道防线给它套缰绳。而且这两件事经常打架,工程上只有按场景权衡,没有免费的午餐。


Continue reading

Understand Anything:给陌生代码库画一张能走的地图

Posted on 三 30 9月 2026 in Tech • Tagged with tech, AI, code-reading, knowledge-graph, Understand-Anything

接手陌生代码库,难的往往不是看不懂某个函数,而是不知道该先看哪里。Understand Anything 把文件、函数、类和依赖关系做成可探索的图,再用导览、搜索和问答帮你找入口。它适合当代码阅读的地图,但图上的解释仍要回到源码核对。


Continue reading

用 Lua 写 Dialplan 接 LLM:从零搓一个 AI 智能客服

Posted on 二 29 9月 2026 in Tech • Tagged with tech, freeswitch, lua, unimrcp, mrcp, llm, asr, tts, contact-center, voip

FreeSWITCH + UniMRCP + LLM 的分工和架构有了,落到代码,XML dialplan 表达不了"调 HTTP、维护多轮上下文、按 LLM 结果分支"这种逻辑,得用 Lua。这里有一份能读懂的完整 voice_agent.lua 骨架——从接通、放欢迎语、开麦识别、调 LLM 网关、合成回复,到打断、超时、转人工、挂断的完整对话循环,关键处标清楚哪里要按你的环境改。顺带说清 mod_unimrcp 的 speak / play_and_detect_speech 怎么用,以及为什么 LLM 场景要用自由识别而不是固定语法。


Continue reading

给电话装个"会聊天的大脑":FreeSWITCH + UniMRCP + LLM 的语音智能体

Posted on 一 28 9月 2026 in Tech • Tagged with tech, freeswitch, unimrcp, mrcp, llm, asr, tts, contact-center, voip, rtc

MRCP 给通话加上了"听懂"和"会说"。再往下走一步:在 contact center 里,FreeSWITCH 管呼叫、UniMRCP 管 ASR/TTS,本来已经能做语音 IVR;但真正让它"活"起来的,是中间插进来的 LLM。传统 IVR 靠固定语法只能听懂预设的几句话,LLM 能听懂客户随口说的任何一句,还能带着上下文对答、调用工具查真实数据。三者怎么分工、一次对话在时序上怎么流转、延迟和打断这些工程难点怎么处理,连同一份能照着做的落地清单,都在这儿。


Continue reading

MRCP 协议入门:让 SIP 呼叫用上语音识别与合成的那根控制通道

Posted on 日 27 9月 2026 in Tech • Tagged with tech, mrcp, sip, asr, tts, voip, rtc, telephony

前面几篇讲 FreeSWITCH、OpenSIPS 都是在讲"怎么接通一路电话"。往上走一层:电话接通之后,想让机器听懂人说话(ASR)、让机器开口说话(TTS),媒体流已经在 RTP 上跑了,可谁来告诉引擎"现在开始识别""用这个语法""合成这段 SSML"?这就是 MRCP 干的活。它是什么、v1 和 v2 差在哪、一次识别在协议上到底怎么流转、UniMRCP 是怎么落地的、有哪些典型场景和踩坑点,这里一并说清。


Continue reading

与其硬啃老代码,不如用 Jupyter 造一个看得见的简化版

Posted on 六 19 9月 2026 in Tech • Tagged with tech, jupyter, freeswitch, visualization, code-reading, python

读 FreeSWITCH 的 C 源码,层层封装,又臭又长,看完就忘。与其在源码里硬熬,不如用 Jupyter Notebook 造一个可运行、可视化的最小模型,把线程、阻塞、时序这些"看不见"的东西画出来。本文讲这套方法背后的认知原理、Jupyter Lab 的安装与用法、可视化手段清单,并以一个 audio_bridge_thread 的交互式 Notebook 为例。


Continue reading

给 FreeSWITCH 集群配两个搭档:OpenSIPS 管信令,rtpengine 管媒体

Posted on 六 19 9月 2026 in Tech • Tagged with tech, freeswitch, opensips, rtpengine, voip, sip, webrtc, architecture

FreeSWITCH 是一台优秀的媒体/B2BUA 引擎,但它没有原生集群能力,信令和媒体又和业务逻辑挤在同一个进程里。想把它扩到上万路,硬堆 FreeSWITCH 是最贵的一条路。这篇讲清 FreeSWITCH 架构的精华与包袱各在哪,为什么 OpenSIPS 和 rtpengine 恰好补在它最薄的两个地方——信令边缘和媒体传输——以及三件套怎么分工、容量能提到什么量级。


Continue reading

FreeSWITCH 的 session:一次呼叫的生老病死,都装在一个容器里

Posted on 六 19 9月 2026 in Tech • Tagged with tech, freeswitch, session, lifecycle, memory-pool, voip, c

FreeSWITCH 的 session 是整个系统最核心的抽象——它是一路呼叫的容器,也是它的边界。这篇顺着源码,把一次呼叫从 SIP INVITE 进来、到 session 创建、媒体协商、桥接、挂断销毁的完整生命周期讲清楚:哪些数据是线程私有、哪些是共享,session 为什么和内存池、线程死死绑在一起,以及为什么"把会话从服务器 A 迁到服务器 B"这条路基本走不通——真要做会话漂移,让客户端 endpoint 重连新服务器,比在服务端桥接靠谱得多。


Continue reading

FreeSWITCH 架构设计之快与脆

Posted on 五 18 9月 2026 in Tech • Tagged with tech, freeswitch, architecture, voip, webrtc, sfu, c

FreeSWITCH 用 switch_core 内核加模块插件的方式把一整套电话系统塞进一个进程,既不拆成微服务,也不是简单的单进程多线程。这篇从源码层面讲清它的状态边界划在哪、这种结构为什么快、又为什么脆,以及为什么这套二十年前为语音打磨的架构,做不成今天意义上的高性能 SFU。


Continue reading

逆流而上:AI 时代程序员的深度学习法

Posted on 四 17 9月 2026 in AI • Tagged with journal, learning, AI

我年轻时认路很厉害,看一眼地图就能从城东穿到城西;现在有了导航,方圆十几公里都得开着导航才敢上路。用进废退,脑子这块肌肉,你不用它,它就替你退休。AI 也一样——它拓展了我们的知识边界,却在悄悄把我们的判断力外包出去。这篇讲讲我怎么"逆流而上",让 AI 帮我加速,而不是替我思考。


Continue reading

用 AI 写临床医学论文:一套能投 BJSM 的实战工具链

Posted on 四 17 9月 2026 in Tech • Tagged with tech, AI, 临床医学, 论文写作, 系统综述, BJSM, Elicit, AI Skill, 学术诚信

想用 AI 帮忙写一篇能投运动医学顶刊(如 BJSM)的临床论文,靠一句“帮我写篇论文”是过不了同行评审的。本文把 AI 拆进论文生产的每个环节——选题、检索、筛选、数据提取、写作、润色、查重——给出对应的工具清单和一条可复制的工作流;再横向对比 K-Dense、ARS、avoid-ai-writing 等开源 AI Skill,专门标出谁擅长搭骨架、谁擅长校对修改;最后把 BJSM 的字数红线和 ICMJE 的 AI 披露规则一次讲清楚。


Continue reading

重拾 Lua:从月亮语言到 FreeSWITCH 里的胶水

Posted on 一 14 9月 2026 in Tech • Tagged with tech, lua, freeswitch, scripting, mod_lua, dialplan

十几年前我做过一个《A Glance of Lua》的分享,如今大半忘光了。这篇先用老程序员重拾旧语言的角度,把 Lua 最该记住的那几样东西——表即一切、元表、闭包、协程、C API——快速过一遍;再落到 FreeSWITCH:mod_lua 到底把脚本挂在哪几个位置(dialplan、XML handler、event hook、startup script),配一组能看懂的例子、几条最佳实践和最容易栽的坑。Lua 语法基于 5.x,FreeSWITCH 部分引用官方 scripting 文档。


Continue reading

拨号计划 101:FreeSWITCH 里那台可编程状态机

Posted on 一 14 9月 2026 in Tech • Tagged with freeswitch, dialplan, VoIP, Contact Center, routing

很多人把 FreeSWITCH 的拨号计划当成一个"路由配置文件",改完 reloadxml 就完事。可它其实是一台按呼叫上下文运行的状态机:一通电话进来,它一条条判断条件、往 channel 上贴变量、排一串要执行的动作,最后决定这通电话走哪条路。理解了这一点,IVR、排队、转接、录音这些呼叫中心功能才不再是黑盒。本文以 XML 拨号计划为主,配少量 Lua,讲清它是什么、能干什么、怎么写、有哪些最佳实践和常见坑,最后用几个真实呼叫中心场景演示排障技巧。


Continue reading

OpenSIPS 入门:一台 SIP 服务器,一个可编程的呼叫路由引擎

Posted on 一 14 9月 2026 in Tech • Tagged with tech, sip, opensips, voip, rtc, telephony

FreeSWITCH 那几篇讲的是"怎么接通一路电话",这篇换个角度:当你有成千上万路电话、要做注册、鉴权、路由、限流、防欺诈时,前面挡在最前线的往往是 OpenSIPS。它是什么、怎么编译、一次注册和一次呼叫在脚本里到底怎么流转、代码结构长什么样、有哪些best practice、又有哪些新手必踩的坑——一次讲清。


Continue reading