
/*
    KAB-studio.h
        　ＫＡＢ−ｓｔｕｄｉｏで先週更新した内容
        が格納されたヘッダーファイルです（笑）。

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

    送信日： 2000/03/06(Mon) No.047
    配信数： 3520（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/


/*              ２０００年３月６日（月）の更新                    */
http://www.kab-studio.com/Info/News/

・ＫＡＢ−ｓｔｕｄｉｏ、引越！
　３月６日、ＫＡＢ−ｓｔｕｄｉｏは引っ越しました。
　引っ越し先は http://www.kab-studio.com/ 。リンクを張ってくださって
いる方は、暇なときにでも変更してください。
　新しいメールアドレスは info@kab-studio.com 。今日からメールはこち
らのアドレスへと送ってください。
　これから、旧ページを登録していたサイト（まぐまぐとかヤフーとか）に
新ページのアドレスで登録を更新して、この手続きがすべて完了したら古い
アドレスの各ページを削除していくつもりです。実際、今回は引越のシステ
ム上、旧アドレスには３ヶ月しかファイルが残らないため、短期間のうちに
「移動」することになります。
　というわけで、引越が完全に完了するまでの間、色々とご迷惑をお掛けす
ると思いますが、何卒ご容赦ください。


・表紙を３月バージョンに。
　毎月恒例、新しい表紙です。
　桜の木の下で月を見上げる火美ちゃん……今回はかなりいい感じにできた
んじゃないかなと感じてます。このイラストについての解説はチョー普通な
日記２月７日の記事をお読みください。
[表紙]
http://www.kab-studio.com/
[チョー普通な日記２０００年２月７日]
http://www.kab-studio.com/cgi-bin/cgiperl7.pl?nikki2/n12_02b.html__s__20000227


・アクセスランキング登場！
　アクセスランキングというページを新設！
　ＫＡＢ−ｓｔｕｄｉｏの中でどのページに人気があるのか、棒グラフ＆リ
ンク付きで分かる自己満足ページです（爆）。かぶスタのトレンドをこれで
チェック！
[アクセスランキング]
http://www.kab-studio.com/Info/Ranking/


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

２０００年２月２７日（日）：
　３月表紙完成！　今回はかなり満足のいくものができましたのです。あと
毎日どれだけアニメを見るのかとか（爆）。

２０００年２月２８日（月）：
　研究室面接へ……そこに待ち受けていた驚愕の事実とは！！　そして帰り
はひさびさにアウトトリガー略してあうとり。まだまだ熱戦の火は消えず！

２０００年２月２９日（火）：
　研究室決定！　アクセスランキング作成！　そして、就職について思う。
……ふと思ったんだけど、このメルマガ読んでる人って、みんなもー就職し
ちゃった人なんかな？

２０００年３月１日（水）：
　すれ違いとか過去の日記とかお仕事とか色々。そーそーあと「モノレール
にネコバスを走らそう署名」とか。ちょっと見たい。

２０００年３月２日（木）：
　新しい名刺を作ったり、メルマガ書いたり、３ＤＣＧ作ったり、お仕事の
こと考えたり。なんか色々やってるねぇ。

２０００年３月３日（金）：
　がびぃん！！　ビデオが、ターンAガンダムがぁ！！　あとゼミのガイダ
ンス。

２０００年３月４日（土）：
　むー、メルマガって結構ホームページと違う感じよね、って話。難しいっ
す。


/*                         鏑矢の憂鬱                             */
http://www.kab-studio.com/Programing/KabuU/

２０００年２月２７日（日）：
STL アルゴリズムを整理
関数オブジェクトを使うのと使わないのとかに分けたり

２０００年２月２８日（月）：
辞書のタグミスをお詫び

２０００年２月２９日（火）：
Perl で CGI プログラミング
アクセスランキングを作成
アクセスログから読み取って棒グラフ化
「今かぶスタではこのページが人気！」
デフォルトは前日のベスト３０を表示
ホームページは、雛形ページから読み込んで出力
「前日」は time から 86400 を引いて localtime() に渡す
ランクデータは、ログをハッシュに入れて値で逆ソート

２０００年３月１日（水）：
お休み

２０００年３月２日（木）：
プログラミングのネタがない
CGI はあらかた完成したし
STL & iostream 入門はネタばらしあまりしたくないし
だから質問大募集！

２０００年３月３日（金）：
STL & iostream 入門に問題
命名規則をどうするか
標準 C++ ライブラリはすべて小文字
僕は我流ハンガリアン
後者を選択することに
標準 C++ ライブラリのは変な短縮が多い
違うスタイルなら区別しやすいかも
ポカもしにくい
まずいかも？

２０００年３月４日（土）：
Perl で CGI プログラミング
index.html 生成 CGI の作成
メニューバーを表示するため
# をパラメーターとして渡す方法
ヒアドキュメントまわりのポカミス
これで CGI はあらかた完成


/*                       今週の追加単語                           */
http://www.kab-studio.com/Programing/Dictionary/

・追加単語：
__declspec Ｃ言語 Ｃ＋＋言語 extern "C" NULL ターミネート 移植
インターネット オペランド 終端文字 ヘッダー ラスタオペレーション

・今週のごめんなさい
ターミネート CFileDialog 静的変数 アンチエイリアス ラスタ
refinement ActiveX porting

　今回いくつかあったけど、「辞書っぽくないかな？」と思ったら気軽にか
ぶゆ〜へと送ってください。かぶゆ〜経由で辞書に単語登録、ってこともで
きるんだし。ってゆーか辞書だけじゃなく他のページも見てねー。


---------------------------------------------[かぶスタＣＭ]---------
　２５週、半年間
　STL, C++ , iostream
　使い方・仕組み・カスタマイズ
　君はすべてを手にする。                      STL & iostream 入門
---------------------------------------------[かぶスタＣＭでした]---


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

　Version 3.22
参照を作ろう！


「さて今回は？」
『えっと、この前〈答に数字を入れる〉ってのをしたから、今度はその数字
をレジストリのにするんだよね。でも……』
「そう、うまくいきません。ま、試してみて」
『ま、試してみたら偶然うまくいくかもしんないし』
「それはない」
『うー。えっと、前は CCalcApp::InitInstance() の中で』

    CString cCompanyStr;
    cCompanyStr.LoadString( IDS_REG_COMPANY );
    CString cDialogStr;
    cDialogStr.LoadString( IDS_REG_DIALOG );
    CString cAnsStr;
    cAnsStr.LoadString( IDS_REG_ANS );

    SetRegistryKey( cCompanyStr );
    dlg.m_iAns = GetProfileInt( cDialogStr, cAnsStr, 0 );

『って書いて、この前 CCalcDlg::OnInitDialog() で』

    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    dlg.m_iAns = 10000;

『って書いて、こっちの方に移動すればいいんだから……』
「あ、切り取っちゃダメだよ、 cDialogStr とかはあとで使ってるんだから」
『 OK ボタン押したとこのことね』
「あと SetRegistryKey() は CCalcApp::InitInstance() で呼んだ方がいい
かな。これは〈アプリケーションの設定〉だから」
『ダイアログと関係ないってことね。じゃ、こんな感じ』

    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    CString cDialogStr;
    cDialogStr.LoadString( IDS_REG_DIALOG );
    CString cAnsStr;
    cAnsStr.LoadString( IDS_REG_ANS );

    m_iAns = GetProfileInt( cDialogStr, cAnsStr, 0 );

『だねー。簡単簡単！』
「で？」
『はいはい。ビルドしてエラー……にならない。あれ？』
「良かったね、エラーにならなくて」
『……なんかあんね』
「じゃ、実行してみて」
『はーい……あれ、なんで【Ans】のとこが 0 なの？　えっと、 100 入れ
て【OK】ボタン押して、もう一度実行……あれぇ、また 0 、なんでぇ？』
「ミスがふたつ。まず、     UpdateData( FALSE ) を付け加えて」
『え、なんで？』
「理由は次回。あともうひとつのミスは、 GetProfileInt() 。これ、さっ
きのと今のとで違う関数が呼ばれてるんだよ」
『？？』
「 CCalcApp::InitInstance() で呼んだのは CWinApp::GetProfileInt() 、
CCalcDlg::OnInitDialog() で呼んだのは GetProfileInt() 、つまり API 
の関数」
『い、いつのまに……』
「なんでか分かる？」
『分かんない』
「……」
『あ、えっとねぇ……』
「 CWinApp::GetProfileInt() ってことは CWinApp のメンバ関数だから？」
『あ、確か今のプログラムって CCalcDlg::OnInitDialog() の中だから』
「そう、 GetProfileInt() が属してる CWinApp クラスと別ってこと」
『だから呼べなくって、代わりに API の方が呼ばれちゃったんだ』
「じゃあ、どうすれば CWinApp の方を呼べると思う？」
『んー、たとえば dlg.GetProfileInt() みたいに使えたりするんじゃな
い？』
「当たり。じゃ、 dlg に当たるものは？」
『……えーっと』
「 GetProfileInt() はどこで使ってたの？」
『 CCalcApp::InitInstance() の中』
「そこでなんで使えるの？」
『あ、えーっと、 CCalcApp が CWinApp から継承してるからなんだよね。
CCalcDlg の中で UpdateData() とかが使えるのと同じで』
「ってことは dlg に当たるのは？」
『んー、この前言ってたよね、 CCalcDlg::OnInitDialog() の中じゃ、
CCalcDlg じゃなくて、例えば dlg 変数の中、とかで考えた方が分かりやす
いって』
「うんうん」
『ってことは、 GetProfileInt() を呼んだとき、 CCalcApp は dlg に当た
る変数になってる！』
「そうそう」
『それが分かれば CCalcDlg::OnInitDialog() の中から GetProfileInt()
を呼ぶこともできるはず！！』
「そう！」
『……で？』
「で？」
『 dlg はさ、 CCalcApp::InitInstance() の中で CCalcDlg dlg; って感じ
に変数として作ったでしょ。でも CCalcApp の変数は？』
「前に一度見たんだけどねー」
『検索っ！　……あーっ、Ver 3.1 （ No.026 ）で教えてもらったんだね』
「そ、 CCalcApp::InitInstance() のすぐ上に CCalcApp theApp; ってある
でしょ、これがそう」
『まず CCalcApp の変数ができて、そのあと CCalcApp::InitInstance() が
呼ばれて、その中で CCalcDlg の変数ができて、ダイアログが表示されて、
ってやったもんねー』
「思い出してきた？」
『なんとなく。んじゃ！』

    m_iAns = theApp.GetProfileInt( cDialogStr, cAnsStr, 0 );

『ビルドして実行！　ほらエラーってなんでぇ？？』

error C2065: 'theApp' : 定義されていない識別子です。

『なんでぇ〜！？』
「 theApp はどのファイルにある？」
『 Calc.cpp 』
「 CCalcDlg::OnInitDialog() は？」
『 CalcDlg.cpp 。もしかして、ファイルが違うから？』
「そうとも限らないでしょ。 CCalcApp::InitInstance() の中で CalcDlg 
を使ってるでしょ？」
『あ、そういえば』
「つまり〈他のファイルにあるのを使う方法がある〉ってこと」
『なるほど。で、その方法とは？』
「じゃ、まず CCalcApp theApp; のあとに」

CCalcApp theApp;
// のあとに、

CCalcApp& GetTheApp()
{
    return theApp;
}
// と書き足してください。

『はて？　これは関数だよね……あれ？』
「Ver 2.10 （ No.021 ）とか思い出してみて。普通の関数を作ったでしょ」
『あ、そういえば。メンバ関数じゃない、普通の関数』
「じゃ、思い出しながら見ていこうか。まず関数名は？」
『えっと、 GetTheApp() 。だからこれ呼べば、この関数使えるんだよね』
「じゃ、戻り値は？」
『…… CCalcApp& かな、でも最後の & って？』
「それが今回の注目点。この関数の中は？」
『えーっと、 return って〈戻り値〉っていうのを決めるんだよね。だから
GetTheApp() が theApp に置き換わる……あ、こうやると CCalcDlg からも
theApp が使えるようになるんだ！』
「まだ早いって。戻り値が CCalcApp& でしょ」
『そう、この & ってなに？　theApp は CCalcApp の変数なんだから、 & 
なんていらないんじゃない？』
「じゃ、取ってビルドしてみれば」
『うー、エラーでたー』

error C2558: class 'CCalcApp' : コピー コンストラクタが（略）。

「これは〈 theApp の複製は作れませんよ〉って意味」
『複製？』
「そう、コピーね。 return theApp ってすると、 theApp そのものじゃな
くて、 theApp のコピー、つまり新しく作られた CCalcApp 型の変数が、
GetTheApp() の代わりとして置かれるわけ」
『えー？？　なんで theApp そのものじゃないの〜、めんどくさー』
「というわけで、戻り値の型のあとに & を付けます！」
『ってことは、これを付けると』
「 theApp そのものが返るから、コピーは作られません！」
『なるほど、そのための & なわけね』
「この & の付いた型を〈参照〉っていいます。この例なら〈 CCalcApp の
参照〉って言い方をします」
『参照って〈これはテキスト２４ページを参照してください〉とかのと同
じ？』
「同じ。参照使わなかったら、そのテキストをコピーして見てもらうってこ
とだね」
『それは無駄だから参照、か〜』
「でもこれだけじゃまだダメ」
『え、そなの？』
「 GetTheApp() は Calc.cpp にあるでしょ。だからまだ CCalcDlg からは」
『呼べないって、それじゃ意味ないじゃん』
「そこで、この関数の〈宣言〉を作りましょう」
『宣言って…… GetTheApp() がここにあるぞ、使え！！　ってのだよね』
「そうそう。これをヘッダーファイル、つまり Calc.h に書きます」
『そういえばそんな話あったね』
「やってみる？」
『う”』
「んじゃここは僕の方で。 Calc.h の中に CCalcApp が入ってるでしょ」
『うん、 class CCalcApp ってのでしょ』
「この CCalcApp のあとにこれを追加してください」

class CCalcApp : public CWinApp
{
    // 略。
};

//    この下の行を追加。
CCalcApp &GetTheApp();

『あ、そっか、関数のをそのまんま書けば良かったんだね』
「ちなみに CCalcApp のあとじゃなきゃダメだから」
『なんで？』
「 GetTheApp() の戻り値が CCalcApp だから。これ使う前に、 CCalcApp 
がどういうのか分かんないとね」
『そういえばそんな話も……』
「で、 CalcDlg.cpp から Calc.h をインクルードしてるから」
『 CCalcDlg から GetTheApp() が使える！！』
「というわけで」

    m_iAns = GetTheApp().GetProfileInt( cDialogStr, cAnsStr, 0 );

「で、めでたく」
『？？』
「あ、ちょっと難しいかな。 GetTheApp() は theApp に置き換わるんだか
ら」

    m_iAns = theApp.GetProfileInt( cDialogStr, cAnsStr, 0 );

「と同じことってことだね」
『ホントはこうはできないけど、 GetTheApp() を使えばこれと同じことが
できるってことなんだ』
「そういうこと」

/*
    Preview Next Story!
*/
『って難しくないー？』
「でも、関数のとか、前にやったのばかりだけど」
『そう言われればそうだけど〜』
「難しいことも簡単な知識の積み重ね」
『大きいプログラムも小さなプログラムが組み合わさってできてる、ね』
「というわけで次回」
＜ Version 3.23 オーバーライド ＞
『につづく！！』
「今回だって、新しく教えたの参照くらいだよ」
『つまり、憶えなきゃいけないことまだまだたっぷりあるってことね……』
「憶えてくれるまで繰り返し言ってるつもりだけどね」
『はいはい』


/*                       金菜さんの憂鬱                           */
http://www.kab-studio.com/Programing/KanaU/

アプリのツボ
#10 プラグイン

　前回ちょっと触れたプラグイン。もう一度言い直すと、これは DLL です。
DLL の中に「何かをする」関数が入っていて、アプリ側からそれを呼び出す
ことでその「何か」を実現します。何かっていうのは、たとえば圧縮解凍、
特定フォーマット画像の表示、画像に対するフィルタリング、インターネッ
トブラウザへのインライン表示、とかね。
　ちなみに他の OS だと DLL って名称は使われていないけど、同じような
システムがあるはずだから、その辺を調べてね。

　プラグインを作る上で大切なのが関数宣言と定義ファイル。
　プラグインは、たいがい「プラグイン用 SDK 」が配布されてるはず。そ
の中に含まれるヘッダーファイルに「アプリ側が探す関数」の宣言があるは
ず。 DLL でこの宣言を使って関数を作ればいいってことね。これがうまく
いかないと、関数ポインタを取得したあと、実際に呼び出すときにランタイ
ムエラーが起きちゃいます。
　一番注意しなきゃいけないのが「定義ファイル」。 Codian の「 DLL を
作ろう！（関数編）」に書いてあるとおり、 DLL から関数をエクスポート
する方法にはいくつかあるんだけど、その方法によって「装飾名」、つまり
コンパイル後の関数名が大きく変わるわけ。
　で、ほとんどのアプリは「ただの関数名」を元に関数ポインタを取得する
から、「定義ファイル」を使ってエクスポートしなきゃいけないわけ。実際、
１ヶ月に１度くらい、どっかの掲示板でこのネタが出てくるくらいの FAQ 
かも。

　あとは、関数をインプリメントすればいいだけ。ま、ホントはここが一番
大変なんだろうけどね。
　あと、最近少しずつ、新しいタイプのプラグインが使われ始めてます。
COM は一種の「プラグイン仕様」なんだけど、その COM の仕様に近いプラ
グインが少しずつ出回ってきてます。ちょっと作るの大変だけどね。
　プラグインと言えば、画像処理。これは来週。じゃね。


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

・STL & iostream 入門、登場。
　４月からスタートする新しいメールマガジン「 STL & iostream 入門」の
ページを新設します！
　このページでは、どんなメルマガになるのか…… STL と iostream の解
説、全体の予定、サンプル誌、 STL と iostream のとりあえずの使い方な
ど……を紹介します。購読登録開始は３月中旬を予定してます。こうご期待！


/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.com/nikki2/
・プログラミングに関する質問は[鏑矢の憂鬱]にお送りください。
http://www.kab-studio.com/Programing/KabuU/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://bigbeat.tegami.com/~mgsearch/frame.cgi?id=0000012198
http://www.kab-studio.com/Freeware/

/*
    KAB-studio.h
    Weekly Mail Magazine.
    Written by Kaburaya Seiden.

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


/*                      See you next week!!                      */


