はてなダイアリーライクなブログ CGI プログラム
Perl のことを CGI って呼ぶような時代がいつ終わったのかは知りませんが、CGI で動き常用できるブログ・ダイアリーシステムが欲しいと思いはじめたのでサクっと Perl で書いてみました。
「常用できるブログシステム」の要件というのは、僕にとっては以下の通りで、必要最低限の実装になっています。
- その場編集機能が使える
- はてな記法が使える
- でも自動リンクは特にいらない
- タグが使える
- はてなダイアリのカテゴリは所謂タグです
今まで散々 blosxom のクローンを作ってきましたが、RDB をデータストアに使ったブログシステムは初めてつくる気がしました。blosxom クローンとの違いは編集機能ですね。
git clone して git submodule update --init して対象サーバに rsync すれば動くようになっていると思います (そのように開発をしているので)
その場編集
jQuery と JSDeferred つかったらすぐできました
はてな記法
Text-Hatena があるので簡単…… と思いきや、Text-Hatena はちょっと思い通りにフォーマットしてくれないので、はてな記法っぽい別のオレオレ記法をつくることにしました。
別に拡張してるわけじゃないので X は変なんですが、とりあえず CPAN に上げるつもりもないので保留してます。Extensible の略だ、とか言い張ったりできないかな
にした
内容的にはダイアリの記法とほぼ一緒ですが、自動改行のルールが異なるのと、見出し記法を構造化するような感じになっています。(互換モードにできるようにもなってます)。あと自動リンクの記法はモジュール側では最低限に自動リンク、使う側で定義するような設計になっています。
バックエンド実装のメモ
前々からちゃんと使ってみたかった DBIx-Skinny と、フレームワークを毎回書くような人間に死ぬほど便利な Plack を利用しています。
Skinny はとりあえず的なインクリメンタル開発がやりやすいし、基本的に SQL そのまんま書いてどうにかできるのがとても楽で良かったです。データベース接続部分に不明瞭な部分がないので、恐れずにテストも書けるのもよかったです。
僕はちょっとでも複雑なものは search_named しか使わないようにしたので
sub select {
my ($self, $sql, $hash, $array, $name) = @_;
unless ($name) {
($name) = ($sql =~ /FROM ([^\s]+)/i)
}
[ $self->search_named($sql, $hash || {}, $array || [], $name) ];
}というのをモデルクラスに定義してつかってます。風流な table 名抜き出しが入っていますが、結局 SQL 書くのがこの場合僕だけなので理にかなってます。
他にも Pager 実装とかをするにあたり、なかなか風流な SQL の文字列置換を実装しましたが、メタプログラミングだと思えば気持ちわるくありません (という言い訳しないといけない程度に気持ちわるいです)
あとは deploy したかったサーバの Perl のバージョンが 5.6 とか古すぎで動かなかったので新しいサーバを借りなおしたりしました。これが一番大変でした。