<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tender Surrender &#187; OpenSocial</title>
	<atom:link href="http://devlog.agektmr.com/en/archives/tag/opensocial/feed" rel="self" type="application/rss+xml" />
	<link>http://devlog.agektmr.com</link>
	<description>SocialWeb Evolves</description>
	<lastBuildDate>Tue, 10 Aug 2010 15:55:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>EN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Footprint gadget for your FriendConnect</title>
		<link>http://devlog.agektmr.com/en/archives/325</link>
		<comments>http://devlog.agektmr.com/en/archives/325#comments</comments>
		<pubDate>Wed, 07 Jan 2009 16:07:32 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[FriendConnect]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[SocialWeb]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=325</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F325", "style": "big", "title": "Footprint gadget for your FriendConnect" });
I developed FriendIntroducer as an experiment and was trying to understand how FriendConnect is different from ordinaly OpenSocial implementation. So this time, I&#8217;ve tried to develop a gadget which you can find FriendConnect interesting, Footprints. You know the idea if you&#8217;ve tried MyBlogLog before.
What [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F325%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Footprint%20gadget%20for%20your%20FriendConnect%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F325", "style": "big", "title": "Footprint gadget for your FriendConnect" });</script></div>
<p>I developed <a href="http://devlog.agektmr.com/archives/310">FriendIntroducer</a> as an experiment and was trying to understand how FriendConnect is different from ordinaly OpenSocial implementation. So this time, I&#8217;ve tried to develop a gadget which you can find FriendConnect interesting, Footprints. You know the idea if you&#8217;ve tried MyBlogLog before.</p>
<h2>What is Footprints?</h2>
<p>Footprints is a gadget to track visitor of you blog. Look at the gadget on bottom left of this blog.&nbsp;If you&#8217;re not joined or signed in, do it to check what it does.</p>
<p>Footprint is a pretty popular idea on japanese social networks. Once upon a time, SNS were all closed and it was difficult to find people you may know. Footprint functionality was a good tool at that time to find who&#8217;s interested in you.</p>
<p><img width="223" height="211" class="alignnone size-full wp-image-326" title="Footprints1" src="http://devlog.agektmr.com/wp-content/uploads/2009/01/e38394e382afe38381e383a3-5.png" alt="Footprints1" /></p>
<p>As you could imagine, this gadget records visitor and its time. When viewed by others, timestamp will be displayed how long ago, you&#8217;ve visited. Also, you can remove your own footprint if you want.  The xml is located at:</p>
<p><a href="http://devlab.agektmr.com/OpenSocial/FriendConnect/Footprints.xml" target="_blank">http://devlab.agektmr.com/OpenSocial/FriendConnect/Footprints.xml</a></p>
<p>Feel free to take it and use it on your blog.</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/325/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>米YahooがOpenSocialに対応</title>
		<link>http://devlog.agektmr.com/en/archives/198</link>
		<comments>http://devlog.agektmr.com/en/archives/198#comments</comments>
		<pubDate>Wed, 29 Oct 2008 03:51:22 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[SocialWeb]]></category>
		<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[Y!OS]]></category>
		<category><![CDATA[Yahoo!]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=198</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F198", "style": "big", "title": [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F198%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%E7%B1%B3Yahoo%E3%81%8COpenSocial%E3%81%AB%E5%AF%BE%E5%BF%9C%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F198", "style": "big", "title": "米YahooがOpenSocialに対応" });</script></div>
<p>本日米Yahoo!から、Yahoo! Open Strategy 1.0として、ディベロッパ向けに<a href="http://developer.yahoo.com/yap/">Yahoo! Application Platform (YAP)</a>, <a href="http://developer.yahoo.com/social/">Yahoo! Social Platform (YSP),</a> <a href="http://developer.yahoo.com/yql/">Yahoo! Query Language (YQL)</a>が<a href="http://developer.yahoo.net/blog/archives/2008/10/yos_10_launch.html" target="_blank">リリース</a>されました。</p>
<h2>Yahoo! Social Platform</h2>
<p>プロフィールやアドレス帳、更新情報等、ソーシャルにまつわるAPIをRESTベースで提供するものです。認証機構にはOAuthを利用し、PHP版、Flash版のライブラリも提供されていますが、このREST APIはOpenSocial互換ではありません。</p>
<h2>Yahoo! Query Language</h2>
<p>SQLライクなコマンドを送信する事でYahoo! Pipesのようにデータ取得が可能なウェブベースのAPI。<a href="http://wiki.developers.facebook.com/index.php/FQL" target="_blank">FacebookのFQL</a>のようなもののようです。</p>
<h2>Yahoo! Application Platform</h2>
<p>Yahoo!上で動作する埋め込み型のアプリケーション。OpenSocialのガジェットプラットフォームは現時点ではサポートされていませんが、JavaScript APIは使えるようです。大きく2つのビューがあります。</p>
<div><a href="http://devlog.agektmr.com/wp-content/uploads/2008/10/yos_appdef.jpg"><span style="text-decoration: none;"><img class="alignnone size-medium wp-image-199" title="yos_appdef" src="http://devlog.agektmr.com/wp-content/uploads/2008/10/yos_appdef-300x184.jpg" alt="" width="300" height="184" /></span></a></div>
<h3><span style="font-weight: normal;"><strong>Small View</strong></span></h3>
<p><span style="font-weight: normal;">HTMLまたは<a href="http://developer.yahoo.com/yap/yml/" target="_blank">YML Lite</a>のみサポート。JavaScriptはサポートされていません。YMLは、<a href="http://wiki.developers.facebook.com/index.php/FBML" target="_blank">Facebookで言うところのFBML</a>のようなもので、 My!Yahoo等様々なページにパーツとして表示する事が想定されています。</span></p>
<h3><strong>Canvas View</strong></h3>
<p><strong></strong>ディベロッパが指定したURLが出力したYMLをプロキシして表示するタイプのアプリケーション。Facebookライクな仕組みですね。もちろん、サーバーサイドでYahoo! Social Platformを使ったプログラムを書く事で、OAuthで認証を行い、RESTベースでソーシャルグラフを取得したり、コンタクトリストを取得したりすることできます。</p>
<p>また、<a href="http://developer.yahoo.com/yap/guide/yap-opensocial.html" target="_blank">OpenSocial JavaScript API(v0.8)にも対応</a>しているので、クライアントサイドから更新情報を追加するといった利用も可能な様子。<a href="http://devlog.agektmr.com/archives/49">Caja</a>が利用されているので、セキュリティに気遣う事なく実装できそうです。(いつのまに実用レベルに達していたのでしょうか・・・)</p>
<p>時間のある時にでもサンプルアプリケーションを作ってみたいと思います。</p>
<h2>所感</h2>
<p>今回のYahoo!のリリースは、FacebookプラットフォームとOpenSocialのいいとこ取りといった感じ。ただし、OpenSocialに完全に準拠している訳ではないので、他で作ったアプリケーションをちょっとだけ書き換えて転用、という訳には行かなそうです。</p>
<p><span style="text-decoration: line-through;">例えば、クライアントからmakeRequestを使って外部サーバーのデータを取得するようなJavaScript APIは利用する事ができません。また、OpenSocialならHTMLを出力すればよかったものが、YMLを出力しなければなりません。等々・・</span>(追記：Gadgets Core APIは利用できるようです。ただし、Pref、Viewなど、featureで指定する機能は利用できません。また、YMLは通常のHTMLに加え、独自タグを使って拡張した機能が使える、というもののようです。ただ、Caja対応のために外部スクリプトを読み込めないことが、他のコンテナに実装したガジェットをインポートする際の障壁になりそうです。)</p>
<p>ただ、世界最大のポータルサイトがOpenSocialに対応することの意義は大きく、今後の動きは要注目です。全体の戦略からすれば、OpenSocialの対応はあくまでパーツに過ぎず、今後のウェブのあり方を位置づける重要な意味を持ちます。先日行われた<a href="http://www.kidsallright.com/blog/2008/09/18/yahoo-open-strategy-overview/" target="_blank">Yahoo! Open Hack Dayのプレゼンテーション</a>は必見です。</p>
<p>どんどんプラットフォーム化していくウェブと、その中で占めるソーシャル機能の持つ重要性が、日本でも認識される日はそう遠くないと思います。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/198/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Data AvailabilityでOAuthを試す</title>
		<link>http://devlog.agektmr.com/en/archives/107</link>
		<comments>http://devlog.agektmr.com/en/archives/107#comments</comments>
		<pubDate>Tue, 05 Aug 2008 16:27:19 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Data Availability]]></category>
		<category><![CDATA[MySpace]]></category>
		<category><![CDATA[OpenSocial]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=107</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F107", "style": "big", "title": [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F107%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Data%20Availability%E3%81%A7OAuth%E3%82%92%E8%A9%A6%E3%81%99%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F107", "style": "big", "title": "Data AvailabilityでOAuthを試す" });</script></div>
<p><a href="http://devlog.agektmr.com/archives/79"></a>前エントリでの予告通り、実際にサーバーサイドでコードを書き、MySpaceのData Availabilityを使ってOAuthを試してみます。<a href="http://developer.myspace.com/community/myspace/dataavailability.aspx" target="_blank">Data Availability</a>という名前は大げさに聞こえるかもしれませんが、実際はOpenSocial RESTful APIです。ちなみにData AvailabilityではまだJSON形式のみのサポートで、AtomPubには対応していません(しかも404が返ってくる。これに相当ハマった○|￣|＿)。</p>
<p>今回はOAuthを使って認証・認可を取得し、Data Availability APIを叩くところまでを解説します。</p>
<h2>下準備</h2>
<p>まずはサンドボックス環境にMySpaceにアプリを作ってください。細かい手順が分からない方は<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20080708/310341/" target="_blank">この辺</a>を参考にしてください。</p>
<p>MySpaceではガジェットアプリも外部アプリも同じように扱われるようです。</p>
<p><img class="alignnone size-full wp-image-108" title="MySpaceApps" src="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-11.jpg" alt="" width="500" height="98" /></p>
<p>Edit Detailsを開くと、アプリケーションの詳細設定を編集することができます。</p>
<p>ここで<a href="http://devlog.agektmr.com/archives/79" target="_blank">OAuthの利用に必要なもの</a>を思い出してください。まずはコンシューマキー(consumer_key)とコンシューマシークレット(consumer_secret)です。</p>
<p><span style="text-decoration: underline;"><a href="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-31.jpg"><img class="alignnone size-full wp-image-110" title="MySpaceAppConsumer" src="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-31.jpg" alt="" width="500" height="126" /></a></span></p>
<p>MySpaceの場合、アプリケーションを登録した段階でこれら2つが発行されます。コンシューマキーについては好きなものに変更できますが、ここではアプリケーションのガジェットXMLぽいURLにしてみました。後で必要になりますので、どこかにコピペっておきましょう。</p>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-4.jpg"><img class="alignnone size-full wp-image-111" title="MySpaceAppDomain" src="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-4.jpg" alt="" width="500" height="309" /></a></p>
<p>次に、同じページの下の方にExternal Site Settingsという項目があります。これがData Availabilityの肝です。</p>
<ul>
<li>Use External Domainにチェックを入れる</li>
<li>External URLにMySpaceからの誘導先URLを入力</li>
<li>External Domainに実際に外部アプリを置くサーバーのドメインを入力</li>
<li>利用規約を読んで同意</li>
</ul>
<p>これで準備オッケー。</p>
<h2>OAuthを実装する</h2>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-3.jpg"><img class="alignnone size-full wp-image-101" title="Inbound OAuth" src="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-3.jpg" alt="" width="500" height="148" /></a></p>
<p>今回試すのは上図の外部サービス、つまりコンシューマに当たる部分です。サービスプロバイダに当たるのはMySpace。ゼロから実装してもよいのですが、せっかく<a href="http://code.google.com/p/oauth/" target="_blank">便利なライブラリ</a>がありますので、これのPHP版を使って試してみます。また、署名方式はHMAC-SHA1を使います。</p>
<p>OAuthのフローは下記の通り。<a href="http://www.atmarkit.co.jp/fsecurity/special/106oauth/oauth01.html" target="_blank">この辺り</a>を読んで仕様を理解しておく事をお勧めします。</p>
<ol>
<li>リクエストトークンを取得</li>
<li>ユーザー認証</li>
<li>アクセストークンを取得</li>
<li>リソースにアクセス</li>
</ol>
<h3><strong>リクエストトークンを取得</strong></h3>
<p>必要なライブラリをインクルードします。</p>
<pre class="brush: php;">require_once 'oauth/OAuth.php';
require_once 'oauth/OAuth_TestServer.php';</pre>
<p>各種変数をセットしておきましょう。先程メモった<strong>consumer_key</strong>と<strong>consumer_secret</strong>はここで使います。<strong>リクエストトークン</strong>を取得するためのエンドポイントは<a href="http://developer.myspace.com/community/myspace/dataavailability.aspx" target="_blank">MySpaceのドキュメント</a>に記載されています。</p>
<pre class="brush: php;">$consumer['key'] = 'http://devlab.agektmr.com/MyOpenSpace/DataAvailabilityExample';
$consumer['secret'] = '************';
$endpoint = 'http://api.myspace.com/request_token';</pre>
<p>署名のロジックはめんどくさいのでライブラリにお任せ。</p>
<pre class="brush: php;">$server = new TestOAuthServer(new MockOAuthDataStore());
$server-&gt;add_signature_method(new OAuthSignatureMethod_HMAC_SHA1());

$sig_methods = $server-&gt;get_signature_methods();
$sig_method = $sig_methods['HMAC-SHA1'];

$consumer = new OAuthConsumer($consumer['key'], $consumer['secret'], NULL);
$request = OAuthRequest::from_consumer_and_token($consumer, NULL, &quot;GET&quot;, $endpoint, null);
$request-&gt;sign_request($sig_method, $consumer, NULL);

$req = curl_init($request);
curl_setopt($req, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($req);</pre>
<p>ここまでのコードで$resultにリクエストトークンが返ってくることになります。URLのquery部と同じ形式で返ってきますので、必要に応じてパースしましょう。</p>
<pre class="brush: php;">parse_str($result, $tmp);</pre>
<p>これで、<strong>oauth_token</strong>と<strong>oauth_token_secret</strong>が取得できたはずです。</p>
<h3>認証</h3>
<p>次にユーザーに認証を行ってもらいます。エンドポイントはhttp://api.myspace.com/authorizeで行います。その際、先程取得した<strong>oauth_token</strong>と<strong>oauth_callback</strong>をパラメータとして付属します。oauth_callbackは認証後に呼び出されるページのURL。</p>
<pre class="brush: php;">$callback_url = 'http://devlab.agektmr.com/MyOpenSpace/access.php';
$auth_url = 'http://api.myspace.com/authorize?oauth_token='.urlencode($tokens['oauth_token']).
    '&amp;oauth_callback='.urlencode($callback_url);</pre>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-2.jpg"></a><a href="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-5.jpg"><img class="alignnone size-medium wp-image-115" title="MySpaceAppAuth" src="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-5-300x288.jpg" alt="" width="300" height="288" /></a></p>
<h3>アクセストークンを取得</h3>
<p>先程指定したoauth_callbackのURLに<strong>oauth_token</strong>をパラメータとして付属してリダイレクトされてきます。これはこのoauth_tokenが認証済みであることを示しており、<strong>アクセストークン</strong>への交換が可能となります。</p>
<pre class="brush: php;">$consumer = new OAuthConsumer($consumer['key'], $consumer['secret'], NULL);
$tokener  = new OAuthConsumer($tokens['oauth_token'], $tokens['oauth_token_secret']);
$access = OAuthRequest::from_consumer_and_token($consumer, $tokener, &quot;GET&quot;, $endpoint, null);
$access-&gt;sign_request($sig_method, $consumer, $tokener);

$req = curl_init($access);
curl_setopt($req, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($req);</pre>
<p>コードはリクエストトークン取得の際とあまり変わりありません。これでアクセストークンの<strong>oauth_token</strong>と<strong>oauth_token_secret</strong>が返っきたら準備オッケー。</p>
<h3>RESTful APIを叩く</h3>
<p>ここまでに取得した<strong>consumer_key</strong>、<strong>consumer_secret</strong>、<strong>oauth_token</strong>、<strong>oauth_token_secret</strong>を使って署名したOAuthリクエストをRESTful APIに投げることにより、友達リストなどのデータ取得が可能になります。</p>
<pre class="brush: php;">$consumer = new OAuthConsumer($consumer['key'], $consumer['secret'], NULL);
$tokener  = new OAuthConsumer($tokens['oauth_token'], $tokens['oauth_token_secret']);
$resource = OAuthRequest::from_consumer_and_token($consumer, $tokener, &quot;GET&quot;, $endpoint, array('format'=&gt;'JSON'));
$resource-&gt;sign_request($sig_method, $consumer, $tokener);

$req = curl_init($resource);
curl_setopt($req, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($req);</pre>
<p>これでエンドポイント($endpoint)を取得したいリソースのURLにすればOK。レスポンスボディにJSON形式でデータが返ってきます。</p>
<h2>サンプルアプリ</h2>
<p>上記コードを使って一連の流れを見ながら動作を確認できるサンプルを用意しました。どういうリクエストを投げるのか参考になると思います。</p>
<p style="text-align: center;"><a href="http://devlab.agektmr.com/DataAvailability/" target="_blank">実際に動作するサンプルはコチラ</a></p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/107/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSocialのOAuthまとめ</title>
		<link>http://devlog.agektmr.com/en/archives/79</link>
		<comments>http://devlog.agektmr.com/en/archives/79#comments</comments>
		<pubDate>Fri, 01 Aug 2008 15:50:46 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OAuth]]></category>
		<category><![CDATA[OpenSocial]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=79</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F79", "style": "big", "title":  [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F79%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22OpenSocial%E3%81%AEOAuth%E3%81%BE%E3%81%A8%E3%82%81%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F79", "style": "big", "title": "OpenSocialのOAuthまとめ" });</script></div>
<p>OpenSocialでは、コンテナが外部サーバーとの通信を行う際、または外部サーバーがコンテナと通信を行う際、OAuthを使用して認可を行います。今回はOpenSocialにおけるOAuthについて、現段階でのまとめを書いてみます。  ※追記(2008/10/20)：2008/10/4に書いた<a href="http://devlog.agektmr.com/archives/174">コチラ</a>の記事も必読です。</p>
<h2>OAuthって何だったっけ？</h2>
<p>OAuthは<strong>ユーザー</strong>、<strong>コンシューマ</strong>、<strong>サービスプロバイダ</strong>の3者間でデータのやり取りを行うとした場合、ユーザーがコンシューマにクレデンシャル(IDやパスワード)を渡すことなく、ユーザーが所有するサービスプロバイダ上の<strong>リソース</strong>にコンシューマをアクセスさせるためのものです。  例えば<strong>ユーザー</strong>が<strong>Google(サービスプロバイダ)</strong>の<strong>アドレス帳(リソース)</strong>を<strong>MySpace(コンシューマ)</strong>上で利用するシーンを思い浮かべてください。OAuthがなければ、MySpaceにGoogleのIDとパスワードを預けなければならなかったものが、OAuthを使うことで、ユーザーが直接Googleと認証のやりとりを行い、MySpaceにGoogleのID/パスワードを渡すことなく、アドレス帳のデータをMySpaceに渡すことができるようになります。</p>
<h2>2種類のOAuth</h2>
<p>さて、そんな便利なOAuthですが、OpenSocialで利用されるものには2種類あります。</p>
<h3>OAuth Core</h3>
<p><a href="http://oauth.net/core/1.0/" target="_blank">OAuth Core</a>では、先程説明したように、<strong>ユーザー</strong>、<strong>コンシューマ</strong>、<strong>サービスプロバイダ</strong>の3者間でやり取りを行います。ベーシックなものですので、詳細については<a href="http://www.atmarkit.co.jp/fsecurity/special/106oauth/oauth01.html" target="_blank">この辺</a>りを参考にしてください。</p>
<h3>OAuth Consumer Request</h3>
<p>一方<a href="http://oauth.googlecode.com/svn/spec/ext/consumer_request/1.0/drafts/1/spec.html" target="_blank">OAuth Consumer Request</a>は、OAuthの仕様からユーザー認証部分を除き、コンシューマとサービスプロバイダのやり取りにフォーカスした仕様で、一般に&#8221;<strong>two-legged OAuth</strong>&#8220;と呼ばれます。これはコンシューマとサービスプロバイダの信頼関係だけで、ユーザーによる認証を伴わない仕様のため、<span style="text-decoration: line-through;">コンシューマがサービスプロバイダからパブリックな情報を取得したい場合に利用するケースが想定されます。</span> (かなり恥ずかしい間違いです。正確には<strong>コンシューマが署名を付加することで、サービスプロバイダがリクエスト元とリクエスト内容に間違いがないことを確認できる仕様</strong>、です。/ 2009年10月追記)ちなみにOpenSocial v0.7ではOAuth Coreの利用は仕様に含まれておらず、このtwo-legged OAuthを利用することになっています。OAuth Coreが利用できるのはOpenSocial v0.8以降での話になります(もちろん、two-legged OAuthも利用できます)。</p>
<h2>OpenSocialにおけるOAuth利用パターン</h2>
<p>OpenSocialでOAuthを利用する形態として、さらに2通りが考えられます。</p>
<h3>ガジェットが外部サーバーとやり取りを行うOutbound OAuth</h3>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-1.jpg"><img class="alignnone size-medium wp-image-100" title="Outbound OAuth" src="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-1-300x95.jpg" alt="" width="300" height="95" /></a> ここでは仮に<strong>Outbound OAuth</strong>と呼びます。type=&#8221;html&#8221;で作られたガジェットが、SNSコンテナをプロキシとしてコンシューマの役割を果たし、サービスプロバイダとなる外部サーバーとmakeRequestで通信を行うケースです。</p>
<h3>外部サーバーがコンテナとやり取りを行うInbound OAuth</h3>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-3.jpg"><img class="alignnone size-medium wp-image-101" title="Inbound OAuth" src="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-3-300x88.jpg" alt="" width="300" height="88" /></a> ここでは仮に<strong>Inbound OAuth</strong>と呼びます。コンシューマとなる外部サーバーがサービスプロバイダであるSNSコンテナのRESTful APIを叩くケースです。type=&#8221;url&#8221;のガジェットが外部サーバーを通してSNSコンテナのRESTful APIを叩くケースもこれに該当します。</p>
<h2>OAuthの利用に必要なもの</h2>
<p>OAuthの利用には前提条件がいくつか存在します。細かい仕様は別途調べていただくとして、事前に必要な条件が下記になります。</p>
<ul>
<li>コンシューマが、サービスプロバイダの発行する以下を事前に知っていること。
<ul>
<li>コンシューマキー(consumer_key)</li>
<li>コンシューマシークレット(consumer_secret)</li>
</ul>
</li>
<li>コンシューマが、サービスプロバイダとOAuthのやり取りを行う以下3つのURLを知っていること
<ul>
<li>サービスプロバイダのリクエストトークンURL</li>
<li>サービスプロバイダのアクセストークンURL</li>
<li>サービスプロバイダの認証URL</li>
</ul>
</li>
</ul>
<p>※追記(2008/10/20)：コンシューマシークレットについては、署名方式がRSA-SHA1の場合、必須ではありません。詳しくは<a href="http://devlog.agektmr.com/archives/174">コチラ</a>。  OAuth利用パターンごとにどのようにしてこの条件をクリアするかを検証してみます。</p>
<h3>Outbound OAuthのケース</h3>
<p>ガジェットが外部サーバーとやり取りを行うケースですので、まずはガジェット開発者がSNSコンテナにコンシューマキーとコンシューマシークレットを登録します。ですが僕の知る限り、まだ<strong>Outbound OAuthを実装しているSNSはありません</strong>。なので、ここでは何かしらの手段を用いて(SSLページでFormを使って投稿等)、コンシューマキーとコンシューマシークレットをコンテナに渡したものと想定してください。(今後順次、これを実現する方法は登場するものと思われます。)  次に、サービスプロバイダの各種URLを渡す必要がありますが、v0.8ではガジェットXMLで渡すよう規定されています。OAuthをModulePrefsの中に作成してください。</p>
<pre class="brush: xml;">
&lt;oauth&gt;
&lt;service name="google"&gt;
&lt;request url="https://www.google.com/accounts/OAuthGetRequestToken?scope=http://www.google.com/m8/feeds/" /&gt;
&lt;access url="https://www.google.com/accounts/OAuthGetAccessToken" /&gt;
&lt;authorization url="https://www.google.com/accounts/OAuthAuthorizeToken" /&gt;
&lt;/service&gt;
&lt;/oauth&gt;
</pre>
<p>OAuthは必ずしも1つのサーバーとやり取りするとは限りませんので、Serviceを追加することで複数をサポートすることができるようになっています。Service@nameで使い分けることが出来るようになっていますので、必要に応じてmakeRequestのopt_paramsに下記のパラメータを加え、サービスを指定してください。</p>
<pre>gadgets.io.RequestParameters.OAUTH_SERVICE_NAME</pre>
<p>サービスプロバイダとOAuthのやり取りを行うURLについては、XRDS-Simpleによって解決する方法もありますが、こちらについては別の機会にまとめてご紹介します。</p>
<h3>Inbound OAuthのケース</h3>
<p>外部アプリケーションがSNSコンテナのRESTful APIにアクセスする場合になります。これはまさに、FacebookのFacebook ConnectやMySpaceのData Availability、GoogleのFriendConnectに該当するもので、まだ実験的な段階にあると言えるものです。  コンシューマキーとコンシューマシークレットですが、SNSコンテナ上でアプリケーションを登録することで発行されます。それをディベロッパがメモ/コピペしてコンシューマとなるサーバーのコードに埋め込みましょう。URLについては、単純にヘルプページを見る方法と、XRDS-Simpleによるオートディスカバリを行う方法が考えられます。</p>
<h2>まとめ</h2>
<p>今回は大まかな話を書きましたが、次回は実際にMySpaceのData Availabilityを使ってOAuth認証を行い、データを取得するところまでを試してみたいと思います。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/79/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OpenSocial API仕様(v0.8)を翻訳しました</title>
		<link>http://devlog.agektmr.com/en/archives/78</link>
		<comments>http://devlog.agektmr.com/en/archives/78#comments</comments>
		<pubDate>Wed, 09 Jul 2008 15:30:27 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OpenSocial]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=78</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F78", "style": "big", "title":  [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F78%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22OpenSocial%20API%E4%BB%95%E6%A7%98%28v0.8%29%E3%82%92%E7%BF%BB%E8%A8%B3%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F78", "style": "big", "title": "OpenSocial API仕様(v0.8)を翻訳しました" });</script></div>
<p><a href="http://devlog.agektmr.com/wiki/index.php?cmd=read&amp;page=OpenSocial%2FOpenSocial%20API仕様%20%28v0.8%29">OpenSocial API仕様(v0.8)</a></p>
<p>一ヶ月くらい前から出来てたのですが、一応ブログ記事にも書いておきます。何か間違い等ありましたらお知らせください。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/78/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FriendConnectから垣間見える未来のソーシャルウェブ</title>
		<link>http://devlog.agektmr.com/en/archives/77</link>
		<comments>http://devlog.agektmr.com/en/archives/77#comments</comments>
		<pubDate>Thu, 19 Jun 2008 17:49:38 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[DataPortability]]></category>
		<category><![CDATA[FriendConnect]]></category>
		<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[SocialWeb]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[PortableContacts]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=77</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F77", "style": "big", "title":  [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F77%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22FriendConnect%E3%81%8B%E3%82%89%E5%9E%A3%E9%96%93%E8%A6%8B%E3%81%88%E3%82%8B%E6%9C%AA%E6%9D%A5%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB%E3%82%A6%E3%82%A7%E3%83%96%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F77", "style": "big", "title": "FriendConnectから垣間見える未来のソーシャルウェブ" });</script></div>
<p>今更ですが、先日サンフランシスコで開かれたGoogle I/Oに参加してきました。</p>
<p>その中でも特に印象に残ったのが、PlaxoのJoseph Smarr氏によるOpenSocial, OpenID, and OAuth: Oh My!というセッション。僕が見たセッションの中ではダントツの人気で、部屋に用意された椅子はもちろん、立ち見で人が溢れ返るほどの盛況ぶり。</p>
<p>内容は、ソーシャルウェブの未来について。現在はOpenSocialというソーシャルグラフを所有するサービスに閉じた世界が中心となりつつありますが、少し未来のウェブはOpenSocial, OpenID, OAuth, <a href="http://www.portablecontacts.net/" target="_blank">PortableContacts</a>等の技術によって、よりグローバルな意味でのソーシャル化が図れるようになる、というものです。</p>
<p>詳細は<a href="http://sites.google.com/site/io/opensocial-openid-and-oauth-oh-my" target="_blank">Google Codeにビデオとスライドがアップされています</a>ので、ご覧ください。かなり早口ですが、大変面白い内容です。</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="wmode" value="transparent" /><param name="src" value="http://www.youtube.com/v/6SYnlH5FXz0" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/6SYnlH5FXz0" wmode="transparent"></embed></object></p>
<h2>OpenSocialとFriendConnectの持つ意味</h2>
<p>OpenSocialにはv0.7まで、JavaScriptのAPIしか存在していませんでした。これはOpenSocialコンテナにとっては外部サービスからガジェットとしてアプリケーションを追加してもらい、そのOpenSocialコンテナが持つソーシャルグラフに閉じた形で利用されるものでした。アプリケーション開発者はOpenSocialのJavaScript APIを使い、ガジェットが置かれているコンテナサイトの友達リストを取得し、そこでアプリケーションを動かすことができます。もちろん、ガジェットを自分のサービスドメイン上でホスティングすることも可能ですが、ガジェットはコンテナ上でしか動作せず、友達リストを外部サービスとしてインポートしたりといったことも不可能で、実質的に囲い込みサービスしか生まれないものと言えたでしょう。</p>
<p>それがOpenSocial v0.8 + FriendConnectによって一気に世界を広げます。ユーザーはFriendConnect対応サイトを利用するに当たり、OAuthを使って自分が利用したいSNSサービスを選ぶ権利が与えられています。同時に、そのサイト上での活動内容は連携を選択したSNSサービスに戻されます。</p>
<p>ここでソーシャルサービスの要素を思い出してください。</p>
<ol>
<li>アイデンティティ</li>
<li>ソーシャルグラフ(友達リスト)</li>
<li>エントリの公開範囲の制御(プライバシー)</li>
<li>フィード</li>
</ol>
<p><strong>FriendConnectはアイデンティティをOpenIDで、ソーシャルグラフをOpenSocial v0.8のRESTful APIで、エントリの公開範囲の制御をOAuthで、フィードをActivity Streamで解決しようとしています。</strong></p>
<p>これらの意味するところを深く見つめて行くと、未来のソーシャルウェブが自ずと見えてきます。</p>
<h2>Joseph Smarr氏(Plaxo)による未来のソーシャルウェブ論</h2>
<p>FriendConnectのイメージをさらに深めるため、Joseph Smarr氏が、PlaxoのFriendConnect対応に際してアップしていたブログエントリをご紹介します。</p>
<p><a class="entryheader" href="http://blog.plaxo.com/archives/2008/06/plaxo_and_frien_1.html">Plaxo and FriendConnect are now Best Friends</a></p>
<blockquote><p>Plaxoが完全にFriendConnectと連携した。FriendConnectとは、あらゆるサイトをソーシャル化する、Googleによるウィジェットベースのツールである。これにより、FriendConnectに対応していれば、どんなサイトでもPlaxoアカウントに安全に接続し、サイト上に自分の友達がいるかを確認したり、友達を招待したりといったことができるようになる。何よりも素晴らしいのは、そのサイトでの活動内容をPulseに流し込むことができるようになり、Plaxoでの友達がウェブを跨いであなたと連絡を取り合うことができ、あなたが発見した新しいサイトを知ることができる点だ。</p>
<p>これは本当に便利でわくわくする連携機能だ &#8212; これはユーザーが自分のアイデンティティと関係をウェブ上のどこでも利用できるようにし、新しいサイトで知人を見つけ出し、活動内容を既存の友達に共有し、よりソーシャルな発見と共有という徳の高いサイクルを生み出す、<a href="http://therealmccrea.com/2008/05/02/can-lifestreaming-and-aggregation-go-mainstream/" target="_blank">シームレスソーシャルウェブエコシステム</a>にさらに近付いたと言える。これこそソーシャルウェブの進むべき道だ &#8212; (現在あるほとんどのサービスがそうだが)新しいソーシャルサイトを使い始める度に最初からやり直さなければならないなんてとんでもない。あなたの新しい体験全てが、他の人をも魅了すべきだ。</p>
<p>これはサービスがユーザーに自分の持つデータの制御を与え、オープンスタンダードを使って安全なアクセス権を提供することによってのみ成り立つ。そしてこれこそまさに、PlaxoがFriendConnectを使ってやりたかったことだ。Plaxoアカウントを接続する際、我々は<a href="http://oauth.net/" target="_blank">OAuth</a>を使う。そのため、Plaxoのパスワードを渡す必要もないし、後で接続を断つことも可能だ。FriendConnectを使ってあなたが活動内容をPulseに共有する際は、<a href="http://devlog.agektmr.com/wiki/index.php?cmd=read&amp;page=OpenSocial%2FRESTful%20API%20Specification" target="_blank">OpenSocial 0.8 RESTful Activities API</a>を利用する。オープンスタンダードではない連携はアドレス帳APIのみであり、我々はこのスタンダードについても<a href="http://portablecontacts.net/" target="_blank">取り組みを開始している</a>。我々は<a href="http://blog.plaxo.com/archives/2008/05/plaxo_becomes_s.html" target="_blank">アイデンティティプロバイダとして、ソーシャルグラフプロバイダとして、そしてコンテンツアグリゲータとしての役割</a>を果たしていると強く信じている &#8212; つまり、我々はユーザーが自身のデータと関係性をウェブ上のどこにでも持ち回り、どこからでも共有できるようにしている &#8212; これはユーザーにとっても、Plaxoにとっても、ウェブ全体にとっても有益なことだ。だが、まだこの取り組みは始まったばかり &#8212; FriendConnect対応サイトから活動内容を共有する際、家族や友達、仕事関係など、共有相手をより細かい粒度で制御するなどの、更なる拡張を楽しみにしていて欲しい。</p>
<p>下のスクリーンショットはPlaxoとGoogle FriendConnectの連携したものだ &#8212; <a href="http://www.google.com/friendconnect/home/examples" target="_blank">FriendConnectを利用しているサイト</a>でも体験してもらうことができる。</p></blockquote>
<p>画像は<a href="http://blog.plaxo.com/archives/2008/06/plaxo_and_frien_1.html" target="_blank">実際のページ</a>をご覧下さい。</p>
<h2>まとめ</h2>
<p>ガジェットコンテナとしてのOpenSocialには正直、懐疑的な部分があったのですが、FriendConnectの描く未来を想像し、またわくわくしています。今後もこの辺りの動向を追って行きます。</p>
<h2>追記</h2>
<p>似たような話題に触れた記事を見つけたので追記し、トラバっておく。(失敗したので断念○|￣|＿)</p>
<p><a href="http://japan.cnet.com/special/story/0,2000056049,20375542,00.htm" target="_blank">グーグルが見たソーシャルネットワーキング&#8211;その3つの傾向:スペシャルレポート &#8211; CNET Japan</a></p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/77/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OpenSocial RESTful API Specificationを翻訳しました</title>
		<link>http://devlog.agektmr.com/en/archives/76</link>
		<comments>http://devlog.agektmr.com/en/archives/76#comments</comments>
		<pubDate>Mon, 16 Jun 2008 08:51:07 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[RESTful API]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=76</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F76", "style": "big", "title":  [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F76%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22OpenSocial%20RESTful%20API%20Specification%E3%82%92%E7%BF%BB%E8%A8%B3%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F76", "style": "big", "title": "OpenSocial RESTful API Specificationを翻訳しました" });</script></div>
<p>これまで公開していたOpenSocial RESTful API Proposalの翻訳を、OpenSocial v0.8仕様のリリースで公開された<a href="http://devlog.agektmr.com/wiki/index.php?cmd=read&amp;page=OpenSocial%2FRESTful%20API%20Specification" target="_blank">OpenSocial RESTful API Specification</a>に置き換えました。</p>
<p>ただし部分更新処理の項目についてはTBD(To Be Determined)のままになっています。問い合わせしているので、最新版に更新され次第アップします。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/76/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>OpenSocialのAtomPubはXRDS-Simpleでディスカバリ</title>
		<link>http://devlog.agektmr.com/en/archives/75</link>
		<comments>http://devlog.agektmr.com/en/archives/75#comments</comments>
		<pubDate>Thu, 12 Jun 2008 02:52:55 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[AtomPub]]></category>
		<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[Service Document]]></category>
		<category><![CDATA[XRDS-Simple]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=75</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F75", "style": "big", "title":  [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F75%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22OpenSocial%E3%81%AEAtomPub%E3%81%AFXRDS-Simple%E3%81%A7%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AB%E3%83%90%E3%83%AA%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F75", "style": "big", "title": "OpenSocialのAtomPubはXRDS-Simpleでディスカバリ" });</script></div>
<p><a href="http://code.google.com/apis/opensocial/docs/0.8/restfulspec.html " target="_blank">OpenSocial v0.8のRESTful API仕様</a>では、オートディスカバリに<a href="http://xrds-simple.net/core/1.0/" target="_blank">XRDS-Simple</a>を利用するよう規定されています。</p>
<p>他方、OpenSocial v0.8で利用されるRESTful APIは<a href="http://tools.ietf.org/html/rfc5023" target="_blank">AtomPub</a>形式となっており、AtomPubではService Documentを利用するよう規定されています。</p>
<p>これではコンテナサイトがどちらを使うのか、両方使うべきなのか疑問が残ってしまいます。この件について、<a href="http://groups.google.com/group/opensocial-and-gadgets-spec" target="_blank">Google GroupsのOpenSocialの仕様を検討するグループ</a>に<a href="http://groups.google.com/group/opensocial-and-gadgets-spec/browse_thread/thread/a447a1f155f4f06b" target="_blank">質問</a>を投げてみました。</p>
<p>質問</p>
<blockquote><p>コンテナサイトはAtomPubのService DocumentとXRDS-Simple、どちらを採用すべきなのでしょうか？両方サポートすべきでしょうか？</p></blockquote>
<p>David Primmer氏の回答</p>
<blockquote><p>AtomPubのService DocumentはURLの一部をテンプレート的に定義して変数を当てはめる用途には向いていない。ある程度固定されたURL上で指定することを想定されているようだ。<br />
その点、XRDS-Simpleは空白に値を埋める形でURLをディスカバリできる点で優れている。</p></blockquote>
<p>この点に関しては、AtomPubのPerlライブラリを実装された<a href="http://teahut.sakura.ne.jp/b/2008-04-09-1.html" target="_blank">たけまるさんも指摘</a>されていて、XRDS-Simpleを利用する方が合理的であるという点では一致しています。</p>
<p>ただ、仕様に適合しないという意味では気持ちの悪いものであることは間違いなく、この点をどこかで解決できないかと考えています。先ほど紹介したGoogle Groupsで「AtomPubの仕様作成者に仕様変更の提案を行う予定はあるか」との質問を投げたのですが、その後応答はありません。</p>
<p>現時点でRod Yatesという方から<a href="http://tools.ietf.org/html/draft-snell-atompub-feature-12" target="_blank">こちらの仕様書</a>から適用できるのではないかとの提案を頂いているので、AtomPub識者の方と相談して何かしらの働きかけを行っていこうと思います。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/75/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSocialコンテナの対応状況を調べるガジェット</title>
		<link>http://devlog.agektmr.com/en/archives/73</link>
		<comments>http://devlog.agektmr.com/en/archives/73#comments</comments>
		<pubDate>Mon, 02 Jun 2008 15:34:40 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[Gadget]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=73</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F73", "style": "big", "title":  [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F73%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22OpenSocial%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E5%AF%BE%E5%BF%9C%E7%8A%B6%E6%B3%81%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%8B%E3%82%AC%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F73", "style": "big", "title": "OpenSocialコンテナの対応状況を調べるガジェット" });</script></div>
<p>OpenSocialコンテナにも<a href="http://www.orkut.com/Home.aspx" target="_blank">Orkut</a>, <a href="http://hi5.com/" target="_blank">hi5</a>, <a href="http://www.myspace.com/" target="_blank">MySpace</a>だけでなく、<a href="http://www.google.com/ig?hl=en" target="_blank">iGoogle</a>, <a href="http://www.hyves.nl/" target="_blank">hyves</a>, <a href="http://en.netlog.com/" target="_blank">Netlog</a>などが登場してきました。</p>
<p>それぞれのSNSには特徴がありますが、仕様をいちいち調べたり、開発に当たって動作確認を行うのは面倒です。現在OpenSocial v0.8は登場したばかりということもあり、ほとんどがv0.7対応のものですが、v0.7への対応状況を確認できるガジェットというのがあります。</p>
<address>http://opensocial-resources.googlecode.com/svn/tests/trunk/compliancetests.xml</address>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/06/compliancetest.jpg"><img class="alignnone size-medium wp-image-74" title="compliancetest" src="http://devlog.agektmr.com/wp-content/uploads/2008/06/compliancetest-257x299.jpg" alt="" width="257" height="299" /></a></p>
<p>これで開発も少しは楽になるのではないでしょうか。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/73/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>オープンソースのShindig対応SNS &#8211; Partuza!</title>
		<link>http://devlog.agektmr.com/en/archives/71</link>
		<comments>http://devlog.agektmr.com/en/archives/71#comments</comments>
		<pubDate>Mon, 02 Jun 2008 15:18:10 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[Partuza!]]></category>
		<category><![CDATA[Shindig]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=71</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F71", "style": "big", "title":  [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F71%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AEShindig%E5%AF%BE%E5%BF%9CSNS%20-%20Partuza%21%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F71", "style": "big", "title": "オープンソースのShindig対応SNS - Partuza!" });</script></div>
<p>OpenSocialのコンテナと言えば<a href="http://devlog.agektmr.com/archives/tag/shindig" target="_blank">Shindig</a>ですが、PHP版は既にOpenSocial v0.7への対応を完了しています。<a href="http://code.google.com/p/partuza/" target="_blank">Partuza!</a>はPHP版Shindigの開発者であるChris Chabot氏がオープンソースで開発したShindig対応SNSです。</p>
<p>Shindigがコンテナなのに、じゃあPartuza!は何をするの？と思われるかもしれません。今回はインストール方法と、Shindigとの関係について解説します。</p>
<h2>Partuza!をインストールする</h2>
<p><a href="http://devlog.agektmr.com/archives/11" target="_blank">Shindigのインストール方法は以前解説しました</a>ので、ここでは割愛します。仮に、Shindigが~/shindig配下にインストールされ、http://localhost:8080/gadgets/&#8230;でアクセスできるものとします。</p>
<p>まず、環境としてApache、PHP5(要mcrypt)、MySQL5が必須となります。</p>
<h3>レポジトリからチェックアウト</h3>
<p>Google CodeのレポジトリからSVNでチェックアウトします。</p>
<pre>&gt; svn checkout <strong><em><span style="font-style: normal;"><span style="font-weight: normal;">http</span></span></em></strong>://partuza.googlecode.com/svn/trunk/ ~/partuza</pre>
<h3>データベースを用意</h3>
<p>適当なデータベース名、ユーザー名、パスワードで空のDBを作ってください。ひとまずここではそれぞれ、partuza、root、パスワードなしとします。この状態で、~/partuza/partuza.sqlをダンプします。</p>
<pre>&gt; mysql -u root partuza &lt; partuza.sql</pre>
<h3>DocumentRootを設定</h3>
<p>Apacheの設定(httpd.conf)でDocumentRootを~/partuza/htmlに設定し、http://localhost/でアクセスできるようにします。もちろん、Shindigとは別ドメインを用意する必要がありますので、バーチャルホストを使う等してください。</p>
<h3>設定ファイルを修正</h3>
<p>~/partuza/html/config.phpを編集します。ここでは先程作成したデータベース関連の情報とガジェットサーバーのルートURL(gadget_server)を設定します。ガジェットサーバーのURLが、ここではShindigのURLとなりますので、http://localhost:8080/になります。</p>
<h3>データベースハンドラをコピー</h3>
<p>~/partuza/Shindig/PartuzaDbFetcher.phpと~/partuza/Shindig/PartuzaHandler.phpを~/shindig/php/src/socialにコピーします。</p>
<pre>&gt; cp ~/partuza/Shindig/Partuza* ~/shindig/php/src/social</pre>
<h3>Shindigのデータベース設定を修正</h3>
<p>~/shindig/php/src/social/PartuzaDbFetcher.phpにもデータベース関連の情報があるので修正します。加えてShindigがデータベースハンドラを利用するよう、~/shindig/php/config.phpも修正します。ここでは、&#8221;handlers =&gt; PartuzaHandler&#8221;としてください。</p>
<p>これで一通りの準備は完了。http://localhost/にアクセスしてウェルカム画面が出れば成功です。このまま登録し、Orkutライクな一般的なSNSとして利用することができます。</p>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/05/partuza.jpg"><img class="alignnone size-medium wp-image-72" title="partuza" src="http://devlog.agektmr.com/wp-content/uploads/2008/05/partuza-300x185.jpg" alt="" width="300" height="185" /></a></p>
<h2>Partuza!とShindigの関係</h2>
<p>OpenSocialのガジェットがiframeを介して表示されていることは以前も解説しましたが、簡単に言ってしまえば、iframeの手前がPartuza、後ろがShindigになります。Shindigでは以前から下記のURLにアクセスすることで簡易的なHTMLからOpenSocialぽい表示を行うことはできていましたが、Partuzaを使うことで完全なSNSとなります。</p>
<address>http://localhost:8080/gadgets/files/samplecontainer/samplecontainer.html</address>
<p>とはいえ、PartuzaHandlerを指定したところからも想像できるように、データベースは共有されます。なお、<a href="http://partuza.us.chabotc.com/" target="_blank">Chris Chabot氏のサイト</a>で実際に動いているものを確認することができます。</p>
<p>Partuza!を使うことで、どうすればShindigをSNSに組み込むことができるかの解析をすることができるだけでなく、そのままちょっとしたSNSを開発することもできてしまいます。ぜひお試しください。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/71/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
