2024-06-21

34 篇热帖

1. Allan McDonald refused to approve Challenger launch, exposed cover-up (2021) (www.npr.org)

Allan McDonald:挑战者号事件中的正直工程师

Allan McDonald是NASA承包商Morton Thiokol公司的推进火箭项目主管。1986年1月27日,在挑战者号航天飞机预定发射的前夜,他拒绝在发射授权书上签字,因为他认为低温天气、发射台结冰和海况不佳等风险过高,可能危及机组人员安全。这是他“一生中最明智的决定”。

反对发射与事故

McDonald和Thiokol的工程师团队基于数据,强烈反对在低温下发射,警告助推火箭接头处的O型环会因低温变硬而失效。尽管如此,在NASA施压下,公司管理层最终否决了工程师们的意见。McDonald拒绝签字,但发射照常进行。次日,挑战者号升空后爆炸,七名宇航员全部遇难。

揭露真相与后续

事故发生12天后,在总统委员会的闭门听证会上,McDonald挺身而出,揭露了NASA官员掩盖Thiokol工程师曾书面建议“低于53华氏度不要发射”这一关键事实的行为。他的证词促使调查重点转向了O型环问题以及决策过程的失误。 McDonald因直言而遭公司降职,但此举引起了国会和总统委员会的强烈关注。在政治压力下,公司恢复其职位并晋升他为副总裁,负责领导重新设计失效接头的工作。1988年,重新设计的接头随航天飞机成功复飞。

晚年与精神遗产

McDonald于2001年退休,与人合著了《真相、谎言与O型环》,成为挑战者号事件的权威记录。退休后,他成为积极的伦理决策倡导者,向众多工程师、管理者和学生演讲。 他提出了“七个正确”的原则(在正确的时间、为正确的理由、与正确的人一起做正确的事),并常引用一句格言:“对做过之事的懊悔会随时间淡去,但对未做之事的懊悔则永难平息。” Allan McDonald于2021年去世,享年83岁。他的一生诠释了在压力下坚守专业操守、为真相与安全发声的勇气。

4. Ladybird browser spreads its wings (lwn.net)

Ladybird 浏览器:一个独立网页浏览器的兴起

Ladybird 是一个旨在构建独立网页浏览器的开源项目,以区别于基于 Chromium 的浏览器。该项目使用 C++ 编写,采用双条款 BSD 许可证。其起源是 SerenityOS 操作系统项目的一部分,但首席开发者 Andreas Kling 于 2024 年 6 月宣布将其分叉为独立项目,并辞去 SerenityOS 的“终身仁慈独裁者”职务,以专注于 Ladybird 的开发。目前,Ladybird 尚处于早期开发阶段(pre-alpha),还不适合日常替代 Firefox 或 Chrome 使用,但展现出巨大潜力。

项目起源与独立发展 Andreas Kling 曾在苹果和诺基亚从事基于 WebKit 的浏览器开发工作。2018 年,他开始作为个人疗愈项目开发 SerenityOS,并最终将其转为全职工作。Ladybird 项目于 2022 年 9 月首次宣布,最初目标是为 SerenityOS 的 LibWeb 引擎创建一个跨平台的图形用户界面。随着开发重心完全转向 Linux 版本,Kling 决定将其独立出来。

独立后的 Ladybird 放弃了 SerenityOS 作为开发目标,并迁移至自己的 GitHub 仓库。项目治理模式与 SerenityOS 类似,Kling 仍为“终身仁慈独裁者”,配有核心维护者团队,开发讨论在 Discord 上进行。

技术策略的重大转变 项目独立后的一个重要变化是放宽了之前在 SerenityOS 项目中执行的“非此处发明”政策。这意味着 Ladybird 现在可以利用现有的第三方库,而非全部从头编写。例如,项目已用 SQLite3 替换了原有的自研数据库库。根据 Kling 的说明,只有实现网络标准的核心组件(如 DOM、HTML、JavaScript 引擎、CSS 解析等)才会内部构建,其他部分则会考虑使用现有库,除非团队相信自己能做得更好。

项目 README 中的目标陈述也从“无第三方依赖”演变为“使用基于网络标准的新型引擎”。

当前状态与功能特点 目前,Ladybird 仅能在 Linux、macOS 和其他类 UNIX 系统上构建运行,官方未提供预编译的二进制文件,用户需自行获取源码并编译。

在功能和性能上:

  • 渲染与兼容性:能够渲染许多网站(包括复杂布局的 GitHub),但速度较慢。CSS 支持相对较好,通过了 CSS 选择器 1-3 级测试。JavaScript 支持可用但加载缓慢。
  • 稳定性:处于 pre-alpha 阶段,稳定性不足,页面可能导致整个浏览器崩溃。
  • 基础功能:具备标签页、前进/后退、缩放、截图、URL 栏、开发者工具(DOM 检查器、用户代理伪装等)等基础功能。
  • 缺失功能:缺少书签、历史记录、扩展、密码管理、打印、保存图片、WebRTC 支持等常见特性。

开发活跃与未来展望 尽管尚不成熟,但项目开发非常活跃。近一个月内,有 49 位贡献者提交了超过 880 次代码提交。如果这种势头能够保持,Ladybird 有望在未来发展成为一个可用的浏览器替代选择。

5. Small claims court became Meta's customer service hotline (www.engadget.com)

小额法庭成为Meta的客服热线

越来越多的Meta用户因账户被黑客入侵或无故被封,而无法通过官方渠道获得有效帮助,转而选择向小额法庭提起诉讼。这些案例显示,小额法庭正成为一种迫使大型科技公司回应用户诉求的非常规途径。

核心问题:客服缺失与维权困境

Meta(Facebook和Instagram的母公司)缺乏足够的人工客服来处理海量的账户问题。其官方帮助页面提供的自动化工具常常无效,甚至指向死胡同。尽管Meta近期推出了每月14.99美元的“Meta Verified”订阅服务以提供人工支持,但其在事后恢复被黑账户方面的效果并不稳定。

绝望的用户尝试了各种“方法”,例如求助于州总检察长办公室(但相关投诉已多到令各州不堪重负,甚至致信Meta要求整改)、雇佣黑客,甚至购买Oculus设备以获得专属支持(该方法据称已失效)。在此背景下,向小额法庭提起诉讼的策略在Reddit等论坛上逐渐流行,并有法律服务网站专门发布了《如何起诉Facebook》的指南。

小额法庭的优势与成功案例

小额法庭门槛低,诉讼费用通常低于100美元,流程简化(无证据开示、无庭前会议),庭审简短,因此对普通用户具有吸引力。法官往往也对大公司的客服困境感同身受。

根据报道采访的五位提起诉讼的用户中,有三人的账户至少部分恢复。一些案例还获得了经济赔偿或和解。

典型成功案例:

  • Valerie Garza(按摩店店主):因账户被黑损失生意收入,在圣迭戈小额法庭起诉。Meta未出庭,她获得缺席判决7,268.65美元赔偿。在Meta提出动议并试图以服务条款中“最高100美元责任”为由抗辩后,第二次庭审Meta再次缺席,法官维持原判。Meta最终全额支付。该过程耗时一年多。
  • Ray Palena:账户被黑后,被用于在Facebook Marketplace进行诈骗。他飞往加州Meta总部所在地圣马特奥县起诉。在庭审前半小时,他收到了等待已久的密码重置链接,账户得以恢复。虽然Meta未出庭,但此案促使问题得到解决。

面临的挑战与障碍

尽管如此,诉讼过程仍布满荆棘:

  1. 管辖权混乱:Meta服务条款通常指定诉讼应在加州圣马特奥县进行,但条款语言存在矛盾,导致用户困惑。一些用户在其他州起诉也获得了成功。
  2. 法律程序复杂:不同辖区的规则各异,首次诉讼者容易犯错。例如,Shaun Freeman因未能及时完成法律文书送达而导致案件被驳回。
  3. 公司法律资源压制:Meta会动用强大的法律团队(包括外部律所)应对此类诉讼。用户Ron Gaul的案件被Meta律师移至地区法院,最终因无法应对法律程序而撤诉。用户Ryan表示,有法律训练的对手让自诉人处于劣势。

Meta的应对策略与态度

Meta对这些小额索赔案件相当重视,并拥有一套应对流程:

  • 设有专门的“小额索赔案件”联系邮箱。
  • 法律代表通常在庭审前联系原告,尝试和解(如帮助恢复账户)以换取撤诉。
  • 即使用户获得缺席判决,Meta也会通过法律程序试图推翻判决。
  • 公司不愿看到大量针对其的判决出现在公共记录中,因此会认真对待。

然而,这种重视并未转化为客服体系的改善。对于依赖平台谋生的企业主或拥有重要社交联系的个人用户而言,账户丧失可能意味着严重的经济损失或声誉损害。

Meta的官方回应

在声明中,Meta承认账户恢复过程可能令人沮丧。公司表示在账户安全系统和用户教育方面投入巨大,并持续改进检测、执法和支持系统。但该回应未针对报道中的具体案例和客服缺失问题提出直接解决方案。

综上所述,Meta客服体系的不足迫使用户诉诸小额法庭这一非常规渠道,虽在个别案例中奏效,但过程充满不确定性、成本高昂,且再次暴露了数字平台经济中用户权益保障的脆弱性。

6. Innovation heroes are a sign of a dysfunctional organization (steveblank.substack.com)

文章摘要:创新英雄主义揭示了组织系统的缺陷

作者通过参加一个政府机构的“创新英雄”颁奖典礼,深刻反思了大型组织中创新的本质问题。一位女企业家克服重重官僚障碍(预算、日程、职责划分等),历时10个月才将一个简单的数据自动化流程部署成功。这个本可在初创公司三周完成的任务,被作为“英勇事迹”表彰。

核心观点

  1. “创新英雄”的表彰掩盖了系统性问题:奖励个人冲破系统阻力的行为,实际上是在赞美和延续一个功能失调、阻碍创新的组织体系。领导层从未反思为何创新需要“英勇”才能实现,也未着手修复系统。
  2. 根本原因分析:通过“五个为什么”方法深挖,暴露出三个核心缺陷:
    • 现有流程仅为执行重复性、预设任务而设计,无法容纳非标准创新工作。
    • 组织缺乏为创新活动设立的专项资源或平行机构。
    • 组织文化抑制实验,并惩罚探索过程中必然出现的失败。
  3. 缺乏“创新理念”是病根:所有这些问题的根源在于组织缺少一套创新理念。这导致组织设计上根本没有为计划外的创新活动预留永久空间,并且缺乏将创意演示快速、规模化地转化为实际部署的机制。
  4. 和平与危机时期的不同需求:在组织处于优势地位时,强调流程和维持现状的“流程管理者”占主导;而在危机或颠覆时期,迫切需要能够引导创意通过创新管道的“创新领导者”。
  5. 解决方案:构建双元组织能力:成功的组织必须同时具备创新与执行的能力,并形成相互尊重的协同关系。这需要一套清晰的创新理念作为整体战略和操作手册,其核心组成部分包括:
    • 创新管道:一个从创意到部署的端到端战略化流程。
    • 创新领导者的明确角色
    • 所有努力聚焦于快速部署新能力

结论: “创新英雄主义”是组织缺乏系统性创新理念的直接症状。所有大型组织(无论是政府还是企业)都必须建立正式的创新理念,否则将面临被拥有更敏捷创新流程的竞争对手超越的风险。

7. Spending 3 months investigating a 7-year old bug and fixing it in 1 line of code (lemmy.world)
8. Donald Sutherland has died (www.bbc.com)

加拿大演员唐纳德·萨瑟兰(Donald Sutherland)因长期患病去世,享年88岁。他的儿子、演员基弗·萨瑟兰在声明中表示,父亲是“电影史上最重要的演员之一”,一生从事所爱的事业,无怨无悔。

萨瑟兰的演艺生涯始于英国,早期以战争片成名,如《十二金刚》(1967)、《铁血军魂》和《陆军野战医院》(均1970)。他饰演的角色多样,包括《柳巷芳草》中的侦探、《普通人》中自杀少年的父亲,以及《饥饿游戏》系列中残暴的斯诺总统。尽管多次与奥斯卡擦肩而过,他于2017年获得奥斯卡终身成就奖。

他积极投身政治活动,曾参与反越战抗议,并将社会政治观点融入表演。他告诉BBC,希望通过《饥饿游戏》唤醒年轻观众对现实的关注。他的回忆录《虚构,但仍真实》将于2024年11月出版。

消息公布后,众多合作演员和业界人士表达哀悼。罗·霍华德称其为“最睿智、最引人入胜的演员之一”;简·方达称他为“才华横溢的演员”;海伦·米伦赞他拥有“敏锐的头脑和深沉的情感”。加拿大总理特鲁多和美国总统拜登也分别致哀,称他是“伟大的加拿大艺术家”和“独一无二的演员”。

9. OpenAI Acquires Rockset (openai.com)

OpenAI收购Rockset

OpenAI已完成对实时分析数据库公司Rockset的收购。Rockset以卓越的数据索引与查询能力著称,能帮助用户、开发者和企业更好地利用自身数据,在使用AI产品和构建智能应用时实时获取信息。

此次收购后,OpenAI将整合Rockset的技术以增强其产品的检索基础设施。Rockset的优秀团队也将加入OpenAI。

OpenAI首席运营官Brad Lightcap表示,Rockset的基础设施能帮助企业将数据转化为可操作的智能,他们期待通过整合为OpenAI客户带来这些优势。Rockset首席执行官Venkat Venkataramani称,加入OpenAI是为了通过强大的检索能力赋能用户、企业和开发者,充分挖掘数据价值。

OpenAI将后续公布更多整合进展。

10. Reining in America's $3.3T tax-exempt economy (taxfoundation.org)

核心观点:美国庞大的免税经济亟需改革

文章指出,美国价值3.3万亿美元的免税经济规模巨大,占GDP的15%,涵盖超过180万组织,管理着超过8万亿美元的资产。然而,这个体系正面临挑战,许多免税组织并非纯粹的慈善机构,而是大型的商业实体,与营利性公司形成不公平竞争。

免税组织现状与问题

  • 规模与构成:2019年,免税组织总收入约3.3万亿美元,净利润2380亿美元。最大的类别是501(c)(3)组织,收入占75%。
  • 收入来源扭曲:501(c)(3)组织的主要收入来源是“项目服务收入”(如医疗保险支付、学费、门票等),占71%;慈善捐赠仅占12%。
  • 大型商业实体:许多免税组织本质上是企业。例如,最大的非营利组织凯撒医疗集团2019年收入超1100亿美元;有325家501(c)(3)组织收入超过10亿美元,几乎都是医院和大学。
  • 不平等竞争:医院、健康保险、大学、信用合作社、甚至赌场和高尔夫俱乐部等都享受免税地位,直接与纳税的营利性企业竞争。

历史根源与规则失效

  • 历史遗产:现行免税规则源于19世纪末的社会惯例(如1894年和1909年的税法),缺乏统一原则。
  • UBIT形同虚设:1950年为防止不公平竞争设立的“非相关商业所得税”规则效果甚微。它定义宽泛且有诸多豁免,平均每年仅产生约5.86亿美元税收,对非营利组织的商业行为几乎没有约束力。

改革建议

为区分真正的慈善组织与商业性非营利实体,并创造公平竞争环境,文章提出三项改革:

  1. 严格定义“公共慈善机构”:将获得认定所需的慈善捐赠收入比例从30%提高到80%,且仅限来自个人捐赠和慈善基金会的资金。
  2. 废除UBIT,对商业收入征税:取消现行规则,对所有非营利组织的净项目服务收入(即扣除相关费用后的商业收入)按21%的公司税率征税。
  3. 考虑对投资收入征税:目前非营利组织的投资收入大多免税,这使其成为“免税对冲基金”。建议对其按公司税率征税,以实现税收中性。

改革预期效果

根据2019年数据估算,实施这些改革后:

  • 对501(c)(3)组织的净项目服务收入征税可带来约190亿美元税收。
  • 对其他501(c)组织的净收入征税可带来约180亿美元税收。
  • 总计每年可新增税收近390亿美元,同时能有效保护真正慈善组织的收入来源。

结论:当前的免税规则早已过时,庇护了大型商业企业却损害了税收公平。进行原则性改革,既能增加财政收入,也能为非营利部门建立一个更清晰、公平的基础。

11. Show HN: Eidos – Offline alternative to Notion (github.com)

Eidos:Notion 的离线替代方案

Eidos 是一个可扩展的个人数据管理框架,旨在将 SQLite 转变为一个人人可用的个人口袋数据库。它目前仍在积极开发中,不建议用于生产环境。

主要功能:

  • 个人数据管理:提供类 Notion 的文档和数据库功能,用于组织、存储和管理个人数据。
  • 离线支持:所有操作均在本地机器运行,无需网络连接,数据本地存储以实现极快性能。
  • AI 功能:深度集成大语言模型,支持在应用内进行翻译、摘要及数据交互。
  • 高度可扩展:提供简单而强大的扩展系统。可手动或通过 AI 生成扩展代码,使软件灵活可塑,支持构建和使用工具。
    • Block:用于自定义数据显示和交互的 UI 组件。
    • Script:使用 TypeScript/JavaScript/Python 创建强大的数据处理逻辑。
  • 开放格式:原始数据完全开放,所有内容均存储在 SQLite 中。

使用方式: 可从官方网站 https://eidos.space/download 下载应用。

开发指南:

  1. 克隆仓库:git clone https://github.com/mayneyao/eidos.git
  2. 安装依赖:运行 pnpm install
  3. 安装 SQLite 扩展:首次运行 pnpm install:sqlite-ext
  4. 启动开发:运行 pnpm dev:desktop 以启动桌面应用。

更多信息: 详细文档请访问 https://docs.eidos.space/

许可证: 本项目采用 AGPL 许可证。为促进集成和生态发展,特定包采用 MIT 许可证:

  • @eidos.space/core:MIT
  • @eidos.space/react:MIT 此外,extensions/ 目录下的所有扩展均采用 MIT 许可证。
13. How babies and young children learn to understand language (lithub.com)

婴儿与幼儿如何学习理解语言

作者:Steven Mithen

本文探讨了婴儿和幼儿的语言习得过程,重点关注两个核心问题:语言习得是依靠专门的心理过程,还是通用的学习过程?以及我们能否通过观察现代的语言习得来洞察语言的进化?

语言习得的挑战

语言学习者面临的核心挑战是:口语中单词是连续不断地发出的,没有像书写时那样的空格分隔。然而,我们却能毫不费力地将听到的连续声音流“切分”成一个个单词。这依赖于我们对单词、语法以及韵律(如重音、停顿)的内隐知识。婴儿一出生便对这种挑战毫无准备,但他们学习的速度惊人。

婴儿的早期语言能力与学习进程

  • 胎儿期准备:婴儿在子宫内就开始接收外部语音,这为出生后处理语言做了准备。
  • 出生后极早期:仅出生3天的婴儿就能辨别并更偏好照顾者所使用语言的节奏
  • 1岁左右:婴儿能说出第一个单词。
  • 2岁左右:开始将单词组合成符合母语语序的简单句子。
  • 4岁左右:大多数儿童已掌握超过1000个单词、词汇组合规则以及如何通过语调改变语义。

这种快速且无需正式教学的语言习得过程,其机制是语言学研究的重大课题。

关键机制:统计学习

婴儿如何从连续的声音流中发现离散的单词?一个突破性的发现来自1996年Jenny Saffran等人的研究。他们提出了**“统计学习”** 的机制。

  • 实验设计:研究者向8个月大的婴儿播放由三个音节组成的、无意义的“单词”(如bupada)组成的连续声音流,中间没有任何停顿或语调变化作为提示。
  • 核心发现:婴儿能够利用音节间的转移概率来识别单词。在连续的声音流中,构成一个“单词”的音节序列总是固定连续出现(转移概率为1.0),而不同“单词”之间的音节组合则是随机的(转移概率较低)。
  • 实验证据:仅仅聆听两分钟后,婴儿就能区分出经常连续出现的“单词”序列和随机组合的“非单词”序列(表现为对非单词的聆听时间更长),证明他们能够进行无意识的统计计算,以此作为切分单词的重要线索。

总结

婴儿通过胎儿期对语言节奏的适应,出生后利用韵律线索,并依靠强大的统计学习能力(分析声音序列中的规律性)来破解连续语音流,从而逐步识别单词、掌握其意义和组合规则,最终在幼儿期实现语言的快速习得。这一过程展示了人类非凡的学习能力。

14. MeshAnything – converts 3D representations into efficient 3D meshes (buaacyw.github.io)

MeshAnything 是一项旨在将任意3D表示转换为高效、高质量3D网格的技术。它通过模仿人类艺术家的工作方式,生成具有优化拓扑结构的“艺术家创建网格”,能够无缝应用于3D行业的实际工作流程。

研究背景与问题

近年来,通过3D重建和生成技术创建的资产,其质量已接近手工制作的水平。然而,这些资产在实际的3D工业应用(如游戏、影视)中必须被转换为网格格式。现有的网格提取方法存在明显缺陷:它们依赖于密集的面片,忽略了几何特征,导致生成的网格面数庞大、存储和渲染效率低下,且需要复杂的后期处理,最终质量远不及人类艺术家手工创建的网格。

核心方法与创新

MeshAnything 将网格提取任务重新定义为一个条件生成问题。其目标是根据给定的3D形状,生成与之匹配的高效网格。该模型的核心架构包含两个部分:

  1. VQ-VAE:用于学习一个“网格词汇表”,将网格的几何结构量化为离散的标记。
  2. 形状条件化的仅解码器 Transformer:这是一个自回归模型。它在给定的网格词汇表上进行训练,并以从输入3D资产中采样得到的点云特征作为条件,逐步预测网格标记序列,从而生成完整的网格。

这种方法的主要创新在于,它避免了直接学习复杂的3D形状分布,而是专注于学习如何利用高效的拓扑结构来构建形状。与直接生成网格的方法(如 MeshGPT)相比,这显著降低了训练难度,并提升了模型的可扩展性。

主要成果与优势

实验结果表明,MeshAnything 生成的网格在几何精度上与现有方法相当,但其核心优势体现在:

  • 极高的效率:生成的网格面数比以往方法减少数百倍。这极大地提升了存储效率、渲染速度和物理模拟性能
  • 可控的拓扑质量:生成的网格具有更优的拓扑结构,甚至在某些情况下优于提供的“真实值”参考网格。模型并非简单地过拟合,而是学会了使用高效拓扑来构建形状。
  • 广泛的兼容性:该方法可以轻松集成到各种3D资产生产流水线中,包括3D重建和3D生成,将其输出直接转换为适用于工业应用的高质量网格。

总之,MeshAnything 为弥合3D生成技术与实际工业应用之间的鸿沟提供了一个有效的解决方案,通过生成高效的“艺术家创建网格”,显著提升了3D资产的实用性。

15. From Infocom to 80 Days: An oral history of text games and interactive fiction (arstechnica.com)

互动小说:从Infocom到《80天》的口述史摘要

互动小说(Interactive Fiction,简称IF)是一种以文字为核心的艺术形式,其历史可追溯至1970年代的《巨洞探险》。这篇文章通过对多位关键人物(包括开发者、作者和社区建设者)的采访,回顾了IF从诞生到复兴的历程。

起源与黄金时代:

  • IF的开端是1976年的《巨洞探险》,它基于洞穴探险经历,玩家通过输入简单的双词指令(动词+名词)来探索和解谜。
  • 早期计算机的普及为IF提供了传播土壤。1979年成立的Infocom公司凭借《魔域》等作品将IF推向一个黄金时代。Infocom不仅作品出色,其独特的包装和与玩家的互动方式也令人难忘,但该公司在80年代中后期被收购后迅速衰落。

社区的形成与技术复兴:

  • Infocom的消亡并未终结IF。爱好者们在90年代的Usenet新闻组(如rec.arts.int-fiction)上形成了活跃的社区,进行讨论、技术分享和创作。
  • 核心开发者Graham Nelson为了更自由地创作,逆向工程了Infocom的技术,并开发了Inform编程语言及其经典作品《诅咒》。
  • Andrew Plotkin等开发者进一步优化技术,创建了Glulx虚拟机以突破早期格式限制。
  • 社区通过两项重要举措得以巩固:一是IFComp年度短篇竞赛(始于1995年),它鼓励创新并成为IF状态的年度缩影;二是ifMUD,一个提供实时交流的多用户空间。

技术的多元化与平民化:

  • 21世纪初,IF创作工具发生“地震般”的转变,重心从传统文字解析器游戏转向更多元的选择式叙事。
  • Twine(2009年推出)采用可视化脚本,无需编程知识,并将作品发布为网页,极大降低了创作门槛,尤其在独立游戏和酷儿创作者中引发“爆炸式”增长。
  • Inkle Studios开发了Ink语言,用于创作像《80天》这样的商业化叙事游戏。
  • Inform 7(2006年)采用自然语言编程,进一步简化了传统解析器类IF的创作。

核心精神与未来:

  • IF社区始终贯穿着开源免费的精神,几乎所有主要工具从诞生起都免费提供,这促进了技术的普及和创新。
  • 互动小说技术基金会(IFTF) 的成立,为IFComp、Twine等关键项目提供了非营利性的支持与保障。
  • 为何IF能持久不衰?受访者的共识是:文字与语言的力量是人类体验的核心,而IF的低门槛、高创造性允许个人开发者利用免费工具实现完整的艺术构想。正如Nelson所言,IF是一种“永远的实验性写作类型”,它已从怀旧的复古游戏,演变为广泛影响游戏叙事设计、移动端故事讲述乃至AAA游戏原型开发的活态传统。
16. Notes on Tajikistan (mattlakeman.org)

塔吉克斯坦游记概要

基本概况

  • 人口与地理:2022年人口约960万,面积55,251平方英里(略大于希腊或纽约州),境内50%的土地海拔超过3000米,地形以山地为主。
  • 经济:人均GDP名义值约1,050美元(PPP约5,800美元),属于全球最贫困国家之列。经济依赖金、铝、煤等矿产开采(多由中国投资),以及棉花种植。侨汇曾占GDP近一半。
  • 政治:1991年独立后经历内战,现任总统埃莫马利·拉赫蒙自1994年执政至今,建立家族式威权体制,被视为高度腐败(透明国际排名第162位)。宗教政策严厉压制伊斯兰教活动,包括禁留长须、限制礼拜等。
  • 文化:波斯语系(塔吉克语),96%人口为逊尼派穆斯林。苏联遗产与伊斯兰传统混合,社会氛围世俗化,首都女性多戴头巾但无全面罩袍。

首都杜尚别

  • 城市景观:新旧交织,近年因中国资金大规模现代化,兴建高楼广场,但人口仅约100万,街道空旷整洁。严格清洁法规(禁乱丢垃圾、汽车需洁净)。
  • 地标:世界第三高旗杆(165米)、独立纪念碑(150米高)、国家博物馆(略去内战历史)。总统府仿美国白宫,曾拆除犹太教堂建造。
  • 生活:酒精饮品常见,KFC等西方快餐受年轻人欢迎,传统巴扎部分关闭。

帕米尔公路之旅

  • 景观:穿越荒凉壮丽的山区,毗邻阿富汗、中国、巴基斯坦边境。部分路段由中国施工队维护,通行艰难。
  • 边境见闻:阿富汗边境有周期性集市;中塔边境界石见证中国影响力。途经雪山、草原,可见雪豹、盘羊等野生动物。
  • 穿越塔吉边境:通过克孜勒山口(海拔约4000米)前往吉尔吉斯斯坦,因暴雪、通信中断、军警检查等,经历长达两天的艰难过境。

中国影响与经济角色

  • 地缘政治:中国视塔为稳定新疆、抵御伊斯兰极端势力的屏障。2011年塔向中国割让土地,换取中国放弃历史领土主张。
  • 投资与债务:中国是最大外资来源(2021年占62%),持有超过20亿美元债务。资金用于基础设施(公路、隧道)、矿产开发(黄金增产显著)。
  • 军事存在:2016年中国在塔设立军事基地,2021年建立特种部队监控帕米尔地区。

社会风貌与人民

  • 待客热情:当地人对美国人尤为友好,得知作者国籍后常表达好奇与欢迎。
  • 家庭结构:长子有赡养父母的终身义务;侨汇是许多家庭重要收入来源。
  • 文化观察:男性流行“披头士式”发型;妇女头巾佩戴率城乡差异大(首都约50%,乡村90%)。
  • 治安与法律:犯罪处理常由家族内部调解;警察对外国人相对克制,但普遍索贿。

不实传言验证

  1. 卍字符起源于塔:政府曾推行“雅利安文明”概念,但证据不足。
  2. 泰姬陵“Taj”指塔吉克人:无历史依据,可能源自波斯语“王冠”。
  3. 旅游热门目的地:目前游客稀少(年收入约1亿美元),但自然景观具潜力,或成“小众宝石”。
  4. 结识作者使人风流:无关联,属玩笑话。

杂记与趣闻

  • 语言:杜尚别以俄语为主,乡村多用塔吉克语。
  • 传统体育:马背叼羊赛(Buzkashi)在部分地区仍存在。
  • 历史遗迹:苏联时代列宁雕像、胡罗格等小城山顶巨型城市名标牌。
  • 水电工程:努列克大坝曾为世界最高,罗贡大坝在建中。
  • 交通危险:安佐布隧道因通风差、积水深,被称为“恐惧隧道”。

总结:塔吉克斯坦是一个贫困但景观壮丽的国家,政治家族垄断经济,中国影响力深入各领域,社会世俗化但宗教控制严格,人民热情好客,旅行体验独特而艰苦。

17. Test firing of a 3D-printed rocket engine designed through computational model (leap71.com)

迪拜,2024年6月18日 — 位于迪拜的人工智能工程公司LEAP 71宣布,其完全通过大型计算工程模型Noyron自主设计、无需人工干预的液态火箭发动机,已成功完成点火测试。该发动机由铜材3D打印制成,并在英国的火箭测试台成功进行了热火测试。

核心成就与突破

  • 全自主设计:发动机由Noyron模型完全自主生成,未使用任何CAD软件或人工设计介入。
  • 极速设计周期:从最终规格确定到完成制造仅耗时不到两周,而传统工程流程通常需要数月甚至数年。新设计迭代仅需几分钟。
  • 首次尝试即成功:发动机在首次热火测试中即正常运行,达到了预期性能。

发动机技术细节

  • 推力与性能:发动机产生5 kN(500公斤/1124磅力)推力,相当于20,000马力。
  • 推进剂:使用低温液氧(LOX)和煤油,这是一种被SpaceX猎鹰9号等先进火箭系统使用的组合。
  • 材料与制造:燃烧室由铜合金(CuCrZr)通过金属3D打印制成,采用再生冷却技术。冷却通道横截面可薄至0.8毫米。
  • 冷却与喷注:煤油通过环绕燃烧室的薄冷却通道流动以防止熔毁(燃烧室内温度约3000ºC,而表面温度因主动冷却保持在250ºC以下)。推进剂通过先进的同轴旋涡喷注器注入,并采用薄膜冷却作为补充。

测试过程

测试于2024年6月14日在英国西科特(Airborne Engineering)进行。首先以较低的氧化剂与燃料比(1.8)进行了3.5秒的初始点火,随后以标称比例(2.3)完成了持续12秒的长时间燃烧测试。发动机性能符合预期,达到了稳定状态,表明其具备长时间运行的能力。

后续分析与合作伙伴

测试后发动机在英国谢菲尔德大学拆解检查,确认完好无损。初步数据分析发现,因3D打印表面粗糙度,冷却通道的实际压降高于模型预测。团队将对现有发动机进行后处理,并已更新Noyron模型以改进未来设计。该项目与德国的AMCM(金属3D打印)、谢菲尔德大学及Airborne Engineering等机构合作完成。

公司背景与愿景

LEAP 71由航空航天工程师Josefine Lissner和连续创业者Lin Kayser创立,致力于通过计算工程领域推动工程进步。公司已开源部分技术栈,包括PicoGK几何内核。此次测试的发动机是阿联酋首个液态燃料火箭发动机,旨在展示Noyron模型的能力。LEAP 71计划利用测试数据进一步推进Noyron,并与美、欧、亚的领先航空航天公司合作,推动由此产生的火箭发动机商业化。

18. Memory sealing for the GNU C Library (lwn.net)

GNU C库的内存密封技术

mseal()系统调用可防止进程地址空间被修改,将内存区域"密封"。该调用受OpenBSD的mimmutable()启发,已计划合入Linux 6.10内核,旨在增强安全性,例如保护Chrome浏览器等应用免受攻击。

Adhemerval Zanella提交的补丁系列为glibc添加了mseal()支持。其封装接口与内核一致:

int mseal(void *address, size_t length, unsigned long flags);

关键扩展:glibc利用内部知识自动密封特定内存区域,包括:

  • 进程二进制代码(静态/动态)
  • 所有加载的共享库(包括只读段)
  • 预加载库
  • 内核的vDSO区域
  • 通过dlopen()RTLD_NODELETE标志加载的库
  • 审计模块及其依赖

配置控制:通过glibc调整项glibc.rtld.seal管理:

  • 值0:禁用自动密封
  • 值1(默认):启用自动密封,忽略失败
  • 值2:启用自动密封,失败则终止进程

现状:该功能处于早期阶段。因mseal()尚未正式发布,预计可能随glibc 2.41版本(而非紧接6.10内核的2.40)引入。最终将默认增强进程地址空间保护。

19. Show HN: Local voice assistant using Ollama, transformers and Coqui TTS toolkit (github.com)

项目概述:June 是一个本地语音助手,结合了 Ollama(大语言模型)、Hugging Face Transformers(语音识别)和 Coqui TTS Toolkit(语音合成)。它注重隐私,所有处理均在本地完成,无需将数据发送至外部服务器。

核心功能:支持四种交互模式:

  1. 文本输入/输出:输入文本,获取文本响应。
  2. 语音输入/文本输出:通过麦克风输入语音,获取文本响应。
  3. 文本输入/音频输出:输入文本,获取文本及合成的语音响应。
  4. 语音输入/音频输出(默认):通过麦克风输入语音,获取文本及合成的语音响应。

安装要求:需要预先安装 Ollama 和 Python 3.10+。根据不同操作系统(GNU/Linux、macOS、Windows),可能需要额外安装如 PortAudio 或 Microsoft Visual C++ 等开发包。可通过 pip install 从 GitHub 仓库直接安装或克隆后本地安装。

使用方法:首先通过 Ollama 拉取默认语言模型(如 llama3.1:8b-instruct-q4_0),然后直接运行程序。程序支持通过 JSON 配置文件进行自定义。

配置定制:通过 JSON 配置文件可部分覆盖默认配置。配置文件主要分为三个部分:

  • llm:配置语言模型,包括设备、是否启用聊天历史、模型名称和系统提示。
  • stt:配置语音转文字模型,包括设备、生成参数和 Hugging Face 模型名称。
  • tts:配置文字转语音模型,包括设备、生成参数和 Coqui TTS 模型名称。 用户可以禁用 stttts 功能以实现纯文本交互,或仅更改特定模型的运行设备。

常见问题解答

  • 语音输入:看到“Listening for sound...”提示后即可直接说话,无需唤醒词,静默3秒后系统处理输入。
  • 声音克隆:支持使用 Coqui TTS Toolkit 中具备此功能的模型(如 xtts_v2),可在配置中指定一个简短音频文件作为参考音色。
  • 远程 Ollama:支持连接远程运行的 Ollama 实例,只需设置 OLLAMA_HOST 环境变量为相应 URL 即可。
20. Fuzz Map (www.fuzzmap.io)

Fuzz Map 总结

概述

Fuzz Map 是一个面向 GUI 的模糊测试器。它通过代码覆盖率自动识别应用程序的不同状态,并将这些状态及其之间的转换关系构建为一个可视化的地图。其目标是生成即使不阅读代码也能理解的界面状态地图。

主要功能与特性

1. 实时编程与快速重新模糊测试

  • 支持“实时编程”模式:在修改应用代码后重新进行模糊测试,通过对比新旧地图验证修改效果。
  • 重新模糊测试通常比首次更快,因为工具会保存并重用之前的输入。输入通过事件处理器的内联声明来识别,无需手动标注即可重用。

2. 错误检测

  • 能够检测在渲染状态或处理事件时发生的错误。
  • 在可视化地图中,错误状态会以特定图标标识,将鼠标悬停在图标上可查看具体的错误信息。

3. Before/After 视图

  • 能够列出某个特定事件处理器(如 onChangeQuantity)所对应的所有不同代码路径案例。
  • 通过“前后对比”视图,开发者可以清晰地看到事件处理器在不同输入下的行为差异,有助于发现边界情况下的错误(例如将数量改为非数字字符串)。

4. 核心工作机制

  • 基于覆盖率的状态识别:通过在编译时插桩来记录分支覆盖率。每个 GUI 状态和事件都由一个“命中向量”来标识,该向量描述了程序在渲染或处理事件时执行了哪些分支。
  • 状态图与高效探索
    • 模糊测试过程中会构建一个状态图。相比完全随机的输入生成(对于具有线性结构的应用可能低效),基于状态图的方法能更高效地探索状态。
    • 工具维护一个模糊测试队列,并使用调度启发式算法(如优先处理当前状态对应的输入、随机选择或选择命中向量最小的输入)来避免陷入局部状态循环。
  • 输入重用与路径记忆:首次到达某个状态后,会记录到达该状态的最短输入序列,用于后续快速导航。输入路径通过事件处理器的声明来稳定标识,支持通过 data-fuzzmap-key 属性进行更精确的识别。
  • 分支覆盖率插桩:对代码中的分支操作(如三元运算符、&&||?? 等)进行编译时转换,插入 hit() 函数调用来记录执行路径。这对于惯用短路求值的 React/JSX 代码尤为重要。
  • 地图图生成与简化
    • 由于状态图可能非常庞大(命中向量的组合爆炸),在渲染前会将其简化为一个“地图图”。
    • 主要简化手段包括 钳制(将命中向量的每个分量限制在最大值1)和 分支折叠(将某些分支目标视为相同)。
    • 简化是实现可视化地图的关键,它过滤了指数级增长的不重要状态。

局限性与未来工作

  • 当前为研究原型(alpha 版),运行完全在浏览器端,无数据上传。
  • 已知局限:不生成复杂输入值;目前不处理异步事件(如 setTimeout, fetch);仅处理受控组件;未处理某些特殊分支操作。
  • 未来方向:计划集成成熟的模糊器用于生成文本等输入值;扩展事件模型以支持异步 API;改进地图简化算法以进行更全局的分析;支持高亮显示与每个案例相关的具体代码行以辅助调试。

特别致谢

文中特别感谢了 Joey Liaw 提出模糊测试 GUI 的想法,以及 elkjs 和 ELK 布局库的作者,其库为地图图的布局生成提供了关键支持。

21. The plan-execute pattern (mmapped.blog)

计划-执行模式

背景与动机

作者最初对设计模式持矛盾态度,认为《设计模式》中的多数模式与其日常开发无关。他评估良好设计模式的标准是其跨领域适用性,即该模式应在软件工程之外的领域也能发挥作用,甚至能应用于日常生活。本文介绍了一种鲜有讨论但被数十亿人每日依赖的通用模式——计划-执行模式

模式定义

在软件工程中,复杂算法通常存在多条执行路径。传统的“直接执行”方式将决策与执行交织在一起,使过程不可观测。计划-执行模式则将过程分为两个阶段:

  1. 计划阶段:将输入转化为一个数据结构(即计划),该结构封装了算法应做出的所有决策。
  2. 执行阶段:根据该计划执行具体操作。

这种分离使得决策部分可以被独立、全面地测试,且计划作为数据结构便于人类检查系统意图而不引发副作用。

执行阶段的演进

如果执行环境可预测,执行阶段可以简单地遍历计划数据结构并运行预定义步骤。但现实中常存在不确定性(如并发、失败),此时可将执行阶段进一步拆分为状态机驱动循环。驱动循环将外部事件输入状态机,状态机根据当前状态和事件(计划作为初始状态)输出后续动作。这种方法将状态机与复杂的I/O细节解耦,便于进行详尽的测试。

构建系统示例

文章以构建系统为例展示该模式的具体应用:

  • 输入:构建图、目标产物、构建缓存。
  • 计划:一个拓扑排序的任务列表(BuildPlan)。plan函数负责生成该计划。
  • 执行
    • 简单顺序执行run_build_sequentially函数顺序执行计划中的任务。
    • 并行执行:引入ExecutionState状态机来跟踪任务状态(未开始、进行中),通过startedcompleted方法调整计划,并输出Action(调度新任务或结束)。run_build函数作为驱动循环,与操作系统交互,向状态机输入事件(如任务完成)并执行其发出的动作(如启动新任务)。

这种设计将难题分解,使算法密集型部分(规划和执行控制)不涉及I/O,易于测试。计划函数还有助于实现--dry-run(试运行)功能。

相关实例与模式

  • 数据库查询计划器:SQL查询可能有多种执行方式,查询计划展示了数据库引擎选择的路径,是调优性能的关键。
  • 解释器模式:是计划-执行模式的特例,计划是表达意图的语法树,执行阶段是对其的解释。
  • Sans-i/o 协议实现:为从I/O驱动循环中提取执行状态机提供了蓝图。
  • 函数式核心,命令式外壳:这种实践可追溯至函数式编程传统。
  • 所有程序:从宏观看,所有程序都是计划。程序员预先做出所有决策并编码为字节序列,由计算机负责执行。

结论

文章对比了实现复杂算法的两种方法:将决策与行动交织的“直接执行”方式,以及分离决策与行动的“计划-执行”模式。前者代码直观,但随着系统变复杂,后者通过关注点分离使得代码更易于理解和彻底测试,成为一种可行的替代方案。

22. Generating audio for video (deepmind.google)

视频到音频(V2A)技术摘要

视频生成模型正在快速发展,但许多系统只能生成无声输出。为了给生成的电影注入生命,视频到音频(V2A)技术通过结合视频像素和自然语言文本提示来生成同步的音轨,实现音视频同步生成。

技术原理

V2A系统采用基于扩散的音频生成方法,这是通过实验得出的最可扩展AI架构。系统首先将视频输入编码为压缩表示,然后扩散模型在视觉输入和文本提示的引导下,迭代地从随机噪声中生成音频。音频输出被解码为波形并与视频数据结合。训练过程中加入了AI生成的注释,包括详细声音描述和对话转录,使模型能够关联音频事件与视觉场景,并响应提示信息。

创意控制与灵活性

V2A可以为任何视频输入生成无限数量的音轨。用户可以通过“正向提示”引导生成所需声音,或通过“负向提示”避免不想要的声音,从而提供灵活的创意控制,便于快速实验和选择最佳音轨。

应用与配对

V2A可以与视频生成模型(如Veo)配对,为生成的视频片段添加音乐、音效或对话。它也适用于传统素材,如档案材料、无声电影等,扩大了创意机会。

研究进展与挑战

与现有视频到音频解决方案不同,V2A能理解原始像素,文本提示是可选的,并且不需要手动对齐音频与视频。然而,仍存在限制:音频质量依赖于视频质量,视频中的失真或伪影可能导致音频质量下降;在语音视频中,唇同步可能不匹配,因为视频生成模型可能不基于转录生成口部动作,导致不自然的唇部同步。

安全与透明

研究团队致力于负责任地开发和部署AI技术,收集来自创作者和电影制作者的反馈。为防范潜在滥用,已将SynthID工具包集成到研究中,为所有AI生成内容添加水印。在向公众开放访问前,V2A技术将经过严格的安全评估和测试。

致谢

研究贡献者包括Ankush Gupta、Nick Pezzotti等人,以及Google DeepMind团队和合作伙伴的支持。特别感谢Aäron van den Oord、Andrew Zisserman等人的指导。

23. Show HN: Lady Deirdre 2 – Rust Framework for Compilers and LSP Servers (github.com)

Lady Deirdre 2 概述

Lady Deirdre 是一个用于构建增量式编程语言编译器、解释器和源代码分析器的 Rust 框架。它能帮助开发者创建一种混合程序,既能充当语言的编译器或解释器,又能作为代码编辑器语言扩展的语言服务器

该框架提供了创建语言文件内存表示的必要组件,包括源代码、词法和语法,以及整个代码库的语义模型。这些组件专门设计用于在代码库持续实时演变时,保持内存表示与文件变更同步。

核心特性

  1. 解析器生成器:使用派生宏在枚举类型上指定语言的词法和语法,枚举变体代表带解析规则的词素和节点。
  2. 手写解析器:API 支持开发具有无限前瞻能力的手写递归下降解析器,并能与宏生成的解析器无缝集成。
  3. 错误恢复:解析器具备错误恢复能力,能从不完整的源代码构建语法树。
  4. 语义分析框架:内置的语义分析器通过引用属性管理对语法树的按需计算。
  5. 增量编译:组件能持续修补代码库结构的内存表示,以响应用户对文件文本的增量编辑。即使在大型代码库中,处理变更的速度通常也很快。
  6. 并行计算:API 专为多线程和单线程程序设计,可根据需要灵活选择。
  7. WebAssembly 兼容:此 crate 兼容 WebAssembly 目标(特别是浏览器环境)。
  8. 源代码格式化器:包含用于开发代码格式化程序的工具,能处理代码注释和空行。
  9. 带注释的代码片段:提供可配置的 API,用于向终端打印带有语法高亮和注释的源代码片段,旨在显示代码库中的语法和语义错误。
  10. 自足的 API:提供自足、可扩展且高度可配置的 API,用于开发编程语言编译器的前端部分和代码编辑器语言扩展。作为基础技术,除 Rust 标准库和宏 crate 外,无其他第三方依赖。

性能与许可

  • 性能:旨在提供适用于生产环境、具有可接受计算性能的开发基础设施。其 API 在基准测试中表现出色。
  • 许可:为源代码可用的专有软件。使用、复制或分发需同意通用许可协议条款。
  • 版权:© 2024 Ilya Lakhin。保留所有权利。

相关链接

  • 源代码、主 Crate、API 文档、用户指南、示例及许可协议详情可通过提供的链接访问。
24. A buffer overflow in the XNU kernel (jprx.io)

CVE-2024-27815:XNU内核中的缓冲区溢出漏洞

漏洞概述

  • 漏洞编号:CVE-2024-27815(代号 TURPENTINE)
  • 漏洞类型:缓冲区溢出
  • 影响组件:XNU 内核的 sbconcat_mbufs 函数
  • 影响版本:受影响内核版本为 xnu-10002.1.13(macOS 14.0/iOS 17.0)至修复前。在启用 CONFIG_MBUF_MCACHE 配置的系统上存在。
  • 修复版本:已在 xnu-10063.121.3(macOS 14.5/iOS 17.5/visionOS 1.2)中修复。
  • 攻击复杂度:无需特殊权限,仅需 socketpairbindwrite 三个系统调用即可触发。

根本原因

  • 核心问题:在 sbconcat_mbufs 函数中,将套接字地址(sockaddr)复制到 mbuf 结构体时,边界检查错误。
  • 数据结构mbuf 由固定大小的头部(m_hdr)和数据部分组成。_MSIZEmbuf 的总大小,MLEN 是数据部分的长度。
  • 配置影响:当 CONFIG_MBUF_MCACHE 启用时,_MSIZE 为 256 字节,头部大小为 32 字节,因此 MLEN(可用数据空间)为 224 字节。
  • 错误代码:原始代码正确检查 asa->sa_len > MLEN。但在 xnu-10002.1.13 中,为了“优化”,添加了 #if _MSIZE <= UINT8_MAX 条件宏。由于 sa_lenuint8_t 类型(最大 255),而 _MSIZE(256)大于 255,该条件在 CONFIG_MBUF_MCACHE 下为假,导致正确的边界检查被完全跳过
  • 溢出过程:攻击者提供长度最大为 255 的套接字地址。bcopy 函数将其复制到仅有 224 字节空间的 mbuf 数据区,导致 31 字节的溢出,覆盖相邻 mbuf 的头部。

引入漏洞的代码变更

if (asa != NULL) {
    _CASSERT(sizeof(asa->sa_len) == sizeof(__uint8_t));
#if _MSIZE <= UINT8_MAX   // 此处条件在 CONFIG_MBUF_MCACHE 下为假,导致检查被跳过
    if (asa->sa_len > MLEN) {
        return NULL;
    }
#endif
    ...
}

该宏本意可能是为了优化(当 _MSIZE 很小时避免冗余检查),但错误地使用了 _MSIZE(总大小)而非 MLEN(数据空间大小)作为判断依据。

漏洞利用与影响

  • 利用方式:通过精心构造 255 字节的套接字地址,溢出的 31 字节会精确覆盖下一个 mbuf 的头部(m_hdr),攻击者可完全控制 mh_nextmh_nextpktmh_datamh_len 等关键字段。
  • 后果:可导致内核通用保护错误(General Protection Fault)和系统崩溃。提供的概念验证代码(PoC)将覆盖的头部字段设为固定哨兵值(如 0x4141...),以引发崩溃进行演示。
  • 崩溃示例:崩溃日志显示,触发时正在执行网络驱动(如 AppleVmxnet3Ethernet)相关的 mbuf 操作函数,最终导致内核 panic。

修复方案

苹果在 xnu-10063.121.3 中修复了此问题:

if (asa != NULL) {
    _CASSERT(sizeof(asa->sa_len) == sizeof(__uint8_t));
    if (MLEN <= UINT8_MAX && asa->sa_len > MLEN) {
        return NULL;
    }
    ...
}

修复后,条件检查改为先判断 MLEN 是否小于等于 UINT8_MAX(即数据空间是否很小),然后正确比较 sa_lenMLEN。当 MLEN 始终大于 UINT8_MAX 时,编译器可优化此检查,且逻辑正确。

时间线

  1. 2023年9月26日:macOS 14.0 发布,包含首个存在该漏洞的内核版本 xnu-10002.1.13。
  2. 2024年初:研究者向苹果报告漏洞并提交 PoC 代码。
  3. 2024年4月2日:macOS 14.5 Beta 1 搭载首个包含修复的内核版本。
  4. 2024年5月13日:macOS 14.5 正式发布,公开修复。
  5. 2024年6月10日:visionOS 1.2 发布,苹果安全公告更新,涵盖该 CVE 对多个系统的影响。

安全公告与资源

  • 苹果已发布多个安全公告(HT214108 等)说明此漏洞。
  • PoC 代码文件 TURPENTINE.c 的 SHA256 哈希值为 f7160a6ad7d52f32d64b86cf3006c98a217954d80c3fc71a8f27595e227d0fa0
25. Bomb Jack display hardware (github.com)

Bomb Jack 显示硬件概述

项目起源与目标

该项目最初源于对经典Bomb Jack街机硬件显示部分电路图的复刻与模拟。目标是探索并扩展基于同期TTL逻辑芯片的复古图形硬件能力,测试其在与8位计算机(如Spectrum、Commodore 64)接口时能达到的图形处理极限。项目从最初的接口与芯片兼容V1.0版本,演进至V2.0并加入了许多新功能。

核心技术升级(相对于原始硬件)

  • 可寻址RAM:替代原始硬件中的ROM。
  • 增强的显示控制:额外的显示消隐能力。
  • 滚动功能:Tile X/Y像素滚动、64x64 Tile X/Y偏移(用于快速硬件滚动)。
  • 精灵增强:支持全屏高度精灵、精灵多路复用与堆叠(可实现超过8色)。
  • 背景特效:新增“mode7”背景模式,支持每像素的仿射变换(类似超级任天堂);支持可快速更新的背景颜色选择(用于等离子效果)。
  • 调色板:采用15位颜色和16x16调色板条目。

设计理念:为何使用74系列离散逻辑?

作者有意选择74LS系列离散逻辑而非CPLD/FPGA,旨在展示和教授低层硬件工程原理。这类似于在软件中使用机器码或汇编语言,而非更高级的抽象语言。理解低层离散逻辑有助于更好地掌握更高层的FPGA设计。

硬件结构与功能模块

项目硬件由多个功能模块组成,对应不同原理图页:

  1. 精灵逻辑:包含精灵RAM访问、位置/调色板临时存储、位平面访问、32x32精灵选择、扫描线RAM缓冲及透明像素处理等。
  2. 字符屏幕RAM:与外部总线接口,负责字符数据位平面读取与像素输出。
  3. 16x16 Tile背景逻辑:根据地址选择画面,进行位平面读取和像素输出。
  4. 输出像素管道与调色板查找:处理来自背景、字符和精灵的像素透明测试、调色板RAM查找及数模转换(电阻阶梯)。
  5. Mode7计算与像素逻辑:实现仿射变换所需的寄存器地址、坐标增量计算、背景颜色透明检测及屏幕访问。
  6. 音频:具有4个声音通道,每个通道包含音量、地址、长度、速率、循环地址等寄存器。

硬件访问与内存映射

  • 原始硬件:通过Z80地址总线部分连接,需在VBLANK期间写入以避免冲突。
  • 更新后设计:通过C64用户端口进行快速并行传输,实现24位地址空间写入,避免了总线竞争。硬件通过NMI信号通知CPU垂直消隐期。
  • 内存映射:详细列出了从0x80000xFFFF的地址空间分配,包括音频寄存器、精灵寄存器、字符屏幕控制、调色板RAM、Mode7寄存器、图层优先级、精灵尺寸选择等各类控制与数据区域。

时序与光栅行调度

  • 时钟:原始设计为6MHz,仿真中可根据需要调整。
  • 光栅行计数:可见行从17到240(带垂直边界收缩时为224)。_EHSYNC每行脉冲,_EVSYNC指示帧起始。VBLANK标志可见屏幕边缘。
  • 精灵调度:每个精灵在扫描线中按16像素块处理,其寄存器读取和像素写入时序有严格安排。支持精灵时钟超频以压缩处理时间。

PCB布局与制造

  • 布局已从单一大板改为六块独立PCB板:视频生成、字符屏幕、精灵、缩放精灵、Tiles、Mode7。
  • 优势:降低了单板成本和制造难度;允许用户按需选购和组合模块(如使用三块精灵板和一块Tile板);便于定制图层顺序。
  • 板卡为六层板设计,已完成布局布线。原型板已制作完成并有文档记录。
  • 项目使用Proteus进行仿真和PCB设计,PCBWay进行制造。PCB可通过PCBWay购买。

总结

此项目不仅成功复刻并扩展了经典Bomb Jack街机的显示硬件,更是一个深入的复古电子工程教学项目。它通过低层离散逻辑实现了一套功能丰富的图形系统,包括高级滚动、缩放、Mode7特效和灵活的精灵处理,并展示了从仿真、调试到PCB制造的完整硬件开发流程。

26. How the square root of 2 became a number (www.quantamagazine.org)

古希腊人曾希望宇宙仅用整数及其比例(即有理数)描述,但边长为1的正方形对角线长度(√2)无法表示为分数,引发了数学基础的首次危机。毕达哥拉斯常被归功于首次证明这一点,但细节不详。数百年来,√2的存在性模糊不清;文艺复兴数学家处理无理数,但未明确定义。

19世纪中期,理查德·戴德金为奠定微积分基础,引入了“戴德金分割”:将有理数分成两组,一组所有数的平方小于2,另一组大于2,两组之间的空隙定义了√2。这首次严格定义了无理数,进而构建了实数系统。同时,格奥尔格·康托尔用收敛于无理值的有理数序列定义无理数,与戴德金方法等价。康托尔还发现无穷集合有不同大小,证明无理数多于有理数。

戴德金的分割是现代数学的开端,使数学家能严格证明微积分定理,并扩展了数学概念。艾米·诺特曾强调戴德金工作在代数数论中的影响。这些进展彻底改变了数系的理解,为现代数学奠定基础。

28. Tesla owners file class-action alleging repair, parts monopoly (driving.ca)
29. How does a computer/calculator compute logarithms? (zachartrand.github.io)

文章主要解释了计算机/计算器计算对数函数的数学原理,核心是利用无穷级数(特别是泰勒级数)进行近似计算,并通过对数性质优化计算过程。

  • 问题背景:计算器能快速给出精确的对数结果,但其内部计算机制(如自然对数ln)常被忽略。这涉及到微积分中的级数展开。
  • 基础级数推导
    • 几何级数 ∑(ar^n) 收敛条件(|r|<1)和求和公式 a/(1-r) 出发。
    • 利用微积分知识:ln(1+x) 等于函数 1/(1+t) 从0到x的积分。
    • 1/(1+x) 展开为几何级数 1 - x + x^2 - x^3 + ...,然后逐项积分,得到第一个用于计算ln(1+x)基本级数ln(1+x) = x - x²/2 + x³/3 - x⁴/4 + ...
    • 此级数仅在 |x| < 1 时收敛,且收敛速度慢,不实用。
  • 利用对数性质缩小输入范围
    • 对数有两条关键性质:乘法变加法 ln(a·c) = ln(a) + ln(c),以及幂次可提取 ln(a^c) = c·ln(a)
    • 通过将输入值分解为已知对数值(如ln(2))的倍数和一个接近1的小数,可将原问题转化为计算小参数的级数。例如,计算ln(15)可转化为 4·ln(2) + ln(0.9375),其中0.9375接近1,适合使用基本级数。
  • 更快收敛的优化级数
    • 为减少计算项数,文章推导了收敛更快的级数
    • 方法是将ln(1+x)ln(1-x)的级数相减,利用对数性质 ln(1+x) - ln(1-x) = ln((1+x)/(1-x))
    • 推导得到新级数:ln(u) = 2·[(u-1)/(u+1)] + (2/3)·[(u-1)/(u+1)]³ + (2/5)·[(u-1)/(u+1)]⁵ + ...
    • 该级数每项幂次增加2(仅含奇数次幂),收敛速度显著加快,计算所需项数远少于基本级数。例如,计算ln(2)到11位小数,基本级数需36项,而新级数仅需12项。
    • 这种优化后的级数正是底层C数学库中计算对数函数所采用的方法。
  • 结论:计算机/计算器正是利用此类多项式级数(配合参数范围缩减算法)来高效、精确地计算对数值的。通过换底公式,此法可扩展至任意底数的对数计算。文章分享了作者探索数学函数底层实现的乐趣与收获。
30. A Rant about Front-end Development (blog.frankmtaylor.com)

关于前端开发的吐槽摘要

本文作者是一位资深的前端开发者,对当前前端开发的现状提出了尖锐的批评。其核心观点是,许多前端开发者背离了Web的根本——内容,并过度追求复杂的技术解决方案,导致了不必要的麻烦。以下是主要论点的总结:

1. 忽视内容是根本问题

  • 作者认为,绝大多数前端开发者(包括科班出身和Bootcamp毕业生)都不关心网站内容。他们沉迷于用React等框架构建一切,却忘记了用户访问网站的目的是获取内容。
  • HTML语义化的本质就是为了理解内容。如果不理解内容,就无法编写有意义、可访问、对SEO友好的语义化HTML。许多开发者滥用<div>而忽略<header><ol>等语义标签。
  • 核心建议:开发应以内容为先,先理解设计和内容的含义,再编写代码。

2. CSS本身没有问题,是使用方式有问题

  • 开发者常抱怨CSS的全局作用域、层叠和静默失败等“问题”,但作者认为这些恰恰是CSS为解决内容样式化问题而设计的特性。
  • 真正的问题在于开发者缺乏架构和规范,导致选择器冲突、滥用!important等。开发者应建立并执行CSS规范,而不是盲目转向CSS-in-JS等方案。
  • 核心建议:停止抱怨CSS,学习并善用其设计,通过策略和规范来解决问题。

3. 服务器端渲染并非JavaScript的专利

  • 许多开发者认为服务器端渲染是Node.js引入的,但事实上PHP、Ruby、Python等语言早已具备此能力。Node.js只是提供了用JavaScript实现的便利。
  • 核心建议:正视其他技术的历史与价值,服务器端渲染不等于必须使用JavaScript。

4. JavaScript并非万能,应避免不必要的复杂化

  • 网页展示静态内容、样式、简单动画并不一定需要JavaScript。许多开发者为了使用JavaScript而凭空增加复杂性,例如用复杂的技术栈生成静态页面。
  • 作者怀念jQuery解决浏览器兼容性和操作DOM的简洁方式,并以此为例说明简单方案的价值
  • 核心建议:能用HTML/CSS解决的就不要用JavaScript;避免为了使用JavaScript而增加系统复杂度。

5. 批判CSS预处理器(如Sass)的过度功能

  • 作者认为Sass等预处理器只有变量、Mixin和颜色转换是有用的功能,而嵌套、函数、插值等特性反而带来了问题:
    • 嵌套隐藏了复杂性,使代码难以阅读和调试,并导致生成臃肿的选择器。
    • 其他特性(如循环生成类名)往往被IDE的复制粘贴功能替代,却增加了代码的维护难度和可追溯性。
  • 核心建议:预处理器不应被滥用,许多问题可以通过IDE功能或编写清晰的原生CSS来解决。

6. 警惕过度使用前端框架

  • React、Vue等框架适用于高度交互、数据驱动的应用,但被滥用于构建静态网站等场景,导致了不必要的复杂性(如构建系统、臃肿的依赖)。
  • 作者以用Gatsby(基于React)构建多语言静态网站为例,指出其因重建问题而带来的巨大麻烦。
  • 核心建议:框架不是必需品,应根据实际问题选择最简单的技术方案。

7. 拒绝盲目追求新技术

  • 作者将使用未经时间检验的新技术的人称为“Alphasshole”,将必须处理由此引发问题的人称为“Betasshole”,而承受长期后果的人是“Gamma”。
  • 新技术应在个人项目中探索,但在生产环境中应至少等待两年,让社区积累足够的问题解答和经验教训。
  • 核心建议:在工作中保持保守,采用成熟稳定的技术,避免成为“新技术小白鼠”。

总结

作者呼吁前端开发者回归简单和常识:优先考虑内容,理解并尊重工具(如CSS)的设计初衷,避免用复杂方案解决简单问题,并对新技术保持谨慎。最终目标是构建更稳定、可维护且真正服务于用户和内容的产品。

32. Ask HN: Well architected React and Node repos?
34. Bessemer Venture Partners' Anti-Portfolio (www.bvp.com)

Bessemer Venture Partners的“反向投资组合”

Bessemer Venture Partners是美国历史最悠久的风险投资公司之一,其历史可追溯至卡内基钢铁帝国。凭借悠久历史,公司获得了无数投资机会,但也因此错过了许多后来极为成功的投资。

本文展示了Bessemer的“反向投资组合”——那些他们有机会投资但最终放弃,却后来获得巨大成功的公司。错过的原因多种多样:有时是估值被认为过高,有时是对商业模式或创始人团队持怀疑态度,有时则是简单的判断失误或外部因素(如飞行延误)。这些案例成为公司的反思与激励。

主要错失案例概览:

  • Airbnb:2010年,创始人Brian Chesky提出4000万美元估值,被认为“疯狂”。Bessemer计划晚些再谈,但Airbnb增长迅猛,几个月后便以更高估值融资。2020年上市时估值达470亿美元。
  • 苹果:在上市前以6000万美元估值投资二级股票的机会被拒,合伙人认为“价格高得离谱”。
  • Atlassian:2006年发现这家澳大利亚开发工具公司,但创始人表示不想上市。2010年投资机会出现时,4亿美元估值被认为“过高”。2015年,该公司成为澳大利亚史上最大科技IPO,当初错过的股份价值超过10亿美元。
  • eBay:对收藏品在线交易平台的构想被合伙人认为“不值得考虑”。
  • Facebook:2004年,创始人Eduardo Saverin在公司活动上积极推销,被合伙人劝说“别折腾了,Friendster都快不行了”。
  • 联邦快递:令人难以置信的是,Bessemer七次错过了投资联邦快递的机会。
  • 谷歌:1999-2000年间,大学同学多次试图介绍两位斯坦福学生(拉里·佩奇和谢尔盖·布林)及其搜索引擎项目,合伙人以“如何避开车库离开这所房子”的方式婉拒。
  • 英特尔:未能与创始人鲍勃·诺伊斯就条款达成一致。
  • Intuit:创始人Scott Cook被包括Bessemer在内的多家风投拒绝,最终只能从朋友处凑得22.5万美元启动。
  • Kayak:深入调研后认为航空公司不会为平台支付高额费用——商业模式存在致命缺陷。然而酒店和Priceline后来以18亿美元收购该公司。
  • Okta:2009年,两位创始人向合伙人介绍其云访问管理理念,被认为技术过于复杂。如今Okta是行业领导者,市值超140亿美元。
  • PayPal:A轮被拒,原因包括团队稚嫩、监管难题。4年后被eBay以15亿美元收购。
  • Snapchat:2011年,合伙人因航班延误错过与创始人的会议,通过抛硬币决定放弃。SNAP于2017年成为当年最大IPO。
  • 特斯拉:2006年试驾了Roadster并支付定金,但决定不投资这家“负毛利公司”。2014年特斯拉市值突破300亿美元,该合伙人全价购买了Model X。
  • Zoom:2014年B轮被拒,因视频会议市场拥挤。后在其IPO时以90亿美元估值投资。
  • Instacart:在2013年A轮和后续融资中,因毛利率为负而犹豫。2023年IPO时估值达100亿美元。

这些案例集中体现了风险投资的挑战:即使是最有经验的投资者,也常常因估值顾虑、商业模式质疑或对创始人的误判而错过变革性公司。Bessemer坦然公开这些失误,既是对成功公司的致敬,也是对自身投资历程的诚实反思。