Firefox 20 年代码签名演变史:从手动到自动化
本文回顾了 Mozilla 在过去 20 年中 Firefox 代码签名的演变历程。最初,签名过程极其繁琐,需要人工操作,依赖于物理机器和 USB 密钥。随着技术的进步,Mozilla 逐步实现了自动化签名,从改进脚本到构建专用签名服务器,再到采用 Taskcluster 和 Autograph 服务,最终实现了高效安全的代码签名流程。如今,Firefox 的代码签名每天进行数千次,极大地提高了软件安全性。
本文回顾了 Mozilla 在过去 20 年中 Firefox 代码签名的演变历程。最初,签名过程极其繁琐,需要人工操作,依赖于物理机器和 USB 密钥。随着技术的进步,Mozilla 逐步实现了自动化签名,从改进脚本到构建专用签名服务器,再到采用 Taskcluster 和 Autograph 服务,最终实现了高效安全的代码签名流程。如今,Firefox 的代码签名每天进行数千次,极大地提高了软件安全性。
Pantograph 是一款革命性的结构化代码编辑器,它直接操作类型化的语法树,而不是像传统编辑器那样先解析文本再进行类型检查。通过引入树选择和“拉链编辑”的概念,Pantograph 简化了对现有程序的编辑,使程序员可以更轻松地进行复杂的代码修改,同时保持程序的类型安全。它巧妙地处理类型差异,并允许程序中存在一些错误,方便用户逐步调试。Pantograph 的设计具有语言通用性,开发者可以基于其框架定义新的编辑器。
资深程序员反思了多年的编程经验,总结出五种不同的编程“帽子”:船长帽(谨慎细致,适合关键系统)、流浪汉帽(快速原型,简单实用)、麦克盖弗帽(快速验证,不拘泥于代码质量)、厨师帽(注重代码美观)和老师帽(注重代码可读性和理解性)。他认为,根据不同情境选择合适的编程风格至关重要,避免教条式的“正确方法”,才能更高效地完成任务。
这个项目尝试在Three.js中复现类似虚幻引擎5 Nanite的动态LOD技术。它首先将模型分割成网格单元(meshlets),然后将相邻单元分组合并,再利用meshoptimizer进行简化,最终将模型分成多个不同精细度的版本。目前该项目还处于早期阶段,后续计划改进LOD和DAG切割,并进行GPU流几何处理。这项工作参考了Nanite、多重分辨率结构、批量多三角剖分等相关技术。
快速发展的房地产数据平台 PropRise 正在寻找一位资深的创始工程师,负责设计和构建其核心数据架构。你将使用 TypeScript、Next.js、React、Postgres 和 GCP 等技术栈,处理数百万条房产记录,构建强大的数据管道和质量保证系统,并利用 AI 提高数据准确性和效率。这是一个从零开始构建系统,直接向 CTO 汇报,并拥有丰厚股权的机会,适合热衷于解决复杂问题、对 AI 和数据质量充满热情,并渴望在快速发展的初创公司中发挥关键作用的工程师。
TRRE 是一种实验性的正则表达式扩展,它引入了一种更直观的方式来进行文本编辑和模式匹配。不同于传统的正则表达式,TRRE 使用 `:` 符号定义转换规则,使得文本替换、插入和删除操作更加简洁。它提供了一个类似 `grep` 的命令行工具,可以高效地处理各种文本转换任务,例如替换单词、插入字符、删除字符等,甚至可以实现简单的密码加密和解密。虽然目前仍处于原型阶段,但 TRRE 展示了其在文本处理方面的巨大潜力,特别是对于复杂的文本转换任务,其性能甚至超越了 `sed`。
十年来专注于为他人开发软件,作者逐渐失去热情。如今,AI的兴起使得开发满足个人需求的软件变得前所未有的容易。作者决定转向“个人软件”或“自私软件”的开发,专注于解决自身问题,并开源项目。这不仅能重燃编程热情,还能通过快速迭代和AI辅助,更高效地学习和解决问题,即使是简单的“一次性”脚本也能带来乐趣。
Inko 语言的设计者在探索堆栈分配和借用检查的最佳方案。默认情况下,Inko 类型在堆上分配,提供灵活性但存在性能开销。为了提高性能,引入了 `inline` 修饰符以支持堆栈分配,但这也带来了新的挑战:如何在保证内存安全的前提下处理借用和移动语义。文章探讨了多种方案,包括允许字段赋值、引入唯一类型和逃逸分析,最终认为编译时借用检查是最佳方案,但实现复杂度高,短期内不会实现。目前,Inko 仍然采用不允许内联类型字段重新赋值的策略。
arXivLabs是一个框架,允许协作者直接在arXiv网站上开发和分享新功能。参与arXivLabs的个人和组织都秉承着开放、社区、卓越和用户数据隐私的价值观。arXiv致力于这些价值观,只与遵守这些价值观的合作伙伴合作。如果你有想法可以为arXiv社区增值,请了解更多关于arXivLabs的信息。
作者发布了llm-smollm2插件,该插件将一个压缩的SmolLM2-135M-Instruct LLM模型打包到Python包中,大小不到100MB,可以直接通过pip安装。文章详细介绍了插件的构建过程,包括寻找合适的模型、处理llama-cpp-python库的冗余日志输出,以及打包和发布到PyPI的过程。虽然该模型能力有限,但作者认为它是学习LLM技术的好工具。
本文介绍了一种基于粒子的水文侵蚀模拟技术,该技术能够生成具有逼真河流、湖泊等水文特征的地形。通过扩展之前的粒子水文侵蚀模型,并引入“河流地图”和“水池地图”来追踪水流和积水,该系统能够模拟河流迁移、瀑布形成、洪泛区等地理现象。该方法简单高效,且与地形紧密耦合,生成的景观具有高度的真实感,即使在实时渲染中也能保持流畅。
本文揭示了Kubernetes资源管理模型与游戏开发中常用的实体-组件-系统(ECS)模式之间的惊人相似性。Kubernetes对象如同ECS中的实体,拥有唯一标识符;`spec`和`status`字段则对应组件,分别代表期望状态和实际状态;而控制器、调度器和Kubelet则扮演系统的角色,负责协调期望状态和实际状态之间的差异。这种架构上的相似性使得Kubernetes的设计更清晰,也为理解其声明式特性提供了新的视角。
Linux内核开发者Hector Martin宣布退出内核维护工作,并移除自己作为Apple/ARM平台维护者的身份。他表示对内核开发流程和社区管理方式失去了信心,但未来可能会以个人名义提交补丁。此举引发了对Linux内核社区管理的讨论。
Google的reCAPTCHA技术用于识别网站访客是否为人类,但其数据收集方式与GDPR存在冲突。reCAPTCHA通过分析用户行为(如鼠标移动、按键次数等)以及收集IP地址、浏览器信息等个人数据来评估用户身份。由于未获得明确同意,网站运营商需证明其使用reCAPTCHA有正当理由,但这很难做到,因为Google对数据的具体用途不明确,用户的隐私风险难以评估。文章建议网站运营商使用更隐私友好的替代方案,并强调透明化操作、获取用户同意以及数据最小化原则的重要性。
一个开发人员讲述了导弹软件中巧妙运用“零垃圾回收”的案例。由于导弹飞行时间有限,且硬件内存充足,即使程序存在内存泄漏,也不会造成问题。工程师们计算了程序在飞行过程中可能产生的内存泄漏量,并为其增加了双倍的内存空间,以确保程序在导弹完成任务前不会崩溃。这种方法充分利用了程序运行时间的限制,巧妙地解决了内存泄漏问题,堪称“终极垃圾回收”。
本文深入探讨了HTML中空格处理的复杂性。作者通过大量示例,揭示了HTML处理空格的各种规则,包括内联元素、块级元素、`
`标签和`white-space` CSS属性的差异,以及它们如何导致难以预测的渲染结果。文章还分析了自动化格式化工具、内容管理系统和代码压缩工具在处理HTML空格时面临的挑战。作者提出了一种可能的解决方案:用引号语法区分代码空格和用户可见空格,但承认这将是一个巨大的breaking change。最后,作者建议了一些实用技巧来规避HTML空格处理带来的问题,并提出了添加一个新的HTML实体`&ncsp;`来表示不可折叠空格的想法。
本文揭秘了谷歌Android XR系统对摄像头访问的处理策略。与手机类似,开发者可以通过用户许可访问摄像头数据,使用标准的Android Camera API(如CameraX)获取图像流。虽然可以访问前置摄像头(显示用户虚拟化身),但后置摄像头只提供重建的影像,而非原始数据流。此策略与苹果Vision Pro类似,确保Android应用能无缝移植到XR设备,并维护与手机端一致的权限申请流程。目前,Android XR仍处于预览阶段,未来可能会有调整。
Stack Overflow计划在其平台上引入AI生成的答案,此举引发了社区强烈反弹。作者认为该实验基于一个糟糕的理念:试图用AI替代人类专家的高质量回答。这不仅会浪费时间和金钱,还会损害平台的核心价值——由专家提供的可靠答案。文章详细分析了该实验可能带来的负面影响,包括:增加审核员的工作负担,降低专家参与度,无法保证答案的准确性,以及可能导致用户流失。作者认为,该实验的潜在收益极低,而风险却非常高,最终只会适得其反,损害Stack Overflow的声誉和社区活力。
arXivLabs是一个实验性项目框架,允许合作者直接在arXiv网站上开发和分享新功能。参与其中的个人和组织都认同arXiv的开放、社区、卓越和用户数据隐私的价值观。arXiv致力于这些价值观,只与坚持这些价值观的合作伙伴合作。如果你有想法能为arXiv社区增值,欢迎了解更多关于arXivLabs的信息。
数十年来,软件可信计算基(TCB)中普遍存在的内存安全漏洞导致恶意软件传播和针对关键基础设施、国家安全目标、公司和个人的破坏性攻击。本文探讨了内存安全标准化的重要性,这对于在政府和行业中推广普遍的强内存安全至关重要。近年来,一系列强大的内存安全技术(包括内存安全语言、硬件和软件保护、形式化方法和软件分隔)已经足够成熟,可以用于安全关键型用例。然而,目前缺乏通用的、与技术无关的术语或框架来规范内存安全要求。标准化将改善行业最佳实践,并有助于解决市场失灵问题,从而促进这些技术的采用。
这本小电子书将带你入门6502汇编语言。6502处理器在70年代和80年代非常流行,为BBC Micro、Atari 2600、Commodore 64、Apple II和任天堂娱乐系统等著名电脑提供动力。学习汇编语言能让你深入理解计算机底层工作原理,而6502汇编语言因其简洁易懂的设计,成为学习汇编语言的绝佳选择。文中通过编写一个简单的贪吃蛇游戏,循序渐进地讲解了寄存器、标志位、指令、寻址方式以及堆栈等核心概念,并附带了在线汇编器和模拟器,方便读者实践学习。
arXivLabs是一个框架,允许协作者直接在arXiv网站上开发和分享新的功能。参与arXivLabs的个人和组织都认同并接受了arXiv关于开放性、社区、卓越和用户数据隐私的价值观。arXiv致力于这些价值观,只与遵守这些价值观的合作伙伴合作。如果您有想法可以为arXiv社区增值,请进一步了解arXivLabs。
大多数开发团队都熟悉安全领域的“红队”,但本文作者建议,每个开发团队都应该组建一个更广泛意义上的“红队”。这支“红队”成员的角色包括:寻找设计缺陷的人(例如,避免像GitHub的广告牌设计那样出现低俗图像);使用广告拦截器的人(确保网站在广告拦截器开启的情况下也能正常运行);使用密码管理器的用户(确保网站的登录表单能够被密码管理器正确填充)。作者认为,这些看似简单的角色,能有效避免一些低级错误,让产品更完善,并最终提升用户体验。
`explore_heap`是一个通过`LD_PRELOAD`加载的glibc堆调试工具,它允许用户交互式地检查和操作程序的堆内存。通过安装`libheap_explorer.so`并使用SIGINT信号(Ctrl+C)中断程序,用户可以进入一个REPL环境,执行分配、释放内存块,打印空闲链表、tcache、fastbin和bin列表等操作,从而帮助开发者调试内存相关的错误。目前该工具已在Arch Linux的glibc 2.41+版本上测试通过,其他现代glibc版本需要调整部分常量。
Linux内核的Rust集成之路充满坎坷。部分内核维护者强烈抵制在内核中使用Rust,认为多语言编程会增加复杂性和风险。最近,围绕Rust驱动程序使用DMA API的讨论再次点燃战火。内核维护者Christoph Hellwig明确表示拒绝Rust代码,认为维护多语言项目很痛苦,并希望Rust开发者自行处理与C代码的接口适配。尽管Rust for Linux项目旨在通过抽象层简化集成,但Hellwig坚持认为这会增加维护负担。这一争议凸显了Linux社区内部对编程语言选择的不同立场,以及新技术融入现有庞大系统的挑战。甚至有维护者因此退出维护工作。最终结果如何,还有待观察,这将对Linux未来的发展方向产生深远影响。
Go 1.24 对其加密库进行了大规模重构,以实现 FIPS 140-3 标准合规性。这标志着 Go 标准库的一个重大飞跃,其纯 Go 实现的 FIPS 140-3 认证加密模块不再依赖 cgo 或系统调用。微软 Go 1.24 也做了相应更新,支持 macOS 预览版和增强 Azure Linux 支持,但其加密策略与官方 Go 版本不同,继续使用系统库。新的环境变量 GODEBUG=fips140=on 和 GOFIPS140=latest 控制 FIPS 模式。在 FIPS 兼容系统(如 Azure Linux 或 Windows)上,运行时会自动启用 FIPS 模式。
Gordon Kamer开发了一个强大的网页抓取API,作为AI平台Abbey的支撑。该API可在本地运行,只需提供URL即可获取网站数据和截图。它基于Playwright,使用Docker容器,支持JavaScript执行,并具备多种安全特性,如内存限制和隔离进程。API采用多部分响应,返回JSON数据、网页内容和最多5张截图。通过API Key进行访问控制,支持自定义内存分配和截图参数。
本文探讨了“服务即软件替代品 (SaaSS)”这一概念,它指使用他人的服务替代运行你自己的程序。Richard Stallman 认为,SaaSS 剥夺了用户对计算的控制权,因为它将计算过程交由他人控制的服务器完成。这与专有软件类似,都存在着安全隐患,如数据泄露和后门等问题。作者呼吁用户拒绝 SaaSS,选择使用自由软件和运行在用户自己控制的电脑上的程序,以维护自身的计算自由。
一个名为`sqlite-page-explorer`的小巧GUI应用,使用Redbean构建,允许你以SQLite数据库的页面方式逐页浏览数据。它以单一可执行文件形式提供,支持Windows、Linux、macOS等多种系统,并能让你直观地了解数据库索引、数据存储方式,以及B树结构等底层细节。虽然可能存在病毒警告,但该项目值得信赖,对于数据库开发者和学习者来说是个不错的工具。
作者记录了将一个运行了四年多的多人在线手游服务器从Scala 2.13迁移到Scala 3的历程。第一次尝试以失败告终,因为Scala 3移除了宏注解和类型投影等特性,导致代码修改量巨大。一年后,作者再次尝试,通过在Scala 2代码中预先应用Scala 3语法、使用IntelliJ的代码检查工具、自定义sbt源代码生成器来生成Monocle lenses、以及巧妙地解决类型投影问题等方法,最终成功完成迁移。过程中也遇到了依赖库冲突、编译速度慢等问题,并通过fork库、利用Scala 3的Tuple.Map特性优化代码等方式解决了这些问题。这次迁移经验表明,虽然Scala 3带来了一些挑战,但其强大的元编程能力和新特性最终还是值得的。