|
PHOTO:
茅ヶ崎の波 surf |
海の写真 ocean |
携帯 待ち受け画像 |
レストラン shop |
色々 etc
TEXT: ネット技術 net | 自然,エネルギー,写真,旅 Eco | 映画 movie | 本 book |
weblogs.comのようなPingサービスの面白い点は、そのリアルタイム性にあります。WEBの検索だとGoogleのようなサーチエンジンがありますが、Googleは検索ロボット(WEB Spider)で収集したリンク情報を元にインデックスを作成、DB化したものを、独自のアルゴリズムを基に重み付け(Page Rank)してキーワードに対する検索結果を表示します。
ただし情報収集は能動的にWEB Spiderを、インターネット上に徘徊(Crawl)させることで行うので、どうしてもタイムラグが発生します。サイトの更新日付をチェックすることで、サイトをCrawlする頻度を動的に制御したり、ニュースサイトに限定してリアルタイム性を重視する検索サービスなども提供していますが、一方でPingサービスを利用すると、複雑なアルゴリズム無しに、例えば「最近6時間でブログで話題になったテーマ、本」などを簡単にサーチすることが可能です。
このようなアプローチは、MovableTypeやBloggers.comのようなツールが普及して、Ping処理を自動的に行ってくれることで、始めて現実的に普及してきたアイデアだと思います。weblogs.comなどのブログ更新通知サービスについて以前に書きましたが、
- blogのアップデート通知サービス
- weblogs.comを利用したサービス
これから益々セマンティックなMetaデーターがEntry内に記述されるようになると、結構面白くなってくるのではないでしょうか。Ping情報を、国や位置情報、エントリーの内容カテゴリなどでソートできると、グローバルかつリアルタイムに情報を参照できる”グローバル・ブレイン”になりますから、そこからどのように情報を見せるか、という点も重要な気がします。。
では具体的にPingの実装がどうなっているかという点ですが、Naoyaさんのブログで素晴らしい解説をされていたので、まずはこちらを参照
- Weblogs.Com Ping の Perl による実装
- Weblogs.Com changes.xml を Perl で料理する一例
- Weblogs.Com changes.xml を吐いたりする Ping サーバの Perl 実装
ただ最近Perlを忘れ気味なので、JavaでためしにPing Serverを実装してみました。JavaでもApacheのXML-RPCモジュールがあって、実装は結構簡単です。
例えば、PingRecieverというPingを受け付けるServletを作るとして、以下のようにorg.apache.xmlrpc.XmlRpcServerのインスタンスに新しいHandlerとして、PingのHandlerであるweblogUpdatesを追加、それに対応するHandler内に処理を実装します。(この例では特に処理は何もしませんが)
■ Pingを受け付けるServletpublic class PingReciever extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response){
XmlRpc.setEncoding("UTF-8");
XmlRpcServer xmlrpc = new XmlRpcServer();
xmlrpc.addHandler ("weblogUpdates", new UpdateHandler(xml_file));
try {
byte[] result = xmlrpc.execute (request.getInputStream());
response.setContentType ("text/html");
response.setContentLength (result.length);
OutputStream out = response.getOutputStream();
out.write(result);
out.flush();} catch (IOException e) {
System.out.println("Servlet Error" + e);
}
}
}■ Pingを処理するHandler
public class UpdateHandler {
public Hashtable ping(String name, String url)
throws Exception{
/** nameとurlを使った処理をここに実装 **/
/* Return Result of this Handler */
Hashtable result_hash = new Hashtable();
result_hash.put("message", "Thanks for the ping");
result_hash.put("error", Boolean.FALSE);
return result_hash;
}
}■ PingをするClient(Formn入力でServletのクライアントにGetする)
public class PingClient extends HttpServlet{
String xmlrpc_url = "PingするXML-RPCのURL";public void doGet(HttpServletRequest request, HttpServletResponse response){
String name = request.getParameter("name");
String url = request.getParameter("url");
XmlRpcClient client = null;
Hashtable result_hash = new Hashtable();
try{
XmlRpc.setEncoding("UTF-8");
client = new XmlRpcClient (xmlrpc_url);
} catch(MalformedURLException e){
System.out.println(e);
}
Vector vec = new Vector();
vec.addElement(name);
vec.addElement(url);try {
result_hash = (Hashtable)client.execute ("weblogUpdates.ping", vec);
if (result_hash == null) System.out.println("No Result Back from execute");
}catch (IOException e){
System.out.println("IOException" + e);
}catch (XmlRpcException e){
System.out.println("XML-RPC Exception" + e);
}
response.setContentType("text/html");
try {
PrintWriter out = response.getWriter();
out.println("<HTML><BODY>PING RESULT:<BR />");
Enumeration e = result_hash.keys();
while(e.hasMoreElements()){
Object k = e.nextElement();
out.println("KEY=" + k + " : VALUE=" + result_hash.get(k) + "<BR />");
}
out.println();
out.println("</BODY></HTML>");
out.close();
}catch(Exception e) {
System.out.println("Error : PrintWriter");
}
}
}
下の個所はどういう意味でしょうか?
>xmlrpc.addHandler ("weblogUpdates", new UpdateHandler(xml_file));