電影流水帳(2008/6/27~2008/7/8)

這次很難得地附上一張截圖…

  • 最遙遠的距離(Zui yao yuan de ju li (2007)”IMDB, Wikipedia)。最遙遠的距離莫過於如此吧~要找尋的人,最後竟然就在身邊一起看海…我看完也有種跟我妹很遙遠的感覺,因為她是這部片子的助理導演,而我現在才知道。
  • The Children of Huang Shi(IMDB, Wikipedia),中譯:黃石任務。這次看的是完全中文發音的版本,老實說,這種感覺…真怪。不過還好故事蠻吸引我的,拍的算是中肯,有把感覺都拍出來,這個George Hogg真的令人敬佩。片尾還訪問了那些現在已經是白髮蒼蒼的孩子,聽他們訴說對於George Hogg的感覺,真的是令人唏噓~

The most distant course

讓 Banshee 啟動時自動播放音樂

主要是利用上一篇介紹的 BooScript Extension,讓 Banshee 能在一開始就播放音樂…
BooScript Extension 在載入時,會檢查是否有 script 要執行,有的話,會進行編譯並執行,所以這個時候 Banshee 內部還有許多事情還沒初始完成,所以必須要將 AutoPlay 的動作排程到 Application.ClientStarted 裡,讓 Application 啟動之後去執行 AutoPlay 的動作。

import System
import System.IO
import Banshee.ServiceStack
def OnClientStarted( client as Client ):
Hyena.Log.Information( "engine is playing now..." )
ServiceManager.PlayerEngine.Play()
Hyena.Log.Information( "autoplay script is loaded." )
Banshee.ServiceStack.Application.ClientStarted += OnClientStarted

就這麼簡單,下次要加上自動記錄播放與自動播放記錄曲目的功能。

.NET framework essential Chapter 4

Chapter 3 主要是講各種語言的介紹與互相操作,大致都已經知道,沒什麼要紀錄的。
接著記 Chapter 4 的一些東西。

  • 只要在 .config 裡面使用 bindingRedirect,就可以重新導向相依的assembly到新版本的assembly。.config 裡的 attribute:runtime / assemblyBinding / dependentAssembly
  • Remoting object 的程式真的出乎意料地簡單,以前從沒研究過,有機會來試試效能,看看傳一堆物件或是 Dataset 的效能如何。
  • 有一個 Attribute 的簡單範例…
  • 支援 Transaction 的要件:
    1. 繼承 ServicedComponent
    2. 使用正確的 Transaction attribute

    接著就可用 System.EnterpriseServices.ContextUtil。此外最好也指定 ApplicationName、ApplicationActivation 等組件attribute。.NET 會在編譯時自動把組件加入 COM+ Service 裡,無須自己動手註冊。這邊還有 Object pooling、Role base、Message Queuing 的例子,很淺顯易懂。這部份在 Mono 裡都沒有被實作出來,主要是因為 COM+ 在 Linux 下沒有替代品的關係。

在 Banshee 1.0 裡使用 BooScript

有兩種方法:

  1. 執行 Banshee 時,加上 –run-scripts your_boo_scripts.boo 表示要執行指定的 boo script
  2. 將 boo script 檔案放在 ~/.config/banshee-1/boo-scripts/

如果你會 Boo 的話,基本上就不難幫 Banshee 增加功能。不過難就難在你必須要對 Banshee 的原始碼有一定程度的了解…除了看原始碼以外,也可以看看官方提供的 extension 怎麼寫…

Boo(20)-Generator 函式

Generator 函式其實就跟 C# 的 Iterator 一樣,利用 yield 關鍵字先把值傳回讓呼叫者使用。
使用 Generator/Iterator 最大的好處是可以讓函式只做必要的邏輯,而不需要把一些事情綁在迴圈裡面。
下面就是一個很標準的尋訪目錄樹的範例,尋訪的工作交給 walk,主程式則負責依據傳回的值作處理。

import System
import System.IO
def walk( path as string ):
di = DirectoryInfo( path )
for d in di.GetDirectories():
yield d as FileSystemInfo
for f in di.GetFiles():
yield f as FileSystemInfo
for node in walk( "." ):
if node isa DirectoryInfo:
print "[${node.Name}]"
elif node isa FileInfo:
print node.Name

參考自:Generators
p.s. 這系列文章一定會持續寫到 macro 出現為止。

電影流水帳(2008/6/20~2008/6/26)

公司福委會發了兩張免費電影票,該去看什麼片呢?或是送給老婆的妹妹?

  • Pirates of the Caribbean: At World’s End(IMDB, Wikipedia),中譯:神鬼奇航-世界的盡頭。發哥其實戲份不多,有點被廣告誤導了。一行人從世界盡頭回來的過程還蠻有趣的,居然要設法翻船,才能回到原來的世界,這也難怪The Flying Dutchman要能潛到水底。最後的Calypso好像不夠 powerful 啊~跟想像中不太一樣,照理來說被七大海盜王封印的怪物應該更厲害才對~
  • Atonement(IMDB),中譯:贖罪。前面一個小時,我覺得很不錯,小女孩演的很不錯。只是到了後面,我就覺得好像少了什麼似的,我想是因為沒說明到贖罪的原因吧。

.NET essential 第二章 CLR 筆記

主要是紀錄以前不知道或是看過沒深入了解的一些東西:

  1. Managed C++ 編譯出來的執行檔無法用mono執行,可能是因為 Native code 跟 IL code 放到一起的關係。
  2. 從 stack-based 的 value type 轉成 heap-based 的 reference type 的過程稱作 boxing,反之稱作 unboxing。
    int i=1;
    object obj = i; // boxing
    int j = (int)obj; // unboxing
    
  3. 為了要讓各種語言能在 CLR 上執行,有 Common Language Specification 的 ECMA 標準 – Standard ECMA-335
  4. NGen 可以預先將 IL code 轉為 Native executable code,省掉 JIT compiler 的工作(pre-JITting),因此可以加速。mono裡似乎是用
    mono -O=all --aot your-assembly

    來替代的樣子。

Boo 的 currying

拜讀了Jserv大的”以 C 語言實做 Functional Language 的 Currying”Thinker大的”真 C 語言實做 Functional Language 的 Currying”以後,決定也來挖掘一下 Boo 的 currying 寫法,根據這篇文章:Boo Programming Language Languages Currying Def Return World,程式碼出乎意料的簡單:
[python]
//Currying:
plusX = { a as int | return { b as int | return a + b }}
print plusX(3)(4)
[/python]
就這樣。老實說,大概懂了,可是又不是很懂,也沒想到用途。
所以,就跟沒懂是一樣的。

電影流水帳(2008/06/13~2008/6/19)

中東的女子莫名其妙地就受到很多束縛,焦糖人生裡的Nisrine為了結婚,還跑去作處女膜重建手術。在台灣早期的年代,也有同樣的事情,只是當時無法作處女膜重建手術,而以偷偷滴血的方式來掩護。這些事情從現在的角度來看,真的是覺得不可思議。

  • Sukkar banat(Caramel)(Wikipedia),中譯:焦糖人生。很難說明的感覺,這就是人生吧~蠻好看的片子,不會太枯燥。導演Nadine Labaki自己下海去演,原來她之前就演過好幾部片子,而這部片子是她自導自演的第一部片子,嗯,她本人還蠻正、蠻有魅力的。
  • The Da Vinci Code(IMDB, Wikipedia),中譯:達文西密碼。與原著相當接近,我覺得拍得還不錯,蠻好看的。

Boo(19)-例外處理

例外處理的語法與 Python 相近,差別在於 Boo 使用 ensure,而 Python 使用 finally。
除此之外,Boo 統一使用 except 處理各種例外,而 Python 使用 else 處理無法處理的例外型態。
[python]
import System
class MyException(Exception):
_msg as string
def constructor( s as string ):
_msg = s
override def ToString() as string:
return “MyException::${_msg}”

// 試著調整這兩個變數試試看
isExceptionHappen = false
isMyExceptionHappen = true
try:
// .. do something …
if isExceptionHappen:
raise Exception(“Something wrong.”) // 提出例外情況
// …
if isMyExceptionHappen:
raise MyException(“Hey!!”)
except e as MyException:
print e.ToString()
except e as Exception:
print e.Message
ensure:
print “不管有沒有錯誤,這裡都會被執行。”
[/python]
參考:Boo Primer – 例外Python tutorial – 8. Errors and Exceptions