Weblog - Blosxom
Posted at 2006-10-05T00:19:00+09:00 in Blosxom
かなり前に書いた不明なflavourというエントリで紹介したパッチは概ねうまく機能しているのだけど、検索エンジンなどで意図しないURLが検索結果に出てきてしまうことがあるという問題が。通常は多くのページでリンクを張られている.htmlで終わるURLの方が圧倒的に強く、Web全体からの検索などではあまり問題にならないが、サイト内検索などではかなりゴミとして目立ってしまう。ので、redirectif_noflavourを使い、存在しないflavourの場合は.htmlで終わるURLにリダイレクトさせることにした。
redirectif_noflavourはflavourが見つからなかった場合、設定で指定したflavourのURLに302 Foundでリダイレクトさせるというプラグイン。301 Moved Permanentlyを使いたかったり、設定させなくても$blosxom::default_flavour使えば良さそうと思ったので、
# Blosxom Plugin: redirectif_noflavour
# Author(s): motormean, Kyo Nagashima <kyo@hail2u.net>
# Version: 2006-10-04
# Blosxom Home/Docs/Licensing: http://www.blosxom.com/
package redirectif_noflavour;
use strict;
# --- Configurable variables -----------
# --- Plug-in package variables --------
# --------------------------------------
sub start {
1;
}
sub skip {
my $path = $blosxom::path_info;
do {
return 0 if -e "$blosxom::datadir/$path/story.$blosxom::flavour";
} while ($path =~ s/(\/*[^\/]*)$// and $1);
$path = $blosxom::path_info;
$path =~ s/\..+?$/.$blosxom::default_flavour/;
$blosxom::header->{-status} = '301 Moved Permanently';
$blosxom::header->{-Location} = "$blosxom::url/$path";
$blosxom::output = '';
return 1;
}
1;
と、少しだけ改造した。自前でflavourを漁らなくても何とかなりそうな気はする。けどコード考えるのがめんどくさい。303 See Otherのが良いかな?微妙だ。移動させたわけじゃないから303 See Otherのほうが妥当かもしれない。
こういうケースは404 Not Foundでももちろん良いと思う。というか本来は404 Not Foundであるべきなのだけど、301 Moved Permanently(などのリダイレクトするHTTPステータスコード)を使った方が訪問者を逃さないので、サイト・オーナー的にはプラスだと思う。訪問者にも(多くの場合は)プラスになるはず。
redirectif_noflavourは使いたくないけどerror flavourなページを検索エンジンに拾わせたくないなどという場合は、blosxom.cgiの最後のに書いてあるerror flavourの定義に、
<meta name="robots" content="noindex, nofollow" />
といったロボット対策のmeta要素を追加するとかが良さそう。

- エ・ビスコム・テック・ラボ
- 毎日コミュニケーションズ
- 2004-06
- ¥ 2,730
Posted at 2006-09-29T15:27:00+09:00 in Blosxom
43 Foldersの中の人がWordpressで使用しているプラグインをdel.icio.usでwordpress+pluginsiuseというタグを付けることによってまとめていた。簡単なコメントも付けられるし、URLの変更なんかの修正も簡単でメンテしやすそう。ということで真似して、このblosxomで使っているプラグインをまとめてみた。
他に同じことをやってくれる人が多数いると仮定すると、tag/blosxom+pluginsiuseを見れば、
- どんなプラグインが人気かわかる
- コメントを見ればプラグインの逆引き的に使える
- 新しいプラグインが追いかけやすい
- 未知との遭遇
とか便利そう。blosxomはユーザーの絶対数が少ないので、そううまくはいかないと思うけど。
また、JSONPで引っ張ってこれるので、サイドバーに使用しているプラグインの一覧を載せるとかもやりやすい(delicious-pluginsiuse.jsを参照)。blosxomのプラグインでプラグインのリストを作ってくれるものがあったと思うけど、del.icio.usを使った方がメンテナンス性が高そう。事情があって公にしたくない使用中のプラグインは投稿しなければ良いだけとか、そこそこ柔軟にやれそうだし。
Posted at 2006-08-29T06:31:00+09:00 in Blosxom
sucleさんのところからzogさんなる方のところへ移動していたblosxomサイトの日本語訳をall about blosxomのドメイン配下へ移動させてもらった。それだけ。zogさんのところ(routes.jp配下のもの)は消えるかもしれないので、リンクを張っている方はこちらに直すと良い気がする。
業務連絡終わり。
ぶろっさむねいるの方もちょっと変更した。SimpleAPIのウェブサイト・サムネイル化ツールを使おうかと思ったのだけど、404じゃないのに404の画像ばっかになってしまったので自前でサムネイルを作り直した。サムネイルに載りたいblosxomユーザーはUserListの方へ追加してくれれば、そのうち反映されるはず。
Posted at 2006-08-27T13:14:00+09:00 in Blosxom
手軽にblosxomのflavourシステムを強化することが出来るようになるinterpolate_fancyプラグインについて今さら書いてみようかとか。本当に今さらすぎて笑えない。今さらとはいえ、blosxomのflavourシステムを強化するプラグインとしてはこれくらいしか選択肢はないので書いておいても損ではないはず。
少し前にもちょっとだけ使い方を書いたけど、文字数稼ぎ興味を持てずに飛ばしてしまった人のために簡単に使い方を説明してみる。基本は、
<$foo /> = $foo
<?$foo>$fooがdefinedなら表示される</?>
<!?$foo>$fooがundefinedなら表示される</?>
の3つで、これらに加えて、
<?$foo eq="1">$fooが1なら表示される。</?>
<?$foo ne="1">$fooが1でないなら表示される。</?>
<?$foo lt="1">$fooが1より小さいなら表示される。</?>
<?$foo gt="1">$fooが1より大きいなら表示される。</?>
<?$foo like="^[a-z]$">$fooが正規表現^[a-z]$にマッチするなら表示される。</?>
<?$foo unlike="^[a-z]$">$fooが正規表現^[a-z]$にマッチしないなら表示される。</?>
などといった条件比較も可能。更に、他にインストールしているプラグインのサブルーチンを呼べたりとかもする。
以下に具体的な利用例を挙げてみる。
permalinkではタイトルにリンクを張らない
このblogのように、$path/$fn.htmlという形のpermalinkを採用している場合は、$path_infoが.htmlで終わっているかどうかを調べることによってpermalinkかどうかを判断できる。つまり、
<h3>
<?$path_info unlike="\.html$">
<a href="/blog$path/$fn.$default_flavour" title=""$title" への恒久的なリンク">
</?>
$title
<?$path_info unlike="\.html$">
</a>
</?>
</h3>
というような書き方(見やすいように改行を入れている)をしてやれば、permalinkではタイトルにリンクが張られなくなる。else系の条件分岐が無いのでくだくだしい書き方。
文字列を保護する
blosxomのinterpolate()の仕様上、$yr-$mo_num-$daT$ti:00とか書いた場合、意図した通りに表示されない。しかし、適当な変数名を利用して、
$yr-$mo_num-$da<?$yr>T</?>$ti<?$yr>:</?>00+09:00
と、書くことができる。こうすると「T」や「:」が保護されるので、きちんと意図した通りに表示される。バッド・ノウハウ。
簡単な条件分岐を利用して都合よく体裁を整える
このサイトのトップ・ページに表示している最近のエントリ一覧を実現しているjs flavourで利用してたりします。story.jsの中身は、
<?$push_if_first::is_first eq="1">
document.write('<h4><a href="$url$path/$fn.$default_flavour" title=""$title" への恒久的なリンク">$title</a></h4>');
document.write('<p class="date">Posted at $yr-$mo_num-$da<?$yr>T</?>$ti<?$yr>:</?>00+09:00 in <a href="/blog$path/" title=""$categories::name" 関連のエントリを閲覧する">$categories::name</a></p>');
document.write('<p>$rss::excerpt</p>');
document.write('<p class="seemore"><a href="$url$path/$fn.$default_flavour" title=""$title" の全文を読む">» Read full entry</a></p>');
document.write('<ul>');
</?>
<?$push_if_first::is_first ne="1">
document.write('<li><a href="$url$path/$fn.$default_flavour" title="$title Posted at $yr/$mo_num/$da ($dw) $ti in $categories::name">$title</a></li>');
</?>
と、push_if_firstプラグインと組み合わせることによって、最初のエントリの場合は概要まで表示しエントリ全文へのリンクを追加、それ以外の場合はタイトルをリストで並べるという形を実現している。
特定のエントリではwritebackを禁止する
特定のエントリということを判断させるためにmetaプラグインが必要になるが、作業的には面倒ではない。まず、writebackのフォームを表示しているstory.htmlなどで、
<?!$meta::nowriteback>
<form ...>
...
</form>
</?>
といったように、writebackのフォームをくくる。その上で、その特定のエントリに、
meta-nowriteback: 1
と書いておけば良い。metaプラグインはエントリに対してメタ・データを付与できるプラグインなので、こういったケースでもわかるようにinterpolate_fancyプラグインとは相性が良い。
禁止するというかフォームを表示させないだけ。指定の日数すぎたらwritebackを禁止するとかいう場合は、プラグインを書かないとならない(と思う)。例えば、現在の時間とエントリの時間の差を秒数で取得し、変数に格納するだけのプラグインをつくり、ltでその指定の日数を秒に変換した数字(30日なら2592000)と比較とか。
基本的には他のプラグインとうまく組み合わせてやると力を発揮するプラグインだと思う。また、逆に他のプラグイン側も条件分岐をinterpolate_fancy側に任せたりすることも可能なので、プラグインが多少書きやすくなる。これがデフォルトのinterpolate()だったらなぁ・・・とかは思っていても口に出してはいけない。
Posted at 2006-08-26T06:20:00+09:00 in Blosxom
Markdownが微妙に誤作動したりとか、実はあまり書きやすくはない(読みやすいけど)とかいうことに気づいた一年半ほど前に、Wiki記法に近いけど空行をマークアップのトリガにする形のufyuというフォーマッタを作った。特に小難しいことはしていないので、出来ないことは出来ないし、出来ることは出来るみたいなアレですが、まぁそこそこ使い勝手は良い(自分の好みで作ったから)ので、このblogを書く時に使ってたりします(アップロードするときにHTMLに変換しちゃうけど)。名前の由来はかなり秘密。今考えるとかなりサムイ。
blosxomのプラグインということに(コード的にも)なってますけど、実際に自分ではそういう形では使ってないので動作の保障はしない。プラグインのロードされる順番などパッと思いつく問題がいくつかあるし。僕はrun.plという標準入力からテキストを読み標準出力にHTMLを吐くラッパー・スクリプトで常用している。こちらの方の動作は大体保障。
Lorem Ipsumなのでちょっと読みづらいけど、test.txtのような感じでかなりテキトウに書けちゃうと思う。一般的なメールの書き方で書くことができることに加えて、Wikiっぽい記法ルールが少しあるという形。気を付けるのは空行がとても重要だということで、そこがちょっと自由さに欠けていてアレだと思う。読みやすさは折り返し表示が出来るエディタならそこそこ(私見)。書きやすさの上でも読みやすさの上でも、適当なところ(72文字目とか)で改行されただけ(空行は挟まない)の場合は、良きに計らえちゃったりしたら良いかなとは思う。
唯一に近い設定は$anchor_setsで、これは[[mode:text:param]]という形式で書くリンクを作成するための定義。例として、
my $anchor_sets = {
a => '%s',
google => 'http://www.google.com/search?ie=UTF-8&lr=&q=%es',
amazon => 'http://www.amazon.co.jp/exec/obidos/ASIN/%s/hail2unet-22/ref=nosim',
cpan => 'http://search.cpan.org/search?module=%s',
};
と作ってあるけど、わかりづらい。%sはparamそのままで、%esはparamをURLエスケープするよとかそんな感じ。amazonモードを使いたい場合は、
[[amazon:Hoobastank - Every Man For Himself:B000EXO9YG]]
と書くと、
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000EXO9YG/hail2unet-22/ref=nosim">Hoobastank - Every Man For Himself</a>
となる。定義は一応無限なので何でも作れる。ただ、自分のサイトとリンクを張る先のサイトとの文字コードの違いが吸収できないという欠点が(今気づいた)。
typesterさんがPerlのモジュールとしてText::Ufyuとか作ってたりとかも。もう使ってなさそうだけど。単純なループと正規表現で出来ているので、$anchor_setsをJSONかなんかにすればJavaScriptにもすぐ移植できそう。
Posted at 2006-08-21T07:31:00+09:00 in Blosxom
SourceForge.netで開発・公開されているblosxomは現在2.0.2になっています。一応、こちらも公式なもの。一応っていうのもヒドイ言い様だ。Raelさんから開発を引き継いだということになっているので、文句無く公式なもの・・・一応(アレ?)。まったく追いかけていなかったので、どんな感じか確認するついでに、all about blosxomの方へBlosxomAtSourceForgeというページを作っておいた。SourceForge.netで公開されているblosxomを使っている人は、気づいたことなんかがあったら書いてくれるとうれしい。
そこそこ手を入れられていますが、多くは静的生成における問題点の解消のようで、動的生成で利用している人にはあまり関係ないかなという感じ。ビルトイン・フレーバーを改行を利用して見やすく書くことができるようになってたりとかするのはちょっと良いかなと思うけど、多くの場合はそんなところを見もしないわけで。
元々blosxomにはこれといったバグはなく、大幅に手を入れるきっかけがないんだろうなと思う。UIとか多くの人が不満を持ちやすく、そして手を入れやすい部分が元々存在しないことなんかも手を入れるきっかけがないことの理由のひとつかも。挙動的にはほぼパーフェクトと感じているユーザーがほとんど、そしてちょっとした不満ならばプラグインでほぼどうにでもなると思うので、そういった点でも手をいれにくそう。
パフォーマンスの面で改善の余地がもちろんあるのだろうけど、そこに手を入れるとなるとフラット・ファイルがデータベースなことが問題視されてしまうと思う。フラット・ファイルじゃなくなったら、互換性が保たれたり変換ツールが登場しようと、それはもうblosxomではないと多くの人が感じるだろうから、ここにはどうしても手は付けられない。
むしろ思い切って静的生成を削除したものを公開しても面白そうかなとか思った。あくまでもブランチとしてだけど。そしてそれをベースに変数の拡張(デバッグに使える変数とか欲しい)などを中心にガリガリいじってみようみたいな。静的生成は動かすOSの問題とかが表面化しがちなので開発しづらいし。開発MLに投げてみようかな。投げるだけならタダ。
blosxom starter kitをSourceForge.netで配布されているものをベースに作り直すという予定は今のところない。多分そのまんま差し替えるだけで良いと思うのだけど。
英語化しようとしたのも今となっては「それいつの夢?」みたいな。
Posted at 2005-10-16T14:19:00+09:00 in Blosxom
二ヶ月ほど前にでっち上げた、最初のエントリにだけデータを追加できるようにするpush_if_firstというプラグインをblosxom pluginsで公開しておきました。「最初のエントリだけにGoogle AdSenseが表示されていますが、どうやってるんですか?」というメールでの質問への返事がてら。
例えば、
- Google AdSenseを最初のエントリの後にだけ表示する
- Amazonアソシエイトの商品紹介バナーを最初のエントリの後にだけ表示する
- A8.net(以下略
などということを実現するために利用できます。
こういったアサマシ用途以外にももちろん使い道はあります。interpolate_fancyがインストールされているならば、$push_if_first::is_firstという最初のエントリの出力が終わっていない場合のみ1を返す変数を利用すれば、「最初のエントリは全文表示だが、残りはpermalinkへのリンクが張られたタイトルとのみ」とかいうことも可能です(多分)。
Posted at 2005-09-30T20:54:00+09:00 in Blosxom
pagingにより生成された各ページは、当然ですが、コロコロ中身が変わります。つまり中身の保証がないので、検索エンジンにインデックスして貰いたくないページであるとも言えます(多くの人には)。というわけで2ページ目以降、つまりpage=2とかパラメータが付く場合はmeta要素でロボット除外を指示するようにとかいう機能を追加してみました。
head.htmlなどに$paging::meta_robotsと記述することによってロボット除外meta要素が出力されます。なので、$paging::meta_robotsをflavourに記述しなければこれまでどおりの動作です。
なお、ロボットの巡回による負荷への対策にはなりません(多分)。巡回による負荷対策はrobots.txtでやった方が良さげというか、robots.txtじゃないとムリそう。ページングのナビゲーションのa要素のrel属性にnofollowを追加するとかだといけるかも?
ついでにXHTMLで出力するかどうかも設定可能にしておいたり。
バグ報告や機能改善要望、機能追加要望は、BBSやMLなどでお気軽にどうぞ。
Posted at 2005-09-29T01:40:00+09:00 in Blosxom
blosxomのflavourでエントリの日時は$yrや$tiなどの組み合わせで表現します。エクスプローラなどでよくある形の日付形式(yyyy/MM/dd HH:mm:ssとか)に沿った形で表現しようとすることは簡単(というかそのまんま)なわけですが、W3CDTFに沿った形で表現しようとなると年月日と時刻を区切る文字(T)の出力のためにプラグインを書かないと・・・という感じでした(現にatomfeedではプラグイン側での実装になってます)。が、(X)HTMLやXMLのflavourならば文字参照を利用すれば良い話なんじゃないかとか。
具体的には、
$yr-$mo_num-$daT$ti:00+09:00
というように、Tや:を文字参照で表現してやるということ。W3CDTFは(X)HTMLやXMLで利用することが多いと思う(私見)ので、文字参照で逃げるこの方法で大抵の場合はカバーできそう?
ただ、
2005-09-28T19:10:00+09:00
と、
2005-09-28T19:10:00+09:00
が等価かどうか浅学にして(とか書くと感じ悪い)良くわかっていないので、マズイのかもしれない。もし等価でないとすると、巷のフィード・リーダーが解釈できなくて当然ということになるので、dc:dateの値やなんかには利用しない方が無難だとは思います。
Weblog archives
by Month
- October, 2006 (9)
- September, 2006 (23)
- August, 2006 (31)
- July, 2006 (8)
- October, 2005 (13)
- September, 2005 (24)
- August, 2005 (26)
- July, 2005 (2)
- June, 2005 (2)
- May, 2005 (13)
- April, 2005 (30)
- March, 2005 (33)
- February, 2005 (13)
- January, 2005 (10)
- December, 2004 (28)
- November, 2004 (27)
- October, 2004 (25)
- September, 2004 (38)
- August, 2004 (52)
- July, 2004 (45)
- June, 2004 (41)
- May, 2004 (48)
- April, 2004 (36)
- March, 2004 (51)
- February, 2004 (55)
- January, 2004 (63)
- December, 2003 (46)
- November, 2003 (63)
- October, 2003 (92)
- September, 2003 (61)
- August, 2003 (93)
- July, 2003 (57)
- May, 2003 (5)
- April, 2003 (35)
- March, 2003 (35)
- February, 2003 (37)
- January, 2003 (62)
- December, 2002 (32)
This page was last modified on 2006-10-05T00:19:24+09:00 (in 0.116 secs).