好久不见,这里是刚刚看到期末分数,心情大好的站长 SamHou。

其实也没有好久不见了,差不多就一个月,而且非杂谈也在更新嘛

本来这篇应该准时一个月的时候写完并发出的,但期末月真的太痛苦了,又是论文又是考试(不过结果是好的就行)。当然,这段时间也积累了许多可以写的素材,除了学业以外,还是很有收获的。

神秘感

你可能注意到了,这次标题里类似「速览」一样的副标题被我删了。其实之所以做出这个决定,是因为我想让文章内容更加充实。具体来说,标题太长会影响 SEO 的最佳实践,所以不可避免地需要略去一些内容来进行概括。但有时候再怎么概述也不能覆盖文章的所有内容,而对文章和标题都有「完美」的要求的我是无法接受这种「缺憾」的。之前写文章遇到这个问题时,我的解决方案非常简单,直接把文章一拆为二。但是作为一个月刊(存疑),这种拆分是致命的:这个月没有用上一些素材,只会堆积得越来越多,导致最后不得不舍弃一些。所以——不如直接去掉副标题好了,这样文章想要多长就可以有多长,还能把脑力放在真正的内容上,而不是考虑「这些内容应该怎么概括?」的问题。至于左侧目录么,就用这个章节的关键词代替嘛。

此外,在标题和目录里留下一点神秘感趣味性,在正文里揭示,不也更有趣么?真的想看剧透内容的话,可以退回主页看摘要。

扯远了,回到「水星冲浪」的正题吧。

Happy End 和 True End

记得在我第一次搭建好 misskey 正式进入 fedi 世界的时候,就已经把「设置」翻了个底朝天了。很明显,机器人账号的选项也不例外。在 fedi 冲浪的时候,也经常遇到各种奇怪的 bot,比如「没关系 bot」(每天都会发「没关系,能 XXX 已经很厉害了」的句子的机器人),以及各种 AI 助手的机器人。

顺理成章地,「什么时候我,或者说 ClanNA 档案馆能够有属于自己的 AI 机器人呢?」这个想法在脑海里生根发芽。

自己写对我现在的技术来说,可能挑战比较大,于是我的第一想法是找现成的方案。

而提到 AI Fedi 机器人,我第一个想到的就是用 AstrBot。之前曾经玩过,可惜权限管理非常差,没办法精细化管理用户对话的权限。

行,让我们看看其他「原生支持 fedi」的机器人吧。第二个找到的就是 memoh。卖点是 docker 容器化、比 openclaw 更稳定、支持 fedi 和多种渠道——完美戳中我的好球区。

但实际上呢?我甚至一句话都没有和 Agent 说,就已经遇到无数个奇怪的 bug 了。这似乎就是个半成品,至少在我体验的时候是这样……

声明:我没有不尊重开发者的意思。我自己肯定是写不出这样的项目的,开发的大佬们都非常厉害,只是这个项目不适合我使用。至于具体 bug,写作本文时,已经隔得比较久了,我只是模糊地记得 issue 里面似乎都有。

行,「原生支持」的 Agent 看完了,再来看看非原生支持的。

在此也要提一嘴龙虾 (OpenClaw)。我第一个就把它排除了——小龙虾经常改配置干死自己,极度不稳定。

最后尝试的是 hermes。自动进化、会干活、有风险审批、工具多样,是一个非常有竞争力的项目(是的,直到现在,我依旧在 VPS 上留着 hermes,给了 sudo 让它作为我的个人助理)。但是不支持 misskey 接入。

「但是最懂 AI 的还是 AI,我们直接让它自己写一个插件接入 misskey 不就好了?」我一开始就是这个想法,但模型性能太差了,写出来的东西完全没法正常在 misskey 上对话——即使解决了接入插件的这个问题,依然会出现上下文太长胡言乱语、安全拦截干扰过度、记忆插件需要适配的大问题。可以说,hermes 更像是一个能干活的全能助理,而不是一个单纯的带有记忆功能的聊天机器人,但后者才是我所需要的东西。

所以,最后还是决定自己动手。但前提是得提升技术能力,之后才能写,因此这部分就不了了之了。

……你或许感觉到了,拿一整个部分写一个没有结果BE的故事,并不是这个系列的风格

我可是结果HE爱好者!

是的,且看另一条同步进行的时间线:bangumiss 项目

这是一个四月份开始,甚至在「ClanNA 档案馆」的前身「SamHou 的小窝」上就已经在运行的 Fedi 机器人。它是一个桥接机器人——可以把你在 Bangumi 上的追番、游戏等条目的更新,转换为帖子发出在 Fediverse(仅支持 Misskey 和它的分支)。

起初运行时,经常出现重复发帖、发垃圾帖子等情况,因此这个机器人只是选择了「主页」的贴文权限。而在六月份考试周的时候,我又有兴趣想摸鱼去把它完善了一下,学了点 SQL 做了 SQLite 数据库的增删改查,完全避免了重复发帖,并且只会在观看状态更新时发帖来减少打扰。稳定运行一些时间后,我便把它的贴文权限转换为了「公开」,现在的用户名是 @bangumiss@clanna.dev

也就是说,虽然 AI Bot 的计划泡汤了,但是最终做出来的 Bangumiss 依旧是一个完整可运行的 FediBot,这个结果TE也不算太坏BE

Custom

提到 Fediverse,就不得不提我对 ClanNA 档案馆,确切来说是 Sharkey 的「自定义」了。

你可能会说,原版 Misskey 的功能很多,Sharkey 则是更加完善的一个版本,功能确实已经足够多了,为什么我还要继续自定义呢?

这是因为,有一个非常严重的功能缺失:翻译。目前来说,Sharkey 仅仅支持 DeepL Translation 和 LibreTranslate。前者对于中国用户几乎不可能——你需要一张国外卡才能进行免费层级的验证,且存在调用限制。后者则几乎不可用——翻译准确率极其低,更别说是混入 emoji 和 MFM 语法的贴文了。

于是,我鞭打了 AI 黑奴,帮我改了源码,做出来了 Azure Translate 的适配,这对于大学生 Azure 学生计划来说是完全免费的。成品看起来像这样:

Azure Tanslator

现在,贴文的翻译准确率大幅提升了(单纯英语可能看不大出来,但是日语/复杂格式情况下,准确率非常高,大部分情况下都能够保留正确的格式):

Test Message

此外,或许你不知道,misskey 有内置一个 Live2D(是看板娘小蓝的 live2d 模型),我也给改成自定义的空门苍的模型了(博客看板娘 S 酱没有 live2d 模型所以没法用),具体可以看我的这个帖子中的内容。

效果像这样:

Sharkey 右侧面板内嵌 Live2D

好了,关于 fedi 已经讲得足够多了。关于「自定义」这个话题,其实还有别的内容可以说,也就是这个博客网站本身的自定义。不过,这部分的内容已经在「Hexo 博客接入 Fediverse —— Hatsu + Vercel 踩坑记」这篇文章里面详细讲过了,这里就不再提了。

Talk is NOT “cheap”

注:为了避免不必要的麻烦,下文中除了 matrix 均不会提到具体的软件名字,请自行品味。

之前,因为线上大部分都是现实中的朋友,而他们都只用神秘绿油油软件,所以「联系方式」这个问题,在本博客上,也就只有邮箱一种方式。

后来,作为一个合格的 mjj,毫无避免的,灵车商家们都会用「那个软件懂的都懂」。所以,除了几个现实中的技术好友,那个 app 完全变成了一个购物软件,每天大量的消息刷屏。

而在 fediverse,我认识了许多对消息安全性有要求的人,大家都会留下一个叫作「Matrix」的联系方式。

——实际上,几年前我就已经知道 Matrix 了,那会还是在做 tldr 的汉化的时候,看到有个 matrix 聊天室的链接,于是在 matrix org 的官方 homeserver 上面注册了一个账号,加入了聊天。那时候我还不太了解,只知道 matrix 是一个小众的聊天软件,是一种开放的通信协议,在开源社区里面十分流行。而那时候我很喜欢 thunderbird 这个邮箱客户端,里面正好有 matrix 的聊天支持,但是十分得破旧,于是 matrix 就给我留下了不太好的印象。

而这次重新捡起 matrix,深入研究之后,我才发现 matrix 的设计确实很有味道。首先,它支持端到端加密,所有的通信消息,即使你的账户密码泄露了,只要你没有用现有设备或恢复密钥进行验证(传递密钥),那么你开启加密的消息是无法被读取的。其次,Matrix 官方定义了一个协议,你可以自由选择服务端和客户端(和 Fedi 很像嘛),对于我这种喜欢高度自由配置的用户来说非常舒服。最后,bridge 支持非常完善,你可以把大部分平台通过 bridge 接入进来双向聊天。

绿油油软件你要不要看看你在做点什么史,学学人家 matrix

所以,火速拿我们的老朋友 docker 起一个 tuwunel(一个服务端实现),创建账号……而对于客户端,在尝试了 114514 个实现之后,我选择了电脑端 Cinny,手机端 FluffyChat 的组合,这是因为它们的 Sticker 支持相对完善,可以随意发 sticker,而且通知也会正常工作。最近 fluffychat 还修复了它那个安卓上的巨无霸字体的 bug,现在阅读流畅度好多了。

好了,现在博客有了新的联系方式,你完全可以通过 Matrix 来联系我,享受端到端加密带来的安全感。

本来写到这里,安利完 matrix 就要换一个话题了,但是……在这个月里,我仔细想了想——「水星冲浪日志」不应该是这样的
单纯堆砌折腾过的技术、发现的新项目,写出来的文章就太无趣了。所以,这一部分还没完!

当我远离那个“购物软件”,用了一段时间 matrix 后,我突然明白了「做减法」的道理——

作为一个聊天软件,首要的功能是聊天,而不是夺取注意力的「附加功能」。

那个大名鼎鼎的 Linus Torvalds 曾经说过这么一句话:

Talk is cheap, show me the code.(屁话少说,放码过来)

如果我们不「雅」,而是用大白话翻译这句话,那么会变成:「说话没有价值,给我看你的代码」。在代码界是这样,但在聊天软件中正好相反——

Talk is NOT cheap.

话语反而是最有价值的。

一个聊天软件,必须提供最好的聊天性能,让我们联系到应该联系的人,同时减少其它信息的打扰。很显然,「那个软件」,对于 mjj 来说,没有做到这一点;而绿油油的那个,以及企鹅,更没有做到那一点(公众号、订阅号、空间、钱包……)。

当然,对于前者,这不是软件本身的问题,而是其「生态位」的问题。仔细想想就知道了,那些 VPS 商家肯定不会用绿油油,因为他们大多位于海外;而 matrix 这种,太过小众;所以「那个软件」由于其知名度和“安全性”(存疑)便成为了商家和 mjj 的明智之选。但这种生态位对我们来说真的好吗?不见得,商家和用户的交流群无时无刻在发送消息,你肯定会去看,想要不错过任何的优惠机会。

再来说后者绿油油。在当下,「服务号」、「小程序」和「公众号」确实给我们带来了许多便利性。但是和那个软件一样,我们也不得不反思一下它们对我们专注力的夺取——我已经无数次在想要联系别人、干正事的时候遇到「订阅号消息」的小红点,结果点开公众号刷得无法自拔了。这次不再是「生态位」问题了,大部分是商业公司为了盈利所带来的结果

再说回 matrix。当我从那个软件迁移到 matrix,然后做好双机隔离,改成定时收取绿油油的消息后,世界都变得安静了起来。我不再去看那些降智内容、乐子内容,也不再蹲守 VPS 促销,对 mjj 的热情也恢复了正常水平,不再天天沉迷刷 nodeseek 论坛了。

当然,我也知道,如果不加控制,matrix 也会终究变成夺取注意力的那一类。因此,可以说它给了我一次重新来过的机会——matrix 我只会加必要的人、必要的群,单纯当作「通信工具」和「讨论工具」来使用。

当然,这并不是说不欢迎你来私信打扰我。我这里的重点是,要减少垃圾信息,而人与人之间的交流,那些思维的碰撞,无论如何都是最宝贵的资产

因此,让我用修改过后的句子结束这一部分:

Talk is NOT cheap, show me your thought.

家里养鸡

事情要从很久之前说起。你这是什么童话故事吗

因为家里阶梯电费已经不断升到了更高的等级,所以之前组装的「核弹小主机」没办法直接放在家里了,移动到了同一个城市的另外一处,那里电费阶梯比较低,可以节约 RMB。虽然遇到「主板电池没电」导致 BIOS 重置问题,炸过一次机器,但是总体上来说还是非常稳定的。

于是,当我受够了在 arch 上开 Windows 虚拟机,吃掉大量系统资源还卡时,我做了一个大胆的决定。直接把吃灰多年的 8g 内存的笔记本也扔到核弹小主机那边,装好 windows 当作远程桌面使用。当然,整个过程没出任何岔子,组网就是喜闻乐见的 tailscale,无人值守状态下,禁用睡眠 rdp 也能正常连接。

还没完,为了进一步节省这边的电费,我还废弃了之前的「闲置游戏本当家里云用」的方案。由于游戏本太强悍了,基本上 CPU 和 GPU 都是闲置的,性能非常过剩;而且我也实在受不了通过外接 USB 硬盘盒来连接 SATA 硬盘这种对硬盘不稳定的方式。

那我的替换方案是什么呢?

当然是……闲置 qnap TS-551 NAS!这台 NAS 在我受不了它的垃圾系统,而且系统爆炸无法再启动懒得折腾之后,就一直在吃灰。它用的是 J3355 CPU,内存升级到了 10G (2+8),或许对于我的负载来说是个更好的低功耗选择。而且它是 x86,网上有个装 fnOS 的教程,说明完全可以插入 hdmi 显示器当作一个正常的小主机来使用。fnOS 这种我肯定是不敢用的,我选择了 openmediavault,基于 debian 的 NAS 套件,感觉非常适合我这种折腾用户来使用。一条清晰的路径都摆在那里了,那就开搞吧!

你知道的,一般这个时候就要出事了

这台设备是内置一个 4G 的 dom 的,这个 dom 包含一定的系统固件,可以用来安装和启动 SATA 接口上安装的系统。但很可惜,正在拿 u 盘装系统的我显然是不知道这一点的,而人类的好奇心又是无限的——

欸?这怎么有个 4G 的内置存储设备,这么强!?让我试试,如果把 debian 安装在这个上面会发生什么……大不了之后再装一次,这次就当实验了。

dom 灰飞烟灭。

喜闻乐见地,debian 装好了但没完全装好。现在,机器的 bios 没法识别任何一个硬盘设备,本来存在的一个 qnap 启动项也没了,新装的 debian 也没有显示。我不信邪,又在插在 SATA 接口上的 300G 盘子安装了一遍 debian,结果依旧无法启动。

后来上网查询才知道,似乎是需要 dom 中的原厂系统,才能启动 sata 硬盘笼中的外部系统。折腾到心累的我虽然确实网上下载到了 dom 的镜像,但是用等效方法在 Ubuntu CD 中向 dom 写入镜像却依旧无法恢复 qnap 启动项。而严格按照官网的教程来,则需要一台物理 Windows——身边都是 arch,根本没有(只有远程桌面)!

于是,灵机一动——既然 usb 上的系统能识别,那我直接把之前的那个游戏本上的 m2 nvme 盘拆下来,买个硬盘盒,用 usb 插上去,不就好了?

火速下单 m2 硬盘盒后,等了一天很快就拿到货了。拆下之前的游戏本上的硬盘后,接入硬盘盒,然后在上面安装 openmediavault 作为系统盘。一切都很顺利——外置 usb 开机、数据复制、tailscale、远程访问……一切都很好,我甚至做好了长期使用的准备。

NAS 照片

没错,就在这时又出问题了。

jellyfin 突然无法访问,检查日志后发现,服务器的 sqlite 在遇到一次 disk io error 后,数据库无法识别了。

我这时候还没有意识到问题的严重性,瞄了一眼 SMART 信息也没有任何异常出现,于是就打算重启一下,看看是不是哪里遇到了临时性问题。结果重启之后发现问题更加严重,系统直接起不来了。还好不是远程机器,立马拿了运维小屏幕物理接入进去。一看彻底傻眼了——系统启动项没了,外置 usb 的硬盘盒中的 UEFI 启动项根本就没有被 BIOS 识别出来

其实这个问题在安装系统的时候曾经出现过一次,我当时就怀疑是 USB 接触问题,重新插拔外接 usb 系统盘即可恢复正常。但这次是在真正运行系统时出现问题,性质就不一样了:说明外置 usb 对系统运行的稳定性存在重大影响,而 NAS 最重要的就是稳定性。

不过事已至此,重新插拔硬盘吧。重启后,果然识别出来了系统,一切都恢复了正常,除了 jellyfin——数据库报废了,所有配置和观看记录都要重来,扫描到一半的存储库也要重新扫描。(是的,我没有备份!!真的要哭了。各位,切记要好好做备份。)

既然如此之不稳定,看来 TS-551 这条路是堵死了。而之前组装「核弹小主机」已经积累了一些经验,是时候自己组装一台 NAS 了。于是火速和一位专门研究硬件的朋友 @GreatHuang 在 Agent 的协助下出了这份配置单:

1
2
3
4
5
6
7
8
cpu i3 12100 850r二手
内存 七彩虹战斧 ddr4 3200 8G*2 550r
电源 利民 TR-GX650 金牌全模组 260r
主板 华硕 PRIME B760M-AJ D4 550r 淘宝拆机
散热 Thermalright AX120 R SE LGA1700 版本 65r
机箱 半岛铁盒f20 14盘位+风扇 215r
电源线 绿联电饭煲线 14r
硬盘、硅脂、其余外接线材:自己有,不用买。等降价再补充

写作本文时,正在处于等快递的过程中。所以——

「欲知后事如何,且听下回分解~」

什么是博客

什么是博客?

如果你问之前的我,我或许会说是「由文章组成的地方,记录个人对某些东西的理解和解释,是个人输出的大杂烩」。

但重新审视自己的网站之后,我发现有些东西,似乎不适合博客这个地方;而有些东西,是博客该有的,但这个网站却缺失。

比如,单纯介绍编程语言的语法,真的是博客应该写的东西吗?特别是那些「从零开始」的教程,真的适合博客这个形式吗?现在,我给出的答案是「不是」。这些文章可以说是笔记,而笔记强调的是一个知识体系,是有组织性的。因此,我做出了一个大胆的决定,把这些单纯讲编程语言语法的文章,移动到了单独的网站(命名为「中文教程式编码笔记」),并更新了导航栏,可以从博客跳转到那里去,也可以跳转回来。

上一篇文章里面,我曾经提到写作风格从几年前到现在的转变。

仔细审视之后,发现这个博客似乎缺少「人文气息」。什么意思呢?网站上全部都是技术内容,却缺少「艺术」「思考」一类的东西。为了解决这个问题,首先就引入了「ACGN 点评」这个栏目作为 Bangumi 日志的镜像,让这个博客的内容更加充实。而你或许也已经注意到了,这篇「水星冲浪日志」不再仅仅堆砌技术折腾过程,也稍微融入了一些反思与思考。虽然这样会让文章变长,但我相信,来到这篇文章的每一个访客,都是喜欢长内容的人——如果要看快餐内容,那么这个用户早就被某短视频网站夺走了。

理科生在这里大谈「人文气息」是不是搞错了什么

总之,如果你要让我对博客进行重新定义的话,我或许会说:「博客是博主人生经历的结晶,它是一个分享折腾过程,表达自己的想法的地方,而不是一本堆砌内容的教科书」,这也是对这段时间博客转型升级的总结。

后记

写完才发现,这篇文章已经相当长了。不过,我自己觉得这种内容充实的文章还不错,长文章更能满足「表达欲」,也更能把我想表达的东西说清楚(这点和我的编程语言语法讲解的文章很像嘛)。总之,下个月再见了!最近在学习 Rust,或许编程笔记会做些许更新~

继续「水星冲浪」吧!