エントリーのランダム表示

MUTTERの右メニューに、エントリのランダム表示を追加してみました。
一応、過去ログからランダムにピックアップされたエントリーが5件表示されています。
この導入に関してメモ。

基本的には、MovableType用のプラグイン、MTRandomEntriesを使用しています。
これをプラグインとして導入することで、ランダムにエントリをピックアップするタグを追加できます。
導入は非常に簡単で、上記サイトからプログラムをダウンロードし、
pluginsディレクトリに入れるだけ。
実際のタグの表記に関してもシンプルで、
<MTRandomEntries lastn=”5″>
<a href=”<$MTEntryPermalink$>”><$MTEntryTitle$></a>
</MTRandomEntries>
と、MTEntries タグの代わりに使うことで、
lastnで指定された数の分だけ、ランダムにエントリが表示できます。
つまり、indexテンプレートに追加するか、
新たにテンプレートを作成し、このタグを入力して保存することで完成です。簡単。
ここまでは初級編。


しかし、このプラグインには、仕様上どうしようもない欠点があります。
というのは、テンプレートに記入すると言うことは、ランダムにピックアップされるのは、
『再構築』を行ったタイミング、ということ。
僕はユーザがアクセスするたびに違うエントリを参照させたかったので、これでは不十分です。
と言うわけで、僕が使ったのは、PHPプログラムを使う方法。

例えば、上で設定したテンプレートの出力ファイル名を、
random.datのように指定します。
そしてある一定数書き出しておいて、それをデータベースのように使います。
実際にテンプレートとして使うのは、このテンプレートではなく、
たとえば以下のような処理を行うプログラム。
$RamdomEntries = array();
$fh = fopen(“/www/ramdom.dat”,”r”);
flock($fh, LOCK_EX);
while(!feof($fh)){
$buf = trim(fgets($fh));
if($buf){
array_push($RamdomEntries,$buf);
}
}
flock($fh, LOCK_UN);
fclose($fh);

for($i = 0;$i < 5;$i++){
$start = $i * 40;
$end = $start + 39;
$rid = rand($start,$end);
print $RamdomEntries[$rid];
}
これはどのような処理をしているかというと…
簡単に言えば、前述のデータファイルの中から、
任意の5つのエントリを書き出している、ということ。
そのために、データファイルの全要素を5つに分け、それぞれから任意のアイテムをピックアップしています。
元のデータファイルのエントリ数が多ければ多いほど、
ランダム性は増すわけで、そのためにこのサイトのデータファイルには、
任意の200エントリが登録されています。
その中から、5つをピックアップして表示しているわけです。
つまり、疑似ランダム表示、ですね。

以上のような手順を踏むことにより、
ランダムの部分を、疑似動的に作成しています。
もしかしたら、MTの動的表示をしているサイトでは、もう少し違った方法で実現できるかもしれませんが…
とりあえず静的表示のサイトではこんなもんではないでしょうか。



追記。【2005-02-11】
ランダムにアイテムをピックアップするプログラムをもう少し短くしてみました。
$RamdomEntries = 0;
$fh = fopen(“/www/mutter/ramdom.dat”,”r”);
flock($fh, LOCK_EX);
while(!feof($fh)){
$buf = trim(fgets($fh));
if($buf){
if((rand(0,200) % 10) == 0){
$RamdomEntries++;
print $buf;
}
if($RamdomEntries >= 5){break;}
}
}
flock($fh, LOCK_UN);
fclose($fh);
ファイルを開いて得たデータ処理の時点で乱数を発生させ、
それがある条件に当てはまっていたら(この場合は10で割り切れたら)表示。
一定数に達したらプログラム終了。
条件が厳しいと、一定数に満たないこともありますが。
まぁ、気持ち、こっちのがシンプルかな、と言うことで。
多分、気分の問題だけど。


エントリ数も2000を超えてしまって、
自分でも読みたいエントリが見つからない、という状況があるので…
これで偶然その時に出会ったエントリを読んでいくのも面白いかな、と思った次第。
興味があったら見てみてください。
(PCの、INDEX/CATEGORY/MONTHLYから見ることができます)


追記(2005.04.01)
詳細な情報をまとめてみました。
良かったら参考にしてください。

エントリーのランダム表示【詳細】