電影流水帳(2009/10/16~2009/10/22)

最近看的電影都還不錯。我開始覺得當影展的評審真是不簡單,評審期間要看好多片子,應該是或多或少都會有疲乏感吧。之前有看老原在去年金馬影展時貼出的文章,裏面就有提到不少她當評審時的想法/心得,果然當評審並不是那麼的簡單。

  • Harry Potter and the Half-Blood Prince(IMDB, Wikipedia),中譯:哈利波特-混血王子的背叛。哈利波特共七本,這部正好是我唯一有看過紙本的一本。我還蠻喜歡電影裡關於榮恩跟妙麗的糾結,拍的很有趣,但相對的,其他的部份就有點交代不清,不過小說裡該交代的還是都有交代到,我覺得還算是不錯。總體看下來,石內卜真的是一個很重要的角色,找Alan Rickman真的是找對人了。
  • The ugly truth(IMDB, Wikipedia),中譯:男女生了沒。同樣是愛情喜劇,跟The Proposal比起來,我比較喜歡這一部。情節比較緊湊,也比較逗趣,看Katherine Heigl飾演的戲裡角色被Mike Chadway唬的一愣一愣的,真的是讓人忍不住笑出來。女製作人本來很討厭男主角,但後來男主角教她釣凱子,果然手到擒來,但後來卻也不知不覺跟男主角墮入情網,最後當然是在一起了。

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

真能兩天看完一部片的話,年底達成百片的夢想不遠。

  • State of Play(IMDB, Wikipedia。中譯:絕對陰謀。簡單的說,就是記者追查真相。故事還不錯,能讓人想看下去,想知道結果,不過看到最後會有怎麼是這樣結束的感覺,是失落的感覺。片裡的Ben Affleck有點不太像是我印象中的Ben Affleck,是因為演國會議員太過正經的關係嗎?
  • The Hangover(IMDB, Wikipedia),中譯:醉後大丈夫。這肯定是我最近所看到最爆笑的片子。新郎帶著3個伴郎去開婚前單身派對,狂歡前新郎的弟弟請大家喝酒,裏面摻了迷姦藥,然後就度過一個狂歡的夜晚。結果當然是什麼都不記得,隔天發現新郎不見,老虎在浴室,就趕快展開回想的行動…但回想的過程裡有太多的驚訝跟爆笑。所以說啊,約會迷姦藥真的是很可怕…
  • G.I. Joe: The rising of Cobra(IMDB, Wikipedia),中譯:特種部隊-眼鏡蛇的崛起。我覺得還不錯的科幻動作片,比變形金剛2好多了,這也是小時候卡通改拍的電影。片子裡的奈米蟲真的是很屌,這也難怪女主角的弟弟會傾心於這個高科技,進而變成大反派。

解決 opera 10 不能用 ibus 問題

環境:
Ubuntu 9.10
Opera 10
輸入法:ibus
解決方法:
編輯 /usr/bin/opera,在 OPERA_BINARYDIR 之下加上

export QT_IM_MODULE=XIM

,然後重新啟動就行了。

grub 從不是第1個硬碟開機

我承認,這標題下的很爛,但一時也想不到更好的。

情況是這樣的,我第一個硬碟已經裝了 Linux,這時候我卻想裝 Windows,是故,我只能裝在第二個硬碟上。Windows 非常機車,如果第一個硬碟沒有 NTFS 的 partition 是不給你裝的。這時候只能先拔第一個硬碟的電源,把 Windows 裝到第二個硬碟上之後,再重新把第一個硬碟的電源裝回去。

接下來,因為不想老是在 BIOS 裡切換開機順序,所以把腦筋動到 grub 上。根據 grub 的 manual,只要利用 map 就行了,但我還是試了好一陣子,後來才發現是順序的問題,我試的時候把 map 放到最前面去了。正確的順序是這樣的:

title		Windows XP
root		(hd1,0)
makeactive
map (hd0) (hd1)
map (hd1) (hd0)
chainloader	+1

這樣就可以不用在 BIOS 裡切換開機順序了。如果你不是用第二個硬碟,而是第3個或第四個硬碟,只要類推為 hd2、hd3 即可。

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 的內容替換進去了。