为 Hugo 静态网站添加全文检索功能

Hugo 是一种使用 Go 语言编写的静态网站构建工具。在其官网文章《Search for your Hugo Website》中,介绍几种为静态网站添加全文检索功能的方法。本文采用 Pagefind 为纯静态网站实现全文检索功能。

Pagefind 是一个独立的命令行工具,可以通过 npm install pagefind 来安装。其原理是:运行 Pagefind 命令,扫描所有静态网页并生成索引;用户搜索时,通过网页中内嵌的 JavaScript 脚本来访问预先生成的索引,从而实现静态全文检索。

……

隐藏 Mastodon 站点信息和用户嘟文列表

Mastodon 实例默认会在网页版中显示站点的用户数量和嘟文数量。此外,用户主页上会显示所有公开的嘟文。但是对于自建实例,有时候你并不想让别人可以通过网页来访问这些信息和数据。本文以 Mastodon v3.1.3 为例,通过修改代码来实现隐藏目的。本文提供的方法未在其他版本上验证,可能会不兼容。

……

佚名创作者许可

很多人希望自己发布在个人社交网络空间或者其他小圈子的内容不要被署名转发至他处。换句话说,作者不介意别人转发、修改或再次创作自己的作品,但是不希望再次发布的时候携带原作者的信息以及原始内容的出处,比如用户不希望自己发表的内容被别人以完整截图的形式转发。因此,我模仿 BSD License 的内容,起草了一份「佚名创作者许可 v1.0」,简称 AC 许可,全文如下:

……

JavaScript 的原型继承
一张经常被使用的关系图

一张经常被使用的关系图

JavaScript 中的每个对象都有一个 [[Prototype]] 的内部属性,该属性指向的对象就是当前对象的原型。每个原型对象也有自己的原型,依次向上遍历形成原型链。当我们访问一个对象的属性或者方法时,如果在当前对象中没有找到该属性或者方法,会通过原型链依次从原型对象中查找,从而实现对象继承的功能。我们可以通过 __proto__ 属性或者 Object.getPrototypeOf() / Object.setPrototypeOf()方法来访问对象的原型:

……

网络乌合之众

起因是某天在网上看到如下视频:

视频下面的评论自然是一边倒地谴责打人的男孩和教唆打人的家长,也有指责看客冷漠,还有人发动群众要对男孩进行网暴,甚至发出死亡威胁的。

大部分人通过这个视频,会脑补出一部「野蛮家长霸凌孤儿寡母,冷漠看客袖手旁观」的苦情剧。然后键盘看客们按耐不住的「正义感」就喷薄而出,大有致「施暴者」于死地而后快的势头。但是只要认真看完视频可以发现,那个所谓的「施暴者」男孩并不太会打架,甚至动作有些胆怯,再结合视频开头男孩的父亲拉开男孩衣领,对周围人说的那句「都给我们抓破了」,我们还能脑补出另外一个故事:打人的男孩之前被女人怀里的那个孩子欺负了,他的父亲和女人理论,女人非但不道歉,还说:「小孩子打架又没啥关系」之类的话激怒了男孩的父亲。气急败坏的父亲心里肯定想:「你不是小孩子打架没关系么,那我就让我家孩子揍你家娃」,于是就发生了视频中的那一幕。

……

Fournoas 分享《贾樟柯:在北美遭遇的年轻爱国者,把我惊成了傻子!》:

这不是爱国主义。它们在乎仅仅是自己在洋大人跟前的面子,为了自己的面子,它们可以完全不在乎自己同胞的死活。它们打心底里自卑,比任何人都更加看不起自己的国家,所以才会表现出这种近乎病态的自尊。

这叫「爱国恐怖主义」!

这次大会安排给我的翻译是一个原籍天津的女孩。她八岁出国在加拿大长大。翻译的中文口语非常熟练,只是我从小被学校训练,习惯用书面语演讲,这给她添了些麻烦。当我谈到“没有细节的历史是抽象的”时,她一时找不到恰当的措辞就翻译成了“历史是模糊的”。
这时候,戏剧性的一刻发生了——台下一位年龄不超过二十五岁的中国女生,突然站起来打断我的发言,高声说道:“翻译在篡改导演的讲话!”
剧场瞬间安静下来,人们被这一幕搞懵了,都愣在那里。那位中国女生突然用英文讲起来,然后又把自己的话翻译成中文,她说:导演说历史是抽象的,而翻译却故意翻译成历史是模糊的。让西方观众以为中国不重视历史,什么都是模糊的,这是别有用心地抹黑中国!
我愣在那里,一下子没想明白“抽象”和“模糊”的区别,因为同时我在想另一个问题,一个翻译上的错误,是不是有必要上纲上线说成故意抹黑中国。
我一时想不明白,好在主持人换了话题问我,我开始继续介绍电影。过了一会,当我从舞台上走下来的时候,这位女生突然拉住我激动地说:你的翻译是不是台湾人,看样子应该是台湾人,她在故意歪曲你的讲话,她在抹黑中国,她应该是“台独分子”。
我说:不,她是天津人。
她愣了一下突然跑到旁边的新华社记者那里,面对摄影机说:刚才那个翻译歪曲导演的讲话,她在西方人面前讲中国人不尊敬历史,中国的历史是模糊的,你们一定要把这个事情揭露出来。
我像局外人一样,站在一边看着这位女生。
她将个人、政府、国家概念模糊在了一起,为了虚无的面子,可以无视一切,这就是她的“爱国主义”吗?
她的低龄也让我吃惊,是什么造就了一个生活在北美的中国女孩如此激烈的国家主义信仰,和如此脆弱的国家信心?
不是在北京,而是在北美,让我遭遇了年轻的“爱国者”。
……
意外的是有一位女生,二十岁左右怯生生的样子,放映后她问:
导演,我想问你一个会让你不愉快的问题,你为什么要拍这样脏兮兮的上海,拍这些有政治色彩的人,给西方人看吗?
我说:我在拍上海的某个侧面,上海除了浦东、淮海路之外,还有苏州河两岸密集的工业区,还有南市那些狭小的弄堂,生活就是这个样子,上海就是这个样子。
女生突然愤怒起来:那你有没有考虑,你的电影被外国人看到,会影响他们对上海、对中国的印象,甚至会影响外国人对中国投资的信心?
我也愤怒起来:想那么多外国人干吗?就为了那些投资,为了外国人怎么看中国,我们就忽视一种真实的存在吗?中国十三亿人口中有很多人依旧生活在贫穷的环境中,难道我们可以无视吗?
短暂的沉默后,女生对我轻蔑地一笑,说道:是啊!为了祖国的尊严,我们当然不应该描述那些人的情况。
我被她的话惊成了傻子,我突然发现了这些“爱国主义者”的逻辑。他们所谓的“爱国主义”就是基于那些虚幻的国家意识,而忽略活生生人的命运,这其实是畸形的爱国主义。
脱离人本主义的“爱国主义”是可怕的。
如果集体回避我们的社会问题,如果我们的文化没有能力反映我们生存中的真实困境,未来会怎么样呢?

单元测试中的 Dummy、Stub、Spy、Fake 和 Mock

单元测试用来验证一个单元(模块、函数或类)的工作是否正常,测试过程通常需要其他单元进行配合。这种情况下,我们引入测试替身(Test doubles)来替代测试单元的外部依赖,使得测试单元能够顺利运行。这些测试替身分为五种,分别是:

……

    Python 的 MRO 和 C3 线性化

    MRO,即 Method Resolution Order、方法解析顺序,是 Python 对象调用父类方法时的遍历顺序。由于 Python 支持多重继承,类的继承关系可视作一个有向无环图,方法解析顺序就相当于拓扑排序——将图中节点线性排列。自 Python 2.3 起,新式类通过 C3 线性化算法来计算 MRO。

    之所以被称作 C3,是因为算法符合如下三个特性(Consistent with 3 properties):

    ……

    Fournoas 说:

    使用 MT3 模型识别音频乐谱

    今年初的时候,网上有一篇标题为《谷歌推出全能扒谱 AI:只要听一遍歌曲,钢琴小提琴的乐谱全有了》的报道。其实文中提到的 MT3 项目并非是 Google 官方推出的,只是使用了 Google 的 T5X 训练框架而已。MT3 在 Google Colab 上提供了一个 Notebook,用户可以直接在线使用。

    ……