2012年8月21日 星期二

在 Mountain Lion 上編譯 libchewing

本文參考迷途小書僮的筆記 在 mac osx 10.7 下編譯 libchewing ,成功在 Mountain Lion 上編譯 libchewing。
步驟如下:
  1. 先去 github clone 一份乾淨的 source code 回來
    • git clone https://github.com/chewing/libchewing.git
  2. 安裝 xcode
  3. 安裝 homebrew : 依照首頁的指示安裝
  4. 安裝以下套件
    • brew install autoconf automake check libtool pkg-config
  5. 開始編譯
    • cd libchewing
    • ./autogen.sh
    • ./configure
    • make
    • sudo make install

2012年6月25日 星期一

Media Center + XBOX 360 心得

幾個月前買了 Xbox 360,玩了一陣子,就放在電視旁邊生灰塵。

今天心血來潮,把最近為了要玩 D3 而重灌的 Windows 串接到 360 上面,看看微軟所謂的「多媒體中心」會是長什麼樣子。畢竟最近微軟的產品,越來越多是受到 Xbox 的影響,如 Windows phone、以及即將出爐的 Windows 8,其介面都是參考 Xbox 360 的經驗的成果。

我的 OS 是 Windows 7 ,內建 Microsoft Media Center 的程式,因此串接過程還蠻簡單的。只要打開 Xbox,進入 Media Center ,就會出現一組序號,然後再輸入到 PC Media Center 中,就完成串接了。

雖然 XBox 本身只能播放若干格式的 WMV 檔案。但使用 Media Center 是沒有此限制的,也就是說 PC 播的出來,XBox 就能夠幫你播!

聽起來還蠻厲害的。那就實際來試試看吧......

測試的結論是:非常不穩定。

我用來測試的是一個 rmvb 影片 (1080p)、XBOX 的解析度設定為 720p、Windows 裝的是 K-lite Codec Full。
  1. 如果要對影片做「暫停」、「搜尋」,都有可能讓影片播放失敗,或者是我的 PC 就當掉了 (死機) 。
  2. 另外,在觀看影片時,如果畫面場景變動過快,畫面就會有馬賽克,解析度自動下降。等動作場面平靜以後,又恢復高畫質水準。
  3. 我的 PC 和 Xbox 都是直接吃無線網路,結果播出來斷斷續續。後來我把 Xbox 用實體網路線接上 AP,才能夠順暢播放。
  4. 按鍵操作不夠直覺。我還要千辛萬苦在網路上才找到搖桿操作播放器的使用說明。而且看了說明以後,才驚呼:靠,原來暫停在這裡!
最讓我無法忍受的應該是 1。只要稍微做任何播放的操作,如最基本的暫停,播放器就會死掉。馬賽克的問題也蠻嚴重的,或許是我的 CPU 不夠力,但好歹我也是第一代 i5,應該比一些人的電腦好一點。

我的使用經驗,應該是五顆星等級的非常痛苦。

不過我在這邊卻看到了更大的商機,只能說微軟浪費了自己大好的平台資源,這一兩年難怪會被 Google、Apple 打假的。

首先分析一下,微軟有哪些平台資源:
  1. 壟斷的 PC 桌面作業系統。
  2. 豐富的多媒體播放環境 (in Windows)。
  3. 和 Sony 平分天下、體感完勝的家用遊樂器 XBox。
  4. 最近努力振作的 Windows Phone。
  5. 最近想要搞的平板 Surface。
 微軟的強項:
  1. 把所有自己的產品綁在一起賣,所以你買 A,就要買 B。你買 Office ,就要買 Windows。雖然 Office 也有 Mac 版,但 Linux 肯定是不行的。
  2. 深厚的多媒體技術:
    1. 最廣泛使用的多媒體 API: DirectX (有很多專利)
    2. 自有的媒體播放格式:WMV / WMA (想必也有很多專利)
    3. 最先進的遠端桌面播放技術:RDP (這個應該也有專利)
    4. XBox 遊戲機。遊戲一直是多媒體的極致展現,多媒體應該已經是無庸置疑了。
微軟的機會:
  1. 我看到裡面有一個網路頻道,可以收看網路影片。其實應該增加許多影片來源,如 Youtube、或大陸一堆奇奇怪怪的視頻網站、或是機上盒業者如網樂通合作。這一部份就會成為收益的來源。而 XBox 其實就是一台萬能的機上盒。如果這部分沒做起來,就表示微軟搞不清楚這部分的平台費用該怎麼算。
  2. 當 XBox 和 Windows 的結合,就只是這樣而已,實在讓人有點失落。應該要不只是這樣。例如用最簡單的遠端桌面連線控制電腦,再加上 Kinect 操控介面,不是更屌更直覺嗎?
  3. 當這一切都結合起來以後,再加上 Windows Phone 或 Surface 各種不同的使用情境,就像 Gmail、Google Map 與 Android 間的關係。就如同要用 Google 的服務,就要用 Google 的親生兒子 Android 才會得到最完整的使用體驗這種感覺,這樣市場不就拉抬上來了?
我對這個多媒體平台有這麼多期望,但當我看到結果是這麼的糟糕,真是讓我失望到差點把 Windows 砍掉。但把 Windows 砍掉,打 D3 就不順了,所以我還是忍了下來...

微軟,加油好嗎?

2012年1月22日 星期日

C++: int 轉字串測試

輸出整數型別 (Integer) 或許是我們最常需要使用的功能之一。

網路上常見的建議為:
在 C 語言,我們常用 sprintf snprintf 來操作。
在 C++ ,我們可以使用 stringstream 來轉換。
另外,也可以使用 boost 來轉換。

這三種各有優缺點,在 The String Formatters of Manor Farm 一文中針對整數轉字串做了一個完整的分析。
在這裡,我們不考慮是否會發生緩衝區溢位的問題 (sprint),也不考慮程式碼是否容易辨別 (我們都把它包成一個函式)。那,到底誰最快呢?

在 boost 網站上有他們自己做的測試。

不過我還是喜歡自己測,眼見為憑。
我寫了一支小程式 CastIntToStringTest.cc ,其中我將 snprintf 和 ostringstream 重新包裝成下列函式。

char *IntToPtr(int i)
{
  static char buf[50];
  snprintf(buf, sizeof(buf), "%d", i); 
  return buf;
}

string IntToString(int i)
{
  ostringstream oss;
  oss << i;
  return oss.str();
}
我的 g++ 版本為 gcc version 4.6.2 (Debian 4.6.2-12) OS 為 Debian sid (2012-1-22) 跑在 VirtualBox 上面 Host 為 Mac Mini Server (Core 2 Due 版),OS 為 Lion。 執行結果如下
hialan@debian:~$ ./CastIntToStringTest 
Test IntToPtr: 123456
Test IntToString: 123456
Test lexical_cast: 123456
Run 10000000 times.

IntToPtr: 2 secs.
IntToString: 11 secs.
lexical_cast<string>: 4 secs.
hialan@debian:~$

在官方做的測試中,int -> string 的轉換結果為
lexical_cast : 20
std::stringstream with construction : 121
std::stringstream without construction : 21
scanf/printf : 16

我想差距不大。假設官方的測試結果是 ok 的。

不過我的測試只針對單一型別做轉換。在嚴格條件下可以針對這類案例做最佳化。
但如果是要一般化的解決方案,我想用 lexical_cast 是不錯的選擇。程式碼精簡明確,又可套用在不同型別。
而且結果比 sringstream 好上太太太多了。

至於 sprintf ? 如果想要自己處理記憶體的話,可能是個好選擇。

2011年12月7日 星期三

賈柏斯傳讀後感

終於把這厚厚的一本傳記給看完,這大概是我讀過最厚但樂趣不減的唯一一本書吧。一邊看著賈柏斯闖天下,一邊思考著,究竟是哪些特質讓他成為世界偉大的人物之一?

在看這本書的時候,我正好開始做第一份工作,家裡也正好第一次創業,而我夾在中間開始第一次了解賈柏斯這個人。

他狂妄不羈、性格暴躁、動不動就怒罵別人,但仍然能完成這麼多創新偉大的產品。

他狂妄自大,因此有其更高的自我標準,因為他認為自己不凡。
他了解藝術,因此將質感與產品結合在一起。

他熱愛Bob Dylan對社會批判的音樂。他年輕時曾吸迷幻藥、曾經到印度去修行過、他吃素並利用禁食來讓自己的身體排出不好的東西(他認為)。這都跟東方人的概念:極樂世界、苦行僧的行為很像。而這苦行僧悟道的方式,正好就是對抗自己身體上的苦痛來修煉自己的精神。而他的人生正好永遠都在對抗。

對抗電腦進入生活的控制(當時個人電腦剛出現時,電腦是由大型主機業者 IBM 等大公司掌控,因此一般民眾認為個人電腦是要來控制生活的裝置)




、對抗執行長(蘋果電腦初期設立執行長就是要來壓抑假柏斯的)、對抗自己創立的公司(被蘋果電腦趕出家門、自創 NeXT)



、對抗迪士尼(皮克斯 vs 迪士尼)。



當然,他還對抗開放。Mac 與 PC 最大的不同,就是一個是從頭到尾、從硬體到軟體製作出來的電腦,而另一個則是開放,只要你有能力做出符合規格的產品就可以用在 PC 上。



因為設計就是產品的一部分,所以他永遠想的跟別人不一樣。


而不一樣的點不是別的東西,而是如何讓產品更「簡單」、更「容易使用」。
他本來就是消費市場的行家,他做出電腦,是要把電腦賣給一般民眾,讓大家能在家裡使用。而他真正進入消費市場的時候,也終於讓電子產品出現不一樣的未來。

當然,廣告也要從原本的(認為沒那麼好)的廣告


而變成這個知名風格的廣告


每個廣告中的音樂最後都會大賣,因此最後 iPod 的廣告成為歌手成功的目標。



但賈柏斯也像自己的偶像致敬,邀請Bob Dylan在廣告中演出。



製作廣告的時候,一開始他站錯了邊。但最後他的優良團隊與他的優秀判斷,最後才讓我們看到這個知名的剪影廣告。

說到團隊,他的一生身邊總充滿著人才,或者稱為天才,即使他的個性是如此的糟糕,但還是有一堆人才圍繞著他。在家裡創業的過程中,我才了解到人才在公司中扮演著什麼重要的角色,好的人才不好找,但沒有人才?死路一條。

他最大的夢想,是要開一間永續經營的公司。因此他也專注在如何讓公司有特殊的形象,並建立符合形象的建築,彰顯企業文化。


並利用公司建築的動線設計,創造員工間的互動,並符合公司創造產品需求的重要元素。
如:創意來自公司間不同人與人的接觸所產生出來的火花,則辦公室的設計就要讓人容易不期而遇。
或隨時隨地都有討論的空間。



偉人已矣,他上雲端去打造雲端了。
希望他一手打造的公司,能夠繼續打造「我們不知道我們需要」的產品。

2011年11月12日 星期六

重灌 PC 為 Ubuntu 11.10

昨天把桌機重灌成 Ubuntu 11.10 了,比想像中好用,原本很擔心Unity會讓我不適應,但是很快就適應了。現在開機只要2分鐘,跟之前開機要 15 分鐘(用了一年半的 Win 7)....只是卡在 Unity 看起來也是 Compiz 的一個 Plugin,所以有一些 Compiz 的 Plugin 不能起來。不過將就將就啦 XD

另外裝完再裝 Screenlets ,就跟其他作業系統的 Widget 一樣了(口味被養大,現在沒有 Widget 顯示系統資訊、時間感覺怪怪的)

另外在安裝時,安裝程式沒有正確認出我的 WD 1TB 採用先進格式化的硬碟(由 Win 7 原生分割為 ntfs),害我擔心了一下,不過開機完就能正常讀取使用。看了一下 fstab ,裡面除了主分割區以外,沒有其他設定。可見 Ubuntu 是開機完以後去偵測的,真是太猛了.....從來沒想過 Linux 可以變成這麼方便。

我做的更新項目:
  1. 安裝 Firefox 8 
    • sudo apt-add-repository ppa:mozillateam/firefox-next
  2. 安裝 Screenlet : 用 Ubuntu 軟體中心搜尋即可
  3. 安裝 Adobe flash (用軟體中心會當掉):apt-get install flashplugin-installer
  4. 安裝 Adobe flash Firefox plugin : 軟體中心搜尋
目前有兩個 Bug:
  1. Pidgin 的notification area icon 出不來
  2. 裝完台灣對應的 fontconfig 設定檔沒有正確產生,需要執行以下指令修正:
    • sudo fontconfig-voodoo --auto

2011年9月20日 星期二

雜記:學徒模式讀後感

最近在看【學徒模式:優秀軟體開發者的養成之路】,收穫很多。

算算從高中以來開始寫程式一直到現在也過了將近8年了,但是我仍然時常覺得我還是像當年剛開始寫程式一樣是個菜鳥。但這八年來我也跌跌撞撞,經歷了很多個不小心學到一些經驗和技巧,在這本書也有提及,並且作了更深入且全面的說明。

像是我曾經很容易為了自己所使用的技術成為熱衷的信徒,排斥他種技術。這是一個非常嚴重的壞習慣,每個技術當初設計的概念、用途本來就不一樣,因此不能站在一個世界裡去評斷另外一個世界的語言。反而我們應該站在另外一個世界,用他的方式模式去思考該如何達到我們需要的目的。我自己曾經以為(到前不久還是這麼認為),我寫其他語言就像在寫C語言一樣。而這是一個常見的問題,因為這表示我從來沒有真正學會了新的語言,我只是了解他的框架而已。唯有學會不同程式語言的邏輯想法,才能真正學會認識程式設計的精髓,從而去蕪存菁成為大師。

再來,我看過的程式碼不夠多,因此我累積的東西也不夠多。現在想想,每次看別人程式碼所學會的小技巧都非常實用。像是C#的樣板,是從看了別人的程式碼才開始使用;動態二維陣列的配置,則是讓我看到了第二種寫法,因此現在如果要撰寫相關的程式碼,我又多了一個工具可以使用。我曾逃避一些對我來說太難的程式碼,但現在想想這是我放棄了讓自己成長的絕佳機會。

我參與太少開發者同好的讀書會,沒有多認識一些人,一切自己獨自一人。也因此我少了一些回饋的網路,在學習上要花更多的時間,要繞更多的路。無論這個人是不是資深的程式設計師,我們都能夠從他身上學會許多經驗和技巧,從而提升自己的能力。當然,我們也要樂於分享自己所知道的,當在描述自己所會的事物時,其實也是重新檢視自己該知識的時候,從而可以了解自己還需要加強、概念不清楚的地方。

在Y!面試我的時候,提出了兩個問題來驗證我寫程式的能力:1.給予任3個數字,請找出最大值。2.請修改前面第一個程式可以處理N個數字。這題目是再簡單不過了,但一時之間要寫出清楚能懂的程式碼,也在腦海裡轉了很久。接著,他問我資料結構的問題:請問陣列和鏈結串列有何不同?陣列我常用,鏈結串列我也常用。資料結構第二堂課就是在教陣列,第三堂課在教鍊結串列,但是何時使用他們?我很驚訝我自己忽然無法很清楚明確的回答這個問題,結果面試就變成和兩位面試官討論、請教。其實在我面試的時候,我在想就算我沒有上,我也要從這裡帶一些東西回去。很難得我身邊會出現可以跟我討論程式問題的人,我一定要多學一些。

我以前常分享自己所撰寫程式碼的片段,但那只是實做。但現在覺得實做固然重要,但其概念與精神更為重要。如果能把一項技術摸清楚然後在網誌上跟大家報告,或是自己開發時面臨了那些問題,我又如何解決?長久下來可以為自己留下成長的足跡,而這網誌也成為自己的知識庫。

很高興我看了這本書,解開了許多存在我心中許久的疑問,也對自己未來的成長之路重新思考,更重要的再度點燃我心中學習的慾望,讓我回到學徒期,好好重新摸索資訊這塊領域。

2010年8月2日 星期一

2010 全新的開始

長越大,隨著視野的開拓就越了解自己。越了解自己也就越對自己的過去抱有許多悔恨,後悔當初為何叛逆、恨自己的幼稚與愚蠢,但時間無法重來,現在已無法改變。



現在無法重來,時間已無法改變。
抱著悔恨自怨自艾, 現在也無法改變。


於是只好放下過去,彎下腰來,好好撿起地上散落一地的碎屑,壞的丟棄,好的留下,重新拼湊出一個美麗的圖案。