2024-01-29

50 篇热帖

2. Florida House of Representatives approves bill to ban social media for kids < 16 (abcnews.go.com)

佛罗里达州众议院近期通过了一项名为“众议院第1号法案”的严格立法,旨在禁止16岁以下青少年使用大多数社交媒体平台,且无需获得父母同意。该法案以106票赞成、13票反对的结果获得通过,得到了两党多数支持,随后将交由共和党控制的参议院审议。

法案主要针对以下类型社交媒体平台:会追踪用户活动、允许用户上传内容或采用成瘾性设计导致用户强迫性使用的网站。法案要求社交媒体网站采用“合理的年龄验证方法”核实用户年龄,并允许终止未满16岁用户的账户,包括删除已有账户信息。目前,大多数社交平台设定的最低用户年龄为13岁。

此举发生在社交媒体对青少年影响引发广泛社会关注的背景下。近期,美国主要社交媒体公司的首席执行官出席国会听证会,旨在推动联邦立法以保护儿童在线安全。参议院司法委员会主席称在线儿童剥削已成为“美国的危机”。此外,纽约市市长也将社交媒体列为“公共健康危害”和“环境毒素”。

社交媒体公司对此作出回应。Meta(Facebook和Instagram母公司)此前已宣布一系列针对青少年的新安全措施,同时表示社交媒体监管应由联邦政府主导,并认为父母的同意应足以允许青少年使用社交平台。美国心理协会去年首次发布相关指南,建议为青少年设置使用时间限制并鼓励家庭讨论。美国卫生局局长也发出警告,指出社交媒体使用对青少年心理健康构成紧迫的公共卫生问题,并呼吁各方共同承担保护责任,包括政策制定者通过立法限制有害内容访问、加强数字素养教育及增加相关研究投入。

3. Eagle 7B: Soaring past Transformers (blog.rwkv.com)

Eagle 7B 模型总结

核心概述

Eagle 7B 是一个拥有 75.2亿参数 的基础模型,基于 RWKV-v5 架构(一种线性 Transformer)。该架构的特点是推理成本比传统 Transformer 低 10-100 倍以上,被誉为“世界上最绿色的 7B 模型”(以每 token 计算)。

关键特性与性能

  • 训练数据:在超过 100 种语言1.1 万亿个 token 上进行训练。
  • 多语言能力:在 23 种语言 的常识推理基准测试(如 xLAMBDA, xStoryCloze)中,其性能远超之前的 RWKV-v4 架构,达到了世界领先水平。
  • 英语性能:在 12 项英语基准测试中表现突出。与 RWKV-v4 相比有巨大提升,开始在 MPT-7B(同为 1T token 训练量级)的基准上互有胜负,并在部分测试(如 LAMBADA, WinoGrande)中超越了 Falcon-7BLLaMA2-7B。其性能水平与其约 1.1T token 的训练量预期相符。
  • 与顶级模型差距:与据传使用 2~7 万亿 token 训练的 Mistral-7B 相比仍有差距,团队计划通过增加训练数据来缩小这一差距。
  • 架构优势:作为“无注意力 Transformer”,其线性复杂度带来的低计算成本是核心优势,有望降低 AI 普及门槛和环境影响。

开源与可用性

  • 许可:采用 Apache 2.0 许可证,在 Linux 基金会 下发布,可用于个人或商业用途。
  • 获取与使用:可从 HuggingFace 下载,支持本地运行,并提供了参考推理包、社区推理选项(如桌面应用、RWKV.cpp)及微调工具。

多语言愿景与挑战

团队明确表示,尽管多语言训练可能影响英语基准分数,但其目标是为全世界而不仅仅是英语世界构建 AI。通过支持全球前 25 种语言,可覆盖约 50% 的人口。他们承认当前基准测试仅覆盖 23 种语言,评估剩余 75+ 种语言的能力存在困难,但计划在未来模型中改进并逐步扩展语言支持,目标是最终覆盖全球所有语言。

技术观察与证据

  • 在约 3000 亿 token 的检查点上,其性能与 Pythia-6.9B 相似,这与在 RWKV-v4 上的实验一致,表明线性 Transformer 的性能缩放规律与传统 Transformer 相似
  • 这一结果引发了关于架构与数据在决定模型评估性能中孰轻孰重的讨论。

未来计划(约 2024 年)

  1. 2024 年 2 月:发布更新的 RWKV-v5 Eagle 论文,并将训练数据量追加 1 万亿 token(总计 2 万亿),以便与 LLaMA2-7B 直接对比。
  2. 2024 年 3 月:基于 2T token 的 Eagle 模型开发 MoE(混合专家)模型;发布 RWKV-v6 “Finch” 的 1.5B 和 3B 世界模型。

致谢

感谢 StabilityAI 提供的主要计算资源、EleutherAI 的支持(特别是在论文撰写方面)以及 Linux 基金会 AI & Data 部门 的托管。

5. Show HN: WhisperFusion – Low-latency conversations with an AI chatbot (github.com)

WhisperFusion:实现超低延迟AI对话

WhisperFusion 通过整合 WhisperLive(实时语音转文本)和 WhisperSpeech(文本转语音)的能力,并在其上集成 Mistral 大型语言模型,构建了一个实现超低延迟无缝对话的AI聊天机器人系统。

核心特性

  • 实时语音转文本:利用 OpenAI 的 WhisperLive 将语音实时转换为文本。
  • 大语言模型集成:集成 Mistral LLM,以增强对转录文本的理解和上下文处理能力。
  • TensorRT 优化:LLM 和 Whisper 均被优化为 TensorRT 引擎,确保高性能和低延迟处理。
  • torch.compile 加速:WhisperSpeech 使用 torch.compile 进行推理加速,通过即时编译 PyTorch 代码为优化内核来提升速度。

硬件要求

  • 需要至少 24GB 显存的 GPU。
  • 为获得最佳延迟,GPU 的 FP16 性能应与 RTX 4090 相当。
  • 演示在单块 RTX 4090 GPU 上运行,但系统支持多 GPU 以进一步提升性能。

部署与运行

项目提供基于 Docker Compose 的快速部署方案,包含了预构建的 TensorRT-LLM 容器,其中已集成转换好的 Whisper 和 LLM(如 Phi-2)引擎,以及预下载的 WhisperSpeech 模型。

快速启动步骤:

  1. 创建目录并复制脚本:
    mkdir docker/scratch-space
    cp docker/scripts/build-* docker/scripts/run-whisperfusion.sh docker/scratch-space/
    
  2. 构建并运行(默认使用 phi-2 模型,可更改为 Phi-3 等):
    docker compose build
    export MODEL=Phi-3-mini-4k-instruct    # 可选项:Phi-3-mini-128k-instruct 或 phi-2
    docker compose up
    
  3. 启动后,可通过浏览器访问 http://localhost:8000 使用 Web GUI 进行交互。

联系方式

如有问题,可通过在项目中开启 issue 或发送邮件至 marcus.edel@collabora.com 等地址联系开发者。

8. New Renderers for GTK (blog.gtk.org)

GTK 新渲染器(ngl 与 vulkan)技术总结

核心概述

GTK 近期推出了两个全新的渲染器:基于 OpenGL 的“ngl”和基于 Vulkan 的“vulkan”。两者采用相同的源代码构建,被称为“统一(unified)”渲染器,旨在提升渲染的正确性、可维护性并引入多项图形新特性。

架构与实现细节

  • 单一代码源:架构以 Vulkan API 为模型,通过抽象层兼容 GL(GL 3.3+ 和 GLES 3.0+)。这实现了场景图遍历、状态维护及纹理/字形缓存等基础设施的代码共享。未来有望通过着色器转换扩展至 Metal 或 DirectX。
  • 渲染机制:摒弃了旧版 GL 渲染器依赖离屏渲染和简单着色器的做法。新渲染器采用更强大的逐节点着色器,并引入“ubershader”(从缓冲区解析数据的复杂着色器),从而能更准确地处理复杂的渲染节点树。

新特性与能力提升

  • 抗锯齿:有效保留精细细节(如文本下划线),消除图元边缘锯齿。
  • 分数缩放:基于抗锯齿实现精确的分数缩放,通过分配准确尺寸的帧缓冲区,提供更清晰且更节省像素资源的图像。
  • 任意渐变:支持无限数量的颜色色标,并对渐变边缘进行抗锯齿平滑处理。
  • Dmabufs 支持:支持 dmabuf 和图形卸载,Vulkan 渲染器可通过 API 直接创建 dmabuf 纹理。

开发者注意事项

  • 废弃 glshader 节点:新渲染器不再支持旧版 glshader 节点,建议改用 GTK 4.0 后引入的 mask nodes 或 straight-alpha 纹理等替代方案。
  • 分数位置处理:新渲染器不再自动对分数坐标进行四舍五入,开发者需确保位置精确,特别是在进行半像素级别的 Cairo 风格绘制时。
  • 驱动兼容性:新渲染器以全新方式调用图形驱动,可能暴露潜在的驱动问题,官方鼓励开发者积极反馈以完善兼容性。

性能表现与默认设置

  • 性能:目前新渲染器尚未在速度上超越高度优化的旧版 GL 渲染器,但均能轻松满足 60 至 144 fps 的日常渲染需求。Vulkan 渲染器在部分测试中已接近或超越旧版。
  • 默认设置:在 GTK 4.13.6 快照中,“ngl”被设为默认渲染器以进行广泛测试。Vulkan 因在 WebKit GTK4、GtkGLArea 等组件的纹理集成上尚存问题,暂未作为默认。旧硬件用户可通过设置环境变量 GSK_RENDERER=gl 切换回旧版渲染器。

未来规划

新渲染器为后续开发奠定了基础,未来中短期计划实现:

  • 完善的颜色管理(包括 HDR 支持)。
  • 基于 GPU 的路径与字形渲染。
  • 非主线程渲染。
  • 针对老旧和低性能设备的性能优化。
9. Amazon and iRobot call off their planned acquisition (www.cnbc.com)

亚马逊与iRobot终止收购计划

交易取消原因
亚马逊与iRobot于2024年1月29日宣布终止原定17亿美元的收购协议,主要原因是无法获得欧盟监管机构的批准。欧盟委员会初步调查显示,该交易可能使亚马逊利用其在线市场主导地位限制iRobot竞争对手,例如通过降低竞品在搜索结果中的曝光度,导致机器人吸尘器市场竞争减弱、价格上涨和创新放缓。

iRobot应对措施

  • 裁员与领导层变动:iRobot将裁员31%(约350人),其创始人兼CEO科林·安格尔(Colin Angle)即日辞职。
  • 业务调整:公司将聚焦利润率改善,削减研发投入,并暂停非地板清洁产品(如空气净化器、割草机器人)的开发。
  • 财务影响:亚马逊需支付9400万美元分手费。iRobot此前曾从凯雷集团获得2亿美元过渡性融资以维持运营,目前市值已降至不足4亿美元。

监管背景
该交易原于2022年提出,但欧盟委员会于2023年7月展开调查,认为亚马逊可能借此削弱市场竞争。此前,英国竞争与市场管理局已批准该交易,但欧盟的反对成为关键障碍。全球监管机构近年来对科技巨头并购审查趋严,类似案例包括Meta收购Giphy、Adobe收购Figma以及微软投资OpenAI等交易受阻。

市场与行业反应
消息公布后iRobot股价下跌10%。亚马逊发言人表示失望,iRobot则承诺将继续专注于智能家用机器人创新。此次交易失败反映了监管机构对科技巨头市场垄断的警惕,尤其关注并购对消费者选择、价格和创新的长期影响。

10. The Apple Vision Pro’s missing apps (stratechery.com)

苹果Vision Pro头显在预售期间遭遇了Netflix、YouTube和Spotify等主要流媒体平台的“缺席”,这些公司均拒绝为其开发原生应用,甚至不允许现有的iPad应用在该设备上运行。这一现象被视为苹果开发者关系的一次重大挫折。

科技评论家Om Malik认为,Vision Pro凭借其超高清显示和沉浸式音频,有望成为终极的个人化媒体消费设备,取代传统家庭影院。然而,这款旨在革新观影体验的设备,却未能获得全球最大视频服务商Netflix和最大在线视频平台YouTube的支持,用户只能通过网页浏览器访问其内容,这显著削弱了设备的实用价值。

文章回顾了苹果的商业历史,指出其成功往往建立在“大棒”而非“胡萝卜”的策略上。无论是早期iPod借助音乐盗版的现实与唱片公司达成协议,还是后来通过App Store的严格政策和30%的抽成模式控制开发者,苹果都倾向于利用其市场支配力来确保自身利益。Epic Games的反垄断诉讼虽然一度迫使苹果允许应用内引导用户至网页支付,但苹果以极为限制的方式执行,并对开发者网页交易也收取高达27%的费用,进一步强化了其强硬立场。

当前大开发者对Vision Pro的抵制,可以视为这种长期积累矛盾的一次爆发。在设备用户基数尚小的情况下,开发者缺乏动力去适应苹果苛刻的分成和限制政策。他们选择“罢工”,利用这次不会像挑战Epic那样引发直接后果的机会,表达不满。

面对这一困局,苹果的短期策略可能是依靠产品本身的吸引力等待用户基数增长,从而倒逼开发者加入。更长远的解决方案可能是加强自身内容投入,并深化与迪士尼等合作方的关系,特别是通过投资ESPN的流媒体服务,利用Vision Pro无与伦比的体育观赛体验来弥补内容生态的缺口,并以此作为竞争筹码。

12. GitHub Spam (djanes.xyz)

GitHub上的垃圾信息问题日益严重,尤其以加密货币诈骗为主。这些垃圾信息通常通过拉取请求或议题发布,批量标记多个真实用户后迅速被发布者删除,以此规避过滤器和举报机制。用户会收到包含完整垃圾信息的邮件,但由于内容已删除,举报极为困难。

近期一次案例中,一篇诈骗拉取请求持续存在,其搜索结果显示了超过800条类似垃圾信息(819条),且大量为最近24小时内发布。每条信息标记多达20个用户,总计可能影响上万个账户。发布者账户通常具有一致特征:无头像、创建数年但无提交或仓库、或仅有一次性提交的开源项目仓库。

当前GitHub的举报流程异常繁琐,需要7个步骤跨越3个页面,这导致用户普遍放弃举报。作者认为这种信任与安全方面的用户体验未受到足够重视。

针对问题,作者提出几点改进建议:

  1. 检测短时间内大量发布相似内容的用户,并结合账户活动(如无仓库、无提交、无头像)进行风险评级。
  2. 全站比对评论内容,识别使用相同标题、正文、链接且批量标记不同用户的行为。

作者指出,随着生成式AI能创造更多变体以绕过相似性检测,内容审核将更具挑战。尽管GitHub可能已在处理此问题,但需要更切实的计划和投入,例如训练AI模型自动过滤或在发布前进行风险评估,将可疑内容转入人工审核。垃圾信息并非新问题,但其在GitHub上的泛滥正日趋严重,平台亟需加强应对。

13. Why Walmart pays its truck drivers 6 figures (www.freightwaves.com)

沃尔玛为何支付卡车司机六位数薪资

沃尔玛卡车司机的平均年薪可达11万美元,是全美卡车司机中位数薪资的两倍,远高于沃尔玛普通员工17.5美元的时薪。此外,公司司机还享有回家时间、带薪休假和优质医疗保险,这在卡车运输行业中较为罕见。这种高薪和福利使得沃尔玛司机对公司表现出罕见的忠诚度,尽管卡车运输行业通常人员流动率极高。

高薪背后的战略意义 沃尔玛支付高额薪资并非出于公司慷慨,而是因为卡车司机是其零售主导地位的关键。公司从创立之初就高度重视供应链效率。早期,由于沃尔玛门店多位于偏远地区,传统运输公司不愿前往,迫使创始人山姆·沃尔顿自建配送网络和供应商体系。这种对供应链的专注使得沃尔玛能够精细控制商品成本和配送,从而实现低价优势。

沃尔玛车队的特殊性 沃尔玛拥有约14,000名卡车司机,其车队规模可与一些最大的公共车队相媲美。公司的庞大体量(拥有4,616家门店,远多于其他零售商)、商品组合的复杂性(兼营杂货和一般商品)以及由此形成的对设备制造商和运输服务提供商的议价能力,使其供应链管理与众不同。高效可靠的运输确保了商品及时上架,直接影响客户体验和公司营收。

招聘策略的转变 近年来,沃尔玛调整了卡车司机招聘策略。2023年,公司推出了“员工转司机”计划,允许现有员工参加为期12周的培训以获得商业驾驶执照,从而无需外部经验即可成为公司司机。这一举措旨在挖掘内部人才、控制培训质量,并更好地传承沃尔玛的企业文化。不过,外部申请者仍需具备30个月的驾驶经验。

司机短缺的争议 部分沃尔玛司机对新政策表示担忧,认为公司可能正转向类似大型公共车队的高流动率模式。这触及了卡车运输行业长期存在的“司机短缺”争论。运输企业普遍声称存在结构性短缺,但研究者和司机本人认为,高流动率源于薪酬和工作条件问题,而非真正短缺。对于像沃尔玛这样提供高薪和福利的公司,理论上不应面临严重短缺,但公司仍需不断招聘以应对扩张和司机退休。

结论 沃尔玛为司机支付六位数薪资是其供应链战略的核心组成部分,旨在确保运营效率和竞争优势。公司近期调整招聘政策,从注重外部经验转向内部培养,这既是应对市场变化的举措,也可能意在加强司机队伍的管理与文化契合度。尽管行业对司机短缺存在争议,但沃尔玛通过高薪和福利维持了相对稳定的司机队伍,支撑其庞大的零售网络。

14. I need to grow away from these roots (www.vitling.xyz)

概述

该作品是一个结合算法音乐与动态灯光装置的创意项目。其核心是一个自动化系统,通过特定的音乐生成规则来控制声音输出和视觉效果,最终表现为一个与植物生长形态相关的发光雕塑。

乐谱说明

作品的乐谱由四个部分定义:

  • A部分(和弦进行):程序从A2到D5音域内枚举所有大、小、大七、小七和弦及其所有转位,形成一个和弦集。系统从中随机选取一个和弦播放8秒,然后找出所有仅有一个音符与当前播放和弦不同的和弦,再随机选择其中一个作为下一个和弦,此过程无限循环。
  • B部分(音符播放):在A部分当前播放的和弦基础上,随机选择一个音符,使用随机的波形和随机的时长进行播放。若时长较短则可能重复播放该音符,然后等待随机时间后重新开始此流程。
  • C部分(主干灯光):每当A部分触发一个新和弦时,对应和弦中每个音符的颜色会以从根部到尖端的顺序依次点亮雕塑的“茎干”。在五度圈中相邻的音符使用相似的色相。
  • D部分(尖端灯光):每当B部分播放一个音符时,会点亮某一“茎干”顶端的一小块颜色,该颜色与播放的音符相对应。

实现与构造

  • 技术实现:乐谱的A、B部分由运行在树莓派3 B+上的自定义C++程序实现,负责音符选择与音频合成。C、D部分则由运行自定义程序的Arduino Uno板实现,通过FastLED库控制WS2812B协议的LED灯带。树莓派通过串口向Arduino发送信号以传递音符信息。
  • 物理构造:LED灯带穿过为家庭水族箱设计的透明管道。这些管道使用粗镍线加固,可塑造成特定的雕塑形态。一个位于花盆下方的木质外壳容纳了树莓派、Arduino、接线以及一个用于连接音响系统的3.5mm音频接口。系统通过两个主电源连接供电,并能在通电后无头(无需显示器或输入设备)自动启动。
15. What I talk about when I talk about query optimizer (part 1): IR design (xuanwo.io)

本文是系列文章的第一篇,专注于讨论SQL查询优化器中间表示(IR)的设计。作者基于个人最佳工程实践,从零开始构建了一个名为“The IR”的SQL IR系统。

核心概念

  1. 查询优化器:文中将其定义为从SQL解析器到执行器的全部组件,负责将SQL语句优化为执行计划。
  2. IR(中间表示):借鉴编译器技术,为SQL设计结构化的表示形式,以便进行分析和优化。其理论基础是关系代数,目前主流数据库均采用此抽象。

IR设计演进

作者使用Rust语言,逐步构建IR:

  • 起点:用Get结构体表示最简单的SELECT * FROM t
  • 扩展:引入Select(过滤)和Project(投影)操作符。最初使用字符串表示谓词和表达式,后发现不足。
  • 类型与结构优化:采用Rust的enum(ADT)定义Operator,形成灵活的操作符树。同时,为表达式设计更丰富的ScalarExpr IR,确保标识符解析、类型注入和子查询处理。
  • 完整体系:最终得到的The IR包括:
    • Operator:树状结构,涵盖GetSelectProjectJoinUnionAllAggregate等操作。
    • ScalarExpr:携带类型和标识信息的标量表达式。

属性推导

  • 目的:为优化分析IR节点属性。
  • 方法:利用SQL的数据流特性,通过递归计算子节点属性来推导当前节点属性,分为:
    • 关系属性:描述数据集特征,如列信息、基数、统计信息、约束、函数依赖。
    • 物理属性:描述数据物理特征,如排序、并行度、数据分布。
  • 关键实现:属性推导需处理ProjectAggregate中的派生列,这引入了类似作用域的概念。

属性表示与ID设计

早期使用列名表示属性,但遇到歧义问题(例如同名列、关联子查询)。文章重点讨论了两种属性ID设计:

  1. 局部ID:基于元组中属性的索引。优点:无需外部状态;缺点:操作符转换时需频繁重映射。
  2. 全局ID:使用唯一标识符(如i64)。优点:解耦属性与模式,简化属性推导(可用集合操作);缺点:依赖外部状态,复制操作符树时需生成新ID。

作者认为全局ID设计更优,尽管某些优化(如利用索引避免全表扫描)实现起来较复杂,但它能简洁处理大多数情况(如Join顺序交换、关联子查询)。最终重构的IR采用全局ID,将名称解析等复杂性转移至AST降级阶段,使IR本身更简洁、独立。

应用示例

文章展示了基于The IR实现谓词下推优化。通过推导属性,检查谓词依赖的列是否仅来自子节点,从而安全地将Select操作下推至ProjectJoin的子节点,减少计算量。

总结

本文系统阐述了SQL查询优化器IR的设计哲学与实现路径。核心观点是:一个优秀的IR应具备简洁的代数结构、操作符独立性,并尽可能通过唯一ID而非名称来标识属性,从而为后续优化算法提供坚实基础。作者强调了这些工程经验在数据库领域的稀缺性,并计划在后续文章中探讨优化器架构。

16. Two handy GDB breakpoint tricks (nullprogram.com)

本文分享了两个实用的GDB断点调试技巧。

技巧一:可继续断言

传统的assert宏或abort()会导致程序无法继续调试。作者建议使用以下变体,但它们同样不具备继续执行的能力:

#define assert(c)  while (!(c)) __builtin_trap()
#define assert(c)  while (!(c)) __builtin_unreachable()
#define assert(c)  while (!(c)) *(volatile int *)0 = 0

MSVC生态使用int3(或__debugbreak)中断指令,它允许程序继续。GCC中可用内联汇编asm("int3")。然而GDB无法正确处理单纯的int3,因为它会使指令指针指向int3的下一条指令,导致GDB在错误的位置(如循环的下一次迭代)中断。

解决方案:在int3后添加一条nop指令。

#define breakpoint()  asm ("int3; nop")

这能确保指令指针“停留在”断点处,解决了GDB的定位问题。这种结构既可作为可继续断言的基础,也可用作高效的条件断点,比GDB自带的条件断点快得多。

技巧二:命名位置断点

GDB支持三类断点位置:符号、源码行号和绝对地址。其中基于源码行号的断点在代码修改后容易“漂移”,需要手动调整,比较繁琐。

解决方法:通过添加标签来为特定代码行命名,从而获得类似符号的稳定性。

  1. 使用C/C++标签

    for (int i = 0; i < n; i++) {
        loop:  // 此处可命名为 example:loop
        // ...
    }
    

    可使用__attribute__((unused))消除编译器的-Wunused-label警告。

  2. 使用内联汇编标签(更常用):

    for (int i = 0; i < n; i++) {
        asm ("b:");
        // ...
    }
    

    有时也需要添加nop以便GDB能准确设置断点。

命名后,可以像使用普通符号一样使用该名称设置断点或跟踪点(如dprintf),即使源码发生改动,只要标签在,断点就依然有效。

18. Modern CSS One-Line Upgrades (moderncss.dev)

这篇文章介绍了12个可以轻松集成到项目中的现代CSS属性,它们能通过简单的单行代码升级,有效减少技术债务、移除不必要的JavaScript,并提升用户体验。这些属性分为三个类别:

稳定升级

这些属性已被良好支持,可通过替代旧技巧来修复已有的问题或hack。

  • aspect-ratio:取代了传统的“padding hack”来定义元素的宽高比(如16:9的视频或1:1的正方形)。它具有容错性,当内容超出比例时,元素仍可扩展。
  • object-fit:使图片或其它替换元素的内容以类似背景图的方式调整大小,常用值包括cover(覆盖元素并保持比例)和scale-down(在不裁剪的前提下保持比例显示)。与aspect-ratio配合可防止图片变形。
  • margin-inline:逻辑属性,用作水平书写模式下左、右边距的简写,可替代分别设置margin-leftmargin-right的做法,对国际化的网站尤为重要。

稳定增强

这些属性得到良好支持,能提供更好的体验,有时可替代旧方法甚至JavaScript解决方案,通常无需回退方案。

  • text-underline-offset:控制文本基线与下划线之间的距离,可用于清除文字下行部分(descenders)并提高可读性,是重置样式的常用属性。
  • outline-offset:控制轮廓与元素边框之间的距离(正值向外,负值向内),可用于改善焦点可见性的可访问性。
  • scroll-margin-top/bottom:为元素在滚动上下文中添加偏移量,能解决使用粘性导航栏时,锚点链接激活后内容被遮挡的问题。
  • color-scheme:允许元素(通常是:root)声明对暗色或亮色主题的偏好,从而让浏览器以对应模式渲染表单控件、滚动条等UI元素,便于实现暗黑模式。
  • accent-color:用于修改单选框、复选框、进度条等表单控件的强调色(如选中状态或填充色),快速实现自定义主题。
  • width: fit-content(或逻辑属性inline-size: fit-content):使元素宽度收缩包裹其内容,类似display: inline-block的效果,但不会改变元素的显示类型。

渐进增强

这些较新的属性在支持时能提供升级体验,而在不支持的浏览器中也不会造成破坏,因此通常无需回退方案。

  • overscroll-behavior:通过设置值为contain,可将滚动行为隔离在特定区域内(如侧边栏),防止滚动到边界时,交互意外传递到背景页面。
  • text-wrap:通过balance(均衡每行字符数,适用于标题)和pretty(避免孤字独占最后一行)值改善文本排版,但使用范围需酌情控制以优化性能。
  • scrollbar-gutter:在布局中预留滚动条的空间,防止滚动条出现或消失时引起布局偏移。注意,此属性在系统使用“覆盖式”滚动条(如macOS)时无效。

文章总结指出,这些属性是提升CSS代码库和用户体验的快捷方式,鼓励开发者逐步采用,以减少对旧技巧和JavaScript的依赖。

19. General purpose MCUs built in to LEDs emulate candle flicker (cpldcpu.wordpress.com)

内置通用MCU的LED仿蜡烛闪烁灯分析

本文分析了一款具备定时功能的仿蜡烛LED茶蜡灯。该灯在启动6小时后自动关闭,18小时后自动开启,模拟日常使用场景。

产品结构与发现

外观为典型LED茶蜡灯,使用CR2032电池。内部结构极简:仅一颗5mm LED和塑料开关部件。开关通过移动LED的一个引脚与电池接触,无需额外金属件。关键发现是:LED封装内集成了一颗IC和小型LED芯片。

通过显微镜观察IC芯片,发现其尺寸较大,有较多未使用焊盘(8个中使用3个)。芯片区域包括类似存储器的矩形结构、疑似逻辑合成区域以及手工设计的模拟部分,暗示可能是一颗微控制器。

识别与推测

芯片焊盘位置与PIC12F508/9完全对应:VDD/VSS用于供电,GP0连接至LED。作者推测这并非原装Microchip产品,而很可能是成本仅约1美分/颗的PIC衍生OTP(一次性可编程)微控制器。这表明厂商未设计专用ASIC,而是直接将通用MCU封装进LED中。

电气特性分析

通过串联220欧姆电阻测量电流瞬态:

  • LED以约125Hz的PWM频率驱动。
  • 检测到1MHz主时钟下的电流瞬态,表明MCU在持续运行。
  • 6小时后进入“睡眠”模式时,LED停止PWM,但MCU仍以1MHz运行。
  • 此时平均电流为240µA(测量电压53mV/220欧姆)。

功耗与寿命评估

当前设计功耗较高:

  • 电池CR2032(220mAh)在待机下仅能维持约38天。
  • 考虑到工作时的高电流(约2mA),实际有效容量约150mAh,总工作时间约50小时。

优化可能性

若将待机电流从240µA降至2µA(例如采用具有深度睡眠模式的MCU如PFS154或ATtiny402),电池寿命可显著提升:

  • 每日能耗从16.3mAh降至12mAh。
  • 理论工作时间从9.2天延长至12.5天。 但优化空间主要仍在降低工作模式下的电流消耗。

结论

至2023年,开发专用蜡烛闪烁ASIC已不再经济。超低成本8位OTP微控制器正广泛应用于各类廉价电子产品中。当前实现虽存在功耗优化空间,但通用MCU方案已成为主流趋势。

20. Why is Maxwell's theory so hard to understand? (2007) [pdf] (www.damtp.cam.ac.uk)

麦克斯韦理论为何难以理解?

历史背景与初期忽视

  • 1865年,詹姆斯·克拉克·麦克斯韦发表了《电磁场的动力学理论》,但该理论在随后二十多年里被广泛忽视。
  • 麦克斯韦本人谦虚过头:在1870年英国科学促进会的主席演讲中,他未重点强调自己的电磁理论,反而大力推崇威廉·汤姆森(开尔文勋爵)的分子涡旋理论,仅轻描淡写地提及“另一种我偏爱的电学理论”,导致听众未能认识到其重要性。
  • 物理学家迈克尔·普平在1883年寻找理解麦克斯韦理论的人时,发现即使麦克斯韦去世四年后,仍少有物理学家掌握其理论;最终他在柏林从赫尔曼·冯·亥姆霍兹处学到该理论。

理论难以理解的原因

  • 抽象性与机械模型的冲突:麦克斯韦用场取代了牛顿式的超距作用,但当时科学家试图用机械模型(如小轮和涡旋)来可视化场,导致理论显得复杂笨拙。
  • 数学语言与物理概念的脱节:麦克斯韦使用物理语言解释理论,数学家觉得难懂;方程复杂,且缺乏明确实验支持,与其他电学理论相比无直观优势。
  • 两层结构的本质:麦克斯韦理论将世界分为两层:
    • 第一层:由满足线性方程的抽象场(如电场、磁场)构成,不可直接观测。
    • 第二层:包含可直接测量的物理量(如能量、应力),是第一层量的二次或双线性组合。
  • 这种抽象性体现在单位中:例如电场强度的单位是“焦耳/立方米的平方根”,这是一个数学抽象,无法直接测量。

与量子力学的类比

  • 结构相似性:量子力学同样具有两层结构:
    • 第一层:波函数、矩阵或状态向量,满足线性方程,不可直接观测。
    • 第二层:可观测的物理量(如概率、强度),是第一层量的平方或乘积。
  • 理解挑战:两者都需放弃经典语言(如机械模型或日常用语),转向抽象数学语言。量子力学的解释争议(如哥本哈根诠释、多世界诠释)源于试图用不合适的经典概念描述量子世界。
  • 数学作为共同语言:麦克斯韦理论和量子力学都需通过数学来揭示其优雅和透明性;场或波函数的抽象单位(如波函数的“1/立方米的平方根”)凸显了这种抽象本质。

长期影响与重要性

  • 物理学的原型:麦克斯韦理论是20世纪物理学的基石,启发了爱因斯坦的相对论、量子力学、杨-米尔斯理论及粒子物理标准模型。
  • 概念革新:它引入了动力学场的概念,奠定了现代物理的基础,其两层结构在所有这些理论中重现。
  • 未来展望:深入理解麦克斯韦理论有助于澄清量子力学的误解,并指引21世纪物理学的进一步突破。数学语言是理解自然的关键,超越了人类直接经验的局限。
23. Dorf Fort (2020) (www.androidarts.com)

《矮人要塞》(2020) 文章摘要

个人游戏背景

作者自2006年起接触《矮人要塞》,当时游戏仍为2D版本。如今游戏的3D化使得入门门槛更高。作者不使用任何实用工具或模组,但会修改游戏调色板、自定义字符集并启用TTF字体显示。

游戏改进的四个核心建议

作者为原版游戏提出四项主要改进建议:

  1. 更有效的字形符号:建议采用旧式游戏中更具象的1位图绘制,并可在游戏内编辑器中添加。
  2. UI重构与鼠标控制:对用户界面进行重组,并引入鼠标操作支持。
  3. 音效系统:为警报和关键活动(如发现敌人、完成神器、角色死亡、拉动杠杆)添加音效,以提供氛围和反馈,而非添加如骆驼闲置等环境音。
  4. 快速开始世界:提供一个独立的快速开始世界,包含一个功能性的微型要塞(含农场、房间和酒馆),并配备精心设计的吉祥物角色,以帮助新手启动游戏并熟悉机制。

用户界面(UI)操作思考

  • 键盘:地图导航较慢,但连续菜单选择迅速(在熟悉操作的前提下)。难以实现悬停工具提示,除非通过方向键实现项目高亮/选择系统。
  • 鼠标:地图导航迅速,悬停信息查看方便,但连续菜单选择较慢。可通过更密集的菜单项布局和上下文菜单来缓解。
  • 个人偏好:作者更倾向鼠标,因其地图导航快速,且能提供悬停信息。键盘与鼠标结合时可能存在冲突,但键盘可用于快速选择构建菜单、切换标签页和输入文本。

UI重构设想

作者设想将界面明确划分为 “监视面板”(两个“眼睛”,用于观察,如实时显示矮人列表以增强代入感)和 “操作面板”(一个“手”,用于干预、编辑和放置物体)。

  • 操作主要通过操作面板发起,但在主地图上放置物体。
  • 鼠标光标在放置时可变为相应模式。
  • 层次列表虽然实用但文字密集,建议一次只展开一个项目以限制信息量。

克隆游戏与故事生成机制的思考

作者早年曾尝试开发克隆游戏,但因面向对象编程带来的工程阻力而停滞。他强调《矮人要塞》的核心在于故事生成,而好的故事生成器应将随机内容与玩家参与的游戏机制紧密联系。例如,随机生成的“遗忘巨兽”因其描述具有战略相关性而成功,而矮人的习惯特征则因难以在图文实况中呈现且较为表面化而效果欠佳。

24. One Billion Row Challenge Shows Java Can Process 1B Rows File in 2 Seconds (www.infoq.com)
27. Why You've Never Been in a Plane Crash (asteriskmag.com)

这篇文章通过分析1991年美国洛杉矶机场的跑道相撞事故(造成35人死亡),阐述了美国航空业安全领先的核心理念。文章指出,当时空管员罗宾·李·瓦舍尔因一系列干扰,错误地允许两架飞机使用同一条跑道,直接导致了事故。

然而,美国国家运输安全委员会(NTSB)的调查并未止步于追究瓦舍尔的个人责任,而是深入分析了导致错误的系统性因素,包括:地面雷达因故障停用、塔台视线被新建航站楼灯光遮挡、信息传递流程存在缺陷、以及允许飞机在能见度差时于跑道上等待等不安全程序。调查的目的是预防未来事故,而非定罪。

文章介绍了航空业自20世纪中叶起确立的“免责事后调查”传统,其核心文件《国际民用航空公约》附件13规定,事故调查的首要目的是预防。这种不追究责任的调查方式,使得相关人员能够坦诚提供信息,从而揭示根本原因。文中以1983年加拿大航空“滑翔机”事件为例,说明在威胁追责的情况下,涉事人员可能会隐瞒真相,妨碍调查。

基于“公正文化”的理念,航空业将诚实的错误视为改进系统的机会,而非惩罚个人的理由。这鼓励了错误报告,并推动了重大安全改进,如更可靠的地面雷达和地面碰撞预警系统。这种以系统为导向的安全文化取得了显著成效:自1991年事故后的33年间,美国再未发生配备管制塔台的机场发生致命的跑道相撞事故,全球航空事故率也大幅下降,使其成为最安全的交通方式之一。

28. Paul Erdős, the most prolific mathematician (www.scientificamerican.com)

Paul Erdős:最多产的数学家

个人背景与生活

  • 出生与教育:Paul Erdős 于1913年生于匈牙利布达佩斯,父母均为高中数学教师。他是神童,4岁时能心算人生活过的秒数,21岁首次自己涂黄油,同年获得数学博士学位。
  • 游牧生活:在普林斯顿大学的奖学金职位因同事认为他“粗俗和非传统”而终止后,Erdős 开始了游牧生涯。他没有固定住所,靠安非他命提神,生活不修边幅,常突然造访同事家,要求食宿和洗衣,以数学合作作为交换。他的座右铭是“另一个屋顶,另一个证明”。
  • 生活习惯:Erdős 每天工作19小时,是糟糕的客人。例如,他曾敲锅唤醒疲惫的同事,只为继续讨论数学。他从未结婚、无子女,终身独身,没有驾驶或稳定工作。

学术成就与贡献

  • 最多产数学家:Erdős 创作了超过1500篇学术出版物,数量居历史首位(与莱昂哈德·欧拉竞争,后者以页数更多著称)。
  • 概率方法:他的重要贡献是开创了“概率方法”。该方法通过随机选择对象并证明其具有特定属性的概率大于零,来证明对象的存在性,避免了复杂构造。例如,解决聚会问题:确保存在100人聚会,其中没有6人全为朋友或陌生人。该方法如今是数学研究中的关键技术。
  • 协作网络:Erdős 坚信数学是社会活动,与大量学者合作,催生了“Erdős 数”概念,衡量与他的合作距离(合作者为1,合作者的合作者为2,以此类推)。这类似于“Bacon数”,但早25年出现。
  • Erdős 数的影响:超过25万数学家共享与他的作者链,中位数为5跳;名人如诺姆·乔姆斯基(4)、安格拉·默克尔(5)、斯蒂芬·霍金(4)和埃隆·马斯克(4)拥有Erdős数;演员娜塔莉·波特曼有Erdős数5和Bacon数2。有人曾在eBay上拍卖Erdős数,但以恶作剧告终。

遗产与影响

  • 猜想与奖金:Erdős 留下许多重要猜想,并为解决方案提供个人奖金,尽管他经济拮据。他将演讲费、奖项和兼职收入捐赠给无家可归者、慈善机构和有抱负的研究者。例如,他曾赠予一名哈佛大学贫困学生1000美元,并鼓励学生效仿他的捐赠行为。
  • 终身奉献:Erdős 的一生只专注于数学,死于1996年在华沙的数学会议上,享年83岁。他的遗产不仅通过出版物延续,还通过其合作网络和问题激励后世。
29. How the FBI targeted Camus, and then Sartre after the JFK assassination (2013) (www.openculture.com)

文章摘要

本文探讨了FBI在JFK遇刺50周年背景下对法国存在主义哲学家阿尔贝·加缪和让-保罗·萨特的监控历史。剑桥大学讲师Andy Martin在《Prospect》杂志中提出一个幽默但发人深省的理论:萨特可能与JFK遇刺有关,因为他曾是“古巴公平对待委员会”成员,与刺客李·哈维·奥斯瓦尔德有联系,且萨特曾批评美国为“无头国家”。然而,文章重点在于FBI和国务院在1960年代对萨特和加缪的长期监视,这反映了冷战时期意识形态偏执与哲学误解的交织。

萨特在1945年被美国战争信息办公室带至美国进行宣传,但FBI局长胡佛对其哲学著作(如《恶心》和《存在与虚无》)持怀疑态度,担心存在主义可能是共产主义的幌子。加缪也在胡佛命令下被拘留于移民局,从未再次访问美国。胡佛将一切哲学思想视为潜在的共产主义阴谋,试图确定萨特和加缪是否涉及颠覆活动,尤其是在JFK遇刺后,萨特对官方调查的质疑更引起FBI关注。

尽管进行了多年监控,FBI特工无法厘清萨特的意识形态立场(如一名特工在文件中写道无法判断他是亲共还是反共),因为他们缺乏哲学素养,难以理解存在主义和荒诞主义的细微差别。然而,FBI持续监视,认为共产主义者、黑人、诗人和法国哲学家之间存在阴谋,而萨特的关联人物(如弗朗茨·法农和艾梅·赛泽尔)确实参与了反殖民革命,但这超出了本文范围。

最终,文章揭示了FBI如何将哲学思想政治化,展示了冷战时期监控文化与意识形态恐惧的典型案例,并链接至相关FBI解密文件及其他历史内容。

30. Michael Lewis's Blind Side (asteriskmag.com)

迈克尔·刘易斯的《Going Infinite》一文内容概要

本文是对迈克尔·刘易斯新书《Going Infinite》的批评性评论。该书讲述了加密货币巨头山姆·班克曼-弗里德(SBF)的崛起与崩溃,但作者认为刘易斯未能深入探讨人们犯错的原因,而是过度专注于描绘一个混乱天才的神话。

主要批评点:

  1. 叙事焦点错误:刘易斯对“人们为何犯错”不感兴趣,而是沉迷于塑造SBF个人形象。文章指出,探讨SBF身边那些聪明、老练的盟友(如卡罗琳·埃里森、尼沙德·辛格)为何集体失误,比单纯描写一个欺诈者更有价值。

  2. 对模糊性的处理失败:SBF的世界充满法律、金融和伦理上的模糊地带。刘易斯非但没有剖析这种模糊性如何掩盖了危害,反而常常给予SBF“疑点利益”,轻信其概率性说辞(如声称丢失的瑞波币有80%概率找回),未能进行调查。

  3. 忽视激励梯度:文章强调,接近SBF的人有极强的财务激励(高薪、巨额回报)去忽视问题。刘易斯笔下的人物缺乏能动性,仿佛只是被动地被巨大财富和紧迫感所扭曲,这无形中减轻了他们的责任。

  4. 选择效应与叙事偏差:刘易斯的采访对象是经过“选择”的——那些愿意畅谈、最天真或最自信的人(如尼沙德·辛格)在书中占据了过多篇幅。而那些更谨慎、更早察觉问题的人(如早期离开的团队成员、SBF的弟弟盖布)则很少发声或被提及,导致书中呈现的世界图景是扭曲的。

  5. 技术细节处理肤浅:尽管刘易斯以写金融著称,但本书对加密货币和金融细节的描述非常浅薄。他未加批判地转述SBF团队的说法,有时甚至未能识别基本的金融逻辑错误(如对早期投资者回报率的描述,以及一个关于SBF在简街资本时期交易故事的数学矛盾),从而美化了SBF的形象。

  6. 总体印象:刘易斯成功捕捉了SBF世界的“氛围”和浮夸特质,但本书在分析深度上存在严重缺陷。它像一部肤浅的真人秀,而非严肃的调查,回避了制度、伦理和认知层面的深刻问题。

文章提出的反思与建议: 作者结合自己差点加入SBF公司的经历,总结出一些教训:当感到困惑时应追问;要寻求外部独立视角(尤其不受相同激励影响的人);将自己置于健康激励的环境中;并认识到仅靠个人清白无法防止系统性危害,需要法律、制度和社会规范等结构性支持。

核心结论:刘易斯的这本书无意中成为了“人们如何轻易犯错”的一个范例,展示了在模糊性、激励和亲密接触面前,即便是资深作者也难免落入构建迷人故事而忽视实质问题的陷阱。

31. Ingenuity had more computing power than all NASA deep space missions combined (arstechnica.com)

摘要

NASA的火星直升机“机智号”在其任务期间,展现了比以往所有NASA深空任务总和还要强大的计算能力。其成功飞行72次,不仅证明了在另一个星球实现动力飞行的可能性,更通过大胆采用商用现成(COTS)部件,为未来太空探索开辟了全新道路。

1. 开创性成就

  • 外星首飞:机智号成为首个在另一个星球(火星)实现动力飞行的飞行器,将理论变为现实,被比作1903年地球上的怀特兄弟飞行,为未来行星探索引入了空中机动性这一新维度。
  • 商用部件的胜利:为应对火星稀薄大气(相当于地球8万英尺高空)带来的严苛重量限制(总重仅约2公斤),机智号团队摒弃了传统、昂贵且笨重的航天级抗辐射硬件,转而使用商用部件。例如,其处理器是2015年款的智能手机芯片(高通骁龙801),其性能是此前所有JPL深空任务计算机总和的100倍以上,而重量和成本则大幅降低。类似地,它使用了类似电动工具的锂电池。这些部件在火星的辐射和剧烈温差环境下可靠运行,证明了商用技术用于太空任务的可行性。

2. 深远影响与未来计划

  • 技术验证与后续应用:机智号的成功为未来行星飞行任务提供了宝贵的真实数据。NASA已计划升级下一代火星直升机,用于可能的火星样本返回任务。新设计将拥有更长的旋翼和更高的转速(接近音速),以提升飞行距离和负载能力。
  • 拓展探索边界:其成功激励了更宏大的计划,如计划2028年发射的土卫六“蜻蜓号”核动力旋翼飞行器任务。科学家们也梦想利用此类技术探索火星的瓦勒斯水手谷等传统探测器难以抵达的区域,甚至设想未来用飞行器支援火星载人任务。
  • 改变任务范式:机智号证明,对于许多科学任务,使用商用部件可以制造出更轻、更便宜且性能更高的航天器,这为任务规划者带来了前所未有的自由。这被视为NASA管理层面的“工程师的胜利”。

3. 历史地位 文章将机智号的成就与詹姆斯·韦伯太空望远镜(代表传统复杂昂贵的成功)和商业轨道运输服务计划(催生了商业航天时代)并列,评为21世纪NASA最具创新性和重要性的三大成就之一。它不仅是工程上的奇迹,更象征着探索范式的革新。

32. Higher Order Derivatives of Transforms (nosferalatu.com)

变换的高阶导数

本文讨论了如何求取变换(Transform)的高阶导数,扩展了先前关于导数、对数与变换关系的讨论。

导数的基本概念回顾

给定一个变换 (T) 和一个初始位置 (x(0)),点在时刻 (t) 的位置及其一阶导数为:

  • (x(t) = T^t * x(0))
  • (x'(t) = \log(T) * x(t))

其中 (\log(T)) 是变换 (T) 的对数,且 (T) 和 (\log(T)) 均相对于时间 (t) 为常数。

二阶导数的推导

已知一阶导数 (x'(t) = \log(T) * x(t)),对其求时间导数: [ \frac{d}{dt}x'(t) = \frac{d}{dt}\log(T) * x(t) ] 由于 (\log(T)) 为常数,得: [ x''(t) = \log(T) * \frac{d}{dt}x(t) ] 代入 (x'(t) = \log(T) * x(t)),得到二阶导数: [ x''(t) = \log(T) * \log(T) * x(t) = \log(T)^2 * x(t) ]

这意味着,二阶导数(即加速度向量)可以通过对一阶导数结果再乘以一次 (\log(T)) 得到。

n 阶导数的通式

该模式可推广至任意阶导数。第 n 阶导数为: [ x^{(n)}(t) = \log(T)^n * x(t) ]

交互式示例

文章提供了一个交互式示例,用于可视化点从原点插值到目标变换过程中切向量(绿色箭头)和加速度向量(红色箭头)的变化。用户可操纵变换(平移、旋转),并选择可视化速度向量场或加速度向量场。示例源代码可通过文末链接获取。

33. Coding on Copilot: Data suggests downward pressure on code quality (www.gitclear.com)

文章摘要:GitHub Copilot的引入对代码质量产生负面影响

本文基于GitClear对2020年1月至2023年12月间约1.53亿行代码变更数据的分析,探讨了以GitHub Copilot为代表的AI编程助手对软件代码质量的影响。

主要发现:

  1. 代码“搅动”(Churn)显著增加: 代码“搅动”指代码在编写后两周内被修改或撤销的比例。数据表明,自AI助手普及以来,此比例大幅上升。预计到2024年,该比例将比2021年(AI应用前)的基准水平翻倍。
  2. 代码复用率下降: 分析显示,代码构成正在发生变化,“新增代码”和“复制粘贴代码”的比例在上升,而“更新”、“删除”和“移动”代码的比例在下降。这表明代码的复用性降低,代码库的DRY(不要重复自己)原则受到挑战。
  3. 代码质量堪忧: 研究指出,这种由AI辅助生成的代码模式更类似于“短期承包商”的贡献——可能质量参差、结构不连贯,而非经验丰富的开发者所编写的精心维护的代码。

背景与目的: 尽管GitHub等研究表明使用Copilot可使开发者写代码速度提升55%,但本文关注的是代码质量与可维护性这一关键问题。文章指出,AI生成代码的激增引发了对其长期质量的疑问。

结论与建议: 文章最后提出了针对技术领导者在2024年面临的挑战的建议,并探讨了如何衡量AI对团队代码质量的影响,以期帮助管理者在当前趋势下维持高水平的代码质量。

34. On the Costs of Syscalls (2021) (gms.tf)

系统调用成本分析摘要 (2021)

研究目的

本文旨在量化系统调用的最小成本,即无论内核工作量多么微小、是否发生上下文切换,从用户模式切换到内核模式再返回所必须支付的固定开销。鉴于针对CPU漏洞(如熔毁)的软件缓解措施已进一步增加了系统调用成本,作者通过微基准测试来精确测量这些开销。

研究方法

  • 使用 Google 基准测试库进行测量。
  • 测试对象是一系列预期非常廉价的系统调用,例如获取用户ID (getuid)、进程ID (getpid)、关闭无效文件描述符 (close)、调用不存在的系统调用等,旨在使测量主要反映两次模式切换的开销。
  • 设置了对照组:执行非系统调用的廉价操作,如赋值、计算平方根等,以验证基准测试的有效性。
  • 在多种异构主机上运行测试(不同的CPU、内核、操作系统和配置)。
  • 报告结果为100次重复执行的中位数(以纳秒为单位)

主要发现

  1. 模式切换的真实成本:在所有主机上,一次真实的系统调用(用户-内核模式切换)耗时约在几百纳秒范围内。具体成本受CPU漏洞缓解措施(默认启用)和硬件性能(较旧或低端硬件成本更高)影响。
  2. 优化的例外情况
    • clock_gettime(CLOCK_REALTIME):在大多数主机上速度极快(低至13ns),因为其实现通过高效的 vDSO 机制,不涉及真正的模式切换。然而,在RHEL 7上,查询 CLOCK_MONOTONIC_RAWCLOCK_TAI 仍会触发真实系统调用。
    • getpid():在RHEL 7上异常快速(仅1-2ns),因为其搭载的旧版glibc缓存了进程ID。此优化在较新版本(如Fedora 26)中被移除。
    • pthread_cond_signal():仅执行无监听者的伪信号,成本很低(约10-17ns),因为它只调用廉价的原子操作而非真实系统调用。
  3. 廉价系统调用的基准:真实的廉价系统调用(如 getuid, close, 不存在的系统调用 syscall)的开销在76纳秒到700纳秒以上之间。性能最佳的主机(xg6256, Xeon Gold 6256, 禁用频率缩放,固定4.1GHz)可实现低于100纳秒的模式切换。
  4. sched_yield() 的开销:此系统调用比最小系统调用平均昂贵约150纳秒,表明存在额外开销,但不一定导致上下文切换。在非实时调度策略下,其行为未明确规定。
  5. nanosleep() 与上下文切换成本
    • 调用 nanosleep() 进行0或1纳秒睡眠时,由于Linux的计时器松弛机制,在所有主机上耗时约50微秒
    • 即使设置最小松弛值,nanosleep() 仍然比其他系统调用昂贵得多,因为它无条件触发一次自愿的上下文切换
    • 测得的上下文切换成本(约4-7微秒)远高于简单的模式切换,这与其它基准测试的结果一致。

测试环境说明

  • 测试主机涵盖了从 Atom、Core i5/i7 到不同型号 Xeon 的多种CPU。
  • 操作系统主要为 Fedora 33(内核5.12/5.13)和 RHEL 7(内核3.10)。
  • 部分主机禁用了CPU漏洞缓解措施和/或CPU频率缩放/省电功能(轮询模式)。
  • 所有主机默认启用了SELinux和/或审计,这会在一定程度上增加某些系统调用的开销。

关键术语澄清

  • 模式切换/转换:指用户空间和内核空间之间的切换。
  • 上下文切换:指由内核执行的、不同任务之间的切换。上下文切换比模式切换需要更多工作,因此成本更高
35. Adding type safety to object IDs in TypeScript (www.kravchyk.com)

文章讨论了在TypeScript中为对象ID添加类型安全的方法。最初,作者在定义函数选项时遇到一个问题:选项中的目标字段既可以是字符串ID,也可以是特殊值(如 'currentNode'),但直接使用 string 类型无法区分二者,导致缺乏自动补全提示和类型检查。

作者尝试了两种解决方案:

  1. 将特殊值包装在对象中,虽然可行但代码不够简洁。
  2. 利用TypeScript 4.1引入的模板字面量类型,创建带前缀的ID类型,例如 type NodeId = \node_${string}`。这使得ID类型不再是普通的 string`,从而能够与特殊值区分开来。

这种方法的优势包括:

  • 类型安全:防止不同类型ID的误用(如 UserIdGroupId 不能互换)。
  • 开发体验改善:提供自动补全提示和严格的类型检查。
  • 运行时实用性:通过ID前缀可快速识别对象类型,便于日志调试。

作者在实际项目中应用该方法一年,认为它能有效避免实体类型混淆,同时在编译和运行时均带来收益。

36. Harmonics Explorer (teropa.info)

Harmonics Explorer 简介

Harmonics Explorer 是一款用于分析、可视化并交互式探索信号谐波成分的软件工具。其主要功能包括:

核心功能

  • 谐波分析:对输入信号(如音频、振动数据)进行傅里叶变换,分解出基波及各次谐波的频率、幅值和相位。
  • 可视化展示:通过频谱图、时域波形、相位图等直观呈现谐波结构,支持动态调节参数。
  • 交互式操作:允许用户实时调整谐波数量、幅值、相位,即时观察信号合成效果的变化。
  • 教育与应用:适用于声学、音乐技术、信号处理等领域的教学演示与工程分析。

技术特点

  • 基于Web技术开发(如JavaScript/Canvas),通常无需安装即可在浏览器中运行。
  • 提供平滑的动画渲染和低延迟交互体验。
  • 支持自定义输入信号或加载预设波形(如正弦波、方波、锯齿波等)。

典型应用场景

  1. 音频合成教学:演示如何通过叠加正弦波生成复杂音色。
  2. 故障诊断分析:识别机械振动信号中的异常谐波分量。
  3. 滤波器设计验证:观察滤波器对不同谐波的衰减效果。

该工具通过将抽象的数学概念转化为可操作的视觉界面,降低了谐波理解的门槛,是数字信号处理领域的直观辅助工具。

37. Google marked this vulnerability as "Won't Fix" but I disagree. Care to comment?

主要内容概要:

  • 漏洞描述:用户发现,即使没有获得Google Docs的访问权限,只要拥有文档链接,就能在Slack等平台通过链接预览看到文档第一页的高分辨率清晰文本内容。
  • 报告与回应:作者将此问题报告给Google,认为这是一个安全漏洞。Google回应称,该问题“不够严重”,并标记为“不予修复”。Google的理由是,当有权限的用户通过Slack分享链接时,已表达了分享意图,因此独立于文档共享设置的预览不构成重大风险。
  • 作者质疑:作者尝试反驳,指出许多Google Drive链接可能公开暴露,但文档所有者默认只有拥有访问权限的人才能查看内容。然而,作者得到了Google相同的回应。
  • 核心问题:作者质疑这是否是一个安全疏忽,或自己是否遗漏了某些关键点。该帖子邀请社区对此发表评论。
38. Streetview scraper v1: cheap, arbitrary sized streetview images (loichovon.com)

Streetview scraper v1 项目概述

项目目的与优势

该项目旨在从Google Maps JavaScript API低成本抓取任意尺寸、无水印的街景图像。相较于静态API,其主要优势包括:

  • 成本极低:每个位置抓取成本约0.014美元,可通过扩展进一步降低。
  • 图像尺寸灵活:支持任意尺寸截图,不受静态API限制。
  • 多角度与多时期:自动获取同一位置的多个视角和历史时期图像。
  • 并行处理:支持启动多个并行工作线程加速抓取。

技术原理

作者通过Selenium自动化加载JS API截图的方式实现抓取:

  • Google仅对初始化街景容器收费,后续交互(如切换视角、时期)不产生额外费用。
  • 使用无头浏览器执行JavaScript代码,模拟用户在街景中的移动和视角调整。
  • 通过html2canvas技术实现高质量截图。

实现架构

1. 服务端(Flask)

  • 提供网页服务,动态渲染页面并传递API密钥、坐标等数据。
  • 设有两个端点:
    • GET /:加载街景页面。
    • POST /upload:保存截图至本地。

2. 前端与JavaScript

  • 通过HTML数据属性接收参数(坐标、ID等)。
  • 初始化街景容器,调用StreetViewService.getPanorama()获取全景ID、日期、相邻链接等。
  • 实现截图功能,将图像数据通过fetch发送至服务端。

3. Selenium客户端

  • 使用Chrome WebDriver控制浏览器窗口尺寸(影响截图尺寸)。
  • 通过执行JavaScript脚本模拟:
    • 移动视角:点击相邻链接(向左/向右移动)。
    • 调整朝向:利用google.maps.geometry.spherical.computeHeading计算并设置朝向。
    • 切换时间时期:遍历历史全景ID。
  • 截图前后添加适当延迟,确保画面更新完成。

实际应用

  • 作者使用该工具为魁北克省2049栋低成本住房抓取了23211张图像,用于计算机视觉模型训练。
  • 总成本约37美元,平均每个位置0.018美元,较静态API节省约75%。
  • 支持自定义时间选择器(如仅抓取冬季月份图像)。

注意事项与限制

  • 违反Google服务条款:使用存在被封禁风险。
  • 速度较慢:因浏览器模拟和截图延迟,单个位置10张截图约需30秒。
  • 配置依赖:部分查询选择器可能需随API版本更新调整。

未来计划

  • 扩展功能以自动沿地块边界移动,覆盖建筑物更多侧面。
  • 优化并行化策略以提升大规模抓取效率。

代码仓库GitHub - lhovon/streetview-scraper-v1

注:版本2已发布,详情参见作者博客更新。

39. Kirei is a work-in-progress keyboard library written in Zig (github.com)

Kirei 键盘库概述

Kirei 是一个使用 Zig 语言编写的、正在开发中的键盘软件库。它不仅限于固件,而是一个完整的软件栈,其设计目标是提供极高的可移植性和灵活性。

核心概念与设计

Kirei 的核心是一个键盘引擎,它接收按键输入并生成标准的 HID 输出报告。得益于 Zig 语言出色的编译器能力和此设计,其核心引擎几乎可以运行在任何硬件或软件环境中。这使得 Kirei 能够支持多种应用场景:

  • 嵌入式固件(类似 QMK, ZMK)
  • 模拟操作系统输入(类似 KMonad, Kanata)
  • 软硬件结合(类似罗技的配套软件)

关键的 键映射文件 在所有实现中都是可移植的。为优化嵌入式环境下的大小和速度,键映射使用名为 Hana 的自定义二进制格式进行序列化/反序列化,并采用 Nickel 语言进行声明式配置。

当前开发状态

  • 已实现功能:基础按键、长按触发(Hold-tap)、连击(Tap dance)。
  • 构建系统:已与 Nickel 语言良好集成。

依赖项

  • Zig 0.11.0
  • Nickel 1.3.0+
  • wchisp(夜间版,用于烧录 CH58x 芯片)

具体实现示例

1. CH58x 平台

  • 实现了 BLE 蓝牙键盘功能,支持深度睡眠和 GPIO 中断。
  • 深度睡眠电流极低(约 2.4uA),仅在有按键按下时才扫描矩阵,预期电池续航良好。
  • 键映射存储在 EEPROM 中,支持类似 VIA 的动态更新。

2. RP2040 平台

  • 已实现 USB HID 功能。
  • 下一步计划是实现调度器,并创建一个针对嵌入式实现的统一键盘配置框架,使 CH58x、RP2040 及未来其他平台能共享通用的硬件配置。

测试功能

Kirei 包含一个用于测试按键映射的测试套件。该测试套件可以在操作系统上运行,这一特性使其能够作为模拟键盘设备的基础(类似于 KMonad 的功能),展示了 Kirei 在软件端应用的潜力。

40. Reverse Engineering a Soviet CMOS Chip (twitter.com)

根据提供的内容,实际文本为一条网站错误提示,而非关于“Reverse Engineering a Soviet CMOS Chip”的文章。该提示信息如下:

“Something went wrong, but don’t fret — let’s give it another shot. Some privacy related extensions may cause issues on x.com. Please disable them and try again.”

内容分析:

  • 来源:此内容是社交媒体平台 x.com(原Twitter)的加载错误页面提示。
  • 含义:告知用户页面加载失败,可能是浏览器中与隐私相关的扩展程序导致的冲突,并建议用户禁用扩展后重试。
  • 与标题关联:内容完全不涉及文章标题所指示的“对苏联CMOS芯片的逆向工程”这一技术主题。

因此,无法基于此错误提示生成符合要求的、关于苏联CMOS芯片逆向工程的技术总结。

42. Dart/Flutter now has macros/metaprogramming (github.com)

Dart/Flutter 宏/元编程

Dart/Flutter 现在引入了宏/元编程功能,目前处于实验阶段,允许开发者进行相关实验。

设置步骤

  • 更新 SDK 至开发构建版本(基于 3.4.0-77.0.dev)。
  • 对于 Flutter 用户,切换至 master 频道:flutter channel master
  • 在 Dart 调用中添加标志 --enable-experiment=macros
  • 在 VS Code 中更新到预发布版 Dart/Flutter 扩展。

@Model() 宏

@Model() 宏旨在替代 freezedjson_serializable 包,提供以下关键功能:

  • 实现 fromJsontoJson 方法,用于 JSON 序列化和反序列化。
  • 实现 copyWith 方法,便于对象拷贝。
  • 实现 toStringoperator ==hashCode,用于字符串表示和相等比较。

示例与实现

  • 示例代码位于 bin/model.dart 文件中。
  • 宏的实现代码位于 lib/model.dart 文件中。

注意事项

  • 该宏为实验性功能,可能存在未覆盖的边缘情况。
  • 建议通过创建 issue 或 pull request 报告问题或贡献代码。
  • 切勿在生产环境中使用此功能。
43. Show HN: Librarian - Semantic Bookmark Search Using Transformers (github.com)

Librarian:基于Transformer的语义书签搜索Chrome扩展

核心功能

Librarian 是一款Chrome浏览器扩展,旨在实现对浏览器书签内容的语义搜索。与传统关键词匹配不同,它能理解查询语句的含义,从而找到内容上相关但可能不包含完全相同关键词的书签。

技术实现与工作流程

该扩展的技术流程如下:

  1. 内容抓取与向量化:通过 Sentence-BERT 模型(使用 transformers.js 在浏览器端运行)抓取书签页面内容并生成语义嵌入向量。
  2. 本地存储:生成的向量数据存储在浏览器的 localStorage 中,确保处理过程私密且无需服务器。
  3. 语义搜索:使用 orama 库进行向量搜索,实现快速、准确的语义匹配。

未来增强计划

项目计划进行以下改进:

  • 增加设置选项(如调整相似度阈值、返回结果数量等)。
  • 提供精确的进度条,展示处理状态。
  • 实现更智能的关键文本筛选
  • 优化抓取速度
  • 持续改进用户界面与体验

安装与使用

用户需在本地执行 npm installnpm run build 命令来构建项目,随后可将生成的 build 目录作为未打包的扩展加载到Chrome浏览器中进行使用。

44. How Much Architecture Is "Enough?" (www.infoq.com)

关键摘要

  • 避免在最小可行架构(MVA)上过度投资:关键挑战是解决最小可行产品(MVP)的当前问题,同时预见但不实际解决未来挑战。
  • MVP与MVA的依赖关系:如果MVP不成功,MVA是浪费;如果MVP成功,MVA对产品健康演进至关重要。两者像绑在一根绳子上的登山者,MVP领头,MVA不能落后太远,否则会拖累MVP;MVA也不能超前太多,否则MVP的反馈可能使MVA的决策失效。
  • 初始MVA基于假设:在MVP首次发布时,MVA建立在可能不成立的假设上,因此可能产生过度投资,但反馈循环建立后会得到纠正。
  • MVA需随MVP演变而重新评估:当MVP基于反馈演变时,必须重新考虑MVA,特别是当一个应用的架构被复用到另一个应用时,因为不同应用支持不同的MVP并满足不同需求。

核心概念

  • 最小可行架构(MVA):是MVP在架构层面的补充,确保MVP在技术上可行、可持续且可扩展,使MVP从一次性概念验证转变为新产品的种子。
  • 协同进化:在敏捷背景下,每个新发布版本都视为一个扩展先前MVP的新MVP,相应的MVA也仅需足够支持MVP的增量改进,两者通过一系列增量交付共同演进。

如何判断MVP是“最小”的?

  • 单个改进成果:最小的MVP增量应为某组用户恰好带来一个改进的成果。如果超过一个,则可能不是“最小”。
  • 成果导向:应使用成果而非功能来管理范围,以便更清晰地区分所需功能与无关功能。
  • 实验方法:MVP常被表达为一个实验,例如“我们相信执行某个任务将改善某个成果,当观察到某种测量结果时即表明实验成功”。

如何判断MVP是“可行”的?

  • 用户反馈验证:唯一验证方式是让真实用户/客户使用产品并提供反馈(内部干系人或精选焦点小组可能因确认偏误而不足)。
  • 财务可行性:产品的开发成本净现值不能超过其未来收益净现值。
  • 可支持性:产品必须在其整个生命周期内可支持,这正是MVA的作用——确保MVP交付的成果长期可支持。

如何判断MVA是“最小”的?

  • 仅支持当前MVP:MVA只应满足与MVP相关的质量属性需求(QAR),而不应满足其他无关QAR。
  • 关键挑战:MVA必须解决MVP的当前挑战,同时预见但并非实际解决未来挑战。完全重写意味着架构失败。
  • 动态平衡:MVA需在“解决未来可能不存在的问题”与“技术债务堆积导致架构破产”之间保持平衡,经验至关重要。
  • 避免过度投资:开发团队可能误以为了解未来架构挑战而过度投资MVA(如提前开发消息机制),应根据QAR评估是否现在需要。

初始MVA需要多少架构?

  • 基于不完整信息:初始MVA基于开发团队对问题不完整的理解和模糊的QAR(如“系统需支持大量并发用户”),可能过度建设或不足。
  • 获取反馈是关键:MVA应足够获取反馈,同时不暴露组织于不可接受的风险,并避免因过度开发而延迟反馈。
  • 技术债务不可避免:初始MVA与MVP一样基于有根据的猜测,技术债务是不可避免的后果,因此需快速获取反馈来纠正。
  • 谨慎复用架构:可以从成功系统复用架构作为起点,但需避免过度复用导致无法承受的技术债务,并在MVP演变时避免固守旧MVA。

如何判断MVA是“可行”的?

  • MVP价值是前提:在MVP价值被验证前,无法判断MVA是否可行。MVA的首要门槛是评估MVP的价值。
  • 登山者隐喻:MVP与MVA像绑在一起的登山者(图2)。MVP领先,MVA不能滞后(否则拖累MVP),也不宜超前(否则可能浪费)。初始MVA的过度投资会在反馈循环启动后自行纠正。
  • 经验法则:若一个决策会影响产品的可行性和可持续性,或更改决策的成本会使产品不经济、不实用或不可能,则该决策必须作为MVA的一部分做出。透明化架构决策有助于组织理解选择原因并适应变化。
  • 技术债务管理:MVP成功常伴随技术债务,需在确认MVP价值后尽快解决。登山者之间绳索的长度代表开发团队在保持产品可行的前提下愿意承担的技术债务量。

响应MVP变化

  • 显著重构或重启:当MVP反馈不佳时,可能需要大幅重构甚至重新创建MVP,此时必须重新评估MVA——即使它过去有用,也可能部分不再需要或需要全新的MVA。
  • 重大变化触发重估:MVP范围或愿景的重大变化需触发对MVA的重估,询问“这仍是最小的吗?”、“这仍是可行的吗?”以及“我们如何知道?”。

结论

  • 倾向增量发布:开发团队常倾向于打包更多功能以提升价值,但这会延迟发布。由于只有通过发布和测量才能知道价值,延迟可能降低价值。因此,增量MVP应限制为针对单一用户/客户群的单个成果。
  • MVA与MVP关联:MVP无价值则MVA也无价值。MVA需支持MVP的长期可行性,但前提是MVP有价值。MVA应预见MVP的未来演变,但无需立即解决未来问题。两者之间通常存在滞后,以避免在MVP未达目标时过度投资MVA,但滞后不能太远,否则MVP长期不可支持。
  • 初始MVA的起点:系统初始MVA必须从某处开始,开发团队的初始假设可能导致过度投资,但反馈循环建立后会自行纠正。
45. Tindallgrams (www.nasa.gov)

阿波罗日志:记录月球探索的不朽篇章

创始人与灵感起源

1988年,天文学家埃里克·M·琼斯在访问约翰逊航天中心时获得启发。出于对人类探索历史的着迷,他开始研究阿波罗任务期间的空地对话记录,以深入了解宇航员在月球表面的经历。受历史学家J.C.比格尔霍尔为库克船长探险日记作注的启发,琼斯萌生了对阿波罗登月记录进行类似编纂的想法。

《阿波罗月面日志》的诞生

1989年4月,琼斯与阿波罗17号宇航员哈里森·H·施密特合作,花了三天时间仔细审阅了阿波罗17号部分月面活动的记录。施密特随后将琼斯介绍给其他11位曾漫步月球的阿波罗宇航员。在长达数小时的记录访谈中,宇航员们详细讲述了各自任务的方方面面。这些努力最终催生了**《阿波罗月面日志》。该日志由琼斯于1995年中首次在线发布,提供了所有宇航员月面活动与休斯顿任务控制中心之间记录对话的校订与注释版本**。内容还包括编辑和10位月球行走宇航员的评论、照片、地图、背景文件、音频和视频片段。历经数十年发展,这个由琼斯和众多志愿者贡献者创建的详细资料库,已成为价值无可比拟的太空历史资源。

同伴项目与持续遗产

受《阿波罗月面日志》的启发,大卫·伍兹于1998年创建了一个名为**《阿波罗飞行日志》的配套网站。琼斯的项目记录了宇航员在月面的活动,而这份由全球众多贡献者补充的日志,则覆盖了阿波罗载人飞行中未发生在月球上的所有其他部分**。

认可与传承

2023年,埃里克·琼斯因通过《阿波罗月面日志》在记录阿波罗历史方面的贡献,被授予NASA杰出公共服务奖章。2024年,他又因此项工作获得了美国宇航学会的奥德韦奖。琼斯于2025年7月去世,享年81岁,但阿波罗日志至今仍作为活态文献持续更新,为了解NASA的阿波罗任务提供了深入洞见。

探索资源:可访问阿波罗日志网站,查阅《阿波罗月面日志》和《阿波罗飞行日志》,获取关于阿波罗任务的详细历史资料。

46. A parliament of owls and a murder of crows: How groups of birds got their names (www.themarginalian.org)

鸟类群体名称的起源与文化意义

语言既是精确表达的工具,也是富有创造性的活物,它塑造我们对世界的感知。鸟类群体的集体名词(常称“company terms”)体现了这种灵活性,这些名称源于鸟类特征、神话传说或民间信仰。

名称来源与示例

  • 基于观察特征:如“a fall of woodcock”源自丘鹬求偶的空中舞蹈;“a watch of nightingales”体现夜莺的夜间警醒;“a gaggle of geese”是雁群叫声的拟声词。
  • 源于神话与迷信:如“a murder of crows”关联乌鸦作为死亡使者的迷信;“a parliament of owls”源自古希腊神话,猫头鹰与智慧女神雅典娜相关,象征民主。
  • 其他有趣名称包括“a deceit of lapwings”(田凫的欺骗)、“a pitying of turtledoves”(斑鸠的怜悯)和“an ostentation of peacocks”(孔雀的炫耀)。

历史来源:《圣奥尔本斯书》

许多名称记载于1486年匿名出版的《圣奥尔本斯书》(后证实作者为修女Juliana Barnes)。书中列出了“THE COMPAYNYS OF BEYSTYS AND FOWLYS”,包括:

  • “exaltation of larks”(云雀的欢腾)
  • “murmuration of starlings”(椋鸟的低语)
  • “unkindness of ravens”(渡鸦的冷漠)

Juliana Barnes在修道院学习并写作,她的作品展示了女性在教育受限时代的创造力与勇气。

名称的演变与现代用法

这些名称随时间地域变化:

  • “sedge of herons”(鹭的莎草)演变为“siege of herons”(鹭的围攻),强调声音而非外形。
  • “stare of owls”(猫头鹰的凝视)一度流行,但在Brian Wildsmith 1967年的鸟类画作集中使用,现可能过时。
  • 文章还列举了其他名称如“a wedge of swans”(天鹅的楔形)、“a rafter of turkeys”(火鸡的栖架)、“a congregation of plover”(鸻的集会)等。

语言作为进化中的系统

这些变化印证了Toni Morrison的观点:语言是“部分系统,部分活物”,像生命一样适应环境进化。词汇可能面临灭绝,正如鸟类群体名称的存续与变迁反映了语言的生命力。

47. Executing Cron Scripts Reliably at Scale (slack.engineering)

Slack大规模可靠执行定时任务的解决方案

Slack的核心功能(如提醒、通知发送、数据库清理)依赖Cron脚本。随着脚本数量和数据处理量的增加,原有单节点Cron执行方案的可靠性与扩展性问题日益凸显,维护和扩展成本高昂。为此,Slack设计并构建了一套新的可靠、可扩展的Cron执行服务。

原有问题

早期采用单节点运行所有Cron脚本,通过升级硬件应对增长,但仍面临单点故障风险,任何运维问题都可能导致服务中断。

新系统核心组件

新系统由三个主要组件构成,充分利用现有基础设施以降低开发和维护负担:

  1. Scheduled Job Conductor

    • 用Go语言编写的调度服务,运行于Slack的Kubernetes平台(Bedrock)。
    • 使用Cron库保持与原有Cron表达式的兼容性,便于迁移。
    • 采用Kubernetes Leader Election机制:仅一个Pod负责调度,其他Pod处于待命状态,实现主备快速切换。
    • 逻辑上避免在调度密集的整点时刻进行节点切换,确保无缝过渡。
    • 该服务仅负责调度,将计算密集型工作卸载给Job Queue。
  2. Job Queue

    • Slack现有的异步计算平台,每日处理约90亿项作业。
    • 作业通过逻辑队列在Kafka(持久存储)、Redis(短期存储及元数据管理)间流转,最终由工作节点执行。
    • 每个Cron脚本被视为一个作业。通过将作业隔离在独立队列,可实现快速执行。
    • 优势:直接利用现有成熟平台,避免自建计算资源,大幅降低开发和维护成本,并充分利用其强大的处理能力。
  3. Vitess数据库表

    • 用于作业去重执行状态跟踪
    • 每次作业执行均记录为表中的一行,并更新状态(已排队、执行中、完成)。
    • 启动新作业前,查询表中是否存在同名活跃作业,替代原有的文件锁(flock)机制,有效防止重复执行。
    • 表数据为内部Web页面提供支持,用户可查询脚本执行状态和错误信息,尤其适用于长时间运行的脚本。

设计决策

  • 单节点调度:虽然存在单点调度风险,但考虑到Pod切换速度极快,且通过Leader Election保证高可用,同步多节点调度的复杂度更高。
  • 复用Job Queue:将计算和内存压力转移至专用的、已扩展的成熟系统,提升可靠性并减少自建工作。
  • 数据库实现去重与监控:提供更可靠的任务状态管理和用户友好的监控界面。

总结

新Cron执行服务显著提升了可靠性、可扩展性和用户体验。它解决了原有单节点方案的局限,为Slack当前及未来的规模增长提供了坚实的基础。

48. Process Spawning Performance in Rust (kobzol.github.io)

本文探讨了在Rust中使用标准库的Command API进行Linux进程生成时遇到的性能问题,主要聚焦于在HPC集群环境下生成大量进程时的瓶颈。

核心问题
作者在本地笔记本和HPC集群上对比了生成10,000至25,000个sleep 0进程的性能,发现集群上耗时显著更长(例如25,000个进程:本地约2.5秒,集群约20秒)。通过strace分析发现,两者使用的系统调用不同:

  • 本地(新glibc 2.35):使用clone3并带有CLONE_VM|CLONE_VFORK标志,效果等同于高效的vfork
  • 集群(旧glibc 2.17):使用clone且无vfork标志,等同于传统的fork,并额外创建Unix域套接字。

性能差异根源

  1. glibc版本导致不同路径
    Rust标准库的进程生成逻辑依赖glibc版本:

    • glibc ≥ 2.24:调用posix_spawnp,默认使用高效的vfork方式(通过clone3)。
    • 旧版glibc:回退到fork+execvp,并创建Unix套接字交换数据。fork需复制父进程页表(标记为写时复制),当父进程内存较大时,反复复制页表开销累积显著。
  2. 内存占用影响fork性能
    实验表明,父进程分配的内存越大,fork生成子进程越慢。例如,分配5GB内存后生成10,000个进程比分配1GB内存耗时增加约5倍,这是由于fork需复制大量页表。

  3. 环境变量数量的影响
    环境变量数量增多也会降低生成速度。即使使用快速路径(不修改环境),内核仍需复制环境变量到子进程地址空间。若在Command中设置新环境变量,则需构建新环境(涉及多次内存拷贝和排序),进一步增加开销。

  4. 并行化潜力
    作者测试了并行生成进程的方案(使用多线程运行时或spawn_blocking)。在集群上,并行化可带来一定速度提升,尤其在生成前需构建环境等额外工作时效果更明显。

  5. 路径解析开销
    使用绝对路径(如/usr/bin/sleep)比相对路径(sleep)生成进程略快,因为后者需遍历PATH环境变量中的目录查找可执行文件。

结论与反思

  • 多数性能问题在常规使用中不明显,但需生成大量进程时值得关注。
  • 旧版glibc的fork实现、大内存页表复制、环境变量处理是主要瓶颈。
  • 作者因旧版glibc可能存在vfork实现缺陷而未强行修改Rust标准库。
  • 实践中可通过升级glibc、优化环境变量、考虑并行化等方式缓解问题。

其他发现

  • Rust标准库的进程生成代码复杂,且与glibc版本强绑定,自定义修改(如添加vfork标志)需 fork 标准库代码,维护成本高。
  • 等待build-std等工具可简化标准库自定义流程。

本文揭示了底层系统调用、库版本和应用配置如何共同影响高频进程生成场景的性能。