+++
title = "大脑充血 Vol.101"
subtitle = "如何不让道德观把自己与世界隔绝开来?"
tags = ["精选","道德","技术","猎巫","Lisp","Clojure","原生家庭","效率","开源","编程"]
date = 2026-10-05 17:18:33
draft = false
toc = true
endnotes = []
fedi = 'https://akk.eltr.ac/objects/be477fd8-4c30-4da6-8ecc-3939a7e0df06'
+++
我一直说周刊是每周一发布,每月正刊也是,从没限定具体时间,就是考虑到了发布当天赶死线的情况。这期周刊的一小半内容都是周一写的,但质量确是我认为创刊以来最佳的一期,也是最长的,超过了一万字。祝阅读愉快。
本月的话题是道德与纯粹性,个人知识管理,市场的辨别力,开源软件与 UX 设计,Clojure 与函数式编程。
---
## 吾仅悉落
{{< music cover="https://img.eltr.ac/geedeapro/weekly/101/chapter1.jpg" title="chapter 1" artist="girl in red" neodb="https://neodb.social/album/4f7Vc6d42sapluwBrM86x6" >}}
Girl in Red 是我之前听一个叫 Chloe Moriondo 的翻唱歌手了解到的(当时 Chloe 还在 YouTube 上发尤克里里弹唱的视频,如今似乎变成原创流行歌手了,少了些味道)。
她的不少歌曲描写的都是对女生的爱恋,还有抑郁情绪。貌似不少拉拉会以「你听 Girl in Red 吗?」来辨认身份。*我好奇男同会用谁,Taylor Swift 和 Lady Gaga 吗?难不成是 Troye Sivan?*
《chapter 1》是她的第一张 EP,至今为止她只发过《If I Could Make It Go Quiet》和《I'm Doing It Again》两张录音室专辑。这张 EP 为她的风格奠定了基础,像是在一个朦胧的午后,半眯着眼睛看这个世界的感觉。
我个人最喜欢的是《i wanna be your girlfriend》和《summer depression》。
---
## 心重如毛
### 如何与自己谴责的人共建友谊?
> [!note] 📻
> [作者对谈:朋友是否比真理更加重要?(Roger Berkowitz)](https://podcasts.apple.com/cn/podcast/%E7%8B%AC%E6%A0%91%E4%B8%8D%E6%88%90%E6%9E%97/id1711052890?l=en-GB&i=1000792292979)
巴德学院汉娜·阿伦特政治与人文中心的创始人 Roger Berkowitz 近期出版了一本叫作《A World We Share》(我们共同的世界)的著作,讨论友谊与真理的关心。本书聚焦一个十分具有张力的核心问题:友谊比真理更重要的吗?Berkowitz 的答案是肯定的。
2017 年,Berkowitz 邀请了德国极右政客 Marc Jongen 到阿伦特中心的[十周年秋季会谈](https://hac.bard.edu/con2017)讲话,后来还[发文](https://medium.com/@arendt_center/an-open-letter-on-the-hannah-arendt-centers-inclusion-of-a-talk-by-marc-jongen-as-part-of-the-46390f0ddb9d)为他的邀请做辩护。此举遭到了学界同行的共同谴责(顺带一提,汉娜·阿伦特是德国纳粹大屠杀的幸存者),他们写了一封[公开信](https://www.chronicle.com/article/an-open-letter-to-the-hannah-arendt-center-at-bard-college/)谴责他。Berkowitz 本身并不持极右政治观点,他邀请 Jongen 是出于多元(Pluralism)考虑。
当时,签署那份公开信的人当中有他一起吃饭聊天的朋友。
对谈中,Berkowitz 提及了真理的霸权(Tyranny of Truth)这个概念。他说他之前读到了西塞罗(Cicero)说过的一句话,那句话让他读过之后的几年内都感到内心不安:
> I prefer, before heaven, to go astray with Plato, your reverence for whom I know, and admiration for whom I learn from your lips, rather than hold true views with his opponents.
>
> 我宁愿与柏拉图一同误入歧途——我知道你敬重他,也能从你的言谈中了解你对他的倾佩——也不愿意和他的反对者一同持有正确的观点。
{{< right "——[Cicero in twenty eight volumes. Vol.18: Tusculan Disputations, P47](https://archive.org/details/cicero-in-28-volumes.-vol.-18-loeb-141/page/n59/mode/2up?q=astray)" >}}
如今的世界不是这样的,如今的世界被「哲人王」统治,我们已经接受,我们需要学识超群的人(拥有博士学位的人、政客、科学家)来指导我们的思考。他们说一不二。我们不在乎不同的观点,我们在乎真理(truth over opinion),而真理就是哲人王的观点。
Berkowitz 转述另一位学者的观点,说政治是说服,而非真理,但「共同的世界」并不能靠说服建立。人们面对面交流想法,而不是试图说服持有“错误观点”的人。在交流的过程中,==人们意识到互相共有的东西和不能达成共识的东西,基于共有的东西建立起一个「共同的世界」,在这个世界里允许不和存在。==
尽管我不太能完全接受「朋友比真理更重要」的观点,但我的确认可,应该允许自己与朋友之间存在不和。友谊就是人们先建立起的「共同的世界」,在友谊中可以包容观点不合。
播客中还谈到了阿伦特自己对友谊的看法,阿伦特认为认识并且有来往并不代表成为了朋友,有时候在外人看起来像朋友的人,阿伦特自己却不会承认,尽管她真的像关心朋友一样关心对方。她认为真正的友谊是需要时间建立的,朋友需要经常面对面说话,需要在各种场合出席,需要相互陪伴。友谊也是具有私密性的,公开的社交场合不是给朋友的,朋友是自己会邀请到家里来小聚的人。阿伦特本人也十分珍重隐私,她的私人生活(包括她与海德格尔的恋情)在去世前从未为世人所知。
在我看来,并不是要和自己有意见冲突的人做朋友,而是要允许自己已经通常长期的交往和陪伴建立起共同世界的朋友,与自己有观点不合。比如,允许他们给自己写公开谴责信,但仍在私下谈天说地,因为私密的友谊和公共生活本身就有区别,这不是伪君子。
甚至说,正是因为有观点的冲撞和关心当中的张力,友谊才能长久,就像动物之间相互扑咬玩耍一样。从人类的层面来讲,允许朋友挑战自己,也有助于塑造人格。
博客中的相关条目:[《如何获得内心的安宁》什么是友谊?](https://www.geedea.pro/library/2026/how-to-find-peace/#%E4%BB%80%E4%B9%88%E6%98%AF%E5%8F%8B%E8%B0%8A)
---
顺带一提,Roger Berkowitz 教授还有[自己的网站](https://www.vernunft.org/),不过他并不写博客,这个网站类似于个人名片。可以在网站上了解他的学术成果。
你可能注意到这一小节的链接中没有包含播客名字,因为我想要在最后才揭露这是一期来自《独树不成林》的播客。下一节我们要考虑一个略微不同但与标题相关的问题:我们能完全理性地看待一个有洗稿抄袭前科的人产出的内容吗?我们如何不让自己的道德观念把自己与世界完全隔绝开来?
### 无法统一的道德观念与技术猎巫
> [!note] 📜
> [Tech choices](https://inessential.com/2026/08/24/tech-choices.html)
[第 95 期周刊](/weekly/95/#仲树让我反思播客这一媒介)中我提到《独树不成林》主播仲树洗稿抄袭一事。有人发现她发布的好几期播客节目从内容、结构和例证上都与 [Old School with Shilo Brooks](https://www.thefp.com/p/lolita-jeffrey-epstein-and-the-real-ca1) 等播客十分相似,而舆论发酵后,仲树本人并没有回应,连着发布了三期播客之后,就陷入了一个多月的沉默期。上一节提到的播客是她在那之后发布的第一期播客。
新播客是一起访谈,仲树只是提问者,偶尔提出自己的见解,内容基本都是 Roger Berkowitz 输出的,所以不太可能构成洗稿。不过,先前的洗稿基本上坐实了,她自己也没有为自己开脱。我不能为其他听众说话[^1],我自己的感想是,这个有洗稿前科的人推出了新的内容,质量很不错,我听完也写了不少感想(见上),但这些内容出自一个“罪人”,所以我现在的心情很复杂。
我最近不是第一次感受到这样的心情了。我们把目光从播客内容生态先移开,来看看日益变得不太平的技术社区。先有[语言模型分裂自由软件社群](https://blog.codeberg.org/protecting-our-floss-commons-from-llms.html)、[“AI” 公司损毁珍贵实体书籍](https://annas-archive.gl/blog/physical-destruction.html),后有[科技公司争先恐后给极右分子送钱](https://chlo.is/a-cooked-distro/)、[开发者四处猎巫 DHH](https://github.com/neovim/neovim.github.io/issues/501)。与此同时,硬件价格居高不下,美国燃烧化石燃料为他们修的一座又一座数据中心供电,OpenAI、Anthropic 和 Gemini 都一个接一个地忽略基本的安全措施,把研究事故包装成「AI 太强我们已经管不住啦!」的广告神话。
说真的,我时常好奇人们是怎么平静下来的。是我的主导功能 Fi 过度发力,还是其他人对这些信息都充耳不闻?真的会有人在读完 Open Slopware 列出的[条条罪状](https://codeberg.org/ethical-foss/open-slopware/src/branch/main/why_not_llms.md)之后,还能心安理得地给那些不尊重创作者、肆意违反授权协议、偷窃训练数据的人送钱吗?
然而,摆在我面前的事实是:似乎是这样的,似乎大家在了解过这些不道德甚至违法[^2]的行径后,依旧跟语言模型聊得不亦乐乎,依旧把版权状态不明的代码和文本用自己选择的授权协议发布。这些人不是随随便便的网友,而是不少我在过去以及现在都有着不少接触的人。他们甚至会为自己的行为冠以美名,比如某某模型有这样那样的问题,但另一个模型就没有,比如「LLM 让我感到自己不是在写代码,而是在创造」。
所以,我的心情很复杂。
不只是 LLM 相关,最近 NetNewsWire 的作者 Brent Simmons 也面临技术选择相关的两难。[MacStories](https://ticci.craft.me/explanation) 在八月份回到了社交媒体 X 上。X 不仅是封闭平台,还是由 Elon Musk 这号人物管理的,Simmons 表示谴责。与此同时,他意识到自己的技术选择也不是“纯洁”[^3]的。
> Do you have an iPhone? A Mac or iPad?
> 你有 iPhone 吗?一台 Mac 或者 iPad?
>
> Do you order from Amazon, buy groceries from Whole Foods, or use any of their other properties (Prime Video, Twitch, Audible, etc.)? Do you use AWS or any websites that rely on AWS?
> 你从亚马逊买东西,从 Whole Foods 买杂货,或者用过他们的资产(Prime Video、Twitch、Audible 等)吗?你用 AWS 或者用依赖 AWS 的网站吗?
>
> Do you use GitHub or Office or Windows or Azure or Typescript? How about DuckDuckGo, which uses Bing?
> 你用 GitHub 或者 Office 或者 Windows 或者 Azure 或者 Typescript 吗?那 DuckDuckGo 呢,它用的是 Bing?
>
> Do you run Linux, which now includes AI-assisted code? Do you use Claude or ChatGPT or any of those?
> 你运行 Linux 吗?现在它包含 AI 辅助生成的代码了。你用 Claude 或者 ChatGPT 或者其他同类软件吗?
>
> Do you use any Meta social networks (Facebook, Threads, Instagram)?
> 你用 Meta 的社交网络吗(Facebook、Threads、Instagram)?
>
> Do you write Ruby code? (Which features DHH prominently on its home page.)
> 你写 Ruby 代码吗?(他们的官网上显眼地放上了 DHH 的大名)
>
> Do you have an Android phone or use Google search or Gmail or write code in Go?
> 你用 Android 手机或者用 Google 搜索或者 Gmail 或者用 Go 写代码吗?
没有人的技术选择是纯洁的,许多技术的诞生或许就不纯洁。我用 iPhone、Mac 和 iPad;我虽然远离 GitHub,但大半个软件世界的基础设施都依靠 GitHub;我用 Linux,不可能不用;我写 Go 代码,我也真的非常喜欢 Go。我是法西斯主义者吗?我当然不是。
那,那些 LLM 用户就要么无知要么邪恶吗?当然不是。
> These days we need all the righteous fury we can rally — and we also need the clarity to know where to focus it.
>
> 如今,我们需要我们可以聚集起的所有正当的愤怒,但同时我们也需要明晰,究竟应该把怒火集中在哪里。
### “我很乖的,我听话的。”
> [!note] 📻
> [《张春酷酷酷》我和世界的时差](https://www.xiaoyuzhoufm.com/episode/6aa045c9f03e74ee6b074632)
这是我第一次在周刊里提及《张春酷酷酷》这档播客节目,所以有必要简要介绍。这档节目由张春主持,每期会邀请数个素人网友连线讲述自己的故事,每期都有明确的主题。这期的主题是「我和世界的时差」。
这期一共有十一个故事,时长四小时,我挑我感想最深的两个讲。
---
从 `02:45:22` 开始的故事,我写这段文字的时候还听了一遍,再听也完全无法平静下来。一对卑鄙可耻(这个形容毫不为过)的父母,因为自己的教育缺陷和*人格缺陷*使得孩子不愿意和他们讲话,在打骂中孩子竟还了母亲的手,于是父亲就把女儿痛扁了一顿。这之后,孩子怎么也不说话,于是他们把孩子带到市福利院,去看那些出生畸形、没爹*疼*没娘*爱*的小孩,“教育”她要感恩。福利院里一个和孩子差不多高的小女孩走上前,机械般地念道:
“我很乖的,我听话的。我很乖的,我听话的。我很乖的,我听话的。我很乖的,我听话的。”
离开之后她终于情绪爆发,问父母什么时候把那些小孩接回来,因为父母骗她,说要去福利院接一个新的小孩。父母的说辞是,有了健康的小孩福利院会通知他们,然而孩子这时才意识到,这不过是父母的把戏。这样的把戏,她以前也见识过不止一次。见父母很快将刚才恐怖的画面抛之脑后,这个孩子思考起来:
> 我为什么会出生?因为这个世界上有一对夫妻,他们想要一个健康的孩子。父母爱的是他们层层筛选过的受精卵,那颗受精卵恰好是我,它也可以不是我。我也可能是福利院的孩子,福利院的孩子也可能是我。我们只能被选择,我们并无不同。生命不是天赐的礼物,生命只是计划或意外的产物,而如果失去了生命,我和这具虫尸也并无不同。我曾一度认为父母赋予我生命,他们养育我长大,我以为我天然拥有他们的爱,他们也天然接受我的自我。我总是喊“爸爸”“妈妈”,我呼唤他们,我需要他们,我爱他们,他们也爱我,因为我是他们的孩子。
>
> 什么是爱?爱是把工作的疲惫发泄在你身上吗?爱是侮辱你的朋友吗?是从不屑于了解你,只提出不切实际的要求,只要你不符合他们的想象,就否定你吗?是把你带到那些无辜而不幸的人面前,威胁你该感恩、该敬畏、该服从他们吗?可是就算是这样的爱也好,我也还是想要他们爱我的。是啊,所以你是个孩子,你要永远做这个孩子吗?你能永远忍受做这个孩子吗?他们会因为你是你而不爱你,那你会放弃自我去祈求他们的爱吗?
后来这个孩子把这件事情写在了作文里,于是得到了人生中第一张不及格的语文试卷。阅卷老师的说辞是,题材太老套,让她编也编个像样的。她觉得这个世界挺好笑的。我又不禁回忆起今年闹得沸沸扬扬的社交媒体禁令,尤其是那些带着珍珠项链的慈眉善目的白人说着要关心小孩子的面孔,想到他们说要让小孩回归球场、回归家庭的说辞,想到他们对父母的无条件信任,再看看这些故事,我也觉得这个世界挺荒诞的。
我的转述和文字是失真的,还请读者去听原来的音频。
---
我本想就此得出结论,说家庭不值得被信任,儿童应该得到社会的保护而不是信任家庭的保护(而很多求助渠道恰好来自网络空间),以及有些人就不配养育孩子,然后愤愤离去。后来想想,还是响应 Roger Berkowitz,拥抱多元观点吧。
从 `01:32:49` 开始的故事,是一个没有父亲的女孩的自述。她说自己在小时候没有意识到自己没有爸爸这件事情,对父亲这个概念很模糊,是她自己在家里乱翻东西,发现了自己父亲去世的事实,那个时候她才意识到,“原来我爸爸死了”。家里人从来不提爸爸这号人,没有他的照片,不知道父亲长什么样子。她爷爷很喜欢讲过去的事情,但提到爸爸的事情总是一句带过,从不细讲。她一直猜测爸爸是病逝或意外死亡,大家因为悲伤所以不提。
直到最近,也就是她 31 岁那年,她才从母亲的朋友口中了解到父亲的死因:父亲因杀人罪被判死刑。父亲因为投资欠了很多钱,被人追债,于是他潜入那人的家里,躲在衣柜里,之后用皮带把人勒死了。
她当时非常震惊,因为她的爷爷奶奶和姑姑都是很好的人,她自己也是个乐观向上且善良的人,她从未想过自己是个杀人犯的女儿。她印象中认为杀人犯的父母都是有问题的,但事实却不是这样。她突然把过去的各种碎片都拼凑了起来,比如奶奶为什么觉得让母亲给父亲扫墓是不该的,为什么家里人和钱的关系很远、从不碰投资,为什么爷爷说自己的是个善良的人,怎么都不会走错路。然后,她也开始心疼起周围的人,因为尽管杀人犯死了,但那些关系并不会消失,人们沉浸在悲痛中却无法诉说,因为不能缅怀一个罪人。家人们生活在这样的回忆中,却把她保护得很好,给了她一个非常幸福的童年。
这故事其实还给了我一个相当好的素材:*你看看经历了这般痛苦的母亲和长辈都能养育出心理健全的小孩,你们这些仅仅是狂妄自大的父母凭什么在给自己的孩子(以及别人的孩子)造成创伤之后还能心安理得地要求孩子服从自己?*
### 个人知识管理真的有用吗?
> [!note] 📜
> [What have note-taking PKMs accomplished, really? - brennan.day](https://brennan.day/what-have-note-taking-pkms-accomplished-really/)
个人知识管理(Personal Knowledge Management,后称 PKM)是近年逐渐流行起来的概念,是成体系、依赖现代化工具和的电子笔记系统。PKM 的风气大概是由 [Roam Research](https://roamresearch.com/)[^4] 带起来的,还有 Notion 和 Obsidian 推波助澜。PKM 工具层出不穷,Loseq、Heptabase、Evernote 也占据了各自的江山,Emacs 的 Org Mode 兴许也算一个,更别提还有散落各处的或仿造 Notion 或不仿造 Notion 的笔记软件,开发者真的热衷于开发笔记软件。
PKM 体系有不少,而且有各种缩略词,比如卡片笔记(Zettelkasten)、P.A.R.A、C.O.D.E,还有 Inbox(收集箱)和 Flash note(闪念笔记)之类的概念。Brennan 对 PKM 的有效性提出了质疑,他的核心问题是:如果 PKM 真的大有帮助,那么我们不是应该在整体上看到有更多出版的书籍和论文出现吗?
事实似乎不是这样,而且 Brennan 观察到,那些 PKM 的重度用户产出的东西往往是大量的 PKM 相关内容,比如新的笔记管理概念和缩略词、笔记和任务管理技巧和各种新的方法论,而非某个具体领域的成果。还有人在一个[卡片笔记论坛](https://forum.zettelkasten.de/discussion/656/productivity)上询问,人们开始用卡片笔记法之后发生了什么改变,人们的答案似乎倾向于「更清晰的头脑和更少的焦虑感」,而非「更多工作成果」。
当然,清晰和减缓焦虑也很重要,只是目前的确没有研究证明 PKM 的兴起让生产力得到了普遍的提升(也没有证据表明它没有)。如果读者从未接触过 PKM,不必担心自己错过了什么万灵药;如果读者的确对自己的工作方式和研究方法感到不满意,从 PKM 社区学习借鉴兴许是有用的;如果读者没有什么管理方法,但仍然对自己的产出感到满意,那就不需要做出什么改变。
> It's clear that if you are somebody who already has an effective throughput, then the specifics of the underlying mechanics are uniquely personal and you should continue doing whatever works for you.
>
> 显然,如果你已经能做到有效的持续产出[^5],而且底层机制的具体细节是独属于你的,那你就应该继续做你觉得有用的事情。
我之前也沉迷过 PKM,我有真实数据表明[^6],我沉迷做笔记的那段时间,我写的文章就是更少!我[放弃](/en/article/i-am-sick-of-pkm/)之后,文章数量和字数就开始上升了!我现在不做任何笔记,我学过东西之后就会直接上手去做;我要研究某个东西的时候会开一大堆浏览器标签页,然后直接把线索和大纲写进博客文章里,我也很少回看这些文章;我的任务管理只有一个手账本,我还经常分心涂涂画画,漏写是常有的事情,我从不信任这套体系,我会把重要的事情写在便签上贴在显眼的位置。我现在过得很好!
---
## 鸡头蛇尾
### 市场真的有辨别力吗?
前几天我在[这条联邦宇宙串](https://akk.eltr.ac/notice/BAjowmDLStHbrRb8To)里吐槽,某个叫[芦苇](https://reeddaily.com/) 的 Vibe-coded 应用索引了我的 RSS 源,并且用语言模型机翻了我的英文文章,乱改我的标题(顺带一提,他们的文章渲染真烂,连脚注都渲染不出来,显示成列表了)。

我随便一找,就能发现他们 [Web App](https://web.reeddaily.com/) 里的好多瑕疵:
1. 控制台输出了 API 的 `401` 报错和完整的 API 响应体,还有 Vue 的 Hydration 报错。他们没有做好错误处理。

2. 就算没有登录,还能在左下角看到本该是头像和用户名的小组件,甚至还有「退出登录」的选项。没有登录也能打开[发布内容](https://web.reeddaily.com/publish)页面,直到点击「发布」或添加图片才会弹出登录框。结合上面错误处理的漏洞,这是完全没有考虑未登录的情况啊。
3. 首页文章的摘要中包含 `
` `` 等未渲染的 HTML。
4. 右侧的 `关于芦苇 · 联系我们 · © 2026 芦苇` 字样真的就只是文本。我真想联系他们,点了半天「联系我们」,打开审查元素才发现没有超链接,气笑了。
5. 他们的 LLM 把 *Input Token* 和 *Output Token* 译作「输入令牌」和「输出令牌」。我怀疑这个是双关笑话,如果你没读懂这个笑话,可以读我的《[Token 应译作「符」](/article/token-translation/)》。要不是我的 RSS 源只显示部分条目,我还真想看看他们会不会把这个标题翻译成《令牌应译作「符」》,不过我更好奇的是这期周刊的标题会被改成什么。
这家企业(杭州文复网络科技有限公司,浙 ICP 备 2025150892 号-2)显然违规了。我的内容以 [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) 协议发布,任何人都可以自由使用和演绎,但**前提**是:
> You must give appropriate credit, provide a link to the license, and indicate if changes were made.
>
> 你必须给出恰当的署名,提供协议的链接,并且指出有没有修改作品。
他们给了署名,但**没有**标注 CC BY-SA 4.0 协议的链接,这是第一条违规;他们用语言模型修改了我的标题,但**没有**指出他们做的修改,这是第二条违规。
> If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
>
> 如果你混合、修改或基于这个材料创作,你必须用和原作同样的协议分发你的贡献。
他们并没有以 CC BY-SA 4.0 协议发布修改后的版本,而且根本没有标注内容使用协议。这家公司的法务在做什么?你们的使用条款呢?(我试图在登录界面点击使用条款和隐私政策,竟然被重定向到了首页)页面里只写了 `© 2026 芦苇`,我可以合理认为你们的意思是说,你们修改之后的内容,版权归属于你们。
不拿语言模型乱改我的内容,就不会有这些问题。我觉得更好笑的是,这个以 “AI” 功能为卖点,还大量使用模型乱改和机翻原作者内容的产品,竟然索引了著名 “AI” 批评者 [Ed Zitron](https://www.wheresyoured.at/) 的文章,还放到了他们 App Store 页面的宣传图里。
尽管搞笑,但我也感到荒谬。这样的产品,从首页的点赞数来看,竟然有不少用户,而且 App Store 的评分有 `4.8`。从评价来看,大家似乎很喜欢这个产品。我不禁怀疑,市场真的有辨别力吗?
国庆在饭桌上,我旁观了我表哥和他父亲的对话。他们在聊金融和投资,争论 Intel 和 AMD 哪家芯片厂商更值得投资。我姑父一直强调 Intel 的芯片和指令集更具有优势,我能听出来他对硬件的技术细节是有了解的,不过我表哥一直强调云服务器大量使用 AMD 的芯片,市场份额比 Intel 高,难道能说市场是错的吗?他们最终没能达成一致。我听完的感受是,他们两个说的都是对的,但市场的确不代表真理。Intel 可能有诸多优势,但不代表市场就会选择它。同样,那个粗制滥造且违法违规的 App 仍会因为各种奇怪的原因(比方说产品宣发)而获得市场青睐,但改变不了那背后不过是一群投机者,对软件和文字都毫无尊重的事实。
金融行业或许应该看市场走向,但对个人而言,==永远不要听信人群里喊得最大声的那群人==。他们不仅不一定是对的,而且往往是错的。
### WebAssembly in Anubis
> [!note] 📜
> [It took a year to ship WebAssembly in Anubis](https://anubis.techaro.lol/blog/2026/anubis-wasm/)
基于 PoW[^7] 的网站防火墙 Anubis 终于在花了一年时间后支持了 WebAssembly。用 WASM 是出于性能考量,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]
> [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。不意外,市场当然偏好更易用的 Typed LLM,而不是致力于合法合规的 Ethical LM。
Jenson 认为开源用户也是在意 UI/UX 体验的。他记得之前向 KDE 提过一个功能,在 macOS 上,在窗口之间拖拽元素时,在鼠标释放之前,被拖拽元素所在的窗口都不会升起来(raised),也就是不会突然挡住要拖过去的那个窗口。窗口是在鼠标释放之后才升起来的。之前 KDE 不是这样,他提出之后,这个功能很快就被一个贡献者实现了。
我其实很想给开源桌面端贡献,不过我确实没有什么桌面端开发的经验。我做桌面端的话,大概只会用网页套壳(当然不会用 Electron,大概会用 Tauri 或者 Wails),而且也没什么点子。兴许我可以去了解 Qt 之类的框架。
### 函数式编程让复杂系统更容易构建
> [!note] 📜
> [Why Functional Programming Makes Complex Systems Easier to Build](https://flexiana.com/hidden/why-functional-programming-makes-complex-systems-easier-to-build)
这大概率是一篇用于优化网站 SEO,持续给网站产出内容进行引流的文章,换句话说,类似国内的“营销号”。不过也出于其营销性质,文章简单易读。配图虽然有脱裤子放屁之嫌,但还算能看。本文讲解函数式编程范式和高阶函数(High-order function)如何让复杂系统更容易构建和维护,与传统的以数据为中心的面向对象编程做了对比。
文章的主要观点是,函数式系统的数据流向非常清晰,由一个函数流向下一个函数,没有共享的可变状态。在传统的系统里,往往需要维护各种状态,同一块数据有多个写者读者,很难知道是谁修改了数据,数据流很容易变得混乱。
")
在面向对象的系统里,对象不仅保存了**不可见**的内部状态,还定义了一系列方法。随着需求增加,越来越多的方法和复杂度会被添加到同一个对象内部。函数式系统由小巧的函数组成,不和对象绑定,天然地容易践行开闭原则(Open-close principle),即对拓展开放,对修改封闭。函数可以很轻易地组合复用,不需要修改函数内部的结构。我想到了面向对象设计中的装饰器模式(decorator pattern),用一个对象包装另一个对象,拓展其功能,其实,只需要用一个函数调用另一个函数就能实现装饰器。
纯函数不维护内部状态,只是接收参数,所以每个函数都是独立的,每个函数都能被**测试**。如果要测试一个对象,需要先实例化对象,这可能还需要实例化其他的对象,传给这个对象的构造方法才行,复杂的业务逻辑经常需要这么干。测试函数就不一样了,可以轻易地传入假的测试数据,函数的返回值也清晰且可预测,测试断言写起来也容易。
为了方便函数的组合复用,高阶函数往往很有用。这是文中给的例子,`process-transaction` 是个高阶函数,或者说 [Fold](https://zh.wikipedia.org/wiki/Fold_(%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0))。
```clojure
(defn process-transaction [transaction calculate-fee]
(let [fee (calculate-fee (:amount transaction))]
(assoc transaction :fee fee)))
(def payment
(process-transaction {:amount 100} #(* % 0.02)))
(def refund
(process-transaction {:amount 100} #(* % 0.01)))
```
第一个参数为操作对象,余下的参数则是要对操作对象做的变换。高阶函数很方便复用,可以组合起来操作同一个数据对象。
```clojure
(-> {:amount 100}
(process-transaction #(* % 0.02)
(process-transaction #(* % 0.01)))
```
上面这个例子中的 `transaction` 是个映射(map),Clojure 的数据管线常常需要传递各种映射,修改其中的值或者增加新值,然后返回,传递给下一个函数。我一般是用箭头宏 `->` 写数据管线的,这篇文章让我学到了新写法,用返回函数的函数构造管线函数:
```clojure
(defn pipe [& functions]
(fn [value]
(reduce (fn [result fn*] (fn* result)) value functions)))
(def process-data
(pipe validate transform save))
(process-data input)
```
这样一来,管线就是数据驱动(data-driven)的,可以随意修改传给 `pipe` 的函数数量和顺序,就像操作数据一样修改管线的结构,而不是写死成函数调用。
### 怂货式编程
> [!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 标准库里的函数不少,常用的就几个,要全部了解应该很难。
不仅不应该避免函数报错,反而应该更多地报错,给出明确的报错,这样才能排查问题。Clojure 是动态类型语言,很少有类型报错。可以用 Pre-condition 和 Post-condition 约束函数的输入输出类型,本质上是一系列谓词函数,在调用函数之前用 `:pre` 谓词函数检查参数是否符合要求,返回值之前用 `:post` 检查输出是否正确。如果有返回 `false` 的,就报 `AssertionError`。
```clojure
(defn double-number [x]
{:pre [(number? x)]}
(* x 2))
```
函数内部还可以用 `assert` 断言类型。在大部分编程语言里,断言是用于测试的,不该在生成环境中报断言错误。所以在构建时可以把全局变量 `*assert*` 设为 `nil`,这样就不会执行断言。
Clojure 还有 `clojure.spec` 库,用来定义更复杂的数据规格(Spec),可以检查和断言数据是否合规,与 Pre/post-condition 组合使用最佳。
我最近在写 [weepinbell](https://codeberg.org/eltrac/weepinbell) 的时候也遇到了不少类型问题带来的麻烦,一部分原因是我或多或少也应用了怂货式编程,另一部分原因是测试覆盖不完全,或许还有一部分原因是==动态类型语言需要比静态类型语言更多的自律==。我也开始怀疑,是不是选用静态类型的 Haskell 或 [TypedClojure](https://github.com/typedclojure/typedclojure) 会更好。
---
## 漫步遐思
- 想在引擎呜呜作响的高空阅读 *Wuthering Heights*(《啸风山庄》),结果起飞前后的播报就没停过,平稳起飞之后乘务员开始带货(真惨,乘务员也要做销售)。终于安静下来的时候,我的脑子已经很累了。
- 落地机场之前看到重庆的夜景,头一次升起思乡之情。不过我不念家,[一点也不念家](/article/home-sick-ii/)。下飞机之后在机场迷路了,这才想起这是 8D 魔幻城市,机场出口有三层地面,我说真的。
- 时常下意识认为对方是能交流的理智人,结果我抛出对方不同意的观点之后收到的不是令人信服的反驳,而是一个笑哭的表情、「不是哥们」「XXX 出来也没通知我啊」「XXX 可能 YYY,但 XXX 会 YYY 不太可能」…… 不过我面对此情此景,脑子里冒出来的竟然是 Papi 酱的「Oh my god. 你吓到~ 我了~」,我大概也得换个脑子了。
- 剧本杀店的 DM[^10] 和演员大概都喜欢挑胆小的吓,我一个朋友刚进门就问 DM 说能不能不要吓她。结果在第一次搜证的时候,只有她一个人被 NPC 追了。其实那场景真挺吓人,是一个完全没有灯的 L 型走廊,要走进去说词,祭拜鬼神,然后从没有灯的路走回来。她尖叫着跑出来的时候,我才知道人是真的能被吓哭的,至少对我来说,恐惧很少和眼泪联系起来。
后面还有团体搜证,五个人抱团进小黑屋,举着发绿光的电子蜡烛找线索卡。中途有个戴面具穿黑衣的演员时不时从各个角落探出头来大吼一声。说实话,能看清楚脸就不觉得吓人了,而且那小黑屋的结构挺简单的。
- 去姑姑家吃饭,屋里多了一只见人就想要扑上来打招呼的泰迪犬。后来才知道那是我爸买的,他嫌弃这狗黏人,又摔又打又骂,还好我姑把它收走了。
两三天后我又去他们家吃饭,我看见我爸骂它,还有它想要接近却在看清楚是谁之后绕着走的样子,感到不平。我没说话,又听起我爸有说有笑地讲起他有好几天都是喝醉的,稀里糊涂地没想起喂鸟,把家里一只鹦鹉饿死了。那只鹦鹉也很亲人,在我肩膀上站过,碧绿色的羽毛很好看。
饭后大家都很吵,狗狗趴在门口的地板上。我把它招呼过来,我抚摸他的毛发,它想要舔我的手,我就让它舔。它费力地站在地上,把前爪放在我的腿上,瞪大眼睛看着我。后来我让它到沙发上来,一会儿它就把头倚在我的腿上,眯着眼睛睡了。我一边抚摸它,一边观察它的呼吸,原来泰迪可以很安静。后来我姑姑出门丢垃圾,它就从我身上下来,守在门口等她回来。门口有人经过的时候它总是叫,姑父很不喜欢。可我知道,它是想要保护这个家啊。
[^1]: 而且,如果去这期新播客的评论区看的话,会发现没有人讨论内容本身。有人喜出望外地发表仲树重新更新的感想,有人继续质问和谩骂,有人扮演起“理中客”,开始统计“无脑粉”和“黑子”的“票数”。
[^2]: 单论 Anthropic,他们就有好几场[官司](https://en.wikipedia.org/wiki/Anthropic#Legal_issues)没打完。
[^3]: 这里原文用的是 *free of fascists*(没有法西斯主义者),西方媒体滥用法西斯一词已成习惯,Simmons 作为个人也受了这种媒体习惯的影响。大体上,他所说的 *fascists* 可以理解为中文语境中的「资本」「极右分子」之类的词。
[^4]: 顺带一提,Roam Research 是用 Clojure 写的;后文提及的 Logseq 也是用 Clojure 写的。
[^5]: 译注:原文 *throughput* 意为「吞吐量」,表示在一定时间内的工作产出量。这里为了通顺,译作「持续产出」。
[^6]: 见博客的[洞察](/stats/)页面,里面有每月的文章字数统计。
[^7]: *Proof of Work*,工作量证明,即要求客户机计算一段无意义的复杂运算,服务端得到正确答案之后放行。这能拦住一部分爬虫,同时也使得爬虫爬取网站的成本变高,因为 PoW 会消耗大量 CPU 时间。
[^8]: 译注:原文 *Dissociated press*,我没有找到译名。这个词本来是对 *Associated press*(联合通讯社;美联社)的戏仿,所以我依照这层意思译作「断联通讯社」。我也想过「丑联社」这个译名。
[^9]: Apertus 是完全开放权重、**开放训练数据**、开放文档,任何人都可以复现的小语言模型。
[^10]: *Dungeon Master*,地下城主。这个词原本来自桌游《龙与地下城》。