2009/07/25

plonectl debug

以 standalone 方式安裝 Plone3 installer 後,可用 zinstance 目錄裡 bin/plonectl 程式來啟動 Zope/Plone,bin/plonectl 功能和之前的 bin/instance 一樣。例如執行 bin/plonectl fg 後,除了啟動 Zope/Plone 外,還可以在 shell 即時顯示系統訊息。使用 fg 或 start 參數啟動 Zope/Plone 後,它會鎖住 Data.fs 檔案,代表這種啟動方式只允許一個 client 存取 ZODB。想要多個 client 同時存取 ZODB,必須改用 zeo 安裝方式。

在 Data.fs 沒被鎖住的情況下,可以執行 bin/plonectl debug 手動存取 ZODB 內容。

$ bin/plonectl debug
instance: Starting debugger (the name "app" is bound to the top-level Zope object)
>>> dir()
['Zope2', '__builtins__', '__doc__', '__name__', 'app', 'configure']
>>> app.Plone['front-page'].getRawTitle()
'Welcome to Plone'
>>> app.Plone['front-page'].setTitle("New Title for Plone Site")
>>> import transaction
>>> transaction.commit()

>>> myitem = app.mysite['my-folder']['001']
>>> myitem.meta_type
'MyType'

以上是最簡單的範例。下列是其他範例,記得改過內容的話,都要使用 transaction.commit() 來確認寫進 ZODB。

>>> for k, v in app.Plone.Members.marr.objectItems():
...     print k, v.getRawText()
...
>>> for obj in app.Plone.Members.marr.objectValues():
...     obj.setText('<h2>My Test</h2>')
...

另外還可以把指令寫成 script 檔案,例如 updateTitle.py 的內容:

app.Plone['front-page'].setTitle("New Title Updated by Script")
import transaction
transaction.commit()

再用 bin/plonectl run updateTitle.py 執行結果。如果需要 admin 權限的話,要事先加上權限宣告:

import os
import transaction

from AccessControl.User import UnrestrictedUser
from AccessControl.SecurityManagement import newSecurityManager

admin = UnrestrictedUser('admin', '', ['Manager'], '')
newSecurityManager(None, admin)

app['mysite'].mytype['my-item'].setStartDate('1918/01/01')
transaction.commit()

2009/07/18

EMP: Collision of Styles

NGC 介紹了 Frank Gehry 著名的建築計畫,不規則曲線的建築結構是 Gehry 的特性,他並大量引用電腦系統來設計並交換資料。西班牙 Bilbao Guggenheim Museum 是他較早期的作品,九年後他在 Paul Allen 的委託下,在西雅圖完成了 Experience Music Project。因為 Paul Allen 和 Jimi Hendrix 都出身於西雅圖,促使這項搖滾樂體驗館的誕生,當然,還要靠 Frank Gehry 才能讓這項酷斃的建築物,充份包含並展現搖滾文化的多樣性。

2009/07/10

Deliverance Installation

Deliverance 是管理 web theme 的工具,常見的用法是,即時結合 site A 的應用程式和內容,和 site B 的佈景主題外觀,透過 WSGI 技巧將整合過的網頁呈現給使用者。有圖有真相,請參考 screencast 介紹。

QuickStart 頁面裡,提及 virtualenv, buildout 的不同安裝方法,我是用 Plone 3.2.2 UnifiedInstaller 的 buildout 安裝成功,在 buildout.cfg 裡加上 parts = deliverance 並新增:

[deliverance]
recipe = plone.recipe.deliverance
libxml2-url = ftp://xmlsoft.org/libxml2/libxml2-2.7.3.tar.gz
libxslt-url = ftp://xmlsoft.org/libxml2/libxslt-1.1.24.tar.gz

產生 deliverance 目錄和 bin/deliverance 執行檔後,再編輯 deliverance/deliverance-proxy.ini 內容,主要是修改 serializer 使用 deliverance.serializers:HTML4,並設定 host 和 wrap_href 後,就可以執行 bin/deliverance 看結果。想要精緻地完成整合工作,還需要設定 rules.xml 內容

2009/07/08

Quote of the Day

可能,最好的,已經在你的身邊,只是,你還沒有學會珍惜。人們總是盯著得不到的東西,而忽視了那些已經得到的東西。
社會上一夜暴富的新聞很多,這些消息,總會在我們的心裏面掀起很多漣漪,漣漪多了就變成驚濤駭浪,心裏的驚濤駭浪除了打翻承載你目標的小船,並不會使得你也一夜暴富。“只見賊吃肉,不見賊挨揍。”我們這些普通人既沒有當賊的勇氣,又缺乏當賊的狠辣絕決,雖然羡慕吃肉,卻更害怕挨揍,偶爾看到幾個沒挨揍的賊就按奈不住,或者心思活動,或者大感不公,真要叫去做賊,卻也不敢。
好吧,世道不夠好,可是,你有推翻世道的勇氣麼?如果沒有,你有更好的解決辦法麼?有很多時候,人需要一點耐心,一點信心。每個人總會輪到幾次不公平的事情,而通常,安心等待是最好的辦法。
人總是會遇到挫折的,人總是會有低潮的,人總是會有不被人理解的時候的,人總是有要低聲下氣的時候,這些時候恰恰是人生最關鍵的時候,因為大家都會碰到挫折,而大多數人過不了這個門檻,你能過,你就成功了。
逆境,是上帝幫你淘汰競爭者的地方。要知道,你不好受,別人也不好受,你堅持不下去了,別人也一樣,千萬不要告訴別人你堅持不住了,那只能讓別人獲得堅持的信心,讓競爭者看著你微笑的面孔,失去信心,退出比賽。勝利屬於那些有耐心的人。
其實選什麼行業真的不重要,關鍵是怎麼做。事情都是人做出來的,關鍵是人。
每天,每一刻我們都在做這樣那樣的決定,我們可以漫不經心,也可以多花些心思,成千上萬的小選擇累計起來,就決定了最終我們是個什麼樣的人。
你可以選擇把這輩子最大的困難放在最有體力最有精力的時候,也可以走一步看一步,等到了40歲再說,只是到了40多歲,那正是一輩子最脆弱的時候,上有老下有小,如果在那個時候碰上了職業危機,實在是一件很苦惱的事情。
人生最需要的不是規劃,而是在適當的時機掌握機會,採取行動。
與改變世界相比,改變自己更困難。
人生有三個階段,一個階段是為現實找一份工作,一個階段是為現實,但可以選擇一份自己願意投入的工作,一個階段是為理想去做一些事情。

2009/06/25

Eggs and Plone3

egg 是 Python 世界裡散佈模組軟體的包裝機制,在 egg 環境裡,會記錄軟體專案的相依資訊,還會提供 plugin 給其他模組。實際打包成壓縮檔的方式有許多種,最常見的方式,是使用 '.egg' 檔名的 ZIP 檔案。

Python 世界的 egg 當然不只用於 Zope 或 Plone 專案裡,但是 Zope 在 2008 年才廣泛使用 egg 機制,對 Zope 2 的開發者而言,可能仍是新的議題。傳統的 Zope 2 應用程式,以 Zope product 方式來開發和散佈,只要把程式專案放進 $INSTANCE_HOME/Products 目錄,Zope 就會在啟動時掃瞄這個目錄,並處理應用程式的安裝與註冊工作,相當容易管理。

但是,上述特定目錄裡的程式碼,搭配 Products.* 命名空間的黑魔法,只能被 Zope 認得,很難再應用於其他場合,另一方面,也造成命名空間的侷限,開發者不容易建立精簡而重用性高的模組。

新版的 Zope (Zope 3) 在設計哲學上,主動走進 Python 社群成為一份子,讓專案模組能夠盡量精簡,並致力於提高模組的重用性。只要把相依關係設定好,任何模組應該都能在各式環境裡執行,例如 zope.interface 模組被 Twisted 專案所採用,但 Twisted 和 Zope 兩個專案平常是各自獨立發展的。這樣的架構方式,也讓 Zope 3 的新模組,容易被 Zope 2 或 Plone 重複使用。

從 Plone 3 開始,開發者也努力將模組精簡,像 plone.memoize 與 plone.portlets 是高獨立性的模組,其他相依於 Plone 的模組,則使用 plone.app 命名空間,例如 plone.app.layout 或 plone.app.portlets 之類的名稱,而 plone.app.portlets 就以 plone.portlets 為基礎,再針對 Plone 專案設計專屬的程式碼。

2009/06/01

Package Releases

open source developer 通常只優先抓自己的癢,一個有規模的 project 會嘗試事先宣告未來新版的改進內容,並開放一段時間,收集合適的使用者需求清單。以 Plone 為例,如果你有改版需求想要優先列入,可以與原作者溝通。

Plone 在第2版與第3版之間,擴充模組的處理方式有些不同。首先,稱呼上有所不同,擴充模組在 Plone 2 稱為 Product,在 Plone 3 則開始改稱 Package。命名的方式,Plone 2 常見的範例類似 PloneSurvey 或 WebServerAuth 這樣,但 Plone 3 常見的範例類似 Products.Maps 或 plonetheme.stylized 或 collective.indexing 這樣。

散佈時的檔案格式,Plone 2 以 tar.gz 為主,Plone 3 則以 egg 為主。安裝的目錄位置,Plone 2 是在 Products 裡,Plone 3 egg 則使用 eggs 或 develop-eggs 之類的目錄,舊式的 package 也可以放在 products 或 productdistros 目錄裡,而開發中的 package 則位於 src 目錄裡。

2009/05/26

Moblin Linux Preview

Quote from "Moblin netbook Linux preview"
"[Moblin] is a Linux desktop that's built on top of a Fedora Linux framework; uses GNOME for its desktop and applications, and will rely on Novell/SUSE to get customized versions of the desktop pre-installed on the Taiwanese OEM (original equipment manufacturers) netbooks."