30. SSI自動NEW表示 -- 楽してウェブページ更新告知

 ウェブページの更新をしたときには、新しくなったかどうかわかるように、その前のホームページなどでNEW表示をしておきたいもの。でも、ホームページに毎回<IMG>タグを入れたり、あるいは後になってそれを削ったりするのはめんどうだ。削るのを忘れて何か月もNEW表示をしていると、さすがに信用問題。そこで、ウェブページのファイルを更新するだけで、NEW(GIFイメージ)が表示し、時間が経過するにしたがって暗くし、1か月後には消すためのスクリプトを作ってみた。


実行例

 サンプルを見てみてね。


レシピ

【材料】
 <1> new.pl…… 自動NEW表示用スクリプト
 <2> new0.gif…… もっとも新しいを表現するGIF
 <3> new1.gif…… 少し古くなったを表現するGIF
 <4> new2.gif…… 更に古くなったを表現するGIF
 <5> new.htm…… 自動NEW表示実行用HTML例

【手順】
(1) CGIの実行環境の確認

本スクリプトはSSIを利用するため、SSIの実行環境設定を行う。

(2) 上記<1>〜<4>ファイルをサーバーに転送する

これらはすべて同じディレクトリに転送すること。
new.plとnew.htmはASCIIモードで転送すること。
GIFファイルはBINARYモードで転送すること。

(3) UNIXにログインしてファイルのパーミッションを変更する

$ chmod 705 new.pl [Enter]
$ chmod 604 *.gif [Enter]
$ chmod 604 new.htm [Enter]

(4) UNIX上でスクリプトの動作確認をする

$ ./new.pl new.htm [Enter]
今日(12月17日(木))の06時06分に更新! やったぁ!
実行して上記のような表示が出るか確認する。

(5) ブラウザで表示して動作確認をする

ページを表示して、正しく更新日が表示されればよい。

参考: UNIXオペレーションの行頭にある"$"はUNIXのプロンプトなので、入力する必要はありません。


スクリプトの説明

$file = $ARGV[0];
 コマンド実行時の引数を得て、ファイル名とする。「./new.pl abc.htm」が実行されたら「abc.htm」が対象のファイル名となる。
 念のため書いておくが、掲示板などの更新時刻を知りたいときは、スクリプト本体ではなく、ログファイルのほうを調べること。

$f = (stat($file))[9];
 指定されたファイルの更新時刻を得る。statはファイル情報を得るためのperlの関数。10番目が更新時刻となっている。

$tt = int(($t + 32400) / 86400);
$ff = int(($f + 32400) / 86400);
$a = $tt - $ff;
 $tには、1970年1月1日から現在までの秒数が、$fには1970年1月1日からファイルが作成された日時までの通算秒数が入っている。この両者を通算日数に直す。どちらの値も同じならば、ファイル更新は今日行われたことになり、差が1ならば昨日更新されたことになる。
 ここで86400は1日の秒数(60秒×60分×24時間)である。32400はグリニッジと日本の時差(60秒×60分×9時間)。

$tt = int(($tt + 4) / 7);
$ff = int(($ff + 4) / 7);
$b = $tt - $ff;	
 上記と同様に、今度は週が同じかどうか調べる。基準日の1970年1月1日は木曜なので、4を加えて週の始まり(日曜)との差を補正している。

if    ($b == 0) { $W = "今週"; }
elsif ($b == 1) { $W = "先週"; }
elsif ($b == 2) { $W = "先々週"; }
else            { $W = "$b週前"; }
 $bを判断して、いつの週に更新したかを出力準備。

if    ($a == 0) { print "今日($D)の$Tに更新! やったぁ! $new0"; }
elsif ($a == 1) { print "昨日($D)の$Tに更新! ちょっと見てってぇ! $new0"; }
elsif ($a <  7) { print "$a日前($D)の$Tに更新! 見て見てー! $new0"; }
elsif ($a < 14) { print "$Wの$Dに更新したんだってば $new1"; }
elsif ($a < 30) { print "$Dに更新したナリ $new2"; }
else            { print "$Y $Dに更新"; }
 $aを判断して、いつの日に更新したかを出力する。


[おまけ解説一覧に戻る]