2011年12月29日 星期四

Javascript build function prototype 不同的函示寫法



問題
JavaScript 的寫法很多,端看開發者的喜好(這不是個好現象),今天看到了一個寫 function call 的方式,因為是第一次看到這樣的寫法所以就稍稍的研究了一下。


var id = that.profile.id;
(function(id){
   // do business logic
})(id);

寫 Web 寫了非常久了是第一次看到這樣的寫法所以一開始看到覺得非常的困惑。
用 chrome developer tool 的 console 研究了一下後才知道原來這是一種 function call 的寫法,

解答
這段程式告訴 browser 的是:

  1. var id = that.profile.id;
    宣告一個 id 變數
  2. (function(id) { // do business logic })(id);
    建立一個  function call,可以將上面的 code 看成 function(id);
所以第一個 function(id) 這個 id 的參數是由最後面的 (id) 傳遞進來的,等於:
(id)  -> function(id) ,也就是說 function(id) 參照的不是 var id = that.profile.id 。

結論
個人覺得,這樣的寫法容易讓人混淆,因為第一個無法讓人一目瞭然地看出程式邏輯,上面只是我截出來的程式語法重點,其實這是一個 70 line 的 function call。
再來就是 that,這個是變數,但是第一眼會想到的是 this。也因此會容易混淆看 code 的人。
變數應該要取得明確且清晰,像是 personalSession 。
function call 獨立出來會讓開發人員可以快速的瞭解程式碼, (function(id){})(id) 跟 parser(id) 我想兩個比較起來很明顯了。

很多小地方多注意,可以減少自己與其它開發人員的維護時間與 survey code 的速度,有時候簡單了當下換來的只是未來的加倍的償還。

2011年12月23日 星期五

Xcode 4 建立你的 git 專案

版本控管對於個人開發或是 Team work 都非常非常重要,開發常遇到下面的情況
  1. 不小心刪除掉了 class
  2. 需要救回以前的檔案
  3. 需要做版本比對
  4. Team work 時需要同步每個人的 source code
  5. 還有很多,不過這篇不是介紹版本控管好處的
xcode 4 支援 subversion and git 兩種版本控管軟體,個人覺得整合的算是不錯,只是有時候難免需要到 Terminal 打一下指令。

教學案例情節
今天就寫一篇簡單的入門文章介紹一下 git 使用方式,情節很簡單:建立local repository > 將專案新增進去 > 建立 local repository 跟 remote repository 連結 > push 到 remote repository。

情節設計概念
這個情節是針對一個新的開發人員設計的,進入一個專案 > 拿到 source code > 建立環境 > 開始工作。所以這裡沒有太深奧的概念,只想給入門者一個快速地學習方式,然後在自己深入研究,我也會找時間介紹 git 的設計概念與應用實例。

基本上所有動作可以全部透過 xcode 作,當然也全部都可以透過指令去做。不過步驟就以我覺得最順的方式去做。

git 基本觀念概述
git 的概念是將 source control 區分為本地端跟 server 端,在本地端開發者可以自行控管自己的版本然後在"push"到伺服器端集中控管,

踏出開工的第一步
1.建立專案目錄
justinlin$ mkdir projects/ios_ebook
justinlin$ cd projects/ios_ebook
2.設定 git 賬號
justinlin$ git config --global user.name "justin"
jstinlin$ git config --global user.email "sunny.justin@gmail.com"
3.從 git server 複製專案目錄到 local
justinlin$ git clone gitolite@git.object2.com:ios_ebook
4.使用 xocde 4 打開專案檔案

5.打開 Organizer 切換到 Repositories,左側會出現剛才 clone 的專案,專案目錄下會出現 Branches (local 的 branch list), Remotes ( branch list on the remote server), ios_ebook (專案資源)

6.在 xcode 裡頭編輯 source code 後檔案右側會出現 M 的字樣,這代表的是檔案被修改過,這時候點選滑鼠右鍵 > source control 就會出現 Commit Selected Files 與 Discard Changes兩個選項。如果點選 Commit Selected Files 的話就會將檔案同步到 Local repository。

7.點選 File > Source Control > Push 後會把 Local repository 裡的修改 Push 到 Remote repository 中進行同步

8.這是一個從 git 主機複製出檔案到修改檔案後 commit 到 local repository,再 push 到 remote repository 的基本流程。
補充說明
git 與 subversion 的概念最大不同在於,subversion 只有一個 repository而且是大家共用,這沒甚麼不好,只是因為是共用所以需要好的規劃以防止發生錯誤造成版本問題。
git 將 repository 分離,開發人員擁有自己完整的 repository,你可以自行管理跟規劃 local repository,當一切開發確認後在 push 到 git server。
不過不管那一套,還是需要良好的規劃管理跟版本控管知識,否則不斷地亂 Push 問題依然會發生的。


2011年12月19日 星期一

Chrome 使用 Developer Tools 來抓出臭蟲

回想當年
早期寫 JavaScript 時因為缺少工具所以都只能仰賴人工的判斷來作除錯,雖然這是個訓練眼力與系統化的分析思考能力的好機會,但是卻讓開發人員在開發 JavaScript 的時候老是需要花很多時間。
不過現在不一樣了,打從 Web 2.0 之後 JavaScript 在系統開發上已經變成標配而不再是選配。所以企業開始要求,使用者開始喜歡,開發人員開始學習,於是各家瀏覽器跟軟體開發商就不斷的推出許多媲美專業編輯器的除錯工具來造福這世界上的開發人員與 Web Master。

隨口介紹一點
今天要介紹的是 Chrome 的 Developer tools,這個 extensions 是由 Google Chrome tools 所提供的。使用它可以做到幾件 Web developer and Web Master 幾乎天天都需要做的工作:

  1. 開發除錯,協助我們快速地找到 Bug 或在 Reengineering 的時候協助分析 Source code
  2. 分析網站的資源,可以分析網頁中所有資源的清單與下載所需的時間與資源大小,以利我們做 Optimise
  3. 分析網頁的 Request and Response,協助我們分析 Performance 的瓶頸
  4. JavaScript Console,提供我們能供快速的驗證與法的地方,不用在每次都要編輯 > 開啟瀏覽器 > Reload > 驗證,大大節省很多時間
Chrome developer tools panel 介紹

  1. Elements
    顯示 Page 中所有的 HTML 資訊,透過這個 Panel 與左下方的放大鏡可以協助快速找到 Page 元素相關的 source code。
  2. Resources
    主要列出 Page 中所有的資源清單,除了 CSS, Script, Images 之外也會列出 Local Database Session, Cookies 等的一些瀏覽器端的資訊。
  3. Network
    收集所有透過瀏覽器對外的網路連線資訊,像是 Page 中的 AJAX 動作都會被詳細記錄 
  4. Scripts
    收集 Page 所使用到的 JavaScript 資訊,UI 設計了下拉式的選單列可以快速地選取所要瀏覽的 Script File。
  5. Timeline
    Page 所有 Request, Response 的詳細資訊
  6. Profiles
    收集並統計 Page 中所有物件(Object)的記憶體使用量,從這裡可以看到 Single Object 所使用的記憶體之外,也可以看到關聯使用的記憶體使用量,也就是 Object GC 後會歸還的總記憶體。  
  7. Audits
    Best practices analysis,執行後可以得到一些建議的改善做法,”只是建議“因為不同的 scenario 有不同的設計模式,不過這裡列出的資訊非常有參考價值,善用的話可以快速的 review code 節省不少的人力。
  8. Console
    開發時如果沒有工具的話總是要在編輯器上寫好 code 然後再開 browser 去測試,在這個 panel 中,你可以直接在 console 裡頭打上 JavaScript 語法直接測試,是個超有用的 panel。

Debug 的方式
習慣開發 Java, C++, Objective-c, Dot Net 的工程師對於 Debug  process 應該都非常熟悉:插中斷點(breakpoint) > 執行程式 > 停止在中斷點上 >  觀察程式流程與 Parameter value。

再多說一點好了!
一般來說我們在研究 Source code 或是在做 debug 的時候我們會先以程式出現在的錯誤訊息或是經驗判斷來判斷錯誤發生的那個地方然後再慢慢地往下去找出問題,像捕魚一樣,先鎖定一個區域,然後撒網,慢慢地收網。
中斷點就是這樣的工具,在可能出現錯誤的程式設定中斷點,然後一行行執行程式,一邊執行一邊觀察程式跑的流程與參數的值是否正確,藉以找出問題的源頭。

找個網站來示範

打開 Chrome > 開啟 http://www.kimo.com.tw
開啟 Developer Tools
點選 Chrome 右上方的板手圖示( Customize and control Google Chrome) >  Tools > Developer Tools


點選下方 Panel 上的 Scripts
左側是 JavaScript 檔案內容,左上方可以下拉選則你要看得 JavaScript 檔案
右側的 Breakpoints 裡頭所有中斷點的清單
右側的 XHR Breakpoints 裡頭是針對 Ajax 的中斷點設定,可以設定 URL 來做判斷


選擇 tongwen_core.js,移動到 290 行然後點選左邊的數字,成功的話行號會出現藍色標簽,右側的 Breakpoints 清單會出現一筆資料


Reload 網頁,此時下方程式會停留在 276 行,這表示程式執行到這裡停止並等待你的指示。


回到 Scripts panel 選單右側的上方,這裡有幾個小 icon 是我們可以控制程式要如何進行下一步的按鈕。 這裡我們有幾個選擇

  1. pause script execution (F8):點選後程式會正常執行一次的完整程式流程
  2. Step over next function call (F10):點選後會執行到下一個判斷點,這裡點選後程式會執行 switch 的判斷式
  3. Step into next function call (F11):點選後會進入功能,假設你的程式執行停留在一個 function 上的話,點了這個按鈕就會進入這個 function 的內部並停在第一行程式
  4. Step out of current function:跳出這個 function 後停在 function 後的第一行程式
點選 Step over next function 直到 369 行,然後將鼠標移動到node.childNodes.length 的 length 上,這時候會出現 length的值,可以透過這個方式來觀察參數值是否正確或是參數的值來判斷用途


然後自己試看看吧!
工具很簡單但是卻非常好用,鎖定範圍 > 設定中斷點 > 逐行執行程式 > 觀察流程與參數是否正確 > 找出問題!



2011年12月14日 星期三

TestFlight : 讓我們簡化 IOS App 測試流程吧 !


測試 IOS App 遭遇的問題
當我們開發 IOS 專案到後期時總是需要做一堆頻繁的測試,像是:
  1. SIT
  2. Stress Testing
  3. Monkey Testing
  4. UAT
測試的時候通常有幾個非常基本的測試條件:
  1. 測試不同 OS ( IOS3, IOS 4, IOS 5)
  2. 測試不同硬體 (iPhone 3G, iPhone 3GS, iPhone 4, iPad )
  3. 測試不同的頻寬 (3G, WI-FI)
然而這就代表我們需要不只一兩隻的測試手機。
目前Apple 官方提供的測試方式是能讓測試人員藉由iTune安裝測試軟體。不過依照我的經驗是「總會遇到很多一般的User」,而且很多 User 連同步這種事情都不太懂,而這個流程會如下:
  1. 收集各使用者的UDID
  2. 將各使用者的UDID加入 Distribution Provisioning Profie
  3. 將程式打包成 IPA
  4. 使用網路(Mail, FTP, Http)等方式設法將檔案丟給 Tester
  5. Tester 收到後使用跟設備同步的那台電腦安裝 IPA(常常這台電腦都是在家裡)
  6. 測試! 
這些繁瑣的流程讓人非常的頭痛也非常浪費時間,如果版本 build 錯了又要再來一次,這個痛苦的經驗真是讓人想罵三字經。

解決方案:TestFlight 
這個網路服務讓一切變得簡單,你只需要將程式打包上傳到網路上,系統會通知測試人員有新的測試邀請,並附上更新連結提供測試人員下載。而往後的更新只要上傳更新的 IPA 就可以,其他的就由系統幫你做吧。

測試人員安裝步驟
須確定負責的發佈人員已經將測試用的 iDevice UDID 加入到發佈
1. 開啟 TestFlight 寄出的郵件或是請開發人員寄安裝短網址給你,開啓郵件點選上頭的 Install

2. 點選後會令開視窗到軟體安裝的網頁,點選 Install 開始安裝軟體

3. 安裝成功後就可以開始測試

4. 結束


開發者上傳步驟
1. 將測試設備的 UDID 加入 IOS Provisioning Portal


2. 確認 Distribution Provisioning Profile 裡有將測試設備打勾

3. 修改 Xcode 的 Build Settings > Code Sign Identity 中將 Distribution 的憑證設定成你的發佈憑證

4. 點選 Product > Archive

5. 點選 Window > Organizer 選擇剛才 Build 出來的 Archive 然後點選右側的 share

6. 選擇 iOS App Store Package (.ipa), Identity 選擇你的發佈憑證 > 點選 Next

7. 選擇要儲存的地方,點選 Save

8. 到 TestFlight 申請賬號後登入


9. 點選 Upload Build > 將剛才 Build 出來的 IPA 拖曳到網頁上( HTML 5)  > 上傳完後點選 Next: Confirm Testers


11. 將 Anonymous 打勾以允許 UDID 有加入 Distribution Provisioning 的測試人員可以下載,旁邊的數字代表有多少人可以參加這次測試。左邊有 Icon 的使用者是已經加入 TestFlight 才會出現。

  • 如果勾選 Notify the permitted teammates about this build ,完成後系統會計出安裝通知與連結給所有測試人員,但只有已經加入 TestFlight 的使用者會收到。
  • 最下方的短網址就是安裝網址,可以將這個網址傳給所有參加這次測試的測試人員進行測試版安裝。


12. 完成

結論
Apple 原先設計的測試流程太過繁複而且麻煩,當測試人員有 User 的話就會嚐嚐造成測試效率趴在地上,畢竟誰會把自己心愛的 iDevice 跟公司電腦作同步!而且透過網路與系統可以及時通知與跳過 iTune 的部署方式並且大大提升測試版本不屬的速度。




2011年12月12日 星期一

在 Xcode 3.2.6 安裝在 Mac Lion 上



Xcode 3 的專案檔案雖然 Xcode 4 可以開啓,但是問題很多。所以如果是 Xcode 3 建立的專案用 Xcode 4 去開基本上是無法順利開發的。但是現在市面上還是充斥著很多的 Xcode 3 的專案,這造成很多困擾。因為很抱歉的是 Xcode 3 是預設是無法順利地安裝在 Lion 上的。

那要萬一已經升級到了 Lion 了怎麼辦?
還是可以安裝 Xcode 3 的,只是比較麻煩,下面我就說明一下怎解決 Xcode 3 無法安裝到 Lion 的方式。

安裝環境規格
  • Mac Pro 13"
  • OS: Lion Mac OSX 10.7.2
安裝所需檔案
  1. xcode_3.2.6_and_ios_sdk_4.3, [download link]
安裝步驟

下面最重要的部分是使用 Disk Utility(這個工具是 Mac 內建的) 將 Disk Image 轉存成 Read-Write Image 然後修改安裝參數,開始吧!

1. 在 spotlight 打上 Disk Utility 然後 File > Open Disk Image 選擇 xcode_3.2.6_and_ios_sdk_4.3.dmg


2. 點選上面選單的 Convert, Image Format 選擇 read/write > save


3. 儲存完畢後, 連點兩下將新的 image 檔案 mount 起來



4. 打開 Finder 開啟 mount device,在右邊視窗的 Xcode and iOS SDK 點選右鍵開啓選單並點選 Show Package Contents


5. 使用 TextEdit 編輯 Contents/iPhoneSDKSL.dist,然後找到 isDevToolsCompatible 後將 10.7 改為 10.8 後儲存


6. 回到 Finder 連點兩下 Xcode and iOS SDK 開始進行安裝



7. 完成!!!


附註說明
基本上我還是鼓勵開發人員更新你的 Xcode 吧,雖然必須要去熟悉適應新的使用者界面,但是確實讓開發快速也順利很多。而且除非你要繼續拒絕升級 Lion,並且要很麻煩的去更新 IOS SDK 來支援最新的系統。並且身為一個走在時代前端的開發人員,拒絕更新自己是一件很不好的習慣。




2011年12月10日 星期六

了解 jQuery .bind .live .delegate 的差異



一般在使用事件綁定的時候我們會使用 .bind .live .delegate,在某些案例上使用感覺不出差別。但實際上這三個方式是不同的,下面我舉例說明一下有甚麼不同,最後做一個結論分享一下校能與使用情境的感想。

案例說明
我們需要 handle 整個 #container 中所有 a tag 的 click event,下面有三種寫法分別使用了 .bind .live .delegate。


HTML Example


<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Style-Type" content="text/css"> <title>what's different?</title> <script language="javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script> </head> <body> <div id="container"> <a id="a1" href="#">link1</a> <a id="a2" href="#">link2</a> <a id="a3" href="#">link3</a> </div> </body> </html>

.bind
$("#container a").bind("click", function(){alert("what's different?");}); $("#container").append("<a id='add' href='#'>link spec</a>");

每次新增一個 Dom element 後需要重新 bind 才能夠讓該 Dom element 擁有 click 的 handle能力。
所以當執行了上面的 script 後,jQuery 會立即尋訪所有符合條件的 Dom element 並且 bind 上 click event handler。

.live
$("#container a").live("click", function(){alert("what's different?");}); $("#container").append("<a id='add' href='#'>link spec</a>");


在 event bubbling 發生的時候去做參數比對,bubbling 是當事件發生的時候會由 root 發出然後送到每個 children element,每個 children element 會決定是否該對這個做回應。
所以當你觸發了一次 live method 後,往後加入到 #container 的 Dom element 只要符合條件的都會在 event bubbling 的時候被觸發。

.delegate
$("#container").delegate("a", "click", function(){alert("what's different?");}); $("#container").append("<a id='add' href='#'>link spec</a>");

這個方法跟 live 不同的地方是除了 live 的條件之外,他會比對父物件也就是 delegate 某一個 Dom element。他會比對 parent dom element + css selector + event type 三個條件成立才會觸發。

效能問題

.bind .live .delegate 因為方式不同所以在效能上也不同。 

.bind 是在 script 執行後就執行完 event bind的動作,因此效能最好。
.live 會在 event bubbling 的時候對每個 dom element 做條件比對
.delegate 跟 live 的原理相同,但是會額外多比對 parent element 所以效能會比 live 好。

結論
live 可以一次控制所有元件並且不需要在意 dom element 新增的時間,但是會犧牲效能。.bind 會針對指定的 dom element 做處理,只會處理一次,因此指定範圍明確,所以效能最好。 .delegate 改善了 live 的缺點,可以將檢查範圍規範在特定的範圍內。不過每個開發的 usecase 不同,每個情況也不同,至於要使用怎樣的方法沒有絕對值,只能依照情況來做取捨,犧牲效能換取彈性? 這自己搞定吧!


2011年12月6日 星期二

換一個自己喜歡的 Android ROM 吧!

iPhone 與 Android 的手機愛用族群不同,對兩種 App 都開發的我來說我倒是比較喜歡 iPhone 的細緻與整合性,但是我也愛 Android 的高度可掌握性。


拜 open source 的強大社群,Android 除了官方的 Rom 之外可選擇的非常多,也不乏一些效能與功能都很強大的 Rom。只是要享受這些就必須要學一下如何刷,這幾篇我打算詳解一下刷 Rom,也希望大家都可以享受到 open source 的好處。


硬體與 Rom 的規格
  • Phone : HTC Bravo (GSM) = HTC Desire
  • Rom : Cyanogenmod 7.1 (你可以選擇你喜歡的 Rom)
  • A2SD+ : 能夠將 SD card 畫出一塊磁區提供給手機使用,突破總是空間不夠的困境
安裝所需要檔案
  1. 最新的 Cyanogenmod Rom [Download]
  2. A2SDKillerV11_GB.zip, Data2SDInstallerv1.3_GB.zip, 置A2SD+ 工具 [Download]
  3. Google Apps [Download]
  4. MiniTool Partition Wizard Home Edition, 分割 Ext 磁區工具 [Download]
  5. AlphaRev, S-OFF工具, 這次不作磁區修改因此不需使用 [Download]
安裝前說明
A2SD+ 是 XDA 社群未解決總是發現 SD card 空間很多但是不斷出現空間不足的問題,使用的話需要再 SD card 上分割出 Ext2, Ext3 or Ex4 的磁區以供 Android 使用,這裡我們安裝步驟裡頭會使用 MiniTool Partition Wizard 來作。
Google  Apps 是 Google Android 套件,沒有他的話連 Market 都不能使用。Cyanogenmod 沒有將 Google Apps 放進 Android Rom 裡頭是因為版權的問題,因此在安裝完 Cyanogenmod 後還需要安裝 Google Apps。

安裝步驟
  1. 分割SD card,
    先預先切割一個 Ex4 磁區提供給 Android 使用來放置 App 與 Data,再安裝完後可以到[設定] > [儲存空間] 檢查 [內部儲存空間] 大小就可以知道是否成功。這裡我們切割 1.5G 給 Android 使用。 NOTE: SD Card 的速度會影響執行速度。
  2. 安裝 Rom Manager
    這是一個可以刷 Rom 的好用工具,可以簡單的安裝 Recovery,快速的 Root 系統與下載與安裝一些比較 Common 的 Rom
  3. 安裝 ClockworkMod Recovery
    這個工具用來刷 Rom , 安裝 Google Apps package 與製作 A2SD+
  4. 執行權限修正
    取得系統 Root 權限
  5. 將所有安裝所需檔案放到 SD  card 中
  6. 開始安裝 Rom 步驟, 先關機然後按住手機左側的條小音量鍵 + 左上方Power進行開機
  7. 使用音量按鍵調整光棒去選取 Recovery,然後點選 Power 進入 Recovery 模式
  8. 使用音量按鍵調整光棒選取 mounts and storage 然後分別執行 format /cache, format  /data, format /system
  9. 點選 back 然後點選 install zip from sdcard 安裝 Rom
  10. 選擇 install zip from sdcard 安裝 A2SDKillerV11_GB.zip
  11. 點選 reboot system now 進行重開機
  12. 進行手機設定,設定完後重開機進入 Recovery 模式
  13. 選擇 install zip from sdcard 安裝 Data2SDInstallerv1.3_GB.zip
  14. 點選 reboot system now 進行重開機
  15. 開機後進入設定 >  可以看到內部記憶體空間已經變大
  16. 重開機進入 Recovery 模式
  17. 點選 install zip from sdcard 安裝 Google Apps
  18. 點選 reboot system now
  19. 完成刷機
驗證一下
Add caption



這些步驟通用於所有的 Rom,不過有些 Rom 基本上不需要安裝 A2SD+ 的Script,只要把 SD card 切割出一塊 Ext 2, 3 or 4 的磁區就會自動的進行 A2SD+ 的安裝部屬。所以再安裝不同的 Rom 時還是看一下作者的詳細說明。

補充
若是使用 A2SD+ 或是 Data++ 的話 SD card 的效能很重要,因為東西放在 SD card 跟放在內建記憶體的速度有很大的差異。如果速度太慢的話會導致再使用 App 的時候嚴重的 Delay。

2011年12月5日 星期一

Android S-OFF (HTC Desire)

alpharev.iso幾乎大部分的程式開發人員都很喜歡可以控制在自己手上的手機,我也是!
Android於是就成為我的手機,當然喜歡可以控制就難免會刷來刷去的,試驗一下這個Rom試驗一下那個Rom。


iPhone的一體成型讓使用者在安裝App的時候完全不需要care記憶體的問題,16G就是16G的作法非常的方便,但是在Android上頭就區分了兩塊主要的記儲存空間,一是Rom一是SD Card。
Android將所有作業系統所需要的檔案全部放在Rom上,再Froyo 2.2之前所有的App只能安裝再Rom上頭,所以常常裝沒幾個App就沒空間了。


幸好! Google 也算是很快的看到了這個嚴重的問題(有時候我覺得工程師思維真的是有很多缺點的),因此在2.3之後使用者可以選擇將App安裝到SD上去了。


不過問題依然沒有解決,App to SD的模式只是簡單的將程式搬移到SD上,而App的資料依然在Rom上頭,所以當使用了太多的App之後還是會出現空間不足而SD還剩下10幾G的情形發生。


那有沒有辦法讓Android跟iPhone一樣可以讓使用者不需要老是去被空間不足給干擾嗎! 答案是可以。客製化的Rom提供幾個更好的解決方案: A2SD+, Data++。


  • A2SD+ 的技術會將 /data/app與/data/dalvik-cache 這兩個路徑儲存到SD卡上,這兩個路徑分別是軟體安裝路徑與程式碼優化的目錄
  • Data++ 的技術則選擇將dalvik-cache保留在Rom上頭以保持效率
不過如果要使用A2SD+ 或是Data++的話就必須要s-off (這裡指的是HTC的手機)。而s-ff的步驟很簡單,幾個步驟:
  1. 到(http://alpharev.nl/)下載最新的alpharev.iso
  2. 將iso燒錄成cd
  3. 使用alpharev.iso開機
  4. 依照著螢幕步驟作就可以搞定了
注意事項
執行過程中需要注意閱讀題是訊息,步驟三的時候會提醒切勿隨意關機。請遵守否則變磚就不好了

2011年12月2日 星期五

IOS Bundle Id or Bundle Seed Id 解說

今天被問到了甚麼是 bundle id , bundle seed id , application id。
我想寫一篇文章來分享一下。

對於IOS來說每個應用程式都需要有一個唯一的ID來識別,這就像是資料庫裡頭的Primary key一樣,Apple的設計就是使用bundle seed id + application id 產生 application id。



舉個例子說明一下
以開發人員角度進入IOS Development Center後,我們到Provisioning Portal下可以看到App Ids這個項目,裡頭會列出所有的隸屬這個賬號的Application Id,我們看下面這個Application Id範例:
33LE83RVLQ.com.infinitystudio.apps.*

33LE83RVLQ 
這個數值總共是10個字稱作bundle seed id,這會在建立一個新的App Id的時候由Apple自動產生給你。

com.infinitystudio 
這串文字代表的是公司名稱,一般來說我們會使用domain name來呈現,不過當然也可以不需要。

.* 
這個意思代表這是一個廣域的定義,你可以依據在這個App Ids下面開發多個應用程式,
例如33LE83RVLQ.com.infinitystudio.apps.erp 或是 33LE83RVLQ.com.infinitystudio.apps.crm,但是要注意的就是33LE83RVLQ.com.infinitystudio.apps 這就不包括在這個廣域設定裡頭。

結論
由上面的說明可以知道,Apple為了確保應用程式的Id是唯一值,所以他控管了前面十個字元也就是bundle seed id來確保每個帳號下面的每個應用程式都是唯一。而在bundle seed id 後面叫交給開發人員來自行決定自己的產品要如何分類規劃。

補充
application id 與 bundle seed id對於開發純軟體應用app限制並不大,但是對於開發應體與ios設備連接的設計來說就需要注意一下不要使用廣域的app id像是 843EIDJQUJ.com.infinitystudio.*,因為這樣子在附加設備與IOS設備溝通的時候將不能自動啓動軟體。下面說明一下IOS設備與附加硬體設備溝通的流程:
  1. 附加設備連接上IOS設備
  2. 附加設備送出預先燒錄在ROM上的bundle seed id給IOS設備
  3. IOS使用bundle seed id搜尋符合的軟體
  4. 開啓應用軟體
如果使用廣域的app id的話,IOS會跳出提示要你去app store搜尋,所以要注意的是!如果你開發的軟體需要連結硬體,那就要使用完整的唯一的才有辦法自動開啓。

2011年11月30日 星期三

UML - Extension point in Usecase diagram 說明

甚麼是 Extension point
定義一個使用者案例的例外事件,可以將看它看成一到多個 exception path。以「使用者登入」這個使用這案例來舉例的話,這個使用者案例會有下面幾個extension point:
  1. Invalid Username
  2. Invalid Password
  3. Account has been blocked
而這幾個extension point需要被對應到相對處理的使用者案例
  1. handle invalid username
  2. handle invalid password
  3. handle account block
下面是完整的使用者案例圖,說明了使用者使用「login」這個使用者案例,而這個案例會有三個extension points,而這三個extension points分別有各自的使用者案例處理。


2011年11月24日 星期四

Android aapt 指令應用

Android asset packaging tool 是 aapt 的全名,就像名字一樣這個工具是用來進行 apk (Android package )檔案的管理,最常用到的是當程式開發完成後就會使用它來將所有的 application asset 打包成最後能夠安裝的程式。

除了這個功能之外也可使用來進行 apk 檔案的管理,例如:檔案刪除, 新增, 更新, 取出。
這個工具在進行 reengineering 的時候更是不可或缺的工具,不過現在也有很多開發好的 open source 工具可以使用,像是 apktool。

指令位置
{android-sdk location}/tools/aapt
簡單的使用指令說明

查看使用方式很簡單,只要不帶參數執行便會顯示詳細的使用說明
aapt 

下面來說一下怎樣使用這個程式來進行 apk 的管理,下面只介紹基本的操作其餘參數請自行參照說明,文件執行環境:
  • MAC OSX 10.7.2
  • Android Asset Packaging Tool, v0.2
打包安裝檔

aapt p -v -z -x -u -M {AndroidManifest.xml 檔案位置} -A {asset 目錄位置} -S {res 目錄位置} -F {產生的 apk 儲存路徑包含路徑}

查看檔案內容清單

aapt l -v {apk 檔案完整路徑}
可搭配 grep 快速地查找自己所要的結果


刪除檔案

aapt r -v {apk 檔案完整路徑} {刪除的檔案所在 apk 內的完整路徑,若多檔則使用逗號分隔}

新增檔案
aapt a -v {apk 檔案完整路徑} {所要新增的檔案,若多檔則使用逗號分隔}

更新檔案
aapt r -f -v {apk 檔案完整路徑} {所要新增的檔案,若多檔則使用逗號分隔}


相關聯結
Android developer guide - Building and Running (http://developer.android.com/guide/developing/building/index.html#detailed-build)
Android-apktool (http://code.google.com/p/android-apktool/)


2011年11月23日 星期三

IOS Cocoa Touch Static Library 開發教學

提升軟體開發效率最有效的方式就是建立可重用的元件,基本上只要在一個專案中被重復使用兩次以上的功能都可以被納入元件設計的範圍中,這樣的概念是通用於所有開發語言的。

在IOS的開發中這樣的概念在XCode中就已經有支援了,因此今天這篇文章就使用一個簡單的範例來展示一下如何達到。

開發環境

  1. XCode 4.1 build 4B110
  2. iPhone 4.3 Simulator
下面會使用XCode建立一個 Cocoa Touch Static Library Project 與一個 View-based Application,先建立一個static library然後引入到 view-based application中進行開發使用。

建立靜態元件(Static Library)
建立Cocoa Touch Static Library Project
File > New > New Project > Framework & Library > Cocoa Touch Static Library
(這裡建立的專案名稱為: BikeLibrary)

編輯BikeLibrary.h 加入功能宣告

編輯BikeLibrary.h 並實作功能

選擇目標裝置 iPhone 4.3 Simulator & 編譯 (Product > Build)


建立一個新的資料夾 BikeLibrary 將 libBikeLibrary.a + BikeLibrary.h 複製到目錄中就完成了共用元件的製作。


建立專案並使用靜態元件
建立一個View-based Application Project
File > New > New Project > Application > View-based Application
(這裡建立的專案名稱為: BikeController)

複製靜態元件到專案目錄中


編輯 BikeControllerViewController.h 加入 BikeLibrary.h


編輯 BikeControllerViewController.m 呼叫靜態元件

執行模凝器 iPhone 4.3 Simulator 並且觀察 Output Console 是否正確輸出 debug訊息

Comment 
好的元件設計能夠替開發人員省去寶貴的開發時間,在面臨需求變更與效能調教時也能夠很快速地達成。省下來的時間拿來增進自己的知識或是研究更好的技術這才是根本的解決之道。