KB)Firefox/Apacheで動作する簡単なAtomリーダーシステムをCGIで作成します。ApacheはWindowsのローカルで動作し、Firefoxのブックマークに蓄積されたAtomフィードのURLから、インターネット上のAtomフィードを取得・解析し、HTMLに変換して表示します。参考資料はじめにパーソナルコンピュータの高性能化とインターネットのブロードバンド化が進み、Perlなどのスクリプト言語の活躍する場が大きく拡がっています。言うまでもなく、Webの情報を載せるHTMLはテキストファイルなので、テキスト処理の得意なスクリプト言語にとって、Webは自由自在に取り扱える対象なのです。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フィードを取り扱います。APIs(GData)として拡張しつつあります。Atomは、今後発展するXMLフォーマットとして注目されます。今回は、Atomフィードを解析し、内容をHTMLとして出力するCGI(atom2html.cgi)を作成します。デスクトップの情報としては、Firefoxのブックマークを対象とします。Atomフィードの管理をFirefoxのブックマークで行います。ブックマーク(bookmarks.html)からAtomフィードを読み取り、リストをHTMLで出力するCGI(feeds.cgi)を作成します。リストには、Atomフィードを解析・表示する「atom2html.cgi」へのリンクを含むようにします。本稿で作成していくシステムの全体像を概念図で示しておきます。Webとデスクトップの融合PerlやCGIについて基本的な事柄は説明しませんので、PerlやCGIの参考書を手元に置いて読んでください。第2版』、オライリー・ジャパン(2001年)をそれぞれ推薦します。5.6がベースになっていますが、Perlのコア部分については依然として最良の参考書と思います。その他、Unicodeに関すること、Encodeなどの各モジュールに関しては、Perlのコア文書や各モジュールの文書を参照することが必要です。対象読者Perl、CGI、テキストエディタ、HTML、HTTPサーバー(特にApache)、Webブラウザ、文字コード、コマンドプロンプトや環境変数などのWindowsのシステムについての基礎的な知識を持ち、かつ、インターネットからソフトウェアをダウンロードして、インストールできるレベルの方。必要な環境Windows環境を前提にまとめます。再発見)Apacheのインストール新規にインストールする場合には次の手順に従ってインストールできます。インストールしている場合には、まず元のバージョンを[プログラムの追加と削除]を使って削除し、それから新しいバージョンをインストールします。現状の設定ファイル「httpd.conf」は削除されずに残り、新しい「httpd.conf」は「httpd.default.conf」で保存されます。2.0.54(apache_2.0.54-win32-x86-no_ssl.msi)などをダウンロードします。エクスプローラでファイル名にカレット(カーソル)を合わせて右クリックし、インストールを選択すると、インストーラが自動的にインストールしてくれます。Group\Apache2」になるはずです。ここが、ServerRootになります。違っていれば、そのように以下を読み替えてください。「httpd.conf」の設定の仕方を、Windows上でよく使われているHTTPサーバーのAnhttpdとディレクトリを共有する場合を例にとって、説明しておきます。このようにしておけば、AnhttpdとApacheを切り替えてCGIなどの動作を試すことができます。ディレクトリの構成は、拙著『実践実用Perl』に従いますが、読者の環境に合わせて、適宜変更してください。「httpd.conf」のデフォルトから次のように変更します。Group/Apache2"ServerRootは、インストールしたディレクトリそのままです。Group/Apache2/htdocs"DocumentRootの行はHTML文書を格納するディレクトリで、「index.html」などを入れます。次のように変更します。Group/Apache2/htdocs">の部分も、DocumentRootの変更に合わせて次のように修正します。Group/Apache2/cgi-bin/"/cgi-bin/の指すディレクトリは次のように書き直します。Group/Apache2/cgi-bin">の部分も合わせて次のように変更します。使用する文字コードを次のように変更します。これはApacheのバージョン2.0.54には設定がなかったので、付加しました。本稿では、文字コードをutf-8にしてもよいのですが、ShiftJIS文字コードを前提にしているCGIがある場合には、ShiftJISのままがよいです。最後に、CGIに必要なシステム環境変数を読み取れるように設定します。Anhttpdではシステム環境変数を自動的に読み取れますが、Apacheでは設定が必要になります。PassEnvディレクティブを使います。システム環境変数DOCROOT、USERDIRとCGIDIRを読み取れるように次のような行を「httpd.conf」に付け加えます。PassEnvの後に、環境変数を半角空白で区切って並べればよいのです。CGI環境変数の仕方については後述します。CGIDIRActivePerlのインストールActivePerlは、インストールディレクトリがデフォルトだと、「Perl」になってしまうので、jperlなど、他のバージョンを「Perl」ディレクトリにインストールしている場合には注意が必要です。著者の場合は、「Perl5.8」に変更しています。5.005_03を使用してきました。拙著『実践実用Perl』ではjperlを使用しています。現在でもメインはjperlです。ShiftJIS文字コードのテキスト処理であれば、jperlを使うことは良い選択です。5.8にもjperlは存在しません。5.8では、ShiftJIS文字コードでスクリプトを書きたいなら、encodingプラグマを使うことができますが、パフォーマンスが大きく低下したり、プラットフォームに依存する複雑なものになってしまいます。スマートとは言えません。今のところ、Windows環境の文字コードが、ShiftJISからUTF-8に変化する見通しはありませんが、Webブラウザでは容易にUTF-8の文字コードが取り扱えます。RSSやAtomなどのXMLファイルのデフォルトの文字コードはUTF-8です。5.8は相性が良いのです。5.8を使うメリットは大きいのです。最近ではスクリプトのデバッグに、UTF-8文字を表示可能なコンソール「ck/Cygwin」を使うことができるようになってきたことも追い風です。5.8では、文字列のUTF-8フラグのON(文字指向)/OFF(バイト指向)の取り扱いが複雑さを生み出します。スクリプトをシンプルに保つためには、スクリプトはUTF-8で書き、バイト指向(UTF-8フラグはOFF)で文字列を取り扱う方法がよさそうです。本稿のCGIスクリプトは、基本的にはこの方針で書いていく予定です。具体的に方針をリストアップしておきましょう。utf8を設定しない。encodingプラグマを使わない。文字コードを変換する場合、Encodeモジュールのfrom_to()を使う。from_to()はUTF-8フラグをOFFにしたままで、文字列を変換する。他のアプリケーションは単にインストールするだけで、特に設定は必要ないので、これで準備完了ですが、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の環境変数は、システム環境変数です。[システムのプロパティ]→[詳細設定]→[環境変数]→[システム環境変数]で、[新規]のボタンを押して、変数名と変数値を設定しましょう。%USERPROFILE%」として得られる値に設定します。Perlでは、環境変数は特殊連想配列$ENV{'USERDIR'}として取得できます。次に、CGIスクリプトを格納する相対パスを設定します。「feeds.cgi」では、変数名はCGIDIRとしています。変数値は、例えば「/cgi-bin/codezine」です。読者の環境に合わせて設定してください。最後に、HTTPサーバーのドキュメントルートのフルパスを、変数名DOCROOTとして設定します。Group/Apache2/htdocs」です。この値は、Apacheのデフォルトの設定値であり、特殊な事情がなければそのまま使ってもよいでしょう。変更する場合の「httpd.conf」の設定の仕方については先に述べました。本稿では、以上の環境変数の設定を前提としています。サンプルファイルの「atom2html.cgi」を更新しました。ver.0.3のtaglineタグの判定方法が間違っていたのを修正。数値実体参照のデコードが行われていなかったのを修正。entry要素の日付要素としてpublished要素がない場合は、updated要素を更新日付として表示し、published要素がある場合でも、updated要素がある場合には、日付と更新日付の両方を表示するように変更。entry要素の記事相当要素としてcontent要素がない場合、summary要素があれば代わりに表示するように変更。entry要素として必須のid要素を取得できるように変更。feeds.cgiによって生成されるAtomフィード名にハイパーリンクを作成する説明文の意味が通らないのを修正しました。atom2html.cgiに不要なurl_encodeサブルーチンを削除しました。ApacheのDocumentRootとcgi-binのDirectoryの設定が読者の環境によってはセキュリティ上問題があるので、変更しました。ローカルサーバーにそのローカルマシンからしかアクセスできないようにしました。SERVEのFGALEL(エントリーラボ)、FGALTS(テキスト&amp;スクリプト)に参画し、FGALTSでシスオペを務める。現在、TSNETメンバー。圧縮・解凍UNIX基本講座@CodeZine『CodeZine(コードジン)』の公式アカウントです。【NEW】デブスト2019デブサミ2019福岡・関西デブサミ2019夏デブスト関西デブサミ2019×ログインEメールパスワード※旧SEメンバーシップ会員の方は、同じ登録情報(Eメール&パスワード)でログインいただけます。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。