十月 15, 2009
» List all of installed packages (easy_install eggs)

List all of installed packages (easy_install eggs)
example::

>>>import pkg_resources
>>>pkg = pkg_resources.AvailableDistributions()
>>>for i in pkg:
>>>    for j in pkg[i]:
>>>        print j

see also::
Package Discovery and Resource Access using pkg_resources

九月 28, 2009
» Setting Up an MPICH2 Cluster in Ubuntu 8.04 LTS Server (Quick-Note)

MpichCluster

Setting Up an MPICH2 Cluster in Ubuntu 8.04 LTS Server (Quick-Note)
(https://wiki.ubuntu.com/MpichCluster)

===========================
1. 更改 /etc/hosts,方便遠端直接快速連結。
===========================

假設有兩個 mpi node,所有 node 的 /etc/hosts 都需修改

master@mpi-1:~$ sudo vi /etc/hosts
master@mpi-2:~$ sudo vi /etc/hosts

10.211.55.5 mpi-1
10.211.55.6 mpi-2

=================================
2. 安裝及設定 NFS,讓各 node 有共享的 master folder。
=================================

master@mpi-1:~$ sudo apt-get install nfs-kernel-server

(在此以 mpi-1 主機作為 master)

設定 NFS 目錄與掛載權限

master@mpi-1:~$ sudo mkdir /mpi
master@mpi-1:~$ sudo vi /etc/exports

/mpi *(rw,sync)

master@mpi-1:~$ sudo chown master:master /mpi
master@mpi-1:~$ sudo /etc/init.d/nfs-kernel-server restart

在其他 node 掛載 mpi-1 master folder

master@mpi-2:~$ sudo mkdir /mpi
master@mpi-2:~$ sudo chown master:master /mpi
master@mpi-2:~$ sudo apt-get install nfs-common
master@mpi-2:~$ sudo mount -t nfs mpi-1:/mpi /mpi

==========================================
3. 安裝 ssh,設定金鑰讓各 node 之間以 master 帳號連結不用輸入密碼。
==========================================

(主要是為了方便往後可在 scripts 裡設定各 node 自動串連)

master@mpi-1:~$ sudo apt-get install ssh
master@mpi-2:~$ sudo apt-get install ssh

master@mpi-1:~$ ssh­-keygen ­-t dsa
master@mpi-1:~$ scp .ssh/id_dsa.pub master@mpi-2:~/mpi-1.pub
master@mpi-2:~$ cat mpi-1.pub >> .ssh/authorized_keys

master@mpi-2:~$ ssh­-keygen ­-t dsa
master@mpi-2:~$ scp .ssh/id_dsa.pub master@mpi-1:~/mpi-2.pub
master@mpi-1:~$ cat mpi-2.pub >> .ssh/authorized_keys

測試登入 (不用輸入密碼)

master@mpi-1:~$ ssh mpi-2
master@mpi-2:~$ ssh mpi-1

============
4. 安裝 MPICH2
============

http://www.mcs.anl.gov/research/projects/mpich2

只要在 mpi-1 master folder 安裝一次即可

master@mpi-1:~$ cd /mpi
master@mpi-1:/mpi $ wget http://www.mcs.anl.gov/research/projects/mpich2/downloads/tarballs/1.1.1p1/mpich2-1.1.1p1.tar.gz

master@mpi-1:/mpi $ sudo apt-get install build-essential
master@mpi-1:/mpi $ mkidr mpich2
master@mpi-1:/mpi $ tar xzvf mpich2-­1.1.1p1.tar.gz
master@mpi-1:/mpi $ cd mpich2­-1.1.1p1
master@mpi-1:/mpi/mpich2­-1.1.1p1 $ ./configure --­prefix=/mpi/mpich2
master@mpi-1:/mpi/mpich2­-1.1.1p1 $ make
master@mpi-1:/mpi/mpich2­-1.1.1p1 $ sudo make install

設定 PATH 環境變數 (每個 node 都要設定)

master@mpi-1:~$ vi .bashrc
master@mpi-2:~$ vi .bashrc

export PATH="/mpi/mpich2/bin:$PATH"
export LD_LIBRARY_PATH="/mpi/mpich2/lib:$LD_LIBRARY_PATH"

在各個 node 上測試程式路徑是否正確

master@mpi-1:~$ which mpd
master@mpi-1:~$ which mpiexec
master@mpi-1:~$ which mpirun

master@mpi-2:~$ which mpd
master@mpi-2:~$ which mpiexec
master@mpi-2:~$ which mpirun

============
5. 設定 MPICH2
============

在各個 node 上建立 .mpd.conf 及 mpd.hosts

master@mpi-1:~$ vi mpd.hosts
master@mpi-2:~$ vi mpd.hosts

mpi-1
mpi-2

master@mpi-1:~$ echo MPD_SECRETWORD=xxx-xx > .mpd.conf
master@mpi-1:~$ chmod 600 .mpd.conf
master@mpi-2:~$ echo MPD_SECRETWORD=xxx-xx > .mpd.conf
master@mpi-2:~$ chmod 600 .mpd.conf

啟動各個 node 的 mpi service

master@mpi-1:~$ mpd &
master@mpi-1:~$ mpdboot -n 2
master@mpi-2:~$ mpd &
master@mpi-2:~$ mpdboot -n 2

在各 node 上檢查是否運行成功

master@mpi-1:~$ mpdtrace
mpi-1
mpi-2

master@mpi-2:~$ mpdtrace
mpi-1
mpi-2

完工

=====================
6. 另外可搭配安裝設定 mpiBLAST
=====================
master@mpi-1:~$ sudo apt-get install libncbi6 libncbi6-dev ncbi-data ncbi-tools-bin ncbi-tools-x11 libncbi6-dbg csh

Installation Guide:
http://www.mpiblast.org/Docs/Install

.

三月 11, 2009
» PostgreSQL backup/restore command (Quick-Note)

把 PostgreSQL backup/restore 會用到的 command 以及參考資料作個整理:

環境建制 (安裝):
$ sudo apt-get install apache2 php5 libapache2-mod-php5 libapache2-mod-auth-pgsql php5-pgsql phppgadmin postgresql-8.3

切換成 postgres 的身份執行:
$ sudo -u postgres psql template1

修改 postgres 的密碼:
template1=# alter user postgres with password ‘PASSWORD’;

建立 pg_root 使用者 (平日存取用途):
template1=# create user pg_root with password ‘PASSWORD’ createuser;

全伺服器備份:
$ pg_dumpall -U pg_root > dump-all.sql
$ pg_dumpall -U postgres > dump-all.sql

使用 postgres 登入之後,還原全伺服器:
$ psql -U postgres < dump-all.sql

單一備份資料庫:
$ pg_dump cbeta -U pg_root > cbeta-dump.sql
$ pg_dump cbeta -U postgres > cbeta-dump.sql

使用 postgres 登入之後,單一資料庫還原:
$ psql -d cbeta -U postgres < cbeta-dump.sql

在 postgres 帳戶家目錄建立 .pgpass
$ cat > .pgpass
localhost:5432:database:username:password
[Ctrl+D]
$ chmod 600 .pgpass

使用 postgres 使用者於 Crontab 中自動備份資料庫:
# vi /etc/crontab
sudo -u postgres pg_dump cbeta > cbeta-dump.sql
sudo -u postgres pg_dumpall > dump-all.sql

參考資源:

二月 25, 2009
» Plone Hosting:One-Click Install scripts (Tests)

在先前一篇 Plone Hosting:One-Click Install with Buildout (Tests) 所展示的方法是利用 buildout 方式來自動建立多個 Plone Site,但這會產生 port 數量的問題。

因此這次的改寫,是將它改成在一個 Zope Instance 之下,自動建立許多個 Plone Site,並且處理好各別 Plone Site 的 Admin 權限問題。換句話說,每一個自動建立的 Plone Site 能有自己獨立的 Admin 權限,而這權限不會擴展到上層的 Zope ZMI 之中。

mkplone.py
Need Three arguments:<sitename><admin><password>
$ bin/instance run ./mkplone.py  Project1  Yenjinc  12345

#!/usr/bin/env python
import sys
import os

from AccessControl.SecurityManagement import \
newSecurityManager, noSecurityManager

from Products.CMFCore.utils import getToolByName
from zope.app.component.hooks import setSite
from Testing.makerequest import makerequest

import transaction

# site:admin:pwd
arguments = sys.argv[1:]
pname = arguments[0]
myname = arguments[1]
rpwd = arguments[2]

# ZMI Admin log in
app = makerequest(app)
acl_users = app.acl_users
admin_username='admin'
user = acl_users.getUser(admin_username)
user = user.__of__(acl_users)
newSecurityManager(None, user)

# Add New Plone-site
pid = pname
factory = app.manage_addProduct['CMFPlone']
factory.addPloneSite(pid, title='Portal')

# Add Manager
site_id = pid
portal = getattr(app,site_id)
setSite(portal)
mtool = getToolByName(portal, 'portal_membership')
regtool = getToolByName(portal, 'portal_registration')
regtool.addMember(myname, rpwd, ['Manager'])

# Log out and commit
transaction.commit()
noSecurityManager()
app._p_jar.sync()

print "Finished adding Plone site"

最後利用 Plone+Apache+mod_rewrite 的方式,僅針對各別目錄 rewrite 即可,就能完成一個初階的 Plone Hosting 構想。

完成這隻程式主要參考:

二月 23, 2009
» Plone Hosting:One-Click Install with Buildout (Tests)

在安裝好 Plone Unified Installer 之後,可以利用 paster 工具來建立 plone buildout 目錄,在這 buildout 目錄底下,除了視作為一個 Plone 開發環境之外,也可將這個 buildout 當作上線的 Plone-Site 使用。

Unified Installer 的安裝介紹可參考:Installing Plone 3 with the Unified Installer。下載完檔案後,打開 README.txt 了解如何安裝:

To install Plone 3.2.1 in a stand-alone (single Zope instance) configuration:
* cd to the installer directory and issue the following command:
>> sudo ./install.sh standalone

To install Plone 3.2.1 in a ZEO Cluster (ZEO server, 2 clients) configuration:
* cd to the installer directory and issue the following command:
>> sudo ./install.sh zeo

安裝完成後,即可使用 buildout 來建置 Plone 系統,事前可參考 Working with buildout 這份文件。更完整的教學可以參考 Managing projects with Buildout

以下簡略將安裝步驟整理:

安裝 unified-installer
$ sudo ./install.sh standalone

設定 PATH
$ export PATH="/opt/Plone-3.1/Python-2.4/bin:$PATH"
$ vi .profile; which python ; python -v

更新 ZopeSkel
$ sudo easy_install -U ZopeSkel
$ sudo paster create --list-templates

設定專案目錄
$ paster create -t plone3_buildout MyBuildout

設定起始環境
$ cd MyBuildout ; python bootstrap.py

下載與安裝
$ bin/buildout

啟動 Plone
$ cd ~/MyBuildout
$ bin/instance start | fg

修改與更新
$ bin/buildout -No

以上是利用 buildout 建立 Plone-Site 的範例。

接下來要展示 Plone One-Click Install with Buildout 的測試範例,用來模擬 Plone Hosting 可能的概況。使用者可透過一個互動介面來輸入 Project Name,接著系統將自動產生一個 Plone-Site 提供給這個 Project 使用。

使用 shell scripts 將 buildout 過程自動化,並額外執行 install.py 來修改 buildout.cfg 的內容,主要目的是產生 random password 以及 port number。最後再執行 siteAutoInstall.py 自動產生 Plone-Site。

Shell Scripts 長像這樣:

#!/bin/bash
read -p "Please Insert Project Name:" pname

paster create -t plone3_buildout --no-interactive $pname
cd $pname && python bootstrap.py
cp buildout.cfg buildout.cfg.ori
cp buildout.cfg buildout.cfg.tmp

python ../install.py
bin/buildout
bin/instance run ../siteAutoInstall.py $pname admin
bin/instance start

port=`cat port.txt`
pwd=`cat pwd.txt`
echo -e "已完成安裝!"
echo -e "Plone-Site: http://localhost:$port/$pname"
echo -e "Password: $pwd (登入後請立即更改密碼)"

install.py 用途是修改 buildout.cfg 的 admin pwd 跟 port,主要使用的 function 如 Python random passwordPython search-and-replace string in files,整個 scripts 會長得像這樣:

>>>from random import Random
>>>import string
>>>from glob import *
>>>import re
>>>
>>>PWD = ''.join( Random().sample(string.letters+string.digits, 12) )
>>>f=open('pwd.txt', 'w')
>>>f.write(PWD)
>>>f.close
>>>
>>>f=open('../port-num.txt', 'r')
>>>old_num=f.read()
>>>f.close()
>>>tmp_num=int(old_num)
>>>tmp_num2=tmp_num+1
>>>new_num=str(tmp_num2)
>>>f=open('../port-num.txt', 'w')
>>>f.write(new_num)
>>>f.close
>>>
>>>f=open('port.txt', 'w')
>>>f.write(new_num)
>>>f.close
>>>
>>>fileList = glob('buildout.cfg.ori')
>>>pattern = re.compile('admin:', re.IGNORECASE)
>>>replace = "admin:"+PWD
>>>cfg = open('buildout.cfg.tmp', 'wU')
>>>for filename in fileList:
>>>        for line in file(filename):
>>>                print >>cfg,pattern.sub(replace, line),
>>>cfg.close()
>>>
>>>fileList2 = glob('buildout.cfg.tmp')
>>>pattern2 = re.compile('8080', re.IGNORECASE)
>>>replace2 = new_num
>>>cfg2 = open('buildout.cfg', 'wU')
>>>for filename in fileList2:
>>>        for line in file(filename):
>>>                print >>cfg2,pattern2.sub(replace2, line),
>>>cfg2.close()

最後一個執行的 Scripts 是 siteAutoInstall.py,這個檔案用途是自動化建立一個 Plone-Site(with NuPlone Skin)。如果僅是純粹產生 Default Plone-Site 的話,可以執行:

>>>from sys import exit
>>>import transaction
>>>from AccessControl.SecurityManagement import \
>>>    newSecurityManager, noSecurityManager
>>>from Testing.makerequest import makerequest
>>>
>>>app = makerequest(app)
>>>admin_username='admin'
>>>
>>>oids = app.objectIds()
>>>pid = 'Plone'
>>>if pid in oids:
>>>    print "A Plone site already exists"
>>>    exit(1)
>>>
>>>acl_users = app.acl_users
>>>user = acl_users.getUser(admin_username)
>>>if user:
>>>    user = user.__of__(acl_users)
>>>    newSecurityManager(None, user)
>>>    #print "Retrieved the admin user"
>>>else:
>>>    print "Retrieving admin user failed"
>>>    exit(1)
>>>
>>>factory = app.manage_addProduct['CMFPlone']
>>>factory.addPloneSite(pid, title='Portal')
>>>print "Added Plone"
>>>
>>>transaction.commit()
>>>noSecurityManager()
>>>
>>>print "Finished adding Plone site"

最後參照 Running Plone and Zope behind an Apache 2 web server 來設定 mod_rewrite,把新建立的 buildout Plone 位址對應到 ex: http://localhost/CMS or http://localhost/project ..etc。

目前這些測試,是在 Shell 底下執行,另外必須研究如何將這互動介面產生到 Web Page 或者是 Plone 頁面上,並且在最後執行成功時,自動 Email 給註冊者相關網址及帳號資訊等 (搭配 mail server)。

以上是直覺化的使用 buildout 建立多個 Plone-Site,每個專案網站擁有一個自己的 buildout 目錄。但這種方式在處理 port 數量以及 Plone+mod_rewrite 時會有問題 (因為要對應許多 port),相對的這些 port 也會造成更多的安全疑慮問題。

因此另一種較好的方法是,研究 siteAutoInstall.py 程式的運作原理,另外撰寫自動化 scripts,並處理好各別 Plone-Site 的 Admin 權限問題後,利用 mod_rewrite 的方式,僅針對各別目錄 rewrite 即可,就能完成一個初階的 Plone Hosting 構想。

Google 上也有類似的 Plone Hosting 構想 (Easier Plone Hosting: Some Ideas),但未見其實作的內容。若 Plone Hosting 的考量需像 http://objectis.org/ 這樣的完整時,需考量及面臨的技術問題就更具規模了。

二月 17, 2009
» Plone-Site Auto Install scripts

用 bin/buildout 建立環境之後,接著需要進入到 ZMI 來建立 Plone-Site。這個動作可以將它自動化。下面這個 Scripts 從 marr’s weblog 來的,就是用來處理這樣的事情。另外也在 Google 上找到類似這樣的 example:plone-scripts/siteAutoInstall.py。Python 在 Plone/Zope 層面的技術及用法,很值得在深入研究。

>>>from sys import exit
>>>import transaction

>>>from AccessControl.SecurityManagement import \
>>>    newSecurityManager, noSecurityManager

>>>from Testing.makerequest import makerequest

>>>app = makerequest(app)
>>>admin_username='admin'

>>>oids = app.objectIds()
>>>pid = 'Plone'
>>>if pid in oids:
>>>    print "A Plone site already exists"
>>>    exit(1)

>>>acl_users = app.acl_users
>>>user = acl_users.getUser(admin_username)
>>>if user:
>>>    user = user.__of__(acl_users)
>>>    newSecurityManager(None, user)
>>>    #print "Retrieved the admin user"
>>>else:
>>>    print "Retrieving admin user failed"
>>>    exit(1)

>>>factory = app.manage_addProduct['CMFPlone']
>>>factory.addPloneSite(pid, title='Portal')
>>>print "Added Plone"

>>>transaction.commit()
>>>noSecurityManager()

>>>print "Finished adding Plone site"

» Python search-and-replace string in files

近日在寫一個 scripts,想以 Python 來做到 Shell scripts 或 Sed 下,常用來搜尋檔案內特定文字並取代的功能。透過好用的 Google,還是有找到一些實用的 example。

這是一個修改過的範例:

>>>from glob import *
>>>import re

>>>fileList = glob('buildout.cfg.tmp')
>>>pattern = re.compile('admin:', re.IGNORECASE)
>>>replace = "admin:NewPWD"
>>>cfg = open('buildout.cfg', 'wU')
>>>for filename in fileList:
>>>    for line in file(filename):
>>>        print >>cfg,pattern.sub(replace, line),
>>>cfg.close()

改寫這個 example 的用途是,將 buildout.cfg.tmp 裡的 admin: 字串改成 admin:NewPWD,最後的取代結果存入到 buildout.cfg 內。

» Python random password

那隻厲害的咕狗,我只有餵它吃 這隻骨頭,它就幫我帶來了這個東東:

Python 2.4.5 (#1, Nov  6 2008, 18:04:30)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from random import Random
>>> import string
>>> PWD = ''.join( Random().sample(string.letters+string.digits, 12) )
>>> PWD
'35lV71NJ6BxL'
>>> f=open('/tmp/r_pwd.txt', 'w')
>>> f.write(PWD)
>>> f.close
<built-in method close of file object at 0x1999f8>

二月 16, 2009
» Translation Service broken (Data.fs moving troubles)

昨日將 Linux 主機上的 Data.fs 搬移到 Windows 上還原,在 Data.fs 移轉之後,Windows 這端出現了 Translation Service broken 的問題,也就是說幾乎所有的 PO Path 路徑名稱都吃到原本 Data.fs 的路徑。在 Error Log 中,大致上會這樣描述:

.... (略)
------
2009-02-15T22:48:14 WARNING PlacelessTranslationService Message Catalog has errors
PloneTranslations.i18n-plonelanguagetool-zh-tw.po
------
2009-02-15T22:48:14 WARNING PlacelessTranslationService Message Catalog has errors
PloneTranslations.i18n-plonelanguagetool-zh-tw.po
------
... (略)

因為 PO檔的 Path 跑掉了 (吃到原本的 Data.fs 上的路徑),所以 translation 是壞掉的。如果這個時候就放棄了,那就損失大了。因為 Google 之後才發現,這個問題是『正常』的...

使用這樣的關鍵字:”Placeless Translation Service Data.fs” 搜尋到這篇 Re: Moving troubles,底下的描述正說明了這個問題的解法:

You need to copy both the Data.fs and all your custom products.

Normally the paths are not a problem., But for some reason the placeless translation service stores the path to the translation files. So on the first reboot it cannot find them, and translation is broken.

Just restart the server once more. That will make the translationservice load them from the correct location.

也就是說,第一次會痛是正常了,接著重新啟動 Zope/Plone 之後,就會順暢了。

二月 13, 2009
» Products.Maps i18n:translate example

Products.Maps 2.0. A simple, easy to use Plone integration with Google Maps by Jarn AS. 修改 buildout.cfg 檔案,表述將安裝 Products.Maps eggs:

eggs =
Products.Maps

接著執行 bin/build (第一次建立) 或 bin/buildout -No (更新)。安裝完成後,就可以在 Plone 裡新增一個 GoogleMap Location 的 Content Type。

這裡要示範將 Products.Maps 新增的 Content Type 名稱 (Location) 做額外的 i18n:translate 的設定。因預設它的 Location 將生硬的翻為 “位置”,若我們需要將 Products.Maps 應用在服務客戶的需求上時,這個名稱是必須經過客製修改。

第一步驟,是找到 eggs/Products.Maps-2.0-py2.4.egg/Products/Maps/profiles/default/types/GeoLocation.xml。在 title: Location 的描述裡新增 i18n:translate:

$ vi eggs/Products.Maps-2.0-py2.4.egg/Products/Maps/profiles/default/types/GeoLocation.xml
<property name="title" i18n:translate="">Location</property>

接著將 GeoLocation.xml 複製(或 Link) 到 parts/plone/CMFPlone/profiles/default/types/ 裡:

$ ln eggs/Products.Maps-2.0-py2.4.egg/Products/Maps/profiles/default/types/GeoLocation.xml parts/plone/CMFPlone/profiles/default/types/GeoLocation.xml

再來修改 plone-zh-tw.po 檔 (./parts/plone/PloneTranslations/i18n/plone-zh-tw.po) 加入 msgid 及 msgstr 的描述:

$ vi parts/plone/PloneTranslations/i18n/plone-zh-tw.po
#. Default: "Location"
#: CMFPlone/profiles/default/types/GeoLocation.xml:5
msgid "Location"
msgstr "公司店家資訊"

最後在 Plone 的 “網站設定” 裡將 Products.Maps reinstall,這樣我們客製修改過的 i18n:translate 就會立即生效。Location 的 Content Type 名稱也會改成我們所定義的內容,例如:

p-maps

二月 12, 2009
» Registration Form Customize

預設 Plone 的 Registration Form 會長像這個樣子:

reg-2

如果有修改的需求,則需找到 /Plone/portal_skins/plone_login/join_form 來修改裡面的樣式。

這一個示範例子,是將預設的 “寄送密碼 Checkbox” 拿掉,取而代之的是我們想自己提供的簡單文字敘述。於是打開 join_form 檔案來修改,找到下面這一塊敘述:

<div class="field"
tal:condition="not: allowEnterPassword"
tal:define="mail_me request/mail_me|nothing">
.
.
</div>

將預設的 Password Checkbox:

<input type="checkbox"
class="noborder"
name="mail_me"
size="30"
id="cb_mailme"
tal:attributes="checked python:test(mail_me, 'checked', None);"
/>
<label for="cb_mailme" i18n:translate="label_mail_password">Send a mail with the password</label>

改為我們想要的內容:

<label for="cb_mailme">若是廠商會員身份,請額外寄信通知管理員,信件內含您的全名和名稱。</label>

儲存之後,新的註冊頁面就會長得像這個樣子:

reg-1

» Documents_actions (Link) open in new window

在 Plone 的 Documents view 底下預設會有兩個 documents_actions Link,分別是 Sendto 及 Print 等。

在 CMF Action at /Plone/portal_actions/document_actions/sendto 的 URL (Expression) 可以透過 string:$object_url/sendto_form 來改連結的位址。但如果要讓新連結開啟於新的視窗,就必須找到 document_actions.pt 這個檔案來修改,並加入 HTML 中 target=_blank 的語法即可。

可以利用 grep -r “document_actions” 的指令來找到 Plone Buildout 目錄裡所有包含相關字串的檔案。

在 ./eggs/plone.app.layout-1.1.5-py2.4.egg/plone/app/layout/viewlets/document_actions.pt 這個檔案可以找到定義 documents_actions Link 的方式。

修改如下:

<a href=""
tal:attributes="href daction/url;
title daction/description"
tal:content="daction/title"
target="_blank">
</a>

這樣就完成了。

二月 4, 2009
» Portlets CSS customized (Firebug)

Firebug 是一個好用的工具,如果在這之前沒接觸過的話,可參考 Google 找到的介紹 來認識這個 Firefox Add-ons。我在這裡使用 Firebug 來找 Plone 網頁畫面中,某些特定區域所定義的 CSS 檔案位置及行數。這對於 CSS 的調整有很大的幫助。

安裝 Firebug 之後,點選 Firefox 瀏覽器最右下方的 “小蟲” 後,就可以開始觀察 “滑鼠點選區域中” 的 HTML 內容以及 CSS 樣式。執行的畫面會像是下圖這樣:

firebug

利用這個工具,可以找到 Plone 目錄選單的 CSS 樣式定義檔案,修改內容以達成客製化樣式。例如:目錄選單的樣式定義在 public.css 這個檔案。因此進入到 /portal_skins/plone_styles/public.css 來修改檔案。下面的例子是將目錄字體設定為 “標楷體”,大小設為 12pt。

pic1

pic2

以下是兩個修改的例子:

若要修改左邊 Portlet 選單的標題,則需要修改 portlets.css,因此進入到 /portal_skins/plone_styles/portlets.css 來改檔案。將字體設為標楷體,大小設為 12pt。

pic3

pic4

若要修改 Document 的標題 (Header),則需要修改 base.css,因此進入到 /portal_skins/plone_styles/base.css 來改檔案。將 H1 字體設為標楷體,大小設為 200%(預設是 160%)。

pic5

pic6

除了上面的例子之外,這邊也還有一份文件可以參考:
http://plone.org/documentation/tutorial/creating-plone-themes/toolchain

一月 7, 2009
» Atheros Wireless Not Working after Suspend

If you had the same issue in Ubuntu8.10, you could found the solution included in the “8.10 Release Notes“.

Atheros ath5k wireless driver not enabled by default

The version of the ath5k driver for Atheros wireless devices included in Linux 2.6.27 interferes with the use of the madwifi driver for some wireless devices and as a result has been disabled by default. Many Atheros chipsets will work correctly with the madwifi driver, but some newer chipsets may not, and the madwifi driver may not work with WPA authentication. If you have an Atheros device that does not work with madwifi, you will want to install the linux-backports-modules-intrepid-generic package, which includes an updated version of the ath5k driver. While not installed by default, this linux-backports-modules-intrepid-generic package is included on the Ubuntu 8.10 CD and DVD images for ease of installation.

Wireless doesn’t work after suspend with ath_pci driver

Wireless devices that use the ath_pci kernel driver, such as the Atheros AR5212 wireless card, will be unable to connect to the network after using suspend and resume. To work around this issue, users can create a file /etc/pm/config.d/madwifi containing the single line:

SUSPEND_MODULES=ath_pci

This will cause the module to be unloaded before suspend and reloaded on resume.

十二月 22, 2008
» Creating static text portlets in Plone3

延續先前 How to manage portlets in Plone 3 的內容,這次繼續把 Creating static text portlets in Plone 3.0 的部份完成。

這篇文章 Creating static text portlets in Plone 3.0 介紹如何建立一個 “讓我們自行填寫內容” 的 portlets。這次採用 buildout 的方式很快就完成了,而且沒遇到之前發生的 Error。

.
首先第一步驟:修改 buildout.cfg

.
在 zcml 的區塊中加入 plone.portlet.static

.
接著在終端機執行:
$ sudo ./bin/buildout
$ sudo ./bin/instance start

.
來到 Manage portlets 畫面,Add Static text portlet。

.
填入版面所要顯示的內容:

.
儲存離開後,剛才新增的版面就會出現囉!

十二月 16, 2008
» Notification Authentication error on Adium

有時候用Adium連接MSN時,常會出現 Notification Authentication error。
會出現這個問題的情況,通常都是我在使用3.5G連線時才會發生。
今天Google了一下,總算找到原因了。

解決辦法是,在 /etc/hosts 加入下面一行:
65.54.239.80 messenger.hotmail.com

再重開 Adium 就可以順利連線了。

十二月 15, 2008
» gettext-tools problem on Fink

If you used Fink on OSX, and got an error message like this:
Can’t resolve dependency “fink (>= 0.28.0)” for package “gettext-tools-0.14.5-4″ (no matching packages/versions found) Exiting with failure.

You should need to run “fink index -f” to forcibly refresh it, and then you should be able to selfupdate and get fink and gettext-tools updated.

References...

八月 19, 2008
» Make your MacBookPro Cooler

根據前一篇 Make your MacBook Cooler 提到的軟體 smcFanControl2 以及 CoolBook,這次拿了一台 Macbook Pro 來實測。這台 MBP 是 加到爆 的版本,也就是 C2D 2.6G/7k200/4G,能測試這台高貴的機器真是有幸呀。

燒機的方法是使用 Xbench,測試的過程裡除了全速不斷的一直跑 Xbench 以外,並且將 CoolBook 的 CPU loading 也調到最高 10。接著把 Applications 目錄裡所有的程式通通開啟,包含了 iLife08, iwork08, Aperture2, Office08, Adobe CS3, Parallels Desktop 等各式各樣重量級軟體,約略開啟了總共五十多個應用程式。最後... 再連續 “同時播放” 三個 FullHD 畫質的 mpg 影片檔。

想當然爾,系統是整個 Lag 到不行了,我把 CPU 跟 GPU 風扇轉速固定在 2000rpm(最低轉速),讓機器狂燒十幾分鐘,CPU 溫度最高達到八十度C,但是系統卻非常的穩定沒有當機,也沒有任何一個應用程式 Crash 掉,最後實測出這顆 C2D T9500 的極限值:2600Mhz@0.9875v。下面的圖示是使用 CoolBook 調整到最低電壓而且最穩定的狀況,CPU Idle 的待機溫度居然只有 28度C (室溫大約 24度C),只能說 45奈米的 CPU 真不是蓋的。

五月 12, 2008
» Ubuntu on Sony VAIO TZ37TN/B (五) Less Watts Tips & Tricks (8.04 LTS)

在這一篇 Ubuntu on Sony VAIO TZ37TN/B (二) Fan Speed Controller 提到 TZ37 在運作 Ubuntu 時,電腦會特別的燙,原本以為是 CPU 風扇控制不良,於是寫了風扇控制的 Scripts 來降溫。後來發現原來最大的熱源來自於 Intel 4965AGN 這張網卡,於是來到了 LessWatts.org 網站來挖寶。

目前以 Fan Speed Controller Scripts 搭配 LessWatts.org Tips & Tricks 之後,我的 TZ37 已經不再發燙。

根據 LessWatts.org Tips & Tricks 所修改的設定:

echo 5 >/sys/bus/pci/drivers/iwl4965/0000\:03\:00.0/power_level
echo 1 >/sys/devices/system/cpu/sched_mc_power_savings
echo 10 >/sys/bus/usb/devices/usb1/power/autosuspend
echo 10 >/sys/bus/usb/devices/usb2/power/autosuspend
echo 10 >/sys/bus/usb/devices/usb3/power/autosuspend
echo 10 >/sys/bus/usb/devices/usb4/power/autosuspend
echo 10 >/sys/bus/usb/devices/usb5/power/autosuspend
echo auto >/sys/bus/usb/devices/usb1/power/level
echo auto >/sys/bus/usb/devices/usb2/power/level
echo auto >/sys/bus/usb/devices/usb3/power/level
echo auto >/sys/bus/usb/devices/usb4/power/level
echo auto >/sys/bus/usb/devices/usb5/power/level
echo 10 >/sys/module/snd_hda_intel/parameters/power_save
echo 1500 >/proc/sys/vm/dirty_writeback_centisecs
hal-disable-polling --device /dev/cdrom
hdparm -B 1 -S 12 /dev/sda
echo ondemand >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo 5 >/proc/sys/vm/laptop_mode
ethtool -s eth0 wol d
ethtool -s eth0 autoneg off speed 100
ifconfig eth0 down

關閉藍牙以及內建CD-ROM的電源:

echo 0 > /sys/devices/platform/sony-laptop/bluetoothpower
echo 0 > /sys/devices/platform/sony-laptop/cdpower
hciconfig hci0 down

刪除沒用到的一些硬體相關的核心模組:

rmmod hci_usb ohci1394 sbp2 ieee1394 bluetooth joydev pcmcia parport_pc lp parport tpm_infineon tpm tpm_bios yenta_socket rsrc_nonstatic pcmcia_core ricoh_mmc

PowerTop 測試一下:

Cn Avg residency P-states (frequencies)
C0 (cpu running) ( 2.1%) 1333 Mhz 0.4%
C1 0.0ms ( 0.0%) 1067 Mhz 0.0%
C2 0.1ms ( 0.0%) 800 Mhz 99.6%
C3 7.4ms (97.8%)

Wakeups-from-idle per second : 133.7 interval: 15.0s
Power usage (ACPI estimate): 7.4W (8.2 hours)

Top causes for wakeups:
35.9% ( 65.2) : Rescheduling interrupts
20.1% ( 36.5) : i915@pci:0000:00:02.0
12.3% ( 22.4) : extra timer interrupt
10.9% ( 19.9) compiz.real : schedule_timeout (process_timeout)
9.5% ( 17.2) firefox : futex_wait (hrtimer_wakeup)

雖然 PowerTop 跑出 7.4W (8.2 hours),但可想而知,8.2 hours 是不切實際的數字,下次再來把實際的使用時間記錄下來,看看服用了這些保命長壽丹之後,TZ37 的續航可以延長到多久。

五月 11, 2008
» Ubuntu on Sony VAIO TZ37TN/B (四) Running Hardy Heron 8.04 LTS

先前的 Ubuntu on Sony VAIO TZ37TN/B (一) Hardware & Desktop 是在 7.10 的環境下測試,這次我把系統升級到了 8.04 (Hardy Heron) LTS,藉這個機會整理一下 Sony VAIO TZ37TN/BUbuntu 8.04 LTS 的相容性。

相較於在 7.10 還需手動調整的項目,在 8.04 預設裝好就已經能動的有:

  • Sound 耳機孔輸出與筆電喇叭的輸出已經正常了,不會有耳機已經插上去了,結果筆電喇叭也同時還在唱的窘境。
  • FN Keys 音量調整鈕能動, LCD背光也能動了!

原本在 7.10 能動的,在 8.04 卻掛了的有:

  • Integrated Media Buttons (退片鈕也不能動了) 解決的辦法是,使用偏好設定 -> 鍵盤捷徑鍵,將退片動作 binding 在特殊的按鍵上。

除了上述三項以外,其他的就跟 Ubuntu on Sony VAIO TZ37TN/B (一) Hardware & Desktop 大同小異啦!有些預設不能動的東西,改一下就能動了。下面特別整理出幾個在 8.04 要改的東西,因為這些改法跟過去在 7.10 的方式不同。

HSDPA modem (HUAWEI E220 3.5G) 的驅動:
改服用 vodafone-mobile-connect-card-driver-for-linux-2.0.beta2-ubuntu-installer.run 試試,如果遇到問題無法啟動裝置的話,那就只能手動來設定網卡,設定內容可參考 Wireless in Debian II (Huawei E220 3.5G Modem)

Touchpad 的解析設定:
Section “InputDevice”
Identifier “Synaptics Touchpad”
Driver “synaptics”
Option “Device” “/dev/psaux”
Option “Protocol” “auto-dev”
Option “HorizEdgeScroll” “0″
Option “MinSpeed” “0.1″
Option “MaxSpeed” “0.8″
Option “AccelFactor” “0.2″
Option “EdgeMotionMinSpeed” “15″
Option “EdgeMotionMaxSpeed” “15″
Option “UpDownScrolling” “1″
EndSection

Suspend to Ram & Hibernate 終於沒問題了:
$ sudo vi /etc/modprobe.d/alsa-base
options snd-hda-intel probe_mask=1
$ sudo vi /etc/pm/config.d/modules
SUSPEND_MODULES=”ehci_hcd uhci_hcd”

殘念的是,在我的系統上 Hibernate 依舊沒辦法成功,猜測可能是我沒有設定 Hibernate partition 的關係?還沒能去 Debug 這問題。不過話說回來,只要 Suspend to RAM 能一切正常,我就滿足了,這樣就能像在用 Macbook 一樣,隨走即蓋,隨開即用!方便多了。

Ubuntu 8.04 (Hardy Heron) LTSSony VAIO TZ37TN/B 的支援還算不錯,大部分的硬體都能支援,除了 Fingerprint Sensor 還有怪怪的 Memory Card Reader (Ricoh) 以外。不過還存在一個問題需處理,就是增加續航力跟風扇控制的問題,我在下一篇會整理在 8.04 下,如何讓 TZ37 更省電,續航更久。(風扇控制依舊參考這篇 Ubuntu on Sony VAIO TZ37TN/B (二) Fan Speed Controller.)

更多的 Ubuntu on Sony VAIO TZ 討論,請參照 Sony Vaio TZ Series: Quest for 100% Compatibility

biggo.com.tw

A Django site.