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

    KAB-studio.h


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

    送信日： 2005/02/21(Mon) No.295
    配信数： 2003
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

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

・オフラインミーティング参加者募集中
　現在、オフラインミーティングの参加者を募集中です。興味ある方は募集
告知をご覧ください。
[ オフラインミーティング募集告知 ]
http://d.hatena.ne.jp/kab_studio/searchdiary?word=%2a%5b%a5%aa%a5%d5%b2%f1%5d

・ほとはー外伝３に１ページ追加
　三人合体ホットハーブ 外伝３に P.06 を追加！
[ 三人合体ホットハーブ 外伝３ 【ワタシ の キロク】 ]
http://www.kab-studio.biz/Comic/HotHerbA3/index.html

・JavaA2Z をひっそりと追加
　新コンテンツ・ Java プログラミング辞書 JavaA2Z が登場！
　まだ全然中身ないですが、これからこつこつ機能が増えていきますよー。
[ JavaA2Z ]
http://www.kab-studio.biz/Programing/JavaA2Z/index.html

・#pragma twice に広告追加
　ホームページの方の #pragma twice に Google AdSense を追加しました。
　プログラミング辞書、 Codian に続きぷらとわもです。使い勝手はほとん
ど落ちてないと思いますので御了承ください。
[ #pragma twice ]
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

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

2005/02/13 (Sun)
　昨日は夜中までほとはー外伝３描き。今朝は昼１２時起き……。２時くら
いからはまたほとはー外伝３。そのあとはかぶスタのバックアップ。昨日
今日のNスペ・司法大改革が面白かった。そして作って！　そして先生募集
中。

2005/02/14 (Mon)
　朝７時に目が覚めるも１１時に布団から出る。午前中は洗濯。ぷらとわに
バグが……。ヨドバシ川崎店まで歩いていく。処女はお姉さまに恋してる
（以下「おとボク」）の初回限定版を探すもなく……。さらに横浜に行って
ソフマップで中古を発見。13000円で購入。他にもひぐらしのなく頃に解と
A profileを購入。３月一杯は仕事しない予定。そしてリクナビで募集。

2005/02/15 (Tue)
　昨日は深夜５時までおとボク。今日は絵を描きまくり。ほとはー外伝３を
１ページ半。「ネコシタガエーター」のキャラを起こす。派遣元Ａ社から
離職票来る。明日ハローワーク行きます。あと歯医者の予約、高校の同窓会
の連絡とか。オフラインミーティング参加者募集中。参加したい方は
ツッコミシステムかメールで。そして情報科の先生。そして……。そして
非常勤なら？

2005/02/16 (Wed)
　雨の中ハローワークへ。中は意外ときれいだった。再就職の手続きと
失業給付の手続き。後者は厳しかった。けど、給付制限なしにすぐにお金
もらえるかも。過去３ヶ月間、４５時間以上時間外があるとそうなる。帰っ
てからは Java プログラミング辞書の HTML 作成。雲のむこう、約束の場所
を見るもそれほどでもない？　そしてオフ会参加申込みx４。

2005/02/17 (Thu)
　目が痛くて何もできなかった……。Machicianは進まず、代わりにほとはー
外伝３を。ほとはーはみんな演技してくれるからなぁ。高校プチ同窓会の
連絡。そしてオフミ参加申込みx３、計７名。

2005/02/18 (Fri)
　１０時半に起きるもなにもできず。午後１時に父上の店、アンローゼへ。
更新の設定やヒット数増加方法など。９時半に帰ってきてのんびり。オフミ
参加者x１、計８名。

2005/02/19 (Sat)
　Java プログラミング辞書 JavaA2Z スタート。まだアルファ版だけど。
画面遷移を先に作成。 JavaA2Z はぐぐってもヒットしません。#pragma 
twice にも Google AdSense を追加。失業給付が切れるまでのんびりする。
そして確定申告。オフラインミーティング参加者募集中。


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

■　第十一章　ファインダウト社　−２２−

「予算通ったねー」
　会議室で左が言う、その声は明るい。
「それにしてもこの額は……」
　スクリーンに表示された情報に智子は溜息をつく。
「兵器開発予算としてはまっとうな数字だよ。それに、これで政府のお墨付
きが得られたことになるから、これからは自衛隊全軍を相手にする気でない
と」
「自衛隊……」
「そのくらいなんとかなるよ」
「何言ってるんだ、ミサイルの迎撃練習なんかしたことないだろ？」
　少年の軽口に釘を刺す。
「だから、あの人達を呼んだんですか」
「まさか」
　机を指でとんとんと叩く。
「そうか……それが問題なんだ」
「？」
「先生、監視体制は整っているんだよね」
「はい」
　画面が変わる。天地生物科学工業の空撮写真にグラフが重ねられている。
「ここ最近これだけの機材が搬入されています。これから製造されるのだと
すれば、あと１、２ヶ月は掛かると予想されます」
「じゃ、２０日後ってとこかな」
「ずいぶん早いですね」
「いや、別の話」
　机を叩く指が止まり、左はにやりと笑う。
「ナンバーワン、決めてみるかな」
                                      (第十一章 ファインダウト社 完)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
「番組内で質問のあった、奥多摩市のセラフの件って？」
「7月31日に、警視庁管理下の18式セラフがジャックされた事件です」
　リシュネの前に映像が展開される。

Machician 第５話 祭の夜に 連載開始！
[ Machician ]
http://d.hatena.ne.jp/kab_studio/20040823#1093276416
[ Machician＋設定 最新一覧 ]
http://d.hatena.ne.jp/kab_studio/searchdiary?word=*%5BMachician
_______________________________________________________________[KCM]

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

　Version 14.28
再帰呼び出しでフォルダを潜る

「今回は前回の続き、ファイルの検索です」
『結構長いから途中で止まっちゃったんだよね……えっと、次は……』

        else if( _stricmp
                ( stWin32FindData.cFileName
                , p_pchFileName 
                ) == 0 )
        {
            // ファイル名が一致しました。
            ++iNum;
        }

『ファイルのチェックだよね。これは前回と同じ、と』
「あ、でも前回 _stricmp() に触れなかったよね」
『そういえばそうだよね、ってゆーか _ 付いてるじゃん、全部小文字だか
らこれってランタイムだよね。 _ 付きって使っていいんだっけ？』
「 _ が付いているランタイムは Visual C++ にしか入ってないランタイム。
だから、ちょっと汎用性ないんだよね」
『でもさ、ファイル名の一致チェックなんて簡単にできるんじゃないの？』
「ファイル名って大文字と小文字を区別しないでしょ」
『……だから？』
「だから。実は大文字小文字を区別しないランタイムってないんです」
『ええー！？　なんか不便！』
「なんだけどね。 CString::CompareNoCase() っていうメンバ関数もあるか
らそっちでもいいけど」
『 CString 使うってこと？　なんかそのためだけに CString 使うっていう
のも……』
「それに、 CString::CompareNoCase() の中で _stricmp() 使っているか
ら」
『同じじゃん！』
「もし _stricmp() を使わずに自作する場合には」

・大文字→小文字変換関数を作る。
・ランタイムの strcmp() で比較する。

「っていうのがいいかな」
『あー、大文字小文字を統一しちゃうわけね、先に……』
「さて、ここまでがファイル検索部分。ここまでで、指定されたフォルダの
中身は検索できました」
『ってことは、次はフォルダの中に潜るわけね』
「そういうこと。それがこの部分」

    // フォルダに対して再帰呼び出しをします。
    for( int iF1 = 0; iF1 < cFolderStrAry.GetSize(); ++iF1 )
    {
        if    (
            ( cFolderStrAry.GetAt( iF1 ) == "." ) ||
            ( cFolderStrAry.GetAt( iF1 ) == ".." )
            )
        {
            // . と .. はスキップします。
            continue;
        }

        // フォルダを連結します。
        CString cPathStr = p_pchFolderPath;
        if    (
            ( cPathStr.GetAt
                ( cPathStr.GetLength() - 1 ) != '\\' ) ||
            (
                ( cPathStr.GetAt
                    ( cPathStr.GetLength() - 1 ) == '\\' ) &&
                ( _mbsbtype
                    ( (const unsigned char *)(LPCTSTR)cPathStr
                    , cPathStr.GetLength() - 1 
                    ) == 2 )
            )
            )
        {
            // 最後に \ がなければくっつけます。
            cPathStr += "\\";
        }
        cPathStr += cFolderStrAry.GetAt( iF1 );
        // 再帰呼び出しします。
        iNum += CountMatchFile( cPathStr, p_pchFileName );
    }

「 cFolderStrAry にはみつかったフォルダを入れてあるので、その数だけ
ループして処理します」
『おー』
「次に、【.】と【..】を省きます」

        if    (
            ( cFolderStrAry.GetAt( iF1 ) == "." ) ||
            ( cFolderStrAry.GetAt( iF1 ) == ".." )
            )
        {
            // . と .. はスキップします。
            continue;
        }

『な、何これ……』
「火美ちゃんは DOS コマンドの DIR って使ったことある？」
『時々あるけど……ファイル一覧出すヤツでしょ？』
「こんな感じに出るでしょ」

2004/10/31  02:22       <DIR>          .
2004/10/31  02:22       <DIR>          ..
2005/02/07  15:04       <DIR>          Pragma_twice
1999/03/26  14:11                2,673 Plot.txt

『あ！　そういえばこの時に【.】と【..】って出る！　確か、【.】って
今表示してるフォルダで、【..】はひとつ上のフォルダのことだよね』
「そう。実はこのふたつのフォルダも、 FindFirstFile() を使った検索で
取得されるんです」
『げ！』
「ま、 DIR コマンドと同じってことだね」
『でもこれをフォルダにして検索しちゃったら……永久ループ？』
「になっちゃうので、これをスキップするのを忘れないようにしてくださ
い」
『うん……これ結構怖いね……』
「まぁエラーになって落ちるだけだけど」
『？　ずっと動きっぱなしじゃないの？』
「うん、その理由は最後に。その前に、フォルダの連結をします」
『フォルダの連結？』
「引数の p_pchFolderPath には、検索対象のフォルダが渡されているで
しょ。たとえば "C:\\WinNT" とか」
『うんうん』
「このフォルダのフルパスに、次に検索するフォルダ、たとえば "system" 
をくっつけて "C:\\WinNT\system" にします。それがこれ」

        // フォルダを連結します。
        CString cPathStr = p_pchFolderPath;
        if    (
            ( cPathStr.GetAt
                ( cPathStr.GetLength() - 1 ) != '\\' ) ||
            (
                ( cPathStr.GetAt
                    ( cPathStr.GetLength() - 1 ) == '\\' ) &&
                ( _mbsbtype
                    ( (const unsigned char *)(LPCTSTR)cPathStr
                    , cPathStr.GetLength() - 1 
                    ) == 2 )
            )
            )
        {
            // 最後に \ がなければくっつけます。
            cPathStr += "\\";
        }
        cPathStr += cFolderStrAry.GetAt( iF1 );

『……あれ？　なんか前回と違うような……』
「ごめんなさい、前回のプログラム、間違えてました」
『げ』
「これから説明する日本語処理のところが……」
『だめねー』
「……日本語処理がなければ簡単なんだけどね。まず」

        CString cPathStr = p_pchFolderPath;

「で検索したフォルダ "C:\\WinNT" を入れて」

            cPathStr += "\\";

「で \ を最後にくっつけて "C:\\WinNT\\" にして」

        cPathStr += cFolderStrAry.GetAt( iF1 );

「でその後ろにフォルダ "system" をくっつけて」
『 "C:\\WinNT\system" にするわけねー。でも、なんかその \ をくっつけ
るとこですごく大変なことしてるんだけど……』
「二重に if してるからね。まず」

if( cPathStr.GetAt( cPathStr.GetLength() - 1 ) != '\\' )

「これは検索したフォルダの一番後ろに \ が付いてないか。もし付いてる
ところに \ を付けると \ が二重に付いちゃうから」
『そっか、後ろに付いてないときだけ \ を追加するわけね』
「でも、このチェックだけじゃダメなんです。 Version 11.04 ( No.204 ) 
を思い出して」
『んー、文字コード……あ！！　【ソ】って、 \ が混ざってるんだ！』
「【ソ】みたいに \ がトレイルバイトにある文字が一番最後にあると、 \ 
がくっついているって勘違いしちゃうんです。だから」

if( cPathStr.GetAt( cPathStr.GetLength() - 1 ) == '\\' )

「の時、つまり最後に \ のコードがある場合、」

if( _mbsbtype
    ( (const unsigned char *)(LPCTSTR)cPathStr
    , cPathStr.GetLength() - 1 
    ) == 2 )

「で、トレイルバイトなら \ とみなさずくっつける、ってしてます」
『そんなめんどくさいチェックが必要なんだね……ん？　なんか変なキャス
トしてるけどこれって？』
「まず、  LPCTSTR にキャストしてるのは cPathStr の文字列ポインタを取
り出すため。 Version 5.22 ( No.087 ) 、 Version 7.09 ( No.129 ) 、 
Version 11.20 ( No.220 ) を参照」
『あー、 CString クラスの中に文字列が入ってるから、それを取り出すた
めの operator LPCTSTR を呼ぶってゆーことね』
「そういうこと。次に (const unsigned char *) にキャストしてるのは、 
_mbsbtype() の引数がそうだから。これは Version 11.05 ( No.205 ) を参
照」
『比較するときは unsigned でないとまずい、って話ね』
「というわけで、これで cPathStr に次に検索するフォルダのフルパスが入
りました。そこで、このパスで自分自身を呼び出します」

        // 再帰呼び出しします。
        iNum += CountMatchFile( cPathStr, p_pchFileName );

『あ、再帰呼び出し！　Version 13.16 ( No.252 ) のクイックソートの時
にやったね』
「こうやって、再帰呼び出しすれば、ひとつ深いフォルダの中を同じように
検索できるわけです」
『はー、なるほどねー』
「で、先ほどの答。もし無限ループになっていた場合、この再帰呼び出しが
永遠に行われます」
『うん、行われるね』
「さて、再帰呼び出しの復習。この関数の中のローカル変数、たとえば」

    int iNum = 0;

「とかは、再帰呼び出しするとどうなる？」
『んー、確か新しく作られるんだよね。関数の中の変数って呼ばれて使われ
るときに作られて、それは同じ関数呼ぶんでも同じ、なんだよね』
「そういうこと。ってことは、再帰呼び出しで CountMatchFile() が 100 
段呼ばれたら、 iNum は」
『 100 個作られる……再帰呼び出しで無限ループすると、変数が無限に作
られる……メモリ足りない！』
「というエラーになるわけです。正確には【スタックオーバーフロー】って
いうエラー」
『だから永久に動き続けるわけじゃなくて、途中でエラー出て止まっちゃう
わけね』
「そういうこと」

/*
    Preview Next Story!
*/
『ん、これで一応ファイル検索はできてるわけね』
「でも検索中はなにもできない」
『というわけでマルチスレッドの出番！』
「そういうこと。というわけで次回」
＜ Version 14.29 別スレッドで検索！ ＞
『につづく！』
「いよいよマルチスレッドを使った実践的な内容に！」
『つか今度は間違えないでよね』
「う”」


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

・ほとはー外伝３に１ページ追加
　三人合体ホットハーブ 外伝３に P.07 を追加予定。


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

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.biz/nikki2/
・購読登録を解除したいときにはこのページで行なってください。
http://www.mag2.com/m/0000012198.htm
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
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 - 2005 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

