2006年12月25日

IME 2007のエラーが解消した

   このエントリーをはてなブックマークに追加 Clip to Evernote
Office2007をインストールしたときから、IME2007のエラーで悩まされてきたのだが、なぜか、エラーがでなくなった。

ちなみに、出ていたエラーは、
OS起動時、しばらくしてから、「IMJPCMNT.EXE のアプリケーションエラー」が1、2回。シャットダウン時に、「IMJPCMMP Main Window が応答なし」の2つです。

なぜ、直ったのかさっぱりわからない。

でも、誤変換も多くなったし、IMEの動作ももたつくので、IME2003に戻そうかと思っている。

  

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

2006年12月21日

ConfigurationProperty属性のDefaultValue の動作が変

   このエントリーをはてなブックマークに追加 Clip to Evernote
あるフォーラムにも書いたのですが、自分のブログにも書いておきます。

独自の構成セクションをC#で書いているときに、とても悩みました。
書いたのは、次のようなコード。

public class PrelimConfigElement : ConfigurationElement {
const string cJocCode = "jobCode";
[ConfigurationProperty(cJocCode, DefaultValue = "unknown", IsRequired = true, IsKey = true)]
[StringValidator(InvalidCharacters = "~!@#$%^&*()[]{}/;'\"|\\", MinLength = 1, MaxLength = 10)]
public string JobCode {
get { return (String)this[cJocCode]; }
}
...
}


このコードにおいて、「 DefaultValue = "unknown"」の記述がないと、

System.Configuration.ConfigurationErrorsException: プロパティ 'jobCode' の値が無効です。エラー: 文字列の長さは 1 文字以上でなければなりません。

という例外が発生します。

僕の感覚だと、 IsRequired = true と指定しているのだから、 DefaultValue の指定は不要だと思うんです。
でも、DefaultValueの設定がないとエラーになります。

もちろん、構成ファイルでは、1文字以上の文字列を書いています。

まさか、DefaultValueの設定が必要だとは思わなかったので、時間を無駄に潰してしまいました。
限りなくバグに近い動きだと思います。


  
Posted by gushwell at 22:47Comments(4)TrackBack(0)

2006年12月19日

IDisposable を実装している型からの継承

   このエントリーをはてなブックマークに追加 Clip to Evernote
C#で、IDisposable を実装する型から継承している型で何らかのリソースを解放しなければならない場合は、以下のようなコードを書きます。

public class DelivedType : DisposableType  {
private bool disposed;
protected override void Dispose(bool disposing) {
try {
if ( !this.disposed ) {
if ( disposing ) {
// ここでマネージドリソースのリリース処理
}
// ここで、アンマネージドリソースのリリース処理
}
disposed = true;
} finally {
base.Dispose(disposing);
}
}
}

try-finally で、確実に base.Dispose(disposing); を呼び出すのがポイント。
なお、この派生した型では、Dispose() や、Finalize() の実装は不要です。  
Posted by gushwell at 22:37Comments(5)TrackBack(0)

2006年12月18日

AppDomain

   このエントリーをはてなブックマークに追加 Clip to Evernote
アプリケーション ドメインとは、プロセスとスレッドのちょうど中間に位置し、プロセス内に作成される分離された環境です。これにより、一つのプロセス内で複数の「アプリケーション」を動作させることが可能になります。
プロセス内で、複数のスレッドを動作させた場合、一つのスレッドでエラーが発生すると、プロセス全体に悪影響を及ぼす危険があります。
一方、複数のプロセスを起動した場合、堅牢性は確保ででますが、パフォーマンスが犠牲になります。また、複数のプロセス間でのデータのやり取りも煩雑になり、プログラミングが難しくなります。
.NET で導入されたアプリケーションドメインを使うことで、パフォーマンスを犠牲にすることなく、堅牢性を確保することができます。
また、64Bit OSで動作させれば、1プロセス2GBという制限がなくなるため、一つのプロセス内で、たくさんのアプリケーションを動作させることが可能になります。


.NETでアプリケーションドメインを利用するには、AppDomainクラスを使います。
利用方法を、以下に示します。

// AppDomainの作成
AppDomain domain = AppDomain.CreateDomain("AnotherDomain");

// 利用するインスタンスの作成
ObjectHandle obj = domain.CreateInstance("AnotherAssembly",
                "Gushwells.MyType");
MyType testObj = (MyType)obj.Unwrap();

// インスタンスの機能の呼び出し
string s = testObj.Hello();

// アンロード
AppDomain.Unload(domain);

この例は、同期呼び出しの例になります。スレッドと同様に、並行動作させるには、呼び出された子ドメイン側で、スレッドを起動する必要があります。
  
Posted by gushwell at 22:21Comments(4)TrackBack(0)

2006年12月13日

Traceから TraceSourceへ

   このエントリーをはてなブックマークに追加 Clip to Evernote
C#でカスタムのTraceListnerを書いているときに、MSDN ライブラリをうろついていたら、TraceSource なるクラスがあるのを知る。

TraceSourceは、Traceクラスとちがって、インスタンスを生成して利用するように なっている。
ちょっと触った感じでは、構成ファイルの書き方や、メソッドの呼び出し方などちょっと、とっつきにくい感があるが、より細かな制御ができそうだ。
TraceSource.TraceDataメソッドは、ほぼ、僕のやりたかったことを満たしてくれる。

構成ファイルでFilter設定をすれば、以下のように、TraceEventType列挙体の値を変えることで、どのTraceListenerを使うのかを 指定できるのはGood。
 TraceSource tr;
...
tr.TraceData(TraceEventType.Verbose, 0, message);
tr.TraceData(TraceEventType.Information, 1, message);
tr.TraceData(TraceEventType.Warning, 10, message);
tr.TraceData(TraceEventType.Error, 100, message);
tr.TraceData(TraceEventType.Critical, 1000, message);

詳しく書いている時間がないので、参考となる URLをここに示しておく。


ladybug 氏のブログの記事「Trace から TraceSource へ

どなたか不明「.NET FramworkのロギングAPI
  
Posted by gushwell at 21:23Comments(0)TrackBack(0)

2006年12月12日

Gushwellの 2006年「よかった探しリース」

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

このページは結城浩さん主催の「よかった探しリース」に参加しています。

左手    ←   Gushwell   →   右手

2006年のよかったこと

・発行しているメルマガの読者が1000名超えたこと。
・昨年に引き続きMSMVPのアワードを受賞したこと。
・ノートPCを購入したこと。
・mixiで新しい出会いがあったこと。
・Blogを継続できたこと。
・体脂肪がすこし減ったこと。
・若い子たちとバスケができたこと。
・今年も沢山の本を読めたこと。
・なんとか健康で過ごせたこと。
・よかった探しリソースに参加できたこと。
  
Posted by gushwell at 21:40Comments(3)TrackBack(0)

2006年12月11日

Microsoft Office Live

   このエントリーをはてなブックマークに追加 Clip to Evernote
MS、Office Live 日本語版の無償サービスを開始
だそうです。
「自社ドメイン(.com、.net、.org)の登録および維持」が無料ってのはすごいですね。
「お手元の Microsoft Office 製品と連携して、さらに使いやすく」とは、どういう意味なのかな?

ちなみに、まだ、サービスは開始されていないようです。

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

2006年12月10日

MessageQueueのバグ?

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

 MessageQueue mq = new MessageQueue(QueueName);
mq.Formatter = new XmlMessageFormatter( new Type[] { typeof(System.String) });
mq.ReceiveCompleted += new ReceiveCompletedEventHandler(mq_ReceiveCompleted);
mq.BeginReceive(TimeSpan.FromSeconds(10.0));


...
void mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e) {
IAsyncResult isr = e.AsyncResult;
if (isr.IsCompleted == false) {
// タイムアウトならここに来るはず
}
System.Messaging.Message msg = queue.EndReceive(e.AsyncResult);
...
}

マニュアルには、
このオーバーロードでタイムアウトを指定します。timeout パラメータで指定した間隔が経過すると、このコンポーネントは ReceiveCompleted イベントを発生させますが、操作に関連付けられた IAsyncResult の IsCompleted プロパティは false になります。メッセージが存在しないため、後続の EndReceive 呼び出しでは例外がスローされます。

と書いてあるけど、 タイムアウトになっても、IsCompleted プロパティは true のままみたいだ。

しかたないので、EndReceive で発生する例外をキャッチすることにした。  
Posted by gushwell at 15:24Comments(0)TrackBack(0)