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

    KAB-studio.h


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

    送信日： 2004/06/07(Mon) No.260
    配信数： 2163
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

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

・夏コミ落ちました（泣）
　とほほ……。
[ ２００４年夏コミ情報 ]
http://www.kab-studio.biz/Info/Product/C66/index.html

・ほとはーに一話追加！
　三人合体ホットハーブに「８の６　ヒロインの資質」を追加！
[ 三人合体ホットハーブ ]
http://www.kab-studio.biz/Comic/HotHerb/index.html

・かぶろぐ。が移転しました
　かぶろぐ。がリニューアルスタートしました。
　まぁ前のはほぼ休止状態だったんで新コーナーと言っても過言ではないで
しょう。微妙に微妙な内容ですが皆さんあんま気にしないでください。
[ かぶろぐ。 ]
http://d.hatena.ne.jp/kab_studio/


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

2004/05/30 (Sun)
　午前中は洗濯と掃除。本棚買わな。中国トリスティア動かず……。ヨドバ
シでＨＤデッキを修理に。チューナーの問題？　AH-K3001V に機種変更。本
を２万円ほど購入。かぶろぐ。マーク２作成。ごたごたした……。

2004/06/31 (Mon)
　夏コミ落ちました（泣）。さてどうするか。おしごとはバグつぶしと
フレームワークの見積もり。今日の京ポン。去っていく人々。２次移行でど
うなるか。でも今日は９時上がり。

2004/06/01 (Tue)
　おしごとはバグ潰し。ひとりぼっち……。死ねるバグ。アマゾンからの配
送物一覧と日曜購入物一覧。日記とかぶろぐの差別化。攻殻機動隊の？

2004/06/02 (Wed)
　てこずってたバグはなんとか解決。逃げられた？　調べる必要のない
バグ……。ガンスリドラマＣＤが売り切れ？（実際は中止らしい）

2004/06/03 (Thu)
　バグ取り３つ。お刺身でダイエットモード。早く寝るのはいかん。激★店
がホントにおかしい。おなか空いた。ＨＤデッキの報せがまだ来ない。

2004/06/04 (Fri)
　バグを３つ。辛いのも。 Excel 便利。２連休〜！　Ｎスペは中国市場。
かぶろぐ、結構まめに書けてます。デンパだし。

2004/06/05 (Sat)
　久々の土曜休日。洗濯して本棚買ってかぶヘッダーの準備して落選ページ
作ってほとはー描いてドチキン買ってお刺身買ってハガレン見て以上。


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

■　第十章　剣と魔法　−９−

　数日後。
　朱き泉の中央で、炎に手をかざし、目を閉じる舞。
「沼の隣に森……まわりに比べて木の密度が高い……森の中から水が流れ出
て沼に流れ込んでいる……わき水かなこれ……」
「森の西の端から村までの道」
「えっと……まず南西に迂回……少し急だけど、岩場を超えれば平坦な場所
が……その先に細い道……兎道だ……」
「うむ」
　赤葉は満足げに頷いた。
　洗礼を受けているからか、飲み込みが非常に早い。泉の力が強く及ぶ範囲
は完全に把握できるようになっていた。
「朴も教えれば、このくらいはできるだろうに……」
　聞こえないように愚痴てから。
「一度視点を村に戻して、そこから龍脈をたどってみよ」
　舞は頷く。
　自分の真下、朱き泉。そこから四方へ伸びる道、龍脈。
　そのひとつを選び、辿る。道なりに意識を飛ばせば、それは遥か先まで届
く。朱き泉を囲む森を越え、山を下り、さらに遠くへと――。
「う」
「どうした？」
「あ、いえ、なんでも」
　舞は、そのまま麓の町並みを見ようとしたが、太い龍脈は町を外れ、再び
山中へと飲み込まれていた。細い龍脈は網状に張り巡らされてはいたが、舞
の力はそこまで及ばない。
　思ったよりも便利じゃないのかも、と、舞は感じた。
                                                              (続く)

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

　Version 13.24
日時の作成

「今回は好きな日時を作る方法について説明します」
『好きな日時？　夕暮れ時の淡い雰囲気が好きとか？』
「いやそうじゃなくて、 time() 関数だけだと現在日時しか取得できないで
しょ。でもプログラムではどんな日時も tm 構造体に入れられないと」
『そか、それができないと現在日時しか扱えないもんね』
「そういうこと。だから、まずは任意の日時を作成できるようにします。基
本的に、任意の日時の作成方法は、次の３通り」

1. time() → localtime() → 日時セット → mktime()
2. tm 構造体作成 → 日時セット → mktime()
3. 直接のべ秒を作成

『なんか最後のはすごく力業っぽいね……』
「うん、上から順に簡単なものから並べているから。まずは」

1. time() → localtime() → 日時セット → mktime()

「から。これは、前回のプログラムとほとんど同じ」

void MakeDate()
{
    // まずは「のべ秒」を取得。
    time_t lTime_t;
    time( &lTime_t );
    TRACE( "%u秒\n", lTime_t );
    // 1083123673秒

    // 次にローカル時間に変換します。
    tm *pstTm;
    pstTm = localtime( &lTime_t );
    setlocale( LC_ALL, "japanese" );
    char pchTime[256];
    strftime
        ( pchTime
        , 255
        , "%Y年%#m月%#d日%a曜日%H時%M分%S秒"
        , pstTm 
        );
    TRACE( "%s\n", pchTime );
    // 2004年5月11日火曜日12時42分46秒

    // 年を 2010 年にします。
    pstTm->tm_year = 110;
    strftime
        ( pchTime
        , 255
        , "%Y年%#m月%#d日%a曜日%H時%M分%S秒"
        , pstTm 
        );
    TRACE( "%s\n", pchTime );
    // 2010年5月11日火曜日12時42分46秒

    // 秒に変換します。
    time_t lTime_t2;
    lTime_t2 = mktime( pstTm );
    TRACE( "%u秒\n", lTime_t2 );
    // 1083123934秒
}

「前回との大きな違いはここ」

    // 年を 2010 年にします。
    pstTm->tm_year = 110;

「こうやって年を変えれば」

    // 2004年5月11日火曜日12時42分46秒
    // 2010年5月11日火曜日12時42分46秒

『ちゃんと年だけ変わるわけねー、便利！』
「手っ取り早く変えるならこれが一番簡単かな。ただ、注意点がみっつあり
ます」

・localtime() が返す tm 構造体はグローバル変数。
・計算には使わない方がいい。
・tm 構造体のすべてのメンバ変数は使わない。

「まずひとつめから。前回説明したように、 localtime() が返す tm 構造
体は、グローバル変数です」
『そっか、こうやって年を変えると、他の tm 構造体も変わっちゃうかもし
れないんだ』
「そういうこと。必要なら複製を作った方がいいかもね。次の注意点は、こ
の方法は〈計算〉には使わない方がいい、ってこと」
『計算？』
「たとえば〈１時間後〉とか」
『え？　だって tm_hour に 1 足せばいいだけじゃ……あ、繰り上がり』
「そういうこと。 tm_hour が 59 だったら、足した後 tm_wday も変えな
きゃいけない、それが 23 だったら」
『うわーきりないね』
「詳しくは次回説明するけど、基本的にはのべ秒で計算します。全部秒にし
て計算すれば、繰り上がりは考えなくていいからね」
『確かに……』
「最後の注意点は、 tm 構造体のすべてのメンバ変数を使うわけじゃない、
ってこと」
『そういえば、 tm 構造体ってメンバ変数いっぱいあるよね』
「でしょ。この中で、曜日の tm_wday や、１年間でののべ日の tm_yday は
使いません」
『セットするときにはこのふたつは無視していいってことね』
「そういうこと。以上を踏まえて、今度はいちから tm 構造体を作ってみま
す」

2. tm 構造体作成 → 日時セット → mktime()

「現在日付とは関係ない日時を作成したり、元々ある tm 構造体から作り直
すときにはこの方法。と言っても難しいところはなくて、年月日時分秒を
セットすればいいだけです」

void MakeDateInDirect()
{
    // tm 構造体作成。
    tm stTm;
    // 0 で初期化。
    memset( &stTm, 0, sizeof( stTm ) );
    // 各データをセット。
    stTm.tm_year = 104; // 2004 年
    stTm.tm_mon  =   4; //    5 月
    stTm.tm_mday =   1; //    1 日
    stTm.tm_hour =  13; //   13 時
    stTm.tm_min  =  35; //   35 分
    stTm.tm_sec  =   2; //    2 秒
    
    setlocale( LC_ALL, "japanese" );
    char pchTime[256];
    strftime
        ( pchTime
        , 255
        , "%Y年%#m月%#d日%a曜日%H時%M分%S秒"
        , &stTm 
        );
    TRACE( "%s\n", pchTime );
    // 2004年5月1日日曜日13時35分02秒

    // 秒に変換します。
    time_t lTime_t;
    lTime_t = mktime( &stTm );
    TRACE( "%u秒\n", lTime_t );
    // 1083386102秒

    // 確認のため、もう一度 tm 構造体に。
    tm *pstTm;
    pstTm = localtime( &lTime_t );
    setlocale( LC_ALL, "japanese" );
    strftime
        ( pchTime
        , 255
        , "%Y年%#m月%#d日%a曜日%H時%M分%S秒"
        , pstTm 
        );
    TRACE( "%s\n", pchTime );
    // 2004年5月1日土曜日13時35分02秒
}

『６個のメンバ変数に入れればいいわけね』
「注意点は３つ。まず、必要なのはこの６つのメンバ変数で、他は関係あり
ません」
『さっき言ってた、他のメンバ変数の話ね』
「でも、他のメンバ変数を放っておくと変な値が入ったままになるから、
memset() で初期化します」
『 Version 12.11 ( No.234 ) で使ったのだね』
「 memset() を使うことで全部の変数に 0 を入れて初期化できます。これ
をしないと危険だから注意」
『最後の注意点は？』
「年と月」
『あ、年は 1900 引いた数で、月は 0 〜 11 、ってヤツね』
「そう。特に月はとても危険です。この例みたいに数字で扱うならまだし
も」

    stTm.tm_mon  = iMonth;

「こういうふうに変数で渡す場合、 iMonth は 0 〜 11 なのか 1 〜 12 な
のか、ものすごく気をつかう必要があります」
『う”、確かに……変数名見ただけじゃわかんないし』
「一番安全なのは、 tm::tm_mon 以外ではすべて 1 〜 12 で扱うこと」
『 tm::tm_mon でしか 0 〜 11 にしないんだ』
「そう。だって、 0 〜 11 っていう規則は、 tm 構造体だけのルールなん
だもの」
『あ、そっか、他で 0 〜 11 を使う理由がないんだ……』
「画面から入力されるにしても、ファイルから入力されるにしても、当然月
は 1 〜 12 。だから、プログラム上ではほとんど 1 〜 12 しか使わないよ
うにして」
『 tm::tm_mon に入れるときだけ…… - 1 すればいいの？』
「そういうこと。専用の関数を用意するといいかもね。ここはとてもバグの
できやすい場所だから気を付け過ぎるくらい気を付けて」
『はーい』
「さて、日時の作成方法の最後」

3. 直接のべ秒を作成

「だけど、普通はこんな方法使わないから必要ありません」
『あらら』
「どうしてもしてみたい場合には mktime() のソースコードを参考にしてみ
てください」
『って、それじゃ mktime() 使った方が早いってことじゃん』
「ま、そういうこと」

/*
    Preview Next Story!
*/
『細かいルールや憶えることが多くて大変！』
「こういうノウハウは、本当は関数にしちゃうのが一番なんだけど」
『月の変換関数みたく？』
「そういうこと。全部は憶えきれないしね」
『だよねー』
「でもとりあえずは全部憶えてもらいます」
『げ』
「というわけで次回」
＜ Version 13.25 日時の計算 ＞
『につづく！』
「引き続きノウハウ集！」
『全部憶えきれるかな』
「火美ちゃん、自分の設定忘れてない？」


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

・ほとはーに１話追加予定
　三人合体ホットハーブに１話追加予定。

・KAB-studio.h 縮刷版更新予定
　KAB-studio.h が２６０号に達したので縮刷版を更新します。


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

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
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 - 2004 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

