阅读视图

发现新文章,点击刷新页面。

稻草人周刊 Vol.76

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

GitHub 官方的服务在线率

GitHub 最近 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 这个意思的中文词汇。 ↩︎

有毒

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

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

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

毒与人类

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

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

世界上真是什么人都有。

毒与无知

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

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

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

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

毒与医疗

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

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

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

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

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

毒与物竞天择

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

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

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

最后

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

什么毁了 JavaScript?

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

众所周知,我时不时就会调整一下周刊的格式,所以…… 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. 不过主角中有一人坚持认为她有罪,于是装成高中生,脱掉上衣修剪草坪以色诱她,最后他们确实上了床,然后女恋童癖把他的阴毛剃了,然后他的女朋友发现了…… 呃,等等,我怎么写到这里来了? ↩︎

垃圾

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

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

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

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

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

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

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

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

“说话!”

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

“孩子?里面有个人?”

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

“这……!”

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

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

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

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

“九点十分左右。”

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

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

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

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

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

“没有。”

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

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

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

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

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

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

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

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

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


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

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

“放我出去。”

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

“不要丢掉我。”

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

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

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

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

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


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

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

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

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

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

除非是在逃离捕食者。

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

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

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

“那不是小孩子。”

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

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

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

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

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

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

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

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

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

“不要把我丢掉。”


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

“不要把我丢掉。”

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

“不要把我丢掉。”

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

“不要把我丢掉。”

“你闭嘴吧!”

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

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

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

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

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

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

“不要把我们丢掉。”

“不要把我们丢掉。”

“不要把我们丢掉。”

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

“不要把我丢掉。”

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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. ↩︎

稻草人周刊 Vol.74

Summerchild music cover

Summerchild 专辑

Red Sun Atacama

我在 Bandcamp 上购买的第一张摇滚专辑,最喜欢的曲子是《Commotions》和《Graze The Sun》,音乐类别据说是荒漠朋克(desert punk),整体的听感的确有干燥、炎热和富有激情的感觉。

连接

自由软件应该要求捐赠吗?

📜

答案显而易见,由志愿者和非盈利组织维护的自由软件,由于没有资金来源,为了保证可持续性,请求免费使用软件的用户自愿捐赠不但无可厚非,而且是必要的。然而,一些热衷炒作的媒体和不明事理的用户却不这么想。

自由办公软件 LibreOffice 在新版本中做了一项调整,他们把原本每半年在用户打开文档时弹出的捐赠横幅,移动到了启动页面,改为每个月一次,不过改动后的捐赠横幅不会遮住文档内容,而且被放在了更不显眼的地方。

Some articles have described the change as an “aggressive fundraising campaign” and suggested that it is part of a dangerous trend towards “freemium” models and paid features.
一些文章将这次改动描述为“激进的筹资运动”,并暗示这是过渡到 Freemium 模式和付费功能的危险趋势的一部分。

之所以媒体会这样报道,是因为他们很方便地忽略了 LibreOffice 原本就有捐赠横幅,而且被放在更显眼、会遮挡用户界面的地方这个事实。LibreOffice 感到不解,因为他们这样做好几年了,同体量的自由软件项目(如 Thunderbird)也这样做,甚至 Wikipedia 在年底还会在每个页面放上损害浏览体验的捐赠横幅,但媒体报道都没有这样负面。1

本来像 ffmpeg 这样非常基础却曝光度很低的自由软件项目不被重视、缺少资助就已经很令人唏嘘了,没想到还有质疑自由软件项目动机不纯并借此炒作的新闻媒体,真是世风日下。

这也提醒了我应该重视对自由软件和非盈利项目的捐赠,我现在有在给 CodebergInternet Archive 捐钱,每月一美元。我在想我应该提高捐赠的金额,一开始只捐赠一美元是因为我作为学生并没有太多闲钱,不过我突然意识到自己连 $10 一个月的 Kagi 会员都舍得买,为什么不能给对自己有帮助的自由软件和非营利组织多捐点呢?正好最近还取消了 Apple Music 等一系列订阅,下周整理一下每个月的固定开销,做些计划,就可以调整捐赠的金额了。

错误的译法如何影响人们的思想?

📻

现代汉语里有许多常用的名词其实是和制汉语,即从日语借来的词,这些词往往是日本学者对西方思想观念的翻译,比如经济、自由、国家、权利和权力等都是和制汉语。而其中一些翻译被放到中文的语境下其实是不恰当的,比如「自由」一词,在汉语中原本是没有任何拘束、放荡和自由散漫的意思,与英语中的 Liberty 和 Freedom 意思不一样,甚至是相反的——密尔所强调的意思是「在不伤害他人的前提下不受干涉」。

播客的观点是,错误的翻译使得汉语使用者对一些词产生了先入为主的印象,继而污名化了某些理念。播客中赵老师甚至认为如今自由派在中国不招人喜欢的原因之一就是…… 自由派的名字里有「自由」两个字。

错误的翻译无处不在,已经在很大程度上塑造了人们对不少思想观念的认知,甚至塑造了人们的思想本身。比如柏拉图的《理想国》就是完全的错译,正确的翻译是《共和国》。《国富论》(The Wealth of Nations)容易被误解为「让国家富强的理论」,实际上这本书更关注人民,全名是《国民财富的性质和原因的研究》。翻译还受到意识形态影响,比如德国观念论就因为译者借用了佛教语境而被译作「唯心主义」。一些翻译还暗含原文本没有的价值判断,比如 evolution 本意是「演变」,而中文却常译作「进步」,暗含了变化一定是好的。

准确的翻译却不容易被接受,比如严复就把密尔的《论自由》(On Liberty)译作《群己权界论》,译名拗口但实际上比「自由」更准确,密尔所说的 Liberty 就是「群体与自己之间的权力界限」。

播客也承认讨论这些问题并不能改变什么,人们依然会使用「自由」这个词(不然怎么相互理解呢?)。我想,作为普通人,或许应该在接触到新概念时尝试刨根问底、探求来源,即便继续使用错误却被广为接受的含义,至少也应该知道原义是怎样的、更准确的说法是怎样的。

另外,树老师一直开玩笑讲赵老师想讨论的话题很无聊,没有人想听。可我听得很起劲,前不久也关注了《政治哲学圆桌》这个播客。仔细想想,我在博客上写这类话题的时候的确是无人在意啊。

适度饮咖与认知功能的关系

📃

这是篇科学研究,我不是生物学专业的,所以我只读了摘要。

这项跟踪了约十三万个体最多 43 年的研究报告显示,咖啡因摄入与更低的痴呆风险和更好的认知表现有关。研究的指标主要有两个,一是通过死亡报告和体检发现的痴呆症,二是通过调查问卷收集的认知能力自检。主要研究的是饮用咖啡和饮用茶对上述认知表现的影响,研究还专门对低因咖啡做了区分。

他们发现最显著的相关差异在于每天饮用 2 到 3 杯咖啡,或者每天饮用 1 到 2 杯茶。饮用低因咖啡则没有显现出显著的关联。

需要注意的是,这是相关性研究,不代表因果性。我很期待有研究能揭示咖啡因摄入和认知功能之间的关联,不过就算没有实质性的证据,我也会每天喝两杯咖啡的!

技术进步是为了什么?

📻

听完这期博客的几天后,我在联邦宇宙上看到一张截图,大概是一个团队的领导提出团队成员必须并行操作 5 个本周刊不能讨论的技术2同时编程,并且要求输出结果必须接近真人,这个领导还艾特另一个人说他应该逼一逼他的人,让他们加快生产效率,以前一个月干不完的事情现在一周就能做完了3。顺带一提,这个企业的产品很快被爆出有安全漏洞。

这可吓得我不敢就业,另一边又看到考研人数和分数线双双飞升,真是吃尽时代黑利啊。这次轮到你做大人了,情况就突然变得糟糕了起来。

Welcome to the club!

技术本应是用于解放人的,但从以往工业革命的经验来看,发明蒸汽机和发明计算机都没有让人的生活和工作变得更轻松,相反,由于技术进步,生产力提高,工作效率提高了,员工能在短时间内完成的任务变多了,老板的欲望也会增长。人的欲望是永无止尽的。

播客还预言以后的工作都会变得跟外卖员一样,工作交付时间被算法精确计算,不断逼近工作能力的极限,人们被无时无刻地监工,没有时间喘息。

听这期博客的前几天我还在联邦宇宙上看到过一篇帖子,大概是说,研究人员通过对某个部落的研究发现,人类祖先每周只需要工作 15 到 20 个小时(也就是一天 2 到 3 小时),就能够收获足够多的食物养活所有人,并且每天都有充足的时间娱乐和社交。

我当然不会幻想甚至要求回到原始社会,我很清楚我无法忍受没有现代科技的生活,但我在思考,科技在给人带来便利的同时又隐含了什么样的代价?

无法被理论化的人

📻

咳咳,这期播客非常完美地衔接了上一个话题。

和科技进步同时发生的是科学观念的普及,现代科学对人们看待世界、事件、现象和人的方式产生了质的改变,其中最重也最可怕的思想钢印就是:一切都是可以被完全解释的,一切都是可以被量化的,一切皆有定论。

这种思想的可怕之处在于它物化了人,把人当作一种「物种」来研究,得出类似「人就是自私的啊」这种结论并终止有关道德的讨论。播客中以陀思妥耶夫斯基的小说为例,小说中的主人公本来想为受到性骚扰的女性打抱不平,但很快另一种基于统计学的思想擒住了他,“每年都有这么多的人被强奸,她只是百分数中的一个”,然后转头跟警察说:“算啦,让他玩儿去吧。”

现实中可能不会发生小说那样夸张且艺术化的情节,但无疑这种思想已经深入人心,比如在讨论社会经济现象时重复地抛出「经济基础决定上层建筑」「生产力决定生产关系」等科学结论,完全忽略事件的复杂性,以过度简化的、数学式的、脱离于现实的抽象语言给现实打上标签,然后停止深入探究和思考。4

被数学公式定义的人是被剥离个性的,你和我的悲伤都可能被定义为抑郁症,我和他的快乐都被定义为多巴胺,尽管在客观层面正确,可若是眼里只有科学,人会窒息、会发疯,因为个性被剥夺了。没有人被看见,因为所有人都一样。我想起《 不能承受的生命之轻 》中特蕾莎的主题「灵与肉」,抢夺她个体性的不是科学理论,而是社会关系,她的母亲不让她掩盖私处,因为女人的身体都是一样的,她就在肉体的世界里丧失了个体性,想要摆脱肉体,让灵魂显露出来,远离了母亲,把书本当作出口和灵魂世界的暗号。我还想起加缪的《 鼠疫 》,城里的所有人都经受着相似的苦难,以至于一旦有人开口倾诉自己的悲痛,就会被当作陈词滥调,就此打住,不被倾听——没有人的故事被讲述,只有「所有人」的故事被书写。

我一两年前还很喜欢和人较真,于是在离开某个兼职工作前给主管写了六千字长信宣泄不满,这个时候回忆起,我想我是在要求对方尊重我的个体性,不要把我当成和其他所有员工一样管理(现在看来的确幼稚,但也同样合理)。

「科学结论就是这样的,所以你也应该这样」的思想让人窒息,如果所有人都能够被 2+2=4 这样不可辩驳的结论定义,会发生什么?

这样的事情已经在发生了,外卖骑手的送达时间就在被算法定义,类似的技术也会在未来被用于计算所有人的工作交付时间,在这套系统面前,意外事件和个体差异是不被考虑的,自我也就被剥夺了。

不能再思考这个话题了,否则我会一蹶不振。

跑个题

树老师在播客开头提到了中国人对「文科」和「理科」的严格划分,这是中国文化里的思想钢印,认为所有学科都必须被严格划分文理,两类学科的人才必须用不同的方式培养,当然,还有文科无用论

她表示历史上伟大的科学家实际上也都接受过文科教育,比如发明了直角坐标系的笛卡尔既是数学家,又是哲学家。这点我深感认同。我记得之前还有人教我要学会跨界,当时的我不解甚至觉得好笑,因为对我而言,跨界的「界」一开始就不存在5,我对哲学的好奇心与我对生物学的好奇心是同源的。还有不少人知道我学计算机过后就把我当作理工男,我的天呐我都把塔罗牌拿出来跟你谈心理疗愈了你竟然还说我说话像理科生?我的存在是来巩固你对思想钢印的信仰的吗?

我重申,我的专业是软件工程,我喜欢探究新奇的技术和设计用户界面,但我读哲学、文学,喜欢研究语言学和词源,在学法语,会占卜算命,会读科普书籍,会读心理学。最喜欢的程序员是 Paul Graham,最喜欢的作家是加缪,最讨厌的哲学家是笛卡尔,因为他发明了直角坐标系,而我痛恨解析几何。

从 GitHub 迁移到 Codeberg 的懒人指南

📜

关于为什么要从 GitHub 迁移,可以阅读 第 67 期周刊

作者一开始以为把 Git 仓库从 GitHub 迁移到 Codeberg 会有点麻烦,结果发现 Codeberg 提供了很直观的 Web UI 以供迁移,还能保留仓库的 Issues、Pull Request 以及它们的作者、附件和标签。GitHub Pages 也有对应的 Codeberg Pages,唯一有些棘手的是 CI,尽管 Codeberg 有提供 Forgejo Actions,但 Runner 使用有限制,最好是自建一个 Forgejo Runner 或者使用他们提供的 Woodpecker CI。

我最近在把一个 Go 项目迁移到 Codeberg 时也遇到了类似的问题,原本我有设置基于 GitHub Actions 的自动化单元测试工作流,不过迁移过后就没办法直接在 Codeberg 上使用了。尽管兼容 GitHub Actions 的语法(甚至能直接读取 .github/workflows/ 下的 YAML 文件),但没有 Runner 可以运行。

我自建的 Forgejo 实例上有用到自建的 Forgejo Runner,本以为可以直接复用,但貌似行不通。我本身就不太喜欢 YAML 语法,所以打算找时间研究一下 Woodpecker。

最后,如果你还在使用 GitHub,我想提醒你的是 GitHub 开始默认收集用户数据以训练本周刊不能谈论的技术,你需要在设置里手动关闭,详见他们博客上的 这篇文章 。我还想说,真正在乎用户数据的公司会默认关闭这个选项,而不是从无知的用户那里收集数据。我已经减少了我在 GitHub 上的活动,最近仅仅是在给一些项目提 Issues 和 Pull Requests 而已,我仍在维护的仓库全都迁移到 Codeberg 或者 Hydra 上了。

星群

lnav

基于终端的日志阅读器,操作逻辑与 Vim 类似,对 (Neo)vim 用户非常友好。

有趣的是,这个项目提供了开放 SSH 端口的服务器和用户,如果要体验 lnav,可以直接用自己的终端 SSH 到他们的服务器上使用。

ssh playground@demo.lnav.org

访问: The Logfile Navigator

理想的日常模拟器

月初参加了 BlogBlog 同乐会 的三月活动,主题是「 理想的日常 」,主持人是 Alex 。这周他发布了他的《理想的日常》,其中有很酷的「理想日常模拟器」,可以用 15 分钟、30 分钟或 60 分钟的颗粒度规划自己理想的一天。

我简单试了试,不过没做完,因为时间类别不能自定义,而其中有很多并不符合我的习惯。比如…… 呃…… 我不会把专门一段时间划分给…… 「家庭」。总体而言是有些趣味性的应用,如果能自定义(或者开源)就更好了。

访问: 1440 分钟时间管理

nanobrew

Homebrew 的替代客户端,使用 Zig 编写,据说速度比 Homebrew 快了 230 倍。不过,可能是网络原因,我使用 nanobrew 时并没有觉得它快了很多。

可以很方便地使用 nb migrate 命令,从 Homebrew 迁移到 nanobrew。这一步只是把原本用 Homebrew 安装的包的信息加载到 nanobrew 的数据库里,并没有迁移文件,所以很快,也没有什么成本。nanobrew 仍然在实验性阶段,建议搭配 Homebrew 一起使用,不过我目前还没有遇到特别严重的问题。

nanobrew 还支持 .deb 和 Docker,据称比 apt-get 快 13 倍,大概可以在 Ubuntu 和 Debian 上使用。

对了,它的缩写是 NB 欸。

访问: NanoBrew

aerc

不喜欢臃肿的 Thunderbird,苹果自带的邮件 App 其实还不错,但似乎很容易遇到连接问题,而且不是自由软件,所以我一般只在手机上使用。为了找到在桌面端使用的主力邮件应用,我费了很多心思,前些日子还安装了 Doom Emacs 以便使用 mu4e,用 Emacs 收发邮件,不过我实在没什么心思再折腾一个编辑器了,Neovim 的配置都有很长一段时间没更新了。

当时的我非常邪恶地在 Neovim 里打开终端,然后用终端启动 Emacs,最后从 Emacs 里打开 mu4e。 我在使用 mbsync 同步邮件时遇到了一些问题,而且我很少打开 Emacs,所以总归用得不太顺手,后来的很长一段时间我都在用 Migadu 提供的 Web 界面收发邮件。

我其实一直想要试试 (Neo)Mutt,基于命令行的邮件客户端,不过他们的文档写得实在是太啰唆了,我前前后后试了三次,都没能完整地读完。NeoMutt 的配置有些复杂,最近一次我尝试用 mutt-wizard 自动配置 NeoMutt,可遇到了连接问题,而且 mutt-wizard 要求我必须用 GnuPG 加密密码,没有提供别的加密方式,而我早就抛弃 LibrePGP 和 OpenPGP 了6

最后我选择了 aerc,这无疑是个正确的选择,因为它非常简单直观,甚至能够通过查询 DNS 记录来自动配置 IMAP 和 SMTP 服务器,只需要输入邮箱和密码就好了。不过没有默认加密密码,aerc 建议完成自动配置之后,手动去更改本地配置文件,使用 pass 之类的命令行密码管理器加密密码。

aerc 完全支持 Vim 键位,用 j k 上下移动查看邮件,用 J K 在收件箱、垃圾邮件和已发送邮件等文件夹之间切换,用 C 起草(compose)新邮件,编辑邮件时会直接嵌入 (Neo)vim,也就是说我可以用自己配置好的、常用的编辑器编写邮件,体验非常好。

aerc 还能够渲染 HTML,不过是在终端里,只是会将边框等简单的元素渲染出来,图片会用 Alt Text(替代文本)代替。

如果你也想用终端界面收发邮件,aerc 值得一试。

访问: aerc

切片

  • 想养狗,但担心把狗狗也弄得抑郁。
  • 喜欢摇滚,因为可以在喧嚣中停止思考,用身体痛骂世界。
  • 去年就有给博客重新画一个 Logo 的想法,大概是一个斜着朝着画面的骷髅头,整体线条是黑色,有红色的文字进入骷髅头的后脑勺,然后从前额以明显是另一种语言的形式出来。可惜不会画画,要替代现有的 Logo 可能有点难。

  1. 原文是这么说的,但印象中关于维基百科的负面报道其实不少,去年年底有不少媒体抨击维基百科背后的基金会在网站上装惨要钱,实际上他们的钱多到可以在里面游泳。他们想要捐赠是为了做一些别的项目,他们完全有能力维护维基百科本身的运行。 ↩︎

  2. 如果你不知道这是什么,请查看 上一期周刊 。 ↩︎

  3. 关于此举为什么缺乏道德且危险性极强,本周刊不能讨论,还请阅读 第 69 期周刊 中的有关内容。 ↩︎

  4. 我之前写过一篇题为《 前提重掷 》的文章,也反驳了类似的思想,尽管背后的逻辑是不同的。 ↩︎

  5. 《跨界的「界」一开始就不该存在》是我某篇文章废稿的题目,现在不知道被我扔到哪去了。 ↩︎

  6. 关于为什么不使用 PGP,可以阅读 第 68 期周刊 。 ↩︎

来自沉船的爱意

乙一,你是不是穷疯了才出的这书?

一篇短篇小说集,作者是乙一、中田永一和山白朝子,其中山白朝子只写了一篇(而且是我评分给得最低的一篇)。我其实很失望,因为我能在专门做怪谈故事的网络写手和视频制作者那里看到类似质量的故事,其中有一些题材已经被写烂了,没有太多新意(比如丧尸和怨灵之类的)。乙一的作品一共收录了六篇,大多数是更有温情的白乙一。

哦对,书籍的署名上还有一个名叫安达宽高的人,被标注为「解说」,书腰上用词夸张的宣传语把他称作「全世界最了解这“三位作家”的评论家」(我也不知道为什么要给「三位作家」打引号)。我本以为他写了一篇完整的评论呢,结果翻到底了也没看到,所谓的「解说」不过是每篇小说前写的一句背景介绍,不到一百字,本书一共十一篇故事,那么他就只写了差不多一千字而已,这也能蹭到署名吗?

由于是短篇小说集,所以就给每篇小说打单独的评分好了。

五分钟的永远

作者:乙一;评分:⭐⭐+

两个小学生之间的故事,很短很简单的故事,简单到如果我把情节阐述出来,这篇小说就没什么好看的了。所以,还请好奇的读者自己去读原文吧。

乙一写中小学生的心理活动是有两把刷子的,但这篇只能说是中等偏下的水平。温情是有的,而且我这个对刻意制造的感动过敏的人,服用过后没有明显的不良反应,感觉身子暖暖的。

不过不得不说,主角之一村田勉这个小胖子嘴巴里说出来的话还真是有意思:

“你们能笑话我的也只有现在,等我长大后变成一个厉害的人,就会鄙视你们。我会调查你们的工作单位和家人信息,在合法范围内进行报仇。”

“据我观察,你是能被金钱驱使的人。”

“总有一天我会报仇!我要把你们的所作所为偷偷录下来,然后上传到视频网站,制造话题,掀起热议。一旦被晨间节目取材,当作现代社会的霸凌问题播出,肯定会影响你们升学。我从现在就开始期待那一天你们是什么样子!”

我不相信校园霸凌能够被消除,毕竟人类是邪恶的物种。既然没办法做到没有施暴者,那就祝愿所有的受害者都能像小说里的村田一样有个好心态。这让我想起之前看过的一张梗图,文字内容是:“想自杀的人注意了!当你想死的时候,请想想,该死的是不是另有其人。”

无人岛和一本书

作者:中田永一;评分:⭐⭐+

读起来还算有趣但经不起推敲,而且并不能算得上非常有意思的小说,但写得不算特别烂,中规中矩。

大概的故事是一个水手流落荒岛,发现岛上只住了一群猴子,和他一起漂到岛上的还有船长随身携带的百科全书。由于没有船只路过,呼救并不现实,所以他和猴子生活在了一起。他发现这些猴子非常聪明,能够用手指在地上写写画画,于是他…… 教会了他们写英文。

然后他挑选出其中智力超群的猴子阅读他的百科全书,猴子们从书中学到了很多知识和技术。水手发现一些猴子表现出了暴力倾向,学会使用石斧这类工具后,竟然开始砍杀同类。于是他们制订了…… 法律。不遵纪守法的坏猴子会被驱逐到岛屿上的荒地去。不得不说,这篇故事读起来是有很强的娱乐效果的。

相信你也不难猜到,这些猴子因为水手教会了它们生火而把他当作神看待吧。读到猴子在地上写出 GOD 的时候,我真的要笑出声了

水手的最终目的是借助这些猴子回到故乡,所以他专门给这些猴子看百科全书上航海相关的条目,还真的造出了帆船。为了不让这些猴子自相残杀,他特地把枪和弓箭相关的条目撕掉了,猴子问起的时候,他就说书本来就是这样的。结果,那些被流放的猴子…… 把他撕下来的几页偷走了,造出了武器,成了法外狂徒(毕竟猴子是没有执法部门的,没有自保手段也没有强制执行法律的能力),拿刀枪刺穿了曾经赶走他们的猴子。

水手带着幸存的猴子上了船,离开了岛屿,然后…… 又是一场暴风雨把水手吹走了,之后他在医院里醒来(真耐杀啊……),身边都是人类。留落异国他乡,但好歹能用英语交流,不用再教一整个聚落讲英语了

然后就是经典桥段:男人试图向其他人讲述他在岛屿上与猴子们的神奇历险,但是没有人相信他……

去买面包来!

⚠️

警告:我在这一小节里表现得非常不正常。

作者:中田永一;评分:⭐⭐⭐⭐

如果这是一篇耽美小说我会给五星。 给四颗星不是因为写作水准很高,而是我读得很开心,至少我很喜欢作者不按套路出牌和完全背着主流价值观写作的方式。不过,话是这么说,读完开头我就开始磕 CP 了,中田永一你确定没有在写男同小说吗?失望,希望主角和不良少年在一起。 🥺

主角秋永被黄毛不良少年入间霸凌了,被强迫跑腿,不得不每天在午休时间跑到偏远的小卖部给入间买面包。到了小卖部之后,秋永开始思索,到底要给入间买什么样的面包才好呢?是可乐饼面包?还是咖喱面包?还是蜜瓜面包?干脆买两个吧,顺便再买一杯饮料!然后主角又快速跑到体育馆后面,找到跟一群不良学长混在一起的入间,把袋子递给了他。入间瞄了一眼,漫不经心地扔给他五百日元。秋永本来想找零,谁知入间酷酷地说了一句:不用找了。天呢,从这里开始就磕上了,好爱。 🥰

“秋永,去买面包来!”

主人的入间的命令总是这样。小卖部里命名还卖炸鸡便当和金枪鱼饭团,他却总让我买面包。

那是因为他只想要你买的!只要是你买的都行!不需要炸鸡和金枪鱼这种东西!吃你买的面包他就足够满足了!呃啊啊啊—— 喷血倒地

让我暂时恢复正常,严肃地讲一讲秋永这个人。秋永是日本校园小说里很常见的类型,没有什么一技之长,在班级里很不起眼,连运动也不行。班级的焦点都在那些会打篮球、棒球的男生身上,秋永的性格相当自卑和软弱,这也是会被不良少年看上的原因吧。

然而,在给入间跑腿的时间里,秋永感受到了一些不太一样的东西。

首先,他发现自己的体能渐渐变好了。由于每天都要跑步给入间买面包,速度和耐力有了明显的提升。他猛然意识到,运动能力原来不是天赋,是可以通过锻炼实打实提升的!不过,让他始终不能释怀的是:入间大人究竟想要什么样的面包呢?真是难以琢磨啊!秋永开始在小卖部里占座观察,他发现大多数人都会买自己前一天就买过的面包,每个人都有自己最喜欢的口味。入间一定也有!于是他开始躲在草丛里观察入间吃不同种类的面包所消耗的时间,还有面部表情。天哪,虽然诡异得没边了,但这不是迷恋是什么? 🥺

不出意外地,他被入间发现了。男人,你真有意思。 入间惊讶:你居然想知道我喜欢什么样的面包?什么面包都可以!不过,非要选一个话,我最喜欢烤面包。

天哪,谁会不喜欢新鲜出炉的烤面包?于是秋永开始做功课,计算学校附近烤面包店的距离,需要多久才能到达,在午休时间有没有足够的时间跑个来回等等。他每天放学回家都会出门跑步,为中午给入间买喜欢吃的烤面包做准备。在练习准备期间,他每天照常在小卖部给入间买面包。某天,他发现自己的速度太快,买完面包到达体育馆后面时,入间还没有到,他提前了一分钟。入间见了酷酷地说到:不错啊,快赶上全盛时期的我了。

可是,入间让秋永跑腿买面包的事情都被同学们看在眼里,他们也都磕起了 CP。班主任找到秋永:

“听说你最近被人欺负了。”

“没有,我没事。”

“你可以实话实说,不用害怕。大家都看到入间强迫你去跑腿了。”

“他只是拜托我帮他做些事。”

“你不必逞强,秋永,痛苦的时候可以向周围的人求助。”

好负责的班主任,可是,秋永他真的乐在其中啊!

后来,入间被班主任训了一顿,垂头丧气地。

秋永问:“今天不买面包吗?” 🥺

入间:“烦死了!”

虽然入间不要他买面包了,但他仍然跑步,因为中午不跑步活动身体就浑身不得劲儿。之后的某一天,他策划已久的惊喜终于要实施了。趁着午休时间,他穿着抓地很好的运动鞋跑出校门,飞跃各种楼梯和障碍,来到了事先已经考查好的面包店,把各种面包都买了一份。然后他踏着上课铃跑回学校,因为入间是不良少年,所以还和不良学长一起待在体育馆外面没有上课,他也就过去把面包分给他们。

入间表示感谢,又扔给秋永五百日元,秋永把钱扔回去,说:

“不,谢谢你。”

在给入间买面包跑腿的日子里,他的体能得到了锻炼,跑步进步神速。随着身体机能的提升,秋永也变得越来越自信,他意识到至少努力就一定会有收获!

这实际上是一篇运动励志小说啊!

其实入间并没有被班主任训斥,而是抵不住不良学长的诱惑,沦陷了,学长要求入间跟秋永一刀两断,他纠结万分,所以跟秋永说出“烦死了”这种话。最终,入间耐不住学长实在是太强势了,跟学长在一起了,也就这么把秋永给甩了。

手机溜走了!

作者:乙一;评分:⭐⭐⭐

只有四页左右的超短篇,不过阅读体验还算不错。由于作者想达成的效果非常依赖反转,所以就不总结情节了。

东京

作者:乙一;评分:⭐⭐⭐

白乙一,故事是女主人公在东京塔上眺望远方时突然感到眩晕,之后在医院被查出以处女之身怀孕,随后诞下了一个神童。「神童」这个称谓是字面意义上的,整个故事都有一种现代圣经故事的感觉,女主怀孕的过程恐怕和基督教里圣母马利亚接受的圣灵感孕是一样的吧。

不过女主很惨,被父母当作不孝女,以为是在外面和男人乱搞产下的孩子。孩子智力超群,处理事情的方式非常成熟,母亲甚至在很多事情上要依赖孩子,可孩子具有某种超自然的属性——尽管所有人都不能伤害他、看到他时会感到高兴,就连鸟儿都会在他的窗边留下礼物,但他也会引发人们的负面情绪、怨恨和攻击欲望,待在他身边的人很有可能受到伤害。这也导致了女主屡次带着孩子搬家,躲避坏人,后来孩子非常懂事地离开了,他走后女主身边的人都忘记了她曾有个孩子这件事。

结局很容易猜到嘛…… 尽管离开了,拥有神力的孩子一直在远方保护着她。

中规中矩的一篇,不过乙一写这种温情小说对我的适口性很好,没有让我觉得很尴尬刻意。

蟹食丸

作者:中田永一;评分:⭐⭐⭐+

一篇鬼怪故事,男主角患了绝症,生活失意,于是酗酒,醉得晕头转向之际走到了深山里,遇到了名为蟹食丸的鬼怪。顺带一提,蟹(cancer)就是癌症的意思。鬼怪给了男人一块木板,带着这块木板就能受到鬼怪的保护,从「蟹食丸」这个名字来看,很显然木块的作用是帮助男人除掉了癌症,不过也没有完全治愈,病灶还在,只是奇迹般地受到了控制,恢复了健康。作为交换,男人每天都要拖着一拖车酒给蟹食丸和他的小弟,和他们一起喝个烂醉。

男主去到的地方是与异世界的交界处,他也偶尔跟着蟹食丸去异世界探险,蟹食丸给了他一个古代金币,卖掉之后得到了一大笔钱,什么也不缺了,于是每天的生活就是给鬼怪送酒喝。

虽然给了还不错的分数,但这篇小说的主题我没有太多共鸣。故事里,蟹食丸是个爹味老妖怪,不近人情,喜欢卖弄自己的成就,每天晚上都要把身边的其他妖怪召集起来喝酒,可是他口无遮拦而且说教瘾重,大家都不喜欢他。可是男主读懂了蟹食丸的心理,因为蟹食丸很像他的父亲,哎呀,我说中田永一你要是写 BL 小说真的会卖爆的。 后来其他的妖怪都跑到山另一边去了,有一次酒宴只有蟹食丸和男主两个人,这个蟹食丸意外地有自知之明,知道大家在之前愿意来他的酒宴只是因为害怕他或者有求于他,知道自己很讨人厌,于是在男主面前自怨自艾,说男主之所以还留在这里也只是为了保证自己的健康,不被疾病杀死而已。

男主说他对蟹食丸是真心的,可蟹食丸非说他在撒谎,不相信,还说他要是继续撒谎就杀了他。男主不甘,想找机会向蟹食丸证明自己待在他身边并不只是为了活命而已,于是某天他把保命的木片给了医院里患癌的小孩子,然后拖着疾病缠身的身体赴宴。最后的结局是一人两鬼(还有另一个蟹食丸的朋友)坐在一起喝酒喝到天亮。可能这就是直男的兄弟情义吧,不太懂呢,要是写成他们大吵大闹之后蟹食丸粗暴地按住了他的身体堵住了他倔强的嘴,我可能会更爱看。

背景里的人们

作者:山白朝子;评分:⭐

过于老套。

故事大概就是群演(背景里的人们)跟着剧组进山里拍戏,结果遇到了一系列诡异的事件,比如麦克风接收到了没有人听到的磨牙声,有人在厕所门外鬼笑骚扰女主演,摄影师在摄像机里看到不存在的人之类的,这些诡异事件一开始都被怪罪在群演们身上,剧组的人和偶像包袱很重的女演员都觉得是她们出于嫉妒搞的恶作剧。最后群演拍完自己的戏之后就被人带着离开了,路上司机告诉他们刚才还发生了一系列恐怖的事件,还是早点走为妙。他们离开山里的时候,在窗外的风景里看到了很多人影(背景里的人们),站着盯着他们离开,直到进入市区才消失。

最后主人公回忆起这次经历,觉得那是山里的亡灵忌妒生者,就像她们作为群演忌妒主演一样,还说可能那个磨牙声真是她因为忌妒发出来的呢

设备里记录到人感知不到的信息、死者忌妒生者、山里的孤魂野鬼,过于老套的元素堆砌,主题也没有很有趣,读起来非常平淡,其他作者至少还会尝试在故事里加一些情感纠葛和更丰富的人物背景来表现诚意(虽然这样做也没有好到哪里去),比如下一篇。

死亡之车

作者:乙一;评分:⭐⭐⭐

一篇丧尸题材的小说,主人公是个宅男,在去声优新作发布会的路上遇到了求助的人,他们汽车的引擎无法发动了,所以请求主角带他们一程。上车之后才意识到求助的这两个人正好是主角的高中同学,女人是主角以前喜欢的女生,而男人是之前霸凌他的人,而他们两个是在去看婚礼场地的路上。女人觉得尴尬所以拉着男人下了车,结果主角心不在焉,撞到了人,听闻声响的两人也随即赶了过来。然后,呃…… 面前这个人身上都发烂、发臭、长蛆,不说人话了,你们还没意识到他是僵尸吗?

然后是经典的从收音机里得知丧尸病毒泄露的桥段,此时男人已经被丧尸咬了,很虚弱。因为主角在刚刚和僵尸打斗的过程中不小心把车钥匙掉进了杂草丛里,他们没有办法离开,于是只能分头吸引僵尸注意力,以便找到车钥匙。结果女人找到钥匙之后刚上车就被自己未婚夫咬了,主角营救失败,只能躲进车里,眼睁睁看着自己以前喜欢过的女生被两只僵尸啃掉。

此时,刚被感染的男人脑子还没有完全坏掉,所以知道怎么开车门,可是车门锁住了。男主的车钥匙是感应型的,只要钥匙在车的一米五半径内就能够开门,这意味着车钥匙被肠子已经被啃掉的女人扔到了一米五的距离之外,主角只能伺机而动开车。结果…… 女人身体被撕成两半了也被感染成了丧尸,找到钥匙,拖着另一半身体开了车门。主角只得跑到男人和女人抛锚的车子里躲着,最后想办法用他们车子里的雨伞和夹克做成了火炬,打算从汽车油箱里沾上汽油,用打火机点燃,以火逼退僵尸。最后计划失败,夹克还在油箱里插着,主角灵机一动,用打火机点燃了夹克准备引爆汽车,找准机会拼了命地往前跑,最后把僵尸炸死了。

顺带一提,女人生前已经怀孕十周,男人回到自己的车上时看见女人的血和竟然也能被感染的僵尸胚胎,他决定…… 十分猥琐、诡异、令人百思不得其解但又因为实在是太操蛋了所以显得十分精彩地捡起来自己以前喜欢过的人的胚胎,用布抱起来,带着它启动车子准备回家,然后在路上看到了稻草人、稻草人和稻草人,以及一片又一片在城市里的稻草人。

我只能说我非常喜欢主角带走暗恋女生胚胎这个行为的扭曲感,乙一你果然还是没有让我失望啊,但下次选个更新颖的题材吧。

被钉在地球上的男人

作者:中田永一;评分:⭐⭐⭐+

男人是个年近三十的无业人士,父亲去世后和他的叔叔有着一些交流,某天他在新闻里看到有一辆汽车从太空中冲下来砸到地上,引起了很大的社会关注,在那之后不就,他的叔叔就去世了,是在家里搬运冰箱被压死的。叔叔在遗嘱里把实验室里的东西都留给了他,他本想把值钱的东西卖掉还债,结果发现了不少和时间跳跃有关的研究。

OK,读到这里的时候其实我就有不好的预感,因为…… 拜托!又是时间旅行?如果你想知道的话,我对时间旅行题材的态度是:

“I don’t do time travel”, Rick and Morty S4E8

不过作者很快就揭示了:鼠鼠我啊,研究的不是时间旅行,是平行宇宙啊。

……

行。

叔叔研究的时间跳跃会把人和物体直接弹射到对应时间点之后的太空上,如果是人进行时间旅行,就会受不了太空的恶劣环境而死亡(这解释了为什么会有汽车从天上掉下来),叔叔发现解决这个问题的办法就是改写程序,在时间旅行之后的一瞬间(原文是:无限趋近与零的时间)反向跳回相同的时间,就能保证人留在原地,也就是…… 只能穿越回现在的时间旅行。

不过,时间跳跃尽管只有一瞬间,但仍然对宇宙的运行产生了很大影响,比如改变天气和风向之类的,这样这个时间线上发生的事件也会改变,比如天突然下雨,在躲雨时遇到了未来的妻子之类的。这也就做到了,尽管是穿越到现在,却仍然改变了历史走向,实现在平行宇宙中穿越的效果。

行,说了这么多还是平行宇宙。

不过男主的穿越是单向的,无法回去,而去往的时间线里已经有一个自己了。起初他打算找到一个幸福的自己,把他杀掉然后代替他,可惜被制止了,引来了警察,在危急关头再次进行时间跳跃而幸免于难。在一次又一次的跳跃中,男人遇到了不同时间线里有不同遭遇的自己,也渐渐地放下了杀掉自己的念头。他买了一台相机,拍下在不同时间线里从事不同职业的自己,也收集新闻报纸上自己出车祸而亡的报道,以此来提醒那些出于人生低谷的自己,他们过得其实不差,因为有更差的自己存在。

他的最后一站,是自己在地震中失踪的时间线,而这个时间线的自己有着妻子和孩子,他们看到失踪多年的自己奇迹般地再次出现时都感动的痛哭流涕。于是他就留了下来,把用于时间跳跃的怀表还给了这个时间线里还没有死去的叔叔。他给家人拍了一张全家福,和其他时间线的自己的照片放在一起,永远珍藏。

还不错,可是,哎呀,要是在把怀表还给叔叔的那一刻意外按下了怀表,去到了另一个时间线无法回去,那小说就更好看了

噢等等,这是《瑞克与莫蒂》第四季第八集的剧情。

来自沉船的爱意

作者:乙一;评分:⭐⭐⭐

白乙一,讲的是父母即将离婚,作为姐姐的主角因为无法区分更爱爸爸还是更爱妈妈(毕竟爱是不能比较的),所以决定调查父母的经济情况,以便给自己和弟弟谋得一个好未来。由于父母常年吵架,弟弟总是很害怕,所以主角对弟弟有保护欲,而弟弟也很依赖姐姐。由于缺乏主见,弟弟决定跟着姐姐走,姐姐跟谁他就跟谁。

哦对,沉船指的是这艘正在沉没的婚姻和家庭,我本以为是带有浪漫色彩的科幻小说呢。

主角在调查中发现了很多疑点,父亲的婚外情和母亲的负债。其实,这两件事情都不能怪父亲或母亲任何一人,因为父亲的婚外情发生在他们的婚姻发生矛盾之后,而母亲的负债也是出于好心(她帮助一位好朋友做法人,结果出事之后好朋友人间蒸发,给她留下了难以还清的债务),至少主角是这样想的。

而母亲之所以想要在当下这个节点提出离婚,直接原因并非是失败的婚姻,她已经在很努力地维持这个家庭了。离婚的直接原因是负债,尽管她的父亲帮忙偿还了债务,但用的是给她妹妹留的结婚用的钱,母亲感到自责,正好又发现了丈夫的婚外情,于是收集证据,准备以此换取更多的离婚赔偿以补上妹妹的钱。

主角没有拆穿母亲,而是跟父亲要求,在分配财产时要让着妈妈,要说对母亲有利的话。

还不错,只是没有很对我的胃口,或许亲情是我难以共情的东西吧。

两张脸,一个人

作者:乙一;评分:⭐⭐⭐⭐

这就是我容易共情的故事了。

主角出生在信教的家庭里,大概是某种新兴宗教,有很多严格教义,父母对她常常打骂,因为教义里说打孩子的父母是好父母,否则就是管教不到位。他们甚至还有鞭具选择的潮流,一段时间流行皮带,一段时间流行鞋拔子,而且会专门选择声音响亮的器具,这样可以让教会里的长老听见,以展现自己的做父母的尽职尽责。

某天主角被母亲脱下裤子打的时候,由于手滑,鞋拔子飞到了她的耳后,出了血,之后那里留下了一个疮,不久后,伤口变成了人面疮,长出了眼睛、鼻子和嘴的结构,并且与主角共享感官。人面疮在主角跳楼之际制止了她,随后他们就成了无话不谈的朋友,也因为左耳后面长了个会说话的人面疮,主角逐渐拥有了活下去的勇气。

故事的主要情节是班里受欢迎的女生的包里出现了一只死猫,是班里大家都见过的小黑,是流浪猫,并且这只猫和女生的关系很好。由于大家都觉得主角是邪教成员,所以都认为是她杀的,可女生不那么认为,因为她见过主角和小黑相处的样子,主角对小动物很好。于是,女生和主角决定组队调查杀害小黑的凶手。

之后就是乙一比较擅长的悬疑和推理剧情了,阅读体验还不错,这里就不剧透凶手是谁了。

人面疮在调查过程中一直帮助主角,主角经常因为太紧张而说不出话,人面疮这个时候就会小声提醒她,在推理过程中,也为她出了很多主意,最后帮忙找到了凶手。在这个过程中,一直处于班级「种姓制度」底层的主角由于和位于「种姓制度」顶层的女生在一起行动,有了一些和人打好关系的机会,但她不敢行动,因为和染发的人一起玩会被父母责难,在他们的教义里,出入某些再正常不过的娱乐场所都会被认为是不正当的,会上不了天堂。

然而,人面疮一直在鼓励主角去做那些违背教义的事情,想让她获得自由和快乐。在小说的最后,人面疮还在主角耳后,被长发遮挡住,它开始思考自己究竟是什么,有没有可能是主角分裂出来的另一个人格,她的耳后其实并没有长疮;又或者,它其实是俯身在主角身上的撒旦,鼓励她去做那些违背教义的事情,也拯救了她的生命。

我喜欢这篇故事,读到最后的时候我想起了我在一年前写的一篇小说《 电梯里的无头天使 》,也讲述了主角与自己的恶魔对话的故事。实不相瞒,我更早的小说作品都被我当成黑历史不愿提及,但这篇我到现在依旧很喜欢,我还会偶尔想象有一个名叫阿莫法提的天使趴在自己的肩上,对一切都感到害怕,需要我来照顾。


最后

我最喜欢的一篇是《两张脸,一个人》,如果非要选第二个的话,那就是《被钉在地球上的男人》这一篇。什么?竟然不是《去买面包来!》吗?

整体上,我不推荐购买这本短篇集来读,除非你很喜欢《故事会》之类的风格,同时又能接受略微恐怖血腥的元素,又或者你很喜欢温情故事。就这样吧,希望我还能读到《夏天、烟火和我的尸体》这样的作品,那样的乙一已经有段时间没有读到了啊。

本书的优点:没有出现时间循环这类更老套的怪谈故事题材。

阅读文学如何帮我欣赏摇滚乐?

老实说,我完全不懂摇滚文化,我只是从一个读者和聆听者的角度来谈文学和音乐的关联,以及摇滚乐具有怎样的特殊性。这是一篇随笔,不谈摇滚精神和文学理论,只谈我的主观体会。

文学与音乐有何相似之处?

最简单的解释是,文学和音乐都是艺术,一个基于词句、段落和修辞,一个基于音符、节奏和旋律。只不过,人们在使用「音乐」这个词的时候有明确且唯一的指向,尽管有人会认为流行音乐中的「口水歌」不该被称作音乐,但这只是个人的观点,在客观意义上,我们可以轻易地区分出什么是音乐、什么不是音乐。

可对于文学,我们就不能做出同样的判断了。

文学是什么?

文学是“想象性作品”吗?那么,如何将《荷马史诗》与《理想国》区别开来?如何区别想象性很强的历史文本与想象性很弱的文学文本?文学是“虚构的叙事”吗?那么,我们如何将《红楼梦》和《项羽本记》区别开来?为什么有些虚构的作品是文学、有些却不是?文学是一种“突出的”、“陌生化的”语言吗?那么,我们如何将诗歌与民间世代口传的歌谣(比如流行于广西壮族的“哭丧歌”)区别开来?文学是一个“审美综合体”?判断“美”的标准是什么呢?它与道德有什么关系?文学是“语言的综合”,是一种“杂语”拼贴的结构?那么,综合它的原则和逻辑是什么?结构它的总体性是什么?或者干脆就说,文学就是那些经过历史筛选保存下来的“经典文本”,那么筛选标准是什么?究竟是谁在筛选?任何一种说法都会遭到来自各方的质疑。

——《中国当代文学与文化研究》张柠

在我看来,文学之所以难以定义,是因为语言本身复杂且用途广泛。人们用语言交流、记录、思考和创作。文学是语言的用途之一,而它很难被归纳为某一个用途的产物。如果说用于交流的语言不是文学,那名人的书信集难道不是文学吗?用于思考的文本只能是学术作品吗?虚构文学中难道没有展现出作者的思考吗?如果这些是文学,那博客写作算不算文学?声称自己写博客是在进行文学创作的人,到底是不是自负?

文学的定义是大部分人宁愿不谈的话题,保留文学这个词含义的模糊性并不会造成太大问题,而且文学本身就是模糊的。不过,为了本文的讨论能够进行,我还是要给文学临时地下一个总体上合理的定义。

从读者的角度来看,我认为 阅读应当是一种体验 ,那么,或许就可以把文学定义为「作为体验载体的文字」。软件文档、产品说明书和知识大纲等文本,不能算作文学作品,因为他们是「作为信息载体的文字」,同理,新闻是「作为资讯载体的文字」。博客写作,若是刻意创造了某种与诗歌、虚构文学和杂文写作类似的体验,大概也能称作文学作品。当然,文学作为学科的含义略有不同,一般是对经典作品的研究,符合上文所述定义的文本可能不在文学学科的研究范围内,本文不采用这种定义。

文学的体验和其他类型的体验有何不同?比如说,玩密室逃脱的恐怖体验与阅读克苏鲁神话的体验有何不同?我想用「场域」这个词来解释。前者发生在现实的场域中,后者发生在心智和精神的场域中,也就是语言能够触及的地方。

我们再设想另一种场景。有人说文字的力量能够击穿人的心灵,假设有人一辈子活在谎言里而不以为然,他突然被点醒可能有两种契机:一、他在阅读某篇文学作品时与文字产生了共鸣(无论是虚构文学的隐喻还是一针见血的论述),突然对人生产生了新的认识,决定做出改变;二、他经历了一些重大变故,譬如在意外中险些失去生命或者失去家人,也对人生产生了新的认识。这两种体验达成的效果似乎是类似的,也都触及了心灵的场域,但体验本身有何不同呢?

或许只能解释为「通道」的不同了。就像治疗疾病,药物可以通过不同的生物通道到达病灶,起到类似的效果。

音乐是什么?

音乐与文学的交汇或许是诗歌和歌谣,但音乐可以脱离语言存在,比如古典乐中就很少有歌词,主要由管弦乐演奏组成,现代音乐中也有轻音乐和纯音乐的类别,聆听非语言的声响本身就能够构成体验。

体验就是音乐与文学的相似性,从这个意义上来看,许多事物都与文学有相似性,比如吃饭。不过,就像不是所有文字都能被称作文学一样,不是所有进食行为都能算作合格的体验,匆匆进食而不在乎口味和口感,仅为填饱肚子的行为就不算。后者显然是为生存考虑的,如果忙于奔波,可能就没有时间和心力享受食物。对于音乐和文学也是这样,如果人类总是为生存担忧,就没有心思写诗作画了。如果人类没有闲暇,甚至不会诞生哲学,以及由哲学诞生的现代科学和工程技术。

如今的人们似乎卡在一个尴尬的位置:人们有精神需求,却日日为生存担忧,因为科技进步没有让人们的生活更轻松,反而因为生产效率提升,老板的欲望也跟着增加,人们要做的事情变多了。由于生产力在革新,旧的技术也在被淘汰,掌握旧技术的人担忧会失去赖以生存的职业。焦虑和抑郁情绪席卷世界,大家都很疲惫。

在生存压力带来的疲惫下,人们无力欣赏文学和音乐,以及任何能带来充分体验的事物,于是,网络小说和短视频出现了,用零碎的体验,让人们在为生存斗争的喘息之间,感到些许的满足。而这些满足本应该由更充分的体验来实现,比如听完一整场演奏、读完一整本书,可现在的人们看完一整场电影都抽不出时间,连吃饭都只能点外卖,把由另一个疲惫的、四处为生存奔波的人类送来的餐食快速消灭。

音乐和文学乃至许多体验载体的共同之处在于,它们能够满足人在生存之外的需求,但又因为现代人重新回到了为生存担忧的处境下而被忽视,不被欣赏。不过,值得庆幸,在这样的负面情绪之下,文学和音乐在部分群体中焕发新生,我说的当然不是短平快的网络文学和被商业行为主宰的部分流行乐。

我说的是文学和音乐的另一个作用,是一种特殊的体验类型:对现实的怒吼。

摇滚乐与噪音的音乐性

尽管摇滚乐并不诞生于前文所述的那种更近代的情绪中,但至少对我而言,摇滚相比于其他音乐流派,更能释放生存焦虑。要注意的是,本文要谈的并不是被过度浪漫化的摇滚精神,说实话,我也不懂这个词具体指代什么。

我想提及的是摇滚乐对音乐性的重视。在开始听摇滚乐之前,我的曲库里大多是流行乐,审美更接近大众,偏好抓耳的旋律和节奏。由业界顶级的音乐制作人制作的热门音乐,往往能激起重复的欲望,甚至接近本能。我记得我时常在听人半开玩笑地说考试前不要听歌,因为考试时脑子会无法停止重复播放音乐而难以思考。

音乐为什么会阻碍思考呢?音乐不会阻碍思考,阻碍思考的是其他的东西,是话语的重复。古希腊语中的 λόγος(罗马化为 logos,即「逻格斯」)意思是理性,也表示语言,话语是理性和思考的载体。如果热门歌曲只有音乐,没有歌词,话语的缺失就难以引发重复。

流行音乐为了捕获听众,强调的是音乐性与话语的融合,此外,话语也不是为了传达思想,而是为了引发重复。

音乐是对词句的否定,音乐是反话语。她渴望与萨比娜久久地拥抱在一起,不要说话,一句话也不要说,就让快感同音乐的狂乱喧嚣融合在一起。

——《 不能承受的生命之轻

将摇滚乐与其他更注重对乐器的运用和反话语的音乐形式区分开来的,是「噪音」。在摇滚乐中,人类的嘶吼、尖叫、呻吟是常见的,这些不利用乐器演奏也不利用话语讲述的声音实体,就是噪音。除了人声,摇滚乐也常常使用放大的吉他声和大量的鼓声,以及数种乐器的混合,尽管把这些声音称作噪音可能会被认为是对音乐的误读,但我想说噪音是中性词,说音乐是噪音并不是在说音乐没有美感。

相反,噪音极具力量,噪音是反话语却暗藏着语义。我会说,噪音是在诉说和控诉,但不运用语言,不运用理性和逻辑来表达和宣泄。

喜欢摇滚,因为可以在喧嚣中停止思考,用身体痛骂世界。

—— Eucalyptus

噪音中暗藏的语义是不被解释也不能被解释的,如前文所述,文学与现实事件给人的意义不在同一个通道,但能触及同一个场域,音乐也是,噪音的音乐性能够表达语义、触及心灵,但不走话语的通道,因为音乐是反话语。

语义是在对噪音的感知中自然产生的,与个体经验紧密相联。

突然想听摇滚,在 Apple Music 上找到了 Green Day,播放了《American Idiot》这张专辑,让吉他声和鼓声在我的颅骨里回响。我听不到世界的声音了,但我还是能听到,有人在几乎没有间隙的摇滚乐里,一遍一遍地告诉我:他不是你的灵魂伴侣。

—— He’s Not Your Soulmate

反话语的语义

我刚开始学尤克里里的时候,给一个朋友弹 Am 和弦,他说这像是深夜在没有人的街道步行。这是音乐作为反话语的语义,显然,这种语义是通过联想诞生的,而联想是主观且难以预测的。

阅读文学作品同样需要联想,联想到自己的过往经历和对事物的认知,并将其与文本中的实体联系起来。读到有人在天台上站着时,读者可能会联想到淡淡的绝望、无意义、空洞和自己的渺小。不同的是,阅读文学作品需要理性的联想,至少要读懂一篇文学作品是这样的。读者需要把握作者使用某个词的具体语义,或者某个场景的语义、某个角色的语义,也就是象征意义。文学作品大多数时候是使用虚构的现实描绘真实的现实,读者若要理解,就需要在虚拟与真实之间建立起关联,一一对应,然后捋清逻辑关系。

音乐或多或少也是这样,但我们将它与更抽象的情感联系起来,比如悲壮、激昂和欢快。摇滚乐所运用的噪音也具有这样的音乐性,但特别之处在于,它不描述现实,而是控诉现实。

摇滚乐除了流行乐常涉及的浪漫爱情主题之外,往往还带有极强的反叛气息,甚至反社会、反政府(当然不是所有摇滚乐都这样)。摇滚乐具体在反叛什么,说实话,我不关心。我欣赏摇滚乐的方式可能很不主流。

文学如何帮我欣赏摇滚乐?

尽管文学是体验的载体,尽管大多数时候是在描写,但总归是在运用理性和话语,是需要思考的。阅读文学时,我难免在话语之间建立理性的联想,试图搞明白作者究竟想要表达什么。

可聆听摇滚乐时,我可以停止思考,噪音会占满所有感官,让思考自然地停止,让我把身心全部献给噪音。我不需要搞明白作者要表达什么,因为音乐是人类共通的语言,一种反话语的语言,当噪音充填我的大脑时,联想就会自行运作,一种感受会在大脑中产生。在不断进行的音乐中,一切都是真理,未知是不存在的,因而不需要思考。这种真理甚至是存在于心智之外的,被噪音擒住时,身体会不自觉地移动。在乐器的巨响中,身体也加入了表达的盛会中。

简单来说,摇滚乐让我放下了文字和话语带给我的对真理的追求,让我放下了要把事情搞明白、把问题解决好的欲望。在音乐奏响的那一刻,我的求知欲和它引发的焦虑、不安和痛苦也都统统消失了,因为那个时候,我通过音乐、以话语无法触及的方式理解了一切。

正是因为需要思考,才需要停止思考,停下来感受。音乐就是后者的出口,噪音就是毫无拘束地释放。

写到最后,我想大概还是需要一句读起来没那么抽象的文字来收束全文:文学和音乐都是体验的载体,但文学是基于思考的,而音乐是纯粹的感官体验,而摇滚乐中极具力量感的噪音填满了感官,让思考停止;在反话语的喧嚣中,思考得以停止,焦虑得以作罢,情绪得到释放,灵魂得到解救,听者可以用最饱满的情绪和音乐带来的不可被言说的真理与世界作对。

去营地整点 FLAC

可能是神秘的 Bouba/Kiki 效应 ,FLAC 这个单词若是以 /flæk/ 的读音读出来,我会觉得这是一种脆脆的食物,或者是…… 某种精致小巧的计算机设备,极有可能是存储介质。

抛掉我发散的想象力,本文要说的 FLAC 其实是一种音频格式,全称是自由无损压缩编码(Free Lossless Audio Codec)。

自由与开放

在软件领域,Free 一般不是免费的意思,而是与法语和西班牙语中的 Libre 同义,是「自由」的意思。自由软件的具体定义是,任何人都能够自由研究、修改、分发修改前和修改后副本的软件。是的,这类软件一般是开源的,但开源是另一个概念。

FLAC 作为自由的开源项目,不仅包含对 FLAC 音频格式的规格制定,还包含相关的软件库和工具(libFLACmetaflac 等等)。仅对于这种格式而言,自由是指这个音频格式可以在不需事先许可的情况下使用。1

什么音频格式是不自由的?亚马逊开发的用于播放有声书的 .aa.aax 格式,苹果开发的用于 iTunes Store 的 .m4p(MPEG-4 Protected),以及微软开发的 .wma(Windows Media Audio)都是不自由的封闭格式。2这些格式不仅没有开源编码和解码器(也就是说,除非有人能够逆向工程编写出该格式的编码和解码器,否则就只有它的创造者能够制作和播放这种格式的音频文件),还添加了 DRM 能力。DRM 的全称是数字版权管理(Digital Rights Management),一般是指用户保护版权内容的相关授权和加密技术。

其实 .mp3 一开始并不是开放和自由格式,开发它的公司曾经试图向使用者收费,后来才有替代的算法被研发,用于解码和编码 .mp3 文件。即便是这样,.mp3 在 2017 年 4 月 16 日之前是受到专利保护的,直到最近几年才进入公有领域,成为了自由格式。3

开放格式(Open Format)和自由格式的概念不同,开放格式是指这个文件格式的标准和规格说明被定义在人人都可以访问的文档里,大家都能看到这个格式是如何制定的,并且能以此为依据编写编码和解码器。这个概念和开放标准(Open Standards)类似,其实前几天的 一篇文章 提到的 Webmention 也是开放标准,它的文档被 W3C 组织公开 于此 ,任何人都能根据这篇文档,自己实现 Webmention 发送器和接收器。如果标准不开放,就只能求助于逆向工程了。

对于普通人而言,这些技术规格的差异意味着什么?

显而易见的是,如果使用不自由、不开放的音频格式,尤其是那些带 DRM 保护、由某个企业开发的音频格式,用户很容易被锁死在一个平台上。假设你在网易云音乐上购买了一张专辑,某天你想换到 Spotify,你会发现你没办法把你在网易云音乐上购买的专辑导入到 Spotify 中,因为网易云给音频文件加上了保护,只有网易云音乐播放器才能解码文件。

这当然很不公平,明明是我自己付了钱买的音乐,为什么没办法随心所欲地播放呢?实体产品可不是这样,如果你购买了一张黑胶,把它放进任何一家企业生产的黑胶唱片机里,都能够播放音乐。

可以理解的是,数字产品很容易被复制和传播,为了保护版权所有者的权益,应该对文件进行加密。如果未付费的用户能够随意地获取并播放文件,那谁还会给他们付钱呢?谁还来支持他们的创作者?看起来,DRM 技术是必要的。

真的是这样吗?

好吧,其实我没有自信讲清楚这个问题,所以就允许我引用小氯写的一篇文章吧。

这又是一个被小氯讲了许多次的问题。只有那些躺在你硬盘里的、能被任何一种播放器打开的比特才是你的,否则,那就只是短暂的、脆弱的、被 DRM 层层包裹的、依靠施舍的租赁物而已。

当然,流媒体和 DRM 的支持者们可能会争辩:如果没有这样的措施,盗版就会泛滥,创作就无以为继了。这话不能说完全没有道理,但这种把开放格式当成洪水猛兽的思维,在小氯眼里不免有些狭隘。我们先不谈开放格式的道德性,这件事小氯可以和您讲一年,我们只谈商业模式。

我们可以从历史上一个著名的实验出发,即所谓 Louis C.K. 实验。

简单来说,Louis C.K. 是一位美国喜剧演员。2011 年,他在自己的网站做了一次尝试:销售自己的喜剧录影带 Live at the Beacon Theatre,就是一个普通的 MP4 文件,价格是五美元——远低于当时的 DVD 价格。Louis C.K. 当然也知道这容易被盗版,他的防御方式是……没有防御,只有一条消息。

「我是个普通人。我希望你们不要把它上传到盗版网站,这样我就可以用这笔钱支持我和团队。」

那么这场质朴的实验结果如何呢?

答案是:在短短十二天内,总销售额达到了一百万美元。

为了回应指责这种「路易模式」只是个例、完全无法推广的反驳者们的嘴,我们再来一些更现代的例子。比如说,Bandcamp。如果您不熟悉 BC:它是一个独立音乐平台,核心商业模式就是你付钱,获得可以下载的高音质开放格式文件,比如 .flac 和 .wav 之类。小氯闲着没事也喜欢去 BC 上买点 .flac 专辑听。

—— Garden of Outlier《 岁时录(二十三)

实际上,在音乐流媒体占据现代人生活之前,盗版就已经泛滥了,比如盗版光碟。即便是有 DRM 技术,逆向工程在大多数时候也都算容易,至少对于音频而言,普通人花点时间就能找到已有的解码工具。Paul Graham 在《黑客与画家》里写道,对黑客而言,上锁的门是一种侮辱,他们会想尽办法把锁撬开。

这对普通消费者而言也是侮辱:为什么我自己买的音乐无法以开放格式下载,用我喜欢的播放器播放?这不仅仅发生在音乐领域,我之前在 第 51 期周刊 里分享了一篇文章,作者逆向工程了 Kindle 的图书服务,因为亚马逊做的阅读器 App 实在是太烂了,而他发现他购买的图书竟然受到 DRM 保护,没办法导出为开放格式在别的阅读器里打开。

在我看来,DRM 技术不仅无法阻止盗版者,还是对消费者的不尊重。这就是像是有人在家周围建立起一堵高墙,为了防止盗贼,可小偷还是能用梯子爬进去,而邻居们却开始对这家人避而远之,总之是挺蠢的行为。

不过,如今愿意为音乐付费的人似乎在变少,但我认为主要原因是流媒体对大众消费习惯的影响,并非是人们不愿意为音乐付费。流媒体的话题会在稍后谈到。

音频格式和音质玄学

谈完了政治性极强的内容,这一小节来谈点轻松的话题。需要注意的是,我本人并非音乐相关的从业人士也绝非专业,所以我仅仅是从普通音乐爱好者的角度来谈这个问题。

我本人对音质其实并不敏感,至少在以前是这样,因为那时我听的大多是我称之为「天生适合跟唱」的歌曲,更关注歌词和旋律,而另一些注重节奏感的音乐则是「跟着摇就完事了」的态度。我之前并不明白一些人所说的「听个响」具体是指什么,只以为那是对低端音频播放设备的轻蔑,实际上并没有那么夸张。

是的,实际上这个描述非常准确。

播放设备之间的区别

本来《软件杂谈》这个系列里是不该出现硬件相关的描述的,不过音质这个话题的确离不开硬件。当然,再次强调,我仅仅是从自身体验的角度出发讨论这个问题,带有不可避免的主观性,还请读者注意甄别。

我自己购买过不少价格在 100~200 元左右的普通蓝牙耳机,我现在还在用的是三百左右的头戴式蓝牙耳机,而我目前主要使用的听歌设备是 AirPods 4(带主动降噪的版本)。头戴式耳机是为了保证沉浸感和降噪效果使用的,个人感觉物理隔绝比任何降噪技术都要好用,不过还是要将被动和主动降噪搭配使用才效果最好。

它们之间的差别真的很大……

首先,如果是听人声,那我的体验是:百元级和千元级的耳机几乎听不出区别。看视频、听播客和听那些「天生适合跟唱」的以人声为主的音乐,购买更贵的耳机不会有太多优势。

如果是有很多乐器和声效同时演奏的音频,千元级耳机的效果无疑是更优秀的。我只能将这种区别描述为:百元机耳机的声音是扁的,仿佛被拍成了一种声音;千元机耳机能够听出层次感,就像聆听现实中声音时,能在声音之间感受到发声位置、距离和质感的区别一样。在现实中,如果有多个声音同时发生,人可以选择将注意力集中在一种声音上倾听,选择音质好的设备也是类似的感受,而较差的耳机则不行,声音是糊成一团的,难以分辨。

当然,以上体验仍然与软件脱不了干系,使用了好的耳机,却仍然使用 MP3 播放音乐,仍然不能达到很好的效果。

由于我几乎不使用音响,所以这里就不谈了。

MP3 vs. FLAC:什么是无损?

无压缩、原样录制的音频往往是 .wav 格式,由微软开发,苹果也有对应的 .aiff 格式4。由于没有经过压缩,这类格式的文件体积也很大,储存成本很高。

于是就有了支持压缩的音频格式。谈到压缩,就要分出无损和有损两种压缩方式。听起来很像玄学的有损和无损两个词,其实是实打实的技术规格。

最典型的有损压缩格式是 .mp3,这类格式去除了人类不容易听到的声音,以压缩音频体积。大多数有损压缩格式都是这样,利用心理声学(Psychoacoustics),去掉对人类听觉不重要的声音。这些被去掉的声音就是「损」。自然地,无损压缩就是在不去掉任何声音的情况下减少音频体积。

这听起来还是很抽象,让我画个图。

音频进入编码器,被编码器编码为音频文件;音频文件进入解码器,被解码为音频。

音频 → 编码器 → 音频文件 → 解码器 → 音频

需要注意,这里的音频并非是物理世界的声波,而是经过脉冲编码调制(PCM)转化成的数字信号,是对模拟信号的编码。PCM 就是用比特(0 和 1)表示音频的方法,可以理解为声波在数字世界的一比一复刻(当然实际上不是 100% 精确的)。PCM 比特被输入到编码器中,得到了特定格式的音频文件,音频文件再作为解码器的输入被解码,解码的结果就是 PCM 比特。

对于无损压缩格式而言,编码器的输入和解码器的输出在比特层面是完全一致的。

对于有损压缩格式,比如 .mp3,编码后的音频文件无法通过解码器复原出一模一样的 PCM 比特,因此,音频的质量就被损坏了。

至于没有压缩的 .wav.aiff,它们储存的是完整的 PCM 编码。由于无损压缩的音频最终也能解码成一模一样的 PCM 数据,无损压缩和未压缩的格式在音质上完全没有区别——不是人耳听不出来,而是真的没有区别。使用未压缩的音频格式就像是买袋装薯片,大部分体积都是氮气而不是食物。

ALAC vs. FLAC:编码与容器

FLAC 并不是唯一的无损压缩格式,苹果有开发名为 Apple Lossless 的音频格式,也被称作 ALAC。FLAC 听起来更像美味的食物,而 ALAC 更像是化妆品、药品或者医美手术的名字,这就是 ALAC 的第一个缺陷。

这两种格式并不是完全相同的东西。

首先,FLAC 既是音频编码,也是容器格式(container format),所以有拓展名为 .flac 的音频文件。而 ALAC 只是音频编码,这种编码的音频需要被放在一个容器里,比如 .m4a.mp4(是的 MP4 其实是容器格式)。所谓容器格式,就是说这个文件里不仅有音频数据本身,还有相关的元信息,用来告诉读取这个文件的软件容器里放的是什么编码类型的数据。

话都说到这了,就谈谈 MP4 吧。一个有趣的事实是:MP4 文件里可以放 FLAC 编码的音频,因为 MP4 是容器而不是编码,只不过 FLAC 有自己的容器格式 .flac,所以一般没人会在 MP4 里放 FLAC 音频。里面装着音频的 MP4 一般以 .m4a 为拓展名而非 .mp4a 应该是指 audio),苹果的 ALAC 就是这样做的。

顺带一提,.wav.aiff 也是容器,里面放的编码是完全未经压缩的 PCM 比特。前面我们提到,FLAC 等无损压缩格式解码后就能得到和编码前完全一致的 PCM 比特,所以 .wav.aiff 对于听音频的人来说,在音质上和 .flac 没有任何区别。

这是 FLAC 的第一个优势(应该算吧):它不用放在 MP4 容器里。

其次,在 CPU 算力相同的情况下,ALAC 的解码时间是 FLAC 的四倍左右5,算法效率不如 FLAC。尽管播放 ALAC 音频时并不会出现明显的延迟,但消耗更多的时间解码意味着消耗更多的电力,对续航能力较差的设备来说不是好事。

其他方面,ALAC 和 FLAC 基本相同,但我们先前一直忽略了一个非常重要的指标,就是 PCM 音频本身的质量。如果 PCM 音频的质量本身就不太好,编码为 FLAC 或者 ALAC,最后在解码出来依然会得到一样质量的音频。有没有可能,ALAC 或者 FLAC 因为技术限制,无法编码某种高质量的音频,只能退而求其次去编码更低质量的音频,继而导致音质差异呢?

先前已经提过,几乎所有的音频格式都在处理 PCM,也就是对声波信号的数字化编码,而数字化不总是精确的。精度能够量化,最常见的两个数据就是采样率(sample rate)和比特深度(bit depth)。

现实中的声波是模拟信号,通常表示为光滑、不断变化的曲线。PCM 做的就是每隔一段时间取一次声波的振幅,并将这次测量结果表示为二进制数,连起来就得到了数字信号,如下图所示。

A、B 是两个波形图,A 图上有非常频繁出现的点,B 图上的点则相对稀疏,每个点都表示一次采样。

A 的采样率要高于 B 的采样率。

采样的频率就是采样率,单位是 kHz(千赫兹),也就是每秒采样几千次。ALAC 支持的最高采样率为 384 kHz,如果采样率更高就无法承受了;而 FLAC 支持的最高采样率为 1.048 MHz6。尽管大部分音乐播放器不一定支持这么高的采样率,音频本身的采样率也很少超过 100 kHz(我下载的音乐有不少采样率都只有 44.1kHz,听感依然很好),但…… 为什么不选一个更好的音频格式呢?又没有什么开销。

所谓比特深度,就是每次采样包含了多少比特的信息。深度其实就是字长(word length),是每次采样时,声波的振幅。比特深度不同的音频之间的区别,就像是 32 位操作系统和 64 位操作系统之间的区别,都能跑,但就是会有差别。

简单理解:采样率类似于帧率,比特深度类似于每帧的分辨率。

FLAC 支持 4~32 位的比特深度,而 ALAC 支持 16、20、24 和 32 位。7尽管两者的上限是一样的,但无疑 FLAC 的兼容性更广。

尽管由苹果开发,但 ALAC 的编码器也在几年前开源了(一开始并不是开源的),也早就有人不借助文档逆向工程开发了 ALAC 的解码器。所以,实际上 ALAC 也可以像 FLAC 一样自由使用。不过整体而言,FLAC 是更好的选择。

关于 FLAC 和 ALAC 以外的无损压缩格式,可以参照 Hydrogenaudio Wiki 上的 这张表格

亵渎艺术的商业流媒体

把整个音频文件都下载到本地后再播放,明显的缺点是慢,等待的时间很长。流式传输就是一边传输数据,一边解析已经收到的数据,就可以做到在没有获得完整音频文件的情况下播放音频,视频和其他长数据也可以使用流式传输。

流式传输是很常见的编程实践,本身是中立的技术,但商业化流媒体平台的发展引发了不少问题。

不过在正式谈流媒体之前,还要回到更久之前。

从上世纪 40 年代开始,人们就发现音乐的声音变得越来越响,这是发生在母带制作(mastering)时的事情。记住「母带」这个词,之后还会反复出现。随着数字信号处理技术的发展,音乐制作人开始利用计算机把音乐调得越来越响。

如图是一首名为《Super Trouper》的音乐,从 1980 年发布起,又有三个新的版本发布,每个版本都比上一个版本更响。8

这完全是出于商业考虑,更响的音乐会让人觉得更好听。像是吉他这样的乐器,由于本身发出的声音比较小,也会被单独调得更响。

可是,在被调得更响之前,《Super Trouper》就已经是热单了,有了很好的成绩。让它变得更响不仅不能让音乐的艺术性和娱乐性有任何提升,还会损伤听众的听力健康,而且,把音乐变响不仅仅是让声音更大那么简单。

提高响度实际上是在对音频进行压缩,让音乐的采样不断接近(甚至超过)音频格式和存储媒介支持的最大振幅,在极端情况下会造成明显的扰动和失真。9

好了,现在商业流媒体加入战局。由于不同时期的音乐响度不一致,不同的音乐制作人也会选择不同的调音策略,为了解决响度战争造成的听感问题(比如切换到下一首歌是音乐突然变响,或者突然变得难以听清),几乎所有的流媒体平台都开发了新的算法来均衡响度(loudness normalization)

Amazon Music、Apple Music、Soundcloud、Spotify、Tidal、Youtube 和 YouTube Music 使用算法均衡后的响度。

图源: Wikipedia

国内的情况我没有找到相关资料,但作为业界常见手段,应该可以推测国内流媒体也使用了类似的算法。值得一提的是,Bandcamp 是为数不多没有使用这种算法的音乐平台。

这看似是在给响度战争擦屁股,流媒体不是坏人,但恕我直言,这造就了更多的问题。首先,把已经提高响度的音频再降低响度,音频的质量相比原始音频肯定会有损失。其次,根据澳大利亚 Newcastle 大学的 一篇研究报告 ,音乐流媒体使用的响度均衡算法虽然是常见手段,但并不标准化,因为使用了不同的算法,不同平台使用的算法有完全不同的表现。这直接导致了在不同流媒体平台上播放相同的音乐,得到的可能是完全不同的效果。还有一些歌曲本身就比较安静,经过算法处理之后效果就完全不同了。

音乐制作人把音乐家的作品用技术手段提高响度,流媒体平台再插一脚进来用自己开发的算法调整响度,谁还在乎音乐家最初想要表达的东西?

比起允许平台亵渎音乐,直接对用户得到的音频数据做处理,我还不如把系统权限放开给你,允许你动我音量设置呢。许多流媒体有关闭响度均衡算法的设置,但再次恕我直言,这和「我们默认会收集你产生的数据训练 AI,但你可以在设置里关闭」是一样的。真的尊重用户的话,应该默认关闭,或者弹出显眼的提示框询问用户是否开启。

除了调整响度的算法,不同的流媒体平台可能还会有其他修改音频的算法,我印象中网易云音乐就有一些可选的类似音效滤镜的东西。不过这些算法是如何实现的,究竟对音频本身做了什么修改,我们不知道,毕竟它们不是开源的。

还有说法是,不同的流媒体平台可能会得到不同的母带(master recordings),得到什么版本的母带完全是由唱片公司决定的。这中间具体发生了什么交易,我们不知道,毕竟他们不会公开商业机密。不过,我个人倾向于相信,没有多少唱片公司会专门为不同的平台制作不同的母带,母带工程师的工资可不便宜。不过,据 Lucida 所言,一些艺术家和唱片会给流媒体提供增加过响度的音频文件,和 CD 里刻录的音频有所不同(至于黑胶,由于存储介质和原理完全不同,在制作母带时就会有差异)。

而且,流媒体究竟会不会给用户提供无损音频也是个问题。据说 Tidal 使用的是 FLAC 格式的音频,而 Apple Music 可以开启无损音频,提供的是 ALAC 格式。无损音频肯定比有损压缩的音频更占空间,消耗更多网络资源,大部分免费和部分付费(即 Freemium 模式)的平台可能都不会提供真正的无损音频格式。更何况,就算本身是无损格式,最终解码得到的 PCM 比特流真的和母带一模一样吗?中间有没有再做其他的处理?就算关掉了响度均衡也一样吗?我们不知道,再次强调,它们不是开源的

无论怎么看,流媒体上的音乐都很混乱。简单来说,流媒体是在音乐家和粉丝之间再加了一层中间人,而这两者之间本来就已经有唱片公司、发行商干扰了。加了这么多中间人,我们就不难想象那些真正创造音乐的人能被分到多少钱了。当然,我不关心那些钱多得能在里面游泳的大明星,我关心的是小艺术家。我喜欢 Lady Gaga 和她的作品,但我绝对不会同情她。

抛弃流媒体

既然流媒体这么混乱,那就跑路吧。要求每个人都购买 CD 听音乐是不现实的,那么有没有地方,可以直接获取高质量的音乐,以自由且开放的音频格式提供下载,并且能够直接向艺术家付款呢?

cartlE:你这个铺垫不是很到位,你前面都提了好几次 Bandcamp 了。

Eltrac:你别管!

去营地整点 FLAC

Bandcamp 是一个音乐销售平台,也提供流媒体播放,但一般来说,用户都会直接以 FLAC 格式下载音乐,平台也提供 ALAC、WAV 和 AIFF 等高质量音频格式和 MP3、AAC 等有损压缩格式。Bandcamp 上几乎都是独立艺术家,在这里,你可以直接给艺术家或者他们的唱片公司付费,他们最终会收到粉丝支付金额的 82%10

购买之后,Bandcamp 会显示「You own this」,表示你拥有这张专辑,之后可以无限流媒体播放,或者以任意格式下载到本地,用任何支持该格式的播放器播放。没有 DRM 加密,你真的拥有这张专辑。下载时还会标注音频的采样率和比特深度,可以说足够透明了。

这里没有什么大明星的音乐,真的会有人买这些小众乐队和音乐家的音乐吗?有的,截至目前,Bandcamp 上的粉丝总共为艺术家们支付了接近 17 亿美元,每天都会售出上万张专辑,每两到三秒就有一张专辑被卖出。你可以在他们的首页看到实时数据。

不过,要在 Bandcamp 上找到喜欢的音乐,一开始会有点困难,毕竟这里没有什么推荐算法,你只能看到一些电台和编辑挑选的专辑。我想这对习惯了听别人制作的歌单和自己收集歌单的人会特别不习惯,在这里你没办法在那些名字起得很文艺的歌单里听到随机出现的音乐,你只能找到编辑挑选的来自某张专辑的音乐。用户可以单独购买专辑里的一首曲子,但整体而言这里更注重专辑。

在我个人的体验里,Bandcamp 上的风格以电子(electronic)、另类(alternative)、实验性(experimental)居多,还有不少独立流行(indie pop)和各种类型的摇滚,总体而言是非常多样的。可以在自己感兴趣的类型列表里翻一翻,说不定会发现喜欢的,或者看看首页的「New and Notable」这一栏。我就在这里发现并购买了我的第一张摇滚专辑,来自 Red Sun Atacama 的《Summerchild》,购买之后还收到了一封感谢邮件,大概是自动发送,但发信地址是 @gmail.com,看起来是个人邮箱,而且内容都是亲自编写的纯文本,总之很亲切。

如果想发现一些完全不同的音乐,就去 Bandcamp 看看吧。

Let’s Pirate

可这样我还是不能离开主流的流媒体平台呀?我要去哪里听那些大歌手的音乐?

我当然不会说用百度网盘或者夸克网盘,这种被严格监管的、中心化的平台我是不信任的。想必不需要我来骂百度网盘,读者应该也可以自己想象了。

我建议读者尝试 Soulseek ,这是一个跨平台的 P2P 文件分享网络,带有房间、搜索引擎和搜索相关系统能帮助用户方便地找到有相同兴趣的人。Soulseek 上常分享一些小众音乐,在上面很容易找到音乐资源,不过,加入 Soulseek 网络之前,自己也需要准备一些文件来分享,因为一些 Soulseek 用户只会分享文件给那些也开放分享的人。

Soulseek 还有一个更现代的客户端,叫作 Nicotine+

谈到 P2P,你应该还知道另一种文件分享协议,名为 BitTorrent。这两种类型的文件分享网络都出现在 2001 年左右,不过我印象中 BitTorrent 更多地是用来分享视频文件的,尤其是电视剧和电影资源。

无疑,找资源是麻烦的。如果你只是讨厌商业流媒体的收费机制,不想忍受被 DRM 严格保护的封闭格式,也不想被流媒体平台的算法侮辱,不想给好几个流媒体平台付费,只是因为你喜欢的歌手们不在同一个平台上,那么我的建议是:直接从质量较好的流媒体上音乐吧。

Lucida 这个平台允许用户直接从 Qobuz、Tidal、Soundcloud、Deezer、Amazon Music 和 Yandex Music 下载较高质量的音乐。至于原理,就是使用他们在这些平台上的账号(或者用户捐赠的账号)接收音频流,转换成用户要求的格式,添加必要的元信息(专辑封面、艺术家信息和发行年份等),然后打包给用户下载。Lucida 还能直接下载一整张专辑,打包成 ZIP 文件下载。

顺带一提,Lucida 有提供开源的音乐下载库,用 TypeScript 编写,代码托管在 Codeberg 上。库是开源的,但 Lucida 网站的前后端目前并不是开源的, 据说 他们打算之后公开源代码。

这么做道德吗?不好说,但的确是违法的(摊手),所以 Soulseek 和 BitTorrent 等文件分享网络也仅在个人电脑之间建立,所以 Lucida 的开发者和维护者都是匿名的,用 Telegram 通信。你可能也听说了,前不久 Anna’s Archive 因为 备份了 Spotify 上的所有音乐 被起诉,受到了很多关注,失去了 .org 域名,最近也失去了 .li 等域名。他们在看到掀起了这么大的反应之后撤掉了网站上有关 Spotify 的链接。11

我对此的态度相当不专业,所以请谨慎对待:我更愿意把钱给 Bandcamp 上的小艺术家,那些头部音乐家不需要我的支持,更何况,我付给流媒体音乐的订阅费并不会被直接支付给他们。虽然我很愿意购买我喜欢的专辑,但他们只给我提供了流媒体和实体音乐(CD 或黑胶)这两个选项,那我只能找第三条路了。

本地音乐的魔力

我之前一直使用 Apple Music,开启了无损模式,照理来说,苹果会给我提供 ALAC 格式的音乐,照理来说,ALAC 解码之后得到的音乐和未压缩的音频是完全一致的。

令人意外,我能明显感受到我从 Lucida 上下载的专辑,听起来比 Apple Music 上播放的专辑,质量好太多,而我根本不是音乐发烧友,我使用的播放设备只是 AirPods 而已。我不认为这是安慰剂效应,因为我专门用同一首歌对比了本地播放的 FLAC 音乐和 Apple Music 上流式播放的音乐,真的有明显的不同。

但是,Lucida 不也是从流媒体上下载的音乐,转换成了 FLAC 格式而已吗?为什么会有音质差别?我想答案已经在上一节谈过了,流媒体很混乱,不同平台的播放效果不同。我们不清楚背后发生了什么,毕竟商业行为不是透明的,技术也不是开源的。我想要么是 Apple Music 拥有的母带质量比较差,要么悄悄地对源音频文件进行了有损压缩,要么加入了神秘的算法调整音频。

要提前说明的是,我能听出明显区别的音乐大多数都是摇滚乐、迪斯科和电子舞曲,或者是那些使用了大量乐器和电子合成的音乐,音频中包含很多细节。主要的不同是我从 Lucida 上下载的(准确来说是从 Amazon Music 或者 Tidal 上偷来的)音乐,音频中的细节更清晰,比如我使用 Apple Music 听音乐时,使用相同的设备,就从来没有听到 Lady Gaga 的《Venus》的背景里有一个空灵的声音在重复 TO THE PLANET,没有听到 Harry Styles 的《Dance No More》背景里一直有不同的人声在发出叫声。

顺带一提,我在本地播放《Artpop》这张专辑的时候感到非常意外,因为我突然听到了一首我从未听过的名为《Jewels N’ Drugs》的歌,打开 Apple Music 查看才发现 Track 5 的确从平台上被移除了,可能是审查机制。我印象中《Harry’s House》这张专辑里有一首歌也在 Apple Music 上听不到,而 Lady Gaga 的《Judas》也曾因为涉及宗教被不少国内平台封杀。

在本地播放的音乐,乐器或合成音的重音会更清晰,甚至有种砸地感。我甚至觉得,一些歌曲的质感在本地播放的质感完全不同,一些乐器的声音更突出,我听到了好多我之前没有听过的细节。

上面这些感受有可能是流媒体平台之间音频质量差异导致的,可能不具有代表性。于是我又在 Steam 上购买了《To The Moon》这款游戏的原声带(Steam 也提供 FLAC 格式下载),听完的感受是:我这辈子所有的《For River》都白听了。怎么回事?连钢琴的声音都有差别?

就算不谈略有争议的音质问题,播放本地音乐而不依赖流媒体也有其他无法替代的优势。首先,即便离开了网络,你也能播放喜欢的音乐;其次,即便离开了某个平台,你也能播放喜欢的音乐(因为你一开始就不在任何一个平台上);再次,即便离开了某个播放器,你也能播放喜欢的音乐,只要使用开放格式和支持解码这种格式的播放器就好。

本地音乐还会有一种收集的仪式感,因为必须要自己找音乐、下载、导入播放器。人们习惯了使用流媒体,或许时常忘了音乐是需要自己去发现的东西。即便没有能力消费 CD 和黑胶等实体音乐媒介,也能通过下载音乐到本地来体验收集的乐趣。

而且,以开放格式存储在你的硬盘里的音乐,真的就是你的啊!

我没有那么多硬盘空间怎么办?

你有。

一首采样率为 44.1kHz,比特深度为 16-bit,时长在 2-4 分钟左右的歌,大小约为 30MB。老实说,这比很多人做的 PPT 还小。假设一张专辑包含 15~20 首歌,大小就是 450-600MB。我下载了 18 张时长不一的专辑,占用了大约 7GB 的存储空间。假设一共下载了 100 张专辑,占用的空间大约是 50-60 GB。我记得我用了一年多的 Apple Music,听过的专辑都会本地缓存,才占用 30 GB 左右的本地空间。

放在以前可能很多,但对于现在的大多数人而言,这些存储空间不足为奇,随便买一块 U 盘或者硬盘就能存下。如果设备本身的存储空间就比较大,也可以直接存放在设备上。

对我而言,手机的存储空间除了放照片、聊天记录,剩下的就是音频文件了,管理得当就没有问题。

分析统计和推荐怎么办?

我很想发表暴论说,年度回顾和音乐统计之类的东西是流媒体给用户创造的需求,没有人需要被提醒自己今年最喜欢的歌手是谁,最喜欢的专辑是什么,播放得最多的歌是哪首——如果你真的喜欢,那你自己会知道的。不过,唉,我其实没资格说这话,因为我的确也想要一些实在的数据。

推荐算法在社交媒体和视频平台上可能是令人成瘾的毒瘤,但对想要发现新音乐的人来说,可能是真的有用。如果离开了流媒体,是不是也没有办法享受这些服务了呢?当然不是。

Last.fm 提供音乐追踪服务,你可以使用支持 last.fm 的播放器或者相关插件,向这个服务发送 Scrobble,它就会记录你播放了什么音乐。所谓 Scrobble 就是对一次播放音乐的记录,只有一首歌播放时长超过一半的时候才会算作 Scrobble。有了记录之后你可以查看上周、上个月和去年的听歌报告,最近听了什么歌,听得最多的艺人和专辑是什么,last.fm 还会显示你当前正在播放什么歌。当然,last.fm 也会根据你的喜好为你推荐专辑和歌手。

他们有提供详细的 API 文档 ,只要向对应的 URL 发送 POST 请求即可。如果你的播放器不支持 last.fm,大概也能很容易地找到或者自己做一个插件。再者,媒体播放一般都受到操作系统控制,所以理论上可以在操作系统层面监听音乐播放情况,然后发送记录。

值得一提的是,last.fm 是 Paramount (一家美国的大型娱乐集团)旗下的服务,大概率不兼容 GDPR 法案,注重隐私的用户需要谨慎考虑。不过我觉得,自己听了什么歌这种数据,并没有太敏感。

搜索之后我并没有找到 last.fm 的替代方案(倒是有个 stats.fm ,但那是给 Spotify 用的),自由软件就别想了。或许可以做一个兼容 Scrobble 的开源自托管后端,把数据都掌握在自己手上。

歌词怎么办?

从我自己的体验来看,听歌时看歌词其实不是硬性需求,音乐播放器又不是全民 K 歌。对我而言,除非我在听华语和英语以外的语言,我基本都能听清歌手在唱什么,而且很多时候听清歌词并不重要,尤其是在听摇滚乐的时候。我回想起小学和初中时看 Minecraft 游戏实况的时候,所有的实况主几乎都没有做字幕,而我也看得很投入,一看就是四十分钟以上,很少出现听不懂的情况。反观现在,给视频加上 AI 识别的低质量字幕已经是惯用手段了。人们愿意用来阅读大段文字的时间变少了,对字幕和歌词的需求却与日俱增,真是令人唏嘘。

就跟写代码的时候其实不需要有一个文件目录树一直放在编辑器界面占位置一样(是的,不需要,只要熟悉项目结构就可以用模糊搜索跳转到文件,速度还更快,不熟悉的话才需要看目录树),听歌的时候也不需要有歌词一直在跑,等需要看歌词的时候再专门找歌词来看就好。

找歌词的平台,最全的应该是 Genius 。如果不想被追踪、不想运行不自由的 JavaScript 代码,它还有两个替代前端 DumbIntellectual 12,我只用过前者,体验还不错。

大部分时候只享受音乐就好,在需要的时候再找歌词。

至于歌词翻译,我又要发表暴论了,请做好准备:我不明白为什么人们会执着于那些自以为是、文绉绉、沉溺在自我感动里亵渎艺术家原义、味儿能冲出屏幕的低质量歌词翻译,你都在听外文歌曲了,请欣赏原文!

我无意指责志愿者无偿的翻译工作,我只是不赞赏这种文化,我也不认为因为做这些工作的人是志愿者就可以忍受低质量的成果。我在《 翻译的吃力不讨好 》这篇文章里表达的观点如下:

在译文里加上原文没有的东西造成了意思传达的偏差,是不能容忍的;如果这种错误的改动是为了「呈现效果」而非纯粹的技艺不精,做出这种行为的译者是偷懒、不负责任且不尊重原作的。

翻译很难,甚至吃力不讨好,应该被理解,但这不代表坏的翻译应该被容忍。

再好的译者也无法把翻译做到完美,如果想要毫无偏差的呈现,比起对质量尚可的翻译吹毛求疵,不如直接去读原文。

前不久 Apple Music 也添加了歌词翻译13(据说这个平台常年被诟病没有歌词翻译),不过并不是像国内流媒体那样允许用户自己提交歌词和翻译,而是找了专业的人来做翻译,并且要求按照原义呈现。严格翻译标准导致的结果也不能让用户满意,不少人觉得那些直白的翻译很好笑。

我们或许可以同意:诗是没有办法被翻译成另一种语言的。歌词也同理,就算是那些被批评满是口水话的歌,也可能包含双关语等难以被翻译的元素。

综上所述,我的态度是:不需要翻译。

为什么不自建流媒体?

诚然,可以用 Navidrome 等开源软件自己搭建流媒体服务,对于有 NAS14 设备的用户来说应该很方便,而且找到支持相关服务的播放器也不难。

可这么做的成本不低,需要一台 NAS 或者云服务器,需要运行软件占用网络带宽和内存资源,反观本地音乐,只需要一个播放器和音频文件本身就够了。在我看来,除非是要给家人和朋友也提供服务,或者托管数量很多的音乐,否则没必要自建流媒体服务。当然,如果是想折腾技术玩玩的话,也是很不错的。

前文已经讲过了,设备的本地存储在大多数时候够用,也可以购买廉价的外部存储作为拓展,存放不常听的音乐。

要怎么给朋友分享喜欢的歌?

“嘿,我刚听了 Harry Styles 的《Aperture》,感觉你会喜欢,也推荐你听听。”

此处应该有黑人摊手迷因图。

话说回来,就算没有离开流媒体,你和你的朋友真的在同一个平台上吗?你在 Spotify 上听的歌若是直接分享给使用网易云音乐的对方,恐怕也是不行的吧?如果是国内的流媒体,分享时还会生成链接卡片指向难用的微信小程序或者无法直接跳转的网页,这真的比直接分享歌名和歌手名字更好吗?

另外,我说过一首歌的大小比很多人做的 PPT 还小,所以…… 为什么不直接发音频文件给对方呢?

至于歌单(或者说播放列表),这的确是个问题,分享歌单没有那么容易。本地播放器大部分都是以专辑为单位管理音乐的,但有一些也支持创建歌单,只不过不能像流媒体那样方便地分享出去。所以…… 为什么不打包成 ZIP 文件发给…… 算了,还是不太现实。不过歌单这个东西,尽管有第三方的同步工具,但仍然是锁死在平台上的,留在流媒体上也没有让分享很方便,除非你和朋友在同一个平台上。

我想或许可以开发一套开放协议,用歌曲元信息组成歌曲列表,以开放格式(比如 JSON)存储歌单信息,让播放器读取。

很主观的建议:忘掉歌单,听一张完整的专辑吧。

最后

我不是只想记录一下我抛弃流媒体,拥抱本地音乐的心路历程吗?怎么一路狂飙,从开放格式写到数字信号处理,又写到响度战争和 Piracy 了?

事已至此,就这样吧。

希望你也能自由地听到自己喜欢的音乐。


  1. 参见: FLAC - 维基百科  ↩︎

  2. 参见: Audio file format - Wikipedia  ↩︎

  3. 参见: MP3 - Wikipedia音频文件格式 - 维基百科  ↩︎

  4. 参见: WAV - WikipediaAudio Interchange File Format  ↩︎

  5. 来源: Apple Lossless Audio Codec - Wikipedia  ↩︎

  6. 来源: RFC 9639  ↩︎

  7. 来源: RFC 9639ALAC - Wikipedia  ↩︎

  8. 来源: Loudness War - Wikipedia  ↩︎

  9. 参见: Loudness War - Wikipedia  ↩︎

  10. 这是平均数,数据来源于 Bandcamp 的 关于页面 。 ↩︎

  11. 不过,如果你想的话,可以去他们的 Matrix 群组 上找人要 BitTorrent 链接。但那是一整个 Spotify 上的音乐,除非是想要帮忙备份,就算了。 ↩︎

  12. 这个命名方式也太 Genius 了…… ↩︎

  13. 参见: iOS 26 中的 Apple Music 更新  ↩︎

  14. Network Attached Storage,网络附接存储,一般放在家里当作私人网盘。 ↩︎

稻草人周刊 Vol.73

Kiss All The Time. Disco, Occasionally. music cover

Kiss All The Time. Disco, Occasionally. 专辑

Harry Styles

Harry Styles 在三月初发布的新专辑,我居然在中旬才发现。印象中,专辑发布的时候 Apple Music 有给我推荐这张专辑,但看到封面的时候根本没想到这是 Harry Styles 的专辑。最喜欢的几首:《Ready, Steady, Go!》《Dance No More》《Carla’s Song》。

不过,你的 MV 到底是在闹哪样啊?


开始之前

从本期开始,《稻草人周刊》不会包含任何与大语言模型及其应用的相关内容。如果出现了,请发邮件狠狠地谴责我。如果我真的要谈这门技术,我会专门写一篇文章来谈。周刊对大模型话题的单向封锁是为了表态:除了大模型,有趣的技术和话题不少而且更能激发我的好奇心;我不讨厌技术本身(除了 OpenClaw,我很讨厌它),但我讨厌对技术的滥用、自以为是和陈词滥调。

爱的反义词不是恨,而是漠不关心,所以接下来很长一段时间内我都不会关心它。


连接

在老鼠的世界里做一只浣熊

📻

现代科学使用的其实并非自然的老鼠,而是人工培育的近亲繁殖实验室老鼠,是老鼠和兄弟姐妹繁殖二十几代后诞生出的基因完全相同的老鼠,把控制变量这件事情做到了极致。

除了基因受到完全的控制以外,老鼠成为完美的实验室动物还有另一个原因:他们天生听话、勤勉且能干。相比之下,浣熊就是混沌的生物,会在被训练执行某些动作的时候做出非议所思的行为。浣熊不会像老鼠一样乖乖走迷宫,而是会把一切都破坏掉,浣熊只想要破坏

现代科学通过老鼠研究人类,正是假设人类和听话的老鼠更相似。由于老鼠非常听话,所以它们的行为是可预测的,一切都能够量化。以此建立起来的科学理论也因此认为,人类行为也是可预测、可量化的,人类不会像浣熊一样无法预测,比如,现代心理学抛弃了对难以量化的意识的研究,转而用科学的方法研究行为,认为一切没有表现出来、不能被量化、不能被预测的存在都不值得研究(或者说,都不存在)。在我看来,与此相关的还有行为经济学,以及各种研究人类行为的理论。

仔细思考一下,现代社会的一切规则,似乎都建立在「人类像老鼠一样听话」的假设上,浣熊一样的人类会扰乱秩序,因为浣熊一样的人类无法被预测行为、无法被量化,也就不存在价值。实验室使用老鼠而不是浣熊,是因为人们认为浣熊不便管理,不能为科学提供价值,不像听话的老鼠。人类社会也是一样。

听完这些叙述,我感到背脊发凉。

我其实有在异宠店接触过浣熊这种生物,当时我在逗一只翅膀受伤的鹦鹉,店主告诉我它是被那只浣熊咬伤的。鹦鹉站在我手上的时候,店主不得不给它套上铰链,因为担心它会飞到浣熊那里,再次被咬伤。当时鹦鹉一直在用喙啄脚上的链子,因为那让它很不舒服。那只浣熊被关在笼子里,放在店铺的最角落。店主说:“如果没有它,我们这里管理起来就方便很多了。”

店主当然是爱动物的人,她会做出这样的评价,是因为浣熊在客观意义上就是对其他生物非常不友好的存在。因为好奇心旺盛,它们会偷走顾客的手表和戒指,会用肥硕的身躯撞击笼子,会抓扯和撕咬他们看到的一切。

但是,我能说浣熊不应该存在于这个世界上吗?不,浣熊只是不应该被关在笼子里。老鼠或许能忍受,每天能得到一些食物碎屑就很开心了,能够勤勉地工作好几个小时,但浣熊会说:生命很短,吃垃圾吧,自由生活。

网页横幅按钮考古

📜

一篇介绍复古和早古网站中常用的按钮图片的文章,包含 88x31 和 200x60 等尺寸。我原本只知道流行于 IndieWeb 和 Neocities 社群的 88x31 尺寸,竟然还有其他尺寸的规范,长见识了。

其实上周我就悄悄给 林卷 页面添加了 88x31 按钮,也和一些朋友做了交换,似乎还在联邦宇宙上带起了一波小小的热潮?总之有一些朋友看到我的按钮之后也制作了自己的 88x31 徽标,而且一个个都做得比我好看,你们真的……

我觉得交换按钮和交换友情链接是有很大不同的,比起可能有些复杂的人情世故,交换按钮对我来说更像是一种收集爱好。就像收集邮票一样,在互联网上发现了喜爱的内容,可能是有趣的人也可能是某种理念、建议和有趣的句子( 88x31.nl 上收集了很多按钮,上面有类似「最好使用桌面端访问这个网站」的实用型按钮),就可以放到自己的网站上作为收藏,也不总是要交换。

容器术语实用介绍

📜

这周给 Weepinbell 做了样例的 Dockerfiledocker-compose.yml,这样用户只要把仓库克隆下来,直接运行 docker compose up -d(或者 Podman,应该是兼容的?)就可以容器化部署了。

这个过程中踩了一些坑,我突然意识到自己虽然有使用 Docker 的经验,但对一些基本概念不甚了解,至少我现有的知识不足以支持我发布一个可以用 Docker 部署的应用。

于是我找到了这篇《容器术语使用指南》,我认为在了解一个概念和体系之前,从术语入手是最容易的。一方面,理解术语的意思就是理解概念本身;另一方面,了解规范的术语使用也能极大地帮助自己阅读其他相关的文章、和其他人讨论相关话题。我见过很多失焦的讨论源自于对同一个词的理解不同,想必在技术领域,规范使用术语尤为重要。

切换到 MVNO

📜

本文介绍了一种省钱方法,就是把电信提供商替换为 MVNO。我在这里引用维基百科的定义解释什么是 MVNO。

移动虚拟网络运营商(Mobile virtual network operator,MVNO)是指不拥有无线网络基础设施,向消费者提供无线通信服务的电信运营商。移动虚拟网络运营商向传统运营商批发通信服务后,制定具有自己特点的套餐提供给消费者。移动虚拟网络运营商可以使用自己的客户服务体系、计费系统、销售人员,也可以使用移动虚拟网络(MVNE)的技术服务。1

简单来说,MVNO 向传统电信运营商租赁通信服务,然后自己销售。根据作者所述,这实际上会比直接购买传统运营商的服务更便宜,唯一的缺点是,在人多的地方,MVNO 用户的数据优先级会被降低,比如,在 Taylor Swift 演唱会上直播就不太现实了。

国内也有 MVNO 服务,官方名称叫作「移动通信转售」,不过有单独的 号码段 ,大概是不能保留号码无缝切换的,我也没有仔细研究,所以不知道国内这种服务是否具有价格优势。

去你的,做个网站不行吗?

📜

You don’t own shit that you put on social media platforms. You don’t own your follower counts, you don’t own your posts. Stop giving away all of your shit to data harvesters and advertisers for free in exchange for the illusion of importance that comes with likes and a follower count.

你放到社交媒体平台上的东西不是你自己的。你不拥有你的粉丝数,你不拥有你的帖文。别再免费把你的东西交给数据收割者和广告商了,那只能换取点赞数和粉丝数很重要的幻觉而已。

作者实际上不是在给出有关数字主权的建议,而是在抱怨商家为什么一定要在社交媒体上发布消息(当然,个人用户也可以参考这些建议)。作者不使用社交媒体,已经很久没有注册过账号了,可他仍然希望了解一些餐馆和线下商户的信息,如果他们能在网站上放上菜单和营业时间就再好不过了。

可如今,搭建一个网站似乎变得很麻烦(至少人们认为很麻烦),大多数商户都会选择在 Instagram 上注册账号,请顾客关注(国内的话,应该是小红书和大众点评吧)。

尽管很认同作者的观点,但我实在不觉得这类说辞和呼吁能起到什么实际作用。商家全都转向社交媒体是市场的供需关系决定的,如果商家不这么做,而是花更多的时间精力去搭建很多人可能根本就不知道如何访问的网站,就是在浪费钱,而且在面对其他使用社交媒体与消费者建立联系的那些商家时,固执地搭建网站的商家会失去竞争力,最终…… 消失,除非商户能在其他方面发展很强的竞争力。

所以这类观点是无法作用于商业世界的,只能作为对个人的建议。最后,我也想说,远离传统社交媒体,加入 联邦宇宙 吧,或者在独立博客网络上建立更深度的交流,抑或者,完全远离社交媒体,去过好自己的现实生活。

星群

Farside

Farside 是一个重定向工具,将访问者从某个大平台的链接重定向到自由且开源的替代前端实例上。替代前端(alternative frontends)一般是注重隐私,没有添加任何跟踪器,只有很少 JavaScript 代码的前端,也就是说,不用亲自访问某个大平台的服务,不直接建立连接,就能够通过另一个前端使用他们的部分服务。这类项目也叫作隐私前端(privacy frontends)。

对于 YouTube,有 Invidious 。Reddit、Twitter、Wikipedia、Medium、GitHub 甚至 Google Translate 等服务都有自由软件社区维护的隐私前端源代码,不同的人和组织托管了公用的隐私前端实例供所有人使用,免受大科技公司的跟踪,避免在浏览器中运行非自由的 JavaScript 脚本。

由于维护这些前端实例的往往是自愿者,而 YouTube 这类视频流量往往会消耗很多资源,所以 Farside 的另一个作用是在这些隐私前端实例之间均衡地分配流量,避免遇到瓶颈和速率限制。

Farside 本身作为重定向服务也可以自托管,有多个实例。有一些浏览器插件(如 PrivacyRedirect+ )利用 Farside 实现了这样的效果,在浏览器中点击任意大平台链接都会跳转到对应的隐私前端。如果想要分享来自某个大平台的内容,与其使用源链接,不如使用 Farside 链接更能保障被分享者的隐私。

访问: Farside

Ghostling

Ghostty 是我日常一直使用的终端模拟器(实际上我现在就在用 Ghostty 运行 Neovim 编辑这段文字),之前听 这期采访播客 的时候就了解到 Mitchell 开发了一个名为 libghostty 的 C 语言库,是 Ghostty 的内核,提供了基础且核心的终端能力。

这周 Mitchell 发布了 Ghostling(意思是……「小鬼」?),用 libghostty 开发的最小终端应用,目的是展示这个库的能力(顺带鼓励更多的人用 libghostty 开发其他应用,我猜是这样)。

The Ghostling terminal isn’t meant to be a full featured, daily use terminal. It is a minimal viable terminal based on libghostty. Also, since this is basically a demo, I didn’t carefully audit every single place for correctness, and this is C, so you’ve been warned!

Ghostling 不会添加完整的功能,不是日常使用的终端。这是基于 libghostty 的最小可行性终端。再者,由于这基本上只是个演示程序,我没有仔细地审计每一个地方,而且这是 C 写的,我已经警告过你了!

那期播客里 Mitchell 表示 libghostty 作为一个 C 语言库可以用在很多地方,任何人都能轻易地在自己的应用里嵌入一个终端,或者开发新的终端模拟器。浏览器作为 Web 的入口已经被开发得很完全了,而终端却较少受到关注,希望借助 libghostty,终端的生态也能变得丰富起来。

访问: ghostling

Doppler

啊,稻草人周刊已经有多久没出现闭源商业软件了?

我从今年年初就开始设立目标,尽可能全面拥抱自由软件,减少对闭源商业软件的依赖。我首先是逃离了大平台,然后逐渐用自由的解决方案代替 Google、Apple 和 Microsoft 提供的服务。这周我把刀口指向了音乐流媒体——我取消了 Apple Music 的订阅。

是的,有大学生优惠的话,Apple Music 仅需 ¥6 一个月,实际上相当划算(更何况我在最初还享受了半年的免费 Apple Music 订阅,买新 iPhone 似乎都能享受)。

我这里就不打算谈流媒体平台对小艺术家有多么不公平了,我下周会专门写一篇文章谈我从流媒体平台上退出这件事情。总而言之,现在我开始在 Bandcamp 上购买专辑并下载 FLAC 格式的高质量音频,开始用 Lucida 下载那些头部歌手的音乐。染上本地音乐之后,当然要给自己找一个称手的播放器。我平时用手机和 AirPods 听歌,所以在 iOS 上找一个自由且开源的音乐播放器就好……

你做梦。

在 iOS 生态里找存活下来的自由软件实在是太难了(本想说有机会就换到安卓,但 Google 最近又在搞事情,那边也不太平啊),好在我不是完全排斥闭源软件。我找到了一位独立开发者开发的口碑不错的音乐播放器,名叫 Doppler,作者 Ed 在 Mastodon 上还有 账号 。软件的 UI/UX 很舒服,试用了三天还没有遇到任何问题。

Doppler 有七天的试用期,买断价格十分合理,是 ¥58 人民币。这在 iOS 应用里是很好的盈利模式了,有不少 iOS 应用(可以说大多数)都会在用户第一次打开软件,还没有开始使用任何功能的时候,弹出流氓一般的优惠信息和购买按钮,关闭按钮藏得很深,有时候甚至根本没有。

总之,如果你也有在 iOS 上播放本地音乐的需求,可以尝试 Doppler,我对它的印象不错。

Doppler 播放界面
Doppler 资料库
Doppler 导入界面
Doppler 专辑列表
Doppler 喜欢的音乐

访问: Doppler

切片

  • 水逆结束了,不知道自己是不是什么高灵性玄学体质,水星开始和结束逆行的时候会有非常明显的感知(就算没有关注并且忘记了相关天象的时间点)。尤其是水逆结束的时候,会在当天凌晨开始感到神清气爽和精神焕发,抑郁情绪几乎很快就消失了,看不开的事情也很快看开了,语言组织能力也开始慢慢恢复。总之非常神秘。

  • Lucida 2 下载了 FLAC 格式的专辑在本地播放,音质…… 我去这个音质连我这个木头耳朵都能听出区别,比流媒体好太多,听到了好多之前没听到的细节——被流媒体害惨了。

  • 在家有室友穿透力极强的咳嗽和外放音乐(他大概觉得外放钢琴曲没有什么问题吧),出门去西西弗找地方坐,结果里面挤满了人,最后逃到学校图书馆,终于获得了安静…… 只是,为什么有人会恬不知耻地在图书馆这种地方打电话、在桌子下面踢腿和拖椅子啊!

    我不想戴耳机,我只想要绝对的安静。

    塞涅卡听了大概会说:内心平静才是最重要的,哪怕在闹市我也能专心写作——闭嘴吧,你们斯多葛主义哲学家!我要做浣熊,我要把你们吵闹的人都杀了!


  1. 参见: 移动虚拟网络运营商  ↩︎

  2. Lucida 的 88x31 按钮已加入 林卷 页面。 ↩︎

❌