每日HackerNews RSS

Gamma是一个极简的、可自托管的C预处理器,旨在创建简单、符合人体工程学的模板化数据结构,*无需*进行完整的C解析。它严格是C的超集,意味着现有的C代码仍然有效。 要使用Gamma,只需在克隆仓库并运行`make`后,将C编译器设置为“gc gcc”。它允许使用模板化代码,例如通用排序和向量实现,如提供的示例所示。 一个关键优势是其易于集成——Gamma足够小,可以直接嵌入到项目中,并与标准的C构建过程(目标文件、静态库、链接)兼容。 对于那些寻求更高级的类型反射能力的人,建议使用相关的项目MaC。Gamma由Matthew和Akshay创建,作为C模板化的一次实验。

## Gamma:一个C泛型实验 RossBencina分享了一个Gamma语言的链接,这是一个个人项目,旨在探索在*不*完全解析语言的情况下,为C添加类似模板/泛型的功能。最初的方法Gamma在模板实例化期间难以正确复制类型定义,尤其是在存在循环依赖时。 作者后来转向了MaC,它*确实*解析头文件以解决这些问题,从而提供更可靠的模板处理。 避免完全解析的一个关键限制是无法执行类型推断,从而阻碍了多重分派等功能。 该项目的驱动力是保持编译器小而易读——这是Gamma(和MaC)可以实现的,而对于C++或D等较大语言来说是不可行的。 虽然它不适用于实际项目(推荐使用D),但它是一个关于最小编译器设计和C中泛型可能性的“有趣”探索。 讨论还涉及语法(质疑是否需要显式类型标注)以及生成C代码固有的调试挑战。

《魔兽争霸II:黑暗之潮》于1995年12月发布,在初代《魔兽:兽族与人类》的基础上进行了扩展,并显著推动了即时战略(RTS)游戏类型的发展。它引入了单位分组、右键命令、海军与空战、单位升级以及沉浸式的“战争迷雾”等关键特性。 尽管通过人类和兽族之间的镜像单位保持了阵营平衡(尽管兽族受益于强大的嗜血法术),《魔兽争霸II》展示了暴雪快速开发和不断演进的设计——最初融入了资源开采和奇幻冲突等元素。 该游戏经历了多次发布,包括扩展包(《黑暗之门之外》)、主机移植版(《黑暗传奇》)、用于在线游戏的《战网版》以及2024年的最新《重制版》。它广受好评,将暴雪推向了显赫地位,并与《命令与征服》一起推动了RTS游戏的繁荣。《魔兽争霸II》也孕育了一个充满活力的MOD社区,启发了War2xEd和Wardraft等工具,最终影响了暴雪在《星际争霸》和《魔兽争霸III》等未来游戏中加入强大的编辑器——甚至催生了《Dota》等游戏。

## 魔兽争霸II:黑暗之潮 - 30年后 最近的Hacker News讨论庆祝了《魔兽争霸II:黑暗之潮》30周年,回忆了它的影响和持久魅力。尽管被《星际争霸》的发布所掩盖,许多玩家仍然 fondly 回忆《魔兽争霸II》易于上手的游戏玩法、创新的地图编辑器以及涌现的策略——例如使用农场作为城墙。 对话强调了这款游戏在RTS类型中的重要性,它开创了现在司空见惯的功能。 许多评论员哀叹RTS游戏的衰落,认为其学习曲线陡峭和盈利模式面临挑战。 另一些人则指出像《星际争霸》和《最高指挥官》这样的成功游戏,以及MOBA作为该类型演变。 一个关键点是游戏通过早期互联网连接(如Kali和AOL)培养了强大的社区,从而实现了多人游戏体验。 许多人分享了关于拨号连接、软盘交换和专门在线社区的怀旧轶事。 尽管已经过时,《魔兽争霸II》仍然可以玩,并且受到那些体验过其创新精神和引人入胜的游戏玩法的人们的喜爱。

## 马自达的可携带行李箱车:90年代的创新 在20世纪90年代初,马自达工程师开发了一个非凡的概念:一种便携式三轮车,旨在快速穿梭于机场。它诞生于一项名为“Fantasyard”的内部竞赛,被称为“行李箱车”,使用袖珍摩托车的零件制造,并巧妙地装进一个标准硬壳的三森行李箱内。 组装大约需要一分钟,包括将车轮和座椅连接到箱子上。它由1.7 PS的二冲程发动机驱动,最高速度可达30公里/小时(19英里/小时),重量为32公斤。其设计灵感源自马自达早期的车辆,如马自达-Go人力车和MX-5的低重心。 虽然从未大规模生产,但制造了两个版本——一个用于美国,一个用于欧洲——欧洲型号于1991年法兰克福车展上展出。美国版本至今仍存在,而欧洲原型车不幸丢失。行李箱车仍然是马自达创新精神和对实用、小型化交通工具关注的独特例子。

启用 JavaScript 和 Cookie 以继续。

## JPEG XL MD5 哈希quine 总结 本文详细介绍了创建一张显示自身 MD5 哈希值的 JPEG XL 图像——“哈希quine”的过程。该项目基于quine的概念(一种输出自身源代码的程序),利用 MD5 散列算法的弱点和 JPEG XL 格式的独特特性。 核心技术是利用诸如 `fastcoll` 之类的工具,在 MD5 中利用“相同前缀碰撞”生成具有相同哈希值但位模式不同的文件对。然后,这些位翻转被策略性地嵌入到图像的残差数据流中(这得益于修改 JPEG XL 编码器以使用简化的全字母 Huffman 编码)。 JPEG XL 的模块化模式及其可编程的“预测树”至关重要。该树用于检测来自 MD5 碰撞的位翻转,将它们组合成十六进制数字,并在图像中可见地渲染这些数字。该过程涉及创建由位翻转控制的像素值“线路”,最终显示 MD5 哈希值本身。 经过大量的编码、碰撞块放置和最终哈希值暴力破解,一个可用的 JPEG XL 哈希quine 被创建出来。作者希望该项目能鼓励在其他文件格式中探索哈希quine,突出密码学、文件格式和计算创造力之间有趣的相互作用。

## 软件测试中固定数据的问题 随着测试套件的增长,测试的固定数据(预定义数据)也随之增加。虽然固定数据能提供速度和结构,但一个常见的问题是:**固定数据僵化**。当修改固定数据可能导致大量不相关的测试失败时,就会发生这种情况,因为每个测试都隐式依赖于它们当前的状态。对于成千上万的测试,即使是细微的固定数据更改也可能引发一连串的失败,导致开发人员完全避免修改它们。 两种常见的、但有缺陷的解决方案会加剧这个问题。为每个测试创建新的固定数据会使数据库膨胀并阻碍重用。在测试*内部*修改固定数据实际上是以一种无序的方式重新发明工厂模式。 避免固定数据僵化的关键在于**专注测试**。每个测试应该只验证其意图验证的*特定属性*,避免对整个数据集做出广泛的假设。测试不应断言基于特定固定数据ID的精确结果,而应确认预期的*行为*——包含、排除、排序——而不受底层数据添加或更改的影响。 固定数据本身并没有错;关键在于如何使用它们。通过编写精确的测试,开发人员可以在不陷入固定、不可更改的固定数据的陷阱的情况下,保持快速、结构化的测试。是使用固定数据还是工厂模式最终取决于项目的需求——有时,两者的结合是最好的。

## 冻结的测试固定数据:问题与解决方案 这次Hacker News讨论围绕着在大型项目中(特别是Rails和Django)使用测试固定数据所面临的挑战。核心问题是“冻结”的固定数据——随着应用程序的演进,它们变得僵化并破坏新的测试,表明测试与特定数据状态之间存在紧密耦合。 几种观点浮出水面。一些人认为固定数据是一种代码异味,暗示被测试的代码过于复杂,如果需要大量的设置。建议解耦ORM并传递普通对象,从而实现更简单、更隔离的单元测试。然而,也承认实用主义;完全隔离并非总是可行或高效的。 讨论中的替代方案包括使用工厂(或生成器)来创建内存对象,避免数据库负载。另一些人提倡编写关注行为而非实现细节的测试,并建议使用基于属性的测试。一个关键的收获是尽量减少共享状态,并确保测试对固定数据的变化具有鲁棒性。一些开发者成功地使用快照测试来测试API响应。 最终,讨论强调了测试可维护性、速度和彻底性之间的权衡,最佳方法取决于项目的具体情况和团队优先级。

本文题为“Transformers 知道的比他们能说的更多——学习考拉兹序列”,作者为 François Charton 和 Ashvni Narayanan,探讨了大型语言模型(LLM)——特别是 Transformers——在隐式学习数学概念方面的惊人能力,即使它们难以明确表达这些概念。 该研究重点关注考拉兹猜想,一个著名的数学未解难题。作者证明,当直接要求 Transformers 解决考拉兹问题时,它们常常失败,但当通过间接方式探究时,它们*确实*表现出对潜在模式的了解。这表明模型内部代表了超越其易于访问输出的数学理解。 本质上,这项研究强调了 LLM *知道* 的内容与它们能*告诉* 我们的内容之间的脱节,暗示了比先前假设的更丰富的内部知识表示。该作品采用知识共享署名 4.0 许可协议。

## 黑客新闻讨论:Transformer 与考拉兹序列 一篇最近发表的论文,探讨了 Transformer 如何学习考拉兹序列,引发了黑客新闻上的讨论。该研究调查了“机制可解释性”——理解这些模型*如何*得出解决方案,而不仅仅是*它们*是否能得出解决方案。 核心发现是,Transformer 擅长模式识别,但在考拉兹函数的算法“控制结构”(循环)方面表现挣扎,尤其是在进制转换方面。它们并非真正“理解”数学,而是依赖于识别二进制表示中的模式。有趣的是,性能很大程度上取决于输入所使用的数字基数。 一个关键的争论围绕着论文标题“Transformer 知道的比他们能说的更多”,以及它与内容之间的联系。一些人认为标题具有误导性,而另一些人则认为它引用了关于模型知识的相关研究。讨论还涉及学术出版实践——在论文长度限制下平衡彻底性,以及增量研究的价值与追求突破性单篇论文的价值。最终,这场对话突出了当前 Transformer 架构的局限性以及在数学推理方面改进的潜在途径。

## 数字毒品国家:社交媒体作为一种危险的毒品 本文认为,大型社交媒体公司的行为类似于危险的制毒行业,将利润置于公众福祉之上,并利用巨大的政治影响力来避免监管。就像一个假想的无监管海洛因市场会成为一股强大且腐败的力量一样,社交媒体巨头正在积极伤害用户——特别是青少年心理健康,正如美国总外科医生所承认的那样——同时从诈骗和有害内容中产生数十亿美元的收入。 尽管两党都支持《儿童在线安全法》等立法,但Meta等公司仍通过游说和财力成功地阻止了监管。与此同时,欧盟通过《数字服务法》监管平台的尝试受到了敌对对待,甚至引发了美国政府以贸易关税相威胁,以捍卫这些公司。 作者认为,这种动态已经使美国变成了一个“数字毒品国家”,科技亿万富翁有效地控制着政策,阻碍了保护公民的努力,并为了他们的利润而决定外交政策。这种比较凸显了一个令人不安的现实:强大的公司正在将利润置于个人安全和民主进程的完整性之上。

启用 JavaScript 和 Cookie 以继续。

## 寻找超越“成长”思维的工作 一篇最近在Hacker News上的帖子引发了关于寻找令人满意的工作,而无需不断追求职业晋升的讨论。作者是一位最近毕业的计算机科学专业的学生,他质疑了不断“升级”的期望,并感受到了一种以成长为导向的工作文化带来的压力,尤其是在他理想的情况涉及个人项目和舒适的工作生活平衡时。 评论者对此表示共鸣,指出许多人感到被迫将他们对编程的热情与需要一份工作来支付账单的现实分开。一些人建议专注于寻找好的同事,或者将工作视为资助个人追求的一种手段。另一些人则建议探索在成熟的、非科技公司或政府部门中的稳定职位,在这些职位中,持续成长并非必然优先事项。 一个关键的收获是,即使这意味着牺牲潜在收入,也要将工作与个人价值观保持一致的重要性。几位评论员强调了寻找支持性工作环境的价值,以及将生活质量置于无情的野心之上的重要性。最终,这场讨论凸显了对能够带来意义和可持续性的工作的渴望,而不是仅仅专注于攀登公司阶梯。

## C 编程规则:概要 本文档概述了编写健壮、封装的 C 程序的规则,在性能和代码清晰度之间取得平衡。 提出了两种核心方法:**纯封装**——将实现细节完全隐藏在 C 文件中,仅通过头文件暴露功能——以及**性能优先**方法。 对于纯封装,结构体内部成员被隐藏,只能通过函数访问,确保受控行为并防止滥用。 然而,这可能会影响性能。 另一种方法优先考虑编译器优化,通过暴露结构体成员来实现,使用 `const` 来防止意外修改(值类型前置,指针类型后置)。 关键原则包括谨慎的**内存所有权**——在同一函数/模块内分配和释放内存——以及避免使用 `void*` 而倾向于显式类型。 作者提倡使用 UTF-8 字符串、标准库函数,并避免全局/静态变量以提高线程安全性。 进一步的建议包括优先使用内联函数而不是宏,进行彻底的测试,编写专注的函数,模块化设计(如 UNIX),将警告视为错误,以及一致使用标准类型,如 `int32_t` 和 `bool`。 最后,适当的结构体成员排序(从大到小)对于平台兼容性和避免段错误至关重要。

这个Hacker News讨论围绕着Brent的《封装C编程规则》(2020)。文章引发了对几种C编程实践的争论。一个关键的争议点是浮点数比较——仅仅检查`FLT_EPSILON`是不够的,因为存在精度问题,理解ULP(最低有效位)对于可靠的比较至关重要。 其他讨论的话题包括内存管理(倾向于调用者分配而不是库分配)、`void*`用于多态的使用,以及将编译器警告视为错误的价值。 许多评论者推荐了Eskil Steenberg的《我如何用C编程》和CoreFoundation的创建规则等资源。 还有关于封装的讨论,一些人认为通过不透明结构和访问函数隐藏实现细节会限制用户的自由和性能。 最后,C语言中头文件的作用也存在争议,一些人哀叹它们的存在,并指出现代语言以不同的方式处理接口/实现分离。 许多评论者提倡Ada、Rust和D等语言作为C的潜在替代品,理由是它们具有更优秀的技术设计。

更多

联系我们 contact @ memedata.com