更新:Apple加入很多Objective-C的新功能與特色,但只有"Apple修改過的gcc"與"clang(llvm)"能夠提供,所以,本篇介紹的GNUstep的gcc,其Objective-C的部份已經太舊,沒辦法編譯新的Objective-C。我另外寫了一篇「在Windows上寫Objective-C程式(使用GNUstep與Clang、LLVM) 」,在GNUstep之上,再安裝clang與llvm。
這篇要介紹的是,如何在Windows XP平台上寫一支Objective-C的hello world!程式。
問:想開發Mac或iPhone或iPad的軟體,該怎麼辦?
答:使用Apple官方的軟體開發工具Xcode,只要到Apple公司的開發者網站,註冊一下(免費),即可下載最新版的Xcode。Xcode只能在Mac OS X(作業系統)上運行,所以要買一台Mac機器(硬體)。
問:哇,這麼多種漂亮的Mac,應該買哪一台啊?
答:有錢的話就買最貴的那一台*_*。

問:什麼是Xcode?
答:Xcode是Apple公司官方的軟體開發工具組,可開發在Mac、iPhone、iPad的軟體,是一個總稱,裡面包含很多東西,有整合式開發編輯器(IDE,也叫做Xcode)、視覺化使用者介面開發工具(Interface Builder)、compiler、linker、debugger(gcc、gdb、llvm...)等等、還有iPhone的模擬器,以及各種framework(函式庫、類別庫、API)。
這是Xcode IDE,負責管理專案檔案、編輯、以及各種設定,從這裡進行編譯除錯執行。

這是Interface Builder,視覺化使用者介面設計,使用拖拉放的方式來操作。(Xcode 4已經整合Interface Builder)

這是iPhone simulator,不用買一支iPhone也可以進行開發iPhone軟體喔。

也就是說,如果你有一台mac(花錢買),下載Xcode(免費下載)後,就可以開始開發,在模擬器上執行看到成果,但是,如果想在iPhone實機上執行你寫的程式的話,那就要加入Apple的iOS Developer Program(要錢,一年要付$99),至於加入、付錢、設定、下載軟體到手機上的過程,本篇不介紹。
問:想先學學Objective-C程式語言,還不想砸錢買Mac,有辦法在Windows上寫Objective-C程式嗎?
答:有,就是這篇的重點了。
問:聽說gcc可以編譯Objective-C,所以在Windows上裝cygwin,裡面有gcc,就可以寫Objective-C程式了?
答:cygwin的gcc的確可以編譯Objective-C程式,但光裝cygwin並不會有任何的物件類別庫(library、class library、framework),所以也就沒有各種基本的物件類別可以用,沒有NSLog可以呼叫(想像成c的printf);沒有NSObject可以繼承,讓你沒辦法立即開始寫自己的物件;沒有Foundation.h(想像成c的stdio.h)連preprocessor都過不去,更別提compiler了。所以只有compiler是不夠的。
問:所以除了compiler還需要?
答:一套framework,裡面會有基本的物件類別。如果是裝Xcode就會有Cocoa for Mac、Cocoa Touch for iPhone。Cocoa大致上分為Foundation跟AppKit兩個部分,AppKit是GUI元件與較高階的元件,而Foundation就是一堆基本的物件類別,例如NSObject、NSString、NSArray、NSNumber等等;而Cocoa Touch分成Foundation跟UIKit,差不多的意思。
問:聽說Cocotron...?
答:Cocotron也是一個Objective-C的開發環境,其目標是讓開發出來的軟體可以在各種平台上執行,例如Windows,但其本身還是要搭配Xcode使用,所以不符本篇主題。
問:那所以咧?
答:使用GNUstep,可在unix-like與Windows上使用,有Cocoa API,也有一些開發工具(類似Xcode提供的工具)可以用,但本篇重點是在Windows上寫一支Objective-C的hello world!程式,所以會用命令列模式shell,只會使用compiler的部份(也是gcc),以及鏈結Cocoa API中Foundation的部份,也就是說不理會AppKit的部分,也不會介紹GNUstep提供的開發工具(Gorm, ProjectCenter...)。
問:GNUstep可在哪些版本的Windows上跑?
答:官方網站上說在WinXP與Win2K測試過,我的電腦是Windows XP。
問:怎麼安裝GNUStep?
答:到GNUstep網站的Windows下載區,下載下面三個安裝套件。
1. GNUstep MSYS System, 41MB. 基本環境與命令列shell。
2. GNUstep Core, 7.6MB. 函式庫、類別庫。
3. GNUstep Devel, 30MB. 開發工具,gcc、make、gdb等等。

注意:請按照順序安裝。
把三個都安裝在同一個目錄,安裝時也都是按Next即可。安裝後執行程式集-GNUstep-shell,會出現一個命令列畫面,恭喜你,已經成功了一半。

問:接下來,怎麼編譯執行一支hello, world!程式呢?
答:用你喜歡的編輯器寫程式,大致內容如下:

把檔案命名為hello.m,.m是Objective-C程式檔案的附檔名,放到家目錄下,大概在C:\GNUstep\home\username,自己找找,然後在shell下執行gcc hello.m,本以為沒啥問題,哪知道出現了一堆錯誤訊息,哇靠。
別急,一個一個來。
首先是error: Foundation/Foundation.h: No such file or directory,找不到Foundation.h ?
因為gcc找不到該.h檔,加入參數-I /GNUstep/System/Library/Headers即可解決。
然後仍然會出現error: cannot find interface declaration for 'NXConstantString',原因是constant string例如@"hello, world!",以前是用NXConstantString,後來改成NSConstantString,所以加入參數-fconstant-string-class=NSConstantString來修正。
到此compile部分已經沒問題了,如果你加上-c參數就可以成功編譯出.o檔。
但是不加-c的話,compile結束後自動帶進的link階段會出現錯誤,訊息會說找不到objc_get_class、objc_msg_lookup、NSLog、__objc_exec_class、__objc_class_name_NSAutoreleasePool、__objc_class_name_NSConstantString。
加入參數-L /GNUstep/System/Library/Libraries -lobjc -lgnustep-base來告知去哪找函式類別庫做link以及該link哪些東西。-L是指定去哪找,-lobjc是Objective-C的核心執行時期函式庫,-lgnustep-base就是Foundation的部份。
注意:下指令時要把hello.m放在-lobjc -lgnustep-base的前面。
雖然還是會有linker warning,但a.exe執行檔已經成功產生出來了,執行的話就會看到hello, world!囉。
如果你不想看到warning,加入-Xlinker --enable-auto-import。
最後完整的指令是:
gcc hello.m -I /GNUstep/System/Library/Headers -fconstant-string-class=NSConstantString -L /GNUstep/System/Library/Libraries -lobjc -lgnustep-base -Xlinker --enable-auto-import

問:打這麼長的指令好麻煩?
答:可以用make,或是寫一支小小的shell script。本篇不介紹:D。
問:學習Objective-C與iOS的資源?
答:請看另一篇。
2010/06/08
Objective-C on Windows
2010/05/20
讀後感:殺人之門 by 東野圭吾
注意:會提到情節,小心踩雷。
書名:殺人之門
作者:東野 圭吾(ひがしの けいご)
好像是我在澳洲玩的時候吧,一個台灣朋友提到日劇偵探伽利略,提到以科學知識與思考來解決不可理解的懸疑現象,因為我跟作者一樣是理工科出身的嘛,所以我看了,感覺還不錯;後來一個以前的同學提到電影嫌疑犯X的獻身,我也看了,嗯,覺得還好;後來慢慢聽到東野圭吾這個名字,但看了日劇名偵探的守則,卻覺得滿無趣的,心想或許小說會好一點;直到現在才買了第一本小說殺人之門來看,主要是因為有陣子看了一些網路上講傳直銷經驗故事的文章,有提到這本書。
故事內容主軸是主角與倉持的關係,雖然一開始倉持似乎還算是主角的朋友,但那是因為主角被蒙在鼓裡,他不知道倉持帶他去下輸贏有算錢的五子棋,倉持每局都有抽成的;他不知道他收到的恐嚇信(要照抄數份再寄給別人,不然會不幸),是倉持寄給他的;他不知道祖母被母親下毒而死的謠言,是倉持放出去的,也因為這樣牙醫父親逐漸墮落,開始家道中落,主角的學生時期也因為閒言閒語而遭受排擠;真的很慘啊,本來是小富之家的少爺,因為遭受倉持的嫉妒(倉持家很窮),整個少年時期過得極不如意,而且,更慘的是,主角全部不知情(算是有猜到一點點吧),而倉持有如良心被狗啃去,還敢跟主角稱兄道弟,怎一個慘字了得。
打工認識的初戀情人也被倉持搶走,還被搞大肚子自殺身亡;出社會在工廠工作,也因為被倉持說動去直銷公司假扮被說服而加入下線的演員(用來引誘其他人也掏錢加入),而丟了工作;但倉持畢竟是倉持,是沒有羞恥心的,跟他理論反而會覺得是自己錯了,還跟他對不起,於是主角又跟倉持進了一家賣黃金的騙人集團,誘騙老人的年金與定存去買一張不值錢的廢紙,在主角良心過不去決定退出而譴責倉持時,倉持還振振有詞惺惺作態說自己也是受害者,也被公司騙了,其實早就一切了然於心,只不過是在等好時機棄船罷了。
主角不禁大哭,因為黃金詐騙事件,不僅碰觸到那可怕的人性黑暗面,而且還被喜歡的女生如此嫌惡,豈能不悲從中來,更沒天理的是,倉持再一次假扮正義使者幫助了那個女生,還結為連理,哇,老實說看到這裡已經不知道該說些什麼,故事才進行了一半,對倉持我已深惡痛絕,卻又不寒而慄,如果有這種聰明奸詐戴著好幾層面具的人對付我,我恐怕下場比主角還要淒慘。
前面故事中,主角還必須負擔一點責任,可是接下來的情節,只能說完完全全被設計了,倉持的功力更加高竿,手法更加高明,破綻更加難尋,操弄人性的脆弱絕對不手軟,從之前的直銷寶石到黃金買賣,現在是股票投資囉,甚至還要插足土地房地產,但他需要棄子,一個可以信得過的棄子,主角就是他的棄子,還要讓主角以為倉持是他的朋友,你能想像得到嗎?主角居然被自己的老婆(倉持設計的)仙人跳,有沒有被自己老婆仙人跳的八卦啊?在這裡就不多描述後半不的情節,請大家自己閱讀吧^_^。
這本書的故事可以說是一連串的詐騙,其實我覺得取個詐騙相關的名字比較貼切,那為什麼是用殺人之門呢?有什麼含意?那是因為,殺人這檔事,是沒辦法後悔的,人死後就不存在了,殺了一個人就永永遠遠再也用不著也不會看到他了,當你討厭某個人,可能會罵他,痛恨某個人,可能會打他,但當你跨越最後一道門,也就是殺人的時候,那一定是走到了極端,到了最終最後的田地,無法回頭無法挽回,無法後悔地想要將對方殺掉,而作者就是藉由倉持不斷不斷地欺騙主角,主角的情緒已經不可能平復,心境不可能回轉,只能也必須走上殺死倉持一路,那道成為殺人魔的門。
或許可以有另外一種延伸解釋的方式;有人說一皮天下無難事,如果一個人不要臉,什麼事情都做得出來,當大眾受到道德與社會規範限制時,如果有一種人,視良知人性如無物,為求成功不擇手段,真真切切地不擇手段,這種惡毒的人,就好像有操縱人心的力量,就好像突破人的極限,成為惡魔,真是可怕啊。而且更厲害的是你察覺不出來,說不定你身邊就有這麼一個邪惡的天才,小心啊。
2010/04/29
讀後滿足:直搗蜂窩的女孩(The Girl Who Kicked the Hornets' Nest)
注意:會提到情節,小心踩雷。
書名:直搗蜂窩的女孩(The Girl Who Kicked the Hornets' Nest)
瑞典原名:Luftslottet som sprängdes ("Air castle which was blown")
作者:史迪格.拉森(Stieg Larsson)
譯者:顏湘如
出版社:寂寞
看了前兩集後,便一直等待第三集,中文譯本一出現,馬上買下,徹夜讀完六百多頁,暢快淋漓,既滿足又安心地上床睡覺去。
第二集留下了一個很大的尾巴,很容易就可以猜出下一集中將會出現的概略情節走向,雖然如此,但我畢竟不能想出作者會怎麼寫,而且這本的情節交纏的複雜度更勝前作,也出現不少情理內意料外的安排,閱讀過程時時都有迫不及待翻到下一頁的衝動,閱畢後拍桌讚嘆不已。
這一集的內容簡單而言就是幫莎蘭德平反,『被控傷害、重傷害、恐嚇、殺人未遂、非法侵入、盜取、竊車、非法持有武器、隱瞞證物;被診斷為妄想型精神分裂症,有嚴重的精神障礙,有暴力傾向,嚴重人際互動問題,被褫奪公民權力,被宣告失能,自我憎恨、自戕與反社會行為,濫用藥物與雜交,以及性精神變態』,哇賽,洋洋灑灑還真不少啊,而在這所有種種的背後那一團黑影,也要在這集顯露出來。
雖然這集的重心是在莎蘭德身上,所有人物都是圍繞在莎蘭德其人其事打轉,但戲份多的關鍵角色還是男主角布隆維斯特,莎蘭德從頭到尾幾乎都被關在醫院治療,如果不是 男主角偷渡電腦進去給她的話,她就只能等著出庭了;男主角不僅是關鍵,還是樞紐所在,他負責媒體報導,他幫助莎蘭德發揮通天徹地的駭客本領,他被秘密警察 盯上,他與警察互別苗頭,他被國安局憲法保障組找上要求合作(還有其背後的司法部長與首相),身居憲政代表與媒體權利的中介,他將少數幾股幫助莎蘭德的人 集合在一起,從弱者到掌控局勢,一步一步破解反方長期以來不實的掩蓋真相,慢慢逆轉情勢,到最後,讓我不禁覺得,反方怎麼變得這麼遜喀啊,什麼辦法密謀都想不出,只能訴諸暴力殺人與栽髒,於是乎,水到渠成,在法庭上莎蘭德痛痛快快地逆轉勝,以致於庭上攻防的程度簡單到讓我覺得有點小失望,不過還是高興看到 平反成功而為自由之身的莎蘭德。
這集的內容發展與情節演進比前兩集更有深度,主要是因為有比較多不同的人物團體聚焦在同一件事情上,也就是莎蘭德的案子,而每個團體個有其不同的背景、理念、行動準則,例如男主角布隆維斯特可算是代表媒體,莎蘭德的駭客朋友,警察檢察官律師,國安局,國安局中的秘密「小組」,司法部長跟首相,私家保全公司,醫院,地方黑道,等等不一而足,這麼多的人物混在一起,不讓人眼花撩亂也難,有正方有反方,有正方中的反方,有反方中的正方,看不懂條理不清楚的話就會覺得亂七八糟,只好得過且過繼續讀下去,同時也損失了很多樂趣,看的懂的話就覺得好真實,角色躍然紙上,情節變化有如親眼目睹,其中的恩仇情恨綿延了三十年,箇中隱情與真相也被層層疊疊了三十年之久,血淚交織錯綜複雜,讀完三部曲後,既為莎蘭德的平反感到安慰,也為作者能如此巧妙操弄這麼多的棋子感到敬佩。
人物刻劃是小說的靈魂所在,描寫成功就變成活生生的人,例如金庸的郭靖令狐沖與古龍的楚留香李尋歡,失敗的話,就好像某作家的某作品(在此就不便吐槽),裡面的人物成千上百,但怎麼看來看去通通都是一個樣兒,同一個模子印出來的嗎?我不禁提出一個合理的懷疑,因為那部巨作長到不行,作者總不能只叫一位主角去經歷這麼多事情吧,只好利用分身大法,大夥分派一下,有的人走那裏,有些人走這裡,可是不管這裡那裏,怎麼每個人的走法都一樣啊;不過話說回來,那部作品裡面情節百出,目不暇給,這又是另外的功力所在了。這本直搗蜂窩的女孩就不會這樣了,各個官員有其相當的樣,首相要行使憲政,國安局長與司法部長對下是怎樣對上又是怎樣,各有其考慮因素,記者主播編輯主筆各個角色,不僅有其社會框架有也其獨立性格,自認正直卻被誘導欺騙的檢察官,有偏執意見的警探,盡忠職守有著幸福家庭卻害怕碰觸不該碰觸的地方的警察,與上司意見不同只能秘密行動的偵辦隊長,不為人知的祕密警察,黑道混混社會的黑暗面,書中對於各人物皆有一定程度的描寫,有背景有想法,感覺就是很真實,一方面弄得我頭昏腦脹,一方面又暗暗決定這系列三集值得要重讀一遍。
以前讀余秋雨的文化苦旅與山居筆記時,除了對其文筆與想法感動外,讓我更加敬佩的是他讀的東西還真是廣真是雜啊,難道每個文人都是這樣的嗎?記得當他談到晉商時,不是看喬家大院找找相關書籍那種淺薄的認識,他是去看"帳本",哇靠,這什麼跟什麼啊,或許是我太孤陋寡聞沒見識,不過那時真的被他嚇到,這才叫讀書破萬卷啊。回過頭來說史迪格.拉森,想必寫小說的技巧只是佔很小部分而已,作者的人生歷練,博學多聞,對整個社會的深刻觀察,才是這小說好看的原因,我已經無心地把書中所述當做是瑞典的真實樣貌,但又自知這麼一來不免偏頗狹隘,就好像把三國演義當正史,又自以為是地認為那就是原貌一樣(話說回來,三國演義已經自成一個世界),嗯,不知道有沒有人能夠把台灣社會與政壇的腥風血雨寫成小說啊,呵呵。
當初看哈利波特第一集時,總覺得哈利的童年未免太慘,父母雙亡,阿姨不愛姨丈不疼表哥也欺負,跟蜘蛛一起住在碗櫥裡,在學校遭到霸凌被當成怪胎,而且連一個好朋友都沒有,這樣會有什麼好人格才有鬼!看日劇Mr. Brain時,秋吉加奈子10歲被綁架,關在只有用電視當照明的地下室15年,哇靠,逃出來後不會想報復不會想殺人那才有鬼咧!看到莎蘭德的悲慘童年,叫天不應呼地不靈,不跟警察醫師說話是很正常的啊,會想用汽油彈燒死父親也是很正常的啊,老實說,之後有著高強駭客本領的莎蘭德沒有做出更大規模的破壞行動,例如癱瘓政府網路系統啦、竄改各項數位數據啦、花幾個錢雇殺手啦,我覺得莎蘭德還真是善良啊,她把世界對她的殘暴危害幾乎都忍受了下來,如果是我的話早就發瘋或是自殺了。
在朱少麟的傷心咖啡店之歌中有這麼一段,在主角小時候,父親續弦,後母已有兩個小孩,父親為生活打拼自然無法多加關心主角,後母自然偏重骨肉,三個小孩相處極不愉快,在長大成人之後,歷經婚姻失敗的主角,似乎有點自暴自棄,但之後有次大弟說出讓主角驚訝不已的成熟話:不要讓過去擊敗自己。在朱少麟同樣探討自由主題的燕子中,重病的舞蹈老師跟主角阿芳說:因為你能抗拒。同樣地在直搗蜂窩的女孩,我也看到善的一面,不因個人悲慘的經歷而放棄對未來的希望。
老實說看到最後,還是有點不清楚書中的黑手到底是個怎麼樣的組織,感覺好像是舊時代的遺物,還有一些舊時代的人物,在過去不得已的時期為維護國家安全與憲政穩定在黑暗中進行活動,在背地裡為其正義而奮鬥,免不了有骯髒卑鄙的手段,但到了現代,那些齷齪的所作所為顯得令人髮指,於是開始慢慢崩解慢慢有人平反,但誰又知道另一方面是不是又有別的秘密組織開始運作呢。讓我想到九品芝麻官中包龍星的父親說:「貪官奸,清官要更奸。」也就是說好人也要做壞事,唉,以此類推,現在檯面上的有權有勢的人物,到底作過多少心口不一的黑心事呢?當然,那些明顯說一套作一套的人就別提了。
最後在此哀悼作者,看不到餘下七本了,唉,不過書上寫著「不幸因心臟病突發辭世」,ㄟ,不禁懷疑是不是被某組織暗中!$@#^&。
ps 不能只看這本,請乖乖地從第一集開始看,這其實是一本書分三本。
ps 感謝譯者顏湘如,翻的好啊。記得上次感謝的譯者是哈利波特的彭倩文。
ps 龍紋身的女孩電影已在台灣上映,玩火的女孩也有電影了。


