XML::FeedPPモジュール

Google CalendarのAtomFeedを取り出すPerlスクリプト

Googleカレンダーのマイカレンダー >> カレンダー設定 >> 個人用URLのXMLアドレスを$urlに代入するとカレンダーを取得できます。
ただし、これは単純にXMLを取得してくるだけなのでデータの加工は行いません。

本来ならHTTP::Liteモジュールは必要ありません。ならなぜ使っているのか!!
うちの大学では必ずProxyサーバを経由しなければHTTP接続を行うことができません。
そこで今回HTTP::LIteモジュールを使ってProxyに接続を行っています。
以下スクリプト

#!/usr/bin/perl
use XML::FeedPP;
$http = new HTTP::Lite;

$url = 'http://www.google.com/calendar/feeds/********%40*********/private-*****************/basic';

$http->proxy("proxy.**.**.**");
$req=$http->request($url);
$body=$http->body();
$feed=XML::FeedPP->new($body);
print "Content-Type: text/xml;charset=euc-jp\n\n";
print $feed->to_string("euc-jp");

XML::Parserモジュールのインストール

XML::Parserモジュールのインストールについて。
このモジュールはExpatに依存しています。そこで
rpm -qa | grep expat
でexpatの存在を確認。
次にcpanXML::Parserモジュールのインストールを行う。
install XML::Parser
以下のエラーが出る。

Expat.xs:12:19: error: expat.h: そのようなファイルやディレクトリはありません Expat.xs:60: error: expected specifier-qualifier-list before ‘XML_Parser’ Expat.xs:111: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘nsdelim’ Expat.xs:194: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ms’ 以下延々と続く・・
expat.hが存在しないとのエラーが出る。これを解決するために三日費やして無理やりインストールしたが、友人に聞くことで解決策を得る。

関数の仕様やデータ構造を記述したヘッダーファイルを始めとした
ライブラリを活用するプログラム開発に必要な物を入れたdevelが必要。

そこでyumrpmがあるか確認。

expat.i386 1.95.8-8.2.1 installed
expat-devel.i386 1.95.8-8.2.1 core
tclxml-expat.i386 3.1-9.fc6 extras

確認できたので早速インストール。

yum -y install expat-devel.i386

その後再度cpanXML::Parserモジュールをインストール。
install XML::Parser

/usr/bin/make install -- OK


これからはヘッダファイルがないなどのエラーにあったらdevelがあるかどうかを疑おうと思う。
にしても、モジュールインストールここまで苦労するとは(笑

CGI::Sessionモジュール

CGI::Sessionモジュール

ユーザー認証後のセッション管理を行うために今回CGI::Sessionモジュールを勉強しましたので自分の理解の範囲で書いてみたいと思います。
ログイン後にUserIDを常にサーバーで保持する必要があり、txtファイルを作ってやるのもどうなんだ。。と思ったので。
今回使ったセッションの流れを書いてみると。

1 ID・パスワード認証
認証成功(Y/N)
(Y):SessionIDを作成 CookieにSessionIDを渡し、UserIDをサーバのセッションフォルダに格納する。②へ
(N):再ログイン画面を表示

2 ログイン後、各種設定変更画面
CookieにSessionIDが存在する(Y/N)

___ (Y):SessionIDは有効である?(Y/N)
   ___(Y):正常に画面遷移を行う
   ___(N):Sessionエラー
  
___ (N)Sessionエラー

かなりわかりにくい図ですが
1 CookieのセッションID存在判定
2 セッションID有効判定
この2つでセッションを管理しています。

今回とても詰まったところは、sessionフォルダのアクセス権です。
ここの所有者をapacheにしないとセッションが作成されても保存されず全てSessionErrorになります。

主要なメソッド

use CGI::Session;
#第1引数:データソース名
#第2引数:セッションIDもしくは$cgiなどのparamやcookieメソッドをもつオブジェクト
#第3引数:セッションを格納するフォルダ
$session=CGI::Session->new(undef,$cgi,{Directory=>'/var/session/'});
#セッションに有効なIDを返す
$session->id();
#セッションにパラメータを追加
$session->param('name','hogehoge');

#パラメータを読み出す($nameはhogeghoge)
$name=$session->param('name')

#sessionの有効期限を1年間に設定
$session->expire("+1y");

#sessionを削除する
$session->delete();