Posted at 2009-05-23T10:48:00+09:00 in Blosxom
back_and_forthプラグインではprevで時系列的に古いエントリを、nextで時系列的に新しいエントリを参照していた。そのためAutoPagerizeはSITEINFOをちゃんと書いてやらないと動作しなかった。このサイトをAutoPagerizeへSITEINFOを書かずに対応させるためback_and_forthプラグインを更新して、prevとnextが参照するエントリを逆にしてみた。このバージョンのback_and_forthプラグインに差し替えた上で適切な要素のclass属性にautopagerize_page_elementを加えてやれば、SITEINFOを用意してやらなくてもAutoPagerizeが動作するようになるはず。
既にこのサイトでは稼動させている。が、キャッシュの関係で途中でterminatedになることもある(既に古いエントリを閲覧していた場合にキャッシュが残っていてnextが見つからなかったりするので)。
「prev」と「next」は日本語の感覚で「前」と「次」をイメージすると、今までの参照の仕方のが自然な気がするけど、実際のところはどうなんだろ。ぶっちゃけセマンティクスはまったく考えずにAutoPagerizeへの簡単な対応だけを考えてゴリゴリ書き換えてしまった。HTML 4.01仕様書のLink typesでは「線上に並んだドキュメント(邦訳では、続き物とされている文書群)」としか書かれていないので、その並び方の基準が時系列である(または他の何かである)とは明記されていない。
ここらへんのことは日本語脳で考えるとまずそうなので、海外で有名なフォーラム・ソフトウェアとか色々見てみたところ、多くはnextで古いスレッドを参照しているようだ。時系列的にnextとは捉えておらず、ページ的にnextみたいな捉え方をしている。対してAnne先生のサイトなどではnextで時系列的に新しいエントリを参照するようになっている(今までのこのサイトの挙動と同じ)。Web標準界隈のサイトはこっち系のが多いような印象(20くらいのサイトしか見てないけど)。
戻したくなった。戻すかも。戻す時にはSITEINFOちゃんと書こう。
AutoPagerizeへの対応関連とは関係ないが、他にXHTMLで出力するかどうかを選択できるオプション設定とかもさりげなく追加しておいた。link要素の出力の時に参照される。
戻した。SITEINFOを書きたくないがために……というのは理由として貧弱すぎる。十分納得した上での変更なら良いと思うけど、かなり軽い感じで変更してしまったので元に戻してもうちょっと考えてみようと思う。とはいってもAutoPagerizeへは対応したいので、SITEINFOを書いてデータベースに追加しておいた。
ページによって辿って貰う対象を制御してやるためにautopagerize_follow_locationというクラス名を割り振ることにし、エントリ個別のページではrel="prev"なa要素に振り、ウェブログのトップやカテゴリごとのページの場合はrel="nextなa要素に振った。AutoPagerizeのキャッシュをクリアして、ざっと確認したところ意図したとおりに動いている模様。
Posted at 2009-04-03T23:01:00+09:00 in Blosxom
盛大に乗り遅れたGitブーム(に見える)を追いかけて、GitHubを使って今まで書いたblosxomのプラグインを晒しとくことにしました。手を加えてあるinterpolate_fancyやwritebackとかが加わってるforkリポジトリが既にあったりするのでこっちもどぞ。blosxom starter kitも一応ある。一応とか。
一応はメンテナンスの場所ということなんだけど、それ兼、手軽にblosxomのプラグインのコードを閲覧できる場所みたいな感じで。特に新しいプラグインが追加されているとかそういうことは無い。
さりげなくblosxom 3のプラグインもまとめて置いておく。blosxom 3の本体見つけるの大変だけど、興味ある方はどうぞ。「blosxom 3の続きを作ろう!」とか考えていた時期もありました。
このblosxomプラグインのリポジトリ作ったら10分くらいでRaelたんからGitHubでメッセージ来た!!!
ここ数日でキーボードの「G」「I」「T」が磨り減った気がする。
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要素を追加するとかが良さそう。
スタイルシート スタンダード・デザインガイド―SEO/ユーザビリティ/アクセシビリティを考慮した実践的HTML&CSSデザイン術
Powered by Asamashi09.
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-09-20T04:02:00+09:00 in Blosxom
はてなブックマークエントリー情報取得APIを利用して、blosxomのエントリ個別ページにはてなブックマークでそのエントリに付けられたコメントを引っ張ってこようとかいうネタ。blosxomでの話ということになっているけど、実装自体はほぼPure JavaScriptなので、どんなページにも応用できるはず。
プラグインは特に必要は無い。プラグインにする必要も無いとも言える。必要なのはflavourへのコードの追加とJavaScriptファイル。
<script type="text/javascript" src="/scripts/prototype.js"></script> <script type="text/javascript" src="/scripts/hatena/bookmark.js"></script>
prototype.jsが必要。インクルードするだけ。
<?$path_info like="\.html$">
<div class="story" id="comments">
<h3>Comments</h3>
<p>JavaScriptに対応または有効な環境の場合、ここに<a href="http://b.hatena.ne.jp/">はてなブックマーク</a>でのこのエントリに対するコメントが表示されます。</p>
</div>
</?>
interplate_fancyが必要。$path_infoを利用して、エントリ個別ページかどうかを判別し、そうだった場合にコメントを流し込むためのノードを作っておくという感じ。
bookmark.jsのみ。ソースが全てを物語る。はてなブックマークエントリー情報取得APIに対して一回リクエストすれば良いだけなので、単純な実装にした。HTMLの出力もinnerHTMLでガンガンぶっこんでいく形(今のところは)。
細かいことはあとで書く。かもしれない。とか書いておく時は大抵書かない。
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]$にマッチしないなら表示される。</?>
などといった条件比較も可能。更に、他にインストールしているプラグインのサブルーチンを呼べたりとかもする。
以下に具体的な利用例を挙げてみる。
この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プラグインと組み合わせることによって、最初のエントリの場合は概要まで表示しエントリ全文へのリンクを追加、それ以外の場合はタイトルをリストで並べるという形を実現している。
特定のエントリということを判断させるために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が表示されていますが、どうやってるんですか?」というメールでの質問への返事がてら。
例えば、
などということを実現するために利用できます。
こういったアサマシ用途以外にももちろん使い道はあります。interpolate_fancyがインストールされているならば、$push_if_first::is_firstという最初のエントリの出力が終わっていない場合のみ1を返す変数を利用すれば、「最初のエントリは全文表示だが、残りはpermalinkへのリンクが張られたタイトルとのみ」とかいうことも可能です(多分)。
Dummy element for AutoPagerize.