<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Artorius</title>
    <description>Arthur&apos;s Blog</description>
    <link>https://artori.us/</link>
    <atom:link href="https://artori.us/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Thu, 23 Apr 2026 06:17:48 +0000</pubDate>
    <lastBuildDate>Thu, 23 Apr 2026 06:17:48 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      
      <item>
        <title>Arthur的2025年度总结</title>
        <description>&lt;p&gt;(最前面的部分是 2026-01-03 00:45 尝试开始写的)&lt;/p&gt;

&lt;p&gt;在写之前我读了之前几年的总结，往前读到了17年，仿佛是在看另一个不怎么会说话的年轻人写的东西，有点疏离感。&lt;/p&gt;

&lt;p&gt;24年没有写年终总结，因为这一年的变化多又迅速，到年底的时候也是我感觉自己被真正击垮的时候，尚没有心力面对每一天的生活，更没有这本事再去重温这一年。&lt;/p&gt;

&lt;h2&gt;～&lt;/h2&gt;

&lt;p&gt;这两年最重要变化是工作。加入了一个新的创业公司，说是创业公司其实也已经几百人了，天天能在新闻上看到报道。这两年的工作如果总结一下，就是非常的不开心，也许25年相较24年好一些，只是十一假期结束之后，公司节奏突然提升，让最后三个月过得异常艰难。一度很不喜欢我的同事，讨厌他们争吵，讨厌他们推诿，讨厌他们冷嘲热讽，讨厌他们。&lt;/p&gt;

&lt;p&gt;年底公司开了一个复盘会，AMA环节我问了老板们一个问题，「这一年什么时候最快乐」，初衷其实是完全出于自己的不快乐，所以很想知道有人，或者说老板们自己，是乐在其中的。一位老板说，他并不追求快乐，有其他更重要的东西在前面。同时因为很喜欢这个问题，于是成了每个人都要回答的问题。收获了20多个答案，其中不乏非常美好的：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;一次在无人的高速上偷偷开到了190码，5-10分钟，进入了一种忘我的心流；&lt;/li&gt;
  &lt;li&gt;第一次被按头坐上了过山车，晚上被抓去蹦迪，感受到了不同的体验；&lt;/li&gt;
  &lt;li&gt;在沙漠中越野到体力耗尽的时候，躺在无垠的沙漠里仰望星空；&lt;/li&gt;
  &lt;li&gt;突然失联的非常重要的朋友出现了，解释了消失的原因；&lt;/li&gt;
  &lt;li&gt;儿子上了好学校；&lt;/li&gt;
  &lt;li&gt;在公司交到了很好的朋友。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;轮到我发言时候，我分享的是去濑户内海思考人生的经历，与其说是开心，不如说是真真切切最放松和平静的时候。我确信我也是说交到朋友的同事说的朋友之一，跨年的时候我想，这应该也是我今年最开心的事情吧。&lt;/p&gt;

&lt;p&gt;会后我还收获了一个拥抱，回程的大巴上一边偷哭一边在想，算了，工作的委屈一个拥抱也够补偿了。&lt;/p&gt;

&lt;h2 id=&quot;-1&quot;&gt;～&lt;/h2&gt;

&lt;p&gt;（到此刻，2026-04-04 00:21，才把后面的部分写完）&lt;/p&gt;

&lt;p&gt;今年过完生日就是39周岁了，都说四十不惑，我也突然认同了，我觉得生命中大部分的选择、大部分的问题，我都找到自洽的答案了。或者像我弟说的，很多问题已经不再去执着于追问一个答案了。&lt;/p&gt;

&lt;p&gt;我细数了这个世界上我最想去的地方，20几岁开始旅行的时候，都是一些委曲求全的权宜之计，随缘分，想着更多地方未来还有机会去。35之后就是不惜一切代价去那些最想去的地方，从优先级更靠前的开始。所以其实最想去的，也都去过了。&lt;/p&gt;

&lt;p&gt;还有个收获是选好了葬礼上的歌，甚至我想录一个视频自己弹唱这首歌，在葬礼上放一放。保险经理人在你买保险的时候会问你，为什么突然想买了，是不是体检出了什么问题。其实不是，这种焦虑堆积到一定到程度，就会突然希望用各种保险保护万一离去之后我妻儿的生活质量。&lt;/p&gt;

&lt;p&gt;不过在这个时候开始总结自己的人生，和做离开的准备，是不是有一点太早了。&lt;/p&gt;

&lt;h2 id=&quot;-2&quot;&gt;～&lt;/h2&gt;

&lt;p&gt;25年还有很多新收获。&lt;/p&gt;

&lt;p&gt;我发现拍照的进步很大，得益于习惯的改变，也是我现在会回答别人为什么喜欢拍照的俗套答案：摄影确实给了我一双发现美的眼睛。我不需要每天带着相机，我的双眼解析度很高，宽容度也很高，对焦很快，甚至还可以用注意力来裁切变焦，可以轻而易举的发现和捕捉很多美好。如果恰好手边有一台相机，很多被看到的东西就能被记录下来。胶片还有他独特的记录方式，开盲盒的时候往往发现最终拍摄执行是不到位的，但看到那张不完美的照片的时候，那个完美的画面还是会浮现出来。&lt;/p&gt;

&lt;p&gt;看了很多红楼梦，以至于我发现其实看那种东西，把各种各样的人呈现在你面前，不做任何的判断和引导，让你去感受他们的生活，去看他们犯错，去跟着他们生活的东西，是很享受的。也因此让我对文学有了些改观，文学这个词在我脑子里其实一直更偏向于一个贬义词，我以为也讨厌文学是用各种文字去编排一些对人事物景的描写的技巧。直到我发现那些景色描写，可能是有观点的。和摄影、和电影都是类似的，越过技巧和纯美学的东西之后，看到的全是表达。描写、拍摄红色是预示着危险，更长的焦距是在给你一种逼仄的压迫感，视角从左肩越轴到右肩可能是代表角色内心的重大转折。&lt;/p&gt;

&lt;h2 id=&quot;-3&quot;&gt;～&lt;/h2&gt;

&lt;p&gt;用看电影看书的方式去看自己，看了这2年多，让我意识到我是个活在内心世界更多一点的人，好像没有真真切切的去触摸和摩擦这个世界。这可能是我新的一年的目标，我想在生日前给这个向内的探索一个总结，也想找到自己想要真的去投入到的生活。我已经把自己想明白了很多，但我还没有决定要怎么活。&lt;/p&gt;

&lt;p&gt;我知道这篇总结可能和以往的都不同，这可能就是这两年我真正的变化，应该没有在表现和证明什么了。&lt;/p&gt;

&lt;p&gt;那天一个梦，梦见自己刷牙的时候，镜子里的自己秃顶了，一低头甚至可以看到秃的地方有个红色的标记。有些荒诞的场景，随手发给了GPT「解梦」，结果得到了一个很悲伤的答案。&lt;/p&gt;

&lt;p&gt;洗脸刷牙的场景，是说我想收拾自己重回生活，但秃顶是我意识到经历的东西已经在我身上造成了不可逆的丑陋的变化，红色标记暗示着这种变化不但是危险的，还是被公众揭露甚至仇恨的。&lt;/p&gt;

&lt;p&gt;往好的地方想，我确实在认真洗脸刷牙来着，而且一觉醒来我的头发还是很茂盛。&lt;/p&gt;
</description>
        
          <description>&lt;p&gt;(最前面的部分是 2026-01-03 00:45 尝试开始写的)&lt;/p&gt;

</description>
        
        <pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate>
        <link>https://artori.us/arthur-s-2025-summary/</link>
        <guid isPermaLink="true">https://artori.us/arthur-s-2025-summary/</guid>
        
        <category>Summary</category>
        
        
        <category>Life</category>
        
      </item>
      
    
      
      <item>
        <title>Arthur的2023年度总结</title>
        <description>&lt;p&gt;终于熬完了本命年！&lt;/p&gt;

&lt;h2&gt;～&lt;/h2&gt;

&lt;p&gt;本命年三个字，就仿佛成了一个全年的底色，像是一个思想钢印，会把所有不顺心的事情链接在这三个字上然后记在脑子里，很辛苦。
这一年也确实不顺心，这种不顺心不知道是先有本命年三个字的暗示影响，还是这个概念让所有的不顺心集中归类了。总之这一年身体不好到，生病的时候比不生病的时候多。尤其下半年，晚上失眠睡不着觉，每天上午都是因为缺觉需要极度克制，非常易怒的状态。好几次生病都非常厉害，肺结节从1个磨玻璃，增加了5、6个别的小的。&lt;/p&gt;

&lt;h2 id=&quot;-1&quot;&gt;～&lt;/h2&gt;

&lt;p&gt;23年出国旅行了两次，都是一家三口，非常辛苦但也很快乐。一次去的清迈，基本上是纯纯放空的一次旅行，每天就是晒太阳，瞎逛。10月去了一次关西，十多天日本的旅程让我想明白了很多事，重新认识了很多我觉得很珍贵的东西。很多对于生活的不满，和需要解答的问题，都和解，得到回答了，感觉非常有收获。我本来期望的，去山里面重新思考人生的旅程所能得到的结果，在忙忙碌碌甚至有点窘迫的关西之旅实现了。&lt;/p&gt;

&lt;h2 id=&quot;-2&quot;&gt;～&lt;/h2&gt;

&lt;p&gt;关西带着AIS 50mm f1.4的镜头和胶片机F3去的，拍了十几卷胶卷，最后冲洗出来对调色很不满意。于是还另外找了一家店单扫，才终于看到了原本的色彩，以及胶片独有的颗粒感，非常满足。多少能看到一些自己的进步。&lt;/p&gt;

&lt;p&gt;后来尼康出了ZF，于是后来用关西之旅买到的FTZII接我的手动头玩，回到了数码时代。数码照片的试错成本低很多，按快门更放肆了，感觉进步快一点。常挂机的AIS 50mm f1.4也升级成了大眼睛夜之瞳auto 55mm f1.2，是S，不是SC，没有那个性感的镀膜。因为auto镜头的光圈设计关系，转接环也索性换成了Shoten的手动环。&lt;/p&gt;

&lt;h2 id=&quot;-3&quot;&gt;～&lt;/h2&gt;

&lt;p&gt;去年的目标，说要学完粤语多邻国课完成了；摩托车增驾考了科目一科目四，但还没摸到真车；买了理想L8，好爸爸车；错过的关西补上了。&lt;/p&gt;

&lt;h2 id=&quot;-4&quot;&gt;～&lt;/h2&gt;

&lt;p&gt;24年初，我结束了6年之久的一段工作，在这个极度寒冷的市场里，从头开始，准备简历、面试，遭受自信心的打击和各种挫折吧。感觉挺残忍的，36周岁的时候在市场上brutal force找工作。好在最后尘埃落定，中间的酸甜苦辣，留给24年总结再说了。对待工作的态度变了很多，最重要的收获可能是不想继续在工作中寻找自我价值了，想去工作外寻找自我认同。&lt;/p&gt;

&lt;h2 id=&quot;-5&quot;&gt;～&lt;/h2&gt;

&lt;p&gt;好在一团糟的23年里，我的女儿给了我很多光明和能量。谢谢她，很爱她。她每一次看到我时候真心的笑容，每一次在我回家开门瞬间跑出来的迎接，都是我最重要的动力。&lt;/p&gt;

&lt;p&gt;还有我老婆，我们经历了非常痛苦的一段时间。在我彷徨、愤怒、无助的时候，给了我最大的支持，我生活里的每一个决定，我内心的每一处角落，都有她的影子。她最近说觉得我配不上她，我觉得是对的。谢谢她给我的力量，爱她。&lt;/p&gt;

&lt;h2 id=&quot;-6&quot;&gt;～&lt;/h2&gt;

&lt;p&gt;照例写一些bullets吧：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;最喜欢的产品是RayCast AI，现在问它的机会比问Google的还多一些；&lt;/li&gt;
  &lt;li&gt;最喜欢的电影是《奥本海默》，最喜欢的剧集是《重启人生》，另外值得一提的是非常喜欢《贝克汉姆》纪录片。&lt;/li&gt;
  &lt;li&gt;没怎么看动画，但终于从头看了一遍《灌篮高手》，包括完整的动画片，所有的OVA，完整的漫画，以及最新的剧场版，值得。&lt;/li&gt;
  &lt;li&gt;没怎么看书，依然推荐《星之继承者》吧，看完了第一本。&lt;/li&gt;
  &lt;li&gt;坚持在踢足球，依然踢的不好，而且感觉身上的不经意的伤痛开始逐渐在球场上折磨我，膝盖、脚后跟等等，有一种挂靴的预感。&lt;/li&gt;
  &lt;li&gt;依然在氪明日方舟，去年没算彩虹六号，彩六联动复刻后，真的全图鉴了。&lt;/li&gt;
  &lt;li&gt;错过了所有gamejam&lt;/li&gt;
  &lt;li&gt;刷完了多邻国的粤语课（不过后来去香港被拷打了）&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;-7&quot;&gt;～&lt;/h2&gt;

&lt;p&gt;24年已经过去一半了，今年最重要的事情，是保持好心态，照顾好自己的身体：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;多看书，又可以在通勤路上看书了；&lt;/li&gt;
  &lt;li&gt;考出摩托车科二科三；&lt;/li&gt;
  &lt;li&gt;全家旅行，日本、欧洲，以及25年1月有个美国朋友结婚；&lt;/li&gt;
  &lt;li&gt;保持健康，保持运动，提高基础代谢能力；坚持踢球，和女儿一起跳绳&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;-8&quot;&gt;～&lt;/h2&gt;

&lt;p&gt;希望世界和平，国泰民安。&lt;/p&gt;
</description>
        
          <description>&lt;p&gt;终于熬完了本命年！&lt;/p&gt;

</description>
        
        <pubDate>Thu, 30 May 2024 00:00:00 +0000</pubDate>
        <link>https://artori.us/arthur-s-2023-summary/</link>
        <guid isPermaLink="true">https://artori.us/arthur-s-2023-summary/</guid>
        
        <category>Summary</category>
        
        
        <category>Life</category>
        
      </item>
      
    
      
      <item>
        <title>Arthur的2022年度总结</title>
        <description>&lt;p&gt;按照惯例，看了一下创建这个草稿的时间是2022-12-13 11:34，所以整整4个月过去了，我终于开始继续了。虽然这个2022年实在是不想过多回顾。&lt;/p&gt;

&lt;h2&gt;~&lt;/h2&gt;

&lt;p&gt;2022年3月的时候家里发生了一些意外，因为实在没有好办法照顾孩子，于是我申请了一个月的远程，带着女儿回到了我老家嘉兴，让我父母也能帮着照顾一下孩子。这一个月我过上了一个全新的生活，每天早上7点多就和娃一起起床，然后会带着她去附近寻找一家新的咖啡店，一起吃个早饭，然后回到家陪她玩一会儿，吃个午饭。下午她午睡了，我就一个人去咖啡店工作，或者去朋友公司打扰他们，直到晚饭时间回家。&lt;/p&gt;

&lt;p&gt;觉得这生活过的挺宁静的时候，上海的疫情形势突然前所未有的紧张起来了。去年的总结写到急转直下，但其实只是3月开了个头，谁能想到接下来的4月5月才是重头戏，我和孩子就这么无巧不巧躲过了一劫，直到6月公司恢复坐班，我们才回到上海。&lt;/p&gt;

&lt;p&gt;经历了完全失去自由，天天核酸，去哪里都要扫码，高速穿梭都要落地捡的半年非人生活后，年底突然一切开始恢复正常了，轻松很多。12月又是很巧周末回嘉兴的时候开始发烧，于是阳的2周又恰好一个人呆在了嘉兴。&lt;/p&gt;

&lt;h2 id=&quot;-1&quot;&gt;~&lt;/h2&gt;

&lt;p&gt;上半年在嘉兴，想记录一些东西，添置了新的相机。坚持胶片所以买了一台尼康F3，其实本来更中意全机械的机型，但F2的Auto镜头实在有点古早，不值得的感觉。等机器到的时候还在网上瞎买了几台尼康EM玩，没想到为了找到一个成色足够好的，开了7、8台盲盒，而且最后全都留下了，将来赠予有缘人吧。之后这一年里买了好几个AIS的镜头，都是1000不到吧，还买了腰平。要不是胶片涨价的厉害，其实这个路线器材好玩又便宜。&lt;/p&gt;

&lt;p&gt;每天在嘉兴乱拍，结果为了找一家冲洗店跑遍了全城也没有一家可以冲洗了，最后还是只能寄到上海，赶上封城，可以说是大大的延迟满足了。印象最深的是一次遇到了小时候家里附近的一个疯子，他已经5、60岁了吧，小时候被他追，特别害怕。红绿灯的时候他从我面前走过，结果我一眼认出来，赶紧拿起相机拍了一张，记录下了他正好转过来看着我镜头的脸。还有嘉兴疫情最紧张的那几天，大家都吓得不敢出门，我背着相机在路上，街上只有我和送外卖的小哥，拍到了好几个大白逛gai的画面。&lt;/p&gt;

&lt;p&gt;我每一台新相机的使用，都是去国外找视频的，这种经验类的知识视频的传递是最到位的，因为有很多不经意的细节值得揣测。比如他们会忘记告诉你取景器是向后轻轻一拉就可以巧妙的打开的，但他们打开它的动作被记录在视频里，可以自己去发现。于是我也一直想把所有我拥有过的相机记录一遍，每一个按钮是干嘛的，怎么正常使用拍摄一卷胶片，零零散散也买了7、8种相机了，希望2023年我可以开始做这件事。&lt;/p&gt;

&lt;h2 id=&quot;-2&quot;&gt;~&lt;/h2&gt;

&lt;p&gt;世界杯的时候因为不满意公司的线上活动太casual，于是自己开始写一个硬核一些的足球游戏，最后类似一个抽盲盒版本买卖交易球员的世界杯fantasy。在Edward的帮助下，这个事情在世界杯开幕前19天内完成了。整个世界杯期间，我也每天起早贪黑的更新每天的比赛数据，因为要精确到球员每场比赛的打分，所以真的花了很多功夫运营。&lt;/p&gt;

&lt;p&gt;权且不说这个游戏本身给玩家给自己创造了多少价值，至少我在这个过程里找到了自己做一个产品的感觉和激情，让我找到更多信心，意识到更多时候不是等着东西来，然后抱怨他们这不好那不好，而是主动出击去寻找自己在意的感兴趣的东西投入。虽然这个过程中属实让我意识到自己的年迈，但还好那份热情和执着还在。&lt;/p&gt;

&lt;p&gt;这个游戏在世界杯结束后也下线了，许诺的导出数据的部分因为年底阳了结果耽搁到了现在（😛
说起来因为要运营这个游戏，今年世界杯看得真是，认真仔细全情投入，事无巨细。比如每个球队的大名单，和名单变化，比如第一个角球第一个红牌第一个乌龙都历历在目，因为要算到球员的分里。&lt;/p&gt;

&lt;h2 id=&quot;-3&quot;&gt;~&lt;/h2&gt;

&lt;p&gt;最重要的事写完了，接下来列一些bullets吧。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;棉花最重要的事情是开始上幼儿园了，虽然疫情把时间挤压的只剩下1个多月，但看得到她进步特别大；她还经历了人生中第一次住院，不过没什么大碍&lt;/li&gt;
  &lt;li&gt;最棒的产品是Copilot，此时此刻他正在帮助我胡乱续写一些我不需要的东西。比如这里他续写了一句「我不知道他是怎么做到的，但是我很喜欢这个功能，我希望他能够越来越好。」&lt;/li&gt;
  &lt;li&gt;最喜欢的动画是老朋友推荐的《漂流少年》，剧情好脑洞大，音乐也有品味，有落日飞车哦，最后一集莫名其妙看哭；&lt;/li&gt;
  &lt;li&gt;最喜欢的一场演出是赶上了Neo关门；8月去长沙看了一个音乐节&lt;/li&gt;
  &lt;li&gt;全年的投资都很失败，股票大跌、FTX暴雷、NFT贬值&lt;/li&gt;
  &lt;li&gt;意外，AC米兰拿了意甲冠军；很感谢这个世界，让梅西的阿根廷拿到了世界杯冠军&lt;/li&gt;
  &lt;li&gt;坚持在踢足球，但是踢的不好&lt;/li&gt;
  &lt;li&gt;看了一场月全食&lt;/li&gt;
  &lt;li&gt;参加了两次Game Jam，都几乎是我孤身奋战，所以都是做的自己喜欢的创意，但也完成的不太理想；参加了一次公司的hackathon，探索了一番「女书」，发现unicode也有了，字体也有了，最后做了一个应用层的手机app&lt;/li&gt;
  &lt;li&gt;在氪明日方舟，全图鉴了，氪的没有21年多（笑&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;-4&quot;&gt;~&lt;/h2&gt;

&lt;p&gt;2023年已经过去4个月了，因为每天早上送孩子上学，早上多了很多时间，所以我利用这个时间给自己安排了很多日常任务。看书、多邻国、刷RSS。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;多看书，现在非常具体的大部头小说目标是看完两部《大医》和后两部《星之继承者》。&lt;/li&gt;
  &lt;li&gt;学完多邻国粤语，然后开一个别的坑&lt;/li&gt;
  &lt;li&gt;把摩托车增驾给考了，把车也买了吧&lt;/li&gt;
  &lt;li&gt;旅行，尤其是18年就错过的关西&lt;/li&gt;
  &lt;li&gt;保持健康，保持运动，提高基础代谢能力；同时坚持踢球，偶尔飞盘&lt;/li&gt;
&lt;/ul&gt;

</description>
        
          <description>&lt;p&gt;按照惯例，看了一下创建这个草稿的时间是2022-12-13 11:34，所以整整4个月过去了，我终于开始继续了。虽然这个2022年实在是不想过多回顾。&lt;/p&gt;

</description>
        
        <pubDate>Fri, 14 Apr 2023 00:00:00 +0000</pubDate>
        <link>https://artori.us/arthur-s-2022-summary/</link>
        <guid isPermaLink="true">https://artori.us/arthur-s-2022-summary/</guid>
        
        <category>Summary</category>
        
        
        <category>Life</category>
        
      </item>
      
    
      
      <item>
        <title>动森里「关系」</title>
        <description>&lt;p&gt;2020-2021年间，在一个没什么读者的newsletter写了一些有趣的东西，那段时间input比较多，于是就有很多output。也因为要写这些东西，所以不断在收集命题和素材，那段时间还挺充实的。所以觉得保持一个瞎写写的习惯其实蛮好的。在有更多选题和成果之前，容我先把之前的有意思的东西整理一下发出来吧。&lt;/p&gt;

&lt;p&gt;这篇是2020年6月12日写的，那个时候应该是动物之森玩腻了的时候。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;玩动森有段时间了，这天天保证有2-3个小时游戏时间的热度已经褪去了，最近开始听说了很多人冷静下来之后的评价，打开了一些自己的思路。&lt;/p&gt;

&lt;p&gt;主要想聊聊动森里人和人的关系，这篇文章也主要是写给玩过动森的人，所以里面很多动森的东西不详细解释了。&lt;/p&gt;

&lt;h2 id=&quot;一我与狸克&quot;&gt;一、我与狸克&lt;/h2&gt;

&lt;p&gt;用狸克其实指代了所有除了岛民以外的NPC，博物馆傅家兄妹、刺猬三姐妹等。&lt;/p&gt;

&lt;p&gt;狸克完全是被我物化的，他本质上只是游戏的功能，从一开始买卖道具、改造房屋，到后来询问游戏流程、改建岛屿等等，狸克从头到尾对我来说是个物体。他甚至不需要是一只狸猫，他也不会有任何带情感色彩的对白，所有玩家看到的都是那些功能性的语言。事实上ATM其实也多少做了一些最早狸克做的事情，ATM真的只是一个物体。&lt;/p&gt;

&lt;p&gt;当然这个物体是高度拟人化的，他把你带到这个小岛上（新手引导），给你介绍这里的生存规则（游戏规则），逐步展开游戏的系统，随着功能的增加，他会把自己的一些功能分给自己的徒弟。他会在前期做一些博物馆傅达的事情，之后引出傅达这个新的角色（新游戏功能）。&lt;/p&gt;

&lt;p&gt;很多人对这些NPC倾注的感情，无异于对物体的感情，人们讨论「摸摸妹妹」的时候，讨论余斯汀的钓鱼大赛的时候，讨论龙克斯的标本的时候，感受都是一样的，这种千篇一律的感受和大家对戴森，对苹果电脑的感受是类似的。&lt;/p&gt;

&lt;h2 id=&quot;二我与岛民&quot;&gt;二、我与岛民&lt;/h2&gt;

&lt;p&gt;与岛民的关系是十分微妙的，比起狸克，他们被设计的更有意思一点。他们随着时间的进行是千人千面的，我的岛民的家具是我给的，衣服是我挑选的，口头禅都是我设计的。时间久了他们也会学习很多东西，渐渐他们会知道我喜欢喝可口可乐，我最爱的电影是星球大战。同时他们也会给我很多新的价值，最直接的是送的礼物，除此之外，他们会给我起绰号，会给我他们自己的照片。在设计者的设计之下，他们会真正的和你建立情感上的联系，让你得到在这个游戏外，在你的岛外，甚至在这个岛民以外都体会不到的独一无二的情感联系。每个玩家和自己岛民的情感联系，也千人千面，截然不同。&lt;/p&gt;

&lt;p&gt;初来乍到的时候我怀着无比敬畏的心情来到这个岛屿上，我开始熟悉地形，记住每一块石头的位置。我甚至没有为最初的两个小动物挑选家的地方，我猜测这两个位置不是随机的，是这两个动物自己的喜好。我把他俩视作人，独立的个体，自由的意志，我尊重他们。这是最初我和岛民的关系，人与人的关系。&lt;/p&gt;

&lt;p&gt;但我对我的岛民，归根结底还是人对物的关系。这个物体被设计的更精致更有趣，但随着游戏的深入，我不再留心看他们的对话，因为对话开始变得重复、老套。我的目的也更强，我知道送你东西有可能得到礼物、我知道我给你的东西会被你怎样装饰起来。那种人和人之前的随机性无法得到完整模拟的时候，他的物体的一面就暴露在了我的面前，也让我对他们的认知发生了变化。&lt;/p&gt;

&lt;p&gt;我和岛民的关系随着游戏的深入在从人和人变成人和物，我真正感受到这一变化的时候，是我知道这个游戏在通关后可以自由改造岛屿的那一刻。一瞬间我成了这个岛的上帝。这岛上的一切事物，都可以被我改造、控制。这些动物，我可以留，可以赶走；桥、斜坡也不需要因地制宜，因为每一段河流、每一个高地可以被我改变。动物的家的地方，也不再需要尊重他们的自由意志了（事实上游戏之后来的村民的家也都不是他们自己选的），我需要他们的位置为我的伟大蓝图让位，全听我的，我是上帝，他们都只是我的玩物。&lt;/p&gt;

&lt;p&gt;虽然这可能是所有游戏NPC最终都摆脱不了的命运吧，但唯独动森可能最难以接受一点。&lt;/p&gt;

&lt;h2 id=&quot;三我与其他玩家&quot;&gt;三、我与其他玩家&lt;/h2&gt;

&lt;p&gt;动森的神奇魅力，其实是这一部分。是我最爱这个游戏的部分。技术上这个部分被制作的非常糟糕，体验非常反人类，设计也非常原始，从N64时期就带着的娘胎里的奇异设定至今没有得到改变。但他塑造了这个游戏最神奇的地方——玩家和玩家的关系。&lt;/p&gt;

&lt;p&gt;动森让玩家和玩家的关系变得非常纯粹并充满善意，我想不明白是什么游戏机制让玩家发生了这样的变化，我们在其他游戏里打打杀杀尔虞我诈。从去年10月份开始玩了三个月的《三国志·战略版》，结结实实的见识到了人性的丑恶，没有契约精神，欺骗、隐瞒、背叛。突然在动森这个游戏里荡然无存。劣币在这个游戏里没有驱逐良币，反而那些自私自利的人，不但少，而且很难在这个游戏里找到快乐和收获。具体的例子相信我不需要赘述，每个人都有美好的做客体验。&lt;/p&gt;

&lt;p&gt;我这里特别想和另一个游戏做对比。陈星汉的《Journey》，当时被人津津乐道，也让我震撼无比的系统，是你旅途中遇到的那些影子，其实都是其他玩家，我在开始游戏前并不知道这个设定。我至今记忆犹新，一个白色的影子熟练的带着我在黑暗中穿行于怪石林立的山洞，躲过巨大怪兽的追击的过程。他蹦蹦跳跳，发出声音，在引导你、帮助你。直到通关后看到Credits里玩家的id，我才知道我错过了这些玩家，这对我的情感冲击是巨大的，像极了人生中错过的那些陌路人，他们其实也有姓名。&lt;/p&gt;

&lt;p&gt;但很快从这种善意美好的冲击里清醒过来，我开始不享受这种互助的美好了。因为仔细去检讨Journey这款游戏，这种善意是被故意营造的，美好都建立在误会之上。因为这个游戏没有提供给玩家任何作恶的手段，两个玩家沟通的唯一方式，就是我说的「蹦蹦跳跳」，看起来那么可爱善意，但其实那个玩家很可能在背后骂娘。&lt;/p&gt;

&lt;p&gt;动森则不同。动森给了你足够的自由度，足够你去作恶，破坏动森玩家珍惜的游戏成果。你可以破坏别人的植物、随意捡拾别人地上的东西，偷别人的大头菜，欺负别人的村民等等。事实上大部分玩家也是「防人之心不可无」，对大头菜严防死守，有栏杆，放家里等等。这些手段没有因为充满善意的大环境而消失，人和人其实是带着最基本的防备的。有一次一个switch好友（不是现实的朋友）突然飞到我的岛上，我没有找到他在哪里，我甚至不知道他具体做了什么，但我本能的关掉了主机（因为联机断开会回档）。可见作恶和防御，都是这个游戏没有给你隐藏的。&lt;/p&gt;

&lt;p&gt;但这个游戏的善意，让这些防御变得有些荒唐。每个作客的人，其实都害怕打破那种善意。我觉得这种善意可能来自于己所不欲勿施于人的同理心，珍惜自己岛的时候也愿意珍惜其他人的岛？也有可能是来自游戏设计者的精心安排，虽然给你破坏的能力，但你并没有破坏的动机，砍掉一棵树并不会给你带来什么实际利益。我也不知道这奇妙的善意是哪里来的，这个话题可能一直值得探讨下去吧。&lt;/p&gt;

&lt;p&gt;最后聊聊玩家和岛的关系，其实它也随着其他玩家可以来做客，发生了很多变化。我在游戏初期就在机场门口留了一块牌子，「纪念品，一人一个」，旁边堆放了我重复、不需要的东西。朋友的岛上看到有一些路牌，告诉访客商店在哪里、博物馆在哪里。这些设施对单机玩家完全是不需要的。还有个例子就是那些卖大头菜收门票的岛，会用栏杆铺一个「一本道」通向自己的商店，完全是一个极端为别人来访的设计了。随着玩家和玩家的交流，我和岛的关系变成了我和我的QQ空间，而不是我和我的日记本的关系。&lt;/p&gt;

&lt;p&gt;想先粗浅的写到这里，欢迎认识我的朋友来和我做更多讨论哦。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;PS：把这篇旧文贴出来，也重新读了遍。其实后来听了&lt;a href=&quot;https://www.xiaoyuzhoufm.com/episode/5f056feb6d76607427d33b0b&quot;&gt;一期陈星汉访谈的播客&lt;/a&gt;之后，对Journey有了一些新的改观，经历了从喜欢、到讨厌刻意的设计，再到理解和和解的一个过程。简而言之就是游戏中的那些故意的思考，比如故意让角色没有任何性别或者其他特征，去掉了所有的标签。这种去掉标签的设计确实让我和这种刻意营造的善意氛围和解了，我觉得如果这是游戏设计者的初衷，想让你看到这一场梦，那我可以接受了。&lt;/p&gt;

</description>
        
          <description>&lt;p&gt;2020-2021年间，在一个没什么读者的newsletter写了一些有趣的东西，那段时间input比较多，于是就有很多output。也因为要写这些东西，所以不断在收集命题和素材，那段时间还挺充实的。所以觉得保持一个瞎写写的习惯其实蛮好的。在有更多选题和成果之前，容我先把之前的有意思的东西整理一下发出来吧。&lt;/p&gt;

</description>
        
        <pubDate>Tue, 13 Dec 2022 00:00:00 +0000</pubDate>
        <link>https://artori.us/animal-crossing/</link>
        <guid isPermaLink="true">https://artori.us/animal-crossing/</guid>
        
        <category>动物之森</category>
        
        <category>NintendoSwitch</category>
        
        
        <category>Video Game</category>
        
      </item>
      
    
      
      <item>
        <title>Arthur的2021年总结</title>
        <description>&lt;p&gt;一晃眼已经三月份了，很意外的是和往年不同，今年甚至连「哎呀我必须快点把总结写完」的紧迫感都没有了。自己觉得一个很重要的原因是去年底看了一下2020的年终总结，其中写的2021年的计划，一个都没有完成。&lt;/p&gt;

&lt;p&gt;回头去看2021年，其实疫情造成的影响已经很小了，切切实实受到疫情影响的第二年，对于在上海的人影响已经很小了，最大的莫过于不能出国旅行，除此之外这一年真的可以说已经过上了正常的生活（虽然在写这篇的时候疫情情况可是急转直下）。对于全球来说疫情的影响还在持续着，去年也写到过全球化的倒退等等。&lt;/p&gt;

&lt;p&gt;感觉2021年是我完成的事情最少的一年，上面也说了去年的计划一个都没完成。除此之外我也没有任何一个sideproject有什么大的进展，博客也没有更新过。可能是因为陪女儿的时间太多太多了，应该算是个好事。&lt;/p&gt;

&lt;p&gt;看过的书不多，一个月一本的样子，最喜欢的是星球大战索隆三部曲。&lt;/p&gt;

&lt;p&gt;看过的电影也出奇的少，而且很多都是我一个人去电影院看的。最喜欢的一部电影应该是《夜以继日》，也说不上哪里好，就是经常想起它。第一次看《潜伏》，确实好看。剧集的话补了很多UC高达的动画和007的电影。&lt;/p&gt;

&lt;p&gt;最值得骄傲的一件事可能是我认真的录了很多播客：《X是谁》、《播吧菲特》、《回家路上》。排名分先后，可以去小宇宙搜一搜来听。&lt;/p&gt;

&lt;p&gt;Rescuetime统计到的在线时间有1431个小时，平均一天有4个小时在对着电脑，其实是个蛮惊人的数据，毕竟我周末和其他业余时间都几乎没有花在电脑上了。下半年换了新的Macbook Pro, M1 Max，效率提升喜人。&lt;/p&gt;

&lt;p&gt;这一年其实抓紧时间出去玩了，带着棉花去了北海，国庆去了一次内蒙古，跟着公司去了三亚，还借着看live/音乐节之名去了一些地方。感觉没有疫情的时候一定要珍惜时间多出去玩玩看看，疫情情况一旦恶化可能连家门都出不去。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/jekyll/2021-travel.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;坚持在拍照，但主要都是旅行途中为主了。（倒是2022年年初在嘉兴生活的这段时间给了我很多启发，在一个熟悉的城市里也可以带着旅行的心态去学会生活的，以后找机会详细说说，可能是播客里说吧）因为还在拍照，所以测光的App也依然在更新，计划的大动作都还没有完成，只是一些日常维护，bug以及SDK更新、新设备支持等。&lt;/p&gt;

&lt;p&gt;坚持在听很多的歌，对于起步很晚的人来说，只能说这个宝库真的无限大。最喜欢的业余活动依然是去现场。今年最喜欢的一个乐队是Shanghaiqiutian，在短期内看了他们3场，在广州要到了签名，签名还画了一个拔石中剑的亚瑟王，年度高光时刻了。如愿看到了蛙池的现场，另外终于继19年平安夜后又一次看到了Deca Joins的现场。&lt;/p&gt;

&lt;p&gt;完整的踢完了一整年的足球，应该是40场以上的比赛。确实感觉自己进步很大，在基本功非常薄弱的前提下。另外很久没提我是AC米兰球迷了，实在战绩不行。好在上赛季半程冠军，最终亚军；这赛季截止2021年底米兰也依然有争冠的机会。&lt;/p&gt;

&lt;p&gt;最后，基本把去年的目标复制过来吧。&lt;/p&gt;

&lt;h2 id=&quot;2021&quot;&gt;2021&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;和老婆单独旅行一次（希望能出国吧）&lt;/li&gt;
  &lt;li&gt;和女儿一起做成一点什么（没想好是什么）&lt;/li&gt;
  &lt;li&gt;继续side projects
    &lt;ul&gt;
      &lt;li&gt;给测光app写个新UI&lt;/li&gt;
      &lt;li&gt;把去年说的神秘app更新&lt;/li&gt;
      &lt;li&gt;做些新东西，网站或者app&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</description>
        
          <description>&lt;p&gt;一晃眼已经三月份了，很意外的是和往年不同，今年甚至连「哎呀我必须快点把总结写完」的紧迫感都没有了。自己觉得一个很重要的原因是去年底看了一下2020的年终总结，其中写的2021年的计划，一个都没有完成。&lt;/p&gt;

</description>
        
        <pubDate>Thu, 31 Mar 2022 08:33:00 +0000</pubDate>
        <link>https://artori.us/arthur-s-2021-summary/</link>
        <guid isPermaLink="true">https://artori.us/arthur-s-2021-summary/</guid>
        
        <category>总结</category>
        
        
        <category>Life</category>
        
      </item>
      
    
      
      <item>
        <title>Arthur的2020年总结</title>
        <description>&lt;p&gt;2020是个非常特别的年份，从一月份就开始升温的紧张气氛就预示着这一年不会平凡，时至今日，今年的最后第二天，还是可以用非常不平凡来总结这一年。&lt;/p&gt;

&lt;h2 id=&quot;疫情&quot;&gt;疫情&lt;/h2&gt;

&lt;p&gt;疫情对这个世界，包括微观上对于我的影响，都是巨大的。脱欧、造墙为代表的不断倒退的全球化趋势，跟着病毒的蔓延在全球流行了起来。国家开始重新思考国境线的意义，很多高度市场化的国家也开始重新思考医疗卫生等环节收归国有的必要性。&lt;/p&gt;

&lt;p&gt;潜意识里，人们开始离开了「明天会更好」的惯性。也许不科学，但越来越多人在今年的跳槽里选择了更稳妥的目的地，一方面可能把市场伴随的疫情的下行表现也做很重要的一个决策依据，另一方面我也相信是人的潜意识里需要一些安全的要素，说是一种补偿也好，说是一种新的认知也可以。&lt;/p&gt;

&lt;p&gt;进入2020年的那天，和朋友们在法国干杯，没想到这也是今年唯一走出国门的一次经历了。之后在上海经历了那个最严防死守的冬天，衣服必须一进门就换掉，口罩必须用最科学的方式收纳和处理。家里上有老下有小，连洗手都采用了一个从来不会使用的复杂流程。&lt;/p&gt;

&lt;p&gt;从夏天到今天，国内相对没有那么恐怖的半年，疫情却在海外肆虐。读了一半&lt;a href=&quot;https://book.douban.com/subject/27116331/&quot;&gt;《瘟疫与人》&lt;/a&gt;，重新审视了人和自然以及人和病毒的关系。&lt;/p&gt;

&lt;h2 id=&quot;工作&quot;&gt;工作&lt;/h2&gt;

&lt;p&gt;去年开始工作内容发生了很大的变化，即刻发生意外之后大家尝试了很多新方向，有现在势头良好的小宇宙，有我投入了最多精力的橙，有后来新的即刻。还有更多更多快鸟、面即、即士多这样的其他尝试。&lt;/p&gt;

&lt;p&gt;从做一个iOS app的iOS开发，转型成了做很多iOS apps的开发。每一个可以被抽象应用到多个应用的地方，都加入了新的思考。这一年里我们自己不断复杂的模块，开始在各个应用里得到应用。各种牵制、取舍，给了很多的经验。&lt;/p&gt;

&lt;p&gt;在投入到橙的开发里的几个月，经历了很多很多故事和困难，甚至是生离死别。在困难的时候，我也尝试走出一个开发应该关注的范围，去尝试了更多的力所能及里所不能及的工作，效果有好有坏，评价有高有低，但也不亏。项目里的酸甜苦辣把团队里的大家更紧的捏合在一起，也产生了很多矛盾。这种很创业的经历，真的非常锻炼人。&lt;/p&gt;

&lt;h2 id=&quot;生活&quot;&gt;生活&lt;/h2&gt;

&lt;p&gt;棉花会说很多很多话了，还很幽默，比如会突然不叫我爸爸，模仿我妈叫我阳阳。比如会不直接的说，却反问说「把零食打开不好吗」。比如会懂事的和我说，爸爸感冒了要戴口罩。（写的时候，她正在旁边背元素周期表，「钠镁铝硅磷，硫氯要补钙」）&lt;/p&gt;

&lt;p&gt;买了一台「禄来35」和一台「GR3」，拍了很多很多照片。为了测光还自己粗糙的写了&lt;a href=&quot;https://apps.apple.com/app/id1522046585&quot;&gt;一个测光app&lt;/a&gt;上架了，太粗糙了所以也没卖出几份。打算明年重新写一个UI。&lt;/p&gt;

&lt;p&gt;听了很多很多音乐，尝试了很多后摇。在疫情后也去了一些现场，秘密行动的最棒，也很喜欢Carsick Cars和惘闻。假假條和Deca Joins都在12月出了新专辑，不过都不如万能青年旅店成功吧。&lt;/p&gt;

&lt;p&gt;终于去了《Sleep No More》，体验非常特别，没看够，想再去。尤其特别的是，除了面具你还要戴口罩。&lt;/p&gt;

&lt;p&gt;从5月开始去了很多很多的KTV，密集的时候一个月去了3次，对曲库的挑战非常大，所以今年学会唱了很多很多歌。&lt;/p&gt;

&lt;p&gt;又开始好好看书了，没有很多很多，但逐渐开始享受看书这个事情了，是个好的开头。今年看过的有限的书里最喜欢的是《倦态社会》，也是发现于今年最爱的播客《不在场》的最后一期&lt;a href=&quot;https://www.xiaoyuzhoufm.com/episode/5f7468ff83c34e85dd1e1667?s=eyJ1IjogIjVlNDI3N2QyMzQxOWY0MDhiMzE2MjE4NyJ9&quot;&gt;《不在场 - EP10 冬天好》&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;去年看完了《老友记》之后，开坑了《广告狂人》，也在2020里看完了，如果《风骚律师》的未来最后一季没有爆表的话，广告狂人是我最喜欢的美剧了。今年电影看的特别少，也和疫情有关全球电影也就那样死气沉沉。印象最深的，竟是《菊次郎的夏天》，以前没有好好看过，这次在剧院里完全喜欢上了。&lt;/p&gt;

&lt;p&gt;博客没怎么更新，但其实偷偷摸摸写了不少东西，不过太羞耻了给朋友们看看就好了，不post在网上了。不过保持写作明显觉得写年底总结的时候顺畅了一些，不知道看官们看起来有没有进步？&lt;/p&gt;

&lt;p&gt;本来以为完全健康的2020年，没想到在年底晚节不保得了一场肺炎，但愿不会想18年年底那次一样咳嗽一整年。&lt;/p&gt;

&lt;p&gt;对了今年还「斥巨资」收购了一个下架的app，之前还没在任何场合提到过，所以总结里不多说了，之后用一个更正式的方式宣布吧。&lt;/p&gt;

&lt;h2 id=&quot;去年的目标&quot;&gt;去年的目标&lt;/h2&gt;

&lt;p&gt;除了没有学一门新语言外，其他目标都勉强达成了：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;国庆和老婆去了一次重庆，非常好玩，非常值得，非常愉快&lt;/li&gt;
  &lt;li&gt;有好好陪女儿，但给的时间真的不多，坚持周末把时间留给她&lt;/li&gt;
  &lt;li&gt;也算有个app上架在卖了&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;2021&quot;&gt;2021&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;和老婆单独旅行一次（希望能出国吧）&lt;/li&gt;
  &lt;li&gt;和女儿一起做成一点什么（没想好是什么）&lt;/li&gt;
  &lt;li&gt;继续side projects
    &lt;ul&gt;
      &lt;li&gt;给测光app写个新UI&lt;/li&gt;
      &lt;li&gt;把收购的app更新&lt;/li&gt;
      &lt;li&gt;做一个新的小app&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</description>
        
          <description>&lt;p&gt;2020是个非常特别的年份，从一月份就开始升温的紧张气氛就预示着这一年不会平凡，时至今日，今年的最后第二天，还是可以用非常不平凡来总结这一年。&lt;/p&gt;

</description>
        
        <pubDate>Wed, 30 Dec 2020 20:49:00 +0000</pubDate>
        <link>https://artori.us/arthur-s-2020-summary/</link>
        <guid isPermaLink="true">https://artori.us/arthur-s-2020-summary/</guid>
        
        <category>总结</category>
        
        
        <category>Life</category>
        
      </item>
      
    
      
      <item>
        <title>十年</title>
        <description>&lt;p&gt;想到哪儿想到哪儿吧。&lt;/p&gt;

&lt;p&gt;09年是怎样一个契机搭建了自己的独立博客我已经不记得了，最早的域名是我在网上用的最多的handle：arthraim.cn。cn域名应该是优惠在新网上一块钱买的。主机我已经忘了，是一个很小的VPS。&lt;/p&gt;

&lt;p&gt;有个十多年前的画面一直忘不掉，那会儿住在学校外一个带厕所的朝南卧室，阳光很好的一个日子我拼命在电脑前写着博客。那时候什么都写，PSP的破解新闻啦、3G网络的选择啦、买了个诺基亚新手机啦，甚至Taylor Swift的专辑啦。很多文章太羞耻了被我「自我审查」了🤪 现在看不到了。&lt;/p&gt;

&lt;p&gt;在建自己的博客前是沉迷博客园，一个都是宅男程序员的天下。那时候很喜欢.net，博客园排名最靠前TerryLee、Jeff Zhao也都是相关技术的博主。平时对着电脑没事就喜欢捣鼓新东西，关注过微软的Axum（后来很多东西去了F#）、写过XNA的教程，可能那时候高产又认真，老赵的博客友链里还有我，一挂也挂了十多年了。只是高产的那几年始终也没找到过最喜欢的方向倒是真的。&lt;/p&gt;

&lt;p&gt;12年arthraim.cn因为没续费曾被域名代理商恶意续费了两年。那时手上还有artori.us，于是借机换上了这个域名，其实也更喜欢这个一点，也沿用到了现在。再次买回arthraim.cn已经是2年后的事了，毕竟这种域名肯定是卖不出去的。因为这么个事儿流量掉了好多，想不到前几年竟是最好的几年了。&lt;/p&gt;

&lt;p&gt;arthraim这个handle由来于家里的第一台PS3，我Arthur和我弟Ephraim想共用一个psn账号，于是把名字拼了一下注册了邮箱和psn，后来也习惯了，一直被我用着。我弟也有另一个叫ephur，似乎不太见他在用了。&lt;/p&gt;

&lt;p&gt;￼博客最早用的系统叫zblog，后来也没关注过他的死活了，用access做数据库，所以其实是为了部署方便。后来也用过一段时间WordPress，把db转到MySQL还废了不少功夫，试了很多两个系统都支持的中间格式。那时候也非常执着于把url路径保持一致，以避免丢掉搜索引擎的流量，各种讲究，后来也都佛系了。再后来沉迷ruby的时候改用了octopress，也是把文章转成markdown废了不少功夫，毕竟db里曾经是HTML。有耐心的时候一篇一篇文章手工调整过。不过似乎这个事情是一劳永逸的，markdown文件灵活多了；静态页面的网站部署起来也简单。几年前返璞归真找了个现成的Jekyll主题，文章也就直接用起来了。插图搬来搬去也不嫌烦，主要图片也不是特别多，写过几个脚本去改markdown里的图片路径。只是以前的文章路径不再保留了。&lt;/p&gt;

&lt;p&gt;总感觉现在没什么人会有独立博客了，开个公众号的人多得多，毕竟好处太多了，流量啦打赏啦什么的，甚至还能看到精灵语克林贡语。其实独立博客有很多古典主义万维网的美感，各种超链接指来指去，各种友链互相带流量，开放，又尊重原作者。&lt;/p&gt;

&lt;p&gt;我的热情可以从每年写文章的数量减少里看出来在消退。随着阅历的丰富和品味的提升，自己写的半调子文章也没脸再发表出来了。越来越高的标准并没有正向激励我越写越好，反而越来越不愿意写了。于是每年只有那篇很personal的总结雷打不动的可以保证会写，毕竟个人的东西别人也不太好评价。&lt;/p&gt;

&lt;p&gt;这个写了十年的博客，现在已经没啥野心了，就让他一直存续下去也不错。如今部署也省心，用的GitHub pages，什么HTTPS、CDN也不用自己折腾了。这么一来我的博客快照其实可能还被埋在了北极的冰层里？谁知道呢……&lt;/p&gt;

</description>
        
          <description>&lt;p&gt;想到哪儿想到哪儿吧。&lt;/p&gt;

</description>
        
        <pubDate>Thu, 12 Mar 2020 03:21:00 +0000</pubDate>
        <link>https://artori.us/decade/</link>
        <guid isPermaLink="true">https://artori.us/decade/</guid>
        
        <category>总结</category>
        
        <category>随笔</category>
        
        
        <category>Life</category>
        
      </item>
      
    
      
      <item>
        <title>Arthur 的 2019 年总结</title>
        <description>&lt;p&gt;又到了写年终总结的时候了，今年又是一个值得总结的年份，发现这个博客也好像10年了，所以我写着写着还犹豫过要不要写一个10年的总结啊。但其实也没啥可总结的好像。&lt;/p&gt;

&lt;h2 id=&quot;小棉花&quot;&gt;小棉花&lt;/h2&gt;

&lt;p&gt;第一年做爸爸，角色的转变真是比我想象的还要困难，总的来说还是给自己打一个刚刚及格的分数吧。一个困难的开头，自己要照顾自己身体的同时，还要半夜起来照顾孩子。&lt;/p&gt;

&lt;p&gt;孩子真的是个非常「现实」的生物，有奶便是娘这句话古人不是乱说的。孩子和妈妈的羁绊是与生俱来，孩子最早能发的音，就被他用来叫自己的母亲。谁陪她时间多，她就和谁更亲近。截止1岁生日的时候，棉花不会叫爸爸，已经会叫陪的多的妈妈奶奶外婆什么的了。&lt;/p&gt;

&lt;p&gt;老婆这一年没有去工作，到了年末才开始找工作。我们也没有在2019年安排旅行，甚至大年三十也因为孩子只是在自己家里简单的吃了一顿晚饭。&lt;/p&gt;

&lt;p&gt;有孩子需要的决心，我还是严重预估不足的。这真的值得好好写一篇。因为棉花不太爱吃，所以一直处在营养不良的范围里，所以体检非常频繁，生怕影响身心发育。坚持陪她去打了每一个预防针，去了每一个月的体检，也算是给自己的好爸爸形象扳回一城。&lt;/p&gt;

&lt;p&gt;小棉花也在茁壮成长啦。为了防止晒娃骚扰其他人，又为了释放晒娃的渴望，给小棉花开了一个&lt;a href=&quot;https://www.instagram.com/xmh_yr/&quot;&gt;instagram&lt;/a&gt;账号。&lt;/p&gt;

&lt;h2 id=&quot;即刻&quot;&gt;即刻&lt;/h2&gt;

&lt;p&gt;因为一点意外所以工作的内容突然发生了一些变化。花了点时间来重构归纳一些可以被抽出来的基础设施。投入了很多时间但是收益其实一般，在实际使用过程中才发现有点理想主义了不太符合新app的需求，之后重新花时间来重做了一遍。&lt;/p&gt;

&lt;p&gt;因为另外一个意外，人事上也发生了一些变动。所以对自己的看问题的视角、思考方式都提出了很多挑战。大学的时候我一直觉得自己是个很迷茫的人，以至于大学毕业后直到现在我都觉得将来有一点我更清醒了，会去帮助迷茫的年轻人快点找到自己的路。不过今年的意外收获让我发现其实我可以在各种角色上帮助别人变得更好，这份努力其实不需要你自己有一个什么特别的角色。让别人变得更好也是我2020年最想努力的事情。当然也包括自己了。&lt;/p&gt;

&lt;p&gt;今年上半年参考了汉字排版规范给即刻app增加了很多汉字排版相关的功能，主要是中西文间隔和中文标点挤压。后者比较容易说清楚，就是连续的一些全角标点按规则挤压成半角，比如一串」』」』」』」，每个都只会有半个字宽。前者就是中文里插入西文时候加的空格了，我采用了比较激进的方式，直接用kerning来调整中西文字符间的距离。后来大家知道了，无独有偶，苹果也采用了类似的方案强插在了iOS 13和最新的macOS系统里。相较于苹果的方案，自认为我的实作还有一些可取之处。比如这个间距在即刻里是会根据西文的长度来动态调整的。比如「第3人」的3左右会有一个非常小的间距，而「那句Stay hungry, stay foolish好像不是乔布斯最早说的」里的英语两侧则会有完整的两个半个字宽的间距。&lt;/p&gt;

&lt;p&gt;今年还写了一个Swift的redux，支持middleware，基本上和javascript没什么区别除了类型处理起来相对复杂一点。不管怎样实现之后还是挺有成就感的，尤其是现在已经投入到生产里了。&lt;/p&gt;

&lt;h2 id=&quot;兴趣有点多&quot;&gt;兴趣有点多&lt;/h2&gt;

&lt;p&gt;上半年疯狂的喜欢上了赛车运动，xjb总结了一下大概是觉得自己那段时候身体不好，所以非常需要一个能扩展自己能力边界的东西。在公司的GT争霸赛最后也没能破掉同事的记录，有点遗憾不过还是服输的。之后买了一本赛车手的教材认真的学习了很多系统性的知识，希望积累到一定程度的时候能有所质变。毕竟虽然现在落后了不到1秒，但距离那个赛道的极限还是差了好多秒的。&lt;/p&gt;

&lt;p&gt;夏天因为《乐队的夏天》开始听更多的歌了。就像迷恋独立游戏一样，对独立音乐也产生了很多的兴趣。也受同事的影响开始去live house和音乐节，以前觉得就我这年纪了也没必要了。这一年反而放松了很多，可能也是一种中年危机的表现，愿意尝试更多可能性。
听着听着还去听完了沈鸿元的爵士课（和焦元溥的古典课），听的口味重了喜欢上了假假條，去听乐夏的乐队的结果发现了橘子海，去有草东的音乐节结果听进去了Deca Joins。后来迷迷糊糊又在某个音乐节听到了秘密行动，于是有开始听听电子乐。总之这一年比发现当年发现粤语乐坛更快乐，听了很多各种各样的音乐。&lt;/p&gt;

&lt;p&gt;冬天的Global GameJam因为棉花的关系没参加，所以夏天的CIGA Gamejam雷打不动去了，因为阵容强大所以我反而无所事事。做了一个有趣的即时卡牌游戏，于是当了多年美术总监的我画起了卡牌的卡面，当然画的是不咋样，但过程还是乐此不疲。最终的游戏也真的很喜欢，可惜要完善也是不可能的。。。&lt;/p&gt;

&lt;p&gt;没看很多电影，豆瓣数了下33其实还包括了一些补标的，有史以来最少的一年了。
虽然星球大战9部曲是乔治卢卡斯自己的计划，迪斯尼接盘后终于由别人在今年完成了这个计划。电影可以说是相对糟糕的，但临到末了镜头回到Tatooine还是让我难过的不行。和不理解这种心情的朋友的时候又xjb总结了下，更像是毕业和同学分离的那种难过，虽然来日方长但一场告别还是让人难过，给一段经历画个句号并告别吧。&lt;/p&gt;

&lt;p&gt;10年总结可以写的话，我觉得这段是最值得写的，10年里追的好多美剧都结束了。权力的游戏、生活大爆炸、硅谷。TBBT忘了具体啥时候最终季的，之前一直没看，看最后几集也是一直哭，从自己大学毕业租房到结婚成家生孩子，整个轨迹和TBBT都挺同步的其实。值得一提是因为那份惆怅，10月开始第一次完整的补全了《老友记》。也入了些其他的新坑，比如曼达洛人和守望者，都是满分推荐。&lt;/p&gt;

&lt;h2 id=&quot;2020&quot;&gt;2020&lt;/h2&gt;

&lt;p&gt;19年说的多陪家人和保持健康都算及格完成了。当时说的side project肯定没做完，不然一个新app会上架的。blog主题更是没做了。&lt;/p&gt;

&lt;p&gt;2020年的小目标：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;和老婆一起出去旅行一次&lt;/li&gt;
  &lt;li&gt;多陪女儿&lt;/li&gt;
  &lt;li&gt;继续side project（或者另起一个新的）&lt;/li&gt;
  &lt;li&gt;学一门新语言&lt;/li&gt;
&lt;/ul&gt;

</description>
        
          <description>&lt;p&gt;又到了写年终总结的时候了，今年又是一个值得总结的年份，发现这个博客也好像10年了，所以我写着写着还犹豫过要不要写一个10年的总结啊。但其实也没啥可总结的好像。&lt;/p&gt;

</description>
        
        <pubDate>Tue, 03 Mar 2020 00:36:00 +0000</pubDate>
        <link>https://artori.us/arthur-s-2019-summary/</link>
        <guid isPermaLink="true">https://artori.us/arthur-s-2019-summary/</guid>
        
        <category>总结</category>
        
        
        <category>Life</category>
        
      </item>
      
    
      
      <item>
        <title>Swift 5字符串内部编码变化</title>
        <description>&lt;blockquote&gt;
  &lt;p&gt;TLDR：&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;不要假设&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String&lt;/code&gt;实例里的编码是UTF-16 / UTF-8&lt;/li&gt;
    &lt;li&gt;不要把&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Range&lt;/code&gt;实例和相关联的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String&lt;/code&gt;实例分开使用&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;这篇文章假设你已经知道Swift &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Range&amp;lt;String.Index&amp;gt;&lt;/code&gt; 对emoji或其他ligature的处理，和Objective-C &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NSRange&lt;/code&gt;是不同的！这边文章不是探讨这个问题的。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;下面详细说说来龙去脉，试着先说清楚我们遇到的实际问题，如果你没兴趣了解太多实际问题的上下文，可以直接跳到下文「实验」部分。&lt;/p&gt;

&lt;h2 id=&quot;遇到的bug&quot;&gt;遇到的bug&lt;/h2&gt;

&lt;p&gt;遇到一个Crash，我们有一个功能，是在TextView删去一段字符（比如&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Arthur &lt;/code&gt;）的最后一个字符（空格）的时候，删去整段字符（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Arthur &lt;/code&gt;），类似微信里你删除一个@的人的名字的时候的体验。&lt;/p&gt;

&lt;p&gt;我实现的方式是：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;textView(_:shouldChangeTextIn:replacementText:)&lt;/code&gt; 回调中，检查如果用户在尝试删除 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Arthur&lt;/code&gt; 中那个空格的时候，找到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Arthur&lt;/code&gt;的Range，把Range记录下来。&lt;/li&gt;
  &lt;li&gt;之后这个Range会被传来传去，最后在另一个地方拿着这个Range去删除 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;textView.attributedText.string&lt;/code&gt; 里的对应字符。当然我可以确保这个过程中 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;textView.attributedText.string&lt;/code&gt; 并没有发生变化。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;两者都会把Swift &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Range&amp;lt;String.Index&amp;gt;&lt;/code&gt;转为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NSRange&lt;/code&gt;，但转的时候基于的String是相同内容的不同实例。以上是前提。&lt;/p&gt;

&lt;p&gt;在Swift4.2以及之前的版本里，都没有问题。升级到Swift5之后发生了Crash，表现是步骤 1 和 2 中拿到的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NSRange&lt;/code&gt; 并不相同。比如 1 的时候找到的是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{2, 6}&lt;/code&gt;，到了 2 的操作时候变成了 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{6, 16}&lt;/code&gt;，这都是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NSRange(range, in: string)&lt;/code&gt; 来转的结果，如前面所说这个string是内容相同的不同实例。&lt;/p&gt;

&lt;p&gt;这里真正值得注意的就是这两个不同的实例，1里的string是一个在Swift初始化的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String&lt;/code&gt; 实例，而2里是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;textView.attributedText.string&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;看到这里可能nb的你已经注意到了，前者是一个swift &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String&lt;/code&gt;，在5的内部编码（native encoding）被改成了UTF-8；而后者&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;textView.attributedText.string&lt;/code&gt;虽然在编译时是一个swift &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String&lt;/code&gt;类型，但原先是一个Foundation的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NSString&lt;/code&gt;，所以他的内部编码是UTF-16。&lt;/p&gt;

&lt;p&gt;Range是在UTF-8上找到的，再应用到UTF-16的字符串上自然是有问题了。（比如ASCII在前者是单个Byte，后者则两个Bytes等）&lt;/p&gt;

&lt;h2 id=&quot;实验&quot;&gt;实验&lt;/h2&gt;

&lt;p&gt;得到这个结论后，写了个例子&lt;/p&gt;

&lt;div class=&quot;language-swift highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Foundation&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;string1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;汉字Let&apos;s try to reproduce this bug..&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;string2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;NSString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;汉字Let&apos;s try to reproduce this bug.. &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;substring&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Let&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;range1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;startIndex&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;..&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;endIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;locale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;range2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;startIndex&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;..&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;endIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;locale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;nsRange1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;NSRange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;range1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// {2, 3}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;nsRange2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;NSRange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;range1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// {6, 3}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;//    let nsRange3 = NSRange(range2, in: string1)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;//    let nsRange4 = NSRange(range2, in: string2)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;这是一个运行时的问题，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;string2&lt;/code&gt;的内部编码仍是之前的UTF-16，但&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;string1&lt;/code&gt;则完全是一个（Swift5改动后）UTF-8的字符串。&lt;/p&gt;

&lt;p&gt;这就是为什么&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;string1&lt;/code&gt;中找到的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;range1&lt;/code&gt;，在用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;string2&lt;/code&gt;转成&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NSRange&lt;/code&gt;的时候会错。&lt;/p&gt;

&lt;p&gt;&lt;small&gt;
（有意思的是如果把注释打开，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nsRange3&lt;/code&gt;那一行会在运行时报错&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXC_BAD_INSTRUCTION&lt;/code&gt;，你根本无法把&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;range2&lt;/code&gt;用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;string1&lt;/code&gt;转成&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NSRange&lt;/code&gt;？）
&lt;/small&gt;&lt;/p&gt;

&lt;h2 id=&quot;所以&quot;&gt;所以……&lt;/h2&gt;

&lt;p&gt;所以第一反应是为什么语言层或者Foundation不帮忙做这个转换，但仔细想想，其实没人敢保证String/NSString里是什么编码的，没法自动完成这个转换。虽然&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NSString&lt;/code&gt;默认是UTF-16，swift &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String&lt;/code&gt;默认是UTF-8，但运行时谁也说不好操作的字符串是默认编码的，我们的代码也不该在任何时候做这样的假设。&lt;/p&gt;

&lt;p&gt;所以把开头那两条东西再说一遍。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;不要假设&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String&lt;/code&gt;实例里的编码是UTF-16/UTF-8；&lt;/li&gt;
  &lt;li&gt;不要把&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Range&lt;/code&gt;实例和相关联的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String&lt;/code&gt;实例分开使用。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;当然有很多转换的方法，Swift 5还deprecate了一堆比如&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;encodedOffset&lt;/code&gt;这样的方法，开发者必须明确知道自己操作的String是什么编码的，可以用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;utf16Offset&amp;lt;S&amp;gt;(in: S)&lt;/code&gt;之类的完成之前的工作。不过这不是本文的重点了，比较直接的做法：&lt;/p&gt;

&lt;div class=&quot;language-swift highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;utf8String&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;utf8String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;using&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;utf8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;总之从此之后，针对&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Range&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NSRange&lt;/code&gt;的操作，除了以前要注意的emoji/ligature的不同处理以外，还要更细致的处理操作的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NSString&lt;/code&gt;的编码，他们不再是无脑UTF-16了。&lt;/p&gt;

</description>
        
          <description>&lt;blockquote&gt;
  &lt;p&gt;TLDR：&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;不要假设&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String&lt;/code&gt;实例里的编码是UTF-16 / UTF-8&lt;/li&gt;
    &lt;li&gt;不要把&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Range&lt;/code&gt;实例和相关联的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String&lt;/code&gt;实例分开使用&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

</description>
        
        <pubDate>Mon, 08 Apr 2019 23:59:00 +0000</pubDate>
        <link>https://artori.us/swift-5-string-native-encoding-change/</link>
        <guid isPermaLink="true">https://artori.us/swift-5-string-native-encoding-change/</guid>
        
        <category>Swift</category>
        
        <category>Swift5</category>
        
        <category>String</category>
        
        <category>UTF-8</category>
        
        <category>UTF-16</category>
        
        
        <category>Programing</category>
        
      </item>
      
    
      
      <item>
        <title>M5Stick 上的体感 3D 模型查看器</title>
        <description>&lt;p&gt;前段时间做了一个小玩具，如下图所示，也可以看&lt;a href=&quot;https://m.okjike.com/originalPosts/5c923624f7b0dc00119bff68?username=F65E8535-A827-4B75-8583-EFD4EB5C2671&quot;&gt;这个视频&lt;/a&gt;。写出来记录一下心路历程。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/jekyll/m5stick.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;那几日沉迷淘宝推荐流不能自拔，于是在清晨迷糊中买下了一个 &lt;a href=&quot;https://docs.m5stack.com/#/en/core/m5stick&quot;&gt;M5Stick&lt;/a&gt; 带 MPU9250 的版本。不贵，100 元不到的价格，想着买都买了不玩一玩对不起自己的冲动消费。&lt;/p&gt;

&lt;h2 id=&quot;搭建环境&quot;&gt;搭建环境&lt;/h2&gt;

&lt;p&gt;好久没玩 Arduino 了，上次还是 &lt;a href=&quot;https://weibo.com/micbell?is_all=1&quot;&gt;13 年做的门铃&lt;/a&gt;。发现 &lt;a href=&quot;https://twitter.com/Arthraim/status/1106172342835675138&quot;&gt;VSCode 也有插件&lt;/a&gt;，比原来的 Arduino app 可好用多了。&lt;/p&gt;

&lt;p&gt;其他的依赖和板子信息按照&lt;a href=&quot;https://docs.m5stack.com/#/en/quick_start/m5stick/m5stick_quick_start_with_arduino_MacOS&quot;&gt;官方文档&lt;/a&gt;安装即可。&lt;/p&gt;

&lt;p&gt;遇到一个坑，刚开始问了淘宝卖家也没解决。Mojave 上连接了 M5Stick 之后，怎么都看不到对应的串口。但系统设备里可以看到这个设备叫&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CP2104 USB to UART Brige Controller&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;于是顺藤摸瓜，找到了对应的&lt;a href=&quot;https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers&quot;&gt;驱动&lt;/a&gt;，下载安装重启搞定~~ 顺便告诉了淘宝卖家，希望能帮到今后遇到这个问题的人。&lt;/p&gt;

&lt;h2 id=&quot;3d图形&quot;&gt;3D图形&lt;/h2&gt;

&lt;p&gt;首先有兴趣的是屏幕，一个 128x64 的液晶屏，显示些什么比较有意思的呢。网上的例子多是用来显示纯文本。比如原厂的&lt;a href=&quot;https://github.com/m5stack/M5Stack/tree/master/examples/Stick&quot;&gt;几个例子&lt;/a&gt;多是用到了 &lt;a href=&quot;https://github.com/olikraus/u8g2/wiki/u8x8reference&quot;&gt;u8x8&lt;/a&gt;。其实我们的 ESP32 这么强大，为啥没人做做 3D 的图形。&lt;/p&gt;

&lt;p&gt;于是经过一番研究，发现图形还得用 &lt;a href=&quot;https://github.com/olikraus/u8g2/wiki&quot;&gt;u8g2&lt;/a&gt;。另外我并不熟悉 3D projection 的算法，在动手写一个自己的算法前无意找到了 &lt;a href=&quot;https://github.com/menehune23/projection&quot;&gt;menehune23/projection&lt;/a&gt;，一个非常不错的封装但只有4个star。&lt;/p&gt;

&lt;p&gt;简单试了一下发现十分靠谱，&lt;strong&gt;&lt;a href=&quot;https://m.okjike.com/originalPosts/5c90ed1a7c50db00106947ad?username=F65E8535-A827-4B75-8583-EFD4EB5C2671&quot;&gt;改了个他的 demo 画出了一个正立方体&lt;/a&gt;&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;作者还提供了转换代码，可以把 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.obj&lt;/code&gt; 的模型轻松转成程序要求的数据格式（虽然这个转换工具其实并不能真的工作，后面会详细展开）。想到之后随意换模型也不难，于是放下没再继续折腾。&lt;/p&gt;

&lt;h2 id=&quot;体感操作&quot;&gt;体感操作&lt;/h2&gt;

&lt;p&gt;放了一些时间，突然想起我买的是个带 &lt;a href=&quot;https://www.invensense.com/products/motion-tracking/9-axis/mpu-9250/&quot;&gt;MPU9250&lt;/a&gt; 的版本，Google 了一番发现这个芯片功能也非常强大，如官网所说 gyro + accelerometer + compass 一应俱全（陀螺仪、加速计、磁感应）。那么最简单的，做个体感操作 3D 模型的功能如何。&lt;/p&gt;

&lt;p&gt;又是经过一番研究，在 &lt;a href=&quot;https://github.com/m5stack/M5Stack/blob/master/src/utility/MPU9250.h&quot;&gt;M5Stack&lt;/a&gt; 官方库里找到了一个 MPU9250 的封装，虽然 M5Stick（似乎）不能直接用 M5Stack 的库，但这个封装一样可以用。参考官方的 &lt;a href=&quot;https://github.com/m5stack/M5Stack/blob/master/examples/Modules/MPU9250/MPU9250BasicAHRS/MPU9250BasicAHRS.ino&quot;&gt;example&lt;/a&gt;，用起来并不是难事，不用去了解太多通信的实现。&lt;/p&gt;

&lt;p&gt;给之前的程序加上用加速计（绝对位置）来计算用户在各个轴移动的差值，以此作为转动模型的速度。于是一个&lt;strong&gt;&lt;a href=&quot;https://m.okjike.com/originalPosts/5c91ed5c66dda10010d29ebf?username=F65E8535-A827-4B75-8583-EFD4EB5C2671&quot;&gt;用倾斜控制模型转动的功能&lt;/a&gt;&lt;/strong&gt;就完成了。还发了&lt;a href=&quot;https://twitter.com/Arthraim/status/1108351962934722560&quot;&gt;推&lt;/a&gt;，官方也来点赞了，高兴。&lt;/p&gt;

&lt;h2 id=&quot;模型转换&quot;&gt;模型转换&lt;/h2&gt;

&lt;p&gt;有了模型显示和操作，就想要看看换别的模型玩。虽然在即刻上喊了几句希望有人给个模型，不过拿来主义的阴谋最终没有得逞。鉴于我 CGJ18 之前修得一身 C4D 简单建模的功夫，加之当时还真是做了一个&lt;a href=&quot;https://www.instagram.com/p/Bk8EsZ_FufJ/&quot;&gt;即刻图标的 3D
 版本&lt;/a&gt;，于是轻松撸了一个 3D 的 J 字，多边形不多，适合我们的小硬件。&lt;/p&gt;

&lt;p&gt;正如前面提到的，转换的时候出了问题，原作者提供的&lt;a href=&quot;https://github.com/menehune23/projection/blob/master/Projection/ObjConverter.html&quot;&gt;转换代码&lt;/a&gt;只转出了「顶点」，却没有「边」的信息，转出来的是信息都是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nan nan&lt;/code&gt;。看着情形是转换出了计算问题，不得已开始看他的代码。查了 Wikipedia 的 &lt;a href=&quot;https://en.wikipedia.org/wiki/Wavefront_.obj_file&quot;&gt;Wavefront .obj file
&lt;/a&gt; 词条发现 C4D export 的 .obj 并没有 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;l v1 v2 ...&lt;/code&gt; 的信息，而是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f v1/vt1/vn1 ...&lt;/code&gt; 这样的格式，原作者在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f&lt;/code&gt; 的处理犯了错。改正后提了&lt;a href=&quot;https://github.com/menehune23/projection/pull/1&quot;&gt;一个 PR&lt;/a&gt;，&lt;del&gt;可惜作者似乎是个电子行业的开发，远离 github 已久，想继续玩下去的朋友就暂时用&lt;a href=&quot;https://github.com/Arthraim/projection&quot;&gt;我的 fork&lt;/a&gt; 吧&lt;/del&gt; 作者在我发文的第二天中午 merge 了（那么巧，不会是我的文章惊动了他吧 :P）。&lt;/p&gt;

&lt;p&gt;之后就成功&lt;strong&gt;&lt;a href=&quot;https://m.okjike.com/originalPosts/5c923624f7b0dc00119bff68?username=F65E8535-A827-4B75-8583-EFD4EB5C2671&quot;&gt;把即刻模型显示到了小小的屏幕上&lt;/a&gt;&lt;/strong&gt;，帧数还挺高。&lt;/p&gt;

&lt;h2 id=&quot;开源代码&quot;&gt;开源代码&lt;/h2&gt;

&lt;p&gt;没什么动力继续做些什么了，于是把代码也放到了 &lt;a href=&quot;https://github.com/Arthraim/StickGyroCube&quot;&gt;Github&lt;/a&gt; 上。&lt;/p&gt;

&lt;p&gt;其实理论上这个硬件还可以链接网络，下载 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.obj&lt;/code&gt; 文件。而且 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.obj&lt;/code&gt; 转换其实用 C 语言来写也不难，projection 的作者好像也有一个简单的 C 的实现。所以其实完全可以做个从网上下载模型，然后在板上完成转换直接渲染的功能。&lt;/p&gt;

&lt;p&gt;另外我没有加 deep sleep 的代码。所以每次都会跑到没电为止。&lt;/p&gt;

&lt;p&gt;有兴趣的同学不妨继续玩下去撒。&lt;/p&gt;

</description>
        
          <description>&lt;p&gt;前段时间做了一个小玩具，如下图所示，也可以看&lt;a href=&quot;https://m.okjike.com/originalPosts/5c923624f7b0dc00119bff68?username=F65E8535-A827-4B75-8583-EFD4EB5C2671&quot;&gt;这个视频&lt;/a&gt;。写出来记录一下心路历程。&lt;/p&gt;

</description>
        
        <pubDate>Sun, 31 Mar 2019 10:13:49 +0000</pubDate>
        <link>https://artori.us/3d-model-viewer-on-m5stick/</link>
        <guid isPermaLink="true">https://artori.us/3d-model-viewer-on-m5stick/</guid>
        
        <category>M5Stick</category>
        
        <category>Arduino</category>
        
        <category>M5Stack</category>
        
        <category>ESP32</category>
        
        <category>MPU9250</category>
        
        <category>C</category>
        
        <category>C++</category>
        
        
        <category>Programing</category>
        
      </item>
      
    
  </channel>
</rss>
