<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[mechanus.io]]></title><description><![CDATA[Huh?]]></description><link>https://mechanus.io/</link><image><url>https://mechanus.io/favicon.png</url><title>mechanus.io</title><link>https://mechanus.io/</link></image><generator>Ghost 3.29</generator><lastBuildDate>Sun, 12 Apr 2026 09:50:07 GMT</lastBuildDate><atom:link href="https://mechanus.io/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[再见了，所有的 Evangelion]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>很少有流行作品能够像 Eva 这样，成为一代人共同的回忆。而能像 Eva 这样，过了几十年而推倒重来的，就更少了。不过这一次，除非庵野秀明过了几十年后没钱了，我们大概率是真的要向这个系列彻底说再见了的。</p>
<h1 id>对过去的告白</h1>
<p>在开始写新剧场版之前，我还是想写一点关于过去的东西，也就是旧 TV 和剧场版。虽然我一直以来都有过度解读的倾向，但是我相信在创作之初，庵野秀明也许真的没有想这么多（尤其是考虑到日本动画边做边播的模式和监督本人和观众的矛盾）。当然，我们同时也同意一部作品在被发布之后，怎么解读就完全是读者的意愿，和作者本人已经没有什么关系了。</p>
<p>虽然这张图很烂俗了，但是我还是想贴出来，因为描述确实非常精确<br>
<img src="https://mechanus.io/content/images/2021/08/small_202103083512139.jpg" alt="small_202103083512139"></p>
<h2 id>最初的矛盾</h2>
<p>旧 TV 的脉络我认为还是比较清晰的。很多人能从这部作品里找到共鸣：一个少年，总是不可避免地面对成长和责任。这时候一大堆矛盾就出来了——你怎么处理自己与自身、与世界的关系。</p>
<p>Don't get me wrong，我没有在说这是一部正能量作品。</p>
<blockquote>
<p>他人即地狱。</p>
</blockquote>
<p>这话是萨特说的。存在主义也是现代思想里比较引起波澜的一派，即便加缪本人十分讨厌这个名字。我们这里暂时先不提存在先于本质之类的话（这话在我看来和</p>]]></description><link>https://mechanus.io/zai-jian-liao-suo-you-de-evangelion/</link><guid isPermaLink="false">612311ad2fa375000142fd1b</guid><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Sun, 03 Oct 2021 06:24:04 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>很少有流行作品能够像 Eva 这样，成为一代人共同的回忆。而能像 Eva 这样，过了几十年而推倒重来的，就更少了。不过这一次，除非庵野秀明过了几十年后没钱了，我们大概率是真的要向这个系列彻底说再见了的。</p>
<h1 id>对过去的告白</h1>
<p>在开始写新剧场版之前，我还是想写一点关于过去的东西，也就是旧 TV 和剧场版。虽然我一直以来都有过度解读的倾向，但是我相信在创作之初，庵野秀明也许真的没有想这么多（尤其是考虑到日本动画边做边播的模式和监督本人和观众的矛盾）。当然，我们同时也同意一部作品在被发布之后，怎么解读就完全是读者的意愿，和作者本人已经没有什么关系了。</p>
<p>虽然这张图很烂俗了，但是我还是想贴出来，因为描述确实非常精确<br>
<img src="https://mechanus.io/content/images/2021/08/small_202103083512139.jpg" alt="small_202103083512139"></p>
<h2 id>最初的矛盾</h2>
<p>旧 TV 的脉络我认为还是比较清晰的。很多人能从这部作品里找到共鸣：一个少年，总是不可避免地面对成长和责任。这时候一大堆矛盾就出来了——你怎么处理自己与自身、与世界的关系。</p>
<p>Don't get me wrong，我没有在说这是一部正能量作品。</p>
<blockquote>
<p>他人即地狱。</p>
</blockquote>
<p>这话是萨特说的。存在主义也是现代思想里比较引起波澜的一派，即便加缪本人十分讨厌这个名字。我们这里暂时先不提存在先于本质之类的话（这话在我看来和 <em>一个单子就是自函子范畴上的一个幺半群</em> 一样难受）。在我的理解中，大致意思是人生下来就被迫和他人打交道。很不幸，我们每个人都有自己的自我意识。而在和他人交往的过程中，总是被不断加深孤独的存在。孤独是人确认自身存在的一种方式，而在与他人交往的过程中会损害这种孤独，你感到害怕。你需要孤独，又想逃避这样的孤独。孤独是痛苦的，和他人交往也是痛苦的，这就成了地狱了。</p>
<p>听着是不是很像 AT 立场？</p>
<p>我不认为痞天使本人有系统性地学过哲学（甚至可能没有听过这句话），但是我丝毫不怀疑旧 Eva 的创作背景。每个人，包括我，在成长过程中一定会有过这样的痛苦。你一定会有这种经历：真嗣在旧 TV 第一集被他爹强行拉去开 Eva 结果发现啥也干不了；想拯救明日香，发现自己就是个废物，只能对着明日香打手冲。你鼓起勇气，挑起责任挑战自己没有做过的东西，发现自己失败得一塌糊涂。你一心想作为王子拯救自己喜欢的女孩子，发现自己从头到尾都在做梦，所有的一切都是自慰。你一定有这种经历。</p>
<h2 id>关于人物和党争</h2>
<p>Eva 能作为日本动画界跨时代的作品不仅因如此。旧 Eva 在人物刻画上是极为细腻，各个角色的设计都是有机的整体，而不是工具人。</p>
<p>我们总是能在各个场合看到党争炒股（甚至还有对岸友人真的写了个交易所）。但我一直以来都认为，在 Eva 这部作品里搞党争是没有意义的——因为绫波丽和明日香其实是一个人。</p>
<p>这有些哗众取宠的嫌疑了，因为她们确实是完完全全、两个不一样的人。之所以说她们是两个人，是因为在我看来她们是一体两面，本质上是同一矛盾的不同呈现方式。我们知道，脸谱化是文学作品常用的写作手法，通过脸谱化的角色来承载作者的意图。在 Eva 里，两个中心女角色就是同一矛盾的不同脸谱（当然，这两个角色本身并不脸谱化，相反很立体，我指的是创作的目的）。<br>
<img src="https://mechanus.io/content/images/2021/09/9280267F-8E66-4EDC-B106-9679010C6DC6.jpeg" alt="9280267F-8E66-4EDC-B106-9679010C6DC6"></p>
<p>真嗣一边渴望（也可以理解为不渴望）被救赎，一边不愿意打破心之壁。针对这条主线，两个主要女角色通过不同的角度补完了真嗣。显然，两个女角色承载的功能和性格也是完全不同的。如果说凌波丽的作用是从真嗣的内心让新之壁裂开，那么明日香的作用则是撕裂自己的心之壁，从外部把真嗣的心之壁给砸开。甚至是最后的「你真恶心」，我也认为是救赎真嗣、原谅自身的一部分。</p>
<p>这两个角色是互补的。她们是同一矛盾——他人即地狱的不同表达。党争没有意义。</p>
<p>值得一提的男性角色里，碇元渡自然不用说，我相信他是导演自身带入的一部分（你的父亲是你自身认同的一部分，好像是弗洛伊德说的？）。渚薰和加持则是两个可以仔细分析的角色。想象一下多元微积分，可以有多个方向来达成你想要的目的。作为各种意义上的天使（客观设定上，主观上，以及功能投影的天使），渚薰则是完成了两个主要女性角色做不到的部分，补全了她们形成的真空。作为异性，真嗣和两位女角色之间无可避免、或多或少会有浪漫关系、荷尔蒙驱动、不稳定的「干扰」。而渚薰的功能则排除了这种「干扰」，用纯粹的同性友情关系，无保留地通过自我牺牲完成了真嗣内心的补全。不管是只有女角色，还是只有渚薰，都是不完备的。可以说，渚薰是画龙点睛的一笔，没有他，Eva 可能真的会不可避免的成为现在泛滥的炒股番了。</p>
<h2 id>我们最终总是要长大的</h2>
<p>不管 Eva 用了什么样的隐喻、暗示；不管你怎么看不懂死海古卷、黑月、朗基努斯之枪，没有关系。不要被忽悠了——我一直以来都认为，这些看起来很厉害的承载物都是障眼法，你信了就输了。庵野也承认了这一点：他根本不懂基督教，这些都是一些他觉得看起来很厉害就加进来了的东西。真正的矛盾有且只有一个，AT 立场，即人和他人的隔阂。</p>
<p>旧 TV 和《EOE》的两个结局我都很喜欢。我相信庵野秀明更偏好的肯定是 TV 的结局，但我还是两个都很喜欢。TV 结局很棒，和之前以观众为核心的故事发展不一样，这个意识流结局完全是以庵野秀明自身的意识出发，而和观众没什么联系。人类补完计划到底怎么样，和你又有什么关系呢？真嗣得到了补完，这就够了——nothing matters，这就够了。恭喜。Congratulations. おめでとう。</p>
<p>虽然很遗憾的是，在当时能和导演建立这样的联系的观众还是少数，《EOE》就这么出来了。观众和导演当然是撕裂的——我一向认为，一部好的作品，既属于观众，也属于导演的，也谁都不属于。戏里，这是个故事。戏外，发生的事情又成就了这个故事。艺术作品，就像一个大染缸，能联想到的什么都可以扔进去，作品本身只是染缸里的一部分，而染缸则成了真正呈现给世人的作品了（see <a href="https://en.wikipedia.org/wiki/Artist%27s_Shit">Artist's shit</a>）。《EOE》就是这样，戏里戏外发生的一切成就了这部作品。观众恨导演，导演恨观众；世界完蛋，大家一起变果粒橙。你真恶心：我真的讨厌你，没办法，但是我还是很讨厌你。解读的空间实在是太多了，但是两部作品加在一起，圆满了，就该这样，不同的结局，构成了同一个故事，少了哪个都不完整。</p>
<p>You are filled with determination. 完成了。</p>
<h1 id>是时候翻篇了</h1>
<p>《EOE》是矛盾的第一个巅峰，第二个巅峰，是新剧场版的《Q》。</p>
<p>看完了新剧场版的观众肯定会感到奇怪。续、破，看起来很正常，大部分都是旧内容的重制，新内容也是保持水准，值得可圈可点的设定层出不穷，巨乳眼镜大姐姐，马克系列的机设，月球基地——我们看到的是一个全新而类似的故事。我们期待下一阶段的故事。</p>
<p>但是《Q》的出现打破了我们的幻想。</p>
<p>新剧场版是不完整的 per se，只有将它和旧时代结合，我们才能看出一些端倪。</p>
<h2 id>我最恨的人是我自己</h2>
<p>如果说，《EOE》 是庵野秀明和观众的矛盾，那么我相信，《Q》则是他对自己的恨写成的，我最恨的人，是我自己。</p>
<p>这是整个 Evangelion 世界第二个，在我眼中也是最大的高潮。在多年的等待后，粉丝迎来的是一个和序、破精心而巧妙的设计完全连不上的一个故事。所有人看完了都是一头雾水，Evangelion 3.3, you can(not) understand. 我在看完之后也是同样一头雾水，看完了所有别人写的解析时候，感到各种说法还是不能说服我，从剧本设计的角度来说，这不对劲。</p>
<p>当然，结合后面给出的信息，我们明白了，庵野秀明在结束了 《Q》 的制作后患上了抑郁症。这是一个非常不幸的消息，但是这又是非常能预料到的，不如说，更奇怪的是他这么晚了才宣布因为抑郁症隐退。老观众在看旧 TV 和 《EOE》 的时候一定能看出来导演有着严重的抑郁倾向，如果你在生命的某个时刻同样不可避免地有着同样的情绪，那么你一定能看出他在戏里对自己的投影和痛苦的诠释。从捏爆渚薰，到 congratulations 循环，到你真恶心，我们可以明显的感受到他的痛苦。新系列也是同样，但这样的痛苦被放大了无数倍，浓度过高的痛苦使得我们甚至感受不到他在说什么，我们看到的只是看不懂。</p>
<p>如果说旧 TV 可以不负责任地简化为「少年抄起枪扛起责任保护自己在意的人」的经典桥段，那么《Q》的主旨则是「少年抄起枪，发现唯一倒地的就是自己在意的人」。不管你怎么努力，你一定会伤到自己最在乎的人和所有人，c'est la vie. 在戏里，这样的绝望是真嗣这个年纪的无法承担的，我相信这一定是庵野秀明对自己的投影——太痛苦了，什么事都做不到，我恨我自己。</p>
<h2 id="thriceuponatime">Thrice upon a time</h2>
<p>这大概是这篇文章我最想谈谈的内容。如果从纯粹讲好一个故事的角度来说，《Q》，乃至整个新剧场版，都实在称不上成功：一头雾水走出电影院的观众，莫名其妙的空白的十四年，提出又被搁置的新设定，费解的隐喻。这很难让人联系到旧 Eva 各种精巧、严谨、光是 S2 机关就可以写几千字分析的设定。你很难去分析一个不完整的东西，无论怎样，得出的结论都是难以服众的。</p>
<p>但这一切的问题都在《终》播出后变得不那么重要了。</p>
<p>我们可以看到，庵野秀明很努力地在《终》里去圆上这些这些设定和剧情上的漏洞，但是即便是两个半小时超长的篇幅，还是有大量覆盖不到的内容。渚司令是什么？巨乳大姐姐到底是谁？三冲到底是谁搞的？这些都是遗留问题的冰山一角，不靠官方漫画补充根本没法得出答案。</p>
<p>但是，这不重要。《终》依然是这个系列最好的结局。看完之后我们知道了，和旧 Eva 不同，新剧场版是一部披着 Eva 皮的日记——根本上，它是一本写给自己看的日记。</p>
<p>《终》在解决了诸多剧情上绕不过去的点后，我们迎来的又是一个意识流结局。这次的结局和上次的有些许相似，但又有不同。如果说旧 TV 的结局里，庵野秀明将自己的痛苦和顿悟全数投影到了真嗣身上，在《终》里这样的痛苦则是被多个角色分担了。真嗣自不用说，一个毁了几乎所有、而又重拾意义的少年。而碇司令则承担了他的另一部分投影：一个不幸患上抑郁症，沉浸于痛苦之中，却最终被妻子拯救的故事。碇司令这次也是如此：承载着巨大痛苦，为着虚无缥缈的目的做着可笑事情的中年人，却最终被家人拯救——你的家人一直在你的身边。</p>
<p>甚至对于真嗣也是如此：二十年过去了。原始批次、你熟知的那个凌波和母亲，也是一直在你的身边。当初和你不共戴天，被你所憎恨、「你真恶心」的观众和初恋，也和你坐在一起，互道了衷肠和再见。新三村虽然艰苦，但是我们依然相信自己的运气。</p>
<p>这是 Eva 能有的最好的结局了。至于剧情、设定、机体什么的，又有什么重要的呢？我们知道的是一个遭受巨大痛苦，但是又走出阴霾的活生生的人，给我们讲述自己的故事。讨论过度的细节是没有意义的——够了，我们长大了，写个日记而已，逻辑上有纰漏是很正常的嘛。这都是第三次结尾了，thrice upon a time，该毕业了。</p>
<p>镜头拉远了。手绘动画逐渐变成了实拍。音乐响起。是时候回归现实了。</p>
<iframe allow="autoplay *; encrypted-media *; fullscreen *" frameborder="0" height="150" style="width:100%;max-width:660px;overflow:hidden;background:transparent;" sandbox="allow-forms allow-popups allow-same-origin allow-scripts allow-storage-access-by-user-activation allow-top-navigation-by-user-activation" src="https://embed.music.apple.com/ca/album/one-last-kiss/1542953969?i=1542953977"></iframe>
<p>于是我们又回到了旧 TV 的原点，我们和自己和解了，和他人和解了，和世界和解了，恭喜！我被拯救了，我去做哥斯拉了，我原谅你们了，你们也别再捧着这个不放了，回到现实中，多和他人交流吧。</p>
<p>但是，庵野秀明有他老婆来拯救，你呢？</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[后 iCloud 时代，我们怎么给手机备份]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>UPDATE:<br>
定时任务的执行好像还是有问题。嗯，还是乖乖用 iCloud 或者等 iMazing CLI 的价格降到普通人可以接受的水平吧。</p>
<p>最近 iCloud 的几个新闻大家应该都非常熟了，先是迫于美国执法部门的压力放弃了 iCloud 备份的端到端加密，后和执法部门合作对 iCloud 照片进行扫描。诚然，扫描云端数据并不是什么新闻，iCloud 依然是这个星球上最注重隐私的主流云服务，但是这依然是不可以接受的——苹果一直以来的隐私承诺在此前是多么的苍白。</p>
<p>所以，自建一个备份服务器是很重要的。</p>
<p>但是问题来了，我们之所以用 iCloud，其根本原因是因为它太好用了——不需要复杂的设置，小手一点无论在世界的哪里都会自动在晚上睡觉充电时自动备份。这样的系统集成使用体验是很难复刻的。</p>
<p>诸多功能里，最重要的两条：</p>
<ul>
<li>自动化，没有人想要（或者能想起来去跑）一个手动的备份程序</li>
<li>安全，所有的数据都应该是加密的</li>
</ul>
<p>这听起来很像 Time Machine，但是很遗憾，我们并没有 Time Machine for iPhone。</p>]]></description><link>https://mechanus.io/hou-icloud-shi-dai-wo-men-zen-yao-gei-shou-ji-bei-fen/</link><guid isPermaLink="false">61207a932fa375000142fc36</guid><category><![CDATA[Hacks]]></category><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Wed, 25 Aug 2021 12:54:03 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>UPDATE:<br>
定时任务的执行好像还是有问题。嗯，还是乖乖用 iCloud 或者等 iMazing CLI 的价格降到普通人可以接受的水平吧。</p>
<p>最近 iCloud 的几个新闻大家应该都非常熟了，先是迫于美国执法部门的压力放弃了 iCloud 备份的端到端加密，后和执法部门合作对 iCloud 照片进行扫描。诚然，扫描云端数据并不是什么新闻，iCloud 依然是这个星球上最注重隐私的主流云服务，但是这依然是不可以接受的——苹果一直以来的隐私承诺在此前是多么的苍白。</p>
<p>所以，自建一个备份服务器是很重要的。</p>
<p>但是问题来了，我们之所以用 iCloud，其根本原因是因为它太好用了——不需要复杂的设置，小手一点无论在世界的哪里都会自动在晚上睡觉充电时自动备份。这样的系统集成使用体验是很难复刻的。</p>
<p>诸多功能里，最重要的两条：</p>
<ul>
<li>自动化，没有人想要（或者能想起来去跑）一个手动的备份程序</li>
<li>安全，所有的数据都应该是加密的</li>
</ul>
<p>这听起来很像 Time Machine，但是很遗憾，我们并没有 Time Machine for iPhone。感谢那个联网还不是计算机标配的年代，否则现在的 Mac 备份可能也要被强制搬到 iCloud 上去。</p>
<p>我的文章的读者家里应该都有 NAS（或至少听说过）。如果能在 NAS 上跑一个自动运行的备份程序，看起来会是个好主意。</p>
<h1 id>没有银弹</h1>
<p>没有银弹是一个软件工程行业的谚语，世界上没有能一劳永逸解决所有问题的解决方案。</p>
<p>为了达成我们的目标，首先我们需要一个文件服务器（比如我们的 NAS），其次是一个跑备份程序的计算节点。</p>
<p>怎么部署这个计算节点成了一个更大的问题。iMazing 是一个值得信赖的第三方 iOS 设备管理程序，恰巧满足我们的需求。但可惜的是只有 Windows 和 Mac 版。在容器里面跑是没戏了（如果你不同意这点，我理解，拉到最后），所以唯一的解是在 Windows Server。</p>
<p>和往常一样，我不喜欢直接写结论，而是喜欢写出得出结论的过程。如果你只是需要这个服务能跑起来，可以直接拉到最后。</p>
<h1 id>把大象装进冰箱</h1>
<p>把大象装进冰箱只有三步：打开冰箱门，装进大象，关上冰箱门。在这里，这三步就是：起一个 Windows Server，挂载文件服务器，跑起 iMazing。</p>
<h2 id="windowsserver">起一个 Windows Server</h2>
<p>没啥可说的，唯一需要注意的是 Windows Server 2016 以上有带完整 GUI 的（所谓的Desktop Experience）和没 GUI 的版本，为了节省资源我用的是没 GUI 的版本，只能用 PowerShell 配置，别的没什么需要注意的。</p>
<p>如果你和我一样选择了没有 GUI 的版本，可以做以下几步让自己舒服一点（如无特殊标注，均为 PowerShell 脚本）：</p>
<p>打开 RDP：</p>
<pre><code>Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name &quot;fDenyTSConnections&quot; -value 0
Enable-NetFirewallRule -DisplayGroup &quot;Remote Desktop&quot;
</code></pre>
<p>打开 SSH：</p>
<pre><code>Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'
</code></pre>
<p>然后你应该就可以通过用户名和密码方式访问你的计算节点了（要证书其实也可以，网上能找到很多教程，不表）。</p>
<p>SSH 的主要目的是复制粘贴文字和 scp 方便，由于 Windows 诡异的登录系统，有些命令只能在 RDP 里面跑。如果你在 SSH 里跑命令遇到了奇怪的问题，不妨试试 RDP。</p>
<h2 id>挂载文件服务器</h2>
<p>PowerShell 里用来挂载 smb 服务器的命令是 <code>New-SmbMapping</code>，利用一些 Google 技巧，得出最好的方法是先将服务器账号密码保存在钥匙环里，然后就可以安全地被这个命令使用了。</p>
<p>添加秘密到钥匙环：</p>
<pre><code>cmdkey /add:NetBiosOfYourNAS /user:&quot;yourUsername&quot; /pass:&quot;yourPassword&quot;
</code></pre>
<p>挂载可持续的（persistent）smb 服务器到 X 盘符：</p>
<pre><code>New-SmbMapping -LocalPath 'X:' -RemotePath '\\NetBiosOfYourNAS\iMazing backups' -SaveCredentials -Persistent $True
</code></pre>
<p>这样每次启动都会自动挂载了</p>
<h2 id="imazing">跑起 iMazing</h2>
<p>为什么要前面要开启 SSH 呢，一个主要的原因就是因为没有 GUI 的版本的 Windows Server 不带 IE，PowerShell 里的 curl-equivalent 在没有 IE 的情况下老报错，我懒得处理这种问题，所以还是把文件直接 scp 进去方便（微软啊微软……）。</p>
<p>涉及到 GUI 程序，所以要用 RDP 连接到虚拟机。直接在 PowerShell 里敲入 <code>C:\Program Files\DigiDNA SARL\iMazing\iMazing.exe</code> 后按照正常的流程去配置，添加新的 iOS 设备和定时备份。第一次连接需要设置/直通 USB 设备。</p>
<p>显然，因为这个版本的 Windows Server 没有完整的 GUI 环境，所以也没有文件选择对话框 😅，所以 iMazing 也自然没法添加新的备份目录。所以还是得装个 vim 手动编辑配置文件（位置是这个 <code>~\AppData\Roaming\iMazing\Prefs\BackupLocations.plist</code>）</p>
<p>当你配置好了 iMazing 的自动备份之后，因为自动备份这个功能是由 iMazing mini 来提供的，所以你需要把它做成一个服务，才能在出现例如意外断电重启的时候自动启动。<br>
使用一些 Google 技巧，我们可以得知在 Windows Server 里自启动的最好的方法是新开一个 Service Account。但是我实在是不想因为这个需求就去折腾 Active Domain（你直接杀了我吧），所以直接用 SYSTEM 看起来是一个更正确的方式。</p>
<h1 id>然后你会发现这根本不管用</h1>
<p>每一步都没有问题，为什么？</p>
<p>Windows 有着诡异的用户管理。我没有仔细读过文档，但就我的经验来看，对于 Windows 来说一个完整的 session 必须要用户自己去登录（包括但不限于物理显示器和 RDP）。所以你会发现，在一个 SSH session，有相当多的用户相关功能是不能用的，PowerShell 会报一大堆看似很详细但是无用的错。而你很有可能发现不了这个问题，因为这时候大部分功能是可以用的，你甚至可以用 vscode 的远程 SSH 功能连接 debugger 调试 Windows 下的程序。</p>
<p>所以，如果你发现 PowerShell 报了一大堆奇怪的错，换成 RDP 再试一次大概率能得到解决。</p>
<p>依然是登录的问题。如果你不死心继续尝试，你会发现因为以下原因使用 SYSTEM 用户是不行的：</p>
<ul>
<li>无头 session（这个不准确的名字是我发明的，本人不是 Windows 专家不知道应该叫啥）无法访问钥匙串</li>
<li>SYSTEM 用户有自己的 AppData 目录，因为这个 hacky 需求的本质，我们没有办法完全不使用那个 iMazing.exe 的前端，iMazing 并不开源，你总有需求要配置一些不那么显而易见的东西的</li>
</ul>
<p>对于这两个问题，我的解决方法是：</p>
<ul>
<li>明文的 smb 账号密码，直接写在一个 ps1 脚本里</li>
<li>用 Administrator 账号跑这个脚本</li>
</ul>
<p>为什么要用 Administrator 这个很不安全的账号，我的理由是：</p>
<ul>
<li>它并不比 SYSTEM 账号更不安全</li>
<li>家庭环境里，一个不暴露任何对外服务的 single-purpose 主机不是一个很大的问题</li>
<li>如果你不死心还是尝试新建一个普通账号，会发现根本不管用</li>
</ul>
<p>以下是脚本内容，起个名字比如 <code>imazing.ps1</code></p>
<pre><code>New-SmbMapping -LocalPath 'X:' -RemotePath '\\yourNetBIOS\iMazing backups' -Persistent $True -UserName 'yourUsername' -Password 'yourPassword'
Start-Process -FilePath &quot;C:\Program Files\DigiDNA SARL\iMazing\iMazing mini.exe&quot;
</code></pre>
<p>然后把它用定时任务设置成自启动：</p>
<pre><code>$action = New-ScheduledTaskAction -Execute 'PowerShell' -Argument 'C:\Users\Administrator\imazing.ps1'
$settings = New-ScheduledTaskSettingsSet -MultipleInstances Parallel
$trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -TaskName imazing -Action $action -Trigger $trigger -User &quot;$env:USERDOMAIN\$env:USERNAME&quot; -Password 'yourAdminPassword' -Settings $settings
</code></pre>
<p>没错，又是明文密码。因为我实在是想不到更安全的方法了，<em>一切都是 tradeoff</em>。</p>
<h1 id>然后就完事了</h1>
<p>理论上来说，这就应该完事了。我后续倒是有遇到过一个问题，死活无法正常完成备份，日志提示 <code>Cannot run task StandardBackup on device, an other operation is already running on this device!</code>，并且换个目录一切正常。找到的解决方案是删掉一个备份快照，大概就一切正常了。</p>
<p>这是个很 hacky 的解决方案。正常情况下，一个比较好的设计应该是用 iMazing CLI，做成一个 Docker image，这是一个绝好的 Docker for Windows（用 NT 内核的那个，不是 Docker Desktop）的学习和使用机会。同样，异常的处理也会更优雅，这个解决方案完全没有（也没法）处理异常情况。很可惜，iMazing 的 CLI 版本非常贵，几百刀一年的价格就不是给这种需求设计的。Windows 和 PowerShell 诡异的限制也是这个奇怪方案的原因。<s>我怀疑如果 OS X Server 或者 OpenDarwin 还活着都比这个更正常</s></p>
<p>截至目前这个备份方案看起来一切正常，我打算等再过段时间，确认没有什么暗病之后再停掉 iCloud 备份和订阅。再加上之前已经用 Resilio Sync（同样，不完美的方案，都是 tradeoff）替换掉了 iCloud Drive，剩下还留着的服务就是 iCloud Photo 了。</p>
<p>说老实话，对于普通用户，乖乖接受 iCloud 的审查可能是最好的方法，和同行比大概的确不算烂的。本文所描述备份方案不建议无技术背景的普通群众使用。</p>
<p>以上。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[2020 年终总结]]></title><description><![CDATA[<p>本年无事发生。</p>]]></description><link>https://mechanus.io/2020-nian-zhong-zong-jie/</link><guid isPermaLink="false">5fe87338a935a40001be0ea5</guid><category><![CDATA[Autistics]]></category><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Sun, 27 Dec 2020 11:43:23 GMT</pubDate><content:encoded><![CDATA[<p>本年无事发生。</p>]]></content:encoded></item><item><title><![CDATA[静态链接 Haskell 程序]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><code>ghc</code> 默认会静态链接 Haskell 依赖，动态链接其他语言的依赖（比如 C 库）。这样在部署的时候就会非常非常麻烦。编译出来的二进制程序可能在一个发型版上能工作，但是在其他发行版就挂了（因为缺动态链接库）。库的版本也是个头疼的问题。</p>
<p>一个很显然的 use case 就是 AWS Lambda，你对机器没有控制权，自然也没有权限安装这些库。这时候静态链接就很有必要了。</p>
<p>网络上有甚多关于 <code>crt</code> 和 <code>opal-static</code>/<code>fPIC</code> 的 hack。他们都是过时的，不需要。</p>
<p>我们使用 <a href="https://github.com/commercialhaskell/stack">Stack</a> build system。它太好用了，不熟悉的可以想象成 Haskell 的 <code>pipenv</code>。直接用 <code>cabal</code> 也是一样的，不过我更喜欢 Stack。</p>
<p>举个例子。我有一个项目使用了 <code>text-icu</code> 这个依赖。它是一个</p>]]></description><link>https://mechanus.io/jing-tai-lian-jie-haskell-cheng-xu/</link><guid isPermaLink="false">5eb74c8d45ddd800012c078d</guid><category><![CDATA[Hacks]]></category><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Sun, 10 May 2020 01:06:41 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><code>ghc</code> 默认会静态链接 Haskell 依赖，动态链接其他语言的依赖（比如 C 库）。这样在部署的时候就会非常非常麻烦。编译出来的二进制程序可能在一个发型版上能工作，但是在其他发行版就挂了（因为缺动态链接库）。库的版本也是个头疼的问题。</p>
<p>一个很显然的 use case 就是 AWS Lambda，你对机器没有控制权，自然也没有权限安装这些库。这时候静态链接就很有必要了。</p>
<p>网络上有甚多关于 <code>crt</code> 和 <code>opal-static</code>/<code>fPIC</code> 的 hack。他们都是过时的，不需要。</p>
<p>我们使用 <a href="https://github.com/commercialhaskell/stack">Stack</a> build system。它太好用了，不熟悉的可以想象成 Haskell 的 <code>pipenv</code>。直接用 <code>cabal</code> 也是一样的，不过我更喜欢 Stack。</p>
<p>举个例子。我有一个项目使用了 <code>text-icu</code> 这个依赖。它是一个 <code>icu</code> (C library) 到 Haskell 的 binding。如果在 Debian 上直接编译然后到 Ubuntu 上使用，就会出现找不到动态链接库的错误：</p>
<pre><code>$ ./MainParser: error while loading shared libraries: libicuuc.so.57: cannot open shared object file: No such file or directory
</code></pre>
<p>但是我其实是有这个库安装的，不过版本太新了</p>
<pre><code>$ ls /usr/lib/x86_64-linux-gnu/ | grep libicuuc
libicuuc.a
libicuuc.so
libicuuc.so.60
libicuuc.so.60.2
</code></pre>
<p>ldd 一下会发现更多的依赖：</p>
<pre><code>$ ldd MainParser
	linux-vdso.so.1 (0x00007fff1d19f000)
	libm.so.6 =&gt; /lib/x86_64-linux-gnu/libm.so.6 (0x00007f92fac94000)
	libicuuc.so.57 =&gt; not found
	libicui18n.so.57 =&gt; not found
	libicudata.so.57 =&gt; not found
	libtinfo.so.5 =&gt; /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f92faa6a000)
	librt.so.1 =&gt; /lib/x86_64-linux-gnu/librt.so.1 (0x00007f92fa862000)
	libutil.so.1 =&gt; /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f92fa65f000)
	libdl.so.2 =&gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f92fa45b000)
	libpthread.so.0 =&gt; /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f92fa23c000)
	libgmp.so.10 =&gt; /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f92f9fbb000)
	libc.so.6 =&gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f92f9bca000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f92fb032000)
</code></pre>
<p>部署实在是很痛苦。我们来静态编译来解决这个问题。</p>
<p>在 <code>package.yaml</code> 的 <code>executables</code> 里加入如下几行：</p>
<pre><code>ghc-options: -Wall -O2 -static -threaded
cc-options: -static
ld-options: -static -pthread
</code></pre>
<p>在最外层声明用到的库：</p>
<pre><code>extra-libraries: icuuc icudata icui18n stdc++
</code></pre>
<p><code>stack build</code> 编译，会发现如下警告：</p>
<pre><code>     warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
</code></pre>
<p>不用管他，我们几乎不可能会遇到缺这种情况。我用 <code>alpine</code> 试了一下，<code>musl</code> 是可以正常运行的，看起来不一定需要 <code>glibc</code>。</p>
<p><code>file</code> 一下，编译的二进制果然是静态的：</p>
<pre><code>$ file ~/.local/bin/out-exe 
/root/.local/bin/out-exe: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=60b77954d518087e2421560cbfcef152d71ab337, stripped
</code></pre>
<p>当然了，这样一来程序的体积会非常大。不过这也是没有办法的事情。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[关于黑苹果的 USB 映射]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>随便写写经验，毕竟授人以鱼不如授人以渔。这玩意还挺复杂的，淘宝店都搞不定。</p>
<p>说到淘宝店也是气。这台电脑的 USB 2.0 一直搞不定，本着刺激经济节约时间的原则找了淘宝店解决。结果不仅没解决还嘲讽我「USB 总线，懂不懂？」</p>
<p>素质真的差，👴写 Verilog 串口的时候你都不知道在哪……当我大学白读的咯</p>
<p>会搞一台黑苹果的原因很简单，Mac mini 2018 实在是不太行。磁盘满了没有升级空间（这个能忍）。最重大的问题还是显卡。祖传 UHD 630 性能实在是太烂了，launchpad 都卡。eGPU 我也有，华硕的 RX580 Gaming Box。但是噪音实在是太大，休眠后不会自动关闭风扇，而那个 PSU 的风扇声音实在是过于尖锐，晚上吵得真的难受。</p>
<p>再加上各种 bug，比如接着 eGPU</p>]]></description><link>https://mechanus.io/guan-yu-hei-ping-guo-de-usb-ying-she/</link><guid isPermaLink="false">5e9bf5d345ddd800012c067e</guid><category><![CDATA[Hacks]]></category><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Sun, 19 Apr 2020 08:22:02 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>随便写写经验，毕竟授人以鱼不如授人以渔。这玩意还挺复杂的，淘宝店都搞不定。</p>
<p>说到淘宝店也是气。这台电脑的 USB 2.0 一直搞不定，本着刺激经济节约时间的原则找了淘宝店解决。结果不仅没解决还嘲讽我「USB 总线，懂不懂？」</p>
<p>素质真的差，👴写 Verilog 串口的时候你都不知道在哪……当我大学白读的咯</p>
<p>会搞一台黑苹果的原因很简单，Mac mini 2018 实在是不太行。磁盘满了没有升级空间（这个能忍）。最重大的问题还是显卡。祖传 UHD 630 性能实在是太烂了，launchpad 都卡。eGPU 我也有，华硕的 RX580 Gaming Box。但是噪音实在是太大，休眠后不会自动关闭风扇，而那个 PSU 的风扇声音实在是过于尖锐，晚上吵得真的难受。</p>
<p>再加上各种 bug，比如接着 eGPU 开机会白屏/绿屏以及 Boot Camp 糟糕的支持。苹果花了整整半年才让 Boot Camp Assistant 支持 4GB 以上的 <code>install.wim</code>。eGPU 在 Windows 下也很玄学，必须在 boot 阶段一个特定的时间插入才能正确识别。</p>
<p>所以组了台黑果。如果白果根本不能让我省心那我为啥要忍呢……</p>
<p>我选择的是华擎 B450M Pro 4 主板，CPU 用的是 3600（硬盘是从 homelab 里拆出来的 SN500，内存显卡是 Kijiji 收的二手）。大家不要学我，这算是超级 budget build 了。我当时也是纯粹为了娱乐，看看在满足需求的情况下到底预算能被压到多低。</p>
<p>这块主板使用 macOS 自带的 iMacPro1,1 映射会导致所有的 USB 2.0 端口（包括 internal header）不能识别。虽然我真的不在乎，但是由于蓝牙是接在 USB 2.0 header 下的，这基本就导致所有 continuity 功能废掉。</p>
<p><strong>小结：如果 USB 有端口不能用，需要自己做 USB 映射。一个常见的原因是 macOS 不允许一个 USB 控制器下有超过 15 个 ACPI Port （以下用端口代指）</strong></p>
<p>DSDT 是一台电脑的硬件描述。我这台电脑的 DSDT 比较神奇，里面并没有列出所有的 USB 端口。DSDT 可以通过 <a href="https://github.com/acidanthera/MaciASL">MaciASL</a> 软件看到，打开后会默认加载当前的 DSDT。搜索 <code>XHC</code> (USB 3.0)或者 <code>EHC</code> (USB 2.0) 可以看到 USB 控制器和端口。</p>
<p><img src="https://mechanus.io/content/images/2020/04/Screen-Shot-2020-04-19-at-3.24.23-AM.png" alt="Screen-Shot-2020-04-19-at-3.24.23-AM"></p>
<p>一台电脑虽然看起来 USB 端口不多，但是一个物理的 USB 3.0 端口是分别算作一个 2.0 和 3.0 设备的，所以这个 15 设备每控制器的限制还是很容易超过的。（这也是为啥 USB 3.0 设备慢慢插入会变成 2.0 设备的理由，USB 3.0 前 4 pin 接的是控制器的 2.0）。</p>
<p>大部分情况下，可能是一个控制器下有超过 15 个端口。这种情况很好搞，用 <a href="https://developer.apple.com/downloads">IORegistryExplorer</a> 看看具体有哪些端口需要被使用。找一个 USB 3.0 Hub，挨个端口插进去试试，分别记录下 USB 2.0 和 3.0 的端口路径。以后做映射的时候需要用到。</p>
<p>也有可能是控制器的名字冲突了（比如 XHC1 就会冲突，在我印象里）。这种情况比较简单，重命名就好了，Mapping 也很好写，基本一致，只是改个控制器名字。</p>
<p>我这种情况就比较难受，因为主板自带的 DSDT 有点问题。解决方式是保存一个 dump，删除 USB 控制器下的所有描述并且用 OpenCore 加载这个 DSDT。这样一来 macOS 就会重建 DSDT。</p>
<p>同样的，在 IOReg 配合 USB3.0 Hub 看看具体需要哪些端口，记录下端口路径和类型。类型有如下几种：</p>
<pre><code>0: USB 2.0 Type-A connector
3: USB 3.0 Type-A connector
8: Type C connector - USB 2.0-only
9: Type C connector - USB 2.0 and USB 3.0 with Switch, flipping the device **doesn't** change the ACPI port
10: Type C connector - USB 2.0 and USB 3.0 without Switch, flipping the device **does** change the ACPI port
255: Proprietary connector - For Internal USB ports like Bluetooth
</code></pre>
<p><img src="https://mechanus.io/content/images/2020/04/Screen-Shot-2020-04-19-at-4.10.01-AM.png" alt="Screen-Shot-2020-04-19-at-4.10.01-AM"><br>
用 USB Hub 的原因是它同时是一个 USB 2.0 和 3.0 设备，比如这里我们就很容易判断 PRT4 是 2.0 端口，PRT8 是 3.0 端口。</p>
<p>注意 Type-C 分 switch 和 non-switch，区别是 switch 在翻转设备后还是同一个 ACPI Port，non-switch 则不是。</p>
<p>接下来就可以开始写自己的 kext 了。放上我自己的，大家照葫芦画瓢即可。</p>
<p>需要注意的是这里的 <code>IONameMatch</code> 键值是控制器的名字（可以自定义），<code>port-count</code> 是每个控制器下最大的端口路径。别的都挺顾名思义的。</p>
<pre><code>$ cat USBMap.kext/Contents/Info.plist

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
&lt;plist version=&quot;1.0&quot;&gt;
&lt;dict&gt;
	&lt;key&gt;CFBundleDevelopmentRegion&lt;/key&gt;
	&lt;string&gt;English&lt;/string&gt;
	&lt;key&gt;CFBundleGetInfoString&lt;/key&gt;
	&lt;string&gt;ASRock B450m Pro 4 USB map&lt;/string&gt;
	&lt;key&gt;CFBundleIdentifier&lt;/key&gt;
	&lt;string&gt;com.asrock.B450mPro4.USBmap&lt;/string&gt;
	&lt;key&gt;CFBundleInfoDictionaryVersion&lt;/key&gt;
	&lt;string&gt;6.0&lt;/string&gt;
	&lt;key&gt;CFBundleName&lt;/key&gt;
	&lt;string&gt;ASRock B450m Pro 4 USB map&lt;/string&gt;
	&lt;key&gt;CFBundlePackageType&lt;/key&gt;
	&lt;string&gt;KEXT&lt;/string&gt;
	&lt;key&gt;CFBundleShortVersionString&lt;/key&gt;
	&lt;string&gt;1.2&lt;/string&gt;
	&lt;key&gt;CFBundleSignature&lt;/key&gt;
	&lt;string&gt;????&lt;/string&gt;
	&lt;key&gt;CFBundleVersion&lt;/key&gt;
	&lt;string&gt;1.2&lt;/string&gt;
	&lt;key&gt;IOKitPersonalities_x86_64&lt;/key&gt;
	&lt;dict&gt;
		&lt;key&gt;iMacPro1,1-PTXH&lt;/key&gt;
		&lt;dict&gt;
			&lt;key&gt;CFBundleIdentifier&lt;/key&gt;
			&lt;string&gt;com.apple.driver.AppleUSBHostMergeProperties&lt;/string&gt;
			&lt;key&gt;IOClass&lt;/key&gt;
			&lt;string&gt;AppleUSBHostMergeProperties&lt;/string&gt;
			&lt;key&gt;IONameMatch&lt;/key&gt;
			&lt;string&gt;PTXH&lt;/string&gt;
			&lt;key&gt;IOProviderClass&lt;/key&gt;
			&lt;string&gt;AppleUSBXHCIPCI&lt;/string&gt;
			&lt;key&gt;IOProviderMergeProperties&lt;/key&gt;
			&lt;dict&gt;
				&lt;key&gt;port-count&lt;/key&gt;
				&lt;data&gt;DgAAAA==&lt;/data&gt;
				&lt;key&gt;ports&lt;/key&gt;
				&lt;dict&gt;
					&lt;key&gt;PRT1&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Front USB 2.0 port, middle&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;0&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;DAAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT10&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Front USB bottom, 2.0&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;0&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;BgAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT11&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Front USB bottom, 3.0&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;3&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;BAAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT2&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Front USB 2.0 port, top&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;0&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;DQAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT3&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Back USB 2.0 port, Top left&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;0&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;CgAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT4&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Back USB 2.0 port, Top right&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;0&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;CQAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT5&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Back USB 3.0 Port, second row&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;3&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;AgAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT6&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Back USB 2.0 Port, second row&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;0&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;CAAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT7&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Back USB Type C 2.0 Port&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;9&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;BQAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT8&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Back USB Type C 3.0 Port&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;9&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;AQAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT9&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Internal BT Interface, USB2.0&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;255&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;DgAAAA==&lt;/data&gt;
					&lt;/dict&gt;
				&lt;/dict&gt;
			&lt;/dict&gt;
			&lt;key&gt;model&lt;/key&gt;
			&lt;string&gt;iMacPro1,1&lt;/string&gt;
		&lt;/dict&gt;
		&lt;key&gt;iMacPro1,1-XHC0&lt;/key&gt;
		&lt;dict&gt;
			&lt;key&gt;CFBundleIdentifier&lt;/key&gt;
			&lt;string&gt;com.apple.driver.AppleUSBHostMergeProperties&lt;/string&gt;
			&lt;key&gt;IOClass&lt;/key&gt;
			&lt;string&gt;AppleUSBHostMergeProperties&lt;/string&gt;
			&lt;key&gt;IONameMatch&lt;/key&gt;
			&lt;string&gt;XHC0&lt;/string&gt;
			&lt;key&gt;IOProviderClass&lt;/key&gt;
			&lt;string&gt;AppleUSBXHCIPCI&lt;/string&gt;
			&lt;key&gt;IOProviderMergeProperties&lt;/key&gt;
			&lt;dict&gt;
				&lt;key&gt;port-count&lt;/key&gt;
				&lt;data&gt;CAAAAA==&lt;/data&gt;
				&lt;key&gt;ports&lt;/key&gt;
				&lt;dict&gt;
					&lt;key&gt;PRT1&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Rear USB 2.0 port, fourth row left&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;0&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;AQAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT2&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Rear USB 2.0 port, fourth row right&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;0&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;AgAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT3&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Rear USB 2.0 port, third row right&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;0&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;AwAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT4&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Rear USB 2.0 port, third row left&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;0&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;BAAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT5&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Rear USB 3.0 port, fourth row left&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;3&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;BQAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT6&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Rear USB 3.0 port, fourth row right&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;3&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;BgAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT7&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Rear USB 3.0 port, third row right&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;3&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;BwAAAA==&lt;/data&gt;
					&lt;/dict&gt;
					&lt;key&gt;PRT8&lt;/key&gt;
					&lt;dict&gt;
						&lt;key&gt;Comment&lt;/key&gt;
						&lt;string&gt;Rear USB 3.0 port, third row left&lt;/string&gt;
						&lt;key&gt;UsbConnector&lt;/key&gt;
						&lt;integer&gt;3&lt;/integer&gt;
						&lt;key&gt;port&lt;/key&gt;
						&lt;data&gt;CAAAAA==&lt;/data&gt;
					&lt;/dict&gt;
				&lt;/dict&gt;
			&lt;/dict&gt;
			&lt;key&gt;model&lt;/key&gt;
			&lt;string&gt;iMacPro1,1&lt;/string&gt;
		&lt;/dict&gt;
	&lt;/dict&gt;
	&lt;key&gt;LSMinimumSystemVersion&lt;/key&gt;
	&lt;string&gt;10.15&lt;/string&gt;
	&lt;key&gt;OSBundleCompatibleVersion&lt;/key&gt;
	&lt;string&gt;1.0&lt;/string&gt;
	&lt;key&gt;OSBundleLibraries&lt;/key&gt;
	&lt;dict&gt;
		&lt;key&gt;com.apple.driver.AppleUSBHostMergeProperties&lt;/key&gt;
		&lt;string&gt;1.2&lt;/string&gt;
	&lt;/dict&gt;
	&lt;key&gt;OSBundleRequired&lt;/key&gt;
	&lt;string&gt;Root&lt;/string&gt;
&lt;/dict&gt;
&lt;/plist&gt;
</code></pre>
<h1 id="onemorething">One more thing</h1>
<p>尽量不要组 AMD 黑果，大问题没有，小问题蛮多。比如 <code>vm.hypervisor</code> 框架用不了（导致 Docker、PD、VMware 都不能用）。还有就是随航不能用（需要 iGPU）以及显卡性能贼烂（这个比较致命，和 AMD 的 PCI-e 有点关系）。</p>
<p>建议用 git 管理 efi 分区，托管到 GitHub。太方便了，翻车直接回滚。</p>
<h1 id="bibliography">Bibliography</h1>
<p><a href="https://aplus.rs/2020/usb-mapping-how/">https://aplus.rs/2020/usb-mapping-how/</a><br>
<a href="https://github.com/AMD-OSX/AMD_Vanilla">https://github.com/AMD-OSX/AMD_Vanilla</a><br>
<a href="https://github.com/khronokernel/Opencore-Vanilla-Desktop-Guide/blob/master/AMD/AMD-USB-map.md">https://github.com/khronokernel/Opencore-Vanilla-Desktop-Guide/blob/master/AMD/AMD-USB-map.md</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Haskell 学习笔记四：Applicative]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Applicative 这玩意说起来复杂，其实和 Functor 也差不多，都是一种 typeclass。</p>
<p>祖师爷 Dijkstra 曾经说过：</p>
<blockquote>
<p>A formula is worth a thousand pictures</p>
</blockquote>
<p>很多东西嘛，用文字表达真的麻烦，看看声明就懂了：</p>
<pre><code>class (Functor f) =&gt; Applicative f where  
    pure :: a -&gt; f a  
    (&lt;*&gt;) :: f (a -&gt; b) -&gt; f a -&gt; f b  
</code></pre>
<p>第一行：Applicative</p>]]></description><link>https://mechanus.io/haskell-xue-xi-bi-ji-si-applicative/</link><guid isPermaLink="false">5e97c3fc45ddd800012c05d0</guid><category><![CDATA[Hacks]]></category><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Thu, 16 Apr 2020 04:18:11 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Applicative 这玩意说起来复杂，其实和 Functor 也差不多，都是一种 typeclass。</p>
<p>祖师爷 Dijkstra 曾经说过：</p>
<blockquote>
<p>A formula is worth a thousand pictures</p>
</blockquote>
<p>很多东西嘛，用文字表达真的麻烦，看看声明就懂了：</p>
<pre><code>class (Functor f) =&gt; Applicative f where  
    pure :: a -&gt; f a  
    (&lt;*&gt;) :: f (a -&gt; b) -&gt; f a -&gt; f b  
</code></pre>
<p>第一行：Applicative 是一种 Functor。一个 typeclass 要成为一个 Applicative，它必须首先是一个 Functor。<br>
第二行：Applicative 必须实现 <code>pure</code> 函数。它的参数是任何东西（值或者函数都可以），输出是一个装着这个参数的默认的盒子。<br>
第三行：Applicative 必须实现 <code>&lt;*&gt;</code> 函数。第一个输入是【装着函数的盒子】（wrapped function），第二个输入是一个 wrapped value。</p>
<p>听起来可能会很复杂，但是最重要的就是：函数本身也是可以被装进盒子的（上次讲过了）。<code>&lt;*&gt;</code> 接受的第一个参数就是一个 <code>a -&gt; b</code>函数的盒子。</p>
<p>举个例子：</p>
<pre><code>Prelude&gt; Just (+1) &lt;*&gt; Just (1)
Just 2
</code></pre>
<p><code>Maybe</code> 是一个 Applicative。通过 <code>&lt;*&gt;</code>，我们可以把一个函数的包裹和另一个值的包裹串起来。</p>
<p>我们再来看看 <code>Maybe</code> 的实现代码：</p>
<pre><code>instance Applicative Maybe where
    pure = Just

    Just f  &lt;*&gt; m       = fmap f m
    Nothing &lt;*&gt; _m      = Nothing
</code></pre>
<p><code>pure</code> 作为最基本最简单的【装进盒子】操作，当然是直接等同于 <code>Just</code> 了。<code>&lt;*&gt;</code> 也很简单，把 <code>f</code> 拿出来，用上次讲过的 <code>fmap</code> 串一串。出来的也是一个 wrapped value（不要忘了 Applicative 必须是 Functor）。</p>
<p>非常简洁优雅。有了 Applicative，你就可以这样：</p>
<pre><code>Prelude&gt;  (+) &lt;$&gt; (Just 1) &lt;*&gt; (Just 2)
Just 3
</code></pre>
<p>相对比没有用 Applicative 的版本：</p>
<pre><code>Prelude&gt; (+) 1 2
3
</code></pre>
<p>完 全 一 致，把一个普通的函数用在 Applicative 上实在是非常简单。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Haskell 学习笔记三：Functors]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id="functorsapplicativesmonads">Functors, Applicatives 和 Monads</h1>
<p>这里估计是最劝退的地方了，我会尽量用简单的语言描述。网上的很多资源说得太复杂了，天知道劝退了多少人，我第一次看的时候完全看不懂他们在说什么。</p>
<h2 id="functors">Functors</h2>
<p>问：什么是 Functors?</p>
<p>我的回答：Functor 说白了就是一种属性（准确来说叫 <code>typeclass</code>，你把它想象成 Java 的 <code>Interface</code>），Functor 里面包着另外一个数据。一个数据类型只要实现了这个属性就是 <code>Functor</code>。</p>
<p>超级简单是不是？就像一个盒子，盒子里面是另外一个东西。这个盒子就是 Functor。</p>
<p>举个例子就好理解多了。Haskell 有内置一个数据类型叫 <code>Maybe</code>（就是 Java 的 <code>Optional</code>，Haskell 太先进了以至于大家都要抄），是这样的：</p>
<pre><code>data Maybe a = Nothing | Just a
</code></pre>
<p>是不是真的和 Java</p>]]></description><link>https://mechanus.io/haskell-xue-xi-bi-ji-san-functors/</link><guid isPermaLink="false">5e940e4345ddd800012c05bb</guid><category><![CDATA[Hacks]]></category><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Mon, 13 Apr 2020 07:02:24 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="functorsapplicativesmonads">Functors, Applicatives 和 Monads</h1>
<p>这里估计是最劝退的地方了，我会尽量用简单的语言描述。网上的很多资源说得太复杂了，天知道劝退了多少人，我第一次看的时候完全看不懂他们在说什么。</p>
<h2 id="functors">Functors</h2>
<p>问：什么是 Functors?</p>
<p>我的回答：Functor 说白了就是一种属性（准确来说叫 <code>typeclass</code>，你把它想象成 Java 的 <code>Interface</code>），Functor 里面包着另外一个数据。一个数据类型只要实现了这个属性就是 <code>Functor</code>。</p>
<p>超级简单是不是？就像一个盒子，盒子里面是另外一个东西。这个盒子就是 Functor。</p>
<p>举个例子就好理解多了。Haskell 有内置一个数据类型叫 <code>Maybe</code>（就是 Java 的 <code>Optional</code>，Haskell 太先进了以至于大家都要抄），是这样的：</p>
<pre><code>data Maybe a = Nothing | Just a
</code></pre>
<p>是不是真的和 Java 的 <code>Optional</code> 一模一样，要么没有（Nothing），要么有（Just a）。</p>
<p>一个 functor 必须实现以下的函数：</p>
<pre><code>class Functor f where

  fmap :: (a -&gt; b) -&gt; f a -&gt; f b
</code></pre>
<p>class 在这里是 typeclass 的关键字，同样你把它想象成 interface。</p>
<p><code>fmap</code> 是一个函数，参数是一个函数和一个 functor。fmap 会把 functor 里面的值喂给这个函数，返回的结果包在一个新的 functor 里。它和 <code>&lt;$&gt;</code> 是同义词（想象成 C 的 #define），一模一样。<code>fmap a b</code> 可以写成 <code>a &lt;$&gt; b</code>。</p>
<p>想象一下，盒子里面有一个老婆。老婆被拿出来做成了老婆饼。老婆饼被装进了一个新的盒子并返回。</p>
<p>回到刚才那个 <code>Maybe</code> 的例子。<code>Maybe</code> 作为一个 Functor，就实现了这几个函数。具体的实现代码是这样的：</p>
<pre><code>instance  Functor Maybe  where
    fmap _ Nothing       = Nothing
    fmap f (Just a)      = Just (f a)
</code></pre>
<p>超级简单是不是。不要被 <code>instance Functor</code> 吓到，其实就是 Java 的 <code>implements Functor</code>。</p>
<p>上手试试吧：</p>
<pre><code>Main&gt; fmap (+1) (Just 0)
Just 1
</code></pre>
<p>在这里，盒子是（Just 0）。盒子里面装着老婆（0）。老婆（0）被做（+1）成了老婆饼（1）。老婆饼（1）被装进了盒子（Just 1）并且出货了。</p>
<p>你甚至还可以 <code>fmap (+) (Just 1)</code>，这样出来的就是一个装着函数的盒子。仔细想想，它其实是符合类型签名的。</p>
<p>你肯定懂了。</p>
<p>下一集：<a href="https://mechanus.io/haskell-xue-xi-bi-ji-si-applicative/">Haskell 学习笔记四：Applicative</a></p>
<!--kg-card-end: markdown--><p></p>]]></content:encoded></item><item><title><![CDATA[Haskell 学习笔记二：数据类型]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Haskell 拥有非常神奇且优秀的数据类型系统。它非常先进，一些理念被其他的语言所借鉴，比如 Java 的 <code>&lt;T&gt;</code> (generics)。</p>
<p>举个例子：</p>
<pre><code>data Bool = True | False
</code></pre>
<p>这里就定义了 <code>Bool</code> 类型。<code>Bool</code> 可以是 <code>True</code> 或者 <code>False</code>，<strong>他们都是 <code>Bool</code></strong>。</p>
<p>对 OOP 熟悉的同学肯定对 <code>polymorphism</code> 的概念了然于胸。Haskell 的类型系统会让你对 polymorphism 的理解更上层楼，它简直就是艺术品 <s>，写代码像写诗</s>。</p>
<p>再举个例子，</p>
<pre><code>data Coordinate = MkCoordinate Integer Integer
</code></pre>
<p>这里我们定义了 <code>Coordinate</code> 类型，数据是两个 Integer。<code>MkCoordinate</code> 被称为</p>]]></description><link>https://mechanus.io/haskell-xue-xi-bi-ji-er-shu-ju-lei-xing/</link><guid isPermaLink="false">5e93f9e745ddd800012c0461</guid><category><![CDATA[Hacks]]></category><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Mon, 13 Apr 2020 07:02:03 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Haskell 拥有非常神奇且优秀的数据类型系统。它非常先进，一些理念被其他的语言所借鉴，比如 Java 的 <code>&lt;T&gt;</code> (generics)。</p>
<p>举个例子：</p>
<pre><code>data Bool = True | False
</code></pre>
<p>这里就定义了 <code>Bool</code> 类型。<code>Bool</code> 可以是 <code>True</code> 或者 <code>False</code>，<strong>他们都是 <code>Bool</code></strong>。</p>
<p>对 OOP 熟悉的同学肯定对 <code>polymorphism</code> 的概念了然于胸。Haskell 的类型系统会让你对 polymorphism 的理解更上层楼，它简直就是艺术品 <s>，写代码像写诗</s>。</p>
<p>再举个例子，</p>
<pre><code>data Coordinate = MkCoordinate Integer Integer
</code></pre>
<p>这里我们定义了 <code>Coordinate</code> 类型，数据是两个 Integer。<code>MkCoordinate</code> 被称为 constructor。新建一个实例的时候需要用到 constructor，后面跟具体的数据。比如新建一个 (0, 0) 的坐标（Coordinate）的话只需要这么做：</p>
<pre><code>MkCoordinate 0 0
</code></pre>
<p>非常优雅，不是吗？</p>
<h1 id="generics">Generics</h1>
<p>Haskell 一大令人称赞的设计是它的 generics。</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">&quot;How many hacks around Go&#39;s lack of generics are you on?&quot;<br>&quot;3. Maybe 4.&quot;<br>&quot;You are like baby! Watch this&quot;<a href="https://t.co/1geXOEP3jd">https://t.co/1geXOEP3jd</a><br>h/t <a href="https://twitter.com/bascule?ref_src=twsrc%5Etfw">@bascule</a> <a href="https://t.co/83izWFCyn7">pic.twitter.com/83izWFCyn7</a></p>&mdash; Keith 🔰🐈🥑🏴 (@mosheroperandi) <a href="https://twitter.com/mosheroperandi/status/856946180810354688?ref_src=twsrc%5Etfw">April 25, 2017</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>⬆️这样的事情在21世纪发生简直是不可容忍的！</p>
<p>回到我们刚刚的例子，我们的 <code>Coordinate</code> 类型只能接受两个 <code>Integer</code>，如果我们想让他接受其他的类型，比如 <code>Int</code><sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>、<code>Float</code> 甚至虚数<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>呢？</p>
<pre><code>data Coordinate2 a = MkCoordinate2 a a
</code></pre>
<p>这里我们用到了 generics，我的理解是这是一个 <code>Coordinate2 of a</code> 的类型，而 <code>a</code> 可以是任何类型。<code>MkCoordinate2</code> 现在可以跟任何类型的两个参数，比如 <code>MkCoordiante2 1 1</code> 或者 <code>MkCoordinate2 0.1 1.5</code>。</p>
<p>如果更进一步，我们想要它能接受两个不同类型的参数呢？</p>
<pre><code>data Coordinate3 a b = MkCoordinate3 a b
</code></pre>
<p>很简单对吧。</p>
<p>再进一步，有时候可能这个坐标根本就不存在，我们想加上一个 <code>Null</code> 状态来表达这种情况，可以吗？</p>
<p>结合最上面写过的，可以这么做：</p>
<pre><code>data Coordinate4 a b = MkCoordinate4 a b | Null
</code></pre>
<p>简直像写诗，对吧。有坐标的时候用 <code>MkCoordinate4</code>，没有的时候用 <code>Null</code>。他们都是 <code>Coordinate4</code> 类型。Polymorphism！</p>
<p>同样，一个函数要接受 generics 也很简单。比如我们自己定义一个 <code>toList</code> 函数，它接受一个参数，返回一个 <code>list</code>，里面包含着我们的输入：</p>
<pre><code>toList :: a -&gt; [a]
toList i = [i]
</code></pre>
<p>运行起来是这样的：</p>
<pre><code>*Main&gt; toList 1
[1]
*Main&gt; toList &quot;hello&quot;
[&quot;hello&quot;]
</code></pre>
<p>注意它可以接受任何类型的输入，简直太优雅了对不对。</p>
<p>下一集：<a href="https://mechanus.io/haskell-xue-xi-bi-ji-san-functors/">Haskell 学习笔记三：Functors</a></p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>Int 和 Integer 的区别在于，Int 是有限位数的，更像 C 的整数。Integer 可以无限大，更像数学上的整数。 <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p>看到这里的时候你应该已经能很轻松地写出自己的虚数类型了 <a href="#fnref2" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Haskell 学习笔记一：基础]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>这是一个新的系列，主要讲讲我在学习 Haskell 的过程中遇到的一些坑和心得，希望能用最简单的语言给初学者提供一些帮助。整个系列预计会有三到四篇博文。主要会包含：</p>
<ul>
<li>Basics</li>
<li>数据类型</li>
<li>Functors, Applicatives, Monads</li>
<li>State</li>
<li>Parser</li>
<li>Interpreter</li>
</ul>
<p>会写这个系列的原因是因为在初期我学得实在是太痛苦了，但是入门之后被深深折服，Haskell 实在是太优雅了。</p>
<p>Haskell 实在是是一门无比优雅且深奥的语言。才疏学浅<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>，只能窥得冰山一角，权当抛砖引玉。</p>
<p>在写作过程中有参考多伦多大学 Albert Lai 教授的课程设计。</p>
<p>希望能给中文世界的各位一些帮助。<br>
<s>这玩意在工业界流行不起来是有理由的，再牛逼也得有人学并且学得会是不是</s></p>
<h1 id="eva00">Eva-00</h1>
<p><s>this should be in ayanami blue</s></p>
<p>Haskell 是一门函数式编程（functional programming, FP）语言。和我们最常接触的面向过程（procedural programming）和面向对象（object</p>]]></description><link>https://mechanus.io/haskell-xue-xi-bi-ji-yi-ji-chu/</link><guid isPermaLink="false">5e9289bc45ddd800012c036d</guid><category><![CDATA[Hacks]]></category><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Sun, 12 Apr 2020 05:27:05 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>这是一个新的系列，主要讲讲我在学习 Haskell 的过程中遇到的一些坑和心得，希望能用最简单的语言给初学者提供一些帮助。整个系列预计会有三到四篇博文。主要会包含：</p>
<ul>
<li>Basics</li>
<li>数据类型</li>
<li>Functors, Applicatives, Monads</li>
<li>State</li>
<li>Parser</li>
<li>Interpreter</li>
</ul>
<p>会写这个系列的原因是因为在初期我学得实在是太痛苦了，但是入门之后被深深折服，Haskell 实在是太优雅了。</p>
<p>Haskell 实在是是一门无比优雅且深奥的语言。才疏学浅<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>，只能窥得冰山一角，权当抛砖引玉。</p>
<p>在写作过程中有参考多伦多大学 Albert Lai 教授的课程设计。</p>
<p>希望能给中文世界的各位一些帮助。<br>
<s>这玩意在工业界流行不起来是有理由的，再牛逼也得有人学并且学得会是不是</s></p>
<h1 id="eva00">Eva-00</h1>
<p><s>this should be in ayanami blue</s></p>
<p>Haskell 是一门函数式编程（functional programming, FP）语言。和我们最常接触的面向过程（procedural programming）和面向对象（object oriented programming, OOP）不同，函数式编程更像数学上的函数。一个显著的差别是 Haskell 几乎没有变量（其实是有的，但是我们先放在一边，因为确实和你想的不太一样）。对于习惯了 C 之类的我们来讲，学起来确实还是相当痛苦的。</p>
<p>我不打算覆盖很多的基础内容，互联网上有很多比我写得更好的资源。不过如果有需求的话可以加上一些。这个系列的主要目的是写写我在学习过程中遇到的难点。</p>
<p>国际惯例，先来一发 Hello World</p>
<pre><code>main :: IO ()
main = putStrLn &quot;Hello, World!&quot;
</code></pre>
<h1 id>函数</h1>
<p>Haskell 的函数非常类似数学上的函数。</p>
<pre><code>factorial :: Integer -&gt; Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
</code></pre>
<p>这是一个很简单的 factorial 函数。意思是给一个数，输出这个数的阶乘。</p>
<p>第一行：类型签名（type signature)，输入一个整数，输出一个整数<br>
二到三行：pattern matching（模式匹配？不知道正式翻译是啥）。这是非常有意思的地方。<br>
第二行：如果输入是 0，则输出 1<br>
第三行：如果不是，就递归输出它的结果（n*factorial(n-1))。</p>
<p>在 Haskell 里，执行函数会从前往后匹配，并且执行匹配到的区块。</p>
<p>调用它的方法也和其他的语言很不同，直接函数名+空格+输入，比如 <code>factorial 0</code></p>
<p>同样的，如果有一个函数是这样的：</p>
<pre><code>add2 :: Integer -&gt; Integer -&gt; Integer
add2 x y = x + y
</code></pre>
<p><code>add2</code> 则接受两个 Integer 类型的输入，有一个 Integer 类型的输出。</p>
<p>但是魔法来了。如果只给 <code>add2</code> 提供了一个参数呢？</p>
<p><code>Integer -&gt; Integer -&gt; Integer</code> 事实上和 <code>Integer -&gt; (Integer -&gt; Integer)</code> 是一样的，即 add2 函数收到第一个 integer 输入的时候返回的是另一个类型是 <code>Integer -&gt; Integer</code> 的函数，第二个输入则被提供给这个函数。</p>
<p>举个例子，<code>(add2 0)</code>，返回的就是一个类型为 <code>Integer -&gt; Integer</code> 的函数。<code>(add2 0) 1</code> 则把 <code>1</code> 作为输入提供给了 <code>(add2 0)</code> 返回的函数，得到我们想要的结果。<code>(add2 0) 1</code> 和 <code>add2 0 1</code> 是一样的。</p>
<p>今天先到这里。</p>
<p>下一集：<a href="https://mechanus.io/haskell-xue-xi-bi-ji-er-shu-ju-lei-xing/">Haskell 学习笔记二：数据类型</a></p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>真的不是谦虚 <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[《寄生虫》]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>《寄生虫》是少有的一部让我看不下去、需要断断续续的中场休息的电影——它太沉重了，编剧对剧情环节的安排实在是引人揪心——它太「真实」了。说来我们对「真实」的理解也是一件很讽刺的事情，「真实」每天都在现实生活中发生而我们却熟视无睹，可搬上了荧幕反而倒是看不下去了。</p>
<p>这是一部通俗又学院派的电影，熟练艺术手法的运用——蒙太奇、对比、色彩、配乐，韩国电影在取消审核制度之后远远把其他亚洲电影抛在了后头（印度的歌舞、中国的武侠、日本的动画电影这种根植于本国文化且外人没有可能做好的算是例外），即便上世纪中国和日本电影都有着辉煌的过去。</p>
<p>也因此随便写一写自己的想法。</p>
<h2 id>谁是寄生虫？</h2>
<p>我们都知道主角一家是寄生虫，不过我们还是先来看一看海报。<br>
<img src="https://mechanus.io/content/images/2020/02/parasite-film-tribute-1.jpg" alt="parasite-film-tribute-1"></p>
<p>海报上出现了两家人，每个人的眼睛都被涂去了。</p>
<p>主角一家人是寄生虫毋庸置疑——偷鸡摸狗、鸠占鹊巢，不惜陷害他人、让他人失去收入来源也要寄生在朴社长家里。市井小民的丑恶被刻画得淋漓尽致——干正经事业不行，但耍心机干坏事一把好手。这几个角色实在是太典型了，可以毫不犹豫的算计第一次见面的人，也算是他们生存的方式。</p>
<p>朴家呢？<br>
大企业的社长，谈吐不凡，儒雅随和，出手阔绰。太太则是彻头彻尾的白洁女性的极致，无工作能力也不承担家务，对世界虽有防备，</p>]]></description><link>https://mechanus.io/ji-sheng-chong/</link><guid isPermaLink="false">5e49139e7acabc0001dde229</guid><category><![CDATA[Ink Bottle]]></category><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Sun, 16 Feb 2020 13:26:16 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>《寄生虫》是少有的一部让我看不下去、需要断断续续的中场休息的电影——它太沉重了，编剧对剧情环节的安排实在是引人揪心——它太「真实」了。说来我们对「真实」的理解也是一件很讽刺的事情，「真实」每天都在现实生活中发生而我们却熟视无睹，可搬上了荧幕反而倒是看不下去了。</p>
<p>这是一部通俗又学院派的电影，熟练艺术手法的运用——蒙太奇、对比、色彩、配乐，韩国电影在取消审核制度之后远远把其他亚洲电影抛在了后头（印度的歌舞、中国的武侠、日本的动画电影这种根植于本国文化且外人没有可能做好的算是例外），即便上世纪中国和日本电影都有着辉煌的过去。</p>
<p>也因此随便写一写自己的想法。</p>
<h2 id>谁是寄生虫？</h2>
<p>我们都知道主角一家是寄生虫，不过我们还是先来看一看海报。<br>
<img src="https://mechanus.io/content/images/2020/02/parasite-film-tribute-1.jpg" alt="parasite-film-tribute-1"></p>
<p>海报上出现了两家人，每个人的眼睛都被涂去了。</p>
<p>主角一家人是寄生虫毋庸置疑——偷鸡摸狗、鸠占鹊巢，不惜陷害他人、让他人失去收入来源也要寄生在朴社长家里。市井小民的丑恶被刻画得淋漓尽致——干正经事业不行，但耍心机干坏事一把好手。这几个角色实在是太典型了，可以毫不犹豫的算计第一次见面的人，也算是他们生存的方式。</p>
<p>朴家呢？<br>
大企业的社长，谈吐不凡，儒雅随和，出手阔绰。太太则是彻头彻尾的白洁女性的极致，无工作能力也不承担家务，对世界虽有防备，但也是停留在如下等级。<br>
<img src="https://mechanus.io/content/images/2020/02/Screen-Shot-2020-02-16-at-6.01.38-AM.png" alt="Screen-Shot-2020-02-16-at-6.01.38-AM"><img src="https://mechanus.io/content/images/2020/02/Screen-Shot-2020-02-16-at-6.02.54-AM.png" alt="Screen-Shot-2020-02-16-at-6.02.54-AM"></p>
<p>非常典型的后发国家资产阶级的形象。可是另一方面，朴家就不是寄生虫了吗？</p>
<p><img src="https://mechanus.io/content/images/2020/02/Screen-Shot-2020-02-16-at-6.21.13-AM.png" alt="Screen-Shot-2020-02-16-at-6.21.13-AM"></p>
<p>雇佣劳动是资本主义的产物。没有生产资料的无产者为了换取工资，出卖劳力给资本家。这点在电影中也有所体现：朴社长当然不是亲自开发新产品，而是作为管理层雇佣通过了独木桥（金家长子重考了四年都没考过）从名牌大学毕业的学生来为其工作。太太不会家务根本不要紧，只是一个简单的再雇一个管家就能解决的事情。而最终生产出的商品呢？自然是销售给广大的人民群众了。就这样，从人民群众中来，最后回到了人民群众中去；而资本得到了剩余价值，富者更富了。</p>
<p><img src="https://mechanus.io/content/images/2020/02/Unknown.jpeg" alt="Unknown"><br>
类似地，我国在土改期间也大规模探讨并解决了「谁养活谁」的问题。</p>
<p>在这样的语境下，所有人都是寄生虫。</p>
<h2 id>气味</h2>
<p>气味是这部电影最重要的线索。朴社长作为一个有修养的人，只在夫妻夜话时谈过金司机的气味。除此以外，就只有多颂童言无忌，说过金氏家族身上的气味了。<br>
<img src="https://mechanus.io/content/images/2020/02/Screen-Shot-2020-02-16-at-6.35.19-AM.png" alt="Screen-Shot-2020-02-16-at-6.35.19-AM"><br>
气味是一个引子，是象征着社会阶级割裂的引子。它可以是气味——也可以是别的。朴社长就是一个典型的代表——作为上层社会的一员，修养让他从来没有对金家人提起过他们身上的气味，对待金家人十分和蔼。可他骨子里的歧视是掩盖不住的——多次的皱眉，和太太的夜话，以至于最后看到「Jessica」倒在血泊中也要捏着鼻子拿车钥匙的标志着全剧高潮的那一幕。</p>
<p><img src="https://mechanus.io/content/images/2020/02/Screen-Shot-2020-02-16-at-6.45.51-AM.png" alt="Screen-Shot-2020-02-16-at-6.45.51-AM"></p>
<p>类似的，气味也并不仅仅只是气味。它当然可以是<br>
<img src="https://mechanus.io/content/images/2020/02/ootvmlURCszSVggL1Lc0c6MZjahRpFHZSQtFMV6L3h3NQ1555830995013.jpg" alt="ootvmlURCszSVggL1Lc0c6MZjahRpFHZSQtFMV6L3h3NQ1555830995013"></p>
<p>我们的王校长喜爱电竞，喜爱女主播，喜爱泡妞，嘴比你还臭。他在微博上和人民群众打成一片，大家以为他是「我们」。可真的是这样吗？</p>
<p>这样的生殖隔离存在一天，「气味」永远就会存在。</p>
<h2 id>「你爱她」</h2>
<p>我相信这是一条隐藏线。金司机在全剧中问了两次「因为你爱她吧」：一次是在车里，一次是在快闪生日会上。</p>
<p><img src="https://mechanus.io/content/images/2020/02/Screen-Shot-2020-02-16-at-7.01.32-AM.png" alt="Screen-Shot-2020-02-16-at-7.01.32-AM"><br>
<img src="https://mechanus.io/content/images/2020/02/Screen-Shot-2020-02-16-at-7.01.46-AM.png" alt="Screen-Shot-2020-02-16-at-7.01.46-AM"></p>
<p>第一次，社长向金司机抱怨雇保姆的事情，谈起了老婆不会做料理、也不会扫除。收到金司机的问题后，社长的答复是这样的：<img src="https://mechanus.io/content/images/2020/02/Screen-Shot-2020-02-16-at-7.01.52-AM.png" alt="Screen-Shot-2020-02-16-at-7.01.52-AM"><br>
「我当然爱她」</p>
<p>第二次是在生日会上。太太为了儿子的生日费尽心思筹办，社长自然也要跟随。金司机再次提出了自己的问题：<img src="https://mechanus.io/content/images/2020/02/Screen-Shot-2020-02-16-at-7.11.07-AM.png" alt="Screen-Shot-2020-02-16-at-7.11.07-AM"><br>
而这一次，社长显然就没有那么好脾气了：<br>
<img src="https://mechanus.io/content/images/2020/02/Screen-Shot-2020-02-16-at-7.11.21-AM.png" alt="Screen-Shot-2020-02-16-at-7.11.21-AM"></p>
<p>这个线索是极有意思的。金司机不明白社长的「爱情」：一个不能工作也不能扫除做饭的老婆，娶她有什么用呢？对金司机而言，婚姻是一种世俗利益的交换，他理解不了朴社长的爱情。朴社长的回答则更简洁明了：<br>
「你不是人」</p>
<p>Dehumanization 是很常见的手法。通过将对方开除人籍，可以取得意想不到的好处。二战时期美国的宣传「Nazis eat babies, that's a fact」就是一种典型的例子。对于朴社长而言呢？金司机只是一种和自己有着相同生理结构的生物，和这样的生物，谈什么爱情呢？</p>
<h3 id>年轻人的爱情</h3>
<p>金基宇和朴多惠的爱情则是另一个世界了。咋一看是一个保尔柯察金和冬妮娅一般的注定没有结果的爱情——阶级的对立使得再两小无猜的爱情也是不可能。不过，这看起来似乎更像是樊胜美一般的异想天开的故事。</p>
<p>哥们将心上人托付给你，最后自己却捷足先登，这不足为奇，类似的事情每天都在发生。不过金基宇的爱情似乎更不单纯一些——tricky。运用一系列手法（还记得第一堂课时的把脉吗？），作为家庭教师而毫无 ethics 观念，把涉世未深的富家女骗到手。这样的「爱情」，如果说一开始导演或许想营造有两情相悦的感觉，后面金氏一家人寄生在房子里畅想如何把资产骗到手则是彻底戳穿了这个谎言：哪有什么爱情呢？</p>
<p>于是「爱情」成了被解构的对象，just follow step ABC, how worthy is that?</p>
<h2 id>人物的心理分析</h2>
<p>我只想谈谈司机和太太。</p>
<p>太太是一个很有意思的角色——我相信她是我们所有「人」脆弱一面的投影，只是更加艺术化了。太太的心理状态显然不是十分健康——涉世未深，容易被人牵着走；非常容易被触发的焦虑；甚至有一点竭斯底里。如果一件事不和太太的预期相符——她就宕了，直到这个问题被某人解决为止。</p>
<p>这样的心理状态好吗？自然是不好的。可无论是谁，只要生理上是一个人，总是或多或少无法避免这些问题。没有人是上帝，于是我们自然会同情太太的遭遇。我们总有不想让人看到的一面——于是太太就是这个投影。</p>
<p>司机则是另外一面的投影了——司机是善良的，甚至有一些懦弱。他会为之前被开的司机感到悲伤，可他没有办法，为了得到这份工作。一心想为家人创造更好的环境，在投资台湾蛋糕店失败之后改去做了代客泊车。他很努力地维持自己的自尊——直到被朴氏一家人彻底破坏掉。</p>
<p>电影给了金司机很多镜头，尤其是朴社长和老婆对「气味」产生反应的时候。金司机小心地维持着自己的自尊，即便是受雇于朴社长，也希望能通过工作带给家人更好的生活，和家人在聚餐时一句「感谢伟大的朴社长」便是极好的例子。而另一方面，金司机的自尊在被无休止地消耗掉——当无数次，雇佣你的上层人士对你无法改变的特质感到本能的厌恶，谁的自尊不会崩塌呢？结局朴社长对倒在血泊中的金家长女置若罔闻，捏着鼻子取走车钥匙的时候，金司机的自尊彻底崩溃——他终于明白，他和朴社长原来是两个物种。</p>
<p>于是他抄起了刀，杀死了一个家庭。同归于尽是无能为力的人们最后的出路。</p>
<h2 id>结局</h2>
<p>房子还在，房主变了。</p>
<p>房主变了，底层还是那个底层。韩国人、德国人——房主不管是谁，和你却有什么关系呢？人依然还是被异化的人。如果是两个物种，那不管怎样，上升通道无论怎么样也是不会对你开放的。豪宅的主人变了一个又一个，你住的却永远是那个贫民窟。金基宇的梦永远也就只是梦了，他写的信也永远不会传到。</p>
<p><img src="https://mechanus.io/content/images/2020/02/Screen-Shot-2020-02-16-at-8.18.48-AM.png" alt="Screen-Shot-2020-02-16-at-8.18.48-AM"><br>
Rick and Morty S03E07，异曲同工之妙</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[《鼠疫》]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>加缪的《鼠疫》一书是我去年陷入低谷期后读的其中一本书——当时我确实陷入了非常大的困难之中，一方面需要平静，另一方面也确实需要解决一些哲学<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>上的问题。那段时间固然很糟糕，但现在想起来，也的确称得上是一笔精神财富吧。</p>
<p>我本想将这段时间尘封起来，但最近全世界都在关注的武汉疫情不由得使我回忆起了这段时间。仔细想来，这本书确实对我影响颇深。那我也就聊以抛砖引玉，随便写写吧<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup><sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup>。</p>
<p>希望疫区人民能挺过这段日子。</p>
<p><strong>《鼠疫》</strong></p>
<p>武汉封城了，奥兰城也封城了。<br>
武汉爆发了冠状病毒，奥兰城爆发了鼠疫。</p>
<p>奥兰城本是一个极其普通的城市，就和所有的城市一样。它很平静、它太平静了——平静到你很难找到你和任意一个其他城市的区别，平静到使人无聊。可就在这么一个无聊的城市——鼠疫来了。</p>
<blockquote>
<p>以看门房的老头儿的死亡为标志，瘟疫正式拜访人们。</p>
</blockquote>
<p><strong>鼠疫来了</strong></p>
<p>鼠疫就是来了。</p>
<p>没有什么原因，就是来了。先是零星的老鼠尸体，到老鼠成群结队地死去、堆满了下水道，最后到门房老头的死去——鼠疫来了。人们开始死去，死亡的人数越来越多——奥兰城成了孤岛，省政府下达了封城令。所有人都以为巴黎来的血清是救命稻草，但是却依然收效甚微。</p>]]></description><link>https://mechanus.io/shu-yi/</link><guid isPermaLink="false">5e2aa46b3245d50001e555ef</guid><category><![CDATA[Autistics]]></category><category><![CDATA[Ink Bottle]]></category><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Tue, 28 Jan 2020 10:13:48 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>加缪的《鼠疫》一书是我去年陷入低谷期后读的其中一本书——当时我确实陷入了非常大的困难之中，一方面需要平静，另一方面也确实需要解决一些哲学<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>上的问题。那段时间固然很糟糕，但现在想起来，也的确称得上是一笔精神财富吧。</p>
<p>我本想将这段时间尘封起来，但最近全世界都在关注的武汉疫情不由得使我回忆起了这段时间。仔细想来，这本书确实对我影响颇深。那我也就聊以抛砖引玉，随便写写吧<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup><sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup>。</p>
<p>希望疫区人民能挺过这段日子。</p>
<p><strong>《鼠疫》</strong></p>
<p>武汉封城了，奥兰城也封城了。<br>
武汉爆发了冠状病毒，奥兰城爆发了鼠疫。</p>
<p>奥兰城本是一个极其普通的城市，就和所有的城市一样。它很平静、它太平静了——平静到你很难找到你和任意一个其他城市的区别，平静到使人无聊。可就在这么一个无聊的城市——鼠疫来了。</p>
<blockquote>
<p>以看门房的老头儿的死亡为标志，瘟疫正式拜访人们。</p>
</blockquote>
<p><strong>鼠疫来了</strong></p>
<p>鼠疫就是来了。</p>
<p>没有什么原因，就是来了。先是零星的老鼠尸体，到老鼠成群结队地死去、堆满了下水道，最后到门房老头的死去——鼠疫来了。人们开始死去，死亡的人数越来越多——奥兰城成了孤岛，省政府下达了封城令。所有人都以为巴黎来的血清是救命稻草，但是却依然收效甚微。</p>
<p>对于这么一个无聊的城市，鼠疫的到来起初并没有造成什么不同。没有人真正将鼠疫放在心上——不过是另一场闹剧，马上就结束了，全然不在乎的样子。可就在这样一种全城放松的情况下，「鼠疫」二字是绝对不能提的，提了便会招来祸端。即便是省长——即便人们已经开始死去，「鼠疫」也是一个魔咒，仿佛不提便不会有鼠疫一般。</p>
<p>可不管再怎么强颜欢笑，人总是会死的。</p>
<p>相爱之人被迫相互隔离开了。外乡人朗格尔找到我们的主角，里厄医生，想到得到一份出城的许可。失败之后依然孜孜不倦地联系上了地下组织，想要偷渡出城。而另一位绝望的角色科塔尔，在封城前便因为自杀失败成为了全城的热点；在鼠疫开始蔓延后，反倒是社会了起来，成为了奥兰城的交际花，鼠疫反倒是给他的生命赋予了意义。</p>
<p><strong>「好人不该死，可是好人死了」</strong></p>
<p>荒诞就这么毫无预警的来到了每个人的身边。鼠疫天生就是反生命的——我们的文化里最重要的东西。我们天生就被教导，生命有着无穷大的意义。可鼠疫的到来就像是历史的车轮，毫不留情地碾压过每一个人。醒来、吃饭、睡觉——我们每天都在这么干，它们承担了太多重量。可鼠疫的到来却是给这样的文化下的每一个人扇了个响亮的耳光——我们都是被西西弗斯。</p>
<p>意义被 nullify 了。就像一只蜗牛被一个走路不看路的人踩扁了。</p>
<p>荒诞来了。有的人不接受这样的荒诞，强迫说服自己根本没有荒诞，最后疯掉；有的人把荒诞作为自身存在的意义，歌颂、崇拜起了荒诞来。躺下来总是很简单的一件事情。荒诞是贪婪的。它从来不满足于一个人的哭泣，也不会满足于一群人的崩坏。它消除了一切意义。</p>
<p>有人不接受荒诞，就有人反抗荒诞，即便反抗本身可能是也没有意义的——我们说反抗命运也大概如此。命运就像轮子一样辗过所有人。即便是神父，做了几次尼撒后还是加入了里厄医生的救援队——一个真的对命运唯命是从的人，怎么会不把一切都托付给一个人造神呢？荒诞嘲弄人类——就会有人去嘲弄回去，即便收效甚微。荒诞不可战胜，可西西弗斯们依旧会每日推着那块石头——反抗者们是坚毅的，至于最后结果如何——已经不再重要了。</p>
<p><strong>鼠疫走了</strong></p>
<p>鼠疫走了。就如同鼠疫来的一样——没有什么理由，鼠疫就是走了。没有人知道鼠疫下一次来是什么时候。</p>
<p>鼠疫把人解构了。平日里宣称的美好的事情，在鼠疫时全然不见了踪影——人最终回到了裸体。可加缪想表达的，我想恰恰是与其想法的一些东西——人又成为人了。</p>
<p>加缪认为，人在面对荒诞的时候大致有三种结果——肉体自杀，哲学自杀和反抗。肉体自杀很好理解，一根绳子，荒诞自然不复存在了。皈依宗教也很简单，双膝一跪，期待一个可能来也可能不来的神来帮你解决——既然不在我的控制范围内了，何来问题呢？可反抗自然是最难也是最痛苦的。西西弗斯们无尽的抗争，最后得来的可能什么也没有。</p>
<p>不过，反抗的目的，大概是为了我们最后的尊严吧。</p>
<blockquote>
<p>……但您的胜利永远是暂时的，如此而已。”<br>
“永远，这我知道。但这不是停止斗争的理由。”<br>
“教您这一切的是谁，大夫？”<br>
“是贫困。</p>
</blockquote>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>我极力避免使用这个词，并且我保证这是唯一一次 <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p>我读的是计算机科学，非人文社科相关专业 <a href="#fnref2" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn3" class="footnote-item"><p>我有意尽力不使用任何「～主义」的词汇 <a href="#fnref3" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[打油诗一首]]></title><description><![CDATA[<p>《补习班赋》</p><hr><p>上课有补习班</p><p>找工有补习班</p><p>恋爱也有补习班</p><p>Mā de,</p><p>开补习班有没有补习班？</p>]]></description><link>https://mechanus.io/da-you-shi-yi-shou/</link><guid isPermaLink="false">5e221d4d5baa5d0001e9e799</guid><category><![CDATA[Autistics]]></category><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Fri, 17 Jan 2020 20:48:13 GMT</pubDate><content:encoded><![CDATA[<p>《补习班赋》</p><hr><p>上课有补习班</p><p>找工有补习班</p><p>恋爱也有补习班</p><p>Mā de,</p><p>开补习班有没有补习班？</p>]]></content:encoded></item><item><title><![CDATA[数据全丢了🤦‍♀️]]></title><description><![CDATA[<p>丢人，真的太丢人了。</p><p>这个博客本来么一直都是托管在 vultr 的，原因也很简单，2.5刀一个月够便宜，面板还贼好用，备份快照都是点一下鼠标的事。</p><p>直到回国之后新开了个虚拟机搭梯子，用完之后自然是要删掉省点钱的对吧</p><p>淦，手抖点错了。</p><p>不过不要紧，我们还有备份对吧，</p><ul><li>daily backup 不知道什么时候被关了，霍日 </li><li>最近一份快照是2018年五月的，还不带数据库（那时候数据库在aws托管）</li><li>s3 里完全没有任何数据库备份</li><li>自己写的备份脚本很久以前就停止工作了</li></ul><p>这就真的很尴尬了，和 gitlab 那时候事件非常类似，都是你以为你有很完备的备份策略，数据绝对是安全的，但事实上你的备份数据是假的，出了事没一个能派上用场。</p><hr><p>这当然是一个悲伤的故事，要不是 Google 有缓存，从高中开始写的博客真的全没了。很幸运目前恢复了大部分的文章和18年五月之前的图片，不过别的基本都丢了。</p><p>说这个的故事在于警示所有人：</p><ul><li>你的备份策略真的有用吗？</li><li>你有做过灾害演练吗？</li><li>你的应用是否真的便携、抽象且解耦？</li></ul><p>第三个问题看似不相干，但我认为这是非常容易被忽视的一点。一个服务如果耦合度非常高，缺了任何一个零散部件就不能工作，</p>]]></description><link>https://mechanus.io/shu-ju-quan-diu-liao/</link><guid isPermaLink="false">5e155f4babf67d00016cec3a</guid><category><![CDATA[Web]]></category><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Wed, 08 Jan 2020 05:41:54 GMT</pubDate><media:content url="https://mechanus.io/content/images/2020/01/0A844396-1A82-4DF0-814E-1F9E33AEDC39.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://mechanus.io/content/images/2020/01/0A844396-1A82-4DF0-814E-1F9E33AEDC39.jpeg" alt="数据全丢了🤦‍♀️"><p>丢人，真的太丢人了。</p><p>这个博客本来么一直都是托管在 vultr 的，原因也很简单，2.5刀一个月够便宜，面板还贼好用，备份快照都是点一下鼠标的事。</p><p>直到回国之后新开了个虚拟机搭梯子，用完之后自然是要删掉省点钱的对吧</p><p>淦，手抖点错了。</p><p>不过不要紧，我们还有备份对吧，</p><ul><li>daily backup 不知道什么时候被关了，霍日 </li><li>最近一份快照是2018年五月的，还不带数据库（那时候数据库在aws托管）</li><li>s3 里完全没有任何数据库备份</li><li>自己写的备份脚本很久以前就停止工作了</li></ul><p>这就真的很尴尬了，和 gitlab 那时候事件非常类似，都是你以为你有很完备的备份策略，数据绝对是安全的，但事实上你的备份数据是假的，出了事没一个能派上用场。</p><hr><p>这当然是一个悲伤的故事，要不是 Google 有缓存，从高中开始写的博客真的全没了。很幸运目前恢复了大部分的文章和18年五月之前的图片，不过别的基本都丢了。</p><p>说这个的故事在于警示所有人：</p><ul><li>你的备份策略真的有用吗？</li><li>你有做过灾害演练吗？</li><li>你的应用是否真的便携、抽象且解耦？</li></ul><p>第三个问题看似不相干，但我认为这是非常容易被忽视的一点。一个服务如果耦合度非常高，缺了任何一个零散部件就不能工作，这样一来设计一套完整的数据安全策略就很困难了，因为很难面面俱到，而人总是会有过失的。</p><p>为了解决这个问题，我做了如下改变：</p><ul><li>把所有的服务都容器化。所有的服务配置都在一个文件里，一行 <code>docker-compose up</code> 就可以拉起服务，包括应用本身，数据库和外层的 load balancer（以及相关的配置文件）</li><li>所有 persistent storage 统一中心化管理，默认所有其他的数据都是易失的并且有意定期扔掉。这样的好处很明显，把问题暴露在早期永远比后期丢数据了要好，备份脚本只需要打包一个文件夹就打包了整个服务。</li></ul><p>这样做的好处当然是非常明显的。现在这个服务跑在 Scaleway 一台 ARM 架构的 Debian 服务器上（故意的），但如果需要可以只需要一行命令就可以无缝部署在另一台 x86、 Power 架构的服务器甚至是自己家的群晖 NAS 上，所有我需要做的只是从对象存储上拉一个文件，因为 Docker 把这些底层的差异都抹平了。</p><hr><p>在恢复数据的时候，我也顺便看了看以前写过的文章，好多都是在讲如何部署、如何编译、如何在xx系统上安装xx，提供xx服务。</p><p>这当然是没问题的，如果业务敏感，连寄存器的 bit 都要扣，就不要说动态链接库了。可这真的是大多数业务会遇到的吗？</p><p>我在工作中经常会遇到这种事情：xx 服务依赖于xx库，但xx库在xx系统中不被支持。而系统和底层库的升级成本实在是太高，大多是公司统一部署的，稍有不慎就会遇到依赖地狱。试想使用容器之后：各个解耦后的服务运行在自己的容器里，通过socket通信，这对安全性的提升是肉眼可见的。一些使用了较旧依赖的容器也可以被重点关照，而不必影响到其他容器。至于性能的损失则实在是无关紧要，因为解决的问题比这点损失大多了。</p><hr><p>大公司技术实力很强，有完善的代码管理、CI、build system，有专门的 DevOps 团队来推动技术升级，这自然不是问题。可是小公司就难受了，内部难有统一的技术栈，各个团队都是自己搞一套，混乱。</p><p>这几年越发感到，软件工程领域，大多数情况下沟通成本比技术债要大很多，优秀的管理水平很重要，但老被轻视。</p><hr><p>人生苦短，go get a life 吧。</p>]]></content:encoded></item><item><title><![CDATA[2019 年终总结]]></title><description><![CDATA[<p>虽然说我是个懒人吧，不过 2019 年，也就是我二十岁的这一年发生了实在太多的事情。所以随便写写还是有点必要的。</p><p>毫不掩饰地讲，这确实是我迄今为止最难过的低谷了。</p><blockquote>做了两个梦，后来梦醒了。</blockquote><!--kg-card-begin: markdown--><p><s>希望她能过得很好，这应该是我最大的愿望了。</s><br>
2020 六月 edit：nope I don't really care</p>
<!--kg-card-end: markdown--><p>我们最终还是为自己的不成熟付出了代价。</p><h1 id="mindshift"><strong><strong>Mindshift</strong></strong></h1><p>这个词是我仿造 redshift 生造出来的，我也不知道真的有没有这个词。大概意思我猜就是形容一个人或者一个群体宏观思想逐渐的累积的转变，尤其指和之前形成了代差的时候。</p><p>长期以往，我们中国人做事大概是需要一个理由来赋予其意义的。小学老师一定会告诉你，要度过一个有意义的假期。长大了也是一样，读研、工作、kpi、结婚，必然会有意义。</p><p>而人本呢？不知道，大概一定是死了吧。</p><h2 id="-"><strong><strong>人</strong></strong></h2><p>买椟还珠削足适履的故事我们都听说过。究竟是你身上的标签决定了你是谁，还是你决定了要往身上（或他人的身上）贴的标签呢？</p><p>我们都是人，这是一句废话。可我们好像又不只是人，</p>]]></description><link>https://mechanus.io/2019-nian-zhong-zong-jie/</link><guid isPermaLink="false">5e1537caabf67d00016cebb5</guid><category><![CDATA[Life]]></category><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Sun, 22 Dec 2019 23:53:00 GMT</pubDate><content:encoded><![CDATA[<p>虽然说我是个懒人吧，不过 2019 年，也就是我二十岁的这一年发生了实在太多的事情。所以随便写写还是有点必要的。</p><p>毫不掩饰地讲，这确实是我迄今为止最难过的低谷了。</p><blockquote>做了两个梦，后来梦醒了。</blockquote><!--kg-card-begin: markdown--><p><s>希望她能过得很好，这应该是我最大的愿望了。</s><br>
2020 六月 edit：nope I don't really care</p>
<!--kg-card-end: markdown--><p>我们最终还是为自己的不成熟付出了代价。</p><h1 id="mindshift"><strong><strong>Mindshift</strong></strong></h1><p>这个词是我仿造 redshift 生造出来的，我也不知道真的有没有这个词。大概意思我猜就是形容一个人或者一个群体宏观思想逐渐的累积的转变，尤其指和之前形成了代差的时候。</p><p>长期以往，我们中国人做事大概是需要一个理由来赋予其意义的。小学老师一定会告诉你，要度过一个有意义的假期。长大了也是一样，读研、工作、kpi、结婚，必然会有意义。</p><p>而人本呢？不知道，大概一定是死了吧。</p><h2 id="-"><strong><strong>人</strong></strong></h2><p>买椟还珠削足适履的故事我们都听说过。究竟是你身上的标签决定了你是谁，还是你决定了要往身上（或他人的身上）贴的标签呢？</p><p>我们都是人，这是一句废话。可我们好像又不只是人，随便想象一个人吧</p><ul><li>人</li><li>女人</li><li>隶属于无产阶级的女人</li><li>隶属于无产阶级的中国籍女人</li><li>隶属于无产阶级的从事金融行业的中国籍女人</li><li>隶属于无产阶级的从事金融行业的身高一米六五的中国籍女人</li><li>隶属于无产阶级的从事金融行业的身高一米六五的前凸后翘的中国籍女人</li><li>隶属于无产阶级的从事金融行业的身高一米六五的前凸后翘的月薪 1.5w 的中国籍女人</li><li>隶属于无产阶级的从事金融行业的身高一米六五的前凸后翘的月薪 1.5w 的 LOL 王者段位的中国籍女人</li><li>……</li></ul><p>随着标签越来越多，似乎人的属性变得越来越弱。有不同需求的人盯着不同的标签，并盘算着这样的标签怎样使之获利。从这一刻开始，他从一个人「进化」成为了一种商品，一种在资本主义语境下可以交易的可以消耗的对象。至于消耗完了的商品，或者是没有相应标签的人呢？那自然不能算人了。就如同你不会在玛丽苏小说里看到中年发福的农民工，也不会在媚宅漫画里看到 200 斤被校园暴力的女同学一样，美人鱼肯定是上人下鱼不会是上鱼下人——他们在相应的语境里已经被开除人籍了。</p><p>人被异化了。不过这似乎不是什么问题——自有史以来人一直在被异化，解构主义兴起不过是最近才发生的事情。</p><p>人本主义绝不是白左<sup>[1]</sup>，希望没有人被开除人籍，各种语境下的。</p><h2 id="slave-of-genes"><strong><strong>Slave of Genes</strong></strong></h2><p>其实不是很想写这个话题，不过既然提到人了，好像也该讨论一下什么是人了。</p><p>我们当然知道我们是 Homo Sapiens。我们当然知道所有人都是人，可基因的诅咒就是在那里。</p><ul><li>走在路上，就是会不由自主多看几眼好看的妹子。</li><li>路过奶茶店，就是想喝一杯。</li><li>高油高糖，真棒。</li></ul><p>这实在是太矛盾了。我们生而为人，却无时不刻不被自身的激素水平影响。我们知道它在那里，我们可以研究它，可就是无法摆脱它。</p><p>想象一下，未来施一公所说的生物学的世纪真的来了，费洛蒙香水上市，所有人真的都得到了幸福。那和我们原始人祖先一棒子下去拖回洞里有什么区别呢？</p><p>也许谁都是人，也许谁都不是人。Maybe the term "human" means nothing. Maybe nothing matters after all.</p><h1 id="let-s-talk-about-arts"><strong><strong>Let's talk about arts</strong></strong></h1><p>今年没玩什么游戏，打的少许几个游戏中最喜欢的是打越的新作《AI》。我很喜欢它的人设，剧本也足够引人入胜，不失老贼水准。唯一的缺点可能是 gameplay，作为解密游戏靠试错果然还是太煞风景了。</p><p>最喜欢电影是《小丑》。我太喜欢它了，这是这个世代少有的，以资本主义语境下庶民为主角的电影。亚瑟是个活的角色，他不是某个超级英雄电影中批量生产、用于衬托主角的反派，这是一个 <strong><strong>人</strong></strong> 在病态的社会下一步步逐渐被逼疯的故事。它也不是一个人，是社会的无数边缘人（aka，沉默的大多数）用暴力和混乱反抗不公、虚伪。小丑业不止是一个角色——它是一个模因了，是 standalone complex，它是一个文化符号了。很少有电影愿意去给资本主义的结构性矛盾镜头，但《小丑》无疑做到了。他重提了两百年前我们经历过的问题：当结构性的矛盾得不到解决，当大量的矛盾被掩饰，what happens next?</p><p>来一首 《Bathroom Dance》，全篇中我最喜欢也给我留下了最深印象的配乐：</p><!--kg-card-begin: html--><iframe allow="autoplay *; encrypted-media *;" frameborder="0" height="150" style="width:100%;max-width:660px;overflow:hidden;background:transparent;" sandbox="allow-forms allow-popups allow-same-origin allow-scripts allow-storage-access-by-user-activation allow-top-navigation-by-user-activation" src="https://embed.music.apple.com/ca/album/bathroom-dance/1481598135?i=1481598347"></iframe><!--kg-card-end: html--><p>动画方面，逐渐脱宅。二次元圈子在逐渐充斥着过量荷尔蒙的气息，让我有一点不适。不过也挺正常的，这的确是年轻男女该有的样子。</p><p>全年给我留下最深印象的动画是补的《EVA》和绝赞连载中的《Rick and Morty》。每个人都有每个人的故事——但《EVA》的确陪伴我度过了最难过的一部分时光，而《R&amp;M》也加速了我解放的过程。我们每个人都是想逃避却不得不面对的小受，也是不得不领悟到世间混乱后距离自己尸体五码地吃早餐的 Morty。</p><p><em><em>Nobody exists on purpose. Nobody belongs anywhere. Everybody’s gonna die. Come watch TV?</em></em></p><p>来几首我最喜欢的 soundtrack:</p><!--kg-card-begin: html--><iframe allow="autoplay *; encrypted-media *;" frameborder="0" height="150" style="width:100%;max-width:660px;overflow:hidden;background:transparent;" sandbox="allow-forms allow-popups allow-same-origin allow-scripts allow-storage-access-by-user-activation allow-top-navigation-by-user-activation" src="https://embed.music.apple.com/ca/album/look-on-down-from-the-bridge/724609718?i=724610555"></iframe>
<iframe allow="autoplay *; encrypted-media *;" frameborder="0" height="150" style="width:100%;max-width:660px;overflow:hidden;background:transparent;" sandbox="allow-forms allow-popups allow-same-origin allow-scripts allow-storage-access-by-user-activation allow-top-navigation-by-user-activation" src="https://embed.music.apple.com/ca/album/tales-from-the-citadel/1434106434?i=1434106719"></iframe>
<iframe allow="autoplay *; encrypted-media *;" frameborder="0" height="150" style="width:100%;max-width:660px;overflow:hidden;background:transparent;" sandbox="allow-forms allow-popups allow-same-origin allow-scripts allow-storage-access-by-user-activation allow-top-navigation-by-user-activation" src="https://embed.music.apple.com/ca/album/fly-me-to-the-moon-yoko-takahashi-acid-bossa-version/1467210433?i=1467210848"></iframe>
<iframe allow="autoplay *; encrypted-media *;" frameborder="0" height="150" style="width:100%;max-width:660px;overflow:hidden;background:transparent;" sandbox="allow-forms allow-popups allow-same-origin allow-scripts allow-storage-access-by-user-activation allow-top-navigation-by-user-activation" src="https://embed.music.apple.com/ca/album/komm-s%C3%BCsser-tod-from-the-end-of-evangelion-violin-impact/1151620071?i=1151620077"></iframe><!--kg-card-end: html--><h2 id="postmodernism"><strong><strong>Postmodernism</strong></strong></h2><p>现代派反对传统，把传统上被推崇的艺术解构、嘲笑、讽刺。而后现代派则更进一步，反对一切的规则和范式，把现代派也一并嘲笑了。后现代派艺术是花费了无数金钱的太空探索项目最终在月球上涂上了一个巨大的中指，是反对越战的嬉皮士年轻人的摇滚。</p><p>一个最近的新闻是，女生被 PUA 操控，最终自杀。这件事情本身固然是十分悲伤的，一条鲜活的生命就这么逝去了。可这事件的余音无疑是后现代式的：年轻人不羁传统，毫无保留地恋爱。可你的思想并不是你的，是可以操控的，感情是有范式的。任何一个人经过一定的训练，完成任务 ABC，都可以成为你口中的「真爱」了。再稍加以系统性的影响，你就是人家随意操控的对象。从这个角度来说，PUA 存在的本身可以说是立派的后现代讽刺艺术，它用最直接、最 brutal 的方式向世界宣告：你们相信的所谓爱情命运真命天X都是假的：来，这里是说明书，照着做就行了，包教包会哦。</p><p>我想这也是我对当今主流二次元和电视荧屏（我不准确地将其统称为 hormone driven business）内容敬而远之的原因：它太虚假了，它太模版了，除了感官上的愉悦，它真的难以满足我对一个艺术作品的需求：芳文社的百合番固然放松身心，可一打开就能猜到结尾；桐人装逼把妹开后宫是很帅，但总能不由自主想到《リアル鬼ごっこ2015》面包车上的「㊛」字；新海诚的作画和配乐实属一流，但小学生级别不断重用的 boy meets girl 实在是使人毫无共鸣和烦闷。</p><p>奶子屁股大白腿固然好，可 Pop Team Epic 才是真正革命而艺术性的。</p><figure class="kg-card kg-image-card"><img src="https://mechanus.io/content/images/2020/01/FAC15007-23BF-42AB-B532-5F14F2D9B943.jpeg" class="kg-image"></figure><hr><ol><li>我是反对全民批判白左的。资本主义语境下的左派也是左派，他们也许不切实际或不够进步，但也是在为 proletariat 做斗争并且是一股不可忽视的进步力量的</li></ol>]]></content:encoded></item><item><title><![CDATA[Fresh Install Mac OS X on a PPC Mac]]></title><description><![CDATA[<p>二十块钱淘了个真·古董 iMac G5，上面还留着上任机主留下的使用痕迹。</p><p>作为一个 Cryptonerd，自然是无法接受系统不干净以及没有开启磁盘加密的设备（shameful they dont have T2 back in 2005）。Let's do a fresh installation then</p><p>显然在 2019 年的现在，光驱是个罕见的东西。在 PPC Mac 上用 USB 引导需要一点 hack。For some reason the <em><em>option</em></em> start up manager doesn't identify the thumb drive.</p><p>Leopard 的 ISO 可以在<a href="https://archive.org/details/OsxLeopardInstall"></a></p>]]></description><link>https://mechanus.io/fresh-install-mac-os-x-on-a-ppc-mac/</link><guid isPermaLink="false">5e1537caabf67d00016cebbd</guid><category><![CDATA[Play]]></category><dc:creator><![CDATA[aLPHAtOAD]]></dc:creator><pubDate>Mon, 04 Nov 2019 00:01:00 GMT</pubDate><content:encoded><![CDATA[<p>二十块钱淘了个真·古董 iMac G5，上面还留着上任机主留下的使用痕迹。</p><p>作为一个 Cryptonerd，自然是无法接受系统不干净以及没有开启磁盘加密的设备（shameful they dont have T2 back in 2005）。Let's do a fresh installation then</p><p>显然在 2019 年的现在，光驱是个罕见的东西。在 PPC Mac 上用 USB 引导需要一点 hack。For some reason the <em><em>option</em></em> start up manager doesn't identify the thumb drive.</p><p>Leopard 的 ISO 可以在<a href="https://archive.org/details/OsxLeopardInstall">这里</a>下载，下载完后直接 dd 到 USB thumb drive。注意此处目标要选择整个磁盘，不是某卷宗。加上 <code>r</code> 直接写入可以加快速度。文件系统和分区表会和 ISO 保持一致（似乎是上古年代的 Apple Partition Map）。</p><p>插 drive 到目标机器，开机按 Command+Option+O+F 进到 Open Firmware （又是个 Intel Mac 没有的东西）。</p><p><code>dev / ls</code></p><p>找到安装媒介，记下完整的树路径，比如这样的 <code>/ht@0,f2000000/pci@2/usb@b/disk@1</code></p><p><code>devalias ud /ht@0,f2000000/pci@2/usb@b/disk@1</code> 设置 alias</p><p><code>dir ud:3,\</code> 看看是不是选中了正确的磁盘。3 是卷号，如果你是用 Leopard 的 ISO dd 出来的应该就是这个。</p><p>从 USB 卷启动：</p><pre><code>boot ud:3,\System\Library\CoreServices\BootX
</code></pre><figure class="kg-card kg-image-card"><img src="https://mechanus.io/content/images/2020/01/E05E9019-B2E8-4BE3-8965-D68716F3BB96.jpeg" class="kg-image"></figure>]]></content:encoded></item></channel></rss>