<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>13</title>
		<link>https://13h.tw</link>
		<atom:link href="https://13h.tw/feed.xml" rel="self" type="application/rss+xml" />
		
			<item>
				<title>重拾程式解題的樂趣 - Advent of Code</title>
        <description>&lt;p&gt;你有做過線上解題嗎？像是高中生軟體比賽會寫的 ACM Online Judge，或是有些軟體工作面試要求考演算法，而要刷的 &lt;a href=&quot;https://leetcode.com&quot;&gt;LeetCode&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;我不喜歡寫這些，雖然富有挑戰性，說實在並不有趣。如果想要&lt;strong&gt;享受純粹的解題樂趣，我不會去寫 LeetCode&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;直到最近我發現一個只在每年 12 月才會有的解題活動：&lt;a href=&quot;https://adventofcode.com&quot;&gt;Advent of Code&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;它是一人專案，作者是 &lt;a href=&quot;http://was.tl/&quot;&gt;Eric Wastl&lt;/a&gt; (&lt;a href=&quot;https://twitter.com/ericwastl&quot;&gt;@ericwastl&lt;/a&gt;)。這個活動從 2015 年以來已經是第 5 年了。&lt;/p&gt;

&lt;h2 id=&quot;什麼是-advent-of-code&quot;&gt;什麼是 Advent of Code&lt;/h2&gt;

&lt;p&gt;Advent 是天主教專有名詞，你可以簡單理解成「耶誕節倒數」（&lt;a href=&quot;https://zh.wikipedia.org/wiki/將臨期&quot;&gt;維基百科&lt;/a&gt;）。所以 &lt;a href=&quot;https://adventofcode.com&quot;&gt;Advent of Code&lt;/a&gt;（以下簡稱 AoC） 的活動是在每年的 12/1 到 12/25。&lt;/p&gt;

&lt;p&gt;在這 25 天中，每天都會公布兩題（通常）要寫程式才能解決的題目。時間是台灣的下午一點。&lt;/p&gt;

&lt;p&gt;第一題通常不會太難，而你要解開第一題以後才會看到第二題的題目，是第一題的變化。很有可能顛覆你前面的思路跟設定。我喜歡這種變化題的設計方式，可以打破&lt;strong&gt;&lt;a href=&quot;https://zh.wikipedia.org/wiki/慣性思維&quot;&gt;慣性思維&lt;/a&gt;&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;實際解了幾題，我發現就解題樂趣而言，AoC 比 LeetCode 好玩很多。&lt;/p&gt;

&lt;p&gt;LeetCode 的解題過程大致上是：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;挑題目（有些要付錢）&lt;/li&gt;
  &lt;li&gt;理解題目（同時心裡想著，不會吧，這題是 Easy？）&lt;/li&gt;
  &lt;li&gt;在網頁介面上寫程式來：
    &lt;ul&gt;
      &lt;li&gt;處理輸入的測試資料&lt;/li&gt;
      &lt;li&gt;解題完回傳答案&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;送出程式碼讓 LeetCode 後台執行&lt;/li&gt;
  &lt;li&gt;要考慮到 edge cases&lt;/li&gt;
  &lt;li&gt;要考慮到執行時間，解完以後還會跟別人比較&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;而 Advent of Code 的解題過程則是：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;有一個簡單的背景故事（例如聖誕老人被困在太陽系某處，你要幫助他 blah blah）&lt;/li&gt;
  &lt;li&gt;每天準時公布題目&lt;/li&gt;
  &lt;li&gt;一組資料&lt;/li&gt;
  &lt;li&gt;一個答案輸入框&lt;/li&gt;
  &lt;li&gt;解題方式隨意&lt;/li&gt;
  &lt;li&gt;第一題解完會有第二題&lt;/li&gt;
  &lt;li&gt;答錯的話要過一分鐘才能重試&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;以下說明 AoC 的幾個特色。&lt;/p&gt;

&lt;h3 id=&quot;解題方式隨意&quot;&gt;解題方式隨意&lt;/h3&gt;

&lt;p&gt;2019 Day 1-1 這題，其實我是在手機上複製貼上到 Numbers app 解的😆&lt;/p&gt;

&lt;p&gt;因為它的題目非常簡單，大意是：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;聖誕老人的太空船上的各種模組要消耗燃油。它列給你所有模組的重量，然後你用簡單的四則運算求出對應的燃料重量，再加總。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;所以用試算表秒解。而且&lt;a href=&quot;https://twitter.com/ohyes1h/status/1202048971616616448?s=20&quot;&gt;不是只有我有這種想法&lt;/a&gt;。&lt;/p&gt;

&lt;h3 id=&quot;變化題&quot;&gt;變化題&lt;/h3&gt;

&lt;p&gt;當你把 1-1 解完以後，「故事」才會往下展開。看到 1-2 這題就有趣了：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;原來你剛才忘記計算燃料本身的重量了。每次增加燃料的同時，你要再增加一定的燃料，如此反覆直到某個條件為止。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;這就不能用原本的方式計算，所以我才打開電腦寫程式，順便重寫第一題。&lt;/p&gt;

&lt;p&gt;邏輯變了，但資料沒有變。我只要調整計算方式。&lt;/p&gt;

&lt;h3 id=&quot;比較少在處理資料比較多在解題本身&quot;&gt;比較少在處理資料，比較多在解題本身&lt;/h3&gt;

&lt;p&gt;在寫 LeetCode 時，有好一部分時間是在處理資料的輸入格式，這個部份特別無趣。&lt;/p&gt;

&lt;p&gt;AoC 你可以隨意。因為資料只會有一組而且是公開的，不需要像 LeetCode 反覆嘗試來處理各種「規則有寫但看不到範例」的 edge cases。&lt;/p&gt;

&lt;p&gt;每天的兩題共用同一份資料，所以即使第二題的邏輯不同，你初始處理資料的程式碼通常也可以沿用第一題。&lt;/p&gt;

&lt;p&gt;這些條件與設計，就&lt;strong&gt;讓人更專注在解題而不是處理資料格式&lt;/strong&gt;。&lt;/p&gt;

&lt;h3 id=&quot;題目難度&quot;&gt;題目難度&lt;/h3&gt;

&lt;p&gt;2019 前面四天每天有越來越難的趨勢。&lt;/p&gt;

&lt;h3 id=&quot;活動玩法&quot;&gt;活動玩法&lt;/h3&gt;

&lt;p&gt;既然是玩法很自由的解題遊戲，你要怎麼做都可以。你可以跟高手比賽解題速度，每天下午一點公布題目後就開始寫。如果&lt;a href=&quot;https://adventofcode.com/2019/leaderboard&quot;&gt;前 100 名&lt;/a&gt;的話，會得到 (100 - N + 1) 點積分，可以累積積分來排名。但是排行榜上都是在幾分鐘內解完，我可能題目都還沒理解完呢😂&lt;/p&gt;

&lt;p&gt;所以我的玩法是志在參加，有把題目都解出來就好。我是用 Swift + Playground。每解完一題就 commit 起來。&lt;/p&gt;

&lt;p&gt;解完之後再去看討論。以後學了其他語言也可以回來解一次。&lt;/p&gt;

&lt;p&gt;AoC 也支援私底下的排行榜，可以跟朋友同事切磋。&lt;/p&gt;

&lt;h3 id=&quot;救命解不下去&quot;&gt;救命，解不下去&lt;/h3&gt;

&lt;p&gt;不確定題目意思可以跟我在 &lt;a href=&quot;https://twitter.com/ethanhuang13&quot;&gt;Twitter&lt;/a&gt; 討論。&lt;/p&gt;

&lt;p&gt;凡是公開題目就會有公開解答。&lt;a href=&quot;https://github.com/Bogdanp/awesome-advent-of-code&quot;&gt;GitHub&lt;/a&gt; 有一些可以參考，&lt;a href=&quot;https://www.reddit.com/r/adventofcode/&quot;&gt;Reddit&lt;/a&gt; 也有很多討論。甚至還有人&lt;a href=&quot;https://www.reddit.com/r/adventofcode/comments/e5q63j/2019_day_1_did_someone_say_siri/&quot;&gt;靠 Siri 解題&lt;/a&gt;！？（1-1 還沒解完的不要看）&lt;/p&gt;

&lt;p&gt;不過我覺得前幾天的第一題的難度真的沒有太高，可以多試幾次再去看討論。&lt;/p&gt;

&lt;h3 id=&quot;費用&quot;&gt;費用&lt;/h3&gt;

&lt;p&gt;AoC 完全免費！甚至不用登入就可以看&lt;a href=&quot;https://adventofcode.com&quot;&gt;題目&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;只要用 GitHub、Twitter 等註冊帳號就可以開始填答。&lt;/p&gt;

&lt;p&gt;若你覺得這個活動很有趣，可以考慮&lt;a href=&quot;https://adventofcode.com/2019/support&quot;&gt;捐助&lt;/a&gt;，金額隨意。&lt;/p&gt;

&lt;h3 id=&quot;歷史題目&quot;&gt;歷史題目&lt;/h3&gt;

&lt;p&gt;我是從今年才開始玩的。但是 &lt;a href=&quot;https://adventofcode.com/2019/events&quot;&gt;2015-2018&lt;/a&gt; 也各有 25 * 2 題可以回去解。&lt;/p&gt;

&lt;h2 id=&quot;結語&quot;&gt;結語&lt;/h2&gt;

&lt;p&gt;對你來說，線上程式解題是好玩、痛苦，或是苦樂參半的經驗？&lt;/p&gt;

&lt;p&gt;前陣子在 Twitter 上有看到一陣在討論 LeetCode 怎麼刷、怎麼買（中文版比英文還便宜）。看到討論時，我比較有興趣的卻是，這種線上測驗的專案是怎麼做起來的啊？&lt;/p&gt;

&lt;p&gt;等到我看到 &lt;a href=&quot;https://twitter.com/ericwastl&quot;&gt;@ericwastl&lt;/a&gt; 創造的 AoC 發現，這個專案是他一個人從頭搭建的，題目也都是自己想的。&lt;a href=&quot;https://adventofcode.com/2019/about&quot;&gt;他甚至說&lt;/a&gt;，為了避免法律爭議，即使寄給他題目的建議他也不會讀，免得不小心用上了這些點子。我覺得這位工程師以及 AoC 這個專案，甚至比解題本身甚至更有意思。&lt;/p&gt;

&lt;p&gt;也許我們應該思考怎麼創造出題目，而不是只會解題而已？&lt;/p&gt;

&lt;p&gt;總之，AoC 是一個很有趣的程式解題活動，有空的話一起來玩吧。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;可以來&lt;a href=&quot;https://adventofcode.com/2019/leaderboard/private&quot;&gt;我開好的 Leaderboard&lt;/a&gt;，輸入&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;747723-067e3e4b&lt;/code&gt;加入&lt;/strong&gt;，已經有一些推友在上面了。我會把 anonymous user 移除，所以請記得到&lt;a href=&quot;https://adventofcode.com/2019/settings&quot;&gt;設定&lt;/a&gt;把自己的名稱顯示出來。&lt;/p&gt;

&lt;p&gt;或者是只跟自己比也完全沒問題。&lt;/p&gt;

&lt;p&gt;AoC 刷起來！&lt;/p&gt;

&lt;h2 id=&quot;相關連結&quot;&gt;相關連結&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://adventofcode.com/2019/about&quot;&gt;About Advent of Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
				<pubDate>Wed, 04 Dec 2019 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2019/12/04/adventofcode.html</link>
				<guid isPermaLink="true">https://13h.tw/2019/12/04/adventofcode.html</guid>
			</item>
		
			<item>
				<title>如何管理 Xcode 版本才不會害到自己跟團隊</title>
        <description>&lt;p&gt;身為一個 iOS 工程師，我們應該對自己的開發工具有完整的掌握。最常使用的就是 Xcode。&lt;/p&gt;

&lt;p&gt;我注意到開發者很常踩到 Xcode 在安裝、版本選擇方面的坑，所以決定來分享一下自己是怎麼管理 Xcode 版本。&lt;/p&gt;

&lt;h2 id=&quot;安裝與下載&quot;&gt;安裝與下載&lt;/h2&gt;

&lt;h3 id=&quot;不要透過-mac-app-store&quot;&gt;不要透過 Mac App Store&lt;/h3&gt;

&lt;p&gt;開發者最常犯的錯誤大概就是用 Mac App Store 下載 Xcode 了。使用 MAS 看似方便，但是後面會有各種無法掌握的因素。比如說：&lt;/p&gt;

&lt;h4 id=&quot;下載不了&quot;&gt;下載不了…&lt;/h4&gt;

&lt;p&gt;類似的抱怨在 Twitter 上隨便找都一堆。&lt;/p&gt;

&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-partner=&quot;tweetdeck&quot;&gt;&lt;p lang=&quot;zh&quot; dir=&quot;ltr&quot;&gt;更新了一个星期的 xcode还没成功……&lt;/p&gt;&amp;mdash; Jia (@deepjia) &lt;a href=&quot;https://twitter.com/deepjia/status/1183388230734897154?ref_src=twsrc%5Etfw&quot;&gt;October 13, 2019&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-partner=&quot;tweetdeck&quot;&gt;&lt;p lang=&quot;zh&quot; dir=&quot;ltr&quot;&gt;连续两个星期没法从 MAS 里安装 Xcode 之后，我选择： &lt;a href=&quot;https://t.co/Ha1za3fTBO&quot;&gt;pic.twitter.com/Ha1za3fTBO&lt;/a&gt;&lt;/p&gt;&amp;mdash; 迟先生的星星球 (@iskyzh) &lt;a href=&quot;https://twitter.com/iskyzh/status/1184471967736291330?ref_src=twsrc%5Etfw&quot;&gt;October 16, 2019&lt;/a&gt;&lt;/blockquote&gt;

&lt;h4 id=&quot;低能安裝過程&quot;&gt;低能安裝過程…&lt;/h4&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;zh&quot; dir=&quot;ltr&quot;&gt;幹你娘低能 Apple Store，Xcode 下載完跟我說要關閉 Xcode 才可以安裝，但我沒開 Xcode 所以想說先按取消再試一次，結果他給我重新下載...&lt;/p&gt;&amp;mdash; Haruka (@hirakujira) &lt;a href=&quot;https://twitter.com/hirakujira/status/1175404511252250624?ref_src=twsrc%5Etfw&quot;&gt;September 21, 2019&lt;/a&gt;&lt;/blockquote&gt;

&lt;h4 id=&quot;下載失敗浪費空間&quot;&gt;下載失敗浪費空間…&lt;/h4&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-partner=&quot;tweetdeck&quot;&gt;&lt;p lang=&quot;zh&quot; dir=&quot;ltr&quot;&gt;Xcode 升級下載失敗就算了，每次安裝失敗還留一堆垃圾檔案在系統裡。&lt;br /&gt;&lt;br /&gt;全部反安裝再試一次。&lt;/p&gt;&amp;mdash; OOBE (@OOBE) &lt;a href=&quot;https://twitter.com/OOBE/status/1189181800242765825?ref_src=twsrc%5Etfw&quot;&gt;October 29, 2019&lt;/a&gt;&lt;/blockquote&gt;

&lt;h4 id=&quot;正要用的時候自己手賤或是系統犯賤幫你更新&quot;&gt;正要用的時候，自己手賤或是系統犯賤幫你更新…&lt;/h4&gt;

&lt;p&gt;我覺得這個超慘的耶🤦‍♂️&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;zh&quot; dir=&quot;ltr&quot;&gt;我說那個 Xcode 可以不要挑正要驗收時更新嗎⋯⋯&lt;br /&gt;🤦‍♂️🤦‍♂️🤦‍♂️&lt;/p&gt;&amp;mdash; 餿腐味粗工 (@joe_trash_talk) &lt;a href=&quot;https://twitter.com/joe_trash_talk/status/1176769452320251904?ref_src=twsrc%5Etfw&quot;&gt;September 25, 2019&lt;/a&gt;&lt;/blockquote&gt;

&lt;h4 id=&quot;而且強迫症的你還糾結著那該死的紅點&quot;&gt;而且強迫症的你還糾結著那該死的紅點…&lt;/h4&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-partner=&quot;tweetdeck&quot;&gt;&lt;p lang=&quot;zh&quot; dir=&quot;ltr&quot;&gt;升上10.15.1终于把xcode的更新安装完了，终于不用见到那个该死的红点了。&lt;/p&gt;&amp;mdash; 工藤龍一郎 (@BakeCom) &lt;a href=&quot;https://twitter.com/BakeCom/status/1189528574643982337?ref_src=twsrc%5Etfw&quot;&gt;October 30, 2019&lt;/a&gt;&lt;/blockquote&gt;

&lt;h4 id=&quot;其他缺點&quot;&gt;其他缺點&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;同時只能保留一個版本&lt;/li&gt;
  &lt;li&gt;一直跳出更新提示&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;你完全可以避免這些問題😎，以下提供兩種方式。&lt;/p&gt;

&lt;h3 id=&quot;直接從-apple-developer-網站下載-xcode&quot;&gt;直接從 Apple Developer 網站下載 Xcode&lt;/h3&gt;

&lt;p&gt;其實 Apple 官網一直有下載 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.xip&lt;/code&gt; 壓縮檔版本 Xcode 的連結，但是藏得有點深。&lt;/p&gt;

&lt;p&gt;下載頁面的首頁是 &lt;a href=&quot;https://developer.apple.com/downloads&quot;&gt;https://developer.apple.com/downloads&lt;/a&gt;。而列出下載檔的位置是在 &lt;a href=&quot;https://developer.apple.com/downloads/more&quot;&gt;https://developer.apple.com/downloads/more&lt;/a&gt;。都需要登入開發者帳號。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/2019-11-01-developer-downloads.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;要去按 &lt;strong&gt;More&lt;/strong&gt;，是不是藏得有點深…&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/2019-11-01-developer-downloads-more.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;是說，這邊最早還可以下載到 Xcode 3.2 呢。&lt;/p&gt;

&lt;p&gt;自己下載唯一的缺點就是，通常這個版本會比 Mac App Store 還要晚個半天才會放上去。&lt;/p&gt;

&lt;p&gt;但我通常都會在 Twitter 觀察一下災情，才決定要不要抓新版，所以沒差。&lt;/p&gt;

&lt;h3 id=&quot;透過-xcode-install-套件管理-xcode&quot;&gt;透過 xcode-install 套件管理 Xcode&lt;/h3&gt;

&lt;p&gt;如果你覺得手動下載、手動解壓縮好蠢，那麼來用 command line 吧。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/xcpretty/xcode-install&quot;&gt;xcode-install&lt;/a&gt; 是一個很方便的 Ruby 套件。&lt;/p&gt;

&lt;p&gt;安裝 Xcode 11.0 只需要兩行：&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;xcode-install
xcversion &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;11.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;就會登入（使用跟 Fastlane 一樣的 Keychain 機制）、下載，並且解壓縮。&lt;/p&gt;

&lt;p&gt;甚至可以列出所有可下載與已安裝的版本：&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;xcversion update
xcversion list
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/2019-11-01-xcversion-list.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;xcode-與-ios-相容性測試&quot;&gt;Xcode 與 iOS 相容性測試&lt;/h2&gt;

&lt;p&gt;（2020/06/23 更新：本段落舉例版號改成 WWDC20 推出的新版本，以利閱讀）&lt;/p&gt;

&lt;p&gt;每次 Apple 發表新版 Xcode 的 beta 版以後，尤其是 WWDC 的年度大版本，開發者應該將 beta 版抓下來做專案的相容性測試。&lt;/p&gt;

&lt;p&gt;我們應該要測試相容的有哪些呢？以下為了方便說明我們把時光假定為 beta 版期間。&lt;/p&gt;

&lt;p&gt;以 2020 年發表的 Xcode 12 與 iOS 14 來說，相較於前一代的 Xcode 11 與 iOS 13，會有以下四種組合：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt; &lt;/th&gt;
      &lt;th&gt;Xcode 11&lt;/th&gt;
      &lt;th&gt;Xcode 12 beta&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;iOS 13 或更早&lt;/td&gt;
      &lt;td&gt;A. 現況 🔁&lt;/td&gt;
      &lt;td&gt;C. 向下相容 ⬇️&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;iOS 14&lt;/td&gt;
      &lt;td&gt;B. 向上相容 ⬆️&lt;/td&gt;
      &lt;td&gt;D. 新東西 🆕&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;通常 A、C、D 這三種情境我們比較熟悉，也比較容易。&lt;/p&gt;

&lt;h3 id=&quot;a-現況-&quot;&gt;A. 現況 🔁&lt;/h3&gt;
&lt;p&gt;專案在目前 Xcode 正式版的相容性，也就是現況。&lt;/p&gt;

&lt;h3 id=&quot;b-向上相容-️&quot;&gt;B. 向上相容 ⬆️&lt;/h3&gt;
&lt;p&gt;專案在舊版 Xcode 上 build 出來的，跑在新版的 iOS beta 裝置。比如 Xcode 11.5 正式版去連接 iOS 14 beta 裝置。&lt;/p&gt;

&lt;p&gt;這一塊可以說是個大盲區。你想想看當新的 iOS 正式推出的時候，使用者可能就升級上去了，但你不見得已經準備好支援 iOS 14 的 app。就算準備好了，他們也不見得會更新 app。&lt;/p&gt;

&lt;p&gt;這明明就是在新版系統正式推出以後，使用者最有可能遇到的情境。但是 &lt;strong&gt;Apple 從來就沒有為了向上相容的測試提供方法&lt;/strong&gt;。把一台 iOS 14 的裝置接到 Xcode 10，會告訴你不支援，系統版本太新，沒辦法 run 在實機上。這樣子要怎麼確保向上相容呢？&lt;/p&gt;

&lt;p&gt;幸好，要讓 Xcode 去支援它本來不支援的新版系統，只需一個關鍵—DeviceSupport。我們可以從新版 Xcode 裡面把對應的 DeviceSupport 資料夾，看是要用 symbolic link 還是複製一份的方式。我是比較推薦前者。&lt;/p&gt;

&lt;p&gt;我寫了一個 &lt;a href=&quot;https://gist.github.com/ethanhuang13/b9b4b875db9b49a124e2af194b97be68&quot;&gt;gist&lt;/a&gt; 來做這件事情，裡面還有 watchOS 與 tvOS 的指令。你可能得依照自己的 Xcode 路徑來修改指令內容。&lt;/p&gt;

&lt;p&gt;唉呀，其實我在 2017 年就寫過&lt;a href=&quot;https://medium.com/@ethanhuang13/從正式版-xcode-連到-beta-版裝置開發-d4a137c91618&quot;&gt;類似的文章&lt;/a&gt;了。&lt;/p&gt;

&lt;h3 id=&quot;c-向下相容-️&quot;&gt;C. 向下相容 ⬇️&lt;/h3&gt;
&lt;p&gt;專案在新版 Xcode build 出來以後，跑在舊版的 iOS 裝置。比如 Xcode 12 beta 連接 iOS 13 裝置。&lt;/p&gt;

&lt;p&gt;WWDC 新版 Xcode 出來時，Apple 會希望你下載最新的 beta 版，來做向下相容的測試。直接把舊系統的裝置連到新版的 Xcode，通常安裝 app 不會有問題，我們要留意的是跑起來以後，新的 SDK 怎麼樣相容舊版系統，有沒有一些壞掉的情況。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;一般來說&lt;/strong&gt;向下相容比較不會有問題，因為 Apple 必須確保系統升級不會讓原有的應用程式無法使用。&lt;/p&gt;

&lt;p&gt;而且除非你要升級 Xcode，不然這件事也沒那麼急。&lt;/p&gt;

&lt;h3 id=&quot;d-新東西-&quot;&gt;D. 新東西 🆕&lt;/h3&gt;
&lt;p&gt;專案對於新系統、新版 Xcode 的相容性。現有專案直接用新版 Xcode 打開看能否 build。比如 Xcode 12 beta 跑在 iOS 14 beta 裝置。&lt;/p&gt;

&lt;p&gt;這邊主要看的是專案對於系統的相容性。越早版本的 beta 問題當然是越多。&lt;/p&gt;

&lt;p&gt;但是除非你的產品非得要用到最新的 API，要不然 D 這個部份的相容性應該是最不急迫的。&lt;/p&gt;

&lt;p&gt;就一個成熟的產品或是日常工作來說，我覺得處理的優先順序應該是 &lt;strong&gt;A 現況 🔁 &amp;gt; B 向上相容 ⬆️ &amp;gt; C 向下相容 ⬇️ &amp;gt; D 新東西 🆕&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;2019 年大家都興沖沖地跑去玩 SwiftUI 或是 Combine，然後才發現坑超多。其實那些都是屬於 D 的部分，優先度最低🤣&lt;/p&gt;

&lt;p&gt;以後 Apple 再發表新東西，我們最好還是吸取教訓，先搞定 A、B、C，再來玩玩具。&lt;/p&gt;

&lt;h2 id=&quot;團隊協作&quot;&gt;團隊協作&lt;/h2&gt;

&lt;h3 id=&quot;指定-xcode-版本&quot;&gt;指定 Xcode 版本&lt;/h3&gt;

&lt;p&gt;有多個版本 Xcode 的話，用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xcode-select&lt;/code&gt; 來指定要使用的 Xcode 的路徑。這應該是基本功夫。&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;xcode-select &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; /Applications/Xcode.app &lt;span class=&quot;c&quot;&gt;#路徑&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;在專案中鎖定-xcode-版本&quot;&gt;在專案中鎖定 Xcode 版本&lt;/h3&gt;

&lt;p&gt;我建議在發布 app 時使用 Fastlane，就可以用 &lt;a href=&quot;https://docs.fastlane.tools/actions/ensure_xcode_version/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ensure_xcode_version&lt;/code&gt;&lt;/a&gt; 來確保版本。&lt;/p&gt;

&lt;h3 id=&quot;確定-xcode-是沒有被動過手腳&quot;&gt;確定 Xcode 是沒有被動過手腳&lt;/h3&gt;

&lt;p&gt;你可能聽過 &lt;a href=&quot;https://zh.wikipedia.org/wiki/XcodeGhost风波&quot;&gt;XcodeGhost 事件&lt;/a&gt;。下載來路不明的 Xcode 是有可能抓到被駭過的版本。&lt;/p&gt;

&lt;p&gt;使用 Fastlane 的 &lt;a href=&quot;https://docs.fastlane.tools/actions/verify_xcode/#verify_xcode&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;verify_xcode&lt;/code&gt;&lt;/a&gt; 可以幫忙確認 Xcode 的 code sign，以及用 GateKeeper 檢查。&lt;/p&gt;

&lt;p&gt;想要自己跑指令的話，也可以參考&lt;a href=&quot;https://github.com/fastlane/fastlane/blob/master/fastlane/lib/fastlane/actions/verify_xcode.rb&quot;&gt;這裡&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;不過要注意的是，這個動作要跑好幾分鐘，比較建議是在出正式 Release 的 lane 再跑。&lt;/p&gt;

&lt;p&gt;另外，如果因為前述的向上相容，而改過 DeviceSupport 資料夾的話，驗證會失敗。&lt;/p&gt;

&lt;h3 id=&quot;我們到底要保留哪幾版-xcode&quot;&gt;我們到底要保留哪幾版 Xcode？&lt;/h3&gt;

&lt;p&gt;這完全是要看你手邊專案的狀況。三個版本不算誇張：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;前一個正式版，如果舊版 app 出了問題可能要回去看。比如說你舊版 app 的 Swift 版本是上一代&lt;/li&gt;
  &lt;li&gt;目前的正式版，用在最近上架更新的 app&lt;/li&gt;
  &lt;li&gt;最新的 beta 版，如果要使用一些新系統才有的 API&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;我以前也舉過一個&lt;a href=&quot;https://13h.tw/2018/04/09/modern-ios-dev-life.html&quot;&gt;例子&lt;/a&gt;。&lt;/p&gt;

&lt;h2 id=&quot;結論&quot;&gt;結論&lt;/h2&gt;

&lt;p&gt;iOS 開發者的電腦硬碟要買大一點，MacBook Pro 要 512 GB 以上。&lt;/p&gt;

&lt;p&gt;不是啦，講認真的：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;不要用 Mac App Store 安裝 Xcode，從官網的 &lt;a href=&quot;https://developer.apple.com/downloads/more&quot;&gt;More&lt;/a&gt; 下載，或透過 &lt;a href=&quot;https://github.com/xcpretty/xcode-install&quot;&gt;xcode-install&lt;/a&gt; 管理&lt;/li&gt;
  &lt;li&gt;弄清楚相容性測試的優先順序&lt;/li&gt;
  &lt;li&gt;可以透過 Fastlane 幫助團隊管理 Xcode 版本&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;同場加映&quot;&gt;同場加映&lt;/h2&gt;

&lt;h3 id=&quot;空間清理工具&quot;&gt;空間清理工具&lt;/h3&gt;

&lt;p&gt;每次更新開發裝置的 iOS 版本以後，記得把電腦上舊的 cache 給清除。身為 Xcode 使用者，一次清出幾十 GB 也是很常有的事。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;如果你偏好無腦解，&lt;a href=&quot;https://apps.apple.com/tw/app/devcleaner-for-xcode/id1388020431?mt=12&quot;&gt;DevCleaner&lt;/a&gt; 或 &lt;a href=&quot;https://github.com/waylybaye/XcodeCleaner-SwiftUI&quot;&gt;Cleaner for Xcode&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;如果你偏好自己來，&lt;a href=&quot;http://grandperspectiv.sourceforge.net&quot;&gt;GrandPerspective&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;跨版本安裝模擬器&quot;&gt;跨版本安裝模擬器&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;皮樂的&lt;a href=&quot;https://hiraku.tw/2019/09/4847/&quot;&gt;手動安裝 iOS 模擬器到 Xcode&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;我寫的&lt;a href=&quot;/2018/09/14/build-xcode9-app-run-xcode10-simulator.html&quot;&gt;在 Xcode 10 模擬器上跑 Xcode 9 build 的 app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;其他資料&quot;&gt;其他資料&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/ethanhuang13/status/1181897268363837440&quot;&gt;#我會刷掉&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/@ethanhuang13/從正式版-xcode-連到-beta-版裝置開發-d4a137c91618&quot;&gt;從 Xcode 正式版連到 iOS beta 版裝置&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://weakself.dev/episodes/0&quot;&gt;weak self 0: 如果你想要浪費一個人的暑假&lt;/a&gt; 這集有聊到開發者該怎麼分配 WWDC 到正式版上架這段期間的時間與資源&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://weakself.dev/episodes/9&quot;&gt;weak self 9: 帶你親臨 iPlayground 現場&lt;/a&gt; 最後一段有講到不要用 Mac App Store 安裝 Xcode&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://weakself.dev/episodes/13&quot;&gt;weak self 13: 喬喬 Erasure&lt;/a&gt; 前面有聊到 xcode-install&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://13h.tw/2018/04/09/modern-ios-dev-life.html&quot;&gt;Modern iOS dev life&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
				<pubDate>Fri, 01 Nov 2019 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2019/11/01/manage-xcode-versions.html</link>
				<guid isPermaLink="true">https://13h.tw/2019/11/01/manage-xcode-versions.html</guid>
			</item>
		
			<item>
				<title>iOS 也有深色模式—智慧型反相</title>
        <description>&lt;p&gt;2019/01/04 更新：&lt;/p&gt;

&lt;p&gt;這篇文章本來是寫在 iOS 12 時代，可以忽略了。現在請愛用 iOS 13 的 Dark Mode。&lt;/p&gt;

&lt;p&gt;2018/11/30 更新：&lt;/p&gt;

&lt;p&gt;如果要將整個 app 反向的話，不能用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UIView.appearance().accessibilityIgnoresInvertColors = true&lt;/code&gt; ，否則會遇到&lt;a href=&quot;http://www.openradar.me/radar?id=4963036246835200&quot;&gt;問題&lt;/a&gt;。官方回說可以在各個 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;viewController.view&lt;/code&gt; 做設定。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;rdar://45663655&quot;&gt;&lt;img src=&quot;/assets/img/2018-10-30-smart-invert-radar-reply.png&quot; alt=&quot;Don't do this in rdar://45663655&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;2016 年，Apple 給 tvOS 10 增加了深色主題設定（&lt;a href=&quot;https://developer.apple.com/documentation/uikit/uiuserinterfacestyle&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UIUserInterfaceStyle&lt;/code&gt;&lt;/a&gt;*）、2018 年 macOS 在 Mojave 也新增了深色模式，甚至連 Safari/WebKit 都可以告訴網站去支援深色模式（&lt;a href=&quot;https://webkit.org/blog/8475/release-notes-for-safari-technology-preview-68/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;prefers-color-scheme&lt;/code&gt;&lt;/a&gt;）。但是 iOS 一直沒有全系統的深色主題或設定。&lt;/p&gt;

&lt;p&gt;由於 iOS 的 UI 預設都是白底黑字或亮色系，大部分 app 如果不特別設計深色主題的話也就會是淺色，所以&lt;strong&gt;把螢幕顏色反過來&lt;/strong&gt;就是一個建立深色模式的思路💡。&lt;/p&gt;

&lt;p&gt;但是傳統的螢幕反相，就是單純地把輸出到螢幕的顏色反過來、黑白互換，類似於傳統底片的效果。遇到圖片就會慘不忍睹😂。直接拿來當深色模式是不堪用的。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;螢幕顏色反相的設定在輔助使用裡面存在已久，但是我唯一聽過的使用情境，就是還在用傳統底片的攝影師，用相機 app 搭配反相模式來看她沖洗好的負片。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;
&lt;p&gt;不過 iOS 11 新增了&lt;strong&gt;智慧型反相&lt;/strong&gt;輔助功能。智慧型反相把 iOS 主畫面與 app icon 保留原本的配色，只是稍微降低飽和度。同時，&lt;strong&gt;app 可以指定忽略哪些 UI 元件&lt;/strong&gt;。例如用來顯示圖片的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UIImageView&lt;/code&gt; 就不需要反相。對於大部分使用者來說，可以當作一個不錯的深色模式替代品。&lt;/p&gt;

&lt;p&gt;把智慧型反相當作深色模式來思考的話，除了圖片以外，底色是深色的畫面就可以忽略反相。如果 app 本來就是以暗色為主的介面，那就可以全部忽略。以我公司 CATCHPLAY 的 app 為例，我們的主題一向是深色為主，因此可以把所有的元件都忽略掉智慧型反相。&lt;/p&gt;

&lt;p&gt;要支援智慧型反相滿簡單的，就是把不要反相的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UIView&lt;/code&gt; 元件的 &lt;a href=&quot;https://developer.apple.com/documentation/uikit/uiview/2865843-accessibilityignoresinvertcolors&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessibilityIgnoresInvertColors&lt;/code&gt;&lt;/a&gt; 設為 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt; 即可。&lt;/p&gt;

&lt;p&gt;2018/11/30 更新：請不要這麼做🚫 &lt;del&gt;如果整個 app 都不要反相，在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UIApplicationDelegate&lt;/code&gt; 的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;didFinishLaunchingWithOptions&lt;/code&gt; 方法設定 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UIView.appearance().accessibilityIgnoresInvertColors = true&lt;/code&gt; 即可。&lt;/del&gt;&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;正常的顏色：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/2018-10-30-cp-normal.jpg&quot; alt=&quot;Normal&quot; /&gt;&lt;/p&gt;

&lt;p&gt;智慧型反相的預設結果，效果跟經典反相一樣：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/2018-10-30-enable-smart-invert.jpg&quot; alt=&quot;Enable Smart Invert&quot; /&gt;&lt;/p&gt;

&lt;p&gt;整個 app 的 UIView 都忽略經典反相，看起來大致相同。狀態列的顏色仍然是反過來的：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/2018-10-30-ignore-invert.jpg&quot; alt=&quot;Ignore Invert&quot; /&gt;&lt;/p&gt;

&lt;p&gt;如果在意狀態列顏色的話，可以監聽系統通知 &lt;a href=&quot;https://developer.apple.com/documentation/uikit/uiaccessibility/1615196-invertcolorsstatusdidchangenotif&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;invertColorsStatusDidChangeNotification&lt;/code&gt;&lt;/a&gt;，並用 &lt;a href=&quot;https://developer.apple.com/documentation/uikit/uiaccessibility/1615167-isinvertcolorsenabled&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UIAccessibility.isInvertColorsEnabled&lt;/code&gt;&lt;/a&gt; 來判斷使用者是否啟用反相，然後再指定狀態列的 style。這個判斷名稱雖然沒有寫 smart，但是我實測它只會在智慧型反相時回傳 true，在經典反相時則回傳 false。&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;雖然說叫做智慧型反相，其實也沒有多智慧🤣，就是可以指定部分 UI 元件不要反相而已。也許你還會想，既然照片的顏色顛倒不堪用，為什麼智慧型反相時，系統沒有預設把 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UIImageView&lt;/code&gt; 忽略掉呢？大概是因為 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UIImageView&lt;/code&gt; 可以用來顯示照片，也可以用來顯示圖形按鈕。即使 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UIImage&lt;/code&gt; 有 &lt;a href=&quot;https://developer.apple.com/documentation/uikit/uiimage/1624122-renderingmode&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;renderingMode&lt;/code&gt;&lt;/a&gt; 也不容易判斷，乾脆讓開發者自己決定。就像其他 accessibility 功能一樣，系統可以猜到大概，最後細節還是要留給開發者。&lt;/p&gt;

&lt;p&gt;但這也導致絕大多數 app 的圖片在智慧型反相預設情況下很可怕，就連 iOS 11 初期版本的 WebView 與郵件也沒&lt;a href=&quot;https://support.apple.com/en-us/HT208067#113&quot;&gt;支援正確的照片顏色&lt;/a&gt;。開發者應該檢查一下自家的 app 在智慧型反相下的效果。&lt;/p&gt;

&lt;p&gt;最後提供一個開發或測試的時候的小技巧，可以在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;系統設定&lt;/code&gt;➡️&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;一般&lt;/code&gt;➡️&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;輔助使用&lt;/code&gt;➡️最下面的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;輔助使用快速鍵&lt;/code&gt;勾選&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;智慧型反相&lt;/code&gt;，這樣按三下裝置的實體按鈕，就可以快速切換。控制中心也可以放入&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;輔助使用快速鍵&lt;/code&gt;項目。&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;補充資料：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;*iOS 12 也新增了跟 tvOS 10 一樣的&lt;a href=&quot;https://developer.apple.com/documentation/uikit/uiuserinterfacestyle&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UIUserInterfaceStyle&lt;/code&gt;&lt;/a&gt;，但是沒有作用。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;開啟智慧型反相時，在裝置上螢幕截圖還是會截出正常的圖片。如果要截圖的話要接上電腦用 Quick Time 來抓。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessibilityIgnoresInvertColors&lt;/code&gt; 也可以在 Interface Builder 設定，在 User Defined Runtime Attributes 新增 keyPath 並設為 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt; 即可。細節可參考&lt;a href=&quot;https://duan.ca/2017/12/20/smart-invert-support-for-you-app/&quot;&gt;這篇文章&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
</description>
				<pubDate>Tue, 30 Oct 2018 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2018/10/30/smart-invert.html</link>
				<guid isPermaLink="true">https://13h.tw/2018/10/30/smart-invert.html</guid>
			</item>
		
			<item>
				<title>iOS 12 Adoption</title>
        <description>&lt;p&gt;Now that iOS 12 has been released for three weeks, let’s take a look at its adoption.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/2018-10-09-ios12-adoption-mixpanel.png&quot; alt=&quot;iOS 12 adoption by Mixpanel on 10/9&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The table lists how many days does each version (since iOS 7) took to &lt;strong&gt;passed 25%&lt;/strong&gt;, &lt;strong&gt;its previous version&lt;/strong&gt;, &lt;strong&gt;50%&lt;/strong&gt;, and &lt;strong&gt;75%&lt;/strong&gt;. The &lt;strong&gt;Final%&lt;/strong&gt; means its adoption date at the day its next version released.&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Version&lt;/td&gt;
      &lt;td&gt;Release&lt;/td&gt;
      &lt;td&gt;25%&lt;/td&gt;
      &lt;td&gt;Cross&lt;/td&gt;
      &lt;td&gt;50%&lt;/td&gt;
      &lt;td&gt;75%&lt;/td&gt;
      &lt;td&gt;Final %&lt;/td&gt;
      &lt;td&gt;Source&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;iOS 12&lt;/td&gt;
      &lt;td&gt;2018/9/17&lt;/td&gt;
      &lt;td&gt;6️⃣ +10&lt;/td&gt;
      &lt;td&gt;4️⃣ +17&lt;/td&gt;
      &lt;td&gt;4️⃣ +19&lt;/td&gt;
      &lt;td&gt;?&lt;/td&gt;
      &lt;td&gt;?&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://mixpanel.com/trends/#report/ios_12&quot;&gt;📈&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;iOS 11&lt;/td&gt;
      &lt;td&gt;2017/9/19&lt;/td&gt;
      &lt;td&gt;5️⃣ +7&lt;/td&gt;
      &lt;td&gt;5️⃣ +20&lt;/td&gt;
      &lt;td&gt;5️⃣ +26&lt;/td&gt;
      &lt;td&gt;4️⃣ +90&lt;/td&gt;
      &lt;td&gt;🥉 90.81%&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://mixpanel.com/trends/#report/ios_11&quot;&gt;📈&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;iOS 10&lt;/td&gt;
      &lt;td&gt;2016/9/13&lt;/td&gt;
      &lt;td&gt;4️⃣ +4&lt;/td&gt;
      &lt;td&gt;🥉 +16&lt;/td&gt;
      &lt;td&gt;🥉 +18&lt;/td&gt;
      &lt;td&gt;🥉 +89&lt;/td&gt;
      &lt;td&gt;🥈 91.27%&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://mixpanel.com/trends/#report/ios_10&quot;&gt;📈&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;iOS 9&lt;/td&gt;
      &lt;td&gt;2015/9/16&lt;/td&gt;
      &lt;td&gt;🥈 +3&lt;/td&gt;
      &lt;td&gt;🥈 +8&lt;/td&gt;
      &lt;td&gt;🥈 +11&lt;/td&gt;
      &lt;td&gt;🥈 +68&lt;/td&gt;
      &lt;td&gt;5️⃣ 86.36%&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://mixpanel.com/trends/#report/ios_9&quot;&gt;📈&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;iOS 8&lt;/td&gt;
      &lt;td&gt;2014/9/17&lt;/td&gt;
      &lt;td&gt;🥈 +3&lt;/td&gt;
      &lt;td&gt;6️⃣ +27&lt;/td&gt;
      &lt;td&gt;6️⃣ +32&lt;/td&gt;
      &lt;td&gt;5️⃣ +146&lt;/td&gt;
      &lt;td&gt;4️⃣ 90.50%&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://mixpanel.com/trends/#report/ios_8&quot;&gt;📈&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;iOS 7&lt;/td&gt;
      &lt;td&gt;2013/9/18&lt;/td&gt;
      &lt;td&gt;🥇 +1&lt;/td&gt;
      &lt;td&gt;🥇 +3&lt;/td&gt;
      &lt;td&gt;🥇 +3&lt;/td&gt;
      &lt;td&gt;🥇 +33&lt;/td&gt;
      &lt;td&gt;🥇 95.06%&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://mixpanel.com/trends/#report/ios_7&quot;&gt;📈&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;blockquote&gt;
  &lt;p&gt;Data collected from &lt;a href=&quot;https://mixpanel.com/trends/&quot;&gt;Mixpanel Trends&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;iOS 12&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;2018/09/17: Official released&lt;/li&gt;
  &lt;li&gt;2018/09/27: Passed 25% after 10 days. The slowest since iOS 7 🙃&lt;/li&gt;
  &lt;li&gt;2018/10/04: Passed iOS 11 after 17 days. It’s the 4️⃣th since iOS 7&lt;/li&gt;
  &lt;li&gt;2018/10/06: Passed 50% after 19 days. Also the 4️⃣th&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are numerous factors contributing to the trends and I don’t plan to discuss here. However, while iOS 12 is probably the most stable version in recent years, its adoption rate is not growing the fastest compared to iOS history. It’s still remarkable that an OS with this large user base has half user upgrade within three weeks.&lt;/p&gt;
</description>
				<pubDate>Tue, 09 Oct 2018 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2018/10/09/ios12-adoption.html</link>
				<guid isPermaLink="true">https://13h.tw/2018/10/09/ios12-adoption.html</guid>
			</item>
		
			<item>
				<title>身為 iOS 工程師不該錯過的 iPlayground</title>
        <description>&lt;blockquote&gt;
  &lt;p&gt;最近台灣的 iOS 開發界有一個大事，就是即將在 10/20-21 在台大舉辦的開發者研討會 &lt;a href=&quot;https://iplayground.io&quot;&gt;iPlayground&lt;/a&gt;。身為宣傳組的一員，我多半是用官方帳號小編的名義在做介紹。但我今天想用個人的角度談談 iPlayground，它的意義、以及為何你應該來參加。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;我學習開發 iOS 已經超過五年。由於不是資訊相關科系出身，完全不認識其他同行，也沒有業界的朋友，前三年幾乎是自己在摸索。任職的公司 &lt;a href=&quot;https://www.catchplay.com/&quot;&gt;CATCHPLAY&lt;/a&gt; 願意栽培，2016 年送我去舊金山參加 WWDC。孤身一人踏上美國國土闖盪很有意思，但是我從頭到尾沒有遇到任何台灣人，吸收相對有限，也沒那麼好玩（而且，舊金山 6 月很冷）。&lt;/p&gt;

&lt;p&gt;一直到 2016 年底我寫了一個開源的 app 叫 &lt;a href=&quot;https://github.com/ethanhuang13/blahker&quot;&gt;Blahker&lt;/a&gt;（專擋蓋版廣告，你可能有用過）。被 &lt;a href=&quot;https://www.facebook.com/groups/cocoaheads.taipei/&quot;&gt;CocoaHeads Taipei&lt;/a&gt; 的成員 &lt;a href=&quot;https://www.facebook.com/oobe.tw&quot;&gt;Vincent&lt;/a&gt; 邀請去分享。在那之前我都只是在網路上觀望，也不知道自己程式的實力如何。但就是那一次，我遇見了許多有趣的人，獲得許多迴響，也發現自己其實有一些特色是可以跟社群中的大家分享的。&lt;/p&gt;

&lt;p&gt;有些軟體工程師寧可面對電腦也不願意面對人群。但是加入軟體開發的社群（任何形式的），對於個人只會有好處。我對自我學習能力很有自信，不過增加了社群參與以後，學習速度還會倍增。有問題你可以找人問、有可能從別人的分享中找到靈感，絕大部分的 bonus 都不是你個人的職涯規劃可以料想得到的。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;比如說… 2017、2018 這兩年我就跟大家一起去 WWDC，玩得很開心。Apple 推了什麼新功能新技術，可以聽到不同的評論角度，觀點會跟更多元。有時候還湊熱鬧跑 lab 挑戰蘋果的工程師、甚至一起看個 NBA。上個月還去了東京參加 iOSDC。平時鑽研一些技術或是工作遇到的問題，隨便 PO 在 Facebook、Twitter 上就會有人神來一筆的回答。我&lt;a href=&quot;https://github.com/ethanhuang13/CupertinoJWT&quot;&gt;最近一個開源專案&lt;/a&gt; 如果不是 &lt;a href=&quot;https://twitter.com/yllan&quot;&gt;@yllan&lt;/a&gt; 跟我在 &lt;a href=&quot;https://twitter.com/yllan/status/1028232124124385280&quot;&gt;Twitter 上往返&lt;/a&gt;，我可能兩個月也寫不出來。還有&lt;a href=&quot;https://github.com/ethanhuang13/knil&quot;&gt;前前一個開源專案&lt;/a&gt; 也是在跟 &lt;a href=&quot;https://twitter.com/zonble&quot;&gt;@zonble&lt;/a&gt; 討論事情時想到的點子… 這裡不是要廣告自己的東西就不多說了。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;iPlayground 是一群熱血的 iOS 工程師個人自發創立的，背後不是任何公司主導。這群人因為出國參加過 WWDC、iOSDC 等大型研討會，看到技術社群的價值、又發現台灣根本沒有這樣的活動，所以自己跳出來做，有一些成員還是因為一起籌備活動才認識的。期待它在台灣變成一個串連水果系技術資源交流、工程師人脈與求職、企業人力資源等各方面需求的平台。我們背後都是來自不同的公司，也沒有收益的目標（相反地，就算賠點錢還是想把這樣的平台做起來）。&lt;/p&gt;

&lt;hr /&gt;
&lt;blockquote&gt;
  &lt;p&gt;你可以看看我們總召 &lt;a href=&quot;https://www.facebook.com/hokilaj&quot;&gt;hokila&lt;/a&gt; 的&lt;a href=&quot;https://www.facebook.com/groups/cocoaheads.taipei/permalink/1892883187464626/&quot;&gt;真誠介紹&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/2018-10-01-iplayground-hokila.png&quot; alt=&quot;iPlayground by Hokila&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;iPlayground 的票價是兩千元，因為在台北舉辦，場地就佔了很高的成本。坦白說由於第一次辦、經驗有限，我們犯了不少錯誤，包括時程安排、宣傳、預算規劃都有改進空間。但是就目前最重要的部分&lt;strong&gt;議程&lt;/strong&gt;（見&lt;a href=&quot;https://iplayground.io&quot;&gt;官網&lt;/a&gt;）來看我個人相當滿意。在台灣 iOS 開發圈你可以想得到的許多重要人物都出現在我們的講者名單上，他們也跟團隊成員一樣不支薪，是基於熱情來跟大家分享。我敢說任何去過 iOS 專門技術研討會的 iOS 開發者，一眼就可以看出這些議程跟這場活動的價值。甚至覺得物超所值。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;WWDC 的票價就 1599 鎂，還不計算交通食宿。就算去東京參加 iOSDC 也要機票啊。而且只有在台灣舉辦你才能用熟悉的語言與大家交流。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;如果沒參加過 iOS 研討會，這其實只是稍微離開自己的舒適圈一點點而已，卻有莫大收穫。就算只參加半天，也是值得。&lt;/p&gt;

&lt;p&gt;最後必須提醒，由於活動僅剩三週，眼下看似還有一百多張票可能轉瞬就消失。所以有一點心動還是&lt;a href=&quot;https://iplayground.kktix.cc/events/iplayground2018&quot;&gt;趕快行動&lt;/a&gt;吧。&lt;/p&gt;

&lt;h1 id=&quot;你還在猶豫是因為你想要&quot;&gt;&lt;strong&gt;你還在猶豫是因為你想要！&lt;/strong&gt;&lt;/h1&gt;
</description>
				<pubDate>Mon, 01 Oct 2018 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2018/10/01/dont-miss-iplayground.html</link>
				<guid isPermaLink="true">https://13h.tw/2018/10/01/dont-miss-iplayground.html</guid>
			</item>
		
			<item>
				<title>iPhone XS Max 與 Xcode 9 相容性分析</title>
        <description>&lt;p&gt;iPhone XS / XS Max 開賣當天我跟同事 &lt;a href=&quot;https://twitter.com/HsuToby&quot;&gt;Toby&lt;/a&gt; 有拿到 Max 來做測試。如同他&lt;a href=&quot;https://medium.com/@tobyhsu/xcode-9-10-build-出的-app-在-iphone-max-的差異-1-f60062d5a7c2&quot;&gt;分享的文章&lt;/a&gt;，iPhone XS Max 在跑 iOS 11 SDK (Xcode 9) build 的 app 會用&lt;strong&gt;放大模式&lt;/strong&gt;來顯示。&lt;/p&gt;

&lt;p&gt;這個放大模式怎麼來的呢？就是根據 iPhone X 的顯示內容。因為兩個螢幕的長寬比一樣，所以內容是等比例放大的。仔細比較一下還發現更多的細節。先講結論：&lt;/p&gt;

&lt;p&gt;iPhone XS Max 在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;系統設定 &amp;gt; 螢幕顯示與亮度 &amp;gt; 顯示畫面&lt;/code&gt;設定為&lt;strong&gt;放大模式&lt;/strong&gt;時，不管是用哪一版的 SDK build，app 的顯示內容都會跟 iPhone X 一樣，只有&lt;strong&gt;狀態列&lt;/strong&gt;會略有不同。而在&lt;strong&gt;一般模式&lt;/strong&gt;時，app 必須用 Xcode 10 才能在 XS Max 上顯示原生解析度。&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;以下影片是 &lt;a href=&quot;https://github.com/ethanhuang13/knil&quot;&gt;Knil&lt;/a&gt; 這個 app* 分別在五種狀態下的樣貌，可以注意到 1~4 的顯示內容相同，只有狀態列不同。而 5 則是原生解析度。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;iPhone X&lt;/li&gt;
  &lt;li&gt;iPhone XS Max, Xcode 9 (iOS 11 SDK), 放大模式&lt;/li&gt;
  &lt;li&gt;iPhone XS Max, Xcode 10 (iOS 12 SDK), 放大模式&lt;/li&gt;
  &lt;li&gt;iPhone XS Max, Xcode 9 (iOS 11 SDK), 標準模式&lt;/li&gt;
  &lt;li&gt;iPhone XS Max, Xcode 10 (iOS 12 SDK), 標準模式&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/2018-09-21-iphonex-xsmax-compare-1080p.mov&quot; alt=&quot;iPhone X &amp;amp; XS Max compare&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;另外一點，A12 晶片用了一個叫做 &lt;strong&gt;arm64e&lt;/strong&gt; 的新 architecture ，用 Xcode 9 要 build &amp;amp; run 到 XS Max 上會顯示以下資訊：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/2018-09-21-arm64e_error.png&quot; alt=&quot;Xcode 9 run on iPhone XS Max&quot; /&gt;&lt;/p&gt;

&lt;p&gt;依照錯誤訊息在 build setting 加上 arm64e 也沒用，因為 Xcode 9 就是不支援。&lt;/p&gt;

&lt;p&gt;結論就是，如果要支援 iPhone XS Max 的原生解析度或是進行 Max 的實機開發，一定要用 Xcode 10（廢話🤣）。但如果暫時還維持 Xcode 9 的話，使用者會看到 iPhone X 放大版的內容。放大的程度並不明顯，不仔細看是看不出來的。&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;* &lt;a href=&quot;https://github.com/ethanhuang13/knil&quot;&gt;Knil&lt;/a&gt; 是我撰寫的開源且免費的 Universal Links 測試工具&lt;/p&gt;
</description>
				<pubDate>Fri, 21 Sep 2018 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2018/09/21/iphone-xs-max-xcode9.html</link>
				<guid isPermaLink="true">https://13h.tw/2018/09/21/iphone-xs-max-xcode9.html</guid>
			</item>
		
			<item>
				<title>接收 GitHub 即時通知 - Canopy</title>
        <description>&lt;p&gt;GitHub 一直都沒有推送的功能。是有 Webhook 可用，很多人可能是用 Slack 接 Webhook 來接收通知的。不過如果參與的開源專案比較多，一個一個設定 Webhook 就太麻煩了。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://codebasesaga.com/canopy/&quot;&gt;Canopy&lt;/a&gt; 是用來在 macOS 與 iOS 上接收 GitHub 通知的工具。作者是 Max Howell (&lt;a href=&quot;https://twitter.com/mxcl&quot;&gt;@mxcl&lt;/a&gt;)。如果你不知道 Max 是誰，他就是 &lt;a href=&quot;https://brew.sh&quot;&gt;Homebrew&lt;/a&gt; 與 &lt;a href=&quot;https://www.github.com/mxcl/PromiseKit&quot;&gt;PromiseKit&lt;/a&gt; 的作者。他本人說，GitHub 推送通知的功能他等了十年也沒等到。對於開源專案來說，漏掉重要訊息太傷了，乾脆自己來寫一個。&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;zh-tw&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;For 10 years I’ve wanted an app that does push notifications for GitHub. For 10 years there has been nothing. So this year, fed up with not being able to respond to important events in realtime, I wrote the app. Free for open source, check it out. &lt;a href=&quot;https://t.co/L2mv2v91Kk&quot;&gt;https://t.co/L2mv2v91Kk&lt;/a&gt;&lt;/p&gt;&amp;mdash; Max Howell (@mxcl) &lt;a href=&quot;https://twitter.com/mxcl/status/1037015212715638785?ref_src=twsrc%5Etfw&quot;&gt;2018年9月4日&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;blockquote&gt;
  &lt;p&gt;9 月剛推出 v1.0，還熱騰騰&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;
&lt;p&gt;&lt;a href=&quot;https://codebasesaga.com/canopy/&quot;&gt;Canopy&lt;/a&gt; 的 &lt;a href=&quot;https://itunes.apple.com/us/app/canopy/id1419224245?ls=1&amp;amp;mt=8&quot;&gt;macOS 版&lt;/a&gt; 在 Mac App Store 可免費下載，&lt;a href=&quot;https://itunes.apple.com/us/app/canopy-real-time-development/id1420665080?ls=1&amp;amp;mt=8&quot;&gt;iOS 版&lt;/a&gt; 則是 4.99 USD，支援&lt;strong&gt;開源專案&lt;/strong&gt;的即時訊息，像是：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Commit&lt;/li&gt;
  &lt;li&gt;New issue&lt;/li&gt;
  &lt;li&gt;New pull request&lt;/li&gt;
  &lt;li&gt;Issue reply&lt;/li&gt;
  &lt;li&gt;Star&lt;/li&gt;
  &lt;li&gt;Follow&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果要支援&lt;strong&gt;私人專案&lt;/strong&gt;的通知，則要另外付費訂閱服務。這種設計跟 GitHub 的方案一樣，是鼓勵開源專案的。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/2018-09-20-canopy_mac.png&quot; alt=&quot;Canopy macOS&quot; /&gt;&lt;/p&gt;

&lt;p&gt;介面很簡單，可以輕易地勾選要接收通知的專案。值得一提的是兩個版本是會同步的，我第一次打開 iOS app 就看到 Mac 登入好的設定，非常貼心。😍&lt;/p&gt;

&lt;p&gt;（小插曲，我第一次打開 iOS app 其實有遇到通知權限沒有被詢問的 bug，&lt;a href=&quot;https://twitter.com/mxcl/status/1041855219523612672&quot;&gt;回報作者&lt;/a&gt;以後他也馬上修好了。⚡️）&lt;/p&gt;

&lt;p&gt;如果你仔細看官網的 &lt;a href=&quot;https://codebasesaga.com/canopy/#faq&quot;&gt;FAQ&lt;/a&gt; 會發現竟然有這麼多注意事項，感嘆這麼基本的需求，GitHub 官方竟然搞得這麼麻煩。😓&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;我平時常在 GitHub 上維護或參與的專案超過五個，雖然沒有很頻繁的消息，但是有時候收到&lt;a href=&quot;https://www.ptt.cc/bbs/C_Chat/M.1535982250.A.309.html&quot;&gt;貼五芒星&lt;/a&gt;的通知，感覺也是不錯啦。🤣&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/2018-09-20-canopy_ios_notification.png&quot; alt=&quot;Canopy iOS Notification&quot; /&gt;&lt;/p&gt;

&lt;p&gt;另外就是像我這個 blog 是架在 &lt;a href=&quot;https://pages.github.com&quot;&gt;github.io&lt;/a&gt;，每次 commit 跟 jekyll deploy 也會有通知，十分好用。&lt;/p&gt;

&lt;p&gt;推薦給需要接收 GitHub 即時資訊的朋友。&lt;/p&gt;
</description>
				<pubDate>Thu, 20 Sep 2018 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2018/09/20/canopy.html</link>
				<guid isPermaLink="true">https://13h.tw/2018/09/20/canopy.html</guid>
			</item>
		
			<item>
				<title>iOS 12 相關技術新知</title>
        <description>&lt;p&gt;iOS 12 的新消息自從 WWD18 以後已經很多了。以下是 iOS 12 正式發表之際的資訊：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://developer.apple.com/documentation/ios_release_notes/ios_12_release_notes/foundation_release_notes&quot;&gt;Foundation Release Notes&lt;/a&gt; 提到 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NSCoding&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UserDefaults&lt;/code&gt; 等的變更&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.apple.com/business/site/docs/iOS_Security_Guide.pdf&quot;&gt;iOS 12 Security&lt;/a&gt; 是每年更新的安全白皮書。這是第一次跟 iOS 正式版一起發表&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://swift.org/blog/swift-4-2-released/&quot;&gt;Swift 4.2&lt;/a&gt; 正式發表。另外可參考 Ole 的 &lt;a href=&quot;https://github.com/ole/whats-new-in-swift-4-2&quot;&gt;What’s new in Swift 4.2 Playground&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/rmondello/status/1041735960386367488&quot;&gt;Safari、iCloud Keychain、WebKit 新功能推文串&lt;/a&gt; - 這串推文是 Apple 員工自己寫的，有很多小地方更新值得快速複習一下&lt;/li&gt;
  &lt;li&gt;你應該已經看過的 &lt;a href=&quot;https://developer.apple.com/news/?id=09132018a&quot;&gt;New Apple Developer Videos&lt;/a&gt;，連同 iPhone XS 等新機一起推出&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://nshipster.com/ios-12/&quot;&gt;NSHipster&lt;/a&gt; 的 iOS 12 專文講到一些冷僻的 API，像是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;URLRequest.networkServiceType&lt;/code&gt; 的新選項、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLLocationManager.activityType&lt;/code&gt; 新增了飛行模式✈️。值得一讀&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;另外還有一些 apps 的更新：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://itunes.apple.com/tw/app/%E6%8D%B7%E5%BE%91/id915249334?mt=8&quot;&gt;Shortcuts.app&lt;/a&gt;（中文翻成捷徑）已上架並取代 Workflow.app&lt;/li&gt;
  &lt;li&gt;MacStories 寫的 &lt;a href=&quot;https://www.macstories.net/news/pages-keynote-and-numbers-add-siri-shortcuts-support-and-more/&quot;&gt;iWork 更新資訊&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://itunes.apple.com/tw/app/1password-password-manager/id568903335?mt=8&quot;&gt;1Password&lt;/a&gt; 跟 &lt;a href=&quot;https://itunes.apple.com/tw/app/lastpass-%E5%AF%86%E7%A2%BC%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7/id324613447?mt=8&quot;&gt;LastPass&lt;/a&gt; 已支援 iOS 12 的自動填寫密碼鍵盤⌨️功能&lt;/li&gt;
&lt;/ul&gt;
</description>
				<pubDate>Tue, 18 Sep 2018 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2018/09/18/ios12-tech-news.html</link>
				<guid isPermaLink="true">https://13h.tw/2018/09/18/ios12-tech-news.html</guid>
			</item>
		
			<item>
				<title>fastlane.ci 停止開發</title>
        <description>&lt;p&gt;4 月提到的 &lt;a href=&quot;https://github.com/fastlane/ci&quot;&gt;fastlane.ci&lt;/a&gt; 現在已停止開發。😅&lt;/p&gt;

&lt;p&gt;說明：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;As we were building fastlane.ci we realized that it wasn’t going to cover all the requirements we wanted to support. We are currently in the process of re-evaluating our approach and are actively working on a better solution, &lt;a href=&quot;https://tinyletter.com/fastlane-tools&quot;&gt;subscribe here to be the first one to be notified about any upcoming launches&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;還在等待的朋友可以去找別的解決方案了。&lt;/p&gt;
</description>
				<pubDate>Tue, 18 Sep 2018 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2018/09/18/fastlaneci.html</link>
				<guid isPermaLink="true">https://13h.tw/2018/09/18/fastlaneci.html</guid>
			</item>
		
			<item>
				<title>iOS 12 普及率預測與觀察</title>
        <description>&lt;p&gt;請見&lt;a href=&quot;/2018/10/09/ios12-adoption.html&quot;&gt;10/9 的更新&lt;/a&gt;。&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;今年 WWDC 發表 iOS 12 beta 版以後，由於效能優化的評價良好，基於口碑效應，我就跟人家說這可能會是有史以來升級最快的一版。&lt;/p&gt;

&lt;p&gt;不過不能只是說說而已，「最快」要怎麼衡量呢？&lt;/p&gt;

&lt;p&gt;我的操作型定義是：&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;從 iOS 7 開始算起，用 &lt;a href=&quot;https://mixpanel.com/trends/&quot;&gt;Mixpanel Trends&lt;/a&gt; 的數據，觀察過去幾年每一版 iOS 正式版開放下載到市占率超過前一版所花的天數。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;以下表格是我根據數據整理出來的：&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Version&lt;/td&gt;
      &lt;td&gt;Release&lt;/td&gt;
      &lt;td&gt;25%&lt;/td&gt;
      &lt;td&gt;Cross&lt;/td&gt;
      &lt;td&gt;50%&lt;/td&gt;
      &lt;td&gt;75%&lt;/td&gt;
      &lt;td&gt;Final %&lt;/td&gt;
      &lt;td&gt;Source&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;iOS 12&lt;/td&gt;
      &lt;td&gt;2018/9/17&lt;/td&gt;
      &lt;td&gt;6️⃣ +10&lt;/td&gt;
      &lt;td&gt;4️⃣ +17&lt;/td&gt;
      &lt;td&gt;4️⃣ +19&lt;/td&gt;
      &lt;td&gt;?&lt;/td&gt;
      &lt;td&gt;?&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://mixpanel.com/trends/#report/ios_12&quot;&gt;📈&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;iOS 11&lt;/td&gt;
      &lt;td&gt;2017/9/19&lt;/td&gt;
      &lt;td&gt;5️⃣ +7&lt;/td&gt;
      &lt;td&gt;5️⃣ +20&lt;/td&gt;
      &lt;td&gt;5️⃣ +26&lt;/td&gt;
      &lt;td&gt;4️⃣ +90&lt;/td&gt;
      &lt;td&gt;🥉 90.81%&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://mixpanel.com/trends/#report/ios_11/from_date:-381,report_unit:day,to_date:-201&quot;&gt;📈&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;iOS 10&lt;/td&gt;
      &lt;td&gt;2016/9/13&lt;/td&gt;
      &lt;td&gt;4️⃣ +4&lt;/td&gt;
      &lt;td&gt;🥉 +16&lt;/td&gt;
      &lt;td&gt;🥉 +18&lt;/td&gt;
      &lt;td&gt;🥉 +89&lt;/td&gt;
      &lt;td&gt;🥈 91.27%&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://mixpanel.com/trends/#report/ios_10/from_date:-746,report_unit:day,to_date:-566&quot;&gt;📈&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;iOS 9&lt;/td&gt;
      &lt;td&gt;2015/9/16&lt;/td&gt;
      &lt;td&gt;🥈 +3&lt;/td&gt;
      &lt;td&gt;🥈 +8&lt;/td&gt;
      &lt;td&gt;🥈 +11&lt;/td&gt;
      &lt;td&gt;🥈 +68&lt;/td&gt;
      &lt;td&gt;5️⃣ 86.36%&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://mixpanel.com/trends/#report/ios_9/from_date:-1112,report_unit:day,to_date:-931&quot;&gt;📈&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;iOS 8&lt;/td&gt;
      &lt;td&gt;2014/9/17&lt;/td&gt;
      &lt;td&gt;🥈 +3&lt;/td&gt;
      &lt;td&gt;6️⃣ +27&lt;/td&gt;
      &lt;td&gt;6️⃣ +32&lt;/td&gt;
      &lt;td&gt;5️⃣ +146&lt;/td&gt;
      &lt;td&gt;4️⃣ 90.50%&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://mixpanel.com/trends/#report/ios_8/from_date:-1477,report_unit:day,to_date:-1297&quot;&gt;📈&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;iOS 7&lt;/td&gt;
      &lt;td&gt;2013/9/18&lt;/td&gt;
      &lt;td&gt;🥇 +1&lt;/td&gt;
      &lt;td&gt;🥇 +3&lt;/td&gt;
      &lt;td&gt;🥇 +3&lt;/td&gt;
      &lt;td&gt;🥇 +33&lt;/td&gt;
      &lt;td&gt;🥇 95.06%&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://mixpanel.com/trends/#report/ios_7/from_date:-1842,report_unit:day,to_date:-1721&quot;&gt;📈&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;Cross&lt;/strong&gt; 欄是該版正式開放直到與前一版黃金交叉所花的天數。&lt;strong&gt;Final %&lt;/strong&gt; 欄是該版本的下一版正式開放前夕的市占率。&lt;strong&gt;Source&lt;/strong&gt; 欄要注意的是 Mixpanel 網址所帶日期參數為相對數字。&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;表格剛出來就打臉自己了😅。看到 &lt;strong&gt;iOS 7&lt;/strong&gt; 這種輝煌的成績，未來除非是 UI 風格大改版，應該是難以突破了啦🤪。&lt;/p&gt;

&lt;p&gt;第二名的 &lt;strong&gt;iOS 9&lt;/strong&gt; 也相當驚人，那一版的助力應該是大幅縮小升級所需的容量（在那個 16 GB 為基本款的年代），加上續航力大幅提升🔋，最為有感。&lt;/p&gt;

&lt;p&gt;影響使用者升級的因素很多，其中一個是口碑*。&lt;strong&gt;iOS 12&lt;/strong&gt; 的口碑就是跑起來明顯順很多，連比較舊的機種也變快了。衝著這一點，許多使用者應該是迫不及待升級才是。&lt;/p&gt;

&lt;p&gt;如果這點成立的話，那我猜 &lt;del&gt;iOS 12 跨過 11 的黃金交叉應該不會輸給 iOS 9 的 8 天太多才是&lt;/del&gt;。&lt;/p&gt;

&lt;p&gt;本文寫在 iOS 12 正式開放下載當天。待續…&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;* 另一個可能是出了新的 emoji 🤣&lt;/p&gt;
</description>
				<pubDate>Mon, 17 Sep 2018 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2018/09/17/ios12-adoption-rate.html</link>
				<guid isPermaLink="true">https://13h.tw/2018/09/17/ios12-adoption-rate.html</guid>
			</item>
		
			<item>
				<title>在 Xcode 10 模擬器上跑 Xcode 9 build 的 app</title>
        <description>&lt;p&gt;如果還不急著切換到 Xcode 10，可以使用這個技巧來測試 Xcode 9 build 出來的 app，跑在 iPhone XS Max / XR 模擬器的情況：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;用 Xcode 9 選一個模擬器為目標來 build&lt;/li&gt;
  &lt;li&gt;在 Products/OOO.app 上按右鍵、Show in Finder&lt;/li&gt;
  &lt;li&gt;打開 Xcode 10 的 Simulator app，Hardware 選 XS Max 或 XR&lt;/li&gt;
  &lt;li&gt;從 Finder 裡把 OOO.app 拖拉到上述的 Simulator 視窗裡（會安裝）&lt;/li&gt;
  &lt;li&gt;點開 app 來觀察狀況&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;以上方法來自&lt;a href=&quot;https://medium.com/@hacknicity/ipad-navigation-bar-and-toolbar-height-changes-in-ios-12-91c5766809f4&quot;&gt;這篇文章&lt;/a&gt;的 Wait, What Did You Say? 那一段。&lt;/p&gt;
</description>
				<pubDate>Fri, 14 Sep 2018 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2018/09/14/build-xcode9-app-run-xcode10-simulator.html</link>
				<guid isPermaLink="true">https://13h.tw/2018/09/14/build-xcode9-app-run-xcode10-simulator.html</guid>
			</item>
		
			<item>
				<title>發表會後搶先版：iPhone XS Max 與 XR 開發注意事項</title>
        <description>&lt;p&gt;2018 蘋果秋季發表會在 9/13 結束了。iOS 開發工作要注意什麼？&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://developer.apple.com/news/?id=09132018a&amp;amp;1536874161&quot;&gt;新裝置的官方的教學影片系列&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://developer.apple.com/design/whats-new/?id=09122018b&quot;&gt;更新版的 HIG&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;iOS 12 GM 已開放&lt;a href=&quot;https://developer.apple.com/download/&quot;&gt;下載&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Xcode 10 GM 已開放&lt;a href=&quot;https://developer.apple.com/download/&quot;&gt;下載&lt;/a&gt;，可以升級到 Swift 4.2 了&lt;/li&gt;
  &lt;li&gt;可以用 iOS 12 SDK 上傳至 App Store 了&lt;/li&gt;
  &lt;li&gt;如果要上傳新版，原來是 iPhone X 的 5.8 吋的可選截圖已增加 6.5 吋，如果上傳 6.5 吋會自動產出 5.8 吋版本&lt;/li&gt;
  &lt;li&gt;Build 自己的 app 試跑 iPhone XS Max 跟 XR 看 UI 是否正常。例如這種同時有橫版、home indicator、瀏海的排版。&lt;a href=&quot;https://twitter.com/arekholko/status/1040148459595153408&quot;&gt;參考&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;這兩款的螢幕不同但是 pt 相同，設計時可視為同一種尺寸。XR 要 10 月才開賣。基本上支援好 XS Max 就可以了&lt;/li&gt;
  &lt;li&gt;iOS 11 SDK 有支援上述兩款新機的解析度，所以如果你的 app 是用 Auto Layout 而不是寫死來支援 iPhone X 的話，還不需要急著重新上傳 App Store。&lt;a href=&quot;https://twitter.com/stroughtonsmith/status/1039991196800741377&quot;&gt;來源&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;iPhone XS 螢幕解析度跟 iPhone X 一樣&lt;/li&gt;
  &lt;li&gt;各種螢幕解析度的差別可以參考&lt;a href=&quot;https://www.facebook.com/612130717/posts/10155658570275718/&quot;&gt;這篇&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;如果你是第一次載 Xcode 10 來用，然後發現 app build 不過，請注意 Xcode 10 預設用 New Build System。如果要改回舊的請去 File/Workspace or Project Settings 改成 Legacy。詳情請見 &lt;a href=&quot;https://download.developer.apple.com/Developer_Tools/Xcode_10_GM_seed/Release_Notes_for_Xcode_10_GM_seed.pdf&quot;&gt;Xcode release notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
				<pubDate>Thu, 13 Sep 2018 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2018/09/13/iphone-xs.html</link>
				<guid isPermaLink="true">https://13h.tw/2018/09/13/iphone-xs.html</guid>
			</item>
		
			<item>
				<title>FoundationDB</title>
        <description>&lt;p&gt;蘋果今天將一套 noSQL 資料庫軟體 &lt;a href=&quot;https://www.foundationdb.org/&quot;&gt;FoundationDB&lt;/a&gt; 給&lt;a href=&quot;https://github.com/apple/foundationdb&quot;&gt;開源&lt;/a&gt;出來。這個名字很蘋果。釋出的版本是 5.1.5，看來有點歷史了，但之前沒聽過。出於好奇查了一下它的背景。&lt;/p&gt;

&lt;p&gt;FoundationDB 本是一間 startup，以及同名開源資料庫軟體。蘋果在 2015 年把這間公司買下後把軟體閉源，作為內部使用。現在又重新開源起來。&lt;/p&gt;

&lt;p&gt;（根據當年 Business Insider 的&lt;a href=&quot;http://www.businessinsider.com/why-apple-bought-foundationdb-2015-3&quot;&gt;報導&lt;/a&gt;，蘋果收購與閉源 FoundationDB，造成不少公司的麻煩啊…）&lt;/p&gt;

&lt;p&gt;至於 FoundationDB 軟體本身是幹嘛呢？資料庫我實在不是很懂，不過看了一些&lt;a href=&quot;https://2014.nosql-matters.org/cgn/wp-content/uploads/2014/05/Jennifer-Rullmann-NoSQL-and-ACID.pdf&quot;&gt;介紹&lt;/a&gt;，它擅長做大型分散式服務，不僅高效、有彈性，而且還具有硬體成本優勢。&lt;/p&gt;

&lt;p&gt;據說蘋果是把它用在 iMessage 等大型服務的設施上（品質應該比什麼 UIKit、Swift、Xcode 之類的好得多吧 😂）。既然重新開源了，可以觀察一下。&lt;/p&gt;
</description>
				<pubDate>Thu, 19 Apr 2018 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2018/04/19/foundationdb.html</link>
				<guid isPermaLink="true">https://13h.tw/2018/04/19/foundationdb.html</guid>
			</item>
		
			<item>
				<title>git 不能保證專案在每台電腦上的狀態完全一樣</title>
        <description>&lt;p&gt;A quick reminder for iOS dev: git status clean != everything the same between 💻 machines 🖥:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Files in .gitignore: Non-shared Scheme/Workspace settings 🛠&lt;/li&gt;
  &lt;li&gt;Empty folders: Search Paths 👀&lt;/li&gt;
  &lt;li&gt;Case-insensitive FS: Change name case of files in .xcassets, crash on #imageLiteral 💥&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;
&lt;p&gt;git 不能保證專案在每台電腦上的狀態完全一樣。以我曾遇過的坑為例：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;列在 .gitignore 的檔案：scheme 或 workspace 的設定，如果不是 shared，每台電腦可以完全不一樣。天差地遠&lt;/li&gt;
  &lt;li&gt;空的資料夾：同事換了 framework 的位置，但 Header Search Paths 設定沒拿掉舊的。他的電腦可以 build，我 pull 後卻不行，因為我的空資料夾還在&lt;/li&gt;
  &lt;li&gt;檔名不區分大小寫的檔案系統（Mac 預設）：把 xcassets 底下的檔案大小寫改掉。git 看不出來差異，build 得過，但是 runtime 時 #imageLiteral 這種 code 會 crash&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;不是要提出解法，只是講一下有這些坑&lt;/p&gt;
</description>
				<pubDate>Wed, 11 Apr 2018 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2018/04/11/git-no-promises.html</link>
				<guid isPermaLink="true">https://13h.tw/2018/04/11/git-no-promises.html</guid>
			</item>
		
			<item>
				<title>Modern iOS dev life</title>
        <description>&lt;ul&gt;
  &lt;li&gt;Xcode 9.2 for main project until its next release⌛️&lt;/li&gt;
  &lt;li&gt;Xcode 9.3 for iOS 11.3 development and Swift 4.1 side project. High Sierra required⛰️🧗‍♀️&lt;/li&gt;
  &lt;li&gt;Xcode 9.4 beta for iOS 11.4 beta⚠️&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, never get Xcode via MAS🚫. Directly download from /download/more/&lt;/p&gt;
</description>
				<pubDate>Mon, 09 Apr 2018 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2018/04/09/modern-ios-dev-life.html</link>
				<guid isPermaLink="true">https://13h.tw/2018/04/09/modern-ios-dev-life.html</guid>
			</item>
		
			<item>
				<title>簡單說一下 fastlane.ci</title>
        <description>&lt;p&gt;昨天 4/7 在 @johnlinvc 的大力協助之下，fastlane 開發團隊成員 Felix(@KrauseFx) 與 Josh(@taquitos) 在 iCHEF 樓下的場地介紹了 &lt;a href=&quot;https://fastlane.tools&quot;&gt;fastlane&lt;/a&gt; 與 &lt;a href=&quot;https://github.com/fastlane/ci&quot;&gt;fastlane.ci&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;fastlane 大家比較熟悉，就是把行動應用開發中，主要跟認證簽署及發佈相關的流程（當然還有更多）給自動化，並且統統加入版控。優勢是開發工具的環境設定都可以在 repo 裡面一起管理。&lt;/p&gt;

&lt;p&gt;這樣一來，就算你今天換個地點、換了一台電腦，或是來了新夥伴，只要能夠 checkout 就可以無縫接軌。這精神在其中的套件 match 尤其徹底發揮。（這會讓人想把整個系統會用到的設定都給版控化，不過這是另一個題目了）&lt;/p&gt;

&lt;p&gt;基於同樣的理念，fastlane.ci 是把連續整合的流程也版控化。如果有用過 Jenkins 或其他 CI 系統就會知道環境設定有多麻煩，還很難管理。用 fastlane.ci 的話，原則上架設一台新的 CI 只要 checkout 就可以掛好所有設定，然後工作流程就可以繼續囉。&lt;/p&gt;

&lt;p&gt;fastlane.ci 前幾天才剛 alpha，昨天則是首次 live demo👏，Felix 跟 Josh 他們建議至少到 beta 再來用。當然你很勇敢也可以 alpha 就來玩，然後認真報 bug。fastlane.ci 是完全開源的，有興趣的話也可以 contribute。另外就是他們強調團隊會有 Google 的 designer，所以到時候一定會比某 CI 好看、好用😂&lt;/p&gt;

&lt;p&gt;我個人是 fastlane 的長期愛用者，對 fastlane.ci 相當期待！&lt;/p&gt;
</description>
				<pubDate>Sun, 08 Apr 2018 00:00:00 +0000</pubDate>
				<link>https://13h.tw/2018/04/08/fastlaneci.html</link>
				<guid isPermaLink="true">https://13h.tw/2018/04/08/fastlaneci.html</guid>
			</item>
		
	</channel>
</rss>
