おまけ: RSSをサイドバーに表示
RSSを取得するサンプルについては、XML_RSSを利用したコードを4章3節RSSのところで書いたが、実用的なサンプルではなかったので、ここでもうちょっと実用的なサンプルを補足しておく。
blog本のおまけ記事を追加しました (20:48)
RSSを出力するサンプルは書いたけど、RSSを読み込んで利用するサンプルは実用性のないサンプル(単にRSSを読み込んで、各要素が配列に入ったでしょ、で終わり)だったんで、もうちょっと実用的なサンプルをおまけで書いておきました。
新着ランキングのRSS (17:24)
blogmapの新着ランキングでRSS配信をはじめました。っつーか、ここまだRSS出力作ってなかったのか……。
- URLの新着 - http://1470.net/bm/newcommer.html/url?mode=rss
- メディアの新着 - http://1470.net/bm/newcommer.html/asin?mode=rss
になります。ちなみに汎用RSS UTF-8化ゲートウェイを通してUTF-8で取得する場合は、
- URLの新着 - http://1470.net/api/rss2utf8.php/http://1470.net/bm/newcommer.html/url?mode=rss
- メディアの新着 - http://1470.net/api/rss2utf8.php/http://1470.net/bm/newcommer.html/asin?mode=rss
なんて感じになります。UTF-8しか扱えないRSSリーダーを使っている方はこちらをどうぞ。
blogmapの巡回がはてなダイアリーに偏っている? (01:14)
『blogmapの「『『ユリイカ』2005年4月号特集*ブログ作法』(青土社)のネットでの評判」が?Dだらけだったという件について』のコメント欄のやりとりあたりへの反応。
blogmapは、各blogサイトの更新時刻情報を取得し、それを元に巡回をしています。はてなダイアリー上にあるサイトの更新時刻情報は、
からかなり確実に取れるんですが、それ以外のサイトに関しては、ping.bloggers.jpとかbulkfeedsとかの公開pingサーバー経由で更新情報を取得しているんで、それらにpingを飛ばしていないサイトは巡回対象から外れます。
blogmap自身でも公開pingサーバー(http://1470.net/api/ping)を用意しているんで、ここにpingを飛ばしてもらえると一番確実に巡回対象になります。
ということで、blogmapの情報ソースにはてなダイアリーの情報がやたらと多いのは、巡回のきっかけになる更新時刻情報の精度が高いから、というのが第一の理由でしょう。
あと、最近はてなダイアリーはRSSのdescriptionに含まれる情報量を増やせるようにしました。また、もともと日記系ツールということで、1エントリー(<h3>タグ間)が短くなりがちな分、他のblogツールと比べるとdescriptionの中に本文中の主要な要素(ISBNとかURLとか)が含まれやすくできています。
一方、通常の(MT系みたいな)blogサイトだと、1エントリーは長文になりがちで、その冒頭をdescriptionとして取り出した場合に、blogmapの解析対象要素がそこに含まれないという場合が出てきます。
たとえば、「絵文録ことのは」がblogmapのユリイカに言及したサイトとして表示されない=blogmapで巡回されていないという話が出てますけど、これは巡回されていないんじゃなくて、絵文録のRSSの該当エントリーのdescriptionにユリイカのISBNコードが含まれていないんで解析できなかった、というのが正解です。
blogmapは1470.netに移転したタイミングで、HTMLではなくRSSのdescriptionもしくはcontent:encodedのみを解析するようになったんで、本文中でふれている話題でも、RSSに載っていなければなかったものと見なされます。旧バージョンではHTMLを直接解析していたんで、本文中に書かれていればすべて解析対象になったんですけど。
ちなみにblogmapが2005/3/1以降に巡回した(ユニーク)サイト数は324250サイトで、そのうちはてなダイアリーのサイトは49671サイトでした。だいたい1/6くらいなんで、割合として結構多い方であることも確かですね。
(15:32)
height="160" width="125"
alt="" title="">
今日ようやく実物を見ることができました。『はじめに』にも書きましたが、主にホビープログラマーが趣味としてプログラミングを楽しむためのネタとして、Webアプリおよびblogツール関連技術の仕組み・使い方を実例(PHP 4)と共に紹介する、という感じのものです。
『自分で作るblogツール(PHP編)サポートエントリー』 の方でいろいろフォローしていきます(最後かなりばたばたしたんで、細かい間違いがたくさんありそう)。よろしくお願いします。
WikiParserをアップデート (18:19)
主な変更点としては、
- プラグインとして、従来の関数型プラグインに加え、プラグインクラスに対応。
- プラグインクラスでは、同一プラグイン内でのデータの保持、イベントコールバックによるパーサーからの呼び出し、に対応。要は、footnote(注釈)プラグインみたいなことができるようにした
- パースしている元テキストへのアクセス手段を用意。それに伴いフィルタに対応。フィルタ(プラグインのイベントコールバックの実装と同様)を利用することで、パース処理実行時の元テキストへの加工処理が可能になる。要は、tdview.phpとtdiary_categoryプラグインみたいに、カテゴリ記法に対して前処理でリンクを張ったりできるようにした。
- いくつかのバグをフィックス。
一応現状の基本仕様でフィックスさせつつ、細かいメソッド名とかをもうちょいいじる予定。プラグイン連携のためのメソッドもいくつか追加するかも。
JavaScriptでpreg_replace_callback (17:16)
WikiParserをJavaScriptに移植してみようかと思ったら、preg_replace_callback相当の正規表現(Perlで言うと/eg)が見あたらない。っつーか、ないんだよね?
しょうがないんで、こんな感じで動かしてみたんだけど、なんとも不格好な感じ。もうちょいいい書き方ないかなー。
function replace(str)
{
str = str.replace(/(123)/g, "' + callback('$1') + '");
str = str.replace(/'/g, "\\'");
str = str.replace(/\\' \+ callback\(\\'(.+?)\\'\) \+ \\'/g, "' + callback('$1') + '");
str = eval("'" + str + "'");
return str;
}
function callback(str)
{
str = eval(str) + 100;
return str;
}
test = "sdga123lkjdgas1234fasdfas";
alert(test);
result = replace(test);
alert(result);
ちなみにテンポラリの式をわざと対象のstrに含まされると誤動作するけど、大して危険性もないだろうということで放置。
正解は
function replace(str)
{
str = str.replace(/123/g, callback);
return str;
}
function callback(str)
{
str = eval(str) + 100;
return str;
}
test = "sdga123lkjdgas1234fasdfas";
alert(test);
result = replace(test);
alert(result);
これでOK。replaceの第2パラメータに関数を渡すと、その関数のパラメータとして、lastMatch(というかマッチした全体)、$1、$2、……が渡されて呼ばれる模様。で、その関数の戻り値として置換結果文字列を返してやればいい。
str = str.replace(/(123)/g, callback($1));
とか
str = str.replace(/(123)/g, callback(RegExp.$1));
なんて表現は試してみたんだけどなー。
ちなみに後者の表現だと、RegExp.$1はここの/123/gではなく、その前に評価された正規表現の結果の$1を受け取っちゃうんで、微妙に惜しい結果になった。
Spider.NETってなんだ? (13:16)
なんかSpider.NETを名乗るクローラーが、MMやらblogmapやらのすべてのURLを延々とたどり続けていて、何万ページたどってもやめる気がなさそうなんで、IPアドレス範囲で丸ごとdenyした。これは何者なんだろう?
mylistのリンク元記録 (23:17)
mylistのリンク元記録をはじめました。メモの固定URLに対するHTTP_REFERERのみを記録します(具体的にはdateパラメータがある呼び出しのみを記録しています)。また呼び出し回数は記録しません(何回呼び出されても1回のみ記録されます)。1470.net内のREFERERは記録対象から除外しています。
現在のところ、各ユーザーの設定フォームの下に最近一週間分の元が表示されています(tDiary風のリンク元表示に対応するかどうか検討中です)。それに伴い、設定フォームの呼び出しリンク文字列を「設定」から「管理」に変更しました。
と思ったけど
やっぱり固定リンク以外へのREFERERも記録するようにしました。