テクな話題を説くと解く。そのココロは?
ネームスペース宣言
Feed Access Control RSS and Atom のネームスペースは次のように定義されます。例えば、
http://www.bloglines.com/about/specs/fac-1.0あるいはAtomの場合、
<rss version="2.0" xmlns:access="http://www.bloglines.com/about/specs/fac-1.0">のようになります。
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:access="http://www.bloglines.com/about/specs/fac-1.0">
<access:restriction>要素<rss>または<feed>の子要素です。これらはフィードの再配布制限を示すのに使われます。'relationship'アトリビュートは、フィードがアクセスを「許可」あるいは「拒否」するかを示すのに使われます。 アクセスを「許可」するということは、フィードがサーチエンジンを含む他の公共ソースに再配布される可能性がある事を意味します。アクセスを許可するには、<access:restriction relationship="allow" />のようにして下さい。 アクセスを「拒否」するということは、フィードがサーチエンジンを含む他の公共ソースに再配布されるべきではない事を意味します。アクセスを拒否するには、<access:restriction relationship="deny" />のようにして下さい。 標準ではrelationshipはアクセスを許可します。しかし、もしフィードが現在「拒否」に設定されている場合、そのフィードを再登録(訳注:検索エンジンなどに)するためには、relationshipを明示的に「許可」に設定する必要があります(単純にフィードから削除するだけではアクセスを再び許可するには十分ではありません)。フィードの例
RSS の例
<rss version="2.0" xmlns:access="http://www.bloglines.com/about/specs/fac-1.0"> <access:restriction relationship="allow" /> <channel> <title>Bloglines | News</title> <link>http://www.bloglines.com</link> <item> <title>Ping Away, Bloggers</title> <description>Hello World</description> <pubDate>Fri, 28 Apr 2006 12:03:11 PDT</pubDate> <guid>http://www.bloglines.com/about/news#103</guid> </item> </channel> </rss>Atom の例
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:access="http://www.bloglines.com/about/specs/fac-1.0"> <access:restriction relationship="allow" /> <title>Bloglines | News</title> <link href="http://www.bloglines.com"/> <updated>2006-04-28T19:03:11Z</updated> <entry> <title>Ping Away, Bloggers</title> <link href="http://www.bloglines.com/about/news#103"/> <id>http://www.bloglines.com/about/news#103</id> <updated>2006-04-28T19:03:11Z</updated> <summary>Hello World</summary> </entry> </feed>
bloglines.comのサービスは既にこの拡張フィードを解釈する機能が実装されているそうです。その他にも、大手検索エンジンなどがこの件に関してbloglines.comに問い合わせをしているらしいので、そのうち検索エンジンもこの拡張書式を解釈するようになるかもしれません。
参考ページ:
Posted by Pju at 06:47 PM
Permalink
Comments (0)
TrackBacks (0)
更新Pingを利用して複数ブログの更新情報一覧を生成するPHPスクリプトの初期版ができたので、ひとまずここに公開します。コードの改善点、セキュリティホールなどあったらご一報ください。なお、ライセンスはGPL version2です。
実際に動いているバージョンはppmz.comのトップページ、更新情報の欄をご覧ください。
Posted by Pju at 09:04 PM
Permalink
Comments (0)
TrackBacks (0)
一番難しいと思っていたネットワーク通信周りがいともあっさり片付いてしまったので、受信した情報を処理してHTMLを生成する部分を次に実装します。
weblogUpdates.pingには、必ず2つの情報(更新されたブログのタイトルと、そのブログのURL)が含まれていて、他2つの引数は任意なので、今回の実装では任意の引数は無視して、確実に含まれている情報のみを利用しようと思います。
実際の処理自体は、ごく基本的なファイルI/Oと配列の処理ばかりなので、処理の流れを説明してもしょうがない(というか面白くない…コードを見てもらえれば一目瞭然なので)ので、ここは一つ、JavaプログラマがPHPでプログラムを書いた時に引っかかるかな、と思われる点、つまりは自分がつまずいた点をリストしていきたいと思います。完成品のコード自体は次回に公開します。
error_reporting(0);と書いてエラー出力を切ってやればいい。参考:Nucleus(JP)フォーラム :: トピックを表示 - pingサーバを作りたいコーディング中にいろいろ調べているうちに、結構いろんな人がPingサーバを作ってるらしい事も分かりました。まぁ車輪の再発明になってしまいましたが、自分としてはいい練習になってるので良しとしましょう。次回は完成品の公開です。
Posted by Pju at 07:30 PM
Permalink
Comments (0)
TrackBacks (0)
大体の構想も固まったので、いよいよコーディングに入りたいと思います。XML-RPCを簡単に扱えるモジュールがないかな、とGoogleで検索していたら、とても役に立つ(というかまさにズバリ)というページ、その名もPHPとPEARでXML-RPCを見つけました。このページに簡単なサーバとクライアントの実装例があったので、基本的な部分はこれを拝借する事にしました。
といっても実際にはあまりやる事はなく、関数のシグネチャであるsample.sumAndDifferenceとなっている部分をweblogUpdates.pingに書き換えれば、基本的には更新pingを受け取るサーバは出来上がり…ってこんな簡単で良いんでしょうかね。まぁもちろんレスポンスの部分や、実際に受け取った情報の処理はまた別にしなければいけませんが、これだけの作業でサーバの外部とのインターフェイスを担当する部分は完了です。実際のコードはこんな感じです(クライアント、サーバ共にPHPとPEARでXML-RPCに掲載の物の改変)。
require_once("XML/RPC.php");
require_once("XML/RPC/Server.php");
$GLOBALS['XML_RPC_defencoding'] = "UTF-8";function pingReceived ($params) {
global $XML_RPC_erruser;
$p1 = $params->getParam(0);
$p2 = $params->getParam(1);
$name = $p1->scalarval(); //ブログ名
$url = $p2->scalarval(); //ブログのURL
//受信情報の処理はこの辺に…。
$value = new XML_RPC_Value("Thanks for the ping.", "string");
return new XML_RPC_Response($value);
}$s = new XML_RPC_Server(array("weblogUpdates.ping" => array("function" => "pingReceived")));
?>
ちなみに、同じサイトのクライアントスクリプトの関数シグネチャをweblogUpdates.pingに書き換えて、第一引数にブログのタイトル、第二引数にブログのURLを入れてやれば、更新ping送信用のスクリプトの出来上がりです。コードはこんな感じです。
require_once("XML/RPC.php");
$GLOBALS['XML_RPC_defencoding'] = "UTF-8";$xmlrpc_host = "http://www.yahoo.co.jp"; //送信先ホスト
$xmlrpc_path = "/RPC2"; //送信先パス
$c = new XML_RPC_client( $xmlrpc_path, $xmlrpc_host, 80 );//引数の一覧を作成
$params = array(
new XML_RPC_Value( 'ppmz.com', 'string' )
,new XML_RPC_Value( "http://www.ppmz.com/", 'string' )
);//メッセージの作成
$message = new XML_RPC_Message('weblogUpdates.ping',$params);//メッセージ送信
$response = $c->send($message);//応答の処理 - 正常時とエラー時
if (!$response->faultCode()) {
print $response->serialize();
}else{
print "Fault Code: " . $response->faultCode() . "
";
print "Fault Reason: " . $response->faultString() . "
";
}
?>
次回は受け取った情報を処理する部分を実装しようと思います。
Posted by Pju at 06:51 PM
Permalink
Comments (0)
TrackBacks (0)
weblogUpdates.pingの仕様は大体理解したので、次はアプリケーションの設計に移ります。どうやらXML-RPCの部分は既製品のモジュールが使えそうなので、プログラム自体のサイズはそう大きくはならないでしょうが、全体を大雑把にどう分けるのか、という部分は考えておきたいと思います。
Posted by Pju at 05:16 PM
Permalink
Comments (0)
TrackBacks (0)
更新Pingを処理するサーバを自前で作ってみよう企画の第二弾、今回は更新Pingの仕様、どういった動作が期待されているのかという事の研究です。とりあえず基本的にHTTPで何か送って、それに対して返事が来る、という部分は知っていましたが、実際にサーバを書くとなるともう少し詳しい仕様が必要になるので、調べてみました。
weblogUpdates.ping (weblogname, weblogurl, changesurl=weblogurl, categoryname="none") returns struct。引数の一覧は次の通り:
…どうやら、weblogUpdates.pingそのものは非常に貧弱なプロトコルのようです。まぁ更新情報を通知するだけのプロトコルという事を考えるとそれも仕方ないですかね。さしあたってはping受け取りと同時にRSSを読みにいって云々はまた後ほどの実装ということにして、ごく最低限の、更新されたブログの名前とURLを取得する、という部分から実装しようかな、と思います。
Posted by Pju at 02:19 PM
Permalink
Comments (0)
TrackBacks (0)
敵を知り己を知らば百戦してなお危うからず、とはかの有名な「孫子」からの引用ですが、まずプログラムを書くにあたってどんなプログラムを書こうとしているのかを明確にしておく必要があると思うので、ブレインストームがてら、現状整理をしつつ要件を書き出していこうかと思います。
とまぁ現状こんな感じです。これを踏まえて、何をすべきか、というリストを作ってみます。
てなわけで、とりあえずは上のToDoに従ってやっていきたいと思います。
Posted by Pju at 09:08 AM
Permalink
Comments (0)
TrackBacks (0)
現在休職(求職)中なわけですが、仕事が無いのをいいことに家でダラダラ過ごすのもあまり宜しくないので、これを良い機会として一つ新しいプログラミング言語を習得してみようかなと思ったわけです。
同時進行でサイトの再構成も行っているのですが、その際にある機能を実行するスクリプトが必要になって、その機能を満たすスクリプトがどうやらあまりフリーで出回ってないようなので、じゃぁ自分で作ってみようかね、と。
どんなスクリプトかというと、まぁブログのPingサーバ(受信側)です。自分は複数ブログ(ブログスクリプトを使っているという意味において)を持っているのですが、今のところ、それらの更新情報を一カ所でみられるページってのが存在しないんですね。それなのでそういう機能を実現するにはどういった仕組みが一番かな、と考えたらPingサーバだったわけです。
まぁそういうわけで、PHPに関してはズブの素人な訳ですが、とりあえず他の言語の経験はあるのである程度はなんとかなるかな、と楽観的に考えて、まずはPingサーバ規格の仕様書探しから始めようかと思います。
Posted by Pju at 06:52 AM
Permalink
Comments (0)
TrackBacks (0)