2024-08-23

31 篇热帖

1. Show HN: InstantDB – A Modern Firebase (github.com)

InstantDB 摘要

InstantDB 是一个现代后端即服务(BaaS)平台,旨在简化现代应用开发,尤其适合 AI 编码的应用。它提供了一整套功能,包括身份验证、权限管理、数据存储、在线状态(presence)和实时流(streams),目标是帮助开发者快速构建用户喜爱的应用。

核心功能与优势

  • 关系查询与实时同步:开发者可以用类 GraphQL 的 InstaQL 语言编写关系查询,声明式地获取所需数据。InstantDB 会自动处理数据获取、权限校验和离线缓存。所有查询默认支持多人实时协作。
  • 乐观更新与自动回滚:当数据变更时,平台会自动处理乐观更新(optimistic updates),并在冲突或错误时回滚。
  • 临时状态支持:支持如光标位置、谁在线等临时数据。
  • 多平台 SDK:提供 JavaScript、React 和 React Native 的 SDK。

代码示例

文章展示了一个极简的实时聊天应用示例(约 12 行代码),体现了其简洁性:通过 useQuery 读取数据,通过 transact 写入数据,界面自动响应更新。

构建动机

传统开发流程涉及设置数据库、缓存、ORM、端点、客户端状态管理等,且添加多人协作和离线支持会进一步增加复杂度。InstantDB 认为这些本质上是数据库问题,因此提出将数据库置于客户端的理念。开发者只需编写查询,无需关心存储、选择器、端点或本地缓存。多人协作和乐观更新等功能由平台内置支持,让开发者专注于用户体验。

架构概览

  • 数据存储:所有用户数据以三元组形式存储在一个大型 Postgres 数据库中。多租户架构支持永不暂停的免费层。
  • 同步服务器:使用 Clojure 编写,与 Postgres 通信。查询引擎支持 Datalog 和 InstaQL。
  • 变更检测与推送:通过跟踪 Postgres 的预写日志(WAL)来检测数据变化并使相关查询失效,灵感来自 Asana WorldStore 和 Figma LiveGraph。
  • 客户端存储:客户端有一个三元组存储,SDK 会将近期查询缓存到 Web 端的 IndexedDB 或 React Native 的 AsyncStorage。
  • 权限系统:所有数据操作都通过基于 Google CEL 库的权限系统进行校验。

开始使用与贡献

  • 入门:在官网 instantdb.com 注册,可在5分钟内创建一个功能应用。
  • 社区:有 Discord 社区提供支持。
  • 贡献:可通过 Discord 介绍自己,阅读客户端和服务器端的 README 文件了解本地启动和开发流程。

总之,InstantDB 是一个旨在抽象后端复杂性的现代化 BaaS,通过客户端数据库和实时查询引擎,让开发者能更专注于前端交互和用户体验的快速迭代。

2. 17-Year-Old Student Exposes Germany's 'Secret' Pirate Site Blocklist (torrentfreak.com)

17岁学生揭露德国“秘密”盗版网站封锁名单

事件背景

德国多家互联网服务提供商(ISP)根据与版权持有人的自愿协议,对部分知名盗版网站实施封锁。该协议通过“互联网版权清理机构”(CUII)执行,其运作特点为:封锁决定公开,但被封锁的具体域名、申请方及相关审查员信息均被隐去。这种保密性被写入协议,官方认为其行动不构成审查,仅针对“结构性侵权”域名。

学生行动

一名17岁德国学生达米安因不满信息不透明,与朋友通过DNS解析测试等技术手段,筛查并整理出被封锁域名,创建网站“CUIIliste.de”公开全部名单。该网站指出,CUII官方仅公布21项封锁建议且隐去域名,而实际封锁域名达275个(含子域名)。去重后,独立域名数量为104个,涉及影视、音乐、体育直播、影子图书馆(如Sci-Hub)等网站。

争议焦点

  • 透明度缺失:记者和监督方无法核实封锁是否存在错误或过度,削弱了公众监督能力。
  • 审查性质疑:CUII以“无法院命令的私人组织”形式运作,其决策过程和标准缺乏公开性,被批评者视为变相审查。
  • 反抗措施:该网站不仅公开名单,还提供绕过封锁的方法(如更换DNS服务器),倡导信息自由。

意义与影响

该行动填补了官方信息空白,促使公众讨论网络封锁的透明度与合法性。尽管主流媒体关注度有限,但其揭示了德国在版权保护与信息透明之间的失衡,与其他提供完整封锁名单的国家(如乌拉圭)形成对比。

(注:文中列出了104个被封锁独立域名,此处略去详细列表。)

3. The journey of an internet packet: Exploring networks with traceroute (sebastianmarines.com)

数据包的网络旅程:使用traceroute探索网络

当连接服务器失败时,仅用ping测试可达性是不够的,因为它无法显示数据包在网络中的具体路径和故障点。互联网由路由器、交换机和计算机组成的复杂网络构成,数据包需经过多个路由器才能到达目的地,其中任何一个节点故障都可能导致连接中断。traceroute是一个强大的网络诊断工具,用于绘制数据包从源到目的地的完整路径,帮助定位问题。

数据包的基本路径

正常情况下,数据包从源主机出发,如果目标在同一网络则直接发送;否则先发送至默认网关(如ISP路由器)。随后,每个路由器根据其路由表决定是将数据包直接送达目标,还是转发给路径上的下一个路由器,此过程循环直至数据包抵达目的地。

traceroute的工作原理

traceroute通过利用IP数据包头中的生存时间(TTL) 字段来工作。TTL值限制了数据包可经过的最大路由器数量,初始值通常为64(在Linux和macOS中)。每经过一个路由器,TTL值减1。当TTL减至0时,路由器会丢弃该数据包,并向源地址发送一个ICMP超时消息

traceroute依次发送TTL值递增的ICMP回显请求数据包:

  1. 首先发送TTL=1的包。第一个路由器将其TTL减为0后丢弃,并返回超时消息,从而暴露第一个路由器的地址。
  2. 接着发送TTL=2的包。数据包经过第一个路由器(TTL减为1)后到达第二个路由器,第二个路由器将其TTL减为0并丢弃,返回超时消息,从而暴露第二个路由器。
  3. 此过程持续进行,直到数据包最终到达目标主机(TTL值在到达时仍未减至0),目标主机会返回一个ICMP回显应答消息。

traceroute为每个TTL值通常发送三个数据包,以测量并显示每个中间节点的响应时间(往返延迟)。

诊断网络问题

当路径中存在故障时(例如某个路由器配置错误或不可达),traceroute的输出会显示中断点。例如,前两个节点响应正常,但后续节点显示为星号(*),则表明问题发生在第二个节点与第三个节点之间。这使得网络管理员能够精确定位数据包丢失或延迟的环节。

ICMP协议的作用

traceroute依赖于互联网控制消息协议(ICMP) 来工作。ICMP用于网络设备间的通信和诊断,其关键消息类型包括:

  • 回显请求/回显应答:用于pingtraceroute测试连通性。
  • 超时消息:当数据包TTL耗尽时由路由器发送,这是traceroute路径发现的核心。
  • 目标不可达消息:当路由器无法将数据包送达最终目的地时发送。

总结

traceroute通过逐跳探测的方式,揭示了数据包穿越网络的全过程。它不仅显示了路径上的所有路由器(跳),还提供了每跳的延迟信息,是识别网络故障点(如丢包、高延迟)、发现非预期路由路径以及评估网络性能的必备工具,其价值远超只能判断目标是否可达的ping命令。

4. SurrealEngine: Open-source reimplementation of Unreal Engine with playable UT99 (github.com)

SurrealEngine:开源重新实现虚幻引擎,支持运行《虚幻99》

SurrealEngine 是一个旨在重新实现虚幻引擎1(Unreal Engine 1)的开源项目。其当前主要目标是让《虚幻》黄金版(Unreal Gold) 和**《虚幻竞技场》(Unreal Tournament,UT99)** 可以运行。未来项目范围可能会扩展,以支持更多使用虚幻引擎1的游戏。

当前状态

项目的最新进展请参考 Status.md 文件。

系统要求

  • 拥有您想要运行的虚幻引擎1游戏的原始拷贝。
  • 操作系统为 Windows 10 或更新版本,或现代的 Linux 发行版。
  • 显卡需支持 Direct3D 11 或 Vulkan。

构建方法

详细的构建说明请参考 Building.md 文件。

下载方式

  • 每夜构建版本可在项目的 Releases 部分获取。
  • 此外,SurrealEngine 也可通过以下 Linux 发行版的包管理器安装:
    • Arch:通过 AUR。
    • Nix:可通过包搜索或快速入门指南安装。

使用方法

  1. 运行 SurrealEngine 可执行文件。
  2. Folders 标签页中添加您想要运行的虚幻引擎1游戏目录。
  3. Games 标签页中选择要运行的游戏。
  4. 点击 Play

交流渠道

项目官方 Discord 服务器地址:https://discord.gg/5AEry4s

命令行参数

基本命令格式:SurrealEngine [--url=<地图名称>] [--engineversion=X] [游戏文件夹路径]

  • 如果未指定游戏文件夹路径,且可执行文件不在 System 文件夹内,引擎会尝试在注册表中搜索 Epic Games 原先设置的注册表键(仅限 Windows)。
  • 如果未指定 --url 参数,引擎将使用配置文件中的默认 URL(默认为游戏开场地图)。
  • --engineversion 参数会覆盖引擎内部检测到的版本号,通常仅用于调试目的。
6. Government report proves that we need to liberate the Postcode Address File (takes.jamesomalley.co.uk)

文章标题:政府报告证明我们需要解放邮政地址文件

内容摘要:本文探讨了英国邮政地址文件(PAF)的重要性及其私有化带来的问题。PAF是包含英国所有物理地址的关键数据集,广泛应用于地址自动填充、研究开发等领域,但其私有化后由Royal Mail管理,高昂的许可费用阻碍了创新和经济增长。

文章指出,早在2016年英国政府已意识到问题,并拨款500万英镑尝试创建一个无需依赖Royal Mail知识产权的开放地址数据库。军械测量局(OS)受命使用国家地址公报(NAG)等数据从头构建,但该过程面临巨大挑战:NAG数据混乱、未经标准化,且包含大量无关信息(如公用设施地址)。OS通过算法匹配地图矢量数据初步过滤,并人工核对部分数据,最终建立了超过2100万条地址记录的数据库。

然而,与使用PAF数据的AddressBase数据库相比,新数据库的准确率仅为90.8%,存在约290万个错误地址和420万个缺失或错误记录,尤其在处理复杂地址(如公寓楼、购物中心、机场)时问题突出。报告指出,要达到实用标准需人工核查420万个问题地址,耗时约5年半,成本未知且无法包含受Royal Mail版权保护的邮政编码。

文章总结,重建PAF不仅昂贵、耗时,且结果质量低下。研究证明,若想实现开放地址数据带来的创新与经济增长效益,唯一可行方案是政府收回PAF控制权并将其作为开放数据发布,而非尝试重建。

8. Vega – A declarative language for interactive visualization designs (vega.github.io)

Vega概述
Vega是一个可视化语法,一种用于创建、保存和共享交互式可视化设计的声明式语言。它允许用户使用JSON格式描述可视化的外观和交互行为,并通过Canvas或SVG生成基于Web的视图。

版本与核心功能
当前版本为6.1.2。Vega提供基本构建块,包括数据加载和转换、比例尺、地图投影、轴、图例以及图形标记(如矩形、线条、绘图符号等)。交互技术通过响应式信号指定,能够动态修改可视化以响应输入事件流。

规范格式与应用
Vega规范以JSON格式定义交互式可视化,由JavaScript运行时解析,生成静态图像或交互式Web视图。Vega为计算生成可视化提供了一种方便的表示方式,可作为新API和视觉分析工具的基础。

入门与相关工具
入门时,可查看教程、示例画廊和使用指南。对于快速创建常见统计图形,可使用Vega-Lite,这是一个基于Vega的更高级别语言。不熟悉JavaScript的用户可参考Altair Python API,它适用于Vega-Lite。

社区支持
如需帮助或分享示例,可加入Vega讨论论坛或Slack组织。

9. Python's Preprocessor (pydong.org)

文章内容主要介绍了如何利用Python的内置机制实现预处理器功能,挑战了“Python没有预处理器”的常见误解。

核心机制

  1. 源代码编码声明:通过PEP-0263,可在文件前两行使用魔法注释(如# coding=utf8)指定编码,也可自定义编解码器。
  2. 路径配置文件(.pth):放置于site-packages目录下,其中import语句会在Python初始化时执行,用于注册自定义编解码器。
  3. 自定义编解码器实现
    • 提供decode函数和IncrementalDecoder类。
    • 通过codecs.register注册搜索函数。
    • 需注意异常处理,避免晦涩的SyntaxError

应用示例

  1. 添加自增/自减运算符

    • x++++x等转换为基于赋值表达式(walrus operator)的等效Python代码。
    • 通过替换令牌流实现,例如(x, x := x + 1)[0]
  2. 花括号语法(Bython)

    • 移除INDENT/DEDENT令牌,将{转换为冒号并增加缩进,}减少缩进。
    • 保留字典的花括号语法。
  3. 解释C/C++代码

    • 利用#define指令匹配编码声明。
    • 结合cppyy库,将C/C++代码转换为Python可调用的形式。
  4. TOML数据验证

    • 将TOML文件转换为包含jsonschema验证逻辑的Python脚本。

实用工具

  • magic_codec:简化预处理器创建的工具包,只需定义preprocess函数即可扩展。
  • 相关项目:pythonql(查询语言扩展)、future-typing(类型提示回移)等。

结论

自定义编解码器与路径配置文件能显著改变Python解释器行为,虽示例多为演示,但该技术具备实际应用价值。

10. Claude's API now supports CORS requests, enabling client-side applications (simonwillison.net)

Anthropic 为 Claude 的 JSON API 启用了 CORS 支持,允许开发者从用户浏览器中直接调用 Claude 大语言模型。这项重大更新通过 TypeScript SDK 的一次代码提交引入。

核心功能与实现 要启用浏览器直接访问,只需在 HTTP 请求中加入特定头部: anthropic-dangerous-direct-browser-access: true

安全考量与适用场景 此前 Anthropic 一直不支持此功能,因为将 API 密钥嵌入客户端代码存在密钥泄露风险。该功能适用于受信任的内部工具,或允许用户使用自己 API 密钥的客户端应用模式。

实际应用示例 作者以自身项目“Haiku页面”为例,该应用原本需要通过代理服务器(如 Vercel)来支持跨域请求。更新后,应用可直接携带新请求头与 Anthropic API 通信,无需代理。简化后的 JavaScript 示例展示了如何从浏览器发起请求,包括设置必需的请求头、指定模型(如 claude-3-haiku)以及处理返回的诗歌内容。

12. Surfer: Centralize all your personal data from online platforms (github.com)

Surfer Protocol:集中管理您的在线个人数据

什么是Surfer Protocol?

Surfer Protocol 是一个用于导出个人数据的开源框架。您的个人数据分散在多个平台和应用中,而大型科技公司通常不会让您轻松访问自己的数据。无论您是希望创建一个能像您一样发消息的AI克隆、从科技巨头手中取回自己的数据,还是留下数字遗产,Surfer Protocol 都是解决方案。

主要功能与组件

目前,Surfer Protocol 包含以下部分:

  • 桌面应用程序:用于从您喜爱的应用和服务中导出数据。
  • Python SDK:用于基于您的个人数据构建应用程序。
  • 使用手册:提供示例,展示如何使用Python SDK构建应用。

当前支持平台

以下平台的数据可被导出:

  • iMessages
  • Twitter 书签
  • Notion
  • ChatGPT 历史记录
  • Gmail
  • LinkedIn 联系人
  • 即将支持:Reddit、GitHub、Discord、Spotify

工作原理

数据导出流程如下:

  1. 点击“Export”开始数据提取。
  2. 应用程序等待目标页面完全加载。
  3. 系统检查用户是否已登录要抓取的平台。
  4. 如未登录,提示用户登录。
  5. 登录后,应用程序与平台界面交互。
  6. 从平台抓取用户数据。
  7. 提取的数据被导出并保存到本地存储。

导出数据示例

导出的数据为JSON格式,包含平台信息、运行ID、时间戳和内容列表:

{
  "platform_name": "X Corp",
  "name": "Twitter",
  "runID": "twitter-001-1724267514217",
  "timestamp": 1724267623318,
  "content": [
    "Twitter Post 1",
    "Twitter Post 2",
    "Twitter Post 3"
  ]
}

如何开始

  • 下载应用:访问官方文档发布页面
  • 本地开发与贡献:请参阅贡献指南和设置指南。
  • 问题反馈:查看开放问题以获取已知问题和计划功能列表。

其他信息

  • 许可证:基于MIT许可证分发。
  • 技术栈:项目基于Electron和React Boilerplate构建。
  • 联系方式:通过Discord联系 @SahilLalani0, @JackBlair87, @T0M_3D。
  • 项目链接GitHub仓库
13. Generating Mazes (healeycodes.com)

迷宫基本概念

本文探讨了2D网格完美迷宫的生成方法。完美迷宫是指任意两个单元格之间存在且仅存在一条唯一路径(即均匀生成树)。单元格间的连接称为“边”,无边则为“墙”。迷宫生成始于完全断开的网格,通过“雕刻”边来连通单元格。

迷宫生成算法

文章介绍了三种自动化生成迷宫的核心算法:

  1. Aldous Broder 算法

    • 特点:代码实现最简单,能生成无偏迷宫(所有可能迷宫的生成概率均等),但效率较低,因为会重复访问已连通的单元格。
    • 逻辑:从随机单元格开始随机游走,若相邻单元格未被访问,则创建边并标记;无论相邻单元格是否被访问,均移动至该单元格,直至所有单元格都被访问。
  2. 随机深度优先搜索 (Random DFS)

    • 特点:每个单元格仅访问一次,效率较高。但存在“长走廊偏差”(路径倾向于单一方向延伸),因此不是无偏生成。
    • 逻辑:采用递归方式,从当前单元格随机选择一个未访问的邻居进行连通,并继续深度遍历。
  3. Wilson 算法

    • 特点:结合了前两者的优点,既无偏又不会重复访问已连通单元格。生成过程初期较慢,后期加速。
    • 逻辑:采用“循环擦除随机游走”。从未访问单元格开始随机游走,直至遇到已连通部分;若途中形成闭环,则擦除该环路段,最后将有效路径并入迷宫。

确定起点与终点

迷宫生成完成后,通过计算“树的直径”来寻找距离最远的两个点作为起点和终点。具体策略为执行两次广度优先搜索(BFS):

  1. 随机选择单元格 A,以 A 为根节点进行 BFS,找到距离 A 最远的单元格 B。
  2. 以 B 为根节点再次进行 BFS,找到距离 B 最远的单元格 C。
  3. B 和 C 即为迷宫中距离最远的两点,随机将其分配为起点和终点。

技术实现与资源

  • 迷宫的可视化渲染基于 HTML <canvas> 元素实现。
  • 算法理论主要参考维基百科的“迷宫生成算法”条目,所有可视化与算法代码均包含在网站源码的 mazes 目录中。
14. How we built Townie – an app that generates fullstack apps (blog.val.town)

Townie 应用构建解析

核心概念

Townie 是一个能通过对话生成全栈应用的应用程序,基于 Val Town 平台开发。它利用大语言模型(如 Claude 3.5 Sonnet)的代码生成能力,让用户通过自然语言指令快速创建并部署包含前端、后端和数据库的完整应用。

代码生成背景

近期代码生成技术的进步催生了多种创新产品:

  • Claude Artifacts:通过对话生成交互式网站代码
  • Cursor:AI 增强的代码编辑器,支持跨文件生成
  • Vercel v0:从提示生成网站界面
  • Websim:动态生成“虚拟网站”
  • VSCode Copilot:代码自动补全

这些工具主要聚焦前端应用,而 Townie 的目标是扩展至全栈应用,实现真正的终端用户编程。

开发原型

作者在 Val Town 上构建了原型 VALL-E,核心特点包括:

  1. 极简基础版:仅需约 80 行代码即可生成全栈应用
  2. 技术栈:使用 Vercel AI SDK 集成多模型,将公共 vals 和文档作为上下文
  3. 即时部署:生成的应用自动部署到子域名
  4. 功能迭代:逐步增加代码编辑、模型切换、多标签生成等特性

关键技术方案

数据库持久化

  • 初期使用 Val Town Blob Storage(类似 S3)简化 LLM 理解
  • 后通过编写 LLM 友好的封装层解决 SQLite 兼容问题
  • 经验总结:应调整代码适配 LLM,而非让 LLM 适应代码

Make Real 扩展

将 tldraw 绘图工具与 VALL-E 结合,实现“手绘变全栈应用”:

  • 通过 postMessage API 在组件间传递生成的应用名称
  • 支持基于已有应用进行迭代开发

成本与性能优化

评估系统

构建 E-VALL-UATOR 评估工具:

  • 通过 10 个基础提示测试生成应用的质量
  • 检测语法错误、运行时错误、交互问题等
  • 利用 iframe 嵌套实现自动化评估矩阵

上下文优化

  • 发现 50 个示例 vals 的上下文窗口即可保持良好效果
  • 当前部署版本精简至类似快速入门教程的提示

差异生成

  • 让 LLM 生成代码差异而非完整代码以节省 token
  • 实现仅输出搜索块的首尾行、省略中间内容的差异格式
  • 通过 CodeMirror 的合并视图显示差异预览

架构挑战

前后端分离

  • 单文件 vals 包含前后端代码可能混淆 LLM
  • 解决方案:使用 React 模板明确分隔前后端,前端通过 fetch 调用后端 API

错误迭代

  • 构建 IterateGPT 原型,自动将错误反馈给 LLM 迭代修复
  • 可处理语法错误、运行时错误,甚至通过截图和自生成测试优化

生态整合

Val Town 平台支持 vals 导入复用,类似即用型软件包。未来可结合检索增强生成(RAG)技术,让 LLM 自动搜索并导入相关 vals。

总结

Townie 的开发展示了代码生成技术的潜力,通过优化提示工程、成本控制和错误处理,实现了从自然语言到全栈应用的快速生成。随着模型能力提升,终端用户编程的愿景正在加速实现。

16. EPUBCheck – The official conformance checker for ePub publications (github.com)

EPUBCheck 简介
EPUBCheck 是 EPUB 出版物的官方一致性检查器,用于验证 EPUB 文件是否符合规范。它既可作为独立的命令行工具运行,也可作为 Java 库使用。该项目是开源软件,由 DAISY Consortium 代表 W3C 维护。

使用与支持
文章强调需要财务支持以保障 EPUBCheck 的持续开发和维护,呼吁用户捐款。最新生产版本是 EPUBCheck v5.3.0,支持验证 EPUB 2 和 EPUB 3 文件,其中 EPUB 3 出版物依据 EPUB 3.3 规范进行检查。

文档与社区资源
使用指南、贡献方式和消息翻译的文档可在 EPUBCheck wiki 上找到。技术讨论通过公开邮件列表进行,用户可通过发送订阅邮件至 public-epubcheck-request@w3.org 加入。历史讨论记录存档于旧版 EPUBCheck Google Group。

构建指南

  • 从源码构建:需要 Java Development Kit (JDK) 1.7 或更高版本和 Apache Maven 3.0 或更高版本。构建命令会生成 JAR 文件和包到 target/ 文件夹。
  • 使用 Docker 构建:通过 Docker build 命令创建镜像,并通过 docker run 命令运行容器,支持映射主机目录到容器内 /data 路径以访问 EPUB 文件或输出文件。示例包括基本检查和生成 JSON 输出。

致谢与许可证
EPUBCheck 最初由 Adobe 开发,当前由 DAISY Consortium 维护。其功能部分基于 Jing 模式验证工具,并使用来自 Nu HTML Checker、IDPF 和 DAISY 的模式。贡献者包括 Romain Deltour、Matt Garrish 等多人,以及通过错误报告、拉取请求和翻译参与的社区成员。该项目采用 3-Clause BSD License 许可证。

17. LM Studio 0.3 – Discover, download, and run local LLMs (lmstudio.ai)

LM Studio 0.3.0 摘要

LM Studio 0.3.0 是一个完全离线、无遥测数据收集的桌面应用程序,用于在本地计算机上运行大型语言模型。本次更新在原有核心功能(包括聊天界面、通过Hugging Face搜索下载模型、本地API服务器以及模型管理)的基础上,引入了多项新特性与改进。

主要新功能

  1. 文档对话:用户可以在聊天中直接拖放PDF、文本等文件,并针对文档内容提问。对于短文档,内容将完整加载至上下文;对于长文档,则自动启用**检索增强生成(RAG)**技术,以提取相关片段供模型参考。
  2. OpenAI兼容的结构化输出API:支持任何可运行在LM Studio中的本地模型输出符合JSON Schema的结构化JSON数据。
  3. 界面主题:在原有暗黑主题基础上,新增暗色、亮色、棕褐色三种主题,并可选择“系统”主题以跟随操作系统深色模式设置。
  4. 自动加载参数与高度可配置性:现在能根据用户硬件自动配置模型加载参数,同时也提供了更丰富的自定义选项,支持为每个模型设置独立的默认参数。
  5. 网络服务:新增“在网络上服务”开关,允许服务器监听非本地地址,使局域网内的其他设备也能访问本地运行的LLM服务。
  6. 聊天组织与生成管理
    • 支持创建文件夹(可嵌套) 来组织对话。
    • 重新生成回复时,旧版本回复会被保留,用户可方便地切换查看不同版本。

其他重要更新与改进

  • RAG增强:最大文件输入大小提升至30MB,支持任何文件类型(非PDF/DOCX文件将被读取为纯文本)。
  • 自动GPU检测与任务分配:系统自动根据硬件能力在GPU和CPU间分配任务,同时保留手动覆盖选项。
  • 运行时下载:支持独立下载和更新LLM引擎(如llama.cpp),无需更新整个应用程序。
  • 自动提示模板:自动读取模型元数据并应用相应的提示格式。
  • 开发者模式改进:提供模型加载日志、多模型服务配置及网络共享功能,并集成了结构化输出支持。
  • 其他功能
    • 支持加载和运行嵌入模型视觉模型(可在聊天和API中附加图片)。
    • 显示当前对话的token计数
    • 支持自定义提示模板(如覆盖Jinja模板或手动设置前缀/后缀)。
    • 增强的对话管理,包括添加备注、克隆和分支对话。
    • 可自定义的聊天设置(如字体大小)。
    • 新增进度指示器显示提示词处理进度。
    • 初步支持西班牙语、德语、俄语、土耳其语、挪威语等语言本地化。

迁移与安装

  • 用户需通过应用设置中的“迁移聊天”选项,将0.2.31及更早版本的聊天记录迁移至0.3.0的新数据结构。
  • 可从官方网站下载适用于Mac、Windows(x86/ARM)或Linux(x86)的最新版本。
18. Zettlr: Note-Taking and Publishing with Markdown (lwn.net)
19. Nanolog supports logging with 7 ns median latency (github.com)

Nanolog 日志系统摘要

Nanolog 是一个针对 C++ 的极高性能、纳秒级延迟的日志系统,通过一个类似 printf 的简单 API 实现。其核心性能指标为:每秒可处理超过 8000 万条日志记录,中位延迟仅为 7 纳秒

核心技术与性能

实现原理

Nanolog 通过以下方式实现极致性能:

  1. 编译时优化:在编译阶段预先提取日志中的静态信息(如格式字符串)。
  2. 运行时精简:在程序执行的热路径中,仅记录日志的动态组件(如变量值)。
  3. 离线处理:将日志格式化(即生成最终人类可读文本)的工作延迟到离线阶段(程序执行完成后)。这本质上是将工作量从运行时转移到了编译期和后处理阶段。

性能对比

Nanolog 与当前主流日志系统(spdlog、Log4j2、glog、Boost.Log、ETW)的性能对比显示,在多种日志消息类型下,其延迟显著更低(中位数延迟约 7-8 纳秒,第 99.9 百分位延迟也普遍较低)。

使用指南

环境与依赖

目前 Nanolog 仅支持 Linux 系统,并依赖于:

  • C++17 编译器(如 GNU g++ 7.5.0+)
  • GNU Make 4.0+
  • Python 3.4.2+
  • POSIX AIO 和线程库

版本选择

Nanolog 提供两个版本,不兼容

  1. C++17 版本:使用更接近传统库的方式(包含头文件,链接库)。推荐初学者使用,因其集成更简单。
  2. 预处理器版本:需要深度集成到构建链中(在 Makefile 中使用特定宏和 Python 脚本)。此版本在编译时进行了更多优化,运行时性能可能略优,但设置更复杂。

基本使用流程

  1. 编译应用:在代码中包含相应头文件(如 NanoLogCpp17.h),使用 NANO_LOG 宏记录日志,并确保链接 Nanolog 库及其他依赖。
  2. 生成日志:程序运行后生成一个二进制格式的压缩日志文件(如 /tmp/logFile)。
  3. 解压日志:使用随库编译的 decompressor 工具,将二进制日志转换成人类可读的文本格式。这是查看实际日志内容的必需步骤。
    ./decompressor decompress /tmp/logFile
    

API 示例

#include "NanoLogCpp17.h"
using namespace NanoLog::LogLevels;
int main() {
    NANO_LOG(NOTICE, "Hello World! Integer: %d, Double: %lf", 1, 2.0);
    return 0;
}

可通过 NanoLog::setLogLevel(...) 设置日志级别(DEBUG, NOTICE, WARNING, ERROR)。

测试

项目包含完整的测试套件:

  • 集成测试:端到端测试编译、运行和日志解压过程。
  • 单元测试:分别对预处理器和库的内部组件进行测试。

总结基于文章提供的技术描述、性能数据和使用说明,未包含任何外部信息或个人评价。

20. Outsourcing Cost Boeing Billions (2019) (medium.com)

文章标题:外包让波音损失数十亿美元(2019)

2018年10月,狮航610航班(737 MAX 8)起飞13分钟后坠海,全员遇难。2019年3月,埃塞俄比亚航空302航班(同型号)在类似情况下坠毁,亦无人生还。两起事故均疑似与机动特性增强系统错误激活有关,该系统可能根据传感器读数错误地命令飞机低头俯冲。事故后,波音737 Max全球停飞,公司市值一夜蒸发超60亿美元。

波音声称可通过软件更新修复MCAS系统缺陷。但该故障本质上是寿命周期关键系统的计算系统失效。对此类系统,通常需设立多重质量防线,包括:需求收集与评审、风险分析、测试驱动开发、静态分析、代码审查、模型仿真、形式化方法及验收测试等。即便是非关键系统,注重质量的投资也能提升长期效率并节省成本。

然而,波音存在严重的成本削减文化。为应对空客A320neo的竞争,波音急于推出基于老旧737平台的改进型号,将项目时间压缩至6年,并设定了不切实际的预算(初始30亿美元)。在此压力下,公司管理层做出了将关键软件工程外包给廉价承包商(如印度HCL公司,时薪低至9美元)的决策。承包商工程师的简历甚至将“快速解决生产问题以免延迟试飞”作为成就。

这种追求“快速廉价”的文化导致了一系列问题:资深工程师被质疑其必要性、辅导与代码审查被忽视、测试被跳过、沟通不畅、开发者倦怠、缺陷堆积。一位内部员工指出,外包代码质量低下,需要大量反复修改,效率远低于波音工程师自行开发。

波音最终因这些决策付出了惨重代价:市值损失数百亿、面临约300亿美元的订单取消威胁、品牌声誉严重受损。实际项目支出远超预算,且交付延迟。这生动印证了软件工程中的普遍规律:“慢即是快,廉价即昂贵”。过度节省成本反而会导致更大的损失。

文章强调,对质量的投资实质上是对生产力、成本节约和更强市场竞争力的投资。波音的案例为所有软件管理者和工程师提供了深刻教训:在面临进度与成本压力时,绝不能以牺牲质量为代价。

21. Show HN: Ruroco – like port knocking, but better (github.com)

Ruroco:一个类似端口敲门但更优的远程命令执行工具

Ruroco 是一个允许通过发送 UDP 数据包在服务器上执行命令的工具。其核心特点是客户端不定义具体执行的命令,仅从服务器端预配置的命令列表中选择,增强了安全性。

主要组件:

  • ruroco-client:运行在本地计算机,用于发送 UDP 数据包。
  • ruroco-client-ui:提供图形用户界面,简化客户端功能的使用。
  • ruroco-server:运行在远程服务器,接收并验证 UDP 数据包。
  • ruroco-commander:运行在远程服务器,在命令有效时执行相应的操作。

安装与配置:

  • 可从发布页面下载预编译二进制文件或自行编译。
  • 安装后需生成共享密钥(使用 ruroco-client gen 或 UI),并将其放置在服务器配置目录(如 /etc/ruroco/)。
  • 服务器配置文件为 /etc/ruroco/config.toml,客户端使用相同的密钥进行通信。

安全性特性:

  1. 无响应:服务器收到 UDP 包后不响应,增加了端口扫描的难度。
  2. 加密传输:数据使用共享密钥进行 AES-256-GCM 对称加密。
  3. 命令定义在服务端:客户端只能选择命令,不能自定义,防止恶意操作。
  4. 最小权限运行:建议以最小操作系统权限运行服务端。
  5. 重放保护:服务器将每个收到的数据包加入阻止列表,并使用基于纳秒时间戳的计数器防止重放攻击。客户端可使用 reseed 命令或 UI 的“Reseed Counter”按钮重置本地计数器。

核心用例:

  1. 单包授权:通过发送命令临时开启防火墙端口(如 SSH),用于解决暴力破解和日志污染问题。配置示例:在服务器配置文件中定义 open_sshclose_ssh 命令,分别对应允许和禁止特定IP的SSH访问。客户端可使用 --ip 参数指定授权IP。
  2. 启用/禁用 Web 服务:通过命令控制 nginx 配置文件的启用或禁用,从而动态开关如文件浏览器等 Web 服务。

客户端使用:

  • gen:生成共享密钥。
  • send:发送命令到指定地址,支持IPv4/IPv6,可指定命令、IP及参数。
  • update:更新客户端二进制文件,会验证 Ed25519 签名。
  • wizard:运行设置向导配置服务器端。

架构与执行流程: 工具分为三部分:本地客户端、暴露在互联网上的服务器(权限最小化)以及运行在同主机但不暴露于互联网的执行器(拥有执行命令的足够权限)。 执行时,客户端将时间戳与命令名组合、加密并发送UDP包。服务器解密验证后,将有效的命令名发送给执行器。执行器检查命令是否在配置中定义,若是则执行,否则记录错误。

故障排除:

  • 若一个客户端的包被服务器拒绝,可能因为多个客户端共享了同一个密钥。解决方案是为每个客户端生成唯一密钥。若计数器失步,可使用 reseed 命令重置。
23. Modern Wardriving (2023) (simonroses.com)

现代Wardriving(2023)摘要

定义与演变

  • 传统Wardriving:指使用车载计算机搜索Wi-Fi无线网络。
  • 现代Wardriving:定义扩展为搜索Wi-Fi网络、蓝牙设备及GSM基站,且不限于车辆,可在飞机、船只、自行车、滑板甚至步行时进行。

作者背景与经验

  • 作者自2000年初开始分析无线网络,并于2022年获得Offensive Security Wireless Professional认证。
  • 使用过早期无线网卡进行Wardriving和Wi-Fi审计。

现代硬件需求

  • 现代Wardriving需要更先进的硬件,以支持2.4GHz和5GHz频段(包括新兴的Wi-Fi 6/7)、数十亿计的蓝牙设备以及GSM基站。
  • 必须结合GPS设备以记录地理位置。

设备示例(用于Wardriving与射频审计) 作者展示了来自其公司VULNEX的多种设备,用于执行从Wardriving到复杂射频攻击的任务。示例设备包括:

  • Flipper Zero + Wi-Fi开发板
  • 树莓派Zero + Pwnagotchi
  • ALFA AWUS036NEH / AWUS036NHA / AWUS1900无线网卡
  • M5 Stack Fire + ESP32 Wi-Fi Hash Monster
  • Google Pixel 5 + WiGLE应用
  • Hack5 Wi-Fi Pineapple Nano
  • 专用Wardriving套件(如463n7 Driver kit & Wardriver)
  • 树莓派4 + 触摸屏

入门建议

  • 推荐新手购买一部Android手机(无需昂贵或高端型号)并安装WiGLE WiFi Wardriving应用,这是最快捷、舒适的入门方式。
  • 随着技术进步,可逐步扩展Wardriving设备收藏。

核心理念

  • 强调Wardriving的ABC原则:“Always Be Collecting”。
24. SnapDiagram – Instantly Convert Hand-Drawn Diagrams to Digital with AI (snapdiagram.xyz)

SnapDiagram – 使用AI即时将手绘图表转换为数字版本

SnapDiagram 是一项利用人工智能技术将手绘图表快速转换为数字版本的服务。其主要功能和特点包括:

  • 数字化转换:通过AI技术,将手绘图表转换为清晰、精确的数字图表,便于进一步编辑和使用。
  • 工作原理:用户可以观看视频演示,了解如何使用SnapDiagram创建、编辑和下载数字图表,过程简单直观。
  • 输出格式支持:提供多种输出格式选项,包括常见图像格式如PNG和JPG,同时支持生成可编辑文件,方便用户进行后续修改和定制。
25. Hacker Purity Test (1989) (www.armory.com)

《Hacker Purity Test (1989)》(1989年黑客纯洁度测试) 是一份经典的计算机亚文化问卷,旨在评估和衡量个人在早期黑客文化、编程技术深度以及“极客”生活方式中的参与度与资深程度。

结构与格式

该测试包含510个问题,采用十六进制编号(从 0x0000x1FD)。问题以递进和分类的方式展开,涵盖了从基础计算机操作到极度硬核的底层技术细节。

核心考察领域

问卷内容广泛,主要聚焦于以下关键维度:

  • 技术沉迷与极客生活:考察连续编程的极限时间、因代码错过的重要生活事件(如考试或婚礼),以及咖啡因摄入、社交障碍、用计算机术语(如 foobar)日常交流等黑客刻板印象。
  • 底层硬件与早期计算:涉及穿孔卡片、纸带修补、ASCII与EBCDIC编码转换、磁芯存储器、行式打印机艺术,以及使用示波器和逻辑分析仪等硬件调试技能。
  • 编程语言与系统开发:测试对多种编程语言(从Fortran、C到Lisp、汇编)的掌握,以及编写编译器、操作系统、设备驱动、自修改代码和混淆C代码的能力。
  • 操作系统与网络架构:涵盖BSD/非BSD Unix、VMS、MVS等经典系统的管理与漏洞挖掘;网络方面包括UUCP映射、Sendmail配置、TCP/IP协议及RFC标准。
  • 黑客文化与恶作剧:包含电话飞客(Phreaking)技术(如黑盒/蓝盒)、触发机房哈龙灭火系统、物理破坏设备、社会工程学,以及早期经典游戏(如Rogue、Zork、Spacewar)。
  • 经典文献与理论:考察对《计算机程序设计艺术》(TAOCP)、《人月神话》、《黑客词典》(Jargon File)的熟悉程度,以及图灵机、停机问题等计算机科学理论。

目的与文化意义

该测试不仅是一份技术能力考核,更是20世纪80年代末Unix黑客、早期互联网先驱和计算机发烧友群体的文化缩影。它生动记录了那个时代特有的技术生态、硬核探索精神以及独特的计算机亚文化特征。

27. Launch HN: Moonglow (YC S24) – Serverless Jupyter Notebooks
28. What's Going on in Machine Learning? Some Minimal Models (writings.stephenwolfram.com)

本文探讨了机器学习的基础理论,通过构建最小模型来揭示其内部机制。核心观点是:机器学习并非构建可解释的机制,而是利用计算宇宙的固有丰富性,通过自适应进化(如点突变)找到恰好能实现目标的、通常是复杂的计算过程。这一本质与计算不可约性现象密切相关。

主要内容概览

  1. 问题的提出

    • 尽管机器学习工程成就显著,但其理论基础依然薄弱,我们不清楚神经网络为何有效,也缺乏对其内部运作的“科学图景”。
    • 作者旨在“剥离”复杂细节,探索极度简化的最小模型(如网格神经网络、规则数组),使其内部过程可直接可视化,并探究机器学习本质。
  2. 核心发现:机器学习的本质

    • 非机制性学习:训练并非构建清晰、可识别的“机制”,而是找到“恰好能产生正确结果”的、通常混乱复杂的计算。机器学习像是在采样计算宇宙中的典型复杂性,挑选出行为符合需求的片段。
    • 计算不可约性的核心作用:机器学习可能性的最终根源在于计算不可约性。它提供了计算宇宙的丰富性和多样性,也带来了训练过程中的有效随机性,使自适应进化能够成功而不会陷入局部最优。
    • 类比生物进化:机器学习与生物进化高度相似,都是通过自适应过程(如随机突变)寻找能“工作”的解决方案,而非通过传统工程构建可解释的结构。
  3. 探索的最小模型

    • 传统与简化神经网络:从全连接神经网络开始,继而简化为网格神经网络(每个神经元仅接收有限输入)。可视化显示其内部过程复杂,但功能上仍能学习目标函数。
    • 离散系统作为类比
      • 细胞自动机模型:成功通过单点突变和选择(保持有利突变),进化出满足特定生命周期(如40步)的规则。
      • 规则数组:这是对神经网络更本质的离散化。它是一个细胞自动机阵列,但每个格点在不同时间可以应用从有限集合中选择的不同规则(类似于可变的局部权重)。通过简单的自适应进化过程,规则数组能够学习各种任务,例如计算特定函数(如 ⌊2x mod 2⌋)或实现自编码器。
      • 布尔逻辑规则数组:使用 AndXor 等规则构建的数组,可以表示并学习所有(偶)布尔函数,再次证明学习的广泛性。
  4. 学习过程与优化

    • 随机点突变可行:即便使用最简单的逐步随机点突变并保留不增加损失的突变这种进化过程,也能成功找到解决方案。这凸显了计算不可约性带来的有效随机性使得即使简单过程也能成功。
    • 更高效的方法:类似于连续神经网络中的反向传播,在离散系统中也可以发展出基于布尔微积分和链式法则的更高效“梯度下降”方法,用于指导突变选择,尽管其原理更为复杂。
  5. 关于学习能力与局限

    • 表示能力:具有足够节点的神经网络可以表示任意分段线性函数。规则数组等离散系统原则上也能表示并学习广泛的函数(如所有偶布尔函数)。
    • 结果的不可解释性:虽然能找到解决方案,但这些解决方案通常结构混乱、难以理解,缺乏通过传统工程方法构建的“机制性”清晰性。它们只是“碰巧工作”的复杂计算片段。
    • 概括与鲁棒性:模型表现出一定的泛化能力(如吸引子盆),但由于计算不可约性,其边界和内部状态的变化往往难以预测和表征。
  6. 总结与展望

    • 机器学习并非通过特定机制工作,而是**“搭载”在计算宇宙中已有的、由计算不可约性产生的丰富行为之上**。它通过训练(自适应进化)从中“挖掘”出符合目标的计算片段。
    • 这意味着:
      • 不期望存在一个对机器学习系统内部工作的普遍叙事性解释
      • 理解机器学习更接近于探索计算不可约性现象本身(作者称为“规则学”),而非传统科学。
      • 这一视角为设计更简洁、更易理解的机器学习架构(如规则数组)提供了新思路,并有助于界定机器学习能有效解决问题的范围。
29. Californian fed up with stolen mail sends Apple AirTag to herself to catch thief (apnews.com)

加州女子巧用AirTag追踪邮件窃贼

一名南加州女子因邮局信箱频繁遭窃,向自己的地址寄送了一个苹果AirTag包裹,最终协助警方成功锁定嫌疑窃贼。

事件经过

该女子在洛杉矶阿拉莫斯邮局已多次遭遇邮件被盗。据圣巴巴拉县警长办公室通报,她想到了利用AirTag追踪的办法。苹果AirTag自2021年发布以来,常被用于追踪钥匙、钱包或行李等物品。

周一上午,警长办公室接报前往邮局,女子表示她的邮件再次失窃,包括装有AirTag的包裹。

警方追踪与逮捕

执法人员通过AirTag信号追踪到圣玛丽亚的一个街区,距邮局约26公里。警方在现场逮捕了两名嫌疑人:一名来自圣玛丽亚的27岁女子和一名来自河滨的37岁男子。

发现其他赃物

警方在包裹中找到了该女子的邮件,并发现了据信是从其他十余名受害者处偷来的物品。受害者身份未公开。

指控内容

两名嫌疑人被控“持有支票意图欺诈”、“共谋”以及“身份和信用卡盗窃”。37岁男子还面临入室盗窃指控及河滨县的多项其他盗窃令。

警方评价

警长办公室对该女子的做法表示赞赏,称其及时联系执法部门,协助逮捕了嫌疑人,而非自行接触对方。

30. Leveraging AI for efficient incident response (engineering.fb.com)

Meta 开发了一种新的AI辅助根因分析系统,旨在提升系统可靠性调查的效率。该系统结合了基于启发式的大规模检索与基于大语言模型(LLM)的精细排序,从而加速调查过程中对根本原因的定位。在针对其网页代码库的回溯测试中,该系统在调查创建时即可在推荐的五个候选代码变更中准确识别出根本原因的概率达到42%。

系统核心方法:

  1. 启发式检索器:首先利用代码/目录所有权、运行时代码图等启发式规则,将数千个潜在代码变更的范围缩小至数百个,同时保持较高的准确性。
  2. 大语言模型排序器:接着使用经过微调的 Llama 2 (7B) 模型,从数百个候选变更中进一步筛选出最相关的五个。模型通过一种“选举式”排序机制工作,将候选变更分批(每批最多20个)输入,要求模型选出最重要的五个,并最终汇总结果直至只剩五个候选。

关键训练过程:

  • 数据基础:排序器的训练依赖于约5000个历史调查案例构成的监督微调(SFT)数据集,其中包含了调查开始时已知的信息(如标题、影响)以及已知的根本原因。
  • 模型微调:首先对 Llama 2 进行持续预训练(CPT)以适应Meta内部数据,随后通过SFT阶段,将通用指令数据与专门的根因分析数据集混合,训练模型遵循指令并识别根本原因。进一步的微调使模型能够按照相关性概率输出排序列表。

挑战与未来方向:

  • 风险控制:AI系统可能提供错误的根因建议。为此,Meta强调结果的可解释性和可验证性,并利用置信度测量方法避免向用户推荐低置信度的结果,以确保准确性。
  • 未来展望:计划将AI能力扩展至自动执行完整调查工作流并验证结果,以及在代码提交前主动检测潜在故障,从而实现风险的事前缓解。