2024-08-20

37 篇热帖

1. Toasts are bad UX (maxschmitt.me)

Toast通知的糟糕用户体验

核心问题

Toast通知总出现在远离用户注意力的位置,导致交互体验不连贯。以YouTube的“保存”功能为例:

  • 用户点击右侧的“保存”按钮
  • 弹出模态窗口显示在屏幕中央
  • Toast通知却出现在屏幕左下角

其他问题:

  1. Toast出现有延迟且无加载指示
  2. 操作多个选项时,需等待前一个Toast消失才能看到新确认
  3. Toast中的“撤销”按钮不必要,用户可直接重新勾选

解决方案:避免使用Toast

YouTube“保存”功能的改进方案:

  • 将播放列表直接显示在按钮下方,而非弹出模态窗口
  • 勾选/取消勾选时显示加载指示器
  • 加载指示器消失即表示操作完成
  • 无需Toast通知!

其他场景示例

1. 确认添加/移除操作

Gmail归档邮件时:

  • 使用Toast显示确认信息
  • 但邮件从列表消失已表明操作成功
  • 注意: 需考虑撤销功能和键盘快捷键场景下Toast的反馈作用

2. 确认复制操作

复制内容到剪贴板后:

  • 显示Toast确认信息
  • 但复制按钮本身已提供确认状态
  • Toast完全多余

更糟的情况

没有Toast比糟糕的Toast更糟糕。如果缺乏时间设计更好的反馈机制,使用Toast至少比完全没有反馈要好。

作者的替代方案(Cakedesk应用)

Cakedesk是一款离线优先、免订阅的发票应用,作者在发送邮件功能中避免了Toast:

  • 未发送发票在列表中有“发送”按钮
  • 发送时保持模态窗口打开,提交按钮显示发送状态
  • 发送成功后,邮件动画移出屏幕
  • 列表中的“发送”按钮变为“已支付”复选框
  • 用户还可通过上下文菜单确认邮件已发送状态
2. The anatomy of a 2AM mental breakdown (zarar.dev)

事件背景

作者独立维护的网站在生产环境中突发严重故障,所有由 RTK Query 发起的 HTTP POST 请求均告失败。由于缺乏团队(如 SRE 或高级工程师)支持且客户投诉激增,严重影响了依赖该平台的小企业客户。这导致作者在深夜承受了极大的心理压力,产生了强烈的挫败感甚至考虑关闭业务。

故障排查过程

  • 初步诊断:故障仅在生产环境出现,本地运行正常。作者尝试添加日志、检查请求头等常规手段,但毫无头绪。浏览器抛出的 TypeError: failed to execute 'fetch'... 错误信息具有误导性。
  • 排除干扰项:怀疑是 Chrome 浏览器更新导致,但在 Firefox 和 Edge 中同样复现,排除了浏览器问题。由于部分库未提供 Source Maps,阅读混淆后的源码未能提供帮助。
  • 版本回滚:尝试将代码回滚至一个月前、三个月前甚至一年前的版本,故障依然存在。
  • 环境差异对比:重点排查生产环境与本地环境的差异,逐一测试并排除了 Sentry、数据库指向(本地 Docker 与云端)以及 Cloudflare 代理等因素。

定位与解决

  • 发现关键差异:作者注意到本地环境中 PostHog(一款数据分析工具)的 API Key 为空,而生产环境中配置了有效的 Key。
  • 成功复现:在本地环境中填入 PostHog API Key 后,成功在本地复现了 POST 请求失败的故障。
  • 解决问题:在提交的新版本中移除 PostHog 后,系统立即恢复正常。

最终结论

确认此次生产环境崩溃是由 PostHog 引起的。事后,作者在 GitHub 上发现其他开发者也报告了 PostHog 与 Redux Toolkit (RTK Query) 存在冲突的相同 Issue,证实了这并非作者自身代码逻辑引入的缺陷。

4. Transformers for Ruby (github.com)

Transformers for Ruby 摘要

该文章介绍了为Ruby语言提供的Transformers库,旨在实现最先进的transformers模型。它推荐使用Informers进行快速推理。

安装与使用

  1. 前提:需先安装Torch.rb
  2. Gemfile配置:在项目的Gemfile中添加相应行以引入此库。

核心功能

该库通过ModelsPipelines提供功能。

Models (模型)

支持多种预训练模型,主要分为以下几类:

  1. 嵌入模型

    • 包括sentence-transformers/all-MiniLM-L6-v2sentence-transformers/multi-qa-MiniLM-L6-cos-v1mixedbread-ai/mxbai-embed-large-v1等。
    • 用途:将句子或文本转换为向量表示,用于语义搜索、相似度计算等。
    • 示例:通过Transformers.pipeline("embedding", model_name)创建管道,输入句子数组即可获取嵌入向量。部分模型(如查询/文档模型)需要特定的前缀。
  2. 稀疏嵌入模型

    • 示例模型:opensearch-project/opensearch-neural-sparse-encoding-v1
    • 用途:生成稀疏向量表示。
    • 示例:使用AutoModelForMaskedLMAutoTokenizer进行处理,示例代码展示了如何获取稀疏嵌入。
  3. 重排序模型

    • 包括mixedbread-ai/mxbai-rerank-base-v1BAAI/bge-reranker-base
    • 用途:根据查询对候选文档列表进行相关性排序。
    • 示例:通过Transformers.pipeline("reranking", model_name)创建管道,输入查询和文档列表,获取排序结果。

Pipelines (管道)

提供统一接口,用于执行各种下游任务。

  1. 文本任务

    • Embedding (嵌入)Transformers.pipeline("embedding")
    • Reranking (重排序):使用 Informers.pipeline("reranking")
    • NER (命名实体识别)Transformers.pipeline("ner")
    • 情感分析Transformers.pipeline("sentiment-analysis")
    • 问题回答Transformers.pipeline("question-answering")
    • 特征提取Transformers.pipeline("feature-extraction")
    • 用法:创建特定任务的管道,然后传入文本即可获得结果。
  2. 视觉任务

    • 图像分类Transformers.pipeline("image-classification")
    • 图像特征提取Transformers.pipeline("image-feature-extraction")
    • 用法:创建管道,传入图像文件路径即可。

API与兼容性

  • API设计遵循Python版Transformers库
  • 当前支持的模型架构包括:BERT、DeBERTa-v2、DistilBERT、MPNet、ViT、XLM-RoBERTa。

其他信息

  • 开发历史:可查看更新日志。
  • 贡献指南:鼓励通过报告错误、提交代码、完善文档、提出新功能等方式参与项目。
5. 13ft – A site similar to 12ft.io but self-hosted (github.com)

13ft 项目摘要

13ft 是一个自托管的网络服务,功能类似于 12ft.io,旨在绕过网站的广告、付费墙等限制,特别适用于像 Medium、纽约时报等需要付费才能阅读全文的网站。

核心工作原理

该服务器通过伪装成 Googlebot(谷歌的网络爬虫)来访问目标网站。由于谷歌爬虫通常需要获取完整页面内容以进行索引,网站会向其提供未被屏蔽的完整文章内容,13ft 利用此机制获取并展示给用户。

主要特性

  • 多源回退:主要方法失败时,会自动尝试多种绕过方式,兼容性更强。
  • 界面简洁:提供输入框和状态页面,用户操作简单。
  • 支持自托管:用户可在自己的服务器上部署。

部署与使用方法

1. 使用 Docker

要求:安装 dockerdocker compose

git clone https://github.com/wasi-master/13ft.git
cd 13ft
docker compose up

也可直接拉取镜像:docker pull wasimaster/13ft

2. 使用 Python 脚本

要求:安装 Python。

# 克隆仓库后
cd app/
python -m pip install -r requirements.txt
# 运行
python portable.py
# 或使用 gunicorn
python -m gunicorn 'portable:app'

启动后,在浏览器中打开终端显示的链接即可使用。

高级启动(指定绑定地址/端口)

python3 -m venv venv
source venv/bin/activate
python -m pip install -r requirements.txt
FLASK_APP=app/portable.py flask run --host=127.0.0.1 --port=9982

3. 作为 Chrome 浏览器书签(Bookmarklet)

在 Chrome 书签管理器中创建新书签,名称自定,URL 填入以下 JavaScript 代码:

javascript: (function () {window.location.href="https://localhost:5000/" + encodeURIComponent(window.location.href);})();

(可将 https://localhost:5000/ 替换为你自己的 13ft 实例地址) 使用时,点击此书签即可将当前页面通过你的 13ft 服务进行访问。

高级配置示例

系统服务(Systemd)

创建服务文件(如 /lib/systemd/system/13ft.service),示例配置如下,用于将应用作为后台服务运行。

反向代理(Apache 示例)

可使用 Apache 等反向代理将流量转发至运行中的 13ft 服务,并配置 SSL 等。

其他功能

  • 本地化:通过设置 LOCALE 环境变量支持多语言界面(已内置 endefr)。
  • 直接 URL 访问:可通过 http://你的服务器地址/目标网站URL 的格式直接访问。
  • 操作流程:在服务提供的界面中输入目标 URL 并提交,即可获取去除了广告和付费墙的内容。

Logo 来源:由 @mcmikemn 提供。

6. Artificial intelligence is losing hype (www.economist.com)

人工智能(AI)的热度正在减退。近期,越来越多的投资者担忧AI无法带来其预期的巨额利润。自上月达到峰值以来,推动这场AI革命的西方公司股价已下跌10%。同时,更多观察者开始质疑驱动ChatGPT等服务的大语言模型的局限性。尽管大型科技公司已在AI模型上投入数百亿美元,并承诺未来将进行更庞大的开支,但根据美国人口普查局的最新数据,目前仅有5.1%的美国公司使用AI来生产商品和服务,低于今年初5.4%的高点,且未来数月计划采用AI的公司比例也大致相同。

7. Netboot.xyz: your favorite operating systems in one place (netboot.xyz)

Netboot.xyz 摘要

Netboot.xyz 是一个轻量级的开源 iPXE 引导加载程序。它提供了一个统一的菜单界面,让用户能够通过网络直接启动和安装各种操作系统、实时发行版以及系统救援工具,从而彻底摆脱了对物理安装介质(如U盘、光盘)的依赖。

核心功能与特点

  1. 无安装介质:仅需一个引导加载程序即可替代大量启动盘,简化了操作流程。
  2. 在线获取:在启动时,通过 HTTP 协议从上游源实时拉取所需的系统镜像。
  3. 广泛兼容:支持 x86_64arm64 架构,并提供适用于传统 BIOS 和 UEFI 启动模式的构建版本。
  4. 可自托管:支持通过 Docker 轻松搭建私有实例,方便组织内部使用。
  5. 使用简单:可将引导镜像写入 USB 驱动器(.img 格式)、制作成 ISO 文件(.img 格式)或直接置于 DHCP/TFTP 服务器上(.kpxe 格式)。

技术实现

  • 基于 iPXE 开源固件构建。
  • 具有高度灵活性,可以作为独立的启动介质,也可以从现有的引导加载程序(如 GRUB、syslinux)或任何 UEFI Shell 中进行链式引导。

工作流程与内容

启动后,用户将看到一个包含多个选项的菜单,主要类别包括:

  • Linux 网络安装(例如 Ubuntu)
  • 实时系统光盘(Live CDs)
  • 系统实用工具与救援工具
  • iPXE Shell

用户使用键盘导航并选择所需的操作系统后,系统将从网络镜像源下载并启动相应的内核。

快速开始三步曲

  1. 获取镜像:根据使用场景下载对应的引导文件(ISO 用于虚拟机,.img 用于 USB,.kpxe 用于 TFTP)。
  2. 启动引导:通过 USB 设备、ISO 文件或配置 DHCP 服务器指向该引导文件来启动计算机。
  3. 选择系统:从菜单中选择想要尝试安装或使用的操作系统。

获取方式

该项目在 GitHub 上发布所有版本,提供适用于不同架构和启动方式的文件,并附有校验码。用户可访问其官方网站获取最新版本。

10. I picked up a shitty NUC from ewaste and it had a label on it for an AI company (digipres.club)
12. The waiting time paradox: why is my bus always late? (2018) (jakevdp.github.io)

等待时间悖论分析

核心悖论

  • 理论假设:若公交车平均10分钟一班,随机到达的乘客预期平均等待时间应为5分钟。
  • 悖论结论:在特定条件下(如公交车到达间隔服从指数分布),乘客实际平均等待时间会等于平均到达间隔(即10分钟)。

背景:检查悖论

  • 等待时间悖论是“检查悖论”的特例,即观测概率与观测值本身相关。
  • 例如:大学平均班级规模为30人,但学生体验的平均班级规模会更大,因为大班级学生更多。

模拟验证

  • 模拟100万辆公交车(平均间隔10分钟)及100万名乘客,计算平均等待时间接近10分钟。
  • 当公交车到达间隔服从指数分布(泊松过程)时,数学推导显示平均等待时间确实等于平均间隔。

现实数据分析

  • 使用西雅图公交车真实到达数据(2016年第二季度),检验泊松过程假设是否成立。
  • 结果发现:
    • 实际到达间隔分布近似高斯分布,而非指数分布。
    • 各线路、方向、时刻表下的平均等待时间约为计划间隔的1.5-2倍,但并非完全等于计划间隔。
    • 检查悖论存在,但等待时间悖论不完全成立。

结论

  • 等待时间悖论的核心假设(公交车到达服从泊松过程)与现实不符。
  • 现实公交系统通常按计划调度,避免随机性,因此平均等待时间短于悖论预测。
  • 关键启示:数据分析需谨慎验证基本假设,避免将不适用的模型套用至现实场景。
13. On finishing projects (www.alexreichert.com)

关于完成项目

完成项目对我来说异常困难。这篇文章我反复重启了好几次,持续三个月,试图理清思路并减少瑕疵。我坚持的唯一原因是,如果连这篇文章都无法完成,那讽刺将难以承受。同样,我断断续续开发Booper应用已逾一年。起初是为了接触移动开发并学习推送通知,但不断出现的新问题让我无法发布。

“完成”的定义模糊

困难的部分源于“完成”的定义并不总是明确。无论是文章还是软件,永远可以继续修改、优化和增强。或许可以这样定义:当作品足够好或实用,能让我愿意与他人分享时,它就算“完成”了。按此标准,我95%的启动项目都未达标。早期职业阶段,许多项目是为了探索“是否可行”或“我能否做到”,学习与成长比“完成”更重要。如今,我对自己的能力更有信心,项目更多是为了创造他人可能觉得有用的东西。如果无法将作品呈现给人们验证这一假设,那这些努力的意义何在?

项目的典型生命周期与完成障碍

项目生命周期通常遵循固定模式:灵感迸发、兴奋启动、构建到技术上最有趣的部分完成。但随后便是“枯燥”的收尾工作:建立落地页、编写文档、移除硬编码的API密钥并集成OAuth流程。此时常会怀疑:“这应用或许很糟糕,即使完成发布,可能也无人问津,何必多费力气?”

与他人分享的重要性

  1. 几乎无风险,潜在收益极高:最坏结果是被忽视,但可能启发他人、建立新连接,甚至催生大型公司。
  2. 具有疗愈作用:公开写作能促进更严谨的思考,发布应用能验证想法是否可行,停止循环焦虑的“如果……”。
  3. 困难磨砺品格:完成挑战能锻炼自律和意志力,有助于未来应对艰难任务。

难以跨越终点线的原因

  • 目标不清晰:缺乏明确的“终点线”,容易以完美主义为借口,陷入细节纠结。
  • 缺乏问责机制:独自工作时,没有合伙人、同事或客户需要交代,缺乏外部压力。
  • 需要勇气:分享作品隐含着对其价值的肯定,面临公开评判的可能。

如何改进

  1. 预先撰写产品规格:明确构建原因、最小可行产品及发布计划,有助于理清思路、预见难点。
  2. 设定时间限制:将项目周期控制在2-4周内,使目标具体可衡量,避免在已解决问题(如认证、落地页设计)上过度投入。

提升“完成”能力需要纪律和意志力的锻炼,不能仅依赖激情与灵感。“完成”就像肌肉,可通过反复练习增强。

下一步计划

作者计划建立项目页面,分享个人项目的产品规格、演示和回顾,即使未完成的项目也会公开。这种公开性有助于建立问责感,尽管可能不会主动推广所有项目,但公开可见性本身就能增强责任感。

14. Music recommendation system using transformer models (research.google)

这篇文章介绍了YouTube Music如何应用Transformer模型改进音乐推荐系统,以更好地理解用户动作序列和上下文偏好。

问题背景

  • 音乐流媒体服务拥有海量曲库(如YouTube Music超过1亿首),推荐系统对个性化体验至关重要。
  • 用户对推荐内容的交互动作(如跳过、喜欢、不喜欢)是理解偏好的重要信号。
  • 现有挑战:用户行为上下文敏感(例如在锻炼时喜欢快节奏音乐,平时可能跳过),传统系统难以根据当前场景动态调整对历史动作的重视程度。

现有推荐系统的局限性

典型推荐系统分为三阶段:

  1. 检索:从海量曲库中召回数千相关项目
  2. 排序:评估并为项目打分,考虑相关性、新颖性等多维度
  3. 过滤:根据分数筛选并展示给用户

传统排序模型难以从用户成百上千的动作序列中自动识别哪些历史动作与当前推荐相关。

Transformer的应用方案

为什么用Transformer?

  • 擅长处理序列数据,通过自注意力机制捕捉序列元素间的关系。
  • 可学习用户动作序列中不同动作的相对重要性(注意力权重),从而根据上下文动态调整。

系统架构

  • 输入
    • 用户动作序列(每个动作包含:意图类型、显著性、元数据等)
    • 对应的音轨嵌入向量
    • 将动作信号与音轨嵌入结合,形成Transformer的输入token
  • 处理
    • Transformer处理用户动作序列,输出上下文感知的表示向量
  • 集成
    • 将Transformer输出与现有排序模型的特征结合,通过多层神经网络生成最终排序分数
    • Transformer与排序模型共同训练,优化多个排序目标

关键创新

  • 根据当前上下文(如锻炼场景)为历史动作赋予不同注意力权重
  • 灵活处理不同长度的用户动作序列
  • 无需人工筛选相关历史动作,模型自动学习序列关系

实验结果

在线下分析和线上实验中,该方案:

  • 显著降低用户跳过率
  • 增加用户平均收听时长
  • 表明推荐相关性提升,用户体验改善

未来方向

  1. 将技术扩展到检索等其他推荐模块
  2. 探索在Transformer内部结合非序列特征(如艺术家流行度、语言等),而非仅在后期融合
15. Phrack 71 (phrack.org)

Phrack 71 导言摘要

本文为《Phrack》黑客杂志第71期(Volume 0x10, Issue 0x47)的导言,由Phrack Staff撰写,发布于2024年8月19日。核心内容批判了当前技术领域的浮躁风气,并重申了黑客精神的核心价值。

核心观点:打破魔咒

文章指出,世界正陷入由风险投资和暴利承诺驱动的“炒作漩涡”。近四年(2020-2024)间,许多未经充分测试、开发和可持续性论证的技术被急于集成到系统中。这些技术往往引入日益不透明的抽象层,虽然承诺推动未来,却使我们距离理解自身能力与需求更远,并可能将人类带向“信息黑暗时代”——良好信息更难获取,垃圾信息泛滥,知识被用作收取租金的工具。

面对此困境,文章强调黑客的角色至关重要。黑客致力于拨开迷雾、跨越壁垒、解开枷锁,专注于理解事物的真实运作原理。黑客精神代表着一种强大的均衡力量、一种共通语言,一种驱动我们运用可用工具解决实际需求、塑造理想世界的本能。它既是应对机制,也是生存技能,能够打破任何束缚思想的“魔咒”。

杂志内容概览

本期包含以下栏目及技术文章:

  • 常规栏目:Phrack Prophile(人物专访)、Linenoise(短讯)、Loopback(读者来信)、Phrack World News(世界新闻)。
  • 技术论文:涵盖广泛主题,包括:
    • 多媒体安全(MPEG-CENC 规范缺陷分析)。
    • 硬件安全机制绕过(使用面向函数编程绕过CET & BTI)。
    • 数据库注入新思路(SELECT-only 的PostgreSQL注入利用文件系统)。
    • 恶意软件开发(在构建系统中进行病毒编写实验)。
    • 浏览器与内核安全(针对Chromium PartitionAlloc的利用、Linux内核中隐藏模块的寻找、新型页面UAF利用策略)。
    • 安全工具与规避技术(全虚拟化攻击工具链Stealth Shell、通过反优化实现规避)。
    • 经典漏洞模式(格式化字符串漏洞的当代利用)。
    • 反向工程(Dart AOT快照的逆向分析)。

社区与展望

文章最后感谢了所有投稿者、捐助者和艺术家对本期纸质版出版的支持,并列举了多位社区贡献者的昵称。同时,编者呼吁社区在信息混乱中共同努力维护优质信息,学习系统实际运作细节,并建立新的协作方式。

编者宣布了下一期(Phrack 72)的征稿启事,标志着该杂志即将迎来创刊40周年,并提供了明确的投稿联系方式和PGP公钥。

17. Playing Sudoku in TypeScript while the type checker highlights mistakes (github.com)

在TypeScript中玩Sudoku:类型检查器提示错误

本文探讨了在TypeScript中精确定义Sudoku类型,使得类型检查器能自动检测游戏中的错误,而非实现Sudoku求解器。目标是通过复杂类型定义来强制Sudoku规则。

主要方法与技术实现

  1. 初始类型定义
    最初将Sudoku定义为数字数组,但这允许无效输入(如负数或非整数)。改进后,定义Cell类型为1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9,并创建81个Cell类型的数组,表示9×9网格。但这仍无法防止行、列或3×3方块中的重复数字。

  2. 强制Sudoku规则
    通过引入类型参数引用每个单元格,但需手动实例化参数,导致冗余。解决方案是使用函数类型参数自动推断,例如通过恒等函数包装,使类型参数从值推断。然而,运行时行为无实际作用。

  3. 约束检查机制

    • 使用Exclude类型确保单元格不同,但类型定义庞大且繁琐。
    • 引入unknownnever作为类型级布尔值:unknown代表true(所有可能类型),never代表false(空类型)。利用联合(|)和交叉(&)类型模拟逻辑运算。
    • 定义类型谓词如EqualDifferent来检查单元格相等性。例如,Different<A, B>返回unknown(如果不同)或never(如果相同)。
  4. 完整Sudoku约束
    对于完整Sudoku,定义AllDifferent类型检查9个单元格的两两不同,然后通过CheckSudokuConstraints应用所有行、列和3×3方块的约束。每个约束使用交叉类型组合,若任何约束违反,整体类型折叠为never,触发类型错误。

  5. 不完整Sudoku支持
    为允许空单元格,定义EmptyCell类型(如字符串"empty cell")。在单元格位置使用X | EmptyCell,使空单元格不受约束,仅当填入数字时应用规则。

结论

虽然这种方法实用价值有限(如错误消息不友好、类型检查缓慢),但它展示了TypeScript类型系统的表达能力,能通过类型定义静态验证复杂逻辑。最终实现可见于sudoku_v2.ts

18. Homebound: The Long-Term Rise in Time Spent at Home Among U.S. Adults (sociologicalscience.com)

文章标题: Homebound: The Long-Term Rise in Time Spent at Home Among U.S. Adults

核心内容摘要:

本文分析了美国成年人在家时间长期增长的趋势,认为COVID-19大流行期间的日常变化是加速了这一早已存在的趋势。研究基于美国时间利用调查(ATUS)2003年至2022年间十九年的数据,指出尽管疫情引发了人们对社会隔离的关注,但研究者以往多关注人们如何及与谁共度时光,而忽视了时间在物理空间(尤其是家庭)分配上的长期变迁。

主要发现:

  1. 居家时间显著增加:从2003年到2022年,美国成年人在典型日中平均居家时间增加了1小时39分钟。
  2. 普遍性增长:居家时间的增加出现在所有人口亚组中,并且几乎涵盖了所有活动类型。
  3. 与幸福感和意义感关联:初步分析表明,居家时间的增加与较低的幸福感和生活意义感相关联。这提示我们需要对美国生活场景的这一重大转变给予更多的实证关注。

结论: 文章认为,美国成年人的日常活动重心正经历一个向家庭空间长期转移的趋势。这一趋势不仅反映了生活模式的改变,也可能对社会连结、个人福祉产生深远影响,需要学术界和社会给予更多重视。

19. Pragtical: Practical and pragmatic code editor (pragtical.dev)

Pragtical 代码编辑器摘要

Pragtical 是一款定位为实用且务实的代码编辑器,其核心特点如下:

轻量高效

  • 内存占用低,约 50 MB RAM
  • 磁盘空间占用小,仅需 ~10 MB
  • 能在多种设备上流畅运行,无明显性能问题。

功能强大

  • 内置语法高亮、多光标编辑、命令面板等众多基础功能。
  • LSP(语言服务器协议) 支持及其他高级功能作为插件提供,保持核心精简。

高度可扩展

  • 允许用户通过 Lua 语言和其提供的 C API 对编辑器进行深度扩展。
  • 编辑器的许多部分都有相应的文档可供参考。

跨平台运行

  • 基于 SDL、C 和 Lua 技术栈构建。
  • 原生支持 Windows、Linux 和 macOS 操作系统。
  • 由于其技术基础,将其移植到其他系统也相对容易。

易于使用

  • 配备了图形化设置管理器
  • 用户可以轻松自定义编辑器设置、颜色主题、键盘快捷键以及已安装插件的配置。

自由开源

  • 采用 MIT 许可证授权,是免费且开源的软件。
  • 不包含任何遥测或数据收集功能。
20. Imgpls – An extension to load Imgur images directly (andadinosaur.com)

Imgpls 是一款浏览器扩展,旨在直接加载 Imgur 图像,简化用户访问 Imgur 链接时的体验。当用户点击 Imgur 链接时,通常需要经历加载网站、应用横幅、弹窗提示等步骤才能查看图像,而 Imgpls 通过重定向 URL 直接显示图像内容。

该扩展支持以下 URL 模式:

  • i.imgur.com/RaNdOm.jpg
  • imgur.com/RaNdOm
  • i.redd.it/something123.jpeg(在 1.0.1 版本中添加)

不支持的 URL 模式包括可能包含多个图像的链接,例如:

  • imgur.com/a/sTuFf
  • imgur.com/gallery/gallery-name
  • imgur.com/t/community

Imgpls 在 App Store 免费提供,无订阅、应用内购买、广告或跟踪。其隐私政策确保不收集、存储或传输任何个人信息。用户如有问题,可通过电子邮件或 Mastodon 联系作者获取支持。

21. 'Rare species' not seen in the area for 50 years spotted on Arizona trail camera (phys.org)
22. On the cruelty of really teaching computing science (1988) (www.cs.utexas.edu)

《论真正教授计算科学的残酷性》文章摘要

本文由计算机科学先驱Edsger W. Dijkstra于1988年发表,核心论点是:自动计算机代表了一种“激进的新奇事物”,人类习惯于用渐进式变化和类比的方法来理解新事物,但面对这种根本性变革,传统方法失效,必须用全新的、正交的方法来应对。

一、 激进新奇事物的本质与应对

  • 激进新奇:指与过去经验存在根本性断层的新事物,无法用现有词汇和概念通过渐进演变来充分理解。类比和隐喻在此类新事物面前变得肤浅且具有误导性。
  • 应对方法:必须抛弃将新事物与旧经验强行关联的“常识”,以“空白心态”将其作为一个完全独立的主题来学习,如同学习一门无法翻译成母语的外语。

二、 自动计算机的两大激进新奇特性

Dijkstra认为,计算机不仅包含一种,而是两种激进新奇:

  1. 巨大的概念层级深度
    • 计算机程序涉及从比特到海量数据的多层次抽象,其规模比例(约10^9)远超人类想象力。
    • 程序员是唯一需要在单一学科内,通过单一技术来桥接如此巨大语义层次差距的职业。这要求前所未有的深度概念层次思维。
  2. 根本性的数字离散性
    • 计算机是首个大规模的数字设备。与我们熟悉的模拟世界(变化通常是连续的)不同,在数字世界中,最小的扰动(例如改变一个比特)可能导致最极端的后果
    • 不存在一个有意义的度量标准,能让“微小”变化与“微小”效果相对应。

三、 对激进新奇的否认与不良后果

  • 普遍否认:许多人,包括数学家、教育者、工业界和公众,倾向于否认激进新奇的存在,固守“渐进变化”的范式。他们用熟悉的类比(如将计算机比作更大的算盘)来自我安慰。
  • “软件工程”的批判
    • 被Dijkstra称为“注定失败的学科”,因为它试图解决一个自相矛盾的目标——在无法编程的情况下编程。
    • 其实践充满了基于错误类比的幻觉:用“生产率”(代码行数)度量程序员,误以为程序像其他设备一样会“磨损”(软件维护),过分夸大“编程工具”的作用等。
    • “人工智能”的部分吸引力也被解释为:通过模拟人类思维来让可怕的计算机变得熟悉,从而减轻恐惧。

四、 计算科学的本质

  • 计算机的唯一功能是符号操作。程序是将通用计算机转化为专用符号操作器的抽象符号操作公式。
  • 计算科学的研究核心是:机械化(计算)与人类(编程)符号操作之间的相互作用
  • 它属于形式数学和应用逻辑的方向,并旨在超越它们,实现莱布尼茨关于符号计算替代部分人类推理的梦想。
  • “自动编程”是一个自相矛盾的概念,因为编程本身就是一种符号操作。

五、 教育上的启示与挑战

  • 当前教育的失败:普遍采用的“迎合学生直觉”、将新事物伪装成熟悉事物的教学法(如用苹果教算术),无法让学生准备好应对真正的激进新奇,是一种严重缺陷。
  • 教学语言与隐喻的危害
    • 称程序错误为“bug”是不诚实的,应称之为“error”(程序员自己的错误)。
    • 反对拟人化隐喻:将程序部件描述为“想要”、“知道”等是严重误导,它迫使人们从操作(行为)语义去思考程序,这导致巨大的心智浪费,应禁止使用。
  • 形式化方法的力量
    • 通过多米诺骨牌覆盖棋盘问题的例子说明:直接处理所有可能情况(操作思维)极其低效;而利用集合定义(如棋盘染色性质)进行形式证明则简洁、强大且可推广。
    • 应引导学生通过程序文本进行推理,暂时忽略其可执行性,专注于形式证明。
  • 激进的教学提案:Dijkstra提出一门入门编程课程大纲:
    • 教授未解释的公式操作(类布尔代数),以剥离直觉联系。
    • 教授一个简单、清晰的命令式编程语言,其语义由证明规则定义。
    • 核心任务:学生不是写程序,而是为程序满足形式化功能规约提供形式证明。
    • 建议不提供该语言的实现,以迫使学生专注于证明而非测试。

六、 结论

大学应当勇于教授激进新奇,而非迎合商业或社会的短期期待。教育的责任是为学生提供能持续50年的知识和态度。教授形式化方法的回报是巨大的,它能让学生掌握一种超越想象的、强大的新工具,并真正拓展他们的智力文化维度。抵抗教学上的“幼儿化”和对激进新奇的回避,是抵御各种形式专制的重要保障。

23. On Writing Well (zodvik.com)

《On Writing Well》技术写作指南摘要

核心观点

技术文档写作的难度不在于叙事技巧,而在于写作迫使思维清晰化,这种清晰度在思考问题时容易被忽略。作者通过七个互不排斥的建议来避免常见写作陷阱。

七项关键写作建议

1. 为读者而写

  • 写作前问两个问题:
    • 我为谁而写?
    • 读者阅读后应获得哪1-3个要点?
  • 根据读者调整内容深度和侧重点(示例:团队、工程部门、高管看同一事件报告的侧重点不同)。

2. 写得简单

  • 句子简短:少于30词,降低认知负荷。
  • 用词平实:考虑非母语读者,避免花哨表达。
  • 删除冗余:移除不影响意义的词句。
  • 解释术语:避免或明确定义读者不熟悉的行话/缩写。

3. 消除模糊用词

  • 用数据和细节替代形容词
    • ❌ “我们度过了很棒的一个季度”
    • ✅ “本季度盈利能力增长15%,达1.15亿美元”
  • 提供具体数据(次数、影响范围、数值变化),减少沟通歧义。

4. 应用“那又怎样?”测试

  • 对每句话追问“那又怎样?”,确保内容有价值。
  • 删减或修改无价值的句子,并量化影响:
    • ❌ “我们搭建了新平台运行负载测试”
    • ✅ “新负载测试平台支持按需运行,设置时间从1天缩短至15分钟”

5. 添加结构

  • 使用SCR结构(情境-复杂化-解决方案)。
  • 考虑增加两个常用部分:
    • 请求(Asks):明确写出需要读者批准或反馈的事项。
    • 附录(Appendix):存放细节和数据来源,让读者关注核心内容。

6. 使内容具有说服力

  • 使用主动语态:更简洁,责任更明确。
    • ❌ 被动语态
    • ✅ “新冷却系统将数据中心效率提升了15%”
  • 不要请求许可:对可控事项用“我们将做X”代替“我们希望做X”,显得更自信。

7. 编写不过时的内容

  • 避免使用随时间/地点变化的表述:
    • 使用绝对时间(如“2024年8月28日”而非“两周后”)。
    • 为地点、温度单位等提供明确上下文(如注明摄氏度/华氏度)。
  • 在文档顶部注明作者、日期、审批人等信息,帮助读者理解背景。

总结

这些建议旨在提升技术文档的清晰度、针对性和持久性。通过考虑读者、简化表达、基于事实、量化影响、逻辑结构、主动表述和避免相对化表达,可以显著提高技术写作的有效性和专业性。

24. Migrating Mess with DNS to Use PowerDNS (jvns.ca)

将 Mess With DNS 迁移至 PowerDNS 的总结

背景与问题

约三年前创建的 DNS 学习工具 Mess With DNS 最初未严格遵循 DNS RFC,导致用户报告了多个问题:

  • 不允许使用包含下划线的域名
  • 对已存在 CNAME 记录的域名仍允许创建其他记录
  • 允许为同一域名创建多个 CNAME 记录
  • 不支持 SVCB 和 HTTPS 记录类型
  • 不支持 UDP 到 TCP 的响应升级(大响应)
  • 无法正确处理通过 NS 记录的子域名委派

解决方案:采用 PowerDNS

作者选择使用开源 DNS 服务器 PowerDNS(具备 HTTP API)替代原有实现,以根本性解决众多边缘情况和规范符合性问题。

迁移过程中的主要挑战与决策

  1. 实时查询捕获

    • 需要拦截所有 DNS 查询以提供实时视图。
    • 尝试过 dnsdistdnstap 日志功能,但出现 1 秒延迟。
    • 最终自行实现了一个简单的 Go 代理服务器监听 53 端口。
  2. 前端与 API 设计

    • 将大部分 DNS 逻辑(如 Punycode 转换、类型名称映射、验证)从 JavaScript 前端移至新的后端 API。
    • 构建了统一的 Go 后端 API(如 /records 端点),便于编写测试并解耦前端逻辑。
  3. API 信息重复策略

    • 为适应前端不同显示需求(如 MX 记录在表单和摘要视图中的不同展示),允许 API 返回重复格式的信息(如同时提供分字段值和拼接后的内容字符串)。
    • 学到:对于非外部公开的 API,可以完全为前端需求定制,无需避免信息重复。
  4. 记录的唯一标识符

    • PowerDNS API 不直接提供记录 ID。
    • 解决方案:使用记录名称、类型和内容(Base64 编码)组合生成伪 ID。
    • 权衡:记录更新会导致 ID 变化,但可接受。
  5. 错误信息处理

    • PowerDNS 返回的错误信息对用户不友好(如包含转义字符、提及内部概念如 RRset)。
    • 处理方式:在后端添加基础验证(如 IP 地址格式);对 PowerDNS 错误消息进行翻译改写,使其更清晰;记录用户遇到的错误日志以便后续优化。
  6. 数据库迁移至 SQLite

    • 原有的 PostgreSQL 实例因内存不足(256MB RAM)频繁被 OOM 杀死。
    • 改用 SQLite,并采取以下配置:
      • 设置 MaxOpenConns(1) 避免并发写入冲突。
      • 将三个表(用户、记录、请求)分别置于不同数据库以减少争用。
      • 使用无需 cgo 的 Go 实现的 SQLite 驱动。
      • 启用 WAL 模式。
    • 尚未设置备份,但认为每日备份已足够。
  7. 前端框架升级与状态管理

    • 将 Vue.js 从 v2 升级至 v3,并因表单验证库 API 变化而放弃 FormKit,改用浏览器内置验证。
    • 重构前端状态管理,引入全局状态存储,统一处理创建、更新、删除等操作后的数据同步,解决了之前状态不一致的问题。
  8. 项目分阶段执行 将重构分为多个阶段部署:Vue 升级 → 状态管理重构 → 新后端 API 实现 → 集成 PowerDNS。每阶段完成后均进行部署,以控制变更规模。

结果与总结

迁移完成后,新网站已上线。采用 PowerDNS 显著解决了大量历史 DNS 规范问题,提升了工具的正确性和可靠性。作者强调,基于成熟开源方案构建应用可避免重复解决已知问题,同时应注重为前端定制 API 以及错误消息的用户友好性。

25. The guidance system and computer of the Minuteman III nuclear missile (www.righto.com)

民兵III型核导弹制导系统与计算机概述

民兵III洲际弹道导弹是美国唯一的陆基洲际弹道导弹,目前有400枚处于战备状态,分布在五个中部州。其精确制导系统可将弹头发射至13,000公里外,圆概率误差仅为200米。

制导系统核心

制导系统的核心是陀螺稳定平台,利用陀螺仪和加速度计测量导弹的方向与加速度。计算机通过处理这些数据确定导弹位置,并生成操纵指令以修正飞行轨迹。导弹通过控制发动机喷管实现俯仰、偏航和滚转三个轴的旋转,其中滚转角在发射前已精确对准目标方向。飞行中,计算机需不断比较实际位置与预定轨迹,并依次分离火箭的四个级段。

惯性导航与平台对准

系统采用惯性导航原理,通过测量加速度积分得到速度与位置,具有抗干扰优势。稳定平台由铍合金万向架支撑,陀螺仪驱动扭矩电机保持平台空间方向不变。

早期的民兵I型导弹需要在发射井中物理旋转导弹以对准目标,过程繁琐。民兵II/III型改用了旋转镜块进行对准,并增加了陀螺罗盘作为主要对准手段。陀螺罗盘利用地球自转精确确定正北方向。平台还包含电解气泡水平仪用于校准。

陀螺仪采用气体轴承,转子由氢气薄膜支撑,最大限度地减少摩擦。为保持精度,制导系统长期保持通电运行,导弹可在一分钟内发射。

弹道与多弹头

导弹典型飞行时间约35分钟,仅前几分钟为动力飞行。民兵III型创新性地采用了多弹头分导再入飞行器技术,通过第四级将三个弹头发射至不同目标。不过,根据《新削减战略武器条约》,多弹头已于2014年全部撤除。

制导计算机演进

民兵I型:D-17B计算机

  • 串行处理架构:虽为24位机,但一次只处理一位,以硬件简化换取速度(最高每秒12,800次加法)。
  • 磁盘存储:无RAM,所有指令和数据存储在配备固定磁头的特殊磁盘上,容量仅2727个字(约8KB)。
  • 晶体管化:使用二极管-电阻逻辑以减少晶体管数量。
  • 指令集:39条指令,注重输入/输出控制。

民兵II/III型:D-37计算机

  • 集成电路先驱:D-37是首批集成电路计算机之一,体积大幅缩小。
  • 架构延续:保持串行架构,指令速度不变,但扩展了指令集(58条)和功能(如硬件除法)。
  • 抗核加固:D-37C型号增加了抗辐射能力。
  • 存储扩展:D-37D磁盘容量增至14,137字。
  • 系统集成:除制导外,还负责地面控制、检测、通信等任务。
  • 历史影响:民兵与阿波罗计算机推动了集成电路产业的量产化进程。

辅助系统

  • 放大器:作为计算机与导弹其他部分的接口,控制发动机、级间分离及引爆装置。
  • 导弹制导装置控制器:为稳定平台和陀螺仪等供电和提供接口。
  • 电池:采用储备式银锌电池,发射前瞬间激活。
  • 爆管开关:发射时用小型炸药断开地面连接信号,避免干扰。
  • 冷却系统:地面维护时水冷,飞行中依赖风扇和热交换器。
  • 排列插头:存储加密发射代码的关键部件,需严格程序处理。
  • 瞬态电流探测器:探测核爆辐射,触发计算机暂停写入磁盘以避免错误。

结论

民兵制导系统集成了多项创新技术,从早期晶体管计算机到首代集成电路计算机。尽管其威慑使命存在道德争议,但其技术成就对计算机和集成电路产业的发展起到了关键推动作用。目前,400枚民兵导弹仍处于待命状态。

28. Software possession for personal use (olano.dev)

个人使用的软件所有权

当代软件与现代网络存在诸多令人沮丧之处。用户为获取便利和信息共享,逐步放弃了隐私、控制权、性能、离线访问、数据持久性与所有权。虽然云平台实现了传统桌面软件无法完成的任务(如视频协作),但对于那些本可由传统软件处理的任务,用户体验反而可能变差。

为应对这些问题,出现了多种探索方向:

  • 构建本地优先软件
  • 以开放协议替代封闭平台
  • 自托管自由开源软件
  • 使用点对点网络(如BitTorrent、IPFS)
  • 使用联邦网络(如ActivityPub)
  • 从“围墙花园”转向独立网络
  • 开发者自建“家庭厨房式”软件

本地优先软件的愿景

早期吸引用户转向云平台的核心需求是多设备同步。本地优先软件尝试在无中心服务器协调的情况下,通过分布式数据复制与冲突解决技术(如CRDT)实现协作,同时保留本地应用的隐私与控制权。

Martin Kleppmann近期提出了更侧重于可互操作数据同步的愿景:客户端应用独立运行,云组件仅作为可切换的数据中继。用户可自由选择同步服务提供商,支持多种应用实现,且无需承担服务器管理负担。

当前路径与局限

  • 自托管方案:在商用服务器上运行开源软件,但这需要技术能力与时间投入,并非通用解决方案。
  • 个人软件:开发者为自己(或少数人)定制软件,满足特定需求,强调本地或自托管部署、多设备访问、实现简洁性及使用体验优先于规模化。

个人软件的定义与实践

个人软件可定义为:由开发者为自身使用而构建,适应个人需求与偏好,可在多设备间提供数据访问的软件。作者以feedi(个人信息阅读器)和jorge(个人网站生成器)为例说明此类项目。

个人软件的开发准则

  • 项目规模由单人可管理
  • 支持本地或自托管部署,操作简便
  • 可跨设备访问
  • 可为实现简洁性牺牲部分界面复杂性
  • 满足设计者自身需求而非通用用户
  • 无需考虑经济可持续性

技术栈示例

  • 前端:使用Web浏览器作为通用前端,通过htmx实现丰富界面,减少JavaScript依赖
  • 后端:选用Go语言开发,因其适合服务器与命令行工具,标准库功能完备
  • 数据库:采用SQLite,无需复杂运维
  • 部署:通过Linux VPS部署,避免容器化复杂度

结语

个人软件无法改变行业格局,它是通往更优质网络路途中的休憩区。若本地优先软件旨在驯服云计算,自托管意在抵抗,那么个人软件则试图逃离云计算。它让开发者重获创造性计算与用户主权的构建乐趣,也为业余爱好者提供了一种可能。

29. AI companies are pivoting from creating gods to building products (www.aisnakeoil.com)

AI行业正从追求通用人工智能转向构建实用产品。过去企业投入巨大但成效有限,这引发了对生成式AI是否为泡沫的质疑。早期商业化主要存在两种错误路径:OpenAI和Anthropic专注模型研发而忽视产品化;谷歌和微软则急于将AI集成到各种产品中,却未充分考虑适用性。

目前,企业正调整策略。OpenAI正从研究机构转型为产品公司,其内部动荡实质反映了从“造神”到“造产品”的转变。Anthropic虽然吸纳了更关注AGI的研究人员,也开始重视产品构建。谷歌和微软的进展较慢,但苹果在WWDC展示的谨慎集成AI的策略更可能获得用户认可。Meta则侧重于利用AI生成内容以增强社交平台互动。

要实现商业成功,生成式AI需克服五大障碍:

  1. 成本:尽管同类能力的模型成本在过去18个月下降超100倍,但在许多应用中,更低成本直接意味着更高准确性(因可进行更多重试)。成本问题是否即将变得无关紧要,仍有待观察。

  2. 可靠性:LLM的能力与可靠性本质不同。达到90%准确率的技术难以实现100%。消费者期望软件行为确定性,但基于统计学习的AI难以做到。将AI产品适配用户期望(而非反之)是关键挑战。

  3. 隐私:构建有用的AI助手需要处理敏感用户数据(如邮件、文档),其隐私政策尚不明确。设备端处理虽能缓解部分问题,但无法完全消除监控顾虑。

  4. 安全:包括无意的失败(如偏见)、滥用(如深度伪造)和黑客攻击(如提示注入)。恶意AI滥用难以杜绝,需在下游防御;潜在的灾难性黑客攻击(如AI蠕虫)理论上可行,但尚未大规模出现。

  5. 监督与人机交互:LLM的不可靠性要求用户能干预纠错。在错误成本高的应用中,平衡监督与用户体验很棘手。自然语言交互是潜力所在,但其有限界面容错率极低。

尽管AI能力可能快速提升,但解决上述多属于社会技术范畴的挑战、将AI有效整合进现有工作流程并培训人员,仍是一个耗时十年以上的过程。

31. Procreate's anti-AI pledge attracts praise from digital creatives (www.theverge.com)

Procreate坚决反对生成式AI,赢得数字创作者广泛赞誉

流行iPad插画应用Procreate采取了明确反对生成式AI的立场。其首席执行官詹姆斯·库达在社交媒体视频中宣布:“我们不会在产品中引入任何生成式AI。我不喜欢行业正在发生的事情,也不喜欢它对艺术家的影响。”

创作者的核心担忧 数字创意社区对生成式AI的反对主要基于两点:

  1. 训练数据问题:AI模型在未经创作者同意或补偿的情况下,使用了他们的作品进行训练。
  2. 就业冲击:该技术的普及可能大幅减少艺术家的就业机会。

因此,一些插画师开始寻求替代方案,以避开那些整合了生成式AI工具的应用程序(如Adobe Photoshop)。Procreate在官网新设立的AI专题页面中更直接地表态:“生成式AI正在剥离事物的人性。这项技术建立在盗窃的基础上,正将我们引向一个贫瘠的未来。”

行业反响与对比 Procreate的声明迅速获得了不满其他公司做法的创意工作者们的高度赞扬。

  • 竞争对手Clip Studio Paint此前曾计划引入图像生成功能,但在用户强烈反对后取消了该计划。
  • 绘图板制造商Wacom和《万智牌》开发商威世智等公司,也曾因在产品中无意使用AI生成资产而向社区道歉。
  • 即便是试图采取更“合乎伦理”方法(声称其Firefly模型仅使用授权或版权已过期内容训练)的Adobe,也因被认为背弃独立艺术家而受到批评。尽管Adobe后续澄清不会用用户内容训练AI,但其多年来的一些政策变化已使其在创作者中留下了负面印象。

Procreate的受欢迎优势 与之相比,Procreate备受好评。该公司坚持一次性买断制(12.99美元),并未像Adobe和Clip Studio Paint那样转向订阅制。同时,Procreate正扩展产品线,涉足动画领域并计划支持桌面用户。在可替代选项日益减少的背景下,此次坚决反对引入生成式AI的承诺,无疑进一步巩固了其在创意工作者心中的地位。

库达总结道:“我们并不完全清楚这个故事将如何发展或结局如何,但我们相信,我们正走在支持人类创造力的正确道路上。”

32. $50 2GB Raspberry Pi 5 comes with a lower price and a tweaked, cheaper CPU (arstechnica.com)

2GB版 Raspberry Pi 5 发布摘要

价格与市场背景

2GB 内存版 Raspberry Pi 5 定价为 50 美元。虽然高于树莓派多年来 35 美元的初始基准价,但相比目前受供应链影响仍售价 45 美元的 2GB 版 Pi 4,仅高出 5 美元。

性能优势与适用场景

若将树莓派作为日常桌面 PC,8GB 版本是更佳选择。然而,2GB 版 Pi 5 在许多无需大内存的场景中,依然能凭借其提升的 CPU/GPU 速度及连接选项发挥显著优势:

  • 复古游戏模拟:额外提升的 CPU 和 GPU 速度可带来更好的运行体验。
  • 轻量级服务器:运行 Wireguard、Homebridge、Pi-hole 等应用时,可受益于更快的 Wi-Fi 和以太网速度,以及对 NVMe 存储更可靠的支持。

购买建议

对于多数用户,建议多花费 10 美元购买 4GB 版本。4GB 版本具备更高的灵活性和未来适应性,能够更好地满足后续新项目可能产生的更大内存需求。

发售信息

2GB 版 Pi 5 现已在 PiShop 和 CanaKit 等渠道开放订购,并即将陆续上架其他树莓派零售商。

33. Appeals court finds California’s “Age Appropriate Design Code” unconstitutional (www.techdirt.com)
34. Nasir Ahmed's digital-compression breakthrough helped make JPEGs/MPEGs possible (spectrum.ieee.org)

离散余弦变换(DCT)算法是数字图像、视频和音频压缩的核心技术,由印度裔美国工程师纳西尔·艾哈迈德(Nasir Ahmed) 于1974年发表的开创性论文中奠定基础。该算法实现了在几乎不损失关键视觉或听觉细节的前提下,大幅减小数字文件的体积,从而使得数字媒体能够在早期带宽有限的互联网上高效传输。没有它,现代互联网上的社交平台、流媒体和视频会议等应用将难以实现。

艾哈迈德在1960年代于霍尼韦尔公司工作时接触到信号处理技术,并开始研究图像压缩。1972年,他申请美国国家科学基金会资助以推进研究,但被以“想法过于简单”为由拒绝。在资金紧张的情况下,他与妻子节省开支,利用暑假时间坚持研究。他将图像像素数据转换为波形的技术与余弦函数相结合,通过量化及傅里叶变换,将图像数据分为重要和次要部分,最终开发出DCT算法。该算法能将文件压缩至原始大小的十分之一,且过程可逆。

DCT算法成为国际标准的基石:

  • JPEG标准:国际标准化组织于1983年成立联合图像专家组(JPEG),1992年发布的首个JPEG标准采用了DCT作为其核心压缩技术。
  • MPEG标准:1988年成立的动态图像专家组(MPEG)同样将DCT选为音频、视频等数据的压缩技术,首个标准于1993年发布。

这些标准直接推动了万维网的快速发展,使得图像和视频能够快速传播,彻底改变了互联网的面貌。

艾哈迈德在技术突破后回归学术界,于1993年回到新墨西哥大学,先后担任系主任、工程学院院长等职,直至2001年退休。

35. So you want to build an embedded Linux system? (jaycarlson.net)

本文探讨了构建嵌入式Linux系统的相关知识,针对熟悉微控制器但不熟悉微处理器的工程师,提供了选择应用处理器、设计硬件以及配置软件的实用指导。

核心论点

  • 运行Linux的优势:相比于在微控制器上使用RTOS,Linux提供了更强大的内存管理、网络协议栈、文件系统支持、多进程能力、丰富的语言/库支持以及更成熟的设备安全特性。
  • 挑战与权衡:运行Linux也带来功耗较高(尤其在休眠模式)、启动时间较长、实时性较差等挑战。
  • 处理器本质相同:一旦Linux成功启动,不同架构的应用处理器对上层应用而言基本成为统一的开发环境。
  • 重点在启动过程:文章的核心在于帮助读者理解并成功将Linux启动到不同处理器上,而非应用开发本身。

入门级处理器评测

作者从零开始为多款处理器设计了开发板,评估了它们的易用性:

  • SIP(系统级封装)芯片:如Nuvoton NUC980、Microchip SAM9X60,将CPU与内存集成,简化了PCB设计,适合初学者。
  • 需要外置内存的芯片:如NXP i.MX 6UL系列、TI AM335x、ST STM32MP1、Rockchip RK3308等,提供更多I/O和内存容量选择,但设计更复杂。
  • 芯片选择建议
    • 易用性:SAM9X60和i.MX 6UL系列在硬件设计和软件支持方面对新手较为友好。
    • 性能:RK3308和A33(Allwinner)在基准测试中表现突出。
    • 性价比:i.MX 6ULZ价格极具竞争力。
    • 特殊需求:STM32MP1集成Cortex-M4内核,适合需要实时控制的应用;V3s集成以太网PHY和音频编解码器,适合网络音视频设备。

硬件设计要点

  • BGA封装:0.8mm间距的BGA封装是主流,实际布线难度低于预期,且易于手工焊接。
  • 电源设计:通常需要多个电压域(如3.3V、1.8V、1.2V),可能需使用PMIC(电源管理集成电路)进行精密控制。
  • DDR内存布局:对于点对点的单颗DDR3L内存布局,长度匹配并非关键,信号完整性和电源完整性更重要。遵循基本的PCB堆叠和布线规则即可。
  • 非易失性存储:根据容量需求选择SPI NOR Flash、SPI NAND Flash或eMMC/SD卡。

软件工作流程

  • 核心组件:系统需要交叉编译工具链、U-Boot(引导加载程序)、Linux内核、BusyBox(精简用户空间工具集)和根文件系统。
  • 构建系统
    • Buildroot:基于Kconfig,配置直观,增量编译能力较弱,适合快速原型和简单系统。
    • Yocto:功能强大,支持增量编译和包管理,但学习曲线陡峭,配置复杂,更适合成熟的发行版构建。
  • 设备树:用于向Linux内核描述硬件配置,是驱动开发的关键。

基准测试摘要

  • Dhrystone:CPU整数性能与核心架构和主频正相关。Cortex-A35 > Cortex-A7 > Cortex-A5 > ARM9。
  • Node.js应用:性能取决于CPU、内存带宽和RAM容量。Cortex-A7/A35平台在充足RAM下可承载复杂Web应用。
  • 功耗:功耗随核心数量、主频和工艺提升而增加。SIP芯片的功耗数据通常优于分立方案。

其他值得关注的技术

  • Azure Sphere (MT3620):提供高度安全的预配置嵌入式Linux方案,开箱即用,开发简单。
  • Renesas RZ/A:集成大容量片上SRAM,支持XIP启动,功耗低。
  • MediaTek/Atheros WiFi SoC:常见于网络设备,通常直接使用模块而非裸芯片设计。

总之,构建嵌入式Linux系统是一个涉及软硬件多方面的工程。对于初学者,从易于设计的SIP芯片和Buildroot入手是实践的好方法;而对于有经验的开发者,则可根据项目需求,在更广泛的处理器和构建系统中做出选择。

36. HID Remapper (github.com)

HID Remapper 摘要

产品概述

HID Remapper 是一款可配置的USB硬件适配器,用于重新映射鼠标、键盘及其他USB/无线/蓝牙设备的输入信号。其核心特点是在硬件层面工作,电脑端无需安装任何软件。主要功能包括:

  • 按钮/按键重新分配与布局更改
  • 鼠标与键盘输入互换映射
  • 永久或临时修改鼠标灵敏度(通过按键触发)
  • 任意角度旋转鼠标坐标轴
  • 鼠标按键拖拽锁定、移动鼠标实现滚动等高级操作
  • 支持轮询率超频至1000Hz
  • 可同时连接多个设备(通过USB集线器),并为每个设备设置独立映射

版本与制作方式

共有三种主要实现方式,功能完全相同:

  1. 购买现成板卡:使用Adafruit的Feather RP2040 USB Host板,刷入remapper_feather.uf2固件即可使用。
  2. 自制:基于树莓派Pico(单Pico或双Pico方案)制作。
  3. 定制PCB:使用提供的文件在JLCPCB等厂商生产自定义电路板。

另有两个特殊版本:

  • 串行版:接收RS-232串口鼠标输入并转换为USB信号。
  • 蓝牙版:基于nRF52840芯片的板卡(如Feather nRF52840 Express, Xiao nRF52840),将蓝牙输入转换为USB。

配置方法

通过浏览器(需支持WebHID的Chrome或兼容浏览器)访问 remapper.org/config 进行配置。如无法使用浏览器,亦提供仅测试于Linux的命令行工具,接受JSON格式输入。

固件更新流程

通用流程如下:

  1. 连接设备到配置网站。
  2. 若固件非最新,网站会提示并提供兼容旧固件的配置界面链接。
  3. 点击链接,通过“Open device”连接设备。
  4. 进入“Actions”选项卡,点击“Flash firmware”使设备进入刷写模式。
  5. 电脑上会出现一个USB驱动器(RP2040板通常为“RPI-RP2040”)。
  6. 下载并复制对应型号的固件文件(.uf2)到该驱动器。
  7. 对于特定版本(如定制板v1, v2, v5-v7),刷写后需重新插拔设备。 双Pico方案需分别刷写A、B侧固件。

更新固件会保留当前配置。建议更新前先导出配置为JSON文件备份。

各型号对应固件文件表:

型号 固件文件 备注
单Pico remapper.uf2
双Pico remapper_dual_a.uf2, remapper_dual_b.uf2 需分别刷写A/B侧
Feather RP2040 USB Host remapper_feather.uf2
定制板 v1, v2, v5, v6 remapper_board.uf2 刷写后需重新插拔
定制板 v3, v4 remapper_feather.uf2
定制板 v7 remapper_board_v7.uf2 刷写后需重新插拔
定制板 v8 remapper_board_v8.uf2
Feather nRF52840 Express remapper_adafruit_feather_nrf52840.uf2
Xiao nRF52840 remapper_seeed_xiao_nrf52840.uf2
串行版 remapper_serial.uf2

编译固件

  • 简易方式:Fork GitHub仓库,通过GitHub Actions自动编译,从制品中获取二进制文件。
  • 本地编译
    • RP2040固件:需安装交叉编译工具链,使用CMake和Make构建。
    • nRF52840蓝牙固件:可遵循Nordic官方指南或使用提供的Docker命令进行编译。

许可证

  • 软件部分:MIT许可证。
  • 硬件设计部分:知识共享署名4.0国际许可协议(CC BY 4.0)。
37. Ask HN: How do you work as a tech lead?