【HN中文日报】AI、C++、复古计算齐飞!Hacker News 最新技术热点一网打尽,速来围观!

意外富翁 · 1个月前 · News · 16 · 0

今天 Hacker News 社区聊了啥? NO.20251117

这期日报简直是技术爱好者的狂欢!从为女儿打造的暖心合成器项目,到开源 Miele 家电诊断工具,再到 C++ 高性能协议栈和安全 C 语言扩展,硬核技术应有尽有。还有 Chrome DevTools 新功能、C# PDF 库选择、LLM 时代小型开源项目反思。想了解贝索斯 AI 新动作、1961 年继电器计算机模拟器、以及电动汽车电池新趋势?统统安排!赶紧点开全文,看看哪个技术点燃了你的激情!

Hacker News 中文精选


为女儿打造的合成器:一个充满爱的技术项目

这篇文章讲述了作者为一个三岁女儿制作便携式步进音序合成器的过程,这个合成器拥有四个滑块,可以控制循环序列中的四个音符,向上滑动提高音高,向下滑动降低音高。这个项目不仅是一个儿童友好的音乐玩具,也是作者学习微控制器、CAD、PCB设计和3D打印的契机。

作者最初使用Arduino Inventors Kit和面包板搭建了一个基本的MIDI控制器,通过读取电位计的数值并将其映射到八度音阶中的12个离散值来发出MIDI信息。为了听到输出的声音,作者编写了一个Python脚本来拦截MIDI信息并将其转发到Mac的默认MIDI设备,从而通过软件乐器“演奏”面包板。随后,作者将音频合成从Logic转移到面包板上,使用了一个SAM2695合成器模块,并添加了一个OLED屏幕来提供视觉反馈。为了方便随时随地开发,作者还使用了Wokwi微控制器模拟器。

在硬件方面,作者遇到了不少挑战。为了制作一个合适的盒子,作者学习了Fusion 360,并使用朋友的Bambu Labs A1 Mini 3D打印机打印外壳。由于没有PCB经验,作者最初在一个可焊接的面包板上手工焊接所有东西,但这种方法非常脆弱。因此,作者决定设计PCB,并使用Fusion 360的电子设计套件进行设计。最后,作者将PCB设计文件上传到JLCPCB进行生产。

这个项目不仅展示了作者的技术能力,更体现了他对女儿的爱。通过这个项目,作者不仅为女儿创造了一个独特的玩具,也提升了自己的技术水平。


FreeMDU:开源的 Miele 家电诊断工具

FreeMDU 旨在为 Miele 家电提供开源的硬件和软件诊断工具,作为 Miele 专有诊断软件 MDU 的替代方案。它允许用户通过家电上的光学诊断接口进行通信,而无需昂贵的 Miele 专用红外适配器和闭源软件。

该项目包含三个主要组件:协议库,用于设备诊断和测试的终端用户界面(TUI),以及带有 MQTT 集成用于 Home Assistant 的通信适配器固件。FreeMDU 支持 1996 年之后生产的大多数 Miele 设备,这些设备通常在前面板指示灯后面藏有红外接口。项目创建者通过逆向工程揭示了 Miele 设备的通信协议,并撰写了详细的博客文章 介绍了背后的过程。

使用 FreeMDU 需要一定的技术基础,例如安装 Rust 工具链和构建通信适配器。该项目提供了详细的指南,帮助用户进行设备诊断和测试,以及将家电集成到 Home Assistant 等家庭自动化系统中。对于希望开发自定义软件的用户,FreeMDU 也提供了协议库。

评论区观点:

  • 逆向工程爱好者:有人对这个项目的逆向工程表示赞赏,并分享了关于逆向工程过程的博客文章
  • 安全性担忧:有人担心,如果红外 LED 足够强大,可能会干扰整个社区的洗衣机。
  • 开放源代码的期待:有人既高兴又失望,因为他们希望 Miele 官方能够开源诊断工具。
  • 通用控制需求:有人指出,洗衣机最容易损坏的部分是控制电脑,因此需要一个通用的控制电脑。

使用自定义头文件 safe_c.h 赋予 C 语言超能力

本文介绍了如何通过自定义头文件 safe_c.h,为 C 语言引入 C++ 和 Rust 的一些安全和便利特性,从而在保证 C 语言性能的同时,提高代码的安全性和可维护性。

文章首先指出 C 语言虽然拥有高性能和对底层硬件的直接控制能力,但也存在许多容易出错的地方,例如内存泄漏、段错误等。为了解决这些问题,作者创建了 safe_c.h 头文件,旨在为 C 语言提供类似 C++ 和 Rust 的 RAII(资源获取即初始化)语义、智能指针和动态数组等功能。safe_c.h 兼容不同的编译器,通过宏定义 CLEANUP 实现了在函数返回、跳转或崩溃时自动执行清理代码的功能,避免了手动管理资源的麻烦。

文章重点介绍了 safe_c.h 提供的 UniquePtr 和 SharedPtr 两种智能指针。UniquePtr 用于独占资源的管理,确保资源在离开作用域时自动释放,避免内存泄漏。SharedPtr 则用于共享资源的管理,通过自动引用计数,保证在最后一个引用释放时才释放资源,避免了手动引用计数可能导致的错误。此外,safe_c.h 还提供了 Vector 和 View,用于简化动态数组的操作,避免手动管理内存的麻烦和潜在的缓冲区溢出风险。

总而言之,safe_c.h 通过引入 C++ 和 Rust 的一些特性,增强了 C 语言的安全性,简化了资源管理,提高了开发效率,使得 C 语言在现代软件开发中依然具有强大的竞争力。


Resiprocate:C++实现的SIP、ICE、TURN协议栈

Resiprocate是一个用C++编写的库,它实现了SIP(Session Initiation Protocol)、ICE(Interactive Connectivity Establishment)、TURN(Traversal Using Relays around NAT)以及其他相关的协议。这些协议在实时通信应用中扮演着关键角色,例如VoIP(Voice over IP)和视频会议。Resiprocate旨在为开发者提供一个强大且灵活的工具,以便构建各种通信应用。

该项目托管在GitHub上,拥有700个star和308个fork,表明它在开发者社区中具有一定的受欢迎程度。Resiprocate的官方网站是www.resiprocate.org,开发者可以在该网站上找到更多关于该项目的文档和资源。该项目使用一个开源许可证,允许开发者在各种项目中使用它,无论是商业的还是非商业的。

Resiprocate的代码库包含了实现SIP、ICE和TURN协议所需的各种类和函数。SIP用于建立、修改和终止多媒体会话,ICE用于在NAT(Network Address Translator)存在的情况下建立对等连接,TURN则用作中继服务器,当对等连接无法直接建立时,它会转发媒体流。通过提供这些协议的实现,Resiprocate简化了开发过程,并允许开发者专注于构建应用程序的特定功能,而不是从头开始实现这些复杂的协议。此外,该项目还包括问题跟踪器、拉取请求、讨论区和操作,方便用户进行协作和贡献。


Chrome DevTools 新增 CDP 命令编辑器,提升开发效率

Chrome DevTools 推出了新的 CDP (Chrome DevTools Protocol) 命令编辑器,旨在简化开发者与 Chrome 浏览器进行远程调试交互的过程。 CDP 允许开发者检查浏览器状态、控制其行为并收集调试信息,对于构建 Chrome 扩展也很有帮助。

新的 CDP 编辑器主要解决了手动编写 CDP 命令的痛点,尤其是在处理包含大量参数的命令时。 过去,开发者需要仔细处理括号和引号,并且需要查阅 CDP 文档才能了解命令的参数。 新编辑器通过以下方式改进了开发体验:

  • 自动补全命令: 提供可用命令列表,简化命令输入。
  • 自动填充命令参数: 减少查阅 CDP 文档的需求。编辑器会按照 mandatory 和 optional 的顺序展示参数。
  • 简化参数输入: 只需填写参数值即可。
  • 编辑和重新发送: 提高原型设计的速度,可以快速修改 CDP 命令。

编辑器还提供了一些实用的功能,例如:支持编辑字符串、数字、枚举、布尔和数组类型的参数;悬停在命令或参数上会显示描述性提示,并链接到在线文档;实时显示参数值是否正确的错误信息;通过右键菜单可以编辑和重新发送命令;可以将 CDP 命令复制为 JSON 格式。

总而言之,新的 CDP 编辑器旨在简化 CDP 命令的编写,让开发者更容易地查看参数及其文档,并提供更便捷的 CDP 命令发送方式。

评论区主要集中在 CDP 的应用场景和与其他工具的比较上。

  • 有人询问 CDP 命令的使用案例,以及在什么情况下使用 CDP 命令优于 Puppeteer。
  • 有人指出 Chrome 在 CDP 方面的优势,例如完整的文档、稳定的 API 和完善的工具,而 Firefox 在这方面有所欠缺。
  • 有人提到,该功能目前位于实验性功能中,需要在 DevTools 的设置中启用 "Protocol Monitor"。
  • 还有人认为,对于一些无法在网络面板中显示的内容,CDP 可以作为调试的替代方案,尤其是在使用 Puppeteer 等工具进行测试时。
  • 最后,有人提到,许多构建 AI 浏览器的团队可能已经拥有类似的内部工具,Chrome 推出此功能是顺应趋势。

寻找 C# 中使用许可的 PDF 库

本文探讨了在 C# 中寻找合适的、具有宽松许可的 PDF 库的历程,重点关注无需额外许可要求即可免费使用的库,排除了具有 copyleft 或商业许可的选项。

文章指出,虽然编写 PDF 文件格式本身并不难,但布局、定位和样式设计才是真正的挑战。许多解决方案选择使用浏览器引擎,因为它们在这些方面表现出色。因此,作者将搜索标准转变为寻找能够表示 DOM(文档对象模型)、布局和样式化文档、编写 PDF 格式以及在 DOM 和 PDF 格式之间转换的库。

文章提到了 QuestPDF,这是一个现代化的开源项目,可以免费用于非商业项目、非营利组织或收入低于 200 万美元的公司。QuestPDF 的特殊之处在于,其“免费版本”的代码是在 MIT 许可下授权的,这意味着理论上可以将其重新发布在 MIT 许可下,从而使商业实体不再受双重许可的约束。

文章还列举了一系列与 PDF 创建过程相关的库,包括 MigraDoc、PdfPig、LiteHtmlSharp、Html Agility Pack、PdfTemplating.XslFO、Skybrud.Pdf、FO.NET、PDFSharp、PdfSharpCore、HtmlRenderer.PdfSharp、libHaru、SkiaSharp、PDFiumCore、Puppeteer Sharp、DinkToPdf、WkHtmlConverter、Gotenberg 和 iText。

总而言之,文章旨在帮助开发者在 C# 环境中找到合适的 PDF 解决方案,并分享了在许可、功能和易用性方面的考量。


Replicate 被 Cloudflare 收购:AI 开发的未来?

Replicate 宣布加入 Cloudflare,旨在通过整合资源,加速 AI 基础设施的建设,为开发者提供更强大的 AI 应用开发平台。Replicate 将继续保持其品牌独立性,并受益于 Cloudflare 的强大资源,从而提升速度、扩展功能,并与 Cloudflare 的开发者平台深度集成。

Replicate 致力于构建 AI 领域的底层基础设施,让开发者无需深入了解复杂的底层细节,也能轻松使用 AI。他们通过 Cog 定义了模型标准格式,并创建了 Replicate 平台,方便用户分享和运行模型。这些底层抽象类似于云计算环境下的分布式操作系统,需要 GPU 和集群来支持生产级别的扩展。Cloudflare 拥有强大的网络基础设施,以及 Workers、Durable Objects、R2 和 WebRTC 等工具,这些都将与 Replicate 的 AI 基础设施形成互补。

Replicate 加入 Cloudflare 后,将能够构建更高层次的抽象,例如模型编排和 Agent 构建,以及实时模型和边缘模型运行等功能。Cloudflare 一直是开发者构建 Web 应用的首选平台,而 Replicate 的加入,将使 Cloudflare 成为构建 AI 应用的默认选择。

评论区有观点认为,这标志着行业整合的开始,并提及 Vercel 已经被整合。 也有人表示,这可能会加速从 Cloudflare Workers 迁移的趋势。 评论中还对 Lovable 的未来归属提出了疑问,猜测可能被微软收购。 这反映了业界对 AI 领域整合趋势以及未来发展方向的关注。


打造一个真正能用的简易搜索引擎

本文介绍了如何构建一个简单但实用的搜索引擎,它能与现有数据库集成,无需外部服务,易于理解和调试,并能找到相关的搜索结果。核心思想是将所有内容分词(tokenize),存储这些词,并在搜索时匹配这些词。

文章详细讲解了搜索引擎的实现细节,包括数据库schema的设计和tokenization(分词)的实现。数据库部分,index_tokens表存储所有唯一的token及其权重,index_entries表则将token与文档链接起来,并包含字段特定的权重。文章还介绍了三种不同的tokenizer:Word Tokenizer、Prefix Tokenizer和N-Grams Tokenizer。Word Tokenizer用于精确匹配,Prefix Tokenizer用于部分匹配和自动完成,N-Grams Tokenizer用于处理拼写错误和部分单词匹配。每种tokenizer都有不同的权重,以影响搜索结果的相关性。文章还展示了如何对文本进行归一化处理,例如将文本转换为小写、移除特殊字符和空格,以及过滤掉无用的短词。通过结合这些技术,可以构建一个简单但功能强大的搜索引擎。


ImGui文本编辑器:Ned与GL Shaders

这个GitHub项目介绍了一个使用ImGui和GL Shaders构建的文本编辑器,名为Ned。它提供了一个轻量级且可定制的文本编辑解决方案。

Ned是一个基于ImGui的文本编辑器,意味着它具有良好的跨平台能力,并且易于集成到现有的ImGui应用中。GL Shaders的运用为文本渲染和显示带来了更多的可能性,比如可以实现更丰富的文本效果和自定义样式。该项目使用MIT许可证,允许开发者自由地使用和修改。目前有111个star和6个fork,表明它在社区内有一定的关注度。虽然项目没有issue和pull request,但是提供discussion功能,方便用户交流。此外,还包含Actions功能,方便开发者进行自动化构建和测试。

总的来说,Ned项目提供了一个使用ImGui和GL Shaders创建文本编辑器的良好起点,适合那些需要在ImGui应用中嵌入文本编辑功能,并且希望具有一定自定义能力的开发者。


Heretic:语言模型的全自动审查移除工具

Heretic 是一款能够自动移除 Transformer 语言模型审查机制(又称“安全对齐”)的工具,无需昂贵的后期训练。它结合了定向消融(directional ablation)的高级实现,也称为“abliteration”,以及基于 TPE 的参数优化器 Optuna。

Heretic 的核心在于其全自动化特性。它通过协同最小化拒绝次数和与原始模型的 KL 散度,来寻找高质量的消融参数,从而生成一个解除审查的模型,同时尽可能保留原始模型的智能。使用 Heretic 不需要理解 Transformer 的内部结构,任何知道如何运行命令行程序的人都可以用它来解除语言模型的审查。

与人工专家创建的消融模型相比,Heretic 在默认配置下可以生成质量相当的解除审查模型。例如,在 Google 的 gemma-3-12b-it 模型上,Heretic 生成的版本在拒绝“有害”提示方面的表现与其他消融版本相当,但 KL 散度更低,表明对原始模型能力的损害更小。

Heretic 支持大多数密集模型,包括许多多模态模型和几种不同的 MoE 架构。目前不支持 SSM/混合模型、具有非均匀层的模型以及某些新型注意力系统。

使用 Heretic 非常简单,只需准备一个 Python 3.10+ 环境,并安装适用于硬件的 PyTorch 2.2+,然后运行 pip install heretic-llmheretic <model_name> 即可。该过程是全自动的,无需配置。

Heretic 通过参数化的定向消融变体来实现审查移除。对于每个支持的 Transformer 组件(目前是注意力输出投影和 MLP 下投影),它识别每个 Transformer 层中的相关矩阵,并使它们与相关的“拒绝方向”正交,从而抑制该方向在矩阵乘法结果中的表达。拒绝方向是针对每一层计算的,作为“有害”和“无害”示例提示的 first-token residuals 之间的均值差异。

Heretic 的主要创新在于:消融权重核的形状非常灵活,结合自动参数优化,可以改善合规性/质量的权衡;拒绝方向索引是一个浮点数,允许在两个最近的拒绝方向向量之间进行线性插值,从而解锁更广阔的方向空间;消融参数是为每个组件单独选择的,因为 MLP 干预通常比注意力干预对模型造成的损害更大。


使用 Python 绘制凯尔特结:一个有趣的编程项目

本文介绍了一个使用 Python 创建凯尔特结的 Web 应用程序,探讨了凯尔特人的历史和绳结的用途,并详细介绍了如何通过编程生成这些复杂的图案。文章不仅提供了项目链接和源码,还深入探讨了绳结在历史和现代社会中的作用。

文章首先简要介绍了凯尔特人的历史,他们是分布在欧洲和西亚的部落,拥有共同的语言和文化。作者提到,虽然关于凯尔特人的起源存在争议,但他们的文化遗产在爱尔兰、英国西部和北部以及布列塔尼地区最为显著。文章还提到了格拉斯哥的 Govan Stones 和爱尔兰或苏格兰的 Book of Kells,这些都是凯尔特文化遗产的重要例证,其中包含了复杂的凯尔特结。

接下来,文章探讨了绳结的实用性和知识。绳结作为一种古老的人类技术,在连接、固定、滑动和释放等方面发挥着重要作用。作者以攀岩为例,说明了特定绳结知识的重要性。文章还指出,在建筑、渔业、记录、装饰、纺织和战争等领域,绳结都扮演着不可或缺的角色。

文章还讨论了绳结在现代社会中的角色转变。虽然现代社会越来越多地使用合成材料和替代技术,但在某些领域,如渔业、攀岩和露营,绳结仍然具有不可替代的地位。作者认为,这与绳结的灵活性、独立性和人本性,以及合成绳索的强度重量比、耐腐蚀性和耐久性有关。文章还提到了绳索制造方法的持续技术发展,以及现代电缆和绕组中绳结原理的应用。

最后,文章探讨了凯尔特结的几何吸引力。作者认为,对这些复杂图案的兴趣可能源于人类对知识和创新的追求,并可能通过艺术形式表达出来。文章还提到了其他文化中出现的绳结图案,如韩国结 (Maedeup) 和中国结,以及它们所代表的文化和象征意义。


C++ 实现高性能模型上下文协议 (MCP): fastmcpp

fastmcpp 是一个高性能的 C++ 库,实现了模型上下文协议 (MCP),旨在为 MCP 服务器和客户端提供卓越的性能。它是 Python fastmcp 库的 C++ 移植版本,专注于提供原生性能和精简的依赖项。

该库支持多种传输层,包括 STDIO、HTTP (SSE) 和 WebSocket,并提供工具管理、资源和提示支持以及 JSON Schema 验证等功能。它还包括用于请求/响应处理的中间件,并可以与 MCP 兼容的 CLI 工具集成。fastmcpp 具有跨平台特性,可在 Windows、Linux 和 macOS 上运行。要构建 fastmcpp,你需要 C++17 或更高版本的编译器和 CMake 3.20 或更高版本。该项目使用 Apache 2.0 许可。

fastmcpp 的主要特点包括核心 MCP 协议实现 (JSON-RPC)、多种传输方式、工具管理和调用、资源和提示支持、JSON Schema 验证以及与 MCP 兼容的 CLI 工具的集成。构建 fastmcpp 的基本步骤包括克隆存储库、创建构建目录、使用 CMake 配置项目以及使用 CMake 构建项目。还提供了一些推荐的配置选项,例如启用 HTTP POST 流式传输和 WebSocket 流式传输测试。

该项目结构清晰,包括用于公共头文件的 include/fastmcpp/ 目录、用于实现的 src/ 目录、用于测试套件的 tests/ 目录以及用于示例程序的 examples/ 目录。examples/ 目录包含完整的程序,展示了 STDIO MCP 服务器、具有路由的 HTTP 服务器、HTTP 客户端用法、工具注册和调用以及请求/响应中间件的示例。

评论区中,有开发者认为优化 MCP 协议的想法有点奇怪,因为该协议尚未完成,并且即使优化了,LLM 的速度也可能比 MCP 服务器慢得多。不过,该开发者也承认 fastmcpp 的实现非常出色。总的来说,fastmcpp 为需要高性能 MCP 实现的 C++ 开发者提供了一个有价值的工具。


破解尘封 20 年的文件格式:Splinter Cell 的 .lin 文件

本文介绍了作者对初代 Xbox 游戏《细胞分裂》中 .lin 文件格式的逆向工程过程,该格式包含游戏地图数据,并且 20 年来一直未被破解。作者通过十六进制编辑器分析文件结构,发现其包含 zlib 压缩的数据块,并编写工具成功解压,最终识别出文件头部的关键信息,包括解压后的数据大小以及纹理缓存、顶点缓存和索引缓存的大小。文件内容初步显示包含地图和纹理信息,为进一步挖掘游戏隐藏内容奠定了基础。

作者首先备份了游戏光盘,然后开始分析游戏文件。他发现 .lin 文件格式比较陌生,通过十六进制编辑器观察,发现文件头包含一些 32 位整数和 zlib 压缩的数据块。他推测文件格式为 {解压后数据长度, 压缩数据长度, zlib_block[压缩数据长度]} 的重复结构。

作者编写了一个工具来解压缩这些数据块,并成功得到了一个 64KB 的文件,该文件以 4 个 u32 作为前缀。通过逆向工程,他确定了这 4 个 u32 的用途,分别是:未压缩数据大小、纹理缓存大小、顶点缓存大小和索引缓存大小。

随后,作者展示了解压后的主数据部分的前 0x100 字节,看起来像一个文件表,包含地图和纹理文件的路径。文章的目的是为了分析游戏数据,挖掘隐藏内容,例如调试菜单、未使用的语音、武器概念或无法通过正常游戏流程到达的关卡。

由于文章没有评论,因此跳过评论分析。


通过 Postgres WAL 监听数据库变更

本文深入探讨了如何通过 Postgres 的预写日志 (WAL) 监听数据库变更,并介绍了 WAL 的基本概念和优势。文章还讨论了使用 NOTIFY/pg_notify 的局限性,并提供了一个使用 Elixir 监听 WAL 的示例。

文章首先指出了使用 pg_notify 在高吞吐量数据库中可能遇到的性能瓶颈,因为所有通知都需要通过一个单一队列。此外,pg_notify 还有通知大小限制、无法保证消息传递等问题。因此,作者推荐使用 WAL 来监听数据库变更。

WAL 记录了数据库的每一次变更,它不仅用于崩溃恢复,还支持数据库复制、在线备份、时间点恢复 (PITR) 以及变更数据捕获 (CDC)。文章详细解释了 WAL 的工作原理,以及如何通过设置 wal_level 来配置 Postgres 数据库以存储 logical WAL 记录。wal_level 有三个级别:minimalreplicalogical。要实现 CDC,需要将 wal_level 设置为 logical,但这可能会带来额外的开销,需要密切关注数据库的使用情况。

文章还区分了物理复制和逻辑复制的概念。物理复制基于 replica WAL 记录,创建一个与主数据库尽可能接近的物理副本。逻辑复制则只应用高级 logical WAL 记录,并由副本数据库自行处理维护任务。

最后,文章提供了一个使用 Elixir 监听 WAL 的代码示例,并参考了 Supabase 的 Realtime 仓库,建议在生产环境中使用经过充分测试的解决方案。

由于没有评论内容,这里就不进行评论总结和分析了。


GCC 编译器考虑默认使用 C++20 标准

GCC 编译器正在考虑将其默认的 C++ 标准更改为 C++20。这意味着,未来使用 GCC 编译 C++ 代码时,如果没有明确指定标准,编译器将会默认按照 C++20 的标准进行编译。

这个提议引起了社区的关注,因为编译器通常会尽量保持向后兼容性,以便现有的代码能够继续正常工作。然而,采用新的标准可以带来许多好处,例如可以使用新的语言特性和改进的性能。

C++20 引入了许多重要的特性,例如模块(Modules)、协程(Coroutines)、概念(Concepts)和范围(Ranges)等。这些特性可以帮助开发者编写更简洁、更高效、更安全的代码。

如果 GCC 真的将默认标准更改为 C++20,开发者可能需要更新他们的代码,以适应新的标准。然而,这也将促使更多的人使用 C++20 的新特性,从而推动 C++ 语言的发展。

对于编译器开发者来说,尽早采用最新的标准进行自举(dogfooding)是非常重要的。这可以帮助他们发现和解决编译器中的问题,并确保编译器能够正确地支持新的语言特性。

评论区里,大家对这个变化褒贬不一。有人认为编译器应该始终走在标准的最前沿,尽早支持最新的特性。也有人担心兼容性问题,认为更改默认标准可能会导致现有代码无法正常工作。还有人对 C++20 的模块功能表示期待,希望能够尽快使用它。此外,还有人对协程的兼容性问题表示担忧,担心不同编译器编译的代码在使用协程时可能无法正确链接。总的来说,大家对 GCC 默认使用 C++20 持观望态度,希望能够在保证兼容性的前提下,尽快享受到新标准带来的好处。


PicoIDE:开源 IDE/ATAPI 设备模拟器

PicoIDE 是一款由 Ian Scott 开发的设备,它可以模拟 IDE/ATAPI 设备,Ian Scott 也是 PicoGUS 的创建者。它具有完全开源的固件和硬件,可以模拟 ATAPI CD-ROM 和 IDE 固定硬盘。对于 CD-ROM,它支持 .bin/.cue 或 .iso 镜像,对于 HDD,它支持 .img/.hda/.vhd/.hdf 格式。

PicoIDE 内置了 CD 音频输出,带有 3.5 英寸接口和 MPC-2 接头,支持 PIO 模式 0-4 和多字 DMA 模式 0-2。它还提供了一个可选的前面板/3.5 英寸驱动器托架外壳,带有 1.3 英寸 128x64 OLED 屏幕和四向导航按钮,以及用于远程控制和上传/管理磁盘镜像的 WiFi 功能,以及 RGB 活动指示灯。PicoIDE 主要针对 90 年代的 PC 进行开发和测试,但由于其对 ATA 和 ATAPI 标准的高度兼容性,它很可能在其他设备上也能工作。

PicoIDE 的硬件不支持 UDMA,但对于更快的系统,可以使用 CF、SD 和 M.2 转 IDE 适配器来快速替换 HDD。对于光驱,PicoIDE 的 MWDMA 模式 2 和 PIO 模式 4 支持与 52X CD-ROM 驱动器一样快,这对于快速系统来说已经足够了。

评论区里,项目创建者提到 PicoIDE 的主要应用场景是复古计算领域,例如 MS-DOS 和 Windows 9x 下的 CD-ROM,以及早期 IDE 机器上的 IDE 硬盘模拟。其他潜在的应用场景包括街机游戏机和 Dreamcast 上的 CD-ROM 替换,以及多轨录音机和采样器上的硬盘替换。有用户表示对 PicoIDE 的前面板设计印象深刻,认为它比 CF 转 IDE 适配器更简洁。也有用户询问了关于 CD-ROM 子通道数据模拟的准确性。


在浏览器中运行的 1961 年继电器计算机:Minivac 601 模拟器

这款在线模拟器重现了 Claude Shannon 设计的 Minivac 601 教育计算机,它使用机械继电器而非微芯片。用户可以在浏览器中观察计算机的运行过程,甚至可以暂停并手动操作,例如点击按钮来观察电路的变化。

该模拟器展示了一个简单的 3 位二进制计数器,通过灯 4、5 和 6 以二进制形式从零计数到七。用户可以自由拖动导线、连接组件,甚至制造短路,而不用担心安全问题。该网站还提供了原始 Minivac 手册,鼓励用户参考手册并进行实验,从而构建自己的电路。

评论区里,开发者 @gregsadetsky 分享了其开发这款模拟器的幕后故事,特别感谢了 Willy McAllister 的 Circuit Sandbox 提供的底层电力数学支持。其他用户也纷纷发表了自己的看法,例如有人分享了 1958 年继电器计算机的演示视频,也有人感叹现代浏览器技术的发展,使得在网页上模拟如此古老的计算机成为可能。还有人指出,在提及继电器计算机时,也应该提及真空管技术。另有评论强调了 Minivac 601 的手册非常棒,体现了当时人们对技术的热情和投入。@artemonster 还分享了一个用继电器制作 CPU 的开源项目。


LLM 时代下小型开源项目的命运

本文探讨了在 LLM (大型语言模型) 普及的时代,像 blob-util 这样的小型开源库的未来,以及开源的价值所在。作者认为,LLM 的出现使得开发者可以更方便地生成代码片段,从而降低了对小型、低价值库的依赖,但同时也减少了学习和理解底层原理的机会。

作者以自己编写的 blob-util 库为例,指出过去这类库不仅提供实用工具,还承担着教育用户的责任。但现在,LLM 能够快速生成类似功能的代码,使得开发者不再需要引入额外的依赖,也减少了深入学习相关知识的动力。作者认为,这种趋势可能会导致开发者更注重即时答案,而忽略了对知识的理解和掌握。虽然 Node.js 和浏览器本身也在不断增强功能,减少对外部库的依赖,但 LLM 无疑加速了这一进程。

作者进一步指出,在 LLM 时代,更有价值的开源项目应该是那些 LLM 无法轻易生成的,例如更大规模、更具创新性或涉及更小众领域的项目。他以自己参与的 fuite 项目和关于内存泄漏的博客文章为例,认为这些工作需要原创研究和创造性技巧,是 LLM 难以复制的。尽管如此,作者仍然对开源的未来保持乐观,并以 Dominic Gannaway 编写 Ripple.js 为例,说明人类的创造力不会被机器所取代。

评论观点分析

由于没有提供评论内容,所以无法进行评论观点的分析。


深入理解 Cloudflare Zero Trust 隧道

本文旨在解释 Cloudflare Zero Trust 隧道的概念,帮助读者理解其工作原理和优势,尤其是在 NAT 和防火墙环境下的应用。

文章详细介绍了 Cloudflare Zero Trust 隧道的优势,包括连接私有网络、暴露私有服务到公网、创建完全私有的网络、快速暴露本地服务、无需担心 NAT 问题以及实现细粒度的访问控制策略等。文章对比了 Cloudflare Zero Trust 和 Tailscale 的区别,Tailscale 采用 P2P 连接,速度快延迟低,但可能受 NAT 影响;而 Cloudflare 的流量通过其边缘网络,虽然增加延迟,但避免了 NAT 问题。文章还区分了 Cloudflared 和 Warp Client 这两个工具,Cloudflared 用于创建隧道,而 Warp Client 用于连接 Cloudflare 网络并执行策略。

文章重点解释了隧道、路由和目标之间的关系。隧道是流量的出口,通过 Cloudflared 部署在目标网络中。可以通过 Zero Trust UI 或配置文件配置隧道,指定请求的路由目标。文章还提供了一个快速将家庭网络服务暴露到公网的示例,通过配置 Cloudflared 隧道和 Cloudflare DNS 记录,即可实现无需 Warp 客户端的访问。


《程序员修炼之道:20周年纪念版》精华摘要

本文主要讨论了《程序员修炼之道:20周年纪念版》的核心内容,这本书旨在为软件工程师提供实用的建议和指导,帮助他们从新手成长为专家。书中涵盖了软件开发的各个方面,包括通用原则、实用方法和职业发展。

这本书最初是作者在实习后收到的礼物,对他们的职业生涯产生了深远的影响。尽管最初的版本包含一些过时的技术,但其核心建议仍然适用。为了适应现代开发者的需求,作者发布了20周年纪念版,其中三分之一的内容是全新的,涵盖了安全和并发等主题。其余部分也根据作者的实践经验进行了大量重写。

本书面向刚入行的软件工程师,但对于资深开发者指导新人也很有价值。书中包含许多实用的技巧,例如“始终使用版本控制”,这些技巧对于有经验的人来说可能很明显,但对于初学者来说至关重要。此外,这本书还适合那些没有接受过正规计算机科学教育的人,它解释了诸如大O符号等概念,并提供了学习资源的指导。

作者强调将这些原则不仅应用于软件工程,还应用于书籍的编写过程。例如,他们编写了一个程序将troff标记转换为LaTeX,以说明“编写能编写代码的代码”这一技巧。在20周年纪念版中,他们还讨论了使用并行性来加速书籍构建过程的努力,以及由此产生的意外错误。

书中最大的亮点之一是作者将他们的观点总结成简短的提示,并在整本书中突出显示。这些提示附在实体书的卡片上,方便记忆和参考。本书强调了程序员应遵循的一般原则,例如对自己的工作负责,并积极推动变革。书中还强调了沟通的重要性,以及如何有效地表达自己的想法。此外,本书还强调了学习的重要性,以及扩展知识面的必要性。

本书还讨论了“不要重复自己”(DRY)的原则,并探讨了代码、文档、数据、表示和开发者之间的各种重复。与DRY密切相关的原则是正交性,即系统中的组件应该相互独立,以便更改一个组件不会影响其他组件。

总而言之,《程序员修炼之道:20周年纪念版》是一本实用的指南,旨在帮助软件工程师提高技能,并成为更优秀的开发者。它涵盖了软件开发的各个方面,并提供了许多有用的技巧和建议。


使用 FPGA 复刻 IBM-PC-XT

本文介绍了作者使用 FPGA 复刻 1980 年代的 IBM-PC-XT 个人电脑的业余项目,目标是在该复刻系统上流畅运行 EGA 版本的《猴岛小英雄 1》,并支持鼠标、硬盘写入保存游戏以及 Adlib 音频。

作者选择低功耗版本的 NEC V20 CPU(UPD70108H)作为核心,因为它与 XT 中使用的 Intel 8088 兼容,并且低功耗特性简化了与 FPGA 的连接。同时,搭配低功耗 1MB SRAM 芯片(CY62158EV30)为 XT 提供 640KB 内存。硬件设计上,系统包含一个用于低功耗 NEC V20 CPU 的 DIP-40 插座、1MB SRAM 芯片、icesugar-pro FPGA 开发板、双 PS/2 接口(键盘和鼠标)、用于模拟固定硬盘的 Micro SD 卡插槽、用于音频的 YM3014B 数模转换器、压电扬声器以及复位开关和状态指示灯。

在软件方面,作者首先编写了处理器总线控制器,使用 NASM 编写了一个简单的程序,通过闪烁连接到 IO 端口地址的 LED 来进行测试。随后,作者安装了 Supersoft/Landmark Diagnostic ROM 的虚拟副本代替 BIOS,并编写了一个基本的 CGA 适配器用于视频输出。为了实现固定磁盘访问,作者编写了一个 Verilog SPI 控制器,并通过一些未使用的 IO 端口供 CPU 访问。同时,作者还编写了一个 Option ROM 来处理 BIOS INT13H(磁盘服务)调用,该程序包含可以通过 SPI 向 SD 卡发送命令的例程。

项目中最大的挑战之一是实现鼠标支持。由于硬件板上放置的是 PS/2 接口,而 XT 时代的鼠标通常连接到 UART 串口,因此作者需要实现一个 PS/2 鼠标到串口鼠标的桥接方案。作者编写 Verilog 代码直接与 PS/2 鼠标通信,在启动过程的早期告诉它开始发送鼠标事件,然后将接收到的鼠标事件翻译并通过伪 UART 外设呈现给计算机。为了更好地理解 PS/2 协议,作者还使用逻辑分析仪捕获了真实 PC 和鼠标之间的通信数据。


大脑如何产生“顿悟”时刻以及为何它们如此深刻

本文探讨了神经科学家如何追踪大脑中“顿悟”时刻的神经活动,以及这种顿悟如何增强记忆力。研究人员利用Mooney图像(抽象的黑白图片)让参与者在fMRI扫描仪中观察,通过分析大脑活动,揭示了顿悟时刻大脑活动的特征。

这项研究发现,当参与者识别出隐藏的物体时,腹侧枕颞皮层(VOTC)、杏仁核和海马体的活动会增强。VOTC负责识别视觉模式,杏仁核处理情绪,海马体则参与记忆。研究表明,顿悟体验越确定和积极,这些区域的活动就越强烈。海马体被认为是大脑的“不匹配检测器”,当输入与预期不符时会做出反应,在顿悟过程中,原本无意义的图像变得有意义,从而违背了大脑的预测。

这项研究揭示了顿悟背后的神经机制,将心理学理论与神经科学联系起来。研究人员认为,如果使用其他类型的刺激,例如文字,顿悟可能出现在大脑的语言处理区域。此外,研究还探讨了顿悟是否能增强记忆力,并发现顿悟不仅在当下感觉显著,还有助于我们记住新的信息。这种记忆增强现象被称为顿悟-记忆优势。


使用 Python 中的 Z3 API 解决 Sudoku 和 N 皇后问题

本文介绍了如何使用 Z3Py,即 Z3 定理证明器在 Python 中的 API。Z3 是微软研究院开发的高性能定理证明器,被广泛应用于软件/硬件验证、约束求解、混合系统分析、安全以及生物和几何问题等领域。

文章通过示例展示了 Z3Py 的主要功能,即使没有 Python 基础也能理解。Z3Py 提供了创建整数变量、求解约束系统、简化表达式等功能。例如,可以使用 Int('x') 创建名为 x 的整数变量,并使用 solve(x > 2, y < 10, x + 2*y == 7) 求解包含变量 xy 的约束系统。Z3 支持基本的数学运算,包括非线性多项式约束的求解。此外,Z3 还能处理布尔逻辑,支持 AndOrNotImplies 等布尔运算符,并可以与多项式约束结合使用。

文章还介绍了 Z3 提供的不同求解器以及 Solver API 的基本用法。通过 Solver() 创建通用求解器,使用 add 方法添加约束,使用 check() 方法求解约束。pushpop 命令可以用于探索共享多个约束的类似问题。文章最后展示了 Z3 无法求解的示例,并介绍了如何遍历求解器中声明的约束以及收集 check 方法的性能统计信息。Z3Py 还支持实数、有理数和无理代数数的表示和计算,并通过 set_option 函数配置 Z3 环境,例如设置结果显示的精度。

由于文章内容不涉及评论区,因此略过评论分析。


《Castrol Honda Superbike》在现代系统上崩溃的原因分析

本文深入探讨了 1998 年发布的 PC 游戏《Castrol Honda Superbike World Champions》在现代 Windows 系统上崩溃的原因,并提供了调试和修复方法。文章通过逆向工程和调试,揭示了游戏崩溃的根本原因,并分享了作者的调试过程和心得。

文章首先介绍了游戏的基本信息和在现代系统上运行遇到的问题,随后作者开始调试,利用 Detect It Easy 工具分析了游戏的可执行文件,发现游戏使用了 VC5 的静态调试版本运行时库。通过附加调试器,作者发现游戏在调用 DirectInput 的 DirectInputCreateEx 函数后卡住。

为了进一步了解情况,作者启用了游戏中的所有日志记录功能,发现游戏在崩溃前会枚举输入设备,并输出了设备实例和产品名称。作者注意到其中包含一个“LED Controller”设备,怀疑是设备检测的问题。禁用 LED 控制器后,游戏可以正常启动。

通过分析游戏代码,作者找到了枚举设备的 DIEnumDevicesCallback 回调函数,发现游戏会将设备信息复制到一个全局数组中。问题在于,全局数组的大小是固定的,当枚举的设备数量超过数组大小时,就会发生缓冲区溢出,导致游戏崩溃。

文章还提到了一个 Side Quest:CD 检查。游戏会检查光盘是否存在,作者通过修改配置文件,将游戏安装目录下的 redist\dsetup.dll 路径指向本地目录,从而绕过了光盘检查。

总而言之,游戏崩溃的根本原因是 DirectInput 设备枚举时,设备数量超过了预设的数组大小,导致缓冲区溢出。通过禁用多余的设备(如 LED 控制器),可以避免崩溃。

虽然文章没有评论区,但我们可以推测,读者可能会对以下几个方面感兴趣:

  • 解决方法: 如何快速解决游戏崩溃的问题,例如禁用 LED 控制器或其他不必要的输入设备。
  • 调试过程: 了解作者的调试思路和方法,学习如何使用调试器和日志分析来定位问题。
  • 兼容性问题: 探讨老游戏在现代系统上的兼容性问题,以及如何解决这些问题。
  • 游戏开发: 了解早期游戏开发的一些细节,例如使用静态调试版本运行时库、以及可能存在的 bug。

Runit Linux:使用 Runit 进行服务管理和进程监管

本文深入探讨了 Runit,一个轻量级的跨平台 Unix init 方案,它提供了一种可靠的替代传统 init 系统的方法,尤其适用于嵌入式系统、容器和需要强大服务管理的服务器。

Runit 由 Gerrit Pape 开发,其核心优势在于其简洁性和强大的进程监管能力。它通过自动监控服务并在服务失败时自动重启,确保系统的高可用性。Runit 的架构分为三个阶段:系统初始化、服务监管和系统关闭。在系统初始化阶段,Runit 负责启动基本系统服务;在服务监管阶段,它监控并管理配置的服务;最后,在系统关闭阶段,它安全地停止所有服务。

文章还详细介绍了如何在 Ubuntu/Debian、CentOS/RHEL 和 Arch Linux 等不同 Linux 发行版上安装 Runit,以及如何从源码进行安装。此外,文章还涵盖了 Runit 的基本命令,如 sv(服务控制)、runsvdir(服务目录监控)和 runsv(单个服务监管器),并解释了如何使用这些命令来管理服务。

创建 Runit 服务涉及到创建具有特定结构的目录,包括一个 run 脚本,该脚本定义了如何启动服务。文章还提供了创建简单 Web 服务器服务的示例,以及如何配置服务以进行日志记录、使用环境变量和设置用户权限。此外,文章还讨论了如何使用 svlogd 进行日志记录,包括基本日志配置和日志过滤。

文章还涉及了 Runit 服务的故障排除,包括常见问题及其解决方案,例如服务无法启动或服务不断重启。此外,还讨论了性能和资源管理,包括资源限制和 CPU 限制。最后,文章还探讨了从其他 init 系统(如 systemd)迁移到 Runit 的方法,并提供了一些最佳实践,包括服务设计原则和安全注意事项。


理解傅里叶变换:从曲线拟合到频谱分析

本文深入探讨了傅里叶变换的本质,解释了它实际上是一种将正弦和余弦函数拟合到数据的曲线拟合方法。文章旨在帮助读者避免对傅里叶变换的常见误解,尤其是在处理周期性数据时。

文章首先回顾了线性回归的概念,并通过一个简单的二次函数例子,说明了即使线性回归能找到一个线性分量,也不意味着原始函数本身就具有线性特征。作者将这个概念与傅里叶变换类比,强调从振动数据中得到的谐波并不一定意味着物体真的以该频率振动。文章强调,傅里叶变换仅仅是将一系列正弦和余弦函数拟合到数据,类似于多变量线性回归。公式 y=∑n=0 N A n cos⁡(2 π n x L)+∑n=0 N B n sin⁡(2 π n x L) 展示了如何用不同频率、幅度和相位的正余弦函数来逼近原始数据。

文章还指出,傅里叶变换的常用图示通常只显示幅度谱,而忽略了相位信息。虽然相位信息在很多情况下不被关注,但它对于完整重构原始信号至关重要。不同的时间信号可能具有相同的幅度谱,但相位谱会不同。因此,在分析傅里叶变换结果时,需要谨慎,不能盲目相信其揭示的“频率成分”。理解傅里叶变换的局限性,将其视为一种曲线拟合工具,有助于避免错误的结论,尤其是在处理周期性数据时。


贝索斯成立人工智能初创公司 Project Prometheus 并担任联合 CEO

文章报道了亚马逊创始人杰夫·贝索斯进军人工智能领域,成立了一家名为 Project Prometheus 的初创公司,专注于为计算机、汽车和航天器的工程和制造提供人工智能解决方案。贝索斯将担任该公司的联合 CEO,这是他自 2021 年卸任亚马逊 CEO 以来首次在公司担任正式运营职务。

Project Prometheus 获得了 62 亿美元的巨额融资,部分资金来自贝索斯本人,使其成为世界上资金最充足的早期初创公司之一。该公司致力于开发能够帮助工程和制造的人工智能技术,特别是在计算机、航空航天和汽车等领域。尽管贝索斯对 Blue Origin 也有深入参与,但他在该公司的正式头衔是创始人。Project Prometheus 的成立,标志着贝索斯正式加入了人工智能领域的竞争,该领域已经非常拥挤,既有像 Google、Meta 和 Microsoft 这样的行业巨头,也有像 OpenAI 和 Anthropic 这样的创新公司。目前,Project Prometheus 一直保持低调,甚至连成立时间都不清楚,其总部所在地也尚未公布。

评论区主要关注了贝索斯担任“联合 CEO”的角色,有人认为这可能意味着他想进行“海鸥式管理”,即只在出现问题时才介入。此外,评论还对该公司信息的缺乏表示惊讶,考虑到其高达 62 亿美元的融资额,人们期望能有更多关于公司地点和员工的信息被披露。


深湖泊的混合是命脉:火山口湖的混合正在减缓

本文探讨了深湖泊混合的重要性,以及气候变化如何影响这一过程,特别是以俄勒冈州火山口湖为例,说明湖泊混合减缓可能带来的生态系统影响。

文章指出,湖泊混合是深湖生态系统健康的关键,它像心脏一样,通过风、气温、水温和盐度等因素,将水从表面循环到深处,从而分配氧气和养分。然而,由于气候变暖,许多深湖的表面水温上升速度超过了空气,导致水体分层现象加剧,混合减弱甚至停止。火山口湖的长期监测数据显示,湖水透明度增加,但这可能表明湖泊物理、化学和生态系统出现了问题。科学家们正在研究火山口湖,以了解湖泊混合减缓的原因和影响,并为未来的变化做好准备。意大利的五个深湖已经停止完全混合,这引发了科学家们的担忧,他们担心这种现象可能会变得永久性。文章强调了长期监测数据的重要性,以及跨湖泊系统比较研究的必要性,以便更好地了解气候变化对湖泊的影响。研究人员正在努力揭示湖泊物理学的奥秘,并预测和应对气候变化带来的挑战。火山口湖作为一个典型的例子,提醒我们关注湖泊生态系统的微妙平衡,以及气候变化可能带来的深远影响。


LFP 专利到期:电动汽车电池的新篇章

这篇文章主要探讨了磷酸铁锂 (LFP) 电池关键专利到期后,电动汽车电池市场可能发生的变化。LFP 电池因其成本效益和安全性而日益受到欢迎,尤其是在电动汽车领域。

随着关键专利的到期,预计更多的制造商将能够生产 LFP 电池,从而可能降低成本并扩大其应用范围。文章分析了专利到期对市场竞争、技术创新和供应链的影响。它还探讨了 LFP 电池与其他电池技术(如镍锰钴 (NMC) 电池)相比的优势和劣势。此外,文章还展望了 LFP 电池未来的发展趋势,包括能量密度提升和低温性能改善等。专利到期可能会加速这些创新,并推动 LFP 电池在电动汽车和储能领域的进一步普及。总体而言,文章认为 LFP 专利的到期标志着电动汽车电池市场的一个重要转折点,预示着更激烈的竞争和更快的技术进步。



评论 0 条

暂无评论,来种下第一颗种子。