フィンローダのあっぱれご意見番

第49回:古きを削除して新しきを知る

初出: C MAGAZINE 1996年5月号
Updated: 1996-05-22

[1つ前] [1つ後] [一覧] [ホームページ]


 前回、ホームページの話を書いたが、ホームページというのはその人が用意し たページの「ホーム」にあるページだけを意味するのが正しいそうだ。恥ずかし ながらもっと漠然としたイメージで考えていたので、以前書いたものは意味が分 からない文章になってしまったかもしれない。想像力でカバーしながら読んでい ただければ幸いである。

 ところで、例えばもし私のホームページがhttp://www.st.rim.or.jp/‾phinloda/ を意味するのだとすれば、その下に配置されているたくさんの他のページは一体 何と呼ぶのだろうか。「ページ」という表現は漠然としていて分かりにくい。ホー ムディレクトリとのアナロジーを考えれば、サブディレクトリというのがあるか らサブページ? でもサブページという表現は見たことがない。Webページという のなら、どこかで見たような気がする。

    *
WWWを見ていると、「New」というマークが付いたリンクをよく見かける。新し い情報を示すマークのだが、この種のアイコンはパブリックドメインのものがあ るらしく、おおむね似たような表示になっている。私の場合はページ全体が日本 語で書かれているのに、ここだけ"New"という英語を使うのはキザな気がしたので、 日本語で UpdateNewというアイコンを自作して使っている。これで英 語の分からない人でも安心だ。もっとも、"New"が分からない人がネットサーフで きるとは全くもって思えないわけだが。

余談だが、英語と日本語の2ページを用意している人もいる。私は英語が下手なの で、誰か翻訳してくれないかな、とか思っているのだが、翻訳というのもコスト がかかる話だから実現困難か。で、ページの切り換えだが、ホームページが日本 語で表示され、そこに「English: click here」と書いてあるのは分かる。分から ないのは、デフォルトが英語のページで「Japanese: click here」というものであ る。これが結構あるのだ。先日「Nihongo ha koko」と書いてあるのを見て思わず 感動した位だ。つまり、日本語のページに「英語版はここをクリックしてくださ い」と書いておくのと同じ位おかしいと思うのだが、現実的に考えてみると、WWW を見る技能を持つ人なら「Japanese: click here」程度の英語は分かるというこ となのだろう。

さて、中には、いつまでも"New"が付いていことがある。あ、私のことかもしれな い。これは一体どういうことかというと、"New"を付けたままどこかに行ってしま って戻ってこないということもあるが、拉致されるというよりは、"New"をいつか は消すべきだということを忘れてしまっているケースが多いのではないか。

私のWeb pageは、毎日一回程度の頻度で更新情報を追加している状況なので、ど こに新情報があるのかだんだん分からなくなってくる。ところで、私のHTMLの文 書の中では、次のように書いた行があれば「新情報」というマークが付くように なっている。

<IMG SRC="new.jpg" ALT="New">(1996-04-02)
つまり、HTMLファイルからこの行を消せば、これに対応している「新情報」とい うマークは消える。だから、毎日このような行の日付をチェックし、例えば1週 間以上経過していればその行を削除する、という作業をすればよいことになる。

しかし、こんなことは人間がやることではない。人間が手作業でやると間違いが 増える種類の処理としては、典型的な定形作業である。つまり、こういう毎日お きまりの作業は、コンピュータにやらせるに限るのだ。きっと処理するフリーソ フトが既にあるような気がするのだが、そういうのを使っては「趣味はプログラ ミング」と自称している立場上なんとなく落ち着かないので、ここはやはり手作 りである。

まず、要するに、そういう行を抜き出せばいいと考えてみる。手段はいくつもあ るが、とりあえずawkを使うことにした。「<IMG SRC="new」あるいは「<IMG SRC ="update」で始まる行を処理の対象とする。そして、日付を計算し、現在の日付 と比較し、7日以上の差があったら削除、そうでなければ現状維持、ということに すればいい。簡単な話だ。

と思ったのだが、そう簡単でもないのである。まず、どうすれば現在の日付をawk で知ることができるだろうか。そんな関数はawkにはないのである。だったらdate コマンドを使って、画面に表示して、それを取り込んで処理すればどうだ。アイ デア悪くはない。さて、dateコマンドが標準出力に出したメッセージをawkで受け 取るにはどうすればよいだろう。awkにはいくつか分家があるのだが、その中のgawk には、標準出力に書かれた内容をパイプで取り込むがある。普段はDOSの上でもこ れを使っているので、使い慣れているのだ。ところが、何故かRIMNETの/usr/local /binにはgawkがなかった。標準のawkしか使えないのである。awkだと、標準出力 に書かれた内容を取り込むのはちょっと難しいような気がする。system()関数を 実行した時にその戻り値を得ることはできる。いや、もしかすると私が知らない だけかもしれない。awkはあまり詳しくないのである。一旦ファイルに書いておい て、そこから読むという手もあるか。

よくない癖だが、考えているよりも実行した方が早いということはよくある。そ こで、要するに現在日時を戻り値にするようなコマンドがあれば、それをawkで受 け取ることができるわけで、そのようなコマンドを作ってしまえばよいという結 論に達した。C言語で書けば約10行である。実は、ついでだから、「1996-04-02」 のような引数を与えれば、それに対応する値を帰すようにしてみた。こうすると、 awkスクリプトがちょっとだけ楽になる。しかし、systemを呼ぶよりもawkの中だ けで処理した方がいいような気がしたので、結局元に戻してしまったのだが。

さて、ここまで用意できたら、毎日一度、例えば、次のようなコマンドを実行す ればよい。

awk -f daily.awk ‾/public_html/index.html cp #temp% ‾/public_html/index.html

このような更新マークの入ったHTMLファイルは数個あるので、実際は、各ファイ ル毎にこの処理を行う必要がある。毎回手で入力する、なんてことをする訳がな い。cshスクリプトにしておけばよいのである。こういうことが出来るのがRIMNET のメリットである。

で、これを毎日手で実行する必要もない。crontabというコマンドがあるからだ。 毎日、一定の時間に勝手に処理するように指定しておけばよいのだ。これで、更 新マークを付けた行は、1週間経過すると勝手に消えるようになった。ページを放 置しておいても、時間がたつと「New」マークは勝手に消えるのである。ま、コン ピュータがこれだけ普及した時代に、これしきのことが出来ない方がおかしいの だが、これも細かい経験の積み重ねの結果なので、始めてWebで情報発信する人に いきなり同じことをやれ、というのはちょっと無茶かもしれない。

 で、ここまでやってから気付いたのだが、どうせCでプログラムを書けるのなら、 awkからわざわざそういう関数を呼ばなくても、指定したファイルから該当行を消 す処理まで全部C言語でやってしまえば、awkは不要なのである。検索する文字列 は単純だから、パターンマッチングのような高度な処理もいらない。プログラム を再開発するのを避けるという原則には若干反するかもしれないが、とりあえず、 趣味がプログラミングということで見逃してもらえれば有り難い。細かいことを 言うと、awkは処理が重いのではないかというのも気になるのである。RIMNETは、 ユーザーがシェルでログインして自分で書いたプログラムを起動できるという便 利な環境を提供しているが、あまりCPUタイムを使うと「ちょっとまて」が出るか もしれないのだ。もちろん、たかが「New」を消す程度の処理に、気にするほどの CPUタイムが必要だとも思えないのであって、これは自分に言い聞かせるための言 い訳に過ぎないのである。(*1)


---- list 1 ----
/* today.c */
#include <time.h>

int main(void)
{
    time_t t;
    struct tm *st;

    t = time(NULL);
    st = localtime(&t);
    return (st->tm_year - 96) * 365 + st->tm_yday;
}


---- list 2 ----
# daily.awk
BEGIN {
    delcount = 0
    tmpfile = "#temp%"
    m[1]=-1; m[2]=30; m[3]=58; m[4]=89; m[5]=119; m[6]=150
    m[7]=180; m[8]=211; m[9]=242; m[10]=272; m[11]=303; m[12]=333
    now = system("today");
}

/^<IMG SRC=¥"new.jpg¥"/ || /^<IMG SRC=¥"update.jpg¥"/ { pos = index($0, "(") tmp = substr($0, pos + 1) up = (tmp - 1996) * 365 pos = index(tmp, "-") tmp = substr(tmp, pos + 1) up += m[tmp + 0] pos = index(tmp, "-") tmp = substr(tmp, pos + 1) up += tmp if (now - up >= 7) { delcount++ } else { print > tmpfile } next } { print > tmpfile } END { exit delcount }


補足

(*1) え、消えてないじゃないかって? 実はちょっと個人的にワケありで、この 処理は一時中断しているのである。別に深い意味があったり、利用を禁止されて いるわけではないので念のため。
(C) 1996 Phinloda, All rights reserved
無断でこのページへのリンクを貼ることを承諾します。問い合わせは不要です。
内容は予告なく変更することがあります。