2006年07月29日

C#プログラミングレッスン 読者数 900名突破

   このエントリーをはてなブックマークに追加 Clip to Evernote
2004年夏から、ほぼ毎週発行しているメールマガジン「C#プログラミングレッスン」の購読者数が、メルマとまぐまぐを合わせて、900名を突破しました。目標の1000名まで、あと100名となりました。
購読してくれている皆さん、どうもありがとうございます。

短い記事でも毎週書くのって結構大変です。時間があるときに書き溜めておくのですが、それでもすぐに書き溜めておいたストックが底をついてしまい、1週間穴をあけることも何回かありました。よく今まで続けられたと思います。
もうすぐ2周年ですし、たまには自分にご褒美をあげたいな。

今日の午前中に2回分を書きましたので、来週、再来週は間違いなく発行できると思います(笑)

はたして、いつまで続けられるのか...
  

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

2006年07月25日

C#でmemcpy

   このエントリーをはてなブックマークに追加 Clip to Evernote
C#で、C言語の memcpy のようなことはできないのかな、と調べていたが、残念ながらそのようなメソッドはないようだ。
まあ、当たり前か。

System.Buffer クラスには、BlockCopy というメソッドがあるが、これは、Array 限定なので、今回の僕の要求は満たさない。

  public static void BlockCopy (
Array src,
int srcOffset,
Array dst,
int dstOffset,
int count
)

しかたないので、
  unsafe private static void MemCopy(byte* dst, byte* src, int count) {
while ( count-- > 0 ) {
*dst++ = *src++;
}
}

のようなコードを C#で書いた。まさか、C#でこんなコードを書くとは思わなかった。
ポインタを使うコードを書くなんて、何年ぶりだろう。

もちろん、このコードは、unsafe でマーキングしておかなければコンパイルできない。
/unsafe コンパイラ オプションを指定する必要もある。

さらに、呼び出すときは、
 unsafe {
byte[] buffer = new byte[length];
fixed ( byte* dst = buffer, src = srcBuff ) {
MemCopy(dst, src, length);
}
}

のように、fixed キーワードで、再配置を防ぐ必要がある。
うーん、面倒だ。  
Posted by gushwell at 22:25Comments(6)TrackBack(0)

2006年07月24日

ネットワークキャプチャツール netcap

   このエントリーをはてなブックマークに追加 Clip to Evernote
Windows XP にも標準でネットワークキャプチャツールがついていたのですね。
でも、このツール、OSのCD-ROMからインストールする必要があります。

CDの \SUPPORT\TOOLS中 の SETUP.EXEを実行すると、「C:\Program Files\Support Tools」に各種ツール類がインストールされ、その中に、netcap.exeというネットワークキャプチャツールが入っています。

このツールは、コマンドラインツールなので、使うのはちょっと面倒ですが、

netcap /N:1 /B:30

N は、NICの番号
B は、バッファサイズ(MB)

のようにして起動すれば、キャプチャしてくれます。
なお、この出力ファイルは、Windows Serverに付属の ネットワーク・モニタなどで読み込めば、内容を表示することができます。
詳しい使い方は、「netcap xp」でググれば、いくつかページが見つかります。


  
Posted by gushwell at 22:51Comments(0)TrackBack(0)

2006年07月22日

connectionManagementセクションの maxconnectionオプション

   このエントリーをはてなブックマークに追加 Clip to Evernote
.NETでWebサービスを呼び出すアプリケーションを作成する場合に、デフォルトだと接続数が2に制限されているためにパフォーマンスが出ない場合がある。

そんなときは、config ファイルに、以下のような記述をするとよい。
<connectionManagement>
<add address="*" maxconnection="12"/>
</connectionManagement>

これで、同時接続数を増やすことができる。
なお、マイクロソフトは、CPUの数 * 12 を推奨している。
ただ、WindowsXPだと、OSで10に制限しているから、12にしても意味がないと思う。

僕は、クライアントから、大量の Webサービスを呼び出すプログラムを作成したときに、この設定を変更し、パフォーマンスを上げることができた。

なお、呼び出すWebサービスごとに接続数を設定することもできる
<connectionManagement>
<add address="WebServiceA" maxconnection="8">
<add address="WebServiceB" maxconnection="4">
</connectionManagement>


  
Posted by gushwell at 20:18Comments(0)TrackBack(0)

2006年07月20日

??演算子

   このエントリーをはてなブックマークに追加 Clip to Evernote
C#2.0で Nullable Type のために追加された ??演算子って、参照型にも使えたんだ。へー。

   string s = null;
Console.WriteLine( s ?? "<Empty String>");


  
Posted by gushwell at 20:11Comments(0)TrackBack(0)

2006年07月15日

C#のenumで型指定

   このエントリーをはてなブックマークに追加 Clip to Evernote
こんな記述 ( : short の部分 )ができたんだ。
知りませんでした。

    [FlagsAttribute] 
enum MyColor : short {
Black = 0,
Red = 1,
Green = 2,
Blue = 4
};
  
Posted by gushwell at 11:27Comments(0)TrackBack(0)

2006年07月13日

TableAdapter で Command のタイムアウトを設定するには

   このエントリーをはてなブックマークに追加 Clip to Evernote
 public partial class MyTableAdapter {
public int CommandTimeout {
get {
return ( this.CommandCollection[0].CommandTimeout );
}

set {
for ( int i = 0; i < this.CommandCollection.Length; i++ ) {
if ( ( this.CommandCollection[i] != null ) ) {
( (System.Data.SqlClient.SqlCommand)
( this.CommandCollection[i] ) ).CommandTimeout = value;
}
}
}
}
}

C#2.0の新機能である partial クラスを使い、CommandTimeout プロパティを新設すれば、外から Timeout を設定できる。
でも、TableAdapterの数だけ、コーディングしなければいけないのは、気に入らない。
良い方法がないかな。

ちなみに、ネットのあるページでは、CommandCollection ではなく、_commandCollection を使っているものがあったが、これだと、null参照する場合があるので、ダメ。

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

2006年07月08日

ApplicationException クラス

   このエントリーをはてなブックマークに追加 Clip to Evernote
MSDNライブラリをながめていたら、こんな記述を見つけた。

ほとんどのアプリケーションでは、Exception クラスからカスタム例外を派生します。本来、カスタム例外は ApplicationException クラスから派生しなければならないと考えられていましたが、実際には、このことで大きな価値が付加されたことはないようです。

ドキュメントにこういうことを書くのも珍しいな。
でも、自己否定できるから、より良い解に近づくことが出来るんだろうな。


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