Stelpolva Write

Reader

Read the latest posts from Stelpolva Write.

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...