2007年03月28日

Encoding.GetEncoding("shift-jis")

   このエントリーをはてなブックマークに追加 Clip to Evernote
System.Text.Encoding.GetEncoding("shift_jis")

System.Text.Encoding.GetEncoding("shift-jis")
の違い

結果的には、この2つの呼び出しはまったく同じになるのですが、
前者の "shift_jis" は、IANAが定めるCharacter Set の名前で、後者の "shift-jis" は、そのAlias ということです。

レジストリの

HKEY_CLASSES_ROOT\MIME\Database\Charset

を覗いてみると、"shift-jis" から "shift_jis" が求められるのがわかります。

なお、IANAが定めている Aliasには、"MS_Kanji", "csShiftJIS" もあり、これらの名前も、GetEncodingの引数として利用できます。
  

Posted by gushwell at 22:58Comments(2)TrackBack(0)

2007年03月20日

Visual Studio Team Syste の単体テストで例外発生をテストする方法

   このエントリーをはてなブックマークに追加 Clip to Evernote
備忘:Visual Studio Team Syste の単体テストの例外発生をテストする方法

ExpectedExceptionAttribute をメソッドに付加することで、予測される例外がスローされるかどうかをテストできます。

わざわざ、例外をキャッチするコードを書く必要はありません。

 // InvalidOperationExceptionが発生すればテストOK
[TestMethod()]
[ExpectedException(typeof(InvalidOperationException))]
public void TestMethod() {
// この中で、InvalidOperationException 例外が発生することを確認
}


  
Posted by gushwell at 23:26Comments(0)TrackBack(0)

2007年03月19日

EBCDIC用の Encoding

   このエントリーをはてなブックマークに追加 Clip to Evernote
ASCIIコードをEBCDICコードに変換する必要があり、.NET Framework の Encodingクラスを調べていたら、なんだ、ちゃんと EBCDIC用の Encoder が用意されているではないですか。
良かった。

と思ったのはつかの間、IBM500, IBM037, IBM290 などたくさんのEncodingがあって、どれを使えばよいかわかりません。ためしに、以下のように、IBM500 と IBM290 を使ってみました。

byte[] buf = Encoding.GetEncoding("IBM290").GetBytes(str);

結果を比較したら、やっぱり値が違ってました。

IBM290は、「IBM EBCDIC (日本語カタカナ) 用」とのことですが、通常の EBCDIC の $ に位置に、\ が定義されてるみたい。
そのほか、~ コードも位置がずれています。$ と \ は、ある意味、とても論理的だと思うのですが、実際には、$は$と変換してほしいので、この変換は使えませんね。

うーーん、英数記号については、EBCDICは、共通だと思っていましたが、違うんですね。やはり、対象となる EBCDICが何なのかを調べるのが先みたいです。
  
Posted by gushwell at 22:43Comments(0)TrackBack(0)

2007年03月15日

C#のジェネリックメソッドの型推論

   このエントリーをはてなブックマークに追加 Clip to Evernote

 public T Foo<T>(int n) where T: new() {
T x = new T();
...
return x;
}

みたいなメソッドをC#で書いたら、FxCopで、

警告 1 CA1004 : Microsoft.Design : MyClass.Foo(Int32):T が、それへの呼び出し内で、明示的な型パラメータを必要としないデザインを考慮してください。

という警告が出た。ヘルプを読むと、引数にも T を入れろということらしい。

これは、どういうことかというと、
 public void Moge(T x, int n) {
...

}

というように、引数にも T がある場合、呼び出す際に、

obj.Moge<Sample>(sample, 5);


のように書く必要はなく、コンパイラが型推論を行ってくれるので、

obj.Moge(sample, 5);


のように、型パラメータを省略することができるということ。

でも、今回の僕のコードは、そもそも、引数には、T のインスタンスは不要なんだから、引数に T を入れるのは、ナンセンス。
ただ、この書き方は、推奨されないんだから、どうしようかなと考えたが、何のことはない、

 class MyClass<T> where T : new() {
..
public T Foo(int n) where T: new() {
T x = new T();
...
return x;
}
}


と、ジェネリッククラスにすれば良いだけだった。orz
このクラスには、ほかにもジェネリックメソッドがあったので、はじめから、ジェネリッククラスにすべきものだった。
FxCopは、設計上の見落としにも気が付くので、とても重宝している。  
Posted by gushwell at 23:33Comments(0)TrackBack(1)

2007年03月14日

Orcasでコードメトリックス

   このエントリーをはてなブックマークに追加 Clip to Evernote
The Visual Studio Code Analysis Team Blogの記事 Announcing Visual Studio Code Metrics!によれば、次期 Visual Studio Team System (Orcas)には、コードメトリックスの機能が付くらしい。

メトリックスの種類としては、Maintainability Index, Cyclomatic Complexity, Depth of Inheritance, Class Coupling , Lines of Code が計測できるようだ。

待ち遠しいですね。  
Posted by gushwell at 23:25Comments(0)TrackBack(0)

2007年03月13日

Enterprise Librry:Configuration ツールにアセンブリを認識させる

   このエントリーをはてなブックマークに追加 Clip to Evernote
Enterprise Libraryに独自のApplication Blockを追加する場合、Enterprise Library Configuration ツールに、自作のDLLを認識させる必要がある。

C#の場合、AssemblyInfo.cs に以下の記述が必要。

[assembly: ConfigurationDesignManager(typeof(PrelimHandlingConfigurationDesignManager))]

これをやらずに、なぜEnterprise Library Configuration ツールにメニュー項目が追加されないのか分からずに悩んだ。


構成ファイルから、さまざまな設定情報を読み込み、その設定内容によって動作が変わるフレームワークを作成する場合、この Enterprise Library の Configuration ツールで、構成情報を設定できるようになれば楽だな、と思って調査を開始したのだが、分からないことだらけで、かなり時間を費やしてしまった。

Application Block の形式にするのは、なかなか骨の折れる作業が必要だけれど、それなりのメリットは得られると思う。

  
Posted by gushwell at 23:29Comments(0)TrackBack(0)

2007年03月07日

Enterprise Library: カスタムトレースリスナー

   このエントリーをはてなブックマークに追加 Clip to Evernote
Enterprise Library のカスタムTraceListener をC#で、作成しようとしたのだが、残念ながら日本語のサイトでは見つけることができなかった。

googleで検索し、CodeGuru のサイトに、
Enterprise Library 2.0: The Logging Application Block

という記事があるのを見つける。うれしいことに、C#のサンプルコードもダウンロードできるようになっている。

なるほど、.NET Framework の TraceListenerあるいはその派生クラスを元に、クラスを定義し、属性
[ConfigurationElementType(typeof(CustomTraceListenerData))]

を付加すれば良いだけか。

もっとも簡単なのが、CustomTraceListenerから派生させる方法。

このとき、
void TraceData(TraceEventCache eventCache, string source, 
TraceEventType eventType, int id, object data)

をoverrideするのだが、最後の引数 object には、LogEntry のインスタンスが渡ってくるので、この情報を元に、ログ出力する処理を書けばよいことになる。

TraceDataメソッド内で、

string text = this.Formatter.Format(data as LogEntry);

とすれば、構成ファイルで指定した、Formatter が呼び出される仕組みに
なっている。

string text = (data as LogEntry).ToString();

とした場合は、TextFormatter の Formatメソッドが呼ばれることになる。

構成ファイルに付加的な情報をセットしておいて、TraceListener内で、それを利用することも可能なようだ。

ここまでわかれば、EnterpriseLibraryの該当するソースそのものを読むのもそれほど大変なことではないかな。
  
Posted by gushwell at 22:02Comments(0)TrackBack(0)

2007年03月05日

Enterprise Library: Logging Application Block

   このエントリーをはてなブックマークに追加 Clip to Evernote
Enterprise Library Logging Application Block を使ってみる。

C#で、ログ出力するには、以下のように書けばよい。

LogEntry log = new LogEntry();
log.Message = "エラーが発生したよ";
log.Severity = System.Diagnostics.TraceEventType.Error;
Logger.Write(log);

で、実際に、どこにこのログが出力されるかは、構成ファイルで設定することになる。
ここまでは、Webで調べてすぐにわかったのだが、Severity プロパティに設定した値によって、イベントログに吐き出したり、テキストログに吐き出したり切り分ける方法が、わからず悩んでしまった。

試行錯誤の結果、次のようにすればできることを確認。

例えば、
・Error 以上ならば、イベントログへ
・すべての情報を テキストファイルへ、
出力したい場合は、構成設定を以下のように設定すればよい。

Category Sources
General (SourceLevels : Error)
EventLog TraceListenerを設定する
Special Sources
All Events (SourceLevels : All)
FlatFile TraceListener を設定する。




  
Posted by gushwell at 21:45Comments(0)TrackBack(0)