關於作者
我是Victor Lin,Now.in的創辦人,興趣是程式設計,Python目前是我最喜歡的語言,從國一開始寫程式到現在已經有十個年頭,不過還有很多要學習,除此之外偶爾用小提琴製造一些噪音也是我的興趣之一
E-Mail: 
Author Archives: victor
技術應為服務而生
在前面的一系列文章裡,我發現有些人有些很有趣的想法,有些人覺得使用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 … Continue reading
常見的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 … Continue reading
你沒遇過的編譯器鬼打牆,許功蓋問題
我想在前面的文章裡很多人可能都沒遇過所謂的鬼打牆,大學四年中我遇到最多鬼打牆的狀況全是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,我想光這點就顯示出了國外一流大學和國內大學的心態差別,國內的李大師只會很開心的描述當年學了什麼東西,然後把這些十年前、二十年、三十年前學到的東西教給學生,更糟的是國內的李大師之流都沒有太豐富的實戰經驗,他們都以發論文為生,但國外的一流大學的老師其實是很多都有豐富的業界實戰經驗,他們懂得外面真正需要的是什麼 剩下還有很多堂課的影片,在網路上搜尋都找得到,所以就不在此列出
李大師您多久沒寫程式了 ? 一百個你不應該繼續用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++,如果有的話請讓我知道,我真的很佩服可以用這樣破爛的工具還能在業界生存,肯定是神手中的神手 學生學會這樣的工具就頂多只能勉強寫作業而已,出了社會來到業界連個開新專案都不會,更別說是連結別人寫好的函式庫,甚至是自己寫函式庫給別人連結,我只能寫一個慘字! 老舊的編譯器 … Continue reading
Posted in WTF
57 Comments
[筆記] 手動編譯MySQL
Download mysql source tar xvf mysql.tar yum -y install cmake Compile Follow guide here: http://forge.mysql.com/wiki/CMake mkdir bld cd bld cmake .. make sudo make install 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 … Continue reading
[筆記] 讓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 … Continue reading
軟體產業的失敗藉口 – 台灣的市場太小了?
最近在網路上越來越多軟體產業相關的部落格,也有很多不少相關的討論,其中我發現很多人將台灣軟體產業發展不起來歸究到台灣的市場太小了,我個人覺得這是最糟糕的藉口,因為事實上網路並沒有國界,只要有能力,一台電腦,一條網路線,一個人一樣可以做全球的生意,把自己能力不足怪到沒有市場是很奇怪的事,在這世界上有無數軟體成功的案例,都不是來自美國等軟體大國,我想在這裡舉出這些我所知道的一些例子,來證明確實在地的市場並不能做為軟體產業發展失敗的理由 EVE online – 冰島 冰島這個國家,人口數三十幾萬人,主要的產業活動是漁業,除此之外軟體產業也是這個國家的產業之一,是世界主要軟體的輸出國之一,有趣的是,在不久之前冰島還是被選為所謂最幸福的國家,吸引大量外資到當地投資,但因為炒作過度,導致整個國家銀行破產,幸福國度的神話也從此破滅,這個國家軟體產業最為人知的代表作就是一套以科幻星探險的線上遊戲,玩家可以駕駛太空船,在太空進行買賣、挖礦,還有海盜的冒險,我曾經有玩過一陣子,這遊戲有個公司的機制,玩家可以組成公司,一起行動來達到最佳的利益,例如有些公司以挖礦為業務,為了防止被海賊攻擊,就得有護衛艦負責保護,也有些公司是專門四處獵殺玩家的,我就有因為貪圖在高危險區的高任務獎勵,被守在星門外的海賊集團打暴過,印相相當深刻,值得一提的是這套遊戲的核心語言是Python 來自官網的遊戲畫面截圖 想想看一個人口只有三十幾萬的非英語系國家,國家還破產了,居然可以推出一套受全球玩家歡迎的線上遊戲,台灣有兩千餘萬人口,中文使用的人口是世界上最多的,居然說台灣沒有市場,這真的是一件很丟臉的事,請不要再提台灣市場很小做為失敗的理由 Minecraft - 瑞典 Minecraft是一套以挖礦和建造建築為主要活動的遊戲,很難以常見的遊戲類型分類,可以說是很特別的一款遊戲,這款不起眼的遊戲已經在全球賣出了兩百多萬套 作者是Notch,他來自瑞典, 瑞典的人口有九百多萬人,使用的主要語言是瑞典語,不用說市場當然是比台灣小,除此之外他在遊戲前期的開發都完全只靠他一人,在遊戲賣到一定量時,他就拿資金成立的公司,這又是另一個和在地市場無關的成功案例 Angry bird – 芬蘭 紅遍全球的手機遊戲,這家公司是來自芬蘭,國家人口數五百多萬,主要語言是瑞典語或芬蘭語,我想這遊戲不用太多介紹大家都很清楚了,同樣是來自比台灣人口少的國家,使用的也是人口數較少的語言 ICQ – 以色列 ICQ是一款在十幾年前相當流行的即時通軟體,在MSN Messenger之前ICQ可以說是獨佔了即時通的市場,ICQ是來自以色列的軟體,以色列的人口數七百多萬人,這國家的四週被敵國環繞,即使今天ICQ已經沒落了,但以色列依然還是全球的主要軟體輸出國之一 還有很多 這類非英語系小國家在軟體成功的例子其實還有很多很多,平時看到我沒有特別記下來,而且這類的例子有越來越多的情況,常常我會想,台灣的人口兩千多萬人口,這樣算市場小,所以是軟體產業發展不起來的原因? 我覺得反而是相反的,台灣的市場要大不大,要小不小,除了國際市場還有中文市場,上面所列出來的這些例子,這些國家都沒什麼在地市場,連語言都很小眾,如果他們沒有能力一口氣打進國際市場,沒什麼生存空間,反觀台灣這個不大不小的市場,吃不飽餓不死,接接企業專案、做做政府專案,都還可以活下去,因為這樣的環境,讓很多人以為市場就只有台灣這麼小的地方,忘了連上網路沒有所謂的國界這件事,所以請別再說台灣市場太小了,只能怪你自己能力太爛沒辦法在國際市場競爭 靠自己最實在 台灣現在很多人都還在用許多十年前的過時方法/技術在開發軟體,因為吃中文市場就能活下去,國外也不太可能來搶中文市場,倒頭來還是只能怪自己不精進技術、語言能力等等的能力,真的要成功,還是得靠開發者們加強自己的能力,我一直都這樣認為,台灣要有軟體產業,必然要先有一些開發者當種子,先靠自身的能力闖出一遍天地,才能帶出更多優秀的開發者,確立經營的方式等等,而這些後起之秀才能出去帶出更多優秀的人才,只是坐著抱怨起不了太大的作用
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 … Continue reading