2011年12月29日

アクセス数Top10

   このエントリーをはてなブックマークに追加 Clip to Evernote
今年1年間を通じた、このブログの個別記事へのアクセス数Top10です。
ほとんどが、古い記事ばかりで、今年書いた記事は1つだけ。
今となっては、どうなの?って言う内容もあります。
「enumの代わり」については、僕の書籍「C#プログラミング入門」には、属性を使った別の方法を紹介しています。


1. 自分自身のクラス名とメソッド名   

2. Control.Invokeの書き方  

3. enumの代わり 

4. 制約を有効にできませんでした。行に入力できるのは、Null 以外の値...

5. MVVM:Messengerを理解するために自作してみた(1)

6. マニフェストファイルで管理者権限を付与

7. SQLCMD で 「SQL Server への接続を開けませんでした」

8. Generic Host Process for Win32 Services のエラー

9. 配列の比較

10. C#の構造体をbyte配列に


これが、今年最後のブログ記事です。1年間、当ブログをご覧になっていただいきありがとうございました。
それでは、良いお年を!  

Posted by gushwell at 19:32Comments(0)TrackBack(0)

2011年12月26日

F#初心者による in キーワドの考察

   このエントリーをはてなブックマークに追加 Clip to Evernote
このエントリは、F# Advent Calendar 2011のボーナスステージへの参加記事です。



実は、この記事は、僕のF#専用ブログGushwell's F# Programming Diaryに掲載したものです。
しかし、このブログがアクセス不可状態になってしまったため、今までアップした記事が
すべて閲覧できなくなってしまいました。なんとか、CD-Rへバックアップしたものから、
いくつかの記事の下書きを見つけることができましたので、今回アップするこの記事も、
その下書きをもとに、再度清書し直したものです。

この記事は、僕がF#を学び始めて疑問に思った in についての考察であり、
これからF#学ぼうと思っている方には、それなりに有用な内容になっているのではと勝手に思ってます。

では、本題に入りましょう。


以下のコードを見て下さい。


僕がF#の勉強を始めたころには、この in の意味が全く分かりませんでした。
なので、これからF#を学ぶ人のために、ここで、in キーワードについて
考えてみたいと思います。

さて、上のF#のコードですが、これは、

printfn "%A" x の中だけで、x を使いますよ、その Xは 1 に束縛されていますよ。

という意味になります。

では、


はどうでしょうか。これは、abs関数が値を持つので、


と警告が出てしまいます。
F#では、原則として式の値を捨て去ることができないことを思い出しましょう。

一方、最初に示したコードでは、printfn は、unit型なので、値はありません。
だから最初のコードは問題ありません。

abs を使ったコードに話を戻すと、値を捨て去らないように、
absの返す値を何らかの変数に束縛するなどのコードが必要となります。
そこで、


とzに代入(束縛)するようにしないといけません。
例えば、このコードに続けて、


とzを参照するコードを書くわけですね。書くまでもないが、10 が表示されます。
では、次のコードはどうでしょうか。


このコードの場合、y は、1行目だけの局所変数になっているので、3行目でコンパイルエラーになります。

次のようなコードの場合は、問題ありません。ただしくコンパイルができます。


これから分かることは、in の右側が主であり、in の左側が従だということです。
僕は、let で始まるんだから、y = 10 が主処理であるという感覚から抜け切れなかったため、
in が理解できなかったようです。

では、関数定義を使ったときの in について調べてみます。

まずは、一番簡単な例。


かなり、無理やり感は、否めないけど...
この原型は、


であり、2を局所変数 x に束縛させた例です。つまり、


と同じです。
もう少し、まともな例を書いてみます。


これは、局所[変数]ではなく、局所[関数]を使っていますが、考え方は同じです。
骨格は、


なのですが、このadd関数を局所関数として定義しているということになります。

それでは、僕が、in について調べてみようと思った発端となったコードを見てみます。


いきなりこのコードをみて、inが何を意味しているのかを理解するのは、F#初心者には
結構難しいじゃないかと思います。
少なくとも僕は、理解できませんでした。
しかし、ここまで順に説明を読んできた方には、理解できるんじゃないでしょうか?


が、この式の骨格であり、
引数2つのSumTotal関数は、引数1つのSumTotalの[中]でのみ利用できる局所関数として、
定義しているということです。

これが僕のたどり着いた in の意味です。

なお、ここまで書いておいてなんですが、実際のF#では、複数行に分けた場合、in は
省略できますので、上のコードは、以下のコードと同じです。


それでは最後に、前述した dbl 関数の定義について in を使わないコードに
書きなおしてみます。


これならば、何も悩む必要はないですね。

つまり、ワンライナーを使わなければ、in は不要ということです。
僕は、ワンライナー嫌いなので(単に理解できる頭が無いというだけ?)、
in を使うことは無いと思いますが、
他の人の書いたコードを読む場合は、この in の知識が役に立つと思われます。

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

2011年12月17日

アセンブリを動的にロードし、そして完全にアンロードする

   このエントリーをはてなブックマークに追加 Clip to Evernote
このエントリは、C# Advent Calendar jp 2011 への参加記事です。



アセンブリを動的にロードし、利用し終わったらメモリからアンロードしたいという要求って、どれくらいあるのか
わかりませんが、今回は、そのやり方を説明します。

これって簡単なようでなかなか面倒です。残念ながら、Assembly クラスには、Load系のメソッドはありますが、
Unload系のメソッドがありません。

こんな時に AppDomainを使うと、要求を満たすことができます。

まずは、以下のようなクラスが、SampleLibraryアセンブリに定義されていたとします。


この SampleClassがあるSampleLibraryをロードし、SampleClass.Executeを呼び出し、
終わったら、アセンブリをアンロードする例を考えてみましょう。

簡単に説明すると、以下の手順を踏みます。

1. 新しくアプリケーションドメインを作成する。

2. そのアプリケーションドメイン内にプロキシ―クラスをロードする

3. プロキシ―クラス内で、目的のアセンブリ(SampleLibrary.dll)をロードする。

4. ロードしたアセンブリの機能 (SampleClass.Execute)をプロキシ―経由で呼び出し処理をする。

5. アセンブリがロードされたアプリケーションドメインをアンロードする。

では、順に見ていきましょう。

1. 新しくアプリケーションドメインを作成する。

ここでは、”SampleDomain" という名前のアプリケーションドメインを作成することとしましょう。
コードを示します。



2. そのアプリケーションドメイン内にプロキシ―クラスをロードする

次に、このアプリケーションドメインにプロキシ―クラスをロードします。
このProxyクラスは、実行されているアセンブリと同じアセンブリに存在するものとします。
Proxyクラスのコードは、後述します。

ここで重要なことは、AppDomain のCreate系のメソッドを利用し、直接、SampleClass のインスタンスを
作成してしまうと、ロードされるSampleLibrary アセンブリは、デフォルトアプリケーションドメインと
"SampleDomain" アプリケーションドメインの両方にロードされてしまうということです。

そのため、appDomain をアンロードしても、SampleLibrary をアンロードすることができません。

まずは、"プロキシークラス" をロードし、そのプロキシークラスの中で、型情報の取得対象である
目的のアセンブリをロードする必要があります。


このコードは、現在実行されているアセンブリ(Assembly.GetExecutingAssembly())に定義されて
いるProxyクラス(type.FullName)のインスタンスを生成するというコードになります。
これで、Proxyクラスのインスタンスが、SampleDomain アップドメイン内に作成されます。


3. プロキシ―クラス内で、目的のアセンブリ(SampleLibrary.dll)をロードする。

プロキシ―クラスは以下のように記述します。


この時、"プロキシークラス" は、MarshalByRefObject を継承する必要があります。

また、"プロキシークラス" とやり取りするパラメータは、

MarshalByRefObject で継承

[Serializable] 属性の付与

のどちらかを満たさなくてはなりません。今回のパラメータは、System.Stringなので、
[SerializableAttribute] が付与されています。


4. ロードしたアセンブリの機能 (SampleClass.Execute)をプロキシ―経由で呼び出し処理をする。

次に示すコードで、Proxyオブジェクト経由で、SampleClass.Execute メソッドを呼び出します。



5. アセンブリがロードされたアプリケーションドメインをアンロードする。

次のコードでアプリケーションドメインをアンロードします。


これで、アプリケーションドメインと一緒に、動的にロードしたアセンブリもアンロードされるこ
とになります。



それでは、Proxyクラスを経由して、ロード、呼び出し、アンロードする一連のコード例を示します。


例えば、上記コードを WindowsFormsのボタンクリックで実行するとします。
この場合、ボタンクリックの処理が終わると、SampleLibrary.dll をエクスプローラーから
削除することができます。

一方、AppDomain.CreateInstanceAndUnwrap で直接 SampleClassのインスタンスを生成する以下の
ようなコードでは、ボタンクリックの処理が終わっても、SampleLibrary.dll が使用中になり、
エクスプロ―ラーから削除することができません。


  注意:
   このコードを実行するには、SampleClassは、MarshalByRefObject を継承するか、
    [Serializable] 属性の付与する必要があります。

上記のソースコード上は、AppDomainの配下に、SampleLibrary.SampleClass をロードしている
ように見えますし、dynamicを使い、SampleClassはソースコード上には現れないようにしていいます。
しかし上記コードを実行するには、SampleClassの情報が必要なので、このコードが実行されるデフォ
ルトのアップドメインにも、SampleLibrary.SampleClass がロードされてしまいます。
そのため、生成した AppDomainをアンロードしても、SampleLibrary.SampleClassは残ってしまうという
ことです。

これを確かめるには、AppDomain.Unload(appDomain); を実行後に、


とDLLを削除するコードを追加します。すると、アクセスが拒否されて削除することはできないことが
確認できます。

一方、正しくアンロードできるコードでは、DLLファイルを削除することが可能です。




最後に、もう一つのやり方を示します。

それは、プロキシ―クラスを作成するのではなく、インターフェースを使う方法です。
この方法は、ロードしたいアセンブリのソース(今回の例では、SampleClass)に手を加えることが
できないと使えません。
つまり、他から購入したライブラリなどをアンロードしたいときには利用できないということです。

では、そのやり方を示します。
まず、新たなクラスライブラリ・プロジェクトを作成し、


というインターフェースを定義します。
次に、SampleClassを以下のように変更します。
この場合は、MarshalByRefObject から継承させる必要があります。


そして、これを呼び出す側は、


と ISampleインターフェース経由で Execute メソッドを呼び出すようにすれば、このアップドメイン
には、SampleLibraryは読み込まれないので、ロードしたアセンブリをアンロードすることができます。



実はこの記事の下書きはずいぶん前に出来上がっていたものです。なかなか完成までこぎ着けることが
できずに、そのまま放置していたのですが、C# Advent Calendar 2011 へ参加するために、公開できる
レベルになんとかしました。ですから、内容的に古い情報が含まれているかもしれません。
そういった箇所があればコメントしていただければと思います。

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

2011年12月08日

リストを指定した値で埋め尽くす

   このエントリーをはてなブックマークに追加 Clip to Evernote
タイトルの通りです。
リストを指定した値で埋め尽くす拡張メソッドを書いてみました。


以下のように使えます。


引数countの無いバージョンを書けば、確保されている要素数すべてを
同じ値で埋め尽くすメソッドも作れますね。
  
Posted by gushwell at 23:30Comments(0)TrackBack(0)

2011年12月05日

Silverlightアプリをブログ上で動かす

   このエントリーをはてなブックマークに追加 Clip to Evernote
このエントリは、Silverlight Advent Calendar 2011への参加記事です。

ウェブサイトでは、比較的簡単にSilverlightアプリをホストすることが可能ですが、
ブログだと、画像以外をアップロードできなかったりして、Silverlightアプリをホストすることができない場合が
多いと思います。

しかし、せっかくだから、ブログでSilverlightアプリをホストしたいわけです。
僕はブログとウェブサイトの両方を運営していますが、圧倒的にブログの方が訪れる人の数が
多いですから余計にそう思います。
せっかく作ったSilverlightアプリを、以下のようにブログのページ上でも動かすことができれば、
それだけ、多くの人に見てもらえるというわけです。

Startボタンを押せば、プログラムが動き出します。



このプログラムは、以前「凸多角形の完全グラフ(一筆書き) 」で紹介したものです。
以前にも、このブログで載せています。


僕がやっている方法は、Webサイトにアップしたxapファイルを
ブログサイトから参照することで、ブログのページ上でSilverlightアプリを動かすというものです。

他の人に役に立つ情報かどうかはわかりませんが、 その方法を簡単にに示します。


まず、ウェブサイトにSilverlightアプリを配置します。
実際に配置するのは、
htmlファイル、silverlight.jsファイル、そして、ClientBinフォルダの下にあるxapファイルの3つです。
htmlファイルは、Visual StudioがSilverlightのプロジェクトを作成する時に、自動的に生成するホスト用のhtml ファイルです。

なお、このhtmlファイルの先頭近くにある body { } のスタイル指定は、以下のように、overflow指定を
追加しておきます。こうすることで、Silverlightをホストした部分でスクロールバーが出なくなります。



xapファイルは、デフォルトのまま、ClientBinフォルダの配下に配置します。
こんな感じです。


ちなみに、僕は、忍者ホームページというサービスを利用しています。
無料プランと有料プランがありますが、無料プランでも500MBのディスク容量がありますから、通常の利用なら
ばまったく問題ないと思います。

次にやることは、このSampleApp.html をウェブサイトの別のページからリンクを貼り辿れるようにすることです。
これは省略します。

最後に、ブログページに上記のSampleApp.html を埋め込みます。
記述するhtmlは、以下のような感じです。


もちろん、Webサイトの方でも、Topページから、リンクをたどっていくことで、
そのSilverlightアプリのページにたどり着けるようにしています。
大抵のWebサイトのサービスでは、そういった約束事があるので、どこからもリンクされていない
ファイルを、他のドメインのページからリンクさせることはやらないほうが良いと思われます。
ただ、結構面倒なので、最近はこの手法は使わないで、単にブログからウェブページへのリンクを
貼るだけのこともあります。

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

2011年12月04日

Advent Calendar 2011 はじまりましたね。

   このエントリーをはてなブックマークに追加 Clip to Evernote
今年も、技術系Advent Calendar が始まりましたね。
Advent Calendar は、12月1日から25日までの間,ある話題について順番に自分のblogにて記事を書くというものです。
参加する皆さんは、普段のブログ記事よりも、「特別」という意識があるようで、
例年力作ぞろいという感じがします。

僕は、以下の3つに参加する予定です。

C# Advent Calendar 2011

F# Advent Calendar 2011

Silverlight Advent Calendar 2011


F# Advent Calendar は定員オーバーということで、僕は、26日に記事を書きます。

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