在听 the pillows 的“Come On, Ghost”时,我突然想到如果我有两只分别名为 Beast 和 Ghost 的猫,那我就有正当理由时不时突然来一句“Come on, Ghost; Come on, Beast”了。

你好黑暗,我的老朋友

由于越来越多的设备和软件都开始支持暗色模式,我调整了博客的配色并加入了用 CSS 的 prefers-color-scheme 实现的暗色主题。我也考虑了加入用户切换的功能(参考 这里 的教程),但是出于我对 JavaScript (毫无来由)的反感,我最后否定了这个主意。

颜色用途 亮色主题 暗色主题
强调 #700000 #8fffff
背景 #f7f3e3 #080c1c
文字 #2e2d2b #d1d2d4
代码背景 #e3dacb #1c2534
边框 1 #e7e3d3 #181c2c
边框 2 #d7d3c3 #282c3c

写 CSS 真是累人,不过好在挑选配色是一件挺让人放松的事。新的亮色主题有更低的对比度,我也更新了 isso 的样式表。是的,我的暗色主题只不过是亮色主题的反色版本,并没有降低文字粗细程度以照顾人类视力的某种古怪特性和其他细微的颜色调整。当我看到由三个似乎没有任何联系的数字形成的颜色代码时,我潜意识已经在大呼异端——它们就像不协和和弦一样让人头皮发麻——所以我 需要 它们至少加起来是一个不那么差劲的数。

知识就是黑夜!

字体配置万维网篇

用《字体配置浏览器篇》作为标题或许更为准确,不过现在的标题听起来更吸引人一些。渲染文本 不是一件简单的事 ,如果还要考虑书写系统之间的巨大差异(这大概得怪巴别塔)无异于雪上加霜。运行双语博客会导致字体选择的麻烦加倍,这里是我遇到的一些问题的汇总。

空格侵略者

大多数浏览器会将 HTML 中的连续文本合并为一行,并在链接处加上空格。所以

<html>Line one and
line two.</html>

会被渲染为

Line one and line two.

这种一刀切的方法显然不适用与字符之间不带分隔的 CJK 语言。解决方案是为页面(或页面上的任何特定元素)指定 lang 属性,如下所示:

<html lang="zh">第一行和
第二行。</html>

如果你的浏览器足够聪明(例如 Firefox),渲染的结果就不会有额外的空格。但是,所有基于 Blink 的浏览器仍然顽固地将多余的空格塞进去,所以我只能像野蛮人那样继续写一段一行的源文件。尽管不是万能的解决方案,但是指定 lang 属性仍然具有启用特定于某种语言的 CSS 规则的额外好处,这稍后会派上用场。

引号归来

之前的日志 所说, CJK 字体会将引号显示为全角字符,不同于拉丁字体。只要网页不尝试混搭字体,这就不会成为问题:只需使用特定于语言的字体栈就行。

body:lang(en) {
    font-family: "Oxygen Sans", sans-serif;
}

body:lang(zh) {
    font-family: "Noto Sans SC", sans-serif;
}

再加上匹配的 lang 属性,所有问题就都解决了。 Firefox 甚至允许为每种语言指定默认字体,所以仅使用后备字体(例如 sans-serifserif )也可行,不一定要费心编写特定于语言的 CSS。

那么,如果我想用 Oxygen Sans 来渲染拉丁字符,并用 Noto Sans SC 来渲染 CJK 字符怎么办?虽然看似没有问题,但像这样指定字体堆栈,

body:lang(zh) {
    font-family: "Oxygen Sans", "Noto Sans SC", sans-serif;
}

会导致引号被 Oxygen Sans 渲染、显示为半角字符。我的解决方案是通过 unicode-range 定义一个涵盖了引号的替代字体,

@font-face {
    font-family: "Noto Sans SC Override";
    unicode-range: U+2018-2019, U+201C-201D;
    src: local("NotoSansCJKsc-Regular");
}

并修改字体栈为

body:lang(zh) {
    font-family: "Noto Sans SC Override", "Oxygen Sans", "Noto Sans SC", sans-serif;
}

这样我们就可以享受全角引号了!

字体忍者

字体文件通常都不小,对于 CJK 字体来说更是如此:刚才提到的 Noto Sans SC 的大小 超过 8MB 。尽管我已经下定主意要从自己的服务器上提供所有文件,考虑到我网站上的平均 HTML 文件大小更接近 8KB,这显得有些过头了。那么那些网络字体服务如何处理这一问题呢?

大多数网络字体服务的工作方式是在网站的样式表里添加一堆 @font-face 定义,以从专用服务器上提取字体文件。为了减少所提供的文件大小, Google Fonts 会将字体文件大卸八块,并在 @font-face 里声明每一块所对应的 unicode-range (这正是它们处理 CJK 字体 的方式)。他们还将字体文件压缩为 WOFF2 以进一步缩减文件大小。而 Adobe Fonts (以前称为 Typekit )似乎有一些 JavaScript 奇技淫巧,可以动态确定要从字体文件加载的字形。

博采众家之长,得益于这是一个静态站点,我们可以简单地统计所有用到的字符,并提供一个只包含这些字符的字体文件。所要用到的工具主要是 pyftsubset (属于 fonttools 下的一个组件)和 GNU AWK 。将字体压缩为 WOFF2 还需要 Brotli 压缩库。在 Arch Linux 下,获取这些程序需要安装 python-fonttoolsgawkbrotlipython-brotli

收集生成的 HTML 文件中的所有使用的字形可以使用这条 shell 命令:

find . -type f -name "*.html" -printf "%h/%f " | xargs -l awk 'BEGIN{FS="";ORS=""} {for(i=1;i<=NF;i++){chars[$(i)]=$(i);}} END{for(c in chars){print c;} }' > glyphs.txt

你可能需要 export LANG=en_US.UTF-8 (或者其他 UTF-8 语言环境)以便正确处理某些字形。有了字形清单,我们就可以提取字体文件的有用部分并进行压缩:

pyftsubset NotoSansSC-Regular.otf --text-file=glyphs.txt --flavor=woff2 --output-file=NotoSansSC-Regular.woff2

指定 --no-hinting--desubroutinize 可以进一步减小生成文件的大小,但会降低字体的美观程度。拉丁字体也可以使用类似的技术来瘦身,例如只提取包含 ASCII 字符的部分(或将范围设为 U+0000-00FF 以涵盖 Extended ASCII 字符):

pyftsubset Oxygen-Sans.ttf --unicodes="U+0000-007F" --flavor=woff2 --output-file=Oxygen-Sans.woff2

大部分字体管理器都可以用来检查最后生成文件中可用的字形,也可以使用这一 在线检查器 (不支持 WOFF2,但是可以先试着转为其他格式后查看,例如 WOFF)。

我还考虑过将字形按受欢迎程度划分为更多块。获取按出现次数排序的字形列表可以使用以下命令:

find . -type f -name "*.html" -printf "%h/%f " | xargs -l awk 'BEGIN{FS=""} {for(i=1;i<=NF;i++){chars[$(i)]++;}} END{for(c in chars){printf "%06d %s\n", chars[c], c;}}' | sort -r > glyph-by-freq.txt

结果显示我的博客用到了大约 1000 个不同的汉字,其中大约 400 个出现了 10 次以上。由于上一步中获得的字体文件大小已经足够好,我没有继续进行拆分。

孔中窥见真理之貌(好像没有啥不对)

我最终将字体文件的总大小减少到了 250KB 左右,但这仍然比 HTML 文件大好几个数量级。虽然看到我的网站在所有设备和屏幕上都保持一致很让人开心,但是与页面大小增加上百倍的代价相比,我觉得这点好处不成比例。

费劲心思指定字体或许并不值得。如果你希望看到我眼中本站的样子的话,以下是我的常用字体:

《星球大战:天行者崛起》影评

剧透警告!

话说在前面:我在正传之前看的前传。我觉得前传其实还可以-初看时,我觉得这既可以算是阿纳金的故事,也可以算是欧比旺的。直到我看了老三部曲之后,我才完全意识到麦格雷戈的表现是多么出色:我小时候甚至以为他们是同一个人。看完故事的全部内容后,我可以理解与老三部曲一起长大的人为何会将前传视为对其的亵渎。虽然先看前传确实使得《帝国反击战》中的大转折变得平淡许多,但是当看到安纳金在前传中转向黑暗面时,我的震惊程度也绝对不低。

我与《星球大战》的第一次接触其实也不是前传,而是我在当地书店中找到的某个版本的《星球大战:视觉图典》。正是那些怪异的武器(包括我印象特别深刻的光鞭)、宇宙飞船和服装使我对这个世界着迷。我很高兴地发现前传恰好描绘了一个如此多彩而充满异界情调的世界。老三部曲的氛围则要黯淡的多,更加“太空”而非“异星”。在目睹了阿纳金堕落之后,这种过渡对儿时的我来说很自然。

接下来讲讲后传三部曲吧。我和我的大学室友在首映日晚上七点观看了《原力觉醒》( TFA )。在即将开映前我们花了半个小时寻找停车位(虽然最后还是因为超时吃了罚单),好不容易才赶在片头结束前进入放映厅。至于《最后的绝地武士》( TLJ ),我是在首映后一个月的晚上看的。今天早上我赶去看了《天行者崛起》( TROS )的首映,早上九点对于观看三部曲的结尾其实意外地合适。 TFA 是一个不错的开始,怀旧加上几条有趣的线索使观看体验变得非常愉快。 TLJ 则给我留下了非常不好的印象,因为它不仅以最糟糕的方式回答了 TFA 可能提出的问题,还把大部分时间花在试图给已经树立成型的老角色上课,而忽略了新角色的成长和发展。我还有一篇充满了我对 TLJ 牢骚的日志躺在我的( 2018 年的)草稿箱里,所以这里就不多叙述,让我们转移到 TROS 上吧。

简而言之,虽然 TROS 是一个杂乱无章、臃肿不堪的大杂烩,我看得还是挺开心的。

电影开头的一连串镜头简洁地展示了凯洛与皇帝的见面和千年隼团队逃离第一秩序的经过,令人兴致高涨。但是电影的节奏在芬恩、蕾伊和波会面后急转直下,充斥这三人之间毫无意义的争论:我不希望三部曲中最后一部电影还花时间在主角团队建设上,但是 TLJ 的剧情大概没有给 J·J·艾布拉姆斯留太多选择的余地。

这之后的半个小时,三人组和剧情都像无头苍蝇一样在行星间四处乱撞,并在此过程中“牺牲”了丘巴卡和 C-3PO 。蕾伊疗伤能力的展示如此刻意,以至于这几乎必然是情节装置。所有这些中唯一的好场景可能是蕾伊面对凯洛的地方。实际上,两者之间的大多数独处场景都非常有意思,因为只有这些地方,我才能看到蕾伊流露出一点点真实情感(与凯洛形成鲜明对比,凯洛不断的内心挣扎和变化被亚当·德赖弗完美地表现了出来)。蕾伊是一个帕尔帕庭的事实在揭露时挺让人吃惊,但对她的角色整体并没有造成多大影响:一直以来收到阴暗面诱惑的明显是凯洛,而不是蕾伊。

死星残骸上的对决在视觉上令人惊叹,但结束的方式可能有点尴尬:更多的极为刻意的剧情装置的展示,以及最后有点多余的韩·索罗镜头(考虑到亚当·德赖弗的出色演技,我认为这里体现他的转变完全不需要韩)。嘉莉·费雪的逝世是不幸的,但我觉得这为她的角色带来了过于仓促的结局。蕾伊自我放逐的过程也让人觉得老套,而且没有雷伊的特征。或许莱娅(在她即将去世时或是以原力鬼魂身份)才应该是是给蕾伊提供最后指导并而赠予她的光剑的人。

随着情节再次将蕾伊与她所谓的“队友”分开,反抗军和“最终秩序”的决战在芬恩和波看似疯狂的想法(尽管 TLJ 花了大量篇幅明确告知波不要这么做)中开幕。过早出现的蓝多在大部分时间里都无所事事,有点浪费这一角色:由于缺少与新主角团共处的时间,蓝多几乎没有与他们互动的方式。我更希望他只在最后前来援助抵抗军的成千上万艘飞船的其中之一里作为彩蛋出现。话说回来,我挺喜欢抵抗军这一条线的故事:角色之间表现出良好的化学反应,并且以巧妙的方式完成了看似不可能的任务。

与皇帝的战斗则是好坏参半:最终对决之前的一切都非常棒(光剑传递的场面特别赞),直到雷伊不得不独自面对皇帝。雷伊和皇帝之间的情感联系太少了,以至于他们之间的任何对抗都感觉十分空洞。如果有任何角色应该在其漫长旅程的最后得到展示其决心的机会的话,那应该是凯洛,而不是从 TFA 以来都一个样的蕾伊。让凯洛在战斗中牺牲自己、取代维达在《绝地归来》中扮演的角色,会是一个比爬回对决地点、治疗并亲吻雷伊(同时炫耀花了至少十五分钟铺垫的剧情装置)更加契合角色的结尾。一千个西斯对一千个绝地武士的部分显得尴尬且并不怎么贴合故事。顺便一提,皇帝看起来十分吓人(有趣的意义上):观感酷似 80 年代的恐怖片,但意外地很合适(更不用说这部电影以“THE DEAD SPEAK! ”开头了)。同样有趣的是,皇帝改装的歼星舰终于有了名副其实的歼星级武装。

好吧,看来我其实也不太喜欢这部电影?我也有点惊讶我能想到这么多负面的评价,即使我记得走出电影院时,我的心情是轻松而满足的。回顾后传,这一三部曲整体的感觉就是缺少规划,充斥着即用即抛型角色、本可以用于发展角色的时间流向了一些新奇的机器人或外星生物(大概是为了卖出更多的玩具),而最关键的剧情方面则支离破碎、不合情理。也许《天行者崛起》是在没有适当答案的情况下尝试解决如何为三部曲收尾这一棘手问题的勇敢尝试,而我欣赏这最后的努力。我不知道在后传三部曲中长大的那代人会怎么想他们:他们会像我看前传(或者是《蜘蛛侠 3 》)一样看待后传吗?还是说我的感受并没有完全被怀旧之情蒙蔽?

回顾 2019

每个新年给我带来的新鲜感都不断地下降(参见我在回顾 2018 时提到的一年的相对长度),不过用一个和新的目标与决心绑定的节日来结束过于嘈杂且让人感到慵懒的假日季节并不是一个坏主意。

话说回来,看到 2020 这个数字会让人不自觉地感到兴奋,因为这在我的印象里总是存在于极为遥远的未来:我甚至不记得任何描绘 2020 年代的科幻作品。大多数作品不是止于 2010 年代,就是直接跳到 31 世纪,使得接下来的十年处于期待值的空白区域。对了,2020 年将迎来农历的庚子年,而有趣的是 维基百科 的英文直译是“金属耗子”——想不到一个传统概念会有这么朋克的名称。

2019 回放

2019 年的计划进行的非常顺利!

  • ☑ 跑 400 英里。[555/400]
  • ☑ 写 10 篇日志。[14/10]
  • ☑ 停止使用 Gmail、Inbox 应用程序。[2/2]
  • ☑ 给博客加上 rel=me 链接。
  • ☑ 进一步了解 Rust 和 Julia。[2/2]
  • ☑ 记录我中意的书籍,音乐,和影视作品。
  • ☑ 清理台式电脑。

在排除了生活中的一些不确定因素后,我在 2019 年的日常变得更有规律了。我仍然时不时地拖延博客文章,但至少发布日志的频率高了一些。学习 Rust 和 Julia 很有趣,而且我也在实际项目中用到了它们。我还尝试了用这两种语言完成 Advent of Code 并撑到了第 17 天,到解决问题所需时间太长为止。我曾考虑过圣诞节后完成所有剩余的问题,但我决定不这样做——我认为自己不会通过这些问题增加对这些语言的了解,把时间花在其他地方可能会更好。

受到 本文 启发,我给博客写了一个新的 Hugo 主题。我发现一步步消除那些可有可无的装饰的过程奇怪地令人满足:我希望博客带有任何不必要的东西。本站的订阅源已改为使用 ATOM,并且完整显示每篇日志,而不是默认的支离破碎的摘要。在上一次尝试整理浏览器书签并遭遇惨败后,我开始使用网站订阅源来阅读其他博客。到目前为止,我很喜欢这一新方式。

我今年去电影院看了三部电影,分别是《龙珠超:布罗利》,《普罗米亚》和《星球大战:天行者崛起》。三次观影都还算愉快:试图用评级来量化这种享受可能并不公平,因为我喜欢每一部电影的原因都不尽相同。由于我很少去电影院看电影,我在飞机上度过的时间贡献了我电影消费的很大一部分。《蜘蛛侠:平行宇宙》是我 2019 在飞机上看的影片里最好的一部。在圣诞夜,我没有延续大学期间的传统——看《龙与虎》——而是重温了一部我在数年前的一次飞行中看的电影,《歪小子斯科特》。这部电影的确像我记忆中的那样怪趣。

作为一个直到 2018 年都住在不会下雪的地方的人,雪对我来说是一个如此陌生的概念,以至于我会把任何有下雪场景的电影都视为圣诞节电影。即使在 2018 年年中搬到一个下雪的城市之后,我仍然没有看到过那种虽然俗套、但蓬松得似乎带有温度的圣诞雪:我所住的地方只有堆积在路边的脏水和脏冰的混合物(而且它们总能找到办法进入你的鞋子)。这更能让我想到鱼市而非圣诞节。我敢打赌,电影中所有的积雪场景都只是道具,就像登月照片一样。嗯,肯定是这样。

在 2018 年,我设置了一个 Mastodon 实例,此后我删除了自己的 Twitter 帐户,但是我并不经常使用 Mastodon。起初我觉得我属于不会写微型博客的类型,但是现在我开始认为是登录、编辑、加标签和翻译的认知开销导致了我不怎么热衷于更新状态。在 2019 年的最后几个月里,我一直在用 twtxt 格式发布微型博客,并积累了相当数量的博文(110 条)。当发布我脑海里的任何愚蠢的想法都只有一行命令之遥时,写微型博客还是挺让人上瘾的,并且重新访问 twtxt 文件有时还会给我带来新的日志想法。将一个类似 Twitter 的社交媒体服务分为只读(订阅源阅读器)、只写(也就是我使用 twtxt 的目的)和互动(我还没有很好的解决办法)的部分对我来说更加合适。我的 twtxt 文件今年很可能会取代页脚里的 Mastodon 链接,因为维持这个重量级网络应用的日常运行对我来说并不是件愉快的事情。

说到删除帐户,我已经将我所有的 Gmail 帐户设为自动转发到我自己架设的电子邮箱,并且我所有的设备现在都已经没有了 Gmail 和 Inbox(RIP)应用。我还没有做好完全放弃 Google 帐户的准备,但是我已经比之前更接近了:我在尝试使用除 Google Domains 以外的其他注册服务商,并使用 Youtube 内置的订阅源而非依赖订阅频道来获取更新信息。不过我成功删除了我的 Facebook 帐户。帐户清理还会继续下去。

2020 之路

由于这个办法在 2019 年效果很好,因此我将继续在博客文章和跑步里程上尝试与去年的数字保持一致。甜面包圈常常是我在 2019 年深夜里罪恶感的来源(都是 Dunkin'的错)。甜面包圈是为数不多的几种尽管会给健康带来不利影响但我仍然愿意食用的食物之一,所以我在此宣言:2020 年不会有甜面包圈!

我一直都想正式建立起一套遵循 3-2-1 原则的数据备份流程。至于要学习的新语言,我已经注意 Go 有一段时间了。随着 Go 模块的发布,这似乎是一个合适的开始时机。除此之外,还有即将到来的 C++20。

2020 年会有几种不同的 Linux 手机(Librem 5 和 PinePhone)发布。我很乐意尝试它们,以探索离开 Apple 生态系统的方法。另一方面,PineTime 可能是我已逐渐老化的 Pebble Time Round 的完美替代品。

除了技术性的之外,我已经有一段时间没有阅读任何书籍了,至少没有任何足以被称为文学作品的书籍。我想在 2020 年改变这种状况。

为天行者系列的终结以及我很好奇会被如何命名的 Z 世代之后出现的一代干杯!

一边眼睛凝视昨日

死者复苏!星系里回荡着神秘的讯号,这是听上去熟悉却又遥远的 我过去的容器维度大断层 的记录。

通向过去的链接

好吧,《天行者崛起》的玩笑就开到这里。如前所述,我的博客最初使用 WordPress,并于 2017-09-01 切换到 Hugo。确切地说,我实际上有两个 WordPress 博客:一个名为 Pandora(源自《无主之地 2》,但我敢肯定还有无数其他虚构的行星起了这个已经被用滥了的名字)并托管与 WordPress.com 上;另一个才是托管在 Bluehost 上的川陀大学图书室(源自艾萨克·阿西莫夫的“基地系列”)。前者使用英文,而后者用中文。由于我在删除之前保留了它们的存档,使用 此工具 稍下工夫就可以恢复那些旧日志。我避免遗漏任何一篇旧文,因为写博客的主要动机就只是为了能够随时看到过去的自我。重读那些日志是一种奇妙而又熟悉的经历:我可以清楚地看出我的某些部分发生了变化,而某些部分仍然是那个 shimmy1996。

处理日志的配图比较麻烦,而不幸的是,这些旧日志在插入图片上毫不吝惜:我选择了最简单的处理方式,只保留了原始图片,没有任何压缩或样式设置。我仍然需要一种更有效的方式来存储和提供这些图像。即使有 Git LFS 可用,我还是不愿意把超过 300 MB 的图片尽数添加到我的博客 Git 仓库中(因此它们目前处于无版本控制的状态)。多了这么多图片,部署 CDN 应该会大大改善访问速度。或许我也可以学学 Jupyter 笔记本的做法——将所有图像编码为 Base64——以将所有内容塞进同一个 HTML 文件里。

我博客的常客们(如果有的话)可能会注意到评论部分看起来有所不同:是的,我对理想中静态站点评论系统的搜索终于结束了(直到下次开始的时候)!我曾使用 WordPress、多说(已关停服务)、Disqus、Isso 作为评论系统,而现在取代它们的是我的 Hyperskip:从 Staticman 中汲取灵感,Hyperskip 将所有评论存储在 TOML 文件中,并使用电子邮件作为提交方法,以简化设置。我终于摆脱了数据库查询和外部脚本,并且将所有评论(包括 WordPress 时代的那些)转移到了和博客相同的 Git 仓库里进行版本控制。

另一位老朋友

新年刚开始一个星期,我已经切换了五次网站的配色,并还有一大堆其他方案堆在我的文件夹里(绝对不是因为 RGB 色值本身太过丑陋)。就像我对尝试 让所有字形用上正确的字体 感到精疲力尽时一样,我已决定从网站上删除所有的自定义颜色:不再显示语法高亮、花哨的按钮和暗色模式。

事实是,只要有可以调整的选项,我总会发现自己分心并花费太多时间担心那些最微不足道的对字体,颜色或间距的调整(只要看看我的日志中有多少是关于这个博客本身的就不难看出)。我发现唯一的解决方法是完全消除做出这些选择的机会,转而使用默认设置。这就是为什么我换掉了 Isso(我在试图使它和博客的外观保持一致上花了太多时间),并移除了日志标签和类别。

与俗语所说的完全相反,我并没有发现我对所舍弃的东西感到留恋。大部分时候,我的感受更近似与终于挣脱了那条绳子的大象的感觉,而不是失去了珍爱之物之后的后悔。我偶尔也会问自己,保留这些来自过去的牢骚和胡言乱语是否只是我尚未意识的另一条束缚我的绳子。对于这个问题,我的回答是:牛仔身边总少不了他的套索。

用 GNU sed 开天辟地

如果你熟悉中国神话或博客众,那么你说不定听说过被半开玩笑地称作“盘古之白”的排版习惯:在中文字符(但不包括标点符号)和拉丁字符或数字之间增加一定间隔。我所实行的这一规则的变体还包括在所有 HTML 元素(如链接和强调)的周围也加上间隔。

到目前为止,我一直在源文件(Markdown 或 org 格式)中手动添加空格:这无疑是实行这一规则最糟糕的方法。除了要费额外的工夫之外,这类排版规则还应该,在我看来,仅在输出/渲染时应用。更不用说手动调整我刚刚恢复的那一大堆旧日志不是什么吸引人的差事。因为不愿加载额外的 JavaScript,我转向了万能的 GNU sed。为了将盘古之白添加到 Hugo 生成的 HTML 和 XML 文件中(通常在 ./public 目录里),我使用了以下 shell 脚本:

#! /usr/bin/env sh
# For punctuation marks to be recongnized correctly.
export LC_CTYPE=en_US.UTF-8
find . -path "./public/*" \( -name "*.html" -or -name "*.xml" \) -print -exec sed \
     -e 's/\([a-zA-Z0-9]\|<\/[a-z]*>\)\([^[:punct:][:space:]a-zA-Z0-9\s]\)/\1 \2/g' \
     -e 's/\([^[:punct:][:space:][:alnum:]]\)\([a-zA-Z0-9]\|<[a-z]\)/\1 \2/g' \
     -i {} ";"

如果你想坚持履行这一 W3C 工作草案 给出的第一选择,且并不在意生成网页的大小的话,可以换用 CSS 来生成这一间隔:

find . -path "./public/*" \( -name "*.html" -or -name "*.xml" \) -print -exec sed \
     -e 's/\([a-zA-Z0-9]\|<\/[a-z]*>\)\([^[:punct:][:space:]a-zA-Z0-9\s]\)/\1<span style="margin:0.25ch;"><\/span>\2/g' \
     -e 's/\([^[:punct:][:space:]a-zA-Z0-9]\)\([a-zA-Z0-9]\|<[a-z]\)/\1<span style="margin:0.25ch;"><\/span>\2/g' \
     -i {} ";"

如果你也是盘古之白的信徒,那么在本站留下评论时请不必担心手动添加空格:由于 Hyperskip 评论会在 Hugo 构建站点时插入,它们也会被以上的脚本影响到。请尽管坐下、放松、享受这空白一片的绝景吧。

三月结束时也和狮子一样

直到几周前(在看 Level1 News 时),我才了解到这条谚语的完整版本:“三月像狮子一样来临,像羔羊一样离去。”我是从漫画《3 月的狮子》得知前半部分的,但我当时并不知道这句话是在描述三月的天气。

以上其实就是我开始写这篇日志的的全部动机,但今年的三月的确相当不寻常。由于 COVID-19,我正在家中“远离社交”,或者说是沉浸在独处的享受中。为了准备长时间在家工作(绝对是借口),我进行了一连串的电子产品升级:我购置了第二台显示器、显示器支架和更大容量的 NAS 硬盘。实际上,去年秋天以来我一直在逐步扩展我的设备库。也许我该写一篇日志来记录这些。

我开始自己做饭是三年之前,而最近两年亚马逊的 Prime Now 服务成了我赖以果腹的唯一食材来源。自己的日常起居竟然如此依赖亚马逊的事实是有点令我担忧。但是在我拥有自己的地下基地和蓝藻农场之前,我只能凑合维持这种共生(或者应该说是寄生)关系。不过,我不确定我是否真的喜欢烹饪,至少我花在烹饪上的大部分精力都在如何减少而非增加在厨房里花费的时间。幸运的是,我几乎从不厌倦吃相同的食物,所以我一直做着相同的几道菜肴,并逐步将每一道菜的准备工作优化到最简:我的早餐是酸奶和混合干果,午餐是咖喱牛肉饭,而晚餐则是煎三文鱼配米饭和炒卷心菜。

病毒的肆虐也使我不得不暂时搁置跑步计划:我平时使用的路线已经不向公众开放。所幸在开始居家远离社交之前,我已经超前完成了不少里程(比起预订计划提前了 4 周),所以我仍然有望实现 2020 年的目标。也许是由于路上的积雪,我的跑步鞋(美津浓 Wave Rider 23)磨损得比以前更快:在累积里程达到 250 英里时,我已经感觉到跑长距离时足弓不适,而这双鞋以前的版本可以一直撑到 300 英里左右。除了鞋子问题外,随着我逐步延长的跑步时间,我时有胫骨疼痛的现象,所以我正好趁这个机会休息一阵。为了最终在工作日也能跑步,我转为了晨跑派。到目前为止,尽管有个别风雪交加的日子比较难熬(但其实挺有趣的),我仍喜欢这一决定。另外,能看到更令人振奋的日出而非日落也是个优点。

在病毒爆发期间所读到的新闻经常给我带来一种不真实感:既因为实际发生的事情,也因为新闻那种刻意挑起矛盾的报导方式。好吧,公平地说,要求一个以掠夺人们注意力为食的机构以朴实、不带修饰的方式来报导新闻本身就是一种矛盾。不过话说回来,同样从当前的情况更多地感到兴奋而非不安的我或许没有资格对新闻媒体的做法挑三拣四:仅仅想到这间普通的公寓现在是我抵御尚无治疗方法的病原体的个人要塞就足以让我睡不着觉。

如果这确实是人类覆灭的开始,至少我的博客和 Emacs 配置将由于 Github 存档计划 继续存在(假设微软没有说一套作一套的话)。在那之前,请保持安全,不要随便离开自己的胶囊生活仓,并做好准备迎接我们一直苦苦等待的荧光色太空时代藻制食品吧。