2024-08-17

34 篇热帖

1. X to pay €550k to employee fired for not replying to yes-or-resign ultimatum (fortune.com)
2. Increasing Retention Without Increasing Study Time [pdf] (files.eric.ed.gov)

本文探讨了如何在不增加总学习时间的情况下提升长期记忆保持效果,重点关注了“过度学习”和“学习时间分布”两个变量。

研究指出,过度学习(即在达到无错误表现后继续学习相同材料)虽能在短期内提升表现,但其效果随时间推移迅速衰减。实验显示,学习词汇一周后过度学习组有优势,但四周后该优势几乎消失。因此,过度学习对长期记忆的提升效率较低,将时间用于复习更早学习的材料可能更有效。

对于学习时间的分布,研究证实了“间隔效应”:将固定学习时间分散在多次学习中比集中学习更利于长期保持。关键在于学习间隔与保留间隔的比例。多项实验表明,当学习间隔约为保留间隔的10%-30%时,长期测试成绩最佳。例如,若想记住知识一年,最佳学习间隔可能在一个月至三个月之间。过长或过短的间隔都会降低效果。

这些发现对数学学习等抽象技能的学习具有启示。传统数学教材常采用“集中练习”和“过度学习”模式(即同一课后做大量同类题)。研究建议采用“分散交错”模式:将不同类型的问题混合分布在后续练习中。这不仅能提供时间上的间隔,还能帮助学生学习区分和选择解题策略,从而提升学习效果。

作者总结,教育实践应更注重基于实证的策略,如合理的间隔学习和检索练习,而非仅依赖传统集中练习模式。计算机化教学为实施优化的学习间隔安排提供了新机会。

3. Google Removed Organic Maps from the Playstore (twitter.com)

内容描述了在访问x.com时可能遇到的技术问题。错误消息表明出现了问题,但建议用户无需担心,并可以通过禁用隐私相关扩展来尝试解决。具体步骤包括识别这些扩展可能导致的冲突,禁用后重新访问网站。该提示旨在帮助用户快速恢复正常使用。

5. Good programmers worry about data structures and their relationships (read.engineerscodex.com)

核心理念

Linus Torvalds 指出:“糟糕的程序员关注代码,优秀的程序员关注数据结构及其关系。” Git 的成功很大程度上归功于其围绕稳定且文档完善的数据结构进行设计的理念。良好的数据结构能使代码更易于设计、维护和阅读,提升软件的可靠性与系统的可理解性。

数据模型驱动应用逻辑

在软件设计中,应用逻辑通常应遵循数据模型。将数据模型视为事后补充会增加后续的开发负担;相反,深思熟虑的数据模型能显著简化未来的系统迁移和复杂系统的扩展。作者在实际项目中曾通过重构数据结构消除整类问题,用“50行代码+优秀数据结构”替换了“500行的复杂算法函数”,不仅提升了运行速度,还大幅提高了代码的可理解性和可维护性(尽管复杂性随之转移到了数据重构阶段)。

Unix 哲学与经典编程法则

  • 《Unix编程艺术》的表示法则(Rule of Representation):将知识融入数据,使程序逻辑保持简单且健壮。人类更容易对复杂的数据结构(如50个节点的指针树图、数组转换表)进行建模和推理,而不是复杂的程序逻辑(如50行的流程图、switch语句)。
  • Rob Pike 的法则5:数据比程序逻辑更易于处理。当面临数据结构复杂性与代码复杂性的抉择时,应优先选择前者。在设计演进中,应主动寻求将复杂性从代码转移到数据中。Unix 社区和 C 语言对指针的灵活运用正是这一理念的体现,通过简单的指针追踪替代了其他语言中繁琐的过程实现。

实践建议与职业发展

  • 从数据入手:在深入代码细节之前,投入额外时间提前规划数据结构。通过为接口或数据库设置更严格的类型来降低代码复杂性。
  • 关注高层设计:在编码前,建立关于数据流向和不同组件如何交互的清晰的高层设计思路。
  • 契合高级工程师(L5)要求:这种关注高层系统设计的能力,与 FAANG 等科技大厂对高级工程师(L5)的核心要求高度一致。L5 工程师通常需要为复杂系统编写高层设计文档,并负责推动团队规划以及中大型功能的路线图建设。
6. Family poisoned after using AI-generated mushroom identification book (old.reddit.com)

事件概述

一个家庭因使用一本由人工智能(AI)生成的蘑菇识别指南而意外食用毒蘑菇,导致全家住院。该书由家人从大型在线零售商处购买作为生日礼物,书名类似《英国蘑菇:安全可食用蘑菇采摘指南》。书中包含用于识别的蘑菇图片。

关键问题

  1. 内容不准确与AI特征:经调查,书中的蘑菇图片为AI生成。此外,书中文本出现多处异常,例如句子结尾后接有随机提问或脱离指南语境的陈述(例如:“总之,羊肚菌是美味的蘑菇,可以在8月到夏末食用。如果还有什么我能帮您的,请告诉我。”)。
  2. 购买与平台处理:在线零售商已将该书下架,并指示买家退货退款。但购买记录已从买家账户中消失,仅存电子邮件证明。作者指出,平台上存在许多类似风格的可疑书籍。
  3. 未披露信息:作者强调,购买时网站并未说明该书由AI生成,他们是事后才得知。

作者的法律与后续疑问

作者提出了以下具体问题:

  • 是否应退还书籍(担心失去证据)。
  • 家庭成员是否可以就误工损失及疾病获得赔偿。
  • 是否可以向警方报告此事件,将其视为犯罪。

核心要点总结

此事件突显了由AI生成、未经核实的参考指南(尤其是在识别危险物种如蘑菇方面)所带来的严重公共安全风险,以及相关电商平台可能存在的监管缺失。受害家庭在不知情的情况下使用了此类内容,导致健康受损,并面临取证和法律追责的挑战。

10. FUTO (www.futo.org)

FUTO 是一个致力于开发和资助技术以回馈社会的组织,重点关注并支持优秀的开源项目。其主要内容和特点包括:

  • 核心使命:开发技术并为优秀的项目提供资金资助,以此回馈社区。
  • 独特理念:强调其在项目资助和技术开发上具有差异化的独特做法。
  • 社区共建:设立公共聊天平台(FUTO Chat),鼓励公众加入交流,汇聚力量共同构建优秀的开源技术(Open Tech)。
  • 信息支持:提供常见问题解答(FAQ)板块,以帮助用户了解更多信息。
11. Epic Games Store and Fortnite Arrive on EU iPhones (arstechnica.com)

摘要

  • 事件回归:四年前因数字支付争议被苹果App Store下架的《堡垒之夜》,如今仅限在欧盟地区的iPhone上重新上架。
  • 商店发布:Epic Games Store在Android全球和iOS仅欧盟地区推出,目前提供三款游戏:《堡垒之夜》、《火箭联盟侧翻》和《糖豆人》。
  • 公司背景:该商店由Epic Games运营,该公司是《堡垒之夜》的开发商和发行商。
  • 历史争议:在CEO Tim Sweeney的指导下,Epic修改了《堡垒之夜》的支付方式,被苹果视为违反开发者条款,导致游戏下架,并引发长期公关和法律冲突。
  • 法律结果:美国法院裁决给予Epic和其他开发者一些小胜利,但整体上维持了苹果平台规则的现状。
12. Ask HN: Do we need to pay billions in fees to Stripe, Block, PayPal and Visa/MC?
13. Xapian: Open source search engine library (xapian.org)

Xapian:开源搜索引擎库

简介

  • Xapian 是一个开源搜索引擎库,遵循 GPL v2+ 许可证。
  • 它主要使用 C++ 编写,并提供了丰富的语言绑定,支持从多种编程语言中调用。
  • 其设计目标是作为一个高度灵活的工具包,使开发者能够轻松地将高级索引和搜索功能集成到自己的应用程序中。

支持的语言绑定

Xapian 提供了广泛的绑定,使得以下语言能够方便地使用其功能:

  • Perl, Python 2, Python 3, PHP, Java, Tcl, C#, Ruby, Lua, Erlang, Node.js, R。

核心特性

  • 高度可适应:作为一个工具包,它允许开发者根据需求灵活构建搜索解决方案。
  • 高级搜索功能:内置支持多种权重模型家族,并支持丰富的布尔查询运算符
  • 应用扩展性:开发者可以基于Xapian构建可扩展的搜索应用,随着需求增长进行功能扩展。

相关应用:Omega

  • Omega 是Xapian项目官方提供的一个网站搜索引擎应用
  • 它是基于Xapian库构建的,与许多其他网站搜索解决方案不同,其优势在于可以利用Xapian的灵活性进行扩展和定制。

版本信息

Xapian 项目维护多个稳定版本系列:

  • 最新稳定版2.0.0(发布于2026年3月16日)。
  • 上一稳定版1.4.31(发布于2026年2月23日)。
  • 旧稳定版1.2.25(发布于2017年9月26日)。
14. What Is a Knowledge Graph? (neo4j.com)

知识图谱是对现实世界实体及其关系的有组织表示,通常存储在原生支持关系存储的图数据库中。其核心价值在于通过组织原则(如模式、分类法或本体)为数据提供上下文,从而发掘更深层次的洞察。它不限于大规模企业级应用,也可以针对特定用例构建小型知识图谱。

工作原理 知识图谱将信息从“字符串”转变为“事物”,即实体。例如,谷歌知识图谱通过理解实体之间的连接,为搜索查询提供语境化、相关的结果(如知识面板),而不仅仅是关键词匹配。

核心组件

  1. 节点:代表实体(如人物、地点、产品),拥有标签和属性。
  2. 关系:连接两个节点,表示实体间的关联,同样拥有标签和属性。
  3. 组织原则:一种框架或模式,用于根据用例的关键概念来组织节点和关系。它可以是简单的分类法,也可以是复杂的业务词汇表。本体论是一种形式化的组织原则,但并非所有场景都必需,初期可采用更简单的组织原则,按需演进。

技术实现:与数据库的关系

  • 属性图数据库(如Neo4j)是实现知识图谱的理想选择。其优势包括:
    • 设计简单:概念模型与物理模型高度一致。
    • 灵活易扩展:便于添加新数据和关系。
    • 性能优越:通过直接存储关系指针,实现高效的关系遍历查询。
    • 开发友好:支持直观的ISO标准查询语言(GQL)。
  • 对比三元组存储(RDF):三元组存储在表达复杂关系时需要变通方法,导致模型复杂、性能下降。
  • 对比关系数据库:关系数据库需通过运行时连接操作来合成关系,性能较差且管理复杂。

主要应用场景

  • 生成式AI:作为图增强检索生成(GraphRAG) 的基础,为大模型提供准确、可解释的领域知识。
  • 欺诈检测:分析交易、参与者等构成的复杂网络,识别可疑模式。
  • 客户主数据管理:创建统一、去重的客户视图。
  • 供应链管理:提供端到端的供应链可视化,用于风险预测和路线优化。
  • 调查与研究:在新闻调查中揭示隐藏关系;在医药研究中整合多源数据以发现新知识。
16. Slackdump (github.com)

Slackdump 概述

Slackdump 是一款用于归档 Slack 数据的开源工具,支持在没有管理员权限的情况下备份私有和公开的消息、用户、频道、文件及表情符号。

主要功能与使用场景

  • 数据归档:备份个人私密对话和在免费无存档订阅下的频道内容,防止知识丢失。
  • 导出与迁移:无需管理员权限即可创建 Slack 导出文件,支持创建增量存档(对免费工作区尤其实用),可用于向 Mattermost 或 Discord(通过 Slackord2)迁移。
  • 数据管理:下载自定义表情符号,合并多个存档,清理未完成的会话。
  • 分析与查看:支持使用内置查看器或第三方工具(如 SlackLogViewer、Slackdump2Html)预览导出结果。
  • AI 集成:提供本地 MCP 服务器,可与 OpenCode、Claude 等 AI 工具集成,用于分析存档数据。

运行模式

Slackdump 支持多种操作模式,主要包括:

  • 列表:列出用户或频道。
  • 转储:转储消息和线程。
  • 导出:创建 Slack 导出(标准或 Mattermost 格式)。
  • 存档:创建自定义格式的存档(SQLite 数据库或 JSON+GZ)。
  • 转换:将存档转换为其他格式(导出、转储)。
  • 表情符号:下载工作区表情符号。
  • 查看:查看导出、转储或存档文件。
  • 搜索:搜索消息和文件。
  • 恢复:向现有存档添加新消息。
  • 数据库工具:用于合并、去重和清理存档。

安装与使用

  • 安装:可通过 Homebrew (macOS) 或下载对应操作系统的发布版进行安装。运行时可能会遇到系统安全提示,需手动允许。
  • 认证:使用内置的 EZ-Login 3000 功能或手动从浏览器获取令牌和 Cookie 进行认证,无需创建 Slack 应用。
  • 运行:通过命令行交互式操作,或使用 slackdump help 查看详细帮助和选项。
  • 作为库使用:支持作为 Go 库集成到其他项目中。

MCP 服务器

Slackdump 提供一个只读的 MCP 服务器,用于与 AI 代理交互:

  • 传输方式:支持 stdio 和 HTTP。
  • 主要工具:包括 load_source(加载存档)、list_channels(列出频道)、get_messages(获取消息)、get_thread(获取线程)、command_help(获取帮助)等。
  • 快速设置:可为 OpenCode、Claude Code、Copilot 等工具一键生成项目配置。

常见问题

  • 错误处理:如遇 invalid_auth 错误,需重新认证工作区。
  • 数据限制:免费工作区无法获取超过 90 天的历史数据。
  • 格式区别
    • Archive:内存效率高,结构通用,可转换为其他格式。
    • Export:旨在模拟 Slack 官方导出文件,兼容性佳。
    • Dump:按频道存储消息,不含工作区信息。

其他信息

  • 许可证:项目遵循 GNU Affero 通用公共许可证 v3.0 (AGPLv3)。
  • 警告:在企业工作区中使用可能触发安全警报,用户需自行确保合规。
17. Show HN: Learn Blender shortcuts with lots of tiny videos (hollisbrown.github.io)

本文介绍了通过短视频学习Blender常用快捷键的方法。核心内容是各类操作的快捷键及其功能说明,主要分类如下:

一、 视图与导航控制

  • 改变视图:鼠标中键拖动旋转视图;按住Shift拖动平移兴趣点;按住Ctrl拖动或滚动滚轮缩放。
  • 轴向视图:数字键盘1、3、7分别切换为前、侧、顶视图;5切换正交视图;9反转当前视图;2、4、6、8以15°为步长旋转视图。
  • 相机视图:数字键盘0对齐场景相机;Ctrl+0对齐所选相机并设为场景相机;Ctrl+Alt+0将场景相机对齐到当前视图。
  • 聚焦选择:数字键盘.将兴趣点设为当前选择;数字键盘/切换局部视图(仅显示选中对象)。

二、 模式与对象切换

  • 切换模式:Ctrl+Tab显示所有模式;Tab直接切换编辑模式;在时间轴悬停时Ctrl+Tab可切换图形视图。
  • 切换对象:Alt+Q切换到悬停对象(不改变模式)。

三、 变换操作

  • 移动:G;按X、Y、Z锁定轴向(按两次切换全局/局部轴);Shift+X、Y、Z排除某轴;编辑模式下按两次G可沿边滑动。
  • 旋转:R;轴向锁定与移动操作类似;按两次R切换万向节模式。
  • 缩放:S;轴向锁定与移动操作类似。
  • 清除变换:物体模式下Alt+G/R/S分别清除位置/旋转/缩放。
  • 应用:物体模式下Ctrl+A应用变换或修改器。
  • 重复操作:Shift+R重复上一个操作。

四、 选择操作

  • 全选/取消:A全选;Alt+A取消全选。
  • 加选/减选:Shift+左键添加或移除选择。
  • 选择模式:数字键盘1、2、3分别切换顶点、边、面选择模式。
  • 循环选择:Alt+左键(接近交叉边时)选择循环;Alt+Shift+左键加选/减选循环。
  • 路径/区域选择:Ctrl+左键选择最短路径;Ctrl+Shift+左键加选/减选区域。
  • 关联选择:L选择光标下所有关联顶点;Shift+L移除;Ctrl+L选择与当前选择关联的部分。
  • 扩展/缩减选择:Ctrl+数字键盘+/-扩展/缩减选择。
  • 相似选择:Shift+G选择具有相似特征的部分。

五、 编辑与建模

  • 添加:Shift+A根据上下文添加新数据(对象、网格、节点等)。
  • 删除:X删除选中的对象或几何元素。
  • 隐藏:H隐藏选择;Shift+H隐藏其余;Alt+H全部显示。
  • 复制:Shift+D复制;Alt+D创建链接复制。
  • 挤出:E挤出;Alt+E更多选项。
  • 内插面:I内插面;再次按I单独内插;O切换外插;B切换边界。
  • 添加面:F添加面;Alt+F用三角形填充多边形;Ctrl+F面选项菜单。
  • 合并:M合并顶点;可设置按距离合并。
  • 分离:V撕裂;Y分离选择;P分离为新对象。
  • 环切:Ctrl+R环切;滚轮调整分段数。
  • 连接:J按顺序连接顶点。
  • 倒角:Ctrl+B边倒角;滚轮调整分段;V切换顶点倒角。
  • 溶解:Ctrl+X溶解顶点/边。
  • 缩放沿法线:编辑模式下Alt+S沿顶点法线移动。
  • 比例编辑:O切换;滚轮调整半径;Shift+O更改衰减曲线。
  • 球形化:Shift+Alt+S将选择趋向球形。

六、 其他实用功能

  • 吸附:Shift+S精确吸附;Ctrl启用吸附开关;B启用基点吸附。
  • 查找:F3打开操作符搜索。
  • 重命名:F2重命名对象;Ctrl+F2批量重命名。
  • 细分曲面:Ctrl+1/2/3添加对应级别的细分修改器;Ctrl+0禁用。
  • 精细输入:按住Shift可细分鼠标输入,实现更精确控制。
  • 多物体编辑:按住Alt可同时更改多个选中物体的参数。

这些快捷键通过视觉化的小视频教学,帮助用户快速掌握Blender的操作流程与核心功能。

18. There Is No Website (www.thereisnoweb.site)

文章标题:There Is No Website

核心内容总结:

这是一个在黑客松期间与Lewis共同构建的实验性网页项目。它并非传统的网站,而是一个功能上“失调”、基于物理的交互式网页世界,旨在挑战用户对常规网页体验的认知与预期。

主要特点与技术细节:

  1. 概念与体验:该项目创造了一个看似“不工作”或违背常规网页逻辑的环境。其核心是探索这种“功能性失调”状态,鼓励用户通过交互来发现其中隐藏的秘密。
  2. 技术栈
    • 开发语言与框架:使用 TypeScriptReact 构建用户界面。
    • 物理引擎:集成 Matter.js 一个2D物理引擎,为网页元素赋予真实的物理属性(如重力、碰撞、弹力等),这是项目实现“基于物理”体验的关键。
    • 样式工具:使用 TailwindCSS 进行样式设计和布局。
  3. 项目性质:它是一个概念性、探索性的作品,其目的不在于提供信息或实用功能,而是创造一种新颖的、带有游戏化和艺术性的交互体验,试图回答“网页可以是什么”这个问题。

总结: “Is No Website”是一个技术驱动的创意项目,它利用现代前端技术栈(React, TypeScript)和物理引擎(Matter.js),构建了一个违背用户传统网页操作直觉的互动世界。用户需要亲自探索这个“功能失调”的空间,以揭示其背后的设计意图与隐藏内容。

19. An unordered list of things I miss in Go (kokada.capivaras.dev)

Go语言缺失特性概览

本文列举了作者认为Go语言可以借鉴其他语言改进的几个方面:

  1. 标准库有序映射
    Go的map每次迭代顺序随机(为每个实例生成随机哈希种子),这在需要可复现结果时造成不便。作者建议标准库提供有序映射(插入顺序迭代),并指出Go的泛型(Generics)和range-over-func特性已为其实现铺平道路。尽管存在第三方库,但标准库支持能减少选择成本。

  2. 函数关键词参数与默认值
    Go不支持函数声明时的默认参数或调用时的关键词参数。例如,strings.Replace函数因无法设置默认值而需单独提供strings.ReplaceAll。此特性缺失影响API设计的简洁性。

  3. 空值安全性
    Go的nil值易导致运行时panic(如空指针解引用),而语言层面缺乏可空类型系统。虽然Go通过零值减少部分问题,但相比Kotlin等支持可空类型的语言,其类型安全性较弱。此特性需重大语言修订,且历史提案显示兼容性挑战巨大。

  4. 更简洁的Lambda语法
    Go的匿名函数(func关键字)在类型复杂时代码冗长。作者期望支持类似(args) => { ... }的Lambda语法,或至少允许省略未命名函数的类型注解,以提升函数式代码的可读性。相关讨论仍在进行中。

  5. 未使用返回值的错误检查
    Go允许忽略函数返回值,但偶尔会意外忽略错误值(如conn.SetReadDeadline()的错误)。作者建议编译器对未使用的错误返回值发出警告或错误,强制显式忽略(如_ = conn.SetReadDeadline(...)),以避免隐蔽bug。此机制优于依赖外部errcheck工具。

20. LLM and Bug Finding: Insights from a $2M Winning Team in the White House's AIxCC (team-atlanta.github.io)

Team Atlanta 在 AIxCC 半决赛中的 LLM 与漏洞挖掘经验

Team Atlanta 由佐治亚理工、三星研究院等六家机构组成,凭借 AI 驱动的网络安全系统(CRS)晋级 DARPA AIxCC 决赛。本文总结了其备赛策略、技术挑战与认知调整。

初期战略

吸取过往 CGC 比赛教训,团队决定深度整合 LLM,初期聚焦:

  1. 静态分析:预期比赛鼓励 LLM 静态分析而非单纯 Fuzzing。
  2. 微调代码 LLM:使用漏洞修复、CVE 等数据微调模型,提升漏洞推理能力。

规则误解与策略调整

随着规则明确,团队在五个技术点上进行了调整:

  1. PoV(漏洞证明):原以为 PoV 是逻辑证明,实际要求提供触发漏洞的输入。因 LLM 难以生成可达输入,团队转向动态 Fuzzing。
  2. Harnesses(测试线束):初期尝试自写系统调用测试 Linux 内核。官方后提供标准 Harness(如 Linux 的 blob、Java 的 Jazzer),降低了工程负担,但也使部分 LLM 组件冗余。
  3. PoU(理解证明):最初要求 CWE 分类,因存在歧义,官方改为要求定位引入漏洞的代码提交(BIC),需结合 Fuzzing 与 git-bisect 实现。
  4. 语义补丁:不同于 CGC 的简单缓解,AIxCC 要求补丁修复漏洞且保持功能正确。团队补丁通过公开测试,但在半决赛私有功能测试中被拒。
  5. Sanitizers(检测器):C 语言可用标准 ASAN,但 Java 等内存安全语言需项目自定义 Sanitizer。团队据此将 Java 挖掘重心转向 Jazzer Fuzzing。

半决赛表现

团队在 Linux 内核上投入最多,成功修补 CVE-2021-43267,获 6 个成就徽章(5 个首杀,1 个补丁)。在 sqlite3 上表现良好,但在处理复杂递归解析的 Java 项目 Tika 时遇阻。

决赛展望与建议

为提升决赛体验,团队建议:

  • 动态时间分配:依代码库复杂度(如庞大的 Linux 内核)分配执行时间。
  • 扩展语言支持:引入 Python、Rust 及跨语言组合(如 JNI)。
  • 标准化环境:统一编译器、运行时和基础镜像,便于探索 LLM 插桩等技术。
  • 增强可视化:向观众展示 CRS 实时 Prompt 和资源消耗等技术细节。

团队计划在决赛前将 LLM 深度整合至 CRS 工作流,并寻求更多赞助与合作。

21. Does Reasoning Emerge? Probabilities of Causation in Large Language Models (arxiv.org)

本文针对大语言模型是否具备真正的推理能力这一争论,提出了一种评估框架。该框架的核心在于运用因果关系的两个关键概率概念:必要性概率充分性概率。作者将大语言模型视为通过自然语言接口处理信息的抽象机器,并在此视角下,研究了在何种条件下能够计算出 PN 和 PS 的合适近似值。这一理论性与实用性并重的框架旨在更深刻地理解大语言模型进行推理的时机与能力,并通过一系列数学示例进行了初步说明。

22. The future of Deep Learning frameworks (neel04.github.io)

这篇文章批判性地分析了PyTorch框架的缺陷,并推崇JAX作为未来深度学习及科学计算框架的更优选择。其核心论点是PyTorch的设计哲学(强调灵活性和动态执行)与其当前被大规模采用的场景(需要高性能和可扩展性)存在根本冲突,导致了严重的生态系统问题和技术债务。相比之下,JAX从设计之初就围绕XLA编译器,采用函数式和编译器驱动的范式,更好地解决了规模化、可复现性和可移植性等关键需求。

主要论点总结:

  1. PyTorch的设计缺陷与生态系统问题:

    • 哲学错配:PyTorch源于LuaTorch,旨在快速原型设计,而非大规模分布式训练。其灵活性与规模化所需的性能之间存在难以调和的矛盾。
    • 缺乏明确战略:PyTorch试图同时维护动态执行(灵活性)和引入静态编译优化(性能),导致功能碎片化(如torch.compile、DTensor)和API混乱。不同组件(如FSDP与torch.compile)兼容性差,需要大量开发时间调试和适配。
    • 多后端支持的困境:支持多个编译器后端(如XLA、Triton等)的愿景理论上很好,但实践中造成API不一致和兼容性问题,增加了用户的复杂性和维护负担。
    • 非函数式编程的弊端:面向对象和命令式的风格降低了代码的可组合性。库之间(如HuggingFace Accelerate)接口不统一,导致依赖关系复杂、调试困难。
  2. JAX的优势与哲学:

    • 编译器驱动开发:JAX基于XLA编译器,用户只需编写纯函数,并用@jax.jit装饰,即可自动获得优化、并行化等能力。这抽象了通信、内核融合、调度等底层复杂性。
    • 函数式编程范式:强调无副作用的纯函数,提升了代码的可组合性、可读性和可复现性。例如,optax优化器库的链式设计非常简洁。vmap变换简化了批处理维度的处理。
    • 卓越的可复现性与可移植性
      • 可复现性:通过显式传递随机数密钥(jax.random.key)强制规范随机性,避免了PyTorch中常见的种子设置遗漏或错误问题。
      • 可移植性与自动扩展:XLA的“计算跟随分片”理念使得代码能轻松在不同硬件(GPU、TPU)和不同规模(单节点、多节点)上运行,通常只需修改分片声明即可。
    • 更简洁的并行化:无需像PyTorch中那样手动插入大量通信原语,XLA的GSPMD分区器能自动处理数据并行等分片策略。
  3. 对JAX的批评与改进建议:

    • 治理与信任问题:XLA主要由Google(TensorFlow团队)管理,存在因公司策略变动而影响项目的风险。作者建议建立独立的治理结构以增强社区信任。
    • XLA文档与透明度:XLA的内部文档和公开路线图不足,限制了社区的理解和贡献。
    • 生态系统需要整合:作者强烈批评flax库的API设计,认为equinox是更符合JAX哲学的优秀替代品。他希望生态系统的支持能从flax转向equinox
    • 需要注意的“锐利边缘”:JAX有其特定的约束和“陷阱”(如纯函数要求、函数式副作用管理),用户需要通过阅读官方文档《Common Gotchas in Jax》来熟悉。

结论: 作者认为,PyTorch在规模、可复现性和可维护性方面的固有问题使其成为科学计算领域的“净负面”因素。他强烈建议研究社区,特别是那些从事大规模训练的研究者,将代码库迁移到JAX,以利用其编译器驱动和函数式范式带来的稳定性、性能和可复现性优势。同时,JAX社区需要在治理、文档和生态系统一致性方面做出改进。

23. Spine – 2D skeletal animation for games, with physical secondary motions (en.esotericsoftware.com)

Spine 是一款专注于 2D 骨骼动画的游戏开发工具,其核心目标是通过高效的工作流程,将逼真的动画引入电子游戏。

核心价值与理念: Spine 认为,制作出色的 2D 动画不仅需要强大的软件,更需要一个强大的工作流程。因此,它致力于提供从动画创作到游戏集成的完整、高效的解决方案。

主要组成部分与功能:

  1. 在线演示:提供浏览器内的实时演示,展示动画分层播放、动态骨骼操控等功能。
  2. 学习资源(Spine Academy):提供全面的学习资料,包括自学教程、面对面的研讨会与课程,同时设有社区论坛、版本更新日志和开发路线图。
  3. 核心动画功能:提供一系列用于迭代创作的工具,包括:
    • 网格蒙皮与权重以实现图像弯曲变形。
    • 时间轴用于调整动画节奏。
    • 运动残影用于可视化动态。
    • 反向动力学用于摆设角色姿势。
    • 创建伪3D效果等。
  4. 运行时库:不仅限于设计动画,Spine 能将动画数据导出,并通过其提供的运行时库集成到游戏中。这些库支持几乎所有主流的游戏开发工具和编程语言,确保游戏中的动画效果与编辑器中完全一致。
24. The Apple IIGS Megahertz Myth (www.userlandia.com)

本文深入探讨了关于Apple IIGS处理器时钟速度(主频)的流行误解,即“苹果公司为避免与Macintosh竞争而故意限制了IIGS的CPU速度”。通过技术分析与历史考证,作者驳斥了这一说法,并揭示了多重复杂的技术与历史原因。

核心论点与证据:

  1. 流行误解与作者立场:广泛流传的说法认为,史蒂夫·乔布斯或苹果管理层故意将IIGS的CPU主频限制在2.8MHz,以防其性能超越当时主推的Macintosh(使用7-8MHz的Motorola 68000)。作者认为此说法缺乏证据,并认为技术限制才是主因。

  2. 技术瓶颈是根本原因

    • CPU来源与良率问题:IIGS使用的65C816 CPU由西方设计中心(WDC)设计,但由GTE等公司生产。GTE的制造工艺(3微米)难以稳定地大规模生产符合4MHz规格的芯片,更不用说8MHz。IIGS上市时,大量机器实际搭载的是标称3MHz的芯片(可能是4MHz规格不达标的降格产品),并统一运行在2.8MHz。
    • 关键指令时序缺陷:65C816的SEPREP指令(用于切换处理器状态寄存器位,对8/16位模式切换至关重要)在高频率下存在时序问题。这一设计缺陷源于芯片的原始手工布局(由Katherine Mensch在Mylar膜上完成),且在新工艺节点下问题加剧。这直接导致了处理器难以安全稳定地运行在更高频率。
    • 系统架构限制:IIGS的时钟信号来源于一个28.636MHz的晶振,与NTSC制式相关。虽然理论上可以通过不同的分频系数(如1/4分频)获得3.58MHz的CPU时钟,但系统芯片(FPI/CYA)的设计决定了2.8MHz是当时可行的稳定选择。此外,CPU在与慢速外设(如插槽、音频视频)通信时会被动态降频至1MHz,这也影响了整体性能。
  3. 历史脉络与开发困境

    • 项目演进:IIGS源于苹果内部的“IIx”项目(使用65816和协处理器),因CPU芯片延迟、不稳定及设计过于复杂而取消。后简化为“Phoenix”项目(即IIGS),专注于利用新集成的Mega II芯片和有限的65816资源。
    • 沃兹的期望与现实:史蒂夫·沃兹尼亚克在1985年初的采访中对8MHz的65816寄予厚望,认为它能匹敌甚至超越68000。但这更多是基于WDC的规划而非已实现的现实。芯片的制造问题使这一愿景落空。
    • 外部尝试与失败:第三方公司如Applied Engineering(TransWarp GS加速卡)和Tony Fadell的ASIC公司都曾试图开发更高频率的65816,但均面临严重的供应、可靠性或时序问题。1992年三洋公司推出了全新的14MHz 65816设计,但此时IIGS平台已接近生命末期。
  4. 苹果的商业决策

    • 非人为限制,但缺乏投入:作者认为,在技术可行的情况下(如1986年如果能获得稳定4MHz芯片),苹果会相应提升主频。苹果的“限制”更多体现在后期对IIGS平台的投入不足,而非在开发初期故意压低频率。
    • “Mark Twain”项目的取消:苹果曾计划推出最终修订版IIGS(代号Mark Twain),但最终取消。这并非因为无法解决CPU速度问题,而是由于市场战略(如推出Macintosh LC及IIe卡)和公司资源向Mac及新兴技术(如ARM)倾斜的商业决定。
  5. 更广阔的视角

    • 架构的局限性:即使65816能实现高频率,IIGS的混合架构(高速CPU与为兼容Apple II而保留的低速Mega II系统)也存在根本性的性能瓶颈。其他公司如Commodore(Amiga)和Acorn也面临类似的技术债务问题。
    • 历史的意义:作者呼吁以更严谨的态度对待科技史传闻,通过查阅一手资料(如技术手册、当时访谈、Usenet记录)来还原真相,而非简单地重复未经证实的“神话”。

结论:Apple IIGS处理器未能以更高频率运行,主要受限于65C816芯片的制造良率缺陷、关键指令的时序问题以及系统架构设计,而非苹果公司出于市场竞争的刻意限制。这一案例揭示了半导体技术发展、产品开发与商业决策之间复杂的相互作用。

26. Zngur: A C++/Rust interop tool (hkalbasi.github.io)

Zngur: C++/Rust 互操作工具

Zngur 是一款促进 C++ 和 Rust 之间互操作的工具。它的核心目标是让 C++ 代码能够方便地使用任意的 Rust 类型、方法和函数,同时尽可能保留它们原有的语义和使用体验。借助 Zngur,开发者可以在 C++ 代码中像在正常的 Rust 代码中一样轻松地使用任意 Rust crate,并且能够在 C++ 内部为 C++ 库编写符合 Rust 风格的 API。

设计理念

Rust 和 C++ 虽然同属系统编程语言,但在关键设计上存在差异:

  1. 内存安全:Rust 是内存安全语言,通过 unsafe 关键字明确区分安全与不安全代码的边界;C++ 则是不安全语言,没有此类区分。
  2. 泛型机制:C++ 的模板类似宏,支持变参、特化,且在实例化时检查;Rust 的泛型则在定义时通过 trait bounds 进行类型检查。
  3. 移动语义:Rust 的移动本质上是 memcpy,并辅以编译器支持确保被移出变量不被析构;C++ 的移动则可能执行任意代码。

在这些差异中,C++ 相对 Rust 拥有更大的自由度:

  • Rust 将 C++ 函数视为 unsafe,但 C++ 可以无差别地调用 Rust 代码(包括 unsafe 代码)。
  • 每个 Rust 泛型组件都可作为有效的 C++ 模板使用,反之则不然。
  • C++ 可以轻松模拟 Rust 的移动(例如通过实际 memcpy 并用布尔标志跟踪析构状态),但 Rust 难以处理 C++ 的移动。

基于此,Zngur 允许在 C++ 中使用任意 Rust 类型,按值存储在 C++ 栈上,并调用其任意方法和函数。但它将 C++ 类型桥接到 Rust,因为难以保持同等易用性。取而代之的是,Zngur 提供在 C++ 中为 C++ 库编写 Rust 风格包装器的能力,包括:

  • 为 C++ 类型实现 Rust 的 trait,并将其转换为 Box<dyn Trait>
  • 为 Rust 类型实现固有方法(inherent methods)。
  • 为 Rust 类型实现 Rust 的 trait。
  • 暴露 C++ 中操作 Rust 类型的裸函数。

示例概览

提供的 C++ 示例演示了 Zngur 的多种功能:

  • 在 C++ 中直接创建和使用 Rust 的 Vec<int32_t>,调用其方法(如 push)。
  • 像在 Rust 中一样链式调用方法(如 s.clone().into_iter().sum())。
  • 将 Rust panic 捕获为 C++ 异常(catch (rust::Panic e))。
  • 将 C++ lambda 转换为 Rust 的 Box<dyn Fn> 并传递给 Rust 函数(如 map)。
  • 为 C++ 类型实现 Rust 的 Iterator trait,并将其转换为 Box<dyn Iterator> 使用。
  • 使用类似 dbg!zngur_dbg 宏进行调试输出。

该示例的输出展示了相应操作的执行结果,包括求和、值访问、panic 捕获、闭包调用以及迭代器收集的结果。

27. ThreadPlotter – toolkit for punch needle embroidery with X-Y plotters (2020) (github.com)

ThreadPlotter 工具包总结

核心定义:ThreadPlotter 是一个支持使用 X-Y 绘图机设计、编辑和制作精美穿孔刺绣作品的工具包。它是论文《Plotting with Thread: Fabricating Delicate Punch Needle Embroidery with X-Y Plotters》(作者:Shiqing He, Eytan Adar,发表于 DIS'20 并获荣誉提名奖)的配套材料。

主要用途与功能:该工具包旨在将普通的 X-Y 绘图机转换为穿孔刺绣制造设备,帮助用户将数字设计转化为实体的纺织艺术作品。

使用步骤与教程:工具包提供了分步指导,将绘图机转变为刺绣制造器:

  1. 教程1:确认您的绘图机适用于该任务。
  2. 教程2:获取或创建必要的物理组件,如针头、布料和画框。
  3. 教程3:图案制作概述。
  4. 教程4:高级示例(进行中)。

建议与资源

  • 官方建议:强烈建议在开始前阅读其配套论文。
  • 技术支持:如有问题,可在其 GitHub 页面提交 issue。
  • 社区互动:鼓励用户使用标签 #plotterembroidery 在社交媒体上分享作品。
  • 引用:使用此工具包时,建议引用原论文。

许可信息:该项目采用 MIT 许可证,版权归属 Shiqing He (2020)。该许可证允许用户自由使用、复制、修改、合并、发布、分发、再许可和/或出售该软件的副本。

28. The spies in your home: How WiFi companies monitor your private life (proton.me)
29. The weird of function-local types in Rust (elastio.github.io)

Rust函数局部类型的奇怪特性

问题背景

在开发proc-macro库bon(用于为函数和结构体生成Builder)时,文档测试中的一个简单示例代码无法编译。示例代码使用buildstructor宏为User结构体生成Builder,但编译器报错“cannot find type User in this scope”。这引出了对Rust中函数局部类型解析机制的探讨。

函数局部类型的基本规则

在Rust中,可以在任何块表达式内部定义结构体、impl块或函数等项,这些项被称为“局部项”。例如:

fn example() {
    struct User; // 此结构体仅在函数作用域内可见
    let user = User;
}

外部无法访问函数内部定义的类型,因为Rust没有语法能表达函数作用域路径(如{fn example()}::User)。

类型路径的隐藏表示

虽然外部无法访问,但std::any::type_name()会返回包含函数名的完整路径(如crate_name::example::User),暗示函数在内部路径中被当作模块处理,但这种行为并未在语言中暴露。

间接访问的变通方法

通过定义trait和关联类型,可以间接将函数内部类型暴露到外部:

trait TypeChannel { type Type; }
struct GetUserType;
fn example() {
    struct User { name: String }
    impl TypeChannel for GetUserType { type Type = User; }
}
type RootUser = <GetUserType as TypeChannel>::Type; // 可访问User

此方法虽可行,但过于复杂且不实用,且rust-analyzer不支持此模式。

子模块的作用域问题

在函数内部定义的子模块中,super关键字不指向父函数作用域,而是指向函数所在的外层模块

fn example() {
    struct User;
    mod child_module {
        use super::User; // 错误:无法解析super::User
    }
}

子模块只能访问外层模块的项,无法访问函数内部定义的项。

对宏设计的影响

宏生成代码时,为保护生成的Builder结构体的私有字段,常将Builder定义在子模块中:

mod user_builder {
    use super::*; // 试图从父模块导入
    pub(super) struct UserBuilder { /* 字段 */ }
}

矛盾产生

  1. 需要子模块来保护Builder的私有字段。
  2. 需要引用外层作用域的类型(包括函数局部类型),但子模块无法通过super访问函数内部项。

文档测试的失败原因

文档测试中的代码片段会被隐式包裹在main()函数中。如果宏生成的子模块使用use super::*,则无法访问在main()内部定义的类型(如User),导致编译失败。

总结

  • 函数局部类型在外部作用域中不可见,这是Rust的设计。
  • 宏生成的代码中,子模块无法通过super访问函数内部的项,这限制了宏在保护私有字段与引用外部类型之间的设计。
  • 解决方案是妥协:避免使用子模块,或通过命名约定(如__前缀)和属性(如#[doc(hidden)])来模拟私有性。
  • 设计宏时需特别注意文档测试和函数局部类型的影响。
30. Disrupting a covert Iranian influence operation (openai.com)

OpenAI近期识别并阻止了一个隐蔽的伊朗影响力操作,代号为Storm-2035。该操作利用ChatGPT生成内容,试图操纵公众舆论并影响政治结果,特别针对2024年美国大选等关键事件。OpenAI已禁止相关账户并持续监控,以防止滥用AI服务。

操作主要通过ChatGPT生成两类内容:长篇文章和短社交媒体评论。长篇文章涉及美国政治和全球事件,发布在伪装成进步派和保守派新闻网站的五个网站上。短评论以英语和西班牙语形式,发布在X和Instagram等社交媒体平台上,参与账户约十余个。这些账户假扮不同政治倾向,部分评论通过重写其他用户内容生成。

内容主题聚焦加沙冲突、以色列参加奥运会、美国大选,辅以委内瑞拉政治、美国拉丁裔社区权利和苏格兰独立等议题。操作还掺杂时尚和美容评论,以增强真实性或吸引关注者。

然而,该操作未获得广泛受众参与。社交媒体帖子点赞、分享或评论稀少,网页文章也未被广泛传播。根据布鲁金斯学会的Breakout Scale评估,其影响力处于类别2低端,即多平台活动但缺乏真实用户互动。

OpenAI的调查借鉴了微软先前发布的信息。作为响应,OpenAI不仅关闭了相关账户,还与政府、竞选活动和行业伙伴分享了威胁情报,以支持更广泛的打击行动。

OpenAI强调,将继续致力于通过行业、公民社会和政府合作,利用生成式AI技术检测和缓解此类滥用,确保AI工具促进信息透明与安全。

31. Ditch the sim rig and use your car instead (2019) (outlandnish.com)

本文介绍了利用真实汽车电子系统控制虚拟赛车游戏《极限竞速》的创新方法,旨在以更低成本获得沉浸式驾驶训练体验。

背景与动机 作者的斯巴鲁BRZ在赛道故障后,为持续进行驾驶训练,产生了利用车辆自身电子系统控制游戏的想法。传统模拟赛车设备(如方向盘、踏板等)配置复杂且昂贵,尤其追求高仿真度的组件价格不菲。本项目通过直接读取车辆CAN总线数据来控制游戏,显著降低了成本。

核心方案 通过车辆OBD2端口接入CAN总线,获取转向、油门、刹车等信号,将其转换为游戏操纵杆数据,从而控制Xbox或PC平台的游戏。整个方案总成本低于入门级方向盘(如罗技G29)。

硬件配置

  • PC方案:仅需Macchina M2控制器,总成本约97.5美元。
  • Xbox方案:除Macchina M2外,还需Xbox自适应控制器、触发器分线板及3.5mm线缆,总成本约225.48美元。

技术实现步骤

  1. 读取车辆数据:使用Macchina M2通过OBD2端口监听CAN总线,通过逆向工程解析油门开度、刹车踏板行程、转向角度、离合器状态等信号。文中提供了适用于斯巴鲁BRZ的信号示例。
  2. 模拟游戏控制器:M2通过USB模拟为人机接口设备(HID)游戏手柄。针对不同平台映射信号:Xbox方案将油门/刹车映射为左右扳机,转向映射为摇杆;PC方案则将油门/刹车映射为X/Y轴,转向映射为Z轴,并支持挡位、手刹等按钮映射。
  3. Xbox扳机信号处理(仅Xbox方案):由于Xbox自适应控制器的USB输入无法直接控制扳机,且Xbox不支持将操纵杆轴映射为扳机,因此需利用M2的SPI接口控制数字电位器,生成模拟电压信号通过3.5mm接口输入自适应控制器的扳机端口,以实现油门和刹车的线性控制。
  4. 系统集成:组装所有组件,连接车辆和游戏平台即可运行。

优势与展望 该方案成本低廉,能提供真实车辆的操控反馈。未来改进方向包括:支持通过SD卡加载DBC文件以灵活解析不同车辆信号、集成电动助力转向与ABS模块以实现力反馈、以及争取获得Xbox官方配件认证以简化方案。

致谢 感谢Macchina提供的DIY友好型车辆通信工具,以及Xbox自适应控制器为无障碍游戏和DIY控制器所做的贡献。

32. Hacking with PDF (2022) (0xcybery.github.io)

《利用PDF进行攻击(2022)》文章摘要

本文介绍了PDF文件作为攻击向量的多种技术方法,包括注入攻击、漏洞利用以及恶意PDF分析。文章强调理解PDF结构对于实施攻击的重要性。

PDF注入攻击

PDF注入通过向PDF文件中的JavaScript对象、文本流或注释URI等位置插入恶意代码来实现。攻击成功后,当受害者打开PDF时即可触发攻击。

跨站脚本攻击(XSS)

  • 警告框:使用app.alert()函数在PDF中弹出警告对话框。
  • 窃取凭证:利用app.response()函数创建虚假登录提示,诱骗用户输入银行账户和密码,并通过submitForm()将数据发送至攻击者服务器。
  • 打开恶意链接:使用/URI动作或app.launchURL()函数在PDF打开时自动访问恶意网站。

远程代码执行(RCE)

利用旧版PDF阅读器(如Foxit Reader 9.0.1.1049)的漏洞(如CVE-2018-9958),通过嵌入精心构造的JavaScript代码实现RCE。攻击流程包括:

  1. 使用exploit脚本生成包含恶意代码的PDF。
  2. 通过msfvenom生成反向shell可执行文件。
  3. 将恶意代码注入正常PDF以增加隐蔽性。
  4. 受害者打开PDF后,通过SMB共享执行远程shell程序,建立反向连接。

恶意PDF分析

文章介绍了用于分析恶意PDF的工具:

  • Peepdf:用于初步分析PDF结构,识别包含JavaScript的对象。
  • pdf-parser:用于提取和检查特定对象的内容,支持流过滤和转储等高级功能。

关键技术点

  • 攻击代码可编码为十六进制以增加隐蔽性。
  • 实施攻击需考虑PDF结构、语法正确性和阅读器版本兼容性。
  • 蓝队防御需要具备恶意PDF分析能力。

本文提供了理论讲解与实践示例,涵盖了从攻击实施到防御分析的完整知识。

33. How high speed fiber optic internet cables are made (www.washingtonpost.com)

高速光纤互联网电缆的制造过程及其全球意义

全球互联网物理基础由遍布全球的半透明玻璃纤维网络构成,这些光纤电缆通过微小光束传输数据。其铺设范围覆盖海底与沙漠,是人类建造的最大规模网络,且未来将进一步扩张。

美国于2021年签署并启动的420亿美元“宽带公平接入与部署计划”(BEAD)旨在为全美家庭提供高速互联网。该计划将在50个州安装光纤电缆,部分架设在电线杆上,部分埋入地下。尽管实施复杂且进度面临挑战,但大部分建设预计将在2026年完成。

光纤制造核心步骤
以康宁公司位于北卡罗来纳州的美国最大光纤生产设施为例,其制造流程如下:

  1. 从气体到玻璃:将四氯化硅和四氯化锗等化学物质与天然气、氧气在高温下反应,在旋转的“巨棒”上沉积蓬松的二氧化硅玻璃“烟尘”,形成直径约一英尺的玻璃柱。
  2. 从浑浊到透明:将白色玻璃柱垂直浸入超过1000华氏度的高温炉中烘烤数小时,以纯化杂质、提升透光性,使其变成透明状。
  3. 自由下拉:在“拉丝”环节,玻璃柱被加热至熔融状态后靠重力向下滴落,经过多层楼高的设备后拉制成均匀细丝。每个玻璃柱可拉成约30英里长的光纤。
  4. 绕线与检验:光纤被涂上不同颜色以便安装识别,并缠绕到线轴上。自动化系统会进行缺陷检测和质量检查。这些玻璃丝直径仅如人类发丝,强度是钛的6倍,透明度是钻石的4万倍。
  5. 从仓库到全球网络:线轴打包后运往仓库,由机器人货架系统存储。部分光纤直接发货,部分运至康宁其他工厂进行捆缆和加护,最终部署于全球陆地与海底网络。

行业展望与挑战
BEAD计划将是美国数十年来最大规模的网络扩建,但消费者需数年才能感受到变化。康宁公司表示,全球光纤需求正因人工智能计算中心的兴起而大幅增长。目前全球光纤总长度已足以从地球往返太阳20次,体现了这一无形网络的庞大规模。

34. NSA tracks Google ads to find Tor users (www.cnet.com)

NSA通过广告网络追踪Tor用户的技术手段与防护建议

  • 追踪原理:NSA利用谷歌等广告网络(如AdSense)在互联网上投放广告,并在Tor网络的入口和出口节点附近植入带有特定标识的cookie。由于所有Tor用户在公共网络上看起来相似,此方法可将他们与其他用户区分开来。即使用户IP地址因使用Tor而改变,植入的cookie仍可能暴露其身份。
  • 技术成本:专家指出,此方法并非高级黑客技术,而是广告追踪的常见功能。NSA实施该策略的成本很低,估计一次广告投放活动仅需约1000美元。
  • 并非万能:报告强调,NSA无法以此方式追踪所有Tor用户。该方法需要攻击者处于互联网骨干网的特权位置,因此只有像NSA这样具备强大基础设施的组织才能可靠执行。
  • 其他潜在追踪途径:专家推测,NSA可能也利用垃圾邮件活动进行类似追踪。如果收件人渲染了邮件中的HTML或点击了链接,NSA便可能将电子邮件地址与其浏览器活动相关联。
  • 防护措施
    • Tor版本选择:使用带有Tor Button的旧版Firefox可能更安全,因为它会清理缓存和cookie。但当前Tor项目推荐的标准Tor浏览器套件已进行加固。
    • 更安全的方案:在虚拟机中运行Tor,并在每次使用后关闭虚拟机,可以彻底清除cookie和缓存,有效避免文中描述的中间人攻击。
  • 关键提醒:专家总结,如果用户未能采取关键步骤保护隐私(如妥善管理cookie和缓存),一旦进行敏感活动,其匿名身份就可能被揭穿。使用Tor或任何代理本身并不能完全防止此类基于Web设计原理的追踪。