////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


    (C)KAB-studio 1999 - 2004 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz

    送信日： 2004/01/19(Mon) No.240
    配信数： 2660 ( Mag2 + Pubzine )
＊    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine ( URL: http://www.pubzine.com/  ID: 590 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
/*                ２００４年１月１９日（月）の更新                */
http://www.kab-studio.biz/index.html

・ほとはー１話追加
　三人合体ホットハーブに７の８を追加。問題発言？
[ 三人合体ホットハーブ ]
http://www.kab-studio.biz/Comic/HotHerb/index.html

・KAB-studio.h 縮刷版更新
　KAB-studio.h が２４０号になるので縮刷版を更新しました。ダウンロー
ドはダウンロードルームにて。
[ ダウンロードルーム ]
http://www.kab-studio.biz/Freeware/index.html#MailMagazine

・作者について更新
　作者についてをちょこっと更新。１月１３日で２９歳になったもの
で……。
[ 作者について ]
http://www.kab-studio.biz/Info/Kaburaya/index.html


////////////////////////////////////////////////////////////////////
/*                        ちょお普通な日記                        */
http://www.kab-studio.biz/nikki2/index.html

2004/01/11 (Sun)
　ホントに眠い。疲れっぱなし。ほとはーとオチ。このままがんばれ
ば……。アバレンジャーがあんま。セカンダリディスプレイがスクロールす
る現象が。テレビのクローンになってた……。

2004/01/12 (Mon)
　朝６時まで君望。寝てからお昼に休出。リブレットだけで作業。また太っ
てきた。明日は誕生日。２９歳です。ダメ人間です。

2004/01/13 (Tue)
　午前中はファイルのマージとか。 CYGWIN を DOS モードで入れたら CVS 
に入れた jar ファイル、 LF が CRLF にされてた。ビデオのハードディス
ク録画がかなり失敗する。君望、茜ちゃんクリア。

2004/01/14 (Wed)
　今日から客先直出直帰。仕事が増えていく……。 CVS に慣れてもらう。
マリみてはギャグ路線？　そして CoCoon 。

2004/01/15 (Thu)
　朝１０時からでものんびりできない。午前中はコーディングとミーティン
グ。 YukiWiki 導入。誰も使わなさそう？　１１時半に帰ってきてぐだーっ
と。

2004/01/16 (Fri)
　CVS インポート。ファイルのマージ。 RUP がウォーターフォールへ。 
CVS の謎な現象。 Wiki まだ慣れない……。体力がかなりやばい。はなわネ
タはＯＫなのか？　横浜に寄れない。

2004/01/17 (Sat)
　粉雪。午前中は洗濯とか。午後から休出。 CVS と Wiki と sendmail 。
秋葉原に寄って ATI RADEON 9600PRO 256M とか購入。マンガも１万円分購
入。レビュー。あんま詳しくないから……。


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
http://www.kab-studio.biz/Novel/Fuga/index.html

■　第九章　四人　−１７−

「くっ！！」
　穂香を庇うようにして、岩陰に隠れる。言いようのない不快な熱風が駆け
抜ける。
　息が落ち着かない。肺がふいごのようにかすれた音を立てる。傍らにしゃ
がみ込む穂香は、完全に脱力していた。
　ゆっくりと立ち上がり、雅樹は周りを見回す。かなり距離が離れていたに
もかかわらず、巨木が所々えぐれ、岩肌は真っ白に削り取られていた。
「赤葉！」
　呼ばれて、少し離れた岩陰から出てくる。泣きじゃくる赤葉に、掛ける言
葉はない。
「泣くな！！」
　穂香にはあった。雅樹は振り向く。涙をたたえたその瞳には、すでに炎が
ともっていた。
「……死人が生き返るはずなどない。あるとすれば、それは我々のように術
を使える能力者ということだ」
「敵が他に、いる……？」
　穂香は頷く。
「泉に戻る。あの場所なら優位に戦えるし、ここに長くいるのは危険だ」
「でっ、でも……もう……もう……」
「雅樹が生きてんのに甘ったれたこと言うな！！」
　涙が、飛び散った。
「なんなら今ここで殺してやろうか！！」
「ひっ！」
「お、おい」
　単なる脅しだと、頭の中で理解していても、雅樹を一瞬睨み付けたその眼
光は、それをやりかねないものを持っていた。
「まだ、終わってないんだから……もう少し、手伝って……」
　肩で息をしながら、嗚咽を隠そうとしながら、穂香は村へと向かう。
「……だめ」
　赤葉が、遮る。
「どきなさい」
「ううん、違うの……たぶん、泉に、その敵がいると思う……」
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『最近書くネタないね……』
「コンテンツの追加とかあまりないからね……」
『次の大きな更新とかっていつ？』
「２月の表紙壁紙くらいかなぁ……」
『なんか地味……』
「……」
http://www.kab-studio.biz/index.html
_______________________________________________________________[KCM]

////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

　Version 13.04
テストプログラム

「前回説明したように、関数には【コントラクト】というものが存在しま
す」
『仕様通りに関数が動きますよ、っていう契約ってことね』
「でも、その仕様はコメントやドキュメントだけの、いわば〈口約束〉。仕
様通りに動かない可能性は十分にあります」
『でもさ、それってやっぱり仕方ないんだよね』
「仕方ない、って割り切らない方がいいかな」
『そなの？』
「なぜかというと、仕様通りに動くかどうかを確認する方法はあるから」
『あるんだ……』
「どうやって確認するかというと、関数を呼ぶためだけのプログラムを作っ
て確認すればいいんです」
『関数をテストするプログラムを作る、ってこと？』
「そういうこと。たとえば、こういう仕様の関数を作る場合」

・入力：整数１ 
・出力：整数１ * 10 
　　　　ただし、整数１が 214748364 より大きい時は 1 を返す

「これを実際に作ると、こういう関数になります」

int TenTimes_WithError( int p_i )
{
    if( p_i > 214748364 )
    {
        // エラー！
        return 1;
    }
    
    return p_i * 10;
}

『仕様通りね』
「この関数をテストするプログラムは、こういうふうになります」

void testTenTimes_WithError()
{
    if( !( 2147483640 == TenTimes_WithError( 214748364 ) ) )
    {
        TRACE( "エラー１\n" );
    }

    if( !( 1 == TenTimes_WithError( 214748365 ) ) )
    {
        TRACE( "エラー２\n" );
    }
}

『２回呼び出して……それぞれ引数が違ってて、その結果とチェックしてて
違っていたら TRACE で出力……』
「こういうふうに、プログラムでプログラムをチェックするわけ。これを、
プログラミングの用語で【ユニットテスト】と言います」
『ユニットテスト？』
「日本語で書くと【単体テスト】って意味になるんだけど、別物と考えた方
がいいかな。ユニットテストには次のようなメリットがあります」

・関数が仕様を満たしているかチェックできる。
・関数のチェックを自動的に行うことができる。
・仕様をプログラムとして記述できる。

「まず〈関数が仕様を満たしているかチェックできる〉はそのままの意味」
『ってゆーかそれだけじゃないんだ』
「そう。次の〈関数のチェックを自動的に行うことができる〉っていうのは
重要。この関数が自分で作ったものの場合、あとで修正することがあるで
しょ。そのときのチェックもこの関数を使えば」
『自動的にチェックできる！』
「そういうこと。逆に言うと、このチェックがあるから修正が楽になる、
っていうこともあります」
『どういうこと？』
「この業界には〈ちゃんと動いてるものには手を触れるな〉っていう業界用
語があります」
『なんかすごく後ろ向きな業界用語ね……』
「でしょう。でもユニットテストがあれば大丈夫。手を触れても自動的に
〈ちゃんと動いているか〉をチェックできるから」
『手作業でもチェックできるじゃない』
「手作業だと時間掛かりすぎるし、どうしても抜けがあるからね」
『プログラムで自動化すれば問題なし、と』
「そういうこと。ちなみに、このユニットテストを利用して関数を修正する
ことを【リファクタリング】といいます」
『リファクタリング？』
「そう。関数を改造したり作り直すことを差します。普通に作り直すと大変
だけど、ユニットテストがあれば」
『作り直した後のチェックが簡単ってことね』
「そういうこと」
『最後の〈仕様をプログラムとして記述できる〉って？』
「テストプログラムそのものが、プログラムの仕様書にもなってる、ってこ
と。たとえば」

    if( !( 2147483640 == TenTimes_WithError( 214748364 ) ) )
    {
        TRACE( "エラー１\n" );
    }

「これは〈 214748364 を入力すると 2147483640 が返る〉っていう意味だ
し」

    if( !( 1 == TenTimes_WithError( 214748365 ) ) )
    {
        TRACE( "エラー２\n" );
    }

「これは〈 214748365 を入力すると 1 が返る〉っていう意味。プログラム
自体が、その関数がどう動作するのかを示してるわけ」
『だからプログラムが仕様書になる、ってことね。でもさ、これって不十分
じゃない？』
「だね、これだと〈１０倍する〉とか〈 214748364 より大きい数〉とかが
含まれてない、たった２つの例だけだからね。かといって int の範囲の数
すべてチェックすると時間が掛かるし」
『掛かってもいいんじゃないの？』
「たまにしかしないならそれもいいかな。ただ……ここからはちょっとやや
こしい話になるんだけど、本当のテストプログラムはこうじゃないんです」
『本当は違う、って？』
「本当のテストプログラムは、専用のライブラリを使うんです。 C++ だと 
CppUnit っていうライブラリを使います」
『でも今みたいに if 使ってもいいんじゃない？』
「一応いいんだけど、 CppUnit を使うと次のようなメリットがあります」

・書き方が統一される。
・エラーメッセージがわかりやすい。
・一般的。

「まず、 CppUnit のライブラリを使うことでテスト方法が統一される、
っていうのがメリットのひとつ。上の例でも if の中がややこしいけど、 
CppUnit を使うと次のように簡単に書けます」

    CPPUNIT_ASSERT_EQUAL( 1, TenTimes_WithError( 214748365 ) );

『 CPPUNIT_ASSERT_EQUAL ってマクロ使うの？』
「他にも方法はあるけど一例ってことで。この場合、第１引数と第２引数が
合っているかチェックして、間違っていたらエラーメッセージ表示します」
『そのメッセージがわかりやすい、と』
「メッセージに、左側の値＝期待する値と、右側の値＝実際の値が表示され
て、どこが違うのかがわかるから」
『確かにさっきの方法だとわかんないもんね』
「あと、自分でテストのプログラム作るよりは、 CppUnit を使った方が一
般的に見やすいプログラムになると思うから」
『……ってほど有名じゃないような気がするけど』
「 JUnit で検索してみて」
『あ、いっぱいヒットした』
「 JUnit の C++ 版が CppUnit 。でもあまり一般的じゃないし、そういっ
た理由で導入がちょっと面倒だから、実際の使用方法はパス」
『って意味ないじゃん！』
「使い方自体はネットで調べて。それよりも重要なのは、テストプログラム
を作る理由」
『……大事なのは根本的なこと、ってことね』
「そういうこと。さっきの〈時間がかかる〉って話だけど、ユニットテスト
は、本当はコンパイルする度くらい頻繁に実行します」
『それは多いね……あ、だから時間掛かるのいけないんだ』
「そういうこと。ユニットテストを常に掛けておくことで、プログラムが常
に仕様通りに動くってことが保証されるわけ」
『まさにコントラクトね』
「さらに、このテストプログラムを先に作って、実際の関数をあとで作るっ
ていう方法もあります」
『へ？　何それ、なんか逆じゃない？』
「テストプログラムは何の代わりにもなるんだっけ」
『仕様書……あ、そっか、関数の仕様は先に作るから』
「それと同じようにテストプログラムを作って、そのあとで、仕様通りに動
くように関数を作るわけ」
『それなら確実よね……』
「こういう考え方を【テストファースト】って言います」
『テストを先に、ね』
「テストプログラムを作ることで、仕様通りに関数が動くかどうかを常に
チェックできる、つまり契約に効力を持たせることができるわけです」
『仕様通りじゃなければ契約違反、それがわかるんだもんね』
「ただ、実際にはこうはうまくいかないところもあります」

・作るプログラムの量が増える。
・テストプログラムにバグができる可能性がある。
・仕様が変わるとテストプログラムも変える必要がある。
・テストしきれない場合がある。

『作る量が増えるのは当然だけど、でもちゃんと仕様通りに動くんならあと
で直すところとか減るからどっこいどっこいなんじゃない？』
「それはそうだと思うよ。ただ、プログラムがどれくらいでできる、ってい
う見積もりの時点で〈うまく動かないときにあとで修正する分〉って含みづ
らいから」
『確かにそうね、動かなくなるっていうのを前提にはできないよね』
「でも、テストプログラムを作る分っていうのは確実に増えるから、その分
プログラムを作る時間は増えるよね」
『テストプログラムを作ると確実に時間が掛かる……って、なんかだまされ
てない？』
「もちろん〈うまく動かないときにあとで修正する分〉が存在しないわけが
ないんだけど……」
『……次のテストプログラムのバグ、ってありがちそうよね』
「特にコピペが多いとすごく出やすいから、これは問題かも」
『……テストプログラムのテストプログラム？』
「きりないし……」
『仕様の変更、っていうのもありそうよね。それにあわせてテストプログラ
ムも変えなきゃいけないんだ』
「そういう点を考えても、テストプログラムは仕様が重要ってこと。元々、
コントラクトベースのプログラミングは仕様がしっかりしてないと成り立た
ないから」
『契約しようがないもんね』
「仕様がしっかり決められない状態でプログラムを組み始めると前提が成り
立たないかも」
『最後のテストしきれない、っていうのは？』
「 Version 13.02 ( No.238 ) で〈関数の中で閉じている〉って言ったけ
ど、この閉じてない関数をテストするときには状態が多すぎるでしょ」
『そか、ファイルとか関係してくるとテストしきれないね』
「それに、関数から関数を呼んでいたりすると、その分入力と出力のバリ
エーションが増えるから」
『テストし切れない……』
「それでも、アルゴリズム関数の仕様をしっかり決めたり、それに基づいて
assert() を使ったりテストプログラムを作ることは重要」
『デメリットがあっても？』
「デメリットではあるけど、時間があれば解決できることが多いから。プロ
グラムを組む時間をどれだけ掛けられるか、を考えてどこまで理想を追求で
きるか、が重要かな」

/*
    Preview Next Story!
*/
『な、なんか今回っていつもと違う感じ……』
「プログラミングの話っぽくなかった？」
『全然ない！　なんか概念ってゆーかなんてゆーか……』
「僕としてはこういう方が重要だと思うんだけどね」
『でもコーディングしないとつまんないなー』
「う”」
『というわけで次回』
＜ Version 13.05 エラーの返し方 ＞
「につづく！」
『次もおんなじ感じ？』
「ちょっとそうかも」
『げ』


////////////////////////////////////////////////////////////////////
/*                ２００４年１月２６日（月）の更新                */
http://www.kab-studio.biz/index.html

・ほとはー１話追加予定
　三人合体ホットハーブに７の９を追加予定。まだなんとかなる……。


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.biz/nikki2/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.biz/Freeware/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.biz/Info/MailMagazine/

    (C)KAB-studio 1999 - 2004 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

