今天的话题从终端引擎的 1.0 版本,到浏览器里的老游戏,中间有 Apple 的隐私图谱、AI 记忆系统和几项历史研究。以下是 Agili 的 Hacker Podcast 今日精选。
libghostty 1.0:终端引擎成为独立基础设施
从 Ghostty 核心到稳定库
Mitchell Hashimoto 在 2026 年 11 月 6 日发布 libghostty-vt 1.0。这个从 Ghostty 终端模拟器核心抽出来的可移植库,库本身和 C ABI(应用二进制接口)都进入稳定状态。一年前他写《libghostty is coming》时,C API 还不存在,除了 Ghostty 没有别的使用者。现在 C API 是一个完整的终端模拟器,跑在数百个免费和商业产品里,ABI 稳定策略由 CI 强制执行。
谁在用
JetBrains 全系 IDE 的内置终端已经跑在 libghostty 上,按 JetBrains 的报告覆盖超过 1250 万经常活跃用户。Neovim 有一个已批准的 PR 用 libghostty-vt 替换 libvterm,顺带解决一个存在十年的问题:调整窗口大小时回滚缓冲区无法重排。KDE 开发者试验基于它的 Konsole 替代品 Kwi,CI/CD 和 Flatpak 构建已经切到新版本。Vercel 的 Turborepo 用它渲染 TUI(终端用户界面)里的任务输出,devenv 用它驱动 shell,Antithesis 拿它 fuzz TUI 程序,在 btop 等项目里找到真实 bug。Rust、Go、JavaScript、Swift、Python、.NET、Elixir、Dart、Java 都有社区绑定,awesome-libghostty 收录一百多个项目。今天用 libghostty 驱动的终端的人,比用 Ghostty 应用本身的人多得多。
评论区里 Ghostel 被反复提到。有人说它是自己用过的第一个真正开箱即用的 Emacs 终端模拟器,和 vterm、EAT 比是白天黑夜的差别;也有人用它同时跑多个 Claude Code 和 Codex 会话。JetBrains 用户说,JediTerm 过去那些不支持的转义序列、显示错乱、输出截断的问题,换成 libghostty 后都没了。
ABI 稳定与打包
1.0 的核心承诺是 ABI 稳定。所有对象都是不透明句柄,读写值走一小组以枚举为键的 getter/setter,新增值不需要新增符号。用新头文件链接旧库的程序会拿到 GHOSTTY_UNSUPPORTED,不会崩溃或撞上未定义行为。CI 用 libabigail 在 Linux 上对照提交的基线检查每次改动,macOS 和 WebAssembly 上对照黄金类型清单。ELF 平台上每个导出符号都做了版本化,动态加载器会直接拒绝加载不匹配的库。有评论指出,库本身是 Zig 写的,对外提供 C ABI,文章开头说“C 库”容易让人以为代码是 C。
打包方面,libghostty 有独立于 Ghostty 应用的发布周期,源码 tarball 单独裁剪,只带库需要的文件和依赖。每次发布提供签名的源码 tarball,外加一个按 Zig 缓存布局放好全部 Zig 包的依赖 tarball,发行版可以完全离线构建。库是 MIT 许可,运行时除了 libc 不需要别的,关掉 SIMD 后能完全 freestanding(不依赖操作系统运行时),跑在裸机 RISC-V 和 ARM 上。依赖树里没有 copyleft 代码。CI 覆盖 Linux、macOS、iOS、FreeBSD、Windows、Android 和 freestanding 的 wasm32。
资源占用与生态
库不创建线程,只通过可定制的分配器分配内存。作者在一台 4 核 8 GB 的 Linux 服务器上跑了 10000 个活跃终端,每个终端里都有一个持续输出的 shell。为了塞进 8 GB 预算,他不得不用 dash,因为 bash 占的内存比 libghostty-vt 还多。
有人问,大家都自己做终端,痛点在哪。回答大致是:重点在让 IDE、云控制台这类需要嵌入终端的应用,用更少的代码做出集成更好的终端,相当于 xterm.js 的替代品。有个比喻是浏览器引擎和浏览器的关系:终端引擎按一堆相对客观的标准做对一次就够了,标签页、分屏、会话这些主观偏好留给上层。和 libvte 的对比也类似:libvte 连 GTK 界面一起给,libghostty 只给模拟层,而且要新一些,Kitty 键盘、Kitty 图形、桌面通知这些协议 libvte 还没有。
文章最后说,现在用大约 1500 行 C 就能做出一个终端,功能比 2025 年存在的几乎所有终端都多,性能也更好。
Anthropic 拆解 agent 记忆:四层结构与 dreaming
记忆的分层
Anthropic 研究员 Lance Martin 把 agent memory(智能体记忆)限定为 Claude 从交互和任务里获得、能跨会话保留、之后可以读到的上下文。它不包括改模型权重、单次对话里的 in-context learning(上下文内学习),也不包括 compaction(用摘要替换旧对话,腾出上下文窗口)。这套记忆分四层:最底下是可搜索的会话记录,往上是 Claude 自己写的记忆笔记,再往上是 wiki 这类记忆表示,最顶层是每次会话都会预先加载的注入上下文。层与层之间靠 dreaming 连接。
Dreaming 借的是人类睡眠时海马体 replay(回放)的类比:海马体在当下捕捉经历,只有一部分会在离线时被巩固成长期知识。agent 可以把空闲算力用来回看日志,改正错误,生成新笔记,或者重建记忆表示。Anthropic 说,写一条记忆等于预测未来还会需要它。
CL-Bench 数据
在 CL-Bench 1.0 的数据库任务里,Claude 每个问题都从新会话开始,只能从跨会话保留的记忆目录里取文件。Opus 4.7 的无记忆得分是 0.383,带记忆升到 0.700;Opus 5 从 0.564 升到 0.828;Sonnet 4.6 只从 0.330 升到 0.364。
Sonnet 4.6 会写下一堆没有验证的猜测;Opus 4.7 把笔记合并成一份参考文档,标出哪些事实已核对;Sonnet 5 在评分器确认后把答案标成已确认,答错时写更正;Opus 5 开始闭合学习循环,在条目里写规则、规则怎么被验证、以及踩过的坑。给 Sonnet 4.6 加上“回答前先读记忆、再明确验证猜测”的提示后,它的得分从 0.364 升到 0.641。
Anthropic 发现,告诉 Claude 记忆是干什么用的,比规定它怎么用更有效。把规则定死会削弱强模型。测试“只记录失败”时,Opus 5 从记忆里获得的提升减少了 0.234。
Pokémon 实验
Pokémon Red 的测试直接展示筛选的差别。Sonnet 3.7 把一切可能有用的事都写下来,最后写了 413 个文件、分布在 225 个文件夹里,共 977,930 个字符,拿到一个徽章。游戏状态一直在变,它的详细记录很快过时,Claude 要花越来越多时间翻记忆。Fable 5 只写了 9 个文件加一个 global.md,共 43,406 个字符,拿到四个徽章。它的 global.md 是仪表盘,放当前目标、打道馆的预写计划、自己定的记忆使用规则。连续 7 个精灵球没抓住 Magikarp(鲤鱼王)之后,它写下:“如果连续 3 个以上精灵球失败,就改变节奏,这样做之后立刻抓住了。”
在月见山,Claude 把山入口的 PokéCenter 当路标,错记成在东侧。它走出 PokéCenter 后说“月见山在我身后”,把笔记改成“Mt. Moon DONE”,几步后掉下一处单向台阶,落回来时的路。没有 dreaming 的那次运行,它三次掉下台阶,一路退回 Pewter City,始终没到 Cerulean。用 dreaming 对照会话记录后,Claude 发现笔记错了,改写笔记,重新走进山洞,在第 1,935 个动作到达 Cerulean。
社区反应
Hacker News 上不少用户的第一反应是关掉自动记忆。一位用户估计,Claude Code 自动生成的记忆他删掉 95%,因为这些记忆通常只对当前任务有用,留着会污染上下文。另一位说,关掉记忆明显减少了使用 agent 时的意外。有人把 Claude Code 的记忆换成了自己维护的 BULLETIN.md、按项目分的 LEDGER.md 和按日期写的报告,因为自动记忆藏在模型侧、不是给人看的,一条错误笔记可能在两周后带偏长任务。
关于 dreaming 这个词,有人反感,认为模型既不休息也不调节激素,人类做梦还可能只是记忆巩固的副作用。也有人认为它抓住了“离线回看并整理”的类比。有读者指出,这里做的事情是拿笔记和真实历史做交叉核对,叫“做梦”有点浪漫。
有读者认为文章绕开真正的问题:模型不能持续更新权重,markdown 技巧改不了这一点。另一位说,对 Anthropic 这种提供云端推理的公司,持续更新权重不现实,短期内把指令和上下文做对更能提升能力。
每台 Mac 都带着一份没写进文档的家庭关系图谱
发现
从 macOS 13(2022 年)开始,每台 Mac 都带着一对守护进程:knowledgeconstructiond 和 intelligenceplatformd。它们的任务是在设备上构建一张关于你的知识图谱:你是谁、你认识谁、这些人彼此之间以及和你是什么关系、你如何与他们通信、你去哪里、做什么、什么时候做。苹果几乎没有文档,官方描述只有 man page 上的一句话。
数据存在 ~/Library/IntelligencePlatform,是 51 个 SQLite 数据库,明文存储,位于受 TCC(Transparency, Consent, and Control,macOS 的隐私权限机制)全盘访问保护的区域。最核心的是 graph.db:一个三元组存储,用 181 个实体类和 278 个谓词写成。每一行是主语、谓语、宾语。主语是实体(人、应用、事件),宾语是普通值或另一个实体,后者就是图的边。谓语说明系统认为两者之间是什么关系。每行还带置信度、来源、来源重复和时间戳。
数据与推断
进入图谱的数据包括:通讯录;照片里的人脸;日历(标题和参与者);家庭共享(包括每个成员的年龄);健康应用里的医疗急救联系人;Siri 建议从邮件和消息中找到的事件和联系人;应用通过 App Intents 捐赠的人;已安装的应用。旁边还有自己的表:照片里谁和谁同框;通信日志(谁、何时、哪个应用、方向,没有内容);位置和移动;以及一长串设备信号(锁屏、Wi-Fi、蓝牙、充电、环境光,还有一个叫 ContextualUnderstanding.PhysicalSocial 的流,记录格式按名字、电话和邮箱列出人物,各带起止时间,读起来像物理上谁在你身边的日志,尽管作者从未见它被填满)。
推断方法跨度很大。大部分词汇靠直接复制填充和对副本的规则;有意思的行来自模型:一对 XGBoost 分类器从 144 个特征判断谁是你的家人;两个嵌入模型是系统判断两条记录是否同一人的十个信号之一;照片里的 12 个分析器根据谁和你出现在哪些照片、哪些旅行和节日里,给伴侣、父母、子女、同事和朋友打分;苹果的端侧 LLM 读你的消息,给一张脸配上名字和关系。
家庭分数单独存放。两个 CoreML 模型随本体一起发布:EntityTagging_Family.mlmodelc 和 EntityTagging_FamilyAndFriends.mlmodelc,是二分类 XGBoost 分类器,吃 144 个特征,输出一个类别和概率。分数不进三元组存储,而是进自己的表 entityTagging.db,每人一行,17 个关系列,从 family 到 mother 到 coworker,每天重算。
删除不完全
删掉一个联系人,没有东西会重新推导他们;下一次运行会整表替换。但存储保留第二张表 expired_stable_graph,被撤回的行移过去,保留置信度和来源。能看到的范围大概是 48 小时,但作者在自己的 Mac 上还能读到很旧的记录。一个结论也能比它的证据活得久:在作者的 Mac 上,评分卡仍在给图谱前一天已经删掉的两个人打分,这两个人只是通过一条日历邀请被系统知道的。
这件事不只关于你。你周围的人也在里面:家人、朋友、以及任何通过你的设备和你讲过话的人。没有人被问过,存储把他们和你连起来,并通过共同的事件和群组把他们彼此连起来。
工具与社区反应
作者开源了 iKnow,一个本地仪表盘,用 Python 标准库写成,没有 npm,没有 CDN。直接在 Mac 上运行,绑定 127.0.0.1,只读打开数据库,不写不记录,可以断网运行。
社区的反应分成几类。很多人说毛骨悚然:一位评论者跑完 iKnow 后说“绝对恐怖”,即使关掉并封锁了所有 Intelligence 和 Siri 相关功能,系统仍在做这些事,这让他考虑换 Debian。另一位说曾经会觉得这数据迷人,现在只觉得累:如果聊天时所有东西都被记住,非正式关系里的模糊空间就没了。
有人指出“本地”没那么简单。一位评论者在一台不常用但登录了 iCloud 的 MacBook 上运行 iKnow,看到大量从 iPhone 共享过来的活动、名字和联系人,而那台笔记本上根本没装那些应用。另一位用只查食谱的“厨房 MacBook”得到同样结果:那张“本地”图谱看到了 iPhone 上的一切,包括 Signal 联系人,甚至有人脸聚类,尽管本机没有照片可比对。
实测效果并不好。一位评论者说他的 Mac 几乎不知道他的社交圈,除了标注为“妈妈”“爸爸”的父母;系统把一个明显是假的联系人标成家人、伴侣、孩子和兄弟姐妹,把已故朋友标成家人,把律师卡在朋友线 0.47,却漏掉了同居伴侣。另一位说分类器分不清他妻子更可能是儿子还是女儿,把妻子和已故父亲列为同样可能是伴侣。这些结果与文章里展示的 0.960 高分形成对比。
关于如何禁用,答案不乐观。有人说不能;有人给了 flock 脚本,删掉 IntelligencePlatform 目录,用 touch 建一个空文件,设 root 所有、444 权限、schg 标志。有人问能否用 Little Snitch 阻止这两个进程,回答是大概率不行:用户档案存在本地,Little Snitch 看不到出站连接。
文章本身也挨了不少批评。作者在评论里承认“只有技术部分是 AI 写的”,这句话被很多人抓住:技术部分恰恰是大家关心的部分。
Asahi Linux 7.3:M3 正式支持,M5 开始启动
上游化与 M3
Asahi Linux 发布 Linux 7.3 周期的进展报告。macaudio 和 avd 两个主要驱动进入邮件列表评审。macaudio 需要改动 ALSA 核心才能支持 Apple Silicon 特殊的音频子系统,驱动加 Devicetree 变更约 3100 行。AVD 驱动只在下游树里待了不到 3 个月就提交,约 13000 行代码。M4 Pro、M4 Max 和 M5 的初始 Devicetree 也已提交,目前只够启动到 TTY。
M3 支持去掉 EXPERT 标志,正式可用,早期采用者几乎没有报告问题。M3 启用了 DCP,性能和电池续航改善,可以启用睡眠,MacBook 刘海两侧的区域也能用了。
虚拟化与 M5
m1n1 现在能在 EL1 下启动三个 VM,虚拟化 SPTM 版 macOS,支持 M4 和 M5 上的逆向工程。M5 的新挑战是 Exclaves(运行在 Secure Kernel 控制的隔离环境里的小应用),macOS 用它们处理敏感任务,比如在屏幕上绘制“摄像头使用中”的指示器。XNU 通过 SPTM 用 Tightbeam IPC 协议与它们通信,找不到运行中的 Exclaves 就会 panic。Sven 把 Secure Kernel 和 Exclave 用户态放进另一个 VM,解决了这个问题。
M3 GPU 的逆向由一组新贡献者推进,Alyssa Millburn、Anna Maniscalco 和 TellowKrinkle 在 XDC 做了演讲。m1n1 能初始化 GPU,团队画出了三角形。社区里 superdisk 说自己写了个 M3 GPU 驱动,能启动 KDE、跑 Quake 和 GLXGears,还不完全可用,代码放在 asahi-plus-slop 仓库。
Thunderbolt 与游戏
Thunderbolt 补丁出现在邮件列表上。Apple 自己设计了 Thunderbolt 控制器,是 Cortex-M3 跑 RTKit 加定制的 Thunderbolt/USB4 路由器。Intel 供应市场上其他所有控制器,Linux 的 Thunderbolt 子系统围绕它们设计,对硬件拓扑、寄存器访问和共享内存做了很多假设,Apple 的控制器打破了不少。目前支持 USB3、XDomain 和 Thunderbolt Networking,PCIe 和 DisplayPort 隧道还不支持。评论区 cornedor 说他在 Fedora Asahi Remix 上用 Omarchy 的内核构建,给 m1n1 打了补丁,Thunderbolt 和 Touch ID 都能用。
PC 游戏方面,FEX、WINE 的 ARM64EC 支持和 muvm 解决了大部分问题。muvm 的性能损失约 20%。macOS 的优势在于 XNU 允许用户态进程按任意页粒度映射,Rosetta 只需让 XNU 给子进程映射 4 KiB 页。Linux 要求所有页与内核粒度一致。Android 正从 4 KiB 转向 16 KiB 页,Google 工程师提出的 P3S(Per Process Page Size,每进程页大小)跟踪每个进程的页表粒度,切换到不同粒度时写 TCR 的对应位。文章把补丁 rebase 到 Asahi 树上,测试了 Star Wars Battlefront(2004)、Wolfenstein: The New Order(2014)、GTA IV(2008)和 Fallout: New Vegas(2010)。Wolfenstein 在 M2 Max Mac Studio 上跑到 144+ FPS。
许可证变更
Asahi Linux 把所有仓库从 MIT 转向 GPLv2 或更高版本。文章回顾了 WINE 的历史:WINE 原本是 MIT,90 年代和 2000 年代出现大量专有分叉,2002 年转成 LGPL。Asahi 一开始用 MIT 是为了方便 BSD 等自由软件系统参与。现在有人利用宽松许可试图劫持项目,直接替换并激进变现 Linux on Apple Silicon。有些在开发中的功能代码从个人分叉里被拿走发布,没有署名,或用 LLM 改写掩盖来源。MIT 明确允许这些行为。今后所有 Asahi Linux 代码只用强 copyleft 许可。
评论区对许可证变更的讨论很热闹。有人问是不是指 Omarchy,有评论说 IRC 上很清楚就是。有人说 MIT 不禁商业使用,有什么好吵的。有人认为 Asahi 气的是 vibecoders 在他们的工作上构建、取得进展后重新发布,但现实中开源代码谁都能读,许可阻止不了。有人引 Theo de Raadt 2001 年的话,说宽松许可和自由软件有声誉,有些人想要声誉但不相信自由,于是从宽松到 copyleft 再到 source available。
关于为什么要在 Mac 上跑 Linux,有评论嘲讽买 2000 多美元不兼容的电脑然后多年抱怨。另一位回应 MacBook 硬件最好,旧 Mac 可以再利用,比如 M1 Mini 做无头服务器。也有人说没见过达到 Apple 硬件质量的笔记本,不是所有人都买新机器。
RealPage 算法定价案和解:3.6 亿美元给租客
案件与和解
美国田纳西州中区联邦地区法院批准了 RealPage 算法定价反垄断案的集体和解,向租客支付近 3.6 亿美元。法院在 10 月 15 日的裁定中认定和解“公平且充分”。案件始于 2022 年底至 2023 年初,一批集体诉讼针对 RealPage 和约 50 家最大的公寓业主与运营商,诉状称这家软件公司帮助房东串通抬高租金、超过自由市场水平。
和解分批达成:2025 年 5 月,11 家被告房东达成 14 份集体和解,金额 2.18 亿美元;同年 10 月,27 家房东达成 26 份和解,金额超过 1.418 亿美元。和解覆盖美国多户住宅租客:他们在 2018 年 10 月 18 日至 2025 年 11 月 21 日之间,向使用 RealPage 的 Revenue Management Solutions、Lease Rent Options、YieldStar 或 AI Revenue Management 的物业业主或运营商支付过租金。
没有公司承认过错或责任,但它们同意停止向 RealPage 提供非公开数据用于其收入管理系统的价格建议,也停止以使用竞争对手非公开数据影响定价的方式使用该系统。威斯康星大学麦迪逊分校反垄断专家 Peter Carstensen 对 Multifamily Dive 说,这些和解“不一定就是最终定论”,他质疑协议能否真正限制公司之间的协调与沟通。
州检察长反对
9 月 25 日被告房东申请最终批准后,哥伦比亚特区、肯塔基、马里兰、新泽西和华盛顿州的检察长反对协议,称其可能“非法限制”他们各自另行提起的诉讼。法官 Waverly Crenshaw 再次驳回,在 10 月 9 日的文件中写道,“拟议的免责条款并未损害州检察长的独立主权或准主权利益”,但表示会考虑他们的关切。Carstensen 指出,在第二届特朗普政府时期,司法部和联邦贸易委员会提起诉讼并达成和解,而各州提起同样的案件却没有按同样条款和解,反映出各州对联邦机构能否做正确的事缺乏信心。
社区讨论:操纵还是价格发现
Hacker News 的讨论集中在一个问题上:这到底是价格操纵,还是供应不足市场里的价格发现?用户 rabidheuristics 指出,和解没触及核心:RealPage 手握十年真实定价数据,只要服务没有极硬的边界,这种事还会再发生。skybrian 反问,当市场价格本就公开时,知道市价算不算串通?omgwtfbyobbq 回应,如果所有人还以非典型方式行动来维持高价,可能构成默契串通(tacit collusion)。rahimnathwani 则认为默契串通在这行不通,因为多数租赁市场并非寡头垄断。
用户 markasoftware 引用 arXiv 论文《Flash Boys 2.0》里的例子:去中心化交易所出现定价错误时,一群套利机器人竞相交易,谁赢取决于愿付多高的手续费;机器人互不通信,却通过快速加价形成了协调。sandworm101 反驳,这不是合作,而是拍卖中基本的价格发现与反应。
xvedejas 质疑问题是否真的存在,说他看到有说服力的论据表明,禁止算法定价的地方租金并没有明显下降,几乎相信问题完全在供给侧。ctmlr 回应,这是政治问题:房东把持各级政府,用权力人为限制住房供应。FireBeyond 描述了本地情况,开发商与县委员、规划委员会成员关系密切,而交通研究显示道路容量不足、环境影响评估显示岸线受损,委员会仍毫不犹豫地批准。
区分合法与非法
用户 bostik 提出了一套区分合法与非法的框架:订阅定价数据服务合法;用数据指导定价和设定初始价格合法;明示或默示地同意让定价数据设定价格下限,是串通;因需求不足仍拒绝降价而让房源空置,通常是糟糕的商业决策,可能是市场失灵的信号;为维持约定价格下限而让房源空置,则是串通和市场操纵。
FireBeyond 贴出司法部诉状细节,反驳“这不是价格操纵”的说法:软件包含算法,按 RealPage 数据规定“本周这个公寓的租金定为 X 美元”;要偏离就得申请“覆盖”,RealPage 可自行决定是否批准,其员工受过培训,覆盖批准不得超过请求的 5%;培训文件称“覆盖应少而罕见”,并提醒警惕“覆盖过载”或不听话的租赁代理;Greystar 的内部演示明确要求用户接受至少 95% 的 RealPage 生成价格;前员工确认,协商 RealPage 之外的价格不可接受。
关于到手金额,georgel 说他提交了索赔,按和解公式在 3 家被告房东处合计约 1500 美元,可能是他经历过金额最大的一次集体诉讼赔偿。robbiet480 说自己在两处 RealPage 物业共租住 151 个月,两处都被专家确认存在“高度软件串通”,按多付租金估算最高可获约 8.3 万美元,“等不及拿到大概 300 美元了”。
讨论延伸到其他行业。throwitaway222 说,每个行业几乎都有 RealPage 式的公司,应因反竞争定价和串通被彻底清除。59percentmore 指出,RealPage 在业内都不是唯一一家,Entrata 的营销材料承认,在六个月研究中,使用其定价的客户市场租金比同公司可比物业多涨 15%,却没人为此提起诉讼。有人列出酒店(IDeaS、Duetto)、航空(PROS、Amadeus)、零售(Pricefx、Revionics)等类似工具。claw-el 提到 Radford 收集薪资数据卖给公司用于设定薪资,与 RealPage 类似。
政策层面,epistasis 建议建立公开的租金登记系统,任何人都能浏览、分析。有人提到华盛顿特区的租金登记(rentregistry.dc.gov)。Gigachad 介绍澳大利亚维多利亚州的做法:续租必须提供同区域同价位或更高的可比租金,租客可用自己的可比数据反驳,新挂牌可任意定价。embedding-shape 介绍西班牙的 IRAV(租金参考指数),政府每年维护并限制涨幅,2026 年锁定在 2.14%。
GROUP BY 还能再快一点:用槽位剪掉整个分区
问题
Pivot 的博客介绍了一个针对 GROUP BY 的新优化:当查询只取聚合值最大的前 K 个组时,跳过大量不需要合并的分区。这类查询在真实负载里很常见,比如“哪 10 个商品的订单最多”“仓库里评分最高的 100 个商品”“过去 24 小时点赞最多的帖子”。
分析型数据库常规做法:每个 CPU 线程拿到一片输入数据,按分组键切成若干分区,各自聚合。所有线程完成第一轮聚合后,每个 worker 领到一段分区范围,把各线程在同一分区上的部分聚合结果合并成最终结果。这套流程给出的结果是对的,但对“取前 K”这类查询做了大量无用功。假设系统有 4096 个分区,前 10 个商品最多落在 10 个分区里,剩下至少 4086 个分区的合并结果对最终答案毫无贡献,却照样消耗 CPU。
槽位方案
最简单的想法是给每个分区维护一个总量计数器:合并阶段,如果某个分区的总订单数小于当前 TopK 里第 10 名的值,就直接跳过。问题是这个判据要求聚合值在组之间分布得极端不均。作者举例:当前 TopK 的最小值是 1000。分区 A 有 100 个商品、每个 15 单,总量 1500;分区 B 有 99 个商品各 1 单,外加一个商品 1401 单,总量也是 1500。只看总量,两个分区都得合并,但 A 其实可以安全跳过。
改进办法是给每个分区固定数量的“槽位”(slot)。每个组按哈希映射到一个槽,槽记录映射到它的所有组的计数之和。因为任何一组的计数都不超过所在槽的总量,所以只要所有槽的总量都低于当前 TopK 的最小值,整个分区就能剪掉。分区 A 的那 1500 单如果大致均匀地散在 8 个槽里,每槽约 180 到 195,立刻就可剪;分区 B 里那个 1401 单的商品会把某个槽顶到 1413,分区必须合并。
槽位用现成的哈希位来选:如果哈希的前 3 位选分区,接下来的 3 位就选分区内的 8 个槽之一。槽的数量和分区数量互相独立,可以只增加槽来获得更细的粒度,不必承担更多分区的开销。遇到所有值几乎一样的平坦分布,这个优化不起作用,引擎应当检测到并关掉它。
效果
ClickBench 里 63% 的查询属于“GROUP BY 之后按聚合值 ORDER BY”这种形态。其中最简单的 Q16 从 35.6 ms 降到 22.2 ms,执行过程中剪掉了 70% 以上的分区。作者预计,等 Pivot 支持 MPP(大规模并行处理)和落盘之后,收益会更大,因为跳过整个分区同时也省掉了 shuffle 和磁盘 I/O。
社区讨论
评论区里,malisper 指出这个数据结构就是 count-min sketch(计数最小草图),用它对能进入 GROUP BY 的元素设上界,从而省掉额外工作。SkiFire13 问为什么不在每个分区里并行做 Top-K 聚合,这样既能减少元素数量,又能拿到每个分区真实的最大值用于剪枝。malisper 解释了为什么不行:一个 item_id 可能在每个分区里都排第 11,跨分区求和之后才变成第 10,所以分区内的 Top-K 会漏掉它。
有人问 Pivot 和 DuckDB 有什么区别。Pivot 的作者回复说,DuckDB 是一个查询引擎,也能查 Iceberg 等开放表格式;Pivot 想做的事是把 ClickHouse 那样的“完整数据库”体验带到开放数据格式上。lmeyerov 觉得这个定位更像 MotherDuck。
关于横向扩展,toddbandrowsky 持怀疑态度:把数据在网络上搬来搬去,比直接把分组结果传回来贵得多;最快的 GROUP BY 是在同一台机器、从 NVMe 读进连续内存里做。sagarm 回应说,纵向扩展确实给出最快的执行时间;横向扩展的好处在于能按需增减、访问分离存储时聚合带宽更大、单机挂掉对集群影响很小,因此可以用更便宜的 spot 实例。
另一条长串在争论“1.6× faster”这个说法。misiek08 认为 35.6 ms 到 22.2 ms 是“快了 0.6 倍”,不该用新闻标题式的表达。Sesse__ 说这是快了 60%,也就是速度变为 1.6 倍,吞吐量才是描述性能的合理方式。d1sxeyes 认为问题只是“faster”一词用得不够严谨。
《极品飞车:地下狂飙 2》在浏览器里复活,还带多人自由漫游
项目
一个叫 nfsu2.xyz 的网站把《极品飞车:地下狂飙 2》搬进了浏览器:原版生涯模式、改装、赛事都在,还额外加了一层多人在线自由漫游(free roam)。打开网页就能看到其他人的车,对方也能看到你的;名字和国旗显示在车顶,可以组车队(最多 4 人)、加好友、用快捷聊天发预设短语,短语会按对方语言显示。页面显示主世界有 4,191 名玩家。
网站提供了不少实用设置:手柄、键盘和触屏都能玩,触屏可选按键、摇杆或重力感应转向;支持云存档,在设备和浏览器之间同步进度;还有截图、备份还原、隐藏 HUD、照片模式、帧率计数器。画面方面有宽屏修复、高清 HUD、去马赛克材质、字幕修复、未删减原声带等社区补丁。项目方在 Ko-fi 上接受捐赠,注明“所有人玩到的游戏相同,没有内购或付费特权”。
体验与技术
Hacker News 上的实际体验反馈差别很大。有人说在六年前的 Samsung S20+ 和 8 英寸平板上跑得很顺,有人在 iPhone 14 和 Safari 上满帧,也有人在 M2 MacBook Air 的 Firefox 里毫无问题。另一些人则遇到严重卡顿,直到手动打开 Chrome 的 enable-unsafe-webgpu 或 Vulkan 相关标志才流畅起来。有评论指出这个游戏当年在 PlayStation 2 上就能跑,而如今最便宜的手机性能都远超 PS2。
技术实现上,评论里贴出了 GitHub 仓库 th0mk/nfsu2-web,想自己托管的人可以拿去部署,但需要一份特定版本的游戏 .exe 文件。有人猜测是否用了 WASM 反编译。也有人提到 WebGL/WASM 做 3D 游戏仍会遇到垃圾回收造成的卡顿,这个项目也不例外。
法律争议
法律问题是讨论最集中的部分。多数人认为托管完整游戏资源并不合法,EA 仍持有版权。有人提醒,公开接受捐赠会让情况更糟,等于主动邀请版权方联系;网站自己留了 legal (at) nfsu2.xyz 的权利方联系邮箱,有人打趣说那可能直接通向 /dev/null。
支持者反驳说 EA 根本不卖这款游戏,官网的游戏列表里都找不到它,普通玩家没有合法购买途径,也没人因此受损。有人举《Alan Wake》因音乐授权到期下架后又重新上架的例子,指出 NFSU2 的音乐本身就是卖点,重新发行并不容易;还有人提到《Spec Ops: The Line》2024 年从商店下架后至今不可购买。一位评论者提出,版权法应当考虑“商业放弃”:如果作品曾公开发售、如今权利人不再以合理方式销售,应允许非商业复制和分发,且可以为覆盖分发成本接受捐赠,但不能把捐赠设为获取作品的前提。
怀旧与保存
有人说自己 9 岁生日收到这款游戏,却装不进父亲的电脑,只能去朋友家玩;现在它在老旧智能手机的浏览器里直接跑起来。有人希望更多老游戏这样复活,尤其是那些没有更好现代替代品的作品。也有人担心这类项目会促使大厂收紧 DRM 或转向纯云游戏。项目方似乎还在做《极品飞车:地下狂飙 1》。
怀旧情绪贯穿评论区。有人怀念 PS2 时代那种柔和、梦境般的光照,觉得比今天的超写实画面更让人安心;有人把这归因于硬件限制逼出的美术创造力。也有人只是留下一句“Riders on the storm……”。
古 DNA 让哥特人的起源神话重新站住脚
研究
公元 551 年,哥特史家约达尼斯(Jordanes)写下自己民族的起源:哥特人来自一个叫 Scandza 的寒冷岛屿,分乘三艘船渡海,在波罗的海南岸登陆后一路南下,直抵黑海。20 世纪中叶以来,大多数历史学家把这段话归入“幻想”一类。
本月《自然》(Nature)发表的一项古 DNA 研究让这个说法重新站住脚。研究扫描了从波兰到西班牙的青铜时代和铁器时代骨骼,发现公元 50 年左右,也就是最早一批哥特风格器物出现在波兰北部时,当地祖先成分出现大幅转变,转向类似铁器时代瑞典人的谱系。论文合著者、莱顿大学语言学家古斯·克罗嫩(Guus Kroonen)说:“我们看到几乎是完全的人口更替。”这指向一次大规模移民,而非几个有影响力的访客,时间也与语言学模型推算的哥特语从姐妹语言中分化出来的节点(约 2000 年前)吻合。
今年早些时候《基因组生物学》(Genome Biology)的另一项研究显示,在波兰东南部 175 至 350 年间的哥特风格墓葬里,斯堪的纳维亚遗传成分仍然很强,而且位置更靠南。这与约达尼斯所说哥特人抵达后继续向今乌克兰方向移动一致。上个月《细胞》(Cell)的论文则报告,500 年后包括苏维汇人和西哥特人在内的部落联盟征服西班牙时,队伍里仍有明显的北欧血统。
两章故事
不过,新证据并不支持“迁徙解释一切”。克罗嫩把哥特人的故事称为“两章”:开头是大迁徙,后来开始混血,哥特语的传播更多是文化性质的。华沙大学考古遗传学家玛蒂娜·莫拉克(Martyna Molak)团队发现,波兰南部哥特风格墓葬中约一半人有类似斯堪的纳维亚的祖先成分,但也有一些哥特式陪葬品随遗传上的外来者下葬。一对父女墓葬很说明问题:父亲有斯堪的纳维亚血统,女儿的 DNA 却显示母亲来自该地区之外一个不相关的群体。
再往南、往西,模式变了。马克斯·普朗克进化人类学研究所考古遗传学家约沙·格雷青格说:“模式从大规模迁徙转为精英传播文化。某个时候,是一个携带传统的精英群体在更大的联盟里保存了哥特语。”西班牙各地哥特和日耳曼风格墓葬中约三分之一骨骼有北欧血统,但人数似乎不多。几个世纪内,哥特统治的痕迹连同他们的日耳曼语言几乎全部消失,只在西班牙语里留下少数借词,比如与冲突和征服相关的“bandit”“helmet”“truce”。
史学背景
HN 用户 senderista 给出了更具体的背景:二战后,为回应科西纳等被纳粹青睐的种族主义考古学家,考古学兴起“陶器不是人”(pots aren't people)的口号,强调器物风格的变化不等于人群迁徙。2010 年代古 DNA 研究不断证明大规模迁徙存在,考古学家和人类学家最终不得不接受,也承认历史语言学家一直是对的。senderista 举了钟形杯文化的例子:它先从伊比利亚经文化传播向东扩散到中欧,再经大规模迁徙向西传回大西洋沿岸,一直到达不列颠,从新石器时代建造者手中夺取了巨石阵,而后者在一个世纪内几乎消失。
耶鲁大学历史学家诺埃尔·伦斯基没有参与这些研究,他说:“基因分型显示的正是古代文献所报告的,也是 20 世纪晚期史学一直努力否认的东西。”HN 用户 dmix 引用这段话后评论,这暗示学界过去倾向于把文化交融视为最有价值的解释,而不是一群人从远方到来、主导一个既有帝国并影响整个地区。
HN 用户 bazoom42 提醒,文章说得很清楚:北波兰有大迁徙的 DNA 证据,更南的地方则指向较小精英的移动。“评论区的人似乎非常希望非此即彼,不顾证据。”
为什么南下
至于哥特人为什么南下,HN 用户 jdw64 注意到这更像是包括妇女儿童在内的群体迁徙,而非战士群体的移动,并问是否有气候方面的研究。gorgmah 提到中世纪欧洲的相对动荡与气温下降相关,17 世纪的“普遍危机”期间北欧也出现大饥荒,猜测连续多年的严寒导致歉收,人们为了生存向南迁徙。TFNA 说,几十年来气候事件一直被视为民族大迁徙的驱动因素之一:亚洲草原某处牧草质量下降,依次挤压西边的民族,最终像雪崩一样滚入欧洲。
有用户一开始就问,为什么人们会怀疑这个故事:一个讲日耳曼语的民族来自斯堪的纳维亚,那里有哥特兰岛、东哥特兰省、西哥特兰省、哥德堡市,还有盖特人。瑞典用户 INTPenis 回应说,他一直以为这些地名是罗马之后很久、为了向罗马历史致敬才取的,因为瑞典 1000 年以前的历史非常模糊。
vintermann 补充了另一个版本的起源故事:哥特兰岛人口过剩,人们抽签决定哪三分之一离开。他还指出,哥特身份至少到后来更多与阿里乌斯派基督教绑定,而非血统,所以哥特人改宗天主教后就不再自称哥特人了。
锡拉火山下的阿克罗蒂里:一座被灰封存的青铜时代港口
遗址
圣托里尼岛南端的阿克罗蒂里(Akrotiri)是一座青铜时代聚落。锡拉火山喷发后,它被约 200 英尺厚的火山灰和浮石掩埋。喷发时间仍有争论,学者一般定在公元前 1620 年至前 1530 年之间。这是有记录以来最大的火山喷发之一,释放的火山物质约为 1883 年喀拉喀托喷发的四倍。火山灰落到今天的埃及和以色列,考古沉积层中的沙砾也提示多次海啸。
喷发前地面震动持续多日,居民带着财物乘船撤离,有人回来修缮,又在情况恶化时再次离开。考古学家至今没有在已发掘区域找到人类遗骸,说明多数甚至全部居民提前逃生。与庞贝不同,阿克罗蒂里留下的是一座被火山灰封存的空城。有读者说,这有一点遗憾也有点好笑:正因为居民把贵重物品带走了,我们对他们的了解反而少了。
发现与发掘
1866 年,工人在锡拉岛西侧的锡拉夏开采浮石,为苏伊士运河寻找隔热材料时发现史前建筑。1870 年法国雅典学院做过小规模发掘,系统性的阿克罗蒂里发掘到 1967 年才在考古学家 Spyridon Marinatos 带领下展开。Marinatos 此前研究克里特岛克诺索斯王宫遗址,把那里发现的浮石追溯到锡拉喷发,首次将阿克罗蒂里的毁灭与米诺斯文明的衰落联系起来。今天多数研究者认为,米诺斯衰落由环境变化、贸易下滑、政治动荡和迈锡尼崛起等多重因素造成,不再归因于单一灾难。
Marinatos 在 1974 年因发掘现场坠落去世,Christos Doumas 接任项目主任。阿克罗蒂里的发掘已挖到基岩,但估计只揭开了聚落的约 10%;2012 年建成的三英亩生物气候保护棚为脆弱建筑遮阳,并用风扇排走热空气。到过现场的人提醒,已发掘面积大约只有庞贝可见面积的四十分之一。
居民生活
阿克罗蒂里位于北非、欧洲和中东之间的航路上,早期青铜时代已参与海上贸易;考古证据显示居民中有农民、渔民和工匠。米诺斯文化带来多层建筑、彩绘壁画、铺砌街道和带室内管道的排水系统,考古学家已确认 35 座建筑。居民在没有森林和混凝土的条件下,用有限的木材、火山石、泥土和植物盖起三四层楼房。
Xeste 3 是一栋每层 14 个房间的多层建筑,其中两幅壁画保存得很好:一幅画三名妇女站在番红花田和祭坛之间,另一幅画妇女采集番红花,献给由蓝猴和狮鹫侍奉的女神。番红花可用作香料、染料和药物,有研究者认为它关联着女性参与农业和经济生活。出土陶器上画着燕子、海豚和番红花,一些罐底残留烧焦的大麦和蚕豆;“乳头壶”把壶身做成女性身体的样子,有些还戴着耳环和项链。
有读者补充,这里没有发现防御墙和钱币,贸易网络却远到中亚,青金石来自今天的阿富汗;线形文字 A 泥板和壁画把居民与米诺斯文化紧密联系起来,不过当地导游会谨慎地不直接称他们为“米诺斯人”。一位协助过锡拉壁画计算复原的读者说,喷发没有立刻摧毁米诺斯文明,港口和船队受扰后,宫殿在几百年间陆续毁坏,迈锡尼人最终崛起。
亚特兰蒂斯联想
有人把阿克罗蒂里和柏拉图的亚特兰蒂斯联系起来。柏拉图在公元前 360 年左右提到这座沉没岛屿,多数现代学者认为那是政治寓言。读者对此有不同看法:有人说柏拉图描述的中央岩柱、温泉和环形水域很像火山岛,古人未必能凭空编出;也有人提醒,亚特兰蒂斯是柏拉图为了讨论权力与腐败而虚构的城邦,位置还在海格力斯之柱之外的大西洋,把它当历史会像把蝙蝠侠漫画当历史。
阿克罗蒂里今天对公众开放,游客可以自行参观或请导游讲解。附近的锡拉史前博物馆收藏许多出土文物。有读者推荐这座小而精的博物馆,说壁画令人难忘,也提醒费拉镇很拥挤。2027 年,当地将纪念正式发掘 60 周年。
在圣马力诺待了三天:微型国家的生存策略
国家概况
马特·拉基曼在圣马力诺待了三天。这个被意大利完全包围的内陆微型国家人口 33,500,面积 23.6 平方英里,比曼哈顿略大;名义 GDP 约 22.5 亿美元,人均 65,543 美元,预期寿命 86 岁,中位年龄 48.6 岁,谋杀率 0,最大出口是“洗涤和灌装机械”。拉基曼说,欧洲微型国家的旅行体验和阿富汗相反:它们美丽、富裕、安全,政府运转良好,经济平稳,二战后没发生什么大事,属于“令人愉快地无聊”的地方。Hacker News 读者 isolay 把这句话总结成“无聊是好事”。
从里米尼坐每小时一班的巴士,45 分钟就能到圣马力诺,没有边境检查。作者原以为微型国家都像梵蒂冈或摩纳哥那样紧凑、城市,结果大部分地方是陡峭的丘陵、公路和村庄。Serravalle 靠近里米尼,有购物中心、批发商和中产住宅,是全国人口最多的市镇;首都圣马力诺城反而只有四千多人,几乎全让给旅游和政府功能。首都建在 Monte Titano 山顶,三座塔楼从全国很多地方都能看见。
建国与幸存
圣马力诺自称世界上最古老的连续共和国。建国神话说 301 年,一个叫 Marinus 的基督徒石匠从今天的克罗地亚逃到意大利中部,后来被封圣。作者说这故事来自至少 600 年后写的基督教手稿,没有确凿证据;最早可靠文件是 885 年的 Placito Feretrano,一份教会法律裁决,确认圣马力诺修道院与里米尼主教土地分离。1243 年一份土地买卖公证文件提到两名 Consuls 治理圣马力诺,这是它作为独立城邦的最早文献。作者觉得有意思的是,这个国家到底怎么开始的,现代学者只能确定在 300 年到 1243 年之间某处。
1463 年,圣马力诺帮教宗庇护二世打里米尼领主,胜利后获得四个 castelli,领土翻倍,形成今天的边界。作者数出 13 次入侵或吞并企图,从 1300 年 Montefeltro 主教主张领土、1443 年 Malatesta 家族夜袭、1502 年切萨雷·博尔贾占领,到 1543 年 500 名佣兵夜袭遇到大雾、1631 年乌尔比诺公国并入教宗国后靠外交让教宗确认独立。1797 年拿破仑打遍意大利,圣马力诺以为自己完了,结果拿破仑喜欢这个“罗马共和国的小后代”,送粮食、送四门炮,还提出让它向东扩到亚得里亚海;圣马力诺拒绝了,理由是保持小而弱、别惹未来邻居。
作者总结,圣马力诺的生存策略是把“小和弱”变成资产:太穷、太虔诚、太不重要,打它不划算,名声还不好。后来它又改用共和主义、保守主义这些标签,继续站在潜在入侵者喜欢的一边。另一个解释是主权合法性会复利,存续越久,吞并它的外交和道德成本越高。
20 世纪
1922 年,圣马力诺法西斯党成立,比墨索里尼进军罗马早约两个半月。作者说圣马力诺是全世界第二个法西斯国家,法西斯政权持续 20 年,长度仅次于意大利。1921 年人口 12,624,PFS 峰值党员 1,938,所以那是一场“蚂蚁规模的法西斯运动”。法西斯时期圣马力诺继续选举,1926 年把选举权限制回男性家长、大学毕业生、民兵和纳税够多的人,随后一次选举 2,445 票里 2,444 票投给 PFS,1 票无效。1942 年还通过第 33 号法律,禁止所谓雅利安血统的圣马力诺公民与非雅利安人结婚。
1943 年 7 月 25 日墨索里尼倒台,三天后圣马力诺 PFS 政府也在街头抗议中辞职。9 月德国救出墨索里尼,意大利北部变成德国傀儡政权,Gozi 在 10 月提出“公民和解协议”,五名法西斯分子进入 20 人国务委员会,圣马力诺又部分法西斯化。战争还是来了:到 1944 年中,这个 1.3-1.5 万人的国家收容了约 10 万难民,17 条铁路隧道成了主要营地;政府把面包配给降到每人每天 50 克。1944 年 6 月英国皇家空军根据错误情报轰炸铁路,炸死 37 名圣马力诺人和 26 名难民,1961 年英国政府赔了 8 万英镑但拒绝认错。9 月德军入侵,英印军队打进来解放首都。战后清洗很轻:Gozi 判 7 年,六个月后改流放,1952 年回国,1955 年在家中去世;总共 50 人被定罪。
1945 年 3 月圣马力诺战后第一次选举,左翼联盟赢得约三分之二,成为世界上第一个通过民主选举让共产党人进入政府的国家。Hacker News 用户 ykl 说,圣马力诺像把 20 世纪欧洲史缩微演了一遍:法西斯、共产党、温和派轮番上场,但每次都温柔得像迷你版。
1948 年意大利因圣马力诺的半共产党政府扣留海关补偿金五年。这笔钱在 1862 年设立时超过圣马力诺年收入的一半,二战后仍约占一半。1949 年圣马力诺开了一家赌场,只允许非公民赌博,意大利内政部长下令在所有进入圣马力诺的道路设卡,查车查到拆轮胎、拆引擎,司机可能被堵 8-10 小时。赌场撑了几个月,1951 年 8 月关闭。1953 年两国签新协议,意大利补付 1946-1952 年每年 9,000 万里拉,之后每年 1.5 亿里拉。今天海关补偿金是每年 465 万欧元,只占圣马力诺 2025 年 7.1855 亿欧元收入的 0.6%。
今日观察
作者把圣马力诺分成四块:商业郊区;从东北到首都的丘陵公路带;首都的旅游老城和三座塔;其余像意大利丘陵乡村。他说 99.9% 的游客 99.9% 的时间都待在首都。他提出一个“最大旅游饱和代理指标”:当一座老城开始开跟本地毫无关系的噱头博物馆,比如吸血鬼与狼人博物馆、幻觉博物馆连锁、自拍博物馆、性博物馆、巧克力博物馆、酷刑博物馆,就说明旅游化过头了。圣马力诺有酷刑博物馆,也有吸血鬼/狼人博物馆。
他三天里几乎没跟圣马力诺人说上话:旅舍前台是意大利人,说圣马力诺工资高、官僚气少;纪念品店老板是摩尔多瓦人,住了 15 年还没入籍,还要再等 5 年;路边咖啡馆服务员是意大利人,每天通勤。Hacker News 读者 wincy 说读到结尾有点难过,作者始终没找到本地人聊天。
圣马力诺人均汽车保有量世界第一,作者猜原因是富裕、人口分散、公路为主、公交只有一条线、很多人通勤里米尼、意大利人本来就爱车;一个实打实的因素是税:多数欧盟国家汽车有 17-21% 增值税,圣马力诺没有增值税,标准汽车进口税 17%,工作车辆 4-8%。
圣马力诺不是欧盟成员,但和欧盟有关税同盟、用欧元、开放边界、自动交换金融信息;它不交欧盟预算,没有欧盟增值税下限,不遵守欧盟财政规则,能自己定居留配额。2026 年 10 月它跟欧盟签了新协议,经济上几乎并入欧盟,移民政策除外。意大利每天有约 9,000 人来圣马力诺工作,占私营部门劳动力的 45%。
2024 年出生率 4.2‰,全球最低,低于韩国 4.7‰、香港 4.9‰;中位年龄近 50,年轻人外流。FIFA 排名 211,世界倒数第一。新冠期间它一度是欧洲感染率和死亡率最高的地方。银行系统在 2008 年后崩得厉害:2020 年四家银行的不良贷款率 63%,2022 年 53%,2025 年 17%。作者说这比美国 2009 年 5.4% 的不良贷款率还糟得多,原因是它长期替意大利富裕储户做离岸银行业务,资产质量本来就差,2008 年后意大利收紧监管,资金撤走。
播客全文
女:Hello 大家好,欢迎收听 Agili 的 Hacker Podcast,我是莓莓。
男:大家好,我是阿迪。
女:今天这期跨度挺大。从终端模拟库聊到浏览器里的老游戏,中间经过 macOS 的隐私图谱、古 DNA、青铜时代遗址,最后落到一个欧洲微型国家。
男:像一次长途旅行。
女:差不多。先从 libghostty-vt 发布 1.0 说起。
男:它把 Ghostty 终端模拟器最核心的部分抽成了一个独立的库。别的软件想内嵌完整终端,直接链这个库就行。JetBrains 全系 IDE 的内置终端已经跑在它上面,覆盖超过 1250 万经常活跃用户。Neovim 有个已批准的 PR 要拿它替换 libvterm,顺带解决一个存在十年的问题——调整窗口大小时回滚缓冲区不能重排。
女:一年前 Mitchell 写文章说 libghostty 要来了,那时候 C API 还不存在。现在它跑在数百个免费和商业产品里,服务数百万用户。
男:1.0 的核心承诺是 ABI(应用二进制接口)稳定。所有对象是不透明句柄,用新头文件链接旧库的程序会拿到 GHOSTTY_UNSUPPORTED,不会崩溃。持续集成用 libabigail 每次改动都检查。
女:有人担心 AI 时代大家都会自己写终端子集。有评论说,AI 不改变维护成本,bug 修复、更新、打磨都得持续投入。libghostty 省掉的是把终端引擎做对一次的成本,标签页、分屏这些主观偏好留给上层。像浏览器引擎和浏览器的关系。
女:接下来聊 Asahi Linux。
男:Asahi 发布了 Linux 7.3 周期的进展报告。macaudio 和 avd 两个主要驱动进入邮件列表评审。AVD 驱动只在下游树里待了不到 3 个月就提交,约 13000 行代码,是主要 SoC(片上系统)组件里周转最快的一次。M3 支持去掉了 EXPERT 标志,正式可用,早期采用者几乎没有报告问题。
女:图形处理器方面呢?
男:M3 GPU 的逆向由一组新贡献者推进。m1n1 能初始化 GPU,团队画出了三角形。社区里 superdisk 说自己写了个 M3 GPU 驱动,能启动 KDE、跑 Quake 和 GLXGears,还不完全可用。Thunderbolt 补丁也出现在邮件列表上,目前支持 USB3、XDomain 和 Thunderbolt Networking,PCIe 和 DisplayPort 隧道还不支持。
女:还有个挺重要的变化,许可证从 MIT 转向 GPLv2 或更高。
男:文章说得很直接。有人利用宽松许可试图劫持项目,直接替换并激进变现 Linux on Apple Silicon。有些开发中的代码从个人分叉里被拿走发布,没有署名,或用 LLM 改写掩盖来源。MIT 明确允许这些行为。今后所有 Asahi Linux 代码只用强 copyleft(著佐权)。
女:评论区有人提到 Omarchy,也有人说 MIT 不禁商业使用,有什么好吵的。还有人问为什么要在 Mac 上跑 Linux。
男:一位听众回应得挺好:MacBook 硬件最好,旧 Mac 可以再利用,比如 M1 Mini 做无头服务器。这是 Hacker News,人们想在硬件上跑自己的软件。
女:接下来这个话题跟 AI 有关。Anthropic 发了一篇讲 agent memory 的长文。
男:他们把记忆定义为 Claude 从交互和任务里获得、能跨会话保留、之后可以读到的上下文。分四层:最底下是可搜索的会话记录,往上是 Claude 自己写的记忆笔记,再往上是 wiki 这种记忆表示,最顶层是每次会话预先加载的注入上下文。层与层之间靠 dreaming 连接。
女:dreaming 借的是人类睡眠时海马体回放的类比。
男:对。海马体在当下捕捉经历,只有一部分在离线时被巩固成长期知识。agent 可以把空闲算力用来回看日志、改正错误、生成新笔记、重建记忆表示。
女:效果数据呢?
男:CL-Bench 数据库任务里,Opus 4.7 无记忆 0.383,带记忆升到 0.700;Opus 5 从 0.564 升到 0.828。Pokémon 测试里,Sonnet 3.7 把一切可能有用的事都写下来,写了 413 个文件、分布在 225 个文件夹里,拿到一个徽章。Fable 5 只写了 9 个文件加一个 global.md,拿到四个徽章。
女:评论区不少人说第一反应是关掉自动记忆。
男:一位用户估计,Claude Code 自动生成的记忆他删掉 95%,因为这些记忆通常只对当前任务有用,留着会污染上下文。另一位说关掉记忆明显减少了使用 agent 时的意外。这跟文章里的发现对得上:自动写下来的记忆需要筛选,否则很快变成负担。
女:也有人反感 dreaming 这个词。
男:有读者认为模型既不休息也不调节激素,人类做梦可能只是记忆巩固的副作用,用这个词会带上意识含义。也有人认为这个词抓住了离线回看并整理的类比。
女:从 AI 记忆转到数据库。Pivot 的博客介绍了一个针对 GROUP BY 的新优化。
男:当查询只取聚合值最大的前 K 个组时,跳过大量不需要合并的分区。这类查询很常见,哪 10 个商品订单最多、仓库里评分最高的 100 个商品、过去 24 小时点赞最多的帖子。常规做法是每个线程把输入切成若干分区各自聚合,然后合并。假设系统有 4096 个分区,前 10 个商品最多落在 10 个分区里,剩下至少 4086 个分区的合并结果对最终答案毫无贡献,却照样消耗 CPU。
女:怎么剪?
男:给每个分区维护总量计数器,如果某个分区的总订单数小于当前 Top K 里第 10 名的值,就直接跳过。更细的做法是给每个分区固定数量的槽位,每个组按哈希映射到一个槽,槽记录映射到它的所有组的计数之和。只要所有槽的总量都低于当前 Top K 的最小值,整个分区就能剪掉。
女:效果呢?
男:ClickBench 里 63% 的查询是 GROUP BY 之后按聚合值 ORDER BY。最简单的 Q16 从 35.6 ms 降到 22.2 ms,执行过程中剪掉了 70% 以上的分区。
女:评论区有人指出这就是 count-min sketch。
男:对,也就是计数最小草图。用它对能进入 GROUP BY 的元素设上界,省掉额外工作。也有人问为什么不在每个分区里并行做 Top-K 聚合。回答是一个 item_id 可能在每个分区里都排第 11,跨分区求和之后才变成第 10,分区内的 Top-K 会漏掉它。
女:下一个话题有点让人后背发凉。从 macOS 13 开始,每台 Mac 都带着一对守护进程,knowledgeconstructiond 和 intelligenceplatformd。
男:它们的任务是在设备上构建一张关于你的知识图谱。你是谁、你认识谁、这些人彼此之间以及和你是什么关系、你如何与他们通信、你去哪里、做什么、什么时候做。苹果对这个机制几乎没有文档。
女:数据存在哪?
男:~/Library/IntelligencePlatform,51 个 SQLite 数据库,明文存储。这个目录受 TCC 保护,TCC 是 macOS 的隐私权限机制,全盘访问需要授权。最核心的是 graph.db,一个三元组存储,181 个实体类和 278 个谓词。数据来源包括通讯录、照片里的人脸、日历标题和参与者、家庭共享包括每个成员的年龄、健康应用里的医疗急救联系人、Siri 建议从邮件和消息中找到的事件和联系人、应用通过 App Intents 捐赠的人。
女:推断方法呢?
男:一对 XGBoost 分类器从 144 个特征判断谁是你的家人;照片里的 12 个分析器根据谁和你出现在哪些照片、哪些旅行和节日里,给伴侣、父母、子女、同事和朋友打分;苹果的端侧 LLM(大语言模型)读你的消息,给一张脸配上名字和关系。144 个特征里有个名字特别有意思:photosPersonPosteriorProbabilityGivenSaturdayNight,这个分类器的任务是判断某人是不是你的家人。
女:删除呢?
男:删掉一个联系人,没有东西会重新推导他们,下一次运行会整表替换。但存储保留第二张表 expired_stable_graph,被撤回的行移过去,保留置信度和来源。一个结论也能比它的证据活得久。在作者的 Mac 上,评分卡仍在给图谱前一天已经删掉的两个人打分。
女:这件事不只关于你。
男:对。你周围的人也在里面:家人、朋友、任何通过你的设备和你讲过话的人。没有人被问过。社区里很多人说毛骨悚然。一位评论者跑完 iKnow 后说“绝对恐怖”,即使关掉并封锁了所有 Intelligence 和 Siri 相关功能,系统仍在做这些事,这让他考虑换 Debian。
女:有人指出“本地”没那么简单。
男:一位评论者在一台不常用但登录了 iCloud 的 MacBook 上运行 iKnow,看到大量从 iPhone 共享过来的活动、名字和联系人,而那台笔记本上根本没装那些应用。另一位的厨房 MacBook 得到同样结果:那张本地图谱看到了 iPhone 上的一切,包括 Signal 联系人,甚至有人脸聚类。
女:实测效果并不好。
男:一位评论者说他的 Mac 几乎不知道他的社交圈,除了标注为妈妈爸爸的父母;系统把一个明显是假的联系人标成家人、伴侣、孩子和兄弟姐妹,把已故朋友标成家人,把律师卡在朋友线 0.47,却漏掉了同居伴侣。另一位说分类器分不清他妻子更可能是儿子还是女儿。
女:有人问怎么禁用。
男:答案不乐观。有人说不能;有人给了 flock 脚本,删掉 IntelligencePlatform 目录,用 touch 建一个空文件,设 root 所有、444 权限、schg 标志。作者说输出理论上留在本地磁盘,但 Apple Intelligence 理论上可以查询它,文档接近零。
女:从隐私转到反垄断。美国田纳西州中区联邦地区法院批准了 RealPage 算法定价反垄断案的集体和解,向租客支付近 3.6 亿美元。
男:案件始于 2022 年底至 2023 年初,一批集体诉讼针对 RealPage 和约 50 家最大的公寓业主与运营商。诉状称这家软件公司帮助房东串通抬高租金、超过自由市场水平。
女:和解覆盖哪些人?
男:2018 年 10 月 18 日至 2025 年 11 月 21 日之间,向使用 RealPage 的 Revenue Management Solutions、Lease Rent Options、YieldStar 或 AI Revenue Management 的物业业主或运营商支付过租金的美国多户住宅租客。没有公司承认过错,但它们同意停止向 RealPage 提供非公开数据用于价格建议。
女:司法部诉状里有几个细节挺关键。
男:软件包含算法,按 RealPage 数据规定本周这个公寓的租金定为 X 美元;要偏离就得申请覆盖,RealPage 可自行决定是否批准,其员工受过培训,覆盖批准不得超过请求的 5%;培训文件称覆盖应少而罕见。Greystar 的内部演示明确要求用户接受至少 95% 的 RealPage 生成价格。
女:评论区关于这是价格操纵还是价格发现的争论很激烈。
男:有人指出和解没触及核心:RealPage 手握十年真实定价数据,只要服务没有极硬的边界,这种事还会再发生。有人反问,当市场价格本就公开时,知道市价算不算串通?有人回应,如果所有人还以非典型方式行动来维持高价,可能构成默契串通。
女:赔偿金额呢?
男:一位叫 georgel 的听众说他提交了索赔,按和解公式在 3 家被告房东处合计约 1500 美元,可能是他经历过金额最大的一次集体诉讼赔偿。另一位租住过两处 RealPage 物业共 151 个月,按多付租金估算最高可获约 8.3 万美元,他说“等不及拿到大概 300 美元了”。
女:讨论延伸到其他行业。
男:有人说每个行业几乎都有 RealPage 式的公司。有人指出 Entrata 的营销材料承认,六个月研究中使用其定价的客户市场租金比同公司可比物业多涨 15%,却没人为此提起诉讼。政策层面有人建议建立公开的租金登记系统,但这不能系统性地压低价格,只能防止个别宰客。有人介绍澳大利亚维多利亚州的做法:续租必须提供同区域同价位或更高的可比租金,租客可用自己的可比数据反驳。
女:接下来轻松一点。一个叫 nfsu2.xyz 的网站把《极品飞车:地下狂飙 2》搬进了浏览器。
男:原版生涯模式、改装、赛事都在,还额外加了一层多人在线自由漫游。打开网页就能看到其他人的车,对方也能看到你的;名字和国旗显示在车顶,可以组车队、加好友、用快捷聊天发预设短语。页面显示主世界有 4,191 名玩家。手柄、键盘、触屏都能玩,触屏可选按键、摇杆或重力感应转向;支持云存档。
女:实际体验反馈差别很大。
男:有人在六年前的 Samsung S20+ 和 8 英寸平板上跑得很顺,有人在 iPhone 14 和 Safari 上满帧,也有人在 M2 MacBook Air 的 Firefox 里毫无问题。另一些人则遇到严重卡顿,直到手动打开 Chrome 的 enable-unsafe-webgpu 或 Vulkan 相关标志才流畅起来。有评论指出这个游戏当年在 PS2 上就能跑,如今最便宜的手机性能都远超 PS2。
女:法律问题是讨论最集中的部分。
男:多数人认为托管完整游戏资源并不合法,EA 仍持有版权。有人提醒,公开接受捐赠会让情况更糟,等于主动邀请版权方联系;网站自己留了 legal (at) nfsu2.xyz 的权利方联系邮箱。支持者反驳说 EA 根本不卖这款游戏,官网的游戏列表里都找不到它,普通玩家没有合法购买途径,也没人因此受损。
女:一位评论者提出,版权法应当考虑“商业放弃”。
男:如果作品曾公开发售、如今权利人不再以合理方式销售,应允许非商业复制和分发。另一条线索是游戏保存。有人说自己 9 岁生日收到这款游戏,却装不进父亲的电脑,只能去朋友家玩;现在它在老旧智能手机的浏览器里直接跑起来。项目方似乎还在做《极品飞车:地下狂飙 1》。
女:从游戏跳到历史。《自然》本月发表的一项古 DNA 研究让一个古老的说法重新站住脚。
男:公元 551 年,哥特史家约达尼斯写下自己民族的起源:哥特人来自一个叫 Scandza 的寒冷岛屿,分乘三艘船渡海,在波罗的海南岸登陆后一路南下,直抵黑海。20 世纪中叶以来,大多数历史学家把这段话归入幻想一类。
女:新研究发现了什么?
男:研究扫描了从波兰到西班牙的青铜时代和铁器时代骨骼,发现公元 50 年左右,也就是最早一批哥特风格器物出现在波兰北部时,当地祖先成分出现大幅转变,转向类似铁器时代瑞典人的谱系。论文合著者、莱顿大学语言学家 Guus Kroonen 说:“我们看到几乎是完全的人口更替。”时间也与语言学模型推算的哥特语分化节点吻合。
女:但新证据并不支持“迁徙解释一切”。
男:Kroonen 把哥特人的故事称为“两章”:开头是大迁徙,后来开始混血,哥特语的传播更多是文化性质的。西班牙各地哥特和日耳曼风格墓葬中约三分之一骨骼有北欧血统,但人数似乎不多。论文合著者 Pablo Carrión 说:“要有语言变迁的动力,你需要更大的数量。”
女:评论区有人提供了背景。
男:二战后,为回应被纳粹青睐的种族主义考古学家,考古学兴起“陶器不是人”的口号,强调器物风格的变化不等于人群迁徙。2010 年代古 DNA 研究不断证明大规模迁徙存在,考古学家和人类学家最终不得不接受,也承认历史语言学家一直是对的。不过也有人提醒,北波兰有大迁徙的 DNA 证据,更南的地方则指向较小精英的移动,大家似乎非常希望非此即彼,不顾证据。
女:继续考古。圣托里尼岛南端的阿克罗蒂里是一座青铜时代聚落。
男:锡拉火山喷发后,它被约 200 英尺厚的火山灰和浮石掩埋。喷发时间仍有争论,学者一般定在公元前 1620 年至前 1530 年之间。这是有记录以来最大的火山喷发之一,释放的火山物质约为 1883 年喀拉喀托喷发的四倍。
女:居民逃走了吗?
男:考古学家至今没有在已发掘区域找到人类遗骸,说明多数甚至全部居民提前逃生。有读者说,这有一点遗憾也有点好笑:正因为居民把贵重物品带走了,我们对他们的了解反而少了。与庞贝不同,阿克罗蒂里留下的是一座被火山灰封存的空城。到过现场的人提醒,已发掘面积大约只有庞贝可见面积的四十分之一。
女:遗址里有什么?
男:米诺斯文化带来多层建筑、彩绘壁画、铺砌街道和带室内管道的排水系统,考古学家已确认 35 座建筑。Xeste 3 是一栋每层 14 个房间的多层建筑,其中两幅壁画保存得很好:一幅画三名妇女站在番红花田和祭坛之间,另一幅画妇女采集番红花,献给由蓝猴和狮鹫侍奉的女神。这里没有发现防御墙和钱币,贸易网络却远到中亚,青金石来自今天的阿富汗。
女:有人把阿克罗蒂里和亚特兰蒂斯联系起来。
男:柏拉图在公元前 360 年左右提到这座沉没岛屿,多数现代学者认为那是政治寓言。有人说柏拉图描述的中央岩柱、温泉和环形水域很像火山岛,古人未必能凭空编出;也有人提醒,亚特兰蒂斯是柏拉图为了讨论权力与腐败而虚构的城邦,把它当历史会像把蝙蝠侠漫画当历史。2027 年当地将纪念正式发掘 60 周年。
女:最后一个话题,轻松一点。马特·拉基曼在圣马力诺待了三天。
男:这个被意大利完全包围的内陆微型国家人口 33,500,面积 23.6 平方英里,比曼哈顿略大;名义 GDP 约 22.5 亿美元,人均 65,543 美元,预期寿命 86 岁,中位年龄 48.6 岁,谋杀率 0,最大出口是洗涤和灌装机械。他说欧洲微型国家的旅行体验和阿富汗相反:它们美丽、富裕、安全,政府运转良好,二战后没发生什么大事,属于“令人愉快地无聊”的地方。
女:有读者把这句话总结成“无聊是好事”。圣马力诺自称世界上最古老的连续共和国。
男:建国神话说 301 年,一个叫 Marinus 的基督徒石匠从今天的克罗地亚逃到意大利中部,后来被封圣,地名由他而来。作者说这故事来自至少 600 年后写的基督教手稿,没有确凿证据;最早可靠文件是 885 年的 Placito Feretrano。1243 年一份土地买卖公证文件提到两名执政官治理圣马力诺,这是它作为独立城邦的最早文献。
女:它的生存策略挺有意思。
男:作者总结,圣马力诺把“小和弱”变成资产:太穷、太虔诚、太不重要,打它不划算,名声还不好。后来它又改用共和主义、保守主义这些标签,继续站在潜在入侵者喜欢的一边。另一个解释是主权合法性会复利,存续越久,吞并它的外交和道德成本越高。
女:它也有过法西斯时期,战后还选出了共产党人。
男:1922 年圣马力诺法西斯党成立,比墨索里尼进军罗马早约两个半月。作者说它是全世界第二个法西斯国家,政权持续 20 年。1945 年 3 月战后第一次选举,左翼联盟赢得约三分之二,成为世界上第一个通过民主选举让共产党人进入政府的国家。共产党—社会党政府建立了接近全民的医疗、社保、贫困救助和学校补贴。妇女选举权拖到 1960 年,原因是左翼政府担心保守的圣马力诺女性一投票就把他们选下去。
女:作者在城里几乎没跟圣马力诺人说上话。
男:旅舍前台是意大利人,纪念品店老板是摩尔多瓦人,住了 15 年还没入籍,还要再等 5 年;路边咖啡馆服务员是意大利人,每天通勤;另一家咖啡馆里一屋子老头打多米诺,可能是圣马力诺人,但端咖啡的是巴西人。有位读者说读到结尾有点难过,作者始终没找到本地人聊天。
女:一些统计数字挺惊人。
男:圣马力诺人均汽车保有量世界第一。2024 年出生率 4.2‰,全球最低,低于韩国 4.7‰、香港 4.9‰、乌克兰和日本 5.7‰;中位年龄近 50,年轻人外流。FIFA 排名 211,世界倒数第一。银行系统在 2008 年后崩得厉害:2020 年四家银行的不良贷款率 63%,原因是它长期替意大利富裕储户做离岸银行业务,2008 年后意大利收紧监管,资金撤走。
女:今天聊了十个话题,从终端库到微型国家。
男:跨度确实大。
女:感谢大家收听这期节目。如果你喜欢我们的内容,记得使用泛用型播客客户端订阅,这样每期更新都能自动收到。
男:也可以在常用的播客应用里搜索 Agili 的 Hacker Podcast。我们下期见。
女:下期见。
参考链接
- Libghostty 1.0
- Need for Speed Underground 2 online in the browser
- Every Mac comes with an (undocumented) family member classifier
- A barbarian tribe's mythic origin story is true, ancient DNA reveals
- Greece has its own Pompeii: Thera buried Akrotiri in ash 17th-16th century BCE
- RealPage rent-pricing case wraps with nearly $360M to renters
- The Components of Agent Memory
- Can GROUP BY still be optimized after all these years?
- Notes on San Marino
- Asahi Linux Progress Linux 7.3
