1. としきのやしき正門
  2. 電算棟
  3. 板塀(掲示板)の手入れ(改造)
  4. RSS配布

RSS配布

私はここの掲示板を、かつてのTTY時代のニフティのフォーラムの電子会議室のように運用しようと思っております。
と思いつつも、最近の流行を追いかけたいという気持ちもちょっとだけあったりなんかして。すなわち、板塀の「ブログもどき」化です。その第一歩として、永続的URL対応やらトラックバック受信対応なんていうものを提案してみたこともあります。ただ、これのためにはドメイン取得などが必要であり、自宅サーバでちまちまと運用しているような人間にとってはちょっとだけ敷居が高いのでペンディング。ニフティのCGIサーバなんかに移転すればすぐに解決する問題なんですけどね。

より一層の「ブログもどき」化を推し進めるにあたって検討してみたのが、新着情報のサマリーのRSSによる提供。これ、ほとんどのブログはもとより、大手掲示板サイトであるteacupでも提供されています。噂によると、msnだかどこだかの検索エンジンでは、検索結果のサマリーが提供されているようなのですが、これはどういった使い道があるんだろう。

もともとこの掲示板では、新着記事を表示する機能があります。また、日本ではINCMといった掲示板閲覧ツールがある程度普及しており、これ用の改造を行っても新着情報の提供機能が強化されます。が、あえてRSSを用いる理由というと、やはりこれは、世界的に広く普及している、ということ。

ただ、この機能の実装にあたって考慮しなくてはならない、仕様上の重要な問題が一つあります。それは、単に発言の新しい順にサマリーを提供すればよいのか、ということ。実際、teacupはこの方式ですよね。
でも、多くのブログでは、仮にブログをブロガー自身の記事をルートとするツリー式掲示板と見たてた場合、ルートの発言のみサマリーが提供される形になっているわけです。そして、ここはツリー形式の掲示板なので、多くのブログと同じく、ルートの発言のみサマリーを提供するという方法もありうるわけです。そして、この方式を採用しているツリー形式の掲示板も実際に存在しています。

ただ、一般的なブログとこの掲示板とで大きな違いがいくつかあります。最も大きな違いは、ルートの発言は必ずしも掲示板管理者ではないことがありうる、というもの。また、多くのブログでは、ブロガー自身の記事は日付順に並ぶため、必然的にサマリーも日付順に並びます。しかし、この掲示板では、ツリーに新規発言があるとそのツリーがトップになるように設定してあるため、仮にルートの記事を並べても日付順にはならない、という違いもあります。もっとも、こちらは単に設定の問題ですから、設定を変えるという選択肢もあるのですが。

ここまででウダウダと仕様の検討を行ってきていますが、では実装にあたっての難しさはどうなんだというと、これは実は大したことはないと思っております。
発言の新しい順にするのであれば既存の新着記事のルーチンを書き換えるだけだし、ルートの発言のみサマリーを提供するのであればスレッド一覧のルーチンを改造すれば何とかなると踏んでいます。そして、例えばwforum.cgi?mode=rdfなんて形で呼び出されたらRSSの形式に則った応答を返してやればよし。あとは、しかるべき部分のヘッダに必要な記述を追加してやればOK。

ということで、とりあえず実装してみました。


#---------------------------------------
#  RSS
#---------------------------------------
sub rss {
    local($no,$re,$x,$sub,$eml,$url,$nam,$dat,$msg,$tim,$ho,$pw,$wrp,$oya,$sml,$date);

    $script="http://myhost.hinocatv.ne.jp/bbs/wforum.cgi";
    
    print <<EOM;
Content-type: application/rss+xml

<?xml version="1.0" encoding="Shift_JIS"?>

<rdf:RDF
 xml:lang="ja"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="http://myhost.hinocatv.ne.jp:9801/bbs/wforum.cgi?mode=rss">
<title>やしきの板塀</title>
<link>http://toshiki.la.coocan.jp/bbs.html</link>
<description>としきの作ったフリーウェアに関することからポケ3ネタまで、適当に落書きしていってください。</description>
<dc:language>ja</dc:language>
<dc:creator></dc:creator>
EOM

    # 記事展開
    open(IN,"$logfile") || &error("Open Error: $logfile");
    $top = <IN>;
    while (<IN>) {
        ($no,$re,$x,$sub,$eml,$url,$nam,$dat,$msg,$tim,$ho,$pw,$wrp,$oya,$sml) = split(/<>/);
        if ($pw eq 'DEL') { next; }

        # 連想配列化
        $cnt{$no} = $tim;
        $nam{$no} = $nam;
        $eml{$no} = $eml;
        $url{$no} = $url;
        $rno{$no} = $re;
        $sub{$no} = $sub;
        $oya{$no} = $oya;
        $msg{$no} = $msg;
        $wrp{$no} = $wrp;
        $sml{$no} = $sml;
    }
    close(IN);

    # ソート処理
    $i=0;
    foreach (sort { ($cnt{$b} <=> $cnt{$a}) } keys(%cnt)) {
        $i++;
        if ($i > $sortcnt) { last; } # ループを抜ける

        if ($i==1){
            local($sec,$min,$hour,$day,$mon,$year,$wday) = (localtime($cnt{$_}))[0..6];
            printf("<dc:date>%04d-%02d-%02dT%02d:%02d:00+09:00</dc:date>\n",$year+1900,$mon+1,$day,$hour,$min,$sec);
            print "<items><rdf:Seq>";
        }

        print "<rdf:li rdf:resource=\"$script?mode=article&amp;no=$_\" />\n";
    }
    print "</rdf:Seq></items></channel>\n";

    $i=0;
    foreach (sort { ($cnt{$b} <=> $cnt{$a}) } keys(%cnt)) {
        $i++;
        if ($i > $sortcnt) { last; } # ループを抜ける

        print "<item rdf:about=\"$script?mode=article&amp;no=$_\">\n";
        print "<title>$sub{$_}</title>\n";
        print "<link>$script?mode=article&amp;no=$_\</link>\n";
        print "<dc:creator>$nam{$_}</dc:creator>\n";

        $tmp = $msg{$_};
        $tmp =~ s/。.*/。/;
        $tmp =~ s/<br>/ /g;
        if (length($tmp) > 200) {
            ($tmp, $folded) = &fold($tmp, 200);
            $tmp .= '..';
        }
        print "<description>$tmp</description>\n";

        local($sec,$min,$hour,$day,$mon,$year,$wday) = (localtime($cnt{$_}))[0..6];
        printf("<dc:date>%04d-%02d-%02dT%02d:%02d:00+09:00</dc:date>\n",$year+1900,$mon+1,$day,$hour,$min,$sec);

        print "</item>\n";
    }

    print "</rdf:RDF>\n";
    exit;
}

ログ走査を2回していますが、ここは工夫すれば1回で済むでしょう。
modeはrdfではなくmode=rssと指定するようにしてみました。
どっちがいいというのはあるのかな。


if ($mode eq "msgview") { &msgview; }
elsif ($mode eq "rss") { &rss; }
elsif ($mode eq "article") { &article; }
elsif ($mode eq "allread") { &allread; }

あとは、これのリンクをしかるべきところに仕込んでやれば完了。


板塀(掲示板)の手入れ(改造)
電算棟
やしきの間取り


Copyright © 2006-2007,2010 としき
このページの情報及び著作権は「としき」に帰属します。
Toshiki / toshiki @ jcom.zaq.ne.jp