diff options
| author | eltrac <hi@eltr.ac> | 2026-10-05 11:17:14 +0800 |
|---|---|---|
| committer | eltrac <hi@eltr.ac> | 2026-10-05 11:17:14 +0800 |
| commit | f444c5198d7093ea919c7c7d2f913fbe91394df1 (patch) | |
| tree | f4db2f3bc4f43b6a12522ee102e2776e4e755290 /content | |
| parent | 8add4dbdae97ce86111969903e72391d3cf778d6 (diff) | |
[draft] update
Diffstat (limited to 'content')
| -rw-r--r-- | content/weekly/101.md | 82 |
1 files changed, 78 insertions, 4 deletions
diff --git a/content/weekly/101.md b/content/weekly/101.md index 7e5066e5..b0e9df48 100644 --- a/content/weekly/101.md +++ b/content/weekly/101.md @@ -217,17 +217,85 @@ PKM 体系有不少,而且有各种缩略词,比如卡片笔记(Zettelkast ### WebAssembly in Anubis -https://anubis.techaro.lol/blog/2026/anubis-wasm/ +> [!note] 📜 +> [It took a year to ship WebAssembly in Anubis](https://anubis.techaro.lol/blog/2026/anubis-wasm/) + +基于 PoW[^7] 的网站防火墙 Anubis 终于在花了一年时间后支持了 WebAssembly,这是出于性能考量,WebAssembly 是编译好的、可以在浏览器和服务器等多种环境运行的二进制文件,要比浏览器解释 JavaScript 代码快很多,性能也有很多优化空间。 + +Anubis 长期面临的问题是手机等电子设备的 CPU 太差,运行难度稍微高一点的 PoW 运算就会卡顿发烫,但又不能给手机用户直接降低难度,因为爬虫可能会把自己伪装成手机。按特征分类需要很谨慎才不会留下漏洞,然而 Anubis 又是开源的,不能指望爬虫不会发现线索。 + +使用 WebAssembly 可以在一定程度上解决性能问题,也能让 Anubis 的速度变快,毕竟没有用户想要被拦住太久。他们还顺带解决了 PoW 难度的[升阶问题](https://anubis.techaro.lol/blog/2026/anubis-wasm/#finally-fixing-the-challenge-difficulty-scaling-issue)。 + +给 Anubis 加上 WebAssembly 比其他应用难很多,因为 Anubis 需要兼容非常老的浏览器版本和机型,不然就会把用老机器的用户拦截在外。这段一般的 Web 应用来说问题不大,但 Anubis 的初衷就是拦截 “AI” 爬虫,保证能访问网站的都是真人,向后兼容性对开放的万维网很重要。他们在[这一年的过程](https://anubis.techaro.lol/blog/2026/anubis-wasm/#the-ride-never-ends)中才了不少坑,甚至还发现了(Xe Iaso + 本人职业生涯中第一个)LLVM 编译器的 Bug,可以说从设计、实现、测试到编译,都因 Anubis 的特殊性遇到了很多难题。 + +我之前给自己的 [Forgejo 实例](https://src.eltr.ac)安装过 Anubis,其实拦截很有效,不过我不觉得自己的网站会承受那么多爬虫的流量(尽管它们确实非常*非常*多),拦截验证自己本就不多的访客似乎不太好。于是我在后来换成了简单的 Cookie 验证。如果有任何人需要的话,Anubis 其实相当不错,可见其主要维护者是在用心做软件的——不过他们其实也在用 Agent 开发 Anubis,这可真是让我…… 心情复杂。 + +尽管不用 Anubis,我最近确实在考虑安装 Iocaine。我也在 Tim McCormack 的博客上读到一篇[好玩的文章](https://www.brainonfire.net/blog/2024/09/19/poisoning-ai-scrapers/),他用 Rust 实现了[非联合通讯社算法](https://en.wikipedia.org/wiki/Dissociated_press)[^8],可以把文字替换成看着像真文本但实际读起来没有任何意义的内容。我有点想设计并实现中文版本的非联社通讯社,把用算法扭曲过的内容喂给不守规矩的爬虫。 ### 现代化开源桌面端 > [!note] -> [](https://lwn.net/SubscriberLink/1095425/2d9f411252325784/) +> [Ideas on modernizing the open-source desktop](https://lwn.net/SubscriberLink/1095425/2d9f411252325784/) + +LWM(Linux Weekly News)报道了 Scott Jenson 在 KDE 的年度会谈上的讲话。Jenson 在 Apple 和 Google 都有做 UI/UX 设计师的经验。如果读者也接触过 Linux 桌面端或者别的开源桌面软件,会发现自由和开源的桌面端软件中很难找到 UI/UX 设计精良的。Jenson 想要「现代化」开源桌面端。 + +Jenson 表示开源桌面端的一大问题是,他们在过去一直跟随 Windows 和 macOS 的设计,但事到如今,这些操作系统背后的公司其实也有些摆烂了,他们不再稳定产出值得参考的 UX 设计。我仔细回忆了一下最近 Microsoft 和 Apple 在桌面端做了些什么,我只能想到:[Windows 现在才在快照版本的 File Explorer 里支持 `~`](https://learn.microsoft.com/en-us/windows-insider/release-notes/experimental/preview-build-26340-9596#:~:text=Address%20Bar%20now%20supports%20%27~%27),他们在 Windows 11 才支持 `sudo`(并且我自己体验下来觉得很难用),还有刚过去不久的 macOS Tahoe 的丑陋 UI 设计和噩梦般的性能消耗(Golden Gate 要好很多的,但依旧没有好的创新)。 + +总之,Jenson 的意思是说,我们(开源社区)应该把领导权放到自己身上。说实话我也挺期待有越来越多优秀的 UI/UX 设计师在开源社区涌现,让开源桌面端反过来变成商业桌面端的参考对象。 + +Jenson 还提到了大语言模型,他本来不想谈却又不得不提。他的原话是这样的: + +> I have to talk about AI, and it pisses me off because there's so many cool things we could be talking about, and AI just sucks up all the oxygen, and it's all you can talk about. +> +> 我不得不提到 AI,我很生气,因为我们明明有很多很酷的事情可以讨论,但 AI 把占据了所有的氧气,你能谈的就只有 AI 了。 + +我深有同感!我记得我之前还抱怨过此事,得到的回应竟然是:技术社区允许讨论技术之外的东西吗?真是令人唏嘘,人们似乎下意识地觉得除了语言模型之外再无其他可以讨论的技术,觉得语言模型就是人工智能这一概念的全部。 + +Jenson 说在 Claude Code 以前,人们都在原有的应用里乱塞 LLM,直到 Claude Code 推出了新的 UI/UX 设计(然后一大堆同类的 Agent 就涌现了……),他认为我们可以有更多这样的设计。不过他有提及,他自己也痛恨大模型公司做的那些事情,不过随着 [Apertus AI](https://apertus-ai.org/)[^9] 的出现,他看到了合法合规合乎道德的语言模型的可能性,未来兴许这样的模型会改变桌面端。 + +又一件令人唏嘘的事情,火起来的是 Jev 而不是 Apertus…… + +Jenson 认为开源用户也是在意 UI/UX 体验的。他记得之前向 KDE 提过一个功能,在 macOS 上,在窗口之间拖拽元素时,在鼠标释放之前,被拖拽元素所在的窗口都不会升起来(raised),也就是不会突然挡住要拖过去的那个窗口。窗口是在鼠标释放之后才升起来的。之前 KDE 不是这样,他提出之后,这个功能很快就被一个贡献者实现了。 + +我其实很想给开源桌面端贡献,不过我确实没有什么桌面端开发的经验。我做桌面端的话,大概只会用网页套壳(当然不会用 Electron,大概会用 Tauri 或者 Wails),而且也没什么点子。兴许我可以去了解 Qt 之类的框架。 ### 函数式编程让复杂系统更容易构建 -> [!note] -> [](https://flexiana.com/hidden/why-functional-programming-makes-complex-systems-easier-to-build) +> [!note] 📜 +> [Why Functional Programming Makes Complex Systems Easier to Build](https://flexiana.com/hidden/why-functional-programming-makes-complex-systems-easier-to-build) + +### 怂货式编程 + +> [!note] 📜 +> [On cowardness in Clojure code](https://grishaev.me/on-clojure-cowardness/) + +Ivan Grishaev 观察到一种很常见的 Clojure 编程模式: + +```clojure +(defn double-number [x] + (when x + (* x 2))) + +;; or + +(defn get-user [id] + (when id + (jdbc/execute! *db* ["select..." id]))) +``` + +简单来说,人们喜欢在函数定义里套一层 `when`,确保参数不是 `nil`(空值)才执行代码。如果参数是 `nil`,函数的返回值也会变成 `nil`,程序不会崩溃也不会有任何报错。这看起来少了很多麻烦,程序不会动不动就崩溃了。Grishaev 把这种编程模式称作「怂货式」(coward style)。 + +这么做仅仅是让问题更难定位了。Clojure 代码里经常出现较长的执行管线,数据从一个函数传递给下一个函数,函数链中有一个函数返回了 `nil`,整个链路的结果都会变成 `nil`,而中间不会有人和函数报错,只能一个个排查。 + +Grishaev 认为,如果即将传给函数的参数是 `nil`,那这个函数根本不该被执行。Clojure 里已经有 `some->` 宏可以做到这点了,在管线里有任何返回值是 `nil`,`some->` 就不会调用下一个函数。 + +```clojure +(some-> (get-user-id) (get-user)) +;; 如果 get-urser-id 返回 nil,get-user 不会被调用 +``` + +说实话我是读了这篇文章才第一次知道 `some->` 这个函数,Clojure 标准库里的函数不少,要全部了解应该很难。 --- @@ -248,4 +316,10 @@ https://anubis.techaro.lol/blog/2026/anubis-wasm/ [^6]: 见博客的[洞察](https://www.geedea.pro/stats/)页面,里面有每月的文章字数统计。 +[^7]: *Proof of Work*,工作量证明,即要求客户机计算一段无意义的复杂运算,服务端得到正确答案之后放行。这能拦住一部分爬虫,同时也使得爬虫爬取网站的成本变高,因为 PoW 会消耗大量 CPU 时间。 + +[^8]: 译注:原文 *Disassociated press*,我没有找到译名。这个词本来是对 *Associated press*(联合通讯社;美联社)的戏仿,所以我依照这层意思译作「非联合通讯社」。我也想过「丑联社」这个译名。 + +[^9]: Apertus 是完全开放权重、**开放训练数据**、开放文档,任何人都可以复现的小语言模型。 + |
