電影流水帳(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。專拍特技的一群人去山上拍廣告,結果碰到假死的軍事強人,展開一場亂鬥,最後軍事強人真的掛了。很…普通的劇情,但是裡面滑雪場景倒是相當壯觀,因為是在阿爾卑斯山拍的,有機會是應該去走走。

quilt

今天終於試用了 quilt,這是一個可以管理 patch 的工具,最早由 Andrew Morton 的一些 script 而來。
專案本來就有寫一些 script 來作 apply 的工作,只是,在想要倒回去或向前的時候,會變得非常麻煩!用 quilt 的話,可以方便的向前或向後。
因為已經有 patch 了,所以施作的方法很簡單,先 import,再 push。

quilt import patch01
quilt push
quilt import patch02
quilt push

之後就可以用 pop 往回推,或用 push 繼續往前了。
小記:坦白說,本來想放棄直接用 git 來作的…因為剛好在看 ProGit,覺得 git 或許會更適用也不一定,不過只是想簡單地往前或往後測試 patch,用 quilt 應該就夠了。
參考資料:

Python 練習 – 抓書

早上用了大概兩個小時搞這個,這是用來抓的,除了抓以外,還直接把 script 、廣告…等都清掉,只留下書的內容。用法很簡單,執行這個 script,參數帶上那本書的網址就行了。
程式碼怎麼排都不行,所以丟到這裡了。