A posts/inbox.gmi => posts/inbox.gmi +569 -0
@@ 0,0 1,569 @@
+# nil
+2026-03-11
+
+## Tasks
+## 分享
+## Writing Ideas
+### Fediverse 到底是什么
+
+这并不是向不知道 Fediverse 的人讲解何为 Fediverse 的文章,而是探讨 Fediverse 对我们来说到底是什么的文章。
+
+事实是,人们对 Fediverse 赋予了太多的期待,以至于 Fediverse 被承载了它本不应该承载的责任和压力。
+
+它被创造出来是为了反对大企业的数据垄断这一现象。推特被马斯克收购后,许多人开始对这个厚脸皮的资本家表示不满,并表示不希望将自己的数据交给现在的推特(我依然不愿意称它为 X;好像是我第三次这么说了)。
+
+当时不仅是 Fediverse 这一概念被创造,还有 ActivityPub 协议和 NOSTR。它们的重心都在于「去中心化」以及将数据交还给用户。但是和 Web2 的平台一样的是,它们依然是社交媒体,而不是用于沟通交流的。
+
+许多人会将 Fediverse 的概念和电子邮件相对比较,这在技术层面上来说是没错的,但是形式上是不一样的。是的,数据都属于顾客,但是电子邮件用于沟通交流,Fediverse 不过是更极客一些的社交媒体平台。它不是用于沟通的,也不会让大家讲的话更高级。
+
+说实话,现在 Fediverse 的加入门槛也没有多极客,就算不懂技术也可以使用。对于一般人而言,它真的就只是逃离大企业的 App 的一个手段。
+
+过分神话 Fediverse 的后果便是对它感到失望。它的内容有着许多纠纷,其用户质量一样也是恰不准的。
+
+在知道这一点后再去看 Fediverse,它只是一个娱乐用的平台,没有隐私困扰和算法就是了。
+
+### NeoDB 相关
+
+不知道这东西到底怎么使用。
+有时候 Spotify 的链接可以正常爬取,有时候就不行。
+
+### 玩《茂林源记》
+
+《茂林源记》,或称 Root(以下也这么称呼),是一个区域控制类桌游。虽然这么说,但它的标签还是很多的,例如德式桌游标准的得分制、应该被划分给美式桌游的阵营机制等等。我先前为这款游戏写过一些评价,本来没有打算继续去写该游戏的说明,但介于自己刚写了个扫雷的入门说明,最终还是写下了这篇文章。
+
+首先需要说明,桌游和其他电子游戏一样,是一个很大的类。休闲的桌游,如爆炸猫,跟大型的桌游,如很知名的 D&D,区别是很大很大的。在决定游玩 Root 之前,请务必考虑一下自己到底是什么桌游玩家——愿意花时间钻研吗?愿意仔细阅读说明书,且游玩期间遇到不懂的地方也会去认真查询吗?
+
+问这些问题的原因是,Root 其实卡在一个颇为尴尬的地方:它既没有大型桌游那么难懂,但入门门槛也足以劝退休闲玩家。这也是为什么我很难线下跟他人玩 Root,愿意尝试的就不多,看到说明书和规则书的还想继续玩的是少数;最麻烦的是教完一个人规则和至少一个阵营后,天也暗了,大家没有那么多空闲时间,只能等几个月再约。
+
+好啦虽然我抛出了这么多预警,对于依然想要继续学习的你们来说,Root 可能并没有那么可怕!实际上,就像我刚才说的,它无法跟更大的桌游比较。既然只需要一天就能教会一个新人,它的困难程度可想而知,并没有那么高,难的地方只是它的阵营机制。
+
+说了这么多,让我们回归正题吧,一起进入这片广大的茂林吧!
+
+### 基础规则
+
+Root 里,每个阵营的回合都结束后,一轮才算结束。也就是说,玩家甲开始回合,到玩家乙的回合结束,这算一轮。每个阵营的回合会经历三个阶段,也是三个时间段:清晨、白天和晚上。在这三个阶段里,不同阵营能够做的事情都不相同。
+
+通常而言,在设置期间,每个玩家会获得自己的阵营板、阵营所需要的所有米宝和令牌,以及 3 张牌。说到卡牌,该游戏有三个基础类型,或者说领地类型:老鼠、兔子和狐狸,他们是这个森林里的老百姓,更详细的背景设定我之后会补充。该游戏的大多数卡牌都需要锻造后才能发挥作用。在 Root 里,如果手牌超过 5 张,就必须在晚上阶段结束时丢弃直到手上只有 5 张牌。
+
+地图上的地点和路线都是固定的,不过地点的类型可以随机,不过我个人推荐在学会游玩 Root 之前,只玩它的默认地图,因为类型分布最为平均。
+
+必须要记住的是,Root 是一个区域控制游戏,「占领的领地」和地点是两个不同的概念。当你的士兵米宝和建筑物在一个地点上,数量超过其他阵营的士兵和建筑物,就算占领了该地点。当移动士兵时,出发地点和目标地点必须至少有一个在你进行移动之前、被你的阵营占领。这是 Root 在移动士兵上的基础规则。一次可以移动的士兵数量是随意的,想要移动多少就移动多少。
+
+再就是「建筑物」,查看地图时你会发现,地点上都有数个空格,这些便是放置建筑物的格子。当一个地点上没有空闲的建筑物格子,玩家们就不可以在该地点上放置更多的建筑物了。建筑物并不属于令牌的一种,令牌是圆形的,建筑物是方形的。建筑物在计算占领权会被算上,令牌则不算。
+
+战斗需要用到两个骰子,这两个骰子都只能投出 012/3 这四个点数。假设玩家甲和乙丢出了 1 和 3 这两个点数,且甲和乙在这个地点上的士兵数量分别是 2 和 3。在 Root 的战斗中,发起战斗的一方会取点数最大的那个骰子,被攻击的一方则拿点数最小的骰子——乙作为攻击方,一共有 3 个士兵,点数也是 3,这意味着他的 3 个士兵都可以各杀死一个敌人。尽管甲的士兵数量是 2,但拿到的 1 点数让他只能让 1 个士兵杀死一个敌人。结果就是,乙的 3 个士兵杀死了甲的 2 个士兵,多出了 1 次攻击,而甲的 1 个士兵杀死了乙的 1 个士兵。
+
+当地点上的士兵都死掉了,多出来的攻击会算给令牌和建筑物。它们都不具备攻击能力,所以也无法战斗。如果攻击方攻击的地点上只有对方的令牌或者建筑物,那么无论投出多少点的骰子,都会另加 1 点伤害。并且,只要有 1 个令牌或者建筑物被摧毁,攻击者都可以额外拿取 1 分。如果有多个令牌或者建筑物,那么由被攻击的一方决定哪一个应当被移除。
+
+要在 Root 里获胜,通常是靠先得到 30 分。至于如何得分,每个阵营的方式也都不一样。所以可以看出来,该游戏的绝大多内容都在阵营上,而因为阵营除了游侠这个特殊阵营外都不能重复,所以在游玩自己的阵营时,也需要提防他人的阵营得分。这也是 Root 入门时的难点:记住所有阵营的机制和得分方法。
+
+### 阵营机制说明
+
+### 猫女侯爵
+
+也有翻译称其为「猫咪贵族」。在原文中用的 marquis 其实是法语的「女侯爵」的意思,这里就保留这层意思吧,不过后面都会简称为「猫咪」就是了。
+
+猫咪们在打跑了原本统治了森林的「飞鹰王朝」后,决心一路向工业化进发——砍树盖房子!猫咪可以放置三个种类的建筑物,且加分方式是靠放置建筑物。
+
+猫咪在开局阶段里优先级最高,可以选择地图上的任意一个角落作为自己城堡的落脚点,然后可以在城堡所在的地点或者相邻的地点内免费放置一个伐木场、一个工坊,和一个招兵所。
+
+我用了「免费」这个词,为什么呢,因为是「砍树」盖房子,原先这些建筑物都需要使用「木材」才能建造。木材作为一个令牌,又该如何获取呢?答案是靠猫咪的伐木场。嗯,这下便好理解了:猫咪通过建造伐木场来获取木材,又消耗木材来建造建筑物,建造建筑物还能加分,且场上相同类型的建筑物盖得越多、 加分越多。这便是猫咪主要的玩法。
+
+猫咪的士兵足足有 25 个,到后面我介绍越来越多的阵营时,你便会发现这个数量有多么夸张。开局阶段里,猫咪需要在地图的所有地点上放置一个士兵,除了城堡斜对面的那一个角落。
+
+清晨阶段,猫咪只能做一件事,那便是在场上所有伐木场所在的地点放置一个木材令牌,相当于每个伐木场都砍到了木头。白天阶段里则分两个步骤:一是激活场上的工坊来锻造卡牌,二是按照任意顺序和组合执行最多三项操作。
+
+先说猫咪的锻造。卡牌的锻造条件都要求一个阵营的可锻造单位有足够的数量,且位于正确的地点类型。比方说有一张牌要求有两个兔子类型,那对于猫咪而言,就需要在兔子类型的地点内先建造两个工坊,才能锻造该卡牌。这些可锻造单位,一回合只能使用一次。这对猫咪来说,不是一个好兆头,因为锻造卡牌之前,猫咪需要先消耗木头和行动次数来建造建筑物。
+
+再来说猫咪的行动:战斗、行军、招募、建造建筑物、加班。
+
+其中战斗没什么好说的,剩下三个都有着猫咪自己的特色。行军是加强的移动,一次行军相当于移动两次,且移动时仍然可以随意决定要移动的士兵数量;招募会在每个招兵所所在的地点放置一个新士兵,不过该操作 每个回合只能执行一次 。
+
+建造建筑物需要单独拉出来说。一个玩家们经常忘记的猫咪规则是,想要建造建筑物的地点首先得是被猫咪占领的,且该地点需要和木材所在的地点形成一条完全被猫咪占领的路线才行。也就是说,木材必须从猫咪占领的地点,通过一系列也被猫咪占领的地点,才能抵达猫咪打算建造建筑物的已被占领地点。接着玩家需要在阵营板上选择建造哪一个建筑物、查看该建筑物如果被建造了需要消耗多少木材(每个类型的建筑物所需要的木材以及得到的分数都是独立开来的),并消耗这些木材。
+
+猫咪也可以通过消耗一张手牌里的飞鹰类型的卡牌来为自己添加一次额外的操作次数。咦,什么是飞鹰类型?这是有别于基础三类型的第四个类型,对许多阵营而言,它可以被当成是「任意一个类型」,相当特殊。
+
+至于加班,它需要你选中一个伐木场,并根据该伐木场所在的地点类型,消耗一张同类型的卡牌来获取一个木材令牌。因为飞鹰卡牌可以被视作任意一个类型,所以也可以用在这里。
+
+到晚上阶段,猫咪需要补充一张手牌。如果招兵所被建造得够多,你会根据阵营板上的卡牌图标而获取额外的手牌。
+
+最后说一下猫咪的被动技能:其他阵营不能在城堡所在的地点内放置任何令牌或者建筑物或者士兵,他们只能将士兵移动到该地点。每当任意数量的猫咪士兵从一个地点中被移除,猫咪可以选择消耗一张匹配该地点类型的卡牌,将这些被移除的士兵放置在城堡所在的地点。如果城堡被移除,它会在该局游戏内完全被移除,拿不回来。
+
+### 飞鹰王朝
+
+Eyrie 虽然是鹰巢的意思,但是「鹰巢王朝」总感觉不好听,故使用官方翻译「飞鹰王朝」。
+
+飞鹰是森林过去的霸主,被猫咪打跑后,希望通过重新占领领地,来恢复自己的尊严。不过他们也是一个强迫症种族,每日的行动必须完全遵守「法令」的顺序,否则民众会陷入混乱、推翻当下的领袖。
+
+清晨阶段按照顺序分为三个步骤:一、如果没有手牌,则抽一张牌;二、必须将手牌的一张或两张牌添加到法令区中,但只能有一张是飞鹰牌;三、如果地图上没有鸟巢建筑物,则在一个有最少士兵的空地上放置一个鸟巢和三个士兵。
+
+白天阶段按照顺序分为两个步骤:一、激活鸟巢锻造卡牌;二、必须严格从最左边的列开始,向右依次结算法令。
+
+不过在说明法令如何运作之前,我们需要先看一眼飞鹰的开局阶段。在游戏开始时,飞鹰玩家需要从四张领袖卡牌中选择一张作为初始领袖放置在阵营板上。每位领袖不仅拥有一个独特的被动技能,决定了两张初始大臣卡牌(两张固定视为飞鹰类型的卡牌)在法令区四个列中的初始位置。选定领袖后,飞鹰需要在地图上猫咪城堡斜对角的那个地点,放置一个鸟巢以及六个士兵。
+
+该阵营最为重要的机制有且只有一个:法令。飞鹰的阵营板上有一个分为四个栏位的法令区,从左到右依次为招募、移动、战斗和建造。在每一个单独的列中,如果有两张或以上的卡牌,玩家可以按任意顺序解决该列里的所有牌,但对于每一张牌,玩家都必须切实执行其所在列对应的操作。
+
+招募要求玩家在带有与卡牌类型相符、且已经建有鸟巢的地点上放置一个士兵;移动要求玩家从与卡牌类型相符的地点出发,移动至少一个士兵到其他相邻地点,前提是移动的基础条件可以被满足;战斗要求玩家在带有与卡牌类型相符的地点上,主动发起一场战斗;建造要求玩家在一个被自己占领、卡牌类型相符且当前没有鸟巢的地点上,放置一个新的鸟巢。
+
+这一机制是极其死板的。如果在解决法令的过程中,玩家因为版图局势或者自身资源限制,无法完全执行某一张卡牌对应的一项操作,飞鹰就会立即陷入动乱——当天的白天阶段会被立即强制中止。玩家会因为法令区中包含的每一张飞鹰类型的卡牌而失去 1 分,飞鹰也是唯一一个会在游戏中失去分数的阵营。随后,整个法令区除了两张初始的大臣卡牌外,所有的手牌都会被清空弃置。触发动乱的现任领袖必须下台,玩家需要从备选的领袖中挑选一位接任。新领袖的上台会改变初始卡牌所在的列数位置,玩家也必须在接下来的回合里重新构筑整个行动链条。
+
+如果飞鹰成功且完整地解决了白天的所有法令,便能顺利进入晚上阶段,这也是其核心的得分环节。飞鹰会根据地图上现存的鸟巢总数,直接获取阵营板上对应位置标明的分数。鸟巢铺设得越多,每回合自动获取的分数就越高。计分结束后,飞鹰进行手牌抽取,抽牌的具体数量同样由版图上的鸟巢数量决定。
+
+最后说一下飞鹰的被动技能。作为森林过去的领主,当一个地点上飞鹰的士兵以及建筑物的数量,和其他阵营的士兵以及建筑物的数量,相同时,默认飞鹰占领该领地。飞鹰也藐视贸易,锻造物品时会忽略列出的分数,而只获得 1 分。
+
+### 森林联盟
+
+在猫咪和飞鹰天天打架的时候,森林的老百姓坐不住了……联盟需要努力赢得森林里对现状不满的各种动物的同情,大家联合起来,将女侯爵还是王朝都赶出森林!
+
+森林联盟是一个起步极晚但爆发力极强的阵营。与其他阵营不同,联盟在开局阶段的地图上没有任何实质性的棋子,只有阵营板上的 3 个基地、10 个民意令牌以及 10 个士兵。
+
+联盟的运作高度依赖一个独立于玩家手牌的特殊卡牌区域——支持者牌堆。支持者牌堆里的卡牌面朝下放置,不计入手牌上限,只有联盟玩家可以查看,且专门用来执行联盟的核心行动。如果联盟在地图上没有建立任何基地,该牌堆的容量上限仅有 5 张,超出部分必须被直接弃置;而一旦地图上存在至少一个联盟基地,支持者牌堆的容量便没有限制。
+
+联盟拥有两个让其他阵营极为头疼的被动技能。首先是民意机制。每当其他玩家移除了地图上的民意令牌,或者将任何士兵移动到一个有民意的地点时,该玩家必须从自己的手牌中强制上交一张与该地点类型相符的卡牌,并将其加入联盟的支持者牌堆。如果该玩家手中没有对应类型的卡牌或者飞鹰卡牌,则必须向联盟玩家展示手牌自证,随后联盟会从公共牌堆顶部抽取一张牌加入支持者牌堆。
+
+另一个被动技能是「游击战」。这是整个 Root 游戏中,强度最为可怕的被动技能:在所有战斗中,只要联盟是作为防守方被攻击,那么联盟始终会拿取点数较大的骰子作为自己的命中数,而攻击方只能拿取较小的骰子。这意味着主动攻击联盟很多时候只会被联盟反杀。
+
+既然提到了骰子,我想要再深入讲解一下 Root 骰子的机制。已知每枚骰子有四个面,点数是 0123 ,因此投掷结果是由两枚骰子组成的 16 种等概率组合构成的样本空间。在这个样本空间中,取最大值的概率分布是不均匀的。两枚骰子最大值为 0 的组合仅有 $(0,0)$ 这一种,概率为 $116$ ;最大值为 $1$ 的组合有 3 种,概率为 $316$ ;最大值为 $2$ 的组合有 5 种,概率为 $516$ ;而最大值为 3 的组合最多,共有 $7$ 种,概率为 $7/16$ 。
+
+也就是说,掷出 2 点和 3 点的概率加在一起,正好是 $75%$ 。如果计算较大值的数学期望,就会是 2.125,而较小值的数学期望仅为 0.875。在基础规则下,主动进攻方有着绝对的火力优势,然而「游击战」强制反转了这一判定规则。只要森林联盟作为防守方被攻击,从概率论的角度来看,这一反转让攻击方的单次命中期望瞬间从 2.125 骤降直 0.875,而联盟的防守反击期望则从 0.875 飙升至 2.125。
+
+清晨阶段是联盟扩张与爆发的核心时间段,分为「起义」和「散播民意」两步。
+
+起义是联盟建立基地的唯一方式,玩家需要选择一个已有民意令牌且类型与阵营板上未建基地相符的地点,随后从支持者牌堆中消耗两张匹配该地点类型的卡牌。起义一旦爆发,该地点上的所有敌方棋子,包括士兵、建筑物和各种令牌,将被瞬间全部清空(联盟也会获取摧毁建筑物和令牌所得的分数)。接着,联盟会在该地点放置对应的基地,并根据目前地图上与该基地类型相符的民意令牌总数,放置等量的士兵,最后再将一名士兵放置到阵营板的教官区。
+
+执行完起义后,联盟可以进行散播民意来获取分数。玩家必须选择一个与现有民意地点相邻的无民意地点(若地图上完全没有民意,则可任选地点)。根据民意令牌轨道上标明的成本,玩家需要从支持者牌堆中消耗对应数量且与目标地点类型匹配的卡牌,将民意放置上去并立即获得轨道上显示的分数。
+
+需要注意的是戒严规则:如果目标地点内驻扎着至少三名属于同一敌方阵营的士兵,联盟在传播民意时必须额外多消耗一张匹配的支持者卡牌。
+
+白天阶段,联盟可以进行手牌和支持者牌堆的资源转化。联盟可以执行动员,将手中的任意卡牌放入支持者牌堆中。同时也可以执行训练,通过消耗手中一张与地图上已有联盟基地类型相匹配的卡牌,将一名士兵放置到教官区。必须要注意的是,联盟只有 10 个士兵,放置多少个到教官区、保留多少个士兵在地图上,是游玩联盟阵营时必须要考虑到的问题。此外,联盟的卡牌锻造也在白天阶段进行,与其他阵营依赖特定的建筑物不同,联盟是通过激活地图上对应类型的民意令牌来完成锻造的。
+
+夜晚阶段则是联盟进行常规版图互动的时刻。联盟可以根据阵营板上现有的教官数量,执行同等次数的军事行动。军事行动包含四种选项:移动士兵、发起战斗、在拥有基地的地点招募一名士兵,或是执行组织行动。组织行动允许联盟从一个没有民意的地点移除一名自己的士兵,并直接在那里放置一个民意以此获取分数,这是一种不消耗支持者卡牌来传播民意的方式。
+
+在所有军事行动结束后,联盟进行常规的抽取手牌步骤,并将超出五张上限的多余手牌弃置。每次基地被敌人摧毁时,联盟必须丢弃支持者牌堆中所有与该基地同类型的卡牌,并损失一半的教官(向上约)。
+
+### 神秘游侠
+
+在猫咪、飞鹰和联盟互相牵制的期间,森林里总有一些流浪者,想要趁机提升自己在森林中的声望——这当然也包括了恶名。与那三个势力截然不同的是,游侠在地图上只有一个棋子,那就是游侠自己。游侠并不属于士兵,因此永远无法占领任何地点,也无法阻止其他阵营占领地点,且无法被移除。但这种孤立也赋予了游侠移动时可以完全无视出发地和目的地的占领权限制。
+
+游侠的行动与生存完全依赖于他的物品系统。无论是移动、战斗、探索废墟获取新装备,还是完成任务与援助他人,都需要消耗背包或物品栏中对应的、未损坏的物品。
+
+这里需要提到 Root 的物品系统。物品可以通过锻造特定的卡牌来获取,对于不会用到物品的阵营来说,锻造出来的物品只会从公共物品区取出一个、放到一边。当公共物品区里没有物品了,那么制造物品的卡牌便无法被锻造,自然也不能用来锻造得分。
+
+而对于会使用到物品的阵营来说,物品还可以通过地图上的废墟来获取。游侠能够探索这些废墟、获取废墟内的物品,并且将废墟移除、变成一个空的建筑物格子。如果本局游戏里没有能够移除废墟格子的阵营,那么这些废墟格子会一直占着空闲的建筑物格子。
+
+对游侠来说,物品具有两个通用的属性:是否被使用,以及是否损坏。这两个属性是完全独立的。在遭遇战中,由于游侠没有士兵可供阵亡,他所拥有的未损坏物品总量便等同于他的生命值上限,而未损坏的物品「剑」的总数,等同于能够掷出的最大命中数,无论是否被使用。每当游侠受到一点伤害,他就必须将一件未损坏的物品移入损坏区。如果身上没有任何完好的物品,游侠则忽略所有剩余的伤害。
+
+处理与其他阵营的社交关系是游侠核心的战略维度。通过消耗物品并向其他玩家支付对应地点类型的卡牌,游侠可以执行「援助」行动。这不仅能从其他玩家那里换取他们锻造好的物品,还能逐步提升双方的关系轨道。当关系达到同盟状态时,游侠便赢得了该阵营的信任,不仅每次援助都能获得额外分数,还能在白天行动时直接裹挟盟友的士兵一同移动甚至发起进攻。
+
+反之,如果游侠在游戏中移除了任何一个非敌对阵营的士兵,双方的关系会立刻跌入敌对状态。虽然游侠进入有敌对士兵驻扎的地点时需要额外消耗用于移动的物品,但这开启了另一条得分途径:在游侠自己的回合内,每在战斗中移除一个敌对阵营的部件(无论士兵、建筑还是令牌),游侠都能获得 1 分。这种得分机制太可怕,以至于官方需要在比赛中特别削弱游侠,才能平衡游戏。
+
+游侠的开局阶段中,玩家需要选择一个游侠角色。不同的游侠角色开局携带的物品不同,且技能也都不一样。接着玩家需要将游侠米宝放置在森林里,注意,并不是在地图的格子内,而是其他阵营都无法进入的「森林」里。然后玩家会获取一个任务牌堆,抽取 3 张、面朝上放在阵营板的附近。任务需要游侠到达任务牌上类型相符的地点,并使用任务所需要的未使用物品,以获取奖励:得分或者抽卡。随着同类型的任务做得越来越多,得分以及抽卡的数量也会越来越多。不过在我看来,靠任务得分并不是一个很棒的选择。
+
+清晨阶段,3 个已使用的物品会变成未使用状态,且每有 1 个物品「水壶」,还可以多刷新 2 个物品。接着游侠可以无消耗地移动到相邻的地点或者森林中,无论该地点是否被敌对阵营占领。
+
+早上阶段,游侠可以按照任意顺序来使用自己的物品:
+
+* 移动:使用 1 个物品「靴子」;
+* 战斗:使用 1 个物品「剑」;
+* 探索:使用 1 个物品「火把」,探索后获得 1 分;
+* 援助:使用任意 1 个物品。就算是敌对阵营,游侠也可以援助,但是关系不会变好;
+* 任务:使用任务牌上所要求的物品;
+* 打击:使用 1 个物品「弩」,直接移动当前所在地点的士兵或者建筑物或者令牌。打击并不算战斗,但是算移除士兵或者令牌,因此不会触发游侠杀害士兵得分的机制,但是会触发联盟民意被移除的机制;
+* 制作:选中一张手牌,在类型相符的地点上使用 1 个物品「锤子」来锻造它。因为游侠只能一次出现在一个地点上,意味着所有要求多个地点类型的卡牌都无法被锻造;
+* 修复:使用 1 个物品「锤子」,将一个已损坏的物品变成未损坏的状态。不过如果该物品也出于已使用的状态,那么修复并不会让它也变成未使用的状态;
+* 特殊行动:游侠角色的技能不同,在进行的特殊行动也不同,不过使用的都是物品「火把」。例如「猎人」角色就可以一次性修复 3 个物品,代价是白天阶段会被立即结束。
+
+晚上阶段中,如果游侠处于森林,那么所有已使用或者已损坏的物品都会变成未使用或者未损坏的物品,相当变态。接着抽取卡牌,每有 1 个物品「金币」都会额外抽取 1 张。若手牌多于 5 张,则丢弃手牌直到手牌数为 5 张。最后,游侠要检查物品的容量。如果未损坏和已损坏的物品总数超过物品上限(默认 6,每有 1 个物品「背包」便多出 2),那就需要丢弃物品,直到物品数量等于物品上限。这里的「丢弃」并不代表着将物品放回公共物品区,被丢弃的物品不会再回来。
+
+### 结语
+
+本篇文章仅供参考。在实际的游玩时,我建议还是阅读官方提供的规则书,或者说 这个网站。为了减少篇幅,我没有细讲许多内容,只是将游戏的大致规则讲了一遍。
+
+Root 除了实体桌游外,还有电子版本。你可以从 Steam 上购买下载,也可以在 Google Play 或者 App Store 中购买下载。购买游戏本体是不共通的,但是购买 DLC 是可以通过 Dire Wolf 账户实现共通。
+
+又因为 Root 既有实体桌游,也有电子版本,我采取的讲述方式是同时基于了它们二者:你会发现我尽量不去介绍桌游特有的实体物件,也没有无视掉电子版本中程序已经帮助玩家处理好的地方,而是围绕着游戏机制本身进行介绍。
+
+未来我考虑继续介绍 Root 的 DLC 内的阵营,或者说阵营的进阶玩法。
+### 4 个字符为一组构成的城市
+
+
+从小时候记事起,我就有一个奇怪的习惯,那就是看到商店招牌,会自动将上面的字符以 4 个一组的形式排列起来。
+
+比方说「江南皮革厂倒闭了,老板黄鹤带着小姨子跑路了」,在我的眼里会变成:
+
+```plaintext
+江南皮革
+厂倒闭了
+,老板黄
+鹤带着小
+姨子跑路
+了
+```
+
+正好多出来 1 个字符。
+
+多出来的内容会让小时候的我感到既不开心,也不舒服。为了让自己开心起来,有时候我会强行将限制改成 3 个或者 5 个字符一组。这样做并不是特别容易,因为 4 个字符一组已经是我脑内的标准,突然换成别的总感觉怪怪的。
+
+之后我常用的伎俩便是将余数加入到下一个招牌的计算中。
+
+假设下一个招牌的内容是「我要金坷垃,非洲农业不发达,必须要有,金坷垃!」,那么排列就会加上刚才多出来的「了」:
+
+```plaintext
+了我要金
+坷垃,非
+洲农业不
+发达,必
+须要有,
+金坷垃!
+```
+
+哎,这下就可以被 4 整除了,内心一下子开心起来~
+
+通常来说,我都是在乘车期间进行这些脑内操作的,比如跟着大人们坐出租车去什么地方,或者坐在电动车上,望着远处。我自小居住在一个城市里,无论是往哪边看去,都可以看到带有招牌的店铺。坐车是无聊的,为了让自己不无聊,我自行研发了这种小游戏,好让自己在什么时候都能游玩——会这么说,是因为在我的记忆中,这种行为慢慢地也渗透到我的其他生活里:小时候翻开课本时,我会扫视一番页面上的内容,快速将里面的字符根据 4 个字符一组的方式排序。
+
+现在想来,为什么孩童时期的我要这么做呢?不知道从什么时候开始,我看商店招牌再也不会去想要将字符分成 4 个一组了,乘车时望向窗外也只会发呆。
+
+能够确认的是,它是我的强迫行为的一种。我小时候总是有一些现在看来都觉得莫名其妙的「秩序」,比方说喝粥时绝对不能在里面放任何东西。如果大人往我的碗里夹了肉或者榨菜,又或者不小心滴了点酱料进去,我会很难过,认为我的粥被玷污了、不再纯净。
+
+我已经很难记起小时生活的点点滴滴,自然也不知道那时候的我是怎么想的、经历了什么才会这么想,所以我还是不揣测自己了吧。但我可以感觉出,我是一个很轴的人,且只生活在自己的世界里:一套独属于自己的逻辑,外界对我而言并不重要,因为是它们不遵守我的规则在先。
+
+不过随着年龄的增长,经历了一个又一个事情,发现这个世界就是存在着余数、绝大多数事物都是无法被完美整除的——有些能不能被「除」都是个问题。白粥也不可避免地会沾染上其他味道,毕竟再去取一个碟子装榨菜意味着需要多洗一个餐具。
+
+现实总是塞满了需要我去重新适应的全新事物,而这些问题远比招牌上多出来的字符庞杂得多。所以那个坐在电动车后座的小孩,最好还是连同她那套规则一起,留在那条以 4 个字符一组构成的街道吧。
+
+### Bonus
+
+最近我知道了 BlogBlog 同乐会,相当于中文版的 IndieWeb Carnival。哦,你或许也不知道 IndieWeb Carnival 是什么。简单来说,它是一个每月根据主办方提出的主题,让参与者们在自己的个人网站上发布该主题的博文,并投稿给主办方的活动。
+
+这个月 BlogBlog 同乐会的主题是「只有我这样吗?!」。我心想该主题还蛮有趣的,所以快速动笔写了一下。不过写到后面,总感觉有些偏题——应该没有关系吧,因为成年人的世界总是不遵守规矩的!
+### 来美国的这些年·零
+
+春节期间,母亲向我提起了那个导致我一家生活大变的人,让我不由自主地想到了,我们来这个国家最初的目的。
+
+实际上,这个系列过去就想要着手写一写、一吐为快了。不过有些内容并不适合放在网络上,或者说不适合在这个时间点出现在公共网络上。因此这个系列的每个文章之间,时间间隔或许会很长很长。
+
+不过十几年前发生的事情,现在想来说出来也无所谓了,也不是什么敏感内容。因为是「来美国的目的」,所以相当于系列的前传——咦,怎么整篇都没有写,就开始写前传了?
+
+事情回到我还是个小学生的时候。我出生于南北家庭,母亲是那个「南」。访问过 /About 页面的读者应该知道,我在山东出生,也就是「北」,那么「南」是哪里呢?是福建。
+
+我对福建的记忆并不多。身为山东出生、长大的孩子,每每放假同母亲去外婆家,总是会留下不开心的记忆。那是个乡村,大家都说福州方言,我听不懂也没人教。虽然听多了自然能听明白是什么意思,不过借此打趣我的人并不少,比方说操着方言称呼我为「外地人」、「山东人」,或者糟糕些,说我是个山东傻子——山东人对他们来说貌似都是这么个刻板印象,「傻大个儿」。不过我既不傻,也不大。
+
+久了,也习惯了这样的称呼。现在想来真是幼稚,一群大人这么欺负个小孩儿,原因仅仅是她不会说本地方言。总之,我是那个地方里罕见的「两各声」(福州话里的「外地人」的汉语正字),罕见到连亲戚也要这么嘲笑我。
+
+对于这么个地方,我自然是喜欢不上来的,更何况它好像根本不欢迎我。不过我对外公外婆并不讨厌,他们对我很好,我也没有理由讨厌他们。寒假和暑假期间,我都会去外婆家探望。也是因为过节时都在福建,我吃饺子会习惯于蘸番茄酱,而不是醋。
+
+外婆家里除了两位老人,还有舅舅一家,也就是母亲的亲哥哥。我对童年时期的舅舅,印象不深,只知道他少了条腿,需要戴义肢才能行走。不过他是家里最威风的人,经常穿着西装,在外面貌似还开公司。舅妈倒是个讨厌的家伙儿,总是带着表姐表妹喊我「外地人」,或者开我姓氏的玩笑。至于表姐和表妹,她们的年纪跟我相差不大——姐姐和我一样有鼻炎,妹妹则是先天近视,必须戴着长相奇怪的眼镜。
+
+回到山东的日子则快乐许多。没有方言,没有亲戚的冷嘲热讽,我按部就班地在一所普通的学校念书。日子也不能说富裕吧,总之家里有台大头电视和台式机,那时候就能玩像《赛尔号》、《洛克王国》这样的网游。母亲还给我报了个「小餐桌」,午休期间他们会负责我吃饭,放学则会负责我写作业,等到大人来接我。
+
+那时我眼中的世界很小,只分为「我所在的山东」和「那个我不喜欢的福建」。舅舅在南方的成功仿佛是另一个世界的故事,与我毫无干系。我以为我会像身边的所有同学一样,在山东的一座小城市平平淡淡地长大。
+
+这样的生活持续了数年,直到母亲离开了中国。我忘了当时大人们是怎么跟我说的了,总之我成了数年的留守儿童。
+
+在没有母亲陪伴的那些年里,我的生活轨迹变得支离破碎。我像个皮球一样被不断地抛接,辗转于不同的屋檐之下:我和母亲的朋友居住过,和同学居住过,和母亲认的、毫无血缘关系的「亲戚」居住过。寄人篱下的日子往往意味着要学会察言观色,要默默适应不同家庭的作息与规矩。不过我像个没开智的动物,仿佛根本没有意识到这一点。这几年说来也奇特,竟成了我时常回想起童年的快乐记忆时,少有的、伴随着快乐的记忆。作为留守儿童时,我似乎在那段缺乏长辈绝对管束的真空中,获得了某种野蛮生长的自由。
+
+小时候不仅天真,也短见,甚至会认为这样的生活会一直持续下去。大人所做的很多事情都是有理由的,例如为什么小时候父亲不在、为什么母亲会突然离开中国……我从未深究过这些变故背后的逻辑,只把它们当成既定的现实、全盘接受。
+
+这种被我误认为是常态的平静,在母亲离开的第二年产生了一丝波澜。她和父亲再次相遇,并且怀了孕。过去母亲曾怀过一个男婴,不过因一些事情流了产,也成了她人生的一个结——拼凑不出个「好」字。「要儿子」这个强烈的念头,让她撑到了胎儿成形、能够辨出性别的时候——结果依然是个女儿。
+
+当天,她给我打了个视频通话,直言她不想要这个孩子,甚至在盘算要不故意摔倒流产算了。当时还是个孩子、且受了一些佛教观念影响的我,自然听不得这样剥夺生命的话,便在屏幕这头极力劝阻她。最终,她决定生下妹妹。
+
+留守的这些年或许也已经到了周遭人们的极限。我忘了具体发生了什么,总之我离开了山东,离开了中国,乘坐飞机来到了美国,来到了父母的身边,也顺利进入了我人生第一段痛苦的时期。
+
+初到美国的日子是混乱且充满窒息感的。作为语言不通的新移民,我在学校和家庭的夹缝中艰难求生。那时我一直天真地认为,父母背井离乡来到大洋彼岸,像许多人说的那样,是为了追寻更好的生活,或者是为了让我接受更多的教育。尽管这所谓的「更好」让我痛苦不堪,我也只能将一切归咎于大人的深谋远虑。
+
+直到数年后,母亲选择告诉我真相:舅舅欠了笔债,丢下父母和孩子跑了。
+
+舅妈为了不引火上身,也快速离婚找了下家。家里只有老人和孩子,但是催债的人天天上门要钱,只能让她这么个妹妹来还债。
+
+可是我的父母都不是什么高教育人士,在中国工作、慢慢还债,或许还一辈子,让孩子们也跟着还一辈子,亦或者让孩子的孩子们还一辈子,才能还完吧。最终,他们决定来到美国赚钱,以 1:6 的汇率还债。
+
+原本普通的生活,就这样被那个穿着西装、戴着义肢的男人,在一个毫无预兆的日子里彻底碾碎了。
+### 那些不受欢迎的想法
+
+室友自上个月开始,和另一位有趣的人联合举办了一个活动,名为「那些不受欢迎的想法」。
+
+该活动准确的名称叫作 The Unsolicited Opinions Hour,而简介很有特色:
+
+> 大多数人实际上并没有自己的观点。他们持有的是继承来的立场、重复的观点,或是伪装成深刻见解的自助车轱辘话。
+>
+> 本次活动是为那些真正拥有观点的人准备的。
+>
+> 每次活动,参与者都会分享一个他们真正持有的、经过深思熟虑的观点——一些他们真正思考过、检验过或通过真实经历得出的东西。
+>
+> 一些他们真正相信并且能够捍卫的东西。
+>
+> 每次分享后,所有人都会在「完全不同意」到「完全同意」的谱系上选择自己的态度。然后我们会进行结构化的讨论:双方都有不被打断的时间来阐述他们的理由。目标不是为了胜利或证明自己是对的——而是将想法与其他敏锐的头脑进行碰撞,并练习将想法与持有它们的人分开。
+
+第一次活动里,室友分享给我的话题并不是让我特别在意,不过还是让我记录一下吧。
+
+室友自己分享了「将手机屏幕颜色调成灰阶」这个想法,因为这可以避免大脑被鲜艳的颜色吸引到。我必须严肃表示,她这一想法是从我这里学来的,而我是从 另一篇文章 学来的。
+
+有人不赞同这个做法,因为护眼的话,其实调成纯红色更好,看上去也更恶心、让人不想要动手机。
+
+经过两个月的使用后,我发觉将手机屏幕颜色调成灰阶的一个问题在于,眼睛逐渐不习惯于鲜丽的颜色。我的手机屏幕原本能够发出极其鲜艳的颜色,购买时我还认为是一件好事,现在看来一点都不好;眼睛都要瞎了,还是乖乖调回灰阶吧。
+
+至于护眼不护眼,省不省电,我认为最好的方法还是——把手机放下!
+
+一个人建议大家学习在地板上睡觉,而理由是想要让自己不需要依赖任何外界的东西就能好好活下去。睡眠对人类而言是一件大事,如果只能在床上睡着的话,她会觉得自己的身体不受控制。
+
+一个人表示「写作即思想」。他是一个热爱撰写博客文章的人,并在纽约市举办了一个自己的写作俱乐部。
+
+室友觉得这个想法很棒,问我如何开发一个个人网站——哼,这个家伙根本不理解个人网站的魅力,吃了我一嘴教程后到现在也没有搓出来一个网站。
+
+一个人认为话疗没有用,根本就是胡言乱语,不会解决任何人的问题。不过这个人的想法过于主观,没有足够可以说服人的证据,不太严谨。
+
+过去和室友大打出手的时候,室友去过几次话疗,结果都不尽人意:要么是建议她去搞开放式关系,要么是建议她去找心理医生、嗑药。这个话题本该会勾起她表达欲,但是提出者给出论点让她觉得有些幼稚。
+
+一个人提议大家去专注于平日不会注意到的细节。他经常会在家附近走一条固定的路线。一次,他决定放慢脚步,鉴赏大自然,却发现家附近有个温室——天啊,他住在这里这么多年了,居然不知道这里有这么大一个温室!
+
+一个人说千万不要觉得自己奇怪,想到什么就去做吧。这个想法虽然很不错,但我认为实现起来很困难。
+
+作为室友和另一个人初次举办的活动,她们俩都没有什么经验,后来也承认不够成熟,经过审核的话题也不够符合标题「不受欢迎的想法」,甚至有些听上去依然是车轱辘话来回转。不过第二次举办的活动里,能聊的东西就多了起来。
+
+首先是鸽子被严重低估了!纽约客们可能都很讨厌这个动物吧:到处都是,到处拉屎。但其实这个动物并不是原生动物,而是因为战争、以「信鸽」的形式来到这片土地的。
+
+提出这个观点的人认为,鸽子也可以很美丽。想要了解更多的话,可以见这个 鸽子博物馆。
+
+我想到了「赛鸽」和「和平鸽」。这样说来,鸽子同时是「信息」以及「和平」的象征,可以拼接在一起,合成「沟通可以达成世界和平」的想法。
+
+不过真的要给一个动物贴上如此宏大的标签么?「和平鸽」这个概念出自于《圣经》的诺亚方舟。当时诺亚放出了鸽子去打探地上的情况,而鸽子叼了橄榄叶回来,暗示地上已经有植物生长,洪水退了、世界和平了。
+
+或许将动物的美拉回到动物本身是最好的——你认为三文鱼的代表色是橙色吗?
+
+接着是一个颇有争议性的话题:男人和女人如果互换了生殖系统,会发生什么?提出该话题的人认为,这世上的大多数人祖上都是皇族或者强奸犯。这是因为过去,只有强壮的人才能够繁殖后代。抛开在地位和权利上「强大」的皇族,强奸犯则是因为暴力、强迫了女性诞下自己的子嗣。皇族终究是少数人,那么剩余的多数人都是强奸犯,且越暴力越好。
+
+他接着提出一个猜想:在基因层面上,男人会更暴躁。再加上男人的生殖系统是侵入性的,并且男人可以让多个女人怀孕,而女人一次只能怀一个男人的胎,因此男人想要授种的欲望更加强烈,其生殖系统也更希望他更加暴力。那么在互换后,具备这样的生殖系统的女人也会变得暴躁起来——生殖系统决定了人类的很多事情。
+
+室友提出反对。假设这个互换是突然发生的,那它仅改变了男女的「先天条件」,但是没有改变长期以来人类形成的文化,所以男人不会突然变得女性化,而女人也不会突然变得男性化。作为证据,她提出了双胞胎说:一对同卵双胞胎如果在不同的环境下生长,最终会长成完全不同的人。这意味着对人类而言,后天环境更加重要。
+
+当然,这些都是以极端的情况作为前提来讨论的。是男人并不意味着他就是个强奸犯,拥有男性生殖系统也不意味着他一定会有 _有毒男子气质_——我曾经写过 相关的文章,并认为这是被社会化的结果,而不是生理层面上的。将繁衍的生物学内驱力强行和系统性的社会暴力表现替换,实在是过于极端了,毕竟生殖器官本身并不具备实施社会暴力的主观意志,认为男性生殖器官更有侵入性一点我也不好说,毕竟男性也可以被女性强奸。
+
+下一个话题是「大学是给一些不愿进社会的人们的拖延症」。提出方是一个没有上过大学的人。说实话,她是我目前见过最自律的人了,不仅自学了大量技能,就连生活的方方面面也不愿意交给其他人来做。她热爱音乐、走马拉松、尝试做自己从来没有做过的任何事情……令人忍不住去羡慕她。
+
+说回她的论点。她认为大学对自己而言没有用处,只是让不想接受现实的人们再当几年的学生。室友也赞同这一点。不过这一论点很快被两个人否决了:一个认为,这是因为提出方和室友两个人都是主动性很强的人,在大学前就知道自己应该做什么工作。那如果是对未来感到迷茫的人呢?比方说他自己,就是上了大学才发现自己对物理学感兴趣,继而成为了一个物理老师,因此他永远都不会后悔自己上了大学。
+
+另一个不赞同的人则认为,「大学无用」这个结论根本上是因为社会让太年轻的人去上大学了。刚刚成年的人们根本不知道未来该怎么办,也不知道社会是什么样的,去了大学自然不知道应当学什么专业。他希望高中生们毕业后,就立即步入社会工作,然后再决定是否要读本科,专精某项技能。
+
+这很难让我回应……我讨厌大学是真,但更多是我觉得大学教育德不配位——贵死了,教育水平也一般般,不如自学。所以我也算在大学之前就知道自己想做什么的人。不过并不是所有人一出生就知道自己想做什么,为这些人提供帮助的,我想正是学校。
+
+但是我有一个更为宏观的看法:本科的重点是培养搞学术的人,而不是专业的工作者。后者应该去读专科。很多人错将本科认为是可以学习到专业技术的地方,毕业后却去找更适合专科毕业生的工作。同理,现在的职场也只认本科生,将适合专科生的工作交给本科生。结果社会越来越乱,出现了大量的本科生,出社会找工作却发现学校教的知识根本不是职场需要的技能。
+
+这也是为什么我觉得双方的观点其实并不冲突:赞同方更注重于步入职场的实用性,都是创业者;不赞同方想要的是在学术上的引导,因为他之后当的也是和学术相关的老师。
+
+至于是否应该让高中毕业生先去工作,我认为该想法的内核是值得称赞的,目前教育系统的一大痛点正是大多数年轻人在做出人生最昂贵的一次投资时,对真实的社会运作一无所知。
+
+过去我认识到了一个观点,即 K-12 教育中应当多出哪些课程,其中就有税法、金钱管理等长大后必须要学习的内容。可惜,K-12 教育里没有这些,想要学习税法的需要自行去申请成为税法专业学生。社会残酷地没有为刚刚成年的个体提供试错和探索的空间,导致一个又一个人发觉大学真是个笑话,自己不过是又当了四五年高中生。
+
+而已经经历过社会毒打,参与过真实工作场景的人们,更能清楚自己欠缺什么。重返校园接受本科教育时,他们拥有着更强的目的性。我没少见过年纪可以做我父母的本科生们比谁都要更努力地钻研学业,让我忍不住去关注他们。
+
+不过这个想法实践起来有些不切实际,并不是因为它有误,而是目前社会运转逻辑已经固定了。我们的劳动力市场过于前置了学历门槛,剥夺了高中毕业生通过低门槛工作去探索世界的过渡期,就连 Gap Year 这个概念在很多国家都属于奢侈品。社会默认将年轻人直接从高中强行推进大学,导致许多人只是为了逃避就业而继续读书。本科是如此,硕士也是如此。
+
+最后一个话题就没有前一些话题那么有争议性了:自私和无私的代价。我和室友在高中时就参与过这个话题的辩论。或许是一直待一块的原因,臭味相投,我和她的看法是一致的:世界上根本没有什么所谓的「无私」,无私不过是在客观结果上利他的自私,因为无私者是被自己的想法驱动而去做利他型行为的,获得最多的也是自我的满足。
+
+当时我哗啦啦写了一篇作文表示人类有着自私的基因,却被另一个同学评论认为这种想法是不人道的。现在我已经不记得我做出了什么样的回应,但我现在可以说,自私并不意味着要和恶意、贪婪和剥削等词汇挂钩,承认自己自私也并不妨碍我们在宏观层面建立道德——人类的自私基因为了延续,演化出来的恰恰正是合作、同理心和无私奉献等策略,因为互助的群体存活率远高于互相残杀的群体。
+### 奶茶店毕业
+
+早在 第一篇月刊 里,我就说过去年八月份我找了份兼职,主要是得快速还笔钱。这一做就是半年,而在上个月(其实也就是二月份啦)我提了离职,逃跑了。
+
+先从最开始说起吧。当时我的银行账户已经支撑不起我日常的吃喝拉撒了。就算是和室友合租,有父母给的几百块生活费,不欠钱活下去依然很难。不得已,我只能将开发项目的时间分出来,花费在打工上——那会儿连公司都没有被注册,项目跟个人项目没有什么区别,更别说赚钱了。
+### 入门编写 SVG
+
+是的,我又挖坑了。从 0 到 1 的学习总是令人感到兴奋,不过最为重要的或许是接下来的 1 到 100……还是不要再鞭策自己了!
+
+这一切要从我决定重构 https://cytrogen.icu 开始(当你看到这篇文章时,访问该链接就能看到雏形了)。原本它是我的博客网站的地址,后来我想要一个更像是个人网络的设计,即根域名为个人主页,博客网站放在 blog 子域名上。
+
+个人主页、个人主页……怎么样的个人主页更能展示出我的「个性」呢?除了 先前 介绍的 ellesho.me 外,我还看了 Hacker News 的这个 帖子,里面有许多设计非常有趣的个人主页,不过博客网站依然偏多。不是对博客网站有任何意见,只是我认为,我不需要另一个以文本为主的网络载体:我已经有了博客网站,还有了只能显示文字的胶囊。
+
+这就需要说到 Web 最为特殊的东西了:HTML、CSS 和 JavaScript。既然是 Web 上搭建的站点,不玩玩这三剑客又怎么行呢?当然,这也不意味着我的个人主页就会充满了 JavaScript、把访问者的设备卡到无法动弹。我依然会遵循「极简 JavaScript」的原则,来完成它。
+
+小时候游玩过的 Flash 小游戏,让我想要实现类似的内容。不知道读者们有没有玩过 Reincarnation 这款点击解密 Flash 游戏呢?4399 游戏平台将其翻译为《地狱使者》,不过我认为失去了原标题「轮回」的意味。总之它是一款原先发布在 NEWGROUNDS 平台 上的游戏,由 Chris Gianelloni 开发。故事讲的是地狱中逃出去了许多鬼魂,主角小恶魔受地狱之王撒旦指使,要去人间找到这些死人、定他们的罪,最后靠解密让他们「意外」身亡——为什么小时候的我喜欢这种血腥的游戏啊?不过主角小恶魔我觉得很可爱,还是个被迫工作的打工人,经常光着身子撅着个腚走来走去。
+
+当时的 Flash 游戏,这种玩法单纯依赖于鼠标点击的有很多,比方说各种类宝可梦的网游、《华纳史诗冒险系列》(Steppenwolf: The X-Creatures Project)都是如此。我也想一个类似的个人主页!
+
+使用 Flash 技术肯定是不可能的了。我也不打算将个人主页做成一款网页游戏,不过一些游戏元素还是可以接受的……但这篇文章并不会涉及到这一方面,为什么呢,因为我还没有开始设计和编写。就像标题所说的,该文章的重点在于 SVG 这项技术。
+
+### 了解 SVG
+
+SVG 的全称叫作 Scalable Vector Graphics,即 可缩放矢量图形。它是基于 XML 格式的图像格式,用于描述 二维矢量图形。
+
+说这么多术语以及模糊的概念,大家可能无法很好地明白,我就先来讲解一下计算机里、图形到底是什么吧。图形本质上是数据的可视化量现。为了在屏幕上准确呈现这些视觉信息,计算机需要依赖一套特定的编码规则或者说数据格式来解析信息,而这一切大致可以分为两个分支:位图与矢量。
+
+位图图形(bitmap),也被称为栅格图形(raster graphics),核心结构是由像素点(pixel)排列而成的矩形网格,而像素是数字显示设备上能够被独立控制色彩与亮度的最小物理发光单元。大家熟知的 JPEG、PNG 等,都是位图图形的格式。当计算机系统渲染一张 JPEG 文件时,它读取的其实是二维数据表——表会记录该特定尺寸网格中,每一个坐标位置上像素的具体色彩值。
+
+不过位图有个大问题:依赖分辨率。因为图像的信息由固定数量的像素点强行绑定,一旦图像被放大、网格被拉伸,计算机就必须运行插值算法,根据原有相邻像素的颜色去推算并凭空生成新的像素来填补填充后的物理面积。作为一个例子,你可以打开任何一个位图编辑器,比方说 Windows 系统的 Paint 软件,在上面随便画点什么,接着将其选中、拉伸,你就能看到许多突然多出的锯齿状像素方块。
+
+而矢量图(vector)抛弃了像素网格的概念,转而使用数学公式和几何图元来描述图像。一组由起点坐标、终点坐标、线条粗细和颜色属性共同构成的数学指令,就能在矢量体系中画出一条直线。当矢量图被放大后,计算机会将新的缩放比例代入原有的数学公式中,重新计算并在屏幕上实时绘制出新的图像,从而让矢量图无论怎么放大,都能让边缘保持锐利。
+
+在互联网普及之前,计算机图形学领域便已经存在成熟的矢量技术:用于打印排版的 PostScript、CAD 软件和 Adobe Illustrator 等专业绘图工具使用的专用格式……二十世纪九十年代末,万维网面临着严重的带宽限制和多样的终端显示器分辨率。位图格式在传输高质量大尺寸图像时,会导致文件体积急剧膨胀,且有着先前提到过的、极差的不同分辨率下的缩放表现。矢量图本应该是解决这一问题的完美方案,但是当时的矢量格式大多是编译后的二进制数据,且被各家商业公司作为技术壁垒严格封闭。
+
+如果将早期 Macromedia Flash 或各类专有矢量文件直接嵌入网页,浏览器无法原生解析这些数据,用户必须下载并安装特定的第三方插件。这些二进制文件对于网页的底层结构而言,也有着许多问题:搜索引擎的爬虫无法读取其中的文本内容,网页开发者也无法使用 JavaScript 去捕获图形内部的元素并产生交互。
+
+W3C(万维网联盟)认为,互联网需要一种属于自己的、非专有的、且与现有 Web 技术栈深度融合的矢量图形标准。业界纷纷向 W3C 提交关于 Web 矢量图形的提案,其中最具代表性的分别是 VML(Vector Markup Language)和 PGML(Precision Graphics Markup Language)。它们都试图建立基于 XML(可扩展标记语言)的图形描述规范。
+
+而 W3C……哪个都没选,反而成立专门的图形工作组,吸收了这两种方案的优势、想出了 SVG 规范。
+
+因为 SVG 被设计为纯粹的 XML 文本,因此顺理成章成为了 DOM 树的一部分。网页浏览器不需要插件也能利用内置的渲染引擎对其进行解析,同时图形中的每一条路径、形状都成为了可被精确寻址的 DOM 节点。可喜可贺,可喜可贺。
+
+### 写 SVG
+
+在我的计划里,我的个人主页所会用到的矢量图形并不复杂。没有描边的大色块有着自己的魅力。
+
+用 SVG 来写只需要知道这五个元素:
+
+* <rect>
+* <circle>
+* <polygon>
+* <path>
+* <text>
+
+SVG 应用的是直角坐标系,原点 $(0,0)$ 位于画布的左上角,X 轴向右延伸,Y 轴向下延伸。所有的几何图元都基于这个网格定位与绘制。
+
+对于矩形 <rect> 元素,核心属性分别是:
+
+* x 和 y,用于确定矩形左上角顶点的精确坐标
+* width 和 height,分别定义矩形在水平方向和垂直方向上的标量跨度
+* rx 和 ry,指定圆角的水平和垂直半径
+
+圆形 <circle> 元素的逻辑基于圆心的半径:
+
+* cx 和 cy,标记圆心在坐标系中的绝对位置
+* r,设定原的半径长度
+
+多边形 <polygon> 元素用于绘制由直线段连接而成的闭合形状:
+
+* 核心 points 属性,在接收一系列坐标对,每个坐标对代表多边形的一个几何顶点。渲染引擎会按照坐标的书写顺序,依次用直线将这些点连接起来,并自动将最后一个点与第一个点连接以闭合图形
+
+作为一个例子:<polygon points="50,15 100,100 0,100" /> 画出的是三角形。
+
+文本 <text> 元素将字符数据引入矢量画布。与常规 HTML 中的文本排版不同,SVG 文本需要严格的空间绝对定位:
+
+* x 和 y 属性并不代表文本块的左上角,而是文本基线的起点位置。字号、字体族等排版属性需要通过 CSS 或内联属性进行声明
+
+<path> 元素很常用:
+
+* d 属性是一系列微型绘图指令的集合:
+* M x y 指令负责抬起虚拟画笔并移动到指定的 $(x,y)$ 坐标,通常作为路径的初始起笔指令
+* L x y 指令表示从当前画笔位置绘制一条绝对直线到新的 $(x,y)$ 坐标
+* Q x1 y1, x y 指令绘制二次贝塞尔曲线。其中 $(x_1, y_1)$ 是控制点,$(x,y)$ 是整段曲线的最终物理端点
+* Z 指令没有参数。当它出现在路径数据的末尾时,渲染引擎会自动从当前所在坐标绘制一条直线,径直连回当前子路径的起始点,即上一个 M 指令所在的坐标
+
+知道了这些后,我便可以一步步绘制出,我的个人主页的内容了!
+
+首先,我希望我的个人主页有一个开场动画:一面山羊头骨为中心的墙,短暂呈现一段时间后,从中间垂直地打开,展示后面的城堡。那么这个墙要怎么画呢?
+
+先定义一下结构:
+
+```css
+<div class="skull-overlay" aria-hidden="true">
+ <svg class="skull" viewBox="-200 -250 800 1000" preserveAspectRatio="xMidYMidslice">
+ <g class="skull-bottom">
+ </g>
+ <g class="skull-top">
+ </g>
+ </svg>
+</div>
+```
+
+在最外层的 <svg> 容器中(实际最外层的 div 仅作动画用,在写 SVG 的情况下并不需要管),视口属性 viewBox="-200 -250 800 1000" 意味着起始点在于 X 轴的 $-200$ 和 Y 轴的 $-250$,整体的宽度设定为 $800$,高度设定为 $1000$。
+
+preserveAspectRatio="xMidYMidslice" 属性是适配规则,强制 SVG 在容器尺寸变化时保持自身比例缩放,且会裁剪掉超出容器边缘的部分,以确保画面始终完全填满视口、不发生形变。
+
+由于 SVG 遵循着从上到下的文档流渲染顺序,实际带有山羊头骨的上半部分墙需要在下半部分墙之后定义。现在让我们先完成下半部分墙的内容。
+
+<g> 是群组元素,可以在内部添加数个 SVG 元素来组合起来。对于下半部分墙,我们只需要一个 <rect> 元素,但为了统一性,还是放入群组内:
+
+```css
+<g class="skull-buttom">
+ <rect class="fill-wall-dark" x="-200" y="250" width="800" height="500" />
+</g>
+```
+
+除了高度外,其他内容都和视口属性相同,因为需要填满整个画面。高度则是视口高度的一半,毕竟是「下半部分」。
+
+接下来让我们绘制上半部分墙。在我的构造里,这个墙在画面中心还会有一个山羊头骨,在绘制时需要先画墙、山羊头骨、头骨细节。先画墙:
+
+```css
+<g class="skull-top">
+ <rect class="fill-wall-dark" x="-200" y="-250" width="800" height="500" />
+</g>
+```
+
+接着绘制一个山羊头骨的剪影:
+
+```css
+<path class="fill-skull" d="
+ M175 380 L158 340 L138 290 L125 245
+ L130 200 L155 170 L200 158
+ L245 170 L270 200 L275 245
+ L262 290 L242 340 L225 380 Z
+ ">
+```
+
+起初点 M175 380 是头骨吻部的左侧底端,随后用 L 指令向上描绘头骨的左侧边缘:L158 340 L138 290 L125 245 L130 200 L155 170。可以观察出,它们的 X 坐标先减小后增大,因为我想先画出从吻部向外扩张到颧骨,再到头顶时向内收缩。而 Y 坐标一直在减少,因为我们是从左下角开始画、要画到头顶的。
+
+跨过中心点 L200 158 后,再描绘头骨的右侧边缘:L245 170 L270 200 L275 245 L262 290 L242 340 L225 380。和画头骨左侧的路线相反,Y 坐标一直在变大,X 坐标则是先增大再减少,直至吻部的右侧底端(看 Y 坐标,和起始点的 Y 坐标一致)。最终用一个 Z 指令将它们两个点用一条直线相连。
+
+想要填充头骨颜色的话,在 CSS 类 .fill-skull 里设置即可。
+
+山羊头骨的大致形状写完后,我们还需要写两个眼洞和角。其中眼洞的写法和头骨剪影一致,都是用直线勾出形状,这里只说角的写法吧。
+
+我想要这个角具有弧度,因此需要引入二次贝塞尔曲线。二次贝塞尔曲线需要三个关键点:
+
+1. 起点
+2. 控制点
+3. 终点
+
+控制点本身不位于最终渲染的曲线上,但起到了类似于引力的作用,将起点到终点的连线向自身方向拉扯,从而形成特定的弧度。
+
+
+
+图片来自 Pocket Guide to Writing SVG。
+
+用这张图片来看,会更直观些吧。
+
+左侧角的绘制从 M130 205 开始,确立了角与颅骨左侧的连接基点。随后 Q70 170 35 110 勾勒角的外侧边缘。这里的曲线从坐标 $(130,205)$ 开始,向 $(35,110)$ 延伸,同时受到位于左上方的控制点 $(70,170)$ 的牵引。结果便是曲线先向左侧外扩,随后向左上方收束。到达角尖最高点附近时,L65 95 封闭角的顶端,再用 Q85 145 145 180 画角的内侧边缘。右侧角就不用说了,是完全镜像的。
+
+### 更复杂的 SVG
+
+到这里,你或许会想,这样写 SVG 好累。我不否认。人类的大脑并不擅长于直观构建二维坐标系内的形状,尤其是过于复杂的形状。一个解决方案是使用更抽象的工具:可视化矢量图形编辑器。
+
+我高中时学习了 Adobe Illustrator 的使用方式,或许其他的编辑器也是一样的。绘制路径时,往往都会有操作锚点、控制手柄等工具。底层图形引擎会实时计算这些交互动作对应的绝对,或相对的坐标,并能够精准地生成所需的二次,甚至是三次贝塞尔曲线指令。
+
+不过 Adobe 的东西都很昂贵。Inkscape 是开源的替代品,可以尝试。据说 Figma 也能够绘画矢量图形。它们都可以将结果导出为标准的 SVG 代码。
+
+如果想要画重复性高的 SVG 图形,也可以通过编写脚本来动态连接路径数据。比方说 d3.js 这个项目,就能实现一个很有意思的 例子。
+
+再就是,在传统开发模式中,SVG 往往被视为等同于 PNG 或 JPEG 的静态外部资源。一旦在矢量编辑器中完成绘制并导出为 XML 代码,其内部的节点结构、填充颜色、描边参数以及路径坐标种种,都被硬编码锁定了。
+
+怎么解决呢?现代前端开发体系,比如 React 和 Vue,引入了组件化封装与声明式抽象,本质上是将静态的 XML 标记解析为虚拟 DOM 树上的节点。这样的话,SVG 就被包装成了个能够接收外部参数的函数或类组件。
+
+
+
+
+
+### 没有情人的情人节
+
+室友上个月主持的 活动 里,我忘了说室友提起的话题。正好也可以借此说一些我的观点。活动那天是情人节,而她也借了这次机会表达了该观点:人们不需要恋爱关系。
+
+她会提出这么有争议性的话题,很有她的风格。这个观点也是她常常挂在嘴边的,就我看来更像是一种警戒——谁知道呢?因为本文的主角并不是她,我就不深入她的情况了,只会简单解释一下她的观点。
+
+人类是需要物理接触,这包括拥抱和抚摸。但在众多文化中,异性——或者同性,如果对方将同性恋放在眼里的话——之间做这些行为会被认为是浪漫的,从而认为只有恋人可以做这些。
+
+如果可以随意在物理上接触他人,或许许多恋情也没必要存在了。这么说的原因在于,我认为许多恋情的本质在于「连接」,而非通常来说的「结婚」。
+
+结婚是室友最讨厌的概念之一。因为是个法律脑袋儿,她认为婚姻的重点在于「共享资产」。她不相信婚姻的契约,认为那只是将二人强行绑定在一起的说辞——毕竟如果有心的话,二人不结婚也可以一直在一起。又由于她是个不喜欢遵守「社会规则」的人,「不结婚生子不行」的观念在她这里也行不通:老了可以花钱请护工,怕护工欺负自己那就培养类似于徒弟或者养子(或者信徒,她就是可以做到这一点的家伙儿)的人。只要有钱和人格魅力,就可以规避通常人会认为只有结婚生子才能做到的事情。既然如此,为什么要花费精力和人进入恋爱关系,然后将自己的生活搞得一塌糊涂呢?
+
+是的,「恋爱」对她而言是一种可怕的概念。陷入恋情时确实会享受到多巴胺反馈,但一旦出现了问题,会让她感到很绝望。这主要是因为,「恋人」是未来也要在一起的人,为了这个目的,必须和对方摩擦、承受对方的情绪、想尽办法和对方解决这个问题。如果对方是可以
+
+## 链接
+
+=> http://root.livingrules.io/ 这个网站
+=> https://blogblog.club/party BlogBlog 同乐会
+=> https://indieweb.org/IndieWeb_Carnival IndieWeb Carnival
+=> https://sami.eljabali.org/go-gray-not-cray-why-you-should-grayscale-your-phone/ 另一篇文章
+=> https://www.theamericanpigeonmuseum.org/pigeon-breed-gallery 鸽子博物馆
+=> https://news.ycombinator.com/item?id=46618714 帖子
+=> https://www.newgrounds.com/series/reincarnation NEWGROUNDS 平台
+=> https://svgpocketguide.com/ /Pocket Guide to Writing SVG/
+=> https://github.com/d3/d3 d3.js
A posts/入门编写-svg.gmi => posts/入门编写-svg.gmi +176 -0
@@ 0,0 1,176 @@
+# 入门编写 SVG
+2026-03-11
+
+这一切要从我决定重构 https://cytrogen.icu 开始(当你看到这篇文章时,访问该链接就能看到雏形了)。原本它是我的博客网站的地址,后来我想要一个更像是个人网络的设计,即根域名为个人主页,博客网站放在 blog 子域名上。
+
+个人主页、个人主页……怎么样的个人主页更能展示出我的「个性」呢?除了 先前 介绍的 ellesho.me 外,我还看了 Hacker News 的这个 帖子,里面有许多设计非常有趣的个人主页,不过博客网站依然偏多。不是对博客网站有任何意见,只是我认为,我不需要另一个以文本为主的网络载体:我已经有了博客网站,还有了只能显示文字的胶囊。
+
+这就需要说到 Web 最为特殊的东西了:HTML、CSS 和 JavaScript。既然是 Web 上搭建的站点,不玩玩这三剑客又怎么行呢?当然,这也不意味着我的个人主页就会充满了 JavaScript、把访问者的设备卡到无法动弹。我依然会遵循「极简 JavaScript」的原则,来完成它。
+
+小时候游玩过的 Flash 小游戏,让我想要实现类似的内容。不知道读者们有没有玩过 Reincarnation 这款点击解密 Flash 游戏呢?4399 游戏平台将其翻译为《地狱使者》,不过我认为失去了原标题「轮回」的意味。总之它是一款原先发布在 NEWGROUNDS 平台 上的游戏,由 Chris Gianelloni 开发。故事讲的是地狱中逃出去了许多鬼魂,主角小恶魔受地狱之王撒旦指使,要去人间找到这些死人、定他们的罪,最后靠解密让他们「意外」身亡——为什么小时候的我喜欢这种血腥的游戏啊?不过主角小恶魔我觉得很可爱,还是个被迫工作的打工人,经常光着身子撅着个腚走来走去。
+
+当时的 Flash 游戏,这种玩法单纯依赖于鼠标点击的有很多,比方说各种类宝可梦的网游、《华纳史诗冒险系列》(Steppenwolf: The X-Creatures Project)都是如此。我也想一个类似的个人主页!
+
+使用 Flash 技术肯定是不可能的了。我也不打算将个人主页做成一款网页游戏,不过一些游戏元素还是可以接受的……但这篇文章并不会涉及到这一方面,为什么呢,因为我还没有开始设计和编写。就像标题所说的,该文章的重点在于 SVG 这项技术。
+
+### 了解 SVG
+
+SVG 的全称叫作 Scalable Vector Graphics,即 可缩放矢量图形。它是基于 XML 格式的图像格式,用于描述 二维矢量图形。
+
+说这么多术语以及模糊的概念,大家可能无法很好地明白,我就先来讲解一下计算机里、图形到底是什么吧。图形本质上是数据的可视化量现。为了在屏幕上准确呈现这些视觉信息,计算机需要依赖一套特定的编码规则或者说数据格式来解析信息,而这一切大致可以分为两个分支:位图与矢量。
+
+位图图形(bitmap),也被称为 栅格图形(raster graphics),核心结构是由像素点(pixel)排列而成的矩形网格,而像素是数字显示设备上能够被独立控制色彩与亮度的最小物理发光单元。大家熟知的 JPEG、PNG 等,都是位图图形的格式。当计算机系统渲染一张 JPEG 文件时,它读取的其实是二维数据表——表会记录该特定尺寸网格中,每一个坐标位置上像素的具体色彩值。
+
+不过位图有个大问题:依赖分辨率。因为图像的信息由固定数量的像素点强行绑定,一旦图像被放大、网格被拉伸,计算机就必须运行插值算法,根据原有相邻像素的颜色去推算并凭空生成新的像素来填补填充后的物理面积。作为一个例子,你可以打开任何一个位图编辑器,比方说 Windows 系统的 Paint 软件,在上面随便画点什么,接着将其选中、拉伸,你就能看到许多突然多出的锯齿状像素方块。
+
+而 矢量图(vector)抛弃了像素网格的概念,转而使用数学公式和几何图元来描述图像。一组由起点坐标、终点坐标、线条粗细和颜色属性共同构成的数学指令,就能在矢量体系中画出一条直线。当矢量图被放大后,计算机会将新的缩放比例代入原有的数学公式中,重新计算并在屏幕上实时绘制出新的图像,从而让矢量图无论怎么放大,都能让边缘保持锐利。
+
+在互联网普及之前,计算机图形学领域便已经存在成熟的矢量技术:用于打印排版的 PostScript、CAD 软件和 Adobe Illustrator 等专业绘图工具使用的专用格式……二十世纪九十年代末,万维网面临着严重的带宽限制和多样的终端显示器分辨率。位图格式在传输高质量大尺寸图像时,会导致文件体积急剧膨胀,且有着先前提到过的、极差的不同分辨率下的缩放表现。矢量图本应该是解决这一问题的完美方案,但是当时的矢量格式大多是编译后的二进制数据,且被各家商业公司作为技术壁垒严格封闭。
+
+如果将早期 Macromedia Flash 或各类专有矢量文件直接嵌入网页,浏览器无法原生解析这些数据,用户必须下载并安装特定的第三方插件。这些二进制文件对于网页的底层结构而言,也有着许多问题:搜索引擎的爬虫无法读取其中的文本内容,网页开发者也无法使用 JavaScript 去捕获图形内部的元素并产生交互。
+
+W3C(万维网联盟)认为,互联网需要一种属于自己的、非专有的、且与现有 Web 技术栈深度融合的矢量图形标准。业界纷纷向 W3C 提交关于 Web 矢量图形的提案,其中最具代表性的分别是 VML(Vector Markup Language)和 PGML(Precision Graphics Markup Language)。它们都试图建立基于 XML 的图形描述规范。
+
+而 W3C……哪个都没选,反而成立专门的图形工作组,吸收了这两种方案的优势、想出了 SVG 规范。
+
+因为 SVG 被设计为纯粹的 XML 文本,因此顺理成章成为了 DOM 树的一部分。网页浏览器不需要插件也能利用内置的渲染引擎对其进行解析,同时图形中的每一条路径、形状都成为了可被精确寻址的 DOM 节点。可喜可贺,可喜可贺。
+
+### 写 SVG
+
+在我的计划里,我的个人主页所会用到的矢量图形并不复杂。没有描边的大色块有着自己的魅力。
+
+用 SVG 来写只需要知道这五个元素:
+
+* <rect>
+* <circle>
+* <polygon>
+* <path>
+* <text>
+
+SVG 应用的是直角坐标系,原点 $(0,0)$ 位于画布的左上角,X 轴向右延伸,Y 轴向下延伸。所有的几何图元都基于这个网格定位与绘制。
+
+对于矩形 <rect> 元素,核心属性分别是:
+
+* x 和 y,用于确定矩形左上角顶点的精确坐标
+* width 和 height,分别定义矩形在水平方向和垂直方向上的标量跨度
+* rx 和 ry,指定圆角的水平和垂直半径
+
+圆形 <circle> 元素的逻辑基于圆心的半径:
+
+* cx 和 cy,标记圆心在坐标系中的绝对位置
+* r,设定原的半径长度
+
+多边形 <polygon> 元素用于绘制由直线段连接而成的闭合形状:
+
+* 核心 points 属性,在接收一系列坐标对,每个坐标对代表多边形的一个几何顶点。渲染引擎会按照坐标的书写顺序,依次用直线将这些点连接起来,并自动将最后一个点与第一个点连接以闭合图形
+
+作为一个例子:<polygon points="50,15 100,100 0,100" /> 画出的是三角形。
+
+文本 <text> 元素将字符数据引入矢量画布。与常规 HTML 中的文本排版不同,SVG 文本需要严格的空间绝对定位:
+
+* x 和 y 属性并不代表文本块的左上角,而是文本基线的起点位置。字号、字体族等排版属性需要通过 CSS 或内联属性进行声明
+
+<path> 元素很常用:
+
+* d 属性是一系列微型绘图指令的集合:
+* M x y 指令负责抬起虚拟画笔并移动到指定的 $(x,y)$ 坐标,通常作为路径的初始起笔指令
+* L x y 指令表示从当前画笔位置绘制一条绝对直线到新的 $(x,y)$ 坐标
+* Q x1 y1, x y 指令绘制二次贝塞尔曲线。其中 $(x_1, y_1)$ 是控制点,$(x,y)$ 是整段曲线的最终物理端点
+* Z 指令没有参数。当它出现在路径数据的末尾时,渲染引擎会自动从当前所在坐标绘制一条直线,径直连回当前子路径的起始点,即上一个 M 指令所在的坐标
+
+知道了这些后,我便可以一步步绘制出,我的个人主页的内容了!
+
+首先,我希望我的个人主页有一个开场动画:一面山羊头骨为中心的墙,短暂呈现一段时间后,从中间垂直地打开,展示后面的城堡。那么这个墙要怎么画呢?
+
+先定义一下结构:
+
+```css
+<div class="skull-overlay" aria-hidden="true">
+ <svg class="skull" viewBox="-200 -250 800 1000" preserveAspectRatio="xMidYMidslice">
+ <g class="skull-bottom">
+ </g>
+ <g class="skull-top">
+ </g>
+ </svg>
+</div>
+```
+
+在最外层的 <svg> 容器中(实际最外层的 div 仅作动画用,在写 SVG 的情况下并不需要管),视口属性 viewBox="-200 -250 800 1000" 意味着起始点在于 X 轴的 $-200$ 和 Y 轴的 $-250$,整体的宽度设定为 $800$,高度设定为 $1000$。
+
+preserveAspectRatio="xMidYMidslice" 属性是适配规则,强制 SVG 在容器尺寸变化时保持自身比例缩放,且会裁剪掉超出容器边缘的部分,以确保画面始终完全填满视口、不发生形变。
+
+由于 SVG 遵循着从上到下的文档流渲染顺序,实际带有山羊头骨的上半部分墙需要在下半部分墙之后定义。现在让我们先完成下半部分墙的内容。
+
+<g> 是群组元素,可以在内部添加数个 SVG 元素来组合起来。对于下半部分墙,我们只需要一个 <rect> 元素,但为了统一性,还是放入群组内:
+
+```css
+<g class="skull-buttom">
+ <rect class="fill-wall-dark" x="-200" y="250" width="800" height="500" />
+</g>
+```
+
+除了高度外,其他内容都和视口属性相同,因为需要填满整个画面。高度则是视口高度的一半,毕竟是「下半部分」。
+
+接下来让我们绘制上半部分墙。在我的构造里,这个墙在画面中心还会有一个山羊头骨,在绘制时需要先画墙、山羊头骨、头骨细节。先画墙:
+
+```css
+<g class="skull-top">
+ <rect class="fill-wall-dark" x="-200" y="-250" width="800" height="500" />
+</g>
+```
+
+接着绘制一个山羊头骨的剪影:
+
+```css
+<path class="fill-skull" d="
+ M175 380 L158 340 L138 290 L125 245
+ L130 200 L155 170 L200 158
+ L245 170 L270 200 L275 245
+ L262 290 L242 340 L225 380 Z
+ ">
+```
+
+起初点 M175 380 是头骨吻部的左侧底端,随后用 L 指令向上描绘头骨的左侧边缘:L158 340 L138 290 L125 245 L130 200 L155 170。可以观察出,它们的 X 坐标先减小后增大,因为我想先画出从吻部向外扩张到颧骨,再到头顶时向内收缩。而 Y 坐标一直在减少,因为我们是从左下角开始画、要画到头顶的。
+
+跨过中心点 L200 158 后,再描绘头骨的右侧边缘:L245 170 L270 200 L275 245 L262 290 L242 340 L225 380。和画头骨左侧的路线相反,Y 坐标一直在变大,X 坐标则是先增大再减少,直至吻部的右侧底端(看 Y 坐标,和起始点的 Y 坐标一致)。最终用一个 Z 指令将它们两个点用一条直线相连。
+
+想要填充头骨颜色的话,在 CSS 类 .fill-skull 里设置即可。
+
+山羊头骨的大致形状写完后,我们还需要写两个眼洞和角。其中眼洞的写法和头骨剪影一致,都是用直线勾出形状,这里只说角的写法吧。
+
+我想要这个角具有弧度,因此需要引入二次贝塞尔曲线。二次贝塞尔曲线需要三个关键点:
+
+1. 起点
+2. 控制点
+3. 终点
+
+控制点本身不位于最终渲染的曲线上,但起到了类似于引力的作用,将起点到终点的连线向自身方向拉扯,从而形成特定的弧度。
+
+
+
+图片来自 Pocket Guide to Writing SVG。
+
+用这张图片来看,会更直观些吧。
+
+左侧角的绘制从 M130 205 开始,确立了角与颅骨左侧的连接基点。随后 Q70 170 35 110 勾勒角的外侧边缘。这里的曲线从坐标 $(130,205)$ 开始,向 $(35,110)$ 延伸,同时受到位于左上方的控制点 $(70,170)$ 的牵引。结果便是曲线先向左侧外扩,随后向左上方收束。到达角尖最高点附近时,L65 95 封闭角的顶端,再用 Q85 145 145 180 画角的内侧边缘。右侧角就不用说了,是完全镜像的。
+
+### 更复杂的 SVG
+
+到这里,你或许会想,这样写 SVG 好累。我不否认。人类的大脑并不擅长于直观构建二维坐标系内的形状,尤其是过于复杂的形状。一个解决方案是使用更抽象的工具:可视化矢量图形编辑器。
+
+我高中时学习了 Adobe Illustrator 的使用方式,或许其他的编辑器也是一样的。绘制路径时,往往都会有操作锚点、控制手柄等工具。底层图形引擎会实时计算这些交互动作对应的绝对,或相对的坐标,并能够精准地生成所需的二次,甚至是三次贝塞尔曲线指令。
+
+不过 Adobe 的东西都很昂贵。Inkscape 是开源的替代品,可以尝试。据说 Figma 也能够绘画矢量图形。它们都可以将结果导出为标准的 SVG 代码。
+
+如果想要画重复性高的 SVG 图形,也可以通过编写脚本来动态连接路径数据。比方说 d3.js 这个项目,就能实现一个很有意思的 例子。
+
+再就是,在传统开发模式中,SVG 往往被视为等同于 PNG 或 JPEG 的静态外部资源。一旦在矢量编辑器中完成绘制并导出为 XML 代码,其内部的节点结构、填充颜色、描边参数以及路径坐标种种,都被硬编码锁定了。
+
+怎么解决呢?现代前端开发体系,比如 React 和 Vue,引入了组件化封装与声明式抽象,本质上是将静态的 XML 标记解析为虚拟 DOM 树上的节点。这样的话,SVG 就被包装成了个能够接收外部参数的函数或类组件。
+
+## 链接
+
+=> https://news.ycombinator.com/item?id=46618714 帖子
+=> https://www.newgrounds.com/series/reincarnation NEWGROUNDS 平台
+=> https://svgpocketguide.com/ Pocket Guide to Writing SVG
+=> https://github.com/d3/d3 d3.js
A posts/奶茶店毕业.gmi => posts/奶茶店毕业.gmi +40 -0
@@ 0,0 1,40 @@
+# 奶茶店毕业
+2026-03-14
+
+早在 第一篇月刊 里,我就说过去年八月份我找了份兼职,主要是得快速还笔钱。这一做就是半年,而在二月份我提了离职、逃跑了。
+
+先从最开始说起吧。当时我的银行账户已经支撑不起我日常的吃喝拉撒了。就算是和室友合租,有父母给的几百块生活费,不欠钱活下去依然很难。不得已,我只能将开发项目的时间分出来,花费在打工上——那会儿连公司都没有被注册,项目跟个人项目没有什么区别,更别说赚钱了。
+
+粉领工作虽然赚得不多,但胜在成本低,不需要培训很久就能上岗工作。尤其是我在大一时就做过奶茶店的兼职,去新的店里工作学习很快。于是我在网上找各个招人的店,一个个联系过去——有些人无视了我,有些人问了我点问题后就不回我了…最后只有家附近的一家本地知名奶茶品牌的店同意让我来培训。
+
+因为隐私还是得要的,这个奶茶品牌是什么我就不说了。
+
+奶茶店的员工要做的事情并不算多:做前台收银、摇奶茶、补货、开店闭店,如果店里提供小吃的话做小吃——这种小吃多数以甜品或者炸物为多,我去的这家店没有甜品,只有炸物,做起来也方便,丢到油锅里炸即可。
+
+经济情况从某一年开始,从来都没有好转过。Trump 第二次竞选的时候,就有大量认为民主党搞坏了经济的老白人上网支持 Trump,认为他可以让美国的经济再度伟大。实际上,什么也没有变。说到底,一个联邦的总统怎么可能一下子就改善整个经济体系呢?人们是住在地方内的,地方有自己的官,地方外的州也有自己的官。人们总是将希望寄托于一个人,听信政客们的承诺,最后只能活在比过去更痛苦的生活中。但也没有办法,除了相信这些系统的明面指定人,还能去相信谁呢?
+
+在蜜雪冰城来到纽约之前,奶茶大致可以分成两种:没有品牌的,和有品牌的。没有品牌的奶茶,估计只有三四美元吧,通常都是广东饼店用粉冲泡的,成本本来就很低,味道只能说能喝就行。而有品牌的,价格会高一些,目前来看市场价得在六七块钱之间,只说最经典的珍珠奶茶。这里有一些用的依然是粉,只是粉质量更高,虽然我喝的话只能喝出来恶心的粉味儿,和没有品牌的奶茶没什么太大的区别。如果是标榜自己用真奶的品牌,价格还得高一些,我喝了不会觉得肚子痛,但为了钱包和身体健康还是少喝为妙。
+
+奶茶店除了奶茶,卖的东西还有水果茶:多数都是使用果酱或者水果风味的糖浆。能用得起真水果的,很少很少。我大一兼职的那家奶茶店,就有使用真水果,但是其他店员都不会检查它们的质量,导致我每次上班就要清理大量腐烂、长白毛的水果,恶心死了。没多久,这家店便倒闭不做了。
+
+那么蜜雪冰城对本地的奶茶品牌造成的影响有多大呢?大杯的奶茶或者百香果果茶,只需要两三块钱,花没有品牌的奶茶所需的钱,喝到了有品牌的奶茶的质量。可能会有人说蜜雪冰城也没有那么好喝吧,问题是两倍价格的有品牌的奶茶,不见得有好喝多少。我就不一一点名了,纽约客或许会知道我在说哪些品牌。
+
+奶茶店的生意如何,和地段有很大的关系。繁荣的地段,尤其是约会圣地、有着逛街氛围的地方,奶茶店就是很容易满座。学校附近也不错,学生们多数喜欢放学后来喝杯奶茶。如果组团一起来,还会点小吃一起吃、聊聊天再回家。
+
+不过这家店所在的地段有些特殊,它算是一种住宅区,老人偏多,还有许多流浪汉。尽管附近有足足三所学校,但是有实际购买能力的只有大学生。要问我为什么知道,因为另外两所里,一所是小学,另一所是高中——我的高中。这家高中的同学们,都不住在附近,而是住在坐地铁半个小时远的、低购买欲住宅区。有零花钱时不时买奶茶喝的,并没有那么多,这里的另一层原因是「奶茶很贵」。
+
+这家店的老板和经理是对夫妻,对员工的要求很高:穿着好看、外貌漂亮、做事认真、年轻能干、不能属鸡。要求高重点在于「做事认真」和「年轻能干」上,比方说他们会定时看监控,看员工们是否在玩手机。其实这也还好,对比一位朋友兼职的店,那边的经理还会偷听员工们聊天。如果有人抱怨很累的话,就会打电话过去质问。好恐怖喔。
+
+他们最让我讨厌的点是动不动就言语攻击。有些事情明明不是我的问题,有些甚至会是他们的问题,他们却会时常说我这个说我那个,听着很烦。所有的线上交流都是通过电话或者微信——都在海外了也要使用微信吗,腾讯的影响力可想而知——而微信群聊,通常会变成公开的处刑场。他们会公开艾特要挨骂的人的账户,接着一大段文字发过来,有时是很直接地训斥,有时则是阴阳怪气。但是被挨骂的人,也没有真的做错什么,很多时候都只是因为信息不对等的问题,而不知道要做某件事而已。
+
+不过作为严厉的奖励,这家店的卫生条件和责任心不错。
+
+迫使我离职的原因也很简单:在这家店里继续工作下去对我的精神状态不太好。工资不过是最低薪水的标准、小费拿不到、员工餐也没有,还要和这两尊大佛相处。再加上这家店所在的地段,先前说过,是一个特殊的住宅区,因为它也在另一个金融区的角落,周围还有地铁站,所以租金不低,但客人就是没有那么多。为了「降本增效」,这家店缺人,俩大佛也经常迟到,或者干脆不来、让其他员工临时来工作顶上。
+
+要知道,小规模的奶茶店一天只会有两个人在,只有一个人的话,是很难同时顾得上前台收银、摇奶茶和做小吃的。我因为他们的迟到,已经吃过许多亏,那些时候我只能绷紧神经,一个人处理店内所有的事情。这里最麻烦的是接单,因为客人们点单的速度很慢,而根据规矩,有客人进来就必须先接单。有时候柜台上已经积累十几单还没开始处理,前台却还有一些客人慢吞吞地在点单,旁边站着已经点了单的其他客人、盯着我看。我能怎么办呢?要是想退款的话,就退款吧,反正我做多少都不会影响到我的工资,老板少赚也只会是老板活该,可怜的只有赶时间的客人。
+
+有位老员工,便因为这件事受不了、早我一两个月离职了。走之前他说,你的底线在哪里,我的底线在这里。
+
+他走后,压力便到了我身上。其他员工都是学生,还有实习什么的,一周内能来上班的次数很少。我因为一学期里要做的事情不多,反而要上更多的班,一个人扛住压力。这些压力明显不是我能承受得了的,但就算是那个时候,除了被说「菜」外,得到的反馈也只有「我做事不认真」,尽管我根本不知道哪来的「不认真」,我能做的都做了。
+
+提出离职那天,感觉一身轻。这半年来收获许多,其实一个月过去,已经不记得自己当时有多么不舒服,只记得自己很愤怒。这些情绪都被记录在日记和聊天记录内,再来看的时候反而觉得陌生。
A posts/没有情人的情人节.gmi => posts/没有情人的情人节.gmi +67 -0
@@ 0,0 1,67 @@
+# 没有情人的情人节
+2026-03-15
+
+室友上个月主持的 活动 里,我忘了说一个话题。不过正好也可以借此说一些我的观点。活动那天是情人节,而提出者说:「人们不需要恋爱关系。」
+
+提出者会提出这么有争议性的话题,很有这个人的风格。这个观点也是他常常挂在嘴边的,就我看来更像是一种警戒——谁知道呢?因为本文的主角并不是他,我就不深入他的情况了,只会简单解释一下他的观点。
+
+顺带一提,我在阅读 Spike 最新出炉的 Zine 的时候(我好想念这个系列),看到了这句话:
+
+> 我过去使用了太多的限定词和冗长的短语。那是我口语的直接翻译,事实证明,这是一个糟糕的写作策略。如果你的目标是让别人阅读 ⸺ 并且希望他们喜欢 ⸺ 你的文字,你应该努力编辑你的想法。
+>
+> 以下是我当时几乎在每个句子开头或结尾都会添加的无用短语样例:
+>
+> - 我认为……
+> - 我觉得……
+> - 我相信……
+> - 对我而言,……
+> - 感觉就像……
+> - 似乎……
+> - 在我看来……
+>
+> 刚开始写作时,这是我的最坏习惯。这种废话只会让读者疲惫不堪。在观点文章中任何地方加上「我认为」都是多余的。
+>
+> 使用这种「谨慎」的语言只会让你的观点变得软弱无力,以至于无法引起争论。如果你用「我觉得……」开头,那么后面说的任何话都没人能反驳,因为这只是你的感受。读起来实在乏味。
+
+说得真好!好的想法可以立即让人反思自己。所以我之后会很少使用这类短语。这意味着我的文字会听上去像是在陈述事实,但并不是这样,一切都是观点。或许是时候该写一个 /glossary 页面了。在 Eltrac 提出这个概念 的时候,我就有考虑去写,但一直拖延没有这么做。
+
+回到正文吧。
+
+-----
+
+提出方的观点在于,人类需要物理接触,这包括拥抱和抚摸。但在众多文化中,异性——或者同性,如果对方将同性恋放在眼里的话——之间做这些行为会被认为是浪漫的,从而认为只有恋人可以做这些。如果可以随意在物理上接触他人,或许许多恋情也没必要存在了。
+
+这么说的原因在于,许多恋情的本质其实仅仅是「连接」。人们渴望陪伴,只是单纯地想和某个人多待在一起。但在有限的社会标签下,人们往往会误将这种对深度连接的渴望认作是「恋爱」。为了合理化这种物理和时间上的亲近,他们选择了「在一起」,误以为这就是爱情,随后便无可避免地被卷入了以「结婚」为最终目的的传统轨道。
+
+恋爱实在是个过于复杂的话题。人们到底渴望从恋情中获取到什么?是理解吗?是关怀吗?还是性需求?貌似除了性,朋友们也可以提供这些东西。当然你要是个愿意找炮友的人,那性需求也可以被满足。
+
+然而,社会将恋爱美化得太严重了,好像没了它,人就是不完整的,是失败的。
+
+朋友甲说的「恋爱关系」,其实可以看出来,专指被社会标签化过后的「恋爱关系」:人们以结婚为目的,决定一辈子都要在一起后,怀孕生子、将两个家庭融合在一起,度过标准的一生。
+
+结婚是我和朋友们最讨厌的概念之一。比如朋友甲,因为是个法律脑袋儿,所以他认为婚姻的重点在于「共享资产」。他不相信婚姻的契约,认为那只是将二人强行绑定在一起的说辞——毕竟如果有心的话,二人不结婚也可以一直在一起。又由于他是个不喜欢遵守「社会规则」的人,「不结婚生子不行」的观念在他这里也行不通:老了可以花钱请护工,怕护工欺负自己那就培养类似于徒弟或者养子或者信徒——他有信心做到这一点。只要有钱和人格魅力,就可以规避通常人会认为只有结婚生子才能做到的事情。既然如此,为什么要花费精力和人进入恋爱关系,然后将自己的生活搞得一塌糊涂呢?
+
+传统婚姻或深度恋爱关系之所以成为主流,很大程度上是因为它是一种打包方案。人们将情感支持、生理需求、经济合作甚至养老保障全部集中在同一个人身上。这种做法降低了前期的交易成本和维护难度,但假设伴侣变质或背叛,个体的整个生活运转就会面临全面瘫痪,这也是为什么朋友甲选择不进入打包关系,而是将需求分散给不同的关系,例如朋友。
+
+值得说明的是,他并不否认人类渴望且需要亲密关系这一事实。他真正反对的,是将「亲密关系」与被社会标签化的「浪漫关系」强行画上等号。深度的友谊同样可以通过长期的摩擦建立起坚韧的羁绊,提供不可替代的情感支撑与连接感。既然亲密并不专属、也不必然导向爱情,这一切就完全可以在剥离了恋爱与婚姻的传统叙事后独立存在。
+
+当然也有另一部分参与者不认同这个观点:爱情就是人生中不可缺失的一环。亲情要,友情要,爱情也要,这才是健全的人生啊。况且能够亲密地抚摸对方,不道德、不知羞耻!
+
+朋友甲所反对的人生并不是错的,我也不觉得他推崇的人生是所有人都能做到的。但「标准的人生方式」早就应当不再成为任何人的束缚。我已经看到过太多,为了「普通」和「正常」而强行过上这种生活的人,他们的人生是如何被一步步毁掉的。如此之多的案例,不得不让我去思考这种生活形式的正确性——说不定,它其实已经不适用于现在的人们了。
+
+三月份的「那些不受欢迎的想法」活动会照常举行,我依然没有打算出席,自然也不清楚这次都有什么有趣的想法被抛出。不过我知道其中一个人(朋友乙)的话题,这和 momentum 有关。中文翻译过来叫作「动量」,也就是物理学中常说的牛顿第二定律。如果用大辞泉词典去查这个词的话,会发现它在日本还有个意思:惰性。
+
+过去的一切,社会的规矩和经验,都形成了庞大的动量,在人准备前进时,推动着人。你会被推进得很快,人生也会看上去顺利起来,但这不是你的力量,这是惰性。你只是又一次遵循了前人的脚步,走在已经踩平的路上。这时候,再有人想去走隔壁的草丛,想必都会被认为是个怪胎吧。
+
+朋友乙说,这个世上到处都是受动量驱使的人们。过去我从社交网络上听到过一个类似的概念,叫作「空心人」。这种人对于事情的看法只有一个标准,那便是他们认为的社会标准:「普通人不会这么做」、「普通人应该这么做」。事实是,世上没有「普通」,只有「普遍」,而「普遍」不等同于「正确」。
+
+自然,「空心人」这个概念实在是过分傲慢了,毕竟不能因为对方做的事情和你不同,就如此贬低对方吧。但这也让我思考,人们做一件件普遍的事情是为了「正确」,还是为了随波逐流?说到底,究竟有多少人知道自己现在在做的事情,是出于自己想这么做,还是认为自己应该这么做呢?要知道,被无数人追捧的标准人生,从来都不是为了确保每个个体的幸福而设计的。
+
+我有一位有些讨人厌的朋友丙,在和朋友甲或者朋友乙接触时,喜欢说这句话:But it's not normal. 但问他什么是 normal 的话,他也答不上来。毕竟 normal 就没有一个准确的定义,它是一种被无数人臆想出来的存在,是主观的集合体。你就算过得不是个 normal 的人生,你也不会死。虽然会受到社会部分人的谴责,但也会有另一部分支持这种生活习惯的人在。如果不想要去能够容纳自己的群体中生活,转而改变自己的生活方式,从而获得已在群体的支持,亦或者根本不去考虑这种事情——这不就是具有毁灭性的惰性吗?
+
+情人节到底该不该有情人?有多少情人又是包装成「情侣」的朋友呢?看来我的问题太多了。
+
+## 链接
+
+=> https://taxodium.ink/47.html Zine
+=> https://www.geedea.pro/essays/on-wording/ 提出这个概念