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

    KAB-studio.h


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

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

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

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

・JavaA2Z がベータ版にバージョンアップ
　Java プログラミング辞書 JavaA2Z がベータ版にバージョンアップしまし
た。単語もどんどん追加してますよー。
[ JavaA2Z ]
http://www.kab-studio.biz/Programing/JavaA2Z/index.html


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

2005/02/20 (Sun)
　朝９時半に電話「ワンフェス来てる？」行ってません。午前中洗濯、午後
は何もせず……。夜７時からMachician書き。Machicianって人気あるん？　
JavaA2Z、６０ヒットしてる。そしてサンプルコード。

2005/02/21 (Mon)
　１１時に起きてMachicianがりがり。３時半からプログラミング。 JavaA2Z
に単語を追加するシステムを。スケジュール的にいっぱいいっぱい。 
JavaA2Z さえできれば……。そして、仕事するとき必ず開いてるページ。

2005/02/22 (Tue)
　朝っぱらから引越の手伝い。なにげに疲れた……。美味しいインドカレー
食べれたからよし。そして「わかりやすいJava解説」。そして河合塾。そし
てハローワークで。

2005/02/23 (Wed)
　９時に起きて洗濯。午後からずっとプログラミング。 MVC の M の設計に
手間取る。作る部分が一杯残ってる……。オフラインミーティングの参加を
締め切ります。参加者８名。フツーの飲み会で。

2005/02/24 (Thu)
　昨日は深夜４時まで JavaA2Z の編集機能作り。９時半に起きて髪を切った
り国民健康保険（月３万）を振り込んだり。そのあとやっぱりプログラミン
グ。 JavaA2Z がベータ版に。ちゃんとデータベースから取ってくるようにし
ました。更新履歴はかぶろぐで。オフラインミーティング締め切り。

2005/02/25 (Fri)
　昨日の夜中もプログラミング。 RSS 出力を実装。今朝も９時半起き。な
んでこんなに早起き？　午前中は JavaA2Z の単語追加。「ラッパー」。午
後は歯医者。今のうちに全部治す。「笑気吸入鎮静法」。今日は詰めただ
け。治療費高い……。さらにヨドバシ川崎店まで散歩してそのうえ秋葉原に
行ってかりん５巻とか購入。ラホールのカレーの禁断症状。 JavaA2Z の
リリースのプレッシャー。そして扶養家族。

2005/02/26 (Sat)
　午前中は JavaA2Z に単語追加。本屋で機工魔術士７巻とてんしの末裔２巻
とアームズマガジン購入。Amazonからいとうのいぢ様画集紅蓮来る。そのあ
とうだうだと。イラストとあせり。収益率とか。版権ものに挑戦。

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

■　第十二章　超越する存在　−１−

　９月半ばのある日。
　白い半球のドーム。
「ちっ」
　舌打ちは舞のもの。リシュネへと向けて４つの水槍が放たれる。
　リシュネはその水槽を素手ではたく。その度に手が形を崩していくが、同
時に水槍は方向を違え爆散する。
　リシュネが駆ける。
　０．５秒。
　５メートルの距離が埋まる。残り、５メートル。
「壁！！」
　舞の声と同時に二人の間に水の壁が造り出され
「遅い」
　その壁をリシュネは体当たりで貫通する。
「なんちゃって」
「！！」
　砕けた水が水流となりリシュネを包む。それはネットのようにリシュネを
阻み、粘りあるものとして絡み取る。
　５０センチ。
　舞の目の前で動きが止まる。苦虫を噛み潰したようなリシュネの表情、対
照的な舞の笑み。
「こ、こんなのに……」
「表面張力とかも活用してるから簡単には無理だって」
　ブザーが鳴り、同時に水が解ける。
「これ、初めてだよね」
「個人練習の時にちょっとね」
「他にもそういうの……あるの？」
「さてねー」
　という舞の笑みに、悪気はない。
　でも。
「そうなんだ……」
　リシュネの顔は沈む。
「交代だぞ、舞」
　上から、雅樹と少年が降りてくる。
                                                              (続く)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
「だいたいあんたお兄さんなんだから、弟に少しは優しくしようって思わな
いの！？　これだから余裕のない大人は」
『？　……ああ、知らないのか？　賢二は養子だから、血は継ながってな
い、赤の他人だ』
「え……」

Machician 第５話 待逢として 好評連載中！
[ Machician ]
http://d.hatena.ne.jp/kab_studio/20040823#1093276416
[ Machician＋設定 最新一覧 ]
http://d.hatena.ne.jp/kab_studio/searchdiary?word=*%5BMachician
_______________________________________________________________[KCM]

////////////////////////////////////////////////////////////////////
/*                           JavaA2Z                              */
http://www.kab-studio.biz/Programing/JavaA2Z/index.html

■追加・更新単語
プリミティブ型
バイト
ビット
int
ラッパー
Java
Java 2 Platform, Standard Edition
Object
Integer
J2SE

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

　Version 14.29
別スレッドで検索！

「さて、前回のプログラムをたとえば」

    iCount = CountMatchFile( "C:\\", "readme.txt" );

「というふうに C ドライブ全体で検索すると、結構時間が掛かると思いま
す」
『しかもその間、アプリ動かない……これがつまり、検索処理してるから、
ウィンドウを操作してもメッセージキューに貯まるだけで何も処理されな
い、って状態なんだね』
「そういうこと。そこで！」
『マルチスレッドの出番！』
「というわけです。でもここから一筋縄ではいかないから」
『う……』
「まず、マルチスレッドは Version 14.14 ( No.281 ) と同じく 
_beginthread() を使用します。この時と同じく StdAfx.h にヘッダーを追
加します」

#include <process.h> // 追加。

//{{AFX_INSERT_LOCATION}}

「〈//{{AFX_INSERT_LOCATION}}〉の上に追加してください」
『ほい』
「では使ってみます」

/*
    指定したフォルダからファイルを検索します。
    戻り値として一致数を返します。
 */
int CountMatchFile
    ( const char * const p_pchFolderPath
    , const char * const p_pchFileName 
    )
{
    int iNum = 0;

    // 検索するフォルダをカレントディレクトリにします。
    BOOL bRes;
    bRes = SetCurrentDirectory( p_pchFolderPath );
    if( bRes == FALSE )
    {
        // フォルダが存在しません。
        return -1;
    }

    CStringArray cFolderStrAry;

    // 最初のファイルを取得します。
    WIN32_FIND_DATA stWin32FindData;
    HANDLE hHandle = NULL;
    hHandle = FindFirstFile( "*", &stWin32FindData );
    do
    {
        if( stWin32FindData.dwFileAttributes 
                & FILE_ATTRIBUTE_DIRECTORY )
        {
            // フォルダなので取っておきます。
            cFolderStrAry.Add( stWin32FindData.cFileName );
        }
        else if( _stricmp
                ( stWin32FindData.cFileName
                , p_pchFileName 
                ) == 0 )
        {
            // ファイル名が一致しました。
            ++iNum;
        }

        // 次のファイルを取得します。
    }while( FindNextFile( hHandle, &stWin32FindData ) );

    // ハンドルを閉じます。
    FindClose( hHandle );

    // フォルダに対して再帰呼び出しをします。
    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 );
    }

    return iNum;
}

void StartCountMatchFile( void *p_p )
{
    int iCount = 0;
    iCount = CountMatchFile( "C:\\", "readme.txt" );
    TRACE( "一致数： %d\n", iCount );
}

void CSearchDlgDlg::OnSearchStart() 
{
    HANDLE hThread;
    hThread
        = (HANDLE)_beginthread( StartCountMatchFile, 0, NULL );

    // 【検索中】ダイアログを表示します。
    CSearchingDlg cDlg;
    cDlg.DoModal();
}

『長！　って、 CountMatchFile() ってこの前と同じっぽいけど』
「同じなんだけど……ほら、この前プログラム間違えたから、これが正解版
ってことで……」
『あー……』
「というわけで CountMatchFile() の解説は前回と前々回を参照。ここでは
マルチスレッドの部分を解説します。まずは別スレッドで呼び出す部分」

    HANDLE hThread;
    hThread
        = (HANDLE)_beginthread( StartCountMatchFile, 0, NULL );

「 _beginthread() で、別スレッドで StartCountMatchFile() を呼び出し
ます」

void StartCountMatchFile( void *p_p )
{
    int iCount = 0;
    iCount = CountMatchFile( "C:\\", "readme.txt" );
    TRACE( "一致数： %d\n", iCount );
}

『こっちがこの前呼んでた方だね』
「ここは同じ。だから、検索部分そのまままるごと別スレッドで呼び出した
ことになります」
『おー』
「で、それとは別に、メインスレッドではダイアログを表示します」

    // 【検索中】ダイアログを表示します。
    CSearchingDlg cDlg;
    cDlg.DoModal();

『 Version 14.26 ( No.293 ) の時に作ったやつだね』
「これを実行してみて」
『ほい、実行っと。【検索開始】ボタン押して〜おっ、【検索中】ダイアロ
グが出た』
「まだ【キャンセル】ボタンは機能しないけどね」
『う、そうだ……』
「でも押せるでしょ」
『あ、押せるし、ダイアログも動くし』
「これがマルチスレッドの効果」
『そっか、検索は別スレッドだから、メッセージループが止まらないんだ
ね』
「そういうこと。で、少し待つと」
『あ、デバッグウィンドウに一致数出た』
「この流れを図にしてみます」

OnSearchStart()                           StartCountMatchFile()
呼び出し→→→→→→→→→→→→→→→→→別スレッドで開始
【検索中】ダイアログ表示                  検索開始
...                                       （検索中...）
...                                       検索終了。
（ダイアログを閉じたり                    StartCountMatchFile() 終了
ウィンドウを動かしたり                    （スレッドもここで終了）
できます）                    
【ファイル検索】ダイアログ閉じます。
（アプリケーション終了）

『別々に分かれて、あとでくっつくことはないわけね』
「そういうこと。マルチスレッドの場合、スレッド間の協調が難しいから、
こういうふうに〈処理を投げっぱなしにする〉のが簡単な方法」
『検索処理を投げっぱなしにするわけね』
「そういうこと。でも、実際には協調が必要。今の段階でまだ実装してない
機能は」

・検索対象フォルダの表示
・検索結果の表示
・キャンセル機能
・検索終了時にキャンセルダイアログを閉じる機能

『うわ、かなりある！』
「まだまだ道は険しいからねー」

/*
    Preview Next Story!
*/
『でもさでもさ、なんかスレッド使うだけで結構ちゃんとした感じ！』
「こういうのって楽しいでしょ」
『う”、そ、そうだけど……』
「次はもっと楽しくなるよ」
『え！？』
「というわけで次回」
＜ Version 14.30 スレッドを途中で止める ＞
『につづく！』
「こうやって機能がどんどん追加できると楽しくなるよー？」
『……なんかあたしのこといじってない？』

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

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

・３月表紙壁紙
　毎月恒例、表紙壁紙です。どんな絵にするかまだ決めてないけど……。


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

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

