2012年10月10日 星期三

部落格的秘密


彼得潘在出書成為App程式作家前,其實偶爾也是會創作小說投稿比賽,嘗嘗苦澀的失敗滋味。無意間翻閱起這篇2008創作的小說,雖然是投稿失敗作品,但畢竟是自己的創作,還是會自戀喜愛吧。


不知道是什麼時候養成瘋狂寫blog的習慣,一分鐘一篇,從不間斷。

那一天,在公司加班寫程式,本準備看著網頁上的煙火迎接新年。想不到一年沒聯絡的大學同學打來,那晚他說的話,成為故事的起點。「要不要一起去101倒數?」「你現在賺這點錢,根本不可能在台北買房子。你也不想每年倒數都待在不屬於自己的屋子度過吧?」「不如一起創業吧!,我們一同做個記錄生活點滴的blog網站,分享每個人想要說的故事,珍藏每個人不能說的秘密。」由於blog突然間大為風行,加上我們的網站在各方面都較其它同類網站出色,於是很快的,我們擄獲了部落客們的心,我同學也成了商業雜誌的封面人物。

    至於我,仍舊是和電腦作伴的工程師,有了車,有了房,但是房間一樣空蕩蕩,不管買了多少拼圖來填補,我仍像被關在缺氣房間的枯萎盆栽。其實盆栽恢復生氣一點也不難,需要的,只是一點點的愛情芬芳。但偏偏化身情人的電腦,用它層層的電滋波,擋住了邱比特的箭。

    記得那晚是牛郎織女相會的七夕,沒有理由下班的我留在公司加班。完成網站內容的更新後,發現已經無事可做。於是,就在無聊發了十分鐘呆後,我突發奇想,想看看部落客們的私密日記。所謂私密日記,只有blog的主人才能觀看,然而,如果blog是本上鎖的日記,除了主人那把鑰匙,其實還有一把萬能鑰匙,可以打開所有的鎖,觀看所有不能看的秘密。我,身為網站的工程師,正握有這把萬能鑰匙。

    擁有萬能鑰匙是一回事,但如果隨意打開日記,我想挖到寶的機率比中彩券還小。畢竟在這個人人是部落客的時代,垃圾文章堆滿了部落。於是,我決定仿照哈利波特的分類帽,寫個找出好部落的程式——部落精靈。我在部落精靈裡輸入我感興趣的關鍵字,唯有滿足條件的blog,才是值得探索的天地。部落精靈不負所托地完成任務,但結果卻令我頭痛,因為,它選出一萬多個blog。

    看看手錶, 時針在一個人的七夕走得格外緩慢,也許是為了讓牛郎織女多聚一些吧。我想時間還早,外頭又下著雨,不如就逛逛這些選出的部落。於是從一號部落開始,一間一間尋訪。就這樣, 漫步了三個小時,我在一百多個部落留下足跡。但是,令人失望的,沒一個有趣,無聊是這些部落共同的名字,重覆的主題一再出現,外遇,同性戀,暗戀,殺人,看得我心煩意亂。

    所以我不想再看了,萬能鑰匙一點也不萬能,不過這不是它的錯,錯在部落精靈,選出差勁的blog,但部落精靈是我寫的,因此追根究底,也許是我的錯吧。不過我還是決定再相信它一次,我寫的程式沒道理會錯。這一次我決定找尋我的她,也許真的有個她,出現在blog裡。和我一樣,愛簫邦憂鬱的夜曲。 和我一樣,愛席慕蓉凋零的開花樹。 和我一樣,愛蔣勳化做枕上淚的願。

    想不到,真的有個她,出現blog裡。於是我興奮地進入她的部落,開始我們第一次的約會。

May 11,  2006
      一顆開花的樹  席慕蓉
如果佛可以實現我的顧望,我希望化做什麼呢?做你必經路旁的大樹怎麼足夠?每天就和你相聚那短暫一刻,我是絕不滿足的。還是什麼都不變,保持現在的我好,有你的簡訊,有你的蜜語,有你的真心,刻刻伴著我。

May 18,  2006
      願 蔣勳
不知為什麼,愛上的詩總和許願有關。也許是前世的願已實現,和你今生共嬋娟的願。那麼今生我是否該許個來世的願呢?也罷,每日一早醒來看著熟睡的你,此刻即是幸福,此刻即是永恆,何必管來生?

    我像著了魔似的不斷按著滑鼠,一篇接著一篇翻閱。愈看,愈覺我們相像。愈想,愈覺我們相配。在這個世上,從沒有一對男女曾找到自己的心靈伴侶,因為每個人都有著不能說的秘密,都鎖著另一半無法打開的心門。只有我,因為擁有萬能鑰匙,幸運地找到了我的她,不管是迷戀的書籍.感動的電影,心碎的音樂,全都與我契合。分享了她的所有心事,已是午夜時分,我帶著滿頭的烏雲走出公司大門,因為我發現,她愛著,另一個他。到了第25個情人節,我還沒有情人,但已經,有了第一個情敵。

    和異性談情說愛我不拿手,但是對付情敵,我卻很有把握,畢竟情敵跟我同性,從小到大,在和同性的競爭,我總是取得優勢,不管是在學業,運動,或是職場上。但即使在她的私密日記,她對於他提供的線索還是太少,我只看到滿滿對他的愛意,卻看不到他的名字,電話和住處。日以繼夜的,我著急地四處追尋不知名,不知姓的他,深怕晚個一步,只得到紅色的結婚請帖。

    接下來的幾個月,我持續在這種苦無線索的情況下哀傷地生活。直到那天,同樣是七夕,我一個人來到公司,想要分享她的心事,感覺就如同和她一起度過情人節。但就在我打開電腦,看到桌面上的部落精靈時,突然靈光一閃,也許她的他也在我們的blog寫文章! 於是我將所有知道的線索,他的種種,她的一切,全都告訴部落精靈。

    部落精靈應該取名福爾摩斯才是,又一次成功,逮到唯一的嫌疑犯,他。我很興奮地比對她和他的私密日記,一點小線索也不放過。經過徹底研究後,我很肯定,他,就是她愛的他。和上次七夕一樣,我又在公司待到午夜時分,不同的是,前一次我因她愛他而失落,這一次卻因找到他而鼓舞,而且我對於這場仗很有信心,正所謂知己知彼,百戰百勝,藉由他的私密日記,我已完全掌握他。

    接下來無數個失眠晚上,我不斷苦思對付他的計謀。他的文章我一遍看過一遍,他過去的秘密,我早已熟透。他未來的計畫,我早已掌握。然而他的模樣,我卻不知。他的姓名,我卻不曉。其實就算我知道他的模樣,就算他居住我家樓下,我也不知如何打擊他,根據他的私密日記,他的跆拳道得過全國冠軍,而在事業上,他是年薪百倍於我的企業家。

    還記得那天也是特別的日子,適合情人約會的Christmas。和情人節一樣,如此浪漫日子,我只想在她的部落駐留。然而這一次比較忙碌,因為得同時周遊於兩個人的部落,她和他的。不過愈看,也只是徒增傷心。她,寫滿了對他的思念。他,也寫滿了對她的想念。而轉機,就在心情最低潮時出現眼前,藏於他和她的的最新日記。

December 24,  2007
      出國
明天就要出國,這一去就一個月,沒有電腦,網路,手機也不通,只有天上的明月聽我訴說相思。這樣子分離的日子實在太苦,我苦還好,但又怎麼忍心讓妳也受苦?等回到台灣,下了飛機,我將飛向妳身邊,用戒指,圈住我倆的心。

December 24,  2007
     一個人的Christmas
你又要出國了,留下我一個人過Christmas。記得我們的相識,也是在Christmas。你為了聽Last Christmas,來到我的blog,留了言,開始了我們的故事。我常常想,也許你正是聖誕老公公送給我的大玩偶呢!

    這兩篇文章給了我很大啟發。即將求婚的他催促著我加快腳步,把握他和她無法聯繫的機會。一人過Christmas的她,告訴我她和他相愛的源頭,我一手建起的blog網站竟是月老。不是有句話這麼說著?從哪裡開始,從哪裡結束。既然牽起這段紅線的,是blog。那麼就也讓blog,斷了這段紅線。

    第一步,我先給她他的鑰匙,我在他blog的公開文章裡發表一篇給她的文章。

December 24,  2007
      愛情密碼
親愛的,雖然這個月我不在台灣,可是我還是會把想念妳的思緒寫在我的私密日記裡。為了讓妳感受到這份思念,我將我的帳號密碼留給妳。帳號是初見妳的那天,密碼是初吻妳的那天。

    於是她可以開啟他的私密日記了。但真正的關鍵在第二步,由我所編寫的他的私密日記。由於研讀了許多他的文章,因此模仿他的文筆不是難事。此外,由於我也能閱讀她的私密日記,所以我能夠馬上知道回應,然後再據此構思下一篇文章的內容。計畫進行得十分順利,他,不斷地寫著認識了異國的她,夜夜軟語溫存的文章。她,不斷地寫著妒忌異國的她,夜夜淚積成湖的文章。就在他回國的前一天,我決定結束這場變心blog的演出,讓他寫下最精彩的結局。

January 25, 2008
      Last Christmas
對不起,說好牽一輩子的手,我卻鬆開了手。愛情,從來是不講理的。從前,沒有理由的,我愛上了妳。突然間,又沒有理由的,我愛上了她。也許一開始將我們靠一起的Last Christmas,已經預言了,我們的愛情,終結於去年的Christmas。

    接下來的幾天,天未白,我即進入她的部落。夜已黑,我仍逗留不走。不管怎樣的失戀,總是會過去,而在這段需要人安慰,需要人疼惜的失戀期,正是像我這樣了解她的人趁虛而入的機會。然而一星期,兩星期流逝了,一個月,兩個月消逝了,她的私密日記還是沒有新的文章,這不禁令我十分心煩,整天不斷按著重新整理的按鈕,指望眼前出現的不再是January 24, 2008的文章。 私密文章是我和她之間唯一的連結,沒有新文章,我和她也就斷了連結。

    今天如往常一樣,孤單一人地來到偌大的辦公室,開了機,登入了她的blog。blog上的日記不斷地增加,右上角的更新時間不斷地跳動,記錄著我和她第一次相見,第一次牽手,第一次接吻,第一次互數心跳。我們的戀曲,在我的第26個情人節開始彈奏,隨著一分鐘一篇的blog,一直持續著, 噠噠噠噠,噠噠噠噠,噠噠噠噠,...。

模擬就好,何必來真的 - 模擬不同的App畫面情境

Xcode方便的所見即所得UI設計介面,讓彼得潘可以激發深藏的藝術家天份,輕鬆設計賞心悅目的App畫面,如下圖所示,可愛的獅子圖片,置中地呈現在4吋的App畫面上。 (感謝彼得潘的朋友,真正的藝術家,查爾斯提供圖片"一起走吧") 。但是有個小小的問題,不知道當App畫面是舊式的3.7吋或是iPhone水平時,畫面會變什麼模樣呢?


實際跑起模擬器,看看iPhone水平時的App畫面是一招。但此招未免太費功夫和時間。高手是不輕易出招的。



其實在我們編輯xib或storyboard時,點選xib裡最上層的view或是storyboard裡的view controller,然後再切換到Attributes Inspector頁面,即可模擬切換不同的畫面情境。如下圖所示,在Simulated Metrics區塊,有許多可以調整的項目,模擬各式不同的畫面情境。從Size和Orientation得知,目前我們處於4吋的直立畫面。




當我們將Size設為3.5吋,即可馬上看到3.5吋顯示的App直立畫面。




當我們將Size設為4吋,Orientation設為Landscape,即可馬上看到4吋顯示的App水平畫面。



                                      


當我們將Size設為3.5吋,Orientation設為Landscape,即可馬上看到3.5吋顯示的App水平畫面。

                                     




就是那麼簡單,善用Simulated Metrics,不用再費時地跑起摸擬器或是裝到iPhone上測試了。

查爾斯的blog視說新語:
http://whereyou.pixnet.net/blog

查爾斯的FB視說新語:

2012年10月8日 星期一

寧願食無肉,不可居無歌的YouTube影片下載App

無歌令人俗,無肉使人瘦。 寧願食無肉,不可居無歌。彼得潘的生活裡,不能夠一天沒有音樂。YouTube上充滿許多好聽的音樂,如果可以將喜歡的歌下載,離線收藏,該有多好。幸運的,Mac上有套方便的YouTube影片下載App,MacTubes,事不宜遲,讓我們趕緊下載,開始享受離線聽歌的樂趣吧。

1. 下載MacTubes

http://www.macupdate.com/app/mac/28608/mactubes

2. 點選File -> Open Video



3. 輸入喜愛的YouTube影片URL,在這裡彼得潘輸入華仔的"享用我的姓"於YouTube上的URL ( 影片是經典愛情電影"孤男寡女")






4. 點選左下角的設定按鈕,從清單裡選擇Download ,即可選擇想要下載的檔案格式。





下載進度視窗
就是那麼簡單,從今而後,不管有沒有網路,我們都能離線聽歌,化身潮男潮女,不再無歌令人俗了。


2012年10月6日 星期六

Be happy , don't worry



講得真好。"人活著的時候要盡可能讓自己開心點,因為你將會死很久", 想買iPhone 5就買吧,沒什麼好猶豫的,它能帶來的快樂不是金錢可以衡量的

2012年10月4日 星期四

Xcode的Objective-C語法轉換龍捲風大法

新一代的Objective-C語法,讓我們可以寫出更簡潔,可讀性更高,更不易出錯的App。但是,我們多年前以舊語法完成的App該怎麼辦呢? 是要將錯就錯繼續使用舊的語法,還是大刀闊斧地砍掉重練呢?

為了將來的美好,重練是好的,但像傻子一樣一個個找出過時的語法加以修改,實在太浪費時間了。為了增加約會的時間,多一點擇偶的選擇,讓我們透過Xcode的幫忙,如同龍捲風掃過般,瞬間將舊語法變成新語法吧。


接下來,彼得潘將以戴佩妮的好歌"擇偶條件"為例,介紹Xcode轉換語法的龍捲風大法!

舊語法:



- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
 
    loveSong = [NSArray arrayWithObjects:@"要懂得尊師重道",
                         @"要懂得適度的討好",
                         @"偶爾浪漫會增加情調",
                         @"不能長的太高",
                         @"脾氣不能太暴躁",
                         @"血型星座要當做參考", nil];
    
 
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if(cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
     
    }
 
    cell.textLabel.text = [loveSong objectAtIndex:indexPath.row];
 
    return cell;
}





Xcode轉換語法的龍捲風大法:

點選Edit -> Refactor -> Convert to Modern Objective-C Syntax



檢視被龍捲風掃過,需要轉換的地方,按下Save即完成轉換。



執行App:



看吧,輕輕鬆鬆即完成轉換,讓我們聽聽Penny的擇偶條件,利用多出來的時間多多去約會吧。



2012年10月1日 星期一

旋轉,就是那麼簡單 ~ 全新iOS 6旋轉機制

在 iOS 6之前,想要控制App畫面的旋轉,採用的是以下method

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation

此method雖然簡單,但我們還是需要依據參數toInterfaceOrientation來做判斷,依據是否支援此方向而回傳YES或NO,例如以下例子:


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    if(toInterfaceOrientation == UIInterfaceOrientationPortrait)
    {
        return YES;
    }
    else
    {
        return NO;
    }
}
說明:
只鍾情於一種角度,iPhone為直立方向,且home按鈕在下方(UIInterfaceOrientationPortrait)。將iPhone轉至其它方向時,畫面並不會跟著轉動。


   

                                 

在iOS 6更簡單了,改為利用以下method定義App支援的方向。

- (NSUInteger)supportedInterfaceOrientations
{
        return UIInterfaceOrientationMaskPortrait;
}

說明:
想要支援哪些方向,直接回傳方向的Mask即可。完整的方向mask定義,可參考UIApplication.h。


typedef NS_OPTIONS(NSUInteger, UIInterfaceOrientationMask) {
    UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),
    UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),
    UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),
    UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),
    UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
    UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),
    UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
};

讓我們再來看看另一個例子,如果想要全方向的支援,只要回傳UIInterfaceOrientationMaskAll即可。









SoundCloud SDK介紹 (MacToday 2012.10)

SoundCloud是目前十分火紅的雲端音樂平台,如果說Youtube是諸葛亮,那麼SoundCloud就是周瑜了。Youtube的強項在影片,SoundCloud則在音樂。這些雲端平台讓許多像彼得潘這樣的平凡人實現唱歌,演電影的夢想,而對已經成名的明星來講,這些雲端平台不只有著更快,更國際化的宣傳效果,還能省下大筆的行銷預算。接下來彼得潘將以好朋友,亞洲鋼琴天王V.K克存放於SoundCloud的作品為例,介紹如何結合SoundCloud API,播放V.K克遠在天邊的琴聲陪伴我們度過漫漫長夜。