Thursday, October 30, 2008

Python 與 Zope 入門

Python 與 Zope 入門

前言

如果你是程式語言的新手,恭喜你,因為這裡介紹的正是合適入門的開放源碼語言工具;如果你是其他語言的老手,同樣恭喜你,因為這裡介紹的內容,很可能是你正在尋找的出路…


對於已經愛上開放源碼的朋友來說,每個人都有屬於自己和開放源碼之間的機緣與情愫,以我為例,當初是因為對搖滾樂的熱愛,而一步一步地走進這片自由開放的天地。

先讓時間回到 1995 年,那時候我是一個泡在電腦教室裡,一待就是十小時的政大學生,除了迷上 TANet 所流行的校園 BBS 之外,Internet 上有趣的新鮮玩意,還有 Gopher、Newsgroup、IRC 等。在新學期開始沒多久,我依舊快樂地享受網路世界的冒險之旅,無意間看到在電腦教室外行色匆匆的鳥合 (陳彩合),他跟我說道「等一下我會介紹 World Wide Web,你有沒有興趣來聽?」當然囉,難得鳥合不再開口閉口講我聽不懂的 sendmail,當下跟著進教室聽他介紹 WWW 這個「網路新名詞」。

初見 WWW 的感受,對我啟迪很大,原本想要拜師學 C 語言以及當 BBS 站長的我,沒多久就跟師父 - 黃志中講,「我覺得 WWW 才是值得投入的千秋大業啊」。現在來看,猶能感受當初那股「不知天高地厚」的傻勁。

沒多久,我就利用自己在學校宿舍的 486 PC,以 Linux 和 Apache 架起了一個陽春的 Web Server,內容就是介紹我最喜愛的搖滾樂團,期間還收到一些令我驚訝的回應與鼓勵。接著,我和網友死黨們,在政大校園裡組了「網路應用推廣社團」,打 算仿照交大 CCCA 運作模式,以政大學生宿舍、學生社團、行政服務為先期焦點,介紹各式網路應用並協助其普及。

後來的事就不難想像啦,因為自己花了一些時間在玩電腦網路,大學畢業前,就打算從財管系再換跑道到資管研究所,而且從原本想要當 Unix 維修工程師,變成現在的 Open Source 工作者。好啦,如果要用 500 字講自己和開放源碼的因緣,就是這些了。

初識 Python 與 Zope

在 2000 年底之際,我想要尋找一個 WebDAV 伺服器的開放源碼實作品,無意間遇上了 Zope 這套 Web Application Server,在 Zope 的簡介資料中,發現它是以 Python 程式語言所開發完成,因此機緣,讓我踏上學習與享受 Python 的這條路。Python 與 Zope 都是非常值得介紹及推廣的開放源碼工具,我很高興能夠利用這個機會,將自己所知的心得經驗分享給同好。相信 Python 的易學易用,能讓新手輕鬆上路,享受撰寫程式的樂趣和成就感,Python 廣大的模組功能支援,能讓擁有「懶惰美德」的程式人員,快速搞定原本惱人的開發需求。如果你是尋求大型網站系統解決方案的程式人員、資料庫管理人員,或是 內容管理人員,Zope 系統絕對是值得你留意及投入的開放源碼應用工具。

難以寫出優美程式碼的語言,勢必也難以寫出優秀的程式碼。
A language that makes it hard to write elegant code makes it hard to write good code. -- Eric S. Raymond

什麼是 Python ?

從技術層面來看,Python 是一種物件導向式 (object-oriented) 程式語言的名稱,它具備直譯式 (interpreted)、互動式 (interactive)、模組化 (modular) 的功能及特色,經常被拿來與 Visual Basic、Perl、Java 等程式語言相提並論。Python 語言的作者是Guido van Rossum,最早在 1990 年之際開始進行發展,其程式實作迄今已普遍存在於各式作業平台上,例如 Linux、UNIX、Windows、Mac、OS/2 等。其他相關的延革資訊,請參考列表1所示。

圖1 Python 語言之父 -- Guido van Rossum

Python 同時也具備動態定型 (dynamic typing) 的特性,程式人員不需要宣告變數型態,其內建物件型態 (built-in object type) 包括 list、dictionary、string、tuple等,能夠滿足最常見、最重要的應用需求,其內建的工具 (built-in tool) 包括 slicing、concatenating、sorting、mapping 等,能夠協助程式人員專注於處理最關鍵的技術議題,其內建的函式庫包括網路服務 (http、ftp)、檔案處理 (regular expression、HTML、XML、socket) 等,在圖形介面的選擇上,較引入注目的包括有 wxPython (如圖2所示)、PyGTK (如圖3所示)、PyQt 等,此外還有豐富的線上文件,可參見列表2。

圖2 以 wxPython 示範 Unicode 應用服務

圖3 PyGTK 程式示範畫面

Python 語言的執行檔格式 (常見之執行檔副檔名為 .pyc),與 Java 語言的 byte code 格式類似,byte code 執行檔具跨平台特性,例如可從 Windows 上複製到 Linux 直接可用,反之亦然。值得一提的是,它可以和其他語言進行結合,具有良好的「黏膠」(gluing)功能,例如透過「擴充機制」(extending) 來讓 Python 執行另一個 C++ 程式,透過「內嵌機制」(embedding) 來讓 Python成為 C/C++ 等應用軟體的一部份。如此一來,開發大型應用軟體時,使用 Python可以達到快速開發 (rapid model and development) 的效果,同時也內嵌 C/C++ 程式,以便改善執行效率的瓶頸點。

從 Python 2.1 開始,其核心納入了 PyUnit 模組,協助程式人員利用它來體驗 Extreme Programming (XP),同時,XP 的精神也很自然地能夠吸引 Python 程式人員。以 Zope 開發社群為例,程式人員經常巡迴舉辦世界各地的「衝鋒編程聚會」(Sprint Coding Party),由資深的核心軟體開發人員擔任「教練」,透過小組型式,讓程式人員在最短的時間內完成特定的程式開發目標。[註1]

從非技術的角度來說明,Python 是一種高階的通用式 (general purpose) 手稿 (scripting) 語言,藉由包裝良好的套件檔案 (如 Windows 的 Installer 或 Linux的 rpm 工具程式),新手很容易就能安裝最新版的 Python 工具,如圖4所示。對於一時之間離不開 Windows 平台的朋友,我特別推薦使用 cygwin 工具軟體,其內附的 Python 程式及操作環境,能夠提供相當完整的基本服務,如圖5所示。

圖4 Windows 平台上的 PythonWin 示範畫面

圖5 cygwin 裡的 Python 操作示範畫面

Python 具有語法簡易、結構清楚的特色,在撰寫 Python 程式碼的過程中,很容易享受到「碼隨意至」的直覺快感,不會有思路阻塞的困擾。同時,它利用縮排方式,協助程式人員能夠對原始碼有一目瞭然的感受,有助於 新手快速入門起步。如果你想要找尋類似 Perl 社群的 CPAN 程式碼倉庫,參考許多 Python 好手所貢獻的原始碼,那麼別錯過 SourceForge.net、Freshmeat.net、Starship.Python.net 或 Vaults of Parnassus 網站,對於想要學習程式的朋友而言,裡頭稱得上是知識的大寶山呢。

開放源碼授權

絕大部分的 Python 程式為 Python 軟體基金會 (Python Software Foundation )所有,但整個 Python 程式皆受 Python License 規範 [註2]。其授權方式主要特色包括:

  • 自由使用: 商業或非商業皆可,內嵌或擴充都不用付授權費。
  • 自由散佈: 以原始碼或二進位元 (binary) 方式散佈原版或修改過的 Python 都可以,也可以用二進位元方式散佈你的 Python 擴充模組。
  • 在你散佈的版本中,不可以移除 Python 軟體基金會的版權宣告。
  • 開放源碼創進會 (Open Source Initiative) 已認證 Python License 為開放源碼的授權條款。
  • 自由軟體基金會 (Free Software Foundation) 也認定 Python License 和 GPL 相容。

    開放源碼世界的程式語言選項很多,Python 確實只是其中的一個優秀選擇,對我而言,選擇它最關鍵的原因有二,一來 Python 是「極佳的入門踏腳石」,二來 Python 具有殺手級應用軟體 - Zope (甚至是 Plone 這樣的工具)。

    我個人稱不上是一位軟體工程師,平常若有編寫程式的機會,大抵是自己餘暇的娛樂享受,但我能夠體會程式人員想要與人分享編寫程式甘苦的心情。Python 與 Zope 社群所營造的活潑、和諧、開放氣氛,是促使我要把這個好工具介紹給身邊朋友的動力。

為什麼要學 Python ?

長期以來,台灣以資訊硬體的代工生產成就聞名於世,但在軟體方面的發展,目前仍位居全球的邊緣化位置。全球的華人都很聰明勤奮,台灣人也呈現類似的 特質,如何從這樣的良好特質出發,讓台灣的軟體發展現況有所改善呢? 此刻來看,華人在軟體部份的投入,主要也是以「代工型式」進行,拿美國的大型軟體公司或網路公司做例子,其軟體工程部門,很多就是印度或華人工程師,他們 在美國的創業環境中,以優異的「數理能力」與「語文溝通訓練」為基礎,成為軟體公司裡「編程部隊」的主要成員。

對照上述的例子,在台灣有心投入軟體發展的朋友,還能多做些什麼呢? 至少有個工作項目,就是推廣程式語言的學習與應用,而 Python 語言就是我認為極佳的入門選擇。一個軟體工程師的養成,大抵需要從「數理邏輯基礎」、「語文溝通能力」紮根,並且具備「樂於不斷學習與創作」的人格特質, 應用 Python 語言及其開發環境,能夠讓一位軟體工程師立於非常理想的學習起點。

從教育紮根

老師對學生具有相當大的潛移默效果,台灣的資訊教育工作人員,多數期望能夠引導學生「合情合理合法」地獲得學習工具及資源,但坊間能夠提供給老師的 教材種類及型式還不夠多樣,以致老師們只能牽就於特定廠商所提供的教材手冊,甚至間接影響學生使用了非法取得的程式開發工具,造成老師與學生雙方的困擾。 這部份的問題,可以嘗試改用開放源碼的程式開發環境及工具來避免,因為開放源碼授權的軟體,非但可以免費或低價取得,也歡迎再複製、修改、散佈給其他人, 非常有利於教學研究的場合。

不過,開放源碼的程式設計工具書,大抵也還有不足之處,目前坊間以 PHP 或 Perl 的應用類書籍居多,英文版的 Python 書籍 (參見列表3),質與量雖然也開始增加,但中文的書籍、網路資源及介紹專文,都有許多值得提昇之處。在此,這篇文章算是我個人的棉薄貢獻,真心期盼有拋磚 引玉之效,邀請更多同好共同投入,可以參與的項目包括翻譯計畫、同好聚會、技術交流、訓練課程等。[註3]

Python 這項工具擁有許多迷人的特色,整理如列表4所示,目前在開放源碼世界裡相當受到好評,許多活躍的 Python開發人員,是來自於歐洲、美加、澳洲等地,大陸地區最近也開始活絡起來。雖然台灣的市場現況,Visual Basic 或 Java 似乎還是商業主流選擇,但仍然並未影響我個人的願望,就是要在華人地區推廣 Python 程式語言,當作中學生的程式設計入門工具,因為從 Python 入門之後,要進一步去學習與應用 C/C++ 或 Java,也都是相當輕鬆自然的事,不會有學習成果浪廢的顧慮。

如果,你對於 Python 的教育推廣議題有興趣,歡迎參加「全國中小學校園自由軟體應用諮詢中心」的通信論壇區 [註4],這個通信論壇是由軟體自由協會(Software Liberty Association of Taiwan, SLAT) 在教育部的補助下所建置,目前已有包括 Python、Zope、PHP、MySQL 在內的課程在進行。

哪些人在用 Python ?

若參考 Python 在各大軟體開發單位的實際應用狀況,知名的例子包括有:Yahoo! 網站的 Maps 與 Groups 服務,都使用 Python 來進行開發;Google 網站從創業之初,其工程師就利用 Python 來開發搜尋引擎功能,目前他們公司仍然急需更多 Python 工程師;美國太空總署 (NASA) 利用 Python 來實作下一代新式的 CAD/CAE/PDM 大型應用系統,他們認為 Python 提供的強大功能與彈性,完全能滿足目前的需求。

幾個常見的 Python 應用程式,諸如 mailman 通信論壇、Red Hat Linux 的安裝程式 Anaconda、PyGame遊戲軟體模組群等。除此之外,Python 在各行各業中也被廣泛應用,著名的成功案例,包括生物資訊產業、製藥業、半導體製造業、電影動畫產業、電腦遊戲產業、金融銀行業、太空科學領域等。其他更 多的應用資訊,可以在 Pythonology 網站 [註5] 上看到。

進一步來看,程式語言是軟體開發過程中的底層工具之一,上層的開發環境與框架 (framework) 也常是程式人員關心的議題,以網頁應用軟體開發 (Web Application Development) 這個領域為例,Zope 就是目前多數 Python 程式人員共同參與的開發框架及實作軟體,同時,在歐洲就興起許多靠 Zope 這套開放源碼軟體,所衍生出顧問、訓練、客製化服務的商業模式,知名的例子有 Beehive、Zope Magazine、Ingeniweb、Nuxeo、REFLAB、Zettai.net 等。

類似的服務及商業模式,此刻也在大陸地區興起,潤普科技 (ZopeChina) 就是其中的一例,而且同樣伴隨有 Python 與 Zope 的社群,稱為「中國 Zope 用戶組」(CZUG.org)。相對來看,目前台灣的 Python 與 Zope 開發人員,其凝聚力仍未跨過組成商業公司的門檻,還有待強化程式人員之間的連結。值得一提的是,在學術界倒有展開一些開發及應用實例,諸如中研院資訊所的 ShareTone 專案,是一個以 Zope 為開發平台的協同溝通系統;而長庚大學黃朝錦老師的 LiveZope 專案,則是採用 Knoppix 為基礎的 Zope 應用光碟。上述兩項專案,都在開放源碼軟體競賽中獲獎,具有應用示範的效果。

什麼是 Zope 及 Plone ?

Zope 指的是 Z Object Publishing Environment,它是以 Python 程式語言為基礎的 Web Application Server 框架及實作品,其框架概要如圖?所示。每次我用技術性的方式展示 Zope,效果總是有限,因此這裡想要倒回來介紹。簡單地說,有了 Zope,就可以讓人快速擁有一部「架站機」開發平台,類似的例子有 WebSphere、Enhydra 等,如果你希望馬上有個又炫又貼心的快速架站機,即類似XOOPS 這樣的軟體工具,那麼還可以使用以 Zope 及 CMF (Content Management Framework) 為基礎所強化的 Plone 工具軟體。

圖6 Zope 系統框架概要示意

簡言之,Python 的殺手級應用是 Zope,而 Zope 的殺手級應用是 Plone,從 O'Reilly 在「開放源碼社群送進 COMDEX」競賽中 [註6],Plone 與Zope 的勝出結果來看,目前社群朋友對 Plone 的喜愛與支持正在熱頭中。另外值得一提的是,第一屆 Plone 研討會也在 2003 年十月間舉辦,會場中揭示了許多 Zope及 Plone 的最新發展規劃,包括 Subversion 與 Plone 的結合,以及 XML 使用者介面的搭配。

Plone 是一個整合過的軟體工具,最容易上手的方式,就是下載 Plone 在 Winodws 平台上的安裝程式,如圖7所示,然後過程中「按下一步」即可,如圖8所示。

圖7 Winodws 平台上的 Plone 安裝畫面

圖8 完整安裝 Plone 的選項畫面

Zope 與 Plone 的發展歷史

在 1996 年之際,Zope 的作者 Jim Fulton 受邀擔任 Web CGI 程式設計的講師,原本不大懂什麼是 CGI (Common Gateway Interface) 的他,在不滿意 CGI架構方式下,重新以 Python 語言開發了幾個提供網頁物件出版功能的模組,這些模組分別稱為 Bobo、Document Template、BoboPOS,後來在繼續擴充模組的情況下,Zope 的前身於焉誕生,Jim Fulton 並組成一家 Digital Creations 公司展開 Zope 的開發及商業化路程,現在,Digital Creations 公司已經正式更名為 Zope 公司,宣示 Zope 在商業化市場上更堅定的腳步。

Zope 系統最早是針對新聞媒體界的應用需求所設計,因此除了一般的會員管理 (membership management)、安全機制 (ACL management)、內容物件管理 (content object management)、搜尋引擎與索引 (catalog and indexing) 之外,也很快納入版本管理 (version control management) 以及工作流程管理 (workflow management) 等服務。這些大型入口網站所必備的服務功能,Zope 公司的工程人員,特別以一個稱為 CMF (Content Management Framework) 的開放源碼專案獨立開發,由於 CMF 擁有良好的擴充及延伸彈性,引發更多奠基在 CMF 之上的改善計畫,Plone 就是這類專案計畫中的佼佼者。

CMF 是一個在 Zope 開發環境之上的入口網站服務架框,由於它的開發焦點是在基礎服務模組的研發與測試,長久以來都有不夠穩定,介面不夠美觀、易用度不高的缺點,Plone 專案計畫的主持人 - Alan Runyan 與 Alexander Limi,便接手解決上述的問題,沒想到這樣的改善構想,迅速吸引廣大開發者的認同與參與,Zope 與 CMF 便退居 Plone 這顆閃亮巨星幕後了。

中文支援狀況及其他

提 Zope 及 CMF 的同時,真的得好好介紹 Plone 一番,因為我們所關心的「中文化議題」,Plone 開發團隊照顧得相當貼心,這也是 Plone 在歐洲地區廣受歡迎的主因之一。

Plone 與 Zope 都是以 Python 語言為基礎所開發,因此 Python 本身的多國語文支援能力,也就變成「天生限制」了。新版的 Python 早已經支援 Unicode 內碼,加上我們也下載得到 Chinese codedec 檔案,Python 底層的內碼轉換工作大抵沒問題,且讓我們觀察一段 Python 的測試,以瞭解其基本的運作原理,如列表5所示。值得一提的是,「許功蓋」問題要注意到反斜線。

大陸地區的社群朋友貢獻了 ChinaPack 及 CJK Splitter 工具,用以協助處理Zope 系統裡的中文斷字斷詞問題。最後,再搭配 Page Template 的 I18N 支援,Plone 使用者只要利用合適的本地化模組 (localizer),就可以輕鬆地擁有多國語文版本的入口網站系統。簡單地說,因前人的努力,後人就可以乘涼,這也是開放源碼開發模式的優勢所在。有 興趣參加 Plone 的多國語文工作小組 (I18N Team) 的朋友,別忘了到 http://plone.org/development/teams/i18n/ 網址找尋更多資訊。

另外,如果有朋友想知道 Python 及 Zope 開發環境下,是否具有不錯的整合開發工具 (IDE tool),在此優先推薦 WingIDE 這套軟體,但它並不是開放源碼軟體,其操作介面如圖9所示。

列表 5 Unicode 物件的指定及操作方式

>>> big5str = 這是 Big5 中文字串
>>> ucsstr = unicode(big5str, big5-2003)
>>> ucsstr
u'\u9019\u662f Big5 \u4e2d\u6587\u5b57\u4e32'
>>> print ucsstr.encode(utf-8)
\xe9\x80\x99\xe6\x98\xaf Big5
\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97\xe4\xb8\xb2

>>> print ucsstr.encode(big5-2003)
這是 Big5 中文字串

圖9 WingIDE 執行偵錯模式的畫面

後記

在本文中,我刻意讓內容摻雜技術與人文的元素成份,因為,我相信「科技始終來自於人性」,電腦網路只是人們進行溝通與創作的工具,程式語言是人類與 機器的溝通型式,軟體是人們模擬現實世界的創作成果。謹將本文獻給我的父母,當我還是個國三學生時,很幸運地家裡就有一台宏碁 PC,是它讓我開啟通往電腦世界的窗。

這篇文章是一系列 Python 與 Zope 介紹的開端,希望你會喜歡它,下期我們將進一步介紹如何以 Plone 工具軟體,快速建置入口網站系統,並進行客製化。

Python 之發展延革

  • 一九九一年由 Guido van Rossum 於阿姆斯特丹大學創作及發展。
  • 二○○○年至二○○三年七月間,Python 語言由 Zope 公司支援的 PythonLabs 所維護開發,開發團隊的領導人仍為 Guido,但目前他已離開 Zope 公司。
  • 早期 Python 以 C 語言為基底撰寫而成。
  • 以 Java 語言為基底的 Python 語言實作 - Jython 正在發展,並整合 Microsoft .NET 架構。

學習 Python 的網頁資源

如果你是 Python 初學者,可以從下列的 Python 學習資源列表挑選幾篇來閱讀,這些資源都可在網路上免費取得:

  • Python 簡介 -- Python.org 網站上的教學列表。 http://www.python.org/doc/Intros.html
  • Python 教學手冊 -- Guido van Rossum 所撰寫的 Python 教學手冊。 http://www.python.org/doc/tut/
  • 編程學習手冊 -- Alan Gauld 所撰寫的編程教學手冊,除了強調 Python 語言之外,也包含其他程式語言。 http://www.freenetpages.co.uk/hp/alan.gauld/
  • 電腦科學家是這樣想的 (Python 版本) -- http://www.ibiblio.org/obp/thinkCSpy/
  • 深入學習 Python -- 針對有經驗程式人員的免費教學手冊。 http://diveintopython.org/

學習 Python 的四本好書

坊間已出現越來越多 Python 書籍,不過,中文版本的還不算多,有賴更多社群好手投入。

  • The Quick Python Book -- by Daryl D. Harms, Kenneth McDonald, Manning Publications Company 2000
  • Practical Python -- by Magnus Lie Hetland, Apress 2002
  • Text Processing in Python -- by David Mertz, Addison Wesley 2003

Python 的特色

    和其他知名的手稿語言 (script language) 相比,Python 具有下列特色:

  • 物件導向式 (Object Oriented)
  • 直譯式、交談式 (Interpreted, Interactive)
  • 跨平台 (Cross Platform)
  • 容易安裝 (Easy Installing)
  • 易學易用 (Easy Learning)
  • 語法結構清晰 (Clear Syntax and Structure)
  • 延伸與內嵌 (Extended and Embedded)
  • 開放源碼 (Open Source)

說明 網址

Python 資源列表

  • Python 主網站 http://www.python.org/
  • wxPython http://www.wxpython.org/
  • PyGTK: GTK+ for Python http://www.pygtk.org/
  • PyQt http://www.riverbankcomputing.co.uk/pyqt/
  • Vaults of Parnassus: Python Resources http://www.vex.net/parnassus/
  • PyGame http://www.pygame.org/
  • 葉平老師的 PythonCourse Wiki http://wiki.scicos.net/PythonCourse

Zope 資源列表

  • Zope.org http://www.zope.org/
  • Zope Magazine http://www.zopemag.com/
  • Content Management Framework http://cmf.zope.org/
  • Plone http://www.plone.org/
  • 全國中小學校園自由軟體應用諮詢中心 http://www.ossacc.org/
  • ShareTone Project http://www.sharetone.org/
  • LiveZope Project http://zope.org/Members/cchuang/LiveZope-0.1.2_released
  • Zope China http://www.zopechina.com/
  • Zope Newbies http://www.zopenewbies.net/
  • ZopeLabs http://www.zopelabs.com/
  • Zettai.net http://www.zettai.net/
  • WingIDE http://www.wingide.com/
  • Beehive http://www.beehive-eu.com/
  • tcchou http://blog.tcchou.org/
註1: Zope 3 UI Sprint
http://www.zope-europe.org/sl2003/uisprint

註2: Python 授權條款的細節
http://www.python.org/psf/license.html


註3: Python 於教育領域之推廣應用
http://www.python.org/sigs/edu-sig/


註4: 全國中小學校園自由軟體應用諮詢中心 PyZope 通信論壇
http://list.ossacc.org/mailman/listinfo/ossacc-pyzope


註5: 在 Pythonology 網站上整理有成功案例
http://www.pythonology.com/success


註6: O'Reilly 的 "Open Source Goes to COMDEX" 投票競賽結果
http://www.oreillynet.com/contest/comdex/


作者簡介

胡崇偉,現職是中研院資訊所研究助理。專長是技術文件撰寫、Linux 系統整合、數位學習系統,興趣是英式搖滾、認知心理學、佛學、開放源碼,想要到北歐旅行。電子郵件:marr @iis.sinica.edu.tw。

No comments: