MoreRSS

site iconEltrac | 極客死亡計劃修改

常讨论心理学和社会观察相关内容,不敢说很懂哲学;也会写笔记和生产力工具相关内容;还是学生。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Eltrac | 極客死亡計劃的 RSS 预览

稻草人周刊 Vol.76

2026-04-13 00:29:54

什么?已经是周日了吗?我想可能是因为我出于焦虑一直在逃避投简历找实习这件事情,一边逼自己做令人压力山大的事情,一边又想要逃走,总感觉不是很健康的心理状态呢。不过也不算坏事,毕竟还憋出来一篇 小说这就是痛苦驱动型作者啊)。这周要好一些了,因为开始通过玩《饥荒》、听 Paramore、读加缪和睡觉来逃避现实,很厉害了!

本期周刊的标题全是宝可梦的招式名称,没有特别的原因,仅仅是因为我喜欢。


终焉之歌

“倾听歌声的宝可梦经过3回合陷入昏厥。替换后效果消失。”

All We Know Is Falling

All We Know Is Falling music cover

All We Know Is Falling

Paramore

🌕🌕🌕🌕🌗:“头皮发麻灵魂升天的感觉”

曲目列表
No. Title Length
1. “All We Know” 3:14
2. “Pressure” 3:06
3. “Emergency” 4:00
4. “Brighter” 3:43
5. “Here We Go Again” 3:46
6. “Never Let This Go” 3:40
7. “Whoa” 3:20
8. “Conspiracy” 3:42
9. “Franklin” 3:20
10. “My Heart” 4:00

‘Cause I’ve seen love die
Way too many times
When it deserved to be alive
And I’ve seen you cry
Way too many times
When you deserve to be alive
Alive

——《Emergency》

听这段副歌的时候,我正走在从学校回家的路上,那天我的心情没有很不好,但当 Hayley Williams 唱出「When you deserve to be alive」的时候,我的头皮发麻,感觉灵魂要从头顶冲出去了。

Riot!

Riot! music cover

Riot!

Paramore

🌕🌕🌕🌗🌑

听完前三首的时候本想说没有初听《All We Know Is Falling》的那种惊艳感,直到听到《Misery Business》。

另外很喜欢 Track 1 的名字:For a Pessimist, I’m Pretty Optimistic.

—— 我的 NeoDB 短评

最喜欢《Misery Business》,想要大喊:Well, I refuse! I refuse! I refuse!


写生

“将对手使用的招式变成自己的招式。使用1次后写生消失。”

名气为何使人无趣?

📻

人在成名之后并不是直接选择变得了无趣,而是人们与他的关系发生了改变,变成了一种活人与死人的关系:人们像讨论那些已经逝去的作家一样讨论名人,因为人们不觉得名人会做出回应,就像死人不会做出回应一样。名气剥离了名人与具体的人交流的途径,他们与具体的人的关系被与抽象的公众的关系替代。

于是,名人被误解的代价变得很高。没有名气的人被误解只需要对身边的具体的人进行澄清,甚至交流的前提就是有误解存在,交流一步步深入就是在一步步澄清误解。名人不能这样,名人必须一开始就在公众面前表现得无可指摘,因而不能说出那些可能造成误解的话,然而那些最有智慧和价值的思想、挑战权威的思想必定是容易受到误解的。所以,名人变得无趣。

树老师她被各种持对立立场的人骂,这些批评甚至相互矛盾,比如男人骂他打女拳,女人骂她是娇妻、婚驴,她表示这其实是她玩的一场危险的公关游戏的结果。她尽力保持不受到 100% 的喜爱,也把握好度不受到 100% 的谩骂,比起别人说「我喜欢你」,她更喜欢听到有人说「虽然……,但是……」时那种捏着鼻子觉得讨厌但同时又真的赞赏的态度。后者才是现实中与真实的人的关系。她在互联网上试图维持这种关系,以保证自己的人格自由,不被名气变得无趣。

OK,我知道她想让我或多或少地讨厌她,但听完这期博客之后我更喜欢了怎么办? 说实话,我写博客的时候也免不了小心翼翼、自我审查,或许我也应该放肆一点,好让那些讨厌我的人离我远一点,让喜欢我的人明白我是个真实的人,不会一直顺从他们的喜好。

Eleventy 的终结

📜

Eleventy(以下简写为 11ty)是相当年轻的静态网站生成器(以下简称 SSG),在 2017 年出现(Hugo 出现于 2013 年),由 Zach Leatherman 开发,使用 Node.js 生态但能够生成不依赖 JavaScript 的静态网站。在 2024 年,Leatherman 加入了 Font Awesome ,如今,11ty 被重新包装,命名为 Build Awesome

然而,作者指出,用 SSG 盈利是不可行的,以前已经有人试过了。SSG 本身开源,Gatsby、Stackbit 和 Next.js(尽管是全栈框架,但其 SSG 和服务端渲染功能的界限还挺模糊的)都尝试通过售卖基础设施赚钱,比如 Gatsby Cloud、Netlify Create(Stackbit 被 Netlify 收购后推出的产品)和 Vercel。除了 Netlify 和 Vercel 本身作为通用 PaaS 屹立不倒,其他试图盈利的 SSG 服务基本上都寿终正寝了,而现在的 Build Awesome 做的是同样的事情。

很大一部分问题在于,大部分愿意使用 SSG、偏好静态网站的用户,基本上都不会选择 Build Awesome 这类商业化、由大公司控制、需要交订阅费的产品,他们集中在 NeoCitiesMelonLand32-bit CafeIndieWeb 。而那些有钱的、不在乎自己是不是在大公司网络(coporate web)上的用户,更愿意花钱使用成熟的 WordPress。作者认为用 SSG 盈利这个想法本身就是不可行的。

这么看来,我们 Hugo 这边还真是风平浪静啊。脑中浮现起 Bep 在挪威的角落旅行,对美国公司对开源项目采取的各种行动不屑一顾的画面,这就是生活啊。另外,Build Awesome 这个名字真是蠢爆了。

PvZ 的栈位理论

📺

人类对植物大战僵尸一代的开发还不到 10%。

简单来说,在植物大战僵尸一代游戏中,每个植物被种下时都会被分配一个数字编号,编号是递增的,第一个种下的是 1,第二个是 2,以此类推。如果场上有植物死亡,它的编号就会进栈,下一个种下的植物会使用栈顶的编号。假设有一个豌豆射手被僵尸啃咬死亡或者被铲子移除,而它的编号是 3,就算场上最高的编号是 7,下一个被种下的植物也会使用 3 而不是 8 作为编号。

僵尸也有类似的编号,植物选卡界面右侧一般有 7~8 个僵尸,他们也有从 1 到 7 或 8 的编号,并且关卡开始之后他们会消失,编号会入栈被回收,场上出现的第一个僵尸就拥有 7 或 8 的高编号。

这如何影响游戏呢?游戏进行判定时,会遍历场上的所有植物,编号在前的自然就先被遍历,也就先进行判定。例如,当巨人僵尸靠近一个冰西瓜投手并抬手开始砸的时候,如果种下一个小喷菇在他脚下,位于巨人砸击范围内的就是这两株植物。由于编号在前的植物会先被判定,如果冰西瓜投手的编号比新种植的小喷菇编号更小,那么小喷菇就救不了冰西瓜,仍然会被巨人砸死。这个时候可以用到的技巧是,铲掉某个低编号植物,比如一开始就在场上的向日葵,这时向日葵的编号会入栈,下一个种植的植物就会获得这个编号,由于新种植的植物获得了更低的编号,就能帮冰西瓜承接住这次伤害。

其他同时处于判定范围内的多个实体,都适用于栈位理论。比如我是僵尸(I, Zombie)模式中,由于先放下的僵尸就拥有 7 或 8 的高编号,僵尸放下后获得的编号是递减的。如果面对寒冰射手,先放置路障僵尸再放置铁门僵尸,就能保证铁门僵尸的栈位更低,先被寒冰射手攻击到,由于寒冰豌豆打在铁栅门上,就不会有僵尸受到减速效果影响。

我之前做过一个射击游戏,判断受击的方式也是遍历子弹的轨迹是否与房间中某个实体的位置和体积有重合,判断时也需要按照一定顺序遍历房间里所有的实体,没想到这种编程模式也会对游戏机制造成微妙的影响。

Codeberg 和 GitHub 的服务稳定性

💻

开源项目 Limine 从 Codeberg 搬离,回到了 GitHub,原因似乎是 Codeberg 的服务不稳定,常常下线。这话不假,我经常看到其他 Codeberg 用户抱怨服务不可用,不过对我的影响倒是比较小(可能是每次服务下线时我都没有在写代码吧)。

我在 Codeberg 的 Matrix 频道里看到有人对比 Codeberg 和 GitHub 的服务在线率(Uptime),表示两个服务的在线率其实差不多,甚至 GitHub 最近的服务中断变得更频繁了。有人表示原因可能是他们自己推出的 Copilot 和 AI 编程使用率越来越高,导致各种 AI 生成的代码和 AI 爬虫不断涌向 GitHub,让他们的服务器也不堪重负。不过,Codeberg 服务下线的体感可能要更明显,而 GitHub 往往是部分服务不可用。

截止我撰写这篇文章时(2026/04/09),Codeberg 状态页 显示最近两周主要服务的在线率为 98.73%,而 GitHub 的 服务状态页 据说没有规律更新,根据 一个第三方状态检测页面 ,GitHub 今年二月和三月的所有服务在线率1都在 90% 以下。

由于 Codeberg 只显示最近一个小时的在线率详情和最近最近两周主要服务在线的百分比,这里就不展示了。

夸张地讲,GitHub 这个由微软运营的代码托管平台的在线率,甚至不如 Codeberg 这个由非营利组织运营的平台。离开 GitHub 的理由又增加了。所以有人不太能理解 Limine 为什么要回到 GitHub 这个既不自由又不稳定的平台。

希望各位能尽力给 Codeberg 捐点钱 ,我期待看到有一天 Codeberg 的在线率真正超过 GitHub,场面绝对非常好笑。

社交媒体禁令是否是懒政和不理智的群体狂热?

📻

乔纳森·海特《焦虑的一代》这本畅销书把社交媒体渲染成了造成青少年自杀问题的罪魁祸首,然而包括美国科学院在内的多项研究都与乔纳森的意见相左,即青少年心理健康与社交媒体使用率之间没有显著关联,而有没有按时睡觉和按时吃饭和幸福的相关性都比屏幕时间更高。

我在 第十九期 周刊分享了名为 Spurious Correlation 这个网站,它收集了很多具有相关性但毫无因果关联甚至非常荒谬的例子——你知道吗?曼彻斯特的空气污染与谷歌搜索「如何治疗内出血」的次数具有相关性。 乔纳森指出从 2010 年开始美国青少年的自杀率上升,同时电子产品和社交媒体也开始兴起。然而,根据一些基于大量问卷调查数据的研究结果,青少年是否经常吃土豆与生活幸福感的相关性,和使用社交媒体时长与生活幸福感的相关性,是非常接近的。不仅相关性本身不能证明因果性,社交媒体与青少年心理问题之间的相关性也非常弱。

就算不信任基于问卷调查的数据,去看那些使用了跟踪调查方法的研究,也无法得出结论说是社交媒体毁了青少年,有不少研究得出了相互矛盾的结论。播客引用了一些攻击乔纳森·海特观点的学界同行,他们表示乔纳森·海特在书里画的图表甚至不能说是相关性,只是画了几根线而已。还有人指出:一些父母对科技公司的恨意,胜过他们对孩子的爱意。 而这本书加强了他们的信念,影响力甚至上升到了国家层面,澳大利亚已经禁止 16 岁的青少年使用社交媒体,有不少国家开始纷纷效仿。

就算「社交媒体损害青少年心理健康」这个没有足够科学证据支撑的结论是真的,一刀切的懒政真的是最好的策略吗?参考中国的电子游戏禁令,实际上青少年仍然能够使用父母的账号或者租用账号玩游戏,而且,这种限制只适用于国内有备案的网络游戏,单机游戏、主机游戏和不受中国法律管制的其他游戏平台等完全不受影响。至少我还是未成年人的时候,从来没有苦恼过玩不了游戏。更何况一刀切还会带来更多问题,比如隐私,就算不在乎隐私的用户占大多数,他们愿意把身份证号上报给平台以证明自己是成年人,也不难想象制作虚假的诈骗界面收集身份信息有多简单。

另外,这些陷入群体狂热中的年龄验证支持者凭什么相信是社交媒体引发了青少年心理问题,而不是本身就有心理问题的青少年更容易长时间使用社交媒体?毕竟,相关性不等于因果性。如果后者是真的,这些把社交媒体从有心理问题的青少年身边夺走的人并不能真正解决他们的问题,反之,他们极有可能认为「我已经禁止社交媒体了,问题已经解决了」,从而忽视青少年心理问题的根源。或者,有可能是第三个更隐秘的因素同时导致了社交媒体的出现和青少年心理问题诊断的增加,比如技术进步催生了社交媒体,而技术进步和经济发展也使得社会进步,对心理问题更加重视,导致以前没有被诊断的青少年得到了应有的帮助,也造成了数据的增长。在没有十足证据的情况下相信任何一种解释都是愚蠢的。

在我看来,对任何年龄段的人来说,社交媒体的年龄禁令都是百害而无一利,不像社交媒体本身利弊皆有。


挥指

“挥动手指刺激自己的大脑,从许多的招式中随机使出1个。”

*Eltrac 使出了「挥指」

*挥动手指后,使出了「聚宝功」!

*Eltrac 向你展示了他的咖啡豆袋墙

挂在墙上的毛毡板,上面用图钉钉上了很多咖啡豆的包装袋。

我在翻看去年的 揽物日志 时,才发现我已经在短短几个月内积攒了这么多新的咖啡豆袋了,也尝试了不少新的咖啡烘焙商,还在老朋友那里发现了不少好喝的豆子。这期周刊就记录一些我比较喜欢,也推荐购买的手冲豆。

顺带一提,以后的周刊大概都会有这个内容随机的栏目。

瑰夏特辑

瑰夏(Geisha)几乎是无人能敌的咖啡豆种了,尽管市面上标注瑰夏的咖啡豆不一定是真瑰夏,一谈到手冲豆就谈瑰夏也不免单调无聊(而且说实话也很少有人用那么多钱一直喝瑰夏吧),但神终究还是神,其地位是不可动摇的。

最近只喝过两支瑰夏,一只是 M2M 的「圣洁庄园日晒瑰夏」,另一只是热度不小的「蕾莉达瑰夏」,来自辛鹿,我买的是蜜处理的豆子(因为其他处理法都卖断货了)。

圣洁庄园瑰夏实付款 ¥80.79,一罐 100g,所以克价是八毛,很贵,如果想吃点细糠可以尝试。M2M 的烘焙实力很靠谱,我记得我并没有按照冲煮建议严格操作,最后得到了一杯好喝到让我连连惊叹出声的咖啡。以下是我的品鉴笔记:

高温段很干净,不像很多日晒豆刚入口时会有燥感或涩味,有很明显的花香;略降温后有果汁感,柑橘风味明显,莓果风味有些微妙,需要仔细捕捉;中温段有轻盈的茶感,不厚重;再降温后是很清澈的口感,好干净的一杯日晒!

第二次冲煮的时候我将滴滤时间拉长了一些(其实是忘记截流了),这次李子风味会更明显一些(包装上的风味描述是「深色核果」),不过我其实不太喜欢核果风味。不过好喝的豆子无论怎么喝都令人陶醉。这只瑰夏的产区是哥伦比亚考卡,这似乎是我第一次喝哥伦比亚的豆子,印象很好。

接下来是辛鹿的蕾莉达瑰夏,实付 ¥56.50,总共 96 克(6 支 16g 分装),克价还不到六毛,风味是茉莉花、葡萄和乌龙茶。说起来,让我觉得好喝的豆子基本上都是风味丰富且有茶感的,这支也符合标准。尽管也很好喝,但整体而言就没有圣洁庄园那么惊艳。这次我完全没有按照冲煮建议冲煮,凭借经验和直觉,最后得到的风味不够明显,第二次调整了研磨度还提高了水温,就比第一次好喝很多了,触感细腻顺滑、清澈、不张扬,整体而言像是一杯果味乌龙茶

据说辛鹿的烘焙都相对保守,的确没有 M2M 那样惊艳,但不到六毛的价格还能说什么呢?确实很好喝。

另外,冲一杯咖啡需要 15~16 克左右的豆子,如果按照 16g 算,一杯瑰夏的价格就是 9.6 到 12.8 左右,比一杯奶茶便宜,也不算特别贵。

口粮专辑

我经常回购绝对小孩的「瑰宝 SOE」,据称是长期引流款,价格实惠,喝起来也不差。不过咖啡豆的配比和豆种似乎经常更换,可能是为了维持价格,总之每次购买的体验似乎都有不同。上一次买日晒处理的瑰宝觉得风味有些杂,不好喝,于是这次买了水洗的瑰宝,还挺令人意外的。

实付款 ¥62.10,共 250g,克价二毛四。这个价位如果不踩雷就已经很不错了。这支水洗拼配很神奇,尽管是用来做意式咖啡的,但手冲也完全不差。包装上的风味描述是柑橘、蜂蜜和绿茶,但我喝起来更像是一杯甜牛奶,总之甜感是很突出的。一杯咖啡只要够甜,就不会难喝。

最近还买了 M2M 的「糖渍果子」,产地埃塞,风味描述是花香、蓝莓、榛子和伯爵茶,是我很爱的风格,这只豆子的克价是三毛六左右。高温入口时有闷闷的苦味和涩感,要略微降温之后才好喝,中低温入口时能在舌尖感受到蓝莓风味,甜感在舌头两侧,有令人舒适的茶感。整体而言,这是一杯蓝莓伯爵茶

每个咖啡爱好者应该都会经常遇到剩下的咖啡豆不够做一杯咖啡的情况,这个时候我一般会把两袋豆子拼起来,凑够克数。之前「圣洁瑰夏」只剩了 10g,我拼了 5g「糖渍果子」,最后得到了一杯非常惊艳的咖啡。如果要形容的话,就像是戴着眼镜、看起来很内敛的斯文帅哥突然脱下衬衫露出胸肌的感觉

和「糖渍果子」一起购买的是同一家的「Alo Meme」,我记得之前买过 M2M 的一支日晒 Alo,这支是水洗,风味描述是花香、蜜桃、橙子、杨桃、绿茶和黄糖。我没有特别偏好水洗,尽管绿茶风味和明显,但水果调性很微妙,至少我是没喝出来杨桃风味的。无功无过的一杯咖啡,略微寡淡。

其他尝鲜

年初的时候在家,手边没有设备,只有一台美式滴滤机,大概是做深烘豆比较合适,于是购买了良致的「钟型花」,是多产地拼配,有埃塞俄比亚、巴西和巴布亚新几内亚的豆子。整体的体验是,有微妙的甜感、微妙的茶感,总之就是很微妙,不过在深烘豆里算是比较有风味的了,不是牛马燃料。

风味描述是红茶、姜花、榛子和甜香料。可能和使用的设备也有关系,总之我一个都没喝出来。克价是两毛出头,性价比还不错。


珍藏

“当战斗中已学会的招式全部使用过后,才能开始使出珍藏的招式。”

human.json

轻量级的 JSON 协议,用于声明网站的内容由人类创作,并且为其他你信任的同样由人类创作的网站进行担保(vouch)。这个项目还提供了 Firefox 和 Chromium 的浏览器插件,访问有声明 human.json 的网站时可以选择「信任」网站,信任过后这个网站「担保」的其他网站也会受到信任。用户直接信任的网站被称作种子(seed),种子网站担保的网站拥有 1 级跳跃(1 hop)的信任等级,1 级信任网站担保的网站拥有 2 级信任(2 hop)。human.json 本质上是建立了一个信任网络。

给自己的网站添加 human.json 非常简单,在任何地方创建这样一个 JSON 文件:

{
 "version": "0.1.1",
 "url": "https://example.com/~alice",
 "vouches": [
 {
 "url": "https://bob.example.com",
 "vouched_at": "2026-01-15"
 }
 ]
}

url 是自己网站的地址,支持子目录;vouches 是自己担保的其他网站。担保的网站应该是你在其他渠道有过交流的,你能信任的真实的人类。然后在网站的 <head> 里声明这个 JSON 文件的地址。

<link rel="human-json" href="/path/to/human.json">

我的 human.json 发布在 这里

访问: human.json

floccus

跨浏览器跨设备同步书签的浏览器插件,支持 Linkwarden、Karakeep、WebDAV、Google Drive、Nextcloud 和 Dropbox 等后端,还支持 Git over HTTPS,以 XBEL 或 HTML 开放格式储存书签。

这周我打算换掉因为是用 Python 写的所以内存占用不小Linkding 2,由于不想管理多的域和基础设施,所以干脆大道至简,回归浏览器默认书签了。所以我安装了 floccus,把书签同步到了自己的 Forgejo 实例上,也算是有一份备份了。然后用朴素的文件夹做了分类,好像也能用,而且我逐渐发现标签根本就是累赘,我向来都是通过关键词直接搜索标题的。

访问: floccus


临别礼物

“虽然会使自己陷入昏厥,但是能够大幅降低对手的攻击和特攻。”

  • 你是什么宝可梦?怎么能带五个招式?

  • 房间空调坏了,房东很耿直地直接换新空调,今天刚拆了旧的,过一两天才来装新的,可现在我已经热得浑身冒汗了,明明才不到 30 度,大概是前几天下过雨,空气湿度太高了吧……

    也可能是我本身就是更耐寒而不耐热的体质——这种体质在重庆人里应该还算罕见吧?

    我已经把空气净化器横过来开到最大档当风扇吹了。

  • 装上新空调了,第一次见识到精度达到小数点后的空调,不出意外的话我应该会在夏天一直使用 23.3°C 这个温度设定。我认真的。

  • 现在我所有的网站都脱离了 Cloudflare,如此一来也几乎完全脱离了美国企业。现在我使用的 DNS、CDN 和防护提供商都是 Bunny 。这是一家位于斯洛文尼亚的企业,位于欧盟区域(GDPR 法域)内,他们还提供边缘计算和数据库等产品,很接近 Cloudflare 了。

    他们的 Trustpilot 评分是 4.8,我自己的体验也很好,客服回复工单的速度很快。Bunny 提供 14 天的试用期,在此期间可以没有限制地使用他们的产品(不过有风控机制,之前我被误封了一次,但客服在 5 分钟内就解决了问题)。为数不多的缺点是,他们的对象存储不兼容 S3。为此我还专门把 Eucalyptus 的图片上传改为本地上传,然后用 rclone mount 把 Bunny 的 SFTP 服务器目录挂载到图片上传目录…… 如果很在意 S3 兼容性的话,还需要谨慎考虑。

  • 从 Cloudflare 逃离的过程中我还试用了 Scaleway、Gcore 和 Exoscale。结果是,我要么在强制刷脸认证之后仍然被风控封号,要么因为 Web 仪表盘过于难用和客服回复速度太慢而无法解决问题,要么在注册之后看着他们可怜的 Trustpilot 评分望而却步…… 还好找到了 Bunny。

  • 没有一张能用的 Visa 卡还真是不方便啊。麻烦,不想去银行 Adulting3

  • 买了 SweetBitter 的「风的第一声呼吸」,据说是很好喝的冷萃豆,期待有冷泡咖啡的夏天。


  1. GitHub 部署了很多服务,包括 Copilot、Pull Request 和 Actions 等等,有一个服务出现异常都会计入这个数据。 ↩︎

  2. 说来惭愧,我用 Clojure 写的 Webmention 接收器 因为跑在 JVM 上,内存占用比这个书签管理器还大一百多兆字节。 ↩︎

  3. 思索之后我发现,我找不到能够简洁有力地表达 Adulting 这个意思的中文词汇。 ↩︎

有毒

2026-04-11 13:09:23

读起来很畅快的科普书籍,有不少关于毒素和毒物的知识和观点都相当有趣,比如人类之所以进化出了强大的大脑可能是为了躲避毒蛇而进化出了超强的视力,而视力对大脑的要求很高。总之是很有意思的一本书,很好地喂养了我的好奇心。

一般来说,读到科普书籍,我关注的第一件事就是作者有没有罗列参考文献,其次是作者自己原本的职业是什么。这本书在陈述事实和数据的句子之后都标记了脚注序号,书本最后附上了 27 页的参考文献,如果对某个事实或数据的来源有疑问,就可以找到它出自哪条参考文献。作者本人是研究毒物的生物学家,书中也描述了她的实地考察经历(虽然近距离接触科摩多巨蜥、用手抓有毒海胆和差点被子弹蚁咬到听起来实在是太可怕了)。

看起来是一本比较严谨的科普书,而且作者也有在书中描述很多生物化学过程,甚至有讲解免疫系统的工作方式,在尽可能通俗的同时也不乏一定的深度,不过这些可能是书呆子和极客更在乎的。如果你也对生物学感兴趣,喜欢深入了解一些东西,这本书读起来或许会很过瘾。

毒与人类

书中描述了一些让我感到十分无语但也算是「长见识了」的人类行为。有一类人自称「自我免疫者」,每天给自己注射低剂量毒素,一般是蛇毒,并慢慢提高剂量,让免疫系统适应毒素并逐渐做到真正免疫。这类人一般还自己养毒蛇,会让自己心爱的宠物咬自己。据他们说,自我免疫真的有用,而且还能…… 强身健体,大概是对免疫系统的规律锻炼吧。不过作者在开篇就警告读者不要尝试这种危险的做法。

毒素里有血毒和神经毒素等划分,泥蜂的神经毒素会让蟑螂失去逃生意愿,乖乖成为食物,而且蟑螂在那段时间内会表现出强迫行为,不断地清洁自己,同时还会感受到极大的快感——看起来就像是磕嗨了。实际上有一群人会花高价买蛇毒,尤其是眼睛蛇毒,据说比可卡因磕起来还爽。买不起蛇毒的人就会花少一点的钱,让人用毒蛇咬自己。有人嗨到灵魂出窍,身体已经被插上管子接上呼吸机,但意识根本不在乎,因为实在是太爽了。

世界上真是什么人都有。

毒与无知

第一章是有关鸭嘴兽的,是的,这种会下蛋的奇特哺乳动物实际上有毒。雄性鸭嘴兽的身上有尖刺,据说之前有个老兵尝试救助被困的鸭嘴兽,结果被扎了,躺在病床上疼了好几天,说这比被子弹打中还痛,而且什么止痛药都不管用,医生最后用某种神经阻断剂让他被咬的手臂整个失去知觉才解脱。

关于鸭嘴兽是否有毒,以前的学界还争论不休。尽管有一些被鸭嘴兽扎的案例,但有不少科学家坚信它没毒。我觉得很好笑的是,书中有一个爹味很重的科学家不但信誓旦旦地声称鸭嘴兽没毒,还说自己一点也不怕鸭嘴兽,能毫无畏惧地把它拎起来把玩之类的话。结果后来人们发现,鸭嘴兽的毒素与季节有关,准确来说是和繁殖有关,大概是争抢配偶的时候会用到毒素。

还有令人闻风丧胆的科摩多巨蜥,人们谣传它的牙齿上有致命细菌,被咬后就算挣脱也会很快死亡。据说有人看到水牛被科摩多巨蜥咬了,逃走并回归正常生活之后,不久后就死了。于是许多人坚信科摩多巨蜥的牙齿上有致命细菌。但实际上这种动物相当爱护口腔,牙齿很干净,杀死水牛的并非巨蜥,而是它在伤口未愈合时在满是粪便的肮脏水潭里打滚导致的细菌感染。科摩多巨蜥的确有毒,不过他们的毒素是抑制凝血(蚊子也有这样的毒素)和扩张血管的,可能诱发中风和大出血。

第九章还提到了一种名为吉拉毒蜥的物种,据说令当地人闻风丧胆,说它非常致命、咬了人就不会放手,把他的毒性吹得天花乱坠。实际上这种生物相当害羞,而且毒性很弱,只会让人感到痛但不致命。

毒与医疗

前面提到的吉拉毒蜥,它的毒素中含有一种名为艾塞那汀(exendin)的化合物,这种物质会促进胰腺肿胀变大,最终科学家根据这种毒素合成了艾塞那肽(exenatide),通过刺激胰岛素分泌来治疗糖尿病。历史上的古人还有用眼睛蛇毒止痛,用蝰蛇毒止血的案例。尽管不安全,但这些蛇毒中可能真的含有一些可以用于医疗的化合物。

生物的毒素其实相当复杂,其中含有很多化合物,远远不止一种;而且毒素随着进化而变化的速度也很快,因为其他物种可能很快就适应了旧的毒素,毒物必须更新它们的毒素库,才能起到效果。毒物本身就是很好的化学物质宝库,有极大的研究价值。

毒素作用在不同物种身上的效果也不同,比如大部分有毒物种就免疫自己的毒素,而一些对其他生物致命的毒素,可以被用于人身上。有一种神经毒素可以阻断生物体中的离子通道,也就是大脑通过生物电向身体其他部位发送信号的通道,可以使动物动弹不得甚至停止某些关键的生物活动。然而离子通道的种类非常多,毒素可能只作用于一部分,而那一部分对某些生物可能非常关键,对人类说可能微乎其微,甚至有一些通道对人来说不仅没有用,反而会引发疼痛,所以一些蛇毒能用来做止痛药。

书中还写了一个有些离奇的故事,有一个物理学家得了莱姆病,怎么都治不好,当最后已经放弃。结果在某天出门散心的时候,她被一群蜜蜂蛰了,当时的她以为这是上天赐死,拒绝接受治疗,最后,药物杀不死的病原体被蜂毒杀死了,她奇迹般地痊愈了。

一些毒素本身有医疗价值,但大部分毒素都是对人体有害的。治疗中毒最有效的方法是注射抗毒血清,而制作血清的方法非常有趣:把一定剂量的毒素注射到马的体内,几天后从马身上抽血、分离、提纯,就得到了抗毒血清。其实人也可以做到,只要有足够长的时间,免疫系统就能够产生毒的抗体,但人往往等不到那么长的时间就中毒身亡了,而马的体形较大,中毒之后不容易死,而且只要控制好剂量,它们甚至不会有任何感觉。

毒与物竞天择

书中提到,蛇毒可能会起到「预消化」的作用,会让受害者的肉变得更容易消化,有时候甚至会变成液体,方便捕食者吮吸…… 听着就很可怕。人被这种毒蛇咬了会出现坏疽,大概就是一种毒疮,局部溃烂,非常痛而且会血流不止。不过这不全是蛇毒的功劳,因为毒素还会策反免疫细胞,伴随着坏疽出现的肿胀也有免疫系统的功劳。

蚊子也有毒,不过他的毒素是抗凝血的,为了方便吸血,像水蛭和吸血蝙蝠这类吸血的动物基本上也都有毒。除了主动释放毒素的捕食者,还有一些动物的毒是防御性的,只有在保护自己时才会释放毒素,或者身体里就带毒。

前面提到,人类进化出强大大脑的原因,科学家有许多猜测。我之前就听说过大脑是人类耗能最大的器官,但并非是因为思考很耗能(实际上就算从事高强度脑力工作,也不会消耗更多热量),大脑消耗的能量是稳定的,可以说大部分被用在解析光信号、生成图像上了。有人认为是人类祖先对水果的喜爱,使得它们不得不进化出准确的视野,这样才能在树枝之间荡来荡去而不坠落。也有说法是为了准确地发现隐藏起来的毒蛇,有些毒蛇的伪装相当高明,和环境融为一体,但人类只要稍微仔细一点就能识破伪装,这归功于视力。

最后

如果你和我一样有着旺盛的好奇心的话,我还挺推荐读这本书的。书中偶尔会出现插图,所以要做好心理准备,大部分时候不可怕,但我非常恐惧节肢动物,所以当书中毫无预警地出现了蚂蚁和蟑螂的放大图片(占据一整页的那种),我真的尖叫出声了!

什么毁了 JavaScript?

2026-04-10 13:36:44

JavaScript 虽然不是我的启蒙语言,但绝对是对我影响最大的编程语言之一。半年以前,我的首选语言就是它。如今如果要做正经的前端开发工作,就不可能离得开 JS 或 TS。在 TIOBE 排行榜,JS 稳居第六,只落后于人尽皆知的 Python 和 C 系语言,还有万恶的 Java。由于太过流行,这门脚本语言又被搬到后端,甚至可以用来写命令行应用。要是像 Rust 一样进入 Linux 内核,JS 就无所不能了

不过,我相信所有熟悉 JavaScript 的程序都会同意:这是一门混乱不堪的语言。不仅是语言本身的设计,它背后庞大的生态也是一团乱麻,给用户和开发者带来的体验都不能说得上舒适,有时候甚至非常糟糕。

本文要讨论的是 JavaScript 语言本身、人们如何使用它、NPM 生态如何塑造了今天的 Web 开发体验。作为用户,我还打算说服你默认禁用 JavaScript。

不过我不会写太多有关 TypeScript 的内容,因为我其实没有用过这门语言。

1 + “1” == “11”

我们先来谈谈 JavaScript 的优点:它无处不在,非常易用。比如,如果你是在浏览器里读这篇文章的话,你现在就可以按下 ⌘+Shift+I(或者 Ctrl + Shift + I)打开审查元素界面,找到 Console(控制台),在里面输入 JavaScript 代码执行。浏览器内置了 JavaScript 解释器。

不妨做个实验,在刚才我说的控制台里输入这样一段代码:

a = [1, 1001, 2, 3, 42, 4]

放心,这不是恶意程序,这只是定义了一个名字为 a 的数组。接下来,我们尝试对这个数组进行排序,排序的结果自然应该是 [1, 2, 3, 4, 42, 1001] 对吧?JavaScript 的另一个优点是许多操作数据的方法都被封装好了,你可以直接使用,不必自己编写。

现在,在控制台里输入 a.sort(),排序数组。

a.sort()
// => (6) [1, 1001, 2, 3, 4, 42]

哦不,为什么排序出来的数组是这个样子?

因为 JavaScript 是动态类型语言?数组里什么类型的数据都可以塞,可以把字符串、数字和对象放在一起,所以很难考虑到是要按照字符顺序进行排序,还是按照数字大小顺序进行排序,对吧?

我们不妨把相同的代码输入 Python 解释器试试,Python 也是一门动态类型语言。只不过这门语言里不限数据类型的集合数据类型叫作元组(Tuple),使用圆括号表示。

>>> a = (1, 1001, 2, 3, 42, 4)
>>> sorted(a)
[1, 2, 3, 4, 42, 1001]

看起来 Python 用同样简洁的代码完成了任务。我们再来看看另一们动态类型语言,这次上场的是一门 Lisp 方言——Clojure。

user=> (def a '(1 1001 2 3 4 42))
#'user/a
user=> (sort a)
(1 2 3 4 42 1001)

Clojure 也没有任何问题。看来 JavaScript 的问题并非源自「它是动态类型语言」这个事实,相反,设计得优秀的动态类型语言不但不容易出现类型问题,用起来还非常讨喜。

给数组排序的反直觉设计或许不算大问题,给 sort() 方法传入一个谓词函数即可,用 a.sort((x, y) => x - y) 就可以得到预期的结果了。

那就让我们继续实验,你知道 1+1 = 2 对吧?可是 JavaScript 却不知道:

1 + "1"
// => '11'

NaN 的意思是 Not a Number(不是数字)对吧?可是 JavaScript 却表示反对:NaN 的数据类型是数字。

typeof NaN
// => 'number'

此外,JavaScript 还证伪了等式的传递性。

0 == "0"
// => true
0 == []
// => true
"0" == []
// => false

我知道,我知道,这些问题都有解释。JavaScript 会把字符串转换为数字,把数字转换为字符串,所以有字符串出现在 + 的某一端就会被当作拼接操作而不是相加;NaN 是把其他类型强制转换为数字失败时显示的错误值,由于是转换为数字的结果,所以本质上还是数字;而第三个问题是因为 []0 都是零值(Zero Value),所以相等,而 "0" 虽然会被转换为数字 0,但并非零值——所以 JavaScript 引入了 ===(严格等于)。

让我们再来看看那些设计合理的动态类型语言是怎么处理这些问题的吧。

首先,试图对字符串进行 + 操作应该报错,因为数字相加和字符串拼接本来就是两个语义,不应该由同一个符号表示。

user=> (+ 1 "1")
;; Execution error (ClassCastException) at user/eval3 (REPL:1).
;; class java.lang.String cannot be cast to class java.lang.Number (java.lang.String and java.lang.Number are in module java.base of loader 'bootstrap')
user=> (str 1 "1")
"11"

也正是因为对非数字进行算术操作会扔出错误,NaN 这个错误值就不会出现,如果真的需要表示数据无法解析为数组,那么返回空值就好,比如 nil 或者 null

user=> (parse-long "12")
12
user=> (parse-long "avc")
nil
;; nil 的类型当然是 nil
user=> (type nil)
nil

同样,如果不随意转换字符串和数字,零值的问题从一开始就不会发生。

user=> (= "0" 0)
false

再来做一道选择题吧,以下哪个 JavaScript 表达式的值是 false

A. typeof null === 'object'; B. Math.min() > Math.max();
C. NaN === NaN; D. 0 == ''

答案是 C,NaN 不是自等的,判断一个值是否为 NaN 要用 .isNaN() 方法。是的,一切都是 object,最小数比最大数大,以及老生常谈的,0 等于空字符串。

还有一个设计缺陷非常好笑,简直是 JavaScript 所有类型问题的集大成者。

{} + {}
// => NaN
({} + {})
// => '[object Object][object Object]'
{} + []
// => 0

这门语言还有变量作用域等各方面的问题,至此,我相信可以得出结论说:JavaScript 是一门为了做到方便,而被设计得极其不符合直觉的语言。方便和符合直觉可以共存,但 JavaScript 给出的是错误答案。

不过,随着规范化的不断推进,不少设计缺陷已经有规避方案了,在意类型安全可以使用 TypeScript,变量作用域问题也可以严格限制全局变量,多用 letconst 解决。尽管不至于经常因设计缺陷而感到困扰,但还是很难不在意,这些缺陷一开始为什么会存在?

十天诞生的编程语言

2000 前最流行的浏览器叫作 Netscape Navigator(前身是 Mosaic),1995 年 Netscape 决定要给浏览器添加创建交互式网页的能力,他们原本打算把 Java 或 Scheme 嵌入浏览器中(真是两条…… 截然相反的道路),为此雇佣了 Brenden Eich 完成 Scheme 的嵌入工作,后来他们决定造一门新语言,于是让这个新雇佣的程序员在两周内完成并发布了 LiveScript。由于当时 Java 很火,所以后来更名为 JavaScript,两门语言并无直接关联。

联想到仓促的开发周期,就不难理解 JavaScript 为什么有这么多的缺陷。再加上 JavaScript 不是社区产物,而是一家企业为自家浏览器产品开发的差异化功能,长时间都没有统一的规范,就和 Markdown 一样混乱

比如 JavaScript 没有原生的模块系统,主流的支持模块的 JavaScript 标准有两个:EMCAScript 和 CommonJS。前者使用 importexport,后者使用 require() 导入模块。目前,EMCAScript 受到广泛支持,已经成为事实意义上的 JS 标准。

给这门仓促开发的编程语言打的补丁还有很多,比如 TypeScript 就硬生生把它变成了一门强类型语言(前面我已经讨论过 JS 的问题并非源自它是弱类型语言这个事实)。

打补丁能解决的问题是有限的,为了保证兼容性(更何况是一门所有浏览器甚至服务器后端都在使用的编程语言),很多设计缺陷保留至今,加上各种补丁反而让 JavaScript 看起来像个臃肿丑陋的怪物。比如,JavaScript 自带的时间类型非常难用,最近推出的 Temporal 解决了这个问题,解决方法是增加了新的时间类型,同时兼容旧的、有问题的时间类型。这个 API 截至目前的兼容性是「Limited Availability」,Safari 浏览器还不兼容。很难相信,现代化的用于处理时间和日期的基础数据类型,竟然在 2026 年还没有得到广泛支持。

无处不在的过度抽象

除了这门语言本身的问题,它的使用者也经常受到嘲笑。

首先,如今人们开发一个最简单的网页都会用 React 或者 Vue.js 等现代的前端框架,还要为这些框架导入样式库(比如 TailwindCSS 和 shadcn),哪怕他们只是想写个甚至不需要 Reactivity、甚至没有复杂交互功能的简单网页。

“一个正态分布曲线,最左侧是一个看起来脑袋很小的人,他说“Pure HTML CSS and JS is the best option”,曲线顶端是一个戴眼镜的急哭了的人,他说“Noo, we need a framework for JS, library for styling and 146 other dependencies.”,最右侧是一位穿着斗篷的智者,他说“Pure HTML CSS and JS is the best option”

“纯 HTML、CSS 和 JS 最好” “不!我们需要框架和样式库,还有 146 个其他的依赖项。”

React 里有个概念叫作虚拟 DOM,这就是对真实 DOM 树的额外抽象,如果 DOM 本身足够复杂,操作虚拟 DOM 就会容易管理不少。只不过,在大部分网页开发中,额外的抽象层都是过度抽象,做一个简单的网页也要用脚手架搭一个完整的项目结构也完全是过度工程。更何况这不会让开发效率有质的提升,反而会显著拖慢网页的加载速度。

JavaScript 开发者还经常被嘲笑热衷于造新框架,先让我不查资料用手指数一数我知道的 JavaScript 框架名:

  1. React(严格来说是一个库)
  2. Vue.js
  3. Next.js
  4. Nuxt.js
  5. Svelte
  6. Solid
  7. Angular
  8. Preact
  9. Hono
  10. Gatsby
  11. Ember.js
  12. Modern.js
  13. Backbone.js
  14. Express.js
  15. Astro

看来一双手还数不过来,一定还有我不知道的框架,如果有人能做更全面的统计就好了。此外,不少开发者还喜欢造一些小框架,如果总数加起来超过 100,我不会惊讶。

就算手写 HTML 需要编写很多重复代码,但 Neocities 社区就在没有框架的情况下创造了很多有趣的个人网站,这无疑说明很多网页需求并不需要进行了一层甚至很多层抽象的框架来解决。如果一个网站只有几个页面,或者根本不是网页应用,只展示文档内容,那根本不需要框架。况且,使用 JavaScript 加载内容对 SEO 非常不友好(Vue.js 是用来做单页应用的,依赖前端路由,所有网页路径都会被转发到同一个入口文件,实际上整个网站都只有一个页面),而且没有加载 JS 的自动程序无法识别网页内容,像我这种默认禁用 JS 的用户也根本看不到网页。

JavaScript 是用来设计交互式网页的,必须加载 JavaScript 才能看到文本内容就是很蠢的设计。

诚然,手写 HTML 很低效,应该把一部分复杂度合理地外包给计算机程序,建立适当的抽象,所以我们有静态网站生成器(SSG,Static Site Generator)这种东西。就算是 WordPress 和 Typecho 这类需要后端才能运行的动态博客程序,本质上也是在服务端把 HTML 网页拼接好再发送 HTML 和必要的静态资源给访客,不需要加载非必要的 JavaScript,也没有建立过度的抽象。

写到这里我想我需要解释一下「抽象」这个词,抽象层级一般是用来屏蔽软件架构的复杂度的。比如,审计银行流水的业务规则不应该了解如何向数据库发送请求,如果相关的代码里既有各种校验逻辑,又有 SQL 语句,那这个软件维护起来就很困难,应该把后者分离到数据持久层。同理,如果你要编写的网络应用的 DOM 结构非常复杂,比如 Cloudflare 的仪表盘,包含侧边、顶栏、数据展示等网页元素,还要管理从后端 API 获取的用户数据,有些数据的请求还是异步的,更新后又需要修改元素,那完全不做抽象,手写 HTML 就是很蠢的,这时候就应该抽象出组件的概念,以及专门的状态管理和路由模块等等。

但如果,你要编写的仅仅是简单的计数器,用户点击之后将数据库里的某个字段增加 1,总共需要编写的代码也就一百行,业务逻辑足够简单,那么把业务逻辑和 SQL 语句写在一起就没有问题,并不会让软件架构变得难以维护。同理,如果要编写简单的网页,手写 HTML 或者使用静态网站生成器就足够了,使用高度抽象、专门用来解决复杂问题的框架就是用大炮打蚊子,不仅有病,还容易伤及无辜。

依赖地狱和供应链投毒

由于 JavaScript 开发者非常喜欢使用框架,还非常喜欢引入各种依赖,用于解决鸡毛蒜皮的小事。如果某天出现了专门输出 Hello World 的 JavaScript 库,我不会感到意外。

我不止一次听到经验丰富的前端开发者抱怨 JavaScript 的开发体验,许多工作几乎都是在更新、维护、升级依赖,以及升级依赖之后由于 API 变动,需要做的额外的适配工作。如果不做这些工作,项目可能在几个月之内就会过时,变得不可用。尽管锁定依赖版本号之后也能够继续使用旧版本,但一旦选择更新某一个依赖,就需要更新无数个其他依赖,因为一个 JavaScript 库大概率也依赖了十几个、几十个甚至上百个其他库,而这些库又使用了更多的库……

由于依赖之间的层级过多,很容易造成依赖地狱(dependency hell)问题。举一个简单的例子,假设你的项目使用了软件包 A 和软件包 B,而它们同时依赖软件包 C。某一天,软件包 C 发布了新的版本,A 及时跟进了,也发布了新版本,但 B 的开发者还没有反应过来。这时,如果你更新 A,就不得不更新 C,然而 B 依赖的是旧版本的 C,不兼容新版本——A 和 B 的依赖不能被同时满足。这还只是比较简单的例子,现实中的依赖关系可能更加复杂。

其他语言当然也会出现依赖地狱,但远不如 JavaScript 那样复杂,毕竟其他和 JavaScript 有着相似地位的语言大概率有完善的标准库,而 JavaScript 一开始只作为嵌入在浏览器里的脚本语言仓促设计,在留下许多历史包袱的同时也没有考虑到如今会承载的工程化开发,许多简单且常用的操作都需要引入外部库才能实现。你敢信,要在这门专门为浏览器设计的语言里好好地发一个 HTTP 请求,最常用的做法之一竟然是引入 axios1。顺带一提,这个库最近还被投毒了。

如果你在 GitHub 上发布过一些 JavaScript 项目,那么你大概会频繁地受到 GitHub Dependabot 的骚扰。还在用 Giscus 的那段时间,我常常在 GitHub 新消息图标出现时感到兴奋,以为收到了读者留言,结果新消息的内容是:

Security vulnerability in … affects at least one of your repositories.

在 JavaScript 的世界里,安全漏洞非常常见。从我自己的经验来看,Next.js 以及 React 相关技术栈非常容易出现这种问题,然而我使用 Next.js 开发的并不是对安全性非常敏感的复杂应用(这又回到了前文提到的「过度抽象」问题上),每隔一两周就收到这样一封邮件(是的,GitHub 还会给我发邮件)提醒安全漏洞问题,真的构成骚扰了。

可是安全性却不可忽视,除了软件本身的安全漏洞,NPM(Node.js 的包管理器,也是最大的 JavaScript 软件包分发平台)自身的抗风险能力也很低,隔三岔五就被投毒。让我继续报菜名,列举一下最近发生的 NPM 遭到投毒的事件报道。

  1. 2026/3/31 Axios NPM 供应链攻击
  2. 2025/11 Shai-Hulud 蠕虫污染 NPM 生态
  3. 2025/9 NPM 邮件钓鱼供应链攻击
  4. 2025/3 PhantomRaven NPM 供应链攻击
  5. 2025/2 Operation Marstech Mayhem 通过 NPM 偷窃加密货币和开发者数据
  6. 2024/12 Solana SDK 后门偷窃密钥

剩下的就不一一列举了,因为实在是太多了。其实也不能全怪 NPM,隔壁 Python 的包索引 PyPi 也在最近遭到投毒,详情可以阅读刘家财写的《 全球软件供应链安全演进:从 LiteLLM 投毒事件审视 Rust 包管理及分布式架构转型 》,文中还对比了 Zig、Go、Rust、Python 和 JavaScript(NPM)包管理的风险指数,其中 Zig 是风险最低也最去中心化的,而 NPM 则是另一个极端。

供应链投毒对 JavaScript 开发者的影响很大,执行 npm install 或者其他日常使用的命令之后就可能会有恶意代码在电脑上不知不觉地执行,偷走自己的加密钱包、SSH 密钥等重要信息,开发者的数字身份都有可能受到很大威胁,不仅仅是电脑中毒那么简单。

开发者很不好过,用户也没有好果子吃。

网页交互的越界

我在前文多次提到,我在使用浏览器时默认禁用 JavaScript。这是为什么?NPM 投毒有风险是因为恶意代码会直接在开发者的电脑上执行,难不成恶意的 JavaScript 代码还能跃出浏览器,直接访问设备上的数据吗?就算可以,难道现代浏览器不是把系统权限都管理的很好吗?

的确,除非手动允许网站访问文件、摄像头和外部设备等系统资源,网站并没有办法直接获取储存在本地的密钥等关键信息,但 JavaScript 的确可以在用户没有任何感知的情况下做某些事情,比如获取 Cookies、浏览器版本、安装的浏览器插件等,还能占用你的 CPU 资源进行计算。前者可以用来生成浏览器指纹跟踪用户(一般是用来投放定向广告,但也有隐私风险),如果遇到跨站脚本攻击(XSS),储存在 Cookies 里的登录凭证就可能被偷取;后者被利用的方式就很简单粗暴了,攻击者可以用你的 CPU 在后台悄悄挖矿,这叫做 Cryptojacking23

还有一些问题并不是恶意攻击造成的,而是某些不尊重用户的开发者(有一些甚至不是开发者,只能说是站长吧)的流氓行为。是的,我觉得以下都是流氓行为:在用户暂时离开网页时修改浏览器标签页的图标和标题,禁用系统的右键菜单,禁用审查元素(或者说控制台)和在用户不知情的情况下自动播放音频。

无论是恶意攻击还是流氓行为,都是在用户不知情的情况下加载 JavaScript 脚本导致的。这些脚本是不道德的,比如跟踪器。既然现有的浏览器还没有办法给某些可被利用的 API 设置较高的权限要求,像是否允许网站弹出通知那样让用户自行选择,那么用户就必须另寻他路了,方法就是主动屏蔽和拦截不想要的脚本。

最基础的做法是使用 uBlock Origin 这类脚本,屏蔽跟踪器。说起跟踪器,就不得不提到 Google Analytics 等分析工具都会利用浏览器指纹等手段跟踪用户,这对科技公司来说兴许是必要的商业举措(尽管依然不道德),但许多个人站长也使用此类分析工具。我建议使用 GoatCounter 等不跟踪用户的 Web 统计工具。

当然,uBlock Origin 只会屏蔽那些明显的恶意脚本,往往基于社区维护的屏蔽规则,肯定会有漏网之鱼。如果遇到突然出现的 XSS 攻击,只用浏览器插件就难以阻止了(不要觉得如今 XXS 已经不常见了,之前 Discord 还 被一张 SVG 图片黑了 )。更何况,有些脚本不是恶意,只是恶心,一般的屏蔽器没理由屏蔽它。

如果你已经在使用 uBlock Origin 了,那么你可以直接在设置里选择默认禁用 JavaScript。当你需要在某个网站上加载脚本时,可以为这个站点单独启用 JavaScript。推荐的做法是,不要在你不信任的网站上加载 JavaScript。诚然,这有点麻烦,因为你需要在每次访问一个新网站时确认它是否值得信任,然后再手动开启 JavaScript,不过有不少网站非常尊重用户,不需要 JavaScript 也能正常使用,或者单独提供了无需 JavaScript 的版本,比如 Kagi 和 DuckDuckGo 就证明了搜索引擎不需要 JS 也能正常工作。

禁用 JavaScript 也会导致基于 React 和 Vue 等前端框架的网站完全不可用。我对此的态度比较激进,请谨慎对待:如果一个网站只提供图文内容,竟然还使用这种框架开发而不是提供静态网页,那就没有必要继续访问,高质量的内容在其他地方也能找到;如果你访问的是网页应用,那么没有 JavaScript 就无法使用是完全合理的,确保这个应用是自由且开源的或者你信任的,再手动开启 JavaScript。

对于匿名用户来说,默认禁用 JavaScript 几乎能够完全杜绝被跟踪的可能性,总之百利而无一害。唯一会带来不便的点是使用 Paypal 或 Stripe 支付,或者使用网页版淘宝、京东购物时,因为需要在多个网域之间跳转、进行安全验证和支付操作,需要在多个网站上手动启用 JavaScript,比较麻烦,这时暂时禁用 uBlock Origin 就好。

更多有关禁用 JavaScript 的观点和教程可以参考 disable-javascript.org 。说来有趣,我是在 マリウス 的网站上发现这个项目的,他在网站上添加了一段「流氓」脚本,在用户暂时离开网页时将浏览器图标和标题替换为「地球是平的协会」「亚马逊:老婆抱枕」和「大脚怪裸照」等文本,让其他人以为用户访问的是奇奇怪怪的网站。当回到这个页面时,就会读到マリウス留下的建议:你应该只在自己信任的网站上加载 JavaScript。

最后

我说了不少 JavaScript 的坏话,但毋庸置疑,的确有不少人正在持续推进规范化和相关标准的修订,让这门语言变得更易用。为网页添加交互能力本身是极具开创性的点子,也构成了如今万维网不可或缺的一部分,但令人唏嘘的是,这个极具开创性的点子在一开始就没能得到足够的重视,在极短的开发周期内急急忙忙地上线,留下了许多历史包袱;又由于标准库的不完善,和中心化且抗风险能力低的包管理,这门语言给开发者带来了不少依赖和安全性相关的风险,并且漏洞频发;再加上科技公司对技术的滥用,用户的使用体验也得不到保障,而用户体验就是 JavaScript 一开始被创造的原因,它现在已经成为了在万维网甚至服务器后端行走的怪物。

我不讨厌这门语言,我也希望它变得更好,但就目前而言,开发者和用户都应该谨慎对待这项多少有些失控的技术。


  1. 不过值得一提的是,有 Web API 这样的规范一直在解决 JavaScript 标准库不完善的问题,比如 axios 其实就可以用 Fetch API 替代了。 ↩︎

  2. 参见: Cryptojacking with JavaScript  ↩︎

  3. Jack 列表又新增一员: Jack,你也健身吗?  ↩︎

稻草人周刊 Vol.75

2026-04-06 00:03:16

众所周知,我时不时就会调整一下周刊的格式,所以…… Voilà,我把音乐推荐移动到了单独的栏目,现在周刊的开头都是我的碎碎念了。


止语

最近听了不少摇滚专辑,在考虑要不要像 Taxodium 那样开设一个专辑推荐系列,还能做一个专辑墙页面。不过总觉得周刊要是少了用音乐开场的传统,似乎就差点意思。

GUTS

第 46 期周刊 就分享过这张专辑里的《love is embarrassing》,说来有趣,那一期周刊是第一次使用这个音乐组件,如今我给组件加上了显示专辑的特殊样式,正好最近也一直在听这张专辑,所以就拿出来分享了。

今年再听《GUTS》,发现自己最喜欢的一首变成了《ballad of a homeshcooled girl》,一来是很喜欢乐器使用,二来是这首歌的歌词大部分都让我深有同感,在通勤路上听这首歌,很难忍住不跟着 Olivia 一起发疯似地大喊:I know. I know!

我很喜欢 Olivia Rodrigo 某些歌曲的风格,包括她上一张专辑的《brutal》和《jealousy, jealousy》(或许还有《good 4 u》),甚至觉得《SOUR》里其他的歌都逊色不少。最近才得知我喜欢的那几首歌都是朋克摇滚,包括这张专辑里我很喜欢的《ballad of a home schooled girl》和《love is embarrassing》。

后知后觉才发现自己喜欢的摇滚类别其实是朋克啊。

Everything I do is tragic
Every guy I like is gay straight
The morning after, I panic
Oh, God, what did I say?

I broke a glass, I tripped and fell
I told secrets I shouldn’t tell
I stumbled over all my words
I made it weird, I made it worse
Each time I step outside, it’s social suicide
It’s social suicide, wanna curl up and die

Deep Fantasy

Deep Fantasy music cover

Deep Fantasy

White Lung

发现自己的音乐品味之后就去找了一些朋克摇滚来听,然后发现了这张近乎完美的专辑,唯一的缺点是太短。正在等待一个 Bandcamp Friday 买下它。

最喜欢的是《Down It Goes》和《Snake Jaw》。

Love it ugly, honey

Like is just the start

Love it ugly, honey

Erase me in the dark

将我在黑暗中抹除。


回拨

等等,你是说「回拨」这个栏目从 第 61 期 开始就再也没出现过啦?

那这期周刊就来回顾一下第一季度(1~3 月)极客死亡计划的文章更新吧,我会选取我自认为写得最不错的文章放在这里,并附上简介,可以选择最感兴趣的阅读。其实我本来月初的时候打算写月刊的,如今看来还是太难为自己了,能坚持写周刊就很不错了。

技术和软件专题

  1. 程序员和整洁的 Home
    本文介绍了 XDG 基本目录规范,适用于类 Unix 系统(macOS 和 Linux),提供了整理 $HOME 目录的实用指南,以及…… 让不知道 XDG 规范的开发者支持这个规范有多难。最近我还了解到,一些开发者以为这是 Linux 发行版上规范,所以给 Linux 实现了,但对于 macOS,还是直接把配置文件和缓存文件放在用户的 $HOME 里。真难受啊。
  2. 如何用电车难题理解 Git
    某天下午我摄入了过多的咖啡因,于是…… 就发生了这么一件事。
  3. 网页即列表!
    众所周知,HTML 和 XML 层层嵌套的结构其实就是树,而 Lisp 的 S-expression 层层嵌套的结构也是树,所以可以用 Lisp 来写网页,并且比 XML 写起来要干净不少,而且非常灵活。本文提供了基于 Clojure 和 hiccup 的解决方案。
  4. 迷失于图形界面
    图形界面非常容易变得臃肿,尤其是 IDE 这种复杂的东西。图形界面其实是建立了非常高层的抽象,屏蔽了底层细节,然而,这些细节真的是应该被屏蔽的吗?比如某个编程语言的依赖项是怎么声明和管理的?如果全都交给 IDE,那程序员不就无法了解这门语言的基础构建块了吗?据我所知,不少 Java 开发者离开了 Intellij IDEA 就完全不会写代码了,他们同时使用 IDEA 和 Cursor 编程,这真是我听过最好笑的事情。
  5. Webmention 简明指南
    介绍了 IndieWeb 推崇的 Webmention 规范,如何发送和接收 Webmention,同时还解释了经常和这种技术一起使用的 microformats。
  6. 计算无穷
    介绍了 Clojure 中的惰性序列,以及如何使用惰性序列用非常简洁且优雅的方式编写高性能的代码。

软件相关,但不懂技术也能读懂

  1. 去营地整点 FLAC
    介绍了常见的音频文件格式、音频信号处理的基础知识、无损和有损压缩以及自由和开放格式。最后把矛头指向流媒体和混乱的音乐行业,提供了抛弃流媒体的方法。如果不想要在多个流媒体平台支付订阅费,还想要听到音质更好的音乐的话,可以阅读这篇文章。
  2. 带着鸭鸭和狗狗逃离咕噜咕噜
    讲完音乐来讲搜索引擎,一个垄断更严重的行业。本文简述了搜索引擎最初的愿景、发展历史和谷歌的兴起再到后来的垄断(谷歌所占的市场份额超过 90%),以及大科技公司提供的搜索引擎为什么不好、常规的隐私搜索引擎(如 DuckDuckGo)有什么问题、付费搜索引擎为什么更好,以及自托管搜索引擎的可行性。

这两篇文章的字数似乎都超过了一万,第二篇甚至有一万六千多字。写这种文章挺累的,但我也能学到不少东西,总之很有意思,之后应该会多写,可能每个月会有一篇类似的文章。

人文社科专题

  1. Es muss sein?
    好久没更新的《塔罗牌漫谈》系列,这次讲的牌是「倒吊人」,我对这张牌的牌意总结是:旧秩序的颠覆、从行动中退出、必要的反思、心流状态、坚持自我、用新视角看待问题、接受不能改变的、精神上的掌控感。
  2. 论遣词造句
    文风和用词问题,大概是每个语言使用者(尤其是作者)都应该考虑的问题,还顺带谈了谈欧化中文。我还在这篇文章中提出了 /glossary 页面的想法,两周前已经给 slashpages.net 提交了 Pull Request ,不过维护者兴许太忙了,目前还没有合并。
  3. 我为什么喜欢音乐剧?
    我并不是音乐迷,但我爱音乐剧。好多人觉得演戏演到一半突然唱起来很奇怪,但我超爱!
  4. 阅读文学如何帮我欣赏摇滚乐?
    文学基于理性的话语,而音乐相反,音乐是反话语。在音乐的非理性中,个体能够暂时抛弃话语和理性带来的痛苦,在喧嚣中知晓一切。

最近人文社科相关的话题写得比较少,至少不如以前那么多了。杂文也有一些,这里没列出来,感兴趣的可以去 议与叙 页面查看这三个月的所有文章。

书评合集

  1. 帕尔马修道院
    司汤达的长篇小说,好长…… 好长…… 从去年年底读到今年一月底。一如既往的司汤达,他的狗血剧情和文学性是可以共存的。
  2. 世界尽头的咖啡馆
    我不推荐任何人读这本书。好刻意直白、毫无文学美感的心灵鸡汤。更好笑的是,我那个讨人厌的同室挺喜欢这本书,不值得一读的原因又增加了。你敢信这本书竟然给「人生的意义」这个词造了个缩略词 PFL(Purpose for Life)?
  3. 如何获得内心的安宁
    斯多葛主义哲学家塞涅卡的书信集选译本,翻译质量不错,不少文章都挺有意思,而且足够通俗,不懂哲学的普通读者也能读懂。斯多葛主义看起来登味很重呢,不太适合我,但感觉像是我同室会喜欢的,比如洗冷水澡什么的。
  4. 不能承受的生命之轻
    非常喜欢的小说,我已经能预见自己在几年后再次打开这本小说读了。我还没能完全明白这本小说要讲的东西,没有理解的就等待之后温故知新吧。
  5. 来自沉船的爱意
    乙一和另外两个作者合作的短篇小说集,质量中等偏下,如果只是想找点故事来读还不错。什么时候能再次读到《夏天,烟火和我的尸体》那样的乙一呢?

我这三个月竟然只读了五本书吗?定下的 40 本目标看起来遥遥无期啊。最近面临找实习和准备项目的压力,焦虑得即便有时间也没办法停下来(或者说静下心来)阅读,希望能早点恢复状态吧。不过还好,还能够全情投入地写文,所以能够保持 San 值健康。


连接

控制你的标记语言

📜

作者介绍了几种 Markdown 和 Org Mode 以外的用于写作的标记语言,文章的 Lisp 含量非常喜人。

和我之前写过的《 网页即列表! 》的思想类似,既然要把标记语言编写的文本转化为 HTML,而 HTML 构成的嵌套的 DOM 树本身就是树形结构,那么用 S-expression(Lisp 语言所采用的表达式,即列表或者说括号的嵌套)编写网页就非常合理,并且比用 XML 或 HTML 干净不少。

首先是 Pollen ,据说是 Matthew Butterick 用 WordPress 写在线书时嫌弃它不够灵活,所以开发了 Pollen。这个标记语言把一篇文章(或者一本书)都当作 X-expression(用来表示 XML 数据的 S-Expression,常在 Racket 这门 Lisp 方言里使用),为了让更多人使用它,它还兼容 Markdown。为什么这么多新标记语言都在兼容 Markdown,是因为用的人实在太多了吗?

如果这么写:

#lang pollen

Deep Thought
============

I am **so** happy to be writing this.

就会被 Pollen 解析为:

'(root
 (h1 ((id "deep-thought")) "Deep Thought")
 (p "I am " (strong "so") " happy to be writing this."))

最后被转化为 HTML:

<root>
 <h1 id="deep-thought">Deep Thought</h1>
 <p>I am <strong>so</strong> happy to be writing this.</p>
</root>

Pollen 的灵活性体现在自定义标签(custom tagst),比如图片写作 ◊image["图片地址"]{图片描述} 而链接写作 ◊link["链接地址"]{链接文本}Org Mode 正在攻击我,但是混杂着 Markdown 和奇怪的东西),imagelink 可以换成自己定义的函数。

可以用类似的方式定义如何把某个标签转换为 X-expression:

(define (image url alt)
 `(img ([alt ,alt] [src ,url])))

之后就可以把 X-expression 转化为 HTML,或者 PDF 等任何文档格式。在我看来,Pollen 有点像是 Pandoc ,可以自己编写某个语言的 Reader 和 Writer,前者用于把源语言转换为 AST(抽象语法树),后者把 AST 转换为目标语言,不过对 Pollen 而言,Lisp(X-expression)充当了 AST 的作用。

另外 Pollen 可以一边定义语法一边写文,说实话,看起来很爽。

#lang pollen
◊(define ($ . xs)
 `(mathjax ,(apply string-append `("$" ,@xs "$"))))
◊(define ($$ . xs)
 `(mathjax ,(apply string-append `("$$" ,@xs "$$"))))

◊h1{I wonder if ◊${2^{\aleph_\alpha} = \aleph_{\alpha+1}}?}

这篇文章还介绍了 Alain Marty 的 Lambda Talk,不过引用的两个链接都需要 JavaScript 才能加载内容,我拒绝为了读文档而加载 JavaScript,加上这个标记语言看起来也没有特别吸引我的地方,所以就没有去了解了。作者还提出用 Tcl 这门不需要括号和引号的编程语言来写文档,也是有趣的实践,而且编程语言无疑要比标记语言灵活得多。

作者还讨论了在 Markdown 里插入代码的方法(不是代码块),首先排除了 MDX(本质上是 Markdown 加上 JSX 这个邪恶的东西),需要 Node.js 才能运行;又排除了 Org Mode,原因如下:

Org-mode 相对 markdown 有更多的功能以及根植于 Emacs 的可扩展性。然而正是因为 Org-mode 功能太丰富我才选择扩展 Markdown——扩展的平台必须足够简单,才能让扩展完的成果保持简单。

当然,Org-mode 只有在 Emacs 中才能获得良好体验也是我选择 Markdown 的原因之一。

作者目前的解决方案是使用 Pandoc filter,这其实就是在对 Pandoc Reader 解析得到的 AST 做处理,比如把标记为 mermaid 的代码块转换为 SVG 代码再由 Pandoc Writer 输出为指定格式。我由于使用 Hugo 写博客,所以短代码(shortcode)在大多数时候就够用了,不过体验上是没有 Pollen 一边造语法一边写文的体验爽的,也没有 Pandoc 那样的兼容性。

很有意思的文章,说不定哪天我真的开始用 Lisp 写文章了呢。

用 (Neo)vim 写 Lisp

📜

书接上文,前面说到 Org-Mode 只有在 Emacs 中才能获得良好体验,而 Lisp 也非常适配 Emacs,毕竟这个编辑器的核心就是一个 Emacs Lisp 解释器(或者说 REPL?)。不过,我非常固执,始终不太愿意选择 Emacs(兴许会用 Emacs 写文或者记笔记,但写代码我还是更喜欢 (Neo)vim),幸好 Vim 也可以通过插件和配置得到很好的 Lisp 编辑体验。

要获得良好的 Lisp 编程体验,需要两个工具:

  1. 用于编辑 S-expression 的结构化编辑功能(否则就真的 Lost In Stupid Parentheses 了)
  2. 内嵌 REPL1 以实现交互式编程(否则和非 Lisp 语言还有什么区别)

作者在文章中介绍了如何使用 Vlime(类似于 Emacs 的 SLIME,用于交互式编程)和 Paredit(括号编辑,或者说结构化编辑)。前者本质上是启动了一个服务器,这个服务器运行 REPL,接收来自编辑器的表达式,计算表达式后返回值给编辑器。比如,在 Vim 里选中 (+ 1 2),执行 Eval 操作,Vlime 就会把这个字符串发送给 REPL 服务器,然后得到返回值 3 显示出来。

这有点像 LSP(语言服务器协议):编辑器把代码发送给语言服务器,然后把语言服务器分析得到的警告、报错和优化建议显示给用户。REPL 不仅仅是计算表达式的值那么简单,如果把一个函数定义发送给 REPL,它就会记住它,在同一个会话下,可以在之后的 Eval 操作里直接使用这个函数。这就是交互式编程,可以直接对 S-expression 求值,不需要手写 print 或者 console.log 之类的。

不过 Vlime 有点老了,而且是给 Vim 写的。对于 Neovim 用户,可以选择用 Fennel(用来写 Lua 的 Lisp 方言)实现的 Conjure ,这个插件甚至还能实现 Lua、Python 和 SQL 等语言的交互式编程。

至于 Paredit,我的选择是 nvim-paredit 插件,Paredit 的实现大概都没有太多区别。不过,我还没有细细研究过 Paredit 的各种操作(因为文档太长了懒得看),目前觉得编写 Lisp 代码必不可少的有这些操作。Slurp(吞参数),把括号外面的一个形式(form,也就是一个括号和括号里面的所有东西)吸到括号里面来,可以吸前面的也可以吸后面的;相对应的有 Barf(吐参数),不必解释。这两个操作在 nvim-paredit 里的快捷键是 >)(吞后面的参数)、<((吞前面的参数、<)(把参数吐到后面)和 >((把参数吐到前面)。

另一个常用操作是选中整个形式,复制和删除代码的时候很好用,进入 VISUAL 模式后按下 af 即可。其他的操作我就用得比较少了,或许我该找时间仔细读一读 Paredit 的文档了。顺带一提,适应 Lisp 里形式的概念之后会发现很多有趣的操作,比如 Clojure 可以用 #_(...) 注释一个形式里的代码,我第一次发现的时候觉得简直是天才的设计,毕竟 Lisp 同一行里有很多前几行代码的反括号,注释一整行会出现问题。

大概就是这样,如果你是 Vim 用户,想要编写 Lisp 代码的话,可以参考作者的配置,使用 Vlime 和 Paredit;如果你用是的 Neovim,理论上也可以使用前两个插件,是兼容的,但我推荐你试试 Conjure 和 nvim-paredit

为什么免费的东西让人失智?

📃

作者列举了两次由免费试吃引发的事故,比如老人指责年轻人吃了太多试吃小样让其他人没得吃,然后被锤了一拳,还有两个九十多岁的老年人也因为超市试吃发生了口角。不仅如此,作者还引用了一些研究,从行为经济学的角度解释,人们就是会因为某件商品的价格是免费的而做出不理智的消费决策。

不理智是指,即便不免费的商品更好,人们也普遍倾向于选择免费的。免费的巧克力,和只要一毛钱(美元)的巧克力,哪怕后者品质更好,大多数人都会选择前者;当免费的巧克力价格变成一分钱,不再免费,人们又会更倾向于后者。另一个例子是运费,哪怕有更划算但需要支付运费的商品,人们也更倾向于选择免运费的商品,然而选择需要支付运费的商品,消费者还能省几块钱。

对此的解释是,人们在看到某件商品免费时会产生一种「良好的感觉」,这种感觉驱使我们做出不理性的消费决策。如今更常见的例子是互联网媒体和社交媒体,只有很少的人会为内容(比如说新闻)付费,甚至大家理所应当地认为这些东西就应该是免费的,永远不会给这些东西付钱(当然这并不是因为他们是海盗党或者 Copyfarleft),还有社交媒体,人们已经习惯了免费使用,忍受大量广告和垃圾信息的商业模式了(联邦宇宙居民就这么静静地看着你们)。

顺带一提,文中还列举了免费试吃带来的购买率提升,令人震惊,原来这种商业行为这么有效……

喝咖啡对口腔有伤害吗?

📺

我一直知道茶和咖啡喝多了会让牙齿变黄,所以有注意勤刷牙,第一次知道咖啡还会影响口气。不过值得庆幸的是,咖啡并不会对口腔健康造成实际的伤害,咖啡中的某种物质会让牙釉质在短时间内变软,变软的期间就更容易被着色,也更容易受到伤害,所以喝完咖啡之后及时漱口就能就减少色素残留。不过,要等待至少半个小时才能刷牙,因为牙釉质在喝了咖啡后变软。

事实上,喝咖啡不仅不会对口腔直接造成伤害,还具有一定的保护作用。研究发现长期规律引用黑咖啡的人更不容易得蛀牙,这似乎是咖啡里的某种物质造成的效果。不过前提是不往咖啡里加糖和牛奶,糖是助长蛀牙的罪魁祸首。

一天喝两杯手冲咖啡的我满意地离去。

《洛丽塔》的文化影响

📻

文不对题似乎是树老师的常规操作(毕竟她自称懂得传播学,相信修辞的力量),总之,这期博客并没有在讨论是否应该封禁《洛丽塔》这本书,仅仅是文学分析。我最爱的文学系列终于更新啦!

《洛丽塔》是俄裔美国作家纳博科夫 1955 年的作品,从一个恋童癖、强奸犯兼杀人犯的视角讲述了他的故事。他的名字叫作亨伯特·亨伯特,在 13 岁时他爱上了 12 岁的安娜贝尔,可不久后他的初恋对象因伤寒而早逝,童年阴影让他对爱情的印象永远留在了那一刻;另一种对他恋童癖身份的解释是,他生来就是恋童癖,这是根治在他人格里的东西。作者没有说哪种诠释是对的,而是让读者自行选择。

小说的主要情节是 38 岁的亨伯特·亨伯特对 12 岁的多洛莉丝的爱恋,他给他起昵称为「洛丽塔」。为了接近少女,亨伯特·亨伯特迎娶了多洛莉丝的母亲,她的母亲发现亨伯特·亨伯特的真实意图之后,准备寄信给还在夏令营的多洛莉丝告知真相,却因车祸死在了路上。随后亨伯特·亨伯特和多洛莉丝开启了一场跨越美国的公路旅行,被描述得十分浪漫,当然,亨伯特·亨伯特在旅行途中与她无数次发生关系。多洛莉丝长大后逃脱了继父,后来还结婚生子。三年后两人再次相遇,亨伯特·亨伯特向多洛莉丝表明了爱意,但多洛莉丝只把他当作父亲。亨伯特伤心欲绝,杀死了三年前带走多洛莉丝的男人奎迪,因杀人罪被捕,最后病死狱中。

小说叙事的一大特点是:叙述者是不可靠的。讲述这个故事的是亨伯特·亨伯特本人,他当然会将恐怖的强奸浪漫化为爱情,他描述的多洛莉丝也不会是多洛莉丝本人,而是他幻想出来的「洛丽塔」。

这本犯罪心理小说有极大的文化影响力,许多名人都公开讨论它,也有电影改编了这部小说,很多其他的文化作品也受其影响,二次元文化中的「萝莉」一词就来自这本小说。尽管「萝莉」与恋童癖并无关系,但名字的确来源于此,骇人听闻的「萝莉岛」倒是和《洛丽塔》这本书十分相似。这本书尽管在一开始就将书中描绘的关系称作不道德的,但世界上著名的恋童癖罪犯最爱的书就是这一本,一些女性甚至把《洛丽塔》当作浪漫爱情故事来读,毕竟亨伯特描绘的公路旅行的确具有浪漫色彩,但那是一个犯人、一个不可靠的叙述者的第一人称叙事。

小说叙事方式令人不适的一点在于,亨伯特·亨伯特十分真诚,当读完他的自述之后,读者甚至可能对这名恋童癖犯人表示理解。我想起《无耻之徒》这部美剧中也有对恋童癖的描述,剧中的一群人得知社区里搬来了一个恋童癖性骚扰犯,操着棍棒赶到门口想把对方赶出去,可门打开之后,他们发现那个犯人是个女人,那个女人含着泪说「那是因为我爱他」,于是其他人都散了。2

亨伯特·亨伯特也在小说中表露了对多洛莉丝的爱,甚至在她长大嫁人且怀有身孕后,仍然要求和她在一起。这提出了非常令人不安的问题:恋童癖犯人对儿童的情感真的是爱吗?如果说亨伯特·亨伯特爱上的是他想象中的洛丽塔而非真实的多洛莉丝,那问题是,难道世界上许多的爱情不都发生在人对人的不真实想象中吗?毕竟,去爱具体的人是需要学习的事情。

我喜欢让我感到恐惧和不安的小说,兴许我会找来读的。


指引

这是完全随机出现的栏目,之所以会有这一栏,是因为我在周日的晚上用塔罗牌抽取下周的运势,突然想把它写下来。我也不知道下周会不会继续写。

被摊开的塔罗牌,大多数都是背面朝上,中间摆着四张正面朝上的,分别是宝剑女王的逆位、宝剑九的逆位、圣杯国王和圣杯七

宝剑女王逆位、宝剑九逆位、圣杯国王和圣杯七

这副牌叫作《暴风雨塔罗》,之前是独立出版的,价格是两百多,前几个月被 U.S. Games 出版商买了下来,现在只需要八九十人民币左右就能买到。我很喜欢航海主题,这幅牌整体的配色很舒服。

上周的运势有两张权杖牌,一张是权杖十的逆位,另一张是权杖二。权杖在塔罗牌里代表火元素,一般和行动力和创造力相关,果不其然,我上周从周四开始就几乎什么都没干,在前几天把精力都用完了,甚至周五和周六感到心情非常低落。这周的牌就看起来温和很多,尤其是圣杯国王,感觉会和一些人有舒服的相处,或者是塔罗牌在告诉我多向他人提供帮助、找点话聊,因为我好像快一个月没有和活的人类有过超过一分钟的对话了。

我的精神状态可能会有所好转,因为圣杯牌在我看来是情绪稳定的象征,看圣杯七的话,下周有可能在想一些让自己感到幸福的事情,不像前一两周那样被负面想法困扰。

不过,牌面上还出现了我很害怕的宝剑牌逆位。说来也巧,我一直把一张宝剑女王加载自己随身携带的本子里,有朋友问起时,我解释道这是因为我很相信宝剑女王的判断力,理性当中又带有一些人情味,希望能当作护身符一样的东西。宝剑女王的另一个面向或许是太喜欢对人评头论足了,这周抽到逆位的宝剑女王或许是一个提醒(如果你关注我的 联邦宇宙账号 的话,就会发现我几乎天天都在骂我的同室)。至于宝剑六的逆位,我大概是处在一个情绪状态的过渡期,不过貌似是卡住了,可能先要克服宝剑女王的对我的影响吧。

牌面上的两张宫廷牌对照还挺鲜明的,逆位的宝剑女王喜欢评头论足,有些自以为是,会把身边的人推走,而圣杯国王则是很亲切随和的形象。唔,或许我真的要对身边的人类展现出更多的善意了,释放善意也是在为自己的心理健康着想。

感觉下周会从暴风雨逐渐转变为晴朗的好天气呢,有些期待。


切片

  • 已经完成一百期周刊的四分之三了,真快啊。
  • 博客的标签乱得有些不可理喻了,尽管在《 极客死亡计划书 V 》里为标签的正当性进行了辩护,但…… 我不得不承认,我现在有点想把它删掉,顺便优化一下 双向链接图谱 功能,方便找到同一主题的文章。我闻到了《极客死亡计划书 VI》的味道。

  1. REPL:Read-Eval-Print-Loop,输入-计算-打印-循环。 ↩︎

  2. 不过主角中有一人坚持认为她有罪,于是装成高中生,脱掉上衣修剪草坪以色诱她,最后他们确实上了床,然后女恋童癖把他的阴毛剃了,然后他的女朋友发现了…… 呃,等等,我怎么写到这里来了? ↩︎

垃圾

2026-04-05 16:57:19

今天早上在餐桌边喝水时,门被敲响了。我总是避免和陌生人打交道,所以外卖和快递都会等赶时间的送货员匆匆放在门口,来电告知送达之后,才打开门拿取。当然,电话我也不接,大部分时候都没有什么问题。

可今天的门响个不停,而且敲门的声音非常粗暴,像是要把门撞开一样。

桌上的水杯也开始摇晃,看来这次社交是躲不掉了。我刚走到门口,就听到外面的人开始大喊:“公安局的,快开门!”

我的大脑一片空白,肢体被恐惧驱使着打开了门。外面的人敲门这么用力,一定是做了调查,知道我在家的,装作家里没人是没用的。一打开门,身穿黑色制服的两个男人就要带我走,我还没来得及喝完刚刚倒上的那杯温水。我不知道我做了什么,我问他们,可他们不回答,仿佛我没有权利知情。

是为什么呢?我并没有从事任何违法犯罪的事情,可那些警察看我的眼神,像是在看一头怪物,满是憎恶。他们的动作也很粗暴,不想把我当成人来对待,我被推进警车里,在众目睽睽之下被带走了。后座的坐垫很硬,摔在上面时,我感到肌肉酸痛,感觉身体都要裂开了,还蹭到了手臂上的伤口,不知道是什么时候留下的。

还好我和邻居从来不交流,不然发生了这种事情,就得换个地方住了。我只担心每天都热情地给我开门的保安大叔和经常从我这里收废旧纸板的老大爷,他们以后会不会不愿意接近我,看到我的时候偷偷躲进保安厅、躲进楼梯间?

“这个垃圾袋,是不是你丢的?”

刚才粗暴地把我推进车里的警察,在我坐下没多久之后,拿出了一个用透明塑料袋装好的黑色塑料袋,黑色袋子里看起来并没有装多少东西。真是奇怪,我还是第一次知道垃圾袋还能被装进更大的袋子里——但很快我立马想起小区里的垃圾桶就是这样的,桶里套了巨大的黑色垃圾袋,居民们都把自己的小黑色垃圾袋往里面丢。不过我面前的这个大袋子是透明的,所以我的疑惑应该是:我第一次知道有这么大的证物袋。

“说话!”

“我不知道,但我一般不会在只有这么一点垃圾的时候就把垃圾打包丢掉。”

我在想,给警察提供这种证物的是怎样无聊的人,哪怕是室友因为私人恩怨想要赶我走,也不至于沦落到捡垃圾的程度。不过,极有可能是每天在楼下游荡,寻找废品的大爷。回收废品已经不能满足他了,所以就把看起来平平无奇的垃圾袋当作证物交给警察,把它和可怕的犯罪联系起来,然后栽赃到无辜的人头上,以领取奖金——如果公安局真的会支付那种东西的话。

“昨天晚上八点二十四分,你从 24 层进入了三号楼的电梯,乘坐电梯到了一楼,把这个垃圾袋丢进了楼下的第三个垃圾桶,是不是?”

“我昨天晚上确实丢过垃圾,但所有的垃圾袋都长一个样子,我也分不清这是不是我的。”

我在想他们有没有在垃圾袋上找过我的指纹,不过那种材质的表面,应该没有办法留下痕迹吧?更何况人提垃圾袋的时候,都是用手指关节承受重量,提手和手指尖根本不会有接触。

“这个抽纸的包装是你的吗?”

对面的男人放下了那包大得出奇的证物袋,拿出了另一个大小适中的,里面装的仍然是塑料,但这次是抽纸的塑料包装。

“这的确是我常用的牌子。”

“那这个药盒呢?这个牙膏?还有……”

男人一件接着一件地拿出垃圾来叫我指认,我一一招认了,那些东西的确是我的,这么说来,那包垃圾也是我的。可是,警察拿出来的那几样物品体积并不大,为什么垃圾袋里的东西那么少呢?

“警察同志,这些的确是我的东西,但我还是很疑惑,如果你们只拿了这么一点东西出来,为什么那个袋子里的垃圾袋会那么小呢?我记得我丢掉的是满满一整包的垃圾。里面的其他东西去哪了?”

“你问我里面的东西去哪了?”

男人瞪大了眼睛,死死盯着我的,仿佛想用目光让我招供,可我根本不知道他想要我说什么话。对啊,我的确是问他东西去哪了,他为什么这样愤怒,要把我的问题用这样的语气重复一遍?

“这么绷得住。”,男人突然冷笑,站起身,开始在房间里缓慢走动,“你真的猜不出来里面的东西到哪去啦?”男人的动作像是影视作品里行为夸张的反派,尽管用这个词形容警察可能不太合适,但他刚才表现得的确有些歇斯底里。

“我想不到,我都忘记里面还有什么了。”

不知道为什么,我被从家里带走已经快半个小时了,而对方竟然还对垃圾袋里面有什么这样的小细节紧咬不放。

“装!你还装!你告诉我你他妈不记得里面装了个孩子吗?!”,男人走到房间中央停下,突然转过来对着我,双手猛地往桌上一砸,吓得我直哆嗦。

“孩子?里面有个人?”

“对,一个活生生的人,被你毫无人性地塞进了垃圾袋里。”

“警察同志,你一定是搞错了,我家里只有我和室友两个人,怎么会有一个活生生的小孩出现在我的垃圾袋里呢?”

对面的男人快要气疯了,一时间说不出话,借着这个空隙,我想起了一些事情。

昨天晚上我上厕所的时候,发现垃圾桶里有个奇怪的东西。因为厕所的垃圾桶里几乎全是用过的纸巾,白花花的一片,所以任何其他颜色的物体混进去都会很明显,更何况这个东西就在垃圾桶的最上面。

是什么呢?看起来像是人参,但又小很多。上面有白色的须状物,像块茎一样附着有一些泥土,还有类似萝卜的纹理,但粗细和长度都要比手指更小。上面似乎还有叶子,但我记不清了。是室友丢掉的吗?我不记得他有养过什么植物,而且,为什么会丢到厕所来?其他地方也有垃圾桶,只有在厕所产生的垃圾才会出现在这里吧。

那个奇怪的东西很瘆人,正好垃圾桶也满了,我就把垃圾袋打包好,一起带出门丢掉。当时的我想要丢完垃圾过后去公园跑步,于是换上运动鞋,戴着耳机进了电梯,听着摇滚乐。

“你把小孩丢进垃圾桶之后,就一路走到了公园,远离了犯罪现场。是这样吗?”刚才的男人后退到房间角落,满脸怨气地盯着我,另一个面相和善的男人走了进来,开始问我问题。

“是的,但是我连一个小时都没到就回去了,而且我没有丢小孩,我丢的是垃圾,里面都是纸巾。”

“谁能证明你没有丢小孩?”

我一时不知道要怎么回答,这种事情要怎么证明?一开始又是怎么怀疑到我头上的?我想起邻居两家人是亲戚,对着门,总是把大门敞开着相互窜门,而且住在高层,不担心有人偷东西。我昨晚出门的时候,虽然戴着耳机,但也有听到逗小孩的声音。

“我的邻居,我出门的时候他们开着门的,能看到我。如果有小孩被我装在袋子里,他们很容易就发现了。”

“好,我们会联系的。那谁能证明你昨天晚上回了家?”

“回家?你们都能查到我是什么时候出门的,为什么会不知道我有没有回家?”

“昨晚你们小区的监控从八点半左右就下线了,直到早上接近六点才恢复。”

“怎么会有这么巧的事情?”

“我们也觉得不会有,而且,监控设备下线的区域,只有你居住的三号楼。”

“你们的意思是监控是我弄坏的吗?我根本没那个能力!”

“我们了解到你的专业是网络安全。”

“这……!”

“你先住嘴,你是在被审讯,回答我刚才的问题:谁能证明你昨天晚上回了家?”

我想起昨天晚上在公园跑步过后,乘电梯回到我所在的楼层时,通道里异常安静,小孩子和大人似乎都进屋了。那个时候刚过九点,邻居都是中老年人,这样的作息也合理。奇怪的是,家门口的灯没有亮,我是借着密码锁按键发出的光开的锁。

“我的室友一直在家,我回来的时候他肯定能听到开关门的声音。”

“好,所以你说你昨天晚上八点二十四分出了门,出现在邻居的视线里,随后乘电梯到了一楼,在紧挨三号楼的第三个垃圾桶丢掉了垃圾。你声称垃圾里只有纸巾和其他生活用品,没有丢小孩。丢掉垃圾之后你步行去了公园,随后在当晚……?”

“九点十分左右。”

“九点十分左右回到了家中,开关门的声音有被室友听见。你确定这是昨天晚上发生的事情?”

“是,那之后我就没有再出过门。”

“好的,好的。你还有什么要说的吗?”男人一边在纸上写字,一边头也不抬地问我。

“我不知道我还能说什么,我没有丢小孩,我能回家了吗?”

“你昨晚有没有在公园遇到认识的人,可以证明你的确去了公园?”

“没有。”

对方又问了我几个问题,之后两个男人走出房间,似乎是在讨论要不要把我逮捕归案。他们有掌握什么实际的证据吗?仅仅是一些生活垃圾并不足以定我的罪吧?更何况我真的什么也没干。

漫长的几十分钟过去了,那个面相和善的男人回来了,他让我去办一些手续,我被人带着走。虽然在全是陌生人的环境里让我很焦虑,但至少其他人看起来没有那么凶狠。办完之后,我被放了出来,时间已经是晚上了。我并没有松一口气,因为我知道他们会去调查我的邻居和室友,事情远远没有结束。

晚上我回到家,值班的保安和早上不是同一个人,因此没有认出我就是早上那个被警察带走的年轻人。想必这件事情已经在邻里街坊传遍了,只不过讨论八卦的人还不会变态到把被谈论者的照片拿出来传递。

上楼之后,还没有到九点,邻居还敞开着家门。我的速度太慢了,没能来得及输完密码,就被满脸担忧的邻居阿姨拉住,问我发生了什么。我只能说是警察搞错了,她似乎是相信我的,不然我也不会被放出来,但她依然感到担心,问了很多问题。终于进入家门时,我感到精疲力竭。

刚关上门我就听到室友在房间里放出令人讨厌的咳嗽声,对于讨厌的人来说,他们活着似乎都是错误。室友的鼻子喜欢发出令人匪夷所思的声音,不是在擤鼻涕,也不是呼气声,像是鼻腔在咳嗽,很难形容。听到这样的声音让我感到恼火,我很想一脚把他的门踹开让他不要继续烦人了,或者至少应该找个东西暴揍一顿,可我一叹气,身体就没了力气,那些破坏性的想法也就无力实施了。

我倒掉早上没有喝完的那杯水,给自己泡了一杯果茶。明明没有喝很多,我却在几分钟后感到强烈的尿意,冲进厕所时,我在垃圾桶里看到了那个奇怪的东西。

怎么还在这?我昨天不是丢掉了吗?这是室友的恶作剧吗?

我感到脑袋很重,双腿发软,蹲了下来。我开始耳鸣,看不清东西,但这种症状没过多久就消失了,站起来的时候我感到很虚弱,爬上床睡去了。

第二天我又看到了邻居阿姨担忧的眼神,但这次还夹杂着恐惧,她直勾勾地盯着我。她的儿子拉着她的手臂晃来晃去,问她隔壁的大哥哥为什么会被警察叔叔戴上手铐押走。


邻居说那天晚上的确在我所说的时间点看到了我出门,不过并没有注意我手里拿了什么东西,他们忙着做自己的事情。室友说我没有在九点回家,反而是在早上六点左右听见了动静。他竟然会跟警察撒谎,我怎么也不会想到他会坏到那种程度。不论我怎么辩解,我都难以洗脱罪名,因为他们还找到了电梯里面的监控录像。

据说昨天最开始取证的时候,值班的保安不熟悉监控系统,没有找到电梯内的监控,只找到了楼道里我进入电梯的画面。后来他们找到了电梯里的录像,电梯里的摄像头还能录制音频:

“放我出去。”

“求求你了,我在这里挤得好难受。”

“不要把我丢掉,让我出来。”

听到监控录像传出幼童的声音时,我感觉它们像是从很远的地方传过来的,大概是因为我已经恐惧和困惑得与现实脱离了。电梯里的我戴着耳机,什么都没有听到。我观察录像里我提着的垃圾袋,它看起来比我带出门的时候要大得多。

是那个人参一样的东西吗?怎么会?

如果真的有个孩子在我的垃圾袋里,我当时为什么感觉不到?如果是那个怪东西突然变大,或者发出声音,我怎么可能不会被突如其来的动静吓到?我看着影像里的自己,十分镇定自若,甚至没有在看手机,而是在阅读电梯里贴的广告。

嫌疑犯在犯罪时竟然没有表露出一丝的紧张和歉意,难怪警察会暴跳如雷。可我没有丢孩子,我要怎么让他们相信?那个孩子现在在哪儿呢?

他们没有把我带去监狱,而是暂时把我关在了拘留所,据说他们要联系孩子的家长,双方都要找律师,判刑之后才会把我关进去。是的,他们认定我一定会被判刑。我就像是人类里的垃圾,哪怕真的有价值,一旦被装进垃圾袋里,就只会被当成肮脏的东西。没有人在乎垃圾的价值,人们只想要走流程,快点把它处理掉。

“那个孩子现在在哪?”,我问我的律师。

“这不是你现在应该关心的问题。你要先告诉我你的犯罪动机、实施犯罪的手法,越多细节越好,我才能想办法给你减罪。”,律师试图让我跟上他的节奏。

“可是我没有实施犯罪,我不知道那里面有小孩。”

“那他是怎么进去的?你知道吗?有没有证据他是自己钻进垃圾桶里的?我觉得这不可行,没人会相信你不知道垃圾桶里有个沉甸甸的孩子。”

“这不是可行性问题,这是事实。我就是不知道那里面有个孩子。”

我没有把那个人参的故事告诉我的律师,他已经把我当变态看了,我可不想被当作疯子。不过,变态和疯子究竟哪个名声更坏呢?似乎人们会同情疯子,但只会憎恶变态。兴许,说实话也不是那么糟糕的主意。

过了几天,孩子的律师出现了,双方要讨论案件情况和证据之类的。坐在我和律师对面的是另一个律师,孩子和家长还迟迟没有到。我想看看那个孩子究竟有多小,才会神不知鬼不觉地进了我的袋子里。

那个歇斯底里的男人进了门,对着我的律师说,孩子的家长找不到,孩子也几乎无法交流,身份不明,于是他来协助推进案件。随后,他转过身,把门后的人带了进来。

只不过那根本不是一个人。

他的体形和四五岁的小孩子差不多,但它没有头发、没有人的皮肤,只有脏兮兮的像块茎一样的身体,褐黄色暗沉且粗糙的皮肤,以及覆盖头皮的深绿色叶子,叶片很小很细碎,四肢没有指和趾,只有缠着泥土的根须。

我被吓得把椅子往后猛地移了两步,律师转过头来,问我有什么问题,是不是这个小孩。

“这是在开玩笑吗?那根本不是个人!”

对面的男人和律师神情严肃地盯着我,他们以为我是在羞辱面前这个东西,严厉地指责了我。我们是在会议室,是正式的场合,男人没有像之前那样歇斯底里地发火,但他盯着我的眼神,就像是在用另一种语气重复我刚才说的话:“这是在开玩笑吗?你根本不是个人!”

会谈照常进行,主要是律师们在交流,我什么话也说不了,我也根本无法参与他们的谈话。他们在一遍又一遍地确认那天晚上发生的事情,对照现有的证据纠正各种细节,比如我那天几点回了家,把垃圾丢在了几号垃圾桶,那些我根本不会关心的生活细节。我完全不知道能说些什么,我的下场似乎不能由我决定。

对面那个被他们称作孩子的东西一直盯着我,可怜兮兮。

“不要丢掉我。”

他这样说,可其他人都没听到,故作体面的男人也在为会谈提供他知道的信息,想要快点定我的罪。

我被关进了监狱,我至今没有搞明白为什么法庭上的所有人都认为那个块茎人是真的小孩子,他们推断他是孤儿,这让那件我实际上并没有犯下的罪行显得更加可恶。

我躺在陌生的房间里,委屈地哭了出来,同房的狱友嫌我太吵,用憎恨的眼神瞪了我,然后把头转向另一边。我什么也没有做,为什么事情会发展到这个地步?我努力地证明自己的清白了,可是没有用,是我还不够努力吗?如果我喊得足够大声,眼神再坚定一些,结果会不会有改变?

很快我就觉得困了,这是我第一次在不舒服的床上入睡得这么快。半夜我突然醒来,感觉脑袋很沉很沉,直不起身子,我弯曲着脊椎踉跄进了洗手间,趴在马桶边干呕,直到我突然意识到不对劲,抵抗困意睁开了眼睛,发现水里飘着什么。

我打开灯。那就是出现在我厕所里的东西。


他们在法庭上呈现的证据还有一段视频,是二号楼外面的监控摄像头拍摄的。从小区大门到我居住的三号楼,就必须经过二号楼外面的那条路。监控摄像头右上角显示的时间是凌晨六点过三分,我满头大汗地经过,看起来很是疲惫。不过,他们并不在意我去做了什么,他们只知道,我没有像我说的在晚上九点十分回家,我撒了谎。

律师问我是否在凌晨又出了门,询问梦游症的可能性。我否认了。

我详细叙述了那天晚上发生的事情。我在八点半左右,也就是丢了垃圾之后,从小区大门前往公园,在健身步道上跑步,那个时候人很少,只有零星的几个我不认识的遛狗的人和散步的情侣。跑了十几分钟,大概两公里多一些,我就感到上气不接下气,脑袋沉沉的,想着可能是状态不佳,便回去休息了。

对方质疑,从我家往返公园只需要十分钟,如果只跑了十几分钟,就算加上等电梯的时间,也只需要半个小时,我到家的时候应该是差一点点到九点,而不是九点过十分。这时那个凶神恶煞的男人补充,他们没有在监控录像里见到我在九点回家,接着便展示了小区各个位置的录像,上面什么人也没有。

所以,至少证据表明,我的确是在早上六点才回的家,可为什么?为什么我会有一段摸黑开锁的记忆?我记得很清楚那是晚上九点,我不可能把手表上的时间看反了吧?而且,我为什么会在公园跑步一整晚,没有人能跑接近十个小时。

除非是在逃离捕食者。

“我靠,你怎么跑进来的?”

在监狱的第二天,我被同房狱友的声音吵醒,我刚睁开眼睛,就看见他从厕所里出来,右手拎着一个孩子,一个满身泥浆、被根须缠绕、头发是绿叶的孩子。

“我上厕所看到这个小孩子睡在马桶里,好臭。”

“那不是小孩子。”

狱友没听见我讲话,或者听见了,但不觉得我的话语有任何含义。他敲门叫警卫过来把孩子带走,警卫很惊讶,又转过头来问我知不知道是怎么回事。我怔怔地盯着他,他以为那是不知道的意思,把狱友拎着的东西带走了。我还担心他们会以为这是《七号房的礼物》里的情节,怪罪我这个疯子,不过他们应该没有看过这部电影,大概也不会真的怪罪于疯子——尽管没有医学证明,但他们的确都觉得我是疯子了,因为我说了没人信的真话。

或许他们才是疯子,把正常人当成异类,不然怎么解释他们都把萝卜一样的怪物当成小孩子?不过,纠结这些真的还重要吗?

时间还早,于是我又躺下了,闭上眼睛开始思考。所以,那个长得像根茎的怪东西变成了小孩子,并且所有人都不觉得有什么不对劲。那个根茎总共出现了三次,第一次是我被怪罪丢小孩的那个晚上,第二次是我被警察审问后放回的那个晚上,第三次是昨天晚上,出现在卫生间的马桶里。

如果它们都会变成小孩子的话,第二个小孩去哪了?

劳作后休息的间隙,警卫把我带到一个房间,似乎是外面的人探望监狱里亲人的场所。我想起来我还没有把这件事情告诉家人,他们大概听说了吧?可迎接我的并不是担忧的父母,而是那个凶神恶煞的男人,他带着一个根茎怪物,坐在一张桌子前等我。

“你的儿子执意要见你。”

“我的儿子?我没有儿子。”

根茎怪物抬起头,叫我不要把它丢掉。我站在原地,盯着它,什么也说不出来,脑子一片空白,这大概就是心理学家常说的僵直反应吧。我注意到它和我装在垃圾桶里丢掉的根茎,和今早被狱友从马桶拎出来的根茎,长得都不一样。

男人什么都没说,只是用满是怒火的眼神狠狠瞪着我,在被允许的二十分钟探望时间里,他都保持着那个神情。坐在他旁边的根茎,也只是在重复地说一句话。

“不要把我丢掉。”


这天晚上,我意识到自己很久没有好好运动了,每天只能赶时间做些十几分钟的有氧,有些时候连最基本的动作都坚持不下去,感到体能明显下降了。所以,我换上运动鞋,丢掉垃圾之后,径直走向公园。

耳机里播放的是节奏非常快的摇滚乐,踩着鼓点跑的话,就会有不错的配速。除了当作节拍器使用,摇滚乐还能帮我屏蔽外界的声音,由于是在公园里,所以不必担心行驶的车辆,不会有危险。有时候,我觉得喧嚣比寂静更令人安心,我可以被好几种乐器同时演奏的声音淹没,让理智窒息,以获得内心的宁静。

“各就各位,预备,跑!”,我想象旁边有人喊出了指令。

很快,我感到有些累了,可手表上的记数显示,我才只跑了半公里不到。我不甘心,于是尽力调整呼吸,放缓脚步,希望让自己坚持更久。只不过这样就没办法踩到音乐的节奏了。

一公里了,看着数字,我感到高兴,但身体已经开始反抗。我不允许它掉链子,我明明有能力连续跑五公里。于是我让自己一直跑,不能停下,好在我并没有忘记如何呼吸。跑步时最难忍受的并不是肌肉酸痛和使不上劲儿的感觉,而是呼吸乱掉之后大脑开始慌乱、无法思考,整个身体都跟着乱掉的感觉。

一公里半,我已经逼近极限。据说跑步的人在长期坚持之后都会感受到被称作跑步者高潮的快感,我似乎还从来没有体验过。

两公里了,我实在是无法再继续了,于是慢下了脚步,停了下来,准备回家好好休息。

可是,我的脑袋突然变得很重,一阵耳鸣之后又恢复了。站起身后,我很快意识到自己不能停下,因为我感到背后有东西正在慢慢靠近我,这个时候,公园突然熄灯了。尽管公园的照明一直不好,但突然失去唯一的光源还是让人感到不安。

肾上腺素涌上我的身体,我又跑了起来,跑过公园的一座桥,跑过公共洗手间,再跑过卵石路,月光似乎突然变得明亮,我又能看见身旁的东西了,但所有东西都被映得煞白,只能看清楚轮廓。我忍不住一边跑一边扭头往后看,身后是一片漆黑,连月光也照不亮。

路边的情侣和遛狗的人这时都不见了,熟悉的公园里一个人也没有。我拼命地跑着,这时的我似乎有用不完的力气,可我没心思再关注配速和公里数了。后面有东西要来了,但我看不清那是什么。

我跑过那家我熟悉的咖啡馆,在这里转弯之后应该就是广场,广场旁边就是马路,从那边离开公园就可以回家了。就这样,我加速跑着,可是,迎接我的是一条被树木遮蔽的小路。我感到惊恐,放慢了脚步,可很快我又跑了起来,因为我不能停下,后面有东西要过来了。

道路两边的树木很密集,我从没见过城市里有种植得这样密集的树林。月光只能从头顶照下来,照不亮两边的树木,我总觉得树丛里有沙沙的响动,林里有鬼,就像我后面有东西一样。我加速奔跑,感到肺部快要撕裂,脚踩在地上像是被钉子刺破一样,可是没有办法,如果我不再跑得快一点,我的后面和两边都会有东西把我包围,会有很可怕的事情发生。

耳机里的音乐不知道什么时候停止了,我在慌乱中摸了摸耳朵,发现耳机不见了,我迅速把身上摸了个遍,什么都没有找到。我没有办法,只能继续跑。

可我要跑去哪里?我唯一知道的出口不见了。我期待着快点跑出这个突然出现的林荫道,然后观察两边有没有别的小径可以离开公园。可是,这条路没有尽头。我想起之前读过的某个怪谈作品,若是在阈限空间里打开了一扇标记着感叹号的门,就会进入一条充满警报声的闪烁着红光的走廊,身后会出现无穷的怪物,必须一直奔跑,直到近乎无尽的走廊尽头,打开另一扇门,否则就会被怪物撕碎。

我转过头,仍然是一片漆黑,什么也没有,但我肯定有东西就在后面。树丛里的沙沙声没有停止,黑暗里我仿佛看见了饥肠辘辘野兽的双眼,我四处张望,害怕有东西突然出现,在我毫无防备的情况下擒住我。我没有看清路,被石头绊倒,重重地摔在了地上,手臂在粗糙的路面上蹭出了血。我爬起来,没有时间查看伤口,死死盯着没有尽头的林荫道跑着,直到前方终于出现了弯道。

我跑过弯道,到了广场,还惊魂未定。我突然觉得自己安全了,于是停了下来,趴在地上喘气,等我抬起头的时候,天空已经开始泛白,广场上开始聚集打太极的老人。

我回到家,因为天已经开始亮了,所以楼道里没有开灯。我输入密码打开门,在门口站了好久,接着来到餐桌旁,给自己倒了一杯水。


我被关进了单独的牢房里,因为这个月我牢房的卫生间里出现了三次来路不明的小孩子。了解我罪行的警卫知道后,都觉得我是个恶心的恋童癖,想尽办法把小孩子带进来满足自己的性需求,然后当成垃圾丢掉,只不过他们怎么也没办法从我的嘴里问出我把小孩子带进监狱的方法。他们检查了各个地方的监控录像,什么都没有找到,于是在视野盲区安装了新的监控摄像头,还增设了巡查人员。

我不被允许外出活动,门口随时都有两个警卫守着,他们会经常换班。奇怪的是,自从被关到新牢房之后,我就再也没有见过根茎。自然,也就再也没有小孩子出现在我的牢房里,所以警卫们都觉得安保措施起效了,并且认定了我是技巧高超的恋童癖兼强奸犯。没有人把我当疯子了,不过这大概不是好事。

时间又过去了一两个月,某天我在房间里洗衣服的时候,看到窗户边爬上来一只根茎怪物。它用长满根须的手抓住铁栏杆,睁大眼睛盯着我看。不清楚为什么,我感觉他就是我装进垃圾袋里丢掉的那个根茎。

“你怎么过来的?你来这里做什么?”

“不要把我丢掉。”

“我没有丢掉你!我都不知道你是活的!你快走,你把我害得够惨了!”

“不要把我丢掉。”

“我说了我没有丢掉你。你到底是什么东西?为什么缠着我不放?为什么总是出现在厕所里?”

“不要把我丢掉。”

“你闭嘴吧!”

我拿起晾衣架,从铁栏杆的缝隙里伸出去,敲打根茎怪物的脑袋,想让他松手,从窗户上下去。谁知道,他的根须抓力太强,根本松不开,结果我把它的脑袋敲碎了。于是,它变成了两半,吊在我的窗户上。

要是有人路过,看到的应该是一个小孩子四分五裂的尸体吊在我的牢房窗户上吧!我不想引来麻烦,于是把被敲成一块一块的根茎从栏杆上扯下来,清理干净,然后把残骸丢进马桶里冲掉。

几分钟后,我感到一种熟悉的不适感,这种感觉已经有一两个月没有出现了。我的脑袋沉沉的,视线模糊,但这次没有耳鸣的症状,我跪倒在马桶旁,开始呕吐,我把早饭全都吐了出来,发臭的食物带着胃酸的刺激感从我的口腔通过,掉进马桶里。我突然感到有一个硬硬的东西卡在了喉咙里,我无法呼吸,只能拼命捶打胸口,用力咳嗽,就在我觉得快要窒息而晕厥过去的时候,终于把卡在喉咙里的东西吐了出来。我擦干眼泪,仔细地盯着那个和呕吐物一起飘浮在马桶里的东西。

它长长的,长着根茎一样的外表。

门外的警卫敲门问我发生了什么,我手忙脚乱地按下了冲水键,然后擦去了沾在衣服上的呕吐物,告诉他们我可能是食物中毒了,需要看医生。

晚上,我睡不着觉,想象着那个被我从马桶里冲掉的根茎会在下水道里突然苏醒,拖着满是呕吐物和粪便的身体找到我,然后所有人都会觉得是我在虐待小孩。我听到了警卫的交谈声,到了换班的时间了。几分钟后,我的牢房门被打开了,进来的不是警卫,而是根茎们,一个又一个的根茎排着队走了进来,队伍里至少有十多个根茎怪物。他们都盯着我看,齐声喊道:

“不要把我们丢掉。”

“不要把我们丢掉。”

“不要把我们丢掉。”

我大声尖叫,随后失去了意识,等我再醒来的时候,我躺在医务室。见了我惊慌失措的样子,旁边的警卫迅速把医生拉开,把我按住。我听到医生和一个男人在交谈,她说我前一天的呕吐症状并不是食物中毒,而是巨大的精神压力导致的。她说胃是情绪器官,有的人会在受到重大刺激时突然呕吐,昨晚的尖叫和昏迷症状应该也是惊吓过度导致的,需要精神科医生的干预。

按住我的警卫的眼神变了,从憎恶变成了怜悯,从看变态的眼神变成了看疯子的眼神。

不过,无论怎么变,那都是厌恶,都不是看人的眼神。他按住我的头,我的后颈贴在金属床架上,冰冷的触感传遍我的整个脑袋。我突然想起以前的人们会给精神病患者做冰锥手术,实施这种手术时,医生会在病人的颅骨两侧各钻一个小孔,然后把脑白质切断器从洞中伸入患者脑部,切断神经纤维。这种手术也叫额叶切除手术,可以让精神病人失去自主意识,变得痴呆,易于管理。

我转动眼球,盯着在视野的边缘处的医生,想要看清楚她看我的眼神,可看不到。


从警察局放出来的那个下午,我的心情很差,而且头晕和耳鸣的老毛病又犯了,于是回家之前去了公园转悠,想要散散心。顺便,我也想找找之前丢在那里的耳机。

下午的公园总是很惬意,大家都走得慢悠悠的,太阳光也很柔和,还能看到不少猫猫狗狗,有的是被拴着的宠物狗,还有不少流浪动物,似乎专门有人喂他们。说起来,我也想过加入这样的流浪动物救助组织,如果能整天都和动物待在一起,应该很幸福吧。当然,肯定也会很幸苦。要是能以这样的工作为生就好了,不过,这大概是不现实的,不会有人给这种民间组织发钱,就算有,也只是很小一部分,作为组织的资金。不过,据说不少正规的非盈利组织会给成员发工资,可以全职。

不过现在想这些也晚了,做这种事情是需要长期规划的,需要提前了解这个岗位的需求,然后以此为依照培养自己,还要想办法获得一些资质,比如项目经历或荣誉奖项之类的,当然还有工作经历。

这么一想,梦中的工作就显得没那么美好了。

人生规划真的会让人生变得很无聊呢,不过,这的确是最稳健的,至少我不知道有什么别的法子。我也没资格说这种无聊甚至不合理的想法是无用的,毕竟我自己找不到其他的办法。

我走过公园的桥,桥下的溪流很浅,而且垃圾也不少。为什么没有人去处理呢?因为叫人来打捞垃圾需要花钱,还要组织人员,总之很麻烦,与此同时,放任不管又不会造成什么问题,没有人抱怨。不过,公园的公共厕所倒是修得不错,和学校的厕所比起来要好太多了,我想,比起景观,人们更在乎能否整洁地如厕吧,而且,对这些事情有发言权的只有经济独立的成年人。

我走过卵石路,想起再走几步路就到了咖啡馆,然后转角就是广场,在这条路上应该能找到我的耳机。我在想,如果我真的找不到耳机了,那我有办法靠自己再买新的吗?除了耳机,其他东西呢?前几天我实在是受不了室友了,开始在手机上寻找附近的房源,我发现了一间 Loft,各个角落的布置都让我觉得很喜欢,如果能搬进去,就不需要忍受家里坏掉的抽屉、吵闹的邻居和烦人的室友了。我开始畅想,心情也明朗了起来,直到我看到租金,而且是商住楼,水电不便宜,便打消了念头。现在的我,可是连一千块的房租都付不起啊。

没有经济来源的状态真是糟透了,被卡在两个生活阶段中间动弹不得真是糟透了。明天警察肯定又回来找我,我需要解决的问题已经够多了,我真不知道自己还能不能撑得住。

等我回过神来,我已经走过了咖啡馆,面前是没有尽头的林荫道。

树木和昨晚一样密集,阳光从我的头顶打下来,但一点也不温暖。这个下午没有风,树枝一动也不动,被阳光照的很亮,显得有些怪异。我回过头,后面也是亮堂堂的,没有东西在追我,但我的背后也是没有尽头的林荫道。我突然意识到,现在是下午,太阳不应该在我的头顶正上方,这才是眼前的场景显得诡异的原因。

我加快脚步往前走着,阳光把树林里的样子照得很亮,每个角落都能看清。哪棵树上缠绕着藤蔓,哪块地面上铺着落叶,每棵树枝杈的形状是怎样的,我都看得一清二楚。我不知道光线为什么没有被树叶挡住。我紧张地盯着每一个我能看到的细节,生怕漏掉了危险的东西。人们说太阳底下无新事,这难道不意味着我要把所有的旧事都搞明白,才能意识到没有东西是新的吗?在我的经验积累到那种程度之前,我难道不还是要为各种需要仔细去看清的事物感到焦虑吗?

在我的视野边缘,我看到有东西动了,但是它跑得太快,我没有看清。我开始四处张望,紧绷着神经看着每一个我能看清的角落。我看到有白色的影子在树干之间跳跃,可我怎么也追不上。我视野里的东西实在是太多,太阳光又太刺眼,我开始感到眩晕,最后蹲坐在了地上。

等我再抬起头,我的眼前站着一个孩子,一个长着根茎皮肤的孩子。

“不要把我丢掉。”

直觉告诉我我应该跑,至少这个时候不应该去理睬,等到其他更重要的事情处理完之后再说。我现在应该快点回到家,在警察第二次找到我之前把我要做的事情做完。我掉头拼命地跑,直到我发现那个东西根本就没有追上来。我转过头,发现自己站在咖啡馆的门口,于是,我原路返回,漫无目的地走着,像是失去了自主意识一样,被直觉带着走,最后神不知鬼不觉地,竟然走回了警局门口。

该回家了,时间已经到了晚上。


他们在下水道里发现了尸块,我真傻,怎么会想不到这一点呢?根茎的汁液在他们眼里是血淋淋的证据。不幸中的万幸是,并没有另一个根茎怪物从下水道里爬出来,它大概是被废水腐蚀,没能活过来吧。

我并不是首要嫌疑犯,因为我在他们眼里是恋童癖强奸犯,最近还被诊断出患有精神疾病。我既是变态又是疯子,不过并不是杀人犯。

现在我的生活丰富了许多,因为每周都要接受心理咨询,每天都有精神科医生过来询问我的状况,有护士喂我吃药。每天吃的药都不一样,有时会增加某种药片的数量,有时会把某种药换成另一种药,这都取决于服药后我跟医生说了什么。我再也没有梦到根茎怪物了,医生说这是药物起效的证明。后来,护士给我的药数量越来越多,似乎对待犯人,他们并不会非常克制地给药。因为服用精神科药物,我渐渐变胖了,运动的欲望也消失了,我的身体开始变得肥肿,脂肪在我的脸和腰腹堆积,不过我已经不在意了。

每天吃过药之后,我看到的世界既没有光,也没有影,太阳和月亮都不存在,就像是东野圭吾的《白日行》。这是令人快乐的感觉。某次治疗时,医生让我在一个装满沙的盒子里摆出心里想的东西,我把房屋摆成一层一层的回字形,中心是一座高塔,小人们就摆在房屋中间的间隙里,至于城市外围,我在那里种满了密密麻麻的树木。完成之后,医生露出了惊讶的神情,可我很高兴,因为一切都十分有序。

后来,我能摆弄那些沙子和塑料玩具的时间变少了,又过了一些日子,我就再也没有见到过那位医生了。新来的医生长得很高大,看起来值得信任,他让我从房间的一边沿着直线走到另一边,我照做并得到了奖励。回到房间后,我打开奖励盒子,发现里面是一块糖果,我吃下后,甜味和麻涩感混合着粉末充满我的口腔,那天下午我什么也没有想,别无所求的感觉真是棒极了。

时间久这样过去了一两年,我已经习惯了监狱生活。由于不必再躲避任何东西,也不必再看清任何东西,我的生活十分平静,一切都在意料之中,几乎不会出岔子。

这天中午,我在房间里读医生拿给我的书,按照要求读完三十页过后,本该在此时出现的护士却并没有出现。以往,她会给我送来药片和水,确保我按时服药。我盯着房门,他一直都没有打开,直到太阳光斜着照进了我的房间,在门上留下一条条的影子。

我站起身走到门前,想知道护士去哪了。我转动门把手,发现门没有锁,我打开门,看到有东西站在我面前。

它浑身发黑,而且表面凹凸不平,和铺满白色瓷砖的房间对比起来,显得格外扎眼。我用手碰了碰它,被我触碰过的那块黑色表皮掉了下来,露出褐黄色的内里,就像巧克力外壳一样脆脆的。我的好奇心突然回来了,于是用双手把它的黑色外壳全部剥了下来,黑色的东西粘了一些在我的手上,哗啦啦地掉了一地。我闻了闻手上的味道,很臭。等我把整个东西都剥开的时候,我困惑地盯着他看了好久,这好像是个小孩子,但又有点不对劲。它一直死死盯着我看。

“不要把我丢掉。”——这是我下意识以为它会说的话,可它张开嘴巴,发出的是低沉的嘶鸣,不是任何有意义的话语。接着,它伸出两只手抱住我的身体,我甩不开,他的根须把我缠的很紧,接着它开始踩我的脚,粗暴地从我的腿我上爬,我动弹不得。很快它就爬到了和我一样高的位置,踩着我满是脂肪的胸部,用不知道从哪里伸过来的藤蔓把我的嘴掰开,一头钻进了我的口腔里。

我没办法反抗,身体被根须缠得死死地,只能眼睁睁地看着面前的东西慢慢钻进我的身体里。我感受到牙齿在它粗糙的表皮上摩擦,汁水开始流淌,在我的舌头上留下酸甜和铁锈的味道,它粗暴的动作蹭得我的舌头几乎要失去知觉。很快,我感到有东西进入我的食道,胸腔像要裂开一样得疼,膨胀的感觉一路往下到达胃部,快要胀破肚皮。最后,我的嘴里只留下了动来动去的根须,瘙痒着我的牙龈。我变得前所未有地臃肿,像个长期得不到有效治疗的暴食症患者。

我跪倒在地上,用手勉强撑住自己的身体,那个东西开始压迫我的膀胱,我不受控制地尿了出来,黄色的液体开始向四处扩散开来。两年来头一次,我感到羞耻,我哭了,更多的液体从我的身体里涌出来。我发出无法辨认的话语,连我自己都不知道我在说些什么。黑色的碎屑溶解在了尿液里,变成了深褐色的黏稠物,向更远的地方流去。

我的羞耻心到达了顶点,我想要在任何人看见我这个样子之前先结束自己的生命。我拼命站了起来,用额头狠狠撞击金属栏杆,冰冷的触感传遍我的全身。突然,就像有冰锥刺进我的脑袋里,我停止了思考。我双脚站在地上,额头紧贴着栏杆,像犯人被逮捕时一样爬在走廊上。我大口喘气,低头看着被浸湿的身体,尿流干了,身体要被撑破的感觉也消失了。我站了起来,感到不安和焦躁,不知道要怎么收拾这个肮脏的局面。可当我回过头,那些到处流淌的液体都不见了。这个时候太阳下了山,月光照了进来,我看着那一轮满月,身体似乎开始变得轻松。

第二天,警卫说我服刑期已满,可以出去了。我看着我的档案资料页,那里写的不是绑架犯、强奸犯或者猥亵儿童之类的东西,而是破坏计算机信息系统罪和侵犯公民个人信息罪,因为我黑掉了小区的监控系统。办手续时一位办公室职员感到困惑,问我为什么会因为这点罪被判两年多。我说我也不知道。

带着鸭鸭和狗狗逃离咕噜咕噜

2026-04-01 23:01:05

啊!搜索引擎,万维网的门户,像交通网络一样不可缺少的基础设施,除了那些已经不知道如何使用浏览器、被移动端应用和算法操控的新人类,几乎所有人都离不开它。如此重要的设施,想必会像水源一样被好好保护,受到严格管控,好好地服务于需要它的人吧!

等等,你用那种眼神看着我是什么意思?


For lunatics who are paranoid about web technologies.

为了人类

世界上第一个搜索引擎出现在万维网诞生之前,甚至最初的类似于搜索系统的想法都和互联网没有关系。1945 年,一个名叫万尼瓦尔·布什的工程师发表了一篇名为《As We May Think》1的文章。这篇文章的标题和副标题都很有意思,As We May Think 的意思是「正如我们可能会认为的」,但另一个含义是「正如我们会思考一样」,这篇文章的副标题是:顶尖的美国科学家提出人造机器会开始思考的未来设想。标题的意思是「正如我们会思考一样,人造机器也可能会思考」。

这篇文章的编者注是这样写的:

世界上有水碓等能把体力劳动做得更快更好的技术。很快,也会有把脑力劳动做得更快更好的技术2

所以我说嘛,人工智能不是什么新鲜事。让我再次提醒读者,这篇文章是在 1945 年写就的,而世界上第一台通用计算机 ENIAC 是在 1946 向世人公布的,那个占地近三十平方米的庞然巨物离我们熟悉的电脑形态还很远很远。顺带一提,ENIAC 问世的那天是个情人节。

这篇极具预见性的文章表达了对技术进步的担忧,那个时候人们还笼罩在二战的阴影里,布什认为科学家们需要有一些和平的愿景,他在这篇文章里描述了一种名为 memex 的机器(或者用他的话说,「家具」)的概念,这个词是 memory index(记忆索引)的意思,请注意那个时候的 memory 还和「内存」没有关系。

布什构想,这台书桌一样的机器利用光学投影和微缩摄影技术,将人类的集体意识(知识和记忆)存储并展示出来,并且可以很方便地查阅。

大英百科全书可能被缩小到火柴盒的体积。藏书百万的图书馆可能被压缩进书桌的一端3

这么多的信息被压到一起,如果没有完善、稳定且能处理庞大问题的搜索系统,便毫无用处。布什接着提出了有关 memex 的归档系统的设想。

当任何类型的数据被放入存储中,它们会按照字母表顺序或数字顺序归档,信息通过一个接一个的子类被查找(如果存在的话)。它只能存在于一个地方,除非使用了副本4

对不熟悉计算机存储的人来说这可能更像生物学分类,但这就是树形结构。虽然我的数据结构学得一般,但我知道 B 树算法就被用在文件系统里。如果没有用到硬链接和软链接,FAT 和 NFTS 等文件系统的原理就和布什描述的十分相似。

从 memex 的愿景来看,它的确很接近如今的搜索引擎:全人类的信息被索引,放在同一个地方,用很小的设备就能查阅。不过很可惜,memex 只是个假设,布什描述的机械结构应该造价很高,在他提出这个想法的不久后计算机也问世了。

咦?说好的会思考的机器呢?原来那个时候的新闻报纸也已经学会用标题哗众取宠造势了,把信息检索称作思考,和把统计规律也称作思考,都是把黑说成白的广告修辞罢了。 关于大语言模型究竟会不会思考,可以阅读《 思考是碳基生物的特权吗? 》。这篇文章的主题是搜索引擎,就不展开了。

混沌初开的互联网

带着「索引全人类知识」的这个愿景,我们来看看 memex 的后来者,也就是现代搜索引擎,是如何出现的吧。

WHOIS 和 KIS(Knowbot Information Service)被用于在互联网上搜索用户,前者至今仍在被用于域名信息查询,尽管正在逐步被 RDAP 等新技术代替。如果说搜索用户算不上现代意义上搜索引擎的功能,那么世界上被认可的第一个搜索引擎的名字叫作 Archie。

Archie(「档案」一词删去字母 v 得到的词)是第一个用来搜索内容的搜索引擎,不过它使用的是 FTP 协议,也就是文件传输协议。这个软件会用 Telnet 搜索公开的匿名 FTP 服务器。听起来很复古是吗?Archie 对这些 FTP 服务器进行索引的方式是每隔大约一个月请求一次文件列表,下载到本地,处理搜索请求时使用 grep 命令查找本地文件。尽管 grep 可以做到全文搜索,但 Archie 下载的只是文件标题,所以实际上只能搜索标题。

如今人们觉得搜索文件和搜索网页完全不同,但实际上网页就叫作「万维网文档」,是万维网服务器(或者说 Web 服务器)向用户提供的 HTML 格式的文档,所以把 Archie 称作世界上第一个搜索引擎完全不为过。

能够搜索文档内容的搜索引擎随着 Gopher5 协议的诞生出现了。不,和 Go 语言没有关系。 Gopher 是服务于互联网的,不再是 FTP 服务器。需要说明的是,Gopher 是一种协议而非具体的软件实现,而且,它和 HTTP(超文本传输协议)是同级的,也就是说它不服务于万维网。它还有 IANA 指定的 TCP 端口号 70

图源: Wikimedia

搜索时,Gopher 以「制表符分割文本行」的格式返回索引,就像这样:

1Floodgap Home	/home	gopher.floodgap.com	70

第一个字符是文件类型标识符,第二个是显示名称,第三个看起来很像路径名,实际上叫作选择器(selector),和如今的 URI 是类似的。后面的两个值分别是主机名和端口号。

根据文件类型标识符的种类来看,Gopher 支持搜索多种类型的文档:0 文本文件,1 Gopher 子目录,9 二进制文件,I 图片文件,d PDF 和 .doc 文件,s 音频文件(尤其是 .wav 格式),h HTML 文件和 x XML 文件等。

通过索引得到选择器之后,就可以通过选择器拿到想要的文件了。

那个时候用得最多的是基于文本的终端而非浏览器。所以,非常常见的做法是用 curlnc(Netcat)这样的命令行工具直接下载从某个 Gopher 服务器上检索到的文件。

比如这样:

echo jacks/jack.exe | nc gopher.example.org 70 > jack.exe

上述命令的作用是:将 jacks/jack.exe 这个字符串输入 Netcat,让它用这个标识符获取 gopher.exmaple.org 上对应的文件,然后把服务器返回的内容写入本地的 jack.exe 文件。

“这简直太方便优雅了,这下谁还用浏览器下载文件?”,某个终端狂热爱好者此时已经忘记 wget 的存在——GNU 开发的 wget 意思是 Web Get,可见万维网已经完全实现了 Gopher 的功能,使用统一的 URL 作为标识符也比 Gopher 相对于服务器的选择器方便不少。

Gopher 本身不是搜索引擎而是搜索协议,它催生了名为 Veronica 和 Jughead 的搜索引擎,这两个搜索引擎会搜索一个或多个 Gopher 服务器来查找内容,形式上已经很接近如今的搜索引擎了。可惜 Gopher 只兴盛了不到 10 年的时间,它和万维网在同时期发展,到了 90 年代末的时候,它就被万维网给取代了。

就像 Telnet 一样,如今还有一些爱好者在维护 Gopher 服务器,或许你也可以给自己的网站做一个 Gopher 目录供人搜索呢?

从古法手挑到网络爬虫再到排名算法

万维网的信息那么杂乱,而且已经有前人指路,维护搜索引擎并不难,想必万维网的使用者在一开始就会做出类似的东西吧!

没有。一直到 1993 年夏天,他们都在古法手选,也就是维护目录(Catalog)网站,按照主题把网页链接放在一起。后来,一个叫作 W3Catalog 的搜索引擎从这些高质量的目录网站上镜像内容,然后统一格式,整理成独立的条目以供搜索。W3Catalog 没有用户界面,是用 Perl 写的,在 1996 年就关停了。不过,w3catalog.com 这个域名被收购,现在仍能访问,人工收集和整理了一些互联网上的高质量内容,最近一次更新是 2025 年 9 月。

在 1993 年六月,MIT 里一个叫作 Matthew Gray 的人发明了世界上第一个网络爬虫(大概是第一个),编程语言也是 Perl。它的作用是「测量万维网的大小」,一直到 1995 年关闭,它都在记录万维网的增长。它会对万维网进行索引,索引的名字叫作 Wandex(你们怎么都喜欢用 Index 造词?)。不过,尽管有潜力,这个名为万维网漫游者(The World Wide Web Wanderer)的网络爬虫并没有成为第一个万维网搜索引擎,它只是在测量而已。

此后还出现了 Aliweb(和阿里巴巴没有关系)、JumpStation 和 WebCrawler 等大大小小的万维网搜索引擎及爬虫,考古虽然很好玩,但一一列举就显得有些冗长了。我们跳跃到 1995 年,那时雅虎给自家的第一个产品 Yahoo! Directory(雅虎目录)增加了搜索功能,即 Yahoo! Search,成为了在万维网上搜索内容的最流行的方式之一。后来也出现了许多类似的产品,它们都是基于目录的,除了搜索,还可以直接查看目录,不仅仅只有搜索框。

好玩的是,李彦宏(百度的创始人和 CEO)很快加入了战局,甚至比 Google 还早。他在 1996 年开发了一个名叫 RankDex 的页面排名算法,并提交了美国专利,后来他用这个算法成立了百度,于 2000 年在中国启动。

后来就是 Google 的故事了,它从名为 goto.com 的小搜索引擎变成了商业化非常成功的大公司,大约在 2000 年占据主导地位。Google 开发了名为 PageRank 的算法,还在相关的论文里引用了李彦宏的 RankDex 算法。某种程度上,是百度影响了 Google,而不是反过来。这种算法的基本思想是,一个网页的反向链接越多,质量就越高,排名就越靠前,那些有更多人引用的网页会显示在搜索结果更靠前的位置。

在同一时期,Microsoft 做了一些令人啼笑皆非的操作(看来微软在任何时期都很好笑),我在这里直接贴上 Wikipedia 原文,读者请自行欣赏:

微软先是在 1998 年的秋天发布了 MSN Search,用的是 Inktomi 的搜索结果。在 1991 年初,这个网站开始展示来自 Looksmart 的列表,和来自 Inktomi 的结果混合在一起。在 1999 年的很短一段时间内,MSN Search 又使用了来自 AltaVista 的结果做代替。在 2004 年,微软开始过渡到自己的技术,由他们自己的网络爬虫(叫作 msnbot)驱动6

这么说来,Microsoft 的 MSN Search 大概是第一个企业开发的元搜索引擎。

这里要讲一下元搜索引擎(meta search engine)的概念。一般的搜索引擎会建立自己的索引,用户发送搜索请求时,搜索引擎通过关键词在这个索引里找到关联条目。元搜索引擎不维护自己的基础设施,而是向其他搜索引擎发送搜索请求,并把搜索结果展示在自己的网页上,往往会聚合多个搜索引擎的结果。

在 2009 年,Microsoft 将 MSN Search 重新包装为 Bing,也就有了如今的必应搜索。

这差不多就是近来搜索引擎的发展历史了,不过我刻意忽略了一小部分留到后文讨论。总结一下,自万维网问世并得到广泛应用之后,人们先是从维护手选的目录网站,再到搜索目录,然后发明了网络爬虫自动索引网站,最后发明了页面排行算法,这才造就了如今搜索引擎技术的样子。

咕噜咕噜的统治

前文我一直表现得十分中立(好吧我确实嘲笑了微软),接下来的内容就会更加观点鲜明了。

表面上看起来,许多企业都提供搜索引擎服务,他们看起来好像差不多,都只是在搜索网页而已。尽管不少人声称谷歌得到的结果要比百度好得多(这或许是事实),但我们不觉得搜索引擎之间有什么本质区别,毕竟,它们看起来都是一个搜索框,输入一些文字之后会弹出相关的关键词,按下按钮或者回车之后就会展示搜索结果,仅此而已。

但只要仔细想想,就会发现搜索引擎是非常重要的基础设施。对许多人而言,搜索历史的私密性不亚于日记内容,而这些数据都会流经搜索引擎的服务器。这些企业会怎么对待这些数据?直接把他们删掉吗?当然不可能。尽管不是所有人都会注册和登录 Google 账号,搜索引擎(以及任何网络服务)为了牟取利益,都会跟踪用户,以此投放更精准的广告。

这是怎么做到的?很简单,如果你使用的设备、浏览器、IP 地址、是否使用暗色模式、安装了什么浏览器拓展,这些信息都基本一致,那网站(以及它们插入的广告)就会把你当作同一个人,并对你的浏览路径和行为进行分析。由于不同的网站会插入同一个提供商的广告(比如 Google Adsense),所以追踪器可以跨站追踪你,进一步挖掘你的喜好。就算不搜索任何东西,仅仅是浏览,都会被收集很多数据,很难想象搜索引擎能掌握的信息有多少了,更可怕的是,无论是广告还是搜索记录,都掌握在一个服务商手里——Google。可以说,如果你经常访问各种插入 Google 广告的网站并且使用 Google 搜索,Google 对你的了解可能已经远超亲朋好友了。顺带一提,这些不怀好意的企业还会相互交易这些数据。

广告最可恶的并非对上网体验的负面影响,而是对隐私的极大侵犯。

如果你想说:“我没干什么坏事,只是在网上看点东西而已,为什么在乎隐私?”,可以阅读我在 第 15 期周刊 分享过的 这篇文章 ,作者通过应用内的广告,分析网络流量和数据包,成功推导出了自己所处的地理位置。因为被迫观看个性化广告,导致所有人都有办法了解你的地理位置,这难道不是很可怕吗?不要总是想象坏事不会发生在你身上。

根据 StatCounter7 提供的数据,截止 2026 年二月,Google 占市场份额的 90.01%,Bing 占据 4.98%,第一个流行的万维网搜索引擎 Yahoo! 仅占 1.39%。这个数据无论怎么看都很恐怖。难以想象 Google 这家企业掌握了多少用户数据,而现在还有一群人想尽办法把自己更私密的内容交给他们善解人意的大语言模型。

追踪器的问题或许可以通过拦截器(比如 uBlock Origin )或直接屏蔽广告域名的 DNS 服务器(比如 AdGuard DNS )解决大部分,但在勉强保证隐私的情况下,你也要面对一系列问题。

首先,广告不会消失。即便追踪你变得更困难了,但给搜索引擎广告费的服务商的内容总是会被展示在靠前的位置,并且它们不总是会被显眼地标记为「广告」。广告依旧会影响你的搜索体验,甚至潜移默化地操作你对某些品牌和事物的看法。我跟不少人对话的时候,发现他们总是会毫无根据地发表一些观点,被要求解释的时候却说不出来,那些观点几乎都是从网上看来的,而现在的视频里几乎不会缺席广告带货,广告商试图灌输给你的观点总会找到进入你大脑的方式。搜索结果里的广告也一样。会对你实施观点操控的不只是渣男渣女。

其次,如今的搜索引擎会在毫无预警的情况下展示 AI 废料。在谷歌上搜索几乎任何一个概念,迎接你的不是维基百科或者别的什么可靠来源,而是大语言模型的一段总结。这为什么不好呢?常识是:或许可以把某些工作交给语言模型,但绝对不应该把它当作可靠的事实来源。如果关注事实真相,就不该使用这种把可靠性没有保证的内容放在第一位的搜索引擎。更何况,大语言模型很贵,如果人们默许每次搜索都会调用大语言模型执行大量计算,就为了给出简练的总结,那么世界上又会多好几座数据中心,内存和硬盘的价格也会只增不减,计算机会消耗更多的电力,会有更多的天然气被燃烧,会有更多的水资源被用于给服务器降温。

我没有在危言耸听,这些是已经在发生的事实。上个月《卫报》发表了一篇报道,题为《 受 AI 需求驱动,美国引领全球燃气发电量创纪录激增,令气候付出沉重代价 》。关于水资源,不要跟我说什么服务器冷却水是封闭的循环系统,就算一个数据中心不会持续消耗水资源——这难道不是用水需求吗?难道没有成吨的水进入数据中心而不是进入人们的家里吗?难道这些水会被吐出来吗?难道数据中心建成之后用的水会变少吗?

关于大语言模型引发的 AI 热潮有什么问题,我可以讲一年,再写下去就太长了,我只希望 AI 泡沫破裂 能早点来。我还想提醒那些抱有「我也不喜欢 AI,但 AI 总结我不看就好了」想法的读者,你的选择在经济学意义上具有价值,你的选择能决定市场需求,少一个人使用谷歌,他们就少一份钱赚;相反,无论你因为什么原因继续使用他们的服务,他们赚的钱都只会变多而不会变少。

人们经常开玩笑嘲讽百度和谷歌,说搜索结果的前几条永远是广告,却从没想过自己可以换一个搜索引擎。

DuckDuckGo 不是答案

说回隐私,如今提到「注重隐私的搜索引擎」,不少人都会说 DuckDuckGo。我也使用了这个搜索引擎好几年,它依然是我在大部分时候的备选搜索引擎。不过当我开始对隐私这件事情较真起来时,我把怀疑的目光第一个投向了 DuckDuckGo:你说你完全不收集用户数据,尊重隐私,那你怎么赚钱呢?

DuckDuckGo:我们通过隐私广告和订阅服务盈利。8

嗯?隐私广告?Well, that just…

“Well, that just sounds like slavery with extra steps.”

所以这个「Private ads」到底是什么呢?说到底不还是广告吗?

据 DuckDuckGo 自己的说法,他们的广告不跟踪用户,也就没有我们前面讨论的一大堆麻烦的隐私问题,所以被称作隐私广告。广告显示在最前面,但会在页面标题之后标注 AD,而且 DuckDuckGo 鼓励用户举报广告,一旦发现与搜索关键词无关的广告或者其他低质量广告,就可以向他们报告问题。

听起来还不错,如果看点广告意味着能够免费用尊重隐私的搜索引擎,那权衡利弊之后,似乎也不是不能使用。

但紧接着我发现了一些可疑的东西:

访问微软广告开始购买 DuckDuckGo 的搜索广告9

嗯?微软?

对哦,DuckDuckGo 实际上并没有维护独立的索引,他使用的是 Bing 搜索的结果。这意味着什么呢?作为强有力的搜索引擎新秀和竞争者,微软肯定会做点什么的吧。

果不其然,DuckDuckGo 和微软的确有关系。在 2022 年五月, Bleeping Computer 发现 DuckDuckGo 推出的隐私浏览器会正常阻拦 Google 和 Facebook 的跟踪器,但不会阻拦微软的追踪器。CEO 对此的回应是:

不幸的是,我们的微软搜索同步协议阻止我们对微软所有的设施做更多的事情。不过,我们正在持续推进,期待能够很快做更多10

从 2022 年 8 月开始,DuckDuckGo 的浏览器开始屏蔽微软的追踪器了,争议似乎结束了,然而,无法忽略的事实是:他们和微软的确有协议。许多看起来独立的搜索引擎都依赖微软的 Bing 搜索,微软通过他们展示广告,他们获得广告分成,这种合作当然有协议。我们不知道这个协议的内容,不知道微软对 DuckDuckGo 限制了多少,他们之间的合作是商业的,那么微软必定能在其他方面影响 DuckDuckGo。比如,DuckDuckGo 浏览器如今仍然通过 MSN(微软的门户网站)打开网络文章。11

就算在这方面没什么好担心的,DuckDuckGo 的搜索结果在很大程度上依赖于微软的 Bing 这一事实就足以造成很多问题。前不久,Bing 封锁了 Neocities12,导致 DuckDuckGo 也受到牵连。 Neocities 是很多复古个人网站被托管的地方,整体上是一个社交网络,有很浓厚的社区文化,并且网站托管完全免费,依靠支持者的有偿捐赠维持运行。尽管封锁在不久后解除了,但这难道不值得警醒吗?

除了可疑的商业牵连,DuckDuckGo 之前陷入过一些争议。在 2022 年,为了回应俄乌战争,Weinberg 发推特表示他们会降级(down-rank)和俄罗斯的错误信息有关的站点。13原推特链接目前已经无法访问。

At DuckDuckGo, we’ve been rolling out search updates that down-rank sites associated with Russian disinformation.

我不看好这种做法,我认为明智之举是保持沉默,至少不要对搜索引擎做出任何修改。作为搜索引擎,我更希望你在面对政治事件时客观中立地呈现所有来源的信息。一些开源项目在网站和 README 中添加有关的信息还能理解,但 DuckDuckGo 是搜索引擎。还记得 memex 的愿景吗?全人类知识的索引?这样的东西不应该是尽可能减少偏见的吗?从另一个角度来理解,DuckDuckGo 在政治话题上表态也可能是为了赢得美国民众的支持,因此来获得商业上的收益。

毕竟,DuckDuckGo 是一家要盈利的商业公司,位于美国。在 2008 年创立的一开始,DuckDuckGo 并不是保障隐私的搜索引擎,它是在 2010 年才开始以「隐私」为卖点和其他搜索引擎做出差异化的。14

别忘了,曾经的 FireFox 也是注重隐私的产品,可现在呢?

好的,我知道我说了不少有关 DuckDuckGo 的坏话,不过很大程度上这是因为 DuckDuckGo 的好话已经被说得太多了,我不必复述。整体而言,它的确是不错的搜索引擎,非常重视隐私,并且所有人都可以免费使用。对于那些想要远离谷歌和微软,但又没准备好投入太多,只想要简单省心、入门级的隐私搜索引擎的用户来说,DuckDuckGo 其实是很好的默认选项。不过,仍然需要警醒,因为免费的才是最贵的。

成为客户,而不是产品

我们知道 Google 很坏,Bing 很坏,DuckDuckGo 也有些问题,但…… 我们能做什么呢?我们并不能驱使他们做出改变,毕竟,我们是免费使用的用户。尽管我们的注意力对它们来说是卖给广告投放者的产品,但整体而言,少数用户的离开并不会对他们的业务造成很大冲击。

这也是使用免费产品的代价之一:我们似乎无法施展消费者的基本权利。

那有没有这样一个搜索引擎,他不投放广告,不把用户的注意力当作产品,而是真的把用户当作用户,直接从用户那里收取使用费?这样一来,如果这个搜索引擎有什么令人不满的地方,我们可以直接向其施压:你要是不把这个问题给我修好,我下个月就不续费了!

并且,由于所有用户都是付费用户,他们对产品质量也更加吹毛求疵,不会像使用免费产品那样产生「都免费了,有点小瑕疵就忍了吧」的心态,我们很容易告知他们产品的缺陷,并说服他们这很重要。如此一来,如果这个搜索引擎背后的公司不采取行动,就会流失相当数量的客户,营收也会受到影响。

这样的搜索引擎存在吗?真的有人会付费搜索吗?答案是肯定的。

Kagi 是非常观点鲜明的付费搜索引擎,他们最特立独行的一点就是:你必须给钱才能用这个搜索引擎!注册 Kagi 之后,用户会获得 100 次免费限额,搜索 100 次之后就需要续费。最低额度的订阅方案是每个月 5 美元,每月可以搜索 300 次;再者是 10 美元的方案,搜索次数无限额;他们还有 25 每月的方案,但主要的提升点只是增加了更好的 AI 模型,我个人不觉得有什么用处。

截止我撰写这篇文章的时候,根据 Kagi 官方的 统计数据 ,他们一共有 67875 个付费用户15。六万多的用户的确不多,不过增速还不错,最近半个月增加了一千多个新用户。

Kagi 是很新的搜索引擎,在 2018 年的时候才成立。他们的产品理念是:你给钱,我们提供好的服务,就这么简单。

尽管 Kagi 也是商业软件,仅仅是部分开源,但从盈利模式上来看,Kagi 与用户的关系要健康得多。他不从广告商那里赚钱,而是直接从用户那里赚钱,服务好用户就是他们的最高目的。

根据 Kagi 的文档16,他们有自己的万维网索引,名为 Teclis 和 TinyGem,他们的搜索结果也包括来自其他搜索提供商的内容,这些 API 请求是在他们的服务器上进行的,经过匿名化处理,不会跟踪用户。他们并没有表示自己有没有使用 Bing 或者 Google 的搜索结果,而是声称使用了 Marginalia17 等特殊搜索引擎的 API,还会直接从 Apple、Wikipedia、Yelp 和 TripAdvisor 等垂直信息源直接获取内容。说实在的,我很希望他们能给出详细的列表,让用户了解到他们到底使用了哪些 API。

Kagi 的优点是他非常关注来自小互联网的高质量内容,也就是那些不是以盈利为目的撰写的博客文章。他们维护的 smallweb 列表中的小型个人网站会显示在搜索靠前的位置,并且还有 Small Web 模式,可以只搜索来自这些网站的内容。这个列表是开源的,允许提交自己的网站,不过目前只接受英文内容,而且如果要提交自己的网站,还要同时提交三个其他人的网站。Kagi 还会降级(down-rank)那些使用了大量跟踪器和插入了很多广告的网页,如果某个搜索结果里有太多的跟踪器,Kagi 会显示橙色的感叹号提醒用户。此外,如果一个网页有付费墙(即必须付钱才能继续阅读),Kagi 也会显示显眼的标记提醒用户。

降级为了盈利而撰写的充满广告的内容,提升小型网站的内容,这种行为和 DuckDuckGo 对政治事件的反应有何区别?无疑,这造就了偏见,但目的是呈现质量更好的内容,而不是呈现政治上某一方认同的内容。

此外,Kagi 还提供个性化设置,用户可以手动屏蔽、降级、提升或置顶来自某些网站的内容,比如我就把来自 Wikipedia 的搜索置顶了,把百度和腾讯的网域全部屏蔽了。他们还会在搜索结果里插入相关的文章列表,名为「Interesting Finds」。整体而言,Kagi 的搜索质量很不错,并且有很大的自定义空间。

接下来要讨论两个关键问题,隐私和人工智能。

Kagi 声称自己尊重隐私,毕竟没有广告,但隐私和匿名之间有本质区别。尊重隐私的服务做的是收集尽可能少的用户数据,或者对数据做匿名化处理,以及不使用这些数据分析用户并向他们投放广告,这点 Kagi 的确是做到了。然而,作为必须要登录才能使用的搜索引擎,难免在使用过程中产生不匿名的、与用户身份相关联的数据。对于搜索,为了最大程度地保护隐私,我当然希望做到匿名,否则仅从我的搜索记录就能推断出很多关于我的信息。

对此,Kagi 的做法是推出了 Privacy Pass ,一种无需登录、无需与一个账号关联就可以证明自己是付费用户的手段,可以通过浏览器拓展实现。原理似乎是通过用户的会话链接(包含用户登录的相关凭证)提前生成一些 Token,搜索时使用这个 Token 认证而不使用登录凭证验证。有了 Privacy Pass,用户就可以在 Tor 浏览器和无痕模式下使用 Kagi 搜索。这的确在技术层面上实现了匿名,但仍然有一个问题:Kagi 用户只有六万,知道搜索请求来自 Kagi 用户,难道不就是把范围缩到很小了吗?当然,这也是他们无法改变的,Kagi 已经在力所能及的范围里做得很好了。

我很喜欢 Kagi 的一点是「克制」,即便禁用了 JavaScript,搜索也能顺利进行,大部分功能的使用不会受阻。这是对关注隐私和匿名的用户很大的尊重了。这种「克制」也体现在他们对于 AI 的态度上。

Kagi 的确使用大语言模型,主要用在搜索时快速生成答案(被称作 Quick Answer),和专门的 Kagi Assistant 应用。Quick Answer 很克制,只有搜索关键词以 ? 结尾时才会启动 Quick Answer,至少我没有在搜索时写问号的习惯,如果真的想要快速了解,才会按需写上问号(这种需求非常少),或者按下和搜索结果一起显示的 Quick Answer 按钮。

至于 Kagi Assistant,它调用的是 OpenAI、Moonshot AI、DeepSeek、Anthropic 和 Google 的模型,还有 Quick 助理,没有写明使用了什么模型。我试过 Assistant,他给出的答案非常简练,不会说「You’re absolutely right!」或者试图当你的心理治疗师。我使用搜索助理的主要场景是为某个需求找到合适的现有软件和解决方案,Assistant 很合适,但也不是刚需。

诚然,我更希望 Kagi 没有 AI 功能,但作为商业公司,他总要满足用户的要求,而总有人想要 AI,而这种程度的克制在我眼里已经很好了。我希望他们可以推出一个完全没有 AI 的订阅方案,这样我就可以不用为我不想要的功能付费了。

目前为止,我对 Kagi 的整体印象还不错,并且愿意付费,它真的让我的上网体验清静了不少,但我还在观望,随时准备退出,毕竟订阅费再加两美元就足够 自由软件基金会 会员的会费了,属实不便宜。

目前看来,Kagi 对大多数愿意付费的人来说都是非常好的选择,对非常在意匿名和隐私,并且更偏好自由软件的用户,可能需要再斟酌斟酌。

顺带一提,Brave Search 也提供付费搜索,付费后可以清除广告。

欧亚大陆的另一边

Google 和 Microsoft 都是美国公司,DuckDuckGo 和 Kagi 也是美国公司,难道就没有欧洲的搜索引擎了吗?毕竟 GDPR 法案可是对用户隐私至高无上的尊重,在欧洲运营的公司和组织也更不容易受到美国政治的影响。

首先是 Qwant,这是一家位于法国的公司,他们表示完全不收集和售卖用户数据,尊重隐私…… 好,好,打住,这些话我听得太多了。我的问题是:你怎么赚钱呢?你的钱从哪儿来?我对一切不是非营利组织却没有付费选项的免费产品都抱有强烈的怀疑。

答案显而易见:广告。

根据 Qwant 的 广告服务页面 ,他们不追踪用户,所有人看到的都是一样的广告…… 懂了,法国版 DuckDuckGo。 不过他们不依赖 Bing,根据 他们的博客文章 ,Qwant 有自己的索引,这是优势。

我是默认禁用 JavaScript 的,不运行我不信任、不自由的代码,这在我使用 DuckDuckGo 和 Kagi 时都没有任何问题(虽然我会选择信任 Kagi,把 JS 打开),毕竟搜索只是提交表单,完全不需要 JavaScript 参与。然而 Google 不行,Qwant 也不行。当我把 JavaScript 打开决定细细研究这个搜索引擎时,由于启用了 JS,右下角弹出来一个浮窗:「下载我们的浏览器拓展!」

再见!

既然商业公司都一个样,那有没有不以赚钱为目的运行的搜索引擎?

Ecosia 是位于德国柏林的非盈利组织,他们提供搜索服务,还有自己的搜索引擎以及…… AI 聊天机器人。Ecosia 的名字由 Eco(生态)和 Utopia(乌托邦)缩合而成,这是一家注重生态保护的非盈利组织。好的,但你真的注重环保的话为什么会提供 AI 聊天机器人?

我在阅读 Ecosia 的 Wikipedia 页面时发现了许多奇怪的地方:

这家公司使用可再生能源驱动服务器,并把利润用在植树项目上,目标是吸收比他们排放的更多的二氧化碳18

Ecosia 把 80% 的利润用在植树上19

你不是非盈利(non-profit)组织吗?所谓的利润(profit)是什么?

广告,答案永远都是广告。

实际上 Ecosia 是元搜索引擎,作为把大部分收益都花在环保项目上的组织,他们没有资源维护自己的万维网索引,所以他们使用的是 Bing 的搜索结果,并且和 DuckDuckGo 一样,通过微软的广告来实现营收。为什么有这么多搜索引擎都是 Bing 的皮肤?

所以这的确是一家非盈利组织,但它依然通过与商业公司类似的手段实现盈利,并把这些收入用于环保。对搜索没有太高要求并且想要在上网时感受到一些环保事业参与感的用户来说,Ecosia 或许是不错的选择。只可惜它不是我想要的答案。

Marginalia 是在瑞典运作的搜索引擎,数据受 GDPR 法案保护,并且源代码完全开源。它是一个叫作 Viktor Lofgren 的软件工程师开发并维护的,刚才谈到 Kagi 的时候也提到了它,Kagi 使用它作为搜索结果的来源之一。

Marginalia 使用的开源协议是 AGPL,是自由软件。不由科技公司维护,运行在欧洲国土上的自由软件,似乎是很理想的选项。它的设计者是这样阐述 Marginalia 的业务模式的:

网页搜索传统上一直很难盈利,这促使许多搜索引擎走上了广告的道路,损害搜索结果20

这个项目是独立的,它没有贷款、没有寻找分红的投资者,也没有任何牵连和纠葛来向其施压,使其除了尽力提供尽可能多且尽可能好的互联网搜索之外,不做任何其他事情21

Marginalia 搜索引擎被设计得运行和维护起来非常低廉,目标是提供超越自身体量的价值,所以可以在无捐赠、无付款、没有与其他搜索引擎的商业 API 交易的情况下被爬取22

项目目前的账单大约是 200 美元一个月,这意味着即便资金耗尽,它也能持续运作,尽管那可能会导致开发近乎完全停止23

那么,Marginalia 能代替其他搜索引擎吗?

从名字上看,marginal 的意思是「边缘的」「非主流的」,它的搜索结果大多数来自小网站(这也是为什么 Kagi 要使用它的 API 作为来源之一)、博客和一些学术内容。类似的搜索引擎还有 Mojeek ,不过后者位于英国(非欧盟国家),由公司运营。

Marginalia 的存在和它的理念让我开始思考,我使用搜索引擎究竟是为了什么?难道不是为了获取高质量的内容吗?Marginalia 表示搜索引擎应该更多样化,我想与其使用通用型的搜索引擎,不如使用多个更有针对性的搜索引擎,在搜索高质量的文章时使用 Marginalia,在寻找好的软件产品时使用 ProductHunt 和 AlternativesTo,在寻找开源项目时使用 GitLab、Codeberg 和 GitHub,以此类推。这或许没有那么方便,但不失为一种解决方案。

搜索引擎的终极解决方案?

读到这里,关注隐私但不愿意投入太多的人可能已经选择 DuckDuckGo 或者 Qwant,愿意付费获得好的搜索体验的人可能在尝试 Kagi 或者 Brave Search,认同环保理念的可能打开了 Ecosia,认同 Marginalia 理念的人可能开始同时使用多个搜索引擎,但如果你和我一样不愿意妥协,就请继续读下去吧。

是的,一切的终极解决方案都是自托管。

前文提到,搜索引擎有两种:一种是有网络爬虫,维护万维网索引,拥有基础设施的搜索引擎;另一种是元搜索引擎,他们使用其他搜索引擎的搜索结果。显然第一种搜索引擎所耗费的服务器资源更多,开销更大,后者则更容易负担。

不过这个所谓的开销究竟有多少呢?如果参考 Marginalia,它只索引和爬取一部分万维网,主要是小网站、博客和学术网站,开销是一个月 200 美元。不过 Marginalia 提供 API 并且供所有人使用,所以这个开销也包含网络资源等。如果只考虑计算开销和储存开销,自己管理爬虫和索引究竟容不容易负担呢?

根据 YaCy Wiki ,自托管一个 YaCy 搜索引擎至少需要 25GB 存储,内存至少需要 256MB——真的吗?你可是用 Java 写的。 我在 这个 Reddit 帖子 下找到了使用 YaCy 一两年的用户的回复,他表示 YaCy 很快就把服务器一两个 TB 的存储吃满了,他不得不用一些优化策略解决问题,而他只索引了一小部分域名。

如果只是索引一两个网站,YaCy Wiki 给出的数据可能是对的,但如果真的要代替 Google 等搜索引擎,普通人能负担得起的服务器肯定是不行的,就算尽可能减少索引的网站,也会吃掉大量的储存。计算开销可能不必担心,但爬虫又是另一个问题。所有的机器人都应该有 User-agent 标识表明自己的身份,比如谷歌爬虫的标识叫作 Googlebot。众所周知,几乎所有网站都会提供 robots.txt,表示他们欢迎哪些机器人,不欢迎哪些机器人。尽管恶意的 AI 爬虫可能会违反 robots.txt 给服务器带来极大负担,但我们是有道德的,自己托管爬虫当然要尽可能遵守 robots.txt

那么问题就来了:许多网站可能不欢迎你的爬虫,他们只允许 Google 和 Bing 等大搜索引擎的爬虫,默认禁止其他所有的爬虫。就算违反 robots.txt,不少网站也有很多反爬虫手段。如果很多网站都爬不到,就无法建立索引,搜索引擎也就没有数据来源了。自己维护爬虫就跟自己维护 SMTP 服务器一样,也可能受到 IP 影响,如果服务器的 IP 段信誉不好,发出的邮件就更容易被当作垃圾邮件,无法保证送达率,网络爬虫也更容易在网络层被毙掉。

完全自托管搜索引擎的基础设施很困难,有大量资源和精力的人可以尝试。对于其他人,可以选择自托管元搜索引擎,就和 DuckDuckGo 使用 Bing 的搜索结果一样,我们可以从多个搜索引擎聚合搜索结果。

SearXNG 就是很好的例子,它能够聚合来自最多 250 个搜索服务的内容,不只是 Google 和 DuckDuckGo 这类通用型搜索引擎,还能从 Wikipedia 等信息源直接聚合搜索内容。

你可以把 SearXNG 当作聚合型的隐私前端,你可以在不运行不自由的 JavaScript 代码、不被追踪的情况下,使用主流搜索引擎的搜索服务。搜索请求是在服务端发出的,内容聚合完成之后才会显示在前端。尽管用 Python 编写,占用的资源并不算多,毕竟它做的只是向多个服务发送请求,然后把返回的结果聚合在一起而已。自托管的成本很低。

听起来很棒,但缺点是什么?

请求超时、拒绝服务、暂停访问,以及超时和更多的超时。

DuckDuckGo 能使用 Bing 的服务是因为他们形成了商业合作,普通人在不访问 Bing 的前提下使用他们的 API 当然会受到极大的限制,搜索稳定性很难保证。用户先向 SearXNG 实例发送请求,实例再向搜索服务发送请求,搜索服务把搜索结果返回给实例,实例做了处理之后再发送给用户。这个中间人的存在本来就会让搜索速度变慢,如果稳定性还得不到保证,搜索体验就很折磨了。

搜索质量也不能说稳定,从 SearXNG 得到什么结果完全取决于配置了哪些搜索服务。有时候我在一个 SearXNG 实例上搜索 neovim linter 会得到相关插件的代码仓库,而在另一个 SearXNG 实例上搜索相同的关键词,得到的却是「NeoVim 和 Vim 有什么区别?」的相关讨论。有时候同一个实例的一些服务会超时,另一些服务则能够正常访问,导致搜索结果不一致。

SearXNG 有不少 公共实例 ,你可以自己试试看。

除了稳定性,SearXNG 几乎可以说是匿名用户的完美解决方案:如果你不信任任何搜索服务,就用尊重隐私、不受利益驱动、运行自由代码的中间人服务帮你搜索;如果你不信任任何人,就自托管 SearXNG,确保数据不会滞留在别人的服务器上。只可惜,稳定性真的很重要,如果真的需要匿名,在 Tor 浏览器上使用 DuckDuckGo 等搜索引擎搜索也能达到很好的效果。

全都是权衡取舍

说到底,原来你没有一个完美的解决方案吗?

是的,完美的解决方案是不存在的,或许搜索引擎也有一个「不可能三角」——搜索质量好、保障隐私和成本低,这三者无法同时达成。比如,使用 Google 或许能做到搜索质量好和成本低(尽管前者有待商榷),但绝对不可能保障隐私;使用 Kagi 或许能做到搜索质量好和保障隐私,但需要支付订阅费;使用 SearXNG 能做到很好的隐私保护,使用公共实例和自托管的成本都不高,但搜索质量不稳定。

等等,DuckDuckGo 好像做到了三者?

不过,也可以认为使用 DuckDuckGo 支付的并非是金钱成本,毕竟广告也会消耗心智资源。或者说,这个不可能三角并不是定性的,而是有程度的,比如 SearXNG 和 Kagi 的隐私保护和匿名程度就又很大差别,不能一概而论。总而言之,很难找到在各方面都完美的搜索引擎。

所以,使用什么搜索引擎需要各位自己权衡取舍,可以查看 Wikipedia 上的 搜索引擎列表 自行对比选择。总结下来,我认为选择适合自己的搜索引擎需要考虑一下几点:

要点 描述 例子
是否收集用户数据、跟踪用户 追踪器可以跨站追踪用户,甚至精确到地理位置,是对隐私的极大侵犯 Google 和 Bing
是否有广告 无论有没有追踪器,广告都会影响体验 免费的搜索引擎几乎都有广告
搜索质量如何 搜索结果与关键词的相关性,以及内容农场和 AI 废料在搜索结果中的占比等等 百度就是极佳的反例
是否有自己的索引 没有自己索引的搜索引擎依赖其他的服务,可能受到大企业的影响 包括 DuckDuckGo 在内的大量搜索引擎都使用 Bing 的索引
对语言模型的态度 是否提供、如何提供大模型相关的功能,这要看你自己对 AI 的态度是怎样的,然后再决定这个要素是否重要 Google 几乎在每次搜索都会显示 AI 总结;而 Kagi 只会在关键词以 ? 结尾的时候显示
如何处理用户数据 搜索引擎会不会保留搜索历史,会不会对数据做匿名化处理 Marginalia 会在 24 小时后删除记录
价格如何 付费的搜索引擎可能提供更好的服务 Kagi 是付费搜索引擎;Brave Search 有付费方案
能否匿名 需要登录的服务对保持匿名的用户来说有风险 DuckDuckGo 可以不登录使用;Kagi 必须登录,但提供了 Privacy Pass 作为替代方案
地域 考虑公司、组织和服务器所在国家的审查机制、政治氛围和相关法律 欧盟地区有 GDPR 法案保护用户数据;瑞士的隐私政策最为严格

决定哪些因素对自己最重要、哪些不可或缺、哪些可以舍弃之后,再选择搜索引擎就会容易许多。一般来说,有以下选项:

选项 优劣势
大科技公司提供的搜索服务(如 Google 和 Bing) 使用者众多,搜索质量中等,有广告并且会追踪用户
隐私搜索引擎(如 DuckDuckGo、Qwant 和 Eocisa) 搜索质量与 Bing 相当,有广告但不追踪用户,相对来说更尊重隐私,但有不少是元搜索引擎
付费搜索引擎(如 Kagi 和 Brave Search) 订阅费不便宜,但完全没有广告和追踪器,而且注重用户体验
公益的自由搜索引擎(如 SearXNG 公共实例和 Marginalia) 运行自由软件,没有广告和追踪器,尊重使用者,但稳定性可能得不到保障,或者搜索结果相对局限
自托管元搜索引擎(如自托管 SearXNG) 运行自由软件,对数据和搜索体验有极大的控制,没有广告和追踪器,但稳定性可能得不到保障
自托管爬虫、索引和搜索引擎 运行自由软件,对数据和搜索体验有完全的控制,没有广告和追踪器,但会消耗大量的资源、时间和精力

我目前正在尝试第三种方案,也就是使用付费搜索引擎,我选择的是 Kagi。到目前为止,除了订阅费有点贵之外,我是一个很满意的 Kagi 客户。等我有更多的时间、精力和资源了,可能会尝试自托管搜索引擎,当然,当我有了这么多的时间和精力,我很可能会出去摸草而不是对着电脑敲命令行。

最后

关于搜索引擎,我要说的就是这些了。尽管写了很长、很累,但整个探索的过程对我来说非常有趣。当我发现市面上一大半的搜索引擎竟然都是 Bing 的前端之后,我感到震惊,同时又觉得好笑,于是到联邦宇宙上吐槽,得到了 Saki 的回复。对方表示搜索引擎这种服务或许就像地图绘测,只有少数的几家公司有资源去做这种事情,而其他公司以购买数据授权为主。

或许索引整个万维网就和绘制整个大陆的地图一样,外包给可靠的人是最好的。最后,希望各位都能守好自己上网的门户,用上自己满意的搜索引擎。


  1. 参见: As We May Think - Wikipedia  ↩︎

  2. 原文:Technologies like trip hammers exist that can do physical labor better and faster. Soon, technologies will exist that can help people do intellectual labor better and faster. ↩︎

  3. 原文:The Encyclopædia Britannica could be reduced to the volume of a matchbox. A library of a million volumes could be compressed into one end of a desk. ↩︎

  4. 原文:When data of any sort are placed in storage, they are filed alphabetically or numerically, and information is found (when it is) by tracing it down from subclass to subclass. It can be in only one place, unless duplicates are used. ↩︎

  5. 参见: Gopher (protocol) - Wikipedia  ↩︎

  6. 原文:Microsoft first launched MSN Search in the fall of 1998 using search results from Inktomi. In early 1999, the site began to display listings from Looksmart, blended with results from Inktomi. For a short time in 1999, MSN Search used results from AltaVista instead. In 2004, Microsoft began a transition to its own search technology, powered by its own web crawler (called msnbot). ↩︎

  7. 来源: Search Engine Market Share Worldwide  ↩︎

  8. 来源: How does DuckDuckGo make money?  ↩︎

  9. 来源: “Visit Microsoft Advertising to start buying search advertising on DuckDuckGo.”  ↩︎

  10. 原文:unfortunately, our Microsoft search syndication agreement prevents us from doing more to Microsoft-owned properties. However, we have been continually pushing and expect to be doing more soon. ↩︎

  11. 来源: DuckDuckGo - Wikipedia  ↩︎

  12. 来源: Neocities Is Blocked by Bing  ↩︎

  13. 参见: DuckDuckGo to Down-Rank Sites Associated With Russian Disinformation  ↩︎

  14. 来源: DuckDuckGo #Early_year - Wikipedia  ↩︎

  15. 顺带一提,他们似乎表示会在成员数量达到十万时公布一个小惊喜,他们之前达到两万用户的时候给前两万个用户发了免费的 T 恤和贴纸。 ↩︎

  16. 参见: Search Sources - Kagi’s Docs  ↩︎

  17. Marginalia 是由个人开发和维护的关注小网站的开源搜索引擎,我不知道 Kagi 有没有因为使用他们的 API 给 Marginalia 捐赠。大概率没有,因为我没有在 Marginalia 的赞助者名单里找到 Kagi;Kagi 在 文档 里表示自己给 Crystal 和 Python 编程语言捐赠,但没有提到 Marginalia。 ↩︎

  18. 原文:The company uses renewable energy to power its servers and invests its profits in tree-planting projects, aiming to absorb more CO2 than it emits. ↩︎

  19. 原文:Ecosia devotes 80% of its profits to tree planting. ↩︎

  20. 原文:Web search has traditionally been difficult to monetize, which has pushed many search engines to go the route of advertisement, to the detriment of the search results. ↩︎

  21. 原文:The project is independent in that it has no loans, no investors looking for a payday, no strings attached anywhere to pressure it into doing anything than providing as much and as good internet search as it is capable of. ↩︎

  22. 原文:The marginalia search engine is designed to be very cheap to run and operate, and the goal is to provide outsized value, and thus be able to scrape by on donations, grants and commercial API-deals with other search engines. ↩︎

  23. 原文:The project currently has bills in the ballpark of $200/month, meaning it can keep operating even if funding runs completely dry, although this would cause development to stall almost completely. ↩︎