-
Recent Posts
Recent Comments
Archives
- December 2013
- November 2013
- March 2012
- February 2012
- December 2011
- November 2011
- October 2011
- August 2011
- July 2011
- June 2011
- May 2011
- March 2011
- February 2011
- January 2011
- October 2010
- August 2010
- July 2010
- May 2010
- April 2010
- March 2010
- January 2010
- December 2009
- November 2009
- October 2009
- September 2009
- August 2009
- July 2009
- June 2009
- March 2009
- February 2009
- January 2009
- December 2008
- November 2008
- October 2008
- September 2008
Categories
Meta
友站連結
Category Archives: 中文文章
你沒遇過的編譯器鬼打牆,許功蓋問題
我想在前面的文章裡很多人可能都沒遇過所謂的鬼打牆,大學四年中我遇到最多鬼打牆的狀況全是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
[筆記] 讓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
我的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已經沒落了,但以色列依然還是全球的主要軟體輸出國之一 還有很多 這類非英語系小國家在軟體成功的例子其實還有很多很多,平時看到我沒有特別記下來,而且這類的例子有越來越多的情況,常常我會想,台灣的人口兩千多萬人口,這樣算市場小,所以是軟體產業發展不起來的原因? 我覺得反而是相反的,台灣的市場要大不大,要小不小,除了國際市場還有中文市場,上面所列出來的這些例子,這些國家都沒什麼在地市場,連語言都很小眾,如果他們沒有能力一口氣打進國際市場,沒什麼生存空間,反觀台灣這個不大不小的市場,吃不飽餓不死,接接企業專案、做做政府專案,都還可以活下去,因為這樣的環境,讓很多人以為市場就只有台灣這麼小的地方,忘了連上網路沒有所謂的國界這件事,所以請別再說台灣市場太小了,只能怪你自己能力太爛沒辦法在國際市場競爭 靠自己最實在 台灣現在很多人都還在用許多十年前的過時方法/技術在開發軟體,因為吃中文市場就能活下去,國外也不太可能來搶中文市場,倒頭來還是只能怪自己不精進技術、語言能力等等的能力,真的要成功,還是得靠開發者們加強自己的能力,我一直都這樣認為,台灣要有軟體產業,必然要先有一些開發者當種子,先靠自身的能力闖出一遍天地,才能帶出更多優秀的開發者,確立經營的方式等等,而這些後起之秀才能出去帶出更多優秀的人才,只是坐著抱怨起不了太大的作用
無停機服務遷移
一直以來在營運now.in都有一個令人困擾的問題,就是每當伺服器更新或是出現問題時,就得關掉重開,雖然說大部份的伺服器我在設計上都做成重開也沒有關係,但有少部份一但重啟就會造成使用者斷線,參考下面這張伺服器狀態的圖 圖中被切斷的山峰都是伺服器重啟的時候,無疑的這對使用者來說是不好的體驗,對於一般網頁HTTP這類stateless的伺服器來說重啟是無所謂,但串流伺服器就不一樣,因此最近我在思考如何解決這樣的問題,首先想到的是伺服器重開的原因,不外乎有幾種 部署新版的程式 為了修正BUG 記憶體用量過高 重新讀取執行環境,例如ulimit -n,也就是檔案數量的限制大小 從主機A移到主機B 以Python的伺服器來說,如果只是單單只是為了部署新版的程式,Python有個reload函數可以重讀整個module,因此可以設個管理用的後門用來重載模組,但是這樣做有個問題,就是已經產生的instance還是一樣,其實說穿了等於是重新執行那個module,如果只是簡單的改版還好,但複雜的改版就可能牽扯到太多因素難以透過這樣來更新,而除此之外,很多重開的因素像是記憶體用量過高,或著執行的環境參數改變,這些都無可避免的一定得建新的process,至於從A主機移到B主機,基本上是難以避免的一定得重啟伺服器,除非有某個前端的伺服器保持連線,後端的伺服器進行交移工作才有可能,而主機轉移的狀況其實很少出現,因此這篇文章要探討的是如何辦到同一臺機器內的服務轉移 方法 最大的問題就在於,連線中的socket該如保持住連線,最簡單的想法就是建立新的process,將目前的連線交給新的process,新的process接手完所有的連線開始運作後舊的process就能終止了,當然所謂的連線還包函了服務的狀態,我們在者裡稱之為 CSD (Connection State Descriptor),大致想法如下面圖片所示 首先Process A是正在運行的process,而Manager是負責控制遷移的process 此時Manager啟動了要負責接手的Process B 接著Manager通知A將連線狀態傳送給Process B,B接手後繼續提供服務,並且告知接收完成 在確定B能夠接手服務並且正確執行後,這時Manager就能將A中止,走到這裡服務就算是完整地移交了,中間沒有任何間斷 技術層面問題 – Socket的轉移 這樣的做法理論上看起來確實可行沒錯,但是最主要有技術上的問題得解決,就是如何將socket,或著是file descriptor轉移到另一個process,在我找過相關的資料後知道目前有兩個方法 child process 這個方法主要是因為child process在生成後會繼承parent process的file descriptor,但是缺點就是只限於child process,如果我們想將服務移交給另一個完整的獨立process這個方法就會行不通,因此使用上會有很多限制 sendmsg 另一個方法就是unix domain的socket有提供一個函數叫sendmsg,可以將file descriptor轉移到任何process,這樣一來實用性就比child process高很多,於是我決定採用此方法 簡易的實作 … Continue reading
Mr.DJ 2.0.3 Mac OS X版發佈
Mr.DJ 2.0.3 Mac OS X版正式發佈 截圖 下載頁面
無用 – 更改Linux SSH登入歡迎畫面為新世紀福音戰士裡的Nerv的logo
不要問我這有什麼用,只是純好玩,如果你的ssh沒有用utf8編碼的話可能會看到亂碼,以下是看起來的效果 做法 做法很簡單,修改/etc/motd檔即可,如果你想要這個Nerv logo,可以下載這個motd.txt然後解開後覆蓋原本的motd即可 Logo作者 Logo作者為ptt的cfi697,而原始版本因為字型寬度的問題我修正了一下
嘴砲談雲端 – 介紹用雲端除錯網頁的雲端技術: Browserling
有試著想開發支援所有主流瀏覽器的朋有們肯定都會遇過像我在 How hateful it is to develop a web application which runs correctly with different browsers? 所提到的情況,為了確定網頁在各種版本的瀏覽器,特別是那該死的IE系列都能正常顯示和執行,這樣的畫面出現是很平常的事 在這張圖中我分别用了兩個VirtualBox給IE7和IE6,如果連IE5要加進來右是另一個,只是IE5太古老雖然還是可能有人在用,但我已經懶得測了。 當然,安裝所有的瀏覽器是一個解決方法,包括使用VirtualBox之類的虛擬化技術來安裝萬惡的IE系列,但畢竟還是很麻煩,來自拉脫維亞 (老實說我也不知道這是什麼樣的地方 XD) 的Peteris Krumins,有趣的是Peteris他唸的是物理系,他和來自美國的James Halliday創作了一個基於雲端的解決方案,叫Browserling,裡面用的技術是之前我在 Open the browser, and here comes the computing power 所提到的,他們共同開發的技術,這個技術最有趣的地方是可以透過網頁來遠端操作電腦,雖然這不是什麼很創新的技術,但結合虛擬化的技術,將運算能力變成像流水一樣,網頁一開服務即到的型式,這就是它的潛力。 扯到雲端 在台灣一個很有趣的現像就是,當某種新東西很新奇、在未來會有不錯的應用,總會有一堆門外漢跟著朗朗上口地四處吹噓這些名詞,說穿了不過就只是趕流行,前陣子流行的是奈米,什麼都要冠上奈米,這樣做價格似乎就可以翻幾成,也有Web2.0之類的,甚至台灣還有人搶著推出Web3.0,說是要把網頁變成P2P的型式,當然是以失敗收場,而現在只不過是把流行的口號改成雲端而已,什麼都要冠上雲端,打開電視偶爾也會看見一些名嘴吹噓著雲端巴啦巴啦…,其實當發現一堆門外漢也在跟著人云亦云時就說明了這已經是在炒作了,哪天在路邊看見”雲端雞排”也請不要意外 XD 何謂雲端 每個人對雲端都有一套解釋,對我來說,雲端不外乎就只是將計算資源、資料儲存等等能力變成像自來水那樣,接上名為網際網路的大水管,打開電腦即可存取,這樣的概念其實早就有了,更早之前甚至有人提出更激進的想法,要將使用者這端完全只剩下客戶端的能力就夠了,剩的東西都由雲端的能力提供,但是也是沒有成功,或許是環境不夠成熟,而我個人認為使用者端的能力也是需要的,網路頻寬再怎麼進展,要即時所有東西都由遠端提供還是有困難的 台灣的現況 … Continue reading
數學筆記: Euler’s theorem 練習前置證明
最近因為要讀密碼學相關的論文,會用到不少數論的東西,而我的個性是沒真正推導過的東西用起來總很不放心,而且我很笨,沒有平鋪直述的思路推導就很難理解,我討厭那種神來一筆,我記得以前在PTT上問過一個微積分的問題,我看到一個有三角函樹的式子被上下同乘某個三角函數得到另一個式子,我一直覺得很納悶,書上只這樣寫,我想知道的不是結果,而是思路,結果有個的同學就回答了”阿不就上下同乘X函數”,我差點沒暈倒,老兄,你不說我看書也知道是上下同乘那函數,結果對我來說只是一個點,但思路是一條路徑,沒有思路的話,數學式子對我來說也不過是幾個文字而已 雖然有些東西以前可能有想過是怎樣推導出來,但因為太少用所以很容易忘記,每次都重新想起,所以我決定將整個思路寫下來,這樣以後忘記時就不用重新看,所以主要只是給自己看的筆記,寫在紙上時間久了一樣會不見,所以想一想寫到部落格裡好了,順便練習用LaTeX編數學公式,可能會對某些人有幫助,但我突然腦殘想錯的機會不小,所以讀者請自重囉 今天要證的是,若m為質數,w為任一與m互質之整數,則 主要證明是參考 數論在密碼上的應用 (第 2 頁) 這雖然不是Euler定理,但我覺得對之後證明很有用,太少接觸所以先從簡單的開始 一開始由該網頁所提到的方式,拆開成多項式來看 接著就得先從多項式定理複習起 其實可以被視為是 如果把每一個垂直列開來,就會發現其實 我們可以把這樣展開的式子,視為從上到下每行挑一個的連乘,因為要從2個選擇中挑n次,這樣所有的組合可能為 但是我們比較在意的是某些組合出現的次數,我們可能會想知道n個a出現幾次,也就是它的系數,而這要算出不同可能情況的系數又扯到了排列組合,複習一下排列組合的思路,如果我們有ABC三個東西要排列 最直觀的想法就是,先關注在ABC三個東西所佔的地方,直接先把它們當成位置來看 先從最左邊的位置開始,此時我們手裡有ABC三種選擇,接著來到第二個位置,前面已經挑走了一個選擇,所以我們只剩兩個,接著最後一格,挑剩下的就只有一種選擇,所以可能的選擇有 種,也就是 接著來考慮重覆的部份,先一樣當成都不同來看,可能性展開有這麼多6種 在此時,我們被告知B和C其實是同一種 把B和C都替換成X來看 我們會發現其實原本的可能性數量其實重覆了一次,所以應該除以二,而二這個數字其實就是B和C排列的可能性,由此我們可以知道,當N個東西任意排列,其可能情況是 而當我們被告知,這裡面其實有a個東西是一樣的,那麼我們就將重覆的情況除掉 當我們又被告知,裡面有b個東西是一樣的,此時我們又可以去掉重覆的,得到的結果就是 但是,理所當然的,裡面不一樣的東西數量加起來不可能會大於N,有了基本的排列公式複習,我們回到二項式定理 利用我們剛才排列的公式,我們知道個個系數其實是 以 來解釋的話,因為有k-2個相同的a和2個相同的b,所以k!要除掉相同的部份,有了這個部份我們可以回到先前把w拆成1來看的部份 在這裡,我們把每個1都當做不一樣的數來看待,套用多項式公式我們會發現裡面有w項的 每項都是1,加總起來是w,而剩下的部份,形式像這樣 這些數全都因為包含m為因數可以被m整除,在此有個疑點就是,那為什麼分子就不可能把m給除掉,剩下的不會是m-1之類的嗎? 原因很簡單,因為m是質數記得嗎? 以這一項來看 m!的很多項都會被消掉,像這個會被消成 下面的2!會是(m-1)或m的因數,但是因為m是質數,除了它自己以外只有1是因數,因此不管下面放些什麼,m總會是這些項目的系數中的一部份,得到這結論後,我們就能將之前的式子兩邊同除m,這樣除了w以外的項目都會被整除,得到 這時離我們目標不遠了,兩邊同除w 就證出來了,最後有個疑問,就是w為什麼得和m互質,因為在倒數第二個式子,如果它們不互質,w一除m就會被變成其它的數 to read Haitian … Continue reading
Po translate 自動化翻譯工具
之前有寫一個 PO檔自動繁簡轉換程式,但是因為沒有把它傳到PyPi上,所以要到處copy貼上很麻煩,為了方便使用,我把它打包並且傳到了PyPi,以MIT License開放源始碼,不過只是一個很簡單的程式而已,我想應該沒有多少人會想改些什麼,但是當然有人有興趣的話,歡迎修改 這個程式主要是用來解決繁體中文的.PO檔和簡體之間的互換問題,因為翻譯完繁體中文,基本上和簡體沒有太大差別,用Google translate轉成簡體就可以,但是手工作起來很煩,這種事情當然是交給程式執行 安裝方法很簡單 easy_install po_translate 使用也很簡單 po_translate input.po output.po zh-TW zh-CN 像這樣就能輕鬆的透過Google translate把繁中的.PO檔轉成簡中的 相關連結 PyPi的連結 Bitbucket的Repo