電影流水帳(2008/04/25~2008/04/26)

兩天衝完四部片,夠猛!不過只有一部片我覺得比較好看~

  • Step up(Wikipedia),中譯:舞出我人生。這應該算是青春勵志片,一個小混混因為跟朋友進馬里蘭學校搞破壞,結果被逮住,法庭判他去學校勞動服務。事情往往就是那麼剛好,女主角因為舞伴受傷,剛好又發現他有才華,於是就找他幫忙,就這樣,發生了一連串的故事。普通,今年好像要上 2 的樣子。
  • Miss little sunshine(IMDB, Wikipedia),中譯:小太陽的願望。這部片子蠻好看的耶,帶小女兒去參加選美的旅行途中發生了一連串的事情,最後大家都解開心結,真的相當好看。
  • Catch that kid(Wikipedia),中譯:小鬼神偷。深愛老爸的女主角,為了突然癱瘓的老爸鋌而走險,去偷銀行的錢,最後以喜劇收場。偷銀行,這算是拍給小朋友看的電影嗎?整體來說普普通通,女主角後來有演出Jumper(移動世界),擔任女主角年輕的時候,出現片段很短。
  • Miami Vice(IMDB, Wikipedia),中譯:邁阿密風雲。雖說是從影集翻拍的,但老實說,我覺得翻拍的不怎麼樣,劇情普通。原本對這部片子很期待的說,因為演員陣容還蠻堅強的。

電影流水帳(2008/04/22~2008/04/24)

真的是太拼了,短短三天看完兩部片子!

  • Vantage Point(IMDB, Wikipedia),中譯:刺殺據點。實際上整個事件發生的時間我想只有大概二十到三十分鐘,或許更短也不一定,短短的時間內,可以從多個面向去把事件發生的經過重現一遍,然後剪成一小時約 30 分鐘的片子。我覺得很不簡單,片子看起來一氣呵成,不知道導演出動了多少攝影機,才能一氣呵成地把所有發生的經過拍下來?還不錯看的片子。
  • 奪帥(IMDB, Wikipedia),另外一個名字:血戰。演員陣容堅強,不過可惜,故事不怎麼樣,有點不知所云的感覺。唉~我的時間浪費掉了啊~

Boo(6)-變數

Boo 的變數宣告方法很簡單,就跟大多數的 script 語言一樣,指定即用。
比較特別的地方有三個:

  • 在第一次指定以後,該變數型別就確定了,之後若指定其他型別的值給它,會發生錯誤。這邊的行為跟 Python、Ruby、Javascript等 script 語言不同,要特別注意。這也證明了 Boo 具有靜態語言的特性。
  • 字串裡可以用 ${var_name} 的方式,會直接把 var_name 的值放到變數裡面去。
  • 字串有三種定義方法:
    1. 雙引號,如”Hello”
    2. 單引號:跟雙引號的不同處,在於單引號字串不解釋 ${},所以 print ‘${var}’ 會印出 ${var},而不是 var 變數的值。
    3. 三個雙引號,如 “””Hello”””,跟前兩者的差別在於可以跨越多行。這跟 python 一樣。
// var.boo
i = 100
s = "Hello world ${i} times!!"
print s
// 如果把 100 指派給 s,就會發生錯誤
// s = 100
// Boo Primer 說可以像下面這樣寫,但經過我試驗,是不行的。
// s as int = 200
// 但這樣寫,卻是可以的
o as object = 300
print o
o = "I am object"
print o
print """Hello
Line1
Line2
Line3"""

Boo 官方建議不要特別花心思去寫 <variable> as <type> = <value> 這樣的語法,盡量使用 <variable> = <value>。
經過編譯(booc -target:exe var.boo)以後,再用 reflector 去反組譯,產出的C#代碼如下:

private static void Main(string[] argv)
{
int num = 100;
Console.WriteLine(new StringBuilder("Hello world ").Append(num).Append(" times!!").ToString());
object obj2 = 300;
Console.WriteLine(obj2);
obj2 = "I am object";
Console.WriteLine(obj2);
Console.WriteLine("Hello\r\nLine1\r\nLine2\r\nLine3");
}

從反組譯出來的結果看來,Boo都幫你自動處理好了,的確是不用特別花心思去寫。

電影流水帳(2008/04/17~2008/04/21)

一部是可能有續集的動作片,另一部算是劇情片。有時候在想,我是不是應該要跟一些專門介紹電影的網站一樣,寫的長篇大論呢?還是保持我言簡意賅的風格,簡單交代我的感想即可?

  • Jumper(IMDB, Wikipedia),中譯:移動世界,中文片名我倒是覺得可以用時空跳躍者。這故事不錯,看了維基百科上的介紹,果然是由Steven Gould的小說改編,劇情介紹就不多說了,網路上還蠻多人推薦這部片子的,Google it!整部片子到最後,仍然是沒有解釋為什麼Paladin要追蹤並殺害Jumper,我想這應該會有第二集來作Paladin與Jumper的前因後果吧~
  • The bucket list(IMDB, Wikipedia),中譯:一路玩到掛。雖然中譯片名與英文片名不符,但是我覺得意思有到了,片子的確就是告訴你,不要愁眉慘霧地等死,勇敢地把想做的事情列出來,然後努力去作,這不就是一路玩到掛?不過其實有很多事情並不是真的說要作就能做的,還是得像片裡的Jack Nicholson一樣那麼有錢才行啊~附帶一提,找這兩個老傢伙演員演,真的是找對人了。

Boo(5) – Console.ReadKey()

承接上篇的討論,經過 Hack 之後,發現原因就出在 Console.ReadKey()。

booish 與 IronPython 為了要能達到自己的需求,所以並不使用 Console.ReadLine(),而是使用 Console.ReadKey() 自行處理收到的按鍵並輸出。
為了要知道為甚麼會有問題,我試著寫了一個小程式,想知道相似的方式,是否也會有同樣的問題發生:

// Program: readkey.cs
// How to compile: gmcs /target:exe readkey.cs
using System;
public class Hello {
public static void Main( string[] args ) {
Console.TreatControlCAsInput = true;
ConsoleKeyInfo keyInfo;
do
{
keyInfo = Console.ReadKey( true );
Console.Write( keyInfo.KeyChar );
} while( keyInfo.Key!=ConsoleKey.Escape );
}
}

這個小程式編譯以後,使用 .NET 來執行,一切正常,但使用Mono Windows 版來執行,就硬是會 echo 出兩次。
經過用Reflector比對以後,發現Mono的 Console.ReadKey() 的迴圈條件式有問題。
如果將該條件式修正為:

// } while( record.EventType != 1 && !record.KeyDown); // original
} while( !(record.EventType==1 && record.KeyDown ) );
// 附帶一提,這是 Windows .NET 的版本的變形,多判斷了 Character=='' 與 VirtualKeyCode 不是 Ctrl、alt、shift、numlock、caplock、scrolllock 的情況
//} while( !(record.EventType==1 && record.KeyDown ) || record.Character=='' && ( ((record.VirtualKeyCode0x12) && record.VirtualKeyCode!=0x14 && record.VirtualKeyCode!=0x90 ) ? (record.VirtualKeyCode==0x91) : true ) );

就可以解決問題,我想這可能是因為寫作 WindowsConsoleDriver.cs 的人對 ReadConsoleInput() 不夠清楚的緣故,不過其實我也是看了 source code 才知道要這樣去判斷。
總之,一切就此水落石出。

等等,可是為甚麼 Console.ReadLine() 沒有問題呢?嗯嗯,這邊的原因也很簡單,因為不管是 .NET 的 CLR 或是 Mono,都是調用 stdin 進行處理,所以就沒有這樣的問題了。

解決方法,目前並沒有,應急的方法是自行下載原始碼,修正Console.ReadKey()(在class/corlib/System/WindowsConsoleDriver.cs)以後,再編譯。不急的話,是先上Mono Buzilla去找找看是否有人回報過此問題,如果沒有再回報上去。
晚點要去找找看,然後回報上去,希望下個版本能解決。

Boo(4) – booi 與 booish

Boo 有兩個很方便的工具:booi 與 booish
booi 可以用來直接執行你寫好的 script,而不必事先編譯。
而 booish 則可以讓你直接輸入指令,立即就能看到結果。
類比其他語言的話,booi 用法就像是執行 wscript your_script 或是 python your_script:booi your_script。
booish 就像是單獨執行 Pythonruby 是一樣的,執行以後,會出現訊息以及提示符號。
booish 的提示符號是 >>> ,與 Python 一樣,使用方法也很類似。
使用 booish 的時候,我發現很詭異的地方,就是使用 Mono 包進來的 booish 與 ipy (IronPython) 時,輸入任何字元,都會自動出現兩次以上…
boo 官方網站所提供的 booish 就沒有這個問題,這讓我很納悶。
有時間來找找這問題發生的原因。

Boo(3) – ildasm

使用 ildasm 有兩個目的:

  1. 比較print macro 與 print 函數的差別
  2. 比較 booc 編譯出來的可執行檔與 c# 編譯出來的可執行代碼

print macro 與 print 函數算是差別很大吧。
print 函數會調用 Boo.Lang.Builtins 類別裡的 print 函數,雖然實際上此函數的內容也是使用 Console.WriteLine(),但是除了你需要多附上 Boo.Lang.dll 之外,你還需要負擔 CLR 執行時動態把 Boo.Lang.dll 載入的成本。

IL_0005: call void [Boo.Lang/*23000001*/]Boo.Lang.Builtins/*01000001*/::print(object) /* 0A000001 */

使用 print macro 的話,就只是把 Console.WriteLine 替換進去,以編譯出來的結果而言,這會比較有效率,但如果作為 script 執行時,我想應該會有些損失。

IL_0005: call void [mscorlib/*23000001*/]System.Console/*01000001*/::WriteLine(string) /* 0A000001 */

這就是為甚麼BOO Primer建議使用 print macro 的原因。
booc 編譯出來的結果與使用 gmcs (我使用 Mono 的 c# 2.0 編譯器)編譯出來的結果非常接近,都同樣直接呼叫 System.Console.WriteLine,可以視為一樣。
p.s. 我也看過以 csc 編譯出來的結果了,實際上也非常相近,不過反組譯出來的IL代碼裡面的編排有些許不同。

電影流水帳(2008/04/14~2008/04/16)

現在硬碟不值錢啊~250G 的 IDE 硬碟才 2000 元大洋,這是在暗示我敗下去嗎?

  • Eragon(IMDB, Wikipedia),中譯:龍騎士。Eragon 是主角名字,龍騎士應該是 Dragon Rider 才對,這一集只描述了 Eragon 如何成為龍騎士,並打倒小魔王的經過,還不錯看,不過沒有什麼特別驚奇的感覺。我想如果沒意外的話,這肯定會有第二集吧~
  • 長江7號 (CJ7)(IMDB, Wikipedia)。嗯嗯,主角並不是星爺喔,所以並不是搞笑片,而是拍給小朋友看的,我猜是星爺要完成年輕時當兒童節目主持的心願吧~雖然劇情有點老套,不過在後面我還是不爭氣的掉下幾滴眼淚,想起國中看魯冰花時,也是流的滿臉淚~對於這種催淚片,我不是不愛看,而是不想看,避免暴露太多情緒~

BOO(2) – Hello world!

接下來的系列文章,大致會照著BOO Primer的章節來作介紹。

是的,永遠的 Hello world!

BOO 的 Hello world! 非常簡單:

// 把 print 當 macro 使用,什麼是 macro ??日後再說明
print "Hello world!"
// 或者是拿 print 當函數使用
print("Hello world!")

官方建議使用 print macro 的版本,我想是效率上的考量,macro 在執行時會展開為真正的代碼,而不是以函數呼叫的方式來處理。不過我覺得這見仁見智,差別不是很大。另一個好處應該是很像 Python 吧~

電影流水帳(2008/04/12~2008/04/13)

看了兩片,都不是有在台灣上演過的院線片,在IMDB上都標注了 TV,所以應該是電視台製作的片子吧~

  • The Wilde Girls (2001) (TV),中譯:狂野女孩,片名應該是從原片名亂掰的。Wilde 是主角的 Last name,所以故事主軸是在描述女人的故事。主角是個歸隱的歌手,獨自撫養女兒,與媽媽住在一起,女兒很想成名、出去闖闖,可是主角因為過去的不愉快經驗,非常排斥,不過主角的媽媽倒是很支持。主角的媽媽為了幫他孫女,就找了在飛機上認識的製作人來,於是故事就推展出來。我覺得還不錯的片子,可以看看。
  • Earthstorm (2006) (TV),中譯:地球風暴。在CineMax看到了,因為隕石的撞擊,月球核心受到損害,開始崩裂,為了拯救月球,於是展開行動。不怎麼樣的片子,不用特別去找來看了。