2024-02-20

31 篇热帖

1. In Defense of Simple Architectures (2022) (danluu.com)

捍卫简单架构(2022)

本文以Wave公司(一家估值17亿美元、拥有70名工程师的公司)为例,阐述了简单架构在支撑大规模业务时的有效性与优势。Wave的产品核心是实现数字增减的CRUD应用,其技术栈采用基于Python的单体架构与Postgres数据库。作者指出,尽管业界普遍推崇复杂架构(如微服务),但简单架构足以应对大多数应用的高流量需求,且能以更低成本、更快速度实现价值交付。

核心论点与案例

  • 简单架构的有效性:Wave通过单体架构支持了每月数十亿次请求,同时保持了开发的简洁性。类似地,StackOverflow也凭借单体架构成长为全球高流量网站之一,最终以18亿美元被收购。
  • 行业趋势的反思:技术会议普遍聚焦复杂架构,鲜少讨论单体架构的构建,导致许多企业盲目采用不必要的复杂技术。作者认为,对于大多数应用,即使达到顶级流量规模,简单架构仍是更优选择。

Wave的实践策略

  • 保持技术栈简单:使用同步Python,虽牺牲部分效率,但避免了异步框架(如Eventlet)引入的复杂性与运维难题。长时任务通过队列处理,而非整体异步化。
  • 平衡自建与购买:早期优先购买现成解决方案,后期在供应商无法满足关键需求时,才转向自建工具,尽管这违背了“仅核心业务自研”的常规建议。
  • 应对不可避免的复杂性:如在乌干达等地部署本地数据中心以满足数据驻留法规,单体架构使此操作比微服务架构更简单。电信集成因覆盖与成本问题,也需自建解决方案。

反思与权衡

  • 早期技术决策的代价:如数据库事务边界不清晰导致数据一致性风险,使用RabbitMQ、Celery、SQLAlchemy等工具虽非重大错误,但在新项目中可能重新评估。
  • 满意的技术选型:选择GraphQL(提升API自文档化与客户端安全性)、HTTP/3(替代自定义协议)和Kubernetes(为未来多国部署预留灵活性),这些权衡被认为利大于弊。

总结

Wave的成功表明,简单架构允许企业将有限的复杂性预算和团队资源集中在真正的业务挑战上,而非架构本身。作者倡导,在缺乏强有力理由的情况下,应优先选择最简单的可行方案。这种理念帮助Wave以相对精简的工程师团队,在竞争激烈的非洲金融领域实现了业务增长。

2. Big media publishers are inundating the web with subpar product recommendations (housefresh.com)

大型媒体出版商正在向网络大量灌输低质量的产品推荐,这些内容缺乏可信度,却凭借品牌声誉和搜索引擎优化(SEO)策略在谷歌搜索中占据高位。这些出版商(如BuzzFeed、福布斯、《大众科学》等)的推荐文章通常没有经过实际产品测试,而是通过复制营销材料、亚马逊产品描述或依赖传闻来拼凑内容,并刻意营造“严格测试”“专家团队”“实验室认证”等E-E-A-T(经验、专业性、权威性、可信度)信号,以迎合谷歌算法,误导用户和搜索引擎。

以“最佳宠物空气净化器”为例,谷歌搜索结果前列常出现《美好家园与花园》《Real Simple》等杂志的文章。调查发现,这些文章引用相同的专家(如Kenneth Mendez)、使用相同的自由摄影师(Henry Wortock)在相同场景拍摄的照片,且均无公开的实际测试数据。许多推荐产品存在明显问题:例如Molekule Air Mini+被多次推荐,但该公司已申请破产、面临虚假广告集体诉讼,且被多家独立测试机构评为性能低下、价格高昂的糟糕产品。出版商对此视而不见,可能因为该产品佣金较高。

这种现象背后是大型媒体集团(如Dotdash Meredith)和私募股权公司(如North Equity)的商业模式:他们收购传统媒体品牌,裁员专业记者,转而雇佣电商编辑或第三方公司批量生产“最佳产品”列表,通过联盟营销快速变现。这些内容虽表面符合谷歌的E-E-A-T指南,但缺乏实质性原创研究和测试,实质是“伪专业内容”。谷歌的产品评论更新本应打击此类低质量内容,但目前算法仍倾向于奖励大品牌网站,导致独立专业网站(如HouseFresh、GearLab)流量下降,甚至面临生存危机。

文章呼吁谷歌一致地执行其内容质量标准,不应偏袒大型媒体,并指出当前状况对用户有害:消费者可能基于错误推荐购买低效、昂贵甚至有问题的产品,最终只有出版商和投资方获益。作者作为长期进行产品实际测试的独立团队,担忧若此趋势持续,网络生态将被低质内容淹没,真正有价值的独立评测将逐渐消失。

3. My productivity app is a never-ending .txt file (2022) (jeffhuang.com)

文章总结:用单个永续文本文件管理14年工作的生产力系统

这篇文章分享了作者杰夫·黄(Jeff Huang) 维持了超过14年的一种独特生产力方法——使用一个永不结束的单一文本文件作为核心任务管理和工作记录系统。

核心思想与起因

作者在大学初期为应对繁杂事务,尝试了各种待办事项和生产力应用,但这些工具导致事项清单越拉越长,且会议笔记、日历、想法等分散在不同系统中,令人沮丧。最终,他回归最简单的形式——一个文本文件,并沿用至今。这个系统已成为他工作中不可或缺的“秘密武器”。

系统运作流程

  1. 必备工具:在线日历:作者将所有计划(即使是非固定时间的想法,如“构思如何招募博士生”)都放入在线日历,确保所有未来安排集中于一处。
  2. 创建每日清单:每晚睡前,将日历中次日的所有条目复制并追加到文本文件末尾,形成详细的当日待办清单。清单包括定时会议、跑腿任务和工作项目。这个过程也帮助他评估每日工作量。
  3. 执行与记录:执行任务时,在对应条目下直接添加笔记。于是,“待办清单”自然演变为 “已做清单”。例如,会议条目下会记录讨论结果或决定。
  4. 归档与回顾:所有日期的每日清单都保存在同一个文本文件中,以日期分隔。这形成了一个长达9年、超过5万行的连续记录,涵盖了作者作为教授的所有工作、会面和思考,可作为研究笔记本和会议纪要。

系统特点与技巧

  • 一致性与可搜索性:使用统一的书写风格(如“meet with”)和简单标签(如 #idea 记录想法,#annual 标记年度报告相关事项),方便随时检索和统计(例如,搜索“meet with”可统计历次会议)。
  • 灵活的文本编辑:作者使用功能丰富的文本编辑器(如UltraEdit),便于查看当日完成情况、计算统计数据和按标签筛选内容。
  • 简单的邮件管理:配合文本文件,采用简单的邮件标记系统:红色(需处理)、橙色(需后续考虑或转交)、黄色(已发送待回复)。每日结束时复查橙色和黄色邮件。
  • 控制工作负荷:当感到压力过大时,作者会通过取消邮件标记、删除日历事项、减少未来自我分配的任务量来主动控制工作负荷,即使这意味着可能错过某些机会。

日常工作循环

  • 晨间:查看昨晚写好的文本文件,了解当日任务。
  • 白天:按清单执行定时任务;在空闲时间处理清单上的浮动任务和红色标记邮件。
  • 傍晚:快速复查橙/黄色邮件;将次日日历条目复制到文本文件底部,完成循环。

系统优势

  • 清晰启动:醒来即知当日要务。
  • 释放记忆:无需在脑中记忆未来待办和邮件跟进。
  • 方便回顾:轻松回顾过去,准确评估自身日程安排能力。
  • 消除拖延:没有不断被推迟的“总待办清单”,每日任务均根据可完成量规划。

总而言之,该系统通过一个极简的中心化文本文件,整合了任务规划、执行记录与历史归档,结合日历和邮件的简单协同,形成了一套可持续、可控且信息完备的个人生产力管理体系。

4. Translating OpenStreetMap data to HTML5 Canvas with Rust and WebAssembly (mary.codes)

这篇文章介绍了作者使用 Rust 和 WebAssembly 处理 OpenStreetMap (OSM) 数据并将其绘制在 HTML5 Canvas 上的过程,作为其旧项目 Line Buddy 重写的第一步。

核心目标: 作为概念验证,项目旨在演示如何利用 Rust 和 WebAssembly 高效处理大量地理坐标数据,并最终用于在浏览器中创建自定义地图,为后续生成 3D 地图(使用 A-Frame)奠定基础。

技术栈与项目设置:

  • 前端: 使用纯 HTML5 Canvas 和 JavaScript,未引入额外库。
  • 后端处理: 选择 Rust 和 WebAssembly,因为预计需要处理大量坐标数据,Rust 在性能上具有优势。
  • 工具: 使用 wasm-pack 创建并优化 Rust WASM 库项目。
  • OSM 解析: 在 Rust 中使用 osm-xml crate 来解析从 Overpass API 获取的 XML 格式 OSM 数据。

工作流程与实现细节:

  1. 数据获取:

    • 通过 JavaScript 从 OpenStreetMap 导出特定区域(如迪士尼世界各主题公园)的边界坐标。
    • 使用 Overpass API 的查询语言,针对不同地图元素(如步行道、建筑、水体、树木等)分别发送异步请求。
  2. Rust/WASM 数据处理:

    • 编写了多个 Rust 函数(通过 wasm_bindgen 暴露给 JavaScript):
      • process_nodes:处理离散点(如树木)数据。
      • process_ways:处理由节点组成的多边形路径(如建筑、道路)。
      • process_relations:处理由多个路径组成的复杂关系(如水体,可能包含岛屿等“内环”)。
    • 关键转换: 实现了一个坐标映射函数 map_points,将地理经纬度坐标转换为适配 Canvas 尺寸的像素坐标(x, y)。
  3. Canvas 绘制:

    • 在 JavaScript 端,准备 Canvas 并设置正确的尺寸和坐标系方向(进行了翻转以匹配地图方向)。
    • 依次获取并处理各类地图元素数据。
    • 使用 Promise.all 等待所有数据请求完成。
    • 根据元素类型(水体、花园、道路、树木、建筑等)使用不同颜色进行绘制:
      • 多边形元素(水体、花园、建筑)使用 fill 填充。
      • 线性元素(道路)使用 stroke 描边。
      • 点元素(树木)绘制为小圆点。
  4. 结果与性能:

    • 成功在 Canvas 上渲染了地图(如魔法王国地图)。
    • 测量加载时间:开发构建平均约5.2秒,生产构建优化后平均约2.3秒。性能瓶颈主要在于最慢的 API 请求。
    • 提供了在线工作演示,并支持通过 URL 参数切换不同公园地图。

总结: 该项目成功验证了使用 Rust/WASM 作为计算引擎来处理 OSM 数据并驱动前端 Canvas 渲染的可行性,为后续构建更复杂的 3D 地图应用提供了基础。

6. Cve-rs: Fast memory vulnerabilities, written in safe Rust (github.com)

cve-rs 是一个用 100% 安全 Rust 编写的工具库,旨在以安全的方式模拟常见的内存漏洞。它允许开发者在 Rust 程序中引入缓冲区溢出和段错误等内存安全问题,而不会实际破坏程序的内存安全。

主要特点

  • 安全实现:整个代码库使用 #![deny(unsafe_code)] 标注,确保不包含任何不安全代码(测试除外),从而在模拟漏洞的同时保持内存安全。
  • 模拟的漏洞类型
    • 释放后使用
    • 缓冲区溢出
    • 段错误
  • 安全重实现:提供了标准库中 std::mem::transmutestd::ptr::null()/null_mut() 引用版本的安全重实现。
  • 易用性:可通过 Cargo 直接安装使用,支持作为库或二进制示例运行。
  • WASM 支持:兼容 WASI API 和 WebAssembly,可编译并在浏览器或 Wasmer 中运行。

安装与使用

  • 作为库添加:在 Cargo.toml 的 [dependencies] 中加入 cve-rs = "0.1.0"
  • 运行示例:通过 cargo install cve-rs 安装后执行 cve-rs
  • WASM 编译运行:
    cargo build --target wasm32-wasi
    wasmer run target/wasm32-wasi/debug/cve-rs.wasm
    

项目信息

  • 许可证:GLWTSPL。
  • 贡献者:特别感谢 @Bright-Shard 和 @Creative0708 等贡献者。

该项目以安全为核心,通过纯 Rust 代码演示了如何在不牺牲安全性的前提下模拟常见内存漏洞,适用于学习、测试或特定场景的需求。

8. Hetzner GPU Server (robot.hetzner.com)

Hetzner GPU Server 页面内容摘要

该页面为Hetzner Online的服务器订购页面,旨在展示服务器产品信息并协助客户完成下单流程。页面结构分为客户指导部分和购物车部分。

客户指导部分:

  • 欢迎新客户:如果不是现有Hetzner客户,建议通过服务器转移网站接管其他客户的服务器。
  • 替换现有服务器:如果订单用于替换当前服务器,需查看相关重要信息。
  • 订单状态查询:客户可通过“订单处理状态”网站查看当前订单进度。

购物车部分: 列出两款服务器产品,包括详细规格和定价信息:

  1. Intel® Xeon® 6731P 服务器

    • 规格:32核 "Granite Rapids" 处理器,128 GB DDR5 ECC reg. RAM,2 x 1.92 TB NVMe SSD Datacenter Edition(第5代,软件RAID 1),1 Gbit/s带宽。
    • 定价:每月最高€667.23,每小时€1.0692,一次性设置费€665.21。
  2. Intel® Core™ Ultra 7 265 服务器

    • 规格:64 GB DDR5 UDIMM,2x 1 TB NVMe SSD M.2,1 Gbit/s带宽。
    • 定价:每月最高€90.44,每小时€0.1449,一次性设置费€386.75。

页面还包含“更多信息”链接以获取产品详情。整体设计以帮助客户选择并订购服务器为核心功能。

9. A visual interactive guide to Bloom filters (samwho.dev)

布隆过滤器视觉交互指南摘要

核心概念:布隆过滤器是一种概率性数据结构,功能类似集合,可添加元素并检查元素是否存在。其核心区别在于:查询结果若为“否”则一定不存在(无假阴性),若为“是”则表示“可能存在”(可能产生假阳性)。

工作原理

  1. 本质上是一个位数组(初始化为全0)。
  2. 添加元素时,使用多个哈希函数(如文章示例中的SHA1、SHA256、SHA512)计算出多个位置,并将这些位设置为1。
  3. 查询时,用相同的哈希函数计算位置,若所有对应位均为1,则返回“可能存在”(可能为假阳性);若有任何一位为0,则返回“一定不存在”。

优势与应用场景

  • 空间效率极高:在允许一定误报率的前提下,存储相同数量的元素所需空间远小于传统集合。
  • 典型用例
    • 网页浏览器恶意链接检测:以极小空间存储海量恶意网址库,仅对“可能存在”的链接再进一步核实,大幅节省带宽和内存。
    • 大型数据库(如Google BigTable):用于快速判断键是否可能存在于磁盘中,避免不必要的磁盘读取,提升查询性能。

局限性与权衡

  • 无法删除元素:标准布隆过滤器中,置位操作可能影响其他元素的判断。
  • 误报率受多因素影响
    • 随着已置位位数的增加,误报率指数级上升
    • 使用的哈希函数数量需权衡:越多则初期误报率低,但填充速度更快,且计算成本增加。
  • 参数调优:可根据预期元素数量和目标误报率,计算最优位数组大小和哈希函数数量(文章提供了相关JavaScript函数示例)。

变种:计数布隆过滤器

  • 使用计数器代替位,允许删除元素。
  • 代价:空间开销增加,且可能引入假阴性(删除一个元素时可能连带移除共享相同位置的其他元素),丧失了标准布隆过滤器的无假阴性保证。

现实应用

  • Akamai:用于识别一次性访问页面,避免其被缓存,优化内容分发网络效率。
  • Google BigTable:利用内存中的布隆过滤器快速判断键的存在性,减少磁盘访问。

总结:布隆过滤器是哈希函数的巧妙应用,通过在内存占用和结果确定性之间做出特定权衡,在处理大规模存在性判断问题时能提供显著的性能优化。选择使用时需仔细评估误报容忍度、元素数量及是否需要删除功能。

12. WebKit switching to Skia for 2d graphics rendering (blogs.igalia.com)

WebKit 转向使用 Skia 进行 2D 图形渲染

背景与动机

  • WebKit 的 GTK 和 WPE 端口长期致力于提升图形性能,已实施多线程渲染、DMA-BUF 渲染器和垂直同步(VSync)等功能。
  • 现有基于 CPU 的 2D 渲染器(Cairo)已接近性能极限,难以进一步优化。Cairo 基于 PostScript 模型,虽输出质量高、API 熟悉,但难以适配 GPU 渲染,且存在一些性能瓶颈。
  • 其他浏览器引擎已逐步将更多任务(包括 2D 渲染)迁移到 GPU,以获取显著性能提升。

评估与决策过程

  • 团队评估了多种 2D 渲染库,均未完全满足需求,曾尝试自行开发库,在性能上表现良好,但难以平衡性能与渲染质量。
  • Skia 最初因缺乏稳定的公共库接口(不利于发行版打包)而未被选用,但团队后来积累了在 WebKit 中维护第三方依赖(如 ANGLE、libwebrtc)的经验,此障碍得以消除。
  • 2023 年 12 月,团队内部开始测试 Skia。一个月内实现了 MotionMark 测试套件的全部功能,桌面端测试得分比原有结果提升一倍,表现优异。
  • 在嵌入式设备(WPE 的主要目标平台)上,Skia 的性能提升虽不如桌面端显著,但仍优于 CPU 渲染。综合考虑性能提升、代码简化及新功能支持潜力,团队最终决定采用 Skia。

实施与上游化

  • 2024 年 2 月,Skia 内部分支达到“可上游化”状态,团队随即与 Google、Sony、Apple 和 Red Hat 等公司讨论并获得积极反馈。
  • 通过 WebKit 开发者邮件列表公开此计划后,社区反响正面。团队已开始提交补丁,将 Skia 引入 WebKit 主干,完成 CMake 集成,并为 WPE 端口实现了初步的 Skia 支持。

后续计划

  • 团队将继续在 WebKit 主干中开发 Skia 实现,并计划调整架构以更高效地支持 GPU 渲染。
  • 目前重点在 WPE 端口,未来将扩展至 GTK 端口及其他当前使用 Cairo 的端口,最终全面取代 Cairo。
  • 切换将以实现完整功能且无性能回退为目标,无设定具体时限。
13. Cake – C23 and Beyond (2023) (thradams.com)

根据提供的内容,文本为乱码,无法进行有效的阅读和分析。因此,无法基于给定内容生成准确、有意义的摘要。

不过,根据文章标题 “Cake – C23 and Beyond (2023)”,可以推断该文章内容可能涉及以下方面:

  • 主题:文章很可能讨论的是C23,即C语言的下一个标准版本(原计划在2023年发布),以及未来(Beyond)的发展方向。
  • 关键元素“Cake”:“Cake”可能是一个工具、库、编译器或与C23生态相关的项目名称。
  • 内容方向:文章可能介绍了C23的新特性、语法改进、对工具链的影响,以及“Cake”项目如何支持或应用这些新特性,展望C语言的未来发展。

由于无法获取原文的具体细节,以上仅为基于标题的合理推测,实际内容需以可正确解码的原文为准。

14. Jeff Dean: Trends in Machine Learning [video] (www.youtube.com)

Jeff Dean: Trends in Machine Learning [video]

提供的文本内容主要是一个YouTube视频页面的模板元素,标题为“Jeff Dean: Trends in Machine Learning [video]”,但未包含任何关于机器学习趋势的实际讨论或信息。具体内容如下:

  • 视频标题:明确指向一个关于Jeff Dean和机器学习趋势的视频。
  • 页面描述:标准YouTube页面描述,提到“享受你喜爱的视频和音乐,上传原创内容,并与朋友、家人及全世界分享”。
  • 导航链接:包含YouTube的标准页脚链接,如About、Press、Copyright、Contact us、Creators、Advertise、Developers、Terms、Privacy、Policy & Safety、How YouTube works、Test new features、NFL Sunday Ticket等。
  • 版权声明:注明“© 2026 Google LLC”。

文本中未涉及机器学习趋势的任何具体细节、观点或技术内容,仅为YouTube页面的通用结构部分。

16. UI is a function of your organization (blog.jim-nielsen.com)

本文探讨了UI(用户界面)设计如何受制于组织的实际能力。以Domino's Pizza Tracker为例,该UI提供精确的订单跟踪细节,但其实施依赖于每个本地商店的硬件和软件系统来实时更新状态。类似地,在保险索赔跟踪项目中,设计师的理想流程在现实中常因组织的人和流程限制而产生妥协,导致UI变成表面现象(如进度条基于定时器而非真实进展)。

作者强调,设计UI即设计组织,因为UI只能实现与组织能力相匹配的功能。UI的现实体验无法超越组织的交付能力。初创公司因结构简单,更易围绕单一想法组织,从而交付更贴合现实的UI。最终结论是:UI是组织的函数(UI = f(org)),其质量和真实性直接取决于组织的交付能力。

17. Show HN: Hyperdiv – Reactive, immediate-mode web UI framework for Python (github.com)

Hyperdiv:基于Python的响应式即时模式Web UI框架

Hyperdiv是一个用于快速开发响应式浏览器UI应用的Python框架,具备内置组件、简洁的即时模式语法和最少的工具样板代码。

核心特性与集成:

  • 内置Shoelace组件系统。
  • 通过Mistune支持Markdown渲染。
  • 通过Chart.js支持图表功能。
  • 支持读写浏览器本地存储
  • 表单验证逻辑可使用Python实现。

资源与安装:

  • 提供编码演示视频和介绍文章。
  • 有一个独立的演示应用仓库
  • 可从PyPI安装:pip install hyperdiv
  • 运行要求:Python 3.9+,已在macOS和Linux上测试。

文档与社区:

  • 安装后,可通过命令hyperdiv docs在本地打开并运行文档应用(该应用本身由Hyperdiv构建)。
  • 鼓励用户联系以探讨部署、分享想法或提问。

未来规划(路线图):

  • 第三方插件支持
  • 分布式状态管理
  • 文本输入变更的差异处理
  • 可视化组件构建器
  • 性能改进
18. OTP at a High Level (2019) (adoptingerlang.org)

OTP 高级概述 (2019)

Erlang/OTP 与大多数编程环境(包括同样使用虚拟机的环境)不同。它对应用应如何构建、隔离程度,以及虚拟机能力与应用软件功能之间的划分有严格的规定。它不仅是一门编程语言,更是一个用于构建系统的完整框架。理解其核心原则是快速上手且避免后续大规模重写的关键:这能确保所有应用良好协同、支持在线更新,并使代码易于监测和观察。

本文将从最高层面介绍 Erlang 虚拟机及 OTP 的核心概念。

Erlang 运行时系统 (ERTS)

一切的基础是 Erlang 虚拟机本身,称为 BEAM。BEAM 是 Erlang 虚拟机的一个具体实现(C 语言编写),包含调度器、垃圾回收、内存分配器、事件定时器轮等底层组件,以及用于抽象操作系统特性(如时间管理、文件处理)的统一接口。它还提供了一些内置函数(BIF)和允许用其他语言实现原生函数(NIF)的接口。

仅有虚拟机无法运行 Erlang 代码,因为缺乏标准库和代码加载机制。通过一组预先加载的 Erlang 模块(用于设置网络和文件处理),引导加载其他模块。虚拟机与这些预加载组件及代码加载工具共同构成了 Erlang 运行时系统 (ERTS)。ERTS 启动时遵循一个“启动脚本”(自动生成)的指令。

Erlang 默认提供的启动脚本仅加载启动 Shell 和编写应用所需的最小代码集。至此,我们才开始真正讨论 Erlang 语言本身。

Erlang/OTP

将虚拟机比作操作系统内核,那么 OTP 就是用户空间组件的基础框架。OTP 规定了如何在虚拟机上构建“组件”。它不仅仅是“进程和消息”,而是定义了一套明确的代码组织方式。

OTP 代表 Open Telecom Platform,这是一个历史遗留名称,旨在帮助当年在爱立信推动 Erlang 开源化。

Erlang/OTP 系统通过名为 OTP 应用 的组件构建。每个 Erlang 安装版本或基于它构建的系统都包含多个 OTP 应用。OTP 应用主要分两类:

  1. 库应用:无状态的模块集合。
  2. 可运行应用:包含模块集合,并定义了由监督树管理的状态进程结构。

下文统一使用此术语。

默认包含的两个核心 OTP 应用是:

  • stdlib:库应用,包含核心标准库模块(如 list, maps)。
  • kernel:可运行应用,建立依赖 OTP 应用的 Erlang 系统的核心结构。

节点启动时,首先加载所有所需 OTP 应用的模块,然后启动 kernel。此后,系统的生命周期由 kernel 管理。所有其他 OTP 应用及其配置、分布式特性、热代码更新等功能均通过它处理。可以将 kernel OTP 应用类比为 Linux 的 systemd 或 BSD 的 init。

实际上,kernelstdlib 是启动基本 Erlang Shell 仅需的两个应用。执行 erl 命令时,即启动虚拟机及 kernel,并预加载 stdlib。其他所有应用都是可选的,可在后续加载。

标准 Erlang 发行版包含众多应用,例如:

  • kernel, stdlib, crypto, ssl, inets, ct, wx, observer, compiler 等。

这些组件被整合在一起,称为一个 Erlang 发布版本。它是一组 OTP 应用的集合,可能包含一份完整的虚拟机副本。因此,下载安装 Erlang 时,你得到的就是一个发布版本。用户也可以构建自己的发布版本,将标准发行版中的部分 OTP 应用与自己的应用捆绑。

例如,一个名为 proxy 的应用如果依赖 sshssl(后两者又依赖 public_key, crypto, stdlib, kernel),则其发布版本将包含这些所有组件。本质上,构建 Erlang 系统就是将虚拟机、标准应用以及自己的应用和库重新捆绑。

在 Erlang/OTP 中工作

社区的标准工具(如 Rebar3)基于一个前提:你编写和发布的内容都是 OTP 应用,并内含处理它们所需的所有功能。这与许多仅要求在某处定义 main() 函数的语言有很大不同。这也是该语言常被称为 Erlang/OTP 而非单纯 “Erlang” 的原因:它不只是语言,更是一个要求基本结构的通用开发框架。

无论编写嵌入式软件、区块链系统还是分布式数据库,整个社区都遵循此规范。掌握这个框架是快速上手 Erlang 的关键。后续章节将深入探讨如何在这些规范要求下工作。

19. Walmart to buy TV maker Vizio for $2.3B (www.cnbc.com)

沃尔玛以23亿美元收购电视制造商Vizio

沃尔玛于2月20日宣布,已同意以23亿美元现金(每股11.50美元)收购电视制造商Vizio。此次收购正值该美国最大零售商报告第四季度财报之际,旨在推动其高利润广告业务的增长。

核心收购动机:拓展高利润广告业务

沃尔玛表示,收购Vizio的主要目的是通过其智能电视操作系统SmartCast来提升广告业务。SmartCast允许用户在电视上免费观看支持广告的内容。沃尔玛正致力于扩大其媒体业务“沃尔玛连接”,该业务的利润率远高于销售杂货或服装。在第四季度,该广告业务的销售额增长了22%。

沃尔玛美国区执行副总裁兼首席营收官赛斯·达莱尔在声明中表示:“我们认为VIZIO以客户为中心的操作系统在具有吸引力的价格点上提供了出色的观看体验。我们还相信,它支撑起一个正在迅速扩张的、盈利的广告业务。”

战略协同与市场竞争

沃尔玛及其旗下山姆会员店长期以来一直是Vizio设备的主要销售渠道。此次收购将使沃尔玛能够直接控制Vizio平台,从而为其广告客户提供更广泛的覆盖范围。沃尔玛在新闻稿中指出,Vizio的SmartCast系统拥有1800万活跃账户。此外,公司还表示,收购后能够提供“创新的电视、家庭娱乐和媒体体验”。

这笔交易也发生在沃尔玛试图与亚马逊不断增长的广告业务进行竞争的背景下。通过控制Vizio的电视操作系统和用户基础,沃尔玛能够增强其广告平台的影响力和数据能力。

交易细节与市场反应

该收购消息此前已泄露,导致Vizio股价大幅上涨。在交易正式宣布的周二,Vizio股价再涨16%,收于每股11.08美元,略低于收购报价。

20. Ask HN: How many of you Apple developers still use Objective C?
21. I was infected with Zika to test a vaccine (worksinprogress.co)

作者参与寨卡病毒人体挑战试验的经历与思考

参与动机与背景

作者通过推特得知一项寨卡病毒人体挑战试验的招募信息,因曾为倡导组织1Day Sooner工作,且自身符合健康男性(18-40岁)的条件,决定参与试验。人体挑战试验旨在故意感染受试者以测试疫苗或疗法,在COVID-19疫情期间引发伦理争议。作者认为,此类试验虽违背“不伤害”原则,但能通过受控感染提供高质量数据,减少野生感染造成的更广泛危害。

寨卡病毒信息

寨卡病毒属于黄病毒科,1947年首次在乌干达发现,对孕妇可能导致婴儿小头畸形等出生缺陷,但对非孕妇症状较轻(类似感冒,但稍重)。疾病控制与预防中心(CDC)的治疗建议包括休息、补液和服用对乙酰氨基酚。死亡率极低(截至2019年仅51例死亡)。

试验过程与日常生活

  • 筛查与知情同意:作者通过多次筛查和填写知情同意表,了解试验无直接健康益处(仅获得4,875美元补偿),并确认可随时退出。伦理问题包括补偿金是否构成胁迫,以及对参与者自主权的限制。
  • 入住设施:试验在约翰霍普金斯大学免疫研究中心进行,为期9天。受试者(共4人,包括作者)住隔离病房,每日接受血液抽取和体检。设施提供餐饮、共享活动区,但限制外出以防病毒传播。
  • 症状发展:作者最初无症状,第6天出现皮疹、头痛、疲劳,试验结束后症状加剧。整体症状不严重,但导致不适和工作困难。作者承认参与前低估风险,但仍认为合理。

伦理反思与个人体验

  • 自主权与生活细节:作者描述试验中缺乏自主选择(如食物、网站访问),但与其他受试者(Sam、Max、Steve)建立友好关系,体验如“机构化”生活。工作人员专业但抽血技术不一,影响体验。
  • 社会认可与补偿:伦理报告指出参与者缺乏社会认可,但作者获得朋友支持和金钱补偿,认为足以抵消风险。作者强调参与出于科学贡献和个人自由。

结论

作者支持人体挑战试验的权利,认为成年人应有权为更大利益承担风险。寨卡疫苗是消除病毒的关键,作者通过亲身参与贡献科学,并希望分享经验以优化未来试验。尽管症状带来不便,作者对整体经历持积极态度,并愿参与其他类似研究(如丙型肝炎)。

23. Learning resources for curious software engineers (github.com)

学习资源清单:面向好奇的软件工程师

本文是一个为程序员准备的全栈学习资源清单,旨在提升开发者的专业能力。清单内容经过精心筛选,仅包含作者认为真正具有启发性或已成为永恒经典的资源。

核心原则与结构

  • 目的:不是追求全面,而是保持轻量、避免信息过载。
  • 资源类型标识:使用图标区分书籍、视频、幻灯片、必读项、论文等。
  • 欢迎贡献:通过提交PR来添加内容,但会保持列表的简洁性。

核心阅读材料

  • 必读书籍
    • 《程序员修炼之道》:关于编程最具启发性和实用性的书。
    • 《代码大全》:构建软件框架和代码讨论的补充读物。
    • 《发布!》:超越代码,提供构建生产就绪软件的最佳实践。
    • 《可伸缩性规则》:扩展网站的50条原则。
    • 《Linux编程接口》:几乎涵盖Linux所有知识,并揭示软件演进和简洁接口的价值。
    • 《计算机程序的构造和解释》:极具影响力的免费教材。
  • 必读文章
    • 《给新软件工程师的实用建议》、《成为一名资深工程师》等文章浓缩了多年的经验教训。
    • 《我在软件开发中学到的教训》等文章提出了具体、可操作的建议,例如:“先写规范再写代码”、“测试能产出更好的API”、“理解并远离货物崇拜”、“对日期永远使用时区”、“对文本永远使用UTF-8”等。
    • 《成为-10倍工程师》反向说明了哪些行为会抵消其他工程师的产出。
    • 《构建好软件》总结了软件工程实践的根本,指出软件项目的失败常源于管理而非技术选择本身。

主题分类资源

清单按主题组织,涵盖了软件工程的广泛领域:

  • 技术基础:算法与数据结构、API设计、编程语言(Python、JavaScript等)、函数式编程、编译器、数据库(SQL、NoSQL、PostgreSQL内部机制)、数据格式、调试、正则表达式等。
  • 系统与架构:系统设计、分布式系统、微服务与单体架构、可扩展性、可靠性工程、缓存、网络、HTTP、云计算、容器化(Docker)、基础设施即代码等。
  • 实践与流程:代码质量、代码审查、测试、持续集成/部署、发布与版本控制(Git)、文档、开发环境与工具、配置管理、故障响应与事后复盘、技术债务等。
  • 职业与软技能:职业成长(从初级到Staff工程师的路径)、心态与习惯、沟通、公开演讲、项目与产品管理、工程管理、面试准备、学习与记忆方法、个人知识管理、写作等。
  • 跨领域知识:会计基础、商业(购买 vs. 自建)、安全、隐私、机器学习/AI、大语言模型、低代码/无代码、数学、硬件、操作系统内部、设计(视觉与UX、架构模式)等。
  • 特定领域与工具:搜索引擎、性能优化、可观测性(监控、日志)、Python、JavaScript、编辑器与IDE(Vim)、命令行等。

学习建议与持续更新

  • 学习方式:强调通过实践(如重建经典技术)、阅读代码、学习基础理论来提升。
  • 记忆与知识管理:介绍间隔重复、费曼学习法、个人知识管理系统等有效学习策略。
  • 保持更新:推荐了黑客新闻、相关博客、Newsletter等信息来源,以跟上技术发展。
  • 跨职能理解:建议阅读其他角色(如产品、设计)的内容,以获得不公平的竞争优势。

此清单是一个动态的、经过提炼的学习指南,旨在帮助软件工程师系统性地构建知识体系,从基础到前沿,从技术到人文,全面发展。

24. Tiny, tamper-proof ID tag can authenticate almost anything (news.mit.edu)

MIT研究人员开发了一种新型防篡改ID标签,该标签利用太赫兹波技术,比传统RFID更小、更便宜且更安全。其核心创新在于将微小金属颗粒混入粘合剂中,当太赫兹波穿透标签时,会形成独特的反射模式(类似于指纹),用于验证物品真伪。若标签被移除或重新粘贴,该模式即被破坏,从而防止伪造。

该标签尺寸仅约4平方毫米,适用于小型医疗设备等传统RFID无法覆盖的物品。研究人员还训练了机器学习模型,能以超过99%的准确率识别粘合剂模式,提高认证效率。

然而,当前技术存在局限:太赫兹波传输损耗大,传感器需在4厘米内且角度偏差小于10度才能准确读取。未来改进方向包括扩大数据样本、提升传输距离和适用性。

该研究受美国国家科学基金会和韩国高等研究基金会部分支持,旨在拓展太赫兹波在安全认证领域的应用潜力。

25. Fingerprints can be recreated from the sounds made when you swipe a screen (www.tomshardware.com)

基于屏幕滑动声的指纹重建攻击研究

摘要内容

中国与美国的研究人员提出了一种针对自动指纹识别系统(AFIS)的新型侧信道攻击方法——PrintListener。该攻击利用用户手指在触摸屏上滑动时产生的摩擦声特性,提取指纹模式特征。实验表明,在最高安全设置(误识率0.01%)下,该方法可在五次尝试内成功攻击27.9%的部分指纹9.3%的完整指纹。这是首个利用滑动声音推断指纹信息的公开研究。

攻击背景与可行性

生物识别指纹认证市场预计到2032年将接近千亿美元规模。尽管用户已开始注意保护指纹隐私(如避免手部细节暴露),但攻击者仍可通过Discord、Skype、微信、FaceTime等应用程序,在用户不知情的情况下捕获其滑动屏幕时产生的声音。这些声音来源于麦克风在线期间的无意识滑动操作。

技术实现与挑战

研究团队克服了三项核心技术难题:

  1. 微弱摩擦声定位:开发基于频谱分析的摩擦声事件定位算法。
  2. 特征分离:采用最小冗余最大相关性(mRMR)和自适应加权策略,从声音中分离指纹模式与用户生理行为特征。
  3. 特征推断:通过统计分析指纹初级与次级特征间的关联,设计启发式搜索算法,实现从初级特征推断次级特征。

实验结果与意义

PrintListener通过音频信号预处理算法生成针对PatternMasterPrint(特定指纹模式的主指纹)的合成攻击数据。在实际场景测试中,该方法对部分指纹的攻击成功率超过四分之一,对完整指纹攻击成功率接近十分之一,显著优于传统的主指纹字典攻击。该研究揭示了指纹认证系统在声音侧信道攻击下的新脆弱性,为生物识别安全领域提供了重要警示。

27. FTC proposes new protections to combat AI impersonation of individuals (www.ftc.gov)

美国联邦贸易委员会(FTC)正就一项拟议规则制定的补充通知征求意见,该提案旨在禁止冒充个人的行为。这项拟议的规则修订将扩展FTC今日最终确定的关于政府与商业冒充的新规保护范围。

行动背景:鉴于冒充欺诈投诉激增,以及公众对此类行为给消费者和被冒充者造成危害的强烈反响,FTC采取此措施。新兴技术,包括AI生成的深度伪造,威胁着将这种祸害急剧升级,FTC致力于动用所有工具来检测、威慑和制止冒充欺诈。此外,FTC还就修订后的规则是否应明确宣布:为明知或应知其提供的产品或服务(如生成图像、视频或文本的AI平台)会被用于通过冒充来损害消费者的企业提供此类产品或服务属非法行为,征求公众意见。

针对个人冒充的拟议新规

  • FTC主席Lina M. Khan指出,欺诈者正利用AI工具以惊人的精度和更大规模冒充个人。随着声音克隆等AI驱动骗局的兴起,保护美国人免受冒充欺诈比以往任何时候都更加关键。
  • 此项拟议规则的补充通知,是回应在政府与商业冒充规则公众评议期间收到的意见,这些意见指出了个人冒充所带来的额外威胁和危害。
  • 该提案旨在帮助机构威慑欺诈,并为受害消费者寻求赔偿。

最终确定的《政府与商业冒充规则》

  • 该规则赋予FTC更强大的工具来打击冒充企业或政府机构的骗子,使FTC能够直接向联邦法院提起诉讼,旨在迫使骗子退还其通过政府或商业冒充骗局所获资金。这一点尤为重要,因为最高法院在2021年4月的AMG Capital Management LLC诉FTC案中的裁决,极大地限制了该机构要求被告向受害消费者退款的能力。
  • 近年来,政府与商业冒充骗局已使消费者损失数十亿美元,且2023年这两类案件向FTC的报告均显著增加。
  • 规则打击的具体行为示例
    • 在通过邮件或在线与消费者沟通时使用政府印章或商业徽标。
    • 仿冒政府和商业电子邮件及网址,包括仿冒“.gov”电子邮件地址,或使用依赖拼写错误的公司名称的相似电子邮件地址或网站。
    • 通过使用已知与政府机构或商业相关的术语来虚假暗示政府或商业隶属关系(例如,谎称“我来自书记官办公室”以虚假暗示与法院有关联)。

立法进程与时间安排

  • 最终规则的发布经过了自2021年12月预先拟议规则制定通知、2022年9月拟议规则制定通知以及2023年5月非正式听证会以来两轮公众评议。
  • FTC以3-0的投票结果决定发布最终规则和拟议规则制定的补充通知,并将其刊登在《联邦公报》上。
  • 关于时间:关于政府与商业冒充的最终规则将于其在《联邦公报》上刊登之日起30天后生效。针对拟议规则制定补充通知的公众评议期将在其刊登之日起开放60天,评议说明将在通知中包含。
28. DJI – The ART of obfuscation (blog.quarkslab.com)

本文深入分析了DJI Pilot Android应用程序所使用的基于SecNeo的加壳保护机制,重点揭示了其通过劫持Android运行时(ART)来实现运行时字节码注入的独特技术。

核心发现:

  1. 加密与存储:应用的核心业务逻辑代码(DEX文件)并未直接存储在APK中,而是被加密后嵌入在异常庞大的 classes.dex 文件尾部。分析识别出使用 RC4算法 对每个DEX文件的前128KB进行加密。密钥由一个16字节硬编码常量与字符串 "com.dji.industry.pilot" 的前16字节进行XOR生成。

  2. 二次保护与方法窃取:解密后的DEX文件中,大量方法的代码已被“窃取”(即用 nop 指令覆盖),真实的字节码被存储在APK的 assets/classes.dgc 文件中。该文件同样进行了RC4加密,但密钥生成机制更为复杂:基于库内一个4096字节二进制块的MD5哈希,再与通过斐波那契数列确定位置的数据进行XOR操作。

  3. ART运行时劫持机制:这是该加壳技术的核心创新。它不静态修复被窃取的方法代码,而是在应用运行时动态注入:

    • 注入时机:加壳器在 libDexHelper.so 中钩挂(hook)了ART的 Instrumentation::InitializeMethodsCode 函数。
    • 触发条件:当ART验证一个类(通过 ClassLinker::VerifyClass)并调用 UpdateClassAfterVerification 更新该类所有方法入口点时,会触发此钩子。
    • 修复过程:被钩子劫持的函数(称为 PatchMethodCode)会利用方法中的 debug_info_off 作为索引,从 classes.dgc 中查找到该方法被窃取的、经过混淆的字节码。随后,通过一个XOR操作(与 debug_info_off 低字节)并利用一个存储在 libDexHelper.so 中的替代表,将混淆的字节码还原为正确的Dalvik指令,并将这些指令写回方法的原始代码位置。
  4. 工具支持:作者提供了名为 DxFx 的Python概念验证工具,能够静态解包并修复DJI Pilot应用,其代码清晰地展示了上述各个解密和修复步骤的实现逻辑。

结论:该保护方案通过结合文件加密、代码窃取与混淆,并深度利用ART运行时的类加载验证流程实现字节码的动态注入与修复,构成了一套多层次、动态化的代码保护体系,旨在对抗静态分析。

29. Re2c (re2c.org)

re2c 是一个免费开源的词法分析器(lexer)生成器,其名称意为“正则表达式转代码”。它支持生成多种编程语言的代码,包括 C/C++、D、Go、Haskell、Java、JavaScript、OCaml、Python、Rust、Swift、V、Zig,并可通过实现单个语法文件扩展至其他语言。

核心特点与目标:

  • 首要目标是生成高速代码: 将正则表达式编译为确定性有限自动机(DFA),并直接在目标语言中生成直接编码的词法分析器。这种词法分析器通常比表驱动类型的更快且更易于调试。
  • 次要目标是灵活性: 不预设固定的程序模板,允许用户在源代码的任意位置嵌入词法分析器,并配置以避免不必要的缓冲和边界检查。
  • 内部算法: 基于一种特殊的确定性有限自动机——前向确定性有限自动机(lookahead TDFA)。该自动机在保持普通 DFA 速度的同时,能够以极低的额外开销执行子匹配提取。

应用与获取:

  • re2c 被用于多个知名开源项目,如 PHP、ninja、yasm 等。
  • 用户可通过系统包管理器、GitHub 或 SourceForge 获取发布包或源代码。

社区与支持:

  • 项目鼓励通过 GitHub 问题追踪器、讨论区、邮件列表或 IRC 频道进行错误报告、反馈和提问。

许可: re2c 处于公有领域,可自由分发、使用和修改(源代码或二进制形式),无需承担任何责任,也无需付费。由其生成的程序同样可自由分发。

30. Monitoring latency: Cloudflare Workers vs Fly vs Koyeb vs Railway vs Render (www.openstatus.dev)

云服务提供商延迟监控对比

本文通过 OpenStatus 工具,对 Cloudflare WorkersFly.ioKoyebRailwayRender 五个云平台的免费或最低套餐进行了全球延迟测试。测试采用一个简单的Hono应用,并从阿姆斯特丹、阿什本、香港、约翰内斯堡、圣保罗和悉尼六个地点每10分钟监控一次。

⚠️ 注意:使用的是各平台默认设置,且为数据中心间的测试结果。真实应用场景下的结果可能会有所不同。

测试结果摘要

提供商 平均延迟 (ms) 75th百分位 (ms) 99th百分位 (ms) 正常运行时间 失败次数 总探测数 关键观察
Cloudflare Workers 182 138 991 100% 0 10,956 全球延迟最低,无冷启动问题。 但约翰内斯堡节点的路由存在异常,延迟极高。
Fly.io (默认配置) 1,471 1,514 2,547 100% 0 10,952 延迟最高,主因是机器在空闲后会暂停,导致冷启动时间长达约1.5秒。
Fly.io (生产配置,机器常开) 61 67 327 100% 0 12,076 当禁用自动停止后,延迟表现极佳,证明冷启动是主要瓶颈。
Koyeb 539 738 1,525 100% 0 10,955 平均延迟中等。请求会经过Cloudflare边缘层。
Railway 381 469 850 99.991% 1 10,955 延迟表现较好。免费套餐无法选择区域,本次测试实例位于美国俄勒冈州,因此到IAD(阿什本)的延迟最低。应用默认不会缩容至零,无冷启动问题。
Render 451 447 902 99.89% 12 10,946 平均延迟中等,但失败次数最多。尽管文档称免费服务在15分钟无流量后才会休眠,但测试中出现了多次失败,怀疑与冷启动或启动时间过长(可达50秒)有关。

关键发现与结论

  1. 延迟与冷启动:Cloudflare Workers凭借其全球边缘网络提供了最快且稳定的响应,完全避免了冷启动延迟。Fly.io在默认配置下因冷启动导致延迟极高,但通过配置机器保持运行(生产模式),其延迟可以变得极低。
  2. 路由问题:Cloudflare Workers在约翰内斯堡的请求未能被路由到最近的边缘节点,导致了异常高的延迟。
  3. 平台选择建议
    • 追求全球低延迟:首选 Cloudflare Workers
    • 多区域部署:可考虑 KoyebFly.io(需注意冷启动配置)。
    • 特定区域部署RailwayRender 是合适的选择。
  4. 整体考量:选择云提供商时,延迟只是因素之一,还需综合考虑使用体验、功能和价格。作者在生产环境中使用Fly.io并对其表示满意。
31. Endgame: A dashboard exploit for the original Xbox (github.com)

ENDGAME:初代Xbox通用仪表盘漏洞利用

概述 ENDGAME是一个针对初代Xbox(原版微软Xbox)的通用仪表盘漏洞利用工具。此漏洞利用经过精心设计,兼容初代Xbox发布的所有零售版内核和仪表盘版本。它无需特定游戏,甚至不需要光驱正常工作,仅需一个内存卡即可运行。该漏洞向量由@shutterbug2000最初在仪表盘中发现并演示,随后由@gaasedelen利用一个相邻漏洞开发成ENDGAME,实现了更强大的控制和更通用的利用策略。

免责声明 本项目不使用任何版权代码,也不帮助绕过Xbox主机的安全机制。成功执行后,ENDGAME将从内存卡根目录启动一个使用habibi密钥签名的XBE文件。它不会修补内核代码,也不允许启动零售签名的可执行文件。使用本软件,用户需自行承担主机数据完全丢失或损坏的风险。

构建与使用

  • 构建:可使用Windows上的Python 3和NASM从零生成漏洞利用文件。
  • 文件结构:将生成的ENDGAME/目录内容复制到Xbox内存卡,其根目录结构如下:
    • /helper/
    • /trigger/
    • /payload.xbe (可以是任意你选择的habibi签名XBE文件)
  • 触发:将内存卡插入控制器,然后在仪表盘中访问该内存卡。几秒钟后,主机前面板的LED灯应开始按绿/橙/红色循环,表示成功,随后将启动内存卡上的payload.xbe

常见问题解答 (FAQ)

  • 是软模组吗?:本身不是,但它将使社区将软模组集成到现有解决方案中变得显著更加容易
  • 新特性:使人们无需特定游戏即可对任何版本的初代Xbox进行软模组,并轻松启动自制XBE(如Insignia设置助手或内容扫描工具)。
  • 无内存卡?:可以使用任何FATX格式化兼容的USB设备和控制器端口适配器。
  • 错误21:你的XBE必须使用habibi密钥签名(例如使用xbedump工具)。
  • 黑屏问题:最常见的原因是你的XBE可能使用了Debug/XDK内核thunk与入口点XOR密钥,而非零售版密钥,导致崩溃。
  • 系统重启到仪表盘:虽然不常见,但表明漏洞利用可能已崩溃。建议在冷启动后直接导航到内存卡以提高成功率。
  • XBE需要外部文件:不支持。当前ENDGAME仅设计用于复制并执行独立的XBE文件

漏洞原理 此漏洞利用针对仪表盘处理存档图片时的一个整数溢出。当仪表盘尝试解析内存卡上特别制作的映像时,ENDGAME可获取任意代码执行能力。

作者

  • shutterbug (@shutterbug2000):漏洞发现与初步利用工作。
  • Markus Gaasedelen (@gaasedelen):根本原因分析与ENDGAME开发。
  • xbox7887 (@xbox7887):次要贡献与测试协助。