blosxomの移行

昼間の雷雨のせいで瞬停があって、サーバーが落ちてた。ちょっとUPSから外してたのでタイミングが悪かった。

で、このサーバー不安定だから、新しいサーバーに変えるタイミングでblosxomもやめようかなとか思ってるんだけど、データのマイグレーションがめんどくさそうで躊躇してた。

どうしよーかなー?と思ってたら、RSSに全エントリ吐き出して、それをparseすればいいじゃんとか思った。それかstaticで吐き出しておいて、そのまま残すかな。

あと、ちゃんとドメインとる。

ここらへんを今月来月の目標に。

新しいサーバーにblosxomを移したりしてたが

新しいサーバーにblosxomを移そうとしているがやっぱ遅い、っていうか負荷かかりすぎ。あとは、自作の変なプラグインが入ってるので、cpanのモジュール入れたりするのが大変すぎ。あとこれだと、折角、サーバーのスペックあげても、容赦ないロボット来たらやられちゃうナァって感じの負荷量。

modだmodとか言ってModblosxomにしようかしらと思って、移行しようとしてみたけど、今の環境をそのままmodblosxomで動かすにはモジュール化しなければいけないプラグイン多すぎだ。

じゃぁ、いっそpyblosxomでpythonの勉強も兼ねていじってみようか。と思ってたら、Djangoのblogキットってのもあるらしい。悩む。turbogeasでも似たようなものあるのかな?

perlだったら、catlxomとかbifty、あとはTypefaceあたりな気がするが。

むー。ずっとblosxom使っていて気になってたのはやっぱ下書きを保存しておく機能がないとつらいよなってことなので、変えるんだったら下書き機能が標準でついてるやつ。

変えないんだったら、blosxomをもうちょいいじって、基本はstaticでサイドバーのコメントとかトラックバックとかJSONにするのがいいような気がする。あとはdynamic_cacheはスパムとか来るたびにrecacheで今までのキャッシュ消しちゃうので、こっちをなんとかしても、負荷対策になるような気がする。

Lingua::JA::SummarizeとHyper Estraierでsimilar_entryプラグイン

Lingua::JA::Summarizeの特徴語をHyper Estraierで検索できるようにしたので、類似のエントリを表示するblosxomプラグインを書いた。
個別のエントリの下のほうに5個表示するようになってる。

色々眺めてみてるけど、短いエントリは精度が悪いのと、単純にOR検索だとあんま思ったような結果が得られない。やっぱ適当な重み付けが必要なんだろうナァ。

estseek.cgiの場合はこんな感じで評価するようだ。

User's Guide of Hyper Estraier Version 1 (Japanese)

estseek.cgiの場合、「[similar]」というリンクを選択すると類似検索を行うことができます。類似検索の結果は類似度の降順に並べられます。類似度はベクトル空間モデルという考え方に基づいて算出されます。文書からキーワードを取り出してベクトルとして表現し、ベクトル同士のなす角の余弦を類似度とするものです。

あとでこれ読む

Hyper Estraier

あるとわかっているのに辿りつけないもどかしさというか、

google 検索結果返す 故にエントリ有り

というようなgoogle認識論的なアプローチに依存しすぎるということはちょっとツライことに気付いた。

ちゅうのは、自サイトの検索をgoogleに任せてからそこそこ経つんだけど、googleは被リンク数が少ないと(クローラーはガッツリ持ってくくせに)検索結果の表示対象にならない。そのため、自分で書いたエントリがあるはずなのに探せないという状況が頻発した。

なんで、やっぱ自前で検索エンジン入れる必要があるなぁと、Hyper Estraierを利用して検索できるようにした。

僕のサイトはblosxomで構築されている。これは、データベースでなく普通のテキストファイルでエントリを管理しているので、Hyper Estraierのestcmdでデータディレクトリを検索対象にすればよい。ただし、これだと、タイトル属性がないために、検索結果のタイトルがファイル名になってしまう。

blosxomのエントリデータは先頭行がタイトルのテキストデータなので、ここら辺をちょっといじくるblosxom用のフィルタを作成した。

まずは、フィルタを作成。/usr/local/share/hyperestraier/filterのestfxpdftohtmlをコピーしてフィルタを作成。下はdiffってみたけど、要するにpdftotextのコマンドをblosxom用のコンバートコマンドに書き換えれば良いだけ。僕の使っているestfxblosxomtohtml

--- estfxpdftohtml      2006-12-02 16:09:34.000000000 +0900
+++ estfxblosxomtohtml  2006-12-02 17:47:04.000000000 +0900
@@ -1,14 +1,14 @@
 #! /bin/sh
 #================================================================
-# extfxpdftohtml
+# extfxblosxomtohtml
 # Convert PDF into HTML
 #================================================================

 # set variables
 PATH="$PATH:/usr/local/bin:$HOME/bin:." ; export PATH
-progname="estfxpdftohtml"
+progname="estfxblosxomtohtml"

 # check arguments
@@ -56,7 +56,7 @@

 # output the result
-pdftotext -enc UTF-8 -htmlmeta "$infile" - 2> "/dev/null" | output
+bldata2html "$infile" - 2> "/dev/null" | output

 # exit normally

で、blosxomのデータをhtmlに吐くには先頭行だけtitle属性で囲んで、あとはそのまま出力すればいいんだけど、僕はmarkdown使っているので、フィルタリングしてhtmlに出力するようなスクリプトにした。これがpdftotxtにあたるbldata2htmlで/usr/local/binとかのパスの通ったところに保存する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl

use strict;
use warnings;
use FileHandle;
use Text::Markdown 'markdown';

my $filename = shift;
my ($title,$body) = ();

my $fh = new FileHandle($filename);

$title = <$fh>;
chomp($title);

{
local $/ = undef;
$body = <$fh>;
}
my $html = markdown($body);

print "<title>", $title , "</title>\n", $html;

あとは、実際にインデックスをつくる。txt属性はestfxblosxomtohtmlフィルタをかますようにオプションを指定しておく。最後のextkeysは検索速度向上のため。

PATH=$PATH:/usr/local/share/hyperestraier/filter ; export PATH
estcmd gather -il ja -fx ".txt" "H@estfxblosxomtohtml" -sd casket /var/blosxom/data/
estcmd extkeys casket

で、実際にestseekで検索するといい感じ。後は定期的にインデックスの更新するようにしとけば、自サイトの検索はOK。今のとこ、cronでインデックスの更新するようにしていないので、blosomの検索フォームはgoogleのままだけど、そのうち変更しよう。

あとは、blosxomのエントリに類似エントリ検索をした結果を表示するプラグインを作っておけば便利かな。

スパムをはじくblosxomプラグイン2種

最近、やたらとスパムなトラックバックが多い。毎回ファイル見ながら消すのも面倒になってきたので、スパムよけのプラグインを入れてみた。

れっつ日記 - 【移植】言及リンクのない TrackBack ping を弾くプラグイン

本プラグインをインストールするとトラックバック元のサイトに自分のブログへのリンクが含まれているかを確認し、含まれていない場合トラックバックをエラーにします。

で、コメントスパムよけのcaptchaなプラグインもついでに探してみたら、それっぽいのを発見

他にもこんな感じで色々あるらしいが、とりあえずcaptchaプラグインを入れてみた。

captchaプラグインを使うためには次の二つのモジュールとプラグインが必要。

  • Authen::Captchaモジュール
  • interpolate_fancyプラグイン

ただし、captchaの認証のコードはこんな感じで失敗するとdieするだけなので、

die "captcha failed ($reasons{$results})\n"

試しに認証失敗してやると、こんな感じの綺麗とはいえないエラーを吐く。

captcha error

スパム対策が効いてるようだったら、後で手を加えよう。

Net::MovableTypeを使ってblosxomに投稿

あーそういえば、BXRってのがあったなというのを思い出したので、Net::MovableTypeで投稿することを思いついた。

my $mt = new Net::MovableType('http://localhost/blosxom-xmlrpc.cgi/RPC2');
$mt->username('kzfm');
$mt->password('okbkj');
$mt->blogId(1);

$entry = {
    title       => "Hello World from Net::MovableType",
    description => "おーけーおーけーOK牧場"
};

$mt->newPost($entry);

mttest

おー、かなりOK牧場だ。

ちなみにpackage blosxomのnewPostをちょっといじって常にランダムなファイル名を付与するようにした。ファイル名考えなくていいってだけでも精神的にはかなりラク。

#    if ( defined( $struct->{'postid'} ) ) {
#        $filename = BXR::getFilenameFromPostId( $struct->{'postid'} );
#    }
#    else {
#        $filename = lc( $struct->{'title'} );
#        $filename =~ s/\W+/_/g;
#        $filename =~ s/_+$//;
#        $filename = BXR::getRandomFilename() unless $filename =~ m/[a-z]/;

これで、Plagger::Plugin::Publish::MTを使ってChangelog2blosxomができるはず。ここまでやれれば、僕はchangelogだけに集中すればよくて、それ以降の処理はplaggerがよきにはからってくれるのでかなり調子いいかも。あとは学会とかセミナーの参加ログもchangelogでとってるのでms-wordにpublishしたいなぁ。

dynamic_cacheプラグインで静的なキャッシュを

うちのマシンは非力でcgiの起動は結構負荷がかかるので、以前からどうにかしたいなぁと思っていた。いま使っているdynamic_cacheプラグインで、負荷軽減はかなりされたんだが、それでも最初にcgiを起動してしまうので、どうにかして静的なキャッシュの仕組みを作れないかと四苦八苦してみた。

現在、サーバーの設定は.htaccessでファイルとかディレクトリがない場合に、blosxom.cgiを実行するようになっている。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ blosxom.cgi/$1 [L,QSA]

だから、blosxomのディレクトリとdynamic_cacheのキャッシュ先を一緒にすれば、キャッシュされたファイルは次回からは直接httpdにより処理される。

ここまでは以前試してあったのだが、これだと問題が3つある。一つは設定に関することで、残りの二つはプラグインをいじらないといけない問題だ。

  1. rootのindex.htmlとblosxom.cgiがバッティングしてえらいことになる。
  2. dynamic_cacheはヘッダーも含めてキャッシュするので、キャッシュ表示の際にContent-Typesとか表示されてしまう。
  3. recache=allでキャッシュディレクトリ以下のすべてのファイルが消去されてしまうため、キャッシュ先をルートに設定するとblosxomのサブディレクトリ以外の画像ファイルとかも消してしまう。

1に関しては先日発見した通りに適当なディレクトリを用意してそこにRewriteするようにすればよい。うちだとこんな感じ。

DirectoryIndex index.html
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule   ^([^.].*)$        .bldir/blosxom.cgi/$1 [L,QSA]

で、残りの二つはdynamic_cacheプラグインを修正して対応。2はヘッダー除いて保存するようにdynamic_cacheを書き換えた。

    # キャッシュファイル出力
    if ($fh->open("> $cache_dir/$cachefile")) {
            $blosxom::output =~ s/^Content-Type: .*?; charset=.*?\r?\n\r?\n//;
            print $fh $blosxom::output;
            close $fh;
            logput("SAVE ");
    }

3に関しては、dynamic_cacheで使っているFile::Pathって知らなかった。
ドキュメント読んだら、消したいディレクトリとかファイルのリストのリファレンスを与えればよいらしい。
dynamic_cacheだとキャッシュ用ディレクトリを消すようになっていたので、ここを書き換えた。

    # キャッシュ全クリア
    # 【flavourの記述例】<input type="hidden" name="recache" value="all">
    if($recache=~/all/i){
        require File::Path;
        my @del_dir = map {$cache_dir . "/" .$_} ("Computer", "Etc", "daily", "Food",
                                                  "trekking", "index.rss10", "index.html",
                                                  "2004", "2005", "2006",
                                                  "index.rss", "index.xml");
        File::Path::rmtree(\@del_dir) and logput("CLEAR","ALL");
    }

こんな感じで、今のところ静的にキャッシュされている感じだが、このせいで、taggingプラグインみたいにgetで処理するプラグインが動かなくなってしまった。

これもRewriteRuleでうまく処理できるのだろうか?

Search::Estraierを使うことを考えたほうがよいかなと思ったりもしてるが。

またもやblosxomの遅さが気になってきたヨ

ココ何日か、blosxomの遅さが気になりはじめてきた。クライアントでページを表示させるのに10秒以上かかると、さすがに遅いナァって思うし、サーバー状況をtopで眺めてると、5つくらいのblosxom.cgiでスワップしそうになるので精神衛生上もよくない。 やっぱ静的なキャッシュにしたいなぁという思いが強まってきた。とりあえず気休め程度にページングとかのキャッシュ対象にしていないプラグインをはずしてみたり、last.fmのやたらと遅いjsをやめてみたりしている。

以前dynamic_cacheで試した方法だとうまくいかなかったからなぁと何気に検索かけてみたら、

をを~cgiはドットなディレクトリに配置すればいいんだ

と。

昔参考にしたのにちゃんと理解してなかったヨ。

新しいサーバーはこの設定で動かしてみよう。

あと、google sitemaps使ってるけど、ヒットしないページが結構あるので、ついでに検索はSearch::Estraierに変更したい。

Catalyst::Plugin::Flavourはdev向けでいれる

catlxom動かんから週末ちゃんとみようとか思ってたら、ナイスなタイミングでエントリが。

mizzy.org

まず、cpan コマンドで Catalyst::Plugin::Flavour をインストールすると、バージョン 0.02 が入るのですが、これだと catlxom は動きません。DEVELOPER RELEASE の 0.029_01 のソースをもってきてインストールする必要があります。

これで解決。

で、家のサーバーで動かそうとFC1(perl-5.8.3)な環境で試したら、

$ ./script/catlxom_server.pl 
Operation `""': no method found, argument in overloaded package
 Catlxom::Plugins at /usr/lib/perl5/5.8.3/overload.pm line 97.
Compilation failed in require at ./script/catlxom_server.pl 
line 49.

perlのバージョンあげなあかんかな。

catlxom

なんか最近サーバー不調だし、新しいマシン買ってmod_blosxomにでも乗り換えようかなとか思ってたら、catlxomなるものの開発が進んでるらしい。

をを~素晴らしい

早速svn co してcolinux上で走らせてみますよ。

$ ./script/catlxom_server.pl 
You can connect to your server at http://colinux:3000
[Wed May 24 22:04:17 2006] [catalyst] [error] 
Caught exception in Catlxom->default "Can't locate object 
method "year" via package "html" (perhaps you forgot to load "html"?) 
at /home/kzfm/catalyst/catlxom/plugins/Filter/Date.pm line 15."

とエラー。Date.pmみてみると

    for (qw/year month day/) {
        if ( $c->flavour->$_ ) {

だから、Catalyst::Plugin::Flavourのここらへんから追っかけていけばいいのかなぁ。

$c->flavour( $c->config->{flavour}->{default_flavour} || 'html' )
        unless $c->flavour;
    $c;
}

でも、なんでこれが、htmlロードすんの忘れてんじゃない?というエラーになるのかが良くわかってない。$c->flavour->$_が気になる。週末にちゃんと読もう。

あと、IRCくらい扱えるようにしといたほうが色々といいのかなとか思ってChatZilla入れたけど、いまいち使い方がわからん。これも週末に少し触ってみよう。