wine 的選單

我用的是 Ubuntu。
用 wine 安裝程式以後,Wine 選單裡會多出該程式的項目,但移除程式以後,這些項目還存在,即便你之前有備份 .wine,將備份檔案回存了,也不會有用。關鍵在於 wine 其實是把這些選單項目放在 $HOME/.config/menus/applications-merged 下,所以只要把該刪除的項目從這個資料夾下刪除即可。
2009/10/14 補充:$HOME/.local/share/applications/wine/Programs 下的也要記得刪掉,否則會出現在”其他”選單裡…

電影流水帳(2009/9/27~2009/10/8)

懶得動筆。
來統計一下截至目前為止看了幾片好了,嗯,69,還不賴,只要在這季衝完31部片子,就可以達到2009年百片的目標。(謎之聲:X的,最好是可以做的到!!)

  • The proposal(IMDB, Wikipedia),中譯:愛情限時籤。劇情當然是不盡合理,但愛情喜劇就是這樣子,也很難說不會三天就愛上、結婚。裏面我比較驚訝的是黃金單身女郎裡的Betty White (I),她有擔綱一角,擔任了穿針引線的角色,果然不失以前的幽默風趣。
  • Transformers: Revenge of the Fallen(IMDB, Wikipedia),中譯:變形金剛-墮落金剛的復仇。很瞎、很無厘頭的科幻動作片,科幻片就是有這好處,可以不必考慮太多,然後天馬行空的亂搞。女主角當然正,特效當然精彩,但是…就是這樣。坦白說,我覺得普普,希望不會有第3集。
  • Year One(IMDB, Wikipedia),中譯:您祖宗卡好。從片頭開始,相信你就能看出這片是惡搞10000 BC的搞笑片,從片名也可以看出來。這片的確不錯笑,有蠻多笑點的,讓我差點在午休時間時遭到圍毆,因為不小心笑太大聲了。裏面還蠻多熟悉的身影的,像David CrossOliver Platt…等,你應該都看過他們。

Mustek Bearpaw 1200TA in Ubuntu

如果你正好用的掃描器跟我一樣是 Mustek BearPaw 1200TA 或者是開啟 xsane 遇到 gt68xx:libusb 錯誤時,你可以試著到這裡:SANE GT68xx Backend Homepage 去下載適當的 .usb 檔案。下載以後,把它複製到 /usr/share/sane/gt68xx 目錄下,變更權限為 a+r,然後重新開啟 xsane,這樣就能正常使用掃描器了。

電影流水帳(2009/9/22~2009/9/26)

差點就要去挖西班牙文的維基百科了,還有英文維基百科有收 Nocturna 這條目。

  • ネコナデ(IMDB, Wikipedia),中譯:心動奇蹟2-咪咪知音。坦白說,主角根本不是貓,而是擔任人事主管的中年男子,男主角奉命進行裁員,他做的並不快樂。後來收養了貓,於是他開始有了改變。最後他離職了,同時真正的收養了這隻貓。根據維基百科,這部片子似乎本來是日劇的樣子,我想也是如此,因為電影有點交代不清,看來不是兩個小時能交代的事情,我建議是看日劇,應該會比較能了解。
  • Nocturna(IMDB, Wikipedia),中譯:星星大作戰。西班牙動畫片,小孩發現星星不見了,於是出來找星星,貓老大奉命讓小孩睡覺,為了讓這小鬼睡覺,跟他踏上找尋星星的路途,只是最後發現讓星星消失的,其實是這個小孩心裡的恐懼,所以最後當小孩克服恐懼之後,一切就恢復原狀了。還不錯看,蠻適合小朋友看的動畫。

boo 的 macro(2)

boo 應該是在 0.8 以後吧,就提供了 macro 這個新的關鍵字,用來寫 macro,之前的寫法相當麻煩,需要先繼承 AbstractAstMacro,然後overwrite Expand 這個方法。
新的 macro 關鍵字簡化了一些功夫,macro 之後接的是名稱,下面的 block 就是描述要怎麼去替代,block 的最後再傳回 Ast.Block 即可。
大致的寫法就像這樣子:
[python]
macro Msg:
args=Msg.Arguments # macro 名稱其後加上 .Arguments,表示取得 macro 後面的參數
# [| |] 是相對簡便的語法,表示這裡面是個 Ast.Block,也就是程式區塊,而 .Body 則表示是 macro 下面的 block
# 注意:[| 後與 |] 前一定要分行,否則會有錯誤
return [|
$(Msg.Body)
|]
[/python]

寫法相當簡潔,不過在寫的時候,卻很容易讓人碰壁。最大的原因是用法誨澀,以上面的 Msg macro 來說,當 Msg 123 的時候,Msg.Arguments[0] 的型態照理應該是 Int32 才對,但實際上卻是 Ast.IntegerLiteralExpression,型態已經全然是 Compiler AST tree 裡的型態,macro 裡要取用變數、或產生 block也很容易造成困擾,這對於不玩 compiler 的人來說,是相當高的門檻。再者,文件的缺少也是很重要的因素,官方對於這方面的文件非常缺少(比較少人玩 Boo 也是一個主因)。
但是,這對於創造新的語法來說,卻是相當的便利,這也就是一般常說的 DSL,你可以針對某個特定領域來創造適合的語法。網路上能找到的例子,也多半如此。

boo 的 macro(1)

boo 的 macro 跟 C/C++ 的 macro 很類似,都是在編譯時期就被替代為實際的代碼。不過 C/C++ 只做簡單的替換,boo 的 macro 則是會在編譯時期時進行編譯並且執行、進行替換。

#
# dontimes.boo
#
import System
import Boo.Lang.Compiler
macro DoNTimes:
  n = DoNTimes.Arguments[0] as Ast.IntegerLiteralExpression
  print n.GetType().ToString() # n is IntegerLiteralExpression
  print DoNTimes.Body.GetType().ToString() # DoNTimes.Body is Block
  blocks = Ast.Block() # create new block add DoNTimes.Body n times.
  for i in range(Convert.ToInt32(n.ValueObject)):
    blocks.Add( DoNTimes.Body )
  return blocks

DoNTimes 3:
  print "foo"
  print "Press any key to continue . . . "
  Console.ReadKey(true)

使用 booi 來執行,你會看到下面的訊息,foo 被印了三次:

Boo.Lang.Compiler.Ast.IntegerLiteralExpression
Boo.Lang.Compiler.Ast.Block
foo
foo
foo
Press any key to continue . . .

那這跟用 for 迴圈來跑有什麼不同?
首先用 booc 來編譯:booc -t:exe dontimes.boo,在編譯的時候,你會發現第9行跟第10行的訊息被印了出來:

Boo.Lang.Compiler.Ast.IntegerLiteralExpression
Boo.Lang.Compiler.Ast.Block

這證明了 boo compiler 會在編譯時,把 macro 的部份先拿出來編譯,然後在編譯的時後去執行 macro,對程式碼進行替換。然後你會發現執行 dontimes 的時候,只印了 foo 三次。
reflector 來看,可以看到:

private static void Main(string[] argv)
{
  Console.WriteLine("foo");
  Console.WriteLine("foo");
  Console.WriteLine("foo");
  Console.WriteLine("Press any key to continue . . . ");
  Console.ReadKey(true);
}

代碼只有三行Console.WriteLine(“foo”);,這很清楚的說明了 booc 在編譯時,就把 macro 的內容替換進去了。

電影流水帳(2009/9/11~2009/9/21)

進度緩慢!突然有今年完成不了看百片的目標的預感!

  • Trainwreck – My Life as an Idiot (IMDB),中譯:天生“蠢”材必有用。這部片看起來很糟糕,不過這是一部描寫妥瑞症的片子,所以主角的表現跟妥瑞症的症狀相當接近。主角因為妥瑞症的關係,有點自暴自棄,讓自己生活在混亂之中,後來在輔導課程(坦白說,我不知道美國哪來那麼多輔導課程)的時候,認識了女主角,發生了許多事情之後,讓他痛下決心來改變自己的生活,不能再讓自己因為妥瑞症的關係,而生活在混亂之中。所以這是勵志片,片尾還放映了現實本人的 talk show,不過,我不是很喜歡這部片就是了。
  • Where the Truth Lies(IMDB, Wikipedia),中譯:赤裸真相。久仰大名的片,一直沒看。電影是以過去、現實交錯的方式來呈現,敘述Karen幫Vince寫傳記的經過,Karen小時候小兒痲痺,並因此參加了Lanny和Vince主持的募款晚會,她深受感動,長大以後,向出版社爭取寫Vince傳記,想多了解他的偶像一點。在跟他們兩人互動的時候,她慢慢地拼湊出當年他們兩人拆夥以及謀殺案的原因。相當不錯的電影,抽絲剝繭地娓娓道出事情經過與真相。
  • Monsters vs. Aliens(IMDB, Wikipedia),中譯:怪獸大戰外星人。很歡樂的片子,劇情不盡然全部合理,也銜接不是很好,可是B.O.B. 的台詞總是讓我笑,他的笑點跟 Patrick Star 有得拼。但是,我看到了這部片子的陰暗面,其實片子想說的是對人性的失望,你覺得不是?那麼為甚麼,Susan 最後相信怪獸的善良,繼續當人類眼中所謂的怪獸呢?

Upgrade Mono to 2.4.2.3 in Ubuntu Jaunty

網路上能看到的,多半都是自己編譯 tarball…

  1. 下載 mono in karmic 頁面 File 指示的三個檔案,先解開 mono_2.4.2.3+dfsg.orig.tar.gz,然後切到解開後的目錄下,打上 patch: cat mono_2.4.2.3+dfsg-1.diff.gz | gunzip | patch -p1,再用 chmod +x 幫 debian/rules 加上可執行的屬性。
  2. 安裝必要的套件: sudo apt-get install debhelper dpkg-dev libglib2.0-dev bison libtool dpatch libxml-dom-perl libxslt1-dev dc, lsb-release, libx11-dev libxt-dev zlib1g-dev autoconf automake
  3. 打開 debian/shlibs.local,把 libsqlite3 後面的 3.6.13 改為 3.6.10,因為 9.04 的 sqlite 是 3.6.10 版。
  4. 切到 mono 下,開始 build: cd mono;dpkg-buildpackage
  5. 把打包好的 deb 作成 local repository: 假設你把這些 deb 都放到 /opt/mono_debs 下,然後建立 Packages.gz: cd /opt/mono_debs && dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz。
  6. 新增 apt repository:在 /etc/apt/sources.list.d/ 下新增一個 mono.list,裡面放:
    deb file:///opt/mono_debs ./

    接下來就可以用 apt-get update、apt-get upgrade 來更新了。

理論上,這樣就可以更新了,但是事實上,因為 dependency 的關係,apt 會試圖安裝舊的 2.0.1 的 deb 來滿足相依性而導致應用程式有問題。
最好,也循上述的方法,把相關的基底 gtk-sharp2、xsp、gecko-sharp、mono-addins…等套件也重新 build 一次,這樣出現問題的情況應該會減少許多。
我個人建議,要用最新的 mono 還是衝 Karmic (9.10) 吧,這樣會省事很多。

Python 練習 – Google translate

因為看了A Bit? No!!!的這篇:写了个小小的翻译工具而做的小小練習。
基本上是作中翻英,但只要稍稍更動 langpair,就可以調整翻譯語言。

#!/usr/bin/env python
# -*= coding: utf-8 -*-
# http://www.oreillynet.com/pub/h/476 Encode Text for URLs
# http://evanjones.ca/python-utf8.html How to Use UTF-8 with Python
# http://abitno.linpie.com/a-small-translate-tool.html 寫了一個小小的翻譯工具
import sys
import os
from urllib import urlencode
import urllib2
import json
def get_json( uri ):
response = urllib2.urlopen( uri )
return response
def translate( text ):
uri="http://www.ajax.googleapis.com/ajax/services/language/translate"
query=urlencode( { 'v': '1.0', 'langpair': 'zh|en', 'q':
text.encode('utf-8') } )
uri = uri+"?"+query
return json.load( get_json( uri ) )
text = unicode( sys.argv[1], "utf-8" )
print unicode( text ) + u" => " + translate( text )['responseData']['translatedText']

電影流水帳(2009/9/1~2009/9/10)

同事借我的鋼之煉金術士有幾片有問題,所以就…放棄了。看動畫畢竟還是很費時間,所以要選~

  • Ghosts of Girlfriends Past(IMDB, Wikipedia),中譯:舊愛找麻煩。Matthew McConaughey演的 jerk 真的是很機車,但是坦白說,這整部片真是場災難,我不喜歡這部片子。
  • 向左走、向右走。我始終搞不清楚我有沒有看過這片,在看的過程中,始終覺得似曾相識。故事其實就繞著這句詩打轉:

    緣份將他們推進、驅離,阻擋他們的去路,忍住笑聲,然後閃到一旁…

    說穿了,跟村上的百分百女孩有異曲同工之妙。裡面的兩個配角非常有趣,然後赫然發現女配角是關穎,以前可能就不會注意到她。還不錯看的片子~

  • Extreme Ops(Wikipedia),中譯:巔峰殺戮。多加一個 O 就是 Oops。專拍特技的一群人去山上拍廣告,結果碰到假死的軍事強人,展開一場亂鬥,最後軍事強人真的掛了。很…普通的劇情,但是裡面滑雪場景倒是相當壯觀,因為是在阿爾卑斯山拍的,有機會是應該去走走。