2024-11-19

39 篇热帖

1. Llama 3.1 405B now runs at 969 tokens/s on Cerebras Inference (cerebras.ai)

Llama 3.1 405B 模型在 Cerebras Inference 平台上实现了 969 tokens/s 的输出速度,创造了 Meta 前沿模型的全新性能记录。与业界主流模型相比,该速度是 GPT-4o 的 12 倍,是 Claude 3.5 Sonnet 的 18 倍

关键性能指标:

  • 输出速度:在 1000 token 提示下达到 969 tokens/s,首次实现前沿模型的“瞬时速度”。
  • 首次响应延迟:仅 240 毫秒,远低于基于 GPU 的解决方案(通常达数秒),显著提升用户体验。
  • 长上下文性能:在 100,000 token 输入下,仍保持 539 tokens/s 的速度,比 Fireworks 快 11 倍,比 AWS 快 44 倍,并支持 128K 上下文长度
  • 模型精度:使用 16 位权重,保证完整模型精度。

解决行业痛点: 此前开发者需要在运行快速的二级模型与运行缓慢的前沿模型之间做出选择。Cerebras Inference 突破了这一限制,使 Llama 3.1 405B 等前沿模型首次实现高速运行。

商业可用性: 该服务目前已进入客户试用阶段,将于 2025 年第一季度 全面开放。定价为每百万输入 token 6 美元,每百万输出 token 12 美元,其输出价格比 AWS、Azure 和 GCP 低 20%

开源模型的优势: 通过 Meta 的开源方法与 Cerebras 的突破性推理技术的结合,开源前沿模型 Llama 3.1 405B 的运行速度已超过闭源前沿模型 10 倍以上,成为语音、视频和推理等对延迟与推理步骤要求极高的应用的理想基础。

2. OpenStreetMap's New Vector Tiles (tech.marksblogg.com)

OpenStreetMap 新矢量瓦片概述

OpenStreetMap 在其近二十年历史中主要托管栅格瓦片,即预先渲染好的静态 PNG 图像。近期,OSM 开始提供采用 Mapbox Vector Tiles (MVT) 格式的矢量瓦片。

核心变化与优势

  • 交互性增强:允许最终用户调整样式和渲染规则,并提取瓦片内的底层信息。
  • 视觉质量提升:图像显示更清晰。
  • 功能扩展:支持切换标签语言等功能。

OSM 主网站仍提供栅格瓦片,但已有演示网站可体验新的矢量瓦片。

应用示例

  • QGIS:通过添加矢量瓦片图层并设置样式和源 URL 进行可视化。样式可选,无样式时 QGIS 会随机着色。
  • Leafmap (Jupyter Notebook):使用 Python 库加载矢量瓦片并进行渲染,POI 图标显示正常。

数据提取与分析

作者下载了一个特定缩放级别(14)的 MVT 文件(约 114 KB),并将其转换为 JSON 文件(约 1.4 MB)。该文件包含多个图层,如地址、建筑、兴趣点(POI)、街道等。

使用 DuckDB 进行数据分析:

  • 查询示例:从 POI 数据中筛选具有 cuisine(菜系)属性的记录。
  • 数据摘要:可查看各字段的统计信息,如空值比例、唯一值数量等,以了解数据完整性。

工具:tiles2columns

作者开发了一个名为 tiles2columns 的 Python 工具:

  • 功能:根据给定的地理边界框(bounding box)下载 OSM 矢量瓦片,并将其转换为 GeoPackageParquet 文件。
  • 优势
    • 数据更新及时,比 PBF 文件(可能延迟数天)更接近实时。
    • 输出文件按 OSM 图层(如 streets.gpkgbuildings.gpkgpois.gpkg)分类,便于独立查看、样式设置和分析。
  • 输出:以迪拜北部区域为例,生成了包含数十个分图层的 GeoPackage 文件,可直接在 QGIS 中使用。

总结而言,OSM 矢量瓦片的推出提供了更灵活、高质量和可分析的地图数据,结合相应的工具链,能够支持更丰富的地理空间可视化与分析工作流。

3. Launch HN: Regatta Storage (YC F24) – Turn S3 into a local-like, POSIX cloud FS
4. Fair coins tend to land on the side they started (www.researchgate.net)

本文档是一个安全检查通知页面,用于应对网络中的异常活动。主要内容包括:检测到来自用户网络的异常行为,要求用户完成安全检查才能继续访问。页面提供了技术标识符,如Ray ID(a0326603ba068a80)和客户端IP地址(153.3.251.216),以帮助识别和跟踪问题。最后,附有ResearchGate GmbH的版权声明。该页面的功能是增强网站安全性,防止未经授权的访问。

6. Show HN: FastGraphRAG – Better RAG using good old PageRank (github.com)

FastGraphRAG:基于PageRank的改进型RAG框架

FastGraphRAG是一个专注于可解释性、高精度和代理驱动检索的图增强生成框架。它通过结合PageRank算法,旨在为大型语言模型提供更高效、低成本且可靠的检索流程。

核心特性

  • 可解释与可调试:知识以人类可导航的图形式呈现,支持查询、可视化与更新。
  • 快速且低成本:专为大规模运行设计,资源与成本需求低。示例显示,在《绿野仙踪》数据上,其成本仅为传统GraphRAG的六分之一。
  • 动态数据与增量更新:可自动为特定领域生成和优化图谱,并支持实时数据更新。
  • 智能探索:利用基于PageRank的图探索机制,提升检索的准确性与可靠性。
  • 异步与类型安全:全异步设计并提供完整的类型支持,确保工作流的稳健与可预测。

安装与快速开始

框架可通过两种方式安装:

  1. 从源码安装(推荐以获得最佳性能):克隆仓库后使用poetry install
  2. 从PyPi安装(推荐以获得稳定性):直接运行pip install fast-graphrag

快速开始示例(以分析《圣诞颂歌》为例)展示了基本流程:

  1. 设置OPENAI_API_KEY环境变量。
  2. 准备文本数据(如下载一本书籍)。
  3. 初始化GraphRAG实例,需指定工作目录、分析领域、示例查询和实体类型等参数。
  4. 调用insert()方法插入文本数据以构建知识图谱。
  5. 使用query()方法进行查询,模型将基于图谱生成回答。该过程会将知识持久化,下次初始化同一工作目录时将自动加载。

其他资源与信息

  • 示例:项目提供custom_llm.pycheckpointing.ipynb等教程,涵盖自定义模型、检查点使用及查询参数(如引用参考信息)。
  • 贡献:项目欢迎社区贡献,可通过Discord进行交流。
  • 设计理念:其使命是降低构建成功生成式AI应用的门槛,通过提供专用的记忆与数据工具,让用户无需复杂代理工作流即可利用高级检索管道。
  • 授权与服务:项目采用MIT许可证。同时提供托管服务,每月前100次请求免费,后续按使用量计费。
8. 20 years of Google Scholar (blog.google)

Google Scholar 20周年纪念文章摘要

核心概述

Google Scholar 于2004年创立,旨在为全球研究者提供一个免费、便捷的学术文献检索与阅读平台,其诞生初衷是打破学术信息的获取壁垒。在成立20周年之际,文章分享了其发展历程、核心功能及一些有趣的使用案例。

早期发展历史

  • 创立团队与愿景:由两名研究人员创办,核心目标是使研究者能够轻松发现并阅读同行的研究成果。
  • 初始挑战:初期互联网速度慢且不稳定,团队采用“线下物理传输”模式,由出版商将文章加载到硬盘上,再人工取回。
  • 发布契机:产品发布恰逢关键成员Alex的孩子出生前夕,团队为赶上截止日期而加班加点。
  • 产品座右铭:“Standing on the shoulders of giants”(站在巨人的肩膀上),体现了学术传承与协作精神。
  • 索引范围:致力于收录全面的学术资料,包括经过同行评审的期刊、会议论文、学位论文、预印本、技术报告等,涵盖多种语言。

核心功能与特点

  1. AI大纲辅助阅读:新近推出的功能,利用AI为PDF论文生成大纲,帮助用户快速把握主旨或深入探讨细节。
  2. 法律案例库:提供美国法律案例的检索功能,使法律文档更易获取。
  3. 便捷引用:点击“引用”按钮,可一键生成多种格式的参考文献。
  4. 里程碑庆祝:当用户的论文被引用次数达到重要整数时,Scholar主页会显示气球动画以示祝贺。

实用工具与技巧

  • 扩展访问:与全球图书馆和出版商合作,提供订阅文章的访问途径,并优先展示免费版本(如预印本)。
  • 个人图书馆:用户可一键保存文章,创建自定义文件夹,并在任何联网设备上访问。
  • 作者关注:可关注特定作者,通过邮件提醒接收其最新发表成果。
  • 远程访问支持:在COVID-19疫情期间,其“校外访问”计划确保了研究人员在居家办公时仍能访问订阅资源,促进了学术产出。

意外用途与趣闻

  • 家族历史追溯:有用户通过Scholar找到了其父辈几十年前发表的一篇已被遗忘的学术论文。
  • 情感表达:在期末考试季,曾有学生因感激而在社交媒体上对Scholar表达喜爱甚至“求婚”。
  • 有趣的法律文书:在一则美国案例(US v. Syufy Enterprises)中,法官在判决意见中隐藏了200多部电影片名。
  • 极简摘要:存在一篇仅由两个词“Probably not.”组成的物理学摘要。
  • 动物合著者:一篇物理学论文因作者使用了“我们”而将其家猫列为合著者。
  • 疫情主题广泛化:2020年出现了大量研究疫情与各种事物关联的论文(如“巧克力与COVID”)。
  • 超大规模合作:一篇关于希格斯玻色子测量的论文拥有超过5000名作者。
10. Which power plant does my electricity come from? (practical.engineering)

文章核心内容摘要

本文深入探讨了电力系统运作的复杂性,强调了理解其经济层面与技术层面同等重要。文章以2000年加州能源危机为引子,指出此次危机主要源于人为操纵电力市场,而非单纯的技术故障,揭示了电力作为特殊商品的市场特性。

电力系统的特殊性

电力无法大规模储存,必须实时生产与消费,且需求相对刚性。这要求发电侧必须快速响应负荷波动。整个行业资本密集,依赖共享基础设施来分摊成本。

市场结构的演变

历史上,电力公司通常是垂直整合的垄断体,发电、输电、配电一体化运营,并受严格监管。后来,电网互联促进了电力共享和功率池的发展。20世纪90年代,联邦政府推动了发电环节的去监管化,旨在引入市场竞争,以提升效率和降低价格,但实施过程复杂且各州差异显著。

电网运作与批发市场

  • 运作原理类比:电网被比作一个大型湖泊,发电方将电力注入,用电方从中提取。电力的流动遵循物理定律,但经济上的买卖关系通过合同和结算来追踪。
  • 日前市场:这是主要的批发市场。购电方(如公用事业公司)提交次日每小时的需求量和价格,发电方根据其成本(如燃料、运营约束)报价。市场运营商按报价从低到高排序来满足需求(经济调度),清洁定价机制意味着所有中标的发电方均按最后被调度的发电方报价结算,这激励了可再生能源(其报价通常很低甚至为零)的接入。
  • 实时市场:用于弥补日前预测与实际情况的偏差,拍卖可能每5分钟进行一次。价格有时会反映更高的价值(如“失负荷价值”),以确保供电可靠性。
  • 容量市场:旨在确保长期发电容量充足,通过拍卖为未来新增容量提供补偿。
  • 辅助服务市场:购买维持电网频率稳定、备用容量、电压支撑等服务。值得注意的是,除了发电资源,大型电力用户也可通过需求响应程序参与这些市场,通过削减用电来获得报酬。

输电系统的挑战

输电和配电网络好比“运河”,容量有限,建设和维护成本高昂,因此其费率受监管而非市场化。购电方需为输电容量付费,但电力实际流动路径难以精确控制。当输电线路出现拥塞时,会采用节点边际电价,导致不同地理位置的电价出现差异。

零售电力市场

在终端用户层面,零售电力供应商是连接批发市场的中间商。他们负责采购电力并销售给用户,用户可能通过他们选择特定的电价方案(如固定费率或实时费率)或支持可再生能源发电。用户的电费账单涵盖了发电、输电、配电、市场运营及监管等多重成本。

结论

电力系统是一个由物理电网、复杂金融市场和监管框架共同构成的网络。理解电价如何驱动发电决策、确保电网可靠运行以及涵盖所有环节的成本,有助于公众认识电力这一基本服务的真正内涵。

11. Bayesian Neural Networks (www.cs.toronto.edu)

贝叶斯神经网络摘要

1. 标准神经网络的过拟合问题

  • 标准神经网络作为灵活的函数逼近器,通过优化损失函数学习权重单一最优值
  • 过拟合问题:因参数过多(数百万),模型在训练集上表现过好,但在新数据上性能下降,即泛化能力弱。
  • 训练目标(如最大似然)与测试目标不一致,导致权重选择对训练数据过拟合。

2. 贝叶斯推断的核心思想

  • 贝叶斯方法不学习单一权重值,而是学习权重的概率分布(后验分布 (p(w | D_{\text{train}})))。
  • 优势
    • 缓解过拟合:通过建模参数不确定性,对数据拟合更稳健。
    • 小数据学习:数据量少时,后验分布反映较高不确定性;数据充足时,后验分布收紧,接近传统训练结果。
    • 不确定性量化:提供预测的不确定性估计(预测分布 (p(\hat{y}(x) | D))),对决策至关重要。

3. 精确贝叶斯推断的挑战

  • 精确计算后验分布需通过贝叶斯公式,但涉及对高维权重空间的积分,通常不可解析求解。
  • 精确计算预测分布亦需对后验求期望,计算困难。

4. 近似推断方法

为解决计算难题,采用两类近似方法:

4.1 基于采样的方法(如MCMC)

  • 蒙特卡洛积分:从后验分布中采样网络权重,用样本平均近似预测分布的期望。
  • 马尔可夫链蒙特卡洛(MCMC):如Metropolis算法,通过构建马尔可夫链生成渐近服从后验的样本,避免直接从先验采样效率低下的问题。
  • 特点:理论上有渐近无偏性,但高维空间中收敛速度慢,计算成本高。

4.2 变分推断

  • 核心思想:将难解的积分问题转化为优化问题。用参数化分布 (q_\phi(w))(近似后验)逼近真实后验 (p(w | D))。
  • 目标:最小化 (q_\phi(w)) 与 (p(w | D)) 之间的Kullback-Liebler散度(KL散度)。由于后验未知,转而最大化证据下界(ELBO): [ \tilde{L}(\phi) = \mathbb{E}{x, y \sim D} \left[ \mathbb{E}{w \sim q_{\phi}} \left[ \log p(y | x, w) + \log p(w) - \log q_{\phi}(w) \right] \right] ]
  • 优势:可利用随机梯度上升(SGA)优化,计算高效,易于扩展至大型网络和数据集。

5. 随机变分推断(SVI)算法

  • 步骤
    1. 参数化近似后验:常用对角协方差高斯分布 (q_{\mu, \sigma}(w) = \mathcal{N}(\mu, \sigma^2 I))。
    2. 重参数化技巧:将采样过程可微化,通过 (w = \mu + \sigma \epsilon)((\epsilon \sim \mathcal{N}(0, I)))将梯度传递至 (\mu, \sigma)。
    3. 随机优化:使用小批量数据和重参数化采样,估计ELBO的梯度并更新变分参数 (\phi = (\mu, \sigma))。
  • 与传统训练对比:SVI优化ELBO,而传统训练优化最大似然/MAP目标;SVI额外维护权重分布的不确定性。

6. 实际意义与扩展

  • 工程实现:贝叶斯神经网络可借助现有深度学习框架,通过SVI实现,仅需少量修改。
  • 与Dropout的联系:Dropout可视为一种近似变分推断,通过随机关闭神经元隐式引入不确定性。
  • 预测与不确定性:测试时可通过从学习到的后验分布中多次采样,聚合得到更稳健的预测和不确定性估计。
  • 应用场景:特别适用于小数据集、需可靠性评估(如医疗、自动驾驶)或主动学习的领域。

总结

贝叶斯神经网络通过学习权重的分布而非单一值,有效缓解过拟合,支持小样本学习,并提供预测不确定性。近似推断方法(尤其是变分推断)使其在计算上可行,与现代深度学习工具兼容,为增强模型可靠性与泛化能力提供了重要框架。

12. Show HN: Embed an SQLite database in your PostgreSQL table (github.com)

pglite-fusion 是一个 PostgreSQL 扩展,它允许用户将 SQLite 数据库作为二进制对象嵌入到 PostgreSQL 表的列中,其核心目标是为多租户架构提供一种轻量级且隔离的解决方案。

核心功能与使用流程

该工具提供了 Docker 镜像,支持从 PostgreSQL 13 到 18 的多个版本,便于快速启动。核心工作流如下:

  1. 创建扩展:在 PostgreSQL 中运行 CREATE EXTENSION pglite_fusion;
  2. 定义包含 SQLite 列的表:在表定义中使用 SQLITE 数据类型。可以使用 init_sqlite 函数为列设置默认的初始化 SQL,例如预先创建表结构。
  3. 操作嵌入的 SQLite 数据库
    • 写入数据:使用 execute_sqlite 函数对列中的 SQLite 数据库执行 INSERT、UPDATE 或 DELETE 等语句,并返回更新后的二进制对象。
    • 查询数据:使用 query_sqlite 函数执行 SELECT 查询,结果以 JSON 编码行的表格形式返回。
    • 提取查询结果:使用 get_sqlite_textget_sqlite_integerget_sqlite_real 等函数从查询返回的行中提取特定列的值。

主要 API 函数分类

数据库创建与初始化:

  • empty_sqlite():创建一个空的 SQLite 数据库。
  • init_sqlite(query):创建并初始化一个执行了指定建表等语句的 SQLite 数据库。

数据操作与查询:

  • execute_sqlite(sqlite, query):对 SQLite 数据库执行写操作并返回更新后的数据库。
  • query_sqlite(sqlite, query):执行查询,返回 JSON 行结果。
  • count_sqlite_rows(sqlite, table):统计 SQLite 数据库中指定表的行数。

元数据与维护:

  • list_sqlite_tables(sqlite):列出 SQLite 数据库中的所有表名。
  • sqlite_schema(sqlite):获取 SQLite 数据库中所有表的 CREATE TABLE 语句。
  • vacuum_sqlite(sqlite):对 SQLite 数据库执行 VACUUM 以优化存储。
  • import_sqlite_from_file(path)export_sqlite_to_file(sqlite, path):实现 SQLite 数据库与文件系统之间的导入导出。

结果提取辅助函数:

  • get_sqlite_text(sqlite_row, index)get_sqlite_integer(sqlite_row, index)get_sqlite_real(sqlite_row, index):分别用于从查询结果行中提取文本、整数和浮点数值。

除文件导入导出函数外,所有其他函数均声明为 parallel-safe,支持并行执行。

13. Maslow 4: Large format CNC routing made accessible (www.maslowcnc.com)

Maslow 4:让大型CNC路由触手可及

Maslow 4是一款旨在让大型CNC路由加工变得更加普及和易于使用的设备。其核心特点与优势包括:

  • 显著的性能提升:相比上一代M2型号,切割速度最高可提升10倍。这得益于更快的切割速度与更深的切削深度的结合。
  • 自动化校准:设备支持自动校准功能,简化了设置过程,提升了用户体验。
  • 持续开发:该项目处于积极且持续的开发迭代中,不断进行优化与更新。

该项目是一个社区驱动的开源项目。其愿景是通过普及大型CNC加工能力,让每个人都能将人类尺度的大型创意从数字世界变为物理现实,从而使世界变得更加丰富有趣。

社区成员利用该设备创作的成果展示了其广泛的应用潜力,示例包括:

  • 家具:例如论坛成员Jacob制作的桌子。
  • 标识:例如论坛成员Jeebiss制作的标识。
  • 艺术品:例如论坛成员Badaboom Berlin创作的艺术品。
  • 大型创意实现:例如论坛成员Sonny_Lacey制作的船只。

总之,Maslow 4通过提升速度、简化操作(如自动校准)和依托开源社区支持,致力于降低大型CNC路由的门槛,让用户能够更便捷地实现各种大型创作。

14. Scientific American's departing editor and the politicization of science (reason.com)
15. Hyperfine: A command-line benchmarking tool (github.com)

Hyperfine 是一款命令行基准测试工具,用于测量和比较命令的执行时间。

核心特性

  • 统计分析:自动进行多次运行,并提供均值、最小值、最大值等统计结果。
  • 灵活输入:支持测试任意 Shell 命令。
  • 进度反馈:在测试过程中提供实时进度和预估时间。
  • 预热运行:可在正式测试前执行指定次数的预热。
  • 缓存控制:支持在每次计时前运行准备命令(如清空系统缓存)。
  • 异常值检测:能识别因外部程序干扰或缓存效应导致的统计异常。
  • 结果导出:可将结果导出为 CSV、JSON、Markdown、AsciiDoc 等多种格式。
  • 参数化测试:支持单个参数(如线程数)在一定范围内变化的系列测试。
  • 跨平台:支持 Linux、macOS、Windows 等操作系统。

基本使用

  • 基础测试:直接运行 hyperfine <command>。默认执行至少 10 次或持续至少 3 秒。可通过 -r--runs 选项指定运行次数。
  • 比较命令:传入多个命令以比较其运行时,例如 hyperfine 'cmd1' 'cmd2'
  • 预热与准备
    • 使用 -w--warmup 选项进行预热,适用于需预热缓存的场景。
    • 使用 -p--prepare 选项运行准备命令,适用于需冷缓存的场景(如清空磁盘缓存)。
  • 参数化测试
    • 使用 -P--parameter-scan 配合参数范围,测试参数变化对性能的影响。
    • 使用 -L--parameter-list 指定非数值参数列表。
  • Shell 设置
    • 默认使用系统预设 Shell。可通过 -S--shell 选项指定其他 Shell。
    • Hyperfine 会自动校准并扣除 Shell 启动时间。
    • 对于极快命令(< 5 ms),可使用 -N--shell=none 选项绕过 Shell 以减少干扰。
  • Shell 函数/别名:可通过导出函数或将其内联到命令中来进行测试。
  • 导出结果
    • 使用 --export-markdown 选项生成 Markdown 表格。
    • 使用 --export-json 等选项导出 JSON 格式,便于使用配套 Python 脚本进行深度分析和可视化。

详细流程 工具支持 --warmup--prepare--setup--cleanup 等选项,这些命令会按照特定流程执行,具体流程可参考项目文档中的流程图。

安装 Hyperfine 可通过大多数操作系统的官方包管理器安装,包括 Ubuntu、Fedora、Arch Linux、macOS (Homebrew/MacPorts)、Windows (Chocolatey/Scoop/Winget) 等。也支持通过 condacargo 或下载预编译二进制文件安装。

其他信息

  • 替代工具:灵感来源于 bench
  • 集成:可与 Chronologer、Bencher 等工具集成,用于跨 Git 历史的性能可视化或 CI/CD 中的持续基准测试。
  • 项目名称:源于铯 133 的“超精细能级”,该能级在秒的定义中至关重要。
  • 许可证:采用 MIT 和 Apache 2.0 双许可。
16. MailCatcher runs a super simple SMTP server (mailcatcher.me)

MailCatcher 是一个开发工具,运行一个简单的 SMTP 服务器,专门用于捕获和显示在开发过程中应用程序发送的电子邮件。

核心功能与特性

  • 邮件捕获与显示:启动后,它将拦截所有发送到其 SMTP 服务器的邮件,并通过一个内置的 Web 界面展示。
  • 内容格式支持:支持显示 HTML、纯文本和原始源码格式的邮件。
  • HTML 优化:自动重写 HTML,使得嵌入的内联图片等资源能够正常显示,并将邮件中的链接在新窗口中打开。
  • 附件处理:列出邮件附件,并支持单独下载各个部分或下载完整的原始邮件。
  • 实时更新:如果浏览器支持 WebSockets,邮件会实时出现;否则每30秒自动刷新。
  • 运行模式:可作为后台守护进程运行,也可在前台运行。
  • PHP 集成:提供 catchmail 命令,便于与 PHP 的 sendmail 功能集成。
  • API 接口:提供 RESTful 风格的 URL 来以 JSON 格式获取邮件列表和详情,以及访问邮件的 HTML、纯文本、附件和原始源码。
  • 键盘导航:支持在 Web 界面中使用键盘在邮件间导航。

安装与基本使用 通过 RubyGems 安装:gem install mailcatcher。启动后,默认的 SMTP 监听地址为 127.0.0.1:1025,Web 查看地址为 http://127.0.0.1:1080。开发者需将自己的应用程序邮件发送配置指向此 SMTP 地址。

框架集成示例

  • Rails:在 environments/development.rb 中配置 ActionMailer 使用 :smtp 方式,地址指向 127.0.0.1,端口为 1025
  • PHP:修改 php.ini 中的 sendmail_path 指令,使用 catchmail 命令。
  • Django:在 settings.pyDEBUG 模式下,配置 EMAIL_HOSTEMAIL_PORT

注意事项与局限性

  • 不建议将 mailcatcher 加入项目的 Gemfile,以防 gem 冲突。
  • 邮件处理能力基础,复杂编码(如 UTF-8)依赖发送端邮件库正确编码。
  • 项目处于维护阶段,开发者欢迎提交问题和贡献代码。
18. Using GPS in the Year 1565 (www.verbeeld.be)

核心概述

这篇文章介绍了一个名为Allmaps Here的网络应用,它能将现代GPS定位与古老的地理参考地图相结合,让用户可以在历史地图上查看自己的实时位置。

主要内容

  1. 应用介绍

    • 名称与链接:Allmaps Here(https://here.allmaps.org),由Bert Spaan开发。
    • 功能:利用经过“地理参考”处理的旧地图,显示用户当前的地理位置。
    • 使用方法:访问网站并授权获取位置信息后,应用会展示附近的多张老地图,用户可选择一张,即可在地图上看到代表自己位置的标记。
  2. 应用示例

    • 安特卫普(1565年)
      • 使用维吉利乌斯·博诺尼恩西斯于1565年绘制的安特卫普城市地图。这幅巨型彩色木版画是16世纪已知最大、最详细的安特卫普地图。
      • 作者的GPS定位点(粉色圆点)显示在普朗坦-莫雷图斯博物馆前。该博物馆是联合国教科文组织世界遗产,曾是普朗坦-莫雷图斯出版家族的故居和印刷厂。
      • 通过此地图,作者重新发现了城市地点的历史面貌,例如:卡斯特莱普莱因街(城堡广场街)曾毗邻一座早已消失的城堡;如今呈三角形的安特卫普城市公园,其形状源于历史上曾是城市防御工事的一部分。
    • 布鲁塞尔(1777年)
      • 使用L.A.杜普伊斯将军于1777年绘制的地形图(费拉里斯地图),该地图是世界知名的优质制图资料。
      • 作者的定位点显示在哈尔门(Hallepoort)前,并附有现场照片对比。
  3. 用户参与

    • 作者鼓励用户通过访问allmaps.org网站的“入门”部分,学习并参与旧地图的地理参考工作,将自己的发现以#allmapshere标签在社交媒体上分享。
  4. 项目历史

    • 这一想法源于作者在2021年5月的一个构想:希望有一个能在旧地图上精确定位的手机应用。
    • 2021年6月,开发者Bert Spaan宣布了Allmaps开源工具项目。
    • 经过交流,Bert Spaan于2022年春季将Allmaps Here付诸实现。作者在撰写本文时对其表示赞赏。
19. Why I hate the index finger (1980) (pmc.ncbi.nlm.nih.gov)

文章核心观点

本文通过一篇具有强烈个人色彩和争议性的医学评论,阐述了作者(一位外科医生)对食指的负面看法。作者认为,尽管食指以精密操作能力著称,但在临床实践中,一个受损或功能障碍的食指往往成为手部功能的累赘,并主张在必要时通过食指桡侧切除术来改善手部整体功能。

详细总结

  1. 食指的解剖与功能基础

    • 精密抓握:主要由食指、中指和拇指完成,由正中神经支配相关肌肉和感觉。
    • 握力:主要由尺侧手指(环、小指)和拇指提供,由尺神经支配。
    • 中指的枢纽作用:中指既能参与精密抓握,也能在握力中贡献力量,具有双重功能。
  2. 对食指的批评(“讨厌”理由)

    • 性格缺陷:作者将食指拟人化,批评其“性格糟糕”——笨拙、懒惰、傲慢,常“碍事”。
    • 临床问题
      • 高损伤率与低回报:食指虽最常受伤,但多是小伤,却导致最长的误工时间。
      • 功能恢复困难:肌腱移植、神经修复或骨折后,食指的功能恢复效果通常不如其他手指。
      • 阻碍康复:一个功能障碍的食指会干扰其余健康手指的活动和康复训练。
      • 诱发严重问题:食指是上肢灼性神经痛的常见起始点,且常因小伤导致顽固性神经瘤。
  3. 支持食指桡侧切除术的论点

    • 适应症:对于无法恢复功能、持续疼痛或阻碍手部活动的食指,应考虑切除。
    • 术后效益
      • 功能改善:手部尺侧关节活动度增加,抓握跨度增大,握力模式可能更佳。
      • 外观改善:移除僵硬、畸形的食指残端通常能改善手部外观。
      • 代偿迅速:中指能自动接管食指的精密感觉和功能。
      • 患者解脱:许多患者术后感到如释重负。
    • 案例佐证:文中提到一位因指尖伤后13年未使用食指的女性患者,在接受桡侧切除术后获益。
  4. 关于食指切除的补充说明

    • 不同水平截指的影响
      • 掌指关节近端切除(桡侧切除):通常有益。
      • 近节指骨截指:若形成短残端,易在抓握时受创,常需转为桡侧切除。
      • 远端截指:会严重丧失精细捏力。
    • 手术原则:强调术前与患者充分沟通,使其理解并共同决策。文中详细描述了手术步骤,包括切口设计、神经血管处理、骨切除范围(保留部分掌骨基底以维持桡侧腕屈肌和桡侧腕长伸肌附着)、肌肉处理以及皮肤闭合技巧,以追求最佳功能和外观。
  5. 作者结论

    • 食指是“精密但傲慢”的手指,一旦功能受损且无法恢复,便是手部的负担。
    • 医疗目标应是恢复手部整体功能,而非出于情感或对“重要手指”的固有观念保留无用的部位。
    • 如果必须失去一个手指,作者个人选择优先切除非优势手的食指。
20. Shift Left Is the Tip of the Iceberg (semiengineering.com)

摘要:半导体设计中“左移”趋势的深层变革

“左移”正从行业流行语演变为一场根本性的设计方法学与EDA工具链变革,标志着半导体设计正从孤立的芯片视角转向系统级设计时代。这场变革由多重因素驱动,涉及设计流程的多个层面:

核心变化:

  1. 优化目标扩展:从传统的功率、性能、面积指标,转向系统级指标,如每瓦性能、热管理和可靠性。设计需在更复杂的多变量间权衡。
  2. 3D-IC与Chiplet的影响:异构集成使得系统级优化至关重要,涉及多学科协作、不同芯片间的协同安排与验证,以及标准化需求。
  3. 依赖性增强:物理极限下,各设计指标相互关联,如功率、时序、可靠性,需在更早阶段进行综合评估。
  4. 领域专用设计:通用计算时代结束,定制化硅片(尤其在汽车等行业)成为必需,设计需针对特定工作负载和软件进行深度优化。
  5. 软硬件协同:系统设计必须尽早将软件纳入考量,软硬件开发周期不同步带来巨大挑战,需通过虚拟孪生等技术实现早期测试与集成。

实施挑战与方法:

  • 预测不确定性与优化自由度:设计初期自由度高,优化潜力大;随流程推进,自由度减少,信息不确定性(“噪声”)限制了优化深度。工程师需判断何时达到当前阶段的优化极限,并推进至下一步。
  • 精度与计算成本的权衡:早期设计依赖代理指标(如线载模型),随流程推进逐步转向更精确的仿真。模型精度是关键,否则“垃圾进,垃圾出”。同时需权衡仿真精度与可承受的计算资源。
  • 自上而下的系统思维:需从应用需求出发,进行系统级探索,逐步细化至硬件组件,而非从底层硬件开始逆向设计。系统级架构决策决定了绝大部分的功率与性能表现。
  • 跨领域协作与标准化:变革需要半导体、封装、PCB、机械及软件等不同领域团队协同,这些领域传统上方法各异。推动流程标准化(尤其在chiplet层面)是关键。

行业共识与展望: 尽管“左移”备受关注,但其本质是一场更广泛的、将系统工程与半导体开发融为一体的转型。这不仅是技术革新,也要求组织结构调整、新工具与方法论证明其价值。变革不会一蹴而就,需要重建整个设计流程,最终目标是实现从系统概念到物理实现的、涵盖硬件与软件的全链路优化。早期阶段需接受基于现有知识的“防护带”设计,并随着知识积累逐步放松限制,以释放更多性能。

22. Bit-twiddling optimizations in Zed's Rope (zed.dev)

文章概述

本文介绍了 Zed 编辑器如何通过对底层数据结构(Rope)进行位操作优化,显著提升了性能,特别是 offset_to_point 方法的速度。

核心优化:加速点坐标转换

  1. 问题背景

    • Zed 的 Rope 实际上是一个 B 树结构(SumTree),其叶子节点是 128 字节的字符串块(Chunk)。
    • offset_to_point 是一个高频调用的方法,用于将字符串的字节偏移量转换为对应的行号和列号(Point)。
    • 原始的实现方式是循环遍历 Chunk 中的每个字符来统计换行符(\n),以确定行号。这在频繁调用时效率较低。
  2. 优化思路

    • 不再每次调用时都循环遍历,而是预先对每个 Chunk 建立一个位掩码索引
    • 利用一个 u128 整数(128位)来标记 Chunk 中每个字节位置是否包含特定字符(如换行符)。
    • 对于换行符,对应位设为1,否则为0。
  3. 实现细节(以换行符索引为例)

    • 构建索引:遍历一次 Chunk,将换行符位置对应的比特位设置为1,得到一个 newlines 掩码。
    • 使用索引转换偏移量
      • 计算行号(Row):创建一个掩码,仅保留从起始位置到目标偏移量之间的比特位。然后将此掩码与 newlines 掩码进行按位与操作,并统计结果中1的个数(count_ones())。这个数即为行号。
      • 计算列号(Column):找到目标偏移量之前最后一个换行符的位置(利用 leading_zeros() 等位操作指令快速定位)。列号即为目标偏移量与该位置之差。
    • 关键优势count_ones()leading_zeros() 等操作可直接映射为单条CPU指令,无需循环和分支,实现了无分支编程,极大提升了执行速度。
  4. 性能提升

    • 基准测试显示,优化后的掩码版本比原始循环版本快 57 倍(从约 57 纳秒降至约 1 纳秒)。
    • 在实际应用中,该优化使得 point_to_offset 方法的吞吐量提升了 250%,速度提高了 70%

后续优化:索引制表符

  1. 新挑战:除了换行符,制表符(\t)的处理也影响性能,且其显示宽度不固定(取决于配置的制表符宽度和上下文)。
  2. 同样方案:受到换行符索引的启发,在 Chunk 结构中新增了一个 tabs: u128 字段,用同样位掩码的方法来索引制表符的位置。
  3. 当前状态:在配套的配对编程会话中已完成此索引字段的添加,但还未将其集成到更上层的渲染逻辑中。这部分工作将在后续进行。

总结

Zed 团队通过引入基于 u128 的位掩码索引,将原本需要循环和分支判断的字符串属性查询(如换行符位置),转化为高效的位操作指令,从而大幅优化了其核心数据结构 Rope 的热点方法性能。该技术已成功应用于换行符索引,并正扩展至制表符索引。文章配套视频展示了完整的实现过程。

23. The tragedy of running an old Node project (abdisalan.com)

运行旧版Node项目的悲剧

作者在时隔近4年后尝试重新运行其使用Gatsby框架搭建的网站项目时,遇到了一系列复杂的依赖和环境问题。

主要挑战

  • 依赖问题:项目有超过41个直接依赖及大量子依赖,删除node_modules后重新安装仍失败。
  • 编译工具链错误
    • 安装过程要求存在Python2,作者不得不通过pyenv安装以避免影响系统Python3环境。
    • 随后出现C++编译错误,提示std::remove_cv_t未定义,表明原生扩展(通过node-gyp)需要C++14标准支持,但当前环境不满足。

根本原因与解决

  • Node版本不匹配:作者当前使用Node v16,但项目最初可能基于更旧版本开发。
  • 版本查找困难package.json未指定engines字段,无法直接确定历史使用的Node版本。
  • 问题解决:通过参考GitHub issue中类似的C++编译错误案例,回退到Node v12后,依赖安装成功。

总结

整个调试过程耗费约两小时,凸显了长期未维护的Node项目在面对快速演进的生态(Node.js版本、原生依赖工具链)时,可能因环境依赖(Python2、旧版C++标准)和隐式版本约束而难以复现。作者最终因疲惫中断了工作。

24. Joint Declaration by Ministers of Germany, France, Poland, Italy, Spain, UK (www.auswaertiges-amt.de)

联合声明要点概要

德法英意西及波兰六国外长及欧盟候任外交与安全政策高级代表今日在华沙会晤,共同发表联合声明,核心内容如下:

一、 安全威胁共识

  • 俄罗斯构成核心挑战: 声明明确指出,俄罗斯正在系统性地攻击欧洲安全架构。其针对乌克兰的侵略战争已持续1000天,造成数千人死亡,并屡次违反国际法。
  • 俄罗斯的侵略性与依赖性: 俄罗斯的“鲁莽修正主义”及拒绝停止侵略和进行有意义谈判的行为,对欧洲及跨大西洋地区的和平、自由与繁荣构成挑战。俄罗斯为维持非法战争,日益依赖伊朗和朝鲜等伙伴。
  • 混合威胁升级: 俄罗斯针对北约和欧盟国家的混合活动在规模和种类上史无前例,造成重大安全风险。

二、 应对措施与承诺 面对上述挑战,六国承诺团结一致,共同应对:

  1. 强化北约基石作用: 重申强大团结的北约是欧洲防务与安全的基石,强调坚定的跨大西洋纽带、共同防御承诺以及公平的负担分担。
  2. 增加防务开支: 各国承诺增加安全与防务支出,达到并可能超过占GDP 2%的目标,以应对日益增长的威胁。
  3. 加强欧洲防务能力: 利用包括欧盟经济与金融实力在内的所有杠杆,强化欧洲国防工业基础,讨论创新融资,消除防务贸易与投资障碍。
  4. 投资关键军事能力: 重点投资于防空、精确远程打击、无人机、综合物流以及关键基础设施和网络防御,并加强研发与新技术应用。
  5. 提升抵御混合威胁能力: 增强应对认知战和混合威胁的韧性,维护社会韧性。
  6. 加大对乌支持: 进一步加大对乌克兰的军事、经济和财政支持,欢迎七国集团(G7)提供的500亿美元贷款,以确保乌克兰拥有充足资源。
  7. 坚持支持公正持久和平: 支持基于《联合国宪章》的公正持久和平,强调任何和平谈判必须有乌克兰参与,并有欧洲、美国及G7伙伴支持,同时确保侵略者为其违法行为承担后果。
  8. 持续威慑俄罗斯: 继续威慑俄罗斯,阻碍普京维持侵略战争的能力,并通过限制性措施遏制俄罗斯军事能力的扩张。

三、 未来方向

  • 重申致力于建立基于《联合国宪章》和欧安组织原则的欧洲安全架构。
  • 强调欧盟成员国之间更紧密一体化、欧盟与英国更紧密合作、以及北约与欧盟加强协调的重要性。
  • 认为当前是巩固跨大西洋关系、通过加强北约和确保联盟内公平负担分担来更新与美国关系基础的独特机会。
  • 最终目标是确保欧洲公民生活在和平、自由与繁荣之中。
25. A Walk with LuaJIT (www.polarsignals.com)

本文档详述了为 LuaJIT 实现一个通用、零插桩、基于 eBPF 的性能分析器的完整技术历程。

LuaJIT 技术特点与挑战

LuaJIT 是一个高性能的 Lua 实现,其核心在于追踪式(trace-based)即时编译器(JIT)。与传统基于方法的 JIT 不同,它会录制频繁执行的循环路径(“trace”),并将其编译为高度优化的机器码。这种设计能带来巨大性能提升,但也引入了 “trace 爆炸” 的风险。此外,LuaJIT 拥有一个用 DynASM 生成的高度优化的汇编语言解释器,以及强大的 FFI 支持,允许 Lua 与 C 代码高效互调。

传统分析工具的局限

  • perf: 无法正确回溯 JIT 生成的代码栈帧,因为 LuaJIT 未生成栈指针信息。
  • GDB: 默认情况下会因无法解析 JIT 代码而混淆。需编译 LuaJIT 时启用 LUAJIT_USE_GDBJIT 选项(通常生产环境未开启)。
  • LuaJIT 内置分析器: 基于钩子(hook)而非中断,工作时需重新生成所有 JIT 代码以插入检查点,无法满足零插桩需求。
  • DWARF 信息: LuaJIT 的外部 unwind 支持依赖于特定编译选项且结构复杂,不可靠。

零插桩分析器实现方案

目标是不修改或重启目标进程,同时准确分析解释器执行和 JIT 编译的代码。

1. 识别代码边界

  • 解释器: LuaJIT 的解释器并非一个函数,而是一个大型的、用 DynASM 生成的汇编代码块。分析器通过检查进程的 .eh_frame 调试信息(未剥离时)来定位这个代码块的地址范围。
  • JIT 代码: 首次遇到匿名可执行内存区域时,记录其整个虚拟地址范围。之后通过用户态程序远程访问 LuaJIT 内部数据结构,精确获取每个 trace 的机器码边界和栈调整(spadjust)值。

2. 获取执行上下文

每个 Lua 状态机(实例)有全局状态 G 和当前线程状态 L

  • 解释器上下文: L 指针位于当前栈指针的固定偏移处。
  • JIT 上下文: JIT 代码通常使用寄存器(如 x86-64 的 r14)存放指向调度表(dispatch table)的指针。分析器通过分析 lj_dispatch_update 函数的机器码,动态计算从调度表地址到 G 指针的偏移量。对于已知 trace,上下文指针直接存储在 eBPF 的最长前缀匹配(LPM)树中。

3. 栈回溯

  • 分析器维护一个 eBPF 的 LPM 树,将程序计数器(PC)映射到对应的栈调整值和上下文指针。
  • 当采样触发时:
    1. 判断 PC 位于解释器还是 JIT 代码区域。
    2. 对于 JIT 代码,从 LPM 树中获取栈调整值,修正栈指针以正确回溯到调用者。
    3. 遍历 Lua 调用栈(通过 L->baseL->stack 等字段)。
    4. 遇到 FFI 回调时,切换回原生栈回溯。
  • 每个 Lua 栈帧记录当前 PC、从字节码起始的偏移、调用者 PC 及其偏移,以便在用户态重构调用链。

4. 符号化与元数据

eBPF 程序仅收集最小必要数据(PC、GCproto地址等)并发送至用户态。用户态程序:

  • 通过 GCproto 结构获取源文件名和行号信息。
  • 通过分析调用点的字节码来推断被调用函数的名称。

系统架构与动态更新

  • 内核态(eBPF): 负责高效的栈采样和最小数据传递。
  • 用户态: 负责复杂的元数据提取、符号化和同步 LuaJIT 的 trace 映射。
  • 当 eBPF 检测到 PC 在匿名可执行区域但未命中 LPM 树中的具体 trace 时,会触发用户态重新同步 LuaJIT 的 trace 信息。

总结

该方案通过结合 eBPF 的高效采样与对 LuaJIT 内部机制的深度理解(包括解释器代码结构、JIT trace 管理、上下文指针定位和混合栈回溯),成功实现了一个无需插桩、适用于生产环境的通用 LuaJIT 性能分析器。整个过程涉及大量逆向工程和动态分析工作。

27. How to Build a Chess Engine and Fail (obrhubr.org)

如何构建一个国际象棋引擎并失败

构建国际象棋AI是软件工程师的常见项目,近年来该领域有显著发展。现代引擎主要分为两类:快速探索棋局可能性(如Stockfish)和使用复杂神经网络进行评估(如Leela Chess Zero)。Stockfish通过集成NNUE(一种高效神经网络)作为评估函数,取代了传统基于规则的评估方式,体现了“苦涩的教训”。

作者参加了一个代码长度限制为1024个令牌的编程比赛,这禁止了使用复杂神经网络。因此,大多数参赛者选择优化搜索算法。然而,作者尝试了一种创新方法:借鉴NNUE的思想,创建一个简化的、可训练的评估函数。

核心思路与实现

  1. 评估函数设计:作者计划使用棋子-位置表,即为每种棋子(兵、马等)在棋盘每个格子上赋予权重。评估时,将棋盘位图与对应权重矩阵相乘并求和,最终通过双方棋子总价值之差得出评估分数(类似Stockfish格式)。这种方法旨在将强大引擎的知识“蒸馏”到有限数据中。

  2. 训练方法:由于代码空间限制,无法使用反向传播等复杂技术。作者采用了遗传算法进行训练:

    • 用合理范围内的随机数初始化模型权重。
    • 使用从Lichess对局记录中提取的、带Stockfish评估分数的棋局数据集作为适应度函数。
    • 通过变异和选择,迭代数百代,以找到评估结果与Stockfish评估最接近的模型。

失败的原因

训练结果令人失望,评估效果不佳。主要原因如下:

  • 信息压缩过度:将Stockfish NNUE(约50MB)的知识压缩到仅24,576个权重值,损失过大。
  • 缺乏关键上下文:简化的模型无法考虑棋子间的相对位置关系(例如,皇后在c6格的价值,取决于它是被兵吃掉还是将杀对手,而模型无法区分)。这是导致评估质量低下的根本原因。

Stockfish NNUE 如何解决上下文问题

Stockfish的NNUE通过以国王位置为参考系来解决上下文问题:

  • 输入层非常庞大(约2x45,056个输入节点)。
  • 对于当前方的每一个可能的国王位置,网络考虑了其他所有11种棋子类型在64个格子上的所有可能组合。
  • 这种架构为网络提供了必要的位置上下文,并且当国王未移动时,更新高效(仅需更新单个输入节点)。

作者推测,NNUE中可能存在未使用或影响较小的输入节点(如兵走到后方不可达的位置),理论上可以进行“剪枝”以简化网络,但仍需远超1024个令牌的容量。

调试与优化技术

文章还分享了构建和调试引擎的实践经验:

  • 调试仪表板:通过监控搜索深度、遍历节点数、置换表内存使用等信息,并将状态输出到JSON文件供服务器实时显示,有助于定位问题,尤其是分析引擎的思考路径。
  • 关键优化算法
    • 置换表:缓存已计算过的棋局最佳走法,避免重复计算。
    • 静默搜索与搜索扩展:当棋局处于激烈交换时,扩展搜索(尤其是吃子走法)直至局面稳定,以获得更准确的评估。
    • 时间管理与提前退出:平衡思考时间至关重要,尤其是在终局阶段需要计算足够深度来寻找将杀,但又不能过度消耗中局时间。这是引擎设计中的难点。
28. Illegally logged wood from Cambodia likely ending up in U.S. homes (news.mongabay.com)

根据调查,来自柬埔寨雨林的非法采伐木材可能正通过供应链流入美国家居产品中,尤其是地板。调查重点聚焦于柬埔寨西哈努克经济特区内为美国市场生产家具和工程木地板的公司。

  • 核心涉事公司:中资企业Nature Flooring (Cambodia) 被指从柬埔寨公司Angkor Plywood采购胶合板芯材。Angkor Plywood曾被指控从包括Prey Lang野生动物保护区在内的受保护区域非法伐木。
  • 供应链争议:Nature Flooring管理层翻译声称木材来自Angkor Plywood在干丹省的桉树和相思树种植园,但承认公司员工从未实地考察过该种植园。以往调查指出,Angkor Plywood在干丹省并无种植园,仅有一个工厂。
  • 关联企业指控:Angkor Plywood的共同所有者之一也领导着Holy Plantation(原名Think Biotech)。尽管其声称在Prey Lang保护区附近的桔井省拥有木材种植园,但被指控严重依赖从Prey Lang保护区内部非法采伐的木材,而非种植园产出。
  • 行业反馈:木材行业内部人士指出,Nature Flooring“可能不清楚自己在销售什么”,木材的物种和来源检测极少。如果美国消费者知道自己购买的“绿色”家居产品实际上破坏了雨林,将会感到不满。
  • 公司历史问题:Nature Flooring在木材溯源方面存在过往问题。2017年,该公司因被指控采购巴布亚新几内亚和所罗门群岛的非法采伐木材而停止进口。
  • 母公司表态:其母公司Nature Home在网站上自称“绿色”公司。
  • 美国供应链环节:调查表明,Nature Flooring将来自Angkor Plywood的胶合板销售给美国制造商如Fine Flooring,后者是美国最大的木地板制造商AHF Products(总部位于宾夕法尼亚州)的子公司。
  • 美方回应:AHF Products在电子邮件声明中表示,“不使用任何非法采伐的木材产品”,并称其拥有“严格的供应商审查和合规计划”,任何相反的暗示“都不是事实”。

(总结自《柬埔寨伐木集团与美国主要木地板供应链的关联》一文,作者Gerald Flynn。)

30. Show HN: Rust library for numerical integration of real-valued functions (github.com)

Integrate 是一个轻量级 Rust 库,用于对实值函数进行数值积分,旨在通过各种数值方法高效地近似定积分。

支持的主要数值积分方法包括:

  1. Newton-Cotes 方法:矩形法则、梯形法则、辛普森法则、牛顿 3/8 法则。
  2. Gauss 求积方法:Gauss-Legendre、Gauss-Laguerre、Gauss-Hermite、第一类与第二类 Gauss-Chebyshev。
  3. 自适应方法:自适应辛普森法。
  4. Romberg 方法

使用注意事项:

  • 所有方法均假设被积函数在积分区间上连续,且误差估计通常要求函数具有相应阶数的可微性。
  • 使用前应检查:
    • 函数在积分区间内是否存在奇点(如跳跃间断点)。若有,可尝试分割区间并在各子区间分别积分,或利用分部积分消除奇点。
    • 函数是否剧烈振荡。若是,需将步长设置为小于函数波长,或分割区间进行积分。
  • 若存在无法消除的奇点,可手动近似奇点邻域的积分,并将区间分割为可进行数值积分的子区间。

安装方法:Cargo.toml 中添加依赖:

[dependencies]
integrate = "0.1.11"

贡献与许可: 欢迎通过提交 Issue 或 Pull Request 参与贡献。项目采用 MIT 许可证,提交 PR 即视为同意该许可条款。

32. DNA testing company vanishes along with its customers' genetic data (www.malwarebytes.com)

DNA检测公司Atlas Biomed消失,客户基因数据下落不明

一家承诺为客户提供基因信息洞察的DNA检测公司Atlas Biomed突然消失。该公司伦敦办公室关闭,电话无人接听,客户无法再访问其在线检测记录。该公司所有社交媒体账号自2023年以来未更新,其官网域名atlasbiomed.com也已失效。

数据困境与潜在风险

客户此前只能在线查看检测结果,无法下载。公司消失后,他们不仅无法查看数据,更不清楚这些敏感数据的下落。尽管尚无证据表明数据被滥用,但客户普遍担忧数据的访问权归属,尤其是调查揭示该公司可能与俄罗斯存在关联。公司八名高管中,四名已辞职,剩余两名注册地址在莫斯科,该地址与一位已辞任的俄罗斯亿万富翁董事地址相同。

行业安全警告:过往事件与普遍担忧

Atlas Biomed事件并非孤例,DNA检测行业过去已多次出现安全与信任危机:

  • 2018年:MyHeritage发生安全事件,9200万用户的邮箱和哈希密码遭泄露。
  • 2020年:基因检测公司Ancestry被投资公司黑石集团以47亿美元收购,引发关于基因数据商业化及所有权转移的担忧。
  • 2023年:23andMe公司因撞库攻击导致多达700万客户信息在暗网被售卖。此后公司董事会成员几乎全部辞职,CEO坚持将公司私有化,再次引发客户数据在公司易主后命运的质疑。

基因数据的特殊敏感性

文章指出,DNA测试的普及使许多人盲目参与,并未充分理解其中风险。基因数据极其敏感,一旦与个人身份信息关联,可能成为广告商、保险公司和制药公司的宝贵目标。即便公司初衷良好,数据泄露风险始终存在,可能导致个人健康保险被拒、收到定向广告,甚至遭遇种族剖析等更严重的后果。

监管与自我保护建议

英国信息专员办公室(ICO)已确认收到针对Atlas Biomed的投诉,并强调“人们有权期望组织以安全、负责任的方式处理其个人信息”。为保护自身权益,公众应注意:

  1. 提交基因材料前,彻底调查受托公司。
  2. 仅提供必要个人信息,可考虑使用专用邮箱进行注册。
  3. 熟悉公司隐私政策,尽可能选择退出数据共享,并关注政策变更。
  4. 认识到将基因数据交予他人的潜在长远风险,包括健康保险、就业歧视、身份盗窃乃至被政府用于种族监控的可能性。

文章最终提醒读者,网络安全威胁不容忽视,并建议通过使用安全软件来保护设备。

33. A joke in approximating numbers raised to irrational powers (www.andreinc.net)

该HTML页面是一个重定向页面,旨在将用户自动导向指定URL(https://andreinc.net/2024/11/18/a-joke-in-approximating-numbers-raised-to-irrational-powers/)。页面结构简单,仅包含头部(head)部分,没有可见的身体内容。头部中定义了页面标题为该URL字符串,并设置了canonical链接以指向目标地址。关键功能通过元刷新标签(meta http-equiv="refresh")实现,其中content属性设置为"0; url=...",表示零秒延迟后立即重定向,从而确保用户无需交互即可跳转。这种设计常用于处理旧链接或维护URL一致性,但实际文章内容未在此页面中提供,需访问目标URL获取详情。

34. Sequin: A powerful little tool for inspecting ANSI escape sequences (github.com)

Sequin:用于检查ANSI转义序列的强大工具

核心功能 Sequin 是一个小型实用程序,主要用于:

  • 调试 CLI(命令行界面)和 TUI(终端用户界面)
  • 解释和描述不熟悉的转义序列
  • 探索 TUI 底层工作原理,例如检查使用 teatest 等工具生成的黄金文件中的 ANSI 序列。

安装方式 支持多种主流系统与包管理器:

  • macOS / Linuxbrew install sequin
  • Arch Linuxyay -S sequin-bin
  • Nixnix-shell -p sequin 或从 NUR 安装。
  • Debian/Ubuntu:通过添加 Charm 仓库并使用 apt 安装。
  • Fedora/RHEL:通过添加 Charm 仓库并使用 yum 安装。
  • 其他方式:提供多种格式的安装包(Debian、RPM),以及适用于 Linux、macOS、Windows 等系统的二进制文件。也可通过 go install github.com/charmbracelet/sequin@latest 直接安装。

使用示例

  1. 解释转义序列:通过管道将 ANSI 字符串输入 sequin
    printf "\x1b[38;5;4mCiao, \x1b[1;7mBaby.\x1b[0m\n" | sequin
    
  2. 检查程序输出:用于查看 lsgit 等命令的颜色化输出。
    ls -1 --color=always | sequin
    git -c status.color=always status -sb | sequin
    
  3. 检查黄金文件:直接查看包含 ANSI 序列的 TUI 测试输出文件。
    cat ./testdata/MyCuteApp.golden | sequin
    
  4. 原始序列语法高亮:使用 --raw-r 标志在行内高亮显示序列,便于阅读。
    git -c status.color=always status -sb | sequin -r
    

工作原理与状态

  • Sequin 依赖于 Charm 项目的 ansi 包,通过遍历字符串,以易读的方式打印序列及其作用。
  • 当前状态:尚不完整。已支持常见序列,但APC 等序列仍不支持。欢迎提交 PR 贡献。

常见问题

  • 终端背景色问题(使用 multiplexer 时)
    • Tmux:确保版本 ≥ 3.4,并在配置中正确设置 default-terminalCOLORTERM
    • GNU Screen:确保版本 ≥ 4.99.0,并在配置中正确设置 termCOLORTERMdefbce on

其他信息

  • 许可证:MIT
  • 所属项目:Charm
35. Traits are a local maximum (thunderseethe.dev)

Rust Traits 的局限性探讨

文章围绕 Rust 中的 Traits 这一核心特性展开,分析了其作为成熟设计所面临的根本性问题,并探讨了以 Implicits(隐式)和 局部一致性 为核心概念的替代方案及其权衡。

一、Traits 的核心问题:孤儿实例

Traits 的主要设计约束是全局一致性,即对于任意一个类型 T 和一个 Trait Trait,在整个程序中必须存在且仅存在一个 impl Trait for T 的实现。这导致了著名的“孤儿实例问题”。

问题示例

  • 如果你的 crate 需要为来自 a_crate 的类型 A 实现来自 b_crate 的 Trait BTrait,这将违反规则,编译会报错。
  • 解决方法通常是创建一个新类型(例如 struct A2(A);),在你的 crate 中为 A2 实现 Trait,但这带来了额外的包装和解包装开销。

问题的根源: 允许在任意 crate 中自由添加实现会导致实现冲突。例如,frobinate 库和 swizzle 库都为同一个外部类型实现了同一个 Trait,那么依赖它们的下游用户就会陷入两个冲突实现的困境,编译器无法安全地自动选择其一。因此,为了保证程序的一致性(编译器可以任意选择实现而行为不变),Rust 强制要求实现必须位于定义类型或 Trait 的 crate 中。

二、解决方案的构想:局部一致性

作者认为全局一致性是一个“局部最大值”(一个不错但非最优的设计),并提出了“局部一致性”作为更优的愿景:允许在不同的作用域内存在同一个 Trait 对同一个类型的多个实现,只要这些作用域互不干扰。

概念与现有实践: 这并非新概念,它在其他语言中被称为 Implicits(如 Scala, OCaml 模块化隐式, Lean, Agda)。这些系统试图解决类似的问题,但各自面临挑战:

  • OCaml 的模块化隐式尚未完全实现。
  • Scala 的隐式在稳定性和编译器行为可预测性上存在问题。

三、一个具体的实现方案:COCHIS

文章重点介绍了论文《COCHIS: Stable and Coherent Implicits》提出的理论框架,它定义了一种小型函数式语言,通过三个核心结构实现 Implicits:

  1. 查询 (?T):在词法作用域中查找最近一个类型为 T 的隐式值。
  2. 规则函数 (|?T| <body>):在 <body> 作用域内绑定一个类型为 T 的隐式值。
  3. 规则应用 (<implicit> with <argument>):为规则函数提供一个具体值。

COCHIS 如何模拟并改进 Traits

  • 实现复合 Trait:通过规则函数可以依赖其他隐式值,从而组合出新的实现(例如,为元组 (A, B) 实现 Ord 需要先有 ABOrd 实现)。
  • 保证一致性:基于词法作用域,离查询最近的隐式值会被选中,作用域清晰。
  • 保证稳定性:通过特定规则排除会导致编译器行为(如内联)影响程序结果的模糊情况。

优势

  • 彻底解决了孤儿实例问题:不同库可以为同一类型在各自作用域内提供不同的 Trait 实现,互不冲突。
  • 实现方式更显式,需要手动将实现值“安装”到作用域中,而不是依赖全局查找。

四、Implicits 的权衡与挑战

尽管 Implicits 解决了全局一致性的核心痛点,但它引入了新的复杂性和权衡:

  1. 代码重复

    • 为了在不同作用域使用同一套实现,需要重复安装或设计复杂的抽象机制(如模块导出、默认导入),这增加了设计难度和概念负担。
  2. 正确性保证的挑战

    • 对于像 Setunion 这样的操作,Traits 天然保证两个集合使用相同的排序逻辑。而 Implicits 中,无法静态保证两个 Set 实例使用了同一个 Ord 实现,可能导致运行时错误。解决方案(如将实现值参数化)又会带来新的类型系统复杂性。
  3. 代码可读性与工具链依赖

    • 实现可能存在于代码的任何地方,定位一个 Trait 方法的具体实现变得更困难,高度依赖 IDE 工具。
    • 这不如 Traits 那样规则清晰(实现只存在于两个特定 crate 中)。

结论

文章最终指出,Traits 的全局一致性设计是一个局部最大值,而以 Implicits 和局部一致性为代表的方案试图攀登更高的山峰。然而,新方案本身也可能只是另一个局部最大值。语言设计本质上是在全局一致性与灵活性、静态安全与表达能力、简洁性与可组合性之间进行权衡。Implicits 解决了 Traits 的孤儿实例问题,但引入了关于重复、正确性和工具链依赖的新挑战。作者认为,尽管存在这些挑战,探索局部一致性和 Implicits 方向仍是值得的,因为它为更灵活、可扩展的语言设计指明了路径。

36. OCaml Syntax Sucks (2016) (xahlee.info)

OCaml 语法批评

文章主要批评了 OCaml 的 let 语法在嵌套时缺乏清晰的可读性。具体问题包括:

  1. 嵌套 let 难以阅读let ... = ... in ... 语法在嵌套使用时,无法直观判断其嵌套结构。文章提供了一个示例代码,展示了多层 let 嵌套导致代码可读性差。

  2. 语法一致性带来的混淆

    • 全局声明与局部声明(let ... = ...let ... = ... in ...)使用相同语法,但作用域不同,缺乏明确的边界标识(如括号)。
    • 函数定义也使用相同的 let 语法(例如 let a = ...let a b = ...),导致源码中不同用途的 let 结构混合,进一步增加阅读难度。
  3. 历史渊源与设计局限:OCaml 的语法继承自 ML,而 ML 的语法灵感来源于 ISWIM 语言。这种设计是一种混合英语和数学记号的独特风格,其清晰性在实践中受益于代码换行和缩进,而非依赖像 ML 中 “end” 关键字这样的显式结尾标记。

  4. 可能的改进方向:文章指出,如果坚持 OCaml/ML 风格,改进 let 语法很困难。如果不坚持此风格,有两种明显的替代方案:采用 Lisp 语法或 C 语言家族语法。文中提到了 Facebook 的 Reason 项目作为示例,它旨在用类似 JavaScript 的语法来编写 OCaml 代码。

37. Three hundred words you can spell on a calculator [pdf] (www.mathsquad.com)

本文标题为“Three hundred words you can spell on a calculator [pdf]”,其主要内容探讨了如何利用计算器按键上的字母与数字的对应关系(例如将计算器倒置,数字形似特定字母)来“拼写”出单词。文章的核心目的是提供一份包含300个此类单词的列表。

然而,所提供的“文章内容”实际上并非可读的文本,而是PDF文件的二进制数据或内部结构代码。其中混杂着大量乱码、PDF对象声明(如objstreamendobj)、流数据、交叉引用表以及文件尾(trailer)等元数据。仅能识别出零星片段,如“True”、“Microsoft® Office Word 2007”、“Jim Bennett”以及日期“2016-01-20”,这些信息表明该PDF可能由Microsoft Word 2007生成,作者为Jim Bennett,创建于2016年1月20日。

因此,虽然文章标题明确指向一个具体的主题,但所提供的实际内容完全由文件结构数据构成,无法从中提取出关于那300个计算器单词的具体信息。

38. Extending the context length to 1M tokens (qwenlm.github.io)

文章标题: 扩展上下文长度至100万token

核心内容: 本文介绍了通义千问团队发布的Qwen2.5-Turbo模型,其核心升级是将上下文长度从128k大幅扩展至1M tokens。

主要特性与优势:

  1. 超长上下文支持:
    • 可处理约100万英文单词或150万中文字符,相当于10本长篇小说、150小时的语音转录或30,000行代码。
    • 性能: 在1M长度的“Passkey Retrieval”任务中实现100%准确率;在长文本基准测试RULER上得分93.1,超越GPT-4(91.6)和GLM4-9B-1M(89.9)。同时,其短序列能力与GPT-4o-mini相当。
  2. 更快的推理速度:
    • 通过稀疏注意力机制,将处理1M tokens上下文的首个token时间从4.9分钟缩短至68秒,提速4.3倍。
  3. 更低成本:
    • 价格保持每百万token 0.3元。在相同成本下,Qwen2.5-Turbo可处理的token数量是GPT-4o-mini的3.6倍。

应用场景与使用方式:

  • 演示示例: 展示了其在深度理解长篇小说(如《三体》三部曲,69万tokens)、代码仓库级助手、阅读多篇论文等场景的能力。
  • API调用: 兼容OpenAI API格式,可通过阿里云灵积(DashScope)的API服务使用,并提供了简单的Python代码示例。

性能评测详情:

  • 长文本任务: 在RULER、LV-Eval、LongBench-Chat等多个长文本基准测试中表现优异,多数维度超越GPT-4o-mini。
  • 短文本任务: 在扩展上下文长度的同时,有效保持了短文本理解能力,在大多数短文本基准测试中显著优于其他支持1M上下文的开源模型,性能与GPT-4o-mini及Qwen2.5-14B-Instruct模型相当。
  • 推理加速: 在不同硬件配置下,通过压缩注意力计算约12.5倍,实现了3.2至4.3倍的加速。

未来展望: 团队承认当前模型在解决真实应用中的长序列任务时表现仍不稳定,且推理成本限制了更大模型的使用。未来将致力于优化长序列任务的人类偏好对齐、提升推理效率,并探索推出更强大的长上下文模型。