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

    KAB-studio.h


    (C)KAB-studio 1999 - 2001 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com

    送信日： 2001/07/09(Mon) No.115
    配信数： 3770 ( Mag2 + Pubzine )
＊    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine ( URL: http://www.pubzine.com/  ID: 590 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
/*                ２００１年７月９日（月）の更新                  */
http://www.kab-studio.com/

・更新なし
　更新の次はお休み。ホットハーブはいつになるんでしょ。


////////////////////////////////////////////////////////////////////
/*                        チョー普通な日記                        */
http://www.kab-studio.com/nikki2/

2001/07/01 (Sun)
　祝・かぶスタ６周年！　あれからかぶスタも変わった……。メルマガ配信
は９月から。名刺型ＣＤ−Ｒ。そしてテレビ色々。まみむめもがちょはビジ
ネス面で有名かも(汗)。

2001/07/02 (Mon)
　月に１回、派遣元へ。ツール作ってアカウント作ってもらって。料理本購
入。 CG Gallery が大量ヒット！　ぼーるの写真と名刺入れが届く。ぼーる
……。

2001/07/03 (Tue)
　パワーポイントでいきなり資料作り。そして電話取り始め。色々しなきゃ
ね。家で Java メルマガ。イワシ大爆発。なぜか会社の PC 速い。そして
NT 関連のお勧め本……はあんまないらしい(泣)。

2001/07/04 (Wed)
　大変そうな課題。これをそんな早く！？　でもある程度完成。 _tcsstr()
とか使ってます？　電話応対、辛い……。ちょびっツ２巻購入。夏の新番組
はまーまー？　 Java メルマガもこつこつと。

2001/07/05 (Thu)
　ツール作成は、細かい部分のクラスライブラリ化へ。電話応対も結構いい
感じに。そしてソルパック組の飲み会へ〜。わてはコスプレしてそう(爆)。
なぜか高い某ページ。

2001/07/06 (Fri)
　いきなりクラスの相互参照の問題。帰ったらいきなり部屋の模様替え。そ
して寮の話。結構いいとこよ。フルーツバスケットは期待以上にいい感じで
す。そしてつっこまず。

2001/07/07 (Sat)
　豚汁を作り散歩に行きビデオテープ買ったりとゆー優雅な土曜日。家では
Java で始めるオブジェクト指向プログラミングの準備。そして昨日の大ぼけ
質問、クラス相互参照の問題は解決。何やってるんでしょうねー。


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

■　第一章　予言と運命　−８−

　犬の背を突き破った槍は、廊下の天井を砕いて破片をまき散らした。宙に
漂う破片に吹き出した鮮血が張り付いていく。肩の前からも勢いよく吹き出
していたが、その返り血を浴びるほど舞は近くにいなかった。
　距離は十分ある、傷は十分深い。安心感から、舞はその場にしゃがみ込ん
だ。犬も、左前足を震わせたかと思うと、そのまま前のめりに崩れていっ
た。地響きがほこりを舞上げた。
「お互い一生懸命やったんだから、恨まないでよね」
　そんな風に話しかける余裕が舞にはあったが、相方にはないらしく、相変
わらず野太い声を上げているだけだった。その吠え声は、悔しさがにじみ出
ているとも取れるが――まだ失ってはいない何かを感じさせていた。
「……まだやろうっていうの？　あたしはいやよ、そんな死ぬまで戦うなん
て古い考え方」
　犬は立ち上がれない、そう確信する。完全に肩を貫通していた。犬が単に
巨大になっただけなら、左肩が完全に砕けたはずだ。骨がなければ、動きよ
うがない。両足を出して床に後ろ手を着いて、まだ弾む息をゆっくりと押さ
え込みながら、警察なりなんなりが来るのを目の前の怪物と一緒に待つつも
りだった。
「……え？」
　だが、見ている前で犬は、よろめきつつ立ち上がった。左半身を真っ赤に
染めつつも、その傷は小さくなっているように感じられた。事実、出血はも
うしていないよう見えた。少なくとも吹き出すということはなく、また犬も
比較的元気そうだった。
　それを証明するかの如く、犬は大きく吠えた。まるで狼の遠吠えのよう
だった。とりあえず毛並みが茶色と白ではあるが。
「もしかしたら狐かもしんないわね」
　そんな軽口を言うだけの体力しか残っていなかった。まさかこれほどまで
に回復力が高いとは思わなかった。
　完敗、だった。
「そりゃそうよね、あたしは全然努力してなかった。今日ここにいるのだっ
て……運命かもしれない」
　生まれてくるのも運命なら、死ぬのも運命。私は運命と戦ってきたんじゃ
ない。逃げてきたんだ。だから今ここで、その運命に死の宣告を告げられよ
うとしている。
　犬が、舞を睨み付けた。舞は力無く下を向いた。
　涙が、頬を伝った。
『橙炎連燃！』
　舞は振り向いた。涙をたたえたその瞳の向こうに立つ青年――髪はぼさぼ
さ、黒いジャケットを羽織り、その体の周囲に五つの炎が浮かんでいる。
『燃炎連激！！』
　その言葉と共に、五つの炎が揺れて、飛んでいく。舞の頭上を越え、自由
な奇跡を描いて五つ同時に犬へと突っ込んでいき、炸裂した。炎が体全体を
包み込み、叫び声を上げた。
「すごい……」
　単純に、そう言葉がついて出た。自分と同程度か、それ以下かもしれな
い。でも、そう言葉が出ていた。
「立てるか？」
　舞はすぐ後ろに立つ青年を見上げた。しゃがんでいると、さらにその背の
高さが際だって見えた。汚いと言えば汚いが、ラフと言えばラフな姿を舞は
まじまじと見ていた。
「え」
　何も応えなかったからか、ふと気づくと、舞は抱きかかえられていた。
「これ持ってな」
　青年が渡した空の水筒を胸に抱える。そして、未だ燃えさかる、だがそれ
ほどダメージを負っているようには見えない犬に向き直った。
「言っとくけど、そんなに弱い奴じゃないよ」
「解ってるさ、だから逃げる。目眩まし食らわせるから目をつぶってろよ」
　そう言ってから、右手を掲げた。左手だけで舞を抱きかかえる腕力は相当
なものだろう。
『黄炎閃煌！』
　その言葉と共に、青年の左手から肘にかけてを黄色い炎が包み込んだ。す
ぐ側の光があまりにもまぶしすぎて、舞は顔を背けた。勢いでそのまま青年
の胸の中に顔を埋めた。
　厚い胸板と汗の匂いを感じた。
「目をつぶってろよ」
　何やってるのかな、あたし……そう思いながら、舞は目をつぶって、青年
の胸の中に入ろうとした。
『閃炎瞬光！！』
　まぶたの裏が明るく光り、犬の鳴き声が聞こえ、そして、体が揺れはじめ
た。
「化学実験室に行って！」
　とっさに思いついて、舞は叫んだ。
「どこだそりゃ」
「渡り廊下渡って一階！」
「おっしゃ」
　青年はさらに加速していった。
　どーでもいいけど、乗り心地悪いわ、これ。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『ずばり、いくら？』
「隔週発行で、月４００円らしいよ」
『それって安くない？　Ｃマガジン１３００円だもの』
「Ｃマガの３分の１も内容あると思う？」
『う”……でもでも、プログラミングの解説書ってどれも高いし』
「やっぱそういうのの足下にも及ばないでしょ」
『う”……って、あたしと水希ちゃん、今日は言うこと逆じゃない？』
「…… #pragma twice だって、悪くないのに……」
『いじけてる理由はそれか……』
http://www.kab-studio.com/
_______________________________________________________________[KCM]


////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.com/Programing/PragmaTwice/

　Version 6.15
バグをコンパイルタイムエラーで防ぐ！

「ここまで演算子関係を中心にありがちなバグを紹介してきたけど、その最
大の理由は〈見つかりにくい〉から」
『確かに、前回の普通のオーバーフローとか、エラーになんないよね』
「そう。演算子を使った処理は、エラーが出にくかったり、なんでもでき
ちゃったり、関数を呼ぶわけじゃないからブレークポイントのセットとかで
きなかったり、と色々問題が起きやすいんです」
『そういうのの対処法ってことで、起きやすいバグの例ってのを見てきたん
だよね』
「そうなんだけど、でもそれだけじゃダメ。今までの例を知ってても、役立
つのは〈あれ、おかしい、どこが問題？〉って場面だけ」
『？　じゃー役立たない場面って？』
「〈あれ、おかしい〉にならない場合」
『あ、そういえば、問題が出てこなかったら、バグが見つからないから探し
ようがないってゆーか、探すことすらないんだもんね』
「だから、今回からは〈いかにバグを発見するか〉について紹介していきま
す。ただ……」
『ただ？』
「ここからはちょっと大変。バグが見つかりやすいように常にプログラムを
組んでいくことになるから、コードを書く手間が増えるんだよね」
『病気になる前に健康食品毎日食べるようなもんね』
「それに、実際にバグにはならない状況でも〈バグがある〉って状況になっ
てうまくいかないとかあるんだよね」
『うまくいかないって？』
「たとえばコンパイルが通らないとか」
『げ！　それってかなり大変じゃない？』
「今回は、その大変な方法について教えます」
『なんか大変そう……』
「で、その今回教えることは、バグをコンパイルエラーで防ぐ方法」
『バグをコンパイルエラーで？』
「そう。典型的な例が、 Ver 6.12 ( No.112 ) で紹介した if の例」

void CDebugDlg::OnButton1() 
{
    int i = 0;
    if( 0 = i )
    {
        TRACE( "Hit!\n" );
    }
}

『そうそう、 == を = って書いちゃったときに、こうしとけばコンパイル
エラーになるんだよね』
「こういうふうに、色々なバグの原因をコンパイルエラーとして検出するこ
とができるわけ」
『できるといいことって？』
「さっき言ったでしょ、ランタイムエラーとかは、エラーが見つからなきゃ
どうしようもないって」
『それに対してコンパイルエラーは……確実にエラーって出てくる！』
「そゆこと。バグは、バグの原因になってる部分が実行されないと見つから
ないし、実行されても、変数の中身とかの状況でバグが出なかったり」
『バグが出てても気付かないこともあるよね』
「そうそう。コンパイルエラーなら、すべてのコードがチェックされるし、
変数の場合分けとかと無縁だから確実なんだよね」
『でも、そういう変数の中身とかと無縁ってなんか不思議』
「そうだね、たとえば if( i == 0 ) と if( i = 0 ) を比較すると、実は
i が 0 以外の時は結果が一致するんだよね」
『げ、そういえばそうだ。 if( i == 0 ) は i が 0 の時だけ当たって、そ
れ以外は全部当たんない。 if( i = 0 ) は、 i が 0 になって、その 0 が
if にかかるから、絶対に当たんない。結果が違うのは 0 の時だけね』
「だから、ものすごく変な言い方をすると、 i が 0 以外の時は、バグじゃ
ない、って言えちゃうわけ。結果的にはね」
『……でもやっぱバグなんでしょ？』
「もちろん。どんなにその可能性が低くても、違う結果が出る可能性がある
のならそれはバグ。そこでコンパイルエラーの出番」
『 if( 0 == i ) は普通に動くけど、 if( 0 = i ) はコンパイルエラー』
「こうすることで、確率的に発生するバグを、事前に見つけだして直すこと
ができるわけです」
『 0 以外の時だろうがなんだろうが、コンパイルに通らないんだもんね』
「そう。また変なこと言うけど、こうするってことは、 0 以外の〈正しい
結果〉が出ている状況も、間違いだって否定していることになるんだよね」
『？？』
「実行結果だけ見れば、 0 以外に関しては if( i == 0 ) と if( i = 0 ) 
は同じだったでしょ」
『そだね』
「でも重要なのは結果じゃない、ってこと。プログラマーが望むのは 
if( i == 0 ) という処理であって、その結果じゃないわけ」
『つまり、 0 以外かとかそうじゃないかとか関係なく、 if( i == 0 ) 
ってのをプログラマーが考えてたんだから、そういうコードじゃないとダメ
ってこと、かな？』
「そういうこと！　結果が同じだろうが似ていようが関係なくて、プログラ
マーが望むコードになってるかどうかが重要なわけ」
『だから、望むコードじゃないとコンパイルエラーになる if( 0 == i ) の
書き方がある、ってことね』
「ただ……」
『ただ？』
「たとえば元々あるプログラムの if( i == 0 ) を if( 0 == i ) の書き方
に変えていって、コンパイルエラーが出た部分を直していったら、想像と違
う結果が出なくなった、とかってこともあるんだよね」
『……それって、 if( i = 0 ) で常に当たらない、ってのが偶然うまくい
くようになってたってこと？』
「そういうこと。こういう場面に出遭って、原因が分からなかったりすると
辛いんだよね」
『でもそれって変じゃん！　絶対にヘン！　間違ってたのが運良くうまく
いってるだけじゃない』
「そうなんだけど……、何十時間チェックしても原因が見つからない、電車
も終わってもう帰れない、寝てもいないしごはんも食べてない、もういっそ
のこと元に戻そうか、〈うまく動いているプログラムには手を入れるな〉っ
て格言もあるし……」
『うわーぐろぐろもーどだ』
「とは言っても、それはその場しのぎ。後で少し手を入れる時とかにまた地
獄見るのは目に見えてるから」
『結果が同じならいい、ってことはないのね』
「やっぱり、プログラマーがどうしてそうなってるのか気付いてないとダ
メ。結果は同じでも、コードの書き方とかが違うと後で手を入れた時に想像
と違ってきちゃうから」
『そのためにも、どんなに大変でもちゃんとしとかないとダメってことね』
「そゆこと。プログラマーが想像した通りのプログラムになっているよう
チェックする、プログラムミスでそうなってなかったらコンパイルエラーに
なる」
『そういう書き方が、〈確率的に発生するバグ〉を防ぐことができるってこ
とね。あれ？　でも、水希ちゃん、今の  if( 0 == i ) は使わないって
言ってなかったっけ』
「うん、そうなんだよね。 == か = かは、見た目にすぐ分かる間違いだか
ら、コード眺めるだけで見つかるんだよね。だから見やすさ優先かな」
『見た目にすぐ分からない間違いってあるの？』
「もちろん。たとえばキャスト。まずはやっちゃいけない例から」

void GetInt( int *p_piRet )
{
    *p_piRet = 100;
}

「って関数がある時に」

void CDebugDlg::OnButton1() 
{
    const int i = 1;
    GetInt( (int *)( &i ) );
    TRACE( "%d\n", i );
    // 1
}

『これって、いわゆる const を剥がすってやつ？』
「そう。 const なはずの定数値を無理矢理変数にして値を格納しようとし
てます。それに実際には剥がせてないし」
『ホント！　1 のままだ』
「こういう単純な定数値の時には、下の TRACE() の i が直接 1 に置き換
わるから、途中で中身が変えられても実際には変わらないんだよね」
『なんだか #define みたい』
「まー、 const int は #define の代わりに用意されたっていうのもあるか
ら、こういう機能になってるのかも」
『でもさ、こういうのって普通しないでしょ』
「どうかなー。新しく使う関数とかで意味不明な型が引数になってたりする
と、ついこういうことしちゃうと思うよ」
『でもどう typedef されてるかとか調べれば大丈夫だよね』
「もちろん。重要なのはそこ、つまり無理なキャストはしちゃダメってこ
と。ちゃんと型が分かってれば、キャストはまずしなくていいし」
『そなの？』
「ほとんどね。キャストせずに渡せてるのは正しいプログラムの証拠、か
な。あ、でも WPARAM みたくキャストが必要な時もあるけど」
『メッセージ使う時の話ね』
「 Ver 5.27 ( No.092 )でやったね。こういう時は仕方ないから、せめて
reinterpret_cast とかを使いましょう」
『これ、やっぱ使うといいんだ』
「キャストの目的が決まってるからね。さっきの const 剥がすのにこの
reinterpret_cast は使えないでしょ」
『うん、コンパイルエラーになるね。そっか、これもコンパイルエラーでバ
グを防ぐことになるんだ』
「そゆこと。ま、とにかくキャストはできるだけしない、ってことが重要。
これもコンパイルエラーがきついだろうけどね」
『まずは型を調べましょう、ってことね』
「あと今のにちょっと関わるけど、 const も重要」
『 const ってさっきの定数値とかだよね』
「定数値もそうだけど、それよりもポインタや参照と一緒に使う時の方が重
要かな」
『 Ver 4.12 ( No.062 ) でやったのだよね』
「そう、なんだけど、ここで深く突っ込んじゃうとちょっと難しい話になっ
ちゃうからこれは次回。ここで重要なのは〈気に掛ける範囲〉の話」
『範囲？』
「 const は置いといて、変数のスコープは憶えてるよね」
『変数が使える範囲でしょ。たとえば関数の中で作ったら関数の中でしか使
えない、とか』
「そうそれ。たとえばこういう例」

void CDebugDlg::OnButton1() 
{
    int i1 = 0;
    TRACE( "%d\n", i1 );
    // 0
    i1 = 100;
    int i2 = 200;
    TRACE( "%d, %d\n", i1, i2 );
    // 100, 200
}

『なんか、すんごーく普通の例に見えるんだけど』
「そう、ものすごく初歩的な例。ここで重要なのは、変数の使える範囲」
『両方とも関数の中でしか作ってないから、関数の中でしか使えないね』
「それだけじゃないよ。 i2 が作られるより上の行じゃ i2 は使えないで
しょ」
『当たり前じゃん。あ、これが〈範囲〉ってこと？』
「そう、これが範囲。こうやって後の方で作ることで、 i2 を事前に使うと
コンパイルエラーになるようにすることができるんです」
『コンパイルエラーになんない例って？』
「早めに i2 を作って、誤って書き換えちゃったとか」
『なるほど』
「でもこうすれば、書き換えたらコンパイルエラー。こういうふうに、変数
を後の方で作れば、その変数に対して〈気にかけなきゃいけない範囲〉が
ぐっと狭まるでしょ」
『〈気にかけなきゃいけない範囲〉ってなんかヘン』
「でも、安全なプログラミングにはそこが重要なんです。というわけで次回
に続く！」

/*
    Preview Next Story!
*/
『バグってやーね、出たりでなかったり』
「でもお金出してもらって、運が悪かったね、じゃまずいでしょ」
『お金出してもらってなかったら？』
「……これはここだけの話だけど……」
『うんうん』
「さっき言ったようにバグを見つけるためには手間がかかるから……」
『 reinterpret_cast とか書くの面倒だもんね』
「これをサービスと考えるか、必要なコストと考えるか……」
『こういうのに気を付けるってことがそれなりに大変ってことね』
「というわけで次回」
＜ Version 6.16 気に掛ける範囲を狭める！ ＞
『につづく！』
「フリーのアプリにそれだけのものを期待するのは酷でしょ」
『 Linux とかも？』
「う”……」


////////////////////////////////////////////////////////////////////
/*              ２００１年７月１６日（月）の更新予定              */
http://www.kab-studio.com/

・Java メルマガが案内ページ登場？
　秘密裏に計画されていた KAB-studio 初の有料コンテンツ「 Java で始め
るオブジェクト指向プログラミング」メールマガジンの案内ページが登場す
る……予定（汗）。会社からちゃんとお給料もらってるのに、
「守銭奴」（爆）とまで言われたとゆーのにそれでもやるというのか君
は！？


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

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.com/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.com/Freeware/index.html#MailMagazine


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

    (C)KAB-studio 1999 - 2001 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/
////////////////////////////////////////////////////////////////////




