<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>shejialuo</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://luolibrary.com/</id>
  <link href="https://luolibrary.com/" rel="alternate"/>
  <link href="https://luolibrary.com/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, shejialuo</rights>
  <subtitle>秋意深，四下之人正何为？</subtitle>
  <title>洛的藏书阁</title>
  <updated>2026-05-10T19:11:35.507Z</updated>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="游戏笔记" scheme="https://luolibrary.com/categories/%E6%B8%B8%E6%88%8F%E7%AC%94%E8%AE%B0/"/>
    <category term="GalGame" scheme="https://luolibrary.com/tags/GalGame/"/>
    <content>
      <![CDATA[<h2 id="感想"><a href="#感想" class="headerlink" title="感想"></a>感想</h2><p>Rewrite不愧是人类圣经，不得不感慨田中先生的笔力以及世界观的塑造，在我的心里，这是一部极其优秀的文学作品。田中先生依然把作品收束于孤独和爱，给我灌下了一碗猛猛的鸡汤。田中先生实际上在无形之中给读者提出了一个问题：<strong>人类到底是应该追求小小的幸福还是说为了可能性，选择孤独舍弃小小的幸福</strong>。显然在前面的五位女主个人线中，男主选择了属于自己小小的幸福，经过了Moon和Terra线，男主选择了孤独一人的道路，背叛了所有的人，展现了人类的可能性。</p><p>作品的叙述方式其实很简单，五位女主线都是发生在月球上的。是月球上的篝希望找到人类的可能性，让生命继续延续下去。而Moon线可以理解为这一切可能性的收敛，而Terra线是因为在Moon线找到了延续可能性的方法，月球上的篝把生命传递到地球中。</p><ol><li>瑚太朗在遇到篝的时候不选择“逃走”，那么会被篝伤害，小鸟会救瑚太朗，瑚太朗因此变成魔物。年龄段变成和小鸟一样，成为所谓的高中生“享受”校园生活，这就是五位女主的个人线。</li><li>瑚太朗在遇到篝的时候选择“逃走”，那么就是真正的结局，Terra线。</li></ol><h3 id="盖亚与守护者"><a href="#盖亚与守护者" class="headerlink" title="盖亚与守护者"></a>盖亚与守护者</h3><p>游戏中，塑造了两个阵营：盖亚与守护者。在我看来，盖亚和守护者都是在逃避问题，盖亚希望通过“键”的救济来一了百了，认为这是星球的意志，阻挡也没有必要。而守护者认为要维护人的权利，不能剥夺其他人的生存权，所以要杀死“键”阻止救济。盖亚是典型的消极主义，而守护者本质也是在回避，因为星球的救济是必然的。显然，两个阵营从来没有思考过能否合作解决问题，能否通过技术的手段让人类面对星球的救济后仍然能够生存下来，即思考人类未来的可能性。</p><p>在五位女主个人线中，游戏中通过你想要改变世界还是自我这两个选项来区分到底是去盖亚阵营还是守护者阵营。实际上在朱音线中，田中通过朱音的话是给出了自己的解释的。面对不满，信奉盖亚的人觉得光凭自己的力量无法改变而守护者选择通过强化自身。这是对待世界的两种完成不同的方式。</p><p>显然，大多人可能会对守护者抱有好感，实际上，比起盖亚来说，我更讨厌守护者这个阵营。守护者这个阵营总是抱有对强者的崇拜，因为他们是通过对自己的改变的，会天然地对弱势的人歧视。而盖亚却能够接纳在这个世界上无法生存的人，让他们或多或少能够在这个社会上立足，然而盖亚也利用他们这种绝望的心情来接受星球所谓的救济。说白了，两个组织都是一路货色罢了。然而，这就是我们的现实世界。</p><p>我不禁意间就会想到，我们在现实世界难道也不是被这些组织所玩弄吗？被所谓的这些意识形态裹挟？在个人线中，男主也在思考这个问题，难道自己一定是要选阵营吗？令人欣慰的是，男主是因为各个女主选择了盖亚&#x2F;守护者。我认为我们在现实世界应该这么做，不能被意识形态所裹挟，守护好属于自己的小小的幸福。</p><h3 id="个人线"><a href="#个人线" class="headerlink" title="个人线"></a>个人线</h3><p>女主线我只想讨论小鸟、千早和朱音。静流和露西娅的人物塑造我认为很一般。</p><h4 id="小鸟"><a href="#小鸟" class="headerlink" title="小鸟"></a>小鸟</h4><p>小鸟可谓是贯穿整个作品的一位非常重要的角色。实际上我个人认为小鸟线是值得二周目的，因为在二周目的上帝视角下，我们更能体会小鸟彻底的孤独。幼年时的小鸟曾经因为瑚太朗逃避自己对母神会的厌恶说，逃避只能使宝贵的人生不断流失，我可不会逃避的。然而，当小鸟和父母一起出去旅行，除了事故的时候，小鸟选择和德鲁伊签订协议，为了复活她的父母。小鸟内心清楚自己在逃避，但是小鸟也无法做到不逃避。</p><p>特别是当我知道小鸟的父母是魔物的时候，我不由的回想起一开始就是小鸟的母亲让瑚太朗寻找小鸟，这到底是小鸟的命令还是想小鸟的母亲自身的意志呢？其实，此处的留白让我深深地感受到了小鸟的寂寞，一个人在森林里背负着重任，因为她不想要让自己的父母和瑚太朗失去生命。这可谓是她生命中最重要的人。</p><p>小鸟曾经被瑚太朗告白过，在小鸟的心里她对男主的看法是极为复杂的。她认为男主是自己创造的魔物，但是瑚太朗却按照自己内心的想法而活。在小鸟线中，小鸟对瑚太朗的原话：“原本的瑚太朗君说不定已经不在了”。在整个世界线中，男主遇见小鸟的时候，年龄差距是很大的。男主那个时候算不上温柔，而男主被小鸟救了后，却性格大变。从小鸟的角度来看，她已经觉得瑚太朗是被她改造过的。而本身小鸟也处于把自己过世的父母变成了魔物的悔恨中。所以，这也是为什么小鸟希望男主找了其他的女朋友，这是不是就是说明瑚太朗并不是魔物，小鸟反而能觉得是慰藉了，不然爱上的就是自己的欲望罢了。</p><p>超自研给小鸟带来了容身之所，感受到了人与人之间的温暖。除了男主以为，她也结交了朋友。然而，田中是真的毫不留情面啊，日常的崩塌随即而来。面对阵营的分割，昔日是好友的几人却不得不刀刃相向，是多么让人觉得寂寞啊。小鸟是被德鲁伊的责任束缚着的，不得不背上守护“键”的重担。然而瑚太朗什么也做不了，就如同月球只能围绕着地球旋转一样。这种无力的孤独感是我个人认为在小鸟线中塑造的极其精彩的氛围。面对盖亚和守护者的两大势力，小鸟和瑚太朗几乎什么也做不了。</p><p>让我欣慰的就是在这条线上小鸟终于完成了自己的心愿，能够和瑚太朗逛一逛收获祭。</p><h3 id="朱音"><a href="#朱音" class="headerlink" title="朱音"></a>朱音</h3><p>会长线其实探索了不少的东西。会长因为继承了上代圣主的记忆，采取了毁灭星球的做法。我认为田中在这个线路里面探讨了一个非常有意思的问题，当一个人的选择如果只是被植入了一个程序，这个人算是有自由意志的吗？那么朱音该不该承担这个罪孽呢？实际上，这是一个非常哲学的话题了。给我的感受是，任何以所谓更高目的为名剥削个体自由意志的系统，都是对人彻彻底底的暴力行为。</p><h4 id="千早"><a href="#千早" class="headerlink" title="千早"></a>千早</h4><p>在千早线中，我很喜欢瑚太朗的想法，他并不属于任何一个阵营，他只为了千早而战。这是我很喜欢的一条线，我并不认为小小的幸福就不能追求，相反由于个体的弱小，往往我们只能守护住着小小的幸福。（当然，可能在田中眼里，我已经舍弃了可能性了）。</p><p>千早和瑚太朗两个人在超自研活动室的时候，仍然怀念着过去的日常。怀念着大家都在的超自研。瑚太朗是由衷地希望盖亚和守护者的冲突能够结束，而他能够和千早一起在收获祭里面享受节日的乐趣。我觉得这就足矣，无论是加入盖亚还是守护者都无法得到所谓的答案，只会被势力所利用为了势力自身的利益。</p><h3 id="Moon-Terra线"><a href="#Moon-Terra线" class="headerlink" title="Moon&#x2F;Terra线"></a>Moon&#x2F;Terra线</h3><p>瑚太朗从小就是孤独的。或者说瑚太朗的波长总是与他人不合，即想改变自己（守护者），也会产生痛恨这个世界的想法（盖亚）。实际上，瑚太朗这样的想法才是我们普通人的想法。然而往往我们既无法改变自己，也无法痛恨这个世界，就这样活着。然而，我们谁也不希望生命是停滞的。正如小鸟对派罗的照顾，让瑚太朗意识到了自己需要前进了，不能这样止步不前了。</p><p>然而，哪怕瑚太朗加入了所谓的守护者，瑚太朗真的就找到了所谓的容身之处吗？也就是所谓的团体。我不由地思考到，我们活在这个世界上，总是会去思考自己的容身之所在什么地方。然而这个问题最简单的答案，可能就是构建家庭。然而，如果真的叩心自问，我认为我们会像瑚太朗一样，会发问自己应该成为什么样的人，名为“我”的事物到底是什么？面对这些本质问题的时候，我能做到不逃避吗？</p><p>田中先生借Moon和Terra描述了一个极其重要的道理，人们应舍弃理念的斗争，通过公开技术的方式，哪怕要舍弃小小的幸福，孤独一人，也应该要开拓。实际上这就是Rewrite这部作品立意极高的地方。我们人类因为理念在内斗，表面上希望能够合作实际都是为了利益而勾心斗角罢了。田中先生倒是思考了人类未来的前进方法，抛弃理念的斗争，共享开放才是唯一的出路。我只能说，干了这碗鸡汤，也算是浪漫主义了吧。</p><h4 id="孤独与羁绊"><a href="#孤独与羁绊" class="headerlink" title="孤独与羁绊"></a>孤独与羁绊</h4><p>田中先生的作品总感觉逃不过这两个话题。每次一涉及到这两个话题的时候，我的内心总是感觉到空虚无比。田中先生借篝的口说出了：<strong>因为生命，必须要能够忍受孤独。因为生命，必须要有与孤独为伴的力量。只要还有记忆在，就能耐的住寂寞</strong>。又让我看到了《Cross Channel》的影子。这么多年了，我似乎已然习惯了孤独。然而，这样的话太让我感到寂寞了。我不由的回想起我过世的外婆对我所说的话：“<strong>我已经习惯孤独了</strong>”。</p><p>田中先生自然也讨论了朋友，我觉得我很幸运，至少我认为我做到了像吉野一样，真诚且坦率地活着。</p><h4 id="知性与爱"><a href="#知性与爱" class="headerlink" title="知性与爱"></a>知性与爱</h4><p>田中先生认为拥有知性的人是会变得孤独的，也就是<strong>知性塑造着自身的孤独</strong>。懂得越多，人越理性，就越难以摆脱孤独吗？或者说就越能意识到自我的孤独本质吗？这些真的能够靠爱就能救赎吗？</p><h2 id="摘抄"><a href="#摘抄" class="headerlink" title="摘抄"></a>摘抄</h2><h3 id="序章"><a href="#序章" class="headerlink" title="序章"></a>序章</h3><blockquote><p>有一天，察觉到自己一无所有。<br>发现本以为堆满着幸福的口袋，其实空无一物。<br>因为我没为在口袋里塞些什么而努力，所以是理所当然的。<br>而我，却连这种事都想不明白。<br>因为我的人生至今散漫并且没有意义。<br>然而某天，我觉查到自己白白浪费了许多时间。<br>我跟谁都能说得上话。无论是怎么样的人。<br>可是我没有好朋友。一个都没有。<br>这究竟意味这什么，我从未思考过。<br>我的人生，一直平淡乏味。<br>曾经的青梅竹马神户小鸟，才是唯一可毫无顾忌聊天的朋友。<br>没错。<br>……朋友，曾经是。<br>(……重新来一次)<br>(而且，要做得更好)<br>深切的愿望。<br>但是，这十分困难。<br>所有人都为了它而辛苦。<br>没人能够无所事事却变得幸福。<br>只能一步一步的靠自己的力量想幸福迈进。<br>幸福究竟是什么呢？<br>跟青春相似的东西吗？那青春又是何物？<br>“是耀眼的东西吧。”小鸟这样说。<br>“……天知道，根本没有仔细想过”吉野丢下这句话。<br>很久之前，有人说过那是“人生走钢丝”。<br>三个人的意见，我认为都是正确的。<br>耀眼、未知、并且令人恐惧的东西。<br>这问题很难，因为没有限定的答案。<br>但我决定要踏上寻找它的旅途。<br>只是，时间无情地流逝。<br>夏去秋至，时间如水。<br>转眼间，已经高中二年级了。<br>焦急了。<br>如今我手中依然空无一物。<br>而我依然找不到任何应该做的事。<br>仅仅没有目标的徘徊着。</p></blockquote><h3 id="角色线"><a href="#角色线" class="headerlink" title="角色线"></a>角色线</h3><blockquote><p>她没有可以一起玩的朋友，<br>一直都是一个人。<br>在镇子里撒欢夜游什么的，<br>和小鸟无缘。<br>她一直只在森林里玩。<br>…那可能是，有点寂寞的事情吧。</p></blockquote><blockquote><p>瑚太朗：果然人与人之间，还是有所谓波长的合与不合的。<br>小鸟：似乎能明白你说的。<br>瑚太朗：交朋友的话，容易接触，不属于任何群体的家伙就很不错。</p></blockquote><blockquote><p>随随便便交换邮件地址实在是太轻率了，在一个个阶段交好继而又马上断交的友人关系，有什么意义么？<br>但抱有这种想法的话，连获得真正友人的可能性也一并舍弃了。<br>并不是无所事事任时间流逝，而是怀着坚强的意志活着。<br>藉此，人生收获良多。<br>如果没有那种决意呢？<br>那么人际关系就很重要了。<br>与各种各样的人相遇、交谈、学习、欢笑，进一步…</p></blockquote><blockquote><p>瑚太朗：凤为什么会在这个时期过来这边呢？<br>千早：哈、哈？那个…<br>千早：这个时期，刚好非常适合。<br>瑚太朗：哈？<br>千早：夏天太热冬天太冷。<br>瑚太朗：嘛，对于搬家作业来说可能确实是不错的时期…<br>因为那种马马虎虎的理由转学，这算什么嘛。<br>瑚太朗：父母他们呢，说来，他们就没反对转校么？<br>住得远的话，一般坐电车上学就可以了吧。<br>千早：…没反对。<br>瑚太朗：诶～<br>又是个自由的家族。<br>千早：为什么要问那些事呢？<br>瑚太朗：哎呀，不是很普通么？问搬家的理由啊、双亲的工作啊什么的？<br>千早：…很普通么？<br>瑚太朗：大概吧。<br>千早：那…<br>千早：搬家的理由是，对搬家来说这时候正好。<br>瑚太朗：…真自由。<br>千早：很自由的。<br>瑚太朗：那，双亲工作呢。<br>千早：双亲的话，没有工作。<br>瑚太朗：哈？<br>千早：因为没有双亲。<br>瑚太朗：………<br>听到不好的事了。<br>千早：…就那个意义来说，我确实是“自由的”呢。<br>瑚太朗：啊啊…<br>“自由”。就肯定意义而言，是没有自由的人都会羡慕的词语。<br>但千早所说的“自由”，是任谁都不会羡慕的“自由”。<br>名为孤独的自由。<br>瑚太朗：那样啊…<br>千早：干、干嘛气氛搞得那么低落。<br>瑚太朗：没，总觉得自己问了不该问的。<br>千早：问的这些都很普通吧，所以很普通的。<br>瑚太朗：听到的内容却不普通。<br>千早：…对我来说很普通<br>瑚太朗：是么？<br>普通到底是什么呢，对谁来说是普通的呢？<br>也许对我、对大多数人来说普通的事物，也会有觉得不普通的人存在。<br>…那不是非常少根筋么？</p></blockquote><blockquote><p>我迈出一步。<br>就像大家说的一样，鼓起勇气向前迈步。<br>但勇气的代价，绝对不小。<br>心变得支离破碎的可能性也是有的。<br>不管失败多少次，迈出新的一步就好…<br>但人类不可能无限地坚强下去。<br>努力也是有限度的。<br>因此我，再一次地，试着向前迈进。<br>怕得发抖，也许会失去太多的东西…<br>努力赢得、奋力抓取、大胆迈步。<br>丝毫不认为那么做是漂亮、健全的决断。<br>死也不想在心碎之后被人安慰说什么“你已经很努力了。干得很漂亮。”<br>我单纯只是因为想要，无论如何都很想要，所以才行动的。<br>我觉得自己，死都想要那个。</p></blockquote><blockquote><p>朱音：你到底是外界干涉者呢，还是自我改革者呢。<br>瑚太朗：外界？自我？<br>朱音：想想前人们说过的话吧。<br>朱音：是具有改变世界方向的资质呢，还是具有强化自我方面的性质呢。<br>瑚太朗：不是很明白你在说什么？<br>朱音：现在不去在意也是可以的，总有一天会明白的，一定、恐怕、或许<br>朱音：如果什么都不具备的话，那对你来说也应该是求之不得的事吧。</p></blockquote><blockquote><p>吉野：既然拥有…这种程度的力量…你小子却…!<br>瑚太朗：力量是什么？<br>瑚太朗：我从这种东西里头，看不到哪怕一丁点的价值…！<br>瑚太朗：比起那种东西，我更想认真地活着。<br>瑚太朗：用力量来定义活法这到底是想怎样啊。<br>瑚太朗：特别的家伙将其力量全开的话…为什么后来就变成孤高地活着了啊！<br>瑚太朗：那种事情，非常让人困扰啊！<br>瑚太朗：别随随便便决定他人的活法啊～！</p></blockquote><blockquote><p>总感觉自己也慢慢改变了…<br>不知为什么，但就是这么认为。<br>想到了之前会长出的那张调查问卷。<br>那里反映了我真实的想法。<br>并非是对改变感到了恐惧，而是在如今并未定下明确目标的时候，对接踵而来的变化感到了些许不安。</p></blockquote><blockquote><p>绿的话，应该只给人好的印象。<br>应该是干净、美丽、了不起的、好的东西。<br>直到现在，我都隐隐约约那么觉得。<br>但绿其实不是那样的东西。<br>不知哪来的某人把本该完成的修整工作怠慢了的话，就会变成这样。</p></blockquote><blockquote><p>我对人工绿化表示怀疑。<br>从这些并未真正绿色的东西中，我感受到欺骗的意味。<br>但现在，我打心底觉得…..<br>虚假的绿化，对人类来说也是必要的。<br>不干净的绿，人类是无法忍受的。<br>然后最起码在风祭，那些干净的绿还是有的。<br>森林里没有虫子。不允许有。<br>肯定是谁，用药、或者别的什么，朝里面注入了什么东西吧。<br>瑚太朗：假如是在森林里生活，应该不太可能过干净的生活吧。<br>小鸟：那是因为，生命就是如此呐。<br>小鸟：所谓生命，就是又脏、又臭、令人毛骨悚然的东西哦。<br>小鸟：但是呐，人类这种东西一旦过过好日子，就再也不想回到贫困的生活了。<br>小鸟：生命也是如此。一旦整洁过一次，就再也不想变回成原始的乱七八糟的生命了。总觉得就是那样…</p><p>瑚太朗：总是在考虑那些事吗？</p><p>小鸟：“习惯小小的幸福就ok了”的意思哦。</p><p>瑚太朗：我是打算适应这样的生活的。因为自己没什么大的奢望。</p></blockquote><blockquote><p>街道中弥漫着如往常一样的热闹气氛。<br>伴随着收获祭的临近，应该会变得更加热闹吧。<br>瑚太朗：总觉得<br>小鸟：嗯？<br>瑚太朗：我们，都变了呢。<br>小鸟：什么意思？<br>瑚太朗：最近，姑且试着尽自己所能地努力了下…<br>瑚太朗：与那努力相应，干得还算不错，也碰上些让我称心如意的事…<br>瑚太朗：但是，为什么呢。总觉得在某个地方，好像有东西被破坏了一样。<br>小鸟：…<br>瑚太朗：有时候还会觉得不安呢。<br>小鸟：我觉得，大家或多或少，都会有那种想法的哦。<br>小鸟：瑚太朗君呢，因为生病，再加上各种各样辛酸的经历…所以才会有那种想法吧。<br>瑚太朗：嗯，或许是那样呐。<br>瑚太朗：虽然我完全不记得自己曾经进过医院…<br>小鸟：但是时间的流逝是不会停止的。<br>小鸟：所以才会无意识地，想要取回以前的时间，不是吗？<br>瑚太朗：像这样隐瞒一些事，也许并不好吧，我这家伙。<br>小鸟：那就错了哦。谁都会隐瞒一些事的哟。<br>小鸟：就算是我，也会有很多的秘密哦？<br>瑚太朗：哈哈。反正，都只是些让人发笑的秘密吧。<br>瑚太朗：在体重上做几公斤手脚之类的。<br>小鸟：那也不错呢。<br>瑚太朗：如果你说的秘密都是那些东西的话，倒也蛮可爱的哦。<br>小鸟：想成为一个可爱的女人呢。<br>瑚太朗：但是我…<br>我的记忆却模糊不清。<br>一旦回忆过去，就会变成这样。<br>瑚太朗：呐，我啊…到底是患了什么病呢…<br>小鸟：什么病呢。一种名字很难读的病。<br>小鸟：但现在已经治好了，放心吧。<br>瑚太朗：放心…吗…<br>小鸟：放心放心～<br>小鸟：所以乐观点活下去吧。同时获得你想要的东西。<br>小鸟：这也是正当的权利呐。<br>总觉得小鸟的话中流露出了一丝寂寞。</p></blockquote><blockquote><p>随着时间的渐渐流逝，人也变得越来越多。<br>这次是看上去像大学生的一伙人。<br>老奶奶也开始话唠了。<br>傍晚，看起来像社会人的西服革履的人也开始造访了。<br>来这里的人，以在这里有过回忆的人们的总数而言，恐怕只是很小的一部分吧。<br>…但即便如此<br>瑚太朗：…也还是来了这么多人呐。<br>不明白为什么，只是单纯的很高兴。<br>人们聚在一起，真的是很高兴。<br>如此想着。<br>大家都各随己愿地任凭时间流逝。<br>把点心塞满嘴巴的人。<br>大概是小时候买不起玩具之类的东西吧，现在则一个劲地摆弄着的人。<br>用和以前不同花纹的面牌，一决胜负的人。<br>大家都一样，不停地谈着过去和现在的自己。<br>…<br>以前的小孩子已经完全变成了大人，然而在这里又一瞬间变回了小孩。<br>这里就是那种地方啊。<br>肯定，如果没有这样的机会的话，一般是不会过来的吧。<br>…可是，“这样的机会”，已经是最后一次了。<br>老奶奶只是，慈祥地看着那个场面。</p></blockquote><blockquote><p>太阳下山前。<br>店面的百叶窗降了下来。<br>瑚太朗：就这样结束了么。<br>小鸟：没办法呢…<br>稍微有点“这说不定是个机会，老奶奶的店会不会继续下去呢？”这样期待着。<br>但是，并不是这样的。<br>人总会一天天长大。<br>我们终会成为大人。<br>小孩始终成为穿着西装的社会人。<br>阿姨终会成为老奶奶。<br>是的，就这么长大。</p></blockquote><blockquote><p>出现了奇怪的景象啊。<br>时至今日，大家一起构筑起来的东西，就这样简简单单地崩溃了。<br>然而谁都没有反抗。<br>只是很平淡地接受着。<br>我实在无法理解。</p></blockquote><blockquote><p>是原超自研的活动室啊。<br>…那些快乐的日子，在感觉中就好像是遥远过去的事情了呢。<br>但是那已经一去不复返了。<br>一直这么耿耿于怀也没啥用。<br>所以要展望未来。<br>不回首。不叹息。<br>“那时已经过得很愉快了”，要这样积极地去想。<br>这样的话，总有一天可以将失去的遗憾变成美好的回忆。<br>但是，话说回来，我当初为什么想着要建立超自研啊？<br>到底是为了谁而创办的社团活动啊？<br>那是为了将其当作回忆来保存，不可或缺的信息。<br>但是它缺失了。<br>完全没可能会忘记的东西，不知为何却斑驳地从我的记忆领域中剥落了。</p></blockquote><blockquote><p>能感受到我和其他人的差异。<br>有一个疑问。<br>那是…<br>那是，这种态度的温差到底是从什么时候开始有的？<br>存在于人类根本之处的思考方式不同。齿轮不合。<br>我们的齿轮直到昨天，都应该还咬合得很好才对。<br>建立起了很好的社团。<br>所以大家才聚集起来的不是吗？</p></blockquote><blockquote><p>但要将人际关系做技术处理，还真有点可怕。<br>因为技术这种东西，也有擅长与不擅长之分。<br>会交流的人能获得广泛的信任，对此苦手的人很容易被孤立。<br>（我说不定完全算是不会交流那类人…）<br>因此才加入超自研。<br>打算建立起真正的人际关系网。</p></blockquote><blockquote><p>吉野：你们要好得任何人都无法插手吧！<br>吉野：你们不是都好到那种程度了吗？这样的话，为什么要用谈论外人的语气来说她转校的事情？<br>吉野：你告诉我，是你薄情吗？还是说……只有我看差了吗？<br>吉野：你就没有一点仁义吗，就没有一点人情吗？<br>吉野：羁绊什么的都是假的吗，人的心灵和珍贵是无缘的吗？<br>吉野：这个世界就是单靠这种肤浅表面的人际关系，支撑起来的吗？<br>吉野：要是说只有我才是奇怪的话…要是你们才是正确的话，那正好。<br>吉野：像这样腐朽可恶的世界，让我来否定它！<br>吉野：叛逆，叛逆，一生都要反抗给你们看！</p></blockquote><blockquote><p>总觉得自己想哭。<br>肯定不是因为害怕。<br>而是其他的理由。<br>我一直，都觉得我觉察到了那家伙的本质。<br>时不时的会变得粗暴，但那实际上是一种令人欣赏的率直。<br>所以…我才想要和他做朋友。<br>结果就是这样了。<br>我没有被自己真正喜欢的人所喜欢。一直都是这样。<br>瑚太朗：应该道谢的…是我才对…<br>班主任：诶？<br>瑚太朗：向吉野…向那家伙…<br>瑚太朗：那家伙和小鸟还有我，看起来离得很远，但是却是联系在一起的…<br>瑚太朗：在我心中，三个人是一个铁三角…也就是说，三人一直这样就好了…我是这么希望的。<br>瑚太朗：虽然我嘴上说为了被孤立的小鸟。<br>瑚太朗：但是呐，其实是为了我自己。<br>瑚太朗：打着小鸟的旗号，来缓解自己的欲望。<br>瑚太朗：到头来，我就是把小鸟…看成是到路边的石头一样…<br>瑚太朗：即便是现在，我心中重要的部分也是在被麻痹着…<br>瑚太朗：到底为什么会发生，这样的事呢…人的心，会这样的…<br>瑚太朗：我的心，会这样腐烂下去的呢…</p></blockquote><blockquote><p>瑚太朗：因为我…最初…就觉得…那家伙和我还有小鸟…是能够很好地相处的啊。<br>瑚太朗：一个人的话是孤独，两个人在一起的话是妥协，但是三个人的话…<br>瑚太朗：有3个人的话，就可以相互称作是“大家”了啊。<br>瑚太朗：这个，肯定就能被成为是人际圈子了。<br>瑚太朗：我希望能够成为，“大家”之一。<br>瑚太朗：因为，那对于想在什么地方找到自己归属的人来说…是一种救赎啊。<br>瑚太朗：所以人才想要归属于什么地方，想要成为别人的家人，想要成为团体中的一员。<br>瑚太朗：每个人都是为了成为某个组织的成员，而生活着的。<br>不知不觉中我哭了起来。<br>在同班同学的面前，不觉得羞耻地、不顾及面子地、毫无要领地哭着。<br>…真不像样啊。<br>瑚太朗：我们之间，距离很远。<br>瑚太朗：就像吉野说的那样，从上面看的话挨得很近，但是从侧面看高度却不同。<br>瑚太朗：之所以相互离对方很近，感觉上很远就是这个原因了。<br>瑚太朗：因为人们，都站在不同的高度上。<br>瑚太朗：我前段时间受了打击…虽然不清楚具体是怎么回事，但是我好像失去了和小鸟之间的回忆了。<br>瑚太朗：现在也是这样…明明那些珍贵的事情就在我心里，却感觉不到实感。<br>瑚太朗：太渣了啊，我…</p></blockquote><blockquote><p>对那样可怜的小鸟，我应该说些什么话好呢。<br>想不出什么好的说话方式。<br>小鸟试图一个人承担一切。<br>我却没有能力去支持她。<br>虽然我急切希望能够帮忙，但是力量却不足。<br>也没有时间让我去进步的吧。<br>事态已经急迫到就算是着急也没用的程度了。<br>（我到底是什么呢？）<br>难道仅仅是飘在周围咕噜咕噜地转着的存在吗。<br>就好像月球。<br>在地球周围转动的卫星。<br>啊啊，真的就像月亮那样呢。<br>我想回身抱住她。<br>但是我却做不到。<br>就像现在的我和小鸟之间的，永远无法相互进一步接近的关系那样。<br>月球也是永远用同一面在面对着地球转动的。<br>我能够面对小鸟的，是不是也只有这背后的一面呢。<br>不能够直接传达感情，不能尽力做想做的事情的情况一个接一个的出现。<br>第一次听到的小鸟哭泣声，从耳边划过。<br>小鸟：已经，不管怎么努力都做不到了啊……<br>小鸟：已经晚了啊…!</p></blockquote><blockquote><p>我感到浑身似乎汗毛竖立。<br>身体在颤抖。<br>愤怒、欢喜、悲叹。<br>哪种感情都有，但又存在着与哪种感情都不同的，巨大的感情的波涛。<br>我的感情一直被小鸟避开，被避而不谈。<br>我告白的时候也是。<br>就是是温柔的气氛充盈我俩之间的时候也是。<br>小鸟刻意避免获得任何重要的东西。<br>她在害怕。<br>不知道哪天，所谓的“使命”就会把她人生的全部东西都吞噬掉，小鸟一直在害怕着这个。<br>所以一直让自己保持着什么“不爱上任何人和事”的状态。<br>她从这里逃开了。<br>不去和任何人有所深交。<br>但是她怎么能否定得了呢？<br>对于我来说，小鸟是毫无疑问的值得去“爱”的存在。<br>我认为想要变得冷漠，但是却失败了的小鸟的人生，是需要我的爱怜的。</p></blockquote><blockquote><p>小鸟：跟父亲他们不同，瑚太朗君也会说话，也能凭自己意志做出判断。<br>小鸟：但是…我无法肯定…这到底是不是因为我自己的愿望而产生的效果…<br>小鸟：说不定是我无意识地操纵呢。<br>小鸟：原本的瑚太朗君说不定已经不在了…<br>瑚太朗：不，没有这事。虽然很模糊，但是我童年时代之类的记忆还是有的。<br>小鸟：因为都是用的一个大脑，记忆的有无是不能作为证据的哟…<br>小鸟：但是我不想去考虑这个…<br>小鸟抱住了我。她的眸子里已经失去了平常的光泽。<br>小鸟：如果瑚太朗君仅仅是我愿望的现实表现的话…<br>小鸟：大概…我就，没办法再努力了。<br>小鸟：但是…这件事我不想去证明…就这样…<br>小鸟：我想就这样…结束掉…<br>瑚太朗：不要啊，不要放弃啊！<br>小鸟：但是啊…<br>瑚太朗：拜托了。<br>我紧紧抱住小鸟，让她不再说话。</p></blockquote><blockquote><p>小鸟：为什么，你的性格会变得跟过去完全相反了啊！！<br>瑚太朗：…那个…<br>小鸟：瑚太朗君，过去没有这么开朗！<br>小鸟：过去你很阴暗！对人完全不亲切！很冷淡！<br>小鸟：…一点都不温柔。<br>小鸟：我…好多次都被无视了…<br>小鸟：你没有来帮助我…<br>小鸟：你现在的…那个性格本身…就是我的愿望的证据…<br>小鸟：你是魔物！你是我制造出来的…依照我的心意造出来的魔物！<br>小鸟：不是真正的瑚太朗君…<br>小鸟：我，和自己的欲望，恋爱了…<br>枪口激烈地颤抖者。<br>瑚太朗：呐小鸟。<br>瑚太朗：“键”对你来说，是个重担吧？<br>瑚太朗：没能让圭介叔叔他们复活，还让我受了伤，连你自己的人生也被迫献给了她。<br>瑚太朗：你只是在用这家伙的事当借口，一直放纵着自己啊！<br>小鸟：不对…<br>瑚太朗：杀了它的话契约就会被打破，力量说不定也会失去。<br>瑚太朗：但是，现在有了那些盯上“键”的人杀了她的机会…<br>瑚太朗：你应该是对这件事深思熟虑无数次了吧？<br>瑚太朗：你一直在两者的狭间中痛苦、摇摆着。<br>小鸟：才不是…<br>瑚太朗：我不会容忍你的软弱。<br>瑚太朗：如果说你动摇了的话，我会去保护“键”。<br>瑚太朗：直到最后的最后…<br>瑚太朗：在残酷的选择尽头，会有着能令人接受的结局。<br>瑚太朗：让我们，一起走到那里去吧。</p></blockquote><blockquote><p>瑚太朗：那，还有一个问题<br>朱音：什么？<br>瑚太朗：退出盖亚，一起来平息斗争。这个做不到吗？<br>朱音：你是笨蛋吗？<br>瑚太朗：大概是吧。</p></blockquote><blockquote><p>瑚太朗：但是，就算是会长其实也很讨厌和静流还有露西娅为敌吧。<br>朱音：那是没有办法的事呐。<br>朱音：没办法呢。<br>朱音：再怎么感慨也没有办法。<br>瑚太朗：你也讨厌这样的事情吧。</p></blockquote><blockquote><p>瑚太朗：…我觉得啊<br>千早：什么？<br>瑚太朗：原本人类就和森林之类的绿色没法相容也说不定。</p></blockquote><blockquote><p>咲夜：但是，能贯彻软弱的话那也是一种强大哟。<br>咲夜：不过呢…看来现在的你并没有将其贯彻下去的想法。<br>瑚太朗：……<br>瑚太朗：我…是为什么要战斗来着…<br>千早：难道不是为了让超自研复活吗？<br>瑚太朗：嗯…<br>但是，我的想法确实是那样没有错。<br>想要取回…<br>那些快乐的日常。<br>仅仅如此。</p></blockquote><blockquote><p>秘书：既然知道了，还在留恋日常吗，阁下？<br>瑚太朗：当然了。<br>瑚太朗：无论怎样，都不会抛弃的。<br>瑚太朗：和你不同，我们是想要快乐地享受校园生活的。<br>秘书：…<br>听了那些，朱音的秘书便转过身去。<br>瑚太朗：那么说来还没有问过你的名字呢。<br>瑚太朗：明明都是部员。<br>秘书：我姓宫岛。我的名字的话怎样都无所谓了。<br>瑚太朗：那，官岛同学。<br>官岛同学慢慢地取出一串钥匙，递给我。<br>官岛：以后，就随便你了。<br>瑚太朗：当然了，我们一直都是freeman啊。<br>官岛走了。<br>那一刻，感觉她笑了。<br>虽然不知道是善意的笑还是侮蔑的笑。</p></blockquote><blockquote><p>无聊的社团活动。<br>不过，虽然是无聊的事情，但是真的很有趣啊。<br>一边看着博客和活动记录，一边和千早两个人聊着天。<br>两个人都知道的事。<br>只有我知道的事。<br>一一回忆起来。<br>并不能说是关系要好。<br>也有对峙，有各执己见。<br>现在想来的话，也许那是作为敌人的互相牵制。<br>…也许并没有那么好的回忆。<br>只是，为什么。<br>这样聊着不久之前发生的那些事情，竟然是如此的快乐。<br>瑚太朗：呐。<br>千早：…怎么了？<br>总是把已经发生过的事情一一美化，是人类的坏习惯。<br>瑚太朗：总觉得…<br>千早：所以说，怎么了？<br>但是，我要背负着那些，继续前行。<br>瑚太朗：…啊，不行吗？<br>瑚太朗：会长，因为是三年级，马上就要毕业了吧。<br>千早：所～以～说～<br>总有一天要结束。<br>有限的平和的时间。<br>瑚太朗：如果明年也能继续而话。<br>我把那个称为日常。<br>所谓的“现在”就是要在这个瞬间度过的。<br>已经过去的事情就会镀上金，像假的东西一样。<br>瑚太朗：啊啊，会长之类的上了大学也继续这么称呼吧。<br>瑚太朗：还要做事件调查之类的事呢。<br>瑚太朗：静流和露西娅也在。<br>瑚太朗：吉野也会来。<br>瑚太朗：是啊，咲夜也来的话也不错。<br>瑚太朗：…大概，不会无聊了吧。<br>但是，就算是镀上的金，只要不剥掉的话就会闪耀的吧。</p></blockquote><blockquote><p>魔物究竟是什么东西呢？<br>对我来说，对盖亚来说，都只认为那是可以被有效利用的怪物吧。<br>千早却把他称为家人。<br>大概，人是不能，死而复生的吧…即便可以，也不会把魔物叫做家人吧。</p></blockquote><blockquote><p>千早：明年要能如期举办就好了呢。<br>瑚太朗：是呀。<br>在那时，盖亚啊守护者啊什么的冲突应该也都全部结束了。<br>只要过上平常的日子就好了。<br>同时，时不时地享受这样的活动。<br>…节日，我想本来就是这种东西。</p></blockquote><blockquote><p>咲夜：我的能力是将已有的某种东西改写…<br>咲夜：但是，却无法改写出原本不存在的东西。<br>咲夜：…就像现在瑚太朗君能做到的这样。</p></blockquote><blockquote><p>欧若拉的剑。<br>一直，为了劈开前进的道路而产生的，我的生命之剑。<br>花瓣之剑<br>一直，为了守护而存在着的，咲夜的生命之剑。</p></blockquote><blockquote><p>家庭啊，生活啊。<br>正是有大家的支撑，才得以点亮光明。<br>虽然只是再普通不过的日常…<br>然而不知为何，我感到这份日常，格外的珍贵。</p></blockquote><blockquote><p>想一想要是就这样生活下去，在超自研的日子…已经一去不返了。<br>成员们分道扬镳，各自划分为盖亚和守护者两派，为组织而战…<br>聚集起那么多人，喧闹的社团活动，在活动室里喋喋不休，种种的种种…</p></blockquote><blockquote><p>叹了口气。<br>大概，我在超自研想做的，就是这样的事吧。<br>虽然不知道为什么，不过这样挺开心的。<br>大家聚在一起，虽然什么都不知道却可以做些开心的事。<br>我想拥有的青春，难道不是那样的么。<br>…好羡慕大叔他们。<br>能够那样，何时都能聚集起来像笨蛋一样折腾起来的关系。</p></blockquote><blockquote><p>瑚太朗：江坂先生是了什么，才加入守护者的呢？<br>江坂：什么原因，吗。我不觉得铁变成剑和齿轮需要什么理由。<br>瑚太朗：…<br>江坂：因为该这样做所以才这样做，仅此而已。你对于自己要变成什么，为什么要改变有想法了吗？<br>瑚太朗：没有…<br>只是想作为一些参考而已。<br>我依然是站在被保护的立场上，结果我只不过是处在犹豫期的延长期上罢了。<br>自己要怎样改变，怎样做…就算现在来作出决定，我的觉悟还尚未足够。<br>想要听听前辈的意见。<br>江坂：成为你该成为的事物吧。是要变成坚实强劲的钢剑，还是变成生锈易折，被弃之不理的小钉子呢，这是谁也无法决定的。<br>江坂：如果拒绝收敛锋芒，而盼望着能经常显露实力的话，那就只会着上锈斑而已。…你想要变成怎样呢？<br>瑚太朗：…<br>江坂：首先，你就不该跟其他人对比从而贬低了自己。<br>瑚太朗：只是，对于自己要变成怎样，我还没找到答案。</p></blockquote><blockquote><p>朱音：他们之所以外向而易于变得自命不凡，这就跟刚才说的资质有关。<br>朱音：但认为只要自己强大就什么都能做到的想法，依然欠缺了根本地解决问题的意志。<br>朱音：对守护者们来收，斗争正是他们证明自己的存在的手段。</p></blockquote><blockquote><p>朱音：但是很意外啊。明明，看起来像是对这个空间最执着眷恋着的人。<br>瑚太朗：考虑了很多很多呢…<br>退学不上这种事情，说实在的确实很难过。<br>但是就算留在学校，超自研也变不回原样了吧。<br>肯定又变成了白费力气地空转着的状态。<br>尽管如此强忍到毕业，到了大学或者是职场之后应该是可以快乐地生活下去的。<br>但是…那样的自己几乎变成了我难以想象的人了。</p></blockquote><blockquote><p>那么说着的朱音，看起来比平常更加寂寞。<br>朱音：告诉我一件事。对你而言，学校能称得上是最好的场所吗？<br>这是个个人的问题。<br>瑚太朗：最好…倒是谈不上，但是…<br>瑚太朗：想要让它变成最好而努力的结果就是现在这样。<br>瑚太朗：我，一直都是在白费力气做着无用功吧…<br>瑚太朗：看起来很不像样吧。</p></blockquote><blockquote><p>将目前需要的东西塞进了旅行袋里。<br>拿起教科书，苦笑。<br>这已经不是我需要的东西了。<br>漫画、书、游戏机、衣服…<br>过去构成我的各种东西都在这里。<br>但是现在已经，连我的一部分都不是了。<br>一切都成为了褪色的过去。</p></blockquote><blockquote><p>朱音：所谓的盖亚主义呢，就是从相对的角度上把握地球环境的思想。<br>朱音：用一句话来说明的话，就是比起人类来说更重视星球存续的考量。<br>朱音：…所以说，对像你这样的人来说，这儿是个很痛苦的地方也说不定呢。<br>朱音：所以说如果要陪在我的身边的话…请闭上眼，塞住耳朵吧。<br>朱音：但是如果，到了无论如何都忍不了的时候…是呢，到那时候…随你喜欢做什么去做就好了。<br>瑚太朗：随我喜欢是说…<br>朱音：就算是背叛了，也没关系的意思哟。</p></blockquote><blockquote><p>在朱音因为工作离开的这段时间，我陷入了沉思。<br>成为盖亚的伙伴也就意味着，会和守护者敌对。<br>也就是说，即便是杀人或者是被杀的时候也是会有的。<br>如果可以的话，我想做正确的事情。<br>不想做会让痛苦的行为。<br>但是对我而言，那是最好的选择吗？</p></blockquote><blockquote><p>朱音：对世界感到不满，但是光凭自己的力量却改变不了。那种黑暗的冲动，化作狰狞的野兽的姿态而表露出来…那就是魔物。<br>朱音：那样强大的抑郁，有时甚至会招致毁灭的冲动。<br>朱音：魔物使的各位之中，也有人深藏这格外强烈的情感。<br>瑚太朗：也有与此相反的人吧。<br>朱音：在直面问题时，当自己没有足以与之抗衡的能力的情况下，依然通过改变自己来克服困境，这种人也有存在。<br>朱音：对他们来说，只有自己是可信的。通过自身的强化来克服困难。那就是…<br>瑚太朗：超人。</p></blockquote><blockquote><p>津久野：盖亚主义并不大喜欢对生存的强烈执念。<br>瑚太朗：比起个人来说，星球整体才更重要…好像是这样说的吧。<br>津久野：对于在生活中失败了一次的人来说，那种想法会更加轻松吧。<br>津久野：你也是失败了的…然而，却还没失去活力。<br>瑚太朗：我？<br>津久野：对我们来说，是在羡慕的同时却又心存妒忌的存在。<br>津久野：朱音小姐说过要保护你。<br>津久野：但事实上，说不定是对你抱有什么期待呢…</p></blockquote><blockquote><p>瑚太朗：最底线的，该守护的，作为人的领域还保留着吧…难道没有了吗？<br>朱音：…<br>语塞了。<br>如果同意的话只要点头就好了。<br>无言，就等同于认同了盖亚主义如病理一般的黑暗。</p></blockquote><blockquote><p>西九条：人类是傲慢的，自以为是的，残酷的。<br>西九条：那确实是罪过呢。<br>西九条：可是，天王寺君。<br>西九条：…尽管如此，人类也是应该生存下去的。<br>瑚太朗：…<br>西九条：无论如何罪孽深重，甚至需要牺牲其他东西。<br>西九条：虽然肮脏，人类也是应该生存下去的。<br>瑚太朗：…<br>瑚太朗：可是，老师，如果像今天这样继续下去的话，世界在三十年内会变成什么样子？<br>西九条：什么都不会变哦。尽管如此人也是应该被生下来，直到最后为止。<br>西九条：人类是不会允许人类被牺牲掉的。<br>瑚太朗：那就奇怪了。人正在虐待人吧？<br>西九条：…我承认不可能立马让所有人都幸福。<br>西九条：可是即使那样，我们也必须继续前进。<br>西九条：毫无根据就将人们的生活消灭的权利，谁都没有啊。<br>瑚太朗：有的，比如这个地球就有。<br>瑚太朗：如果地球有灵魂的话，不会赞同人类吧。<br>西九条：可是，我们应该可以为了拯救这颗星球而付出努力。<br>瑚太朗：毫无现实的言论，这只是精神论，理想论。<br>西九条：…即使现在看上去希望渺茫，可是如果最后一直到最后也不放弃的话…迟早都会成功的。<br>瑚太朗：不，绝对不可能。<br>西九条：一定可以的。因为那才是人类的坚强之处啊。<br>西九条：作为教师的我，一直想把那种想法传达给大家。<br>西九条：那就是人类的美丽和生存下来的美好。<br>西九条：对你也是一样的，天王寺君。<br>瑚太朗：…人类可并不美丽哦，老师。<br>瑚太朗：人类尽可能地吃，尽可能地破坏，尽可能地来差别化。<br>瑚太朗：直到最后也不放弃之类的，总之要做就能做到之类的，只不过是把强者的论调无限美化了而已。<br>瑚太朗：“虽然不知道人类是否罪孽深重，但我仍然坚信着人类的可能性”，像这样？<br>瑚太朗：“那么，会流出一滴泪水吗。我们也必须跨越这个悲剧”，这样么？<br>瑚太朗：那不是很搞笑吗，那是在欺瞒大家啊老师。<br>西九条：…<br>瑚太朗：无罪？不是的吧。全人类都有相等的罪过哦。<br>瑚太朗：不存在任何一个无罪的人类，在文明下生存着的人们，大家都是同罪的。<br>瑚太朗：如果想让星球的生命延续下去，我们就要立马舍弃这种便利的生活。<br>西九条：…<br>瑚太朗：“虽然人类也是愚蠢的，但是我还是相信着人类的美好～”，像这样说着，不是又在流传余毒吗？<br>瑚太朗：那个，你们所说的？那些所谓人类的美丽之处，在变得为时已晚以前会改变吗？<br>西九条老师低下了眼睛。<br>西九条：这样啊。天王寺君的结论原来是这个啊。<br>重新抬起的脸上，已经连一丝悲伤也见不到了。反而带着一股尖锐的一丝。<br>西九条：你所说的也有一番道理。<br>西九条：也许人类并不美丽。<br>西九条：…可是必须的活下去。<br>西九条：自杀绝不是人应该选择的行为。<br>西九条：更不能允许的是，在自杀中卷入其他人。<br>西九条：那时在侵害别人的生存权利。<br>瑚太朗：你们的思考中，只有眼前的利益啊，一点也没有对未来的展望吗？<br>西九条：因为我们首先是生存于今天的啊。</p></blockquote><blockquote><p>洲崎：人类从残酷的生存竞争中胜出，从原始的形态脱胎，获得了知性而站在食物链顶端。<br>洲崎：简简单单就被消灭，不就让知性声名扫地了吗？</p></blockquote><blockquote><p>极度的劫难。<br>虽然早有觉悟，但是还是小看了斗争。<br>面对魔物与面对人类，所要求的觉悟的程度完全不一样。<br>我连这种事都没有想到。<br>敌人会毫不犹豫地杀了我。<br>放弃吗？继续吗？<br>我有些许的迷茫。</p></blockquote><blockquote><p>被说不出的脱离感袭来。<br>真想大吼一声，人不是有理性的嘛。<br>被虚无感包围。<br>自动地战斗。<br>软弱的人们放弃了希望，在远离车的位置，毫无防备地坐着。<br>红与绿。如毒虫颜色般的天空。增殖着的绿。<br>没有停顿的毁灭之诗。<br>没有间断的微震。<br>大家正在失去人性。<br>难道像这样连心与精神到融化掉，全都回归星球吗。<br>我开始憎恨起星球来。</p></blockquote><blockquote><p>他们还以为自己的脚下还与旧世界接壤着。<br>很难对付啊。所谓有大量知识的人类。<br>对立，争论，互相抓话柄…<br>明明有了知识这样的就应该会被消除的东西，却从未消失。<br>为什么会那样呢。<br>回答是，因为是人类，只能这样说。</p></blockquote><blockquote><p>他就是那种人啊。<br>不和他开玩笑，也不深究下去。<br>比起以前，现在我们之间的对话变得非常平静。<br>都是扎根在生活之中的对话。<br>我，一直都误认为对话需要的是笑声与劲头。<br>同代的人大家也都这样想。<br>太认真的话就不好开玩笑。<br>对话必须开朗而快活。<br>如果不那么做，那就会在班级里落单。<br>…现在完全没有那种事了。<br>人总有一天会被问及本质。<br>想起来在教室里的吉野，最接近那样的处境。</p></blockquote><h3 id="Moon线"><a href="#Moon线" class="headerlink" title="Moon线"></a>Moon线</h3><blockquote><p>“我对任何人都不会隐瞒什么呢。”<br>“我认为谎话对于坚固的人际关系来说毫无意义。”<br>“互相倾诉心声，只有能够如此对待朋友的家伙才是真正的朋友吧。”</p></blockquote><blockquote><p>不知对谁，我开口说话了。<br>瑚太朗：老实说，之前说喜欢你其实全部都是谎话。<br>瑚太朗：因为比起喜欢他人，我是个更在乎自己的家伙啊。<br>瑚太朗：自己很可爱，自己很重要。<br>瑚太朗：我也会帮助别人。如果路上有人跌倒的话，我会帮助扶他起来。<br>瑚太朗：那种时候，我会感觉很不错的。<br>瑚太朗：做了好事了。变成好人了。<br>瑚太朗：帮助别人的时候自己也会很开心。<br>瑚太朗：其实对方的事怎样都好。我并非是打从心底担心他人。<br>瑚太朗：只是单纯的自我满足罢了。<br>瑚太朗：是利己的善行罢了。<br>瑚太朗：我觉得，干着和我一样事情的人，一定很多吧。<br>瑚太朗：倒不如说，过程中毫无快乐却还是施救的人，根本不存在。<br>瑚太朗：但那也不是问题所在。不管是什么生物，都是为了满足自己而活的。<br>瑚太朗：所以充实的生活才是人生最大的目的。<br>瑚太朗：那为什么，用于充实的手段一定要是漂亮的呢？<br>一面推敲词语，一面不紧不慢地锤炼思想。<br>语言茫然无绪地在空气中散开，而其实质，则是探寻自我精神深处手段的外在表面。<br>瑚太朗：那果然还是因为，想要获得团体的认同吧。<br>瑚太朗：想被大家称赞，想被他人喜欢。<br>瑚太朗：想要成为有人气的人；想要被他人宠爱；希望得到好的评价。<br>瑚太朗：…希望得到归宿。<br>这样啊。<br>我，也是这样的吗。<br>心灵的花蕾绽放。<br>开出愚钝的花朵。<br>悲伤的反面，是完全释怀的告白，与忏悔相类似。<br>不知不觉，眼泪溢了出来。<br>瑚太朗：我曾想要找到自己的容身之处。那是因为，我明白自己是个笨拙的人呐。</p></blockquote><blockquote><p>瑚太朗：我曾想要找到自己的容身之处。那是因为，我明白自己是个笨拙的人呐。<br>瑚太朗：一直很不安。总觉得大家，有一天会消失掉…<br>瑚太朗：害怕自己会变成一个人。<br>瑚太朗：超自研，也是基于那种动机才诞生的产物。<br>瑚太朗：太逊了…那样的我…<br>瑚太朗：只为了获取人气而拼命什么的…<br>瑚太朗：找到自己喜欢的家伙，被那个家伙喜欢，不安什么的就全都消散了。<br>瑚太朗：然后溶入世界之中…但为什么连世界本身也溶化了呢。<br>瑚太朗：仅怀着这样的小心思的我，是不是很不幸呢？<br>瑚太朗：但是呐，真正找到了容身之处的我，却从未后悔。<br>瑚太朗：因为人生，只要充实，就足以无悔。<br>瑚太朗：只要是为了自己喜欢的人，其他一切怎样都好。即使世界…<br>瑚太朗：即使世界毁灭也…<br>瑚太朗：是不是搞错什么了啊？<br>瑚太朗：大家都是相似的存在吧？那为什么只有我被拽到这里来了？<br>瑚太朗：为什么只有我…在这种…地方…</p></blockquote><blockquote><p>我变得真逊啊。<br>但这有关系吗。<br>反正这里既没有社会，也没有团体。<br>即使流露本心也不会失去什么。<br>是的，这才是真实的我。<br>胆小怕事、觉察到他人目光就会胆战心惊的、卑微的灵魂。<br>因此，也是无法奢求太多的、卑微的灵魂。<br>真讨厌这样的自己。<br>真的是讨厌到想哭了。<br>想要改变。但老是在原地踏步。<br>我放声痛苦。<br>干脆消失掉好了。<br>再也不想回忆起各式各样的人生了。<br>不管截取哪段，都是敷衍了事，得过且过的人生…卑微、可叹、虚无。</p></blockquote><blockquote><p>知性的提高，就意味着不由分说地让自己直视那些自己不想看到的现实。<br>所有的错觉都被否定，所有的欺瞒都被揭露。<br>无论怎样的纯真，都变得与愚钝无法区分。</p></blockquote><blockquote><p>如果这个宇宙里真有所谓的神存在的话，那家伙一定是在无法想象的苦痛中活着的吧。<br>知性塑造着自身的孤独。<br>无法将目光从这绝望和物理层面的无情中移走。<br>所谓人类，那是多么幸福的一种存在啊。<br>无法认知万物，这意味着多大程度上的救赎啊。<br>人类只要有爱，便会获得救赎。<br>但神，却无法仅凭爱获得救赎。</p></blockquote><blockquote><p>没有爱只有知性的生命，就无法继续扩展吗？</p></blockquote><blockquote><p>我们曾经生活过的世界，是更为多姿多彩温暖满溢的世界吧。<br>被称为无知、可能性、希望的事物，都是可以使人心温暖的东西吧。<br>人无法胜任神的位置。<br>神太过孤独了。<br>把一切都解析殆尽的话，就会变得再也无法心潮澎湃了。<br>就连喜欢上某人、继而玩命地活着的理由，都会失去了。<br>继续向上前行的话，就会在得不到救赎的领域里不知不觉地消散吧。</p></blockquote><blockquote><p>篝，即使现在，也还是孤独的。<br>因为本质就是孤独。<br>…我还是太轻率了。</p></blockquote><blockquote><p>瑚太朗：正是你的不接受，才成就了我的孤独呐。<br>瑚太朗：明白了吗？没有那份孤独的话，我就会在满足人际关系中止步，就会慢慢被埋没。<br>瑚太朗：在那里止步的话，一切都完了。<br>瑚太朗：寻找可能性的旅途，无论何时都是孤独的。<br>瑚太朗：活在曾经视为珍贵的小小关系中的话，的确能获得微薄的幸福。但那样的话，就无法踏上更为漫长的旅途了哦，吉野。<br>瑚太朗：适应一成不变的生活而就此停下步伐的话，就永远无法成为开拓者了。人类永远要面临这道选择题。</p></blockquote><blockquote><p>篝：永别了。<br>篝：永别了，天王寺瑚太朗。<br>篝：感谢你。<br>篝：感谢你，天王寺瑚太朗。<br>篝：一直怜爱着，这样自私的我。<br>篝：天王寺瑚太朗，说过想见我。<br>篝：但是我们没能再次相见。<br>瑚太朗：是因为讨厌我么？<br>篝：不是因为讨厌。<br>篝：但是，无法被原谅。<br>瑚太朗：为什么？<br>篝：因为渴望着永恒的蜜月是罪恶。<br>篝：因为生命，必须要能够忍受孤独。<br>篝：因为生命，必须要有与孤独为伴的力量。<br>瑚太朗：真是寂寞的想法呢。<br>瑚太朗：太寂寞了…<br>瑚太朗：篝，你不一起来吗？<br>篝：…但是，那是不被允许的事情…<br>篝：是无法被认可的感情。<br>篝：但是我，还是做了不好的事情…<br>篝：归还我抢来的东西，这样我就回归虚无。<br>篝：必要的梦已经做过了。<br>篝：不得不变得能够忍受寂寞…<br>篝：只要还有记忆在，就能耐的住寂寞。<br>篝：这样我就满足了。</p></blockquote><h3 id="Terra线"><a href="#Terra线" class="headerlink" title="Terra线"></a>Terra线</h3><blockquote><p>我是个笨拙的孩子。<br>换句话说，就是个什么都做不好的家伙。<br>这也由于受到我沉默寡言的因素影响吧。<br>即便是被丢到了其他人群之中，也是被强弱混乱的人际关系，弄得无所适从罢了。<br>并不是说讨厌周围的大家。<br>只是不知道融入集体的方法。<br>所以说，我没有将自己真心展现在人前的经历。<br>总是被孤立着。</p></blockquote><blockquote><p>世界是不均衡不平等不协调的。这我是知道的。<br>虽然我是知道的…但是很不甘心。<br>不是想要埋怨谁。<br>也不是想要贬低自己。<br>只是有些窒息感。<br>感觉活着很痛苦。<br>所以在这个时期的我，就好像是在陆地上窒息了一样的金鱼喘息着。<br>活着就好像，是接受什么拷问一样。</p></blockquote><blockquote><p>想要改变自己的想法。<br>痛恨世界的心情。<br>这两种心情相互交织冲突，在心灵深处蠢动着。</p></blockquote><blockquote><p>小鸟（幼）：…就在这种得过且过中，时间会变得越来越少的哟。<br>小鸟（幼）：逃避只能使宝贵的人生不断流失。<br>小鸟（幼）：我可不会逃避的！</p></blockquote><blockquote><p>虽然发生过这件事，我跟小鸟的关系也几乎没多大变化。<br>虽说再也没发生不必要的口角，不过也仅此如此。<br>但是从这件事情中，我想到了什么。<br>看到那家伙对本来只作为义务而照顾的狗投注感情，我突然变得焦虑了。<br>…我自己，要漫无目的地在原地呆多久呢。</p></blockquote><blockquote><p>江坂：虽然是个不错的提案，不过现在还是算了。<br>江坂：现在是个恰当的时机也说不定呢。<br>瑚太朗：？<br>江坂：因为没有任何利害关系的朋友，是很珍贵的呐。<br>瑚太朗：也对了。对自己有所图的“朋友”，太空虚了。</p></blockquote><blockquote><p>我有想要改变自身吗？<br>虽然那么说也没错…<br>但是感觉上不太一样。<br>我一直都是安于现状的。<br>为什么，我会发现自己作为狩猎者的力量呢？</p></blockquote><blockquote><p>脸上被揍了一拳。<br>这是相当用力的一击，我被打倒在地。<br>温热的鼻血流了出来。<br>江坂：把自卑丢弃掉。自卑只会让你变成废物</p></blockquote><blockquote><p>…我讨厌那些家伙。<br>现在我明白了。我讨厌守护者组织。<br>他们是歧视主义者，是践踏他人的人。</p></blockquote><blockquote><p>路易斯：之所以志愿来这里，就是为了给自己痛苦啊。<br>路易斯：但是，这种生活方式我已经放弃了。<br>路易斯：这种停滞的生活方式我已经放弃了。</p></blockquote><blockquote><p>我已经，不会再有“变不成哪儿的什么人”的不安了。<br>我只是做了这样的选择而已。<br>自己活着的理由，不由自己去找寻是不行的。</p></blockquote><blockquote><p>但是我已经不会再因为孤独受伤了。<br>我讨厌傲慢的家伙，绝对不会勉强自己跟他们相处。</p></blockquote><blockquote><p>瑚太朗：我是独行之人。无法委心于任何一种意识形态。<br>瑚太朗：如果说能对这停滞做些什么的话，我也想要看看。</p></blockquote><blockquote><p>篝：为什么就是不能如愿？<br>瑚太朗：因为那就是所谓的世界啊。<br>瑚太朗：大家都因此而痛苦着。<br>瑚太朗：我也是其中之一。</p></blockquote><blockquote><p>篝：篝不明白。<br>篝：为什么人类有着如此丰富的感受性，却会像现在这样停滞着？<br>篝：如此的聪明才智，明明不可能留不下美好的记忆。<br>瑚太朗：…人类无论如何都会争斗。<br>瑚太朗：那啊，真的是，为什么呢…我也不明白啊。<br>瑚太朗：即使知道会毁灭，依然只顾着眼前。</p></blockquote><blockquote><p>篝：你们人类，非常重视现状。<br>篝：并不会为了得到明天的希望，而堵上现在的幸福。<br>篝：只要现状没问题，明天怎么样都不要紧。</p></blockquote><blockquote><p>瑚太朗：大家，都有着必须守护的小小的幸福。<br>瑚太朗：为了小小的幸福，而对明天视而不见，或许真的很可怜呐。<br>瑚太朗：但是人类也是动物，也会恐惧。<br>瑚太朗：能战斗的，只有极少一部分啊。</p></blockquote><blockquote><p>我，一直以来都净是在思考着自己属于哪里。<br>仅仅是失去归所就会让我不安。<br>因为我连自己都不是。<br>不是成为哪一处的某人，而是应该成为什么样的人。<br>应该成为名为“我”的人物。<br>那么，“我”又是什么？</p></blockquote><blockquote><p>在漆黑的海面上，追逐着远处漂浮的篝火，独自一人的船夫。<br>那就是我。<br>残酷的道路上，没有同伴相随。<br>所以只是一个人。<br>我再也不会迷失这心像了。</p></blockquote><blockquote><p>开天辟地的力量和意志。<br>这便是篝所追寻的美好的回忆。</p></blockquote><blockquote><p>…我追逐着灯火。<br>我就是那小小的羽虫。<br>会被吸引到诱蛾等附近的，可悲的渺小本能。<br>人类都必须拥有追求着灯火的性质。<br>在这个过于严酷和黑暗的世界中。<br>我也一直，在追求着那个呐。<br>但是，我已经什么都看不见了。<br>没有光。<br>那么，也就是说这里就是我的终点了吗？<br>在什么也没有的这里吗？<br>我继续走着…<br>我丢弃了人生的所有，堵上了全部，才到达了这个地方。<br>以自己的方式成功过。<br>以自己的方式生存过。<br>以自己的方式战斗过。<br>我不认为这是无意义的。<br>但是，我到底成为什么样的人了呢？<br>我就像是一直被使命感紧逼一样地生活着。<br>充实…我很充实吗？<br>我快乐，舒心吗。<br>瑚太朗：…不是的啊…<br>那都是些痛苦的事。<br>背叛了…各种各样的人和事。<br>背叛了那些值得尊敬的人们。</p></blockquote>]]>
    </content>
    <id>https://luolibrary.com/2026/05/10/Rewrite-%E7%BD%9A%E6%8A%84/</id>
    <link href="https://luolibrary.com/2026/05/10/Rewrite-%E7%BD%9A%E6%8A%84/"/>
    <published>2026-05-10T02:36:20.000Z</published>
    <summary>
      <![CDATA[<h2 id="感想"><a href="#感想" class="headerlink"]]>
    </summary>
    <title>Rewrite（罚抄)</title>
    <updated>2026-05-10T19:11:35.507Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="动漫笔记" scheme="https://luolibrary.com/categories/%E5%8A%A8%E6%BC%AB%E7%AC%94%E8%AE%B0/"/>
    <category term="电影" scheme="https://luolibrary.com/tags/%E7%94%B5%E5%BD%B1/"/>
    <content>
      <![CDATA[<h2 id="感想"><a href="#感想" class="headerlink" title="感想"></a>感想</h2><p>感觉我在很小的时候，看过这部剧场版。但是我只有非常稀薄的印象了。在2026年的今天去看24年前的电影，仍然觉得是满满的感动。突然意识到好的东西永远是好的东西。现在技术这么发达，编剧写出来的故事却越来越烂了。我们这个时代真的就这么浮躁吗？</p><p>这部剧场版借着蜡笔小新的契子，讲了一个战国时期的爱情故事。故事的结构其实很简单，然而简单的剧情却能在我心中勾起淡淡的涟漪，我觉得这就是这部剧场版细腻之处。我一个特别触动的点就是又兵卫得知了在21世纪，已经没有了武士了的那种怅然。我突然意识到了一个问题，我现在所依赖的这些意义或者说价值，会不会在历史的长河中也仅仅只是沧海一粟呢？然而，我永远不可能得到这个答案。</p><p>有意思的是，公主春日廉给出了一个我认为非常完美的答案，她对又兵卫说：“<strong>你整日眺望天空便可</strong>”。我不由地感慨，如果我丢弃我一切不管是这个社会所赋予我的意义，还是我自己给自己的意义，我是否能简单地整日眺望天空便可呢？换句话说，丢失了一切意义，我又该如何生活呢？我是否给自己上了一道枷锁呢？</p><p>还有一个印象深刻的场景就是公主坐在小新爸爸的车子上，又兵卫骑着马再怎么样也追不上汽车的那种怅然感。说不定等AGI实现的那一天，我更能体会到这种怅然的感觉吧。这么一想，我还是不要被这个社会灌输的价值和意义所束缚了。</p><p>以后我望向天空的时候，我觉得我一定会想起这个故事的。</p><blockquote><p>青空武士又在看天了。</p></blockquote><h2 id="摘抄"><a href="#摘抄" class="headerlink" title="摘抄"></a>摘抄</h2><blockquote><p>又兵卫：新之助，令尊是武士吗？<br>新之助：不是，已经没有武士了哦。<br>又兵卫：什么！此话当真？<br>新之助：当真。<br>又兵卫：撒谎，没有武士谁来守卫国家？<br>新之助：当然是由我率领的春日部防卫队守护了。<br>又兵卫：说谎也要像样点。<br>春日廉：又兵卫，新之助居住的世界非常和平，大概不需要武士了吧。<br>又兵卫：但若真是如此，我辈又该如何何去何从呢？<br>春日廉：你整日眺望天空便可。</p></blockquote><blockquote><p>广志：据我所知，春日之名并未留存在历史的舞台上。<br>广志：现如今的春日部也几乎没有留下这个时代的痕迹。<br>春日和泉守康纲：真令人空虚。<br>春日和泉守康纲：朝夕守护为之奋战的国家，却注定会消亡吗？<br>春日和泉守康纲：不知何时就会被何处的大国所吞并。</p></blockquote><blockquote><p>春日廉：不过也真是奇妙。<br>春日廉：生于南北的两人于江户城中相遇结为夫妇。<br>春日廉：最终竟于这我最爱的春日城中定居。<br>春日廉：正因如此不易，你们一家人才能如此和睦幸福吧。</p></blockquote>]]>
    </content>
    <id>https://luolibrary.com/2026/04/29/%E3%80%8A%E8%9C%A1%E7%AC%94%E5%B0%8F%E6%96%B0%EF%BC%9A%E5%91%BC%E9%A3%8E%E5%94%A4%E9%9B%A8%EF%BC%81%E5%A3%AE%E7%83%88%EF%BC%81%E6%88%98%E5%9B%BD%E5%A4%A7%E5%90%88%E6%88%98%E3%80%8B%E8%A7%82%E5%BD%B1%E7%AC%94%E8%AE%B0/</id>
    <link href="https://luolibrary.com/2026/04/29/%E3%80%8A%E8%9C%A1%E7%AC%94%E5%B0%8F%E6%96%B0%EF%BC%9A%E5%91%BC%E9%A3%8E%E5%94%A4%E9%9B%A8%EF%BC%81%E5%A3%AE%E7%83%88%EF%BC%81%E6%88%98%E5%9B%BD%E5%A4%A7%E5%90%88%E6%88%98%E3%80%8B%E8%A7%82%E5%BD%B1%E7%AC%94%E8%AE%B0/"/>
    <published>2026-04-28T17:26:50.000Z</published>
    <summary>
      <![CDATA[<h2 id="感想"><a href="#感想" class="headerlink"]]>
    </summary>
    <title>《蜡笔小新：呼风唤雨！壮烈！战国大合战》观影笔记</title>
    <updated>2026-04-28T17:27:18.534Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="动漫笔记" scheme="https://luolibrary.com/categories/%E5%8A%A8%E6%BC%AB%E7%AC%94%E8%AE%B0/"/>
    <category term="漫画" scheme="https://luolibrary.com/tags/%E6%BC%AB%E7%94%BB/"/>
    <content>
      <![CDATA[<h2 id="感想"><a href="#感想" class="headerlink" title="感想"></a>感想</h2><p>福本老贼写的青年漫画，非常简洁地讲述了一个故事。被陷害的青年工藤涯进了所谓的“人类学院”，最终找回自己清白。福本老贼一如既往地在作品里面探讨了自己做决定。有时候看着这样的漫画，我总是会不禁意间地陷入思考，我到底决定做什么样的事呢？我的精神世界是不是真正的富足呢？</p><p>自己最大的敌人永远是自己。我也想超越自己。</p><h2 id="摘抄"><a href="#摘抄" class="headerlink" title="摘抄"></a>摘抄</h2><blockquote><p>我已经对说谎和敷衍这种表面的善意伪装感到厌烦了。<br>快让我吐了。</p></blockquote><blockquote><p>一稳定下来后立刻各种问题蜂拥而至。<br>孤独、贫穷、不方便、不合理。<br>几乎所有该来的麻烦和不安感都一个一个的接踵而来。<br>但是，同时至今为止一直纠缠在我身边的空气开始流动了。<br>贯通这具身体的清爽的心情。<br>感觉没错。<br>我就是想感受到这样的风。<br>我要靠我自己的力量活下去。<br>自由，不错。这就是自由。<br>自由并不是可以做任何事。<br>自由取决于人的自身。<br>当然这会受到限制，对没有力量的我来说更是如此。<br>受到限制，办不到的事多的是！<br>没有摩托车，没有去过海外旅行。<br>名牌衬衫也买不起。<br>也没有吃过豪华大餐，与这些东西无缘。<br>我被压倒性地压制着。<br>但是，在这限制之中，却同样隐藏着无限。<br>我感觉到了无限。</p></blockquote><blockquote><p>生活是勉勉强强，最低等级的状态，不可能让人觉得快乐。<br>但是这是我自己选择的贫穷道路。<br>要抱怨的话也太说不过去了，我觉得自己应该满足了。<br>如果无论如何都讨厌这样子的话，把自己的力量更大地发挥出来就好了。<br>在没法做到这点的情况下，不走运也是当然的。<br>我得出了这样的结论。<br>就在我这样认可之时，周围的气氛又发生了变化。<br>没错！为什么这么简单的事情我却至今没有注意到呢？<br>靠自己来决定生活的一切，才是现实！<br>现实是这样诞生的。<br>简单来说，把生活交给别人的家伙，没有任何理由能感受到现实。<br>这是当然的，是理所当然的事情，重中之重。<br>我依靠自己就是生物或者存在事物的基本中基本的大原则。<br>如果对这点敷衍了事，就无法前进。<br>但是，我这样的思考态度，完全得不到周围的理解。<br>我一个人的生活在他们看来已是异常、异端。</p></blockquote><blockquote><p>生活虽然艰苦，但是可以读不少的书。<br>也能尽情地联系拳法，不论多久都持续练着。<br>不停地修行，不停地修行，使我在任何时候都能进入备战状态。<br>我想超越自己！<br>比眼前映着的这家伙，还要更快出拳。</p></blockquote><blockquote><p>我总是在不知不觉间反抗起来。<br>大概就是这样才一直能守住我引以为豪的东西。<br>而结果也总是不走运，最后被排挤到角落。<br>变成没法融入群体的人，被贴上固执己见的丧家犬标签。<br>总是这样。<br>可是，我觉得那样没错。<br>绝不溜须拍马屁，这才像个男子汉，我一直坚信如此。</p></blockquote>]]>
    </content>
    <id>https://luolibrary.com/2026/04/29/%E3%80%8A%E6%97%A0%E8%B5%96%E4%BC%A0%E6%B6%AF%E3%80%8B%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/</id>
    <link href="https://luolibrary.com/2026/04/29/%E3%80%8A%E6%97%A0%E8%B5%96%E4%BC%A0%E6%B6%AF%E3%80%8B%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/"/>
    <published>2026-04-28T16:16:51.000Z</published>
    <summary>
      <![CDATA[<h2 id="感想"><a href="#感想" class="headerlink"]]>
    </summary>
    <title>《无赖传涯》阅读笔记</title>
    <updated>2026-04-28T16:17:08.469Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="动漫笔记" scheme="https://luolibrary.com/categories/%E5%8A%A8%E6%BC%AB%E7%AC%94%E8%AE%B0/"/>
    <category term="漫画" scheme="https://luolibrary.com/tags/%E6%BC%AB%E7%94%BB/"/>
    <content>
      <![CDATA[<h2 id="感想"><a href="#感想" class="headerlink" title="感想"></a>感想</h2><p>不知为何，读完这部漫画，我的内心久久都无法平静下来。我或多或少地总能从黑泽身上看到自己的影子。如同和黑泽一样，自己每天早上在自己的出租屋醒来的那一刻，我感到了自己的腐烂。不知如何是好的迷茫感。</p><p>然而，我完全比不上黑泽的坚韧。比起黑泽来说，我已经相当幸运和幸福了。至少，我或多或少还是能从开源和工作中获得一点价值感，目前为止还不需要过于担心物质生活。在前面的章节中，最令我动容的就是黑泽一个人在下雨天被其他人孤立，留在工地过夜，不愿意人偶大郎淋雨。黑泽给大郎说吃饭喝酒，最终也给大郎盖上了被褥。黑泽哭着闭着眼睛，内心说道：</p><blockquote><p>切，你还真是沉默寡言啊。</p></blockquote><p>在现在这个所谓的社会体系下，黑泽就是一个彻彻底底失败的人，44岁没有存款，没有家庭，没有女人。纵使他游离在这个社会体系之外，他仍然认真地工作，做好自己的份内之事。然而黑泽是孤独的，没有归属感的他一直在思考着自己的存在意义，到底什么样子才能算做是活着呢？黑泽去公园里面只能去无人在意的角落，明明是自己辛辛苦苦照看走丢的小孩，却被误认为是人贩子。想着自己照顾的丢失的孩子吃着自己给的棒棒糖的样子，黑泽拿出剩下的棒棒糖，吃了起来，眼角泛着泪水，伴随着自己的独白：</p><blockquote><p>切！我在哭些什么啊！</p></blockquote><p>后面，黑泽差点被高中小混混杀了，黑泽由于恐惧死亡，在他的工友面前失态了，感觉失去了尊严。黑泽决定要和这几个高中小混混决斗。其实黑泽并不是那么坚强和有毅力的一个人，他也想过临阵脱逃。然而，黑泽最终选择了战斗。福本老师的作品刻画的真的太好了，到底什么才是人生最重要的东西呢？仅仅是活着就好了吗？人的尊严是不是应该高于活着呢？是不是应该去守护更重要的东西呢？</p><p>黑泽为了自己的尊严，赌上了自己的性命进行了战斗。不是会了单纯的胜负，他只是在竭尽自己的全力战斗着。黑泽最终赢得了胜利，也借此机会，黑泽终于能够暂时性地摆脱孤独感。</p><p>故事的高潮部分就是黑泽因机缘巧合在酒吧遇到流浪汉的故事了。纵使黑泽没那么寂寞了，但是黑泽仍然感觉到了自己虚度了自己的光阴。对于黑泽来说，他的人生已经开始走下坡路了。我不禁就想到了我对于光阴的看法。我现在就是20多算的年龄，比起哥哥这个称谓来说，我觉得还是叔叔这个称谓更加合适吧。我中年的时候也会像黑泽这样一样吗？我是不是也在浪费自己正处于朝阳之中的光阴呢？</p><p>一些垃圾的小混混，搜刮流浪汉的钱财。这些小混混真的是最垃圾的人，因为他们只敢向弱者挥刀，只敢用暴力对待弱者。黑泽告诉流浪者们必须要战斗，如果拒绝了战斗那才是真正意义上的失败者。只有战斗，才能夺回属于自己的自尊和自豪。</p><p>最后，黑泽战死了，留下了他的独白：</p><blockquote><p>假如我的生命结束了。<br>我也可以说，我就像那年夏天的那只蚂蚁一样令人敬佩。<br>我们两个都是一样的。<br>对压迫我们的人，要奋战到底。<br>对我来说，这个世界太残酷了。每一天每小时，我都感觉很无助。<br>我非常清楚，在我的世界里，打从出生开始，就没有智慧，财富。更不是人才。<br>这些都和我没关系，但即使如此，我仍然有梦想！<br>太令人沮丧了，我没有前途，没有女人接受我。工作也不合群。<br>我试图改变我的命运，可我被压制着，被一个不可阻挡的力量持续的压制。<br>但我不会放弃，用尽力气抵抗，拼命战斗，就像那只蚂蚁令人敬佩。<br>这些才是真实的我。<br>我能感受到他们。<br>非常感谢大家，他们的手真暖。<br>我做到了，我做到了我想要的……<br>太暖和了。<br>在我生命结束的时候，我觉得真舒服。</p></blockquote><p>最后，我特别感谢福本老师画了一部这么好的作品，感动得我泪流满面。我或许还是会和黑泽一样在星期天在自己小小的出租屋醒来，感觉到腐烂，不知如何是好。或许还是会和黑泽一样时常感到空虚和寂寞。或许还是会和黑泽一样被不可名状的一些东西所压制。但是，我希望自己也能像黑泽一样地战斗，奋战到自己死亡的那一刻。</p><h2 id="摘抄"><a href="#摘抄" class="headerlink" title="摘抄"></a>摘抄</h2><blockquote><p>不时的会发呆起来。出生44年，开始工作26年，这之间的人生，应该说是太过不起眼了吗？还是对从没有光辉灿烂过的事，哑然了呢？这样好吗？还是说是这样的事情呢？其实大多数的人生都是……!</p></blockquote><blockquote><p>我最近好奇怪啊，胸口会不时的感到痛苦，情况坏的话就会感到眩晕，因为孤独。</p></blockquote><blockquote><p>大郎，我的朋友就只有你啊。<br>一直都只有你啊，好朋友，今后也要永远。<br>切，你还真是沉默寡言啊。</p></blockquote><blockquote><p>清晨，在自己的脏宿舍里，睁开眼。<br>啊啊是吗？今天是星期天啊。<br>想到这些就会感到有些不知如何是好！</p></blockquote><blockquote><p>究竟从何时变成这样的呢？<br>开始这么反感起身旁经过的情侣。<br>还有比起这更为恶劣的，让我感到刺眼的带着孩子的大人。</p></blockquote><blockquote><p>不只是在公园。<br>咖啡店也罢，电影院也罢，我们这种未婚的独身中年人。<br>都会被莫名其妙地排挤出来。<br>完全没有我们的位置。<br>不经意间就会这么想到，为什么我们就要活得这么丢人？<br>可恶！<br>大家，到底都是怎么做的啊！</p></blockquote><blockquote><p>什么啊？这样的一天究竟算什么啊？<br>如此空虚的，枯燥无味的一天。<br>只剩劳累与困倦。</p></blockquote><blockquote><p>为什么停下来了？<br>我到底在守护着什么？<br>通过不抱歉的这一行为，我在守护着什么……！<br>那是比生命还要重要的东西吗？</p></blockquote><blockquote><p>西顿老师的书，虽然是本好书。<br>但那是动物记啊。<br>只要活着就好，活着就是胜利。那都是动物的人生啊!<br>我是人类啊！<br>人类和动物是不同的，绝对的不同。<br>只要活着就好，活着就足够了，有谁会这么想啊！<br>我们都有着理想啊。都有着各自的理想形象啊。<br>以此为目标，这才是人类啊。<br>所以当然要决斗，非进行决斗不可，作为一个人类。</p></blockquote><blockquote><p>好好想想的话，我完全算不上活着啊！<br>活着并不是器官手脚等等的运动。<br>并不是那样。昂扬，精神的昂扬。也就是生命的勃发啊。</p></blockquote><blockquote><p>太软弱了，我的精神。<br>明明如此地痛苦过了。<br>明明如此地宣誓过了。<br>我还是没有任何行动。<br>还是想着可以的话，就什么都不做。<br>毫无作为的去迎接事情的结束。<br>好想去死！<br>好想杀死这样的自己。</p></blockquote><blockquote><p>正如他所说，我是后悔了。<br>但是我会决斗的。<br>会决斗的！<br>要是在这里放弃了，无止境。<br>我会无止境地讨厌起自己来。<br>所以我要决斗！</p></blockquote><blockquote><p>我讨厌这种人。<br>一感到自己占优在上，就盛气凌人地、气势汹汹地怒吼、恐吓。<br>完全地依仗暴力。</p></blockquote><blockquote><p>我没日没夜干了他妈的25年活，也从来没有过那么多钱！<br>事实上，我的存款超过30万的时候，这辈子大概也就一两次。</p></blockquote><blockquote><p>作为一名武士，不是应该为了赏识自己的人豁出性命吗？<br>虽然只是一个误会，一个巨大的误会！<br>我怎么可能会受人崇拜！<br>可是，即便如此，还是有个人真心的崇拜我，因此而向我求助。<br>如果说我还想着逃避的话，那这样的我，还算是人么？<br>如果我连试都不试一下保护他，明明知道他，却选择无视！<br>然后，苟且偷生。就这样没有意义地活30年，40年。<br>但是，无论我活了多久，都不再有像他那样崇拜我的人。<br>呜呜呜！我这是多么可悲的啊！<br>武士！我要成为武士！</p></blockquote><blockquote><p>你总是穿着盔甲，随时准备赴死。<br>作为武士，你已经死过一次，尽管你可以从容地接受死亡。<br>可是你，仍然穿戴着盔甲。<br>其实你也从来不会放弃求生的信念。<br>为了胜利。<br>这就是你对胜利的执念！</p></blockquote><blockquote><p>你总是为所欲为，所以才堕落成不良少年啊！<br>但是这不代表你跟那帮混蛋一样！<br>你是要成为像山一样的巨人的啊！<br>别像那帮傻逼一样，只敢欺负弱小！<br>所以不要放弃你自己的尊严！<br>勇敢地活下去！</p></blockquote><blockquote><p>绝对没错，这个家伙已经完全无视其他人对自己有什么看法了。<br>这是神兽啊！<br>可是话说回来，这种霸气的举动，让人有种冲动的昂绝。<br>可是啊，我跟他的差距好大啊。<br>我那不堪的青春，难道这就是幸福？</p></blockquote><blockquote><p>我在浪费自己的生命，虚度光阴。<br>我站在人生的十字路口不知道该往哪里走，只是盲目的往前走着。<br>走错的时候，我又想找到正确的方向，但我没意识到。<br>太阳已经落山了，我已经人到中年了。<br>我真是太失败了。<br>我的整个生命都是失败的。</p></blockquote><blockquote><p>我逃避了。<br>我很久以前就放弃了我的梦想。<br>因为我厌倦了，觉得自己像个白痴一样。<br>像个白痴一样追逐不可能实现的梦。<br>我受不了了，不会再试了。<br>不会再做无意义的努力了。</p></blockquote><blockquote><p>人早晚都会有死的一天。<br>即使这次逃跑了，从这里离开，在某个地方开始新生活。<br>也许接下来，在你的新家里，你已经进入晚年了，接下来你会死。<br>你会想，我终于要死了。<br>在临终前，我们会觉得自己真的很没有用。<br>到最后我们甚至不能保护一个单身女人。<br>你们真正想要的是什么，生活的故事？生存的意义？<br>睁开你们的眼睛，我们能不能保护的不只是这个老奶奶，还有我们自己。<br>假如我们不战斗，我们就不能挽救自己。<br>我们会彻底的失败。<br>我们每个人都是彻底的失败者。<br>我们会继续悲惨的活下去。<br>我们的生活会一直失败下去。<br>但假如我们这次能够成为真正的男人<br>假如我们战斗，将获得自豪和自尊。<br>假如在这里保护奶奶，我们死的时候，就可以幸福的离去。<br>这就是为什么我们要战斗。<br>我们要保护我们的家园，我们的奶奶。<br>我们必须保护奶奶，必须停止恐惧，必须要有牺牲精神。<br>所以我们在这里必须战斗，即使这意味着死亡。</p></blockquote><blockquote><p>我们是男人，不是因为我们长得英俊。<br>而是因为我们能战斗。</p></blockquote><blockquote><p>我改变了我的梦想。<br>不再是想成为明星，而是脚踏实地的工作。<br>现在想想，这就是我的全部。<br>我只关注于眼前的事情，换句话说，我遇到的问题：工作、权力、假期、我的钱、游戏、柏青哥、娱乐。<br>在我意识到以前，我已经偏离了，远离了我原本的梦想和希望。<br>我一直在追逐眼前的东西，导致我进入了一个黑暗的深渊。<br>我每天徘徊在深渊中试图寻找出路，但发现这是徒劳的。<br>因为我的生活没有目标，什么都没有。</p></blockquote><blockquote><p>我们的世界有太多重要的地方了。<br>输赢仿佛是每件事情唯一的标准。<br>但其实输赢是同样重要的。<br>失败是成功之母，不仅如此，无论结果怎么样，关键是看你有没有去做。<br>即使失败了，他也是一个胜利者，是一个勇敢的人。</p></blockquote>]]>
    </content>
    <id>https://luolibrary.com/2026/04/05/%E3%80%8A%E6%9C%80%E5%BC%BA%E4%BC%A0%E8%AF%B4%E9%BB%91%E6%B3%BD%E3%80%8B%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/</id>
    <link href="https://luolibrary.com/2026/04/05/%E3%80%8A%E6%9C%80%E5%BC%BA%E4%BC%A0%E8%AF%B4%E9%BB%91%E6%B3%BD%E3%80%8B%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/"/>
    <published>2026-04-05T12:20:38.000Z</published>
    <summary>
      <![CDATA[<h2 id="感想"><a href="#感想" class="headerlink"]]>
    </summary>
    <title>《最强传说黑泽》阅读笔记</title>
    <updated>2026-04-05T12:21:34.258Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="读书笔记" scheme="https://luolibrary.com/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    <category term="小说" scheme="https://luolibrary.com/tags/%E5%B0%8F%E8%AF%B4/"/>
    <content>
      <![CDATA[<h2 id="感想"><a href="#感想" class="headerlink" title="感想"></a>感想</h2><p>这一个月陆陆续续，终于把在我kindle里面沉寂了两年左右的田中先生写的《人类衰退之后》看完了。田中先生的这部作品从2007年写到了2014年，在这个期间《Rewrite》游戏也发售了，按理说我应该先看这部小说再玩《Rewrite》的，可惜07年的时候，我只是一个小学生，用田中的话来讲，我当时就是如同狗一样。</p><p>田中先生的这部轻小说非常诙谐幽默，借着童话的形式把很多东西都讽刺了。同时，我十分地佩服田中先生的想象力：</p><ul><li>对航海家(Voyager)和先驱者(Pioneer)的拟人化了。哪怕是飞行器最终也想回到温暖的地球上面。</li><li>女主进入了游戏机和进入了漫画成为了漫画本身的故事，再狠狠地自嘲了漫画家如果到30岁左右连载失败了，毫无退路而言，只能继承家业（前提是还有家业可以继承）。</li><li>对于沉迷于梦境的大家，女主选择了射杀（解救）。</li></ul><p>田中在这么多卷里面讲了许多的小故事，涉及了许多方面的讨论。知性、人类自身的衰退、梦境以及教育。实际上我认为这就是田中实力的体现，能把故事讲的有趣并不是那么简单的。抛开这种单一的故事章节，整个内容的核心就是本以为自己是人类的人类小姐，观察和自己是同一种族的妖精，地球上唯一仅剩的人类就是助手先生了。故事在第九卷的时候揭露了真相，妖精因为憧憬着人类，一部分直接成为了人类，另一部分成为了故事中出现的妖精。</p><p>田中先生最终给出了一个很温柔的答案，妖精与其说是憧憬着人，不如说是憧憬心，憧憬着光，希望从无意义中解放出来。当人类小姐得知自己祖父“死亡”的那一刻，她把妖精召唤出来，想复活她的祖父。然而人类小姐无法开口，因为人类小姐已然是人类了。其实整个故事一直在涉及到心这一块，当人类小姐拿到从Y带回的坏的机器人的时候，妖精给女主说只是修好的话还是可以的，但是没法恢复原样，从灵魂的角度来说。</p><p>小说里面最有意思的设定就是妖精只会和真正温柔的人接触。但反过来思考，很少有人见过妖精，因为着<strong>温柔是稀缺的，稀缺到需要被识别和筛选</strong>。 我只能说又喝下了田中先生喂给我的鸡汤。爱与希望以及可能性。突然想到了田中先生在后记里面的一些吐槽，不由地摇了摇脑袋。现实与小说之间的割裂感实在是太强了，一位写着如此具有大爱作品的人，还是会被家庭主妇误认为是无业游民。（作家就是这样的一个存在吗？）</p><p>让我以人类小姐的话作为结尾吧：</p><blockquote><p>人类今天也在绝赞的衰退之中。</p></blockquote><h2 id="摘抄"><a href="#摘抄" class="headerlink" title="摘抄"></a>摘抄</h2><h3 id="第一卷"><a href="#第一卷" class="headerlink" title="第一卷"></a>第一卷</h3><blockquote><p>我们花了十年以上的时间在学舍度过，学习各式各样的东西，体验了许许多多事物，都是为了要得到这一张裁切好的纸。然而毕业证书本身却轻如鸿毛，总让人有种不够尽兴的感觉。</p></blockquote><blockquote><p>想要认真地尽到职责，只是白费力气罢了；如果什么都不做得过且过的话，日子就会相当轻松……我的心中浮现出这样的构图。我想要轻松，这是事实。然而我并非什么都不想做。</p></blockquote><blockquote><p>我们正在衰退。<br>妖精们是如何繁殖的呢？<br>为何不需要食物呢？<br>可以与我们使用相同语言的理由是？<br>高度技术的基础为何？<br>真相被时间的洪流埋没，就连没有习惯将事物记录下来的妖精们本身也不清楚。<br>我们只是单纯活着而已。<br>彷佛这样就已经足够。</p></blockquote><blockquote><p>倘若不需要特别的劳力来维持生存的话，或许就可以解释他们浩瀚的智慧与活力了。生殖方面也是如此，他们就彷佛是从生物的局限中跳脱出来的存在。他们与无论文明进步到何种程度，但最终不过是生物的人类有着根本的不同。或许我们两者在可以分配的资源、也就是可能性的差异上所导致的结果，造成了如今的世代交替。</p></blockquote><blockquote><p>我在无意中所做的行为，就某方面而言变成了创造，结果导致他们的社会衍生出崇拜的观念。</p></blockquote><blockquote><p>结果我看着看着发现到，恐龙之间并不会互相攻击，我想是因为牠们没有猎食的必要性之故。<br>如果不会感到饥饿的话，应该就没有斗争的必要性了。<br>我看到的恐龙们，全都奇妙地呈现出一派轻松的悠哉模样。<br>就连跑来咬我的其中一部分恐龙，应该也只是在闹着玩而已。</p></blockquote><blockquote><p>妖精们一个个越过栅栏，被追赶至草原上。<br>帐篷被拆倒、栅栏也遭到破坏，储存起来的一些点心也被抢走堆积在广场上。<br>文明的终点，就像是现在这个光景。</p></blockquote><h3 id="第二卷"><a href="#第二卷" class="headerlink" title="第二卷"></a>第二卷</h3><blockquote><p>只具备着弱小肉体的我们，之所以能够站上食物链顶点的原因，不正来自于知性，以及企图将未知转变成已知的探求心吗？想到这件事时，若是我们拨出一点时间，为这位愚昧且不成熟的探求者的悲哀末路感到可笑，或者思索这一切行为，应该不会是毫无意义的尝试吧？</p></blockquote><blockquote><p>仓鼠种族的知性行为，似乎并非二十四小时维持同样的态度，而是经常会输给本能的样子。<br>「终究只是啮齿类吗……」<br>真是低等的文化、低等的社会呢——我这么沉浸在优越感当中的时间也只有一瞬间。<br>「……我的妖精模式也是类似的状况呢。」</p></blockquote><blockquote><p>一旦生命安全受到保障，人类就会瞬间自甘堕落起来，我现在已经成为这个教训活生生的实例，现在正热衷于于用锯齿石（可代替锉刀）修剪指甲形状的工程。</p></blockquote><blockquote><p>小小生命的所能享有的天数，远比人类过得更紧凑密集。<br>小小生命内心的认知，编织出跟人类大相径庭的世界。<br>就像妖精的姿态会根据我知性的「程度」而有所变化一般。</p></blockquote><blockquote><p>用短短数十分钟跨越过当初花上好几天移动的距离，让人同时感受到爽快跟空虚。文明真是太棒了。倘若没有毁灭的话。</p></blockquote><h3 id="第三卷"><a href="#第三卷" class="headerlink" title="第三卷"></a>第三卷</h3><blockquote><p>人类的生命是踩在其他生命之上的。即使在衰退的现今，这点也依然不变。倘若妖精看到我这副身影，会作何感想呢？</p></blockquote><blockquote><p>「即使会思考感受，也无法传达出来是吗？」<br>「说不定位于我们身旁的物质也意外地具备着没有表露出来的思考。虽然我们无从确认。」</p></blockquote><blockquote><p>「是啊，只有一开始会觉得很快乐而已；但内心马上就会开始感到空虚了。首先会开始喘不过气而且突然想大叫，即使偶尔想出外走走，也会畏惧世人的目光，而变得只敢在晚上出门……是非常悲惨的喔？」</p></blockquote><h3 id="第四卷"><a href="#第四卷" class="headerlink" title="第四卷"></a>第四卷</h3><blockquote><p>为什么所谓的人类一旦填饱肚子又有温暖的床铺，判断力就会变得迟钝，且会放弃思考呢？<br>还会开始认为船到桥头自然直。</p></blockquote><h3 id="第五卷"><a href="#第五卷" class="headerlink" title="第五卷"></a>第五卷</h3><blockquote><p>「文化人无论遇到什么事，都必须依据理性逐渐变得成熟才行。必须以幼稚的心灵为耻。举例而言，像是霸凌这种事，是最应该感到羞耻的行为……」</p></blockquote><blockquote><p>「你懂了吧。小孩子根本不是什么健全又纯粹的存在。在这种环境里面，特别会放任奇怪的事情发生。真正能够信赖的同族，根本是极少数啊。」</p></blockquote><blockquote><p>等我掉落到名为清醒的现实时，我大概会将所有灵感忘在梦境特有的暧昧当中吧。</p></blockquote><blockquote><p>实际上，作者在密闭的房间中徘徊的身影便是沉淀了对于生者憎恨的幽鬼本身，从干渴的喉咙流泻出来的呻吟根本无法视为人话。一直开着的电视早已经失去了收讯功能，连续不断的沙沙画面将无机的光辉投射在室内。一旦到了半夜，那便成了唯一的照明。偶尔在沙沙声之中会混有「救救我……救救我……」这种女人的叫声，但却无法传达到乾桔的内心当中。</p></blockquote><blockquote><p>要想像男人们对于书斋这空间寄托着什么实在太容易了。我甚至觉得那已经升华成了「书斋」这种概念。男人们每天都被压抑着。内心被局限在名为社会人士的框框当中。那只能藉由精神的扩张来治愈。那就是名为书斋的宽广空间，也是反抗心理所带来的灵魂迫切的愿望。</p></blockquote><h3 id="第六卷"><a href="#第六卷" class="headerlink" title="第六卷"></a>第六卷</h3><blockquote><p>我想他们应该没有冻死这种概念，之所以会一身冬季装扮．感觉是在模仿人类的行为。</p></blockquote><blockquote><p>无论是何种类型的活动，只要能跟众多同伴一起欢笑，说不定就是种幸福了。<br>……在这种美谈的背后，社团之间的竞争也是如火如荼地进行着。</p></blockquote><blockquote><p>「只要是具备震撼力的展开，不管怎样无视至今为止的剧情也无所谓。反倒应该说，能够摧毁既有剧情的发展会更受欢迎！」<br>「那太可笑了……」<br>「不，这才是正确答案。消费者追求的是刺激。证据就是这个排行榜的变化。」</p></blockquote><blockquote><p>倘若将人生奉献给漫画，等到了三十岁、四十岁之后才惨遭腰斩，要迈向第二个人生似乎非常艰难。</p></blockquote><blockquote><p>不是要聊我玩了些什么，而是我有参与制作、负责写剧本的游戏。<br>就整体而言，现在要推出新的企划是越来越困难了。<br>无论是哪家厂商，倘若不是无风险高报酬的企划，似乎都不太愿意点头的样子（这段文章并未包含讽刺或恶意）。<br>何谓无风险高报酬呢？举例来说，那就跟「拜托卖我宾士，但我不想付钱。」这种状况是差不多的（这只是比喻，并非在批评业界）。<br>其中例外的是后宫系类型的校园故事，这种有机会畅销的作品，至今仍是大受欢迎的领域，因此也有可能被采用。<br>充满后宫的校园，还真是好东西呢（就说了没有讽刺意味嘛）。</p></blockquote><h3 id="第七卷"><a href="#第七卷" class="headerlink" title="第七卷"></a>第七卷</h3><blockquote><p>这群怪物的特征就是他们采取了一种异常特别的生存战略——把孩子交给别人，从而将责任也推到对方身上，反复地对对方施以寄生式的恫吓，从对方身上掠夺金钱和便利。<br>就像鱼类适应海洋，猎豹适应草原那样，这群类人猿完美地适应了高度发展的社会。据说他们还对当时的执政者造成了巨大的威胁。真是可怕。</p></blockquote><blockquote><p>我接管这所私塾一周，要说学到了什么，大概就是明悟到小孩子其实跟狗没什么两样，欺软怕硬，极其忠实于本能。因此，只要在学生面前表现得强势就行了……这不过是纯粹的想当然罢了。<br>看似简单的事都很复杂，这就是现实。</p></blockquote><blockquote><p>或许是由于不健全的亲子关系，三人都对某些特定物品或空想的朋友产生了强烈的依赖，他们能以这份执着为媒介，使出不可思议的力量。<br>这份力量会顺着感情的流动奔走，因此他们才能够凭空破坏或移动物体。</p></blockquote><blockquote><p>我记得自己是谁，但却忘记了自己该做什么，这令我无法静下心来。毕竟“该做什么”就有如人类的主心骨，心的发动机。<br>话说回来，我到底是什么人？</p></blockquote><blockquote><p>生存。只求活下去。<br>这愿望是有多空洞啊。在这年头，若只求生存，做跟路边杂草岂不更好。人类活着就得活得有意义。活着的意义是由自己决定的，但前提是有生活做支撑。</p></blockquote><blockquote><p>“就算看不见，它们也确实存在，你们也会在不经意间擦肩而过，互相接触。他们是很温和的邻居。只要你不忘记这份感觉，你就不会感到孤独。因为你心里住着只属于你的妖精——”</p></blockquote><h3 id="第八卷"><a href="#第八卷" class="headerlink" title="第八卷"></a>第八卷</h3><blockquote><p>只要把人们聚集起来就万事大吉，这种思维方式还是太过单纯，其实上困难重重。</p></blockquote><blockquote><p>『呀呀呀！好过分！反对暴政！我不要被拿来当成和钳子一样用途的东西！我不要被当成单纯的无机物啊！我也是有灵魂的呀啊啊啊啊啊啊啊……』</p></blockquote><h3 id="第九卷"><a href="#第九卷" class="headerlink" title="第九卷"></a>第九卷</h3><blockquote><p>不知道是不是因为物质上的享受无法填补心灵的空虚呢？<br>难道人们在找到同伴互相舐舔伤口之前，都是如此寂寞么？</p></blockquote><blockquote><p>都已经离家出走了为何还要去学校上学呢？答案是渴望着人际之间的交流。<br>正因为已经承受了被家人抛弃的巨大打击，所以才更加不想断绝与学校朋友的联系吧。<br>但是失去了家的学校生活，也不可能持续很久。</p></blockquote><blockquote><p>“我感觉也能稍微有些明白为什么妖精先生会这么喜欢人类了。”<br>“暴露啦？”<br>“你们大概是一路模仿着人类才走到今天的吧。”<br>妖精先生最初一定只是由纯粹的力量所构成的。<br>可是它们开始羡慕起具有肉身的人类这一种族了。<br>于是便开始模仿。<br>一开始虽说显得有些拙劣，但后来也一点一点地变得越来越相似……最终却偏离了当初的方向，定型成了现在的妖精先生。<br>即使在尺寸上还有着相当大的差异，曾经还是仿佛轻轻一碰就会消失的弱小物种，它们也已经从肉眼无法观察到的存在成功进化至在这个现实世界中拥有一具属于自己的身躯的了不起的存在了。</p></blockquote><blockquote><p>“人类小姐的，愿望是什么？”<br>有谁像是通过通信一样地对我说。<br>“愿望是……”<br>请让祖父他们复活。<br>原本我打算这样说的。我相信我只有这样祈求的权利。<br>但是，我没有说出口。<br>心里某处踩了刹车，阻止了我的话语。<br>这是什么？<br>即使我试着仔细思考，也仍然无法理解这来源不明的东西究竟是什么。<br>“是道德。”<br>“……嗯？”<br>感觉像是被读心了。<br>“你是人类。”<br>祖父最终教诲一样严厉的口吻说道。<br>正因是人类，才会拥有能否跨过人类的底线的犹豫。<br>让死人复活会超过人类最后的底线。要是这样许愿，就不再能称为人类了。</p></blockquote><blockquote><p>“我们是满怀希望地生于地球，向着光芒所在的方向前进，今后也会是这样吧，非这样不可。或者也有可能彻底颠覆死亡……不过，那也意味着彻底颠覆了生的意义，光就不再是光了。复制无心之物不是罪恶，但复制有心之物又如何呢？只要稍加考虑就能明白。”<br>“光……？”<br>“心之光。算是情绪一类的东西吧。所有人都会朝着有光的方向前进。尽管有许多其他的世界存在，有光的世界却只有这里，就如同黑暗中的灯火。妖精之所以会模仿人类，是为了被光所包围，为了从寂寞和空虚，以及一切的无意义中逃脱。”</p></blockquote><blockquote><p>地球上有许多魔法。<br>有许多憧憬着人类的目光。<br>世界如同观众席。观众们无不羡慕聚光灯下的表演者。<br>在最开始的旅途所见到的文昌鱼一样的东西，既是人类的祖先，也是一开始就站在这舞台上的表演者。<br>“唔……是观众视点呢。”<br>观察的对象是人类……不如说，是心。<br>光芒所在的世界，与心所在的世界大概是一个意思。<br>羡慕的妖精们在哪里？<br>观众席在哪里？<br>在森林深处令人恐惧的黑暗里。<br>像是有着灵魂却又不是完全拥有灵魂的东西在那里繁衍生息。<br>从那里来到这里的无形之物到底是什么？</p></blockquote><blockquote><p>“他无法使用魔法，是这地球上唯一的一个无法使用魔法的人。所以他的言行举止对我们来说印象十分淡薄。不管怎么说只有他一人的规格是不同的，本来应该是被憧憬的对象。因为我们的意识改变了啊，所以他被我们排除在视野之外了。这次的事情也算进去，我认为直到如今他凭着优秀的生存能力，没有魔法的帮助也能活下去。他可是追寻着你而来的。难道不是又坚强又可悲吗？”</p></blockquote><blockquote><p>过去在黑暗中，我们的目光追寻着光明。憧憬着光亮所在之处，又向着那个方向努力前行。人类若是继续繁荣下去的话，我们就没有登场可能了吧。然而在大断绝时期，人类真正地衰退了。因此有余地让新的物种将人类取而代之。<br>我们失去了什么？<br>我认为失去的是憧憬。<br>恐怕短时间之内我们会得势，会繁衍生息。包含这样生命存在的方式，我们模仿了所有的东西。充满执念的憧憬成就了这些。<br>但如今，已经实现愿望的我们误判了自己的身份。如此一来憧憬的情感也会消失。出身是无法改变的，所以孩童时代所拥有的东西随着成长而遗失之后，在通往成熟的道路上就发生了分化，一支是我们，另一支则将演算层面的行为转化为了影响身边事物的力量。后者是什么你也明白了吧？<br>到时候可完全不是调包儿时的骚乱这么简单了啊（笑）。<br>极端特殊的相互作用……就这么定义魔法吧。这样万能的力量，在人心中是无法收拢的。只要是人，这份力量就会放射出来。因为有相互作用，所以会和重力、电力或其他各种各样的东西结合。<br>无法解释的种种情况，通常就会由此产生。<br>这个特殊的相互作用在记忆方面也能产生作用，你也看到了吧。我们种族的记忆在空间中作为显微镜标本被永久存放。<br>作为无数心之体现的妖精先生，在出现的时点就可以读取所有的东西吧。<br>话不多说，我的建议是这样的。<br>一旦了解了真相，我们也许就会失去现在的存在方式。<br>当今世界建立在误会之上。<br>保持着无知的状态，我们心中无法抑制的东西就会持续向外放出，就会持续将更多事物带入到生命的定义中吧。藉由这样，今后的世界会更加丰富多彩，我相信会让世界变的有趣又奇怪。我相信多元化的暴力，你呢？</p></blockquote>]]>
    </content>
    <id>https://luolibrary.com/2026/03/29/%E3%80%8A%E4%BA%BA%E7%B1%BB%E8%A1%B0%E9%80%80%E4%B9%8B%E5%90%8E%E3%80%8B%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/</id>
    <link href="https://luolibrary.com/2026/03/29/%E3%80%8A%E4%BA%BA%E7%B1%BB%E8%A1%B0%E9%80%80%E4%B9%8B%E5%90%8E%E3%80%8B%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    <published>2026-03-29T08:09:04.000Z</published>
    <summary>
      <![CDATA[<h2 id="感想"><a href="#感想" class="headerlink"]]>
    </summary>
    <title>《人类衰退之后》读书笔记</title>
    <updated>2026-03-29T08:09:19.853Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="游戏笔记" scheme="https://luolibrary.com/categories/%E6%B8%B8%E6%88%8F%E7%AC%94%E8%AE%B0/"/>
    <content>
      <![CDATA[<p>第一次玩Firewatch这款游戏应该是2020年的时候了，我还依稀记得当时是我的发小强烈给我推荐这个游戏。当时玩的心境我已经记不太清了，我只知道那个时候我一直在打单机游戏了，为的就是去逃避自己的内心。最让我感慨的是2026年的我，几乎不记得这部游戏的任何剧情了。我似乎那个时候也在逃离，就如同游戏里面的男主亨利一样。</p><p>我认为这是一部逃离的故事。作品中的三个主要角色（男主亨利，女主黛利拉以及前看火人奈德）都是逃避了自己内心中的重要事物。森林就如同一层屏障一般将人的社会关系隔离了。这个游戏最有意思的地方就在于，三位主要角色都没有见过面却在这暧昧的夏天构建了交集。亨利和黛利拉通过无线电进行交流，亨利和奈德靠字条和痕迹，黛利拉和奈德则几乎只剩过去的记忆。最令我感慨的是看到男主在夕阳西下的时候，简单地吃着三明治。我居然在想，男主是幸福的吗？即便我在屏幕的另一侧看见那美好的景色，我居然也想去沉溺于其中。我那想逃离一切的心，在悸动。</p><p>夏天终究会过去，三个主要角色最终都不得不走出妄想，无论他们愿意还是不愿意。然而，我的夏天还在循环吗？</p>]]>
    </content>
    <id>https://luolibrary.com/2026/03/22/%E3%80%8AFirewatch%E3%80%8B%E6%B8%B8%E6%88%8F%E7%AC%94%E8%AE%B0/</id>
    <link href="https://luolibrary.com/2026/03/22/%E3%80%8AFirewatch%E3%80%8B%E6%B8%B8%E6%88%8F%E7%AC%94%E8%AE%B0/"/>
    <published>2026-03-22T13:54:02.000Z</published>
    <summary>
      <![CDATA[<p>第一次玩Firewatch这款游戏应该是2020年的时候了，我还依稀记得当时是我的发小强烈给我推荐这个游戏。当时玩的心境我已经记不太清了，我只知道那个时候我一直在打单机游戏了，为的就是去逃避自己的内心。最让我感慨的是2026年的我，几乎不记得这部游戏的任何剧情了。我似乎那个]]>
    </summary>
    <title>《Firewatch》游戏笔记</title>
    <updated>2026-03-22T13:54:23.297Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="游戏笔记" scheme="https://luolibrary.com/categories/%E6%B8%B8%E6%88%8F%E7%AC%94%E8%AE%B0/"/>
    <category term="GalGame" scheme="https://luolibrary.com/tags/GalGame/"/>
    <content>
      <![CDATA[<p>记得大约是在读研究生的时候，我在steam买下了“World End Economica”的三部曲。出于各方面的因素，终于在我快要正式工作两年的时候打完了这部作品。其实我本来是想直接通过英文玩完整部作品的，很明显我对我英文的词汇量过于乐观了，还是找了汉化玩完了整部作品。</p><p>我以前从来没有接触过支倉凍砂的作品，只对他的《狼与辛香料》有所耳闻。实际上，我认为这部作品高开低走，并不是一部非常好的作品。故事的主要逻辑围绕着主角在金融市场的搏斗展开描写的。纵使第二部和第三部拥有更庞大的世界&#x2F;金融观（庞氏骗局，次贷危机）,我认为第一部对于人物的塑造明显高于第二部和第三部。在支倉的笔下，给我了一种很明显的感觉，就是角色是为了剧情而服务的。我觉得这是这部作品的硬伤，我看不到作者笔下对角色的塑造。</p><p>最让我感觉到哭笑不得的，莫过于在第一部最后，男主居然上三倍杠杆融券做空。我认为这是全部作品最为崩坏的地方。原因如下：</p><ol><li>在前期的塑造下，男主是明显深知股票市场的危机。男主轻易地听信了巴顿所谓的内部消息，本身就不符合逻辑。其次男主居然在上如此高杠杆的情况下，没有严格设置止损线。我不知道是不是作者想要表达男主因为想要拯救了月球的大家，失去了理智，但我个人认为这部分其实很掉分，明显让我感觉到了人物塑造的割裂感。</li><li>男主和巴顿的交易的过程中，为什么会全盘托出背后土地的事情。明明知道政府即将高价回收的土地是一个香饽饽，却轻易地把这个涉及到利益核心的点透露给巴顿。难道就不能明说自己欠别人8w，需要这笔钱嘛。</li><li>男主实际上当时只差8w就能够帮助居民还清贷款了，但是居然冒如此大的风险上杠杆做空。我真心不理解，都有72w的本金了，从其他渠道获取8w难道不行吗？</li></ol><p>所以给我的一个感觉是，男主不得不以如此愚蠢的方式失败。当然，如果男主不失败，能有后面的剧情吗？</p><p>不过，我还有一个比较好的收获，就是摘抄了下面的话:</p><blockquote><p>从前，我没能成为英雄。<br>所以现在，即使卑微我仍想为正义的这一方尽点棉力。<br>雷娜的那句话给人的微醺感，和啤酒很是接近。<br>而其中的那份苦涩，也恰和啤酒的滋味相似。</p></blockquote>]]>
    </content>
    <id>https://luolibrary.com/2026/03/15/World-End-Economica/</id>
    <link href="https://luolibrary.com/2026/03/15/World-End-Economica/"/>
    <published>2026-03-15T11:01:43.000Z</published>
    <summary>
      <![CDATA[<p>记得大约是在读研究生的时候，我在steam买下了“World End]]>
    </summary>
    <title>World End Economica</title>
    <updated>2026-03-15T11:03:40.156Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="随笔" scheme="https://luolibrary.com/categories/%E9%9A%8F%E7%AC%94/"/>
    <content>
      <![CDATA[<p>早在几天前，我就已经决定要写2025年的年终总结了。然而，此时此刻，我如同2024年一样坐在上海的小小出租屋里，放在键盘上的手准备刻下今年的存在。我的内心突然悸动起来，在每天的日常中，我很难感觉到时间的流逝。而在静下心来的今晚，阅读着我在2024年写下的年终总结，才意识到递嬗而过的季节是如此冷淡无情。</p><p>我不禁地望了望窗户外面，似乎想去寻找什么东西？看着路灯闪烁着微弱的橘黄色的光芒，如此熟悉的风景我为何觉得如此陌生呢？一定是我忽略了自己的日常，突然迷惘从心中弥漫开来。耳机传来的音乐把我从妄想拉回了现实，内心突然感到了久违的宁静。迷惘并没有就此消失，但在这份宁静里，我开始想起这一年里那些真正让我觉得有所依托的事情。</p><h2 id="继续在开源世界努力：Git"><a href="#继续在开源世界努力：Git" class="headerlink" title="继续在开源世界努力：Git"></a>继续在开源世界努力：Git</h2><p>2024年，在导师<a href="https://github.com/pks-t">Patrick</a>和<a href="https://github.com/KarthikNayak">Karthik</a>的指导下，我幸运地留在了Git社区。带着对自己方向更清晰的认识，我继续推进此前尚未完成的工作，并陆续处理了一些问题修复，总共提交了25个commit。</p><ul><li><a href="https://github.com/git/git/commit/b4269ebf3591b51bd0463057b97e1786123b74d1">refs-symref-referent-fix</a></li><li><a href="https://github.com/git/git/commit/de35b7b3ffb6e642b47f748eb38e31182377fb0a">Add ref consistency check for packed backend</a></li><li><a href="https://github.com/git/git/commit/d8b48af39141d4552e6e2c091957a59b806808a1">use-mmap-to-check-packed-refs</a></li><li><a href="https://github.com/git/git/commit/c38b74f28618d71cf4987aa215d1f7c432a318ac">ref-contents-check-fix</a></li><li><a href="https://github.com/git/git/commit/2b5bf70039b027ce37ec2a5442499bb9061c2da0">string-list API clean series 1</a></li><li><a href="https://github.com/git/git/commit/048625a6898f2bcc212f0d4baec1d18695b028a5">string-list API clean series 2</a></li></ul><p>最令我感到自豪的，是在2024年还只是学生的我，如今已经能够和导师Patrick一起，指导了来自印度的<a href="https://github.com/inosmeet">Meet Soni</a>完成<a href="https://summerofcode.withgoogle.com/programs/2025/projects/xVrT5e2q">Consolidate ref-related functionality into git-refs</a>这个项目。我很开心，自己的生命力越来越强了，至少，我认为自己在努力且认真地活着。纵使，我经常会怀疑自己，会质疑自己，坚持的意义到底是什么呢？努力的意义是什么呢？我至今仍然无法找到这些问题的答案。但是，我很开心自己在做自己。</p><h3 id="德国的旅行"><a href="#德国的旅行" class="headerlink" title="德国的旅行"></a>德国的旅行</h3><h4 id="与导师的相见"><a href="#与导师的相见" class="headerlink" title="与导师的相见"></a>与导师的相见</h4><p>正是因为今年成为了导师，很幸运地能够代表Git社区去参加谷歌举办的GSoC Mentor Summit。也正是因为这个契机，我经历了许多第一次。第一次办理德国申根签证，第一次的出国旅行，第一次通过自己的双眼去看了外面的世界。</p><p>最令我感慨的，是在德国见到了两位一直在线上陪伴我的导师Patrick和Karthik。当第一次在现实中看见Patrick时，那一刻仿佛有人从屏幕里走了出来，这种不真实的感觉一瞬间冲击了我。随后，我的副导师Karthik也到了，我很开心地给他们分享了我从四川仁寿带到德国的张三芝麻糕。我真心觉得自己很幸运，在即将毕业的那一年选择了参加GSoC。我从来没有想到自己能走到这一步，能和来自地球另一端的人建立连接。本来形同陌路的我们，通过开源建立了连接，认识了彼此。</p><p>然而，Patrick对我的离别的话语至今仍然在我的脑海里面回荡。</p><blockquote><p>See you again in the git mailing list (我们会在Git邮件列表中再见。)</p></blockquote><p>在我看来，这是多么浪漫的一句话，因为我们的相遇本就是在Git邮件列表里面，哪怕面临离别，我们也会继续在Git邮件列表中相见。</p><h4 id="GSoC-Mentor-Summit"><a href="#GSoC-Mentor-Summit" class="headerlink" title="GSoC Mentor Summit"></a>GSoC Mentor Summit</h4><p>GSoC Mentor Summit在慕尼黑召开，会议的形式出乎意料地自由——没有固定议程，没有严肃的报告，大家只是随意地聊天、交流。一开始我很不适应这种氛围，腼腆得不知道该怎么开口，放不开自己。但混熟了之后，这种拘谨渐渐消散了。和来自世界各地的开发者、导师们一起聊项目、聊代码、聊各自的故事，那种自在而平等的氛围，是我从未体验过的。</p><p>然而，最令我感触深刻的就是留言册的话语：</p><p><img src="https://s2.loli.net/2025/12/25/rX1D4SN9w2KMuaW.jpg" alt="Thank you for the ticket to life"></p><blockquote><p>Thank you for the ticket to life (感谢您赐予我生命的入场券。)</p></blockquote><p>我无法用语言表达出我对这句话的感受。我想这是因为这句话让我感到了深深的共鸣，我何尝不是通过GSoC找到了一些自己的存在意义呢？伴随着这些想法，我也在留言册留下了我的心情：</p><blockquote><p>Last year, I was mentored by Git community. My two mentors Patrick and karthik brought me into the world of open source, which makes me find the meaning of life. This year, I, become a mentor to try to bring other students into the open source. This is the power of the GSoC and open source. It connects each other all over the world. And I wouldn’t forget about this experience. GSoC is a such wonderful thing. Thank Google to make us all here. (去年，我在Git社区接受了指导。我的两位导师Patrick和Karthik把我带入了开源世界，让我找到了人生的意义。今年，我成为了一名导师，尝试将其他学生引入开源领域。这就是GSoC和开源的力量——它将世界各地的人们连接在一起。我永远不会忘记这段经历。GSoC是如此美好的事物。感谢Google让我们相聚于此。)</p></blockquote><h2 id="生活"><a href="#生活" class="headerlink" title="生活"></a>生活</h2><h3 id="旅行"><a href="#旅行" class="headerlink" title="旅行"></a>旅行</h3><p>我今年很感谢我的兄弟们，他们拉着我走了很多地方。我知道，如果只是我一个人，大概很难有这么大的动力。我买了属于自己的相机（花了我一大笔钱，很肉疼，不过觉得很值得），走了相当多的地方。</p><p>五一节，我坐高铁去往了青岛，人生第一次近距离地看见了大海。六月的季度假，和朋友们一起前往香港和广东，在南澳看到了蓝得发透的大海，仿佛心灵被洗刷了一般。9月的季度假前往了桂林体验了桂林山水甲天下。10月前往了德国，跨越了半个地球，欣赏风景并与我的导师会面。翻看相机里的照片时，我第一次明白：拍照不是为了拍得多美，而是为了留下痕迹。</p><h3 id="财务管理"><a href="#财务管理" class="headerlink" title="财务管理"></a>财务管理</h3><p>今年最大的收获就是接触到了<a href="https://beancount.github.io/docs/">beancount</a>这个财务管理工具。我也是在今年6月份通过<a href="https://byvoid.com/zhs/blog/beancount-bookkeeping-1/">Beancount复式记账（一）：为什么</a>这篇文章了解到了这个工具，并通过半年的时间，了解其原理，把自己从实习以来的工资收入和支出全部记录了下来。我第一次了解到了我的日常支出和收入情况，我第一次明白了复式记账法的厉害之处，并不是说看自己花了多少钱，而是基于数据的方式认识了我自己。</p><h3 id="和室友的相聚"><a href="#和室友的相聚" class="headerlink" title="和室友的相聚"></a>和室友的相聚</h3><p>今年12月份初的时候，去见了在无锡的大学室友。我和他已经两年没见了。当时他还在上海读书，我当时也在上海实习。每次的这种相聚，总会意识到时间的无情流逝。互相聊了一下各自的生活，一个下午就过去了。时间似乎回到了2020年的时候，我们在重庆交通大学南岸校区慧园的时光。我们似乎变了，但似乎什么也没变。</p><h2 id="自我"><a href="#自我" class="headerlink" title="自我"></a>自我</h2><p>我其实一直不希望自己在小小的出租屋里面腐烂，然而我有时候觉得自己什么也没做，平白无故的浪费宝贵的时间的时候，我就会说出下面的话语（拖我的福，我们有个微信群名改成了“明天别腐烂了”）</p><blockquote><p>在小小的出租屋里腐烂。</p></blockquote><p>写到这儿，我的思绪开始翻滚了起来，再次望了望窗外，夜已经深了，寂静弥漫在这小小的出租屋里面。我不禁问我自己：今年的我做了自己吗？倒不如说自己认为应该追寻的自我到底是不是正确的答案呢？自己是否鲜明地活着呢？</p><p>其实我自己给不出这些问题的答案，或者说这些问题本来就没有答案。然而，我唯一不想做的事情就是：<strong>输给自己</strong>。</p><blockquote><p>输给了雨　输给了风　也输给了冰雪和夏季的暑气<br>即便如此　我也不能输给自己</p></blockquote><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>耳边的音乐声仍然没有停，我听着amazarashi的《ナガルナガル》（《不断流淌》），看着歌词又陷入了沉思。</p><blockquote><p>眼泪流下　时间流淌　你得比它们跑得要更快些<br>街景会变　人也会变　就连昨天没能实现的愿望也是<br>别说丢就丢啊</p></blockquote><p>最终我再次望向窗外，看到镜面上反射的模糊不清的自我，希望明年自己也能继续做自己。在这无意义的世界中，刻下自己的意义。</p>]]>
    </content>
    <id>https://luolibrary.com/2025/12/25/2025%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93/</id>
    <link href="https://luolibrary.com/2025/12/25/2025%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93/"/>
    <published>2025-12-25T15:56:18.000Z</published>
    <summary>
      <![CDATA[<p>早在几天前，我就已经决定要写2025年的年终总结了。然而，此时此刻，我如同2024年一样坐在上海的小小出租屋里，放在键盘上的手准备刻下今年的存在。我的内心突然悸动起来，在每天的日常中，我很难感觉到时间的流逝。而在静下心来的今晚，阅读着我在2024年写下的年终总结，才意识到递]]>
    </summary>
    <title>2025年终总结</title>
    <updated>2025-12-25T15:56:50.830Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="游戏笔记" scheme="https://luolibrary.com/categories/%E6%B8%B8%E6%88%8F%E7%AC%94%E8%AE%B0/"/>
    <category term="GalGame" scheme="https://luolibrary.com/tags/GalGame/"/>
    <content>
      <![CDATA[<h2 id="感想"><a href="#感想" class="headerlink" title="感想"></a>感想</h2><p>从我个人的角度来看，《Air》并不是一部很好的作品。翼人是这部作品的核心主角，地球上所有发生过的事情都会通过记忆的形式寄宿于翼人的羽翼上，伴随着岁月的积累，悲伤的回忆给翼人带来诅咒。</p><p>游戏最开始必须通过Dream篇，也就是三个主角线：佳乃线、美凪线和观铃线。这三个线其实对于翼人的引入作用都极其有限。在佳乃线中，羽毛如同一个魔法道具，最后介绍这个羽毛背后的回忆时候，如同强行解释一般。在观铃线中，直接承载翼人设定。唯独在美凪线中，基于“梦”这个机制连接起了翼人的设定。</p><p>Summer篇的氛围塑造我是很满意的，然而我认为这篇是硬伤。在过了三位女主线后，突然跳到了过去，这种切换是极其僵硬的，在三位女主线的篇章中，没有对这个剧情的铺垫。完全就是把这个过去灌输给读者，在阅读的时候因为氛围的影响，不会觉得有问题，但是一旦回过味来，就觉得莫名其妙。</p><p>Air篇其实更加糟糕，我始终难以理解的就是观铃和晴子之间的亲情，或者说我无法理解作品塑造出来的亲情。实际上晴子对观铃并不是那么的冷漠，真正的冷漠是毫不在意。然而，晴子在本篇章的转变是没有铺垫的。这就让我感觉到了割裂，在Dream的观铃线中对晴子的描写并不是很多，直接用亲情催泪，然而并没有对晴子的心灵刻画和成长进行描写，这是最大的败笔。至于轮回这个主题，我认为根本没有表达（逃。</p><p>相反，我反而认为整部作品写的最好就是美凪线。美凪线是唯一能看见成长的线。美凪清楚地认识到自己只是在假装扇动翅膀，活在梦中。然而我们不也是活在梦中吗？</p><blockquote><p>铁丝网外的天空，已经染上夜色。<br>环顾天空，看到远方天空一只彷徨的鸟。<br>美凪：我的翅膀……已经忘记该如何飞翔。<br>远野望着鸟儿，悲伤地说着。<br>美凪：我只是……一直在装作扇动翅膀而已……<br>美凪：不知不觉……我连天空的广阔……还有大地的温暖都已经忘记了。<br>她微微上扬的嘴角，看起来十分自嘲。<br>美凪：……无法飞翔的翅膀，还存在任何的意义吗？<br>远野稍稍把视线转向我，如此问道。<br>美凪：肯定没有任何意义……无法去往天空也无法回到大地，只能四处彷徨。<br>美凪：就像那只鸟一样……我也只能永远彷徨下去……</p></blockquote><h2 id="摘抄"><a href="#摘抄" class="headerlink" title="摘抄"></a>摘抄</h2><blockquote><p>远野用温暖的目光看着小满。<br>时不时像是在确认小满是否存在一样，触碰她、抚摸她的头。<br>小满幸福地笑着。<br>多么美好的画面啊。<br>感觉这景象就算一直看也肯定看不腻。<br>而现在的我，是否也深处这景象之中呢？<br>这会不会是梦中的景象呢？<br>这令人安心的温暖让我甚至会这么想…</p></blockquote><blockquote><p>往人：如果离别不会感到寂寞，那相遇不就变得没有意义了吗？<br>美凪：也许吧……<br>美凪：但是……<br>往人：但是？<br>美凪：寂寞……只会成为枷锁……<br>美凪：会让你无法再迈出一步……<br>美凪：无法前进，也无法后退……只能承受着悲伤……<br>往人: ……<br>美凪：……<br>我们把所有的话语都交给风。<br>残留着潮水气息的风，吹得树叶沙沙作响。<br>这声音，让我想起差点忘记的事情。<br>只要不是永远，终会迎来别离。<br>对日常生活来说也是一样。<br>我们的生活中，始终与别离背对着背。<br>既然如此……<br>那终有一天会结束的日常……<br>和会醒来的梦，又有多大的区别呢？<br>一样的。<br>我们一直生活在梦中。<br>无论梦还是现实，都没有任何的区别。<br>所以……<br>我想知道，当梦结束之后，究竟会迎来什么。</p></blockquote><blockquote><p>往人：是和我一起去旅行，还是一个人去别的地方。<br>往人：又或者……回到你该回去的地方。选择权在你。<br>美凪：我来……决定。<br>往人：没错。要以远野美凪自己的意志做决定。</p></blockquote><blockquote><p>‘无法飞翔的翅膀，还存在任何的意义吗？’<br>不经意回想起远野的话。<br>往人：（……当然有意义了。）<br>往人：（因为它承载着往昔翱翔天际的宝贵回忆啊。）<br>往人：（…..）<br>往人：（你说对吧……小满……)</p></blockquote><blockquote><p>小满：在天空中……有个非常寂寞的女孩。<br>小满平静地说着。<br>声音彷佛不是我认识的那个幼小的女孩，听起来像个成熟的大人。<br>小满：那个女孩一直在做着悲伤的梦，除此之外一无所有。<br>小满：因为无法得到幸福，只能做着悲伤的梦。<br>小满：小满……就是那悲伤的梦的碎片。<br>往人：……<br>往人：就是说……<br>小满的话让我回想起来。<br>母亲从小就反复讲给我听的，那个女孩的身姿。<br>背负着悲伤翅膀的，女孩的身影。<br>小满：不对……不太一样……<br>彷佛要制止我的思考，小满摇了摇头。<br>小满：小满只是那个女孩梦中非常小的一片。<br>小满：她的背后，有一双伤痕累累的翅膀……<br>小满：那双翅膀，有着非常神奇的力量。<br>小满：无数人的经历，许许多多的回忆，凝聚在那对翅膀之上。</p></blockquote><blockquote><p>小满：小满，得到了那个女孩的一片羽毛。<br>小满：因为，我有想见的人……<br>小满：又想要见面，想让她们得到幸福的人……<br>小满：想要让她们的幸福，和那个女孩的幸福联系在一起……<br>小满：小满从那个女孩那里，得到一份回忆。<br>小满：因为想要和那个人成为朋友，需要回忆。<br>小满：因为小满没有任何回忆……<br>小满：国崎往人，你知道吗？<br>往人：……什么？<br>小满：人类……没有回忆是无法活下去的。<br>小满：但尽管如此……只依靠回忆，同样无法活下去。<br>小满：梦……总有一天会醒来。<br>小满：忘记醒来的梦……无论是多么幸福的梦……也总有一天会变成悲伤。</p></blockquote><blockquote><p>往人：真的可以把一切都洗涤干净吗？<br>美凪：……<br>往人：……对不起，请容我拒绝。<br>往人：我想带着自己所有的丑陋和污秽，继续活下去。<br>往人：好不容易活到这个年纪，我不想做出把这些岁月一笔勾销的事。</p></blockquote><blockquote><p>往人：不管有多么幸福，也有些人是无法停留在原地的。<br>得到了什么，就必须守护什么。<br>如果从一开始就一无所有，就不会失去任何东西。</p></blockquote><blockquote><p>我在台阶上坐了下来。<br>乌鸦横穿过橘红色的天空准备回巢。<br>从附近的肉店飘来了熟食的香味。<br>远处的马路上，跑过去几个游泳归来的小孩。<br>一幅柔和而又令人怀念的景象。<br>这是为什么呢？<br>我是不是在一点点地融入这个小镇呢？</p></blockquote><blockquote><p>我心里明白。<br>也许我根本没信过什么天空中的女孩。<br>也许我在寻找的，正是旅行的理由本身。<br>因为没有人告诉我其他还有什么样的活法。<br>我问自己。<br>我想做什么呢？<br>我该朝哪里前进呢？<br>我不太清楚。</p></blockquote><blockquote><p>对于我来说，旅行本就是日常。<br>不去旅行的生活，对我来说就是新的冒险。</p></blockquote><blockquote><p>这孩子那数不尽的可爱。<br>若比作天空，便如无穷繁星。<br>若比作山林，便如葱茏草木。</p></blockquote><blockquote><p>这个女人也不知从什么时候起，一直处于不安之中。<br>她是否也察觉到了天空所预示的悲伤？<br>或许她比那两个人更早就察觉到了。<br>因为每次和我在一起的时候，她总是会露出寂寞的表情。</p></blockquote><blockquote><p>将她们二人联系在一起的……<br>我认为是母女之间的纽带。<br>一直陪在她身边的这个女人，原来是她的母亲。<br>回想起来，她们两个人一起经历了许多往事。<br>有时甚至难以相信她们是一对母女。<br>然而，她们确确实实是母女。<br>或者说，正因为这样，她们才能成为母女。<br>如今陪在她的身边，我明白了。<br>明白了她们两人克服过的困难。<br>而且，现在她们仍然互相陪伴在一起。<br>这便是她们是母女的铁证。</p></blockquote>]]>
    </content>
    <id>https://luolibrary.com/2025/08/16/Air/</id>
    <link href="https://luolibrary.com/2025/08/16/Air/"/>
    <published>2025-08-16T14:18:20.000Z</published>
    <summary>
      <![CDATA[<h2 id="感想"><a href="#感想" class="headerlink"]]>
    </summary>
    <title>Air</title>
    <updated>2026-03-29T08:17:46.537Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="读书笔记" scheme="https://luolibrary.com/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    <category term="小说" scheme="https://luolibrary.com/tags/%E5%B0%8F%E8%AF%B4/"/>
    <content>
      <![CDATA[<p>这应该是我第三次阅读《嫌疑人X的献身》了，本次读完这本小说，我不得不感慨东野圭吾的笔力。实际上，东野圭吾的侦探小说不仅仅只着重于侦探的部分。从剧情上来说，这是一个比较简单的故事，然而作者在最后给读者的震撼是非同一般的。每当我阅读到石神基于做加法的思路（杀一个人）来干扰警方的视野时候，我就在感慨石神的布局是如此的聪明。因为正常的思维都是需要做减法来干扰</p><p>石神主要采取的以下的手段（基于上帝视角）：</p><ul><li>脱下了富㭴慎二的衣服。（这也是作者的一个烟雾弹，这是我在读的时候以为是要隐藏线索，但实际的目的是想让警方认为石神杀的流浪汉就是富㭴慎二）</li><li>用杀死富㭴慎二同样的方式杀死了流浪汉，在自己家里留下证据，方便顶罪。</li><li>偷了一个新的自行车，让警方能够快速定位，从而确定作案时间，进而证明花冈靖子的不在场证明。</li><li>为了让警方认为石神杀死的流浪汉就是富㭴慎二，故意在偷的自行车上面留下了富㭴慎二的指纹。让警方误以为凶杀要烧掉死者的衣服，毁灭证据。但实际上是故意地引导警方认为死者就是富㭴慎二。</li><li>故意地给花冈靖子模糊的不在场证明，因为完美的不在场证明本身就是破绽。</li></ul><p>由此可见，石神是一个相当聪明的人，而且具有极高的执行力。能够正确的处理境况，他认为到了做减法是不可能瞒过警察的，于是选择做加法来处理。不得不感叹，极度地理性啊。然而，我的这个读书笔记最想讲的就是我对石神的感受。</p><h2 id="感想"><a href="#感想" class="headerlink" title="感想"></a>感想</h2><p>石神是孤独的，或者说我能感受到他的孤独。无论是作为大学生的他，还是在大学里面做教授的他，还是在高中学校里面当数学老师的他，一路都纯粹地做他自己最想做的事情：研究数学。在作品中，汤川给石神带来了一个有趣的数学问题，石神沉浸在自己的世界里面研究。然而，这样纯粹的他，并没有得到认可。无论是作为大学教授的他，还是作为在高中学校里面当数学老师的他。其实，我有时候就在思考，我们是真的悲哀。明明生在一个意义都是被构建出来的世界中，却仍然需要这个社会的认可存活（纵使石神认为自己并不需要任何人的肯定，但我觉得这是矛盾的，这是我们的社会属性所强加给我们的，任何人都难以避免，不然石神为什么会选择自杀呢？）。正如同他自杀的理由：</p><blockquote><p>他已毫无留恋。没有理由寻死，也没有理由活着，如此而已。</p></blockquote><p>石神决定自杀的时候，花冈靖子给他的世界带来了光明。很多作品的解析把这个称为爱情，其实我觉得这就是误解。花冈靖子在此刻成为了石神的精神支柱和信仰。石神并不是因为想要真正得到她而选择帮助了她。当石神看见花冈靖子和工藤邦明之间的感情关系的时候，作者放了一个烟雾弹，就是石神写下了威胁信寄给花冈靖子。我想肯定作为读者，当时想的是石神是妒忌了，但实际上这也是石神的一环。正如汤川所讲述的</p><blockquote><p>你们做的，只是按照他的证明方法走。你们该做的，是探寻有没有别的答案。除了他提供的答案之外别无可能——唯有证明到这个地步，才能断言，那个答案是唯一的答案！</p></blockquote><p>然而，花冈靖子的自首把石神的所有计划都毁了。当然，从社会正确的价值观出发，花冈靖子是应该自首的，因为她杀了人理应受到法律的惩罚。她认为她应该和石神先生一起承担这份罪孽，殊不知她完全不了解石神。当时她不了解石神也是理所当然的，花冈靖子就是一个普通人。我不想去批判花冈靖子的行为，我只想说她的所作所为彻底地抹杀了石神的意义以及存在。其实这也说明了花冈靖子就是不爱石神，她自首的目的并不是为了石神，而是为了让自己心安。</p><p>汤川认为石神爱花冈靖子，我认为这点没什么，石神肯定是对花冈靖子有好感的。但是汤川为什么要对花冈靖子说出事情的真相呢？从作品的得到的信息是汤川希望花冈靖子知道石神对她的付出，以及对她的爱有多深。我其实理解汤川的做法，汤川也是基于自己的价值观出发来选择自己的行为的（其实，我认为这一部分是剧情杀，如果让汤川选择隐瞒真相的话，作品就不好写了）。</p><p>最终，石神所作的一切都化为了泡影。石神以为他的计划已经天衣无缝，但他唯独的失误就是忽略了人性，忽略了作为普通人的花冈靖子是难以承受这种罪恶感生活下去的。这种独一无二的孤寂感，是东野圭吾给我带来的震撼。侦探小说只是这部作品的表罢了，里仍然是人孤独的本质。</p><p>让我用小说的最后作为我感想的结尾吧。</p><blockquote><p>石神继续嘶吼，草薙觉得他仿佛正呕出灵魂。</p></blockquote>]]>
    </content>
    <id>https://luolibrary.com/2025/05/22/%E3%80%8A%E5%AB%8C%E7%96%91%E4%BA%BAX%E7%9A%84%E7%8C%AE%E8%BA%AB%E3%80%8B%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/</id>
    <link href="https://luolibrary.com/2025/05/22/%E3%80%8A%E5%AB%8C%E7%96%91%E4%BA%BAX%E7%9A%84%E7%8C%AE%E8%BA%AB%E3%80%8B%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    <published>2025-05-21T16:25:42.000Z</published>
    <summary>
      <![CDATA[<p>这应该是我第三次阅读《嫌疑人X的献身》了，本次读完这本小说，我不得不感慨东野圭吾的笔力。实际上，东野圭吾的侦探小说不仅仅只着重于侦探的部分。从剧情上来说，这是一个比较简单的故事，然而作者在最后给读者的震撼是非同一般的。每当我阅读到石神基于做加法的思路（杀一个人）来干扰警方的]]>
    </summary>
    <title>《嫌疑人X的献身》读书笔记</title>
    <updated>2025-05-21T16:26:05.536Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="动漫笔记" scheme="https://luolibrary.com/categories/%E5%8A%A8%E6%BC%AB%E7%AC%94%E8%AE%B0/"/>
    <category term="动漫" scheme="https://luolibrary.com/tags/%E5%8A%A8%E6%BC%AB/"/>
    <content>
      <![CDATA[<p>前一段时间，抽空把《进击的巨人》从头到尾看了一遍。在此处，我无意去总结整部动漫的剧情。我想表达的更多的是我的一些感想。</p><h2 id="剧情评价"><a href="#剧情评价" class="headerlink" title="剧情评价"></a>剧情评价</h2><p>其实，我并不太喜欢《进击的巨人》的叙事手法。谏山创很擅长利用信息差制造悬念，并通过紧凑的中篇故事快速调动观看者的情绪。在每个小的中篇章中，在观看动漫的过程中，至少我的情绪是一直被调动的。其次，由于我们缺少信息，在马莱篇之前，我们都认为人类的敌人是巨人。我们的视角就如同作品中的角色视角一致，我们得消灭巨人，为了人类的自由。</p><p>到了马莱篇，许多真相逐渐开始浮出水面。然而，我并不觉得这种伏笔有什么值得称赞的。谏山创在马莱篇之前几乎没有对马莱这个国家进行过描述，针对马莱的伏笔仅仅是来自于莱纳的一些话语。</p><blockquote><p>回到无法回去的故乡，我的心愿仅此而已。</p></blockquote><p>然而，从观众的视角来看，我们只会认为莱纳是因为墙壁被破坏了，无法回到自己的故乡（艾伦肯定也是这么想的）。其实，作品使用伏笔是一个极其正常的做法，但是谏山创利用信息差控制观众的情绪。正如我们也和在墙内的艾尔迪亚人一样，我作为一个观众也是希望能够消灭巨人。但是到了马莱篇，我们都知道了实际上在马莱的艾尔迪亚人本身也是受到了马莱的压迫，在长期的洗脑教育下，马莱的艾尔迪亚人认为墙内的艾尔迪亚人是恶魔。在这一刻，这部作品实际上就已经发生了巨大的转变，从“我们得消灭人类的天敌巨人”变成了“人类与人类之间的斗争”。</p><p>实际上，这是一个很好的主题。但是，我其实并不满意谏山创的叙事方式，因为我觉得谏山创应该把整个世界观透明地展现给观众来描述这个故事。也就是直接开篇介绍马莱派莱纳等人来的目的，直接揭露墙外是存在其他的文明世界的。但是我认为谏山创没有这个水品。正是因为我们看到了调查兵团因为好奇心和追寻自由而努力地开辟墙外的世界，我们才能与作品中的角色共鸣。如果我们作为观众，一开始就知道真相呢？我们的角度是不是会不一样呢？其实，这才是考验水平的写法。实际上，网上有许多人批评谏山创的虚无主义，我倒是觉得谏山创根本不是从虚无主义的角度来描写这个作品的。反而，他本质是在玩弄观众的情绪。如果谏山创能从一开始就告诉观众真相，我才能够认同这部作品是基于虚无主义的哲学观念去描写的，我认为这其实是谏山创对观众的嘲讽。因为我们观众其实也是在墙壁里面的人，在由被谏山创构建出的这个墙壁中的人。</p><p>从马莱篇开始，谏山创已经无法使用原有的叙事手法了。这导致了谏山创难以利用信息不对称来调动观众的情绪。同时，从马莱篇开始，谏山创引入了人与人之间的斗争，拔高了作品的立意。此时，谏山创的笔力就无法驾驭住作品了。在马莱篇之间，谏山创尚且能够用二元论的方式推动剧情的发展。显然，面对势力之间的复杂矛盾，谏山创的笔力处理地一塌糊涂：</p><ol><li>由于艾伦是进击的巨人，能够和继承者进行交互，受到<strong>来自未来</strong>的始祖巨人的力量的影响。这就是这部作品超级拉胯的地方，并不是其基于宿命论的哲学观点的问题。而是这就是在忽悠观众，强行地将剧情之间的关系连接起来。那么实际上我们可以说艾伦的一切行动都是基于始祖巨人的。不论其对马莱发动袭击还是发动地鸣。在我的理解里面，艾伦的塑造彻底拉胯，因为在马莱篇之间，我们可以认为艾伦是基于其意志追寻自由，然而谏山创却直接把观众当成了一个笑话。艾伦在我看来只不过是一个傀儡了。</li><li>始祖尤弥尔的人物塑造问题。我其实并不反感尤弥尔本身的人物塑造，但是问题在于谏山创对于这个人物的塑造没有逻辑，我们就当始祖尤弥尔当时没有转过弯来，被“爱情”蒙蔽了双眼。在这么多年的时间里，始祖尤弥尔一直被她过去的爱情和自身的奴隶身份束缚，然后被艾伦几句话就劝动了。我求求了，一个2000多年都生活在束缚之中的人，就靠几句嘴遁就被唤醒了自我意识吗？特别是尤弥尔最后看到三笠亲手杀死艾伦，从爱情的束缚中解脱，使巨人之力从世上消失。我觉得这就是纯粹在扯淡了。倒不如说谏山创根本不知道怎么收尾了，只能这样搞，导致了人物为剧情服务。</li></ol><p>当然，你不得不承认谏山创这样的方式，使作品在商业上成功了。</p><h2 id="虚无主义"><a href="#虚无主义" class="headerlink" title="虚无主义"></a>虚无主义</h2><p>为什么我单独用一节讲这个问题呢，是因为网上有很多人认为最后谏山创的处理是虚无主义的体现，但要我说谏山创并没有实力写出虚无主义的作品。在传统虚无主义文学作品中，全知叙事是最常见的叙事手法。例如，加缪的《局外人》虽然采用第一人称叙事，但读者能够看到梅尔索行为的荒谬性；萨特的《恶心》让读者理解洛根丁的存在危机；卡夫卡的《变形记》则让读者从一开始就知道格里高尔的处境。然而《进击的巨人》选择让观众与角色共同经历认知的转变过程，而非从一开始就拥有完整的世界观认知。</p><p>这导致了一个严重的问题，在我的理解里，谏山创仅仅是通过这种方式来渲染情绪。如果真的想要展现虚无主义，更应该展现<strong>无意义的战斗</strong>。如果谏山创采用上帝视角，从一开始就向观众展示墙内艾尔迪亚人和马莱人各自的处境和思想，让读者看到两方都被各自的意识形态和历史记忆所束缚，都认为自己在为正义而战，那么作品的虚无主义主题可能会更加鲜明和深刻：</p><ol><li>墙内人为“自由”而战的徒劳。</li><li>每个角色都被自身视角所局限。</li></ol><p>真正展示虚无主义，最有效的方式往往是通过上帝视角展示不同阵营无意义的战斗。这种叙事策略能够让观众超越单一视角的局限，直接感受到冲突的荒谬性和徒劳性。同时，也能让我们思考存在主义，纵使这个世界是荒诞的，仍然有一群人在为自己的存在意义而战斗，例如调查兵团。</p><h2 id="调查兵团"><a href="#调查兵团" class="headerlink" title="调查兵团"></a>调查兵团</h2><p>反而，调查兵团是整部作品中塑造的最好的部分。无论是马莱篇前，调查兵团为了追寻自由或者满足自己的好奇心选择去开拓墙外的世界还是在马莱篇后调查兵团坚持自己的信念都令人无比动容。在我的理解里，调查兵团代表了人类最优秀的品质，不满足于成为猪猡，遵循自己的好奇心追寻自由，真正能够被称为自由之翼。然而，自由的代价是巨大的，调查兵团众多人的牺牲，为了自己的信念献出了心脏。</p><p>实际上，这也是我觉得谏山创笔力不行的地方，如果谏山创在一开始就让观众看了上帝视角，纵使观众在前期会觉得调查兵团被隐瞒在欺骗之中，观众更会被调查兵团展现的品质所打动。哪怕是面对无意义，调查兵团也坚持自己的信念。实际上，这本身就是人们对于虚无的反抗，无论是选择生活在虚无，荒诞或者存在中，作为观众更想看到的是作品中的人类的反思，挣扎，最后坚定不移的坚持自己的信念。这才是真正的勇气。</p><p>泽野给调查兵团写的两首歌“The Dogs”和“Barricades”或许完美无缺地表达了调查兵团的品质。</p><ul><li>The Dogs<blockquote><p>Do you believe that we can just kill them all?<br>Do you believe that we can conquer this?<br>Can’t delete all the mess that I have seen<br>Fall in the fire, but these burns will heal you<br>Coming down to show you what to do<br>How to die with honor, dignity<br>We should delete all the mess out from our sight<br>What is truth is for me and you</p></blockquote></li><li>Barricades<blockquote><p>Wouldn’t it be nice to take a walk on some pure white sand<br>Gaze at the horizon<br>Without living in fear?<br>Wouldn’t it be sweet to watch the sun curve down meets the waves?<br>And taste the ocean spray<br>And realize we’d been living as slaves</p></blockquote></li></ul><p>为调查兵团献出心脏。</p>]]>
    </content>
    <id>https://luolibrary.com/2025/04/15/%E3%80%8A%E8%BF%9B%E5%87%BB%E7%9A%84%E5%B7%A8%E4%BA%BA%E3%80%8B%E2%80%94%E2%80%94%E8%87%AA%E7%94%B1%E4%B9%8B%E7%BF%BC/</id>
    <link href="https://luolibrary.com/2025/04/15/%E3%80%8A%E8%BF%9B%E5%87%BB%E7%9A%84%E5%B7%A8%E4%BA%BA%E3%80%8B%E2%80%94%E2%80%94%E8%87%AA%E7%94%B1%E4%B9%8B%E7%BF%BC/"/>
    <published>2025-04-15T15:12:10.000Z</published>
    <summary>
      <![CDATA[<p>前一段时间，抽空把《进击的巨人》从头到尾看了一遍。在此处，我无意去总结整部动漫的剧情。我想表达的更多的是我的一些感想。</p>
<h2 id="剧情评价"><a href="#剧情评价" class="headerlink"]]>
    </summary>
    <title>《进击的巨人》——自由之翼</title>
    <updated>2025-04-15T15:13:04.676Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="随笔" scheme="https://luolibrary.com/categories/%E9%9A%8F%E7%AC%94/"/>
    <content>
      <![CDATA[<p>眨眼的瞬间，2024年就要过去了。记忆中突然飘来我曾在西电的网安大楼写下了2023年终总结的碎片。如今的我坐在上海的小小出租屋里，不禁回望四周，感慨时间的无情流逝。在这淡淡的哀愁中，我又回想起《将进酒》中的名句。</p><blockquote><p>君不见黄河之水天上来，奔流到海不复回。<br>君不见高堂明镜悲白发，朝如青丝暮成雪。</p></blockquote><p>此时此刻，我的手停留在键盘之上，不知道该如何去表达自己的情感。各种复杂的情感纠结于我心中，无论如何，我只是想刻下自己的存在。</p><h2 id="走向开源世界：Git"><a href="#走向开源世界：Git" class="headerlink" title="走向开源世界：Git"></a>走向开源世界：Git</h2><p>依稀记得2023年的时候，我一个人前往了上海实习，在那个小小的出租屋里，我总会觉得寂寞。突然想起自己在2023年的年终总结刻下的话语：</p><blockquote><p>上班的体验是很好的，然而晚上一个人待在上海小小的出租屋里面，感受到的确实实在的寂寞。突然急切地希望自己身边能有一个人陪伴，然而我却厌恶自己的想法，如果是因为寂寞就去靠近一个人，对她来说这是一个不公平的事情。</p></blockquote><p><strong>必须给自己找点事情做，不想在2024年重蹈覆辙。即便是一个人生活，也想让自己的每天变得精彩，想让自己鲜明地体会到活着的感觉</strong>。怀揣着上面的想法，我决定给自己找一些有意义的事情去做。借着自己最后的学生生涯，我选择参加了谷歌开源之夏（GSoC），荣幸地被Git开源项目选上，为Git的引用实现一致性检查（<a href="https://summerofcode.withgoogle.com/archive/2024/projects/ukm4PTEF">Implement consistency check for refs</a>）。</p><p>在2024年5月到2024年8月期间，经历了许多痛苦（从版本1迭代到了版本16），我的代码终于提交到了Git仓库里面。看到自己能够为这么一个基础的软件做出贡献，自己实现的功能能够被整个世界的程序员使用，我由衷地为自己感到自豪。我十分感谢指导我的两位导师<a href="https://github.com/pks-t">Patrick</a>和<a href="https://github.com/KarthikNayak">Karthik</a>，给予了我大量的指导和帮助。我对Patrick和Karthik在项目结束对我说的一句话印象特别深刻：</p><blockquote><p>Take on the role of the subject matter expert. This is rather hard initially, but at the end of the project you already had quite a lot of knowledge around how the whole infrastructure works. Carefully answering questions, explaining why certain proposals are not feasible or why your tradeoffs are better demonstrates that you know what you are doing. It’s important to find the right balance between taking feedback from others and confidently saying why your version makes sense. (扮演主题专家的角色。这一开始可能会有些困难，但在项目结束时，你已经对整个架构的运作方式积累了相当多的了解。耐心回答问题，解释为什么某些提议不可行，或者为什么你的权衡更优，这些都能展示你对自己的工作了然于心。找到在接受他人反馈和自信地说明自己方案更合理之间的平衡点非常重要。)</p></blockquote><p>在谷歌开源之夏的旅程中除了收获了代码能力的进步，我觉得最大的收获是加强了人与人之间的联系，我与我的两位导师Patrick和Karthik建立了良好的关系。我原先很少用英文和别人交谈，最开始的第一次和Patrick视频会议，我相当的紧张。同时，我觉得和git社区建立了良好的关系，通过一个开源项目能够让生命中本不会产生交集的大家联系起来，体会到了开源的魅力。</p><p>尽管谷歌开源之下在8月底就结束了，我仍然留在Git社区继续完善我该做的工作，并开始审核别人的代码来了解Git其他部分的功能是如何运作的。今年的我提交了20个commit:</p><ol><li><a href="https://github.com/git/git/commit/b3d175409d9bfe005515ffe361e959fb9965111c">Ref consistency check infrastructure setup</a></li><li><a href="https://github.com/git/git/commit/57e81b59f35198afedae18e8363dbffdc96c481d">Ref content consistency check for file backend</a></li></ol><h2 id="研究生毕业"><a href="#研究生毕业" class="headerlink" title="研究生毕业"></a>研究生毕业</h2><p>伴随着6月底的到来，我也从西电毕业了，人生迈入一个新的阶段。比起本科毕业的时候，或许是因为习惯了离别的原因，又或许是期待自己在上海的新生活的原因，我似乎没有那么伤感了。然而，我的内心仍然悸动，看着实验室的工位变得如此干净，总有种自己的存在被抹去的感觉。回想自己在西电的三年，不知道自己是否变得更加温柔了，也不知道自己是否变得更加勇敢了，更不知道自己是否前进了。诸多回忆突然涌入脑海，让我不知所措。</p><p>然而，我深刻地意识到我即将从集体生活转变为个人生活。再也无法和雨晴一起晚上10点后在实验室打玩游戏，一起回寝室了。再也无法简单地在实验室和兄弟们说一句，今天要不要去小码头搓一顿改善一下伙食。我突然觉得伤感，让我想起一句歌词：</p><blockquote><p>倘若从这场梦醒来，我的孤独该付诸何处。</p></blockquote><h2 id="生活"><a href="#生活" class="headerlink" title="生活"></a>生活</h2><p>比起2023在上海实习的我，我更习惯一个人的生活了。我觉得是因为我在2023年已经体会了孤独一人的感觉，提前做了一些准备。至少意识到，得利用好自己的时间，如果任凭时间流逝，无所事事就会觉得空虚，。然而，<strong>这样想是不是会太寂寞呢</strong>？我还是不太想妥协，也不想对自己说谎。</p><p>我不知道自己是否做到了怀揣着生命力和想象力去生活，今年从正式工作开始，重拾了阅读的习惯，我真的好久没有看过书了，然而我始终觉得看书是一个很美好的事情，总能让我静下心来。我原先很不会去享受生活，和同事在每天中午溜圈的时候，我才意识到自己的局限性，其实我也是容易待在舒适圈里面的。于是努力去尝试了更多新鲜的事物，自己周末骑自行车到处去逛，偶尔去咖啡馆看书。但是还是很难，一个人的动力是真的太小了。</p><h2 id="影响力"><a href="#影响力" class="headerlink" title="影响力"></a>影响力</h2><p>说影响力是不是太膨胀呢？（逃</p><h3 id="博客"><a href="#博客" class="headerlink" title="博客"></a>博客</h3><p>其实今年最令我开心的时候，莫过于我的博客有7000多的浏览量，一想到我曾经写下的文字或多或少影响到了在这个世界上的某一个陌生人，给他带来了某些启发，又或是鼓舞了他。我由衷地觉得自己的坚持是有意义的。</p><p><img src="https://s2.loli.net/2024/12/26/DaG3KmguAoYftdb.png" alt="博客数据"></p><h3 id="Git"><a href="#Git" class="headerlink" title="Git"></a>Git</h3><p>完成了谷歌开源之夏后，Git社区对我进行了一次<a href="https://git.github.io/rev_news/2024/09/30/edition-115/">采访</a>，我其实对这次采访很是惊讶的，毕竟我觉得我只是完成了一份微小的工作，十分感谢社区的友好。</p><p>可能最开心的还是自己实现的功能上了所谓的<a href="https://s2.loli.net/2024/12/26/DaG3KmguAoYftdb.png">头条</a>，逐渐在这个世界里面刻下自己一些微不足道的存在。</p><p><img src="https://s2.loli.net/2024/12/26/Oc4vSMYy32rXp5A.png" alt="git news"></p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>耳边传来熟悉的音乐，在这白色相簿的季节，听着“Powder Snow”。</p><blockquote><p>点点细雪轻轻地从天而降<br>接在手心时，我不由得难过<br>停下脚步的你，望着哪个地方呢<br>仰望天空时，是否想起了我们的曾经</p></blockquote><p>在这无形的时间中，简单刻下自己的存在。</p>]]>
    </content>
    <id>https://luolibrary.com/2024/12/26/2024%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93/</id>
    <link href="https://luolibrary.com/2024/12/26/2024%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93/"/>
    <published>2024-12-25T16:34:35.000Z</published>
    <summary>
      <![CDATA[<p>眨眼的瞬间，2024年就要过去了。记忆中突然飘来我曾在西电的网安大楼写下了2023年终总结的碎片。如今的我坐在上海的小小出租屋里，不禁回望四周，感慨时间的无情流逝。在这淡淡的哀愁中，我又回想起《将进酒》中的名句。</p>
<blockquote>
<p>君不见黄河之水天上来]]>
    </summary>
    <title>2024年终总结</title>
    <updated>2024-12-25T16:34:53.403Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="游戏笔记" scheme="https://luolibrary.com/categories/%E6%B8%B8%E6%88%8F%E7%AC%94%E8%AE%B0/"/>
    <category term="GalGame" scheme="https://luolibrary.com/tags/GalGame/"/>
    <content>
      <![CDATA[<h2 id="感想"><a href="#感想" class="headerlink" title="感想"></a>感想</h2><p>这部作品我是冲着田中先生的名气购入的，其实我更多的是想看田中先生想在这部作品表达什么观点。本作是一个典型的公路片剧情，不愧为二次元的死亡搁浅。田中以极其紧凑的方式走完了剧情，我打完本部作品仅用了5个小时，还包括了我摘抄的时间。</p><p>我认为作品的核心一如既往地贯穿了田中的理念。我个人认为田中并不是想去探讨所谓的人性，而是一如既往地收束到爱与希望。先抛开对于女主的塑造，片中最大的冲突在于科学家希望通过菲莉亚来拯救人类，然而裘德并不认为人类所需要拯救。我认为这就是田中的核心观点。我也认为人类不需要拯救，人类会一直丑陋地活下去。</p><p>里面有个核心的对于女主的塑造在于“成为人类”。我认为田中的塑造的最好一点是，女主在成为人类的过程中非常地自然，我在里面看到了自己的成长。我特别喜欢女主的这一句话：</p><blockquote><p>菲莉亚：这个世界，难道被设计成了一旦想要帮助他人就会绝对失败的样子吗？</p></blockquote><p>我相信，我们都曾有过这个疑问。这种自嘲的发言让我颇有既视感。</p><p>说实话，本作有很多背景也没有交待清楚，比如说两个阵营AI的斗争，让我又想起了rewrite里面盖亚和守护者的对立。可惜，本作仅仅是短片，并没有继续深入。</p><p>总的来说，体验很好，如同一场电影一般。</p><h2 id="摘抄"><a href="#摘抄" class="headerlink" title="摘抄"></a>摘抄</h2><blockquote><p>裘德：活人凑在一起就是这么臭。<br>菲莉亚：如果我也变臭，我就能成为人了吗？<br>裘德：不会的。</p></blockquote><blockquote><p>……我不懂这种感情。<br>从未想过去理解，以后也没打算理解。<br>想理解这种感情就要拥有家庭。<br>也就是会扎下根。</p></blockquote><blockquote><p>那时，她也从头到尾没有大喊大叫过。<br>仅仅是用她锐利冷静的目光盯着我，像是在劝说我。<br>态度的言下之意仿佛是我做错了什么。<br>毫无疑问在她心中，残忍就是邪恶。<br>也认为不杀生就是正义。<br>甚至为了这份正义，即使自己挨饿也在所不惜。<br>她一定觉得这是美好的。</p></blockquote><blockquote><p>我与她共处的回忆理应数不胜数。<br>然而，这些回忆却无法按照时间顺序衔接起来。<br>事情发生的向后顺序已经变得模糊不清。<br>……这些回忆已经被时间所冲淡。<br>几年前还记得的事情，现在印象已然十分稀薄。<br>留下了深刻印象的，反倒净是些争论争吵。<br>在我看来，她的主张完全是不可理喻的。<br>她不愿意杀死鹿或者兔子，但也并非素质主义者。<br>肉干她一样爱吃。<br>菲莉亚也是如此。<br>保存用的肉类就可以毫无顾忌地吃下去。<br>要我说的话，这只不过是自欺欺人。</p></blockquote><blockquote><p>有些人对猎杀哺乳动物有抵触情绪，却对杀鱼或昆虫之类的并不在意。<br>……对我来说是难以理解的想法，但确实是存在的。</p></blockquote><blockquote><p>她是一个喜爱美好事物的女人。<br>总是憧憬着人类的尊严与善良，还有不再残酷的世界。<br>也会拒绝拿枪自卫。<br>也不喜欢我携带武装。<br>厌恶枪支。</p></blockquote><blockquote><p>裘德：那毕竟人类就是最可怕的。<br>一提到这个话题，菲莉亚的表情就复杂了起来。</p></blockquote><blockquote><p>菲莉亚：从一出生就知道所有事情的话，就不太像人类了吧。</p></blockquote><blockquote><p>裘德：……你觉得为什么父母会为了孩子舍弃生命？<br>菲莉亚：因为人类很伟大。<br>裘德：不对，有确切的理由。<br>菲莉亚：是什么？<br>裘德：本能。<br>菲莉亚：……？<br>裘德：为什么父母会重视孩子胜过生命？<br>菲莉亚：因为爱他们？<br>裘德：为什么会爱？<br>菲莉亚：因为是自己的孩子？<br>裘德：所以从孩子出生的那一刻起，就爱着他们。<br>菲莉亚：……是吧。<br>裘德：那会是真正的爱吗？<br>菲莉亚：什么意思？<br>裘德：还不知道这个婴儿会是怎样的人，只是因为是自己的孩子就会爱他。<br>裘德：通常情况下，一个人爱上另一个人是在了解对方以后。<br>裘德：但是对孩子的爱却并非如此，而且是无条件且自动的。为什么呢。<br>菲莉亚：……<br>裘德：因为基因在人的本能里刻下了要保护后代的信息。<br>菲莉亚：哎？<br>裘德：我不觉得那必然是一种崇高的行为，单纯只是本能。<br>菲莉亚：那么，父母为了孩子舍弃生命也……<br>裘德：是因为基因命令他们这么做。<br>裘德：不好意思好像是我在破坏你的幻想，但如果你过于理想化人类，总有一天会伤到你自己的。<br>裘德：无法好好爱孩子的父母也是大有人在的。<br>菲莉亚：……但是至少，会有一点真正的爱，对吧？<br>裘德：当然也有。一起生活多年后，不是本能的爱也会掺入进来。如果是那种爱意，我也不是不能理解。<br>菲莉亚：……那就足够了。哪怕只有一点点，都很伟大。<br>菲莉亚：我也是有本能的吗？<br>裘德：你那想成为人类的愿望，正是类似本能的东西。<br>菲莉亚：哦哦。<br>裘德：你为什么想成为人类？<br>菲莉亚：因为想成为。<br>裘德：还是在被出厂设置牵着走啊。<br>裘德：记住，让本能伴随上思考，哪怕是事后想的。那才是人类。<br>菲莉亚：……好难。</p></blockquote><blockquote><p>菲莉亚：这个世界，难道被设计成了一旦想要帮助他人就会绝对失败的样子吗？<br>裘德：哈哈哈。<br>菲莉亚：为什么要笑呢？<br>裘德：没什么，只是觉得你说的很对。</p></blockquote>]]>
    </content>
    <id>https://luolibrary.com/2024/08/27/%E6%98%9F%E4%B9%8B%E7%BB%88%E9%80%94/</id>
    <link href="https://luolibrary.com/2024/08/27/%E6%98%9F%E4%B9%8B%E7%BB%88%E9%80%94/"/>
    <published>2024-08-26T16:06:02.000Z</published>
    <summary>
      <![CDATA[<h2 id="感想"><a href="#感想" class="headerlink"]]>
    </summary>
    <title>星之终途</title>
    <updated>2026-03-29T08:20:25.583Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="GSoC 2024" scheme="https://luolibrary.com/categories/GSoC-2024/"/>
    <category term="GSoC" scheme="https://luolibrary.com/tags/GSoC/"/>
    <content>
      <![CDATA[<p>Suddenly, I recalled myself writing the proposal back then, and I couldn’t help but feel a bit wistful. Every time it ends, there’s always an unintentional sense of sadness. After three months, my GSoC project has also come to an end.</p><h2 id="The-Motivation-of-The-Project"><a href="#The-Motivation-of-The-Project" class="headerlink" title="The Motivation of The Project"></a>The Motivation of The Project</h2><p>The <code>git-fsck(1)</code> command is mainly used to check the consistency of the object database which misses check for the ref database. Although <code>git-fsck(1)</code> implicitly checks some properties of the ref database when checking connectivity, these checks aren’t sufficient to ensure that all refs are properly consistent like <a href="https://lore.kernel.org/git/6cfee0e4-3285-4f18-91ff-d097da9de737@rd10.de/">report</a> shows.</p><p>The goal of this small GSoC project is to establish the infrastructure for the ref consistency check, enabling developers to easily add checks for both the files backend and the reftable backend. For more detailed information, please refer to the <a href="https://docs.google.com/document/d/1pWnnyykGmJIN-wyosZ3PtueFfs_BRdvJq-cwroRorBI/">proposal</a>.</p><h2 id="The-Patches"><a href="#The-Patches" class="headerlink" title="The Patches"></a>The Patches</h2><p>I began my work by implementing the infrastructure. However, during the review process, the design underwent significant changes. My main focus was on the following tasks:</p><ol><li>Refactoring the fsck error messages to make them generic, allowing both the object database and the ref database to use the same fsck error message interfaces to avoid repetition.</li><li>Utilizing the existing polymorphism provided by the <code>ref_storage_be</code> structure. For every backend, it needs to provide its own function pointer which would bring a lot of flexibility.</li><li>Designing extensible interfaces for checking ref consistency in the files backend.</li><li>Adding a ref name consistency check for the files backend.</li></ol><p>The ultimate merged patch links are given below:</p><ul><li><a href="https://lore.kernel.org/git/ZrSq3Z8tYrGwBOqC@ArchLinux/">[GSoC][PATCH v16 1&#x2F;9] fsck: rename “skiplist” to “skip_oids”</a>.</li><li><a href="https://lore.kernel.org/git/ZrSq6XV8hKRZMrnt@ArchLinux/">[GSoC][PATCH v16 2&#x2F;9] fsck: rename objects-related fsck error functions</a></li><li><a href="https://lore.kernel.org/git/ZrSrdwOCWrXpMYIA@ArchLinux/">[GSoC][PATCH v16 3&#x2F;9] fsck: make “fsck_error” callback generic</a></li><li><a href="https://lore.kernel.org/git/ZrSrgRGwI_jldprn@ArchLinux/">[GSoC][PATCH v16 4&#x2F;9] fsck: add a unified interface for reporting fsck messages</a></li><li><a href="https://lore.kernel.org/git/ZrSrjO2ltoJuppKA@ArchLinux/">[GSoC][PATCH v16 5&#x2F;9] fsck: add refs report function</a></li><li><a href="https://lore.kernel.org/git/ZrSrlU8TesYsTb2C@ArchLinux/">[GSoC][PATCH v16 6&#x2F;9] refs: set up ref consistency check infrastructure</a></li><li><a href="https://lore.kernel.org/git/ZrSroE8vLlZCK2jp@ArchLinux/">[GSoC][PATCH v16 7&#x2F;9] builtin&#x2F;refs: add verify subcommand</a></li><li><a href="https://lore.kernel.org/git/ZrSsk27zqOqSXTpH@ArchLinux/">[GSoC][PATCH v16 8&#x2F;9] files-backend: add unified interface for refs scanning</a></li><li><a href="https://lore.kernel.org/git/ZrSsngBqfyTPDg7g@ArchLinux/">[GSoC][PATCH v16 9&#x2F;9] fsck: add ref name check for files backend</a></li></ul><p>This series has finally been merged into the <a href="https://github.com/git/git/commit/b3d175409d9bfe005515ffe361e959fb9965111c">master</a> branch.</p><p>After establishing the infrastructure, I continue to implement additional checks for the files backend, as shown in the following patch links:</p><ul><li><a href="https://lore.kernel.org/git/ZsIM0L72bei9Fudt@ArchLinux/">[PATCH v1 1&#x2F;4] fsck: introduce “FSCK_REF_REPORT_DEFAULT” macro</a></li><li><a href="https://lore.kernel.org/git/ZsIM2DRDbJsvNjAM@ArchLinux/">[PATCH v1 2&#x2F;4] ref: add regular ref content check for files backend</a></li><li><a href="https://lore.kernel.org/git/ZsIM4OZWfylcP5Ix@ArchLinux/">[PATCH v1 3&#x2F;4] ref: add symbolic ref content check for files backend</a></li><li><a href="https://lore.kernel.org/git/ZsIM6JZ7miA3j09j@ArchLinux/">[PATCH v1 4&#x2F;4] ref: add symlink ref consistency check for files backend</a></li></ul><p>However, this series is still under review, and I plan to continue following up after GSoC.</p><h2 id="Challenges"><a href="#Challenges" class="headerlink" title="Challenges"></a>Challenges</h2><h3 id="Design-Challenge"><a href="#Design-Challenge" class="headerlink" title="Design Challenge"></a>Design Challenge</h3><p>Implementation is much more complex than refactoring. One of my intuitive feelings is that when designing something myself, I need to consider many factors. However, during the implementation process, I made many mistakes, mainly in two areas:</p><ol><li>Over-engineering: I was always concerned about the extensibility of the implementation, worried that poor design would require future refactoring. However, I didn’t realize that this could introduce noise into the code. We should focus solely on the features we need right now.</li><li>Inability to balance between building something that can be easily extended in the future and something that is specific to the task at hand.</li></ol><p>Here are the challenges I encountered during the implementation process:</p><h4 id="Whether-We-Need-To-Refactor-“fsck-options”"><a href="#Whether-We-Need-To-Refactor-“fsck-options”" class="headerlink" title="Whether We Need To Refactor “fsck_options”"></a>Whether We Need To Refactor “fsck_options”</h4><p>There are many fields in fsck_options that are specific to the object database. My first mistake was trying to make <code>fsck_options</code> contain the general options and sub-structures, which is what I attempted in the previous patch.</p><blockquote><p>The git-fsck(1) focuses on object database consistency check. It relies on the “fsck_options” to interact with fsck error levels. However “fsck_options” aims at checking the object database which contains a lot of fields only related to object database.</p><p>In order to add ref operations, create a new struct named “fsck_refs_options” and a new struct named “fsck_objs_options”. Remove object-related fields from “fsck_options” to “fsck_objs_options”. Change the “fsck_options” with three parts of members:</p><ol><li>The “fsck_refs_options”.</li><li>The “fsck_objs_options”.</li><li>The common settings both for refs and objects. Because we leave common settings in “fsck_options”. The setup process could be fully reused without any code changing.</li></ol></blockquote><p>While this approach may seem natural, it introduced a lot of complexity because there is a significant amount of existing code that accepts <code>struct fsck_options *</code> as a parameter. As a result, we had to deal with a lot of code that was not directly related to our main goal. In the final implementation, I simply added a <code>verbose</code> field to the <code>fsck_options</code>.</p><p>Junio gave me a wonderful suggestion:</p><blockquote><p>Just like premature optimization is bad, premature factoring and over-modularization is bad.</p></blockquote><h4 id="How-to-Reuse-“report”-Function"><a href="#How-to-Reuse-“report”-Function" class="headerlink" title="How to Reuse “report” Function"></a>How to Reuse “report” Function</h4><p>To adapt to the existing fsck error levels, my initial approach was to create a new <code>fsck_report_ref</code> function that was separate from the object report function <code>report</code>. However, Patrick, Karthik, and Junio disagreed with this design, suggesting that I should reuse the <code>report</code> function.</p><p>The <code>report</code> function is closely tied to object reporting. At the time, I considered adding parameters to the <code>report</code> function and its corresponding callback function <code>error_func</code> to make their prototypes consistent. However, I was not satisfied with this solution because we couldn’t predict whether additional parameters would be needed for other ref checks in the future, which would result in poor extensibility.</p><p>But Patrick gave me a wonderful suggestion which eventually solved the problem:</p><blockquote><p>A better design would likely be to make <code>error_func()</code> receive a <code>void*</code> pointer such that <code>error_func()</code> and then have the respective subsystems provide a function that knows to format the message while receiving either a <code>struct fsck_object_report *</code> or a <code>struct fsck_ref_report *</code>.</p></blockquote><h3 id="Long-Review-Duration"><a href="#Long-Review-Duration" class="headerlink" title="Long Review Duration"></a>Long Review Duration</h3><p>Building the ref consistency check infrastructure posed challenges not only in terms of design and coding but also due to the lengthy review process. This created a significant mental burden for me during the middle of GSoC. This is what I have recorded in my <a href="https://luolibrary.com/2024/07/16/GSoC-Week-7/">GSoC Week 7</a> blog:</p><blockquote><p>The recent challenges I’ve encountered mainly stem from two aspects. Over the past two weeks, I’ve felt mentally exhausted because I haven’t received much positive feedback. Since May 30th, my first patch is still under review. Sometimes, I can’t help but feel the pressure from my peers. Seeing other GSoC participants successfully merge several patches does indeed make me feel pressured. Therefore, I realize that I must learn how to adjust my mindset during prolonged review periods.</p></blockquote><h2 id="After-GSoC"><a href="#After-GSoC" class="headerlink" title="After GSoC"></a>After GSoC</h2><p>After GSoC, I decided to remain involved with the Git community to continue the work I need to complete. My tentative roadmap is as follows:</p><ol><li>Implement the pack-refs consistency check for the files backend.</li><li>Implement the reflogs consistency check for the files backend.</li><li>Implement the consistency check for the reftable backend.</li><li>Separate the object database check logic from <code>git-fsck(1)</code>.</li><li>Enhance the <code>git-fsck(1)</code> command to allow users to easily disable subprocess checks, providing greater flexibility.</li></ol><p>There is a lot to accomplish, which is exciting!</p><h2 id="Closing-Remarks"><a href="#Closing-Remarks" class="headerlink" title="Closing Remarks"></a>Closing Remarks</h2><p>During my GSoC journey, besides improving my coding skills, I believe the greatest gain was strengthening connections between people. I established a good relationship with my two mentors, Patrick and Karthik. Initially, I rarely conversed in English with others, and during my first video meeting with Patrick, I was quite nervous, worried about my limited English speaking skills.</p><p>Additionally, I feel that I have built a good relationship with the Git community. Through an open-source project, I experienced the charm of open source, as it connects people who might not have otherwise crossed paths in life.</p><p>I am especially grateful to my two mentors from GitLab, <a href="https://gitlab.com/pks-gitlab">Patrick</a> and <a href="https://www.linkedin.com/in/karthik%2Dnayak/">Karthik</a>. They provided me with a lot of guidance, embodying the role of a teacher who imparts knowledge and resolves doubts. I also want to thank <a href="https://github.com/gitster/">Junio</a>, Eric, and <a href="https://www.linkedin.com/in/justintobler/">Justin</a> for their meticulous and detailed work during the code review process, which made the final implementation exceptionally elegant.</p><p>I also feel quite proud of myself for being able to implement a new feature for foundational software used by so many people, something I once thought could only happen in my dreams. I am very grateful for this experience and hope that I can become a mentor in the future, igniting the flame in others’ hearts.</p>]]>
    </content>
    <id>https://luolibrary.com/2024/08/25/GSoC-Final-Report/</id>
    <link href="https://luolibrary.com/2024/08/25/GSoC-Final-Report/"/>
    <published>2024-08-25T14:32:06.000Z</published>
    <summary>
      <![CDATA[<p>Suddenly, I recalled myself writing the proposal back then, and I couldn’t help but feel a bit wistful. Every time it ends, there’s]]>
    </summary>
    <title>GSoC Final Report</title>
    <updated>2024-08-25T14:37:08.320Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="GSoC 2024" scheme="https://luolibrary.com/categories/GSoC-2024/"/>
    <category term="GSoC" scheme="https://luolibrary.com/tags/GSoC/"/>
    <content>
      <![CDATA[<h2 id="What-I-Have-Done"><a href="#What-I-Have-Done" class="headerlink" title="What I Have Done"></a>What I Have Done</h2><p>In these two weeks, I continue to solve the reviews. After I have sent the <a href="https://lore.kernel.org/git/ZqeXrPROpEg_pRS2@ArchLinux/">Patch v13</a>. Patrick gives an opinion here, we want to reuse the <code>fsck_vreport</code> function here. We want to make it generic but we design the callback not generic. And Patrick gives a wonderful idea here:</p><blockquote><p>A better design would likely be to make <code>error_func()</code> receive a <code>void*</code> pointer such that <code>error_func()</code> and then have the respective subsystems provide a function that knows to format the message while receiving either a <code>struct fsck_object_report *</code> or a <code>struct fsck_ref_report *</code>.</p></blockquote><p>However, Patrick thinks we may put unnecessary effort here to make things complicated again. But after discussion, I think we should use the below design for the following reasons:</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="title function_">int</span> <span class="params">(*fsck_error)</span><span class="params">(<span class="keyword">struct</span> fsck_options *o,</span></span><br><span class="line"><span class="params">                          <span class="type">void</span> *info,</span></span><br><span class="line"><span class="params">                          <span class="keyword">enum</span> fsck_msg_type msg_type, <span class="keyword">enum</span> fsck_msg_id msg_id,</span></span><br><span class="line"><span class="params">                          <span class="type">const</span> <span class="type">char</span> *message)</span>;</span><br></pre></td></tr></table></figure><ol><li>We only expose one interface called <code>fsck_reportf</code> which will make the code clear. Actually, there is no different between reporting refs and reporting objects.</li><li>We provide more extensibility here, because we will never change <code>fsck_reportf</code> and <code>fsck_error</code> prototype when we want to add more info for either refs or objects.</li></ol><p>And Patrick advices me that I should drop the last patch “[PATCH v13 10&#x2F;10] fsck: add ref content check for files backend”, because we should speed up the review process due to the ddl of GSoC.</p><p>And Junio gives two advices:</p><ol><li>The prototype of <code>files_fsck_refs_fn</code> should adapt to the Patrick’s new change.</li><li>Unless the most common use of an array is to pass it around as a collection of items and operate on the collection, it is a better practice to name an array with a singular noun.  Name the array as <code>fsck_refs_fn[]</code> not <code>fsck_refs_fns[]</code>.</li></ol><p>I solve these problems in <a href="https://lore.kernel.org/git/ZqulmWVBaeyP4blf@ArchLinux/">Patch v14</a>:</p><ol><li>By following the advice from Patrick, we should make the callback function be generic by adding only one <code>void *fsck_report</code> parameter. Thus the commit sequence will be much more clearer. And it wll be much easier for reviewers to review. And I have split the commit into more commits in this version.</li><li>Enhance the commit messages to provide more context about why we should do this.</li><li>Patrick advices that we should initialize the <code>fsck_options</code> member when parsing the options. However, because the original <code>strict</code> and <code>verbose</code> field are defined as the bit field, we cannot take the address of them. So I simply remove the bit field.</li><li>As Patrick said, “.lock” should not be reported as error. At current, ignore files ending with “.lock”.</li><li>Add a fsck msg type called “badRefFiletype” which indicates that a ref has a bad file type when scanning the directory.</li><li>Junio advices instead of using <code>fsck_refs_fns</code>, we should use the singular version <code>fsck_refs_fn</code>, fix this.</li><li>Drop the last patch because in this series, we mainly focus on the infra, I will add a series later to add ref content check.</li></ol><p>And I only do some minor changes in <a href="https://lore.kernel.org/git/ZrEBKjzbyxtMdCCx@ArchLinux/">Patch v15</a> and <a href="https://lore.kernel.org/git/ZrSqMmD-quQ18a9F@ArchLinux.localdomain/">Patch v16</a>.</p><p>The code is merged into <a href="https://github.com/git/git/commit/3bde10da94b1424849233d19eeeab475c7a57152">next</a>. What a long journey.</p><h2 id="Next-Plan"><a href="#Next-Plan" class="headerlink" title="Next Plan"></a>Next Plan</h2><p>My GSoC is going to end. But my contribution to Git will bot end. I will implement ref content check. And I will concentrate on writing the final report.</p>]]>
    </content>
    <id>https://luolibrary.com/2024/08/13/GSoC-Week-10-11/</id>
    <link href="https://luolibrary.com/2024/08/13/GSoC-Week-10-11/"/>
    <published>2024-08-13T13:41:26.000Z</published>
    <summary>
      <![CDATA[<h2 id="What-I-Have-Done"><a href="#What-I-Have-Done" class="headerlink" title="What I Have Done"></a>What I Have Done</h2><p>In these two]]>
    </summary>
    <title>GSoC Week 10-11</title>
    <updated>2024-08-13T13:41:42.024Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="MIT6.824" scheme="https://luolibrary.com/categories/MIT6-824/"/>
    <category term="技术" scheme="https://luolibrary.com/tags/%E6%8A%80%E6%9C%AF/"/>
    <category term="学习" scheme="https://luolibrary.com/tags/%E5%AD%A6%E4%B9%A0/"/>
    <content>
      <![CDATA[<p>This is my record for finish MIT 6.824(spring 2022) first lab <a href="http://nil.csail.mit.edu/6.824/2022/labs/lab-mr.html">MapReduce</a>.</p><h2 id="Sequence-Version"><a href="#Sequence-Version" class="headerlink" title="Sequence Version"></a>Sequence Version</h2><p>Before we dive into how to solve this problem, we first need to understand the sequence version. First, we look at how <code>Map</code> operates.</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">intermediate := []mr.KeyValue&#123;&#125;</span><br><span class="line"><span class="keyword">for</span> _ filename := <span class="keyword">range</span> os Args[<span class="number">2</span>:] &#123;</span><br><span class="line">  file, err := os.Open(filename)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    log.Fatalf(<span class="string">&quot;cannot open %v&quot;</span>, filename)</span><br><span class="line">  &#125;</span><br><span class="line">  content, err := io.ReadAll(file)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    log.Fatalf(<span class="string">&quot;cannot read %v&quot;</span>, filename)</span><br><span class="line">  &#125;</span><br><span class="line">  file.Close()</span><br><span class="line">  kva := mapf(filename, <span class="type">string</span>(content))</span><br><span class="line">  intermediate = <span class="built_in">append</span>(intermediate, kva...)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>The idea for above code is simple. It just calls the user-provided <code>Map</code> function to generate the key-value pair struct <code>mr.KeyValue</code> and put the results into <code>intermediate</code>.</p><p>Next we need to partitioning the <code>intermediate</code> to make it into groups. Actually, we can just sort the results. This is also what the code does.</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sort.Sort(ByKey(intermediate))</span><br></pre></td></tr></table></figure><p>Now next we need to call user-provided <code>Reduce</code> function. This is also easy. We have already sorted the <code>intermediate</code>. Now we just handle the groups one by one.</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">i := <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> i &lt; <span class="built_in">len</span>(intermediate) &#123;</span><br><span class="line">  j := i + <span class="number">1</span></span><br><span class="line">  <span class="keyword">for</span> j &lt; <span class="built_in">len</span>(intermediate) &amp;&amp; intermediate[j].key == intermediate[i].key &#123;</span><br><span class="line">    j++</span><br><span class="line">  &#125;</span><br><span class="line">  values := []<span class="type">string</span>&#123;&#125;</span><br><span class="line">  <span class="keyword">for</span> k := i; k &lt; j; k++ &#123;</span><br><span class="line">    values = <span class="built_in">append</span>(values, intermediate[k].Value)</span><br><span class="line">  &#125;</span><br><span class="line">  output := reducef(intermediate[i].Key, values)</span><br><span class="line">  fmt.Fprintf(ofile, <span class="string">&quot;%v %v\n&quot;</span>, intermediate[i].Key, output)</span><br><span class="line">  i = j</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Need-Analysis"><a href="#Need-Analysis" class="headerlink" title="Need Analysis"></a>Need Analysis</h2><h3 id="Coordinator"><a href="#Coordinator" class="headerlink" title="Coordinator"></a>Coordinator</h3><p>For MapReduce, there should be a coordinator which allocates the tasks. And the coordinator should use data structure to hold the status. The coordinator could not record the result file of the <code>Map</code> operation, because we have used some rules to make a pattern match.</p><h3 id="Worker"><a href="#Worker" class="headerlink" title="Worker"></a>Worker</h3><p>However, for a worker, things would be complicated. In the code, worker could do both <code>Map</code> and <code>Reduce</code>. I don’t think it is a good idea to make them exclusively. So for a worker, it should start two goroutines, one for <code>Map</code> and another for <code>Reduce</code>.</p><p>For <code>Map</code> operation, we should achieve the following functionality:</p><ul><li>Divide the intermediate keys into buckets for <code>nReduce</code> reduce tasks where <code>nReduce</code> is the number of reduce tasks.</li><li>The intermediate files name should be <code>mr-X-Y</code>, where <code>X</code> is the Map task number, and <code>Y</code> is the reduce task number.</li><li>Use <code>encoding/json</code> package to write the key&#x2F;value pairs in JSON format to intermediate files.</li></ul><p>For <code>Reduce</code> operation, we should achieve the following functionality:</p><ul><li>Use <code>encoding/json</code> package to read the key&#x2F;value paris in JSON format from intermediate files.</li><li>Put the output of the Xth reduce task in the file <code>mr-out-X</code>.</li></ul><h2 id="Data-Structure-Design"><a href="#Data-Structure-Design" class="headerlink" title="Data Structure Design"></a>Data Structure Design</h2><p>There are the following things we need to consider:</p><ul><li><p>We need to use the semantic words to represent the states both for the coordinator and workers. However, golang doesn’t provide <code>enum</code> type like C&#x2F;C++. So I decide to use <code>const</code> to emulate the <code>enum</code> type like the following:</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> WorkingStatus <span class="type">int32</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> (</span><br><span class="line">  idle       WorkingStatus = <span class="number">0</span></span><br><span class="line">  processing WorkingStatus = <span class="number">1</span></span><br><span class="line">  failed     WorkingStatus = <span class="number">2</span></span><br><span class="line">  terminated WorkingStatus = <span class="number">3</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure></li><li><p>We need to store the tasks we need to handle in the coordinator and also we need to allocate this task for worker. So we need a way to represent the <code>Map</code> and <code>Reduce</code> task.</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> MapTask <span class="keyword">struct</span> &#123;</span><br><span class="line">  ID       <span class="type">int</span>    <span class="comment">// the current map task id</span></span><br><span class="line">  Filename <span class="type">string</span> <span class="comment">// the file which the map task is processing</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> ReduceTask <span class="keyword">struct</span> &#123;</span><br><span class="line">  ID           <span class="type">int</span> <span class="comment">// the current reduce task id</span></span><br><span class="line">  MapTaskTotal <span class="type">int</span> <span class="comment">// the current total map task num for the reduce task</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>We need to store the worker information, because the worker may crash. If we do not store this state, we cannot do any crash recovery. Because a worker will handle <code>Map</code>and <code>Reduce</code> task, so we need to also create states to hold task status. I create a <code>WorkerState</code> to combine the <code>MapWorker</code> and <code>ReduceWorker</code>.</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> MapWorker <span class="keyword">struct</span> &#123;</span><br><span class="line">status    WorkingStatus <span class="comment">// status</span></span><br><span class="line">task      MapTask       <span class="comment">// current task</span></span><br><span class="line">startTime time.Time     <span class="comment">// map task start time</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> ReduceWorker <span class="keyword">struct</span> &#123;</span><br><span class="line">  status    WorkingStatus <span class="comment">// status</span></span><br><span class="line">  task      ReduceTask    <span class="comment">// current task</span></span><br><span class="line">  startTime time.Time     <span class="comment">// reduce task start time</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> WorkerState <span class="keyword">struct</span> &#123;</span><br><span class="line">  id           <span class="type">int</span>          <span class="comment">// Worker identifier</span></span><br><span class="line">  mapWorker    MapWorker    <span class="comment">// the map worker</span></span><br><span class="line">  reduceWorker ReduceWorker <span class="comment">// the reduce worker</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p>And we could the following data structure for coordinator:</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> Coordinator <span class="keyword">struct</span> &#123;</span><br><span class="line">  worker                []WorkerState <span class="comment">// To store the status of the workers</span></span><br><span class="line">  mapTask               []MapTask     <span class="comment">// The map tasks to be done</span></span><br><span class="line">  reduceTask            []ReduceTask  <span class="comment">// The reduce tasks to be done</span></span><br><span class="line">  mapTaskNum            <span class="type">int</span>           <span class="comment">// The total number of map task</span></span><br><span class="line">  reduceTaskNum         <span class="type">int</span>           <span class="comment">// The total number of reduce task</span></span><br><span class="line">  mapTaskFinishedNum    <span class="type">int</span>           <span class="comment">// The number of mapTask finished</span></span><br><span class="line">  reduceTaskFinishedNum <span class="type">int</span>           <span class="comment">// The number of reduceTask finished</span></span><br><span class="line">  allMapFinished        <span class="type">bool</span>          <span class="comment">// To indicate whether all Map operations are finished</span></span><br><span class="line">  allReduceFinished     <span class="type">bool</span>          <span class="comment">// To indicate whether all Reduce operations are finished</span></span><br><span class="line">  status                WorkingStatus <span class="comment">// The status of the coordinator</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="RPC-Operations"><a href="#RPC-Operations" class="headerlink" title="RPC Operations"></a>RPC Operations</h2><p>Next, we need to handle the rpc operations where we need to consider the synchronization between workers and coordinator.</p><h3 id="Register"><a href="#Register" class="headerlink" title="Register"></a>Register</h3><p>When a worker is initialized, it should call <code>Register</code> RPC. The coordinator should lock the mutex and update the <code>worker</code> field and return the id and the reduce bucket to the worker like the following:</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> RegisterRequest <span class="keyword">struct</span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> RegisterResponse <span class="keyword">struct</span> &#123;</span><br><span class="line">  ID      <span class="type">int</span> <span class="comment">// the worker identifier</span></span><br><span class="line">  NReduce <span class="type">int</span> <span class="comment">// the reduce bucket</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(c *Coordinator)</span></span> Register(request *RegisterRequest, response *RegisterResponse) <span class="type">error</span> &#123;</span><br><span class="line">  mutex.Lock()</span><br><span class="line">  <span class="keyword">defer</span> mutex.Unlock()</span><br><span class="line"></span><br><span class="line">  newId := <span class="built_in">len</span>(c.worker)</span><br><span class="line"></span><br><span class="line">  newWorker := WorkerState&#123;</span><br><span class="line">    id: newId,</span><br><span class="line">    mapWorker: MapWorker&#123;</span><br><span class="line">      status: idle,</span><br><span class="line">    &#125;,</span><br><span class="line">    reduceWorker: ReduceWorker&#123;</span><br><span class="line">      status: idle,</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;</span><br><span class="line">  c.worker = <span class="built_in">append</span>(c.worker, newWorker)</span><br><span class="line"></span><br><span class="line">  response.ID = newId</span><br><span class="line">  response.NReduce = c.reduceTaskNum</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="Request-Map-Task"><a href="#Request-Map-Task" class="headerlink" title="Request Map Task"></a>Request Map Task</h3><p>When the workers want to request map task, it should call <code>MapRequest</code> RPC. However, when there is no task available allocated to the worker, we should block the process in RPC call. You could see the following code to understand the detail.</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> MapTaskRequest <span class="keyword">struct</span> &#123;</span><br><span class="line">  ID <span class="type">int</span> <span class="comment">// the worker identifier</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> MapTaskResponse <span class="keyword">struct</span> &#123;</span><br><span class="line">  Task     MapTask</span><br><span class="line">  Shutdown <span class="type">bool</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(c *Coordinator)</span></span> MapRequest(</span><br><span class="line">  request *MapTaskRequest,</span><br><span class="line">  response *MapTaskResponse) <span class="type">error</span> &#123;</span><br><span class="line"></span><br><span class="line">  condMap.L.Lock()</span><br><span class="line">  <span class="keyword">defer</span> condMap.L.Unlock()</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Here, we use `len(c.filenames)` to indicate whether there is</span></span><br><span class="line">  <span class="comment">// an available task for `Map` operation.</span></span><br><span class="line">  <span class="keyword">for</span> <span class="built_in">len</span>(c.mapTask) == <span class="number">0</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// If all of the `Map` operation is finished, we should</span></span><br><span class="line">    <span class="comment">// set the `Shutdown` field to `true` and return.</span></span><br><span class="line">    <span class="keyword">if</span> c.allMapFinished &#123;</span><br><span class="line">      response.Shutdown = <span class="literal">true</span></span><br><span class="line">      <span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    condMap.Wait()</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// We should return map task back to the `Map`</span></span><br><span class="line">  response.Task = c.mapTask[<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Here, we should store the information of the worker</span></span><br><span class="line">  c.worker[request.ID].mapWorker.task = c.mapTask[<span class="number">0</span>]</span><br><span class="line">  c.worker[request.ID].mapWorker.status = processing</span><br><span class="line">  c.worker[request.ID].mapWorker.startTime = time.Now()</span><br><span class="line"></span><br><span class="line">  c.mapTask = c.mapTask[<span class="number">1</span>:]</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="Finish-Map-Task"><a href="#Finish-Map-Task" class="headerlink" title="Finish Map Task"></a>Finish Map Task</h3><p>When the workers finish the <code>Map</code> operation, it should call <code>MapFinish</code> to indicate the coordinator that “I have finished this task”. However, there are so many details we need to consider:</p><ol><li>There are some tasks running too much time which we will consider they are failed. If later the coordinator receives the <code>MapFinish</code> request, we should simply indicate the workers that they should be shutdown.</li><li>Because the workers may crash, we should never write the real name here. Instead workers should create temp file name. The coordinator should rename this in the RPC call. So we need to add a new field <code>Info</code> representing the mapping between the temp file name and the original file name.</li></ol><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> MapTaskRequest <span class="keyword">struct</span> &#123;</span><br><span class="line">  ...</span><br><span class="line">  Info <span class="keyword">map</span>[<span class="type">string</span>]<span class="type">string</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(c *Coordinator)</span></span> MapFinish(</span><br><span class="line">  request *MapTaskRequest,</span><br><span class="line">  response *MapTaskResponse) <span class="type">error</span> &#123;</span><br><span class="line"></span><br><span class="line">  mutex.Lock()</span><br><span class="line">  <span class="keyword">defer</span> mutex.Unlock()</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> c.worker[request.ID].mapWorker.status == failed ||</span><br><span class="line">    c.allMapFinished &#123;</span><br><span class="line">    response.Shutdown = <span class="literal">true</span></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> c.worker[request.ID].mapWorker.status == processing &amp;&amp; !c.allMapFinished &#123;</span><br><span class="line"></span><br><span class="line">    c.mapTaskFinishedNum++</span><br><span class="line"></span><br><span class="line">    c.worker[request.ID].mapWorker.status = idle</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> temp, original := <span class="keyword">range</span> request.Info &#123;</span><br><span class="line">      os.Rename(temp, original)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// When all the `Map` operation is finished we should broadcast for</span></span><br><span class="line">    <span class="comment">// `Reduce` operation. Pay attention that `len(c.filenames) == 0`</span></span><br><span class="line">    <span class="keyword">if</span> c.mapTaskFinishedNum == c.mapTaskNum &#123;</span><br><span class="line">      c.allMapFinished = <span class="literal">true</span></span><br><span class="line">      condReduce.Broadcast()</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>The <code>ReduceRequest</code> and <code>ReduceFinish</code> functions are like <code>MapRequest</code> and <code>MapFinish</code>. I omit the detail here.</p><h2 id="Coordinator-Operations"><a href="#Coordinator-Operations" class="headerlink" title="Coordinator Operations"></a>Coordinator Operations</h2><p>There are two operations we need to consider for coordinator, one is that coordinator needs to check the liveness of the each worker for executing crash recovery. I define a goroutine <code>checkLiveness</code> here.</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(c *Coordinator)</span></span> checkLiveness() &#123;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> &#123;</span><br><span class="line"></span><br><span class="line">    done := c.Done()</span><br><span class="line">    <span class="keyword">if</span> done &#123;</span><br><span class="line">      <span class="keyword">break</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    mutex.Lock()</span><br><span class="line"></span><br><span class="line">    mapRestartTime := <span class="number">0</span></span><br><span class="line">    reduceRestartTime := <span class="number">0</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> i := <span class="keyword">range</span> c.worker &#123;</span><br><span class="line"></span><br><span class="line">      <span class="keyword">if</span> c.worker[i].mapWorker.status == processing &amp;&amp; time.Since(c.worker[i].mapWorker.startTime).Seconds() &gt; <span class="number">10</span> &#123;</span><br><span class="line">        mapRestartTime++</span><br><span class="line">        c.mapTask = <span class="built_in">append</span>(c.mapTask, MapTask&#123;</span><br><span class="line">          ID:       c.worker[i].mapWorker.task.ID,</span><br><span class="line">          Filename: c.worker[i].mapWorker.task.Filename,</span><br><span class="line">        &#125;)</span><br><span class="line">        c.worker[i].mapWorker.status = failed</span><br><span class="line">      &#125;</span><br><span class="line"></span><br><span class="line">      <span class="keyword">if</span> c.worker[i].reduceWorker.status == processing &amp;&amp; time.Since(c.worker[i].reduceWorker.startTime).Seconds() &gt; <span class="number">10</span> &#123;</span><br><span class="line">        reduceRestartTime++</span><br><span class="line">        c.reduceTask = <span class="built_in">append</span>(c.reduceTask, ReduceTask&#123;</span><br><span class="line">          MapTaskTotal: c.worker[i].reduceWorker.task.MapTaskTotal,</span><br><span class="line">          ID:           c.worker[i].reduceWorker.task.ID,</span><br><span class="line">        &#125;)</span><br><span class="line">        c.worker[i].reduceWorker.status = failed</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> i := <span class="number">0</span>; i &lt; mapRestartTime; i++ &#123;</span><br><span class="line">      condMap.Signal()</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> i := <span class="number">0</span>; i &lt; reduceRestartTime; i++ &#123;</span><br><span class="line">      condReduce.Signal()</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    mutex.Unlock()</span><br><span class="line"></span><br><span class="line">    time.Sleep(<span class="number">5</span> * time.Second)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Worker-Operations"><a href="#Worker-Operations" class="headerlink" title="Worker Operations"></a>Worker Operations</h2><p>The entrypoint is the <code>Worker</code> function, we will start two goroutine in this function, one is used for handling <code>mapProcess</code> and the other is used for handling <code>reduceProcess</code>.</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">Worker</span><span class="params">(mapf <span class="keyword">func</span>(<span class="type">string</span>, <span class="type">string</span>)</span></span> []KeyValue,</span><br><span class="line">  reducef <span class="function"><span class="keyword">func</span><span class="params">(<span class="type">string</span>, []<span class="type">string</span>)</span></span> <span class="type">string</span>) &#123;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// When there is a new worker, we should call RPC</span></span><br><span class="line">  <span class="comment">// `RegisterRPC`.</span></span><br><span class="line">  response := RegisterResponse&#123;&#125;</span><br><span class="line">  request := RegisterRequest&#123;&#125;</span><br><span class="line">  mutex = sync.Mutex&#123;&#125;</span><br><span class="line">  <span class="keyword">if</span> !RegisterRPC(&amp;request, &amp;response) &#123;</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line">  &#125;</span><br><span class="line">  wg.Add(<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">go</span> mapProcess(mapf, response.ID, response.NReduce)</span><br><span class="line">  <span class="keyword">go</span> reduceProcess(reducef, response.ID, response.NReduce)</span><br><span class="line"></span><br><span class="line">  wg.Wait()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>mapProcess</code> goroutine will handle the following things:</p><ol><li>Firstly uses <code>MapRequestRPC</code> to request one job from coordinator, and the most two important things got from coordinator is the <code>MapTask</code> structure.</li><li>We need to maintain the mapping between the temp file name and the original filename.</li></ol><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">mapProcess</span><span class="params">(mapf <span class="keyword">func</span>(<span class="type">string</span>, <span class="type">string</span>)</span></span> []KeyValue, id <span class="type">int</span>, nReduce <span class="type">int</span>) &#123;</span><br><span class="line">  <span class="keyword">defer</span> wg.Done()</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> &#123;</span><br><span class="line"></span><br><span class="line">    request := MapTaskRequest&#123;ID: id&#125;</span><br><span class="line">    response := MapTaskResponse&#123;&#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> !MapRequestRPC(&amp;request, &amp;response) &#123;</span><br><span class="line">      <span class="keyword">return</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// If the coordinator is terminated, we should terminate</span></span><br><span class="line">    <span class="comment">// the `mapProcess`</span></span><br><span class="line">    <span class="keyword">if</span> response.Shutdown &#123;</span><br><span class="line">      <span class="keyword">return</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    tempToOriginal := <span class="built_in">make</span>(<span class="keyword">map</span>[<span class="type">string</span>]<span class="type">string</span>)</span><br><span class="line"></span><br><span class="line">    intermediate := []KeyValue&#123;&#125;</span><br><span class="line">    filename := response.Task.Filename</span><br><span class="line">    file, _ := os.Open(filename)</span><br><span class="line">    content, _ := io.ReadAll(file)</span><br><span class="line">    file.Close()</span><br><span class="line">    kva := mapf(filename, <span class="type">string</span>(content))</span><br><span class="line">    intermediate = <span class="built_in">append</span>(intermediate, kva...)</span><br><span class="line"></span><br><span class="line">    outputNamePrefix := fmt.Sprintf(<span class="string">&quot;mr-%d-&quot;</span>, response.Task.ID)</span><br><span class="line"></span><br><span class="line">    outputFile := []*os.File&#123;&#125;</span><br><span class="line">    enc := []*json.Encoder&#123;&#125;</span><br><span class="line">    <span class="keyword">for</span> i := <span class="number">1</span>; i &lt;= nReduce; i++ &#123;</span><br><span class="line">      outputName := fmt.Sprintf(<span class="string">&quot;%s%d&quot;</span>, outputNamePrefix, i)</span><br><span class="line">      tempFile, _ := os.CreateTemp(<span class="string">&quot;.&quot;</span>, <span class="string">&quot;tempfile-&quot;</span>)</span><br><span class="line">      tempToOriginal[tempFile.Name()] = outputName</span><br><span class="line"></span><br><span class="line">      encTemp := json.NewEncoder(tempFile)</span><br><span class="line">      outputFile = <span class="built_in">append</span>(outputFile, tempFile)</span><br><span class="line">      enc = <span class="built_in">append</span>(enc, encTemp)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> _, kv := <span class="keyword">range</span> intermediate &#123;</span><br><span class="line">      reduceNum := ihash(kv.Key) % nReduce</span><br><span class="line">      enc[reduceNum].Encode(kv)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> _, file := <span class="keyword">range</span> outputFile &#123;</span><br><span class="line">      file.Close()</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    request.Info = tempToOriginal</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> !MapFinishRPC(&amp;request, &amp;response) &#123;</span><br><span class="line">      <span class="keyword">return</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> k := <span class="keyword">range</span> tempToOriginal &#123;</span><br><span class="line">      <span class="built_in">delete</span>(tempToOriginal, k)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>reduceProcess</code> is just the same as <code>mapProcess</code>. Actually, from my perspective, there is nothing different.</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">reduceProcess</span><span class="params">(reducef <span class="keyword">func</span>(<span class="type">string</span>, []<span class="type">string</span>)</span></span> <span class="type">string</span>, id <span class="type">int</span>, nReduce <span class="type">int</span>) &#123;</span><br><span class="line">  <span class="keyword">defer</span> wg.Done()</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> &#123;</span><br><span class="line"></span><br><span class="line">    request := ReduceTaskRequest&#123;ID: id&#125;</span><br><span class="line">    response := ReduceTaskResponse&#123;&#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> !ReduceRequestRPC(&amp;request, &amp;response) &#123;</span><br><span class="line">      <span class="keyword">return</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> response.Shutdown &#123;</span><br><span class="line">      <span class="keyword">return</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    intermediate := []KeyValue&#123;&#125;</span><br><span class="line">    <span class="keyword">for</span> i := <span class="number">1</span>; i &lt;= response.Task.MapTaskTotal; i++ &#123;</span><br><span class="line">      inputName := fmt.Sprintf(<span class="string">&quot;mr-%d-%d&quot;</span>, i, response.Task.ID)</span><br><span class="line">      file, _ := os.Open(inputName)</span><br><span class="line">      dec := json.NewDecoder(file)</span><br><span class="line">      <span class="keyword">for</span> &#123;</span><br><span class="line">        <span class="keyword">var</span> temp KeyValue</span><br><span class="line">        <span class="keyword">if</span> err := dec.Decode(&amp;temp); err != <span class="literal">nil</span> &#123;</span><br><span class="line">          <span class="keyword">break</span></span><br><span class="line">        &#125;</span><br><span class="line">        intermediate = <span class="built_in">append</span>(intermediate, temp)</span><br><span class="line">      &#125;</span><br><span class="line">      file.Close()</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    sort.Sort(ByKey(intermediate))</span><br><span class="line"></span><br><span class="line">    temporaryToOriginal := <span class="built_in">make</span>(<span class="keyword">map</span>[<span class="type">string</span>]<span class="type">string</span>)</span><br><span class="line"></span><br><span class="line">    outputName := fmt.Sprintf(<span class="string">&quot;mr-out-%d&quot;</span>, response.Task.ID)</span><br><span class="line">    tempFile, _ := os.CreateTemp(<span class="string">&quot;.&quot;</span>, <span class="string">&quot;tempfile-&quot;</span>)</span><br><span class="line">    temporaryToOriginal[tempFile.Name()] = outputName</span><br><span class="line">    i := <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> i &lt; <span class="built_in">len</span>(intermediate) &#123;</span><br><span class="line">      j := i + <span class="number">1</span></span><br><span class="line">      <span class="keyword">for</span> j &lt; <span class="built_in">len</span>(intermediate) &amp;&amp; intermediate[j].Key == intermediate[i].Key &#123;</span><br><span class="line">        j++</span><br><span class="line">      &#125;</span><br><span class="line">      values := []<span class="type">string</span>&#123;&#125;</span><br><span class="line">      <span class="keyword">for</span> k := i; k &lt; j; k++ &#123;</span><br><span class="line">        values = <span class="built_in">append</span>(values, intermediate[k].Value)</span><br><span class="line">      &#125;</span><br><span class="line">      output := reducef(intermediate[i].Key, values)</span><br><span class="line">      fmt.Fprintf(tempFile, <span class="string">&quot;%v %v\n&quot;</span>, intermediate[i].Key, output)</span><br><span class="line">      i = j</span><br><span class="line">    &#125;</span><br><span class="line">    tempFile.Close()</span><br><span class="line">    request.Info = temporaryToOriginal</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> !ReduceFinishRPC(&amp;request, &amp;response) &#123;</span><br><span class="line">      <span class="keyword">return</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://luolibrary.com/2024/08/04/MIT6-824-MapReduce/</id>
    <link href="https://luolibrary.com/2024/08/04/MIT6-824-MapReduce/"/>
    <published>2024-08-04T07:13:57.000Z</published>
    <summary>
      <![CDATA[<p>This is my record for finish MIT 6.824(spring 2022) first lab <a]]>
    </summary>
    <title>MIT6.824: MapReduce</title>
    <updated>2024-08-04T12:26:27.367Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="GSoC 2024" scheme="https://luolibrary.com/categories/GSoC-2024/"/>
    <category term="GSoC" scheme="https://luolibrary.com/tags/GSoC/"/>
    <content>
      <![CDATA[<h2 id="What-I-Have-Done"><a href="#What-I-Have-Done" class="headerlink" title="What I Have Done"></a>What I Have Done</h2><p>In these two weeks, I mainly focus on solving the reviews. After I have sent the <a href="https://lore.kernel.org/git/ZpPEdmUN1Z5tqbK3@ArchLinux/">Patch v11</a> to the mailing list. Karthik suggests that instead of using <code>ref_checkee</code> and <code>sub_ref_checkee</code>, we may use the following data structure to provide more extensibility here.</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">fsck_refs_info</span> &#123;</span></span><br><span class="line">    <span class="type">char</span> *refname;</span><br><span class="line">    <span class="class"><span class="keyword">union</span> &#123;</span></span><br><span class="line">        <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">            ...</span><br><span class="line">        &#125; reftable;</span><br><span class="line">        <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">            ...</span><br><span class="line">        &#125; files;</span><br><span class="line">       &#125; u;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>So in <a href="https://lore.kernel.org/git/ZpuCg1GL1YE_sJBP@ArchLinux/">patch v12</a>, I implement the above data structure.</p><p>However, Patrick has a different opinion about this. Patrick thinks this is too complicated. We should make thing simple here. Instead of using a union to represent the options, why we not just use a flat structure here. So I just use the following data structure:</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">fsck_refs_info</span> &#123;</span></span><br><span class="line">    <span class="type">const</span> <span class="type">char</span> *path;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>It’s simple and we reserve the extensibility here. The code is under review in the <a href="https://github.com/shejialuo/git/pull/11">github</a>. I have already solve the review from Karthik. However, due to the reason that Patrick has just come back to Office. I am waiting for the reviews from Patrick. When everything is OK, I will send the Patch v13 to the mailing list.</p><p>What a long journey!</p><h2 id="Next-Plan"><a href="#Next-Plan" class="headerlink" title="Next Plan"></a>Next Plan</h2><p>Continue to handle the reviews.</p>]]>
    </content>
    <id>https://luolibrary.com/2024/07/28/GSoC-Week-8-9/</id>
    <link href="https://luolibrary.com/2024/07/28/GSoC-Week-8-9/"/>
    <published>2024-07-28T15:31:46.000Z</published>
    <summary>
      <![CDATA[<h2 id="What-I-Have-Done"><a href="#What-I-Have-Done" class="headerlink" title="What I Have Done"></a>What I Have Done</h2><p>In these two]]>
    </summary>
    <title>GSoC Week 8-9</title>
    <updated>2024-07-28T15:31:59.754Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="GSoC 2024" scheme="https://luolibrary.com/categories/GSoC-2024/"/>
    <category term="GSoC" scheme="https://luolibrary.com/tags/GSoC/"/>
    <content>
      <![CDATA[<h2 id="What-I-Have-Done"><a href="#What-I-Have-Done" class="headerlink" title="What I Have Done"></a>What I Have Done</h2><p>In this week, I still put my effort on handling reviews.</p><ul><li><a href="https://lore.kernel.org/git/Zo0sQCBqyxX8dJ-f@ArchLinux/">Patch v9</a>: In version 8, Karthik thinks that instead of renaming <code>skiplist</code> to <code>oid_skiplist</code>, we’d better rename <code>skiptlist</code> to <code>skip_oids</code>. So, I simply apply this idea. And I have made a mistake in version 8, I use the <code>static</code> for a string buf, but I forget to use <code>strbuf_reset</code> for each function call. So I add this statement here. However, Eric thinks that using <code>static</code> variable is a very bad idea, because <code>fsck_refs_error_function</code> should not be called frequently. The design will make the code harder to “libify”. This is one thing I have learned. And Justin has provided some reviews about the commit sequence and commit messages, need to make it clearer.</li><li><a href="https://lore.kernel.org/git/Zo6eJi8BePrQxTQV@ArchLinux/">Patch v10</a>: This patch solves the problem of version 9. But there are some new reviews coming from Junio. The first problem is that we should not name the report interface <code>vfsck_report</code> but “fsck_vreport”, and Junio feels that the current commit sequence is not so clear, need to adjust.</li></ul><p>However, In patch v10, the most important question Junio asks is about the functionality <code>fsck_refs_error_function</code>. The declaration of this function in patch v10 is shown below:</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">fsck_refs_error_function</span><span class="params">(<span class="keyword">struct</span> fsck_options *options UNUSED,</span></span><br><span class="line"><span class="params">                             <span class="type">const</span> <span class="keyword">struct</span> object_id *oid,</span></span><br><span class="line"><span class="params">                             <span class="keyword">enum</span> object_type object_type UNUSED,</span></span><br><span class="line"><span class="params">                             <span class="type">const</span> <span class="type">char</span> *checked_ref_name,</span></span><br><span class="line"><span class="params">                             <span class="keyword">enum</span> fsck_msg_type msg_type,</span></span><br><span class="line"><span class="params">                             <span class="keyword">enum</span> fsck_msg_id msg_id UNUSED,</span></span><br><span class="line"><span class="params">                             <span class="type">const</span> <span class="type">char</span> *message )</span>;</span><br></pre></td></tr></table></figure><p>Junio thinks above declaration only handles the problem of the single ref such as <code>refs/heads/main</code>. What about the packed-refs?</p><blockquote><p>The error reporting function for refs consistency check was still about reporting a problem for a single ref.  I am wondering how consistency violations that are not about a single ref should be handled.  For example, if <code>refs/packed-backend.c:packed_fsck()</code> finds that the file is not sorted properly or has some unparsable garbage in it, it is not something you can report as “refs&#x2F;heads&#x2F;main is broken”, but those who are interested in seeing the “reference database consistency” verified, it is very much what they want the tool to notice.</p></blockquote><p>So I need to find a way to handle this. So I decide to look at the spec of the packed-refs and reftable refs. And I finally find a way to do this.</p><p>After some investigations, there are the following situations where we should handle when checking ref consistency.</p><ol><li>When checking loose refs and reflofs, we only need the <code>checkee</code> information, because they are standalone files.</li><li>When checking packed-refs, we should check the packed-refs itself, for example whether it is sorted or there are some garbage trailing contents. However, we should also check each ref (<code>sub_checkee</code>) in the file.</li><li>When checking reftable refs, we need to check the binary file, we could still use the idea like 2 case.</li></ol><p>By the above statements, I change the <code>fsck_refs_error_function</code> shown as below:</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">fsck_refs_error_function</span><span class="params">(<span class="keyword">struct</span> fsck_options *options UNUSED,</span></span><br><span class="line"><span class="params">                             <span class="type">const</span> <span class="keyword">struct</span> object_id *oid,</span></span><br><span class="line"><span class="params">                             <span class="keyword">enum</span> object_type object_type UNUSED,</span></span><br><span class="line"><span class="params">                             <span class="type">const</span> <span class="type">char</span> *ref_checkee,</span></span><br><span class="line"><span class="params">                             <span class="type">const</span> <span class="type">char</span> *sub_ref_checkee,</span></span><br><span class="line"><span class="params">                             <span class="keyword">enum</span> fsck_msg_type msg_type,</span></span><br><span class="line"><span class="params">                             <span class="keyword">enum</span> fsck_msg_id msg_id UNUSED,</span></span><br><span class="line"><span class="params">                             <span class="type">const</span> <span class="type">char</span> *message)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="class"><span class="keyword">struct</span> <span class="title">strbuf</span> <span class="title">sb</span> =</span> STRBUF_INIT;</span><br><span class="line">    <span class="type">int</span> ret = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (sub_ref_checkee)</span><br><span class="line">        strbuf_addf(&amp;sb, <span class="string">&quot;%s.%s&quot;</span>, ref_checkee, sub_ref_checkee);</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        strbuf_addstr(&amp;sb, ref_checkee);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (oid)</span><br><span class="line">        strbuf_addf(&amp;sb, <span class="string">&quot; -&gt; (%s)&quot;</span>, oid_to_hex(oid));</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (msg_type == FSCK_WARN)</span><br><span class="line">        warning(<span class="string">&quot;%s: %s&quot;</span>, sb.buf, message);</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        ret = error(<span class="string">&quot;%s: %s&quot;</span>, sb.buf, message);</span><br><span class="line"></span><br><span class="line">    strbuf_release(&amp;sb);</span><br><span class="line">    <span class="keyword">return</span> ret;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>It could provide the following report messages:</p><ol><li>“ref_checkee”: “fsck error name”: “user message”.</li><li>“ref_checkee.sub_ref_checkee”: “fsck error name”: “user message”.</li><li>“ref_checkee -&gt; (oid hex)”: “fsck error name”: “user message”.</li><li>“ref_checkee.sub_ref_checkee -&gt; (oid hex)”: “fsck error name”: “user message”.</li></ol><p>This is what I done in <a href="https://lore.kernel.org/git/ZpPEdmUN1Z5tqbK3@ArchLinux/">patch v11</a>.</p><h2 id="Next-Plan"><a href="#Next-Plan" class="headerlink" title="Next Plan"></a>Next Plan</h2><p>It’s important for me to set up the infra of consistency check for refs. Because everything will be built upon that. I think I will continue to handle the reviews.</p><h2 id="Challenges"><a href="#Challenges" class="headerlink" title="Challenges"></a>Challenges</h2><p>The recent challenges I’ve encountered mainly stem from two aspects. Over the past two weeks, I’ve felt mentally exhausted because I haven’t received much positive feedback. Since May 30th, my first patch is still under review. Sometimes, I can’t help but feel the pressure from my peers. Seeing other GSoC participants successfully merge several patches does indeed make me feel pressured. Therefore, I realize that I must learn how to adjust my mindset during prolonged review periods.</p><p>Secondly, there’s the issue raised by Junio regarding how to improve the “fsck_refs_error_function.” Junio actually brought this up in the initial version, but I subconsciously ignored it. Although I am responsible for building the infrastructure, I have limited knowledge about packed-refs and reftable refs. I thought it would be very difficult for me to design a perfect function. However, in the end, I had to face this problem head-on. Sometimes, when I encounter difficult issues, I tend to avoid them subconsciously. Despite this, I eventually found a solution.</p>]]>
    </content>
    <id>https://luolibrary.com/2024/07/16/GSoC-Week-7/</id>
    <link href="https://luolibrary.com/2024/07/16/GSoC-Week-7/"/>
    <published>2024-07-16T13:45:49.000Z</published>
    <summary>
      <![CDATA[<h2 id="What-I-Have-Done"><a href="#What-I-Have-Done" class="headerlink" title="What I Have Done"></a>What I Have Done</h2><p>In this week,]]>
    </summary>
    <title>GSoC Week 7</title>
    <updated>2024-07-16T13:46:06.115Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="GSoC 2024" scheme="https://luolibrary.com/categories/GSoC-2024/"/>
    <category term="GSoC" scheme="https://luolibrary.com/tags/GSoC/"/>
    <content>
      <![CDATA[<h2 id="What-I-Have-Done"><a href="#What-I-Have-Done" class="headerlink" title="What I Have Done"></a>What I Have Done</h2><p>In this week, I mainly focus on solving the reviews.</p><ul><li><a href="https://lore.kernel.org/git/ZoLHtmOKTfxMSxvw@ArchLinux/">Patch v6</a>: In this version, I decide to reduce the complexity. However, I still misunderstood what Junio said, I still explicitly extracts two options <code>fsck_refs_options</code> and <code>fsck_objects_options</code> here. In my view, I suppose we could make the code more clean. However, Junio has commented as the following:<blockquote><p>Just like premature optimization is bad, premature factoring and over-modularization is bad.</p></blockquote></li><li><a href="https://lore.kernel.org/git/ZoVX6sn2C9VIeZ38@ArchLinux/">Patch v7</a>: In this version, I just add a new ref-related field <code>verbose_refs</code> into the <code>fsck_options</code> without any over-modularization.</li><li><a href="https://lore.kernel.org/git/ZovqY4vQnQBAs7PH@ArchLinux/">Patch v8</a>: Some commit messages in Patch v7 are not clear which makes the reviewer confused. Enhance the commit messages in this version.</li></ul><h2 id="Next-Plan"><a href="#Next-Plan" class="headerlink" title="Next Plan"></a>Next Plan</h2><p>I guess this series should be OK. After setting up the infrastructure. I decide to add packed-refs consistency checks with the following steps:</p><ol><li>Get a list of checks that packed-refs should checks, discussing with my mentors and the community.</li><li>Implement the code.</li></ol><h2 id="Challenges"><a href="#Challenges" class="headerlink" title="Challenges"></a>Challenges</h2><p>Since becoming a full-time employee, time has become a bit tight. I will manage my time more efficiently.</p>]]>
    </content>
    <id>https://luolibrary.com/2024/07/08/GSoC-Week-6/</id>
    <link href="https://luolibrary.com/2024/07/08/GSoC-Week-6/"/>
    <published>2024-07-08T13:38:41.000Z</published>
    <summary>
      <![CDATA[<h2 id="What-I-Have-Done"><a href="#What-I-Have-Done" class="headerlink" title="What I Have Done"></a>What I Have Done</h2><p>In this week,]]>
    </summary>
    <title>GSoC Week 6</title>
    <updated>2024-07-16T13:28:10.182Z</updated>
  </entry>
  <entry>
    <author>
      <name>shejialuo</name>
    </author>
    <category term="GSoC 2024" scheme="https://luolibrary.com/categories/GSoC-2024/"/>
    <category term="GSoC" scheme="https://luolibrary.com/tags/GSoC/"/>
    <content>
      <![CDATA[<h2 id="Personal-Life"><a href="#Personal-Life" class="headerlink" title="Personal Life"></a>Personal Life</h2><p>Due to the need to help prepare for my master’s graduation work and to move to Shanghai to start my job at NVIDIA on July 1st, I have divided the GSoC records into two weeks.</p><h2 id="What-I-Have-Done"><a href="#What-I-Have-Done" class="headerlink" title="What I Have Done"></a>What I Have Done</h2><p>In these two weeks, I mainly work on three tasks:</p><ul><li><a href="https://lore.kernel.org/git/ZnKKy52QFO2UhqM6@ArchLinux">Patch v4</a>: In this version, I correct the previous implementation that attempted to use pointer casting and adopt a composition strategy to design the data structure.</li><li><a href="https://lore.kernel.org/git/Zn4xeoqhCeBCSNvg@ArchLinux">Patch v5</a>: In this version, Junio suggest that I should reuse the existing report code. However, I overcomplicate the issue by setting up two parallel data structures, which increases the complexity of the problem.</li><li>Completed the GSoC midterm evaluation. My mentors have given me some really useful advice, especially.<blockquote><p>Find the balance between building something that can be easily extended in the future vs. something that is specific to the task at hand.</p></blockquote></li></ul><h2 id="Next-Plan"><a href="#Next-Plan" class="headerlink" title="Next Plan"></a>Next Plan</h2><p>The next task is still based on the composition structure of the data. Although Junio provided a data structure using a union, I still find it too complex. I have always wanted my implementation to be extensible, which has slightly deviated from the task I was supposed to do.</p><h2 id="Challenges"><a href="#Challenges" class="headerlink" title="Challenges"></a>Challenges</h2><p>I feel that the biggest challenge over these two weeks has been understanding the reviews. Every time I submit changes based on a review, I tend to veer off course a bit. I feel that the reviewers’ comments are aimed at addressing specific issues, while I always strive for a perfect implementation, which has led to a lot of unnecessary work and made the code more complex.</p><p>How to balance this is something I have decided to think about carefully.</p>]]>
    </content>
    <id>https://luolibrary.com/2024/06/30/GSoC-Week-4-5/</id>
    <link href="https://luolibrary.com/2024/06/30/GSoC-Week-4-5/"/>
    <published>2024-06-30T15:50:51.000Z</published>
    <summary>
      <![CDATA[<h2 id="Personal-Life"><a href="#Personal-Life" class="headerlink" title="Personal Life"></a>Personal Life</h2><p>Due to the need to help]]>
    </summary>
    <title>GSoC Week 4-5</title>
    <updated>2024-07-08T13:49:20.916Z</updated>
  </entry>
</feed>
