作为女性主义者的男性

经常看到人说,很多男性成为(或者表现的像一个)女性主义者,是为了能够亲近某些女性,或者其它更奇怪的目的……而这样的男性,如果不能在生活中每时每刻都会出现的性别权利冲突中,时刻反省、抵制自身作为既得利益者所带来的诱惑,则终归会「穿帮」。也有更极端的说法:男性不可能成为女权主义者。(——是的,说这种话的人,似乎更喜欢用「女权」而不是「女性主义」)


我觉得男性成为(真正的,而不是为了各种目的而装成)女性主义者的问题在于:

如果一个女性,为了维护自己的利益,而成为女性主义者,这当然没有问题。而对于男性来说,这不可能。他只有怀着对「他者」的关心,高尚到了一定程度,「先天下之忧而忧」那个级别,才会因为关心女性而赞同女性主义。这样的人,无论在男性还是女性中,当然都会有,也当然值得赞美,但比例就少多了。

这里,我们姑且划分出两种女性主义者:出于「自己利益」的,和出于「关心他人」的。——我们当然可以清高地说,后者比前者更加「高级情操」;但是并没有把二者分裂的意思。成为女性主义者,并不需要这么高级。女性为了维护自己的利益而成为女权,这没有任何问题。

而且前者是可以成为后者的。很多女性,最初因为自身的遭遇,而被唤醒了性别意识,在不断的分析和共情中,越来越关心他者。见过的很多人,都是这样变得越来越赞。而男性没有了这个基础,就只能一跃直接跳到「高级」阶段。这样的人应该也会有,但数量上就完全没有可比性了。

也有可能,一名男性(或者女性),首先作为其它层面上的弱者:阶层、种族、政治……权力意识被唤醒 → 关心他者 → 支持女性主义。这也是有可能的;——但绝对不代表这个过程必然发生,厌女的反共人士多到漫山遍野。并且,这种关心他者的情操,关心的不会仅仅是女性。各种层面上的弱者,都会是关心的对象,甚至这些层面之间会发生冲突。这样的「女性主义者」不可能同时是小粉红。但这种接近于「平权」的调子,似乎也并不是如今很多人想看到的。

锁嘟机制

  1. 就像 twitter 的文章被称为「tweet」,mastodon 的文章被称为「嘟文 toot」。
  2. 虽然这篇在说 fediverse / mastodon,但目前的 twitter、sina……各种社交网络混乱的隐私设置,其实是一样的。

作为自建实例用户,每次我好奇点开一个,我还没有 follow 的用户时:

  • 在我的界面里,看不到他的历史嘟文;
  • 偶尔能看到几条,以前被我 fo 的人转发过的他的嘟文,才会被存储在我的服务器上;
  • 他可能锁嘟;
  • 他的个人页面(以及整个他的实例)可能只显示 10 条;
  • 他的个人页面(以及整个他的实例)可能根本不许访问;
  • 少数情况下,我已经被对方 block 了,但只有当我想 fo 他时,我才会从灰色的 follow 按钮上注意到这一点……

我不知道,有什么便利的流程,来判断对方属于上述哪一种/几种情况;也不知道,面对每一种情况,我

  1. 是否被允许
  2. 如何去

了解一个人。我也不知道,采取了上述每一种措施的人,是否清楚,他在

  1. 和他相同的实例
  2. 和他不同的大实例
  3. 彼此 follow,有着模糊边界的共同好友圈
  4. 其它小实例

的人的眼里,有着怎样的可访问性。他希望打造一个什么样的社交网络架构,以及他的这些选择,最终是否能够如他所愿。

这不是在指责具体的人。我知道,有很多人,对这套复杂的体系,比我更熟悉,更习惯去应对。也知道,如果我往这个方向努力,也会应对的更自如一些(但不知道会进步到什么程度)。但现实中的结局是,fediverse,就像没什么人来看的 blog 一样,渐渐被我当作一个,纯表述的平台。别人如何看到我,如何来交互,对我而言,变成了一个不清楚机制、雾里看花的过程。对这方面的期待,也就渐渐减弱了。

于是,虽然我也会去 follow 别人,去 re 去聊天去点赞。但这些行为对我都是不成体系的。很多人我不知道要不要去 follow,聊天时也不知道什么时候要用一个点赞,或者什么都不用,就可以突兀地结束话题。更不用说,在预设别人掌握了这套体系,以及预设别人预设我掌握了这套体系,的基础上,通过彼此的操作方式而不是内容,来判定对方的态度。——扯远了,这些已经和 fediverse 机制关系不大了,我在实体社交中也不会去折腾这些(而且我对实体社交的潜规则也是雾里看花,不去弄明白)。这篇只是例行吐槽网站隐私机制而已。

[php] 将多个 RSS 地址合并成一个

弄了个 php 程序,可以把自己的(or 别人的)多个 blog 的 RSS 订阅地址,合并成一个,供人订阅。例如,现在本站的几个 blog 的统一订阅地址为:

https://feed.fivest.one/

程序基于 DigitalFreelancing 的代码,略作修改,调用了 SimplePie 处理 RSS 的项目库,为每个原始的 RSS 地址生成缓存,避免了频繁读取。我修改后的版本,可以从【这里】下载。

使用说明

  • 配置支持 PHP 的网络服务器,过程略;
  • 下载源文件后,解压到新的 RSS 地址相应的文件夹里;
  • 编辑 index.php,修改如下部分:
$feedlink = "https://feed.fivest.one/"; // 这个新的 RSS 的网址
$feedtitle = "fivestone"; // RSS 名称
$feedhome = "https://fivest.one"; // 你的网站地址(在 RSS 阅读器里点击 Title 可以进入)
$feeddesc = "fivestone's posts aggregation"; // RSS 描述

$feeds = array( // 需要合并的 RSS 网址列表,以引号和逗号分隔
    'https://a.fivest.one/feed',
    'https://b.fivest.one/feed'
);

$time_zone = 'Asia/Taipei'; // RSS 使用的时区
$item_number_limit = 20; // 新的 RSS 显示的文章数上限
$creativeCommons_license = 'https://creativecommons.org/licenses/by-sa/4.0'; // 你选择的知识产权协议(可以自行修改或为空)
  • 根据你的网络服务器的权限配置方式,可能需要把 cache 文件夹设为群组或全部可写
chmod g+w cache 或者 chmod a+w cache
  • 也可以把 index.php 改名,或者复制到其它位置,分别配置,生成多个这样的聚合 RSS。注意要调整文件中的相对路径:
include_once('./simplepie/autoloader.php');

箭术或禅心 – 2

箭术或禅心 – 12、3……


弓道这种务虚的玩法,姑且不论;大多数的射箭活动,还是以追求准确性为目标的。于是,弓,从古代到现代,一方面,使用现代材料,提高装备的强度、力度、一致性;另一方面,从设计层面上,针对上一篇所说的,影响精确性的各种因素,对弓做了很多改进。虽然每一个改进,用户都有选择用或不用的自由,但现实中,通常可以把玩家归为四类,不同类别之间,在弓的改进程度上,基本是递进关系。

  • 传统弓(traditional bow):无任何附件;无法中心出箭
  • 光弓(barebow):中心出箭;没有瞄准器,没有大多数辅助配件
  • 奥运射准(olympic target bow) :多种辅助配件
  • 复合弓(compound bow):可以省力的机械装置

比复合弓更机械化的,就是弩(crossbow)和枪了……上面这些弓,在多数国家(包括中国),都可以不需证件自由购买;然而,在绝大多数国家,甚至持枪合法的国家,弩都是非法的。

注:很多赛事,把比赛用弓乃至赛事本身,叫做「反曲弓」比赛(recurve bow);但这只是为了和 「复合弓」(compound bow) 区分。反曲只是一种让弓片更有弹力的工艺。弓片是否反曲,和精确性并没有关系。虽然现代赛场上几乎所有都是反曲弓,但兼容的非反曲的弓片(longbow)也是有卖的。用非反曲的弓去参加奥运会,只要你水平够好,完全没问题。


从传统弓(traditional bow)到现代弓

虽然很多商家对「传统弓」的定义并不相同:是否木制、是否一体化、是否安装箭台……但真正最本质的,在提高精确性方面的改进,是能不能让箭,从弓的中间,正对目标射出去?传统弓的弓身,就是一根棍子,箭被棍子挡住,并不能够完全沿着弓和弦构成的平面射出。而现代弓,在弓的中心做出一个缺口(center-shot shelf),让箭可以更直接地射向目标。

在弓身上挖个槽,还足够结实。这对材料要求很高的。低档的现代弓用木头或铸铁,不能承受超过 40 磅的拉力——比赛可以,古代打仗是不够的。高档弓都是数控切割合金,或者碳纤维。——不管怎样,这个弓身挖槽的设计,直到 1940-50s 才出现,是弓箭彻底退出人类实战舞台之后,才有的事情。

现代弓在挖出来的弓窗上,又设计了各种:

  • 箭台(arrow rest)
  • 箭侧垫(pressure button)

让箭更稳定、更精确地,指向中心目标,同时减少在射出时,箭身和箭羽蹭到弓身,造成的干扰。改进到了这一步,就可以叫做光弓(barebow)了。

从光弓(barebow)到奥运会用的弓

我们在奥运赛场上,常见的弓,在光弓(barebow)的基础上,主要多了这些附件:

  • 瞄准器(sight),为目标设置一个两点一线的参照物
  • 稳定杆(stabilizer),延长力臂,从而减缓手臂的抖动
  • 信号片(clicker),提示箭已被拉到某个位置,从而保证每次拉力相同

奥运会用的这种,加了一堆配件的弓,到底怎么称呼?其实并没有一个准确的名字,大家叫的很混乱。有的叫竞技弓(competitive)或者射准弓(target),但其实光弓(barebow)也是为了竞技和射准。有的就叫做奥运弓,但其实残奥会那边,是有复合弓比赛项目的。更多时候叫做奥运反曲(Olympic recurve),同时把光弓也叫做 barebow recurve,然而之前说了,不用反曲弓参赛其实也可以……

复合弓(compound bow)

前面说的,无论传统弓(traditional)、反曲弓(recurve)、还是非反曲弓(longbow),拉弓的幅度越大,用的力量也越大。而复合弓 (compound bow) ,通过偏心滑轮的杠杆作用,把弓拉满后,只需要很少的力量,就能维持拉弓的状态。——这个特性和射箭的精确度,其实关系不大,只是因为用力少了,手抖也小了。然而,因为复合弓不再是纯「人力」,而是借助了机械结构来蓄力,于是索性在机械方面做到极致。大多数复合弓,和奥运反曲弓一样,安装了所有有助于提高精确性的配件;而且在很多方面,比反曲弓更加机械化,尽可能减少人体造成的影响。

  • 拉弓幅度:不再使用响片(clicker)提示,而是干脆预设某个距离,拉到后就不能再继续拉动,于是每次放箭的力量精确一致。
  • 瞄准:在弦上增加了窥孔(peep),从两点一线瞄准,变成三点一线。甚至使用有放大倍率的瞄准镜(scope)。
  • 撒放:手指不再碰弓弦,而是用撒放器(release)勾住弓弦,扣动扳机放箭。
  • 出现了跌落式箭台(drop-away arrow rest)的设计,放箭一瞬间箭完全悬空,和弓身零接触。

需要注意的是:

首先,这四种不同类别的弓之间,在射击的精确性方面,完全没有比较的余地。水平差不多的人,用不同类别的弓,面对同一块靶子,肯定是后者完爆前者。四种弓各有各的比赛,比赛时靶子的距离、大小,都不相同。

然后,这四种弓的分类,很大程度上,是由各自赛事的规则决定的。——理论上,对个人而言,每一种提升精确性的设计,你都可以选择用或不用,用到什么程度。你完全可以在不用瞄准器的同时,给光弓甚至传统弓,加上减少晃动的稳定杆,再使用复合弓的撒放器勾住弓弦。但现实中,你找不到能让你这样子去参加的比赛,也找不到和你类似的玩家互相交流。

在奥运会反曲弓比赛上,必须用手指勾弦,不能用复合弓的撒放器;也不能在弓弦上添加窥孔,从而三点一线地瞄准。光弓的比赛里,不能有瞄准器、稳定杆、信号片、以及任何帮助瞄准的标记;可以装减震球和调整平衡的配重,但不能太长,从而起到类似稳定杆的作用,于是要求比赛用的弓身能够穿过直径 12.2cm 的圆环……


那么,作为一名射箭爱好者,如何做出选择,自己要玩哪一种弓呢?

箭术或禅心 – 1

箭术或禅心 – 12、3……


1920s,德国哲学博士赫立格尔(Eugen Herrigel)在日本讲课期间,学习弓道,后来把他的感悟写了一本小册子《箭术与禅心》1。多年之后,这本书,作为「一位西方哲学家的禅悟」,渐渐火了起来。

Henri Cartier-Bresson 在其中亦有贡献……

在书里,作者重点描述了「禅」在撒手放箭这一瞬间的体现:并不是拉弓的人主动地把手松开,而是在进入禅意之后,让箭自己射出。

我问师父:「如果我不去放箭,箭怎么会射出去呢?」
:「是它射的。」「那一箭完全与你无关。」


在一个 现代射箭爱好者&器材党 的眼里,射箭的准确度,大概受这些因素影响:

  • 器材质量:不要松动。
  • 箭的质量(不要弯)和一致性:重量、均匀度、弹性(挠度 spine)……
  • 弓对箭的干扰:箭是否从弓的中心射出?箭羽会不会蹭到弓?
    解决方法:
    • 中心箭窗
    • 箭台(arrow rest)、箭侧垫(button)
  • 瞄准的方法:
    • 没有瞄准器时的替代参照物,或某些「直觉」瞄准法
    • 使用各种瞄准器(sight)
    • 复合弓使用窥孔(peep)更精确瞄准
  • 每次拉弓的幅度,也就是弓的拉力,是否一致?
    解决方法:
    • 更稳定的姿势
    • 弓弦和拉弦的手靠在脸的固定部位,
    • 信号片(clicker,更精确地提示箭头和弓身的相对位置)
    • 复合弓(拉到固定位置就无法再拉)
  • 手指对弦的干扰:撒放的瞬间弓弦蹭到手指
    解决方法:
    • 撒放姿势的改进
    • 使用指板(finger tab) – 似乎这只是让手指不痛,而不是降低手指触弦干扰
    • 复合弓使用撒放器(release),彻底避免手指和弦接触。
  • 人在拉弓和瞄准时的手臂晃动
    解决方法:
    • 更稳定的发力方式
    • 稳定杆(stabilizer):力臂越长,晃动越小
    • 复合弓(拉满弓时用力更少)
  • 手感 – 主要是弓的设计和调校方面
    • 弓的重心和质量分布
    • 搭箭点上下两部分的力是否均衡,几根手指之间的受力分布

在追求准确性的现代射箭运动中,同样考虑到了,放箭一瞬间手指触弦造成的干扰。很多经典射箭教材中都提到了这一点,如何避免松手时肌肉僵硬,体会在若有若无之间撒放的感觉。——在上述的诸多因素中,手指对弓弦的干扰,只占很小的一部分;而且远不是最重要的那部分。而弓道,则在基本不触及其它因素的同时,把手指撒放的因素,放大到了超级重要的位置。

btw,弓道中也有很大一部分,是关于开弓的姿势,但似乎更集中于如何更平稳、有力地把弓拉开,而并没有在动作一致(以提高准确性)上,涉及太多。

另一方面,弓道强调手指撒放,并不是为了提高准确性。——事实上,相对于其它射箭运动,弓道已经把对准确性的要求,降到了最低点。在弓道低段位的审核中,只看射箭者的姿势和气质,完全不管箭有没有射中;高段位的审核中包括了对准确度的要求,然而,并不是要求射中多少环,而是……能射到靶子。

于是,手指撒放、乃至整个弓道本身,成为了一种媒介,让人通过它来感受「禅」。在这个过程中,感受「禅」,和技术提升,甚至是互斥的。《箭术与禅心》中,作者曾通过改进技术动作,来使自己达到和禅意类似的平滑撒放。师父发现后,立刻就翻脸了……

但在对「禅」的描述中,仍然能看出结果导向的痕迹。在师父的描述中,尽管会经常说能否中靶不重要,要「无所求」;但对禅的境界的描述中,箭自己射出后,箭也会自己命中。——所以「禅」仍然是一种导致准确率的神秘技术?


D 问我:那么,体育运动中的「技近乎道」,到底是说的什么呢?

我:呃……我觉得是,肌肉动作的协调性,超过了意识的控制能力和描述能力。就像乒乓球,初学者如果一直想着「入射角等于反射角」,再考虑重力、摩擦力,如何在空间中用二维平面去冲击一维矢量……肯定打的乱七八糟。而熟悉了之后,用什么角度击球是不需要思考的,击球者也无法把他的动作解释清楚。

而如果击球者,在达到肌肉自发动作之后,在回头来品味这个动作形成的过程,在自省中,重新构建无意识动作和意识本身的连接,这也就是一种「禅」了吧?


赫立格尔的这段经历,轴心国的味道十分浓郁。查了一下,果然作者在二战开始后不久,就成为纳粹党员,并且一直试图在学术领域,用禅来阐释纳粹思想2。在书里能看出这种苗头:弓道师父让徒弟进行的,很多不明就里的强硬单调指令,我们今天看来,是很典型的规训,当时却被描述为让徒弟自行开悟禅意的必要行为……

以及,弓道在日本,直到今天,仍然是右翼的重灾区。整个弓道机构,基本是上层阶级垄断的沙龙,内部等级制度十分严厉。甚至,有学术认为,在赫立格尔的小册子之前,日本箭术和禅道之间,根本就没什么关系,一切都是轴心国商业互吹的结果……3

1. Herrigel, E., 1953. Zen in the Art of Archery. With an introduction by DT Suzuki. New York: Pantheon.
2. Scholem, G., 1961. ZEN-NAZISM. Encounter, 16(2), pp.96-96.
3. Yamada, S., 2009. Shots in the Dark: Japan, Zen, and the West (Buddhism and Modernity)..

Draw Force Curve of Some Recurve Limbs

做了一套简陋的系统,可以测量手头几副弓片的拉力曲线,再由此算出弓片的拉力升值曲线。

  • 拉力曲线(DFC,Draw Force Curve),根据每个人的实际拉距,找到对应拉距时,需要的拉力。以及拉弓过程中积蓄的能量(曲线下方的面积)。
  • 拉力升值曲线(Smoothness Graph / Weight Change / First Derivative of DFC),每个拉距时,拉到下一个英寸,所需要增加的力量。拉弓的过程中,肌肉的配合发力方式,在不断地变化。不同拉距处,力量的突然增加、减少、或者平稳,都会对发力产生影响。打猎和竞技射准,需要的弓片曲线不一样;直线发力的韩式拉弓,和曲线发力的 KSL 拉弓,需要的弓片曲线不一样。高手是要根据自己的拉距和发力方式,挑选不同弓片的。我们非土豪玩家的杂牌弓片,不能挑的那么精细,但知道自己手上弓片的发力曲线,也有助于思考和调整自己的动作。

我是用超市购物车做的测量架子……弓把拴在购物车上,利用车库两侧的墙,一侧墙上系根绳子拴住购物车,另一侧墙上系一个滑轮,手里的绳子通过滑轮,连在钩住弓弦的行李秤上。这样我就可以站在弓把旁边,一边拉动绳子,一边观察弓被拉开的距离(在箭上做了标记)。

看起来很粗糙,但由此带来的数据偏差,应该不会超过换弓把、调整 ILF 卡口、甚至换一副同款弓片,带来的数据差异。而且这类数据,重要的是看拉力的变化,对拉力本身的精度要求不高。

实际操作中,这套系统表现得很稳定。每个拉距都会测 2~3 次,取平均值,且数值波动通常不超过 0.1 磅。

这货并不是弩车……

另外,

  1. 关于同一副弓片,在不同长度的弓把上的拉力变化。网上常见的说法是:弓把每缩短一英寸,拉力增加一磅。按这个算法,弓片在 19“ 猎弓弓把上的拉力,应该比在 25” 标准竞技弓把上,多出 6 磅。但从下面的数据可以看出,同样的弓片在这两个弓把上的拉力差异,和 6 磅相差很多。这个差异的数值,似乎是和弓片本身的磅数成正比,同时和各人的拉距成正比。那个一寸一磅的说法,应该只是比赛常用的 30~40 磅弓片区间的近似值。具体情况,等测试更多弓片后,再来确认。
  2. 测量时,不小心把 68″ 弓用的弦,装在了 66” 的弓上,导致原本 8.75″ 的弦距(brace height)只有 7.25″。于是把装错弦的数据也拿来对比一下。发现弦过长的弓,虽然在初期每个拉距上的拉力更高(因为要拉开更多距离),但最终会被弦长更短的弓反超。

Risers: Hoyt Satori 19″, Gillo G1 25″

Unit: pounds (lb) / inches

All data are measured with TRUE draw length.

Cartel Fantom EDGE, 41″ short, marked as 66″ 20lbs

匠博火星片,Jumbo Mars, 43″ medium, marked as 68″ 26lbs

三利达圣迹X7,Sanlida Miracle X7, 41″ short, marked as 66″ 14lbs

Hoyt Dorado / Game Master II, 41″ short, marked as 60″ 45 lbs

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 自己,也能看到的?(这个有待验证 — UPDATE:不可以的,见评论区)


听起来似乎很不靠谱,但也不是不能接受。就像 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.