Google Play Services IncompatibleClassChangeError

之前工作在接第三方登入 SDK 時,遇到 GoogleApiClient.connect()' was expected to ...     繼續閱讀
XenStalker's avatar
XenStalker 4月 04, 2018

PowerShell Get-Content 讀檔換行陷阱

最近遇到一個 PowerShell 的陷阱,用 Get-Content 讀檔時,不會保留換行符號。因為 Get-Content 行為是單行回傳物件,多行回傳陣列,而不是單一字串。一種簡單的 EOL 保留方法是(Get-Content <path>) -join "`n" # e.g. $content = (Get-Content C:\Users\Me\note.txt) -join "`n" 把它串回來即可。另一種作法是改用 .NET Class,但稍嫌麻煩。[System.IO.File]::ReadAllText("file\to\path") # e.g. $content = [System.IO.File]::ReadAllText("C:\Users\Me\note.txt")     繼續閱讀
XenStalker's avatar
XenStalker 11月 18, 2017

Unity 5 AssetBundle 基礎

前言一直以來,Unity 的 AssetBundle 機制與不透明的資訊一直為人所詬病(社群論壇有些批評,例如 asset 序列化管理架構、機制本身就不良,來源就不附上了),以往大部分的資訊都只是瞎子摸象試出來的結果,大都未經 Unity 官方證實。直到 Unity 4、5 開始,特別是從 Unity 5.x 開始,官方才比較願意公開詳細地說明 Unity AssetBundle、檔案資源系統及 Resources 機制。包括我在內,相信有不少 Unity 開發人員踩了不少 AssetBundle 相關的地雷,因此寫了這篇來記錄 AssetBundle 相關的基礎知識與細節。這篇主要是以 Unity 官方的 AssetBundle fundamentals 主題文章為主,加上一些自身開發經歷與參考。AssetBundle 概觀AssetBundle 是一款 Unity 的檔案資源系統,目的是為了讓資料交付可以相容於 Unity 自身的序列化系統。因為 Unity 本身的檔案資源處理機制,導致沒辦法直接使用檔案,原始 asset 檔與 Unity 最終在使用的 asset 是不同的。次要目的是縮減最終發布的 asset 大小,縮減執行期記憶體用量,可根據目標裝置給予最適合的內容(例如根據不同裝置選擇貼圖壓縮格式)等。AssetBundle 內部儲存結構一包 AssetBundle 由兩個部分組成。檔頭 (header)資料段 (data segment)AssetBundle Header檔頭由 Unity 在建置 AssetBundle 時產生,記錄了這包 AssetBundle 的 ID、壓縮格式、manifest 等資訊。Header Manifest這裡的 manifest 是指檔頭的 manifest,不是指 AssetBundle 建置出來的 manifest。Manifest 是一張查找表,以 UnityEngine.Object 名稱為主鍵,值為此 UnityEngine.Object 指向資料段的索引。官方指出大部分的平台都是用 C++ STL std::multimap 來實作,因此一個 UnityEngine.Object 可能會有很多個資料段。官方也說明演算法會根據不同平台來選擇以利最佳化,大都是使用各種平衡搜尋樹 (balanced search tree)。例如在 Windows、OSX 及 iOS 會採用紅黑樹 (red-black tree)。因此在建構 manifest 時,消耗的時間不是線性,會比線性還久。AssetBundle Data SegmentAssetBundle 資料段保存了 Unity 序列化 asset 後的原始資料。若資料段是被壓縮的,則會根據壓縮演算法來選擇要如何解壓縮這些資料段。例如 LZMA 壓縮會蒐集所有的資料段後才解壓縮,這代表了 LZMA 得解壓縮一整包 AssetBundle 才能取出裡面的 UnityEngine.Object,即便你只是想要取出某一個 UnityEngine.Object。而 Unity 5.3 之後新增的 LZ4 則是個別壓縮 UnityEngine.Object,允許獨立解壓縮取出一個,不用解壓縮一整包才能取出 UnityEngine.Object。     繼續閱讀
XenStalker's avatar
XenStalker 6月 21, 2017

Unity Resources 系統的最佳實務做法

Resources 的最佳做法別用 Resources別用 Resources別用 Resources因為很重要,所以要講三次。為什麼呢?理由有三。細粒度的記憶體控管會更困難。不當使用 Resources 資料夾會導致 app 啟動時間、建置時間更久。這問題在 Resources 檔案愈多,愈是明顯,尤其是規格比較差的行動裝置。app 在 splash screen 前黑畫面太久的其中一個原因正是這一點。Resources 內的 assets 無法動態下載更新,也沒辦法處理 asset 變體。例如貼圖有分 sd、hd 版。Unity 的程式開發人員,從 Unity 5 開始,應該要發展一套能夠方便使用 AssetBundle 的系統,如此便能不再倚賴 Resources。     繼續閱讀
XenStalker's avatar
XenStalker 6月 18, 2017

LeetCode Problems: 561. Array Partition I

摘要此篇文章記錄筆者解 LeetCode Problem 561 Array Partition I 的過程。這題雖然名稱是 Array Partition,但實際在解的過程根本就沒用到 partition 的概念,可能為求時間複雜度最快佳的解法得用 array partition。總之,這題做得有點不知所以然,莫名其妙……題目資訊名稱:Array Partition I分類:Algorithms編號:561難度:Easy標籤:Array網址:https://leetcode.com/problems/array-partition-i     繼續閱讀
XenStalker's avatar
XenStalker 5月 07, 2017

LeetCode Problems: 535. Encode and Decode TinyURL

摘要這篇是筆者解短網址編碼、解碼的過程。這題是之前 LeetCode 的 System Design 題目(編號 534),也就是設計將一般網址轉成短網址的服務。但這題的寫 code 題型其實設計上有瑕疵,內文將會說明。題目資訊名稱:Encode and Decode TinyURL分類:Algorithms編號:535難度:Medium標籤:Hash Table, Math網址:https://leetcode.com/problems/encode-and-decode-tinyurl     繼續閱讀
XenStalker's avatar
XenStalker 5月 07, 2017

LeetCode Problems: 9. Palindrome Number

摘要這篇是筆者解數字回文的過程,說明如何判斷給定的一個數是否回文。這題用字串、拆解數字的方法也可以,但比較慢。其實提示有講,標籤也寫 Math,因此有更好的方式來解。題目資訊名稱:Palindrome Number分類:Algorithms編號:9難度:Easy標籤:Math網址:https://leetcode.com/problems/palindrome-number     繼續閱讀
XenStalker's avatar
XenStalker 5月 07, 2017

LeetCode Problems: 7. Reverse Integer

摘要此文是筆者在解 LeetCode Problems: 7. Reverse Integer 的過程。其實第一次想到的方法是用字串處理,但肯定不夠快。因此又思考一下,用計算的就可以了。其實這題的 tag 標記的是 Math,果不其然。題目資訊名稱:Reverse Integer分類:Algorithms編號:7難度:Easy標籤:Math網址:https://leetcode.com/problems/reverse-integer     繼續閱讀
XenStalker's avatar
XenStalker 5月 01, 2017

LeetCode Problems: 1. Two Sum

摘要此文是筆者在解 LeetCode Problems: 1. Two Sum 的過程。雖然這題很簡單,但看了 LeetCode 的 tags(相當於提示)才知道可以用 Hash Table 之類的關聯式容器來進一步優化成 O(n)。題目資訊名稱:Two Sum分類:Algorithms編號:1難度:Easy標籤:Array, Hash Table網址:https://leetcode.com/problems/two-sum     繼續閱讀
XenStalker's avatar
XenStalker 4月 30, 2017

安裝 Redmine 3.3

摘要此文章將說明如何在 Ubuntu 安裝 Redmine,並使用 Let’s Encrypt 簽發 SSL 憑證以建立安全連線,但不包含安裝 MySQL,MySQL 必須自行先準備好。Ubuntu + Nginx + MySQL + RedmineStack 如下。Redmine 3.3MySQL 5.7Rails 4.2Ruby 2.3, Gem 2.6RVM 1.28Phusion Passenger + Nginx 1.10Security UpdatesUbuntu 16.04 LTS     繼續閱讀
XenStalker's avatar
XenStalker 4月 14, 2017