關於作者
我是Victor Lin,Now.in的創辦人,興趣是程式設計,Python目前是我最喜歡的語言,從國一開始寫程式到現在已經有十個年頭,不過還有很多要學習,除此之外偶爾用小提琴製造一些噪音也是我的興趣之一
E-Mail: 
贊助商連結
Tag Archives: Python
李大師教初學者用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,我想光這點就顯示出了國外一流大學和國內大學的心態差別,國內的李大師只會很開心的描述當年學了什麼東西,然後把這些十年前、二十年、三十年前學到的東西教給學生,更糟的是國內的李大師之流都沒有太豐富的實戰經驗,他們都以發論文為生,但國外的一流大學的老師其實是很多都有豐富的業界實戰經驗,他們懂得外面真正需要的是什麼 剩下還有很多堂課的影片,在網路上搜尋都找得到,所以就不在此列出
Zero-downtime service migration
When I am running my website, now.in, I did encounter a trouble. That is, when there is a bug in the production server, then I need to restart them. Sounds fine, right? Just to restart a server. Yes, for most … Continue reading
Posted in 分享, English Articles, Python, Unix-Like
Tagged 0-down-time, hot code swap, migration, Python, service
Leave a comment
無停機服務遷移
一直以來在營運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
Logy – a central logging system for Python
I’m glad to announce my new open source project:Logy. Logy is a simple lightweight central logging system for Python. When do you need a central logging system? Well, when you have many servers online, and they are running different python … 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
A tool for applying iptables safely: apply_firewall.
Have you ever done something stupid with iptables command which like blocking you self from accessing the SSH? Yes, I have. Most of administrator knows that is dangerous to change iptable rules remotely, with a little typo, you might have … Continue reading
Posted in English Articles, Linux, Python
Tagged administration, iptables, Linux, Python, tool
1 Comment
淺談coroutine與gevent
這篇文章是要大略介紹一下coroutine和Python的相關應用的函式庫gevent,在介紹coroutine前我們先來點情境,因為目前常見的coroutine應用都是在網路程式上,因此我們得先建立一些網路框架的模形再介紹coroutine會比較容易懂 不同的網路框架模型 網路隨著時代發展,已經成為現代生活中越來越重要的重要的基礎,而做為提供這些服務的伺服器,負載的連線也越來越多,因此網路程式的軟體、硬體架構也一直在演變,才有辦法承載越來越多的連線數量,有人希望在一台機器能夠同時處理1萬個連線以上,所以提出C10K問題,並且之後有不少新的的技術來達成這個目標,而在此我們只專注在於軟體的架構上,首先介紹最簡單的架構 阻塞式單一行程 這樣的網路程式非常的簡單,只有一個迴圈,單一個行程,處理完一個要求後才繼續處理下一個,理所當然這樣的效能非常差,因為連線在完成前其它的連線都無法被處理,現代的伺服器已經很少看見這樣的架構,但因為優點是簡單,如果沒有什麼大量同時連線要處理,其實這樣的架構就很足夠 阻塞式多行程 因為既然單一行程只能同時處理一個請求,那很簡單的想法就是每個請求開一個行程去處理,如此一來就能同時處理更多的請求,但是這樣做有缺點,行程的copy如果是fork的話,有os paging system在成本上其實還好,但是還是有,而且越多的連線就表示需要越多的context-switch,當連線量多到一定程度時,可能大部份的CPU時間都在忙著進行context-switch,如此一來這樣的架構在此情況下是沒有效率的,但是優點是寫伺服器的部份事實上和寫單一行程阻塞式不會差太多,一樣簡單好寫 阻塞式多行程多執行緒 除了多行程多阻塞式,有些程式為了減少process copy的成本,或是其它的考量,會在多個行程上開多個執行緒來處理請求,也有可能是單行程多執行緒,但是基本上和上面這幾種都沒有太大的差別,而引進了執行緒帶來了一些額外的問題,dead lock、race condition等等,當不同的執行緒如果在一起有共同的東西要處理,這些常見的同作問題就會出現,使得程式得寫得更小心 非阻塞式事件驅動 為了解決上面提到多行程和多執行緒等所帶來的問題,有一種做法是只有單一主要的迴圈來檢查有無網路IO的事件發生,再來決定要怎樣處理,這樣的好處在於省掉了context-switch、process copy等等成本,也不會有dead lock、race condition等問題,但缺點在於程式的部份會變複雜,因為當你一件事件被觸發,有事情還沒做完,你就得記下目前狀態,再下次事件觸發時再依先前的狀態來決定接下來要做什麼,不像上面是線性的程式執行那樣直觀,Twisted就是這樣的網路框架 非阻塞式Coroutine 那你或許會想,有沒有可能我們能有事件驅動的好處,和阻塞式那樣的直觀好處呢? 答案或許就是Coroutine,基本上它的本質也是事件驅動,只有單一的迴圈在檢查事件的發生,但是加上了coroutine的概念,而Gevent就是這樣的函式庫 Coroutine 講了這麼多次coroutine,我相信大部份的讀者可能還是不懂這到底是什麼鬼東西,對於大部份程式設計師而言這應該都算是較陌生的名字,對我而言,在一開始這也是個令人困惑的名詞,但事實上只要理解以後就會發現coroutine不是這麼的難懂,用簡單的一句話來說Coroutine,就是可以暫時中斷,之後再繼續執行的程序,我們來看一個例子,事實上Python就有最基礎的Coroutine,也就是generator # -*- coding: utf8 -*- def foo(): for i in range(10): # 丟資料並且把主控權交給呼叫者 yield i print … Continue reading
Simple tool for rotating nginx log file
#!/bin/env python """Simple tool for rotating nginx log file @author: Victor Lin (bornstub@gmail.com) blog: http://blog.ez2learn.com """ import os import shutil import optparse import datetime import logging import subprocess log = logging.getLogger(__name__) def main(): parser = optparse.OptionParser() parser.add_option(’-p’, … Continue reading
A simple workaround for installation problem of PIL under virtualenv
I encountered a problem when I am installing PIL under a virtualenv. I installed it with easy_install, the output said it was installed, but however, I can’t import it under the virtual environment. I got an ImportError when I tried … Continue reading
Posted in English Articles, Python
Tagged easy_install, ImportError, installation, PIL, Python, virtual-environment, virtualenv, workaround
Leave a comment
PO檔自動繁簡轉換程式
最近在更新我的網站Now.in,最麻煩的一項工作就是國際化,通常我都是先以英文寫網頁,接著用TurboGears2的i18n功能將字串訊息取出,而我的GUI程式的i18n流程也差不多,都是先寫英文,翻成繁體中文,其中一個最腦人的過程,就是把翻好的繁體中文po檔裡的字串剪下貼上到google翻譯將它變成簡體中文再貼到簡體中文的po檔裡,這些工作都是重覆性極高的機械性動作,在一開始句子還少時做還可以,當字詞越來越多,這就變成一件痛苦的工作,既然是高重覆性的工作,為什麼需要人力來做呢? 於是我就寫了一個小程式,可以自動把po檔的內容抓出來丟到google翻譯去,把結果寫到另一個po檔中 # -*- coding: utf8 -*- "‘ Created on 2010/4/27 @author: Victor-mortal "‘ import os import sys import urllib import json import logging import optparse import codecs import htmllib log = logging.getLogger(__name__) def unescape(s): p … Continue reading