第 170 期 不做 NoSQL 的 CouchDB─自由軟體鑄造場電子報─智邦公益電子報
enews.url.com.tw · February 07,2012[源碼快訊] Debian 資深開發者來台分享 Debian Community 的參與方式
OSSF/編述
Debian 是一個自由的作業系統 (Operating System, OS),提供一般人能自由地下載、安裝在電腦上使用,其由致力於創建自由作業系統的組織-Debian Project 所維護。Debian Project 完全由志願者所組成,背後沒有任何公司或機構直接支援。本月 4 月 22 日傍晚,中華民國軟體自由協會 (Software Liberty Association of Taiwan, SLAT) 與台北科技大學,將共同邀請 Debian 資深開發者之一 Joerg Jaspert 來台,為國內自由軟體的使用者介紹 Debian 開發社群的參與方式,歡迎有興趣的朋友踴躍參加此次活動。
◎ 演講主題:How to get involved in Debian and Open Source - everyone counts!
◎ 活動時間:2011 年 4 月 22 日(週五)下午 6:30 ~ 9:00
◎ 活動地點:國立臺北科技大學 綜合科館 B1 第二演講廳(台北市忠孝東路 3 段 1 號)
◎ 主辦單位:中華民國軟體自由協會、國立台北科技大學。
◎ 活動網頁:http://registrano.com/events/debian2
◎ 講者簡介:Joerg Jaspert 自 2001 年開始投入 Debian Project。2004 年時,成為 FTPMaster Team 成員之一。 2005 年時,擔任 Debian Account Manager,負責處理新進 Debian 開發者的申請工作。此外,他也是 1997 年在美國註冊的 SPI (Software in the Pulic Interest, lnc.) 副總裁。SPI 是一個非政府組織,提供 Debian 或其他 Open Source 計畫的法律服務,如:PostgreSQL,OpenOffice.org,Libreoffice,Drupal…等。更多的講者資訊,請參照 Joerg Jaspert 的個人網頁:http://people.debian.org/~joerg/
[源碼密技] 讓 Android 手機告訴你眼前顏色的名字
線人/文
不知道各位讀者是不是已經到過台北花博?當你身處色彩絢麗的花海時,你可知道眼前這一片花海究竟有幾種顏色?紅、橙、黃、綠、藍、靛、紫?當然,能夠形容色彩的名詞絕對不止「彩虹七色」那麼少。不過,對於從事創作行業的人(包括插畫師、攝影師、設計師甚至作家)來說,如何以最精確的名詞將眼前的色彩向第三者形容,是很重要的!透過 Android Market 就可以找到一個名為 Coloureyes 的軟體,這個軟體能夠利用 Android 手機的鏡頭,擷取鏡頭前影像當中某一點色彩,並且顯示最符合這一點色彩的名詞。留意這個軟體的名稱是「Coloureyes」,採用英式拼法。此外,這個軟體所提供的都是色彩的英文名,同時也提供色彩的 RGB 值或 CMYK 值,對於從事創作行業的華文使用者來說,能夠很方便的與輸出廠商溝通自己所希望採用的顏色。
軟體名稱:Coloureyes
最新版本:0.1
軟體授權:GNU General Public License (GPLv3)
系統支援:Android
官方網站:http://coloureyes.sourceforge.net/
使用者可以透過 Android Market 或 Coloureyes 的官方網站免費下載這個軟體。若透過 Coloureyes 的官方網站下載的軟體是 APK 檔案,以「.apk」為副檔名,利用 Android 手機中的檔案總管開啟 APK 檔案,便可選擇將軟體安裝至 Android 手機中。不過要注意的是,下載此檔案前,使用者要確定 Android 手機位於【設定】裡的【應用程式】介面,其中「未知的來源」的核取方塊已勾選。首次執行 Coloureyes 軟體時,使用者會先看到軟體的使用說明,然後便會見到如下圖的主畫面。
▲ 圖1
Live View 模式
軟體主要提供兩種操作方式:〔Live View〕及〔Image View〕。使用者若點選〔Live View〕,軟體便會即時啟動手機的鏡頭,使用者可透過以下畫面看到來自手機鏡頭的即時影像。
▲ 圖2
影像畫面中央有一個紅色的小框框,軟體會讀取小框框中的色彩,並且在畫面下方顯示這個色彩的英文名稱。軟體亦會顯示這個色彩的 RGB 或 CMYK 值,依使用者所選擇的設定而異。另外,留意軟體中色彩名稱的末端的數字,這個數字顯示即時影像的實際色彩與英文名稱所形容的色彩之間的差異程度。數值愈小,代表即時影像中的實際色彩愈符合英文名稱所形容的色彩。
使用者可利用 Coloureyes 軟體的〔Live View〕模式,即時讀取眼前物件的色彩,這樣便可得知較適合形容這種色彩的名字。當然,這種模式有一個弱點,那就是手機的鏡頭很容易受到環境色溫的影響,導致手機鏡頭錯誤感應物件的色彩。因此,這個軟體也提供另一種操作模式,那就是〔Image View〕。
Image View 模式
使用者若透過軟體的主畫面點選〔Image View〕,軟體便會讓使用者選擇讀取已儲存於手機裡的相片檔案,然後使用者便可透過選擇相片中的某一部分,以得知該部分的色彩名稱。
選擇載入相片後,使用者便會看到如下圖的操作介面,已載入相片的中央也會出現一個紅色小框框。軟體會讀取小框框中的色彩,並且在畫面下方顯示這個色彩的英文名稱,做法跟〔Live View〕模式頗相似。
▲ 圖3
不過,透過〔Live View〕模式,使用者可用手指在手機屏幕上點著不放,直至畫面出現「Zoom Mode」字樣,使用者便可將手指向屏幕上方或下方移動,來將相片畫面「放大」或「縮小」。
▲ 圖4
然後,使用者放開原本點著屏幕的手指,手指只要在屏幕上移動,畫面便會出現「Pan Mode」字樣,使用者便可將相片畫面移動,至所希望讀取相片中的色彩進入紅色小框框內。
使用者亦可選擇直接移動紅色小框框。方法是先用手指在小框框上方點一下,再用手指按著小框框,便可將它拖曳到影像中的其他位置。
▲ 圖5
軟體設定
這個軟體也提供不少設定選項以方便使用者依照個人不同的使用習慣做適度的調整。透過軟體的主畫面點選〔Settings〕便可進入以下的設定介面。
▲ 圖6
其中【Colour Lookup】設定區當中有一個名為〔Colour Dictionary〕的選項,可讓使用者選擇 Coloureyes 軟體用來顯示色彩名稱的字典來源。若將〔Colour Dictionary〕設定為〔Rainbow〕,在讀取色彩時,軟體會拋出彩虹七色的名字。不過,在一般的情況下,還是保留這個設定為〔X11〕比較好,因為〔X11〕的色彩詞彙明顯較為豐富。
▲ 圖7
〔Colour Display Format〕則可讓使用者設定軟體讀取色彩時,所顯示的是色彩的 RGB 值或 CMYK 值。對於從事出版業的設計及美術人員來說,色彩的 CMYK 值比較有參考的價值。
▲ 圖8
此外,Coloureyes 軟體亦提供一些進階的設定選項,位於軟體設定介面的下方,包括 Colour Selection、Size of Image Selection、Avg Recent Samples。
▲ 圖9
其中,〔Colour Selection〕選項能讓使用者設定軟體讀取色彩的紅色小框框的大小範圍。若選擇〔Single Pixel〕,軟體便會傳回紅色小框框中單一像素的色彩名稱。可是,倘若使用者想讀取的物件,其色彩並非太平均的話(例如油畫),建議選擇〔Average of Surrounding Pixels〕,軟體便會將紅色小框框周邊的像素一起計算在內,從而得出較符合的色彩名字。
▲ 圖10
▲ 圖11 使用者亦可因應自身需要,透過〔Size of Image Selection〕,直接更改紅色小框框的大小。
報主的話
報主的話: 本電子報為摘要版,若欲訂閱全文版請按此。 |
[源碼新聞] 專訪 OSDC.TW 2011 推手簡信昌
李婉婷/採訪
每年到了三、四月最令本地開源人期待的社群活動非 OSDC.TW (Open Source Developers' Conference, Taiwan) 莫屬,本年度的 OSDC.TW 2011 也已於上個月在中央研究院人社館國際會議廳圓滿落幕。今年的 OSDC 2011 吸引了四百人次的參與者,隨著參加人數逐年增加的狀況,可以看出 OSDC.TW 已經成為國內開源人每年必定參加的大型社群活動之一。
OSDC.TW 的前身是以探討 Perl 程式語言為主的開發者聚會,原本僅是台北 Perl 推廣組的社群活動,2006 年時轉變為眾多社群共同參與的盛會,從單一的社群活動轉型為年度開放源碼的大型社群聚會活動;這樣的成果除了靠社群朋友們熱情協助外,最主要的幕後推手便是在會場中拿著筆電全場來回奔走的簡信昌 (hcchien)。可以說 OSDC.TW 2010 年以前的歷屆活動,所有的事前籌劃均出自 hcchien 一人之手,而今年是第一次有其他的社群夥伴一同加入活動的事前討論與籌劃工作。
往年 hcchien 獨自一人籌劃歷屆的 OSDC.TW,當本次 OSDC.TW 2011 活動會後被問到累不累時,他笑著說:「當然會累啊!每次活動結束後,別人問說明年會不會繼續辦下去,我都說不知道。」不過他也表示,辦 OSDC.TW 就像舉辦小學同學會一樣,雖然每次都說明年不知道會不會辦,但一旦辦了就會有朋友來參與,因此每當到了籌備的時間,hcchien 腦袋裡的生理時鐘就會自動運轉起來,並催促自己開始籌劃相關的活動事宜;對 hcchien 來說,舉辦 OSDC.TW 這個大型社群同學會,讓老朋友有機會見見面聊聊天、交流新技術是很開心的事。
一直以來 OSDC.TW 外國講者的比例佔了很大一部分,網站活動議程的呈現方式也是以英文資訊為主,不難看出主辦者希望台灣軟體技術能與國際接軌的用心。hcchien 表示,畢竟在技術資訊取得來講國外還是比較快,因此邀請許多國外講者來台分享國外最新的開發技術與經驗談,是每年 OSDC.TW 籌劃工作裡的重要項目。
其實辦 OSDC.TW 不只是讓大家見面寒暄並交流新技術而已,hcchien 說明其背後的用意,是希望藉由舉辦大型活動讓大家更能關注開放源碼這塊領域,提高 Open Source 在台灣的能見度,透過 OSDC.TW 在 Open Source 知識方面自由分享的作法,進一步改善台灣軟體專案的開發環境。從事軟體開發工作多年的 hcchien 提到,台灣科技產業有很大的問題是人才都到硬體公司工作,在軟體開發方面則一直都是相對弱勢,因此希望藉由這樣的大型開源活動能帶起些許改變的漣漪,從而能夠鼓勵有志者一同來改善台灣軟體的開發環境,讓台灣在軟體發展方面有更大的突破。
hcchien 也提到在籌辦過程中觀察到的有趣現象,很多有在參與開源專案的國外講者其實都會自費到各國演講,而國內許多社群朋友自己去外面開公司賺錢後也會回來贊助 OSDC.TW 的活動舉辦,這些現象都再次說明了開源人共通的特質,熱情、積極與不吝於分享的精神。其實,OSDC.TW 最吸引人的地方並非真是設計了哪些別出心裁的活動、安排哪些引人奇想的議題,在這些背後更重要的,應該是促進國內開源人的固定相聚與交流,這樣的精神,是勝於一切演講內容的珍貴價值!
[技術專欄] 不做 NoSQL 的 CouchDB
Rex/文
CouchDB 作為 NoSQL 潮流中的一份子,很容易被拿來與被貼上一樣標籤 (buzzwords) 的資料庫作為比較。各個專案分別被貼上 key-value stores、tuple stores、BigTable Clones、Document store、Graph database 等等標籤。
這些標籤分類有時很容易幫助程式設計者概略瞭解後段實做的技術屬性,但很多時候,程式設計者的預設看法也可能是錯誤且偏頗的。我們可以說這些新技術都是想解決 CAP theorem 問題,但其實這些不同的資料庫計劃各有其想要解決的問題與開發哲學,如果以概括性的功能特徵來作為選擇技術的方式,很多時候會發現專案發展方向不一定適合自己需求。程式設計者應該先定義自己的問題後,再選擇屬性最適合的技術。
CouchOne 的開發者 Mikeal Rogers 曾說過,近期的產業浪潮掩蓋了各專案實際要解決的問題,取而代之是對於 Big Data 的想像與期待。Mikeal 那麼就讓其他人(與舊資料庫業者)去追尋 NoSQL 的浪潮吧,CouchDB 可以專注於處理 Mobile Database。
CouchDB 特色
試用了 CouchDB 一陣子,幾個特別欣賞的特色功能,簡介如下:
* Implemention for ACID Properties
** Multi-Version Concurrency Control (MVCC)
** B-Tree indexes
* Schema-Free document-oriented database
* RESTful JSON API
* View model / JavaScript View Functions
* Replication (Peer-based distributed databases), Distributed, featuring robust, incremental replication with bi-directional conflict detection and management.
CouchDB 使用 MVCC model,所有的資料庫寫入 (add, update, delete) 都不需要先 lock 資料庫,因此能保證可以即時讀出資料。索引則是靠 B-Tree 大量存於硬碟,Document 會建立一份索引,利用 MapReduce pattern 設計的每一份 View,也會存取一份索引,因此你的資料庫會佔用大量硬碟空間來換取速度。
CouchApp 配合瀏覽器使用起來很方便且支援權限功能,因為資料可以是隨意的 Json document,所以愛存什麼就存什麼。此外 API 界面是 RESTful,加上內建 Javascript 的 View Server,你可以用內建的 Show 功能來 Render Document。
最重要的特色是 Replication 功能。CouchDB 支援雙向衝突偵測,很方便長期離線的 Client 上線後快速同步資料庫內容,在離線狀態也可以存取已經拉回的資料。
CouchDB 目前限制
雖說 CouchDB 使用 MVCC Model,但 CouchDB 的讀寫速度遠遠慢於 in-memory key-value,與 MySQL 評測也未能夠勝出。加上 CouchDB 只支援 Replication,要作 Horizontal partitioning 要靠 CouchDB Lounge,等同於手動作 Sharding,在效能跟彈性上都未能夠勝過其他資料庫系統。
此外,作為存取 unstructured data 的代價,若想要查詢特別資料,必須依賴 View Model,每組 View 會建出獨立的 b-tree index,這種索引的代價頗高,特別是你想做 ad hoc query 時,使用 _temp_view 會浪費你大量的磁碟與 CPU 的運算資源。因此程式設計者在設計軟體與鍵入資料前,都必須先建好 View。
雖然 View functions 用了 MapReduce pattern,但礙於 CouchDB View API 的限制,目前很難做多次的資料處理。基本上一次 View 倒出來的資料僅限制一次查詢,你無法方便快速的做第二次 MapReduce 處理,如此缺乏彈性讓 MapReduce 反而像是一種限制,而非特色。
除了 Big Data 以外相關應用
捨去上述限制不談,CouchDB 的特色仍然可以作很多應用,特別是 JSON API 與 Peer-based distributed 這兩個功能。這使 CouchDB 在 Laptop 或 Mobile devices 上可以很方便地提供一些應用,特別是你經常需要在離線裝置上處理伺服器與本地端資料時。
除了像是 CouchOne 推出相容 CouchDB 的 CouchOne Mobile for Android。在 Linux 上則有 Desktop Couch,目前整合了 Tomboy、Evolution、Bindwood for Firefox 等,可以用來管理 PIM, Bookmarks 等等。理論上可以整合 UbuntuOne 或 Midgard。
筆者讀過兩本談論 CouchDB 的書籍,第一版的《CouchDB: The Definitive Guide》與《Beginning CouchDB》。個人比較推薦《Beginning CouchDB》,但再版的《CouchDB: The Definitive Guide》內容已經有改善。
◎ 作者簡介 蔡志展 (Rex Tsai) 或網名 chihchun,現為自由工作者,從事開源軟體顧問或開發服務。倡議並推廣自由軟體與開放源碼,早期 KaLUG 成員,現常出席 Tossug, HackingThursday 聚會,亦是開源人年會 (COSCUP) 籌備志工。長期 Debian、OpenWrt 使用者。關注議題甚廣,進一步資訊請參考 http://people.debian.org.tw/~chihchun/
[源碼密技] 你的老遊戲總管 D-Fend Reloaded
Jedi /文
在過去幾年間,筆者介紹過若干開放源碼的遊戲相關專案,顯示出開放源碼在促進軟硬體進步的娛樂產業中沒有缺席。本文要介紹的是開發已超過三年的開放源碼專案 - D-Fend Reloaded。這個軟體成功地將不同的遊戲解決方案結合在一起,不僅僅能在 Windows 運行,還能透過 Wine 環境執行,因此非 Windows 的遊戲玩家也可以享受 D-Fend Reloaded 帶來的便利。
D-Fend Reloaded 一如其名,在許多方面都是延續 D-Fend 而來的。D-Fend 是 2006 年以前最著名的 DOSBox 圖形介面前端 (GUI frontend)。2006 年後原作者因故宣告停止開發及維護,但此時 D-Fend 已經大大影響了許多不同的 DOSBox 圖形介面前端軟體的設計方向。
DOSBox 是另一個開放源碼專案,目的是要在不同的平台上,模擬出當年的 DOS 環境。這個專案的主要目標是為了要讓使用者能夠玩 DOS 時代的遊戲。但是隨著模擬越來越完整,就算要執行倚天中文或者 Windows 3.1 版也沒問題。更好的是 DOSBox 讓 DOS 環境的記憶體管理、音效卡配置都大幅簡化,如今使用 DOSBox 已經不用像當年使用 DOS 那樣,痛苦地從 config.sys 及 autoexec.bat 裡面壓榨記憶體了。
可惜 DOSBox 對現今新一代電腦使用者來說,仍然充斥著挑戰:許多使用者早已習慣圖形介面,看到文字介面時不知從何下手。專門販賣老遊戲的網站 Good Old Games 也運用了 DOSBox 專案的成果,預先設置好許多老遊戲的 DOSBox 配置,讓玩家可以在現代作業系統上,輕鬆地安裝老遊戲。除此之外,各種平台上也陸續出現各式各樣的圖形介面前端,例如前述 Windows 平台上的 D-Fend,另外還有 Mac OS X 平台上的 boxer、Tcl/Tk 的 DOSBoxGui、KDE3/Qt3 的 DboxFE、Qt4 的 GR-lida 等,都是很著名的專案(註一)。
在 D-Fend 結束維護後的一年左右,一個以繼承 D-Fend 為出發點的開放源碼專案,D-Fend Reloaded,釋出了第一個公開測試版。D-Fend Reloaded 能夠完全與 D-Fend 相容,文件上寫著「你可以把 D-Fend 的執行檔直接換成 D-Fend Reloaded 的執行檔,其他東西都不用動」。隨著 D-Fend Reloaded 繼續開發,不只是修正瑕疵,還持續添加更多的功能,並與各種開放源碼計畫整合。
也許因為「D-Fend Reloaded」這個名字,讓許多人以為這不過就是另一個「DOS 時代老遊戲的東西」。對於沒怎麼接觸那個年代遊戲的朋友,自然對 D-Fend Reloaded 也就不認識。然而現在的 D-Fend Reloaded 已成為相當完整的遊戲管理解決方案,不但可以(透過 Wine)跨平台,支援「可攜式安裝」,提供 PortableApps.com 格式的可攜式套件,更可以整合各種遊戲主機模擬器及 Windows 平台的遊戲。以下就讓我們來看看這些有趣的功能。
為了避免在奇怪的地方遇到預料外的瑕疵,例如某些 Windows 的鍵盤驅動程式會使得 DOSBox 內的鍵盤配置發生異常。D-Fend Reloaded 雖然有繁體中文介面,筆者建議選擇用英文介面。本文中的描述仍然會以中文為主,但是都採用筆者自己的慣用譯法,跟實際的正體中文介面可能有所不同,這邊要請讀者們留意翻譯上的差異。另外筆者其實都是設定成全螢幕執行遊戲,但是為了抓圖說明,所以暫時會切換成視窗模式。
遊戲管理
DboxFE Windows 7 新增了一個「遊戲總管」(遊樂場)的功能,會陳列使用者所安裝的遊戲,以便玩遊戲或更新等。但是這個功能需要遊戲開發者/發行者的配合,不是所有安裝的遊戲都會列進去(老遊戲就不要想了),而且有時候會出現一些不大對勁的現象,例如同一個遊戲列出好幾個等等。
▲ 圖1 Windows 7 遊樂場
這樣的功能想法很好,至少讓筆者可以清掉一些桌面上的捷徑,要是能夠方便自己管理這些遊戲,那就更好了。用過 D-Fend Reloaded 後,「遊樂場」就沒有機會出場了,因為 D-Fend Reloaded 更好用!
▲ 圖2 D-Fend Reloaded 的遊戲清單(圖示)檢視
▲ 圖3 D-Fend Reloaded 的遊戲清單(報表)檢視
D-Fend Reloaded 除了一樣可以直接用搜尋框來尋找遊戲外,還多了一個「我的最愛」,另外也能用遊戲類型、開發人員、發行人、發行年份、遊戲語言、遊戲授權方式、遊戲平台等條件來分別檢索。如果你覺得這樣還不夠,D-Fend Reloaded 甚至可以讓你自訂分類的依據。
為了要能夠分類,D-Fend Reloaded 必須要知道各個遊戲的資料。這些資料可以手動維護,但是 D-Fend Reloaded 內建直接從 MobyGames 下載資料的功能,你只要給個名稱片段,就能夠輕鬆下載相關的資訊,就連遊戲的相關圖片也能一起抓下來。要是很不巧地,你的遊戲在 MobyGames 上面沒有資料,也別擔心,因為 D-Fend Reloaded 還可以讓你很方便地用 SquakeNet.Com、TheLegacy、Kultpower 、Google、Wikipedia 等網站來搜尋遊戲資訊。如果你覺得預設的這些資訊欄位還不夠(例如你想要註明遊戲的明確版本編號),D-Fend Reloaded 還提供自訂欄位的功能,相當貼心。
▲ 圖4 D-Fend Reloaded 的程式(遊戲)資訊編輯畫面
▲ 圖5 D-Fend Reloaded 的讀取(下載)遊戲資訊畫面
抓下來的資料中,可能會有遊戲發行的「日期」,但是其實管理時只需要用到「年份」,所以這邊需要自己修改一下。遊戲類型、遊戲語言、遊戲授權方式等三項資訊可以用中文來描述。但是你一定不會想要每次下載資料後就手動修改,所以請善用程式設定中的「遊戲清單的非英語翻譯」功能(這個選項要在進階模式中才會出現),這樣 D-Fend Reloaded 就會自動幫你翻譯。
▲ 圖6 D-Fend Reloaded 設定非英文資訊的自動翻譯功能
Windows 遊戲
D-Fend Reloaded 可以用來管理 Windows 平台的遊戲:新增設定檔的時候,模擬類型選擇 Windows 遊戲(沒錯,雖然此時不是要「模擬」),然後一樣選擇遊戲的執行檔即可。執行檔路徑不用以引號「"……"」夾住,如果執行檔需要加上參數,則要另外填在程式參數的欄位,這跟 Windows 捷徑的寫法不大一樣,請注意。另外也可以在程式設定中,設定執行 Windows 遊戲時,自動把 D-Fend Reloaded 最小化(這個選項要在進階模式中才會出現)。
DOS 遊戲
DOS 遊戲就不用說了,D-Fend Reloaded 當然是支援的,特別之處在於 D-Fend Reloaded 內建上千個預先定義好的「模版」,當你要加入遊戲的時候,它會自動判斷你加入的是什麼遊戲,看看有沒有可以直接套用的模版。
▲ 圖7 D-Fend Reloaded 內建的自動設定模版
除了根據執行檔檔名來判斷外,D-Fend Reloaded 也可以直接「匯入」壓縮檔,並且從中根據指定的檔名,判斷其中是否含有設定或安裝資訊,並據此完成自動操作。
▲ 圖8 D-Fend Reloaded 的自動遊戲組態配置畫面
如果你手上的 DOS 遊戲是原始磁片或光碟(或者是它們的映像檔/壓縮檔),也可以用 D-Fend Reloaded 選擇要從來源安裝,這時 D-Fend Reloaded 會先以預設環境來執行安裝程式,待安裝完成後再建立遊戲設定檔。
如果你安裝 D-Fend Reloaded 的時候選擇「設定檔存放在使用者目錄」(這是 Windows 7 的建議選項),D-Fend Reloaded 預設會把 %UserProfile%D-Fend ReloadedVirtualHD 掛載成 C 磁碟機,所以你應該把遊戲解成此路徑中的子目錄。
除了模版外,D-Fend Reloaded 還內建「遊戲存檔修改」資料庫,可以用來作弊,是修改軟體外的另一個選擇。這個資料庫跟自動設定模版一樣,可以線上檢查更新及下載。(當然你也可以使用開放源碼的 Cheat Engine 來「修改」這些遊戲。)
▲ 圖9 D-Fend Reloaded 內建的遊戲存檔修改(作弊)資料庫
把遊戲檔案放到 %UserProfile%D-Fend ReloadedVirtualHD 目錄下還有許多管理上的好處,例如可以一次把很多遊戲放進去,然後用「掃描新遊戲」的功能迅速建立一堆遊戲設定檔,也可以把這些遊戲「匯出」成套件 ─ 如此在其他電腦上也可以輕易匯入 D-Fend Reloaded,免去重新安裝、設定的步驟。事實上 D-Fend Reloaded 的網站上就有提供一大堆預先準備好的「套件」,多是免費版、試玩版、展示版、共享版的遊戲,也可以從 D-Fend Reloaded 當中直接選擇下載,還怕沒有遊戲玩嗎?
▲ 圖10 用 D-Fend Reloaded 建立遊戲套件
▲ 圖11 從 D-Fend Reloaded 下載遊戲套件
QuickBASIC 遊戲
說到 DOS 遊戲,還記得當年 DOS 裡面附了一套 QuickBASIC 嗎?就算你不記得,總知道「大猩猩」(Gorilla) 跟「貪食蛇」(Nibbles) 這兩個歷久彌新的經典遊戲吧?這兩個遊戲當年都是隨著 QuickBASIC 一起附在 DOS 中的遊戲,遊戲本身是 .BAS 的源碼,要用 QuickBASIC 載入後執行。
▲ 圖12 在 DOSBox 中執行的「大猩猩」(Gorilla)
▲ 圖13 在 DOSBox 中執行的「貪食蛇」(Nibbles)
按照 DOSBox 的標準用法,你必須在 DOSBox 內手動執行 QuickBASIC 的整合開發環境,載入對應的 .BAS 源碼再執行。D-Fend Reloaded 將這樣的程序予以簡化,只要事先指定 QBasic 的程式路徑,建立遊戲設定檔時就可以直接指定 .BAS 源碼檔案為遊戲執行檔,之後 D-Fend Reloaded 就會自動執行 QuickBASIC、載入 .BAS 源碼、執行,一氣呵成。
▲ 圖14 D-Fend Reloaded 可整合 QuickBASIC
QuickBASIC 可以從微軟的技術支援網站「CD-ROM Extras for Microsoft Windows 95 Upgrade」下載 Olddos.exe,這是個自我解壓檔,建議解壓縮到 %UserProfile%D-Fend ReloadedVirtualHDOlddos 內,如此在 D-Fend Reloaded 設定時可以直接按「搜尋按鈕」(像望遠鏡那個)瞬間設定完成。
如果除了 QuickBASIC 外,你還有其他類似用直譯器執行源碼的遊戲或程式呢?D-Fend Reloaded 有個「使用者自訂直譯器」的設定選項(這個選項要在進階模式中才會出現),看你想要定義什麼,都沒問題!
ScummVM 遊戲
如果你是冒險遊戲愛好者,一定會知道 ScummVM 這個模擬器。先前筆者也曾經介紹過這個專案,除了 LucasArts 的 SCUMM 引擎外,ScummVM 還支援一大堆不同的冒險遊戲,包括 Activison、Horrorsoft、Coktel Vision、Revolution Software、SIERRA、Humongous Entertainment 等公司的冒險遊戲。由於 ScummVM 對音樂設備的支援更好,其內建 Roland MT-32 音源模擬、內建 FluidSynth 支援使用 SoundFont2 MIDI 音色庫,執行上也沒有因模擬器 CPU 時脈不匹配而造成遊戲體驗不佳的問題,所以更適合用來玩這些冒險遊戲。
以往的玩家必須要分別使用 DOSBox 及 ScummVM,但是 D-Fend Reloaded 具有將兩者整合的功能,只要事先安裝 ScummVM(就算是 64 位元的 Windows 也建議安裝 32 位元的 ScummVM,如此就可以使用 FluidSynth),並且在 D-Fend Reloaded 的 ScummVM 整合設定中按下望遠鏡圖像的「搜尋按鈕」,就可以完成相關設定。日後新增遊戲設定檔時,可以在模擬類型選擇 ScummVM,然後選擇遊戲資料檔所在的目錄,D-Fend Reloaded 即可使用 ScummVM 來執行該遊戲。同樣地,也可以設定啟動 ScummVM 遊戲時,將 D-Fend Reloaded 最小化。
▲ 圖15 D-Fend Reloaded 可整合 ScummVM
超任模擬器遊戲
如果你還會玩超級任天堂的遊戲呢?最有名的超級任天堂模擬器大概是開放源碼的 Snes9x ,一樣可以整合到 D-Fend Reloaded 裡面,方法是在「其他模擬器」(這個選項要在進階模式中才會出現)裡面設定 Snes9x 的執行檔,別忘了在「資料檔案副檔名」填上 SMC,之後新增遊戲設定檔時,就可以在模擬類型選擇 Snes9x,並且直接選擇 .SMC 格式的 ROM 檔案當做遊戲資料檔案。
▲ 圖16 在 D-Fend Reloaded 當中設定 Snes9x
▲ 圖17 在 D-Fend Reloaded 當中新增 Snes9x 遊戲的設定檔
如果想要用其他模擬器,也是按照這樣的方法來設定(當然資料檔案的副檔名會有所不同),以便統一由 D-Fend Reloaded 來啟動各種遊戲。
壓縮格式支援
D-Fend Reloaded 可以直接「匯入」遊戲目錄的壓縮檔,這個功能實際上是在要執行遊戲時替你解壓縮,遊戲結束時再將遊戲目錄的變動更新至壓縮檔。將 D-Fend Reloaded 以「可攜帶」模式安裝至隨身碟的使用者,可望藉此提昇讀取效能。D-Fend Reloaded 內建開放源碼的 7-Zip 以及開放源碼的 DelphiZip ,因此可以處理 7z 及 ZIP 格式的壓縮檔。如果你習慣用其他的壓縮格式,或者是你手邊的遊戲檔案是以其他格式保存(DOS 年代最流行的壓縮格式應該是 ARJ 及 RAR),可以在 D-Ferd Reloaded 內任意設定不同格式的壓縮程式(這個選項要在進階模式中才會出現),如此 D-Fend Reloaded 也能延伸其支援。
D-Fend Reloaded 1.1.0 版內的 7-Zip 為 4.42 版,DelphiZip 為 1.79.10.05 版。目前 7-Zip 最新版為 9.20 版,DelphiZip 最新版為 1.9.0.0100 版。你可以自己手動更新這些元件的版本,也可以使用其他能處理 7z 及 ZIP 格式的程式,取代 D-Fend Reloaded 內建的 7-Zip 及 DelphiZip。
▲ 圖18 在 D-Fend Reloaded 內設置以 WinRAR 處理 RAR 格式的壓縮檔
由於 D-Fend Reloaded 對壓縮檔的處理,除了解壓縮遊戲外,也會壓縮及更新,所以設置外部壓縮程式時必須逐一設定不同用途的指令。好在 D-Fend Reloaded 已經內建了 WinRAR 、ARJ32 、UHArc 等壓縮程式的預設指令,選擇對應的執行檔後,就會自動幫你把這些指令填上。
FreeDOS、4DOS、Doszip Commander
D-Fend Reloaded 在安裝過程中可以讓你選擇安裝 FreeDOS ,這個開放源碼專案提供與 DOS 相容的作業環境,增添許多原本 DOS 所不支援的功能,例如 FAT32 檔案系統以及其他可以取代 MS-DOS 工具程式的套件。更棒的是 FreeDOS 裡面也包含了 4DOS 命令直譯器,可以大幅改善 DOS 環境中的種種使用體驗。
4DOS 最早是由 JP Software 的 Rex Conn 所開發與發行的私有軟體,後來隨著 JP Software 將業務重心轉向 Take Command,遂將 4DOS 源碼釋出及開放。附在 FreeDOS 1.0 內的 4DOS 版本為甫開放源碼時的 7.50.130 版,而 4DOS 目前的最新版本為 8.00.200 版,所以你可能會想要自己下載,覆蓋到 %UserProfile%D-Fend ReloadedVirtualHDFREEDOS 裡面。D-Fend Reloaded 也可以直接設定要使用 4DOS 來當成預設的 DOSBox 命令直譯器,如此在 DOSBox 當中可以更有效率地操作,有更豐富的指令及環境變數。筆者手上還保留著十多年前精心調校過的 4DOS 設定檔,不但寫滿了中文註解,甚至還有當時保留下來的 4DOS 功能變數中文說明檔,歡迎有興趣的讀者朋友直接下載使用 。
此檔案解壓縮後會得到一些檔案,茲說明如下:
4ALIASES.INI:自訂指令縮寫(別名)用的設定檔,在 DOSBox 中若更動此檔案設定,只要執行「aaa」即可重新載入生效。
4DOS.INI:4DOS 的主要設定,各選項均提供中文註解。
4LICENSE.TXT:4DOS 的授權說明。
4README.TXT:4DOS 的「讀我」文件。
4START.BTM:4DOS 的自動執行檔,由 4START.SRC 編譯而來。
4START.SRC:4START.BTM 的源檔,每次更動後在 DOSBox 當中執行「BATCOMP 4START.SRC」即可編譯出對應的 4START.BTM。
4VAR.TXT:4DOS 功能變數中文說明文件。
▲ 圖19 在 DOSBox 當中使用 4DOS 的彩色 DIR 指令
除了善用 FreeDOS 與 4DOS 外,D-Fend Reloaded 亦內建一套叫 Doszip Commander 的開放源碼軟體,這是類似 Norton Commander 的雙欄式檔案管理工具,能夠進行各種檔案管理及操作。D-Fend Reloaded 1.1.0 版內建的 Doszip Commander 為 2.08 版,而 Doszip Commander 目前最新的版本為 2.09 版,所以你可能會想要自己下載,覆蓋到 %UserProfile%D-Fend ReloadedVirtualHDDOSZIP 裡面。
▲ 圖20 在 DOSBox 當中使用 Doszip Commander 管理檔案
D-Fend Reloaded 整合各種開放源碼專案的產物,包裝成完整而簡單易上手的介面,讓不同世代的遊戲玩家都可以從中獲得樂趣,同時又可以免除當年的種種苦痛,不但在一系列遊戲相關開放源碼計畫中顯得重要,也是筆者常說「好的預設介面,是成功的一半」的最佳例證。
除了筆者所介紹的這些,D-Fend Reloaded 還包含許多更進階的功能,例如可以在執行遊戲前將指定的光碟映像檔掛載成虛擬光碟、遊戲結束後解除掛載,或者可錄製遊戲中的畫面或聲音(並壓制成 Ogg Vorbis 格式)等,讀者朋友們不妨把玩一番,也必能從中挖掘到更多相關的開放源碼專案資訊唷!
回顧:開放源碼
本文中提及的開放源碼軟體專案及相關網站,依其出現先後順序列舉如下:
開放源碼軟體專案 | 相關網址 |
---|---|
D-Fend Reloaded | http://dfendreloaded.sourceforge.net/ |
Wine | http://www.winehq.org/ |
DOSBox | http://www.dosbox.com/ |
DOSBoxGui | http://sites.google.com/site/losfinkos/dosboxgui |
DboxFE | http://chmaster.freeforge.net/dboxfe-project.htm |
GR-lida | http://www.gr-lida.org/ |
PortableApps.com | http://portableapps.com/development/portableapps.com_format |
Cheat Engine | http://www.cheatengine.org/ |
ScummVM | http://scummvm.org/ |
FluidSynth | http://sourceforge.net/apps/trac/fluidsynth/ |
Snes9x | http://www.snes9x.com/phpBB2/viewtopic.php?t=4542 |
7-Zip | http://www.7-zip.org/ |
DelphiZip | http://www.delphizip.org/ |
FreeDOS | http://www.freedos.org/ |
4DOS | http://4dos.isgreat.org/ |
Doszip Commander | http://sourceforge.net/projects/doszip/ |
註一:以上除了 boxer 以外,都是開放源碼專案並以公眾授權的方式向外釋出,DboxFE 原頁面因站長重新調整架構,截至本文發佈之前仍有暫時失聯的狀況(回本文)。
[企業應用] 淺談將開放源碼軟體改名並違法販售:Butterfly Media on Amazon
曾義峰/文
藉由開放源碼軟體營利原本是一件好事,但若事涉違法取用或是踏入了惡意隱藏的灰色地帶,那麼就有很多可議空間。
一家 Butterfly Media 公司已在英國 Amazon 上販售許多開放源碼應用程式,而且除了違反著作權法外,還刻意更改開放源碼應用程式的名稱後再販售(註一)。例如,其中的 Dangers of the Deep,是一款時代背景為第二次世界大戰的遊戲。在 Amazon 上被改為 "U-Boat Simulator" 販賣,但 Dangers of the Deep 部分的授權屬於「創用 CC (Creative Commons)-姓名標示-非商業性-禁止改作 2.0」,意即該遊戲不可商業性使用或營利。該公司此舉明顯違反了著作權法。
其它的還有 FlightGear 被改名為 "Flight Simulator 2010",Scribus 被改名為 "Desktop Publishing Studio",以及 InkScape 被改名為 "Photo Studio"。
甚至在 Amazon 產品介紹頁上,Butterfly Media 還刻意變造 Scribus 官方網站上的截圖,把截圖中的應用程式名稱(Scribus 字樣)抹除掉(注意以下二圖左上角的差別)。
▲ 圖1 圖片原始來源:http://scribus.sourceforge.net/gallery/,其著作權利屬於 Scribus Team 所有,本文依其使用聲明僅透過外部連結的方式顯示圖片,並未下載圖片之後再行重製散布。
▲ 圖2 Butteryfly Media 在 Amazon 的販售頁面,圖片原始來源:http://www.amazon.co.uk/gp/product/B0040RQ7BU 。
另外的 InkScape 在 Amazon 產品介紹頁上,也故意將該程式的執行畫面 "InkScape" 抹除。
▲ 圖3 Butterfly Media 公司在英國 Amazon 上的產品功能介紹圖,圖片原始來源:http://www.amazon.co.uk/gp/product/B0041313S0 。
開放源碼軟體的販售
就開放源碼軟體的授權規則來說,並不禁止直接將其衍生產品進行商業營利,但若是刻意將應用程式的名稱抹除,道德層次與法律層次上都是可以被嚴重譴責的(註二)。
另外,在道德或商譽上,對於購買的使用者來說,如果是在事後才得知該應用程式原來可以從網路上免費下載,而且功能還一模一樣時,不知道內心的感受會是什麼,尤其 FlightGear 這款遊戲在 Amazon 上被該公司以美金 25 元販售。
不過這家公司偷也偷過頭了,他把 Orbiter 也放在上面販售,但 Orbiter 並不是開放源碼軟體。Orbiter 在其官方網站上已說明「禁止商業使用」。
結論
開放源碼軟體是可以合法進行營利,但是君子愛財取之有道。在這個案例中,Butterfly Media 不僅在道德及商譽上受損,也侵犯了相關著作權利人的合法權利,只要任一著作權利人依法定程序提出賠償要求,是可以合理得到應該有的侵權賠償金的。
註一:Open-Source Projects Are Getting Ripped On Amazon,http://www.phoronix.com/scan.php?page=news_item&px=OTAyNg 。
註二:實際相關的司法判決,可參照下列文章與譯文內容:
1. 黃雪雁,美國上訴法院肯定自由/開放源碼的授權模式,http://www.openfoundry.org/tw/legal-column-list/1836-2010-07-15-10-24-44 。
2. 林誠夏,保護密度的高與低:侵權與違約差異之我見,http://www.openfoundry.org/tw/legal-column-list/1628-2010-07-15-11-16-38 。
3. 謝良奇編譯,美國法院判決開放源碼授權享有著作權法保障,http://www.openfoundry.org/tw/worldwide-news/1715 。
[源碼快訊] 用自由軟體 Plone 來架設網站(2)— 內容管理
marr /文
在前篇文章裡,我們提到安裝 Plone 系統的方法,並練習基本的內容管理操作,這是傾向於把 Plone 當作產品的角度來說明。接著,我們將依序從前台、檔案系統、後台,深入管理介面,認識更多技術名詞和系統管理的細節,作為拆解和組合系統模組的準備。
Python 以 egg 檔案做為軟體元件的管理單位,Plone 則以「擴充模組」做為擴充功能時的管理單位,一個擴充模組可能包含一個或數個 egg 檔案。本篇文章裡,我們將以地圖功能為範例,介紹擴充內容管理功能的方法,並且進一步認識 buildout 的操作細節。
前台管理擴充模組
先從 Site Setup 管理前台開始,這裡的 Add-ons 列出了「擴充模組」的清單,並分成「可用的擴充模組」(available add-ons) 和「啟用的擴充模組」(activated add-ons) 兩類。也就是說,剛安裝好的擴充模組,會被系統先放在可用模組的清單裡,由管理員勾選啟用後,才會真正生效。
▲圖1 擴充模組的清單畫面
Add-on 有時候被稱為 Third Party Product,或直接稱為 Product,原則上就是提供特定功能服務的一組軟體。舉例來說,想要為 Plone 網站新增 OpenID 服務支援,只要勾選 OpenID Authentication Support 項目,點擊 Activate 按鈕即可。想要停用 OpenID 服務的話,同樣是勾選後點擊 Deactivate 按鈕,此功能相當直覺。
那麼,該去哪兒尋找更多的擴充模組呢?
擴充模組集散地
Plone 官網的 Downloads 頁面,分門別類地整理了許多擴充模組,是專屬的集散地,欲找尋擴充模組時,應優先到這裡查詢。
▲圖2 Plone 官網下載頁面
除了閱讀擴充模組的摘要說明之外,通常我們最關心它的支援版本,例如是否能夠支援 Plone 4 版本。
▲圖3 擴充模組版本相容資訊
如果在 http://plone.org/products 沒有找到想要的擴充模組,請再到 http://pypi.python.org/ 網址查詢,這裡被稱為 Python Package Index,縮寫是 PyPI,有時直接用 Cheese Shop 當暱稱,是 Python 軟體的集散地。
▲圖4 Python Package Index 網站
使用關鍵字在 PyPI 找各式軟體元件,它會依照分數 (score) 排序,列出所有相關的元件。元件的網頁內容主要包括版本號碼、摘要資訊、下載網址、詮釋資料......等。
一般的 Python 軟體元件,如果單純只是一個 egg 檔案,通常是使用 setuptools 裡的 easy_install 工具來安裝。以軟體元件 docutils 為例,可以仿照圖 5 的執行指令,將 docutils 安裝至系統裡。
▲圖5 使用 easy_install 安裝 docutils
安裝擴充模組
透過 egg 來安裝軟體元件,雖然很方便,但 setuptools 預設只會找元件的最新版本,有時反而會造成困擾。因為管理一個專案時,可能不需要用到元件的最新版本;另一方面,安裝元件只是專案開發的環節之一,通常還需要進行軟體設定,結合自製的元件,反覆測試,最後才能選出相容性最高且最穩定的元件版本。這時候,如果搭配合適的專案管理工具,開發專案的負擔就有機會減輕。
buildout 就是這樣的工具。只要管理 buildout.cfg 之類的設定檔,就可以自動下載 egg 檔案,安裝並設定想要的 Plone 系統,有效處理軟體相依或版本混亂的問題,也可以同時管理多種開發環境。
下列以 Collective Geo 為例子,示範安裝擴充模組的步驟。這個模組能新增地圖欄位,讓內容項目加入地理資訊。請到 http://plone.org/products/collective.geo 閱讀它的詳細描述,包括安裝說明。
buildout 搭配的設定檔,以 .cfg 為副檔名,最重要的是 buildout.cfg 這個檔案,我們要修改它的內容,加入擴充模組 Collective Geo 的資訊。
▲圖6 buildout 搭配的設定檔
首先,可以用「eggs =」當關鍵字,搜尋 eggs 的參數設定,預設會看到 Plone 與 PIL 的設定值,前面有四個空白字元。這是 Python 設定檔的標準格式。我們想要新增安裝 Collective Geo,設定方式是在新的一行,輸入四個空白,再把 collective.geo.bundle 加上去。
▲圖7 編輯 eggs 參數設定
由於 collective.geo 在安裝過程有許多軟體相依關係需要維護,其中相依的 plone.app.z3cform,還要額外指定對應的軟體版本清單。這類的對應清單,平常由 Plone 開發人員維護,稱為 Known Good Versions 或 Known Good Sets,有時也簡稱為 KGS,是維護 KGS 的集散地。
指定 KGS 的方式,是用「extends =」當關鍵字,搜尋 extends 的參數設定,把 http://good-py.appspot.com/release/plone.app.z3cform/0.5.3-1 的網址加入。
▲圖8 編輯 extends 參數設定
編輯 buildout.cfg 後完成存檔,執行 bin/buildout 讓設定值生效。執行 bin/plonectl 啟動系統後,再到 Site Setup 裡的 Add-ons 啟用擴充模組,勾選「Plone Maps (collective.geo)」並點擊[Activate]按鈕。它會自動啟用其他相依的模組項目。
▲圖9 啟用 Plone Maps 擴充模組
設定擴充模組
以 Collective Geo 為例,真正使用它之前,還要到 Add-on Configuration 設定軟體預設值,請點擊[Collective Geo]項目,進入它的設定畫面。
▲圖10 Add-on Configuration 設定畫面
首先,要決定地圖的預設經緯度和放大的級數,預設的地圖是 OpenStreetMap 的畫面。
▲圖11 Base Geo Settings 設定畫面
接著,要決定哪些內容類型搭配這項地圖功能,具備地圖功能的類型稱為 Georeferenceable Content Type,把想要的項目從左邊方框移到右邊方框,點擊 [Apply] 按鈕完成設定。
▲圖12 Advanced Geo Settings 設定畫面
使用地圖功能
地圖功能生效後,原本【View】頁籤的右方,會出現新增的【Coordinates】頁籤。點選後可以看到 Base Layer 的地圖畫面,利用方向和放大縮小按鈕,可以決定可視區域的畫面。接著,依照想要標示的形狀種類,例如[點座標]、[線座標]、[面座標]等,再從地圖右上方分別點選[筆按鈕]、[線按鈕]、[面按鈕]。點座標的決定,只需要在地圖上按一下,線和面座標是由數個點所構成,要在地圖上將最後一點按兩下,才能做確認。地圖下方會顯示選定的座標值,使用 WKT (Well Known Text) 格式來記錄。
▲圖13 地圖功能編輯畫面
想要切換 Base Layer 的話,可以點擊地圖右上方的[藍底十字符號],預設是在 OpenStreetMap 和 Google Maps 之間進行初換。如果有其他「Overlay」選項的話,也可以進行勾選。
▲圖14 切換 Base Layer 和 Overlay
完成地圖編輯後,顯示內容項目即包含地圖畫面,且同樣可以執行地圖的顯示操作,包括切換 Base Layer 與 Overlay 等。
▲圖15 內容項目與地圖搭配呈現
以上內容看起來似乎不錯,那麼,背後的運作原理是什麼呢?
內容型別框架
Plone 4.0 預設使用 Archetypes 做為內容型別框架。什麼是內容型別呢?之前提過的 Page、News Item 等,稱為「內容項目」,它們就是「內容型別」的具體呈現。拿 Python 的物件體系做比擬,可以想像內容型別是 class,內容項目就是 instance。
▲圖16 內容項目與內容型別的對應範例
我們可以在檔案系統裡,找到 Archetypes 相對應的程式碼內容,請到 Plone/buildout-cache/eggs/Products.Archetypes-1.6.4-py2.6.egg 的目錄,查看它的檔案細節。關於內容型別,最基本的技術細節在於 Field、Widget 和 Schema。
Schema 姑且可以譯為「基模」。它是一個 container 物件,定義了項目物件的結構,特別是內容項目的屬性值,例如欄位、編輯方式、儲存方式、顯示方式等。每個欄位的屬性值,是由 Field class 來定義,同時,每個欄位又搭配一個 Widget,它負責具體呈現 Field 的工作。詳細的 Field 和 Widget 說明,可以參考 http://plone.org/documentation/manual/developer-manual/archetypes/fields 內容。
一個 Schema 還可以有數個 Schemata,目的是將欄位進行分組,例如編輯內容項目時,分成 Default、Categorization、Settings 等編輯頁籤。
▲圖17 Schema Field Widget 的關係示意圖
預設型別定義
Archetypes 框架提供三個基本的 Schema 定義值:
- BaseSchema
- BaseFolderSchema
- BaseBTreeFolderSchema
根據這些 Schema,也預設提供四個基本內容類別:
- BaseContent
- BaseFolder
- OrderedBaseFolder
- BaseBTreeFolder
Folder 屬於 container 物件,可以包含其他內容型別。另外,Ordered 物件可以指定排序,但存取效能較差,只適於項目數量不多的目錄。相反的,BTree 物件在系統內部的存取效能較好,但不能指定排序。開發者可視需要選擇合適的預設型別,才是聰明的作法。
由於 Archetypes 是 Plone 的預設型別框架,預設的內容項目模組,稱為 ATContentTypes,其中的 AT 就是 Archetypes 的縮寫。ATContentTypes 的實作沿用了上述的基本內容類別,並提供開發者擴充內容型別的基礎。
範例程式碼
我們擷取 Plone/buildout-cache/eggs/Products.ATContentTypes-2.0.6-py2.6.egg/Products/ATContentTypes/content/newsitem.py 當作範例,並簡化程式碼內容片斷如下,藉此可以一窺 Archetypes 的實作方式:
from Products.Archetypes.atapi import Schema
from Products.Archetypes.atapi import TextField
from Products.Archetypes.atapi import ImageField
from Products.Archetypes.atapi import ImageWidget
from Products.Archetypes.atapi import RichWidget
from Products.ATContentTypes.content.schemata import ATContentTypeSchema
ATNewsItemSchema = ATContentTypeSchema.copy() + Schema((
TextField('text',
required = False,
widget = RichWidget(
description = '',
label = _(u'label_body_text', u'Body Text'),
)
),
ImageField('image',
required = False,
widget = ImageWidget(
description = _(u'help_news_image',
default=u'Image will be scaled to a sensible size.'),
label= _(u'label_news_image', default=u'Image'),
)
),
)
)
finalizeATCTSchema(ATNewsItemSchema)
透過 ATContentTypeSchema.copy(),我們複製了基本 Schema 的定義值。像 Title 或 Summary 欄位就直接繼承沿用,不必從頭造輪子,只要再加上需要的擴充定義。例子裡的 'text' 和 'image' 分別是 TextField 和 ImageField,它們搭配 RichWidget 和 ImageWidget 來呈現,比對圖 18 的畫面,可以看到呈現效果。
▲圖18 RichWidget 和 ImageWidget 呈現效果
從後台管理介面觀察
Plone 系統的後台稱為 Zope Management Interface,簡稱為 ZMI,透過 http://localhost:8080/manage 之類的網址,可以進入 ZMI 後台管理介面。
▲圖19 ZMI 管理介面
上述程式碼,除了存放在檔案系統外,它們的定義值也可以從 ZMI 觀察,甚至進行修改,修改的結果會記錄在 ZODB 裡。進入 ZMI 的 portal_types 裡,可以看到預設內容型別的屬性定義值。
▲圖20 portal_types 畫面
以 News Item 為例,它的操作行為包括代表圖示、新增時呼叫的函式、顯示時呼叫的函式等,都能藉由網頁方式來觀察或修改。
▲圖21 News Item 的屬性值
結論
從 Plone 4 開始,另一個稱為 Dexterity 的框架,正在積極發展,它結合新版 CMF、Zope 3 的技術與功能,希望有一天能正式取代 Archetypes。
Dexterity 具備下列幾項改良之處:
* Dexterity 具備更高的模組化程度,更容易整合 SQL 資料庫。
* Archetypes 使用 accessor 與 mutator 來處理設定值,Dexterity 則使用 attribute notation 方式來處理,因此 Archetypes 的寫法類似 context.getFirstName(),而 Dexterity 是 context.first_name 這樣的寫法。
* Archetypes 自有的 field 和 widget 要配合內容物件的脈絡來運作,並不容易被應用在獨立表單上,Dexterity 則使用 z3c.form 函式庫,這是表單運作的標準工具。
* Dexterity 透過 z3c.form 來支援表單新增的功能,這代表它不需要用到 portal_factory,執行效率能夠改善。
不過,Archetypes 是一個成熟的內容型別框架,支援許多 Widget 類型,並且被廣為應用,一般的開發場合,使用 Archetypes 仍是最穩健的方案。預計在 Plone 5 問世的時候,Dexterity 會成為預設的內容型別框架。