2008/01/31


携帯電話でブラウズしている時に突然、はてなブックマークに登録しておきたくなったりしませんか?
はてなブックマークから画面遷移している時は、はてな専用携帯変換ページが表示されブックマークへのリンクも付けられている為「このページはてブしたい」と思った時にも簡単にはてなブックマーク出来るでしょう。
でも直接そのページを見ている時には携帯では術がありません。
私はよく
  1. 携帯でブラウズ
  2. 携帯のブックマークに登録
  3. PCでブックマーク登録
という煩わしい作業をしてたりします。
例えば、専用ページを作ってリファラを見ても画面遷移では無いので登録しようとしているブックマークURLは取得出来ません。

これを何とかしようと言うのが今日のお話。
殆どの携帯電話には、「URLでメールを送信」という機能が備わっています。
これを使い、サーバ側に登録させるのです。
ニワンゴ開発サイトに「hatebu」というコマンドを作りました。
ニワンゴ開発サイトは、簡単な形式で記述されたメールからコマンドとしてWebAPIをキック、その応答をメールで返すという機能を提供してくれています。
この「hatebu」コマンドから呼ばれるサーバ側CGIとして以下の様なphpのコードを置きました。
※phpなんか久しぶりに書いたのでかなり適当
※何故phpなのかというと、無料で使えてソケット系APIが動くサーバで見つけたのがphpしか動作しなかったから...

<?php
header('content-Type: text/plain; charset="Shift_JIS"');

# URLかどうか...(適当)
function isUrl($str) {
  return (preg_match('/^(https?)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/', $str) && $str!="");
}

# コマンドとパラメータ
$c="";
$p2="";
$subject="";

if(isset($_REQUEST['c'])){
    $c = $_REQUEST['c'];
}
if(isset($_REQUEST['p2'])){
    $p2 = $_REQUEST['p2'];
}
if(isset($_REQUEST['subject'])){
    $subject = $_REQUEST['subject'];
}
$c = mb_convert_encoding($c, "SJIS");
$pi = mb_convert_encoding($pi, "SJIS");
$subject = mb_convert_encoding($subject, "SJIS");

# コマンドのチェック
if ($c != 'hatebu|| $p2 == "" || !isUrl($p2)){
  echo "response=ERROR\n";
  echo "subject=".$c." ".$p2."\n";
  echo "body=Failed\nInvalid parameter \"$c\" \"$p2\" \"$subject\"";
  exit;
}

# AtomPubで送信
error_reporting(E_ALL);
require_once('class.atomapi.php');
require_once('class.wsse.php');

$username = 'xxxxxxxxxxxxxxxx';
$password = 'xxxxxxxxxxxxxxxx';
$endpoint = 'http://b.hatena.ne.jp/atom/post';
$auth     = 'WSSE';

$entry = new AtomEntry();

$entry->set_title('HATENA');
$entry->set_content('BOOKMARK');
$entry->set_summary($subject);
$entry->add_link($p2, 'related', '', 'text/html');
$auth_obj = new WSSE($username, $password);
$post = new AtomRequest('POST', $endpoint, $auth_obj, $entry->to_xml('POST'));
$post->exec();
if ($post->error()) {
  echo "response=ERROR\n";
  echo "subject=".$c." ".$p2."\n";
  echo "body=Failed\nInvalid parameter \"$c\" \"$p2\" \"$subject\"";
} else {
  echo "response=SUCCESS\n";
  echo "subject=".$c." ".$p2."\n";
  echo "body=Succeeded";
}
exit;
?>
この状態で、ニワンゴ開発サーバからコマンドを発行する為に
m at open dot niwango dot jp
※「at」は「@」に、「dot」は「.」に置き換えます
というアドレスへ hatebu [URL] ※[URL]はとりあえず、http/httpsのみにしました。
とうい本文のメールを送信すると、はてなの「i_am_not_mattn」というアカウントのはてなブックマークに[URL]で指定したサイトがブックマークされます。メールの題名がブックマークコメントになっています。
適当に使ってみて下さい。
※なお、ニワンゴ開発OpenAPIの仕様で私にメールアドレスがばれる事はありません。
※如何わしいサイトが登録された場合はアカウント停止します。

アプリとして言うならば「i_am_not_mattn」のアカウントだけでしか動作出来ないのが苦しい所...
まさかメール本文にパスワード書くってのも嫌だし...
専用サーバでqmailからキックさせるか、sidebar.jpでXMLRPCをキックさせるのが良いんでしょうね。
Posted at by




microsummaryという言葉をご存知でしょうか。microsummaryはMozilla Groupが提案しているWebの要約表記方法の事を指し、ブラウザのブックマーク等で動的に更新されるコンテンツを生成出来る機能です。
Microsummaries - MozillaWiki
例えば、貴方が任意のWebサイト一覧を作り、そのWebサイト毎の最新サマリを日々更新したと思った場合どうするでしょうか。 Web::Scraperを使って、そのサイトの本文もしくはタイトルらしき辺りをスクレイピングするでしょうか。 もしくはmicrofomatsを使ってエントリを一覧し、その先頭を最新と信じて出力するでしょうか。

これらはコンテンツ製作者の意図とそれを二次利用する者とで事前に
  • サマリは一番最初のコンテンツのタイトルである
  • サマリは<title>タグに含まれている
  • サマリとして使用して良いサイトである(もしくはない)
  • サマリは2時間おきに更新される可能性がある
などと言った情報が交換されていない事が原因で、現状コンテンツ制作側からは何も公開していない事になります。
それを実現する機能がmicrosummaryです。

microformatsは既存のコンテンツに対するrel属性およびclass属性を定義する事で、二次利用者側に欲しいコンテンツの場所を示しています。しかしこれでは複数の情報を結合したサマリを生成したり、不要な情報を省く事が難しくなる。つまりプログラマブルでは無い。microsummaryは、link要素に指定したURLに格納されるmicrosummary定義ドキュメントに埋め込まれるXSLT(XML Stylesheet Language Transformations)をコンテンツ自身に適応する事により、microformatsよりもより柔軟なサマリを提供出来るようになっています。

まず、このサイトのHTMLを見て下さい。
<link rel="microsummary" href="http://mattn.kaoriya.net/microsummary/entry_title.xml" />
という部分に、microsummary定義ドキュメントへのパスが記述されています。
そしてそのドキュメントの中身には <?xml version="1.0" encoding="UTF-8"?>
<generator xmlns="http://www.mozilla.org/microsummaries/0.1" name="Big Sky - Entry Title">
  <template>
    <transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <output method="text"/>
      <template match="/">
        <value-of select="html/head/title"/>
        <text> - </text>
        <value-of select="//div[@class='xfolkentry'][1]/h3"/>
      </template>
    </transform>
  </template>
  <update interval="240"/>
  <pages>
    <include>^http://mattn\.kaoriya\.net</include>
  </pages>
</generator>
となっています。
この定義ドキュメントのpages要素を見て下さい。
pages/includeには、そのサイトでmicrosummaryを適応すべきURLパターンが記述されています。
つまりコンテンツ製作者側が、サイトページに応じてmicrosummaryを出力するかしないかを定義出来る事になります。
次にtransform要素。ここはXSLTスタイルシートと同じ構成になっている。上の例ではこのページのHTMLにある、html/head/title要素と、xfolkentryというクラス名の付いたdiv要素直下にあるh3要素を、結合しサマリとして扱うと定義しています。
もちろん、XSLTなのでもっと複雑なサマリを生成する事も出来ます。
また、update要素ではサマリの更新間隔を指定する事もでき、通常30分である更新時間を任意に指定する事も出来ます。

microsummaryは、はてなダイアリーにおいても既に導入されておりhttp://d.hatena.ne.jp/microsummary/entry_title.xmlに定義ドキュメントが格納されています。これにより、例えば「はてなスター日記」をFirefoxでブックマークすると、最新記事のタイトルがサマリーとして生成され、上の記述にもある様に240分毎(update要素)にサマリが更新されるブックマークをコンテンツ製作者側から提供する事が出来ます。
microsummary-hatenastar
利用方法では、ニュースのヘッドラインを流す事も可能です。
参考:FirefoxのブックマークツールバーでYahooヘッドラインニュースを流す方法
さらに、ライブドアリーダのフィード詳細画面では、購読者数とレートがmicrosummaryとして配信されており、動的なブックマーク(ライブタイトル)を実現出来ます。 例えば私のサイトのフィード詳細でもmicrosummaryが配信されています。以下のブックマークレットで確認出来ます。
参考:しげふみメモ:livedoor Reader購読者数のライブタイトル
この他、定義ドキュメントに記述出来る要素については
Microsummary XML grammar reference - MDC
に日本語訳化された物があるので興味のある方は参照してみて下さい。
なお、MozillaのドキュメントWikiにあるMicrosummaries - MozillaWiki Standardizationという項目では、microsummaryが記述されるlink要素はmicroformatsとして標準化されるべきだ、との文章もあります。いずれmicroformatsのDraftに入ってくるのかもしれません。

さて、このエントリを作成するにあたって、以前microsummaryの記事でご紹介したbookmarkletを改造し、microsummaryを表示するブックマークレットを作ってみました。
※IE6、Safariでは動作しません。動作確認は、FirefoxとOperaにて行っています。
bookmarlet:microsummary
表示しているドキュメントのlink要素の内、ref="microsummary"の物を検索し、定義ドキュメントをXHRで取得しXMLDOMとしてパース。その後pages/includeにURLがマッチしている事を確認した後にXSLTプロセッサでサマリを生成する。といった仕組みです。
IE6で動作しない理由は、XSLTプロセッサに渡すドキュメントエレメントはXMLである必要があり、document.documentElement.innerHTMLを渡してもパースエラーになってしまう為です。また、SafariではtransformToDocumentにdocument自身を渡すとエラーとなっています。

ちなみに、HTMLを無理やりXHTMLに変換し、MSXML2.DOMDocumentで処理するコードの残骸が入っていますがお気になさらず...

microsummaryはおそらくブラウザのブックマークに限られた話ではありません。
冒頭で述べた様に、コンテンツサマリ一覧を作成する様な二次利用者に対しても有用で、CGI等も必要とせず、かつ記事のエントリに付与されたclass属性を壊す事無くサマリを集約出来ます。おおよそGRDDLのサマリ版といった所だと認識して頂けると思います。
ただし、現状のmicrosummaryでは1つの定義ドキュメント内に1つのスタイルシートしか記述出来ず、URLパターンに応じたスタイルシートを選ばせる事が出来ない上、出力する内容も1つに限られてしまいます。
これはブックマークのサマリとして登場したmicrosummaryの性でしょうか...。

上で述べた様に、膨大なコンテンツを扱う二次利用者側からすると、microformatsで得られる情報は大きすぎ、かつコンテンツ提供者側が意図しない内容になってしまう可能性もあります。これを解決出来るmicrosummaryに、少し期待出来るのでは?と考えています。
Posted at by




最近、「今何してる?」でつながり合うTwitterというサービスで遊んだりしてます。

http://twitter.com/

基本的にはチャット、しかも「垂れ流し」系のチャットで、どちらかというと「カテゴリ無し」で「オーナー無し」の掲示板とも言えます。

SNSを歌うだけあってか、friendsと呼ばれる、お気に入りユーザを互いに登録する機能もあります。

ただfriendsといっても「垂れ流し」ですから、どちらかと言うと各ユーザがラジオのパーソナリティのようで、friends登録はラジオのチャンネルを登録しているって感じです。

あくまで、その時に、あの人が、何をしているかを互いに晒し合って楽しみます。

いわば束縛の「ゆるい」、SNSと言って良いかもしれません。

最近のSNSのように日記記事1件に対して、複数のコメントやレスが繋がる形式だと、「読み逃げ」等といった、「一文にも値しない価値観」に悩まされたりしますが、Twitterの場合は「垂れ流し」ですから、書く側は「見られてなくてもいい」、見る側も「コメントなんか要らない」といった割り切りが最初から存在するんです。
前に書いた記事のコメントにレスしなきゃ新しい記事が書けない!そんな心配も要りません。

チャットだから見逃したら、そこで話題はお終いって所が、書く側も、見る側も認識出来るのです。

最近、mixi等SNSに疲れを感じる人には良い保養所になりそうな気がします。

ちなみに私はココにいます。

http://twitter.com/mattn_jp

「垂れ流し」ですから、レスもないかもしれませんけど、気軽にfriends登録して頂いても構いません。
Posted at by