2024-02-29

29 篇热帖

1. The KDE desktop gets an overhaul with Plasma 6 (lwn.net)

KDE Plasma 6 近日正式发布,这是近十年来的首个主要版本更新,同步推出了 KDE Frameworks 6 和 KDE Gear 24.02。此次更新的核心目标是全面迁移至 Wayland 显示协议,同时注重提升性能、安全性及对新硬件的支持。对于开发者,工作重点在于移除废弃框架、减少依赖,以简化应用开发。

主要用户界面与功能变化

  • 默认会话与交互:Wayland 成为默认图形会话。文件/文件夹的默认打开方式从单击改为双击(更符合其他操作系统用户的习惯)。
  • 滚动行为:默认禁用在桌面上使用滚轮切换虚拟桌面(用户可手动开启)。滚动条点击行为改为直接跳转至点击位置,而非翻页,以改善用户体验并减少重复性劳损。
  • 视觉与设置:默认主题 Breeze 有细微视觉优化。系统设置(System Settings)进行了重组,部分选项位置发生变化。文件管理器 Dolphin 的设置界面被精简,并增加了可选的匿名用户反馈选项。
  • 显示与搜索:在 Wayland 下部分支持 HDR 和色彩管理。改进了多显示器独立缩放设置。KRunner(搜索功能)和应用启动器性能得到优化,速度更快。截图工具 Spectacle 增加了屏幕录制功能。
  • 移除的功能:因驱动或设计变更,移除了 Synaptics 触摸板等旧式输入设备的图形配置界面。同时移除了维护不足的功能(如 Air 主题、KHotkeys)以及一些未达预期或 API 变化的功能(如 Unsplash 壁纸集成、QuickShare 应用)。

底层框架(KDE Frameworks 6)更新

此次升级对开发者意义重大。工作重点在于精简而非新增:

  • 清理废弃项:移除了多个过时的框架(如 KHtml、KJS、KHotkeys)和废弃的 Qt API。
  • 降低耦合度:减少了框架间的依赖,使外部 Qt 应用可以更轻量地使用个别 KDE 框架。
  • API 统一:整合了插件系统等重复或低使用率的 API。

Qt 6 基础升级带来了关键改进:

  • 图形支持:增加了对 Metal、Vulkan、OpenGL、DirectX 等图形 API 的抽象层。
  • 构建系统:从 qmake 迁移至 CMake,提升了开发工具链体验。
  • Wayland 支持:Qt 6 的 Wayland 模块得到显著增强,部分由 KDE 开发者推动。

对 Plasma 5 及 X11 的支持计划

  • Plasma 5:不会立即停止维护。考虑到许多发行版不会很快迁移,计划发布 Plasma 5.27.11 等版本以继续提供错误修复和安全更新,直至主流发行版完成迁移。
  • X11 支持:Plasma 6 将继续包含 X11 会话支持。官方没有明确的移除时间表,估计可能在两到五年内逐步淘汰,并会提前充分沟通。

总体而言,Plasma 6 旨在为用户提供平滑的升级体验,同时通过 KDE Frameworks 6 为未来数年的发展奠定更清洁、高效的基础。

2. Hetzner switches to new billing model (docs.hetzner.com)

Hetzner 新计费模型总结

计费模式与发票发放

  • 基本模式:采用 先用后付 的预付费模式。发票包含上一个自然月的全部服务。
  • 计费规则
    • 从产品可访问时开始计费。
    • 若产品未使用满整月,则按小时费率计算;接近整月后,自动切换为更低的月费率
    • 部分小时数会向上取整,但总费用不会超过月价格。
    • 只要产品在您的账户中存在(即使未使用或关闭),就会产生费用。需主动删除或取消才能停止计费。
    • 部分产品(如域名、SSL证书)为年付,许可证则始终按整月计费。
  • 发票发放日期
    • 自2024年4月起,发票在整个月内分散发放,以平衡开票量并加快支持响应。系统自动分配日期,用户不可自选。
    • 自2025年8月起,对部分老客户的发票创建日期进行了进一步优化分配,但计费逻辑不变。
    • 用户可在账户中随时查看自己的发票日期。

发票结构与示例

  • 最低开票金额:发票金额需超过10欧元才会生成。不足10欧元的金额会累积,若连续三个月未达阈值,将在第三个月末开具总账单(新客户首单除外)。
  • 新发票结构(2024年10月起)
    • 首页:总费用摘要,并按产品类别和客户接口(如konsoleH、Robot、Hetzner Console)分类展示。
    • 后续页面:明细列表。产品、计量单位和单价相同的项目会被分组显示,使发票更清晰。
    • 个人消费明细:不直接显示在PDF中,可通过发票上的二维码、PDF内链接或在账户的“发票”>“概览”中查看。该明细提供详细的消费信息、计算依据(如备份、折扣、附加组件)以及可下载的CSV文件。
    • 包含的附加域名等服务在新布局中显示为小时消费
  • 计费过渡期(2024年历史)
    • 2024年3月:开始过渡,服务期跨越4月的产品不在3月账单中计算,导致3月账单可能偏低。
    • 2024年4月:首次开具回顾性发票,基于小时费率重新计算了3月所有未结清的服务期。
    • 2024年5月起:切换完成,所有发票均完整包含上一个月的服务。

常见问题要点

  • 能否更改账单日期? 否。
  • 小时如何计算? 从产品可用时开始,部分小时向上取整,费用永不超过月价。
  • 何时按月计费? 当产品几乎使用满整月或完整一个月时。
  • 何时按小时计费? 当产品仅使用部分月份(如几天或几小时)时,直到小时费用达到月价。
  • 能否获得年度发票? 否,仅有月度发票。可通过SEPA或信用卡自动付款。
  • 产品不常用是否少付费? 否。只要产品在您的账户中,即使闲置也会计费,因为资源已被为您保留。
  • 产品能否试用? 否。但大多数产品支持按小时计费。
4. Serving my blog posts as Linux manual pages (jamesg.blog)

将博客文章作为Linux手册页提供

项目概述

本文介绍了作者如何将个人博客文章转换为Linux手册页格式,并通过HTTP内容协商机制实现请求。目标受众是对Linux、手册页或奇特编程项目感兴趣的人。Linux手册页使用roff语法,是Unix系统最早的排版软件,用户可以通过man命令在终端中查看。

系统设计与实现

  1. 内容协商机制:作者利用HTTP的Accept头实现格式请求。当客户端发送Accept: text/roff头时,服务器返回roff格式的手册页,而非默认的HTML页面。
  2. 手册页生成:博客文章使用roff语法模板生成,包含以下标准部分:
    • .TH:设置页眉(如域名)。
    • .SH:定义章节,包括标题、作者、发布日期、文章内容和URL。
    • 文章内容使用Markdown格式,尽管在手册页中可能出现格式问题(如间距偏差),但比纯文本更易读。
  3. 服务器配置:通过NGINX配置实现内容协商:
    • nginx.conf中定义变量,用于检测text/roff请求头。
    • 在站点配置中,当请求头匹配时,重写URL,将路径末尾添加.man后缀,从而读取预生成的手册页文件(如index.man),而非HTML文件。

使用方法

用户可通过以下步骤访问博客文章的手册页版本:

  1. 使用curl命令请求roff格式,并保存为文件:
    curl -sL -H "Accept: text/roff" https://jamesg.blog/2024/02/28/programming-projects/ > post.page
    
  2. 通过man命令打开文件查看:
    man ./post.page
    

项目意义

该项目探索了内容协商在NGINX中的应用,展示了从命令行排版技术(roff)到现代网页排版的演变。作者感谢Todd在NGINX配置方面的帮助,并认为这是一个有趣的实验,增强了网站的功能性和可访问性。

5. The game magazine that spent two years taunting a Final Fantasy VIII hater (ff8isthe.best)

文章摘要

本文讲述了游戏杂志《GameNOW》在其存续期间,针对一位读者对《最终幻想VIII》的不满,持续近两年进行创意“报复”的趣味轶事。

杂志背景 《GameNOW》的前身为《Electronic Gaming Monthly》(EGM)的衍生刊《EGM2》,后更名为《Expert Gamer》。2001年,出版商Ziff Davis将其重新定位为面向年轻读者、风格活泼的《GameNOW》。

事件起因 在《GameNOW》的创刊号中,编辑部刊登了一封原寄给《Expert Gamer》的读者来信。读者蒂姆·斯波伦抱怨杂志在信件栏目中反复使用《最终幻想VIII》最终战场景的同一张截图,并表达了对该作的不满,认为它不如系列其他作品。

编辑部的回应与长期玩笑 编辑部在回信中表示尊重不同意见,但否认故意重复使用截图,并承诺不会刊登故意惹恼读者的内容。然而,从2001年11月的创刊号起,在随后近两年的每一期中,编辑团队都将那张《最终幻想VIII》的截图巧妙地、以各种隐蔽的方式插入杂志的不同栏目(如广告、边角、食谱插图等),以此持续“戏弄”那位读者。

玩笑的终结与余韵 《GameNOW》于2004年1月停刊。在最终一期,编辑部兑现了早期的一个“承诺”,将那张截图制成整页海报供读者收藏。文章最后补充了一个后续:作者作为游戏历史资料员,在整理杂志合集时发现,这个玩笑甚至可能延伸到了杂志实体之外,暗示了其持续性。整个事件被视为一个横跨杂志生命周期、充满幽默感和创意的编辑部内部玩笑。

6. Children need risk, fear, and excitement in play (www.afterbabel.com)

儿童在游戏中需要风险、恐惧与兴奋

核心观点

儿童需要通过带有适度风险的游戏来健康发展。移除所有风险反而可能损害儿童的社交、身体乃至免疫系统的发展。关键原则是:儿童应保持在“必要安全”而非“绝对安全”的环境中。

风险游戏的定义与益处

定义:风险游戏指儿童主动寻求刺激、挑战自身极限的活动,例如:

  • 涉及高度(如攀爬)、速度(如滑雪橇)的游戏
  • 使用工具(如锤子、刀具)的游戏
  • 接近自然元素(如火、水域)的游戏
  • 独立探索(如在社区自由玩耍)的游戏

进化与发展的意义

  • 身体发展:帮助儿童掌握多样运动技能,提升身体协调能力
  • 认知发展:培养批判性思维,学会独立应对不确定情境
  • 情绪调节:通过体验兴奋与恐惧的交织,提升情绪韧性
  • 应对焦虑:研究表明,经常参与风险游戏的儿童焦虑症状更少

当前现状:风险游戏的消失

数据对比

  • 1975-2015年间,英国儿童户外游戏时间减少29.4%,屏幕活动增加22.4%
  • 美国儿童每日户外游戏比例从1997年的16%降至2003年的10%

代际差异

  • 1990年前出生者的童年记忆多围绕邻里自由探险
  • 当代儿童的童年记忆更多与成人监管下的结构化活动相关

风险游戏减少的原因

密集型育儿模式

  • 自1980年代兴起,强调家长(尤其是母亲)精细管理儿童生活
  • 表现为过度安排结构化活动、消除障碍、全天候监管

认知偏差

  • 家长普遍认为现代社会对儿童更危险
  • 实际数据:1973-2010年间,美国男童意外伤害死亡率下降73%,女童下降85%
  • 当前儿童主要死因是交通事故和自杀,而非户外无人监管游戏

矛盾现象

  • 家长为保障安全采取的措施(如频繁接送、最大监管)反而可能增加伤害风险
  • 结构化活动对儿童发展益处有限,且可能损害执行功能等基础能力

解决方案:三大关键要素

  1. 时间

    • 保障每日户外游戏时间,将其纳入日程安排
    • 学校应增加课间休息和户外教学
  2. 空间

    • 创建刺激、灵活的玩耍环境
    • 引入“松散材料”(如木棍、石块、箱子)
    • 推广冒险游乐场(如纽约的play:groundnyc)
    • 城市规划需从“以车为本”转向“以人为本”
  3. 自由

    • 家长需克服自身恐惧,逐步给予儿童独立探索机会
    • 建立邻里互助网络,共同支持儿童自主游戏
    • 使用工具如OutsidePlay.org制定渐进改变计划

结论

过度保护与密集型育儿正在剥夺儿童通过风险游戏获得发展的机会。通过保障时间、创造空间、给予自由,我们可以打破“安全悖论”,让儿童在必要的风险中健康成长。改变应从可执行的小步骤开始。

7. Antarctic English (en.wikipedia.org)

南极英语

南极英语是英语的一个变体,主要由生活在南极洲大陆及亚南极群岛上的科学家南极旅游业工作者使用。其语言谱系属于印欧语系 > 日耳曼语族 > 英语

语音特征

2019年的一项研究首次报告了南极口音的形成。研究发现,在南极越冬期间,科学家的元音发音发生了细微变化,例如“food”和“window”中的元音发音位置比其他英语变体更靠前。不过,这种差异非常细微,难以通过听觉直接辨别,只能通过仪器测量。

词汇特点

南极英语拥有大量独特词汇:

  • 地域别称:用“The Ice”指代“南极洲”。
  • 日常用语:如“Homer”指家酿啤酒,“Big Eye”指失眠,“Fod plod”指清理垃圾,“Dingle day”指天气晴朗的日子。
  • 工作相关:“Winterer”指越冬研究员,“Smoko”指茶歇或吸烟休息时间,“House-mouse”指杂务,“Daisy-picking”指清洁科考站周边。
  • 冰的分类:拥有超过200个描述不同类型冰的词汇,例如“tabulars”(平顶冰山)和“growlers”(房屋大小的消融冰山)。
  • 旅游术语:如“Kodak poisoning”(许多游客拍摄同一地点的情况)和“Dead-Penguin Tours”(指夏季末参观被遗弃的企鹅雏鸟尸体线路)。

语言影响

南极英语在19至20世纪间受到多重语言影响:

  • 西班牙语:通过南美移民引入,例如“camp”(源自西班牙语“campo”,意指城郊地区)。
  • 北欧语言:工业家和探险家引入了如“grax”(挪威语,指鲸油加工后的残渣)等技术词汇。
  • 其他语言:一些词汇源自土著美洲语言(如“nunatak”、“mukluk”)和军事术语

南极英语也反过来影响了其他英语变体,特别是与“冰”相关的术语。

8. Microsoft Security-101: Open-Source curriculum (github.com)

Microsoft Security-101:开源网络安全入门课程摘要

这是一门面向初学者的免费开源课程,旨在传授基础的网络安全概念,帮助学习者开启安全学习之旅。课程不依赖于特定厂商,由多个独立课时组成,每个课时预计耗时30至60分钟,均配有小测验和进一步阅读资源。

核心教学内容包括:

  • 基础概念:如CIA三元组(保密性、完整性、可用性)、风险与威胁的区别。
  • 安全控制:理解安全控制的定义及其表现形式。
  • 零信任:了解零信任的含义及其在现代网络安全中的重要性。
  • 关键领域:涵盖身份、网络安全、安全运营、基础设施及数据安全等核心主题。
  • 工具示例:简要介绍用于实施安全控制的一些工具。

课程明确不涵盖:

  • 具体安全工具的操作使用。
  • “黑客”技术或红队攻击方法。
  • 特定的合规标准。

课程结构(模块概览):

  1. 基础安全概念:CIA三元组、常见威胁、风险管理、策略与文档、零信任、责任共担模型。
  2. 身份与访问管理基础:最小权限原则、职责分离、零信任架构、IAM能力与控制。
  3. 网络安全基础:网络概念、零信任架构、防火墙、WAF等工具。
  4. 安全运营基础:安全运营的重要性、零信任架构、SIEM、XDR等工具。
  5. 应用安全基础:安全设计、输入验证、代码扫描等工具。
  6. 基础设施安全基础:系统加固、补丁管理、容器安全、CSPM等工具。
  7. 数据安全基础:数据分类、保留策略、数据防泄漏(DLP)、数据治理工具。
  8. AI安全基础:传统安全与AI安全的异同、AI安全工具与控制、负责任AI。

多语言支持: 课程通过GitHub Action支持多语言翻译,涵盖阿拉伯语、中文(简体与繁体)、法语、德语、日语、韩语、西班牙语等数十种语言,且内容会自动更新。

后续学习路径与社区支持: 完成本课程后,建议继续学习微软相关学习模块(如Microsoft Security, Compliance, and Identity Fundamentals),并可考虑考取SC-900认证。团队还提供其他课程,如Azure安全、生成式AI系列等。学习者可加入社区参与讨论,获取帮助或反馈。

9. Man in remission from blood cancer and HIV after remarkable treatment (www.theguardian.com)

该文章报道了一例同时患有急性髓系白血病和HIV的患者通过创新性治疗实现双重缓解的罕见医学案例。

  • 患者与背景:患者为68岁的保罗·埃德蒙兹,来自加利福尼亚州。他于1988年确诊HIV,长期接受抗逆转录病毒治疗以控制病毒水平。之后,他又被诊断出急性髓系白血病。

  • 关键治疗方法:埃德蒙兹在“希望之城”国家医疗中心接受了造血干细胞移植治疗白血病。关键点在于,干细胞捐赠者携带一种罕见的CCR5 delta 32纯合突变,该突变可使携带者天然抵抗HIV感染。移植前,患者接受了减强度化疗,以降低移植后并发症风险。

  • 治疗效果:治疗后,埃德蒙兹的骨髓和造血干细胞被捐赠者的细胞完全替代。目前,他已超过五年未出现白血病迹象,临床认为其白血病已治愈。同时,他已停止HIV抗逆转录病毒治疗近三年,体内未检测到病毒活动,若此状态持续至五年,医生将考虑其HIV被治愈。

  • 案例意义:埃德蒙兹是全球已知第五位同时从这两种疾病中实现缓解的患者,也是其中年龄最大且HIV感染时间最长(约31年)的一位。其病例发表于《新英格兰医学杂志》,证明了对于合并血液癌症的老年HIV感染者,通过采用携带HIV抗性基因的供体干细胞进行移植,有可能实现HIV缓解。

  • 患者感想:埃德蒙兹表达了对医疗团队的感激,并希望自己的经历能为其他HIV感染者带来希望,同时缅怀那些因该疾病离世的人们。

10. MicroZig: Unified abstraction layer and HAL for Zig on several microcontrollers (github.com)

MicroZig:为多种微控制器提供统一抽象层和HAL的Zig项目

MicroZig 是一个使用 Zig 语言为多种微控制器(MCU)提供统一抽象层硬件抽象层(HAL) 的开源项目。

该项目的主要目标是创建一个跨不同硬件平台的通用接口,以简化在 Zig 中进行嵌入式开发的过程。它通过一个名为适配器的模块来支持不同的目标设备,允许开发者使用一致的API来控制底层硬件,从而提高代码的可移植性和复用性。

根据项目信息,MicroZig:

  • 支持多种目标设备:通过适配器机制兼容不同的微控制器平台。
  • 提供统一抽象层:定义了一套标准接口,屏蔽了底层硬件差异。
  • 包含硬件抽象层:提供了直接与硬件寄存器或外围设备交互的抽象。
  • 处于开发状态:项目仍在积极开发中。

该项目托管于 GitHub,其仓库内容页面展示了常规的 GitHub 项目导航结构(如代码、议题、拉取请求等),但文章核心内容聚焦于介绍 MicroZig 项目的定义和目的。

11. How The Pentagon learned to use targeted ads to find its targets (www.wired.com)

2019年,技术顾问迈克·耶格利向美国国家安全机构发出警告:约会应用Grindr等移动应用通过广告技术生态大规模泄露用户位置数据,构成严重国家风险。他通过演示访问Grindr用户地理数据,展示了如何通过广告交换平台获取近乎实时的位置信息,并以此在政府建筑周围建立地理围栏,追踪员工行踪,甚至推断其私人生活。

广告技术生态通过实时竞价过程运作:当用户打开应用时,设备会向广告交易所发送包括IP地址、设备信息、精确GPS坐标和伪匿名广告ID在内的数据。尽管用户可重置广告ID,但其行为模式具有高度独特性,难以真正匿名。位置数据已成为价值数十亿美元的产业,用于定向广告和消费行为分析。

耶格利早年曾协助将广告数据引入政府系统。2015年他加入PlaceIQ公司(获得中情局投资),后转至国防承包商PlanetRisk,领导开发了名为“Locomotive”的演示项目。该项目使用UberMedia等公司的广告竞价数据,成功展示了多项能力:追踪叙利亚难民流动、监测俄罗斯总统普京随行人员、发现一名往返美朝之间的可疑人员。最令人震惊的是,系统实时显示了美军特种部队从布拉格堡等基地前往叙利亚未公开前哨基地的行踪,暴露了高风险安全漏洞。

五角大楼高层对演示极为重视。Locomotive后更名为VISR(虚拟情报、监视与侦察),成为跨机构情报工具。同时,国土安全部等机构大量采购此类数据,用于边境安全、移民追踪和刑事调查,引发监管机构对隐私保护的批评。

类似技术已被多国情报机构采用,以色列公司开发的系统甚至可通过定向广告投放恶意软件。文章强调,普通用户的位置数据(包括敏感地点访问记录)极易被获取和滥用,形成了新型监控现实。该内容节选自拜伦·陶的新书《控制手段》(2024年2月出版)。

12. Rendering protein structures inside cells at the atomic level with Unreal Engine (www.biorxiv.org)

研究背景与挑战

近年来,冷冻电子断层扫描(CryoET)技术的发展使得在近原子分辨率下识别和解析细胞内大分子结构成为可能。然而,在原子级别对复杂的细胞环境进行可视化仍然面临巨大挑战,其主要障碍在于需要实时计算渲染细胞内数以百万计的分子。

核心创新与方法

本研究利用虚幻引擎这一视频游戏引擎,成功展示了在其原生环境中实时渲染大规模生物大分子的能力。为辅助可视化探索,研究者还提供了以下工具:

  1. 交互式导航工具:支持用户在细胞内部进行交互式浏览。
  2. 结构转换软件:将通过CryoET识别的蛋白质结构数据转换为可由游戏引擎加载和探索的虚拟场景。

主要成果

该工作证明了将先进的游戏引擎技术应用于生物可视化领域的可行性,为在接近真实的原子级别上观察和探索细胞内复杂的分子环境开辟了新途径。

14. A lock-free ring-buffer with contiguous reservations (2019) (ferrous-systems.com)

文章介绍了在跨线程通信中设计和实现高性能无锁环形缓冲区的过程,重点解决了数据在内存中保持连续性的需求。

核心问题与背景 环形缓冲区是异步通信的常见基础结构,但在传统实现中,当数据跨越缓冲区边界时可能被分割成两块。这在与硬件直接内存访问(DMA)等场景中不可行,因为DMA要求数据在物理内存中必须连续。文章以嵌入式系统和高性能服务器为例,说明了连续数据访问的重要性。

设计思路 设计受到BipBuffer启发,但为了在并发环境下实现无锁操作,采用了不同的方法。核心思想是将每个协调变量(指针)与一个特定的线程绑定,确保每个指针只有一个线程拥有写入权。

关键数据结构与机制

  1. 三个原子指针

    • write:写入线程负责更新,指向下一个可写位置。
    • read:读取线程负责更新,指向下一个可读位置。
    • watermark:写入线程负责更新,用于标记缓冲区尾部的“空洞”起始位置,以实现连续写入。
  2. 两种内存配置

    • 写指针领先 (write >= read):有效数据在 readwrite 之间。
    • 读指针领先 (read > write):有效数据在 readwatermark 之间,以及缓冲区开头到 write 之间。
  3. 写入逻辑

    • 如果缓冲区尾部有足够空间,直接向前移动 write 指针。
    • 如果空间不足,则将 watermark 设为当前位置,然后将 write 指针重置到缓冲区开头写入数据,从而保证单个数据块的连续性。写入前需检查是否有足够空间。
  4. 读取逻辑

    • 读取线程顺序读取数据,直到遇到 write 指针或 watermark(标记了“空洞”的开始),然后更新 read 指针。

内存序考虑 所有原子操作都需要指定内存顺序(Ordering)。为简单起见,示例使用了最强的顺序一致性(SeqCst)。在实际高性能实现中,为了性能可能会使用更宽松的顺序,但这增加了在特定平台(如ARM)上出现并发错误的风险,需要通过跨平台测试来验证。

实现示例 文章提到了两个实现项目:

  • spsc-bip-buffer:作者Andrea Lattuada的实现,注重性能,可能使用了经过优化的内存序。
  • bbqueue:作者James Munns的实现,为嵌入式系统提供了便捷接口,支持静态分配,并可以拆分成独立的生产者和消费者,以适应中断与非中断上下文。
15. You've just inherited a legacy C++ codebase, now what? (gaultier.github.io)

处理遗留 C++ 代码库的指南

接手一个大型、复杂、陈旧的遗留 C++ 代码库后,可以通过一系列分步骤、可管理的改进来使其变得可维护。核心目标是付出最小努力,在安全、开发体验、正确性和性能方面达到可接受的状态。

总体策略

  • 获取支持:在开始任何技术工作前,与所有相关方(包括老板、同事)沟通,用简单的例子解释问题、解决方案和预计时间。
  • 原则:所有更改都应是增量的,确保应用程序在更改前后都能工作;能集成到现有工作流中;每个改进都应可测量和解释;如果暂停,相比之前也应有净收益。

具体步骤

1. 基础设施准备

  • 明确支持平台:在 README 中列出官方支持的 <架构>-<操作系统> 对,包括开发者工作站。
  • 本地构建:确保代码能在所有支持平台上可靠、一致地构建。
  • 本地测试:确保现有测试能在本地通过(若无测试,需先编写基础端到端测试)。
  • 文档化:在 README 中记录如何构建和测试,力求命令简单。

2. 优化构建与清理

  • 加速构建:寻找“低垂果实”,如避免构建不必要的依赖项测试/示例、使用更快链接器、调整构建选项。
  • 删除无用代码:使用编译器警告(如 -Wunused)、静态分析工具并结合支持平台列表,移除死代码和不支持平台的代码,可显著减少编译时间。

3. 引入工程实践

  • 静态分析(Linters):增量引入如 clang-tidycppcheck 等工具,设置基本规则,避免过度配置。
  • 代码格式化:在无活跃分支时,使用 clang-format 等工具一次性格式化整个代码库,并提交配置,避免无休止的风格争论。
  • 消毒剂(Sanitizers):使用 -fsanitize=address,undefined 等,能发现真实的内存错误和未定义行为。即使测试,也能暴露隐蔽 bug。
  • 持续集成(CI):设置 CI 流水线,自动运行构建、测试、lint 和格式化检查,并在多平台矩阵上运行以验证平台支持。

4. 代码改进

  • 增量改进:专注于简化代码、提升安全性、正确性和性能。可逐步升级 C++ 标准以利用现代特性简化代码,但目标是实用而非追求“最时髦”的语法。
  • 内存安全语言重写:可作为最终考虑,但需有充分理由并认识到其中的复杂性。

依赖管理

  • 批评现有方式:依赖系统包管理器(如 aptbrew)的问题包括跨平台不一致、难以控制编译选项、版本锁定困难等。
  • 批评第三方包管理器Conanvcpkg 等也存在依赖、版本覆盖不全、平台支持问题。
  • 推荐方法:使用 git submodule 从源代码编译依赖。优点包括:简单、版本精确、跨平台、可控制编译标志、易于审计和打补丁。

来自读者的建议(摘要)

  • 强调测试:测试需在消毒剂下运行才可靠。
  • 工具探索vcpkgNix 可能作为依赖管理器,各有优劣。
  • 实用主义:不必过度投资于极少修改的代码库;移除代码需谨慎,可结合静态分析和与业务方沟通确认;不必追求“代码美观”,聚焦于价值添加。
  • 其他:确保代码在版本控制中;可利用版本控制统计识别高变更区域;此指南也适用于其他语言的遗留代码库。
16. Show HN: Workout Tracker – self-hosted, single binary web application (github.com)

Workout Tracker 是一个自托管、单文件二进制的 Web 应用程序,适用于个人(或家庭、朋友)的健身记录追踪,特别针对跑步及其他基于 GPX 文件的活动设计。

核心功能

  • 记录上传:支持上传 GPX、TCX 或 FIT 格式的健身文件,可手动操作或通过 API 自动进行(例如使用 Fitotrack)。
  • 个人数据追踪:手动或通过 API 及同步(例如 Fitbit)记录每日体重、步数等个人统计数据。
  • 手动创建记录:可手动创建力量训练、俯卧撑、游泳等活动的健身记录。
  • 路线段与进度:创建路线段以跟踪个人进展,应用会尝试匹配相关健身记录。
  • 设备管理:跟踪正在使用的健身装备。
  • 统计与进度:通过统计图表查看进展。
  • 热力图:可视化展示过往活动轨迹的频繁区域。

部署与启动

  • Docker:提供预构建的 Docker 镜像(支持 amd64/arm64),通过 docker run 命令即可快速启动,需挂载数据目录。支持通过环境变量或文件设置 JWT 加密密钥以持久化会话。也提供 docker compose 配置文件用于 SQLite 或 PostgreSQL 数据库。
  • 原生运行:可下载预编译的二进制文件或从源码构建(需 Go 语言环境)。运行即在当前目录创建数据库文件,并在 http://localhost:8080 启动 Web 服务器。

界面与使用体验

  • 登录注册:新用户默认需要管理员激活,可禁用注册功能。
  • 仪表板:显示个人总计、跑步记录、日历视图及近期活动。
  • 健身概览:展示所有活动的概览与摘要。
  • 单次健身详情:提供可缩放、拖拽的地图轨迹,详细的统计信息,按公里/英里分解的数据,基于海拔的轨迹着色,速度/海拔/心率/步频图表,以及交互式工具提示。
  • 文件上传:支持批量上传文件,并可选择活动类型或让应用自动推断。
  • 统计图表:显示按月聚合的统计数据,可调整时间范围。
  • 热力图:可平移和缩放查看活动轨迹地图。
  • 每日测量:记录体重、步数等日常数据,用于估算健身消耗的卡路里。
  • 多语言支持:支持多种语言,可通过 Weblate 协助翻译。
  • 响应式设计:适配中小屏幕,并自动切换浅色/深色模式。

配置与 API

  • 配置:可通过 workout-tracker.yaml 配置文件或环境变量进行设置。最重要的配置是 JWT 加密密钥,缺失则每次启动随机生成,导致会话失效。
  • API:提供 Swagger 文档。用户需启用 API 访问并获取密钥,可通过查询参数或请求头传递。支持通过特定端点上传文件,以及手动创建健身记录和设置每日测量数据。

技术实现

  • 单二进制文件:将所有前端资产(HTML, CSS, JS)打包进一个 Go 编译的二进制文件,无外部依赖。
  • 技术栈:后端使用 Go 语言(库包括 Echo, Gorm, templ 等),前端使用 HTMX、Lit、Tailwind CSS、Leaflet(地图)、ApexCharts(图表)等。
  • 数据库:默认使用 SQLite 单文件存储,也已增加对 PostgreSQL 和 MySQL 的支持(MySQL 尚未充分测试)。
  • 地图服务:使用 OpenStreetMap 和 Esri 作为地图和地理编码提供商。
  • 开发支持:提供开发容器、Nix flake 以及详细的 Makefile 构建命令,方便从源码构建和开发。

兼容性与现状

应用已测试兼容来自 Garmin Connect、FitoTrack、Workoutdoors 等多种来源的 GPX 文件。项目仍在开发中,待办事项包括编写测试、增加反向代理认证支持以及完善对其他文件类型(如 Garmin FIT 文件)的导入支持。

18. Dallol (en.wikipedia.org)

Dallol 摘要

Dallol 是埃塞俄比亚东北部达纳基尔洼地(Danakil Depression)内的一个独特陆地热液系统,围绕一个火山渣锥火山形成,位于厄塔阿勒山脉(Erta Ale Range)附近。坐标为14°14′30″N 40°18′00″E,海拔-48米(低于海平面),是世界上已知最低的陆上火山口之一。

地质与形成

Dallol 由玄武岩岩浆侵入中新世盐层并伴随热液活动形成。其面积约3×1.5公里,高出周围盐平原约60米。中心有一个圆形凹陷,可能为坍塌火山口。地形包括水蚀盐峡谷、柱状体和块状物,以及众多盐泉和喷气孔。

热液特性

Dallol 以极酸性热泉闻名,排放缺氧、超酸性(pH < 0)、超盐度(比海水咸10倍)、高温(超过108°C)的卤水,含铁浓度超过26 g/L。排放气体包括二氧化碳、硫化氢、氮气和二氧化硫等。其极端的物理化学条件(低pH、高盐度、高温、缺氧)使它成为地球上罕见的“多极端”环境之一。

火山活动

最近的火山活动迹象出现在2011年1月,可能为深层脱气事件。1926年发生过蒸汽岩浆喷发,形成Dallol火山,并在附近盐滩上留下其他喷口。该区域是地球上最干燥和最热的地方之一,低于海平面125米。

颜色与矿物

Dallol 以 unearthly 颜色和矿物图案著称,颜色变化从白色、浅绿色到黄色、橙色、红色,源于无机铁的氧化。主要矿物包括石盐、黄钾铁矾、赤铁矿、铁锈矿、石膏、硬石膏、钾石盐和光卤石。其他特征包括盐柱、迷你间歇泉、花状晶体等。

生物争议与科学意义

关于生命存在有争议:一项2019年研究(发表在《自然生态与进化》)认为,由于超酸性、超盐度和高镁环境,Dallol的多极端池塘中无生命;但另一团队报告首次发现生命迹象,鉴定出超小Nanohaloarchaea目古菌。盐平原有嗜盐微生物,但极端环境可能抑制生命。Dallol 是天体生物学研究的关键系统,用于探索生命的极限。

历史与文化

“Dallol”一词由阿法尔人创造,意为溶解或崩解。意大利殖民者曾在此开采硫磺,但该区域因极端条件而探索有限。附近其他热液特征包括Gaet'ale池和黑湖。

19. Ask HN: Are there any websites for SQL puzzle games?
20. NVK is now ready for prime time (www.collabora.com)

NVK 开源 Vulkan 驱动宣布达到生产就绪状态

主要宣告:

  • 开发者 Faith Ekstrand 宣布,Mesa 中为 NVIDIA 硬件提供的开源 Vulkan 驱动 NVK 已准备好用于主流环境(prime time)。
  • 一个合并请求已落地,移除了“非合规实现”的警告,并将 Meson 配置选项从 nouveau-experimental 更改为 nouveau。这标志着向 Linux 发行版发出信号,可以开始向用户分发 NVK。
  • NVK 将包含在 Mesa 24.1 中,预计会出现在 2024 年春季或秋季的主流 Linux 发行版更新中。

关键的合规性进展:

  • NVK 现已是一个符合规范的 Vulkan 1.3 实现
  • 支持的 GPU 架构包括:
    • Turing (RTX 2000 系列, GTX 1600 系列)
    • Ampere (RTX 3000 系列)
    • Ada (RTX 4000 系列)
  • 此进展相比 2023 年 10 月宣布的 Vulkan 1.0 合规性是一次重大飞跃,并且本次合规性测试是在启用 GSP 固件的情况下完成的,覆盖了更多 GPU,且未使用任何临时补丁(hacks)。所有通过的测试也在上游 Mesa 中通过。

游戏与图形 API 兼容性:

  • DirectX 兼容性:
    • DXVK(用于运行 D3D11 游戏的转译层)现在可以在上游 Mesa 上开箱即用。
    • 虽然不能保证所有 D3D11 游戏都完美运行(可能存在错误),但核心要求已满足。
    • 对于 D3D12 游戏(通过 VKD3D-Proton 模拟),支持工作仍在进行中,部分工作已完成,但仍有缺失,因此目前还不支持 D3D12 游戏。
  • OpenGL 支持策略:
    • 长期计划是使用 Zink(一个将 OpenGL 调用转译为 Vulkan 的 Gallium 驱动)配合 NVK 来提供 OpenGL 4.6 支持。
    • 虽然 Zink + NVK 的组合尚未解决所有错误,但已在许多情况下性能超越旧的 nouveau OpenGL 驱动,并有望在未来提供更好的功能和稳定性。
    • 旧的 nouveau OpenGL 驱动将继续存在并正常工作。

当前状态与性能:

  • 性能仍在持续优化中,并且定期得到改善。
  • 在近期的 GPU 上,许多游戏/应用可以达到 60 FPS 或更高。
  • 对于性能不佳的情况,瓶颈仍在识别和解决中。
  • 建议用户通过实际尝试来了解自己常用游戏或应用的性能表现。
21. Over 100k Infected Repos Found on GitHub (apiiro.com)

GitHub大规模恶意仓库攻击事件分析

攻击概述

安全研究团队检测到自2023年中开始的恶意仓库混淆攻击大规模复发,影响超过10万个GitHub仓库。攻击者通过复制知名开源项目、注入恶意代码并大量分叉的方式,诱骗开发者下载被感染的代码。

攻击手法

攻击采用类似"依赖混淆"的策略,但不针对包管理器,而是利用开发者选择仓库时的人为失误:

  1. 克隆现有仓库(如TwitterFollowBot、WhatsappBOT等自动化工具)
  2. 注入恶意代码加载器
  3. 以相同名称重新上传至GitHub
  4. 自动分叉每个仓库数千次
  5. 通过论坛、Discord等渠道隐蔽推广

感染后果

当开发者使用恶意仓库后,恶意负载会:

  • 经过七层混淆展开
  • 加载修改版的BlackCap-Grabber恶意软件
  • 窃取浏览器密码/cookie、应用程序登录凭证及其他敏感数据
  • 将数据发送至攻击者的命令控制服务器(C&C)
  • 执行一系列额外恶意活动

技术特征

  • GitHub虽自动移除大部分分叉仓库,但仍有约1%存活(仍达数千个)
  • 攻击具有二次传播效应:部分用户无意中继续分叉恶意仓库
  • 恶意代码使用exec(Fernetexec(requests等Python模式执行

活动演变时间线

时间 发展阶段
2023年5月 恶意包上传至PyPI,通过流行GitHub仓库分叉传播
2023年7-8月 转向直接在GitHub上传恶意仓库,不再依赖PyPI
2023年11月至今 大规模爆发,超过10万个恶意仓库持续增长

攻击趋势分析

此次攻击反映了恶意活动从包管理器向源代码管理平台的转移:

  • GitHub平台庞大,恶意仓库相对占比极小,难以检测
  • 不涉及包管理器,减少了恶意包名等明显指标
  • 针对低流行度的小众仓库,增加误用概率

感染检测指标

检查以下Python代码模式:

  • exec(Fernetexec(requestsexec(__import
  • exec(bytesexec(compile
  • __import__("builtins").exec(

防护建议

  1. 验证仓库来源:仔细核对仓库的真实性
  2. 移除可疑仓库:特别是自动化工具相关仓库
  3. 凭证重置:若怀疑感染,重置浏览器、邮箱、加密货币钱包等所有凭证
  4. 报告恶意仓库:发现后及时向GitHub举报
  5. 代码扫描:使用恶意代码检测工具监控代码库

总结

此次攻击展示了软件供应链的脆弱性,即使平台有安全机制,攻击者仍能通过自动化大规模操作成功注入恶意代码。开发团队需超越传统漏洞检测,加强对代码注入攻击的监控。

23. Ask HN: Why is HN so often down?

该用户提问《HN为何如此频繁宕机?》,反映了近期网站可用性下降的现象,并汇总了社区讨论中提出的多种可能原因。

用户描述的现象:

  • 频率高:用户每天都会多次看到"We're having some trouble serving your request. Sorry!"的错误页面,一天可达10-20次。
  • 时间关联性:此问题在欧洲的午餐时段(美国凌晨时段)尤为突出。
  • 近期恶化:用户感觉此现象近期比以往更为频繁。

社区讨论中提出的可能原因与观察:

  1. 登录状态影响:有观点认为,保持登出状态可以显著提升访问速度并减轻服务器负载。
  2. 速率限制:特别是对于未登录用户,访问频率可能受到限制。
  3. 特定内容审查(存疑):一条评论提出了一个具有争议性且未经证实的说法,即用户可能因为发布了关于"Google/DEI"的负面内容或进行了相关互动(如点赞、浏览)而被"限时禁闭"。用户表示此说法"尤其令人不安"。
  4. 系统性问题:有用户提供了外部监控工具 (hackernews.onlineornot.com),表明该问题已持续存在并受到社区关注。

用户的后续行动: 用户根据评论建议,开始尝试减少登录频率,以观察是否与登录状态相关。

25. How does the sky turn dark at night? (apod.nasa.gov)

夜空如何变暗?

根据“每日一天文图”网站发布的文章,夜空变暗是一个渐进的过程,并伴随着从地平线升起的不同特征颜色。

关键图像与观测

文章以一张在意大利西西里岛锡拉库萨拍摄的照片为例进行说明。该照片展示了日落后从左到右(即越来越晚的黄昏时段)的20个垂直条带,拍摄方向与太阳位置相反。

变暗的阶段与特征颜色带

天空从明亮变暗的过程中,会出现几个明显的颜色带状区域:

  1. 金星带:出现在地平线上方,是地影(地球本身的阴影)开始上升时可见的带状区域。
  2. 蓝带:位于金星带上方。
  3. 地平带:接近地平线的区域。
  4. 红带:通常在地平带附近或与其重叠。

随着夜晚降临,地球的暗影上升,天空逐渐变暗。

颜色形成的原理

这些带状区域的颜色主要由以下原因形成:

  • 直接阳光反射:太阳光被地球大气中的空气和气溶胶(悬浮颗粒)反射。
  • 多次反射:光线经过多次反射,有时涉及到被染红的落日余晖。
  • 折射:光线在大气中发生折射。

观测实际情况

文章指出,在实际观测中,这些颜色带可能比较弥散、不易辨认,且其颜色可能受落日附近色彩的影响。

结论

最终,太阳完全落下地平线,天空彻底变暗。文章最后补充说明,当日出时,这个变暗过程会完全反向进行,天空将重新变亮。

26. New jet engine enables efficiency at every speed for cheaper orbital launches (twitter.com)

新型喷气发动机实现全速域高效运行,助力更经济的轨道发射

该文章介绍了一种新型喷气发动机技术,其核心创新在于能够在从低速到高超音速的不同飞行状态下均保持高效运行。这一特性有望显著提升运载火箭的性能,特别是在单级入轨或可重复使用运载器的应用中。

关键点包括:

  1. 技术原理:该发动机可能采用变循环或自适应循环设计,使其在大气层内起飞、加速及穿越不同速度区间时,均可优化推进效率。
  2. 效率优势:传统发动机通常在特定速度区间高效,而新型发动机拓宽了高效运行的速度范围,减少了能量损失,提升了整体燃料利用率。
  3. 成本影响:通过提升运载效率并支持更灵活的发射任务设计,该技术有望降低轨道发射的成本,推动商业航天与频繁发射任务的发展。

应用前景:该技术未来可能应用于空天飞机、可回收运载火箭等先进运载系统,促进更经济、可持续的太空访问。

27. Talc – A fast and flexible allocator for no_std and WebAssembly (github.com)

Talc – 快速灵活的 no_std 和 WebAssembly 内存分配器

Talc 是一个动态内存分配器,专为 no_std 环境(如嵌入式系统和操作系统内核)以及 WebAssembly 模块设计,可作为 DLmalloc 的直接替代品。

主要用途

  • no_std 环境:适用于嵌入式系统、操作系统内核和其他无标准库环境。
  • WebAssembly 模块:作为 DLmalloc 的替代品,用于 WebAssembly 分配。

为什么选择 Talc?

性能表现

  • 快速高效:在 Linux x86_64 基准测试中表现出色。
  • 快速且体积小:针对 WebAssembly 基准测试优化,占用资源少。

功能特点

  • 安全无锁分配:TalcCell 支持单线程分配,兼容 GlobalAlloc 和 Allocator 接口。
  • 灵活多线程支持:通过 lock_api 和 TalcLock 实现可扩展的多线程分配。
  • Allocator API 支持:集成 allocator-api2,便于在安全 Rust 中使用 Allocator API。
  • 分配统计功能:提供计数器,用于调试和性能分析。
  • 堆管理灵活性:支持创建和调整任意多个堆,可手动或自动操作。
  • 自动内存回收:自动回收未使用的内存,提高效率。
  • 正确性验证:通过测试、MIRI 和模糊测试确保可靠性和安全性。

为什么可能不选择 Talc?

  • 成熟系统推荐:在支持 jemalloc 或 mimalloc 的成熟宿主系统中,这些替代方案可能更优。
  • 替代方案优势:提供更好的分配并发性、经过充分测试的虚拟内存 API 集成,以及更成熟、复杂和优化的实现。
  • 默认分配器性能:即使是 Linux 上的 Rust 默认分配器,也具有出色的性能特性。

入门资源

  • Talc README:提供基本使用指南。
  • Talc WebAssembly README:针对 WebAssembly 的详细配置和示例。
  • API 参考:官方文档,用于深入理解和集成。
28. CT scans show how Heinz's new ketchup cap depends on shear-thinning principles (www.lumafield.com)

文章探讨了塑料饮料瓶的工程发展史,重点介绍了PET(聚对苯二甲酸乙二醇酯)材料的崛起及瓶装水工业推动的轻量化变革。

  • 工程投入的普遍性:人类将大量工程精力投入日常物品,例如塑料水瓶,其背后涉及材料、设计和制造工艺的长期优化。
  • 从玻璃到塑料的演变:19世纪末至20世纪初,玻璃瓶成为主流饮料包装;1970年代中期,可口可乐推出丙烯腈共聚物塑料瓶(“Easy-Goer”),但因材料会渗漏有害物质,于1977年被FDA禁止。
  • PET的主导地位:杜邦公司Nathaniel Wyeth于1973年获得PET塑料瓶专利。PET具有透明、坚固、化学稳定等优点,迅速取代丙烯腈瓶,成为饮料包装的主流材料。
  • 制造工艺:现代塑料瓶主要通过**注射拉伸吹塑(ISBM)**工艺生产。首先将PET注塑成瓶坯,再加热、拉伸、吹塑成型,此过程可提升瓶体强度并降低重量。瓶盖则通过注塑或压缩成型。
  • 瓶装水工业与轻量化:1990年代,瓶装水成为塑料瓶的主力市场(如百事的Aquafina、可口可乐的Dasani)。为降低生产和运输成本,工程师大幅优化瓶体设计:
    • 采用“花瓣形”瓶底替代早期需要粘贴的圆形底座。
    • 瓶壁厚度从早期的0.3-0.4毫米减至0.17毫米以下。
    • 螺旋加强筋设计提升堆叠和运输强度。
    • 例如,尼亚加拉公司的“Eco-Air”半升瓶自1998年以来塑料用量减少60%。
  • 可持续性挑战:尽管PET瓶可回收,但实际回收率有限,且多用途回收后降级使用。玻璃瓶虽可回收,但不同颜色混合后难以再制成新容器,常被用作填充材料。
  • 总结:塑料饮料瓶的演变体现了针对大规模消费的工程优化,但其环境影响仍引人深思。未来可能需要更彻底的解决方案。
29. Unearthing the oldest forest on Earth (worldsensorium.com)

地球上最古老森林的发现

核心发现:在纽约开罗地区一处采石场底部,研究人员发现了一片保存完好的远古森林化石,其年代可追溯至约3.86亿年前的中泥盆纪,这是迄今地球上已知最古老的森林。

发现与研究团队:该遗址由纽约州立博物馆沉积岩馆长查尔斯·维斯特拉登及其同事首次发现。后续研究由宾汉姆顿大学荣休教授威廉·斯坦因与英国卡迪夫大学古植物学家克里斯托弗·贝里领导的国际团队进行。

森林特征与意义

  1. 极端古老:通过先进的测年技术,科学家确认其年龄比著名的亚马逊雨林和日本屋久岛森林更为古老,甚至比第一批恐龙出现的时间还早1.4亿年。
  2. 生态系统窗口:这片森林保存了丰富的植物化石,包括蕨类、棕榈类以及通过孢子繁殖的树木(它们是种子植物的祖先)。这为了解当时与恐龙共存的早期陆地生态系统提供了珍贵证据。
  3. 科学价值:该发现不仅揭示了前恐龙时代的生物多样性,也挑战了此前关于中泥盆纪植物生命的认知。研究重点之一是分析这些远古植物如何从大气中吸收二氧化碳,这对理解地球气候历史具有重要意义。
  4. 现实启示:研究古代森林的生态系统及其动态,能为当前面临森林砍伐等挑战的时代提供关于生物多样性保护和过渡期生态系统理解的参考。

总结:这一发现为地球地质历史增添了重要篇章,通过深入探索这些化石遗迹,科学家得以窥探近四亿年前的地球景象,深化了对植物演化及古代生态系统的认识。