2012年3月26日 星期一

讓 Xcode 與 Git 合作愉快

一般而言用 git add 加入一個專案的時候,git 會自動把整個資料夾裡面全部的資料都加入
就會看到如下的圖
而一般的我們,看到這麼多檔案,就直接按確定加入了。但其中有一個是不能加入的,等等來看看。
接著就開發程式,寫到一個部分就 commit,看起來 Project Navigator 也很乾淨,如下

但在 Push 的時候經常性的會發生像下圖一樣的錯誤
到底什麼是 uncommitted ?從 Xcode 跟本看不到,於是打開 Terminal 下指令來看看
各位看倌可能看不清楚,把紅色的貼在下方:
modified:   PlayGround/PlayGround.xcodeproj/project.xcworkspace/xcuserdata/chronoer.xcuserdatad/UserInterfaceState.xcuserstate
原來在有一個叫 UserInterfaceState.xcuserstate 檔案也被改變了,但是在 Xcode 完全看不到?所以一開始的時候 UserInterfaceState.xcuserstate 不要加入 Git Repository 因為它是 Xcode 產生暫時性的 Binary 檔。如下圖,git add 時候不要勾選。
但如果已加入怎麼辦?
在還沒 commit 之前 可以用 git rm --cache  fileName 來當成 undo git add
再者用指令,將其排除在 git控制外
在根目錄輸入
vi .gitignore
gitignore 的內容是
*.xcuserstate
再加入 .gitignore 用  git add .gitignore
然後 commit 此時如果之前不小心也 commit 了 UserInterfaceState.xcuserstate
就用 git rm PlayGround/PlayGround.xcodeproj/project.xcworkspace/xcuserdata/chronoer.xcuserdatad/UserInterfaceState.xcuserstate
將 UserInterfaceState.xcuserstate 從 Git 移掉
之後  UserInterfaceState.xcuserstate 再來不會來亂了
Xcode 和Git 就可以相處得很愉快。



2012年3月14日 星期三

LLVM 支援新的語法?

小道消息,Apple 的 LLVM 有出現新的語法了,目的還是想讓 Developer 可以寫少一點的Code
是從這邊傳出來的。

讓我們來看看。
NSNumber :

[NSNumber numberWithInt:50];              =>  @50;
[NSNumber numberWithDouble:5.21]     =>  @5.21;
[NSNumber numberWithBool:YES]        =>  @YES;

推論,在數值前加上 @ 就變成一個 id

NSArray :

@[@"one", @"two", @"three"];

多了 @ 和 []

NSDictionary :

@{ @"key": @"value", @"red": @"apple" };

就是加上 @{} 還有 :來分別 key 和 object ,看起來是先寫 key

到底會不會變這樣呢?無從得知,不過如果是這樣還滿方便的

2012年2月3日 星期五

如何偵測手機是否JB

這篇的討論是用幾個常見 JB 過的行為來偵測是不是 JB 了,而沒辦法提供一個 100% 肯定的解決方法。首先我們來看一下 JB 過的 iOS 會有那幾個特色?
  1. 會有 Cyndia 這個 App
  2. 會需要背景執行
  3. info.plist 的SignerIdentity會被變動
我們就上面三點來假設都是 JB 需要做的行為,如果我們取得這些行為之後留下來的證據,就可以假設此手機是被 JB 了。我必需要再強調一次,這篇文章的行為我都還沒有真正測試過,只是收集網路上和書上的例子寫成,還請大家補充。
如何檢查此手機是不是安裝了 Cydia
NSString *filePath = @"/Applications/Cydia.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
// 檢查是不是有 Cydia 這個程式
}
一般來說 iOS 現在是多工,方便切換程式而不是像 Mac 或 PC 作業系統的背景執行,通常 JB 後會把背景執行這個功能打開就會用到 fork() 這個指令,所以檢查有沒有背景執行的功能(fork())就可以知道有沒有 JB。
int result = fork();
if (result > 0) {
     NSLog(@"JBed");
}else{
     NSLog(@"NO JB");
}
JB 之後,就會有心人士把一些要付費的 App 給破解,從此之後這個 App 就會被放到網路頁讓人任意下載。而有心力在做這個行為的同時會破壞掉這個 App 裡 info.plist 的 SignerIdentity,於是我們就來檢查。
NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
if ([info objectForKey: @"SignerIdentity"] != nil)
{
    // 此程式可能被破解
}
以上三種方法提供給大家參考用。但我們寫 App 的人要還要再想清楚,JB 的人是不是有可能也會花錢買我們的 App。此時第三個方法好像比較可以保護我們自己的資產。如果提到破解 App 的問題,一開始 App 免費,然後用 in app Purchase 也許也可以是另一條保護自己 App 的方法。歡迎大家提出來討論。

2012年1月31日 星期二

出版界的大轉變

Apple 每次一推出新的作品,都造成業界的洗牌效應,App 的推出掌上型的 Game Console 被打在地上趴著,現在可能有些是稍為半蹲的姿態。
這次的 Education - iTunes U + iBooks + iBooks Author 會造成出版界的大洗牌嗎?
首先來看看假設我是出版商會採取什麼樣的手段。
有道是,放下它,接受它,了解它,幹掉它。
有憂患意識的出版界的人員們應該早就會體認到數位出版是遲早的事,問題在於不知道自己應該如何做才不會被這個洪流給沖走?所以,放下它,和接受它,應該是早就有的心理建設。
接下來就是如何了解它了。也就是說應該去學什麼東西?就從 Apple 提出的產品學起。
先來解釋一下出版社是如何和作者(也就是我)互動的。
我先用 iWorks 的 Pages 寫我的書的內容,排版也是用最簡單的幾行字,一張圖。但是後來把內容交給出版社的時候,出版社沒有 Mac 更別提 Pages 了,於是我轉換到 M$ Word 上面寫書的內容,還好我有先把一部分寫完的交給出版社,才可以早點發現這個問題,但是還有問題。我用的是 Mac 的 M$ Word,天知道和 Windows 的 Word 格式還不是完全一樣,orz. 所以還有花一些時間在排版上。這讓我體會到同樣的工具,同樣的格式是多麼的重要,尤其在趕時間的時候。
我就一邊寫,一邊請出版社校稿,原本以為文筆不錯的我,最多就是找一下錯字,沒想到還被修了幾個述敘的文法和語句,坦白說出版社改的語句比較暢通,有專業知識的人,不見得寫得出一般人懂的文語,這樣簡單的道理,總是一直再被驗證無誤。校稿,出版社的人工是少不了的。最後寫的差不多,是要決定書的封面和正式的排版了,我自己當然不會排,排版不是都要用 inDesign 排的嗎?我也知道,就算會用 inDesign 也不見得排得出好看的,還是把美編交給專業的吧。看愛書的我,還在逛二手書店的時候看到一本很舊的書的封面和我的書的封面有點像,還特地找出來和出版社討論,這時不得不讚美一下藍海,竟然在六日的時候和我通 e-mail 討論封面長像。
書一直在校,我一直在寫,到最後出版之後,除了每幾本書送給親人五十之外,出版社還要四處找大學的教授買,發電子報推銷。行銷的工作不會因為電子化而減少,而是要去學另一種方法。很容易產生書,就更要注重行銷,就好像 App 有 50多萬個,放上去之後就好像石沈大海。不行銷,只有死路一條。
如果我們歸納上面的說法,
出版界要學的就是
新的工具 - iBooks Author
如何善用校稿訂正功能
如何排版
在數位的世界怎麼行銷 - SEO, Social Network....
當然一些基本的,怎麼和 Apple 打交道,註冊,放書的內容,拆帳比例等等的知識
不過第一件事應該是
買一台 Mac - 對台灣大部分的出版社來說

2012年1月29日 星期日

iBooks Author - 3D Model

這篇文章是前篇 Apple Education 文章的延續,來探討一下 iBooks Author 中的加入 3D 物件的功能。也就是 Widgets 裡的 3D,請看下圖紅色框框之處。

當我們按下之後,很可能會看到底下的圖面
中間有個像原子軌道的畫面就是 3D 物件要呈現的地方。確定有選好這個物件,接著按下右上方的 inspector。就會出現可以選取的視窗,如下。
當然是選取 3D File 旁的 Choose... 按鈕啦。但先在這等等,我們從那裡生出來 3D File ?看一下這篇 Apple 的教學 我們發現需要一個 3D 的工具來輸出 dae 檔。dae 檔其實是 COLLADA 這個組織規範的檔案格式,也是大部分畫 3D 的工具都會支援的格式,我們查一下 wiki 會列出有那些工具。
Software tool
Application
  • ArcGIS
  • TNTmips
  • Google Earth - (release 4) has adopted COLLADA (1.4) as its native format for describing the objects populating the earth. Users can simply drag and drop a COLLADA (.dae) file on top of the virtual Earth.
  • Google SketchUp Pro (or any version of SketchUp starting with 8.0) can also be used to create .KMZ files: a zip file containing a KML file, a COLLADA (.dae) file, and all the texture images.
  • Mac OS X 10.6's Preview allows opening collada files for viewing in 3D.
  • OpenSimulator
  • Second Life
就請讀者挑自己喜歡的,下手。筆者呢就以 Google SketchUp 當做例子介紹,除了它是免費的之外,它還有 warehouse 可以直接使用很多別人畫好的 3D 物件。它還有很多教學有興趣的朋友不妨試試。畫好自己的 Model 之後可以直接在 SketchUP 輸出成 dae,首先如下選擇 Export -> 3D Model
然後會跳出視窗,選好 dae
之後回到 iBooks Author 選到此 dae,如下。
圖形可能會怪怪的,不過直接透過 Preview 在 iPad 用手指動看看,就會是一個可互動的 3D 物件。如下在 iPad 上的畫面

2012年1月20日 星期五

蘋果與數位教育



創業的這一年多來,常常有朋友在問客戶在問學員在問,是不是能開發數位電子書平台相關的東西,甚至還有同業成立公司的主旨就是要打造一個數位學習平台來取代傳統的教育出版業。
看完 Apple 的 Education Event 我想,應該很多人在這個影片找到了答案,可能是他們想要的,可能是重新思考人生的方向。我非常建議大家先去看看 Event 的原始影片然後再往下看這篇文章,才不會失去了自己的思考邏輯而被其他人左右。
首先會談談幾個重點帶來的好處,最後會有個 Step by Step 的說明如何使用 iBooks Author 這個 Tool 來上傳,出版自己的數位內容產物。
首先是 iTunes U,這個經營了好幾年的產物卻沒有同質性的 Open Course 來的搶眼,Open Course 的強大造就了朱大,可以讓朱大和大多數男性們的愛慕者,蛇姫,一起工作,恣意地把目光投注在大家都想投注的地方。離題了,抱歉
下載 iTunes U 後使用者可以隨意選取要上的課,以 MIT 的 Algorithm 做例子,裡面有 Lecture Video,Homework,Quiz,Quiz Answer,就是一套完成的教材內容,可以透過 iPad 輕易地發佈給學生,學生可以方便地自行學習,加上筆記。實際上來看看 iTunes U 的內容
首先是 Info,課程簡介,講師,大綱
再來是 Post,Lecture Video,Homework
Notes. 學生可以自己新增筆記
最後是 Material。教材統一放置的地方

iTunes U 對於教材的規畫如此完整,當然不是 Open Course 可以比擬的當然最重要的一點就是因為 iPad 的超級受歡迎,Apple 努力對於教學計畫的耕耘不放棄的結果。
再來當然就是 iBooks Author 這個簡單到爆掉的出版軟體,相信有用過 iWorks 的朋友們就可以理解,Apple 的 iBooks Author 承襲了 iWorks 文書處理簡單操作的特色,簡單排版那就不用說了,iBooks Author 有 7 個重要的亮點,或者說 Widget。分別是 Gallery, Media, Review, Keynote, Interactive Image, 3D Model, HTML Support.
  • Gallery 很多個Image 可以像畫冊一樣呈現給使用者
  • Media 在書本中插入 video
  • Review 加上簡單的問答題
  • Keynote 上課用的投影片
  • Interactive Image 互動式圖片
  • 3D 讓學生可以用手播動的 3D 物件
  • HTML 自訂任意的 HTML 5 內容
這 7 種的 Widget 應該滿足大部分書的需求。個人出版的世界可能要因為 Apple 而加速來到這個社會了。當然這個 Tool 的要求就是要有 Mac 免費下載,製作出來的書,也是專門給 iPad 用的。因為書當然以平板為主,而平板就是 iPad 獨大。
iBooks 更新到 2.0 在iPad 上的 App ,本來大家都不鳥他,我想會因為 Text Book 和 iTunes U 的關系而變成熱門的 App。用 iBooks Author 製成內容的載具。
以上提到的三樣東西,iTunes U, iBooks Author,iBooks 都是 Free.
簡介完 Apple 提出的 Education 生態系之後,我想大家最想做的事,應該是來用看看 iBooks Author 和上傳自己的內容吧。接下來一步一步教大家怎麼做。
首先假設大家用 iBooks Author 把內容寫好,存好檔了。先看 iBooks Author 上方
這兩個很重要的按鈕,如下
首先來用一下 Preview。在 Mac Book 上接上 iPad,記得 iPad 要更新 iBooks 這個軟體,並且把 iBooks 打開。按下 Preview 之後就會看到剛剛在 iBooks Author 的內容,傳到 iPad 上面了,不過我遇到的問題是直著拿 iPad 的時候圖不見了,沒有像 Education Event 說的自動接軌。
OK 再來就是 Publish 了,按下 Publish 之後會跳出一個視窗如下,藍色這個連結很重要。
按下藍色連結之後會跑出申請 iBooksstore的提示,因為我們沒有任何相關的帳號可以放到 iBooksstore 上面,所以要先去申請一個。如下的為了要上傳的準備步驟。
幾個要項用中文解說一下
  • 創造一個 seller account
  • 下載 iTunes Producer
  • 要賣書的話,合約,稅,銀行等的問題
  • 產生書的內容(用 iBooks Author) 檔案 2G為限
所以第一個連結 Create an iBookstore seller account 是我們要做的事,就按下去看看,就來到下面這個網頁。
所以第一個 Sell Your Books 的連結 online application 是我們要的,再點下去。

左邊是付費的書右邊是免費的書,雖然我們要先申請免費書用的,不妨點一下看看要賣書的話要有什麼資格?先點一下左邊。
 需求主要兩類技術上和財務上。
 技術上:
  • 要有 intel-based 的 Mac 作業系統是 10.5.8 或之後
  • 要有 1G 的記憶體
  • 要有 QuickTime 7.0.3 或上以這個播放 Video 的軟體
  • 至少要有 10G 以上的磁碟空間
  • 建議有 1MB 的網路上傳速度
財務上:
  • 要有 US Tax ID
  • 有信用卡資訊的合法 iTunes Store 帳號
  • 有收入的時候要到一定的金額 Apple 才會付錢
大概有了解就好,應該是 US Tax ID 比較難取得。回到申請免費書的帳號吧。
應該是下方的畫面。
所以要先有 Apple ID,填完之後去 Apple ID 的 e-mail 收信就可以開通帳號了。開通之後登入 iTunes Connect

第一件事就是去下載 Deliver  Your ContentiTunes Producer
再回到 iBooks Author,按下 Publish。
就會自動打開 iTunes Producer 然後看到下方的畫面
只要每頁有紅色星星的填好資料,然後按右下方的 Next 全部有紅色星星的都填完就可以了。有錯的話在最後 Delivery 會列出所有錯誤訊息。如下
或是 Delivery 之後也會有錯誤訊息可以看。提醒大家一下,書的封面圖片在 Asset 設定,記得給某一邊是 600 pixel 的就可以了。
上傳之後會在 iTunes Connect 可以看到這本書。
 點下 Manage Your Books就可以看到自己的書了。

最後附上下載紀錄。



2011年10月29日 星期六

Storyboard 第三部曲:Segue & Delegate

我們再來對 MyFirst5 這個 Project 新增新的功能。還記得之前的文章嗎?
About Storyboard
View Controller (NSObject) 之間交換資料 by Segue
最後我們停留的 Storyboard 畫面如下。
右邊的 Done Button 還沒有功效,除此之外再加上一個新的功能,當使用者在 Second 輸入文字後,按下 Done 就會把 Text Field 的文字傳到左邊的 View Controller 的 Label 上,也就是改變了目前看到 Hello Story 的顯示。
不過首先要加上一個很自然的動作,就是按下 Done 按鈕之後會離開 Second 畫面回到 Hello Story 這個畫面,因為Second 這個畫面是按下 Show 之後利用 Segue而呈現出來的,有呈現就有退回,我們就寫在 Done 這個按下的動作裡。
所以我們要加上一個 IBAction 來相對應 Done 按下這個事件,也就是要在 SecondController.m 新加一個 IBAction。名為 doneEditing。如下所示。
在這裡用到新的 method 在 Line 49 名為 dismissViewControllerAnimated:completion: 這個是用來取代之前的 dismissModalViewControllerAnimated: 而且 Apple 的文章也建議之後都用這個不要用 dismissModalViewControllerAnimated: 相對的,呈現的時候也有一個名為
presentViewController:animated:completion: 用來取代之前的 presentModalViewController:animated: 請大家注意。好。執行之。就可以看到按下 Show 和 Done 是個相對應的動作,在 Hello Story 和 Second 畫面之間切換。如下所示。


接著我們要從 Text Field 傳資料到 Hello Story。不過在此時,我們想一想,資料傳遞方向和 Segue 相反,所以在資料的傳送端建立 Protocol 而 資料的接受端就是 delegate 的對像,就要實作傳送端的 Protocol 提到的 method 才可以收到資料
好,我們在 SecondController 建立為了把 Text Field 的資料傳送出去的 Protocol 如下表示。在 SecondController.h。
這個Protocol名為 SecondDelegate 寫在  Line 10。再準備一個 delegate property,這個變數所指的對像就是要來收到 Text Field 上面資料的。型別就是 id<SecondDelegate> 意思就是任意的 Class 但要實作 SecondDelegate 所宣告的 method。那 SecondDelegate 這個 Protocol 的主體就在 Line 17 ~ Line 21 。唯一的一個 method 名為 second:inputString: 也就是說,要收到 Text Field 的資料的物件就要實作這個 method。那在什麼時候傳過去 delegate 的物件呢?就在 Done 按下去的時候,所以要在 doneEditing 這個 method 要再新增傳資料給  delegate 所指的物件。於是如下更改。

從 line 49 到 line 52 是新增部分,就是確定 self.delegate 有實作 second:inputString: 然後就直接呼叫了。Good,到目前為止就是傳送端準備好了,定義好 Protocol 準備好 Delegate 來使用,接下來看接收端,左邊的 HelloController 的實體,也就是 HelloController.m 要實作 second:inputString: 但我們首先在 HelloController.h 提示一下 Compiler 要實作 SecondDelegate 這個 Protocol 如下所示。
比較要注意的是在 Line 10 要 import SecondController.h 因為 Protocol 在這邊宣告,然後在 Line 11 多了 <SecondDelegate> 這個就是和 Compiler 說 .m 要實作其 method 哦。這樣 Compiler 才不會給警告。ok 在 HelloController.m 要加上 second:inputString: 的實作。如下。
很簡單就是收到 inputString 之後去更改  helloLaebel 的 text 。到此,無論是傳送端或是接收端,行為都在 Class 定義好了,執行的時候物件就會依這些定義行為。但是還有一件事情還沒做,就是 HelloController 的物件,和 SecondController 的物件還沒有關係?怎麼說?剛剛做的事情就是定義 method,忽略了,SecondController.h 不是有新增一個 delgate 變數嗎?什麼時候給值,這個變數要指定到正確的物件,值才會傳過去,那要寫在那?指定給誰?指定給 HelloController 的物件,這個比較明確,問題比較大的是寫在那?
這個問題有了 Segue 會比較明確,還記得之前一篇,從 HelloController 實體傳資料給 SecondController 實體的程式碼寫在那呢?寫在 HelloController.m 的 -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {} 嘛,所以要把這兩個物件實體的關係綁在一起的程式碼就寫在這,因為在這可以同時存取到兩個物件實體。如下所示。
就只多了 Line 64 把 self 也就是 HelloController 的實體指定給 secondCon 的 delegate property 了。直接執行就會看到如下。
好了。三部曲告一段落,希望大家多懂一點 Storyboard,對大家的工作和興趣有幫助。