はじめに
パーソナルコンピュータの高性能化とインターネットのブロードバンド化が進み、Perlなどのスクリプト言語の活躍する場が大きく拡がっています。言うまでもなく、Webの情報を載せるHTMLはテキストファイルなので、テキスト処理の得意なスクリプト言語にとって、Webは自由自在に取り扱える対象なのです。代表的なスクリプト言語の一つであるPerlは、1987年にLarry Wall氏により生み出され、インターネットの発展と共に、CGI用のプログラミング言語としても普及しました。本稿では、Perlを使用して、Windowsのデスクトップで動作するCGIアプリケーションを作成します。「デスクトップCGIでWebとデスクトップを融合する」というタイトルは、デスクトップにある情報とWebの情報を結び付けるCGIアプリケーションを作るという意味です。例えば、デスクトップの情報を元に、Webサイトの内容を出力するような場合に応用が可能と思います。
本稿は、一回完結形式の複数回の連載にする予定で、初回は、「Firefox/Apacheで動作する簡単なAtomリーダーシステム」をCGIで作成します。
通常、CGIはWebサーバー上で動作することを前提に考えられますが、デスクトップで動作させると、CGIはデスクトップにある情報とWebにある情報の両方にアクセスすることができます。このような仕組みは、最近ではめずらしくなくなりました。たとえばGoogleサーチは、Googleデスクトップをインストールしている場合、デスクトップの検索結果も合わせて表示することが可能です。iframe
タグを使って、ポート番号4664のローカルサーバーで動くアプリケーション(search)にアクセスしているのです。著者はデスクトップのローカルサーバーで動作させるCGIを「デスクトップCGI」と呼んでいます。
本稿では、Webの情報として、最近話題のAtomフィードを取り扱います。Webサイトの内容を配信するフォーマットとしては、RSSフィードに比べて、ニュースサイトなどでサポートされていない場合も多く、まだ一般的とは言いがたいのですが、Googleは、Bloggerでブログ出版用プロトコルとしてAtom APIを採用し、さらにはGoogle CalendarなどのWebアプリケーションのデータ操作用HTTPプロトコル、Google data APIs(GData)として拡張しつつあります。Atomは、今後発展するXMLフォーマットとして注目されます。今回は、Atomフィードを解析し、内容をHTMLとして出力するCGI(atom2html.cgi)を作成します。
一方、デスクトップの情報としては、Firefoxのブックマークを対象とします。Atomフィードの管理をFirefoxのブックマークで行います。ブックマーク(bookmarks.html)からAtomフィードを読み取り、リストをHTMLで出力するCGI(feeds.cgi)を作成します。リストには、Atomフィードを解析・表示する「atom2html.cgi」へのリンクを含むようにします。
本稿で作成していくシステムの全体像を概念図で示しておきます。
PerlやCGIについて基本的な事柄は説明しませんので、PerlやCGIの参考書を手元に置いて読んでください。PerlとCGIについての参考書としては、Larry Wall他著、『プログラミングPerl 第3版 上、下』、オライリー・ジャパン(2002年)とScott Guelich他著、『CGIプログラミング 第2版』、オライリー・ジャパン(2001年)をそれぞれ推薦します。プログラミングPerl第3版は、Perl 5.6がベースになっていますが、Perlのコア部分については依然として最良の参考書と思います。その他、Unicodeに関すること、Encodeなどの各モジュールに関しては、Perlのコア文書や各モジュールの文書を参照することが必要です。
対象読者
Perl、CGI、テキストエディタ、HTML、HTTPサーバー(特にApache)、Webブラウザ、文字コード、コマンドプロンプトや環境変数などのWindowsのシステムについての基礎的な知識を持ち、かつ、インターネットからソフトウェアをダウンロードして、インストールできるレベルの方。
必要な環境
Windows環境を前提にまとめます。
- ActivePerl 5.8.8.817(5.8.6以降)
- TeraPad(ToClip for Windows)などのUTF-8が取り扱えるテキストエディタ
- UTF-8の表示ができるコンソール ck - terminal emulator
- ckを使うためのCygwin
- Apache HTTPサーバー 2.0(実際に使用しているのは、2.054: Welcome! - The Apache Software Foundation)
- Firefox 1.5.0.3 (Firefox - Web の再発見)
Apacheのインストール
新規にインストールする場合には次の手順に従ってインストールできます。既にインストールしている場合には、まず元のバージョンを[プログラムの追加と削除]を使って削除し、それから新しいバージョンをインストールします。現状の設定ファイル「httpd.conf」は削除されずに残り、新しい「httpd.conf」は「httpd.default.conf」で保存されます。
- 「The Apache HTTP Server Project」の[Download]から、最新版、Apache 2.0.54(apache_2.0.54-win32-x86-no_ssl.msi)などをダウンロードします。
- エクスプローラでファイル名にカレット(カーソル)を合わせて右クリックし、インストールを選択すると、インストーラが自動的にインストールしてくれます。インストールディレクトリは、普通は「C:\Program Files\Apache Group\Apache2」になるはずです。ここが、ServerRootになります。違っていれば、そのように以下を読み替えてください。
「httpd.conf」の設定の仕方を、Windows上でよく使われているHTTPサーバーのAnhttpdとディレクトリを共有する場合を例にとって、説明しておきます。このようにしておけば、AnhttpdとApacheを切り替えてCGIなどの動作を試すことができます。ディレクトリの構成は、拙著『実践実用Perl』に従いますが、読者の環境に合わせて、適宜変更してください。「httpd.conf」のデフォルトから次のように変更します。
ServerRoot
ServerRoot "C:/Program Files/Apache Group/Apache2"
ServerRootは、インストールしたディレクトリそのままです。
DocumentRoot
DocumentRoot "C:/Program Files/Apache Group/Apache2/htdocs"
DocumentRootの行はHTML文書を格納するディレクトリで、「index.html」などを入れます。次のように変更します。
DocumentRoot "C:/anhttpd/htdocs"
DocumentRootのDirectory設定
<Directory "C:/Program Files/Apache Group/Apache2/htdocs">
の部分も、DocumentRootの変更に合わせて次のように修正します。
<Directory "C:/anhttpd/htdocs"> Options Indexes FollowSymLinks AllowOverride None Deny from all Allow from 127.0.0.1 Order deny,allow </Directory>
ScriptAlias /cgi-bin/の設定
ScriptAlias /cgi-bin/ "C:/Program Files/Apache Group/Apache2/cgi-bin/"
/cgi-bin/の指すディレクトリは次のように書き直します。
ScriptAlias /cgi-bin/ "C:/anhttpd/cgi-bin/"
cgi-binのDirectory設定
<Directory "C:/Program Files/Apache Group/Apache2/cgi-bin">
の部分も合わせて次のように変更します。
<Directory "C:/anhttpd/cgi-bin"> AllowOverride None Options None Deny from all Allow from 127.0.0.1 Order deny,allow </Directory>
デフォルトの文字コードの設定
使用する文字コードを次のように変更します。これはApacheのバージョン2.0.54には設定がなかったので、付加しました。 本稿では、文字コードをutf-8にしてもよいのですが、ShiftJIS文字コードを前提にしているCGIがある場合には、ShiftJISのままがよいです。
AddDefaultCharset shift_jis
環境変数の設定
最後に、CGIに必要なシステム環境変数を読み取れるように設定します。Anhttpdではシステム環境変数を自動的に読み取れますが、Apacheでは設定が必要になります。PassEnv
ディレクティブを使います。システム環境変数DOCROOT
、USERDIR
とCGIDIR
を読み取れるように次のような行を「httpd.conf」に付け加えます。PassEnv
の後に、環境変数を半角空白で区切って並べればよいのです。CGI環境変数の仕方については後述します。
PassEnv DOCROOT USERDIR CGIDIR
ActivePerlのインストール
ActivePerlは、インストールディレクトリがデフォルトだと、「Perl」になってしまうので、jperlなど、他のバージョンを「Perl」ディレクトリにインストールしている場合には注意が必要です。著者の場合は、「Perl5.8」に変更しています。
Perl 5.8系列のPerlを使う
著者はこれまでWindowsのShiftJIS文字コード環境で、jperl/ActivePerl 5.005_03を使用してきました。拙著『実践実用Perl』ではjperlを使用しています。現在でもメインはjperlです。ShiftJIS文字コードのテキスト処理であれば、jperlを使うことは良い選択です。残念ながら、Perl 5.6以降、Perl 5.8にもjperlは存在しません。Perl 5.8では、ShiftJIS文字コードでスクリプトを書きたいなら、encoding
プラグマを使うことができますが、パフォーマンスが大きく低下したり、プラットフォームに依存する複雑なものになってしまいます。スマートとは言えません。
今のところ、Windows環境の文字コードが、ShiftJISからUTF-8に変化する見通しはありませんが、Webブラウザでは容易にUTF-8の文字コードが取り扱えます。また、RSSやAtomなどのXMLファイルのデフォルトの文字コードはUTF-8です。スクリプトをUTF-8で書いて、取り扱うデータがUTF-8であるなら、UTF-8が前提のPerl 5.8は相性が良いのです。また、新しいモジュールは、Perl 5.8以降のみをサポートするようになってきていますから、新しいモジュールの恩恵を受けるために、Perl 5.8を使うメリットは大きいのです。最近ではスクリプトのデバッグに、UTF-8文字を表示可能なコンソール「ck/Cygwin」を使うことができるようになってきたことも追い風です。
Perl 5.8では、文字列のUTF-8フラグのON(文字指向)/OFF(バイト指向)の取り扱いが複雑さを生み出します。スクリプトをシンプルに保つためには、スクリプトはUTF-8で書き、バイト指向(UTF-8フラグはOFF)で文字列を取り扱う方法がよさそうです。本稿のCGIスクリプトは、基本的にはこの方針で書いていく予定です。具体的に方針をリストアップしておきましょう。
use utf8
を設定しない。encoding
プラグマを使わない。- 文字コードを変換する場合、Encodeモジュールの
from_to()
を使う。from_to()
はUTF-8フラグをOFFにしたままで、文字列を変換する。
ckとCygwinはデバッグ用
他のアプリケーションは単にインストールするだけで、特に設定は必要ないので、これで準備完了ですが、ckとCygwinを必要な環境として取り上げている意味を簡単に説明しておきます。ckはCygwin環境上で動作するターミナル・エミュレータで、UTF-8の標準出力を自動認識して文字化けせずに表示できます。本稿のスクリプトはすべてUTF-8の文字コードで記述され、UTF-8の文字コードを出力します。また、本稿のCGIスクリプトはCGIで動作するだけでなく、デバッグ用にコマンドラインでも動作するように書いています。WindowsのコマンドプロンプトではUTF-8の文字はすべて文字化けしてしまうため、デバッグする場合は、ckを使うと大変便利です。逆に、スクリプトを動作させるだけなら、ck/Cygwinは不要です。
読者がPerlスクリプトを自作する場合の便宜のためにもう少し説明します。ckのコマンドラインから、CygwinのPerlではなく、ActivePerlを起動する場合には、Perlをフルパスで指定します。例えば、「c://perl5.8/bin/perl」とします。Cygwinでは正式には、「/cygdrive/c/perl5.8/bin/perl」とするのですが、自動的に変換して起動してくれます。Cygwinのシェルでは、Cygwin専用のアプリケーションだけでなく、Windows用のアプリケーションも動作します。
CGI用環境変数の設定
CGI環境変数とWindowsのコマンドプロンプトで表示される環境変数には相違があります。詳しくは、拙著『実践実用Perl』の238-243ページを参照してください。ここでは、USERPROFILE
という環境変数は、CGIではコマンドプロンプトで得られる値とは異なる、他の値が入り、USERNAME
の値は空になるということを述べるに止めます。CGIとコマンドプロンプトでは、同一の環境変数名でも得られる値が異なる場合があるのです。
Perlで、Firefoxの「bookmarks.html」を読み込むためには、ファイルのフルパスを知る必要があります。そのためにコマンドプロンプトのUSERPROFILE
に相当する環境変数USERDIR
を設定しておきましょう。ユーザーが任意に設定できるCGIで読み取れるWindowsの環境変数は、システム環境変数です。[システムのプロパティ]→[詳細設定]→[環境変数]→[システム環境変数]で、[新規]のボタンを押して、変数名と変数値を設定しましょう。変数名をUSERDIR
、変数値をコマンドプロンプトを起動して、コマンドラインで「echo %USERPROFILE%」として得られる値に設定します。Perlでは、環境変数は特殊連想配列$ENV{'USERDIR'}
として取得できます。
次に、CGIスクリプトを格納する相対パスを設定します。「feeds.cgi」では、変数名はCGIDIR
としています。変数値は、例えば「/cgi-bin/codezine」です。読者の環境に合わせて設定してください。
最後に、HTTPサーバーのドキュメントルートのフルパスを、変数名DOCROOT
として設定します。変数値は、例えば「C:/Program Files/Apache Group/Apache2/htdocs」です。この値は、Apacheのデフォルトの設定値であり、特殊な事情がなければそのまま使ってもよいでしょう。変更する場合の「httpd.conf」の設定の仕方については先に述べました。本稿では、以上の環境変数の設定を前提としています。