2026-01-12 09:51:58

Weather Girls
这首歌的名字意思是「天上在下男人」,嗯…… 希望是真的。
It’s Raining Men 是美国 80 年代的热单,影响力似乎很大,现在在一些影视作品里也能见到。我印象最深刻的有两个,一个是《老友记》里 Chandler 的母亲作为跨性别角色第一次出场时,在拉斯维加斯表演的就是这首歌;另一次是《艾米丽在巴黎》第五季的骄傲月游行,Mindy 表演的就是这首歌的改编版。嗯,这首歌已经被酷儿群体拿去用了。
又到周一啦,很不幸地告诉各位读者——我这周根本就没写周刊。怎么办呢?63 也不是个什么特殊的数字,总不能编一个「特别辑」出来糊弄读者吧? 考拉沉思中…… 既然如此,那这期周刊就来写一写「我这周为什么没写周刊」吧。
嗯,是个不错的主题。
根据 WakaTime 统计,过去七天我使用的编辑器只有 NeoVim。我记得我在周二就把除了 NeoVim 以外的所有编辑器卸载了,包括 Obsidian、 Zed 和 Trae(至于 Trae,本身就是我用来度过期末周临时安装的 AI IDE),因为我已经能用 NeoVim 替代它们了。
如果你感兴趣,可以查看我的 NeoVim 配置 。
比较值得一提的是我没有安装 nvim-tree 和 neo-tree 这些传统的目录树插件,标签页插件也在用过一段时间之后就卸载了。个人感觉,这两类插件是依照 GUI 编辑器的使用习惯来设计的,在 NeoVim 里有更好的选择。其实我在 VS Code 系的编辑器里就很少使用目录树和标签页,我更喜欢按下 ⌘P 快捷键,按照名称搜索文件进行跳转。NeoVim 生态里非常好用的模糊搜索工具是 Telescope.nvim,按下 <leader>ff 就能按文件名模糊搜索,按 <leader>fg 是全局 Grep,也就是包括正文的模糊搜索。至于查看目录结构,这个操作并不高频,需要的时候在文件浏览器里查看就好了。我目前使用的是 oil.nvim 插件,类似于 Emacs 的 dired,可以像编辑 buffer 一样编辑文件系统,也方便查看目录结构。
此外,我还对中文编辑做了一些优化。我强力推荐以下这些插件:
b 和 w 等按键按词跳转,没办法对中文进行分词,英文可以按空格或符号分割的词句跳转,中文就不行了,默认情况下,会直接跳过整个句子。这个插件优化了这一点。如果你现在把页面拉到最下方,点开文章底部的 Webmention 区域,你可能会发现来自 Fediverse 的互动。现在博客和我的联邦宇宙账号联通了,这是通过 Bridgy 实现的,这个服务会定期扫描我的 Fediverse 账号和我的博客,包含了博客某个页面链接的内容就会被视作这篇文章在 Fediverse 上的载体,Fediverse 居民的点赞和评论都会被抓取到,然后 Bridgy 就会把这些互动数据以 Webmention 的形式发送到我的博客。
博客一开始是使用
webmention.js
展示数据的,很方便,但额外的 JavaScript 会拖慢网页加载速度,更何况还需要从 webmention.io 这个第三方服务拉取数据。这样做还有一个问题:我的数据没有存档,如果我打算更换 Webmention 接收器,这些数据无法保留下来,一直保存在 webmention.io 的数据库里。尽管 IndieWeb 上免费提供 Webmention 服务的不太可能是坏人,也不会对我的数据做什么,但我仍然希望数据能够尽可能存档在 Git 仓库里。于是,我编写了一个 Workflow,让 GitHub Actions 每隔三十分钟抓取一次 Webmention 数据,如果有就提交 commit,存放在 data/webmention.json 里,Hugo 在构建的时候可以自动读取这些数据。数据更新之后,因为提交了 commit,所以会触发 Cloudflare Workers 部署,新的数据就能被展示出来了。
所以,目前博客获取并展示 Webmention 的流程是这样的:
webmention.io <-抓取数据- CI/CD -提交更改-> Git 仓库
--部署--> Cloudflare Workers
如果你想试试,可以点击页面底部的「在 Fediverse 上互动」,点赞和评论都会在 30 分钟内被抓取并更新到这个页面里。
我还顺便把各种原本在构建时完成的数据提取工作都移动到了 CI/CD 里,比如构建 内部链接图谱 数据、提取 外部链接排行 和提取所有文章中的 高亮标记 。
Forgejo 是 Gitea 的分支,一个轻量级的 GitHub 开源替代品,目前主要用做备份,旨在拥有自己的数据。需要协作的场合还是会使用 GitHub,检索信息时也很难离开它。未来会配置 Forgejo Actions,把项目的 CI/CD 也迁移过去,至少这类基础设施要掌握在自己手上。
目前我把 Git commit 推送到远程仓库时,会同时推送到 GitHub 和 Forgejo 两个服务器上。
本周五,也就是 1 月 9 日,我在 Telegram 频道「大脑充血」里发送了最后一条消息:
📢 Telegram 账号和频道的停用通知
本人正在逐渐转向去中心化网络,全面拥抱开源、自由软件。Telegram 本身是设计精良且注重隐私保护的闭源软件,但由于本人最近在 Fediverse(联邦宇宙)上更加活跃,而目前我也极少将 Telegram 当作通讯软件使用,主要用于阅览和发布频道信息,充当了更多的社交属性。显然,Fediverse 作为自由、去中心化的社交网络,对我而言,能比 Telegram 更好地满足需求。
再者,Telegram 会在人数较多的频道中投放广告,在最近的更新中还增加了 AI 功能,这是它作为一款商业软件无法摆脱的趋势,因此我决定全面停止使用 Telegram。从本消息发布开始,我不会在这个频道里发布新内容,几天后也不会继续回复私信或评论。
极客死亡计划等其他平台不会停止更新,你可以继续关注我的博客,或者在 Fediverse 上关注我:https://c7.io/@eltrac 如果你没有Fediverse账号也不打算使用去中心化社交媒体,你可以通过 RSS 订阅我的 Fediverse 账号:https://c7.io/@eltrac.rss
如果需要联系到我本人,可以使用一下联系方式:
- 电子邮件:
[email protected]- Matrix:
@eltrac:matrix.org希望我们最后都能在联邦宇宙,或者一个更开放的互联网上相见。
其实不只是 Telegram,我还停用了很多软件并找到了替代方案。
我卸载了 iPhone 上的小宇宙和 Apple Podcast。一开始不使用小宇宙是因为我抗拒它的社交功能和算法推荐,所以一直在使用苹果自带的 Podcast,但有不少中文博客并不能在 Apple Podcast 上找到。本周我发现,大部分播客节目其实有提供 RSS 订阅链接(小宇宙和喜马拉雅等平台都有提供),实际上使用 RSS 阅读器就能订阅节目更新。
为什么不早说!
我很快卸载了这两个 App,在 App Store 上找到了一个看起来比较轻量的播客播放器,叫作 Lightcast。支持 RSS 订阅和名称搜索,基本上我想听的播客都能搜到。我在 中文独立播客 这个页面里找了一些新的感兴趣的播客订阅,现在应该是不缺好节目听了。




RSS 真的是伟大的发明。就这样,听播客这件事情也去中心化了。
我还卸载了我很早就看不惯的 WPS,无奈还是有在本地查阅和编辑办公文档的需求,尤其是放映幻灯片,投屏的时候如果使用 WPS 的 Web 版应用就要打开浏览器——无论怎么说,把自己的浏览器投屏给所有人看就是一件很恐怖的事情。我更偏好本地优先的解决方案。
照理来说,如果要选 FOSS 替代,应该用 LibreOffice,之前折腾 Manjaro 系统的时候也用过。不过,我之所以要用办公文档,主要是为了「兼容别人」,我自己是绝对不会主动编辑 Word、PPT 和 PDF 的,我是坚定的纯文本使用者。LibreOffice 对 Microsoft 办公套件的兼容性相对差一点,而且我一直觉得它的 UI 很丑。辗转过后,还是选择了商业软件 ONLYOFFICE,编辑体验与 WPS 和 Microsoft Office 几乎没有区别,而且启动速度比 WPS 快很多,界面也很友好。ONLYOFFICE 有提供社区的开源版本,所以也不算特别坏的选择。
什么时候 Markdown 可以统治全世界?!
上周我把输入法换成了开源的 RIME ,整体而言,我正在逐步拥抱 FOSS1 软件,也在逐渐把一些服务替换为自托管或者至少是去中心化的解决方案。这是我今年的目标之一,希望在年底我能完全脱离「大公司网络」,至少让他们在我的生活中降级到可有可无的位置。
以下是我的 MacBook 上安装的所有 GUI 软件,供读者参考。2
○ Keka 39.4MB
○ BetterDisplay 48.7MB
○ ONLYOFFICE.app 1.05GB
○ Squirrel 87.2MB
○ 1Capture.app 57.2MB
○ Calendr 12.0MB
○ Googly Eyes.app 3.8MB
○ Hammerspoon 40.3MB
○ LuLu.app 8.6MB
○ Hidden Bar.app 23.3MB
○ NetNewsWire 23.1MB
○ Raycast 133.0MB
○ Dropover 49.3MB
○ ChatGPT 130.3MB
○ Helium 305.3MB
○ Ghostty 49.3MB
前几天和 小氯 邮件交流,对方推荐我写一个 /uses 页面,于是本周六我就在博客新增了「 器用 」页面,罗列了我使用的硬件、软件和服务。
这几天在 Matrix 上和 Southfox 聊天,被成功传教开始学 Clojure(一门 Lisp 方言)。大概再过几个月我就会成为一个熟练使用括号的真正的黑客了。
要安装 Clojure ,需要下载他们提供的 JAR 包…… 所以,上帝的语言居然是用 Java 这门粗俗的语言写就的吗!笔者很不喜欢 Java,你的意思是你们实现跨平台的方式就是在运行程序之前先启动一个虚拟机,疯了吗?编译器是拿来干嘛的? 也有可能是我被逼无奈在学校用 Spring Boot 做了不少 Web 项目,所以被恶心到了。Spring 系的 Web 项目,结构往往都非常臃肿,即便有依赖注入和控制反转之类的用于降低耦合度的概念,改一个需求仍然要动很多文件。配置文件也基本都是用 XML 写的,这门语言从头到脚都是臃肿的。
所以一想到启动 Clojure 程序就要启动一个 JVM,底下还是 Java 代码在跑,我还是觉得有些膈应的。哎,但是 Java 已经无处不在了,还是早点接受为好。
至于学习进度,我已经掌握了 Lisp 语言的全部语法!如下:
;; Hello World in Clojure
(println "Hello World")
Lisp 里面唯一的结构就是列表(或者说元组),第一个元素是函数名,剩下的全都是参数,列表可以嵌套。好了,现在你也学会了,赶进去写一个二叉树翻转算法吧!
2026-01-11 13:19:37
去年八月,我在少数派上读到了一篇题为《 码农的自我修养之保持干净的 $HOME 目录 》的文章,从那个时候我就开始注意自己的 Home 目录。如果你不知道 Home 目录是什么:它是多用户操作系统中,系统为每个用户单独分配的目录,其中存放与该用户相关的文件,比如只为这一个用户安装的软件、下载文件、系统回收站、配置文件、数据文件和缓存等。
在类 Unix 系统下,可以用 ~ 表示当前用户的 Home,在终端执行 cd ~ 就可以「回家」。Windows 系统下比较少提及 Home 目录,常见的是 %APPDATA%,这也是存放在用户的 Home 目录下的子目录。有不少操作系统有名为「文档」或 Documents 的用户目录,也是存放在 Home 目录里的。
Home 目录常被用来存放该用户的数据文件、配置文件和缓存文件,所有应用程序都可以进行读写。然而,不是所有用户程序都遵守规范(实际上也没有强制执行的使用 Home 目录的规范),有的软件会在「文档」而非 Home 目录下存储数据文件,有的软件会在 Home 根目录下创建多个点文件(dotfiles),有的软件相对守规矩,会把各种类型的文件都放在一个点目录里。不少操作系统默认的文件管理器都有提供 Home 目录的快捷方式,不少用户也会直接在 Home 目录下存储各种文件。
总而言之,如果不主动干预,Home 目录就会变得非常混乱。用户可以选择眼不见为净,毕竟点文件默认是隐藏的,不主动查看就难以发掘。如果你和我一样对自己的电脑有着奇怪的掌控欲,那我建议你继续读下去。
简单来说,混乱的 Home 目录会导致以下问题。
配置文件、数据文件和缓存文件没有分离。一般而言,配置文件和数据文件是用户需要保留的,即便更换设备,配置也可以迁移;配置文件往往是需要用户直接编辑的,而数据是操作软件时产生的,由软件读写;配置文件可以分享(例如 NvChad、LazyVim 等就是 NeoVim 的配置文件),而数据涉及到隐私,往往需要保护;缓存文件可以随时删除,不会影响软件正常运行1。
我不太想把保持 Home 的整洁称作某种程序员应有的素养,因为这并不会让你的开发能力有任何提升,就像在中小学值日做清洁并不会让你的学习成绩有提升一样。让各种软件在同一个目录下打架并不会影响软件运行和日常工作,只是增加了管理成本——如果你完全不管理,那就无需在意了。
但如果你在意自己的数据,容忍这些文件乱作一团真的是件坏事。这和家政是一样的,如果你在意这件事情,那么容忍熵增只会让自己难受;如果不在意,以素养或责任一类的说辞裹挟自己也不利于自己的心理健康。
整洁就是「整」和「洁」——有条理,且没有杂质。还是用家政举例,我们把食物放在冰箱里,把衣物放在衣柜里,把书本放在书架里,物品有了各自的、确定的去处之后,它们就不会乱作一团了。在我们需要某种物品的时候,我们也能通过分类来快速定位。
分类其实不是件难事,真正困难的是处理人与人之间的矛盾。假设你喜欢把扫把放在阳台,而你的室友总是把它留在客厅,你大概就会对室友的行为感到不爽。现在请想象,你是一间公寓的房东,你的房子里住了很多人。出于某些原因,他们全都共享同一个空间。每个人对物品的分类标准都有所不同,把扫把放阳台还是客厅的争论肯定少不了,而你作为房东,大概也有自己的偏好,看到自己的房子被弄得乱七八糟,心里肯定也会觉得不舒服。到底有没有办法解决这个局面呢?
最简单的解决方式当然是设置统一的分类标准,强制要求大家都把扫把放在杂物间就好了。然而,计算机的世界要比合租更复杂一些。在前面的比喻里,房东是用户,租客是用户安装的软件,我们假设软件在哪里存放数据是能够自由更改的,并且一个软件只会存在于一个用户的电脑上。在计算机世界里,软件是可复制的,同样的软件会被分发给不同的用户,不同的用户可能有不同的存放数据的偏好。
单房东和多租客的情况下很容易达成共识,大家都听房东的话就好了。多房东和多租客的情况则复杂得多。假设房东告诉你应该把扫把放在阳台,二房东告诉你扫把要放在杂物间,而二房东的丈夫则要求你把扫把放在客厅,那你到底要听谁的?
作为租客,你需要考虑的其实只有「把东西放在该放的地方」这个问题,在这个比喻里,就是要「把扫把放在专门放扫把的地方」。现在的情况是这样的:
这些值表达的语义是相同的,但在不同的人眼里,实际的值是不同的。引用名相同,但是在不同的情况下赋值不同,这有让你想到什么东西吗?没错,就是「环境变量」。
现在我们脱离有关租房的比喻,回到计算机的世界来。如果程序员在开发时不武断地硬编码一个存放数据的文件路径,而是读取相关的环境变量,了解用户希望某种类型的数据文件应该被放在什么地方,前面提到的问题就迎刃而解了,而且,用户真正地掌控了自己数据的存放位置。
事实上,大部分程序员已经在这样做了。Home 目录的具体路径就是一个环境变量,这个变量一般由操作系统维护,赋值为当前用户的 Home 目录绝对路径。比如,在 macOS 下,如果以 eltrac 的身份登录,环境变量 HOME 的值就是 /Users/eltrac/。
但我们需要更进一步,因为现在的做法就和「应该把扫把放在家里」没有区别。有没有一个类似于现有的 HOME 目录的规范,让程序员能够分门别类地将不同的数据存放在用户通过环境变量指定的目录里呢?
XDG 基本目录规范(XDG Base Directory specification,缩写 XDG BDS)是由 Waldo Bastian、Allison Karlitskaya、Lennart Poettering 和 Johannes Löthberg 提出的。XDG 是 X Desktop Group,现名 freedesktop.org。名称中的 Free 指代的是「自由软件」的概念,这个项目致力于为自由软件桌面环境制定规范,让它们能够互通和共享基本技术。
如果你不清楚什么是「桌面环境」,请想象你的操作系统和你正在操作的桌面、图形界面和光标等元素是分离的,不是所有操作系统都有这些东西。桌面环境运行于操作系统之上,为用户提供图形界面,对于现代的个人电脑来说是必要的。Windows 和 macOS 和许多 Linux 发行版自带桌面环境,对于 Linux 这样的开源操作系统来说,用户可以自己选择桌面环境。我自己比较熟悉的是 KDE 和 Gnome。
文件系统并非是通过桌面环境实现的,所以看到 freedesktop.org 编撰这样一个规范,我是觉得有些奇怪的。不过细想也合理,毕竟如此在意文件整洁的人,可不就是喜欢折腾开源自由软件的桌面端 PC 用户嘛。
完整的规范可以在 这里 阅读全文,本文主要提及此规范为指定文件存储路径所规定的几个环境变量。这些定义有系统级和用户级的,由于我们在本文只讨论 Home 目录,固然只会涉及用户层级。此外,如果你还没有意识到——本文内容只适用于类 Unix 系统用户,也就是 macOS 用户和各大 Linux 发行版的用户。
XDG_CONFIG_HOME:储存软件的配置文件。用户可以更改这些文件来调整软件行为;用户在更换设备之后也能迁移这些配置文件,在新设备上获得相同的软件体验。XDG_CACHE_HOME:不重要、可以被删除的数据,即缓存。XDG_DATA_HOME:持久的数据,是用户拥有的「内容」。假设你有一个遵循此规范的笔记软件,而你没有指定笔记的存储位置,它就可以默认把笔记写在这个位置。XDG_STATE_HOME:持久的数据,是软件的「状态」记录。假设你有一个遵循此规范的笔记软件,它可能会把编辑历史、窗口布局都软件在运行时产生的数据存放在这里。用户层级下还有一个 XDG_RUNTIME_DIR,但默认情况下这个环境变量并不会指向 Home,大部分用户也不会用到它,本文就略过了。
对于用户来说,这样的划分使得 Home 目录更整齐了,与系统交互时也更省心——要更改配置,就在 XDG_CONFIG_HOME 找相应的文件;要清理缓存,就把 XDG_CACHE_HOME 目录下所有的文件都放心地删掉;要迁移或备份数据,直接操作 XDG_DATA_HOME 目录就好;至于 XDG_STATE_HOME,用户在大部分情况下不用管。
对于开发者来说,在读写文件时直接使用系统的环境变量很方便,例如 Go 语言提供了 os.Getenv() 方法访问环境变量。当然,不是所有的用户都设置了 XDG 环境变量,如果没有找到相关的环境变量,软件可以回退到直接在 HOME 目录下读写。
freedesktop.org 算不上什么权威组织,基本上只有使用 Linux 桌面系统的黑客才会在意 XDG BDS 规范,当然,如今也有不少 macOS 用户会关注 Home 目录是否整洁,但总体而言是比较小众的需求。XDG BDS 不像 RFC(Request for Comment)的一系列互联网技术规范,理应被严格遵守。它更像是一种观点、一个流派,没有人必须遵守,就像尽管提升柔韧度有助于避免运动受伤,也不是所有健身人士都注重拉伸。
开源、自由软件一般都会遵守目录规范,即便维护者本人没有这个意识,用户中的黑客也会有人提出建议或贡献代码,要求实现 XDG BDS。如果你使用的软件大部分都是自由软件,那你基本上不会遇到特别令人头疼的钉子户…… 不过,先让我们搞清楚什么是真正的自由软件。有不少软件有着自由的开源协议,但实际上是由某个公司开发的,不受开源社区控制。
我举一些我遇到的钉子户案例。
.logseq 目录。.claude 目录、.claude.json 和 .claude.json.backup。
.bun 目录,所以我仍然在使用 Node.js。.m2 目录存放依赖文件。嗯,我是不指望 Java 系的工具支持 XDG 规范的。所以在我完成了大学里所有 Java 相关的课程后,直接卸载了所有的 Java 开发工具。2
简单来说,XDG BDS 的现状就是:它本身不是强制执行的规范,只是一种观点,不是所有软件都支持。对于闭源软件和商业软件,可能没有太多的操作空间,但是对于开源软件,还是可以通过提交反馈和直接提交代码来促进规范实现的。我最近在用又拍云的 CLI 工具 upx ,它就不支持 XDG BDS,代码是用 Go 语言写的,很亲切,与是我就自己实现了规范并提交了 Pull Request。就算他们不合并也没什么关系,因为我已经构建了支持 XDG BDS 的版本并替换了安装在我电脑里的二进制文件——这是开源软件的好处之一,如果有用着不习惯的地方,就可以自己 Fork 一份修改。
值得一提的是,有不少开源软件尽管没有直接实现 XDG BDS,但是有定义专用于这个软件的环境变量,用户可以自由指定数据文件的存储路径。比如 GNU PGP Guard 就会读取 GNUPGHOME 这个环境变量,如果读取到了用户自定义的值,就会把文件写在指定的位置。对于这样的软件,用户需要手动设置环境变量来支持 XDG BDS。以下是我的 .zshrc 文件中的一行。
export GNUPGHOME="$XDG_DATA_HOME"/gnupg
综上,如果你想要通过 XDG 基本目录规范来整理你的 Home 目录和点文件,你需要做好以下心理准备:
如果你准备好了,甚至觉得这很好玩,那我们就继续吧。
首先,你需要配置环境变量,先告诉那些本身就尊重 XDG BDS 的软件:我也遵循 XDG BDS,我希望你们把文件放在以下这些目录里。默认的、最简单的配置如下:
export XDG_CONFIG_HOME="$HOME/.config"
export XDG_CACHE_HOME="$HOME/.cache"
export XDG_DATA_HOME="$HOME/.local/share"
export XDG_STATE_HOME="$HOME/.local/state"
export XDG_RUNTIME_DIR="/run/user/$UID"
你需要先知道你用的是什么 Shell(常见的有 zsh、bash 和 fish),你可以通过在终端输出环境变量 SHELL 来查看你所使用的 Shell 的二进制文件路径,这样一来就能确定你用的 Shell 是什么了。
➜ ~ echo $SHELL
/bin/zsh
我用的是 zsh,接下来也使用 zsh 作为示范。
首先把上面的环境变量配置复制粘贴放在 /etc/zshenv 这个文件里,如果是其他 Shell,则需要自行查阅添加环境变量的位置。写在 .zshrc 这样的用户级配置里也是可以的,但 .zshrc 的默认存放位置是 ~/.zshrc…… 是的,它本身就在 Home 目录下随意地摆着。如果你想把 .zshrc 也移动到它该待的地方(~/.config/zsh/.zshrc),你应该在系统级的配置下操作,因为 zsh 默认不会在符合 XDG BDS 规范的目录下查找配置文件。
在 /etc/zshenv 文件里写入以下内容:
export XDG_CONFIG_HOME="$HOME/.config"
export XDG_CACHE_HOME="$HOME/.cache"
export XDG_DATA_HOME="$HOME/.local/share"
export XDG_STATE_HOME="$HOME/.local/state"
export XDG_RUNTIME_DIR="/run/user/$UID"
export ZDOTDIR="$XDG_CONFIG_HOME/zsh"
请注意我还在最后添加了一个 ZDOTDIR(Z Dot Directory)环境变量,这是为了告诉 zsh 把点文件放在 XDG_CONFIG_HOME 下,因为正如前文所提到的,zsh 不会读取 XDG 相关的环境变量。
接下来重启 Shell,尝试输出这些环境变量确认配置是否完成。
➜ ~ echo $XDG_CONFIG_HOME
/Users/eltrac/.config
能正常输出就没有问题了,你已经完成了环境变量的配置。接下来,支持 XDG BDS 的软件就会自觉地把文件放在你指定的地方。根据我们的默认配置,这些位置分别是:
~/.config
~/.cache
~/.local/share
~/.local/state
你可以随意修改,把数据放在你想要的位置,编辑环境变量即可。不过我偏好保留默认配置。
不过,你的 Home 目录还是和以前一样乱,因为支持 XDG BDS 的软件并不会自动帮你把原先的文件移动到环境变量里指定的位置,它们只是会优先在你指定的位置进行读写而已。然而,鱼龙混杂的软件中免不了有好几个不默认支持 XDG BDS、需要额外配置的软件,甚至有的完全不支持。如果贸然把所有的文件都迁移到 XDG BDS 目录下,会有大量的软件无法读取到原先的数据文件而出现问题。更致命的是,我的 Home 目录本来就很乱,我怎么分得清哪些是配置文件,哪些又是缓存和数据文件?
你可以安装 xdg-ninja 这个命令行工具,它会扫描你的 Home 目录,列出他识别到的文件,给出配置、迁移指南和注意事项——哪些文件可以直接删除、哪些软件需要额外配置环境变量、哪些软件需要用到一些歪门邪道,全都罗列得很清楚。不过,xdg-ninja 也并非万能,如果你遇到没有识别到的目录或文件,可以考虑自行寻找解决方案后为 xdg-ninja 提交 Pull Request。

xdg-ninja 会引导你配置额外的环境变量,你可以放在系统级的 /etc/zshenv 里,也可以放在用户级的 ~/.config/zsh/.zshrc 里。由于有不少开发环境和系统工具不会读取用户级配置,所以我的做法是把所有 XDG BDS 相关的配置都放在 /etc/zshenv 里。
记得每次更改之后都重启 Shell,也可以执行 source /etc/zshenv 或 source ~/.config/zsh/.zshrc。由于我频繁操作 zsh 配置,所以我写了一个命令行 alias:
# Quickly edit zsh config
alias zshconf="nvim ~/.config/zsh/.zshrc && source ~/.config/zsh/.zshrc"
alias zshenv="sudo nvim /etc/zshenv && source /etc/zshenv"
在终端执行 zshconf 就可以用 NeoVim 打开用户级配置文件(用 zshenv 打开系统级配置文件),保存并退出之后就会执行 source 命令应用更改。
依照 xdg-ninja 的文档进行配置之后,就可以放心地把文件移动到它该待的地方了。这会花点工夫,而且不是一劳永逸的——如果有新的软件被安装,你可能还需要进行配置,不然 Home 又会随着时间推移而变乱。
至于那些不支持 XDG BDS 的软件,我的建议是提交 Issues 或贡献代码,推进规范的实现。如果是闭源软件,那…… 换成开源的替代品,嗯。我就把 Claude Code 换成了 OpenCode ,好用,开放,还能让我的 Home 变干净。
这是我目前的 Home:
/Users/eltrac
📁 .cache 📁 Applications 📁 Movies ⚙️ .CFUserTextEncoding
📁 .config 📁 Desktop 📁 Music ⚙️ .DS_Store
📁 .local 📁 Documents 📁 Pictures 🔗 .nix-profile
📁 .ssh 📁 Downloads 📁 Projects 📝 Brewfile
📁 .Trash 📁 Library 📁 Public
其中 .Trash、.CFUserTextEncoding 和 .DS_Store 是 macOS 在 Home 目录下生成的无法移除的文件,是 macOS 用户不得不接受的事实。除此之外,我对我现在的 Home 很满意。以及,我也会允许个别系统级工具在 Home 目录下占有一席之地。
2026-01-10 14:40:45
本页面响应 uses.tech 的号召,罗列笔者使用的设备和软件,分享工作流和玩物体验。此页面会在未来移动到 guhub.cn ,现临时存放于此。
主力设备,开发和写作都用它,会被我背到各种地方,最常待的地方是我的大腿。
搭载 macOS 18
放在家里长期开机的电脑,最常见的使用场景是拿来看剧,未来可能会用来自托管应用。
搭载 macOS 26
就是一台正常的手机。
搭载 iOS 26
过去使用过的设备:
连接到 Mac Mini:
连接到 MacBook:Absolutely Nothing
我的 MacBook 和 Mac Mini 都只有 256GB 的存储空间,而我只有一个用来存《老友记》全集的 1TB 的移动硬盘。我几乎没有任何硬性的存储需求,也完全没有存储焦虑。所以,这一节暂时还写不了什么。
🍺 Homebrew
除了极个别只能够在 App Store 上获取的应用,我所有的软件几乎都通过 Homebrew 安装和管理。
🛠️ MISE-EN-PLACE
不错的开发工具管理器,编程语言的运行时和各种开发环境相关的工具都会通过 Mise 安装,可以替代 nvm 等特定的开发环境版本管理工具。值得一提的是,Mise 本身是通过 Homebrew 安装的。
🟧 pnpm
很好的 npm 替代,能够兼容 npm,并且不会在项目目录下生成反重力 node_modules,速度也要快上不少。建议所有前端开发者使用。
希望有一天 Markdown 可以统治全世界,这样我就不用被 .docx .pptx 恶心了。
The one and only —— NeoVim
你可以在 这个仓库 查看我的 NeoVim 配置。我使用 lazy.nvim 管理插件。以下是一个预览:

如果你在好奇为什么上面罗列的这么多软件里没有一个笔记软件,那是因为我的笔记都在这里:

关于这些笔记本各自的用途,我在这条 嘟文串 里有解释,未来也许会补充和整理到这个页面。
2026-01-08 10:39:25
我渐渐发现,人在某些时候渴望成长和改变,并非是为了成为「更好的自己」,而是为了摆脱那个「令自己讨厌的自己」。比如,由于讨厌自己的内向和社交恐惧症,于是逼自己去做只有极度外放的人才能做出来的事情——我有一段时间去做过推销的兼职,那段时间我每天都在逼自己做不想做的事情,精神状态变得很差。那份兼职最后的结果是:我给主管写了六千字的信宣泄我的不满,把她也弄得很焦虑;她婉言相劝,我执意要走。
我的情绪爆发和当时部门的管理方式也有关系,不过我想我之所以会把情绪积压到一起,无法正常沟通交流,主要原因是我对自己太严苛了。我这么做的原因很复杂,一方面受到了身边人的影响,另一方面我的确对自己的性格感到不满意。那段经历给我留下的印象太深刻,以至于我现在看到教人变得外向的说辞,都会鄙夷地将其视作成功学。社交能力和宜人性是两个完全不同的属性。
我在试图搞明白的问题是:因为讨厌现在的自己,所以变成另一个让自己不那么讨厌的人,这样的改变,算得上是成长吗?
Personal development or self-improvement consists of activities that develops a person’s capabilities and potential, enhance quality of life, and facilitate the realization of dreams and aspirations.
个人发展或自我提升由一系列这样的活动组成:发展人的能力和潜力,提升生活质量,促进梦想和志向的实现。
—— Wikipedia
从我局限的经历来看,那段让我身心健康都受到了些许摧残的经历的确给我带来了成长。我现在在路上遇到推销员会直接拒绝,步子都不带停的,如果真的遇到感兴趣的产品,也能聊得有来有回。我记得我还在上小学的时候,爷爷六十岁大寿,主持人叫我讲几句祝福的话,我看着台下一桌又一桌的来宾,一句话也说不出来。而前不久,某个班委问我能不能担任团日活动的领学(我不知道那是什么东西,因为我根本就没去参加),因为她觉得我「口才不错」。尽管这两件事情间隔了好几年的时间,但我很肯定,我社交能力和公众演说能力的提升是在短时间内发生的,而且和我逼自己干了自己不想做的事情关系很大。
这种变化的确也提升了我的生活质量。我记得我高中时的生日聚餐,明明是我要约同学聚餐,我却不敢和陌生人说话,只能让我的母亲帮我打电话订座。我只敢和熟悉的人打交道,用餐的时候,我也不敢自己叫服务员添饭,而是会在餐桌上问其他人「你们还要打饭吗?」,然后就会有社交能力健全的朋友隔着老远叫服务员过来打饭。嗯,现在可以自己做这些事情了。
至于梦想和志向,这点有些太宽泛和抽象了。如果我的梦想是创造出人们喜欢和需要的东西或内容,而实现它的确需要我能够正常与人沟通,那还是要承认,逼自己是有用的。
那这么说的话,自厌式成长,这个听起来有些不太健康的名词,似乎也算得上是成长了。
不过,我仍然对陌生的环境和陌生的人感到不安。最近我突然没办法通过学校门禁的人脸识别验证,好几次都是保安帮我开的门。我没办法自己在系统上处理,遇到了无法解决的问题,只能找辅导员求助的时候,我也耗费了好多心力做心理建设,才把信息发了出去。后来辅导员帮我联系了保卫处,我得知要自己跑一趟行政楼找信息中心的某某老师帮我处理时,我焦虑得开始咬手指甲。
我想,怕生这个性格特质是很难甚至无法改变的,如果我一直保持自厌的态度,攻击自己的情绪,那只会造就更多的负面情绪。
撸猫的时候要顺着猫毛摸,人的情绪和猫一样,与其对抗,不如顺其自然。这并不意味着要让自己被情绪拖着走,只需要学会正视和处理情绪。我想,我之所以会发展出自厌的心理(根据我的身边的人的观察,我相信这很常见),和我从小经受的教育脱不了干系。这些教育方式和社会风气早就成了陈词滥调,我不想过多提及,只想举一个例子说明。
我小时候很爱哭,我已经记不清有多少次我的爷爷教育过我「男子汉流血不流泪」。由于我从未被教育过如何恰当地表达情绪(我相信身边的大人没有几个人处理情绪的方式算得上健康),幼年的我能想到的唯一方式就是哭喊。尽管哭也是一种宣泄情绪的方式,健康的人在哭过之后通常会感到情绪缓和,但对于一个需要进行社会化的人来说,更重要的是识别情绪产生的原因以及有效地表达自己的诉求。
理想情况下,如果某人的行为让自己感到不适,第一步是识别情绪本身,即「我不高兴」;第二步是识别情绪的原因,即「XX 做了某件事情」;第三步是表达诉求。表达诉求可以参照《 非暴力沟通 》一书中提出的四要素:观察、感受、需求和请求。一个例子是:我看到你把客厅的大灯打开了(观察),我觉得有点不高兴(感受),因为我希望晚上的室内光源尽可能暗下来,这有助于我的睡眠和生物钟调节(需求),所以我希望你能开另一个更暗的暖光灯(请求)。
我在我的整个童年乃至青春期都无法做到情绪稳定,因为我的情绪都发生在内部,从未被表达出来。身为男性,在东亚社会,表达情绪是不被鼓励的,我只能在情绪积压到完全无法忍受的时候大声哭出来,而这个时候,我的情绪也没办法得到处理,因为迎接我的是另一句「男孩子不能哭」。换句话说,我就应该把不满都憋着,全部堵在心里,死死按住,直到我患上抑郁症、双向情感障碍或者别的什么精神疾病。
这种处理情绪的模式在我成年之后依然有所保留,我在前文提到,我写了六千字向我的主管宣泄不满,原因就在于我在一开始没能先好好处理自己的情绪,不知道自己可以在早些时候沟通表达,或者至少找个人倾诉,而是等到忍无可忍的时候才一股脑地放了出来。尽管很久没有大哭大闹,我释放情绪的方式依旧不健康。
在过去的很长以短时间里,我想要改变自己的性格,是希望自己能有能力处理周期性的如潮水般涌来的情绪。差不多一年前,我写了一篇题为《 用文字埋葬自己 》的散文。那段时间,我时常把那部分汹涌、可怕的情绪化的自己描述为一种阴暗潮湿的怪物,并害怕、厌恶它。阅读那段时间的文字,我感到自己的不安,那个时候的我只想要逃离,可我怎么也逃不出自己。不久后,我写了一篇题为《 电梯里的无头天使 》的小说,讲了一个半天使半恶魔的存在意外从主人公的身上被甩出来的故事,在那个故事里,我必须面对那个软弱、丑陋、对一切都感到害怕、毁掉了自己生活的自己。故事写到结尾,我意识到我似乎跟自己和解了——他正是因为弱小,才需要被另一半的自己照顾啊。
如果把人的意识分成理智、情感、情绪和本能,情绪一定是其中最弱小的一个。理智可以通过思考达成自洽,情感本身就能支撑起存在(就连痛苦也是),本能会迅速地为机体提供解决方案,而情绪,就像是一个需要被悉心照料的小孩子。
所以,现在的我正在努力不去厌恶自己的情绪,毕竟,能够准确地识别自己的情绪,遵从自己内心的价值感,是难能可贵的能力。
我的一个朋友一直相信 MBTI 类型是能改变的1。尽管 MBTI 反映的其实并非性格而是底层认知偏好,但他显然不了解这些理论知识,觉得改变 MBTI 就是改变人格,甚至改变命运。他身为 INFJ,告诉我他想变成 INTJ 或者 INTP(据说有一些 INFJ 也希望变成更开心的 ENFP)。我在想,这是不是因为他多少有些厌恶自己 F 的部分呢?
MBTI 尽管更多的是一个社区驱动的大众心理学概念,但要认真讲的话,其中还是有不少有启发性的观点。大部分人谈 MBTI 的时候只谈二分法,而不了解荣格八维认知功能,而荣格提出的心理类型是迈尔斯发展出 MBTI 理论的基石。简单来说,MBTI 把荣格提出的八种心理类型变成了八种认知功能,指出没有人会只使用一种认知功能,而是会使用全部八种,只是偏好不同、擅长的功能不同。由此,八种认知功能在个体层面又分化出了主导功能和辅助功能等概念,八维功能的排序组成了认知功能堆栈(function stack)。
一般来说,人们只使用排在前四位的认知功能,而后面的四位被称作阴影功能,在个体处于焦虑、不健康的精神状态下显现(这也是为什么 MBTI 测出来的结果会不准,个体在做测试时极有可能处于使用阴影功能的不健康状态)。其中,第四位功能被称作「劣势功能」(inferior function),这是阳面功能中,个体最不擅长的。
拿 INFJ 举例,他们的劣势功能是 Se(外倾感觉),这意味着 INFJ 不擅长感知当下。我的一个 INFJ 朋友在外买票的时候,前台工作人员表示可以现场购买,有学生优惠,而他却一直沉浸在自己的世界里,在抖音等各个平台搜索优惠,然后问我「你想不想省几块钱?抖音上只要 56」。随后我和前台工作人员齐声告诉他:「学生优惠只要 52」。更广泛地来说,INFJ 也不擅长感知当下的快乐,更关注逻辑推演而非外部事实。
MBTI 社区还有一个有意思的理论叫作「循环」(Loop)。内倾型个体的主导功能和第三功能都是内倾的,外倾型个体的主导功能和第三功能都是外倾的,比如 INFJ 的功能堆栈的前四位是 Ni-Fe-Ti-Se。对于内倾型个体而言,使用内倾型的认知功能会更舒服,外倾型同理。循环指的是内倾循环或外倾循环,一般是 1-3 功能循环,指个体只使用主导功能和第三功能,忽略了辅助功能,更不用说劣势功能了。循环是不健康的心理状态,INFJ 如果陷入循环,就会只使用 Ni 和 Ti 功能,即内倾直觉和内倾思考,颇有一种不关注真实世界的虚无主义哲学家的感觉。由于辅助功能 Fe 不被使用,陷入循环的 INFJ 会显得有些不近人情,甚至会抛弃道德判断;Se 也不被使用,前文提到的 INFJ 的劣势会更加明显。
如你所见,MBTI 社区对健康、健全的定义基本上可以概括为「使用并发展全部四种阳面功能」,尤其是要提升自己的劣势功能,学会更好地使用自己的主导功能。
致力于改变自己的 MBTI 类型(这根本不会发生),而非全面发展自己的认知功能,与我在前文所讲的逆着猫毛摸和顺着猫毛摸如出一辙。倘若那位 INFJ 个体真的要变成 INTJ,那就需要把自己功能堆栈从 Ni-Fe-Ti-Se 变成 Ni-Te-Fi-Se,把外倾的情感功能变成内倾的,把内倾的思维功能变成外倾的,然后调换这两个功能的位置。如果变成 INTP,INFJ 的主导功能甚至会从 Ni 变成 Ti,从感知功能变成判断功能。这意味着什么?意味着个体需要改写自己的认知偏好,克制每一个近乎本能的冲动,去做哪些一般来说的自己会讨厌的事情——然而,这在 MBTI 的理论下,最多也只能提升个体对部分功能的熟练程度而已,无法改变认知偏好。INFJ 可以变成更好的 Se 使用者,这不代表他们会变成 ESTP 或者 ESFP,他们的主导功能仍然是 Ni,这层想象力和直觉无法被改写。INFJ 可以使用 INTJ 擅长的 Fi 和 Te 功能,但这对他们来说并不会觉得好受,因为这是他们的阴影功能。还记得阴影功能在什么时候会被使用吗?焦虑和精神状况不稳定的时候。强迫自己使用完全不擅长的阴影功能,本身就是不健康的心理状态的体现。
如果 MBTI 类型会改变,这一套有关循环、劣势功能和个人成长的理论就都没有意义了。你当然可以鄙夷 MBTI,它本身就不是正经心理学2,但如果真的要讨论 MBTI,还请尊重它的内部逻辑。
试图改变自己的人格类型,会把自己往焦虑症上推。顺着猫毛撸的做法是提升和发展自己的劣势功能,这是 MBTI 社区很提倡的做法。所谓的「成为高阶 INFP」或者别的高阶人格的说法,大部分都是指发展劣势功能,比如擅长使用 Te 功能的 INFP 就可以被称作「高阶 INFP」——尽管我不太喜欢这个说辞。比如,我之所以不喜欢这个说辞,是我的主导功能 Fi 在工作,我的价值体系里,人格是不应该有高低之分的;而我之所以能理解「高阶」这个用词及其提出者背后的逻辑,是我的 Te 在工作。INFP 很有可能因为讨厌一个东西或者觉得某个东西不重要而远离它,而发展劣势功能 Te 能帮助 INFP 个体更全面地认识世界。
回到一开始的,更抽象的讨论上来。自厌式成长或许能帮助自己提升能力,收获一定程度的成长,但原先自己讨厌的特质依然会存在,毕竟那就是自己没办法割舍的一部分。社交能力的提升无法改变自己更喜欢独处的事实,也无需改变。更健康的做法是扬长强短,发挥自己最擅长的心理功能,发展自己最劣势的心理功能。
这也是为什么我明知类型学理论无法概括所有人,却还是热衷于研究和讨论人格类型——类型学能帮助个体认识自己,并借此发现自己的长处和短处,成为更健全和成熟的人。
关于为什么我认为 MBTI 类型不会改变,请参考 第 61 期周刊的内容 ↩︎
是一对迷恋荣格的作家母女创造的理论,本文提及的大部分内容还都是社区提出的,而非正经的心理学者提出的 ↩︎
2026-01-05 10:13:50

Johnny Mathis
上周去看了《魔法坏女巫 2》之后,对巫师和 Glinda 合唱的那首《Wonderful》印象很深,看音乐剧《雨中曲》的时候也听到了 Wonderful 这个词,不知怎么地,竟然触发了有关另一首歌的回忆,歌名就叫作《Wonderful, Wonderful》——这是《绝望的主妇》最终季最后一季,Karen McClusky 请 Bree 帮她找了一张唱片,她在病床上离世时就听着这首歌。同时进行的还有另一条故事线,Susan 的女儿 Julie 在医院诞下了新生命。这个结局让我印象很深刻。
📜
作者观察到一种现象:许多会使用 LLM 编程工具的新人,会在用 LLM 写出一大堆代码之后直接提交 Pull Request,指望同事或者开源项目的维护者在审查代码的时候解决问题。这很不负责,不仅在浪费其他人的时间,还完全没有尽到一个开发者的职责。
作者认为在提交 PR 时,应当附上「代码能跑」的证明,以下两个步骤都不能被跳过。
其中,自动测试甚至也能用 LLM 写,尤其是在原先就已经有测试代码的情况下,Coding Agent 甚至会在没有被显式要求的情况下按照现有的模式编写测试。此外,不能因为有了自动测试就不进行手动测试,测试不总是能覆盖所有情况。测试应当包含最主要的操作路径(happy path)和边缘情况(edge cases)。
作者还提到了一个很有启发性的观点:计算机不能被追责(held accountable),程序员作为人类的工作就是为交付的成果负责。 我一直以来也有一个类似的观点:LLM 无法取代人类,因为一个软件系统无论如何都要有输入才能工作,换句话说,就是要有人写提示词、维护上下文,以及编写文档。
📜
作者分享了他使用 AI(准确来说是 LLM)辅助写作的方法,读完之后我对这种写作方式有了一些改观,我想这对一部分人来说大概是有帮助的,只是我自己仍然会坚持每个字都要自己敲出来。
作者在编写技术文章时,主要用 LLM 绘图和生成示例代码,因为自己画图和改代码很费时间——我觉得这是好的,能让作者把注意力放在写作上(理清思绪、组织语言、尽可能表达清楚自己的意思),不去关注那些细枝末节的事情。作者是让 LLM 用 Excalidraw 画图的(应该是 JSON 格式),我觉得完全可以换成 Mermaid 或者 PlantUML 等绘图语言,这样画出来的图风格更统一、自己写代码画图也不会像用 GUI 画图那样费事费力,就算用 LLM 生成,也能避免因 LLM 极其不稳定的空间想象力导致的错位问题。1
作者也会用 LLM 编写生活类文章,他表示用 LLM 辅助这类写作反而让时间变长了,因为他会先用自己的话把故事讲一遍给 LLM 听,再让 LLM 写进文章里,然后还会对风格和细节提出进一步的要求。说实话,看到作者写出了「让小标题更加简短和文艺」这种提示词的时候,我还是很难对这种写作方式表示认同——如果自己本来就不是一个「文艺」的人,那为什么要让 LLM 帮你把文章写得文艺呢?你本来就不会也不需要写出那样「文艺」的文字啊?
这大概和社会文化脱不了干系,大家都想要写出「好」的文章,而不是完全真诚的表达自己——真诚自然也包括写作风格上的真诚,我认为写作风格就是作者人格中某一部分的自然流露。
形成个人风格的最佳手段是尽力自然而诚恳地写作。构成个人风格的不是刻意为之的文风,不是充满诗意的段落,也不是对文字结构的疯狂追求。写作者无需刻意为之,风格就会自然呈现。
—— Lawrence Block《 小说的八百万种写法 》
即便不是个大文豪也能写作,每天都在博客写流水账也会有人看,甚至愿意读这种内容的人会更多。我得承认,尽管博客的中文文章没有一句话是 LLM 生成的,但 英文博客 的前五篇文章都有大量的语句是用 ChatGPT 修改过的,因为当时的我觉得一些措辞太尴尬,而 ChatGPT 改过的句子明显好多了。
后来我想明白了,我本来就不是作家,不是英语母语者,写不出完全没有错误、行文流畅、语言自然的文章是理所应当的,我犯错是应该的。我很喜欢 LessWrong 的欢迎页面的开头引用的一句话:
The road to wisdom? Well, it’s plain and simple to express:
Err
and err
and err again
but less
and less
and less.
– Piet Hein
我最近在读《The Design of Everyday Things》,其中有一章的标题就是:To Err is Human.(犯错是人)LLM 可以写出平均的「好」,但写不出真实的「坏」,更何况,LLM 生成的内容也逃离不了幻觉、错误,写出来的文章也绝非完美(写文章根本没有完美这一说!)。为什么要让自己给 LLM 当 Agent,修改和清理一个计算机程序生成出来的东西呢?
跑个题。读完这篇文章,我想起来我观察到有不少人虽然不用 AI 直接辅助创作,但会用 LLM 帮他们改文法问题。把文章草稿复制粘贴到聊天框,让 LLM 帮忙找错字和语法问题等。对此,我也发表一下我不太友好的观点。
我觉得用 ChatGPT 这样的大模型帮你的文章找错别字是一件很蠢的事情,因为 LLM 是生成式模型,不会像传统算法一样关注你的每一个输入,注意力机制很容易让 LLM 忽略用户输入文本中的某些内容,导致一部分错误没有被纠正。更致命的是,LLM 无法避免幻觉,纠出不存在的问题也是完全有可能的。甚者,LLM 完全有可能「不知道」正确答案,自信地帮你把正确的东西改错、把小错改成大错。
简单来说,真的要用软件辅助改错别字,用词典、语言概率和专门训练用于纠错的小模型效果会好得多得多,它们能做到稳定和准确地匹配。拼写检查在上个世纪就已经实现了(现在几乎每个编辑器都自带拼写检查),语法检查也在十几年前就有人做了(如 Grammarly),只是中文的语言处理工具相比英文没有那么成熟而已,LLM 不是必须的——人们对 AI 的狂热已经让他们开始忽视早就存在的、更好的解决方案了。
📜
一般来说,程序员在本地进行开发的时候会使用 localhost(指向 127.0.0.1 的一个域名)加端口号进行测试,比如 Vite 的 dev server 就默认跑在 5173 端口,运行 npm run dev(或者 pnpm dev)之后就可以启动 dev server,通过 localhost:5173 访问正在运行的服务器,用于开发和调试。
这么做一般来说没问题,但有几个弊端:
localhost 和 127.0.0.1 都太长了http:// 协议的网址作为重定向 URL简而言之,有一个解析到 127.0.0.1 的域名用作本地开发会很方便,但自己注册太贵,用现有的域名可能也太长,本文的作者收集了一些本身就解析到本地的域名,其中最短的一个是 lvh.me,顶级域名和子域名都解析到本地,可以在开发过程中使用。
顺带一提,我第一次知道 *.localhost 也是默认解析到本地的,不只可以用 localhost。
本条由 @doincyberspace 投稿
这期周刊的 AI 含量有点高,还请读者见谅。AltBot 是 Fediverse 上的一个机器人账号,由 @[email protected] 创建,开放给所有 Fediverse 用户免费使用,用于给图片自动生成 Alt Text。
Alt 是 Alternative 的缩写,也是 HTML <img> 标签的一个属性,一开始是图片失效时代替(alternative)图片显示的文字。如今,Alt Text 也用于保证网站的可访问性(Accessibility),盲人可以通过 Alt Text 了解他们看不见的图片内容。为图片添加 Alt Text 是如今 Web 开发的共识,Mastodon 等联邦社交媒体也要求用户在发布图片时为图片添加 Alt Text。为了帮助用户更方便地为图片添加 Alt Text,@micr0 创建了 AltBot。关注 AltBot 之后,如果账号上有发布没有 Alt Text 的图片,AltBot 就会通过本地模型识别图片,帮你编写文字。
@micr0 的本意是让 Fediverse 变得更具包容性,毕竟觉得麻烦的话,大多数人可能选择不写 Alt Text,这完全是可以的。最近有盲人用户发声批评 AltBot,希望人们反对它,原因是他经常在时间线上读到那些用 AltBot 生成的糟糕描述,很多根本就不准确。他认为人类写的 Alt Text 永远是更好的,至少是下了心思想让盲人读者理解,而不是把写 Alt Text 当作负担,必须要用自动化的方式应付了事。
Post by @[email protected]View on Mastodon
这件事情发生后,@micr0 很快关停了 AltBot,这之后每个使用 AltBot 的用户都能看到一开始发声的那位盲人用户发的帖子——他做了他能做的,尽可能让更多人听到盲人群体的声音。不过,这条讨论串后面的内容变得有些过于情绪化了,这位盲人用户甚至称「健全人对我而言也是一种负担」。
Post by @[email protected]View on Mastodon
后来我看到了 @micr0 的嘟文,他表示自己在收到消息之后很快做出了行动,暂时关停了 AltBot,一直有在收集反馈;在先前那条讨论串的回复中,他也有在积极跟其他用户交流想法,提出了改进方案。从一开始,他就有追踪能源使用,因为他关注环保;为了保证用户隐私,他使用的是本地模型而非云服务。他为 AltBot 花了很多心思(成本就更不用说了),然而却有人进行人身攻击,表示他「太笨了以至于不能理解 AltBot 是有害的」。
Post by @[email protected]View on Mastodon
这起事件倒没有引发我对无障碍设计的思考,但它让我反思:为什么人们不能一开始就友善地沟通,而是在情绪积压到一定程度过后直接「开战」呢?为什么要伤害那些真正想把事情做好的人?
一个用于绘图的语言,之前在《 关于一切的纯文本解决方案指南 》中提及了 Mermaid、Graphviz 和 PlantUML 等用于绘图的标记语言,这周我又发现了一个新的绘图语言。Infographic 和 Mermaid 很像,但解决的是不同的需求。在我看来,Infographic 更注重快速构建美观的图表,其风格更像是会插入在 PPT 里的图表。Infographic 是专门为 LLM 设计的,如果用大语言模型生成 Infographic 代码,会比直接用文生图模型高效、稳定得多。
访问: GitHub - antvis/Infographic
名字是 Why is this running? 的缩写,witr 是一个命令行工具,用来查询特定进程的 ID、用户、来源、锁等信息,最主要的是回答「这个进程为什么在跑?谁启动的?」这几个问题。如果进程有什么可疑的举动,拥有某些权限,这个工具也会将其作为警告列出来。
我还挺喜欢这种以疑问词或问句缩写明明的小工具的,常见的有类 Unix 系统的 whereis 和 which,用于查询某个命令的可执行文件和相关文件的路径。我之前也用相似的命名方式写过
wthis
,用于查询 Homebrew 软件包的信息。
访问: GitHub - pranshuparmar/witr: Why is this running?
我在去年年底加入了 Fediverse,拥有了一个 Mastodon 账号。最近在 Fedi 上冲浪的时候,发现了 NeoDB ,也是联邦宇宙的一部分——去中心化、可以自托管、支持 ActivityPub 协议。从需求上看,NeoDB 基本上是豆瓣的开源替代品。如果不想折腾,也可以使用 官方实例 。
我以前就不怎么爱用豆瓣,从 2024 年开始,读过的书、详细的书评和评分都发布在博客上了,不过电影、演出和剧集倒是没有好去处。使用豆瓣等平台,我没办法真正拥有自己的数据,这导致我一直不愿意在上面认真记录。NeoDB 看起来是一个不错的选择,可以自由地导入导出数据,就算我不想继续用官方实例了,也可以自建然后把数据重新导入。
我不会补记自己以前看了什么,但如果你对我最近在看什么、我对各种文化产品的评价如何感到好奇,可以关注我的 NeoDB 主页 ,我也会把内容同步到 我的 Mastodon 账号 上。
访问: NeoDB
之前一直对输入法没有太多感知,秉持着能用系统自带软件解决的需求就绝不额外安装的原则,我一直没有去尝试配置繁琐的开源输入法 RIME 2,毕竟 macOS 自带「小鹤双拼」,可以开箱即用。这周接触到 RIME 的契机,是我上课摸鱼的时候在 Fediverse 上吐槽自己在终端输入 brew update 时忘记切换输入法,意外用 brew 打出了「别惹我」这四个字,没想到引发了一连串有关输入法词库的讨论。
我之所以能用 brew 打出「别惹我」,是因为 r 在小鹤双拼里映射到 uan 这个韵母,而 buan 并不是中文里存在的读音,所以 br 没有被识别为一个字,输入法把我的输入拆成了 b-re-w,于是就打出了「别惹我」。
后来有人提到,在电脑上用雾凇拼音就不会打出这三个字,而是会直接打出 brew 这个英文单词。这时我才意识到,原来中文输入法也能对英文输入进行优化。于是我很快安装了 鼠鬚管 (适用于 macOS 的 RIME)和 雾凇拼音 (一个广受好评的 RIME 词库配置),还找到了一个模仿 macOS 原生输入法风格的 配置 。
大概是经常折腾开源软件习惯了,配置 RIME 我只用了不到半个小时,之后就用得很顺手了。

可能需要用新输入法写过长文之后才能明白有好词库的爽感,目前比较令我惊喜的点是 macOS 的各种版本名居然也在词库里。

跨年夜的时候一个朋友问我想不想元旦去泡温泉,我正好有空,便答应了。顺带一提,这个朋友是去年夏天一不小心喜欢上的那个直男…… 对,我也不知道他为什么找我,我也不知道为什么我答应了。总之…… 元旦那天晚上和直男泡温泉去了,嗯。不过我确实对他没感觉了,而且经过了半年的训练,我觉得我的身材比他好。
本来以为这种需要我付钱进去的场所会有单独的更衣间,结果没有,但还好淋浴间有隔板,只是隔板比公共卫生间的门还矮。有些男人似乎完全不介意,直接在储物柜旁边换衣服,什么都不遮,看到了很多不该看到的东西(而且并不好看)。我去年夏天就是因为相同的原因逃掉了所有的游泳课。
更衣大概是体验最差的环节,泡温泉的过程还是很不错的。人类似乎会因为生物本能而靠近热源,人几乎都聚集在温度最高的几个小池子里,从第三方的视角观察那个场景还挺奇妙的。泡在泉水里很舒服,一方面整个身体会温暖起来,另一方面身体会被浮力拖举起来,感到很放松。我还把头放在岸边,让身体的剩余部分扶起来,就这样闭着眼睛放空了好一会。不过旁边有小孩子玩水,还是得注意周边的环境。
第一次泡温泉还让我发现了关于自己的有趣的一点:我更耐寒,但不耐热。朋友裹着毛巾在岸上走一直发抖,我倒觉得还好,但在汗蒸房是真的待不下去。总的来说,体验中规中矩,如果有下次,我会选择私汤。
另外,在水里做卷腹会有用吗?
去年全面从 Windows 转向 macOS 和苹果生态,许多服务都开始使用苹果的原生应用,也花钱购买和订阅了不少 SaaS,原因是我想要获得更高质量的软件体验。不过,最近 Apple 的软件质量越来越不尽人意,再加上随着自己作为程序员的认知提升,我对数据和隐私的敏感度也逐渐提升,所以 2026 年我在数字生活方面的目标就是:全面拥抱开源软件和自由软件,逐渐转向本地优先和去中心化的解决方案。
开源软件即开放源代码,而自由软件则是允许使用者自由使用、分发、执行、研究、改动甚至售卖的软件。这两个概念有所重合,比如使用 MIT、GPL 和 Apache 开源许可证授权的开源软件都是自由软件,但并非完全一样。所谓本地优先,就是我的数据主要储存在本地,而不是上传到云端,同时,我的数据应该是以纯文本、Markdown 和 JSON 等开放的数据格式存储的,我可以对数据做任何事情,也可以随时拍屁股走人,带着数据换个软件用。至于去中心化,就是说软件服务不由某个经销商运营,而是由数个独立的服务器组成的分布式网络,用户可以自己搭建服务器或者选择自己信任的服务器使用,而不是把数据交给某一个邪恶的大公司。
我还在做的一件事情是去 Chromium/Electron 化,目前已经能用 NeoVim 代替 Obsidian 了,用上 Claude Code 之后我也不需要用某个基于 VS Code 的 AI IDE 了(再加上我本身对 LLM 的需求也没有很高),所以我可以很荣幸地宣布:从此我的 MacBook 上没有一个多余的 Chromium 内核。3
这种选择软件的原则会带来以下好处:
目前我的各种软件选择如下:
诚然,微信这种软件我是没有办法不用的,我能做的只是减少使用频率,同时在这样的平台上产生尽可能少的数据,把我主要的数字生活建立在我信任的互联网上。此外,我也不排斥 SaaS,像是运动健康相关的需求,我依然会选择与系统集成更好的手机 App,但我仍然更偏好尊重用户数据和隐私的开发者,比如 Gentler Streak 团队5。
详见:《 关于一切的纯文本解决方案指南 》 ↩︎
还在用 Windows 的时候其实有尝试过,但当时还是个麻瓜,没折腾多久就放弃了。 ↩︎
如果你不清楚我在说什么:现在很多跨平台的桌面端软件,都是使用 Electron 开发的,这个框架允许开发者使用 Web 前端技术开发桌面端软件的用户界面,可以极大节省开发成本,提高效率。然而,Electron 会把一个完整的 Chromium 浏览器内核打包在软件里,这使得软件包变得很大,而且完全没有必要。我不反对网页套壳,相反,我很喜欢 Tauri 和 Wails,这两个框架与 Electron 类似,但它们使用操作系统默认的 WebView,不会把一整个浏览器打包在软件里。 ↩︎
Gentler Streak 每次启动都会从苹果健康里读取数据并进行分析,数据永远不会离开用户的设备。 ↩︎
2026-01-02 12:13:24
I like emails. They’re quiet and you don’t have to rush. And they’re decentralized. You get to choose who stores your data. If you’re on WeChat, Line, or whatever IM apps you’re using, you’re forced to stay there because that’s where all your contacts are. Emails are portable. Save your mails as .eml files and store anywhere. Keep your address, if you own your domain name, and migrate to wherever you want, preferably someplace you trust, and people can still mail you with the same address.
I was using Tencent Exmail for a long time. It’s an evil service provided by an evil big corporate if you don’t know, as evil as Google. It’s hard to get a custom domain email address in China. People rely on emails less and there are fewer options. Some people use Cloudflare or similar services to create an alias for their email, but that’s still your data in a BigCo’s data center. What you get is merely a cool address.
Not really paranoid about privacy but I do feel more comfortable if my mails don’t go through people I don’t trust. So I started looking for new emails services.
I searched and asked ChatGPT, ruled out some hard “No"s, and got 3 options:
They’re all small services. Best of all, they’re cheap, like insanely cheap. Migadu’s micro plan costs $19.9 annually. PurelyMail costs $10. MXRoute was defintely the cheapest, $15 for 2 years! But that offer is only available when they’re doing a promotion.
They all offer unlimited domains and unlimited addresses. Only Migadu comes with a few constraints, 200 emails in per day and 20 out per day, and also you only get 5GB storage (But they’re all soft limits. There is tolerance).
Eventually I chose Migadu, for two major reasons:
Migadu is surprisingly honest about their service. They have a Pro/Cons page (where pro is actually absent) listing all the reasons why you probably don’t want to use Miagdu. For example, they’re made for human emails only, meaning they don’t send bulk transactional emails. They are honest about their pricing not being the cheapest, their spam filters not being perfect, their server not being in Switzerland but in France… And they offer fully-functional trials, so you know exactly what you’re paying for.
I love how opinionated they are. They do things their way and they are honest about it. They don’t dazzle customers with fancy words. They don’t even use Web Analytics or track their users in any way!
The setup was smooth. DNS configuration can be intimidating even if you have experience, because configuring email systems is way more complicated, with multiple TXT, CNAME, SRV records. Merely 2 MX records with not work. They have clear documentation on setting up your DNS. All you have to do is read, understand, and copy. Within 10 minutes, I can receive and send emails using Migadu with no problems.
I posted on Fediverse and asked people to send anything to me for testing. And I ended up receiving some really interesting mails. If you’d like, mail me at [email protected]1 and send whatever you want! I’d be happy to make some new friends here.
So, I now use Migadu for my emails. And I hope you also enjoy your email service :3
Update 2026-1-13: I changed my domain, please reach me via [email protected] ↩︎