2010年03月17日

ApplicationSettingsBaseクラス

構成設定ファイルを扱う場合に、ApplicationSettingsBaseクラスって、とても良くできたクラスだと思うんだけど、
UserScopedSettingAttribute ではなく、ApplicationScopedSettingAttribute を付加した場合って、書き込みが出来ないんですね。

ApplicationScoped でも、設定ファイルに書き込みがしたいって要求はないのかな?
LocalFileSettingsProvider ではなく、自分で新たなプロバイダを書けばいいのだけれど、結構面倒そうだ。

それと、バージョン番号が違うと別のフォルダに保存してしまうという動作を変更できないのは、どうなんだろう
Upgradeメソッドがあるから、大抵は別フォルダにあっても問題ないのだろうけど、自分でバージョンコントロールを行いたいときにそれを変更する手段が無いのは困る。
こちらは、独自プロバイダーを書いても対応できないようだ。

それと、保存先を決定するバージョンが、アセンブリのバージョンっていうのも戸惑った。
ApplicationScoped の項目だけレジストリに書くような拡張をしようと思って、壁に突き当たった。
だって、Application.CommonAppDataRegistryで採用しているバージョンはProductVersionなんだもの...

結局、ApplicationSettingsBaseから派生させるのではなく、 ConfigurationSection から独自のSectionクラスを派生させて、 ConfigurationManager をラップした独自のApplicationSettingsクラスを 書いたほうが良さそうな気がしてきた。
  
Posted by gushwell at 23:27Comments(0)TrackBack(0).NET Framework

2010年03月14日

C#で8クィーンゲームを作成 (あなたは勝てますか?)

Gushwell C# Programming Pageに、「8クィーン・ゲーム」を掲載しました。
Silverlightで実際に対戦できるようにしています。

8×8のチェス盤に2人で交互にクィーンを置いていき、自分の手番のときに置き場所が無いほうが負けというゲームです。
なお、すでに置かれているクィーン(自分が置いたものも含め)の利き筋に新しいクィーンを置くことはできません。
いわゆる8クィーンパズルのゲーム版というところです。


※ボタンをクリックするとゲームが始まります。

この手の思考ゲームの基本の基本だけでプログラムが書けるので、学習用としては、なかなか良い題材だと思います。
ソースコードはこちらで掲載しています。  
Posted by gushwell at 22:54Comments(0)TrackBack(0)Silverlight

2010年03月10日

引数なし Enumerable.Any メソッド

Enumerable.Any メソッドって、シーケンスの任意の要素が条件を満たしているかどうかを
判断する機能としてしか使っていなかったけど、引数が無いAnyメソッドってあったんですね。
要素の有無を調べることができます。
見落としていました。

int[] array1 = new int[] { 1,2,3 };
int[] array2 = new int[] { };
Console.WriteLine(array1.Any());
Console.WriteLine(array2.Any());

で、

True
False

が表示されます。
  
Posted by gushwell at 23:07Comments(0)TrackBack(0)LINQ

2010年03月07日

C#4.0 : dynamicを使いジェネリックスで加算減算をする

メールマガジン「C#プログラミングレッスン」No243では、 どう書くorgで出されているお題「隣り合う二項の差」のコードを示しました。
その以下に示します。


このメソッドは引数に、 int[], List<int>などは受け取れますが、double[], List<long>などは 受け取れません。


というジェネリックメソッドにしたとしても、


で、減算ができないため、コンパイルエラーになってしまいます。 このエラーを取るには、C#3.0では、力づくで場合分けするなどする必要があります。
参考URL:http://gushwell.ldblog.jp/archives/51533037.html

しかし、C#4.0ななると、dynamic型が導入されるので、 以下のように、書くことができます。


この機能があることで、ジェネリックの応用範囲がさらに広げられそうです。
  
Posted by gushwell at 21:10Comments(2)TrackBack(0)C#4.0

2010年03月04日

僕も「ループを使わずに配列の順序を逆にする」を書いてみた

元ネタ:ホワイトボードプログラミング

僕も再帰を使ったReverseを書いてみた。
題意とちょっと違うかもしれないけど、許してもらおう。
ちゃんとテストしてないけど、だぶん動くと思う。


最後の行のところが、ちょっとぐちゃぐちゃした感じだけど、もうちょっとすっきり書けないのかなー。

追記:ちょと書きなおしてみた。
  
Posted by gushwell at 21:58Comments(0)TrackBack(1)アルゴリズム

2010年02月28日

Silverlight : Despatcher.BeginInvokeメソッド

SilverlightにはControl.Invokeがありません。
代わりにDependencyObject.Dispatcher プロパティを経由して、BeginInvokeメソッドを呼び出します。
BeginInvokeは、2つのoverloadメソッドがありますが、 通常は、Actionデリゲートを受け取るメソッドを使えばよいと思います。


もうひとつの BeginInvokeの書き方


  
Posted by gushwell at 23:52Comments(0)TrackBack(0)Silverlight

2010年02月24日

Clipboard.GetData(DataFormats.Html)で文字化け

クリップボードからHTMLを取得しようと、以下のようなコードを書いたら、 日本語部分が文字化けしてしまいました。


文字化けを防ぐには、次のように、MemoryStream経由して Encodingの指定をしてHTML を取得する必要があります。


でも、


とか


だとダメです。MemoryStreamに変換できません。
これってバグですか?   
Posted by gushwell at 23:28Comments(0)TrackBack(0).NET Framework

2010年02月21日

番兵というテクニック

昨日、プログラム小品集に「最大面積の領域を求める」プログラムを載せましたが、 そこで、プログラミングテクニックの一つである番兵を使っています。
というか、以前このブログでも書いた、共通クラスであるBoardクラスで、 実際のボードの周りに番兵用のデータを置いています。
これのおかげで、


と書かなくてはいけないところで、


と書くことができます。
ちょっと違いが分かりにくいですが、Rangeメソッドの第2引数が違っています。
番兵が無いと、配列の範囲を超えないようにインデックスをインクリメント していく必要があります。
しかし、番兵があるおかげで、インデックスの範囲オーバーを気にせずに、 「黒石が続くあいだだけ繰り返す」という処理を書くことができます。

最近「番兵」という言葉を聞くこ/見ることがほとんどないので、ここにアップします。  
Posted by gushwell at 23:53Comments(0)TrackBack(1)アルゴリズム

2010年02月18日

Sleipnirで「MSDN検索」エクステンション

エバンジェリストのこだかさんのページで、MSDN検索(アクセラレーター)の紹介がありましたが、僕は、普段、Sleipnir使っているので、Sleipnirでも同様のものを作成してみました。
といっても、Webにあるコードをコピってきて一部を書き換えただけですが。

大まかな手順は、
1.UserAction Extension をインストール
2.検索スクリプトの記述
3.スクリプトをSleipnirに組み込む

です。
以下が、具体的な手順です。

■ 1.UserAction Extension をインストール
http://www.fenrir.co.jp/sleipnir/plugins/extension.html から、UserAction Extension をインストール


■2.検索スクリプトの記述
以下のスクリプトを "D:\Program Files\Fenrir & Co\Sleipnir\plugins\scripts\SearchMsdn.js" に保存。ファイル名が、アクション名になる。



■ 3.スクリプトをSleipnirに組み込む
(1)Sleipnir を起動し、 [ツール]、[Sleipnir オプション] でオプションダイアログを開く
(2)[クライアント] [全般] で、 "スクリプトによるクライアントの操作を許可する" をチェックする。
(3)[ユーザインターフェース] [メニューエディタ] を選択
(4)メニュー一覧から、SmartSearch を選択
(5)追加ボタンを押し、メニュー項目の追加を選択
(6)メニューエディタで、
  名前:MSDNから検索
  アクション:SearchMsdn
 とし、ボタンを押し、登録する。
(7)メニューの表示位置は、右側の項目一覧で、D&Dで変更する。

■使い方

Sleipnirのブラウザ画面で、検索したい単語を選択する。
SmartMenuアイコンが表示されるので、それをクリックする。
ポップアップメニューに 「MSDNから検索」メニューが表示される。
メニュー項目を選択すると、MSDNからの検索結果が表示される。

■補足
オプションダイアログのメニューエディタで、「ブラウザ テキスト選択」に、 SearchMsdn を追加すれば、右クリックでも MSDNの検索ができます。
でも、メニュー表示名は、日本語にはならず、「SearchMsdn」となります。
"C:\Users\\AppData\Roaming\Fenrir & Co\Sleipnir\setting\Override\BrwsCtxtMenuTxtAddPopup.xml"
を書き換えれば、日本語表示になります。
  
Posted by gushwell at 23:07Comments(0)TrackBack(0)software

2010年02月16日

RealProxyでthis経由のメソッド呼び出しはフックできない

System.Runtime.Remoting.Proxies.RealProxyを使うと、メソッドの呼び出しをフックできるんですが、 あくまでも透過プロキシ経由で呼び出した場合に限られます。
なので、Privateメソッドは、フックできないんですね。
当然、publicメソッドであっても、自分自身のクラスから呼ばれた場合は、 フックできません。
冷静になって考えれば当たり前なのですが、以前、これで嵌まりました。
思いだしたので書いておきます。

  
Posted by gushwell at 22:16Comments(0)TrackBack(0).NET Framework