blob: cbce6776f01b5d421f0a43ec702b601b8e9f7fd2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
|
+++
title = "稻草人周刊 Vol.67"
subtitle = "如何逃离自说自话的认知体系?"
tags = [
"互联网文化",
"编程",
]
date = 2026-02-09T10:05:41
draft = false
toc = true
toot = "https://akk.eltr.ac/objects/e3ea6d8b-a09c-4790-8477-a6fe335d28d9"
+++
{{< music cover="https://img.eltr.ac/geedeapro/posts/weekly/67/Taylor_Swift_-_Opalite.png" title="Opalite" artist="Taylor Swift" apple="https://music.apple.com/cn/album/opalite/1874387732?i=1874387733" netease="https://music.163.com/#/song?id=3347158754" spotify="https://open.spotify.com/album/3evV0p6SkiOZFt1rtWRco9" >}}
Taylor Swift 在这周发布了《Opalite》的 MV 和单曲版本,这首歌是我在她新专辑里最喜欢的一首。MV 拍得很有意思,我看了好几遍。<!--more-->
---
你好!这期周刊的格式没有太多变化,只是移除了标题上的特殊字符,因为我逐渐意识到它们更像是视觉噪音,并没有传达什么有效的信息。除此之外,我也有在想办法提升网页的浏览体验,所以,我在联邦宇宙上发起了[一个投票](https://akk.eltr.ac/objects/b6776592-efc0-495f-9647-b3c46fa56385),关于用户使用亮色模式和夜间模式的习惯。我在考虑要不要添加一个手动切换的按钮,博客现在一直是跟随系统显示的。也欢迎你在这条帖文下发表你的想法,就这样。
继续阅读周刊吧!
---
## 连接
### 如何逃离自说自话的认知体系?
> [!note] 📻
> [《独树不成林》299 - 哪个社交平台最烂?](https://www.xiaoyuzhoufm.com/episode/6983a489c78b823892b31407)
标题在哗众取宠,但内容非常深刻,尽管 2026 年才过去一个月,我已经想把这期播客作为我的年度最爱了。这期播客批评的并不是具体的某个社交平台,而是发生在互联网上的最常见的「讨论」形式——自说自话。
树老师观察到,她在豆瓣上经常被骂「娇妻」和「婚驴」[^1],而在虎扑上却经常被当作挑起性别对立的极端女权主义者。她在某些平台的播客评论区下,能看到一些人沉浸在自己已有的观点和评价中自嗨,评论的内容与播客内容完全无关,那些人只是在抒发他们已有的态度而已,根本没想要认真交流。[^2]
播客的主要观点之一是:互联网上缺乏现实世界中自然而然建立起来的共识,尤其是指跟具体的人建立起来的过往经历和对对方人格的判断。比如,在现实世界中,和一个自以为是的年轻人谈话,所需要采取的态度、语气和讲话方式,当然是要不同于和一个刚经历了重大打击的老年人谈话应当采取的态度、语气和谈话方式的。而且,现实是复杂的,一个在某些层面看起来道德败坏的人,也有其他的闪光点,毕竟人无完人,和这样的人也能成为朋友。在互联网上,这种共识是不存在的,所有人都被压扁成了一个单一的人格,并且没有人被允许拥有一点瑕疵。
播客的另一个主要观点是:知识精英热衷于「拿着锤子找钉子」。他们擅长构造出一个抽象概念,并不断发展这个概念,用它来解释一切、解释世界,并在这一套已经建立起来的前提之下成为能够解释和反驳一切的神。然而,若是要他们从这个假设和前提中跳脱出来,他们却没办法解释这个概念本身,继而与现实立的越来越远。这也使得,在互联网上最安全的讨论方式,就是加入一个同温层,加入一个有共识的认知体系自说自话。
第二个观点让我深受启发,因为在树老师描绘那个「拿着锤子找钉子,想要用一个概念、一套理论解释一切,感受到狂热和高潮」的人的时候,我看见了我自己。我应该反思,或许从现在开始,我应该跳脱出一切假定的前提,从最基本的原则和事实来进行讨论,在写作时与读者重新建立共识;又或许,我应该阅读更多、感知更多,减少评价、减少判断,做一个能反思的观察者,而不是一个用观察来作证观点的诡辩家。
我还不清楚应该怎么做,但至少,我开始思考。
### 黯然死去的「好代码」
> [!note] 📜
> [The Silent Death of Good Code](https://amit.prasad.me/blog/rip-good-code)
*我已经不记得上次大声朗读是什么时候了。为了让自己坐在书桌前的时间不那么静态,也为了更好地感受语言的力量,我决定每周开始朗读一篇被我选取到周刊里的文章。其实一开始的出发点是周日早上起来发现自己感冒好了,喉咙不痛了,想要赶紧使用一下康复的器官。总之,以下是这篇《The Silent Death of Good Code》的音频,由我朗读。我没有刻意练习,只是想读出来,所以会有错误和卡顿的地方,还请见谅。*
<div>
<audio src="https://img.eltr.ac/geedeapro/posts/weekly/67/The%20Silent%20Death%20of%20Good%20Code%20(reading).m4a" type="audio/x-m4a" controls autostart="0" autostart="false" preload ="none" />
</div>
作者发现现在人们很少在乎「写出好的代码」这件事情了。好代码是指容易阅读和理解,开发和维护起来令人愉悦,因不多不少一个具体的原因而存在,由才华、经验、热情和不能立刻得到回报的投入的时间而产生的代码。最不幸的是,好代码是罕见的。
尽管我的软件开发经验不能与作者相提并论,但我依稀记得,不久以前人们还很在意代码的整洁,而现在很多的工作都由 Agent 完成,开发者直接接触代码的时间变少了,人们似乎不那么在意代码的整洁了。
> #突然想到 LLM 编程似乎让人们开始忽略编码风格,刚刚在读《代码整洁之道》,作者建议函数最好应该只写两三行,还给出了「一个函数里的代码应该在一个抽象层级上」这种建议。然而,LLM 吐出来代码大多都不会呈现这样的风格,也很难真的判断什么样的代码是「一个抽象层级上」的。
>
> 不过程序员们真的在乎吗?人们还会关注自己写下来的代码能不能被人读懂吗?
{{< right "来自[我的旧 Mastodon 账号](https://c7.io/@eltrac/115819799771105669)" >}}
最近有人在联邦宇宙上回复我,说他最近准备把博客迁移到 Hugo,参考了包括本博客在内的许多主题源代码,他夸奖我的代码写得很规范、按照最佳实践跟进、很漂亮。开心的同时,我也有些心虚,因为博客的代码也有一部分是用 Agent 写的,而那些规范的代码也是我不定期重构的结果,最初的代码其实相当乱(现在也有一部分新添的代码写得很冗杂)。我在想,做人和写代码之间共通的一个美德就是「节制」——在添加新功能、推进开发的欲望中主动停下来,回看之前写下的各种代码,想办法把它变成更令人愉悦的结构,尽可能接近「好代码」的标准。
我现在逐渐养成了一个习惯,就是在一个闲暇的午后,端起一杯咖啡,在 Git 仓库创建一个名为 `linting` 的分支,然后调整代码的结构,重写冗杂的代码。这其实还挺令人放松的,像是在修剪花草,我建议你也试试。
### 逃离 GitHub 指南
> [!note] 📜
> [A Programmer's Guide to Leaving GitHub](https://lord.io/leaving-github/)
之前听闻过 [Zig](https://ziglang.org/news/migrating-from-github-to-codeberg/)(一门编程语言)项目和 [Leiningen](https://codeberg.org/leiningen/leiningen/src/branch/main/.github/README.md)(Clojure 的构建工具)搬离 GitHub 的消息,也认识一些个人选择离开这个平台。一开始我对 GitHub 并没有这样避而远之,它的 [ToS;DR](https://tosdr.org/en/service/297) 评级是 B,几乎所有程序员都有 GitHub 账号,并且他的 API 和各种工具都是开放的。我意识到的只是代码托管平台过于中心化的问题,所以自建了 [Forgejo 实例](https://src.eltr.ac),把没有太多合作需求的个人项目都搬到上面(包括这个博客,代码托管和 CI/CD 工作流都是在自己的机器上跑的)。
这篇文章比起「指南」,更像是在告诉读者「为什么应该这么做」。作者列举了人们反抗和离开 GitHub 的种种原因,其中的一些我是第一次听闻。在得知 GitHub 竟然和 ICE(美国的移民和海关执法部门)有合作关系之后,我气愤得直接在电脑面前吼出声来。即便我不关心政治,我也能在 New Yorker 杂志和 Hacker News 上看到有关 ICE 的新闻,[ICE 执法人员在今年一月杀害 Renée Good 的事件还被记录在维基百科上](https://en.wikipedia.org/wiki/Killing_of_Ren%C3%A9e_Good)。GitHub 现在还在帮 ICE 托管代码。
最近还有腾讯等国内企业要求 GitHub 下架 [WeChat Clean](https://github.com/ellermister/wechat-clean) 等微信相关的开源软件,我这里摘取 WeChat Clean 项目的原文:
> 根据腾讯法务发来的RTF文档, 翻译了半天才看明白,项目被指控:
>
> 1. 违反DMCA第1201条 - 绕过技术保护措施
> - 是指:我看了微信的数据库结构
>
> 2. 违反微信服务条款 - 逆向工程
> - 是指:我试图理解我自己手机上的数据
>
> 3. 威胁用户隐私和安全
> - 是指:让用户知道自己的数据长什么样很危险
>
> 4. 侵犯知识产权
> - 是指:你的聊天记录存储格式归腾讯所有
>
> 不仅如此,我这只是其中一个项目
>
> - 这次投诉一口气举报了 30 多个类似项目
> - 其中最大的项目有 4443 个 stars,181 个 stars 的也没了
> - 我这个 291 stars 的也没得说
>
> 投诉文件原文节选:
> "illegally offer tools for circumventing Tencent's methods for preventing unauthorized access"
>
> 是指:让用户访问自己的数据是非法的 😣
就算不关心政治和技术自由,离开这样一个充满纷争的平台也是有益的。文中作者列出了一些 GitHub 的替代品,并列出了背后的开发者、进行代码审查的方式和一些备注,是很好的参考。如果是个人使用,推荐使用 Go 开发的 Forgejo,很轻量,功能也不少。作者采用的方案更简单直接:使用 S3 储存桶作为远程仓库。他还开发了 [j3](https://code.lord.io/j3/),十分轻量简洁,用于自托管 Git 和 [Jujutsu](https://www.jj-vcs.dev/latest/) 仓库。本质上 j3 只是个 Web UI。印象中,你也可以直接把 Git 仓库上传到自己的服务器,通过 SSH 提交更改。
不过,我暂时还不会注销 GitHub 账户,因为目前还是个学生,一个有一定数量的关注者和一些有几百 Stars 的仓库的 GitHub 账号,在求职时大概是很有说服力的。迁移所有的仓库也是个大工程,我会慢慢减少 GitHub 上的活动,但要完全离开的话,还得再等一阵子。
## 星群
### DaxDuckDex
这个网站收集了 DuckDuckGo 的搜索彩蛋,比如,搜索「Ash Ketchum」,DuckDuckGo 的鸭子图表就会戴上《宝可梦》里小智的帽子,穿上蓝色的衣服。截至我写下这段文字的时间,这个网站上已经收集了 664 个彩蛋。
访问:[DaxDuckDex](https://makdulac.com/daxduckdex.html)
### Tirith
有一类攻击手段叫作 IDN 欺骗(internationalized domain name homograph attacks),利用了 Unicode 中的同形字欺骗用户,让他们一位自己访问的是官方网站。比如,西里尔字母中的 `і`(U+0456)和拉丁字母 `i` 长得一模一样,但实际上是不同的字符;大写的 `I` 和数字 `1` 在非衬线字体下也无法区分。浏览器早就防止了这种攻击方式,避免用户访问诈骗网站。
然而,终端却不会检查同形字,会直接执行 `curl` 命令。如果用户习惯直接复制网站中的命令或者大语言模型提供的命令,就有可能遭到这种攻击,从错误的网址中下载到恶意程序。
Tirith 解决了这个问题,安装后,你执行的每一条命令都被守护。正常的命令在执行时不会有任何区别,但一旦遇到了包含 IDN 欺骗的命令,Tirith 就会拦截这次操作。
访问:[sheeki03/tirith](https://github.com/sheeki03/tirith)
### ReMemory
这个基于浏览器的工具实现了[沙密的加密分享算法](https://en.wikipedia.org/wiki/Shamir%27s_secret_sharing)(Shamir's Secret Sharing),这是一种在团体之中共享秘密信息的方法。简单来说,信息被加密之后,密钥会被拆分开来,分配给团体中的每一个人。一个人没有办法单独解密,必须要有一定数量的成员集结起来,用多个密钥才能解密信息。
ReMemory 的工作方式大概是这样的,你将文件加密之后,将密钥拆分给(例如)5 个你信任的朋友,只有他们其中 3 个人聚在一起使用他们得到的密钥,才能解密这个文件。每个朋友都会得到一个 `recovery.html` 文件,这个文件是自容的(self-contained),意味着不需要联网、只需要有一个浏览器就能使用。一个人打开 `recovery.html`,然后把另外两个人的 `README.txt` 文件拖进网页,就能开始解密。
这个工具被创建的初衷是,开发者希望就算他出事了,他信任的朋友也能有办法访问某些重要文件。这个方法不单独信任每一个人,而是信任一个团体。
不过这意味着你要有一群相互认识、熟悉计算机技术并且有良好的文件保存习惯的朋友,门槛有点太高了。
访问:[ReMemory](https://eljojo.github.io/rememory/)
## 当下
### 自托管 GoatCounter
上周偷偷地给博客加上了 [GoatCounter](https://www.goatcounter.com/),一个不会跟踪(track)用户的网站流量分析工具。所谓不跟踪,就是不会给访客增加唯一标识,不会跟踪访客在网站上的行踪。这一点不同于 Google Analytics 和 Umami 这类分析工具。GoatCounter,顾名思义,就是在收到访问的时候给对应的数据 +1,仅此而已。GoatCounter 是用 Go 语言开发的,数据库可以选 SQLite 或者 PostgreSQL,从技术栈看就能知道,它的内存占用非常小,对服务器的要求极低。总之,GoatCounter 是一个对用户和网站管理员都很友好的网站分析工具。
我用官方提供的免费托管服务试用了一周,决定自托管。官方提供了 [compose.yml](https://github.com/arp242/goatcounter/blob/main/compose.yaml),可以很方便地用 `docker compose` 部署。另外我不得不夸奖一下 GoatCounter 的托管服务,数据导出和删除账号都流程都非常干脆直接。
GoatCounter 可以设置向所有人公开数据,我打开了这个设置,你可以在 [stats.geedea.pro](https://stats.geedea.pro/) 查看 GoatCounter 收集到的所有访问数据。如果你希望完全无影无踪地访问我的网站,可以在 URL 后面加上 `#toggle-goatcounter`,这样 GoatCounter 就不会记录你的访问了。[^3]
### 后花园里的事情
本周[罐子](https://jar.geedea.pro/)更新了这些笔记。
- [在 Ghostty 中使用 SSH 的问题](https://jar.geedea.pro/notes/ghostty-ssh-issue/)
- [为静态博客添加自动发送 Webmention 的功能](https://jar.geedea.pro/notes/automate-outgoing-webmentions/)
哦对,现在博客可以自动发送 Webmention 了。
### Cloudflare 有害
本周遇到了两个 Cloudflare 导致的问题。
首先是把博客迁移到自己的 VPS 上之后,发现灯箱、Pagefind 搜索和其他 JavaScript 无法正常加载,这影响倒是不大,毕竟我一直是 JavaScript 极简主义者,突然不能用了或者用户禁用了 JS 也是不影响正常访问的。不过,在开发环境能够正常加载的脚本,为什么到生产环境就不行了呢?
排查之后发现是 Cloudflare 干的——不知道什么时候开始,Cloudflare 给我的域启用了一个名为 Rocket Loader 的优化功能,以及一些其他的我记不清名字的乱七八糟的优化选项,这导致网页上的 JavaScript 被延迟加载,结果是根本没有加载。*我能自己做好前端的优化,[你凭什么往我的咖啡里加糖?](/essays/no-sugar-in-my-coffee/)*
另一个问题出在联邦宇宙上,我的实例 Eucalyptus 突然没办法正常和 [Mycelium](https://myce.li/) 联邦,收不到来自 Mycelium 的新帖文和互动。联系小氯之后发现那边访问 Eucalyptus 时得到了 403 错误,本以为是 `nftables` 误封了 IP,但对方表示有质询(challenge),才意识到问题不对……
又是你!Cloudflare!
在 Cloudflare 的用户界面迷宫里找了半天,才在一个名为「事件」的页面发现,Cloudflare 的 Bot Fight Mode 拦截了大量的 ActivityPub 流量。所以,过去的几天里,我不只是没有收到 Mycelium 的消息,也没有收到其他很多实例的消息。
关掉 Bot Fight Mode 之后,一切恢复正常。
Richard Stallman 曾写到,[Cloudflare 是有害的](https://stallman.org/cloudflare.html),作为中间层,他能访问 HTTPS 通信的内容,也会跟踪用户。最近也感觉到,它的功能越来越臃肿,有好多意外出现的问题都来自那些我根本不需要的特性。
我想要逃离 Cloudflare,毕竟我使用它的主要原因是防止 DDoS 攻击。至于替代的防护方案,我还要再思考一下。还有 R2 储存桶,真的很难找到好用又便宜的 S3 兼容存储啊!
[^1]: 很难想象,自称女权主义者的人,会发明出这么多辱骂女性的词汇。
[^2]: 本人有幸也在博客评论区收到过这样的评论。
[^3]: 2026.10.23 更新:现在已经不需要了,本站不再使用任何数据统计工具
|