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

    KAB-studio.h


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

    送信日： 2001/07/23(Mon) No.117
    配信数： 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/Comic/HotHerb/


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

2001/07/15 (Sun)
　ぷらとわ２話書いたり、親子丼がスクランブルエッグ丼になったり。基本
情報技術者試験の願書を送付。お金のために(爆)。北条時宗、とうとうお兄
さんが〜(泣)。

2001/07/16 (Mon)
　サービスって「自動」だと起動時に実行されるんですねって何をいまさ
ら。サービスでの他の PC へのコピーで混乱。ホットハーブをちょっと。親
子丼また失敗。

2001/07/17 (Tue)
　初の残業。でもちょっとだけ。色々複雑なんで、残業申告難しいかも？
生姜焼きは普通に食べるのとなんか違う。 PDA どれがいい？　そして
daemon は神様なのです。

2001/07/18 (Wed)
　今日もちょこっとだけ残業。仲介役って大変ですねー。帰りにコミックス
大量購入。ちょっと英会話。そしてデーモンへの怒り(爆)。

2001/07/19 (Thu)
　今日はかなり残業。でもなぜか楽しい(爆)。まだあんま経験してないか
ら？　新モスバーガーは美味しかったです。 Java メルマガ審査通過、ホン
ト色々やるよね……。

2001/07/20 (Fri)
　祝日を怠惰な生活で過ごしてみたり。午前中は関内のカレーミュージアム
へ！　お昼までに３食食べるしそのために７０分並ぶし。ついでに桜木町の
ランドマークタワーへも。なんで長芋って高いの？　そして謎の広告とダメ
な自分。

2001/07/21 (Sat)
　マーボー豆腐作ったりホットハーブの準備したりぷらとわ書いたりと、
色々しつつだらだらしたり。でもこれが自分のリズム？


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

■　第一章　予言と運命　−１０−

　犬はのそのそ歩いていた。それでも、その体に比べて廊下が細いために窓
ガラスを割りまくっていた。ときどき、まだ残っていた生徒が悲鳴を上げて
逃げていくが、犬はそんな者には目もくれなかった。
　鼻をひくひくさせながら首を振る。あれーさっきは見つかったのに今度は
どこ行ったのかなーととぼけた顔で考えているのかもしれない。
「やっほー」
　そののんきな声に犬は振り向く。雅樹はのんびりとした顔で手を振ってい
た。
「んじゃ」
　雅樹はダッシュした。しかも犬に向かって。犬は前足を振り上げるが、雅
樹はその速度を落とさない。振り降ろされる鋭い爪を難なく躱し、そのまま
大胆不敵に犬の脇を走り抜ける。犬は吠えつつ振り向き、教室と廊下の間の
壁を破った。
「いーぬさーんこーちら、てーのなーるほーへ」
　有言実行、雅樹は手を叩き、犬は青筋立てて雅樹の方へと走っていく。当
然犬の足と雅樹の足では雲泥の差がある――はずだった。
　だが、雅樹の足はとんでもなく速かった。もちろん差は縮まって来ていた
が、雅樹本人は余裕しゃくしゃくの表情だった。
　犬は雅樹のすぐ後ろへと着き、大口を開けて飛びかかるが、ひょいと体を
躱して雅樹は階段を降りていく。急ブレーキを掛けてめくれ上がる廊下のタ
イル、振動する床。犬は振り向き、コンクリートの冷たい壁を無理矢理降り
ていった。さすがにこの壁は固すぎて壊すことができなかった。
「ホントだわ、あいつ体自体が丈夫なわけじゃないんだな」
　雅樹はまたもや脇を向いて会話する。
「こっちか」
　その会話に促されて二階奥の特別教室へと向かっていた。犬もそれを追っ
て走っていく。
　犬が階段を駆け下りて振り向いたその先には、また特別教室があった。雅
樹はその中へと入り、犬は壁を無理矢理壊して中へと入った。
　部屋の中は一面銀色だった。無数のシンク――化学実験室にあったような
汚いものではない――があり、その全ての蛇口がひねられていた。その部屋
の窓側、一番角に雅樹と舞が立っていた。犬は二人を見つけ、その方を向い
て吠えた。
『蒼炎』
　言葉と共に雅樹の右腕をちょろちょろとした炎が駆ける。
「用意はいいな？」
　命令しないでよ、舞はそう思いながらうなずいた。
　雅樹が指を弾く。青い炎が飛ぶ。それは犬とはまったくかけ離れた方
向――部屋の天井へと飛んでいった。その方向には、無数のスプリンクラー
があった。
　水が噴き出した。天井から滴る水滴が円錐を描き、部屋を、犬を濡らし
た。
「どいて！」
　舞は雅樹を押しのけて、護符を手に取った。
『その内に秘める心を静めよ、無数に飛び散る無垢なる魂、手と手を取り合
い硬く結びつき、一つの大いなる礎となれ！！』
　呪文を詠唱した瞬間、その時は何も起こらない。だが、水が噴き出す騒々
しい中に、少しずつ異質な音が割り込んでくる。何かが打たれるような音
か、ひびが入るような音か……部屋に掛かるもやも湿り気のあるものから乾
いたものになっていく。
　犬はきょろきょろ見回すが、その異変には気づいていないようだった。犬
は異変はないとみなして、二人を睨み付け、少しずつ近づいてきた。
『飛べ、撃ち抜け！！』
　太い注射針のような氷のかけらが四方から飛び、犬の体中に突き刺さっ
た。悲痛な叫び声が学校全体に響きわたった。
『さらに、さらに！　無数の霧氷よ継なぎ合い一つと成りて偉大なる力と成
れ！！』
　犬は体を振り回しその周りに突き刺さっていく氷の棘を振り払おうとする
が、それは思うようには取れなかった。しかも、突き刺さっていく氷の棘
は、矢から槍へとどんどん大きくなっていった。調理実習室は、まるで赤と
青のエアブラシを掛けているようだった。
「えげつないな」
「あんたの作戦でしょ」
「俺は突き刺せなんて言ってないし、穂香もかわいそうだって言ってる」
「解ってるわよ！　もう終わるから……」
　なんでこんなにいらついているのか……自分自身判らなかった。とにかく
今は、目の前の問題を一つずつ解決していくのみだ。
　ふさふさの毛は、まるでハリネズミのように尖っていた。体中に突き刺
さった氷の矢が互いにくっついて、犬の体をほぼ完全に覆っていた。犬はも
う、動くこともままならなかった。
『全てよ、凍てつけ――時までも』
　蛇口も、スプリンクラーも、すでに凍り付き、水を放出していなかった。
部屋中に霜が降り、巨大なオブジェクトがわずかにきしむ音が聞こえる他に
何もない、本当に時が止まったかのような静けさが訪れていた。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『……いないみたいね』
「どうしたの？　きょろきょろしちゃって」
『４コママンガが始まったから、そのキャラが出てきそうな気がして』
「番宣ってこと？」
『そんだけじゃなくて、あたし達追い出されちゃうとか！』
「少なくとも火美ちゃんはないでしょ、それは」
『なんだ良かったー』
「お願いフォローしてー」
『あ、１日くらい、ホットハーブの男の子と代わってもいいよ』
「あう〜。って、彼の名前ってなんていうの？」
『知らない……』
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 6.17
ASSERT の網

「前回は気に掛ける範囲を狭める方法を紹介しました」
『変数の使える範囲を小さくするんだよね』
「そうでした。前回はコンパイルエラーにする方法だったけど、今回はラン
タイムエラーにする方法」
『へ？　ランタイムエラーはまずいんじゃないの？』
「そうじゃなくて、まずいことが起きたときに、それが発見されないのはま
ずいでしょ」
『だからそれをランタイムエラーにする？』
「そゆこと。そこで使うのが、 ASSERT() ってマクロ」
『アサート？　マクロなの？』
「ま、とりあえず使ってみましょう」

void CDebugDlg::OnButton1() 
{
    ASSERT( 1 );
}

『……』
「……」
『……なんも起きないよ？』
「そう、何も起きません」
『なにそれ』
「何も起きないのは、引数が 1 だから。これを 0 にすると……」

void CDebugDlg::OnButton1() 
{
    ASSERT( 0 );
}

『うぎゃっ、ヤバそうなダイアログが出たっ！！』

Microsoft Visual C++ Debug Library

Debug Assertion Failed!

Program: C:\PROGRAM\DEBUG\DEBUG\DEBUG.EXE
File: C:\Program\Debug\DebugDlg.cpp
Line: 180

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
[中止][再試行][無視]

『なんか危なっかしいエラーが……』
「これが、 ASSERT() の機能」
『へ？』
「 ASSERT() は引数が 0 の場合に、こういうダイアログを出して、実行を
一時停止させるんです。だからこれは全然安全な状態」
『つまりヤバくはない？』
「そゆこと。たとえば【無視】ボタンを押すと、何事もなかったように一時
停止が解除されるから」
『あ、普通になった』
「【中止】は実行を停止、[再試行]は ASSERT() が発生した部分を表示しま
す」
『そう言えば、このダイアログにも ASSERT() 呼んでる部分が出てるよね』
「そう、 File と Line が ASSERT() を呼んでるソースファイルと行番号。
これを使っても ASSERT() が呼ばれた場所が分かるわけ」
『でも、これの使い道って？』
「これを使って、バグを網にかけます」
『網に？』
「そう。たとえば……こんな感じ」

void CDebugDlg::OnButton1() 
{
    CString cStr = "ABCDE";
    cStr.SetAt( -1, 'Z' );
}

『ほい。あ、 ASSERT() のダイアログが出た』
「この CString::SetAt() は、 CString の中の文字列の、単語１個を置き
換えるメンバ関数。第１引数の位置に、第２引数の文字を置きます」
『って、じゃー第１引数に -1 ってまずいんじゃない？　あ、だから！』
「そゆこと。【再試行】ボタンで、 ASSERT() 呼んでる場所を出して」

// MFC のソースコードが置いてある場所、 Strcore.cpp
void CString::SetAt(int nIndex, TCHAR ch)
{
    ASSERT(nIndex >= 0);
// 以下略。

『あ、 ASSERT() だ。でもなんか if みたい』
「そう、 ASSERT() はほとんど if と同じように使います。ただ、 if と
違って、停止する条件が 0 、つまり 0 が当たりってこと」
『 if は 0 以外が当たり、ってことは正反対？　確かに nIndex >= 0 って
ことは、これが当たってたら ASSERT() に引っかからないんだもんねぇ』
「だから ASSERT() には〈うまくいく条件〉を書き込む、って憶えて」
『それ以外なら ASSERT() になるよー、ってこと？』
「そゆこと。 ASSERT(nIndex >= 0) なら、 nIndex が 0 以上なら問題な
し、そうじゃないなら」
『こーゆーダイアログが出るんだ』
「ここで重要なのは、みっつ。まずは、こういうふうに〈あっちゃいけない
場合〉を拾うように使います」
『確かに、文字列の位置でマイナスはあっちゃいけないもんね』
「たとえば火美ちゃんがこのメンバ関数を作ろうとしてたその瞬間。引数に
文字の位置を渡してもらおう、って時に、その〈マイナスはあっちゃいけな
い〉に気付いたら、即 ASSERT() を設置！」
『あっちゃいけない、って思ったら即置く？』
「そゆこと。こういうふうに関数を作る時、引数やメンバ変数で〈この変数
の中身、こういう値の時はうまく動かない〉って場合があったら」
『そういう値が来た時に網にかかるように ASSERT() 設置！』
「そういうこと！　よく使う場面は、まず NULL チェック」
『 NULL ってポインタのだよね』
「そう。ポインタを受け取ったら ASSERT( pcDate ) とかって」
『これで引っかかるの？』
「 NULL は 0 、でしょ」
『そういえば Ver 5.11 ( No.076 ) でやったね。で、 ASSERT() は 0 で当
たりだから』
「そゆこと。他に if や switch で〈来ないはず〉のとこに設置するとか」
『どゆこと？』
「これは例を見た方がいいかも」

void GetNumber( int p_i )
{
    switch( p_i )
    {
    case 1:
        TRACE( "1 です\n" );
        break;
    case 2:
        TRACE( "2 です\n" );
        break;
    default:
        // ここに来ることはあり得ない！
        ASSERT( 0 );
    }
}

『つまり引数に 1 と 2 以外が来たら ASSERT() ？』
「そういうこと。こういうふうに、来ちゃいけない場所に ASSERT( 0 ) 
っていうのもひとつの方法」
『なんか面白いかも』
「この辺も、前回言った〈気に掛ける範囲〉を狭めることだからね」
『そっか、あり得ない値とかを ASSERT() に掛けちゃえばそれは気に掛けな
くていいんだ』
「そゆこと。さて重要なポイントその２。 ASSERT() は起きる可能性がある
ことには使っちゃダメ」
『起きる可能性があること？』
「たとえばファイルを fopen() で開く時。それが成功したかどうか、とか
はダメだから」
『そりゃファイルがない場合って多いよね。でもなんで ASSERT() じゃダメ
なの？』
「まず、 ASSERT() に掛かると停止しちゃうってこと」
『そっか、それこそ〈使ってたらフリーズ！〉ってことになっちゃうんだ』
「言い換えると、 ASSERT() はプログラマー向け、ってこと。プログラマー
が〈あっちゃいけないこと〉を取り除くためだけに使うようにしてね」
『ユーザー向けじゃないんだ』
「それに、最終的には ASSERT() って機能しなくなっちゃうし」
『どゆことそれ？』
「今言ったように、ユーザーにとっては ASSERT() はなんの意味もないか
ら、公開する時に無効化するんだよね」
『かえってなんか不安……』
「って、そういうエラーには、普通に if で対処して、場面場面で適切な処
理をしておけばいいわけ」
『そりゃそうだね』
「この〈無効化する〉って話は次回にね。で、重要ポイントのみっつめ、そ
れは〈気付かなきゃしょうがない〉ってこと」
『つまり〈あっちゃいけない〉に気付かなきゃ意味なしってことね』
「 ASSERT() ってプログラムを組みながら設置してくものだから、気が付か
なかったり、そもそもまずい状況を知らなかったりしたら、使う場面がなく
なっちゃうでしょ」
『そりゃそうだ。さっきの文字の位置なんかも、忘れたりしそう……』
「それにテストも重要。さっき言ったようにリリースしたあとは ASSERT()
しちゃまずいでしょ」
『ってことは、普通に使ってたら ASSERT() する状況はないってことね』
「で、テストを念入りにして、その状況がない！　ってことを確認しないと
いけないわけ」
『そっか、なんか変なことして ASSERT() する状況になったらまずいんだ』
「もしそれが見つかったら、 ASSERT() しないようにうまくする必要があり
ます。 ASSERT() に引っかからないような値にするとか、 ASSERT() 以外の
方法で処理するとか」
『〈 ASSERT() 以外の方法〉は可能性のある状況、ってことよね』
「そゆこと。テストして ASSERT() したら、それは普通に使ってあり得るこ
となのか、もしくはプログラムミスが原因で ASSERT() するような値にし
ちゃってるか、のどちらか」
『でもそれの区別って難しそう……』
「そうだね、この辺はかなり難しい話になるかも。最初は分かりやすい場面
に絞って使った方がいいかもね」
『さっきの CString::SetAt() みたいにね』
「そゆこと。さて最後に、 ASSERT() は自分で起こせるものってことをちゃ
んと憶えておいてね」
『そーいえば、あーゆーダイアログ出たら、なんかヤバイことで起きたよう
に思っちゃうよね』
「そう思っちゃうけど、実は全然そうじゃないってこと。あとで ASSERT()
の中身見ておくといいかも。見ても難しいと思うけど、普通のプログラム
だって思えると」
『怖くなくなるもんね』
「で、 ASSERT() は MFC で無茶苦茶多用されてます」
『さっきの CString も MFC のクラスだもんね』
「 MFC を使ってると ASSERT() のダイアログが出てくること多いけど、出
てきたらそれは間違った値渡したり使い方が変だったりって理由」
『つまり注意されてるだけ、直せばいいんだよね』
「そういうこと！　 MFC で ASSERT() が出ても、慌てず騒がず原因を探し
ましょう」

/*
    Preview Next Story!
*/
『って、 MFC の中見ても全然わかんないんだけど』
「確かにねー、 MFC って複雑だから自分じゃ解決できないかも」
『げ、そゆもん？』
「深いとこで発生すると、原因が分かんないことも……」
『水希ちゃんが言うんだから、かなり大変なんだね……』
「というわけで次回」
＜ Version 6.18 デバッグビルドとリリースビルド再び ＞
『につづく！』
「ま、人に訊いたりするときは大事でしょ」
『そだね、なんかわけ分かんないエラー、とかじゃないんだもんね』
「掲示板とかで訊くときは ASSERT() ならそうはっきり書きましょう！」


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

・更新なし。
　ま、その次の週には８月表紙壁紙があるからね。


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

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




