WordPress 使用 SQLite 数据库

之前写了一半的,如何在轻量级个人 VPS 上搭建各种服务的帖子。一时懒得去把坑填完了。但前几天突然发现自己落入了思维误区:为了配合 Mastodon 或 Pleroma,总想着如何把 WordPress 从 MySQL 迁移到 PostgreSQL。——但是,其实完全可以用 SQLite 啊!对于偶尔才更新一篇的个人 blog 用户,把数据库放在一个 SQLite 文件里,不需要另外安装数据库服务,完全是可行的。

用 Docker 观察内存开销。对于新建的 wordpress 站点,wordpress 本身(包括 php-fpm、nginx)占用内存大约是 40-100M(使用缓存插件后会减少);MySQL 数据库占用内存 200M,随着渐渐使用,有着近千篇文章和评论的 blog 站点,MySQL 占用内存会达到 500M 甚至更多。 ——数据库的这部分内存,使用 SQLite 后,完全是可以省下的。

可以通过 SQLite Integration 插件,安装基于 SQLite 的 WordPress。Wordpress 官网的插件页面,因为作者失联而停更。但隐藏的插件下载链接,一直都还有效:

https://downloads.wordpress.org/plugin/sqlite-integration.1.8.1.zip

最新版本的 WordPress 也仍然可用。Github 上也有这个插件的分支

使用非常简单,就是把 db.php 复制到 wp-content 目录里,同时确保你的系统安装了 php-sqlite3 模块。这里有篇攻略。现有的站点,可以通过 Duplicator 之类的 wordpress 备份插件,或者 wordpress 自身的导入导出功能,进行迁移,不需要进行数据库级别的转换操作。

注意事项:

1. 最重要的,数据库的文件的存放位置,这个一定要改!默认的数据库位置是在 wp-content/database/.ht.sqlite,是会被人通过浏览器从 http://website/wp-content/database/.ht.sqlite 直接下载的!虽然插件在 database 文件里添加了 .htaccess 权限控制,但对于如今大家用的 Nginx,是默认无效的。

在 wp-config.php 里添加设置:

define('DB_DIR', '/absolute/custom/path/to/directory/for/sqlite/database/file/');
define('DB_FILE', 'custom_filename_for_sqlite_database');

可以更改数据库文件的存放位置。强烈建议把数据库文件,放到无法直接用网址从外部访问的目录(记得给那个文件夹授权可写)。

2. SQLite 不适合多线程的高并发使用。如果网站会有多个用户同时在后台编辑,那么网站不适合使用 SQLlite;如果只有一个写作者自己编辑 blog,就很合适。但要避免使用那些,在一般访客浏览网站时,也会导致对数据库进行写入的插件,如:

  • WP Statistics 这样的访客统计插件,会把来访者的每一次点击,都记录到本机数据库里。建议使用 Google Analysis 之类的外置统计软件(Google 给 wordpress 做了个官方插件 Site Kit by Google),通过在页面嵌入 js ,发送访客数据到 Google 服务器,不会写入本地数据库。
  • 官方的防垃圾评论插件 Akismet Anti-Spam,其实也是先把每条评论写入本地数据库,再判断是否垃圾的。如果被机器人大量发送垃圾评论,也会造成数据库写入的压力。建议使用 WP Captcha 之类的验证码插件(可以单独使用或配合 Akismet 一起用),把大多数垃圾评论在写入数据库之前就过滤掉。

3. 使用 WP Super Cache 插件,为网站生成缓存文件,可以极大地减少对数据库的读取操作。个人用户完全可以在插件设置里,关闭默认的 Garbage Collection 功能。


网上搜到的 WordPress + SQLite 的 docker images(12),Wordpress 和 php 的版本都有些过时了,本身也有一些小问题(如数据库文件夹的权限设置),建议修改 Dockerfile 然后自行编译。回头有时间我去改个试试。

WordPress 的 ActivityPub 插件

试用一下 WordPress 的 ActivityPub 插件(官网 / Github)。

主要功能,就是在 wordpress 上,建一个 Fediverse 账号,Mastodon / Pleroma / Misskey / Honk……的用户可以 follow 这个账号。新的 blog 文章发布时,这个账号会发一条嘟文,大家可以转发这条嘟文。followers 对这条嘟文的回复,会自动同步到 blog 文章的评论区。

就像我为这个 blog 建的 fedi 账号:@[email protected]

需要指出的是,并不存在 blog.fivest.one 这样一个 fediverse 实例。陌生人搜索这个账号,看不到任何历史嘟文;这个账号不能去 follow 别人,不能对别人说话,不能回复别人对自己嘟文的回复,也不能看到多少人转发点赞了自己的嘟文。——这些功能也许以后会有,但目前,这个插件所做的,只是在新 blog 发布的那一刻,向所有 follow 这个 id 的账号,push 一条嘟文。这条嘟文,在 blog 服务器上,并没有保存;而只存在于 follow 它的那些实例上,再被人转发到更多实例。

当 blog 的文章被删除时,这个插件也会通知所有的 followers,从他们的实例上删除对应的嘟文。但是就像我说过的,这个机制并不能把那些,被转发到其它实例的嘟文,也一起删除。所以,当你在 blog 按下发布按钮的一刹那,带着你所写的全部内容(或者摘要,可设置)的嘟文,就可能会永远飘在 fediverse 世界里,无从反悔。所以,写完这篇文章后,我还不确定自己是否会继续用这个插件……

所以我只是觉得这个插件运行的机制很有趣,向大家介绍一下而已。它仅仅是通过 ActivityPub 协议,和其它实例通信,而本身并没有创建实例。这个插件在 wordpress 的数据库里,甚至没有新增一个 table,而只是把 followers 的公钥,存到了 wp-options 里(我觉得这么折腾 options 表,有点过犹不及了……)。总而言之,这是个超级轻量化,在 wordpress 基础上,完全不产生多余开销的东西。

我之前吐槽过,目前所有的 Fediverse 引擎,都是用软件工程模块,匆匆拼出来的臃肿怪兽:开销巨大,数据结构不美观,依赖的技术模块未必有长久的生命力,安全性抗冲击性都很差……其实我很期待,一个单用户版的,完全没有 local 功能,支持 ActivityPub 协议的引擎。结构的简洁程度,和资源的开销,要比现在这些要好很多。从这个插件可见一斑(虽然这个插件和完整的个人版 fedi 实例,是完全两回事……


测试了一下。好像只有 follower 的回复(公开 or 私密)才会同步到 blog 的评论区;陌生人的不可以。但目前还没有做 follow 的审核通过机制。所以理论上是可以用这个功能发垃圾评论……

以及目前还没有让用户修改个人简介的功能,图片上那些简介,都是我在插件 templates/author-json.php 里手动改代码的。

关于 fediverse 的删除机制

在当前的很多 fediverse 服务(mastodon、pleroma…)里,当 A 站的用户 a 被另一个实例(譬如:B 站)的用户关注时,他所发的嘟文,会在 B 站的服务器上储存一个副本,B 站的用户,通过访问这个副本,来阅读这条嘟文。当原本的嘟文被删除时,A 站会通知 B 站,删除相应的副本。但这个时候,这条嘟文未必像人们期待的那样,从 fediverse 上彻底消失。

假设存在如下情况:

  • A 站的 a 用户
  • B 站的 b 用户,b 在关注 a
  • C 站的 c 用户,c 在关注 b,但 C 站没有人关注 a
  • a 发了一条公开嘟文,此时 b 可以看到这条嘟文,而 c 是看不到的。
  • b 转发了 a 的这条嘟文,此时 c 可以看到这条嘟文了。C 站的所有人,在查询 a 的时候,也都可以看到 a 的这条嘟文。
  • 如果这个时候,a 再把这条嘟文删除,那么 A 站会通知 B 站这条嘟文已删,而 B 站也会把这条嘟文在 B 站的镜像删除。于是 b 就看不到这条嘟文了。

——然而,似乎并没有一个机制,去通知 C 站,这条嘟文已删?也就是说,这个时候,c 和 C 站的所有人,都仍然可以看到 a 已经删掉的这条嘟文?

如果这个时候 C 站有人再转发这条嘟文,而 B 站甚至 A 站有人关注这个人,那么,B 站和 A 站的人,就又能看到这条嘟文了?甚至连 a 自己,也能看到的?(这个有待验证)


听起来似乎很不靠谱,但也不是不能接受。就像 twitter 还没有官方 retweet 的时代,所有的转发,都是由用户手动复制一个副本。而最初的推文被删除,完全不会影响这些副本继续存在。所以这里只是提醒大家,有这么一个机制。具体的隐私控制,还要由创作者自行把握。你曾发到网上的东西,可能永远不会真正消失。

A simple design of bowstring jig (endless loop)

We know, these jigs are expensive, huge, and not easy for ordering and shipping to many places. There are some DIY solutions online. The hard part of them is, how to make a strong slot or heavy metal fixture to adjust the length smoothly, but it’s not quite necessary. Most of bowstrings are just integer number of inches, so, why not just drill integer inch holes on timber, and fix the poles on these positions?

This is my idea that just needs timber, bolts, drill, and roughly saw cut. A row of holes with 2 inches distance on the base board, and the same 2 inches distance holes on the upper board that can fix the jig in horizonal and vertical direction.

There are two types of radiuses from the string pole to the axis on the upper board. One is 3.5 inches, for any odd number inches of string length (axis distance + 7 inches), the other is 4 inches, for any even number inches of string length (axis distance + 8 inches). If you need more precise length (e.g. 66.5 inches), just make another pair of upper board with the radius of 3.75 inches ( or just twist the string…)

The base board. The shortest hole distance is 46 inches, and the longest is 62 inches. With the upper boards, the system can make bowstring from 54 to 70 inches. Of course, you can make a longer or shorter board as you need.

The upper boards need to be 3 inches wide at least because there are 2 rows of holes. The base board has just 1 row so it could be narrower. I bought a 2.4m long 90mm * 35mm timber (I’m in a metric country…) for the whole system.

I use M8 size drill and hex bolts for all the holes. M6 should be ok as well, but maybe not easy to buy long M6 bolts.

  • Four pieces of 6 inches bolts as string poles, each one needs 2 sets of nuts and rings.
  • Two pieces of 4 inches bolts as the main axis. The length depends on the thickness of the timber. Don’t be too long, so as not to interfere the string serving. One set of nuts and rings for each bolt.
  • Two pieces of 3 inches bolts to fix the upper board on horizonal or vertical direction. The length depends on the thickness of the timber as well. No nuts or rings needed.

There should be around 1/4 inch space between the upper and the base board, thicker than a set of nut and ring, so the upper board can rotate with the nut of the string poles underneath. Use a thin board or several rings.

The Bottom of the base board is not flat as well, because of the head of the axis bolts. So put the rest of the timber under it.

Enjoy.

记梦录 2021-8-29

梦里团建 party,临时想出一个有趣的游戏,每个人,从自己最初在地球上的位置开始,轮流说出一个山峰的位置和名字,从东向西不能回头,先转完一圈的人退场。

场上没有地图,但有个家伙穿了全身世界地图的上衣短裤,于是大家一边说,他的朋友(男男)就随手摸到相应的位置。

渐渐地,被摸的那个人起了反应,后来大家都注意到了,场面开始有点尴尬。最后终于我转到东十区,瞄了一眼那家伙的衣服,鸡鸡刚好在澳洲悉尼附近,已经胀的非常明显了。于是叹了口气:ok,it’s the turn to blew mountain (悉尼附近的山是 blue mountain)。他朋友立刻扑了上去……

(后来就醒了,并没有变成淫乱梦境

自制弓弦缠弦架

自己设计制作了一个,缠弓弦(endless loop)的架子。只需要简单的木工钻孔,和不必精确的锯割。

思路

这类做弓弦用的架子,正式的商品要卖 100 – 600 刀,而且体积很大,运费也很夸张。网上有一些 diy 的帖子,但难点都在于,如何做出一个平滑的卡槽,或者能紧紧卡在桌子上的金属件。——但其实不需要任意调节长度啊!常用的弓弦长度,都是英寸的整数值。只需要在木头上的适当位置打孔,然后把缠弦架固定就可以了。

在底板上,钻一排间距 2 英寸的孔,在缠弦板中轴的竖直和水平方向,也钻出距离 2 英寸的孔,无论缠弦板竖直还是水平放置,都可以把螺栓插进旁边的孔里,防止架子转动。

工具和材料

  • 电钻,木工钻头。——钻孔和螺栓,我用的都是 M8 大小。其实 M6 也足够结实了,但 M6 的长螺栓不容易买。
  • 电锯或手锯。长度不需要很精确,随便锯就可以了。
  • 木材。我买的是一根 90mm * 35mm * 2.4m 的木料,足够用了。缠弦板需要打两排孔,所以宽度要超过 3 英寸。底板只需要打一排孔,还可以更窄一些。木材用其它厚度也可以,但中轴和插销的螺栓长度也要相应调整。
  • 螺栓
    • 缠弦杆,4 根 150mm 的 M8 螺栓,每根配两套螺母和垫圈。要上半截不带螺纹的那种,用来缠弓弦。
    • 中轴,2 根 90mm 的 M8 螺栓,每根配一套螺母和垫圈,用蝴蝶螺母更方便(我封城没买到)。
    • 插销,2根 60mm 的 M8 螺栓,不需要螺母和垫圈。
  • 垫板。底板和缠弦板之间,要垫出 1cm 的空隙,给缠弦杆底部的螺栓,留出可以转动的空间。用木板、垫圈、或者木材的下脚料都可以,但太厚的话,需要调整中轴螺栓的长度。

钻孔图纸

底板:长度 > 64 英寸 / 162cm,宽度 > 3 英寸 / 7cm,厚度 > 1 英寸 / 2.5cm。最近孔距 46 英寸,最远孔距 62 英寸,这样可以做出 54 – 70 英寸的弓弦,适用于 56 – 72 英寸的各种弓。

缠弦板:长度 > 9.5 英寸 / 24cm,宽度 > 3.5 英寸 / 9cm,厚度 > 1 英寸 / 2.5cm

缠弦板上的两排孔,对应着缠弦杆到中轴的,两种不同间距:3.5 英寸、4 英寸。

对于奇数长度值的弓弦,使用 3.5 英寸的孔,弦长 = 中轴距离 + 7 英寸。
对于偶数长度值的弓弦,使用 4 英寸的孔,弦长 = 中轴距离 + 8 英寸。

如果需要更精确的弓弦长度(如 66.5 英寸),可以再做一对缠弦板,把孔距设在类似 3.75 英寸的距离。

使用

  • 怎么做弓弦,就不用我说了。自己去搜教程。
  • 因为底板的下面,会露出中轴螺栓,所以底板并不是平的。使用时,用木材的下脚料垫高一下。
  • 中轴尽量拧紧一些。不然弓弦绷的太紧,可能会把缠弦板扯的前后倾斜。也可以把中间的垫板,做的更长一些,但不要妨碍缠弦杆转动。

沈大成

我还没有读过沈大成(徐晓倩)的书,只是听说过这个女性作家,口碑据说满灵的。因为更熟悉葛宇路,于是听了《随机波动》播客里,沈大成和葛宇路对话的那一期节目(2020.10.12)。葛宇路的观点,基本是我的同温层,表述不同而已。但沈大成真的让我惊讶。

作为一边在上海正式工作二十多年,一边写作,有着足够思考深度的作家,她的生活态度,和对很多话题的回答,我并不同意,——然而完全不是那种,我听腻了的,土鳖式的答案,也不像是精心给自己安置的骑墙态度。她也明白自己被这样的生活方式所规训,却安于这种规训,无意反抗,采访中的语气,一直非常的温柔,平和。在这样的人设下,多年酝酿出的思考回路,很多看法,是我完全预料不到的。虽然听过之后,我仍然不认同,但我觉得很有必要记录下来,是非常有启发性的思考方向。

根据音频,整理了一些我觉得有启发的部分。未必是原话。写完这篇去找她的书看。


问:如果你所在的城市停电一个晚上,你会做什么?

沈:我应该会感到害怕,在家里锁好门窗,列张清单,应付下一次大停电。大停电很可怕的,是人类文明的大倒退,无法触发我浪漫的联想。

问:如果你能改变所在城市的一个设置,你要改变什么?

沈:我写过,小说里每一年你都会收到市政府的信,把你安排到另一个工作去。这样大家能更了解社会。

问:在世界末日,你有什么最后的愿望?

沈:不要挨太多痛苦。我书里写过世界末日有两种人,一种希望能晚几个小时最后死,另一种希望快点死。我希望快一点。

问:你们在创作之外,都还有一份用来谋生的工作。这份工作对你们意味着什么?

沈:我从 2000 年开始,已经工作了好多年,这已经是我的生活方式了。很难想象不去上班是什么样。每天早上上班,就像是看镜子,确认一下,自己是不是还是和昨天差不多的一个人。——上班就是在确认自己一切如常。疫情不能上班,把生活都打乱了。以为能多做很多事,其实并没有。

问:工作和创作之间的关系?

沈:工作就像是吃饭,写作像在做运动。光运动不吃饭,会死掉;光吃饭不运动,就变的痴肥。

问:职场的工作经历,有助于在小说里描写职场?

沈:我是写作后,接受采访,才开始想自己的身份定位,想我不是学院派,其实就是一个在城市按劳取酬的职员,小职员作家。就很习惯以一个小职员的眼光去看待世界,区分利益。什么好,什么不好,什么安全,什么不安全。
我第一份工作是广告公司,会拜访客户,对其它各种工作环境也有印象。于是写作时,就想写一个工作中的人。

问:近年国内也开始关于工作压力的讨论,你怎么看待社畜的日常?

沈:我刚上班的时代,所有人有一条很清晰的路线,努力工作,升职加薪,就会有成就感。但现在环境变了,很多人朝不保夕,再对他们说努力工作,就很残忍了。对现在的社畜,年轻孩子们,我就说,你试试看,未必要100%努力,保留一些灵活性。但如果是做真正喜欢的工作,就要努力。至于努力的回报,也不能不去计较,但你可以把它放到很低的程度去考虑

问:谈到大卫格雷伯的《狗屎工作》,即使是有创造性的工作,其中也免不了狗屎的成分,你们的创作中,有没有觉得很狗屎的部分?

沈:我可能已经被上班这件事规训……驯服了。我认可工作中会有狗屎的部位,就像一个人长大后,身体里就是会出现各种废物:息肉、结痂……但也不用去特别处理它。这也是合理的,社会和公司也不会很干净,会容许一部分狗屎的存在。
我当初上班时,并没有想要挑战系统的想法。我从来没有说过工作是狗屎。哪怕不愉快的时候,我站在厕所里想过,我自己变成大便就好了,就可以从下水道离开公司。——上班族心里有一部分是很卑微啦,他不会指责公司。
你(葛宇路)之前说的,一个做的很精致但实际没人用的 excel 报表,我觉得还是要做的,但未必要做的特别精致。

问:关于职业身份覆盖了自我,你们有没有这种感觉,除了自己的作家身份,感觉到自己还是谁,是其他什么?

沈:我是非常赞成,人要有一个职业身份的。职业身份不是你个人创造的,是你这个职业的所有同业前辈后辈一起创造的。它已经比较像是一个商场里的成品了。所以在社会上获得一个职业身份不难,你只要把这个身份穿上去就好了。然后你脱下来,发现:竟然我没有别的身份了。我觉得这是不能怪任何人的,这很正常,那你就把这个身份继续穿上去好了。这个职业身份,就有点像螃蟹龙虾的外骨骼,帮你抵挡很多压力伤害。它是对你有用的,你就戴着好了。人穿上一个身份,维护它,已经不容易了;能维护两三个身份:妻子、家庭……就更难了。所以哪怕只有一个身份,也是要赞美表扬的,活下来都不容易。

问:有一种说法,现在跨越阶级的爱情越来越难存在了。你觉得呢?

沈:我们要问一下自己,自己有没有多样化的、跨阶层的魅力?是不是具备跨阶级的审美?我觉得这种跨阶层的魅力和审美,存在于艺术、音乐、自然中。这些可以寄托我们的情感,心灵相通。如果社会中足够多跨阶层的审美,那么就不容易被经济阶层阻挡;如果只有经济主导,那么确实不容易和不同的人在一起。

问:生活在中国今天的大都市,是什么样的体验,这种体验是愉快的吗?有一些不愉快的地方,会激发你们创作冲动吗?

沈:我一直生活在上海,但我在上海占有的东西很少的。固定的几个地方、朋友,甚至想不出到哪里能做今天的采访……对这个城市来说,是很渺小的一个存在。但也不太困惑。所谓的困惑,就是一直去主动地去询问一些没有答案的问题。我已经不会这样想问题了。不会问,我为什么占有这么少;我只会直接肯定说,对的,我就是占有这么少。但我也心甘愿意这样,因为你占有一个东西,就还要管理它,也是很烦的。不愉快的也有啦,譬如我很讨厌马路上随便乱停的共享单车。这种小事情还是很烦人。但我也觉得这样已经足够幸运了,享受到了很多,因为我们随随便便就能在网上,看到很多不幸的人的例子,相比他们已经很幸福了。所以就是有少许的不适,也不困惑。

问:葛宇路一直在关心,人和一个庞大系统之间的关系。沈大成说她写作不是为了反对生活中不好的事情,而是想这个事情如果跟现实有一点偏差的情况下,会发生什么。通过文学来改变现实中的一个参数,让荒诞性或者潜在的运作方式显现出来。你们怎样看待彼此创作的逻辑,以及你们双方作品里,人和这种庞大系统之间的关系是什么?

沈:我之前认为葛宇路是在挑衅、冒犯既有的社会秩序,但今天谈话后,我觉得他也在嘲笑这个秩序。我听杨振宁说,物理就是把复杂世界浓缩在简单的方程中;写作正相反,把简单的事情复杂化。而葛宇路(的艺术),是把不存在的东西做出来……反物理,把简单的东西极其复杂化,无中生有。

问:以前看你的书,觉得特别犀利,但今天的谈话,感觉是一个卑微平和的人。读者能从你的书里读出非常强的批判性,你怎么看?读者和你的视角是完全不同的?

沈:很多人都希望,小说是能够抨击某一个东西的。可是,我写的时候,不是主观要批评什么东西,我只是把生活中发现的一些有趣的细节拿出来。如果显示出了批判性,说明这些细节自带批判性。这不干我的事。我比较期待大家用中性的目光来看。我看自己、看大家,都觉得挺可怜,所以并不想伤害普通的人。如果我们要对抗权力,好像是应该对抗;但普通人的缺点、偏差,就只是把它描述出来而已,不是批评它。

最后,沈:常年累月做一个小职员,不知不觉成为了所谓的作家以后,还是有一些小职员的信条。我觉得小职员的信条人格包括这些:尊重规则,实在地考虑问题解决问题,察言观色,保持卑微和合作的态度,和别人谈论自己的时候,不要美化自己,不要用大的词来形容自己,不能滔滔不绝引用大作家的话,因为大家的出身来源不同,配不上的,要说自己相契的东西。这就是我总结出来的,小职员作家的信条。

女司机

拖了好几年,冒着各种被骂的风险,终于写了这一篇。

首先,本人旗帜鲜明地反对嘲讽女司机的行为,认为这种行为非常土鳖,非常歧视,并为自己几十年前无知时也偶尔做过的嘲讽行为表示忏悔。无论是嘲讽女司机的行为,还是「女司机不行」这件事本身(我不认识这是生物上的事实,但在某些文化区域,可能确实存在这种现象),都是长期性别权力不平等造成的后果。我认识很多乐于也擅于飙车的女性朋友,并且真心希望这样的妹子越多越好。

然而,我并不认可,很多人为女司机辩护的方式。他们并不是诉说「嘲讽是不对的」;而是试图证明「男司机更不行」。可能男司机确实更差劲,但是

  • 因为男司机更差,所以不应该嘲讽女司机。这并不是很恰当的思路。
  • 大多数关于「男司机更不行」的阐述,并没有说到点子上。

于是,总给人一种「为了反对而硬找理由」的感觉。


关于「男司机更不行」的阐述,大概有两种方式

  1. 列举统计数据,说明男司机的事故率高于女司机;
  2. 转发男司机肇事的报道和视频,像嘲讽女司机那样嘲讽男司机。

关于第一种方式,用交通局的官方统计数据,说明:

女司机造成的事故数量 < 男司机造成的事故数量

或者,更「科学」一点:

(女司机事故数量 ÷ 女司机数量) < (男司机事故数量 ÷ 男司机数量)

这个数据在绝大多数地区,应该都是正确的。然而,有一个很明显的问题:持有合法驾照的人数性别比例,并不等同于经常开车的人数性别比例,更不等同于总的驾驶时间的性别比例。有多少人拿了驾照但很少开车?这个数据很难准确统计出。但根据(不靠谱的)猜测,男性的人均实际开车时间,应该会更高一些。如果比较

(女司机事故数量 ÷ 女司机总驾驶时长) vs (男司机事故数量 ÷ 男司机总驾驶时长)

那么结果很可能会不一样。

关于第二种方式,转发男司机的事故视频。——其实我很爱看的,任何愚蠢导致的事故,不论性别,我都很爱看的。尤其是现在的新闻报道,确实在性别上有严重歧视:报道经常说,出事的是「一名女司机」,而对于男司机发生的事故,则只是说「一名司机」。大家多 po 一些男司机的事故,指明是「男司机」并加以嘲讽,确实是很公平的事。

问题在于,这些用来嘲讽男司机的事故案例,和嘲讽女司机时的例子,并不是同样的类型。

转发的男司机事故,大多是超速、酒驾、疲劳、玩手机……而造成的惨痛事故。这些司机本来有能力把车开好(——技术上「有能力」;当然了,安全驾驶才叫做真的「有能力」啊),却各种无视规则而作死,最终对社会和他人造成危险。

而嘲讽女司机的视频,更偏向于:在路边很久停不进车位、撞翻停车场的收费杆、前进后退分不清撞进路边店里……她们在那一刻是清醒的,没有任何触犯交规的意图,努力要把车开好,却最终失败。

无疑前者才是真的更危险,也是各种事故的绝对主要原因。然而,惯例上对女性司机的嘲讽,并不是指她们无视规则而造成危险,而是她们操纵机械时努力却显得笨拙。所以,人们列举出来的,男司机危险驾驶的事故,并不能够很好地反驳那些对女司机的嘲笑。


难道不是违规作死才更危险,更应该被谴责吗?

是的,没问题。这句话你指着任何一个男的鼻子质问,他都无法反驳。然而,这更像是一种政治正确意义上的认同,而不一定是每个人都必须放在心中最高优先级的行事准则。人可能因为侥幸心理而违规;可能因为挑战规则而获得心理以及群体中的荣耀;甚至,从人类学意义上讲,人类有没有一个普世准则?人是否应该以维护自己、他人、全人类……的生命为最高目标?都不一定啊。

虽然我并不会做出酒驾超速之类的愚蠢行为,但必须承认,我在日常生活中,会主动警省自己,不应该让「惜命」过于影响自己的行为选择。所以,当女权主义者指责男司机更危险时,我第一时间意识到,大家戳的点,好像并不一致。我开始有意识地,开车时观察周围的车辆。一些车本身并没有违反任何规则,却因为种种「笨拙」行为:绿灯后启动不及时、变线时不果断、驾驶速度过慢……总之,影响了我预想中,大家都「正常」驾驶时的那种流畅度。这样的车主,确实明显超过半数是女性。(——我知道这种观察存在主观误差:抱着偏见去观察时,那些女性车主因为符合了观察者的性别期望,从而印象更深。我努力地让自己不受这种误差影响。)当然了,那些变道过于频繁撒欢,超速甚至从逆行道超车,一看就是作死的,几乎100%是男性。


然而,女性真的操纵机械更笨拙么?

当然不。这一点我绝对不同意。哪怕男女有什么生理上的差别,也完全不至于在开车这种破事儿上显现出来。如果在某些地域,能够统计出,女性确实普遍开车更笨,那也是长期文化上的性别压迫所导致:更少的练习机会、文化语境下的不自信、把不擅机械的刻板印象扭曲为自我认同……

那些嘲笑女司机的习俗,和相关的视频,往往来自于性别权利较差的地区:东亚、南亚、中亚、西亚……而在发达国家,虽然可能同样存在,女司机相对更笨,男司机更彪(我前面说的个人驾驶印象,就是在发达国家得出的),但这种歧视要少很多。也许确实和人数比例有关,这边开车很飒的女性大有人在。然而,女性通过表现得很 man,来获得平等和尊重,这仍然是一种性别压迫。

  • 人类应该更崇尚稳定和安全,还是更崇尚那种无所谓冒险的「男性气质 masculinity」?
  • 或者说,为什么要把冒险定义成「男性」气质?
  • 人们在嘲笑女司机笨拙时,是否在用「男性气质」来压迫女性?当然是。

这些都是未必有结论,但值得深入思考的。我写这些,也是希望大家能跳出那些,为女司机辩护时,过于粗糙的逻辑,多想一些。

Nomadland – 1

我是在把 van 装修好的最后一天,才顺便看了《无依之地 Nomadland》。看完后第一反应:好羡慕女主角 Frances McDormand 身高只有一米六五啊,van 的内部宽度是 1643mm,身子歪一歪,就能横着躺下了,可以有一堆空间来放家具(甚至马桶…);我只能竖着搭个一米八的平台,剩下半米的空间,什么也放不下了……

电影给我的感受,和预想的差不多:尽管导演把房车生活拍的很文艺,电影最后,女主角也更向往这种生活,而不愿再回归到「正常」的生活方式;但电影里的几乎每一个人,都是因为各种原因,而被迫地开始房车生活的。经济、失业、拆迁、养老、对逝去亲人的怀念……于是,房车生活,被描述为一种,当「正常」生活发生问题时的应对方案。尽管房车里的人类,面对房子里的人类,能够熟练地用一种「你们这种房产销售口吻才是忽悠人的资本主义糟粕」的句式去反驳;然而,单纯只是因为反感现代化资本主义模式,而选择住进房车的人,电影里一个也没有。

还有一个群体,也没有在电影里出现:仅仅是因为酷,或者方便户外生活而住房车的 dirtbags。这样的原因或许「肤浅」,但似乎在房车群体里的比例也不小。就像影片中坐在车边躺椅上喝啤酒的几个大叔,电影并没有叙述他们为什么住房车。或许是因为会冲淡影片的氛围吧,——从这一点来说,影片确实有对人群进行筛选,以营造某种氛围。

从人类学的视角,每每看到和主流不一样的生活方式,首先都会忍不住去想:所谓的主流生活,就一定是「正常」甚至「正确」的么?会不会存在某个文化模式,所有人都住在不固定的房车里,才是「正常」的?——吉普赛人(罗姆人 Roma)并不是一个好例子,罗姆人的流浪其实也是被迫造成的,而且把罗姆人「流浪」的行为固化甚至浪漫化,本身也是在把他们异化到社会边缘的过程。

或者说,对于个体而言,如果他在设计自身生活方式时,能够不受「一定要有固定房间」的观点的束缚,那么,在他结合自身的各种资源和需求,而做出的理性规划中,是会有一定的概率,出现这种住在车里的方案的吧?

后来,看到几个人类学的学生聊这部电影。心想,大概能从中找到某种共鸣吧。但大家讨论的方向,是批判电影用浪漫化的处理,淡化了社会问题。于是就很失望,甚至比电影本身还要失望。

羔羊

《沉默的羔羊》里,最心动的,还是关于羔羊的意象。孤单的人在沉重的环境下,救起一只羔羊,奋力奔跑。仿佛这样子就能得到自由,仿佛这样子得到的自由就不会孤单,仿佛羔羊和她能一同幸福,羔羊也会懂她。对世界的反抗、自我救赎、对他者的关怀,就这样交织在一只羔羊上。但最后羔羊还是离开了,被动或主动地融入那个磨盘。仍然只留下自己,或者浑浑噩噩,或者心里还期望有下一只羔羊,或者变成食人魔杀出去。都可以啊。

原著小说里 Clarice 听到羔羊的尖叫,但她从农场带走的,是一匹瞎了要宰掉的马,最后马还和她被一起送到孤儿院里,陪小朋友们玩到老死。大概是看电影时先入为主吧,电影剧本里把马和羔羊的角色合并,感觉这样处理更好一些。

Hannibal Lecter: After your father's murder, you were orphaned. You were ten years old. You went to live with cousins on a sheep and horse ranch in Montana. And…?
Clarice Starling: [tears begin forming in her eyes]  And one morning, I just ran away.
Hannibal Lecter: No "just", Clarice. What set you off? You started at what time?
……
Hannibal Lecter: And what did you see, Clarice? What did you see?
Clarice Starling: Lambs. The lambs were screaming.
Hannibal Lecter: They were slaughtering the spring lambs?
Clarice Starling: And they were screaming.
Hannibal Lecter: And you ran away?
Clarice Starling: No. First I tried to free them. I… I opened the gate to their pen, but they wouldn't run. They just stood there, confused. They wouldn't run.
Hannibal Lecter: But you could and you did, didn't you?
Clarice Starling: Yes. I took one lamb, and I ran away as fast as I could.
Hannibal Lecter: Where were you going, Clarice?
Clarice Starling: I don't know. I didn't have any food, any water and it was very cold, very cold. I thought, I thought if I could save just one, but… he was so heavy. So heavy. I didn't get more than a few miles when the sheriff's car picked me up. The rancher was so angry he sent me to live at the Lutheran orphanage in Bozeman. I never saw the ranch again.
Hannibal Lecter: What became of your lamb, Clarice?
Clarice Starling: They killed him.