gtk.FontSelectionDialog

這個類別可以選字型,只是,選好再呼叫它提供的 get_font_name() 以後,只會得到一個字串,裏面有字型的名稱、尺寸以及樣式,而且,還沒什麼規則可言,這造成我的困擾。

上網找了一陣,發現一般解法有兩種,一種是存取在 gtk.FontSelectionDialog 裡的 FontSelection.get_font_face,另一種則是透過 pango.FontDescription 來轉,我後來是用 pango.FontDescription 來轉。

用 pango.FontDescription 來轉是沒問題的,只是取得 font size 的時候,又遇到問題,原來這裡取得的大小會乘上 pango.SCALE,所以呼叫 get_size() 以後,還要除以 pango.SCALE,才是正確的。

def get_font_tuple( font_name ):
import pango
fontdesc = pango.FontDescription( font_name )
font_name = fontdesc.get_family()
font_size = fontdesc.get_size()/pango.SCALE
return (font_name, font_size)

上傳 debian package 到 PPA

去年就試著想放東西到 PPA 上,可是受限於公司網路環境與個人鬼混的因素,導致今天才真正把東西放上去。這部份中文的資訊很少,可能大家看PPA說明就都搞定了吧。
你比較會遇到的幾個問題:一個是 PGP、一個是如何打包 debian package,這邊假設你都會了。(PGP 可以去 Jedi 那邊找介紹文)
以下,就開始。你必須要先有 PGP key,然後到 launchpad 註冊,成為會員。
這篇:Personal Package Archives來做,我整理重點如下:

  1. profile頁,把 ppa 打開。
  2. 填 OpenPGP public key。
  3. Sign conduct:其實就下載文字檔,然後打指令,用gpg sign過(文章裡有指令),產生 .asc 檔案,再把檔案內容貼上去,送出即可。

上傳可參考這篇:Uploading a package to a PPA,package 有些要注意的事項,例如 changelog,在上面那一篇有說明,就是一般 debian changelog 裡是寫 unstable、experiment,在這裡要改為 lucid、hardy 等。
大致摘要如下:

  1. 準備好你要上傳的 package,用 dpkg-buildpage -S -k<your_gpg_private_key>,做出 source package。
  2. 到上一層目錄,找到 P_V-0_source.changes (P 表示你的 project name,V 表示版本)
  3. 上傳:輸入 dput ppa:your_ip-id/ppa P_V-0_source.changes
  4. 上傳順利的話,接下來就等回信了~

dput 預設是用 ftp 上傳,如果不行,可以試試 sftp:

  1. profile 填 ssh key
  2. 新增 ~/.dput.cf ,裏面放:
    [my-ppa-lucid]
    fqdn = ppa.launchpad.net
    method = sftp
    incoming = ~<your_launchpad_id>/<ppa_name>/ubuntu/<ubuntu_code_name>
    login = <your_launchpad_id>
    allow_unsigned_uploads = 0
    

    ,your_launchpad_id、ppa_name、ubuntu_code_name 不要忘了替換掉,ubuntu_code_name 就看你裝的 ubuntu 版本,填 lucid、hardy…等等的

  3. 上傳指令改用 dput my-ppa-lucid P_V-0_source.changes

回信不會那麼快,要稍微等一下,如果有問題,裏面會有錯誤訊息,不知道怎麼辦的話,很簡單,到 Questions for Soyuz 找答案。
最後成功的話,會有回信說 Accept,這時候再到你的 ppa 頁面,就會看到 package 了,不過這時候還在 building,需要等一陣子。
到這裡,應該就大功告成了。之後就可以很方便的用 add-apt-repository 來把自己 ppa 加進去,然後安裝、升級 package 啦~

自動分類pdf與shutil

這script主要是分類pdf用的,從謎之網站下載的 pdf 檔有規則,所以就可以寫code來自動分類。寫script時發現有shutil這個很方便的模組,可以用來複製、搬移檔案、目錄等,相當的方便,原本還以為要自己硬幹咧~
[python]#!/usr/bin/env python

– coding: utf-8 –

def main():
import glob
import os
import shutil
files = glob.glob( “*.pdf” )
for file_name in files:
parts = file_name.split(‘.’)
index = -2
while not parts[index].isdigit():
index = index + 1
dir_name = ” “.join(parts[:index])
if not os.path.exists(dir_name):
os.mkdir(dir_name)
try:
print(“Move ‘%s’ to ‘%s’.” % (
file_name, os.path.join(dir_name, file_name)))
shutil.move( file_name, os.path.join(dir_name, file_name))
except shutil.Error, e:
print(e)

if name == “main“:
main()
[/python]

電影流水帳(2010/9/8~2010/9/16)

好吧,找不到適合的圖來放,算了。好像又隔了太久,所以有點忘記自己看了什麼片了,從噗浪裡看來,應該是沒錯才對。

  • Date Night(IMDBWikipedia),中譯:約會喔麥尬。片商宣傳成喜劇片真是太可惜了,看完以後我倒是覺得這部片很溫馨。一對失去熱情,生活已經快要公式化的夫妻,各自都不想讓自己的婚姻生活邁向終點,於是都試圖做出改變,一切的笑點就在他們試圖做出改變的約會夜中爆出。在經過一晚的烏龍事件之後,他們兩人的用心最後都讓彼此感受到,所以來了個我覺得很溫馨的結局。總之夫妻生活久了,難免都會慢慢公式化,要怎麼過出新鮮感,真的是需要用心經營,這部電影的故事真的有打中我心裡的某個點,讓我有不少感觸。
  • 交響情人夢最終章前篇。當作日劇的濃縮版來看比較好,簡單說就是他們到了法國面對新的挑戰,千秋要馴服新的樂團,而野田妹則面對新的情敵與自己的未來,故事就這樣展開。看完以後只慶幸還好沒去電影院看,因為感覺上就是日劇的精簡版,下一部最終章應該才是主菜。

Yahoo Traffic Server

因為最近發現公司的 proxy 不理我 NB 上的 https request 了(我NB是走正常公司網路設定,也就是上網都會透過proxy),想到 COSCUP 2010 有介紹 Yahoo Traffic Server,想說架在另外一台不受限的機器上,讓 NB 透過這個 proxy 上網。
安裝不難,參考:Build instructions,三兩下就能 build 好,開發團隊好像就是在 Debian/Ubuntu 上開發的樣子,步驟寫的蠻仔細的。
設定倒是考倒我了,預設的設定是不 work 的。試了一陣,才找到這篇:Yahoo Traffic Server,裏面提到在 records.config 裡的兩個關鍵設定:

  • proxy.config.reverse_proxy.enabled
  • proxy.config.url_remap.remap_required

把這兩個設成 0,大致上就 ok 了。
我還有改到的設定:

  • records.config
    • proxy.config.cluster.ethernet_interface: 改 eth0
    • proxy.config.cache.ram_cache.size: 改 256M
  • storage.config: var/trafficserver 加大到 256M

事實上除了可以當類似 squid 的 proxy server 以外,也可以當 reverse proxy、Forward proxy(remap),同時也支援 cluster 架構、DNS cache…等,可以挖的功能相當多,以後有空再來挖好了。
其他可參考資料:Yahoo Traffic Server中文介紹以及for RHEL5 64bit/Gentoo 的 rpm檔

python 的 private method

純粹記錄一下,讓自己知道曾經犯過這個錯。類別裡的 method 名稱加上 __ 就是 private,所以,子類別並不會知道有這個 method,也不會發生 Method overriding

class Rectangle:
def __init__(self):
self.parse()
self.__parse()
def parse(self):
print("parse(): Rectangle")
def __parse(self):
print("__parse(): Rectangle")
class BoxType(Rectangle):
def parse(self):
print("parse(): BoxType")
# 不會被執行到!!
def __parse(self):
print("__parse(): BoxType")
b = BoxType()
# Output:
# parse(): BoxType
# __parse(): Rectangle

就這樣…

gtk.RecentChooserMenu

本來預期可以在 glade 裡就可以拉出這個元件,然後程式就不用寫,結果是不行。網路上範例不多,所以紀錄一下。
在 glade 裡,你要先預放一個 menuitem,假設命名為 mi_recent_items,你在程式裡就得先取出這個 menuitem,取得 RecentManager 然後建立 RecentChooserMenu,再用 mi_recent_items.set_submenu() 來設定。
RecentManager 是全系統的最近存取文件,這也是為什麼後續會要 RecentFilter 的原因,因為只要顯示需要的文件。當選取的時候,會觸發 item-activated 這個 signal。
代碼:

self.recent = gtk.RecentManager()
menu_recent = gtk.RecentChooserMenu(self.recent)
menu_recent.set_limit(10) # 設定要出現幾個
# 只取需要的檔案
self.file_filter = gtk.RecentFilter()
self.file_filter.add_pattern("*.pdb")
self.file_filter.add_pattern("*.updb")
menu_recent.set_filter(self.file_filter)
# 選取以後要做的事情
menu_recent.connect("item-activated", self.select_recent_cb)
# 取得在 glade 裡建立的 menuitem,然後用 set_submenu 設定。
menuitem_recent = self.builder.get_object("mi_recent_items")
menuitem_recent.set_submenu(menu_recent)

電影流水帳(2010/8/21~2010/9/7)

SALT

  • Salt(IMDB, Wikipedia),中譯:特務間諜。很適合Angelina Jolie的動作片,也難怪劇本會特別為她而修改。女主角的確就是諜中諜,不過到頭來,還是為了救她所愛的男人,把培養她的祖國間諜給幹掉了,同時也把潛伏在跟她同單位的諜中諜也解決掉,解除了核武危機。從片尾看起來,似乎還會有續集的樣子~
  • Hot Tub Time Machine(IMDB, Wikipedia),中譯:扭轉時光機。說到扭轉時光,應該就可以想見到故事會怎麼走了吧。這個故事其實也差不了多少,4個人現實生活的不如意,讓他們決定去度假,結果在浴缸裡喝個爛醉,不小心啟動了浴缸,讓他們回到70年代。為了避免改變未來,他們必須再做一次跟當年一樣的事情,但是並沒有完全一樣,最後4個人只有3個人回去,說起來,他們還是改變了未來,讓未來變得不一樣了。3個人回去以後,生活就變得如意了。我覺得不是很合理的設定,但算了,就當作喜劇片看看就好啦~
  • 一頁台北(IMDB, Wikipedia)。普普通通,坦白說,我覺得故事沒有拍出很好的fu,而且時間的設定上,好像有瑕疵,到底是一個晚上,還是多個晚上?捷運的路線設定好像也不太對。小凱的女友去了法國,這段期間,小凱認識了在書店工作的女孩Susie,Susie對他很有好感。遠距離導致了小凱跟霏霏的分手,小凱想挽回,所以去找了阿洪的老闆借錢要去法國,老闆答應小凱,但要小凱幫忙辦事情,陰錯陽差地小凱跟Susie被阿洪追著跑,幾乎跑遍了台北的南區,最後小凱還是去了法國,當然,這段感情是挽救不回來的了,回台北以後,跟Susie展開新戀情。我最喜歡最後的那個 slow motion跟跳舞的畫面,另外就是那個演阿洪的柯宇綸,他實在是蠻搶戲的。