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

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

一个网关一把钥匙,三个客户端三种格式:用 cc-switch 收拢 AI 编码配置

Posted on 四 03 9月 2026 in Tech • Tagged with journal, AI, LLM, tooling, claude-code, codex, opencode, self-host

我手上就一个自建网关、一把 API key,可 Claude Code 要写进 settings.json 的 env,Codex 要写进 config.toml 加 auth.json,OpenCode 要在 opencode.json 里手搓一个 provider——同一件事写三遍,三种格式。cc-switch 把这三份配置收进一个 SQLite 当唯一数据源,托盘点一下就切。这篇讲清它是什么、为什么自建用户尤其需要它、两种接法怎么选,附上我本机三条真实链路(脱敏)和四个只有自建才会踩的坑:opencode.jsonc 会盖掉 cc-switch 的写入、网关的 /models 不是 OpenAI 形状所以自动拉模型没用、密钥两周过期后要改的地方变多了、以及 settings.json 里那个 PROXY_MANAGED 占位符是干什么的。最后是一页 cheatsheet。


Continue reading

别让 agent 再 grep 了:用 graphify 给代码库先画一张图

Posted on 三 02 9月 2026 in Tech • Tagged with journal, AI, knowledge-graph, tooling, code-intelligence, tree-sitter, agent

AI 编程助手最费钱也最不靠谱的动作,是拿着一个模糊的问题在你的仓库里反复 grep。graphify 换了个思路:先用 tree-sitter 把代码解析成一张知识图谱,之后所有问题都查图,不再翻文件。这篇我在本机真装真跑了 httpx 和 FastAPI 两个仓库——12.8 秒建图、零 token、39 倍压缩是真的,中文查询查不到、一次 update 把图从 8355 撑到 25685 个节点也是真的。另外扒了它为什么用 NetworkX 而不是 Neo4j(代价是 6.5% 的边被合并掉)、graphify-out/ 那 13 个产物里只有 5 个该进 git、怎么接自己的 LLM 网关不用 Gemini key,以及和 Aider、Serena、Potpie、GraphRAG、SCIP、Repomix 五条路线的横向对比。附可直接抄的 .gitignore 和 .graphifyignore。


Continue reading

用 SDD 写代码之后,我每天读的 Markdown 比代码多——于是写了 markpad

Posted on 二 01 9月 2026 in Tech • Tagged with journal, markdown, LLM, CLI, tooling, python, fastapi, SDD

自从用 OpenSpec 那套 spec-driven 流程做 AI 编程,proposal.md、design.md、tasks.md、spec.md 一层套一层,我一天读的 Markdown 比代码多。写这一端有 agent 帮忙,读这一端还是 cat 加 less。所以我给 markpad 又加了几刀:在任意目录敲一个命令,起一个本地 Web,左边编辑右边预览,Mermaid 和 PlantUML 直接出图,选中一段就能流式翻译,一键出摘要加思维导图。这是六月那篇介绍的续集,不讲功能清单,讲几个当时没写清的实现决定:为什么两种图表走两条完全不同的路、为什么翻译非流式不行、本地工具的安全线画在哪,以及我拿它打开自己上一篇博客时踩到的一个洞。1657 行 Python,53 个测试,可抄。


Continue reading

我写过 git cheatsheet,还是记不住——于是写了 gitman

Posted on 二 01 9月 2026 in Tech • Tagged with journal, git, LLM, CLI, tooling, python, safety

我在自己的 wiki 上写过一篇 git tips,改了 17 版,该记不住的还是记不住。于是写了 gitman:用自然语言说想干什么,它先给出一份 git 命令计划和一条从真实 diff 里长出来的 commit message,你点头它才执行。这篇不讲“AI 真神奇”,讲的是让 LLM 碰你的仓库时必须先立起来的几道护栏——argv 白名单、三级危险分类、commit message 只能来自 snapshot、默认不联网。全部代码 942 行,5 个 commit,可抄。


Continue reading

SIP 协议回顾:从一通电话到呼叫中心

Posted on 六 29 8月 2026 in Tech • Tagged with SIP, VoIP, Contact Center, SIPREC, SBC

SIP 看起来像 HTTP,真正用起来却更像一套分布式状态机。本文系统回顾寻址注册、消息、事务、Dialog、SDP Offer/Answer 和重要扩展,再把它放进呼叫中心,拆解 SIP Trunk、SBC、IVR、ACD、转接、录音与典型排障案例。


Continue reading

AI Agent 需要一个 box

Posted on 五 21 8月 2026 in Tech • Tagged with AI, agent, kubernetes, sandbox, container

LLM 会写代码,但你敢直接在生产机器上跑它写的 rm -rf 吗?AI Agent 真正缺的不是更聪明的脑子,而是一个能随时开、随时扔、跑坏了也不伤及无辜的“盒子”。本文以 Kubernetes SIG 的 agent-sandbox 项目为例,讲清楚 Agent 运行环境的技术栈、原理、用法、实例、横向比较与未来走向。


Continue reading

Deno 有什么过人之处

Posted on 五 21 8月 2026 in Tech • Tagged with tech, deno, javascript, typescript, runtime

Deno 当年高调宣布"要修复 Node 的十宗罪",结果差点被 npm 生态拒之门外。Deno 2 认怂并拥抱 npm 之后,它反而找到了自己真正的位置。这篇文章讲清楚 Deno 的长处、短处、适用场景和常见陷阱,帮你判断什么时候该用它、什么时候别碰它。


Continue reading

边缘节点的妙用:把服务搬到离用户最近的地方

Posted on 四 20 8月 2026 in Tech • Tagged with journal, edge, cdn, webrtc, architecture, latency

当性能卡在延迟上、当可靠性被跨国网络拖垮、当突发流量把源站压垮时,边缘节点常常是那个"离用户最近、最稳、最快"的解法。这篇从我做音视频就近接入的经历讲起,理清边缘节点到底适合哪些场景、有哪些经典案例、落地时怎么做、又容易踩哪些坑——核心是一句:边缘换来的是延迟和稳定,代价是一致性和运维复杂度,时间和空间从来不可兼得。


Continue reading

Pi 背后的设计哲学:克制不是忍住不加,而是让功能有地方去

Posted on 三 19 8月 2026 in Tech • Tagged with journal, agent, architecture, typescript, coding-agent, design, sdk

Pi 的 README 里有一节 Philosophy,通篇是"不做什么":不做 MCP、不做 sub-agent、不做权限弹窗、不做 plan mode、不做内置 todo。但把仓库翻一遍会发现,这些被拒绝的功能全都以示例扩展的形式躺在 examples/ 目录里。这篇结合代码和数据讲清一件事:Pi 的克制不是靠作者意志力,是靠三个支点撑住的——按 token 而不是按行数度量"最小"、用扩展点给需求留泄压阀、以及一套敢说不的治理。文末给一个把 Pi 当 Agent 引擎嵌入自己项目的完整实例:代码库合规巡检 agent,含只读工具收敛、自定义工具落库、事件流审计。


Continue reading

TypeScript 凭什么成了 AI 时代的新宠:一个不写 TS 的老程序员的读码笔记

Posted on 一 17 8月 2026 in Tech • Tagged with journal, typescript, AI, agent, claude-code, opencode, codex, node

OpenCode 把 Go 写的 TUI 换成了 TypeScript,同一年 OpenAI 把 Codex CLI 从 TypeScript 换成了 Rust——两个团队方向正好相反。我的判断是:TS 赢的是 Agent 与工具这一层,Python 在模型层一寸没让。这篇结合 OpenCode 源码讲清四条真实原因、TS 的四个失分点,以及给老程序员的一条学习路径和一份实测过的陷阱清单。


Continue reading

nslookup 与 dig 的区别,以及一次代理引起的证书校验失败

Posted on 六 15 8月 2026 in Tech • Tagged with dns, dig, nslookup, tls, openssl, https, proxy, mitm, 排查, 网络, skill

nslookup 回答"这个域名解析成什么",dig 回答"这个答案是谁给的、凭什么"。本文先讲清两者的分工,再用一段可复制粘贴的脚本,在本机复现"公司代理劫持 HTTPS 导致证书校验失败",然后按 openssl 看证书、dig 看解析的顺序把凶手指出来,最后给一份排查清单,并把这套方法收成了 AI skill lazy-tls-doctor。


Continue reading

如何解决角色爆炸问题:从 RBAC 到 ABAC

Posted on 六 08 8月 2026 in Tech • Tagged with authorization, rbac, abac, role-explosion, security, 授权, 访问控制, opa, casbin

一个密钥管理服务,给每个应用建一组角色,应用涨到上万个,角色也跟着破万——这就是典型的角色爆炸。本文用这个真实案例把 RBAC 和 ABAC 的区别讲透,说清角色爆炸的根源,一步步演示怎么把三万个角色塌回三个,并盘点 Kubernetes、AWS、GCP、Azure 的实践与 OPA、Cedar、Casbin 等成熟开源框架的选型。


Continue reading

AI 助手拆机:OpenHuman 怎么做到"记得你、自己干、还不出网"

Posted on 三 05 8月 2026 in Tech • Tagged with ai-agent, rust, tauri, memory, orchestrator, mcp, teardown, architecture, openhuman

把 tinyhumansai 开源的 OpenHuman clone 下来读了一遍——一个纯 Rust 内核 + Tauri 桌面的开源 AI 助手。它把"AI 助手"拆成了三件事:一块会按时给自己喂料、压缩成"记忆树"的持久记忆大脑;一个跑在可恢复图(tinyagents)上的编排器,能把一群子代理当成一支舰队来指挥;外加一整套从语音、会议、工作流到加密的 agent 间通信的家当。真正让我放下的是它的取舍:复杂的 ML 全外包给开源 crate,内核只负责"对与错"的调度与安全,隐私开关一到 Rust 层就直接掐死出网。这篇按代码讲讲它这套"会折腾的剥洋葱式"架构,以及一个老后端能从中抄走的东西。


Continue reading

免费聊天室拆机:一个 WebRTC 项目如何在三次换栈后彻底"不养服务器"

Posted on 二 04 8月 2026 in Tech • Tagged with webrtc, cloudflare, serverless, durable-objects, teardown, architecture

拆 i365dev 开源的 free4chat——一个"开房间就能说话、不注册不存数据"的实时语音文字聊天室。真正让我感兴趣的不是功能,而是它为了"不养服务器"这个目标换了三次技术栈:Go+Pion、Elixir+Membrane,最后落到 Cloudflare 全托管(RealtimeKit + Workers + Durable Object)。这篇按代码讲清楚它现在的架构:Worker 只发一个短期 token,媒体走 WebRTC 数据面,两小时房间过期、三层反机器人,以及那个藏在 Durable Object 里的 AI 助手 Luna,还有它踩过的坑和留给自己的下一步。


Continue reading

WIMSE 实战:用 WIT + WPT 让每个服务都知道“在跟谁说话”——工作负载身份入门(下)

Posted on 日 02 8月 2026 in Tech • Tagged with journal, blog, security, identity, wimse, jwt, zero-trust, workload-identity

系列收官。身份有了、路线选了 L7,这一篇把协议落到能动手的程度:WIMSE 用两个 JWT——WIT(身份令牌,含公钥,像证书一样可公开)和 WPT(证明令牌,极短命的 bearer)——加上两个 HTTP 头和一套五步校验,让任何服务都能确切知道“在跟谁说话”。附中性化令牌示例、请求协议、授权取舍,以及“对现有 JWT 库改动其实不大”的落地评估。


Continue reading

证书还是 JWT?服务间认证的 L4 与 L7 之争——工作负载身份入门(中)

Posted on 日 02 8月 2026 in Tech • Tagged with journal, blog, security, identity, mtls, jwt, zero-trust, workload-identity

服务有了身份证之后,拿它做服务间认证有两条路:走 TLS 层的 mTLS(证书),还是走应用层的 JWT?这不是技术优劣题,是架构取舍题。本文把 mTLS 与 JWT、L4 与 L7 的权衡摊开讲透,重点拆解一个容易被忽略的“非线性 rollout 陷阱”:为什么 mTLS 明明更“正统”,很多工程主导的团队却先选了 JWT。


Continue reading

服务凭什么证明“我是我”——工作负载身份入门(上)

Posted on 日 02 8月 2026 in Tech • Tagged with journal, blog, security, identity, spiffe, zero-trust, workload-identity

一个后端服务半夜要去连数据库、调另一个内部服务,它凭什么证明“我就是那个有权限的服务”?很多团队的答案是:把身份隐式绑在云厂商的 IAM 角色和一大坨长期密钥上。这套做法能跑,但把身份、密钥、云、权限死死焊在一起,越长越重。本文是“工作负载身份”系列第一篇,讲清楚问题出在哪,以及业界标准解法 SPIFFE / SVID 到底给了我们什么。


Continue reading