ishiducaの日記 このページをアンテナに追加 RSSフィード

2009-04-25

[][]簡単なブックマークを表示するスクリプトを書いてみる1 15:01 簡単なブックマークを表示するスクリプトを書いてみる1 - ishiducaの日記 を含むブックマーク はてなブックマーク - 簡単なブックマークを表示するスクリプトを書いてみる1 - ishiducaの日記 簡単なブックマークを表示するスクリプトを書いてみる1 - ishiducaの日記 のブックマークコメント

ブックマークを自作するのも今更な今日だけども、これは学習のためなのでスクリプトを書いてさらしてみる。当然ツッコミは大歓迎ですので、ぜひとも!

さて、ファイルの書き込みは後日として、ログファイルを読み込んで表示するだけのスクリプトを書いてみた。

ログファイルは、たとえばこんな感じ

$ cat 2009-04-25.log

[Apache] Webサーバログについて     http://tech.bayashi.net/svr/.../apachelog.html    16:28:41
ログファイルの場所                 http://www.adminweb.jp/.../index1.html            16:20:36
Apacheのアクセス・ログを解析する   http://itpro.nikkeibp.co.jp/.../305224/           16:20:34
CGIからファイルを作成してみる      http://d.hatena.ne.jp/.../p1                      13:09:01
  • たとえば毎日100件とかブックマーク(実際にはそんなにブックマークしないだろうけど)すると、単一のログファイルだと、後々重くなりそう。
  • 日付をファイル名にしたログファイルが良いんじゃないかと
  • 日付は YYYY-DD-MM 形式がいいかな
  • 文字コードは utf-8 で保存してある

スクリプト(view.cgi)は、こんな感じ。現状では出来るだけ起動オプションを使っていく方針なので、随分奇異な感じがするかも

#!/usr/bin/perl -wnlaF'\t+'
use strict;
use CGI;

our($li);

BEGIN{

# liタグのテンプレート
# 複雑な書き方をする場合はヒアドキュメントを使ったほうが楽か?
($li =<<"LI")  =~ tr/\n//d;
\t<li><a href="%%%URI%%">%%%TIT%%</a>
 (<span style="font-size:smaller">%%%DATE%% %%%TIME%%</span>)</li>
LI
;

    # 日付ごとにログファイルが作られているとして
    # ファイル名は YYYY-MM-DD.log
    @ARGV = grep{ -T and /^\d{4}-\d{2}-\d{2}\.log$/ }( <*> );

    printf CGI->header('text/html; charset=utf-8');
    print  CGI->start_html(
        -title    => 'pin2',
        -encoding => 'utf-8',
        -lang     => 'ja'
    );
    print "<ol>";
}

$_ = CGI->escapeHTML($_);

# htmlのエスケープはモジュールを使うので
# s/&amp;/&/g;
# s/&lt;/</g;
# s/&gt;/>/g;
# s/&quot;/\"/g;

{
    local $_ = $li;
    my $date = substr($ARGV, 0, 10);
    s/ %%%URI%%  /$F[1]/x;
    s/ %%%TIT%%  /$F[0]/x;
    s/ %%%DATE%% /$date/x;
    s/ %%%TIME%% /$F[2]/x;
    print;
}

END {
    print "</ol>";
    print CGI->end_html;
    exit 0;
}

CGIモジュールを使う(というか、CGIを扱う)には、XSSの問題もあるから本当はこれだけだと危ないんだろうけど、そっちはおいおい

LuisaLuisa2014/05/06 17:06This is the pecefrt post for me to find at this time

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20090425