關於作者
我是Victor Lin,Now.in的創辦人,興趣是程式設計,Python目前是我最喜歡的語言,從國一開始寫程式到現在已經有十個年頭,不過還有很多要學習,除此之外偶爾用小提琴製造一些噪音也是我的興趣之一
E-Mail: 
Tag Archives: Python
一些有用的Python函式庫列表
Python有豐富的第三方函式庫或是工具,我一直想說要整理一篇列表,今天找了一點時間整理了一下我所知道的或是用過的 視窗GUI開發 wxPython 跨平臺的GUI開發函式庫,由wxWidget移植而來,特點是原生介面 PyQT 同樣也是著名的跨平臺GUI函式庫,由QT移植而來,可惜的是它是在於GPL條款下,商業用途需要另外買授權 PySide 因為PyQT為GPL授權,所以有人另外出來搞了另一套QT的移植,它是在LGPL條款下,因此商業軟體也適合 PyGTK GTK的Python移植版 遊戲開發 pygame 一款簡單的2D遊戲開發函式庫,主要是基於SDL Python-Ogre 著名Open source 3D遊戲引擎Ogre的Python移植版本 pyglet 一款跨平台的多媒體函式庫 PyOpenGL OpenGL的python移植 Python-Hge 我寫的HGE 2d遊戲引擎的Python移植版,大致上還算可用狀態,有些部份還沒移植完全 網頁開發 Flask 基於Werkzeug,以輕量為主要特色的網頁框架,簡單易用,沒有太大負擔,讓人喜愛的一款容易上手的網頁框架 Werkzeug 不算是網頁框架,它提供了開發WSGI常會用到的功能,不喜歡什麼都已經準備好的網頁框架,又不想重頭寫起可以試試看 Pyramid 這是結合了Pylons和BFG之後的新一代網頁框架,有完備的文件和號稱100%測試覆蓋率著稱 TurboGears 集大成的網頁開發框架,它是組合各種合適現成的組件而成的網頁框架,因此藕合度較鬆散,可以抽換掉某些組件,第一版用的組件主要為Cherrypy為網頁伺服器、Kid為預設樣版引擎、SQLObject為ORM,而第二版架構在另一套輕量框架Pylons上,ORM改為SQLAlchemy,預設樣版改為Genshi,並且符合WSGI的規範 Django 知名的Python網頁開發框架,不同於TurboGears的集大成,它的框架是自成一體的,所有組件從樣版到ORM都是獨力完成的 Web2py 一窾很有趣的網頁框架,它的框架本身就包含了整個完整的開發環境,所有開發都是在它的網頁程式上完成的 Webpy 跟Web2py很容易搞混,但其實是另一窾不同的網頁框架 BFG … Continue reading
Memory efficient Python with bytearray
The story I was developing an audio broadcasting server. I wrote the server with Twisted. It works fine, but there is still a big problem to solve: the memory usage. My audio broadcasting server use memory so much. You can … Continue reading
Ajax/Comet實作聊天室心得
今天為now.in做了一個最陽春版本的聊天室 這聊天室用了AJAX/Comet技術,說穿了AJAX/Comet真的沒什麼,其實不過就一個http request在server端在接受到後,直到有事件發生才回傳,也有另一種做法是利用比較特別的header讓browser對於每次收到的資料分批處理,而這些都在一個response中完成,因為似乎後者還得有browser的支援,所以我用的是前者,而雖然概念上很簡單,但實際做起來會有些細節得注意的 前端不可以有proxy 原本我寫好後放上去結果不能跑,發現原因出在於透過WebFaction前端的Apache再rewrite到我的server,似乎在前端的連線數很快就被擠暴了,因為線上會有數百個連線一直在線上,所以如果前端有proxy,很容易就會被塞暴,後來改用直接連線,問題就解決了 一般的伺服器架構其實根本不適合Ajax/Comet 事實上一般常見的伺服器架構大多都不適合寫Ajax/Comet,為什麼呢? 原因很簡單,大多的伺服器架構都是thread pool之類的做法,一個連線進來,就從thread pool中拿一個worker丟給他去做,在完成之前都屬於在處理的階段,因此你有同時100個連線被Ajax/Comet卡住,就佔掉了thread pool中100個worker,這些worker什麼都不能做,通常只能sleep,定期檢查事件發生了沒,除了伺服器很快就會被塞暴以外,一點效率都沒有,像是Apache就是這類的架構 解決的方案: 非同步的IO 解決方案其實很簡單,就是改用非同步IO的網路框架,我個人最熟的就是Twisted,自然就是選擇這個,身為愛好Python的程式設計師,其實很多時候苦腦的不是沒有選擇,而是選擇太多,Python的非同步網路函式庫不是用一打就能數完的,多到誇張的一個地步,而且一直在增加,不久前又多出了一個Tornado,這也只是冰山一角,有人寫了一篇文章專門是在比較Python非同步網路函式庫的 Asynchronous Servers in Python 當然,這文章裡列出的也只是一部份而已 Twisted的Ajax/Comet做法 class Chatroom(resource.Resource): isLeaf = True def wait(self, request): """Wait for notifications """ self.waitingRequests.append(request) log.debug(’[%s] %d users are waiting’, self.name, … Continue reading
Python套件依賴關係圖工具: Gluttony
前一陣子在裝TurboGears2時遇到某個套件因為依賴的某個套件不支援Python2.6,無法使用easy_install成功安裝,必需先手動安裝那個套件再安裝TurboGears2,我當時覺得很討厭,就開始思考,當一個專案的依賴套件越來越多時,只要其中有一個套件不能用,整個系統可能就會因此無法使用,特別是在越底層的套件出問題,所造成的影響可能就會越大,我開始想說,如果我們能夠把這些套件之間的依賴關係圖用一個工具畫出來,那就可以瞭解它的依賴情況,如此一來在決定是否要使用或是找問題時會較容易,也可以研究依賴關係對於大型專案會造成的影響,於是就花了一點時間寫了一個工具,是基於pip上面的,它叫做Gluttony,如果有看過鋼之鍊金術士大概就知道那是什麼東西,七原罪之一的暴食,因為我看那工具在爬依賴套件時就像在瘋狂吃東西似的,於是就想到這名字,而且這個名字在pypi裡沒有人用,於是就選了這個名字 工具的用法和下載、安裝等等,都可以在Google code的頁面找到,在此就不贅述 Google code: Glottony 一些專案的依賴關係圖 當我完成這些工具之後,最開心的事就是去找一些專案來跑跑看,看到底會出現什麼結果 TurboGears1.1 像這樣的依賴關系其實算還好,簡單明瞭,而且也很有結構 TurboGears2 我們可以發現在TurboGears2的依賴關係又更複雜了一些,因為它是架構在Pylons上,所以大部份依賴都在Pylons上,而devtools是用於開發用的工具,事實上有一些細節上的依賴關係會在setup專案時才會被裝進來,因為TurboGears2講求的是彈性,像是Template language就可以支援好幾種,也可以自行將那部份換掉,所以圖上可能看不到,整體上來看,這樣的依賴關係算是還蠻健康的,層次分明,接著我們就來看一個病態一點的例子 Plone 點圖片下載全尺吋圖檔 你一定在想這沱黑黑的到底是什麼東西,別懷疑,這個是Plone的套件依賴關系圖,全圖檔案大小是19.3MB,原本圖檔還太大,Graphiz還render不出來,我是縮小了一點尺吋才畫出來的,看了我真的覺得這實在是太誇張了,Plone到底是怎樣開發出來的,我很慶幸當時把ez2learn.com從Plone移到其它CMS,我原本還打算學Plone怎麼玩,還好當時覺得他底層東西實在太多,不然可能到現在我還在研究 囧
讓Python程式出錯時自動寄信給你
我喜歡Python的原因之一就是它的標準函式庫把該有的東西幾乎都包進去了,像是ConfigParser用來讀取設定檔,而logging更是不可缺少的,用來記錄程式的訊息非常好用的函式庫,而且這些函式庫不是只是陽春的玩具,而是功能齊全的基礎,其中logging一個很棒的功能就是將錯誤訊息寄給你,因為通常錯誤發生雖然都可以寫到記錄檔中,但是你有多少時間會去翻記錄檔? 通常程式出錯了,你也不會有認何知覺,將錯誤訊息寄給你的好處就是,一有錯誤你就立刻可以知道,而且少見的錯誤也不會被漏掉,例如有人試圖攻擊你的伺服器,在這過程中如果伺服器發生錯誤會寄信給你,在他成功之前你可能就有機會發現,總之將錯誤訊息寄給自己是很有用的技巧 一個錯誤報告的例子 最棒的就是,要用此功能非常簡單,以下是一個簡單的範例: # -*- coding: utf8 -*- import logging import logging.handlers rootLogger = logging.getLogger(") rootLogger.setLevel(logging.ERROR) handler = logging.handlers.SMTPHandler( mailhost=’smtp.example.com’, fromaddr=’marines@starcraft2.com’, toaddrs=’player@starcraft2.com’, subject="Houston, We’ve Got a Problem", credentials=(’username’, ‘password’) ) rootLogger.addHandler(handler) log = logging.getLogger(__name__) log.fatal(’HELP! We are … Continue reading
化整為零的次世代網頁開發標準: WSGI
介紹Python網頁開發的標準: WSGI Continue reading
如何評估比較程式語言
有人提到以過去的觀點來看現在的PHP是不公平的,確實我有好一陣子沒有碰PHP,對於新版的PHP並不瞭解,因此我花了一些時間檢視新的PHP規格,的確新版的PHP遠比我預料的進步許多,很多之前提到的問題有所改善,我承認上一篇文章說PHP很爛是在發洩過去對於PHP的種種不滿,有人認為程式語言沒有好壞,全部都事在人為,而我認為程式語言的好壞有主觀也有客觀的部份,當你討厭或喜歡一個程式語言一定有某些原因,但就客觀的來看語言的設計來講,PHP在早期真的是爛得一榻糊塗,是公認的爛,但是在當時少有選擇,能選的工具不多,就只有PHP,在累積夠久的不滿後就會一次暴發開來,對於現在的PHP5.3還有未來的PHP6而言,他已經跳離了以前的單純語言設計上的爛,往更好的方向前進,我能說PHP的壞話少了很多,因為當語言層面的問題大部份都解決了,接著就是哲學和個人喜好的問題了,對與目前和新版的PHP的誤解在這邊說聲抱歉 所以這篇我想說的,怎樣看客觀地評估一款語言的好壞,還有主觀地評估好與壞,很多人說程式語言沒有好與壞,只有適合和不適合,基本上我不認同這樣的說法,如果說兩種差別很大用途不同的語言拿來一起比較就很奇怪,但是如果是性質接近的語言都符合你需求,就可以做好壞的比較,不然你要怎麼做選擇? 就如同我們買車子好了,你的目的是載貨,買的自然是卡車、貨車,但是如果是轎車呢? 就算是卡車也有選擇的,程式語言也一樣,目前大部份人所見到的程式語言,都是所謂的"通用目的"語言,也就是說這樣的語言沒有預設任何用途,基本上他可以拿來做任何用途,很多人因為不知道要從何比較起,所以都說程式語言沒有好壞之分,只有適合和不適合,如果有一堆工具都適合,既然沒有好壞之分,那你又該如何做出進一步的評估與選擇? 適不適合不就是透過比較而來的嗎? 不比較怎麼知道適不適合? 這不是自相矛盾嗎? 只靠喜好嗎? 閉著眼睛亂選? 大家都知道車子我們可以比較它的馬力、耗油、安全評等,但是大多數人不知道程式語言該比較些什麼,而我今天所要說的,就是程式語言該拿什麼來比較
以前的PHP有很多缺陷
有人在plurk上PO了一篇文章的連結,PHP 開發迷思 (三) – PHP 很糟糕?,因為我不認同那樣的看法,所以我回覆說php很爛,當你說一個語言很爛時,就要有心理準備有人準備要跟你戰了,果然有人不認同我的說法,當然任何人都可以不認同我所說的,而且好和爛是很主觀的,同時也是是相對的,但是我所說的是有根據的,說php爛不是我一個人的說法,而是已經被說到爛掉的說法,很多比我有經驗多的網頁程式設計師都異口同聲的說PHP很爛,為了解釋為什麼我認為PHP很爛(我在本文指的爛是指語言設計上的眾多嚴重缺陷),我寫了這篇文章 更新: 我承認這篇寫得有點偏激,也是以前的觀點,也是在發洩以前對PHP的不滿,我沒有寫較新的PHP,所以我收回PHP很爛,改成以前的PHP有很多缺陷,我想表達的是一款語言的很多缺陷,而且是在以前的缺陷,現在PHP確實有改進很多,所以我寫了一篇 如何評估比較程式語言 另外我想表達的一件事是,當有人說你用的程式語言有問題時,為什麼一定要這麼抓狂呢? 如果一個程式語言它的缺陷沒有人罵,大家都愛語言如命,那麼語言的開發者或團隊要如何知道這語言要改進什麼呢? PHP有很多缺陷是事實,然而說出來很多人可能就不高興,然而我選擇用較激烈的字眼是因為他改進實在太慢了,我們可以看到以前的Magic quote、unicode問題等等,至今都仍未解決,要php6才會解決,這些問題不是只有我覺得很糟,而是我發現很多人都跟我一樣覺得這太差了,我每次罵PHP都真的很希望他在下一個版本就把這些鳥問題解決掉,但以我之前的經驗它都讓我失望,所以我怨念很深,這篇文章寫起來也特別偏激,但我想表達的是,我說PHP爛某種程度是希望他變好,那你可能會問,我為什麼不說Python爛,然後哪裡爛,很簡單的原因是我太喜歡Python,當你很喜歡一個東西時你是看不見這東西的缺點,如果有人說Python爛,我覺得很好,我想知道他有哪些缺陷,是我沒看到的 除此之外,對於初學者來說,PHP的低門檻讓他成為吸引新手的蜜罐,而很多人都只知道PHP可以寫網頁,但是不知道其實所有程式語言都能寫網頁,我希望透過罵PHP也能讓更多人知道其實還有更多選擇,但其實這會讓人覺得反感,我在這背後目的是希望其它語言能夠有更多人使用,有競爭才有進步,而對於國內大部份人都只用PHP在刻網頁我也覺得很失望,我同時也希望讓大家知道其實網頁的技術現在已經很先進了,很少有人使用框架等次世代的網頁技術,所以有興趣也可以看一些較新的技術,而不是土法煉鋼
The best choice to grab data from websites: Python + Twisted + lxml
The best choice to grab data from websites: Python + Twisted + lxml Continue reading
Posted in English Articles, Python
Tagged Beautifulsoup, Crawer, Grab data from web, lxml, Python, Spider, twisted
31 Comments
An auto-retry recipe for Twisted.
I wrote a retry function that can warp all function return Deferred that might fail. That’s no need to modify any exists code of getPage to make it to retry automaticllay. Continue reading