Month: June 2013

Git .gitignore file for Xcode projects

Posted by – June 27, 2013

最近才開始整理一些在寫 Obj-C 時當作測試用的範例程式碼,想丟去 GitHub 作個紀錄。

因為這樣才開始在 Xcode 裡使用 Git。雖然 Xcode 本身有整合 Git,但是那個整合還蠻陽春的,連 .gitignore 要怎麼設定都沒點提示。

.gitignore 是 Git 程式碼管理系統裡用來指定哪些檔案不需被追蹤用的文字檔。

看在 Xcode 專案裡的檔案分佈,哪些要忽略還真不容易分辨。一樣是在 StackOverflow 看到幾個解答,在這筆記一下。

# Xcode
.DS_Store
*/build/*
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
profile
*.moved-aside
DerivedData
.idea/
*.hmap

這樣再看 Xcode projects 就清爽多了。

Update Jun 28, 2013

另一種寫法

# Exclude the build directory
build/*

# Exclude temp nibs and swap files
*~.nib
*.swp

# Exclude OS X folder attributes
.DS_Store

# Exclude user-specific XCode 3 and 4 files
*.mode1
*.mode1v3
*.mode2v3
*.perspective
*.perspectivev3
*.pbxuser
*.xcworkspace
xcuserdata

How to undo a Git pull?

Posted by – June 24, 2013

不經一事,不長一智啊....

以前用 Git 幾乎都是一人專案,最近才開始有協同工作的專案。這天在 fetch 了新的進度後,就很順手 pull 了... 然後就爆了。

因為我忘記切換 branch 就 pull,結果被合併到別線上去了。還好只有我本機掛掉,大不了砍掉 repo 重建一次就好。

不過想想還是看一下怎麼回復上一動好了,StackOverflow 真是工程師的好朋友。

用此指令可以查 HEAD 變化的歷史紀錄。

$ git reflog show

結果如下

$ git reflog show
cc7cb8e HEAD@{0}: pull pic3@dropbox user/auth: Merge made by the 'recursive' str
3686266 HEAD@{1}: commit: Database Schema
ea26bdb HEAD@{2}: checkout: moving from ea26bdb27a04284e03a119207ade4602d78c06cf
ea26bdb HEAD@{3}: checkout: moving from user/auth to ea26bdb27a04284e03a119207ad
a6310cb HEAD@{4}: commit: user/auth dev
fbaa5a7 HEAD@{5}: checkout: moving from inc/bootstrap to user/auth
7401efb HEAD@{6}: commit: Twitter Bootstrap

可以看到上一個動作是 HEAD@{0} pull 的行為,所以要回復到 HEAD@{1} 的狀態。用以下指令回復。

$ git reset HEAD@{1}

剛回復後檔案會遺留剛剛合併後的檔案,把它們移除就可以了。收工。

iOS: Disable Automatic Reference Counting for Some Files

Posted by – June 18, 2013

開發 iOS 所使用的 Objective-C 語言隨著 APP 生態發展,也變成一門挺熱門的語言。相對地,其發展也進步許多。

Apple 於 2011 年才在 Objective-C 中導入了 Automatic Reference Counting (ARC) 機制,做為自動記憶體管理的解決方案。在 ARC 出現之前,Obj-C 中記憶體釋放完全是由開發者操作的,對於慣用 script 語言的我來說相當的不習慣,而且也覺得很囉嗦。我偏好 PHP, Python, Ruby 這類可以寫得很簡潔,專注在我要解決的問題與需求上的語言。從 C 演化來的 Obj-C 宛如火星文一般。

所以我是很習慣在開 Xcode 專案時使用 ARC 機制的,可以不用寫 release 方便許多。我連 @synthesize 都沒在寫的。

前面扯這麼多,當然是在鋪 ARC 的梗。開發過程中常會用到第三方的 Library 或 Example code 來加速開發或完成某些外部資源串接。這些第三方的 code 有許多仍是用 non-ARC 模式開發的 (就是手動管理記憶體)。但是專案開了 ARC 模式後編譯 non-ARC code 會掛掉。

xcode-non-arc-error

解決方法是更改編譯設定。在 Xcode 點選 TARGETS -> Build Phases,在 Compile Source 可以加上編譯參數。為 non-ARC 的程式加上 -fno-objc-arc 指定不使用 ARC。

xcode-fno-objc-arc

這樣編譯可以過關了。

如果是反過來要在 non-ARC project 中指定使用 ARC 的話,參數是 -fobjc-arc

How to know if Xcode iOS project is using ARC?

Posted by – June 18, 2013

基本問題,如何查詢 Xcode 的 iOS 專案是否有使用 ARC (Automatic Reference Counting)?

在 Xcode 中點選 Target -> Build Settings -> 搜尋 automatic,就會看到 Objective-C Automatic Reference Counting 是 YES 還是 NO 了。

xcode_check_is_arc_on

取出浮點數的小數部份

Posted by – June 17, 2013

老實說,平常很少有標題這樣的需求。這天在寫一個分頁計算程式,其中最後一頁除下來 (分頁總長度 / 顯示長度) 會出現餘數,需要做點特別處理。

然後就很習慣性地開始想說怎樣才能快速檢查 float 浮點數的小數部份是不是 0.0。結果都還沒開始思考,就剛好在 StackOverflow 看到一個 Answer,只有一行。

if(num % 1 != 0) do something! // eg. 23.5 % 1 = 0.5

對吼,取 1 的餘數就好了啊 XDDDD

立馬改寫成 Objective-C 的版本,完成了工作。

if (0.0f != fmodf(currentPage, 1.0f)) {

// do something

}

Obj-C 的取餘數要用 fmodf 這點一直很不習慣,老是忘記,總是習慣性地寫百分比符號....

Installing ionCube Loader on MAMP

Posted by – June 10, 2013

在幫客戶 debug 的時候注意到 SVN 裡一小部份程式碼居然被 ionCube 加密過了.... 加密後的程式碼丟到 SVN 是有個屁用啊。

算了,這不重要。重點是我的開發機變成也要可以執行 ionCube 才行。要在 Mac 上的 MAMP 下安裝 ionCube loader 還蠻簡單的,隨手筆記一下。ionCube 的 loader 是免費的,encoder 才要付費。

先到 Loaders for ionCube Encoded Files 下載對應的 loader。我的開發環境是 OS X (x86-64)。下載了 .zip 包,解開來有幾個檔案。

Unpacked ionCube Loader File

其中的數字是 PHP 的版本,例如 5.2, 5.3 等,_ts 是指 Thread Safety,MAMP 的 PHP 沒有 Thread Safety,所以選用一般版即可。如果不確定環境有沒有 ts,可以用 phpinfo 看一下。

建議將 loader-wizard.php 丟到 MAMP/htdocs 下面執行一下,會提示安裝路徑和是否安裝成功等訊息。

以我的環境來說,我是把 ioncube_loader_dar_5.3.so copy 到

/Applications/MAMP/bin/php/php5.3.6/lib/php/extensions/no-debug-non-zts-20090626/ioncube_loader_dar_5.3.so

接著打開 /Applications/MAMP/bin/php/php5.3.6/conf/php.ini,在 1085 行左右加上以下設定:

zend_extension="/Applications/MAMP/bin/php/php5.3.6/lib/php/extensions/no-debug-non-zts-20090626/ioncube_loader_dar_5.3.so"

注意:如果 php.ini 裡沒有出現 zend_extension,這行加在任一位置,否則,把它加在第一個 zend_extension 語句前。

存檔,重新啟動 server,再用 loader-wizard.php 檢查一下,確定 loader 安裝成功。

Install ionCube successfully

Formula Error in PHPExcel

Posted by – June 7, 2013

最近在幫客戶開發報表功能,其中一個小功能是將查詢結果匯出成 Excel 檔案,對於會計人員來說相當依賴 Excel。

如果沒有什麼特別的需求,通常會用 PHPExcel 來製作檔案。

一個典型的儲存格設定如下:

$objPHPExcel->setActiveSheetIndex(0)
              ->setCellValue('B6', $order['order_no']);

就在這個匯出功能即將完成時,發現有一個欄位只要一存入內容,PHPExcel 就會出現 Formula Error。

回頭去看資料庫,發現是 VCHAR 欄位,那寫入應該沒啥問題啊。再看看資料內容...

看了兩眼才注意到這個純文字欄位有幾格是 = (等號) 開頭... bingo!

PHPExcel 在指值的時候,碰到等號會轉換成公式,自然就爆掉了。解決方法是把 setCellValue() 換成 setCellValueExplicit(),這樣就不會被轉換了。

收工!

Install Python 3 on Mac OS X

Posted by – June 5, 2013

雖然我大部份時間都在和 PHP 奮戰,不過我對 PythonRuby 這些新一代的語言也很有興趣。

用過 Python 都知道這個可愛的語言有兩派大分支.... 2.x 版與 3.x 版。由於第三版有許多變動,導致與第二版不相容,這在程式碼的移稙上造成頗大的困擾。因此即使第三版已經釋出多年,仍有大量第二版的使用者。

至於我這個 Python 菜菜子是比較傾向直接學習第三版的。不過 Mac OS X 內建的第二版,我想更新到第三版。

在 Mac OS X 上更新 Python 是很容易的,只要到官網的下載頁面下載對應 Mac OS 的 Installer ,依畫面指示安裝即可。

Python Installer on Mac

安裝完後在 Terminal 下執行 python 卻還是會看到 Python 2.x 的訊息....

$ python
Python 2.7.2 (default, Oct 11 2012, 20:14:37)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

事實新安裝的版本路徑與系統內建的不同,並不會覆蓋,形成新舊版並存的現象。要用第三版要輸入 python3。

$ python3
Python 3.3.2 (v3.3.2:d047928ae3f6, May 13 2013, 13:52:24)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

若是覺得這樣麻煩的話,可以修改設定。

vim ~/.bash_profile

加上一行設定。

alias python="python3"

存檔後輸入 python 就會直接進入新版囉。

Use Click to Play in Firefox to Enhance Security and Performance

Posted by – June 4, 2013

Firefox 從 14 版開始導入了名為 "Click to Play" 的安全機制。這個機制預設停用網頁上所有的外掛 (plug-ins),需由使用者手動執行外掛。這麼做的好處主要有兩個,一是節省記憶體,如果你跟我一樣常在瀏覽器開一堆頁面的話,瀏覽器光是 Flash Player 可能就佔掉數 GB 的記憶體。第二個好處是減少被惡意攻擊的機會,不論是 Flash Player 或是 Java VM 都有許多安全漏洞,可能被有心人士用作攻擊的管道,預設關掉就比較不用擔心了。

不過 Firefox 雖然有些機制,但沒啟動它,需由使用者手動開啟。這個選項也不存在 Firefox Preference 裡.... 不曉得開發團隊為什麼不直接做個開關就好了

More

iOS: 尋找模擬器的暫存路徑

Posted by – June 3, 2013

在 iOS APP 的開發過程,大量依賴 Xcode 內建的模擬器來做雛型的測試。其中也需要知道文件的狀態變化是否如預期一般運作。

但是模擬器的文件暫存路徑會有一組 UID 亂數,當手上的專案一多就分不出來是哪個資料夾了。可以用以下方法取得該 App 的文件路徑。

NSLog(@"%@", [[NSBundle mainBundle] bundlePath]);

結果如下:

/Users/filework/Library/Application Support/iPhone Simulator/6.1/Applications/642CB434-53D0-440A-9BB4-A5E1801D36EE/qxFMDB.app

若要列出目錄下的檔案,用以下方法。

NSFileManager *fm=[NSFileManager defaultManager];

NSString *path=[[NSBundle mainBundle]bundlePath];

NSArray *info=[fm contentsOfDirectoryAtPath:path error:nil];

NSLog(@"list:%@",info);

執行結果如下:

list:(

"Default-568h@2x.png",

"Default.png",

"Default@2x.png",

"en.lproj",

"Info.plist",

"Main.storyboardc",

PkgInfo

)