Monthly Archives: April 2010

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 = htmllib.HTMLParser(None) p.save_bgn() p.feed(s) … Continue reading

Posted in Python, 中文文章, 分享 | Tagged , , , , , , | 4 Comments

一些有用的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

Posted in Python, 中文文章 | Tagged , , , | 10 Comments

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

Posted in English Articles, Python, 分享 | Tagged , , , | 1 Comment

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, len(self.waitingRequests)) … Continue reading

Posted in Python, 中文文章 | Tagged , , , , , , | 8 Comments

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怎麼玩,還好當時覺得他底層東西實在太多,不然可能到現在我還在研究 囧

Posted in Python, 中文文章 | Tagged , , , | 7 Comments