各位老友们好,我是 Chlorine。鸽了一期的周报再次回归。本期又是一篇蛮矫情且没营养的怪东西,如果吵到您的眼睛了,小氯提前跟您道个歉。红豆泥私密马赛。

本期是博客周报——Ephemeralis Weekly(浮生散记)的第七期,日期范围为公历 2024 年 9 月 23 日至 9 月 29 日。祝食用愉快。

园子装修

严格来说,园子的装修就从来没停过,就和某款开放世界游戏的每日任务一样。毕竟小氯是个喜欢好看装修的元素娘站长。

Swup 修复

这个标题不太准确,因为小氯也不知道修复了没有,只是暂时能用了,在各种情景下的鲁棒性没有经过严格测试。

就如小氯[[解决Swup导致的JavaScript加载失效问题|曾经说的]],Swup 本质是是对页面内容的部分替换,因此对于 JavaScript 这种东西的处理并不出色,需要借助比较复杂的 swup.init 或者 script plugin 来进行加载,而且还经常出一些令人像路易十六一样摸不着头脑的问题。

这次的问题依然是我们的老朋友,Twikoo。我之前采取了一个非常令人困惑的策略,就是在 js.htmlcomment.html 中放置两份 twikoo.min.js 并且都打上 data-swup-reload-script 属性。不知道为什么这个方法能工作,但是就是能用了。

但是大家用核外电子也能想到,这样显然会降低性能。于是拦不住的小氯又开始了折腾。

首先参考了 Swup 的官方文档,看到了在 Swup 对象构造时的初始化方法,遂将 Twikoo 初始化放到了其中:

function initTwikoo() {
    if (document.querySelector('#tcomment')) {
        twikoo.init({ envId: "{{ .Site.Params.Twikoo.envId }}", el: "#tcomment" });
    }
}

function init() {
    initTwikoo();
}

if (document.readyState === "complete") {
    init();
}
else {
    document.addEventListener("DOMContentLoaded", () => init());
}
swup.hooks.on('page:view', () => init());

然后自然是必遭严惩,Twikoo 居然消失掉了。经过调试,发现是……Twikoo 对象没定义?

Twikoo 对象没有定义,说明远程的 Twikoo 脚本没有加载,至少是在 init 执行之前没有加载,这是很个邪门的事情,因为我们预先已经在 js.html 引入了 Twikoo 脚本。

后面的故事极其混乱,我不知道怎么和各位老友描述。简而言之,就是我尝试了各种可能的拼接方案,甚至包括在初始化 Twikoo 之前检查 typeof twikoo === 'undefined' 如果未定义就引入这种大聪明方法。

最后,心力交瘁之下,我想到了一位大神曾经说的:

99% 的 JavaScript 问题都可以用 asyncdefer 解决。

这俩货我听过,但是由于不会前端,我不太懂这到底是什么意思。问了下 AI,得知二者都是异步加载的脚本。前者在加载后立即执行,后者则等到 HTML 完全加载后才执行。

嘶,让我思考一下。twikoo.min.jstwikoo.init 应该都是会直接或者间接操纵 DOM 元素的,尤其是后者,需要依赖于 #tcomment。而 Swup 本身也会依赖于 DOM 元素中的属性,那么我加一个 defer 试试看?

于是把代码改成:

{{/* js.html */}}
<script src="https://gcore.jsdelivr.net/gh/yoghurtlee-thu/customcdn@352853c/js/twikoo/1_6_39.min.js" defer crossorigin="anonymous"></script>

{{/* baseof.html */}}
{{ partialCached "head/js.html" . }}
<script data-swup-ignore-script defer>
    const swup = new Swup({
        plugins: [
            new SwupPreloadPlugin(),
            new SwupScriptsPlugin({ optin: true }),
            new SwupScrollPlugin({ animateScroll: true })
        ]
    });

    function initTwikoo() {
        if (document.querySelector('#tcomment')) {
            twikoo.init({ envId: "{{ .Site.Params.Twikoo.envId }}", el: "#tcomment" });
        }
    }

    function init() {
        initTwikoo();
    }

    if (document.readyState === "complete") {
        init();
    }
    else {
        document.addEventListener("DOMContentLoaded", () => init());
    }
    swup.hooks.on('page:view', () => init());
</script>

奇迹出现了:加载正常了。

当然,这种方法也有缺点,一个显著的缺点就是 comment.htmlextend-comment.html 失去了其原有的作用,变成了单纯提供 HTML 元素的静态 partial 文件,这样对用户自定义不是很友好,尤其是作为主题发布时。但是我管不了那么多了。

whisper 代码美化

这已经是我第 N 次美化 whisper 的代码了。这次简单增加了一些缓存机制,防止不停地请求 API 给人家的服务器带来太大负担;引入了原本就很顺手的 Fancybox 作为图片点击放大的工具;增加了 caption;然后又美化了各种边角细节。

代码我放在这里了,为了访问速度,国内的小伙伴请选用杜老师的 Opengist。

[!warning]
本代码并不是开箱即用的!需要进行以下配置:

  • hugo.toml 或者其他配置文件中增加对应变量的配置项(如 {{ .Site.Params.Whisper.instance }}),或者如果你不使用 Hugo,请直接替换为值并安全保存。
  • (如果你不使用 Hugo)将 Hugo 风格的 CSS / JavaScript(例如 {{ .Content | safeCSS }})导入改为你需要的格式。
  • (如果你不使用 UnoCSS)将 UnoCSS 类改为对应的普通 CSS 选择器。所幸这里面的 UnoCSS 不太多。

Twikoo 表情链接

最近发现评论区的一些表情显示不出来了,右键新标签页打开,原来是图片挂掉了,有可能是因为 Magic Twikoo 的 AliyunOSS 出问题了。

目前临时把线路切到了 Gcore jsDelivr,但是之前的链接并不会自动切换。Twikoo 的管理面板不支持修改评论,因此我需要用 MongoDB 的命令行才能修改,难绷。

以及,我有点想自己建一条线路,提供一下表情加速的功能,正好手里还有几个免费的 CDN。不知道大家怎么看?

线路切换

我的博客一直用的是 Fgaoxing 维护的 Vercel 加速解析线路,综合表现还是比较出色的。不过最近接到了杜老师的反馈,网站无法访问了。这倒是也不意外,毕竟海外的半墙不墙的服务,无法访问实在是太常见了。

目前暂时把线路切到了 Xingping 提供的加速解析,先这么用着。实在不行,我就要上 CDN 了。

不同语言的「小氯」

本来是打算单独水一篇文章的,但是真这样的话我实在是良心不安(承认吧你就是太懒了)。

事情的起因其实是我编辑我的 GitHub Profile i18n 的时候,更改了我的中文 profile。然后我在英语和西语方面遇到了一点麻烦。简单来说,我的 profile 里面有一句:

你好,我是 Chlorine,来自清华大学。你可以叫我小氯,或者这个名字的任何友好的变体。

如果翻译成「Hello, I'm Chlorine ... You can call me Chlorine」,那实在是有点某度(要么是某歌)英语翻译我北的简介的时候的风范了:

Peking University, referred to as Peking University

注:现在这个问题已经修复

那么我们需要仔细思考一下,「小氯」这个昵称的翻译。

追本溯源

我的 ID 其实是「Chlorine」,这个词本意指的就是元素周期表的第 17 号元素,没有什么萌的含义。但是由于这个 ID 的来历是一张可爱的氯元素拟人头像,因此 Chlorine 被我翻译成了小氯,听起来就萌一点了。

因此我们需要解决的问题其实是:如何在不同语言的语境下表达出一个和氯元素相关的、比较萌或者可爱的词汇,而不是如何翻译作为化学名词的氯

英语

英语的「小氯」最简单的翻译其实是不翻译,也就是 Xiaolv 或者是 Xiaolü。虽然直接用拼音显得非常狗,但是这也不失为一个好方法,毕竟中华语言博大精深,能准确翻译成英语的才是少数。

带有日语风格后缀的英语

牢日算是萌文化的发源地,因此如果引入一些日语化的后缀,那么翻译就会有味道很多。

一个比较典型的翻译是使用中文中一个萌化的变体「小氯酱」。酱(ちゃん)常用于称呼可爱的女孩子,但是并不限于此,比如お兄ちゃん(欧尼酱,也就是「哥哥」)。所以就我的理解,一般情况下不必太过担心这个称呼带有明显的性别指代(毕竟小氯只是个原子 (≧∇≦)ノ)。回到正题,「酱」在英语中一般使用后缀「chan」,因此翻译为「Chlorinechan」即可。

此外,另一个常用的后缀是「nya」,这个后缀常常用于模仿猫叫声,可以理解为「喵」。于是拼接在一起可以得到「Chlorinya」,也是不错的想法。

西班牙语

西语的情况也不算复杂。Chlorine 的西语是「Cloro」,而在西语中,后缀「ito」(阳性)和「ita」(阴性)是用于表达小、可爱含义的最常见后缀,因此可以翻译为「Clorito」或者「Clorita」。

不过此处存在一个问题,就是这两个词汇都是存在的。Clorito 的含义是「亚氯酸盐」,而 Clorita 则是「绿泥石」(一种页硅酸盐底下的矿物群)。要是这么玩,那可就一点也不可爱了。

因此我最终采取了另一个后缀,就是 in/ina。或者简单点,就写成「Clori」,这样更接近一个人名。

其他语言

由于我几乎完全不了解中文、英语和西语之外的任何语言,因此下面的(基于资料搜集的)观点可能和正确的或者被本族语者普遍接受的用法有所出入,敬请斧正。

日语

日语的氯叫作「塩素」(えんそ、enso)。如前文所述,牢日算是萌文化的发源地,因此引入一个可爱的后缀是相当自然的想法。例如,「塩素ちゃん」(えんそちゃん、Enso-chan)。

法语

法语的氯叫作「Chlore」,那么我们可以简单粗暴地将「小氯」翻译为「Petit Chlore」。或者采用常见的表示小或者可爱的后缀「-inou」,翻译为 Chlorinou。

俄语

俄语的氯叫作「хлор」(khlor)。俄语中表示亲昵的后缀常见的有「-ик」和「-ушка」等,因此可以翻译为Хлорик(Khlarik)或者Хлорушка(Khlorushka)。当然,我觉得 Хлорёнок(Khloryonok)也可以。

韩语/朝鲜语

韩语和朝鲜语在这个问题上的表现基本上一样,因此我们下面不做区分,统一称为「半岛语」。

在半岛语中,氯被称作「염소」(yeomso)。而比较亲昵的后缀的话,可以考虑「야」(-ya),这个词常用于称呼朋友或者晚辈,因此可以翻译为「염소야 」(yeomso-ya)。此外,根据 Grok-2 的建议,也可以翻译为「소염」(so-yeom)。我也不大清楚这么说可不可以。

除此之外的语言

好吧,小氯承认小氯的语言能力就到这里了 qaq

周报?

不知道大家听完这一通碎碎念,是否还记得本期的标题:Ephemeralis-Weekly(7)。

什么是周报?虽然这是个见仁见智的问题,但是有一点我觉得可以肯定:你起码得讲讲在这一周发生的事情吧?

上面讲的这些自然也是在这一周发生的事情,但是如果我把前面的这些内容放到 Ephemeralis-Weekly(8),或者是第九期、第十期或者是其他的随便哪一期里面,我相信大家并不会感觉有什么违和感。甚至如果这个周报在十年以后还存在,我把前面的内容放进去,看起来也不会有什么大的问题。

换句话说:这些内容几乎是没有时间属性的,或者说,在大部分人时间感知的层面,其并不具有明显的时间属性。

当然,我并不是说这些内容完全和时间无关。除去任何事件都有的客观的时间属性外,如果我们把足够多、时间跨度足够长的事件排列在一起,就可以看出一些时间上的变化。远了不说,如果各位能搞到我中学时期写的文章,和现在小氯的博文摆到一起,就可以非常明显地看出表达方式、语言风格的区别,甚至可以看出一些人生经历的变化。甚至我们还可以兴味使然地分门别类地分析各个时期各个种类的文章的表达区别以及其背后的成因,拿着文学史中为大家们准备的那些方法杀鸡用牛刀地看一看这个园子的气候变化。

不过,这是统计学家和文学史家们的工作了,哪有人会为了一个蛮荒之地的小岛主人去如此大费周章呢。而且就算是这样,那你看到的应该也不能算是小氯了,只能算是 E5B08FE6B0AF。至少就目前为止,人的形象是无法通过分析的手段进行感知的,不然为什么即使是当代研究鲁迅先生的大师也写不出《回忆鲁迅先生》。

扯远了,我们回来。在高中时,我就喜欢说一句话:高中的生活让人失去了时间感。因为周一到周日,都是上课和自习,或者还有考试,特殊的月末假呢,也是每个月一次。如此的循环往复,每天或者每周期的工作大体都是一样的。有人会问,那每天干的活不是不一样吗?你说得对,但是至少就我而言,现在的我完全无法分辨出做湖南四校的第 X 次联考模拟卷的那天和做东北三省四校联考的那天到底有什么不一样。

网络的发达,解构了空间上的「附近」,而对生活感知主动或者被动的放弃,解构了时间上的「最近」。所以有一句老话「日子经不起混」。混日子时,你对时间的感知实际上是原地踏步的,今天和明天、后天都一样,因此在你意识到之前,许久就已经过去了。在 Rime 中,我们只需要打出 dt 就可以方便地打出一个时间戳,但是我们的时间却变成了用毛玻璃包裹的方盒子,里面的东西似乎影影绰绰地不一样,却再也让人没有了打开的兴趣。

那么我们还剩下什么?或者提一个更严峻的问题,我们的生活何以成为生活,又何以成为自己的生活?

答案其实不难想:就是经历,我们能够感知到并且记住的经历。相对论告诉我们,任何事件都是四维时空中的一个点,它和时间本就分不开;而没有任何事件的时空,本身也没有任何存在的必要了。1

模糊的、一段时间的气氛化的感知,或者是脉冲式的、一个被我们记住的事件,共同构成了我们过去的回忆。

还是拿我的高中说吧,我虽然分不清高中的每一天,但是我能记得,我第一次考联考第一,是在高一上学期刚开学不久,大概是十月份;我第一次下决心「我要学化学」,是在高一的期中考试之后;在疫情期间,火锅吃得比较多,每天都起来做核酸检测,每天下课都会统一做锻炼,有一段时间的精神状态极差,会给不存在的人写信;第一次手术是在高二升高三的暑假;高三下学期的居家学习做了成堆成堆的卷……

所以,如果想多感知到、多记住一些东西,那么也只好让自己的生活更加鲜亮一些,以及用某种方式记录下,有哪些只发生在最近或者当下的事情,比如说,这周做了第一个 PA,学会了一种船新的算法;最近去了一个讲座,听了某某大佬讲了什么内容,本来自己也知道这个东西,但是大佬却能讲出新高度;马上要放假了,打算出去看看;第一次点了某家麻辣烫的外卖,味道做得还不错,但是包装有点差;这周不太想写东西,看了不少自己以前喜欢的电影……说到底,其实都是或大或小的经历,能帮助我们标识出,这段时间与其他的时间到底有什么不同,到底值得我们记住什么。

小氯以后写周报,也会试着改变一些,多加一些这样的内容。这样或许才更像是对自己所浪费的这一周生命的记录。

毕竟,当世界走到尽头,我们朽坏的精神剩下的,唯有时光。


  1. 广相的「事件」和我们探讨的「事件」并不完全一样,这里并不是严谨的物理学讨论。 ↩︎