Others

来自 Others 的文章

Cards List

关于分叉 Web

Lobsters Hottest · 4小时前 缓存

开发者 Rodrigo Arias Mallo 提议通过创建一套替代性的、简化的 HTML/Web 规范来实现 Web 的分叉,目标包括严格的语义化版本控制、正式且无歧义的语法,以及限制规范体量以促进浏览器多样性。该提议与轻量级浏览器 Dillo 项目相关联。

0 人收藏 0 人点赞

Inflorescence – 适用于 Pijul 的跨平台原生 GUI

Lobsters Hottest · 6小时前 缓存

Inflorescence 是一款为 Pijul 版本控制系统打造的跨平台原生 GUI,使用 Rust 和 iced 框架构建,灵感来源于 Magit,专为键盘驱动导航和异步响应而设计。

0 人收藏 0 人点赞

Chrome 的 AI 功能可能正在占用你电脑的 4GB 存储空间

Lobsters Hottest · 6小时前 缓存

Google Chrome 正在自动向用户设备下载一个 4GB 的 Gemini Nano 模型权重文件,用于支持设备端 AI 功能,如诈骗检测和写作辅助,但通常不会明确告知用户所需的存储空间。用户可以在 Chrome 设置中关闭"设备端 AI"开关,以删除该文件并阻止重新下载。

0 人收藏 0 人点赞

killswitch:一种基于函数粒度的短路熔断原语

Lobsters Hottest · 8小时前 缓存

# 新 Linux 内核补丁提议引入"killswitch"原语,可即时禁用存在漏洞的内核函数 一项新的 Linux 内核补丁提议引入一种"killswitch"原语,允许管理员立即禁用存在漏洞的内核函数(例如 `af_alg_sendmsg`),使其返回 `-EPERM`,从而为安全问题提供快速的临时缓解措施,无需重启系统或重新编译内核。

0 人收藏 0 人点赞

# 引导 Zig Fmt 在过去的几个月里,我一直在研究 Zig 格式化工具(`zig fmt`)的演变方向,最终形成了[这份提案](https://github.com/ziglang/zig/issues/20078)。由于这是一个颇具争议的话题,我想在这篇文章中详细阐述其中的权衡考量。 ## 现状 `zig fmt` 是一个固执己见的格式化工具:它会将 Zig 代码格式化为单一的规范形式,且不受用户配置的影响。这类工具(如 `gofmt`、`prettier`)有一个显著优势:当整个生态系统都使用同一格式化工具时,就能消除围绕风格的无谓争论,并确保所有代码的外观一致。 然而,现有的 `zig fmt` 存在一个问题:它实际上并不是完全固执己见的——格式化结果会根据用户的输入而变化。 以下面这个例子为例: ```zig const x = foo(1, 2, 3); ``` 如果你在最后一个参数后面加上一个逗号: ```zig const x = foo(1, 2, 3,); ``` `zig fmt` 会将其格式化为: ```zig const x = foo( 1, 2, 3, ); ``` 这意味着代码的格式化方式(单行还是多行)取决于用户是否添加了尾随逗号。此外,`zig fmt` 对于其他一些构造也并非完全固执己见,例如注释的位置。 ## 问题所在 为什么这是个问题呢?毕竟,根据尾随逗号来决定格式化方式,这是一种广为人知且合理的约定。 问题在于,这种方案实际上给了用户两种选择:单行格式和多行格式。这意味着用户必须做出决定,而这恰恰是格式化工具本应消除的那类决策。 更糟糕的是,这个决定并没有一个客观正确的答案,因为适合单行还是多行,往往取决于行的长度——而行的长度会随着变量名、参数等的变化而改变。 举个例子,假设你有: ```zig const x = foo(1, 2, 3); ``` 这段代码很短,放在一行完全没问题。但如果函数名变长了呢? ```zig const x = a_longer_function_name(1, 2, 3); ``` 还是挺短的。那如果更长呢? ```zig const x = a_much_much_longer_function_name(argument_one, argument_two, argument_three); ``` 这行已经相当长了,或许应该换成多行格式: ```zig const x = a_much_much_longer_function_name( argument_one, argument_two, argument_three, ); ``` 但在当前的 `zig fmt` 机制下,你需要手动添加尾随逗号来触发这个格式化。如果你重构代码,将函数名改短,或者把参数替换为更短的名称,那么多行格式可能就不再必要了——但 `zig fmt` 不会自动帮你切换回单行格式,因为它会把尾随逗号视为"保持多行"的明确指令。 ## 解决方案 解决方案是让 `zig fmt` 基于行长度自动决定使用单行还是多行格式。具体来说:如果一个表达式能放在一行内(不超过某个长度限制,比如 100 个字符),就使用单行格式;否则,使用多行格式。 这正是 `prettier` 的工作方式,也是大多数现代格式化工具所采用的方案。 这意味着尾随逗号将不再具有语义上的格式化含义。你可以写: ```zig const x = foo(1, 2, 3,); ``` `zig fmt` 会根据行长度自动决定使用哪种格式,而不是盲目地遵循尾随逗号的指示。 ## 争议点 这项改动之所以有争议,主要有以下几个原因: **1. 人们习惯了现有的行为** 很多 Zig 开发者已经习惯于用尾随逗号来控制格式化。改变这一行为会打破他们的工作流程。 **2. 基于行长度的格式化可能产生令人惊讶的结果** 当你重命名一个变量,导致某行超过了长度限制,整个表达式的格式可能会突然从单行变成多行。这种"蝴蝶效应"可能让人感到困惑。 **3. 需要确定合适的行长度限制** 100 个字符?80 个字符?这本身也是一个需要决策的问题,尽管它只是一次性的决策,而不是每次写代码都要面对的决策。 ## 结论 尽管存在争议,我认为基于行长度的自动格式化是正确的方向。它让 `zig fmt` 真正成为一个固执己见的格式化工具,消除了用户需要做出的格式化决策,并确保代码在重构后始终保持最优的格式。 这与 Zig 语言的整体设计哲学是一致的:减少不必要的复杂性,让工具为开发者做出明智的决策,从而让开发者能够专注于真正重要的事情。

Lobsters Hottest · 8小时前 缓存

# 两个让 `zig fmt` 更好用的技巧 Zig 配备了一个内置的代码格式化工具 `zig fmt`。与其他语言的格式化工具不同,`zig fmt` 是"可操控的"——某些语法结构会影响格式化的输出结果。本文将介绍两个实用技巧。 ## 技巧一:尾随逗号控制布局 `zig fmt` 会根据是否存在尾随逗号来决定参数的排列方式。 **没有尾随逗号**时,格式化工具会尝试将所有参数放在同一行: ```zig const result = myFunction(argument1, argument2, argument3); ``` **有尾随逗号**时,格式化工具会将每个参数单独放在一行: ```zig const result = myFunction( argument1, argument2, argument3, ); ``` 这个规则同样适用于函数定义的参数列表、结构体字段、枚举变体等场景。 ```zig // 单行:无尾随逗号 const Point = struct { x: f32, y: f32 }; // 多行:有尾随逗号 const Point = struct { x: f32, y: f32, }; ``` 这意味着你可以通过添加或删除尾随逗号来主动控制格式化的输出,而不必与格式化工具"博弈"。想要多行展示?加上尾随逗号。想要单行展示?去掉它。 同样的逻辑也适用于换行符。如果你在参数之间手动添加了换行符,`zig fmt` 会尊重这个选择并保留多行格式——前提是同时带有尾随逗号。 ## 技巧二:数组的列式格式化 对于数值数组,`zig fmt` 支持一种特殊的列式格式化方式,非常适合用来表示矩阵或表格数据。 只需在数组元素之间手动插入换行符,`zig fmt` 就会将数据对齐成整洁的列式布局: ```zig // 格式化前(你写的) const matrix = [_]f32{ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, }; ``` ```zig // 格式化后(zig fmt 输出) const matrix = [_]f32{ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, }; ``` `zig fmt` 会识别出你在每行放置了相同数量的元素,并将各列对齐,使代码更具可读性。这对于表示变换矩阵、查找表或任何具有内在行列结构的数据来说极为方便。 ```zig // 一个更直观的例子:查找表 const sine_table = [_]f32{ 0.000, 0.174, 0.342, 0.500, 0.643, 0.766, 0.866, 0.940, 0.985, 1.000, 0.985, 0.940, 0.866, 0.766, 0.643, 0.500, }; ``` ## 小结 `zig fmt` 的"可操控"设计哲学让格式化工具成为你的合作伙伴,而不是独裁者: - **尾随逗号** → 强制多行展开 - **无尾随逗号** → 允许单行折叠 - **手动换行 + 统一列数** → 触发列式对齐 掌握这两个技巧,你就能在享受自动格式化便利的同时,保留对代码视觉呈现的精确控制。

0 人收藏 0 人点赞

第十二届 Plan 9 国际研讨会(演讲合集)

Lobsters Hottest · 9小时前 缓存

第十二届 Plan 9 国际研讨会的演讲内容已通过 YouTube 播放列表分享,涵盖与 Plan 9 操作系统社区相关的多个主题。

0 人收藏 0 人点赞

具备发现 Bug 概率保证的随机调度器

Lobsters Hottest · 9小时前 缓存

Microsoft Research 的这篇论文介绍了一种随机调度技术,旨在为发现软件系统中的 Bug 提供概率性保证。该成果已发表于 ASPLOS 会议,核心在于利用算法随机性来实现系统化的故障检测。

0 人收藏 0 人点赞

我今天学到了关于GPU的知识

Lobsters Hottest · 16小时前 缓存

一位游戏开发者讲述了他在游戏《Blackshift》中修复GPU渲染bug的经历。问题是将8位邻接整数转换为浮点数时出现的浮点数精度问题,导致在部分NVIDIA GPU上出现视觉瑕疵,且该bug只在主渲染模式中出现,预览模式中并未出现。

0 人收藏 0 人点赞

CVE-2026-31431: Copy Fail

Lobsters Hottest · 16小时前 缓存

CVE-2026-31431(Copy Fail)是Linux内核中的一个本地提权漏洞,影响自2017年以来的所有主流发行版,允许非特权用户通过AF_ALG加密子系统对任何可读文件的页缓存进行确定性的4字节写入,从而获得root shell访问权限。

0 人收藏 0 人点赞

jank 现已拥有自己的自定义 IR

Lobsters Hottest · 17小时前 缓存

jank 是一种 Clojure 方言,现已引入一种在 Clojure 语义层面设计的自定义中间表示,以实现更好的优化并与 JVM 竞争。

0 人收藏 0 人点赞

Let's Encrypt 因潜在事件停止发放证书

Lobsters Hottest · 17小时前 缓存

Let's Encrypt 因潜在事件正在停止证书发放,同时进行计划的数据库维护,可能导致 ACME 客户端超时最长 10 分钟。

0 人收藏 0 人点赞

NixOS 与密钥管理

Lobsters Hottest · 17小时前 缓存

教程介绍 NixOS 的密钥管理选项,比较 sops-nix、agenix 和 ragenix 工具,并提供使用 sops-nix 进行加密密钥管理的实际示例。

0 人收藏 0 人点赞

漏洞花园:一份不断增长的命名漏洞、攻击技术与利用手段列表

Lobsters Hottest · 18小时前 缓存

漏洞花园是一个精心整理的命名漏洞、攻击技术与利用手段列表,为每个条目提供参考来源和日期。

0 人收藏 0 人点赞

VMC2040安全摄像头的Root操作

Lobsters Hottest · 19小时前 缓存

本篇博客文章是系列教程的第一部分,内容涵盖硬件检查、UART发现以及初始Bootloader分析,目标是对Arlo VMC2040安全摄像头进行Root操作。

0 人收藏 0 人点赞

上次代码变便宜时我们失去了什么

Lobsters Hottest · 21小时前 缓存

本文类比了2000年代初的外包时代与当前AI生成代码的趋势,指出廉价代码的真正代价是失去了人类的理解力和上下文。

0 人收藏 0 人点赞

没人要求的 `Sync` 约束

Lobsters Hottest · 22小时前 缓存

解释了在具有 `Send` future 的异步 trait 方法中使用 `&self` 如何隐式要求实现类型具有 `Sync`,并提供了诸如改用 `&mut self` 或使用 `Sync` 内部可变性等解决方法。

0 人收藏 0 人点赞

在树莓派 Zero 上完全运行于 RAM 中提供网站服务

Lobsters Hottest · 昨天 缓存

本教程介绍如何在树莓派 Zero v1.3 上使用 Alpine Linux 搭建无磁盘网站,系统完全启动至其 512MB RAM 中。详细说明了所需硬件、操作系统配置、轻量级 Web 服务器以及将 TLS 终止卸载到外部 VPS 的方法。

0 人收藏 0 人点赞

就用Go

Lobsters Hottest · 昨天 缓存

一篇带有强烈观点的开发者文章倡导使用Go编程语言,强调其简洁的语法、强大的标准库、高效的并发模型以及单二进制部署,作为对过于复杂的现代技术栈的实用替代方案。

0 人收藏 0 人点赞

Wii IP6 webserver

Lobsters Hottest · 昨天

一个在任天堂Wii上运行的支持IPv6的网页服务器。

0 人收藏 0 人点赞

在Ryzen AI 7 350 NPU上达到峰值TOPS性能

Lobsters Hottest · 昨天 缓存

关于在AMD Ryzen AI 7 350 NPU上实现峰值TOPS性能的技术深度剖析,与Xilinx AIE-ML v2 AI引擎进行比较,并解释用于矩阵乘法工作负载的硬件架构。

0 人收藏 0 人点赞
Next →
← 返回首页

提交意见反馈