Stelpolva Write

Reader

Read the latest posts from Stelpolva Write.

from utena

用了flomo那个“找一找”ai功能。 我:找一下我对于时间管理和人生信条的看法。

【最新一条】 2024-02-26 19:58:07 #Diary/历史遗留问题

首先是,我过去(高三)反复对自己指出的,互联网novelty固然让人愉快看起来也不是完全无用,但就是对需要时间管理和目标管理的生活方式极度有害,害处大过益处,碎片信息随时能摄入但事不是什么时候都能做的。

其次是,只有,唯有,你努力地去做了时间上的估计,你才有可能看出,自己到底能不能在考试之前完成学习任务,是否需要加快节奏还是有放松的余裕,是否需要暂时舍弃生活中的一些部分,是否需要努力提高效率。

卧槽,但我还是想想就会觉得,有必要吗。

底线是每天晚上对第二天进行估计。

【二】 2023-01-26 18:06:18

2023-01-26 16:46:58 人的天性是把发生的事情讲成连贯的故事。因此,我总想把我的失败,我从初三持续至今的失败,讲成一个清晰的故事。

#Retrospection

事实是这样的。高一寄宿期间,我回到宿舍以后,会拿着kindle读小说,但也有很多时候,是在努力学习的,有在各种做题。高二乃至高三上学期,回家后的绝大多数时间都在刷微博、看视频、读同人。绝大多数时间。而在两个暑假,三个寒假,以及各种大小假,和网课期间,我也缺乏①目标感②时间管理③自控能力。

花在微博、视频、小说上的时间总是像凭空消失了一样,假日里一天的十小时,累积起来实在是一笔巨款。

但凭借模糊的印象,我或许可以相信,随着年龄的渐长,情况有稍稍增进。也许是,也许不是。

#Retrospection

【三】 2023-06-08 23:23:06 #Diary

英语C篇讲数字极简主义。有点感触。道理大家是懂的,有多少人回头呢?

把时间花在真正beneficial的活动上。这本书找来看看。

小红书对我来说,不失为一种获取信息的方式。

但是如果眼睛、手闲不下来,吃饭的时候总想看点什么的话。不是一个好现象。这恰恰导致注意力碎片化。

是啊,明明想要打开flomo写完这点感触,却还是不安分地想去碰其他app。newport提出high quality leisure,我如此赞同,想到自己的板绘梦。high quality leisure please ......更好地恢复精力、激发创造力、well-rounded、幸福、宁静、productive......

【四】 2023-06-10 21:21:42 #Diary

时间是最最宝贵的财富。唯有将时间转化为自己的能力、转化为别人愿意为之买单的价值,才能生存下去。

我看到有人去会馆锻炼身体。应该有很多男生打算减肥吧。而我呢?想着要减重增肌,还没有行动起来,真是太懒惰了啊。

我觉得……那个生涯规划的专业水平堪忧。但至少可以帮我填表对不对。

怎么样提高谈话能力。

【五】 2023-06-15 00:09:40 #Diary

要做的事太多,急需时间管理和目标管理……

碳水蛋白控制啊啊啊

先睡了。

【六】 2023-06-16 23:57:30 #Retrospection

时间管理和知识管理都太难了,不是我的智商能承受的。

而像那些长年累月控制电子产品使用的人,当然能比我容易一万倍地找到起床后做的第一件事。

看看你脑瘫的样子感觉也是蛮可怜的,每天都得看别人的微博才能找到动力。

你知道自己想要什么吗?你知道怎样才能得到吗?

【七】 2023-07-08 22:32:46 #Diary

跑个3公里居然也只耗了11%的电。

基本上跑的过程中情绪比较负面,觉得自己实在很废物,但慢慢走回来的路上还想了蛮多的。

为什么缺乏动力?想到了高三时个人复盘很喜欢用的词 “自我评价”,因为体重反弹且达到了史高+练完车到家吃了半包薯片和芒果圣代+体能明显衰退 对自己的评价很低,自然也没有内驱力。想起最近学到的神经科学豆知识,内驱力大约与dopmine相关,那么我这样一段时间以来的不自律生活自然会导致多巴胺抵抗,于是就没法完成困难的事情。

今天刚看过BB的视频,又想为什么韩国人能把自己往死里卷,其实还是名为习惯或者说routine的力量在起作用吧,就像我到了高三对于上一整天课这件事已经麻了,不像高二那么盼下课。

健身比较困扰的是晨跑后出大量汗,还要回到宿舍里洗澡更衣,再重新出门,有点劝退的。洗澡的话就涉及到早上是否有热水供应的问题。我自己有个想象中的解决方案是,是否专门的运动服(吸汗),脱下来直接用浴巾擦拭一遍身体,休息一会让身体不再发热,更衣。毕竟跑步出的汗并不黏。一种可能性吧,还得根据实际情况调整。

所以我突发奇想地计了个时,发现原来我吹干头发只需要90秒,我顿时就没有懒得吹头发的情绪了。另外,为了督促自己在懈怠之时发展兴趣爱好而不是玩小游戏(之所以滑向后者是因为路径简单并惯习),我就应该明确步骤(或者说拆解流程?)【把绘画教程放在收藏夹栏。拿空白本子+铅笔,单击打开课程】

我此时此刻的生活并没有比高三生活幸福很多,可见决定生活质量的是人是否能成为时间的主人。柳比歇夫50年纸笔记录时间去向没有间断,我们这些拥有数字工具箱的人怎么可以懒惰。他有毅力去持续不断地记录本身就说明他能够管理时间。唯有管理了时间,才能保证个人时间。这个道理我当然不是第一次明白。

130斤的脸果然比120斤丑多了。

由内驱力想到外驱力,参见这条MEMO 举例:如果我每天坚持跑至少3公里(这并不困难),7天后我的体重肯定能减轻2斤,四周后就是8斤。比较粗糙,可以细化,重要的是方法论、激励效果。

下面黏贴牛人语录,自勉!

我每天都跑步,十多年不断, 再忙也跑步,这是我生命的一部分!压力大的情况下,尤其要约束自己的行为。你要考虑放纵的后果。对于必将会后悔的事情,现在就不要做。比如吃饭,我不吃垃 圾食品,不吃批萨,因为,if I eat Pizza, I cannot run! 现在我就是再忙,也自己做饭,保证合理的饮食和健康的习惯。

有运动习惯的人就是这样,你不是有意识地下指令,而是顺应身体的需要。让你的意志跟着身体走,而不是身体勉强服从于意志!为了不让生活起冲突,你必须安排时间!

【八】 2023-10-12 15:31:08 #Retrospection

所以说为什么我会囤积那么多与时间管理有关的东西:我有计时器,有滴答清单会员,观看过很多方法论视频和文章。我2021年7月开始写日记,正是因为我深陷痛苦之中,想用日记本来管理自己,想用持续不断的书写和翻阅来提醒自己......我写下来了,用笔迹的形式保存在纸质载体上,我也有很多电子文档的记录.....可我的经验依旧是断裂的,那些难过到想死的时刻产生的念头,找到的解救办法,都被我遗忘了.....一遍又一遍地陷入同一个困境中。

【九】 2023-11-22 15:04:57 #Upgrade

对时间管理——柳比歇夫式的——思考。

只是为了确保自己在一段时间内做出了正确的事。

 
Read more...

from 食肉菌

找个地方存一下人家的游戏流程,方便以后发给别人/自己参考!

前言

攻略推荐和思路 我提前参考学习了这些攻略:(我觉得对想玩高难度的新手来说很有用!推荐给大家)

施法者玩法入门讲解 主角build推荐 队友build推荐 不公平难度前期流程 商人和值得购买的商品 圣教军模式下圣器装备效果预览

在这些内容的基础上,根据Owlcat的更新改动和我自己的游戏习惯做了调整。

高难度下最好在开卡前想好想走的道途,选择和道途更相配的职业可以降低后期难度,比如经典搭配:天使圣使、巫妖法爷、诡计大师剑圣。我打算走灵使,选择了有奥法契约能力的术士配合灵使的刷新球(但很遗憾,我玩的时候游戏在大更新后出了新bug,自发施法者无法使用奥法契约)。

不公平难度下,尤其是前期,我会使用一些手段(比如毛经验和频繁sl等合理作弊法)来尽快提升战斗力并规避不想要的事件、一边购入一些低难度用不着的东西一边抠门地使用物资、根据队友战斗力与队伍搭配而不是个人喜好与剧情内容来选择要带的队友……难度更低的话没必要照抄。

毕竟是给人看的流程,会尽量做到全收集。应该只会跳过一些不是打不过但打起来实在恶心、没有好奖励也没有相关剧情的小怪。

开卡和毛经验

开卡 懒得自己再想一个主角出来了,选择了拥王者里奥克塔维亚的立绘和信仰

职业:术士-探寻者

种族:半精灵 有魅力加值

加点:14 12 14 10 22

技能:隐匿,沟通,世界 当时预计成型后的攻坚队伍配置是席拉兰恩山茶索希尔聂纽,因此技能要补上队友大概没有的隐匿,剩下两点是为了在岱兰第五章任务里骗它者和扎营做饭。

专长: 法术专攻-塑能 法术专攻效果:对应学派法术豁免难度+1 点塑能主要是为了打输出。 法术专攻-咒法 打控制,聂纽已经专攻幻术了,聂纽控不住的让主角用咒法控。 前期好用的咒法:油腻术、闪光尘、臭云术、次元陷坑……后期有aoe津波,如果有机会或许可以爽一爽。

额外能力:奥法血承-奥法契约 作用是回复指定法术的使用次数,可以提升术士施法的灵活性+后期搭配灵使的刷新球。

出身:扒手 图的是先攻+2

法术:油腻术,渐隐术 人家一般更喜欢出生就选魔法飞弹,但奥法血承3级会送魔法飞弹,就不选了。缩小/变巨/法师护甲也是好东西但其他队友也能上,护盾术目前也没必要,其他控制类法术也不想学了,术士能学的法术有限。

初始阵营:混乱邪恶 为了第二章更有可能戴上限制非善良阵营的装备【德莱文的帽子】(赠送每天一次法术瞬发;智力+2亵渎加值),等戴上了我再彻底放开来选善良选项。

最终角色卡:

所谓“毛经验”的方法 进游戏之前就在难度菜单勾选上仅活跃伙伴获得经验,在新队友马上要入队(对话框可以选结束对话)时,打开设置,关闭仅活跃队友获得经验选项,使新队友和主角的经验同步,对话结束新队友入队后再马上重新打开此选项。直到队伍满六人,之后就一直关闭此选项。

序章

战斗前tips

  • 如果想做飞升剧情,要在应对德斯卡瑞时选择战斗(而不是防御)
  • 见到席拉和安妮维亚,记得开关【仅活跃伙伴获得经验】哦,对话和场景中的技能检定一定要通过sl保证成功,不公平难度下每一丝经验都很重要!如果检定成功+毛经验操作成功,席拉入队后主角和席拉的经验应该都是1038/2000
  • 再往前捡到了一些装备和特伦迪利弗的鳞片。披风给席拉穿上,其他的都可以日后卖钱(可以留一把给主角用,我术士主角就没必要拿了)。从现在起要保证包里至少有一个鳞片,直到日后把鳞片给说书人看。
  • 遇到柯米丽雅(今后都叫山茶了)也记得毛经验操作!入队后三人的经验应该都是1413/2000。然后存档,接下来要战斗了
战斗
  • 队友的命中率会挺难看的。遇到兰恩和雯朵格之前,战斗的思路是:通过延后其他队友的行动次序,使ac最高(也就是最不容易被普通物理攻击命中)的席拉第一个行动(记得开启席拉的防御式攻击),拉住敌人。通过调整队形和走位,尽量使安妮维亚在第一轮就加入战斗,让四级的安妮维亚射死敌人。(最好辅以致死量sl让大家再少掉点血)
  • 高难度下我比较喜欢玩回合制,不嫌麻烦的话最好关闭【自动结束回合】,整轮攻击后五尺快步、施法者放法术之后再瞬发法术等操作,都需要关闭这个设置。
  • 打死王蜥之后再存一下档(前面当然是每通过一个小战斗都f5快速存档一下),要遇到新队友了

  • 遇到兰恩和雯朵格

  • 和兰恩与雯朵格对话,如果没有rp需要,可以先选【2. 我为什么要告诉你?】,这样后续对话会有察觉检定,通过后额外获得每人92经验。这样结束对话后队内三人应该都可以升级了,经验值是2037/2000。(升级后再与场景内物品互动,通过检定的概率会高一些)

  • 接下来是拔剑剧情,如果没有rp需求,可以选怒斥叛徒+惩治恶人,获得英雄气概buff,使后续沟通检定更好过一点。对话后兰恩雯朵格入队,目前经验是2349/5000。

  • 我主角是远程,队伍相对缺强力近战,所以会先选雯朵格打序章(给雯朵格的加点就只考虑序章强度),再在序章末尾选兰恩(给兰恩的加点就不考虑序章过渡了)。

  • 2级加点 主角:职业不变,技能点的还是隐匿、世界、沟通

    席拉:受诅巫师,察觉、灵巧(防止借机攻击)、使用魔法装置、宗教,如果主角没点沟通也可以给席拉点沟通。野兔魔宠,冻皮,跛足,缩小术+法师护甲(序章就可以自己上buff了) 席拉升级之后记得在能力栏手动激活野兔魔宠

    山茶:职业不变,巧手、灵巧,避灾

    兰恩:不公平难度下禅宗射手的命中不太够看,所以转近战拿无敌的斩矛。战士-突变斗士,运动、自然、察觉,猛力攻击

    雯朵格:游荡者-大盗(为了要害打击),运动、灵巧、察觉(后两个都可以换)

    继续战斗

    • 兰恩雯朵格入队+全员2级之后,主角队就能打出一些输出了,主要的大腿是雯朵格的要害打击:
    • 碎石堆后的小型土元素攻击加值比较高,打不过的话同样可以调整走位让安妮维亚进战斗甚至在第一轮挡刀。也可以让山茶给雯朵格上了变巨之后进战斗,主角先丢油腻术控土元素,再给雯朵格渐隐术,也能过。反正到混种人部落之后可以休息,有什么法术都可以用在这里。打赢获得一个治疗轻伤魔杖(实在打不赢就算了,亲测不差这点经验)
    到达混种人营地
  • 到混种人营地之后自动获得疲劳状态。和酋长对话,如果展示天堂之光,剧情结束后小队经验是4335/5000;如果不展示,经验为4635/5000。这里为了经验选择不展示,更低的难度下没必要这样做,可以从rp角度自行选择(我这样选择的结果是序章部分雯朵格入队、兰恩离队)。
  • 对话后扭过头与霍尔格斯对话,sl通过交涉检定,成功预订进入第一章后重要的启动资金。
  • 然后搜刮完整个营地,和商人【黛拉】对话,卖出所有垃圾(可如图勾选),如果队内没有不死生物的话【造成轻伤】卷轴也可以卖,购入卷轴【英雄气概】、【朦胧术】,其他的看情况买吧,我买了祝福术+额外一张朦胧术+油腻术睡眠术各一张+法师护甲药水+防护邪恶、混乱药水+寒铁弹药箭筒,剩下的钱都买了治疗轻伤(有些最后也没用上)
  • 接下来根据剧情要休息,休息之前先调整法术,给山茶记变巨术+防护阵营×2+祝福术,然后休息
  • 休息后兰恩离队,走雯朵格指的路到盾牌迷宫门口,不急着进去,先把地图右侧的王蜥杀了拿经验,后续宗教巧手等检定同样通过sl保证全部成功,拿经验。

  • 盾牌迷宫1

  • 遇到第一波敌人,依旧保证席拉走在最前面+队友内第一个开始行动,t住,山茶给席拉上避灾,雯朵格用要害打击一个个杀,先杀法师。担心打不过的话,山茶上祝福术+给席拉上防护邪恶,给雯朵格上变巨术,席拉脱下盔甲给自己上缩小术之后再穿上盔甲。

  • 在黛拉那里买的卷轴和药水先不要用,之后打boss和精英怪再用。法术用完了就休息,盾牌迷宫内不限制休息次数,通过sl防止休息时被敌人偷袭。后续都这么打。

  • 上buff后不急着捡东西,先清敌人,buff效果消失再一起捡战利品。

  • 主角在背包栏阅读这本书,可以获得特殊加值。今后遇到相同分类下的书也都可以读,基本都能学到加值

  • 打到这个程度之后的经验就差不多可以升3级了,地下的腐化混种人暴徒难打先不打,水元素也先不打,留着后面再来。超重可以把装备扔地上,最后再一并捡起来卖给商人

  • 3级加点 主角:技能加点不变,法术专精-魔法飞弹;刺耳尖啸(塑能系,之前选了塑能法术专攻所以选这个控人)

    席拉:武僧-传统武僧(比普通武僧+2意志豁免),灵巧、宗教、察觉、使用魔法装置,精通先攻(为了抢在敌人之前攻击,获得防御式攻击的ac加成)、鹤形拳(配合防御式攻击)

    山茶:技能加点不变,武器专攻-细剑

    雯朵格:杀手,熟练偷袭者

    • 升三级之后可以休息一下再继续(我到这里是第一次休息),休息之前记得给山茶记法术,二环记树肤(给席拉)、鹰之威仪(给席拉)、牛之蛮力(给雯朵格)

    盾牌迷宫2 只说值得注意的点/不好打的地方

  • 有凶猛王蜥的房间,可以让主角给雯朵格渐隐术、雯朵格用要害打击打措手不及,一箭一个

  • 捡到复合长弓和寒铁精制品长剑之后记得给雯朵格和席拉换上

  • 黄蓝红黄,获得辉光

  • 分别打两个腐化混种人暴徒的地方,打法是上满全套buff之后席拉t住,有隐匿/渐隐术的雯朵格射他,其他小兵在满buff状态下不难打

  • 打完可以再休息一次然后打水元素(实在打不过也可以放弃,依旧实测不差这点经验,如果你有dlc4就更不差了)

    • 打水元素前准备: 席拉buff:缩小术,虔诚护盾(药水)(席拉自带一个,序章可以捡到两个,省着用),树肤,抵抗寒冷药水,朦胧术也可以上一下 雯朵格buff:变巨术,雯朵格身上自带一瓶猫之轻灵药水,也可以喝了 全员buff:祝福术
    • 一开始是席拉接近水元素,山茶不用动,主角和雯朵格走到能打到的位置就够了
    • 第二轮开始席拉t住,山茶不断给席拉上避灾,雯朵格要害打击,主角不断给雯朵格上渐隐术(这样雯朵格的攻击检定要过的是水元素的措手不及ac而不是普通状态下的ac,更容易命中),渐隐术用完之后改对水元素用天使之光。这样每轮射十来点伤害,就过了
  • 打完了把东西捡捡,这下是真的只剩boss了

  • 盾牌迷宫boss和后续

  • 打boss之前可以先把雯朵格身上带的药水什么的扒下来,一会儿她就离队了。可以再休息一次然后再上一遍之前说的buff,打不过的话也可以把买的卷轴用了。

  • 到boss房之后,选天使选项可以在第一章的伊斯绰德塔获得天使之貌(给元素抗性),这里为了抗性选了天使选项,低难度没必要,可以rp

  • 开局席拉第一个行动,辟邪斩+冲锋。然后主角往霍西拉脚下放油腻术,豁免难度18,对面反射豁免8(反正我是控住了)。控不住其实也无所谓,对面打席拉是很难命中的(如图2),第一轮席拉ac有冲锋减值-2所以对方roll到18才能打中,之后更难打中。

  • 第二轮开始就又是主角给变巨雯朵格上渐隐术,射她。上了辟邪斩的席拉命中率高一些,可能也能打一些伤害。我运气比较好,第二轮雯朵格射完箭就打出后续剧情了。

  • 然后出现两只怪似魔,席拉t住靠脆皮主角更近的那个,另一个离兰恩近,兰恩会t一下,随便打打就过了,兰恩倒了没事,会复活的。

  • 打完之后让兰恩入队。把垃圾都卖给黛拉,捡到的决斗剑和标枪,如果主角不用的话,也可以卖掉。目前经验6747/9000,金币5203(卖了盗墓者盔甲和+1防御护腕),可能会比正常状态高点的,因为休息时遇到了营地遇袭

  • 兰恩升级加点:突变斗士,运动、自然、察觉,顺势斩、强力顺势斩。换上霍西拉掉的恐惧进击。

  • 上楼之前又休息了一次(不记得上楼会不会自动回复法术位了……)

  • 离开盾牌迷宫进入灰兵营

  • 上地表直到遇到伊拉贝思之前都不需要上buff,之后也可以不上,走在队伍后面,不加入战斗,让伊拉贝思和其他士兵在前面打,同样可以拿到经验。

  • 上楼之前记得把地上的东西都捡了,这也是第一章的启动资金。然后上buff,存档,上楼直接开战。npc负责左侧,我们打右侧,远程优先打右侧塑能师(因为ta经常瞄准主角打),席拉和主角对避灾需求不大的话,山茶也可以上去砍两下杂兵。

  • 右侧有会放臭云术的赘行魔,嫌被控难受的话,可以在快进它视线范围内的时候停下来,等伊拉贝思那边的人打完左侧过来替我们吃。或者其他人在后面等着,席拉先上去骗它出招。总之这段战斗的重点不是输出而是少掉血。打完这层之后,还是不急着上楼,把东西都捡了,超重也要捡(难度低没必要)

  • 捡完上楼,buff这会儿应该还没消失,就不用再上。又是一群小怪+臭云术,接着打,打完还是捡了东西再上楼,墙上的检定可以sl过一下。我的打法:席拉抢到先攻先冲锋过去了,兰恩第二个冲锋秒了一个赘行魔、使其他敌人进入恐惧状态了,他们在这种小场地跑来跑去很容易吃到兰恩的借机攻击,接下来就好打了。

  • 再上楼就是冥娜蛊剧情杀,摆烂就行,抠门的话可以再捡捡被冥娜蛊杀掉的小兵的装备。剧情过后在酒馆醒来。

  • 第一章

    在铁卫雄心醒来

    • 醒来后和把能聊的都聊了,解锁伊斯绰德塔、提拉巴德的住处,接下来可以自由行动。
    • 走出房间又和安妮维亚聊天,聊完她会走到另一个位置,再去聊天又有新内容,发现丝线工坊、黄玉必应屋
    • 然后和酒馆老板(杰米尔)对话(如果过了宗教暗骰还有5经验),把垃圾全卖了,我把造成轻/中/重伤卷轴和药水也卖了。继续对话,解锁皮塔克斯的酒窖
    • 和伊拉贝思对话,过宗教暗骰又是5经验
    • 和因妲罗对话,选“容我解释一下”,检定成功获得13经验和+1炽焰短剑
    • 和斯陶顿对话,发现黑翼图书馆
    • 和哲瑙弗对话,发现寒溪村
    • 和弗恩·秋雾对话,接任务,世界检定目前还很难过,可以以后再来(没记错的话到市集广场和右下地图区域受伤的精灵对话之后就没机会过了,所以最好在那之前过一下。实在过不了就算了,我就没过)
    • 和霍尔格斯对话,获得2000金币,再次交涉要求更高价,sl成功并接任务
    • 和其他没有聊过的npc(主要是队友)聊天看剧情
    • 来到地下室,从这个角度看,从左到右三个开关是上下下,然后再按最左边的按钮打开密室,拿到+2魅力头带,给席拉戴上(如果现在没检定出来就以后再戴)
    • 和沃尔吉夫对话接任务
    • 把垃圾都捡了,上楼卖垃圾。和伊拉贝思对话,把沃尔吉夫放出来,记得毛经验操作。可以升4级了。

    4级加点 (没写职业/技能加点/法术专精就是和以前一样) 主角:魅力,闪光尘 席拉:圣武士,魅力,宗教、察觉、使用魔法装置 山茶:敏捷,邪眼 兰恩:力量 沃尔吉夫:敏捷,灵巧、巧手、隐匿、神秘(打算之后做卷轴和聂纽互补法术)、察觉,学了克敌机先和猫之轻灵。用卷轴学护盾术(缩小术之后去黑翼图书馆捡卷轴学,在那之前先用药水,不够的话可以买两三个
    继续整理物资

  • 再到酒馆外面逛一圈把垃圾捡了卖了。顺便和乔兰对话给他看辉光(虽然感觉辉光也不是那么有用但鹰头猫剧情做都做了我就配合一下……)

  • 不打算用季斯卡之爪(+1炽焰短剑)的话可以把它也卖了,再拿到2875金币

  • 找牧师购入霜护戒指给席拉戴上,再买一张防护电击(丝线工坊用)、一张共用防护火焰(伊斯绰德塔用)、2级卷轴抄写工具(沃尔吉夫做卷轴用),辛辣油酥饼菜谱也买了一下,还有需要的药水。买完之后包里有缩小术5、变巨术5(可能还买了一些不太重要的东西但我没有记录上)……总之最终出门前的经验是9158/15000,金币58。

  • 出门做沃尔吉夫任务 施工中

     
    阅读更多

    from maki

    记录一次灵感降临的时刻

    1.过程 它真的就是自己冒出来的。 脑子里冒出来几个音并不少见,偶尔也会自带歌词,但像这次这样能很顺地往下写,写完整个主歌,好像还是第一次。

    上午上厕所的时候脑子里冒出来几个音,而且自带歌词(“never thought that…”),上完厕所就拿手机哼哼着记下来了。然后很自然地就想接着往下写,就拿起铅笔在本子上划拉,主歌的第一句就写下来了。 感觉还不错,第二句的旋律跟第一句差不多,歌词就依照第一句想了几个押韵的词,挑个合适的,问问 gpt 有没有语法问题,就定下来了。 第三句的旋律需要有点变化,在前两句的基础上想升高一点于是很自然地就哼出来了。 前面三句都比较密,第四句该留点呼吸,就写了比较短的。

    然后又把这段主歌重复了一遍,但歌词是新的。有一些画面和想法就写进去了,也是写到这里感觉这首歌的主题逐渐清晰起来,有了……抓手(喂)。

    2.感受 这是我写歌感觉比较“对”的一次。所谓比较“对”,就是写的时候就知道“写出来的东西是好的”,而且写的过程不费劲。 之前我一直觉得自己写的东西太短小了,别人写八小节我只能写四小节,听起来就很没内容。这次不知道为什么,没有刻意跟自己说写长一点,但写出来就是想要的那种长度。 顺到我都要怀疑是不是把听过的歌当成自己的东西了……但努力回忆了半天也没想到什么。真的很惶恐…………中间还吃了个午饭,吃饭前还在想会不会吃完饭灵感就溜走了。 为什么会这样,我也解释不了。也许这种感觉会持续,也许不会,我当然希望它停留久一点(所以才在这里记录吧)。

    3.问题 到了写副歌的时候,还是感到“不对”了。具体表现为抓耳挠腮但写出来的东西还是无法让自己感到惊艳(。。。)

    首先必须承认,我感到紧张。就像水平不够的歌手在马上要唱到高音的时候会觉得紧张那样。怕自己上不去,怕破音,怕走音,怕各种。这种担忧恰恰会影响声带的表现呢。但心态是这种东西,你越跟它说别紧张,它越紧张吧。

    但副歌还是要写。这段时间如果说我学到了什么副歌写作技巧,那大概就是: 1.要跟主歌有明显的对比。音区也好,节奏型也好,歌词的长度也好,各方面的对比。 2.旋律如果无法一步到位,可以试试分两步写,先把节奏都定下来,再去调整音高。 3.Line + 3 规则(经常忘了这个。。。

    瞎哼哼了一会没什么收获,就想着还是借助一下工具吧,就把主歌部分录入到 Live 里面了。终于看到了旋律的形状,心情是你们居然长这样啊…… 虽然写的时候能感觉到简单和重复(无贬义),但当它变成屏幕里的小方块,还是很陌生。不是没见过的那种单纯的陌生,而是有点神秘。从人声到 MIDI 音符,一定有什么东西在转换的过程中丢失了。或者说是人声给旋律增添了什么重要的东西。歌词可能也有功劳吧。 听众听到的是 vocal 的演绎,不是机械的小方块。

    所以我想,以后可以试试写出一些简单的机械的看起来平平无奇的小方块,试着唱唱看,不见得会难听。

    还有就是如果跳进发生在两句话之间,而不是一句话内部,那么其实是感觉不到跳了那么多的…… 也许是我的感觉太迟钝(。。)就是第二句话开头的音,我以为只比第一句话结尾的音高了两度左右,结果写下谱子才发现高了好几度(((这什么视唱练耳不及格者的自白。。。

    在写副歌的旋律之前有尝试写点歌词,但也没有写主歌时那么自由了。 而且我不知道应该先写词还是先写曲了。没有词的话,写旋律觉得太凭空想象了。但先写词之后,感觉旋律又会被束缚。词写多长,写多短,都直接影响副歌的好听程度,更不敢下笔了……(啊啊啊啊啊啊

    然后我就很快就饿了。。。。写歌太消耗能量了。吃了一个蛋黄酥,难吃。还是饿,又吃了一包坚果。。。

     
    阅读更多

    from xxxxxxn

    很匆忙的下午!朋友突然要去唱k喊我陪她出于主观意愿拒绝了想了想朋友很可怜一个小孩读书读疯了自己除了瞎看代码也没干什么之后sayok了,这会儿需要去吃饭但是其实不想吃,一会也不想唱歌我会默默看fgo剧情的! 备忘:双11囤点猫用品(驱虫+化毛,原本还有人用品但是忘记了==

     
    阅读更多

    from 奈芙莲 • 糯可

    中继站经常会传入大量的,其实用户根本就不会去看一眼的帖子

    如果我们认为这样的帖子是对用户而言没什么用的:

    • 不是被本站用户,或者本站用户关注或者被关注的人发的
    • 且不是被上述用户直接或者间接回复(在同一个 thread),也没有被转发或者转发
    • 没有被本站用户或者远程用户收藏或点赞或者投票(等任何方式“交互”)
    • 已经在数据库中呆了15天没有改过了

    那么极大概率这些帖子完全不会被用到,理论上说可以从数据库中安全删掉。

    写了个脚本找到这些帖子。( should_keep_notes_ids_uniq 则是相反,必须要保留的帖子)

    WITH 
    should_keep_users AS (
      SELECT id FROM "user" WHERE host is NULL
      UNION
      SELECT "followeeId" as id FROM "following"
      UNION
      SELECT "followerId" as id FROM "following"
    ),
    should_keep_notes_data AS (
      SELECT n.id as nid, n."threadId" as ntid, n."renoteId" as nrid
      FROM should_keep_users su
      JOIN "note" n
      ON n."userId" = su.id
    ),
    should_keep_notes_ids_not_uniq AS (
      SELECT nid as id FROM should_keep_notes_data
      UNION ALL
      SELECT n.id as id
      FROM "note" n
      WHERE n."threadId" IN ( SELECT ntid as id FROM should_keep_notes_data WHERE ntid IS NOT NULL )
      UNION ALL
      SELECT n.id as id
      FROM "note" n
      WHERE n."id" IN ( SELECT nrid as id FROM should_keep_notes_data WHERE nrid IS NOT NULL )
      UNION ALL 
      SELECT n.id as id
      FROM "note" n
      WHERE n."renoteId" IN ( SELECT nid as id FROM should_keep_notes_data ) 
      UNION ALL 
      SELECT n.id as id 
      FROM "note" n
      WHERE n."renoteId" IN ( SELECT nrid as id FROM should_keep_notes_data WHERE nrid IS NOT NULL )
    
      UNION ALL
      (select "noteId" as id from note_reaction) UNION ALL
      (select "noteId" as id from user_note_pining) UNION ALL
      (select "noteId" as id from note_unread) UNION ALL
      (select "noteId" as id from note_watching) UNION ALL
      (select "noteId" as id from note_favorite) UNION ALL
      (select "noteId" as id from poll_vote) UNION ALL
      (select "noteId" as id from poll)
    ),
    should_keep_notes_ids_uniq AS (
      SELECT DISTINCT id from should_keep_notes_ids_not_uniq
    ),
    should_delete_notes_ids AS (
      (
        SELECT id
        FROM "note" n
        WHERE n."userHost" IS NOT NULL
        AND "updatedAt" < (current_timestamp - interval '15 day')
      )
      EXCEPT
      (
        SELECT id FROM should_keep_notes_ids_uniq
      )
    )
    SELECT count(*) from should_delete_notes_ids;
    
     
    阅读更多

    from maki

    从《泪桥》《夏夜晚风》《Last Dance》中学到的旋律写作技巧

    最近在试图研究一些让自己写的东西好听一点的方法,试图从一些熟悉喜爱的好作品中吸取经验,想把学到的东西记下来就记在这里啦! 写的是对自己有启发的东西,不一定适合别人(:з)∠)如果我借鉴这种写法,我的旋律可能更好,而不是说这种写法就是最好的最对的(没有这种东西吧)。 (可能对厉害的人来说这些都是正确甚至不正确的废话,这些技巧是不需要思考自然就能做到的事情。可能作者本人写的时候也没想那么多,可能我在牵强附会。但是没关系……最重要的是我有在思考(笨笨地)

    我现在也没办法总结出很系统的东西,只能先把零碎的感悟贴上来,多图预警!谱例是网上找的,免费的很少,有的音可能记谱也不准,凑合看( ╯□╰ )

    中心思想: 不论节奏还是音高,都是要相对静止和相对运动相结合,小范围运动和大范围运动相结合,意料之内和意料之外相结合,同时节奏和音高相结合(抽象)

    You need a balance, at all times. If the verse is a bit messy, you need it to be less messy right after. It needs to vary. (Max Martin)

    1.节奏的变化

    1.1 短vs长,规整节奏vs拖长音/切分(起小标题好痛苦)

    第一小节全是八分音符,等于一小节匀速地唱八个字,如果接下来还这样,就容易显得机械,有点愣愣的,所以“我的吻”节奏马上就变了(拖长了)。同样的时长,分别是八个字和三个字,疏密有明显对比。

    可以对照《Last Dance》的开头来看,第一小节是一模一样的节奏型。 第二小节同样开始变化了(还切分了一下子。)。 这样的组合很自然地让人感觉到“这句话讲完了,喘口气”。

    但即便如此,“四个八分音符”的机械做法也不可一直持续, “所以暂时将你眼睛”(八分音符) “黑暗之中漂浮我的”(八分音符) “平静脸孔”(八分音符减少了) 到“让人好不疼爱”这句,就已经没有了。 值得注意的是,歌词内容跟节奏也有对应:前面几句都有一定的叙事,“让人好不疼爱”则是完全的抒情。

    在《夏夜晚风》的开头,也有类似的写法,不过这次是四分音符(抒情慢歌):

    同样是第二小节就开始变化,不过这里还有一个技术,我忘了它的术语应该是什么来着,不过梁欢管它叫“打破小节线”感觉很准确,就这么用吧……

    1.2 打破小节线

    最明显的就是“吹”这个字的延音线,应该不用解释啦吧。 但我还想指出的是“的晚”这两个字其实也有隐含的打破小节线的效果——同样的音高,其实是隐隐相连的,分别安排在小节线前后,就有一种把小节线模糊掉的效果,让这句话更自然,更接近说话的感觉。

    同理,“夜里”两个完全一样音高和时值的音的重复,把这个小节的前半部分和后半部分黏合在一起了,因为传统来说是“强、弱、次强、弱”嘛,但是中间两个音一样的话,好像就……让中间也强了起来(比划

    很有趣的是除了刚提到的“吹”,在后面同样位置同样写法的还有“缠绕”的“缠”、“牵绊”的“牵”,可以说是歌词和节奏结合得很好的例子ಥ_ಥ这种缠绵的字就应该拖长一点、拖过小节线……

    2. 旋律形态

    2.1 用前面的相对停滞衬托后面的大跳

    “这个时候”音高变化很小,只有二度。 “我心”大跳,但后面没有马上反向级进。F# 其实是导音(或者在这里算是五声音阶的偏音吗……【感觉这个话题也可以单独写一篇。。。】)总之它几乎一定是要到G去的。(但我不知道这种跳到导音的操作是否常见)。“落”字又跨越了小节线,感觉落了很久,像流麻一样(在说什么)。。。 这半句的音域跨度高达八度(G5-G4)!(跟前面的二度比起来) 但这个八度跨越是在比较长的时间内完成的,先跳上去然后慢慢走下来的。

    听歌的时候大家应该能感觉到这句是A段让人印象最深刻的一句。除了歌词本身有画面感的原因(还有老哥的自带手势(?题外话:对音乐的推广来说,视觉是很重要的),旋律和节奏的设置也是重要原因。

    【这个时候】: 句子较短、音域较窄。 这可以造成小小的停顿感,而停顿是为了接下来的大肆渲染。

    【我心落花一样飘落下来】: 句子较长、音域较宽。 有浓墨重彩的慢镜头感。

    总之,这种组合是比较能够推进情绪的!

    ps “我心落”的这种节奏型(不包括延音线),我自己写东西的时候几乎想不到要用。。。甚至它的名字都想不起来了(:з)∠)更不用说还要加上延音线。不知道老哥是怎么写出来的这样的节奏,跟着感觉哼出来的吗?感觉这个地方我特别薄弱…… 还有就是休止符,我也不太会用,啊啊啊(゚Д゚)猜测这个问题可能还是 1.丢掉乐谱,自己哼唱,把说话的语气带进去 2.用一些随机的音序器啥的去生成然后修改(就像梁欢说的随便垫一个鼓组然后开始无限试 pattern) 真的很薄弱但暂时没有良方

    类似的例子还有: “夏夜的风有你”在三度以内 “就是我还在”跳了六度(注意“就是”的 pick-up note

    与之形成对照的是这两句,是【宽+窄】的组合。 前面虽然跨度较大,但没有大跳,而且是下行。所以它给人的感觉没有那么地放飞(。) 而且歌曲要结束了,前面已经自由过了,这里需要的是比较有结束感的节奏,这种一字一顿的感觉是比较合适的结尾,而且和开头呼应了。

    总之,【停滞,是在蓄力】。 请想象猫猫准备扑食的样子!!!

    这种停滞的极致,就是在连续好几个字都在同一个音高上: 👆请体会歌者憋屈的心情!(是深情啊(:з)∠)

    “为”字显得很突出。 一方面是跳进的功劳(下面会展开讲),另一方面是标蓝音符重复的功劳。

    “寂寞的”三个字,音高相同、时值相同(八分音符)。好像这三个字被给了慢镜头一样!

    规律节奏的重复,是为了让不规律的节奏显得更自由 在某个音高上重复,是为了让后面的某个音更突出 这就是对比,这就是 balance 啊(●'◡'●)

    两条都做到的话……就是加强版啦,也会让听众更期待接下来的变化哦 【这样的例子真的在流行歌里到处都是。感觉这个话题也可以单独写一篇。。。】

    2.2 如何强调一个字

    pick-up note 中文叫做弱起,所谓的弱指的是节奏啦,但是音高好像一般也会低一些,但也不一定(这个话题就足够写一篇文章了我说)。 它的作用是让紧接着的强拍更加突出。 是超级常见的一种写法!

    例子除了刚说的“就是我还在等待的爱”,还有: “你给的”“无助的”都是 pick-up note,让后面的“爱”和“等”(它们原本就在强拍上)更有冲击力。 另外:这两个字 1.拖得长 2.有音高的变化 这样存在感就更强了 在强拍、拖得长、但是音高不变的话,容易显得比较停滞,典型代表就是“就让水倒流”的“流~~~”。也不是说这样就一定不好,只是要清楚两种做法的区别,根据你想要的效果去选择。

    《夏夜晚风》这句的“爱”字有类似的处理(不过没有弱起): “我还在等待的”走向是往下的,“爱”是往上的。 “你给的”“无助的”是往上的,“爱”“等”是往下的。 即:制造旋律走向的对比,让那个字成为旋律走向的转折点,也是一种强调方式。

    《泪桥》的“交叉”。“曾经”是弱起:

    特别需要说明:这句的“我们”也是 pick-up note。据我理解,pick-up 也可以出现在小节内部(不管乐理上有没有这说法嘻嘻),总之你要强调谁就给它前面安个pick-up ,是有用的!

    • 小结:如何强调一个字
      • pick-up
      • 放在强拍
      • 拖长音
      • 长音有音高变化
      • 让这个字成为旋律走向的转折点

    有这种待遇的字,基本上就是整首歌最重要的情绪爆发点了。这在《Last Dance》中特别明显。回忆一下是不是每到“爱~”和“等~待”的时候老哥的肢体语言都到了最剧烈的时候,观众大合唱到了最大声的时候(。)

    2.3 摒弃跳进后一定要反向级进的思维定式

    这是一种桎梏,也是一种偷懒(:з)∠) 可以找到很多不这么做的例子。除了前面说过的“我心落花”,还有: 再比如…… 突然想到《海上花》的开头也是:

    还有《我和我的祖国》,记得当时我老师说这个跳得很精彩……确实比较大胆,一般想不到这么写。一连串的跳,既有上跳之后继续往上,也有上跳之后向下级进,真是一个经典的例子啊:

    【这几个跳进基本都发生在跨小节线的地方,不知道是否有某种普遍规律,需要再研究……感觉这个话题也可以单独写一篇。。。】

    大致感觉: 往上跳进之后继续往上,可以进一步推高情绪。 往下跳进之后继续往下,可以快速收束这句话。

    以上。这篇先写到这吧!感觉还有东西没挖出来,也许再找更多例子更好! (这篇写了好几天 = = 但都是宝贵的思考,感动,也谢谢星屑站让我有地方存放这些)

    Contact me

     
    阅读更多

    from maki

    Hi! 看到星屑站有 WriteFreely 就来注册一下,正好最近想找个地方写写长一点的东西呢!一秒钟就注册好了,页面极简,好喜欢,不过要研究一下怎么放图片内(●'◡'●)

     
    阅读更多

    from Nanako's Thoughts

    #StudyAbroad

    来荷兰也待了一年了,这是我人生中第一次远行、第一次彻彻底底独立生活。我从小就在某个一线城市长大,从小学、初中、高中、大学到工作,我的所有人生轨迹都围绕着这个城市,我真的是一个很不喜欢改变的人。但是因为各种各样的原因——政治抑郁、工作不顺和对自己未来的担忧等,最后还是让我做出了出国移民的决定。

    一开始,我深深地相信:自己一个人出国绝对没问题的!有任何困难我都可以自己搞定!但是在这一年中,我有很多次怀疑自己……我真的可以吗……很多时候感觉自己已经支离破碎,但是为了签证和高昂的学费又勉强拼凑自己继续学习。尽管最后成功地完成了这一年的学业,但是我真的已经精疲力尽,没有力气再去打起鸡血给自己找暑期工或者找实习。我回顾了一下自己的这一年,我觉得独自出国留学最需要以下几个基本能力:

    • 有健康的个人边界
    • 可以拒绝别人
    • 情绪控制能力好

    尽管出国前我就已经做过将近一年的心理咨询,也看过很多心理学书籍尝试自救自己的创伤反应,我也「以为」我已经痊愈得足够好,我已经建立了成功的边界,也可以拒绝别人,我的情绪调整能力也比之前更好了等等。但是这一年的经历还是让我意识到我的过往创伤给我留下了多么久远、隐蔽的黑洞,让我在猛然到了一个陌生环境后遇到一些困难状况时处理得很糟糕,同时也让我意识到我这三个基本能力并没有建立得特别好😭。

    我的经历

    在这一年里我经历了很多次人际冲突……有很多无措和茫然,也哭过很多次,并且最伤心的时候往往是觉得自己「本可以」做得更好的时候。

    冲突一: 被yellow fever骚扰

    我觉得这个冲突应该是影响我最深最久的一次冲突吧。

    具体发生了什么可以参考这条嘟文 ,尽管我当时没有说得很完整……具体来说呢,他会专门挑亚洲女生(并且几乎他挑中的所有女生几乎都是在刚来荷兰留学的第一个学期)跟他一起组队,然后在此期间各种学术PUA对方,让对方相信自己的报告写得很差,而他为了弥补我们的工作不得不多做了很多blabla,由此让对方产生愧疚心理,以便更好地进行情感操纵;同时他也表现得很热心,课下会主动来问刚才有没有什么问题不明白的,等回答完女生的问题就会借机提出一起hangout的要求等等。

    因为是第一学期,大家都不太熟,所有女生之间都没有彼此深入交流过,也就一直没人发现这个男的骚扰了这么多个女生……几乎所有人,包括我自己,都以为是个例(我以为是我表现得太nice了让他产生了误会...甚至我以为是本二次元有时候不经意做出了可爱口癖or习惯让他误解了,哎可恶),所以就没有report给学校。第二学期由于大家熟悉起来了,这件事情终于在女生圈子里传开了,我十分气愤,并且严重被trigger到,我决定向学校report他。这中间花费了我几个月的时间,跟学校各种沟通,并且有很多乱七八糟的事情发生,比如:

    • 在我联系完所有女生收集好证据准备跟学校report的时候,其中一个女生跟那个男的告了密(可恶的双面间谍!!),所以被那个男的抢先一步联系了学校的study advisor说我们在散播他的谣言
    • 学校方面的态度不积极,很想和稀泥。那个男的说「我是跟很多亚洲女生提过约会请求,但是我不觉得我做错了」,还提交了一份女生名单,在这种情况下学校跟我们说,他们没办法确认哪一方的说法是对是错,也没办法让他给我们道歉。
    • 学校给出的解决方法之一是给这个专业的所有亚洲女生都发一封邀请信,邀请我们参加亚洲女生如何应对性骚扰的座谈会😓我和其余几个被骚扰过的女生都很生气,觉得这是什么鬼解决方式!!!!去了以后我发现根本没多少人来,而且组织者据说是我们学校的什么CS女性协会,之前完全没听过,我在会上对她们哭着说「发生了这样的事,我们受害者甚至连一个道歉都没有」,她们说,会让那个男生给我道歉的,过了大概一个月吧,那个男的写了封狗屁不通还在指责受害者的道歉信过来。
    • 学校的心理咨询也很不supportive。我联系了学校的psychologist,她很好很nice,并帮我安排了心理咨询的session,尽管据说只有五次,我觉得也挺好的。但是去了以后发现对面一点都不共情我的痛苦,她的话和行为都让我想起了以前在国内学校遇到的心理咨询师,她们的主要职责不是解决学生的心理问题,而是帮学校解决学生()
    • 学校合作的confidential counsellor也让我觉得她并不理解我所遇到的问题,她听完我说的所有内容的反应竟然是「他可能只是想要有个date,他缺乏社交技能,但他并没有坏的意图」,这真的让我相当失望

    总之当时我是找遍了学校内可能可以帮到我们处理这个问题的部门和人,历时两三个月,中间我还生了一次重病,期间我的作业有些申请了延期但是全部都没落下(os:一些东亚人的自我修养...),最后得到的结果就是那个男的写了一封很令人无语的道歉信。收到道歉信的时候已经是期末了,我忙着期末的各种事,压根就没空理他……尽管花费那么多精力得到这么一个很不尽如人意的结果,但如果重来再让我选一次,我一定也会选狠狠地纠缠这个男的一把,让他惶惶不可终日到不敢来学校,让他知道亚洲女人不好惹!!但是处理完这件事情我已经开始感觉自己burnout了,感觉自己很需要休息一段时间,最后在暑假时封闭自我休息了两个多月后感觉好多了才开始写这篇博客。

    在处理这件事情期间,我一直在反思:我为什么可以纵容他践踏我的个人边界那么多次?我不停地怀疑自己、质问自己,同时也触发了很多闪回。我发觉在与他(以及其他让我感觉不舒服的外国朋友)相处时其实自己已经有不舒服的感受,但是由于这种不适感太过于熟悉……作为一个东亚女性,已经习惯了处处被微妙地冒犯的感觉……面对这种微妙地被冒犯,我一直沿用了以前的处理方式,也就是无视自己的感受。此外我也习惯于牺牲自己的感受去讨好别人,不想当所谓的气氛破坏者,细想起来我根本就没有建立起一个健康的个人边界,反而我一直在纵容别人践踏我的边界。

    想到之前上班的时候上司很爱拿我开玩笑、很喜欢对我的个人生活指指点点,而我却因为一些无法言说的恐惧一直选择忍耐并假笑面对——比如上司每次路过看到我桌上摆了饮料,就会说饮料喝多了对身体不好要多喝水blabla、每次出去聚餐都会拿我和其他女生当作开场话题、上司不喜欢我温吞的性格所以经常嘲笑我像考拉等等,我总是勉强自己也装作一副觉得很好笑的样子……所以在出国后遇到类似的事情,我还是选择了忍耐与假笑(是本人习得的最核心的社交技能),直到我发现有那么多女生被骚扰后也都选择了忍耐和私下里偷偷警告其他女生远离他,我一下子就崩溃了...最后终于爆发出来去跟学校report这件事情。到现在我其实还有比较严重的创伤反应,比如无法入睡和莫名哭泣等,但是由于保险原因还没有转接到合适的心理机构😭

    冲突二:积极connect但被骚扰

    关于这件事我也发过一条长嘟嘟,这是传送门。这件事发生的时候我还在跟学校掰扯上面那件被yellow fever骚扰的事情,所以我当时的感受真的只有精疲力尽……虽然因为我有比较好的保护自己的意识,我没有受到实质性的伤害,但是整件事情还是很恶心!!!当时评论里有人建议我去发邮件给ASML的HR部门report这个男的,我斟酌了一下,最后还是没有写...因为我好累……report那个yellow fever的事情当时还没有结束,不想再花那么长时间去解释自己、证明自己、讲述自己,以及我觉得这件事根本不会影响到他的工作(跟学校沟通的经历让我对此很悲观)…所以放弃了。

    冲突三:勇斗划水队友

    我发现国外真的老爱布置小组作业了,然后不知道为啥感觉在国外遇见奇葩队友的概率也大幅上升???不知道这个是不是我的错觉,比如说那个yellow fever就是我的队友之一,除此之外还经历了包括但不限于:

    • 在一个四人项目里,组到一个中国人女生(叫她A好了),英语特别特别差,完全无法沟通的程度,我得给她和另外两个外国队友做翻译才能成功分配小组任务,她完成的小组任务质量很糟糕,而且很明显全部都是GPT生成的
    • 还是这个项目,另外两个队友在ddl前一天说他们不想跟我和A一起写报告了,要单飞,并且已经发邮件给老师了,祝福我们
    • 某队友对写代码几乎是一窍不通,折腾了一个多星期给出来的是完美复制某个中国人TA的代码(他把自己所有做过的作业上传到了GitHub上),并且这个GitHub仓库几乎人人都知道,她还一点都没改,所以我一看到代码就认出来了😓
    • 和某个荷兰队友两个人一起做项目,但是她到学期末的时候burnout了要退学,这就算了,重要的是也没通知我……是某个共同好友告诉我我才知道的,紧急联系老师和狂赶一番后还是过了那门课()

    总之各种小组作业折腾得我不行,还各有各的问题,我觉得上班跟同事合作都没这么累啊啊啊!!而且本人的情绪控制能力也不太好,所以经常被奇葩队友们气得不行(同时别人一无所知),我也有点不知道该怎么处理小组作业遇到的矛盾……很多情况我都是默默忍了()或者是尽力去解决问题……比如队友太菜写不出来代码我就把代码包了之类的。

    但是我最后还是没忍住跟那个中国人女生A爆发了一场很剧烈的冲突……哎事情发生后我又反思了很多,例如我为什么会跟这么个不靠谱的人连续组队两次啊啊啊啊!!我觉得是因为两个原因:1. 她是女生,我对女生的宽容度真的很高;2. 她的态度表现得很好,比如她英语刚开始烂到完全无法沟通,但是她有在努力学英语,后面感觉她能用英语沟通了(尽管还是有点费劲),同时还会很愧疚地说对不起对不起我真的有在努力……然后我的恻隐之心就会升起然后就会帮一下她……

    事情起因是这样的,她跟我第二学期组队时,有两个小组作业,第一个小组作业时她跟另一个女生两个人折腾MCTS算法折腾了快一周就没写出来,我又发了嘟嘟吐槽这件事……当时我一边跟学校掰扯yellow fever那件事一边赶好几个ddl,所以身体受不了发高烧了,但是为了完成这个作业,我还是在发高烧时帮她们俩写完了代码,也写好了跑实验的代码,她们只需要改一下参数然后点运行按钮就可以了。最后她们俩跑实验然后写分析报告,作业还是顺利交上去了。我当时有点生气,但是因为她们的报告写得还行,所以我就无奈地安慰我自己,算了人各有所长,有些人就是不擅长写代码也没办法哎😑 到了第二个小组作业的时候,因为这是个期末大项目,我们组和另一个组合并成了一个大组,这两个女生也没写代码,其中一个女生自告奋勇承担了做presentation的任务以及一部分报告内容,另一个女生A就说她会写剩余的大部分报告内容(主要是结果分析),剩余的队友负责写算法以及相应的算法部分的报告,于是分工差不多就这么确定了。

    在写我那部分报告的时候,我发现女生A写的东西很离谱,明显就是GPT生成的东西,因为有些前言不搭后语的内容,比如我们的项目采用了某个GitHub项目的环境,但是没用那个GitHub项目的算法,报告里却在分析那个我们并没有使用的算法(我:???),很明显就是把GitHub代码直接发给GPT然后让GPT生成报告内容啊。我委婉地在群里提了一下这个问题,同时组长也约了个会确定报告要修改的地方,女生A一直说好的好的她会修改,让我们放心,她会用心完成这个报告blabla,我还有其他作业要写,所以我完成了我那一部分以后就暂时没管这边了。

    直到ddl当天凌晨(当天23:59分前提交),又因为自己那该死的责任心去最后检查了一遍报告看看有没有什么问题,结果发现报告的结果分析部分全部都是错的,内容全部是GPT瞎掰……我截图了其中的一小段,可以看到数值完全是错的。

    报告节选

    我当时真的非常愤怒,这么明显的错误,只要她看一眼就能发现,根本不可能是一时疏忽!!!当时已经凌晨五六点了,我也不知道她要改多久、能不能改好,而且我也不想因为她一个人而被学校认为我们整组用AI作弊…所以我就自己把整个结果分析部分改好了(后面被女生A倒打一耙说我不给她机会修改报告😢),我还发了群消息同步了这个事情,女生A当天下午一点多才回信息说了句“我的我的”,然后就没其他表示了。我觉得以我本人的个性,如果她当时认真地道歉并给出个合理理由,我都不会这么生气……交完作业后我就把她删了然后把她挂到朋友圈骂她是我合作过的最离谱的队友,然后就捅了马蜂窝了()那个女生很愤怒,想加回我但是被我拉黑了,所以就在朋友圈发了贼长一篇文章来骂我,说她对我有多好blabla,比如她寒假回国了她都会记得给我带两包泡面blabla。她后面还在我们学校的大群、公寓大群里艾特我并骂我,我又是一个很回避冲突的人,当时也是把我弄得心力交瘁,不知道该怎么处理这种人。最后我跟她尝试沟通了一番,发现这个人还是死不认错,我就说你再骚扰我,我们一起别毕业了,跟学校好好掰扯一下用AI直接复制粘贴的问题,她才彻底罢休。

    我朋友对整件事的建议是:

    1. 不应该跟小组作业的队友有太深入的交流,不主动不负责
    2. 一旦吃亏了,就认了,以后别再搭理那个人就行了
    3. 对于这次的事情,最好的处理方式就是两种,要不就任劳任怨地改了后不要有情绪,要不就彻底不管

    她觉得我选了最差劲的处理方式就是跟人撕破脸然后发朋友圈,因为这样对我一点好处都没有()我理智上知道我朋友说得很有道理,但是我就是特别特别愤怒,可能是被trigger到了,从这个女生A身上我体会到了一种深深地被操纵的感觉——总是在小组作业里干得特别烂然后态度低下地请求原谅、会跟我做朋友也只是为了更好地在小组作业里利用我而已,以及她在前期还会装一装,直到第二学期期末眼看自己马上就修完所有课了所以就不装了。她第一学期选了六门课,第二学期选了七门课,期间她几乎从不去教室上课,还不停地去其他欧洲国家旅游之类的(在荷兰留学的朋友应该都知道荷兰大学课业普遍都很重),完成作业很多都靠队友帮忙或者用GPT直接生成,但是她的策略很成功,成功地一年就修完了两年的课。

    我当时发朋友圈骂她就是单纯地发泄……发泄各种,发泄总是被操纵的愤怒,发泄自己的坏运气(又或者根本不是运气问题,就是我的性格问题)。我觉得这又是一个很典型的例子体现我没有建立好健康的个人边界以及不擅长拒绝别人的特点。明明第一学期跟她做队友时就有不舒服的感觉,但是因为跟她成为朋友后不好意思拒绝就又答应她第二学期一起组队……😭我这个破性格也太容易被人利用了……

    总结

    写完这一切,想感慨一下自己真的经历了好多乱七八糟的事情啊!!历经坎坷总算是成功度过了在荷兰留学的第一年,但是真的好累啊啊啊!!!!!感觉自己身心俱疲……同时,我认识了一个好朋友,她跟我的性格很像,遇到的烂事也很像,比如她也被那个yellow fever男骚扰过,女生A也在她的小组里疯狂划水(她很愤怒地跟我吐槽了很久)发现这一点后我有点无语...我觉得那个yellow fever男和女生A都是很典型的NPD,不承认自己有问题,疯狂指责别人,还很擅长用各种手段操纵别人等等,他们俩对我和我朋友的手段几乎都是一模一样的,比如那个女生A也对她各种卖惨说对不起我真的有努力在学但是就是学不会...然后指责我朋友为什么不愿意帮助她blabla(没把饭喂她嘴里的意思),不知道为什么我们俩的经历有这么惊人的一致性……

    我会忍不住想如果我有一个健全人格是不是我就不会经历这么多破事了,我会不会从开头就能避免一切...这么想让我更抑郁了 T T

    而且经历了这些事情后,我变得更加封闭自我了,不想表达了,总觉得表达自我就会受到伤害……我也不停地思考自己的性格缺陷是什么,要怎么解决等。而且我的抑郁症状也没有被很好地处理,我也不知道要怎么办,GP说我要先联系到一个我的保险可以接受的心理机构,我还没去联系……本来不想写这篇博客的,感觉是在暴露伤口而且不知道会不会有人指责我这里做得不好哪里做得不好之类的,但是最后还是选择把所有事情记录下来吧。

    尽管出国留学后遇到了这么多烂事,但我还是不后悔选择了出国。我觉得我所经历的这些都是因为我之前没有受到很好的尊重自己的感受、保护自己的感受的教育,我只会各种忍耐😭,而这些经历告诉我,忍耐并不是一个好的解决方式,而改变都是痛苦的,所以我会这么难受和抑郁。

    以及我越来越怀疑自己可能是ASD,因为我有家族史(*重点),同时我对人际关系的处理简直是一塌糊涂,我的成长史也感觉很像ASD,比如有长时间对某一事物的兴趣、朋友大多数都是非同龄人等...我就不一一阐述了。总之想得到一个答案,我到底是不是ASD呢!!尽管知道答案后可能并不能改变任何事情,但是想知道!!!!

    不过这一年也有其他好事发生,可能会再写一篇博客来详细讲一讲(也可能不会写),以后再说吧。

     
    Read more...

    from 奈芙莲 • 糯可

    Facebook在性别选择框里放了97个选项以后就一直有人对此津津乐道。以前我一直懒得看相关的东西,毕竟大家都知道这只是跨性别恐惧症(transphobia)的狗哨而已。只要稍微看其中的内容,就能意识到这个硬凑的97种性别有多恶意。

    Facebook通过搜集小众语言和小众文化里的同义词,强行凑出97种“性别”,让不懂的人以为这是跨性别者的创造。今日闲来无事,我也来构造2936种性别,谈谈Facebook是如何利用同义词放大人们的跨性别恐惧症的。

    让我们从最基础的开始。几乎所有人都会承认世界上至少有三种性别:女性,男性,和同时不属于二者的广义的非二元性别。如果连非二元性别都不承认,那我只能说你是一个无可救药的二极管,已经可以不看了。好的,让我们列出这三种。

    • female
    • male
    • non-binary

    然后,如果我们要细分的话,女性又分为顺性别女性(Cisgender)和跨性别女性(Transgender)。非二元也有不同的种类,比如同时具有男女两种认同的人(Bigender),觉得自己既不是男性也不是女性的人(Agender),不认为男性但不完全认为自己是女性的半女(demigirl),和不认为自己是女性但不完全认为自己是男性的半男(demiboy)。

    所以新的列表大概变成了这样:

    • female
    • male
    • non-binary
    • cisgender female
    • transgender female
    • cisgender male
    • transgender male
    • agender
    • bigender
    • demigirl
    • demiboy

    等一下,上面的女性对于顺性别女性和跨性别女性不是包含关系吗?为什么它们会出现在一起?这样不是重复了吗?

    这你就要问Facebook了。我也不知道它们是不是故意的,总而言之它们把大范围的集合和小集合放在了一起同时作为不同的“性别”。比如让我们看看Facebook光女性就划分了多少种:

    1. Cis-gender woman 顺性别女,所谓顺性别,指的是性别认同与出生时指派性别相同的人。即出生时指派性别为女,自我认知为女。
    2. Woman 广义上的女人。
    3. Transgender Woman 跨性别女。跨性别指的是性别认同或性别表现与他们出生时指派性别不同的人。跨性别女即出生时指派性别为男,性别认同为女。
    4. Woman of Trans experience 有跨性别经验的女性。
    5. Woman with a history of gender transition 有性别转换史的女性。
    6. Transfeminine 女性倾向跨性别者。字面意思,偏女的跨性别者
    7. Feminine-of-center 中心女性化,用于描述一个人认为或表现出,相比于男性更多是女性化的人。
    8. MTF male-to-female的缩写。跨性别女性的别名
    9. Transgirl 年轻的跨性别女性。
    10. T-girl 9的缩写
    11. Sistergirl 还是跨性别女性,但是是来自太平洋土著的俚语。

    在这里之前不懂的读者大概也意识到不对劲了。上述连续分了11个性别,实际上翻来覆去讲的只有两种:顺性别女性,或者跨性别女性。剩下的全都是对跨性别女性的别称、子集或者缩写。

    如果你选了跨性别女孩,实际上你同时还是 T-girl(跨性别女孩的缩写),实际上你同时还是跨性别女性因为显然女孩就是年轻女性,实际上你还是Sistergirl因为这是土著的别称,实际上你还是transfeminine因为这又是一个别称,当然你还是Woman of Trans experience毕竟你有跨性别经验,最后你还是个Woman。这下你同时拥有7个性别了(笑)

    Facebook将同义词重复地放在这个列表中实际上就是一种无耻的行径。说真的,谁会在乎T-girl还是Transgirl啊?是字母太多了写不下吗?Facebook此举实际上意味非常明显,就是“你看跨性别多荒谬,搞出这么多个性别”——那你怎么不说中国古代人荒谬啊?中国古代的自称有多少让我们看看:

    吾、余、在下、敝人、鄙人、不肖、不才、老子、爷、某、依、仆、乃公、人家、我等、我辈、我依、吾、吾们、吾济、吾辈、吾曹、小辈、小生、小人、小子、小可、小的、余、予、在下、洒家、咱、朕、寡人、孤、我

    《震惊!中国人竟然有37种自我!这究竟是人性的扭曲还是道德的沦丧!》

    放狗屁吧这些全都是一个意思,有的是谦辞有的是不礼貌的词有的是普通词而已。

    按Facebook的玩法,我们的性别表单一下子就指数级增长了:你瞧,female可以按年龄分为woman和girl,transgender可以缩写为trans和T-,cisgender当然也能缩写成cis。跨性别还能细分为有跨性别经历的,有激素治疗的(HRT),有手术的(SRS),顺性别还能分成曾经以为自己是跨性别但是后来退坑的(detrans)和坚定的顺性别(firmly),瞬间表单暴涨好多倍嘛!

    ["female","girl","woman","male","boy","man","non-binary","cisgender female","cisgender female firmly","cisgender female detrans","cis female","cis female firmly","cis female detrans","cisgender girl","cisgender girl firmly","cisgender girl detrans","cis girl","cis girl firmly","cis girl detrans","cisgender woman","cisgender woman firmly","cisgender woman detrans","cis woman","cis woman firmly","cis woman detrans","transgender female","trans female","T-female","transgender female with trans experience","trans female with trans experience","T-female with trans experience","transgender female with HRT","trans female with HRT","T-female with HRT","transgender female with SRS","trans female with SRS","T-female with SRS","transgender girl","trans girl","T-girl","transgender girl with trans experience","trans girl with trans experience","T-girl with trans experience","transgender girl with HRT","trans girl with HRT","T-girl with HRT","transgender girl with SRS","trans girl with SRS","T-girl with SRS","transgender woman","trans woman","T-woman","transgender woman with trans experience","trans woman with trans experience","T-woman with trans experience","transgender woman with HRT","trans woman with HRT","T-woman with HRT","transgender woman with SRS","trans woman with SRS","T-woman with SRS","cisgender male","cisgender male firmly","cisgender male detrans","cis male","cis male firmly","cis male detrans","cisgender boy","cisgender boy firmly","cisgender boy detrans","cis boy","cis boy firmly","cis boy detrans","cisgender man","cisgender man firmly","cisgender man detrans","cis man","cis man firmly","cis man detrans","transgender male","trans male","T-male","transgender male with trans experience","trans male with trans experience","T-male with trans experience","transgender male with HRT","trans male with HRT","T-male with HRT","transgender male with SRS","trans male with SRS","T-male with SRS","transgender boy","trans boy","T-boy","transgender boy with trans experience","trans boy with trans experience","T-boy with trans experience","transgender boy with HRT","trans boy with HRT","T-boy with HRT","transgender boy with SRS","trans boy with SRS","T-boy with SRS","transgender man","trans man","T-man","transgender man with trans experience","trans man with trans experience","T-man with trans experience","transgender man with HRT","trans man with HRT","T-man with HRT","transgender man with SRS","trans man with SRS","T-man with SRS","agender","bigender","demigirl","demiboy"]
    

    这不是,119种性别一下子就到手了。

    我们还有AFAB(A female at birth出生时指派为女的人)和AMAB(出生时指派为男的人)。当然,跨性别我们还能合二为一统称为 transgender 或者 trans 或者 transexual。这可不是我在玩抽象,是Facebook自己添加进它们的性别列表的,看:

    1. Trans 跨性别。Transgender man 和 transgender woman的统称。
    2. Transgender 还是跨性别
    3. Transsexual 还是跨性别
    4. Genderqueer 性别酷儿,意思差不多就是跨性别总称

    我还是很难像facebook这样无耻,还把女同性恋也写成一种性别,性取向和性别没什么关系,所以Femme这类的词我就不加进去了。

    所以我决定玩点抽象的:这不是还有染色体吗,实际上Y染色体上的SRY基因才是决定性别分化的开关,丢失了SRY基因的Y染色体没法让人发育成男性,被插入了SRY基因的X染色体反而能让人发育成男性。这不是我说胡话,这两种分别叫Swyer综合征和XX男性综合征,都是大约两万份之一的概率出现,因此全球加起来80多万人呢。同时,还有俗称超雄和超雌综合征的XYY和XXX,还有克氏综合征的XXY。以上这些统称性别分化障碍(DSD),那没有这种障碍的当然也要有自己单独的性别啦(non-DSD)。让我们把这些染色体都乘进去。

    现在我们已经有了1112种性别,虽然这份列表翻来覆去讲的全都是一样的东西,不妨碍我取个超级震撼性大新闻 《震惊!有人声称世界上有1112种性别!》了。

    让我们再看看facebook干了什么:

    70.Palao’ana 马里亚纳群岛的查莫罗文化中指第三性别。 71.Ashtime 埃塞俄比亚语中用来指代第三性别。 72.Mashoga 斯瓦希里语的第三性别。 73.Mangaiko 刚果语用来指代第三性别。 74.Chibados 恩东戈王国用来指代第三性别。

    我操,它把同一个词语在不同语言中的写法也扔进去了。欺负老实人呢?

    好吧,那我也试试。我们加上一些小小的世界语和拉丁语,再翻两倍!

    现在我们有了2936种性别。

    最后

    所以我想表达什么呢?

    我想表达的很简单,通过随意的排列组合和一些不要脸的行径,就能轻易构造出简中互联网上最大的跨性别恐惧症狗哨之一——97种性别。不仅如此,我还顺手给它翻了将近30倍,把它变成了2936种。

    跨性别恐惧症极力通过像这样的行为污名化跨性别者。表面上“尊重”了性少数,实际上煽动了互联网的仇跨情绪。就是这么简单。

    附录

    2936种性别的清单

     
    阅读更多

    from senioria

    Well... Since the title was in English...

    Let's skip all the common preambles illustrating the importance, etc. of partial evaluation, and just say we want to write a partial evaluator for a procedural language, which Senioria didn't find any articles introducing many details. Note that this is only a personal note, and the algorithm here may not be the optimal :)

    The language has the following characteristics:

    • Functions don't take closures, or, in other words, closures are passed to functions as an implicit argument;
    • Instructions are grouped in basic blocks, thus all branch instructions may only occur at the end of a basic block, and each block is terminated with a branch instruction.

    Concepts and basic partial evaluation

    We all know how to write an interpreter, right? And yes, this is how a partial evaluator works: just evaluate the instructions, record all variables (here, the results of each instruction), and generate corresponding instructions when the result of the instruction may only be known at runtime, i.e. the instruction must be generated. Other optimizations may also apply, like pattern match the instruction or a sequence of instructions and replace them with a more efficient version, or postpone the instruction generation, and only write the values used by the control flow and side effect-generating instructions into the result (specialized) function to do dead code elimination.

    Here, we call the dictionary recording all variables “poly”, which is an abbreviation of polyvariant, which... means that multiple versions of the function is generated, or more precisely, specialized. Not a good name, frankly.

    Let's see an example of our partial evaluator at this point, for the following function:

    int f(int n) {
    entry:
      int i = 5;
      goto if_cond
    if_cond:
      bool _0 = i < n;
      if _0 goto if_then else goto if_else;
    if_then:
      println("lt");
      int i1 = i + 1;
      goto if_end;
    if_else:
      println("ge");
      int i1 = i + 2;
      goto if_end;
    if_end:
      int i2 = i1 + n;
      return i2;
    }
    

    With n = 1, our partial evaluator would be working like this:

    int f_1() {  // Specializing the function, poly: { n = 1 }
    entry:
      int i = 5;  // poly: { n = 1, i = 5 }
      goto if_cond;  // poly unchanged, emit the jump, see our introduction below
    if_cond:
      bool _0 = false;  // poly: { n = 1, i = 5, _0 = false }
      goto if_else;  // poly unchanged, since the result of the branch is known, just jump to the desired block
    if_else:
      println("ge");  // (Same as above, idem for the followings (x)
      int i1 = 7;
      goto if_end;
    if_end:
      int i1 = 8;
      return 8;
    }
    

    If this is not good enough, by not emitting the constant assignments and a pass that we would introduce later, the resulting function would be like:

    int f_1() {
    entry:
      println("ge");
      return 8;
    }
    

    And with n unknown, the result would be like:

    int f(int n) {  // poly: { n = (arg) }
    entry:
      int i = 5;  // poly: { i = 5, n = (arg) }
      goto if_cond
    if_cond:
      bool _0 = i < n;
      if _0 goto if_then else goto if_else;  // Unable to determine, generate both branches
    if_then:
      println("lt");
      int i1 = i + n;
      goto if_end_1;
    if_else:
      println("ge");
      int i1 = i + 2;
      goto if_end_2;
    if_end_1:
      int i2 = i1 + n;
      return i2;
    if_end_2:
      int i2 = i1 + n;
      return i2;
    }
    

    Here we choose to keep the unconditional jumps, since they can be eliminated easily by adding another pass pasting the target block to the position of the jump and eliminating all blocks not referenced by any jumps after pasting —– a pass requiring almost no analysis but translating natural language. And by keeping the blocks, we may eliminate redundant specializations by only emitting the jump and not performing the evaluation when we found ourselves jumping to a same block with the same poly, or we may record the source block in the poly, thus we can directly say “when we found we are jumping to the same poly”.

    In the example with unknown n, we generated two different blocks for the same source block if_end. This can simplify some analysis since all variables have only one possible value. Some implements would be in favor of keeping the resulting blocks one-to-one to the source blocks as possible, and only record the variables as dynamic, or record all possible values of the variables. We don't like this because this would reduce the optimization potential by losing information by only record variables as dynamic, or be complex by requiring to order the blocks to evaluate all predecessors of a block before evaluating the block. If we want to reduce the generated code size, there are some more analysis we can add, e.g. collect the values that may be used by each block and their successors, and remove all unused variables from the poly, thus we can avoid emitting the same block twice just because an unrelated value in the control flow, or scan up from the bottom of each block and collect some or all reoccurring instruction sequences into one block, depending on how compact we want the code to be.

    Loops

    At the point, our strategy works well: constant values are propagated to eliminate unused branches and generate appropriate specialized instructions; what's better, many loops are automatically unrolled completely[^1], some loops have dynamic conditions and can't be unrolled completely, but after one iteration, the body finds itself jumping to an evaluated poly, and the evaluator continues happily. But a simple program would drive our evaluator into infinite loop:

    [^1]: Though may be overly aggressive, that we may need to add one more pass to reroll the repeating instructions back into a loop, or add some analysis to process big loops differently

    int *gv;
    int f(int n) {
      for (int i = 0; i < n; ++i)
        gv[i] = 0;
    }
    

    As we can see, i changes every iteration, so our evaluator tries to evaluate all the iterations, but the condition is dynamic, which means on the static perspective, there are infinite possible iteration to be generated, Oops.

    We may come up with some simple solution: store both the constant value and the instruction returning the value, and ignore the constant value when deduplicating blocks, or only record the instructions. Great, now we are generating gv[0] = 0 for every iteration, or give up unrolling constant loops.

    Well... Other partial evaluators seem not to be bothered by the problem, because one of these applies:

    • We just don't know them;
    • They are partial evaluating some language without loops, so they have other problems to face :);
    • They are evaluating some higher-level, structural IR, where they can directly access the “header” of the loop, and determine ad-hoc whether the loop can be unrolled, and use the correct strategy.

    After all, in our IR, we should process non-unrollable loops specially.

    First we should know whether we are in an non-unrollable loop. Our solution is performing an analysis to obtain all loops and their containing blocks first, then when we encounter a conditional jump, check if we are at the head block of a loop, and if so, pollute the poly to make every variable that is read in the loop and written in both the loop body and before the head block dynamic, and reevaluate the head block with the polluted poly. This way the loop header is adjusted not specialized with values in the first iteration of variables varying in the loop. And since this only applies to conditional jumps, unrollable loops are not affected because their jumps in the header can be specialized to an unconditional jump.

    This is enough for code-generation of the loop, since all variables both changed in and read by the loop is correctly set dynamic, and we would only need to repeat the story on the loop once, because when we encounter the header and the body the second time, we are with a different poly, in which there are variables in the loop body, and then after the second time the body is evaluated, the evaluator would recognize the fact that the incoming header block is evaluated in the second iteration, and end the evaluation to the loop.

    Forcefully pollute all read and written variables may be rough, and we can do better. There is an instruction called phi, which yields a value depending on from which block the control flow gets to the phi instruction. With this instruction, we can transform the program to SSA form, i.e. all variables are statically written once, by replacing all reassignments with a new variable, and when there are different possible values of a variable, inserting a phi instruction, since they must be from the different block, one block a different value respectively. With SSA form, we can keep the phi instructions, which normally would be eliminated since in both actual evaluation and partial evaluation, the actual control flow can only go along one path, determining the value of the phi instruction, in the reevaluation of the header block, and mark the value as dynamic; since all variables in the SSA form must be assigned before, this can ensure all variables both changed in the loop and used by the loop are set to the correct source —– the phi instruction. This transformation can be more accurate, and may be more universal.

    With this strategy, we must memorize the arms of every phi instruction in the header block of the loop, and fill in the correct value when the control flow reenters the loop. And then we found another problem: the poly would be different after evaluating the loop body, so without special process, we would be attempting to create a new header block, and repeat the iteration once; this is OK when we are free to assign, but the first phi instruction would be left with only one value, which is not allowed in some architectures like LLVM. To reuse the header block we just generated, we can record in the poly a path of dynamic loops, push a loop into it when we found ourselves encounter a dynamic loop at the conditional branch, and pop the loops we are leaving at other jumps; when we are going to jump, check if we are jumping to the header of current loop, and if so, fill in the phi arms and reuse the generated block.

    That's all of our strategy for partial evaluating non-unrollable loops. This is Senioriae source code handling branches and phis:

    void PeInstVisitor::visitPHINode(llvm::PHINode& inst)
    {
      if (poly.inloop) {
        auto val = inst.clone();
        auto phiv = llvm::dyn_cast<llvm::PHINode>(val);
        val->setName(inst.getName());
        val->insertInto(poly.insbb, poly.insbb->end());
        PhiPatch patch{ phiv, {} };
        for (size_t i = 0; i < phiv->getNumIncomingValues(); ++i) {
          patch.arms.emplace(phiv->getIncomingBlock(i), phiv->getIncomingValue(i));
        }
        bbphi[poly.insbb].push_back(std::move(patch));
        while (phiv->getNumIncomingValues())
          phiv->removeIncomingValue(unsigned(0), false);
        auto curv = inst.getIncomingValueForBlock(poly.from);
        phiv->addIncoming(poly.get(curv), poly.genfrom);
        poly.set(&inst, val);
      } else
        poly.set(poly.ip, inst.getIncomingValueForBlock(poly.from));
      state.bfsq.push_back(poly.next());
    }
    
    
    void PeInstVisitor::visitBranchInst(llvm::BranchInst& inst)
    {
      auto brto = [&](PePoly& poly, llvm::BasicBlock* dst, bool lastjmp = true) {
        auto path = lastjmp
                      ? poly.path
                      : std::make_shared<std::vector<LoopPathItem>>(*poly.path);
        auto src = inst.getParent();
        PePoly res{
          poly.env, poly.base, &*dst->begin(), src, nullptr, poly.insbb, dst, path,
        };
        // Pop the loops we are leaving (or in other words, not jumping into)
        while (!path->empty() && !loops.getLoopFor(path->back().src)->contains(dst))
          path->pop_back();
        // Br to the cond block of the loop
        auto reloop =
          !path->empty() && dst == path->back().src ? path->back().gen : nullptr;
        if (reloop) {
          for (auto& patch : bbphi[reloop]) {
            patch.node->addIncoming(poly.get(patch.arms.at(poly.srcbase)),
                                    poly.insbb);
          }
        } else {
          res.env = std::make_shared<llvm::ValueToValueMap>(*poly.env);
          res.base = std::make_shared<llvm::ValueToValueMap>(*poly.env);
        }
        // If new block: create the block
        auto blkit = polybb.find(res);
        if (!reloop && blkit == polybb.end()) {
          res.insbb = llvm::BasicBlock::Create(ctx, dst->getName());
          res.insbb->insertInto(effect);
          polybb.emplace(res, res.insbb);
          bbpoly.emplace(dst, res);
        }
        return std::make_tuple(res,
                               reloop                  ? reloop
                               : blkit != polybb.end() ? blkit->second
                                                       : res.insbb);
      };
      // Get the target bbs
      llvm::BasicBlock* thenbb = inst.getSuccessor(0);
      llvm::BasicBlock* elsebb = nullptr;
      auto cond = inst.isConditional() ? poly.get(inst.getCondition()) : nullptr;
      if (inst.isConditional()) {
        auto cc = cond ? llvm::dyn_cast<llvm::ConstantInt>(cond) : nullptr;
        if (cc && cc->isZero())
          thenbb = nullptr;
        if (!cc || cc->isZero())
          elsebb = inst.getSuccessor(1);
      }
      // Unconditional
      if (thenbb == nullptr || elsebb == nullptr) {
        auto dst = (thenbb != nullptr ? thenbb : elsebb);
        auto [sub, dstbb] = brto(poly, dst);
        llvm::BranchInst::Create(dstbb)->insertInto(poly.insbb, poly.insbb->end());
        if (sub.insbb)
          state.bfsq.push_back(sub);
        return;
      }
      // In loop: switch to loop mode and regenerate the block
      if (loops.isLoopHeader(inst.getParent()) && !poly.inloop) {
        auto next = poly;
        next.env = std::make_shared<llvm::ValueToValueMap>(*poly.env);
        next.ip = &*inst.getParent()->begin();
        next.inloop = true;
        next.path->push_back({ inst.getParent(), next.insbb });
        // Require an rerun
        polybb.emplace(next, next.insbb);
        next.insbb->erase(next.insbb->begin(), next.insbb->end());
        state.bfsq.push_back(next);
        return;
      }
      // Conditional: copy the inst and insert
      auto val = insinst(&inst);
      auto brval = llvm::dyn_cast<llvm::BranchInst>(val);
      auto ping = [&](int idx) {
        auto [sub, dstbb] = brto(poly, inst.getSuccessor(idx), idx == 1);
        brval->setSuccessor(idx, dstbb);
        return sub;
      };
      auto lsub = ping(0);
      auto rsub = ping(1);
      if (lsub.insbb) {
        state.bfsq.push_back(lsub);
      }
      if (rsub.insbb) {
        state.bfsq.push_back(rsub);
      }
    }
    

    There are some problems left, like how to obtain the loops and how to transform the program to SSA. Senioria didn't really implement them, since they are already done by llvm, but the algorithms seem to work well.

    For loop detection, we can first make the domination graph, a directed graph of blocks with blocks as nodes and jumps in the blocks as edges. Then we can DFS on the graph, maintaining a stack of visited nodes, and when we visit a visited node N, add all nodes in the stack above N into the loop with header N. We can safely assume that a block an only be the header of one node here, since we can't do any better without better specialization technique.

    For SSA transformation, we can iterate the blocks in topological order, ignoring edges from a loop body to its header when entering the header, replacing every reassignment with a new variable, and replace succeeding accesses to the assigned variable with the new variable, and create a phi instruction at the beginning of a block for potentially used variables in the block.

    Further steps

    We haven't discussed how to process functions yet, which is also crucial, and is at least the same complex as processing loops. Well, Senioria am lazy :)

     
    Read more...

    from Nanako's Thoughts

    #StudyAbroad

    经济来源

    很多时候别人一听我要留学,马上大呼小叫:哇你家这么有钱?!每到这个时候我都大汗淋漓:因为每次对我说这话的人一般家境都比我好多了……

    我家经济条件确实是非常差,农村出身、爸妈负债、哥哥负债、房子没有,车也没有,田也没有。大概我爸妈的信念是赤条条到这世界上来,也打算赤条条地走(把我自己逗笑了哈哈哈哈哈)

    但是我算幸运的吧,踩中了计算机行业的最后一点点风口,去了大厂打工,以及离职后还做了一段时间外包,所以几年后也攒了一些钱,不多,大概30万。我人生中第一次拥有这么多钱,我都没告诉我爸妈,一个人就决定我要拿着这个钱出国,不管够不够吧,死也死在国外算了。

    知道我要去留学以后,重男轻女的外公外婆那边对我很不高兴,指着我骂读书没用,不如赶紧找下一份工作;甚至我小姨对我破口大骂说我连累了我哥,必须拿我这条命去努力赚钱,赚到让我哥早点结婚,才算补偿到位(我内心os:哪来的一家神经病)所以他们一分钱也没出。

    我奶奶则对我要去留学特别高兴,虽然她也不知道国外是哪里、到底有多远,但是她觉得我要去读研究生这件事特别光宗耀祖(p.s.我家太穷了,我是我们家族里literally第一个学历读到研究生的人),她就把她所有的积蓄都拿出来给我了TAT 鄙人第一次被这么明显的偏爱,完全手足无措,哭了好几回。这个时候我还思考了一下,难道这就是男宝的普通待遇吗,就是在你想干什么的时候,家里倾尽所有地帮你,不考虑你以后到底还不还得上来……而对我来说,我外公外婆家的态度才是正常态度,根本没指望能得到他们的支持,反正老娘有钱,我要走谁拦得住我呵呵

    另外我爷爷奶奶家这边的亲戚还为我这个家族里的第一个研究生搞了个募捐活动,给我募了个一万左右。这就是读书改变命运吧姐妹们🚬难得在南方宗族里享受了一下男宝的至尊待遇!!

    总之,最后我申请留学时满打满算,凑了个35万,能搞得这么多也算是意料之外了!

    DIY思路

    在国外的朋友基本都劝我不要找中介,理由如下:

    1. 中介赚的就是信息差的钱,自己多花点时间找资料也能弥补
    2. 自己的申请自己最上心,中介才不会关心
    3. 我没那么钱浪费(流泪

    所以呢,我觉得准备留学时最重要的就是收集资料的能力!以下几个论坛/社区我经常逛:

    逛的时候记得遇到有用的信息记录下来,以免自己忘记。另外留学申请也很简单,我的顺序基本是:

    谷歌搜xx国家的大学列表 $\rightarrow$ 去官网收集资料 $\rightarrow$ 按照资料准备 $\rightarrow$ 去官网申请

    在这里贴一下我当时收集德国大学资料时写的文档(本p人为了省钱真的做到了极致),非常方便好用!按照文档能很清晰地知道自己要准备什么材料、申请什么时候截止。就算不确定是不是缺了什么,也可以马上顺着链接去二次确认。

    我的出国材料准备清单

    语言准备

    为了省钱,语言当然也是自学的!!我考的是托福,最后分数是101(根据我自己的申请经验,上100后的选择会更多,所以我考了两次险之又险地上了100)。阅读和听力我考得还可以,把我贫瘠的口语分和写作分拉了上来……我看了很多一亩三分地上面的托福备考经验贴!!这个论坛真的有很多好东西,非常推荐大家多去挖一挖!

    (二次编辑:删除了自己的托福经验,因为我也是拾人牙慧,自己去搜适合自己的学习方法比较好一点)

    选择留学国家

    明确了自己的留学成本以后,选国家时也比较有方向(毕竟也没啥能选的啊呵呵

    我的目标也很明确!就是移民拿身份!所以我当时主要考虑的有以下几个选项:德国、美国和荷兰。这里我只简单介绍一下我对这几个国家的印象,没有特别详细地展开。

    德国

    由于我的大学跟德国合作非常紧密,甚至所有大一学生都要强制学一年德语,所以当时德国是我的第一选择。德国的移民条件也比较简单:工作满两年(即交满两年养老保险)后可以申请永居。

    留学花费

    德国最大的优点就是便宜,真的便宜。除了巴登-符腾堡州以外,所有公立大学都不收学费(要收学杂费),并且巴登-符腾堡州的学费是非欧盟学生一学期1500欧元,与其他国家相比简直就是白菜价。详情请看下图这个表(引自在德国留学要花多少钱?

    德国学费与学期注册费情况

    学期注册费竟然还包括无限次使用当地公共交通系统……这福利我哭了、、、

    此外德国的房租也不是很贵,毕竟德国很大,具体要看住在哪个地方,但总体来说就是选择非常多,总有便宜的选法;德国的物价在欧洲内也算比较ok的。根据资料,在德国生活,一个月平均需要842欧(引自Costs of education and living)。

    学校申请

    咱是去移民的,完全不在乎什么名校不名校的……我当时的精神状态就是:就随便找吧,哪个能上就上,都申申!

    申请德国学校时,我发现一个最大的问题就是它们对申请者的专业背景要求真的太高了!比如说柏林工大当时要求本科所修的课中数学领域的课至少要有20学分,我算了算我自己的只有16学分,而我已经毕业了,去哪里补这四个学分呀……我也不太确定能不能上网课来补学分,但这个情况非常普遍,我想申请的很多学校都因为各种各样的课程要求满足不了而被我毙掉。

    以及申请德国学校还有一件事情一定要铭记于心:记得准备APS!!!!而且是越早越好,不能拖,这个APS从准备资料到拿到证书花了我大概半年的时间……期间让我错过了很多学校的申请窗口(痛哭捶地)毕竟咱第一次准备留学也没有经验……

    美国

    可能有人看到我的标题时很疑惑:你这人,不是说只有35万吗,这去个屁的美国啊?

    俗话说猫有猫道,鼠有鼠道,留美的人也各有各的道、、、我的留学预算没有多到让我可以爬藤啊、申名校啊之类的,但是也没少到让我只能惊险走线墨西哥……

    留学花费与学校申请

    这两放在一起写吧,主要是真的没什么选择。像我这样的肯定是只能考虑物美价廉的公立大学了,比如说我曾经考虑的佛罗里达州立大学(FSU)的国际学生学费是一年18,746刀,那么我的预算大概是够两年的学费加一年的生活费(同时还得缩衣节食),不过它的奖学金机会还算比较多,这里有一个官方提供的表格(引自Graduate Student Financial Support Policy and Statistics),可见这所大学的计算机系的助学金获得率是比较高的,能有76.7%,但是数据比较久了,不知道现在是什么情况。

    FSU研究生资助情况统计

    除了寻找助学金机会,我也有在寻找一些全奖硕士或者是全奖博士的机会,而一般会提供全奖硕士的学校都不是什么特别有名的学校(也没关系吧)。我也较为幸运地找到了一个全奖硕士的机会,也通过了面试,只要申请就能有offer。这个就不多展开了,总之美国的机会真的很多,能拿得到资助,在美国活下来也不是非常难的事,问题就在于美国太难移民了……这也是最重要的,我为什么放弃它的原因。

    至于如何寻找这样的机会,推荐多看看一亩三分地或者是领英上的学校教授、业界大小牛,信息网够广的话总能蹲到的。

    这是我之前考虑德国和美国时列的表(当时完全没想到自己会半路一拐突然去了荷兰呢哈哈哈哈哈哈哈)

    德国与美国对比

    荷兰【最终选择】

    说实话,最开始没考虑过荷兰……荷兰的费用对我来说还是有点高。但是我考完托福后没啥事干,刚好荷兰申请季还有一周截止,我怀着“有枣没枣打一杆子”的心态申了三所荷兰的学校,最后被其中一所录了。而我考虑到荷兰申请永居的条件也比较简单:合法居留满五年就可以申请永居,所以最后就来了荷兰!

    留学花费

    荷兰是真的贵啊……吐血了!!

    我申上的这所学校,一年学费就接近两万欧,一年生活费要一万欧,所以算下来留学两年差不多要花6万欧,我的钱还差十万左右,但是咱还是来了。我觉得学费是大头,我的钱够两年学费,和差不多一年多一点的生活费,大头已经有了,那我的缺口还不算很难解决,那就来了再说吧!

    我个人的开销是每个月大约900欧:房租445欧,保险20欧,话费5欧,食物大约300欧,交通费和出去玩大概100欧。其实有时候我花得比这个还少(是个很节省的小女孩),所以预计了一下我大概能撑到今年十月或者十一月就没钱了(。)

    荷兰的问题在于以下几点:

    1. 毕竟是小语种国家,很多工作都需要荷兰语。
    2. 最近几年的政策逐渐排外,非欧盟身份很不方便;比如找兼职的时候有很多家都因为我的非欧盟身份拒绝我。
    3. 物价高,比德国美国都高。我跟美国的朋友聊天,她说她那里(波士顿)的越南河粉一份12刀,我这里的越南河粉一份18欧,呵呵🚬
    4. 交通费贵。想想德国学生免交通费,可恶,好嫉妒!
    5. 国际生有严格的工作时长限制。一周16个小时/暑假三个月全职工作,二选一。
    6. 奖学金少。

    学校申请

    当时申得晚,又着急,没有做很多荷兰学校的功课。总的来说,荷兰的申请比德国简单很多,虽然也有对专业背景的要求,但没有德国那么严格。

    荷兰的大学水平并没有差很多,我觉得完全可以随便选诶。建议如果要申荷兰的学校主要考虑一下学校的位置、学校福利之类的,比如说格罗宁根大学的学生可以免费学习荷兰语(我这个学校就没有!)

    另外体感上荷兰是个比较小的国家,所以周末去另一个城市玩也是很稀松平常的事情,不需要太考虑自己所在城市的娱乐水平(我的宗旨:便宜能住就行了)

    最重要的一点可能是得提前看好自己想申请的项目的实习政策是什么样的——荷兰的国际学生实习时需要与公司和学校都签一个Nuffic协议,如果你想实习,但是学校政策不支持的话会非常麻烦。

    结语

    感觉我已经把我自己掏干净了,总的来说DIY真的很简单,预算有限的话绝对不要把钱都浪费在中介上面啊————

    有钱的话就算了,有钱者为所欲为🚬

     
    Read more...

    from 奈芙莲 • 糯可

    译者注:

    本文是 Michał “rysiek” Woźniak 的博客 Mastodon monoculture problem 的翻译。 source: https://rys.io/en/168.html

    对于不太懂文中的名词的人,译者额外做出一些解释:

    • 联邦宇宙:Fediverse,是使用一些协议彼此链接的一系列网站/服务(被称为“实例”)的总称。在联邦宇宙,你在任何一个实例上拥有账号,你就能访问几乎整个联邦宇宙的所有内容——实例有特殊规则的时候除外。
    • 实例:联邦宇宙上的单独一个网站/服务。
    • 实例软件:运行实例使用的软件,比如 Mastodon。用一种实例软件可以搭建很多个实例。
    • ActivityPub协议:一种旨在让不同的实例之间可以互相连接,共通账号的协议。联邦宇宙实例很多使用的就是ActivityPub协议。
    • Mastodon:连接到联邦宇宙的一个微博类社交媒体软件,有类似Twitter的设计。

    依照 Michał “rysiek” Woźniak 的原文 (https://rys.io/en/168.html),本文以 CC-BY-SA 4.0 协议发布。您可以自由地共享、演绎本作品,但是必须署名、以相同方式共享 – 如果您再混合、转换或者基于本作品进行创作,您必须基于与原先许可协议相同的许可协议分发您贡献的作品。


    Mastodon 非营利组织的首席执行官兼 Mastodon 软件的首席开发者 Eugen Rochko(在联邦宇宙上被称为 Gargron)最近的举动让一些人担心 Mastodon 该软件项目,同时也是该非盈利组织对联邦宇宙的其余部分造成的巨大影响

    确实。我们就是应该担心。

    到目前为止,联邦宇宙上大多数人都在使用 Mastodon 软件。 截至撰写本文时,最大的实例 mastodon.social 拥有超过 200,000 个活跃帐户。 这意味着这单独一个实例上涵括了整个联邦宇宙的大约 1/10。 更糟糕的是,Mastodon 软件经常被认为是整个社交网络,这掩盖了一个真相: Fediverse 是一个由更多样化的软件们组成的更广泛的系统

    现在它就已经产生了糟糕的后果,而且以后可能会更糟。 让我困扰的还有,我以前也见过这样的情况:

    正如 OStatus 宇宙所示

    几年前,我在联邦宇宙的前身有一个账户。 它主要基于 StatusNet 软件(后来更名为 GNU Social)和 OStatus协议。 最大的实例是 identi.ca ——笔者在那里拥有自己的账户。 同时还有很多其他实例、其他软件项目也实现了 OStatus协议——例如 Friendica

    出于本博文的需要,我们将该社交网络称为“OStatus 宇宙”。

    与今天的联邦宇宙相比,OStatus 宇宙是微不足道的。 我没有具体的数字,但我的粗略估计是,即使在最活跃的时候,也只有大约100,000到200,000个活跃帐户(如果你有实际数字,请告诉我,我将很乐意更新这篇博客)。 我也没有 identi.ca 上用户数目的确切数字,但我粗略估计它有 10,000 到 20,000 个活跃帐户。

    对,刚好也是整个社交网络的 1/10。

    OStatus 宇宙虽小但很活跃。我们在上面有讨论、线程回复(threads)和话题标签(hashtags)。 它早在 Mastodon 软件项目实现 Group 的十年前就实现了群组。它有桌面应用程序——我仍然怀念 Choqok 的可用性! 甚至经过一番唠叨后,我还说服了波兰的一个政府部门在那里设立官方办事处。 据我所知,这是最早的政府机构在自由软件驱动的去中心化社交网络上拥有官方账户的例子。

    Identipocalypse (identi的末日)

    然后有一天,identi.ca 的管理员(也是 StatusNet 软件的原始创建者)Evan Prodromou 决定将其重构为一项新服务,即 pump.io。 他们希望新软件更好、更精简。 他们创建了一个新协议,因为 OStatus 协议有非常现实的限制。

    只有一个问题:新协议与 OStatus 宇宙的其它部分不兼容。它把这个社交网络撕碎了。

    拥有 identi.ca 帐户的用户与所有其他 OStatus 实例失去了连接。 在其它实例上拥有帐户的人与 identi.ca 上的人失去了联系,并且其中一些人在 OStatus 宇宙中非常受欢迎(听起来很熟悉?..)。

    事实证明,如果一个实例占据了整个社交网络的 1/10,那么它就会承载太多的社交联系。尽管的确存在其他实例,但突然间大量活跃用户消失了。一些群组瞬间就变得安安静静。 即使有人在不同的实例上有一个帐户,并且在其他实例上有联系人,很多熟悉的面孔也会消失。 于是此后不久我就停止使用它了。

    从笔者的角度来看,就这么一项行为,就使得我们在推广去中心化社交媒体方面至少倒退了五年甚至十年。 identi.ca 的重构不仅在社交关系意义上破坏了 OStatus 宇宙,而且在协议和开发者社区意义上也是。 正如 Pettter,一位 OStatus 资深人士所说:

    我认为,这个巨变带来的影响是,它不仅切断了社交联系,还导致了协议变得支离破碎,一次又一次地让重建联合社交网络的基本架构的努力付诸东流。 也许这是他们重新聚集在一起设计 ActivityPub 的必要步骤,但我个人不这么认为。

    当然,Evan 完全有权利这样做,毕竟这是他用自己的钱、按照自己的条款无偿经营的一项服务。 但这并不能改变它割裂了OStatus宇宙的事实。

    我认为我们需要从这段历史中吸取教训。我们应该担心 mastodon.social 的庞大规模。 我们应该为联邦宇宙上 Mastodon 软件明显的单一文化感到担忧。 我们还应该担心将整个联邦宇宙与“Mastodon”等同起来。

    做大的代价

    发展到像 mastodon.social 这样的规模,需要付出相当的成本和风险。 这些成本,尤其是那些风险,既针对该实例本身,也针对更广泛的 Fediverse。

    Fediverse 上的审核很大程度上以实例为中心。 单个巨大的实例很难有效地管理,特别是如果它开放注册(就像 mastodon.social 目前所做的那样)。 作为直接在官方移动应用程序中推广的旗舰实例,它吸引了大量新注册,其中包括不少不太友好的用户

    同时,这也使得其他实例的管理员和版主更难以做出有关 mastodon.social 的审核决定。

    如果其它实例的管理员认为 mastodon.social 出于某种原因缺乏管理,他们是否应该静音该实例,甚至将其屏蔽(显然,有些人已经这样做了),代价是让本站的用户无法联络许多在 mastodon.social 有账户的受欢迎的人?或者、他们就应该冒着让自己的社区面临潜在有害行为的风险,保留这种联络的可能性吗?

    mastodon.social 的庞大规模使得任何其他实例的管理决策成为了一件大事。 这是某种形式上的特权:“当然,如果您不喜欢我们的管理方式,您可以封掉我们,但如果您实例上的用户无法访问整个联邦宇宙的 1/10,那将是一种耻辱!” 正如 GoToSocial 网站所说

    我们也不认为拥有成千上万用户的旗舰实例对联邦宇宙来说很有好处,因为它们会导致中心化,并且很容易变得“太大而不敢屏蔽”。

    请注意,我并不是说这种权力动态是有意识地、有目的地利用的! 但不可否认,它是存在的。

    作为一个巨大的旗舰实例也意味着 mastodon.social 更有可能成为恶意行为的目标。 例如,在过去几个月中,它多次受到 DDoS 攻击,并且好几次都因为这个而无法访问。 联邦系统的可靠性依赖于消除大的故障点,而 mastodon.social 现在已经是一个巨大的故障点了。

    该实例的规模让它成为了一个诱人的攻击目标,这也意味着它需要做出某些艰难的选择。 例如,由于经常成为 DDoS 的目标,它现在由 Fastly 保护。 从隐私角度和互联网基础设施中心化的角度,这是一个问题。 这也是较小的实例完全避免的一个问题,因为它们很小,很少有人会无聊到 DDoS 攻击它们。

    (译者注:这方面译者非常存疑,事实上小实例也经常受到随机的DDoS攻击。)

    明显的单一文化

    虽然联邦宇宙并不完全是单一文化,但它太接近单一文化了,令人感到不舒服。 Mastodon 非营利组织对整个联邦机构有着巨大的影响力。 这让使用社交网络的人、Mastodon 软件和其他实例软件项目的开发人员以及实例管理员感到紧张。

    Mastodon 既不是联邦宇宙上唯一的平台软件,也不是第一个。 例如,Friendica 已经存在了十五年了,早在 Mastodon 软件的第一次 git 提交之前就已经存在。一些现在的联邦宇宙中运行着的 Friendica 实例(例如 pirati.ca)在十年前曾是 OStatus 宇宙的一部分!

    但是很多人在将整个联邦宇宙称为“Mastodon”,说的跟 Fediverse 上只存在 Mastodon 软件一样。 这导致人们经常要求 Mastodon 实现一些新功能,但其实这些功能已经由其他实例软件实现了。 Calckey 已经有引用嘟文(带评转发)功能了。 Friendica 也早就有线程对话和富文本

    将 Mastodon 与整个联邦宇宙等同起来对于 Mastodon 软件开发人员来说也是不利的。 这导致他们面临着被要求实现不完全适合 Mastodon 软件的功能的压力。 或者,有时候他们不得不两群吵吵囔囔的用户打交道,一群人想要某个功能,另一群人又觉得这个功能太大,实现不了。通过清楚地划出一条界限,并引导人们使用可能更适合他们的用例的其他实例软件,许多此类情况可能会更容易处理。

    最后,Mastodon 是目前为止(按活跃用户和实例数量衡量)最流行的 ActivityPub 协议实现。 每个实现都有其自己的特性。 随着时间的推移和新功能的实现,Mastodon 的实现可能会进一步偏离严格的规范。 毕竟,这很诱人:如果你怎么弄都是龙头老大,为什么要艰难的去实现标准协议呢?

    如果这真的发生了,其他所有实现是否都必须跟随它,从而变得随波逐流,没有对于事实标准的话语权? 这是否会在 Mastodon 软件开发人员和其他实例软件项目的开发人员之间造成更多紧张关系?

    “Mastodon 错过了 XX 功能”的最优解并不总是“Mastodon 应该实现 XX 功能”。 通常来说,最好使用更适合特定任务或社区的不同实例软件。或者开发一个扩展协议,允许尽可能多的实例可靠地实现特别流行的功能。

    但这只有在每个人都清楚 Mastodon 只是更大的社交网络:联邦宇宙 的一部分的情况下才有效。 而且,对实例软件、单个实例以及移动应用程序而言,我们现在本来就有很多选择。

    遗憾的是,这似乎与 Eugen 最近的决定背道而驰:它们打算导向自上而下(不是完全垂直整合,但倾向于垂直整合)的官方 Mastodon 移动应用程序模型,以推广他们最大的 mastodon.social 实例。 在我看来,这很值得担忧。

    更好的方式

    我想澄清的是,我在这里并不是主张停止 Mastodon 的开发并且从不实现任何新功能。 我也同意注册流程需要比以前更好、更简化,我也同意需要实施大量 UI/UX 更改。 但所有这一切都可以并且理应以提高联邦宇宙弹性的方式进行,而不是破坏它。

    必要的更改

    我觉得 Mastodon 和联邦宇宙必须要更改的地方是:

    1. 现在关闭 mastodon.social 上的注册 对于联邦宇宙的其他部分来说,这个实例已经太大了,所带来的风险也太大了。
    2. 使用户迁移更加容易,甚至可以跨实例迁移 在 Mastodon 上,个人资料迁移目前仅移动关注者。 您关注的人、收藏夹、屏蔽和隐藏列表都可以手动移动。 帖子和列表无法移动——这对很多人来说都是一个很大的问题,因此他们就被和他们注册的第一个实例绑在了一起。 这并不是无法克服的——笔者已经迁移了两次个人账户,感觉也很不错。但这种阻力还是太大了。 值得庆幸的是,其他一些实例软件项目也正在努力允许帖子迁移。 但这不会是一个快速而简单的解决方案,因为 ActivityPub 的设计使得在实例之间移动帖子变得非常困难。(译注:Sharkey和Firefish实现了这项功能)
    3. 默认情况下,官方应用程序应该随机从一些可信的实例中选一个推荐给新用户注册 至少其中一些实例不应由 Mastodon 非营利组织控制。 理想情况下,某些实例应该运行不同的实例软件,只要它使用兼容的客户端 API。

    我能做什么?

    作为联邦宇宙的一员,我们可以做以下事情:

    1. 如果您在 mastodon.social 上有帐户,请考虑迁移走 的确这是有点艰难的一大步,但也是你可以做的最直接有助于解决问题的事情。 几年前,我从 mastodon.social 迁移过来,再也没回去过。
    2. 考虑使用基于不同软件项目的实例 越多的人迁移到使用 Mastodon 软件以外的其他实例软件的实例,我们的联邦宇宙就越平衡越有弹性。 例如,我听说很多人都觉得 Calckey 不错。 GoToSocial 看起来也很有趣。
    3. 请记住,联邦宇宙不仅仅是 Mastodon 语言很重要。 当谈论联邦宇宙时,称其为“Mastodon”只会让我上面提到的问题更难处理。
    4. 如果可以的话,支持 Mastodon 官方项目以外的项目 至此,Mastodon软件项目已经拥有众多的贡献者、稳定的开发团队以及足够雄厚的资金,可以安全地持续很长一段时间。这那太棒了!但是,对于其他与联邦宇宙相关的项目,包括独立的移动应用程序或实例软件,它们没有那么受到关注。为了拥有一个多元化、有弹性的联邦宇宙,我们需要确保这些项目也在各个方面得到支持,比如金钱上。

    结束语

    首先,联邦宇宙是一个比任何中心化的孤岛更有弹性、更长期可行、更安全、更民主化的社交网络。 即使存在 Mastodon 单一文化问题,它仍然不是(并且不可能 )由任何单一公司或个人拥有或控制。 我也觉得它比只是在 cosplay 去中心化的社交网络,比如 BlueSky 是一个更好、更安全的选择。

    从某种意义上来说,OStatus宇宙可以说是联邦宇宙的早期版本; 如前所述,当时属于其中的一些实例仍在运行,并且今天已成为联邦宇宙的一部分。 换句话说,联邦宇宙已经存在了十五年了,尽管它受到了严重的伤害,但它仍然在 identi.ca 的灾难中“幸存下来”,同时见证了 Google+ 的诞生和过早的消逝

    我确实相信如今的联邦宇宙比 identi.ca 重新部署之前的OStatus宇宙更具弹性。 就用户群而言,联邦宇宙至少要多十倍,有数十个不同的实例软件项目和数以万计的活跃实例。还有一些认真的机构对其未来进行了投资。 我们不应该对我上面写的一切感到恐慌。 但我确实认为我们应该防患于未来。

    我不会将恶意归因于 Eugen 最近的行为(比如让官方 Mastodon 应用程序将新人引向 mastodon.social),也不会归因于 Evan 过去的行为(在 pump.io 上重新部署 identi.ca )。 我认为任何人都不应该这样做。 做好这件事很难,我们都在边走边学,并努力利用有限的时间和有限的资源去做到最好。

    Evan 后来成为 ActivityPub(联邦宇宙运行的协议)的主要创建者之一。 Eugen 发起了 Mastodon 软件项目,我坚信这个项目让联邦宇宙蓬勃发展到了今天的样子。 我真的很欣赏他们的工作,并认识到如果没有人发表意见,在社交媒体空间中做任何事情都是不可能的。

    然而,这并不意味着我们不能仔细思考这些决定,也不应该对此有这些意见。


    更新:我(原作者)犯了一个傻傻的错误,mastodon.social 由 Fastly 提供保护,我以为是 CloudFlare。修复了,感谢指出这个错误的人!

    更新2:衷心感谢 Jorge Maldonado Ventura 提供了这篇博文的西班牙语翻译,并在 CC BY-SA 4.0 下发布。 谢谢!

     
    阅读更多