2024-06-10

40 篇热帖

1. Show HN: Markdown HN profiles at {user}.at.hn (at.hn)

Markdown HN 个人资料展示
该项目提供了一种更丰富的 Hacker News 个人资料展示方式,用户可通过特定子域名访问。

使用步骤

  1. 在 HN 个人资料的“关于”部分添加 {你的用户名}.at.hn 即可启用。
  2. 访问 https://{用户名}.at.hn?refresh 查看更新。
  3. 特殊字符处理
    • 大写字母:替换为 {小写字母}0xNN(NN 为大写字母的 ASCII 十六进制码),例如 RallyDriverr0x52allyd0x44river
    • 下划线:替换为 0x5f,例如 rally_driverrally0x5fdriver
      (因 DNS 子域名不支持大写字母或下划线,需此方式编码以避免冲突。)

注意事项

  • 更新可能需等待几分钟(受 HN 或缓存影响)。
  • 支持 Markdown 格式优化显示,可通过 GitHub 提交 PR 改进。
  • 外部链接默认添加 rel=nofollow,仅当用户 Karma >200 时例外(防垃圾信息)。
  • 示例:padolsey.at.hn。
5. Designing a Lego orrery (marian42.de)

本项目详细记录了一款乐高科技系列太阳系仪(Orrery)的设计与搭建过程,旨在通过纯乐高零件精确模拟天体运动,包括地球与月球的公转、自转及月球潮汐锁定。

核心机械与天文模拟

为提升科学性,作者在基础轨道之外实现了复杂的天文现象模拟:

  • 地轴倾斜:使用22.5°角连接器模拟23.5°地轴倾角,并通过让地球底座相对于主臂反向旋转,确保地轴在公转时指向恒定。
  • 月球轨道倾角与交点退行:利用倾斜的圆形齿条和平行四边形连杆,使月球公转时产生上下位移(放大倾角以演示日月食);通过独立控制倾斜环模拟18.6年的交点退行周期。
  • 同心轴结构:利用科技轴、转盘、圆形齿条,并巧妙借助差速器外壳内部穿轴传递扭矩,在有限空间内实现了四个独立旋转的同心轴。

齿轮序列计算工具

针对乐高齿轮齿数受限及精确传动比(如365.25天)的计算难题,作者开发了一款基于TypeScript的齿轮序列计算工具。其核心功能与技术结构包括:

  • 算法匹配:结合数论与质因数分解寻找最优传动比。
  • 物理拼接优化:评估乐高拼接限制(如齿数和为16的倍数最易搭建),利用匈牙利算法为齿轮配对分配最小搭建“成本”。
  • 差速器拓展:利用差速器外壳转速为两输入轴平均值的特性,实现乐高齿轮无法直接提供的质因数传动比(如13)。

设计迭代与商业化

模型包含70个齿轮,需严格控制装配间隙或使用硅酮喷雾以减少摩擦。底座采用象征12个月的12段对称设计,并因噪音问题放弃了电机驱动。作者使用Bricklink Studio制作了264页说明书在Rebrickable发售,并用Blender制作了齿轮运转动画。为降低门槛,作者还推出了“低零件数版本”,简化底座并尽量兼容特定乐高套装的零件与现代配色。

竞品对比与未来展望

作者对比了市面产品:极力推荐CaDA发行的JK Brickworks设计(结构简单可靠);但不推荐乐高2024年官方版本(结构脆弱且定制零件存在瑕疵)。未来,作者放弃了受限于尺寸和成本的链条驱动全行星概念,计划使用激光切割亚克力板来设计下一款太阳系仪,以突破乐高零件的物理限制。

6. Elsevier embeds a hash in the PDF metadata that is unique for each download (2022) (social.coop)
9. Why Triplebyte Failed (www.otherbranch.com)

Triplebyte 失败复盘

本文是Triplebyte前产品负责人Rachel对其公司失败原因的深度反思,旨在为其新创业公司Otherbranch汲取教训,并为业界提供借鉴。

Triplebyte 公司概述

Triplebyte 是一家专注于软件工程师的技术招聘公司,拥有知名的创始团队(包括Y Combinator首位非创始人合伙人)和硅谷投资背景。其核心理念是通过技能测试和数据分析,突破传统简历筛选,发掘被忽视的优秀工程师,从而在崇尚“能力主义”的科技文化中占据一席之地。

在其存在的八年间,公司运营了四个主要产品:

  1. FastTrack:核心产品。候选人通过测试和面试后,直接推荐给公司并跳过现场面试。该产品以精英化、高品质服务著称,深受工程师喜爱。
  2. Source:被定位为“工程师版的LinkedIn”,是一个按需付费的技能认证工程师网络。该产品强调规模和可扩展性。
  3. Screen:增长实验。免费向公司提供测试工具,以换取候选人注册Triplebyte账户,旨在构建庞大的候选人数据库。
  4. Magnet:基于Source基础设施的自动化候选人挖掘工具。

失败的核心原因

公司失败通常非单一原因所致,但以下因素起到了决定性作用:

1. 未能规模化获取高质量候选人(核心问题) * 招聘业务的价值在于获取难以寻找的顶尖人才(如资深、美国本土工程师)。然而,这类候选人恰恰最难吸引,因为他们在市场上不愁工作机会。 * 即使FastTrack产品广受好评,其增长严重依赖高昂的广告投入,而非口碑。广告渠道存在严重的收益递减问题,且没有其他可持续的规模化获客方式。 * 这导致FastTrack产品虽在千万美元营收级别可行,但无法满足风险投资所期望的增长速度,形成死结。

2. 风险投资的“增长悖论” * Triplebyte的高品牌知名度很大程度上由巨额广告投入支撑,而这笔资金源于风险投资。 * 风险投资的核心期望是公司追求高速增长,而非停留在中等规模。因此,一个依赖风险投资才能实现盈亏平衡的“小而美”业务,从风险投资逻辑看并非真正可行的业务。 * 这迫使公司必须转向增长潜力更大的方向,从而引发了后续的困境。

3. 转向了无人想要的产品 * 为追求增长,公司从备受喜爱的FastTrack转向“工程师版LinkedIn”(Source)。但LinkedIn的核心价值在于其庞大的职位和候选人网络,这是Triplebyte短期内无法逾越的壁垒。 * 此举使公司失去了FastTrack时期在机会解锁、便捷性和人性化服务方面的独特优势,导致工程师用户流失。平台活动严重依赖早期FastTrack用户,证明了FastTrack强大的产品市场契合度,而新产品并未获得同样的认可。

4. “Screen”策略的战略误判 * 为获取候选人,公司免费向企业提供Screen测试服务,确实带来了海量候选人注册(高峰期月均数万)。 * 致命问题:使用Screen进行筛选的企业,通常是为处理大量初级或海外申请者,而非顶尖人才。Screen引入的候选人库与公司客户愿意付费寻找的资深、美国本土工程师群体几乎不重叠。 * 这导致公司构建了一个庞大但价值有限的候选人数据库。公司过度关注“使用量”等表面指标,未能及时认识到其与战略目标(获取高价值候选人)的背离。

5. 试图改变用户行为(理念冲突) * Triplebyte秉持强大的技术文化与“能力主义”信仰,坚信自己知道招聘“应该”如何进行,并试图改变雇主固有的招聘习惯。 * 这种以“正确性”为前提,进而说服用户的模式,相比于竞争对手直接满足用户现有需求的“客户驱动”模式,在商业上更为艰难。改变用户行为本身就是一个巨大的挑战。

总结与反思

Rachel总结道,经营企业充满艰难。Triplebyte的失败并非源于某个突发灾难,而是一系列在当时情境下不明显、却相互关联的因素所致:依赖广告获客无法规模化 → 在风险投资压力下被迫增长 → 转向失去核心吸引力的新产品 → 增长策略(Screen)引来低价值用户 → 固有的哲学理念与市场需求存在冲突

她强调,这段经历是一次宝贵的教训,旨在为后续的创业尝试提供警示:务必确保增长指标与战略目标真正一致,并深刻理解在风险投资模式下“可行业务”的复杂性。同时,她也认可了改变行业陋习的价值,尽管这是一条艰难的道路。

10. Mexican Computers: A Brief Technical and Historical Overview (arxiv.org)

文章概要

标题: 墨西哥计算机:技术与历史简述

作者: Daniel Ortiz-Arroyo PhD.

提交记录:

  • v1:2024年6月7日,839 KB
  • v2:2024年6月11日,770 KB

核心内容摘要:

本文回顾了1970年代末至1980年代中期墨西哥早期计算机的发展历程。其背景是1970年代初微处理器的出现,使得设计计算机不再依赖于当时大型计算机公司的雄厚经济资源。

与美国等发达国家主要由大小公司开发个人计算机的模式不同,墨西哥最初的微处理器计算机是在学术机构内设计的。文章指出,那个时期的墨西哥计算机鲜为人知,但其类型多样,涵盖了从用于特定研究和教学的计算机到高性能的个人计算机。

本文的目标是详细描述这一时期设计的几种具有代表性的墨西哥计算机系统。

11. IRS makes Direct File a permanent option to file federal tax returns (www.irs.gov)
12. Woman set up a table to share her collection of washers. Nothing was for sale (twitter.com)

内容说明 提供的文章内容与标题不匹配,实际显示为平台(x.com)的错误提示信息,而非标题所述的详细故事内容。

错误提示指出:

  1. 网站遇到了问题。
  2. 建议检查并禁用可能干扰网站正常工作的隐私相关浏览器扩展。
  3. 提示用户重试。

结论 由于无法获取标题对应的具体故事细节(例如:人物背景、垫圈收藏的具体情况、分享活动的场合与反响等),因此无法进行实质性的内容总结。

13. The Mythical Non-Roboticist: Wouldn't it be great if everyone could do robotics? (spectrum.ieee.org)

机器人编程的误区:让非专业人士编程机器人?

本文批判了机器人领域一个常见的错误观念——即“神话般的非机器人专家”。该观念认为机器人编程过于困难且依赖昂贵的专家,因此应开发软件框架让非专业人士也能编程机器人。作者指出,这一想法看似合理,但实际上忽视了问题的内在复杂性。

核心问题:机器人的两种难度

  1. 内在复杂性:机器人处理的是充满不确定性的物理世界。现实世界如同一个“全局可变状态”,机器人只能不可靠地感知并采取行动。找到一个在特定任务、传感器和环境下有效的解决方案极其困难,这需要深刻的领域知识和灵活的启发式方法。这种复杂性无法通过简单的API掩盖。

  2. 意外复杂性(或称“愚蠢的繁琐复杂性”):包括硬件驱动配置、实时系统集成、网络协议、数据处理等实际工程中必须面对的琐碎问题。这些问题是技术现状带来的障碍,而非理论难题。

误区与批评

  • 为模糊群体设计:所谓的“非机器人专家”通常是一个定义不清的群体。设计者未能明确目标用户。
  • 过度简化API:试图用如 grasp_object() 这样简单的函数来掩盖复杂性,往往在实际应用中会做出错误假设,导致失败。这种API可能在演示中效果很好,但无法满足真实世界的需求。
  • 居高临下的设计假设:框架设计者可能假设目标用户能力不足,拒绝添加必要的参数和灵活性,反而给用户带来额外负担,迫使他们编写变通方案。
  • 牺牲性能换取易用性:当前机器人技术在商业上尚未成熟,即使是专家团队也面临性能挑战。因此,没有余地为了易用性而牺牲解决方案的性能和特异性。

解决方案与原则

作者认为,降低门槛并非不可能,但应专注于减少“愚蠢的繁琐复杂性”,而非掩盖“内在复杂性”。

  • 核心原则:“为与你一样聪明、但更不能容忍愚蠢繁琐问题的人设计API”——可称为 霍尔森可容忍API设计定律
  • 正确做法
    • 提供强大、灵活且默认设置良好的API,而非过度简化。
    • 致力于消除技术堆栈中的附带复杂性(如配置、集成等问题)。
    • 使简单的事情易于完成,同时允许复杂事情的实现。

结论

机器人编程确实困难,但其困难程度与游戏开发等领域类似。通过优秀的工具和框架,可以降低进入门槛,但关键在于处理工程中的繁琐问题,而非试图用简单接口掩盖问题的根本复杂性。目标是使API强大且对用户友好,而非限制其能力或设计用于不明确的“非专家”群体。

14. Senior employees, ordered back to the office, are jumping ship (www.computerworld.com)

强制返回办公室政策引发高级人才流失

在当前企业应高度重视员工留任的时期,一些公司正采用值得商榷的方式强制推行返回办公室(RTO)政策。这些政策已导致高级职员、女性及千禧一代等群体离职,转而投向远程工作政策更灵活的公司。若美国联邦贸易委员会废除大部分竞业禁止协议的提案今年生效,寻求新工作的员工数量可能进一步增加,加剧人才流向竞争对手。

人才流失与企业矛盾策略

  • 一项研究显示,80%的企业因RTO政策失去人才,但70%的企业计划在2025年增加或维持员工在办公室工作的天数。
  • 包括亚马逊、戴尔、谷歌在内的公司已开始通过门禁刷卡、VPN监控等方式跟踪员工到岗情况。戴尔甚至规定全职远程员工将无晋升资格。
  • 文章质疑,为何企业高管更关注让员工承受通勤压力、额外成本及生产力损失,而非专注于盈利,部分RTO政策甚至带有报复性色彩。

员工实际负担与生活平衡

  • 强制返回办公室意味着通勤时间、交通费用(燃油、维护、保险、停车等)增加,尤其对双职工家庭影响显著。
  • 远程工作通常能提供更灵活、低成本的育儿方案,并减少在外就餐开支。
  • 最关键的是,员工渴望改善工作与生活平衡,而疫情期间的远程工作体验强化了这一需求,员工在自主选择工作地点时生产力更高,且对生活更有掌控感。

未来展望 企业与员工在RTO政策上僵持不下,可能导致员工持续寻求新职位,企业则面临削弱自身核心资产——员工的风险。冲突预计将在今年甚至明年持续发酵。

16. Home-Cooked Software and Barefoot Developers (maggieappleton.com)

《家庭烹饪软件与赤脚开发者》核心内容总结

本文探讨了语言模型如何推动本地化、“家庭烹饪”软件的黄金时代,并强调“本地优先”(Local-first)社区在其中的关键作用。核心要点如下:

1. 超越数据的“本地优先”与家庭烹饪软件

“本地优先”不仅指数据本地存储,更应延伸至“本地化”软件——即为家庭或社区构建、解决特定群体具体问题的软件。这类“家庭烹饪”软件简单、低成本、高隐私且无商业压力。它与受商业利益驱动、仅服务大众而忽视用户“长尾需求”的标准化“工业软件”形成鲜明对比。

2. 赤脚开发者的崛起

当前个人软件开发门槛过高。作者借鉴“赤脚医生”理念提出“赤脚开发者”概念,指代具备一定技术素养、热衷解决周围人问题但不做全职程序员的人群。随着大语言模型(LLM)和AI代理的发展,自然语言正成为新的编程语言,大幅降低了开发门槛,使赤脚开发者能填补工业软件的空白,构建满足社区长尾需求的应用。

3. 语言模型“积木”亟需“胶水”

尽管LLM工具(如Vercel V0、TLDraw)能快速生成界面和代码等“积木”,但缺乏将它们组装成完整应用的“胶水”。赤脚开发者仍面临部署、数据库设置和权限管理等技术壁垒。未来需要专门设计的AI代理作为中央编排器,并配合自动化基础设施,指导开发者完成软件的拼装与落地。

4. 将“本地优先”融入未来生态

若未来爆发的家庭烹饪软件仍依赖云端订阅和商业平台,用户将面临数据失控与商业化剥削的风险。“本地优先”社区应致力于降低技术门槛,开发对赤脚开发者及AI代理友好的工具(例如通过自然语言提示直接配置本地数据库)。家庭烹饪软件与“本地优先”在哲学上高度契合,均倡导用户对数据和软件拥有绝对的控制权与所有权。

文章最后引用学者Ivan Illich的观点作结,强调人们不仅需要获取工具,更需要自由地创造和塑造自己使用的工具,软件领域同样应赋予大众这种创造的自由。

17. Sending emails to my three-year-old (blog.haschek.at)

为儿子发送电子邮件的数字遗产计划

核心计划:创建专属电子邮箱

作者在2020年儿子Linus出生后,立即在家庭Google Workspace域名下为其创建了电子邮箱。计划在儿子中学阶段(约12-15岁)移交账户控制权,但邮箱的核心目的是长期积累家庭记忆。

邮件内容与目的

  • 记录成长轨迹:作者每年发送2-3封邮件,包含家庭、朋友及生活场景照片(如汽车、房屋、花园),捕捉当下生活细节。
  • 弥补家族历史缺失:作者祖父因战争创伤从未主动分享经历,许多故事在其去世后才被知晓。为避免儿子重蹈覆辙,邮件旨在提前保存第一手家庭叙事。
  • 构建家庭参与机制:每年提醒祖父母、叔伯等亲属发送邮件,鼓励他们分享近况、生活地点、结识人物及周边环境照片,形成逐年更新的家庭影像时间线。

时间胶囊创意延伸

受地理藏宝(Geocaching)启发,作者准备物理时间胶囊:

  • 装入生活物品或儿子不再使用的玩具
  • 拍照记录并保存GPS坐标,部分坐标将通过邮件发送
  • 部分胶囊坐标仅存于个人文件,留给儿子未来自主探索
  • 考虑埋藏地点的长期可访问性(如易获取且未来仍可达的位置)
  • 甚至包含ETH纸质钱包等数字资产作为可能性设想

执行现状

  • 儿子即将满4岁,已收到10封邮件
  • 邮件节点覆盖:生日、首次度假、首个圣诞节、幼儿园入学等里程碑事件

该计划通过数字邮件与物理胶囊结合,旨在为儿子构建跨越时间的家庭记忆存档,使其在未来能直接接触亲人的第一手叙事与生活痕迹。

18. A Revolution in Biology? (www.bitsofwonder.co)

生物学的一场革命?

本文探讨了塔夫茨大学科学家迈克尔·莱文的开创性研究,挑战了以基因为中心的传统生物学观点。传统上,我们倾向于将基因视为生命的基本蓝图,认为分子机制自下而上地决定细胞、器官和生物体的功能与结构。然而,莱文提出,基因并非生物体发育和结构的唯一决定因素,它们类似于计算机的“机器代码”,而更高层次的抽象和控制机制在生物学中真实存在,并扮演关键角色。

这种更高层次的机制之一就是遍布生物体的生物电信号网络。与仅由神经元组成的神经系统类似,全身细胞都具备通过电化学信号进行通信的基本构建模块,只是速度较慢。这个网络能够存储信息、解决问题并指导生物发育。

涡虫这种具有非凡再生能力的生物为例,即使被切成250多片,每片都能再生出完整的身体。研究表明,涡虫体细胞的膜电位梯度(一种稳定的电状态)使细胞能够“知晓”自身在体内的位置,并决定是发育成头部还是尾部。令人震惊的是,通过药物改变离子通道从而改变细胞电状态(而非编辑基因),莱文团队成功诱导涡虫长出两个头、无头,甚至是另一物种的头。这些改变不仅功能正常,而且能通过繁殖稳定遗传——在基因不变的情况下,实现了持久的结构改变。

这一发现意义深远:

  1. 范式转移:它表明生物结构和发育可以通过调控生物电信号网络来干预,而不仅仅是修改基因。
  2. 实践应用前景:莱文梦想的“解剖学编译器”——一个能根据任意器官或体型规格,输出生成该结构所需化学和电信号组合的程序。这类似于生物领域的DALL-E,长远来看可能彻底解决创伤、出生缺陷、退行性疾病、癌症甚至衰老等生物医学难题。
  3. 扩展智能与认知的定义:生物系统在各个层级(从细胞到细胞群)都展现出适应性目标导向的智能。例如,被打乱面部器官的蝌蚪能自行矫正;肾小管在细胞大小改变时仍能维持目标尺寸。这种“集体智能”存在于形态发生、细菌菌落乃至基因网络中。
  4. 创造新的生物形态:通过提供特定信号(而非基因改造),莱文团队已将青蛙皮肤细胞和人类肺部细胞改造成能自我移动、甚至修复神经的“生物机器人”。这揭示了生物体潜在的创造力。
  5. 认知科学的扩展:认知和智能并非大脑独有,任何协同工作的细胞群(包括我们的身体本身)都具有类似的基础架构。这为跨领域工具与思想的共享打开了大门,并提供了理解癌症等疾病的新视角(如将癌症视为细胞群的“分离性身份障碍”)。

总之,莱文的工作推动了一场从基因中心论向关注生物电信号网络及其所承载的更高层次生物智能的深刻转变。这不仅革新了我们对发育、再生和疾病的理解,更挑战了我们对“智能”和“能动性”的固有概念,并为未来医学和合成生物学描绘了革命性的蓝图。

19. Show HN: Thread – AI-powered Jupyter Notebook built using React (github.com)

Thread:基于 React 的 AI 驱动 Jupyter Notebook

项目简介 Thread 是一款 Jupyter Notebook 的替代产品,旨在将 AI 助手(Copilot)无缝集成到 Notebook 的编辑体验中。该项目支持本地运行,并允许用户通过 Ollama 或自定义 API 密钥免费使用其 AI 功能。

核心功能

  1. 经典编辑体验:保留用户熟悉的 Jupyter Notebook 编辑界面与操作习惯。
  2. 自然语言代码编辑:支持使用自然语言指令直接修改和编辑代码。
  3. 智能单元格生成:根据自然语言提问,自动生成相应的代码单元格来解答问题。
  4. 上下文感知聊天:提供侧边栏聊天功能,能够结合当前代码上下文进行智能问答。
  5. 自动错误处理:能够自动解释代码报错原因并提供修复方案。

安装与配置

  • 安装:通过 pip install thread-notebook 命令进行安装,随后运行相应的启动命令即可使用。
  • Ollama 离线配置
    • 支持使用 Ollama 实现完全离线的 AI 体验。
    • 启动 Thread 后,点击左下角的“Settings”(设置)图标,选择“Model Settings”(模型设置)。
    • 导航至 Ollama 选项并输入具体的模型信息。
    • 配置完成后,可使用快捷键 Ctrl / Cmd + K 唤起并进行查询测试。

开发指南 在开发模式下,项目采用前后端分离的结构,需要同时开启两个终端进程:

  1. 后端服务:运行 Jupyter Server。
  2. 前端服务:运行 NextJS 前端。启动后在浏览器访问 localhost:3000/thread 即可查看本地开发版本。
  3. AI 功能开发:若需开发或调试 AI 相关特性,开发者需要进入项目中的 proxy 文件夹,并运行相应的代理服务命令以支持 AI 接口调用。
20. It is time for more holistic practices in mental health (journals.plos.org)

心理健康需要更整体的实践

本文批判了20世纪以疾病为中心的精神病学主导模式,该模式倾向于将复杂的心理社会现象(如精神病或抑郁症)归结为单一的生化或神经生理原因,并将药物治疗简单地理解为对抗“化学失衡”。这种过度简化的模型在过去二十年已崩塌。

作者指出,当前趋势正转向认识到心理健康状况在很大程度上是由威胁健康基本要素(睡眠、营养、运动、内省和身心连接)的生活方式所造成的一种社会建构。尽管精神药物被广泛开具,但全球心理健康状况患病率(如焦虑、抑郁、ADHD)显著上升。这除了可能归因于更好的诊断率和生活方式的负面影响外,也忽略了精神药物的医源性效应以及因经济利益冲突或对神经多样性的偏见(如针对ADHD和某些自闭症形式)可能导致的过度诊断。

改变路径:减少医疗化并转向整体实践

文章提出改革方向:

  1. 减少医疗化:精神病学应减少医疗化作为“不伤害”的承诺,通过与多元知识对话,创建能促进患者自主和解放的治疗环境。这需要采用“传记视角”,重视每个人的亲身经历。世界卫生组织也强调了基于尊重权利和尊严提供护理的紧迫性,并展示了如“开放对话”、“索特里亚之家”和同伴支持住房等成功减少医疗化的实践范例,这些方法在危机护理中能有效减少慢性化和残疾。

  2. 从“疾病”转向“健康生活方式”:重点应转向维护健康的基本支柱。

    • 睡眠:不良睡眠会增加认知情感损害、焦虑和抑郁的风险。改善睡眠习惯是提升心理健康的简单而关键的一步。
    • 营养:以超加工产品为主、缺乏纤维和发酵食品的饮食会破坏微生物组多样性、引发身体炎症,并导致焦虑和抑郁等问题。推广富含纤维和发酵成分的未加工食品至关重要。
    • 运动:久坐的生活方式与各种心理健康风险相关。即使是每天几分钟的中等强度运动也能对认知、情绪和整体健康产生积极影响。瑜伽和卡波耶拉等非西方整合性练习不仅能改善认知和情绪,还能培养归属感和社区意识。
  3. 重视内心对话:与心灵更内在和主观层面的对话对健康生活至关重要。

    • 通过本体感觉、内感和内省的深入参与可以催化疗愈过程。
    • 自然接触、艺术治疗和园艺等非医源性活动对心理痛苦具有保护作用。
    • 应恢复与基于话语的深度心理学(如心理治疗)的对话。心理治疗已被证明对大多数精神疾病病例有效且临床必需。
    • 梦境的定量结构分析(如用于精神分裂症早期诊断)和噩梦的情感内容分析能为神经系统状况提供深刻见解。通过机器学习进行的自动语音分析可用于检测和跟踪情绪变化。这些都强调了需要能够认真倾听患者的多维心理健康护理方法。

结论:精神病学应构想更美好的社会

心理健康状况通常由社会构建的生理失衡导致。睡眠、营养、运动、内省等健康支柱的缺失并非真空产生,而是由我们的生活方式所造就。不稳定的工作和住房条件、失业、种族主义、性别歧视、恐同、恐跨、暴力以及针对特定毒品使用者的战争等社会偏见都会加剧心理痛苦,需要系统性考虑。个人的环境和社会背景必须通过整合性实践来理解和改善。是时候通过加强个人与自身身体、自然和社区的联系,朝着一种更自然、更良性的促进心理健康的方式努力了。

21. A ChatGPT mistake cost us $10k (asim.bearblog.dev)

ChatGPT失误导致1万美元损失的故事

核心事件

一个初创团队在技术栈迁移中使用ChatGPT翻译代码,因复制粘贴其生成的错误数据库模型代码,导致订阅功能出现严重bug,估计造成每月约1万美元的损失。

问题背景

  • 时间:2024年5月,创业初期,时间紧迫。
  • 操作:团队将全栈NextJS项目迁移至Python/FastAPI,并使用ChatGPT辅助翻译Prisma/TypeScript数据库模型为Python/SQLAlchemy代码。
  • 初步测试:迁移后测试(包括生产环境)显示一切正常,团队未察觉问题。

Bug详情

  • 根本原因:在ChatGPT生成的代码中,ID生成逻辑错误。代码第56行使用了硬编码的ID字符串,而非动态生成UUID的函数/lambda。
  • 具体影响:对于任何一个后端实例,一旦一个用户订阅并使用了该固定ID,后续所有订阅尝试都会因唯一ID冲突而失败。
  • 隐蔽性:团队在AWS上运行8个ECS任务,每个任务有5个实例(共40个实例)。每个实例有独立的固定ID,因此白天部署频繁时,用户可能遇到未被占用的ID而成功;但夜间部署停止后,所有实例的固定ID很快被占用,新订阅全部失败。

问题爆发与排查

  • 现象:白天工作时段投诉少,夜间投诉激增(用户看到订阅页面的无限加载转圈)。
  • 团队困境:他们每天收到数十封投诉邮件,但自行测试订阅功能始终成功,无法复现问题,排查陷入僵局。
  • 持续时间:问题持续约5天,期间团队每天回复投诉邮件,但直到第五天才找到根源。

损失估算

  • 根据投诉邮件估算:每天50封投诉 × 5天 × 40美元/月订阅费 ≈ 10,000美元/月的潜在损失。实际损失可能更高,因为并非所有受影响用户都会投诉。

解决方案与教训

  • 修复:将硬编码ID改为动态生成UUID的函数。
  • 反思与改进:团队承认错误并采取了以下改进措施:
    1. 增加了健壮的单元测试和集成测试
    2. 部署了更完善的监控和日志告警系统
    3. 停止了直接向主分支推送代码的做法。
  • 总结:这段经历是创业早期因时间压力、过度依赖AI生成代码及测试不足而导致的典型教训。尽管痛苦,但成为了团队难忘的成长经历。
22. Forsp: A Forth+Lisp Hybrid Lambda Calculus Language (xorvoid.com)

Forsp 是一种结合了 Forth 和 Lisp 特性的混合 Lambda 演算编程语言。它融合了 Lisp 的 S-表达式语法、函数抽象、词法作用域闭包和 Cons 列表结构,以及 Forth 的函数应用方式和基于操作数栈的执行模型。

核心语法与计算模型

Forsp 的设计极简,仅包含 3 个语法特殊形式(' 用于引用,^ 用于压栈,$ 用于出栈并绑定环境)和 1 个求值时特殊形式(quote)。其核心计算由 compute() 处理类似 Forth 的指令列表,而 eval() 负责表达式求值。

语言采用 Call-By-Push-Value (CBPV) 求值顺序,巧妙结合了按值调用(CBV)的确定性和按名调用(CBN)的惰性求值优势。通过括号 () 实现 Thunking(将计算延迟并作为闭包压栈),并使用 force 强制执行。这种机制使得 Forsp 能够直接使用 Y 组合子实现递归,而不会陷入无限循环。

Lambda 演算与编程范式

Forsp 能够自然地表达 Lambda 演算:抽象表示为 ($x M),应用表示为 ^N M。结合栈与变量绑定的“值提升”模式,有效缓解了传统栈语言中复杂的栈操作(Stack dance)问题。开发者可以灵活选择命令式(变量绑定/顺序执行)或函数式(无点/数据流)编程风格,并能通过自定义结构(如 if...endif)改善栈语言代码的反向可读性问题。

系统实现与自举能力

Forsp 的底层实现非常精简,仅需约 600 行 C 代码,本质上是一个具有不同语义的 Lisp 解释器。系统仅依赖 10 个核心原语(如 push, pop, cons, car, cdr, eq 等)即可完成自举。此外,Forsp 具备强大的自求值(Self-Evaluator)能力,其核心的 computeeval 逻辑仅需不到 80 行 Forsp 代码即可完整实现。

设计优势与理论发现

Forsp 在表达计算本质方面表现出色。其值栈和 Cons 列表的结合自然契合图灵机的双栈模型,而变量绑定语法则类似于 A-正规形式(A-Normal Form)。程序既可以被视为一长串指令列表,也可以被视为 Lambda 演算的实现。总体而言,Forsp 在结构上比 Lisp 更简单,在表达能力上比 Forth 更强大,是一种极具表现力的极简语言。

23. SIMD < SIMT < SMT: Parallelism in Nvidia GPUs (2011) (yosefk.com)

SIMD、SIMT与SMT:NVIDIA GPU中的并行性分析

核心概念与关系

NVIDIA的GPU采用SIMT(单指令多线程)并行编程模型,它介于SIMD(单指令多数据)和SMT(同时多线程)之间。三者在灵活性和性能上存在权衡:

  • 灵活性:SIMD < SIMT < SMT
  • 理论性能(当模型足够适用时):SIMD > SIMT > SMT

SIMT可视为更灵活的SIMD,SMT则是更灵活的SIMT。灵活性较低的模型通常效率更高,除非其不适用于具体任务。

SIMT与SIMD的关键区别

SIMT与SIMD均通过向多个执行单元广播同一指令实现并行,但SIMT具备三个SIMD没有的特性:

  1. 单指令多寄存器集

    • SIMT中每个线程拥有独立的寄存器,允许以“标量”形式编程(如a[i] = b[i] + c[i]),而非SIMD的短向量循环。
    • 优势:编程接口更直观、更接近普通高级语言。
    • 成本:寄存器中可能存在冗余数据(如重复的指针),且窄数据类型与宽数据类型消耗相同资源。
  2. 单指令多地址

    • 线程可并行执行随机内存访问(如lut[b[i]]),而SIMD通常限于寄存器内的置换操作。
    • 优势:能并行化更多程序,支持大规模间接内存访问。
    • 成本:随机访问在DRAM中效率低(需合并请求),在共享内存中可能引发bank冲突(需避免地址映射到同一bank)。
  3. 单指令多流路径

    • 允许线程因条件分支而执行不同路径(如if(vec[i]))。
    • 优势:支持更复杂的控制流并行化。
    • 成本:当线程分支不同时,硬件需串行执行各路径,降低吞吐量;也可能导致内存访问模式分散。

SIMT与SMT的关键区别

两者均通过线程切换隐藏高延迟,但SIMT采用大规模线程以实现高吞吐、高延迟设计:

  • 线程数量:SIMT支持大量线程(如512个),而SMT通常仅2-4个线程。

  • 设计哲学

    • CPU/SMT优先追求单线程低延迟,使用超标量、乱序执行、分支预测等复杂技术。
    • GPU/SIMT优先追求高吞吐量,依赖大量线程切换掩盖延迟,无需复杂的低延迟优化。
  • 硬件实现

    • SIMT的寄存器虽多但实现较廉价,因其允许较高访问延迟。
    • SMT的寄存器需快速访问,成本较高。

SIMT的灵活性限制

相较于SMT,SIMT在以下方面灵活性较低:

  1. 占用率:性能高度依赖活跃线程数量;低占用率会大幅降低性能。
  2. 分支发散:线程控制流分歧会导致效率显著下降。
  3. 同步机制有限:仅支持简单的屏障同步(如__syncthreads()),不适合复杂的任务并行或线程间精细同步。

总结

SIMT通过结合SIMD的指令广播与SMT的大规模线程,在数据并行场景下实现了高吞吐量与编程便利性的平衡。其设计牺牲了部分灵活性(如分支发散处理、复杂同步),但换来了硬件简单性与高效能,适用于图形处理、大规模科学计算等高度并行的工作负载。

24. Google Mesop: Build web apps in Python (github.com)

Google Mesop:用Python快速构建Web应用

框架定位
Mesop是Google内部用于快速开发演示和内部应用的Python UI框架,适用于UI新手,提供直观的Python化开发体验。

核心优势

  1. 直观易用

    • 使用原生Python代码编写UI
    • 易于理解的响应式UI范式
    • 预置开箱即用的组件
  2. 高效开发流程

    • 支持热重载(自动刷新浏览器并保留状态)
    • 强类型安全的IDE支持
  3. 灵活定制能力

    • 无需编写JavaScript/CSS/HTML即可构建自定义UI
    • 通过Python函数组合UI组件

快速上手示例

import mesop as me
import mesop.labs as mel

@me.page(path="/text_to_text", title="文本转文本示例")
def app():
  mel.text_to_text(
    upper_case_stream,
    title="文本转文本示例",
  )

def upper_case_stream(s: str):
  return "回显: " + s.capitalize()

使用方式

  1. 本地安装:通过pip install mesop安装
  2. 运行示例:将上述代码保存为main.py后启动
  3. 在线体验:支持在Google Colab中试用

注意事项

  • 如需贡献代码,请参阅贡献指南
  • 发现安全漏洞可通过GitHub安全问题页面提交
  • 该框架为非官方支持的Google产品
25. WebKit fix: Quirk news.ycombinator to skip TextAutoSizing (github.com)

WebKit修复:为 news.ycombinator.com 添加跳过文本自动调整的兼容性处理

本次代码提交的目的是为WebKit引擎添加一个针对特定网站 (news.ycombinator.com) 的浏览器兼容性(quirk),使其在布局过程中跳过文本自动调整(TextAutoSizing)功能。

主要修改内容:

  1. 功能实现 (LocalFrameViewLayoutContext.cpp)

    • applyTextSizingIfNeeded 函数中添加了条件判断。
    • 当文档需要应用浏览器兼容性处理时(通过 document()->quirks().shouldIgnoreTextAutoSizing() 检查),函数将提前返回,从而跳过后续的文本自动调整逻辑。
  2. 兼容性规则定义 (Quirks.cpp)

    • 新增 Quirks::shouldIgnoreTextAutoSizing() 方法(仅在启用 TEXT_AUTOSIZING 编译选项时可用)。
    • 该方法检查当前文档是否需要浏览器兼容性处理(needsQuirks())。
    • 核心逻辑是判断文档的顶级域名是否为 news.ycombinator.com。如果是,则返回 true,表示应忽略文本自动调整。
  3. 头文件声明 (Quirks.h)

    • Quirks 类中声明了新的公共方法 shouldIgnoreTextAutoSizing()

总结: 此修复通过引入一个特定的浏览器兼容性规则,确保当用户访问 news.ycombinator.com 网站时,WebKit引擎不会对其应用文本自动调整功能。这可能是为了解决该网站在此功能下出现的特定显示问题或保持其原有的文本渲染行为。

26. Francis Ford Coppola's “Godfather Notebook” (jillianhess.substack.com)

文章核心内容:科波拉的《教父》笔记本

这篇文章是**《Noted》专栏对导演弗朗西斯·福特·科波拉创作过程的一次回顾,重点聚焦于他在拍摄经典电影《教父》期间使用的 “笔记本” 。文章原为付费内容,但作者Jillian Hess**决定从存档中将其重新发布,以供读者阅读。

重新发布的背景与关联

  • 直接动因:作者刚刚撰写了关于索菲亚·科波拉(科波拉女儿)的文章,这让她对科波拉家族的创作传统产生了新的关注。
  • 新闻契机:科波拉的新作《大都会》近期上映并引发讨论,尽管评价不一,但这使他重新进入公众视野,因此作者认为这是重新探讨其经典作品创作笔记的合适时机。

文章性质与访问方式

  • 这是一篇付费内容,读者需要订阅《Noted》专栏才能阅读全文。
  • 文章页面提供了7天免费试用的订阅选项,试用期间可访问全部历史文章存档。

总结而言,这篇文章旨在深入探讨科波拉为《教父》所做的幕后创作准备工作,并将其置于当前对科波拉家族艺术传承的关注脉络中呈现给读者。

27. Anti-Cheat Expert: all your pixels are belong to us (invlpg.dev)

腾讯ACE反作弊系统隐私与截屏机制分析

背景概述

本文分析了腾讯开发的反作弊系统ACE(Anti-Cheat Expert)的隐私问题。作者在调查《暗区突围:无限》(Arena Breakout: Infinite)所使用的ACE系统时,发现其具备截取用户整个主屏幕的能力,引发了对隐私越界的担忧。

系统架构

ACE由多个用户模式和内核模式组件构成:

  • 用户模式:包含 ACE-Safe.dllACE-Base64.dll 等9个DLL文件。
  • 内核模式:包含 ACE-Base.sysACE-BOOT.sys 等3个驱动文件,具备系统启动时加载的能力(在部分游戏中未启用)。

截屏功能技术分析

文章重点逆向分析了用户模式组件 ACE-Safe.dll 中的截屏代码,揭示了其独特的全屏幕截取机制:

  • 全屏捕获:与仅截取游戏窗口的常规反作弊不同,ACE通过获取主显示器的设备上下文(DC),直接截取整个物理屏幕的分辨率。
  • 分块扫描机制:代码并未一次性截取全屏,而是创建一个高度固定为16像素的兼容位图。利用 for 循环和 BitBlt 函数,每次截取全屏宽度、16像素高度的图像块,逐块向下扫描(类似老式CRT光栅扫描或低帧率视频流),直至覆盖整个屏幕。
  • 数据处理:通过 GetBitmapBits 获取图像位数据,并调用经过混淆处理的OpenSSL相关函数进行后续处理。此外,该代码段缺乏基本的错误检查机制。

隐私风险与安全建议

  • 潜在触发机制:尽管在常规测试中未触发该截屏函数,但其在二进制文件的其他部分被引用,并非死代码。推测其可能在检测到作弊行为或玩家被举报等特定场景下被激活。
  • 其他隐私侵犯:除截屏外,ACE还存在检查近期使用的文件、向服务器上传文件、检测并禁止运行逆向工程工具等行为。
  • 最终建议:鉴于其深度的系统权限和广泛的隐私收集行为,强烈建议用户不要在存有个人敏感信息或工作资料的计算机上运行搭载ACE反作弊系统的游戏。
28. Ask HN: What macOS apps/programs do you use daily and recommend?
29. Show HN: Crawl a modern website to a zip, serve the website from the zip (github.com)

mpa-archive:多页面应用网站爬取与打包工具

这是一个用于将多页面应用(MPA)网站递归爬取并打包成 zip 文件的工具,同时支持从 zip 文件直接启动网站服务。可作为站点生成器使用。

主要功能与使用方式

  • 安装与基本使用:通过 npm install -g mpa-archive 全局安装。使用 mpa <URL> 命令即可递归爬取指定网址,并生成对应的 .zip 文件。完成后会显示报告,并可直接从 zip 文件提供服务。
  • SPA 模式:使用 --spa 选项(如 mpa <URL> --spa)可保存网站原始的 HTML 而非 JavaScript 渲染后的 HTML,并避免重写链接。这适用于某些单页应用(SPA),但可能影响搜索引擎索引。
  • 服务功能:直接运行 mpa 命令会为当前目录下的每个 zip 文件创建一个服务器。服务器绑定到 0.0.0.0,端口基于 zip 文件名生成,保持固定。

核心特性

  1. 爬取技术:使用无头 Puppeteer 引擎,并行使用 CPU 核心数一半的线程进行爬取。
  2. 爬取策略:从 urls.txtsitemap.txtsitemap.xml 获取初始链接;仅爬取站内链接,但会抓取外部资源;会拦截并保存站点资源。
  3. 内容保存:保存 JavaScript 生成的 HTML、自定义元素、网站源映射(sourcemap),并生成 mpa/sitemap.txtmpa/sitemap.xml
  4. 状态报告:控制台显示爬取进度,并对非 200、304、204、206 状态码的 HTTP 响应进行报告。
  5. 断点续爬:支持进程退出后恢复,每爬取 250 个 URL 自动保存检查点。
  6. 实时更新:在提供已爬取内容的服务时,若请求的 URL 未找到,工具会从源站抓取并更新 zip 文件。
  7. 资源管理:可通过配置域名黑名单(参见指定 GitHub 链接)过滤爬取。

控制台图例说明

工具使用图标表示爬取状态:如🍳表示已打开标签页爬取,🧽表示链接已聚焦,⚠表示响应状态码非预期,🧭表示已保存文档HTML,✔表示已保存请求响应,🔗表示已发起fetch请求,🛑🍳/🛑🔗表示标签页/请求出错。

待考虑事项

开发者提出了一些潜在改进方向,包括:采用增量压缩格式(避免更改时全量重压缩)、重写外部资源链接为本地资源(可能影响从根路径加载的功能)、改为通过点击链接方式爬取(而非全开标签页),以及支持爬取更新。

32. Real-Time Settlers of Catan (robert.ocallahan.org)

《卡坦岛》实时玩法变体总结

核心规则改动

  • 取消轮流回合制,改为所有玩家同时进行游戏,每30秒为一个计时周期
  • 保留原版《城市与骑士》扩展包的基础规则
  • 使用专用移动应用管理计时、骰子投掷和野蛮人追踪

具体操作流程

游戏阶段

  1. 准备阶段:与传统规则完全相同
  2. 实时阶段
    • 玩家可随时进行交易、建造、使用发展卡、激活骑士
    • 每30秒应用自动投骰并分配资源/商品/发展卡
    • 限制:同一回合内不可重复使用已激活的骑士

特殊情况处理

  • 玩家互动卡牌(如主教、婚礼、逃兵等):暂停计时直到响应完成
  • 普通交易:无需暂停(无强制响应义务)
  • 强盗移动:暂停计时,由起始玩家首次移动,后续按顺序轮流
  • 炼金术师卡牌:按下专用按钮,下一回合暂停投骰直至玩家宣布点数
  • 无人行动期:全体同意可点击“下一掷”按钮立即推进
  • 游戏结束:宣布胜利即结束,不保留剩余回合

实用技巧

  • 六人游戏建议将资源堆分为两处管理
  • 游戏中后期小麦和骑士价值提升(可每回合重复激活骑士)
  • 30秒时限在游戏后期会增加操作压力
  • 大型游戏中建议专人分配发展卡

冲突解决机制

  1. 建造冲突:通常以行动顺序为准,极端情况掷硬币决定
  2. 发展卡冲突:玩家协商确认谁先声明行动
  3. 同时行动冲突:采用预先声明系统,声明顺序决定执行顺序

游戏体验特点

  • 六人《城市与骑士》扩展包游戏可在45分钟内完成
  • 游戏节奏从松弛逐渐转为紧张刺激
  • 相比传统规则更难追踪其他玩家进度和针对领先者
33. A new world of DIY medical testing (www.washingtonpost.com)

文章摘要:DIY医疗测试的新世界

核心事件

  • 患者:6个月大的婴儿Annika Sharma,对多种常见婴儿辅食(如香蕉、红薯)产生严重过敏反应。
  • 症状:出现无法控制的呕吐,一晚内多次发作,最终因脱水住院。
  • 诊断困境:母亲Angelika Sharma求助了六位儿科专科医生,但均未重视或有效诊断女儿的病情。
  • 家庭影响:由于孩子对食物反应严重,需要专人看护,母亲被迫辞去酒店业高管的工作。

关键问题

  1. 医疗系统响应不足:传统专科医疗未能解决患儿的特定严重过敏问题。
  2. 生活被迫改变:家长因照顾孩子而中断职业生涯,反映出罕见或复杂病症对家庭生活的巨大冲击。

文章引出背景

该段落通过一个具体且令人揪心的家庭案例,揭示了传统医疗系统在面对某些特定、复杂的健康问题时可能出现的盲点或不足,从而为后文引出“DIY医疗测试”这一新兴解决方案作铺垫。

34. The Functional Programming Hiring Problem (blog.janissary.xyz)

函数式编程招聘困境

在互联网上讨论函数式编程语言时,一个常见的论点是:虽然使用某种函数式编程语言(如假设的“Gooby”)很难招到人,但愿意学习这类小众语言的求职者往往是充满热情的“摇滚明星”工程师,因此招聘的预期价值更高。然而,基于作者的亲身经历,这一论点忽略了一些关键信息。

招聘中的三类申请人

在招聘函数式编程工程师时,候选人主要来自三个群体:

  1. 海投简历者:盲目投递任何职位,通常缺乏相关经验。他们污染了招聘流程,但公司基本不会雇佣他们。
  2. 受启发的本科生:刚接触函数式编程,充满热情但缺乏实际生产经验。他们有潜力,经过培养可能成为优秀工程师,并且思想更灵活,未来愿意根据公司需要调整技术栈。
  3. 语言狂热者:资深工程师,其唯一目标就是使用特定的函数式编程语言。他们可能拥有该语言的经验和社区声望,但问题在于:他们将语言本身视为终极目标,而非服务于公司商业成功的手段

作者指出,招聘错误往往发生在第三类人身上。这类工程师可能因过度迷恋语言本身而导致实际问题,例如:

  • 技术决策偏离实际:坚持使用函数式语言包装的不稳定库,而非更成熟的命令式语言库,用于关键生产系统。
  • 生产力受影响:因深入钻研语言的理论边缘领域(如同伦类型论)而延误实际业务任务(如实现JWT库)。
  • 文化与灵活性问题:可能威胁辞职以迫使项目使用特定语言,或在技术讨论中以“语言权威”的言论作为不可挑战的论据。

问题的根源

作者将此现象与“零利率时期”联系起来。在资金宽松、对盈利要求不高的时期,科技公司能容忍技术决策失误和低效,工程师也能在选择工作和语言上拥有很大自由。然而,行业泡沫破裂后,许多只擅长小众语言的工程师在求职中面临困难,而那些做出了“有趣”但非“务实”技术选择的公司也承受了后果。

建议与反思

文章最后提出了反思和建议:

  • 对使用函数式编程的团队:应诚实自问,使用特定语言是否真正带来了独特优势,还是仅仅因为“有趣”。如果无法肯定,调整技术路径是艰难但明确的选择。
  • 对招聘经理
    • 避免在特定语言社区发布职位,以免吸引大量狂热者。
    • 重点考察候选人的思维灵活性,例如询问他们学习新事物或承认错误的经历。
    • 坚决避免让极端主义者进入公司,以防其带来技术债务并损害工程文化。
  • 对语言狂热者:应审视自身动机。如果追求的是探索编程语言前沿,学术界或研发部门可能比工业界更合适。如果志在创造实用产品,则应将工具与个人身份认同分离,并持续、诚实地评估所选工具的收益与成本,接受自己可能犯错的可能性(克伦威尔法则)。
36. Libtree: Ldd as a tree saying why a library is found or not (github.com)

Libtree: 树形结构的 ldd 工具

Libtree 是一个能将 ldd(列出动态库依赖)的输出转化为树形结构的工具,并能解释为何某个共享库被找到或找不到。

核心功能

  • 🌳 将 ldd 的输出以树状形式展示
  • ☝️ 解释共享库的查找路径或定位失败的原因

输出控制

默认会隐藏某些标准依赖,通过参数可调整输出详细程度:

  • libtree -v:显示默认被跳过的库
  • libtree -vv:显示被跳过库的依赖关系
  • libtree -vvv:显示已遇到库的依赖关系
  • 使用 --path-p 标志显示路径而非 soname,例如:libtree -p $(which tar)
  • 使用 --max-depth 限制递归深度

安装方式

预编译二进制(v3.1.1)

支持多种 Linux 架构(aarch64、armv6l、armv7l、i686、x86_64),每个版本均提供 SHA256 校验和。

包管理器安装

  • Fedora / RHEL / CentOS
    先启用 EPEL(适用于 RHEL 及衍生版),然后运行:
    $ dnf install epel-release
    $ dnf install libtree-ldd
  • Ubuntu 22.04+
  • GNU Guix
  • 旧版 v2.0.0

从源码编译

要求支持 C99 标准的 C 编译器:

git clone https://github.com/haampie/libtree.git
cd libtree
make  # 建议使用 LDFLAGS=-static

或通过单行命令快速安装(注意:该方式未经充分验证):

curl -Lfs https://raw.githubusercontent.com/haampie/libtree/master/libtree.c | ${CC:-cc} -o libtree -x c - -std=c99 -D_FILE_OFFSET_BITS=64
37. XScreenSaver is available on Android. Google requires a privacy policy (chaos.social)
38. How to make colored fire at home (2020) (sciencenotes.org)

在家制作彩色火焰指南

原理与化学品列表

彩色火焰基于化学中的焰色测试,不同化学品燃烧时产生特定颜色。以下为常见颜色剂及其对应火焰颜色:

颜色 化学品
深红色 氯化锂
红色 氯化锶 或 硝酸锶
粉色 氯化锶 + 硝酸钾
橙色 氯化钙(漂白粉)
黄色 氯化钠(食盐)或 碳酸钠
黄绿色 硼砂
绿色 硫酸铜 或 硼酸
蓝色 氯化铜
紫罗兰色 3份硫酸钾 + 1份硝酸钾
紫色 氯化钾
白色 硫酸镁(泻盐)

使用方法

  • 直接撒播:将干燥颜色剂撒在火焰上。
  • 酒精浸泡:溶解颜色剂于酒精中,浸泡原木后使用。
  • 水溶液浸泡:溶解颜色剂于水中,浸泡松果、报纸卷、锯末或软木塞,干燥后加入火中。
  • 溶解建议:无固定配方,溶解量取决于温度和溶解度;建议测试少量以优化颜色强度。避免混合所有颜色剂,否则易因钠元素主导而仅得黄色火焰。多色火焰可使用单独处理的松果或彩色锯末混合物。

颜色剂来源

多数化学品可从日常用品中获取:

  • 硼砂:洗衣粉、杀蟑螂剂。
  • 硼酸:药房消毒剂。
  • 氯化钙:道路除冰剂、干燥剂。
  • 硫酸铜:根部杀手(固体)、藻类控制剂(液体)。
  • 泻盐(硫酸镁):浴盐、土壤改良剂。
  • 氯化钾:盐替代品。
  • 硝酸钾:树桩清除剂。
  • 食盐(氯化钠):普通食盐。
  • 其他:如氯化锶、硝酸锶需在线或烟花商店购买。

其他方法与安全注意

  • 其他方式:燃烧彩色印刷品(报纸、杂志)或某些塑料(如花园水管)可产生彩色火焰,但可能释放有毒烟雾,尤其避免燃烧塑料。
  • 黑色火焰:通过吸收彩色光实现,原理不同。
  • 安全提示
    • 彩色火焰适用于壁炉或篝火,但不建议用于烹饪食物。
    • 盐类残留物在煤灰中,注意灰烬处理;某些化学品(如泻盐、硼砂)可能有益花园,但过量有害。
    • 铜盐对无脊椎动物(如蜗牛、螃蟹)和藻类有毒。
    • 化学品应远离儿童和宠物。
    • 使用酒精作燃料时,切勿向燃烧的火中添加,因其高度易燃。
  • 燃烧产物:颜色剂通常不燃烧,残留在烟灰中,产生与普通火相似的烟雾。
40. Show HN: Collaborative ASCII Drawing with Telnet (jott.live)

协同ASCII绘图工具:基于Telnet的实时协作

这是一个允许用户通过Telnet协议连接并协同进行ASCII绘图的在线工具。该项目由 @bwasti 开发,核心代码位于 server.ts,使用 bun 运行。

使用方式

用户可通过以下命令连接(服务器非繁忙时):

telnet bram.town
  • Mac用户注意:较新版本的macOS需先通过 brew install telnet 安装客户端。
  • 交互操作
    • 移动:使用方向键或WASD。
    • 绘制:点击并拖动鼠标可绘制像素,重复绘制可叠加效果形成ASCII艺术。
    • 擦除:按住Shift键的同时拖动可擦除像素。
    • 光标可见:所有用户的光标以小圆圈显示,彼此可见。

技术实现要点

用户输入处理

通过发送ANSI控制序列启用终端的鼠标报告功能:

socket.write("\x1b[?1003;1006;1015h");

该序列启用了多种鼠标追踪模式。作者特别指出,正确设置 EXT_MODE 参数至关重要,否则可能导致客户端(如macOS终端)在光标超出约90列时意外崩溃,且问题具有间歇性。调试时发现,使用 mapscii.me 等工具会临时修改终端状态,影响测试一致性。用户断开连接时,需要发送对应的关闭序列进行清理。

渲染输出

渲染过程相对简单:

  1. 移动光标至左上角:\x1b[H
  2. 输出屏幕内容并隐藏光标:screenString + "\x1b[?25l"

获取终端窗口大小使用Telnet的NAWS(协商窗口大小)选项:

  • 服务器发送协商请求。
  • 解析客户端响应以获取 widthheight

作者提到渲染相关代码(如根据窗口尺寸生成 screenString)借助了ChatGPT完成,因涉及复杂的终端控制码序列。

功能特性

  • 全局画布:所有用户在同一无限画布上协作绘制和浏览。
  • 实时可见:所有用户的操作和光标位置实时同步。
  • 图层效果:通过叠加绘制可实现典型的ASCII艺术效果。

总结

该项目展示了如何利用古老的Telnet协议和终端ANSI序列,构建一个简单而有趣的实时协作绘图应用。其实现过程涉及终端协议协商、ANSI控制码、状态管理等技术细节,并在调试中发现了终端状态依赖性的问题。