イモヅルシキ(imozuru-shiki 芋づる式)

イモヅルシキとは、過去に書いた記事(ブログでいうエントリー)の続きを書きたいと思った時に、今から書く記事と過去の関連記事とを相互リンクで結ぶ機能です。 相互リンクは鎖のように結ばれていくので、ひとつの話題があって、それに関連する記事が不連続で存在する時にとても役立ちます。 カテゴリやキーワード検索よりも有機的で判りやすいまとまりを閲覧者に提供できます。

概念

まずは[A]という記事を書いたとしましょう。 つぎに[A]の内容とは関係の無い[B],[C]という記事を書いたとします。 次に[A]ととても関連する記事[D]を書くことになりました。 この時に[D]から[A]にイモヅルシキを適応すると、[D]と[A]は相互リンクとなります。 更にその後に、[D]と関連がある[H]という記事を書くことになった時に、[H]から[D]にイモヅルシキを適応すると[H]と[D]は相互リンクになります。

実はここまではローカル版のトラックバックに過ぎません。 イモヅルシキはここからが少し違います。 上記の例で言えば、[H]のイモヅルシキによる関連記事の一覧をリクエストした時に、[D]と[A]へのリンクが表示されます。 ポイントは、[H]は[D]にしかイモヅルシキを仕掛けていなくても、[D]と[A]へのリンクが一覧の中で表示されるということです。

すなわち、またその後に[H]に関連する記事[M]を書いて、[M]から[H]にイモヅルシキを適応すれば、[M]の関連記事の一覧では[H]と[D]と[A]が表示されるということになります。 イモヅルシキは適応したリンク先のページが別のページにイモヅルシキを適応しているかどうかを調査して、イモヅルシキの連鎖をリスト化します。

実装例

能書き

イモヅルシキはとりあえずローカルでの利用しか考えていません。 他所のサーバのエントリーと連携することは不可能ではないですが、風呂敷を広げすぎてトラックバックよりややこしいシステムになるのはなんとなく嫌なので。 他所の記事とはトラックバックで、ローカル記事の相互リンクはイモヅルシキでという使い分けが理想でないかと。

仕込み

さて、まずは仕込みですが、非常に単純です。 たとえば、記事を書く時にタグが許可されているフォームなら件名か本文のどこかに
<!--no:記事番号A--><!--rel:記事番号B-->
を入れてやります。 本当にどこでもいいのですが、後の説明のためにとりあえず件名の前後にくっつけることとしましょう。 タグを許可するのが嫌な時はフォームのパラメーターを新設してください。
例)
entry name:
記事番号Aというのは今まさに製作中か編集中の記事の番号。 記事番号Bというのはリンクをする相手先の記事番号のことです。 過去の関連記事がなければ、記事番号Bの部分はありません。 記事番号はその記事を特定できる固有のIDであればいいので数字でなくてもかまいません。

ここでの注意点は、とりあえずイモヅルシキは新しい記事から古い記事に一方通行で適応されなければなりません(詳しくは後で説明)。

以上で仕込みは終了です。

Perl スクリプト

sub imozuru {
	my ($id) = @_;
	my @client = ();
	my @relation = ();
	my $flag = 0;
	foreach (@article) {
		if ((!$flag) && ($_ =~ /<!--rel:$id-->/i)) { push(@client,$_); }
		elsif ($_ =~ /<!--no:$id-->/i) {
			push(@relation,$_);
			if ($_ =~ /<!--rel:(.+)?-->/) {
				$id = $1;
				$flag = 1;
			} else {
				last;
			}
		}
	}
	shift @relation;
}

$idはイモヅルシキの一覧をリクエストするベース記事の記事番号です。 @articleは記事を新しい順に並べた配列です。 @articleの中身はローカル上の全記事が配列化されているべきでしょう。 方法はなんでもいいのでなんとか配列化しておいてください。 前出の仕込みが入っていれば、@articleのスカラー変数は仕込み部分だけでも件名付きでも全文でもかまいません。 件名を付けておけば、すぐにリンクアンカーにすることができるかと思います(さっき、件名の前後にくっつけることにしようと言ったのはこのため)。 最後にshiftで先頭を抜くのは、それがイモヅルシキの一覧をリクエストしたベース記事そのものだからです。

これで@clientにはベース記事を参照している記事が配列化され、@relationの中にはベース記事が参照する関連記事が芋づる式に配列化されました。 あとはパーマリンク(各記事固有ページ)を書き出すの際にHTMLに整形して出力すればOK。

ところで@clientなんですが、ベース記事より後に書かれた若い記事は芋づる式に格納していくことはできません。 ベース記事を直接参照しているならすべて格納しますが、ベース記事のその後のその後は格納しません。 サーバの負荷を無視できるなら、@articleをreverseすればこちらも芋づる式にできるでしょう。

配列@relationの中身の例)
<!--no:31-->料理は上手らしい細木数子<!--rel:19-->
<!--no:19-->細木数子が予言に失敗したよ!<!--rel:18-->
<!--no:18-->六星占術って当たるの?

もし記事1件1件が独立したhtmlファイルであるなら

この場合は記事を配列化するとか<!--no:記事番号A--><!--rel:記事番号B-->を挿入するとかじゃなくて、head要素内の
<link rel="prev" href="">
<link rel="next" href="">
を活用したほうがいいかもしれません。 TrackBack Technical SpecificationのAuto-Discovery of TrackBack Ping URLsを応用すれば、htmlファイルの中から目的の文字列を抜き出すことができます。

削除時の注意点

イモヅルシキは数珠つなぎとなっている関連記事の途中の1件がなんらかの事情で削除されてしまった時に数珠つなぎが途切れて関連記事のまとまりがふたつに分断されてしまいます。 これを防止するために、記事を削除する時に前後の関連記事を割り出して、削除された記事がなくなっても数珠つなぎが維持できるように修正してから削除する必要があります。

なぜイモヅルシキは新しい記事から古い記事に一方通行でなければならないのか?

これは数珠つなぎがループしないようにするためです。 @relationにpushする時、すでに配列化されているかどうかを調べて重複する記事は配列化しないようにすればこの問題は避けられるでしょう。 リストの時系列がバラバラになるとしてもソートができるならそちらも問題はないかもしれません。

イモヅルシキは関連記事を1件しか指定できないの?

スクリプトを工夫すればいくつでも指定できます。

モジュール化はできますか?

できます。 前出の
<!--no:記事番号A--><!--rel:記事番号B-->
を別途用意したファイル(たとえば imozuru-shiki.dat)に順に格納していけば配列化の作業も省けます。 スクリプトを外部に出せば、ブログ(あるいはBBS)本体の改造は「require './imozuru-shiki.pl';」と「&imozuru-read($no);」と「&imozuru-write($no,$relno);」の3行を適切な場所に書き足すだけ、なんて具合にできるはずです。

余談

イモヅルシキはMotoharu News Networkで2004年5月24日から稼働していて、個々の記事ページを表示した時に「この記事に関連するその後の記事」「この記事に関連する過去の記事」という形で一覧を表示しています。 どんな風に使われているのかをぜひ実際にご覧ください。

イモヅルシキの開発のヒントとなったのはシックスアパートのトラックバック機能や関心空間のつながり機能です。 「トラックバック」の思想は非常に素晴らしいと思ったのですが、実装方法や最終的なブラウザ出力などでしっくりこなかったので「自分ならこうする」という感じでプログラムを書きました。 結局あとからトラックバックやカテゴライズなどのブログスタンダードもMNNに入れたのですが、MNNの場合は非常にうまくこれら機能とイモヅルシキの住み分けができています。

改良・再配布について

イモヅルシキはコピーレフトです。
Copyleft imozuru-shiki, all rights reversed.


初出 2006年5月5日

Motoharu News Network