Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

デスクトップCGIでWebとデスクトップを融合する 第1回

Firefox/Apache用AtomリーダーCGIの作成

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/06/03 00:00

Firefox/Apacheで動作する簡単なAtomリーダーシステムをCGIで作成します。ApacheはWindowsのローカルで動作し、Firefoxのブックマークに蓄積されたAtomフィードのURLから、インターネット上のAtomフィードを取得・解析し、HTMLに変換して表示します。CGI用のスクリプト言語として、Perl 5.8を使います。

目次

はじめに

 パーソナルコンピュータの高性能化とインターネットのブロードバンド化が進み、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」へのリンクを含むようにします。

 本稿で作成していくシステムの全体像を概念図で示しておきます。

Webとデスクトップの融合
Webとデスクトップの融合

 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環境を前提にまとめます。

  1. ActivePerl 5.8.8.817(5.8.6以降)
  2. TeraPad(ToClip for Windows)などのUTF-8が取り扱えるテキストエディタ
  3. UTF-8の表示ができるコンソール ck - terminal emulator
  4. ckを使うためのCygwin
  5. Apache HTTPサーバー 2.0(実際に使用しているのは、2.054: Welcome! - The Apache Software Foundation
  6. Firefox 1.5.0.3 (Firefox - Web の再発見

Apacheのインストール

 新規にインストールする場合には次の手順に従ってインストールできます。既にインストールしている場合には、まず元のバージョンを[プログラムの追加と削除]を使って削除し、それから新しいバージョンをインストールします。現状の設定ファイル「httpd.conf」は削除されずに残り、新しい「httpd.conf」は「httpd.default.conf」で保存されます。

  1. The Apache HTTP Server Project」の[Download]から、最新版、Apache 2.0.54(apache_2.0.54-win32-x86-no_ssl.msi)などをダウンロードします。
  2. エクスプローラでファイル名にカレット(カーソル)を合わせて右クリックし、インストールを選択すると、インストーラが自動的にインストールしてくれます。インストールディレクトリは、普通は「C:\Program Files\Apache Group\Apache2」になるはずです。ここが、ServerRootになります。違っていれば、そのように以下を読み替えてください。

 「httpd.conf」の設定の仕方を、Windows上でよく使われているHTTPサーバーのAnhttpdとディレクトリを共有する場合を例にとって、説明しておきます。このようにしておけば、AnhttpdとApacheを切り替えてCGIなどの動作を試すことができます。ディレクトリの構成は、拙著『実践実用Perl』に従いますが、読者の環境に合わせて、適宜変更してください。「httpd.conf」のデフォルトから次のように変更します。

ServerRoot

ServerRoot設定
ServerRoot "C:/Program Files/Apache Group/Apache2"

 ServerRootは、インストールしたディレクトリそのままです。

DocumentRoot

DocumentRoot設定(変更前)
DocumentRoot "C:/Program Files/Apache Group/Apache2/htdocs"

 DocumentRootの行はHTML文書を格納するディレクトリで、「index.html」などを入れます。次のように変更します。

DocumentRoot設定(変更後)
DocumentRoot "C:/anhttpd/htdocs"

DocumentRootのDirectory設定

 <Directory "C:/Program Files/Apache Group/Apache2/htdocs">の部分も、DocumentRootの変更に合わせて次のように修正します。

DocumentRootのDirectory設定
<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/の設定

/cgi-bin/のScriptAlias設定(変更前)
ScriptAlias /cgi-bin/ "C:/Program Files/Apache Group/Apache2/cgi-bin/"

 /cgi-bin/の指すディレクトリは次のように書き直します。

/cgi-bin/のScriptAlias設定(変更後)
ScriptAlias /cgi-bin/ "C:/anhttpd/cgi-bin/"

cgi-binのDirectory設定

 <Directory "C:/Program Files/Apache Group/Apache2/cgi-bin">の部分も合わせて次のように変更します。

cgi-binのDirectory設定
<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ディレクティブを使います。システム環境変数DOCROOTUSERDIRCGIDIRを読み取れるように次のような行を「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スクリプトは、基本的にはこの方針で書いていく予定です。具体的に方針をリストアップしておきましょう。

  1. use utf8を設定しない。
  2. encodingプラグマを使わない。
  3. 文字コードを変換する場合、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」の設定の仕方については先に述べました。本稿では、以上の環境変数の設定を前提としています。


  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2006/10/07 19:43 Atomの文字コードがEUC-JPの場合読めなかったのを修正(atom2html.cgi)

  • 2006/08/29 10:02 サンプルファイルの「atom2html.cgi」を更新しました。

  • 2006/08/28 21:52 CDATAセクションが読めないのを修正

  • 2006/08/26 08:55 Atom ver.0.3のtaglineタグの判定方法が間違っていたのを修正。 数値実体参照のデコードが行われていなかったのを修正。

  • 2006/07/25 22:50 entry要素の日付要素としてpublished要素がない場合は、updated要素を更新日付として表示し、published要素がある場合でも、updated要素がある場合には、日付と更新日付の両方を表示するように変更。 entry要素の記事相当要素としてcontent要素がない場合、summary要素があれば代わりに表示するように変更。 entry要素として必須のid要素を取得できるように変更。

  • 2006/06/17 09:17 feeds.cgiによって生成されるAtomフィード名にハイパーリンクを作成する説明文の意味が通らないのを修正しました。 atom2html.cgiに不要なurl_encodeサブルーチンを削除しました。

  • 2006/06/07 20:08 ApacheのDocumentRootとcgi-binのDirectoryの設定が読者の環境によってはセキュリティ上問題があるので、変更しました。ローカルサーバーにそのローカルマシンからしかアクセスできないようにしました。

著者プロフィール

バックナンバー

連載:PerlでデスクトップCGI

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5