2025-11-04

50 篇热帖

2. What is a manifold? (www.quantamagazine.org)

总结:流形——连接数学与现实世界的基石

本文介绍了数学概念“流形”(manifold),阐述了其重要性、定义、发展历程以及广泛的应用。

核心概念:

  • 流形是什么? 流形是一种空间,当你在其上的任何一点局部放大观察时,都会呈现出欧几里得空间(熟悉的平面、直线等)的特性。换句话说,虽然整体形状可能复杂,但在局部看起来是平坦的。例如,地球表面就是一个流形,因为在足够小的范围内,它看起来像一个平面。
  • 与欧几里得空间的区别: 传统的几何学研究的是欧几里得空间中的物体,例如三角形的角度和弦的长度。流形则允许研究更复杂的、可能弯曲的空间,并提供了一种统一的框架来处理不同维度和几何性质的空间。
  • 图表与地图集: 为了研究流形,数学家会将流形分割成多个重叠的“图表”(charts),每个图表用一组坐标来表示流形上的一个区域。这些图表以及它们之间的坐标关系构成一个“地图集”(atlas),用于在局部使用欧几里得空间的技术来分析流形。

发展历程:

  • 黎曼的贡献: 19世纪中叶,数学家黎曼将高斯关于曲面几何学的思想推广到任意维度,并提出了流形的的概念。他的想法最初被认为是抽象的,直到爱因斯坦在广义相对论中使用流形来描述时空,才使其真正得到认可。
  • 从哲学到现实: 黎曼的流形理论最初被认为是抽象的哲学概念,但后来被证明对物理学和数学至关重要。

应用领域:

  • 物理学: 爱因斯坦的广义相对论将时空描述为四维流形,引力被解释为该流形的弯曲。
  • 动力系统: 利用流形概念分析双摆等复杂动力系统的行为,将物理问题转化为几何问题,便于理解和解决。
  • 数据分析: 分析高维数据集,例如脑神经元活动,通过将数据点视为流形上的点来揭示数据结构。
  • 数学基础: 流形是现代拓扑学、几何学等数学分支的基础,为解决各种数学问题提供了通用的语言和工具。

总结:

流形是一种强大的数学工具,它超越了传统的几何学,提供了研究复杂空间和解决各种问题的通用框架。正如语言的字母表一样,流形是数学的基础,在物理学、数据分析等领域发挥着至关重要的作用。

3. This Day in 1988, the Morris worm infected 10% of the Internet within 24 hours (www.tomshardware.com)

1988年莫里斯蠕虫事件回顾:意外的后果与互联网安全警示

本文回顾了1988年发生的莫里斯蠕虫事件,该事件对当时尚处于起步阶段的互联网造成了重大影响。

事件经过:

  • 蠕虫的诞生: 1988年,康奈尔大学研究生罗伯特·塔潘·莫里斯编写了一段程序,旨在评估互联网的规模。然而,由于编程错误,这段程序演变成了一种蠕虫,并在24小时内感染了当时互联网的10%。
  • 传播方式: 莫里斯通过侵入麻省理工学院的计算机,从康奈尔的终端发起蠕虫的传播。
  • 技术细节: 该蠕虫使用C语言编写,主要针对BSD UNIX系统(如VAX和Sun-3机器)。它利用了互联网电子邮件系统的后门以及“finger”程序的漏洞进行自我复制和自动传播,无需依附于宿主程序。
  • 造成的损害: 蠕虫本身并未破坏文件,但导致了系统运行缓慢、消息传递延迟和系统崩溃等问题,并引发了广泛关注。一些机构不得不采取极端措施,例如完全擦除系统并断开网络连接长达一周。
  • 受影响机构: 众多著名学术机构和科研机构都受到了影响,包括伯克利、哈佛、普林斯顿、斯坦福、约翰霍普金斯大学、NASA和劳伦斯·利弗莫尔国家实验室。

调查与处理:

  • 身份揭露: 在专家努力寻找解决方案的同时,蠕虫的创建者身份也浮出水面。莫里斯试图匿名解释和道歉,但朋友不经意间透露了他的姓名,导致他成为调查对象。
  • FBI介入: 联邦调查局(FBI)介入调查,并通过对电脑文件和访谈的分析确认了莫里斯是蠕虫的创建者。
  • 法律后果: 莫里斯被指控违反了1986年《计算机欺诈与滥用法》。最终,他没有被判处监禁,而是处以罚款、缓刑和400小时的社区服务。

历史背景:

  • 互联网的早期状态: 1988年,互联网与今天大不相同。当时互联网的骨干网络是NSFNET,它是ARPANET的继任者,主要用于扩展网络范围,服务于学术界。 World Wide Web (WWW) 尚未出现。
  • 规模评估: 当时互联网大约有6万个连接系统,莫里斯蠕虫感染并影响了其中约6000个系统。
  • 经济损失: 蠕虫造成的经济损失估计在10万美元到数百万美元之间。

后续影响:

  • 计算机蠕虫的持续威胁: 计算机蠕虫仍然是一种令人担忧的现象。例如,去年出现了一种名为“Morris II”的基于生成式AI的蠕虫。

总而言之,莫里斯蠕虫事件是互联网安全历史上的一个重要教训,它突显了即使是出于良好意图编写的程序,也可能由于编程错误而产生意想不到的严重后果。该事件促使人们更加重视网络安全,并推动了相关技术的不断发展。

5. Show HN: A CSS-Only Terrain Generator (terra.layoutit.com)

CSS Terrain Generator 简要总结

该项目是一个名为“CSS Terrain Generator”的工具,其主要功能是生成地形图。

核心功能与特性:

  • 地形生成: 该工具专注于生成地形,并允许用户调整一些关键参数。
  • 可调整参数: 用户可以自定义以下参数:
    • 世界大小 (world size):控制生成地形的整体尺寸。
    • 陆地覆盖率 (landmass coverage):控制陆地在地形中的比例。
    • 地形类型 (terrain type):允许选择不同的地形类型。
    • 生物群落 (biome):用户可以指定地形的生物群落类型。
  • 相机设置 (camera settings):提供了相机控制选项,方便用户观察和调整生成的地形。
    • 旋转 X (rotate x):旋转角度为 45°。
    • 倾斜 Y (tilt y):倾斜角度为 60°。
    • 缩放 (zoom):缩放比例为 50%。
    • 平移 X (pan x):平移距离为 0px。
    • 抬升 Y (lift y):抬升距离为 0px。
  • 动画 (animate):支持动画功能,可以动态展示地形生成过程或效果。
  • 导出高度图 (Export Heightmap):允许将生成的地形导出为高度图文件,方便后续处理和使用。
  • 版本信息 (v0.0.1):当前版本为 v0.0.1,表明该项目处于早期开发阶段。

总结:

CSS Terrain Generator 是一个用于生成地形图的工具,用户可以通过调整参数来控制地形的大小、陆地覆盖率、地形类型和生物群落。 它还提供相机控制和动画功能,并支持将结果导出为高度图。 该项目目前处于 v0.0.1 版本。

6. Things you can do with diodes (lcamtuf.substack.com)

二极管:被忽视的电子元件 (Diode: 被忽视的电子元件 - Bèi hūshì de diànzǐ yuánjiàn)

这篇文章探讨了在电子学学习中经常被忽视的二极管,强调了它在电路中的重要性,并详细介绍了其物理特性、工作原理以及各种应用。

核心要点 (Héxīn yàodiǎn - Core Points):

  • 被忽视的元件: 与电阻、电容和电感等元件相比,二极管在电子学课程中往往缺乏足够的关注。
  • 物理基础: 纯硅的导电性差,需要通过掺杂(添加杂质)来改善。N型半导体提供多余的电子,P型半导体则提供“空穴”。当N型和P型半导体接触时,会在界面处形成内建电场和耗尽区。
  • 正向和反向偏置 (Zhèngxiàng hé fǎniàng piānzì - Forward and Reverse Bias): 当正向电压超过约600mV时,二极管开始导通。反向偏置下,二极管通常不导通,但当反向电压足够高时会发生雪崩击穿。
  • V-I特性: 二极管的电压-电流 (V-I) 曲线并非纯粹的指数曲线,而是呈现出更复杂的行为。
  • 应用 (Yìngyòng - Applications):
    • 电路保护: 利用Zener二极管或双向TVS器件保护电路免受过压损害。
    • 电压参考: 利用Zener二极管和电阻组合,构建简单的电压参考电路,可以通过级联提高精度。
    • 整流 (Zhěngliú - Rectification): 利用二极管将交流电转换为直流电,例如半波整流和全波整流。
    • 钳位电路 (Qiánwèi diànlù - Clamping Circuit): 利用钳位电路将交流信号的负电压钳位到零伏,常用于音频处理等场景。

结构与功能 (Jiégòu yǔ gōngnéng - Structure and Function):

  • 基本结构: 二极管是由一个P型半导体和N型半导体连接形成的PN结。
  • 功能: 二极管主要作为单向导通器件,允许电流在一个方向上流动,阻止电流在相反方向上流动。它也可以作为电压控制开关、电压参考和保护器件使用。

总结 (Zǒngjié - Summary):

二极管虽然看似简单,但在电子电路中具有广泛的应用。本文对二极管的基本原理、特性和应用进行了详细的阐述,旨在帮助读者更好地理解和应用这一重要的电子元件。 虽然现代电路中常常使用晶体管等更复杂的元件,但二极管仍然在许多应用中发挥着关键作用,尤其是在电路保护、电压参考和简单的功率变换电路中。

7. You can't cURL a Border (drobinin.com)

《You can't cURL a Border》文章摘要

背景与痛点

在跨国旅行中,旅客常需面对复杂且不透明的签证、护照、税务居民身份及停留天数(如申根区90/180天规则、英国税务年度)等审查。各国系统的计算标准和边缘规则(如午夜计算、转机停留界定、时区变更)各异且不向用户公开,导致旅客在抢购廉价机票时,难以快速评估行程是否会引发合规风险。

核心解决方案

为解决这一问题,作者开发了一款名为 Residency 的应用程序。该应用将传统的“行程记录”工具升级为类似代码检查器(Linter)的“状态模拟器”,能够在用户购票前预测并警告潜在的违规风险。

关键功能与技术架构

  • 行程模拟与合规预警:应用通过模拟未来行程,检查计划是否会破坏现有的签证窗口、税务居民身份测试或护照有效性,并提供具体的违规原因和天数余量,而非模糊的结论。
  • 精确的时间与状态处理
    • 事实数据以“瞬间(instants)”形式存储,并在相关司法管辖区的“本地日”进行逻辑推理。
    • 锁定生成结果时的时区数据库版本,确保即使未来规则或时钟变化,历史计算结果依然可重现。
    • 将护照等旅行证件视为“状态机”,追踪其有效期、空白页等约束条件及计时器。
  • 规则版本化与自定义:不硬编码全球所有国家的规则,而是采用带有版本控制的“规则解释”模块。应用解析基础数据库,并允许用户根据自身需求配置跟踪目标,规则库随用户反馈持续迭代。
  • 本地优先与隐私保护:应用采用纯本地计算,支持离线使用。拒绝添加服务器和云同步功能,以彻底规避个人移民历史数据上云带来的隐私泄露、数据保留政策及跨国法律管辖权风险。用户需通过手动导出文件进行跨设备迁移。

应用成果

作者利用该应用成功评估并购买了前往冰岛的廉价机票,应用准确提示了无需国际驾照、未超出申根停留限制,并预警了英国税务居民身份的变化。该应用采用无订阅的低价买断制,旨在帮助旅客在官方系统之外,精确掌握和追踪自身的合规状态。

8. </> Htmx – The Fetch()ening (htmx.org)

htmx 4.0:一个彻底的内部重构 (htmx 4.0: A Complete Internal Overhaul)

Carson Gross 于 2025 年 11 月 1 日发布

这篇文章宣布了 htmx 的第四个主要版本(htmx 4.0)的开发,尽管之前曾表示不会有 htmx 3.0。本次更新将对 htmx 的内部架构进行重大改造,旨在简化库并利用现代 JavaScript 功能。

主要目标和变化:

  • fetch() 替代 XMLHttpRequest: hmtx 4.0 将使用 fetch() API 替代旧的 XMLHttpRequest,这是 htmx 1.0 中为了支持 IE 而保留的遗留技术。 这将改变事件模型,但对大多数用户的影响不大。
  • 显式继承默认设置: 过去 htmx 采用隐式属性继承,这类似于 CSS 的行为,但结果也类似:强大但令人困惑。 htmx 4.0 将默认采用显式继承,使用 :inherited 修饰符:例如 <div hx-target:inherited="#output">。 用户可以选择通过配置变量恢复隐式继承行为。
  • 取消本地缓存历史记录: hmtx 2.0 使用本地缓存来加速导航,但由于第三方修改和隐藏状态等问题,经常导致不稳定。 htmx 4.0 将放弃本地缓存,而是通过网络请求恢复内容,这与 htmx 2.0 在历史缓存未命中时的行为相同。 一个可选的扩展可以重新启用历史缓存功能。
  • 核心功能保持不变: hx-get, hx-post, hx-target, hx-boost, hx-swap, hx-trigger 等核心功能将保持不变,大多数 htmx 2.x 应用可以通过一些配置调整来兼容 htmx 4.x。

新增功能:

  • 流式响应和 SSE 核心支持: 利用 fetch() 的流式响应能力,htmx 4.0 将支持流式内容交换,并重新集成 Server Sent Events (SSE) 支持。
  • 核心 Morphing Swap: 将之前作为扩展提供的 idiomorph DOM 变形算法集成到核心中,以实现更智能的 DOM 更新。
  • 显式 <htmx-partial> 标签支持: 引入 <htmx-partial> 标签,用于更清晰地处理“异地”交换,简化了相关语法。
  • 改进的 View Transitions 支持: 改进了对 View Transitions API 的支持,并添加了过渡队列以确保平滑过渡。
  • 稳定事件顺序: 利用 fetch() 和异步支持,保证事件顺序的稳定性,并采用新的事件命名规范 htmx:<phase>:<system>[:<optional-sub-action>]
  • 改进的扩展支持: 允许扩展开发者替换 htmx 请求的 fetch() 实现,并提供了更好的异步操作支持。
  • 改进的 hx-on 支持: 统一 hx-on 属性的语法为 hx-on:<event name>,并提供更简单的异步 DOM 脚本 API。

升级说明:

升级到 htmx 4.0 将比从 1.0 升级到 2.0 更加复杂。 为了缓解这个问题,htmx 2.0 将永久支持,并且 htmx 4.0 将以分阶段发布的方式推出,先作为 “next” 版本,再在 2027 年初左右成为 “latest” 版本。

时间线:

  • Alpha 版本已发布。
  • 4.0.0 版本预计在 2026 年初到年中发布。

总的来说,htmx 4.0 的目标是提供一个更简洁、更强大、更易于维护的 htmx 库。

9. Learning to read Arthur Whitney's C to become smart (2024) (needleful.net)

好的,这是对原始内容的中文总结,字数控制在800字以内,不包含个人意见或未在原文中出现的信息,并使用markdown格式:

关于Arthur Whitney及其怪异的C代码

本文介绍了计算机科学家Arthur Whitney及其设计的一些著名软件,包括A、K、Q编程语言、高性能数据库kdb(应用于金融领域)以及用于处理万亿行数据集的Shakti。文章主要探讨了Whitney编写C代码的独特风格,具体以他为简单的K语言解释器编写的50行C代码为例。

核心内容:

  • 作者简介: Arthur Whitney是一位计算机科学家,在编程语言和数据库领域颇有建树。
  • kdb及其应用: kdb是一种高性能数据库,广泛应用于华尔街,表明其可靠性。
  • 代码示例: 作者提供了一段用C语言编写的K语言解释器的代码(约50行),并将其公开在GitHub上(https://github.com/kparc/ksimple)。
  • 代码风格的特点: Whitney的代码风格非常简洁,大量使用宏,并采用非标准的C语法,旨在将逻辑压缩到一屏内。这使得代码难以理解,但作者认为这种风格可以帮助开发者更好地掌握整个程序的结构和逻辑。

代码分析 (a.h & a.c):

  • a.h头文件:
    • 定义了schar*cchar
    • 使用宏_, x, $等简化代码,例如x(a, ax)用于定义局部变量并执行代码块。
    • 定义了Q, Qs, Qr, Qd, Qz等宏,用于处理错误。
    • 使用宏_s, _i, f, F定义函数声明,隐藏了函数的具体实现。
    • 定义了ax, ix, nx, xi等宏,用于处理原子和向量的访问。
    • 定义了oo宏,用于打印 "oo\n"。
  • a.c文件:
    • 包含a.h头文件。
    • 使用宏r简化向量的创建和初始化。
    • 定义了fF函数,用于打印字符串和错误信息。
    • 定义了wi函数,用于将整数格式化为字符串并打印。
    • 定义了W函数,用于打印数字和向量。
    • 定义了srt, uni, Cut, Drp等函数,目前都只是返回 "nyi" (Not yet implemented)。
    • 定义了m函数,用于动态分配内存。
    • 定义了A宏,用于查找字符在字符串中的位置。
    • 定义了g宏,用于处理原子和向量的操作。
    • 定义了not, sub, At, _A等函数,用于执行逻辑和数学运算。
    • 定义了G宏,用于简化各种比较和算术操作。
    • 定义了cat, at, rev, cnt等函数,用于字符串操作。
    • 定义了v宏,用于将字符映射到变量名。
    • 定义了函数指针数组fF,用于实现函数调用。
    • 定义了n函数,用于将字符转换为数字或变量名。
    • 定义了e函数,用于评估表达式。
    • main函数:在一个无限循环中读取用户输入,并使用e函数评估表达式,然后打印结果。

作者的看法:

作者虽然认为Whitney的编码风格难以理解,但认为这种风格也具有一些优点:

  • 减少滚动: 这种紧凑的代码布局可以减少在代码中滚动浏览的需求。
  • 挑战阅读能力: 阅读这种代码可以锻炼阅读能力。
  • 暴露复杂性: 这种风格将代码的复杂性一次性展现出来,可能有助于更快速地理解整个程序的逻辑。

总结:

本文通过分析Arthur Whitney编写的K语言解释器代码,展示了一种非常独特的C代码风格。尽管这种风格难以理解,但作者认为它可能具有一些优点,并提出了进一步扩展该解释器的想法。文章也探讨了代码风格对开发者工作方式的影响,以及如何通过挑战阅读习惯来提高编程技能。

10. When stick figures fought (animationobsessive.substack.com)

动画狂热:回顾《小动画》及其在中国的辉煌

本期《动画狂热》周刊通讯重点关注了Flash系列《小动画》,并分享了动画相关的新闻。通讯首先回顾了Flash作为互联网早期重要技术的作用,以及它在中国兴起并定义了一个时代的意义。

《小动画》的崛起:中国Flash动画的里程碑

《小动画》(2000–2002)是朱志强创作的一部暴力动作系列动画,以简单的棍人形象为主角,讲述了充满武术、枪战、鲜血和混乱的故事。它迅速风靡中国,并迅速传播到世界各地,成为全球现象。

朱志强并非专业动画师,他是一位在京工作的平面设计师,在业余时间通过Flash创作动画。他最初受到香港动作片和《龙珠》的启发,并从《帮派天堂》等早期Flash动画中汲取灵感。

《小动画》系列中最具影响力的作品是《小动画3》,它以其独特的风格和流畅的动作赢得了全球观众的喜爱,并在网站如Newgrounds和Albino Blacksheep上广受欢迎。它被《底特律自由报》誉为“杰奇·陈式”的武术动作片,并因其“矩阵式”的摄影技术而受到赞赏。

朱志强的创业之路与版权纠纷

《小动画》的成功让朱志强一举成名,他开始接受商业委托,并与韩国Barunson公司合作。然而,他随后与耐克公司就其“Stickman”广告活动展开了一场旷日持久的版权纠纷。耐克被指抄袭了《小动画》的风格,但法院最终判决朱志强败诉。

这次经历对朱志强产生了重大影响,他逐渐淡出了动画创作领域,转而从事游戏开发工作。

《小动画》的遗产与影响

尽管朱志强未能从《小动画》的成功中获得经济上的回报,但这部作品的影响力却不容忽视。它不仅开启了中国Flash动画的黄金时代,也为全球的动画创作带来了新的灵感。

《小动画》简单易懂的风格,使其成为许多动画爱好者的入门作品,并激发了无数模仿者。它对中国动画产业的贡献是巨大的,为后来的动画创作者如张芃(《斩妖》导演)铺平了道路。

其他动画新闻

通讯还报道了其他动画相关的新闻,包括:

  • 法国动画短片《夜间靴子》荣获弗雷德里克施塔特动画节大奖。
  • 美国洛杉矶将举办动画短片放映活动,包括《猫之城》的动画短片。
  • 印度正在筹备《霸王别姬》的动画电影。
  • 墨西哥动画电影《我就是弗兰克黛拉》票房成功。
  • 日本动画市场持续增长,预计今年将达到250亿美元。
  • 俄罗斯电影基金支持了动画电影《王子》和《布尔加科夫》。
  • 美国派拉蒙公司进行大规模裁员。
  • 日本动画行业对OpenAI的生成式AI技术表示担忧。

总而言之,《小动画》不仅仅是一部简单的Flash动画,它代表着中国互联网早期文化的一个重要时代,也展示了个人创造力的巨大力量。它对全球动画产业的影响将永远被铭记。

11. Israels top military lawyer arrested after she admitted leaking video of abuse (www.theguardian.com)

以色列军方最高法律官员因泄密案被捕:总结

以下是对原文内容的总结:

以色列警方逮捕并拘留了军方最高法律官员伊法特·托梅尔·耶胡沙拉米,原因是她承认泄露了一段士兵涉嫌袭击巴勒斯坦囚犯的视频,并随后在以色列高等法院上谎报其行为。

事件经过:

  • 视频泄露及背景: 托梅尔·耶胡沙拉米表示,她授权泄露该视频是为了反击针对正在调查此案的军方调查员和检察官的攻击。在视频泄露前,右翼政治家和媒体评论员将涉嫌袭击的士兵称为“英雄”,并攻击军方调查员。
  • Sde Teiman 拘留中心事件: 2024年7月,检察官突袭了臭名昭著的 Sde Teiman 军事拘留中心,逮捕了11名士兵。他们涉嫌对一名来自加沙的巴勒斯坦人实施暴力袭击,包括性侵犯。受害者因肋骨骨折、肺部穿孔和直肠损伤等伤势住院。
  • 指控与抗议: 随后,五名士兵被指控犯有加重虐待和造成严重人身伤害罪。 这些士兵目前未被拘留或受到任何法律限制。事件发生后,右翼暴徒聚集在 Sde Teiman 基地外,要求停止调查。一些抗议者(包括一位部长和两名国会成员)甚至闯入基地。
  • 托梅尔·耶胡沙拉米的后续行动: 由于来自右翼势力的公共攻击,托梅尔·耶胡沙拉米拒绝就其他可能的以色列军队战争罪行展开调查。

后续影响与争议:

  • 对以色列形象的影响: 以色列总理内塔尼亚胡表示,Sde Teiman 事件对以色列的全球形象造成了巨大损害。
  • 个人安全威胁: 托梅尔·耶胡沙拉米因泄密案面临越来越强烈的攻击,包括要求其辞职和在线个人威胁。她在被发现失踪后,短暂的攻击停止,但随后迅速恢复,甚至出现“公开处决”的言论和抗议者在她家外高喊口号。
  • 对以色列法律体系的冲击: 托梅尔·耶胡沙拉米的被捕和后续事件引发了对以色列法治、对虐待巴勒斯坦人的问责以及以色列在国际法庭上自卫能力的严重质疑。
  • 国际法庭管辖权: 独立司法体系一直被以色列政府和军方视为防止国际法律法庭调查以色列对巴勒斯坦人涉嫌侵犯行为的关键屏障。
  • 对军方法律支持的传统理解: 许多以色列人将军事检察官的角色视为“保护士兵免受国外的起诉”,而非维护法律本身。
  • 战争期间的军事行动: 评论员指出,在战争期间,军事检察官曾给予军队在加沙地区广泛的行动自由,例如空袭造成的巨大附带损害。

更广泛的背景:

  • 尽管有广泛的酷刑和虐待记录,以色列监狱系统只有一名以色列士兵因袭击巴勒斯坦囚犯而被判有罪。
  • 没有士兵因在加沙杀死平民而被指控,即使这些袭击引发了国际社会的强烈抗议,例如对医疗人员和世界中央厨房慈善团队的袭击。
  • 在过去两年中,加沙地区的数万名巴勒斯坦平民在袭击和空袭中丧生。

总而言之,该事件反映了以色列国内对法律问责、国际法以及军方行为的深刻分歧,并对以色列在国际社会中的法律地位提出了严峻挑战。

12. Why we migrated from Python to Node.js (blog.yakkomajuri.com)

Skald 后端从 Python 迁移到 Node.js:一周的快速重构

Skald 团队在产品发布一周后,做出了一个大胆的决定:将后端从 Python (Django) 迁移到 Node.js。 这篇文章详细解释了他们做出这个决定的原因、过程以及获得的收益和损失。

迁移原因:Python 异步编程的挑战

虽然 Django 是一个快速开发和灵活的框架,但 Skald 的应用场景需要大量的 LLM 和 embedding API 调用,需要高效的异步处理能力。作者发现,在 Django 中实现可靠且高性能的 Python 异步代码非常困难,需要深入理解底层原理。

  • Python 异步支持是后期补丁,不如 JavaScript 和 Go 的原生支持。
  • Django 对异步支持不完善,ORM 异步功能尚未完成,且存在一些限制。
  • 需要频繁使用 sync_to_asyncasync_to_sync,代码复杂。
  • 各种异步支持库存在各自的局限性。
  • Django 异步实现依赖于底层配置,例如 Gunicorn worker 类型,增加了复杂性。

作者研究了 PostHog 的代码,发现即使是大型公司也仍然使用 WSGI 和 Gunicorn Gthread workers,并未充分利用异步的优势。因此,他们认为 Django 在处理高负载时会成为瓶颈。

选择 Node.js:统一生态系统

虽然考虑了使用 FastAPI,但团队最终决定迁移到 Node.js,原因如下:

  • Node.js 提供了更顺畅的异步编程体验。
  • 团队已经使用 Node.js 编写了后台 worker 服务,选择 Node.js 可以实现统一的生态系统。
  • 可以合并原本分离的 Express server 和 background worker 代码库,减少重复代码并提高代码质量。

迁移过程和结果

  • 时间: 迁移耗时三天。
  • 收益:
    • 效率提升: 初始基准测试显示,Node.js 后端性能提升了大约 3 倍。
    • 更好的测试覆盖率: 迁移过程中编写了大量的测试用例。
    • 统一代码库: 将原本分离的 Python 后端和 Node.js worker 代码库合并,提高代码可维护性。
    • MikroORM: 选择了 MikroORM 作为 ORM,提供了类似 Django ORM 的功能,如延迟加载和良好的迁移工具。
  • 损失:
    • Django: 放弃了 Django 的便利性和易用性。
    • Python 生态系统: 虽然 Python 和 TypeScript 都支持 RAG 和 agent 的 API 包装,但 ML 领域 Python 仍然占据主导地位。

总结

Skald 团队认为这次迁移是值得的,并会再次做出相同的决定。他们从这次经历中学到了很多,并期待社区的反馈和建议。 迁移相关的代码可以在 GitHub 上找到。

13. App Store web has exposed all its source code (www.reddit.com)

事件概述

App Store 网页端(apps.apple.com)似乎使用 Svelte 框架进行了重构,但由于在生产环境中遗漏了移除 Sourcemap 配置,导致其完整的前端源代码遭到意外泄露。

事件发展与处理

  1. 代码公开:发现该漏洞后,泄露的源代码副本被上传到了 GitHub 仓库(rxliuli/apps.apple.com)供人查看。
  2. 官方修复:苹果公司随后修复了该问题,移除了生产环境中的 Sourcemap 配置。
  3. 版权下架:GitHub 收到了来自苹果的 DMCA(数字千年版权法)下架通知,相关的源代码仓库已被强制移除,目前处于不可用状态。

作者声明

原作者明确表示不会继续分发或传播这些泄露的源代码,并呼吁公众停止通过私信或电子邮件向其索要相关代码。

14. Bloom filters are good for search that does not scale (notpeerreviewed.com)

基于布隆过滤器的全文搜索引擎:可行性分析与局限

本文探讨了利用布隆过滤器构建高效全文搜索引擎的可能性,并分析了其在大型文档语料库中的应用挑战。

核心思想:

最初的想法是,为每个文档创建布隆过滤器,其中包含该文档的所有单词。查询时,检查每个文档的布隆过滤器是否包含查询词。这种方法在文档数量较少时,可以实现极小的索引体积,甚至可以将其作为小型静态网站的一部分直接部署到客户端。

挑战与解决方案:

  • 查询性能: 原始方法的时间复杂度为O(文档数量),不适用于大型语料库。为了解决这个问题,作者提出了构建一个索引,只检查文档集合的子集,但仍然能找到所有匹配文档。
  • 最初的尝试失败:
    • 按重要性排序过滤器: 这种方法由于查询词可能同时出现在排序列表的首尾而失败。
    • 过滤器树: 尽管可以构建一个树形结构,但由于文本文档的高维特性和语言的复杂性,文档之间存在大量重叠,导致查询时需要搜索几乎所有分支。
  • 倒排索引的布隆过滤器: 作者提出了一种新的方法,即构建一个基于布隆过滤器的字典搜索树。每个叶节点代表一组单词,并包含所有包含这些单词的文档过滤器指针列表。这本质上类似于倒排索引,但使用树结构代替哈希表,在某些情况下可以实现更小的索引体积,因为布隆过滤器比存储单词本身更节省空间(大约10位/单词 vs 8位/字符)。
  • 跳索引: 布隆过滤器已经在大型数据集的全文搜索中被用作跳索引,用于快速检查数据块是否包含特定值。

为什么最终仍然不可行:

尽管构建了可用于大型语料库的布隆过滤器索引,但作者认为该方法仍存在缺陷。布隆过滤器的优势在于压缩大型字典,但当多个过滤器共享同一个字典时,这种优势会降低。这是因为每个布隆过滤器必须从头开始编码其完整的字典,而重复出现的单词不会共享空间。相比之下,倒排索引只存储每个单词一次,因此随着文档数量的增加,空间效率更高。

结论:

  • 当文档数量相对于字典大小较小时,布隆过滤器可以实现比传统方法更小的全文搜索索引。
  • 布隆过滤器在压缩大型字典到少量过滤器时效率高,但当多个过滤器共享同一个字典时,效率会降低,因为布隆过滤器无法共享信息。
  • 更广泛地说,布隆过滤器之间不存在协同效应,单个过滤器是高效的,但作为一个整体系统,另一种方法可能更高效。该洞察可以应用于其他领域,例如内容审核系统。当存在一个全局黑名单时,布隆过滤器可能是一个有效的实现,但如果每个用户都创建自己的黑名单,则需要不同的设计才能更好地扩展。
15. My Truck Desk (www.theparisreview.org)

总结:Bud Smith 的工作与写作生活 (Summary of Bud Smith's Work and Writing Life)

本文讲述了作家Bud Smith在石化工厂做机械师和焊工期间,如何在艰苦的工作环境中坚持写作的故事。

主要内容:

  • 工作与转变: Smith 长期在石化工厂工作,因工作量变化而频繁被雇佣和解雇。他利用工作间隙写作,积累了大量作品。
  • F-150 和 Truck Desk®: 他曾经拥有一辆破旧的F-150卡车,并利用废弃的木材自制了一个便携式写作桌——Truck Desk®,将其安装在卡车里,以便在休息时偷偷写作。这辆卡车和写作桌最终被报废。
  • 适应与创造: 面对失去卡车和写作桌的现实,Smith 并没有放弃,而是继续寻找写作空间。他先是利用木板在工具房搭建了简易写作桌,后来又将 Truck Desk® 简化为 Truck Plank®,只需一块木板就能在任何卡车上搭建临时写作空间。
  • 寻找时间: Smith 强调“创造自己的条件”的重要性,并分享了老工人的智慧——“让你的钱包成为你的向导”。他利用工作中的零碎时间,甚至包括因恶劣天气造成的延误,来写作。
  • 现代写作方式: 随着智能手机的普及,Smith开始利用手机写作,并最终使用笔记本电脑,在工作中继续创作。
  • 工作中的写作空间: 他目前使用一块简单的木板(Truck Plank®)在卡车上写作,即使有同事在车上休息,他也默默地进行创作。

核心思想:

文章强调了在平凡、艰苦的工作环境中,通过创造条件、灵活适应,依然可以坚持艺术创作的重要性。Smith 的经历展现了一种在日常生活中寻找灵感、利用碎片时间进行创作的生活哲学。


总结:Bud Smith 的工作与写作生活 (Chinese)

本文讲述了作家Bud Smith在石化工厂作为机械师和焊工期间,如何在艰苦的工作环境中坚持写作的故事。

主要内容:

  • 工作与转变: Smith长期在石化工厂工作,因工作量变化而频繁被雇佣和解雇。他利用工作间隙写作,积累了大量作品。
  • F-150 和 Truck Desk®: 他曾经拥有一辆破旧的F-150卡车,并利用废弃的木材自制了一个便携式写作桌——Truck Desk®,将其安装在卡车里,以便在休息时偷偷写作。这辆卡车和写作桌最终被报废。
  • 适应与创造: 面对失去卡车和写作桌的现实,Smith并没有放弃,而是继续寻找写作空间。他先是利用木板在工具房搭建了简易写作桌,后来又将 Truck Desk® 简化为 Truck Plank®,只需一块木板就能在任何卡车上搭建临时写作空间。
  • 寻找时间: Smith强调“创造自己的条件”的重要性,并分享了老工人的智慧——“让你的钱包成为你的向导”。他利用工作中的零碎时间,甚至包括因恶劣天气造成的延误,来写作。
  • 现代写作方式: 随着智能手机的普及,Smith开始利用手机写作,并最终使用笔记本电脑,在工作中继续创作。
  • 工作中的写作空间: 他目前使用一块简单的木板(Truck Plank®)在卡车上写作,即使有同事在车上休息,他也默默地进行创作。

核心思想:

文章强调了在平凡、艰苦的工作环境中,通过创造条件、灵活适应,依然可以坚持艺术创作的重要性。Smith的经历展现了一种在日常生活中寻找灵感、利用碎片时间进行创作的生活哲学。

16. A friendly tour of process memory on Linux (www.0xkato.xyz)

Linux 进程内存导览 (A Friendly Tour of Process Memory on Linux)

本文档旨在深入浅出地介绍 Linux 系统中进程内存的工作原理。它面向 Linux x86-64 架构,但核心思想适用于其他架构。

核心概念:

  • 物理 RAM: 实际的物理内存,由散布的帧组成。
  • 虚拟视图: 程序看到的连续内存空间,与实际物理内存布局不一致。
  • 页表: 将虚拟地址映射到物理帧的列表。CPU 通过页表进行地址转换。
  • 页面: 硬件管理的固定大小内存块,常见尺寸为 4KB,也有 2MB 和 1GB。
  • VMA (Virtual Memory Area): 连续的虚拟地址范围,具有相同的权限(读、写、执行)和相同的支持类型(匿名内存或文件)。
  • PTE (Page Table Entry): 页表项,将一个虚拟页面映射到一个物理页面,并包含诸如“存在”和“可写”等标志位。
  • /proc: 内核在内存中构建的一个虚拟文件系统,用于暴露进程和内核状态。

内存管理流程:

  1. 程序访问内存时,CPU 查找页表。
  2. 如果页表中存在条目,CPU 跳转到对应的物理帧。
  3. 如果页表中不存在条目,则发生页错误 (Page Fault)。
  4. 内核处理页错误,分配一个物理帧,并更新页表,然后重试程序指令。
  5. 当内存不足时,系统会将不常用的页面移动到磁盘(交换),或丢弃文件页面,并在需要时重新加载。

关键函数和标志:

  • mmap: 预留一个虚拟地址范围,并将其与文件或匿名内存关联。
  • mprotect: 更改现有地址范围的权限。
  • munmap: 从地址空间中移除映射。
  • MAP_PRIVATE: 写入操作会创建私有副本,不会影响原始文件。
  • MAP_SHARED: 写入操作会写入到原始文件并对其他共享该文件的进程可见。
  • MAP_FIXED: 强制映射到指定的地址,可能覆盖现有映射。
  • MAP_FIXED_NOREPLACE: 尝试映射到指定地址,如果已经有映射则失败。
  • ASLR (Address Space Layout Randomization): 地址空间布局随机化,用于随机化内存映射位置,增加安全性。

其他重要概念:

  • vdsovvar: 内核映射到进程空间的代码和数据,用于加速一些系统调用 (例如 gettimeofday)。
  • 页缓存 (Page Cache): 内核将文件数据缓存在内存中的缓存。
  • 透明巨页 (Transparent Huge Pages - THP): 内核自动使用更大的页面(2MB 或更大)来提高性能。
  • Copy-on-Write (COW): 共享页面,只有当写入时才创建私有副本。fork()MAP_PRIVATE 使用此技术。
  • TLB (Translation Lookaside Buffer): CPU 缓存的最近地址转换,用于加快地址转换速度。
  • W^X (Write XOR Execute): 一个页面不能同时具有可写和可执行权限。
  • Meltdown: 一种安全漏洞,利用了 CPU 的投机执行特性,可能导致内核数据泄露。 Linux 通过页表隔离 (Page Table Isolation - PTI) 来缓解此问题。
  • userfaultfd: 一个文件描述符,允许用户空间处理页错误和写保护事件。

调试工具:

  • /proc/<pid>/maps: 显示进程的内存映射关系。
  • /proc/<pid>/smaps: 提供每个区域的详细信息,包括 RSS (驻留集大小)、私有 vs 共享、以及是否使用巨页。
  • /proc/<pid>/pagemap: 显示每个虚拟页面的详细信息,例如是否存在、是否交换、是否脏等。

总结:

Linux 进程内存管理是一个复杂但高效的系统,它通过虚拟内存、页表和各种优化技术来提供程序所需的内存抽象,并提高系统性能和安全性。理解这些基本概念对于编写高效、安全的代码至关重要。

17. From web developer to database developer in 10 years (notes.eatonphil.com)

从Web开发者到数据库开发者的十年转型之路

当前工作 作者在 EnterpriseDB (EDB) 担任数据库开发者已满一年。其团队主要负责构建和维护 pglogicalPostgres Distributed,核心开发语言为 C 和 Rust,测试使用 Perl 和 Python。

早期经历与底层探索(2014-2021)

  • Web开发阶段:作者曾从事 Web 开发和工程管理工作,对数据库底层知之甚少。
  • 打破黑盒:为加速职业成长,作者利用业余时间开发 HTTP 服务器、解析器和编译器等底层项目,并通过博客分享。
  • 接触数据库:2020年因遇到系统性能瓶颈,作者开始深入学习数据结构与算法,并动手实现了一个支持索引的内存 SQL 数据库及 Raft 共识算法。这打破了他认为“只有天才和博士才能开发数据库”的刻板印象。

创业、社区与知识沉淀(2021-2023)

  • 创业未果后,作者加入 TigerBeetle 担任联合创始人,负责营销与社区工作。
  • 期间创办了 Software Internals Discord 和 /r/databasedevelopment 社区,在数据库和分布式系统领域广受欢迎。
  • 通过撰写技术文章,进一步巩固了数据库和基于共识的分布式系统基础知识。

求职坚持与突破(2023)

  • 离职求职时,因过往背景,招聘方多建议其从事数据库外围的云编排(Go语言)工作,而非核心数据库开发。
  • 作者拒绝妥协,在待业期间坚持研究 Postgres 和 MySQL,组织虚拟黑客周、读书会(Software Internals Book Club)及线下技术交流活动,持续积累核心开发经验。

加入EnterpriseDB与感悟

  • 经过四个月寻找,作者获得了三个使用 C 和 Rust 开发 Postgres 扩展的 Offer。由于 Postgres API 抽象松散,开发扩展在体验上几乎等同于直接修改 Postgres 内核。
  • 作者最终选择了拥有20年历史且是 Postgres 核心贡献者之一的 EnterpriseDB,以寻求更深度的学习与贡献。
  • 团队氛围:团队成员既有贡献过 WAL、MVCC、逻辑复制等核心功能的 Postgres 资深专家,也有从技术支持或 DBA 转型的开发者。这再次印证了数据库开发并非只属于“天才或博士”,而是依赖扎实的努力与经验。
  • 职业感悟:作者非常享受从工程管理者和创业者回归到一线个人贡献者(IC)的角色转变。
18. Unofficial Microsoft Teams client for Linux (github.com)

Teams for Linux 概要

Teams for Linux 是一个非官方的 Microsoft Teams 客户端,专为 Linux 系统设计。它通过在 Linux 环境下包装 Teams 的 Web 版本,实现了更强的 Linux 集成。

主要特点:

  • 系统通知: 提供原生系统通知。
  • 系统托盘集成: 支持系统托盘集成,包括徽章显示(不同桌面环境支持程度可能不同)。
  • 自定义背景和主题: 允许用户自定义背景和主题。
  • 屏幕共享支持: 支持屏幕共享功能。
  • 多账户配置文件: 可以管理和切换多个账户。

重要提示:

  • 这是一个独立项目,与 Microsoft 无关。
  • 部分功能受限于 Teams Web 应用。

赞助商:

Recall.ai 提供会议录制和转录 API,可以记录和转录 Zoom、Google Meet、Microsoft Teams 以及线下会议等。

安装方式:

快速开始:

  1. 选择合适的安装方式进行安装。
  2. 启动 teams-for-linux 应用。
  3. 如果需要,创建 ~/.config/teams-for-linux/config.json 文件进行配置。

文档:

提供完整的文档,包括安装指南、配置指南、故障排除、多实例配置、自定义背景设置、贡献指南等。(https://ismaelmartinez.github.io/teams-for-linux/

社区支持:

  • 聊天: 加入 Matrix 聊天室。
  • 问题反馈: 在 GitHub 上报告 bug。
  • 贡献: 遵循 CONTRIBUTING.md 文件中的贡献指南。

安全与沙箱:

为了支持 Teams DOM 访问功能,Electron 的上下文隔离和沙箱功能已禁用。为了提高安全性,建议使用系统级别的沙箱,例如 Flatpak、Snap 包、Firejail、AppArmor 或 SELinux。

历史:

项目历史记录保存在 HISTORY.md 文件中。

许可证:

GPL-3.0 许可证,具体内容见 LICENSE.md 文件。

19. Python Steering Council unanimously accepts "PEP 810, Explicit lazy imports" (discuss.python.org)

PEP 810: 显式延迟导入总结

本文主要介绍了Python的PEP 810提案:显式延迟导入。该提案旨在引入一种可选的语法,用于延迟模块的加载,直到首次使用。

核心目标:

  • 加快启动速度: 通过延迟加载,减少Python解释器在启动时需要加载的模块数量,从而缩短启动时间。
  • 降低内存占用: 仅在需要时才加载模块,可以减少程序运行时的内存占用。

提案内容:

PEP 810 建议使用 import ... as ... 语法的一种变体来实现显式延迟导入。 具体来说,将使用 from ... import ... 语句,并添加 lazy 关键字。 例如:

from mymodule import myfunction lazy as lazy_module

关键点:

  • 显式声明: 需要明确声明哪些模块需要延迟加载。
  • 首次使用触发加载: 只有当 lazy_module.myfunction 被首次调用时,mymodule 才会真正被加载。
  • 命名空间: 延迟加载的模块会绑定到一个新的命名空间,可以通过 as 关键字指定。
  • 可选特性: PEP 810 是一种可选特性,不会影响现有代码。

总结:

PEP 810 提出的显式延迟导入机制,通过可选的语法,允许开发者控制模块的加载时机,从而优化Python程序的启动速度和内存占用。 该提案旨在在不改变现有Python代码的情况下,提供一种提高性能的工具。

20. AI's Dial-Up Era (www.wreflection.com)

1995 与人工智能:历史的重演?

这篇文章回顾了1995年互联网的早期阶段,并将其与当前的人工智能(AI)发展趋势进行了对比,探讨了对未来就业和经济的影响。

1995年的互联网:萌芽与不确定性

1995年,互联网刚刚起步。拨号上网缓慢而脆弱,网站数量稀少,大多数网站只是简单的文字和像素图像。尽管如此,人们对互联网的潜力感到兴奋,乐观者预测数字商业将迅速取代实体零售,甚至预见到人们将沉浸在虚拟现实世界中。然而,悲观者则认为互联网不过是短暂的时尚,会像之前的技术泡沫一样破裂。当时人们对网络安全也持有怀疑态度,普遍建议“不要相信互联网上的陌生人”。

人工智能的兴衰:历史的倒影

如今,人工智能领域也面临着类似的辩论。乐观者预测AI将带来巨大的变革,而悲观者则担心AI会导致大规模失业和经济崩溃。 甚至有人,如麻省理工学院教授尼古拉斯·尼格罗庞特在1993年预测“未来五年内,超过十分之一的人们将在公共交通工具上佩戴头戴式电脑”,这与早期对互联网的预测相似。

人工智能与放射科医生:Jevons 悖论

文章以放射科医生为例,说明了AI对就业的影响可能并不如最初预测的那么简单。尽管有人预测AI将取代放射科医生,但事实并非如此。相反,AI提高了放射科医生的工作效率,从而导致更多的扫描需求,最终反而增加了对放射科医生的需求。这种现象被称为“Jevons 悖论”,即技术进步提高了资源利用效率,反而导致资源总消费的增加。

历史的教训:需求与生产力的竞争

文章进一步引用了经济学家詹姆斯·贝森的研究,分析了1800年至2000年间纺织、钢铁和汽车三个行业的发展轨迹。贝森的研究表明,当生产力大幅提高,但需求仍然存在时,就业会增加。然而,当生产力持续提高,而需求达到饱和时,就业则会下降。

人工智能的未来:需求、基础设施与创新

文章指出,人工智能领域的未来取决于需求增长与生产力提升之间的竞争。如果需求能够跟上生产力提升的速度,那么人工智能可能会创造更多的工作岗位。此外,像微软、谷歌、Meta 和亚马逊这样的超大规模公司正在大力投资数据中心和芯片等基础设施,这些投资将为人工智能的未来发展奠定基础,即使一些人工智能公司最终失败,这些基础设施仍然具有长期价值。

总结:预测的局限性与未来的不确定性

文章强调,我们无法准确预测人工智能的未来,就像1995年没有人能预测互联网将如何改变我们的生活一样。人工智能将改变就业结构,催生新的行业和职业,但具体细节仍然未知。 最终,人工智能的发展将取决于人类的创造力,并可能带来我们今天无法想象的变革。

总而言之,这篇文章呼吁我们以谨慎乐观的态度看待人工智能的发展,既要认识到其潜在的风险,也要看到其带来的机遇。

21. Pose Animator – An open source tool to bring SVG characters to life (2020) (blog.tensorflow.org)

Pose Animator 开源工具技术摘要

目的与背景 Pose Animator 是一款基于浏览器的开源 Web 动画工具。它利用 TensorFlow.js 的 PoseNet 和 FaceMesh 模型,通过摄像头实时捕捉人体动作,驱动 2D SVG 矢量角色生成动画,旨在帮助创作者轻松构建基于身体控制的交互式动画。

核心结构与工作原理 该工具借鉴了计算机图形学中的骨骼动画原理,将角色分为两部分:

  1. 表面:由输入 SVG 文件中的 2D 矢量路径(贝塞尔曲线和直线)定义。
  2. 骨骼层级:基于 PoseNet(17个全身关键点)和 FaceMesh(精选73个面部关键点)构建的预定义骨骼系统,共计 90 个关键点和 78 根骨骼。设计师需在设计软件中将此骨骼结构嵌入 SVG 文件中。

骨骼绑定(Rigging)流程

  1. 解析包含初始姿势(T-pose)插图和预定义骨骼的 SVG 文件。
  2. 遍历矢量路径,使用线性混合蒙皮(LBS)算法计算每个骨骼对路径线段的权重影响和空间变换。
  3. 实时运行机器学习模型,利用识别出的关键点更新骨骼位置。
  4. 根据更新后的骨骼位置、权重和变换矩阵,实时计算并渲染矢量线段的新位置。

关键技术与功能

  • 矢量路径的线性混合蒙皮(LBS):系统自动根据顶点与骨骼的距离计算权重。针对贝塞尔曲线,分别计算曲线点及入/出控制点的权重;当三点共线时,赋予相同权重以确保动画过程中曲线的平滑度。
  • 运动稳定(Motion Stabilization):为解决模型原始输出带来的画面抖动,工具利用预测结果的置信度分数对输入帧进行加权平滑处理。低置信度帧的权重会被降低甚至完全忽略,从而避免动画出现突兀的抽搐。
  • 基于置信度的裁剪(Clipping):引入最小置信度阈值机制。当路径的综合置信度低于阈值时(例如处于摄像头视野外、预测不准的身体部位),系统会自动隐藏该路径,防止渲染出扭曲变形的图形。

未来优化方向

  • 算法升级:计划改进网格(Mesh)变形算法,并探索比 LBS 更高级的蒙皮算法,以解决关节弯曲处体积变薄(Volume thinning)的物理失真问题。
  • 编辑功能扩展:拟在浏览器端增加蒙皮权重手动绘制工具以实现更精准的控制,并支持在 SVG 文件中嵌入光栅图像(如照片)进行同步变形。
22. Former Nintendo employees reveal what it took to launch the NES (hanafuda.report)

波特兰复古游戏展庆祝任天堂娱乐系统 (NES) 上市 40 周年:回顾市场挑战与设计考量

近期在波特兰复古游戏展上,一场特别的座谈会庆祝了美国任天堂娱乐系统 (Nintendo Entertainment System, NES) 上市 40 周年。此次座谈会回顾了当时面临的市场挑战、各种设计考量,以及这款 8 位家用游戏机的持久遗产。

该座谈会由视频游戏历史基金会 (Video Game History Foundation) 的 Frank Cifaldi 主持,汇集了三位前任任天堂美国公司员工,共同探讨了 1985 年 NES 在美首次亮相的关键事件。

参与嘉宾:

  • Bruce Lowry:前销售副总裁
  • Gail Tilden:前营销经理
  • Lance Barr:前设计师

座谈会主要内容:

  • 系统设计: Lance Barr 分享了他对系统设计的贡献,并展示了一些早期设计草图。他提到,最初的设计与日本版本有着显著的不同。当时,一些设计机构提交的设计灵感源自当时市场上流行的 Atari 机器,例如带有仿木纹和方盒状外观的设计。
  • 市场挑战与营销策略: 座谈会中分享了许多有趣的故事和细节,包括:
    • 一次母亲焦点小组对 NES 光枪 (Zapper) 提出了异议。
    • “Game Pak” 术语的起源。
    • CES 展会的营销技巧。
    • 任天堂仓库中曾出现过蛇。
  • 整体回顾: 座谈会深入探讨了 NES 上市前的准备工作,以及在激烈的市场竞争中如何成功推广这款产品。

观看链接:

https://www.youtube.com/watch?v=f2WDfsiLiRA

23. Modular monolith and microservices: Modularity is what matters (binaryigor.com)

模块化单体与微服务:模块化才是核心

模块化的核心理念与优势

模块化是软件设计的关键属性,独立于单体或微服务等物理部署架构。其目标是实现高内聚与低耦合,使模块具备明确的功能和公共API。优势包括:明确组织分工、提升代码可理解性、优化资源利用、增强可重用性与可测试性。

应对现实世界的模糊性

实际开发中需求常不明确或持续变化。在领域模糊期,应优先采用最简单的模块化单体策略以降低重构成本。待领域清晰后,再考虑向复杂架构演进,避免过早引入微服务。

模块化的实现策略(由简入繁)

逻辑模块划分应先于物理架构设计。文章提出五种策略:

  1. 简单模块化单体:模块作为代码文件夹,通过约定(如共享契约接口、独立数据库Schema)维护边界。最简单,适合小团队或领域探索期。
  2. 独立可部署模块的模块化单体:单一部署单元,但模块作为独立版本控制的包。隔离性更强,支持多团队并行开发。
  3. 带辅助服务的模块化单体:以模块化单体为核心,仅当特定模块有独特资源或技术需求时,才将其拆分为独立服务。
  4. 受限微服务(Microliths):规定服务处理外部请求时禁止对其他服务发起网络调用(数据同步仅在后台进行)。消除了分布式事务和网络不确定性,大幅提升可靠性。
  5. 微服务:每个模块作为独立应用部署。支持技术栈异构和极致资源利用,但基础设施成本极高,仅在绝对必要时采用。

并行开发、部署与前端模块化

并行开发的瓶颈在于系统的低耦合设计质量,而非架构风格。微服务天然支持独立部署,但模块化单体通过包管理同样能实现,且具备本地端到端测试的优势。 前端(如SPA)同样适用模块化原则,可从文件夹划分起步,利用代码分割,必要时演进至多SPA或微前端。

总结

架构设计是权衡的艺术。建议始终从最简单的策略开始,根据实际需求审慎评估,逐步向复杂架构过渡。

24. Venn Diagram for 7 Sets (moebio.com)

该网页旨在展示包含7个集合的韦恩图(Venn Diagram)。然而,由于当前浏览器环境不支持 HTML5 Canvas 元素,导致预期的图表内容无法正常渲染与显示。页面最终仅输出一条“您的浏览器不支持 Canvas”的错误提示,未能呈现任何实质性的图形或数据内容。

25. JVM exceptions are weird: a decompiler perspective (purplesyringa.moe)

本文从反编译器的视角探讨了JVM异常控制流(try...catch...finally)的复杂性及其处理策略。

异常表与嵌套结构

JVM通过异常表处理隐式异常控制流,指定指令区域与处理程序的映射。JVM不强制要求异常区域具有严格的嵌套结构,实际class文件中常出现区域相交、目标地址在源地址之前或内部等违反常规假设的情况。

Finally块的编译机制

为确保 finally 块执行,javac 会在所有退出路径(正常结束、returnbreak、异常等)复制 finally 代码体。这导致异常表中出现复杂的catch-all处理器,甚至存在处理器范围包含其自身首条指令的历史遗留设计问题。

指令抛出异常的边缘情况

不能简单假设特定指令(如局部变量存储)不抛出异常。JVM规范允许随时抛出 VirtualMachineError(如内存溢出),且 return 指令可能抛出 IllegalMonitorStateException。反编译器通常只能假设在监视器(monitors)格式正确的前提下,大多数指令不会抛出异常。

可达性与类型检查冲突

JVM存在基于验证(StackMapTable)和基于推断两种类型检查器,后者仅验证可达指令。若反编译器盲目扩展try范围,可能使原本不可达的异常处理器变为可达,从而导致旧版class文件在类型推断时检查失败。

范围分割与反编译策略

由于退出语句和 finally 代码的复制,单个源码级的try块在字节码中会被分割成多个不连续的异常处理范围。反编译器需要识别出不受异常捕获的“豁免(exempt)”代码块,验证它们在各个退出路径上的内容一致性,从而将其还原并简化为标准的 try...finally 结构。

中间表示(IR)中的异常处理

进入异常处理器时,JVM会清空栈并压入异常对象。由于处理器入口也可通过显式控制流(如 goto)到达,栈存储操作不能直接插入在IR的处理器入口处,而必须作为特殊节点,在后续构建 try...catch 语法块时延迟引入。

26. Server DRAM prices surge 50% as AI-induced memory shortage hits hyperscalers (www.tomshardware.com)

DRAM 供应链紧张,服务器内存受影响:总结

根据DigiTimes的报道,DRAM供应链正面临瓶颈,首当其冲的是服务器内存市场。主要美国和中国云服务提供商(Hyperscalers)目前仅能收到其订购服务器DRAM的70%。即使已经同意在第四季度提高合同价格高达50%,远超年初许多买家预算的30%涨幅。

主要原因与影响:

  • 人工智能(AI)驱动需求: 虽然HBM(高带宽内存)备受关注,但传统DDR5 RDIMM的需求也显著超过供应,尤其是在三星和SK海力士将产能转移到用于AI加速的芯片时。
  • 产能转移: 三星最近的价格调整证实了这种产能转移,公司已将服务器SSD价格提高最多35%,RDIMM合同价格提高最多50%,理由是来自企业和云客户的持续需求。
  • 供应短缺: 美光在最近的财报电话会议中警告称,DRAM市场供应紧张,预计到明年年底,bit供应的增长将落后于需求。
  • 价格策略调整: TrendForce指出,一些模块可能会出现报价冻结现象,供应商正在转向中国大陆的按日定价,以避免锁定不佳的交易。

总结:

当前DRAM市场面临供应短缺,主要原因是AI对高性能内存(包括DDR5 RDIMM)的巨大需求。主要厂商正在调整产能,以满足AI市场的需求,导致服务器内存供应不足,价格上涨。预计这种紧张局面将持续到明年年底。


27. Why engineers can't be rational about programming languages (spf13.com)

编程语言选择背后的非理性因素:身份认同与经济成本

核心观点

编程语言的选择是企业最昂贵的决策之一,但通常被误认为是纯粹的技术辩论。实际上,这些决策极少基于客观技术,而是由身份认同、情感和自尊驱动,从而在无形中破坏开发速度、消耗预算并产生巨大的技术债务。

真实案例教训

  • Takkle的失败:新任CTO为维持其“Perl专家”的身份,强行将运行良好的PHP系统重构为Perl。此举导致开发速度崩溃,每月资金消耗从20万美元激增至50万美元,最终公司因错过市场窗口和资金链断裂而倒闭。
  • 盲目追逐炒作:某工程VP提议耗资5000万美元使用Rust构建新系统,其给出的技术优势(如易于构建和部署)在客观上不如Go。该决策完全基于市场炒作和身份偏好,缺乏对其他候选语言的理性评估。

决策中的“双重对话”

在语言选择中,始终同时存在两种对话:

  1. 可见对话:关于技术特性的表面讨论(如内存安全、编译时间、生态系统)。
  2. 不可见对话:关于身份认同的潜意识防御(如“我是某种语言的开发者”)。 技术辩论往往只是掩盖和合理化身份选择的借口。一旦雇佣了特定语言的开发者来评估技术栈,实际上就已经做出了预设决定。

神经科学依据

fMRI脑成像研究表明,当人们的核心身份信仰受到挑战时,大脑的威胁检测系统(杏仁核)和默认模式网络会被激活,反应如同面对物理危险。这意味着工程师在评估非自身认同的编程语言时,大脑会自动进入防御模式,无法客观权衡证据,从而产生根深蒂固的偏见。

隐性成本与行业现状

行业过度关注“可见对话”(如技术矩阵和基准测试),却忽视了主导决策的“不可见对话”。研究表明,技术栈决策占产品生命周期总开发成本的40%-60%。让身份认同主导决策,实质上是在抵押公司的开发速度、预算和生存空间。

解决方案:转向经济学决策框架

为了克服身份偏见,企业必须改变对话方式,将语言选择从“技术辩论”重构为“经济决策”:

  • 转变核心问题:不再问“哪种语言在技术上最好”,而是问“这种语言会让我们付出多少真实成本”。
  • 量化评估指标:评估维度应全面涵盖开发速度、技术债务、招聘难度、薪资成本和运维复杂性等。

经济指标可以被客观测量和比较,且不会威胁到个人的自尊,从而帮助团队摆脱身份束缚,做出理性、可防御且目标一致的商业决策。

28. When your hash becomes a string: Hunting Ruby's million-to-one memory bug (mensfeld.pl)

好的,以下是根据您提供的英文内容生成的中文摘要,字数控制在800字以内,并采用 Markdown 格式:

Ruby FFI 漏洞调查:当 Hash 变成 String 的那一刻

TL;DR: FFI < 1.17.0 版本存在缺失的写屏障,导致 Ruby 的 GC 释放内部 Hash,允许其他对象替换它们在相同内存地址上。罕见但灾难性。

难以置信的错误

Karafka 用户报告了 2700 个相同的错误:NoMethodError: undefined method 'default' for an instance of String。该错误发生在尝试对 String 调用 #default 方法时,而 Karafka 代码和 rdkafka-ruby 库中没有任何地方使用 #default。错误在进程重启后自行消失,随后又再次出现。

调查 musl 假设

用户提到他们使用的是 ruby:3.4.5-alpine Docker 镜像,该镜像使用 musl libc。作者最初怀疑是 musl libc 导致的兼容性问题,进行了测试,但结果表明 struct 大小和对齐方式都正确,排除了类型不匹配和 musl 特有的问题。

一切变得毫无意义的时刻

作者意识到,错误并非数据损坏或内存错位,而是由于 Ruby 代码在运行时将 Hash 替换为 String 导致的。 这种现象只有在以下情况下才会发生:

  1. GC 运行并释放了 Hash。
  2. 在释放和下次访问之间存在时间间隔。
  3. Ruby 在该内存地址上分配了一个 String。
  4. 代码试图访问现在是 String 的“Hash”。

作者在 FFI 的 GitHub issue 中发现 #1079,该 issue 讨论了 segfault 问题,并提到 FFI 的 C 扩展缺少写屏障。

追根溯源

写屏障是告诉 Ruby 的垃圾回收器关于对象之间引用的机制。当 C 代码存储 Ruby 对象指针而不使用 RB_OBJ_WRITE 时,GC 不会知道该引用存在,从而可能释放该对象。

重现 Bug

作者构建了一个诊断脚本,模拟了上述情况,成功重现了该错误。该脚本通过创建大量瞬时 struct 类定义,并利用自然内存压力来触发 GC,最终导致 Hash 被释放并被 String 替换。

微秒级的窗口

该漏洞的产生依赖于一个非常短暂的时间窗口:GC 释放 Hash,然后 Ruby 在同一内存地址上分配 String,接着代码尝试访问该地址的数据。

对 Ruby 内存模型的启示

该漏洞揭示了 Ruby 内存管理的一些关键点:对象没有永久的身份,它们只是内存地址上的数据结构。当 GC 释放内存时,Ruby 会重用该内存。如果 C 代码持有指向该地址的指针,而没有使用正确的写屏障,则代码将指向 Ruby 随后创建的任何对象。

修复与未来

升级到 FFI 1.17.0 或更高版本即可修复该漏洞,该版本在 FFI 的 C 代码库中添加了适当的写屏障。

经验教训

  • 不要过早下结论。
  • 关注垃圾回收的 timing。
  • 即使 bug 看起来罕见,在规模化的环境中也可能发生。

鸣谢

感谢 KJ 在 FFI issue #1079 中修复了该漏洞。

总结

如果您正在使用 FFI < 1.17.0,请尽快升级,以避免潜在的生产环境问题。

30. The Case That A.I. Is Thinking (www.newyorker.com)

人工智能:理解的幻象? (Artificial Intelligence: The Illusion of Understanding?)

概述: 文章探讨了人工智能(AI)技术的快速发展,以及人们对未来AI能力的期望和担忧。尽管当前AI工具(如Siri、Gmail的AI助手)仍存在局限性,但AI在编程等领域的表现已经令人印象深刻,引发了对“理解”的本质的思考。

主要内容:

  • 未来展望: Dario Amodei和Sam Altman等AI行业领袖预测,未来几年内可能会出现超越诺贝尔奖获得者水平的AI,甚至出现“数字超智能”。
  • AI的现状与局限: 当前的AI工具仍然存在许多缺陷,例如产生不准确的信息(“幻觉”)、过度依赖用户指令等。
  • 作者的转变: 作者作为一名程序员,最初对AI持怀疑态度,但通过使用AI进行编程,亲身体验了AI的能力,并最终转变为拥护者。AI能够快速消化和分析大量代码,发现潜在的错误并实现复杂的功能。
  • “理解”的本质: 文章引用了William Gibson的观点,强调AI技术在不同人群中产生了不同的反应。作者提出,AI在某些方面的表现已经足够令人信服,以至于人们开始质疑“理解”的定义。
  • AI在解决实际问题中的应用: 举例说明了ChatGPT-4o如何帮助解决一个简单的水管问题,突显了其解决问题的能力。
  • 神经科学的视角: 神经科学家Doris Tsao认为,AI的进步对理解智能的本质提供了宝贵的见解,甚至可能比过去一个世纪的神经科学研究更有价值。
  • AI技术的发展历程: 简要介绍了AI技术的发展历程,从最初的认知心理学和计算机科学的尝试,到人工神经网络和深度学习的出现,再到如今基于“预测下一个词”的训练方法。
  • 批评的声音: 文章引用了Ted Chiang、Emily M. Bender和Tyler Austin Harper等人的观点,批评AI仅仅是“模糊的网页JPEG”,认为AI缺乏真正的理解,并指出其潜在的道德和社会风险。
  • 对大脑的类比: 文章探讨了AI与人脑的相似之处,认为AI可能在某种程度上模仿了人脑的运作方式。引用了Pentti Kanerva的“稀疏分布式记忆”理论,认为AI通过压缩经验来形成对世界的理解。
  • 未来的挑战: 尽管AI取得了显著进展,但仍然面临着许多挑战,例如如何提高学习效率、如何避免产生偏见等。作者认为,AI的未来发展可能取决于我们是否能更好地理解人脑的工作原理。

核心论点:

尽管人工智能目前还存在诸多局限,但其快速发展和日益精湛的表现,已经引发了人们对“理解”本质的深刻思考,并为神经科学研究提供了新的视角。 AI的进步可能意味着我们对智能的理解更加接近真理,但也需要警惕其潜在的风险,并继续探索更有效、更安全的发展方向。

总结:

这篇文章对人工智能的现状和未来进行了全面的探讨,既肯定了AI的巨大潜力,也指出了其面临的挑战和潜在的风险,引发读者对AI与人类智能关系的思考。

32. When Soviet-made cars roamed Singapore roads (remembersingapore.org)

新加坡汽车发展简史:从多元进口到苏联车短暂涌入 (A Brief History of Car Development in Singapore: From Diverse Imports to the Brief Influx of Soviet Cars)

本文回顾了1970年代至1990年代新加坡汽车市场的发展,以及苏联汽车在其中的短暂出现。

早期汽车进口 (Early Car Imports):

在70年代和80年代,新加坡的汽车主要从多个国家进口,包括:澳大利亚(Holden)、捷克斯洛伐克(Skoda)、法国(Citroen, Peugeot, Renault)、德国(Mercedes-Benz, BMW, Audi, Opel, Volkswagen)、意大利(Fiat, Alfa Romeo, Lancia, Maserati)、马来西亚(Proton)、罗马尼亚(Aro, Dacia)、韩国(Hyundai)、西班牙(Seat)、瑞典(Volvo, Saab)和美国(Ford)。其中,日本汽车(Toyota, Honda, Nissan, Mazda, Suzuki, Subaru, Isuzu, Daihatsu, Mitsubishi)最为流行。

苏联汽车的短暂涌入 (The Brief Influx of Soviet Cars):

1977年,由于苏联与东盟国家贸易额大幅增长(增长47%),苏联汽车开始进入新加坡市场。Avtoexport(苏联汽车出口机构)与当地代理商如Lada Motors Pte Ltd和Eurocars Pte Ltd建立了联系。

  • 伏尔加出租车 (Volga Taxis): 伏尔加汽车于1977年登陆新加坡,其中一部分被改装成标志性的黄色出租车。伏尔加出租车以其坚固、经济和舒适著称,配备空调和电子计价器,价格约为17,500新元,比同等排量的其他车辆便宜1,500至6,500新元。
  • Lada 1200 (VAZ 2101): Lada 1200也于1977年进入新加坡,外观与Fiat 124Sn高度相似,是苏联版的124Sn。苏联在60年代收购了Fiat的生产厂房后,Fiat 124Sn型号停产。Volzhsky Plant(伏尔加汽车厂)在1967年耗资4亿美元(当时的17亿新元)建立,年产能达66万辆。 Lada 1200在机械上与Fiat 124Sn有所不同,配备了苏联制造的1,198cc单顶 camshaft发动机,输出60马力,并改进了液压助力离合器踏板、双回路液压制动器和变速箱。当时售价为12,400新元(不含PARF)或15,900新元(含PARF)。

Lada汽车的衰落和再次尝试 (The Decline of Lada and Subsequent Attempts):

由于销量不佳,Lada Motors Pte Ltd于1981年放弃了Lada汽车的经销权。 1989年,政府关联贸易公司Intraco Ltd成立了Samara Motors,与Togliatti Cars (Asia) Pte Ltd合作,再次尝试将Lada汽车引入新加坡。当时主要销售1,300cc的Lada Samara和1,600cc的Lada Niva,价格在30,000到40,000新元之间(含PARF)。

Lada汽车的质量问题和最终退出 (Quality Issues and Final Exit):

80年代和90年代,许多汽车品牌和型号的设计和性能都取得了显著进步。然而,Lada汽车的设计相对落后,缺乏助力转向,并且存在质量和可靠性问题,如车门卡住和发动机过热。关于Lada汽车的笑话也开始流传。苏联解体后,Volzhsky Plant面临生存危机,并受到俄罗斯犯罪组织的控制,严重影响了其声誉和质量控制。最终,Lada汽车从新加坡市场消失。

罕见汽车品牌 (Rare Car Brands):

根据新加坡土地交通管理局(LTA)的2024年车辆统计数据,新加坡目前最稀有的汽车品牌包括:Alvis, Armstrong Siddeley, Austin, BSA, Bertone, Binz, Buick, Caterham, Chalmers, DeLorean, Dodge, Essex, Frazer, Geely, Hafei, Hillman, Holden, International, Jensen, Koenigsegg, Lagonda, Lea-Francis, Leyland, Lincoln, Marcos, Maxwell, Maybach, Mercury, Neta, Noble, Pagani, Panther, Pontiac, Rambler

33. Guideline has been acquired by Gusto (help.guideline.com)

Guideline, LLC 网站信息概要 (Summary of Guideline, LLC Website Information)

以下是对 Guideline, LLC 网站内容的摘要:

免责声明及重要信息:

  • 网站信息仅供参考,不构成任何形式的建议(投资、法律、税务等)或购买/出售证券的邀请。
  • 使用该网站即表示同意 Guideline, LLC 的 隐私政策使用条款
  • Guideline, LLC 不对第三方信息负责,即使认为其信息可靠,也不保证其准确性和完整性。
  • 投资有风险,可能损失本金,过往业绩不代表未来表现。投资不受 FDIC 保险。

公司结构及服务提供商:

  • Guideline, LLC 是 Gusto, Inc. (“Gusto”) 全资拥有的控股公司。
  • 通过其子公司,Guideline, LLC 提供集成平台,客户可以选择与 1) Guideline RK, LLC (“Guideline”) 或 2) Guideline Investments, LLC (“Guideline Investments”) 合作。
  • Guideline Investments, LLC 是一个 SEC 注册的投资顾问。
  • Gusto、Guideline, LLC 和 Guideline RK, LLC 不参与证券活动,且未在 SEC 或 FINRA 注册。Gusto 及其任何关联公司也不是银行。

服务内容:

  • Guideline Investments, LLC (Guideline Investments): 提供 Gusto 401(k) 产品(选择 3(38) 责任人服务)和 SEP IRA/IRA 产品的投资顾问服务。 投资顾问服务包括投资产品、投资组合、机器人顾问服务、投资建议等。相关费用及服务详情请参考 ADV 2A BrochureForm CRS
  • Guideline RK, LLC (Guideline): 提供 Gusto 401(k) 产品和 SEP IRA/IRA 产品的管理和记录服务。 还提供 3(16) 计划管理服务,仅通过 Gusto 的工资服务集成可用。 价格信息请参考 此处。 Guideline 使用第三方提供托管服务,托管费用由 Guideline 支付。

其他说明:

  • 网站上的图表和其他视觉辅助工具仅供参考,不能单独用于做出投资决策。
  • 所有权利归 © 2025 Guideline, LLC 所有。

总而言之,该网站旨在提供有关 Guideline, LLC 及其子公司提供的服务的信息,并明确声明这些信息不构成投资建议,并强调了投资相关的风险。

34. Why AC is cheap, but AC repair is a luxury (a16z.substack.com)

特定行业(如科技和AI)的生产力爆发会对整体经济产生两种截然不同却相互关联的效应:杰文斯悖论(Jevons Paradox)鲍莫尔效应(Baumol Effect)。这两种效应深刻影响着AI超级周期下的服务定价与就业市场。

1. 杰文斯悖论:生产力提升催生需求爆炸

当某项技术的生产效率大幅提高、成本骤降时,人们对其的消耗量不仅不会减少,反而会呈指数级增长。历史上的煤炭生产和摩尔定律下的计算能力均印证了这一点。在AI浪潮中,随着算力(Token)成本的急剧下降,其应用场景和需求将爆发式增长,从而在高生产力领域创造大量新机会和高薪岗位。

2. 鲍莫尔效应:未提升生产力行业的成本攀升

高生产力行业创造的高薪岗位会拉高整体劳动力市场的薪资预期。为保持吸引力,那些生产力未显著变化的行业(如家庭维修、家政、传统艺术)不得不提高工资,导致其服务价格大幅上涨。鲍莫尔效应的前提是杰文斯悖论带来的社会整体财富增加;正因为社会整体变富,人们才能负担这些变贵的服务。

3. AI时代的双重经济表现

随着AI的广泛采用,这两种效应将在宏观和微观层面同时显现:

  • 宏观行业分化:受AI深度影响且需求弹性高的服务(如法律服务)将变得廉价且消耗量激增(杰文斯效应);而难以被AI替代的人工服务(如遛狗、空调维修)价格将大幅飙升(鲍莫尔效应)。
  • 单一职业内部的极化:当AI自动化了一项工作99%的流程时,剩下必须由人类完成的1%(通常出于安全或合规监管要求)将成为系统瓶颈。这最后的“人类技能”将变得极其昂贵并受到监管保护,直到该工作被100%完全自动化。

结论

尽管生产力的飞跃会导致部分传统人工服务价格高昂等看似矛盾的经济现象,但杰文斯悖论带来的生产力提升和财富增长才是社会繁荣的根本动力。持续推动生产力发展始终是创造社会整体财富的核心。

35. Gallery of wonderful drawings our little thermal printer received (guestbook.goodenough.us)

小型热敏打印机画作画廊记录总结

该内容展示了一个名为“我们的小热敏打印机收到的精彩画图画廊”(Gallery of wonderful drawings our little thermal printer received)的页面数据,主要记录了用户向一台小型热敏打印机提交画作的历史信息。

内容结构

页面主体是一个按时间倒序排列的提交记录列表。虽然具体的画作图像在当前文本中未直接呈现,但详细保留了每次提交的元数据。

关键细节

  • 时间跨度:记录的提交日期从2025年11月7日开始,至2026年1月14日结束,涵盖了两个多月的时间。
  • 记录要素:每一条提交记录均严格包含以下三个核心字段:
    1. 提交者标识:用户自定义的名字或昵称(例如:raster、Will M、Goddess of Mitochondria、sam 💕 等)。
    2. 提交日期:精确到日的提交时间。
    3. IP地址:提交者的网络IP地址(例如:45.87.213.230、86.18.53.5 等)。
  • 参与情况:列表包含了数十条独立记录,显示了不同昵称和来自不同IP地址的用户的持续参与,体现了该热敏打印机互动项目的社区活跃度。
36. Israels top military lawyer resigns, goes missing, is found and thrown into jail (apnews.com)

以色列最高军事律师泄密被捕事件总结

核心事件

以色列前最高军事律师伊法特·托默-耶鲁沙尔米(Yifat Tomer-Yerushalmi)少将因批准泄露一段以军虐囚视频,在承受巨大政治压力辞职并短暂失踪后,被搜救找到并因涉嫌欺诈、违背信任和妨碍司法公正被关押入狱。

事件起因与虐囚指控

事件源于她批准泄露的一段监控视频。视频显示2024年7月以军士兵在Sde Teiman军事监狱对一名巴勒斯坦囚犯进行了严重的暴力与性虐待,致其重伤。她泄密本意是揭露虐待真相并反驳“军方不公平针对自家士兵”的言论,却遭强硬派政客猛烈抨击。目前该囚犯已作为人质交换被释放回加沙,案件仍在审理中。

失踪风波与舆论失焦

辞职后她曾留下字条弃车,引发军方大规模搜救。在海滩获救后,右翼人士继续对其进行人身攻击,并因其手机丢失指责她伪造自杀以销毁证据。此风波导致公众和媒体的注意力完全集中在“泄密”上,而忽视了核心的“虐囚”指控。

社会撕裂与政治背景

该事件凸显了以色列社会在长期战争后依然严重分裂:

  • 高层人事更迭:她成为最新一位被迫离职的高级安全官员,此类职位正逐渐被总理内塔尼亚胡的忠诚者取代。
  • 社会极化加剧:当前激烈的内部言辞令人联想到哈马斯袭击前因司法改革引发的对立,以及30年前总理拉宾遇刺前的煽动氛围,引发对以色列重返严重内部冲突的担忧。

涉及的三大法律问题

以色列民主研究所指出,调查需厘清三个独立问题:

  1. 以军士兵虐待巴勒斯坦囚犯的证据。
  2. 包括议员在内的平民冲击军事基地、阻碍对涉事士兵调查的行为。
  3. 托默-耶鲁沙尔米涉嫌为泄露视频而实施的欺诈及妨碍司法等违法行为。
37. Dependent types and how to get rid of them (chadnauseam.com)

内容摘要

提供的内容仅包含文章的元数据(Front matter),未包含实际正文。基于现有信息,文章的核心要点如下:

  • 文章标题Dependent types and how to get rid of them(依赖类型及其消除方法)
  • 核心议题(Description)are-dependent-types-actually-erased(依赖类型是否真的被擦除)
  • 来源:Chad Nauseam Home

主题概述: 该文章主要聚焦于编程语言理论中的依赖类型(Dependent types),核心探讨依赖类型在实际机制中是否真的会被擦除(erased),以及如何消除或处理这些依赖类型。由于提供的文本缺失具体正文,无法进一步总结其技术细节、论证过程或最终结论。

38. The Mack Super Pumper was a locomotive engined fire fighter (2018) (bangshift.com)

研发背景与目的

20世纪60年代初,纽约市面临建筑密集化及火灾风险增加的挑战。1963年斯塔滕岛“黑色星期六”特大火灾因水源枯竭和设备不足造成巨大损失,促使纽约市政府投资87.5万美元,研发史上最强陆地消防系统——Mack Super Pumper System(Mack超级泵浦系统),以应对极端火灾灾害。

系统结构与组成

该系统由五辆卡车组成编队协同作战:

  1. 中央泵浦车:系统核心,由牵引车和搭载巨型水泵的定制拖车组成。
  2. 设备与供水车(Tender):装载水带、歧管等连接设备,并配备一门射程超600英尺的巨型水炮,其驾驶室可与拖车分离以调整射击角度。
  3. 三辆卫星车:外观类似标准消防车,携带大量水带但不自带水泵,完全依赖中央泵浦车供水。

核心技术与关键功能

  • 动力系统:中央泵浦车采用二战时期英国设计的Napier-Deltic柴油发动机。该发动机为对置活塞、三曲轴、二冲程涡轮增压设计,重量轻且紧凑,可输出2400马力。其缺点为油耗极高(满载137加仑/小时)且噪音巨大,操作员需佩戴听力保护。
  • 牵引与机动:牵引车为Mack F715FSTP平头卡车(255马力),最高时速42英里,专为城市低速机动性优化。
  • 泵浦性能:拖车后部配备DeLaval制造的六级巨型水泵。低压下流量超10,000加仑/分钟(GPM);在350psi压力下可达8,800 GPM(每分钟喷射近7万磅水)。可同时连接8个消防栓或直接从自然水体抽水。
  • 高压水带:采用源自二战海军技术的高压水带,测试压力达1,000psi,常规工作压力为350-800psi,远超现代消防车标准。

服役表现与现状

从1965年至20世纪80年代初,该系统共响应超2,200次火灾呼叫,900多名消防员参与操作。其展现出极高的可靠性,从未在任务中出现故障或供水中断,曾创下单次火灾铺设7,000英尺水带抽水,并同时为多辆卫星车、云梯车及水炮供水的记录。随着技术进步,该系统最终退役,目前主车保存于密歇根州的一家博物馆中。

39. I want a good parallel language [video] (www.youtube.com)

Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube.

40. No Socials November (bjhess.com)

“无社交十一月”(No Socials November)挑战总结

核心倡议

作者在11月发起“无社交十一月”挑战,旨在减少对社交网络的依赖。目前,作者已退出所有个人社交账号,关闭了YouTube的算法推荐,并退出了Reddit。

参与方式与预期

作者邀请受社交媒体过度吸引的读者共同参与。建议的具体行动包括:

  • 退出社交账号。
  • 删除手机上的相关应用程序。
  • 努力打破使用社交媒体的“肌肉记忆”。 作者认为,坚持一周后参与者就会对这一决定感觉良好。

挑战后的自由选择

11月结束后,参与者没有必须继续保持“无社交”状态的压力,未来可自由选择:

  • 恢复以往的社交媒体使用习惯。
  • 调整并改变原有的使用方式。
  • 继续远离社交媒体。

替代方案与互动交流

  • 博客替代:作者计划通过写博客来替代刷社交媒体,并推荐朋友的博客平台 Pika 作为替代方案。为支持该挑战,提供专属优惠码 NOSOCIALSNOVEMBER,首年服务可享85折(15% off)优惠。
  • 读者互动:欢迎读者通过邮件分享关于远离社交媒体的想法;如果读者也选择通过写博客来替代,作者非常乐意关注并阅读其文章。
41. This Month in Ladybird – October 2025 (ladybird.org)

Ladybird 2025年10月开发进展摘要

项目概况与赞助

10月份,Ladybird 合并了来自43位贡献者的217个PR。项目新增 Axeptio(1万美元)和 Gravwell(5千美元)两家赞助商,持续获得开源社区的资金支持。

Web 平台测试 (WPT) 里程碑

WPT 通过率取得重大突破,新增逾11.1万个通过的子测试,总数近196.5万个。得益于 Wasm 3.0 核心测试的更新,Ladybird 首次实现 WPT 子测试通过率超过 90%,达到了 Apple 在 iOS 上允许替代浏览器引擎的关键标准。

核心功能与性能优化

  • HTTP 磁盘缓存:在现有内存缓存基础上,开始开发持久化磁盘缓存,以大幅提升重复访问网站的加载速度。
  • 性能提升:优化了 JS 字符串处理、对象属性赋值与内联缓存访问、Int32 溢出计算;忽略了隐藏 iframe 的重绘;在 HTML 解析后丢弃繁重的 UTF-32 缓冲区。
  • 音视频同步与多轨支持:重构媒体播放系统,统一控制音视频以确保同步。实现异步进度条拖动、多音轨/视频轨切换(audioTracks/videoTracks),并规范了 fastSeek() 行为。
  • 捏合缩放:在 macOS (AppKit UI) 上新增捏合缩放支持,并通过 VisualViewport API 暴露缩放变换。
  • Windows 支持:虽非 2026 年 Alpha 版重点,但 Ladybird 本月首次在 Windows 上成功运行,并实现了 Gamepad API 支持。

DOM、CSS 与图形 API 进展

  • DOM Trusted Types:为 iframeElementDocumentShadowRoot 等多个 DOM API 增加 Trusted Types 支持,提升安全性。
  • XPath 初步支持:基于 libxml2 实现基础 XPath 评估功能,使 htmx 库能够在 Ladybird 中运行。
  • CSS 新特性:推进 CSS Typed OM API;实现 sibling-count()sibling-index() 函数;优化 CSS 重复线性渐变和 SVG 渐变的渲染。
  • Canvas 与 WebGL
    • 修复 CanvasPattern 绘制应用,解决 slither.io 背景渲染问题。
    • 增强 WebGL2 的 .readPixels().getBufferSubData() 支持。
    • 修复离屏 WebGL 帧缓冲区清除问题(修复 PixiJS 演示)。
    • 针对 Google Maps Globe View 进行多项 WebGL 修复,显著减少视觉渲染问题。

开发者工具与无障碍支持

  • 无障碍 DevTools:重新实现无障碍树(Accessibility Tree)检查功能,为未来支持屏幕阅读器等辅助工具奠定基础。
42. Google Cloud suspended customer's account 3 times, for 3 different reasons (www.theregister.com)

事件概述

SSLMate(一家 SSL 证书管理服务)创始人 Andrew Ayer 表示,其公司的 Google Cloud 账号在无合理理由的情况下被三次封禁,且每次给出的原因均不相同。此经历促使他得出结论:Google Cloud 缺乏可靠性,无法用于生产环境的核心业务。

技术背景与系统架构

  • 业务用途:SSLMate 使用 Google Cloud 进行测试、实验,以及实现与客户 Google Cloud 账号的集成(代为发布证书验证 DNS 记录和发现需监控的域名)。
  • 架构设计:基于 Google Cloud 官方文档的建议,SSLMate 在其 Google Cloud 项目下为每个客户创建一个服务账号(Service Account),并要求客户授权该账号访问其 Cloud DNS 和 Cloud Domains。当需要访问客户账号时,SSLMate 会模拟(impersonate)相应的服务账号。
  • 安全优势:该方案配置简单且安全性高,避免了使用长期凭证(long-lived credentials)和“混淆代理”(confused deputy)漏洞。

三次封禁事件经过

  1. 第一次封禁(2024年5月):系统提示“违反政策”。恢复过程极其繁琐,Google 要求提供需登录后才能获取的信息,但账号已被锁定。部分恢复后,又因另一个不同原因再次被限制。Google 未发送封禁通知邮件,也未说明具体原因及预防措施。为此,Ayer 编写了健康检查脚本以监控集成状态。
  2. 第二次封禁(2024年10月下旬):健康检查脚本报警,所有客户集成失效,原因再次显示为“违反政策”。由于 Ayer 提前准备了 Google 支持团队所需的信息,此次恢复较为迅速。
  3. 第三次封禁(近期):账号再次被封,此次理由变更为“违反服务条款(ToS)”。Ayer 提出申诉后,收到自动邮件称其 Google Cloud 访问权限被完全暂停。直到 Ayer 在社交媒体上曝光此事后,服务才被恢复。

异常现象与替代方案评估

  • 异常现象:封禁并未影响所有客户集成。有一位客户的集成在每次封禁期间均正常运行,尽管其使用的服务账号与其他受影响的账号同属一个被暂停的 Google Cloud 项目。
  • 替代方案(OIDC):Ayer 考虑使用 OpenID Connect (OIDC) 作为替代方案,但他指出 Google 将 OIDC 的设置过程设计得“不必要地复杂和困难”。

最终结论

  • Ayer 认为 Google 构建了一个复杂且不可靠的系统,能够随意暂停整个 Google 账号、GCP 账号或单个 GCP 项目。
  • 尽管业界亟需淘汰长期凭证以提升安全性,但 Google 推荐的安全替代方案(提供商创建的服务账号)容易遭受随意封禁,而另一种方案(OIDC)配置又过于复杂。因此,SSLMate 决定放弃在生产环境中依赖 Google 账号。
43. Chaining FFmpeg with a Browser Agent (100x.bot)

FFmpeg 与浏览器代理的结合应用

本文探讨了将 FFmpeg 嵌入浏览器代理(Browser Agent)的技术方案,旨在实现视频的即时处理。

核心功能与优势

  • 即时处理:在浏览器代理内部直接集成 FFmpeg,实现视频的快速处理。
  • 无服务器架构:完全无需依赖后端服务器进行计算或存储。
  • 零上传与无 API 依赖:省去了文件上传和外部 API 调用的繁琐步骤,所有处理流程均在浏览器环境中闭环完成。

该方案展示了如何通过技术整合,提供一种无需服务器、API 或文件上传的轻量化、高效的视频处理体验。

44. Transducer: Composition, abstraction, performance (2018) (funktionale-programmierung.de)

Transducer:组合、抽象与性能

核心概念与目的

Transducer(转换器)是 Clojure 中对高阶函数(如 mapfilter)的深度抽象。其主要目的是将数据转换逻辑与底层数据结构解耦,从而在保持极高代码复用性的同时,显著提升数据处理的执行性能。

从集合到过程的抽象结构

  • 基于 Reduce 的解耦:传统的 mapfilter 可通过 reduce(fold)实现,但通常与特定的集合操作(如 conj)强耦合。
  • 过程修改器:通过将集合操作抽象为 step 参数,转换函数演变为“过程修改器”。它们接收一个 step 并返回修改后的 step,从而摆脱对特定数据集合的依赖。
  • 生命周期管理:为处理流或信号等无明确边界的数据,Transducer 通过 Clojure 的函数多参数重载内置了状态管理:0 个参数表示过程“开始”(返回中性初始值),1 个参数表示“结束”(处理最终结果),2 个参数表示处理当前累加器与输入元素。

函数组合与性能优化功能

  • 消除中间集合:传统的链式调用(如依次使用 filtermap)会在每一步生成新的中间列表,在大数据量下导致严重的内存和时间开销。
  • 高效执行机制:通过 comp 将多个转换逻辑组合成一个转换器(通常命名为 xform),并配合 transduce 函数执行。该机制对每个元素顺序应用所有转换步骤,仅需一次遍历且不产生任何中间集合,从而大幅提升吞吐量。

跨数据结构的通用性

Transducer 的关键功能在于其不依赖具体的数据结构。只要目标结构提供必要的基础设施,同一个 xform 即可无缝复用。例如,它不仅适用于传统的列表和向量,还能直接应用于 core.async 的通道(channels),在异步数据流处理中表现出完全一致的转换行为。

结论

Transducer 是传统列表处理函数的自然演进。它通过彻底的抽象和函数组合,提供了一种强大、通用且高效的数据转换范式,是函数式编程中处理各类数据集合与流的核心工具。

45. Defeating KASLR by doing nothing at all (googleprojectzero.blogspot.com)

本文探讨了在缺乏KASLR(内核地址空间布局随机化)泄露的情况下,如何利用Linux内核线性映射和Pixel手机物理地址非随机化问题绕过KASLR。

1. Linux线性映射非随机化

在Arm64 Android系统中,因启用内存热插拔且内核虚拟地址空间受限(39位),Linux内核将线性映射(物理内存到虚拟地址的1:1映射)固定在最低可能的虚拟地址,导致其不再随机化。PHYS_OFFSETPAGE_OFFSET 变为固定值,攻击者可通过静态公式将任意物理地址直接转换为对应的内核虚拟地址。

2. Pixel内核物理地址固定

Pixel设备的bootloader每次启动均将内核解压至固定的物理地址(0x80010000)。结合线性映射特性,攻击者无需破解KASLR,即可通过计算偏移量静态推导出内核 .data 段中任意符号(如 modprobe_path)的虚拟地址。该线性映射区域具备读写权限,为攻击者提供了强大的任意读写原语。

3. 对物理地址随机化设备的影响

即使在内核物理地址随机化的设备上,线性映射非随机化仍会显著削弱内核安全性。攻击者可通过内存喷射(如用户态 mmap)将数据分配至可预测的物理地址,再利用线性映射在内核空间中以已知的虚拟地址访问这些用户态数据。这为伪造内核数据结构和利用UAF等漏洞提供了极大便利。

4. 官方回应与改进建议

上述问题已被报告给Linux内核团队和Google,但均被视为“预期行为”,短期内暂无修复计划。作者强调,尽管KASLR在防范本地攻击时存在局限,但在抵御远程攻击和增加漏洞利用复杂度方面仍具重要价值。建议未来在Linux内核中引入线性映射虚拟地址随机化、增加物理页分配熵以及随机化内核物理加载地址,从而提升Android和Linux系统的整体安全态势。

46. Optimizing Datalog for the GPU (danglingpointers.substack.com)

优化GPU上的Datalog执行

Datalog基础与半朴素评估

  • Datalog执行原理:Datalog程序由关系(显式定义的元组集合或隐式定义的规则)组成。运行程序即不断评估规则直至达到不动点(无新元组产生)。评估Datalog规则在本质上等同于执行SQL连接(Join)操作。
  • 半朴素评估(Semi-naïve Evaluation):一种在收敛前执行连接并减少冗余计算的算法。该算法将关系中的元组划分为三个集合:new(当前迭代发现)、delta(上一迭代添加)和full(所有迭代发现)。对于关系A和B的连接,new集合由delta(A)与full(B)full(A)与delta(B)以及delta(A)与delta(B)的连接结果并集构成,从而避免了full集合之间的直接连接。

核心数据结构:哈希索引排序数组

为在GPU上高效存储关系并执行半朴素评估,论文提出了一种“哈希索引排序数组”数据结构,主要包含以下三个组件:

  1. 数据数组(Data array):以行主序(row-major order)密集存储实际的元组数据。
  2. 排序索引数组(Sorted index array):存储指向数据数组的指针(每个元组一个)。这些指针按字典序排序,且连接键(join keys)在排序中享有最高优先级。
  3. 哈希表(Hash table):采用开放寻址(open-addressed)机制,将连接键的哈希值映射到排序索引数组中包含该连接键的第一个元素位置。

连接操作与内存访问特性

  • 连接执行逻辑:遍历关系A排序索引数组中的每个元组,通过哈希表查找关系B中首个匹配连接键的元组,然后遍历关系B排序索引数组中所有具有匹配键的元组。
  • 内存访问优化:在探测排序索引数组时,内存访问是连贯的(coherent);在访问数据数组时,内存访问在单个元组的元素数量范围内保持连贯。

实验评估与扩展性

  • 论文将提出的GPULog系统与当前先进的CPU实现(Soufflé)进行了性能对比,并测试了将其移植到AMD HIP运行时环境的表现。
  • 该数据结构与算法设计具有通用性,具备应用于FPGA、DPU、CPU和HPC集群等其他硬件架构的潜力。
47. Lessons from interviews on deploying AI Agents in production (mmc.vc)

生产环境部署 AI Agents 的核心经验与洞察

本文基于对30多位欧洲 Agentic AI 初创公司创始人及40多位企业从业者的调研,总结了在企业生产环境中部署 AI Agents 的关键挑战、策略及行业现状。

核心挑战

部署 AI Agents 的最大阻碍并非技术,而是:

  1. 工作流集成与人机交互(60%):难以融入现有业务流程,用户需要时间适应新范式,且定制化“最后一公里”界面成本高。
  2. 员工抵触与非技术因素(50%):核心在于信任缺失,导致员工对 AI 过度依赖或完全防备;此外,客户缺乏连贯的 AI 战略也增加了推广阻力。
  3. 数据隐私与安全(50%):严格的合规要求与管理层对隐私的担忧显著拖慢了部署进度。

部署与定价策略

  • “从小处着手”(Think Small):最成功的策略是从低风险、中等影响、易验证且员工反感的任务切入,快速证明投资回报率(ROI)。
  • 预算来源:62% 的初创公司已切入业务线(Line of Business)或核心支出预算,表明技术正脱离纯实验阶段。
  • 定价模式:混合定价(23%)和按任务定价(23%)最常用。被视为“圣杯”的按结果定价仅占3%,因业务结果难以定义、归因和预测。

准确性、自主性与基础设施

  • 准确率与自主性:超90%的初创公司准确率至少达70%。配置因行业而异:医疗等高风险领域要求“高准确、低自主”;金融和客服追求“高准确、高自主”;对于低风险或海量任务,“中准确、高自主”亦可接受。
  • 基础设施:由于生态尚处早期,52% 的初创公司选择完全或主要内部自研 Agent 基础设施,以确保系统的灵活性与可控性。

企业采用现状与推广策略

  • 采用现状:部署多集中在客服、销售和网络安全等成熟领域。企业态度保守,倾向保留“人在回路”(human-in-the-loop)。员工日常使用率偏低,并引发了合规风险高的“影子 AI”问题。
  • 推广与定位
    • 深度陪伴:需通过工作坊和前瞻性部署工程师(FDE)深度参与,管理预期并优化交互界面(涵盖教育、娱乐、预期管理)。
    • 产品定位:强调“增强”而非“替代”人类。医疗等严谨行业倾向淡化“AI”标签,金融业则突出“Agentic”优势。初期多采用“副驾驶”(Co-pilot)模式以建立信任。

未来展望

当前的 AI Agents 多为被动响应式。未来将向环境感知(ambient)和主动式(proactive)演进,具备在不确定环境中稳健推理、持续学习记忆的能力,并能跨组织与其他 Agent 交互协作。

48. How devtools map minified JS code back to your TypeScript source code (www.polarsignals.com)

源映射(Source Maps)工作原理总结

核心目的

源映射(Source Maps)用于在浏览器 DevTools 中将构建、压缩后的 JavaScript 代码映射回原始的 TypeScript 源代码。它能够在调试时还原正确的变量名、代码格式,并精准定位原始代码中的错误位置。

现代 JS 构建阶段

源映射在以下三个主要构建阶段中维持与原始代码的关联:

  1. 转译(Transpilation):将 TypeScript 转换为 JavaScript。
  2. 打包(Bundling):将多个模块合并为单一文件。
  3. 压缩(Minification):压缩代码以适应生产环境。

Source Map 文件结构

源映射通常采用 JSON 格式(扩展名如 .js.map),其核心字段包括:

  • version:源映射版本(当前固定为 3)。
  • file:对应的生成文件名。
  • sourceRoot:源 URL 的可选前缀。
  • sources:原始源文件路径数组。
  • sourcesContent:可选字段,包含实际源代码,以便在原始文件不可访问时仍能显示源码。
  • names:源代码中出现的原始标识符(变量名、函数名等)数组。
  • mappings:核心字段,包含使用 VLQ 编码的压缩位置映射数据。

Mappings 字段与映射机制

mappings 字段记录了生成文件中每个 Token 与原始源文件位置的精确对应关系。

  • 分隔符机制:使用逗号分隔同一行内的映射段(segments),使用分号代表生成文件中的换行(即使空行也需要分号来维持行号计数)。
  • 段的值类型
    • 1 个值:仅包含生成列(表示无源映射,如构建工具生成的代码)。
    • 4 个值(最常见):生成列、源文件索引、源行、源列。
    • 5 个值:在 4 个值基础上增加名称索引(用于变量或函数在压缩时被重命名的情况)。
  • 相对位置存储:映射数据记录的是与前一个位置的差值(Delta),而非绝对坐标,这使得编码字符串更加紧凑。

Base64 VLQ 编码机制

为了控制文件体积,mappings 使用 Base64 VLQ(可变长数量)编码来高效表示较小的数字差值。编码过程分为三个步骤:

  1. 编码符号位:使用最低有效位(LSB)表示数值的正负(0 为正,1 为负)。
  2. 拆分为 5 位组:每个 Base64 字符可表示 6 位,其中最高位作为“连续标志”(指示后续是否还有字符),剩余 5 位用于存储实际数据。
  3. 转换为 Base64:将组合后的 6 位二进制值映射为对应的 Base64 字符。

扩展应用

除了前端代码调试,源映射技术还将被引入 parca-agentPolar Signals Cloud,为性能分析(Profiling)工作流提供相同的源码映射与调试能力。

49. Today I Learned: Binfmt_misc (dfir.ch)

binfmt_misc 概述

binfmt_misc(杂项二进制格式)是 Linux 内核的一项特性,允许系统识别并执行自定义二进制格式的文件。启用后,内核会挂载一个虚拟文件系统(通常位于 /proc/sys/fs/binfmt_misc/)。用户可通过向 register 文件写入特定格式的字符串来注册新的处理程序,定义文件的识别方式(如魔数或扩展名)及对应的解释器。当执行匹配的文件时,内核会自动调用指定的解释器。

安全威胁:Shadow SUID 后门

攻击者在获取 root 权限后,可利用 binfmt_misc 建立隐蔽后门以维持访问权限(即 Shadow SUID 技术)。通过在注册规则时使用 C(credentials)标志,内核将使用原始被执行文件的权限来运行解释器。若原始文件具有 setuid-root 属性,解释器便会以 root 权限运行。由于该技术较为冷门,常规安全框架和工具往往难以检测。

后门构建流程

  1. 编写解释器:编译一个 C 语言程序,用于执行提权 shell(如 /bin/bash -p)。
  2. 选择 SUID 目标:选择一个极少使用的系统自带 SUID 二进制文件(如遗留命令 chfn),以避免破坏常用命令(如 ping)的正常功能。
  3. 提取魔数:获取目标 SUID 文件的十六进制魔数(magic bytes)。
  4. 注册规则:将包含名称、魔数、解释器路径(如 /dev/shm/malmoeb)和 C 标志的字符串写入 /proc/sys/fs/binfmt_misc/register。 配置完成后,普通用户只需执行 chfn,内核便会拦截并调用攻击者的解释器,直接赋予 root 权限。

检测与防御分析

  • 检测盲区:解释器文件本身无 SUID 权限,常规 SUID 搜索无法发现。此外,目标命令(如 chfn)实际上并未被真正执行,而是作为“代理执行”(Proxy execution),导致针对 SUID/SGID 利用的常规检测规则无法触发。攻击前置动作(如 SUID 枚举和提取魔数)也非攻击链所必需,进一步降低了暴露风险。
  • 防御策略:安全团队应监控 /proc/sys/fs/binfmt_misc/ 目录,对新的注册事件设置告警,并重点排查解释器路径指向临时或可写目录(如 /tmp/dev/shm、用户主目录)的异常处理程序。
  • 持久化限制:该注册规则是临时的,系统重启后即失效。攻击者必须依赖其他持久化机制来重新注册规则,这为防御方提供了额外的检测机会。
50. My Experience of building Bytebeat player in Zig (blog.karanjanthe.me)

Zigbeat:使用 Zig 构建 Bytebeat 播放器的实践总结

项目概述

作者在毕业后利用周末时间,使用 Zig 语言开发了一款名为 Zigbeat 的 Bytebeat 播放器。这是作者首次使用 Zig,认为其编写体验类似于带有友好默认值的 C 语言。项目旨在支持原生应用和 Web(WASM)双端运行,采用了 Raylib 框架并结合 Emscripten 进行编译。

Bytebeat 原理

Bytebeat 是一种算法音乐形式,通过仅包含时间变量 t 的短程序(通常使用位运算)生成 PCM 音频。为契合早期 PC 声卡的默认设置并保留其独特的 Lo-fi 魅力,Bytebeat 通常采用 8-bit 采样深度和 8kHz 采样率的简单音频格式。

开发体验与技术挑战

  • 底层实现:与 JavaScript 中可直接使用 eval 不同,在 Zig 中需要从头实现文本编辑器、光标闪烁和文本选择等基础功能,让作者深刻体会到日常开发所依赖的抽象层。
  • 字符串与内存:Zig 没有默认的字符串数据类型(本质为 []u8),且不支持对字符串进行 switch 操作。这促使作者深入理解了 Zig 中结构体和底层字节级的内存分配机制。
  • 脱离 LLM 辅助:由于大语言模型对 Zig 较新语法(如最新的 ArrayList 初始化语法)支持不佳,作者全程未使用 LLM 辅助,独立完成了代码编写。

性能优化与内存管理

作者实现了 Pratt 解析器(Pratt Parser)来解析表达式并生成抽象语法树(AST)。在测试中发现 Web 端的音频回调存在严重延迟。经排查,原因是每次音频采样时都在重新创建 AST 并分配内存,导致计算速度无法跟上音频输出需求。 解决方案:引入 Arena Allocator(区域分配器)。由于用户输入的表达式在未修改时,其 AST 所需的内存是恒定的,Arena 分配器能够以大块内存进行分配,并在表达式更新或工作完成后一次性释放所有内存,从而彻底解决了性能瓶颈。

UI 设计与未来计划

作者原计划使用 Raylib 的图元 API 绘制复古 8-bit 合成器风格的 UI,但发现实现过于复杂。随后尝试使用 Photoshop 制作精灵图(Sprites)进行集成。但由于设计经验不足且耗时过长,UI 美化工作被暂时搁置,计划在未来完善。

总结

相比使用 JavaScript,选择 Zig 语言让作者深入学习了词法分析和 Pratt 解析等底层解析与计算知识。项目不仅是一次成功的兴趣实践,也提供了极具价值的底层系统编程与内存管理经验。