GEIST GRUPPE

June 24, 2004

イメージカウンタ (6)

OSたんカウンタを使ってみたかっただけなのです。

06894

という事で、

#!/usr/local/bin/perl -wT

use strict;

my $addr = $ENV{REMOTE_ADDR};

open FILE, "+< log.dat" or die;
flock FILE, 2 or die;
my($count, $ip) = split /:/, <FILE>;
seek FILE, 0, 0;
if ($ip ne $addr) {
    $count++;
    print FILE "$count:$addr";
} else {
    seek FILE, 0, 2;
}
truncate FILE, tell;
close FILE;

$count = sprintf "%05d", $count;

print "Content-Type: text/html\n\n";
for (my $i = 0; $i < length("$count"); $i++) {
    my $number = substr($count , $i, 1);
    print "<img src=\"/img/$number.gif\" alt=\"$number\" width=\"45\" height=\"80\">";
}

こうなりました。ところで、『Perl/CGI 辞典』に依れば、SSI で呼び出す場合、ヘッダーは必要ありませんという事なのですが、

print "Content-Type: text/html\n\n";

上記の一行を削除したところ、動かなくなったので、上の一行の代わりに下の一行を追加。

print "\n";

少なくとも、うちの環境ではこんな記述がないと動作しませんでしたが。『Perl/CGI 辞典』のサンプルも含めて。

June 23, 2004

イメージカウンタ (5)

ところで、forループにしたら、どうなのよッて話です。

use Benchmark;

my $timing = 5000000;
my $count = 9999;

timethese ($timing, {

    'No.2' => <<'__second__',
        foreach (0..length("$count")-1) {
            my $number = substr($count , $_, 1);
            print "<img src=\"/img/$number.gif\" alt=\"$number\" width=\"45\" height=\"80\">";
        }
__second__

    'No.4' => <<'__fourth__',
        for (my $i = 0; $i < length("$count"); $i++) {
            my $number = substr($count , $i, 1);
            print "<img src=\"/img/$number.gif\" alt=\"$number\" width=\"45\" height=\"80\">";
        }
__fourth__

});

結果、

Benchmark: timing 5000000 iterations of No.1, No.2...
      No.2:  5 wallclock secs ( 5.02 usr +  0.00 sys =  5.02 CPU) @ 996810.21/s
(n=5000000)
      No.4:  4 wallclock secs ( 3.86 usr +  0.00 sys =  3.86 CPU) @ 1295336.79/s
(n=5000000)

若干、速くなったわけですが、5,000,000回も繰り返して、この数値だと、どっちでも構わないのでしょうね。

June 22, 2004

イメージカウンタ (4)

『はじめてのPerl』に、forと書いてもforeachと書いても、Perlはそれを同じものとして扱うと書かれてました。後ろに続くカッコの中身を見て、どちらの意味なのかを判断するのだそうです。という事で、

use Benchmark;

my $timing = 5000000;
my $count = 9999;

timethese ($timing, {

    'No.2' => <<'__second__',
        foreach (0..length("$count")-1) {
            my $number = substr($count , $_, 1);
            print "<img src=\"/img/$number.gif\" alt=\"$number\" width=\"45\" height=\"80\">";
        }
__second__

    'No.3' => <<'__third__',
        for (0..length("$count")-1) {
            my $number = substr($count , $_, 1);
            print "<img src=\"/img/$number.gif\" alt=\"$number\" width=\"45\" height=\"80\">";
        }
__third__

});

結果、

Benchmark: timing 5000000 iterations of No.1, No.2...
      No.2:  5 wallclock secs ( 5.20 usr +  0.00 sys =  5.20 CPU) @ 960799.39/s
(n=5000000)
      No.3:  5 wallclock secs ( 5.22 usr +  0.00 sys =  5.22 CPU) @ 958037.94/s
(n=5000000)

だいたい、こんな数値。で、No.3 の方がちょびっと速かったり、No.2 とNo.3 がまったく同じ数値だったりもするので、ここはおとなしく、foreach ッてしときます。

June 21, 2004

イメージカウンタ (3)

取り敢えず、

#!/usr/local/bin/perl -wT

use strict;

my $addr = $ENV{REMOTE_ADDR};

open FILE, "+< log.dat" or die;
flock FILE, 2 or die;
my($count, $ip) = split /:/, <FILE>;
seek FILE, 0, 0;
if ($ip ne $addr) {
    $count++;
    print FILE "$count:$addr";
} else {
    seek FILE, 0, 2;
}
truncate FILE, tell;
close FILE;

$count = sprintf "%05d", $count;

print "Content-Type: text/html\n\n";
foreach (0..length("$count")-1) {
    my $number = substr($count , $_, 1);
    print "<img src=\"/img/$number.gif\" alt=\"$number\" width=\"45\" height=\"80\">";
}

こんな感じです。

June 14, 2004

イメージカウンタ (2)

ベンチマークテストをしてみたく候。

use Benchmark;

my $timing = 5000000;
my $count = 9999;

timethese ($timing, {

    'No.1' => <<'__first__',
        my $str;
        foreach (0..length("$count")-1) {
            my $number = substr($count , $_, 1);
            $str .= "<img src=\"/img/$number.gif\" alt=\"$number\" width=\"45\" height=\"80\">";
        }
        print $str;
__first__

    'No.2' => <<'__second__',
        foreach (0..length("$count")-1) {
            my $number = substr($count , $_, 1);
            print "<img src=\"/img/$number.gif\" alt=\"$number\" width=\"45\" height=\"80\">";
        }
__second__

});

コマンドプロンプトから実行した結果、案の定、大差なかった。

Benchmark: timing 5000000 iterations of No.1, No.2...
      No.1:  6 wallclock secs ( 6.42 usr +  0.00 sys =  6.42 CPU) @ 778573.65/s
(n=5000000)
      No.2:  5 wallclock secs ( 5.02 usr +  0.01 sys =  5.03 CPU) @ 994035.79/s
(n=5000000)

といっても、コードの断片の取り方がよく分かってないんですけどね。

June 13, 2004

イメージカウンタ (1)

カウンタを画像で出力してみたくなったので、『Perl/CGI 辞典』から拝借。

sub getImgStr {
    my ($cnt) = @_;
    my $str = "";
    foreach (0..length("$cnt")-1) {
        my $img = substr($cnt , $_, 1);
        $str .= "<IMG SRC=\"img/${img}.gif\">";
    }
    return $str;
}

昨日のカウント数、今日のカウント数、これまでの合計、といった具合に3 つの数字を出力するのでサブルーチンにしてると思うんですが、これまでの合計だけを出力するならその必要も無いか、とも思うので、

my $str;
foreach (0..length("$count")-1) {
    my $number = substr($count , $_, 1);
    $str .= "<img src=\"/img/$number.gif\" alt=\"$number\" width=\"45\" height=\"80\">";
}
print $str;

このようにして、その後、

foreach (0..length("$count")-1) {
    my $number = substr($count , $_, 1);
    print "<img src=\"/img/$number.gif\" alt=\"$number\" width=\"45\" height=\"80\">";
}

このようにしたけど、まぁどうでもいい話ですね。

May 27, 2004

メンテナンス

職場に向けてバイク走らせたら、通りすがりのお姉さんに捕まって、「課長から電話」と携帯渡された。時刻は8 時ジャスト。遅刻決定。そんな夢で目が覚めた、いつもどおりの朝。でも、夢にも思わなかった。バイクのチェーンが外れるなんて。正夢ッてあるんだなぁ、とか思った。

チェーンが伸びている状態で、急なアクセルワークとかしちゃうと稀に外れたりするそうですよ。んで、道路の真ん中から道端までズリズリひきずって移動させたせいで、チェーンが完全に捻れたらしく、チェーン交換と相成りました。そんなわけで、普段からメンテナンスはしっかりやっとくべきだった、とか思った。ついでにオイル交換も依頼。3,000km でやるべきところ、4,700km まで走ってたので。

April 13, 2004

テキストカウンタ

いきなりですが、以下、『Perl/CGI 辞典』からの引用です。

カウンターの考え方は人によって違います。

例えば過去何件のIP アドレスを残しておくかでカウント数は大きく違いますし、同一IP から1 日1 回しかカウントされないようにした場合、アクセスする人が同じプロキシを使っていれば別の人からアクセスがあっても1 件にしかカウントされません。

同一IP アクセス云々という前に、アクセスする人がブラウザの画像をOFF に設定していたら、IMG タグ呼び出し形式ではその人の分は全くカウントされません。また、アクセス時間を短くするソフトなどで勝手に一度見たサイトを定期的にアクセスして、人間は誰も見ていないのにカウントされてしまう場合もあります。

さらに、カウンターの処理を多くすればするほど時間がかかり正確なカウント数がとれなくなる…なんて事もあり得ます。

カウンターはあくまで「目安」です。こだわりすぎて何のためにつけているのか忘れてしまうようなCGI は作らないようにしましょう。

坂下夕里『Perl/CGI 辞典』

という事で、個人的には、

以上、3 点を満たせばよいかなぁと思っているわけで、SSI 方式のアクセスカウンタのスクリプトを真似てみました。ちなみに、『Perl/CGI 辞典』のサンプルよりも、あまり数えないカウンタを参考にさせて頂きました。つうか、あまり数えないカウンタから機能削除しただけです。それが最も手っ取り早い気がしたので。いや、たったそれだけでもかなり苦労したのです、馬鹿ですから。あまり数えないカウンタのソースとPerl の本を繰り返し眺めて、素人なりに説明を書き込んで、(ココはこういう事なのね〜)とかてきとうに納得し、どこを削ればいいのか、頭悩ませて。

#!/usr/local/bin/perl -wT

use strict;

my $addr = $ENV{REMOTE_ADDR};

open FILE, "+< log.dat" or die;
flock FILE, 2;
my($count, $ip) = split /:/, <FILE>;
seek FILE, 0, 0;
if ($ip ne $addr) {
    $count++;
    print FILE "$count:$addr";
} else {
    seek FILE, 0, 2;
}
truncate FILE, tell;
close FILE;

printf "Content-type: text/plain\n\n%05d", $count;

呼び出しは、<!--#exec cgi="/cgi-bin/count.cgi"-->とか。

April 07, 2004

暗きもの/The Dark Demon

エドガー・ヘンキスト・ゴードン
幻想文学作家。背が高く、痩せていて、青白い顔と深く落ちくぼんだ目が特徴。祖先の1 人がウェールズの魔法使いだったらしい。シダー・ストリートにある住居で隠者めいた暮らしをしていたが、後に失踪した。夢から霊感を受けて執筆を行い、『妖魅の樋口』、『夜の魍魎』、『混沌の魂』などの著作がある。
暗きもの
豚の鼻、緑色の目、牙と鉤爪を備え、全身が柔毛に覆われて真っ黒な、異界の神性。その使者となるべき人間に、夢を通じて知識を与える。使者となるべき人間が、その知識を学び終えた後、ヴァルプルギスの夜に使者と同化、この世界に顕現する。ナイアーラトテップと関連するものと考えられている。
『混沌の魂』
エドガー・ゴードンの著書。出版社と絶縁した後、最初に自費出版された単行本。
『妖魅の樋口』
エドガー・ゴードンの代表作。宇宙の最果てにある暗黒都市や、無定型の玉座から話しかける奇妙な住民のこと、奇怪な幾何学と超地球的生命形態について生々しく描写されている。
『夜の魍魎』
エドガー・ゴードンの初の単行本。あまりに病的なテーマのため、失敗作となった。

March 30, 2004

毎日、飯の支度をし、散歩に連れ出し、糞を片付ける。そんな世話役にすら噛みつく馬鹿犬でも、いなくなってしまうと、とても寂しく。犬小屋が空になってしまった今、思うのは、昨日の散歩を20 分で切り上げるんじゃなかった。もっと一緒に遊んであげるんだった。もっと旨いモノ食わせてあげるんだった。そういや、最近、足腰が弱ってきてた。尿も異常に臭ってた。それなのに病院に連れて行く事、失念してた。9 年目だし、そろそろ気をつけないといけないなぁ、でもまだ大丈夫だろ? 油断してた。全然、大丈夫じゃなかった。楽しい思い出もあるけれど、後悔ばかり。

母の様に泣き叫べられたら良いのに。そんな事も出来なくて。就業中、思い出しては涙をこらえ、夜中、1 人で酒を飲みながら泣いた。

February 22, 2004

オペラ

先日のShuriken 購入で、たがが弛んだのか、Opera 7.23 を購入。なんかキャンペーン中で安くなってた、ッてのも原因。おかげで、広告が出なくなったわけですが、別にそうする必要はなかったなぁと、しょんぼり。

February 11, 2004

メールソフト

APOP に対応しているメールソフトが必要になりまして。最近では、一太郎がバージョンUP しようが、ATOK がバージョンUP しようが、知らん顔なのですが、かつてはJustSystem 万歳!! って感じだったわけですから、同社のShuriken Pro3を選択。Just MyShop から初めてのダウンロード購入。使い方もそのうち慣れるだろうし。説明書あってもどうせ読まないし。パッケージ購入するより安いし。個人的にそれが一番重要。まぁ、そんな事よりなによりも、久しぶりにカードを使って緊張した。

Navigation

Valid XHTML 1.0 Strict