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

    KAB-studio.h


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

    送信日： 2004/01/12(Mon) No.239
    配信数： 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


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

2004/01/04 (Sun)
　表紙壁紙修正。かぶヘッダー送信予約。ほとはー。バックアップ。年賀
状。昼寝を挟んで君が望む永遠をがーっと。前のカレイドスターも。気付い
たら寝てた……。

2004/01/05 (Mon)
　仕事初め。時差ぼけで眠い。なにげに忙しい。横浜で同人誌を８５００円
購入。カレンダーがない……。新番組一覧。

2004/01/06 (Tue)
　お昼に他の拠点でミーティング。これからどうなることやら……。君望終
わらせないと〜。君望１日１時間。

2004/01/07 (Wed)
　ぽかやってコーディング。ファイルのマージとコーディングをがしがし
と。この勤務地で働くのもあと１日。ガンダムフォースがなんかすごい。マ
リみてが始まる〜。

2004/01/08 (Thu)
　突貫的プログラミング。客先作業用にデータのコピー。そしてファイルの
マージ。かなりテンパる。朝１０時からは助かるなぁ。マリみて、少女マン
ガっぽすぎ？　慣れたけど。

2004/01/09 (Fri)
　今日から直出直帰。でも１０時から。 CVS と Eclipse を色々試す。１２
時上がり。かなり疲れた……。もう寝よう。ＯＲＡＮＧＥ完結。

2004/01/10 (Sat)
　ヨドバシで CVS と CYGWIN の本を購入。午後から休出。 CVS の質問、教
えて〜。 Java 環境の違い。横浜で両手いっぱいに本購入。凄まじい量の
ハードディスク録画がロスト。ＰＣで録画した方がいい？


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
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.03
「コントラクト」という考え方

「前回は、アルゴリズム関数を作る上での基本的なことを説明しました」
『結局は、エラーが出たときにどうするか、だよね』
「そうなるね。エラーに関して、入力を中心に考えると次のバリエーション
があります」

・正しい入力値
・誤った入力値
・微妙な入力値

『ビミョーって……』
「前回みたいに単に１０倍するだけだと〈微妙な入力値〉ってないけど、複
雑なアルゴリズムだと実際に処理してみないとわからないから」
『試してみないとわからないのが微妙な入力値、ね』
「次に出力を中心に考えると次のバリエーションがあります」

・正しい出力値
・誤った出力値
・エラー
・停止

「前回の例で言えば、順に、１０倍の数、オーバーフローした数、 1 、 
assert() で停止、ってところかな」
『そか、 assert() は戻り値で返るわけじゃないから出力じゃないんだね』
「このふたつの組み合わせを考えます」
『組み合わせ？』
「そう。たとえば、正しい入力値が入力された時に許される出力は、次のよ
うになります」

○正しい入力値＞正しい出力値
×正しい入力値＞誤った出力値
×正しい入力値＞エラー
×正しい入力値＞停止

『正しい出力値しかダメなんだ』
「正しい入力値だから当然。言い換えると、〈正しい出力値が絶対に出るの
が正しい入力値〉ってことかな」
『卵が先か鶏が先か……』
「誤った入力値の場合はこう」

○誤った入力値＞正しい出力値
○誤った入力値＞誤った出力値
○誤った入力値＞エラー
○誤った入力値＞停止

『……誤った入力値の正しい出力値って、なに……？』
「たとえば前回の例で言うと、関数の仕様で〈 214748364 より大きい数が
入力された場合、出力は 2147483647 になります〉っていう仕様にした場合
とか」

・誤った入力値： 214748364 より大きい数。
・正しい出力値： 2147483647 。

『……つまり、オーバーフローする場合には int の最大値を返す、ってわ
け？』
「関数の仕様をそうすることもできる、ってこと。この場合、仕様通りの結
果だから誤った出力値ではないし、エラーとは判断できないからエラーでも
ないし」
『でもなんか……』
「誤った入力値は、アルゴリズム関数を使う側が〈この入力値は誤ってるか
ら、このときはアルゴリズム関数を使わない〉って選べるわけだから、何を
されても文句は言えない、ってところかな」
『だから正しい出力値も誤った出力値も停止もＯＫなわけね』
「最後に微妙な入力値」

○微妙な入力値＞正しい出力値
×微妙な入力値＞誤った出力値
○微妙な入力値＞エラー
×微妙な入力値＞停止

『微妙な入力値の時って、誤った出力値と停止はダメなんだ』
「微妙な入力値の場合は、実際にそのアルゴリズム関数に渡してみないと正
しいか誤っているのかわからないでしょ」
『それで試しに渡してみて、誤ってたり停止されたら困る、ってことね』
「そういうこと。だから、正しい出力値とエラーしか返さないようにする必
要があります」
『んー、なんか結構、このパターンって曖昧な気がするんだけど』
「そう」
『そう、って……』
「なぜかというと、〈仕様〉がすべてだから」
『あ、さっきの〈誤った入力値＞正しい出力値〉の場合みたいに？』
「そう。仕様で」

・Ａが入力されたらＢを出力する。

「と書かれていたら、それは絶対の権力を持ちます。だから」

・数が入力されたらその１０倍の数を出力する。
・ただし、 3120987 が入力されたら 0 を返す。

『な、なにそれ、なんで こんな変な数だけ特別に…… 』
「それでも仕様でこう決まっていたらそれに従わなきゃいけないってこと。
理不尽な出力であっても、そこに書かれているのなら〈正しい出力値〉なん
です」
『……』
「さて。今まで説明してきた、関数の仕様のことを【コントラクト】って言
います」
『コントラクト？』
「英語で contract 、【契約】っていう意味」
『関数の契約書って感じね』
「そういうこと。関数の仕様は一種の契約書。この契約書に基づいて、信用
取引でプログラムは成り立つわけです」
『〈信用〉、って前回も言ってたね』
「ランタイム、 Win32 API 、 MFC 、そして自作したものも含めて、世の中
にはたくさんのライブラリがあります。それらを使うということは、仕様に
基づいた、プログラム同士の【契約】を行うということなんです」
『……でもさ、その仕様って結局ドキュメント頼りなんでしょ？』
「ライブラリの中身が見られないときには特にそうだね。見られたとしても
全部追っていくのは不可能に近いし」
『……その契約、破られたとしたら？』
「そう、そこが一番の問題。コントラクトは仕様書、つまりドキュメントや
コメントによって成り立つわけだけど、それはいわば口約束」
『その通りプログラムが動くかどうかは別だもんね』
「そこでアルゴリズム関数を作る側に立ち返ると、次のふたつをちゃんと守
る必要がある、ということがわかると思います」

・関数仕様で全ての場合を網羅する。
・関数仕様を正しく守る関数を作成する。

『ってゆーかそれは当然じゃないの？』
「火美ちゃんは、前回の１０倍する関数を作るとき、オーバーフローのこと
考えた？」
『う”……つまりそれは〈関数仕様で全ての場合を網羅する〉を守ってない
ってことね』
「そういうこと。まずこれが重要。この仕様がちゃんとできてないってこと
は契約書に不備があるってこと」
『それって、使う側が、こんな関数使っちゃいけない、ってことなんじゃな
い？』
『それはある意味正しいね。まぁ逆に言うと、その関数は使われないってこ
となんだけど』
「それじゃ意味ないね……結局ちゃんと仕様を決めないといけないってこと
ね」
『そういうこと。で、その仕様通りの関数を作ります。それがすべて。たと
えば』

・入力：整数１ 
・出力：整数１ * 10 
　　　　ただし、整数１が 214748364 より大きい時は未定義

「って書いておけば、最初の」

int TenTimes( int p_i )
{
    return p_i * 10;
}

「のままでＯＫ。あ、もちろん負の数は考えてない場合の話だけど」
『未定義って？』
「どうなるかわからない、ってこと」
『確かにね……』
「これはこれでコントラクトは成立しているんだけど、使い勝手は悪いから
少し変えてみます」

・入力：整数１ 
　　　　ただし、 214748364 より大きい値は入力不可
・出力：整数１ * 10 

「こうした場合、一応前のままでも問題なし」
『問題なし？　入力不可なんでしょ？』
「入力不可だけど、入力されちゃった時のペナルティについては仕様に書か
れてないから」
『されたら変な数が返されるだけ、ってことね』
「で、逆の視点で、このコントラクトが守られているかチェックすべき、
っていうことも言えます」

#include <assert.h>

int TenTimes_WithAssert( int p_i )
{
    assert( p_i <= 214748364 );
    return p_i * 10;
}

『それがこの assert() 版ってわけね』
「 assert() はプログラム上〈絶対にあり得ないこと〉をチェックします。
〈入力不可〉の値はその〈あり得ないこと〉だから」
『 assert() でチェックするわけね』
「コントラクトそれだけだとただの口約束だけど、こうして assert() を使
えばそれをプログラムとして成り立たせることができます」
『そか、 assert() がなかったら、〈入力不可〉でも渡せちゃう、でも 
assert() があれば止まっちゃうからどうしようもない、と』
「そういうこと。こうすれば、渡す前に必ずチェックするでしょ」
『 assert() が、使う側にそれを強制する、それがコントラクトを守らせる
ってことになるわけか』
「この、コントラクトを〈口約束〉から〈実効能力のある約束〉に置き換え
ることが非常に重要になるんです」

/*
    Preview Next Story!
*/
「というわけで、次回も引き続きコントラクトの話です」
『ちょっとコーディングとは違う話だよね』
「そうだね、プログラム全体の考え方かも」
『でもさー、関数って、ただ作って使うだけじゃダメなの？』
「家を建てる時に、耐久試験をしてない鉄材を使って欲しい？」
『う”……確かに』
「というわけで次回」
＜ Version 13.04 テストプログラム ＞
『につづく！』
「というわけで次回は耐久試験の仕方についてです」
『プログラムにもあるの？』
「実はあるんです」


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

・ほとはー１話追加予定
　三人合体ホットハーブに７の８を追加予定。

・KAB-studio.h 縮刷版更新
　KAB-studio.h が２４０号になるので縮刷版を更新します。


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

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
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
*/
////////////////////////////////////////////////////////////////////

