与其硬啃老代码,不如用 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

webrtc-to-freeswitch:一个浏览器软电话的架构、流程与协议全解

Posted on 一 14 9月 2026 in Tech • Tagged with tech, webrtc, sip, freeswitch, vue, fastapi

上一篇讲清了 SIP.js 怎么打进 FreeSWITCH,这次把它做成了一个完整项目——webrtc-to-freeswitch。这篇从整体架构、信令与媒体的完整流程、协议分层三个层面把它讲透:它是什么、有什么用、怎么用;浏览器到 FreeSWITCH 之间一次通话到底发生了什么;以及最容易被忽略、却最容易踩坑的 FreeSWITCH 侧配置——WSS binding、candidate ACL、ext-rtp-ip。


Continue reading

焦虑与沉没成本:写给夜里睡不着的自己

Posted on 日 13 9月 2026 in Journal • Tagged with journal, mindset, sunk-cost

一篇写给自己的私人札记,已加密。


Continue reading

用 SIP.js 从浏览器打电话到 FreeSWITCH

Posted on 五 11 9月 2026 in Tech • Tagged with tech, webrtc, sip, freeswitch, javascript

SIP.js 官方 demo 一键就能打通电话,但那是因为对端是一台匿名公共服务器。想让浏览器真正打进自己的 FreeSWITCH,绕不开三件 demo 帮你藏起来的事:注册、鉴权、还有一座 WSS 到 SIP 的桥。这篇拆掉 demo-1,把这三件事补齐。


Continue reading

给 FreeSWITCH 写测试:从单元测试到集成测试,用一个真 bug 串起来

Posted on 四 10 9月 2026 in Tech • Tagged with tech, freeswitch, testing, unit-test, integration-test, c, pcre2, sipp

给 FreeSWITCH 写测试有两条路:一条是自带的 FST 框架,起一个真 core、真 session,在进程内测 switch_* 函数;另一条是拉起整个服务、用 SIPp 打真呼叫、看 ESL 事件的集成测试。本文用我修的一个 mod_dialplan_xml use-after-free bug(PR #3151)串起前者,再讲清后者什么时候非用不可、怎么搭、坑在哪,最后给一张"这个 bug 该写哪种测试"的决策表和检查清单。


Continue reading

C 插件系统实战指南:dlopen 没告诉你的四件事

Posted on 一 07 9月 2026 in Tech • Tagged with tech, C, dlopen, plugin, so, abi, dynamic-linking, best-practice

dlopen 只有四个函数,半小时能学完。难的是它没管的四件事——入口点怎么找、插件怎么回调宿主、ABI 怎么不崩、卸载怎么办。这篇把这四个问题的传统答案讲清楚,给一份可编译运行的完整参考实现(357 行),再用 10 个实测的崩溃现场说明常见错误。含 Linux/macOS 差异对照和一份可勾选的 checklist。


Continue reading

C 语言的动态加载、依赖注入与服务注册:把 FreeSWITCH 的模块机制拆到底

Posted on 一 07 9月 2026 in Tech • Tagged with tech, C, freeswitch, dlopen, plugin, dependency-injection, service-registry, abi

C 没有反射,凭什么能用字符串 "answer" 找到一个函数?把 FreeSWITCH 的模块系统从 dlopen 拆到函数指针派发,四层结构讲透:动态加载、依赖注入、服务注册、运行时查找。所有结论都在 FreeSWITCH 1.11.3-dev 上实测过,包括亲手写一个 50 行模块热加载进跑着的进程,以及三个实测出来的坑。


Continue reading

LLM API 的变迁:OpenAI-compatible 为什么不等于兼容

Posted on 一 07 9月 2026 in Tech • Tagged with tech, LLM, API, OpenAI, Anthropic, Gemini, Responses API, Chat Completions, tool-calling

LLM API 已经从 prompt 字符串、messages 对话,走到由 typed items、事件流和工具循环组成的 Agent 接口。OpenAI-compatible 往往只能保证最简单的文本请求长得相似,不能保证工具调用、流式事件、状态、推理内容和错误语义一致。本文比较 Chat Completions、Responses API、Anthropic Messages 与 Gemini,给出选型框架、适配层边界和兼容性测试清单。


Continue reading

APR 入门:一个 30 年前的答案,为什么还在你的代码库里

Posted on 日 06 9月 2026 in Tech • Tagged with tech, C, APR, apache, freeswitch, memory-pool, portability

APR(Apache Portable Runtime)是 C 语言事实上的"缺失标准库",它的核心是内存池——不追踪每个对象的释放,而是按生命周期批量丢弃。这篇讲清 APR 的设计理念、常用模块、快速上手路径、以及 FreeSWITCH 为什么要把它 fork 出来改名。所有代码在 APR 1.7.6 上实测。


Continue reading

人格的力量:知识不再稀缺之后,靠什么立得住

Posted on 六 05 9月 2026 in Journal • Tagged with journal, 人格, 尽责性, 情绪稳定性, 知行合一, 王阳明, 大五人格, AI, 职业成长

"知识就是力量"这句话,前半截在 AI 时代快要失效了——知道一件事的成本已经降到接近零,可把知道变成做对的成本一分没降。王阳明讲知行合一,说的正是这一段落差:知不只是 What,还有 Why 和 How,而这两样只能在事上练出来。Gignac 2025 年那篇论文更给了一个意外的好消息:智商、尽责性、情绪稳定性这三样里,后两样彼此高度相关,却几乎跟智商无关——也就是说,最值钱的那块地基,跟你天赋多高没什么关系,是可以修的。


Continue reading

C++ 悬垂引用与 lambda 捕获:语法上最省事,出事时最难查

Posted on 六 05 9月 2026 in Tech • Tagged with tech, C++, memory, reference, lambda, dangling, sanitizer, modern-cpp

引用和 lambda 捕获是 C++ 里最省事的两个语法,也是最容易悄悄出事的两个。悬垂引用在使用处和普通变量一模一样,还没有"空"这个状态可判;[=] 看着像全按值拷,其实按指针捕了 this。本文用九个能编译运行的实例,讲清悬垂引用的四种来源、lambda 捕获的五种误用、什么时候该用引用什么时候不该用,附一张捕获速查表和检查清单。


Continue reading

C/C++ 内存管理方法的变迁:把纪律写进类型系统

Posted on 五 04 9月 2026 in Tech • Tagged with tech, C, C++, memory, RAII, smart-pointer, modern-cpp

从 malloc/free 到 unique_ptr,再到 span 与 pmr,C/C++ 三十年的内存管理演进有一条清晰的主线:把原来只能靠人记住的纪律,一点点搬进类型系统,让编译器去查。本文按 C、C++98、C++11、C++17/20 四个阶段讲清各自的特点与难点,配可编译运行的实例、最佳实践、常见陷阱和一张检查清单。


Continue reading