2024-03-25

32 篇热帖

1. Barcelona’s Sagrada Familia will be completed in 2026 (www.cnn.com)

巴塞罗那圣家堂将于2026年完工,届时距离1882年开工已逾140年。管理方在最新年度报告中确认,最后一座塔楼(耶稣塔)将在2026年完成结构建造,圣母升天堂则计划于2025年完工。

  • 建筑细节:耶稣塔高172.5米,顶端将安装17米高的十字架。建成后,圣家堂将成为世界最高教堂,超越德国乌尔姆大教堂。
  • 历史背景:由建筑师高迪主导设计,规划包含18座象征《圣经》人物的尖塔。1926年高迪去世时仅完工10%-15%,后续工程因西班牙内战中断,原有设计图纸大部分被毁,现依据残存资料重建。
  • 现状与意义:1984年被列为联合国教科文组织世界遗产,2010年由教皇本笃十六世举行宗教奉献礼。值得注意的是,该教堂直至2019年才获得巴塞罗那市政府颁发的合法建筑许可证,此前长达137年处于无证建设状态。
3. Why choose async/await over threads? (notgull.net)

这篇文章探讨了在Rust中为何选择 async/await 而非操作系统线程,主要论点如下:

核心问题

尽管线程能完成 async/await 的工作,且看似更简单,但 async/await 在特定场景下具有独特优势。

背景与问题引入

  1. 同步代码的局限性:以Web服务器为例,同步阻塞代码在处理多个客户端连接时效率低下,无法扩展。
  2. 线程的解决方案:操作系统线程通过模拟并发解决了此问题,允许不同任务并行执行,但存在线程开销和同步复杂性。
  3. 异步的动机:为追求更高的并发效率和更优的资源管理,开发者希望将并发模型从内核空间(线程)移至用户空间。Rust 选择了 async/await 模式,它通过状态机和执行器实现协作式并发。

async/await 的优势

  1. 卓越的组合性
    • 这是 async/await 最强大的优势。它能轻松将复杂的逻辑(如超时、重试、负载均衡)组合到现有的异步操作中。
    • 示例:为一个读取数据的异步函数添加3秒超时,只需将核心逻辑与一个定时器Future通过 race 组合即可,代码清晰简洁。
  2. 强大的抽象与泛化
    • async 代码通常针对 trait(如 AsyncRead + AsyncWrite)而非具体类型编写,因此可以无缝用于TCP流、Unix套接字、文件甚至自定义的压缩流等多种I/O源。
  3. 表达复杂并发模式的能力
    • 在同步代码中实现某些模式(如上述超时)非常笨拙(需创建包装类型、处理系统调用),而 async/await 能更自然、优雅地表达。

对常见质疑的回应

  1. “线程更简单”:对于简单的并发场景确实如此。但当需求变得复杂(如需要组合多种行为)时,线程代码会变得 hacky 且难以维护,而 async/await 能保持代码的整洁和可组合性。
  2. “性能是唯一优势”:这是常见的误解。文章指出,社区过于强调 async/await 的性能收益(其本身是情境性的),却忽略了其语义优势——即作为一种编程模型,它能更简洁、强大地表达特定并发模式。
  3. “应与同步代码一样简单”:作者反对强行使 async/await 与同步编程体验完全一致。他认为两者本质不同,应拥抱差异,并突出 async/await组合性表达力上的核心优势。

结论

选择 async/await 的主要原因并非单纯为了性能,而是为了其强大的组合能力表达复杂并发模式的语义优势。当需要构建可扩展、可组合的I/O密集型服务或需要精细控制并发流时,async/await 是比操作系统线程更合适、更强大的工具。

4. Show HN: Jampack – Optimizes static websites as a post-processing step (github.com)

Jampack:静态网站后处理优化工具

Jampack 是一个后处理工具,用于优化静态网站生成器(SSG)的输出,以提升用户体验和 Core Web Vitals 分数。它不是打包器或框架,而专注于在构建后对静态网站进行优化。

主要功能

  • 响应式图像优化:自动将图像转换为支持多种格式(如 WebP、AVIF)的响应式版本,并添加 srcsetsizesloading="lazy"decoding="async" 属性。示例显示本地图像和 CDN 图像(如 Unsplash)均可优化。
  • 外部图像处理:下载并优化外部图像,保存到本地目录(如 _jampack/),生成响应式版本。
  • 首屏优化:优先加载首屏(above-the-fold)资产,小图像嵌入 HTML 以减少请求。
  • 懒加载首屏以下资产:对首屏以下(below-the-fold)的图像和 iframe 实施懒加载,提升页面加载速度。
  • CSS 优化:内联关键 CSS 以避免样式闪烁(FOUC),并懒加载其余 CSS,减少渲染阻塞。
  • 链接预取:通过 quicklink 技术动态预取页面链接,当链接进入视口时自动处理,加速未来导航。
  • 资产压缩:在第二次处理中压缩所有未优化的资产,保持原文件名和格式。支持多种文件类型:
    • .html, .htm:使用 html-minifier-terser
    • .css:使用 lightningCSS
    • .js:使用 esbuild 或 swc
    • .svg:使用 svgo
    • 图像(.jpg, .png, .webp, .avif):使用 sharp

使用方法

快速使用命令为:npx @divriots/jampack ./dist,优化指定文件夹(如 dist)中的静态网站。更多选项可参考 CLI 文档。

实际应用

Jampack 已用于多个网站,包括 keycloak.ch、bayjs.org、qwind.pages.dev、Bloycey's Blog、gxanshu.in、cloudcannon.com 和 groupsync.app。

命名与许可

名称“jampack”结合了“Jam”(来自 Jamstack)和“pack”(类似90年代的可执行文件打包器)。软件基于 MIT 许可证发布。

6. Pyenv – lets you easily switch between multiple versions of Python (github.com)

Pyenv:轻松管理多个Python版本

Pyenv 是一个用于在用户级别轻松切换多个 Python 版本的工具。它简单、低调,遵循 UNIX 单一功能工具的传统。该项目 fork 自 rbenv 和 ruby-build,并为 Python 进行了修改。

核心功能

  • 允许用户按用户级别全局更改 Python 版本。
  • 支持按项目设置 Python 版本。
  • 允许通过环境变量覆盖 Python 版本。
  • 可同时从多个 Python 版本中搜索命令(例如用于跨版本测试)。

与 pythonbrew/pythonz 的区别

  • 不依赖 Python 本身:由纯 shell 脚本编写,无 Python 引导问题。
  • 无需加载到 shell:通过将目录添加到 PATH 来工作(使用 shim 机制)。
  • 不管理 virtualenv:可自行创建或通过 pyenv-virtualenv 插件自动化。

安装

获取 Pyenv

  • Linux/Unix
    • 自动安装器(推荐)curl -fsSL https://pyenv.run | bash
    • 基础 GitHub 检出:克隆到 ~/.pyenv,可选编译动态 Bash 扩展。
  • macOS
    • 推荐使用 Homebrew:brew update && brew install pyenv
  • Windows:官方不支持,建议使用 pyenv-win fork。

设置 Shell 环境

需在 Shell 配置文件(如 ~/.bashrc, ~/.zshrc, ~/.profile)中添加以下命令:

export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init - bash)"  # 根据 Shell 类型调整,如 zsh、fish 等

然后重启 Shell 以使更改生效。

安装 Python 构建依赖

在安装新 Python 版本前,需先安装系统构建依赖。

使用方法

安装 Python 版本

  • pyenv install <version>:例如 pyenv install 3.10.4
  • pyenv install -l:列出所有可用版本。
  • 支持版本前缀自动解析至最新版本(如 pyenv install 3.10 安装 3.10.x 最新版)。

切换 Python 版本

  • pyenv shell <version>:仅对当前 Shell 会话生效。
  • pyenv local <version>:在当前目录(及子目录)自动选择。
  • pyenv global <version>:为用户账户全局选择。
  • 使用 system 版本名可重置为系统 Python。

同时使用多个版本

可指定多个版本(如 pyenv global 3.11 3.12),命令将按顺序搜索这些版本的可执行文件。

卸载 Python 版本

  • pyenv uninstall <versions>:或手动删除 $(pyenv root)/versions/<version> 目录。

工作原理

Pyenv 通过将 shim 可执行文件 注入 PATH 前端来拦截 Python 命令,并根据配置确定使用哪个 Python 版本。

关键概念

  • PATH:Shell 搜索可执行文件的目录列表。
  • Shims:轻量级可执行文件,将命令传递给 pyenv。通过 rehash 保持与所有已安装版本中的命令匹配。
  • Python 版本选择:按以下优先级确定版本:
    1. PYENV_VERSION 环境变量。
    2. 当前目录的 .python-version 文件。
    3. 父目录中找到的第一个 .python-version 文件。
    4. 全局 $(pyenv root)/version 文件。
    5. 回退到 system 版本(即 shim 路径之后系统 PATH 中的 Python)。

高级配置

  • 无 shim 使用:可手动使用安装在 $(pyenv root)/versions 中的 Python,或通过 pyenv exec <command>
  • 环境变量:如 PYENV_VERSION, PYENV_ROOT, PYENV_DEBUG 等可控制行为。

插件

Pyenv 支持通过插件扩展功能,插件目录位于 $PYENV_ROOT/plugins/

维护与卸载

  • 升级
    • Homebrew:brew upgrade pyenv
    • Git 检出:在 $(pyenv root) 目录执行 git pull
  • 卸载:从 Shell 配置中移除相关行,并删除 $(pyenv root) 目录。

开发与许可证

  • 源码托管在 GitHub,使用 Bats 进行测试。
  • 采用 MIT 许可证。
7. DongleHider+ Framework Laptop Expansion Card (github.com)

DongleHider+ 框架笔记本扩展卡概述

DongleHider+ 是一款专为 Framework 笔记本设计的扩展卡,其核心功能是允许用户将 Logitech Unifying 或类似尺寸的无线接收器永久内置在卡体内,从而在不占用额外扩展卡槽的情况下,始终保持一个可用的 USB-A 端口。卡内预留了空间与焊盘,理论上可安装 1-2 个额外的接收器。

兼容性与行为测试(基于 Windows 系统及 Framework 13/16 AMD 型号)

  • 功耗: 仅内置接收器工作时,卡上的 CH334 USB 集线器芯片耗电约 20mA(加上 Unifying 接收器本身的约 25mA)。若集线器无外接设备,功耗可降至 <1mA。
  • USB 3/4 兼容性问题:
    • 当连接至 USB4 功能的扩展卡槽 并同时插入外部 USB 3 设备时,内置接收器会停止工作(但仍显示为已连接)。拔下外部 USB 3 设备后,内置接收器可立即恢复工作。
    • USB 2 设备基本正常工作,但个别测试中的 USB 闪存盘需多次插拔才能枚举。
    • 此问题在非 USB4 功能的扩展卡槽上未出现,USB 3 设备可与内置接收器正常协同工作。
  • 未知兼容性: 在 Linux 系统或 Intel 架构框架笔记本上的表现尚未测试。

支持的接收器

  • 项目主要面向 Logitech Unifying 接收器。其他接收器可通过拆解后对比尺寸(参考提供的 CAD 模型)来判断是否兼容。卡体内部(PCB 上下方)尚有额外空间。
  • Unifying 接收器拆解较易:第一代需用钳子小心掰开塑料外壳;第二代可用平头螺丝刀撬开金属外壳。

PCB 与机械设计

  • PCB: 提供原理图、布局图、交互式 BOM 文件,并包含可用于 JLCPCB 等 PCB 组装服务的生产文件(Gerber、BOM、CPL)。PCB 通过 3 颗 M2x3 自攻螺丝固定于外壳。
  • 机械设计: 外壳等结构的 CAD 模型使用 OnShape 设计。提供 .step 文件,可进行 3D 打印,建议打印层高 0.1mm 并添加支撑。
8. Aegis v3.0 – a free, secure and open source 2FA app for Android (github.com)

Aegis v3.0 总结

核心定位

Aegis v3.0 是一款免费、安全且开源的双因素认证(2FA)应用程序,专为 Android 平台设计。

主要特性

  • 多种令牌支持:兼容 TOTP、HOTP、Steam Guard 等常见 2FA 令牌类型。
  • 强加密存储:所有令牌数据均通过 AES-256 加密存储于设备本地,确保信息安全。
  • 生物识别保护:支持指纹或面部识别解锁应用,提供便捷且安全的访问控制。
  • 开源透明:作为开源项目,其代码完全公开,允许安全研究人员和社区审查,无隐藏后门。
  • 灵活备份:支持本地加密备份及跨设备迁移,防止令牌丢失。

技术亮点

  • 完全离线操作,无需网络连接,避免在线风险。
  • 提供 Material Design 风格的界面,注重用户体验。
  • 支持从其他认证应用(如 Google Authenticator)导入令牌。

适用场景

适用于注重隐私安全、希望自主管理 2FA 令牌的 Android 用户,尤其适合开发者和安全爱好者。

获取方式

可通过 F-Droid 或 GitHub 直接下载安装,详细文档与源码均托管在 GitHub 仓库。

9. Monolith – CLI tool for saving complete web pages as a single HTML file (github.com)

Monolith CLI 工具概述

Monolith 是一款命令行工具,用于将完整的网页保存为单个HTML文件,便于存储和分享。

核心功能与优势

  • 将网页及其所有资源(CSS、图片、JavaScript)嵌入到单个HTML5文件中。
  • 与传统“保存网页”功能不同,Monolith 生成的文件可在无网络环境下保持原样显示。
  • 相比使用 wget -mpk,它通过将资源转为数据URL嵌入,确保浏览器完美还原原始页面。

安装方式

支持跨平台安装,包括:

  • 包管理器:Cargo、Homebrew(macOS/Linux)、Chocolatey/Scoop/Winget(Windows)、MacPorts、Snapcraft、Guix、NixPkgs、Pacman、aports、XBPS、FreeBSD包/ports、pkgsrc。
  • 容器:提供Docker镜像。
  • 源码安装:需要libssl和Cargo依赖,从GitHub仓库克隆后编译。
  • 预构建二进制:为Windows、Linux及ARM等非标准CPU架构提供现成文件。

基本使用

通过命令行调用,常用格式示例:

monolith URL -o 输出文件.html

支持从标准输入读取内容并处理:

cat 网页.html | monolith 参数 - > 输出文件.html

主要参数选项

  • -a/-c/-f/-F/-i/-j/-v:排除音频、CSS、框架、网络字体、图片、JavaScript、视频等资源。
  • -b URL:设置自定义基URL。
  • -d/-B 域名:白名单/黑名单域名,控制资源来源。
  • -I:隔离文档(禁用外部请求,仅保留页面内部引用)。
  • -o 文件:指定输出文件路径(-表示标准输出)。
  • -m:输出为MHTML格式而非HTML。
  • -M:不添加时间戳和URL信息。
  • -k:接受无效的X.509证书。
  • -t:设置网络请求超时。
  • -u:自定义User-Agent。

高级用法

  • 域名过滤:通过-d-B精细控制可访问的域名。
  • 动态内容处理:建议结合Chromium无头模式预处理(如使用--dump-dom)后再通过Monolith保存。
  • 认证与代理:支持基本认证URL格式,通过环境变量配置代理。
  • 云服务:可在Apify平台免费使用Monolith Actor,无需本地安装。

许可与贡献

  • 采用公共领域授权(无版权保留),不提供任何担保。
  • 欢迎通过提交问题报告参与项目改进。

Monolith 解决了传统网页保存的碎片化问题,实现了“一键归档”,特别适合数据收集和离线阅读场景。

10. “Emergent” abilities in LLMs actually develop gradually and predictably – study (www.quantamagazine.org)

大型语言模型的“涌现”能力:是突变还是渐进?

过去两年间,围绕大型语言模型(LLM)的研究中出现了一个关键现象:在一些基准测试(如BIG-bench)中,LLM 的某些能力(如三位数加法)在模型参数规模跨过某个阈值后,会突然出现,而非平滑提升。研究者将此现象比作物理中的“相变”,并称之为“涌现能力”,认为这是系统复杂度达到一定高度后才集体显现的、不可预测的突破性行为,对 AI 的安全与潜力讨论至关重要。

然而,斯坦福大学的一项新研究对此提出了挑战。该研究认为,所谓的“涌现”可能是一种测量方法导致的假象,而非模型内部工作机制的突变。

研究的核心论点在于,能力的“突然出现”取决于研究者如何定义和测量性能。例如,在三位数加法任务中,早期评估仅采用“完全正确”的二元指标:要么所有数字完全准确,要么得零分。在这种标准下,模型在参数规模较小时尚无法完美作答,表现为零分;而当参数增长到一定规模(如130亿或680亿)后,便突然“学会”了正确计算,形成了视觉上的“跳跃”。

斯坦福的研究人员调整了评估标准,引入了允许部分正确的渐进式指标(例如,依次检查每一位数字的预测准确性)。结果发现,随着模型参数量的增加,LLM 在加法任务中逐步展现出对数字序列越来越准确的预测能力。这一过程是平滑且可预测的,而非跳跃式的。

因此,该研究得出结论:LLM 随着规模扩大而变得更强大、能处理更复杂任务的趋势是客观存在的。但能力的展现方式——是看似突变的“涌现”还是平滑的渐进——很大程度上由我们选择的测量尺度决定。当评估指标从“全有或全无”变为允许程度性进步时,“涌现”的现象便会消退,揭示出能力发展是一个持续、渐进的过程。

这项研究促使我们重新审视对AI能力发展的理解,强调了在讨论模型突破性进展时,审慎定义和选择评估标准的重要性。

12. The Format Dialog in Windows NT (twitter.com)

该内容是一个错误消息,指出在x.com网站上出现了问题,提示用户无需担心并建议再次尝试。消息提到,一些与隐私相关的扩展可能导致网站问题,因此建议禁用这些扩展后重试。

13. Everyone is John: A competitive roleplaying game for three or more people (rtwolf.github.io)

《人人都是约翰》游戏概述
《人人都是约翰》是一款适用于三人或以上的竞争性角色扮演游戏。游戏中,一名玩家担任主持人(称为“其他人”),其余玩家扮演名为“约翰”的精神病人头脑中的多个“声音”人格。约翰居住在明尼阿波利斯,行为完全失控,而各个“声音”通过竞标与掷骰争夺对其身体的临时控制权,以完成各自的“痴迷目标”。

核心机制

  • 角色设定
    每个“声音”拥有:

    1. 意志力(初始值10点,可消耗以争夺控制权或提高行动成功率)。
    2. 技能(自由描述的2-3项能力,如“擅长说服”)。
    3. 痴迷目标(分三级:1级较简单,3级极难;完成次数乘以等级为最终得分)。
  • 行动判定
    当控制约翰的“声音”尝试可能失败的行动时,需掷六面骰:

    • 若拥有相关技能,需≥3点成功;否则需6点。
    • 可消耗意志力点数增加骰面数值(每点+1)。
  • 控制权争夺
    在约翰醒来、受伤、当前“声音”行动失败或完成痴迷目标时触发。所有“声音”暗标意志力,出价最高者获得控制权(平局则掷骰决胜),胜者扣除所出意志力。

  • 游戏流程

    1. 主持人描述约翰醒来的随机场景。
    2. “声音”轮流争夺控制权并尝试完成痴迷目标。
    3. 若约翰长时间无事件(约10分钟),主持人可判定其入睡(所有“声音”恢复1点意志力)。
    4. 当所有“声音”意志力归零时,游戏结束。

胜利条件
统计各“声音”痴迷目标的完成次数,乘以目标等级后得分最高者获胜,并通常成为下一轮游戏的主持人。

备注
该游戏以创意共享许可(CC BY 4.0)发布,允许自由改编与传播。核心资源可通过游戏官网或网络搜索获取。

14. SPQR 1.3.0: a production-ready system for horizontal scaling of PostgreSQL (github.com)

SPQR 1.3.0 版本更新摘要

SPQR 发布了长期开发后的新版本,重点聚焦于分片配置、协议改进和数据平衡。

主要更新内容

1. 新的分片配置语法

  • 弃用旧语法:原有的 SHARDING RULE 语法已弃用。
  • 引入新流程
    1. 使用 CREATE DISTRIBUTION 命令创建分布。
    2. 使用 ATTACH RELATION 命令指定需要分片的表和列。
    3. 使用 CREATE KEY RANGE 命令定义键范围,明确哪些数据值应路由到哪个分片。

2. 扩展协议支持改进

  • 持续完善对 PostgreSQL 扩展协议的支持。
  • 在大多数使用场景下,路由器已能正确工作。

3. 智能分片重新平衡(初步版本)

  • 目标:实现分片间的工作负载比例平衡。
  • 核心策略:在数据迁移过程中最小化锁定影响。
  • 实现方法:通过缩小单次传输的数据范围大小来达成上述目标。
  • 当前状态:此为第一版组件,仍有较大改进空间。

其他说明

完整的变更详情可在项目的发布说明中查阅。

15. How do MRI Headphones work? (2022) (tomlingham.com)

MRI耳机工作原理

背景与疑问

  • MRI环境的特殊性:MRI(磁共振成像)设备产生强磁场,严禁携带金属或磁性材料进入。传统耳机使用电磁驱动(动圈单元),通常包含磁铁和通电线圈,在此环境中无法使用。
  • 作者的困惑:在体验MRI时,作者注意到提供的耳机居然可以使用,因此思考其技术原理,排除了传统电磁驱动、金属材料或机械传导等可能性。

核心发现

  • 实际解决方案:MRI耳机并非采用电磁驱动,而是气传导设计
    • 耳机本身仅是一个带有软管的听筒,不包含任何电子元件或磁铁。
    • 声音信号由远离MRI室的另一个房间中的传统扬声器产生。
    • 通过厚实的软管(类似橡胶管)将声音以空气振动的形式传递到患者耳中。
  • 设计优势
    • 完全规避了金属和磁性材料的使用,确保在强磁场中安全。
    • 结构简单,成本较低。
  • 音质缺陷:由于通过长管道传导空气振动,高频细节容易损失,且声音易受机器噪音干扰,因此音质通常较差。

补充说明

  • 文章通过对比传统耳机与MRI耳机的结构,突出了工程设计的适应性:在极端环境下,采用最简单可靠的物理方案(声波空气传导)替代复杂电子系统。
  • 作者提到这种耳机“听起来很糟糕”,正是由气传导的物理限制所导致。
16. For Brilliant Color: Packaging the First LSD Blotter (thereader.mitpress.mit.edu)

埃里克·戈斯特(Eric Ghost)巧妙伪装的LSD包装映射了1960年代反主流文化的迷幻愿景。以下图像并非真实的柯达胶卷,而是纽约人埃里克·戈斯特(又名埃里克·布朗)于1968年为地下LSD制作的一种巧妙而带有温和讽刺意味的隐秘包装。戈斯特约在1965年于纽约下东区首次服用LSD,在此之前他经历了一段辗转的军旅生涯、持械抢劫和入狱生活。他吞下了近4000微克的纯山德士LSD,涂抹在一块方糖上,这次巨大剂量带来的核裂变式启示促使他共同创立了“Psychedelicatessen”——一家于1966年在A大道164号开业的传奇但短命的迷幻商店。与当时许多LSD使用者一样,戈斯特对这种分子及其改善人类和世界的潜力抱有救世主般的热情。LSD被禁后,他决定开始自己合成和分销。

与当今将迷幻药视为药物、派对消遣或原住民圣礼不同,1960年代的许多LSD使用者将他们喜爱的物质想象为一种媒介。如同战后世界日益技术化的媒体一样,LSD能够过滤、转化和放大非药物现象。戈斯特通过将其伪装成承诺“绚丽色彩”的胶卷库存来玩转这种关联。每张LSD纸片都用聚酯薄膜包裹,这不仅保护了LSD免受有害紫外线照射,还能阻止好奇者轻易打开包装,以免损坏未曝光的胶卷。这种“媒介即讯息”的理念渗透于当时的LSD话语和营销中。其他例子包括“窗玻璃”(Window pane)、“清透窗”(Clearlist)以及一些首批印刷的LSD吸墨纸,上面印有电灯泡图案。

戈斯特的隐秘包装包含了LSD分销领域一项新颖而重要的发展:首批通过机械化生产的、滴有LSD的吸墨纸。此前,液态LSD曾被滴在真正的吸墨纸和其他纸制品上,但这种转移是一滴一滴进行的,使用移液管或眼药水滴管。戈斯特与一位同事设计并制造了Mark I设备来加速此过程,该设备允许100根针同时浸入一盘LSD溶液中,然后作为一个整体移动,同时压印到一张吸收性纸上。针头和由此产生的给药纸片遵循一个紧凑的网格,其形式是五行二十列的紧密排列——上文中巧妙提到的“5-20”图案。戈斯特的每一滴LSD都含有高达1000微克的剂量,需要由分销商或客户手动切割成四份较小的剂量,每份仍有250微克的效力。这种安排——“四分”(four-way)——在吸墨纸的历史上反复出现。

打开戈斯特的包装,购买者会发现一张实用的信息页,这让我们今天能了解一些地下供应商当时如何理解和推销他们的产品。戈斯特的文本没有采用嬉皮士的神秘主义或革命口号,而是将LSD呈现为一个由制药公司运营的现代研究实验室的科学产品。尽管LSD与一种有机物质——黑麦上的麦角菌——有关,但该药物奇特特性的一部分正源于其处于欧洲技术现代性核心的起源。尽管戈斯特的部分信息有误(LSD在化学上与麦司卡林并不相似),但它展示了现代迷幻文化中始终存在的那种书呆子式迷恋。

战后迷幻文化和研究中最主导且一贯的理念,至今仍被广泛使用的,是“身心准备与环境”(set and setting)在影响体验中的作用。尽管蒂莫西·利里及其合著者在1964年的《迷幻体验》一书中大力宣扬,但LSD反映并放大内在态度和环境线索的观念,在1950年代已被研究者和使用者所认识。这种递归效应有助于解释迷幻效果的多样性和可塑性,以及围绕这些化合物的文化叙事的重要性——1960年代是扩展意识,如今则是丛集性头痛和创伤后应激障碍。然而,即使在那些享乐主义和实验性的时代,向导的重要作用也已得到认可。

如今“迷幻复兴”的临床和治疗推动者常常自诩为新颖的先驱。戈斯特的文本提醒我们,1960年代的研究界早已探索了LSD的许多临床应用——用于治疗酗酒、癌症患者的疼痛和焦虑、心理压抑,甚至自闭症的挑战。同时,文中提到LSD可能“治愈”同性恋——这是1960年代早期由蒂莫西·利里和理查德·阿尔珀特(后来接纳了自己的同性恋身份)探索过的内容——提醒我们这类研究议程中固有的扭曲,以及LSD作为行为修正工具的黑暗遗产。

18. Who killed the network switch? A Hubris Bug Story (cliffle.com)

Hubris操作系统内核漏洞分析:两个功能结合导致网络交换机故障

Hubris概述 Hubris是为深度嵌入式系统设计的操作系统,负责Oxide机架中大型处理器的启动。其特点是基于Rust语言实现任务隔离,通过硬件内存保护单元(MPU)将每个任务(独立编译的程序)隔离在独立的内存区域中,以防止任务间相互干扰。

问题现象 Oxide网络交换机在更改电源时序和时钟配置后无法启动。电源时序任务(sequencer)虽仍在运行但无法正常工作,导致交换机无法供电。调试工具显示该任务因内存错误(mem fault)已崩溃重启115次,错误地址为0x801bffd

根本原因 漏洞由两个独立功能结合引发:

  1. 任务打包优化:为减少内存浪费,构建系统使用多个MPU区域紧凑排列任务。此优化使任务内存区域边界出现在难以预测的位置。
  2. IPC内存借用检查:Hubris内核在任务通过IPC借出内存时,会检查访问权限。原有检查算法假设借出的内存位于单一MPU区域内。

当任务借出的内存跨越两个相邻的MPU区域时,内核错误地判定为内存访问违规,导致调用任务被终止。例如,电源时序任务借内存给I2C驱动时,因内存跨越区域边界(0x801bfff0x801c000)而被内核错误终止。

漏洞特征

  • 此为合成错误(synthetic fault),由软件规则违规触发,而非硬件异常。
  • 漏洞仅影响IPC内存借用检查,硬件直接访问正常,因此任务在非IPC场景下可能正常工作。
  • 无安全风险:内核错误地阻止了合法访问,而非允许非法访问。

修复方案

  1. 禁用任务打包:临时关闭优化以恢复系统运行。
  2. 修改内核检查算法:新算法支持跨越多个相邻MPU区域的内存借用检查,同时保持单次遍历以避免性能下降。
  3. 构建系统确保区域排序:内核依赖MPU区域按地址排序的特性进行高效检查。

系统可靠性表现 尽管存在漏洞,Hubris的架构确保了系统部分可用:

  • 故障隔离:电源时序任务崩溃未影响其他22个任务(如网络栈、I2C驱动等)。
  • 安全失败:漏洞仅阻止合法操作,未引入可利用的安全缺陷。
  • IPC弹性:支持幂等操作的任务可透明重试,客户端与故障服务解耦。
  • 调试支持:调试器Humility快速定位问题,内核支持压缩核心转储。

启示

  1. 功能组合风险:单独正确的功能可能因交互产生漏洞。
  2. 简单设计的价值:Hubris内核仅约1,800行,便于分析和调试。
  3. 团队协作文化:跨职能团队快速协作,在3小时内定位并修复漏洞。
  4. 测试必要性:复杂算法需覆盖边界情况,尤其当基础假设变更时。

此案例展示了嵌入式系统中安全关键软件的设计权衡,以及Hubris在资源受限环境下通过隔离与简洁设计实现的韧性。

19. C++ left arrow operator (2016) (www.atnnn.com)

本文探讨在C++中实现自定义左箭头运算符<-的方法,用于调用指向成员函数的指针。

核心实现:

  • 定义模板结构larrow,包装指向类的指针。
  • 重载运算符<,当左侧为成员函数指针、右侧为larrow对象时,通过(it.a->*f)()调用该函数。
  • 重载运算符-,用于将对象转换为larrow包装。
  • 示例:(&C::f)<-x; 在对象x上调用成员函数f

讨论与扩展:

  • 作者提到有人在Reddit上指出该设计易与<--运算符混淆,但认为通过区分字符可以接受。
  • 展示了结合<-<--运算符的高级用法,以实现简洁高效的代码,例如在循环中动态调用虚函数。

关键点:

  • 目的是简化C++中成员函数指针的调用语法。
  • 技术涉及模板元编程和运算符重载。
  • 提供了代码示例以说明实现和用法。
20. Show HN: Nano-web – a low latency one binary webserver designed for serving SPAs (github.com)

Nano-web:低延迟单二进制文件Web服务器

概述

Nano-web 是一款专为服务单页应用(SPA)而设计的低延迟、单二进制文件的 Web 服务器。其核心设计目标是实现近零延迟的文件服务。

核心性能特点

  • 静态文件服务:在启动时预加载并预压缩所有文件,以实现近零延迟响应。
  • 高性能架构
    • 基于 hyper 底层库。
    • 使用 SO_REUSEPORT 实现多核扩展。
    • 启动时使用 Brotli、Gzip、Zstd 预压缩文件。
    • 使用 DashMapfxhash 实现无锁并发路由。
    • 支持零拷贝响应(Bytes)。
  • 基准测试:在 M3 Max 芯片上,使用 wrk 测试(50并发连接,50线程,持续10秒),达到 149,838.48 请求/秒,平均延迟仅 328.63 微秒

安装与部署

  • 安装方式
    • 通过 misemise install ubi:radiosilence/nano-web
    • 通过 cargocargo install nano-web
    • 使用 GitHub Releases 上的预构建二进制文件。
    • 使用 Docker 镜像:ghcr.io/radiosilence/nano-web:latest,并将静态文件目录(如 ./dist)复制到容器的 /public/ 路径下。

使用方式

  • 基本命令
    • nano-web serve:服务当前目录下的 ./public 文件夹,默认端口 3000。
    • nano-web serve ./dist --port 8080:指定服务目录和端口。
    • nano-web serve --spa --dev:启用 SPA 模式和热重载。

主要功能与配置

  • 配置选项
    • --port, -p:端口(默认 3000)。
    • --spa:SPA 模式,为未知路由返回 index.html
    • --dev, -d:开发模式,支持文件修改后自动重载。
    • --config-prefix:环境变量模板注入的前缀(默认 VITE_)。
    • --log-level:日志级别(debug/info/warn/error)。
    • --log-format:日志格式(console/json)。
    • --log-requests:记录每个请求。
  • 运行时配置注入:可在启动时将环境变量注入 HTML 文件,支持 {{env.VAR_NAME}}{{Json}}{{EscapedJson}} 模板变量。
  • 缓存:支持 ETagIf-None-Match 头,当内容未改变时返回 304 Not Modified
  • 安全头:所有响应自动包含 X-Content-Type-OptionsX-Frame-OptionsReferrer-PolicyStrict-Transport-SecurityPermissions-PolicyX-DNS-Prefetch-Control 等安全头。压缩响应额外包含 Vary: Accept-Encoding
  • 健康检查:访问 /_health 端点返回 {"status":"ok","timestamp":"..."}

许可证

MIT 许可证。

21. EU Launches Probes into Apple, Meta, Google Under New Digital Competition Law (www.wsj.com)
22. Thoughts on Vision Pro (andrewhart.me)

Vision Pro 使用一个月后的思考

作者是一位拥有多年增强现实(AR)开发经验的专业人士,曾为苹果的 ARKit 和 RealityKit 框架构建大型开源项目,并运营一家 AR 初创公司。他自费购买了 Vision Pro,并每天使用,主要将其用于通过 Mac 虚拟屏幕功能工作以及观看影视内容。

核心观点与体验

透视效果

  • 优于现有产品,但非“逼真”:与市面其他设备相比,苹果的透视效果已属出色,但仍感觉像在查看有噪点的摄像头画面,并非如早期评测所描述的接近真实世界。
  • 苹果最小化了畸变:相比 Meta 已推出数年但仍有挑战的产品,苹果在减少画面畸变方面做得更好。
  • 存在典型摄像头问题:仍有灯光闪烁、镜头光晕、曝光问题和运动模糊等现象。

沉浸感与显示

  • 虚拟内容显示惊人:屏幕分辨率极高,渲染的虚拟内容看起来非常真实,没有可见像素,其真实感甚至优于透视画面。
  • 环境体验有改进空间:现有的虚拟环境(如会议室、电影院)质量不错,但选择较少且切换不便。作者希望苹果能开放更多环境或提供付费环境包。

舒适度

  • 存在多种限制因素:有限的视野(隧道视觉)、透视画面质量、运动模糊和设备重量都影响舒适度,摘下时会有回到现实世界的 relief 感。
  • 移除遮光罩可显著改善:不使用 Light Seal 时,眼睛更接近屏幕,减少了隧道视觉,视野更宽。但这并非设计用途,铝制框架会直接压在鼻子上,作者期待相关配件。

交互方式

  • “看-点”操作自然但非完美:眼动追踪和点选的手势交互很直观,易于上手。
    • 问题1:眼睛会不自觉地先于手指移动,必须盯着目标完成点击,感觉像在减速。
    • 问题2:所有注视的对象都会被高亮选中,存在误触焦虑(例如,在查看下载进度时可能误触取消按钮)。
  • 虚拟键盘是主要瓶颈:在空中打字非常困难,缺乏物理表面和触觉反馈。逐个按键地看和点选很笨拙。目前最实用的解决方案是连接实体键盘。

操作系统 visionOS

  • 最大创新是原生应用框架:与 Quest 上每个应用都需重新发明交互逻辑不同,visionOS 提供了统一的系统框架,使所有应用的外观和感觉一致。
  • 多任务与稳定性优秀:应用可以在用户空间中共存。系统稳定性高,应用崩溃不会影响透视和环境渲染,避免了眩晕。
  • 窗口管理需大幅改进
    • 窗口默认堆叠在正前方,需要手动逐一挪动才能访问后方窗口。
    • 没有“隐藏”或“最小化”应用的概念,关闭应用有时会导致其功能(如音乐播放)停止。
    • 当前管理方式容易变得混乱。

内容生态

  • 沉浸式内容匮乏:目前可获得的沉浸式视频数量很少,且时长很短。空间照片/视频体验出色,但总体内容有限。
  • 应用数量尚少:处于类似早期 iPhone 的应用生态初期阶段。
  • 开箱体验平淡:首次设置过程较为枯燥,缺乏像其他设备(如 PSVR/Quest)那样令人兴奋的引导体验。

分享与演示

  • 截图功能有缺陷:为提升帧率,设备会将用户注视区域以外的地方模糊处理,截图也会包含这种模糊,可能误导未使用过设备的人。
  • 内容版权限制截图:尝试截图受版权保护的内容(如电影)时,画面会变黑。
  • 客用模式不完善
    • “完全访问”模式会暴露机主隐私。
    • “仅限当前应用”模式设置繁琐,且访客摘下头显后会立即退出,每次都需要重新设置。
    • Mac 镜像演示功能虽好,但会黑掉受版权保护的视频内容,建议演示时使用预告片。

总结

作者认为 Vision Pro 是一个“完美的初代产品”。它展示了价值与愿景,但仍有些粗糙,存在许多可改进之处(包括硬件问题,如他的右扬声器过热)。他每天使用 1-2 小时,所有的反馈都指向“如果某方面能改进,设备会更有价值”,这是一个积极的信号。他对下一代产品充满期待。

23. Supervision: Reusable Computer Vision (github.com)

Supervision:可复用的计算机视觉工具包

Supervision 是一个核心的计算机视觉工具包,提供从数据加载到实时区域计数等一系列构建模块,使开发者能专注于围绕模型构建应用程序。

📦 安装

在 Python >= 3.9 环境中通过 pip 安装:

pip install supervision

也支持通过 conda、mamba 或从源码安装。

🔥 快速开始

1. 模型连接

Supervision 采用模型无关设计,可连接任何分类、检测或分割模型。它为多个流行库(如 Ultralytics、Transformers、MMDetection、Inference)提供了连接器,部分集成(如 rfdetr)已直接返回 sv.Detections 对象。

示例:使用 RFDETRSmall 模型

import supervision as sv
from PIL import Image
from rfdetr import RFDETRSmall

image = Image.open(...)
model = RFDETRSmall()
detections = model.predict(image, threshold=0.5)
# len(detections) -> 5

示例:使用 Roboflow Inference(需 API 密钥)

import supervision as sv
from PIL import Image
from inference import get_model

image = Image.open(...)
model = get_model(model_id="rfdetr-small", api_key="ROBOFLOW_API_KEY")
result = model.infer(image)[0]
detections = sv.Detections.from_inference(result)
# len(detections) -> 5

2. 注解器

提供一系列高度可定制的注解器,用于可视化检测结果。

import cv2
import supervision as sv

image = cv2.imread(...)
detections = sv.Detections(...)
box_annotator = sv.BoxAnnotator()
annotated_frame = box_annotator.annotate(scene=image.copy(), detections=detections)

3. 数据集工具

支持加载、分割、合并和保存多种格式(如 COCO、YOLO、Pascal VOC)的数据集。

加载数据集

# 从 YOLO、Pascal VOC 或 COCO 格式加载
dataset = sv.DetectionDataset.from_yolo(...)
dataset = sv.DetectionDataset.from_pascal_voc(...)
dataset = sv.DetectionDataset.from_coco(...)

数据集操作

  • 分割:将数据集划分为训练集、测试集和验证集。
    train_dataset, test_dataset = dataset.split(split_ratio=0.7)
    test_dataset, valid_dataset = test_dataset.split(split_ratio=0.5)
    
  • 合并:合并多个数据集及其类别。
    ds_merged = sv.DetectionDataset.merge([ds_1, ds_2])
    
  • 保存与格式转换:将数据集保存为指定格式,或在不同格式间转换。
    dataset.as_yolo(...)
    dataset.as_coco(...)
    sv.DetectionDataset.from_yolo(...).as_pascal_voc(...)
    

🎬 教程

项目提供了多个端到端教程,涵盖实际应用场景,例如:

  • 停留时间分析:使用计算机视觉分析等待时间,优化流程,涉及目标检测、跟踪和区域停留时间计算。
  • 车速估计与车辆跟踪:使用 YOLO、ByteTrack 和 Roboflow Inference 跟踪车辆并估计速度。

💜 社区展示

用户已使用 Supervision 构建了诸多应用,包括足球球员追踪、交通分析等。

📚 文档与贡献

  • 文档:提供详细文档以帮助快速、可靠地构建计算机视觉应用。
  • 贡献:欢迎社区参与贡献。
24. Gerbil Scheme – A Lisp for the 21st Century (cons.io)

Gerbil Scheme 特性概览

Gerbil Scheme 是一款为21世纪设计的现代Scheme语言实现。其主要特点如下:

  • 自举实现:由其自身编写。
  • 核心语言范式
    • 宏即编译器。
    • 原生支持Actor并发与分布式计算模型。
    • 集成Objective语言,支持基于类的面向对象编程与元对象协议,并提供运行时特化接口。
  • 系统级特性
    • 作为系统语言,内置微内核。
    • 集成外部函数接口(FFI)。
    • 配备优化的原生编译器,可生成静态二进制文件。
  • 标准与生态系统
    • 支持当前的RnRS标准及常见SRFI。
    • 拥有先进的宏和模块系统。
  • 设计哲学:完全对程序员开放,具有极高的透明度和可编程性。
26. Show HN: Auto-generate an OpenAPI spec by listening to localhost (github.com)

总结:OpenAPI AutoSpec 工具介绍

目的与核心功能 OpenAPI AutoSpec 是一个本地服务器代理,旨在通过监听本地网络流量,自动生成 OpenAPI 3.0 规范文档。它解决了快速获取 API 文档的需求,尤其适用于需要紧急文档或不想手动编写的场景。核心过程是:运行代理,将本地应用流量路由至该代理,代理则实时将观察到的 HTTP 请求与响应转换并记录为规范。

主要特性

  • 自动生成:为任意本地网站或应用自动生成 OpenAPI 3.0 规范。
  • 详细捕获:记录完整的请求/响应数据,包括头部、正文、查询参数等。
  • 实时预览与导出:在终端实时打印生成的规范,并支持将其下载或导出为 JSON 文件。
  • 智能过滤:自动忽略静态资源文件(如 .js, .css, .png)的 URL,专注于 API 端点。

安装与使用

  • 安装:需预先安装 Node.js (版本 ≥ 0.10),然后通过 npm 安装:npm install openapi-autospec
  • 基本用法:使用 npx autospec 命令启动代理,并指定参数。
    • --portTo:必需,指定目标本地服务运行的端口。
    • --portFrom:可选,指定代理自身监听的端口(当默认端口被占用时使用)。
    • --filePath:可选,指定生成的 OpenAPI 规范文件的输出路径。
  • 操作流程
    1. 启动代理并获取其提供的代理 URL。
    2. 将浏览器或客户端指向该代理 URL,访问你的本地应用,执行需要被文档化的操作(如填写表单、调用接口)。
    3. 代理自动将捕获的流量转化为 OpenAPI 规范,并在终端实时显示。
    4. 最后,导出或下载生成的规范文件。

适用场景与配置

  • 全栈框架(如 Django):将代理的 --portTo 指向应用运行的端口即可。
  • 前后端分离:需分别为前端和后端启动独立的代理实例。
  • 端口配置:文章提供了在 Express、Django、Flask、Rails、Spring Boot、ASP.NET Core、Laravel、Vue/React/Angular 等常见框架中更改应用监听端口的方法参考。

社区与未来计划

  • 社区支持:提供 Discord 社区用于交流。
  • 路线图:计划支持路径参数化、HTTPS、OpenAPI 3.1,并增加对云平台和容器化部署的支持。同时提供付费定制服务,用于构建 SDK、集成、文档等。

总结 OpenAPI AutoSpec 提供了一种轻量级、自动化的方式,通过代理监听本地流量来逆向工程生成 OpenAPI 规范,显著简化了 API 文档的初始创建过程。它适用于快速原型验证、遗留系统文档补充或作为开发过程中的文档辅助工具。

27. Debt-related driver’s license suspensions in Ohio (www.clevelandfed.org)

俄亥俄州债务相关驾照暂停及其对劳动力市场的影响

核心问题: 在俄亥俄州,超过60%的驾照暂停并非源于不良驾驶行为,而是由于驾驶员拖欠未偿还的债务。这类“债务相关暂停”(DRS)可能剥夺个人合法驾驶的资格,进而影响其通勤、就业和偿债能力,对州劳动力市场构成潜在风险。

DRS的规模与现状:

  • 平均每年有超过170万名俄亥俄州驾驶员持有总计超过320万项有效的DRS。
  • DRS在全州范围内存在,其中60%的案例发生在俄亥俄州主要中心城市以外。
  • 经济负担沉重:2016年至2020年间,DRS相关费用年均约1.5亿美元,但驾驶员年均仅支付约3300万美元,导致未付金额累积约9.22亿美元。
  • DRS在高贫困率和少数族裔社区中更为普遍。

对劳动力市场的潜在影响分析: 研究通过两个假设场景评估了DRS对劳动力规模的潜在冲击:

  1. 场景一(半数合规): 假设持有DRS的劳动力中有一半因无法驾驶而完全遵守暂停规定(无法通勤或求职),从而退出劳动力市场。这将导致俄亥俄州劳动力减少约83万人,劳动力参与率从61.6%降至52.7%。
  2. 场景二(全员合规): 假设所有持有DRS的劳动力均退出市场。这将导致劳动力减少约166万人,劳动力参与率大幅下降至43.7%,意味着仅约五分之二的适龄工作人口留在劳动力市场。

就业市场的关联证据:

  • 在俄亥俄州的在线招聘广告中,有14.0%明确要求应聘者持有有效驾照,高于全国平均水平(10.6%),且这一比例的增长速度快于全国。
  • 行业与地域差异: 要求驾照的职位比例从城市中心向外递增,在非都市地区最高。
  • 薪资影响: 中低薪职业中要求驾照的职位比例最高,表明驾照对这一群体的经济流动性至关重要,而DRS可能对此类岗位的招聘构成更大障碍。

数据来源与局限性: 分析数据来源于俄亥俄州汽车管理局(BMV)的公开记录、美国劳工统计局以及Lightcast的招聘广告数据。研究指出,由于缺乏关于DRS持有者具体就业状态、合规程度及替代通勤方式等微观数据,上述场景分析旨在说明潜在风险边界,而非精确预测。

结论: DRS对俄亥俄州的劳动力参与和经济活力存在实质性潜在威胁,其影响在地理分布、行业构成和薪资水平上存在显著差异,尤其可能限制中低收入者和少数族裔社区的就业机会与经济发展。

28. Maps that show time instead of space (spacetime-maps.vercel.app)

时空地图

“显示时间而非空间的地图” 这一概念挑战了传统地图仅表示地理空间的观念。它代表一种时空地图,其核心功能是将时间维度作为主要的可视化对象,而非传统的地理空间距离。这类地图旨在揭示事件、现象或物体在时间序列上的分布、演变和相互关系,为理解过程与变化提供了一种直观的时空综合视角。

29. Manipulating Chess-GPT's World Model (adamkarvonen.github.io)

操控Chess-GPT的世界模型

研究背景与动机

作者此前训练了一个Chess-GPT语言模型,通过预测PGN格式棋局中的下一个字符,使其学习到计算棋盘状态和估计棋手技能水平。先前已通过线性探针证明了内部表征的存在,但尚未验证这些表征与模型输出之间的因果关系。本研究旨在通过干预实验,建立内部状态(棋盘状态与技能水平)与模型行为之间的因果联系。

此外,研究发现当棋局以随机初始化的20步开始时,模型胜率从70%骤降至17%。这引发了模型是否仅学习表面模式而非深层理解的疑问。作者推测,这可能是由于模型将随机开局识别为低技能对局,因而预测低质量着法。

技能干预实验

方法

  • 干预机制:基于线性探针识别的高技能与低技能表征向量,通过向量加减法调整模型内部激活。
  • 执行方式:将“技能向量”(高技能向量减去低技能向量)添加到模型的残差流或层的偏置项中,以提升技能表现;反向操作则降低技能表现。
  • 扩展方法:对比激活法,通过平均高/低技能对局的激活差异生成技能向量。

实验结果

  • 标准开局下,正向干预略微提升胜率,反向干预导致胜率显著下降。
  • 随机开局下,正向干预效果显著:25M参数模型胜率从15.7%提升至31.3%,50M参数模型从16.7%提升至43.2%。
  • 这支持了假设:随机开局被模型视为低技能对局,干预通过提升内部技能表征恢复了部分性能。

棋盘状态干预实验

方法

  • 目标:编辑模型对棋盘状态的内部记忆,验证其是否输出符合修改后状态的合法着法。
  • 步骤
    1. 采样模型最可能的一步着法,确定相关棋子及其位置。
    2. 通过减去该棋子对应的探针向量,从模型内部表征中“擦除”该棋子。
    3. 比较修改前后模型输出着法的合法性。

实验结果

  • 修改棋盘后,经过干预的模型输出合法着法的比例从约40%提升至90%以上。
  • 干预是粗略的,可能影响其他棋子表征,但整体证明了模型内部表征与输出行为存在因果关联。

技术细节与优化

  • 干预向量缩放参数:过低则无效,过高导致模型输出随机字符。通过目标对数值等方法优化缩放系数。
  • 其他干预方法:如梯度下降、向量投影等,但简单向量减法效果最佳。

研究意义与局限

  • 意义
    1. 强化了“语言模型通过下一字符预测学习世界模型”的观点,证明模型具备深层理解而非仅记忆模式。
    2. 表明通过简单干预可定向操控模型行为,为可解释性研究提供支持。
  • 局限
    1. 干预效果部分恢复而非完全恢复,可能反映模型泛化能力限制或干预技术粗糙。
    2. 当前机器学习可解释性仍处于初级阶段,需更精确的方法(如稀疏自编码器)来深入理解模型内部机制。

附录补充

  • 干预细节:同时添加高技能向量并减去低技能向量可获得最佳效果;棋盘干预中仅减去相关棋子向量效果更优。
  • 代码与数据已开源,供进一步研究参考。
30. The ü/ü Conundrum (unravelweb.dev)

文章总结了作者在开发文件搜索功能时遇到的一个Unicode编码问题,以及相应的解决方案。

问题现象

作者在实现文件实体搜索和过滤功能后,用户无法正确搜索包含变音符号(如umlauts:Ä, ö, ü)的文件名。手动输入“blöb”搜索失败,但直接从已保存的文件名复制粘贴相同的“blöb”进行搜索却能成功。这表明文件在上传保存过程中,其文件名发生了某种细微但影响功能的编码转换。

根本原因

经调查发现,问题根源在于同一字符存在不同的Unicode编码形式。通过使用encodeURIComponent,作者发现字符“ü”在保存和搜索时采用了不同的编码序列:

  • NFC形式(组合字符):%C3%BC
  • NFD形式(分解字符):%CC%88

这是Unicode的NFD(规范化形式D,分解)和NFC(规范化形式C,组合)编码差异导致的。不同的操作系统默认使用不同的形式:

  • macOS 使用 NFD(例如 “ö” 为 o + ̈ 组合)。
  • Linux 使用 NFC(例如 “ö” 为单独的字符 ö)。

因此,文件上传后保存的文件名编码形式与用户搜索输入的编码形式不一致,导致搜索失败。

解决方案

为了解决这个问题,作者采取了以下措施:

  1. 统一编码形式:在文件上传后、保存为实体之前,对文件名字符串调用 .normalize() 方法。这确保所有文件名都转换为统一的、可搜索的编码形式。
  2. 数据迁移:编写迁移脚本,对数据库中所有已存在的、包含非ASCII字符的文件名进行规范化处理,使其编码形式保持一致。

作者特别指出,可以使用 .normalize("NFC").normalize("NFD") 来显式指定所需的规范化形式,以确保文件名在规范意义上等价。

核心启示

此案例表明,即使到了2024年,处理跨平台Unicode编码问题仍是Web开发中的一个实际挑战。简单的字符串规范化操作即可有效解决因不同系统使用不同默认编码形式而导致的数据不一致和功能异常问题。

31. "She's bouncing the ball" – the uncanny way octopuses play (lithub.com)

文章标题:“她在弹球”——章鱼玩耍的神奇方式

文章主要介绍了心理学教授珍妮弗·马瑟和海洋生物学家罗兰·安德森合作研究章鱼行为的过程,重点探讨章鱼是否存在“玩耍”行为及其科学意义。

马瑟和安德森分别在不同地点观察到章鱼表现出具有预见性和计划性的复杂行为。马瑟在百慕大观察到普通章鱼主动收集石头堵住洞穴入口以备威胁,显示其具备超前的规划能力。安德森在西雅图水族馆发现巨型太平洋章鱼系统地破坏过滤器,同样展现出目的性行为。

两人合作后,希望通过实验区分章鱼的探索行为与真正的玩耍。他们选择了八只亚成年巨型太平洋章鱼,使用四种不同颜色(黑白)和纹理(光滑粗糙)的塑料药瓶作为测试物体,进行了十次时长三十分钟的实验。

观察发现,所有章鱼都会接触并探索药瓶,但其中两只表现出明显不同的行为:一只章鱼用漏斗喷水将瓶子推向缸壁并使其返回;另一只章鱼则用水流驱动瓶子绕缸作环形运动。这种利用水流推动物体并使其返回的模式,与人类“弹球”的行为机制相似——并非为了移开物体,而是探索如何与物体互动。

章鱼使用漏斗喷水的行为此前已知用于移动、清洁或驱赶干扰,但从未被记录用于此类重复的物体互动游戏。这一发现具有重要意义:如果章鱼确实具有玩耍行为,意味着这种行为在约6.7亿年前分化的脊索动物和软体动物两个门中独立进化形成。

研究指出,章鱼的行为虽然看起来顽皮,但此前缺乏实证研究区分其探索性行为与真正的玩耍。马瑟和安德森通过控制变量的实验设计,首次为章鱼玩耍行为提供了经验证据,揭示了章鱼可能具备比之前认为的更复杂的认知能力和行为模式。