2024-03-10

21 篇热帖

1. Bruno: Fast and Git-friendly open-source API client (Postman alternative) (www.usebruno.com)

Bruno 是一款开源的 API 客户端,定位为 Postman 的替代方案。它倡导 Git 原生、本地优先、开发者优先 的理念。

核心定位与理念
Bruno 是一个真正的 API 客户端,而非一个臃肿的“平台”。它注重工具的可扩展性,旨在与开发者现有的技术栈(如 IDE、版本控制和自动化工具)无缝集成,而不是成为封闭系统。

主要特性

  1. Git 友好与协作:所有 API 集合均以文件夹和文本文件的形式存储在本地文件系统中。这意味着它们可以像代码一样被版本控制(尤其是 Git)管理,甚至可以与相关的代码仓库共同存放,从而提高了可发现性并建立了清晰的源真理。
  2. 安全与数据本地化:所有数据都保留在本地设备上。Bruno 不会将任何数据同步到云端,也没有用户登录或账户的概念,公司无法访问用户输入的数据,也不会用其训练 AI 模型。数据仅通过 Git 或其他文件传输方式被有意共享。
  3. 易于扩展与企业级控制:由于是本地应用并利用 Git 进行协作,现有的权限管理(如基于角色的访问控制、审计日志、密钥管理)会自动适用于 Bruno,无需额外配置。这使得扩展 API 项目时,安全开销不会增加。
  4. 开发者为中心:它回归了工具的本质,旨在提升开发者的效率,被那些重视开发者效能、安全性和清晰价值的团队和组织所选用。

总结
Bruno 是一款通过本地文件存储和 Git 集成来管理 API 请求的工具,它强调数据所有权、安全无缝的团队协作以及与开发生态的深度整合,为开发者提供了一个轻量、透明且强大的 Postman 替代选择。

2. Tenstorrent unveils Grayskull, its RISC-V answer to GPUs (www.techradar.com)

Tenstorrent公司,由芯片架构师Jim Keller领导,推出了其首款硬件产品Grayskull。这是一种基于RISC-V架构、旨在替代GPU的方案,专注于AI推理,并声称在运行时稀疏性和条件计算方面表现优异。

产品发布与硬件规格

Grayskull处理器基于Tensix核心网格构建,并内置网络通信硬件,使核心间可直接通信,无需依赖DRAM。公司同步推出了两款基于Grayskull的开发套件:

  • Grayskull e75:低矮、半长PCIe Gen 4板卡,搭载单颗Grayskull处理器,功耗75W。
  • Grayskull e150:标准高度、3/4长度PCIe Gen 4板卡,搭载单颗Grayskull处理器,功耗可达200W,注重性能与吞吐量平衡。

软件与模型支持

开发套件配备两款软件:TT-Buda用于快速运行现有模型;TT-Metalium供用户自定义或编写新模型。它们支持多种AI模型,包括用于自然语言处理的BERT、图像识别的ResNet、语音识别与翻译的Whisper、实时物体检测的YOLOv5以及图像分割的U-Net。

合作与定价

Tenstorrent宣布与日本前沿半导体技术中心合作,将其RISC-V和小芯片IP用于构建先进的2nm AI加速器,以提升日本AI性能。两款开发套件已开放购买,e75售价599美元,e150售价799美元。

3. Bypassing Safari 17's advanced audio fingerprinting protection (fingerprint.com)

绕过Safari 17高级音频指纹保护

音频指纹技术利用浏览器的Audio API生成一个不可听的音频信号,并将信号的所有样本相加得到一个稳定但非唯一的数值,用于识别用户。Safari 17引入了高级指纹保护机制,在隐私模式(默认开启)和普通模式下,对音频信号样本添加随机噪声,导致每次计算的指纹值都不同,从而破坏了其稳定性。

研究者发现可以通过改进算法来绕过此保护,核心目标是消除Safari添加的噪声并保持指纹的稳定性与唯一性。改进分为三个步骤:

  1. 减少噪声分散:通过多次生成同一音频样本的带噪副本,利用均匀噪声的特性,计算样本的均值来近似原始值。关键在于优化算法,从原本需要数十万个样本(计算密集)转变为仅需生成一个音频样本并循环使用,大幅提升了效率。例如,生成1000个副本在M1 MacBook上仅需约4毫秒。

  2. 扩大不同浏览器间的指纹差异:通过设计一个由“方波振荡器”、“动态压缩器”和“全通滤波器”组成的特定音频信号生成链路,可以显著放大不同浏览器环境(如不同设备、浏览器)产生的音频样本值之间的差异。这使得在后续步骤中,可以用更粗糙的舍入操作来区分不同浏览器,同时更好地容忍噪声。

  3. 舍入以稳定结果:对经过降噪处理的样本值进行舍入,以移除残余的不稳定波动。舍入时采用“有效数字”的概念,而非小数位数。研究确定保留7位有效数字(最后一位舍入到最近的5或0的倍数)是性能与唯一性之间的良好平衡点。这确保了即使在Safari 17的隐私模式下,最终得到的音频指纹值也是稳定的。

性能与实现:新算法在计算时间上比旧方法增加约1.5-2倍,但在各种设备上(包括低端设备)仍能在数十毫秒内完成,且主要计算在离线音频线程中进行,不影响页面响应性。该算法已被集成到开源库FingerprintJS 4.2.0版本中,替换了旧的音频指纹方案。

与其他隐私浏览器的对比:Tor浏览器禁用了Web API,因此无法进行音频指纹识别。Brave浏览器也添加噪声,但采用不同的机制(对所有样本乘以相同的随机因子),因此文中描述的基于统计均值的方法不适用,但可采用其他此前已介绍的专门方法进行处理。

4. How the Devteam Conquered the iPhone (fabiensanglard.net)

iPhone Dev Team 如何征服 iPhone(2007年)

本文回顾了2007年夏季,iPhone Dev Team 如何通过纯粹的软件方式,成功破解第一代 iPhone,使其能够摆脱 AT&T 网络限制,在任何运营商上使用的历史过程。

背景与目标

2007年6月29日,苹果发布初代 iPhone。由于该设备最初仅限美国 AT&T 服务,且在许多国家(如加拿大)迟迟未上市,一个自称 "iPhone Dev Team" 的技术团队聚集在一起,目标是通过软件破解,让 iPhone 能在任何 GSM 运营商的网络上工作。他们通过博客(iphone.fiveforty.net)实时公布进展。

团队设定了六个明确的里程碑来达成最终目标。

六大破解里程碑

1. 破解固件密码 (Decrypt Firmware)

  • 目的:获得对 iOS 系统文件的只读访问权限,以便分析。
  • 过程:恢复包(.ipsw)是 ZIP 格式,内含两个 DMG 镜像。其中一个是未加密的 ramdisk(用于恢复模式),另一个是加密的、包含完整 iOS 文件系统的主系统镜像。
  • 突破:团队从 ramdisk 中的 /usr/sbin/asr 文件里提取到了主系统 DMG 的解密密钥(非密码),并自行编写了解密工具,从而成功挂载并访问了整个 iOS 文件系统。

2. 绕过激活 (Bypass Activation)

  • 目的:让新手机脱离“需要连接 iTunes 并通过 AT&T 激活”的砖头状态,进入可用界面。
  • 原理:激活过程中,设备会将自身标识符发送至苹果服务器获取签名令牌。锁屏守护进程 lockdownd 验证此令牌。
  • 突破:开发者 dvdjon 发现可以重放一个合法的签名令牌(来自他自己的手机)。Dev Team 开发了工具,将预存的合法签名令牌直接发送给设备,绕过了服务器验证,成功激活设备。

3. 获取写入权限 (Get Write Access / 越狱)

  • 目的:对系统分区进行写操作,从而能修改系统文件。
  • 挑战:系统分区默认以只读模式挂载,且文件传输服务 acfd 被限制在特定目录。
  • 突破:利用恢复模式。将修改过的 ramdisk 内核加载到设备内存中运行,因为此模式下内核签名验证可能被绕过或放宽。通过此模式获得高级权限后,修改系统分区的挂载表(fstab)和 Lockdown 服务配置,使系统分区变为可读写,并创建了一个可访问根目录的文件传输服务。重启后,设备即被越狱,获得完全的文件系统读写权限。

4. 获得可用工具链 (Get Working Toolchain)

  • 目的:能在 iPhone(ARM 架构)上编译和运行自定义的可执行程序。
  • 突破:团队成员 "Nightwatch" 等人完成了针对 ARM 的二进制工具链(binutils),并成功编译并运行了第一个“Hello World”程序。这为后续开发独立应用奠定了基础。

5. 启用第三方应用 (Enable Third-party Applications)

  • 目的:自动化上述破解步骤,让用户能轻松安装和运行非苹果官方应用。
  • 突破:基于获得的工具链和写入权限,团队创建了早期的第三方应用运行环境和分发方式。

6. 解锁基带 (Unlock Phone)

  • 目的:解除 iPhone 基带(modem)对 AT&T 网络的锁定,允许使用其他 SIM 卡。
  • 核心挑战:基带是独立系统,有自身的固件和信任链。解锁需要输入一个唯一的 NCK(网络控制密钥),且输入错误次数有限,强行破解不现实。
  • 突破:团队开发了 anySIM 应用。其原理是:
    1. 在运行时从设备中导出基带固件
    2. 在内存中直接修改(打补丁) 基带固件,将验证 NCK 的指令修改为接受任何输入。
    3. 利用一个偏移写入的巧妙技巧将修改后的固件写回闪存:先写入垃圾数据到起始地址前 0x400 字节处,再将修改后的完整固件写入正确位置。当基带固件完整性校验失败时,只会丢弃最初写入的垃圾数据,而已经正确写入的、被修改过的固件得以保留
    4. 最后发送标准的解锁 AT 命令,因固件已被修改,任何 NCK 都能成功解锁。

总结

iPhone Dev Team 通过逻辑清晰、循序渐进的六个技术步骤,在不到三个月的时间内(2007年夏),完全通过软件破解了第一代 iPhone 的限制。他们的工作不仅使 iPhone 能在非授权网络使用,也开启了 iPhone 越狱和第三方应用生态的先河,引发了与苹果公司之间持续至今的“猫鼠游戏”。本文通过分析其技术里程碑,重现了这一移动设备破解史上的经典案例。

5. S3 is files, but not a filesystem (calpaterson.com)

本文探讨了Amazon S3的本质,指出尽管常被用作云存储,但它并非真正的文件系统。作者通过对比Unix文件API与S3 API,阐述了两者的关键区别,并分析了S3的优势与局限。

S3与文件系统的区别 S3常被视作“云文件系统”,但这是一种有用的虚构。Unix文件API通过openreadwriteseekclose五个基本函数,封装了缓冲、缓存、权限等复杂性,是一个深模块——接口简单,内部处理复杂。S3则不同,其核心API主要是GetObject(读取)和PutObject(写入),接口更简单。但关键区别在于:S3不支持部分覆写。写入必须覆盖整个对象,而数据库等软件依赖于文件页的局部覆写,因此无法直接移植到S3上。

S3的优势与局限

  • 优势:读写带宽极高,易于维护(无需管理备份、复制、扩容等)。
  • 局限
    1. 不支持局部覆写,导致数据库类应用效率极低或不可行。
    2. 没有真正的重命名/移动操作(需复制后删除,耗时)。
    3. 列出文件(列出键)的速度比本地文件系统慢。
    4. API基于XML且未提供本地测试环境。

深模块的重要性 S3虽然是“深模块”,但其复杂性被API抽象所掩盖。这在跨组织协作中尤为重要,因为它降低了交互成本。作为反例,SAP这样的“浅模块”系统需要整个组织深入理解,导致集成项目复杂且易失败。S3的成功部分归因于它有效地隐藏了其底层复杂性。

结论 S3是强大的对象存储服务,适用于存储和读取大文件,但绝非通用文件系统的替代品。其设计选择(如不支持局部覆写)决定了它不适合需要精细随机写入的场景。将S3简单地视为文件系统会导致对存储需求的根本性误判。

6. Yi: Open Foundation Models by 01.AI (arxiv.org)

Yi模型家族概述

Yi模型家族是由01.AI开发的一系列语言和多模态模型,基于6B和34B参数预训练语言模型,并扩展出多种变体,包括聊天模型、200K长上下文模型、深度升级模型和视觉语言模型。

关键特性与性能

  • 基础性能:预训练模型在多个基准测试(如MMLU)上表现出色,微调后的聊天模型在评估平台(如AlpacaEval和Chatbot Arena)上获得高人类偏好率。
  • 数据质量:模型性能主要归因于数据工程努力,通过高质量数据优化实现。
  • 预训练数据:构建了3.1万亿token的英语和中文语料,采用级联数据去重和质量过滤管道。
  • 微调数据:使用一个小规模(少于10K实例)指令数据集,经过多次迭代精炼,每个实例由机器学习工程师直接验证。
  • 视觉语言模型:将聊天语言模型与视觉变换器编码器结合,训练对齐视觉表示到语言模型的语义空间。

扩展与优化

  • 长上下文:通过轻量级持续预训练将上下文长度扩展至200K,在needle-in-a-haystack检索任务中表现强劲。
  • 深度扩展:通过持续预训练扩展预训练检查点的深度,进一步提升模型性能。
  • 未来方向:基于当前结果,继续使用彻底优化的数据扩展模型参数,有望产生更强大的前沿模型。

模型结构与开发基础

Yi模型基于可扩展的超级计算基础设施和经典Transformer架构,强调数据驱动的方法,确保模型在语言理解、多模态对齐和长上下文处理方面的综合能力。

7. Show HN: LlamaGym – fine-tune LLM agents with online reinforcement learning (github.com)

文章标题:Show HN: LlamaGym – 使用在线强化学习微调 LLM 代理

项目核心: LlamaGym 是一个开源项目,旨在简化使用在线强化学习(RL)微调基于大语言模型(LLM)的代理。其核心是提供一个抽象的 Agent 类,封装了在 Gym 环境中使用 LLM 进行 RL 训练的复杂流程,让开发者能够快速进行实验和迭代。

背景与动机:

  1. “代理”概念源流:强化学习中的代理通过与环境互动和接收奖励信号来学习,但当前的 LLM 代理大多不具备这种在线实时学习能力。
  2. 现有痛点:虽然 OpenAI 创建了 Gym 来标准化 RL 环境,但直接将 LLM 代理放入 Gym 环境训练,仍需处理大量底层代码,如对话上下文管理、episode 批次处理、奖励分配、PPO 算法设置等。

解决方案与功能: LlamaGym 通过一个统一的 Agent 类来解决上述复杂性。用户只需实现三个抽象方法,即可在任意 Gym 环境中快速进行 LLM 代理的 RL 微调:

  1. get_system_prompt():定义代理的系统提示。
  2. format_observation():将环境观察转换为文本格式。
  3. extract_action():从 LLM 的文本回复中解析出具体动作。

典型工作流程(以玩21点游戏为例):

  1. 定义代理:继承 Agent 类,实现三个抽象方法。
  2. 初始化模型:加载基础 LLM 模型(如 Llama-2-7b)并实例化代理。
  3. 编写 RL 循环:创建 Gym 环境,在循环中依次调用代理的 act(根据观察行动)、assign_reward(提供奖励)和 terminate_episode(当批次满时触发训练)方法。

重要提示与限制:

  • 收敛难度:在线 RL 的收敛向来困难,需要仔细调整超参数才能看到效果提升。
  • 前置步骤建议:在运行 RL 之前,对采样轨迹进行监督微调(SFT)可能有助于模型表现。
  • 设计理念:项目以简化为首要目标,因此在计算效率上可能不如某些专用框架(如 Lamorel),但更易于上手实验。
  • 项目状态:目前是一个处于开发中的周末项目,欢迎社区贡献。

相关工作: 文章提及了多项相关研究,包括使用在线 RL 为 LLM 提供基础、面向 RL 的语言模型框架,以及通过 RL 使 LLM 与具身环境对齐。

项目引用与链接: 提供了项目的 GitHub 链接和 BibTeX 引用格式。

8. Show HN: React Geiger – performance profiling using sound (github.com)

React Geiger:通过声音进行性能分析

React Geiger 是一个用于将 React 性能问题“声音化”的工具。它可以在后台运行,当组件发生不必要的、耗时的重新渲染时,会发出轻微的点击声,从而将你的注意力引向性能问题。

主要功能

  • 声音反馈:当包裹的组件重新渲染时间超过设定的阈值时,会发出点击声。
  • 实时监控:可在开发过程中作为后台工具使用。
  • 可配置:提供多个选项以定制监控范围和行为。

基本使用

使用时,将你想要监控的组件树包裹在 <Geiger> 组件内。

最简单的配置是包裹整个应用:

<Geiger>
  <App />
</Geiger>

你也可以选择性地包裹应用中的子树进行更精细的监控。

配置选项

<Geiger> 组件接受以下配置属性:

  1. profilerId?: string

    • 传递给内部 React.Profiler 组件的 ID。通常无需修改。
  2. renderTimeThreshold?: number

    • 触发声响的渲染时间阈值(毫秒)。默认值为 50ms
    • 设置为 0 可以对任何重新渲染都触发声响。
  3. phaseOption?: PhaseOption

    • 指定监控的渲染阶段。
    • 可选值:'mount'(仅挂载)、'update'(仅更新)或 'both'(两者皆监控,为默认值)。
  4. customSoundFile?: string

    • 自定义声音文件的路径。若不设置,则使用默认的点击声。
  5. enabled?: boolean

    • 启用或禁用工具。默认值为 true
    • 注意:该工具依赖 React.Profiler,而在生产环境构建中,React.Profiler 默认是被禁用的。
9. I'm Betting on Call-by-Push-Value (thunderseethe.dev)

Call-by-Push-Value 总结

核心问题:求值策略的权衡

编程语言中存在两种经典的函数参数求值策略:

  • Call-by-Value(CBV,按值调用):在调用函数前,先求值参数(例如 Rust、Java、Python 等语言)。
  • Call-by-Name/Need(CBN,按需调用):将参数未求值的形式传递给函数,在函数体内需要时才求值(例如 Haskell)。

两者各有利弊,但语言设计通常只能选择其一,导致实践中常需引入变通机制(如 CBV 语言中引入闭包、迭代器等惰性特性;Haskell 也通过扩展支持严格求值)。

解决方案:Call-by-Push-Value(CBPV)

CBPV 是 Paul Levy 在 1999 年提出的第三种求值策略,旨在统一 CBV 与 CBN 的优势。其核心思想是显式区分值(Value)与计算(Computation)

  • :表示已求值的结果(如整数、变量、Thunk)。
  • 计算:表示待执行的操作(如函数、应用、Return)。

通过这种区分,CBPV 避免了传统语言中“值与计算混合”导致的被迫二选一问题,允许在同一系统中同时支持急切求值和惰性求值。

关键机制

  1. Thunk 与 Return

    • Thunk:将计算包装成值,使其可作为参数传递。
    • Return:将值提升为计算,使其可作为函数结果返回。
    • 例如,返回闭包需通过 Return (Thunk (Fun ...)) 显式处理。
  2. 类型系统

    • 值类型(如 IntThunk CompType)和计算类型(如 Fun ValType CompTypeReturn ValType)分开定义,确保求值顺序明确。
  3. 优势

    • 优化潜力:编译器可基于值/计算的显式区分进行更高效的代码生成(例如,直接根据函数定义确定参数数量,无需运行时判断闭包)。
    • 支持高级特性:为代数效果、隐式高阶类型推断、调用约定优化等提供基础。

实际应用案例

  1. 代数效果:CBPV 明确了计算可产生副作用而值不能,使效果追踪更清晰。
  2. 隐式极化系统 F:通过 CBPV 区分函数调用与闭包,改进高阶泛型类型的推断能力。
  3. 类型作为调用约定:利用 CBPV 中函数的明确性信息(如参数数量、求值方式),在类型层面编码调用约定,提升高阶函数的机器码效率。

结论

CBPV 通过强制显式化“值与计算”的边界,不仅优化了程序的执行效率,还扩展了类型系统和语言特性设计的可能性。尽管目前应用尚处早期,但其理论统一性和实践优势使其成为未来语言设计的重要方向。

10. Using LLMs to Generate Fuzzers (verse.systems)

使用大型语言模型生成模糊测试器

大型语言模型在众多任务中表现出色,其应用案例层出不穷,Brendan Dolan-Gavitt 使用 Claude 为 GIF 解析代码生成模糊测试器就是一个突出例子。他提供 GIF 解析器的 C 代码,让 Claude 生成用于模糊测试的 Python 实现。生成的模糊测试器成功发现了多个漏洞,该方法在 VRML 文件格式上也得到了验证。

为何此方法可能有效

作者认为 LLM 不擅长对代码进行精确的静态分析,因为它们本质是统计机器,生成的是最可能的输出,缺乏精确性。然而,模糊测试本质上是随机的过程,旨在生成“足够接近”有效但会引发程序异常行为的输入。LLM 生成“接近”目标的能力可能使其更适合生成模糊测试器。

测试未知输入格式

为了测试 LLM 处理未知格式的能力,作者设计了一个虚构的、受 CRC32 校验保护的算术栈机输入格式,并在解析器和解释器代码中故意植入了五个漏洞:

  1. 解析代码中的越界 memcpy(类似 Heartbleed)
  2. DIVIDE 指令的未检查除零错误
  3. 栈操作数有符号溢出
  4. READ 指令因未检查偏移导致的越界读取
  5. WRITE 指令的越界写入

他将相关 C 代码提供给 Claude,要求其生成 Python 模糊测试器。Claude 生成了一个基本可用的模糊测试器,但存在一个需修复的类型错误。

实验结果与分析

运行 Claude 生成的模糊测试器配合 Address Sanitizer,结果仅触发了越界读取和写入漏洞,未能触发其他三个漏洞。

原因在于模糊测试器的实现逻辑:

  • 数据部分完全随机生成,而有效指令被错误地放在“填充”部分,导致有效格式的输入被噪音淹没。
  • 总是正确报告数据包长度,因此无法触发依赖错误长度字段的解析漏洞。
  • 即使调整逻辑,由于越界读写极易触发,其他漏洞仍难以被触发。

与静态分析的对比

作者也尝试直接让 Claude 进行静态分析(即直接寻找代码漏洞)。Claude 找到了五个漏洞中的三个,并报告了一个可能的误报(未初始化栈)。这表明:

  • 模糊测试:不会产生误报,但可能漏报。
  • LLM 静态分析:可能发现更多问题,但存在误报风险。

未来方向与结论

实验表明,LLM 在生成“足够接近”的模糊测试器以发现漏洞方面具有一定能力,但存在局限性。一个有前景的结合方法是:

  1. 让 LLM 进行静态分析以识别潜在漏洞。
  2. 针对每个识别出的漏洞,让 LLM 生成一个定向模糊测试器来专门触发它。

DARPA 的 AIxCC 竞赛也显示出对利用 LLM 进行漏洞发现的高度兴趣。总体而言,LLM 生成模糊测试器的方法既令人惊喜,也暴露了不足,但值得进一步探索,特别是将其与静态分析相结合的定向模糊测试生成策略。

11. Two scammers, a web of betrayal, and Europe's fraud of the century (magazine.atavist.com)

本文详细讲述了两名骗子如何利用欧盟碳排放交易体系实施堪称“欧洲世纪诈骗案”的增值税欺诈,涉案金额高达数十亿欧元。

主要人物与背景

  • 古斯塔夫·达芙妮:一名法国骗子,奢侈浮夸,曾因多项欺诈罪入狱。他在狱中关注气候变化政策时,发现了碳排放交易市场可被利用的漏洞。
  • 格雷戈里·扎维:自称“大脑”,性格内敛分析型,早年从事手机增值税欺诈。他通过狱友了解到绿色商机,并最先意识到碳排放配额交易中可实施增值税欺诈。

诈骗核心手法: 两人利用欧盟碳排放交易系统的漏洞。该系统允许企业交易碳排放配额,且交易需缴纳增值税。他们建立空壳公司网络,通过“旋转木马”式欺诈:从欧盟外免税进口配额,在法国境内含税销售并申请增值税退税,随即关闭公司消失。由于配额仅为计算机中的数字,交易瞬间完成,欺诈极易操作。

合作、背叛与竞争: 扎维最初构思了欺诈计划,并与凯文·埃尔·加祖阿尼合作建立公司。但加祖阿尼后来背叛扎维,将控制权转给了达芙妮。达芙妮在狱中时已通过加祖阿尼开始布局。扎维不知情下曾为达芙妮的公司工作,发现真相后与达芙妮对峙。两人虽在同一诈骗网络,却互不信任,关系错综复杂。

诈骗规模与后果

  • 巨额损失:仅法国就因此损失约16亿欧元,整个欧洲损失估计达50至100亿欧元。涉案公司如“暮光”的交易量堪比大型银行。
  • 市场崩溃:欺诈曝光后,法国暂停碳交易并修改税制,碳交易市场一度崩溃。欧洲刑警组织指出,在某些国家,高达90%的市场交易量涉及欺诈。
  • 法律制裁:法国警方展开调查。扎维、达芙妮、加祖阿尼等人被捕或起诉。达芙妮被判监禁后潜逃至以色列,至今未被引渡;扎维被判刑并罚款;加祖阿尼亦被定罪。许多同案犯逃往国外,资金难以追回。

结局与反思: 达芙妮称诈骗已成过去,现居以色列过着奢侈但低调的生活,偶尔仍遭枪击等威胁。扎维出狱后生活落魄,众叛亲离。两人均认为碳市场本身设计脆弱,欺诈虽对其造成伤害,却也扭曲地提高了市场活跃度。此案暴露了全球碳交易体系早期的重大监管缺陷。

14. The No Symbol: The History of the Red Circle-Slash (tedium.co)

红色禁止符号的历史与演变

红色圆圈斜线(⛔)是全球最广泛使用的视觉符号之一,代表“禁止”或“不允许”。尽管其含义明确、应用普遍,但该符号本身缺乏统一名称,相关历史与标准化过程也鲜为人知。

起源与标准化

该符号并非起源于美国,而是欧洲为解决多语言交通标志问题而设计。1931年,国际联盟在日内瓦召开会议,旨在统一交通标志系统。会议决定采用简单图形代码:三角形表示危险,圆形表示信息。针对“禁止等待”和“禁止停车”标志,委员会最终妥协,采用了对角线红色斜线穿过圆形的设计。这一符号随后在欧洲广泛推广。

相比之下,美国交通标志长期依赖文字说明,对非英语使用者造成不便。直到20世纪70年代初,美国才逐步引入国际通用符号。

名称与认知

该符号没有广泛接受的标准名称,常被称为“通用禁止标志”、“禁止符号”或“圆圈斜线”。研究表明,类似“无烟”、“出口”等符号易被理解,但部分符号含义易被误解或难以描述。这种命名的模糊性反映了视觉语言在沟通中的优势与局限。

流行文化中的应用

红色圆圈斜线在流行文化中频繁出现,例如摇滚乐队“Bad Religion”将该符号与十字架结合,作为反对宗教的象征。最著名的应用之一是1984年电影《捉鬼敢死队》的标志——一个红色圆圈斜线内嵌幽灵图案。尽管该标志广为人知,但其实并不符合国际标准(ISO 3864):其斜线方向通常从右到左,且角度并非标准的45度。后期设计已逐步调整,更接近标准规范。

标准化与普及

1984年,国际标准化组织(ISO)将通用禁止标志纳入ISO 3864安全标准,使其从道路标识扩展至更广泛的应用场景。同年,《捉鬼敢死队》的上映进一步推动了该符号在流行文化中的普及。1990年,“禁止吸烟”符号成为美国国内航班的固定标志,进一步强化了该符号的禁止含义。

数字时代的挑战

该符号的泛滥性使其在数字检索中面临挑战:因其应用过于广泛,相关历史资料反而难以挖掘。这也揭示了视觉语言在信息检索中的一个悖论——极度常见的符号可能因其普遍性而掩盖其起源与发展轨迹。

该符号的成功体现了设计标准化与跨文化理解的结合,尽管其历史仍不完整,但已成为全球视觉语言中不可或缺的一部分。

16. Japanese Handsaws: The Maebiki Ooga (covingtonandsons.com)

日本前引大锯(Maebiki Oga)

概述

前引大锯(Maebiki Oga)是一种大型日式纵切锯,专用于将原木锯切成板材和方材。其名称直译为“前拉大锯”,反映了其操作方式。该锯设计为单人使用,但通常需要双手操作,与传统双人框锯相比更便于携带和控制。

结构与设计

  • 锯片特点:锯片宽厚、刚性较强,有助于实现更直、更省力的锯路。
  • 手柄:手柄粗大(直径约7-8厘米,长15-20厘米),常用软质桐木制成,以缓冲手掌压力并防滑。
  • 双金属结构:刀刃边缘采用硬化高碳玉钢,其余部分为未硬化的低碳铁。这种构造在历史上为节省钢材而设计,兼具耐用性与经济性。
  • 柄部设计:部分型号采用弯曲柄,便于在不同位置拉锯操作(如从上方或下方拉锯)。

优点

  1. 便携性:无需笨重框架,比双人框锯更易运输。
  2. 单人操作:可由一名工匠独立使用。
  3. 锯路精度:宽锯片提升稳定性,减少锯路偏差。
  4. 材料经济:双金属结构减少高价钢材的使用量。

历史背景

该锯盛行于日本江户时代(1603-1867),常见于木工和伐木作业。北斋的版画《富岳三十六景》中描绘了锯工使用此锯的场景,展现其实际应用。

使用与现状

  • 劳动强度:手动操作需耗费大量体力,效率低于机械锯。
  • 作者经历:作者收藏两把江户中期的前引大锯,经专业打磨后曾尝试使用,但因费力而终止,现将其悬挂于工作室门上作为收藏品。
  • 文化意义:该锯被视为具有强烈视觉张力和历史价值的工具,象征传统手工技艺的强度与专注。

相关工具

文章提及日本手锯家族的其他类型,如精密纵切锯(Hozohiki)、精密横切锯(Dozuki)等,共同构成日式木工工具体系。

(注:摘要已省略原文中无关的引用、个人轶事及联系方式,聚焦于工具本身的技术描述与历史背景。)

17. What Monks Know about Focus (www.millersbookreview.com)

Richard Hanania在文章“The Case Against (Most) Books”中主张,大多数书籍是浪费时间,只有历史书籍和当代思想领袖的作品可能具有价值,并将经典书籍称为垃圾。作者Joel J. Miller已针对此论点进行了回应,并邀请读者通过免费或付费订阅继续阅读其讨论。

18. Profession by Isaac Asimov (1957) (www.abelard.org)

小说《职业》描绘了一个将人生严格划分为几个关键阶段的未来地球社会:8岁的“阅读日”、18岁的“教育日”和决定职业的“奥林匹克”。故事聚焦于男孩乔治·普莱顿的经历。

在8岁的“阅读日”,乔治与同龄孩子被带入一个大厅,接受一种技术程序,通过头部佩戴的设备,瞬间学会了阅读。整个过程迅速且无痛,他随后能流畅朗读,父母欣喜若狂。然而,故事的核心发生在十年后,18岁的乔治面临“教育日”。

乔治的父亲是地球上的管道工,他毕生希望儿子能逃离地球,前往外星球生活,因为只有少数人能获得这样的机会。在“教育日”,乔治被告知,他根据早年的评估(包括“阅读日”的数据),已被系统判定为适合“技术人员”这一职业类别。乔治对此感到震惊和失望,因为他渴望成为程序员或在星际间活动的商人,而非技术工人。这个决定似乎无法更改,让他的外星梦破灭。

一个关键的转折点是,乔治在“教育日”的检查中,被指出其实早在“阅读日”之前就已经具备了阅读能力,这意味着“阅读日”的技术并非植入新知识,而可能是激活或验证了已有的能力。然而,社会系统依然根据既定的评估路径分配了他的职业。

小说通过乔治的遭遇,批判了一个僵化的社会分工体系:个体的天赋、愿望和成长被预先的数据和技术程序所定义和限制,剥夺了个人的选择权与发展的可能性。乔治的挫败感,正是对这种非人化社会机器的控诉。

19. Reverse Engineering Protobuf Definitions from Compiled Binaries (arkadiyt.com)

文章概要:反向工程编译二进制文件中的 Protobuf 定义

本文介绍了 protodump 工具的工作原理,该工具用于从已编译的二进制文件中提取完整的 Protobuf 源定义。

核心机制: Protobuf 的 protoc 编译器在生成代码时,会将完整的 .proto 文件定义(以 FileDescriptor 对象的形式)编码为字节码并嵌入生成的代码中,以支持运行时反射功能。这个字节码本身是使用 Protobuf 线格式编码的。

工具工作流程:

  1. 定位:在二进制文件中扫描 ASCII 字符串 ".proto"。因为 FileDescriptor 对象通常包含一个存储文件名的字段,所以找到该字符串意味着找到了一个 FileDescriptor 对象的潜在位置。
  2. 解析与对齐:理解 Protobuf 的线格式(特别是 varint 和 Tag-Length-Value 结构)是关键。找到 ".proto" 字符串后,工具会向前回溯,以定位到整个 FileDescriptor 字节数组的正确起始位置(例如,回到 0x0a 标签字节处)。
  3. 提取与解码:从确定的起始位置开始,持续读取符合 Protobuf 有效编码的字节序列,然后尝试将这些字节解码(反序列化)为 FileDescriptor 对象。
  4. 转换输出:最后,将解码得到的 FileDescriptor 对象转换回人类可读的 .proto 源文件格式并输出。文章提到作者自行实现了此转换逻辑。

已知局限:

  • 编译器特定:该方法完全依赖于 protoc 编译器的实现,对使用其他 Protobuf 编译器的二进制文件无效。
  • 可被规避
    • 开发者可以使用非 .proto 的扩展名命名文件。
    • 对嵌入的 FileDescriptor 进行混淆处理。
    • 利用编译器选项完全禁止嵌入 FileDescriptor(会失去运行时反射能力)。
    • Protobuf 线格式不保证字段顺序,移动文件名字段位置会破坏扫描逻辑。

结论: 尽管存在上述限制,作者在实践中发现,绝大多数(约99%)使用 protoc 编译且未进行混淆的二进制文件,其所有 Protobuf 定义都能被成功完整提取。

21. Bell Labs: An Institute of Creative Technology (2015) (sts10.github.io)

贝尔实验室:创意科技研究所

本文基于对《创意工厂:贝尔实验室与美国创新的伟大时代》一书的评述,总结了贝尔实验室在20世纪20年代至80年代间的创新历程、核心机制与关键启示。

主要成就

贝尔实验室的发明与发现成果卓著,堪称史上之最。其发明不仅包括晶体管、首颗卫星、蜂窝技术等实物,也涵盖信息理论、Unix操作系统、C语言等无形贡献。共有八项诺贝尔奖授予了在此完成的研究工作。

创新过程与机制

实验室的创新并非偶然,其成功源于一套精心设计的管理体系和过程:

  1. 领导与环境设计:长期主管默文·凯利等人通过设计物理空间(如迫使不同领域研究人员路过彼此办公室)来强制促进跨学科交流。
  2. 开放文化:实行平等主义的开门政策,即使是年轻员工也能直接向顶尖科学家请教。
  3. 核心原则:研究者约翰·皮尔斯总结了几条关键原则:
    • 管理层直至最高层都具备技术胜任力
    • 研究人员无需自行筹措资金
    • 研究课题可以获得长期支持
    • 项目可以终止,但不会因此否定研究者个人
  4. 基础研究支持:得益于其垄断地位和与国防体系的关联,AT&T能够资助大量**“基础研究”——即寻求根本知识而无直接应用目的的研究。这体现了对“闲散好奇心”** 的推崇。

关键人物

实验室的成功离不开一批富有特质的研究者:

  • 克劳德·香农:作为书中核心人物之一,他于1948年发表了《通信的数学理论》,基本创立并证明了信息论,将信息量化与熵概念引入该领域。
  • “煽动者”与提问者:如约翰·皮尔斯和哈里·奈奎斯特。他们未必直接给出答案,但善于提出好问题引导他人思考,从而激发创新。

核心启示

从贝尔实验室的历史中可以提炼出一个重要的个人层面教训: 专注于寻找“好问题”,而非仅仅寻找“好想法”。 实验室管理层认为,“好想法”无处不在,但真正稀缺的是那些能够指引研究方向的、未解的**“好问题”。例如,凯利领导项目时,总是从聚焦于“未知”** 而非“已知”开始。这种以问题为导向的思维,是驱动其应对一系列“棘手问题”并取得突破的关键。