Skip to main content

95 posts tagged with "python"

View All Tags

· 2 min read

在智慧型手機與平板領域,蘋果和所有的智慧型手機與平板供應商競爭,大部分的供應商只能依靠 Android 系統作為反擊的基礎。

在 IT 系統領域,亞馬遜正在跟所有的 IT 系統供應商競爭,而大部分的 IT 系統供應商能依靠的是 OpenStack。

OpenStack 專案的初衷是提供類似亞馬遜的 ECS (Elastic Computing Service) 和 S3 (Simple Storage Service) 開放源始碼實現,讓一般企業也能建置私有網路服務。

若企業本身或 IT 系統供應商規模夠大的話,使用 OpenStack 自建資料中心,就能享受到彈性雲端運算所帶來的好處。

改變世界的免費雲端軟體:OpenStack 幕後創造祕辛(上)(下)

重點:

1. OpenStack 開源以前叫 NASA Nebula 2. 後來由 Rackspace 和 NASA 合作開發 3. 以 Apache 授權發佈

關鍵人 Chris C. Kemp (NASA), Rick Clark, Jim Curry (Rackspace), Vivek Kundra(美國第一個資訊長),是他們讓這個專案成真並以開源發佈。

Swift 是 OpenStack 裡類似 S3 (Simple Storage Service) 的開放源始碼實現

1. DevStack 2. OneStack

· 3 min read

功用

使用 Virtualenv 可以讓你預先建立一個虛擬環境,在虛擬環境中開發 Python 程式,可以保持 Python path 乾淨,並減少因為機器上需要同時支援不同版本函式庫,造成各函式庫彼此之間相依性的困擾。

而且使用虛擬環境後,到時要將環境轉移到別台機器上,也減少很多設定上的問題。

安裝

$ easy_install virtualenv 設定環境

$ virtualenv --no-site-packages [dev_place] 即建立一個名為 [dev_place] 的資料夾(中括號裡的名稱自行填寫取代)。

切換到虛擬環境

進入 [dev_place] 目錄,輸入命令:

$ source bin/activate 若看到路徑提示前多了個([dev_place])符號,即表示已經進入了虛擬環境。

這時我們可以使用預設提供的 easy_install 工具安裝要使用的函式庫、或是安裝各種 Python 程式。

安裝的函式庫會被放到 [dev_place]/lib/Python[版本]/site-packages/ 目錄中,跟一般的 Python 函式庫配置方式相似。

離開虛擬環境

要離開虛擬環境,只需輸入命令:

$ deactivate 即可回到預設的命令行狀態。

其他操作

如果你的電腦上有裝多個 Python 版本,在下 virtualenv 命令時加上「--python=python[版本] 」當作參數,例如建立 2.6 版的虛擬環境命令為

$ virtualenv --no-site-packages [dev_place] --python=python2.6 也可以建立出不同版本的 Python 虛擬環境,讓你可以更容易地在多個 Python 版本間做測試。

其他使用方法可以輸入「virtualenv --help」參考印出的說明。

Python3

目前 virtualenv 官方還不支援 Python 3.x, 但是有開發中版本可用,可使用 Mercural 下載來安裝

hg clone https://bitbucket.org/brandon/virtualenv3

cd virtualenv3

python3 setup.py install

· 2 min read

白象禮物的交換派對,所謂的白象禮物,指的是家中不論新舊,只要是完好可用的東西,用禮物袋裝一裝或包裝精美後就可以帶去派對與人交換。當然一人限量一份禮物。

交換規則: 每個人抽一張號碼牌,依序選擇一份禮物。每樣禮物必須當場拆開,每樣禮物只能被轉手換人兩次。也就是說,輪到我時,我可以任選我前面的人已拆封的禮物 (假設這個禮物是第一次轉手換人); 但我後面的人也可以選擇我的禮物,而成為這份禮的最後擁有者,因為這次的轉手換人是限制的第二次。倘使你的禮物被選走了,你可以馬上再選一份未開封的禮物,或其他人已拆封的禮物. 聖誕節到了同事們要交換禮物。剛開始是想抽籤有點麻煩,於是用 Python 寫了個簡單的 Script 來滿足抽籤的需求:

import random order = ["alice", "betty", "cindy", "deby"] random.shuffle(order) order ['deby', 'cindy', 'alice', 'betty'] random.shuffle(order) order ['alice', 'cindy', 'deby', 'betty']這麼一來每次執行 random.shuffle (order) 都可以亂數得到一個順序囉。

不過一旦當活動牽扯到人的話,還是靠真的抽籤比較有趣阿!

· One min read

在做講解投影片時自然而然寫出

import package

public class ${Name} extends Activity{ ... public void onCreate(...){ ... setContentView(${layout}) } }

這樣的 python Template 表示法,抽象化有時確實有助於理解。

· 2 min read

Android Scripting Environment (ASE) is the scripting language (BeanShell, Python, Lua, Ruby) environment for Android Operating System.

This article is about how to compile python for ASE.

The following instructions are according to the discussion from ASE group.

Compile python for host To compile python for ASE, you need a Linux machine, then here goes:

Download proper python source distribution (according to the python version in ase/python/src) from http://www.python.org/

Extract the source and run the following command:

$ cd Python-2.6.2 $ ./configure $ make Then you have a clean python compiled for your PC (called host system).

Compile python for target Now we can go to compile python for your Android device (called target system).

Copy the python executable file and the pgen file into ase/python/src folder

$ cd ~ $ cp Python-2.6.2/python ase/python/src/hostpython $ cp Python-2.6.2/Parser/pgen ase/python/src/Parser/hostpgen Then we should prepare the compile tools.

First checkout the android source from http://source.android.com/ (name as mydroid), we'll use the cross compile gcc in it's "prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin" folder. Another tool is located in "ase/tools/agcc".

Edit .bashrc , add a line to include those compile tools:

export PATH=${PATH}:~/mydroid/prebuilt/linux -x86/toolchain/arm-eabi-4.2.1/bin:~/ase/tools/agcc Then start compile python for ASE.

$ cd ase/python $ ./build.py

Done!

· 2 min read

Android Scripting Environment (ASE) is the scripting language (BeanShell, Python, Lua, Ruby) environment for Android Operating System.

The following instructions are according to the discussion from ASE group.

Prerequisites **To compile ASE, you need a Linux machine, then here goes:

1. Get Android source (read http://source.android.com/download to fetch the source) and name the folder as 'mydroid'(or else you prefer). In the following instructions I assume all the folders are in user's home folder(~) .

2. Get Android SDK (download from http://developer.android.com/) and extract it as "android_sdk"(or else you prefer).

3. Get Android Scripting Environment source (hg clone from http://code.google.com/p/android-scripting/source/) as "ase"(or else you prefer).

4. Enter ase/tools folder and execute "fix_android_sdk.py" to patch the "android_sdk".

$ cd ase/tools $ python fix_android_sdk.py ~/mydroid ~/android_sdk Copying source from .....mydroid to .....android_sdk/platforms/android-[verison]/sources Adding android.os.Exec to android.jar Compiling android.os.Exec to.... Done!

In addition to modifying the SDK by adding android.os.Exec, the script will also copy the source files into the SDK so that they can be browsed in Eclipse.

Import Project into Eclipse

After executing the script, follow the instructions for developing in Eclipse in the Android developer guide to setup a workable Android development environment.

Change the project build path and specify the BeanShell path to (project path)/beanshell/bsh-[version].jar Compile it, done!

PS: Python and Lua are precompiled and already put in res/raw folder. You don't need to setup the cross compile environment unless you want to also compile Lua and Python yourself.

· 2 min read

這篇完整講解了 Python Unicode 的作法,

例如為什麼都已經是 Unicode 了還會有 encode, decode 的需求? 答案是因為電腦內部以二進制儲存 Unicode, 而一般網頁等程式能處理的是經過 "文字編碼" 後的 text code (utf-8, big5, gbk).

而為什麼常看到 UTF-8? 因為 UTF-8 這套文字編碼相容英文最常用的 ASCII 文字編碼,所以大多數英文程式不需要改寫就能沿用.

所以從網頁 / 程式存中文到資料庫 (電腦) 時要做 data.encode ('big5') 的動作來存到電腦中.

h = ' 哈囉 ' h '\xab\xa2\xc5o'

從電腦中取出的中文 data 要做 data.decode ('big5') 的動作,

print h 哈囉 h.decode ('big5') u'\u54c8\u56c9' print h.decode ('big5') 哈囉

那麼為什麼有時候用一些程式不需要自己處理這些事情呢? 那是因為這些程式的作者已經預幫你處理了 XD

不知道預設的編碼時,可以試試用 Universal Encoding Detector 來猜測所使用的編碼.

Update:

· One min read

Google 對他的應用服務引擎(App Engine)推廣不遺餘力, 除了在四月多發佈 Java 版的應用服務引擎之外, 前幾天竟然把官方網站上的文件全部翻譯成了中文!

學網頁開發再也不用自己架設伺服器(Server)、安裝網頁伺服器(Web Server)、伺服器語言、和資料庫(Database),有了 Google 應用服務引擎通通一次搞定。

對 Google 應用服務引擎有興趣的人可以連至Google 應用服務引擎官方網站 (中文)查看。

· One min read

Just got my Dev Phone 1 and tried to run Jythonroid on it.

The procedure is

1. download sourcecode

$ svn co -r 51 http://jythonroid.googlecode.com/svn/branches/Jythonroid

2. import project into eclipse

3. connect Dev Phone and computer with USB

4. setup eclipse debug setting to run jythonroid in real Dev Phone

Now I got jythonroid installed in Dev Phone. Here's how to play with jythonroid:

1. Install Terminal Emulator to use the shell

2. just follow the screenshot to say 'Hello Android!' :)

in java we import Toast widget with

import android.widget.Toast;In jython(roid), just type in interpreter:

from android.widget import ToastPython rocks!

· One min read

進行優化必須付出增加空間或計算時間之開銷的代價。 Python 開發人員發現,有些地方長期來看,進行簡單的實做會比「乍看之下更吸引人的額外優化」更好。簡言之,讓事物保持簡單,通常會有所收穫 -- 美麗程式:Python 的辭典

· 2 min read

What is jythonroid

Jythonroid is a project for porting jython on Android platform. Created by ClassFoo.

Jythonroid is for console-only at this time. It means oneday Android has console/terminal app in device, you could use jython on real android phone. (or please point me if there's an exist console/terminal app for Android)

Jythondroid was worked on m5-build but outdated when 1.0 SDK comes out. Now Jythonroid (branch) works on 1.0 SDK & Android Emulator again. Since there's no GUI yet, you could checked out the code, run the emulator(install in emulator), and use adb shell on PC to try jythonroid.

Project Url

http://jythonroid.googlecode.com

Howto

1. check out the source

use svn to check out the project source

$ svn co http://jythonroid.googlecode.com/svn/branches/Jythonroid jythonroid

2. import project

In Eclipse, select "File > Import > Existing Projects into Workspace" in tool bar to import jythonroid project into your workspace.

3. setup emulator and run

setup debug settings and press "Debug/Run" button to install jythonroid into Emulator.

4. Run with adb shell

WARN: Since jythonroid is in its early phase, at this time it could only be evaluated on dalvik vm/emulator.

open adb shell, enter data/app folder, and run jythonroid

$ adb shell

cd data/app

dalvikvm -classpath org.classfoo.apk org.python.util.jython

Here's the screenshot:

· 3 min read

之前提到過 Python 2.6 新採用了一套叫做 Sphinx 的 rst 文件生成系統來管理 Python 語言官方的文件資料,用 sphinx 所生成的文件網站除了頁面能自訂樣式,自訂文件導覽順序,甚至還有附有搜尋功能。

已經寫過一篇 試玩 Sphinx

而現在值得再提的是,Sphinx 專案已經獨立出來了,可以將 sphinx 應用在任何需要文件網站的情況裡。

1. 安裝

easy_install sphinx

2. 打開命令列,找個目錄,鍵入

sphinx-quickstart

照著互動提示輸入一些生成訊息後, sphinx 會在目錄中生成幾個簡單的檔案。

目錄中生成幾個簡單的檔案其內容為:

  • conf.py

conf.py 中的內容大部分是我們剛剛在互動提示中填入的資訊,在此都可以修改。

0.5 版之後支援中文介面 (我丟的 Patch),只要在 conf.py 中指定「language = 'zh_TW'」即可。

  • MAKEFILE

給 linux 或 mac 用的 make 檔。

  • index.rst

index.rst 等於是整個文件站台的主頁

  • .template

文件站台的樣板,要自訂樣板就修改這。

  • .static

靜態文件,如圖片等內容。

  • .build

建立 (編譯) 好的文件在此。

.template/.static/.build 這樣的檔案在 windows 下不易辨識,可以在互動提示中詢問 "Name prefix for templates and static dir [.]:" 時,將 '.' 改成 '_'。 那麼生成的資料夾就會變成 _template/_static/_build。

3. 建立文件

sphinx 會在目錄中生成 make 檔,輸入

make html

即能產生完整的 html 文件站台。

如此一來,整個完整的站台都能用 rst 格式來構成啦,實在便利。

沒有寫過 rst (結構化) 文件的人,也可以參考 reStructuredText Primer

PS: 順帶一提, Pylons 與 TurboGears2 都已經有 sphinx 支持了。 TurboGears2 的部份 (這個是我加進去的) 可以用原始碼 docs 目錄中的 get_tgdoc.py 從 docs.turbogears.org 自動下載 rst 格式文件,然後再用上面提到的 'make html' 轉成 html 文件檔。

· 3 min read

開發過 Google App Engine 網頁應用程式的 Python 開發者,可能都有種被縛手縛腳的感覺。因為現成 Python 的網頁框架在 Google App Engine 上,有些地方因為 Google App Engine 的限制而無法作用,因此用起來不是很順手。

GAEO (Google App Engine Oil) 是個專門作用在 Google App Engine 上的框架,免去 Google App Engine 一切得自己手動建造的麻煩。

安裝

使用

easy_install gaeo 命令就可以安裝好。

安裝完提供 gaeo 跟 gaeogen 兩個命令。

建立新專案

使用

gaeo <專案名稱> 來建立一個新專案,新專案中除了基本 Google App Engine 的設定檔案外,還複製了一個 gaeo 檔案夾,提供 gaeo 相關的函式庫。

建立後進入專案,啟動 Google App Engine 開發工具的 server 就可以看到運行的網站。

還可以改使用

gaeo --eclipse <專案名稱> 來順便建立 pydev+eclipse 開發環境用的專案資訊。

程式碼組織方式

GAEO 組織程式碼的方式一樣是網頁框架常見的 Controller/Model/Templates 組織方式。剛建立的資料夾主要內容如下:

main.py application/controllers/welcome.py application/template/welcome/index.html

main.py 中可以透過 initRoutes () 函式來修改 url 對應的類別 (class)。 template 中的 welcome 資料夾則是直接對應到 controllers 中的 welcome.py。

新增函式

要新增一個 url 處理函式,可以用

gaeogen controller blog view post 命令,會在 application/controllers 中建立 blog.py 檔案,裡面有一個 'blog' class,class 中包含 'view' 和 'post' 兩個 method。另外 application/template 中也會建立一個 blog 資料夾,裡面包含 view.html 和 post.html 兩個 Django template 檔案。

技術

技術上 gaeo 樣板使用 django template,而整個 routing 是採用「一頁樣板 (template) 對應一個方法 (method) 」的組織方式,可以用類似 route 的方式添加新方法。0.2 版除了提供 scaffold (鷹架) 之外,也提供 plugin 系統,整個很有 Ruby on Rail 的感覺。

照著官方文件說明做一遍,一個多小時內就可以上手開發 Google App Engine 上的網頁應用程式啦。

· One min read

看了 Creating your own code swarm 這篇文章,照著弄了一套程式碼群圖 (Code Swarm) ,真的很簡單有趣。

程式碼群圖是指從 svn, git, hg 上取得更新 log,由 CodeSwarm 程式分析,產生出以時間為單位的一張張截圖。

上圖是周蟒的程式碼群圖。

· 2 min read

Guido 在 Jaiku 上提到一篇「Learning Python」文章

裡面提到,Python 社群的最大問題就是注意力實在太分散了。相比用 PHP 或 Ruby 語言的人,問他們「對在哪方面使用該語言開發感興趣?」這問題,你幾乎都會聽到「Web 開發」。而在 Python 社群裡隨意抽五個人,問他們對在哪方面使用 Python 語言開發感興趣,則很可能會得到不同的五個答案。

所以在該文最後也提出了兩個問題:

1. 舉出 10 件所有人會想用 Python 語言寫而不用其他語言寫的事

2. 舉出 10 個所有人都會想問的關於 Python 語言的問題。

經過一些討論後,在此舉出「 10 件關於 Python 語言所有人都想問的問題」:

1. 為什麼 Python 既是動態語言又是強型別的語言? 2. 用哪個 IDE 寫 Python 比較好? 3. 有什麼關於 Python 語言的好書? 4. 學 python 語言能找到工作嗎? 5. 為什麼用縮排而不是用括弧或「End」來分段? 6. 用哪種 GUI 好? 7. 為什麼 Python 比 xxx 語言慢? 8. 如何開始學習 Python 語言?有什麼好建議嗎? 9. 有什麼小巧的 Python source 或專案項目可以參考練手? 10. 怎麼在 Windows 上直接跑 Python 程式 (不先安裝 Python)?

8/12/2008 更新: Guido 採用了這 10 個問題,並在 python wiki 上開了專頁

· 3 min read

你 / 妳是否是去死去死團的一員?在這個充滿閃光與柴可夫斯基 1812 序曲的節日,有種暫時失明的感覺?

為了對抗這個節日,我們就來自製閃光卡吧!

這個閃光卡製作的方法,就是寫個單詞記憶程式,並把這個單詞記憶程式命名為 閃光卡 (FlashCard) (* 註) XD

寫一個簡單的記憶程式不用花太多時間:我們只需要一個詞庫,與一個用作檢視與複習詞條的介面。

> #!/usr/bin/python
> # -*- coding: utf-8 -*-
>
> deck = [("a","apple"),
> ("b", "boy"),
> ("c", "cat"),
> ("d","dog")] #詞庫,包含4筆詞條
>
> import random
>
> help = "commands: Fail/Lucky/Quit" #支援的命令
>
> while True:
> card = random.choice(deck) # 從詞庫裡挑一個詞條,如 ('d', 'dog')
> which = random.choice(card) # 從詞條裡挑一個詞,如 ('d', 'dog') 中挑 'd' 或 'dog'
>
> print which #顯示詞
> print card[0], card[1] #印出完整答案
>
> action = raw_input("> ").lower() #輸入命令
> if action == "q": #按其他鍵繼續,按q就跳出迴圈
> break
> if "f" in action or "l" in action: #忘記時的處理策略
> print "...recorded."
> deck.append(card) #多加本詞條入詞庫中,以提升被選中的頻率
> if "h" in action:
> print help #印出說明
>

進一步修改參考:

  • 若要用作英文學習的話,不只前項 (英文)、後項 (中文解釋),也許還要一欄音標。

  • 詞庫應該要可以抽換

  • 詞庫應該要可以合併使用 (應該支援多詞庫)

  • 要用更有效的學習模式,如sm2

  • 應該可以用圖片代替文字,以做到支援「音標」等效果。參考資料

  • flashcard

  • Simple flashcard program in Python

* 註:英文中, flashcard 就是單詞記憶卡的意思。

· 3 min read

繼上一篇裡我們製作好閃光卡後,這裡再附送一個補充包: 平假名 / 片假名詞彙庫,讓閃光卡真正能運用於日常生活中 XD

> Hiragana = [("あ","a"), ("い", "i"), ("う", "u"), ("え","e"), ("お", "o"),
> ("か", "ka"), ("き", "ki"), ("く", "ku"), ("け", "ke"), ("こ", "ko"),
> ("さ", "sa"), ("し", "shi"), ("す", "shu"), ("せ", "se"), ("そ", "so"),
> ("た", "ta"), ("ち", "chi"), ("つ", "tsu"), ("て", "te"), ("と", "to"),
> ("な", "na"), ("に", "ni"), ("ぬ", "nu"), ("ね", "ne"), ("の", "no"),
> ("は", "ha"), ("ひ", "hi"), ("ふ", "hu"), ("へ", "he"), ("ほ", "ho"),
> ("ま", "ma"), ("み", "mi"), ("む", "mu"), ("め", "me"), ("も", "mo"),
> ("や", "ya"), ("ゆ", "yu"), ("よ", "yo"),
> ("ら", "ra"), ("り", "ri"), ("る", "ru"), ("れ", "re"), ("ろ", "ro"),
> ("わ", "wa"), ("ゐ", "wi"), ("ゑ", "we"), ("を", "wo"),
> ("が", "ga"), ("ぎ", "gi"), ("ぐ", "gu"), ("げ", "ge"), ("ご", "go"),
> ("ざ", "za"), ("じ", "ji"), ("ず", "zu"), ("ぜ", "ze"), ("ぞ", "zo"),
> ("だ", "da"), ("ぢ", "(ji)"), ("づ", "(zu)"), ("で", "de"), ("ど", "do"),
> ("ば", "ba"), ("び", "bi"), ("ぶ", "bu"), ("べ", "be"), ("ぼ", "bo"),
> ("ぱ", "pa"), ("ぴ", "pi"), ("ぷ", "pu"), ("ぺ", "pe"), ("ぽ", "po")
> ] #平假名詞庫
>
> Katakana = [("ア", "a"), ("イ", "i"), ("ウ", "u"), ("エ","e"), ("オ", "o"),
> ("カ", "ka"), ("キ", "ki"), ("ク", "ku"), ("ケ", "ke"), ("コ", "ko"),
> ("サ", "sa"), ("シ", "shi"), ("ス", "shu"), ("セ", "se"), ("ソ", "so"),
> ("タ", "ta"), ("チ", "chi"), ("ツ", "tsu"), ("テ", "te"), ("ト", "to"),
> ("ナ", "na"), ("ニ", "ni"), ("ヌ", "nu"), ("ネ", "ne"), ("ノ", "no"),
> ("ハ", "ha"), ("ヒ", "hi"), ("フ", "hu"), ("ヘ ", "he"), ("ホ", "ho"),
> ("マ", "ma"), ("ミ", "mi"), ("ム", "mu"), ("メ", "me"), ("モ", "mo"),
> ("ヤ", "ya"), ("ユ", "yu"), ("ヨ", "yo"),
> ("ラ", "ra"), ("リ", "ri"), ("ル", "ru"), ("レ", "re"), ("ロ", "ro"),
> ("ワ", "wa"), ("ヰ", "wi"), ("ヱ", "we"), ("ヲ", "wo"),
> ("ン", "n"),
> ("ガ", "ga"), ("ギ", "gi"), ("グ", "gu"), ("ゲ", "ge"), ("ゴ", "go"),
> ("ザ", "za"), ("ジ", "ji"), ("ズ", "zu"), ("ゼ", "ze"), ("ゾ", "zo"),
> ("ダ", "da"), ("ヂ", "(ji)"), ("ヅ", "(zu)"), ("デ", "de"), ("ド", "do"),
> ("バ", "ba"), ("ビ", "bi"), ("ブ", "bu"), ("ベ", "be"), ("ボ", "bo"),
> ("パ", "pa"), ("ピ", "pi"), ("プ", "pu"), ("ペ", "pe"), ("ポ", "po")
> ] #片假名詞庫
>
> deck = Hiragana

使用時,依照需求將 deck 改成等於 "Hiragana"、"Katakana",或 "Hiragana+Katakana" 即可。

· One min read

scapy 是個相當好用的封包產生工具, 只是因為有幾個用到的函式庫需要手動尋找並安裝,還蠻不方便的. Windows 下使用的限制更多.

scapy 雖然只有一個檔案卻可以產生各種 Layer 2 以上的封包. 封包中有用到時會自行填入 mac, ip, checksum 等訊息,實在太省事了. scapy 允許自訂封包欄位來設計自己的協定,或改變封包的內容. 裝上一些圖形處理函式庫後還可以輸出 protocol 欄位圖形等等.

在此列出需求函式庫的連結. (Mac 環境下需安裝)

pcap http://code.google.com/p/pypcap/ libdnet http://sourceforge.net/projects/libdnet/

gnuplot http://sourceforge.net/projects/gnuplot/ gnuplot-py http://sourceforge.net/projects/gnuplot-py/ pyx http://sourceforge.net/projects/pyx/

· 5 min read

TextRPG 是我最近找到的一個好玩 python 模組,由德國人開發。 作用就是用來寫一個純文字的冒險遊戲。 目前的版本已包含了 RPG 中常見的對話、戰鬥等元素,整個遊戲可以完全由一個 python 腳本來構成。

因為實在太簡單了,所以來個五分鐘上手文好了:)

1. 安裝軟體

安裝好 Python 與 easy_install 模組後,接著安裝周蟒與 TextRPG

$ easy_install zhpy $ easy_install textrpg

如此安裝好後就可以開始寫 RPG 了。

2. 準備環境

新建一個檔案夾,首先,用文字編輯器新增一個 rpg.ini 檔案,裡面內容如下:

[charactor] 角色 = Char 樣板 = template 名字 = name 姓名 = name 說 = say 詢問 = ask 動作 = act 行動 = act 比較技能 = compete_skill 取得經驗值 = get_exp 生命力 = bTP 生命值 ==TP 攻擊力 = attack 武器 = weapon 防具 = armor 傷害 = wounds 活著 = active [story] 故事 = story 儲存 = save 給予經驗值 = give_exp 戰鬥 = battle 對話 = diag 將這個檔案儲存起來。接著開啟適當的 python 程式編輯器新建一個任意檔名的檔案 (範例裡將檔案取名為 HelloRPG.twpy)

在檔案開頭加入三行敘述:

#!/usr/bin/env python

encoding: utf-8

from rpg_lib.textrpg import * 好了,我們環境已經準備好了。

3. 撰寫故事

因為用 TextRPG 寫故事太容易了,這就編一個大雄大戰小叮噹的故事:

#!/usr/bin/env python

encoding: utf-8

from rpg_lib.textrpg import *

大雄 = 角色 () 大雄。名字 ="大雄"

小叮噹 = 角色 () 小叮噹。名字 ="小叮噹"

故事 ("""大雄哭著跑進房間""")

大雄。說 ("""嗚嗚~~小叮噹,技安跟阿福欺負我""") 小叮噹。說 ("""口胡,大雄我受夠你了,來戰吧!""")

大雄。攻擊力 = 3 小叮噹。攻擊力 = 90

大雄。動作 ("""大驚失色,狼狽逃竄""") 大雄。說 ("""小叮噹,你發什麼瘋!""")

勝利 = 小叮噹。戰鬥 (大雄) 如果 勝利: __故事 ("""小叮噹打敗了大雄,從此過上清靜的日子""") 否則: __大雄。動作 ("從如廢墟般的房間中爬起") __大雄。說 ("""呼呼,我還是贏了""") __故事 ("""大雄打敗了小叮噹,從此作者掰不下去封筆了。""")

註:上面程式範例中的 "____" 代表 4 個空格。用空格來表示程式邏輯區塊是 python 的語法。

好了,我們寫好了故事,接著就是將這個檔案儲存起來。 檔案儲存好之後,我們打開 command line 程式,開始執行這個遊戲:

$ zhpy HelloRPG.twpy 大雄哭著跑進房間 大雄:嗚嗚~~小叮噹,技安跟阿福欺負我 小叮噹:口胡,大雄我受夠你了,來戰吧! 大雄 大驚失色,狼狽逃竄 大雄:小叮噹,你發什麼瘋!

---battle-stats for 小叮噹 --- .... ---/battle-stats---

大雄 comes closer. 小叮噹: Do you want to attack 大雄?(Yes, no) Yes You attack 大雄. 小叮噹: How do you want to fight? (Usual, defensive, target head) Usual

You won this round. 大雄 took 80 points of damage and a critical wound.

小叮噹打敗了大雄,從此過上清靜的日子

· One min read

Sphinx 是 Python 2.6 新採用的 rst 文件生成系統.

要開始玩首先得下載 Python 原始碼

svn co http://svn.python.org/projects/doctools/trunk/ python

下載完後進入 Doc 目錄,輸入

make html

則會自動下載 sphinx 與相關程式,然後自動編譯 rst 檔案.

如果輸入

make web

的話則是產生一個可執行的線上網頁文件程式。此網站程式甚至還支援搜尋,真是強悍到有點扯 @@

Update:

Sphinx 產生的首頁原來是從 template 中 render 的。看來拿到其他地方重用的彈性並沒想像中的高. 一般使用 rst 時還是繼續用自己寫的 mopowg 吧.

· 2 min read

試譯:

TIOBE 機構宣佈了 Python 程式語言成為 2007 年度程式語言。 今年的競爭相當激烈,但是最終 Python 語言以最高的年成長率 (2.04%) 拔得頭籌。 尚沒有明確原因能解釋為何 Python 語言在 2007 年能獲得那麼大的成長。

從有紀錄以來,上個月 Python 語言的普及度首次超越了 Perl 語言。 這是 Python 語言已成為在系統層級上主流黏合語言的指標。 系統管理者與版本管理者特別地喜愛 Python 語言。

Python 語言也很有可能因為即將發佈的 Python 3, 而進一步在 2008 年獲得更高的普及率。

原文 http://www.tiobe.com/tpci.htm

Python has been declared as programming language of 2007. It was a close finish, but in the end Python appeared to have the largest increase in ratings in one year time (2.04%). There is no clear reason why Python made this huge jump in 2007. Last month Python surpassed Perl for the first time in history, which is an indication that Python has become the "de facto" glue language at system level. It is especially beloved by system administrators and build managers. Chances are high that Python's star will rise further in 2008, thanks to the upcoming release of Python 3.

延伸閱讀: TIOBE 語言流行度排行顯示混合編程時代到來

· 2 min read

最近看到一篇 Ruby 跟 Python 本質上不同

我也注意到一個現象:

偏向 c/c++/asp/php 的開發者對 Python 接受度較高,偏向 perl 的使用者則偏好 Ruby。 因為不管是 Python 還是 Ruby,要開發網頁都得寫 JavaScript,所以 JavaScript 沒有辨識度。

Python 像是先天武功密笈,不論資質,學了後一旦出招,都帶有 Pythonic 風格。 因為每個人寫起來的 Python 程式風格一致,更容易讓自己專注於內容。 而且學了 Pythonic 風格,自己使用其他語言寫作時也會想要盡量同樣簡明。

Python 社群的 Web 開發上也有更多的選擇,可以由禪入道 (TurboGears)、由佛入道 (Django),或從諸多現成的組件中挑選,自行花幾個鐘頭打造一個。

魔幻語言則是武林密笈,靠著投靠門派,依師父傳授某些密籍 (開發、命名方法) 來鍛鍊自己的風格。

例如 Javascript 就從早期混著寫的方式,到近期 AJAX 興起,鼓吹 JS 與 HTML 分離的風格。永遠得追逐著非關語言的變化,來調整自己出招的方式。

學的好的有了自己的風格,學的不好的如邯鄲學步。

接了別人開始的案子要維護時,要按自己的風格重改過呢,還是照著前人的風格呢? 或是,就這麼接受風格混亂的程式碼,到最後難以維護?

· 2 min read

Pagoda 是使用 TurboGears 框架撰寫的 CMS

http://www.pagodacms.org/

現在網站上僅有他們在 pycon 2007 上的 screencast

Pagoda provides a first-class plugin-based content management system
with a Web 2.0 management console that integrates instantly with existing TurboGears applications.

郵件列表中他們揭示了 Pagoda CMS 的一些特色:

  • 只需兩行程式碼就能整合進任何使用 turbogears 撰寫的應用程式
  • 專注於內容管理,而非取代整個網站
  • 使用 SQLAlchemy 和 genshi
  • 多語言內容版本 revisioned content in multiple languages
  • 友善的介面
  • 使用易於瞭解的詞彙與控制流程
  • 頁面可以有附件,也可以嵌套內容
  • 直接支持靜態內容 (如文件檔案), 亦提供 turbogears 新聞搜集,日曆,相簿,部落格等應用程式套件

預計在三月底以 MIT license 發佈.

...... 要是這些特色都能實現的話, 因為新聞搜集,相簿,部落格等都有現成的 TurboGears 應用程式,若能用這個軟體全掛在一起, 可以完全體現 TurboGears 應用程式開發的優勢. 在 Python 網頁框架的佔有率之爭中,可能會是個扮演 FF7 角色的殺手呀.

2007.12: 可惜等了 9 個月連 Preview 都沒放出來,真是 Orz. 感覺 Django 已經吃下大部分新進的 Python Web developer 了.

· 2 min read

I think I don't need the introduction, I create Python! -- Guido Van Rossum

Google 舉辦多年給大學生 / 研究生參與的「程式碼之夏」(Summer of Code) 活動後,上週又推出開放國高中生參與的「GHOP」(Google Highly Open Participation Contest,念成 G-HOP)活動。與「Summer of Code」活動一樣,Google 會從 Open Source 專案中挑選適當的專案,對其中專案有興趣的人可以申請參與。參與專案的方式很多樣,包含程式、教育、文件等方面。

第一年推出 10 個可參與的專案,其中三門 (MoinMoin、Plone、Python ) 與 Python 語言相關。

活動剛推出一週,負責 GHOP 的 PM 錄了一段 youtube,

在這段視頻中,除了可以看到一個胖阿姨攤在懶骨頭沙發上扭來扭去,也可以看到 Guido Van Rossum (Python 語言發明者),和在本文最前面 quote 起來的超猛自我介紹。

· 2 min read

竊以為周蟒中文程式語言的四不一沒有是:

一不:不強求完全的中文編程

過猶不及,絕大多數的程式語言是使用英文。周蟒中文程式語言的目標是協助使用者透過中文程式語言學習程式語言,進而接觸世界上大部份的程式語言,而不是脫離現實世界。

二不:不用中文數字或運算符號 (加,減,乘,除 +, - ,*, /...)

程式語言中使用到數字與運算符號,並不僅只於常用的整數或四則運算符號。

三不:不用文言文

程式語言是人與電腦溝通的語言,電腦只懂得平鋪直敘的邏輯。所以我們也不用掉書袋,直接用白話溝通。

四不:不用中文標點符號

由於周蟒是完全兼容 Python 程式語言的中文程式語言,而將中文的標點對應到英文標點的歧異不少,反而會造成寫作與辨識的困擾。統一使用英文標點並不影響閱讀,對以後學習其他英文程式語言也不致造成額外障礙。

一沒有:沒有大括號 {}

周蟒是 Python 程式語言加上中文支援的中文程式語言,而 Python 程式語言本身就是使用結構化的程式區塊來代替以大括號判定程式區塊的語言。也符合中文使用習慣。

· 3 min read

pycon 2007 裡的 presentation 提到測試金字塔,由下而上將測試歸為三類:

單元測試,功能測試,應用測試。

程式測試需要很多的單元測試,一些功能測試,少量的應用測試。

具有某個程度的單元測試可以保證代碼質量。

周蟒是我第一個包含完整測試的開源專案。然而周蟒也不是一開始就寫了測試用例.

我的經驗是 "先能跑,再求好"。在一開始先讓功能能跑,之後再想法改善或改寫。

周蟒改善或改寫的過程中,unittest, doctest (單元測試,功能測試), 與 example test (應用測試) 就是主要保證功能穩定的方式。

我覺得加入測試是我在開發周蟒過程中做出的最好決定。 當周蟒程式超過 15k 後, 已經進入難以將整份 code 短時間一次 Review 的階段。 這時我決定花時間為周蟒加入一部分測試用例。 我發現這麼作提昇了整個小程式的 ' 解析度 '-- nosetests 的報表告訴我:每個簡單的功能都運行。

當我在周蟒加入了某數量的測試用例後,周蟒的開發方式就有了質變。

由於可以提前由自動測試獲得功能結果,讓周蟒的開發方式變得更大膽, 我可以放心地大膽試驗各種新功能,並隨時能透過測試確認新功能對架構帶來的影響。 也得以在早期版本中即輕鬆地透過大規模的重構來增加架構的彈性。

用幾次就丟的程式 / 腳本當然沒加入測試的價值. 然而要維持一份可維護的程式,加入測試是很好的方式.

· 2 min read

最近 mozilla 宣佈要採用 水銀 (mercurial, hg) 當作他們未來的版本控制系統.

我試了一下發現 mercurial 有用 twist 提供內建的 web server, 想用版本控制時再也不用先搞定 apache 設定了,Python 真是好呀

水銀分散式版本控制系統的使用概念如下:

0. 開個檔案夾 ([origin]), 開始 coding. 1. 告訴自己這個檔案夾裡放的是版本庫 (hg init). 2. 將原始版本中的所有檔案放進版本庫 (hg commit *). 3. 怕接下來的修改把原始版本改糟了,所以另外複製一份來改 (hg clone [origin][dst]). 4. 在複製檔案夾上改一改,覺得弄完一小階段了,先大致查看一下修改了些甚麼 (hg status), 然後儲存修改 (hg commit). 5. 重複修改的過程. 5.x 哇!遇到錯誤了怎麼辦?沒關係,用 ' 快速鍵 ' 將修改復原 (hg revert [id]). 6. 改得滿意了,將修改的東西存回原始檔案夾 (hg push [origin]). 7. 整理一下原始檔案夾 (hg update), 確認修改沒衝突.

其他應用

  • 開個 分享讓其他人也可以用 (hg serve [-p port])
  • 看看修改歷程 (hg log)
  • 看看修改的內容 (hg diff)
  • 修改有衝突了,進去檔案看看,解決它 (hg merge)
  • 接受其他人的修改 (hg pull)

· One min read

genshi 的開發者說 genshi 的 markup 核心用 C 重寫後測效能時比原來快 10%~20%, 測試工具所測出來的效能已超越了 Django templates .

yesterday I merged the cspeedups branch into trunk, which adds a C implementation of the genshi.core.Markup class. This improves performance around 10-20% in the benchmarks (Genshi now outperforms Django templates in the bigtable.py benchmark).

· 11 min read

相信在做網頁開發時不少人被表單處理困擾著, cherrypy 的網頁表單處理已經很簡單了, 而 TurboGears 更為我們帶來了 widget (網頁元件) 這個概念. 透過 widget 能簡單地完成產生表單,欄位驗證,重用表單等等仔細思考起來相當複雜的動作.

TurboGears 開發者們宣稱 widget 多麼好用,但是 widget 的說明文件卻相當缺乏.

那麼 widget 到底是什麼東西哩?

widget 是什麼

widget 用中文表達簡而言之就是 "網頁元件", TurboGears widget 的功能就是讓使用者重用所有網頁元件.

那麼網頁元件是什麼?網頁元件就是網頁的構成元素.

古代希臘先哲柏拉圖認為風,火,水,土是構成世界的四大元素。所有的物質最終都可以拆解成這四個元素.

而在網頁的世界裡,HTML, 表單 (Form), CSS, Javascript 則是網頁的四大構成元素.(註) 多數的網頁都可以由這四個元素組合產生.

Widget 表單元件

Widget 表單屬於 Widget 的一個重要分支。由以下的基本網頁元件組成:

* 表單欄位元件 (Field) — 等同於 HTML 表單欄位的基本元素, 如文字欄位 [input type="text"] 文字區塊欄位 (textarea) 等等. 用來產生基本的表單欄位.
* 表單欄位列表元件 (WidgetList) - 用來有機地組合表單欄位元件, 產生欄位列表, 提供表單元件使用.
* 表單元件(Form) — 表單欄位, 驗證資訊, 處理方式(post 或 get), 處理函式 (URI) 的集合. 可使用現有的驗證功能 validators.Schema 來做表單驗證.

除了基本的表單欄位元件,TurboGears 也透過 widget 提供了一些進階的表單欄位元件例如跳頁選單 (表單 + Javascript), 語法高亮 (HTML+CSS+Javascript), 標籤頁 (HTML+Javascript) 等元件,這些高級元件 (Rich Element) 也都是由這些網頁中最常見的基本元素所組成.

透過 widget 你可以自己建造自己的網頁元件,也可以透過 python 的擴充機制,很容易使用 easy_install 命令取得其他人共享出來的各種元件.

在使用高級元件之前,我們回到基本面上,先來看看如何用 widget 處理表單.

用 widget 產生表單欄位

你可以在互動式直譯器 (interactive interpreter) 裡試驗 TurboGears widget.

產生 TextField

>>> # TextField
>>> from turbogears.widgets import *
>>> Field = TextField(label='Main Menu')
>>> Field.render()
'<input id="widget" class="textfield" name="widget" type="text">'

產生 TextArea

>>> # TextArea
>>> Field2 = TextArea(label="Description", attrs=dict(rows=3, cols=60))
>>> Field2 = TextArea(label="Description",
... attrs=dict(rows=3, cols=60))
...
>>> Field2.render()
'<textarea rows="3" cols="60" class="textarea" name="widget" id="widget"></textarea>'
>>>

在 Python 互動式直譯器裡你可以看到用 TurboGears widget 產生一個表單欄位並不困難.

用 widget 產生跳頁選單

我們再來看如何用 widget 產生跳頁選單

跳頁選單適用於諸如 "選擇使用的語言" 等等情況, 可以在使用者選擇後自動跳至對應的網頁.

首先,我們先看看如何產生一般的網頁選單

>>> # SingleSelect Field
>>> Field3 = SingleSelectField(label="Author",
... options=[(1, "fred"), (2, "Joe")])
...
>>> Field3.render()
'<select class="singleselectfield" name="widget" id="widget"> <option value="1">fred</option><option value="2">Joe</option></select>'
>>>

到現在為止,我們可以確認產生一般網頁選單的方式與前面生成簡單文字欄位的方式完全一致.

我們接著來看看如何產生跳頁選單.

>>> # JumpMenu
>>> from turbogears.widgets import *
>>> Form = JumpMenu('Main Menu',options = [
... ('/createNewBatch', 'Create New Batch'),])
...
>>> Form.render()
'<select class="jumpmenu" onchange="TG_jumpMenu(\'parent\',this,0)" id="Main Menu" name="Main Menu"> <option value="/createNewBatch">Create New Batch</option></select>'
>>>

恩,產生跳頁選單跟產生一般網頁選單的使用方式並無二致。也同樣是這麼容易.

跳頁選單無法在 Python 互動式直譯器中完全表現, 因為在實際使用時,跳頁選單元件除了會產生這段 HTML 表單外, 嵌入 turbogears 網頁樣板時網頁元件還會自動嵌入相應的 javascript.

等你熟悉了 Turbogears 之後, 透過 widget, 即使是很複雜的 javascript 元件 (如所見即所得網頁介面編輯器), 你也不必擔心要導入哪些 Javascript library 等瑣事,透過網頁元件的分享,你可以直接透過 easy_install 命令即裝即用別人寫好的網頁元件。然後把時間用在自己網站內容的開發上.

用 widget 產生表單

前面已經講完用 widget 產生表單 "欄位" 了。然而一個表單除了基本的各個欄位之外, 還包含了一些其他元素。例如如何組織欄位,指定上傳方式 (GET/POST), 指定處理動作 (action) 等等.

TurboGears 裡已包含了數種預設表單欄位的格式。而其中最常見的就是 TableForm 了.

用 widget 組織表單欄位

可以透過 WidgetsList 來組織表單欄位.

>>> class BookFields(WidgetsList):
... title = TextField(label="Title")
... description = TextArea(label="Description")
...
>>> BookFields()
[TextField(name='title', convert=True, field_class='textfield', attrs={}, css_classes=[]), TextArea(name='description', convert=True, rows=7, cols=50, attrs={}, css_classes=[], field_class='textarea')]

我們已經組織起了兩個文字欄位,通過最後一行可以發現 WidgetsList 其實只是協助我們產生了一個表單欄位元件的列表. 接下來我們就要把這個欄位列表放進表單裡.

>>> class BookForm(TableForm):
... #name="Book"
... fields = BookFields()
... #validator = BookSchema()
... #method="post"
... submit_text = "Create"
...
>>> BookForm()
BookForm(name='form', submit_text='Create', convert=True, table_attrs={}, form_attrs={}, action=None, disabled_fields=set([]), method='post')
>>> BookForm().render()
'.form method="post" class="tableform" name="form".
......略......
./form.

基本上這產生的就是相當完整的表單了....

等等!~~想必你要大聲質疑:我的 "action" 呢???換句話說,我怎麼指定處理這個表單的 url 呢?

widget 與樣板合作

恩,好問題。你可以直接在宣告時就將 action 的值傳給 widget, 也可以在樣板 render 時再傳入。一般我習慣習慣在表單最終產生時 (樣板 render 時) 再指明.

例如這樣

在 controllers.py 中加入

model_form = BookForm() # 事先宣告好在重用時不用多次呼叫

產生實際表單頁面

@expose("template.new")
def new(self, **kw):
return dict(form = model_form)

在 "new.kid" 樣板中加入這一行

${form(action='save')}

當然有了處理這個表單的 url , 也需要在 controllers.py 中加入一個處理 "save" 這個處理表單資料的 method

@expose()
def save(self, id=None, **kw):
....

前面講起來好像花了不少篇幅,但其實看完程式後你會發現使用 widget 程式邏輯變得出乎意料之外的清晰. http://docs.turbogears.org/1.0/CRUDTemplate

用 widget 驗證表單欄位

驗證表單欄位其實只要在 TableForm 中傳入 validator 參數即可

>>> class BookForm(TableForm):
... fields = BookFields()
... validator = BookSchema()
... submit_text = "Create"
...
>>> BookForm().render()
.....略....

你可以使用 formencode 模組所提供的 "Schema" 完成任何複雜的表單驗證程序. 從比較基本的輸入字數長短 / 類型驗證,到多欄位密碼確認等都可以簡單地達成. (Turbogears 將 formencode 的 Schema 包裝成 validators.Schema)

>>> from turbogears import validators
>>> class BookSchema(validators.Schema):
... title = validators.String(not_empty=True, max=30)
... description = validators.String()
...
>>> BookSchema()
<bookschema object="" 114="" chained_validators="[]" fields="{'description':" title="" pre_validators="[]">
>>>

上一節中我們在 controllers.py 裡定義了

model_form = BookForm()

現在我們在做表單驗證時也可以用的上.

用法是簡單地在 "save" 這個 method 上加上 @validate (model_form) 裝飾。表示要使用 model_form 表單元件所附的表單驗證元件.

而要順便將輸入錯誤的訊息產生在表單上的話,只要再加入 @error_handler (new) 裝飾, 表示如果有錯誤就跳轉到 new 這個 method (我們的表單頁) 處理.

@validate(model_form)
@error_handler(new)
@expose()
def save(self, id=None, **kw):
....

widget 還可以幹什麼

widget 可以讓你用最 Pythonic 的方式表現網頁表單,也可以簡化提供不同 AJAX 函式庫的支援.

你覺得網頁元件能幹什麼,Turbogears widget 就可以幫助你幹什麼.

怎麼知道有哪些 widget

Turbogears 的網頁工具箱 toolbox 中有網頁元件瀏覽器 (widget browser). 使用 $tg-admin toolbox 命令啟動網頁工具箱就會看到網頁元件瀏覽器. 在網頁元件瀏覽器中你可以找到所有內建與外掛的網頁元件.

外掛的網頁元件 (widget plugin) 可以在 cogbin (http://www.turbogears.org/cogbin/) 找到.

註:嚴格說來,"表單" 其實是屬於 HTML 的一部分. 所以也可以說網頁的三大基本組成元素是 HTML, CSS, Javascript.

TurboGears widget 實現表單的方式也是組合這三大基本組成元素.

然而因為表單的使用與其他 HTML 元素的使用有較大差別. 在說明時獨立出來更易於理解.

· One min read

以前已經有些人研究過 Python 原始碼.

python 源码剖析

python 源码分析

python 源码分析 中有列出 Python 語法分析的機制。回顧一下 cPython 的整個處理流程:

1. PyTokenizer 進行詞法分析,把源程序分解為 Token

2. PyParser 根據 Token 創建 CST

3. CST 被轉換為 AST

4. AST 被編譯為字節碼 ByteCode

5. 執行字節碼

這個流程是直譯器 Interpreter 的流程. 大體也可以套用在 pypy 的 Python 直譯器上.

PyPy - Goals and Architecture Overview (pypy 架構) 一文中講到 pypy 有兩大構成部份, 其一就是 Python Interpreter (直譯器), 其二則是 Translation Framework (轉譯器).

.... 寫好的被 Ctrl+Z 吃掉了.... 待補... Orz

· 3 min read

PyPy 1.0 剛發佈 PyPy 是:

1. 使用 Python 語言編寫的 Python 語言 (稱作 rpython). 2. 可以將 python 程式碼編譯成原生的 c, CLI (.net 2.0), javascript 或其他語言執行程式,提高執行速度. 3. 可以把 rpython 編譯成 javascript , 用來產生客戶端 javascript / 編寫 ajax 應用. 4. 可以將 rpython 程式碼流程展示成視圖. 5. 可以透過 JIT 產生自訂版本的編譯器.

為什麼說 pypy 是流氓哩?因為跟其他程式語言相比,它根本就是在作弊嘛!

  • 你說 c 語言寫的程式最快,pypy 可以將程式碼自動轉成 c 版程式。用 gcc 編譯後僅慢原生 c 執行檔 10~20%.
  • 你說 .Net 跨平台,pypy 可以將程式碼自動轉成 .Net 版程式。編譯後比 MS 官方提供的 .Net 平台 IronPython 快 100 倍.
  • 寫好的程式可以透過 pypy 自動幫你畫流程圖。最恐怖的是 pypy 是使用 Python 語言編寫的 Python 語言,可透過轉譯器編譯成各平台執行程式以取得超過 cpython 的效能. 各種語言轉譯器 (translator) 也可以用 rpython 本身撰寫。以後 rpython 語言開發者不用是 C 語言專家也可以參與改進 Python 語言,與其他語言相比加入各種實驗性新特性的難度簡單了好幾個數量級.

用 pypy 目前已經可以產生 JavaScript 程式碼,來支援 AJAX 開發. 以後想必也能產生 ActionScript 程式碼,支援 Flash/Flex/Appolo 開發吧?

我已經準備要屈服於 pypy 的惡勢力了 XD

· 3 min read

新聞來源: HP acquires Tabblo

Tabblo 是一個使用 Python 語言下的 Django 網站開發框架製作的圖片分享網站。特點是可以將上傳的圖片輕鬆製作成各種形式精美的套卡. HP 最近將這個以 9 人團隊組織的網站收購下來.

Python 語言繼 YouTube 的大成功後,在使用網站開發框架 (Django) 上也找到了另一個具說服力的範例。讓人打消 Python 語言不適合 Web 開發的疑慮.

話說回來,HP 這家公司難道也想玩 Web 2.0 嗎?不然為何要買這樣的 .com 公司?

當然,連友立 (Ulead, 出品 PhotoImpact 的公司) 都有線上圖片分享網站了,HP 這間印表機大廠也來一個有何不可?

依新聞來源內容來看,我做個猜測: HP 買 Tabblo 可能不只看在圖片分享網站上,更看中的應該是 Tabblo 的核心價值.

Tabblo 的核心價值是什麼?Tabblo 的核心價值是它所提供的獨家 "圖片轉精美的套卡" 服務. 而 Tabblo 是透過 PIL (合理猜測啦) 等圖片處理模組,才有辦法建立這樣的服務.

即使哪天 HP 印表機附的光碟裡提供類似 Tabblo 網站提供的圖片 -> 套卡功能, 我一點也不會意外.

使用 Python 語言開發網站一大優勢就是背後有很多現有執行在作業系統上的高效模組 (ex: PIL) 可以調用.

單就圖形處理方面,使用超有彈性又真正跨平台的 Python 語言開發這類原本只有單機才做得到的服務有許多的好處.

其中最重要的一點是:同樣的程式,可以套用在 Tabblo 網站上,也可以套用在各作業系統的單機版上.

· 3 min read

Functional Programming 中文一般被翻作 "函數式編程 (程式設計)". 看到這個名詞,我腦袋裡很自然就浮出 "def ..." 這樣的語句. 因此 "函數式編程" 一詞所想表達的程式設計概念一直讓我完全摸不著頭腦.

直到看了跨越边界:用 Haskell 研究函数性编程這篇文章,我才理解 "函數式編程" 其實就是 "以撰寫數學方程式的方式來編程 (程式設計)" 的程式設計方式.

看了內容很自然地發現其實 Python 語言裡可以找到 map, filter, lambda 等這些用起來比較怪異的函數都是在 Python 中可以拿來作函數式編程的基礎工具.

Python 程式裡有些時候會有用上這些語句的地方,雖然省了空間, 但是命令式 / OO 編程的習慣卻讓這些段程式較難理解.

為了更易於學習與理解,python3000 中會將其中一些函數式編程相關函數 (lambda) 從核心中去掉,但卻提供了更完整的函數式編程模組 functional 的支援。也許這是個更兩全其美的方式吧.

最近在準備 OSDC.tw 2007 要用的投影片,在整理的過程中也產生了不少想法. 今天看了 "跨越邊界" 系列之後. 更加感受到要好好理解並運用一種開發方法 (不管是函數式編程還是測試驅動編程), 果然還是應該從心法 (本質) 上著手呀.

參考資料:

· 2 min read

在看 pycon-trac-presentation 時, 發現 Matt Good 用 docutils 模組提供的 "rst2s5" 套件來將結構文本 (rst) 轉換成網頁投影片 (s5) 效果還蠻不錯的。用他客製化的 rst2s5 模組可以透過 pygments 支援程式的語法高亮展示.

以下提供使用方法

下載

$ easy_install docutils $ easy_install docutils pygments

並下載 rst2s5 with code high lighting

用法

rst2s5.py [輸入].rst [輸出].html

i.e. rst2s5.py xxx.rst ooo.html

會產生的輸出結果是 "ooo.html" 這個檔名的檔案, 跟一個包含 s5 投影片 js/css 資料的資料夾.

語法備忘

=======
標題
=======

:Author: Fred Lin
:Date: $Date: 2007-03-16 $

一張投影片
==========

.. code-block:: pycon

>>> # python console

.. class:: handout

handout 是放註解的地方. 不會 show 到投影片上
code-block 可用 pygments 提供的各種語法高亮, 如 pycon, python, bash, html...

投影片再一張
============

.. class:: incremental

* 1st. item
* 2nd. item

.. image:: python.png

.. class:: handout

依序顯示重點. image 會嵌入圖片.

.. include:: pylevels.rst

語法參考
========

http://docutils.sourceforge.net/docs/user/slide-shows.html

.. class:: handout

前一張後的 include 語句支援嵌套其他 rst 文件.

· 4 min read

框架介紹

Python 社群中各種 web 框架開發路線都有.

Django 目前 Django 框架吸引的使用者最多,一方面原因是 Django 團隊的性質,Django 有一個像 Rails 那樣的專職團隊在維護,保證了專案的持續性。同時不錯的指引文件,對初學者友善的 Admin 介面,開發者 Adrian 四處不遺餘力的宣傳也是吸引人的原因. 除了持續框架維護的承諾,宣傳之外,Django 框架傑出的效能也屢屢在網頁框架評比中勝出. python 創造者 Guido 也將 Django 視為 Python 語言的首選網頁框架.

Django 網頁框架的每個部份都是 Django 開發團隊自行建置. 但是在 Django 之外,python 社群其實早已有各式各樣的網頁開發工具. TurboGears 與 pylons 開發者則是致力於將這些開發有年的網頁開發工具 "黏起來", 發揮小兵團結的綜合效應.

TurboGears 例如使用 TurboGears 框架,就可免去各模組間合作時的重複設定。由於各個挑選的模組都經過多年實戰測試,除了滿足基本的開發需求外。也比較容易達成較深入或較特殊的需求.

構成 TurboGears 框架的組件,包含 Template, model, URL dispatcher, AJAX library 等等全部可以透過 setuptools 工具簡單安裝與替換。彈性 100%!

TurboGears 框架還提供命令列 (tg-admin) 和網頁工具箱 (Toolbox) 等可供擴展的輔助工具,從而獲得相當棒的開發體驗. (Toolbox 裡面也有類似 Django Admin 的 Catwalk 工具.)

整合 Django 與 TurboGears? 那麼這兩個都很棒的框架有沒有整合的可能呢?

Kevin Dangoor (TurboGears 框架創造者) 在 Pycon 2007 的 web panel 說:

You can have more innovation with individual components with their own maintainers than with a full stack. 比起完整的框架,將各個組件讓各自的維護者維護可以產生更多的創造性

TurboGears 框架的這種開發哲學與 Django 團隊走的路是完全相反的。加上 Django 團隊堅持在他們的網頁框架中不包含 AJAX 功能並不成問題 (我覺得問題是在其他 Django 用戶沒有什麼很容易的方法提供 Django AJAX 擴充包). 在這種理念完全不同的情況下是不可能整合的.

Pylons TurboGears 跟 Pylons 兩個框架走的路線更相近。一些擴充模組或樣板引擎早都可以共用了. pylons 差不多就是換掉 controller 核心的 TurboGears. Pylons 框架沒有 TG 的 toolbox 或 Django 的 Admin 介面,但支援 WSGI, web helpers (學習 Rails), 效能也不錯,卻還沒找到自己的最佳定位.

整合 TurboGears 與 Pylons?

那麼這兩個框架有沒有整合的可能呢?

it’s the style/feel thing that represents the difference between the two framework -- Kavin Dangoor

Kavin Dangoor Mark Ramn 兩位 TurboGears 框架的代表人物在 pycon 2007 後紛紛對 TurboGears 與 Pylons 的整合發表了樂觀的文章。原因是兩個框架的理念相近,差別主要在預設選擇的套件不同。還有實作上所造成的差異.

· 7 min read

楔子

自從聽說了敏捷方法 (Agile programming) 後,一直很想試試這種 "測試先行" 的開發方式. 但是在 python 上前後試過 unitest, doctest, 都不夠 "簡單到會想常常拿來用" 的程度,

今天拿了一份原型寫得差不多的程式,試著寫些測試例子 (test case) 後用 nose 測試工具來測試看看,想不到 nose 還蠻容易使用的.

三步驟使用 nose 開始測試

  1. 安裝或更新 nose

# easy_install -U nose

沒用過 easy_install ? 你該開始試著用了!

  1. 撰寫測試例子 (test case)

打開一個新的資料夾,我們統一在這個新資料夾裡寫主程式與測試例子

將要測試的內容寫入 something.py 這個檔案[註 1]:

> class Hello(object):
> def __init__(self):
> self.template = "hello world"
>
> def render(self):
> return self.template

nose 測試工具識別測試例子的條件,是判斷找到的這個類別或方法的名稱是不是以 "test" 或 "Test" 開頭。如果是的話就當成是測試例子. nose 會自動搜尋子目錄下所有符合的測試例子,並自動開始測試.

因此我們第一個範例程式用的測試例子只要是函式名稱用 'test' 開頭來命名就可以囉,我們命名一個檔案 testsomething.py (這個檔案名稱以 test 開頭與識別測試例子的條件並無關聯,只是慣例上放測試的例子的檔名都會加上 test 字樣), 並在裡面寫下:

testsomething.py:

>
> def test_Hello():
> abc = Hello()
> assert "hello" in abc.render()
>
> def test_foreign():
> abc = Hello()
> assert "bonjour" not in abc.render()

assert 是 nose 用來判斷測試結果的語法。主要有這兩種:

  • assert 片段 in "結果"

  • assert 片段 not in "結果" 對照上面範例,可以得知上面兩者的意思就是:

  • 測試結果 "hello" 字串應該在 abc.render () 回應的結果裡

  • 測試結果 "bonjour" 字串應該不會在 abc.render () 回應的結果裡如果上面任一種情況不符合 assert 敘述,這個測試用例就會回報失敗.

  1. 開始測試

切換到檔案在的檔案目錄下,輸入

# nosetests

結果應該類似這個樣子:

> D:\path\pyfile>nosetests
> ......
> ----------------------------------------------------------------------
> Ran 1 tests in 0.020s
>

OK 那麼如果我們改動了 something.py 中 self.template 變數的內容,在內容裡加上了 "bonjour" 字樣,會發生什麼事情呢?

有測試工具的好處就是我們只要單純地再次運行 nosetests 命令就好了,不用花腦力去判斷或思考:) 我們查看訊息時會看到類似以下的訊息:

> 2, in runTest
> self.testFunc()
> File "D:\path\pyfile\testsomething.py", line 90, in test_Hello
> assert "bonjour" not in abc.render()
> AssertionError
> -----------------
> Ran 1 tests in 0.030s
>
> FAILED (failures=1, errors=1)
>

上面的報告提醒我們有一件錯誤: "bonjour" 字串原本不應該出現在 abc.render () 回應結果中的,但結果中竟然出現了!

所以如果我們的測試用例寫的好,就可以肯定我們剛剛改動 something.py 時出了些問題。測試這件事確實有效!

較好的約定

我們已經知道,只要類別或方法的名稱是以 "test" 或 "Test" 開頭。就會被 nose 當成是測試例子,所以其實在一個小程式中,我們大可把測試例子跟主程式放在同一個檔案裡.

但是當你都還不很確定你在幹什麼的時候,我建議還是將測試例子跟主程式分開。這麼做除了程式不容易搞混之外,在切換檔案時,還可以順便切換撰寫程式與撰寫測試例子時的不同 MindSet.

測試驅動

那麼如果我們想改寫 hello 函式,好讓它可以用法語 "bonjour" 打招呼,我們該怎麼辦? 記得 "測試先行", 考慮加上一個新的測試例子,而不影響原本的功能吧!

加入的測試例子:

>
> def test_bonjour():
> abc = Hello('bonjour')
> assert "bonjour" in abc.render()

接著要做的就是再跑一次 nosetests, 看到這個新的例子跟我們報告錯誤了. OK, 那就開始修改 hello 函式吧![註 2]

其他的測試

nose 支援的測試的方式琳瑯滿目,可以使用 "nosetests -h" 命令來查看支援的項目.

例如另外一個常用的測試方式是使用 doctest: nosetests --with-doctest

那麼 doctest 是什麼樣的測試方式? 又該怎麼使用 doctest 呢?嘿嘿,4 月 OSDC.tw 07 再開講囉:D

我知道這個工具已經快半年了,到今天才有時間,勇氣真的下去嘗試. 讓我白白錯過這樣好用的工具這麼久,應該怪在 nose 太少文件可以參考的頭上吧? 乾脆自己來寫個 "三步驟使用 nose 開始測試" 的簡易文件好了.

註 1: 這篇文章不講怎麼寫 python 程式,這部份請自理:P 註 2: 同註 1, 建議妳逛逛 www.python.org.tw 可以看到更多參考資料

· 3 min read

任何安裝好的 python 版本中都包含著 python 禪學 (哲學), 在任何 python 互動介面 (如 IDLE) 中輸入

import this

則會出現如下的 python 禪學 (哲學)

Python 禪學 (pythoon Zen)

美觀的比醜陋的好 (Beautiful is better than ugly) 直率的比含糊的好 (Explicit is better than implicit) 簡單的比繁雜的好 (Simple is better than complex) 繁雜的比晦澀的好 (Complex is better than complicated) 平直的比巢雜的好 (Flat is better than nested) 疏落有致的比櫛次鱗比的好 (Sparse is better than dense) 可讀性應當被重視 (Readability counts)

就算是特例,也不能壞了規矩 (Special cases aren't special enough to break the rules) 然而能解決問題仍然比維持單純重要 (Although practicality beats purity)

錯誤不應該被默默地放過 (Errors should never pass silently) 除非你是刻意為之 (Unless explicitly silenced)

面對模稜兩可的情況,要抗拒猜測的誘惑 (In the face of ambiguity, refuse the temptation to guess) 應該會有一個 -- 而且最好只有一個 -- 適當的方式來實現 (There should be one-- and preferably only one --obvious way to do it) 雖然不是這個語言創造者的妳一開始可能看不出來 (Although that way may not be obvious at first unless you're Dutch)

現在動手比總是不動手的好 (Now is better than never) 然而不動手可能還比沒有準備就動手的好 (Although never is often better than right now)

如果實作方式難以解釋,那大概是個壞主意 (If the implementation is hard to explain, it's a bad idea) 如果實作方式易於解釋,那可能是個好主意 (If the implementation is easy to explain, it may be a good idea) 名稱空間是一個很棒的主意 -- 我們就盡量用吧!(Namespaces are one honking great idea -- let's do more of those!)

--Tim Peters (gasolin 翻譯)

2007/03/01 更新: 參考 http://wiki.python.org.tw/The_Zen_Of_Python 其他人的理解修改

· 2 min read

前幾個禮拜看到 limodou 的 Openbook platform 後弄的 TurboGears 製作書站 screencast (示範影片)

第一個影片裡示範了如何使用 TurboGears 建立一個專案,與如何啟動開發用網頁伺服器. 並展示了如何透過修改模板快速訂製頁面。這個 screencast 中完全使用 TurboGears 預設的 CSS style.

1st. is a quickstart demo with hello world template version (6.5MB)

第二個影片裡示範了如何使用 TurboGears 工具箱 (Toolbox) 中的模型設計工具 (Model Designer)和資料編輯工具 (Catwalk) 來建置 TurboGears 動態內容網站

2nd is Model Designer with Catwalk (7.7MB)

第三個影片中使用到我寫的 TurboGears tgcrud 擴充模組,透過 tgcrud 擴充模組可以很容易地產生類似 Rails 的 scaffold 介面架構。但與 scaffold 不同的是所有 code 都是 implicit 的,更加容易修改.

3rd. is tgcrud, the TG's scaffold (5.2 MB)

感謝 Elvelind Grandin 協助上傳至 TurboGears 網頁空間.

· One min read

晚上剛看到在 TurboGears 的說明文件寫作文件中加上了張圖

這張圖上的口號是:

Onward, Documentation Writers! DID YOU CONTRIBUTE SOMETHING TODAY?

可以翻譯成:

前進吧,(寫手) 同志們 你今天為 (TurboGears 的文件) 革命事業貢獻了些什麼嗎?

TurboGears 用這麼有趣的圖 (萬里大長征) 來徵求貢獻文件,真是很 KUSO 呀...

PS: 這週末 (2/10) 有近期的第二次 TurboGears Doc Sprint 喔.

· 2 min read

OSDC.tw 07 的議程終於公佈了,有幸在一早 (9:00 am–10:20 am) 為大家暖場 :P

瀏覽一下大家的講題,發現我提供的講題似乎太白爛了些 XD

先把投稿的演講簡介放上吧

subject:

Test Driven Python 懶人包

abstract:

介紹透過 Test Driven programming 的方式. 使用簡單易懂的 Python 動態語言和模組來實際撰寫 Console 和網頁程式.

"Test Driven 是什麼?"

"編寫 Test Case 很麻煩吧."

"寫程式已經夠麻煩了,我不要另外寫 Test Case 啦"

在這個 session 中你可以學到懶人用的測試概念: 測試既不麻煩也不用特地學, 寫 Test Case 和寫一般函式沒兩樣. 程式註釋裡的範例片段也可以拿來當 Test Case

內容主要涵蓋

  • Test Driven 簡介
  • 簡單測試:使用 Nose 測試工具
  • 用寫文件的方式寫測試:使用 DocTest
  • console 程式測試
  • 使用 Python optparse 標準函式庫來產生 "-- help" 和處理 console 參數
  • 網頁程式測試:使用 Nose 測試 TurboGears 程式.

· One min read

終於將 咬一口 Python (Byte Of Python) 翻完一遍啦!

本書是當前最新的 Python 正體中文書。共有 17 章. 在有簡體中文版可以參照的情況下, 照著每一兩週翻譯一章的進度翻下來, 還是花了 3 個多月才翻完。有種發宏願繞境達成的感覺 XD

內文主體都翻譯好了,接下來剩修改錯字,排版,加入連結等等後續工作囉.

· 5 min read

好久前使用 Ultra Dev (Dreamweaver 4 網頁編輯器時代的東西) 寫 ASP 網頁時,那時其中一個超方便的功能就是在與伺服器繫結後,選擇一個 "產生詳細頁面" 的 Widget 元件,稍稍做點設定 Dreamweaver 就幫我產生一個包含資料庫表單內容的頁面。用同樣類似的方法就能完成製作新增,刪除網頁等事情。製作一套動態網頁也不用花太久時間.

上禮拜回頭去試試 Ruby On Rails 時覺得 ROR 有得分的一大優點是鷹架產生器 (scaffold).

scaffold 有什麼功能呢?scaffold 可以根據 RoR 的 ORM (Active Record) 來產生對應的 Controller/Template 程式碼,達到能基本的資料建立 / 修改 / 檢視 / 刪除 (Create/Read/Update/Delete, CRUD) 的目的。而且即使在產生出來 scaffold 後再變更資料庫欄位,產生出來的程式仍然可以正確判斷內容。使用感覺頗類似 Django 的 admin 介面或 TurboGears 的 Catwalk / DataController, 但是就可修改性而言我覺得這種作法稍勝一籌.

只是要拿 ROR 的 scaffold 繼續修改也很容易碰上問題. 因為它為了要能自動對應資料庫的改變來反應到 scaffold 介面上,所以產生出來的 code 除了基本大框架可見之外,裡面的內容都被包在不可見的單一函式裡. 要做任何修改時還是得自己大量改寫 scaffold 產生的內容 (不過還是比全自己寫來的快)

要搭一個漂亮的鷹架要多久呢? 我使用 TurboGears 來重現 scaffold 的各種列表增刪修改介面,為了取得最高的重用性,再用 widgets 改寫一遍,運用 TurboGears 現成的 Widget 已經能幫忙處理新增 / 修改表單的生成。弄好這個 CRUD 介面已花了 3 小時,而且還不像 Rails 一樣會自動去抓變動的欄位.

(3 小時?有人開始撇嘴了....)

寫這個介面當然是有目的的. 接下來在開發環境中,我試著將這個 CRUD 介面做成了 TurboGears 的樣板。並透過 tg-admin 加入一個 crud 命令。使用

tg-admin crud [model class name][controller name]

這樣的語法來產生一個包含了 controller 和 template 的資料夾

例如 model 中已經定義了一個 BookMark class, 只要在專案資料夾中輸入

$tg-admin crud BookMark admin

就會在專案資料夾中新增一個 admin 資料夾,在 controller 中使用

from admin import admin 就可以將處理 BookMark 資料的介面導入到網站中.

以後每次要做的只是簡單地修改表單欄位 (Form field) 定義和 list/show 樣板想要顯示的欄位就可以有完整的 CRUD 介面了。整個過程只要幾分鐘 (預設還會自動套用專案預設的 CSS, 啥都不改就蠻漂亮滴 XD).

目前 tg-admin crud 的做法和 ROR 的 Scaffold 最大的不同在於整份產生的介面不管是 controller 或 template 的程式都是明確的,沒有需要修改時就得重寫的黑盒子.

接下來應該是進一步降低要修改的地方,透過 widget 來將重複設定 (無論是 controller/template) 都減到最低程度。達到足夠成熟度再公開.

目前的 crud 樣板在這,已經可以運用了 CRUD Template

· 2 min read

WhatWhat Status is a web application for tracking the status of projects across an organization. It's opensource and able to download from here.

I found this project from the TurboGears book. WhatWhatStatus' default setting is for protegres and MySQL, but not for SQLite. I'd like to share my steps to use SQLite database with WhatWhat Status.

1. check out the source from svn

svn co http://cleverdevil.org/svn/optio/whatwhat/trunk

2. install textile with easy_install command

$ easy_install textile

3. config the dev.cfg file to use sqlite database

enter the whatwhat status folder, edit dev.cfg:

[global]

# WHATWHAT SPECIFIC

whatwhat.uploaddir = '%(current_dir_uri)s/whatwhat/static/files'

# DATABASE

sqlobject.dburi="sqlite://%(current_dir_uri)s/devdata.sqlite"

4. create database by tg-admin sql sql command

$ tg-admin sql sql (or tg-admin sql create)

5. add default user with catwalk

5.1 first you need to start the TurboGears toolbox

$ tg-admin toolbox

5.2. choose the catwalk in browser

5.3 select "Person" in catwalk left side menu

5.4 click "Add Person" button on top of the page

5.5 enter the following informations:

displayname: any name
email: any email
userid: admin
password:21232f297a57a5a743894a0e4a801fc3

Note that the password field is crypted, the verbose password we typed means "admin".

6. Start whatwhat status

run

$ whatwhat-start.py

enter the username/password as "admin", "admin", then click login.

all done!

· 2 min read

快下班的時候接到一通電話,聲音甜美的天瓏小姐打來提醒我上次訂的 TurboGears 書已經到貨囉. 晚上馬上殺到天瓏去敗了一本,在附近的漢堡王就看了起來.

總的來說感覺很不賴,和網路上的教學文章切入的方向不盡相同,書中採用了好幾種方法來寫 Hello World, 好讓程式 / 網頁開發者都能找到切入點.

比較令我驚訝的是在書中第四章就開始講使用版本控制來管理程式,並講解 TurboGears 對測試先行(先寫測試再開始開發的方法)的支援;書中有大概 80 多頁 (全書 450 頁左右) 講的是 AJAX 函式庫 (Mochikit) 的支援,這都是網站教學文章裡最缺乏的.

另外一個插曲是我在天瓏附近的簡體書店裡看到 DH 的 Agile Ruby on Rails 簡體中文版,定價 65 元 (4), 跟手上的這本 $50 元 (30) 比起來實在夠便宜呀 Orz

· 2 min read

對岸的 黄毅 兄寫了一篇 "Build extensible application with egg " 參考資料,介紹 Python 的封裝格式

在 python 社區中 egg 已經是一種廣為人知的格式了。眾所周知對於 python 來說 egg 是一種用來生小蛇的東西,小蛇自然就是 python 軟件包了 (純屬瞎扯;-)。

簡單地說,egg 之於 python 正如 jar 之於 java。是一種軟件包打包的格式

想要讀懂這篇文章的關鍵在 "egg 最重要的作用是给软件包增加元数据!" 這句話.

"软件包" 大概大家還能猜得出來是什麼,不過 "元數據" 是啥?

答案是 "MetaData", Meta-Data 的意思就是資料背後的參考資料. 用在這的意思是說,這個程式的壓縮包裡,除了提供這個程式的功能外,還提供了安裝相關的資訊.

例如我在如何把蛋砸到起司商店?中指出 cheeseshop 的上傳方式,所有 cheeseshop 上的各個說明欄位都可以事先在你的 setup.py 檔案中填好,用同樣的

setup.py bdist_egg

命令來將程式包裝成 egg 檔.

· 2 min read

EasyEclipse for python

People who are used to Microsoft VisualStudio or Java IDE usually criticize that python has no good IDE to cooperate with,

I think pydev is one of good python IDE, which is based on eclipse platform. But since you try to install it, it's pretty annoying to set the eclipse and pydev run properly.

Now EasyEclipse project provide an easy install pack of Eclipse for python, it contains:

  • eclipse platform itself,

  • pydev(eclipse python support),

  • Subclipse(eclipse SVN GUI),

  • and several useful plugins installed by default.It really ease the installation and configuration of Eclipse for python.

Pydev with Turbogears

Besides that, Pydev developer recently wrote an article for Configuring Pydev to work with Turbogears

It sounds like a right time to try for pydev + TurboGears.

So I searched and installed the Eclipse for python and EasyEclipse Web tools editors for eclipse HTML/CSS editor and an Internal Web Browser.

The result? It's not much too say.... pretty good:D

Start Up

First create a pydev project, it will assign a workspace for the project. Open the console, change path to the workspace folder. Use tg-admin tool to create a TurboGears projects named "projectname" within the pydev project workspace folder.

Now the project folder will shown on eclipse Navigator panel. (you may need use right click menu-> refresh) click the start-_projectname.py tap F9, then the web server will run.

You can use the "Open Web Browser" icon which is near with the search icon to open the internal Web Browser. Type http://localhost:8080 to see the welcome page :)

Sounds good?

Configurations

Here are a little configuration tips you may intrested...

Assign the python interpretor

1. open window/preference, select pydev/interpreter-python, click top right "Add" button to select the python.exe path (windows default is C:\python24\pythonw.exe). The proper library and key words will automatically load for you to use.

Template Association

2. select General/Editors/File Association, click top right "new" button to add "*.kid" file style for kid template. Press the second "Add" button to assign the associate editors to HTML Editor(default) and Internal Web Browser.

I also found a WYSIWYG HTML editor EasyEclipse eZingBuilder, but I can't get the kid page present correctly now.

more tips are welcome

· One min read

The Zen of TurboGears, by Fred Lin

Keep simple things simple and complex things possible Give defaults while you give choices Give choices while the one obvious way depends

Make it work Make it right Make it fast

Pythonic is better than domain specific Easy configuration is clear than convention Integration counts Batteries included rocks Flexibility flow ideas into each part of code

keep data in Model and seperated logic from Template Widgets are one honking great idea -- let's do more of those!

· One min read

從 Ruby 到 Python 一文的目的是向 Ruby 語言的使用者介紹 Python 語言.

文章中標出高亮度的部份是可以修改成目標語言 (Java, PHP.... 等等) 的部份。歡迎使用相同的版型與內容,群策群力,創作一系列 "從 xxx 到 Python" 的系列介紹文章.

有問題或建議請在 Google Group 中提出

· One min read

從 C 到 Python 一文的目的是向 C 語言的使用者介紹 Python 語言.

文章中標出高亮度的部份是可以修改成目標語言 (Java, PHP.... 等等) 的部份。歡迎使用相同的版型與內容,群策群力,創作一系列 "從 xxx 到 Python" 的系列介紹文章.

有問題或建議請在 Google Group 中提出

· One min read

I wrote a doc in TurboGears doc site: Wrap AJAX operation in Widgets, which demonstrates how to use the widget to do basic AJAX operation as Rails 'link_to_remote' helper.

The RemoteLink widget works differ from Rails 'link_to_remote' helper. It's simple, pure python(while you use it) and fully 'optional'! 'Optional' means if you remove the widget, your site still functional. Thanks to the mochikit cool functions :-)

· 7 min read

許多人以為 TurboGears 能跟 DjangoRuby on Rails 比較的地方只是因為一個分散組件,一個集中開發.

但 TurboGears 好用的地方並不是在它堆砌了許多開源的 python web 專案 (如不曾成功過的 subway), 而是真正提出了一個整合這些 python web 開發資源的方法。並提供相當具有 python 風格 (pythonic) 的使用方式.

1. Decorator 形式的 Dispatcher

TurboGears 的多數的秘密存在於 Decorator (用 "@" 符號開頭的敘述) 中. Decorator 是 python 2.4 後才引入的特性, 適度使用可以讓程式碼更清晰.

TurboGears 基本的網頁型態是這樣:

>
> @expose()
> def index():
> return

基本的 pyhton method 加上 @expose() 這個 decorator 敘述, 讓 server 知道這個函式是 public to web 的.

需要登入認證功能,就再加一個 @identity 敘述

> #auth_admin_required = identity.in_group("admin")
> @identity.require(auth_admin)
> @expose()
> def index():
> return

如此被裝飾到的網頁就有了認證功能.

同樣形式的還有

@paginate # 分頁功能 @validate # 表單驗證功能 @error_handler #錯誤處理功能 @exception_handeler #例外處理功能

等特殊功能.

@validate 表單驗證的功能除了驗證表單參數, 還負責將參數從字串轉換成 python native 格式,可以對網頁傳過來的參數直接用 python 做處理.

@error_handler 和 @exception_handeler 被用來對應表單驗證功能 讓我們可在同一個函式裡處理錯誤,或另外定義函式做錯誤處理

>
> @error_handler("index")
> def ex_report():
> return "exception"

2. 一個函式,多重輸出

很多人知道 TurboGears 在樣板選擇上的多樣性, 但是卻沒有挖掘到在 TurboGears 的神奇之處. 在 TurboGears 中使用同一個函式,就可以針對不同需求,輸出多種期望的格式.

>
> # 使用網頁樣板產生網頁介面
> @expose(template = "hello.welcome")
> # 產生 JSON 格式介面供 AJAX 程式調用
> @expose("json")
> #使用不同的樣板引擎, 產生RSS格式介面
> @expose(template = "genshitext:hello.hoho", as_format="RSS/XML")
> def show(self, **kw):
> return dict(name = 'foo', url = 'boo')

這是因為 TurboGears 回傳使用 python 特殊的 "字典 (dict)" 形式, 而不是一般常見的字串形式 (當然 TurboGears 同樣也可以直接輸出字串).

當使用者要求網頁的時候,web server 決定好對應的 method 運行後, method 輸出字典型式的返回值到 decorator. 再根據 @expose decorator 的判斷條件, 取用適當的樣板配合字典來生成適當的介面.

原本需要自行將樣板與內容 "串連 (serialize)" 的工作,TurboGears 都幫忙我們完成, 讓我們只要專注在程式邏輯上即可.

要從別的 method 調用這個函式不同的輸出也很容易, 只要在返回值裡加上一個 "tg_format" 參數即可手動指定輸出格式.

>
> @expose()
> def rss():
> return rss(tg_format = "RSS/XML")

3. 簡單設定

通常在 TurboGears 中要讓一個資料庫程式運作, 只要在 dev.cfg 裡指定好對應的資料庫路徑 (dburi), 就可以開始資料庫網站的開發. TurboGears 自會幫忙處理初始化的動作,並且提供相應工具.

要改換整個網站的預設樣板引擎,同樣也是一行設定搞定.

tg.defaultview = "genshi"

程式裡往往會有些可以讓使用者修改預設運行設定的地方, 如在程式裡要取得預設的模板引擎,可以使用

> config.get("tg.defaultview")

來取得預設的模板引擎。取得其他設定值也是使用同樣的方法.

TurboGears 開發的應用程式在發佈 / 安裝上相當容易. 使用易用的 setuptools python 套件發佈功能, 安裝時能自動抓取使用到的 python modules.

4. 高擴展性

TurboGears 框架是個組合框架 (meta framework), 因此設計之初就把高擴展性視為重要目標. 只要在 console 中使用 tg-admin info 命令就可以一窺 TurboGears 擴展的面目。你會驚訝地發現其實 TurboGears 大多數的功能都是透過擴展實現.

TurboGears 使用的擴展方式是透過 python setuptools 的 entrypoint, 撰寫自己的擴展並不需要改動 TurboGears 的原始碼. 安裝擴展也可以透過 easy_install 命令自動從 python cheese shop 下載組件.

5. 與 Python 社群互利

TurboGears 並不是一個只取不予的開發框架, 一方面 TurboGears 降低了試用各 python web modules 的難度, 使得各專案能吸引更多使用者,也加快了各專案的成熟度;

另外一方面,除了多數 python modules 都可配合 TurboGears 使用之外, TurboGears 框架中所開發出來的工具也都盡量朝能獨立於框架外使用的方向邁進.

近期的成果是 ToscaWidgets, 將 TurboGears 中方便重用的 widgets 獨立出來, 可在 pylons, web.py 等框架和工具上使用.

TurboGears 在組合框架上,不只是達到功能上的滿足,還達到與 python 語言使用上的一致性. 充分使用各種 python 語言的特性與工具,沒有過多的 Magic. 這是許多追趕的組合框架應該思考的.

PS: 對 Open Source Project 來說,一個好的文件網站也很重要

· One min read

國外有人將 Django / TurboGears 的選擇比做 Mac 跟 Linux 的選擇.

Mac OSX (Django) 美觀,從頭打造,有專職團隊維護, 有較好的宣傳與一致的文件.

Linux (TurboGears) 彈性, python 網頁開發相關模組的有機集合,可訂製程度高。文件散見各模組,皆為自由貢獻,品質不一.

雖然 MAC/LINUX (Django/TurboGears) 都是 UNIX (python) 核心,但是社群的偏向還是有差異的.

喜歡一體成形,具有很高一致性方案的人可能就會選擇 Django. 有高彈性需求的人可能會比較偏愛 TurboGears.

· 2 min read

身穿冒險服裝,身纏蟒蛇的漫畫少女 (萌) 會讓你聯想到什麼?

荒島求生,畢業旅行,還是純情房東俏房客這些讓人臉紅心跳的日系 AVG 遊戲?

再怎麼想,大概也不會想到我要介紹的卻是 Ren'py 這個免費的 AVG 冒險遊戲設計工具吧 :-D

Ren'py 透過主視窗就可以產生新專案,一個空白的專案就包含了一般 AVG 遊戲常見的選單,記錄,讀出等功能 (嗯嗯... 可惜沒看到看圖功能 XD) 或是將設計好的遊戲發佈成 Windows, Mac, Linux 等各平台的套件,非常方便將自己製作的遊戲與其他人分享.

Ren'py 的文件還不錯 (甚至還有互動遊戲版說明 :-D), 腳本的寫作與編譯也相當方便. 而且這個工具支援中文 (另外抓螢火飛的中文字型即可). 需要進階功能的話,可以使用 Python 語言撰寫加強程式,擴展性極佳:-D 如果想要設計一套 AVG 遊戲,Ren'py 實在是相當棒的選擇.

PS: 看看可愛的蟒蛇還咬著遊戲手把,有些人可能已經猜到,這個工具是基於 pygame 來開發的.

· One min read

拿到一個現成的資料庫,最快速的就是直接存取啦.

TurboGears 中除了預先定義 schema 外,也可以直接使用 SQLAlchemy 中的 SqlSoup 模組來直接存取資料庫.

之前我有寫過英文版的,今天 trace 一下 sqlsoup 後發現還有更簡單的方法:直接取用 metadata.

1. 修改 dev.cfg 中的 sqlalchemy.dburi , 指到對應的資料庫

2. 在 your project/model.py 中,寫下

from turbogears.database import metadata from sqlalchemy.ext.sqlsoup import SqlSoup

soup = SqlSoup(metadata)

3. 使用 shell 存取資料

$ tg-admin shell

poll = soup.poll.select() print poll

· 2 min read

Purpose

Have an exist database and want migrate to TurboGears? Or you've been using TurboGears SQLObject model and want to migrate to SQLAlchemy?

Solution

TurboGears newly support SQLAlchemy 0.2 module(>0.9a6), it provide a slick solution: SqlSoup !

What SqlSoup does?

SqlSoup inspects your database and reflects its contents to class, no model definitions are necessary!

What does that mean?

It means you only need to specify a uri for database, and call SqlSoup to do the rest.

What's the Benifits?

SqlSoup maps database tables to classes automatically. I'm not sure how efficient it is, but at least you can use SqlSoup by following ways:

  • To use existing Database design tools to design my database
  • To use SqlSoup in design phase, and code to SQLAlchemy class when the databse is settled down.
  • To painless migrate SQLObject generated database to SQLAlchemyTest Code

Try the test code, it is thin.

in model.py

1 from sqlalchemy.ext.sqlsoup import SqlSoup

2 uri = "sqlite://%(current_dir_uri)s/devdata.sqlite" 3 soup = SqlSoup(uri)

Explain

line 1 import SqlSoup from sqlalchemy module,

line 2 specify the uri link to the database (I believe it can be improved)

line 3 the real code calling SqlSoup connect to uri

line 4 and line 5 shows I call the table "poll" from database

if you can't execute is , maybe you should install sqlalchemy first

$ easy_install sqlalchemy

or try the TurboGears way:

1 from turbogears import config 2 from sqlalchemy.ext.sqlsoup import SqlSoup

3 uri = config.get('sqlalchemy.dburi') 4 soup = SqlSoup(uri) All you need to do is specify the dburi for sqlsoup.

Let's test what we got

poll = soup.poll.select() print poll

Reference

That's all you need in TurboGears. To get further usage , you can refer to Introducing SqlSoup

ps: Actually TurboGears has done nothing particularly to support SqlSoup, I just use it as other modules.

· One min read

剛看到一個 Python FAQ 系統. 當然這並不是最好的 FAQ 系統,不過裡面除了一般的分類索引之外,還有個非常有趣的功能是 "Show me a random article! (隨機文章)", 這功能有點像一些 IDE 剛開啟的時候出現隨機的 FAQ 視窗,每次開啟時都有不同的訊息.

· 2 min read

TurboEntity 照著 'SimpleBlog Part II' 中的範例改寫後,獲得以下程式碼 (model.py):

>
> from turboentity import *
> from docutils.core import publish_parts
>
> class Post(Entity):
> class turboentity:
> tablename = "posts"
>
> title = Column(Unicode(50))
> content = Column(Unicode)
> post_date = Column(DateTime, default=datetime.now())
> is_published = Column(Boolean, default=False)
> comments = OneToMany('Comment',backref='posts')
>
> @property
> def html_content(self):
> return publish_parts(self.content,writer_name="html")["html_body"]
>
> class Comment(Entity):
> class turboentity:
> tablename = "comments"
>
> author_name = Column(Unicode(255), nullable=False)
> author_email = Column(Unicode(255), nullable=False)
> author_url = Column(String(255))
> comment_date = Column(DateTime, default=datetime.now())
> content = Column(Unicode)
> post = ManyToOne("Post",backref='comments')
>

要表示 post-comments 關係只需分別在兩個類別中宣告 OneToMany - ManyToOne 即可,真是方便呀.

另外當定義好 TurboEntity 類別後,物件自動可以用傳值的方式輸入內容,不需一個個各別指定喔.

例如一般的寫法是這樣子:

p = Post.get (1) # 取得條目 c = Comment () # 新建一條評論 c.post = p # 這條評論屬於 p 條目 c.author_name = "CommentDude1" # 這條目的作者是 c.author_email = "[email protected]" # 這條目作者的郵件信箱是 c.content = "Great post! Keep them coming!" # 這條目的內容 c.flush () 可以直接改成 p = Post.get (1) c = Comment (post=post, author_name="Bob", author_email="[email protected]", content="Bob loves this site.", author_url="http://bob.example.com/") c.flush()

TurboEntity改寫的程式和原本 Tutorial 相比,可以看出它好用的地方.

· 4 min read

明天公司補放國父誕辰紀念日,所以有空到 Google 翻翻最近有沒什麼有趣的文章。我找到了一篇 TurboGears vs Rails. 文章名稱夠聳動,雖然這篇文章有點舊了 (用的是 0.9 的預覽版 TurboGears, 或稱為未進化型態版本 XD), 不過裡面對 TurboGears 和 Rails 的特性確實抓得頗準:

The Pythonic way is "explicit over implicit". Everything is out for show: you know what modules are imported, you know what methods are exposed, you know what columns are defined and so on. It may take more keystrokes but the extra code let's you know what is happening when things go wrong. python 語言的風格是 '直率的比含糊的好'. 所以所有的過程都可以被檢視:妳曉得如何導入使用的模組,函式怎麼對應到網址上,妳也曉得資料物件如何定義等等。妳可能需要多打一些字 (註:事實上不多), 但是這些額外的程式碼能讓妳在發生錯誤時更容易地知道自己的程式到底發生了什麼事.

The the Rails way is the opposite: take the burden off the developer, don't bother them with the petty details that get in the way and add to the line noise. Rails 的寫作方式則相反:把讓開發者困擾的因子都去除掉,不要在開發中用細節來干擾程式碼.

事實上去年 5 月底時,我在看過 OnLamp 網站上的 Ruby On Rails 教學後,相當驚訝現在網頁開發的進步 (之前有一年沒寫動態網頁了). 所以我也趁等待完成論文前的時間歔空寫了篇 Ruby On Rails 教學。不過在 7 , 8 月 Django, TurboGears 這些 Python 框架相繼出現後,我發現除了可以使用熟悉的 Python 語言風格來寫程式之外,以後也可以透過網頁介面來使用大量的 Python 模組實在非常吸引我。而當 TurboGears 框架出現 ToolBox 這神奇的工具箱後,我開始漸漸投入了 TurboGears 開發的行列.

能展現自我特點的是創意而不是程式碼 在我的觀念裡,能展現自我特點的是創意而不是程式碼 (也許因為我不是個天才程式設計師吧 XD). Rails 也是個相當吸引人的框架 (差不多靠一己之力拉拔 Ruby 語言 XD). 但是 python 的 "應該會有一個 -- 最適當的一個的方式來實現" 哲學比較接近我的想法。在閱讀其他人的 TurboGears 專案時只要不用到太進階的 Python 語言功能,基本上都非常易於閱讀與修改. (例如目前 TurboGears 最進階的教學文件: SQLalchemy 版的 SimpleBlog, 花一些時間就可以改寫成 TurboEntity 版 SimpleBlog 之一, 之二)

· 5 min read

當開始使用 MVC (Model, View, Controller) 的方式設計網站程式後,組織網站架構的重任就從傳統的分頁換到程式控制部份 (Controller) 的網址 - 函式對映 (URL Mapper) 上.

舉 python 網頁框架的例子為例,python 的網頁框架很多,最常聽到的 Django, TurboGears, pylons 都各自有各自不同的網址 - 函式對映方式. 網址 - 函式對映能將程式控制部份對映到網站架構,也能依照一些規則將輸入的網址對應成函式的參數,方便程式使用.

Colubrid 這個 WSGI 工具的網站上清楚地列出了目前常見的 URL 對映分類:

  • 使用 正則表達式 (Regular Expression, Regex) 對映 -Django
  • 使用 物件 (Object) 對映 -TurboGears
  • 使用 路徑 (Routes) 對映 -pylons

"-" 號後面的補註是我另加上去的,表示這幾個框架預設的 URL 對映方式. 當然有的框架也可以用另外的 URL 對映 (例如 TurboGears 也能使用路徑對應方式).

範例

首先我們先給出一個基本的程式架構,再來討論如何將這個程式對應到網頁上。本文隱藏了各網頁框架特定的程式碼,因此在實際運行各種對應方式時需要再加上各自的程式碼.

Class Root(object):
def index(self):
return "Front Page"
def profile(self):
return "Profile Page"

app = Root()

這個類別 (Class) 包含兩個函式 (Method), 我們的目的是讓它顯示成如下的網站架構:

/
- index
- profile

例子很淺顯,我們就開始來嘗試吧

1. 使用 正則表達式 (Regular Expression) 對映

使用時在 Root 類別裡加上正則表達式來對映網頁

urls = [
(r'^index,'index'),
(r'^profile,'profile')
]

網頁架構是一串以 (r' 網頁名稱 ' ,' 函式名稱 ') 組成的列表來定義. 網頁名稱,函式名稱部份都可以使用正則表達式

2. 使用 物件對映

不必加入特別的對映方式. Root 類別在實例化後等同網站預設的根目錄, Root 類別下的兩個函式直接對映到相應名稱的網頁上.

/- Root
- index()
- profile()

訪問 / 或 /index 時就等於訪問 index () 函式, 訪問 /profile 時就等於訪問 profile () 函式

3. 使用 路徑對映

這種方式是跟 Ruby on Rails 學來的. 方法是另外建立一個類別,專門處理網頁架構.

class app(RoutesApplication):
mapping = [
('/', Root.index),
('/profile', Root.profile)
]

app = app()

網頁架構是以 (' 網頁名稱 ' ,' 類別。函式名稱 ') 組成的列表來定義. 網頁名稱部份可以使用正則表達式.

結語

我在寫本篇之前,從來沒有看懂其他網頁框架的對應方式,因此傻瓜式的物件對映方式對我來說是最直覺了,使用至今還沒什麼感到不方便的地方.

雖然本篇所作的比較簡單,無法展現各種對映方式的實際能力, 例如本篇沒有比較到輸入參數的對映方式.

以上三種方法都已經被證明有效而且許多網站正使用著這些方法運行著. 希望大家能以本篇為基礎,就較理解的 URL 對映方式繼續深入學習.

我很想知道各位看官,對於用簡單的例子來對的各種 URL 對映方式做說明是不是比較容易理解呢?

· 2 min read

今天到天瓏書局預定了 11/9 號出版的 "Rapid Web Applications with TurboGears".

其實這本書早在 9 月多時主要作者 Mark Ramm 透過封閉的 TurboGearsBook group 提供各章節草稿時我就看過了.

參與 TurboGearsBook Group 的要求就是在享受預覽草稿的權利同時也要扮演 Reviewer/Editor 的角色提出意見.

在書籍不是 OpenSource 的情況下,這種兼顧社群與提昇質量的方式還蠻值得參考的.

當時內容還不太完整,不過已經勾勒出大部分的輪廓了。由於 TurboGears 是個整合許多 Python 模組的框架,因此裡面除了框架本身內容,實際範例外,還專章提到了諸如 TurboGear 如何的使用 CherryPy, SQLObject, SQLAlchemy, Formencode 等模組.

另外測試的部份除了講到 nosetests 與 TurboGears 為方便 Model, Controller, Viewer 各層測試而加入的 testutils 測試函式庫外,還提到 Selenium, Mechanize 等使用者經驗測試部份. 算是我相當期待的一本書.

· 2 min read

這幾天 TurboEntity 這個類似 ActiveMapper 的模組一出現馬上獲得不小的關注. 因為它可以用幾乎與 SQLObject 數量相當的程式碼來定義 ORM, 又能完全繼承 SQLAlchemy 的效能和彈性.

Lee McFadden 從上上週開始在他的 Blog 上連載了 3 篇 'SimpleBlog' 系列文章,引導如何使用 SQLAlchemy + TurboGears 製作簡單的 Blog 系統. 他採用了接近基本 SQLAlchemy 的設定方式,因此程式碼有點多.

我用 TurboEntity 照著 'SimpleBlog Part I' 中的範例改寫後,獲得以下程式碼 (model.py):

>
> from turboentity import *
> from docutils.core import publish_parts
>
> class Post(Entity):
> title = Column(Unicode(50))
> content = Column(Unicode)
> post_date = Column(DateTime, default=datetime.now())
> is_published = Column(Boolean, default=False)
>
> @property
> def html_content(self):
> return publish_parts(self.content,writer_name="html")["html_body"]
>

在其它部份保持不變的情形下,拿來跟原文比較可以發現使用 TurboEntity 寫的定義 ORM 程式,就程式碼行數上實在不輸 SQLObject. 難能可貴地是同樣能保持很高的可讀性.

TurboEntity 網站上還有使用 TurboEntity 版本做 TurboGears Identity Model 的例子,看來轉換到從 SQLObject 轉換到 SQLAlchemy 已經不再是太令人躊躇的事了.

· 2 min read

I decide to start a new track of TurboGears Tutorial (In English), which is light weight enough so it will be easy to follow.

Why not start this tutorial on TurboGears Documentation Site ?

It just because I feel more comfortable with blogger's editor, and I'll feel less guilty if I mess these tutorial up :-D

Oops, 5 seconds passed, let's go back to the topic.

Start a new project

To start a new project (new site) with TurboGears, you'd use "tg-admin quickstart" command for it. The syntax is:

$ tg-admin quickstart [projectname] Let's create a "TurboHello" (sound's powerful, isn't it? :-D) project for example:

$ tg-admin quickstart TurboHello The console will prompt some choices. Feel free to press "enter" button (let defaults) and proceed to the next step.

Start the web server

The 'TurboHello' folder was created by your console. After the project was created, enter the 'TurboHello' folder, and you could start the TurboGears development web server with following command:

$ ./start-TurboHello.py

The web server is running, browse http://localhost:8080/ to see the project welcome page:

Pretty and easy, right?

The project structure

While entering the 'TurboHello' folder, you'll see the project skeleton laid there. Those files can be categorized for 4 purposes:

The document was merged to http://docs.turbogears.org/1.0/GettingStarted/BigPicture

TurboGears followed MVC design pattern (search if you don't know that), which seperate the web application design into three different roles, to build the default quickstart project. TurboGears also offer you the flexibility to 'not use the MVC' as well (will be shown in next minutes).

We'd always focus on part 4: "the Development part" in TurboGears.

· 3 min read

我想沒什麼人會想學新語言,即使這門語言很美很有用,尤其是當對人們來說這語言用不太到的情況下 (例如有個傢伙跟你說一旦你學會了優美的拉丁文,以後你就可以讀懂中古歐洲的文獻。這傢伙大概會被你罵神經病 :-D).

我認為要說服人學新東西,要遵循:對他有用,讓他感興趣,使他容易學習 三個步驟.

分享一下我最近讓公司同仁對 python 開始感興趣的方法,

對他有用

第一階段是我們團隊的部份原始碼庫從 MS 的系統改到 svn 上.
工作久了,會有個錯覺是世界會這麼一直運行下去,日常使用的工具是世界運行的一環因此不太會思考要改變它.

當自己花些時間讓大家看到新工具 svn/trac 的好用時,趁機跟大家灌輸新一代的工具優點,再若有似無地提到 trac 這強悍的程式整個是 python 寫的。可以勾起大家有點求變的動能.

讓他感興趣

第二階段是最近工作中引入自己用 scapy 做的封包產生器,有的同事發現我用的工具可以跨平台使用,不用花時間架設特別的機器和環境,可以讓測試變得不那麼麻煩,可能就有了想學習的動力.

使他容易學習

第三階段是在適當時機展示一下 python 的簡潔, 讚揚一下 python 程式中非常直觀的列表,字典等內建型態. 程式縮排等寫作原則提都不用提,python 程式的美觀展示時即自然呈現. 如果真的要強調,則是花時間下去學習 python 語法時的事情了.

你的工作裡也有地方用的上 python 嗎?

· One min read

終於收到 TurboGears 官方文件網站的管理權限,可以修改首頁了. 這幾天重新整理了 TurboGears 的官方文件,讓整個學習流程變得更清楚了.

TurboGears 安裝早已變得很簡單, 裝好 python 後,只要抓下 tgsetup.py 後執行就會自動安裝. 不用管是否已安裝了 setuptools 模組或 easy_install 命令.

新使用者可以關注 "教程 (Tutorials)", "使用導覽 (Getting Started Guide)", "安裝 (Installation)" 三個部份.

一些特別的主題如 cookie, session, 傳送 Email, 註冊新使用者等等都被歸類在 "Solving specific problems" 中.

· 2 min read

原本使用 TurboGears 都是拿來做些網站應用程式的原型,享受它帶來的樂趣。現在終於等到一個可以製作實際網站的機會.

我打算使用 TurboGears 的 1.1 (在 SVN Trunk 開發中) 版本開始做一個中文的應用網站. 使用 genshi 做網頁樣板系統和 SQLAlchemy 做 ORM, 並使用 pydev (python) + Aptana (web) eclipse 環境開發.

剛開始玩得很順利:P 直到我發現在預覽網頁時發生了錯誤. 錯誤訊息看起來是有中文的地方會報錯,因此我以為是網頁樣板預設編碼不是 'utf-8' 的問題.

找了半天,到後來直接用瀏覽器預覽時,才發現整個中文部份都變成了亂碼,改編碼為 big5 時才顯示正常。原來罪魁禍首是作業系統和編輯器!

作業系統預設編碼是 big5, 因此照一般輸入方式在編輯器中編輯儲存中文字的結果,當然不是我所期望的 utf-8 囉. 當我改使用 Dreamweaver 來編輯樣版後,一切顯示就回歸正常了. 應該是編輯時 Dreamweaver 會自動幫忙轉碼吧:-D

Anyway, 還是希望能找到個 OpenSource 的網頁編輯器可以做到國際化支援呀.

· One min read

繼 Ruby On Rails 後,最新期的 o3 雜誌專刊介紹 TurboGears

) 中發表了一篇文章 推薦 TurboEntity 這個項目,看起來他蠻推崇這個大量借鑒他的 ActiveMapper 功能的專案的.

TurboEntity 最酷的能耐應該是'self reference', 能參考同個物件的資料 (不知道 Django 的怎樣,SQLObject 不行直接參考,要加一些特別的代碼)

網站上的範例裡拿了辛普森家庭 (The Simpsons) 做例子:

定義四個角色

grampa = Person(name="Abe")

homer = Person(name="Homer") bart = Person(name="Bart") lisa = Person(name="Lisa")

定義人物間的關係:

祖父 - 河馬 - 霸子

                               - 麗莎

grampa.children.append(homer)

homer.children.append(bart) lisa.father = homer

不講的話還真的看不出來這些是存取資料庫中資料的函式.

ManyToOne / ManyToMany 這些函式也是直接呼叫 sqlalchemy 的功能.

· 2 min read

TurboGears 在進入 1.0b 版本後吸引了許多新的使用者, 為了讓安裝 Python 跟 TurboGears 再更簡易. TurboGears 開發者 Kevin 釋出了新的簡單安裝工具 tgsetup.py, 將 SetupTools 與 TurboGears 的安裝步驟合而為一,讓安裝 TurboGears 的過程更簡單. 只需兩個步驟就能安裝好 TurboGears:

1. 安裝 Python

Linux 使用者: 一般說來,你的 Linux 發行版本 (Distribution) 裡早已預裝了 Python, 並且偷偷用在了一些內附的程式中。你可以輸入

$whereis python 來查看它的存在. 如果你是 Ubuntu 的使用者,你需要再安裝幾個必備的套件 $ sudo apt-get install gcc libc6-dev python2.4-dev

Windows 使用者: 到 www.python.org 下載 python 2.4 安裝檔,接著只要按 "下一步" 按鈕就能安裝成功. 安裝成功後需要設定環境變數。進入 "控制台"->"系統"->"進階"->"環境變數", 並選擇 "編輯" path 變數. 在 path 變數前端加入

C:\Python24\Scripts; (安裝路徑 \Scripts) 敘述.

其他平台使用者: 請參考 www.python.org 網站

2. 安裝 TurboGears

各平台使用者都可以從 www.turbogears.org/download/ 下載 tgsetup.py 檔案。在命令列輸入

python tgsetup.py

Windows 使用者可以直接在命令列輸入

tgsetup.py

tgsetup.py 會自動從網路上下載相關的檔案來安裝 TurboGears.

· 2 min read

白話翻譯是:怎麼在 Linux 或 Windows 平台上將 python 的安裝蛋 (.egg) 上傳到 Python 檔案集散地 CheeseShop 上.(取了個白目的標題 XD)

一般來說,要上傳安裝檔到 CheeseShop, 只要輸入

setup.py bdist_egg upload

即可. "bdist_egg" 是通知 setup.py 將我的程式封裝成安裝蛋 (.egg), "upload" 是通知 setup.py 將我剛封裝好的程式上傳至 CheeseShop. (另外一個常用的命令是 "register", 可以直接更新 CheeseShop 上的程式發佈資訊)

但是在 Windows 上使用 setup.py upload 命令一般會得到下面這樣非常無用的錯誤報告:

Submitting dist/your.egg to http://www.python.org/pypi Upload failed (401): Authorization Required

仔細查過文件才發現,原來是在上傳之前,需先建立一個 .pypirc 文件,內容是儲存欲登入 cheeseshop 的帳號密碼。如下:

[server-login] username:james password:password

在 Linux 上,可以在 home 目錄下建立.pypirc 文件;

在 Windows 上則是放在 Documents and Settings 目錄。例如 C:\Documents and Settings\Gasolin

在 Windows 下一般無法編輯 .xxx 開頭的檔案,這時可以在命令列下輸入

edit .pypirc

來編輯 .pypirc 檔案.

編輯完儲存後,需在命令列下設置 HOME 環境變數.

SET HOME=C:\Documents and Settings\James

當設定完成後,就可以輕鬆使用 CheeseShop 提供的所有功能囉!

· One min read

TurboGears 1.0 b1 發佈囉!

在看到這個訊息後我把剛寫好的 TurboJinja 插件也順便發佈了.

和 TurboDjago 模板插件一樣,TurboJinja 可以讓你在 TurboGears 上用 Django 的 template, 只是用 TurboJinja 的話不需要先安裝 Django.

http://docs.turbogears.org/1.0/DjangoTemplating

TurboGears 的 API 在最近這的三個月中幾乎沒有改動, 1.0b1 發佈後,現在 TurboGears 的文件也很齊全了, 正是學習的好時機:-)

· One min read

網路上找到 Algorithms 一書,由於書上都是虛擬碼,試試看用 Python 來做點練習

下面是序章 Prologue 的例子:

目標: 用 Python 實現 fibonacci 數列 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 .....]

Python 程式碼:

def Fib1(n):
"""遞迴函式"""
if n==0:
return 0
elif n==1:
return 1
else:
return Fib1(n-1) + Fib1(n-2)

def Fib2(n):
"""用列表暫存結果"""
f = [0]*(n+1)
f[1] = 1
if n<2:
return f[n]
else:
for i in xrange(2,n+1):
f[i]=f[i-1]+f[i-2]
return f[n],f

if __name__=="__main__":
"""試算結果"""
import time
testtimes = 3

for i in xrange(testtimes):
begintime = time.clock()
print Fib1(30)
endtime = time.clock()
print endtime - begintime

for i in xrange(testtimes):
begintime = time.clock()
print Fib2(30)
endtime = time.clock()
print endtime - begintime

執行結果: 832040 4.24318425945 (Fib1) 832040 7.90603275007e-005 (Fib2)

· 2 min read

Lots of people use Django template for Pyhton Web Framework(As Django project shares).

And if we want to make people feel comfortable to try TurboGears (and then migrate to tg hopefully), first thing we can do is making django template system available on TurboGears.

Its easy because many template plugins (and their source codes) are available for TurboGears, I use a couple hours to read the template plugins doc and make the TurboDjango template plugin.

You can try the django template in minutes. Here is the step by step guide:

Install By SetupTools

$ easy_install TurboDjango

How to Make it just Work?

Step 1. Quickstart

Use tg-admin tool to create a project

$ tg-admin quickstart tgdj

The project name is "tgdj"

Step 2. Edit Controller

Edit tgdj/tgdj/controller.py, add following method in "Root" class.

@expose(template = "django:tgdj.templates.djpage") def page(self): return dict(name="TurboGears") "djpage" is django template name

Step 3. Edit Template

Edit tgdj/tgdj/templates/djpage.html

[h1]Hello, {{name}}[/h1]

The template has "html" file suffix

Step 4. Check Result

In tgdj, start develop server by typing

$ start-tgdj

Then surf http://localhost:8080/page, you'll see

Hello, TurboGears

The Release is available here.

To Django Users: You can migrate your database with SQLAlchemy's SqlSoup

· One min read

利用 TurboDjango Template Plugin, 可以在 TurboGears, Buffet, 或 CherryPy 裡如此這般調用 Django 模板:

在 controller.py 裡

{{{
@expose(template = "django:dem.templates.djpage")
def page(self):
return dict(name="TurboGears")

<div id="qhide_141663" style="display: block;" class="qt">}}}

用 "template" 參數指定樣板時加一個 "django:" 前綴, 或是在設定檔 app.cfg 中將預設的 tg.defaultview = "kid" 改成 tg.defaultview = "django" 就可以在全站使用 django 模板.

djpage 是模板名稱,return dict 後面給的參數群是要傳給模板的參數.

在 djpage.html 裡


[h1]Hello, {{name}}[/h1]
<div id="qhide_141664" style="display: block;" class="qt">}}}

djpage 是模板名稱,html 是檔名

網頁 http://localhost:8080/page 的輸出結果是

"

Hello, {{name}}

"

· 2 min read

Continue to my previous article, here is a configuration using eclipse external tools to start web server without open start-proj.py

Here is a list of the current functionality:

External Tools:

  • Start Server

  • Start ToolboxAccessibility:

  • Auto Completion Configure Eclipse to Launch developer server

  • Select Run -> External Tools -> External Tools

  • Select "Program" from the configuration tree Select New to create a new program Enter “Start Server” as the name Enter C:\Python24\pythonw.exe for the Location For the Working Directory, use ${project_loc}

  • Enter start-${project_name}.py for the Arguments

  • Select the refresh tab and check Refresh Resources Upon Completion

  • Select the Common tab

        *   Find the section for **Display in Favorites Menu**
    * Check **External Tools **option**

    * Select Apply** Configure Eclipse to Launch ToolBox

  • Select Run -> External Tools -> External Tools

  • Select "Program" from the configuration tree Select New to create a new program Enter “Start ToolBox” as the name Enter C:\Python24\Scripts\tg-admin.exe for the Location For the Working Directory, use ${project_loc}

  • Enter toolbox** for the Arguments**

  • Select the Common tab

        *   Find the section for **Display in Favorites Menu**
    * Check **External Tools **option**

    * Select Apply**

Auto-completion

  • Select your project in Navigator panel
  • Select Properties on Right click menu.
  • Select pyDev - PYTHONPATH Select Add source folder to add project path in Project Source Folder. it will bring project code-completion and code-analysis.
  • Select Add source folder to add turbogears path in External Source Folder.

it will bring turbogears code-completion PS: I get idea from the rails article, but for mine, you'd have eclipse & pydev installed, I recommand you try EasyEclipse for Python.

· 2 min read

NOTICE: This Article is updated for 0.9w3

I recently update my TurboGears PlotKit widget. This version(0.9w3, 0.9 is origin lib's version, w means 'widget')

To get these widgets, easy_install them :

$easy_install plotkit

Then, you can Check the demo in TurboGears toolbox :D

How to try it? Well, it's extremely simple.

For a fresh quickstart site,

In controllers.py:

from plotkit import EasyPlot

class Root(controllers.RootController):
@expose(template="wgtest.templates.welcome")
def index(self):
setA = [[0,0], [1,2], [2,3], [3,7], [4,8], [5,6]]
setB = [[0,0], [1,1], [2,4], [3,8], [4,7], [5,20]]
setC = [[0,1], [1,3], [2,5], [3,5], [4,3], [5,2]]
return dict(ep= EasyPlot(id="diag",
style="line",
width="300",
height="300",
data=[setA, setB, setC]))

In welcome.kid:

${ep.display()}

add this script into html "body".

Explain:

from plotkit import EasyPlot

First of all, import the proper widget. (origin PlotKit widget is still availbe)

return dict(ep= EasyPlot(...))

return the "ep" diagram instance to template

${ep.display()}

display the diagram in template

Parameters:

id: (diag) The Diagram's Identifer (Element ID)

style: (line) The diagram could be plot as a "line", "pie", or "bar"diagram.

width, height : (400, 400)

The diagram's size

data : Datasets is structured with [[x,y],[x1,y1],....]

option : options of both Layout and Renderer (dictionary style), need be a string

The origin example is here.


History 0.9w3 07/04/2006: more flexible EasyPlot dataset 0.9w2 : fix bugs and add a EasyPlot() widget to plot a diagram within the code.

The svn repository is in Sourceforge, you can share your TurboGears widget there, too.

known limit: current widget's option param suppor is not very OO, you need pass the dictionary in string format (can't recognize "v", "label")

· One min read

習慣用微軟 VisualStudio 或用 Java 的人用了 python 語言, 通常會挑剔 python 語言沒什麼好用的 IDE 來搭配.

現在 EasyEclipse 有提供包好的 eclipse + pydev (eclipse 平台上的 python 語言支援 -) + Subclipse (eclipse 平台上的圖形化 SVN 版本控制工具) http://www.easyeclipse.org/site/distributions/python.html

簡化了 eclipse 平台安裝設定上的繁瑣,拿來做 python 程式開發其實還蠻不賴的,

· 3 min read

補充一點心得:

如果你的網頁應用服務主要關注在 AJAX 應用,大部分動作都用 javascript 在客戶端完成,

只有 data 部分需要後端提供。那麼 TurboGears 是非常適用的選擇.

1. 可以先用一般 serverside 開發方式寫函式和建立網頁應用服務原型 (prototype),

來測試你的網頁應用服務該有的功能.

@expose (format = ".template.pages") #資料以樣版格式顯示 def method (self): .... return dict {data=data} 因為 TurboGears 中從傳入 serverside 的表單資料處理一致,

所以在 serverside 寫的 code 完全可以繼續使用,

不必為了支持 AJAX 重寫,很好的達到不重複自己 (DRY) 的效果.

2.import javascript library , 將資料改以 JSON 格式傳到網頁

from turbogears import mochikit ... @expose (format = ".template.pages") #資料以樣版格式顯示 @expose (format = "JSON") #資料以 JSON 格式顯示 def method (self): .... return dict {data=data, scripty = mochikit} #在網頁上

TurboGears 預先包好 mochikit, scriptaculous, plotkit 等 javascript 庫,

使用時可以用程式呼叫,預設可用 JSON 格式傳輸,

預設 mochikit 庫提供相應資料處理支援.

3. 在 client 端用 javascript 處理 DOM 物件.

因為在開發的第一步時已經能將所需的資料,傳輸內容等都處理好了,

能確信資料傳輸的正確性。所以開發 javascript 時,可以專注在網頁內資料處理的部分.

在這時遇到 bug 的話也可以很放心地將可能的問題點縮小到單純網頁內資料處理的範圍,

因而 AJAX 開發時最麻煩的交叉 debug 也變得更容易.

因此如果你的網頁應用服務主要關注在 AJAX 應用,那麼 TurboGears 是非常適合的選擇.

· 2 min read
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#E1E1E1">
<tbody>
<tr>
<td colspan="4" nowrap="nowrap"><span class="style1">TurboGears Widgets </span></td>
</tr>
<tr>
<td colspan="2" nowrap="nowrap" class="style1">Form Elements</td>
<td colspan="2" nowrap="nowrap" class="style1">HTML Imports</td>
</tr>
<tr>
<td> 1 </td>
<td> Button </td>
<td>1</td>
<td>CSS Link </td>
</tr>
<tr>
<td> 2 </td>
<td> Calendar </td>
<td>2</td>
<td>CSS Source </td>
</tr>
<tr>
<td> 3 </td>
<td> Calendar with time </td>
<td>3</td>
<td>JS Link</td>
</tr>
<tr>
<td> 4 </td>
<td>CheckBox</td>
<td>4</td>
<td>JS Source </td>
</tr>
<tr>
<td> 5 </td>
<td> File Field </td>
<td>5</td>
<td>Localizable JS Link</td>
</tr>
<tr>
<td> 6 </td>
<td> Hidden Field </td>
<td colspan="2" nowrap="nowrap" class="style1">Form Components</td>
</tr>
<tr>
<td> 7 </td>
<td> Image Button </td>
<td>1</td>
<td>CheckBox List </td>
</tr>
<tr>
<td> 8 </td>
<td> Label </td>
<td>2</td>
<td>FieldSet</td>
</tr>
<tr>
<td> 9 </td>
<td> Multiple Select Field </td>
<td>3</td>
<td>RadioButton List </td>
</tr>
<tr>
<td> 10 </td>
<td> Password Field </td>
<td>4</td>
<td>Repeating FieldSet</td>
</tr>
<tr>
<td> 11 </td>
<td> Reset Button </td>
<td colspan="2" class="style1">Table / Form</td>
</tr>
<tr>
<td> 12 </td>
<td> Single Select Field </td>
<td>1</td>
<td>DataGrid</td>
</tr>
<tr>
<td> 13 </td>
<td> Submit Button </td>
<td>2</td>
<td>List Form </td>
</tr>
<tr>
<td> 14 </td>
<td> Text Area </td>
<td>3</td>
<td>Table Form</td>
</tr>
<tr>
<td> 15 </td>
<td> Text Field </td>
<td colspan="2" class="style1">AJAX</td>
</tr>
<tr>
<td colspan="2" class="style1">Form UI</td>
<td>1</td>
<td>AJAX Form</td>
</tr>
<tr>
<td> 1</td>
<td> Jump Menu</td>
<td>2</td>
<td>Ajax Grid</td>
</tr>
<tr>
<td>2</td>
<td>Syntax Highlighter</td>
<td>3</td>
<td>Ajax remote function</td>
</tr>
<tr>
<td>3</td>
<td>Tabber</td>
<td>4</td>
<td>Auto Complete</td>
</tr>
<tr>
<td colspan="4">Find more widgets in [TurboGears Cogbin](http://www.turbogears.org/cogbin/)</td>
</tr>
</tbody>
</table>

· 5 min read

很難用簡短言語表述這種互動開發的經驗。真的要稍微描述的話,那是一種不管你想要怎麼進行下一個開發步驟時,TurboGears 都幫你準備好了各種基本工具的感覺.

在學習 TurboGears 之後,我用 TurboGears 框架試做了一個網路模擬架構產生器,發現使用 TurboGears 寫操作到表單的網頁應用程式實在超方便.

很難用簡短言語表述這種互動開發的經驗。真的要稍微描述的話,那是一種不管你想要怎麼進行下一個開發步驟時,TurboGears 都幫你準備好了各種基本工具的感覺.

(以下不包含程式碼).

設計考量

產生器程式裡使用到大量小塊的表單,用上 AJAX 技術可以大幅縮短來來回回修改的時間,增進使用者經驗.

採用 ' 內容為中心 ' 的開發方式,controller 中盡量只返回與內容有關的資料。所有內容展示都在樣版跟 javascript 中產生.

開發之初就可以預見程式中將會出現相對大量的 Javascript 程式碼,我盡量採用 AJAX in Action 中提到將程式碼跟網頁分離的方式實做,將 Javascript 用 import 的方式包含進網頁.

原型階段 在 protocontroller.py 中新增一個方法函式,在其中手動建立一個列表 (預見將來將改成從資料庫中讀出), 返回列表到網頁,作為剛開始要傳入網頁的資料.

建立一個剛剛的方法函式所用到的樣版 (template), 在樣版中建立一個表單,來讓使用者選擇傳入的資料。並提供一個給使用者互動用的按鈕.

使用者按下互動用的按鈕後,利用 mochikit (TurboGears 內建的 javascript 函式庫) 提供的 DOM 處理參數,由使用者選擇的選項來動態創建進一步的表單與第二個互動用的按鈕.

使用者填好相關資訊,按下第二個互動用的按鈕。傳回資料到另一個方法函式, 取得下一個頁面.

exception: 使用者修改原來的選擇,按下互動用的按鈕後,利用 mochikit 提供的 DOM 處理函式更新原本動態產生的內容.

AJAX 網頁 使用 mochikit 提供的非同步 (Async) 處理函式,從伺服器取回資訊.

感想 AJAX 非同步處理部分需要 server /client 一起配合才行,因此對一個網頁框架而言,不是單純加上一個 AJAX 函式庫,這個框架就可以說是支援 AJAX. TurboGears 在這點上合格了!

開發時很妙的地方是 Turbogears 處理表單參數 (POST) 跟網頁參數 (GET) 的方式是一致的,所以原本 controller 中寫好的程式根本不怎麼需要修改.

Turbogears 返回的資料除了給樣版用之外,要回傳 JSON 格式只要在 uri 後加上 '?tg_format=json' 即可,也不必做額外處理.

javascript 很多語法跟 c 和 python 相似,mochikit 函式庫更是借用了很多 python 的使用方式,因此實際寫起來 client/server side 程式,轉換間並不感到太過突兀.

到目前使用上還沒發現 TurboGears 沒有 url mapping 有什麼壞處,要用 url mapping 的話再裝 routes 不遲.

· 3 min read

在 OSDC tw 上 Marr 提到辦 Python 雙週刊的想法, 預計出版方式採雙週報的方式,內容有 python 相關網摘, 原創文章,翻譯文章等. 我覺得這是個很棒的提議. 回來後一直很期待有進一步消息.

這週回到家來,想想既然是 Open 計畫, 小弟也試著來推動一下,好讓這個好想法更快實現.

要辦 Python 雙週刊首先是要做好基礎建設.

基礎建設包含選定使用平台,決定授權方式, 接下來則是決定收稿方式,內容管理與出版方式.

我提出我的參考實作方法:

基礎建設部分,小弟在 OSSF 上用 "pythonext", "python 時代雙週刊 " 的專案名稱申請 http://rt.openfoundry.org/Foundry/Project/index.html?Queue=550

接下來收稿方式與內容管理方面, 召集人似乎已經有些腹案了, 在此小弟建議增加一種從 TurboGears 社群學來的收稿方式: wiki.

在 OSSF 共同筆記區中開闢一塊 "DocumentPlayGround", 用來寫隨筆,寫下簡單的 recipes, 創作文章草稿,

OSSF 也提供 maillist , 可以在 maillist 上討論.

最後是出版方式, 對最後出版方式我還沒很明確的概念, 但是我可以看到的是利用 OSSF 的檔案庫, 我們可以提供所有出版的 Python 雙週刊下載.

利用版本控制系統, 我們未來還可以做到針對有更新價值的文章更新, 或是計畫用 python svn 模組動態獲取這雙週中版本控制系統內更新的內容, 組成新一期的雙週刊 :)

有興趣加入 Python 雙週刊計畫的大哥大姐們先來加入計畫吧, http://rt.openfoundry.org/Foundry/Project/?Queue=550 這是最直接統計 雙週刊辦不辦得起來的方式 :-P

小弟目前只是協助做好初步的基礎建設, 大家有了共同的 Base, 能開始討論更進一步的 Python 雙週刊運作才是我的希望

-- 使用平台: OSSF 授權方式:未定 (待議)