2012年01月22日

n回処理を繰り返したい (2)

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

前回「n回処理を繰り返したい (1)」の続きです。

こういった繰り返し処理の時には、何回目の処理かを知りたい場合があります。
そんな時のために、もう一つ拡張メソッドを用意しましょう。


こすれば、次のようなコードが可能になります。


参考に、for文使ったコードも示します。


  
Posted by gushwell at 21:34Comments(0)TrackBack(0)拡張メソッド
 ----------

2012年01月19日

n回処理を繰り返したい (1)

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

C#で、n回処理を繰り返したときには、for文を使うのが一般的です。

例えば、こんな感じ。


しかし、いちいちfor文を書くのも面倒です。
n回繰り返しをもっと直感的に書けるように書いた拡張メソッドです。


このようなクラスを定義してしまえば、


と書く事ができます。
また、次のような記述も可能となります。


nの値を表示すれば、10が表示されます。
  
Posted by gushwell at 22:08Comments(0)TrackBack(0)拡張メソッド

2012年01月15日

書籍『今さら人に聞けないWord2010の常識』

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


森博之さん(Microsoft技術を中心とした、コンサルタント、開発支援、執筆、トレーニングを行っている)のご厚意で
献本いただいた本です。昨年秋にいただいたのですが、なかなか時間が取れず、ここで紹介できませんでした。
この本は、「Word 2010」の使い方を、初心者の方向けに、分かりやすく図解付きで解説している本です。

今さら人に聞けないWord2010の常識―初心者がつまずく盲点をインストラクターが伝授! (I・O BOOKS)


この本の良いところは、どのページから読みはじめても良い、というところでしょうか。
解説している内容はすべて「○○○するには?」というタイトルとなっており、やりたいことを目次で探して
そのページを開けば、すぐに目的の操作がわかるようになっています。
多くの項目は、1,2ページで説明されているのも良いですね。

私は、ほぼ毎日Wordを操作しているので、大抵の機能は知っているつもりでしたが、この本を読んで、
「おおっ、こんな機能があったんだ」「これは使ったことがなかったな」という発見がありましたので、

Wordは基本的な機能しか使ったことが無いという人にとっては、宝の山だと思います。

例えば、
「文字に読み仮名を(ルビ)を付けるには?」
「よく利用する書式設定をスタイルに記憶するには?」
「文章の途中で改行を挿入するには?」
「ページに透かし文字や背景を設定するには?」
「ファイル内の離れた場所を同時に表示するには?」
「図を任意の形状にトリミングするには?」
「葉書の宛名を作るには?」
「PDF形式で保存するには?」
「2つのファイルの差分を調べるには?」
など、あれっどうやるんだっけ?となる操作方法が簡単にわかるようになっています。

それと、最初の章に「ナビゲーション・ウィンドウ」の説明があったのには感心しました。
ある程度ページ数の多い文章を書くときには、この「ナビゲーション・ウィンドウ」がとても便利です。
  
Posted by gushwell at 21:48Comments(0)TrackBack(0)

2012年01月14日

メルマガ:C#プログラミングレッスン 読者数2100名

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

メールマガジン「C#プログラミングレッスン」の購読者数が 2100名となりました。\(^^)/

購読してくださっている方、どうもありがとうございます。


今年も頑張って発行していきたいと思います。



  
Posted by gushwell at 10:26Comments(0)TrackBack(0)メルマガ

2012年01月12日

リストのすべての要素に対しラムダ式を適用する

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

リストをデリゲートが返す値で埋め尽くす では、リストをデリゲート(ラムダ式)の値で初期化する拡張メソッドを
示しましたが、今度は、既にリスト内にセットされている値に対し、ラムダ式を適用し、
新たな値をセットする拡張メソッドを示します。


この拡張メソッドを利用したコードです。

ここでは、各要素を1.05倍しています。
105 210 315 420
がリストの新たな要素となります。

この例では、ラムダ式の第1引数を利用していませんが、この i には、
その要素のインデックス番号がわたるので、そのインデックス値を使って、
要素の値に対し、処理をすることもできます。

ジェネリックなメソッドにしているので、リストの要素が文字列であってもOKです。
まったく、意味のないコードですが、以下にその例を示します。


リストには、順に

 "SILVERLIGHT"
 "INDOWS"
 "OX"
 "ROSOFT"

が格納されます。
  
Posted by gushwell at 22:00Comments(0)TrackBack(0)拡張メソッド

2012年01月10日

リストをデリゲートが返す値で埋め尽くす

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

以前アップした「リストを指定した値で埋め尽くす」をちょっと工夫すれば、さらに汎用性の高い拡張メソッドが作れます。


こんな風に使います。


これで、0 2 4 6 8 10 12 14 16 18 と要素がセットされます。

  
Posted by gushwell at 20:58Comments(2)TrackBack(0)拡張メソッド

2012年01月05日

Webページアクセス数Top20

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

アクセス数Top10 で、当ブログの1年間のアクセス数Top10を紹介しましたが、
今度は、Webページ「Gushwell's C# Programming Page」のアクセス数Top20を紹介します。


1位. メールマガジン『C#プログラミングレッスン』書庫

2位. C#デザインパターン - FactoryMethod 

3.位 ヒルベルト曲線 

4.位 凸多角形の完全グラフ(一筆書き)

5位. [パズル]小町算

6位. 1次元セルオートマトン (ルール30) 

7位. C#デザインパターン - Command 

8位. 書籍『C#プログラミング入門』サポートページ 

9位. 階乗の計算(再帰処理)

10位. 簡易Tailコマンド

11位. シェルピンスキーのギャスケット (1次元セルオートマトン:ルール90) 

12位. ドラゴン曲線

13位. 部分和問題を動的計画法で解く 

14位. 円周率を10000桁まで求める 

15位. 2次元ランダムウォーク  

16位. 最小公倍数を求める

17位. 2次元配列の回転

18位. 素数の計算(エラトステネスのふるい)

19位. 最大公約数を求める (ユークリッドの互除法)

20位. 8クィーン・ゲーム

意外だったのは、「1次元セルオートマトン (ルール30)」のページが上位にあることですね。
学生さんが見てくれているのかな?

ちなみに、ワースト5は、以下の5つ。

1位. 2乗した数値が1-9で構成される数 (数学パズル)

2位. 小町リング 

3位. 覆銭問題 (Penny Flipping Problem)

4位. 割り切れる4桁の逆転数 (数学パズル)  

5位. リングナンバーの最大公約数

やはり、数学パズル系は、人気が今ひとつという感じです。
僕としては、この手の数学パズルは、プログラミングを学ぶ課題としてはちょうど良いと思っています。

  
Posted by gushwell at 22:53Comments(0)TrackBack(0)雑談

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)F#

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).NET Framework