モジュールがmod_perlに対応しているかどうかについて

mod_perlでいろいろ動かしてみると、モジュールの対応というものを意識せざるを得なくなりました。
自作のテンプレートモジュールをテストしていたところ、どうも通常とは結果が異なることに気がつきました。
よくよく調べてみると、モジュール内で保持している変数の値がずっと残っているためと判明。
newで呼ばれるところに初期化の処理を加えたところ、希望通りの動きをしてくれました。
よくよく考えると当たり前なのですが、作りが甘いことを実感しました。
公開中のものも、そのうち修正しないとダメですね。

CentOS5.2でmod_perlを使えるようにする

かなり昔(確かApache2.0が出た頃)にWindows2000でmod_perlを使ってみようとして挫折したままでした。
なぜ動かなかったのかまでは、はっきり覚えていません。
心機一転、改めてmod_perlに挑戦です。
OSはCentOS5.2、Apacheは2.2.3、mod_perlは2.0.2です。

まずは、mod_perlをインストールします。

yum -y install mod_perl


パッケージが見つかるとインストールが開始され・・・ずに、

Parsing package install arguments
Package mod_perl - 2.0.2-6.3.el5.i386 id already installed.


つまり、既にインストールされているとのこと。
手間が省けてラッキーなのか、必要のないモジュールをロードしていたのは問題なのかは気にしてはいけません。
次に、httpd.confを設定しますが、この環境ではperl.confから設定をロードしているので、そのファイルの編集します。

LoadModule perl_module modules/mod_perl.so


これは先述の通り、インストール済みでロード済みなので、このまま。
仮にコメントアウトされているなら外します。
次に、スクリプトの起動設定ですが、perl.confで弄ると、なぜか500エラーになってしまうので、.htaccessで設定を行うことにします。本当はエラーの原因を見つけ出して修正できればいいのですが、まだまだ勉強が必要のようです。
httpdをrestartして問題がなければ、.htaccessの設定に移りましょう。

# mod_perl
<IfModule mod_perl.c>
  <Files ~ "\.(cgi|pl)$">
      SetHandler perl-script
      PerlHandler ModPerl::Registry
      PerlSendHeader On
  </Files>
</IfModule>


そもそも、拡張子の.cgiと.plはAddHandler cgi-scriptで設定してあるので必要ないのかもしれませんが、一応付けておきます。
mod_perlが実行できるかどうかは、

#!/usr/bin/perl -w
use strict;
print "Content-Type: text/html\n\n";
print exists $ENV{'MOD_PERL'} ? 'true' : 'false';


このようなスクリプトで確認できます。
trueが表示されれば、サーバー側の設定は終わりました。

次はスクリプトの設定です。
基本的な事として、編集の初期化に注意すること、実行パスはルートになることさえわかっていれば、特に問題はないでしょう。
自作のモジュールなどを利用している場合は、モジュールを読む前に、例えばドキュメントルートが/home/public_html/の場合は、

use lib '/home/public_html/';


ちなみに、BEGINではダメらしいです。
そして、

chdir '/home/public_html/';


このあたりを押さえておけば動くはずです。

Let’s mod_perl life!

Windowsではどうやるんだろう・・・orz

XML::libXMLで文字コードが化ける

PerlのXML::libXMLモジュールのお話です。
問題が発生したのと同じ条件で、例題として、xmlの中のNameを取り出すことにする。

my $parser = XML::LibXML -> new();
my $dom = $parser -> parse_file( $file );
my @xmlObj = $dom -> getElementsByTagName( 'xml' );
foreach( @xmlObj ){
	my $name = $_ -> findnodes( './Name' );
}


$nameに入る文字がUTF-8のとき(スカラーではなくリファレンスが入る?)、UTF-7に化けることがあるらしい。
どうしてこうなるのかは謎。
パースの問題なのか、どこかでコードを指定しなければならないのかはよく分からず。

Operation “eq”: no method found,

Perlでエラーのお話。

“eq”は別の予約語の場合もあり。
例えば、

if( $temp eq 'asdf' ){}


という、何の変哲も無い比較を行うときに出現するエラー。
これを回避するには、

if( "$temp" eq 'asdf' ){}


とすればいいのだけれど、これは$tempが純粋なスカラーでない場合に発生する。
つまり、

print ref $temp;


この場合、リファレンスを調べるとSCALARではないとき。
自分がよく遭遇するのは、

XML::LibXML::NodeList


のとき。
スカラーが帰っていると思い込んでいると、たまに痛い目にあいます。

ちょっと調整しました

国の情報が取得できていないのを発見したので、ちょっと調整してみました。
なんだかんだで時間がぜんぜん取れませんし、自力でのデータ取得もいまだに不可能。
回線を引くにも金はないし、そもそも時間がないという悪循環。

貧乏暇なしとは言いますが、金も時間も自分で作るもの。
時間がないというのはただの言い訳でしかないのです。

今年中には、もうちょっと手を入れたいですね。
いつ実現するかわかりませんが、自力で取得できるようになって、回線も太くなったときには、今のテキスとファイルでデータを管理するのではなく、データベースに放り込んで集計を行いたいですね。

ページと投稿の使い分けをどうするのか

WordPressを使い始めてちょっと経ちますが、この内容は投稿でいいのかとか、この内容はページでいいのかを悩むようになりました。
そもそも、なぜ投稿とページが分かれているのかがなぞです。
使い始めにはまったく疑問に思っていませんでしたが。
WordPressサイトをよくよく見ると投稿しか使ってないところが結構あるようです。

他にも、カテゴリ自体に説明文を追加したい時や、そのカテゴリのインデックスページが作成できないなど、よくよく考えると足らない機能が多いようです。
とはいえ、そこそこ人気のあるCMSですし、ただ単に使い方があっていなかったということだけのような気もします。

アップロードする方法がわからない

いまひとつ使い方を理解していないWordPressですが、ふと画像をアップロードしようと思ったものの、方法がわからなくなりました。
以前は「メディアの追加」のような名前でメニューがあったような気がしたのですが、今探すとどこにもない。
うーんこ、待った。
基、うーん、困った。

OOo3 BaseでMySQLに接続する

いつもはphpMyAdminというツールを使って操作していますが、HTMLで構成される画面には何かと限界を感じるものです。
かなり昔にMicrosoftのAccessで簡単なデータベースを作ったことがありますが、Windowsに限定されるのは何かと不便だし、一から作るのであれば新しいものに手を出してみようとOOoのBaseからMySQLに接続してみることにしました。
Baseを起動するとデータベースウィザードが開始されますので、指示通りに進めます。

「既存のデータベースに接続」を選択し、「MySQL」を指定
 ↓
JDBCを使って接続を選択
 ↓
データベースの名前、サーバーURLを入力
 ↓
ユーザー名を入力し、必須パスワードにチェックを入れて「テスト接続」ボタンを押下
 ↓
パスワードを入力して「OK」ボタンを押下
 ↓
ワクテカしながら結果を待つ・・・まもなくエラーメッセージが表示される

さて、ここまで進めたのにエラーが表示されて進めなくなりました。

The driver class 'com.mysql.jdbc.Driver' could not be loaded.

com/mysql/jdbc/Driver

つまり、ドライバが見つかりませんということのようです。
このエラーはJRE対応であってもなくても表示されます。インストールしなおして実験したので間違いありません。
Javaの環境によってはこの作業が必要ではないのかもしれません。
OOo自体にはMySQL用のドライバ(他のDBも?)が入っていないので、別途用意してあげる必要があります。
今回はMySQLへの接続ですので、MySQLのサイトからJDBCドライバをダウンロードします。
この記事の作成時点ではConnector/J 5.1が用意されていました。
ダウンロードにはオーナーの情報を求められますので、適当に入力します。
入力内容に不備が無ければ画面が推移しますので、あちこちに用意されているミラーからダウンロードします。
このファイルはOOo以外からも利用できますので、OOoのディレクトリの中に入れるのではなく、パブリックな場所においておくといいでしょう。
次に、ダウンロードしたドライバを認識させなければなりません。
Baseを起動するとまたウィザードが表示されますので、設定を無視して「完了」ボタンを押下し、ウィンドウのメニューを操作できる状態にします。もちろん、OOoのスタートウィンドウを起動してもかまいません。

ツール>オプション
 ↓
OpenOffice.org>Java
 ↓
「クラスパス」ボタンを押下
 ↓
「アーカイブを追加」ボタンを押下
 ↓
先ほど保存した「mysql-connector-java-5.1.7-bin.jar」を選択し、「OK」ボタンを押下
 ↓
指示に従ってOOoを再起動

これで、最初に行った手順どおりに進めると、無事

接続テスト

接続が正常に確立できました。

と表示されます。
あとは、設定をファイルに保存すれば完了です。
データベース操作の解説はまた別の機会に。