2024-04-14

14 篇热帖

1. Obituary for a Quiet Life (bittersoutherner.com)

本文是一篇以细腻笔触写就的悼文,通过追忆外公(Papaw)的言行细节与日常互动,展现了一位安静、幽默、充满爱的山区长者的形象,并表达了他无声却深远的影响。

核心特质与说话方式 外公说话带有北卡罗来纳山区的独特口音与用词,例如将“there”说成“thar”,“hello”说成“what do you say”,以及使用“ever which a’way but loose”等表达。他的嗓音低沉、干脆,适合小范围交谈或沉默。他能长时间不言不语,但言辞中常闪现机智。他与妻子(外婆)进行了近七十年充满温情、幽默的日常斗嘴。

临终时刻的深情流露 在外公去世前一个月,尽管已虚弱坐轮椅,见到外婆时仍会抬头呼唤“Hey thar, pretty girl”。在他弥留之际,当作者带儿子们前来告别,已失语一天的他竟睁眼并努力对孩子们说出“Hey, fellers”。在作者表达“我爱你”后,他轻声回应“Love you, buddy”。作者对他说的“You done good”,既是以外公的语言风格表达,也真切总结了他平凡却美好的一生。

无声的遗产 外公的善良与影响无法被官方记录或讣告的格式所概括,它如同平静而持续的涟漪,作者和孩子们将长久地被这爱的涟漪所环绕。

4. Redis re-implemented with SQLite (github.com)

Redis 的 SQL 重新实现

Redka 使用 SQL 重新实现了 Redis 的核心部分,同时保持与 Redis API 的兼容。其主要特点包括:

  • 数据无需全部存入内存:使用 SQLite 或 PostgreSQL 作为存储后端。
  • 支持 ACID 事务:提供关系型数据库的事务保障。
  • SQL 视图:便于数据分析和报告。
  • 灵活部署:可作为独立服务器运行,也可作为 Go 模块在进程内使用。
  • 兼容 Redis:实现了 Redis 命令和 RESP 通信协议。

项目目前处于维护模式,稳定可用,但不再计划开发新功能。

适用场景

  • Go 应用的嵌入式缓存:无需运行独立服务,即可在 Go 应用中获得类似 Redis 的键值存储功能,支持列表、哈希、集合等高级数据结构。
  • 轻量级测试环境:可使用内存数据库,为本地开发或集成测试提供快速、隔离的 Redis 替代方案。
  • Postgres-first 数据结构:在主要使用 PostgreSQL 的同时,利用其存储 Redis 风格的数据结构,实现统一管理与事务保证。

功能概述 支持五种 Redis 核心数据类型:字符串、列表、集合、哈希、有序集合。同时提供键管理、服务器/连接管理及事务等相关命令。

性能说明 Redka 的设计目标并非极致性能。使用通用关系型数据库后端无法超越专业数据存储 Redis,但其处理能力仍可达每秒数万次操作,足以满足众多应用需求。

总结 Redka 是一个将 Redis 核心功能与 SQL 数据库存储相结合的项目,适用于对事务、数据持久化或嵌入式集成有需求,且对性能要求非极端苛刻的场景。项目目前处于维护状态。

5. Show HN: PostgreSQL index advisor (github.com)

PostgreSQL索引顾问扩展总结

概述

这是一个用于PostgreSQL的扩展程序,旨在通过推荐创建索引来提升查询性能。它能够分析SQL查询语句,并输出建议的索引创建语句及预期性能改善情况。

核心功能

  • 支持查询中的通用参数(如 $1, $2)。
  • 支持物化视图(Materialized Views)的索引建议。
  • 能够识别被视图(Views)隐藏的表和列。

API 接口

  • 函数index_advisor(query text)
  • 描述:针对给定的查询文本,分析并返回一组可改善该查询执行时间的SQL CREATE INDEX语句。
  • 返回值(表格形式):
    • startup_cost_before:优化前的启动成本。
    • startup_cost_after:优化后的启动成本。
    • total_cost_before:优化前的总成本。
    • total_cost_after:优化后的总成本。
    • index_statements:建议创建的索引语句数组。
    • errors:分析过程中可能出现的错误信息数组。

使用示例

  1. 简单查询

    • 对一个包含未索引列 title 过滤条件的单表查询进行分析。
    • 输出建议在 book 表的 title 列上创建B树索引。
    • 预期效果:总成本从 25.88 降低至 6.40。
  2. 复杂查询

    • 分析一个涉及四表连接(book, publisher, author, review)并带有多参数过滤的复杂查询。
    • 输出三条建议:
      • book.author_id 创建索引。
      • book.publisher_id 创建索引。
      • review.book_id 创建索引。
    • 预期效果:总成本从 68.48 降低至 42.37。

安装与测试

  • 前提:PostgreSQL 数据库需已安装 hypopg 扩展。
  • 安装步骤
    1. 克隆仓库:git clone https://github.com/supabase/index_advisor.git
    2. 进入目录:cd index_advisor
    3. 执行安装:sudo make install
  • 运行测试
    • 命令:make install; make installcheck
6. Show HN: My $1k self-install, off-grid solar backup build for renters (sunboxlabs.com)

租户自安装离网太阳能备份系统摘要

系统概述

该系统为租户设计,是一个成本约1000美元的自安装离网太阳能备份方案,用于在停电或日间提供电力,无需专业安装。

核心组件与成本

  • 主要组件:包括电缆、控制器等,总成本为832美元(原价1,124美元),通过亚马逊购买。
  • 可选远程追踪:额外成本94.73美元,包括监控设备和软件(如Solar Assistant)。
  • 关键部分:系统基于48V 3000W离网太阳能设计,参考Will Prowse的接线指南进行安装。

安装与使用指南

  • 安装方法:遵循Will Prowse的详细接线指南,该指南适用于类似系统。
  • 使用方式:系统位于设备和墙壁之间,需从房间延长电缆到“太阳盒”,再连接太阳能板和墙壁(可选,用于电池耗尽时从电网取电)。
  • 注意事项:系统不会向电网反送电力;仅在太阳能不足和电池耗尽时从墙壁取电,确保设备如冰箱持续运行。

财务与能源回报

  • 财务回报
    • 系统成本:832美元(2024年价格)。
    • 年发电量:约1,000kWh(考虑损耗后)。
    • 年能源价值:550美元(基于旧金山电价0.55美元/kWh)。
    • 投资回报期:约2年。
  • 能源回报
    • 系统内含能源:3,966kWh(包括光伏板和磷酸铁锂电池的生产足迹)。
    • 年能源生产:1,100kWh。
    • 能源回报期:约3.5年,以补偿生产过程中的能源消耗。

常见问题解答

  • 主要缺点:需从每个房间运行延长线到集中设备,可能影响美观。
  • 合法性与安全:系统合法,类似于直接将设备插入墙壁,不涉及电网反送。
  • 支持服务:作者提供规划帮助,可通过电子邮件或通话咨询。

附加信息

  • 系统设计强调便携性和可逆性,适合租户使用。
  • 能源计算基于平均日照数据(4.26小时/天)和系统效率(1.28kW容量)。
8. Knuth–Morris–Pratt illustrated (www.cambridge.org)

本文旨在通过图示和逐步推导的方式,阐明著名的字符串搜索算法——Knuth–Morris–Pratt (KMP) 的核心思想。传统的KMP算法因其复杂的索引运算和抽象的解释而难以理解。本文从最简单的朴素搜索算法出发,通过一系列图解和增量式改进,最终推导出完整的KMP算法。

1. 引言 字符串搜索是一个经典问题:给定一个短的模式串和一个长的文本串,判断模式串是否存在于文本中。存在O(n+m)时间复杂度和O(m)空间复杂度的解决方案,即KMP算法,但其实现难以理解,现有教材的讲解也常常令人困惑。

2. 水平朴素算法 最直接的O(nm)算法是在文本的每个位置尝试匹配模式。文章通过水平排列的图示展示了这一过程:每一行对应文本的一个新起始点,逐行比较,直到找到完全匹配或遍历完文本。

3. 垂直朴素算法(集合表示) 换一个视角,用垂直的列来表示匹配状态。每一列代表当前文本位置下,所有可能的模式后缀(即匹配候选)。计算下一列包含三步:移除不匹配的候选、取剩余候选的“尾”、并加入新的完整模式作为候选。当某一列包含空字符串时,表示匹配成功。该算法本质上模拟了一个非确定性有限自动机(NFA),每列对应一组NFA状态。

4. 垂直朴素算法(列表表示) 使用集合表示列存在内存开销大和操作无法融合等问题。文章改用有序列表(按长度排序)来表示列,从而使得状态转移函数可以一次遍历完成,并且检查匹配成功可以在常数时间内完成。

5. Morris–Pratt 算法 分析垂直列表算法的列结构,发现了两个关键性质:1)每个模式后缀作为列“顶部”的列形状是唯一的;2)任何列的rest字段都指向一个先前的列。这意味着总共只有m个(m为模式长度)可能的列状态。利用这些性质,可以将所有列状态预先计算并组织成一个循环图。该图的构建在惰性求值(lazy evaluation)语言中非常自然。搜索过程转变为在这个预计算的图上行走,从而实现了线性时间。此即Morris–Pratt (MP) 算法。

6. Knuth–Morris–Pratt 算法 MP算法在发生不匹配时,会回退到上一个列状态。KMP算法对此进行了优化:在构建列节点时,检查其top字段的首字符是否与rest字段指向列的top字段首字符相同。如果相同,则在回退时可以直接跳到更早的列(rest字段的rest),从而跳过一些不必要的回退步骤。这进一步减少了比较次数。

7. 结论 通过从朴素算法出发,利用图示清晰地展示了匹配状态的演变,逐步引入列结构、列表表示、循环图表示,并最终实现回退优化,本文以更直观的方式重构了KMP算法的推导过程。核心思想在于:将搜索过程视为在一组有限的、预计算的状态(列)之间的转移,并利用模式串自身的结构来优化失败时的回退路径。

9. The Guide to Stock Options Conversations (zaidesanton.substack.com)

核心主旨: 管理者有责任帮助员工理解并妥善管理其股票期权,这是将员工利益与公司长期成功对齐的关键工具。沉默或信息不透明会导致员工错失重大财务机会。

关键行动指南:

  1. 入职时: 帮助新员工理解期权的基本概念(如行权价)并分析不同场景(如公司失败、按当前估值出售、高倍估值出售)对他们的潜在影响。
  2. 在职期间: 为长期服务或晋升的员工争取额外的期权授予,确保激励持续。
  3. 离职时: 提供必要信息,帮助员工就是否行权做出明智的个人决策。这是最关键的一步。

为何股票期权讨论不足?

  • 心态问题: 人们常将期权视为“彩票”而非投资。
  • 保密文化: 薪酬保密规定阻碍了开放讨论。
  • 公司障碍: 公司常有意或无意地使期权价值难以理解,造成信息不对称。

管理者应提供的核心帮助:

  • 澄清基本价值: 明确告知员工的行权价(购买每股的成本)和公司的当前股价(最新融资轮估值)。
  • 进行场景化分析: 与员工计算在不同假设下的收益(例如,按当前股价或10倍估值出售时,扣除行权成本后的利润)。
  • 评估期权价值: 帮助员工判断其期权是否“有行权价值”(即当前股价是否高于行权价)。
  • 支持行权决策: 在员工离职时,引导他们考虑关键因素:
    • 当前股价与行权价的差距(潜在收益大小)。
    • 个人对公司的信心(基于数据而非情绪)。
    • 风险承受能力(能否接受行权款完全损失)。
    • 非全有或全无:可选择只行权部分期权,或寻求第三方(如Equitybee)资助行权。
  • 列出可能结果: 帮助员工理性思考三种结局:投资全损、按当前估值盈利、或错过高倍回报带来的终生遗憾。

结论: 股票期权的行权决策可能是员工一生中最重大的投资决策之一。由于公司系统性的信息缺失,管理者必须主动填补这一空白,提供清晰的数据和框架,赋能员工做出对自己最有利的选择。

10. Summers: Inflation Reached 18% in 2022 Using the Government's Previous Formula (www.forbes.com)
12. Canoes discovered northwest of Rome are oldest boats ever found in Mediterranean (www.smithsonianmag.com)

文章摘要:罗马西北部发现地中海最古老船只

一项新研究显示,在罗马西北部一处名为“La Marmotta”的水下遗址发现了五艘独木舟,这些船只有7000年历史,是地中海地区有史以来发现的最古老船只,也是欧洲已知最古老的船只之一。这一发现为该地区先进的航海技术和繁盛的区域贸易网络提供了证据。

关键发现

  1. 船只详情:这些独木舟长达32英尺(约9.8米),由桤木、白杨、橡木、山毛榉和椴木等不同木材掏空制成。木材的选择显示了先民对木材特性的深入了解,他们能根据不同用途(如重量、机动性、强度)选择材料,其木工知识堪比现代木匠。
  2. 先进技术:船只配备了复杂的航海技术,包括用于拖曳的木制T形装置(上面钻有绳孔),这使得船只能够运输大量货物、人员和动物,表明其主要用于贸易。
  3. 贸易网络:遗址中出土的外国谷物、动物遗骸、陶器、颜料、工具和雕像等物品,进一步证实了当时存在广泛而活跃的古代贸易经济。
  4. 航行能力:研究推测这些船只可能还配备了帆、舷外支架或浮体。其中较小的船只可能用于捕鱼,而较大的船只则可进行短途和长途航行。一项1998年的复制品实验证明,类似船只在良好条件下每天可行进约30英里(约48公里)。

历史意义

这些发现极大地改变了人们对新石器时代早期农业社会的认知:

  • 它们证明了约公元前5700年至5100年间,该地区居民已具备先进的造船技术和海上航行能力。
  • 复杂的船只结构和贸易证据表明,当时的社会组织程度远超以往的想象。
  • “La Marmotta”遗址的发现,使得国际学界首次能以英文全面研究这些文物,从而揭示了早期地中海社群技术与社会发展的高度。
13. Fast and secure translation on your local machine with a GUI (github.com)

translateLocally:本地快速安全翻译工具

核心概述

translateLocally 是一款基于 marianBergamot 引擎的本地机器翻译工具,提供图形界面(GUI)和命令行(CLI)两种使用方式。其核心优势在于翻译过程在用户本地机器上完成,无需连接网络,从而确保安全性和隐私,同时提供快速的翻译性能。

主要功能与特性

1. 多平台支持与下载

  • 提供 Windows、Linux 和 macOS 的预编译版本,可在 GitHub Releases 或官方网站下载。
  • 包含针对旧硬件和 Apple Silicon (M1) 的兼容性构建。
  • 支持从源代码编译。

2. 灵活的命令行接口 (CLI)

CLI 功能强大,支持完整的模型和翻译管理:

  • 模型管理:列出可用模型 (-a)、下载模型 (-d)、移除模型 (-r)、列出本地已安装模型 (-l)。
  • 翻译操作:选择模型 (-m) 并翻译文本。支持从文件 (-i) 读取输入,并输出到文件 (-o) 或标准输出。
  • 高级用法:支持通过管道 (|) 进行枢轴翻译(例如西班牙语->英语->德语)。

3. 原生消息接口

  • 允许与其他应用程序(如浏览器扩展)通过 JSON 格式消息进行集成。
  • 已自动支持 Firefox 和 Chrome 浏览器。用户可通过 GUI 启动程序自动注册,然后在浏览器扩展中选择 “translateLocally” 作为翻译提供方。
  • 开发者可将自定义扩展 ID 添加到源代码中以获得支持。

4. 自定义模型导入与优化

  • 支持导入用户自定义的 marian 格式模型。
  • 模型结构:需要包含配置文件 (config.intgemm8bitalpha.yml)、元数据文件 (model_info.json)、模型文件 (.npz.bin) 和词汇文件。
  • 性能优化建议
    • 量化:强烈建议使用 marian-conv 工具将模型量化为 8 位整数,以大幅提升效率。
    • 使用学生模型:相比教师模型(如 transformer-base),学生模型通常速度快 8 倍以上。
    • 进一步优化:可通过预计算量化乘数和使用词汇短列表再获得 30%-40% 的性能提升。

5. 外部模型仓库

  • 支持添加自定义模型仓库(在设置中)。
  • 默认使用 Bergamot 仓库。用户还可手动添加如 OpusMT 或 HPLT 等其他仓库。

从源代码编译

提供各平台的详细编译指南和依赖说明:

  • 依赖:需要 Qt (>=5,推荐6)、libarchive、以及 BLAS 库。
  • BLAS 库选择
    • 强烈推荐使用 Intel MKL,以获得最佳性能。
    • 不推荐使用 OpenBLAS,因其对翻译任务性能较差且易引发多线程问题。
    • macOS 系统使用 Apple Accelerate 框架。
  • 列出了 Ubuntu 20.04、22.04 及 Archlinux 的具体安装命令。

使用限制

  • 原生消息接口的入站消息限制为 10MB,出站响应限制约 4GB。
  • macOS 应用程序版本的 CLI 在文件输入/输出 (-i, -o) 方面有限制,建议通过管道操作。

致谢与许可

该项目获得了欧盟“地平线2020”研究与创新计划的资助,并基于 Bergamot 项目的研究成果。

14. Show HN: Stack, an open-source Clerk/Firebase Auth alternative (stack-auth.com)

Stack 是一个开源的用户身份验证解决方案,旨在替代 Clerk 和 Firebase Auth 等商业服务。它为开发者提供了一系列预制组件(如 <SignIn /><ForgotPassword />)和 hooks(如 useUser()),支持在 Next.js 和 React 项目中快速集成,目标是将设置时间缩短至几分钟。

该工具的一个显著特点是能够自动适应项目的 UI 主题(如 MUI、shadcn),确保登录界面等组件与现有设计系统保持一致。此外,Stack 还包含一个管理员仪表板,用于查看、编辑和删除用户。

项目强调其 100% 开源和可自托管的特性,避免厂商锁定。未来路线图包括支持更多前端框架、添加 SSO/SAML、Passkeys、双重认证、权限管理及分析集成等功能。开发者可通过 GitHub 项目页和 Discord 社区获取信息或参与贡献。