【本】Windowsダンプの極意
- 2012.11.23 Friday
- 21:50
評価:
上原 祥市 アスキー・メディアワークス ¥ 3,780 (2008-11-27) |
違う世界が見えるに違いないと思い、今週から読み始めました。
買ったのはずいぶん前だったのに、山積みの山の一部となっていました・・・(汗)
評価:
上原 祥市 アスキー・メディアワークス ¥ 3,780 (2008-11-27) |
コード生成と T4 テキスト テンプレート
http://msdn.microsoft.com/ja-jp/library/vstudio/bb126445.aspx
DBのテーブル群のスキームを読み込んでクラスファイルを生成するコードをStringBuilderを使って作ってみたが、T4を使えばもっと楽にできたのではないかと思ったので、ちょっと勉強してみようかなと思い、上記のURLをメモしておきます。
アプリ ページのレイアウト (JavaScript と HTML を使った Metro スタイル アプリ)
http://msdn.microsoft.com/ja-jp/library/windows/apps/hh872191.aspx
WEBデザインの世界ではメジャーと言われているグリッドシステム。マイクロソフトのサイトにもModern UIのデザイン設計として紹介されています。まったく分かっていないので説明になってなくてすみません。
マイクロソフト コンファレンス 2012に「インサイドWindows 第6版 上」が売られていたけど、あれは先行発売だったんですね。しかも20%オフで売られていたので、ほしい人にはヒャホーだったんですね。
第5版っていつ出たんだろうって思っただけでスルーした。まー持ってても私のスキルでは役に立たない(涙)C++から勉強し直さないといけないレベル・・・。
ただいま夏休み中です。といっても後、二日で終わりなのですが、
実家に帰って魚釣りなどを興じまして、見事に日焼けしてしまいました。
で、数年前から悩まされているのですが、
なぜか実家に帰って数週間後に手のひらの皮がボロボロとまるで脱皮のように皮がはげてしまいます。
一応、皮膚科に行ったりして水虫ではないというところまでは確認が取れているのですが原因不明。
皮がはげるまで微妙に赤みを帯びて、ぴりぴりとしたかゆみがあり
皮がはげたら手の感覚が鋭くなってしまい、
つまりキーボードがとっても打ちづらくなります。
プログラマは頭を使うものだ!なんて言いたいんですが
手も大事ですね(笑)
「バブルソートはプログラミング入門者には難しく、アルゴリズム入門者にとっては簡単な題材」と、個人的には思っています。今回は、「プログラミング入門者」という観点からこのバブルソートを考察してみたいと思います。
バブルソートはプログラミング入門者には難しいという根拠は、私の経験からくる経験則です私自身、ソートの勉強は、プログラミング入門時に合わせて勉強した内容であり、繰り返し処理や、条件分岐などの組み合わせの学習の題材として用意されたものでした。
バブルソートのアルゴリズムは
すべての要素に対して、隣接する要素を比較し、順序が逆であれば入れ替える。これを要素の数ー1回繰り返す(自明になった順序の範囲は繰り返す必要はない)
というものです。
想像力が欠如している私などは、とりあえず具体的な数列を用意して手で実際にソートしてみたりしました。
6, 5, 7, 1, 2, 4, 8, 3
5, 6, 7, 1, 2, 4, 8, 3 (6, 5)の順序が逆なので交換した。
5, 6, 7, 1, 2, 4, 8, 3
5, 6, 1, 7, 2, 4, 8, 3 (7, 1)の順序が逆なので交換した。
5, 6, 1, 2, 7, 4, 8, 3 (7, 2)の順序が逆なので交換した。
5, 6, 1, 2, 4, 7, 8, 3
5, 6, 1, 2, 7, 4, 8, 3 (8, 3)の順序が逆なので交換した。
5, 6, 1, 2, 7, 4, 3, 8 <- 8は確定
5, 6, 1, 2, 7, 4, 3, 8
5, 1, 6, 2, 7, 4, 3, 8
5, 1, 2, 6, 7, 4, 3, 8
5, 1, 2, 6, 7, 4, 3, 8
5, 1, 2, 6, 4, 7, 3, 8
5, 1, 2, 6, 4, 3, 7, 8 <- 7は確定
1, 5, 2, 6, 4, 3, 7, 8
1, 2, 5, 6, 4, 3, 7, 8
1, 2, 5, 6, 4, 3, 7, 8
1, 2, 5, 4, 6, 3, 7, 8
1, 2, 5, 4, 3, 6, 7, 8 <- 6は確定
1, 2, 5, 4, 3, 6, 7, 8
1, 2, 5, 4, 3, 6, 7, 8
1, 2, 4, 5, 3, 6, 7, 8
1, 2, 4, 3, 5, 6, 7, 8 <- 5は確定
1, 2, 4, 3, 5, 6, 7, 8
1, 2, 4, 3, 5, 6, 7, 8
1, 2, 3, 4, 5, 6, 7, 8 <- 4は確定
1, 2, 3, 4, 5, 6, 7, 8
1, 2, 3, 4, 5, 6, 7, 8 <- 3は確定
1, 2, 3, 4, 5, 6, 7, 8 <- 1, 2は確定
と、まあ具体的な操作を手で書くと、なんとなく「分かった感じ」になるわけです。
アルゴリズム的にはこれでいいのかもしれません。
ただ、これをプログラミングで実装しようとしたときに問題が発生するのです。
ええと、さっき手で操作する事をよりも前に、
コードを記述してみたのですが、なぜかうまくいきませんでした(汗)
コードを書き直し3回ぐらいコンパイルしてみたのですが、うまくいかず。
時系列的には
バブルソート書いてみよって思い立つ!
コードを書く
コンパイル
実行
ソートの結果まちがってますね!
コードのどこが間違っているのかチェックしてみる。
コードを書く
コンパイル
実行
ソートの結果まちがってますね!
コードを書く
コンパイル
実行
ソートの結果まちがってますね!
・・・ちょっと手で書いてみるか・・・
アルゴリズムを眺める。
コードをチェックしてみる。
何を勘違いしているのか気づく。
コードを一から書き直してみる。
コードを書く
コンパイル
実行
とりあえずソートはされていることを確認。
と、まあただしくアルゴリズムと向き合って、
そのアルゴリズムを実現させるためにはどういった概念が必要なのかきちんと考察しなければ
実装するのは危ういってことですね。
で、実装は
static void Main(string[] args)
{
var arrary = new[] { 6, 5, 7, 1, 2, 4, 8, 3 };
BobbleSort(arrary);
arrary.ToList().ForEach(Console.WriteLine);
}
private static void BobbleSort(int[] arrary)
{
if (arrary == null)
{
throw new ArgumentNullException("arrary");
}
for (int range = arrary.Length; range > 0; range--)
{
for (int leftIndex = 0; leftIndex < range - 1; leftIndex++)
{
if (arrary[leftIndex] > arrary[leftIndex + 1])
{
int largeValue = arrary[leftIndex];
arrary[leftIndex] = arrary[leftIndex + 1];
arrary[leftIndex + 1] = largeValue;
}
}
}
}
どういう風に間違ってしまったかというと、
for (int i = ...; ...; ...)
{
for (int j = ...; ...; ...)
{
...
}
}
とりあえずこう書いちゃったんですね。
なんかネストされたループがあって、配列のインデックスを2回回せばいいじゃね!?
みたいな「雰囲気」で書いてしまったんです。
iの意味は?・・・添え字だよな・・・jも添え字。
穴あき問題を解くがごとくコードを書いてしまったんです。
そりゃうまくいかないと何が間違えているのかさっぱり検討もつきません(笑)
正しくは
外のループは、隣接する要素の比較を行う範囲。
順序が自明になった範囲をチェックしないように、比較する範囲を一つずつ狭めていきます。
なので間違っても外のループのiの意味は添え字ではなくrangeです。
range - 1で、その範囲に存在する最大の添え字として見ることは可能です。
書き直すと下記のようになります。
for (int maxIndex = arrary.Length - 1; maxIndex >= 0; maxIndex--)
{
for (int leftIndex = 0; leftIndex < maxIndex; leftIndex++)
{
if (arrary[leftIndex] > arrary[leftIndex + 1])
{
int largeValue = arrary[leftIndex];
arrary[leftIndex] = arrary[leftIndex + 1];
arrary[leftIndex + 1] = largeValue;
}
}
}
うちにあるループは、隣接する要素の左側のインデックス。
これがひとつずつインクリメントされ、となりにあるleftIndexにある要素と順序を比較して
必要であれば交換する。
という実装をすればいいわけですね。
私がそうだったから皆さんもそうだとはかぎらないのですが、
私はfor内のiとかjは、配列のインデックスであると思い込んでいました。
なのでなんとかして、みたい要素のインデックスに帳尻があるようにプログラミングする。
というスタイルのコーディングを、初学の当時はやっていました。
いまは・・・いや、いまも・・・・その癖は直っていないのかもしれません(笑)
ということで、プログラミングとしてバブルソートのお話は終わり。
アルゴリズムとしてバルブソートの考察もできればここに書きたいと思います。
まあ気まぐれなので約束はできませんが・・・。