ブログの最近のブログ記事

最近yumのパッケージなどあまり更新してなかったので、久々にやるかと思って、
GUIでアップデートを行なったらいきなりperlスクリプトが500Internal Server Error。

うざーー!

最初にCGI::Carp qw(fatalsToBrowser)を呼んでいるので、このエラーの場合は
たいていヘッダー出力が間違っていることがほとんど。

しかしどこもおかしくない。

/var/log/httpd/error_log を見ても、お得意の
「Premature end of script headers」

しかしよーく見ると
「Can't locate object method "splitpath" via package "File::Spec" at /usr/lib/perl5/5.10.0/CGI/Carp.pm line 361, line 64.」

なので、試しに、同じようにCarp.pmを使用してるMTのスクリプトにアクセスしてみたら、同様のエラーコメント。


今回のyumアップデート直後のエラーだけに
/var/log/yum.log を見てみる。

Apr 25 16:01:29 Updated: httpd-2.2.11-2.fc10.i386
Apr 25 16:01:29 Updated: 4:perl-libs-5.10.0-68.fc10.i386
  ・
  ・
Apr 25 16:02:37 Updated: cpan2rpm-2.028-6.fc10.noarch

うーん、なんかこの辺が怪しい感じ。


アパッチのアップデートも入ってるけど、perlのモジュールを結構全面的に
書き換えてる感じだから、とりあえずエラーが出てるおおもとの
File::Specモジュールをとりあえずインストールしなおすかってことで・・

たしかこれはCpanのRPMパッケージだったはずだから、とりあえず、

----------------------------------------------------
# rpm -e perl-File-Spec

# rpm -q perl-File-Spec
パッケージ perl-File-Spec はインストールされていません。

----------------------------------------------------


と、ここで何となくスクリプトを実行してみたら、
あれ・・・動いた・・・。

MTにもちゃんとログインできる・・・


/usr/lib/perl5/ の中を確認すると、何か知らんけどFile::Specモジュールが
入ってる・・・
ということは、今回のアップデートでperl5.10.0の標準モジュールになった
ってこと?
いやいやそんなはずはない。Carp.pmなんてずっと昔から使ってるんだから。

rpmを削除してスクリプトがちゃんと動くってことは、今まで標準
モジュールよりRPMパッケージの方を優先して読み込んでたってこと?

てゆうか、最初からFile::Spec入ってるのになんで俺RPMでインストールしちゃって
るんだろう?

とにかく今回のモジュールアップデートでどこかダブったんだか改行コードがおかしく
なったんだかようわからんが、直ってよかった。

2日ハマったのでメモ。
前回紹介したMTプラグインの一つ「hirosikitextfilter」で、記事内容にURLが含まれていたときに自動リンク(URL補完)させる件だが、デフォルトのままだと、URLのGETクエリに含まれる
「?aaa=111&bbb=222&ccc=333」とかの部分が、
   ↓
「?aaa=111&bbb=222&ccc=333」(実際は全て半角)

みたいな感じに変換されてしまう。

ただHTMLに表示するだけならいいが、URLをクリックしてCGIとかにクエリを渡したとき、nameとvalueの関係が、

aaa ---> 111
amp ---> 未定義
bbb ---> 222
amp ---> 未定義
ccc ---> 333

(※「;」(セミコロン)がデリミタ扱いになる理由は分からないが、掲示板などで調べたら、結果が上記のようになることがわかった。)


になってしまい、無駄なパラメータ(ampの部分)が発生してしまうので、
「hirosikitextfilter.pl」78行目の

$u =~ s/\&/\&/g;

の部分を削除。

試しに記載↓
http://hogehoge.jp/get.php?a=111&b=222
↑「&」が「&」にならずそのままなら成功。



それと、cronからのメールで、

Odd number of elements in hash assignment at /home/****/public_html/mt/plugins/hirosikitextfilter.pl line 12.
Odd number of elements in hash assignment at /home/****/public_html/mt/plugins/hirosikitextfilter.pl line 16.

(※直訳
hirosikitextfilter.plの12行目と16行目でハッシュを定義するとき、KEYとVALUEの合計が奇数(対になってない)ですよ みたいな感じ。)

と毎回怒られるので、よくみたら13〜15行目が

%inTags =
split( ',',
'a,,pre,,script,,object,,embed,'
);

となっているので、最後のembedのあとにカンマをもう一つ追加して修正。

17〜20行目も同様に修正。

したが、まだ同じエラー(というか警告)が出る。

仕方がないので、

%inTags =
split( ',',
"'a',','pre','','script','','object','','embed',''"
);

みたいに全部空文字列で定義してやったらOKになった。

てゆうか、これならsplitしないで普通に定義したほうがスマートのような・・・
無料のブログサービスだと、Seesaaとかlivedoorブログとか、携帯電話からの
メールをそのままブログ記事に反映させる機能をサポートしているものもあるが、
MTだと初期状態のままではこの機能は使えない。

そこでおすすめするのが、スカイアークシステムさんが開発した、MTプラグインの
一つである「MailPack」。
詳しくはこちら→ http://www.skyarc.co.jp/engineerblog/entry/4022.html

MTの個人無償ライセンス利用者に限り、こちらも無償でダウンロードできる。
(バージョンは1.1に限る)
また、プロ用で「MailPackPro」というのもあるらしいが、こちらは有償。
ただproじゃなくても、個人レベルでモブログする程度であれば、全く問題ないし、
Seesaaとかにも負けないくらい多機能なので、よっぽどのことがなければこれで
十分事足りると思う。


このプラグインを使うには以下のperlモジュールが必要なので、予めインストール
しておく。

・Net::POP3
・File::Basename
・File::Spec
・MIME-tools

SSLを利用する場合はさらに下記が必要。

・Mail::POP3Client
・IO::Socket::SSL

FCとかだと、yumから直接おとせるものもあるが、CPANに行けば全て揃っているので、
コマンド叩くのが面倒なら、全てブラウザからダウンロードしてmakeinstallした
ほうが早いかもしれない。


ちなみにCPAN用RPMのインストールの仕方と、perlモジュールインストール方法は以下。

コマンドラインからroot権限にて、
# yum -y install perl-ExtUtils-MakeMaker (cpan2rpmに必要なExtUtils::MakeMakerインストール)
   ↓
# yum -y install cpan2rpm (cpan2rpmインストール)
   ↓
※fedora10の場合
# yum -y install rpmdevtools ; rpmdev-setuptree (rpmbuildディレクトリ作成)
   ↓
何かperlモジュールをインストールしたい場合、
# cpan2rpm --no-sign --install File::Spec(File::Specパッケージをインストールする場合)


モジュールの準備ができたら、冒頭のURLからMailPack本体をダウンロード・解凍し、
MTのpluginsディレクトリ内に設置し、さらにmailpack.cgiの実行権限を755に変更。


次に、投稿専用のメールアカウントを作成しておく。
これは、GmailでもYahooメールでも、POP接続できるメールボックスであれば
何でも構わない。
自営サーバの場合は、ユーザを追加しておくだけで大抵のLinuxディストリビューション
なら勝手にメールボックスが作られるはず。

このプラグインは、指定時間になるとこの指定された受信メールBOXにPOPで
接続して、メールBOXからメールを削除しメール内容を記事としてMTに投稿する。

なので、投稿専用にしておかないと、投稿したくもない受信メールが勝手に記事として
投稿されてしまうので注意。


次に管理者権限でエディタを立ち上げ、/etc/cron.d/ 内に新規ファイルを作成し、

*/10 * * * * root cd (MTのメインディレクトリのパス); ./tools/run-periodic-tasks

と記述し「mt-task」とか適当に名前付けて保存。
(この場合は、10分おきにタスク起動→メール送信から早くて10分後にブログ記事に反映。)


その後MTにログインすると、DBのアップデートを尋ねられるので、「OK」。
   ↓
ログイン後、システムメニューに「メール投稿設定」という項目が追加されている。

「投稿先メールアドレスの追加」から各種設定を行なう。

ごっちゃになりやすいが、
「投稿先のメールアドレスを入力してください」の欄には、先ほど作った
投稿専用のメールアドレスを入力。
「メールアドレスのユーザ名を入力してください」の欄には、たいてい前者と同じか、@から前の部分を入力する。
(要は、メールソフトの設定でいうところの、POPサーバ接続ユーザ名)


続いて、「新規作成」→「ユーザ」で、メール投稿専用のユーザを作成。
(既存のユーザの設定を変更して行なうことも出きるが、おすすめしない。)

名前などは適当に決めてよいが、「電子メール」の項目は、「メールを送信する
送信元のメールアドレス」を設定する。
(携帯から送るのであれば、その携帯のメールアドレス)
※このプラグインは、送信元メールアドレスを見て、記事の投稿を行なえる
権限を持つユーザかどうかを判断している。


最後に、追加したユーザに「権限」の設定から、ユーザまたはライターなどの
権限を付与すれば設定完了。



試しに先ほど作成した投稿専用のメールアドレス宛に、メールを送ってみよう。

10分後に指定したブログに、メールの内容が記事として投稿されていれば成功だ。

うまくいかない場合は以下の理由が考えられる。

・メールの送信元アドレスがMTのユーザの電子メールと違う。
・MTのユーザに記事を投稿する権限がない。
・投稿専用アドレスのPOP接続ユーザ名・パスワードが間違っている。
・cronの設定が間違っている。
・cronデーモンが起動していない。
など。

MTシステムメニューの「ツール」→「ログ」を参照すれば大抵の原因は
わかるはず。
MTに記事投稿する際、MTではURLを自動的にリンクに変換してくれる機能がないので、ひろさんが作られたプラグイン「hirosikittextfilter.pl」を使わせていただく。

これがあると非常に便利。
→ http://memo.hirosiki.jp/article/41793651.html

使い方は簡単で、使用中のMTディレクトリの中のpluginsディレクトリに置くだけ。

設置すると、記事作成画面の「フォーマット」に「改行を変換+URL自動リンク(ひろ式)」が新しく追加される。

このラベルの文字がOSの関係で変な記号になってしまう場合は、スクリプト内の

 label => '&354424;......'; の部分を

 label => '改行を変換およびURLを補完',

などと、強引に書き換えてしまえばOK。


追加した後は、ブログの設定で、記事作成時の初期フォーマットをこれに設定しておく。

これでメールからの自動投稿などにも対応できる。

メルマガのバックナンバー記事をそのままブログに流すときなどに便利。


続き → http://www.igreks.jp/dev/2009/01/mturl.html
2回目のMT設置が完了。
現在の最新バージョンはMT4.22。

なぜ2回目かというと、前回は2週間前に設置したが、設定ファイルを特に気にしてなかったので、mysqlに格納するときに、文字コードがおかしくなっていた。

これはmysql4になってから、クエリ発行時のデフォルトキャラクタセットが強制的にUTF-8になったことに起因する昔からの不具合らしく、MTだけを使っているのなら格納時に文字化けしても、取り出し時にエンコードされるので表面上は正常に見えるが、phpmyadminでDBを見てみると、見事に文字化けしている。
また、デフォルトでの文字セットと照合順序がlatin1_swedish_ci(スウェーデン?)になっちゃってる。

MTで使うmysqlサーバは、他の自分のスクリプトからも参照されるので、これはさすがに統一しなきゃならんってことで、いろいろ解決方法を検索して調べまくり今に至る。

結果的に/etc/my.confを以下のように変更し、文字化けは解消された。

[client]
default-character-set = utf8

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set = utf8
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
default-character-set = utf8

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

skip-character-set-client-handshake


最後のskip-character-set-client-handshakeオプションが有効になる環境であれば、
他のdefault-character-set = utf8とかは記述しなくても問題ないとは思われるが、念のためのおまじないってことで・・・


phpmyadminから再び確認すると、ちゃんと2バイト文字も文字化けなし。
いーねいーね。

上の設定をしておけばmt-config.cgiの内容もほぼデフォルトでOKみたい。


ただ、今まで書きためたMTの記事(10件ほど)は、すでに文字化けした状態でmysqlに格納されていたため、残念ながらリセット。
また一から記事の書き直しだ・・・

このアーカイブについて

このページには、過去に書かれたブログ記事のうちブログカテゴリに属しているものが含まれています。

前のカテゴリはサーバ構築です。

次のカテゴリはメール配信です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 4.22-ja