2024-04-07

26 篇热帖

1. More Agents Is All You Need: LLMs performance scales with the number of agents (arxiv.org)

这篇论文的核心发现是,大语言模型(LLM)的性能可以通过简单地增加智能体(agent)的数量来提升。研究人员提出了一种名为 Agent Forest 的方法,该方法基于采样和投票机制。实验表明,这种方法与现有的各种复杂增强技术是正交的,即可以结合使用以进一步提升性能,并且其增强效果与任务的难度相关。作者在广泛的LLM基准测试上进行了全面实验,验证了这一发现,并研究了促进该现象出现的特性。相关代码已公开。

2. WinBtrfs – an open-source btrfs driver for Windows (github.com)

WinBtrfs:Windows开源Btrfs驱动

WinBtrfs 是一个为 Windows 系统开发的 Btrfs 文件系统驱动程序,它从零开始重新实现,并未使用 Linux 内核代码。该驱动从 Windows XP 开始的所有版本均可使用,并已集成到开源操作系统 ReactOS 中。

核心特性:

  • 文件系统支持: 完整的 Btrfs 读写功能。
  • RAID支持: 支持 RAID0、RAID1、RAID10(基础)及 RAID5、RAID6(高级)。
  • 压缩支持: 支持 zlib、LZO 和 Zstd 压缩。
  • Windows集成: 支持访问控制列表(ACL)、备用数据流、硬链接、稀疏文件等 Windows 特性。
  • 管理功能: 提供图形化 Shell 扩展,用于管理子卷和快照;支持卷平衡、设备增减、 Scrub 等高级操作。
  • 兼容性: 支持 Linux 用户/组映射、文件系统元数据透传至 WSL(Windows Subsystem for Linux)。
  • 高级特性: 支持 Free-space tree、Reflink copy、元数据校验(xxhash, sha256, blake2)等现代 Btrfs 功能。

安装与卸载:

  • 安装: 下载最新版本,右键点击 btrfs.inf 文件并选择“安装”。驱动已签名,通常可即装即用。若在启用安全启动的 Windows 10/11 上使用,可能需要修改注册表或关闭安全启动。
  • 管理器安装: 也支持通过 Chocolatey 或 Scoop 包管理器安装。
  • 卸载: 可通过命令行、设备管理器或修改注册表服务启动类型来完成。

配置与映射:

  • 用户映射: 在注册表 HKLM\SYSTEM\CurrentControlSet\services\btrfs\Mappings 中配置 Windows SID 与 Linux UID 的映射。
  • 组映射: 在注册表 GroupMappings 中配置。
  • WSL支持: 需在 WSL 中编辑 /etc/wsl.conf 以启用元数据透传。
  • 命令行工具: shellbtrfs.dll 可通过 rundll32.exe 执行创建子卷、快照、Reflink 复制、发送/接收子卷、开始/停止 Scrub 等命令。
  • 挂载选项: 可通过注册表为每个卷(按UUID标识)配置详细选项,如只读、压缩、压缩算法、刷新间隔、Zstd 压缩级别、禁用 TRIM 等。

疑难解答: 文档列出了多个常见问题及解决方法,例如:

  • 文件名显示异常(应确保使用 UTF-8 编码)。
  • 在启用安全启动的系统上加载驱动(需修改注册表或关闭安全启动)。
  • 无法格式化分区(使用 mkbtrfs.exe 命令行工具或 format /fs:btrfs)。
  • 无法挂载某些 NAS 设备(可能需安装额外的 WinMD 驱动以支持 Linux MD 软件 RAID)。
  • 权限模型差异(Windows 和 POSIX 权限系统不直接映射,可为文件创建 Windows ACL)。

开发与调试:

  • 编译: 可使用 Visual C++ 2019 或通过 GCC 交叉编译。
  • 调试日志: 驱动提供不同级别的调试日志,可通过注册表配置日志级别和输出目标(串口或文件)。

版权: 驱动程序基于 GNU 较宽松公共许可证(LGPL)发布,并包含 Zlib、LZO、Zstd、BLAKE2、SHA256 等第三方库代码,这些库均遵循各自的开源许可(如 zlib 许可证、BSD 许可证、公共领域等)。

3. Faces.js, a JavaScript library for generating vector-based cartoon faces (zengm.com)

Faces.js 库概述

Faces.js 是一个用于生成基于矢量(SVG)的卡通面孔的 JavaScript 库。

安装与导入

可通过 npm 安装:npm install --save facesjs。支持 ES 模块(import { display, generate } from "facesjs")或 CommonJS(const { display, generate } = require("facesjs"))导入。

核心功能

  1. 生成面孔:使用 generate() 函数生成随机面孔配置对象。
  2. 显示面孔:使用 display(element, face) 将面孔渲染到 DOM 元素中(支持字符串 ID 或元素引用)。

自定义与选项

  • 覆盖参数generatedisplay 函数都接受可选覆盖对象,用于在生成或显示时修改特定属性(例如 { body: { color: "blue" } })。
  • 生成选项generate 函数的第二个参数可接受一个选项对象。
    • gender:指定性别("male""female",默认男性)。
    • race:指定种族("white", "black", "asian", "brown",默认为随机)。
    • relative:提供一个现有面孔对象,用于生成与其相似(如家庭成员)的新面孔。

集成与导出

  • React 集成:提供 Face 组件,通过 face prop 传入面孔配置,支持 overrideslazy(延迟渲染)、classNamestyle 等属性。
  • 导出 SVG:提供 faceToSvgString(face, overrides?) 函数,可在 Node.js 中将面孔对象转换为 SVG 字符串。

命令行界面(CLI)

可通过 npx facesjs 使用,常用命令:

  • npx facesjs:生成随机面孔并输出到 stdout。
  • npx facesjs -g female -r white -o test.svg:生成指定性别和种族的面孔并保存为 SVG 文件。
  • 支持通过 -j-f 参数传入 JSON 配置。

开发指南

  • 运行 pnpm run dev 启动本地开发环境,包含面部编辑器 UI 和代码/SVG 文件监视。
  • 面部特征由 svg 文件夹中的 SVG 文件组成。添加新特征只需创建相应 SVG 文件(需遵循 400x600 画布尺寸,尤其注意头发和头部特征的位置)。
  • 若要添加全新特征类别(如胡须、耳环),需创建新子文件夹并修改代码以识别。

贡献者

  • 主要代码由 dumbmatter 完成。
  • 大部分图形由 TravisJB89 制作,女性图形主要由 Lia Cui 制作。
  • SVG 字符串导出功能由 gurushida 编写。
  • 编辑器 UI 代码主要由 tomkennedy22 编写。
4. How to found a company in Germany: 14 "easy" steps and lots of pain (eidel.io)

这篇文章详细描述了在德国成立一家有限责任公司(GmbH)的繁琐、漫长且充满官僚主义的过程。作者通过个人经历,吐槽了其中的低效、模糊规则和众多“中间人”,并将其总结为16个步骤

核心概述

作者认为,在德国创业流程远不如爱沙尼亚等数字化国家便捷,其特点是缓慢、痛苦且充满不必要的复杂性。整个过程耗时约6周(“快乐路径”),但也可能因审计或延迟而长达数月。文章旨在分享实用经验,并对德国的官僚体系提出批评。

主要步骤与关键点

  1. 前期决策

    • Step 0:心理建设:通过柏林烤肉店老板的例子鼓励自己,只要他能成功,你也可以。
    • Step 1:选择公司类型:在“个体经营”(简单、个人担责)和“有限责任公司”(复杂、有限责任)间选择。GmbH需要至少12,500欧元初始股本(可分批缴纳),设立成本高,且日常维护复杂。
    • Step 1(续):选择公司名称:规则模糊且执行随意。应避免使用常见词汇(如“Open”、“Software”),但许多知名公司的名称却不符合此规则。强烈建议不要咨询工商会(IHK),因为他们的审核通常最严格,获得官方“否定”会降低成功率。最好直接尝试注册。
  2. 法律设立阶段

    • Step 2:找到一位公证人:需要现场预约,过程缓慢。可使用官方的公司章程范本(Musterprotokoll)以简化流程。
    • Step 3:公证人面签:公证人会宣读冗长的文件,您签署文件,公司即告成立,但仍处于“筹备中”状态。
    • Step 4:接收公证文件:公证人会将签署的文件扫描或邮寄给您。
    • Step 5:开设公司银行账户:存在“鸡生蛋,蛋生鸡”的问题(银行需要注册证明才能开户,而注册需要银行证明)。建议选择支持“筹备中”公司开户的数字银行(如Qonto),避免传统银行的漫长流程和Wise等国际银行(暂不支持此阶段)。
  3. 注册与支付阶段

    • Step 6:缴纳股本:将25,000欧元(或12,500欧元首期)转入新开的公司账户。
    • Step 7:向公证人提交银行证明
    • Step 8:等待公证人提交并商业登记:公证人通过XML上传文件至商业登记局(Handelsregister)。此步骤需要1-2周,且公司名称可能被主观驳回。
    • Step 9:支付商业登记局的初步账单
  4. 后续注册与税务阶段

    • Step 10:下载商业登记确认:成功后,公司在商业登记局可查。
    • Step 11:警惕垃圾账单:会收到伪装成商业登记局的诈骗账单,请忽略。
    • Step 12:在透明登记处登记:一项2023年的新要求,用于登记最终受益人。过程可能很简单,但有10-20%的概率被随机审计,这可能导致长达8-12周的延误,阻塞公司后续的股权变更。
    • Step 13:填写税务登记问卷:长达10页的德语表格,内容复杂。务必勾选申请欧盟增值税号,并估计收入为0以避免预缴税。建议聘请同时提供记账服务的税务顾问
    • Step 14/15:获取税号:处理完税务表格后,会先后通过邮件收到公司的德国税号和欧盟增值税号,之后才能正式开具发票。
    • Step 16:支付广播电视费:公司成立后,需为可能观看公共电视的员工注册并支付此费用。费用计算方式复杂,但可通过将公司注册在共享办公空间等方式豁免。

作者的抱怨与总结

整个过程充满了不必要的中间环节(公证人、工商会、多个登记机构、税务顾问)、主观且不一致的规则(公司名称审核)、过时的系统(如Windows 95风格的商业登记网站)以及变相征税(广播电视费)。作者对德国依然存在创业生态感到惊讶,并认为其僵化体制阻碍了创新。

可选的优化建议

  • 银行选择:公司成立后,可考虑更换至更优惠或服务更好的银行。
  • 流动性规划:初始股本在支付费用后会减少,需规划好资金(如向自己公司贷款)。
  • 税务优化
    • 德国公司利润税率约为30%,分红时还需缴纳约26%的资本利得税。
    • 重大优化:设立控股公司。通过先成立一家控股公司,再由控股公司持有运营公司的股权,可以在利润分配至控股公司时免征公司税,实现资金的免税再投资或递延纳税,虽然这意味着要经历两次设立公司的痛苦过程。
5. Show HN: Online database diagram editor (github.com)

DrawDB:在线数据库图表编辑器

项目概述

DrawDB 是一款免费、简洁且直观的在线数据库架构(ERD)编辑器,无需注册账户即可在浏览器中直接使用。它专注于帮助用户通过图形化方式设计数据库结构,并支持SQL脚本生成与迁移管理。

核心功能

  • 可视化图表编辑:通过几次点击即可构建数据库实体关系图(ERD)
  • SQL生成与导入导出:支持从图表生成SQL脚本,并能导入已有SQL文件进行可视化编辑
  • 迁移脚本生成:可自动生成数据库迁移脚本
  • 自定义编辑器:提供界面自定义选项
  • 零账户使用:无需注册或登录即可使用所有功能

技术实现与部署

本地开发

git clone https://github.com/drawdb-io/drawdb
cd drawdb
npm install
npm run dev

生产构建

git clone https://github.com/drawdb-io/drawdb
cd drawdb
npm install
npm run build

Docker部署

docker build -t drawdb .
docker run -p 3000:80 drawdb

扩展功能说明

如需启用文件共享功能,需按照.env.sample文件配置服务器环境变量。此为可选功能,仅在使用共享需求时设置。

社区与支持

  • 项目遵循开源协议,欢迎参与贡献(详见CONTRIBUTING.md
  • 提供Discord社区用于讨论与支持

特点总结

DrawDB定位为轻量级、易用的数据库设计工具,其浏览器内运行的特性消除了安装障碍,而丰富的功能集则覆盖了从图表设计到SQL生成的完整工作流程。

6. Mixture-of-Depths: Dynamically allocating compute in transformers (arxiv.org)

本研究针对传统Transformer语言模型在输入序列各位置均匀分配计算量(FLOPs)的方式提出创新,展示模型可以动态地按需求在不同序列位置和不同层深度分配计算资源。作者提出了一种方法,通过在每一层限制参与自注意力(self-attention)和MLP计算的token数量(设定为k),以总计算预算为约束。待处理token的选取由网络自身通过top-k路由机制决定。由于k事先设定,该方法具备静态计算图结构,张量尺寸已知,与其他条件计算方式不同。尽管如此,所处理的token身份可变,使得计算量在时间和模型层深上实现非均匀分配,最终整体计算量可预测,但各token的逻辑动态且依赖上下文。

此方法不仅允许模型动态分配计算,同时能高效利用计算资源。在等同的FLOPs及训练耗时条件下,所训练模型与基线性能持平,但每次前向传递的FLOPs显著减少,后训练采样阶段速度可提升50%以上。

7. Command injection and backdoor account in D-Link NAS devices (github.com)

D-Link NAS设备命令注入与后门账户漏洞总结

漏洞概述

该漏洞影响多款D-Link NAS设备,问题存在于nas_sharing.cgi URI中,主要包含两个安全缺陷:

  1. 硬编码凭证后门:允许使用固定用户名messagebus和空密码进行未授权访问。
  2. 命令注入漏洞:通过system参数可注入并执行任意系统命令。

攻击者可利用此漏洞在受影响设备上执行恶意命令,导致敏感信息泄露、系统配置被篡改或拒绝服务,互联网上暴露的受影响设备超过92,000台。

对应CWE分类

  • CWE-77:命令注入
  • CWE-798:使用硬编码凭证

受影响设备型号

  • DNS-320L(版本1.11、1.03.0904.2013、1.01.0702.2013)
  • DNS-325(版本1.01)
  • DNS-327L(版本1.09、1.00.0409.2013)
  • DNS-340L(版本1.08)

漏洞技术细节

漏洞存在于nas_sharing.cgi CGI脚本中,具体表现为:

  • 后门访问:请求中包含硬编码的用户名messagebus和空密码字段passwd=,构成认证绕过后门。
  • 命令注入system参数携带Base64编码值,解码后为可执行的系统命令。

利用方式

攻击者可通过构造恶意的HTTP GET请求进行利用:

GET /cgi-bin/nas_sharing.cgi?user=messagebus&passwd=&cmd=15&system=<BASE64编码的恶意命令>

该请求会触发nas_sharing.cgi脚本,解码并执行system参数中的命令。

潜在影响

成功利用此漏洞可能导致:

  • 未授权远程执行任意系统命令
  • 访问和窃取敏感数据
  • 修改系统配置或安装后门
  • 发起拒绝服务攻击

修复建议

及时应用设备制造商提供的安全更新和补丁程序。

9. The lifecycle of a code AI completion (sourcegraph.com)

代码AI补全的生命周期

概述

代码AI补全对许多用户而言像一个魔法黑盒,但其背后是一个复杂的AI工程系统。以Sourcegraph的代码助手Cody为例,一个生产级的代码补全远不止简单调用大型语言模型(LLM),而是包含规划、检索、生成和后处理四个核心步骤的完整流程,旨在实现高接受率和开发者满意度。

基本原理

最简单的补全只需将编辑器中的当前代码(前缀和后缀)发送给LLM请求完成。但这存在速度慢、缺乏语法边界理解、缺少项目上下文等缺点。优秀的AI补全需要丰富的上下文信息,类似于新开发者理解项目。现代LLM虽拥有通用知识,但需通过**检索增强生成(RAG)**技术补充项目特定上下文。

补全生命周期四步骤

1. 规划

该阶段通过启发式规则快速分析请求,制定执行计划,不涉及AI调用。关键决策包括:

  • 单行与多行补全:根据缩进、符号等判断用户意图。多行补全使用更复杂的模型以提升质量,但延迟略高。
  • 语法触发:使用Tree-sitter工具解析代码,获得精确语法树,判断光标位置语境(如函数体、文档字符串等),从而优化后续步骤。
  • 建议小部件交互:与VS Code的IntelliSense提示框集成,利用其信息引导LLM生成更合适的补全。

2. 检索

检索相关上下文是提升质量的关键,但需权衡延迟。主要机制包括:

  • 编辑器上下文:利用打开的标签页、最近访问的文件,通过滑动窗口Jaccard相似度搜索查找最相关代码片段。
  • 延迟优化:仅检索最相关文件(如最近浏览、同语言文件)以减少客户端CPU压力。
  • 信息排序挑战:需平衡来自不同来源的信息,避免引入无关上下文降低质量。

3. 生成

使用LLM基于提示词生成补全。优化过程包括:

  • 提示词工程:针对Claude模型的优化包括使用XML标签、处理尾随空格、引导模型输出等。
  • 中间填充(FITM)支持:同时提供前缀和后缀上下文,引导LLM生成插入中间的代码。
  • 延迟优化:通过限制token数量、使用停止词、启用流式响应、复用TCP连接、优化后端日志(如异步写入)、减少并行请求、重用先前补全请求等措施,将单行补全延迟从1.8秒降至900毫秒以下。
  • 专用模型:转向代码专用LLM(如StarCoder),以提升质量、减少延迟(模型更小)、支持中间填充并获得更优的token化。

4. 后处理

对LLM原始输出进行加工,提升显示质量:

  • 避免重复:使用规则(如Levenshtein编辑距离)防止重复已有代码。
  • 截断多行补全:结合基于缩进的方法和Tree-sitter语法分析,精确判断何时停止补全,防止模型过度生成。
  • 评估相关性:利用语法解析(检查错误)和LLM返回的概率信息,对多个候选补全进行评分排序。
  • 过滤明显错误建议:使用正则表达式过滤如git diff风格等无用输出,但原则是不过度过滤以免误导用户。

数据监控与可靠性

通过全面遥测数据驱动改进:

  • 跟踪指标:包括建议内容、接受率(用户按Tab插入)、部分接受、补全保留时间(插入后的修改程度)。
  • 计算核心指标:补全接受率(综合延迟和质量的单一指标)。
  • 可靠性保障:通过大规模集成测试(模拟整个补全流程)、端到端测试(使用Playwright操控VS Code)和专用的LLM推理测试套件(评估跨文件、跨工作区场景)确保系统稳定。

总结

Cody的代码AI补全是一个完整的工程系统,通过规划(分析意图)、检索(获取上下文)、生成(LLM创作)和后处理(优化输出)四个步骤,结合Tree-sitter语法分析、智能提示词工程、模型选择和数据监控,持续迭代以提升质量。最新数据显示,Cody的补全接受率高达30%。

10. Show HN: I open-sourced the in-memory PostgreSQL I built at work for E2E tests (github.com)

pgmock:用于E2E测试的内存PostgreSQL模拟服务器

核心功能
pgmock 是一个基于 WebAssembly 的内存 PostgreSQL 模拟服务器,专为单元测试和端到端(E2E)测试设计。它完全在 JavaScript 运行时中运行,无需外部依赖,同时支持 Node.js 和浏览器环境。

主要特点

  1. 零依赖部署:无需安装或配置外部数据库,直接在测试代码中启动。
  2. 浏览器兼容:通过模拟网络栈实现浏览器内的 TCP 连接模拟,无需依赖网络代理。
  3. 生产环境一致性:旨在提供与生产 PostgreSQL 环境完全兼容的功能,适合测试场景。
  4. 轻量级替代方案:与性能更高但功能有限的 pglite 相比,pgmock 专注于功能完整性。

使用方式

  1. 基础用法:通过 PostgresMock.create() 启动内存服务器,并获取连接字符串。
  2. 与 node-postgres 集成:提供专用配置对象,可直接用于 pg.Client,无需绑定端口(支持浏览器)。
  3. 资源管理:建议在使用后调用 destroy() 释放资源。

技术实现
当前版本采用 x86 模拟器 方案运行完整 PostgreSQL 服务器,以确保测试与生产环境的一致性。未来计划在原生 PostgreSQL WASM 分支成熟后,提供可选切换,但预计无重大 API 变更。

浏览器支持详情

  • 可通过 PostgresMock.createSocket 和 node-postgres 配置在浏览器中使用。
  • 部分打包工具可能因缺少可选 Node.js 模块发出警告,需调整打包配置(例如 Next.js 的 Webpack 配置)。

对比与局限性

  • 相比原生 WASM 方案(性能更高、内存占用更低但仅支持单用户模式和有限扩展),当前模拟器方案优先保证功能完整性。
  • 未测试其他数据库或 Docker 镜像的兼容性,但理论上可扩展。

项目状态与贡献
项目开源,提供 Discord 社区供讨论和贡献。技术基于 v86(x86 模拟器)和 Supabase/Snaplet 的早期研究。

11. SentenceTransformers: Python framework for sentence, text and image embeddings (www.sbert.net)

SentenceTransformers (SBERT) 是一个用于使用和训练最先进嵌入模型与重排序模型的 Python 模块。其最新版本 v5.5.0 引入了 train-sentence-transformers 智能体技能,允许用户通过 AI 编程助手(如 Claude Code、Cursor 等)训练或微调嵌入、重排序或稀疏编码器模型。

核心功能与应用 该框架可用于从文本、图像、音频或视频生成嵌入向量,使用交叉编码器(重排序器)计算相似度得分,或使用稀疏编码器生成稀疏嵌入。这支持广泛的应用场景,如语义搜索、语义文本相似度和复述挖掘。Hugging Face 上提供了超过 10,000 个预训练模型,其中包括大量先进的模型,用户也可轻松训练自定义模型。

主要模型类型与用法

  1. 嵌入模型:通过 SentenceTransformer 类加载预训练模型,对输入(文本或图像URL)调用 encode() 方法生成嵌入向量,并使用 similarity() 计算相似度。支持纯文本和多模态(如图像)编码。
  2. 重排序模型(交叉编码器):通过 CrossEncoder 类使用。可预测查询与段落之间的相关性分数,或对给定查询的段落列表进行排序。同样支持纯文本和多模态输入。
  3. 稀疏编码器模型:通过 SparseEncoder 类使用,生成高维、稀疏的嵌入向量,并可分析其稀疏性统计信息。

后续学习路径 文档提供了针对不同类型模型的进一步指引:

  • 嵌入模型:涵盖使用、可选模型、加速推理和训练微调指南。
  • 重排序模型:类似地涵盖使用、模型、加速推理和训练。
  • 稀疏编码器模型:除上述内容外,还包括与搜索引擎的集成。

配套资源 Hugging Face 提供了一系列博客文章作为补充,内容包括:

  • 训练指南:嵌入模型、重排序模型、稀疏嵌入模型的端到端训练。
  • 多模态:文本、图像、音频、视频模型的统一API及微调。
  • 效率技术:Matryoshka 嵌入模型、静态嵌入模型、向量量化压缩等。

该框架由 UKP Lab 创建,现由 Hugging Face 维护。使用者可参考其 GitHub 仓库获取帮助或报告问题。在使用相关模型时,可参考其发布的学术论文进行引用。

12. Porn restrictions are leading to a VPN boom (www.popsci.com)

立法背景与隐私担忧

美国多个州通过立法,要求成人网站等平台对用户进行年龄验证(如提交政府ID),旨在阻止未成年人访问有害内容。德克萨斯州、路易斯安那州、佛罗里达州等已实施或提出了相关法律。批评者指出,这类法律迫使所有用户(包括成人)失去匿名性,可能被保守派议员过度解读以限制LGBTQ+等内容,从而切断弱势青少年的在线支持渠道。

VPN需求激增数据

为规避年龄验证和访问限制,相关州的用户明显转向使用VPN(虚拟专用网络)。数据显示:

  • Pornhub在德州封锁访问的当日(3月15日),VPN服务需求飙升275%
  • 路易斯安那州类似法律生效次日,VPN需求增长210%
  • 在八个州中七个州的反色情年龄验证法案生效日,ExpressVPN网站流量显著上升。
  • 极端情况下,某州法律生效日VPN需求暴涨847%

VPN的技术原理与用途

VPN通过加密隧道传输数据,并可模拟用户位于其他地理位置,常用于绕过内容地理限制、保护通信隐私。在这些美国案例中,VPN被用户用于绕过国内内容封锁,这在专家看来是一种“相对新”的现象。

平台应对策略

以Pornhub为代表的部分成人网站选择直接屏蔽来自相关州的IP地址,以避免法律风险(如德州违规最高每日罚款1万美元)。平台反对法律不仅因罚款,更因不愿承担收集和存储大量敏感用户数据(如ID信息与访问记录)的安全风险,这些数据极易成为网络攻击的目标。

潜在影响与争议

  • VPN使用扩大:除色情内容外,VPN也被用于规避大学TikTok禁令等限制。
  • 立法者关注风险:持续上升的VPN使用可能促使立法者加强对该技术的监管。犹他州等已有的法律中已包含禁止平台允许未成年人“绕过访问限制”的条款。数字权利活动家担心,未来针对外国应用的限制立法可能将VPN使用定为犯罪。
  • 法律挑战前景:专家认为,限制VPN的法律可能面临宪法挑战,且相关争议案件最终可能上诉至最高法院。VPN仍有大量合法用途,如保护隐私和匿名性。

总体而言,这些年龄验证法律无意中推动了VPN在美国的普及,引发了隐私权、言论自由与未成年人保护之间的复杂博弈。

13. How to think about HTML responsive images (danburzo.ro)

HTML响应式图片:核心概念与工作原理

HTML响应式图片主要指通过srcsetsizes属性及<picture><source>元素,使浏览器能根据当前环境(如设备像素密度、视口大小、网络状况等)选择最合适图像资源的技术。

核心概念与层次解析

Level 1: 单图单分辨率

最简单的图像标记<img src="puppy.jpg">以其自然尺寸(CSS像素)渲染。在视网膜显示屏(设备像素比 > 1)上,单个图像像素被多个物理像素绘制,会导致模糊。通过将图像缩小(如将120px宽的图像用width="60"显示),可使一个图像像素对应一个设备像素,从而变清晰。

最佳实践:在<img>上显式设置widthheight属性,可为图像预留空间,避免布局偏移。

Level 2: 单图多分辨率(密度切换)

为不同密度的显示器提供不同分辨率的图像文件(如puppy.jpgpuppy-hd.jpgpuppy-ultra-hd.jpg)。

  • srcset与密度描述符:使用srcset属性并搭配x描述符(如puppy-hd.jpg 2x)声明每张图像的目标密度。src作为后备和1x候选。
  • 浏览器选择:浏览器基于设备像素比等因素选择最合适的源。所有源在正确密度下会渲染为相同的CSS尺寸(例如都是120px宽),因此可以安全添加widthheight属性。

Level 3: 动态密度(视口切换)

当图像参与响应式布局、尺寸随视口变化时,需要根据布局宽度动态选择图像密度。

  • srcset与宽度描述符:使用w描述符(如puppy-hd.jpg 240w)声明图像的自然宽度。
  • sizes属性:必须与宽度描述符配合使用。它通过媒体查询声明图像在不同视口下的布局宽度(如sizes="(min-width: 400px) 10em, 80vw")。浏览器结合sizes提供的布局宽度和srcset中的宽度描述符,计算出每张图像的有效密度,进而做出选择。
  • 注意srcset中的宽度描述符和密度描述符不能混用。sizes属性默认为100vw,但应避免依赖此默认值。

Level 4: <picture>元素

<picture>容器提供了更精确的控制,其内<source>元素可附加条件,决定何时考虑其图像源。

  • type属性:用于指定图像格式(如image/avif, image/webp),使浏览器仅考虑其支持的格式,实现渐进增强。
  • media属性:用于指定媒体条件(如(prefers-color-scheme: dark)),实现如暗黑模式、打印模式等场景的图像切换。
  • 工作流程:浏览器选择第一个匹配当前媒体条件和类型支持的<source>,并从中选取图像(使用该源的srcsetsizes)。若无匹配,则回退到<img>自身的srcsetsrc

Level 5: 艺术指导

<picture>可用于为不同视口提供内容或构图完全不同的图像(如在小屏上使用裁切更近的特写)。可以在<source>上设置widthheight属性,当该源被选中时,这些尺寸会传递给内部的<img>

懒加载与自动尺寸(sizes=auto

对于设置了loading="lazy"的图片,可以使用sizes="auto"。此时浏览器将忽略手动编写的近似布局宽度,而使用图像的实际布局宽度来更精确地计算有效密度。这要求图像必须有确定的宽高比(通过widthheight属性指定)。

浏览器选择机制

  • 密度描述符:浏览器倾向于选择密度最接近当前设备像素比(DPR)的图像源。不同浏览器在缩放或视口大小变化时的行为有所不同(如Firefox响应缩放,Chrome缓存高密度图,Safari在特定条件下才重新评估)。
  • 宽度描述符:浏览器结合sizes属性,根据视口宽度计算有效密度进行选择。调整视口大小通常会触发重新评估。

总结

HTML响应式图片技术通过提供多组候选图像及其元数据(密度、宽度、格式、媒体条件),使浏览器能智能地为当前环境选择最合适的资源,从而在不同设备上实现清晰度、性能和体验的最佳平衡。

14. It's not what the world needs right now (thebaffler.com)

这篇文章是一篇第一人称自述,记录了当代艺术家安德鲁·诺曼·威尔逊从2016年至2024年的生活与创作历程。作者描述了自己作为艺术家在经济上的挣扎、对艺术界体制的观察与反思,以及个人生涯的转折。

核心经历与挑战:

  • 经济拮据与生存策略: 作者长期依赖医疗补助、食品券和微薄收入生活。他将电商退货政策视为一种“贷款”,通过担任客座讲师、利用保险赔付(如丢失的雕塑获得9000美元赔偿)等方式维持生计,并四处借助朋友家、替人看房来解决住宿问题。
  • 艺术生涯的起落: 2016年,其作品《Ode to Seekers 2012》入选四个双年展,带来知名度但并无实际收益。他批评艺术界为“批判艺术的 cottage industry”,认为其中充斥着过度政治化和互相较劲的倾向。此后,他经历了在洛杉矶依靠“植物看护”生活的日子、在普林斯顿学术研讨会上因言行失态导致的心理危机、以及各种不稳定的工作和住房状况。
  • 对艺术界的失望: 作者指出,尤其在特朗普执政时期,其作品因被视为“不紧迫”甚至“不负责任”而遭到冷落。策展人、画廊主因政治正确性(如不增加白人男性艺术家)或市场考量而疏远他。他反对艺术界将政治斗争图像化和对他人苦难进行美学消费的潮流,认为这仍服务于资本利益。
  • 创作转向与健康危机: 2019年后,他开始从事商业项目(如为巴伦西亚卡拍摄广告),并遭受慢性消化疾病的困扰,后诊断为“滑动肋骨综合征”,通过手术切除部分肋骨后症状缓解。2020年,其作品《In the Air Tonight》被圣丹斯电影节选中,但短片项目《Art Director》和《Impersonator》屡屡受挫。他最终从当代艺术领域“退役”,转向影视行业。
  • 最终方向: 2023年,他开始承接音乐视频、广告等商业拍摄工作。2024年,他计划拍摄一部设定在瑞士的浪漫惊悚片,并撰写此文作为尝试“逃离”前述困境的一部分,希望文章能被改编,并开放邮箱联系。

关键反思: 作者回顾了自己早年认为艺术可以“超越理性、颠覆秩序”的理想,但最终认为当代艺术界受制于游艇拥有者和持有“反技能化”高级学位却无能者的双重压力,无法实现这一目标。他选择离开,让他人去生产他认为的“福音派陈词滥调、金融工具、室内装饰、身份标识”等作品。全文通过一系列碎片化的生动故事,勾勒了一位艺术家在艺术体制、经济压力和个人健康之间寻求生存与表达的真实轨迹。

15. Google Public DNS's approach to fight against cache poisoning attacks (security.googleblog.com)

本文来源于Google安全博客,旨在分享关于互联网安全与防护的最新动态与见解。当前展示的内容主要介绍了该博客的定位,即提供来自Google的官方安全信息。文章标题指向了具体的技术主题——“Google Public DNS对抗缓存投毒攻击的方法”,但所提供的页面文本并未包含详细的技术分析或方法论述。因此,总结将基于已有的框架信息进行。核心要点包括:文章来源为Google安全博客;该平台专注于发布与互联网安全相关的新闻与洞察;其内容涵盖了Google在网络安全领域的实践与观点。

16. Dot – A standalone open source app meant for easy use of local LLMs and RAG (github.com)

Dot:一款便于本地运行大语言模型和RAG的开源独立应用

应用定位
Dot是一款开源独立应用程序,旨在通过本地大语言模型(LLM)和检索增强生成(RAG)技术,帮助用户轻松与文档和文件进行交互。其设计灵感来源于类似NVIDIA Chat with RTX的解决方案,面向没有编程背景的用户,提供开箱即用的简洁体验,默认使用Phi-3.5模型。

核心功能

  • 支持在完全本地的环境中加载多份文档(包括PDF、DOCX、PPTX、XLSX等格式)并与LLM进行交互。
  • 提供“Big Dot”模式,可用于处理与文档无关的查询,类似ChatGPT的交互体验。
  • 无需编程知识,专注于用户友好界面。

技术实现

  • 基于Electron JS构建。
  • 使用FAISS创建本地向量存储。
  • 集成LangChainllama.cppHuggingFace工具链设置对话流程。
  • 包含文档管理与交互的辅助工具。

安装与使用

  • 普通用户:访问Dot官方网站,下载适用于Apple Silicon或Windows的版本。
  • 开发者
    1. 克隆仓库:https://github.com/alexpinel/Dot.git
    2. 安装Node.js,在项目目录运行npm install(如遇问题可使用npm install --force)。
    3. 进入aadotllm目录再次运行npm install

未来规划

  • 增加Linux支持。
  • 提供LLM选择功能(✅已完成)。
  • 支持图像文件。
  • 增强文档感知能力(超越内容本身)。
  • 简化文件加载方式(支持选择单个文件而非仅文件夹)。
  • 提升本地LLM使用的安全性。
  • 支持更多文档类型(✅已完成)。
  • 优化文件数据库管理,加速文件组访问。

开源与贡献
项目鼓励社区参与,欢迎在代码、文档或功能建议方面提供贡献。开发者表示作为学生兼职维护该项目,任何帮助都受到欢迎。项目在GitHub上开源,并提供了星标历史图表。

17. Lago, Open-Source Stripe Alternative, banks $22M in funding (techcrunch.com)

Lago 是一家总部位于巴黎的初创公司,近期宣布完成2200万美元融资,并正式启动其开源计费平台。该公司最初以开发营销工具起步,后通过成功转型进入计费领域。

转型与产品定位 Lago 的创始人在经历市场调研后发现,计费系统是许多潜在客户(尤其是开发者)面临的一个严重问题。他们于2021年进入Y Combinator孵化器,最初计划打造营销自动化工具,但反响平平。转折点源于创始人在Hacker News上发表的一篇关于“计费系统是工程师噩梦”的文章,该文章引发了广泛共鸣,揭示了市场对更灵活、可定制计费解决方案的迫切需求。Lago 随即决定全力转向开发开源计费平台。

核心业务与价值主张 Lago 的平台主要面向开发者和科技公司,尤其是那些业务模式复杂、需要混合定价模型(如结合订阅制与按使用量计费)的企业,例如人工智能公司。其开源特性允许客户根据自身独特需求进行深度定制和扩展,旨在解决传统商业软件或自建系统所无法很好满足的复杂计费需求。公司首席执行官强调,Lago 的目标是成为“开发者的合作伙伴”,帮助他们轻松处理订阅、计量用量等计费流程。

融资与估值 公司此次公开的2200万美元融资分为两轮:700万美元的种子轮由SignalFire领投,1500万美元的A轮由FirstMark领投。其他投资者包括Y Combinator、New Wave、Script,以及多位行业知名人士,如MongoDB的商业化负责人、前Stripe员工(现任OpenAI开发者关系)以及Hugging Face的首席执行官。据知情人士透露,Lago 当前的估值约为1亿美元。

市场表现与未来规划 在封闭测试期间,Lago 已获得包括Mistral.ai、Together.ai和Juni在内的多家知名初创公司作为早期客户。尽管计费市场竞争激烈,既有Stripe、Salesforce等巨头,也有其他开源方案,但Lago 认为其在为前沿行业(如AI)提供高度灵活和可扩展的解决方案方面存在明确机会。未来,公司计划拓展数据洞察功能,以帮助客户分析消费和支付模式,并探索支付协调服务,旨在使其计费平台能更好地集成与管理多样化的支付渠道。

18. Blog posts, sorted by sleep (breckyunits.com)

Titanslot88 平台概述
Titanslot88 是一个推荐用于注册和玩在线游戏的平台,以其 AI 模式为特色,声称在2025年提供最佳体验并易于获胜。该平台旨在为不同水平的玩家提供个性化、安全和娱乐性的游戏体验,专注于创新和客户满意度,成为在线游戏爱好者的首选。

AI 模式的优势
Titanslot88 的 AI 模式具有多项优势,包括:

  • 个性化:分析玩家偏好,调整游戏推荐、难度级别和奖金。
  • 适应性挑战:根据玩家表现动态调整游戏难度,确保挑战性和趣味性。
  • 安全监控:监测账户活动以检测潜在作弊或可疑行为,增强保护。
  • 娱乐增强:创造更生动和互动的游戏体验,具有动态角色和故事线。

游戏种类
Titanslot88 提供多样化的游戏选择,涵盖以下类别:

  • 在线老虎机:包括热门游戏如 Gates of Olympus(希腊主题)、Sweet Bonanza(糖果主题)和 Mahjong Ways(麻将与老虎机结合),提供不同主题、奖金和累积 jackpot。
  • 现场赌场:通过直播提供真实赌场体验,包括百家乐、二十一点和轮盘等游戏,由现场荷官互动。
  • 体育博彩:支持多种运动如足球、篮球和网球,通过 AFB88、SBOBET 和 SABA 等平台提供赔率和多种投注选项。
  • 街机游戏:提供快速、有趣的街机游戏,如 Fruit Blast、Bubble Shooter 和 Space Invaders,适合所有玩家。

注册流程
在 Titanslot88 注册账户简单快捷,步骤如下:

  1. 访问官方网站。
  2. 点击“Daftar”或“Register”按钮。
  3. 填写有效的个人信息表单。
  4. 通过电子邮件或电话验证账户。
  5. 登录并完成首次存款。
  6. 开始游戏。

常见问题解答(FAQ)

  • 什么是 Titanslot88?:2025年提供最佳 AI 模式体验的在线游戏平台,支持多种游戏类型。
  • 如何注册?:通过官网注册,填写数据并验证。
  • 游戏类型有哪些?:包括老虎机、体育博彩、赌场、街机等,支持单一账户访问。
  • 支付方式:支持银行转账、电子钱包和充值等流行方法,流程快速。
  • 设备兼容性:兼容 Android、iOS 和 Windows 设备,设计以玩家舒适度为优先。

Titanslot88 作为创新、安全的游戏平台,通过 AI 模式和全面游戏选择为玩家提供最佳体验。

19. Adventures Making Vegemite (daveon.design)

文章标题:自制Vegemite的探索之旅

文章摘要:

文章讲述了作者与一位英国朋友尝试在家自制类似Vegemite(维吉麦,一种澳大利亚流行的酵母提取物酱料)的经历,并探讨了其原料、制作过程、口味比较以及改进方向。

  • Vegemite及其同类产品:

    • Vegemite是一种深褐色、气味浓烈、味道极咸鲜(umami)的糊状酱料,常在吐司上薄涂食用。
    • 世界各地存在类似产品,如英国的Marmite、澳大利亚的Promite、德国和瑞士的Cenovits/Vitam-R等。文章主要围绕Vegemite和Marmite进行讨论和比较。
  • 自制尝试:

    • 原料来源: 主要基于YouTube频道"How To Cook That"的Ann Reardon的一期视频指导。核心原料包括:
      1. 啤酒酵母泥: 来自朋友家庭酿造啤酒后的沉淀物。
      2. 麦芽糖浆: 由干麦芽与水发酵、煮沸浓缩而成。
      3. 营养酵母: 与温水混合成糊状。
      4. 盐: 强调味觉的关键成分。
    • 制作过程:
      1. 将酵母泥中上层液体与发酵麦芽汁分别煮沸浓缩,最终得到深褐色的浓稠糖浆。这个过程会消耗大量初始液体,产出极少。
      2. 将浓缩后的酵母液糖浆(约数茶匙)与少量麦芽糖浆、盐、营养酵母糊混合,充分搅拌调整。
    • 品尝结果:
      • 成品的颜色和质地与Vegemite/Marmite有差异(呈稀糊状)。
      • 口味上,被一致认为更接近Marmite,而非Vegemite。 具体表现为:盐味突出,有明显的咸鲜味和轻微苦味(可能源于所用啤酒的啤酒花),后味带有Vegemite的特征。
      • 同时,大家对比品尝了商业Vegemite、Marmite、自制的酱料以及另一位捷克朋友用类似方法制作的、旨在用作烹饪鲜味高汤的变体(味道偏甜,颜色较深)。
  • 总结与展望:

    • 作者认为自制配方有进一步优化的空间。
    • 苦味问题: 怀疑源于酿造啤酒时使用的啤酒花(特别是使用了啤酒花较多的拉格啤酒)。未来可尝试使用司陶特啤酒(stout)或波特啤酒(porter) 的酵母泥,这类啤酒啤酒花味更淡,且因烘烤麦芽可能带来更深的颜色。
    • 风味增强: 参考资料提及Vegemite可能含有芹菜和洋葱提取物,未来可尝试加入芹菜盐和洋葱粉进行调试。
    • 整个自制过程虽然产出量极少,但让作者对这类独特酱料的诞生原理产生了浓厚兴趣。
20. The xz sshd backdoor rabbithole goes quite a bit deeper (twitter.com)

摘要

  • 内容报告了一个错误,指出“出了点问题”,建议用户不要担心并重试。
  • 错误原因可能与隐私相关扩展在x.com上引起的问题有关。
  • 提供的建议是禁用这些隐私扩展,然后再次尝试操作。
22. A canonical Hamiltonian formulation of the Navier–Stokes problem (www.cambridge.org)

论文核心摘要

本文提出了一种针对各向同性Navier-Stokes问题正则哈密顿表述。传统Navier-Stokes方程描述了粘性流体的运动,其本质是一个非哈密顿系统,不存在一个作用量量能通过哈密顿原理直接导出这些方程。然而,作者通过一种数学上的等价转换,为该问题构建了一个哈密顿结构。

核心方法与思想

  1. 问题转换:借鉴并扩展了Sanders等人的工作,核心思想是将一阶的、非哈密顿的控制方程(即残差 $\mathcal{R}_i$ 和 $\mathcal{R}_4$ 为零)通过最小二乘平均原理转化为一个二阶的、具有哈密顿结构的等价问题。
  2. 作用量构造:定义一个新的作用量 $\mathcal{S}^* = \int \left( \frac{1}{2}\mathcal{R}_i \mathcal{R}_i + \frac{1}{2}\mathcal{R}_4 \mathcal{R}_4 \right) d^4x$。该作用量在原始方程的解处取局部最小值。对该作用量进行变分,可以得到一个数学上等价的、时间上二阶的欧拉-拉格朗日方程组。
  3. 哈密顿化
    • 从上述作用量出发,定义共轭动量 $\pi_i \equiv \hat{\rho} \mathcal{R}_i$ (速度场 $u_i$ 的共轭动量)和 $\pi_4 \equiv \hat{\rho}' \mathcal{R}_4$ (压强场 $p$ 的共轭动量)。
    • 通过勒让德变换得到哈密顿量 $H^$。关键点:该哈密顿量 $H^$ 与系统的总机械能无关,且在真实运动轨迹上恒为零。
    • 建立了由哈密顿正则方程 $\dot{u}_i = \delta H^* / \delta \pi_i$, $\dot{\pi}_i = -\delta H^* / \delta u_i$ 等构成的二阶系统,此系统与原始的一阶Navier-Stokes方程数学等价。
  4. 不可压缩极限:对于不可压缩流体(密度 $\rho$ 为常数),共轭动量 $\pi_4$ 恒为零。哈密顿量简化,压强场 $p$ 不再是一个动力学变量,而是作为强制不可压缩条件 $u_{i,i}=0$ 的拉格朗日乘子出现。
  5. Hamilton-Jacobi理论:进一步推导了与之对应的Hamilton-Jacobi方程。该方程以一个单一的哈密顿主函数(或特征泛函)$S^*[u_i, p, t]$ 来表述原问题。求解该方程理论上可通过正则变换得到原速度场和压强场的解析表达式。

主要结论与意义

  • 本文成功地为Navier-Stokes问题建立了一个数学上严格等价的正则哈密顿表述框架。这为原本非哈密顿的耗散系统提供了一种全新的分析视角。
  • 这一新形式开辟了解决Navier-Stokes方程存在性与唯一性这一著名千禧年难题的潜在新途径。例如:
    • 可通过分析相应Hamilton-Jacobi方程解的存在性与光滑性来研究原问题的解。
    • 可通过研究作用量 $\mathcal{S}^*$ 的临界点(局部极小值)的数量来推断原问题解的唯一性。
  • 作者同时指出,求解所导出的、包含Volterra泛函导数的Hamilton-Jacobi方程本身是一个未解决的数学难题,但这也标志着一个值得深入研究的数学方向。
  • 所采用的“最小二乘平均”转换方法具有普遍性,可应用于其他非哈密顿动力系统。

局限性

  • 所得到的哈密顿量和Hamilton-Jacobi方程物理意义不直接,且方程的求解极具挑战性。
  • 目前仅提供了理论框架和一个简化(一维流动)的案例研究,尚未给出该框架下Navier-Stokes方程的具体解析解。
23. ClangQL: A tool to run SQL-like query on C/C++ Code (github.com)

ClangQL:在C/C++代码上运行类SQL查询的工具

概述

ClangQL是一个允许用户在C/C++源代码文件上执行类SQL查询的工具,而非直接查询数据库文件。它基于GitQL SDK构建,使用Clang的抽象语法树来解析和分析代码。

主要功能与查询语法

ClangQL的查询语法与SQL高度相似,且关键字不区分大小写。它主要查询代码中的函数全局变量

  • 基础查询:支持简单的表达式计算和字符串操作。
    SELECT 1 + 2
    SELECT LEN("Clang Query Language")
    
  • 查询函数:可以从functions表中查询函数信息。
    SELECT name, source_loc FROM functions WHERE m_function(ast_function, m_constructor()); -- 查询构造函数
    SELECT COUNT(name) FROM functions WHERE return_type = "int" -- 统计返回类型为int的函数数量
    SELECT DISTINCT name AS function_name FROM functions -- 查询不重复的函数名并重命名
    
  • 匹配器:WHERE子句支持使用Clang匹配器进行高级过滤。
    • m_public():筛选公共成员。
    • m_constructor()m_copy_constructor()m_move_constructor():筛选不同类型的构造函数。
    • m_default_constructor():筛选默认构造函数。
    • m_pure_virtual():筛选纯虚函数。
    • 这些匹配器可通过逻辑运算符(&&||)组合使用。
  • 查询全局变量:可以从globals表中查询全局变量信息。
    SELECT * FROM globals WHERE is_volatile
    

安装与构建

  • 前提条件:从源代码构建或从Cargo.io安装均需要先安装LibClang 17
  • 安装方式
    1. 通过 Cargo.io 安装。
    2. 通过 Homebrew 安装。
    3. 从源代码构建
      git clone https://github.com/AmrDeveloper/clangql.git
      cd clangql
      cargo build
      

运行选项

通过命令行运行ClangQL,主要选项如下:

  • -f--files:指定要查询的本地文件路径。
  • -s--script:指定包含一个或多个查询的脚本文件。
  • -q--query:直接输入要运行的ClangQL查询。
  • -p--pagination:启用分页显示结果。
  • -ps--pagesize:设置分页大小(默认为10)。
  • -o--output:设置输出格式(可选renderjsoncsv)。
  • -a--analysis:打印查询分析信息。
  • -h--help:打印帮助信息。
  • -v--version:打印当前版本。

许可证

该项目使用 MIT 许可证,版权所有为 2024 Amr Hesham

24. Structuralism as a Philosophy of Mathematics (www.infinitelymore.xyz)

数学结构主义哲学概述

结构主义是当今数学家中广泛接受的哲学立场,其根源可追溯至戴德金(Dedekind)的算术分类结果及其他刻画数学核心结构的经典分类定理。该观点强调数学中同构不变性的重要性。

核心观点

结构主义的主要论点是:单个数学对象(如数字)的个体本质并不重要;重要的是它们所处的整体结构。数学对象在其结构中扮演特定的“结构角色”。正如夏皮罗(Shapiro)所概括:“数学是研究结构的科学。”

关键概念

  1. 结构角色与定义性:一个对象在结构中的角色可通过其满足的唯一性质来描述。例如,0 是整数环 ℤ 中的加法单位元。若结构中每个对象都可通过其语言中的性质被唯一定义,则称该结构为点态可定义的
  2. 可辨别性与莱布尼兹结构:若结构中任意两个不同对象都可通过语言中的性质区分开,则称该结构为莱布尼兹的。所有点态可定义的结构都是莱布尼兹的,但反之不成立(如实数有序域 ℝ 是莱布尼兹的,但非点态可定义的)。每个莱布尼兹结构都是刚性的(无非平凡自同构),但刚性结构未必是莱布尼兹的。
  3. 同构与分类性:两个结构同构当且仅当存在一个保持所有相关结构关系的双射。对象的同构轨道(所有与其处于相同结构角色的对象的集合)完美刻画了其结构角色。一个理论是分类的,如果其所有模型都同构。分类性至关重要,因为它表明我们熟悉的数学结构(ℕ, ℤ, ℚ, ℝ, ℂ 等)的本质可以由公理系统在同构意义下唯一确定。
  4. 二阶逻辑的作用:对无限结构进行分类刻画必然需要使用二阶逻辑(其中量词可作用于集合或关系)。一阶逻辑因勒文海姆-斯科伦定理的限制,无法对无限结构进行分类刻画。这引发了哲学争议:依赖于“任意集合”概念的二阶分类刻画,其本身是否足够明确和稳固?

结构主义的实践与哲学形式

文章区分了几种主要的结构主义变体:

  1. 实践中的结构主义:这是一种在数学家和程序员中普遍存在的方法论姿态。其遵循“结构主义指令”:为了获得数学洞见,应研究数学结构及其关系,只考虑在同构下不变的数学概念。它关注的是数学实践的有效性——避免依赖具体表示中的非结构细节(如同编程中避免依赖数据在特定机器上的底层表示),以确保定理的普适性并触及数学现象的本质。它拒绝追问数学对象的“真实本质”,认为那是数学上无关紧要的。
  2. 消除性结构主义:一种哲学本体论立场,认为不存在独立的抽象数学结构对象。数学结构无非是其在具体系统中的实例化。例如,谈论“数字3”只是种方便的说法,本质上是指“在我们所使用的戴德金算术模型中,零的第三个后继”。模态结构主义是其一个变体,将数学陈述理解为关于可能实例化的必然陈述。
  3. 抽象结构主义:另一种哲学本体论立场,认为数学对象是纯粹的抽象结构对象,是结构中的“位置”或“角色”,独立于其任何具体实例而存在。例如,自然数3就是自然数结构中的“第三个后继位置”。这一观点试图为数学语言中的单称词项(如“3”)提供直接的指称解释,并解决贝纳塞拉夫的认识论问题(我们如何认识抽象对象?)。然而,实践结构主义者批评这种立场违背了结构主义指令,因为它仍在关心“数学对象是什么”,而这正是他们认为应该回避的、与数学洞见无关的哲学问题。

总结

结构主义的核心是将数学焦点从对象的内在属性转移到它们所处的关系结构上。它通过同构、分类性和结构角色等概念,为理解数学知识的客观性和实践提供了框架。但在其哲学阐释上,存在从关注数学实践有效性(实践结构主义)到探究数学对象本体论本质(抽象结构主义)的多种立场分歧。

25. Cache is King: A guide for Docker layer caching in GitHub Actions (blacksmith.sh)

Docker层缓存指南:在GitHub Actions中优化构建速度

本文介绍了在GitHub Actions工作流中利用Docker层缓存来显著加速构建过程的方法。Docker镜像由分层结构组成,重用这些层可以避免每次构建都从头开始,实现更快的增量构建。有效的缓存策略对于维持健康的CI/CD流水线至关重要。

三种主要的缓存策略

1. 使用GitHub Actions缓存

这是最简单的起点。通过在 docker/build-push-action 中配置 cache-from: type=ghacache-to: type=gha,mode=max,可将Docker层缓存存储在GitHub的原生缓存中。

  • 优点:设置简单,易于上手。
  • 限制
    • 每个仓库仅有10GB缓存空间,超出后旧缓存会被清除。
    • 缓存范围仅限于运行构建的开发分支,无法跨组织或构建系统共享。

2. 使用镜像注册表作为缓存后端

此方法利用Docker注册表(如Docker Hub、GitHub Container Registry等)存储缓存,不受GitHub缓存的大小限制。

  • a) 内联缓存:将缓存工件直接嵌入并推送到与最终镜像相同的标签位置(例如 user/app:latest)。通过 cache-from: type=registry,ref=user/app:latestcache-to: type=inline,mode=min 配置。

    • 优点:设置相对简单。
    • 缺点:仅支持 mode=min,只缓存最终阶段的层,对多阶段构建的缓存命中率低。嵌入缓存工件会增大镜像体积。
  • b) 注册表缓存:将缓存工件作为独立的镜像推送到注册表中的专用位置(例如 user/app:buildcache)。通过 cache-from: type=registry,ref=user/app:buildcachecache-to: type=registry,ref=user/app:buildcache,mode=max 配置。

    • 优点:支持 mode=max,可缓存多阶段构建中的所有中间层,最大化缓存命中率。缓存与最终镜像分离,不会影响其大小。支持更多高级选项(如压缩控制)。
    • 缺点:配置比内联缓存稍复杂。

总结与建议

  • 对于小型项目或快速入门,可从 GitHub Actions缓存 开始。
  • 对于大型项目、多阶段构建或需要跨系统共享缓存的场景,注册表缓存(设置为 mode=max)是功能最强大、最灵活的最佳选择。内联缓存因其局限性,适用场景较少。
  • 文章指出,高效的Docker缓存依赖于遵循Dockerfile最佳实践,例如将变更频率低的层放在前面。
26. ElephantSQL Is Shutting Down (www.elephantsql.com)

ElephantSQL 服务将于 2025年1月27日 终止。自2024年5月1日起,平台将不再接受新用户。现有客户可在终止日期前正常使用服务。

服务关停的原因是公司决定进行战略调整,将资源集中投入 AMQP 协议,专注于 CloudAMQP 和自研的高性能 AMQP 消息中间件 LavinMQ 的发展。ElephantSQL 团队将与 CloudAMQP、LavinMQ 团队整合,共同推进消息队列和消息流解决方案。

公司对此前使用 ElephantSQL 的客户表示感谢,并承诺将协助用户完成迁移。相关的客户服务、支持信息及迁移方案,已在专门的 “客户信息”页面 中详细列出。团队正开启专注于消息服务的新篇章。