September 5,2008
列出 log4net 設定裡所有的 repository 跟 appender
Debug 用的,主要是看自己的 log4net 設定對不對。
StringBuilder sb = new StringBuilder();
ILoggerRepository[] repos = LogManager.GetAllRepositories();
foreach( ILoggerRepository repo in repos )
{
sb.AppendLine( "=====" );
sb.AppendLine( string.Format( "{0} - configured={1}", repo.Name, repo.Configured.ToString() );
sb.AppendLine( "Appenders:" );
foreach( IAppender appender in repo.GetAppenders() )
{
sb.AppendLine( string.Format( "\t{0}", appender.Name ) );
}
}
sb.AppendLine( "=====" );
Console.WriteLine( sb.ToString() );
August 25,2008
debuan/ubuntu nant-0.85 的 SMP bug
最近在 Ubuntu 下用 NAnt 時,有 50% 的機率會遇到類似這樣的錯誤:
裡面提供的暫時解法是利用環境變數 MONO_NO_SMP,把 SMP 關掉,再執行即可。所以只要編輯 /usr/bin/nant,在 exec 之前加上 export MONO_NO_SMP=1 即可。
The current runtime framework 'mono-2.0' is not correctly configured in the NAnt configuration file.
Function call failed.
Expression: ${path::combine(prefix, 'lib/mono/1.0')}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Illegal characters in path
Parameter name: path1
找了好久,都不知道原因所在,因為有時候是正常執行的。去Google試了好幾個關鍵字,都找不到解。今天用 nant "Illegal characters in path" 去找,終於找到了:#483073 - nant: race condition on SMP systems - Debian Bug report logs裡面提供的暫時解法是利用環境變數 MONO_NO_SMP,把 SMP 關掉,再執行即可。所以只要編輯 /usr/bin/nant,在 exec 之前加上 export MONO_NO_SMP=1 即可。
August 22,2008
最近用 MySql Connector/Net 的幾個心得
- 連線字串加上 charset=utf8,如此一來,完全不用更改 MySQL 伺服器設定,只要確定建 database/table 時有指定 utf-8 編碼即可。
- SQL 參數在使用 @ 時,若碰到問題,不妨改用 ? 試試。我的確碰到這問題,它卡了我兩、三天,而且改用 ? 也解決了。忘了在哪兒看到,剛好有提到這點,真的是幸好我有看到...
- MySQL 有提供 MySqlHelper 類別,省掉寫 Helper 的麻煩...
- MySQLConnector/Net下載網站上沒有給 Linux 的版本,事實上,是通用的,你可以直接拿給Mono用,不需要作任何改動。
August 8,2008
.NET framework essential Chapter 7/8-ASP.Net/Windows form
各自只有一個章節,不過作者很簡明扼要地把該介紹的東西都介紹了。
ASP.Net 除了講 HtmlControl、WebControl 以外,還介紹了 Directive、Session 設定等等。
Windows form 則是簡單的介紹如何開始、Layout 的配置,以及比較容易讓人混淆的 MDI Form。
這本書真的很不錯,講的都很基本,看完對 .NET 會有一定程度的了解,不至於在茫茫大海似的類別庫裡淹死。
ASP.Net 除了講 HtmlControl、WebControl 以外,還介紹了 Directive、Session 設定等等。
Windows form 則是簡單的介紹如何開始、Layout 的配置,以及比較容易讓人混淆的 MDI Form。
這本書真的很不錯,講的都很基本,看完對 .NET 會有一定程度的了解,不至於在茫茫大海似的類別庫裡淹死。
August 7,2008
App_Offline.htm
今天 Trace Mono System.Web.HttpRuntime 時看到的,如果在你 ASP.Net 2.0 網站目錄下放置一個 app_offline.htm 時,不管你瀏覽什麼網頁,都只會看到 app_offline.htm 的內容。
詳情可以參考 ScottGu 大 的文章:App_Offline.htm
很鳥的是,.NET Documentation 裡完全沒提到這個。
詳情可以參考 ScottGu 大 的文章:App_Offline.htm
很鳥的是,.NET Documentation 裡完全沒提到這個。
August 5,2008
Mono 與音訊、視訊
mplayer 的 -input 可以指定 file,man 裡面說明了你可以給一個 FIFO 的檔案。
藉著這個,於是就可以寫程式來控制 mplayer 來播放影片或是音樂。
你可以參考致遠管理學院資工系專題研究計畫研究成果報告計畫: Linux C# 設計 ...
你還可以使用 GStreamer#,Mono team 的人已經幫你將 gstreamer 函式庫包裝為 GStreamer#,因此使用 GStreamer# 也可以進行播放影片和音樂,最好的例子是 Banshee。
不過這只適用於 Linux。
藉著這個,於是就可以寫程式來控制 mplayer 來播放影片或是音樂。
你可以參考致遠管理學院資工系專題研究計畫研究成果報告計畫: Linux C# 設計 ...
你還可以使用 GStreamer#,Mono team 的人已經幫你將 gstreamer 函式庫包裝為 GStreamer#,因此使用 GStreamer# 也可以進行播放影片和音樂,最好的例子是 Banshee。
不過這只適用於 Linux。
August 1,2008
.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 的網站上很常見。
這一章介紹 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 的網站上很常見。
July 31,2008
MonoDevelop on Windows
Cygwin 要裝些什麼可以參考這篇:CodeProject 上的文章:Building Mono on Windows: the final battle.
不過 Mono 可以直接用官方提供的,不需要自己 build。
首先進 Cygwin shell,設定 PATH 與 PKG_CONFIG_PATH,讓 Cygwin 能找到 Mono:
再把 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 裡:
接著,MonoDevelop 就 build 成功了。不過,MonoDevelop 還是不能執行 :-( MonoDevelop.Core.Gui.Services 這邊會丟出例外。
不過 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 這邊會丟出例外。
July 3,2008
.NET framework essential Chapter 4
Chapter 3 主要是講各種語言的介紹與互相操作,大致都已經知道,沒什麼要紀錄的。
接著記 Chapter 4 的一些東西。
接著記 Chapter 4 的一些東西。
- 只要在 .config 裡面使用 bindingRedirect,就可以重新導向相依的assembly到新版本的assembly。.config 裡的 attribute:runtime / assemblyBinding / dependentAssembly
- Remoting object 的程式真的出乎意料地簡單,以前從沒研究過,有機會來試試效能,看看傳一堆物件或是 Dataset 的效能如何。
- 有一個 Attribute 的簡單範例...
- 支援 Transaction 的要件:
- 繼承 ServicedComponent
- 使用正確的 Transaction attribute
June 23,2008
.NET essential 第二章 CLR 筆記
主要是紀錄以前不知道或是看過沒深入了解的一些東西:
- Managed C++ 編譯出來的執行檔無法用mono執行,可能是因為 Native code 跟 IL code 放到一起的關係。
- 從 stack-based 的 value type 轉成 heap-based 的 reference type 的過程稱作 boxing,反之稱作 unboxing。
int i=1; object obj = i; // boxing int j = (int)obj; // unboxing
- 為了要讓各種語言能在 CLR 上執行,有 Common Language Specification 的 ECMA 標準 - Standard ECMA-335。
- NGen 可以預先將 IL code 轉為 Native executable code,省掉 JIT compiler 的工作(pre-JITting),因此可以加速。mono裡似乎是用
mono -O=all --aot your-assembly
來替代的樣子。