<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>wzyboy’s blog</title><link href="https://wzyboy.im/" rel="alternate"/><link href="https://wzyboy.im/feed.xml" rel="self"/><id>urn:uuid:f3e66bde-12ee-3828-a8e4-7c9f96f21a0d</id><updated>2026-05-01T14:23:49Z</updated><author><name/></author><entry><title>嘟文摘录（2024-06～2026-04）</title><link href="https://wzyboy.im/post/1595.html" rel="alternate"/><updated>2026-05-01T14:23:49Z</updated><author><name>wzyboy</name></author><id>urn:uuid:48457019-0ff9-3222-96dc-078b70645fde</id><content type="html">&lt;p&gt;本博客快两年没更新了。从 Twitter 转到 &lt;a href="https://wzyboy.im/post/1486.html"&gt;Fediverse&lt;/a&gt; 之后，发文不再有 140 字的长度限制（现在 Twitter 也没了），因此我有些想法就直接发在 Fedi 上而不是单写一篇博客了。&lt;/p&gt;
&lt;p&gt;干脆把最近两年在 Fedi 上发的比较长的帖子摘录整理一下吧。&lt;/p&gt;
&lt;h2&gt;语流音变&lt;/h2&gt;
&lt;p&gt;母语者一般不会注意语言里的一些既定规则，但是一旦注意到了，还是挺有意思的。&lt;a href="https://zh.wikipedia.org/wiki/%E8%AE%8A%E8%AA%BF"&gt;维基百科上的相关条目&lt;/a&gt;。&lt;/p&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;两个三声字组成的词，念的时候第一个字要念二声，这是毫无争议的。例：「雨伞」读出来是音同「鱼伞」。&lt;/p&gt;
&lt;p&gt;那三个三声字组成的词，前两个字如何变调呢？&lt;a href="https://studycli.org/zh-CN/learn-chinese/tone-changes-in-mandarin/#1_Third_tone_changes"&gt;汉语学习网站&lt;/a&gt;上说前两个字都要变成二声，如「九九九感冒灵」前两个字都读成二声。&lt;/p&gt;
&lt;p&gt;是否所有的三字三声词都符合这个规律呢？「远坂凛」和「米老鼠」的字面声调都是 333，但是读出来的话，我会分别读成 223 和 323 的声调，好像有点不太对劲…&lt;/p&gt;
&lt;p&gt;让 ChatGPT 列举了一些三字三声词，我发现三字词的变调和构词有关：「老手表」「土纸伞」这样 A + AA 结构的念 323，而「展览馆」「友好者」这样 AA + A 结构的念 223。&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-06-25 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/1c07032e-f845-4060-8d54-1ec8e16d7a2f"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;GNOME 真难用&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;公司的新电脑预装的是 Ubuntu 22.04，与之前的 Ubuntu 20.04 相比，enshittification 的地方更多了。更多东西的默认用 Snap 分发，并且 GNOME 也在&lt;a href="https://flameshot.org/docs/guide/wayland-help/#gnome"&gt;作死的道路&lt;/a&gt;上越走越远…&lt;/p&gt;
&lt;p&gt;实在受不了 GNOME 的自以为是了，把工作电脑的 DE 换成了 XFCE。啊，熟悉的小老鼠！仿佛回到了十几年前刚开始用 Linux 桌面的岁月！&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-07-08 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/1ac3066a-ddfd-40d9-8ba8-f00f28c87fa9"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;p&gt;因为 tiling window manager 的操作已经写入肌肉记忆，后来我又换成和个人电脑一样的 i3wm 了。&lt;/p&gt;
&lt;h2&gt;在 Amazon 买到二手移动硬盘&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;帮邻居修电脑。我让邻居买个移动硬盘，用来备份电脑里的数据。邻居就在 Amazon 上买了一个。&lt;/p&gt;
&lt;p&gt;第二天硬盘寄到了。我一看，根目录里怎么有 .Trash 和 .Spotlight-V100 目录？邻居用的是 Windows 啊。点开来一看，里面有 500 MiB 的各类文档、照片、视频。点开「2023Tax」目录，里面有不少买教科书收据，这移动硬盘的前任主人应该是个来自 University of Saskatchewan 的学生。&lt;/p&gt;
&lt;p&gt;所以应该是这人买了硬盘之后用了一段时间，删掉了文件（但是依然在 Trash 里）然后退货了，Amazon 又二次销售了…&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-07-13 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/c10b01ad-435d-4d3f-b573-906d9e2c026a"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;p&gt;后来邻居找 Amazon 反馈，客服给他寄了一新的，旧的无需寄回。于是邻居把旧的 SSD 送给我了。&lt;/p&gt;
&lt;h2&gt;《吹响！悠风号 第三季》&lt;/h2&gt;
&lt;p&gt;追了快十年的动画完结了。&lt;/p&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;完播两周后我终于把《吹响！悠风号 第三季》最后两集看完了。&lt;/p&gt;
&lt;p&gt;我没读过原作，但是从漫天评论来看，小说里黄前久美子是毫无波澜地拿到了全国大赛独奏资格的，但动画里改成了部员盲选之后由黑江真由获得独奏资格。&lt;/p&gt;
&lt;p&gt;我觉得盲选这一部分改得还挺好的。关西大赛久美子没拿到独奏资格，部员情绪不稳，觉得真由这个转校生抢了部长的奏位置，在这种情况下泷昇无论把全国大赛独奏资格给谁都有问题：如果给真由，那军心更加动摇，可能会影响全国大赛；如果给久美子，又会显得泷昇被部员的意见所左右。改成部员隔着帆布听音投票，投出个平票，那军心也稳了，泷昇的压力也无了，久美子和真由谁技高一筹也不用争了。算是对之前各种矛盾的处理。&lt;/p&gt;
&lt;p&gt;但是高坂丽奈你选择真由是怎么回事？！泷昇已经说了两人水平不相上下了，除你以外的部员投票也是平票；就算你耳力过人，真的听出了微妙的实力差距，你就不能考虑一下你之前的誓言吗？嘴上说着想和久美子在全国大赛一起吹独奏，实际却在最后关头做出了相反的选择。唉。&lt;/p&gt;
&lt;p&gt;说起来，这是我第一次见到 Bangumi 上单集评论数量 1000+。&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="media"&gt;
        &lt;figure class="media-item"&gt;
            &lt;a href="https://files.dabr.ca/c8943a4fca360ea8111d1ee6db7b74e90d069474f3d645fb6c2bfb508270faaa.png"&gt;&lt;img src="https://files.dabr.ca/c8943a4fca360ea8111d1ee6db7b74e90d069474f3d645fb6c2bfb508270faaa.png" alt="ep.12 さいごのソリスト 评论 (+1560)"&gt;&lt;/a&gt;
        &lt;/figure&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-07-16 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/7143c6b9-af83-4c86-a1d7-c1d97af4a3ce"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;U2F 和 FIDO2&lt;/h2&gt;
&lt;p&gt;第一次有了 YubiKey，好好地玩了一下。&lt;/p&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;U2F 和 FIDO2 (passkey) 体验与吐槽：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google 自己出的 Titan Security Key 纯粹电子垃圾，对 FIDO2 支持不完整，连 Chrome 都读不出里面的数据（Chrome 可以读 YubiKey 的数据）；&lt;/li&gt;
&lt;li&gt;Google 强推 1-step passkey 没法 enrol YubiKey 作为 2-step verification 的&lt;a href="https://www.reddit.com/r/yubikey/comments/1b7mn8b/cant_add_yubikey_for_2fa_on_google_anymore_due_to/"&gt;解决方法&lt;/a&gt;竟然是临时禁用 YubiKey 的 FIDO2 功能让它只能当 U2F 用？&lt;/li&gt;
&lt;li&gt;1Password 号称支持 passkey 但其实只实现了 resident key (RK) 而面对 non-resident key (NRK) 时不知所措？&lt;/li&gt;
&lt;li&gt;1Password 添加了 NRK 之后会提示可以 passkey sign 但是会失败，并且因为 UI 上只显示 RK 的关系无法删除这个 NRK（但是在 JSON 里可以看到），只能回滚条目的历史版本？&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-07-21 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/9fd740db-a2d0-4175-89f4-e879fc278f7c"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;性能不够就加钱&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;尴尬，我周末去没手机信号的山里露营了，没想到 dabr.ca 竟然挂了，而且没有自主恢复！&lt;/p&gt;
&lt;p&gt;服务器从建站以来就稳定运行，我上次露营也是两年多前了。没想到「服务器挂掉」和「管理员断网了」这两件小概率事竟然撞在了一起…&lt;/p&gt;
&lt;p&gt;我一回到有信号的城镇就收到了大量来自机器和人类的报警，于是立刻顶着巨大的延迟和丢包，在手机上手动重启了 EC2。几分钟后站点总算恢复了…&lt;/p&gt;
&lt;p&gt;回家到电脑再看看具体故障原因是什么…&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-07-28 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/660979c8-b491-413e-81b0-d9dba41a0fdf"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;p&gt;后来发现是性能不足，把 EC2 从 &lt;a href="https://github.com/dabr-ca/infra/pull/35/changes"&gt;t3.micro 升级到 c8g.large&lt;/a&gt; 就没问题了。&lt;/p&gt;
&lt;h2&gt;手机屏幕坏掉时才觉得辅助功能真好用&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;Pixel 9 Pro 看着挺不错的，想买。再过两周就能买到了。&lt;/p&gt;
&lt;p&gt;就在刚才，我的 Pixel 7 突然坏掉了。正常使用过程中，它突然屏幕一黑，只剩下顶上一条闪着诡异的绿光。长按电源键重启也没有用，应该是屏幕本身坏掉了。查了下，Pixel 8 开始才有 USB-C 视频输出的功能，所以我也没法外接显示器和键鼠来操作。&lt;/p&gt;
&lt;p&gt;连接电脑能看到 USB 还活着，但是我把 USB debugging 关了所以没法 adb…&lt;/p&gt;
&lt;p&gt;是花钱修一下屏幕呢，还是过两周不用手机的生活呢？&lt;/p&gt;
&lt;p&gt;手机虽然屏幕不亮了，但是触摸功能是好的。于是我先是用手势解锁了手机（重启之后一定要通过手势解锁一次不能用指纹），然后通过语音打开了 TalkBack 功能，再进到设置里，成功把 USB Debugging 打开了。之后就可以通过 scrcpy 走 adb 通过电脑来操作手机了！&lt;/p&gt;
&lt;p&gt;家属之前因为散瞳而被迫像盲人一样通过语音来操作手机，我想着万一我哪天突然失明了这个技能也挺有用的，因此我也练习过 TalkBack 的使用。没想到今天虽然眼睛没坏但是屏幕坏了，这个技能居然用上了！&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="media"&gt;
        &lt;figure class="media-item"&gt;
            &lt;a href="https://files.dabr.ca/dd5947b4f2c4f6beddf32c4f23a0134a69e1b5ba7f1a27aad4a1dd6ae3c2b714.png"&gt;&lt;img src="https://files.dabr.ca/dd5947b4f2c4f6beddf32c4f23a0134a69e1b5ba7f1a27aad4a1dd6ae3c2b714.png" alt="Developer options"&gt;&lt;/a&gt;
        &lt;/figure&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-07-29 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/a09cfb41-80b0-4a44-85e1-b5ddcb6dc011"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;最近几天因为手机屏幕坏了，我在家时通过 scrcpy 在电脑上操作手机，出门时通过 TalkBack 读屏器操作手机。&lt;/p&gt;
&lt;p&gt;今天去 Shell 加油，发现 Shell 的 app 辅助功能做得非常差，主界面最大的 Pay 按钮居然是个 unlabelled image，并且顺序是在五个按钮的最后，根本没有上下文可以猜到它是什么。我听着 TalkBack 的声音找了半天，最后还是凭借着记忆盲按才点到了它。&lt;/p&gt;
&lt;p&gt;此外，我用的 Fcitx for Android 输入法也没有做好读屏器支持，TalkBack 并不能识别出它打开了一个数字键盘，我切换成 Gboard 之后才成功输入了 pump #，不过之后的步骤还是因为各种 unlabelled image 没能成功。&lt;/p&gt;
&lt;p&gt;明眼人的产品经理和程序员做出来的应用，如果没有专门的团队去做辅助性功能方面的完备性检查，可能就是这样的结果吧…&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="media"&gt;
        &lt;figure class="media-item"&gt;
            &lt;a href="https://files.dabr.ca/2440db21f22e5c98e48d3d92ecfe490a36a51ea1240dfaaaeada6d830e30aea5.png"&gt;&lt;img src="https://files.dabr.ca/2440db21f22e5c98e48d3d92ecfe490a36a51ea1240dfaaaeada6d830e30aea5.png" alt="Screenshot of Shell Android app with a TalkBack pop-up titled &amp;quot;Add label&amp;quot;"&gt;&lt;/a&gt;
        &lt;/figure&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-08-02 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/b7e7c95b-70c3-404c-bc6d-8e25014223ec"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;漂亮的蜘蛛网&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;上周有一只蜘蛛在玻璃移门外侧住下了，织了一张很大、很漂亮的网，在阳光下闪闪发光。&lt;/p&gt;
&lt;p&gt;晚上室内有灯光而室外黑暗，有些昆虫就会在飞向光芒的过程中扑到网上而被粘住。蜘蛛感觉到了猎物，便迅速爬过去，熟练地吐丝把猎物裹起来，然后捧在手里一口一口地吃掉。我们每天早上都能看到蜘蛛在吃不同的虫子。有只大蛾子把网挣破了，蜘蛛还会把网补好。&lt;/p&gt;
&lt;p&gt;今天早上再去看时，发现蜘蛛搬走了，连网也拆得干干净净，仿佛从未来过。心里有些失落…&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-08-06 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/e00f558a-3f38-4684-a700-262871c89684"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;每次登录都要短信验证码到底方便了谁&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;有些网站的账号逻辑真的很奇怪，每次登录都要 SMS OTP，而重置密码也只要收一次 SMS OTP。&lt;/p&gt;
&lt;p&gt;相当于平时登录需要用户名 + 密码 + OTP 三个因素，但是重置密码只要用户名 + OTP 两个因素。&lt;/p&gt;
&lt;p&gt;对于使用密码管理器的用户来说，密码反而是不容易泄露的东西，但 SMS OTP 可以被 SIM swap attack 偷走。这种奇怪的账号逻辑的实际效果就是使平时登录更麻烦，但是让黑产更方便…&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-09-06 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/836c5ba1-fbe3-432e-8fd9-718b74941495"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;我的第一块智能手表&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;戴了二十多年的传统手表，我终于买了我的第一只智能手表 Google Pixel Watch 3。以后感到口袋里手机振动的时候，不需要再掏出手机看通知了，抬手就可以看了！&lt;/p&gt;
&lt;p&gt;代价就是要每天充电了。我之前戴的手表是太阳能电波表，不需要换电池也不需要手动校时，非常省心。&lt;/p&gt;
&lt;p&gt;我虽然是右撇子，但是从小手表都是戴在右手。今天开始尝试人生中第一只智能手表，也开始尝试左手戴手表…&lt;/p&gt;
&lt;p&gt;几个小时后——果然还是不习惯，切换到了右手。舒服多了！&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="media"&gt;
&lt;div class="gallery-grid gallery-grid--cols-2"&gt;
  &lt;figure class="gallery-item"&gt;
    &lt;a href="https://files.dabr.ca/bc3de1953841840b9d17aba347ca1fce93054da1317ce8d691e90072c3039d8d.jpg"&gt;&lt;img alt="Pixel Watch 3 at Best Buy" src="https://files.dabr.ca/bc3de1953841840b9d17aba347ca1fce93054da1317ce8d691e90072c3039d8d.jpg" loading="lazy"/&gt;&lt;/a&gt;
  &lt;/figure&gt;
  &lt;figure class="gallery-item"&gt;
    &lt;a href="https://files.dabr.ca/273c71da7c34f0d3d0ceb5c67da554d5da4985fcbba718ec19c0ce76f2a383fa.jpg"&gt;&lt;img alt="Pixel Watch 3 box opening" src="https://files.dabr.ca/273c71da7c34f0d3d0ceb5c67da554d5da4985fcbba718ec19c0ce76f2a383fa.jpg" loading="lazy"/&gt;&lt;/a&gt;
  &lt;/figure&gt;
  &lt;figure class="gallery-item"&gt;
    &lt;a href="https://files.dabr.ca/d973b848b5f734d41186273d79cd2dda13681a690bf5359a3b37b742c77eb0d1.jpg"&gt;&lt;img alt="Pixel Watch 3 box opening" src="https://files.dabr.ca/d973b848b5f734d41186273d79cd2dda13681a690bf5359a3b37b742c77eb0d1.jpg" loading="lazy"/&gt;&lt;/a&gt;
  &lt;/figure&gt;
  &lt;figure class="gallery-item"&gt;
    &lt;a href="https://files.dabr.ca/8754e0ff5f9cc73e6d67a7f149ab9cd4b807c59106bae056af5bca763ec90ced.jpg"&gt;&lt;img alt="Pixel Watch 3 on the wrist" src="https://files.dabr.ca/8754e0ff5f9cc73e6d67a7f149ab9cd4b807c59106bae056af5bca763ec90ced.jpg" loading="lazy"/&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-09-11 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/f5f4b25e-d36d-4a4a-91a5-834a40dcd97b"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;横跨加拿大之旅&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;五天四夜的&lt;a href="https://www.viarail.ca/en/explore-our-destinations/trains/rockies-and-pacific/toronto-vancouver-canadian"&gt;观光火车横跨加拿大之旅&lt;/a&gt;顺利结束了！&lt;/p&gt;
&lt;p&gt;从山清水秀的东部，到一望无际的中部，再到重峦叠嶂的西部，每睡一天醒来，外面的景色都会有变化。与飞机旅行相比，火车旅行没有舱内娱乐系统，也没有 Wi-Fi，大部分路程甚至没有信号，就连手机时区也得自己手动调。与之相对的，食物是真的好吃，一日三餐都是 fine dining 的水平。包间小了点，但是有独立卫生间还是挺不错的，淋浴的体验也很好。&lt;/p&gt;
&lt;p&gt;用餐的时候是四人拼桌，餐车旁边还有两个活动车厢，里面有棋盘、拼图和各种桌游，也算是鼓励线下交友？我和家属两个人大概是所有乘客里最年轻的几个之一，其他大部分乘客都是银发退休族，我们也算是聆听了不少长者的智慧。&lt;/p&gt;
&lt;p&gt;过了几天悠闲的生活，整天就是吃/睡/看风景/和别的乘客聊天/读小说。平时我只在马桶上和睡前会读小说，在火车上这几天没别的事情干，于是读完了 4.5 本小说！&lt;/p&gt;
&lt;p&gt;最后特别感谢 &lt;a href="https://m.cmx.im/@kyo"&gt;@kyo&lt;/a&gt; 的博客《&lt;a href="https://thirdshire.com/the-canadian-train/"&gt;五天四夜，坐观光火车横跨加拿大之旅&lt;/a&gt;》的种草！图片为我们在车厢里举着种草文的合影&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="media"&gt;
        &lt;figure class="media-item"&gt;
            &lt;a href="https://files.dabr.ca/13d957669c8de35c2f73caf09fdfb1c493713145a4c25fb19ce51ef5788879d3.JPG"&gt;&lt;img src="https://files.dabr.ca/13d957669c8de35c2f73caf09fdfb1c493713145a4c25fb19ce51ef5788879d3.JPG" alt="Foreground: a hand holding a phone showing a web page. Background: a cabin on a train with two bunder beds."&gt;&lt;/a&gt;
        &lt;/figure&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-09-19 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/409d2514-aabe-4f6a-9e6b-75a2989db403"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;天下乌鸦一般黑&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;因为讨厌在 Instagram 刷到自己刚在 Google 搜过的东西的广告，所以我决定改用 DuckDuckGo。&lt;/p&gt;
&lt;p&gt;用了一两个月 DDG 之后这一现象并没有消失，感觉 Instagram 还有别的方式获取我的数据对我针对性地投放广告，光靠停用 Google 是不够的。&lt;/p&gt;
&lt;p&gt;用 DDG 几个月有好多次出现 DDG 搜不到我想找东西但是隐身窗口开 Google 第一页就有的情况。我印象中 DDG 就是买的 Google 的索引数据然后做了匿名化，但现在看来并不是这样…（经提醒：DDG 买的是 Bing 的数据）&lt;/p&gt;
&lt;p&gt;感觉还是得把默认搜索引擎改回 Google…&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-10-14 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/1b93f304-79a1-4584-8544-9b440aaca15e"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;世界是个巨大的草台班子之银行存钱记&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;因为 ATM 怎么都不识别我的钞票所以我去人工柜台存了钱。桂圆倒是人挺好，看我手里拿着一堆 $20 的钞票，一看就是来存钱的，主动让我插队去她那儿优先办业务，一分钟存完搞定。&lt;/p&gt;
&lt;p&gt;当时我就发现一件事：直到我拿着存款小票离开银行的时候，我的钞票还是明晃晃地放在大理石台面上，并没有放进什么类似超市收银机的抽屉的之类的机器里，可见人工柜台存款与 ATM 不同，这套系统不需要验证钞票真的入账就可以更改账户余额。&lt;/p&gt;
&lt;p&gt;几天后我发现银行账户里有两笔人工存款交易，其中一笔与我拿到的小票是一致的，另一笔是 $20。我对照了一下我自己的&lt;a href="https://wzyboy.im/post/1063.html"&gt;账本&lt;/a&gt;，发现真的差了 $20。存钱的时候我懒得数有多少张（塑料钱太难数了），想着银行数钱肯定比我准，就直接把钞票给桂圆了，没想到桂圆当时真的数错了。之后他们大概是发现账对不上了，就给我账户里补了 $20…&lt;/p&gt;
&lt;p&gt;要是银行没有自己修正错误，等我对账的时候发现了，我大概只会怀疑我自己 cash handling 出了问题而不是银行……&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-10-21 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/e72d5e53-a2ff-4ac7-bc5a-564e6e7a1551"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;Linux 内核移除俄罗斯相关的贡献者&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;r/linux 对此事的评论里有一条「&lt;a href="https://www.reddit.com/r/linux/comments/1g9seh9/several_linux_kernel_driver_maintainers_removed/lt8q6j5/"&gt;人们终于了解到了什么是制裁&lt;/a&gt;」。&lt;/p&gt;
&lt;p&gt;我因为工作原因，早就见识了制裁（sanctions）是个多么暴力和无情的工具。以美国的 OFAC 为例，只要你在名单上，你就要被制裁；哪怕是中国人的拼音姓名常见的同名同姓也会让你在 KYC 的时候被卡住，需要人工介入。&lt;/p&gt;
&lt;p&gt;我知道的 OFAC 最离谱的一个&lt;a href="https://ofac.treasury.gov/recent-actions/20121211_33"&gt;案子&lt;/a&gt;：HSBC 在不知情的情况下参与了涉及到伊朗的转账，然后被 OFAC 罚了 $375M。这件事离谱的地方在于：HSBC 总部在英国，出事的分行在迪拜，只是因为 HSBC 在美国也有业务，所以就被 OFAC 搞了，说它 KYC 做得不够彻底，没有发现客户与伊朗之间的联系…&lt;/p&gt;
&lt;p&gt;Q：为什么这些开发者的名字要从维护者列表里被移除？
A：因为他们的雇主（例：Baikal Electronics）在 &lt;a href="https://lore.kernel.org/lkml/e7d548a7fc835f9f3c9cb2e5ed97dfdfa164813f.camel@HansenPartnership.com/"&gt;OFAC 制裁名单&lt;/a&gt;上。&lt;/p&gt;
&lt;p&gt;Q：为什么华为的员工不用被&lt;a href="https://web.archive.org/web/20260204152059/https://github.com/torvalds/linux/pull/988"&gt;移除&lt;/a&gt;？明明华为也被制裁了！
A：因为 Baikal Electronics 在 SDN 名单上，而华为是 Non-SDN。&lt;a href="https://lore.kernel.org/lkml/f90bba20e86dac698472d686be7ec565736adca0.camel@HansenPartnership.com/"&gt;不是同一个名单&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;Q：为什么我还是如此愤怒？
A：因为 Greg K-H 没有对移除做出足够详细的解释，事情发酵之后嘴臭王 Linus Torvalds 又亲自下场喷人。&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-10-23 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/1459c80f-7354-4bc6-a67c-b7ec3bbd69e2"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;YouTube 有声音但是 Prime Video 没有&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;电视机接音响，YouTube 有声音但是 Prime Video 没有。我在 debug 的过程中学到了新知识：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我原以为用光纤传递红色激光的 optical audio 接口的名字就是 S/PDIF，但其实那个接口叫 TOSLINK (Toshiba Link)；&lt;/li&gt;
&lt;li&gt;S/PDIF (Sony/Philips Digital Interface) 是 TOSLINK 里的数据协议，但它不光可以通过 TOSLINK 传输，也可以用更古老的 RCA 接口传输；&lt;/li&gt;
&lt;li&gt;常见的 3.5 mm 音频接口和 RCA 接口传输的是模拟信号，音响是个笨设备，插上就能响，但 TOSLINK + S/PDIF 是数据信号，如果音响无法完成从数字→模拟的转化的话（比如无法解码 Dolby Digital 和 DTS），就不会响。&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-10-29 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/c4c9a174-afea-4187-a1f2-2619dfad61b2"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;再见 Google Timeline&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;Google Timeline 的网页版也要死了，以后只有手机上可以看位置历史了。今年早些时候我就知道这个新闻，当时说是会慢慢地给现有的用户发邮件，邀请他们做做数据迁移。&lt;/p&gt;
&lt;p&gt;现在临近 2024-12-08 的大限，我的 Google 账号还是没有收到迁移邮件。亲友的 Google 账号都收到邮件并且完成迁移了，我的小号也收到了，但是主号至少还是没有收到。从亲友收到的邮件来看，不仅有单独的邀请迁移的邮件，并且在 monthly update 里也会出现大红字提醒迁移。然而我的 monthly update 邮件里依然岁月静好…&lt;/p&gt;
&lt;p&gt;我的 Google 账号是被漏掉了吗？&lt;/p&gt;
&lt;p&gt;点击亲友转发的迁移邮件里的链接没有用，手动到手机应用里也找不到迁移入口。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Google Takeout 倒是能导出 Google Timeline 的数据，里面记录从 2010 年到 2024 年共 15 年的位置数据，那 864 MiB 的 JSON 文件，会把我的 NeoVim 直接卡死…&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;Keep your Timeline? Decide by May 26, 2025&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;终于轮到我了！原来不是所有的账号的大限都是相同的…&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-11-23 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/c6ed5554-2642-44f9-8bbc-81106004dd85"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;git-delta&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;这两天把 diff-so-fancy 换成 &lt;a href="https://github.com/dandavison/delta"&gt;git-delta&lt;/a&gt; 了。&lt;/p&gt;
&lt;p&gt;起因是想把 Linux 里的 nvim 的配置在 Git for Windows 里使用，然后发现 Perl 写的 diff-so-fancy 难以工作，搜了一下发现有个 Rust 写的 git-delta 是个更功能更丰富的 diffFilter——单文件，全平台，用 winget 也可以方便地安装。赞美 RIIR？&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="media"&gt;
        &lt;figure class="media-item"&gt;
            &lt;a href="https://files.dabr.ca/93ec2bb1fbe6e64142c7271e606f1dea1058abfe1c5a3d1193ac5623cba5ff3c.png"&gt;&lt;img src="https://files.dabr.ca/93ec2bb1fbe6e64142c7271e606f1dea1058abfe1c5a3d1193ac5623cba5ff3c.png" alt="git diff feat. git-delta"&gt;&lt;/a&gt;
        &lt;/figure&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2024-11-26 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/8b09cd67-65ae-4d91-ac8f-948cdf679c3c"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;小小 Python 脚本竟然导致电脑卡死&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;写完一个 Python 脚本想跑一下，结果发现整个电脑卡死了，鼠标键盘全部没有反应，就连状态栏里的时间都不走了。&lt;/p&gt;
&lt;p&gt;原来是我忘记写 shebang 了，而第一行 &lt;code&gt;import foo&lt;/code&gt; 被 bash 执行了，于是 ImageMagick (&lt;code&gt;/usr/bin/import&lt;/code&gt;) 被叫出来捕捉全屏幕，造成了卡死的假象…&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2025-01-04 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/472b655b-1d4c-4e10-9e0f-d915166b2e9a"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;从「一」到「龟」&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;发现一个好玩的：在正则表达式里用 &lt;code&gt;[一-龟]&lt;/code&gt; 匹配所有常用汉字。&lt;/p&gt;
&lt;p&gt;Unicode 里的 CJK 字符有接近十万个，但是常用字都在 BMP 的 0x4E00 到 0x9FFF 这个区间里，约两万个。在这个区间里，第一个码点 0x4E00 对应的是「一」，最后一个码点 0x9FFF 对应的是生僻字「鿿」。如果从后往前看，则会发现 0x9F9F 对应的是常用汉字「龟」，之后的 96 个码点基本都是生僻字。&lt;/p&gt;
&lt;p&gt;于是就可以打 &lt;code&gt;[一-龟]&lt;/code&gt; 来等效 &lt;code&gt;[\u4E00-\u9F9F]&lt;/code&gt;，在大部分需要匹配汉字的场景都已经足够了…&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="media"&gt;
&lt;div class="gallery-grid gallery-grid--cols-3"&gt;
  &lt;figure class="gallery-item"&gt;
    &lt;a href="https://files.dabr.ca/90c4fc7e820936e92cf1a881adc244a8864ef819d22d65952f842084b4aa139e.png"&gt;&lt;img alt="All CJK blocks in Unicode. From: https://en.wikipedia.org/wiki/Template:CJK_ideographs_in_Unicode" src="https://files.dabr.ca/90c4fc7e820936e92cf1a881adc244a8864ef819d22d65952f842084b4aa139e.png" loading="lazy"/&gt;&lt;/a&gt;
  &lt;/figure&gt;
  &lt;figure class="gallery-item"&gt;
    &lt;a href="https://files.dabr.ca/03b081c435f294944c1a3895d5796d06376819a1e97dbc27b4c2850020a8f8fd.png"&gt;&lt;img alt="Code points from 0x9F70 to 0x9FFF. From: https://en.wikipedia.org/wiki/List_of_CJK_Unified_Ideographs,_part_4_of_4" src="https://files.dabr.ca/03b081c435f294944c1a3895d5796d06376819a1e97dbc27b4c2850020a8f8fd.png" loading="lazy"/&gt;&lt;/a&gt;
  &lt;/figure&gt;
  &lt;figure class="gallery-item"&gt;
    &lt;a href="https://files.dabr.ca/21287bc4f377343f1cdd45192b1b4e4e4fa76436b2f10f4ad782c843e61223f7.png"&gt;&lt;img alt="re.findall" src="https://files.dabr.ca/21287bc4f377343f1cdd45192b1b4e4e4fa76436b2f10f4ad782c843e61223f7.png" loading="lazy"/&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2025-01-06 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/2b4db4f5-c237-4e1a-aa6b-8485ae44bb27"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;Google Contacts 数据损坏事件&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;我的 Google Contacts 不知道什么时候坏掉了，很多联系人的头像、名字、信息全部交织起来了。看到 Family 分组里我爸的头像还在，但是名字变成我高中同学；我妈的头像也在，但是信息变成了一个 Facebook 陌生人？各种电话号码也不见了……&lt;/p&gt;
&lt;p&gt;这什么恐怖故事啊。看了下，这些信息错乱的联系人的最后编辑时间都是 2025-11-25，但是根据日记，那天我并没有做什么特别的操作。&lt;/p&gt;
&lt;p&gt;还好我有定期导出 Google Takeout 的习惯。最近一次导出是一月份，里面的信息已经是错乱的了；上一次导出是 Nov 8，里面的联系人信息是正常的。&lt;/p&gt;
&lt;p&gt;对比了一下 vCard 导出，感觉应该是哪里的数据库错乱了。联系人 A 的姓名字段是联系人 B 的电话；联系人 C 的电话字段是联系人 D 的网址；联系人 E 的邮箱字段里是联系人 F 的生日……头像和姓名也只是字段而已，才会出现张冠李戴的问题。&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2026-01-28 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/bd81a163-80cc-46b4-89e8-bb2542dffe36"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;p&gt;后来我也没找到数据损坏的原因（神秘！）。但我自此之后定期导出 vCard 并做版本管理了。&lt;/p&gt;
&lt;h2&gt;永久日光节约时！&lt;/h2&gt;
&lt;p&gt;我一直觉得日光节约时（DST）和非公制单位一样，是阻碍人类文明进步的绊脚石！&lt;/p&gt;
&lt;p&gt;今年 BC 省终于废止一年两次改时间这个愚蠢的制度了！普大喜奔！&lt;/p&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;在使用 &lt;a href="https://www.iana.org/time-zones"&gt;tzdata&lt;/a&gt; 的系统（如 Linux 和 macOS）里，&lt;code&gt;America/Vancouver&lt;/code&gt; 和 &lt;code&gt;America/Los_Angeles&lt;/code&gt; 是两个不同的时区，所以这次 &lt;a href="https://news.gov.bc.ca/releases/2026AG0013-000209"&gt;BC 采用永久夏令时&lt;/a&gt;可以单独改前者而不影响后者。但是 Windows 不使用 tzdata，而且有且只有一个 &lt;code&gt;Pacific Time (US &amp;amp; Canada)&lt;/code&gt; 时区（对应 &lt;code&gt;America/Los_Angeles&lt;/code&gt;）。不知道微软打算怎么改…&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="media"&gt;
        &lt;figure class="media-item"&gt;
            &lt;a href="https://files.dabr.ca/c4/3f/bb/c43fbbe310a027e0e7eeac09656a64a17bfce4fa991a92c32b627e78a84a7941.png"&gt;&lt;img src="https://files.dabr.ca/c4/3f/bb/c43fbbe310a027e0e7eeac09656a64a17bfce4fa991a92c32b627e78a84a7941.png" alt="Windows Date &amp;amp; Time -&amp;gt; Time zone dropdown"&gt;&lt;/a&gt;
        &lt;/figure&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2026-03-03 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/e7e20502-7a09-4d76-82ba-3fcbcc4b0458"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;Project Hail Mary&lt;/h2&gt;
&lt;p&gt;喜欢的小说改成电影了，真开心呀！&lt;/p&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;The Martian 我觉得电影改得挺好的，但是 Project Hail Mary 的电影不如小说。&lt;/p&gt;
&lt;p&gt;受到电影长度限制，原著里几个重大难题被大量简化，节奏太快了，冒险经历显得轻飘飘的，但是又在莫名其妙的地方哭哭。&lt;/p&gt;
&lt;p&gt;虽然小说里确实说 Rocky 是 dog-sized spider，但是到电影里真的就变成狗了，还是哈士奇性格的，过于闹腾；而那 TTS 的声音偏偏让我想到 Interstellar 里的 TARS，十分出戏。&lt;/p&gt;
&lt;p&gt;AO3 上的同人文倒是挺有意思的，讲 Beetles 到达地球之后的故事：&lt;a href="https://archiveofourown.org/works/68584716/chapters/177570376"&gt;The Long Journey Home&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2026-03-21 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/427f1abe-f748-4f36-901b-d2e51a186038"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;财务报表&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;一直想在 Beancount 里查看 AWS 支出情况，但是觉得写解析器好麻烦……&lt;/p&gt;
&lt;p&gt;现在有了 Codex，花了两个小时写了一个&lt;a href="https://github.com/wzyboy/beanaws"&gt;生成器&lt;/a&gt;，效果非常好！&lt;/p&gt;
&lt;p&gt;图为 dabr.ca 的 AWS 支出情况…&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="media"&gt;
        &lt;figure class="media-item"&gt;
            &lt;a href="https://files.dabr.ca/1b/ec/fa/1becfa5c70db88e71efe72d3f899e932962a959a527a4ef3543ff5a4ff29637b.png"&gt;&lt;img src="https://files.dabr.ca/1b/ec/fa/1becfa5c70db88e71efe72d3f899e932962a959a527a4ef3543ff5a4ff29637b.png" alt="Screenshot of Fava for a ledger named &amp;quot;AWS Costs&amp;quot;"&gt;&lt;/a&gt;
        &lt;/figure&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2026-04-02 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/1c91fbc0-3a25-4f6b-8d9e-6933145d8dda"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;本页面推荐使用 1024x768 分辨率浏览&lt;/h2&gt;
&lt;p&gt;翻维基百科的时候顺着参考文献找到了一些古老的新浪娱乐页面，仿佛跨入了时光机。&lt;/p&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;&lt;a href="https://ent.sina.com.cn/f/tlbb/index.html"&gt;新浪娱乐的一些古早页面&lt;/a&gt;，仿佛让我回到了二十多年前那个「本页面推荐使用 1024x768 分辨率浏览」的时代……侧边栏的广告还在卖手机铃声呢（图二）。&lt;/p&gt;
&lt;p&gt;这些 21 世纪初的页面，大部分链接居然还是能正常使用而没有 link rot 掉。这在简中互联网里可不常见啊……&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="media"&gt;
&lt;div class="gallery-grid gallery-grid--cols-2"&gt;
  &lt;figure class="gallery-item"&gt;
    &lt;a href="https://files.dabr.ca/5f/cf/8d/5fcf8dccb46d2b3c6276dd5f7184ee471c781e5720d1ad887fe98c2552d836d0.png"&gt;&lt;img alt="Screenshot of https://ent.sina.com.cn/f/tlbb/index.html" src="https://files.dabr.ca/5f/cf/8d/5fcf8dccb46d2b3c6276dd5f7184ee471c781e5720d1ad887fe98c2552d836d0.png" loading="lazy"/&gt;&lt;/a&gt;
  &lt;/figure&gt;
  &lt;figure class="gallery-item"&gt;
    &lt;a href="https://files.dabr.ca/95/dc/5b/95dc5b6b9c2e816501c2345b746cdd9f271aed287d3d57d68d9d58165266b469.png"&gt;&lt;img alt="Screenshot of https://ent.sina.com.cn/s/m/2002-08-09/162595017.html" src="https://files.dabr.ca/95/dc/5b/95dc5b6b9c2e816501c2345b746cdd9f271aed287d3d57d68d9d58165266b469.png" loading="lazy"/&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2026-04-12 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/ba2de464-d4fb-49d4-addb-9f1feed5d48e"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;h2&gt;BitLocker 与强迫症&lt;/h2&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;TIL BitLocker 在开启的时候，会把 NTFS Volume Label 复制到 FVE metadata 里，但是之后更改 NTFS 卷名的时候，这个 metadata 不会更新。&lt;/p&gt;
&lt;p&gt;比如一开始一个卷叫 Foo，开启之后 BitLocker 之后，改名叫 Bar，这时候 metadata 里依然叫 Foo，通过 blkid 之类的工具可以读到。&lt;/p&gt;
&lt;p&gt;除了重做 BitLocker，没有更改这个 metadata 的方法……&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2026-04-26 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/5f9eee10-970b-4b58-b827-5e2e1f6b2394"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;p&gt;我纠结了好久要不要重做 BitLocker 来改名。后来想想还是算了。&lt;/p&gt;
&lt;h2&gt;喜欢写代码的 CEO 和量子物理学家&lt;/h2&gt;
&lt;p&gt;Ghostty 真的挺好用的，已经换掉 Alacritty 了。&lt;/p&gt;
&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;Ghostty 的作者是 HashiCorp 的创始人之一，当了四年的 CEO 之后又当了五年的 CTO，然后&lt;a href="https://www.hashicorp.com/en/blog/mitchell-s-new-role-at-hashicorp"&gt;转职 IC&lt;/a&gt; 干了两年。&lt;/p&gt;
&lt;p&gt;第一次听说 C-suite 转 IC 的，看来这位是真的热爱写代码…&lt;/p&gt;
&lt;p&gt;（读 &lt;a href="https://mitchellh.com/writing/ghostty-leaving-github"&gt;Ghostty Is Leaving GitHub&lt;/a&gt; 有感）&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2026-04-29 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/50280a7d-92c0-4a77-92a1-a809795cd484"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;

&lt;article class="tweet-card"&gt;

    &lt;div class="text"&gt;
        &lt;div class="full-text"&gt;&lt;p&gt;从 Alacritty 换到 Ghostty 之后没有 hint mode 了，不能用键盘去点链接了。因祸得福我发现了 &lt;a href="https://github.com/alberti42/tmux-fzf-links"&gt;tmux-fzf-links&lt;/a&gt;，不仅能用键盘点链接，还能开文件。屏幕上有类似 &lt;code&gt;foo.txt:123&lt;/code&gt; 这样的文字的时候，它能直接调用 &lt;code&gt;nvim foo.txt +123&lt;/code&gt; 定位到那一行，太爽了。&lt;/p&gt;
&lt;p&gt;而且因为是用 tmux capture-pane 实现的，不会有 hint mode 那样 URL 折行了就被截断的问题。&lt;/p&gt;
&lt;p&gt;这个 tmux 插件的&lt;a href="https://github.com/alberti42"&gt;作者&lt;/a&gt;是个量子物理学家…&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="timestamp"&gt;&lt;span&gt;2026-04-30 &lt;/span&gt;&lt;/div&gt;

    &lt;div class="view-on-twitter"&gt;
        &lt;a class="twitter-link" href="https://dabr.ca/objects/2b99b2ca-ff54-4b1e-9ff5-1ec6d7e7dfc5"&gt;
            &lt;span class="link-text"&gt;View in Fediverse&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;/article&gt;</content></entry><entry><title>UniFi U7 Pro 与 6 GHz Wi-Fi 初体验</title><link href="https://wzyboy.im/post/1580.html" rel="alternate"/><updated>2024-06-27T18:09:00Z</updated><author><name>wzyboy</name></author><id>urn:uuid:89589261-7a82-3c91-a215-8b6a205e03d8</id><content type="html">&lt;p&gt;最近家里的 Wi-Fi 设备更新换代，我第一次体验到了 6 GHz Wi-Fi，第一次在手机上见到千兆网速。本文记录一下前因后果。&lt;/p&gt;
&lt;h3&gt;术语对照表&lt;/h3&gt;
&lt;p&gt;&lt;abbr title="Institute of Electrical and Electronics Engineers"&gt;IEEE&lt;/abbr&gt; 的命名品位实在是太差了，各代 Wi-Fi 标准的名称都是晦涩难记的数字和字母。我真不知道我以前是怎么记住这些术语的。总算从 2019 年推出的 Wi-Fi 6 开始，他们增加了一套更好记的宣传名称，并追认了 Wi-Fi 5 和 Wi-Fi 4。以下为对照表：&lt;/p&gt;
&lt;table class="table table-sm table-striped table-bordered" style="width: auto; margin-left: auto; margin-right: auto;"&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;宣传名称&lt;/th&gt;
&lt;th&gt;实际名称&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi 8&lt;/td&gt;
&lt;td&gt;802.11bn&lt;/td&gt;
&lt;td&gt;2028&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi 7&lt;/td&gt;
&lt;td&gt;802.11be&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi 6E&lt;/td&gt;
&lt;td&gt;802.11ax&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi 6&lt;/td&gt;
&lt;td&gt;802.11ax&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi 5（追认）&lt;/td&gt;
&lt;td&gt;802.11ac&lt;/td&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi 4（追认）&lt;/td&gt;
&lt;td&gt;802.11n&lt;/td&gt;
&lt;td&gt;2008&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi 3（民间追认）&lt;/td&gt;
&lt;td&gt;802.11g&lt;/td&gt;
&lt;td&gt;2003&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi 2（民间追认）&lt;/td&gt;
&lt;td&gt;802.11a&lt;/td&gt;
&lt;td&gt;1999&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi 1（民间追认）&lt;/td&gt;
&lt;td&gt;802.11b&lt;/td&gt;
&lt;td&gt;1999&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi 0（民间追认）&lt;/td&gt;
&lt;td&gt;802.11&lt;/td&gt;
&lt;td&gt;1997&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;值得注意的是，Wi-Fi 6 和 Wi-Fi 6E 虽然宣传名称不同，推出年份也不同，但实际的标准名称都是 802.11ax。在有些地方（比如 Android），也会把 Wi-Fi 6E 显示为 Wi-Fi 6，但 Wi-Fi 6E 和 Wi-Fi 6 有个本质区别：&lt;strong&gt;Wi-Fi 6E 支持 6 GHz 频率。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;升级前&lt;/h3&gt;
&lt;p&gt;以前我家住小公寓，只有一层，所以一个 AP 就够了。去年搬进了双层屋，逐渐就觉得一个 AP 不是很够了。就算 AP 的发射功率再强，但如果客户端的天线不够劲的话，照样会出现连接性问题。搬家之后 AP 及其他网络设备都是放在一楼光纤接入的旁边的，在二楼的电脑通过无线上网效果还行，但是一些收发能力较弱的设备，在二楼就较容易出现断线的问题。&lt;/p&gt;
&lt;p&gt;最近我买了新的电子书阅读器 &lt;a href="https://ca.kobobooks.com/collections/ereaders/products/kobo-libra-colour"&gt;Kobo Libra Colour&lt;/a&gt;，发现其在二楼的书房里很难连上 Wi-Fi；家属用 Nintendo Switch 打 Splatoon 3 联机经常掉线——我们终于决定买第二个 AP 了。&lt;/p&gt;
&lt;p&gt;之前家里用的网络设备几乎都是 Ubiquiti / UniFi 的，现在还是打算继续买他们家的。看看 UniFi 又出了什么新货？&lt;/p&gt;
&lt;p&gt;&lt;img alt="screenshot of a webpage showing different access point products" src="https://wzyboy.im/uploads/2024-06/unifi-flagship-aps_2024-06-17_14-46-36.png"&gt;&lt;/p&gt;
&lt;p&gt;参考上文的对照表，很容易理解 UniFi 的产品线命名：AC 就是 Wi-Fi 5，而 U6 和 U7 分别对应 Wi-Fi 6 和 Wi-Fi 7。我家之前用的是 U6 Pro，支持 Wi-Fi 6 但不支持 Wi-Fi 6E。看到 U7 Pro 只比 U6 Pro 贵了一点点，于是就买了 U7 Pro——虽然家里并没有支持 Wi-Fi 7 的设备。购物车 (1)。&lt;/p&gt;
&lt;p&gt;UniFi 的 AP 都是通过 &lt;abbr title="Power over Ethernet"&gt;PoE&lt;/abbr&gt; 供电。我之前是通过一个 PoE Adapter 给从普通交换机里出来的网线加上电，但现在有两个 AP 了，是不是干脆买个 PoE 交换机更好呢？再看看 UniFi 有啥 PoE 交换机？&lt;/p&gt;
&lt;p&gt;&lt;img alt="screenshot of a webpage showing different network switch products" src="https://wzyboy.im/uploads/2024-06/unifi-poe-switches_2024-06-17_14-54-45.png"&gt;&lt;/p&gt;
&lt;p&gt;算了一下功率，感觉最便宜 Lite 8 PoE 就够用了。购物车 (2)。&lt;/p&gt;
&lt;p&gt;想要在把 AP 装到二楼，还要考虑网线的问题。我思索再三还是放弃了拆墙布线的计划，打算走明线。量了一下，在 Amazon 上买了个爆款 50 ft 网线。购物车 (3)。&lt;/p&gt;
&lt;h3&gt;开箱及配置&lt;/h3&gt;
&lt;p&gt;虽然从上文的商品页截图看起来各 AP 长得都差不多，但实际到手之后发现 U7 Pro 比 U6 Pro 厚了不少：&lt;/p&gt;
&lt;p&gt;&lt;img alt="U7 Pro vs U6 Pro" src="https://wzyboy.im/uploads/2024-06/PXL_20240611_165009884.jpg"&gt;&lt;/p&gt;
&lt;p&gt;配置 UniFi 设备我已经驾轻就熟了——怎么 adoption failed 呢？后来发现是我的 controller 软件版本太老了。我用的是 linuxserver.io 维护 Docker 镜像。他们维护了两个不同的版本：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/linuxserver/docker-unifi-controller"&gt;linuxserver/docker-unifi-controller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/linuxserver/docker-unifi-network-application"&gt;linuxserver/docker-unifi-network-application&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我使用的前者已经停止维护了，而迁移到后者需要重做 MongoDB，再导入/导出。&lt;/p&gt;
&lt;p&gt;需要注意的是 6 GHz 并不是默认打开的，需要在设置里启用，&lt;strong&gt;并且把 SSID 的安全性改成 WPA3&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;总之最终是跑起来了。现在网络设备柜里是这样的：&lt;/p&gt;
&lt;p&gt;&lt;img alt="network devices" src="https://wzyboy.im/uploads/2024-06/PXL_20240615_003247666.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;测速环节&lt;/h3&gt;
&lt;p&gt;最先成功连上 6 GHz Wi-Fi 的是我的 Google Pixel 7 手机：&lt;/p&gt;
&lt;div class="gallery-grid gallery-grid--cols-2"&gt;
  &lt;figure class="gallery-item"&gt;
    &lt;a href="https://wzyboy.im/uploads/2024-06/Screenshot_20240611-160040.png"&gt;&lt;img alt="Android screenshot of network details" src="https://wzyboy.im/uploads/2024-06/Screenshot_20240611-160040.png" loading="lazy"/&gt;&lt;/a&gt;
  &lt;/figure&gt;
  &lt;figure class="gallery-item"&gt;
    &lt;a href="https://wzyboy.im/uploads/2024-06/Screenshot_20240611-160033.png"&gt;&lt;img alt="Android screenshot of fast.com" src="https://wzyboy.im/uploads/2024-06/Screenshot_20240611-160033.png" loading="lazy"/&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;图中我是用的外部测速网站，所以受到运营商带宽的限制。我家的带宽套餐的名义带宽是 940 Mbps，所以这样的速度已经算是跑满了。以前这样的速度只有在插了网线、有线上网的电脑上才能见到，这是我第一次在无线上网的手机上见到！&lt;/p&gt;
&lt;p&gt;家属的 iPhone 15 Pro 也是&lt;a href="https://support.apple.com/en-ca/102285"&gt;支持&lt;/a&gt; Wi-Fi 6E 的，但是却怎么也跑不出相应的速度。忘记网络之后重新输入一次密码之后总算跑出了应有的速度。我的猜测是因为 Wi-Fi 6E 需要 WPA3 加密所以要重新输入密码重新协商，而 Android 是每次连接的时候自动协商的，所以无需重新输入密码就可以自动连上。&lt;/p&gt;
&lt;p&gt;iOS 不像 Android 那样直接是否使用 6 GHz 频率，但是如果支持 Wi-Fi 6E 的话，会在 SSID 设置里显示一个「&lt;a href="https://wzyboy.im/uploads/2024-06/Screenshot_2024-06-27.png"&gt;Wi-Fi 6E Mode&lt;/a&gt;」选项。&lt;/p&gt;
&lt;h3&gt;下一步升级？&lt;/h3&gt;
&lt;p&gt;这是我第一次体验 Wi-Fi 6E 和 6 GHz Wi-Fi。在此之前，我体验过最快的无线上网速度也就 500 Mbps 左右，视周围无线干扰环境，大部分情况下实际值都比这个要低；而有线上网的话，1000 Mbps 是目前最常见的。因此，我之前一直喜欢有线上网多于无线上网；搬家之前，家里几乎所有能插网线的设备（电脑、电视机、打印机）全部都是通过有线上网，哪怕它们同时也具有无线上网功能。&lt;/p&gt;
&lt;p&gt;这次的体验颠覆了我的认知：原来无线上网也能跑满 1000 Mbps 的带宽！Wi-Fi 6 和 Wi-Fi 6E 的技术细节几乎是一样的，后者主要是多了 6 GHz 支持，但我是真没想到 6 GHz 对实际带宽的影响如此之大。UniFi AP 可以调查周围的无线环境，其扫描结果显示，我家周围的邻居们已经把 2.4 GHz 和 5 GHz 的信道挤满了，而 6 GHz 信道里，一个 SSID 都没有！我家的 Wi-Fi 是 6 GHz 信道的唯一用户！Wi-Fi 标准的最大速率都是在无干扰的情况下的理论值，这也算是尽可能贴近理论值了吧。&lt;/p&gt;
&lt;p&gt;可惜的是，由于设备限制，我现在并不能测出这 Wi-Fi 6E 在我家最大能跑到多大的带宽——虽然 U7 Pro 是 2.5 GbE (2500 Mbps) 的速率，但家里的交换机和路由器都是 GbE (1000 Mbps) 速率的。如果我在下单的时候买的是 $640 的 2.5 GbE 的 PoE 交换机呢？依然不够，因为测速不仅需要一个客户端，还需要一个服务器，我还得再有一个带 2.5 GbE 网卡的服务器才行。我的 &lt;a href="https://wzyboy.im/post/1387.html"&gt;home server&lt;/a&gt; 已经插了 NVMe 扩展卡之后已经没有空间插 2.5 GbE 的网卡了……&lt;/p&gt;
&lt;p&gt;等 2.5 GbE 设备更普及一些我再考虑升级交换机吧。&lt;/p&gt;
&lt;h3&gt;这么快有什么用？&lt;/h3&gt;
&lt;p&gt;正如上文所说，我一直对有线上网有执念，能有线上网就尽量有线上网。搬家之后由于场地限制，很难实现全屋有线上网。现在无线上网的带宽达到千兆了，我对有线上网就没那么执念了。&lt;/p&gt;
&lt;p&gt;实际应用的话，大概就是 Steam 购买新游戏到开始游戏之间的等待下载时间减半吧……&lt;/p&gt;
&lt;h3&gt;Wi-Fi 7&lt;/h3&gt;
&lt;p&gt;&lt;ins datetime="2024-08-23T23:28:54 -0700"&gt;更新&lt;/ins&gt;：买了 Google Pixel 9，补一张 Wi-Fi 7 的图：&lt;a href="https://wzyboy.im/uploads/2024-08/Screenshot_20240823-232530.png"/&gt;Screenshot_20240823-232530.png&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;由于上文所述原因，目前 Wi-Fi 7 和体验和 Wi-Fi 6E 的体验是没有差异的…&lt;/p&gt;</content></entry><entry><title>更换博客评论系统</title><link href="https://wzyboy.im/post/1570.html" rel="alternate"/><updated>2024-05-22T17:02:26Z</updated><author><name>wzyboy</name></author><id>urn:uuid:15256320-c282-3ef0-be82-327331bfe113</id><content type="html">&lt;p&gt;最近帮家属装修&lt;a href="https://uucky.me/"&gt;她的博客&lt;/a&gt;，我发现装修博客比写博客有意思多了，于是也动起了装修自己博客的念头。本文记录了我把博客的评论系统从 Disqus 更换为 Twikoo 的过程。&lt;/p&gt;
&lt;h2&gt;一、越来越烂的 Disqus&lt;/h2&gt;
&lt;p&gt;本博客的搭建工具/平台经历了三个阶段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2009 年～2010 年：搭建在 &lt;a href="https://www.blogger.com/"&gt;Blogger.com&lt;/a&gt; 上——当时 Blogger 已经被 Google 收购了；&lt;/li&gt;
&lt;li&gt;2010 年～2017 年：「自豪地由 WordPress 驱动」——迁移到自建平台的原因我记不清了，似乎是因为 Blogger 被墙了；&lt;/li&gt;
&lt;li&gt;2017 年～现在：使用 &lt;a href="https://wzyboy.im/post/1092.html"&gt;Lektor&lt;/a&gt; 静态生成。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;静态博客相比 WordPress 虽然有诸多优点，但最大的问题在于评论系统很难做成静态的。我刚把博客做成静态的时候想着干脆不做评论系统了，读者如果想留言就寄送电子邮件。后来考察了一番，还是加了一个 Disqus 评论系统，但默认不加载，需要访客点击启用——我看到那一堆慢吞吞的 JavaScript 加载动画实在是心烦。&lt;/p&gt;
&lt;p&gt;用了几年 Disqus 之后，这货逐渐走上了 &lt;a href="https://en.wikipedia.org/wiki/Enshittification"&gt;enshittification&lt;/a&gt; 的道路。免费用户的网站将被 Disqus 强制插入广告，不仅占地面积很大，且内容多为猎奇 clickbait。请看&lt;a href="https://reorx.com/"&gt;友人的博客&lt;/a&gt;上被 Disqus 插入的巨幅猎奇广告：&lt;/p&gt;
&lt;p&gt;&lt;img alt="rerox-com-disqus-ads" src="https://wzyboy.im/uploads/2024-05/rerox-com-disqus-ads.jpg"&gt;&lt;/p&gt;
&lt;p&gt;出于未知原因，我的 Disqus 继承了一个祖父计划，因此没有广告：&lt;/p&gt;
&lt;p&gt;&lt;img alt="disqus-plus-plan" src="https://wzyboy.im/uploads/2024-05/disqus-plus-plan.png"&gt;&lt;/p&gt;
&lt;p&gt;但我依然对 Disqus 不满。尤其是 2021 年时，有至少十个月，甚至可能长达一年的时间，&lt;a href="https://wzyboy.im/tweet/1453807006859493376.html"&gt;Disqus 的邮件通知完全是坏的&lt;/a&gt;。现在想来，难道是因为 COVID-19 的影响，Disqus 的某些基础设施崩坏了而无人发现或无法修复？&lt;/p&gt;
&lt;p&gt;在 2022 年初的时候 Disqus 的邮件系统修好了，我又能收到邮件了——但所有的邮件都会进 Spam！直到本文写作时为止，Disqus 给我发的邮件还是会被 Gmail 归到 Spam 里。哪怕我一遍一遍点 Not Spam 也没有用：&lt;/p&gt;
&lt;div class="gallery-grid gallery-grid--cols-2"&gt;
  &lt;figure class="gallery-item"&gt;
    &lt;a href="https://wzyboy.im/uploads/2024-05/gmail-disqus-spam-1.png"&gt;&lt;img alt="gmail-disqus-spam-1" src="https://wzyboy.im/uploads/2024-05/gmail-disqus-spam-1.png" loading="lazy"/&gt;&lt;/a&gt;
  &lt;/figure&gt;
  &lt;figure class="gallery-item"&gt;
    &lt;a href="https://wzyboy.im/uploads/2024-05/gmail-disqus-spam-2.png"&gt;&lt;img alt="gmail-disqus-spam-2" src="https://wzyboy.im/uploads/2024-05/gmail-disqus-spam-2.png" loading="lazy"/&gt;&lt;/a&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;h2&gt;二、静态网站评论系统考察&lt;/h2&gt;
&lt;p&gt;因为 Disqus 越来越烂，我就想找替代品，但 Disqus 又没有烂到完全不能用（尤其是我有无广告祖父计划），所以我也没有太强的动力去折腾更换。两年前，家属使用 Hugo 重建博客，也面临了评论系统选择的难题。家属并没有无广告 Disqus 账号，也不想为了评论系统交 $12/mo 的天价保护费去广告，那就自建吧？&lt;/p&gt;
&lt;p&gt;「家属重建博客」和上文提到的「友人发现他的博客被 Disqus 插入巨幅广告」这两件事是差不多时间发生的，当时我和友人也讨论了一下自建博客评论系统的选择。最终友人为自己的博客搭建了 Golang 写的 &lt;a href="https://remark42.com/"&gt;Remark42&lt;/a&gt;，我为家属的博客搭建了 Python 写的 &lt;a href="https://isso-comments.de/"&gt;Isso&lt;/a&gt;，我自己的博客则继续用 Disqus。&lt;/p&gt;
&lt;p&gt;两年后的现在，我帮家属博客装修的时候发现：友人的 Remark42 不知何时挂了，家属博客的 Isso 虽然还在跑着但是有内存泄露问题，只有 Disqus 依然在苟活。这时候我突然想通了一件事：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;静态博客的优点就是无状态、轻量，不需要操心操作系统和软件更新的问题，运维成本极低；如果再自己维护一个评论系统，就把这些优点全部抵消了！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如何解决这个问题呢？像 Disqus 这样的全托管平台也是有的，但是我是不敢用的。自建平台又往往需要在自己的服务器上跑一个 Python / Node.js / Golang 程序，怎么办呢？&lt;/p&gt;
&lt;p&gt;在对比调研各种评论系统的过程中我发现了一个全新的视角：&lt;a href="https://en.wikipedia.org/wiki/Serverless_computing"&gt;serverless&lt;/a&gt; 部署。仔细想想，评论系统的后台其实需要处理的事件并不多，无非就是发表评论、拉取评论列表、编辑或删除自己发的评论，最多就是再加个邮件通知功能。这些功能都是可以在一个 HTTP 请求里完成的，这不是正是 serverless computing 最擅长的赛道吗？用 serverless 的评论系统，我就不需要担心运维问题，也不需要占用自己服务器的 RAM，同时又维持了自己对数据的掌控。&lt;/p&gt;
&lt;p&gt;经过一些对比，我最终选择了 &lt;a href="https://twikoo.js.org/"&gt;Twikoo&lt;/a&gt; 评论系统。这一评论系统支持运行在多个 serverless 平台上，使用 MongoDB 作为存储，支持消息推送和邮件通知。根据 &lt;a href="https://github.com/imaegoo"&gt;GitHub&lt;/a&gt; 上的信息，作者还是一个大学生，应该是 00 后吧。顺便，Twikoo 用的&lt;a href="https://pushoo.js.org/"&gt;消息推送 SDK&lt;/a&gt; 也是同一作者写的。年轻有为啊！&lt;/p&gt;
&lt;h2&gt;三、搭建 Twikoo&lt;/h2&gt;
&lt;p&gt;Twikoo 被许多简体中文独立博客所采用，搭建教程一大把。不少 serverless 平台提供一定的免费额度，足够运行 Twikoo 了，照着&lt;a href="https://twikoo.js.org/quick-start.html"&gt;官方教程&lt;/a&gt;很快就能搭一个出来。我又写了一个脚本，把 Isso 的 SQLite 里的评论转成 Twikoo 的 JSON 格式再导入——家属的博客就这样从 Isso 迁移到了 Twikoo 评论系统。&lt;/p&gt;
&lt;p&gt;发现了 Twikoo 的好，我也想给自己的博客换上。但作为一个 System Reboot Engineer，我对 serverless 平台的要求更高一些，我想要 &lt;a href="https://wzyboy.im/post/1476.html"&gt;IaC&lt;/a&gt;。家属的 Twikoo 是搭建在 Netlify 上的，而我一直在用 AWS 全家桶，为什么不试试在 AWS Lambda 上跑呢？尤其是两年前 AWS Lambda &lt;a href="https://aws.amazon.com/blogs/aws/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/"&gt;增加了 Function URL 功能&lt;/a&gt;，不需要配置 API Gateway 了，使用起来更方便了。&lt;/p&gt;
&lt;p&gt;Twikoo 本来没有专门对 AWS Lambda 做适配，于是我根据 &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/lambda-urls.html"&gt;AWS Lambda Function URL&lt;/a&gt; 的文档&lt;a href="https://github.com/twikoojs/twikoo/tree/3404e76165051758e0c6ba5c4ac5a88794fba00b/src/server/aws-lambda"&gt;给上游贡献了一些代码&lt;/a&gt;，使它成功地在 AWS Lambda 上跑起来了。&lt;/p&gt;
&lt;p&gt;AWS Lambda Function URL 的地址形如 &lt;code&gt;https://axtoiiithbc3vetyqfgq7ozalu0cnkii.lambda-url.us-west-2.on.aws/&lt;/code&gt;，真的太长太丑了！反正我的博客本来就在用 AWS CloudFront，干脆加到博客的 &lt;code&gt;wzyboy.im&lt;/code&gt; 域名下，这样还能减少一次 &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request"&gt;CORS preflight 请求&lt;/a&gt;！&lt;/p&gt;
&lt;h2&gt;四、导入 WordPress 及 Disqus 里的评论&lt;/h2&gt;
&lt;p&gt;七年前我从 WordPress 迁移到静态博客的时候，没有迁移评论。后来用上了 Disqus 评论，我也没把 WordPress 评论导入进去。但是现在既然用上了一个数据操作更加方便的平台（指可以直连 MongoDB 进行操作），我就想把 WordPress 和 Disqus 的评论都导入到 Twikoo 里。&lt;/p&gt;
&lt;p&gt;Twikoo 支持导入 WordPress 的评论，然而我的 WordPress 早在七年前就已经停服了。我一直留着数据库备份，与其把整个 WordPress 复活再用插件把评论导出，不如直接对数据库进行操作，导出成 Twikoo 的格式而不是 WordPress 的格式。于是我把七年前的数据库备份导入 MariaDB，再快速糊了一个 &lt;a href="https://gist.github.com/wzyboy/49c25333a550903d180563fdea8f0c90"&gt;Python 脚本&lt;/a&gt; 将 &lt;code&gt;wp_comments&lt;/code&gt; 表里评论导出成 Twikoo 使用的 JSON 格式，然后在 Twikoo 的管理界面导入进去。&lt;/p&gt;
&lt;p&gt;Twikoo 也支持导入 Disqus 的评论。我从 Spam 里捞出 Disqus 给我发的评论导入邮件之后，一键导入 Twikoo，才发现这里面居然还有不少垃圾评论（在 Twikoo 里显示为隐藏评论，只有管理员能看到）。这里面有些是真的垃圾评论，有些是 Disqus 误报的。我在 Twikoo 里对这些垃圾评论进行了处理。另外 Disqus 导出的 XML 里不包含 email 字段，无法从 &lt;a href="https://gravatar.com/"&gt;Gravatar&lt;/a&gt; 拉取头像。别人的评论没办法，我自己的评论还是可以二次处理一下的。于是把刚刚清理过后的评论再次导出，把我发表的评论都加上我自己的邮箱等信息，然后清空 MongoDB 重新导入，这样就有头像了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;至此，旧评论全部导入到了 Twikoo 里。一共从 WordPress 导入了 1734 条评论，从 Disqus 导入了 211 条评论。其中 WordPress 的评论也包括了 2009 年从 Blogger 导出的评论。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;五、尾声&lt;/h2&gt;
&lt;p&gt;Twikoo 默认打开了展示 User-Agent 的功能，会显示评论者的操作系统和浏览器信息。翻看一下老评论，看到各种 Windows XP、Google Chrome 5.x、Android 1.2 啥的，感觉好怀念！仿佛回到了十几年前，一大批 WordPress 独立博客如雨后春笋遍地蓬勃生长的时代，那时候不少博客都装了一个显示评论者操作系统和浏览器信息的插件。&lt;/p&gt;
&lt;p&gt;在我写作本文的时候我刚好读到一篇文章，讲因为中国大陆独特网络环境——内容审查、封闭花园、移动互联网兴起导致传统网页衰落——简体中文互联网上公开的内容，尤其是较旧的内容，正在快速消亡。本博客虽然近年来更新不多，但也已经存续了 15 年，我将尽我所能让它继续存在下去，不要轻易消亡。通过复活 2009 至 2017 年间的旧评论，我也希望能为&lt;a href="https://wzyboy.im/post/1437.html"&gt;对抗 link rot&lt;/a&gt;尽一份绵薄之力。&lt;/p&gt;
&lt;p&gt;那么，欢迎在全新的评论系统里留下评论。《&lt;a href="https://wzyboy.im/post/privacy.html"&gt;隐私声明&lt;/a&gt;》也已更新。&lt;/p&gt;</content></entry><entry><title>从 LUKS 迁移到 LUKS + LVM</title><link href="https://wzyboy.im/post/1558.html" rel="alternate"/><updated>2024-05-10T15:46:38Z</updated><author><name>wzyboy</name></author><id>urn:uuid:c5a06078-4e53-321d-b520-e19d4ee7647c</id><content type="html">&lt;p&gt;本文记录一下我最近从 LUKS 迁移到 LUKS + LVM 的过程。整理是最好的复习！&lt;/p&gt;
&lt;h3&gt;背景&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Device_mapper"&gt;Device mapper&lt;/a&gt; 是 Linux 里将块设备映射成虚拟块设备的框架。&lt;/p&gt;
&lt;p&gt;dm-crypt 是用 &lt;abbr title="device mapper"&gt;DM&lt;/abbr&gt; 进行透明加密的组件。例如：将 &lt;code&gt;/dev/sda2&lt;/code&gt; 映射成 &lt;code&gt;/dev/mapper/cryptsda2&lt;/code&gt;，则往 &lt;code&gt;/dev/mapper/cryptsda2&lt;/code&gt; 这个块设备写入的数据会被加密后实际写入下层的 &lt;code&gt;/dev/sda2&lt;/code&gt; 块设备里。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Device_mapper"&gt;LUKS&lt;/a&gt; 是以 dm-crypt 为基础，增加了密钥管理功能的加密实现。&lt;/p&gt;
&lt;p&gt;我的笔记本电脑是这样的分区结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NAME             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
nvme0n1          259:0    0 476.9G  0 disk
├─nvme0n1p1      259:1    0   512M  0 part  /boot
├─nvme0n1p2      259:2    0 450.0G  0 crypt /
└─nvme0n1p3      259:3    0  26.4G  0 crypt [SWAP]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一个引导分区（p1），一个主分区（p2），一个交换分区（p3）。其中主分区是用 LUKS 加密的，需要我每次开机时输入密码进行解锁；交换分区是以 plain dm-crypt 加密的，其密钥来自 &lt;code&gt;/dev/urandom&lt;/code&gt; 提供的随机数据。&lt;a href="https://wiki.archlinux.org/title/Dm-crypt/Swap_encryption"&gt;交换分区以随机密钥进行加密&lt;/a&gt;是一种常见做法，密钥只存在于 RAM 里，关机之后交换分区就完全无法解密了，防止 RAM 里的敏感数据留在交换分区里被读取——尤其是在异常关机的时候。&lt;/p&gt;
&lt;h3&gt;休眠、但是醒不来&lt;/h3&gt;
&lt;p&gt;这样的加密交换分区有一个问题：无法休眠，确切地讲是能休眠，但是永远醒不来——因为断电之后密钥已经被丢弃了，所以重新开机的时候系统无法读取交换分区里的数据，所以无法恢复到之前的状态。&lt;/p&gt;
&lt;p&gt;由于我的笔记本电脑几乎一直是插着电用，所以十几年来很少用到休眠的功能（更别提以前 Linux 休眠醒来之后网卡、扬声器等容易出 bug）；偶尔要带出门的话，短时间我就睡眠，长时间我就直接关机。直到最近，由于一连串巧合，我的笔记本电脑没有插电，电池耗尽，系统自动尝试进入休眠状态——成功了，然后就再也醒不来了。&lt;/p&gt;
&lt;p&gt;更糟糕的是，systemd 在系统启动时会等待交换分区出现，但因为永远等不到，所以会浪费两分钟等待直到超时。由于「从休眠中醒来」这个任务没有完成，所以下次重启电脑的时候，systemd 还会再等两分钟超时，周而复始。&lt;/p&gt;
&lt;p&gt;我实在是不知道如何清除掉这个 flag 让它不要再等。最终我想了个解决方案：systemd 是根据 UUID 去找交换分区的，那我新建一个喂给它不就行了？于是我从日志里找到 systemd 苦等的 UUID，再用 &lt;code&gt;mkswap -U that_uuid&lt;/code&gt; 建立一个 swap，再重启一次，果然它就不再等了。事成之后要记得 &lt;code&gt;wipefs&lt;/code&gt; 擦掉分区签名，否则以后就一直是明文交换分区了。&lt;/p&gt;
&lt;p&gt;结果这样的事情又发生了几次，每次我都要重启几次来修复。痛定思痛，我决定一劳永逸地解决这个问题，不然每次（不小心）触发休眠就会很麻烦。&lt;/p&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;p&gt;我调研了多种方法，在虚拟机里尝试了一番，发现最简单的方法是用 LUKS + &lt;a href="https://en.wikipedia.org/wiki/LVM2"&gt;LVM&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;LVM 也是基于 DM 的组件，主要用于在块设备上映射出多个逻辑卷（LV），这些 LV 类似于分区，但是不受分区表的限制，可以灵活地调整，甚至可以提供快照等功能。由于我的某些执念，我一直不愿意将两个 DM 套娃使用，因此我笔记本电脑上只有 LUKS，而 NAS 上只有 LVM。实际在虚拟机里测试了一下，发现 DM 叠叠乐也没什么大不了的，因此也就接受了。至于是将 LVM 叠在 LUKS 上，还是将 LUKS 叠在 LVM 上——当然是前者，因为后者和我现在的处境没什么太大的区别，并不能解决加密交换分区的问题。&lt;/p&gt;
&lt;p&gt;所以我的分区调整计划是（对照前文的分区结构）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将 450 GiB 的 p2 和 26.4 GiB 的 p3 两个分区删除，建立一个新的 476.4 GiB 的 p2 取而代之；&lt;/li&gt;
&lt;li&gt;将新的 p2 作为 LUKS 容器，但不在里面直接创建文件系统，而是再叠一层 LVM，在里面创建两个 LV，一个作为主分区（root），一个作为交换分区（swap）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;根据我在虚拟机里的试验，这样调整过后，开机时系统会先解开 LUKS，然后按需求（全新启动还是从休眠中恢复）读取 root 和/或 swap。&lt;/p&gt;
&lt;h3&gt;实施&lt;/h3&gt;
&lt;p&gt;在折腾这些分区之前得先备份数据。我的主分区是 450 GiB，但只有 235 GiB 数据在里面。我有块 500 GB 的 SSD 移动硬盘可以暂存数据，这块移动硬盘里最大的一个分区是 377 GiB，倒是够存；但这分区没有加密，而且是 exFAT 文件系统，因此不适合把笔记本电脑里的数据直接复制进去。&lt;/p&gt;
&lt;p&gt;那我把整个 LUKS 容器给 dd 进去？这就又太大了，而且由于加密数据块的信息熵极高，所以再怎么压缩也是塞不下的。要不在移动硬盘里创建一个 LUKS 容器然后把文件系统整个倒进去？但是我的笔记本电脑用的是 Ext4 文件系统，似乎并没有像 &lt;code&gt;xfs_copy&lt;/code&gt; 那样只复制有用数据块的工具。我灵机一动，想到可以用 &lt;a href="https://wzyboy.im/post/1106.html"&gt;BorgBackup&lt;/a&gt; 直接直接读取 LUKS 解密后的明文块设备，由于 Borg repo 是加密的，所以可以存到不加密的移动硬盘里。&lt;/p&gt;
&lt;p&gt;BorgBackup 甚至专门有个&lt;a href="https://borgbackup.readthedocs.io/en/stable/deployment/image-backup.html"&gt;文档&lt;/a&gt;解释了这种用法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先用 &lt;code&gt;zerofree&lt;/code&gt; 把 Ext4 文件系统里的没用的数据块归零——这工具比 &lt;code&gt;dd if=/dev/zero&lt;/code&gt; 更环保、高效&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;borg create --read-special repo::archive /dev/mapper/luks-xxxx&lt;/code&gt; 备份 Ext4 所在的块设备，那些被归零的数据块几乎不会占用存储空间&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;borg extract --stdout repo::archive | dd of=/dev/mapper/xxxx&lt;/code&gt; 恢复 Ext4 到新的块设备上&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;由于以下操作都是需要对系统分区进行操作，所以我是启动进 archiso 里操作的。在退出主系统之前，先把 &lt;code&gt;/etc/fstab&lt;/code&gt; 和 &lt;code&gt;/etc/crypttab&lt;/code&gt; 里即将没用的条目给注释掉，防止调整完后进系统时 systemd 又在那儿苦等。&lt;/p&gt;
&lt;p&gt;第 2 步完成之后的分区调整命令（根据记忆默写；忘记屏摄了）：&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;# 擦除 p2 上的 LUKS 签名防止被 cryptsetup 误读
wipefs -a /dev/nvme0n1p2
# 删除 p2 p3 并建立新的 p2
sgdisk -d 2 -d 3 -n 2 /dev/nvme0n1
# 在 p2 上创建 LUKS 容器
cryptsetup luksFormat /dev/nvme0n1p2
# 加载 LUKS 容器
cryptsetup open /dev/nvme0n1p2 lukslvm
# 初始化 LVM 并创建两个 LV
pvcreate /dev/mapper/lukslvm
vgcreate arch /dev/mapper/lukslvm
lvcreate -n root -L 450G lukslvm
lvcreate -n swap -l 100%FREE lukslvm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时应该已经有 &lt;code&gt;/dev/mapper/arch-root&lt;/code&gt; 和 &lt;code&gt;/dev/mapper/arch-swap&lt;/code&gt; 两个 LV 了。它们的下层设备是 &lt;code&gt;/dev/mapper/lukslvm&lt;/code&gt; 这个 LUKS 容器，而 LUKS 容器的下层设备是 &lt;code&gt;/dev/nvme0n1p2&lt;/code&gt; 这个 SSD 的分区。这就是 DM 叠叠乐！&lt;/p&gt;
&lt;p&gt;此时执行第 3 步，将之前备份的 Ext4 写入到 &lt;code&gt;/dev/mapper/arch-root&lt;/code&gt; 上。写入成功后 &lt;code&gt;file -sL /dev/mapper/arch-root&lt;/code&gt; 或 &lt;code&gt;blkid&lt;/code&gt; 应该能观察到和原先一样的 UUID。&lt;/p&gt;
&lt;p&gt;上述操作中，第 2 步耗时 53 分钟，450 GiB 的文件系统（已用 235 GiB）最终被去重和压缩成 162 GiB 的 Borg repo；第 3 步将压缩后的文件系统写回 450 GiB 的块设备里，耗时 143 分钟。&lt;/p&gt;
&lt;p&gt;恢复完成之后，需要调整一下 boot loader 传递给内核的参数：&lt;/p&gt;
&lt;pre&gt;options rd.luks.uuid=5834fee0-d5f5-4985-aef1-c55d50bd069c rd.luks.options=discard root=UUID=e15bf41d-3922-49a8-abc2-7640f66e318c rw&lt;/pre&gt;

&lt;p&gt;其中 &lt;code&gt;rd.luks.uuid=&lt;/code&gt; 是 LUKS 容器（上文的 &lt;code&gt;/dev/mapper/lukslvm&lt;/code&gt;）的 UUID，因为重建了容器，所以这个值需要更新；而 &lt;code&gt;root=&lt;/code&gt; 是主分区的 UUID，因为我整个 Ext4 导出到导入，一个字节都没有动过，所以这个值是不变的。&lt;/p&gt;
&lt;p&gt;除了更新内核参数，还要确保 initrd 里有 LVM 相关的组件。调整完成之后，退出 archiso 重启，成功进系统！&lt;/p&gt;
&lt;p&gt;现在分区布局变成了这样：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NAME                                          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
nvme0n1                                       259:0    0 476.9G  0 disk
├─nvme0n1p1                                   259:1    0   512M  0 part  /boot
└─nvme0n1p2                                   259:2    0 476.4G  0 part
  └─luks-5834fee0-d5f5-4985-aef1-c55d50bd069c 254:0    0 476.4G  0 crypt
    ├─arch-root                               254:1    0   450G  0 lvm   /
    └─arch-swap                               254:2    0  26.4G  0 lvm   [SWAP]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;试试休眠……成功了！试试唤醒……也成功了！&lt;/p&gt;
&lt;p&gt;再也不用小心翼翼害怕休眠了！&lt;/p&gt;</content></entry><entry><title>2023 年度总结</title><link href="https://wzyboy.im/post/1548.html" rel="alternate"/><updated>2024-01-18T10:38:26Z</updated><author><name>wzyboy</name></author><id>urn:uuid:760835fc-b963-38c3-bba6-0722d716931a</id><content type="html">&lt;p&gt;以往都是在一年的最后几天写年度总结，但这篇 2023 年度总结却是拖到 2024 年才写。&lt;/p&gt;
&lt;h2&gt;Fediverse&lt;/h2&gt;
&lt;p&gt;2022 年年末的时候，由于不满 &lt;a href="https://en.wikipedia.org/wiki/Twitter_under_Elon_Musk"&gt;Elon Musk 对 Twitter 的管理&lt;/a&gt;，我像许多 Twitter 难民一样，将发表微博客的平台由 Twitter 转移到了 &lt;a href="https://wzyboy.im/post/1486.html"&gt;Fediverse&lt;/a&gt;。现在我使用 Fediverse 已经一年多了，感觉良好。我的 Fediverse 实例是自建的，计划是像本博客一样，至少运营十年。实例没有向公众开放注册，而是靠朋友之间口口相传，慢慢地增加了少量（不到十人）的用户入驻。有种盖了个楼自己先住进去，然后亲朋好友也都搬来成为邻居的感觉！&lt;/p&gt;
&lt;p&gt;在 Fediverse 上，每条帖子不再限制只能 140 个字，因此有时候我本想水一篇博客，最终只是在 Fediverse 上发了一条较长的微博客。&lt;/p&gt;
&lt;h2&gt;现实生活的忙碌&lt;/h2&gt;
&lt;p&gt;2023 年四月份的时候，我和家属人生中第一次买房。七月份的时候搬家，之后就忙着各种装修和改造。以前租房的时候，想在墙上挂个东西也会受到房东的限制；现在有了自己的房子，自然是想怎么改造就怎么改造。趁着政府有&lt;a href="https://dabr.ca/notice/AcMJEQmYCeNGcOfG3E"&gt;补贴&lt;/a&gt;，我们把天然气取暖换成了电力驱动的热泵空调，把储水式热水器也换成了效率更高的即热式热水器。我自学了一些&lt;a href="https://dabr.ca/notice/AbJb8ZO5PLP4IBjLLE"&gt;电工知识&lt;/a&gt;，拆开了家里各种开关盒和插座盒，甚至爬到阁楼上增加了新的电路，把家里的开关换成了智能开关，还在房间的天花板上钻孔并安装了吸顶灯。卧室的衣帽间看着也不顺眼，于是我们买了&lt;a href="https://dabr.ca/notice/AZXKoW4N3zULYVKgT2"&gt;电动工具&lt;/a&gt;，把墙垛拆掉，改成了&lt;a href="https://dabr.ca/notice/AdvkzeRUmA2FgufaRk"&gt;独立衣柜&lt;/a&gt;。更大一些的工程，则是请工人来更专业、更有效率地完成。&lt;/p&gt;
&lt;p&gt;第一次买房和第一次装修，波折是少不了的。下半年花了很多时间和精力在这些事情，使得我大部分时间处在一个现实生活忙碌的状态。&lt;/p&gt;
&lt;h2&gt;未能成文的选题&lt;/h2&gt;
&lt;p&gt;综合上面两点及一些其他原因，2023 年我有好几个想写个博客的选题，最终未能成文：&lt;/p&gt;
&lt;h4&gt;买房记/装修记&lt;/h4&gt;
&lt;p&gt;整个流程的时间跨度太大，细节过多，无从下手，而且感觉与本博客的整体基调不搭，最终没写。&lt;/p&gt;
&lt;h4&gt;BackBlaze 安利文&lt;/h4&gt;
&lt;p&gt;我一直在用 BackBlaze B2 作为便宜的对象存储，2023 年我尝试了一下它的旗舰产品——整机备份服务。尝试的原因是主要是我有一些重要性较低的数据不值得搞&lt;a href="https://wzyboy.im/post/1106.html"&gt;多重备份&lt;/a&gt;，但又不能没有备份，我就想着只搞一份异地备份。这些数据体积又较大，传统按容量收费的服务不是很划算。想到我本来就在用 BackBlaze B2，不如试试它不限容量的 Computer Backup 服务。&lt;/p&gt;
&lt;p&gt;BackBlaze Computer Backup 是一个订阅制服务，每个授权可用于一台计算机，存储空间是无限的（所有插在电脑上的硬盘都可以备份，包括移动硬盘但不包括网络存储）。需要取回数据的时候，可以免费下载 zip 压缩包，也可以让他们给你快递一个移动硬盘（可退还）。我用了一下感觉体验很不错，新用户引导简洁明快，客户端也小巧灵动。唯一的缺点是不支持 Linux。&lt;/p&gt;
&lt;p&gt;当时的价格是 $70/y，现在已经&lt;a href="https://www.backblaze.com/blog/2023-product-announcement/"&gt;涨价&lt;/a&gt;到 $90/y 了如果有感兴趣的读者可以使用我的&lt;a href="https://secure.backblaze.com/r/048rf9"&gt;注册链接&lt;/a&gt;获取一个月免费试用（我也可以拿一个月免费时间）。&lt;/p&gt;
&lt;h4&gt;新电脑&lt;/h4&gt;
&lt;p&gt;上一次配台式机还是 2016 年的事情了，时隔七年多，我趁着 Black Friday 配置了一台新的台式机。本来想多拍一些美美的照片，水一篇博客，但是因为装修问题，房间里比较乱，最后拼好了也懒得再拍照了。&lt;/p&gt;
&lt;p&gt;我对电脑硬件不是很在行，在选购配件的过程中得到了不少友人的指点与帮助，在此特别感谢 &lt;a href="https://mastodon.social/@orcaxs"&gt;@OrcaXS&lt;/a&gt; 的指导。&lt;/p&gt;
&lt;h4&gt;Bazzite 与 Linux Gaming&lt;/h4&gt;
&lt;p&gt;早在 Valve 刚推出 &lt;a href="https://github.com/ValveSoftware/Proton"&gt;Proton&lt;/a&gt; 这个 Linux Gaming 大杀器的时候，我就听说 Linux 的游戏性能比 Windows 更好了，但是我一直没有正经试过——因为从 2008 年开始，我的 Linux 电脑一直是集显或是「亮机卡」，无论是什么操作系统都是没法好好玩游戏的。2023 年我配置了一台新的台式机，有了强劲的显卡（RTX 4070 Ti），也许可以考虑体验一下 Linux Gaming？友人向我推荐了 &lt;a href="https://github.com/ublue-os/bazzite"&gt;Bazzite&lt;/a&gt; 这个新鲜玩意儿。&lt;/p&gt;
&lt;p&gt;Bazzite 的理念挺先进的，用 &lt;a href="https://fedoraproject.org/kinoite/"&gt;Fedora Kinoite&lt;/a&gt; 提供的 immutable 系统作为基础，增加一堆 Linux Gaming 所需的软件，还加上 Steam Deck 的 UI，拼出一个稳健且易用的系统。Bazzite 比起桌面操作系统，更像是个手机/游戏机的固件，整个系统作为一个整体升级，极大地减少各软件包之间 ABI 兼容性以及手动安装闭源显卡驱动的痛苦，实在出现问题了还能一键回滚。&lt;/p&gt;
&lt;p&gt;然而我插了一块旧 SSD 到新电脑上，安装 Bazzite 实际试了下，发现 rpm-ostree 虽然理念先进，但实际上速度好慢哦。NVIDIA 的垃圾闭源驱动和 Wayland 相性也不好；开源驱动又不支持我的显卡。而且我用 Bazzite 不就是为了减少折腾获得一个开箱即用的体验吗？要是花了过多时间在折腾上，就有点本末倒置了。&lt;/p&gt;
&lt;p&gt;算了算了，不折腾了。&lt;/p&gt;
&lt;h2&gt;书、影、游&lt;/h2&gt;
&lt;h4&gt;小说/轻小说/漫画&lt;/h4&gt;
&lt;p&gt;2023 年我没有读什么新的小说，只是重读了几本以前读过的小说，还读了一些之前读的轻小说的续作。随着新的一季《无职转生》动画的上映，我把《无职转生》的轻小说从第 8 卷推到了第 20 卷。感想：第 15 卷开始剧情变得好看很多了。&lt;/p&gt;
&lt;h4&gt;电视剧/电影/动画&lt;/h4&gt;
&lt;p&gt;影视方面，我看了不少 &lt;a href="https://en.wikipedia.org/wiki/Marvel_Cinematic_Universe"&gt;MCU&lt;/a&gt; 里的电视剧，印象最佳的是 &lt;cite&gt;&lt;a href="https://trakt.tv/shows/wandavision"&gt;WandaVision&lt;/a&gt;&lt;/cite&gt;，之后的感觉一部不如一部。我还是挺喜欢 Marvel 的作品的，从 2008 年的 &lt;cite&gt;Iron Man&lt;/cite&gt; 开始，我每一部 MCU 电影都没有错过，有些甚至专门去看了首映场。但近几年我感觉 MCU 电影的质量愈发下降了。最近的 &lt;cite&gt;The Marvels&lt;/cite&gt; 我还没看，但是听说也是大烂片。&lt;/p&gt;
&lt;h4&gt;游戏&lt;/h4&gt;
&lt;p&gt;Steam 统计我 2023 年玩得时间最长的游戏——依然是 &lt;a href="https://factorio.com/"&gt;Factorio&lt;/a&gt;。年末假期的时候，我和几位朋友一起联机，开了一个五人局，还是挺欢乐的。&lt;/p&gt;
&lt;p&gt;类似 Factorio 的工厂游戏 &lt;a href="https://www.satisfactorygame.com/"&gt;Satisfactory&lt;/a&gt; 在 2023 年末推出了 Early Access Update 8，加之打折，我便购入玩了一段时间。Early Access 多人模式的 bug 较多，且游戏内的剧情部分还在 WIP 感觉有点无聊，最终没有玩多久，还是回到了 Factorio 的怀抱。&lt;/p&gt;
&lt;p&gt;《原神》我 AFK 了一段时间，但 4.0 版本枫丹上线之后，我又回归了——主线剧情还是想跟进一下的。HoYoverse 的新作《崩坏：星穹铁道》也在 2023 年正式开服了。我玩了几个月，感觉是比《原神》更轻松的叙事；一旦习惯了回合制战斗的设定，还挺好玩的。然而下半年由于现实生活的忙碌，我逐渐 AFK 了。&lt;/p&gt;</content></entry></feed>