スポンサード リンク

blosxom のサイト内検索を msearch に変更

少し前から、当ブログのサイト内検索をインデックス作成型の全文検索エンジンの msearch に切り替えています。以前は blosxom の find プラグインを使用してきましたが、インデックス型の方が検索が高速で負荷も低い(だろう)という判断です。

msearch を blosxom で使用するには、若干、msearch の改造が必要でした。以下に、どのような改造をしたのかを紹介します。ただ私は Perl については詳しくないので、たぶんおかしな部分が含まれていたり、もっと上手い書き方があると思います。一応、手元の環境(blosxom starter kit、文字コード UTF-8)では動作していますが、動作の保証はいたしません(Unicode 以外の文字コードを使用している場合は、動作しません)。

msearch の入手と設置

当ブログでは文字コード UTF-8 で記事を保存しているので、オリジナルの msearch ではなく、msearch の Unicode 対応版を使用しています。HP内全文検索エンジン - Unicode版msearch から入手可能です。

msearch の設置についてはきてーや.ねっと / スクリプト / msearchmsearch導入記HP内全文検索エンジン - Unicode版msearchが参考になります。

以下、設置にあたり、注意したほうがいいと思う点をメモ:

  • Unicode 版はファイルによって文字コードが EUC だったり UTF-8 だったりするので、両方の文字コードを扱えるテキストエディタを使用し、文字コードの設定も間違えないように気をつける。
  • msearch のインデックス作成には、genindex.cgi(CGI として動作させる)か genindex.pl(コマンドラインで実行する)のどちらかを使用する。
  • でも、インデックスの作成は Web サーバー上で行うより、(genindex.cgi/genindex.pl のどちらでもいいので)ローカルで行ったほうが無難。

genindex.pl の改造

まず、msearch掲示板 - Re(5):Perlでインデックスの自動更新を参考に(ていうか、そのまま使わせていただいて) genindex.pl を改造しました。コマンドライン実行時にインデックス作成に関する設定を行いたい場合や CGI(genindex.cgi)でインデックスを作成する場合、この改造は必要ありません

私の場合、ブログと同じフォルダ構成でローカルに記事を保存し、インデックスの作成もローカルでコマンドラインから行っています。しかし、インデックス作成時に、毎回、設定を入力するのは手間です(とくに設定が固定されているような場合)。この改造により Perl スクリプトの中に設定を埋め込めるため、インデックスを作成する際には設定の入力をスキップできるようになります。

注意すべき点
  • インデックス対象を .txt にすること。もし blosxom の設定で記事の拡張子を .txt 以外に設定しているなら、その拡張子を指定。
  • jcode.pl などのパス設定に注意。コマンドラインから実行するときは、cd コマンドで msearch のフォルダにカレントディレクトリを変更するといいみたい。例:
cd C:\msearch\
perl genindex.pl

indexing.pl の改造

次に indexing.pl を改造します。こちらが実際にインデックスを作成するスクリプトのようです。改造にあたっては、msearch掲示板 - 掲示板の過去ログを検索したいのですが問題が。を参考にしました。

変更点は、以下の 3 箇所です。

URL を .txt から .htm に置換

私の場合、記事ファイルの拡張子は .txt(blosxom starter kit のデフォルト)で、個別の記事の URL の拡張子は .htm です。しかし、indexing.pl のデフォルトでは、インデックス対象ファイルの拡張子がそのまま検索結果で表示される URL の拡張子(つまり http://example.com/foo.txt みたいな感じ)になってしまいます。

そこで、正規表現で .txt を .htm に置換することにします。indexing.pl の 707 行目あたりに、次の 3 行を追加します。実際に必要なのは 1 行のみですが、変更点がわかりやすいように「ここから追加」と「ここまで追加」というコメントを追加しています。

## URLの作成
$url = $file;
$url =~ s/^$target_dir/$target_url/;
### ここから追加 ###
$url =~ s/\.txt$/.htm/; # URL の最後の .txt を .htm に置換
### ここまで追加 ###
タイトルを記事の 1 行目から取得

indexing.pl のデフォルトでは、HTML の title 要素からタイトルを取得します。blosxom では記事の 1 行目がタイトルなので、そこから取得するようにします。

indexing.pl の 731 行目あたりに、以下のスクリプトを追加します。改行の直前までをマッチさせたいので、改行の削除が行われる直前に持ってきました。

## 漢字コードの変換
if($utf_mode) { # ★
  &utfjp::convert(\$contents, "utf8"); # UTF-8に変換
  ### ここから追加 ###
  ## タイトルを取得する
  $contents =~ /^(.+?)\n/i; # 1 行目がタイトルなので最初の改行の直前までを取り出す
  $title = $1;
  $title =~ s/\s+/ /g;
  $title =~ s/^\s+//;
  &utfjp::utf8h2z_kana(\$title);    # 半角カナを全角カナに変換
  ### ここまで追加 ###
  &utfjp::chop_eol(\$contents,"utf8"); # 改行の削除
  &utfjp::utf8h2z_kana(\$contents);    # 半角カナを全角カナに変換
} else {
  &jcode::convert(\$contents, "euc", "", "z"); # 半角カナを全角カナに変換
}

その直後にある、従来のタイトル取得部分は不要ですので、以下のようにコメントアウトしました。if 文以降は、そのまま変更しません。

## タイトルを取得する
### ここから変更 ###
#$contents =~ /<title.*?>(.*?)<\/title>/i;
#$contents =~ /^(.+?)$/i;
#$title = $1;
#$title =~ s/\s+/ /g;
#$title =~ s/^\s+//;
### ここまで変更 ###
if($utf_mode) { # ★
  &utfjp::ref_to_utf8(\$title);    # 文字参照を文字そのものに置換(titleタグが拾えているのでHTML間違いなし)
  &utfjp::utf8z2h_an(\$title);
タイトルは元から記事に含まれているので、含めないようにする。

上にも書いたように、blosxom では記事の 1 行目にタイトルが含まれています。このため、以下の部分(上の改造点の直後。765 行目あたり)をコメントアウトします。こうしないと、インデックスにタイトルが 2 つも含まれることになります。

## タイトル文字も本文に含める
### ここから変更 ###
# blosxom の記事には最初からタイトルが含まれているので不要
#$contents = $title . $contents;
### ここまで変更 ###

検索ボックスの設置

最後に検索ボックスを設置します。私の場合、foot.html と foot.htm に次のような HTML コードを埋め込んでいます。

<div class="sidetitle">
Search
</div><!-- sidetitle end -->

<div class="side">
<form action="http://example.com/msearch/msearch.cgi" accept-charset="utf-8">
<input type="text" size="16" name="query" value="">
<input type="submit" value="検索">
<input type="hidden" name="hint" value="ひらがな">
<input type="hidden" name="index" value="">
<input type="hidden" name="config" value="">
</form>
</div><!-- side end -->

インデックスファイルの名前を default.idx 以外に設定している場合は、index という name 属性の値(value)にインデックスファイル名(.idx を除く)を指定します。詳しくは、msearch導入記 の「●複数の検索エンジンを設置したい(インデックスの切り替え)」を参照してください。

2007-03-28 追記

「URL を .txt から .htm に置換」の正規表現において、「.(ドット)」を文字そのものとして扱うためのバックスラッシュ(円記号)が抜けていました(ブログの記事を HTML 形式に変換する際に抜けてしまったようです)。これでは、ドットが任意の一文字にマッチするメタ記号として扱われることになります。つまり、もし「任意の一文字txt」という文字列(atxt でも btxt でもよい)を含む名前のファイルがあった場合に、ファイル名を元に取り出される URL が「http://~.htm~.txt」のように拡張子以外の部分が「.htm」に置換されてしまいます。

現在は正規表現を訂正してありますので、もしこのページを参考に msearch を改造された方があれば、お手数ですが修正してください。修正したら、念のため、インデックスを 1 から作り直してください。よろしくお願いします。

dynamic_cache の入手先変更

dynamic_cacheプラグイン #02 - Ck2 Bloggerで dynamic_cache プラグインが再配布されています。使用方法についても解説されているので、dynamic_cache プラグインを使いたい方は参考にされるといいと思います。

私も、少し前にオリジナルの配布元の LittleStoryホームページにアクセスできないことに気づいていました。私の方でも使用方法などについてまとめようかと思っていたのですが、思っているだけでちっとも進まず・・・きゃーさんъ(゚Д゚)グッジョブ!!

dynamic_cache については、にーやんのブログ :: dynamic_cache プラグインで負荷軽減も参照してください。

遅まきながら Google サイトマップに登録してみた。

カエルチュウイホウ findプラグインやめてgoogleに変更
あとはGoogle サイトマップでもれなく巡回させるようにすればいい。

これを読んで、そういえばそういうのがあったな・・・いや知らないかも・・・(;・∀・)と思い、さっそく登録してみることにしました。blosxom が動的生成なためなのかわかりませんが、Google で検索してヒットすることが少なかったので(単にコンテンツが乏しいためという説も)。

サイトマップ(XML ファイル)の作成にあたっては、blosxomでGoogle Sitemaps #2 - Ck2 Blogger を参考にさせていただきました。flavour と override_num_entries プラグインとを組み合わせる方法です(RSS10 プラグインも必要です)。

用意した flavour は、以下のような感じです。Google サイトマップのサイトにあったサンプルを参考にしました。

content_type.xml

application/xml; charset=UTF-8

head.xml

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">

date.xml(空のファイル)

story.xml

<url>
<loc>$url$path/$fn.htm</loc>
<lastmod>$yr-$mo_num-$da$rss10::T$ti$rss10::tz_offset</lastmod>
</url>

foot.xml

</urlset>

これで blosxom.cgi/index.xml にアクセスすると、(たぶん)Google サイトマップに対応した形式の XML ファイルが生成されるようになります。override_num_entries プラグインで「'xml' => '(すべてのエントリの数より大きい数値)',」と指定すると、すべてのエントリが含まれるようになります。

このままだと負荷が増える可能性があるので、ローカルでビルド(hail2u.net - Weblog - エントリのPublish方法の rebuild.pl を使用)してからアップロードしたものを Google サイトマップに登録することにしました。さらに、念のため、dynamic_cache プラグインで xml ファイルがキャッシュされるようにもしています。

登録してから数十分が経過した頃に確認したところ、ちゃんとクロールされたようです。とくにエラーも出ていないので、たぶん大丈夫なんでしょう・・・。

blosxom では、ほかに「Google サイトマップ に登録するサイトマップ( XML ファイル)を生成する」gsitemap プラグインや、「entriescache を改変して、一行一 URI のテキスト版サイトマップを吐くように」する方法も利用できます。

blosxom 用 mailpost プラグインを導入

いつもお世話になっている color99 さんが、blosxom 用のフォームメールプラグインを公開されました(ダウンロード先などの詳細は、KANGAROO-OASIS :: mailpost v1.00 公開を参照)。

当ブログでも、さっそく導入してみました。ブログのサイドバー下部の投稿欄から、私(にーやん)宛にメールを送信することができます(動作確認済)。

mailpost プラグインを導入するためには、mailpost をエディタで開いて「Configurable variables」を設定し保存。投稿欄を設置したい場所(foot.htmlなど)に

$mailpost::posting_form

と記述すればOKです。

同じく color99 さんが公開されている blosxom 用のスパム対策プラグイン spam_blocker と併用したい場合は、0ext_spam_blocker の 88 行目(v0.39e_b0)に「mailpost」を追加します。

my $plugins = 'writeback|guestbook|newentry|mailpost';  # コメントスパム対策するプラグインの指定

また、mailpost プラグインは、二重投稿防止プラグインの x_double_posting_blocker とも併用したほうがいいそうです(最新版(v0.42)では、最初から mailpost が対象プラグインに指定されています)。

なお、mailpost プラグインの導入にともない、ブログ上でのメールアドレスの公開を取りやめることにしました。


(追記)エントリの内容を一部修正しました(サイト名を作者名に変更など)。

awsxomプラグインを9月24日版に差し替え+少しいじってみたり

awsxom プラグインの新しいのが出ています。今回から foot.flavour でも使えるようになったので、サイドバーの Recommends にも awsxom プラグインを使うことにしました。

ところで、バージョンアップするときに気づいたのですが、awsxom では DVD の監督や出演者が表示できません(気づくの遅っ)。私は映画を選ぶときに監督や出演者(とくに監督)を重視する人なので、awsxom プラグインを少しいじってみることにしました。

ローカルとこのブログでテストした限りでは何とか動いているようなので、変更した箇所を書いておきます(無謀とも言う)。ただし、私は Perl には詳しくない(ていうか、全く知らないと言ってもいいくらい)ので、思いっきり間違っている可能性も(大いに)あります。

Amazon から取得するデータのタイプを「type=lite」から「type=heavy」に変更

73 行目を

    my $url = "http://xml.amazon.co.jp/...&type=lite=...

から

    my $url = "http://xml.amazon.co.jp/...&type=heavy=...

に変更。

150 行目あたりに、以下の行を追加

    # 監督・出演者の解析
    $detail{"Director"} = parseAuthor($buf, "Directors", "Director");
    $detail{"Actor"} = parseActor($buf, "Starring", "Actor");
    # DVDの場合、AuthorにDirectorと/またはActorを入れておく
    if ($detail{"Catalog"} eq "DVD") {
        if ($detail{"Director"} ne "" && $detail{"Actor"} ne "") {
        $detail{"Author"} = $detail{"Director"} . " / " . $detail{"Actor"};
        } elsif ($detail{"Director"} ne "" && $detail{"Actor"} eq "") {
        $detail{"Author"} = $detail{"Director"};
        } elsif ($detail{"Director"} eq "" && $detail{"Actor"} ne "") {
        $detail{"Author"} = $detail{"Actor"};
        }
    }

「# デバッグ用」の前(オリジナルの 177 行目)あたりに、以下の行を追加

# ---------------------------------------------------------------------
# Actor 部分の解析
sub parseActor {
    my ($buf, $parent, $child) = @_;
    my @actors;
    my $actor;
    # Actorの数
    my $actor_num = 3;

    if ($buf =~ /<$parent>(.*)?<\/$parent>/s) {
        my $act = $1;
        @actors = ($act =~ /<$child>([^<]*)<\/$child>/gmi);
    }
    if ($actors[0] eq $actors[1]) {
        shift @actors;
    }
    if (@actors >= $actor_num) {
        splice(@actors,$actor_num);
    $actor = join ", ", @actors;
    } elsif (@actors > 1 && @actors < $actor_num) {
        $actor = join ", ", @actors;
    } else {
        $actor = $actors[0];
    }
    return $actor;
}

新たに利用可能になる(?)変数

テンプレートの中で、以下の変数が使用できるようになる・・・かもしれません。

  • $Director: 監督の名前
  • $Actor: 俳優の名前(最大3人まで)
  • $Author: 「監督 / 俳優」

使用例

ハウルの動く城 ハウルの動く城

ブエナ・ビスタ・ホーム・エンターテイメント

注意

  • 動作無保証。
  • にーやんが勝手に改造したものであり、作者の fukazawa さんとは無関係です。

Page 1 of 10: 1 2 3 4 5 6 7 8 9 »