PyGTK 中的 pixbuf 和 Python 的 garbage collector 有一些互動上的問題;我的運氣不錯,就在今天下定決心進入 PyGTK 的世界之後,馬上就遇到了。

情況是這樣的:Python 的 gc 不能自動處理 pixbuf 使用的記憶體,所以不斷配置新 pixbuf 的結果,會把所有的記憶體吃光;我們要手動呼叫 gc 來收集用不到的記憶體。這已經是個 FAQ。另外有種 workaround,因為我剛好也要用到 PIL,所以看起來還蠻誘人的。

Posted by yungyuc at 18:40, 1 comments, 0 trackback.

當 Google 推出 maps.google.com 之後,線上地圖變成不能不用 ajax。然而,才過沒多久的時間日本的 mapion 就急起直追,超英趕美,現在新的 mapionbb 已經比 google maps 更厲害了。

http://static.flickr.com/27/61541772_4db52a1500_m.jpg

現在的 mapionbb 可以滑鼠拖拉、雙擊定點,而且比 google maps 多了滾輪縮放。好方便,而且 Linux OK。雖然沒有衛星空照圖,但右邊有當地的天氣狀況報告,對都市來講更為實用。

如果能在日本直接用 3G 連上 mapion,行前幾乎就不必準備地圖了呢。

Posted by yungyuc at 19:46, 0 comment, 0 trackback.

md5sum 好像作不到這件事,所以寫了一個 Python script:

#!/usr/bin/env python
# $Id: hashdir.py 24 2005-11-08 09:17:44Z yungyuc $

import sys
import os

def getDigestPython( fn ):
    import md5
    chunklen = 1024*4
    m = md5.new()
    f = open( fn, 'rb' )
    while True:
        data = f.read( chunklen )
        m.update( data )
        if len(data) != chunklen:
            f.close()
            break
    digest = ""
    for val in m.digest():
        digest += "%02x" % ord(val)
    return digest

def getDigestMd5sum( fn ):
    import popen2
    stdout, stdin = popen2.popen4( "md5sum -b \"%s\"" % fn )
    digest = stdout.read().split()[0]
    return digest

def main():
    try:
        findpath = sys.argv[1]
        logfn    = sys.argv[2]
    except:
        sys.stdout.write( "Usage: %s <path to hash> <log file>\n" % \
                          os.path.basename(sys.argv[0]) )
        sys.exit(0)
    try:
        f = open( logfn, 'w' )
        f.close()
    except:
        sys.stdout.write( "Unable to open logfile: %s\n" % \
                          logfn )
        sys.exit(1)
    if not os.path.isdir( findpath ):
        sys.stdout.write( "Is not a directory: %s\n" % \
                          findpath )
        sys.exit(2)
    for root, dirs, files in os.walk( findpath ):
        for file in files:
            thisfn = os.path.join( root, file )
            try:
                digest = getDigestPython( thisfn )
            except:
                digest = " "*16
            logmsg = "%s  %s" % (digest, thisfn)
            f = open( logfn, 'a' )
            f.write( "%s\n" % logmsg )
            f.close()
            sys.stdout.write( "%s\n" % logmsg )

if __name__ == '__main__':
    main()

# vim: cino=>4 et nu ts=4 sw=4:

給兩個參數:第一個是要 digest 的目錄,第二個是 digest 結果要存的紀錄檔。這個 script 跑過一遍以後,將來就可以用 md5sum -b -c logfile 來核對檔案的 md5 checksum。

Python 裡的 md5 模組跑得和 md5sum 差不多快。然而一次從檔案讀取的區塊不要太多,4kB 差不多是 optimum。

Posted by yungyuc at 20:33, 2 comments, 0 trackback.

沒有後方,便宜行事。

在前線戰場上沒有很多時間考慮事情,不是他死,就是我亡。即使在戰鬥中受傷斷肢,奮勇向前的人還是能比停在原地的人更有生存機會。在戰場上不能疑惑。

後方可以生產、可以準備,有了後方的支援和補給,前線將士才能不顧一切地衝鋒陷陣;然而,後方可以歌舞昇平,不必像前線一樣以死相拼。這是兩個不同的世界,但應該同樣為著社會的安定努力。

我們的國家好像沒有後方。在社會的許多層面都是全民皆兵;拼經濟、拼治安、拼外交,萬民皆拼。其實無論奮鬥的目標為何,每場戰鬥都有前線和後方的分別。身為前線的士兵,不應該指責後方坐辦公桌的文員每天可以吃飽穿暖;作為後方的社會中堅,也不應該厭惡突擊隊員的體臭。

同一間公司的員工薪資本應有高有低,若一律平等,那該誰去拓展業務呢。

禮拜六的時候去喝了同學的喜酒,恩師也有出席,談到了現在國中導師的難為之處,不在學生品行不佳,而在家長與校方的智育至上觀念牢不可破,再加上不著邊際而火上加油的教改;言談間盡是嘆氣之聲。認識一些在公務機關作事的朋友,對於機關的無效率非常失望,更是常見內鬥耗損,「組織目標」四字則難得一見;談到組織的現況和前景,總是默然無語。

真是一片黑暗。

人生是奮鬥的過程 (日本人常用「戦い」,套在中文裡似乎過於野蠻了,但卻很有味道)。不過奮鬥需要規則,不是瞎拼。總覺得我們台灣人事情作了就不管後面的情況很常出現;我們可以衝可以打,但在有所成就了之後也不太會分贓。具體來說的話,就好比撰寫程式不寫文件,其它人想從程式裡得利幾乎只能從頭開始摸,繼續擴展也不容易。表現出來的是我們有了組織也不懂得如何團結,最後都坐實了中華民族的散沙性格。

或許抗戰勝利後的台灣社會,在發展了六十年以後已現疲態,而且尚未找出有效的換血方法。我們還處在全民皆兵的心智狀態裡:每個人都是前線士兵,只考慮眼前的問題,沒時間也不願意思考長遠的發展。但缺乏補給的部隊打不久,槍沒子彈打不了人,餓肚子的兵不會贏。我們需要後方思維,綜觀全局,把近期與遠程一起計畫進來;即使出發點是自利也好,總要考慮多一點。

一點靜夜雜想。

Posted by yungyuc at 06:44, 2 comments, 0 trackback.

GoDaddy ccTLD 已經有 .tw 了。

Posted by yungyuc at 19:25, 0 comment, 0 trackback.

這是個值得注意的問題。事實上 psyco 與一些 Python 模組是有點不相容。

在使用 MayaVi 的時候,mayavi.Misc.RenderWindow.RenderWindow 類別建構式裡在呼叫 vtk (在 Python 裡的 binding) 時會出現 segmentation fault。

因此,在使用 MayaVi 的時候要注意,小心 psyco。

Note

psyco 會對 Python byte-code 進行機器碼的編譯動作,能加快 Python script 的執行。

MayaVi 是一個基於 vtk 的顯像繪圖軟體,以 Python 撰寫,主要用於 CFD 資料的處理 (前身為 PyCFD)。

Posted by yungyuc at 17:43, 0 comment, 0 trackback.

我前天才 renew 兩個 domain,今天 GoDaddy 就從 $8.95 降到 $6.95。

真該慶幸我只有兩個 domain,只損失三個便當。

Posted by yungyuc at 06:47, 0 comment, 1 trackbacks.

我非常喜歡 Plone 強大的功能和豐富的附加程式。因為架構在 Zope 整套物件化的 ZODB 上面,讓 Plone 可以用非常物件導向程式設計的方式存取資料。在之前接觸過的所有網頁開發工具裡面,Zope, Plone 和 Python 這個組合不像其它 scripting language 一樣得搭配關聯式資料庫,就能夠有安全可靠的資料儲存方式。Product, ZODB 再加上適當的組態檔,Zope 就能把資料和程式帶著跑,解決了不少系統轉移會遇到的問題。我認為這麼高的易維護性是很有價值的。

然而,Plone 最大的問題就是慢。這或許是功能強大的必然結果,限制了系統能夠應用的領域。在一個輸出入同等重要的系統裡,因為不能用 apache caching 的方式加速,每秒能有 10 個 hit 算是很不錯了。要再提昇效能,就得配合 ZEO 組成 Zope cluster,但在 ZEO 身上仍有效能瓶頸。

對資料流量大的網頁系統來說,真不適合用 Plone。不過,Plone 適合用來建構內容複雜的網頁,它可以把各種不同的資料、頁面和影像管理得很好。建立個人網頁也合用;索引、搜尋、on-site 編輯的功能一應俱全,web-based management 的能力讓人舒服。

準備要用 Plone 架設真正的應用系統了,期待 Plone 2.1 的表現!

Posted by yungyuc at 23:05, 2 comments, 0 trackback.
AttributeError: 'module' object has no attribute 'copyright'

昨天在對某個 Plone 2.0.5 網站試行昇級為 Plone 2.1.1 的時候,發現了上面這個錯誤。

這非常讓人困擾。我把 Plone 2.1.1 裝在 Zope 2.8.3 上,一開始以為是 ZWiki 0.46.0 的問題,移掉了沒有用;再把 Zope 2.8.3 一路降級到 2.8.1,仍然無解。裝了 Plone 2.1.1 是 CMFPlone product 出問題,什麼也不裝則是 Five 出問題;總有東西不能用,而且還是找不到模組屬性這種錯誤。這怎麼可能呢?Python 程式有這種蟲而沒被抓出來是難以想像的。

之前建立 Zope 2.8.2 + Plone 2.1.1 明明一點問題也沒有,怎麼換了後一個禮拜發行的 Zope 2.8.3 就不行了呢?因為思而不學則殆

或許說是又罔又殆比較對。我沒發現 iconvcodec 沒裝好,以致於 import site 失敗:

'import site' failed; use -v for traceback

Zope3/Five 和 Python 結合地更緊密了點,看來不太願意忍受這種爛環境。

真是愚蠢的錯誤;不記下來,以後 google 上可難找到了。

Posted by yungyuc at 22:35, 0 comment, 0 trackback.

謝謝 song 作的小國旗。在兩岸三地裡,Plone 2.1.1 只附了大陸的小國旗;按不到語言切換真麻煩呢。

請把小國旗放到

$PRODUCTROOT/PloneLanguageTool/skins/LanguageToolFlags/

下面的 flag-zh-tw.gif,然後重新啟動 Zope。

Posted by yungyuc at 21:50, 0 comment, 0 trackback.
Change to page (10 entries in each page): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
© hover year to navigate month: powered by django