第 178 期 利用 FreeNAS 打造儲存設備(1)-歷史篇─自由軟體鑄造場電子報─智邦公益電子報
enews.url.com.tw · February 07,2012[技術專欄] 利用 FreeNAS 打造儲存設備(1)-歷史篇
Weithenn (http://www.weithenn.org/) /文 2011-08-03
前言
目前企業運作環境中對於共用儲存設備的存取方式,大約可以區分為三種類別,分別是:直接連接儲存 (Direct Attached Storage, DAS)、網路連接儲存 (Network Attached Storage, NAS)、儲存區域網路 (Storage Area Network,SAN)。其中儲存區域網路 SAN 又因為其所使用的傳輸媒體介質的不同,又可以細分為使用光纖作為傳輸媒介的 (Fiber Channel SAN, FC-SAN),以及使用一般乙太網路線材的 (iSCSI SAN, IP-SAN)。
不過目前商用市場及自由軟體專案中,許多的 NAS 設備除了既有的網路服務之外,同時具備了 iSCSI Target 的功能,因此可以提供 IP-SAN 的儲存環境也搖身一變,成為 SAN 設備。目前市場上 NAS 與 SAN 在界線劃分上已經日趨模糊,讀者可以從圖1、圖2 了解到 DAS、NAS、SAN 此三種共用儲存設備,對於應用程式 (Application)、檔案系統 (File System)、硬碟 (SATA、SAS、FC)、線材 (Fiber Channel、Ethernet) 等,在存取方式上的差異性,圖3 則為 NAS 與 SAN 的混合應用。在本次 FreeNAS 系列文章中所使用的 FreeNAS 雖然定位為 NAS,但它也可以提供 iSCSI Target 功能,來給予使用者更具彈性的應用。
▲ 圖1 DAS、NAS、SAN 存取方式比較一。Lore uni 分享,採用 CC-BY-SA 3.0 Unported 與 GFDL 雙重授權
▲ 圖3 SAN-NAS 混合應用。Lore uni 分享,採用 CC-BY-SA 3.0 Unported 與 GFDL 雙重授權
什麼是 FreeNAS?
FreeNAS 為基於 FreeBSD 作業系統所開發的嵌入式 (Embedded) 開放原始碼網路連接儲存設備 (Network Attached Storage,NAS),由 Olivier Cochard-Labbe 及 Volker Theile 於 2005 年時所發起。二人發起該專案計畫後也同時身兼 FreeNAS 計畫的核心開發成員。FreeNAS 的開發設計框架採用 Olivier Cochard-Labbe 參與的另一套知名嵌入式開放原始碼計畫專案,也就是一 PHP 語言所開發的嵌入式防火牆解決方案 m0n0wall。FreeNAS 以 BSD 授權方式釋出。
但是於 2009 年 12 月時 FreeNAS 主要開發成員 Olivier Cochard-Labbe 發表聲明,聲明內容為從 FreeNAS 0.7 版開始該計畫將停止開發任何新功能,也就是除了修正重大臭蟲之外,其餘開發計畫皆停止。Olivier Cochard-Labbe 表示他實在無法抽出足夠的時間繼續為 FreeNAS 開發新功能。
此時另一位 FreeNAS 專案計畫的核心開發成員 Volker Theile,則是將 FreeNAS 計畫的相關功能轉換到他習慣的日常工作環境 Debian Linux 上重新改寫,並且開啟了另一個開放原始碼專案計劃-OpenMediaVault,並且預計採用 GPLv3 授權方式釋出。
iXsystems 為提供 Unix-Like (Linux、BSD) 作業系統的硬體解決方案供應商,在 2009 年初時收購當時也是基於 FreeBSD 作業系統所開發,目標專注於桌面 (Desktop) 環境的作業系統 PC-BSD。該公司在 2009 年底時因為獲悉了 Olivier Cochard-Labbe 放棄繼續開發 FreeNAS 的聲明後,立即表示要接手 FreeNAS 計畫。雖然 iXsystems 公司加入,但是授權方式仍然維持原來的 BSD 授權方式釋出。
iXsystems 接手後發現 FreeNAS 雖然有很多非常棒的特色以及網路功能,但是由於在開發設計上的理念有所不同,造成原本的 FreeNAS 原始碼難以維護,因此 iXsystems 便決定將 FreeNAS 重新改寫,並且導入模組化設計 (Plug-ins) 概念。模組化設計理念除了提升日後在功能上擴充的便利性之外,對於有心幫助 FreeNAS 擴充新功能的熱心貢獻人士也有相當的助益。
因此重新改寫 FreeNAS 的工作便從 2010 年初緊鑼密鼓的展開,在嵌入式環境中改採用 NanoBSD 作為建立嵌入式環境的應用程式,同時在網頁框架 (Web Framework) 部份,也由原本使用 PHP 語言撰寫的 m0n0wall,改為採用 Python 語言撰寫的 Django 作為圖形化使用者操作介面。最後則是在版本命名方面則採用依 FreeBSD 作業系統版本命名方式,為 FreeNAS 進行命名,以便使用者在選擇 FreeNAS 版本時可以立即了解其所採用的 FreeBSD 作業系統版本。
整個 FreeNAS 改寫作業於 2011 年初大致完成,並且於同年 5 月 2 日正式發行 FreeNAS 8.0。由於是整個系統及架構進行重新改寫,因此在舊版本 FreeNAS 0.7 版中存在的功能在 FreeNAS 8.0 中不見得一定存在,例如:Bittorrent、WebServer 等,因為 FreeNAS 8.0 發行版本的首要任務為提供完整的 NAS 功能。對於非 NAS 原生功能,將預計於下一個發行版本也就是 FreeNAS 8.1,將會開始提供模組化擴充功能,屆時使用者便可以輕易的擴充他們想要的功能。
FreeNAS 0.7 vs FreeNAS 8
由上述我們可知 FreeNAS 8 承襲之前的精神,但實則為全新設計的嵌入式 NAS。同時由於 iXsystems 公司的加入,在各項改變中首先我們可以發現到 FreeNAS 0.7 與 FreeBSD 8 的標誌 (Logo) 有明顯不同(由 FreeBSD 紅色惡魔改為鯊魚)。初次使用 FreeNAS 的使用者首先會想問:這二個版本中該選那一個?在新版 FreeNAS 官網中 FreeNAS 版本比較頁面 FreeNAS™ Comparison Chart,有將舊版 FreeNAS 0.7 與新版 FreeNAS 8 在功能特性上做比較,讀者可以依自身所需要的網路服務需求選擇合適的版本。不過請注意由於新版 FreeNAS 8 是整個架構重新改寫,因此目前還不支援將舊有版本 FreeNAS 0.7 直接升級為新版 FreeNAS 8。
▲ 圖5 FreeNAS 8 標誌。採用 CC-BY 3.0 Unported 授權
在新舊版本功能比較表上,我們可以看到在新版 FreeNAS 8 中將非 NAS 原生功能,例如:Bittorrent、UPnP Server、iTuness/DAAP、WebServer 等功能取消,FreeNAS 官方將預計於下一版 FreeNAS 8.1 版中,以模組化擴充的方式來擴充相關功能,並且將 ZFS 檔案系統版本由原本舊版本的 v13 提升為 v15,若您選擇採用舊版也就是 FreeNAS 0.7 的話,您可以至舊版首頁查看相關資訊。
▲ 圖9 FreeNAS 7 及 FreeNAS 8 監控功能比較表。 採用 CC-BY 3.0 Unported 授權
FreeNAS 8 支援功能
明瞭全新改寫、設計及開發的 FreeNAS 8 歷史由來後,我們簡單的總結一下 FreeNAS 8 版本所支援的網路功能及相關特色:
* 文件共享機制:支援 NFS / CIFS / AFP / FTP / TFTP 等網路服務
* 儲存區域網路:支援 iSCSI Target / Initiator 的 IP-SAN 儲存環境
* 使用者驗證:支援 Local / Active Directory / LDAP 等使用者驗證方式
* 檔案系統:
** 支援 UFS2 檔案系統(包括 Gmirror / Gstripe / Graid3)
** 支援 ZFS 檔案系統(包括 配額 Quotas / 快照 Snapshots / 壓縮 Compression / 同步複製 Replication / Zpool v15)
* 版本升級:升級過程為透過 NanoBSD Inactive 機制,因此即使升級失敗屆時也能輕易回復。
* 告警機制:支援 LSI 磁碟陣列控制器事件自動通知機制(需搭配 E-Mail 服務進行設定)。
* 開發框架:採用 Python 語言開發的網頁框架 Django 作為圖形化使用者操作介面。
FreeNAS 硬體需求
在整體硬體支援度方面,由於 FreeNAS 8.x 版本皆是基於 FreeBSD 8.2 環境進行開發,因此在系統架構上支援 amd64、i386、ia64、pc98、powerpc、sparc64,其它硬體支援度方面,例如:Disk Controllers、Ethernet、USB 等硬體支援程度上均非常全面。比較令人驚喜的地方為支援大部份 10Gbps 網路卡,如此一來屆時採用 ZFS 檔案系統並且配合 iSCSI Target 提供 IP-SAN 儲存環境,來作為企業營運也是非常適合的儲存解決方案,一點也不遜色於商用設備解決方案。簡言之,原則上只要您的硬體設備符合 FreeBSD 8.2 的硬體相容清單 HCL (Hardware Compatability List) 中所條列,即可順利安裝 FreeNAS 並且不用擔心硬體驅動的問題。
在系統架構方面,FreeNAS 目前支援主流的 32 位元 (i386) 及 64 位元 (amd64) 架構,若您希望 FreeNAS 具備較高的傳輸速度及系統效能,則建議您採用 64 位元版本。若是您決定採用的是 32 位元版本,由於 32 位元系統架構會有記憶體 4GB 的定址限制(雖然有方法可以突破此限制,但不建議如此),強烈建議您應該要採用 UFS 檔案系統較為恰當(也就是不建議使用 ZFS 檔案系統)。
若決定採用 ZFS 檔案系統則表示您的硬體設備至少應該具備 6GB 以上閒置的記憶體空間,也就是說您的硬體設備至少需要 8GB 的記憶體,如此一來在運作 ZFS 檔案系統時,才能得到令人滿意的效能及傳輸速度。當然屆時 FreeNAS 運作的整體效能跟您的硬體設備實體記憶體將成正比(當然是實體記憶體愈多愈好!)。當 ZFS 檔案系統所負責處理的硬碟空間超過 6TB 容量時,就經驗法則來說,建議每多 1TB 硬碟空間就應增加 1GB 的實體記憶體。最後則應避免 ZFS RAIDZ 與硬體磁碟陣列卡 (RAID Controller) 二者互相混用的情況發生。您應該要將實體磁碟陣列設定在 JBOD 模式,而讓 ZFS 檔案系統來專心處理 RAID 部份。
在安裝空間方面,FreeNAS 為嵌入式的設計理念,因此您可以將 FreeNAS 安裝在 2GB 空間的 CF / USB 儲存裝置上,當然您也可以把 FreeNAS 安裝在硬碟上(但官方並不建議如此)。FreeNAS 在安裝時會將作業系統切割為二個 1GB 的分割區,其中一個分割區負責存放運作中的 FreeNAS 作業系統,而另一個分割區則是升級版本時會使用到。這樣的分割存放設計概念,可以確保您能順利升級至新的 FreeNAS 版本作業系統,或者當遇到升級問題時,也能輕鬆回復到先前穩定運作的版本,因此若您將 FreeNAS 安裝於硬碟上,將造成無法使用其它的剩餘空間。
為何官方不建議將 FreeNAS 8 安裝於硬碟中? 舉例來說若您將 FreeNAS 8 安裝於 1TB 容量的硬碟中,雖然實際使用不到 2GB 的空間,但您仍無法使用剩餘的空間 (Inaccessible) 來做為分享資料用,這也正是 FreeNAS 官方不建議將 FreeNAS 安裝於硬碟上的主要原因。而這也是舊版 FreeNAS 0.7 使用者一開始便會碰到的問題,因為同樣的情況在舊版 FreeNAS 0.7 的設計中,若使用 1TB 容量的硬碟來安裝 FreeNAS 後仍可使用剩餘的所有空間(也就是 900 多 GB 的剩餘空間),並且可以使用該空間來進行檔案分享的作業。
下載 FreeNAS 8
您可以在 Sourceforge FreeNAS-8 專案頁面中下載最新版本的 FreeNAS,在下載頁面中您可以看到 32 位元 (i386) 及 64 位元 (amd64) 系統架構的下載檔案。若您要使用舊版的 FreeNAS 0.7(現改名為 FreeNAS 7)也可在此頁面中找到。
新版的 FreeNAS 8 的每種系統架構中都各有三個檔案可供下載,分別是 .iso、GUI_upgrade.xz、Full_Install.xz,這三個檔案其所代表的意義說明如下:
* .iso:ISO 映像檔,下載 ISO 映像檔後您可以將它燒錄至 CD / DVD 光碟片中,並且將硬體設備 BIOS 設定開機順序為光碟開機後即可進行安裝。
* GUI_upgrade.xz:升級用韌體檔案 (Firmware),此一韌體檔案適合使用於登入 FreeNAS 圖形化操作介面後,不需要進行檔案解壓縮的動作,即可升級 FreeNAS 版本。
* Full_Install.xz:完整安裝映像檔案,使用此一檔案安裝,通常是沒有光碟機的情形,或者想預先將此安裝映像檔案寫入至 CF / USB 儲存裝置後,將硬體設備 BIOS 設定開機順序為 CF / USB 儲存裝置進行開機。
待續
本文至此,相信讀者們已大致了解新版 FreeNAS 8 的歷史由來、硬體需求、特色功能以及選擇合適的安裝檔案,同時也與舊版的 FreeNAS 0.7 進行功能特色的分析比較,再來則是由於新版 FreeNAS 在設計架構上與舊版不同。因此若是想要將新版 FreeNAS 8 安裝於伺服器的硬碟之中,雖然您仍然可以正常操作 FreeNAS,但是您將無法儲存任何資料在 FreeNAS 系統中,這是舊版 FreeNAS 使用者對於新版 FreeNAS 最不適應的地方。
在下一篇文章中,筆者將會帶領讀者實作 FreeNAS 8 各種不同的安裝方式,例如:從光碟片安裝、從 USB 安裝等方式。而安裝 FreeNAS 8 之後首先會進行相關的初始化設定,例如:指定使用的網路卡、設定 IP 位址及相關資訊、主機名稱 (Hostname) 等,以及實作版本升級,將目前僅能使用單一英文語系操作介面的 FreeNAS 8.0 版本升級至支援多國語系操作介面的 FreeNAS 8.0.1 版本。
[源碼快訊] 台灣創用CC計畫尋找志工&徵求論文
OSSF/編述 2011-08-02
尋找志工
研究領域的快速進步,是透過論文內容的取得、閱讀、思考與累積。然而,在研究過程的文獻取得,常常受到阻礙。譬如許多研究都是由政府支助,但對於公眾來說,卻是不容易取得。而有些論文總是被一些資料庫廠商所壟斷,甚至有些發展中國家的大學,負擔不起訂購費用,而無法使用這些權威期刊。加上學術文字採用許多領域中的「行話」,對其他領域學者,甚或是公眾來說,實為艱澀難懂。因此,CC 之友 Jon Phillips 發起 AcaWiki (Wikipedia for academic research) 的活動,需要徵召台灣翻譯志工 1-2 名。
這個有意義的活動,需要你的加入。目前第一要務是將使用者介面正體中文化,未來也會進行人氣論文摘要翻譯工作。請有興趣的朋友們,來信至 contact AT creativecommons.org.tw 與我們聯繫!
◎ 台灣創用CC計畫尋找志工佈告網頁:http://creativecommons.tw/blog/20110804
徵求論文
本年度的 11 月 19 日,台灣創用CC將與台灣資訊社會研究學會合作,假交通大學客家文化學院,舉辦 2011 年台灣資訊社會研究學會年會暨學術研討會。
本次主題定位在「社交網絡與行動通訊 (Social Networking & Mobile Communication)」。而由於資訊時代的來臨,許多公共資源以數位型態再現,然而這些數位公共資源的應用,牽涉層面廣泛,除了會牽扯到著作權法的相關議題,其中屬於政府部門的公共資源釋出,還會受到行政程序法及其子法行政資訊公開辦法、規費法、檔案法、個人資料保護法、國有財產法、國家機密保護法、科學技術基本法、市場公平交易等相關法令的牽絆。所以在這次研討會中,特別籌組「資訊時代的共有資源」專題,希望藉著本專題的徵稿,促使不同學科的學者與實務工作者產生對話與討論。
歡迎對此議題有興趣的朋友踴躍來稿,藉此場域討論激盪思考。本論文競賽提供獎金,優勝一名新台幣 6000 元,佳作二名新台幣 2000 元,請大家把握機會。
◎ 2011 年台灣資訊社會研究學會年會暨學術研討會論文徵稿網頁:http://www.tais.org.tw/call_for_paper2011.htm
◎ 截稿時間:2011 年 9 月 1 日
[源碼新聞] 2011 年台灣維基人夏聚 踏出寫作的第一步
Reke/文 2011-08-03
2011 年 7 月 21 日,萬能科大台北教學中心的教室裡,聚集了來自全台各地 30 幾名熱血的朋友,從三年級到八年級跨越了多個世代,一同參與台灣維基社群夏季聚會。有鑑於近年來,台灣社群的活躍編輯者數量不多,聚會參與者反而是以想要進入維基百科的新手、觀察者為主,因此,本次聚會特別以「寫作訓練營」的形式召開。希望在活躍編者的引領下,能夠協助新手慢慢踏入貢獻編輯的行列。
▲ 圖1 2011年台灣維基夏聚大合照。Harenwang 拍攝,採用 CC-BY-SA 3.0 與 GFDL 1.2 版或任一後續版本條款雙重授權
本次教學課程的安排跳過枯燥艱深的維基語法教學,以如何撰寫好的條目內容作為核心。第一堂課先由講師 Dodd 講述「資料的蒐集與判讀」,除了介紹「一次、二次、三次資料」的概念外,也列舉出許多資料蒐集的管道,並且說明如何判別各管道的權威性。透過這樣的蒐集與判別,為撰寫一個合乎「可供查證」原則的條目打下基礎。
▲ 圖2 講師 Reke 為學員解說寫作筆調需注意事項。Harenwang 拍攝,採用 CC-BY-SA 3.0 與 GFDL 1.2 版或任一後續版本條款雙重授權
隨後,由主辦單位分組,各組自我介紹過後,第二堂課由 Supaplex 講述如何建立條目的架構,包括擬定條目名稱、建立章節以及設定分類等。本堂課的後半段,則採用分組搶答的遊戲方式,讓學員們熟悉如何選定條目名稱以及進行分類,過程十分熱鬧。第三堂課則由 Reke 針對寫作筆調的問題進行講授,一般在維基中常見的錯誤,如立場不中立、侵犯版權,或是筆調不似百科全書的問題,都在本堂課中提出了實用的解決之道。
經過三堂課程的訓練,最後則進入到本次聚會的重頭戲:條目寫作競賽。主辦單位發下了資料與稿紙,在有限的時間內,各組學員必須分工合作,應用課堂所學,快速的判別資料的可信度、建立綱目,以「獅球嶺砲臺」為題,完成一個簡短的條目。雖然很多人都是第一次進行百科寫作,面對厚厚的期刊論文都有些手忙腳亂,但是到了最後關頭五組依然順利繳出了協作成果。在經過三位講師一一檢視並且討論之後,由第四組擊敗其他各組,取得比賽的冠軍
▲ 圖3 講師在條目寫作競賽時間,為各組解答關於寫作遇到的問題。Harenwang 拍攝,採用 CC-BY-SA 3.0 與 GFDL 1.2 版或任一後續版本條款雙重授權
冠軍小組的組長完全沒有維基寫作經驗,之前也沒有維基帳號。不過主辦單位貼心地請她當場註冊帳號,並協助將該組協作的成果轉至維基百科。目前在維基百科查找「獅球嶺砲臺」已經可以看到當日該組協作的成績。
▲ 圖4 獲得優勝的第四組成員合影。Harenwang 拍攝,採用 CC-BY-SA 3.0 與 GFDL 1.2 版或任一後續版本條款雙重授權
目前台灣維基社群的聚會活動主要有兩個系統,其一為全國性的季聚,每季一次,由主辦人規劃主題與活動,形式多元;另外則是各地維基人組織的地方小聚,目前台北雙週一次、台中每月一次較為固定舉行,形式則多以參與者聊天分享為主。其中台北聚會近期之內將規劃每月一次的寫作工作坊,將以分享寫作心得與發表寫作成果為主,以便延續本次聚會成果,讓更多人熟悉並投入分享知識的行列。錯過本次夏聚的朋友,可以在下回進入維基百科時多注意頁頂的公告取得最新的社群聚會資料。
▲ 圖5 中華民國維基媒體協會理事魔法設計師(右)與台中聚會主辦人安可(左)彼此討論關於維基的議題。Harenwang 拍攝,採用 CC-BY-SA 3.0 與 GFDL 1.2 版或任一後續版本條款雙重授權
相關連結
2011 臺灣維基夏聚 http://zh.wikipedia.org/wiki/Wikipedia:2011SUTW
中文維基百科-獅球嶺砲臺 http://zh.wikipedia.org/wiki/獅球嶺砲臺
作者簡介
Reke,台灣維基社群成員,PTT 電影板板主,主業為文字工作者。著迷於電影,耽溺於文字;在現實裡怯弱地柔從,在評論裡驕傲地反抗。電影部落格:http://rekegiga.blogspot.com/
[源碼新聞] DrupalCamp Taipei 2011 總召 Jenny 會後專訪
李婉婷/採訪 2011-08-05
假中國科技大學台北校區舉辦、為期兩天的 DrupalCamp Taipei 2011 已經於 7 月 10 日圓滿落幕。Drupal 是一個好用且極具彈性的開放源碼的內容管理系統 (Content Management System, CMS),常常拿來架設網站。DrupalCamp Taipei 是 Drupal Taiwan 社群舉辦的年度大型社群活動,人數超越去年,才舉辦到今年第二年就已經成功吸引大約 230 人到場一同參與。促成 DrupalCamp Taipei 年度盛會的舉辦,活動的起頭者、擔任兩屆總召的 Jenny 可以說是幕後最大功臣。
▲ 圖1 John Wilkins 分享 Drupal 的精神與現況。(照片由 DrupalCamp Taipei 提供)
Jenny 本身是台灣人,當初因為老公 John Wilkins 的關係移居到美國發展,因此在那時 Jenny 就與美國當地的許多自由軟體社群有頻繁的接觸,也漸漸對於自由軟體社群的經營與行銷推廣產生心得。她回到台灣之後,也極力希望將國外自由軟體社群的風氣帶回台灣,這樣的想法也落實在 DrupalCamp Taipei 的活動之中。從 DrupalCamp Taipei 2011 可以發現,活動更加國際化,在活動的細節中可以看出很多轉變。
擔任兩年總召的 Jenny 在今年的 DrupalCamp Taipei 的國外議程中增加了多位人員即時口譯,去年國外講者的場次是全程使用英語來演講,而今年則加入雙語的安排,讓台灣朋友能更有效的吸收國外講者的精華。此外,Jenny 也特地邀請許多國外社群友人來到台灣一同參與 DrupalCamp Taipei 2011 的活動,增加國際社群與台灣在地社群面對面交流的機會。如此作法是希望能讓台灣與國際社群多多接觸,讓台灣社群能更深刻的體驗到國外自由軟體的文化意涵與精神。
▲ 圖2 不少國外社群朋友到場參與 Drupal Taiwan 的年度盛會。(照片由 DrupalCamp Taipei 提供)
除了增進國內外社群人士的交流與互動以外,在活動議程安排上,DrupalCamp Taipei 2011 也參照國外大型社群活動的作法,增加了「網站改造馬拉松」的活動。因此,這次 Drupal Taiwan 社群也與台北市行無礙資源推廣協會合作,在活動第二天安排一場「網站改造馬拉松」的社群實作參與活動,社群可以透過報名的方式加入,幾個參與者利用第二天在活動現場的時間,一同將台北市行無礙資源推廣協會網站所使用的 Drupal 系統升級,並對網站進行改造與增加新功能,讓原先的舊網站如換穿新衣一樣有美觀的介面,能夠配合現今網站呈現的趨勢;新增加的功能則使協會業務能更為順利推動,將欲傳達的理念散佈出去。此活動設計充份呈現出 Drupal 社群取之於社會,回饋於社會的自由軟體社群精神。Jenny 說,通常國外大型研討會在活動的最後一天會安排實作的活動,此實作活動的概念是出自於互惠的精神,參與者前幾天聽台上講者的分享吸收了許多新知,而最後一天就輪到參與者自己貢獻出時間與精力的時刻了。
Drupal 的可貴之處在於 Drupal 是經由各地社群一點一滴的貢獻所累積出來的,今日能有這麼好用、富有彈性的架站系統都是社群們的付出與分享而得的成果,從這兩年的 DrupalCamp Taipei 來看,Drupal Taiwan 社群在 Jenny 等核心人物,以及其他熱情參與活動、支持 Drupal 的朋友努力之下,台灣 Drupal 社群的聲勢正逐漸壯大。Jenny 說:「未來的目標是希望在台灣建立起亞洲的大型 Drupal 聚會。」相信在不久的將來 Drupal Taiwan 會實現這個理想。
[技術專欄] Ruby on Rails 初探
麥克阿忠/文 2011-08-03
起源與命名
Ruby 原意為紅寶石,而在電腦程式碼界裡頭是一個簡單快速、物件導向的指令碼語言。Ruby 的起源可以追溯到 1995 年,由日本工程師「松本行弘」開發釋出,並遵循 GPL 協定和 Ruby License。之所以命名為 Ruby,是因為 Perl 的發音與 6 月的誕生石 pearl(珍珠)相同,因此 Ruby 以 7 月的誕生石 ruby(紅寶石)命名。
Ruby 的理念與語言特性
Ruby 發明者松本行弘曾說:
「人們特別是電腦工程師們,常常從機器著想。他們認為:『這樣做,機器就能執行的更快;這樣做,機器執行效率更高;這樣做,機器就會怎樣怎樣怎樣。』實際上,我們需要從人的角度考慮問題,人們怎樣編寫程式或者怎樣使用機器上應用程式。我們是主人,他們是僕人。」
減少瑣碎的時間來提升開發效率與直接溝通的人性化語法,是 Ruby 開發時所遵照的理念。所以發明者松本行弘認為 Ruby > (Smalltalk + Perl )/2,可表示為能像 Smalltalk 一樣完全、完整的物件導向,指令碼執行又有 Perl 強大的文字處理功能的程式語言。
語法:
#取絕對值
-199.abs
=> 199
#計算字串長度含空白
"ruby is cool".length
=> 12
#取含 c 字串的位置
"Rick Astley".index("c")
=> 2
Ruby 可以將任何的東西視為物件,不必再另外宣告基礎型別。
什麼是 Ruby on Rails
Rails 意指為鐵道,所以 Ruby on Rails 可想像為遵行在已規劃好的鐵路上,以穩定、快速、便捷的運作整個 Web 專案。
Rails 的創始人「大衛.海納梅爾.韓森」於 2004 年 7 月從 37signals 公司的管理工具 Basecamp 分離出 Ruby on Rails,然後再以開源方式發佈。Ruby on Rails 簡稱 RoR 或是 Rails,使用 Ruby 語言所開發編寫的開源 Web 應用框架,嚴格按照 MCV 架構開發。其架構採取 Model、View、Controller 分離的開發式,不但減少了開發者與美工之間的落差,也簡化許多繁雜的動作。
建立所需的環境
Ruby 可在包含 Linux、Mac OS X 與 Microsoft Windows 下運作,本篇將在這三個系統下介紹安裝 RoR 的環境。
在 Ubuntu 11.04 下安裝 Ruby on Rails
進行系統更新與安裝 MySQL
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install git
$ sudo apt-get install mysql-server libmysqlclient15-dev
$ sudo apt-get install curl
$ sudo apt-get install build-essential zlib1g-dev libssl-dev libreadline5-dev
安裝 RVM (Ruby Version Manager)
$ bash <
$ echo "[[ -s $HOME/.rvm/scripts/rvm ]] && source $HOME/.rvm/scripts/rvm" >> ~/.bash_profile && . ~/.bash_profile
$ source ~/.bash_profile
再打開該檔案 .bashrc 於最後一行加上 source ~/.bash_profile
安裝 REE (Ruby Enterprise Edition)
$ rvm install ree
$ rvm ree --default
安裝 Rails
$ sudo apt-get install libbuilder-ruby
$ gem install rails -v=3.0.7
$ gem install mysql
以上即完成了 Ubuntu 11.04 下的開發環境了。
在 Mac OS X 下安裝 Ruby on Rails
在撰寫文章之際,新版 Mac 系統已經正式出版,名為 Mac OS X Lion,版本代號為 10.7,因尚未得知版本是否相容,本篇將以 10.6.8 的方式安裝。
安裝 Xcode
安裝 Xcode 的用意是要與 Homebrew 搭配使用。
Mac OS X Install CD >> 選擇安裝,若無 CD 者到 http://developer.apple.com/xcode/ 安裝最新版的 Xcode,升級至 Lion 版者可獲得免費升級,其餘版本有可能會需要付費,除非您是專職 Apple 軟體開發者或是有意願在 Mac 平台上開發者,可以付費購買。
安裝 Homebrew
> ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"
> brew install git
> brew update
安裝 MySQL
> brew install mysql
> unset TMPDIR
> mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)"
> cp "$(brew --prefix mysql)"/com.mysql.mysqld.plist ~/Library/LaunchAgents
> launchctl load -w ~/Library/LaunchAgents/com.mysql.mysqld.plist
> "$(brew --prefix mysql)"/bin/mysql_secure_installation
* Set root password? [Y/n] Y
* New password: 123456
* Re-enter new password: 123456
* Remove anonymous users? [Y/n] Y
* Disallow root login remotely? [Y/n] Y
* Remove test database and access to it? [Y/n] Y
* Reload privilege tables now? [Y/n] Y
安裝 RVM (Ruby Version Manager)
> bash <
> echo "[[ -s $HOME/.rvm/scripts/rvm ]] && source $HOME/.rvm/scripts/rvm" >>
~/.profile && . ~/.profile
> source ~/.profile
安裝 REE ( Ruby Enterprise Edition )
> rvm install ree
> rvm ree --default
修正在使用 RVM 裝 REE 之後不能使用中文的問題
> brew install readline
> brew link readline
> rvm --reconfigure --force -C --with-readline-dir=/usr/local install ree
安裝必要的 RubyGems
> gem install rails
> gem install rails -v=3.0.7
> gem install mysql2
> gem install passenger
> gem install nokogiri
> gem install capistrano
> gem install capistrano-ext
> gem install delayed_job
> gem install hoptoad_notifier
> gem install facebooker2
> gem install factory_girl
> gem install sphinx
以上即完成了 Mac OS X 下的開發環境。
在 Windows 下安裝 Ruby on Rails
安裝非常簡單,此段將簡單說明需要的步驟。
下載一鍵安裝的 rubyinstaller.exe
到 RubyForge 網站 http://rubyforge.org/frs/?group_id=167 下載最新版本的 Ruby 程式。
安裝 Rails
開啟「文字命令」模式輸入
C:/> gem install rails –include-dependencies
請記得保持網路暢通,此動作將透過網路下載相關的檔案來安裝。
安裝 MySQL
到 MySQL 官方網站下載最新版本 http://dev.mysql.com/downloads/
以上即完成了 Windows 下的安裝
磨刀小試
Ruby on Rails 開發所使用的編輯器有很多種,其中最簡便的就是用系統預設的文字編輯器 vi 或是 vim 即可開發。
先下一些指令來檢視您的環境版本。
檢視 Ruby 的版本:
$ ruby -v
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-linux], MBARI 0x8770, Ruby Enterprise Edition 2011.03
檢視 Rails 的版本:
$ rails -v
Rails 3.0.7
檢視 rake 版本:(此 V 為大寫)
$ rake -V
rake, version 0.8.7
若以上的指令能顯示版本資訊,表示您可以用 Ruby on Rails 進行開發了。
開一個新專案:
建立一個新成立的網站,我們必須要當它為一個專案來進行開發,所以請在您欲指定的家目錄下新開一個專案,
請下這個指令:
$ rails new demo
create
create README
create Rakefile
create config.ru
create .gitignore
create Gemfile
create app
create app/controllers/application_controller.rb
create app/helpers/application_helper.rb
create app/mailers
create app/models
create app/views/layouts/application.html.erb
create config
create config/routes.rb
......
......
rails 將會為您產生關於 MCV 架構的檔案目錄。然後進入您的 demo 目錄下輸入
$ rails s
=> Booting WEBrick
=> Rails 3.0.7 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2011-07-21 14:14:09] INFO WEBrick 1.3.1
[2011-07-21 14:14:09] INFO ruby 1.8.7 (2011-02-18) [i686-linux]
[2011-07-21 14:14:09] INFO WEBrick::HTTPServer#start: pid=2967 port=3000
然後打開 Web browser 在網址輸入
http://localhost:3000
看到以下的畫面,表示您完成初探 Ruby on Rails 的第一步了!
▲ 圖1
結語
Ruby 相較於其它程式語言較為直覺、容易閱讀,也易於上手。一般來說,只要能在物件導向論點中精實的學習,可以加速一倍以上的開發時效。在 Web 開發中,大都是用 Rails 做為 FrameWork 來共同開發大型專案,因 MCV 為開發的出發點,大部分資深的程式設計師都會比較不習慣,相信了解它的架構之後,個人的學習曲線將能一躍直上。
下一篇將進入如何用 Ruby on Rails 寫出一個網站,敬請期待。
資源連結
Ruby on Rails 實戰聖經 http://ihower.tw/rails3/
Ruby on Rails 指南手冊 http://guides.ruby.tw/rails3/index.html
二十分鐘 Ruby 體驗 http://www.ruby-lang.org/zh_TW/documentation/quickstart/
Ruby on Rails 教學影片 http://railscasts.com/ RailsCasts
從 PHP 轉換 Ruby 的方法 http://railsforphp.com
作者簡介
麥克阿忠,資深網站程式開發者,興趣攝影。目前擔任 Ruby on Rails 網站開發員,主要使用 Ubuntu Server 進行 Web 應用程式開發。
作者部落格 http://about.me/MichaelChen520
歡迎對 Ruby 有興趣的同好一同來交流指教。
[源碼秘技] 透過 Android 手機隨時隨地理財
線人/文 2011-08-04
在經濟不景氣的今天,若是各位對於「開源」(在這裡筆者的意思當然不是「開放原始碼」,而是「開拓財路」)沒有多大的把握,那麼眼前的當務之急就是「節流」了。一個稱職的理財軟體,能夠讓使用者清楚掌握自己每月辛苦賺來的金錢流向。如果各位所使用的是 Android 智慧型手機,這裡剛好有一個適用於 Android 平台的理財軟體。這個軟體名為「每日記帳本 (daily-money)」,不但是提供免費下載使用的自由軟體,更是由台灣人開發出來的!
軟體名稱:每日記帳本 (daily-money)
最新版本:0.9.7-0702-freshly
軟體授權:GNU General Public License (GPLv2)
系統支援:Android
官方網站:http://code.google.com/p/daily-money/
各位使用者可透過 Android Market 或 daily-money 的官方網站免費下載這個軟體。使用者透過 daily-money 網站下載的是軟體的 APK 檔案,以「.apk」為副檔名,透過 Android 手機中的檔案總管開啟 APK 檔案,便可選擇將軟體安裝至 Android 手機。不過,在安裝前使用者要確保 Android 手機的【設定】中的【應用程式】介面,當中「未知的來源」的核取方塊已勾選。首次執行 daily-money 軟體,使用者首先會看到軟體「有什麼新功能」的說明,然後便會見到如下圖的主畫面。
▲ 圖1
建立帳戶
第一次執行 daily-money 軟體時,它已經自動為使用者建立了預設的帳本,以及收錄於帳本內的一系列帳戶。帳戶主要分為四種:
收入:主要是指使用者每個月所收到的工資。
支出:使用者每日的支出,例如繳付帳單、日常消費等。
資產:使用者所擁有的銀行帳戶,以及手上的現金等。
債務:使用者目前尚未清還的貸款、信用卡欠款等。
如果使用者有需要的話,daily-money 軟體更提供「其他」類別的帳戶,讓使用者選擇。首次使用 daily-money 軟體時,使用者可先按照自己的狀況建立不同的帳戶。如要建立及管理帳戶,可透過主畫面的〔主要桌面〕點選〔帳戶管理〕,軟體便會顯示以下的「帳戶管理」畫面。
▲ 圖2
使用者可點選畫面上方的不同帳戶類別,觀看該類別之下有什麼帳戶項目。軟體已預設建立兩個屬於「收入」類別的帳戶,分別是「薪水」及「其他收入」。再點選畫面上方的〔資產〕,便會看到以下的畫面。
▲ 圖3
軟體已預設建立三個屬於「資產」類別的帳戶,分別是「現金」、「銀行.HSBC」以及「銀行.台灣」。先點選其中一個帳戶「現金」。
▲ 圖4
上圖就是帳戶「現金」的編輯介面。使用者可以隨意修改帳戶的名稱,以及在「初始值」欄位中輸入使用者現在手上所持有現金的總額。例如使用者現在手持 10,000 元,那麼就在「初始值」欄位中輸入「10000」。
▲ 圖5
完成設定後,再點選〔更新〕回到帳戶列表。從列表中可見「現金」帳戶已顯示「初始值」為「10000」。
▲ 圖6
接下來就是逐一輸入使用者所有銀行戶頭的初始值(亦即為結餘)。點選其中一個「銀行」帳戶,便可進入該帳戶的編輯介面,同樣在「初始值」欄位中輸入使用者現在該銀行帳戶的結餘。當然,使用者可隨意修改帳戶的名稱,畢竟並非所有人都有 HSBC 或台灣銀行戶頭。
▲ 圖7
如果使用者擁有超過兩個銀行戶頭,可以在「資產」帳戶列表按下 Android 手機的功能表按鍵,然後在畫面下方點選【新增】項目。
▲ 圖8
同樣地,使用者輸入新增帳戶的「名稱」及「初始值」。
▲ 圖9
在建立新帳戶時,使用者可更改新帳戶的類別,點一下〔型態〕選單,便可從選單中選擇該帳戶的類別。最後,點選〔建立〕便可完成新帳戶的設定。
▲ 圖10
使用者如果有信用卡,或者尚未償還的債務等,別忘記在帳戶管理畫面中點選〔債務〕,建立及管理屬於「債務」的帳戶。所有帳戶都建立後,按 Android 手機的「返回」按鍵回到主畫面。
▲ 圖11
建立明細
所有帳戶都建立後,下一步就是輸入每天的支出與收入等交易,在這個軟體中,這些交易稱為「明細」。透過主畫面的〔主要桌面〕點選〔建立明細〕,然後軟體便會顯示以下的「建立明細」畫面。
▲ 圖12
現在假設要輸入「公司支薪給使用者」這項交易。先選擇這次交易的來源,亦即錢是從哪一個帳戶中提取的。從這個例子中,金錢的來源是「收入-薪水」。因此,使用者先點選「從帳戶」之下的選單,選單會顯示以下選項。
▲ 圖13
使用者點選「收入-薪水」後,便可將「從帳戶」設定為「收入-薪水」。下一步就是選擇「到帳戶」。
▲ 圖14
使用者再點選「到帳戶」之下的選單,選單會顯示以下選項。
▲ 圖15
使用者點選將薪水存入的銀行,例如圖中的「資產-銀行」下方的「HSBC」。「從帳戶」及「到帳戶」都設定了,再選擇這項交易的「日期」以及金額(「金錢」)。最後點選「建立」,便完成建立明細的程序。
▲ 圖16
明細列表及報表
除了讓各位建立帳戶及明細項目外,透過 daily-money 的〔主要桌面〕亦可選擇瀏覽多個明細列表,方便使用者查詢特定時期內消費的金額。可供選擇的列表計有「日明細列表」、「周明細列表」、「月明細列表」及「年明細列表」。
透過 daily-money 的主畫面點選〔日明細列表〕,便會看到以下的畫面。這個「日明細列表」可列出在指定日期裡的所有交易。點選列表中某一個明細項目,就能進入該明細項目的編輯畫面。
▲ 圖17
除了〔主要桌面〕的各種明細列表外,點選主畫面上方的〔報表桌面〕,便可找到三款報表,包括〔單月份結算〕、〔單年結算〕及〔累計結算〕。
▲ 圖18
與明細列表不同,daily-money 的報表能顯示指定期間裡各個帳戶的總額,以及「資產」、「債務」、「收入」及「花費」四大類帳戶的總結算。例如下圖的「單月份結算」,就是在某一個月份裡各個帳戶的總結算。
▲ 圖19
喜好設定及資料維護
透過 daily-money 的〔主要桌面〕中點選〔喜好設定〕,就能進入這個軟體的設定介面。透過這個介面,使用者可進行各種設定,包括為軟體設定密碼保護、選擇不同的明細排版、設定每個星期的第一天……等。
▲ 圖20
▲ 圖21
使用者如有需要,可將這個軟體的所有資料備份至 Android 智慧型手機裡的 microSD 卡。透過〔主要桌面〕中點選〔資料維護〕,再點選〔匯出 CSV〕,便可將所有資料匯出成 CSV 檔案,並儲存於 microSD 卡。亦可透過〔主要桌面〕中點選〔喜好設定〕,自行設定 CSV 備份檔案的儲存位置。
▲ 圖22
[源碼秘技] 用自由軟體 Plone 來架設網站(10)-連接資料庫
marr/文 2011-08-05
儘管 NoSQL 一度成為熱門話題,我們還是活在 SQL 世界裡,到處可見 RDBMS (Relational database management system) 作為資料服務的後端引擎,使用 ZODB (Zope Object Database) 的 Plone 該如何與 SQL 資料庫和平共處,必然是整合人員關心的議題。想要存取 SQL 資料庫,早期是透過 Database Adapter 直接建立連接,再用 Z SQL Method 建立存取邏輯的程式,最後由 Page Template 建立操作介面。
除了 Database Adapter 之外,現在常見作法則是透過 SQLAlchemy 來連接,因為 SQLAlchemy 提供 Object-Relational-Mapper (ORM) 介面,讓 Python 程式員擁有更直覺的操作經驗。由於 RDBMS 的 transaction 系統必須和 Zope 搭配合作,SQLAlchemy 並不能直接在 Zope 裡面工作,必須藉由 zope.sqlalchemy 模組來整合。利用這些工具,本文將在 Plone 4.1 環境,分別以 MySQL 和 PostgreSQL 為範例,介紹幾種常見的資料庫結合方式。
整合原理
以 Database Adapter 為例,它們屬於 Zope 系統的低階程式,和資料庫連接後,透過 Database Connection 和 Plone 應用程式互動,如圖1 所示。
▲ 圖1 Zope 和關聯式資料庫連接示意
建立 Database Connection 後,通常再透過 Z SQL Method 存取資料庫,執行包括「查詢」、「新增」、「刪除」、「修改」的動作,執行結果再由 (Python) Script 或 Page Template 處理,最後產生成 HTML 給使用者,如圖2 所示。
▲ 圖2 透過 Z SQL Method 存取資料庫的示意
系統可以存在多個 Z SQL Method 和 Database Connection,同時存取不同的資料庫內容。
存取既有資料庫
MySQL 是很常見的線上資料庫選項,Python 或 Plone 可以透過 MySQL-python 和 ZMySQLDA 來連接,安裝方式是在 develop.cfg 檔案裡指定 MySQL 的 python 函式庫,還有 [zmysqlda] 的設定值,如圖3 所示。
註:由於 ZMySQLDA 未必追上 Zope2 的更新速度,有些變通的修改技巧,可私下討論,不在此文細述。
▲ 圖3 develop.cfg 設定 ZMySQLDA 範例
成功啟動 Zope 後,在 ZMI 裡可以看到 Z MySQL Database Connection 的新增選項,如圖4 所示。
▲ 圖4 ZMI 下拉選單可新增 Z MySQL DC
只需要在 Database Connection String 欄位,依序填寫 database user password 等參數,就能完成基本連結,如圖5 所示。
▲ 圖5 填寫 Z MySQL DC 連接字串
進入 MySQL_database_connection 後,點選 Test 頁籤,在此可編寫 SQL 語法,直接管理 MySQL 資料庫表單,例如,在文字區塊中填寫建立表單的語法,如圖6 所示。
▲ 圖6 在 Test 頁籤執行 SQL 語法
再點選 Submit Query 按鈕確認執行,系統回覆我們成功建立一個 dirbook 表格,如圖7 所示。
▲ 圖7 系統回應 MySQL 指令執行結果
點選 Browse 頁籤,可顯示新建表單的狀況,如圖8 所示。
▲ 圖8 在 Browse 頁籤顯示表單狀況
接著,可以繼續執行 SQL 語法來新增資料,如圖9 所示。
▲ 圖9 在 Test 頁籤執行新增資料
建立 Z SQL Method
假設 mysite 的 Plone 網站裡已建立一個 /mydirbook 目錄,我們在 ZMI 的 /mysite/mydirbook 裡,新增一個 Z SQL Method,如圖10 所示。
▲ 圖10 在 ZMI 新增 Z SQL Method
編輯 Z SQL Method 的 Id 和 Connection Id 欄位,假設我們要建立查詢的程式,在 Query Template 欄位輸入查詢的 SQL 語法內容,如圖11 所示。留意不需要在語法最後加上「;」符號。
▲ 圖11 編輯 Z SQL Method 內容的範例
同樣可以到 Test 頁籤,測試查詢結果,成功的話,畫面類似圖12 所示。
▲ 圖12 Z SQL Method 查詢結果範例
再於 /mysite/mydirbook 裡新增 Z Search Interface,選擇上述建立的 query_search,填寫 Report Id 和 Report Style 欄位,並選擇 Generate Page Templates 為程式碼格式,如圖13 所示。
▲ 圖13 編輯 Z Search Interface 內容的範例
此時,已經可以在 http://localhost:8080/mysite/mydirbook/result_search 之類的網址,看到資料庫查詢結果,不過,結果畫面還未跟 Plone 介面整合。
與 Plone 頁面結合
接著,我們需要修改 Search Interface 的 Page Template 內容,把上述的查詢結果,與 Plone 頁面結合。不過,預設的 Page Template 內容有多餘的 HTML 標籤:
<html<body>
<html>
· here/query_search;
start request/start|python:0;
batch python:modules['ZTUtils'].Batch(results,
size=20,
start=start);
previous python:batch.previous;
next python:batch.next"
顯然的,多了一組標籤,請先刪除。
我們將從最簡單的調整做起,把 <div metal:fill-slot="main"> 加在 <html> 與 <body> 之間,再把 </div> 加在 </body> 與 </html> 之間。完整的程式碼如下:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:metal="http://xml.zope.org/namespaces/metal"
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
lang="en"
metal:use-macro="here/main_template/macros/master"
i18n:domain="plone">
<div metal:fill-slot="main"> <body tal:define="results here/query_search; start request/start|python:0; batch python:modules['ZTUtils'].Batch(results, size=20, start=start); previous python:batch.previous; next python:batch.next"
tal:attributes="href string:${request/URL0}?start:int=${next/first}"
href="/next_url"
<table border>
<tr>
<th>Name</th>
<th>Email</th>
<th>Tel</th>
</tr>
<tal:x repeat="result batch" >
<tr>
<td><span tal:replace="result/name">name goes here</span></td>
<td><span tal:replace="result/email">email goes here</span></td>
<td><span tal:replace="result/tel">tel goes here</span></td>
</tr>
</tal:x>
</table>
<p>
<a tal:condition="previous"
tal:attributes="href string:${request/URL0}?start:int=${previous/first}"
href="/previous_url">previous <span tal:replace="previous/length">20</span> results</a>
<a tal:condition="next"
tal:attributes="href string:${request/URL0}?start:int=${next/first}"
href="/next_url">next <span tal:replace="next/length">20</span> results</a>
</p>
</body>
</div>
</html>
這樣就把 Z SQL Method 的執行結果與 Plone 頁面結合,如圖14 所示。
▲ 圖14 Z SQL Method 執行結果與頁面整合
同步備份的場合
另一個常見的應用方式,是備份 Plone 內容到 SQL 資料庫裡。安裝 ore.contentmirror 模組後,就能夠把 Plone 網站的內容,同步備份到 SQL 資料庫,這種方式特別適合全新的 Plone 網站,原本儲存到 ZODB 的內容資料,會同時儲存在 SQL 資料庫。
ore.contentmirror 原則上支援所有 Archetypes 的內容,也支援各種常見的 SQL 資料庫,下列則以 Plone 4.1 環境搭配 PostgreSQL 作為範例。
在 develop.cfg 設定檔裡,指定 eggs 和 zcml 設定值,並新增 [zopepy] 的設定內容,如圖15 所示。
▲ 圖15 安裝 contentmirror 的 develop.cfg 內容
特別注意到 psycopg2 的安裝,它扮演 Database Driver 角色。
接著,要執行設定步驟,先找到 ore.contentmirror 安裝的目錄位置,例如 buildout-cache/eggs/ore.contentmirror-0.7.1-py2.6.egg/ore/contentmirror 目錄,建立一個 settings.zcml 檔案,內容如圖16 所示。
▲ 圖16 settings.zcml 設定範例
最重要的內容是 裡的資料庫連接設定值,其中的 postgres:mypass 分別代表存取帳號和密碼,請自行配合修改,最後面的 ContentMirror 是資料庫名稱。
接下來的步驟,是產生 SQL DDL/Schema 檔案,可藉由 mirror-ddl 工具程式來完成,原則上的指令內容如圖17 所示。
▲ 圖17 資料庫 Schema 建置的指令步驟範例
不過,實際上很可能會遇到建置失敗的訊息,我們將嘗試下列的修改,把 mirror.sql 檔案裡的 DATETIME 改為 TIMESTAMP,如圖18 所示。
▲ 圖18 mirror.sql 內容範例
同樣的原理,再把 mirror.sql 檔案裡的 BLOB 改為 BYTEA,如圖19 所示。
▲ 圖19 修改 BLOB 成為 BYTEA 的範例
最後,再把 mirror.sql 檔案裡的 IN (0, 1) 改為 IN ('f', 't'),如圖20 所示。
▲ 圖20 修改 IN (0, 1) 成為 IN ('f', 't)
成功執行 psql ContentMirror < mirror.sql 的結果如圖21 所示。
▲ 圖21 成功執行 psql 的訊息範例
接著,建立新的 Plone 網站,並新增內容後,使用查詢工具瀏覽資料庫,就會發現系統已經同步備份內容資料。
結論
以上範例分別以 MySQL 和 PostgreSQL 練習操作,原理可以應用到不同的 SQL 資料庫。從技術角度來看,我們概分成「直接連結」和「ORM 連結」兩種類型,對直接連結的場合,只要找得到 Database Adapter 就行,必要時要花錢購買商業版本的 Adapter 軟體,使用 ORM 連結的場合,目前跟著 SQLAlchemy 走就行了。
如果你有大量舊資料,已經藉由 RDBMS 管理,或是想用 SQL 資料庫來執行靜態資料的查詢,都可以利用上述方法提供整合服務。不過,ZODB 已是身經百戰的資料庫系統,非常適合用於開發階段,即使上線服務,效能也沒問題,它被迫退居幕後的主要原因,在於支援人力並不足夠。
報主的話
報主的話: 更多自由軟體相關新聞及文章,請按此閱讀或訂閱。 |