<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Roc Zhang&#39;s Blog</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://www.roczhang.com/"/>
  <updated>2025-04-14T17:13:29.609Z</updated>
  <id>http://www.roczhang.com/</id>
  
  <author>
    <name>Roc Zhang</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>2025.04.14</title>
    <link href="http://www.roczhang.com/20250414.html"/>
    <id>http://www.roczhang.com/20250414.html</id>
    <published>2025-04-14T15:40:39.000Z</published>
    <updated>2025-04-14T17:13:29.609Z</updated>
    
    <content type="html"><![CDATA[<p>最好的两个朋友要从 SG 离开了。</p><a id="more"></a><h2 id="Haw-Par-Family"><a href="#Haw-Par-Family" class="headerlink" title="Haw Par Family"></a>Haw Par Family</h2><p>我们认识是在两年前。我来到这家公司的第一个 oncall week 里，遇到一个紧急的 crash 需要修复 merge 到 alpha 分支，找到可以帮忙测试验证的 QA 就是 Harold。</p><p>后来我在 SG 找房，另一个朋友给我推了个中介，中介给我介绍的第一套房 - 也就是我现在在住的地方，就在他家对面。</p><p>然后我们就认识了 - Harold 还有他的 partner Erin。我们开始经常一起吃饭，晚上在地毯上坐着聊天；一起世界各地旅行，在挪威陷车，在维也纳跨年；到已经非常习惯彼此的存在，可以没有意义的互相乱叫名字叫一整天，可以发个消息马上下楼一起出门；到我已经 fully trust in each other，不止是他说上半句的时候我知道他马上要说啥，更是我觉得他们可能比我还了解我自己。</p><p>遇到这两位朋友是我搬来 SG 接近三年的时间里最开心的事情。我也 feel grateful 成了两年邻居 - 没有什么比你知道你的好朋友们就住在旁边，打个电话 3 分钟就能见到更踏实开心了。</p><p>Harold 最近终于还是遇到了他的最后一个 push factor，决定裸辞离开了。Erin 也做了一样的决定，大概会在差不多的时间一起离开。</p><p>我其实应当为他们开心的 - 因为我知道他们在这里的工作的多少时间有多么 suffer，我不希望他们被 trap 在这里一辈子。终于可以开启下一阶段，尽管还有很多的不确定性 - 但管它呢，let’s see where this goes.</p><p>“怎么严重似情侣讲分手”, but just, “not everyone can be like me and Michael”. 只是我曾经也经历过这样的时刻，你心里知道一旦大家 move away, life will never be the same, will never be like this again anymore.</p><h2 id="So…-Where’s-the-next-for-me"><a href="#So…-Where’s-the-next-for-me" class="headerlink" title="So… Where’s the next for me"></a>So… Where’s the next for me</h2><p>最近一段时间整个人状态都非常低迷，其实也不止是和好朋友又一起走到了某个路口，还有我开始有点不知道我接下来该往哪里走。</p><p>之前我总觉得我自己看的很开，同事聊起“要赶紧结婚，30 岁之前要买房安定”之类的话题我总是不屑一顾的，为什么一定要在某个时间点就做某件事？但其实我自己本身又是一个非常 standard path 的人 - 读书，大学，赶着实习，工作，然后再一份更好的工作，再一份… 甚至都没敢间隔太久 - gap 太久大概还要向 HR 解释吧？</p><p>然而我发现我过去 28 岁里大多数的开心好像都是达成了某一个成就 - 拿奖学金，在班级里最早找到实习，做了第一个 feature 上线，做了第一个自己的 app 上线，第一次被媒体推荐，第一次被 App Store 推荐… 再到近几年我开始很少再感到兴奋，我开始意识到自己靠各种 achievement 刺激的阈值大概已经高到对几乎所有事情都不太有兴趣的地步 - 很长一段时间里可能唯一还能让我想做以及能进入心流去做的就是做自己的产品了。即使是自己的产品，比如近期看到 Lok Board MAU 到了 70K+，我也好像没有很多情绪波澜，再也没有之前 app 上线后收获用户/推荐的满满的喜悦感和成就感了。</p><p>我知道这种靠不断刷新突破多巴胺上限的模式当然是不可持续的，在无数的时间里感受完自己对大部分事情的麻木之后，很自然的就会开始回到那个大问题 - 我到底为什么还要继续活着呢？</p><p>我不知道。或者也许我会用我活着所以我赋予了这个宇宙意义来回答你。但到我想怎么活着这个问题上，我大概相信的是我在前面 28 岁生日那天写下来的：</p><ul><li>我不想要失去「创作」和「爱」的能力。我还是想要能够自由去创造而不只是消费别人创造的价值。以及去爱人和事。</li><li>我想要在我有限的人生里去尽可能的体验不同的体验。尤其是自己想要尝试的事情，而不是最后因为种种原因就错过或者放弃了。</li></ul><p>但我现在生活，好像有些言行不一？</p><p>我很难从我现在工作里再收获到任何意义感或是成就感，尤其更是在这个时间点，这种阻力已经从对产品价值观的困扰，细化到了每日各种办公室政治/管理规则/人际表演感到厌倦甚至是厌恶的各个毛孔细节里。更让我担心的是，我开始担心自己是不是开始逐渐要失去对创作产品的 passion 了。好多个日子里下班回到家，我只能在沙发上先瘫坐着发呆，什么都不做。直到半小时一小时甚至几小时，等自己回过神来，再看看自己接下来心力和体力还够不够支撑我做点什么。</p><p>我讨厌一直不停抱怨环境和现状，自己又不做任何事情尝试改变自己，又或者改变环境的人。</p><p>再想这个节点我有哪些可能的选择：</p><ul><li>换个组或者换个工作：但逛来逛去也真的没什么还想去的地方了（有一家倒是还是有点情结比较想去的，但前后 ghost 我两次，暂时也实在不再抱什么希望了）</li><li>继续自己之前一直很想的去读个 master：先不说现在这个 big environment 是不是适合去读，成本 a bit hard to cover，但读完大概率还是要继续工作（甚至更必须了，大致画完所有存款可能还差点）。但多了个改变工作方向的 possibility - 自己先前其实蛮想去看看人机交互方向。</li><li>全职独立开发。其实现在自己各个产品的收入在中小城市生活的话应该也完全 OK，而且还是有一些 idea 想尝试看看。</li></ul><p>也许是 none of these options 有足够强的 pull factor，所以好像变成了我在再等一个 push factor。Stay on the track for so long, 第一次 off the track 需要一些勇气吧。我也没想好怎么回答自己脑海里各种“现在裸辞是不是太冲动了”之类的问题，或者也许现在的我就需要感性冲动一点，just jump into the river, for once。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;最好的两个朋友要从 SG 离开了。&lt;/p&gt;
    
    </summary>
    
      <category term="Life" scheme="http://www.roczhang.com/categories/Life/"/>
    
    
  </entry>
  
  <entry>
    <title>Year in Review - 2024</title>
    <link href="http://www.roczhang.com/year-in-review-2024.html"/>
    <id>http://www.roczhang.com/year-in-review-2024.html</id>
    <published>2024-12-28T13:53:57.000Z</published>
    <updated>2025-01-01T00:10:11.542Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://www.roczhang.com/images/year-in-review-2024/cover.png" alt=""></p><p>有点 complicated 的一年。</p><a id="more"></a><h1 id="Changes"><a href="#Changes" class="headerlink" title="Changes"></a>Changes</h1><h2 id="Mentality"><a href="#Mentality" class="headerlink" title="Mentality"></a>Mentality</h2><p>这一段可能会有点负能量，但今年一整年的心理状态大概就是起起落落落落落。写下这段的目的也并不是为了抱怨，只是想记录下此时此刻的一些心理活动，反思一些自己能如何调整，或者留下一个可以在未来用来比对的参照。</p><p>站在这个时间点上，尤其是经历了 Q4 三个月的加班，以及上周在休假中一觉醒来看到推送消息打开公司 IM 经历了小小的 panic attack，我能感觉到自己的的确确应该是被这份工作影响甚至改变了不少。</p><h3 id="Responsibility-or-Boundary"><a href="#Responsibility-or-Boundary" class="headerlink" title="Responsibility or Boundary"></a>Responsibility or Boundary</h3><p>我自认为自己一直以来是属于比较负责任的人，所以一直以来 off hours 或者休假期间有任何问题找到我，我也会尽量比较及时的回应。之前我一直觉得这是理所应当的，像是负责任的一种体现；直到我把这种 mindset 和 practice 从前两份工作带到目前这份工作里，我逐渐开始觉得好像有点不太对了。</p><p>首先是数量。当下的这份工作里一切都节奏很快，所以各种紧急的事情或者有 close deadline 的问题太多了 - any crash 会 block gray release / 各种 ticket 有时间要求需要几天几天之内 resolve / 各种紧急 feature 需要某个某个 version / 时间上线。并且让你血压飙升的还不止是这些事情本身，更是附带的各种 consequence，甚至是这个 process：一旦有 block release 发生马上会被拉起一个超大的群里，拉上各种 leaders 然后开始 @ 你要求要在五点前修完 / 各种复盘 retro 被盘问 / 每天都可能会被 manager 问到 open ticket 的 progress 如何 / 稍微久一些的 ticket 就会开始被 buzz 然后提示会 report 给你的 manager / 每个大 feature 的 merge 前夜各种 urge reviewer pass checkpoints…</p><p>直到后面各种紧急事情的 urgent 程度已经在你这里通货膨胀，让你开始感觉有点麻木以及有点怀疑，这个事情是不是真的这么紧急一定要我现在处理？更难受的是工作和生活的边界开始逐渐模糊甚至消失。我大概是经过过几次让自己有点崩溃的时刻，最近一次发烧在病假中，但依然用了几乎一天的时间在 follow up 测试 / code review 完成各种琐碎尝试把 MR 合进去。为什么这么着急？因为是一个希望在 Q4 可以拿到结论的 project &gt;&gt; 意味着 Q4 结束前至少需要两周运行试验 &gt;&gt; 意味着必须要合入能在 Q4 前两周能全量发布的版本… 最后合入进去烧还没退的自己已经有点迷糊，只剩一个念头：这个东西真的值得我在病假中也要拼命做完吗？</p><p>然后我发现大家都是如此，以至于小病不请假，请假也保持在线好像已经变成了一种隐式的“文化”，无论是你主动选择如此还是被动接受：因为这里可能没多少人会在意你挂着 on leave 的 badge，你依然会高频的收到消息与 buzz。</p><p>直到我开始感觉一切都有点 overwhelmed。最近连着圣诞节和新年假期请了两周的 PTO，走之前也写好了 handover 找人文档挂在 bio 上，但加上时差，导致我每天起床拿起手机第一眼看到的就是数个对话都在 @ 你，各种 P0 / P1 报警，脑子嗡的一下感觉血压就升上来了。是啊，我人是在丹麦，在挪威，但依然感觉自己好像还是被困在那个小小的工位上，周围围着一圈一圈的待办和各种人在和你说他们的 urgent。一瞬间让我感觉好像是一个永远逃不开的梦魇。工作日的晚上，周末，休假，病假 - 只要你还在这里，便是逃不开的。</p><p>也许我该尝试更彻底一些的划清这个 boundary，off work time 或者至少病假休假彻底关掉公司的消息推送，但在这里真的可以吗？先不论 somehow 这在之前的我看来是有点不负责任的行为（大概是被训练成如此的吧），想到在办公室的时候一个同事请假另一些同事有时会半开玩笑一样经常会说的 “when will he/she come back?.. how can we’re suffering here and he/she is enjoying so much fun… I got a lot of tickets waiting for him / her….”，以及回去之后要花更多的时间去 catch up，就让我感觉即使是关掉了推送依然好像只是在掩耳盗铃，该落在你身上的压力也一点不会少。</p><h3 id="Focusing-or-Multi-tasking"><a href="#Focusing-or-Multi-tasking" class="headerlink" title="Focusing or Multi-tasking"></a>Focusing or Multi-tasking</h3><p>另外一个让我觉得导致心理上觉得有些 overwhelmed 的原因大概就是长期的一直在多任务并行。尤其是近几个月，工作的大部分时间里都会有多于一个 project 需要同时推进，可能是 product feature 或是 tech project，在你手上的几个 project 还没有结束之时你的老板们可能就会开始询问下一个 project 的进度如何了。于此同时还会有各种 ad-hoc 请求：各种临时的紧急项目需要协助/咨询，各种 regression 里发现的 ticket 需要在时限里修完，时不时会出现的线上问题和用户反馈需要调查，某个 AB 出负向了要赶紧调查处理等等等等。以及每一个你做过的 feature 都会永远成为你身上包袱的一部分，无论是多久前的 feature 可能被什么最近其他人的修改导致出来的问题，都会马上被 assign 给你。</p><p>这种长时间 multi-tasking 的感觉让我逐渐觉得有点 burnout，我的心力好像有点不太够用了。现在的我总是会习惯性的做着某件事突然就想要打开公司通讯软件看看有没有错过什么。以及不仅是多任务，这里大部分的时候不会给到你太多的时间能 focus 在一个方向上去长期深入的挖掘，可能非常快就会有人要求你 switch to another direction / scope, since sth sth is more urgent has higher priority. 而我时不时会开始怀念之前的工作里能有相对长一点的时间持续聚焦在一个方向上，产出一些有点深度的内容。</p><p>可能多任务并行在这种运转非常快的公司是不可或缺的吧，但对人来说我想应该不是。我还在努力想要尝试 figure out 自己还能不能更好的 adaptive，但我也相信每个人都有自己的 strength，没有办法 ask every one to fit in a specific form the measure them under one same standard. </p><h3 id="I’m-not-juding"><a href="#I’m-not-juding" class="headerlink" title="I’m not juding.."></a>I’m not juding..</h3><p>虽然可能有点负能量，但其实这里我没有在 judge 目前的工作环境是好还是坏。因为好坏的评判太过单一，没有办法 apply 到任何一个人或者实体上。以及不管合不合理，但他就是如此存在，只是适不适合你的问题。也许我能找到办法让自己更加好的 adapte，也许我不能。这两段只是我站在这个时间节点上个人心理活动的快照而已。</p><h2 id="BJJ"><a href="#BJJ" class="headerlink" title="BJJ"></a>BJJ</h2><p>说点 positive 一些的变化，今年让我觉得最棒的决定就是在过生日的时候迈出了第一步，去上了第一节自己一直很想尝试的巴西柔术。</p><p>到我休假前一共接近 5 个月的时间，中间穿插着一些出差和旅行，一共上了 82 节课，目前还是白带但拿到了两个条。</p><p>其实在上完第一节课的时候我是非常开心以及自豪的状态，并不是说第一节课就展露出了什么超人的天分，而是因为自己终于 overcome 了各种先前的疑虑做出了行动。其实去之前非常紧张，因为一直以来看巴柔的视频都让我觉得好酷但是好难，各种炫酷的 take down / swipe / submit，但我是一个连前滚翻后滚翻都不知道怎么做的人。Am I good enough to start this? 笨手笨脚的会不会被人笑话之类的心理活动从来没停过。直到上课的前一天，我还在 YouTube 上看 BJJ first class，想了解下其他人的第一节课大概都会做些什么，好提前有一些心理准备。</p><p>到上课的那一天，穿上了道服，踏上了垫子，好像并没有我想象的那么难 - professor 真的在从前滚翻后滚翻开始教我，然后阐述各种基本的概念，再从一个 position 开始练习。我还记得上完课的那天我非常非常开心，感觉自己终于帮助自己 fullfill 了一个小小的心愿，变成了一个更好一些的自己，在自己 28 岁生日的这一天，这是我送给自己的，远比一个 staycation 或者一个 iPad 好一百倍的礼物。</p><p>然后截止目前的整个 journey 也非常的棒。庆幸自己遇到了非常好的教练，真的是帮助我逐渐建立起了信心。我还记得一次 drill 的时候他突然到我旁边，一脸严肃的和我说 “Roc, I have two words for you. Do you know what words?” 我一脸懵的问了句类似 “Is it I didn’t grab it right?”之后，结果他说了句 “Per–fect!” 然后大部分无论是白带还是蓝带紫带高带色的师兄们人都非常的好，会在课上课下帮忙讲解和指导。自己也在道观里认识了一些新的每天一起摔打和讨论如何变得更好的朋友们。</p><h3 id="Always-Learning"><a href="#Always-Learning" class="headerlink" title="Always Learning"></a>Always Learning</h3><p>我觉得这个过程里最棒的变化还是心态上的 always learning。我可能已经很久没有再回到过这种当一个新学生的心态了，一切对我都是新的，一切我都可以学习。但这里没有什么绝对的最好，你需要自己建立起自己的技术体系，然后在不断的实战中摸索出最适合自己的技术。我发现自己非常 enjoy 做一个学生的过程，无论是课上听 professor 讲解动作，还是课下自己线上找视频来看然后结合练习记到自己的笔记里。这一切感觉新鲜又熟悉。确实在刚开始的一段时间里每次实战基本就是各种被虐，被各种技术轮番着快速降服。但我觉得这里还是 mindset 最重要 - 每一次的 sparring 的输赢对我并不重要，重要的是这一次之后我有没有 improve 自己，或者找到可以让自己进步的地方。</p><h3 id="More-Active"><a href="#More-Active" class="headerlink" title="More Active"></a>More Active</h3><p>另一个变化就是发现自己变得更加 active 了。在新加坡的时候，自己大概一周会去上 3-5 节课，不上课的时候自己也会想要去做一些力量训练或者有氧。到目前 2024 的最后一天，已经比年中那会儿瘦了 15 KG，而且感觉好像确实多了一些肌肉。看着镜子里逐渐更理想的自己，给了我一种不断继续的惯性。</p><p>所以希望明年的自己也能 keep rolling，不断进步。以及如果你也想尝试什么的话，就去试试吧。有时候 <strong>It only takes a leap of faith</strong>.</p><h1 id="Projects"><a href="#Projects" class="headerlink" title="Projects"></a>Projects</h1><p>然后来说说我的 projects。</p><h2 id="Lok-Board"><a href="#Lok-Board" class="headerlink" title="Lok Board"></a>Lok Board</h2><p>今年一月份的时候正式发布了我的新 app - Lok Board。我一向是一个产品做的很慢的人（各种原因，非常执着于细节但时间精力有限），这个产品从最开始的第一个点子 MVP demo：</p><p><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Spent an afternoon using SwiftUI to write a draft demo for the most basic part of my new idea (that came to my head yesterday😂). <a href="https://t.co/ut0iyfmgu0" target="_blank" rel="noopener">pic.twitter.com/ut0iyfmgu0</a></p>&mdash; Roc Zhang (@roczhang9673) <a href="https://twitter.com/roczhang9673/status/1480154597180121088?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">January 9, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p><p>到最后做完 intro video 发布：</p><p><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Officially introduce my new app: Lok Board. Designed to help you to unlock the desktop experience on your iPad.<br>Available on iPadOS / macOS App Store now. <a href="https://t.co/VMMGlS6toy" target="_blank" rel="noopener">https://t.co/VMMGlS6toy</a> Please help to upvote on Product Hunt here if you like it: <a href="https://t.co/bB1nE3fvfQ" target="_blank" rel="noopener">https://t.co/bB1nE3fvfQ</a> Thanks! <a href="https://twitter.com/hashtag/LokBoard?src=hash&amp;ref_src=twsrc%5Etfw" target="_blank" rel="noopener">#LokBoard</a> <a href="https://t.co/ovkXeFyqG0" target="_blank" rel="noopener">pic.twitter.com/ovkXeFyqG0</a></p>&mdash; Roc Zhang (@roczhang9673) <a href="https://twitter.com/roczhang9673/status/1751952685576995256?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">January 29, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p><p>前后正好差不多两年时间，跨越了两份工作。从代码量上讲，应该是我个人 app 里最大的一个。这个产品从我买了 iPad Pro 12.9 却感觉无法顺利完成我自己的一个非常简单的翻译文档 flow 开始的念头，到一步步做成了一个类似 WebOS for iPad 的 workspace，整个过程有过很多迟疑和不确定的地方，但我还是很高兴最后能把他一点点做出来，并且至少能上架让其他人用到他。</p><p>做这个产品的过程也是我有史以来最兴奋的一次，无论是产品和设计交互上的各种小 idea，和技术上一点点调整实现了很多之前不确定的部分，总会让我一次次有“嗯，这就是为什么我要自己做产品”的感觉。所以无论如何这个过程对我来说是开心的，不然我可能也写不完它。</p><h3 id="Results"><a href="#Results" class="headerlink" title="Results"></a>Results</h3><p>从结果上看，可能确实有一些 less than my original expectation。从前期在 Twitter 上发布我在 build 这个 product 过程里的一个个小 video 得到的 interactions，和我身边朋友的反馈，我对 Lok 的 expectation 一开始可能算是相当高。转折点在 2022 年的 WWDC - 苹果发布了 Stage Manager，由此 iPad (Pro) 开始有了它之前不曾有过的多窗口多任务能力。虽然我还是相信 Lok Board 能够提供的 windowing 更灵活，但对大部分用户来说 Stage Manager 的从无到有可能已经 fullfill 了他们的需求，并且会有我无法取代的优势 - native app 的多窗口。</p><p>在看到 Stage Manager 真的发布了之后其实我有点泄气，想着要不要把 Lok 改成一个多窗口浏览器算了。但最后重新思量多次还是把他定位成了 WebOS for iPad 的形态。</p><p>其实 Lok 的结果并没有很差 - 前阵子 Lok Board 的月活达到了 10K，收入也涨了不少，而且是我的第一个海外用户占大多数的产品。但可能只是距离一开始我个人那种 breakthough level 的期待还是远了些 - which is my own problem.</p><h3 id="Lessons-I-Learnt"><a href="#Lessons-I-Learnt" class="headerlink" title="Lessons I Learnt"></a>Lessons I Learnt</h3><p>我之前总是会不断想到，如果在出现 Stage Manager 以前就把 Lok 发布了就好了。这种期待显然不切实际：我不可能这么短时间内写完，以及就算写完了 Stage Manager 后续一发布该流失的用户还是会流失。但可能只是给自己多一些没有辜负自己的心理安慰。但确实 one lesson I learnt 是我应该更快的 deliver - 很多时候我发布了一个没有打磨很完善的 idea demo 视频，得到一些正反馈，但可能实现周期太长，导致用户最后 lost their interest，甚至还被一些 competitor 抄了过去。</p><p>我可能确实是有些过于执着于细节了。不仅是做产品，甚至每次弹钢琴开始练一首新曲子的时候，我也会非常容易太执着于把某一个片段弹到让自己满意，而不是先把整首弹下来再说。这种 practice 也许有好有坏，只是这次做 Lok 的经历以及今年读到「The Creative Act: A Way of Being」这本书里「一个不完美的完整作品远好过一个完美的片段」的部分，让我觉得也许我也应该试试 deliver first 先的方式。</p><h2 id="What’s-Next"><a href="#What’s-Next" class="headerlink" title="What’s Next"></a>What’s Next</h2><h3 id="For-Lok-Board"><a href="#For-Lok-Board" class="headerlink" title="For Lok Board"></a>For Lok Board</h3><p>对 Lok Board 来说，还有一些比较关键的节点没有推进到：</p><ul><li>多虚拟桌面的支持已经写的差不多，会在后面的一个版本发布。这一块也加了一些自己一些交互上的小心思：</li></ul><p><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Quite happy with these multi-desktop features I recently built.<br>“Alright come close, lemme show you everything I built” (besides the days I need to OT and suffering from fever caused by sinus infections I recently got🙂‍↔️). <a href="https://t.co/LwlA1OKbca" target="_blank" rel="noopener">pic.twitter.com/LwlA1OKbca</a></p>&mdash; Roc Zhang (@roczhang9673) <a href="https://twitter.com/roczhang9673/status/1862770417175527840?ref_src=twsrc%5Etfw" target="_blank" rel="noopener">November 30, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p><ul><li><p>Lok AI 相关的功能。本来这部分在我看到 Apple Intelligence 之后也有点迟疑，但真的上手用了用之后觉得我还是有必要做一下，有一些我觉得会比较有趣的集成点，同时也可以给无法使用 Apple Intelligence 的老设备用户使用。</p></li><li><p>Lok Board for iPhone。类似 iPhone 的 Dex Mode，我觉得会蛮好玩的，但目前还是有一些性能问题没能解决，同时还有使用 private API 的风险，还在想办法 eliminate。</p></li></ul><h3 id="For-Next-Product"><a href="#For-Next-Product" class="headerlink" title="For Next Product"></a>For Next Product</h3><p>一直还有一些产品想法，虽有疑虑但依然想尝试。只是我觉得目前最要命的问题是我开始担心自己会不会失去这种对 create product 的 passion。虽然目前我会觉得这部分应该和目前的工作状态强相关，尤其是最近每天下班到家还要继续加班，甚至偶尔不用加班的时候一到家我已经没有任何力气做任何事，只能在沙发上瘫坐个几十分钟发呆才能缓过神来去洗漱。这种状态和受限的时间精力让我真的很难去好好想关于产品的问题。甚至开始担心这种状态持续久了之后会不会对我整个人的 mindset 和 personality 产生改变，从而让这种 losing interest 的状态从暂时变成了长久性的。但状态的调整和 what’s next of my life, 应该是我需要在开始下一个 project 之前，需要先 figure out 清楚的问题。</p><h1 id="Snapshots"><a href="#Snapshots" class="headerlink" title="Snapshots"></a>Snapshots</h1><p>发现今年的想列下的时刻有点多，确实今年去了不少地方，但也因为大部分其他的时间里都在工作加班，对比起来稍微特别些的时刻就显得更加特别。</p><h2 id="Moments"><a href="#Moments" class="headerlink" title="Moments"></a>Moments</h2><h4 id="Jan-1-2024-Vienna-Austria"><a href="#Jan-1-2024-Vienna-Austria" class="headerlink" title="Jan 1, 2024 @ Vienna, Austria"></a>Jan 1, 2024 @ Vienna, Austria</h4><p><img src="http://www.roczhang.com/images/year-in-review-2024/1.JPG" alt=""></p><p>是去年的圣诞假期旅行，和两位好朋友一起在维也纳跨年。</p><h4 id="Jan-17-2024-Singapore"><a href="#Jan-17-2024-Singapore" class="headerlink" title="Jan 17, 2024 @ Singapore"></a>Jan 17, 2024 @ Singapore</h4><p><img src="http://www.roczhang.com/images/year-in-review-2024/2.jpeg" alt=""></p><p>Lok Board 上架 App Store。给自己买了一个 mini 小蛋糕，在家里小小庆祝了一下。</p><h4 id="Feb-3-2024-Karuizawa-Japan"><a href="#Feb-3-2024-Karuizawa-Japan" class="headerlink" title="Feb 3, 2024 @ Karuizawa, Japan"></a>Feb 3, 2024 @ Karuizawa, Japan</h4><p><img src="http://www.roczhang.com/images/year-in-review-2024/3.JPG" alt=""></p><p>回家过年前去了一趟日本。见到好几年没见的冯老师和 Kevin。在轻井泽泡汤的那个下午是少有的感觉有一丝平静的时刻。</p><h3 id="Feb-13-2024-Anhui"><a href="#Feb-13-2024-Anhui" class="headerlink" title="Feb 13, 2024 @ Anhui"></a>Feb 13, 2024 @ Anhui</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/4.jpeg" alt=""></p><p>回家过年，和家里人一起吃火锅总是开心的。</p><h3 id="Mar-31-2024-Bangkok-Thailand"><a href="#Mar-31-2024-Bangkok-Thailand" class="headerlink" title="Mar 31, 2024 @ Bangkok, Thailand"></a>Mar 31, 2024 @ Bangkok, Thailand</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/5.jpeg" alt=""></p><p>带爸妈去泰国玩了一下。去年好多年前和朋友一起去过的海滩和餐厅，隐隐约约给我一种 dreamcore vibe。</p><h3 id="Apr-6-2024-Singapore"><a href="#Apr-6-2024-Singapore" class="headerlink" title="Apr 6, 2024 @ Singapore"></a>Apr 6, 2024 @ Singapore</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/5.5.png" alt=""></p><p>老朋友们来新加坡探望我。能和老朋友分享新生活总是能让人开心的事。</p><h3 id="Apr-20-2024-Beijing"><a href="#Apr-20-2024-Beijing" class="headerlink" title="Apr 20, 2024 @ Beijing"></a>Apr 20, 2024 @ Beijing</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/6.jpeg" alt=""></p><p>2024 第二次去北京出差，和 SG 的同事一起去爬了长城。印象里上一次去长城还是自己小学的时候。</p><h3 id="May-12-2024-San-Francisco"><a href="#May-12-2024-San-Francisco" class="headerlink" title="May 12, 2024 @ San Francisco"></a>May 12, 2024 @ San Francisco</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/7.JPG" alt=""></p><p>五月去了湾区出差。工作之余见了不少新老朋友，见朋友总是开心的，但还是发生了件有点难过的故事。买了当时还只在 US 上市的 Vision Pro。</p><h3 id="May-24-2024-Tokyo-Japan"><a href="#May-24-2024-Tokyo-Japan" class="headerlink" title="May 24, 2024 @ Tokyo, Japan"></a>May 24, 2024 @ Tokyo, Japan</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/8.JPG" alt=""></p><p>出差回来又去了日本，给好朋友过生日同时也是逃避一下现实。在二子玉川旁边坐了一起坐了一个下午，看着电车开来开去，小朋友在河边玩打水漂。</p><h3 id="Jun-2-2024-Changi-Singapore"><a href="#Jun-2-2024-Changi-Singapore" class="headerlink" title="Jun 2, 2024 @ Changi, Singapore"></a>Jun 2, 2024 @ Changi, Singapore</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/9.png" alt=""></p><p>回新加坡的那天，可能因为知道我状态很丧，两位好朋友来机场接我。</p><h3 id="Jun-26，-2024-Singapore"><a href="#Jun-26，-2024-Singapore" class="headerlink" title="Jun 26， 2024 @ Singapore"></a>Jun 26， 2024 @ Singapore</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/10.jpeg" alt=""></p><p>深蹲的时候闪到腰了，变成神经结缔组织受伤，第一次在新加坡看急诊。超痛，在家躺了快一周都不怎么能动。</p><h3 id="Jul-13-2024-Singapore"><a href="#Jul-13-2024-Singapore" class="headerlink" title="Jul 13, 2024 @ Singapore"></a>Jul 13, 2024 @ Singapore</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/11.png" alt=""></p><p>28 岁生日，去上了第一节巴西柔术课，和好朋友一起吃了晚餐，非常满足的一天。</p><h3 id="Aug-8-2024-The-Upper-House-Hong-Kong"><a href="#Aug-8-2024-The-Upper-House-Hong-Kong" class="headerlink" title="Aug 8, 2024 @ The Upper House, Hong Kong"></a>Aug 8, 2024 @ The Upper House, Hong Kong</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/12.png" alt=""></p><p>带爸妈去住了我目前在香港（甚至全球？）最喜欢的酒店，the Upper House.</p><h3 id="Sep-9-2024-The-Bund-Shanghai"><a href="#Sep-9-2024-The-Bund-Shanghai" class="headerlink" title="Sep 9, 2024 @ The Bund, Shanghai"></a>Sep 9, 2024 @ The Bund, Shanghai</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/13.jpeg" alt=""></p><p>带着几个新加坡的朋友去上海小玩了一个长周末，结果遇到了台风。这次回上海感觉很奇妙，一是之前自己一直觉得自己在上海和在新加坡生活的世界时间空间都是隔离开的，带着新的朋友去吃去走自己之前老的记忆里的东西，让我感觉两段经历开始流动连续了起来。二是这次的自己以游客的身份再回上海，总感觉和之前印象里自己每天生活的城市很不一样，又觉察到了一些自己之前从来没有注意过的东西。</p><h3 id="Sep-25-2024-Beijing"><a href="#Sep-25-2024-Beijing" class="headerlink" title="Sep 25, 2024 @ Beijing"></a>Sep 25, 2024 @ Beijing</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/14.JPG" alt=""></p><p>又去北京出了个差。周末去上了一节 BodyJam 然后散了个超长的步，和朋友约着吃了一个很特别的麻辣烫。我只在大二暑假那会儿在北京实习带了一个月，散步的时候让我想到自己如果当时去了北京的公司工作的话会是一种怎样的生活？也许就像是这个周末一样？</p><h3 id="Nov-2-2024-Taipei-Taiwan"><a href="#Nov-2-2024-Taipei-Taiwan" class="headerlink" title="Nov 2, 2024 @ Taipei, Taiwan"></a>Nov 2, 2024 @ Taipei, Taiwan</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/15.jpeg" alt=""></p><p>终于第一次真正来到了台湾，之前有在台湾转机并没有能入境过。见到好久没见的老朋友，也见了一些新朋友，还正好去参加了 iPlayground Taipei 的 conference。感觉一切都好温柔。</p><h3 id="Dec-22-2024-Dubai"><a href="#Dec-22-2024-Dubai" class="headerlink" title="Dec 22, 2024 @ Dubai"></a>Dec 22, 2024 @ Dubai</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/16.png" alt=""></p><p>在迪拜转机呆了一夜，想起两年前来这里见朋友也是给另外两个正要搬过来的朋友惊喜，有种“物是人非事事休”的感觉。果然很多体验是只会有一次的吧，所以更是要好好珍惜当下和每一次的体验了。</p><h3 id="Dec-31-2024-Helsinki-Finland"><a href="#Dec-31-2024-Helsinki-Finland" class="headerlink" title="Dec 31, 2024 @ Helsinki, Finland"></a>Dec 31, 2024 @ Helsinki, Finland</h3><p><img src="http://www.roczhang.com/images/year-in-review-2024/17.png" alt=""></p><p>此时此刻的我，2024 的最后一天，在赫尔辛基的一个咖啡馆里写这篇年终回顾。</p><h3 id="And"><a href="#And" class="headerlink" title="And"></a>And</h3><p>其实写完之后发现自己想记录的时刻不止这些，有些即使是重复的，像是每个周末和自己的好朋友像约定一样去吃牛肉粉；每次 rolling 完再和对手碰拳；周日的早上收到 toast box 的 delivery 喝到一口鸳鸯加上一口肉松烤吐司；等等等等，都是能让我感到幸福和会怀念的时刻。因为即使是现在所有这些看起来理所应当的重复，可能也会在未来的某个时间节点突然消失，再也回不去了。所以即使重复，我也依然感激。</p><h1 id="Ending"><a href="#Ending" class="headerlink" title="Ending"></a>Ending</h1><p>像是开头提到的，今年对我是有点 complicated 的一年：有难过，有开心；有遗憾，有满足；有体验到不少东西，也错过了一些曾经非常非常不想错过的；有我依然会非常确信的东西，也有我感到十分困惑，想要去 figure out 的部分。</p><p>我一直觉得时间是连续的，在一个特定的节点庆祝，再期待着下一个周期里环境能如何如何变化，自己能如何如何变化没有意义 - 如果只是期待，今年的自己是如何那明年的自己大概还是会如何，大概率不会因为年份从 2024 到了 2025 就突然让你的生活变了一幅模样。但每一个时刻的当下还是值得好好庆祝和感受。想起了今年开始非常喜欢的 Fuji Kaze 的 Matsuri:</p><blockquote><p>祭り 祭り 毎日愛しき何かの<br>庆典 庆典 每一天皆惹人怜爱</p><p>祭り 祭り あれもこれもが有り難し<br>庆典 庆典 万事万物皆值得感激</p></blockquote><p>今年有好几次我希望自己能再变得勇敢一些，也许有些方面我有做到，有些方面还是没有。在这种岁末年关的时刻还是不能免俗的，希望自己能继续，再勇敢一些。</p><p>再次感谢出现在我 2024 生活里的各位。</p><p>Oh my 2024.</p><blockquote><p>Roc<br>Dec 31, 2024 from Helsinki.</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://www.roczhang.com/images/year-in-review-2024/cover.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;有点 complicated 的一年。&lt;/p&gt;
    
    </summary>
    
    
      <category term="Life" scheme="http://www.roczhang.com/tags/Life/"/>
    
  </entry>
  
  <entry>
    <title>28</title>
    <link href="http://www.roczhang.com/28.html"/>
    <id>http://www.roczhang.com/28.html</id>
    <published>2024-08-03T03:19:13.000Z</published>
    <updated>2024-08-03T05:10:01.277Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://www.roczhang.com/images/28/places.png" alt="Places"></p><p>好久不见。</p><a id="more"></a><p>快有 4 年没有写过 blog 了。大概是因为这几年里一直感觉自己的状态非常临时，许许多多的事情好像没有朝着自己计划的方向走，或者是没有达到自己预计的程度。我又总是对许许多多的事情期待着能有一个 closure 一个结局，好像如此我才可以向自己，以及向别人交代些什么。</p><p>上个月刚过了 28 岁生日，突然想写点什么。其实最近几年自己很多想法都在变化，一想倒是觉得，最近的自己好像终于放下了些什么包袱，也许我不并需要向自己或者任何人交代些什么，life is an open ending 也不是所有事都会有结局。那也许我也终于可以再动手写点啥了。也顺手把 Blog 改成了深色主题，算是纪念一下继续更新。</p><p>想先聊聊这段时间的一些变化吧，地理上还有心理上。</p><h2 id="Moved-to-Singapore"><a href="#Moved-to-Singapore" class="headerlink" title="Moved to Singapore"></a>Moved to Singapore</h2><p>2022 年 9 月，我从上海搬来了新加坡。</p><p>虽然说之前一直有着想去国外工作生活一段时间的想法，但好像总是一直在不停犹豫，总是在不停等待想寻找更好的机会。2022 年上海因为疫情 lockdown 被关了快 3 个月倒成为了最后一个 push factor - 最后在日本，新加坡，伦敦里选择来了新加坡。</p><p>在上海的最后一段时间就是每天都在见老朋友们，每天都在和大家道别。因为当时的疫情政策，心里始终有着“不知道下一次见面会是什么时候了”的念头。再加上走的很匆忙，从上海离开的时候家里都还没完全收拾好，最后还是靠几位朋友帮我打包寄走再退租。</p><p><img src="http://www.roczhang.com/images/28/5am-pvg.png" alt="5am PVG"></p><p>刚来 SG 的那段时间其实真的是蛮痛苦的回忆。可能因为很多不同的因素在当时叠加在了一块儿：Day 1 落地就中了 covid；第一次在国外生活身边完全没有任何熟悉的朋友；工作也和预想的有些不同压力很大。导致当时每天就会莫名开始掉眼泪，甚至没落地几天就打了退堂鼓。更悲伤的是当时想回家都回不去（因为机票限制以及当时回国还需要非常严格的检测，包括抗体 CT 之类的），然后就是整夜整夜睡不着，在街上不停散步，感觉随时都会情绪崩溃。我自己也没料到自己会有这么大反应，想着我应该还适应性挺强，或者至少应该会因为新环境兴奋几天的。以至于哪怕现在我每次再走到刚来那会儿每天散步的区域，总是还会 recall 回当时那种状态，然后心情复杂，像是 PTSD。</p><p>当时我的很多朋友都非常担心我的情况，会轮番给我打电话 check 我如何，甚至还会经常组织线上 hangout，玩一玩阿瓦隆之类的游戏，逐渐帮我摆脱了那种不停感到沉没的状态。也让我觉得有好朋友真的是非常非常幸福的一件事情，即使和朋友们不在同一片物理空间，他们也都还会在你身边支持你。</p><p>后来的故事大概你也猜到，虽然中间发生了很多意外和插曲，也真的差点就离开了。但最后还是开始逐渐找到了自己的新生活，认识了新的可以珍惜一辈子的好朋友，也开始喜欢上了新加坡这个小岛，以至于它最近总时不时会给我一种 dreamcore 的感觉 - it’s really like a tropical utopia （但也真的很热 lol）。</p><p><img src="http://www.roczhang.com/images/28/singapore-sky.png" alt="Singapore Sky"></p><p>在 SG 的生活和国内还是有些不同。SG 本身地方不大，我算是平时生活比较“无聊”的人，基本不会去什么社交场合所以倒是感受不大，只是觉得 SG 相比上海确实没有很适合“散步” - 天气很热加上步行体验一般。在吃方面相比国内价格确实比较贵选择比较少（尤其是外卖），但相比其他国家应该也是相当方便和对亚洲胃友好了。在住的方面是相当贵了，但硬件设施也确实不错，比如大多数 condo 里都会有维护良好的泳池，于是我来了 SG 之后也终于学会了游泳。以及住在这里两年倒是去了蛮多地方旅行/出差，除了蛮经常回国会路过上海/北京/香港，还去了阿联酋/马来西亚/卡塔尔/德国/瑞士/奥地利/日本/美国/泰国/印度尼西亚…而且还蛮频繁的，好像每个月都会“出国”。SG 航线不少去机场也方便，而且 Changi 各种效率（值机/海关/安检/行李到达/排队打车）都很高，之前最快一次从飞机落地算不到一小时就到家了。如果你常去国内类似 PVG 之类的机场，对滑行+行李到达+排队打车的耗时之久应该会有些体会。</p><p>今年在北京出差的时候和同事在一起喝酒聊天，manager 突然问我，等我离开这里离开新加坡的时候，会有什么东西是觉得值得带走的吗？我当时很认真的想了想，感觉应该是等自己未来某天又去到了一个新环境，又感到非常绝望的时候，会想起刚搬来新加坡时候的这段经历。它大概会给我一些勇气，让我想到自己从刚搬来时候一个人每天接近崩溃的状态，逐渐再有了自己喜欢的新的生活，有了新的朋友们的过程。那我就会相信自己应该可以再做到一次的。</p><h2 id="Turning-28"><a href="#Turning-28" class="headerlink" title="Turning 28"></a>Turning 28</h2><p>其实我曾经以为自己永远不会有年龄焦虑。每次看到身边的朋友或者同事聊起自己要 30 / 35 / 40 了，想要赶快结婚 / 买房之类的，我都会问为啥，得到的回答大概都类似“到这个年纪了肯定就需要做这些事情了呀”，我都会觉得很莫名。为什么？谁定义的？</p><p>直到近几年突然猛的一下发现，原来我也已经就 28 岁了，但印象里的自己却好像才刚刚毕业。我开始逐渐发现自己的身体有点不再像之前一样可以随心所欲的“支撑”我了：眼睛会开始不舒服，坐久了腰会痛，牙齿也开始有点问题，更糟糕的是会开始经常睡不着。然后好像心力也不太够用，很多时候下班回家连换衣服的力气都没有，要在沙发上静静坐上好一会儿，啥都不做才能慢慢缓过来。</p><p>但困扰我的其实依然不是上面那些买房结婚之类的话题，而好像是一种 “existential crisis” (存在感危机？)。尤其是刚搬来新加坡的那会儿，我会很不由自主的开始问自己：我究竟为什么要来这里？为什么我要放弃自己已经熟悉的生活和朋友，来到一个陌生的环境？尤其是发现一些本来觉得自己会很在意的事情，好像没有对自己的生活产生多大影响，反而一些自己从没在意的事情却频频开始出现，开始不停困扰自己的时候。结果这种疑问最后逐渐就变成了，那么我为什么要存在呢。我也开始逐渐觉得我好像没那么“酷”没那么“特别”了，那不再“酷”也不再“特别”的我，存在着还会有什么意义吗？如果我能做的事情，别人也都可以做，那这个世界还需要我的存在吗？</p><p>如果你也被这些想法困扰过，那你大概会明白我近两年的心理状态。尤其是 22 / 23 年的时候，我想我可能也因此抑郁了一段时间，每天早上不想开始，晚上不想结束。加上工作和环境的压力，自己每天的心情也都相当低落消极，即使打起精神去做很多之前自己喜欢的事情，好像也提不起什么兴致来。有些时候完全不想和任何人说话，看到朋友家人的电话都接不起来。</p><p>我其实也不太清楚自己是怎么慢慢尤其是在近期逐渐变得好一些的（其实我也不确定是不是变好，还是只是周期性的震荡），但除了很多个睡不着甚至大半夜一个人在街上散步的晚上，能记得的是我的朋友们还是帮了我很多。</p><p>所以我想怎么活着？我不知道未来如何，但 28 岁，现在的我的答案会是：</p><ol><li>我不想要失去「创作」和「爱」的能力。我还是想要能够自由去创造而不只是消费别人创造的价值。以及去爱人和事。</li><li>我想要在我有限的人生里去尽可能的体验不同的体验。尤其是自己想要尝试的事情，而不是最后因为种种原因就错过或者放弃了。</li></ol><p>就这两点来说，我想我还是蛮感谢自己当时从上海搬来新加坡的。直接来看好像是搬来之后我就进入了这段“危机”时期，但我想每个人终究逃不开他需要面对的课题，即使我没有离开上海，这个课题最后也一定会以某种方式找到我。</p><p>就结果看，如果没有搬来的话，我不会有和一个街头艺人一起在码头唱歌的体验；我可能不会特别确定我真的可以在一个全英文的环境工作生活；我也不会认识和接触到新加坡还有各个不同地方的人，了解他们的文化与生活方式，和他们结成朋友；我不会非常频繁的各个国家/城市跑来跑去，开始逐渐觉得每个人都是其实 “global citizen”；我更不会发现自己确实是可以在一个新环境里适应下来，找到自己新的生活。</p><p>我也不知道当时如果选择了其他的选项我的生活会如何。我不觉得生活可以比较好坏，但能确定的是如果当时没有作出选择而是继续之前的生活，我大概也只会是继续念叨着“好想如何如何，如果能这样那样就好了”，甚至有些体验可能自己想都不会想到。</p><h2 id="13-Jul-2024"><a href="#13-Jul-2024" class="headerlink" title="13 Jul, 2024"></a>13 Jul, 2024</h2><p>28 岁生日那天，我去上了自己的第一节 BJJ（巴西柔术）课。其实做了蛮久心理建设，因为之前每次看到都觉得好帅好想尝试，但又马上会开始觉得这个这么难，我一点基础都没有一定不行的。在临近 28 岁的时候，本来想着要不定个酒店 staycation 一下，但突然某天回家路上开始觉得，我既然已经意识到自己的身体硬件开始逐渐下滑了，也不知道明天会发生些什么，如果还有想去尝试的东西，那么为什么还不快去呢。然后这个想法后面逐渐就变成了：不如以后每个生日都去尝试一些不同的体验？尤其是那些自己想要尝试但又犹豫最后没有行动的，就好像在提醒自己，活着就还会有无限多的可能性，我可以去尝试，去体验。</p><p>上完第一节课之后我真的特别开心。不仅是这项运动比我想象的还有意思（也确实很难 lol），更开心的是自己终于摆脱了自己先前给自己设下的心理障碍，最后去做去尝试了。It just takes a leap of faith. 到今天刚好上了 10 节课，真的享受到了很多乐趣，然后发现自己好像比之前以为的还要更喜欢这项运动，也开始认识到了一些新的每天在一起摔打的朋友。能发现一个新的让自己感到乐趣所在的体验，an experience you feel you’re passionate about，真的是让人蛮开心的一件事。</p><p>28 岁的我，希望自己能继续更勇敢的生活，希望你也是 - Live a life, young, wild &amp; free.</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://www.roczhang.com/images/28/places.png&quot; alt=&quot;Places&quot;&gt;&lt;/p&gt;
&lt;p&gt;好久不见。&lt;/p&gt;
    
    </summary>
    
      <category term="Life" scheme="http://www.roczhang.com/categories/Life/"/>
    
    
  </entry>
  
  <entry>
    <title>Year In Review - 2020</title>
    <link href="http://www.roczhang.com/year-in-review-2020.html"/>
    <id>http://www.roczhang.com/year-in-review-2020.html</id>
    <published>2020-12-30T14:55:37.000Z</published>
    <updated>2020-12-30T18:26:57.210Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://www.roczhang.com/images/year-in-review-2020/cover.png" alt=""></p><p>2020 还有最后几十个小时就要结束了。实话说，我挺喜欢自己在 2020 里收获到的一些变化。</p><a id="more"></a><h2 id="Changes"><a href="#Changes" class="headerlink" title="Changes"></a>Changes</h2><h3 id="Personal-Projects"><a href="#Personal-Projects" class="headerlink" title="Personal Projects"></a>Personal Projects</h3><p>2020 里让我感到很开心的一部分就是个人项目有了挺大的成长。今年 X Progress 和 Mr. Weather 都被 iOS App Store 与 macOS App Store 推荐了数次，其中还包含系统首发的 「为 iOS 14 优化」和「为 Big Sur 优化」推荐。也经历了只依靠 organic growth 让个人项目收入超过工资收入的节点（虽然还只持续了两个月）。</p><p>前几天在给自己的个人项目定 2021 OKRs 时做了一些 review，发现数据上看 2020 中的变化比我想象的还要多。相比 2019，Mr. Weather 在 Sales / Sessions 上有接近 500% 的增长。X Progress 则在 Downloads / Sales / Sessions 上都有多于 1000% 的增常。当然一方面原因是之前数据本来也不是很高，所以起点比较低。但能看到个人项目有这样的成长还是挺开心的。</p><p>另一件值得高兴的事情是 2020 里通过这些个人项目建立起了更多的 connection。今年非常开心的有机会去到了 Apple 在上海的 office，和 WWDR 的朋友见面交流。后面又陆续参加了设计开发加速器的一些活动，也在今年又结识到了一些有趣的产品朋友们。</p><p>做产品是我目前发现的自己热情最大的一件事情了。在保持热、时间和精力投入的同时，当然也很希望能有机会完全靠自己的产品来养活自己，甚至是一个小小团队。这样至少可以有一次让自己和朋友们一起全身心投入做产品，做自喜爱的事情的机会。</p><p>年末的这一段时间里写下了关于 2021 年想做的两个新产品的文档和老产品的迭代计划，还是蛮兴奋的。我也发现自己逐渐不愿再把自己的这些个人项目称作 side projects。今年十一之后有一位之前就有在帮助我开发后端的好朋友从 TikTok 离了职，也一起搬到了岛上，决定在下份工作前 gap 一段时间全职来一起做产品试试看，真的是蛮开心也蛮感动的。因此 2021 还是要更加努力好好做自己热爱的事情吧。</p><h3 id="Profession"><a href="#Profession" class="headerlink" title="Profession"></a>Profession</h3><p>今年工作上也有了挺大的变化。从外在的结果上看，最大的变化便是在 9 月末离开了从实习算起工作了 1073 天的流利说。</p><p>离职当天虽然已经是十一假期的前一天，还是有不少朋友甚至是其他组的朋友来找我喝咖啡 / 拍照 / say goodbye。Last day 当天只是忙着和各个朋友告别，反而是在离职的前一天晚上拎着各种东西在回家的路上突然走着走着就开始掉眼泪了。在流利说从大四开始实习一直到现在，经历了大学毕业，经历了从兼职学生到全职社会人士，结识到了不少非常棒的朋友，也看着一些朋友离开。</p><p>今年离职前在流利说的工作内容其实很有意思。前半年在做二进制编译加速项目，包含 CI 端二进制生产与 Developer 端源码与二进制集成切换。自己从头开始设计方案，再和同事一起实现。最后虽然因为时间有限没有全部完成，但也成功推到了组内使用。下半年的时候成为了直播业务技术方面的负责人。在流利说前前后后也做过了各种各样的直播，语音直播 / 互动直播 / 大班广播，在整个过程中有场景和机会研究各类方案，读了不少 paper。再到后期要自己主动去发现问题并提出优化与解决方案，再拆解给不同角色的人一起沟通合作解决，追踪整个项目的进度，这些都是之前从来没有过的体验。</p><p>在工作刚开始的一年左右，我的心态一直是非常期待得到别人的认可。会努力尝试多做一些事情或者主动去做看起来比较难的事情，想要通过这种方式证明自己。直到近一两年，逐渐有了被别人认可，被别人信任依靠的感觉。甚至有些时候是需要我去判断能不能信赖别人，并去给别人一些认可。这种心态上的转变加上技术上的成长，给了我很大的成就感，面对各种任务时我也能越来越自信的面对。</p><p>所以很感谢我的 leader，给了我很多的机会与信任。和他一起工作也是非常愉快的经历。</p><p>最终决定离职的最主要原因其实是决定要出去读个 master。在 Silicon Valley 参观各个公司时的感受、身边朋友的经历与自己零碎的日常想法最终还是汇聚到一起，有了这个决定。具体是计划在 2021 年申请 2022 年的 master。虽然可能会受疫情、国际局势等等我不可控因素的影响，但还是希望能够按着这个时间节点去准备。因此后续就会需要更多的时间去准备考试以及材料等各种申请事宜，当然还有准备学费。最后又比较碰巧的遇到了 PayPal 的 HR，发现 PayPal Shanghai 在招人，可以 remote 并且工作时间比较固定，能有多不少的个人时间。所以离职后就选择去了 PayPal。</p><p>总的来看，2020 年的职业生涯上也有让自己比较满意的进步。不管是外在的薪水和职级的提升，还是内在技能的积累与心态的变化。</p><h3 id="Life-style"><a href="#Life-style" class="headerlink" title="Life-style"></a>Life-style</h3><p>今年年初时前司政策同样受疫情影响，我得以在家远程工作一段时间。我算是比较喜欢 WFH 的那一类人，可以避免掉很多自己进入状态之后又被别人走过来打断的情况。又可以省下通勤时间，安排也更自由。甚至找回了一些大三时在家 remote 实习的感觉。</p><p>七月份生日前后，和小萌一起去了青岛，又见到了已经好几年没有见的 Kevin 师傅。在 Kevin 家一起看天气之子、撸猫猫、过生日，在海边散步、写代码。Kevin 自由且又能全身心的投入到产品创作的生活方式让我非常羡慕。当时还在想如果自己的个人项目收入可以相对稳定下来养活自己的话我也想要搬到岛上住一段时间，可以闭关专心做产品。结果后来个人项目收入真的涨了一截，只是考虑到要准备读书的学费还是没法直接辞职，但又因为选择了 PayPal 可以远程工作，所以真的搬到岛上住了，还就住在 Kevin 后面一排楼，透过客厅的窗户就能看到海。</p><p><img src="http://www.roczhang.com/images/year-in-review-2020/window_view.jpg" alt="今天的窗外"></p><p>岛上的生活和上海还是蛮不同的。没有超级猩猩，岛上大多数店晚上九十点就可能不再营业，所以也没法像在上海一样和朋友可以晚上约着出去喝一杯，甚至晚上在岛上散步两小时可能一个人都遇不到。但反而发现自己之前觉得习以为常不想改变的生活其实也能很快调整改变：没有超猩可以在家里跳 Apple Fitness+，没有居酒屋可以去但有了很多可以欣赏自然风光的去处，不能和朋友去居酒屋喝一杯但是可以和师傅去喝羊肉汤（误，还是会偶尔想要和老朋友见见面）。</p><p>在海边的咖啡馆里写自己的产品，傍晚在海边散步拍照，晚餐吃本地海鲜。这种生活真的少了很多压力，也有了更多和自己对话的时间。因此搬到岛上之后经常就会想到一些新点子。</p><h3 id="Financial"><a href="#Financial" class="headerlink" title="Financial"></a>Financial</h3><p>今年的经济状况相对往年还算是比较健康。一方面是基础工资收入有了增长，个人项目收入也有了一些增长，不再需要像以前一样完全依靠工资养活自己和自己的这些项目了。</p><p>另一方面是今年尝试买了一些美股。实际上我也并没有多少股票操盘经验，选择时基本只是看自己对一家公司长期价值的判断感受。主要买了一些 Apple / Spotify / Netflix 这些自己都有在用其产品公司的股票，不过也没有忍住跟着买了一些 NIO 和 FDX。但现在总的来看还是有接近 20% 的收益率（但因为是第一次尝试所以只投入了比较少的本金），好于自己年初时定下的初次体验控制亏损小于 10% 的 OKR （逃）。</p><h3 id="Mind"><a href="#Mind" class="headerlink" title="Mind"></a>Mind</h3><p>2020 里感觉到自己的心态也有了一些变化。</p><p>其中一点是下半年时精神状态相对感觉比较平稳，没有之前会容易大起大落。我想可能一部分原因是开始尝试做 meditation，一部分是疫情和生活方式带来的变化，另一部分原因是又遇到了一位对自己影响很大的朋友，经常能够碰撞出一些新想法，也得到了很多鼓励。</p><p>另一点是今年发现自己逐渐开始敢于面对自己以前一直想要回避不愿面对的感情了，也开始会想尝试去表达自己的感情。虽然有时候还是会不知道该如何处理回应，而且相比其他人可能还算是很不够吧（有时候也会觉得自己都 24 了居然才开始这样）。</p><h2 id="Snapshot"><a href="#Snapshot" class="headerlink" title="Snapshot"></a>Snapshot</h2><h3 id="Devices"><a href="#Devices" class="headerlink" title="Devices"></a>Devices</h3><p>今年感觉可能在家的时间多了很多，所以这里也多了很多。</p><ul><li>(+) MacBook Pro 13, 2020</li><li>(+) iPhone 12 Pro Max</li><li>(+) Sony Alpha 7 Mark 3</li><li>(+) Sigma Art F1.4 35mm</li><li>(+) Apple DTK</li><li>(+) Roland E-Piano FP-10</li><li>(+) Surface Go</li><li>(+) HHKB Hybrid Type-S</li><li>(+) BenQ TK800M 4K Projector</li><li>(+) Apple TV 4K</li><li>(+) Microsoft Xbox One X</li></ul><h3 id="Moments"><a href="#Moments" class="headerlink" title="Moments"></a>Moments</h3><h3 id="Jan-23-2020-Azagawa-Yamanashi-Japan"><a href="#Jan-23-2020-Azagawa-Yamanashi-Japan" class="headerlink" title="Jan 23, 2020 @ Azagawa, Yamanashi, Japan"></a>Jan 23, 2020 @ Azagawa, Yamanashi, Japan</h3><p><img src="http://www.roczhang.com/images/year-in-review-2020/jan23-2020.png" alt=""></p><p>春节前和爸妈一起去日本玩了一周多。记得当时一边是少有的家庭时间每天都玩的很开心，一边是电视新闻对国内疫情的报道很揪心。</p><p>当时也没想到这会是 2020 唯一一次在国外旅游。</p><h3 id="Feb-22-2020-Home-Shanghai"><a href="#Feb-22-2020-Home-Shanghai" class="headerlink" title="Feb 22, 2020 @ Home, Shanghai"></a>Feb 22, 2020 @ Home, Shanghai</h3><p><img src="http://www.roczhang.com/images/year-in-review-2020/feb22-2020.png" alt=""></p><p>从家回到上海继续 WFH 与隔离的日子里，第一次自己做饭。开始做饭之后还是会发现一些许多在家里习以为常但其实并没有那么理所应当的事情。比如做饭居然需要这么多配料和工具，又或是电锅两三天没洗居然就会发霉。</p><h3 id="Jun-22-2020-Home-Shanghai"><a href="#Jun-22-2020-Home-Shanghai" class="headerlink" title="Jun 22, 2020 @ Home, Shanghai"></a>Jun 22, 2020 @ Home, Shanghai</h3><p><img src="http://www.roczhang.com/images/year-in-review-2020/jun22-2020.png" alt=""></p><p>WWDC 20. 今年不再能像 18 / 19 一样有机会去现场参加 WWDC 了，但参加线上 WWDC 也很有趣。通过 Webex 参加了一些 labs，和 Apple Engineer 交流。发了一条推表达 WWDC 20 很赞只是好像没有人会给我发贴纸了之后，还非常幸运的被一位 Apple 的 manager 回复说他来解决贴纸的问题会给我寄贴纸过来（虽然还没收到 LOL）。</p><h3 id="Jul-13-2020-Kevin’s-Home-Qingdao"><a href="#Jul-13-2020-Kevin’s-Home-Qingdao" class="headerlink" title="Jul 13, 2020 @ Kevin’s Home, Qingdao"></a>Jul 13, 2020 @ Kevin’s Home, Qingdao</h3><p><img src="http://www.roczhang.com/images/year-in-review-2020/jul13-2020.png" alt=""></p><p>24 岁生日。时隔四年又见到了小萌和 Kevin 师傅。晚上在 Kevin 家一起看电影喝和乐怡，还被唱了生日歌。我只能嘤嘤嘤。</p><h3 id="Sep-16-2020-Momi-Cafe-Shanghai"><a href="#Sep-16-2020-Momi-Cafe-Shanghai" class="headerlink" title="Sep 16, 2020 @ Momi Cafe, Shanghai"></a>Sep 16, 2020 @ Momi Cafe, Shanghai</h3><p><img src="http://www.roczhang.com/images/year-in-review-2020/sep16-2020.png" alt=""></p><p>前又一次在五角场的猫的天空之城书店写自己的项目，赶着在 iOS 发布正式版之前提交。当天还有一位朋友为了帮我就特意过来，坐在对面和我一起写（虽然后面他睡着了 LOL）。后来真的拿到了「为 iOS 14 优化」的 App Store 推荐。</p><p>我在五角场的这家猫空已经呆了不知道多少了周末提交了不知道多少个版本了。十一月份又一个周末想过去的时候发现原先位置的猫空已经闭店了，似乎要搬到大学路很里面的一个小很多的店铺，虽然在装修中但看起来好像没有以前那些经常坐的窗户对着大学路的座位了。</p><h3 id="Sep-30-2020-Changyang-Campus-Shanghai"><a href="#Sep-30-2020-Changyang-Campus-Shanghai" class="headerlink" title="Sep 30, 2020 @ Changyang Campus, Shanghai"></a>Sep 30, 2020 @ Changyang Campus, Shanghai</h3><p><img src="http://www.roczhang.com/images/year-in-review-2020/sep30-2020.png" alt=""></p><p>从流利说离职日。前一天和 leader 拥抱之后在晚上回家的路上突然哭成傻子。</p><h3 id="Oct-6-2020-Guangzhou"><a href="#Oct-6-2020-Guangzhou" class="headerlink" title="Oct 6, 2020 @ Guangzhou"></a>Oct 6, 2020 @ Guangzhou</h3><p><img src="http://www.roczhang.com/images/year-in-review-2020/oct6-2020.png" alt=""></p><p>离职之后和一位好友一起去了广州，很放松的过了几天。每天在酒店叫外卖，或者就是散步、骑行再吃东西。但是非常开心。</p><h3 id="Oct-27-2020-Pudong-Shanghai"><a href="#Oct-27-2020-Pudong-Shanghai" class="headerlink" title="Oct 27, 2020 @ Pudong, Shanghai"></a>Oct 27, 2020 @ Pudong, Shanghai</h3><p><img src="http://www.roczhang.com/images/year-in-review-2020/oct27-2020.png" alt=""></p><p>第一次去现场参加 Apple 设计开发加速器活动。又见到了 61 和一些开发者朋友。</p><h3 id="Nov-10-2020-Home-Qingdao"><a href="#Nov-10-2020-Home-Qingdao" class="headerlink" title="Nov 10, 2020 @ Home, Qingdao"></a>Nov 10, 2020 @ Home, Qingdao</h3><p><img src="http://www.roczhang.com/images/year-in-review-2020/nov10-2020.png" alt=""></p><p>正式搬到了岛上，开始「上岛」生活。</p><h3 id="Nov-17-2020-Changyang-Campus-Shanghai"><a href="#Nov-17-2020-Changyang-Campus-Shanghai" class="headerlink" title="Nov 17, 2020 @ Changyang Campus, Shanghai"></a>Nov 17, 2020 @ Changyang Campus, Shanghai</h3><p><img src="http://www.roczhang.com/images/year-in-review-2020/nov17-2020.png" alt=""></p><p>被还在流利说的朋友叫回去“救场“做键盘手参加演出，非常神奇也很开心。</p><h3 id="Dec-13-2020-Xiamen-Fujian"><a href="#Dec-13-2020-Xiamen-Fujian" class="headerlink" title="Dec 13, 2020 @ Xiamen, Fujian"></a>Dec 13, 2020 @ Xiamen, Fujian</h3><p><img src="http://www.roczhang.com/images/year-in-review-2020/dec13-2020.jpeg" alt=""></p><p>算是说走就走的和两位朋友飞到了厦门。绕着岛骑行了一下午然后脸被晒伤。</p><h3 id="Dec-26-2020-Xiaomaidao-Park-Qingdao"><a href="#Dec-26-2020-Xiaomaidao-Park-Qingdao" class="headerlink" title="Dec 26, 2020 @ Xiaomaidao Park, Qingdao"></a>Dec 26, 2020 @ Xiaomaidao Park, Qingdao</h3><p><img src="http://www.roczhang.com/images/year-in-review-2020/dec26-2020.png" alt=""></p><p>和豪豪见到了面，然后和朋友们一起过圣诞节看电影。也是非常非常开心的一天。</p><h2 id="Ending"><a href="#Ending" class="headerlink" title="Ending"></a>Ending</h2><p>COVID-19 对每个人都造成了或多或少的影响，对我也一样。</p><p>我们可能再也回不到 COVID-19 之前的世界。COVID-19 虽然带来了很多伤痛，但我们还是要好好面对变化后的生活。Life goes on.</p><p>感谢出现在我 2020 生活里的各位。</p><p>Oh my 2020.</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://www.roczhang.com/images/year-in-review-2020/cover.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;2020 还有最后几十个小时就要结束了。实话说，我挺喜欢自己在 2020 里收获到的一些变化。&lt;/p&gt;
    
    </summary>
    
      <category term="Life" scheme="http://www.roczhang.com/categories/Life/"/>
    
    
  </entry>
  
  <entry>
    <title>Year In Review - 2019</title>
    <link href="http://www.roczhang.com/year-in-review-2019.html"/>
    <id>http://www.roczhang.com/year-in-review-2019.html</id>
    <published>2020-01-05T14:47:10.000Z</published>
    <updated>2020-01-05T16:13:34.048Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://www.roczhang.com/images/year-in-review-2019/cover.png" alt=""></p><p>2019 对我来说是挺矛盾的一年。<br>挺久也没有写博客了，今天在 Photos 里找出了几张印象较深的照片，回顾一下自己是如何走过 2019 的。</p><a id="more"></a><h2 id="时刻"><a href="#时刻" class="headerlink" title="时刻"></a>时刻</h2><h3 id="2019-01-13-MOViE-MOViE-Cityplaza-Hong-Kong"><a href="#2019-01-13-MOViE-MOViE-Cityplaza-Hong-Kong" class="headerlink" title="2019.01.13 @ MOViE MOViE Cityplaza, Hong Kong"></a>2019.01.13 @ MOViE MOViE Cityplaza, Hong Kong</h3><p><img src="http://www.roczhang.com/images/year-in-review-2019/2019-01-13.jpeg" alt=""></p><p>Bohemian Rhapsody 总的来说是我 2019 看过的院线电影里最喜欢的一部了。尤其是最后一部分还原 Live Aid 的部分，真的是太赞了，就像是把之前在 YouTube 上看到的那一段 Queen 的古老录像翻新了一样。 </p><p>在香港看的时候其中的一些镜头和台词还让我觉得这部电影不大可能会在大陆上映，没想到最后也上映了（虽然其中的一部分镜头还是被剪掉了）。</p><h3 id="2019-06-01-‎⁨Griffith-Park⁩-⁨Los-Angeles⁩"><a href="#2019-06-01-‎⁨Griffith-Park⁩-⁨Los-Angeles⁩" class="headerlink" title="2019.06.01 @ ‎⁨Griffith Park⁩, ⁨Los Angeles⁩"></a>2019.06.01 @ ‎⁨Griffith Park⁩, ⁨Los Angeles⁩</h3><p><img src="http://www.roczhang.com/images/year-in-review-2019/2019-06-01.jpeg" alt=""></p><p>今年是第二次去 WWDC 了。基于机票情况这一次我们决定是飞到 LA， 然后从 LA 沿着一号公路自驾去 San Jose。沿途自然是见到了许多之前没有见过的风景。也遇到了不少有趣的事情，比如在一号公路上经历了爆胎，在没有手机信号的地方也都不会换备胎的我们手足无措，最后遇到了好心的路人帮我们换了备胎，还算是有惊无险。</p><p>今年参加 WWDC 的部分应该说是更“熟练”了。去年第一次参加时基本是全程激动然后还有点害羞，今年熟练了套路之后大部分时间都约了 Lab 来交流。在 Swift Open Hour 和 Swift Compiler 的工程师聊到了不少自己遇到的神奇问题，也听他讲了一些他认为的 Swift 中的各种 magic things；在 AVFoundation Lab 提了先前遇到的一些 weird behavior 之后看两个苹果工程师现场调试最后还是开了 radar； 在 App Store Lab 谈到之前公司的 App 被拒绝的具体原因，询问了具体哪些行为是可以哪些是不可以的。最神奇的部分还是在 Accessibility Lab 看到一个盲人苹果工程师通过 Voice Over 使用我们的 app，然后给出他的使用反馈和无障碍适配建议。这些直接交流的机会还是挺难得的，否则要不就是交流周期很长，要不就是没法得到一些具体的建议。</p><p>另外值得一提的是，今年自己交流起来感到更熟练的原因之一应该是自己的英语口语有了挺明显的进步。今年有在 YouTube 上关注一个英文教学的 Up 主，他有提到他认为词汇量 3700 是一个能流畅沟通的台阶。然后速测下来自己目前词汇量应该是 7000 ～ 8000 左右（虽然年初说今年要去考雅思最后还是没有去）。虽然自己之前词汇量肯定也是大于 3700 的，但表达起来总还是会卡卡的而且挺没有自信敢去说。但今年去香港、美国、泰国等地方的时候基本上自己还是能挺自信也能比较流畅的和别人全程用英语来交流的（除去一些比较经常会遇到说话的人有挺强口音的地方，比如日本和新加坡 -。-）。</p><h3 id="2019-07-10-由比ヶ浜，镰仓"><a href="#2019-07-10-由比ヶ浜，镰仓" class="headerlink" title="2019.07.10 @ 由比ヶ浜，镰仓"></a>2019.07.10 @ 由比ヶ浜，镰仓</h3><p><img src="http://www.roczhang.com/images/year-in-review-2019/2019-07-10.jpeg" alt=""></p><p>23 岁生日前夕，和朋友一起去了日本，第一次看花火大会。Shot on iPhone.</p><p>第一次去日本，感受确实和之前通过各种媒介留下的印象差不多：街道干净整洁，店面大多很精致，乘客行人都很有秩序。算下来这次的旅行还是挺有意思的：看到了花火大会，去到了普通市民会去的小澡堂，也很幸运的赶上了春日部夏祭。作为游客来说旅行体验确实是很好了，但其他的许多层面可能以不会说日语的游客身份就很难体会到了。</p><p>朋友在离开日本前一天晚上投了一家日本互联网公司的简历，前不久已经入职了。一切祝好。</p><h3 id="2019-09-28-Mid-Levels-Hong-Kong"><a href="#2019-09-28-Mid-Levels-Hong-Kong" class="headerlink" title="2019.09.28 @ Mid-Levels, Hong Kong"></a>2019.09.28 @ Mid-Levels, Hong Kong</h3><p><img src="http://www.roczhang.com/images/year-in-review-2019/2019-09-28.jpeg" alt=""></p><p>因为两位朋友的美签最后没有办下来，所以国庆前临时改变计划决定一起去泰国。28 号在香港转机有大半天的时间，决定还是离开机场去食四宝饭。一路遇到的机场阿姨和大叔，中环附近的路人和小商贩老板还是都很友好。 </p><p>对这类事情，我并不认同“旁观者清”。在漩涡之外，大概率了解的也都是片面的：或是自己愿意看到的，或是别人想让你看到的。没有身处过漩涡中心的人，也是难以理解漩涡的全貌，以及那些身处漩涡中心的人的感受。我想缘由本就还是复杂的，最可怕的莫过于两边都放弃任何理解，都只通过一个标签去看待对方的所有人，解释所有事。</p><h3 id="2019-10-01-Wat-Chedi-Luang-Chiang-Mai"><a href="#2019-10-01-Wat-Chedi-Luang-Chiang-Mai" class="headerlink" title="2019.10.01 @ Wat Chedi Luang, Chiang Mai"></a>2019.10.01 @ Wat Chedi Luang, Chiang Mai</h3><p><img src="http://www.roczhang.com/images/year-in-review-2019/2019-10-01.jpeg" alt=""></p><p>在清迈的契迪龙寺，看到有和僧侣交流的活动，于是便上前聊了一会儿。期间询问到一个和尚为什么想要出家，他的回答是受限于家庭、经济条件，去佛教大学是他能继续去学英语专业的唯一选择。他的话让我想到泰国的很多职业也许都是“没有选择”，比如看到挺小的孩子就得去打泰拳，或者是从事人妖职业。也许环境让很多人没得选，但能在有限的条件下继续选择去“chasing one’s passion”，是挺让人佩服的事情。比较起来，我还是挺幸运的了。</p><h3 id="2019-10-16-猫的天空之城书店，上海"><a href="#2019-10-16-猫的天空之城书店，上海" class="headerlink" title="2019.10.16 @ 猫的天空之城书店，上海"></a>2019.10.16 @ 猫的天空之城书店，上海</h3><p><img src="http://www.roczhang.com/images/year-in-review-2019/2019-10-16.jpeg" alt=""></p><p>Mr. Weather 2 上线前夕，下班之后特意和小伙伴去了猫的天空之城书店，一起提交了审核。</p><p>今年基本上在 Mr. Weather 2 上线前所有的周末，我都在 WeWork、书店、咖啡馆等地方开发 Mr. Weather，前后投入了大量的时间。这也是一件我一直很想说却不知道应该从哪里开始说起的故事。前者的原因在于，Mr. Weather 1 是我在大学期间完成的第一个独立产品，它上线之后带给我了许多之前从来都想不到的反馈和故事。我也一直像是心怀夙愿般的想要再一次改善它，或者说重做它。所以才决定在今年重新开始设计开发 Mr. Weather 2。但后者的原因在于，我在今年和小伙伴一起投入了大量的时间、精力甚至还有一部分金钱开销，但最终还是受制于各种限制，拿出了一个我自己也不是非常满意的作品。最终数据上看，Mr. Weather 2 的最高排名是国区天气榜免费类第四，畅销榜第十一（虽然现在已经跌的挺多的了）。在十二月份的时候，Mr. Weather 2 被 Apple 收入了一个 App Store Story，之后被推荐到了一部分用户的个性化首页中。 </p><p>现在看回去，Mr. Weather 1 上真的有非常浓的我在学生时代状态的缩影：无忧无虑，有很多自己特别但可能不够成熟的想法。而 Mr. Weather 2 则更多有一些像是现在的自己，考虑的事情更多，想要能尽可能多实现之前用户写来的反馈，又希望能在自我想法和用户间找到平衡。但无论如何，做完 Mr. Weather 2，还是有了不少成长。大到与合作商打交道、和小伙伴协作划定版本的迭代节奏，小到用 Final Cut Pro X 剪一个宣传视频。这些种种加起来，让我感到自己像是又毕业了一次。</p><p>开发独立产品从一些角度上看会是一件投入产出比挺低的事情。它基本上会消耗掉你所有的业余时间，但却不能保证有任何回报。但对我而言，做独立产品这件事总还是快乐和满足来的多，完成独立产品的过程也总是能带给我不小的成长。我也很感谢我的两位小伙伴，愿意一起投入如此多的时间和精力一起来打造一款产品上。</p><h3 id="2019-12-14-Clementi-Singapore"><a href="#2019-12-14-Clementi-Singapore" class="headerlink" title="2019.12.14 @ Clementi, Singapore"></a>2019.12.14 @ Clementi, Singapore</h3><p><img src="http://www.roczhang.com/images/year-in-review-2019/2019-12-14.jpeg" alt=""></p><p>年末机缘巧合，去了一次新加坡，和在新加坡工作的朋友见面一起吃了饭。新加坡也是一个非常有意思的国家，很多地方都有很浓的华人氛围，包括各类标示、广告等，基本都会使用中英双语，恍惚之间会让你觉得身处香港（只是从繁体+英文变成了简体+英文）。有意思的地方是，虽然新加坡比香港的面积还要小上不少，但很多地方却会让你觉得比香港要宽敞上很多，比如道路、公园、商场等。我一直觉得这类文化有些相近却又很不同的地方非常有趣，在和朋友交流之后发现了新加坡更多与国内非常不同的地方，比如 help yourself 的养老制度，使得大部分老年人依然需要工作，因此在各种食阁、商场里经常会看到老年人还在做清洁工的身影。</p><h2 id="尾巴"><a href="#尾巴" class="headerlink" title="尾巴"></a>尾巴</h2><p>我想，2019 应该是有些糟糕的一年。</p><p>我大概还是没有办法像别人一样，买一本新年历，然后便能暗示自己所有问题在新年里都会好起来。2019 年无论是大环境层面上的各种不安定，还是在这些大环境下被裹挟，被推着走，但却又全然无力的我们，回看起来，都挺糟糕且令人恐惧的。</p><p>对我自己来说，今年里我挺讨厌自己的一点，是发现自己逐渐开始会在业余时间里进行“忙碌型懒惰”。明知还有更重要优先级更高的事情应该去做，但似乎又会为了回避而找一些其他的事情，只是为了让自己忙起来。最后的结果只能是减轻短期焦虑却增加了长期焦虑。不同于在工作时间里，我能很明确的把自己应该在自己什么时间点解决什么问题清楚的排好；在面对自己太多的心绪时，反而会想通过以”让自己先忙起来“的方式逃避。心力终究还是有限的，如同年初给自己定下的个人 OKR，objective 太多，结果最后完成的可能都不太好。持续专注在少数最重要的事情上面，这便已经是一件挺困难的事情了。这点急需做出改变。</p><p>不过，2019 也是挺精彩的一年。</p><p>今年走过了不少地方，接触到了挺多的人。真切的触碰到了许多我之前从来没有想过的生活方式；加之面对今年发生的种种“大事件”，我认知的世界和我认知世界的方式都发生了不少变化。在对自己“究竟想要追求怎样的生活”这个问题上，似乎有了一个更确信一些的答案。同时，也在今年见证了身边的许多朋友在追求自己想要的生活的道路上所做出的转变。我想我也应该勇敢一些，勇敢一些向前走。尽管自己想走的道路上还有许多迷雾，我没法确定追求的是否真的是自己想要的，但只要往前走，答案总会有变清晰的一天。</p><p>但行好事，莫问前程。</p><p>感谢各位陪伴。<br>On My 2019. </p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://www.roczhang.com/images/year-in-review-2019/cover.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;2019 对我来说是挺矛盾的一年。&lt;br&gt;挺久也没有写博客了，今天在 Photos 里找出了几张印象较深的照片，回顾一下自己是如何走过 2019 的。&lt;/p&gt;
    
    </summary>
    
      <category term="Life" scheme="http://www.roczhang.com/categories/Life/"/>
    
    
  </entry>
  
  <entry>
    <title>Year In Review - 2018</title>
    <link href="http://www.roczhang.com/2018-year-in-review.html"/>
    <id>http://www.roczhang.com/2018-year-in-review.html</id>
    <published>2018-12-31T14:03:13.000Z</published>
    <updated>2018-12-31T17:52:49.827Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://www.roczhang.com/images/2018-year-in-review-cover.png" alt=""></p><p>今天是 12 月的最后一天，2018 年很快就要结束了。我之前一直没有要在某个特定的时间节点写总结的习惯，只会在有些东西想要输出的时候才会记录下来。但在今年也经历了很多变化，虽然因此想到还是通过年度总结的方式简单复盘一下，帮助自己准备好去迎接新的阶段。</p><a id="more"></a><h3 id="时刻"><a href="#时刻" class="headerlink" title="时刻"></a>时刻</h3><ul><li>2018.01.05，湖北安徽大雪，被困在武汉一夜，在同学家借住。</li><li>2018.01.11，Adonis 发布 2.0。</li><li>2018.03.22，Year Timer 发布 1.1。</li><li>2018.04.14，回校，完成毕业论文答辩。</li><li>2018.04.28，和谭昊在上海见面，聊了一些关于考研与读书的事情。</li><li>2018.05.17，达尔文上架 AppStore 发布 0.10。</li><li>2018.06.02，第一次去美国。</li><li>2018.06.05，第一次参加 WWDC。</li><li>2018.06.22，正式毕业。</li><li>2018.07.13，22 岁。</li><li>2018.07.14，和 Simon 在杭州见面，聊了两天各种毕业后的事情与打算。</li><li>2018.08.02，在 T 沙龙，第一次在外做技术分享。</li><li>2018.08.24，第一次拳击课。</li><li>2018.09.27，流利说上市了，达尔文上线了 1.0。</li><li>2018.10.23，Sam Smith: The Thrill of It All World Tour Shanghai，第一次去听一个人的演唱会。</li><li>2018.11.24，和 61 还有 Alen 在上海见面，与 Jony 还有 sol 一起聊了很多独立开发相关的事情。</li><li>2018.12.20，LLS Hackathon 2018，拿到了二等奖。</li><li>2018.12.22，加入 SwiftGG。</li></ul><h3 id="变化"><a href="#变化" class="headerlink" title="变化"></a>变化</h3><h4 id="身份"><a href="#身份" class="headerlink" title="身份"></a>身份</h4><ul><li>学生 -&gt; Full-time Employee<br>最大的变化莫过于自己彻底不再是学生了。虽然后面一直都是在做全职实习，自己从学校到工作的转变中间也有一段远程实习做过度，一切发生的都很自然，但心态上还是有不少的转变。包括不断地对工作的责任，对环境中各类人与事的处理方式，以及对自己未来规划的思考。很感谢能遇到在很多事情上帮我分析，给我指导与建议的前辈和朋友。</li><li>Member of SwiftGG<br>在 2018 的最后一个月，成为了 SwiftGG 翻译组的一员，并翻了自己在翻译组的第一篇文章。进入这个自己大学时期就在看的翻译组然后开始贡献翻译感觉非常奇妙，就像是给开源社区回馈代码一样。</li><li>Member of Montage Apps<br>一个今年成立的神秘组织，期待它 2019 能造出动静来。</li></ul><h4 id="技术与学习"><a href="#技术与学习" class="headerlink" title="技术与学习"></a>技术与学习</h4><ul><li>Swift &amp; iOS<br>作为现在工作之后每天必然会打交道且打交道时间最长的语言和平台，更是一定要不断学习进步。受到个人心态的变化、公司环境以及同事的影响，今年在 Swift &amp; iOS 方向上，对应用架构、编写测试以及函数式编程上有了更深入的理解。此外在处理各种业务场景的过程中，对系统、各种框架和修复 crash 上有了更多的储备与经验。</li><li>macOS Application<br>今年由完成 AirLogs 为驱动学习了开发 macOS 应用的相关技能。AppKit 作为一个会让 iOS 开发者既熟悉又陌生的神奇平台，写起来也是非常有趣。在后来 Hackathon 的时候又学到了 Cocoa Plugin 的写法。</li><li>Game &amp; AR<br>开始学习游戏相关的起因是完成业余需求的过程中对 SpriteKit 的探索，后来找了一些游戏相关的书看起来，学习的范围也逐渐从 SpriteKit 扩展到了 SceneKit，最后开始学习起 ARKit。</li><li>Machine Learning<br>由于毕业论文定的主题是和机器学习相关，因此也在此完成论文的期间学习了一些机器学习相关的内容。学习了不少概念，同时也在不断动手尝试去解决更多问题。</li><li>LLVM<br>也不知道为什么今年决定学起 LLVM 来了，可能是大学期间没有用心好好学编译原理心有愧疚。后面还加入了一些 LLVM 学习相关的群和组织，但基本没有活跃。这块进度不太多，果然还是有明显的驱动力或者详细的计划能有助学习。</li></ul><h4 id="生活与健康"><a href="#生活与健康" class="headerlink" title="生活与健康"></a>生活与健康</h4><ul><li>拳击<br>今年下半年开始决定学习拳击，这是一项自己早想挑战但一直没迈出行动的运动。今年 8 月底的时候终于决定去学了，也是完成了一项自己一直想做没去做的事情。持续到 12 月基本上维持着每周 1～3 次训练的频率没怎么间断。拳击迷人之处就在于很多事情需要你反下意识的去做，自己也在这个过程中有所进步和感悟。</li><li>减肥<br>自己亲身感受到的工作后久坐造成的身体不适，以及身边发生的或近或远的一些故事，都在不断提醒我注意自己身体健康的重要。除去拳击之外，今年也开始跟着两位好友一起学健身。同时，在 Netflix 上看了一部叫做 Ask The Doctor(医生话你知) 的纪录片，更新了一些我的旧有观念，开始改变自己的生活习惯。尤其是意识到减肥不是一次性就能完成的工作，而是一项 Lifetime 的态度与方式的转变。到 12 月份，自己的体重已经减掉了 30 多斤。自己现在应该依然还是偏胖吧，但这种身体上的变化确实给自己带来了很多好处，尤其是能有更充足的精神。</li></ul><h4 id="使用设备"><a href="#使用设备" class="headerlink" title="使用设备"></a>使用设备</h4><ul><li>(+) MacBook Pro 15’ 2018</li><li>(+) Nokia X6</li><li>(+) DJI OSMO Mobile 2</li><li>(+) HomePod</li><li>(+) iPhone XS Max</li></ul><h4 id="使用服务"><a href="#使用服务" class="headerlink" title="使用服务"></a>使用服务</h4><ul><li>Apple Music -&gt; Spotify</li><li>Bear -&gt; Notion</li><li>GitHub Student Package -&gt; GitHub Developer Plan</li><li>iCloud Drive 50G -&gt; 200G</li><li>(+) Netflix</li></ul><h4 id="2019"><a href="#2019" class="headerlink" title="2019"></a>2019</h4><p>2019 作为自己毕业后的第一年，还是有不少对自己的期望。</p><ul><li>技术上的进步应该是工程师必须不断保持的必完成事项了。年末的时候和同事发起了 <code>Swift Algorithm Challenge</code>，希望 19 年能不断深入学习，提升自己在算法和更底层知识上的储备吧。另一方面则是通过不断思考问题和解决问题，来提升自己架构设计方面的能力了。</li><li>两个未完成的 Project，能在 2019 至少完成 1.0。</li><li>保持健康的态度与生活方式。</li></ul><p>感谢各位陪伴。<br>On My 2018. </p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://www.roczhang.com/images/2018-year-in-review-cover.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;今天是 12 月的最后一天，2018 年很快就要结束了。我之前一直没有要在某个特定的时间节点写总结的习惯，只会在有些东西想要输出的时候才会记录下来。但在今年也经历了很多变化，虽然因此想到还是通过年度总结的方式简单复盘一下，帮助自己准备好去迎接新的阶段。&lt;/p&gt;
    
    </summary>
    
      <category term="Life" scheme="http://www.roczhang.com/categories/Life/"/>
    
    
  </entry>
  
  <entry>
    <title>2018.09.09</title>
    <link href="http://www.roczhang.com/20180909.html"/>
    <id>http://www.roczhang.com/20180909.html</id>
    <published>2018-09-09T03:10:23.000Z</published>
    <updated>2018-11-10T07:02:11.560Z</updated>
    
    <content type="html"><![CDATA[<p>2018 的夏天结束了。</p><a id="more"></a><h2 id="Things-at-Work"><a href="#Things-at-Work" class="headerlink" title="Things at Work"></a>Things at Work</h2><h3 id="AirLogs-2"><a href="#AirLogs-2" class="headerlink" title="AirLogs 2"></a>AirLogs 2</h3><p>AirLogs 2 大体上算是完成了，还差一些小组件和部分功能的优化。</p><p><img src="http://www.roczhang.com/images/20180909/02.png" alt="1"></p><p>上周五在公司的每周 iOS 组分享里第一次介绍了 AirLogs 2，一共准备了 80 页整的 Keynote，讲了近一个小时。这个原先为了解决连接与展示问题方便 QA 实时查看日志的工具在一个月前完成了第一个版本之后收到了不少反馈，在 2.0 中新增了通过 MultipeerConnectivity 的无线连接方式以及 ADB 连接 Android 设备的方式，同时也增添了独立组件后的 Formatter 与 Filter 工具，也完全重新设计和改写了 UI。</p><p><img src="http://www.roczhang.com/images/20180909/01.png" alt="2"></p><p>写 AirLogs 算是我第一次写 Cocoa Mac App，AirLogs 2 因为是完全从头开始，因此也算是第二次开始写 Cocoa Mac App。同时我也花了些时间完全重新设计了 AirLogs 内部的组件架构，也和一位同事大佬讨论得到了建议。因为最近也在读「聊聊架构」这本书，算是在实际尝试思考实践 “核心生命周期” 和 “树状架构” 两个概念。后面全部完成正式在内部 release 之后应该会写一篇详细一些的文章介绍 AirLogs 2 的结构和用到的技术。</p><p>同时 MultipeerConnectivity 是一个非常好玩的框架，但以前都没发现过，最近还是在看 ARKit 2 的 demo 中通过 MultipeerConnectivity 框架传输 ARWorldMap 才开始了解这个从 iOS 7 时代就有的框架。感觉起来应该可以用这个框架做很多好玩的事情。</p><h2 id="Personal-Life"><a href="#Personal-Life" class="headerlink" title="Personal Life"></a>Personal Life</h2><h3 id="Boxing"><a href="#Boxing" class="headerlink" title="Boxing"></a>Boxing</h3><p>上个月决定了开始学习拳击，在第三周去上了第一节拳击课。我好像从小开始就不是非常喜欢和擅长运动的人，决定去学一方面是开始感到每天长久坐着工作同时缺乏运动之后身体越来越差，另一方面是一直觉得拳击/搏击这类运动很有挑战很想试一试，因此第一次去的时候就有一种成就解锁达成的感觉。记得初中的时候看「第一神拳」这部动漫，就很喜欢主人公“一步”燃到爆的态度。</p><p>自己开始学之后当然是不会有动漫里那么热血的故事，但对我还是挺有挑战的。我的体能、跳绳之类都不是很行，同时初学开始是要不断不断重复各种基础动作，就像是和练习所有其他技能一样。但从开始到现在一共 5 节课过去，还是能挺明显感到自己在进步的，会让自己非常开心，甚至最近走路的时候都会偶尔中二练习出拳（还被路旁的外卖小哥用奇怪的眼神扫视了）。</p><p>目前是每周两节课的频率，然后是在午休时间去，当然也就少掉了吃午饭的时间。但运动之后下午精神还能保持挺好的状态，也顺便能帮自己戒掉每天喝咖啡导致的有些咖啡因成瘾了。希望自己能坚持下去，某一天能和别人实战训练的时候应该算是又可以解锁一个成就了。</p><h3 id="Side-Projects"><a href="#Side-Projects" class="headerlink" title="Side Projects"></a>Side Projects</h3><p>之前小幅更新了一个 Adonis 的版本，后来公司的事情又多起来，再去掉写 AirLogs 2 的时间，目前又是没啥时间可以更新个人项目的状态了。</p><p>上个版本的 Adonis 里接入了腾讯的 “吐个槽” 反馈平台，上线之后发现发帖反馈的还不少，因此开始思考之前用的邮箱、Slack 等方式对用户反馈来说是不是成本有些太高了。同时也在闲暇时间规划了 Adonis 3 的 Features，也第一次在做个人项目的时候开始尝试详细写 PRD。然后就开始发现 3.0 里要做的功能可能只用 CloudKit 或者其他 BAAS 服务是不够了，可能不得不又要自己写后端还有维护了。</p><p>天，真的还有好多想做的项目但时间实在是太不够了。</p><h2 id="Talks"><a href="#Talks" class="headerlink" title="Talks"></a>Talks</h2><p>终于有了时间可以在下个月的十一小长假回学校去拿已经发放了好久的毕业证和学位证。然后偶然才发现比自己小一届的学弟们已经开始找工作了，加上上周流利说六周年年会，然后猛然间发现自己来流利说也已经快一年了。</p><p>熟悉我的可能知道实际上我算是已经不间断工作 2 年多了，从在学校大三一整年做 part-time intern 开发，到大四做 full-time intern 开发，再到现在变成一个 full-time employee，每年故事的转折点好像都在夏天发生。在不断遇到的好好坏坏的事里不断修正着自己的心态，也不断在了解确定自己想追求的是什么。身边的环境和人总会变化，处理内我和外界之间相处的方式不是一件容易的事情，从妥协到自信到固执之间也不只是改变不改变那么简单。在一个不断要去面对外界环境的挑战里，从被人怀疑到产生自我怀疑之间也不止是坚信自己的选择那么简单。</p><p>2018 的夏天结束了，窗外隐约之间能听到的蝉鸣还有一丝夏天的余韵。我还确信有自己的热爱和坚持，我告诉自己新故事又要开始了。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;2018 的夏天结束了。&lt;/p&gt;
    
    </summary>
    
      <category term="Life" scheme="http://www.roczhang.com/categories/Life/"/>
    
    
  </entry>
  
  <entry>
    <title>2018.08.15</title>
    <link href="http://www.roczhang.com/20180815.html"/>
    <id>http://www.roczhang.com/20180815.html</id>
    <published>2018-08-14T16:50:56.000Z</published>
    <updated>2018-11-10T07:02:11.560Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://www.roczhang.com/images/20180815/01.png" alt="cover"><br>“某公司设计师和 iOS 工程师被 PM 逼疯，对着桌子傻笑着疯狂拍照。“</p><a id="more"></a><p>上上周经历了魔鬼的一周。之前重构的部分基本结束，然后就是发版前的不断完善、测试、修改。为了不影响正常发布几乎上上周每天晚上回家了之后都在继续，甚至还有两三天都在小通宵还加上一整个周末的时间，最后终于还是没有 delay 在周一正常提交 App Store 审核了。目前上线不到一周，还没有遇到重构部分相关的问题。</p><p>其中的发生了两件值得一提的小插曲。其一是审核被拒，理由是权限描述不具体。最近 App Store 因为这个理由拒绝的频率好像还挺高，除了周边开发者朋友的描述，我自己前一段时间也遇到过。Mr.Weather 申请定位权限用于自动定位城市的描述从上架到现在 1 年多从来没有改动过也从来没有被拒过，上次因为同样的理由被拒了，后来回复了审核之后重新 review 很快过审。结合最近审核又开始变慢（平均需要两天左右）和不少开发者在吐槽的客服要求找开发者退费问题，有些担心后面情况会更加恶化。</p><p>另一件事是工作时间。某天接通知要求上班时间从弹性工作时间改成固定早 10 点到晚 9 点。当时大家还都不太开心，即使基本上开发在弹性工作时间制下的工作时间并不会比这样固定的时间少。国内工程师晚上加班都是普遍行为了，因此国内互联网公司非常流行的弹性工作制在形式上的不固定对工程师相对也更友好一些，提倡效率也更结果导向。好在最后我们还是改回了弹性工作时间。</p><hr><p>上周末去了 T 沙龙，也是自己第一次在外做技术分享。分享的主题是 ARKit，然后做了一个桌面打保龄球的小 AR 游戏做 demo。非常羞耻的还是紧张了（捂脸），语速有些快而且漏掉了一些实现准备讲的点没有深入进去提，最终时长也比预计短了不少。好在 T 沙龙气氛非常好，QA 环节有很多人提问，结束了之后也有很多观众来继续提问和交流（顺带一提又一次遇到了 Mr.Weather 的用户）。组委会给的准备时间其实很长，但自己还是因为拖延和重构事情准备的不够充分。毕竟分享还是应该要能对得起观众的时间，经历这次之后我想最好还是准备详细的演讲注释或者提纲。很感谢 @chun 和组委会给机会分享，后面自己要好好积累希望以后有机会能再做分享了。</p><p>非常开心的是见到了很多 iOS 开发大佬，比如 MM、冬瓜、EyreFree 等等大佬，都是之前我有用过的开源库的作者或读过和在关注的博客的作者。和大佬们一起吃饭时听了大佬们聊工作日常和技术讨论，真的是非常开心了。</p><p><img src="http://www.roczhang.com/images/20180815/02.png" alt="cover"><br><img src="http://www.roczhang.com/images/20180815/03.png" alt="cover"></p><hr><p>更新一些自己项目的状态。之前有不少次看到用户在各种渠道问 Mr.Weather 2 上架的时间，但非常抱歉的是我真的不知道。原因在于虽然之前 Mr.Weather 2 设计完成，iOS 代码也写了一部分，但后期自己还是越来越觉得不满意，而且工程上希望能有机会 Support 到不同的平台，除了 iPhone 之外，希望（目前只是希望）还能提供 macOS 上的版本，如果后面时间充裕的话应该还会做 watchOS 的版本和为 iPad 优化的 UI，所以重新建了工程。现在变成了一个大的 workspace，下面目前包含了  Mr.Weather-iOS、Mr.Weather-macOS、Mr.Weather-Core、Mr.Weather-Data、Mr.Weather-Resource 这些 project，框架和相关服务配置啥的都已经搭好接好了，后面就是用时间来填充完成了。</p><p>想做和要做的事情还有很多，比如更通用的 AirLogs，还有 Adonis 3，还有 24，甚至最近还越发想写一个播客应用… 可惜的只是时间精力永远不够用，只能好好安排具体去做了。</p><p>最近会感觉到自己状态要比前一小段时间好一些，我想自己会这样循环往复状态好或者不太好，原因就是自己周边不断发生的各种事情或无形或有形的在影响我对自己的定位与认知。这种循环起伏也许没什么不好的，至少目前似乎每经历一个周期都能让我修正一点自我定位和认识。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://www.roczhang.com/images/20180815/01.png&quot; alt=&quot;cover&quot;&gt;&lt;br&gt;“某公司设计师和 iOS 工程师被 PM 逼疯，对着桌子傻笑着疯狂拍照。“&lt;/p&gt;
    
    </summary>
    
      <category term="Life" scheme="http://www.roczhang.com/categories/Life/"/>
    
    
  </entry>
  
  <entry>
    <title>2018.08.03</title>
    <link href="http://www.roczhang.com/20180803.html"/>
    <id>http://www.roczhang.com/20180803.html</id>
    <published>2018-08-03T15:28:15.000Z</published>
    <updated>2018-11-10T07:02:11.559Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://www.roczhang.com/images/20180803/01.png" alt="ReLife"></p><p>ReLife 真是一部太棒的剧了，让我忍不住要发表中二感言，也突然又想起了两年前的生活。</p><a id="more"></a><p>这周吃午饭时和同事们闲聊，突然就开始互相安利起动漫来。于是我一下子又想起了 ReLife 这部番，一查，才发现原来都已经出了完结篇了。然而这周一直在处理上周 Roadmap 重构后还没有解决完全的问题与 bugs，每天都是疯狂加班，到家还得继续，今天终于有些许闲暇来看完了短短 4 集的完结篇（虽然到了周末还是要加班继续，囧）。</p><p>ReLife 的剧情大体是 27 岁的男主在工作中遭遇挫折成为尼特族，选择 ReLife 重生计划，一年时间回到 17 岁的高中生活，开始重新审视自己，并结识了女主和小伙伴们的故事。</p><p>回翻相册发现第一次开始看 ReLife 这部番是在 2016 年，大概也就是自己大三那年，自己白天上课晚上远程兼职做开发的那段时间。当时的自己还不用特别为毕业之后的事情所烦恼，只是单纯做好自己的工作与学习，是每天都能因为自己技艺得到进步，能与厉害的同事交流，并且生活可以自给自足感到开心满足的一段时间。白天上课晚上工作虽然挺辛苦，但回想起来也是大学期间技术进步最快的一段时间。当时的自己会经常需要熬夜或者通宵，写代码间隙感到饥饿就会吃两片大吐司夹雀巢炼奶，并看一看各类番剧来放松休息。那段时间看的除了孤独的美食家、食彩之国、看理想的各类节目，就是 ReLife 了。</p><p>自己追过的番并不多，看完 ReLife 动漫之后，忍不住第一次开始找漫画来看。而后面 comico 国区停止运营，台区 comico 涌入大波难民，再到看到 ReLife 真人舞台剧的上映，一直很期待能看到这个故事的结局，而后面随着自己毕业事情慢慢多了起来，就逐渐没能再继续关注，直到这次又看到了完结篇。看到弹幕提到完结篇由于经费不够是众筹出来的，画面和剧情上确实做了很多删减，但能看到这次的完结篇，已经让我觉得非常感动了。</p><p>我想 ReLife 之所以能让很多人产生共鸣感到被打动，也许是不少人都有过的，想要回到以前的日子再来一次的念头；还有每一次仿佛自己都经理过的喜怒、纠结和最后面对离别的不舍。我也无数次想过自己回到从前，也许会作出哪些改变，也许会重新做哪些选择。但 ReLife 并不是一部乌托邦剧，回到 17 岁也不是为了回避在成人世界所遇到的烦恼，而是一个机会能够得以重新审视自己，做出改变再继续勇敢面对后面的生活。男主和女主从害怕 ReLife 结束之后所有印记都要被抹除，害怕越是绚烂的烟花消失之后就越是落寞，到最后尽情珍惜每一分一秒，相信即使一切最终都会被抹去，但当下的存在也是真实。</p><p>ReLife OP 里的一句歌词是“不要回头，勇敢向前，即使没有再会的那一天”，让我想到自己高中毕业时把同学的一句留言“幻梦终醒，本无不散之宴。却无悔，付之年华”加到了毕业纪念视频的最后。我依然是一个会经常忧虑未来，担心后续，焦虑下一刻的人。也会有“这些在多久之后都不会再和我有任何关系”而影响当下选择的想法。但也许，选择尽情全身心投入当下，才是更勇敢和更不易后悔的选择。即使知道一切都会散去，但依然能选择勇敢地面对，全身心投入到当下的一期一会中。</p><p>感谢你，ReLife。感谢你的漫画，夜宵草与 Comico。</p><p>我们无法经历一次 ReLife，但我们可以选择勇敢的面对和珍惜当下的生活。</p><p><img src="http://www.roczhang.com/images/20180803/02.png" alt="ReLife"><br><img src="http://www.roczhang.com/images/20180803/03.png" alt="ReLife"><br><img src="http://www.roczhang.com/images/20180803/04.png" alt="ReLife"></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://www.roczhang.com/images/20180803/01.png&quot; alt=&quot;ReLife&quot;&gt;&lt;/p&gt;
&lt;p&gt;ReLife 真是一部太棒的剧了，让我忍不住要发表中二感言，也突然又想起了两年前的生活。&lt;/p&gt;
    
    </summary>
    
      <category term="Life" scheme="http://www.roczhang.com/categories/Life/"/>
    
    
  </entry>
  
  <entry>
    <title>2018.07.22</title>
    <link href="http://www.roczhang.com/20180722.html"/>
    <id>http://www.roczhang.com/20180722.html</id>
    <published>2018-07-22T14:44:37.000Z</published>
    <updated>2018-11-10T07:02:11.559Z</updated>
    
    <content type="html"><![CDATA[<p>昨天听闻台风要登录上海，凌晨一直难以入眠。后来隐约间听到窗外风雨夹杂，已记不清是清醒还是睡着。早晨起床看到楼下院子里满是树叶，明明是个盛夏的日子却有摸得到的秋日凄凉。 </p><p>近期自己的状态一直不太好。突然感觉自己的心绪好像这满地落叶一样凌乱，甚至不知该从何处开始收拾。 </p><a id="more"></a><p>上周签了厚厚的一叠劳动合同，这也是我第一个没有暑假的夏天。上周五度过了自己 22 岁生日，天，高中之后我就没再收到过生日礼物，时隔多年收到了多份同事和测试小姐姐们送的礼物。晚饭后回到家里躺在床上，想到自己现在就 22 岁了，一段回过头就能仔细看得清的时间段里，经历了些许挫败的事情，无由头的联想起自己之前被不信任，甚至是被嘲讽的经历，突然就开始止不住的流眼泪。我从没感觉自己有变成熟，却感到自己其实越来越不成熟，越来越脆弱，越来越多愁善感。</p><p>和师傅聊了几次。师傅说他感觉我是个很内向的人，能感觉到的有很多想法和情绪也不会表露出来，只是搞笑一下就带过了。我之前从来都觉得自己是和内向无关的人，但现在发现自己积压的情绪越来越多却无处释放，已经很久没有和谁表达过自己情绪的时候，才发现师傅说的可能真的是对的。 </p><p>总结自己是一个极其残忍的过程。似乎大部分时间里都总是在否定自己，不管当时还有没有剩什么你肯定的事情。 </p><p>我也本就不认为自己是个内心强大的人。自己之前以为似乎已经努力弥补了的地方被证明并没有，自己之前以为做的有所作用的事也被证明并没有。因为之前自己的坚信本就不强烈，我便忍不住的开始怀疑是不是自己的想法与方式有问题，是不是该做出调整。看到之前的“但行好事，莫问前程”已经可以让我怀疑自己所做的算不算的上是“好事”了。 </p><p>昨夜翻看相册，一直看到大二大三那个暑假实习工作时的照片，一张公司大门的照片时间就定格在 2016 年 7 月 23 号。天，真的就已经过去两年了。还记得当时初次在学校以外的团队中工作，总是时不时会有“如果能和这群人永远一起工作该多好”的感叹。后来也发生过好多次相识后又离别的故事，以为是已经接受了本没有不散之宴，离别才是常态的事实，但身边真的有谈的来并在意的人又快要离开的时候，还是会忍不住非常非常难过。 </p><p>虽然是还没调整到足够好的状态，但手上和脑子上却没时间停下来。我还是想去国外读 master，始终有虽然已经读完了大学但相比起来还是没能学到什么真 Computer Science 的感觉。即便自问大学期间也没闲着，但还是浪费了不少时间在没有什么用处的事情上。但注定在只能自己供自己去读书的情况限定下，只能做 2 年以上的中长期打算了。我不是那类打算年龄大了之后以“写不动”转到其他职位上，或是准备回老家去做其他工作的人。既然这是我目前为止发现的自己最喜欢做的一类事之一，我还是希望自己能够在这条路上尽量往更远处去走吧。</p><p>公司的工作上最近在重构挺重的一部分代码。此外写了一个 Mac 上连接 iOS 设备的和 log 相关的工具 App，也在周会上给其他组的同事做了介绍展示。然后经过主动安利后看到自己的基础代码集 <code>RocFoundation</code> 里的一块代码首次出现在其他项目里（而不是我在的这个项目），有些奇特的感觉。 </p><p>个人项目这一块，在写一个小游戏，不出意外的话会是第四个应用了。Mr.Weather 2 只是停留在体验层的改进上会让我提不起太大的兴趣，我还是希望它能在面向需求层上有更进一步。虽然工作日的我基本上还是没有什么个人时间，但面对自己喜欢的事，就本不该有任何借口。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;昨天听闻台风要登录上海，凌晨一直难以入眠。后来隐约间听到窗外风雨夹杂，已记不清是清醒还是睡着。早晨起床看到楼下院子里满是树叶，明明是个盛夏的日子却有摸得到的秋日凄凉。 &lt;/p&gt;
&lt;p&gt;近期自己的状态一直不太好。突然感觉自己的心绪好像这满地落叶一样凌乱，甚至不知该从何处开始收拾。 &lt;/p&gt;
    
    </summary>
    
      <category term="Life" scheme="http://www.roczhang.com/categories/Life/"/>
    
    
  </entry>
  
  <entry>
    <title>跨越大四</title>
    <link href="http://www.roczhang.com/across-senior-year.html"/>
    <id>http://www.roczhang.com/across-senior-year.html</id>
    <published>2018-06-23T15:39:39.000Z</published>
    <updated>2018-11-10T07:02:11.560Z</updated>
    
    <content type="html"><![CDATA[<p>昨天早上学校的毕业典礼结束之后，我想自己终于算是程序上完全毕业了。<br>也终于到了可以写跨越大学最后一篇的时候，只是我对毕业这件事好像已经基本没剩什么感觉了。</p><a id="more"></a><p>去年六月离校，十月开始实习，四月完成论文返校答辩，上周完成双学位论文，到这周学校毕业典礼发毕业证学位证，只是因为自己还有很多事要做所以暂时还没法回学校。空间和身份上的转换对我而言似乎没有太大变化，唯一经历的不适感是因为个人可自由支配时间突然变少造成的不安。</p><p>还在学校的时候，有很多事情没曾想过也有很多事情没想明白。当时驱动自己的东西也很简单，或是真的喜爱，或是试图想要证明自己得到别人的认可与夸赞。离开学校之后虽也是一个人居住，但环境上开始时的生疏给了自己更多的时间能够把自己隔离开来了解和追问自己，从小问题到大问题。就如为什么要做每件事，为什么自己总在感到不安，我的能力有提升吗，为什么会经常对自己感到不满和自卑，什么对我来说才真的重要，我想追求的到底是什么。这些大大小小的问题关系着自己处理每一件事做每一个决定，还有晚上能否睡的着。技艺上的精进能够让我收获很单纯的开心，比如编程技术、设计水平或者是弹吉他，但这只是经历付出之后收到正向反馈的短期成就感，放到更短的时间长度之内可能和一盘游戏也并无差异，只是依然没有办法持久的缓解我对自己更长时间段上的焦虑。</p><p>幸运的是遇到了很多方面值得自己学习和引发自己思考的人（师傅），加之自己身边发生的事让我感受到之前觉得还离自己很远的事可能距离也没那么远。虽然很多问题的答案依然是想不明白，但有些问题阶段性的答案的的确确变得更清楚了，我也能感受到自己的心态在产生变化。见到了更多人的选择和生活方式，虽然不会再像以前一样啧啧称奇，但让我越发想去了解更多的人，看到更多的可能。</p><p>实习到现在已经八个月了，没有意外的话周一就会签入职合同正式入职了。回想起自己最近几年的生活依然会觉得非常神奇，总让我会想要感激每一次幸运的偶然，但也相信每一件事绝非只是偶然。站在以前的时间节点上我想不到现在的自己，这挺好也挺不好，但让我期待在以后的某一天，假想今天的我朝后面的我看过去，会更强烈的惊叹，这一切都太神奇了。</p><p>2018.06.22 - Ordinary graduation day, fantastic 4 years.</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;昨天早上学校的毕业典礼结束之后，我想自己终于算是程序上完全毕业了。&lt;br&gt;也终于到了可以写跨越大学最后一篇的时候，只是我对毕业这件事好像已经基本没剩什么感觉了。&lt;/p&gt;
    
    </summary>
    
      <category term="Life" scheme="http://www.roczhang.com/categories/Life/"/>
    
    
  </entry>
  
  <entry>
    <title>WWDC18 Notes - Automatic Strong Passwords and Security Code AutoFill</title>
    <link href="http://www.roczhang.com/wwdc18-notes-automatic-strong-passwords.html"/>
    <id>http://www.roczhang.com/wwdc18-notes-automatic-strong-passwords.html</id>
    <published>2018-06-13T21:28:15.000Z</published>
    <updated>2018-11-10T07:02:11.562Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://developer.apple.com/videos/play/wwdc2018/204/" target="_blank" rel="external">WWDC18 - Session 204</a> 笔记 </p><p>在 iOS 12 中，Apple 将自动建议与使用强唯一密码的功能带入了 App 内，通过 QuickType bar 大幅简化了用户设置账户与登陆的繁琐操作。本 session 介绍了如何优化应用如何适配密码、安全码和其他自动填充功能，带给用户更安全与无缝的体验。</p><p><img src="https://www.roczhang.com/images/wwdc18-notes-automatic-strong-passwords/1.png" alt="cover"> </p><a id="more"></a><h2 id="Password-AutoFill-自动密码填充"><a href="#Password-AutoFill-自动密码填充" class="headerlink" title="Password AutoFill 自动密码填充"></a>Password AutoFill 自动密码填充</h2><p>在 iOS 11 中，Apple 引入了自动填充密码。此功能可以让用户通过点击键盘上方的 QuickType bar 快速完成用户名与密码输入过程。首先是对此功能的概要重述，重点包括：</p><ol><li>设置 Associated domains 关联域。iCloud Keychain Password Manager 中的密码是基于 Web 上的 domain 域（如 apple.com）来存储的。因此，就需要将 App 与 Web 上的域关联起来。关于 Password AutoFill 的详细功能，可见 <a href="https://developer.apple.com/videos/play/wwdc2017/206/" target="_blank" rel="external">WWDC 17 - Session 206 - Introducing Password AutoFill for Apps</a>。 </li><li>标记好 Content types。在 iOS 11 中，<code>UITextContentType</code> 中添加了新类型：<code>username</code> 及 <code>password</code>。只要给输入框设定好正确的 <code>textContentType</code> 即可。如：<figure class="highlight swift"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// For user name text field</span></div><div class="line"><span class="keyword">let</span> userTextField = <span class="type">UITextField</span>()</div><div class="line">userTextField.textContentType = .username</div><div class="line"></div><div class="line"><span class="comment">// For password text field</span></div><div class="line"><span class="keyword">let</span> passwordTextField = <span class="type">UITextField</span>() </div><div class="line">passwordTextField.textContentType = .password</div></pre></td></tr></table></figure></li></ol><h3 id="改进"><a href="#改进" class="headerlink" title="改进"></a>改进</h3><ol><li>在 iOS 11.3 中，WKWebView 支持了自动填入密码，如果登录界面使用 Web 技术实现会很有帮助。</li><li>在 iOS 12 中，从 App Store 中下载的其他密码管理应用也可以提供信息实现自动输入功能。只要开发者适配了 iCloud Keychain Password Manager 的 AutoFill，其他第三方密码管理应用也同样能够得到支持。如果你在开发密码管理应用，可以浏览 <a href="https://developer.apple.com/videos/play/wwdc2018/721/" target="_blank" rel="external">WWDC 18 - Session 721 - Implementing AutoFill Credential Provider Extensions</a>。</li></ol><h3 id="Password-Saving-密码保存"><a href="#Password-Saving-密码保存" class="headerlink" title="Password Saving 密码保存"></a>Password Saving 密码保存</h3><p>在 iOS 12 中，Apple 提供了在 App 内新账户登录时保存密码凭证的功能。从而使得用户在所有设备上都能通过 iCloud Keychain 登录你的 App 或网站。保存密码的工作原理是：</p><ol><li>推断登陆场景；</li><li>基于关联 domain 检查资质；</li><li>查找用户名和密码字段；</li><li>检测登陆操作；</li><li>提示用户保存或更新密码。</li></ol><p>为确保兼容此功能，我们需要检查的事件有:</p><ol><li>为相关的输入框标记好 content type 内容类型；</li><li>当登录事件发生时，将用户名与密码输入框从 view hierarchy 中移除。这样 Autofill 便能够检测到登录事件正在进行。可以通过 dismiss 掉登录场景的 View Controller 实现；</li><li>确保值在上述移除工作完成之后再清除登录输入框中的内容，这样 Autofill 才能读到数据并将其保存；</li><li>检查 Autofill 保存的密码关联的是否为正确的 domain。可以通过保存后在设置界面中查看保存结果，如不正确，可通过 Web credentials associated domain service 覆盖其保存的位置。</li><li>如果之前手动通过 <code>SecAddSharedWebCredential()</code> 保存，现在可能不在需要使用它了.</li></ol><p>总结关键点在于：</p><ol><li>将 app 关联 domain；</li><li>为输入域做好标记；</li><li>确保登陆检测。</li></ol><h2 id="Automatic-Strong-Passwords-自动强密码"><a href="#Automatic-Strong-Passwords-自动强密码" class="headerlink" title="Automatic Strong Passwords 自动强密码"></a>Automatic Strong Passwords 自动强密码</h2><p>Automatic String Passwords 提供生成建议用户名、密码与保存功能，通过几次点击便可以完成注册，将注册过程变得更加容易与安全。<br><img src="https://www.roczhang.com/images/wwdc18-notes-automatic-strong-passwords/3.png" alt="automaticStrongPasswords"></p><p>Automatic Strong Passwords 的工作原理与上述的 Password Saving 工作原理大致相似：</p><ol><li>推断 View Controller 类型；</li><li>基于关联的 domians 检查资质；</li><li>检测相关的注册表单元素，如用户名输入框与密码输入框；</li><li>提供建议用户名；</li><li>键入强密码；</li><li>用户注册后保存。</li></ol><p>对此功能的兼容性检查表也与上述的 Password Saving 类似。<br>为配合此功能，在 iOS 12 中，<code>UITextContentType</code> 新增了 <code>.newPassword</code> 类型，我们需要标记好自己 App 中的新密码输入框与密码确认输入框为 .newPassword。</p><h3 id="对修改密码表单的注意事项："><a href="#对修改密码表单的注意事项：" class="headerlink" title="对修改密码表单的注意事项："></a>对修改密码表单的注意事项：</h3><ol><li>用户名与新密码文本框应该在同一屏上；</li><li>用户名文本框可以是只读的；</li><li>在注册中的最佳实践同样适用于此。</li></ol><h3 id="默认生成密码的格式"><a href="#默认生成密码的格式" class="headerlink" title="默认生成密码的格式"></a>默认生成密码的格式</h3><ol><li>长度为20个字符；</li><li>包括大字母、小写字幕、数字与连字符；</li><li>超过 71 位的熵；</li><li>设计上旨在与大多数服务兼容。</li></ol><p>自动生成的密码例子：<code>funrus-Hommez-kajzp7</code>。</p><p>当然，考虑到不同的后端规则，也可以自定义自动生成强密码的格式。可以通过密码规则语言来定义规则，如：<br><figure class="highlight swift"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">let</span> newPasswordTextField = <span class="type">UITextField</span>()</div><div class="line">...</div><div class="line"><span class="keyword">let</span> rulesDescriptor = <span class="string">"allowed: upper, lower, digit; required: [$];"</span> newPasswordTextField.passwordRules = <span class="type">UITextInputPasswordRules</span>(descriptor: rulesDescriptor)</div></pre></td></tr></table></figure></p><p>还可以使用新的密码规则验证工具 - <a href="https://developer.apple.com/password-rules/" target="_blank" rel="external">Password Rules Validation Tool</a>。</p><h2 id="Security-Code-AutoFill-验证码自动填充"><a href="#Security-Code-AutoFill-验证码自动填充" class="headerlink" title="Security Code AutoFill 验证码自动填充"></a>Security Code AutoFill 验证码自动填充</h2><p>对于 iOS 12 之前用户来说，收到短信验证码都需要人肉记忆，再手动输入到文本框中。iOS 12 与 macOS Mojave 中终于带来了自动输入验证码功能。同样在 <code>UITextContentType</code> 中新增了一种 <code>.oneTimeCode</code> 的类型。但由于依赖系统键盘 QuickType 输入，所以对于哪些取代系统键盘使用自定义界面输入验证码的场景无法使用。同时，在所以已支持的语言环境中都可用。验证码自动填充功能同样能够在 Safari Web 页面中使用。非常棒的一点是如果用户尝试在 Mac 上通过 Safari 登录，iPhone 上收到的验证码信息将会被自动安全的传递到 Mac 上，以实现在 Mac 上同样能够轻点一下自动填充验证码。</p><p>此次自动输入的功能在 Safari 中同样有效，具体属性符对应如下： </p><table><thead><tr><th>Attribute</th><th>iOS 12 (UITextContentType)</th><th>Safari (input autocomplete=”value”)</th></tr></thead><tbody><tr><td>UserName</td><td>.username</td><td>username</td></tr><tr><td>Existing Password</td><td>.password</td><td>current-password</td></tr><tr><td>New Password (for Automatic Strong Passwords)</td><td>.newPassword</td><td>new-password</td></tr><tr><td>One Time Code (for Security Code AutoFill)</td><td>.oneTimeCode</td><td>one-time-code</td></tr></tbody></table><h2 id="Federated-authentication-联合身份验证"><a href="#Federated-authentication-联合身份验证" class="headerlink" title="Federated authentication 联合身份验证"></a>Federated authentication 联合身份验证</h2><p>对于要支持使用第三方服务（如社交媒体账号）登录的情况，iOS 12 中引入了新的 API: <code>ASWebAuthenticationSession</code>。联合身份验证过程如下图所示：<br><img src="https://www.roczhang.com/images/wwdc18-notes-automatic-strong-passwords/2.png" alt="federatedAuthentication"><br>使用 ASWebAuthenticationSession 的好处在于：更快的登陆流程、支持密码自动输入与验证码自动输入以及简单明了的基于 block 形式的 API。具体用法如下所示：<br><figure class="highlight swift"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">import</span> AuthenticationServices</div><div class="line"><span class="keyword">guard</span> <span class="keyword">let</span> oauthURL = <span class="type">URL</span>(string: <span class="string">"https://www.example.com/oauth/..."</span>) <span class="keyword">else</span> &#123;</div><div class="line"><span class="keyword">return</span></div><div class="line">&#125;</div><div class="line"><span class="keyword">self</span>.authenticationSession = <span class="type">ASWebAuthenticationSession</span>(url: oauthURL, callbackURLScheme:</div><div class="line"><span class="literal">nil</span>) &#123; (callbackURL, error) <span class="keyword">in</span></div><div class="line"><span class="keyword">guard</span> error == <span class="literal">nil</span>, <span class="keyword">let</span> callbackURL = callbackURL <span class="keyword">else</span> &#123;</div><div class="line">&#125;</div><div class="line"><span class="comment">// Process error.</span></div><div class="line"><span class="keyword">return</span></div><div class="line"><span class="comment">// Process token.</span></div><div class="line">&#125;</div><div class="line"><span class="keyword">self</span>.authenticationSession.start()</div></pre></td></tr></table></figure></p><h2 id="New-password-management-features-密码管理新功能"><a href="#New-password-management-features-密码管理新功能" class="headerlink" title="New password management features 密码管理新功能"></a>New password management features 密码管理新功能</h2><p>iCloud Keychain Password Manager 中带了了一些与密码管理有关的新功能。如：通过询问 Siri 密码自动跳转到密码查看页以快速查看、密码内容支持通过 AirDrop 分享给他人、iOS 12 与 macOS Mojave 中的密码查看列表界面也经过了重新的设计、以及对在多个网站中使用相同密码的情况给予用户警告、tvOS 应用可以通过附近的 iOS 设备完成自动密码输入。</p><h2 id="Summary-总结"><a href="#Summary-总结" class="headerlink" title="Summary 总结"></a>Summary 总结</h2><p>在 iOS 12 与 macOS Mojave 中提供的这些密码相关功能非常强大，尽管许多功能可能能够自动适配工作，我们仍需要测试自己的 app 来保证良好兼容。<br>同时，联想到近两天再次频繁爆出的国内大网站被脱裤的消息，开发者对安全问题都应该更加重视。适配 Automatic Strong Passwords 相比其他 feature 来说适配工作量并不会非常多，但能够非常明显的提升用户操作的连贯体验与安全性。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;a href=&quot;https://developer.apple.com/videos/play/wwdc2018/204/&quot;&gt;WWDC18 - Session 204&lt;/a&gt; 笔记 &lt;/p&gt;
&lt;p&gt;在 iOS 12 中，Apple 将自动建议与使用强唯一密码的功能带入了 App 内，通过 QuickType bar 大幅简化了用户设置账户与登陆的繁琐操作。本 session 介绍了如何优化应用如何适配密码、安全码和其他自动填充功能，带给用户更安全与无缝的体验。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.roczhang.com/images/wwdc18-notes-automatic-strong-passwords/1.png&quot; alt=&quot;cover&quot;&gt; &lt;/p&gt;
    
    </summary>
    
      <category term="Code" scheme="http://www.roczhang.com/categories/Code/"/>
    
    
  </entry>
  
  <entry>
    <title>WWDC18 Notes - What&#39;s New in Cocoa Touch</title>
    <link href="http://www.roczhang.com/wwdc18-notes-what-is-new-in-cocoa-touch.html"/>
    <id>http://www.roczhang.com/wwdc18-notes-what-is-new-in-cocoa-touch.html</id>
    <published>2018-06-11T23:30:13.000Z</published>
    <updated>2018-11-10T07:02:11.562Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://developer.apple.com/videos/play/wwdc2018/202/" target="_blank" rel="external">WWDC18 - Session 202</a> 笔记<br><a id="more"></a></p><p>在 iOS 12 中，Apple 进一步增强了 Cocoa Touch 框架，着重提高了应用的性能表现，同时也带来了不少新功能。在 What’s New in Cocoa Touch 中，对性能上的最佳实践、安全改进、多尺寸与形状屏幕的适配工具、用于 iMessage Apps 的新 API、Siri Shortcuts 以及 Swift 优化等方面进行了概括介绍。</p><h2 id="Framework-Updates"><a href="#Framework-Updates" class="headerlink" title="Framework Updates"></a>Framework Updates</h2><h3 id="Performance"><a href="#Performance" class="headerlink" title="Performance"></a>Performance</h3><p>此 Session 中主要通过 Scrolling、Memory 以及 Auto Layout 三个方面介绍了 iOS 12 中的性能改进。</p><h4 id="Scrolling"><a href="#Scrolling" class="headerlink" title="Scrolling"></a>Scrolling</h4><p>首先通过 UITableView 举例，介绍 UIKit 中滑动加载的常见流程：</p><ul><li>在 <code>UITableViewDataSource</code> <code>cellForRowAt</code> 方法中，重用或新初始一个 cell。</li><li>使用模型数据中的内容来填充此 cell 。</li><li>系统在 cell 上调用 <code>layoutSubviews</code> 方法，对 cell 中的内容进行布局。</li><li>系统在 cell 上调用 <code>draw</code> 方法。</li></ul><p>以上所有这些事务都必须在一次刷新间隔中完成，才能够保证流畅的滚动不掉帧。在 120 Hz 的 iPad Pro 上，间隔时间更短，所以需要尽可能快速的完成这些工作。在 iOS 10 中，UIKit 引入了 <code>UITableViewDataSourcePrefetching Protocol</code> 预加载，实现 <code>prefetchRowsAt</code> 方法之后，就能够提前在后台进行数据准备工作以提升性能表现，但加载当前 cell与预加载将来要显示的数据会同时发生。而在 iOS 12 中，将预加载工作放在了加载 cell 完成之后进行，如下图所示。<br><img src="https://www.roczhang.com/images/wwdc18-notes-what-is-new-in-cocoa-touch/1.png" alt="Markdown preferences pane"><br>同时，在先前的版本中，从简单开销小的内容滑动到复杂开销大的内容时，由于 CPU 性能调度器进行调度需要时间，因此可能会造成卡顿。而在 iOS 12 中，会更加智能的进行 CPU 调度，由上层 UIKit 通知 CPU 准备调度，预先估算在 deadline 之前需要多少 CPU 性能来满足需求，进一步提升滑动流畅度。这些改进都无需开发者做额外的适配工作即可获得性能提升，但开发者仍应尽可能控制并减少开销时间。 </p><h4 id="Memory"><a href="#Memory" class="headerlink" title="Memory"></a>Memory</h4><p>关注内存的原因在于 Memory Is Performance。当应用发出较大的内存请求而处于 Free 状态的内存不够时，系统就需要从其他 App 与系统使用的内存中挪出部分试图满足需求。但腾出其他 App 占用的内存并不代表对自己的 App 没有影响，内核需要做很多工作花费 CPU 时间来准备出需要的内存，因此需要花费时间进行等待。减少内存占用有很多方法，但 iOS 12 中带来了一项新技术 - Automatic Backing Store。根据图像中的信息自动减少色彩位深度以减少内存占用。<br><img src="https://www.roczhang.com/images/wwdc18-notes-what-is-new-in-cocoa-touch/2.png" alt="Markdown preferences pane"><br>在 iOS 12 中，<code>UIView.draw()</code>、<code>UIGraphicsImageRenderer</code>以及<code>UIGraphicsImageRendererFormat.Range</code>会默认启用。在 <a href="https://developer.apple.com/videos/play/wwdc2018/219/" target="_blank" rel="external">Session 219 - Image and Graphics Best Practices</a> 中，Apple 详细介绍了 Automatic Backing Store 的内容。</p><h4 id="Auto-Layout"><a href="#Auto-Layout" class="headerlink" title="Auto Layout"></a>Auto Layout</h4><p>在 iOS 12 中，Auto Layout 有了巨大的变化，在默认情况下都会变得更快。在处理较基础的独立同层视图布局约束时，在原先随视图数量计算耗时线性增长的基础上进一步减小了耗时。而在计算相互依赖的同层视图布局约束、嵌套的视图布局约束时，iOS 12 将原先随视图数量计算耗时指数级增长优化至了线性增长。如下图所示：<br><img src="https://www.roczhang.com/images/wwdc18-notes-what-is-new-in-cocoa-touch/3.png" alt="Markdown preferences pane"><br>在 <a href="https://developer.apple.com/videos/play/wwdc2018/220/" target="_blank" rel="external">Session 220 - High Performance Auto Layout</a> 中对此做了更详细的介绍。</p><h3 id="Swiftification"><a href="#Swiftification" class="headerlink" title="Swiftification"></a>Swiftification</h3><p>在 Swift 4.2 中，让 UIKit 进一步 Swift 化，通过嵌套 Types/Constants/Functions，让 Swift 味更浓，用起来感觉更自然。如下：  </p><ul><li>Nested Constants:<ol><li>将 <code>enum UIApplicationState</code> 嵌套至了 <code>class UIApplication</code> 中。</li><li>将 <code>enum UITabBarItemPositioning</code> 嵌套至了 <code>class UITabBar</code> 中。</li></ol></li><li>Nested Constants:<ol><li>将 <code>NSNotification/Name/didChangeStatusBarOrientation</code>、全局常量 <code>UIApplicationStatusBarOrientationUserInfoKey</code> 移至了 <code>class UIApplication</code> 中。</li><li>将 <code>UIFloatRangeZero</code>、<code>UIFloatRangeInfinite</code> 移至了 <code>struct UIFloatRange</code> 中。</li></ol></li><li>Nested Functions:<ol><li><code>UIEdgeInsetsInsetRect(originalRect, insets)</code> -&gt; <code>originalRect.insetBy(insets)</code>。</li><li><code>UIImagePNGRepresentation(image)</code> -&gt; <code>image.pngData()</code>。</li><li>Codable Type 支持: <code>NSStringFrom[CGPoint, CGRect, CGSize, CGVector, CGAffineTransform, UIEdgeInsets, UIOffset] / [CGPoint, CGRect, CGSize, CGVector, CGAffineTransform, UIEdgeInsets, UIOffset]FromString</code> -&gt; <code>JSONEncoder().encode(CGPoint(x: 0, y: 0)) / JSONDecoder().decode(CGPoint.self, from: encoded) / NSCoder.string(for: CGPoint(x: 0, y: 0)) / NSCoder.cgPoint(for: encoded)</code>。</li></ol></li></ul><h3 id="NSSecureCoding"><a href="#NSSecureCoding" class="headerlink" title="NSSecureCoding"></a>NSSecureCoding</h3><p>新增默认安全编码与解码，老的 API 现在为 <code>deprecated</code>。<br>关于此部分，详细可见 <a href="https://developer.apple.com/videos/play/wwdc2018/222/" target="_blank" rel="external">Session 222 - Data You Can Trust</a>。</p><h2 id="API-Enhancements"><a href="#API-Enhancements" class="headerlink" title="API Enhancements"></a>API Enhancements</h2><h3 id="Notifications"><a href="#Notifications" class="headerlink" title="Notifications"></a>Notifications</h3><p>iOS 12 中对消息通知也做出了较大的改进，主要体现在以下三方面：</p><ul><li>Interaction<br>自定义的通知界面中，允许添加使用自定义的交互，而不在限定于预先定义的动作。</li><li>Grouping<br>分组通知。默认即会使用分组通知，将同一个 App 的通知集合到一个组中。同时也可以设定自己 App 通知消息分组的规则。</li><li>Settings<br>在 iOS 12 中，可以在通知页让用户设置是否开启或关闭消息推送。<br>关于通知部分的详情，可见 <a href="https://developer.apple.com/videos/play/wwdc2018/710/" target="_blank" rel="external">Session 710 - What’s New in User Notifications</a> 与 <a href="https://developer.apple.com/videos/play/wwdc2018/711/" target="_blank" rel="external">Session 711 - Using Grouped Notifications</a>。</li></ul><h3 id="Messages"><a href="#Messages" class="headerlink" title="Messages"></a>Messages</h3><p>在 iOS 12 中，可以将 Message 贴纸置入到 Camera 中。在 Info.plist 中可添加新的 key：<br><figure class="highlight swift"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">&lt;key&gt;<span class="type">MSSupportedPresentationContexts</span>&lt;/key&gt;</div><div class="line">&lt;array&gt;</div><div class="line">&lt;string&gt;<span class="type">MSMessagesAppPresentationContextMessages</span>&lt;/string&gt;</div><div class="line">&lt;string&gt;<span class="type">MSMessagesAppPresentationContextMedia</span>&lt;/string&gt;</div><div class="line">&lt;/array&gt;</div></pre></td></tr></table></figure></p><h3 id="Automatic-Passwords-and-Security-Code-AutoFill"><a href="#Automatic-Passwords-and-Security-Code-AutoFill" class="headerlink" title="Automatic Passwords and Security Code AutoFill"></a>Automatic Passwords and Security Code AutoFill</h3><p>在 iOS 11 中，引入了自动输入密码功能，可以在 App 内快速输入已在 iCloud Keychain 中存储的密码。在 iOS 12 中，此功能做了进一步的改进，可以在 App 内保存密码到 iCloud Keychain，同时也可以在 App 给使用自动生成强密码功能。并且，如果应用后端对密码的格式有要求，也可以指定这些要求从而保证自动生成的密码符合规则。同时，iOS 12 中也带来了自动从信息中提取验证码，一键输入的功能。<br>关于自动密码与验证码输入详情，可见 <a href="https://developer.apple.com/videos/play/wwdc2018/204/" target="_blank" rel="external">Session 204 - Automatic Strong Passwords and Security Code AutoFill</a>。</p><h3 id="Safe-Area"><a href="#Safe-Area" class="headerlink" title="Safe Area"></a>Safe Area</h3><p>通过适配 SafeAreaInsets 来适配不同形状、大小与内容布局格式的界面。主讲人呼吁开发者尽快适配 SafeArea。详细可见 <a href="https://developer.apple.com/videos/play/wwdc2018/235/" target="_blank" rel="external">Session 235 - UIKit: Apps for Every Size and Shape</a>。</p><h2 id="Siri-shortcuts"><a href="#Siri-shortcuts" class="headerlink" title="Siri shortcuts"></a>Siri shortcuts</h2><p>Siri shortcuts 是 iOS 12 中带来的新功能。给 App 提供了在 Siri Suggestion 中展示信息、在 Apple Watch Siri 表盘中展示信息，定义出发 Siri shortcuts 语言关键词等能力。可以通过以下 API 来适配 Siri shortcut。</p><h3 id="NSUserActivity"><a href="#NSUserActivity" class="headerlink" title="NSUserActivity"></a>NSUserActivity</h3><p>与 Handoff 和 Spotlight 通用的 API。适合要在 App 中打开某些具体内容的情况。为 UserActivity 设置 <code>eligibleForPrediction = true</code>。</p><h3 id="Intents"><a href="#Intents" class="headerlink" title="Intents"></a>Intents</h3><p>提供最佳 shortcut 体验需要适配 intents，可以提供无需启动 app 即可运行、提供自定义的语音响应、自定义用户界面、定义预测场景等能力。<br>关于 Siri Shortcut 详情可见 <a href="https://developer.apple.com/videos/play/wwdc2018/211/" target="_blank" rel="external">Session 211 - Introduction to Siri Shortcuts</a> / <a href="https://developer.apple.com/videos/play/wwdc2018/214/" target="_blank" rel="external">Session 214 - Building for Voice with Siri Shortcuts</a> / <a href="https://developer.apple.com/videos/play/wwdc2018/217/" target="_blank" rel="external">Session 217 - Siri Shortcuts on the Siri Watch Face</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;a href=&quot;https://developer.apple.com/videos/play/wwdc2018/202/&quot;&gt;WWDC18 - Session 202&lt;/a&gt; 笔记&lt;br&gt;
    
    </summary>
    
      <category term="Code" scheme="http://www.roczhang.com/categories/Code/"/>
    
    
  </entry>
  
  <entry>
    <title>App Architecture 笔记 - 2</title>
    <link href="http://www.roczhang.com/app-architecture-notes-2.html"/>
    <id>http://www.roczhang.com/app-architecture-notes-2.html</id>
    <published>2018-05-30T12:10:41.000Z</published>
    <updated>2018-11-10T07:02:11.561Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://www.objc.io/books/app-architecture/" target="_blank" rel="external">App Architecture</a> 读书笔记<br>第二章 Overview of Application Design Patterns<br><a id="more"></a></p><p>第一篇：<a href="https://www.roczhang.com/app-architecture-notes-1.html">App Architecture 笔记 - 1 Introduction</a><br>第二篇：<a href="https://www.roczhang.com/app-architecture-notes-2.html">App Architecture 笔记 - 2 Overview, MVC/MVVM-C</a></p><h2 id="Model-View-Controller"><a href="#Model-View-Controller" class="headerlink" title="Model-View-Controller"></a>Model-View-Controller</h2><h3 id="Overview"><a href="#Overview" class="headerlink" title="Overview"></a>Overview</h3><ul><li>少数的 controller 对象负责处理所有 model 层与 view 层之外的任务，包括：<ol><li>收集所有 view actions</li><li>处理所有交互逻辑</li><li>分发 model actions</li><li>收集所有 model notifications</li><li>准备所有用于展示的数据</li><li>将变更应用到视图 </li></ol></li><li>依赖：<ol><li>view / model 不在代码中直接引用 controller</li><li>controller 实例知道 view / model 的接口以及连接对象</li></ol></li></ul><h3 id="5-Tasks"><a href="#5-Tasks" class="headerlink" title="5 Tasks"></a>5 Tasks</h3><ul><li>Construction:<ol><li>构建顶层 view controllers -&gt; 加载与配置 view，及要展示的 model 数据</li><li>controllers 创建并持有模型层，或使用懒加载的单例访问模型</li><li>与视图有关的模型对象缓存在控制器中 </li></ol></li><li>Updating the Model:<ol><li>MVC 中 controller 通常使用 target/action、delegate 等方式来接收 view events</li><li>当 view events 到来时，控制器改变期内部的状态、更改模型或直接改变视图层级结构 </li></ol></li><li>Chaning the View:<ol><li>控制器订阅 model notifications，当 model notifications 到达时，controller 去改变视图层级结构，以使数据能够单向流动 </li></ol></li><li>View State:<ol><li>View State 按需被存在 view 或 controller 中</li><li>影响 view 或 contrller 状态的 view action 不要求通过 model 传递 </li></ol></li><li>Testing:<ol><li>MVC 中，由于 controllers 与其他组件间需紧密结合，缺乏边界，导致很难编写单元/接口测试</li><li>集成测试可行。在测试中构建 view/model/controller 间的连接部分，测试逻辑与组件间的连接 </li></ol></li></ul><h3 id="Importance-of-Model-View-Controller"><a href="#Importance-of-Model-View-Controller" class="headerlink" title="Importance of Model-View-Controller"></a>Importance of Model-View-Controller</h3><ul><li>系统中默认的设计模式</li><li>MVC 的相对自由是的多种变体模式都能被整合进其中</li><li>历史：<ol><li>MVC 首次被用在 1979 年，Smalltalk-76 中。</li><li>原始公式中，视图直接被附给 model 对象，控制器仅用于捕获事件与转发给对象</li><li>原始 Smalltalk 对 MVC 实现中，持续下来的理念是 view 层与 model 层应当分离  </li></ol></li></ul><p><br></p><h2 id="Model-View-ViewModel-Coordinator"><a href="#Model-View-ViewModel-Coordinator" class="headerlink" title="Model-View-ViewModel+Coordinator"></a>Model-View-ViewModel+Coordinator</h2><h3 id="Overview-1"><a href="#Overview-1" class="headerlink" title="Overview"></a>Overview</h3><ul><li>与 MVC 相同，都围绕一个 scene（视图层级结构中的一个子视图场景）来构建</li><li>每个 scene 使用一个 view-model 来描述场景中展示与交互的逻辑用于描述 view 上要展示值的属性，这些值从底层模型中经过一系列转化得来，可被直接用于视图</li><li>通过绑定确保发生变化后视图可及时展示</li><li>响应式是用于表达这种类型与转换的工具，天然适合 MVVM</li><li>对 view 层级没有直接引用使得 view-model能脱离框架方便测试</li><li>MVVM-C 中，使用 coordinator 协调器来负责场景间转换的逻辑。coordinator 持有对模型层的引用，并了解视图控制器树，因此它可为每个场景提供其所需要的 model 对象与 view-model</li><li>与 MVC 不同，MVVM-C 中试图控制器间不直接引用其他控制器，而是通知 coordinator 有关的 view actions，让 coordinator 来展示新 VC 与设置模型数据，相当于用 coordinator 来管理 tree</li><li>View Controller 不再有内部的 view state，而将其移动到 view-model 中，使得 VC 原始的双重身份（A，作为视图层级结构的一部分 / B，调解 view 与 model 间交互）减少到单层（单纯作为视图层级结构一部分），同时，coordinator 负责了 VC 的另一个工作，展示出其他 VC</li></ul><h3 id="5-Tasks-1"><a href="#5-Tasks-1" class="headerlink" title="5 Tasks"></a>5 Tasks</h3><ul><li>Construction:<ol><li>单独的模型对象，交由 view-model 持有而不再是 view controllers</li><li>与 MVC 不同，VC 不再直接获取或准备数据，而是在构建时创建 view-model，并将 view 绑定到 view-model 暴露出的相关属性上</li></ol></li><li>Updating the Model:<ol><li>与 MVC 不同，当 view event 到达后，VC 不改变其内部状态，而是调用 view-model 上的方法，由 view-model 改变其内部状态或模型</li></ol></li><li>Chaning the View:<ol><li>与 MVC 不同为，VC 不观察模型，view-model 观察模型，并将 model notifications 进行转化</li><li>VC 观察 view-model（通常通过响应式），当 view-model 事件到来，VC 改变其视图层级结构</li></ol></li><li>View State:<ol><li>视图状态在 view 中或 view-model 中</li><li>与 MVC 不同，VC 中不含任何 view state，controller 观察 view-model 的 view state 变化 </li></ol></li><li>Testing:<ol><li>由于 view-model 与 view 层和 controller 层解耦，view-model 可进行接口测试而不是 MVC 中的集成测试</li><li>为使接口测试尽可能多的覆盖，VC 需要尽量保持简洁</li></ol></li></ul><h3 id="Importance-of-Model-View-Controller-1"><a href="#Importance-of-Model-View-Controller-1" class="headerlink" title="Importance of Model-View-Controller"></a>Importance of Model-View-Controller</h3><ul><li>MVVM 与 MVC 最大区别在于使用响应式将 view-model 中的状态表达成一系列转换和依赖关系，清晰地描述出模型与要展示值之间的关系，可以让人更好的理解 app 中的依赖关系</li><li>使用 coordinator 来管理 VC 层级的概念非常重要。coordinator 不与 MVVM 直接绑定，因此也可以用在 MVC 等其他模式中</li><li>历史:<ol><li>MVVM 由 Ken Cooper 和 Ted Peters 指定（他们在微软参与开发 WPF）</li><li>WPF 中使用一种叫做 XAML 的基于 XML 的声明式语言来描述视图绑定到 view-model 上的属性</li><li>Cocoa 中没有 XAML，所以需要使用如 RxSwift 之类的框架来执行 view-model 与 view 间的绑定</li><li>iOS 中的 coordinator 概念由 Soroush Khanlou 2015 年在其网站上提出</li></ol></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;a href=&quot;https://www.objc.io/books/app-architecture/&quot;&gt;App Architecture&lt;/a&gt; 读书笔记&lt;br&gt;第二章 Overview of Application Design Patterns&lt;br&gt;
    
    </summary>
    
      <category term="Code" scheme="http://www.roczhang.com/categories/Code/"/>
    
    
  </entry>
  
  <entry>
    <title>App Architecture 笔记 - 1</title>
    <link href="http://www.roczhang.com/app-architecture-notes-1.html"/>
    <id>http://www.roczhang.com/app-architecture-notes-1.html</id>
    <published>2018-05-20T03:21:35.000Z</published>
    <updated>2018-11-10T07:02:11.560Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://www.objc.io/books/app-architecture/" target="_blank" rel="external">App Architecture</a> 读书笔记<br>第一章 Introduction<br><a id="more"></a></p><h2 id="About"><a href="#About" class="headerlink" title="About"></a>About</h2><ul><li>此书会讨论五种设计模式:<ol><li>MVC: Model-View-Controller </li><li>MVVM-C: Model-View-ViewModel-Coordinator</li><li>MVC+VS: Model-View-Controller-ViewState</li><li>MAVB: ModelAdapter-ViewBinder</li><li>TEA: The Elm Architecture</li></ol></li><li>此书的 Demo 是一个 Recording App，在 GitHub 上。</li></ul><h2 id="Application-Architecture"><a href="#Application-Architecture" class="headerlink" title="Application Architecture"></a>Application Architecture</h2><ul><li>Application architecture 关注的方面包含：<ol><li>组件如何被构建；</li><li>事件流如何在层级中传递；</li><li>组件间是否应有编译期或运行期的相互引用；</li><li>不同的组件中数据应如何被读取或变更；</li><li>状态变更后应在整个应用结构中用怎样的路径来处理。</li></ol></li></ul><h2 id="Model-and-View"><a href="#Model-and-View" class="headerlink" title="Model and View"></a>Model and View</h2><ul><li>分类层 Categories Layer:<ol><li>应用架构在最高层上看，是把不同的应用组件分离到不同的分类层中;</li><li>一个分类层便是一个包含代码和接口的集合，他们都能够遵循一定的规则并且职责相似;</li><li>最常见的分类层就是模型层与视图层。</li></ol></li><li>模型层 Model Layer:<ol><li>对应用内容的抽象；</li><li>不依赖于任何应用框架；</li><li>通常包含模型对象对协调对象。</li></ol></li><li>视图层 View Layer:<ol><li>依赖于应用框架；</li><li>将模型层可视化，可交互化；</li><li>通常直接使用 UIKit（也可能使用 SceneKit / OpenGL 等）。</li></ol></li><li>Why Are the Categories of Model and View Considered So Fundamental?<ol><li>保持模型层整洁，及不受应用框架底层实现的影响；</li><li>方便讲模型层运用到当前应用之外，如运行测试、用不同的框架重写视图层、移植到其他系统平台等。</li></ol></li></ul><h2 id="Applications-Are-a-Feedback-Loop"><a href="#Applications-Are-a-Feedback-Loop" class="headerlink" title="Applications Are a Feedback Loop"></a>Applications Are a Feedback Loop</h2><ul><li>应用设计模式的挑战在于如何处理如试图层与模型层之间的通信、依赖与转换。</li><li>View Action: 由视图触发，用于响应用户驱动的事件。发送给 Model Layer 时，View Action 可能会被转换成 Model Action，这种转换被叫做 Interaction Logic。</li><li>Model Update: 模型对象更新后通常会产生一个通知，此通知将触发视图层的更新。通知可以使用多种形式，如 Foundation Notification、Delegates、Callback 等。这种由 Model Notification 转换到视图的变化被称为 Presentation Logic。</li><li>当所有状态都放在模型层中，并且所有变化都遵循上述的完整反馈路径环时，被称为单向数据流。</li></ul><h2 id="Architectural-Technologies"><a href="#Architectural-Technologies" class="headerlink" title="Architectural Technologies"></a>Architectural Technologies</h2><ul><li>实现架构的工具技术:<ol><li>Notification 广播：单个源的变化 -&gt; 0到多个监听者；</li><li>KVO：将一个对象上属性的变化告知给另一个对象；</li><li>响应式：重点在于关注从源到目标间的转换，允许将逻辑运用到转换中。</li></ol></li><li>双向绑定:<ol><li>Cocoa Bindings 是双向绑定。被观察者同时也是观察者，会建立反向连接；</li><li>本书仅讨论单向绑定。</li></ol></li></ul><h2 id="Application-Tasks"><a href="#Application-Tasks" class="headerlink" title="Application Tasks"></a>Application Tasks</h2><ul><li>五类任务：<ol><li>构建：谁来构建模型与视图，谁来连接；</li><li>更新：如何处理 View Actions；</li><li>改变视图：如何将模型数据应用到视图上；</li><li>视图状态：如何处理 Navigation 与其他非模型状态；</li><li>测试：使用怎样的测试策略来达到合理的测试覆盖率。</li></ol></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;a href=&quot;https://www.objc.io/books/app-architecture/&quot;&gt;App Architecture&lt;/a&gt; 读书笔记&lt;br&gt;第一章 Introduction&lt;br&gt;
    
    </summary>
    
      <category term="Code" scheme="http://www.roczhang.com/categories/Code/"/>
    
    
  </entry>
  
  <entry>
    <title>Go For WWDC18 - 1</title>
    <link href="http://www.roczhang.com/go-for-wwdc18-1.html"/>
    <id>http://www.roczhang.com/go-for-wwdc18-1.html</id>
    <published>2018-05-17T14:35:15.000Z</published>
    <updated>2018-11-10T07:02:11.561Z</updated>
    
    <content type="html"><![CDATA[<p>准备篇：签证与行程</p><a id="more"></a><p><img src="http://www.roczhang.com/images/go-for-wwdc18-1/1.jpg" alt="Markdown preferences pane"></p><h3 id="起因"><a href="#起因" class="headerlink" title="起因"></a>起因</h3><p>四月还在学校完成毕业答辩时接到公司电话，得知有可以去 WWDC 的机会。而后面非常幸运的，我的 scholarship 没有中。一番纠结之后还是决定 – 去吧！</p><p>今年 WWDC 的时间在 6 月 4 日 ～ 8 日，离程序上最后毕业的时间也不远。所以也可以把第一次参加 WWDC 当作自己的毕业旅行，后面想起来应该会很有趣。</p><h3 id="签证"><a href="#签证" class="headerlink" title="签证"></a>签证</h3><p>决定之后就开始准备办理各类手续。由于之前已经办好了护照，所以当务之急就是办理签证。办签证前后需要准备的手续还是挺多的，最重要的应该就是填写 DS-160 表了。填表需要上传白底彩色特定大小的照片，因此没有的话需要去照相并索取电子档。表中的要填的内容很多，并且很多时候填表网站的速度不是很稳定，所以填写完成需要挺长一段时间。完成提交之后便需要交办理签证的费用，使用中信银行在线缴费即可。缴费完成之后便可以预约去大使馆面签的时间，一般似乎可以预约到 1～2 周之后的时间。在这段时间里就可以准备各类面签用的文件。网站说明指出面签时需要携带护照/DS-160 确认页/缴费预约确认单，以及其他支持性文件。  </p><p>由于之前在群里看到拒签似乎并不是少见的事，所以自己准备了很多材料。先后找 Apple 申请 VISA LETTER 的 HARD COPY，让家里帮忙复印了一些证件与证明，又摆脱了学校的好友找学校老师开具了在读证明、成绩单等证明，之后找公司开了实习证明、介绍信、三方、Offer 纸质版，最后又准备了机票确认单，英文简历，去招行打印了半年的流水。我的面试约在了两周后，Apple 的 VISA LETTER 大概在申请的一周后寄到了手上。之后便带着厚厚的一沓文件去面签了。 </p><p>由于之前了解到面签不能带电子设备等等，而自己又不想去寄存包裹，于是当天中午我就把手机之类都留在了公司，带着文件袋直接坐到南京西路站。本非常自信的以为出了站一定能够马上通过排队的人群找到地点，但事实是完全找不到。虽然距离地铁站不远，但只是摸到梅陇镇广场就先后问了几次路人，最后又绕了一圈才找到排队的地方。中午外面排队的人并不多，所以直接看了预约确认领了牌，就直接上了8楼。楼上在等待办理的人还是很多，采集了指纹之后排队等了很久。采集指纹和面谈的办公人员都是外国人。排队时正看到前面在面试的人先后出示了很多文件，最后还是被退回护照的场景。 </p><p>我的面试对话大概如下：</p><ul><li>VO: 去美国的目的？</li><li>ME: 参加 WWDC 开发者大会。</li><li>VO: 有邀请函吗？</li><li>ME: 有的。（递上邀请函）</li><li>VO: 为什么要去？</li><li>ME: 了解最新的技术，和其他开发者交流。</li><li>VO: ZHENG HAO TIAN 是谁？</li><li>ME: 我的同行人，他也是开发者。</li><li>VO: What will they have in this conference?（突然变成英文）</li><li>ME: They will have some sessions about the latest iOS, macOS technologies.</li><li>VO: OK. (沉默打字了一小段时间)</li><li>VO: Have a nice trip.</li><li>ME: (不确定)我通过了吗？</li><li>VO: Yeah, Yeah, 通过了。</li></ul><p>面试全程大概五分钟。 </p><p>虽然自己并没有被要求查看其他的材料，但并不后悔准备这些材料，因为一旦需要某些材料没有准备，往往还要花费比准备材料更多的精力弥补。 </p><p>面试完成之后查询了签证的状态，一开始是 Administrative Processing。在网上搜索了一下再次被吓到，各种条目说 AP 代表行政审查，可能会花费数周甚至数月的时间进行审核。后来才知道似乎所有的签证面签后都会经历 AP 的过程，代表正常的行程处理流程，只有 AP 时间非常长时才有可能是遇到了额外审核。状态变更到 issued 之后大概两天就拿到了寄过来的护照。之后还需要的一步便是在 EVUS 上进行登记。</p><h3 id="行程"><a href="#行程" class="headerlink" title="行程"></a>行程</h3><p>原本准备租用 WiFi 的我们考虑到在当地游览时应该会经常使用 Uber 所以可能需要接听司机电话，还是决定买电话卡。稍微查看了一下（<a href="https://www.whistleout.com/CellPhones/Guides/Best-Cell-Phone-Plans-and-Carriers-in-San-Jose" target="_blank" rel="external">比如这篇文章</a>)，在 San Jose 应该 AT&amp;T 的信号比较好，于是决定购买短期 AT&amp;T 无限制电话卡。行程上定了 6 月 2 号从上海飞到 Los Angeles，再由 Los Angeles 到 San Jose 的航班。住所也提前在 Airbnb 上做好了预定。除去还需要兑换少量现金应该也不用在其他方面做特别准备了。 </p><p>想起这个去年 WWDC 时和各位一起讨论的 Telegram Group：<a href="https://t.me/joinchat/CVYFGkPXZUzr3MkgoFbMOg" target="_blank" rel="external">Mr.Weather Friends</a>，希望今年还可以和大家一起聊天！ </p><p>离出发还剩 15 天！非常期待第一次 WWDC 之旅了！ </p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;准备篇：签证与行程&lt;/p&gt;
    
    </summary>
    
      <category term="Life" scheme="http://www.roczhang.com/categories/Life/"/>
    
    
  </entry>
  
  <entry>
    <title>2018.04.18</title>
    <link href="http://www.roczhang.com/20180418.html"/>
    <id>http://www.roczhang.com/20180418.html</id>
    <published>2018-04-18T13:05:15.000Z</published>
    <updated>2018-11-10T07:02:11.559Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://www.roczhang.com/images/20180418/01.jpg" alt="Markdown preferences pane"></p><p>临近毕业了。一期一会，世当珍惜。 </p><a id="more"></a><p>‘I thought of all of the time passing by.’ - No One But You</p><iframe src="https://open.spotify.com/embed/track/4ae9ASpdH2cpz3aX1TJvsA" width="100%" height="80" frameborder="0" allowtransparency="true" allow="encrypted-media"></iframe><h3 id="Updates"><a href="#Updates" class="headerlink" title="Updates"></a>Updates</h3><p>上周匆匆忙忙完成了毕业设计和论文，写的是一个最简单的 TensorFlow 模型训练然后应用到 iOS 的 App 里。周五回了学校，答辩还算顺利，后续应该只用提交二次查重再打印成册就完成了。但还有一篇双学位的论文没有写，有些头疼。六月领毕业证，所以理论上还剩最后两个月的学生身份。 </p><p>4 月初提交了 Swift Playground 申请 WWDC Scholarship。实际上今年比去年还没有信心，但毕竟这是最后一次机会了，不再试一次总感觉自己以后会后悔。今年总是感觉比去年穷很多，实习工资加上卖 App 的收入基本每个月还是没有结余。如果 Scholarship 没抽中，公司有一个去 WWDC 的机会，但由于目前自己依然是实习生的身份所以不能完全报销。自己是非常想去，然而 3 万块对我现在都是 unaffordable 的状态，实在是有点纠结和伤感了。 </p><p>从去年 10 月来流利说到现在不知不觉就已经半年过去了。公司两周一版本的迭代节奏还是挺快的，但和同事相处的都挺愉快，自己的个人生活节奏也比去年稳定了很多。回顾自己技术有进步，但日常工作外的整理和输出还是太少了。</p><p>买了 Spotify Premium 之后发现自己近期听歌的口味有变化，居然开始喜欢 Stayin’ Alive 这类复古的 Disco 了… 最近看了黑豹和头号玩家，黑豹除了感觉衣服挺骚气没觉得很好看。但头号玩家看了第一遍之后没忍住又去看了一遍 IMAX 版本。看完之后总会有一种从盛大的梦境中醒来的感觉，上一次看你的名字时也有这种感觉。如果说只有少年才是有梦的那这种梦就是想象力吧。Silicon Valley S5 开播了，E4 里借 Jian Yang 黑中国互联网加上最后的 BGM 实在是黑的太妙了。</p><h3 id="Apps"><a href="#Apps" class="headerlink" title="Apps"></a>Apps</h3><p><a href="https://itunes.apple.com/cn/app/adonis/id1281626299?l=en&amp;mt=8" target="_blank" rel="external">Adonis</a> 上架到现在大概卖了几千份，并不算好。我也看到了 Adonis 上存在的一些问题，只能逐渐演进。 </p><p><a href="https://itunes.apple.com/cn/app/mr-weather/id1198461086?l=en&amp;mt=8" target="_blank" rel="external">Mr.Weather</a> 去年 5 月份上架，到现在已经有几万的用户，而且虽然很久没有更新，每天还是有挺稳定的增长。我觉得 Mr.Weather 上还有一些想做但没实现的，所以几个月前开始设计 Mr.Weather 2，开发进度比较慢，但争取在今年 5 月 Mr.Weather 上架一周年的时候发布新版本。想了想可能会使用年订阅的方式。剧透一下 Mr.Weather 2: </p><p><img src="http://www.roczhang.com/images/20180418/02.png" alt="Markdown preferences pane"></p><p><a href="https://itunes.apple.com/cn/app/year-timer/id1359786804?l=en&amp;mt=8" target="_blank" rel="external">Year Timer</a> 属于写着好玩的类型吧，本身只花了半天的开发时间，上架之后也没有做任何宣传什么，只是满足个人的一个小需求。</p><p>至此就有三个已经上架的个人 App 了。之前建了一个 <a href="https://join.slack.com/t/roczhang/shared_invite/enQtMjgwMDQ5NjM5NDg4LWIxMTQzNmU1NmZkZmUxMDY0Y2ZhYjE4ZDI5M2ZiYTkxMjVmM2E5ZTkyYWNhMTVmMTg2ZjFhNzU0MTY4YzRhZjA" target="_blank" rel="external">Slack Group</a>，三个 app 在 group 里都有独立的 channel。我无法肯定这些 App 本身的价值，但这是我个人想法的延伸与表达的方式。所以我觉得那些抄袭别人作品的实在没有任何意义，抄袭别人的自我表达反而代表着自己没有任何想法。</p><h3 id="Thoughts"><a href="#Thoughts" class="headerlink" title="Thoughts"></a>Thoughts</h3><p>回学校的时候和同学与朋友聊了挺多，基本是交换自己的现状，对离开学校有不舍和感伤。我当然也是有一些，但再次去往几处之前去过的地方，便发现自己怀念的并不是单纯的地点或人，只是怀念自己之前的这一段经历罢了。也发现对之前发生的让自己曾感到不爽的事情没有那么在意了，并没有什么必要去感到伤感或愤怒，关注自己收获到了什么就好。但还是提醒自己珍惜每一段经历，虽然有“要珍惜”这种念头本身就影响了全身心投入，而不算是纯粹的珍惜了。</p><p>感觉自己是一个挺矛盾的人。看不清未来的时候会很焦虑，看到未来可能没有变化的时候也会很焦虑。平常很少有可以倾诉个人想法的对象，因此独处会是自己绝大多数的处境。虽然这在大多数情况下不会是什么问题，但总会有想要倾诉分享的时候。所以只能观察自己，反思自己在矛盾中的选择。 </p><p>发现自己还有一个 Telegram 的 Channel，之前是为了 Mr.Weather 建立的，但显然当时还没有了解 Telegram Channel 的运作方式，所以后来 Mr.Weather 就迁移到 Group 和 Slack 上去了。但 Channel 这种只能广播无法回复的方式确实挺好的，所以把 Channel 改了名，会不定期分享自己的开发和境遇。欢迎关注：<a href="https://t.me/roczhangchannel" target="_blank" rel="external">https://t.me/roczhangchannel</a> 。</p><p>今天看到 Kevin 的博客，离开了多点去了青岛，实在非常钦佩。Kevin 哥很多时候给我了精神上的鼓舞，祝福 Kevin！</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://www.roczhang.com/images/20180418/01.jpg&quot; alt=&quot;Markdown preferences pane&quot;&gt;&lt;/p&gt;
&lt;p&gt;临近毕业了。一期一会，世当珍惜。 &lt;/p&gt;
    
    </summary>
    
      <category term="Life" scheme="http://www.roczhang.com/categories/Life/"/>
    
    
  </entry>
  
  <entry>
    <title>跨越大三</title>
    <link href="http://www.roczhang.com/%E8%B7%A8%E8%B6%8A%E5%A4%A7%E4%B8%89.html"/>
    <id>http://www.roczhang.com/跨越大三.html</id>
    <published>2017-11-25T16:37:26.000Z</published>
    <updated>2018-11-10T07:02:11.563Z</updated>
    
    <content type="html"><![CDATA[<p>大三早已结束了。对于名义上大四却已经实习了一个多月的我来说，大学生活好像真的已然过去了。</p><a id="more"></a><h3 id="16年7月-～-16年8月，实习"><a href="#16年7月-～-16年8月，实习" class="headerlink" title="16年7月 ～ 16年8月，实习"></a>16年7月 ～ 16年8月，实习</h3><p>距离上一次写生活日志已经过去一年多了，而上篇落笔时我还身处北京，体验第一次实习的各种新鲜感。并且不仅是实习，也是第一次见到如此多的在网络上 follow 已久的 stars 们。在多点的那个暑假非常开心，每天能和师傅、友才还有马老师一起工作，还可以和 JustZht、Cee 一起看电影吃饭，听 Kevin 说了很多人生经验。而更重要的是我看到了更优秀同行业的同龄人和前辈是如何工作和生活的。</p><h3 id="16年9月-～-16年11月，返校"><a href="#16年9月-～-16年11月，返校" class="headerlink" title="16年9月 ～ 16年11月，返校"></a>16年9月 ～ 16年11月，返校</h3><p>回到学校之后的日子渐渐平淡下来。而感激于 Kevin 给我继续远程工作的机会，得以给我每天平淡的校园生活以一些机会去做自己喜爱的事。记得有阵子每天晚上都会 coding 到凌晨，饿了就吃吐司面包，累了就看一看 B 站上的食彩之国。虽然有时候通宵 coding 完还要继续去上早上的课困到撑不出，但第一次有一种用力工作用力生活的感觉。而这一段时间也是我有史以来技术学习最快最积极的一段时间了。  </p><p>想起这段生活至今依然感到非常充实幸福，我感到非常幸运，真的很感谢 Kevin。</p><p>有了一份得以持续的实习工作，除了让我的精神生活得以充实之外，也让我第一次经济上更加独立了。搬出了在学校闹人的寝室，租住了学校旁的学生公寓，终于也有了一点独立的个人空间。</p><p>有阵子每天晚上我会一个人关掉所有灯听把音响开到最大反复听 Cornfield Chase，感觉自己好像虚无的飘在宇宙里，让我对未来的一切不确定都没那么恐慌了。</p><h3 id="16年12月-～-17年4月，前前前世和-WWDC"><a href="#16年12月-～-17年4月，前前前世和-WWDC" class="headerlink" title="16年12月 ～ 17年4月，前前前世和 WWDC"></a>16年12月 ～ 17年4月，前前前世和 WWDC</h3><p>十二月你的名字上线，追漫画不多的我感动到连刷两场，果然梦是只有少年才有的。期末结束去长沙见了小萌师傅，和师傅聊了一整天，听了些师傅对未来的打算。寒假回家见到了一些高中同学，他们也已经有了自己的规划，或是出国读研，或是选择考公务员。而自己已经意识到在学校的时间不多了，当时的我还对自己考不考研的事情依旧举棋不定。  </p><p>四月准备了一个音乐小游戏申请 WWDC 奖学金，虽然是第一次参与但自己却对此心生执念很久了。虽然最后没过，但看到一些冒泡排序可视化或者一个 collectionView 翻牌记忆都可以过，并且一个有 Apple iOS 俱乐部合作的学校就有几个人都过了的时候，实话说确实是有些不服气的。</p><h3 id="17年5月-～-17年6月，提前的毕业照和-Mr-Weather"><a href="#17年5月-～-17年6月，提前的毕业照和-Mr-Weather" class="headerlink" title="17年5月 ～ 17年6月，提前的毕业照和 Mr.Weather"></a>17年5月 ～ 17年6月，提前的毕业照和 Mr.Weather</h3><p>转眼五月，迎来了我院特色提前拍毕业照。穿上学士服想到马上就可以踏出校园的那一刻还是挺开心的，毕竟虽然不知道自己在学校算不算的上异类，我确实已经自己做自己的事太久了。并且长久以来自己在学校聊的来的朋友不多，看到其他同龄小伙伴在做各种精彩的事情总让我感到无可奈何，更早已开始让我期望自己能够去做自己喜爱的工作。此时我也开始放弃今年考研的打算，一方面是自己并不想在国内读研，因为咨询到不少朋友最后发现国内 CS 专业研究生似乎就是给导师打工，与其如此还不如去公司工作来积累经验。另一方面则是考虑到自己和自己家庭目前的情况，尤其是经济情况，似乎也并不允许。</p><p>而最后在学校的这段日子时间上也相对自由宽松，因此也得以做出了我的第一款个人应用 Mr.Weather，五月上架到了 AppStore。结果还是有些意外，得到了一些媒体的推荐，在 AppStore 上最高排到了国区天气免费榜 13 名，并且也因此认识了不少新朋友。当时每天早晨起床后第一件事就是打开邮箱查看用户发来的各类邮件，总让我能有一种被人认可的喜悦。</p><p>最后在学校的几周几乎每天都会和朋友骑车，也突然感觉这个被我吐槽了三年的城市好像也挺好的。</p><h3 id="17年7月，深圳香港"><a href="#17年7月，深圳香港" class="headerlink" title="17年7月，深圳香港"></a>17年7月，深圳香港</h3><p>七月回家带了一阵子之后去了深圳和香港。在港中大住了阵子，参与和体验了他们日常学习和工作的方式。而看到自己的同龄人在如此规范成熟的协作，也让我感到钦佩。<br>第一次来到大家都称赞开放的深圳，确实是到处充满了南方的气息，也顺带参与了一次 Swift <t> 沙龙。而对于香港我则是一直心有好感，一方面是小时候经常看 TVB 剧听粤语歌，另一方面则是香港的文化环境和社会制度的吸引。我羡慕香港的法治，羡慕香港在今天依然能够享有的那么一点小小自由。</t></p><h3 id="17年8月-～-17年9月，生命脆弱"><a href="#17年8月-～-17年9月，生命脆弱" class="headerlink" title="17年8月 ～ 17年9月，生命脆弱"></a>17年8月 ～ 17年9月，生命脆弱</h3><p>在深圳的时候得知姥姥病危，赶紧赶回家。看到之前每次回去都问我吃饱穿暖没有的姥姥躺在病床上连话都说不清的时候，心里非常难受。并且姥姥病情恶化的速度也超出所有人的想象，先后转院多次，姥姥却已经进入昏迷状态了。最后几天姥姥进了 ICU，我和家人坐在 ICU 和手术室中间的走廊，看着来来往往的病床推来推去，自己却又无可奈何，终于体会到“医院的墙不知听到了多少人的祷告”这句话的含义，而最后，姥姥还是走了。第一次在心智成熟之后面对生离死别，最后姥姥昏迷之后真的让我思考到底什么才能定义活着。想到之后姥姥再也不会坐在床上问我吃没吃饭呢，心情就会酸楚沉重起来。</p><h3 id="17年10月-～-现在"><a href="#17年10月-～-现在" class="headerlink" title="17年10月 ～ 现在"></a>17年10月 ～ 现在</h3><p>待家中事情办完，自己意识到该考虑校招的事情了。Mr.Weather 发布之后收到了一些 Offer，而面对校招自己还是想参与尝试一次的。也没有做什么别特的准备，做了一份简历，复习了一下算法 / 数据结构 / OC 方面的问题。但却发现一些公司的校招已经结束，而另一些校招笔试之后的进度又慢的离奇。最后还是在先拿到的几个 Offer 中决定去上海了，毕竟在家已经呆了挺久并且考虑到现在的经济状况也想去尽快工作。而新员工入职培训的时候，还接到了其他公司的电话，然而决定了就决定了。开始实习至今已经有一个多月了，每天十点上班八点下班的工作时间还是让我感觉挺累的，并且和去年相比，似乎少了一些兴奋，也许是因为去年实习时我意识到自己暑假结束后终究要回学校，也许是因为有 Kevin、小萌、马老师，而现在只有我一个人。<br>每天去掉工作、通勤、洗漱之外的时间，能留下给自己支配的时间已经非常少了，难免感到有些压抑与担忧，但至少我身处在自己喜爱的行业中。不过自己依然在努力融入新环境中，11 月初第一次参加了 Hackathon，与队友们一起组队 coding。也参加了一期 Sketch Meetup，最后一个似乎是培训班老师，一番抄袭无罪的理论让我三观不适。不过看到了丁一和 JASKNi，然而人很多并没有机会也没好意思上前打扰打招呼。<br>在家准备面试的之前开始了自己的新项目 Adonis，经过了好久好久的 TF 前几天终于上架了，关于 Adonis 的故事还是单独再谈。</p><h3 id="尾巴"><a href="#尾巴" class="headerlink" title="尾巴"></a>尾巴</h3><p>落笔的时候脑中闪过了很多东西，甚至高考。现在大四的我大学生活基本已经算是结束了，我不得不说高考之后每件事似乎都和高考可以扯得上关系，而面对自己的高考我当然有遗憾但是没什么好后悔的。大一的时候我还没日没夜不停的想着复读的问题，看着周边一些每天连续游戏的同学和合不来的室友甚至很害怕自己变成那样。所以现在看起来自己的大学三年似乎一直过的很焦虑，虽然我对自己的学校并不满意，但也从来没有沉溺于抱怨，总是想着自己可以改变些什么，到发现环境改变不了的时候便开始专心改变自己。从大一大二每天泡实验室到寝室关门，到大三沉心于自己的事情，至少我一直向着自己的方向尝试努力。大一大二的时候急着在学校证明自己，拿一等奖学金，去评各类奖项，但后来我发现在学校里追逐这些对我而言并没有什么实际意义，我在学校之外开始看到了更多更优秀的同龄人在做什么，我开始关心自己应该要去做什么。甚至于私以为读大学的目的学专业倒是其次，因为该用的东西自己迟早会学，而至于大学人脉什么就更是胡诹。对我而言最重要的可能就是给我一个环境和足够的时间思考自己认识和处理世界的方式，想好了，就专心去做吧。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;大三早已结束了。对于名义上大四却已经实习了一个多月的我来说，大学生活好像真的已然过去了。&lt;/p&gt;
    
    </summary>
    
      <category term="Life" scheme="http://www.roczhang.com/categories/Life/"/>
    
    
  </entry>
  
  <entry>
    <title>Mr.Weather 的故事</title>
    <link href="http://www.roczhang.com/Mr.Weather%20%E7%9A%84%E6%95%85%E4%BA%8B.html"/>
    <id>http://www.roczhang.com/Mr.Weather 的故事.html</id>
    <published>2017-05-30T07:47:32.000Z</published>
    <updated>2018-11-10T07:02:11.560Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://www.roczhang.com/images/mrWeatherStory/banner.png" alt="Markdown preferences pane"></p><p>Mr.Weather 是第一个从 0 到 1 完全由我自己完成的 App，因此我也在这个过程中体验到了产品、设计、开发甚至是客服等各个角色。从构建 Mr.Weather 首版雏形至今已经超过一年，我想不如就从这几个身份来聊聊 Mr.Weather 的故事。</p><a id="more"></a><h2 id="产品"><a href="#产品" class="headerlink" title="产品"></a>产品</h2><h3 id="思路的雏形与改变"><a href="#思路的雏形与改变" class="headerlink" title="思路的雏形与改变"></a>思路的雏形与改变</h3><p>坦白说，开始动手做 Mr.Weather时我甚至没想好到底要做个怎样的产品，这也是为什么中间花费了如此长的时间。甚至于今天看来，雏形和现在的版本完全是两个不同的产品。最开始是在突发奇想下决定要做一个程序员风格的天气 app，实际上就是类似于 Terminal ，直接输入各种命令，完成查询某个城市天气之类的动作。而在这种奇特的思想驱动下，甚至还加入了类似聊天机器人的对话功能。整体风格也是尽力模仿像素风，甚至字体也是用的 Xcode 默认的 Menlo。当时还在大二的我觉得这种感觉很酷，而现如今看起来则是有些惨不忍睹了。<br><img src="http://www.roczhang.com/images/mrWeatherStory/2.png" alt="Markdown preferences pane"></p><p>之后大二暑假实习期间的一个晚上去 Kevin 家吃饭，我掏出手机给 Kevin 看了当时的 Mr.Weather。依稀记得 Kevin 说挺有趣但感觉有些自嗨，我认真一想感觉还真的是。就算是程序员，也不会每次想要查温度都要输入一个 weather -temp 呀。</p><h3 id="思考"><a href="#思考" class="headerlink" title="思考"></a>思考</h3><p>在实习结束后，我开始认真考虑究竟应该做一个怎样的天气应用。如同买钻头的人需要的往往不是钻头而是洞，大部分用户查看天气都不是为了研究天气数据，而是想要知道这些数据会怎样影响到自己，自己需要做出怎样的决定。<br>在仔细观察自己和朋友的使用习惯之后，初步将需求划分成两部分：一是经常发生的，有规律的动作，比如我们会在早晨出门前查询天气，通过降雨概率决定要不要带伞，或者通过空气质量指数决定要不要戴口罩，再或者在周五晚上看看周末的天气适不适合安排出游之类。而另一部分则是相对随机的，没有太多规律的动作。比如临出门时天色暗下来了查查当前天气。于是根据这两类需求，我开始重新考虑 Mr.Weather 的 feature。对于第一类规律性的动作，我做了 Mr.Weather 中最重要的一个功能，自定义天气通知。你可以自定义触发通知的条件、监测时间与通知发送时间，如 “当天的空气质量指数大于100时，在早晨提醒我带口罩”，又或是“第二天的降雨概率大于 50% 时，在晚上提醒我装好伞”。这些规律性的动作，就可以完全交给 Mr.Weather 来监控，用户不必每次手动查看了。而对于另一方面的需求，我给出的解决方案是当用户主动查看时，以最直观的方式告诉他所需要的信息。如 App 中包涵了分为四大类别的可定制卡片，拥有实时播报和天气动画的 Widget。并且尽量更直接的告诉用户天气变化趋势以及将带来怎样的影响，而不单是天气数据。<br><img src="http://www.roczhang.com/images/mrWeatherStory/4.png" alt="Markdown preferences pane"></p><p>每一次增改 feature 都可能让已经完成的设计和代码被放弃重来，甚至让完成进度变成遥遥不可期。在经历了第一版的 Mr.Weather 之后，我也学着更谨慎的面对每一个设想和功能。</p><h3 id="克制"><a href="#克制" class="headerlink" title="克制"></a>克制</h3><p>在考虑其他功能点时我也相对保持克制，引用 Alan 的话说，我非常讨厌 “航母级应用”，所有的生活需求被一个 App 接管是一种非常可怕的事。相比而言我更喜欢目的明确的产品，用起来干脆利落。少即是多的道理谁都会讲，而增加功能却经常是一个思考成本相对更低的选择。而由于 Mr.Weather 是个人作品，所以也有机会更加纯粹，无需面对所谓的 「 KPI 压力 」 吧。</p><h2 id="设计"><a href="#设计" class="headerlink" title="设计"></a>设计</h2><p>我很敬佩那些设计优秀重视细节的产品，这样的产品处处都会充满着设计者的巧思与灵魂。同时我很享受做设计的过程，打开 Sketch 看到一个个 Artboard 排列在屏幕上的感觉总会让人非常愉悦。从自己画下 Mr.Weather 中用到的每一个小图标，到设计调整各个天气动画，甚至是通知提示音，很多细节都需要时间和精力打磨。<br><img src="http://www.roczhang.com/images/mrWeatherStory/5.png" alt="Markdown preferences pane"></p><h3 id="气质与迭代"><a href="#气质与迭代" class="headerlink" title="气质与迭代"></a>气质与迭代</h3><p>设计的理念倒不像产品一样，从开始时我就希望 Mr.Weather 的设计干净明晰。Mr.Weather 的整体配色相对克制，也尽量注意留白。整体由信息驱动，寻求干净开阔。由于在产品构思上的更新导致整个产品有过数次推翻重来，我自己又稍稍有些强迫症，经常会和一个图标、界面死磕，找不到想要的感觉就会再来。单一个设置界面就反反复复改了数版，而至于引导界面、主界面之类则更甚，经常是自己看着不舒服就推倒再来。不过除去做个人作品怕是很难会有这样的时间成本可以让自己打磨了。好在最后的结果自己总体还算比较满意，当然还是有很多不足（比如不少用户甚至都没能找到设置入口）。<br><img src="http://www.roczhang.com/images/mrWeatherStory/6.png" alt="Markdown preferences pane"></p><h3 id="字体"><a href="#字体" class="headerlink" title="字体"></a>字体</h3><p>配合 Mr.Weather 整体的气质，我为 Mr.Weather 的英文与数字选择了 Gill Sans 这款字体。Gill Sans 被誉为英国的 Helvetica，甚至在 SHERLOCK 电影前的 BBC 片头里还能见到他的身影。虽然我对字体的了解还非常浅薄，但我很喜欢这款字体那种相对谨慎且平和的气质。在 Sketch 和 iPhone 屏幕上反复比较之后，我觉得 Gill Sans 相对 Open Sans 、Helvetica 等字体与 Mr.Weather 整体更加契合，于是选定了使用 Gill Sans。而中文字体由于考虑到对应用整体大小的控制，所以算是在妥协之下选择了系统默认的苹方。</p><h3 id="动画"><a href="#动画" class="headerlink" title="动画"></a>动画</h3><p>Mr.Weather 的天气动画依然在寻求自然干净的感觉，晴天、阴天、雨天及下雪等场景的动画也遵循 Mr.Weather 整体的配色。 除去较大的天气动画之外，在 App 中我也加入了很多细小的动画。比如下拉菜单时后面背景的逐渐模糊，添加卡片时类似一推滑动的 toggle 动画，天气卡片下方展开分类筛选时的提示用户可以滑动的动画，以及各类 alert 动画等等，都希望能营造出一种自然、干净、利落的体验。<br>Mr.Weather 中的动画在少数地方使用了 Facebook 的 pop 与 Airbnb 的 Lottie，而 95% 以上的动画还是使用了 CoreAnimation 来完成。<br><img src="http://www.roczhang.com/images/mrWeatherStory/7.png" alt="Markdown preferences pane"></p><h2 id="开发"><a href="#开发" class="headerlink" title="开发"></a>开发</h2><p>由于自己程序员的主要身份，所以整体开发上的烦恼基本只剩下 Xcode 经常崩溃的自动提示与 Swift 越来越长的编译等待时间。但最重要的天气通知则还是遇到了一些问题。对于如何处理天气通知想过非常多的办法，甚至于一开始打算把所有用户的通知设置保存在 Server 上，由 Server 来处理判断再给客户端发通知。而这种办法对于目前的 Mr.Weather 来说基本不可行。后来还是采取了后台应用刷新和远程静默通知结合的方式来解决。</p><h3 id="数据源与运营压力"><a href="#数据源与运营压力" class="headerlink" title="数据源与运营压力"></a>数据源与运营压力</h3><p>另一件比较烦心的则是天气数据源的选择。先后比较了几个数据源，最后还是选择了一个付费数据源。毕竟准确、及时的数据对于一个天气应用至关重要，也会在很多时候影响用户体验。而在上架时，考虑到 Mr.Weather 目前的完善状况，觉得现在收费还是对用户不太负责的行为，所以选择了免费也没有添加内购选项。后来 Mr.Weather 的日访问突然增长，按次收费的天气接口费用让我措手不及。非常感动的是不少用户都给予了捐助支持，也帮助我在想清 Mr.Weather 的未来之前缓解了不少压力。</p><h3 id="内测"><a href="#内测" class="headerlink" title="内测"></a>内测</h3><p>在 Mr.Weather 上架之前，我先通过 TestFlight 发布了数个测试版本。由于开发者使用时的一些惯性非常容易忽略掉不少问题，所以进行测试非常必要。 Mr.Weather 先后从 0.1 测到 0.7，其中数次都是凌晨新版本通过审核后交由朋友们测试一天，我在当天晚上就会做修改调整，再提交下一版本审核。朋友们给了很多反馈与建议，数次下来 Mr.Weather 的问题也少了很多，方提交到了 AppStore。<br>值得一提的是，作为自己第一次提交给 AppStore 的应用，一次就通过审核了，而且前后一共也只用了两三天的时间，非常意外。</p><h3 id="上架后与用户反馈"><a href="#上架后与用户反馈" class="headerlink" title="上架后与用户反馈"></a>上架后与用户反馈</h3><p>Mr.Weather 于 5 月 18 日上架到了 AppStore ，至今差不多两周的时间。期间最佳排名为国区天气类免费榜第 25 名。而上架之后，阅读每日的反馈与来信也变成一件非常有趣的事情，也正是通过这个渠道，结识到了不少用户甚至是设计师和开发者，感觉非常奇妙。</p><h2 id="尾巴"><a href="#尾巴" class="headerlink" title="尾巴"></a>尾巴</h2><p>从大二开始参与过大大小小的项目开发，在团队中每个人各司其职，相互配合与学习的过程让我非常快乐。而第一次通过 Mr.Weather 完整体验了从 0 到 1 制作一款产品，自己独立掌控产品的方方面面则别有一番感触。这两种体验都让我投入且着迷。<br>我曾想过做设计对一个程序员而言会不会是不务正业，然而上面提到的每一个角色努力的目的都是为了打造出一个更好的产品，之间并没有冲突。而将我的所学所想杂糅并倾注到一款产品中去，不断打磨完善，再实现新的想法，这个过程我想我永远不会觉得无趣。</p><p>我是 Roc Zhang，这就是我的首个独立作品 Mr.Weather。<br>Mr.Weather 官网与下载地址：<a href="http://www.roczhang.com/mr.weather/">http://www.roczhang.com/mr.weather/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://www.roczhang.com/images/mrWeatherStory/banner.png&quot; alt=&quot;Markdown preferences pane&quot;&gt;&lt;/p&gt;
&lt;p&gt;Mr.Weather 是第一个从 0 到 1 完全由我自己完成的 App，因此我也在这个过程中体验到了产品、设计、开发甚至是客服等各个角色。从构建 Mr.Weather 首版雏形至今已经超过一年，我想不如就从这几个身份来聊聊 Mr.Weather 的故事。&lt;/p&gt;
    
    </summary>
    
      <category term="Product" scheme="http://www.roczhang.com/categories/Product/"/>
    
    
  </entry>
  
  <entry>
    <title>&#39;===&#39; &amp; &#39;!==&#39; in Swift</title>
    <link href="http://www.roczhang.com/in-Swift.html"/>
    <id>http://www.roczhang.com/in-Swift.html</id>
    <published>2017-03-28T14:21:43.000Z</published>
    <updated>2018-11-10T07:02:11.561Z</updated>
    
    <content type="html"><![CDATA[<p>一篇简短的小记。<br><a id="more"></a></p><h1 id="Start"><a href="#Start" class="headerlink" title="Start"></a>Start</h1><p>由于最近比较多的用了 IGListKit 来写新的模块和重构旧的模块，其中 IGListKit 要求模型遵遁 IGListDiffable 协议，其中需要你实现一个函数：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">public func isEqual(toDiffableObject object: IGListDiffable?) -&gt; Bool</div></pre></td></tr></table></figure><p>来告诉 IGList 接收到的和给定的 object 是否相等。一般情况用模型里的 hash id 来判断就可以解决，但今天和师傅讨论到如果是一个数组，而且数组里的模型又没有 ID 属性，该如何判断相等。</p><p>由此想到了 ‘===’ &amp; ‘!==’ 运算符。</p><h1 id="‘-’-amp-‘-’"><a href="#‘-’-amp-‘-’" class="headerlink" title="‘===’ &amp; ‘!==’"></a>‘===’ &amp; ‘!==’</h1><p>比起常用的 == 和 != ，这两个运算貌似使用的频度非常低，其实用法倒是很简单的， === 和 !== 用于比较 引用类型（Reference Type）是否是相同的引用。</p><p>不过随便查看几个搜索结果会发现好像有这么一段说法：</p><p>“Check whether two arrays or subarrays share the same storage and elements by comparing them with the identity operators (=== and !==).”</p><p>嗯嗯嗯？还可以比较数组或者子数组的？原生支持？如此方便？<br>在 Playground 中简单一试：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">let array1 = [1, 2, 3]</div><div class="line">var array2 = array1</div><div class="line"></div><div class="line">array1 !== array2</div></pre></td></tr></table></figure><p>马上就会 “Error: binary operator ‘!==’ cannot be applied to…”。</p><p>不过等等，Swift 中的 Array 不是 Value Type 吗，是应该不能用这个啊，那为什么会有可以比较数组这种说法？难道记错了？</p><p>“Array and Dictionary in Swift are implemented as structs.”</p><p>没记错， Array 是 Value Type.</p><p>后来发现，之所以有比较数组这种说法是因为，在 2014 年 Swift beta 3 之前，Swift 中的 Array 有一些小小的不同，引用喵神以前的博客里的一句话：</p><p>“Swift 考虑到实际使用的情景，对 Array 做了特殊的处理。除非需要（比如 Array 的大小发生改变，或者显式地要求进行复制），否则 Array 在传递的时候会使用参照。”</p><p>而之后</p><p>“对于 Array 中元素的改变，在 beta 3 中发生了变化。现在不再存在作为一个值类型但是却在赋值和改变时表现为参照类型的 Array 的特例，而是彻头彻尾表现出了值类型的特点。”</p><p>所以， ‘===’ &amp; ‘!==’ 用于比较数组的这种说法也是很早之前的老文档中存在的，现在并不能用啦。</p><p>等等，谁说不能？</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">let array1 = NSArray(array: [A, B])</div><div class="line">var array2 = array1</div><div class="line"></div><div class="line">array1 !== array2</div></pre></td></tr></table></figure><p>用 Cocoa 中的容器类自然没问题，因为是引用类嘛。</p><p>但这就没有 Swift 的 “钦定” 感了! 🙃</p><p>善变的 Swift! 🙃</p><h1 id="Swift-3-1"><a href="#Swift-3-1" class="headerlink" title="Swift 3.1"></a>Swift 3.1</h1><p>Xcode 8.3 出来了！ Swift 3.1 出来了！<br>Apple 还说 “Faster builds for large projects that mix Objective-C and Swift code”!<br>赶紧一试！</p><p><img src="http://i1.piimg.com/577817/dc057c7c28ef5d73.jpg" alt="Markdown preferences pane"></p><p>120 秒… 还有 Swift 3.1 附赠的爆炸多的警告… 🙃<br>也许还是在提示我电脑不行了。 🙃</p><h1 id="相关链接"><a href="#相关链接" class="headerlink" title="相关链接"></a>相关链接</h1><p><a href="https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-ID82" target="_blank" rel="external">Apple - Classes and Structures</a><br><a href="https://onevcat.com/2014/06/walk-in-swift/" target="_blank" rel="external">OneV’s Den - 行走于 Swift 的世界中</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;一篇简短的小记。&lt;br&gt;
    
    </summary>
    
      <category term="Code" scheme="http://www.roczhang.com/categories/Code/"/>
    
    
  </entry>
  
</feed>
