MonoDevelop on Windows

Cygwin 要裝些什麼可以參考這篇:CodeProject 上的文章:Building Mono on Windows: the final battle.
不過 Mono 可以直接用官方提供的,不需要自己 build。

首先進 Cygwin shell,設定 PATH 與 PKG_CONFIG_PATH,讓 Cygwin 能找到 Mono

export PATH=/cygdrive/c/Progra~1/Mono-1.9.1/bin:$PATH
export PKG_CONFIG_PATH=/usr/lib/pkgconfig/:/usr/local/lib/pkgconfig/:/cygdrive/c/Progra~1/Mono-1.9.1/lib/pkgconfig

再把 Mono 目錄下的 pkg-config 更名,因為這個版本的 pkg-config 太舊。

接著要 build Mono-Addin-0.3.1,這簡單,很快就 build 過了。(./configure && make && make install )

再來就麻煩了,1.0 無法 build,它會要求裝 monodoc, gtksourceview-sharp-2.0.0;monodoc 其實已經有了,但卻沒有給 pkg-config 用的 .pc 檔,所以補上一個自製的 monodoc.pc。接著,gtksourceview-sharp 則需要裝 gnome-sharp、gtk-sharp 與實體的 gtk+、gnome 函式庫,所以我放棄 1.0,改用 1.9。1.9 是比較順利了,順利的原因是,MonoDevelop team 本來就有打算要出 Windows 版本,只是能不能用還在未知之數。

在 build 的過程中,發現 gmcs 無法載入 Mono.Addin.Setup assembly 的問題,這是由於 gacutil 跟 Cygwin 相處的不太好,gacutil 收的 path separator 是反斜線 ‘\’,但 Cygwin 只能給 ‘/’,所以安裝 Mono.Addin 時,並沒有依照 Makefile 的指定,將 .dll 註冊到 gac 所以在編譯(make)、安裝(make install)後,你必須要手動將 .dll 註冊到 gac 裡:

cd bin;find . -name '*.dll' -exec gacutil -i {} \;

接著,MonoDevelop 就 build 成功了。不過,MonoDevelop 還是不能執行 🙁 MonoDevelop.Core.Gui.Services 這邊會丟出例外。

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

本來是想看地心冒險的,結果到了微風國賓,卻發現剛好當天為了剛上演的 Wall.E的緣故,電影時刻改到晚上去了…只好改看刺客聯盟

  • Wanted(IMDB, Wikipedia),中譯:刺客聯盟。這也是一部由漫畫改編的電影,裡面的情節與故事相當的誇張,鬼扯到極點,例如子彈能轉彎…等等。不過,這是一部娛樂性極佳的電影,看完以後除了覺得鬼扯以外,還覺得蠻不錯的,至少看起來有爽的感覺。
  • Iron Man(IMDB, Wikipedia),中譯:鋼鐵人。網路上對這部片子的評價都不錯,我個人也覺得不錯。不知道為什麼,我覺得Gwyneth Paltrow在這部片子裡面正到不行,莫非她天生就是演秘書的料??電影的最後,主角本來還想掩飾,結果卻是出人意表地承認說:”沒錯,老子就是鋼鐵人!”,這一幕真是屌斃了。沒看到片尾的字幕之後,聽說還有玄機…

Banshee 的 PlayQueue

1.0 版以後多了一個新功能-PlayQueue,我很喜歡這功能,因為你可以一直把想聽的歌丟進去,Banshee會播放這個Queue裡的歌直到Queue沒有歌為止。
本來以為這是內建的功能,後來看了之後,才發現這是一個 Extension。
它主要繼承 PlaylistSource、IBasicPlaybackController,把自己實作成一個 Playlist 來源,在Banshee播放時,實際上來源已經不是原來的 Music library 了。
所以如果要取得這個 Source,應該是利用 ServiceManager.SourceManager 來取得,要加入 PlayQueue 的話,則是使用 AddSelectedTracks()。
目前我還沒研究出如何在 Extension 裡面呼叫其他 Extension 的方法…

電影流水帳(2008/7/9~2008/7/22)

昨天看到介紹美國漫畫-Batman的文章,看到博客來可以訂購這些漫畫了,有點心動,想去敗…

讓 Banshee 啟動時自動播放音樂之二

每次都從第一首播放,實在太沒意思,所以在播放前切換為 Shuffle 模式,播放時,就會隨機挑選一首開始播放,然後再關閉 Shuffle 模式。

import System
import System.IO
import Banshee.ServiceStack
import Banshee.PlaybackController
def AutoPlay() as bool:
ServiceManager.PlaybackController.ShuffleMode = PlaybackShuffleMode.Song
ServiceManager.PlayerEngine.Play()
ServiceManager.PlaybackController.ShuffleMode = PlaybackShuffleMode.Linear
def OnClientStarted( client as Client ):
Hyena.Log.Information( "engine is playing now..." )
GLib.Timeout.Add(1500, AutoPlay)
Banshee.ServiceStack.Application.ClientStarted -= OnClientStarted
Hyena.Log.Information( "autoplay script is loaded." )
Banshee.ServiceStack.Application.ClientStarted += OnClientStarted

p.s. 上次有提到要作自動記錄播放與自動播放記錄曲目的功能,我的確是做了,只是在播放完指定曲目後,又跳回第一首,這表示我還得繼續研究原始碼才行,所以暫時不釋出。

.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

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