这是音乐剧《Little Shop of Horror》(恐怖小店)的原声带,说实在的,其实没有特别好听,百听不厌的几首只有《Dentist》《Feed Me》或许还有《Suddenly, Seymour》。音乐剧也没有什么深意,如果要看反映底层人民生活的音乐剧,《吉屋出租》兴许更好。对于一部上世纪的音乐剧来说,《恐怖小店》的经典就在于它融合了喜剧、悲剧和血腥恐怖。至少…… 结局的时候看到被花吃掉的主演穿着花衣服走出来唱「Don’t feed the plant!」的时候,还是很喜感的。
另外,《恐怖小店》中 Audrey Two 的形象,貌似是《植物大战僵尸》和《超级马里奥》中食人花形象的来源?我不确定,但总觉得它们之间是有联系的。
心重如毛
仲树让我反思播客这一媒介
说实话,我的心情很复杂,在这周的某天打开小红书之前,我都还是《独树不成林》的忠实听众,尤其喜欢运动、文学、哲学以及闲聊内容。大概是因为和诺兰的采访为她带来了更多的名气和关注,过往的未被发掘的事件也被端到了公众面前。事情是有人发现包括《洛丽塔应该被禁吗?》(我还在
第 75 期周刊
分享过收听这期播客产生的感想)在内的不少单集,在内容、结构、例证等方面都与
Old School with Shilo Brooks
等播客的相关单集高度重合,疑似洗稿。
洗稿事件本身是否属实,我没有考证过,所以这里不下定论,我也失去兴趣了,读者可以自行对比。社交媒体上的骂声也没有什么好看的,我不建议读者让自己陷入混乱的情绪旋涡里。我甚至在她最近一期播客的评论区下看到有人用 LLM 生成了最新的洗稿「铁证」,评论内容还包含没删干净的 Markdown 格式。总之舆论环境中充斥着只要站在反对立场上,谁都可以去踩一脚的言论,甚者,有人尽力克制情绪,冷静地要求仲树以事实证据回应,却被根本没有认真读评论的人当作仲树的支持者,回复说「我能不能把你的作品也拿去洗稿?」。另外国内平台显示 IP 属地的设计真是肮脏,有人仅仅因为他人的 IP 属地为上海,就说「我知道你在上海工作压力大,但你也不能这么骂人啊」。我只能说,仲树本人和这些参与舆论的人,都不是聪明人。
Rust 是门好语言,但开发者们对它过于强烈的追捧,竟让我对它生起一丝厌恶来。你们怎么一个一个的都争着把本来就能跑的代码重写成 Rust?而且还是用 LLM 重写?新兴 JavaScript 运行时、Node.js 的后继和竞品
Bun
在前不久也用 Claude 把原来的 Zig 代码重写成 Rust。据我所知,Zig 的社群相当有凝聚力,当时他们就对 Bun 的重写感到失望。事到如今,Bun 的创造者 Jarred Sumner 终于自食恶果了。
6 months ago, most of Bun’s PRs came from people prompting Claude. Nowadays, most of Bun’s PRs come from Claude prompting Claude.
六个月前,大部分 Bun 的 PR 还来自人们给 Claude 输的提示词。如今,大部分 Bun 的 PR 已经是 Claude 给 Claude 写提示词产生的了。
Zig 软件基金会的主席
Andrew Kelly
表示,Jarred 在 LLM 之前写的 Zig 代码就已经不堪入目了。Zig 团队会阅读用户写的代码,以此了解当前这门语言是怎么影响用户的。当他们读到 Jarred 写的代码时,他们吓呆(horrified)了:
We became increasingly horrified at the programming practices we saw in Bun’s codebase. Hacks on top of hacks. Abuse of assertions. Most of all, recklessly speeding past feature after feature with very little time taken for reflection and elimination of bugs and technical debt. Jarred was already writing slop well before he had access to LLMs.
我们对 Bun 代码库里的编程实践感到越来越害怕。Hack 一个接一个。滥用断言。最严重的是,鲁莽地加速推出一个又一个的新功能,几乎没有花时间反思、消除 Bug 和技术债。Jarred 在能使用 LLM 之前就已经在写废料了。
他是怎么搞清楚 Claude 都做了些什么的?他怎么保证交付可靠的软件产品?答案:他没有。如果他真的清楚自己的项目进行到什么步骤了,还需要解决什么问题,他不会这么拿不准 Bun 1.4 的发布日期,屡次推迟。Jarred 显然不知道自己在干什么,在 Andrew Kelly 与 Oven 的员工(以及那些面试过 Oven 的人)的交谈中,他得知 Jarred 是个相当糟糕的管理者:
Jarred was a stinky manager. Poor communication, unrealistic expectations, low empathy, no experience. Just a total shit show, from an employment perspective.
Farside was created before the explosion of AI-driven scraping and bot traffic. As a result, querying instance status is no longer reliable due to bot-detection and challenge systems (which I understand and am in favor of, btw). Since the project is no longer practical to operate and maintain, it is being archived.
Farside 是在 AI 驱动的爬虫和机器人流量爆炸之前创造的。结果,查询实例状态由于机器人检测和质询系统而不再可靠(顺带一提,我理解并且支持反爬)。既然运行和维护这个项目已经不再切实,目前正在归档。
替代前端的另一个特点是内容更容易被爬取,因为这些前端尊重用户,没有加载大量消耗 CPU 和内存的静态资源,大部分内容也都直接写在 HTML 里,不需要 JS 渲染。为了避免成为想要训练 LLM 模型的公司的靶子,他们不得不采取更严厉的反爬措施以保证安全,比如架设
Anubis
。Farside 也需要向这些实例发送机器人特征明显的请求来确认它们能够访问,由于几乎所有实例都加上了会拦截并质询包括正常用户在内的所有流量的防火墙,Farside 根本无法有效地获取到服务状态。
不能指望科技公司良心发现,于是要接受现状:在 2026 年以及相当一段时间内,访问小互联网上的网站,自己都有可能被 Anubis 拦下,证明自己不是 AI 爬虫。这很恼人,但同时我又清楚,他们不这么做就很难活下去。真是让人感到压抑。
type EntryJudge interface {
IsQualified(entry Entry) bool}
这是 Go 推崇的「小接口」,更方便组合复用。上面的例子中,我把多个接口组合在一个结构体里,供核心业务逻辑 ReceiveEntry() 使用。如果遇到更复杂的逻辑,也可以拆出更多的抽象接口,而我们在一开始只需要面向接口编程,不需要考虑肮脏的底层细节扰乱心智,也不会因为迟迟解决不了某个数据库连接问题而在一开始就感到挫败。
我已经看出循环和递归的结构了,这个程序就是一直在提取外链而已。不少程序员的直觉可能是立刻动手开始编写获取 HTML 网页的逻辑,考虑应该使用正则匹配还是类似
Beautiful Soup
的解析工具,获取到一条环路之后应该存哪儿这些问题。But you and I should know better.
现在还剩下的问题是,尽管爬虫是异步的,与核心逻辑解耦了,但核心逻辑本身是串行的,一次递归执行完毕之后才执行下一个,同时也只会有一个爬取任务被传入 crawl-queue,根本利用不了并发资源。所以,要把 hop 也改成并行的。
本 Go 程序员写 Go 程序写得太多了,一开始也想用 go 让 hop 并行,然后便踩了坑,写出了很复杂的代码。实际上 Go 标准库里的 future 就足够好用。future 同样异步执行,返回一个引用 ref,之后 deref(或者用语法糖 @)就能拿到结果,如果 future 没有完成,deref 的调用者就会原地等待。
(defn- hop [journey over? home crawl-queue]
(future (let [journey (if (empty? journey) [home] journey)]
(if (over? journey)
;; if journey's over, print the only one [journey]
;; if not, keep crawling and find fresh urls ;; start multiple hop forks and concat their result together (let [receive-chan (chan)]
(>!! crawl-queue [(last journey) receive-chan])
(let [urls (<!! receive-chan)
futures (mapv#(hop (conj journey %) over? home crawl-queue) urls)
results (mapvderef futures)]
(apply concat results)))))))
不过,即便是并发,网络操作仍然很慢,我们不能等程序把所有的环路都找到了之后才打印结果吧?是不是应该每找到一个结果就打印一次?要在 hop 里调用 println?不不不,如果这个软件要做成 Web 程序、GUI 程序呢?要怎么收集到这些结果?显然 println 是具体实现。那只要换成一个抽象函数就好了。
(defn- hop [journey over? home crawl-queue put-result]
(future (let [journey (if (empty? journey) [home] journey)]
(if (over? journey)
;; if journey's over, print the only one (put-result journey)
[journey]
;; if not, keep crawling and find fresh urls ;; start multiple hop forks and concat their result together (let [receive-chan (chan)]
(>!! crawl-queue [(last journey) receive-chan])
(let [urls (<!! receive-chan)
futures (mapv#(hop (conj journey %) over? home crawl-queue put-result) urls)
results (mapvderef futures)]
(apply concat results)))))))
我又发现 home 这个参数完全没有意义,我为什么不能一开始就传入 [home] 而不是空向量 [] 呢?于是也顺带改了。
在添加新功能(每找到一个环路就上报一次)的同时顺带重构了代码,现在 hop 函数看起来干净了很多:
(defn- hop [journey over? pipelines]
(future (if (over? journey)
;; if journey's over, print the only one (do ((:put-result pipelines) journey)
[journey])
;; if not, keep crawling and find fresh urls ;; start multiple hop forks and concat their result together (let [urls ((:get-crawl pipelines) (last journey))
futures (mapv#(hop (conj journey %) over? pipelines) urls)
results (mapvderef futures)]
(apply concat results)))))
要测试 ody.clj 很简单,只需要保证递归函数 hop 的正确性。hop 预期的正常行为是:输入 [home],通过 home 发散出更多的 URL,递归出更多的分支,把每条完成的分支写入管线,最后返回全部分支。注意,「完成」,也就是 over? 函数是抽象的,这个完成的条件不一定是「找到和 home 一样的 URL」。完成的条件判断得准不准、是否有缺陷,是实现 over? 函数的组件的工作,应该在测试那个组件的时候才考虑。也就是说,此时我们完全不必考虑 hop 能不能给出我们想要的环路,我们只要保证它能完成预期的行为就好了。甚至啊甚至,这个 home 和最后得到的 journey,都不一定得是 URL。
......
Found one! [https://www.geedea.pro https://www.geedea.pro/ https://www.eltr.ac/ https://www.eltr.ac https://www.eltr.ac https://www.eltr.ac https://codeberg.org/eltrac https://blog.codeberg.org/protecting-our-floss-commons-from-llms.html https://blog.codeberg.org https://join.codeberg.org]
Found one! [https://www.geedea.pro https://www.geedea.pro/ https://www.eltr.ac/ https://www.eltr.ac https://www.eltr.ac https://www.eltr.ac https://codeberg.org/eltrac https://blog.codeberg.org/protecting-our-floss-commons-from-llms.html https://codeberg.org/ https://codeberg.org/Codeberg/org/compare/17bdb39b0c1ecd0e423f3ba592650ce57fcdfbf5..71149c7fc95ccfeae36109b5cddca339e4aa1473?files=TermsOfUse.md#diff-d760d688bb9b929b62db808bfc76abe4493d095a]
Execution error (URISyntaxException) at java.net.URI$Parser/fail (URI.java:3005).
Illegal character in fragment at index 20: https://matrix.to/#/#codeberg-space:matrix.org
Full report at:
/var/folders/41/6gvwg1j15xb4hwm365wds90h0000gn/T/clojure-16924552856293422522.edn
看来报错了,而且找到的路径也都是因为达到最大跳数限制才停止的,并没有找到环路。没关系,没有程序是一遍就能跑通的。C’est la vie. 报错是 Java 的 URI 处理不了 # 字符导致的,把 zeus.clj 和 polites.clj 中的 URI 换成 URL 应该就可以了。
从头到尾,奥德修斯的伟光正形象都没有坍塌过。原本机智狡黠的奥德修斯通过话术欺骗了独眼巨人波吕斐摩斯,最后是出于傲慢,要让波吕斐摩斯记住是哪个伟大的英雄刺瞎了他的眼睛,喊出了自己的真名。电影中,奥德修斯的举动则显得像是被兄弟情、战友情等光荣的概念冲昏了脑袋的呆子,他射箭激怒了独眼巨人,让更多的兄弟当场死去。他完全不是那个狡诈的奥德修斯。三个版本的奥德修斯都向同伴隐瞒了六头海怪斯库拉的存在,原典中奥德修斯隐瞒是为了“免得同伴们知道后一时心生恐惧,停止划桨”,而电影中的奥德修斯又干了件伟大光荣的事情,他利用同伴们心中已然存在的不信任,让他们通过旋涡海怪卡律布狄斯,欧律洛卡斯反对,并带领船员往斯库拉的山谷划,这才只损失了六名船员,没有被旋涡全军覆没。他从一开始就想救下所有人,哪怕受人憎恨,多么无私的英雄形象!。顺带一提,原典中的欧律洛卡斯并未看出奥德修斯早就知道斯库拉会杀死六人,因此发动哗变,反倒是《EPIC》音乐剧中的《Mutiny》一曲描绘了欧律洛卡斯对奥德修斯的质问和怒吼。真的很难不让人怀疑诺兰有没有参考《EPIC》的改编策略,据说音乐剧《Just A Man》一曲中的母题(motif)也贯穿了整个《奥德赛》电影的原声带,但我不懂乐理,也不好深究了。
我更愿意看到自私的奥德修斯,为了回到家与妻子团聚不择手段的奥德修斯。音乐剧《EPIC》的改编尽管也把不少情节改编得让人难以辨认,但 Jorge 将奥德修斯从仁慈心软到不择手段的转变描述得十分生动。“在好与坏之间选边站不是最难的,在一团糟的情况下做出最好的决策才是。”在音乐剧的第一曲《The Horse and The Infant》当中,奥德修斯就面临这样一个两难的决策——他要么杀死特洛伊王子仍在襁褓中的儿子,要么留下隐患,导致自己和家人的灭亡。
在第二首曲子《Just A Man》中,奥德修斯将婴儿从城墙上丢下。他做了件非常不道德的事情,他一点也不正直、不伟大,他好自私,而我好喜欢这样的奥德修斯。他不是什么英雄般的男人形象,他“只是个男人”。这首歌的母题(I’m just a man 一词的旋律)贯穿了整部音乐剧,在不同的曲子中,在奥德修斯面临一个又一个道德难题时反复出现。
与「星币十」联系起来的作品还有卡夫卡的《变形记》(这就是更小众的牌意演绎了),当主角 K 变成一只虫之后,家人并不关心他怎么了,他们只关心 K 还能不能上班给家里带来收入。「星币十」象征的也是这种务实。《奥德赛》中的求婚者、长老和所有想让佩涅洛佩改嫁的人,兴许也带着一些务实心态或者对家庭、财富的渴望,他们不关心佩涅洛佩本人的意志,只想要美色和王位。奥德修斯回到家发现家里挤满了想要抢走他王位和妻子的求婚者,只有他的奴隶、奶妈、儿子和狗还认得他,愿意效忠于他,也很符合这种解读。
音乐剧《EPIC》对这个情节做了些改编。首先,风神埃俄罗斯一家子只有风神一人出现了,而且风神是一个顽皮的小女孩的形象,看起来不像是有家庭的样子,只有一群精灵样的神灵跟随在她身边。性别的转变还挺令人意外的,说起来风神的家人对情节并没有很重要,而且顽皮女童的形象似乎在某种程度上也更贴合一些人对风的认知。再者,音乐剧中的奥德修斯一行人并没有被吹回风神的岛屿,而是被吹到了巨人岛——歌词里的 Land of the Giants 用词有些模糊,鉴于拉斯忒吕戈涅斯人(巨食人族)没有在音乐剧中出现,这里应该是指独眼巨人的岛屿,而且这首歌的下一首就是波塞冬的《Ruthlessness》,音乐剧让奥德修斯被风吹回了独眼巨人家门口,然后被波塞冬袭击。Jorge 真的给波塞冬加了很多戏,原典里奥德修斯一行人离开风神岛之后,就直接去到了海岛艾艾埃,遇到了瑟茜。
可以发现的是,原典中风神是真心想要帮助奥德修斯,但好心被枉费之后感到愤怒,而音乐剧中的风神则从头到尾都保持逍遥自在的形象,仿佛给奥德修斯风囊仅仅是为了考验、试验甚至恶作剧。同时,这首《Keep Your Friends Close》也巧妙地引出了故事的另一个主题:对身边人的信任。歌词可能和中国的一句老话有些关联,也就是:日防夜防,家贼难防。
这首《Ruthlessness》的母题(motif,也称「动机」,指一段音乐旋律,音乐的叙事单元)还会在之后的曲子里反复出现。Jorge 给波塞冬加戏,并不仅仅是为了让这位神明在背景板之外大显身手,还是为了给整部剧定下一个新的主题(之前的一个主题是 The Troy Saga 中的《Just A Man》),我们也可以看到奥德修斯在之后慢慢拥抱了自己的黑暗面,用对敌人的残忍来饶恕自己。
Jorge 真的对奥德修斯很残忍,原本波塞冬只是在奥德修斯安全回家之后惩罚了费埃克斯人,音乐剧中波塞冬却守在了伊萨卡海岸,拦住了刚看到故乡土地的奥德修斯。请看《Get In The Water》
呃,不过后面的那首《600 Strikes》就有些阴间了…… 什么?奥德修斯把风囊当充气背包穿上跟波塞冬肉搏?你是认真的吗? 而且全是音乐剧添加的情节,我只想解读为:奥德修斯把这一路上受到的所有苦难和折磨都发泄在了波塞冬身上,此时他彻底从人变成了「怪物」——这是从第二首曲子《Just A Man》就延续到最后的母题。
波利特斯:奥德修斯的挚友
波利特斯(Polites)在原典中的确只被提及过一次,在瑟茜的宫殿前,是他鼓励其他战士一起进入,最后他们被瑟茜变成了猪。在提及的这一次中,波利特斯被称作最勇敢的战士,也是他最亲爱的朋友。诺兰的电影完全没有出现这号人物,我前些天闲来无事去看了《奥德赛》电影演员参加的参访,被问到「谁是奥德修斯最好的朋友?」时,饰演奥德修斯的 Matt Damon 竟回答说:“欧律洛卡斯(Eurylochus)是奥德修斯的二把手,但…… 我猜是佩涅洛佩(Penelope,奥德修斯的妻子)吧。”波利特斯的名字就没有出现过。唉,要是不 Matt Damon 实在是太帅了我就已经开始鄙视他了。
于是我找到了 Health Central 的这篇文章,大致就是,对有 ADHD 和焦虑症的人群(包括成年人)来说,这类小动作(Fidgeting)会让他们的前额叶变得更活跃,提升专注力和记忆。小动作包括抖腿、按笔、重复地转动一缕头发等等,而且必须是无意识的,如果需要投入意识活动,就没有用。比如听歌可能有助于专注,但如果自己跟着唱起来了,就不行(这也是我…… 不喜欢专注的时候听歌的原因)。另外,咬手指和焦虑症的关系更大,我自己的体验也类似,玩头发是专注的时候会有的,咬手指一般是在思考很难的问题,或者对即将到来的事情感到不安。貌似在全世界,小动作的名声都不太好,抖腿是会被父母管教的,但研究表明小动作不仅有助于认知活动,也能缓解焦虑,让自己平静下来。
因为频繁在美剧里听到 Cinnamon Apple Cider 这个词(虽然就两次),所以嘴馋购入了苹果酱和肉桂浓浆,还有肉桂和气泡水。我很喜欢辛香料的味道,肉桂闻起来也很棒。肉桂貌似能激发苹果的甜味,总之喝起来很不错。
Cartle:所以这就是你又花了一百多块钱的理由吗?
Eltrac:可是真的好喝啊……
Cartle:你知道你交了房租之后余额就快见底了吗?
Eltrac:呃,这不是快发工资了吗……
Cartle:……
斯图尔特没能拯救宇宙
《生活大爆炸》的衍生剧《斯图尔特没能拯救宇宙》(Stuart Fails to Save the Universe),目前播出到第四集。剧情一般,不过其实挺好看的,谁会不喜欢多元宇宙呢?主角团是 Stuart(原剧里穷困潦倒的漫画店老板)、Denise(Stuart 的女友,不过这部剧里基本变成前女友了)、Kripke(把 R 发成 W 的那位)和 Bert(那个地质学家)。其实都是原剧里很受欢迎的配角,所以请过来拍衍生剧应该挺便宜的。
剧情设定是 Sheldon、Leonard 和 Howard 制造出了某种量子纠缠机器,而 Stuart 刚好走进来撞到了机器,意外改变了多元宇宙,现在他要和一群人去找到将宇宙复原的办法。貌似每一集都有主角团中某一人的短暂客串,目前已经出现了囚犯 Raj、AI 反抗军头子 Penny、巨人恶魔 Bernadette 和精神治疗师 Amy,剩余的就不剧透了。
独眼巨人是电影中奥德修斯遇到的第一个岛屿上的敌人(如果不算诺兰为了铺垫 The sea people 而增加的烧杀抢掠情节的话),我之所以说他惨,是因为他不仅被塑造成了一个过于丑陋、恐怖的怪物(真的有必要给他的鼻子也弄歪吗……?),而且电影中还没有提及他的名字。是的,是的,这个独眼巨人是有名字的,魔物就不值得尊重了吗?! 另外,奥德修斯和波吕斐摩斯的智斗也被删除了,他与波塞冬的父子关系也被弱化。
音乐剧的改编中,Jorge(《EPIC》创作者)一方面想要强调奥德修斯因失去伙伴而感受到的痛苦和愤恨,所以让伙伴的尸体倒在他面前而不是被吞下(这也使得他最后喊出真名时,并不是像原著一样出于傲慢,而是出于愤恨)。另一方面,音乐剧中的大部分角色(包括怪物)都是相当拟人化的,就连海怪斯库拉(Scylla)也是——音乐剧中,奥德修斯与斯库拉对唱「You and I are the same」(你和我是一样的),因为奥德修斯在那个时候深知驶过海峡会导致同胞死去,却还是想要通过海峡回到家。电影中的斯库拉倒是非常…… 高效地吃完了六个人,然后就缩回石头里了,连张脸都没有出现。