技術應為服務而生

在前面的一系列文章裡,我發現有些人有些很有趣的想法,有些人覺得使用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的過程以泡泡視窗的方式串聯在一起,讓你可以很直覺地理解程式呼叫的過程

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

再舉另一個例子,就是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 , , , , | 2 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++ | 3 Comments

李大師教初學者用C語言? MIT使用Python

在前一篇文章 李大師您多久沒寫程式了 ? 一百個你不應該繼續用Dev C++的理由,有人提到李家同只是要教程式邏輯的思考方式,所以用Dev C++無關緊要,而且使用的語言是C,其實,光是用C語言說要教沒有基礎的學生程式的邏輯思考,甚至還要讓學生能有興趣,真的有那麼簡單嗎? 答案肯定是很困難的,C語言有很多特性讓初學會感到挫折,當然,使用Dev C++無疑的只是增加遇到問題的機會,對學習本身一點幫助都沒有

在我的看法如果想要教從來沒有經驗的初學者,C語言雖然是最扎實的一條路,也同時是最難走的一條路,以我自己的經驗來說,從國一到國三我自學了三年的VB,到了高中才開始學C/C++,我敢說如果沒有VB那樣簡易上手的那段時期,而一開始就學習如C/C++如此困難的程式語言,或許我會被挫折感打敗

程式語言的學習與思考是可以從高階的層次開始的,先忽略細節,避免太過困難、抽象的概念,有趣的實際小應用入門,C語言顯然都不具備有這樣的特性,與其使用C語言,Python、Basic、Ruby等語言才是更容易上手的,在網路上我所看到很多從5歲到10歲左右就開始學程式語言的高手,都是從Basic之類的語言開始的,但我從來沒有看過有5歲就能從C語言入門的,我想這就顯示出了簡易語言對於入門的重要性。

MIT使用Python做為CS入門程式設計課程

MIT用Python做為Computer science入們程式設計課程的語言,我想這已經不是新聞了,即使大師們活在巨塔中,至少也有網路吧? 這是一個宅在家裡都能學到最新事物的時代,接觸點新的事物好嗎? 很多人都學一招半式教一輩子,或許如果學的是古典音樂,這可能過個一百年都不會改變,但是不幸的是我們所在的是改變最快速的產業,不要期待學校能教多新的東西,但只希望不要跟世界脫節太多,或許你會反駁,很多東西過很久都不會變,像是概念上的東西,但是我會說,我用更現代的工具可以做得更好,一樣可以教不變的概念,只是看你有沒有心想要去做得好而已

這些課程都能在網路上免費找到,以下為MIT的6.00 Introduction to Computer Science and Programming上課的影片,在第一堂課33分左右,裡面的講者提到了程式語言,他說以前他接受的是lisp的訓練,可是他現在教的是Python,我想光這點就顯示出了國外一流大學和國內大學的心態差別,國內的李大師只會很開心的描述當年學了什麼東西,然後把這些十年前、二十年、三十年前學到的東西教給學生,更糟的是國內的李大師之流都沒有太豐富的實戰經驗,他們都以發論文為生,但國外的一流大學的老師其實是很多都有豐富的業界實戰經驗,他們懂得外面真正需要的是什麼





剩下還有很多堂課的影片,在網路上搜尋都找得到,所以就不在此列出

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

李大師您多久沒寫程式了 ? 一百個你不應該繼續用Dev C++ 4.9.9.2 的理由

我常常喜歡說,台灣的軟體業界落後國外十年,這不只是說說而已,很多地方都透露著落後的氣息,像是學校特別是如此,看看很多大學計概在教C/C++語言就知道了,清一色用的是Dev C++,每次看到我都會說

我的天阿! 拜託! 不要再用Dev C++了!!

所以用Dev C++到底錯在哪裡? 下面列出一些為什麼你不該用Dev C++的理由,特別是用來教學

Dev C++是已經死亡多年的專案!

是的,Dev C++這個專案已經陣亡多年,它的上一個穩定版本已經是十年前的產物,即使是beta版也早在六年前停止了開發

所以台灣的軟體產業落後國外十年這真的不是戲言,但或許你會說,停止開發又如何? 簡單好用,過了十年還是一樣簡單好用,但是事情根本不是那樣

學生連開新專案都學不會?

Dev C++最大一個特色就是不用開新專案就能編譯並執行程式,在我所知道的IDE裡這是極少數有這樣特性的環境,至少以現代的眼光來看盡是如此,如果是遠古時代的Turbo C之類的就不用比了,因為這樣特性的使然,一堆學生連開新專案都不會,你或許會說,不會開新專案又怎樣?

不會開新專案問題就大了,不管是debugger、編譯器設定、函式庫連結,這些都得先建出一個專案才能進行設定或使用,不管是Visual C++、Eclipse、Code::Blocks等你所能找到的所有現代IDE都是如此,連開新專案都不會就在寫程式就好像連走路都不會就在跑步一樣的糟糕

多數不清的臭蟲和怪異的行為

因為Dev C++專案已經陣亡多年,所以其中有數不清的臭蟲還有詭異的行為都沒有被修正,通常遇到了就像是鬼打牆一樣,debugger也是問題百出,常常有些同學的程式有問題拿來問我,我在檢查了多次都找不到問題所在,接著拿到其它的IDE下就能正常執行,最後發現其實是Dev C++本身的缺陷所引起的,只能苦笑著說是Dev C++發生鬼打牆,這對初學者有什麼影響?

這影響可大了! 初學者連最基本的東西都不會,他們需要的是一個可以信賴的環境讓他們可以知道什麼是對的什麼是錯的,但是今天這個環境連什麼是對的什麼是錯的都沒辦法確定,這樣有可能可以學好程式設計嗎? 有可能嗎?

無法教會學生使用除錯器

除錯器(debugger)是學習程式到底是如何執行的,以及找到錯誤的好幫手,有一點程度的程式設計師都知道這叫trace,也就是追蹤,但是因為Dev C++本身的問題,其除錯器的功能殘缺就算了,還有一大堆未知的臭蟲在其中,更慘的是搭配先前不用建專案就能執行,就算建了專案還得手動加入除錯的選項才能使用,使得用Dev C++教會學生正確地使用除錯器根本就是天方夜譚。

業界根本沒有人在使用Dev C++

就我所知道的業界根本沒有人在使用Dev C++,如果有的話請讓我知道,我真的很佩服可以用這樣破爛的工具還能在業界生存,肯定是神手中的神手

學生學會這樣的工具就頂多只能勉強寫作業而已,出了社會來到業界連個開新專案都不會,更別說是連結別人寫好的函式庫,甚至是自己寫函式庫給別人連結,我只能寫一個慘字!

老舊的編譯器

現在的C++已經跟10年前的C++有一段很大的落差了,新的特性一直在增加,因為Dev C++搭載的是當時的gcc,因此很多最新的特性都沒有,好吧,雖然我一點都不期待有多少老師或助教能知道那些新技術,像是李伯伯知道什麼是Boost嗎? 什麼又是technical report? 暱名函數? auto? 甚至是最基本的STL?

為什麼用Dev C++?

是的,我的標題騙人,我沒寫滿100個理由,或許有天我會補上,但現在我們先看一下主要我所認為使用Dev C++的理由

  • 懶,Dev C++開了檔案就編譯,簡單好用,連開新專案都不用解釋
  • Debugger? 那是什麼?
  • 阿我也只會用Dev C++
  • 阿我的老師教我用Dev C++,所以我也用
  • 學長寫的講議用Dev C++,所以我也用
  • 隔壁Lab的王小明他家的狗的前主人的二嬸婆也用Dev C++教學,所以我也用
  • 我只知道Dev C++
  • 阿就免錢的,我也買不起Visual C++
  • 寫論文拿來跑跑模擬數據就夠了
  • ….

啥咪? 連李家同都用Dev C++喔?

為什麼我會突然寫這篇? 其實平時看到大家在用Dev C++在心裡咒罵這些不長進的傢伙就算了,但今天偶然看見李家同大師的新書的心得

人人都能學會寫程式:李家同教你用邏輯思考學程式設計

然後看見這本書的介紹裡提到

在此強調我們用的程式語言是C語言,所使用的編譯器是Dev-C++4.9.9.2。讀者如果用錯了編譯器版本可能會出問題。

我的媽呀,於是我忍不住了,姑且不論這本書是不是他弟子捉刀寫的書,但即然都掛上李家同名號了,我想請問一下李大師

您多久沒寫過程式了?

讀者用錯了編譯器版本還可能出問題,不要告訴我這特異的行為又是Dev C++本身引起的問題,難道其中用了什麼樣的奇技淫巧在不同編譯器下還會出現不同的行為? 使用這樣破爛的工具教初學者真的好嗎? 初學者有辦法分得出來是Dev C++本身鬼打牆,還是自己寫錯了呢? 更何況是這本書聲稱的人人有功練?

選擇更好的工具,你可以不用變成李家同

我不知道李伯伯多久沒寫程式了,但是看他的書都用Dev C++就可以斷定,他或他的弟子都沒寫過什麼真正的程式,或許跑跑數據模擬還過得去,除此之外可能就有問題,更別說來教別人寫程式了,巨塔裡所謂的寫程式和外面的寫程式是兩回事

工欲善其事,必先利其器,使用破爛的工具只會造成程式學習上的重大阻礙,如果你的目標是成為李大師,或許你可以用Dev C++,否擇除了Dev C++以外,其實你還有n種選擇,在這裡列出幾樣我所知道的

Code::blocks

Code::Blocks是一款open source的IDE環境,優點是輕巧易用,而且該有的功能一樣都沒少,其本身就是一套強大的編譯工具,甚至cmake等編譯工具也可以產生Code::block的專案用來編譯,但缺點是目前只有英文介面,對於教學上比較不方便

Visual C++ Express

或許是為了搶佔學生市場,微軟佛心來的推出了免費的閹割版的Visual C++,也就是Visual C++ Express,雖然說是閹割版,也只是少掉了MFC之類商用的函式庫,其它該有的功能一樣都沒少,自動完成等等,它的debugger甚至還硬比其它IDE強大,可以回朔到上面的指令,而且它有中文版,拿來教學再好也不過,缺點是中文版的編譯器訊息也是中文的,英文的錯誤訊息已經夠難懂了,翻成中文後你連在Google貼上訊息找到半點有用的資料都找不到

Eclipse

Eclipse本身是用Java寫的IDE,並沒有限定在特定的語言上,因此從Java、C/C++、Python甚至到PHP都有相對應的IDE可以使用,而且該有的功能也一樣都有,比其它IDE棒的地方是它有各種不同的插件可以使用,例如可以整合版本控制系統,不過對於教學用途可能就用不到,而且缺點是很耗系統資源,特別是記憶體,這是用Java寫的程式一貫的毛病,對於老舊的教室電腦可能是很大的負擔,因此不是很推薦用於C/C++教學

wxDevC

不是說Dev C++死了嗎? 確實是死了,但其實沒有死透,後繼有人接手了Dev C++的開發,改名為wxDev C++,最主要是整合了wxWidget的設計功能,個人是沒有用過,但這專案一直都有在維護,應該至少會比目前的Dev C++好上很多,如果真的對Dev C++有執著的話不妨可以試試

最後

再一次,如果你是程式設計課程的助教、老師,拜託,花點時間學款現代一點的IDE吧,不要再用史前時代的破爛工具來殘害你的學生們,台灣軟體產業已經夠落後了,行行好吧

2011/09/17 更新

最近有人接續了Dev C++的開發工作,持續更新了好幾個版本,修正了上面提到很多主要的問題,我想Dev C++改掉上面那些問題其實是很小巧好用的工具,個人強烈建議要用Dev C++請使用最新的版本,目前已經出到了5.0.0.3,請參考另一篇文章

Dev C++ 5.0.0.3釋出

Posted in WTF | 57 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 , , , | Leave a comment

[筆記] 讓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 中文文章, 筆記 | Leave a comment

我的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

License

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

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

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

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

Posted in 中文文章, 分享 | Tagged , | 5 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 , , , , , | 2 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 :P

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