2025 06 21 HackerNews

2025-06-21 Hacker News Top Stories #

  1. Hurl 是一个命令行工具,用于运行和测试纯文本格式中的 HTTP 请求,支持链式请求、捕获值和响应评估,适合 API 测试和 CI/CD 集成。
  2. ExTracker 是一个用 Elixir 编写的 BitTorrent 追踪器,支持多个 BEP,提供高性能和低内存使用,适合开发和测试使用。
  3. Phoenix.new 是一个远程 AI 运行时环境,支持浏览器交互和直接部署,旨在改变开发者工作流程,减少对本地开发的依赖。
  4. 通过将大型语言模型编译为 MegaKernel,可以实现低延迟推理,适用于单 GPU 和多 GPU 配置,优化了计算和通信开销。
  5. 文章以讽刺方式探讨了美国无家可归问题,批评了那些不愿采取实际行动解决问题的人和政策。
  6. 作者在模拟早期 Mac OS X 系统方面取得进展,通过优化和调试解决了 PearPC 模拟器的运行问题。
  7. 曼哈顿的拥堵收费政策成功减少了交通拥堵,提高了出行效率,公众支持率显著提升。
  8. 这篇 Makefile 教程详细介绍了 Makefiles 的用途、语法和使用方法,帮助用户管理大型项目的编译过程。
  9. 文章通过照片记录了六月节的历史及其庆祝活动,展示了这一美国联邦假日的文化意义和社区参与。
  10. 呼吁欧盟委员会拆分大型科技公司,促进数字经济的多样性和公平竞争,保护公民利益。

Hurl: Run and test HTTP requests with plain text #

https://github.com/Orange-OpenSource/hurl

Hurl 是一个命令行工具,用于运行定义在简单纯文本格式中的 HTTP 请求。它能够链式请求、捕获值以及对响应头和响应体进行查询评估。Hurl 功能多样,既可以用于获取数据,也可以用于测试 HTTP 会话。它能够轻松处理 HTML 内容、REST/SOAP/GraphQL API,或者任何基于 XML/JSON 的 API。

获取首页 #

使用 Hurl 发起一个 GET 请求来获取首页:

GET https://example.org
HTTP 200
[Captures]
csrf_token: xpath "string(//meta[@name='_csrf_token']/@content)"

登录操作 #

通过 POST 请求进行登录,并使用之前捕获的 CSRF 令牌:

POST https://example.org/login?user=toto&password=1234
X-CSRF-TOKEN: {{csrf_token}}
HTTP 302

链式请求 #

Hurl 支持链式请求,例如:

GET https://example.org/api/health
GET https://example.org/api/step1
GET https://example.org/api/step2
GET https://example.org/api/step3

HTTP 测试工具 #

Hurl 不仅可以运行 HTTP 请求,还可以用于测试 HTTP 响应。它支持不同类型的查询和断言,包括 XPath 和 JSONPath 在响应体上,以及对状态码和响应头的断言。Hurl 特别适合用于 REST/JSON API。

HTML 内容测试 #

使用 XPath 对 HTML 内容进行测试:

GET https://example.org
HTTP 200
[Asserts]
xpath "normalize-space(//head/title)" == "Hello world!"

GraphQL 和 SOAP API #

Hurl 也支持 GraphQL 和 SOAP API 的测试:

POST https://example.org/graphql
{
human(id: "1000") {
name
height(unit: FOOT)
}
}
HTTP 200
POST https://example.org/InStock
Content-Type: application/soap+xml; charset=utf-8
SOAPAction: "http://www.w3.org/2003/05/soap-envelope"
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:m="https://example.org">
<soap:Header></soap:Header>
<soap:Body>
<m:GetStockPrice>
<m:StockName>GOOG</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
HTTP 200

性能测试 #

Hurl 还可以用于测试 HTTP 端点的性能:

GET https://example.org/api/v1/pets
HTTP 200
[Asserts]
duration < 1000
# Duration in ms

以及检查响应字节:

GET https://example.org/data.tar.gz
HTTP 200
[Asserts]
sha256 == hex,039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81;

集成 CI/CD #

Hurl 易于集成到 CI/CD 中,支持文本、JUnit、TAP 和 HTML 报告。

为什么选择 Hurl? #

  • 文本格式:适用于开发和运维
  • 快速 CLI:适用于本地开发和持续集成
  • 单一二进制文件:易于安装,无需运行时
  • 由 curl 驱动 Hurl 是用 Rust 编写的轻量级二进制文件。Hurl 的 HTTP 引擎由 libcurl 提供支持,这是最强大和可靠的文件传输库之一。通过其文本文件格式,Hurl 为运行和测试 HTTP 请求添加了语法糖,但它仍然是我们所爱的 curl:快速、高效,支持 IPv6/HTTP/3。

反馈 #

支持 Hurl 的发展,可以在 GitHub 上为 Hurl 点赞!欢迎反馈、建议、报告 bug 或提出改进意见。

资源 #

  • 许可证
  • 博客
  • 教程
  • 文档(下载 HTML、PDF、Markdown)
  • GitHub

目录 #

  • 样本
  • 获取数据
  • HTTP 头
  • 查询参数
  • 基本认证
  • 传递数据
  • 发送数据
  • 使用 GraphQL 查询
  • 使用动态数据
  • 测试响应
  • 测试状态码
  • 测试响应头
  • 测试 REST API
  • 测试 HTML 响应
  • SSL 证书
  • 检查完整主体
  • 报告
  • 其他
  • HTTP 版本
  • IP 地址
  • 轮询和重试
  • 延迟请求
  • 跳过请求
  • 测试端点性能
  • 使用 SOAP API
  • 捕获和使用 CSRF 令牌
  • 红行动密
  • 检查响应中的字节顺序标记 (BOM)

HN 热度 414 points | 评论 97 comments | 作者:flykespice | 20 hours ago #

https://news.ycombinator.com/item?id=44324592

  • Hurl 对于执行 HTTP 请求测试非常有用,支持测试套件模式和单独调用模式,有助于接口和实现的分离。
  • Hurl 的配置语言不够直观,文档中的断言支持不够全面。
  • Hurl 作为一个工具,有助于 LLM 辅助开发,强制执行客户端视角,没有后门数据访问。
  • Hurl 可以与 Rust 语言集成,提供与 cargo test 工具的集成功能。
  • Hurl 帮助团队版本控制测试,提高了透明度和责任追踪。
  • 有人对 Hurl 的必要性表示怀疑,认为 Django 等框架已经提供了足够的测试钩子。
  • 语言无关的 API 测试可以作为文档使用,有助于团队间共享和测试合同的重用。
  • Hurl 作为 Postman 的替代品,避免了启动 Electron 窗口的繁琐。
  • Hurl 在服务器堆栈转换期间提供了独立的规范测试套件,有助于减轻工作负担。
  • Hurl 的样本部分很好地展示了工具的用途,尤其是对于那些可能快速判断工具实用性的人。
  • Hurl 可以像 IDE 扩展那样运行,支持引用 JSON 文件作为预期输出,并在目录中运行多个文件。

Show HN: I wrote a new BitTorrent tracker in Elixir #

https://github.com/Dahrkael/ExTracker

这个网页是关于一个名为 ExTracker 的 Elixir 驱动的 BitTorrent Tracker 项目。以下是网页的中文摘要:

项目状态和特点: ExTracker 项目目前仍在进行中,虽然还未完全准备好用于工业级使用,但已经可以正常工作。项目有一个测试实例在 extracker.dahrkael.net:6969 运行,启用了所有当前功能(实时统计)。

功能实现: 项目的实现进度使用不同的图标表示:

  • 🔲 表示尚未实现
  • 🔰 表示部分实现
  • ✅ 表示已完成
  • ❌ 表示不会实现

重要的特性包括:

  • ✅ 高性能(使用所有可用核心,内存存储)
  • ✅ 低内存使用(每 100 万个节点约 200MB RAM)
  • ✅ 零配置(启动即用)

与 Tracker 相关的 BitTorrent 增强提案(BEPs)包括:

  • ✅ BEP 0: BitTorrent 协议规范
  • ✅ BEP 15: UDP Tracker 协议
  • ✅ BEP 23: Tracker 返回紧凑的节点列表
  • 🔲 BEP 27: 私有 Torrent
  • ✅ BEP 7: IPv6 Tracker 扩展
  • 🔲 BEP 21: 部分种子扩展
  • ✅ BEP 24: Tracker 返回外部 IP
  • 🔲 BEP 31: Tracker 失败重试扩展
  • ✅ BEP 41: UDP Tracker 协议扩展
  • 🔰 BEP 48: Tracker 协议扩展:Scrape
  • ✅ BEP 52: BitTorrent 协议规范 v2

其他特性:

  • ✅ HTTPS 支持
  • ✅ 数据库备份到磁盘
  • ❌ WebTorrent
  • 🔰 信息哈希白名单/黑名单
  • 🔰 节点管理(间隔执行、清理、禁止等)
  • 🔰 指标
  • 🔰 GeoIP 支持(统计,节点限制)

设置方法: ExTracker 有三种主要的运行方式:

  1. 直接从源代码运行:需要在系统上安装 Erlang 和 Elixir。
  2. 从发行版运行:目前没有官方发行版(即将推出),但可以自己制作并部署。
  3. 使用 Docker:可以直接运行可用的 docker 镜像,或作为 docker-compose 的一部分。

版权和许可: ExTracker 由 Dahrkael 版权所有,根据 Apache License,Version 2.0 条款分发。详情请参考存储库根目录下的 LICENSE 文件。

关于: ExTracker 是一个 Elixir 驱动的 BitTorrent Tracker,涉及的主题包括 torrent、elixir、p2p 和 bittorrent-tracker。


HN 热度 370 points | 评论 68 comments | 作者:dahrkael | 1 day ago #

https://news.ycombinator.com/item?id=44323253

  • 作者使用 Elixir 编写了一个新的 BitTorrent tracker,并提供了 Docker 镜像以便快速尝试。
  • 尽管有人认为 tracker 是过去的产物,但作者认为它们在现代互联网中仍有其用途。
  • 作者计划继续开发,并添加一些可选的高级功能。
  • 有人建议作者学习如何使用 OTP 设计服务,推荐了相关书籍。
  • 作者回应称,虽然最初尝试了 OTP 风格,但为了提高扩展性,选择了当前的设计。
  • 有人认为使用 ETS(Erlang Term Storage)是可以接受的,因为它是一个内置于 OTP 的内存存储系统。
  • 有人对“OTP-first”设计表示好奇,并质疑使用 ETS 是否不符合“OTP-first”原则。
  • 有人分享了学习 Elixir 后对编程思维的影响,包括状态隔离、无共享数据、失败和重启、模式匹配、结构体优于类、管道等。
  • 有人建议使用 Logger 和 Telemetry 应用程序,而不是直接使用 IO.puts,并考虑添加 OTel。
  • 作者回应称,除了表格打印外,项目中使用了 Logger,并且 Telemetry 可选地以 Prometheus 和 HTML 格式提供。
  • 有人询问作者最喜欢的 OTel sink 是什么。
  • 有人表示正在使用 Elixir 构建一个出色的通知引擎,并认为 Elixir 非常适合这项工作。
  • 有人询问这个通知引擎是私有的还是开源的,并表示 Elixir 需要一个更好的通知引擎。
  • 有人回应称,使用 Phoenix 的 PubSub 实现通知引擎是很容易的,并且已经经过了实战测试。
  • 有人提到了 Knock.app,这是一个用 Elixir 构建的通知引擎。
  • 有人询问 DHT 和 PEX 是什么,有人提供了维基百科链接进行解释。
  • 有人解释说 DHT 和 PEX 允许 torrent 客户端在没有中央 tracker 的情况下找到 peer。
  • 有人指出,尽管有了 DHT 和 PEX,但在连接到网络时仍然需要一些中央节点。
  • 有人澄清说,这些中央节点仅在初始的 peer 发现阶段起作用,之后 peer 可以自行找到 torrent 群组。
  • 有人提到,如果连接到 DHT 网络,就不需要中央服务器,除非是为了 DNS 等。
  • 有人提出,即使有数百万的 bootstrap 节点,也可以通过嵌入 torrent 文件或使用 SRV DNS 记录等方式找到它们。
  • 有人讨论了如何找到 IPv6 的 bootstrap 节点,提出了一些可能的方法。

Phoenix.new – Remote AI Runtime for Phoenix #

https://fly.io/blog/phoenix-new-the-remote-ai-runtime/

这篇文章由 Elixir 的 Phoenix 框架的创造者 Chris McCord 撰写,介绍了他在 Fly.io 公司进行的一个秘密项目——Phoenix.new。Phoenix.new 是一个为 Elixir 和 Phoenix 量身定制的全在线编码代理,旨在成为构建协作、实时应用程序的最快方式。

文章首先介绍了 Phoenix.new 的特点。Phoenix.new 完全在浏览器中运行,为用户和代理提供了一个 root shell,在一个临时的虚拟机(Fly Machine)中,代理可以自由地安装软件和运行程序,而不会破坏用户的本地机器。用户只需打开 VSCode 界面,点击 shell 按钮,即可进入与 Phoenix.new 代理共享的隔离机器。

其次,Phoenix.new 是一个专为 Phoenix 设计的代理系统,Phoenix 是关于实时协作应用程序的,Phoenix.new 理解这一点。因此,Phoenix.new 在其 UI 和代理工具中都包含了一个完整的浏览器。Phoenix.new 代理使用这个浏览器“无头”模式来检查自己的前端更改并与应用程序交互。由于它是一个完整的浏览器,代理可以看到真实的页面内容和 JavaScript 状态,无论是否有人操作。

文章接着讨论了 root 访问权限带来的好处。代理以与人类开发者相同的方式构建软件,它们不精心设计 Docker 容器层,也不真正进行发布周期。代理想要弹出一个 shell 并开始工作。一个完全隔离的虚拟机意味着 Phoenix.new 可以任意地“弄脏”。如果它想要向 mix.exs 添加一个包,然后运行 mix phx.server 或 mix test 并检查输出,这是可能的。如果它想要向基础操作系统添加一个 APT 包,它也可以做到,并确保它工作。它拥有整个环境。

文章还提到了 Phoenix.new 如何帮助开发者将应用程序在线部署。Phoenix.new 产生的应用程序从启动时就生活在云端。它们有私有的、可共享的 URL(我们检测代理生成的任何绑定端口,并在 phx.run 下提供预览 URL,集成端口转发),它们与 Github 集成,并继承了 Fly.io 的所有基础设施保护:硬件虚拟化、WireGuard 和隔离网络。

文章最后讨论了 Phoenix.new 的未来。作者认为我们正处于开发者工作流程的巨大变革中。代理今天就可以实际工作,无论是否有人类在场。作者预测,开发的未来可能看起来更少像是打开一个 shell 并找到一个文件来编辑,而更像是进入一个 CI 环境,代理在那里全天候工作。本地开发不会消失,但大部分迭代将发生在哪里将会发生转变。作者已经使用 Phoenix.new 来分类 phoenix-core Github 问题并挑选问题来解决。他关闭笔记本电脑,喝杯咖啡,等待 PR 的到来——Phoenix.new 也知道 PR 的工作方式。我们已经开始,这个领域才刚刚开始。


HN 热度 351 points | 评论 160 comments | 作者:wut42 | 9 hours ago #

https://news.ycombinator.com/item?id=44328326

  • Phoenix.new 提供了一个容器化环境,允许远程代理运行而无需用户任务的批准,这被认为是一项创新。
  • Phoenix.new 与 fly.io 的深度集成使得用户可以直接与产品交互,而无需通过聊天工具复制粘贴输出。
  • Kasm 工作区可以作为 AI 开发环境,支持远程 Docker-based Linux 桌面。
  • 远程代理的创新在于它允许异步代理工作流程,这对于许多人来说是新鲜的。
  • Phoenix.new 的创建者表示,这是一个全球性的 Elixir 集群,跨越整个星球。
  • Phoenix.new 可以被视为一个完整的开发 IDE 环境,但它更像是一个远程运行时环境,代理在这里完成工作。
  • Phoenix.new 包括一个无头 Chrome 浏览器,代理可以驱动它来测试前端功能。
  • Playwright 提供了一个 MCP 服务器,可以实现类似的功能。
  • Phoenix.new 不进行模型训练,只使用现有的开源或托管模型,代码被发送到这些提供商那里。
  • Phoenix.new 的 UI 没有专门的无障碍测试,开发者需要指导代理进行无障碍建设或测试。
  • Phoenix.new 处理第三方库的问题,代理可以通过某种方式访问库文档。
  • 使用 Fly API 进行环境配置的经验表明,fly-replay 在路由和代理方面发挥了重要作用。

Compiling LLMs into a MegaKernel: A path to low-latency inference #

https://zhihaojia.medium.com/compiling-llms-into-a-megakernel-a-path-to-low-latency-inference-cf7840913c17

这篇文章介绍了一种新开发的编译器,该编译器可以将大型语言模型(LLM)的推理过程转换成一个单一的“超级内核”(megakernel),这是一种融合了所有必要计算和通信的 GPU 内核,能够在一次启动中完成所有操作。这种方法通过减少 LLM 推理延迟 1.2-6.7 倍,显著提高了性能。编译器易于使用,只需几十行 Python 代码即可将 LLM 编译成高性能的超级内核。

文章的核心思想是,传统的 LLM 系统通常依赖于一系列 GPU 内核启动和外部通信调用,导致硬件利用率不足。新开发的编译器自动将这些操作(跨越多个层、迭代和 GPU)融合成一个超级内核。这种设计消除了启动开销,实现了跨层的细粒度软件流水线,并允许在 GPU 之间重叠计算与通信。

尽管有这些优势,将 LLM 编译成超级内核极具挑战性。现有的高级机器学习框架(如 PyTorch、Triton 和 TVM)并不支持端到端的超级内核生成。此外,现代 LLM 系统由多种专门的内核库构建:NCCL 或 NVSHMEM 用于通信,FlashInfer 或 FlashAttention 用于高效的注意力机制,CUDA 或 Triton 用于自定义计算。这种碎片化使得将整个推理管道整合到一个统一的内核中变得困难。

文章接着介绍了 Mirage Persistent Kernel(MPK),这是一个由 CMU、UW、Berkeley、NVIDIA 和清华大学的团队开发的编译器和运行时系统,它能够自动将多 GPU LLM 推理转换成高性能的超级内核。MPK 在开发人员只需最少手动努力的情况下,解锁了端到端 GPU 融合的优势。

文章的优势在于,MPK 通过消除内核启动开销,并最大化地重叠计算、数据加载和跨 GPU 通信,实现了极低的 LLM 推理延迟。图 1 展示了 MPK 与现有 LLM 推理系统在单 GPU 和多 GPU 配置上的的性能比较。在单个 NVIDIA A100 40GB GPU 上,MPK 将每个 token 的解码延迟从 14.5 毫秒降低到 12.5 毫秒,接近基于 1.6TB/s 内存带宽加载 16GB 权重的理论下限 10 毫秒。

文章还讨论了 MPK 如何工作,分为两部分:第一部分介绍了 MPK 编译器,它将 LLM 的计算图转换为优化的任务图;第二部分涵盖了 MPK 运行时,它在超级内核内执行任务图,以实现高吞吐量和低延迟。

在 MPK 任务图中,每个任务代表分配给单个 GPU 流式多处理器(SM)的计算或通信单元,每个事件代表任务之间的同步点。任务图允许 MPK 发现在计算图中会被遗漏的流水线机会。MPK 还自动为每个任务生成高性能的 CUDA 实现,使用 Mirage 内核超级优化器确保每个任务在 GPU SM 上高效运行。

最后,MPK 包括一个在 GPU 上运行的运行时系统,它在单个 GPU 超级内核内完全执行任务图,允许在推理期间对任务执行和调度进行细粒度控制,无需任何内核启动。MPK 静态地将所有流式多处理器(SM)划分为工人和调度器两种角色,它们的数目在内核启动时固定,并与物理 SM 的数量相匹配,避免了任何动态上下文切换开销。


HN 热度 300 points | 评论 76 comments | 作者:matt_d | 1 day ago #

https://news.ycombinator.com/item?id=44321672

  • 将大型语言模型(LLMs)编译成 MegaKernel 是实现低延迟推理的有前景的路径。
  • CUDA 编程模型可能限制了硬件资源的有效利用,尤其是在低延迟和批量小的情况下。
  • 将工作集成到 PyTorch 作为实验性后端的可能性令人兴奋。
  • MPK 项目与 Stanford 的 MegaKernel 项目相似,但 MPK 采用编译器驱动的方法,更易于编程。
  • 训练优化可能不如推理优化重要,因为训练通常涉及更大的内核。
  • FlashDMoE 论文实现了在单个内核中快速分布式 MoE 模型。
  • 通用 CPU 将继续作为协调 GPU 的小脑存在。
  • 直接将软件编译成硬件的想法可能不会成为主流。
  • 将 LLM 直接映射到硬件在未来可能是有意义的,但目前保持权重在内存中并重用共享计算块更有意义。
  • AI 硬件初创公司已经在做类似的事情,但它们更通用,主要在架构上专业化,而不是权重上。
  • 将 LLMs 部署在本地并拔掉网线可以轻松实现空气隔离工作。
  • LLM-in-a-box 的想法对于需要空气隔离的工作来说非常有用。
  • 将 LLMs 部署在类似比特币挖矿 USB 设备的专用设备上是一个有趣的想法。

I will do anything to end homelessness except build more homes (2018) #

https://www.mcsweeneys.net/articles/i-will-do-anything-to-end-homelessness-except-build-more-homes

这篇文章是由 Homa Mojtabai 撰写的,标题为《I Will Do Anything to End Homelessness Except Build More Homes》,发表于 2018 年 5 月 9 日。文章以讽刺的口吻探讨了美国无家可归问题的严重性,并批判了那些不愿意通过改变自身行为或政策来解决这一问题的人。

文章开头,作者表达了自己对无家可归问题的关注,并声称愿意尽一切努力解决这个问题,但前提是不改变分区法律、不影响自己独自驾车上班的能力,或者不改变任何现状。作者讽刺地描述了自己愿意偶尔给饥饿的人一个三明治,并在朋友面前炫耀,但前提是他们不要在自己的视线范围内吃东西。

作者强调每个人都应该有床睡觉,但同时指出无家可归者对房产价值的破坏。他自称是一个创新者,通过创立公司利用技术制造智能茶壶等产品来为社会做出贡献。他认为自己是一个赢家,社区也是赢家,但解决无家可归问题的方式是避免直接面对问题,比如写信给当地报纸编辑、在社交媒体上发表歧视性帖子,以及经常报警。

文章中,作者提到自己拥有一个从父母那里继承的单家庭迷你豪宅,或者是一个豪华的公寓,他不愿意因为建造更多的房屋而破坏自己的生活方式。他讽刺地描述了自己的家是如何被杂物填满或者出租给来自其他城市的年轻人,同时强调自己是一个努力工作、慷慨的人,他的一切成就都是自己努力得来的。

作者还提到了美国财富集中的问题,但他更关心的是在 Whole Foods 购物时不得不对乞讨者说不。他对声称是退伍军人的无家可归者表示怀疑,并质疑他们的真实性。

最后,作者讽刺地表示,如果给无家可归者提供住房,他们可能会开始整理生活、找到工作并组织起来,这可能会导致医疗保险普及、公共交通建设等变化,最终导致汽车消失、空气变干净,而这是作者不愿意看到的。因此,他宁愿保持无家可归危机,也不愿意建造更多的房屋。

文章最后呼吁读者支持作者和保持网站无广告,通过成为赞助人来支持。同时,提供了订阅 McSweeney’s Internet Tendency 的 Substack 和新闻通讯的链接,以及其他相关文章的推荐阅读。


HN 热度 262 points | 评论 376 comments | 作者:2color | 16 hours ago #

https://news.ycombinator.com/item?id=44325617

  • 有些人认为,无家可归者的问题不仅仅是房屋成本问题,更多是心理健康、药物滥用和缺乏支持系统的问题。
  • 有些人指出,许多无家可归者是因为临时的经济困难、家庭问题或法律问题而流落街头。
  • 有人认为,无家可归者中许多人并非因为精神健康或药物问题而无家可归,而是这些问题导致他们无家可归。
  • 有人提出,即使住房免费也无法解决无家可归问题,因为存在免费避难所但无家可归现象依然存在。
  • 有人通过极端情况的假设,认为如果取消所有分区限制,可以建造胶囊旅馆,降低住房成本。
  • 有人担心,这样的旅馆最终会充满精神健康问题、药物依赖和暴力的人,导致大多数人宁愿住在帐篷里。
  • 有人提出,大学宿舍似乎能够解决类似的问题,也许成年人也可以。
  • 有人指出,大学宿舍与无家可归者的情况不同,因为宿舍里没有精神健康问题和药物成瘾者。
  • 有人认为,拥有屋顶应该是一项权利而非特权,房地产被视为投资导致了这一问题。
  • 有人强调,许多无家可归者因为避难所中的问题(如暴力、药物滥用、盗窃等)而宁愿选择街头。
  • 有人提出,将住房视为权利而非特权是一回事,但将其纳入法律并确保不破坏其他领域是另一回事。
  • 有人指出,无家可归者的精神健康问题往往是因为无家可归而加剧的。
  • 有人根据研究指出,无家可归的主要原因是租金上涨,而非心理健康问题。
  • 有人提到,许多无家可归者被称为“隐形”无家可归者,因为他们看起来正常,甚至可能有工作。

Infinite Mac OS X #

https://blog.persistent.info/2025/03/infinite-mac-os-x.html

这篇文章主要介绍了作者在模拟早期 Mac OS X 系统方面的工作和进展。

  1. Infinite Mac 现在可以运行早期的 Mac OS X 系统,其中 10.1 和 10.3 版本支持最好。虽然运行速度并不快,但作者表示,这与当时实际硬件上的表现相差无几。Infinite HD 也经过重建,增加了一些那个时代的知名独立软件。
  2. 作者之前一直在跟踪 DingusPPC 的进展,并尝试将其用于在 Infinite Mac 上运行 Mac OS X。但在去年夏天,他遇到了瓶颈,尝试运行时要么出现内核崩溃,要么出现图形损坏。他尝试通过确定性执行模式来减少问题,但下一步的方向并不明确。因此,他决定暂时放下这个模拟器,探索其他途径来运行 Mac OS X。
  3. PearPC 成为了一个明显的选择,因为它在 21 世纪初就是为了在 x86 Windows 和 Linux 机器上模拟 Mac OS X 而创建的。尽管在英特尔转型后兴趣减弱,但 PearPC 在一段时间内成功地完成了这一任务。作者最初认为 PearPC 是一个“死亡”的代码库,但后来决定尝试使用它,以获得让事情工作的满足感。他发现 kanjitalk755(Basilisk II 和 SheepShaver 的实际维护者)最近在 PearPC 上设置了一个实验分支,可以在现代 macOS 上构建和运行。作者能够复制他们的工作,然后开始了他的第六次模拟器移植到 WebAssembly/Emscripten 和 Infinite Mac 运行时的工作。
  4. PearPC 不再积极开发,这让事情变得更容易,因为作者不需要担心合并上游的更改,也不需要纠结如何结构化他的修改以便于贡献回去。PearPC 已经是一个多平台代码库,因此添加另一个目标相对容易。此外,它没有广泛使用线程或其他难以移植的概念。在几天内,作者成功让 PearPC 构建、输出视频、加载磁盘映像,并连接鼠标和键盘输入。能够在浏览器中更可靠地运行 Mac OS X 10.2,这让他感到非常满意。
  5. 尽管 PearPC 运行 10.2 更可靠,但感觉比 DingusPCC 慢。作者去年花了一些时间对后者进行了优化,部分灵感来自 SheepShaver 分支中的 TinyPPC 模拟器。他移植了 DingusPPC 的基准测试框架,然后开始在 PearPC 中复制性能工作(两个模拟器都是由查找表驱动的纯解释器,因此过程相对简单)。他成功将 10.2 的启动时间缩短了大约 15 秒,虽然这有助于节省生命,但考虑到完全启动需要近 2 分钟,这仍然不够。最后,他不得不在用户界面上添加一个免责声明,说明 Mac OS X 启动可能较慢。他还回忆起 Mac OS X 早期的“它现在快了吗?”讨论——它确实慢,但没那么慢。
  6. 性能仍然不如 DingusPPC 好,最大的瓶颈是 MMU 中没有任何缓存,因此所有加载和存储都很贵,因为它们涉及复杂的地址计算。DingusPPC 有一个更成熟的分层缓存,看起来非常有效。更一般地说,尽管 PearPC 在运行 10.2-10.4 时可能比 DingusPPC 更稳定,但它的代码库原则性较差(作者遇到了许多神秘的提交),并且在许多方面“作弊”(它有自定义固件和视频驱动程序,并且只实现了 Mac OS X 所需的 PowerPC 指令子集)。作者仍然希望 DingusPPC 能成为长期快速、稳定和正确的选择。
  7. 作者在 PearPC 的解释器中逐个操作码族实现了“统一解码表”方法。当他处理浮点操作时,本以为这将是另一个机械变化。然而,他惊讶地发现行为出现了退化——Dock 出现了一些渲染故障,Finder 窗口根本无法打开。经过一些调试,他注意到操作码组 59 和 63 的调度不仅仅是对相关指令位进行基本查找。它首先检查机器状态寄存器(MSR)的 FP 位,如果未设置,则会引发“浮点不可用”异常。
  8. 作者最初认为这是模拟器过于挑剔——所有用于 Mac 的 PowerPC 芯片都有 FPU,所以这应该永远不会发生。然而,设置断点显示异常在 Mac OS X 启动期间频繁发生。当时的 xnu 内核源代码是可用的,尽管作者不熟悉细节,但有地方清除了 FP 位并注册了处理结果异常的处理程序。他假设这是一种优化,以避免在上下文切换期间保存/恢复 FPU 寄存器(如果它们没有被使用)。结果是,一旦他在优化的调度代码中实现了等效的 FP 检查,渲染问题就消失了。
  9. 这让他想起了在 DingusPPC 下运行 Mac OS X 时遇到的渲染故障。即使从 10.2 安装 CD 启动(它不会内核崩溃),他最终也会遇到缺少文本和其他问题:检查 DingusPPC 源代码显示它从未检查 FP 位,并始终允许浮点指令通过。他做了一个快速的黑客攻击来检查它,并在需要时引发异常,故障就消失了!
  10. 适当的实现更加复杂,他最终对其进行了一些修订以避免性能损失(另一位贡献者又进行了一次修订)。但最终,DingusPPC 变得更加稳定,这是一个不错的副作用。更好的是,它可以可靠地运行 10.1,而 PearPC 不能。他最终使用两个模拟器的组合来运行更广泛的早期 Mac OS X(不幸的是,10.0 仍然不稳定,公共测试版内核立即崩溃,但他对未来抱有希望)。
  11. 重建 Infinite HD:Infinite Mac 的吸引力之一是模拟的机器还挂载了一个“无限硬盘”,里面有很多适合那个时代的软件可以尝试。随着 Mac OS X 的运行,是时候构建一个超越 80 年代和 90 年代经典 Mac 应用程序的替代版本了。他有他的最爱,但也征求了建议,并得到了很多想法。
  12. 对于实际构建磁盘映像,他扩展了最初启动网站时的自动化方法。磁盘映像在 Mac OS X 的早期比今天更受欢迎,所以他添加了一种将.dmgs 作为附加文件夹导入到生成的映像中的方法。然而,他很快发现,尽管具有相同的扩展名,但有许多变体,现代 macOS 附带的 hdiutil 并不总是能够挂载 20 多年前生成的映像。最后,他最终采用了一种鲁布·戈德堡方法,首先通过 dmg2img 提取原始分区,然后重新创建一个可以挂载和复制的“现代”磁盘映像。
  13. 至于获取实际软件,像 Macintosh Garden 这样的常规网站确实有一些来自那个时代的内容,但这不是他们的优先事项。早期到中期 2000 年代的 Mac OS X 软件似乎是一个小小的盲点——它太新了,不能算是真正的“复古”,但太老了,以至于不能从原始供应商那里获得(尽管有例外)。他最终使用了…

HN 热度 260 points | 评论 118 comments | 作者:kristianp | 24 hours ago #

https://news.ycombinator.com/item?id=44323719

  • PearPC 项目因原维护者意外去世而失去了大部分动力
  • 有观点认为一些技术高超的开发者可能被外星人带走了
  • 有人提到自杀的可能性
  • CherryOS 被指控抄袭了 PearPC 的工作
  • 怀念“DrunkenBatman”博客,该博客在 2019 年后消失
  • DrunkenBatman 因在 C4 会议上发表被认为是“觉醒”的演讲后退出公众视野
  • 有人对“DrunkenBatman”的消失表示遗憾
  • 有人提到 Infinite Mac 网站,提供经典 Macintosh 和 NeXT 系统软件
  • 有人批评文章没有提供 Infinite Mac 的超链接或定义
  • 有人指出链接到项目是有用的,但简洁的项目描述更有帮助
  • 有人对文章中提到的 PPC CPU 模拟器代码简洁性表示惊讶
  • 有人解释说 RISC 架构的模拟器通常代码量较小
  • 有人提到 PowerPC 指令集复杂,有大量指令
  • 有人提到 POWER 是 Power Optimization With Enhanced RISC 的缩写
  • 有人提到麦当劳在新西兰是一个房地产公司,其网站地址是 eieio.co.nz
  • 有人提到一个 ISA 指令集有一个名为“EMACS”的指令
  • 有人讨论 RISC 和 CISC 架构的区别
  • 有人提到编码方式影响指令集的复杂性
  • 有人对现代 macOS 与 OS X 10.4 的比较表示怀旧
  • 有人认为现代 macOS 与 OS X 10.4 在行为上有所不同,但变化不大
  • 有人觉得现代 macOS 与旧版 MacOS 在外观上差异巨大

Congestion pricing in Manhattan is a predictable success #

https://www.economist.com/united-states/2025/06/19/congestion-pricing-in-manhattan-is-a-predictable-success

这篇文章主要讨论了纽约市曼哈顿区实施拥堵收费政策的成功案例,并探讨了为什么这一政策迟迟未能实施。

文章开头提到了纽约市的语音治疗师 Maura Ryan,她最初对拥堵收费政策感到愤怒,因为这意味着她每天需要支付 9 美元的过路费。然而,自从政策实施后,她的出行时间从超过一个小时缩短到了 15 分钟,她的态度也随之发生了变化。现在,更多的纽约人支持这一收费政策,而不是反对。

文章指出,拥堵收费政策在曼哈顿取得了可预测的成功,这让人不禁要问,为什么这项政策花了这么长时间才开始实施。文章通过 Maura Ryan 的例子和其他纽约市民的反馈,展示了拥堵收费政策如何有效地减少了交通拥堵,提高了出行效率。

文章还提到了其他与美国相关的新闻和话题,包括民主党在权力运用上的表现、明尼苏达州的袭击事件、特朗普总统在摇摆州的支持率,以及纽约市长竞选中民主党内部的功能障碍等。这些内容虽然在文章中有所提及,但不是文章的主要内容,因此没有详细展开。

总的来说,这篇文章通过具体的例子和数据,展示了拥堵收费政策在纽约市的成功实施,并对政策实施的延迟提出了质疑。


HN 热度 259 points | 评论 444 comments | 作者:edward | 10 hours ago #

https://news.ycombinator.com/item?id=44328032

  • 曼哈顿的拥堵收费政策取得了可预测的成功,交通状况得到改善,城市环境变得更加宜人。
  • 伦敦的拥堵收费区在晚上 6 点结束,因此周五或周六晚上仍有人驾驶昂贵的汽车炫耀。
  • 伦敦是一个适合步行和公共交通的城市,自拥堵收费实施以来,城市变得更加适合步行。
  • 拥堵收费政策带来了一些意想不到的好处,比如减少了街头犯罪。
  • 拥堵收费只是解决方案的一半,另一半应该是对 MTA 进行改革,因为 MTA 一直是一个管理混乱、浪费资金的机构。
  • MTA 开始投资于内部专业技能的建设,以减少对外部承包商的依赖。
  • 美国公共部门普遍存在将工作外包给私营部门的问题,这导致成本增加和效率低下。
  • 私有化实际上是为了将政府资金转移到私人口袋中,而不是为了提高效率。
  • 私有化是现代版的庇护政治,可以持续地将政府资金转移到特定受益者手中。
  • 给失业工人提供资金或免费公共服务是不被接受的,因此需要通过虚假工作来洗钱。
  • 选民是否真的推动了外包,还是咨询公司和工会在推动这一过程。
  • 美国政府机构依赖于私营公司来执行政府任务,这导致了成本增加和缺乏长期内部专业知识。
  • 许多声称私有化能提高效率的公司实际上主要依赖政府合同,导致同样的问题只是外包了。

Learn Makefiles #

https://makefiletutorial.com/

这个网页是一个关于 Makefiles 的教程,旨在帮助用户理解和掌握 Makefiles 的使用方法。以下是网页内容的中文摘要:

Makefiles 的用途: Makefiles 主要用于大型程序中决定哪些部分需要重新编译。大多数情况下,涉及 C 或 C++ 文件的编译。其他语言通常有自己的工具来实现类似 Make 的功能。Make 也可以用于编译之外的场景,比如当需要根据文件变化来执行一系列指令时。本教程将重点放在 C/C++ 编译的使用案例上。

Makefile 的替代品: 流行的 C/C++ 替代构建系统有 SCons、CMake、Bazel 和 Ninja。一些代码编辑器,如 Microsoft Visual Studio,有自己的内置构建工具。对于 Java,有 Ant、Maven 和 Gradle。其他语言如 Go、Rust 和 TypeScript 也有自己的构建工具。解释型语言如 Python、Ruby 和原生 Javascript 不需要类似 Makefiles 的工具,因为当这些语言的文件变化时,不需要重新编译,程序运行时会使用文件的最新版本。

Make 的版本和类型: Make 有多种实现版本,但本指南主要适用于 GNU Make,这是 Linux 和 MacOS 上的标准实现。所有示例适用于 Make 版本 3 和 4,这两个版本除了一些深奥的差异外几乎相同。

运行示例: 要运行这些示例,你需要一个终端和安装了"make"。对于每个示例,将内容放入名为 Makefile 的文件中,并在该目录下运行 make 命令。以一个最简单的 Makefile 开始:

hello:
echo "Hello, World"

运行上述示例的输出如下:

$ make
echo "Hello, World"
Hello, World

如果对 Makefiles 的结构还不太了解,有一个视频可以介绍这些步骤以及 Makefiles 的基本结构。

Makefile 语法: Makefile 由一系列规则组成。一个规则通常看起来像这样:

targets: prerequisites
command
command
command

目标是文件名,由空格分隔。通常每个规则只有一个目标。 命令是一系列步骤,通常用于创建目标。这些步骤需要以制表符开始,而不是空格。 前提条件也是文件名,由空格分隔。这些文件在运行目标的命令之前需要存在。这些也被称为依赖项。

Make 的本质: 以一个 hello world 示例开始:

hello:
echo "Hello, World"
echo "This line will print if the file hello does not exist."

这里有很多内容需要理解。让我们分解一下: 我们有一个名为 hello 的目标 这个目标有两个命令 这个目标没有前提条件 然后我们运行 make hello。只要 hello 文件不存在,命令就会运行。如果 hello 文件存在,命令就不会运行。 重要的是要意识到,这里将 hello 既作为目标也作为文件来讨论。这是因为两者直接联系在一起。通常,当运行目标(即运行目标的命令)时,命令会创建一个与目标同名的文件。在这个例子中,hello 目标没有创建 hello 文件。

更多快速示例: 以下 Makefile 最终运行所有三个目标。当你在终端运行 make 时,它将分步骤构建一个名为 blah 的程序: Make 选择目标 blah,因为第一个目标是默认目标 blah 需要 blah.o,所以 make 搜索 blah.o 目标 blah.o 需要 blah.c,所以 make 搜索 blah.c 目标 blah.c 没有依赖项,所以执行 echo 命令…

这个网页通过提供详细的解释和示例,帮助用户理解 Makefiles 的基本概念和语法,以及如何使用 Makefiles 来管理大型项目的编译过程。


HN 热度 242 points | 评论 120 comments | 作者:dsego | 16 hours ago #

https://news.ycombinator.com/item?id=44325611

  • 1985 年,有人在波士顿大学图形实验室使用 Makefiles 生成 3D 渲染器,非常优雅,仅 10 行代码。
  • 有人提到了 Brian Gardner,一个 3D 渲染领域的专家,曾参与《铁巨人》和《卡罗兰》的 3D 渲染工作。
  • 有人分享了一些不太为人所知的 make 命令行选项,如 --output-sync--load-average--shuffle
  • 有人建议 make 的作者可以整理一个选项列表,方便用户查阅。
  • 有人认为,既然大家都能找到手册,就没有必要再整理一个选项列表。
  • 有人指出,make 的手册中已经列出了所有选项,可以通过 make --help 查看常用选项。
  • 有人提到 -B 选项用于无条件构建所有目标。
  • 有人质疑在多用户系统上,操作系统调度器是否可以处理并行任务。
  • 有人反映 make -j 会导致系统不稳定,认为这是一个 bug。
  • 有人认为如果 make -j 导致系统饱和,说明系统没有严重的瓶颈。
  • 有人建议 --jobs 的默认值应该是一个有限的数字,而不是无限大。
  • 有人提到,使用 --jobs 时,最大的瓶颈是随机 IO,而不是 CPU 或内存。
  • 有人认为,如果 make -j 导致系统不稳定,应该归类为“使用不当”。
  • 有人强调,专业使用工具的人应该阅读该工具的手册,尤其是对于基础工具。

Juneteenth in Photos #

https://texashighways.com/travel-news/the-history-of-juneteenth-in-photos/

这篇文章是关于美国德克萨斯州的六月节(Juneteenth)的历史和庆祝活动的视觉记录。以下是文章的中文摘要:

关于六月节: 1865 年 6 月,联邦军队少将戈登·格兰杰抵达加尔维斯顿,宣布德克萨斯州政府非法,并发布了包括解放奴隶在内的一系列命令。其中,第 3 号将军令涉及德克萨斯州的奴隶制。该命令宣布所有奴隶获得自由,并指出前主人和奴隶之间的权利和财产权利现在平等,他们之间的关系转变为雇主和雇员。尽管这一命令在《解放宣言》发布两年半后才传达到德克萨斯的非洲裔美国人,但许多听到消息的前奴隶离开了种植园前往北方。留在加尔维斯顿的人则在第二年的 6 月 19 日举行了庆祝活动,这一天后来被称为解放日,逐渐演变成“六月节”。庆祝活动逐渐扩展到邻近的州。

1979 年,休斯顿的民主党众议员阿尔·爱德华兹提出了一项法案,要求将六月节定为州假日。该法案在 1979 年通过,并由共和党州长威廉·克莱门茨签署成为法律。1980 年举行了第一次州赞助的六月节庆祝活动。2021 年 6 月 17 日,美国总统乔·拜登签署法案,将六月节定为联邦假日。

六月节庆祝活动: 文章展示了从 1900 年到 2018 年不同年份的六月节庆祝活动的照片。这些照片记录了在奥斯汀、休斯顿和科珀斯克里斯蒂等地举行的庆祝活动,包括乐队表演、日记记录、艺术俱乐部游行花车、公主和王子的庆祝、西部表演、网球比赛、小六月节小姐比赛等。这些照片展示了六月节庆祝活动的多样性和社区的参与。

前奴隶的故事: 文章还介绍了几位前奴隶的故事,包括鲍勃·莱蒙斯(Bob Lemmons)和安娜·摩尔·施维恩(Anna Moore Schwien)。鲍勃·莱蒙斯大约在 1847 年出生,1854 年被带到德克萨斯,解放后成为德克萨斯牧场主邓肯·莱蒙斯的学徒,并最终购买了自己的牧场。安娜·摩尔·施维恩 1856 年出生在新布朗费尔斯附近的一个羊场,她曾短暂地嫁给一个德国移民,后来因嫁给黑人女性而被赶出城镇,但她并不怀恨在心,她说过:“你不能带着恨意去天堂。”安娜于 1946 年去世。

文章通过这些故事和照片,展现了六月节的历史意义和庆祝活动的发展,以及前奴隶们的生活和他们对自由的珍视。


HN 热度 221 points | 评论 203 comments | 作者:ohjeez | 1 day ago #

https://news.ycombinator.com/item?id=44320851

  • 有人觉得“Juneteenth”这个名称不如“Emancipation Day”直观,因为很多人不知道“Juneteenth”的含义。
  • 有人支持“Juneteenth”这个名称,认为它体现了非裔美国文化,迫使人们去了解和记住黑人的历史。
  • 有人认为“Juneteenth”听起来像是一个现代词汇,而不是一个历史悠久的术语,可能不会激发人们的好奇心。
  • 有人指出“Emancipation Day”在美国可能会引起混淆,因为不同州有不同的“Emancipation Day”纪念不同的事件。
  • 有人提到,很多国家的节假日名称都很晦涩,需要查资料才能了解其含义。
  • 有人强调,节日的名称是为了纪念那些祖先获得自由的人,而不是为了让外人容易理解。

Break Up Big Tech: Civil Society Declaration #

https://peoplevsbig.tech/break-up-big-tech-civil-society-declaration/

这篇文章是一份来自欧洲及全球民间组织和人民的宣言,呼吁欧盟委员会立即采取行动,打破大型科技公司(Big Tech)对数字世界的垄断。这些科技公司不仅控制了市场,还对欧洲民主构成了威胁。文章强调,欧洲需要一个繁荣多样的数字经济,服务于欧洲公民的需求,而不是亿万富翁科技 CEO 的利益。

文章指出,欧盟委员会有一个千载难逢的机会来拆除谷歌的广告垄断,这一垄断破坏了新闻媒体,剥削了消费者,并在美国的一项具有里程碑意义的判决中被裁定为非法。大型科技公司的垄断力量对民主构成威胁,它们集中控制了我们的核心数字基础设施,包括搜索引擎、社交媒体、应用商店和云服务。这些公司的不受限制的权力使它们能够滥用人权、剥削企业和压垮竞争对手。

西班牙首相佩德罗·桑切斯警告说,科技亿万富翁想要“推翻民主”。当少数亿万富翁和科技巨头控制互联网时,他们利用自己的权力和巨额利润来影响政治话语和干预民主法律。今年,科技 CEO 和特朗普政府密切合作,试图阻挠欧盟的标志性数字法律,这些法律要求大型科技公司承担责任。

文章呼吁,为了解决大型科技公司的危害,必须首先面对它们的力量。欧盟竞争事务主管特蕾莎·里贝拉认识到,拆分可以防止大型科技公司获得过多的市场力量。这些公司将数十亿欧元的罚款视为做生意的成本,而行为补救措施无效且经常被公司忽视。迫使这些巨头出售部分业务将减少利益冲突,平衡数字竞争环境,并使公司更容易对其日益增长的社会危害负责。

文章特别提到,打破谷歌的广告垄断是欧盟的一个明显目标,得到了十八位前欧洲总统和总理的支持。谷歌的垄断不公平地从出版商那里吸取收入,扼杀新闻业和新闻媒体,同时通过“广告技术税”迫使消费者向行业中间人支付更多费用。在对谷歌广告技术的最终裁决中,委员会必须重申,只有谷歌强制剥离部分服务,才能解决竞争问题。

文章最后强调,打破科技垄断是迈向一个更自由、更公平的互联网的一步。欧洲可以并且必须抵抗大型科技公司和特朗普政府的威胁,坚定地维护欧盟法律对抗大型科技公司。文章呼吁拆分谷歌,拆分大型科技公司,并列出了一系列签署该宣言的组织和机构。


HN 热度 194 points | 评论 158 comments | 作者:janandonly | 16 hours ago #

https://news.ycombinator.com/item?id=44325596

  • 要求欧盟强制拆分美国公司是对抗疯狂的行为,应该通过禁止美国服务来促进本土替代品的发展
  • 如果公司在欧盟开展业务,它们必须遵守欧盟法规,要求拆分是合理的
  • 技术本身并非固有垄断性,而是集中式运作的公司导致垄断,解决方案是采用去中心化的技术
  • 去中心化系统在达到大规模吸引力后最终会变成中心化,因为普通用户倾向于选择简化他们生活的服务
  • 去中心化协议构建的系统可以避免中心化,用户可以自由选择服务,避免供应商锁定和垄断
  • 服务问题如账户被盗、交易逆转、欺诈追索等,在去中心化系统中并非不可能解决,只是公司没有动机去发明或使用这些解决方案
  • 即使去中心化协议在规模上趋于中心化,用户仍然可以选择不同的服务提供商
  • 通过要求互操作性和遵守标准,可能找到一种中间地带来减少大型科技公司的影响力
  • 标准变化缓慢,不利于快速演变的用例,有限、通用且允许上下游创新的标准更成功
  • HTTPS 证明了其成功,适用于大多数用例,更复杂、高效的标准可能无法如此通用
  • 应该像 CERN 那样,由学术界产生简单的标准,然后由行业在社区/监管机构的推动下发展,最后发布标准