mplayer 的 -input 可以指定 file,man 裡面說明了你可以給一個 FIFO 的檔案。
藉著這個,於是就可以寫程式來控制 mplayer 來播放影片或是音樂。
你可以參考致遠管理學院資工系專題研究計畫研究成果報告計畫: Linux C# 設計 …
你還可以使用 GStreamer#,Mono team 的人已經幫你將 gstreamer 函式庫包裝為 GStreamer#,因此使用 GStreamer# 也可以進行播放影片和音樂,最好的例子是 Banshee。
不過這只適用於 Linux。
.NET framework essential Chapter 6-Web Services
最前面是一堆有點誇張的介紹,不過在當時大家真的都以為 Web Services 很棒…
這一章介紹 Web Services 的觀念與實作,由於微軟是規格制定者,所以 .NET 對 Web Services 的支援不能少,下了很多功夫。
主角是 WebService 類別與 WebMethodAttribute,方法是繼承 WebService 類別,然後在要被呼叫的方法上,標上 WebMethod attribute。
以前以為 Web Services 的底層是 SOAP,所以只能用 SOAP,沒想到也可以用 GET/POST 的方式來呼叫,所以 javascript 也能輕易地呼叫 Web Services,然後解析回傳的 XML 即可。
Security 方面,以前也以為沒有 session,現在也知道可以用了。另外還介紹了兩種層級的保護,系統層級是利用 IIS 管理介面設定權限與 SSL 來達成,Application Level,則是利用 .NET 的 web.config 來達成。
SSL 對於 Web Service 來說,是個稍嫌沈重的負擔,所以他也建議使用 authentication token 的方式,也就是提供一個架構在 SSL 上,可以取得 authentication token 的方法,取得 token 之後,後續的呼叫都要帶入這個 token,以作為識別。
這樣的方式,在目前有提供 Open API 的網站上很常見。
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的文章,看到博客來可以訂購這些漫畫了,有點心動,想去敗…
- Kung fu Panda(IMDB, Wikipedia),中譯:功夫熊貓。還不錯的娛樂片,快樂就好。
- In the Name of the King: A Dungeon Siege Tale(IMDB, Wikipedia),中譯:末日危城王者之役。Claire Forlani看來皺紋好多﹔Leelee Sobieski是很正,只是沒什麼表現;Jason Statham的武打在那個時代看來,很沒有說服力。整體來說,我覺得這是爛片,浪費了我兩個小時。
讓 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 關閉的話,在關閉的時候會出現錯誤訊息。