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

    KAB-studio.h


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

    送信日： 2003/07/07(Mon) No.214
    配信数： 3040 ( 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/

2003/06/29 (Sun)
　ほとはー夏コミ版を２話とちょっと。今日はバジルの水着姿。ほとはー本
編は久々ハオシャオ。また録画失敗してた……。

2003/06/30 (Mon)
　テスト仕様書完成。去った人。ほとはー夏コミ版と本編を少しずつ。夏コ
ミ版、まだ８ページ……。 KAB-studio.ROM のダウンロード販売、ベクター
にする？　７月１日でかぶスタ８周年。これからの１年は大きく変化するか
も。

2003/07/01 (Tue)
　テスト始めたらバグがいっぱい。 Struts Tastcase for JUnit を試して
みる。帰ってからほとはー夏コミ版と本編を。すてプリ的魔法世界とほと
はー的魔法世界。

2003/07/02 (Wed)
　テストひたすら、バグひたすら。絶対パスでも相対パスでも、 \ でも / 
でもパスを解決する方法。 File#getCanonicalFile() 。豆腐でダイエッ
ト。そしてデータベースとお仕事の内容。「トラックナンバー」。

2003/07/03 (Thu)
　前に作ったプログラムがバグってた。Struts TestCase for JUnit はイレ
ギュラーなデータを簡単に試せるのがいい。横浜でバッグとか購入。竹ござ
失敗。みんなのうた「笑顔」がいい感じ。謎のアクセス。そして VB 的
データベースアクセス。

2003/07/04 (Fri)
　バグを取ったらまたバグが。 Java で exe が作れたらなぁ。メロンブッ
クスで買った入院患者クランケちゃんが大ヒット。かなりバカだ。今晩の予
定。

2003/07/05 (Sat)
　ほとはー夏コミ版を１ページちょっとだけ。ややダメ気味？　冬コミはも
っと早くからしよう。ミルモでポン！がいい感じ。メロンブックスのポイン
トカードと銀だこのポイントカード。


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

■　第八章　朱と碧　−２−

　階段を下りたところに、横へと伸びる通路があった。人一人がやっと通れ
る通路の脇に煌々と光る炎がある。が。
「本物じゃない……」
「炎を遣う力は、この村じゃみんな持ってるからな」
　答にはなっていなかったが、おそらく雅樹が作ることのできる炎と同じも
のなのだろう。
　通路を抜けると、広大な空間が現れる。ごつごつとした岩々が囲む、直径
５０メートルほどの空間。
「！！……」
　泉……と呼んでいいのか、床のほぼすべてを占める円形の穴から、炎が燃
えさかっている。
「これも……？」
「触るでない。この火は人を選ぶ」
　声をした方を見る。立ち上る炎の中から老婆が現れる。
「お久しぶりです、赤葉様」
　礼儀正しくお辞儀をした雅樹にあわせて舞も礼をする。
「そなたは？」
「碧き泉……水を司る泉の守護者を務める、結白舞といいます」
「私は梢赤葉（こずえせきは）。この村の長をしている」
　そして視線を雅樹に向ける。
「今日はなんの用じゃ」
「他の泉の情報、ないか？」
「何かあるのか」
「１年後……じゃないか、それより短いだろうけど、力が生まれるらしい。
それを止めるためには４つの泉の力が必要だそうだ」
　真摯に説明する雅樹、それを落ち着いて受け止める赤葉。
　そう、赤葉様は、なんか不思議な感じがする……威厳、よりも棘がない、
安心のできる雰囲気、かといって弱々しく感じさせない強さ……。
「書庫を確認せねばならんが、おそらく文献はあるまい。この村は下界から
隔離されておるからな。だが」
　赤葉はゆっくりと振り向き、再び炎の中へと入る。よく見ると、穴の中央
には道が造られていて、その上を歩いている。宙に浮いているわけではなか
った。
　が、炎が立ち並ぶ中に入っていく様は、やはり異能なものを感じさせた。
「……あの方角、碧き泉があるのはそうであろう」
「……あ、そうだ……」
　赤葉が指さす方角、それは舞の故郷、碧き泉のある方角だった。
「それと、この方角とこの方角……おそらくは、こちらが大地、こちらが風
であろう」
　加えてふたつ、方向を指す。
「ここに似た力を、龍脈を通じて感じ取ることができる。おそらくそれが他
の泉であろう」
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『来週で、夏コミ１ヶ月前ってところね』
「そろそろ宣伝も始めた方がいいかも」
『そだね。やっぱりまずは KAB-studio.ROM ？』
「ここの読者さんだとそうなるね」
『まず、これってなんなの？』
「プログラムがいっぱい入った CD-R 。一枚１２００円」
『高！』
「そうかな、プログラミング系の本って」
『いや、確かにあれは数千円レベルだけど……』
「コードが実用的だし、量もあるから」
『１２００円は安い方？』
「だと思う……」
『で、内容は？』
「それは来週！」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 11.14
メモリ確保とデバッグモード

「今回は、前回触れた _malloc_dbg() について解説します」
『 malloc() のデバッグモード版だよね』
「一応そういうことになるかな」
『あ、 malloc() 呼んでても、デバッグモードだと _malloc_dbg() が呼ば
れるから』
「正確にはちょっと違うってことになるね。じゃ、まずは使ってみようか」

void Use_malloc_dbg()
{
    // このデータが入る領域を確保します。
    const char *const DATA = "あいうえお";

    // まず確保。
    char *pch
        = (char *)_malloc_dbg
            ( strlen( DATA ) + 1 
            , _NORMAL_BLOCK
            , __FILE__
            , __LINE__
            );

    // コピーしてから出力。
    strcpy( pch, DATA );
    TRACE( "%s\n", pch );

    // 解放します。
    _free_dbg( pch, _NORMAL_BLOCK );
}

『普通の malloc() よりも引数多いね』
「 malloc() よりも機能が多いからね。ひとつひとつ引数を見ていこうか」

    char *pch
        = (char *)_malloc_dbg
            ( strlen( DATA ) + 1 
            , _NORMAL_BLOCK
            , __FILE__
            , __LINE__
            );

『１番目の引数はおなじみのサイズだね。２番目の _NORMAL_BLOCK は？』
「どの部分のメモリを確保するか指定するフラグだね。これはあとで呼ぶ 
_free_dbg() と統一してあれば大丈夫かな」
『あ、 free() も専用のなんだね』
「第３引数と第４引数はマクロ。これは C++ 言語そのものが持ってる特殊
なマクロで、 __FILE__ はファイル名、 __LINE__ は行番号に置き換わりま
す」
『？？？』
「簡単に試してみようか」

void Use_FILE_LINE()
{
    TRACE( "%s\n", __FILE__ );
    // C:\Program\StringTest\StringTestDlg.cpp
    TRACE( "%d\n", __LINE__ );
    // 122
}

「この関数の置き場所が StringTestDlg.cpp の 118 行目ならこんなふうに
なるはず」
『んー……』
「つまり、コンパイルするときにプログラムの中に __FILE__ や __LINE__ 
を見つけたら」

    TRACE( "%s\n", "C:\Program\StringTest\StringTestDlg.cpp" );
    // C:\Program\StringTest\StringTestDlg.cpp
    TRACE( "%d\n", 122 );
    // 122

「に置き換えられて、それからコンパイルされるんです」
『あ、そっか、マクロだから置き換わるんだ。それが……』
「 __FILE__ だったら __FILE__ が書かれているファイルのフルパス、 
__LINE__ だったら __LINE__ が書かれてる行の行数に置き換わるってこ
と」
『さっきのも置き換わるんだ。でも、これが何に使われるの？』
「たとえば、さっきの Use_malloc_dbg() で、 _free_dbg() の行をコメン
トアウトしてみて」
『そんなことしたらメモリリークするんじゃない？』
「わざとさせてみるの」
『あー。ほい』

Detected memory leaks!
Dumping objects ->
C:\Program\StringTest\StringTestDlg.cpp(127) : 
{68} normal block at 0x00421690, 11 bytes long.
 Data: <           > 82 A0 82 A2 82 A4 82 A6 82 A8 00 
Object dump complete.

『あ！　パスと行番号！』
「そう、ここで出力するために渡してるんです」
『そっか、これを見ればどこでメモリリークしたかがわかるんだ！』
「 __FILE__ と __LINE__ は普通にプログラムの中で使えるから、便利そう
ならどんどん使ってもいいかも」
『あれ？　 malloc() を使った時って……』
「そのときには自動的にこのふたつを渡してくれるから」
『ってことは、普通に使っててもこの情報は出るんだ』
「そういうこと。いちいち __FILE__ と __LINE__ を渡してたら大変だから
ね。で、 _malloc_dbg() にはデバッグ用に様々な機能が入ってます」
『今のメモリリークがわかるのもそうだよね』
「そう。見方は Version 11.09 ( No.209 ) を参照ってことで。でも、その
他にもデバッグ用の機能があるんです。 _malloc_dbg() で取ってきたアド
レスを直接見てみて」
『ほい。ブレークポイントで止めて、アドレス見て、メモリウィンドウで表
示っと』
「メモリウィンドウを見ると、こういうふうになっていると思います」

                                                        FD FD FD FD
CD CD CD CD CD CD CD CD CD CD CD FD FD FD FD 
↑返ってきたアドレスが指してる場所。

『ん？　どういうこと？』
「えっと、まず _malloc_dbg() で確保したメモリ領域は」

CD CD CD CD CD CD CD CD CD CD CD 

「って感じに 0xCD が各要素に入れられます」
『 0xCD ？』
「そう。こうすることで、そのポインタが _malloc_dbg() で作られたのか
どうかとか、使う前に何か書き込まれてないか、とか調べる事ができま
す」
『使われる前？』
「プログラムが複雑になると、どっかよくわかんないところを経由してポイ
ンタを返したりするから、そういう時に」
『途中で変えられたりしてないか調べる時に使うわけね』
「そういうこと。で次に前後の FD について。 _malloc_dbg() は、実は指
定されたサイズのメモリは確保しないんです」
『え？』
「指定されたサイズよりも、前４バイト、後ろ４バイト、合計８バイト多め
にメモリを確保するんです」
『それが』

                                                        FD FD FD FD
CD CD CD CD CD CD CD CD CD CD CD FD FD FD FD 

『の FD が入ってる場所のこと？』
「そういうこと。この余分に作られた場所には 0xFD が入れられます。これ
は、配列のサイズを超えて書き込んだかどうかを調べるために使います」
『ってゆーと』

    char ch[10];
    ch[10] = 'A';

『みたいなこと？』
「そうそう。 Version 6.14 ( No.114 ) の【バッファオーバーフロー】を
検出するための機能なんです。実際にこれを試してみます」

void Use_malloc_dbg_overflow()
{
    // このデータが入る領域を確保します。
    const char *const DATA = "あいうえお";

    // 小さく確保します。
    char *pch
        = (char *)_malloc_dbg
            ( strlen( DATA ) - 2    // ここ。
            , _NORMAL_BLOCK
            , __FILE__
            , __LINE__
            );

    // コピーしてから出力。
    strcpy( pch, DATA );
    TRACE( "%s\n", pch );

    // 解放します。
    _free_dbg( pch, _NORMAL_BLOCK );
}

『 - 2 してあるから入りきらないわけね。じゃ、ビルドして実行。げげ』

Debug Error!
Program ...(略)
DAMAGE: after Normal block (#86) at 0x00421690

『ってダイアログが出た』
「 _free_dbg() は、メモリを解放するときに前４バイトと後ろ４バイトを
見て、それが 0xFD じゃない場合にはこういうエラーを出すんです」
『それでオーバーフローをチェックするわけね』
「あともうひとつ、 _free_dbg() は解放したら次のように 0xDD を入れま
す」

                                                        DD DD DD DD
DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD 

『これの意味は？』
「これは、解放した後に使ったときにそれがわかるように。たとえば」

    // 解放します。
    _free_dbg( pch, _NORMAL_BLOCK );
    // もう解放したけど使っちゃったりとか。
    TRACE( "%s\n", pch );

「って、本当はしちゃいけないんだけど _free_dbg() を呼び終わったポイ
ンタを使ったときとか」
『これをするとわかるの？』
「はっきりわかるわけじゃないけど、こうしておけば解放済みのポインタ
をもう一度使った時に」
『わかるものね。文字列消えてるんだから』
「というわけで、 _malloc_dbg() には色々なメリットがあるんです」

/*
    Preview Next Story!
*/
『何もしなくても勝手にこういうのできてるって便利ねー』
「次回は便利じゃない場合の話」
『げげ』
「 CString を使わないで文字列をくっつけたりとか」
『いつか、 _malloc_dbg() を自分で作ってみようとか言わないよね』
「……」
『あのー……』
「というわけで次回」
＜ Version 11.15 文字列配列の拡張 ＞
『につづく！』
「……僕作れないし」
『うっ』


////////////////////////////////////////////////////////////////////
/*                ２００３年７月１４日（月）の更新                */
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 - 2003 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/
////////////////////////////////////////////////////////////////////

