[Perlメモ] HTTPアプリケーションで用いる日付フォーマットで出力するサンプルスクリプト (2009-05-05)

HTTPヘッダのLast-Modified エンティティヘッダフィールドなどで用いられる、
"Tue, 05 May 2009 14:24:27 GMT"
のようなフォーマットで日付/時刻を出力するサブルーチンです。

このフォーマットの詳細については、[Studying HTTP] HTTP Header FieldsのDateに関する記述を参考にしました。

 1: # RFC 1123の形式で出力
 2: sub DateTime_byRFC1123
 3: {
 4:     my $ctime = $_[0] ? $_[0] : time();
 5:     my($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime($ctime);
 6:     $wday = qw(Sun Mon Tue Wed Thu Fri Sat)[$wday];
 7:     $mon  = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[$mon];
 8:     return sprintf("%s\, %02d %s %04d %02d:%02d:%02d GMT",
 9:                    $wday, $mday, $mon, $year+1900, $hour, $min, $sec);
10: }

time()関数が返すような、1970年1月1日UTCからの(うるう秒を除いた)秒数を、引数として受け取ります。引数がなければ現在時刻を受け取ったものとして処理します。

使用例

上述のサブルーチンを使ってCGIでHTML文書を出力するの例です。

print "Content-type: text/html;charset=utf-8", "\n";
print "Content-length: ". length($Output), "\n";
print "Last-Modified: ". DateTime_byRFC1123( ( stat("./somefile.html") )[9] ), "\n";
print "\n";
print $Output;

簡略化のためこのスクリプトでは、変数$Outputの内容は、テキストファイル "./somefile.html" のHTML文書そのものとしています。

HTTPヘッダに "Last-Modified" を付加することで、クライアントは受け取った文書の最終更新日時も保持します。次にアクセスするとき、自身のキャッシュを呼び出すかまたは再度サーバへリクエストするかを、日時を元に判断します。クライアントが自身のキャッシュを利用してもらうことでサーバの負荷を軽減することができます。

また、余談ですが、 "Content-length" を付加することで、クライアントはこれから受け取る文書のサイズを事前に知ることができます。それによって、IEなどのクライアントソフトウェアは、"何%読み込み済み"のようなステータス情報を表記することが可能になります。大きなファイルを受け取る場合や回線の遅い環境での利用者にとっては、読み込みを待っている間のストレス軽減となります。

サンプルスクリプトの解説

上述のサブルーチンについて、できる限り丁寧に解説していきます。

4行目: my $ctime = $_[0] ? $_[0] : time();

この行では、変数 $ctime の宣言と初期化を同時に行なっています。

$_[0] は、顔文字ではありません。特殊変数と呼ばれる変数の一つです。Perlでは、サブルーチンへの引数は配列 @_ によって渡されます。その配列の先頭という意味で添え字 0 を与えて、 $_[0] と記述しています。つまり、呼び出し元で &sub( 123 ); と記述した時の "123" が $_[0] の値となります。

my は、変数宣言で用いられる関数です。my $ctime と記述することで、変数 $ctime はレキシカル変数と呼ばれるこのサブルーチン内のみで有効な変数となります。仮にサブルーチンの外で $ctime というグローバル変数があっても、このサブルーチンで用いられている$ctimeとは無関係です(別のメモリ領域が確保されています)。また、このサブルーチンを抜けたときに $ctime が保持していたメモリ領域は解放されるはずです。

TEST_EXPR ? IF_TRUE_EXPR : IF_FALSE_EXPR は、条件演算子と呼ばれる演算子を用いた記述方法です。if-then-else構文の短縮形として用いられることが多いです。$_[0] ? $_[0] : time() は、" $_[0] に値があればそれを、無ければ time() の実行結果を" という意味になります。

5行目: my($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime($ctime);

日時をグリニッジ標準時(GMT)で表現するため、gmtime() 関数を用います。gmtime() 関数は、time()関数が返す形式の時刻を受け取り、9要素のリスト値を返します。返されるリストの要素はCプログラムの構造体 struct tm に返された値そのものだそうです。この記述のようにPerlでは、リストコンテキストを関数の左辺に直接記述すれば代入がなされます。

また、 my 関数は、このようにリストコンテキストに対して記述することが可能です。

6行目: $wday = qw(Sun Mon Tue Wed Thu Fri Sat)[$wday];

"0~6" の曜日を示す数値を "Wed" のような文字列に変換しています。

qw( .. ) 構文は、('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri, 'Sat') という記述と同じです。qw構文を用いた方が、タイプミスも少なく可読性も良いと、個人的には、考えており好んで使っています。

また、リストコンテキストは、直接後ろに添え字をつけることで配列と同じように取り扱うことができます。この場合、リスト中 $wday 番目の要素を取り出し代入しています。

スカラー変数 $wday は、元々は整数が格納されていたはずなのに、この行で文字列を代入してしまいました。Perlでは変数にどんなデータ型でも代入できます。とはいえ、混乱を招くかも知れません。変数の内容が整数から文字列へというまったく違うデータ型に変換してしまうのは、私自身も好ましくないと考えています。代入する文字列の格納先は例えば、 $wday_byString のように別名の変数を新たに宣言するのが教科書的かも知れません。ただし、このサブルーチン以外の記述もあることを考えると、取り扱う変数は極力少なくしたいという考えもあります。ということで、このサンプルのように "わずか数行で完結するサブルーチンだったら型の違うデータの代入も許す" という個人的記述ルールを設けました。要するに「見りゃわかんだろ」ということです。

7行目: $mon = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[$mon];

"0~11" の月を示す数値を "May" のような文字列に変換しています。テクニック的には6行目と同じです。

8~9行目: return sprintf("%s\, %02d %s %04d %02d:%02d:%02d GMT",
$wday, $mday, $mon, $year+1900, $hour, $min, $sec);

return で目的の文字列を戻り値としてセットし、サブルーチンを抜けます。

sprintf はフォーマット付き文字列を返す関数です。第1引数のダブルクォートで囲まれた文字列が指定するフォーマットを示しています。"%02d" のように"%" から始まる文字列(フィールド指定子と呼ばれます)が第2引数以降のリストの要素1つ1つに置き換わります。"%s" は文字列を指定し、 "%02d" は2桁の数値文字列を指定します。

Written in 2009-05-05, Permalink, Comments(1)
この記事が属しているカテゴリ: OTHER, PERL

blogの更新を通知 - RSSリーダの紹介 (2009-04-19)

ファンなら大好きなアーティストのblogは絶対チェックしますよね。でも、毎日毎日、"更新したかなぁ"、"あぁ、まだか..."なんてことをやってませんか?

便利なツールソフトがあります。自分はもう2年ほど使っているんですが、あまり普及してないんじゃないかと思ったので、ここで紹介してみます。

RSSリーダ: Headline-Deskbar

blogに限らず登録したサイトの更新情報(RSS)を周期的に巡回・取得してくれるフリーソフトウェアです。

[Headline-DeskbarをInternet Explorerのツールバーとして使用したときの例]
Internet Explorerのアドレスバーの下に更新したばかりのFRIED FRIDEのblog:FRIED PRIDEのフラリプラリの最新記事「靴」が表示されています。バーの上へカーソルを持っていくと、この例のように記事の概要、または、最初の数行が読むことができます。バーをクリックするとその記事が掲載されたサイトへ飛びます。

登録しておいたサイトの、最新タイトルが順次切り替わって表示され、"あ、更新された!"と気づき、クリック。そんな使い方をしています。

私の使い方は、このようにIEのツールバーとして使用していますが、Windowsのタスクバーにも埋め込むことができるようです。

他にもメーラーのような感覚で記事を読むことができる、Headline-Reader Liteもあります。使い方も含めて詳細はInfoMakerホームページに掲載されています。

RSSアイコンを探して登録

現在、多くのWebサイト、さらにblogでは当たり前のようにRSSのアイコンを見つけることができます。でも、なぜか判りづらいところにあるんですよね。
[上の例「FRIED PRIDEのフライプラリ」ではページ右側に、RSSへのリンクを表すアイコンがあります。
[yaplog!のRSSアイコン][はてなのRSSアイコン]、または、[その他よくあるRSSアイコン]のようなアイコンがそれです。当サイトでは[当サイトのRSSアイコン]です。これがRSSへのリンクを示しています。

いつも定期的に訪問しているblogのRSSアイコンを見つけ、例えばドラッグ&ドロップで前述のバーへ持っていけば登録ができます

そもそもRSSとは?

RSSアイコンの示すリンク先は当サイト場合、"http://www.relaxin-with.com/cgi-bin/SiteSummary.cgi"というURIです。アイコンをクリックすると、訳のわからないテキストファイルが表示・ダウンロードされてしまいます。RSSは、ソフトウェアが扱い易いように記述されていて、人間がそのまま読むものではありません。

そのRSSを読み込んで、簡潔に表示してくれるのが上述のHeadline-Deskbarというソフトウェアです。

RSSとは、RDF Site Summaryの略で、そしてRDFとは...、と、まじめ~に解説できるほど私も熟知していません..。私の理解の範疇では

Webサイト上にある複数のドキュメントのタイトルや要約を、定められた共通のXMLフォーマットで記述したテキストファイル

といった感じでしょうか。現在の利用方法から見て定義するなら"最新記事20件のタイトルと概要を通知させるためのファイル"です。よりしっかりとした解説は、KANZAKI氏のメタ情報とセマンティック・ウェブで読むことができます。

Written in 2009-04-19, Permalink, Comments(0)
この記事が属しているカテゴリ: OTHER

個人ウェブサイト管理者の独り言 (2009-04-12)

久しぶりに本屋のWeb技術コーナーへ行ってみました。Ajaxやjavascriptについてまとまった本があればと思い行ってみたのですが、さすがに、最新かつ総合的なWeb技術であるAjaxは、趣味でちょこっと勉強するには重いなぁと感じました。

そんなことより何より、ショックだったのがCGI/Perlに関する本が全然無い!あるはあるんですが、目立たないところにこっそり2、3冊。あれ~?昔はHTML関連の隣にかなり幅を利かせてあったのに??それにサーバサイドの技術は難しい専門書だらけだ。

そうか、今はブログやSNSなどのサービスを利用すればいいから、情報発信の手段を自ら構築する必要はないんですね。HTMLのタグを解説しながらの「綺麗なホームページの作り方」的な本は無くなり、「目指せ!人気ブロガー」的なコンテンツのみに話題を絞ったものに代わっていました。

「情報」を作る人、「発信」を作る人は完全に分業されているんですね。全部一人で実現させようとしてる自分は、むしろ時代遅れなのかなぁ。

Written in 2009-04-12, Permalink, Comments(0)
この記事が属しているカテゴリ: OTHER

演奏中CDのディスプレイなどに - ナガオカ CDスタンド クリアーブルー (2008-01-13)

【現在演奏中のCDを飾っている写真】

TOWER RECORDS新宿店で、店員さんに「6,000円以上のお買い上げで200ポイントサービスなのですが、今5,990円なんです。」っと言われ、レジ横の乾電池やキーホルダなどのGOODSから、写真のナガオカ CDスタンド クリアーブルーを買いました。

以前からこの写真のように、今聴いているCDを飾ったりしてみたいなぁっと思っていました。ジャズが聴ける飲み屋さんでときどき見ますよね。

半透明プラスティックの台に溝があり、そこへ挿し込まれたCDケースは少し後ろ倒れたところで留まる機構になっています。だから、急いでCDケースを取ろうとするとスタンドもいっしょに付いてきてしまったり、私のように頻繁に乗せ換える使い方をする場合は慣れが必要かも知れません。

Written in 2008-01-13, Permalink, Comments(1)
この記事が属しているカテゴリ: MUSIC, OTHER

夢のホームシアター (2007-12-29)

ついに我が家、といっても賃貸マンションですが、にホームシアターが導入されました。部屋の写真、購入機材などを紹介します。

[スクリーンへ映し出したときの部屋の写真] [部屋の明かりをつけたときの写真] [視聴位置の写真、プロジェクタはソファの後ろです]

ショボイ携帯カメラでの撮像のため、映像の美しさがまったく伝わりませんが、映画「ONCE UPON A TIME IN AMERICA」のワンシーンが映っています。元々この映画を、ブラウン管やプラズマテレビのようなガラス張りのギラついた画面ではなく、温もりあるスクリーンの映像で観たいという想いからホームシアター導入を熱望していました。

購入機材

SANYO 液晶プロジェクタ LP-Z2000
電動スライドシャッターと業界最静音が気に入りこれに決めました。横幅400mmの大きさが許せるのなら今最もコストパフォーマンスの高いプロジェクタだと思います。
[プロジェクタの設置環境] [プロジェクタのリアパネル]
処分に困っていた電子レンジの台をスタンドとしてます。ソファの後ろへ配置し、配線は電源ケーブルとHDMIケーブルのみとしています。
(株)シネマ工房 80インチワイド掛図式スクリーン
プロジェクタの付属品です。
スクリーンもこだわるか迷ったのですが、部屋でタバコも吸うし、安価なスクリーンを定期的に交換する方針にしました。
できるだけ低く設置したかったので別途立ち上げ式を購入しようかとも考えたのですが、安価なスクリーンでは余計な機構がない壁掛け式が最も材質が良いはずだと店員さんに説得され辞めました。
部屋のカーテンレールに引っ掛けて使用してます。
DENON DVDプレイヤー DVD-1930
[現在のオーディオラックの写真]
写真の左最上段にあるのがDVD-1930です。HDMI端子のあるプレイヤーが欲しいと思い、プロジェクタ購入時のヨドバシポイントを使ってほぼタダで購入しました。
5.1chサラウンドはどうも好きになれないので、アンプ、スピーカは従来のままです。

柿落としは「オペラ座の怪人」

オープニングのシャンデリアが現れるシーン、色あせたモノクロ映像から色彩豊かで華やかな1870年代オペラ座の風景へ。感動です。まさにシアターの醍醐味です。

Written in 2007-12-29, Permalink, Comments(0)
この記事が属しているカテゴリ: MOVIE, OTHER