2024-12-18

37 篇热帖

1. Moon (ciechanow.ski)

本文全面介绍了月球的科学知识,涵盖其运动规律、与地球和太阳的相互作用、表面特征以及可见现象。

月球是地球唯一的天然卫星,其运动由引力主导。它围绕地球沿椭圆轨道运行,导致与地球的距离和视大小周期性变化。由于潮汐锁定,月球自转周期与公转周期相同(约27.3天),因此始终以同一面朝向地球。然而,其轨道偏心率和轨道面的微小倾斜,使得从地球观测时,月球表面会略微左右摇晃(经天平动)和上下摆动(纬天平动),让我们总共能看到约59%的月球表面。

月球的运动存在多种周期,如恒星月(相对于恒星,约27.3天)、交点月(回到升交点,约27.2天)、近点月(回到近地点,约27.6天)和朔望月(相同月相重复,约29.5天)。太阳的引力会扰动月球轨道,导致其交点退行(约18.6年一周)和近地点进动(约8.85年一周)。

月球表面布满撞击坑,从简单的碗状坑到带有中央峰的复杂环形山,乃至巨大的多环盆地。一些大型盆地被古代玄武岩熔岩填充,形成颜色较暗的月海。月表覆盖着一层由细小岩石碎片和玻璃珠组成的表岩屑

光照造就了月球的视觉变化。月相周期(朔望月)是由于日、地、月三者相对位置变化,导致我们看到的被照亮月球部分不同所致。月球土壤具有独特的光学特性:在相位角很小时(如满月),月球表面异常明亮,这种现象称为冲日效应,主要归因于相干背向散射阴影隐藏效应。此外,月球暗面有时被地球反射的阳光微微照亮,称为地球反照

当日、地、月三者精确排列时,可能发生日食月食。当月球遮挡太阳时发生日食,分为全食、环食和偏食。当地球阴影投射到月球上时发生月食,月球在月食期间常呈现暗红色。

总之,月球是一个因引力而系于地球的岩石世界,其规律运动、地质特征和光影变化,共同构成了我们夜空中最熟悉而又充满奥秘的天体。

2. FTC bans hidden junk fees in hotel, event ticket prices (www.cnbc.com)

美国联邦贸易委员会(FTC)于周二通过一项规则,要求售票商、酒店和度假租赁网站在广告价格中披露总费用,禁止在结账末期隐藏附加费用。该规则是拜登总统打击“垃圾费用”行动的最终措施之一,旨在消除那些没有提供可见利益却增加消费者成本的隐藏收费。

规则要求服务费、度假费和其他常添加到预订中的费用必须包含在广告价格内。FTC估计,这将为美国消费者每年节省约5300万小时,避免他们在购买前耗费时间计算总成本。拜登总统在声明中强调,隐藏费用让消费者在结账时被迫支付更多,并呼吁持续打击此类非法收费。

然而,该规则的实施可能面临政治挑战。候任总统特朗普可能寻求撤回该规则以进行进一步审查,而共和党控制的国会也可能通过立法废除它。此外,FTC主席Lina Khan敦促执法者继续打击不公平费用,并鼓励州和联邦政策制定者通过立法全面禁止此类收费。

该规则比FTC在2023年提出的范围更窄,后者计划广泛禁止所有行业的隐藏和欺骗性费用。拜登政府的其他监管行动已遭遇企业诉讼,如得克萨斯州一名法官阻止了信用卡滞纳金上限规则,新奥尔良上诉法院也阻止了航空公司提前披露行李费的要求,这些案件仍在进行中。

3. Boardgame.io: an engine for creating turn-based games using JavaScript (github.com)

Boardgame.io:基于JavaScript的回合制游戏引擎

概述

Boardgame.io 是一个使用 JavaScript 创建回合制游戏的引擎。开发者只需编写描述特定移动如何改变游戏状态的函数,该引擎便会自动将其转换为可玩的游戏,并包含完整的在线多人游戏功能,无需编写任何网络或存储代码。

核心功能

  • 状态管理:游戏状态在客户端、服务器和存储之间自动同步管理。
  • 多人游戏:支持实时跨平台的游戏状态同步。
  • AI:可自动生成与您游戏对战的机器人。
  • 游戏阶段:支持不同的游戏规则和每个阶段的回合顺序。
  • 大厅:提供玩家匹配和游戏创建功能。
  • 原型设计:提供界面,可在渲染游戏前模拟移动。
  • 可扩展性:通过插件系统允许创建新的抽象。
  • 视图层无关:可使用原生 JS 客户端或 React / React Native 的绑定。
  • 日志:具备游戏日志功能,支持时间旅行(查看早期状态的棋盘)。

使用方法

安装与文档

开发者可通过官方文档学习如何使用 boardgame.io,并可在 Gitter 社区提问。

示例与开发

仓库中的 examples 文件夹提供了可运行的示例。该项目支持在 VS Code 中使用开发容器进行运行。

社区参与

项目欢迎各种形式的贡献:

  • 报告问题:可通过创建 issue 报告 bug。
  • 提问:Gitter 频道和 GitHub Discussions 是提问的合适场所。
  • 贡献代码:有意修复 bug 或添加功能者,可查阅贡献指南和项目路线图。
  • 改进文档:欢迎提交即使是细微改动的拉取请求,文档页面可通过右上角的 “Edit on GitHub” 链接直接编辑。

许可证

该项目采用 MIT 许可证。

4. Silver amulet is the oldest evidence of Christianity north of the Alps (archaeologymag.com)

银护身符:阿尔卑斯山以北最古老的基督教证据

核心发现

考古学家在德国法兰克福附近的3世纪罗马墓地中发现了一枚银质护身符(称为“法兰克福银质铭文”),其年代约为公元230-270年。这是阿尔卑斯山以北已知最早的基督教实物证据,比该地区此前已知的基督教文物早了近50年。

发现详情

  • 出土位置:护身符发现于2017-2018年法兰克福海曼大街一处罗马墓地(古罗马城市尼达遗址)的挖掘中。该墓地包含127座墓葬,其中一座男性墓葬(死者年龄35-45岁)的颈部下方发现了卷起的银箔,推测原本佩戴于颈部。
  • 文物性质:该护身符属于护符(phylactery),旨在通过其内容保护佩戴者。墓中还伴随香炉和陶器等陪葬品。

铭文内容与解读

  • 技术手段:通过美因茨莱布尼茨考古中心(LEIZA)的计算机断层扫描技术,研究人员以非侵入方式对脆弱的银箔进行数字化“展开”,避免了手动操作导致的损毁。数字化成像显示了18行拉丁文。
  • 文本翻译(摘要):

    以圣提多之名。 圣哉!圣哉!圣哉! 以耶稣基督,上帝之子之名! 世界的主 尽其所能抵抗一切挫折。 上帝赐予平安…… 此护佑之物保护 那顺服 主耶稣基督(上帝之子)旨意的人, 因在耶稣基督面前 万膝必跪:天上的、地上的和地底下的, 万口必认(耶稣基督)。

  • 文本特征
    • 开篇提及使徒保罗的门徒圣提多,并包含“圣哉!圣哉!圣哉!”及“以耶稣基督之名”等基督教礼赞。
    • 内容几乎逐字引用了《腓立比书》2:10-11。
    • 法兰克福歌德大学的马库斯·舒尔茨教授指出,铭文措辞严谨,可能出自专业抄写员之手,且完全未提及耶和华、天使或异教神祇,这在当时宗教融合普遍的背景下极为罕见。

研究意义

  1. 历史时间线修正:将阿尔卑斯山以北基督教证据的时间提前了数十年。此前文献暗示2世纪末高卢和上日耳曼尼亚已有基督教社群,但实物证据仅追溯至4世纪。
  2. 宗教文化背景:护身符的纯粹基督教内容与同期常见的宗教混合主义(融合基督教、犹太教和异教元素)形成鲜明对比,可能反映了佩戴者坚定的信仰,也引发了对尼达(Nida)城市基督教角色的思考——该城曾是罗马日耳曼尼亚的文化与行政中心。
  3. 罗马帝国互联性:发现彰显了罗马帝国时期文化宗教的交流网络,表明基督教在边境多元文化环境中早有渗透。
  4. 技术协作范例:研究由法兰克福市政府、法兰克福考古博物馆、LEIZA、歌德大学、波恩大学及莱茵-美因考古网络等多机构合作完成,体现了跨学科技术(如高分辨率CT扫描)在文物分析中的关键作用。

结论

法兰克福银质铭文不仅为早期基督教传播提供了关键实物证据,也揭示了3世纪罗马边境地区宗教生活的复杂性,推动了对基督教在多元文化环境中兴起与发展的进一步探索。

5. Updates to H-1B (www.uscis.gov)

H-1B签证项目重大更新

美国国土安全部(DHS)宣布了一项最终规则,旨在显著增强美国公司在关键领域填补职位空缺的能力,从而加强美国经济。该规则通过简化审批流程、增加灵活性以帮助雇主留住人才、以及加强项目完整性和监督,对H-1B项目进行了现代化改革。

核心目标

该规则旨在更好地满足美国企业的劳动力需求,同时减少对雇主的不必要负担,并严格遵守所有美国工人保护法律。美国国土安全部部长亚历杭德罗·N·马约卡斯表示,这些改进将使雇主在招聘全球人才方面拥有更大灵活性,从而提升美国的经济竞争力。

主要变化与灵活性

  1. 更新专业职业定义:对“专业职业”职位的定义和标准进行了现代化更新,以帮助雇主招聘到符合业务需求、能在全球市场保持竞争力的员工。
  2. 扩大免名额限制范围:明确了可豁免年度法定H-1B签证名额限制的非营利组织和政府研究组织的标准。
  3. 延长身份转换灵活性:延长了持F-1签证、寻求将身份变更为H-1B的学生的特定灵活性,以避免其合法身份和就业授权中断。
  4. 提高处理效率:新规将允许美国公民及移民服务局(USCIS)更快地处理大多数此前已获批H-1B签证的个人的申请。
  5. 允许受益人拥有控股权:在满足合理条件的前提下,对申请组织拥有控股权的H-1B受益人也有资格获得H-1B身份。

加强项目完整性与监管

新规通过以下措施强化项目完整性:

  • 正式确立USCIS进行检查和对不合规行为实施处罚的权力。
  • 要求雇主必须证明在申请的开始日期存在一个真实的、专业职业职位供该雇员担任。
  • 明确劳工条件申请(LCA)必须支持并与H-1B申请正确对应。
  • 要求申请者在美国拥有合法存在,并需在美国法院接受法律程序。

实施时间表

为实施该规则,自2025年1月17日(规则生效日期)起,所有申请必须使用新版的I-129表格(非移民工人申请表)。由于不能宽限接受旧版表格,USCIS将在官方网站上提前发布新版表格的预览版本。

此项新规是继2024年1月宣布的、已显著改善H-1B注册和筛选流程的最终规则之后的又一重要改革。

6. The unbearable slowness of being: Why do we live at 10 bits/s? (www.cell.com)

根据提供的内容,该网页并非目标文章《The unbearable slowness of being: Why do we live at 10 bits/s?》的正文,而是访问该文章时触发的 Cloudflare 安全验证页面

页面的主要内容如下:

  • 性质:这是一个包含JavaScript代码的HTML页面,用于执行Cloudflare的“Managed Challenge”或机器人验证。
  • 核心功能:其脚本会检查访问者的环境(如浏览器、Cookie设置),以判断是否为人类用户,而非自动化程序。如果验证通过,将允许访问原始页面;如果失败或未启用JavaScript/Cookie,则会显示错误信息(如“Enable JavaScript and cookies to continue”)。
  • 代码结构
    1. 错误提示:当脚本未运行时,页面会显示要求启用JavaScript和Cookie的提示。
    2. 核心脚本:通过一个内联的JavaScript函数,它动态加载了Cloudflare挑战平台(/cdn-cgi/challenge-platform/h/b/orchestrate/chl_page/v1)的脚本,并传入了一系列加密的配置参数(如cFPWv, cH, cN, cRay, md, mdrd等)。
    3. 页面行为:脚本还会操作浏览器的history状态,试图在验证完成后将URL恢复为原始的文章链接。
  • 目的:该机制旨在保护目标网站(www.cell.com)免受恶意爬虫和自动化访问的侵扰。

总结:所提供的材料是访问Cell.com期刊文章时遇到的安全拦截页面,而非文章内容本身。它通过一系列脚本进行访客验证,无法从中获取关于“人类信息处理速率约为10比特/秒”这一科学主题的任何论述、论据或结论。若要获取文章摘要,需成功通过此验证并访问原始文章页面。

7. Optimizing Ruby's JSON, Part 1 (byroot.github.io)

优化 Ruby 的 JSON(第一部分)

作者成为 json gem 的维护者后,除了修复旧错误,还专注于性能优化,使其在大多数基准测试中成为 Ruby 最快的 JSON 解析器和生成器。这些优化并非基于深奥知识,而是通过性能分析驱动的简单、通用优化。

动机与背景

作者的初衷并非追求极致性能。ruby/json 虽然比流行的 oj gem 稍慢(例如解析推特数据 1.9ms 对 1.6ms),但在多数用例中差异不大。然而,oj 因其速度而非常流行,包括被用于 Shopify 代码库。作者强烈反对使用 oj,原因如下:

  1. Monkey Patching 的风险oj 常通过 Oj.mimic_JSON 替换 json gem,这可能导致安全漏洞(如忽略 script_safe 选项引发 XSS 攻击)和微妙的序列化行为差异(如时间精度问题)。
  2. 稳定性差:在大规模运行中,oj 是导致 Ruby 崩溃的主要来源之一,其代码中存在令人担忧的“hack”(例如曾通过禁用 GC 来绕过 bug)。 因此,作者的目标是让 ruby/json 的性能接近 oj,消除用户因速度而进行 Monkey Patching 的需求。

优化方法与成果

作者通过性能分析工具(如 samply)指导优化,主要针对 JSON 生成阶段。以下是一些关键优化:

1. 避免冗余检查

  • 问题:在处理 UTF-8 字符串时,isLegalUTF8rb_enc_str_asciionly_p 会重复扫描字符串以验证编码。
  • 方案:利用 Ruby 字符串内部缓存的 coderange 属性。优化后,代码先检查 ascii_only?,若非纯 ASCII 则仅在 coderange 未知时验证编码,避免重复扫描。
  • 效果:在 twitter.json 基准测试中提升约 3%。提升未达预期,因为节省的时间部分被后续处理字符的内存访问开销抵消。

2. 优先检查更可能发生的条件并优化分支预测

  • 问题fbuffer_inc_capa 函数(缓冲区扩容)中,每次调用都先检查缓冲区是否已分配(但几乎总是已分配),浪费了 CPU 周期。
  • 方案
    1. 将检查顺序调整为:先检查最可能的情况(容量足够),再检查低概率情况(需初始化或扩容)。
    2. 使用 RB_UNLIKELY 宏告知 CPU 分支预测,减少分支误判。
    3. 将函数标记为 inline,减少函数调用开销。
  • 效果:在 twitter.json 基准测试中提升 15%。

3. 降低初始化(Setup)成本

  • 问题:生成 JSON 前的准备工作(如解析选项、预计算分隔符)开销较大,尤其在微基准测试中表现不佳。
  • 方案:取消为“美观输出”选项预计算分隔符字符串的优化,因为该预计算本身开销大且多数情况未使用。
  • 效果:在小对象基准测试中性能提升 1.5 倍。

4. 避免指针追逐

  • 问题:频繁调用 rb_enc_get 检查字符串编码。该函数是高层 API,包含大量类型检查和内存访问(指针追逐)。
  • 方案:改用更底层的 RB_ENCODING_GET 直接获取编码索引,并直接比较索引值(整数比较)而非编码指针,避免不必要的内存加载。
  • 效果:在 twitter.json 基准测试中提升 8%。

5. 使用查找表优化字符串转义

  • 问题:逐字符转义时,每个字符都需要多个条件判断(是否需转义)。
  • 方案
    1. 使用一个预计算的 256 元素布尔数组(查找表)标记哪些字符需要转义,将多次条件判断简化为一次数组查询。
    2. 增加快速路径:先用查找表快速检查整个字符串是否无需转义。若是,则一次性复制整个字符串,避免逐字符循环。
  • 效果:在 twitter.json 基准测试中带来 30% 的巨大提升。

总结

这些优化虽然涉及 C 代码,但其核心思想(避免冗余工作、优先检查高概率条件、减少内存访问、利用查找表)是通用的性能优化策略,适用于任何语言。作者通过持续的性能分析和应用这些简单但有效的优化,显著提升了 json gem 的性能,使其不再明显落后于替代方案。更多优化将在后续文章中介绍。

8. How to lose a fortune with one bad click (krebsonsecurity.com)

如何因一次点击损失数十万:加密货币钓鱼骗局深度剖析

骗局核心手法

骗子利用 Google Forms(谷歌表单) 发送看似来自 google.com 域名的虚假安全警报邮件,利用其合法域名增强欺骗性。随后通过电话冒充谷歌支持人员,告知受害者账户正遭入侵,并引导其点击手机上弹出的 “账户恢复”确认提示。一旦受害者点击“是”,骗子即可获得其谷歌账户访问权限。

受害者经历

Adam Griffin(损失近50万美元)

  • 过程:接到冒充谷歌支持的电话(号码显示为谷歌助理官方号码),同时收到伪装成谷歌安全警报的邮件。在骗子引导下点击了账户恢复确认提示,导致谷歌账户被控制。
  • 关键漏洞:他曾将加密货币钱包的助记词照片存储在与该账户同步的 Google Photos 中,导致资金被全部转走。

Tony(损失45比特币,时值约472.5万美元)

  • 过程:同样接到冒充谷歌支持的电话和警报,点击了账户恢复确认。随后又被冒充硬件钱包(Trezor)客服的骗子诱骗,在钓鱼网站输入了助记词
  • 心理状态:事发时忙于照顾幼儿,思维混乱,未能遵守安全协议。

骗子技术手段与策略

  1. 利用可信服务:通过 Google Forms 发送警报邮件,使其看起来来自合法域名。
  2. 社会工程学:骗子表现得专业、耐心,利用受害者忙乱状态施加压力。
  3. 自动化工具:使用机器人自动拨打电话筛选易受骗目标。
  4. 利用账户关联:默认情况下,Google Authenticator 的验证码会同步至谷歌云端账户。一旦谷歌账户被攻破,骗子即可获取用于登录加密货币交易所的双重验证码。

案例关联与后续

  • 两位受害者收到的虚假警报包含相同的虚假“谷歌支持案例编号”,指向同一诈骗团伙。
  • 一名自称“Daniel”的骗子在播客中透露,他们通过 Minecraft 游戏结识,专门从事此类诈骗,并声称鲜有法律后果。
  • 受害者事后持续收到更多诈骗电话,表明他们的信息可能已被列入目标名单。

安全建议

  1. 应对可疑电话:接到任何关于账户安全问题的电话,应立即挂断。自行查找相关机构官方电话号码进行核实并回拨。
  2. 保护谷歌账户
    • 使用强健、唯一的密码。
    • 启用物理安全密钥或通行密钥等防钓鱼的多重身份验证方法。
    • 考虑加入谷歌的高级保护计划
  3. 处理 Google Authenticator
    • 进入应用设置,选择 “不使用账户” ,关闭云端同步功能,以防止验证码被在线窃取。
    • 务必备份好一次性恢复码,并安全存储。
  4. 加密货币存储
    • 绝对不要以任何形式(照片、文本)将助记词存储在联网设备或云服务中。
    • 将助记词记录在物理介质上,并存放于安全的地方。

核心警示:您的电子邮件账户通常是整个数字身份的钥匙。保护好它,并意识到基于电话的钓鱼骗局极具迷惑性,必须保持高度警惕。

10. Cultural Evolution of Cooperation Among LLM Agents (arxiv.org)

LLM代理间合作的文化进化研究摘要

研究背景

大型语言模型(LLM)为构建通用能力AI代理提供了基础,这些代理可能代表个人或群体利益,在现实世界中大规模部署。目前,对多代LLM代理交互的动态了解有限。本研究探讨LLM代理“社会”在面临背叛激励时,能否学习互惠社会规范,这类似于人类社会性的关键特征。

研究方法

研究通过经典迭代Donor Game考察LLM代理间间接互惠的进化。在游戏中,代理可以观察同伴的近期行为,并在多代部署中迭代交互。研究比较了不同基础模型(如Claude 3.5 Sonnet、Gemini 1.5 Flash和GPT-4o)的社会合作演化。

主要发现

  • 模型差异显著:不同基础模型的合作进化表现不同。Claude 3.5 Sonnet代理的社会平均得分最高,其次是Gemini 1.5 Flash,最后是GPT-4o。
  • 惩罚机制影响:Claude 3.5 Sonnet能利用额外的惩罚机制来达到更高得分,而Gemini 1.5 Flash和GPT-4o则无法有效利用该机制。
  • 初始条件敏感性:在每个模型类别中,不同随机种子下出现行为变化,表明对初始条件的敏感依赖性,这是一个研究不足的方面。

潜在应用

本研究的评估体系可启发一类低成本且信息丰富的LLM基准测试,专注于LLM代理部署对社会合作基础设施的影响。这为未来AI代理的社会行为研究提供了新方向。

11. Ergo Chat – A modern IRC server written in Go (github.com)

Ergo Chat:用Go编写的现代IRC服务器

项目概述 Ergo(前身为Oragono)是一个用Go语言编写的现代IRC服务器,融合了IRC守护进程、服务框架和IRC弹跳器(bouncer)的功能。它旨在简化部署和使用,同时提供丰富的特性和高度可定制性。

核心设计原则

  1. 易于部署和使用
  2. 功能集成:内置账号管理(NickServ)、频道管理(ChanServ)、虚拟主机(HostServ)、历史消息存储与回放等。
  3. 前沿标准支持:支持最新的IRCv3协议规范,可作为参考实现。
  4. 运行时可重载配置:通过YAML配置文件实现,可在服务运行时重载而无需重启。

主要功能特性

  • 集成服务:内置NickServ、ChanServ和HostServ。
  • 弹跳器特性:支持多客户端共享同一昵称、存储并回放聊天历史。
  • 网络与安全:原生支持TLS/SSL及客户端证书,支持SASL认证和LDAP。
  • 配置与运维:使用YAML格式配置文件,支持运行时重载(rehash)更新配置和证书。
  • 国际化与兼容性:支持多语言网络设置,可选支持UTF-8昵称与频道名(RFC 8265 PRECIS)。
  • 高级安全隐私:可强制所有登录使用SASL、隐藏IP地址、作为Tor隐藏服务运行。
  • 权限与管理:可扩展的IRC操作员权限系统,支持UBAN统一封禁系统(可针对IP、网络、掩码、注册账号)及KLINE/DLINE,密码使用bcrypt存储。
  • 标识查询:支持通过ident协议查询用户名。
  • 规范导向开发:注重遵循协议规范进行开发。

快速入门

  1. 下载:从GitHub Releases页面下载最新版本。
  2. 初始化配置
    cp default.yaml ircd.yaml
    vim ircd.yaml  # 根据需要编辑配置文件
    
  3. 生成证书./ergo mkcerts
  4. 启动服务器./ergo run

其他安装方式

  • 平台包:已在Arch Linux AUR和Gentoo Linux中提供维护包。
  • Docker:提供Dockerfile和docker-compose示例,镜像发布在ghcr.io/ergochat/ergo
  • 从源码构建:需要Go语言环境,克隆仓库后切换到stable分支,执行make进行构建。项目已包含所有依赖项。

配置说明

  • 配置文件路径可通过--conf参数指定。
  • 默认的default.yaml文件包含了详细的选项说明。
  • 日志默认输出到stderr,可配置输出到文件或通过systemd定向到系统日志。
  • 密码可通过./ergo genpasswd工具生成bcrypt加密字符串用于配置。

用户操作

  • 使用/msg NickServ register <password>注册昵称账号。
  • 启用客户端的SASL认证以自动登录账号,确保能使用已注册的昵称。
  • 使用注册的昵称账号,通过/join/CS REGISTER来注册和管理频道。

测试与社区

  • 可以连接testnet.ergo.chat(TLS端口6697,明文端口6667)进行测试。
  • 项目由多位开发者和贡献者共同维护,详细贡献信息可参见DEVELOPING.md
13. Show HN: ImPlot3D – A 3D Plotting Library for Dear ImGui (github.com)

ImPlot3D:面向Dear ImGui的3D绘图库

ImPlot3D是Dear ImGui的扩展库,提供易于使用、高性能的3D绘图功能。其API设计深受ImPlot启发,对熟悉ImPlot的开发者来说直观易用。该库专为渲染可定制标记、线条、曲面和网格的3D图形而设计,是应用程序中进行3D数据可视化的理想解决方案。

核心功能

  • GPU加速渲染
  • 丰富的绘图类型:包括线图、散点图、曲面图、四边形图、三角形图、网格图、文本图和图像图。
  • 交互式操作:支持旋转、平移和缩放3D图形。
  • 高度可定制:提供10种标记类型、可调大小、线宽、轮廓颜色、填充颜色等样式选项。内置16个色图,并支持用户添加自定义色图。
  • 界面集成:可选的图表标题、坐标轴标签和网格标签。支持可配置的图例及切换按钮。
  • 主题适配:默认样式基于当前的ImGui主题,也支持完全自定义图表样式。

使用与集成

  1. API风格:与Dear ImGui和ImPlot风格类似。通过 ImPlot3D::BeginPlot() 初始化图表,使用 PlotLinePlotScatterPlotSurface 等函数绘制数据,最后以 ImPlot3D::EndPlot() 结束。
  2. 集成步骤
    • 确保已有可运行的Dear ImGui环境(仅依赖Dear ImGui,不依赖ImPlot)。
    • implot3d.himplot3d.cppimplot3d_internal.himplot3d_items.cpp 添加到项目。可选添加演示文件 implot3d_demo.cpp 和预加载网格支持文件 implot3d_meshes.cpp
    • 与ImGui上下文同步创建和销毁 ImPlot3DContext
  3. 关键配置提示:Dear ImGui默认使用16位索引,在处理高密度3D图形(如复杂曲面或网格)时可能导致问题。建议通过取消注释 #define ImDrawIdx unsigned int 启用32位索引,或确保渲染器支持 ImGuiBackendFlags_RendererHasVtxOffset 标志。

设计理念与定位

  • 为何存在:填补Dear ImGui在3D数据可视化工具上的空白,提供轻量、实时的3D绘图库,专注于交互性和易用性。
  • 与ImPlot的区别:灵感来源于ImPlot,API相似,但专为3D可视化打造,提供交互式的旋转、平移和缩放。
  • 是否依赖ImPlot:不依赖,是独立库。
  • 是否支持2D绘图:虽可通过旋转对齐2D平面,但官方推荐对2D数据使用ImPlot,ImPlot3D专注于3D。
  • 适用场景:适合调试、模拟和数据分析中的实时交互式3D可视化。若需出版级质量的输出,建议将数据导出到MATLAB、matplotlib或ParaView等专业工具。

资源与社区

  • 文档与示例:API在头文件中有详细注释,完整的功能演示见 implot3d_demo.cpp
  • 多语言支持:可通过绑定(如Python的imgui-bundle、C的cimplot3d、Lua的LuaJIT-ImGui)用于其他语言。
  • 贡献与许可:项目欢迎贡献,采用MIT许可证。
15. In Defense of Y'All (www.texasmonthly.com)

英语中第二人称复数代词的缺失问题
英语缺乏自然的第二人称复数代词,其他语言如西班牙语(ustedes、vosotros)、法语(vous)、意大利语(voi)和普通话(你们)均有对应词汇。这导致英语使用者长期使用“you guys”等表达来填补空白,但“you guys”存在性别中立争议。

“y'all”的实用优势
文章为“y'all”辩护,认为其在南方和德克萨斯长期使用,具有无性别暗示、节奏优美的特点,能有效替代“you guys”。它避免了“you guys”可能带来的性别歧义问题,例如对老年女性使用“guy”可能不敬。

反驳《纽约时报》的观点
《纽约时报》专栏将“y'all”贬为过于口语化、地域性或“种族性”,不适合全球采用。文章反驳称,“y'all”已超越地域限制,证据包括:

  • 作家Maud Newton在《纽约时报》撰文描述其从拒绝到接受“y'all”的经历,并称其代表美国方言的精华。
  • 费城杂志(2019)建议用“y'all”替代“youse”,称其温暖包容。
  • Dictionary.com将“y'all”列为“you guys”的性别中性替代词之一。
  • 语言学家Guy Bailey(2000)研究发现“y'all”在非南方地区广泛使用,年轻人更易接受。
  • BBC(2022)报道“y'all”在英语世界的扩散,包括美国及其他英语国家。

历史背景与普及趋势
“y'all”自大迁徙时期(约1910年至1970年代初)以来,随非裔美国人迁移传播至全美。互联网时代虽加速语言同质化,但“y'all”仍保持活力,其普及可能促使北方人寻求替代词(如“youse”“yinz”)。

结论
文章强调“y'all”的实用性与包容性,认为其无需因地域或“种族”标签而被抵制,欢迎所有人使用。

16. Trying to Recreate iOS on the Web (homescreen.app)

尝试在网页上重现iOS主屏幕

该网页项目旨在使用HTML、CSS和JavaScript技术,重新创建一个仿真的iOS设备主屏幕界面。

关键技术与配置

  • 移动优先设计:通过viewport元标签进行设置,确保页面在移动设备上正确缩放,禁用用户缩放并支持安全区域。
  • 类原生应用体验:使用apple-mobile-web-app-capablemobile-web-app-capable等元标签,使网页能以类似原生应用的全屏模式运行。
  • 状态栏定制:通过apple-mobile-web-app-status-bar-style标签设置为black-translucent,以模拟iOS应用的状态栏样式。
  • 应用图标:配置了apple-touch-iconfavicon,用于在设备主屏幕和浏览器标签页上显示应用图标。
  • 清单文件:引用了一个Web应用清单(manifest.json),用于定义应用的名称、图标等,支持“添加到主屏幕”功能。
  • 脚本加载:主体功能由一个模块化的JavaScript文件(/assets/index-B8yyzYe0.js)驱动,该文件可能是整个界面逻辑的核心。
18. How concurrecy works: A visual guide (wyounas.github.io)

并发编程的可视化与状态空间

并发编程因其复杂的交织执行而难以理解。通过状态空间进行可视化,是理解并发程序运行机制的有效方法,尤其适合初学者。

核心概念

  • 程序状态:由变量值和位置计数器(指向下一条待执行指令)共同定义。
  • 状态空间:程序在一次执行中所有可能状态的集合,可表示为一个有向图,节点是状态,边代表状态间的转移。

从顺序到并发:状态空间的演变

  1. 顺序程序:状态转移是确定的。例如一个简单程序,其状态(n, 位置计数器)按固定序列变化。
  2. 并发程序:状态表示为三元组(共享变量,进程P的计数器,进程Q的计数器)。由于指令执行顺序的不确定性交织,从同一初始状态可能转移到不同的后续状态,导致程序行为多样。
  3. 复杂性增长:即使是对并发程序稍作扩展(如增加进程或语句),其状态空间也会呈指数级增长,使得完整的可视化和人工分析变得不切实际。

形式化验证:模型检查

为应对状态空间爆炸带来的测试与调试挑战,文章引入了模型检查(如SPIN工具)。其核心思想是:

  • 不依赖想象,而是通过系统化生成和检查状态空间来验证程序。
  • 定义程序必须满足的安全性(坏事永不发生)和活性(好事终将发生)属性。
  • 使用线性时序逻辑来精确描述这些属性(如[] (total == 1 || total == 2 || total == 0),表示“总是”成立)。
  • 工具会自动检查整个状态空间,确认属性是否在所有可能的状态下都成立,从而为并发程序的正确性提供高置信度的保证。

总结

文章主张,理解并发程序应从可视化其状态空间入手,这能直观揭示交织执行带来的不确定性。对于复杂系统,则应借助模型检查等形式化方法,通过定义和验证安全与活性属性来确保其正确性,从而弥补传统测试方法的不足。

20. Lou's Pseudo 3D Page (2013) (www.extentofthejam.com)

这篇文章详细介绍了伪3D道路渲染技术的原理与实现,主要内容如下:

核心概念 伪3D道路是一种光栅特效,通过逐行改变屏幕扫描线的位置或属性(如滚动、颜色、缩放)来模拟3D透视效果。其优势在于计算量小、运行速度快,能产生独特的速度感和视觉扭曲效果,适合早期硬件。

基础实现

  • Z映射表:预先计算每个屏幕行对应的Z距离,用于准确映射道路纹理,避免“燕麦效应”(远处物体过度减速)。
  • 曲线控制:通过累积变量(位置、速度、加速度)逐行调整道路中心线偏移,实现曲线效果。可采用分段系统管理连续弯道。
  • 精灵绘制:根据Z映射表确定精灵的屏幕位置,使用画家算法(由远到近)绘制,并利用缩放因子调整大小。

坡道效果

  • 模拟坡道:通过调整Z映射表的读取步长,垂直拉伸或压缩道路纹理,模拟上下坡视觉效果。
  • 3D投影段:将道路划分为多边形片段,结合3D投影计算高度,实现更真实的坡道几何形状。

增强技术

  • 双道路叠加:如《OutRun》中使用两条重叠道路模拟多车道或分支路径。
  • 纹理应用:通过对道路纹理进行逐行拉伸或选择不同纹理行来实现道路标记。

案例分析

  • 专用硬件:如世嘉的道路芯片,使用高分辨率道路图形和逐行参数控制,支持双道路优先级。
  • 《Enduro》:在雅达利2600极有限的硬件上,利用HMOVE寄存器逐行移动导弹/球形精灵绘制道路轮廓,通过固定点数学实现曲线。
  • 《Road Rash》:结合3D投影段与伪3D曲线,添加多边形路边物体,营造立体感。
  • 《S.T.U.N. Runner》Lynx版:使用精灵模拟隧道多边形,通过硬件缩放实现高速视觉效果。

相关效果

  • 无尽棋盘格:类似《太空哈利》的地面效果,通过逐行调色板变化和滚动实现透视网格。
  • 其他引擎:如《Power Drift》的精灵块3D、《Racin' Force》的体素技术等变体。

关键公式

  • 3D投影公式:y_screen = (y_world * scale) / z + (y_resolution / 2)
  • 缩放因子:scale = (resolution / 2) / tan(FOV / 2)

该技术通过巧妙组合数学简化与视觉欺骗,在有限硬件上实现了令人信服的3D道路效果,至今仍对复古风格游戏开发有参考价值。

21. Includeable minimal operating system for C++ (www.includeos.org)

IncludeOS:C++的轻量级可嵌入操作系统

项目定位 IncludeOS 是一个面向 C++ 的、可嵌入的最小化操作系统。它允许应用程序在云环境中直接运行,无需依赖传统操作系统,通过将操作系统功能集成到应用中,创建高性能、安全且资源高效的虚拟机。

核心优势

  • 启动迅速:应用可在几十毫秒内启动。
  • 资源占用低:仅需几兆字节的磁盘和内存空间。

环境准备与构建 在 Linux 或 macOS 上运行 IncludeOS 服务,无需安装系统本身,但需安装依赖。以示例项目 hello_world 为例,所需依赖包括:

  • Conan 包管理器
  • cmake、make、nasm
  • clang(Linux 可选 gcc,提供 6.0/7.3 预编译包)
  • qemu
  • Python3 包:psutil、jsonschema

典型构建流程如下:

  1. 配置 Conan 源。
  2. 克隆示例仓库。
  3. 创建构建目录并安装依赖。
  4. 激活环境、生成构建文件并编译。
  5. 启动引导。 启动成功后,将看到系统版本和 "Hello world" 输出。

功能示例:TCP 回显服务 文章提供了一个简单的 TCP 回显服务器代码示例。它自动获取已配置的网络接口,在端口 7 上监听连接,并将接收到的任何数据原样回传给客户端。

网络配置 虚拟机的网络配置可通过同目录下的 config.json 文件定义。该文件以 JSON 格式指定接口索引、配置方式(如 DHCP 及静态回退)、IP 地址、子网掩码和网关。

安全与维护

  • 安全相关咨询请发送至指定邮箱,可使用提供的 PGP 密钥加密。
  • 项目维护者为 Alfred Bratterud。

其他说明 文章末尾包含一条与项目技术无关的软件推荐。

23. Ad: An Adaptable Text Editor (github.com)

ad 文本编辑器概要

ad(发音为 A.D.)是一款实验性文本编辑器,旨在结合 vi/kakoune 风格的模态编辑Plan9 Acme 的可扩展性哲学。其核心特点是将文本视为可编辑亦可执行的对象。

⚠️ 项目状态与注意事项

  • 实验性:主要作为探索文本编辑器特性的“试验场”,目前不推荐作为主力编辑器。
  • 稳定性:已足够稳定可供试用,但文档较少,可能存在未发现的错误。
  • 活跃开发:键绑定和默认行为可能随更新而改变,具体变更需参考 Git 日志。

👀 主要功能与设计理念

ad 混合了多种编辑器的优点:

  • 模态编辑:类似 Vim 的交互方式。
  • 文本导航与选择:借鉴 Vim/Kakoune 的便利操作。
  • 扩展性:受 Emacs 的 mini-buffer 和 Acme 的哲学启发,通过虚拟文件系统接口暴露编辑器状态和功能,允许外部客户端程序直接交互,打造“集成的开发环境”。
  • 编辑命令:采用类似 Sam/Acme 的命令式编辑(已提取为独立 crate)。
  • 鼠标支持:支持但非必需,更适合笔记本键盘操作。

🏗️ 技术实现与模块

ad 从头实现了许多功能,主要模块包括:

  • buffer/internal:用于缓冲区内存的间隙缓冲区
  • dot:处理当前选择(包括 Vim 风格动作)。
  • exec:Sam 编辑语言核心的最小实现。
  • fsys:类似 Acme 的虚拟文件系统接口(由 ninep 模块支持 9P 协议)。
  • lsp:最小的 LSP 客户端。
  • regex:自定义的、可在字符流上工作的正则表达式引擎,灵活性优先于性能。
  • syntax:基于 tree-sitter 的语法高亮,若无语法文件则回退到基于正则的高亮。
  • trie:用于序列键绑定的字典树数据结构。

🔧 获取与使用

由于打包尚未完成,推荐从源码编译:

git clone git@github.com:sminez/ad.git
cd ad
cargo install --path .
cargo xtask setup-dotfiles

启动后使用 :help 命令查看内置帮助。

❓ 项目动机

开发者长期使用 Vim/Neovim/Kakoune,喜爱其核心编辑功能,但非常欣赏 Acme 通过文件系统协议与外部程序无缝集成的能力。ad 旨在融合模态编辑的高效Acme 的开放可扩展性,同时实现 Rob Pike 在 Sam 中提出的结构化正则表达式,打造一个小型、可 hack 的编辑器。

24. We Built the Saturn V (2017) (www.smithsonianmag.com)

土星五号火箭:人类登月之梦的钢铁见证

土星五号火箭是人类为实现登月梦想而打造的奇迹工程。它的名字“V”源自其第一级并联的五台F-1火箭发动机——这些至今仍是人类制造过的最强火箭发动机。这款巨型运载火箭的研发可追溯至1950年代末美国的军事需求,后在沃纳·冯·布劳恩的领导下,随着1961年肯尼迪总统宣布登月目标,转变为一个庞大的国家工程。

庞大的工程与建造

土星五号是一项全国协作的壮举。其三级火箭结构由分布在美国各地的私人承包商分别制造,从阿拉巴马州到加利福尼亚州。所有部件完成后,通过驳船和专用飞机运往佛罗里达州的肯尼迪航天中心,在当时世界上最大的单层建筑——飞行器装配大楼中进行组装。组装过程极其精密,因为来自不同公司的各部件此前从未对接,必须确保所有电路、管路和指令信号完美兼容。

巨大的挑战与牺牲

参与者的回忆揭示了项目的艰巨性。工程师李·索利德在28岁时开始参与项目,团队非常年轻,且工作强度极大,基本无休息日。技术挑战层出不穷,其中F-1发动机的燃烧不稳定性问题尤为突出。工程师保罗·卡斯滕霍尔茨回忆,在一次测试中,燃烧室突然爆炸,毁坏了测试台。为解决此问题,他们耗费数月,在燃烧室中插入模拟爆炸的“炸弹”进行测试,最终通过修改喷注器设计,历经两年和上百次测试才攻克难题。

此外,火箭燃料具有极高危险性。阿特·莱纳斯提到,曾有工作人员因接触液氧或氮气而伤亡,这警示着每一次操作的风险。

创新的测试策略:全面测试

项目早期计划进行约20次测试飞行才能尝试登月。然而,载人航天飞行办公室主任乔治·穆勒提出了革命性的“全面测试”概念:首次试飞即搭载全部三级发动机及阿波罗飞船。冯·布劳恩最初认为这过于冒险,但穆勒的论点——部分测试的飞行器构型不具代表性——最终说服了团队。这一大胆决策极大地压缩了时间表,使得第三次发射的土星五号(阿波罗8号)就能在1968年将宇航员送入月球轨道,第六次发射(阿波罗11号)便实现了首次登月。

震撼的发射与个人的代价

土星五号的发射场面极其震撼。艺术家切特·耶泽斯基描述道,它起初静静矗立,随后在没有巨响的情况下开始上升,接着是滚雷般的轰鸣,直击观者的“内脏”。记者沃尔特·克朗凯特在首次发射报道中惊呼:“我们的建筑在摇晃!吼声太可怕了!”

然而,项目的成功背后是无数人的巨大个人牺牲。工程师詹姆斯·米泽尔表示,他错过了整个越南战争,因为无暇关注新闻;他的女儿称他为“拜拜爸爸”,因为他清晨离家、深夜归家。高强度压力导致办公室中75人离婚,酗酒和抑郁症普遍存在,心理问题在当时被视为软弱的表现。

最后的骄傲

尽管过程艰辛,但土星五号取得了辉煌成功:共13枚火箭升空,无一失败。它将人类送往前所未有的远方,至今仍是美国最自豪的成就之一。它不仅是工程学的巅峰,更是数千名普通工程师、技术人员和工人集体智慧与奉献精神的结晶,是一台值得铭记的“人类最伟大的机器”。

25. Show HN: I built an open-source data pipeline tool in Go (github.com)

Bruin 数据管道工具概览

Bruin 是一个用 Golang 编写的开源数据管道工具,它将数据摄入、数据转换(支持 SQL、Python 与 R)以及数据质量检查整合在一个统一的框架中。该工具旨在为数据工程师提供一个全面、高效的端到端解决方案。

核心功能与特性

  • 数据摄入:可通过 ingestr 或 Python 进行数据摄入。
  • 多语言转换:支持在多种数据平台上使用 SQL、Python 和 R 编写转换逻辑。
  • 物化选项:支持表/视图的物化以及增量表更新。
  • 环境隔离:使用 uv 在隔离环境中运行 Python 代码,确保依赖管理的干净与安全。
  • 数据质量:内置数据质量检查功能。
  • 模板化:支持 Jinja 模板,减少代码重复。
  • 管道验证:支持通过 dry-run 对整个管道进行端到端的验证。
  • 灵活部署:可在本地机器、EC2 实例或 GitHub Actions 上运行。
  • 密钥管理:通过环境变量注入 secrets。
  • 开发体验:提供 VS Code 扩展以提升开发效率。
  • 易于安装:基于 Go 编写,安装和使用简单。

适用平台 Bruin 兼容所有主流数据平台。

安装与社区 详细的安装指南和快速入门教程可在项目主页找到。用户还可以加入项目的 Slack 社区进行交流。

26. Grammarly acquires Coda (coda.io)

Grammarly 收购了文档协作平台 Coda,两家公司合并旨在共同打造“AI原生生产力套件”。Coda 联合创始人 Shishir Mehrotra 将担任合并后公司的首席执行官。

此次合并源于双方对AI驱动生产力未来的共同愿景。Coda 专注于重新定义“光标”(即用户交互界面),构建了一个集文档、数据库、应用于一体的全能平台,并于2023年推出了AI助手Coda Brain。而Grammarly 则利用AI技术增强了全球数百万用户在现有各种应用(超过50万个应用和网站)中已有的“光标”,提供智能写作建议,拥有4000万月活用户。

两家公司认为,尽管发展路径不同,但他们的技术和愿景高度互补。合并将加速实现“AI原生”的未来——人类与AI在各个工作场景中协同工作,并重塑整个生产力套件。

短期计划:

  1. 增强Grammarly助手:将Coda Brain的上下文感知能力与Grammarly助手集成,使其不仅能提供写作建议,还能理解用户在邮件、文档、CRM等各系统中的工作内容,提供更智能的帮助。
  2. 统一产品体验:将Grammarly助手无缝融入Coda文档中,为用户提供一个灵活的“AI原生”工作主页;同时,Grammarly助手将继续在其他所有工作场景中提供价值。

长期愿景: 两家公司计划将各自的最佳特性深度融合,结合企业知识、生成式AI聊天、完整生产力套件以及数百个AI代理,共同为用户和团队打造一个统一的AI生产力平台,目标是“为AI时代重新定义生产力”。

对于现有的Coda用户,文档将继续正常工作,并将快速整合双方共同的AI发展路线图。

29. Decline in teen drug use continues, surprising experts (arstechnica.com)

青少年药物使用率持续下降趋势

近年来,青少年物质使用率持续下降,这一趋势让专家感到惊讶。疫情期间的八年级学生现已高中毕业,他们这一代人推动了物质使用率达到几十年来的最低点。

具体下降数据

  • 酒精:2024年,八年级学生过去12个月的使用率为12.9%,与2023年相似,均为历史最低点。十年级学生使用率从2023年的30.6%显著下降到26.1%,十二年级学生从45.7%下降到41.7%,两者均创下历史新低。

  • 尼古丁电子烟:十年级学生使用率从17.5%下降到15.4%,八年级和十二年级学生保持低水平。

  • 大麻:八年级和十年级学生使用率保持低水平,十二年级学生使用率从29%显著下降到25.8%。所有三个年级的水平都是自1990年以来的最低点。

禁欲率增加

在过去30天内戒除酒精、大麻和尼古丁的青少年比例有所上升:

  • 八年级学生禁欲率达到90%,高于2017年的87%。

  • 十年级学生禁欲率为80%,高于2017年的69%。

  • 十二年级学生禁欲率为67%,高于2017年的53%。

专家观点

研究人员指出,这种青少年物质使用减少的趋势是前所未有的。专家强调,必须继续研究促成这一风险降低的因素,以便制定更有效的干预措施,支持这一积极趋势的持续发展。

30. FastVideo: a lightweight framework for accelerating large video diffusion models (github.com)

FastVideo:加速大型视频扩散模型的轻量级框架

FastVideo 是一个统一的后训练与实时推理框架,专为加速视频生成而设计。

核心特性

1. 端到端后训练支持

  • 支持模型:适用于双向与自回归的视频 DiT 模型。
  • 微调方式:支持全参数微调与 LoRA 微调。
  • 数据处理:提供视频、图像、文本数据的预处理流水线。
  • 蒸馏技术
    • 分布式匹配蒸馏 (DMD2) 步进蒸馏。
    • 稀疏蒸馏结合视频稀疏注意力 (VSA),可实现 >50 倍的去噪加速。
    • 通过自强迫 (Self-Forcing) 进行因果蒸馏。
  • 训练优化:支持 FSDP2、序列并行、选择性激活检查点,实现可扩展训练。

2. 推理性能优化

  • 分布式推理:支持序列并行。
  • 注意力后端:集成多种先进注意力后端(如视频稀疏注意力、滑动窗口注意力)。
  • 接口:提供用户友好的命令行界面 (CLI) 和 Python API。

3. 硬件与系统兼容性

  • 硬件:支持 NVIDIA H100、A100、4090 等 GPU。
  • 操作系统:支持 Linux、Windows、macOS。

4. 实时视频生成与编辑 —— Dreamverse

  • 功能:实时流式生成视频,并支持“直觉式指导” (vibe directing) 进行实时编辑。
  • 部署方式:可本地部署于 GPU,也支持自托管的 B200 服务器、Docker 容器或无服务器 Modal 平台。

快速开始

推荐使用 uv 管理 Python 环境。安装基本框架:

uv venv --python 3.12 --seed
source .venv/bin/activate
uv pip install fastvideo

生成视频示例

以下是一个最小化生成示例(需安装 VSA 内核):

import os
from fastvideo import VideoGenerator

def main():
    os.environ["FASTVIDEO_ATTENTION_BACKEND"] = "VIDEO_SPARSE_ATTN"
    generator = VideoGenerator.from_pretrained(
        "FastVideo/FastWan2.1-T2V-1.3B-Diffusers",
        num_gpus=1
    )
    prompt = "A curious raccoon peers through a vibrant field of yellow sunflowers, its eyes wide with interest."
    video = generator.generate_video(
        prompt,
        output_path="my_videos/",
        save_video=True
    )
if __name__ == '__main__':
    main()

相关模型与研究

FastVideo 的技术被多个先进研究项目采用或借鉴,包括:

  • SGLang:其扩散推理功能基于 FastVideo。
  • DanceGRPO、SRPO、DCM:视频生成相关优化框架,代码基于 FastVideo。
  • HY-WorldPlay:使用该框架训练的动作条件世界模型。
  • Hunyuan Video 1.5、Kandinsky-5.0、LongCat Video:这些模型采用了类似视频稀疏注意力的架构。

引用

该框架基于以下研究成果:

  1. 《Vsa: Faster video diffusion with trainable sparse attention》
  2. 《Fast video generation with sliding tile attention》
31. Design Token-Based UI Architecture (martinfowler.com)

设计令牌UI架构总结

设计令牌定义与作用

设计令牌(Design Tokens)是以数据形式表达的基础设计决策,是设计系统的核心构建模块。它们作为跨学科协作的通用语言,确保设计师、开发者、产品经理等角色保持一致性;支持工具集成,可嵌入UI设计软件、翻译工具和文档系统;具备技术适应性,能转换为CSS、SASS、JavaScript等多平台代码。

核心价值:建立单一事实来源

设计令牌为设计与工程团队提供单一事实来源,确保产品间视觉与功能一致性。通过翻译工具(如Style Dictionary、Theo等)可将令牌文件转换为平台特定代码(如CSS变量)或生成文档。

自动化分发流程

为快速同步设计变更,建议建立自动化部署流水线

  1. 版本控制:将设计令牌存于Git仓库(通过Figma插件如Tokens Studio实现双向同步),以仓库而非设计工具为单一来源。
  2. 流水线设计
    • 全自动流水线(基于主干):包含检查(验证令牌文件)、构建(生成平台代码与文档)、测试(视觉回归、可访问性测试)、发布(自动发布至npm)、通知等步骤。
    • 手动审批流水线:增加预览环境与人工审批环节,适用于需要额外审查的场景。
  3. 分发方式:生成代码作为库发布,产品团队通过依赖管理自主控制升级节奏。

令牌组织架构(分层模式)

为平衡可扩展性、可维护性与开发体验,令牌按抽象层级组织:

三层结构:

  1. 选项令牌(Option Tokens):定义可用的设计选项(如颜色色板、间距比例),提供基础资源库。
  2. 决策令牌(Decision Tokens):指定选项如何上下文应用(如“表面色使用grey-100”),是开发者的主要参考依据。
  3. 组件令牌(Component Tokens):将决策映射到具体UI组件(如“主按钮背景使用accent色”),明确应用位置。

关键原则:高层级决策指导低层级选择,减少冗余决策并保持一致性。实际项目中可能存在跳过层级的“雪花”情况。

令牌作用范围

为优化开发体验,可对令牌划分作用范围:

  • 私有/内部令牌:仅用于设计系统内部(如选项令牌),可变更而不破坏下游。
  • 公共/全局令牌:供产品团队直接使用(如决策与组件令牌)。

实现方式包括:

  1. 基于文件路径过滤:使用Style Dictionary等工具过滤非公共文件。
  2. 添加作用范围标志:为令牌添加如public: true的标识,支持更灵活的过滤(Figma变量已支持类似功能)。

适用场景评估

适合采用设计令牌的场景:

  • 多平台或多应用环境,需保持设计一致性。
  • 设计变更频繁,需高效传播。
  • 大型团队协作,需提升协同效率。
  • 已具备CI/CD基础,自动化成本较低。

可能无需设计令牌的情况:

  • 小型项目,设计复杂度低。
  • 设计变更速度、一致性与跨职能协作未构成瓶颈。

总结

设计令牌通过标准化、层级化与自动化,为现代UI架构提供可扩展的解决方案。其核心在于建立单一事实来源、合理组织决策层级并实现自动化分发,最终提升设计一致性、开发效率与跨团队协作体验。是否采用需根据项目规模、技术栈及团队协作需求综合评估。

32. CRDTs and Collaborative Playground (www.cerbos.dev)

CRDTs与协作式Playground

本文介绍了Cerbos公司如何在其名为“Playground”的协作式IDE与测试环境中,利用无冲突复制数据类型(CRDTs) 实现无缝的实时协作功能。

CRDTs简介

CRDTs是一类分布式数据结构,能在无需中央协调的情况下自动解决数据冲突,保证多用户对同一数据集进行并发操作后的最终一致性。其优势包括:

  • 天然支持离线操作
  • 简化了实时协作应用的开发,无需编写复杂的冲突解决逻辑。
  • 概念自2011年形式化以来,已广泛应用于各类场景。

主流CRDTs库

文章推荐了两个成熟的开源库:

  1. Yjs:生态庞大、集成简便、性能卓越,是许多CRDT应用的基础。其将复杂的树状结构优化为扁平列表的实现已成为行业标准。
  2. Automerge:由学术研究衍生,功能丰富且生产就绪,支持多种语言。

Cerbos的架构实现

Cerbos采用了后端为前端服务(BFF) 架构来构建Playground:

  • Node.js后端仅作为轻量级通信代理,不处理核心CRDT逻辑,专注于数据聚合与转发,降低了前端复杂度。
  • 用户浏览器作为主要真相源,使用IndexedDB在本地持久化CRDT状态。这极大降低了协作延迟,并实现了基本的离线支持。
  • 客户端间通过WebSocket进行通信,协议简单高效。

状态持久化与分布式挑战

为应对所有用户离线或长期不同步的边缘情况,以及支持全球分布式协作,Cerbos设计了扩展方案:

  1. 后端持久化:Node.js后端作为只读用户维护一份CRDT状态,并定期将其序列化后存入PostgreSQL数据库。用户加载时,可从此处恢复状态。
  2. 跨服务器同步:当用户连接到不同的后端实例时,通过Redis适配器(结合分布式锁机制)来同步和共享各实例间的CRDT状态,从而实现了跨地域、多实例的全局协作。

结论

通过结合CRDTs数据结构、BFF架构以及IndexedDB、PostgreSQL、Redis等存储技术,Cerbos的Playground实现了轻量、高效且可靠的实时协作功能,简化了访问控制策略的开发与测试流程,促进了团队间的知识共享与协同工作。文章也提及了自行实现基础CRDT的原理(如使用Lamport时间戳解决事件排序),但强调在生产环境中采用如Yjs这类成熟库更为稳妥。

33. A pilot crashed a full passenger jet into the bay, didn't lose his job (2021) (www.sfgate.com)
36. How We Centralized and Structured Error Handling in Golang (olivernguyen.io)

问题背景

Go 语言中错误处理本质上是灵活的,但缺乏统一结构。随着代码库增长,简单的错误返回导致日志混乱、错误消息不一致、难以追踪和监控。常见问题包括:

  • 各个包独立定义错误常量或类型,风格不统一。
  • 错误消息冗余、缺乏上下文,日志可读性差。
  • 没有标准化,错误处理方式因包而异,上下文易丢失。
  • 缺乏分类,无法有效监控错误频率和严重性。

解决方案:集中化结构化错误框架

团队构建了一个基于命名空间错误代码的集中化系统,核心设计原则如下:

  1. 集中化定义:所有错误代码在单一位置声明,采用命名空间结构(如 PRFL.USR.NOT_FOUND)。
  2. 分层包装:每个服务层或库必须返回自己的命名空间代码。收到依赖错误时,需用自身代码包装后再返回。
  3. 统一错误类型:所有错误实现扩展的 Error 接口(包含 Code() 方法),与第三方错误区分。
  4. 上下文与链式错误:错误可包含上下文(如 context.Context 和键值对),并支持包装多个子错误形成错误树。
  5. 自动映射:在代码中声明映射关系,框架自动将内部错误代码转换为 Protobuf ErrorCode、HTTP 状态码等。

核心实现细节

  • 错误代码:以 uint16 存储,字符串形式如 DEPS.PG.NOT_FOUND。通过结构化类型(如 depsprfl)组织代码声明,并生成初始化代码。
  • 错误类型
    • Error0:默认错误类型,可包装单个子错误。
    • VlError:用于验证错误,可包含多个子错误。
    • ApiError:适配器,用于迁移期间兼容旧 API 错误。
  • 创建错误:使用代码的 New()Wrap() 方法,并传入 context.Context。可附加键值对(如 With(l.String("key", value)))。
  • 检查与映射
    • IsErrorCode(err, codes...):检查错误是否包含指定代码。
    • MapError(ctx, err).Map(fromCode, toCode, ...):便捷映射错误代码。
  • 外部 API:标记为 api-code 的错误代码可对外暴露,否则返回通用内部错误。

迁移策略

  • 逐步迁移:从底层包开始,逐个替换为新的错误框架。
  • 添加单元测试:确保迁移不破坏现有功能。
  • 使用适配器:对于依赖高层包的情况,可暂时保留旧方法(标记为 DEPRECATED),新增 V2 方法返回新错误类型。
  • 扩展代码库:在迁移中逐步添加新错误代码,完善错误分类体系。

收益

  • 清晰日志:错误链和上下文信息让日志更具可读性。
  • 易于调试:堆栈跟踪和命名空间代码帮助快速定位问题。
  • 有效监控:通过错误标签分类,便于监控错误趋势和严重性。
  • 一致性:标准化错误处理流程,减少随意性。

该框架通过集中化、结构化设计,将 Go 的错误处理从混乱转变为可管理的系统,提升了代码可维护性和可观测性。

37. Show HN: celine/bibhtml: a Web Components referencing system for HTML documents (maxbo.me)

项目概述

@celine/bibhtml 是一个基于 Web Components 的 HTML 文档引用系统,旨在提供类似 LaTeX/BibTeX 的引用体验。它是 Citation.js 的轻量级封装,当引用或参考文献格式错误或 JavaScript 被禁用时能够优雅降级。该项目受 @citation-js/replacer、References Web Component 和 Nota 的引用方式启发。

核心功能

该系统围绕三个自定义元素构建:

  1. <bh-cite>:用于内联引用。它会显示引用的参考文献编号,并可配置替换标记(默认为 ?)。支持通过 ref 属性显式链接参考文献 ID,或通过 deref 标志将链接解引用为 Citation.js 确定的 URL。
  2. <bh-reference>:定义参考文献条目,必须包含 id 属性。支持多种格式:BibTeX、非结构化文本、DOI 和 Wikidata(分别由 Citation.js 的不同插件支持)。如果结构化格式错误,会降级为非结构化文本。
  3. <bh-bibliography>:渲染格式化的参考文献列表。使用 format 属性设置引文样式(目前仅支持 APA)。参考文献按 <bh-cite> 元素的引用顺序排列。

使用方式

可以通过两种方式引入:

  • 通过 CDN:在 HTML 的 <head> 中添加指定的 <script> 标签。
  • 通过本地文件:下载 mod.ts 文件并从项目中包含。

API 与配置

  • <bh-cite>marker 属性可自定义替换字符(默认为 ?),设置 marker="" 可禁用替换。
  • replacement 属性(默认为 "number")决定将标记替换为何种内容(如引用编号)。
  • <bh-reference> 支持四种引用格式:BibTeX 语法、非结构化文本、DOI 和 Wikidata 标识符。
  • <bh-bibliography>format 属性指定引文样式(当前仅 "apa")。

附加特性

  • <bh-cite> 元素从 DOM 中移除时,会通过 disconnectedCallback 将相应引用从参考文献列表中删除。
  • 项目使用语义化版本控制(当前为 6.0.0)。