自己造一個 CocoaPods Framework Pod

最近工作需要將一個 tvOS app 的某些 class 抽出來變成能被 CocoaPods 安裝的私家 close source framework 讓其他人用。我都是第一次做 framework,在網上的教學主要都是教純 Xcode 的做法和使用 CocoaPods 下載 project dependency,詳細提及如何造一個 CocoaPods Pod 就比較少人寫。所以就寫出來跟大家分享。

Read More

xUnique

Xcode project 有個特色就是 VCS unfriendly。例子有 project.pbxproj 會有自動產生的 hash 和開啟 xib、storyboard 時不論有沒有修改過內容都好 Xcode 還是自動會將 macOS 和 Xcode 版本寫入。如果是 xib、storyboard 的版本問題就不難解決,因為比較難出現 conflict。但 project.pbxproj 就很容易 conflict。這是因為 Xcode project 和 Java 之類的 project 不同,Xcode 是可以讓 user 自訂 project 檔案排序,還有就是可以讓 user 決定那些檔案是屬於 project 的一部分,不是純綷只定義 file system 的某幾個資料夾就是 project 的一部分。然而這個特色卻容易出現 merge conflict。只要你和另一個組員在 Xcode file tree 同時將檔案排列次序改變,那就會在 merge 時出現 conflict。尤其是在前期開發時因為不時要開新檔案,會令 conflict 更容易出現。而解決 conflict 又特別麻煩,因為 project.pbxproj 的設計是讓 Xcode 讀,不是讓人去閱讀。

而解決 project.pbxproj 容易出現 VCS conflict 的方法就是用 xUnique。它是一個 Python 寫的 script,它會將 project.pbxproj 的所有項目的 UUID 都改用 MD5 hash;而項目都會以英文字母順序排列好。這會確保 UUID 的產生方式和檔案排列次序一致,不會再有個人色彩。這樣就能減低 merge conflict 的機會。

留意 xUnique 要全部組員一齊用才會有效。使用方法可以將它設成 Git 的 pre-commit hook 又或者設定在 Xcode build 時執行。xUnique 暫時發現的缺點就是在執行完 xUnique 後如果令 project.pbxproj 有改動的話 Xcode file tree 的資料夾都會被摺疊,之後要再人手展開才可以回復先前的狀態。

註:在寫這篇文時看到解決 storyboard merge conflict 可以用 StoryboardMerge

在 Android app 內顯示 Git commit hash

有些 Android app 除了顯示版本號碼之外,還會有該版本的 Git commit hash。如果有好幾部測試機做測試的話,可能會在開發時先後在不同的機安裝過不同版本的 app。但就沒有每次都更新版本號碼。加了 commit hash 就容易分辨 app 的實際版本。其實要顯示 commit hash 的做法不太難,不需要每次人手更改的。只需要改一下 appbuild.gradle 就可以了。

Read More

Olympus E-M10

不經不覺我的 Olympus E-M10 相機買了都有一年了。這一年來都影了大概有四千多張相片。最初買相機的原因主要是用來拍畢業相,而且之前用的 Canon PowerShot A640 不知是不是因為發霉的關係,拍出來的相片都好像有一層霧般灰曚曚般。所以想買一部新的來取代它。亦因為這個原因,近年來都是用手機影相為主。

Read More

轉用 Hexo

之前一直都想用 static site generator 來取代沿用的 WordPress。現在終於由 WordPress 轉到 Hexo,並且將網站改用 GitHub Pages 架站。

Hexo 是一個用 Node 寫的 static site generator,它的定位是用來造 blog,不過用來做一些簡單的文檔網站都可以。近年開始流行如 Jekyll 之類的 static site generator,主要的特色除了是可以將網站放到普通的 web hosting 外,就是可以用 Markdown 寫文章。用 Markdown 的好處就是語法比 HTML 簡單,尤其適合寫一些文字為主,不需要特別排版的文章。還有就是寫一些夾雜着程式碼的文章。Static site generator 通常都會提供 syntax highlight 功能,而且還會將生成的 syntax highlight HTML 直接匯出,無須在 client side 做 syntax highlight。之前在 WordPress 寫夾雜着不少程式碼的文章時就要不時切換 HTML 和 WYSIWYG editor 來補加 <code> 之類的 tag,用了不少時間才寫完。

寫文章方面,因為匯出 HTML 需要先安裝 Hexo,所以不能像 WordPress 般方便。我的做法是在 Cloud9 開一個 workspace 來寫文。這樣就不用每部機都要裝一次 Hexo,而且下一次開啟時還能保留 editor 和 shell 的 context。寫文時亦可以開啟 server 來預覽網站。完成後就可以 deploy 到 GitHub Pages。如果嫌沒有網頁寫作介面的話可以安裝 hexo-admin plugin。

轉移過程最麻煩的地方就是要人手逐篇文章去檢查轉換完的 Markdown。雖然 Hexo 有提供 WordPress 轉移 plugin,但因為它的轉換插件只是作簡單的轉換,沒有特別去 escape Markdown 語法的字符。加上它沒有將上載到 WordPress 的圖片下載一次。所以要逐張圖片人手處理。有些文章實在有太多圖片,我在轉移的時候只保留部分的圖片。留言方面,因為先前已經轉用 Disqus,所以只需要在設定檔填上 Disqus ID 就可以在文章顯示以前的留言。

在 Windows 刪除路徑名太長的檔案

通常寫 JavaScript project 都會用到 NPM,NPM 和其他 package manager 不同之處就是每個 package 的 dependency 都會放在其 package 內的 node_modules 資料夾,而不會將所有 dependency 放去同一個資料夾內。這個做法的好處是不同的 package 即使用了相同的 module 但不同版本都不會衝突。但壞處是當一個 module 有 dependency 時,而這些 dependency 自己本身都有 dependency 時,便會令 project 的 node_modules 資料夾內有非常多層的資料夾。如果用 Windows 的話,有可能因路徑名太長不能刪除資料夾和檔案。

但原來解鈴還須繫鈴人,有人做了一個簡單的 Node 工具 rimraf 可以順利地移除這些資料夾。

首先,用 NPM 安裝 rimraf:

1
npm install -g rimraf

然後,將要刪除的資料夾傳到 rimraf 即可:

1
rimraf C:\Users\Eric\Documents\proj

整理 MP3 ID3 tag

之前有整埋 MP3 的 ID3 tag,以下是我的小分享。

如果要整理 MP3 檔的 ID3 tag 的話,可以用 Mp3tag。在設定頁,揀選 Tags | Mpeg,在 Write 部分只剔選 ID3v2,而下面就只揀選 ID3v2.3 UTF-16。而在 Remove 部分則剔選 ID3v1 及 APE。這樣就應該不會再有亂碼。

如果要移除其他 tag(例如歌詞、iTunes 遺留下來的 tag),可以在 Mp3tag 的檔案欄的項目按右鍵,然後點選 Extended tags。歌詞的 tag 是 UNSYNCEDLYRICS

iTunes 都可以整理 MP3 的 ID3 tag,但預設是不會將 tag 的改動寫回 MP3 檔內,如果沒有特別處理過的話在其他 player(例如電話)播放就未必見到改動過的 ID3 tag。

如果要補回專輯的 cover art 的話,除了 Google image search 之外,iTunes Store 本身都有提供大量 cover art。除了用 iTunes 來自動補回 cover art 之外,也可以用 iTunes Artwork Finder。只需揀選 Album,輸入專輯名並選擇 iTunes Store 地區就可以開始搜尋。網站會提供 600 px 和 1500 px 的圖像。只需右鍵複製再在 Mp3tag 的 Cover 欄右鍵貼上就能替歌曲補回 cover art。

Inline CSS

最近需要寫一個發送 email 的 program。如果要用 HTML 的話,最好都是找到現成的 HTML email framework。(例如 Zurb 的 Ink,其他的可以參考 Responsive Email Resources 網站)因為 HTML email 和平時做網頁分別很大,例如:

  • CSS 要 inline,<style> 並不是全部 email client 都能支援
  • 排版要用 <table>
  • 圖片視乎需要當成附件,Base64 未必能被 email client 支援
    但設計 email 時如果要寫 inline style 是非常難寫,所以都是用工具轉。我試過用 Gulpgulp-inline-cssgulp-inline,效果不錯。

    Read More