2008/12/30

Plone PAS

PAS (Pluggable Authentication Service) 在 Plone 2.5 之後,成為會員管理的標準機制,在此之前使用的則是 User Folder,相同的是,這兩種機制都會在 ZMI 裡出現 acl_users 物件項目。由於 User Folder 架構擴充性不足,想要新增功能時,就得設計新的 User Folder,諸如 GRUF、LDAPUF、PUF 等,都是衍生產物,而且,更換 User Folder 並不是平順簡單的過程。

PAS 則是採取 plugin 方式來擴充功能,像是處理 role、authentication、identification、property 等資訊,具體的例子如 GMail Authentication 可以讓使用者以 GMail 帳號密碼來登入,或 NTLM Authentication 可以讓 Windows domain 裡的使用者自動登入,而整合 LDAPRelational Database 也是常見的方式。

2008/11/21

buildout with MinGW

在 Plone 下載網頁,看得到 Windows 版本的 builout installer 了。
與傳統 Windows installer 不同的地方,主要是目錄架構改變了,這倒容易習慣,但使用 buildout 時,經常會用到 C 編譯器環境,則需要花些工夫準備。
MinGW 為例,先下載 Automated MinGW Installer 安裝,例如裝在 C:\MinGW 目錄,到 C:\MinGW\libexec\gcc\mingw32\3.4.5 目錄把 cc1.exe 和 collect2.exe 複製到 C:\MinGW\bin 目錄,下載 libpython24.a 放到 C:\MinGW\lib 目錄,再把 C:\MinGW\bin 加到系統環境變數 PATH 裡。
在 shell 裡執行 gcc --version 測試是否成功。
接著要通知 Python 的 distutils 已可以使用 MinGW,以 Plone 安裝在 C:\Plone3 目錄為例,要到 C:\Plone3\python\Lib\distutiles 目錄裡建立 distutils.cfg 檔案,內容是

[build]
compiler=mingw32

我有遇到 "missing structmember.h" 之類的訊息,處理方法是,下載 Python 原始碼檔案,複製 Include 目錄到 C:\Plone3\python\Include 目錄。
如果想要 Plone 以 Windows service 方式執行,可以先用 bin\instance install 指令,日後就可以直接使用 bin\instance start 或 stop 來啟動或關閉。
如果 Windows 使用防火牆,用 bin/instance fg 啟動後,系統會提示是否要打開 port。
其他更多的設定細節,可以參考 Using buildout on Windows 文件。

2008/11/04

Allowed Member ID in Plone

填寫 Plone 會員註冊表單時,會員名稱 (User Name) 預設不能使用空白或特殊符號,甚至第一個字元必須是英文字母,因此,像電郵信箱或整排數字,預設是不合法的會員名稱。
執行檢查的程式位於 CMFCore/RegistrationTool.py 檔案,原始碼片斷如下:

class RegistrationTool(UniqueObject, SimpleItem):

""" Create and modify users by making calls to portal_membership.
"""

implements(IRegistrationTool)
__implements__ = (z2IRegistrationTool, )

id = 'portal_registration'
meta_type = 'CMF Registration Tool'
member_id_pattern = ''
default_member_id_pattern = "^[A-Za-z][A-Za-z0-9_]*$"
_ALLOWED_MEMBER_ID_PATTERN = re.compile(default_member_id_pattern)

其中的 default_member_id_pattern 就是預設的合法名稱樣版,它使用 regular expression 格式,意思是說,開頭字元必須使用英文字母,接著的字元也必須是英文字母或數字或底線符號。
例如,想要限用電郵信箱當作會員名稱,可用的條件格式是 ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$
關於使用電郵信箱當會員名稱的缺點,根據 Anton Stonor 表示,這容易導致隱私資料外漏,因為 template 裡大量用到 ID 資料。

2008/10/16

VIM with Mandriva

在 Mandriva 上使用 VIM 遇過輸入中文,會產生亂碼的現象,例如輸入「中文」這兩個字,「中」是正常,但「文」就變成亂碼,原本都從修改 LC_* 或 TERM 環境變數下手處理,成效不彰。最近發現,出問題的主機都只裝 vim-minimal 而沒有 vim-enhanced 檔案,把 vim-enhanced 補上,就好了,特此一格。

2008/10/14

Security in Plone3

網站的安全機制 (security) 由 Zope 在系統底層負責,管理員和開發者應該了解「權限」「角色」「使用者」「群組」等概念,才能發揮安全機制帶來的便利。

首先,要有足夠的權限才能存取網站內容,不然,會遇到 AccessControl.Unauthorized 的訊息回應。權限 (permission) 並不是直接對應給使用者 (user),而是先被指定給角色 (role),再經角色指定給使用者。

一位使用者,可以被指定多種角色,生效範圍可以是全站性,或是只在特定目錄裡生效。角色也可以指定給群組 (group),如此一來,群組裡的使用者就具備被指定的角色。


在 ZMI 裡 Security 頁籤,可以看到整個系統的「安全列表」,多數權限項目的「Acquire permission settings?」選項是打勾狀態,表示「會繼承上一層目錄的權限結果」,在此情況下,角色設定的效果會再加上去。

一般情況下,並不需要去更改安全列表的設定狀況,即使需要調整,也應該只更改網站根目錄的設定值。除此之外的情況,都會讓整個安全機制變得很複雜。

權限是安全機制裡的最小單位,網站應用軟體如果用到安全機制,通常是要檢查權限,而不是檢查角色。檢查使用者或群組名稱,通常不是好主意。

Professional Plone Development 書中第 83 頁,提到 "Security-aware code should almost always check for permissions, rather than roles. Checking for specific user or group names is rarely a good idea, because roles can change depending on the current context and security policy of the site." 我猜,它的意思是「檢查角色、使用者名稱、群組名稱,都應該盡量避免」吧。

2008/10/12

My Folder in Plone3

在 Plone3 之前,登入會員帳號後,可以在 personal bar 看到 my folder 的連結項目,但在 Plone3 之後,已取消這樣的呈現方式。

也就是說,即使在 Site Setup 裡 Security 選項,把 Enable User Folders 打勾生效,僅管登入會員帳號後,可用 /Members/myuser 之類的網址找到 myuser 使用者的個人目錄,但在 personal bar 還是找不到 my folder 的連結項目。
如果想要「恢復」原本的呈現效果,可到 ZMI 設定,進入 portal_actions 裡會看到 user 或 portal_tabs 之類的 CMF Action Category 項目,再新增一個 CMF Action 項目 ID 可指定為 myfolder,Title 指定為 My Folder,I18n Domain 指定為 plone,URL (Expression) 指定為 string:${portal/portal_membership/getHomeUrl},Condition (Expression) 指定為 python:(member is not None) and (portal.portal_membership.getHomeFolder() is not None),Permissions 指定為 View,將 Visible 打勾,最後按 Save Changes 確認。
這樣就會在 personal bar 看到 My Folder,但如果想要調整它呈現的位置順序,例如在 Log out 之前,可以利用 Up / Down 按鈕來調整。
詳細的說明可參考 http://dev.plone.org/plone/ticket/7075

2008/10/03

Plone Debug Mode

首先,要找到 etc 目錄裡的 zope.conf 檔案,確認設定值是 debug-mode on 的狀態。如果前面有「#」符號,表示是「註解」之意,要移掉「#」符號。

其次在 ZMI 裡找到 portal_css 項目,進入後在 CSS Registry 頁籤,會看到 Debug/development mode 選項,把它打勾,表示要讓 debug mode 生效。


同樣在 ZMI 裡找 portal_javascripts 項目,把 Debug/development 選項打勾生效。


如果沒把 debug mode 生效的話,修改結果不會即時反應。

如果不想經常重新啟動 Zope,可以安裝 plone.reload,最簡單的方法,是在 buildout.cfg 裡的 egg 與 zcml 設定區塊,指定 plone.reload 模組,重新執行 buildout 並以 Manager 身份登入後,透過 http://localhost:8080/@@reload 之類的網址,就可以 Reload Code 或 Reload ZCML 了。

2008/09/16

QOTD: Paul Graham on Language

摘自 Hackers & Painters

* 電腦程式只是文字。選用的語言則決定了你的語彙能力。程式語言是程式設計者思考的方式。

* 程式設計師傾向歸屬於所用語言的派別,甚至比他們所用的語言區隔更大。因此,談到某種語言優於其他,會被認為是壞習慣。但是連程式設計師自己都不相信這種虛偽的禮節。我對於程式語言的看法或許會惹怒很多人,不過我認為這是了解駭客最好的方法。

* 程式語言是用來思考程式,而不是用來展現你已經想出來的程式。它應該像是一支鉛筆,而不是一支鋼筆。如果大家寫程式的方法跟我大學所學相同,靜態型別應該會是一個優秀概念,不過,我所認識的每一位駭客,都不用這種方式來撰寫程式。我需要一個可以隨意擦寫塗抹的程式語言,而不是讓語言要求我正襟危坐地捧著型別,非常禮貌地與嚴謹過時的編譯器對話。

2008/09/12

NuPlone Hacking

NuPlone 是 Plone3 的內建模組,啟用後能讓網站外觀煥然一新,參看它的程式內容,也可以一窺 GenericSetup 和 CSS Registry 的設定方法。自己還沒找到滿意的 Plone3 Skin 教學文件,而且發現 qPloneSkinDump 目前只支援 Plone2.5,只好逛進 NuPlone 目錄。在 skins/nuplone_styles 裡,像 base.css, columns.css 等檔案是空檔,它們會「蓋」掉系統預設的設定值嗎?

2008/09/03

jQuery Example on Plone

jQuery 是一套 JavaScript 函式庫,可用來處理動態網頁或 AJAX 技術。台灣有 jQuery 中文社群今年六月剛在 http://groups.google.com/group/jquery- 成立討論區。

如何讓 CMS 結合 jQuery 之類的技術呢? 在 David Bain示範影片,可以看到 Plone3 製作 Fade In 文字效果的步驟。對新手而言,影片內容過於簡略,我把實作過程的細節補充於此。

設定 Kupu 的 Character Style

進入 Site Setup 點選 Visual editor,在 Styles 區塊裡新增 Fade In 選項並存檔,格式和內容如下:
Fade In|span|fadeIn

建立並註冊 javascript 程式

進入 ZMI 點選 portal_skins 到 custom 目錄,新增 DTML Document 設定 id 為 custom-jquery.js 點選 Add and Edit,在方框裡填寫如下內容並存檔:
jq(document).ready(function(){
//
jq('.fadeIn').fadeIn(10000);
});
範例中的「jq」就是 Plone 裡 jQuery 控制符號。

進入 ZMI 點選 portal_javascripts 在 Add a new script 方框裡設定 id 為 custom-jquery.js 按 Add 鈕,再把 Debug/development mode 選項打勾按 Save 鈕。

新增 CSS 設定值

進入 ZMI 點選 portal_skins 的 plone_styles,再點選 ploneCustom.css 裡的 Customize 鈕,在方框裡加入下列內容並存檔:

.fadeIn {
display: none;
}
點選首頁 Edit 在 Body Text 方框裡選取想要設定 Fade In 效果的文字,存檔後可以看到效果。

2008/08/28

GenericSetup

對於 Plone 管理員,經常有客製化的需求,例如在 custom skin 目錄裡存放客製化的圖片和 CSS 檔案,如果這類的客製化工作必須重覆執行,善用 Plone 工具 - GenericSetup 才是聰明方法。

GenericSetup 處理 Plone 網站的設定議題,例如新建 Plone 網站後的客製化調整,可以記錄成一連串的指令,不但可以 import 也可以 export,或是得知安裝系統迄今的調整狀況。

profile 是 GenericSetup 裡的特別設定檔,它包含一組 XML 檔案,用以描述網站的設定狀態。另一種相關的設定檔稱為 install method,它和 profile 不同之處,在於描述讓網站變成某種設定狀態的步驟。

2008/08/27

Crowdsourcing

這個字在遠見雜誌出現過,「美國紐約大學新聞系教授 Jay Rosen 和 Wired 雜誌做了一個新媒體實驗,設立 Assignment Zero 網站,讓大眾參與新聞製作。他們希望兩年內募集150萬美元來完成這個計畫,包括路透社、麥克阿瑟基金會都捐款支持。就像一般的新聞中心,這個網站有一組約十位的新聞專業作者、編輯、文稿、版面設計等,他們設定監督流程,在每一個新聞寫作步驟中,丟出「工作」讓大家認領,再把網上收口的資料導引到專業方向。這樣的構想作法被稱為 crowdsourcing。」
在軟體領域,這不是新鮮事,軟體專案發起人在網路上提出初期的構想與原始碼,吸引其他同好回饋修訂意見與程式。很多領域都能套用 crowdsourcing 的步驟方法,但共通的挑戰都來自於「如何讓社群的爐火加溫加大」。
群眾運動需要領袖,專案領袖在 crowdsourcing 成功過程中扮演關鍵的角色。專案前進的動能來自於願景與分工,專案領袖無法全面控制專案的步調,但透過願景與分工的詮釋,仍握有專案發展的權杖。某個角度來看,網路專案就是一段權力與信任關係的演化史。

2008/08/16

Right Sort of Wrongness

It says a great deal about our work that we use the same word for a brilliant or a horribly cheesy solution. When we cook one up we're not always 100% sure which kind it is. But as long as it has the right sort of wrongness, that's a promising sign. It's odd that people think of programming as precise and methodical. Computers are precise and methodical. Hacking is something you do with a gleeful laugh. -- The Word "Hacker", Paul Gramham
絕頂聰明和糟糕透頂的方法,我們會用同一個字眼去形容它們,這是司空見慣的情況。當我們料理食物時,不可能保證結果完全如同預期,但只要能從錯誤結果看出對的端倪,那就是好徵兆。令人費解的是,人們會以為 programming 是一件精準、有條理的工作,事實上,computer 才是精準、有條理的,而 hacking 則是在歡笑中進行。

2008/08/11

Linux Application Checker

如果你在 Linux 上寫了一套應用程式,當然會希望,什麼都不改,就能讓它在各種版本上執行。

透過 Linux Application Checker ("AppChecker") 的協助,離這樣的理想又近了一步。這套工具最早由 Russian Academy of Sciences 與 Linux Foundation 合作發展,以 Linux Standard Base (LSB) workgroup 既有的成果為基礎,處理 cross-distro portability 和 LSB compliance 的議題,簡言之,它簡化並提昇 Linux 應用程式的移植性。

2008/08/08

Plone Translation

處理了幾件跟 Plone 翻譯有關的小工作,先是跟 xiangyang 一起翻譯 Guidelines for Translators,跟 tcchou 聯絡上,確認譯好的 po 檔案可以傳給他,再跟同事介紹 Plone 訊息翻譯的作法,以 Plone 3.1.4 為例,在 personal_bar 會看到 History 還未譯好,比對後發現它是歸 PloneTranslations/i18n/cmfeditions-zh-tw.po 所控制。


collective PloneTranslations
用 subversion checkout 後,可用小技巧查詢 POT-Creation-Date 找出最新的更新檔案:
$ grep -r POT-Creation-Date `find . -name "*-zh-tw.po"`

2008/06/19

Find and Remove Files

$ find . -name "*.pyc" -type f -print0 | xargs -0 /bin/rm -f

一般情況 find 預設使用 -print 參數,如果擔心找到的檔名含有空白、換行等符號,使用 -print0 較安全,而且搭配 xargs 時會使用 -0 參數。

2008/06/14

Communication Breakdown - Led Zeppelin


1969 年六月19日 Led Zeppelin 在法國的開場演出,聽眾事先可能不知道會有搖滾樂團出現,有位媽媽還抱著沈睡襁褓的小孩。
Communication Breakdown 是 Led Zeppelin 在 1969 年一月第一張專輯裡的作品,據說此曲的吉他是受到 Eddie Cochran 的 Nervous Breakdown 啟發,有段間奏是重覆式的爬階,Jimmy Page 表示是這首歌最難的部份,此外,這也是少數 Page 擔任合音的歌曲之一。
這首歌是在樂團履行演唱合約過程中,所合作出來的新作品,在美國曾以單曲方式發行,但並未出現在排行榜。Jimmy Page 這首歌的吉他彈奏方式,啟發了 The Ramones,而 Iron Maiden 後來曾在 Eddie's Archive 盒裝光碟第六張裡收錄此曲。

Open Controlling

Android 以 Linux 為基礎,但開發策略是「先閉門造車,然後再開放源碼」,為什麼 Google 會這樣做?
Red Hat 技術長 Brian Stevens 認為 Google 該更早開放原始碼,「社群如果對商業公司領頭的計畫感到興趣,通常是在產品概念形成的階段,肯定不是產品出貨的時刻。」Mozilla 的 Mike Schroepfer 講得更白,「公開源碼並不是難事,最難的是公開決策機制,讓公司之外的人員也能分享決策權。」「社群要是發現講話不受重視,他們是不願意參與計畫的。」
為了確保公司開放源碼後仍能獲致最大效益,Android 的 技術總監 Andy Rubin 說明實務作法,原始碼公開後,同意或否決 patch 的權力將交由各專案管理員,Google 則會提供 certification test suite 來確保 Android 成果的一致性,通過 certification 的專案能使用 Open Handset Alliance Android 商標。「這不是說,你不能搞自己的 branch,而是,你會發現不想去搞自己的 branch。」
有了這樣聰明的陽謀並不夠,Android 計畫還要處理 licensing 議題。手機廠商都想利用 proprietary feature (特別是使用者介面層的應用程式) 來突顯自家品牌的市場優勢,避開 GPL 要求公開原始碼的無限上綱威脅,成為商業聯盟的另一項重要考量,因此 Google 選擇限制較小的 Apache License
open source 與 proprietary 之間的平衡拿捏,對產業而言,正處於做中學的階段。

2008/06/10

The Origins of Linux

影片據稱錄於 2001年 9月 19日,由 Linus Torvalds 介紹 Linux 的故事,影片提供人是 Computer History Museum,其網站維護一份電腦編年史

2008/06/06

How Do Python and RubyOnRails Relate?

有朋友提到這問題。

Python 和 RubyOnRails 是兩個不同範疇的技術項目,最明顯的共同點,它們都是當紅的開發工具。RubyOnRails 是 web application framework,使用的是 Ruby 語言,因此,拿 Ruby 和 Python 來秤斤論兩尚稱公允,Python 世界裡也有 web application framework,而且百家爭鳴,例子有 Zope, Django, Turbo Gears, Pylons 等。

Python 老爹曾評論過它們,當然,挑自己順手的工具,才是聰明的作法。

2008/05/27

Python Version of wget

據說是 Guido van Rossum 在 Python Cookbook 的例子。
import sys, urllib
def reporthook(*a): print a
for url in sys.argv[1:]:
i = url.rfind('/')
file = url[i+1:]
print url, "->", file
urllib.urlretrieve(url, file, reporthook)

2008/04/13

Unix Command of the Day

$ history | awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}'|sort -rn |head -n 20

2008/04/11

Key Factors for a Sucessful Startup

據林富元表示,有十八訣:
有無良好完整的成熟經營團隊?
有無與眾不同而居於領先的知識能力?
對市場是否有踏實而足夠的認識? 所嚮往的市場是否處在初生期或成長期?
是否一窩蜂追逐時尚隨波逐流?
有無知識產權或產品的智慧財產?
企劃中的產品或服務是否擁有很高的進入門檻?
對檯面上隱藏中的競爭者有無充份的了解?
知道自己在市場上,依長處而取決的區隔定位嗎?
有無完整的三至五年計畫書及財務分析報表?
是否能籌募完整足夠的創業基金?
投資股東有附加價值嗎?
經營團隊與投資股東享有良好互補關係? 它將影響你股東未來與你一路跟進的支撐力?
主要領導者的人格品質與靈活堅忍性? 有無能力雄厚的 CEO 對企業的影響成敗至大。
公司的整體文化為何? 撇開教條與文宣,公司整體是否具有共體時艱的內在文化?
這個企業能吸引到足夠的夥伴與聯盟?
團隊有市場開發能力嗎?
公司的遠景與願景是永續經營或曇花一現?
最終的最偉大雋永的價值,你是否取得了內外大眾的信任?

2008/03/06

Plone Package Management with buildout

在 Zope2 以前的時代,新增模組的方式,是把下載來的模組檔案解開到 Products 目錄裡,但這樣的方式至少有下列的缺點:
* 不易整合 egg 或 setuptools 帶來的便利,這些是 Python 在模組包裝與系統擴充上的新方案,越來越多的 Python 模組以 egg 型式來包裝,並利用 setuptools 來散佈與佈署,新版 Zope 與 Plone 也需要配合這項潮流。
* 傳統 Zope2 模組管理方式,無法提昇軟體重用性,讓 Zope 與 Plone 成為對外孤立或競爭的環境。

因應上述模組管理的新需求,新版 Zope3 利用 buildout 機制,充份發揮 egg 的效益。不過,舊有的名詞現在被更改,系統運作的細節也有所不同,例如 Zope 的 instance 以往是透過 mkzopeinstance.py 來建立,現在改由 buildout 接手,而模組命名方式,也由 PloneSomeProduct 改成類似 plone.app.some 型式,以便不同的模組能整理在相同的 namespace 之下,最後,再透過 configure.zcml 之類的檔案來註冊模組。

安裝 buildout 的方法,是先準備好 Python 環境,以 Plone 3.0.6 版本為例,要配合 Python 2.4.x 版本,並記得加入必要的模組,例如 PIL 等。再安裝 setuptools 工具,可下載 ez_setup.py 並執行 python ez_setup.py 完成,重點就是讓 easy_install 能正常運作。接著安裝 ZopeSkel 工具,可執行 easy_install -U ZopeSkel 指令,它會安裝好 paster 程式。

執行 paster create --list-templates 會列出可指定的 template 項目,必須至少包含 plone3_buildout 項目,接著就可以執行

$ paster create -t plone3_buildout myproject
$ cd myproject
$ python bootstrap.py
$ ./bin/buildout
$ ./bin/instance start

2008/03/05

ZPyODBCDA with MSSQL

之前在 Plone 連接過 MySQL 與 PostgreSQL,現在 Microsoft SQL server 也成功了。操作的環境是在 Mandriva 2008 上,已知滿足
unixODBC, libunixODBC1, libunixODBC1-devel, libfreetds0, libfreetds0-unixodbc (可考慮額外加裝 libfreetds_mssql0, libfreetds_mssql0-unixodbc) 這些安裝檔案相依關係後,能成功完成設定。題外話: 或許不需要安裝這麼多檔案,但一時之間也懶得細究了。

ODBC driver 和 data source 設定方式可參考 unixODBC with MS SQL 文件。此處設定 driver 應是主角,我使用 Driver = FreeTDS 設定值,設定內容會記錄在 /etc/odbcinst.ini 檔案裡。題外話: 猜想 data source 留待在 Zope 裡 database adapter 設定即可,透過 odbcinst 指令我還是將兩者都設定好,但 data source 設定值能成功記錄在 $HOME/.odbc.ini 而非 /etc/odbc.ini 檔案,讓我感到困惑。如果需要更多的設定參數,可參考詳細參數資料

我使用的 Plone 環境是 UnifiedInstaller,要先裝好 pyodbc,例如 Plone-3.0.6/Python-2.4.4/bin/python setup.py install,接著再安裝 ZPyODBCDA。題外話: 原本試著放到 Plone-3.0.6/lib/python 目錄,並沒生效,這裡算是 SoftwareHome 的位置,改放在 Plone-3.0.6/zeocluster/Products 裡才成功,因為 zeocluster 目錄算是 InstanceHome 位置。

再從 ZMI 裡新增 Z PyODBC Database Connection,填寫 connection string 內容,重點是 DRIVER={FreeTDS} 也就是配合前述的設定值。


成功新增後,可到 Test 執行 SQL 指令來測試。

2008/02/25

Headhunting Skills

自稱是 searchologist 的 Jim Stroud 在 How to find Python programmers in 30 seconds or less 短文裡,示範如何用 Python Search 服務來獵工程師人頭,此例當然是以 Python 程式員為對象。「先找對人,再決定要做什麼」,這是一種管理上的境界,而在網路上找到人才資源的方法,被稱為 digability