日曜日, 3月 30, 2008

ショック

あんなに負けると思いませんでした。
一番ショックはヴァーミリアンですね。
日本で圧倒的な強さでダートを勝ったにも関わらず
まったく通用しませんでした。
正直、こんな結末があるとはまったく思っていませんでした。

デューティーフリーは相手が強いと読んでいたので
どんな感じなのか興味がありましたが
正直、アドマイヤオーラとウォッカの差は騎手の差である気がしてます。
安藤勝さんが悪いというよりはさすがにドバイでの経験は武豊が上かと思います。

それ以上に強烈だったのはウォッカの競馬です。
あんなに前につけれるんじゃんってのが感想。
正直、四位さんとの腕の差を見ましたね。
最後方しか付けれないと読んだ気がしますが
あの位置につけれるんじゃん。

水曜日, 3月 26, 2008

ステップファザー・ステップ

宮部みゆきさんの短編小説です。
ただ、短編と言っても帯ドラマみたいな構成になっていますので
純粋な短編ではありません。
これは何かの連載だったのでしょう。

内容は面白い部類に入ります。
なぜこんな言い方かと言えば、宮部みゆきさんの作品は面白いのが多いからです。
最初に読む本として薦めません。

もし、宮部みゆきさんの本を何冊も読んでいて
次に何を読もうか探している人がいればお薦めです。

泥棒と子供の暖かい話でミステリーとは言えないです。
物語という部類になると思います。
題材として斬新ですのでドラマにしても良いかもしれません。

日曜日, 3月 23, 2008

FONのルーターが到着

FONのルーターである「LA FONERA+」がやっと来ました。
家の無線LANをLA FONERA+に変更し、
IPOD TOUCHでFON_APの方に接続して確認OKです。

初めてIPOD TOUCHでインターネットを行いましたが
これが以外に良いような悪いような感じです。
マウスクリックのみで行うようなインターネット使用はまったく問題なく、
画面が小さい事もIPOD TOUCH特有のインターフェースが
まったくそれをストレスに感じさせません。

が、文字入力についてははっきり言って駄目です。
このインターフェースは非常に頂けません。
考えてみると、タッチペンがないのも頂けませんね。
まあ、これはメインのターミナルとして購入していないのが救いですね。

まあ、もともと無線がa規格だったためWiFiが使用できなかったのですが
FONルーターに変更した事で、その辺は解消されました。
良く考えてみると、家に無線LANを構築する際に、
購入したのに2万近くしたのですが、FONのルーターは5000円程度です。
安くなったものです。

みなさんもFONに参加して、もっともっと使い勝手の良いものにしましょう

今からF1

今からF1マレーシアグランプリのTV観戦です。
初戦はフェラーリぼろぼろだったので、
2戦目は期待です。
ポールがマッサ、2番手がライコネンと
フロントロー独占ですから、今回は期待です。
非常に楽しみです。

さすがに諦めがついた

今日阪神2Rでアドマイヤアタックがまたまた惨敗しました。
強い強いと思って4戦目。
さすがに諦めが付きました。

友人指名馬のノットアローンの若葉S逃げ切りにより
状況も非常に悪くなってしまいました。
本番どうのこうのの心配はしていないですが...

よく考えてみると、POGをはじめてからの
初めての皐月賞出走が叶いませんでした。
これもさびしい事実ですね。

今は、プリンシパルSにクリスタルウィングが
勝ってくれる事を祈るのみです。

火曜日, 3月 18, 2008

ユニットテスト

ユニットテスト(単体テスト)はホワイトボックステスト、ブラックボックステストの
2つのテストを実施する事で完了とする事が一般的である。
この2つのテストについて自分なりに考えてみる。

ホワイトボックステストとはプログラムの処理方式をテストする手法で
ソースコードからテストケースを作成する必要がある。

もちろん、このテスト方法を否定する事をするわけではない。
これは歴史的発展を遂げてきたテスト手法であり間違っているわけではない。

ただ、最近のプロジェクトはこのホワイトボックステストをじっくり行う
テスト期間がないような気がしている。
もちろん、昔に比べるとデバッガなどのツールが整備されており
実施そのものは行いやすくなって事は否定しない。

ホワイトボックステストとして定義されるテストには
以下のようなテストが存在する。

・カバレッジテスト
プログラムの全ての行をトレースするというテストである

カバレッジテストはホワイトボックステストの中でも
一番重要なテストだと考えている。
しかし、便利過ぎるデバッガがカバレッジテストの重要性を
見えなくしている気もしている。
カバレッジテストとは本来テストデータによって
カバレッジを上げる事が目的であるが
それをせずに同一データでデバッガのブレイクポイントと変数代入を
使用して無理やり分岐を通すテストを実施する人が多いという問題である。
もちろん、担当者のスキル問題ではあるのだが
そもそもツールが存在しなければこんな事にはならなかったのも事実である。

何で、こんな事が起きるかと言えばカバレッジテストという内容を
理解していないのが原因だと考えている。

この対策として私が考える一番単純な方法は異常系テストを除いて、
デバッガの変数代入機能の使用禁止である。

また、カバレッジでは網羅していないデータが存在するのも事実である。
それは文1、文2のIF文が存在すれば全部で組み合わせは4種類存在する。
しかし、カバレッジという観点で言えば「true-true」「false-false」で
完了してしまう。
このような事がおきないようにデシジョンテーブルを作成して
カバレッジを上げる必要性がある。

つまり私が考えるカバレッジテストとは、
「デシジョンテーブルの作成」→「全てのデータを走行」→「未テスト部分の検証」
結果がデシジョンテーブルの抜けではなく異常系と判断されれば
デバッガを利用しての未テスト部分の走行、検証。
デシジョンテーブルの抜けと判断された場合は
最初に戻ってやり直しという方法である。


・境界値テスト
プログラムの中を理解している人間はループの終了条件や
分岐文の境界を理解している。
これに特化したテストケースを実施する事である。

このテストで一番重要なのは、分岐文やループ終了条件に記述される
境界値が「なぜこの数値なのか?」という事を考えることである。
実際問題、境界値テストケースを作成する事で
その分岐文を参照する事になるため
テストケースを作成した時にテスト結果がどうなるか容易に想像する事ができる。

であれば問題なのは、そもそも「その分岐文はあっているのか?」
「その終了条件は合っているのか?」という事を考えることである。

これで境界値テストは終わったようなものである。
もし、テスト担当者がその理由を答えられない場合
テストケースをパスする事ができても、テストケースが間違っている事を
検出する事はできない。
つまり、分からなかった段階で設計者又は分かる人間に聞く必要がある
という事になる。

・アルゴリズムテスト
これは単純にアルゴリズムを検証するテストである。
「静的検証」と「動的検証」の2種類を行う必要がある。

「静的検証」とはプログラムソースレビューを指し
「アルゴリズムが性能的に問題がないか?」
「分かりやすいアルゴリズムになっているか?」
と言った観点でレビューを行う。

「動的検証」とはアルゴリズムが期待している結果を出すかという検証であり、
いわゆるテストと言われるものである。

これで一番重要だと考えるのは「静的検証」を実施する事である。
これは意外と実施されない傾向にあるがとても重要な事である。


ブラックボックステストとは、インデータに対して期待するアウトデータを定義し
その結果のみを確認するテストである。
アウトデータが正しい内容であれば、
その生成方法については問わないという考え方である。

ホワイトボックステストを実施した前提であれば
ブラックボックステストで行う必要があるのはそんなに存在しない。
カバレッジテストの箇所で触れたデシジョンテーブルが
きちっとテストされる事で基本的には
そのプログラムファイルに期待するテストを実施している事になるからである。

つまり私自身はユニットテストにブラックボックステストは
必要ないと考えている人間である。
正確なホワイトボックステストを実施すれば十分である。

月曜日, 3月 17, 2008

クリスタルウイング

やっと2勝馬の誕生です。
時期が少し遅かったため皐月賞にま間に合いませんでしたが
藤沢厩舎であること、ゼンノロブロイ、シンボリクリスエスの例もありますので
まだまだ諦める必要がないシーズンとなりました。
他は全てダート馬のような感じですので、私の今シーズンは実質この馬1頭です。

時計、上がりを考えるとレースそのものは以外と不満がある内容だったのですが
勝ったという事のみを評価したいですね。
実は、エンジンが2段、3段隠されているという事に期待です。

次走はダービートライアルという事なのでプリんシパルSか青葉賞となるようです。
他にもレッドシューターという馬が同厩舎にいますから
その馬との兼ね合いになるのでしょう。

どちらにしても、この馬たよりですから期待です。

ハミルトン

開幕戦はあいかわらずのサバイバル戦でした。
その中でも諦めずに地道に走った中島一貴の6位はすばらしいですね。
クサビとの接触で次は10番グリッド降格らしいですが
そんな事は気にせずにがんばってほしいですね。
チームメイトが表彰台をとった事を考えると
マシンポテンシャルは以外と高いかもしれませんね。
今シーズンで表彰台を上る事を目指してほしいですね。

レースそのものはハミルトンが勝利しました。
それについては正直つまらない結果となりました。
マクラーレンのマシンは相変わらず速いようですね。
フェラーリは単純に自滅にしか思えません。
ライコネンは完全に不付きでしたね。

次こそ速いフェラーリを見せてほしいです。

土曜日, 3月 15, 2008

2008シーズン開幕

2008シーズンが始まりました。
ポールはハミルトンで、ライコネン、アロンソと大分後ろになりました。
チームの勢力は認識していいないのですが、
昨年優勝を争った3人ドライバー対決になれば、
3チームの対決なので少し面白いかもしれませんね。

日本人は後ろですが、中島のチームメイトが7番手にいる事を考えると
中島マシンのポテンシャルはありそうですね。

本番タイプかもしれませんので楽しみです。
スーパーアグリはマシンが苦しい状況かもしれませんね。

佐藤琢磨にはがんばってほしいですが、
如何せんマシンの不利はどうしようもなさそうです。

C++解説17(デフォルト引数)

C++にはデフォルトパラメータという機能があります。
これは引数が与えられなかった場合、
デフォルト定義したパラメータが与えられたとして動く機能です。
また引数として省略できるのは後半のパラメータです。

Add(int &lhs, int rhs = 1);

この関数Addはlhsにrhsの値を加算する単純な関数ですが
もしrhsである第2引数を省略した場合
1を加算する関数になります。

int main(void) {
int i = j = 2;

Add(i, j); // 2+2
Add(i); // 4+1
}

1回目のAddは引数の省略がないため
そのまま値が使われ「2+2」となり
2回目のAddは第2引数省略となっているため
第2引数にはデフォルト引数である「1」が使用される。

Add(int &lhs, int rhs = 1);
Add(int &lhs, int rhs = 2);
もちろん、これはエラーである。
Addを使用した時にどちらを呼び出せば良いか
分からなくなるからです。

今回はちょっとした事ですが、意外と重宝できる機能ですので
照会してみました。

木曜日, 3月 13, 2008

スナーク狩り

この本はもの凄く面白かったです。
本格推理というよりは、サスペンスの物語です。
トリックがどうとかいう本ではなく、
それぞれの物語(ここでいう物語とは、登場人物一人一人の話です)が
一つに繋がっていき、最後には考えさせられる話でした。

上手く表現できませんが、話にはスピード感がありました。
展開が速く、あっという間に話が次々と進んで行きます。
いくつかの物語を繋げるところは絶妙で、とにかく面白い本でした。

宮部みゆきさんの本は面白い本が多いですが
この本もその中でお勧めの本であることは間違いありません。

味気ないかもしれませんが、宮部みゆきさんの本を読んでいるだけでも
いろいろな話に出会うことができます。

火曜日, 3月 11, 2008

脳を活かす勉強法

茂木さんの本ですね。
ベストセラーみたいです。
内容的にはどこかで読んだ事がある自己啓発書みたいな内容です。
もちろん、茂木さんが書いているので脳に対してという解説が
たくさん登場し、その部分は最高に面白いです。
でも、これは個人の感じ方でしょうね。
私自身は脳というものに非常に興味があるため
「脳の中でどのように解釈されるか?」とか「脳の中で何が起こっているか?」
などが解説されている本は大好きです。
推理小説でも脳を扱った内容は、それだけで面白いと感じてしまうほどです。

私は非常にお勧めします。
いくつか共感を覚えた題をあげておきます。
興味があれば、立ち読みでも良いと思いますので目を通してみて下さい。
ただ、こういった本は何回も読むものだと思いますので購入がお勧めです。

1.「喜び」がないと強化回路が回らない
2.一つひとつの行動に負荷をかける
3.「成果を他人と比較する」なんて、デメリットだらけ
4.細切れ時間こそ、できることが無限になる
5.少し難しい内容の本を読むことが、脳に快楽を与える

読み易い本ですし、本当にお勧めします。

C++解説16(Exception2)

例外処理について考えた場合、string型やint型では多くのケースが
情報不足に陥る事になる。
そこで例外クラスを作成する事が一般的だと思います。

もの凄く汎用的なクラスを作成してしまえば

class base_error {
private:
int nRetCode, nDtlCode;
public:
base_error () { nRetCode = 0; nDtlCode = 0; }
base_error (int InRetCode, int InDtlCode) { nRetCode = InRetCode; nDtlCode = InDtlCode; }
void Print_ErrMsg() const {
cerr << "Error RET[" << nRetCode << "] DTL[" << nDtlCode << "]\n";
}
};

これは何の情報もないエラークラスです。
これを派生させて、様々なエラークラスを作成してしまえば良いのです。
なので全てのエラーの既定クラスとするbase_errorの「Print_ErrMsg」は
virtual宣言に変えておきましょう。

では派生させてみましょう。
「数値型」を受けるクラスのメソッドについて考えてみます。
このメソッドが引数に期待している値が「0~99」だとします。
その場合、引数に対して「0 <= 引数 <= 99」といったチェックが行われるでしょう。
そして、この条件が満たされなかった場合「Out Of Range」という事なり例外発生です。
このような場合、エラー情報として実際に何が引数に渡されたのかを出力するのが通常です。

class OutOfRange : public base_error {
private:
string strFuncName;
int nValue;
public:
OutOfRange (string InFuncName, int InValue) { strFuncName = InFuncName; nValue = InValue; }
void Print_ErrMsg() const {
cerr << strFuncName << "::OutOfRange value = [" << InValue << "]n";
}
};

これで完成です。
後はこれを捕捉すれば良い事になります。
ここでちょっとした工夫が必要になります。

単純に書けば

try {
func();
} catch (OutOfRange o) {
o.Print_ErrMsg();
}

とすれば良いのですが、もちろんこれは違います。
絶対的に違うのは、何のためにbase_errorを派生させたかって事です。
「OutOfRange」というクラスオブジェクトの時のみ特殊な動きが発生する場合
この方法もありますが、上は単純にエラーメッセージを出力しているのみです。
であれば、基底クラスである「base_error」で捕捉をするのが通常の方法です。

try {
func();
} catch (base_error o) {
o.Print_ErrMsg();
}

となります。
実は、これでも不十分となります。
何故なら、「base_error o」というように値で捕捉をしているからです。
値で捕捉しているという事は「o.Print_ErrMsg()」で出力されるのは
基底クラスの「Print_ErrMsg()」という事になりますね。
そのため、アドレスという形(参照で問題ありません)で捕捉をする必要があります。

try {
func();
} catch (base_error &o) {
o.Print_ErrMsg();
}

が期待している形になります。
後は、様々な例外クラスを派生クラスという形で作成していく事で
ある規則に従って記述されたメイン処理は余す事なく例外を捕捉出来る事になります。

月曜日, 3月 10, 2008

C++解説15(Exception1)

プログラムが異常した場合の処理をどのように記述してきたか?
C++以前の言語とC++以降の言語では
この辺りが大きく違うのではないでしょうか?

まあ、今回説明するExceptionと言うものの
元祖がC++なのか良く分かっていないのですが
私自身はC++で始めて出合った構文です。


この機能の素晴らしさはC言語プログラマであれば
絶対に分かる機能だと思います。

プログラムが異常した場合、終了させる方法は2つあります。
1つ目は「abort()」という手段で終わらせる方法
2つ目は「main」を正常復帰値以外で終わらせる方法です。

1つ目の方法は全てを破棄する方法ですから
特別な制御は不要です。

どのようなプログラムを作成するかによりますが
私自身はあんまり行わない終了方法です。
まあ私自身はオンラインプログラムが多く
しかもクラッシュさせる事が
絶対にできないシステム開発ばかりであったため
「abort()」という選択肢はありませんでした。

そのため必然的に2つ目の方法である
「main」の異常復帰という方法を取りました。
もちろん、データ不正などデータベース等にログしているデータが
不正の場合、続行は不可能です。
こういった場合、その影響範囲を最小にするための
制御としてクラッシュさせるわけにいかなかったと言う事です。

少し勉強した時はC言語の標準関数は「errono」に値を返す事を
利用してプログラムを組んだ時期もありましたが(こっちは趣味です)
基本的にはライブラリを使う人間としては
なぜライブラリの使用ができなかったのかというエラーは
あんまり重要ではない事がほとんどでした。

要するに、失敗したという事実が確認できれば十分であると言う事です。
そうなってくると「errono」の使用は少しづつ行う事をしなくなりました。

すると関数を呼び出し、その復帰値を参照し問題なければ次に。
また別の関数を呼び出し、また復帰値を参照し問題なければ次に。
という方法でプログラムを書く事が普通となります。

これは当り前なのですが、実はC言語では諦めている境地で
C++ではこんな方法はありえないと言う事になります。

例として制御関数「ctl_main()」が「int funcA()」「int funcB()」「int funcC()」
を呼び出ししているプログラムというものは
基本的には以下の通りになります。

int ctl_main() {
int nRet;

nRet = funcA();
if (nRet != 0) {
return nRet;
}

nRet = funcB();
if (nRet != 0) {
return nRet;
}

nRet = funcC();
if (nRet != 0) {
return nRet;
}

return nRet;
}

これは当たり前のようで物凄く読み辛いプログラムです。
異常系のロジックが半分以上埋め込まれている事がその原因です。

これをC++では以下の通りで表現する事ができます。

「void funcA() throw(string)」
「void funcB() throw(string)」
「void funcC() throw(string)」

int ctl_main() {
try {
funcA();
funcB();
funcC();
} catch(string e) {
cout << e << endl;
return -1;
}

return 0;
}

これは「funcA」「funcB」「funcC」が異常発生の時に
例外を「throw(発生させる)」するので、
異常系処理を行う必要がある場合に、
その例外を「catch(例外処理を行う事を宣言)」して
処理を行う。

例えば、あんまり良い例ではないが1例示します。
「funcA」「funcB」「funcC」が「引数:char」を取り、
以下の事をcheckする関数とします。
funcA:数字であるか判定
funcB:偶数であるか判定
funcC:3の倍数であるか判定

上記の3関数はCheck結果がNGとなる場合、例外を発生させます。

void funcA(char c) throw(string) {
if(('0' <= c) && (c <= '9')) {
} else {
throw string("Param is not Numeric.");
}
}

void funcB(char c) throw(string) {
if (c % 2) {
throw string("Param is not even.");
}
}

void funcB(char c) throw(string) {
if (c % 3) {
throw string("Param is not multiple of three.");
}
}

int ctl_main() {
try {
funcA();
funcB();
funcC();
} catch(string e) {
cout << e << endl;
return -1;
}

return 0;
}

これはthrowされた内容が出力されて異常終了する事になります。
この記述の優れているところは、
正常系処理の中に異常系処理を書く必要がなく
非常にプログラムが見やすいというところです。

次回は具体的な使い方を見ていきます。

土曜日, 3月 08, 2008

エデンの命題

「エデンの命題」は個人的には面白かったです。
ただ世間的には良く分かりませんが...
島田荘司さんの作品の中では、かなり読み易い部類ではないかと思います。
斬新なトリックがあるわけではないのですが
たんたんと進むストーリでも、アダムとイブという題材が個人的に
良かったのか、とっても面白かったです。

この本は2作あるのですが、2作目の「へルター・スケルター」
という作品もなかなか良かったです。
この作品は何と言っても脳を扱っているところが私が共感したところでしょうね。
最近、脳の話を読むのが好きなので
この手の話に触れるだけで、何となくすばらしいものだと思ってしまうのは
現在の私の病気かもしれません。
ストーリがもの凄く面白いわけでもないため
何で、こんなにこの本に共感を覚えているのかは良く分かりません。

それでも私がこの本が大好きです。

火曜日, 3月 04, 2008

次女が2歳になりました

本日、次女の2歳の誕生日です。
ここまで順調に育ってくれたのはなによりです。
去年は以外と身近なところで、子供に大変な事が続いていたので
無事に生まれた家の3女や、順調に育ってくれている長女、次女は
それだけで、本当に親孝行なのだと感じた昨年でしたね。

家の次女は長女に比べるといろいろと早い段階で覚えています。
長女の存在が全てなのでしょうが、
それでも凄いと感じさせるところはたくさんあります。

発する言葉も順調に増えていて最近は満足な会話も行えています。
自己主張もなかなか行っています。
一番可愛い時期と言われる3歳前の1年です。
まだまだ楽しみをプレゼントしてくれそうです。

日曜日, 3月 02, 2008

予想が当たらない。

最近、競馬予想は完全に氷河期に突入した気がします。
とにかく当りません。というか馬券が上手く買えていません。

今回の中山記念は逃げるコウゴウリキシオーをエアシェイディが差しきるとの
つまらない予想であったため結果はどうでも良いのですが...
(まったく当たらなかったため、しょうがないという意味です)

阪急杯は完全にミスです。
予想はスズカフェニックスが飛んでくるが
開幕週である阪神の馬場は前がとまらずローレルゲレイロが逃げ切る予想です。
はっきり言って完璧な予想でした。
3連単とは言いませんが、馬単が1点であたっていた予想です。
それを直接馬券に結びつける事ができずに外れました。
オッズを見て、つまらないのでもう一ひねりしてしまいました。
オースミダイドウがローレルゲレイロを抑えて逃げ切るという予想です。
まったく無駄な予想です。
今から考えれば、20倍ちかくも付くオッズが不満か!って話です。
まったく情けないですね。

来週はチューリップ賞と弥生賞という3歳戦ですから
はっきり言って非常に予想が難しいですね。
特に今年の3歳は何が強いのかさっぱり分かりません。
もしかしたら、ダービーを勝利する馬は
未だにデビューしていないのではないか?
とすら思ってしまします。

兎に角、初心に戻り、馬連予想でしっかり当てて行きたいですね。

上昇傾向

本日も指名馬の1頭であるクリスタルウィングが勝利を収め2週連続の勝利です。
両方とも藤沢和厩舎から指名した馬で連続の勝利は気分が良いですね。
まあ、新馬戦、未勝利戦ですから獲得賞金はたいした事がないのですが
気持ちが全然違います。

先週のカジノドライブは海外が決まっていますし
なかなか成績が残せませんでしたが
ドラフト1位のスパークキャンドルは帯同馬として一緒に渡米するようです。

そうすると、今日勝利したクリスタルウィングに過度な期待を寄せてしまうのですが
今日のレースでは、上がりが速いのは良いのですが
基本的にエンジンがかかるのがどうも遅い気がしてしょうがありません。
また、3コーナーから4コーナーにかけて、追走できていなかった気がします。
直線向いてしまえば、圧倒的な追い込みでしたが
これでは重賞クラスはちょっと難しいかもしれませんね。
まあ、それでもこの馬に期待するしかないのですけどね。

パーフェクト・ブルー

犬が主人公と言っても良い作品のパーフェクト・ブルーです。
宮部みゆきさんの作品で、作品名は忘れましたが
これの続編に当たる作品を最初に読んだ記憶があります。
続編よか面白かったような気がします。

このシリーズは犯人が横溝正史的なところがあり
前回も含めて意外な人が犯人だったような気がします。

小説の視点が人間ではない作品って面白いんですよね。
そんな作品を読んだ事がない人は読んでみるのもよいと思いますね。

宮部みゆきさんの作品は基本的に外れません。