blosxomで動的なページを静的生成させるスクリプトを書いた

Posted at 2009-06-24T12:43:18+09:00 in Blosxom

blosxomで生成される動的なページを静的生成する。

昨日の事なんだけど、今の空繰再繰、無貌断片は表示以外の処理をサーバサイドでしてないから、 なんとか静的生成できないかなぁと考えていて、そうだHTTP::Request::AsCGI使えばできるんじゃね? と思いついたので実際にスクリプトを書いていました。

で、以下が昨日と今日の成果。

blosxom-static.pl

#!/usr/bin/perl

use strict;
use warnings;

our $VERSION = '0.1';

use Getopt::Long;
use Perl6::Say;
use YAML::Tiny;
use HTTP::Request;
use HTTP::Request::AsCGI;
use Path::Class;

my $config_file = q{};
my $request     = q{};
my $output      = q{};
my $version;

GetOptions(
    '--config=s'    => \$config_file,
    '--request=s'   => \$request,
    '--output=s'    => \$output,
    '--version'     => \$version,
) or die "Usage: $0 --config={config}.yaml --request={http://host.name/foo/bar} --output={/path/to/output.html}";

if ( $version ) {
    say "$0 - $VERSION";
}

# -- load configuration file --------- #

my $config = YAML::Tiny::LoadFile( $config_file );

# -- setup blosxom ------------------- #

my $blosxom = $config->{'blosxom'} or die "blosxom path is not specified.";

# -- setup request ------------------- #

my $env = $config->{'env'} || {};

print "request ${request} ...";

my $req = HTTP::Request->new( GET => $request );
my $ctx = HTTP::Request::AsCGI->new( $req, %{ $env } )->setup;

# -- run blosxom --------------------- #

do $blosxom;
die $@ if ( $@ );

# -- get response -------------------- #

          $ctx->restore;
my $res = $ctx->response;

# -- save file ----------------------- #

if ( $res->code eq '200' ) {
    my $body = $res->content;

    my $file = file( $output )->absolute->cleanup;

    if ( ! -d $file->dir ) {
       $file->dir->mkpath or die "Failed to mkpath: $!";
    }

    my $fh = $file->openw;
    print $fh $body;
    close($fh);

    say "generated.";
}
else {
    say $res->code;
}

使い方は上記のスクリプトをblosxom-static.plという名前あたりで保存、 で、下記のようなYAML設定ファイルを用意する。

config.yaml

blosxom: /path/to/blosxom.cgi

env:
  ENV_FOO: value
  ENV_BAR: value
  ENV_BAZ: value

で、あとはスクリプトに実行権限をつけて、

./blosxom-static.pl --config=./config.yaml --request={リクエストするURI} --output={ファイルを保存するパス}

で実行するとステータスコードが200の場合にのみ、 --requestで指定したURIのページが--outputに生成されます。

あとはこのスクリプトを生成したいURI毎に叩いてやればblosxomのページが静的生成されるという寸法です。 あと自分の環境でテストした範囲ではうまく動いてくれましたが、生成するURIによっては環境変数をenv:で指定してやらないと うまく変数が設定されないという場合もあるかもしれません。

で、実際のところ本当は、

variable:
  year:
    start: 2006
    end:   2009
  month:
    start: 1
    end:   12
    format: %02d
  day:
    start: 1
    end:    31
    format: %02d

generate:
  - request: http://blog.nyarla.net/{year}/{month}/{day}/{section}
    path:    /{year}/{month}/{day}/{section}.html

みたいなYAMLファイルを食わせると、総当りでURIを生成して自動的にコマンドを叩くスクリプトを書いてたりしたんですが、 色々試した結果、404になるURIが大量に生成されるとかなんとかでお蔵入りしました。

まあ昨日はURIを総当りで生成する部分まで完成して、blosxomを連続で実行する部分で躓いていたんですが、 今日外部コマンド経由でblosxomを実行することを思いつき、一応完成しました。 が、上記の通り使い物にならなかったので、blosxomを一回実行してページを生成するスクリプトのみの公開となりましたとさ。

あとはまあblosxomの$entries_dir読み込んでURIを手作業で生成するスクリプトでも書いてやればいいかなぁと思ってます。 今はめんどくさくなって書いてないけど。

あと静的生成できるようにしてやればサーバの負荷軽減できてウハウハじゃね?とか思ってたんですが、 静的生成したページを今のURIに配置してやるのが面倒だったり (今のwww以下はSubversionで自動チェックアウトさせてたりする)、 ローカルのサーバ環境でのテストとかめんどくさくなりそうですよししょーな感じなので、 結局このスクリプトもお蔵入りかなぁという感じです。 まあスクリプト書いてたときは楽しかったからいいんだけど、結局徒労に終わってるんじゃね?と思わなかったり。

まあblosxomの動的生成ページを静的生成させたいという場合には上記のスクリプトを使ってみるといいかも知れません。

古い記事に書かれてからの経過時間を表示するようにした

Posted at 2009-02-15T12:56:50+09:00 in Blosxom

この記事は書かれてから○年○ヶ月以上経っています。

このBlogをリニューアルしてたときからやろうと思ってやってなかった過去記事の経過時間の表示をやってみた。

この変更によって、書かれてから一ヶ月以上経ってる記事には

この記事は書かれてから○年○ヶ月以上経っています。

という表示がされると思います。見た目がおかしいときは強制リロードを推奨。

昔に書いたもう旬が過ぎた記事に表示されるのはいい感じ。 が、今の色使いがアレなので書いてから一年も経ってない記事に表示されるとなんか微妙というか。 この辺り改善の余地があるかもしれない。

まあ、それでも過去の記事に警告だせるのはいい感じです。

で、この機能を実現するためにblosxomのプラグインを書いてたりする。 まあ実際にはフレーバーの方でちょっとした処理をやっていて、 このプラグインだけではこのBlogと同じようにはできなかったりするけど。 良かったら使ってみてください。

http://github.com/nyarla/blosxom/blob/ab37e55e39fe586e5d2cdc0fae74c63f62462503/plugins/old

blosxomのプラグインを公開しました

Posted at 2008-11-21T15:52:15+09:00 in Blosxom

blosxomの自作プラグインをCodeReposに公開しました。

もう六日前の話になるんですが、このBlogのリニューアルする時とか、 無貌断片をblosxom化しようとして挫折した時に作ったblosxomのプラグインを、 CodeReposに公開しました。

公開したプラグインはCodeReposのlang/perl/blosxom/plugins以下の

  • chatlog
  • configurable
  • datemap
  • datesection
  • hidden
  • lastmod
  • lastmod_cache
  • micromason
  • pagination
  • quote
  • ttize
  • variable

の12個です。この辺りChangeset 23757を参考にしてください。

ちなみに説明書くのが面倒くさいとか、そもそも自分のためだけに作ったプラグインだからとかそういう理由で、 使い方とか、設定の仕方とか、解説等が書いてない大変不親切な仕様なので、 その辺はまあプラグイン名と設定変数名と実際のコード見て判断してください。

あとプラグインによっては標準じゃないモジュールを使ってたりするので、その辺りは注意が必要かも知れません。

ちなみに。

公開したのが11月15日で、公開してから6日たってるわけですが、何で今更公開エントリを書いたかというと、 単純にBlogを更新しようと思っても書くことが無かったからじゃあ公開エントリを書こうという流れだったり。

リニューアルしてから復活して、モリモリ記事を書きたいなーと思ってるんですが、 書くことが無いんですよね。プログラミングも最近してないし。

まあそれはそれとして、せっかくプラグインを公開したので、何か機会があれば使ってください。

それでは。

追記:2009-09-08T17:25:19+09:00

CodeReposに上げてあったblosxomのプラグインはgithub.comへ移動しました。

使用しているBlosxomのプラグイン

Posted at 2006-10-04T09:32:05+09:00 in Blosxom

hail2u.netのkyoさんが

使用しているプラグインというエントリで、 del.icio.usを利用して、使用しているプラグインをまとめていたので自分もやってみる。

使用しているプラグイン

やってみた感想。非常に疲れました。つーか多いよ。

ちなみに全部で27のプラグイン使っているんですが、del.icio.usのほうは25しかありません。 何でかというとnyarlaxプラグインとnaviプラグインが入ってないから。

ちょこっと説明すると、naviプラグインはこのblog専用のパンくずリストを生成するプラグイン。 もうひとつはnyarlaxはこのblogで使っている記法プラグイン。

ちなみにnyarlaxはPerlを習得し始めて、最初に書いたやつを書き直したり、 追加したりしていて、ややスパゲッティーなので、公開はしていません。 単に記法の説明を書くのが面倒なのもあるけど。欲しい人がいるなら、公開も考えなくもないですが。

あ、そういえばプラグインのリストアップが面倒だったので簡単なスクリプト を書いてました。使い方は見れば分かるような気がします。説明はめどい。

まあこんな感じです。(何が)

ちなみに最近ようやく用事が片付きました。

これで、NyakiWikiの作業を再開できるはず。

Blosxom Plugin : z_plugins_order

Posted at 2006-09-12T14:58:58+09:00 in Blosxom

cho45さんが冬通りに消え行く制服ガールは、夢物語にリアルを求めない。

blosxomというエントリ

引用元:subtechグループ - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - blosxom

ひたすら blosxom の構成決め打ちにしてみよう。 * plugin のオン・オフと編集 * 複数ユーザ管理 あたりがあるとよさげ

とか言っていたので、とりあえずプラグインのオン・オフと読み込む順番を入れ替えるプラグインを即興で書いてみた。

以下プラグインのコード。

package z_plugins_order;
use strict;
use warnings;
# 読み込むプラグインを列挙
my @plugins_order = qw(
    interpolate_fancy
    include_file
    tagging
);
sub start {
    my @plugins = ();
    foreach my $plugin_name ( @plugins_order ) {
        if ( defined $blosxom::plugins{$plugin_name} ) {
            push @plugins, $plugin_name;
        }
    }
    @blosxom::plugins = @plugins;
    return 1;
}
1;
__END__

ライセンスはパブリックドメインで。

使い方は$plugin_dir以下に放り込むだけ。注意としては一番最後に読み込まれるようにしなくてはならないぐらい。 読み込まれる順番は超重要。

ちょこっと解説するとblosxomは@plugins(プラグインからだと@blosxom::plugins)をforeachでまわして プラグインを読み込んでいるので、そこをいじってやると読み込まれる順番だとかをいじれる。 blosxomのコードを読めば大体わかると思う。

追記:2006-09-12T18:40:00+09:00

さっき気づいたけど、このプラグイン、startサブルーチン以降のプラグインの呼び出し順序はいじれるけど、 startサブルーチンそのものの呼び出し順序はいじれない。

startサブルーチンの呼び出し順序を入れ替えるとなると、blosxomをハックするしかないかも。

追記終了

余談。

はじめてトラックバックを打ってみた。

About Me

name
Naoki Okamura
nick
nyarla
contact
nyarla[ at ]thotep.net
Category
Log
Banners
Powered by
nim