フィンローダの本当の裏 →Home , Prev , Next

2002年03月のアレ


2002年03月31日

フレッツ・ISDNからBフレッツに家庭の基幹ネットワークを移動。 基幹って程じゃないけど。

MN128の場合、telnet で入って外側のIPを拾ってくることができたが、 NetGenesis だと、この手が使えない。 設定ツールはJavaが独自プロトコルでコントロールしているようだ。

で、それってどうするか。 mailing list を見ると、SYSLOG 使えという話。 成程、SYSLOG ってそう使うのか。 というわけで、Solaris の /etc/syslog.conf を修正して、 ルータが出してくる syslog message を特定のファイルに保存するようにした。 そのデータを perl で定期的に読み込み、 最新のIPを拾ってくればいい。 というシナリオ。 実際、うまくいった。

しかし、このSolaris、default gateway を指定していなかったのだけど、 今迄何で動いていたのだろう?

§

FPROG, FPL のアクセスギフト送信ソフトが不調。 途中で切れる。 って単にniftyとの接続の問題なのかもしれない。 ということは、途中で処理が異常終了した場合に、 続きを継続する処理があればいいのか。 誰に何送ったかという情報を持てばok、と考えるだけなら簡単だが…。


2002年03月30日

Bフレッツのプロバイダへの申し込み、 2日だけ使って1か月分の料金取られるのはバカなので、 4月からにしようと思っていたのだが、 いろいろ原稿の都合とかあって、とりあえずセットアップすることにした。 2日で1か月の料金取られたら、そのこともネタにできるし。

で、最初は2月頭に使えるはずだったからルータを先に買ってしまったのだが、 実は2月中頃に後継機種が発売されていて、 スループットが大幅に向上していたりするからふざけた話だ。

で、使うことにしたのはMICRO RESEARCH社のNetGenesisというルータ。 設定自体は殆ど問題なくできた。 最初、間違ってNWG設定サーバを違うものをインストールしてしまって動かなかったが、 これはインストールし直してok。 ルータのパラメータ設定とかは、割と得意な方だから特に問題なかったが、 自分で言うのも何だけど、 このマニュアルだけで設定できる人って、かなりの経験者だと思う。

で、サーバがJavaなんだな。 pcにJavaでサーバ立てて、 これに対してブラウザでいろいろ指示すると、 Javaのサーバとルータとが何かやりとりするらしい。 で、Netscapeを使っていると、これが物凄く遅くてやってられない。 Java servlet とか単一pcで動かした時もそうだけど、 Netscape が待ちの間に busy loop に入ってしまって、 CPUを殆ど食ってしまうのだ。

で、これってFAQか何かだと思うけど、裏技がある。 次のような画面で、「詳細設定」を押したいとする。

これを単に押したら、3分たっても戻ってこない。 何か設定して、ページを変更しようとする度に、3分以上待たされるのである。 ちなみに、VAIO SR9M/K だから、Pentium 750MHz? メモリは256M積んでるけど。 最近だと少ないのか?

で、どうすればいいかというと、実はメニューを出すのだ。 メニューって分かりますか?

こういうプルダウンメニューのこと。 画面では「表示」のメニューを出しているけど、 別にどれでもいい。 とにかく、何か「詳細設定」とか「実行」とかいうボタンを押した後に、このように、 ウィンドウのフレームメニューを表示するのである。 表示するだけでいい。 何も選択する必要はないのだ。 すると、MFCの作りの都合なのか何だか知らないが、 なぜか busy loop から抜け出て Java が CPU を 使うことができるのだ。 実測したら13秒。これならまあ我慢できる範囲内。

って技、マニュアルには書いてなかったみたいだけど、 このルーター買った人、どうやって設定しているのだろう? IEだと大丈夫?


2002年03月29日

Bフレッツの工事。 3月末という話になっていたのだが、 本当に末だな。

回線テストでは30Mとか言ってた。 そんなものなのか。

§

nikkansports.com の社会ニュースに「最高裁職員が中学生スカート盗撮」という見出しが。

別に盗撮しなくても、女子中学生のスカートなんかいくらでも撮影できますけど。 何ならもっと凄いのも。


2002年03月28日

疲労度が高いのか、 少し寝過ごしてしまった。 実は、電車に乗るのが始発の次駅からなので、 最近は10分早く家を出て始発駅まで戻り、そこから座って電車に乗っているのだが、 今日はそれだとちょっと厳しい。 ところが、偶然1つだけ座席が空いていて、うまい具合に座ることができた。 意外とラッキー。

§

Bフレッツの工事が明日だと聞いているのだが、 そういえば、工事までに何か送って来るという話なのに、 まだ何も来ていない。 で、0120で聞いてみたら「昨日速達で送った」といわれた。 「約一ヶ月」の誤差が50日程度ある割には、 シビアなスケジュールで仕事しているようだ。


2002年03月27日

最遊記の9巻が平積みになっていたのだが、 これがラッピングでカバーしてあった。 多分、持っているのは8巻までなのだが、 同じのを2冊買いたくないので、ちょっと中を見てみたいのだが、それができない。

というわけで、残念ながらこの店では買えなかった。 他の店で買おう。

§

戯言にも書いたけど、 東京地裁で外形標準課税条例は地方税法に違反という判決で、 東京都に725億円返せということになったらしい。 石原都知事は「当然控訴する」と言ってたが。

で、税法に違反かどうかというのは、専門家の裁判官が言うことだからとりあえずおいといて、 これも戯言に書いたが、 問題は銀行側の主張していた、 「東京都の条例は法の下の平等を保障した憲法や地方税法に違反する」 という主張だ。

これはもっともな話だ。 大手銀行という特定の民間集団だけに不公平な扱いをするのは、 確かに、法の下の平等というルールに反している。

というわけで、 国が一部の銀行だけに公的資金を投入したのは、 法の下の平等を保障した憲法に違反している ことは、銀行側の主張と同様全くもって明白であるから、 そのような資金は即時国に返済するべきである。 という裁判を起こしてはどうだ。 もしかすると、当事者の利益がないと民事裁判が成立しなかったと思うが、 この場合、当事者は国に税金を納めている納税者なのだから、 誰でもOKなはず。 石原都知事も、当然、国税を納めているから、その権利があるはずだ。 というわけで、やってみてはどうだ、石原さん。

とはいっても、 大手銀行全滅したら、結局税金取れなくなるけど、 どうせ取れないのなら同じ訳で。 都にどんなメリットがあるかというと、 不平等な公的資金注入分を回収した分、 地方に回してもらえる可能性もないわけではないだろ。 なさそうだけど。


2002年03月26日

私用で有給。 長野新幹線に初めて乗った。 トンネルの中でも携帯電話が使えるのか。

名刺がないのでヒヤヒヤものだったが、 うまいこと誰にも催促されなかった。


2002年03月25日

Air H" の売れ行き好調だそうだが、本当なのだろうか? というか、こちらの動作環境は、常識的に評価したら「劣悪」か、もう少しマシで「悪」程度だと思うので、これでヒット商品なのだとしたら、 多分こっちの環境がちょっとおかしいのではないか、というような気がしてきた。

例えば、どこでもいいから繋ごうとしたら、 しばらく(10〜20秒)たってから、「www.infoseek.co.jpが見つかりません」のようなエラーが発生する。 つまり、DNSに接続できなかったのだと思われる。 こういうことが「しばしば」あるのだが、 これってAir H" じゃなくて @niftyとか、あるいはWindows 2000 の問題なんですかね? どうでもいいけど、 いずれにしても普通に使うにはかなり厳しい状況だというのは事実。

速度としては、10kbps 程度は出ているので、 常時接続ということで、まあ不満はないけど。 32k? 寝ぼけたことを言ってはいけない。 夢と現実は区別しないと。


2002年03月24日

アサヒコムで、 クリックしたら高額請求された、 という事例が増えているので、 総務省がKDDIに改善策を要請したというニュースが出ていたが、 記事の中で「おもにアダルトサイトなどを閲覧中に」という表現があって、 どうも気になった。

というか、アダルト以外でそういうの、あるのか?


2002年03月22日

先日の C++ のプログラム、printf に相当する関数が分からないという話だが、 要するにこういうこと。

void calender::print_d(const int d) const {
    if (d < 10)
        cout << " ";
    cout << d << " ";
}

という個所があるでしょ、ここを次のように修正。

void calender::print_d(const int d) const {
    cout << setw(2) << d << " ";
}

さらに、ヘッダーファイルに #include <iomanip> を追加。 それだけの話なのだが、覚えていないと何ともできない。 Stroustrupさんの「プログラミング言語C++」は会社に置いてあるので、 それ以外の所ではパワーダウンする。 これってCD-ROM版とかないのか。 というか、何かオンラインマニュアルで出ていそうな気はするのだが。

要するにC的には、

printf("%2d ", d);

と書きたいのだが、C++だとどうするのか、という話。 ところで、これってマニピュレータ使わないとしたら、

void calender::print_d(const int d) const {
    cout.width(2);
    cout << d << " ";
}

でしょ、マニピュレータ使わない時はwidthで、使うとsetwになる。 どういう仕組みかというと、他にマニピュレータ使わないので fillとかprecisionというのがあって、これはマニピュレータ使う場合は setfillやsetprecisionという関数に対応している。 つまり、set+(マニピュレータ無しの名前) なのか、 と思ったのだが、じゃあどうして setwidth じゃなくてここだけ setw なんだっけ?

こういうことするからC++が難しくなっているのだと思うわけだが。

§


2002年03月21日

風邪で一日寝込む。


2002年03月20日

蟹たっぷりチャーハンを注文したが、カニがあまり入っていなかった。 とにかく食べてみるとやけに大盛りっぽい。 実は 蟹たっぷり チャーハンではなくて、蟹 たっぷりチャーハン だったか。

§

FCの話題なんだけど、 C++ でポインタを使うか参照を使うかという古典的な話が出ている。 「参照引数をむやみに使うべきでない」という曖昧な結論はでているのだが、 そりゃ当たり前で、 殆どの名詞に対して「*をむやみに使うべきでない」という命題は正しい。 問題はどういう時に使うことが望ましいかという相関的ガイドラインなのだが、 More Effective C++ (Scott Meyers, ピアソン) のp.11だとこうなっている。

参照は、何か指し示すものがあることをわかっている場合、他のものは指し示したくない場合、演算子を実現する際構文上の要請でポインターを使うと望ましくない結果となる場合に選択する機能である。そのれ以外の場合は、ポインターを使うべきである。

明確に使い分けろというのだ。 厳しい。

ところで、 そのれ (ママ) って何だ?

それはいいとして、 チームを組んで山に登る時に、一番体力の弱い者にあわせた計画でないと失敗するという逸話が出ていた。 これは超御意というか、明らかに正しいのだが、 話題がそこで終わっているようだ。 なぜなら、ここに突っ込むのは反則というか暗黙の了解で先に進まないというか、 タブーだからだと思うのだが、…。

裏ページだから現実も見たいという楽天家がいるかもしれないし、 FCにはとても書けなかったことを書いてしまうと、 実際それは正しいのだが、 ではどうするかというと、 まず、体力が弱い者がいる場合に、そんな山に登ってはいけない。 山に登る必然性がそもそもないのだ。 「登らない」という選択もあるわけだが、 そして、もっと現実を直視したら明らかなことがあって、 この場合は 体力の弱い者を捨てる というのが最も正しい選択肢になりがちなのである。 その方がゴールに早く到達できるし、 途中経過もうまく行く。 品質(何の?)もいい。


2002年03月19日

アサヒコムに、 中国でインターネットの口論で負けた腹いせに待ち伏せて拉致・殴る蹴るの暴行という事件があったと出ていたが、 中国ってそういう国なのか。 というか、あまり日本ではそういうの聞かないな。 実社会ではおとなしいというか、ネットで燃えるとか。


2002年03月18日

FCの発言にコメント付いたので、コメントにはコメントを(格言)というのを作成。 FCって何、という方もいるのか? @nifty の、C言語フォーラムですよ、@nifty会員なら無料で読めるから見るのが吉。 7番会議室です。

で、こういうのを書いた。

    int d = 30 + ((5546 >> month) & 1);

これは流石に見たことがない。 やってることは、ビットパターンで大の月と小の月を判定しているだけなのだが、 10進で5546と書かれると分からないというのが味噌。 なにが。

もう一つ、やっちゃえというのが、

    "\n      "[++day_of_week%7];

これは個人的には気に入っている。 プロジェクトリーダに「なんだこの空白は」とか言われたら、 こうすれば比較演算が省略できるので高速になるとか、 たった5バイトの追加で比較、分岐命令がなくなるからかえって節約できるとか、 適当にでっち上げれば勝てるかもしれないぞ。

自分のコードには書かないけど。


2002年03月17日

FCで久々に発言したのだが、カレンダーを画面に表示するというCのプログラム。 久々に謎のプログラムを見て、自分だったらどう書くのかと思ったわけで、 作ったのが次のような感じだが、Cのプログラムって久しぶりじゃないか、実は。

#include <stdio.h>

/* 曜日を 0〜6で返す
 * 範囲チェックはしていない
 */
int dayofweek(int y, int m, int d) {
    static int t[] = {0, 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};

    if (m < 3)
        y--;
    return (y + y/4 - y/100 + y/400 + t[m] + d) % 7;
}

/* 閏年チェック。閏年なら1、そうでないなら0を返す
 */
int is_uru(int y)
{
    /* 4の倍数でないなら閏年ではない */
    if (y % 4)
        return 0;

    /* 100の倍数でないなら閏年 */
    if (y % 100)
        return 1;

    /* 100の倍数でも、400の倍数でないなら閏年ではない */
    if (y % 400)
        return 0;

    /* 400の倍数は閏年 */
    return 1;
}

/* 指定年月の最後の日
 * 月に1〜12以外を指定すると0を返す
 */
int get_lastday(int y, int m) {
    static int ld[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    if (m < 1 || m > 12)
        return 0;

    if (m == 2 && is_uru(y))
        return 29;

    return ld[m];
}

/* 日付を表示する前に表示する内容
 */
void print_header(int y, int m) {
    printf("    %d 年 %d 月\n", y, m);
    printf("日 月 火 水 木 金 土\n");
}

void print_day(int d) {
    printf("%2d ", d);
}

void print_space(void) {
    printf("   ");
}

void print_lineend(void) {
    printf("\n");
}

/* 1日だけ表示
 */
void output_day(int d, int m) {
    if (d < 1 || d > m)
        print_space();
    else
        print_day(d);
}

/* 1行分の日付を表示
 */
void line(int d, int lastday) {
    int i;

    for (i = 0; i < 7; i++, d++) {
        output_day(d, lastday);
    }

    print_lineend();
}

/* 日付の部分を表示
 */
void body(int y, int m) {
    const int lastday = get_lastday(y, m);
    int day;

    /* この月が仮に日曜日から始まるとすれば、それは何日か?
     * 例えばこの月の1日が、
     *   月曜なら、その前の日曜日は 0日、
     *   火曜なら、その前の日曜日は -1日、…というように考える。
     */
    day = 1 - dayofweek(y, m, 1);

    while (day <= lastday) {
        line(day, lastday);
        day += 7;
    }
}

void calender(int y, int m) {
    print_header(y, m);
    body(y, m);
}

int main() {
    calender(2002, 3);
    return 0;
}

バグというのかどうか不明だが個人的にはバグなのが、 void output_day(int d, int m) という所。 m じゃなくて lastday とするのが正しい。 m はこのプログラムでは month を意味する変数なので、 ここに出てくるのはヘンなのだ。 ではなぜ m と書いたのかというのは後で。

このプログラムにおまけのクイズがついている。 ちなみに、FCでは(1)〜(3)しか出さなかった。

  1. 年、月をコマンドラインから指定できるように修正する。 あるいは、コンソール(キーボード)から入力して指定できるようにする。 あるいはGUIで操作できるアプリケーションにする。

  2. 関数 get_lastday() の一部は、

        if (m == 2)
            return 28 + is_uru(y);
    

    と書いても正しく動作する。では、このように書いた方がいいだろうか? あるいは、0か1ではなくて、28か29を戻す関数 feb_case() を作って、

        if (m == 2)
            return feb_case(y);
    

    とした方がいいだろうか。

  3. ※次の問いは、分かる人は一瞬で分かるけど分からない人はハマる系なので、 すぐに分かった人はコメントしない方が面白いと思います。 C++ の話はどうなったかというと、要するにここに来る。

    このプログラムは、単に画面にカレンダを表示するだけにしては怪しい所があるようだが、 一体どのような使い方を意図したのだろうか?

  4. HTML の table 形式で出力する。

    例。

    <TABLE BORDER>
    <CAPTION>2002年3月</CAPTION>
    <TR>
    <TH>日</TH><TH>月</TH><TH>火</TH><TH>水</TH><TH>木</TH><TH>金</TH><TH>土</TH>
    </TR>
    <TR>
    <TD>  </TD><TD>  </TD><TD>  </TD><TD>  </TD><TD>  </TD><TD> 1</TD><TD> 2</TD>
    </TR>
    <TR>
    <TD> 3</TD><TD> 4</TD><TD> 5</TD><TD> 6</TD><TD> 7</TD><TD> 8</TD><TD> 9</TD>
    </TR>
    <TR>
    <TD>10</TD><TD>11</TD><TD>12</TD><TD>13</TD><TD>14</TD><TD>15</TD><TD>16</TD>
    </TR>
    <TR>
    <TD>17</TD><TD>18</TD><TD>19</TD><TD>20</TD><TD>21</TD><TD>22</TD><TD>23</TD>
    </TR>
    <TR>
    <TD>24</TD><TD>25</TD><TD>26</TD><TD>27</TD><TD>28</TD><TD>29</TD><TD>30</TD>
    </TR>
    <TR>
    <TD>31</TD><TD>  </TD><TD>  </TD><TD>  </TD><TD>  </TD><TD>  </TD><TD>  </TD>
    </TR>
    </TABLE>
    
  5. 前後の月も表示する。 但し、次のように、縦ではなく横に並べること。

                                   2002年
    
             2月                    3月                     4月
     S  M Tu  W Th  F  S    S  M Tu  W Th  F  S    S  M Tu  W Th  F  S
                    1  2                   1  2       1  2  3  4  5  6
     3  4  5  6  7  8  9    3  4  5  6  7  8  9    7  8  9 10 11 12 13
    10 11 12 13 14 15 16   10 11 12 13 14 15 16   14 15 16 17 18 19 20
    17 18 19 20 21 22 23   17 18 19 20 21 22 23   21 22 23 24 25 26 27
    24 25 26 27 28         24 25 26 27 28 29 30   28 29 30
                           31
    

    ヒント: 例えばprintf ではなく sprintf であらかじめ用意したバッファに行の情報を保存して、最後に一気に表示するとよい。

  6. C++ で書く。

    calender クラスを設計して そこにprint メソッドを実装すること。 さらに、このクラスから html_calender クラスを派生させて、 html_calender クラスに対して print メソッドを実行した結果がHTML 形式になるように必要な関数を override する。
    (このような構造がよいという訳ではないが)

  7. Java で書く。

    ヒント: GregorianCalendar クラスを使う。

昔の私のプログラム見ている人は、芸風が変わったと思ったかもしれないが、 実際そう思う。特にリファクタリングを最近マジになってハマっているので、 その影響は大きいかもしれない。実はこのプログラム、 最初はこうだった。

#include <stdio.h>

/* 曜日を 0〜6で返す
 * 範囲チェックはしていない
 */
int dayofweek(int y, int m, int d) {
    static int t[] = {0, 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};

    if (m < 3)
        y--;
    return (y + y/4 - y/100 + y/400 + t[m] + d) % 7;
}

/* 日付より前に表示したい内容
 */
void print_header(int y, int m) {
    printf("    %d 年 %d 月\n", y, m);
    printf("日 月 火 水 木 金 土\n");
}

/* うるう年なら1
 */
int isUru(int year)
{
    if (year % 4)
        return 0; // 4で割り切れない

    if (year % 100)
        return 1; // 4で割り切れるが100で割り切れない

    if (year % 400)
        return 0; // 100で割り切れるが400で割り切れない

    return 1; // 400で割り切れる
}

/* 指定年月の最後の日
 */
int lastday(int y, int m) {
    static int ld[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    if (m < 1 || m > 12)
        return 0;

    if (m == 2 && isUru(y))
        return 29;

    return ld[m];
}

/* 日の部分を表示
 */
void print_body(int y, int m) {
    int day;
    int lastday_of_this_month = lastday(y, m);
    int i;

    day = 1 - dayofweek(y, m, 1);

    i = 0;
    for (;;) {
        if (day < 1 || day > lastday_of_this_month)
            printf("   ");
        else
            printf("%2d ", day); 

        day++;
        i++;
        if (i == 7) {
            i = 0;
            printf("\n");
            if (day >= lastday_of_this_month)
                break;
        }
    }
}

void print_footer()
{
    /* 何もしない */
}

void calender(int y, int m) {
    print_header(y, m);
    print_body(y, m);
    print_footer();
}

int main() {
    int p;

    int year = 2002;
    int month = 4;

    calender(year, month);
    return 0;
}

なお、day >= lastday_of_this_month は致命的なバグで、 >= ではなくて > とするのが正しい。 なぜか4月でテストしているので分からないが、 3月を表示してみると一発でバレる。 リファクタリングとかいいつつ、 テストスイートとか入ってないのがヤバいわけですが。

ま、それはそうとして、これをちょっと変えたら最初のようなコードになるわけで、 リファクタリングにハマる前だとそこまで変えなかったと思う。

で、問題は問3の「わかる人にはすぐわかる」系のアレなんですが、 既に想像していると思うけど、 このプログラムを書く時に、最初からHTMLで出すことを意識して考えていた。 しかし、plain text でも出せるといい。 というわけで、どちらでも出せるのが理想的なのだが、 じゃあどう実装すれば実現できるのか。 そこで問6に至るわけだけど、最初にイメージしたのは、 C++化して、calenderクラスを実装して、 html_calender というクラスを派生させて、 printメソッドを override すればいいだろ、という感じで、 実はこのCのプログラムは最初からC++的でそうすることを想定して書いてるのである。 という点ではおよそCらしくないCのソースだ。

ちなみに、 override する必要がある関数を print_ という名前で始めるようにしてある。

で、実はC++でも書いてみたんだけど、 どうもうまく行かないのでパス。 どこでコケたかというと、printf に相当する C++ の関数が分からなかったのだ。 って何かJavaでも同じようなこと言ったような気がするな。 printf 使えばいいじゃん、ってその通りなのだが、…。 見たいですか? 雑でよければ。まあこんな感じかなと。

#include <iostream>

using namespace std;

class calender {
public:
    calender();
    calender(const int y, const int m);
    virtual ~calender();

    int dayofweek(const int d);
    int is_uru() const;
    void print();

protected:
    virtual void print_header() const;
    virtual void print_footer() const;
    virtual void print_linestart() const;
    virtual void print_lineend() const;
    virtual void print_space() const;
    virtual void print_d(const int d) const;
    int m_y;
    int m_m;

private:
    void body();
    void line(int d) const;
    void set_lastday();
    void output_day(const int d) const;
    int m_lastday;
};

class html_calender : public calender {
public:
    html_calender(int y, int m);

protected:
    virtual void print_header() const;
    virtual void print_footer() const;
    virtual void print_linestart() const;
    virtual void print_lineend() const;
    virtual void print_space() const;
    virtual void print_d(const int d) const;
};

calender::calender() {}

calender::calender(const int y, const int m) {
    m_y = y;
    m_m = m;
}

html_calender::html_calender(int y, int m) {
    m_y = y;
    m_m = m;
}

calender::~calender() {}

// 曜日を 0〜6で返す。定石なのでアルゴリズムの説明省略。
// 範囲チェックはしていない
int calender::dayofweek(const int d) {
    const static int t[] = {0, 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};

    int y = m_y;
    if (m_m < 3)
        y--;
    return (y + y/4 - y/100 + y/400 + t[m_m] + d) % 7;
}

/* 閏年チェック。閏年なら1、そうでないなら0を返す
 */
int calender::is_uru() const
{
    /* 4の倍数でないなら閏年ではない */
    if (m_y % 4)
        return 0;

    /* 100の倍数でないなら閏年 */
    if (m_y % 100)
        return 1;

    /* 100の倍数でも、400の倍数でないなら閏年ではない */
    if (m_y % 400)
        return 0;

    /* 400の倍数は閏年 */
    return 1;
}

/* 指定年月の最後の日
 * 月に1〜12以外を指定すると0を返す
 */
void calender::set_lastday() {
    static const int ld[] =
        {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    if (m_m < 1 || m_m > 12) {
        m_lastday = 0;
        return;
    }

    if (m_m == 2 && is_uru()) {
        m_lastday = 29;
        return;
    }

    m_lastday = ld[m_m];
}

// 日付を表示する前に表示する内容
void calender::print_header() const {
    cout << "    " << m_y << " 年 " << m_m << " 月\n";
    cout << "日 月 火 水 木 金 土\n";
}

void html_calender::print_header() const {
    cout << "<p>\n";
    cout << m_y << " 年 " << m_m << " 月\n";
    cout << "</p>\n";
    cout << "<table>\n"
            "<tr><th>日</th><th>月</th><th>火</th><th>水</th>"
            "<th>木</th><th>金</th><th>土</th>\n";
}

void calender::print_footer() const {
}

void html_calender::print_footer() const {
    cout << "</table>\n";
}

void calender::print_linestart() const {
}

void html_calender::print_linestart() const {
    cout << "<tr>";
}

void calender::print_space() const {
    cout << "   ";
}

void html_calender::print_space() const {
    cout << "<td></td>";
}

void calender::print_d(const int d) const {
    if (d < 10)
        cout << " ";
    cout << d << " ";
}

void html_calender::print_d(const int d) const {
    cout << "<td>" << d << "</td>";
}

// 1日だけ表示
void calender::output_day(const int d) const {
    if (d < 1 || d > m_lastday)
        print_space();
    else
        print_d(d);
}

void calender::print_lineend() const {
    cout << "\n";
}

void html_calender::print_lineend() const {
    cout << "</tr>\n";
}

//1行分の日付を表示
void calender::line(int d) const {
    int i;

    print_linestart();

    for (i = 0; i < 7; i++, d++) {
        output_day(d);
    }

    print_lineend();
}

// 日付の部分を表示
void calender::body() {
    /* この月が仮に日曜日から始まるとすれば、それは何日か?
     * 例えばこの月の1日が、
     *   月曜なら、その前の日曜日は 0日、
     *   火曜なら、その前の日曜日は -1日、…というように考える。
     */
    int day = 1 - dayofweek(1);

    while (day <= m_lastday) {
        line(day);
        day += 7;
    }
}

void calender::print() {
    set_lastday();
    print_header();
    body();
    print_footer();
}

int main() {
    html_calender cal(2002, 3);

    cal.print();
    return 0;
}

見せたくないというのは、例えば const の使い方とかすごく雑で、 例えば line(int d); というメソッドは line(const int start_day); だと思うのだが、 何か頭の中でひっかかっていて、こうなっている。 あと、コメントとか修正してないの混ざってるし。

この程度だったらCで書いて単にフラグか何かで分岐させればいいやん、 って感じもするのだが、どうなんだろ。 ちなみに、こんな感じで出力できているらしい。

2002 年 3 月

12
3456789
10111213141516
17181920212223
24252627282930
31

で、あとは土日の色を変えるとか、 祝祭日を赤にするとか、 いろいろやることはあるわけだが、 print_d() の所だけ修正すればいいので簡単なはず。 もっとも、祝祭日を判定する関数が必要になって、これが結構難問だが。 「海の日は○○年から実施された」みたいな情報が必要になるから。

ちなみに、m って何、という件だが、 どうも C++ で書いた時のコードが混じったらしいな。 m_lastday というのを省略して m にしてしまったらしい。


2002年03月16日

イヤースコープって知ってますか。 ハンズに買いに行ったら完璧に売り切れで、 バックオーダーが40か50入っていて、いつお渡しできるか分かりません、 だとのこと。 そんなに人気あるのか。

もう一つ欲しいのがあったのだが、 これも売り切れ。 最近、買いたいものが買えないのだが、 こっちは箱積みだった店を他に知っているので、そちらに当たってみるまで内緒。

§

新宿で馬刺を食べる。 たてがみって白身だとは知らなかった。


2002年03月14日

今頃確定申告に行った。 一応、締め切りには間に合ったのだが、 皆さんご存知のように今年から用紙が激変している。


2002年03月09日

K.N.E.R. って前からこんなのだっけ?

§

ブロードキャスターで、 国産肉と外国産肉の味が同じだったら、区別する必要ないじゃないか、とかいう。 もちろんそうなんですが、 少なくとも、牛肉って分かりませんか?  私は関西系なので、東京の肉って国産でも外国産でも同じというか、 全然ウマくないと思っているので。 やっぱり神戸とか、あのあたりの肉は美味い。 鋤焼きとかにした時に歴然としていると思う。

鳥とか豚はちょっと分からないか。 アジトでは、卵は卵売りの人から買っているのだけど、 あの卵を食べたら、スーパーで売っている卵は一体何なのだ、とか思ったりする。 それ位、味が違う。


2002年03月04日

Error (0x1 0x0 0x0 0x80020007):

BIND step: could not bind to {658A6F33-398A-1722-B87C-0800209B647F}

と言われてもどうしてよいやら。 ちなみに、E tradeです。 インターネット株式取引って難しいものだ。 ちなみに、あさひ銀行株を持っていたのだが、 ある日見たら、大和銀トレーディングスとあさひ銀行の2つともポートフォリオに出てきていた。 どういうロジックになっているのだろう? ちなみに、 あさひ銀行が-n株、大和銀トレーディングスが2n株あるという表示になっている。


2002年03月03日

マネーの虎、という番組がゴールデンタイムに移動するらしいが、 あの番組、結局ロクなビジネスプラン持った人が来ないし、 かといって、 ブッ飛んだ人に投資しようというようなアッと驚く人がいるわけでもなく、 割と普通というか、 出資する人がいまいち個性がないような気がするし、 人生相談番組としては暇つぶしになるのだが、 一般受けするような内容ではないと思う。 金が直接動く内容だから仕方ないのかもしれないが、 出資する側の言い方が無茶苦茶キツくて、 普通の感覚だと、 見ていて気持ち悪くなるというか、 不快だという人も結構いるんじゃないかな。 だいたい人間(に限らないかもしれないが)って、 不愉快な人の顔を見ているだけでも不愉快になるわけで、

個性ないというと失礼かもしれないが、 年商数十億ってレベルだとそうなのかもしれないですね。 今年度の赤字が数千億なんて企業がゴロゴロしている国なんだから、 年商が兆を越えるあたりじゃないと、 その人を見て面白いというような経営者は出てこないのかもしれないが。 というか、年商10億程度で、投資する余裕あるのだろうか? 利益が10億というのなら分かるけど。

ちなみに、個人的には不動産会社の社長さんは割とイケてると思う。

というか、今が深夜枠だからなのかもしれないが、 同じシーンを何度も使いまわしして水増しして放送しているので、 最初のうちは見ていたのだが、 自然に見なくなってしまった。 CMはやけに多いし。 「愛エプ2」見るまでの暇つぶしで画面に出しているって感じ。

§

また風邪(?)でダウン。


2002年03月02日

新宿で面白い人発見。 JR東南口のあたりから下を見ていたのだが、 ティッシュを配っている男、かなりしつこいのである。 しかも、配る相手を選んでいるというのが露骨で、 ティッシュ配りというよりナンパしている感じ。 ティッシュは女性の顔の前に出す。 断っても二度、三度と出す。 20歩、30歩と歩いてついて行くので逃げ出す人


(C) 2002 Phinloda, all rights reserved

RIMNET: phinloda@st.rim.or.jp