.NET framework essential Chapter 5

這一章主要講 ADO.Net。
DataSet、DataTable、DataRow、DataRelation… 這一組類別完全是一個抽離實體層的類別,所以有 DataAdapter 這一組與 Connection、Command、DataReader …等類別溝通。

  • GetChildRows[] 可以依據 Relationship 來取得子Table與父Table相關的資料列。
  • 一個 DataAdapter 基本上對應一個 DataTable,但他不管所在的 DataSet,所以你可以都塞到同一個 DataSet 裡面去。另外 DataAdapter 不處理 Relationship,所以用 Fill 取得資料並放到 DataSet 裡的 DataTable 之後,得自己加上 Relationship。
  • 由於 DataSet 與 XML 有一定的關係,第五章最後簡單地介紹了 XML 的相關函數。

用 Boo 寫 Web Service

必須先將以 Boo 寫的 Web Service 編譯為 Assembly,然後再製作一個以 c# 或 vb.net 寫的 asmx 繼承該 Web Service 類別才行。
否則會遇到 “The invoked member is not supported in a dynamic module.” 的錯誤。
我是在遇到錯誤的時候,去參考 boo 源碼 examples/asp.net 下的 Math.asmx 與 Math.asmx.boo 才知道這件事情的。
本來我還在納悶,為甚麼 examples/asp.net 下會有一個用 c# 寫的 asmx,還以為是搞錯了呢~

// Math.asmx.boo
// 要先編譯好,放在 bin 目錄下:booc -t:library -out:bin/Math.dll Math.asmx.boo
import System.Web.Services
[WebService]
class Math:
[WebMethod]
def Add(a as int, b as int):
return a+b
[WebMethod]
def Multiply(a as int, b as int):
return a*b
<%@WebService Class="MathService" Language="C#" %>
// Math.asmx
public class MathService : Math  // 繼承用 Boo 寫的 Math 類別
{
}

foxyproxy 自動組態指令碼的小問題

因為有在用 foxyproxy 的關係,昨天遇到一個問題,就是 foxyproxy 突然無法解析 pac 檔案了。Log 裡面有這樣的訊息:

TypeError: invalid ‘in’ operand this._sandBox

我試了好久,也找了好久,最後找到官方這篇討論串:PAC support,討論串裡面,作者很熱心想要解決,可是在他那邊複製不出這個問題,所以後面他就乾脆說,有遇到問題的,可以寫信跟他要測試版的 foxyproxy 試試看~
我實在是懶得寫信去要,所以就繼續試,結果無意中被我試出一個 workaround,於是趕緊貼上討論串給其他人參考。
今天去看的時候,發現有人說我的 workaround 有效~蠻令人高興的。
我的 workaround 就是,先把 foxyproxy 關閉,接著重新去把你的樣式設定為”使用自動組態指令碼”,然後關閉。接著再切換你剛剛設置的樣式,就行了。
如果沒有先把 foxyproxy 關閉的話,在關閉的時候會出現錯誤訊息。

電影流水帳(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

    來替代的樣子。