我有一個夢想

我很幸運,出生在網路快速成長的年代,感謝網路的發明,我從國一就有機會開始學習寫程式,在這些年裡,心底一直都有一個疑問,我相信很多人都跟我一樣有同樣的疑問

為什麼台灣沒有軟體服務產業?

我們從新聞看見Yahoo成功、Google成功、Facebook成功,但是卻很少看見來自台灣的軟體服務產品能夠站上國際舞臺,台灣的硬體毫無疑問的是相當有競爭力的產業,然而隨著競爭國家的掘起、工資物料成本的提升,到後來就只能爭取幾毛錢的毛利,相對於硬體,軟體和服務才是能增加最多價值的產品,搭配台灣的硬體優勢將會是最強的組合,然而縱觀千百種不會成功的理由,不管是教育的問題、硬體產業的排擠效應、社會風氣的問題等等,這些都不是一朝一夕就可以改變的,因此我相信只有透過一些人來開路,先建立成功的典範,以這些人當種子散播就有機會帶動整個台灣軟體發展,不管是Google、Yahoo等等公司,有很多新創的公司都是從這些公司出去的員工

那麼誰來做這些事?

我知道,不管我有再多的想法,不去做都只是空想而已,我告訴我自己,不要期待別人來完成你的夢想,只有靠自己才有辦法改變這世界,我相信

做的比說的大聲

或許有人會說,這會失敗,我們的教育都傾向教我們一定要成功,卻沒有教我們要如何失敗,或許最終會以失敗收場,但又如何呢? 在我大學一年級決定開始Now.in的計劃時,我想過各種失敗的可能性,但是我這樣問自己

如果因為怕失敗不去做,難道你要等到哪天看見別人做出你想做的東西,那時才大聲嚷嚷那是我的想法嗎?

我不想成為最後只剩一張嘴的人,於是我開始動手,在大學上面講課時我在下面畫伺服器架構的設計圖,回到宿舍上網找適合的技術,當別人在寫程式作業時,我在寫Now.in的程式,當別人在打魔獸時 . . . . . . . . 我也在打魔獸,終於網站在2009年年底上線,隨著時間過去,從一開始只有最簡單的廣播功能,到後來漸漸增加了一些功能,看著使用人數越來越多,就像生了一個女兒看她長大一樣

她在 Alexa的排名也來到了全台458,全球57K

而在前陣子我們也在IDEAS Show得到不錯的成績,朝我們的夢想邁進了一小步,我們希望有一天我們可以成為廣播界的Youtube,然而隨著我們想做的東西越來越多,而技術人力只有我自己一個,很多使用者都以為我們是一個公司或團隊,當收到抱怨信說為什麼出問題時我們也只能無奈的賠不是,因為使用者不知道這其實是一個人做出來的,直到前陣子我找了我兩位同學幫忙寫iPhone和Android的app,才有其它的人加入,雖然手機只是我們很久以前就有的想法,但只因為人力不足,所以一直都沒辦法實現,甚至一開始我還打算連手機的app都自己完成,因此我想在這裡大聲地說

我們需要你的幫助

在擁抱美好夢想前,我想先把醜話說在前頭

我們沒有資金

很不幸的是我們並沒有太多的資金能夠雇用人力,我們沒有豪華的辦公室,沒有員工旅遊,沒有錢請全聯先生替我們代言,我們只能提供微薄的薪水雇用實習的員工,所以為什麼你要加入我們?

我們有技術

我們有的是以Python為核心的相關技術,在Now.in裡幾乎所有程式都是用相當新的Python技術寫的,而且範圍牽涉之廣,從桌面應用程式、網路伺服器、網頁應用程式甚至到伺服器管理都是,所以加入我們你可以學到技術,這些是花錢去補習班或請家教也學不到的

我們有使用者

身為一個程式設計師,我想最傷心的事情大概莫過於寫出來的程式沒有人使用,對於Now.in來說,現在每天有十萬個訪客,線上聽眾的鋒值可以達到一萬,電台可以達到一千個,我相信最開心的事情就是看到自己的程式有人使用,我同學推出的iPhone和Android App在短短幾週內都達到了五千次的下載,並且一直在成長,這成就感我想是金錢無法比擬的

我們有理想

就如同我們的口號

廣播和收聽全世界

我們希望能夠打造一個線上的廣播社群,讓任何人都可以有發聲的管道,除此之外我們還希望能夠讓人們可以更緊密地在我們的平臺上互動,還有太多太多我們想達成的目標,簡單的來說

我們想改變世界

這些理想都是在大公司很難找到的

我們需要你的參與

我們需要以下的人才

開發者

開發者主要負責程式的設計與開發,我們的項目範圍牽涉很廣,所以可以有很多不同的選擇與可能性,需要有相當程度的熱情與學習能力,還有需要基本的程式設計能力,基本的英文讀寫能力,如果學習新的技術讓你感到開心,你想知道怎樣設計出好的架構,你想成為頂尖的程式設計師,這或許是你的最佳選擇

系統管理員

我們有很多台實體的伺服器和Amazon EC2上的機器,數量還在增加中,主要是負責照料這些伺服器,使用的OS主要是CentOS,如果你喜歡管理大量的伺服器,看著htop的CPU使用率跳動讓你感到開心,仔細檢視記錄檔讓你覺得興奮,寫script管理大量伺服器讓你覺得很有成就,或許你就是適合的人選

網頁設計師

如同你所見到的,很多人第一眼見到我們的網頁都說很醜,因為我個人不是學設計的,加上時間有限也無法花太多心力在調整網頁的面版上,所以都以最簡陋的形式程現,為了改善我們的網頁外觀,因此我們需要一個人負責網頁設計,你需要懂基本的HTML和CSS,你所做的設計每天都會有十萬人以上觀看和使用

給有興趣的人

我們並沒有辦法錄取每個人,因為就如同我在先前文章中講的,人越多越沒有效率,人月神話裡也有一個很好的啟示,就是增加人力也需要額外的成本,因此我們只能雇用適合我們的人,如果你有興趣,請將你的履歷寄到  ,我們可能沒有辦法每封信都一一回覆,開發者和網頁設計師請附上你的作品,我們不限種族、年齡、性別、學歷,最後,不管結果如何,感謝你們的參與

Posted in 中文文章 | Tagged , | 35 Comments

那些在Now.in學到的 – Software engineering practices

Now.in這個網站在2009年年底上線,在這幾天參加IDEAS Show之前終於來到了台灣前五百大,全球六萬名,這期間只花了一年半,而事實上這個網站早在我大學一年級約2006年左右就開始有這樣的想法,接著花了一兩年的時間開始構思和找相關的技術,2009年開始實作,從開始到上線只花了一年的時間,其中專案之龐大還有牽扯到的層面之廣,從架構的設計、後端伺服器的譔寫、前端網頁、Client端、伺服器管理、資料庫管理,很多人都不相信這只有我一個人完成的,而且還是在讀大學和碩士的課餘時間,直到最近上線的Android和iPhone才找了同學幫忙寫,感寫他們這幾週的辛苦

這整個過程的經驗,事實上多到可以寫一本書,不只是技術上的,之後有空我也會寫一些文章來分享我在其中所學到的一些東西,今天我要分享的是我在碩士一門軟體工程課以Now.in為主題所分享的一些經驗,主要是一些我在開發Now.in前後所體認到的一些經驗與想法,因為我發現很多人不是沒有技術,而是缺少對於服務、軟體工程等等的相關思維,或許這篇文章會有一些幫助,除此之外,我也希望能夠將我自己的想法記錄下來,當我要接受新的想法時,就可以回頭看看以前的自己為什麼會有這樣的想法

人越少,越有效

這樣的想法主要來自人月神話這本書,軟體開發不像是收割小麥,人越多越有效率,因為需要溝通,這意味著當你有越多人牽扯在這其中,所花的溝通成本也越高,每個人的平均效率就越低,除此之外,有一句話這麼說

讀程式比寫程式困難

相信有寫過真正程式的人都會有這樣的體認,寫程式的過程是將你的思想轉化為程式寫出來,而讀程式則是透過這些字句語法來理解程式原本的想法,就有如瞎子摸象一樣,因此當你的團隊裡有越多人寫同一份程式,光是在讀程式理解想法才能繼續寫的這整個過程中就損耗了不少生產力,因此甚至知名的電腦科學學者Dijkstra主張程式應該由單一個人來寫,因為它是一個人的想法

這樣的想法除了來自人月神話,也受最近出版的一本書Rework影響,它是來自37Signals公司的經驗,37Signals是一家小型軟體公司,雖然只有十幾個人的規模,但是推出的產品都很受歡迎,他們強調要找對的優秀開發者,還有開會是造成生產力浪費的原因之一,我認為Now.in之所以能以我一人之力完成,正因為我不需要開會做決策、不需要溝通,將我自己的生產力發揮到極致才有可能完成的

然而,如果是小型的專案能夠一個人寫當然是最有效率的,但是當專案的規模大到一定的程度,超過一個人或少數人能完成的地步,增加人力資源就是不可避免的事,不過在此之前,要慎重考量引入新的人力所造成的影響

保持敏捷

很常見的錯誤軟體開發方式就是一口氣推出一大堆功能,然後期待使用者會喜歡這些功能,但是可悲的事實是這些功能推出來通常都不是使用者所要的,就如投影片所表示的,一口氣在單一個開發循環中推出了一大堆的功能,這花了很多的時間與心力,但是卻發現使用者要的的只有一小部份和目前所做的有所重疊

在現實上,你總覺得你可以抓到使用者所想要的,但仔細想想會發現那是你自己想要的,並不一定每個人都跟你想要的是一樣的東西,一口氣在一個循環內開發如此多的功能,對於變化如此快速的網路世界來說,你永遠都趕不上變化

邊移動邊開火才是正確的方式,這有一部份的想法是來自約耳談軟體,如投影片所看到的,一開始先從最核心的功能做起就好,然後看使用者的反應與需求再來改版與新增功能,盡量保持每個開發循環很小,才能抓到使用者所要的

Now.in就是這樣的開發方式,就如投影片裡的抓圖,在一開始只有最核心的廣播功能,其餘的功能都是後來才加上去的,因我看見了需求,我看見使用者們邊聽廣播邊在PTT上推文討論,顯而易見的聊天是必需要有的功能,此後才開發了聊天室

右手邊這張圖是來自Rework裡的插畫,他們認為計劃就是在猜測,是的,沒錯,網路上充滿了創新與變化,很多東西是以前從來沒有人做過的,那麼你要如何計劃? 你沒辦法計劃,任何五年、十年計劃之類的東西都只是在賭博而已,不要浪費時間做太過長遠的計劃,邊移動邊開火才是正卻的做法,阿里巴巴的馬雲也說過,他們成功是因為

沒有資金、沒有技術、沒有計劃

這裡指的沒有計劃就是這麼一回事

老程式不死只是凋零

很多人會犯的一個毛病就是認為舊的程式都是很糟的,要完全砍掉重新寫才是好的,但是事實上從我的經驗告訴我,那些在線上跑經過多次修改的,遇過一大堆你在開發中想都想不到的詭異問題才存活到現今的,它們是如此的老練,有很多失敗的例子就是因為將舊有程式丟棄,直接採用全新的程式來面對實際的應用,事實上這樣就有如送沒見過世面的新兵上最慘烈的前線戰場送死是沒有兩樣的,我想或許Digg就是這樣的一個例子

Digg在去年推出全新的版本,但是不停地出現嚴重的問題,加上新的使用方式受到原本的使用者反彈,導至使用者大量且快速地流失,另一個例子是Netscape在推出新版時將舊的程式全部丟掉,在約耳談軟體的Things you should never do裡有提到

所以我們就一直使用舊程式就好了? 請別會錯我的意思,我想表達的是在前線跑的程式裡有太多是你重新寫不會想到的問題處理,請不要單純為了想砍掉重練而重寫,你需要的是重構而不是重頭寫過,就算你真的打算重新寫過,也請好好重視原本的寫法,以Now.in來說,有些東西就是從最早的版本傳承到現在的經驗

# XXX Workaround for fucking IE6, fuck you IE6!
response.cache_control = "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"

像是腦殘IE會cache不該cache的東西,這樣的經驗只有真的有在前線跑過的程式才有辦法知道,除此之外還有你想不到的不同奇奇怪怪問題,因此老程式需要你的一些尊重

效能通常不重要

效能很重要嗎? 很重要,但是只有在很少的場合發生,身為技術人員有個壞毛病就是很愛計較效能,這個跑benchmark,那個也跑benchmark,總得要挑一個最有效的方式來實作,但是花了這麼大的心力在於效能上,在現實中效能並不是在所有情況都這麼重要的,有很多程式,例如按鈕的事件回應,你需要花很大的心力去最佳化那段程式嗎? 通常是不用,但是如果是最核心的演算法,會影響到整體表現甚至使用者經驗的,那就是得花心力去處理的部份,但即使如此,現在的硬體越來越便宜,同樣的價錢可以買到的運算資源越來越多,雖然不代表你可以因此隨便亂寫,但是代表你可以花更多心力在更重要的事情上。

除此之外,單一機器的運行效能以現今的觀點看來已經不是太重要了,因為更重要的是架構上的有效,擴展性遠比任何某一段程式的最佳化還來得重要,以Now.in為例,並沒有花太多心力在單一程式的最佳化上面,但是花了不少心力在於思考分散式的架構,如此一來才能增加機器來提升整體的承載能力。

使用者經驗很重要

我想技術人員開發的產品最常犯的一個毛病就是以自己的觀點來開發產品,很常見到很多產品都強調他們有多少功能,多強大,但是使用者界面卻出奇地難用,或是因為那些過盛的功能導至產品太複雜沒有人會使用,對我來說服務就是完全關於使用者經驗的事情,從使用者的角度來思考,就會發現其實使用者根本不在乎你的產品能不能提供多少強大的功能,他們只在乎好不好用,能不能解決他們自身的問題而已,我想最佳的例子就是Dropbox與Syncplicity

明明Syncplicity比Dropbox還早推出,甚至功能更強大,Dropbox只能同步一個資料夾,然而Syncplicity可以同步任何資料夾,可是Dropbox大成功,Syncplicity卻乏人問津,這其中最大的問題就在於,Syncplicity沒有考量到使用者經驗,有人在Quora上問了為什麼Dropbox會比Syncplicity成功,Syncplicity自己的CEO自己就跳出來說為什麼,簡單的來說就是以功能導向在思考產品而不是使用者經驗導向。

那什麼又是使用者經驗? 使用者經驗扯到的範圍很廣,從他發現這產品的開始,到他使用產品本身,這整個過程與體驗都是使用者經驗,比較Syncplicity與Dropbox,Syncplicity光是名稱就輸一截了,想取Simplicity的協音,然而卻是複雜的體現,名稱的發音對很多人都是一個問題,而功能上因為太強大,使用者不知道怎麼用,亂用一通,甚至拿來同步Windows資料夾,而Dropbox只有一個資料夾,要同步就拉檔案進去,簡單易懂,當然是簡單的受到使用者歡迎,而非功能強大的

技術只不過是一張軟體樂園的入場卷

身為技術人員,我會跟你說技術很重要,但重要到什麼地步? 只不過是一張入場卷,我會這麼說。

為什麼這樣說? 原因很簡單,你想進來這圈子玩一玩,沒有技術我會告訴你,門都沒有,然而你如果有很強的技術,恭喜你,你的入場卷比別人的大張,你可以享有優待,你可以玩最新最酷炫的遊樂設施,如果你的技術很爛….,那麼很抱歉,你只能玩別人不想玩的無聊遊戲,沒人排隊的地方,玩玩就回家去吧,但是即使你有很大張的入場卷,也沒辦法滿載而歸,因為除了技術以外還有太多東西值得你去玩,不管是市場的遊樂設施、商業上的、金融上的,軟體的開發不是只有技術而已,光是你要去哪裡找人才,市場的定位等等,都不是那麼容易的事情,常常見到很多人有一身的技術,但最後淪為技匠,空有一身本領但是還是沒有舞臺,沒有很好的發揮,我自己很久之前就有這樣的體認,因此我對自己的期望不只有技術上的進步,我也花不少時間在接觸不同的事物上,思考技術以外的問題。

沒有銀彈

最後,套用一句軟體工程的名言 「沒有銀彈」 ,也就是沒有一種可以解決軟體工程上所有難題的方法、或是想法,這些是我在這過程中學到的經驗,並沒有辦法適用到任何的情況上,至今想法還是多少會有改變,但次每次的改變都是透過深刻的體認和思考才做出的結論,並不是隨波逐流的想法,我講的不一定是對的,在讀我文章的同時,希望也能仔細思考這其中的涵意和你們自己的體驗,找出最適合自己或團隊的想法,才是最重要的事。

Posted in 中文文章 | Tagged , , , , | 26 Comments

技術應為服務而生

在前面的一系列文章裡,我發現有些人有些很有趣的想法,有些人覺得使用Windows是很落後的事,或是要用vim、gcc、gdb來寫程式才顯得有技術,我自己也是從小玩技術長大的人,事實上我很能理解這樣的想法,或著說我以前也是這樣的想法,但後來漸漸地想法就改變了

在大學時有位組合語言很強的傳說中的教授,他的組合語言課真的很令人印相深刻,他從來不帶課本,一上台就開始畫圖,然後用很粗俗易懂的例子講解,可以看得出他對低階的這塊領域實力有多深厚,有一次他在上課談到

我以前在做賭博電玩時,有人來跟我推銷繪圖晶片,可是我跟他說,不用,我覺得自己寫一個pixel一個pixel畫才有技術

可是後來發現別人用繪圖晶片來畫圖,一下子就做出來了,我還在刻低階的繪圖功能

後來因為這樣做不過別人就不做了

聽了之後仔細想想我自己也是這樣的想法,以前在寫遊戲時最初是用Direct Draw,後來覺得使用現成的函式庫沒什麼技術,在之後重寫的版本中,就自己寫畫圖的函式庫,一個pixel一個pixel去填,半透明混色也是自己去算,甚至想自己寫3D的繪圖引擎,雖然確實在這過程中學到很多東西,但事實上整個寫遊戲的過程中有好一大半的時間是花在底層的這些基礎繪圖功能上,後來漸漸理解,重覆利用別人做好的輪子是很重要的事,只因為覺得 “那樣才叫有技術” 而去自己做別人已經做好的東西是很不成熟的想法,後來我終於理解到

技術只不過是在工程中完成目標的手段,並不是最終的目的

除了技術以外,事實上在整個軟體的工程當中,還有太多值得注意的事,從你學習那項技術需要花多少心力,技術相關的社群,如果你是商業公司還得考慮到有沒有支援商業服務,還有你用這項技術的話能不能找到人來接替你的位置? 你用了這項技術生產力有因此而提升嗎?

以先前提到的例子,用gcc直接下指令編譯,用gdb下指令除錯,你的生產力有因此而提升嗎? 為了從一般的IDE環境下切換到這樣的環境需要多少的學習成本? 如果你找一個人來接續你的工作,他是否有辦法像你一樣熟練地使用這些工具? 如果你要教新來的人熟悉你的環境,你需要花多少時間? 我相信,大部份提到要使用這些工具的人都沒想過這些問題,這很正常,因為他們熱愛技術,但是實際的工程應用這些都會是很重要的問題。

人適應工具

而在這些提到的一些工具中,有個很極端例子,那就是vi/vim,我自己有用vim,因為打大量程式會比較有效率,或在Linux下改程式都得用到,為什麼說vim是很極端的例子,因為它的設技概念與我們一般常見的IDE是相反的,一般的工具都是設計工具來適應人,然而vim卻是設計工具要人去適應它,因為如果需要打大量的字,手一直保持在鍵盤上是最有效率的,所以它設計讓你手都不用離開鍵盤,就能進行所有的操作

Vim cheat sheet 來自 http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html

當然,缺點是它的學習曲線很陡,在一開始你可能打幾個字都會弄得灰頭土臉,身為技術人員如果你覺得打大量的字是很常有的事,這投資是值得的話,學一學vim確實是不錯,但推薦初學者學vim就不是什麼好事

所以,當你很興奮地覺得這個東西才算有技術,或著是開源萬歲之類的理由,推薦給別人時,想想你自己花多少時間學這東西,別人又能因此得到什麼好處好嗎? 而當你開始設計產品時,你想想如果Apple的Macbook廣告詞是

經過三個月的練習,使用我們的系統工作效率提升了50%!!

你覺得還會有人買這樣的產品嗎?

工具適應人

另一種設計的想法,也是主流的設計思維就是讓工具去適應人,大多數你能在市面上看到的產品都是這樣的設計,我們舉一些例子,Visual Studio最近推出了一種新的UI,叫Debugger Canvas,是將整個debugging trace的過程以泡泡視窗的方式串聯在一起,讓你可以很直覺地理解程式呼叫的過程

[yframe url=’http://www.youtube.com/watch?v=3p9XUwIlhJg’]

有這樣視覺化的輔助,除錯的過程會輕鬆許多,在有現代化工具可用的情況下,除了學習以外的炫技理由堅持使用原始的工具,就只是浪費寶貴的開發時間而已

再舉另一個例子,就是git或mercurial在送commit之前,我個人都會對送出的內容review一次,以免將測試用的程式也送進去,例如像是這樣糟糕的例子

def auth(user_id, password):
    # XXX: FOR TESTING ONLY!!! DO NOT COMMIT
    return True
    user = session.query(User).get(user_id)
    if user is None:
        return False
    if user.password != password:
        return False
    return True

原本的授權檢查,為了測試直接回傳True,不小心把這樣的送出去就不好玩了,使用console看列出git或mercurial的差異通常沒有標顏色都很難看清楚

 

然而有了Gitk的GUI標上顏色,到底改了哪幾行就相當顯眼

這還只是簡易的例子,真正程式碼在修改不會像這樣只有一行兩行,不使用適當的工具只會弄得眼花潦亂,造成錯誤就得不嘗失

工具應為服務而生

技術與工具應為服務人而生,不是最終的目的,不懂得從使用者的角度出發思考,不懂得從軟體工程的角度出發思考,我想這是很多技術人常見的問題,如果能用不同的角度,放下對於單純技術的追求與炫耀,才能做出更能幫助人們、受人們歡迎的工具。

Posted in 中文文章, 嘴砲 | Tagged , , | 16 Comments

常見的Linux暴炸原因

今天看大家在搶COSCUP報名,報名頁面一如往年掛掉了,以我自己的經驗看來這樣等級的流量樣打掛Nginx應該還有很大的距離,我自己處理過Now.in在運行中遇過無數各種奇奇怪怪的問題,所以很多常見的Linux暴炸原因都見怪不怪了,對於上千等級連線的伺服器這些是很常遇到的事,如果沒有弄好的話很容易就整個Linux卡住或炸掉,以下介紹一些我所知道Linux會被塞暴的主要原因,都是參數沒設好為主

最大檔案數沒設好

我想這是最多常犯的錯,當然我也犯過,linux預設每個user可以開1024個檔案,嚴格來說是file descriptor,當然socket也算在內,如果這個數字沒有調的話,就算你的Nginx或是什麼鬼伺服器再怎麼威猛,1024這麼少的數字,稍微大一點的流量,都一樣是被塞暴的下場,因為執行伺服器的使用者開不出新的檔案、socket來,而這個問題最常遇到是因為一般情況下你的網站連線數量要達1024不是每天都會發生的,可能發生一下子就沒了,等到哪天真正大流量來時才會發現整個網站暴炸了,但是1024個以上的同時連線數對於目前的now.in伺服器來說隨時都在發生的,所以如果我有哪台伺服器忘記設,很快的就會炸掉

至於要怎樣提高檔案數限制,請參考 Linux Increase The Maximum Number Of Open Files / File Descriptors (FD)

ip_conntrack已滿,丟失封包

另一個常見被塞暴的是ip_conntrack,是iptables用來追蹤連線用的表,如果滿起來的話,新進來的封包會被丟掉,你可以在/var/log/message裡看見

Jul 15 19:22:30 hostname kernel: ip_conntrack: table full, dropping packet

這樣的訊息,可以透過修改最大值來解決,參考Linux Iptables ip_conntrack: table full, dropping packet error and solution

或是重開iptables service也可以洗掉目前的table

service iptables restart

記憶體用盡 

另一種常見的情況是記憶體用滿了,通常是由長期執行的程序引起的,因為要多餘的記憶體都只能從硬碟瘋狂swap分頁檔,因此整個系統的速度會慢到暴炸,有種快要卡住的感覺,如有這種情況檢查看看是否是記憶體被吃滿了,有些程序天生跑久了就會吃很多記憶體,像那種最好設crontab去定期重開

Posted in Linux, 中文文章 | Tagged , , , , | 3 Comments

你沒遇過的編譯器鬼打牆,許功蓋問題

我想在前面的文章裡很多人可能都沒遇過所謂的鬼打牆,大學四年中我遇到最多鬼打牆的狀況全是Dev C++引起的,其實如果都一一記下來應該是個很長的列表,只是問題解決通常我自己也忘記了,其中一個我印相最深刻的鬼打牆問題不是由Dev C++引起的,而是Visual C++ 6.0引起的,程式碼大略像這樣

class SocketHandler {
    // 此函數會被呼叫以通知連線成功
    void onConnectionSuccess();
};

void SocketHandler::onConnectionSuccess() {
   // some code here
}

這是我自己寫的一個socket連線程式,不管怎麼試,編譯器總會跟我抱怨它不認識onConnectionSuccess這個函數,從表面上看起來程式也沒有任何問題,所以問題到底出在哪裡? 答案是許功蓋問題,看到了嗎? 註解的最後一個字是”功”,而我們知道”功”在 big5 其中最後一個字元是 “/”,且VC6不懂得unicode,它會以ASCII的方式來處理程式碼,所以程式碼就變成

// 此函數會被呼叫以通知連線成 
void onConnectionSuccess();

如此一來,註解就被延伸到了下一行,onConnectionSuccess的宣告就因為這樣被忽視掉了,為了找到這個問題,我重讀了好多次程式碼,都找不到任何缺陷,一整天的時間就花在這個上面

這個故事告訴我們什麼?

從此之後我就強迫自己改用英文寫註解,我想沒有多少人有機會遇到這問題,而誰也想不到註解也會造成程式的編譯問題,這個故事告訴我們,工具的好壞遠比你想像重要,不要以為這種缺陷沒什麼,事實上是那些缺陷可以讓你debug一整天都找不到原因,除了你的工作時間浪費了,學習的時間更是浪費在其中,更慘的是還帶來了嚴重的挫折感,再一次,工欲善其事,必先利其器,學習更是如此

Posted in C/C++, 中文文章 | 5 Comments

[筆記] 手動編譯MySQL

  1. Download mysql source
  2. tar xvf mysql.tar
  3. yum -y install cmake
  4. Compile
    Follow guide here: http://forge.mysql.com/wiki/CMake
    mkdir bld
    cd bld
    cmake ..
    make
    sudo make install
  5. Set permissions of linux user and group
    Follow guide here http://dev.mysql.com/doc/refman/5.6/en/binary-installation.html
    groupadd mysql
    useradd -r -g mysql mysql
    cd /usr/local
    tar zxvf /path/to/mysql-VERSION-OS.tar.gz
    ln -s full-path-to-mysql-VERSION-OS mysql
    cd mysql
    chown -R mysql .
    chgrp -R mysql .
    scripts/mysql_install_db –user=mysql
    chown -R root .
    chown -R mysql data
  6. Copy init script and configuration file
    cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
    chmod +x /etc/init.d/mysqld
    chkconfig mysqld on
    cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
  7. Start the service
    service mysqld start
  8. Run the secure installation
    /usr/local/mysql/bin/mysql_secure_installation
Posted in 筆記 | Tagged , , , | Comments Off on [筆記] 手動編譯MySQL

[筆記] 讓ec2的user-data script每次都會執行

修改

/etc/init.d/cloud-init-user-scripts

裡面的

/usr/bin/cloud-init-run-module once-per-instance user-scripts execute run-parts ${SCRIPT_DIR} >/dev/null && success || failure

/usr/bin/cloud-init-run-module always user-scripts execute run-parts ${SCRIPT_DIR} >/dev/null && success || failure

參考來源:https://forums.aws.amazon.com/thread.jspa?messageID=247082

Posted in 中文文章, 筆記 | Comments Off on [筆記] 讓ec2的user-data script每次都會執行

我的open source專案整理列表

從很久以前,我就覺得open source是一件很酷的事,覺得能夠免費讓大家用自己心血的結晶真的是件很了不起的事,因此我自己除了使用了不少的open source資源,也一直希望自己也能夠多少有點貢獻,所以在過去多年中確實也有寫了一些open source的專案,雖然都不大,但都很多都是我自己會用到的工具,雖然以前可能有寫過一些介紹,但其實還有不少是沒有介紹過的,會寫open source專案其實多少就是希望有人能使用,而隨著時間久了,我自己會在看到時才想起原來我有寫過這個專案,所以想說弄篇文章來整理一下我所做過的open source專案

Python HGE

HGE以前是一款商用的2D遊戲引擎,後來開源,因為我覺得他的引擎挺簡單好用的,重點是有硬體加速,不像SDL純軟體算圖很慢,所以想說把它移植到Python,於是就用Boost.Python寫了一個專案,完成度大約7~8成,裡面有些比較難處理的部份還沒弄好,但主要功能大多都已經可以使用

專案網址:

http://code.google.com/p/python-hge/

Gluttony

Glottony是一個用來分析Python函式庫在PyPi上的相依情況,主要是有一次我安裝TurboGears時遇到其中一個package的伺服器似乎掛掉了,整個進度就因為那個檔案載不了而無法進行,因此我覺得或許這種相依的情況也是選工具時重要的考量,於是就寫了這樣的工具

專案網址:

https://bitbucket.org/victorlin/gluttony

Po translator

這是一個用來將.PO檔中的內容透過Google自動翻譯的工具,主要是因為我自己的網站有中文版,想翻成簡體中文,手動一個一個實在太花時間,於是就寫了一個這樣的工具,不過目前有個缺點是當送的量太多,會被Google擋掉一陣子的樣子

專案網址:

https://bitbucket.org/victorlin/po_translate

Apply firewall

iptable幾乎是所有用Linux主機多少都會用到的服務,但是在重設iptable的過程中,難免有時會不小心擋掉自己,如果是遠端登入就麻煩大了,主機在美國也碰不到,只有遠端重開機一條路可走,為了解決這問題,我做這個小工具,可以讓設定iptable像是切換螢幕解析度一樣,會有一段時間讓你確認,沒反應的話會自動取回更動前的設定

專案網址:

https://bitbucket.org/victorlin/apply_firewall

Correct pycountry

這是一個pycountry的fork,主要是因為pycountry引用ISO裡的國家名稱,但大家都知道台灣的名稱被ISO亂訂,看了心情就不是很爽,所以就fork出一個專案然後改掉裡面的名稱部份

專案網址:

https://bitbucket.org/victorlin/correct_pycountry

Middleman

Middleman是一個基於gevent的簡單網頁proxy,主要是我自己寫來抓論文用的,不過現在已經沒在使用,middleman的名稱主要是取自middleman attack

專案網址:

https://bitbucket.org/victorlin/middleman/

Logy

一個簡易的中央日誌記錄用的網頁服務,目前沒有繼續開發的打算

專案網址:

https://bitbucket.org/victorlin/logy

Loso

Loso主要是我替Plurk寫的一套中文斷詞系統,稍後有空我會寫篇文章來介紹這套系統

專案網址:

https://github.com/victorlin/loso

Avoid Disaster

Avoid disaster是一套用來備份資料用的工具,這也是我會加入Plurk的原因,當時我替我的Now.in寫了備份資料庫的工具,剛好看見Amir也寫了一套,裡面有個做法我覺得很不錯,於是就把兩套合在一起,做了一個fork,Amir看了就邀請我加入Plurk,這套工具不只可以備份到Amazon S3去,只要新增不同的storage類別,例如FTP storage,就能改將資料備份到FTP去

專案網址:

https://github.com/victorlin/avoid_disaster

SCSS Tools

SCSS Tools是一套工具讓Python整合SCSS變成一件輕鬆愉快的事,它讀取簡單的設定檔,然後幫你監視目錄裡的SCSS檔案是否有改變,有的話自動幫你重新編譯

文章介紹:

http://blog.ez2learn.com/2012/02/27/scss-is-not-for-ruby-only-python-can-also-integrate-scss/

License

這裡的專案所有的License應該都是MIT,好像只有少數幾個BSD,為什麼選MIT呢? 一來是我覺得GPL那種病毒式的,修改了想散播就得強迫你加入的自由算哪門子的自由,其實這點反而讓它變成很多商業產品喜歡使用的授權,因為你改了要散播也得開放出來,對於競爭對手有所限制,但BSD like就沒這問題,我這些東西都沒有商業考量,我覺得要開放就是要做到你拿去做商業軟體散播也無所謂的地步,就像天元突破裡的一段,他們之所以想開源

不過如果我也不是什麼聖人,或許哪天我的開源專案有了商業考量,或許我也會使用那病毒GPL來防止別人競爭吧,但是應該是不會,我覺得要開源就不怕別人用,就算用了GPL對方也不一定會照著規則走

第二個用MIT的理由,是因為MIT聽起來很酷!

第三,就是因為 MIT = Made in Taiwan 😀

Posted in 中文文章, 分享 | Tagged , | 8 Comments

軟體產業的失敗藉口 – 台灣的市場太小了?

最近在網路上越來越多軟體產業相關的部落格,也有很多不少相關的討論,其中我發現很多人將台灣軟體產業發展不起來歸究到台灣的市場太小了,我個人覺得這是最糟糕的藉口,因為事實上網路並沒有國界,只要有能力,一台電腦,一條網路線,一個人一樣可以做全球的生意,把自己能力不足怪到沒有市場是很奇怪的事,在這世界上有無數軟體成功的案例,都不是來自美國等軟體大國,我想在這裡舉出這些我所知道的一些例子,來證明確實在地的市場並不能做為軟體產業發展失敗的理由

EVE online – 冰島

冰島這個國家,人口數三十幾萬人,主要的產業活動是漁業,除此之外軟體產業也是這個國家的產業之一,是世界主要軟體的輸出國之一,有趣的是,在不久之前冰島還是被選為所謂最幸福的國家,吸引大量外資到當地投資,但因為炒作過度,導致整個國家銀行破產,幸福國度的神話也從此破滅,這個國家軟體產業最為人知的代表作就是一套以科幻星探險的線上遊戲,玩家可以駕駛太空船,在太空進行買賣、挖礦,還有海盜的冒險,我曾經有玩過一陣子,這遊戲有個公司的機制,玩家可以組成公司,一起行動來達到最佳的利益,例如有些公司以挖礦為業務,為了防止被海賊攻擊,就得有護衛艦負責保護,也有些公司是專門四處獵殺玩家的,我就有因為貪圖在高危險區的高任務獎勵,被守在星門外的海賊集團打暴過,印相相當深刻,值得一提的是這套遊戲的核心語言是Python

EVE - online screen shot

來自官網的遊戲畫面截圖

想想看一個人口只有三十幾萬的非英語系國家,國家還破產了,居然可以推出一套受全球玩家歡迎的線上遊戲,台灣有兩千餘萬人口,中文使用的人口是世界上最多的,居然說台灣沒有市場,這真的是一件很丟臉的事,請不要再提台灣市場很小做為失敗的理由

Minecraft – 瑞典

Minecraft是一套以挖礦和建造建築為主要活動的遊戲,很難以常見的遊戲類型分類,可以說是很特別的一款遊戲,這款不起眼的遊戲已經在全球賣出了兩百多萬套

Minecraft - screenshot

Minecraft - screenshot

作者是Notch,他來自瑞典, 瑞典的人口有九百多萬人,使用的主要語言是瑞典語,不用說市場當然是比台灣小,除此之外他在遊戲前期的開發都完全只靠他一人,在遊戲賣到一定量時,他就拿資金成立的公司,這又是另一個和在地市場無關的成功案例

Angry bird – 芬蘭

紅遍全球的手機遊戲,這家公司是來自芬蘭,國家人口數五百多萬,主要語言是瑞典語或芬蘭語,我想這遊戲不用太多介紹大家都很清楚了,同樣是來自比台灣人口少的國家,使用的也是人口數較少的語言

ICQ – 以色列

ICQ是一款在十幾年前相當流行的即時通軟體,在MSN Messenger之前ICQ可以說是獨佔了即時通的市場,ICQ是來自以色列的軟體,以色列的人口數七百多萬人,這國家的四週被敵國環繞,即使今天ICQ已經沒落了,但以色列依然還是全球的主要軟體輸出國之一

還有很多

這類非英語系小國家在軟體成功的例子其實還有很多很多,平時看到我沒有特別記下來,而且這類的例子有越來越多的情況,常常我會想,台灣的人口兩千多萬人口,這樣算市場小,所以是軟體產業發展不起來的原因? 我覺得反而是相反的,台灣的市場要大不大,要小不小,除了國際市場還有中文市場,上面所列出來的這些例子,這些國家都沒什麼在地市場,連語言都很小眾,如果他們沒有能力一口氣打進國際市場,沒什麼生存空間,反觀台灣這個不大不小的市場,吃不飽餓不死,接接企業專案、做做政府專案,都還可以活下去,因為這樣的環境,讓很多人以為市場就只有台灣這麼小的地方,忘了連上網路沒有所謂的國界這件事,所以請別再說台灣市場太小了,只能怪你自己能力太爛沒辦法在國際市場競爭

靠自己最實在

台灣現在很多人都還在用許多十年前的過時方法/技術在開發軟體,因為吃中文市場就能活下去,國外也不太可能來搶中文市場,倒頭來還是只能怪自己不精進技術、語言能力等等的能力,真的要成功,還是得靠開發者們加強自己的能力,我一直都這樣認為,台灣要有軟體產業,必然要先有一些開發者當種子,先靠自身的能力闖出一遍天地,才能帶出更多優秀的開發者,確立經營的方式等等,而這些後起之秀才能出去帶出更多優秀的人才,只是坐著抱怨起不了太大的作用

Posted in 中文文章, 嘴砲 | Tagged , , , , , | 4 Comments

A little play with HTML5 – 2.5D RPG Map Engine

Recently, I want to play those cutting edge HTML5 technologies for fun, especially on game developing. I think it would be really interesting to write some cool games with HTML5. Therefore, I took one night to wrote a simple prototype of 2.5D RPG map engine. Here is the screenshot

And the online demo

KaKa Monster 2.5D Map Engine Demo

Implementation

I use jQuery for some utilities, and the Canvas for drawing image.  Lucky, I’m familiar with the Canvas API when I first time read the document, because I noticed that it is almost identical to Cairo graphic library API (It appears it was ported from Cairo),  and one of projects I wrote was based on Cairo.  I use MVC pattern as the main structure of the program.

Copyright

This is not an open source project, please do not use any code on the demo site without my permission.  Of course, you can learn some tricks from the code, but please do not copy the code, thanks.

Conclusion

It’s still far from a real game, but I think it is won’t be too difficult to make it a full feature RPG game with HTML5.  I may implement some more features, such as walk on click, building layers, animation system, combat system and so on, when I have spare time.  But still, I didn’t write anything for playing audio with HTML5, I would like to have a try and see how to do.

It’s it the time to play some awesome games on web? I think it is not far from now 😛

Posted in English Articles, Javascripts | Tagged , , , , | 1 Comment