如标题,我想要尝试慢慢地去中心化、去 App 化。

去中心化

我尝试了一下使用 PixelFed 和 Mastodon 来代替 Instagram 和推特(我依然拒绝叫它 X)。

PixelFed 给我整体的感觉是还未完善,可以发现整体设计有许多瑕疵。比如我最开始将自己的账户设置为私密账户,发的一些猫咪照片自然也是私密的,但是后续将账户放开、照片却无法再公开。

Mastodon 我在上个学期其实就有用过。

我校的日语部门和日本的信州大学有合作关系,有一些课需要让我们互相投递影像、彼此学习对方的语言。我不知道具体是哪一方搭建的服务器,但就是有人专门为此搭建了一个 Mastodon 服务器:学生创建自己的账户、在服务器内上传自己的视频,另一个学校的学生看到后就可以回复了。

你可以用这些链接关注我:

PixelFed
1
https://pxlmo.com/Cytrogen

值得注意的是,我加入的这个 PixelFed 服务器因为不明原因将我的账户 unlisted 了,也就是不开放。我发布的许多照片目前看不到,但是月刊内嵌入的可以看到。

暂且不知道什么时候会开放。

Mastodon
1
https://m.otter.homes/@Cytrogen

我最近看到许多博客站主使用 Telegram 发布短想法,然后抓取这些内容、生成一个索引网页供大家访问。其实 PixelFed 和 Mastodon 也可以做到这一点,甚至说更方便些。比方说 PixelFed 就可以直接生成一个自己账户的 feed 页面。

既然这些去中心化平台本就支持开放的 Feed 协议,与其让内容分散在各个站点,不如将它们收纳回自己的「主阵地」。于是我打算在这个博客网站里嵌入一个自己的照片和短想法合集。

我也考虑过重复性。现在的日记片段其实就有一点短想法合集的感觉。或许我可以全面迁移到 Mastodon,这也可以解决我先前提到的「外出时无法在博客里写日记」(见 十一月二十九日)的问题:日记不需要再写在 Google Keep 内,直接在 Mastodon 里写好,然后要部署新的月刊时直接在构建时拉取这个月的 Mastodon 内容、自动添加到页面内。

我还在考虑在 PixelFed 和 Mastodon 上发什么类型的内容最好:

  • PixelFed 是专门发送图片的,如果我想要在博客网页上使用这个图片,是不是应该嵌入这个图片进来呢?因为我不想要在互联网上重复上传同一个图片。

  • Mastodon 和博客网站上的「日记片段」是否会有冲突?现在的「日记片段」有些是短想法,有些是日常分享,我认为可以分成两类。那么在 Mastodon 上应该写短想法还是日常分享?

    这样一想又觉得,自己好像花在日常分享上的精力更多,那是不是自己的博客也可以分享日常?这样月刊的内容就不需要这么多这么长?

最后我的方案是,略微改动一下月刊内的「日记片段」板块。我决定尝试一个全新的写日记方式:

  1. 如果是很长的日记,例如一天的流水账、一些很长的想法,我会直接当做独立文章发布。

    如果只是想着去写高质量的博客,月刊的「日记片段」会被我的分享欲压垮的。直接当做文章发布,然后让月刊做链接的工作就好。这样我的标准也会降低许多,写博客也不需要考虑什么质不质量、高不高大上了…… 明明是我的博客!

  2. 如果是短想法,我会发到 Mastodon 上,博客会自动抓取和嵌入这些嘟文。

    这是因为 Mastodon 与「日记片段」的定位有些冲突。我认为既然博客是合集,Mastodon 就可以只做素材库。基于此,我会将嘟文嵌入到 details 块内,并以发布的时间排序,因此它们的前面一定会有时间。

  3. 如果是照片,我会发到 PixelFed 上。和 Mastodon 同样,博客也会自动嵌入这些照片、时间和 figcaption

    因为我不想要在互联网上重复留下冗余的脚印,所以嵌入的照片不会是自部署的。意味着如果我加入的 PixelFed 服务器崩了,这些照片也会裂。

实现

关于如何将这些内容嵌入 details 块,核心逻辑很简单:自动抓取并整合我在 Mastodon 和 PixelFed 上发布的特定标签的帖子,然后将它们按月和天组织成日记,并呈现在我的博客文章中。

主要由四个部分协同工作:

  • 数据抓取
  • 智能渲染
  • 内容注入
  • 样式表现

一听很唬人,实际上没有,我大概说说:

  1. 数据抓取是所有功能的起点。

    当 Hexo 在构建一篇含有 {% diary_aggregator %} 标签的文章时,脚本会被触发、读取我在 _config.yml 中配置的 Mastodon 和 PixelFed 的服务器地址、用户 ID 和访问令牌(它们俩使用的是同一套 API)。

    连接到这两个平台的 API 后,为了提高效率,脚本会通过 since_id 机制,只请求自上次成功抓取以来发布的新帖子。

    抓取到帖子后,脚本会检查每个帖子是否包含特定的日记标签。只有带这些标签的帖子才会被视为有效的日记条目。

    接着将这些新的、有效的日记条目,与一个位于 source/_data/.diary-cache.json 的缓存文件中的旧条目合并。

    合并后,所有条目会根据日期重新排序并去重,然后回写到缓存文件中,确保数据是最新的、完整的。

    这个步骤的核心职责是确保本地拥有所有日记条目的最新数据,它本身并不关心最终页面长什么样。

  2. 在更新完缓存后,diary_aggregator 脚本会立刻读取当前正在处理的文章的原始内容。

    它会使用正则表达式查找所有我手动编写的日记占位符,例如 {% details 十二月十八日 diary_sections %}(我写了一个 details 标签,该标签会渲染 <details class="diary_section"><summary>十二月十八日</summary></details>)。

    脚本会从这些占位符中提取出日期标题(如「十二月十八日」),并将它们记录在一个集合中。这个集合代表了「所有已经由我手动安排好的日期」。

    接下来,脚本从缓存文件中读取当前月份的所有日记条目,并按天分组。然后它会进行一次对比:

    • 如果某天的日记(比如「十二月十九日」)在缓存里存在,但在「手动日期集合」中不存在,脚本就认为这是一个「新」的、无人管理的日期。于是,它会为这一天自动生成一个完整、带内容的 <details> 折叠区块。

    • 如果某天的日记(比如「十二月十八日」)在缓存里存在,并且在「手动日期集合」中也存在,脚本就认为这个日期已经被我手动处理了,它就会跳过这个日期,不生成任何 HTML。

    最后,{% diary_aggregator %} 标签只会输出那些无人管理的日期的 <details> 区块,或者在所有日期都已被手动管理的情况下输出一个空字符串。

  3. 不过那些被我手动创建的,还没有被处理,所以还需要写一个注入器。

    在每篇文章即将被渲染成 HTML 之前(before_post_render 事件)运行。它只对 front-matter 中设置了 diary_month 的文章生效。

    注入器会扫描文章内容,寻找 {% details ... diary_sections %} 这样的结构。对于每一个找到的占位符,它会提取出日期标题(例如「十二月十八日」),然后去 .diary-cache.json 缓存文件中查找属于这一天的所有日记条目。

    接着将找到的条目格式化成 HTML(包括时间、文字内容、图片等),然后将这些 HTML 注入到 details 标签的内部。

  4. 最后,所有这些 HTML 元素如何显示,是由主题的样式文件决定的。

实现讲完了,大家想要复现的话,需要根据自己使用的框架来调整。因为我还在各种调整,就先不把代码放上来了。

总之,实际效果到这个月底大家就能看到啦(不过因为某些原因,可能有人已经看到了……)。虽然话是这么说的,但其实这些改动更多是只有我才能看到,因为实际效果和过去的「日记片段」区别并不大。

去 App 化

说完了「去中心化」,现在来说说「去 App 化」。因为 这篇文章,我想要慢慢卸载手机里的一些 App、使用它们的网页版本。

我第一个下刀的就是 Instagram。我对这个 App 真是又爱又恨:我很喜欢它的 Story 功能,但是 App 内那群人给我带来的回忆实在是不欢快。当然,这个 App 本身也有很多问题。

只需要在浏览器内打开该产品的网页版,然后在菜单里选择「安装为 App」即可。以后在手机首页上点击对应的图标就可以打开使用。

接着我将推特、Facebook、Reddit、LinkedIn 等 App 都卸载,改用网页 App 了。有一些产品是必须使用 App 才行,例如 WhatsApp 这样依赖于手机系统底层的软件。

本来想着先用个几天看看情况,结果实施的当天就出现了一个问题:室友在 Instagram 上发了一个投票,我也想参与其中,结果网页 App 可以看到这个投票栏,点击后却会显示说「需要下载 App 才可以使用」。

更有甚者,移动端根本找不到网页 App,比如国内的许多产品 —— 凭什么!

PWA 一个特点是,通知没有那么简单发出来。我认为这是一个双刃剑:如果有急事找你,没有通知就会很麻烦,不过不想被通知轰炸的话,这又是一个好事。只是说,Instagram 和 Facebook 这样的产品本身就不是 IM 类 App,如果真有人很急找我,那还是乖乖给我发短信或者来电吧

还有一个问题是,我发现我的手机如果关机了或者开启了省电模式,放在桌面上的 PWA 都会被清除,很可能是因为 Edge 浏览器被 kill 了。目前我还不知道有什么办法可以解决这个问题。

不过拜这所赐,我发现我的手机里根本不需要很多 App—— 每次桌面被清后,我会想要添加回来的才是那些对我来说重要的 App。