<?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; Shindig</title>
	<atom:link href="http://devlog.agektmr.com/ja/archives/tag/shindig/feed" rel="self" type="application/rss+xml" />
	<link>http://devlog.agektmr.com</link>
	<description>未来のソーシャルウェブを夢見るブログ</description>
	<lastBuildDate>Tue, 10 Aug 2010 15:55:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>JA</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>「OpenSocialのアーキテクチャ」スライドを公開します</title>
		<link>http://devlog.agektmr.com/ja/archives/683</link>
		<comments>http://devlog.agektmr.com/ja/archives/683#comments</comments>
		<pubDate>Sat, 14 Nov 2009 14:50:21 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[イベント]]></category>
		<category><![CDATA[勉強会]]></category>
		<category><![CDATA[Shindig]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/ja/?p=683</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F683", "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%252Fja%252Farchives%252F683%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%E3%80%8COpenSocial%E3%81%AE%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%80%8D%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89%E3%82%92%E5%85%AC%E9%96%8B%E3%81%97%E3%81%BE%E3%81%99%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F683", "style": "big", "title": "「OpenSocialのアーキテクチャ」スライドを公開します" });</script></div>
<p>去る11月11日にリクルートメディアテクノロジーラボの「カフェ」でTokyo GTUG(Google Technology User Group) #4のイベントが開催されました。テーマはOpenSocialで、今回は「OpenSocialのアーキテクチャ」というテーマで講演させて頂きましたので、スライドを公開します。</p>
<div id="__ss_2499345" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="OpenSocialのアーキテクチャ" href="http://www.slideshare.net/agektmr/opensocial-2499345">OpenSocialのアーキテクチャ</a><object style="margin:0px" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=opensocial-091114084123-phpapp01&amp;stripped_title=opensocial-2499345" /><param name="allowfullscreen" value="true" /><embed style="margin:0px" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=opensocial-091114084123-phpapp01&amp;stripped_title=opensocial-2499345" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">documents</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/agektmr">Eiji Kitamura</a>.</div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/ja/archives/683/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Snow LeopardにMySQLをインストールする</title>
		<link>http://devlog.agektmr.com/ja/archives/673</link>
		<comments>http://devlog.agektmr.com/ja/archives/673#comments</comments>
		<pubDate>Thu, 10 Sep 2009 17:25:23 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Partuza!]]></category>
		<category><![CDATA[Shindig]]></category>
		<category><![CDATA[Snow Leopard]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/ja/?p=673</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F673", "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%252Fja%252Farchives%252F673%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Snow%20Leopard%E3%81%ABMySQL%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F673", "style": "big", "title": "Snow LeopardにMySQLをインストールする" });</script></div>
<p>Mac OS XをSnow LeopardにしたらPHPが5.3になってて、PartuzaやShindigを使うのにentropyを入れなくても済んで、とても素敵です。</p>
<p>しかし同環境でMySQLを使うのに、ちょっとごにょごにょしなければならなかったのでメモを残しておきます。(2009年9月現在の情報です)</p>
<h2>MySQLをダウンロード</h2>
<p>MySQLのバイナリを<a href="http://dev.mysql.com/downloads/" target="_blank">こちら</a>からダウンロードします。このページの下の方にあるMac OS X(package format)の中から、(Snow Leopardは10.6ですが)Mac OS 10.5(x86_64)を選びます。</p>
<h2>MySQLをインストール</h2>
<p>インストールはGUIでできます。環境設定項目とスタートアップアイテムもインストールしちゃいます。パスも切っておきましょう。</p>
<p>~/.bash_profileを作るか、既にあれば下記を追記します。</p>
<pre>PATH=$PATH:/usr/local/mysql/bin
export PATH</pre>
<p>さらに</p>
<pre>&gt; source ~/.bash_profile</pre>
<p>とかやれば、即時反映できます。</p>
<h2>ごにょごにょする</h2>
<p>ここからがポイント。</p>
<pre>&gt;  cd /usr/local/mysql
&gt;  sudo ./script/mysql_install_db</pre>
<p>そんで</p>
<pre>&gt;  sudo cp /etc/php.ini.default /etc/php/ini
&gt;  sudo vim /etc/php.ini</pre>
<p>とかやって、</p>
<pre>mysqli.default_socket = /var/mysql/mysql.sock</pre>
<p>の部分を</p>
<pre>mysqli.default_socket = /tmp/mysql.sock</pre>
<p>に書き換えます。</p>
<p>これで、MySQLを立ち上げ直せば、オッケー。環境設定からMySQLをスタートすれば、PHPでMySQLが使えるようになったはず。</p>
<h3>追記</h3>
<p>ちなみにこの設定はPartuzaの動作を確認したのみですので、他のことをやる場合はもう少しいじる必要があると思います。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/ja/archives/673/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shindigのコミッターになりました</title>
		<link>http://devlog.agektmr.com/ja/archives/656</link>
		<comments>http://devlog.agektmr.com/ja/archives/656#comments</comments>
		<pubDate>Sat, 29 Aug 2009 00:19:40 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[SocialWeb]]></category>
		<category><![CDATA[Shindig]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/ja/?p=656</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F656", "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%252Fja%252Farchives%252F656%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Shindig%E3%81%AE%E3%82%B3%E3%83%9F%E3%83%83%E3%82%BF%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F656", "style": "big", "title": "Shindigのコミッターになりました" });</script></div>
<p>「ウェブはソーシャルであるべきだ」。これは今の会社に<br />
入社した2005年くらいからずっと訴えてきたことです。ソーシャルグラフをプラットフォーム化することで実現できることがたくさんあります。まずはポータルサイト全体をソーシャル化することを目標にし、作り上げたのが<a href="http://home.goo.ne.jp/" target="_blank">gooホーム</a>でした。</p>
<p>将来の構想はその時点で既にあって、いずれはポータル外のサイトとも接続して、インターネット全体がソーシャルグラフで繋がることをイメージしていました。そんな時に登場したのが<a href="http://www.facebook.com/" target="_blank">Facebook</a>です。</p>
<p>Facebookがやろうとしていたことは、SNSの中にサービスを取り込むという、僕の考えとは真逆でしたが、結果的にやろうとしていたことは似たようなもので、先に実現されたことにくやしい思いをました。そして<a href="http://www.opensocial.org/" target="_blank">OpenSocial</a>が登場します。</p>
<p>OpenSocialは仕様を民主的に決めて行くオープンなスタイルでした。オープン性のメリットは計り知れません。2つ以上のシステムを繋ぐのに、仕様から作るよりも、既に決まり事があれば話が早いのは火を見るよりも明らかです。技術的工夫もさることながら、コミュニケーションコストは大幅に削減できます。</p>
<p>さらに、オープンな仕様であればそれを使ったプロダクトが生まれやすくもなります。OpenSocial周りでも既に、よういちろうさんの<a href="http://code.google.com/p/opensocial-development-environment/" target="_blank">OpenSocial Development Environment</a>や<a href="http://groups.google.com/group/opensocial-client-libraries" target="_blank">OpenSocial Client Library</a>、OAuth関連ライブラリ、そして僕の作った<a href="http://code.google.com/p/opensocial-signed-request-php-library/" target="_blank">OpenSocial Signed Request Library</a>など、様々なオープンソースプロダクトが生まれ、後発の生産性を上げています。</p>
<p>そんなOpenSocial関連プロダクトの中心となるのが、OpenSocialコンテナのリファレンス実装である<a href="http://incubator.apache.org/shindig/" target="_blank">Shindig</a>です。</p>
<p>僕がOpenSocialの既存仕様を学ぶ上で紐解いたのものこのShindigでした。当時はまだ日本でほとんど手をつけている人がいなかったため、API Expertとして声をかけて頂いたのも、Shindigに関する情報をこのブログで公開していたためです。</p>
<p>その後実際にgooホームでディプロイするに辺り、様々なパッチを書き、Shindigの開発チーム提供してきました。(もちろん、OpenSocialの仕様自体にも口を出してきましたが。)そうこうしているうちに、1年半ほどが経過し・・・</p>
<p><strong>このたび、Shindigの<a href="http://ja.wikipedia.org/wiki/コミッター" target="_blank">コミッター</a>になりました。</strong></p>
<p>PHP版ShindigのメインコミッターであるChris Chabot氏とは、PHP版の最初のコミット前から連絡を取り、昨年のGoogle IOでも直接お会いし、その後もメッセンジャーで話したりしてきましたが、そのChrisにShindigのコミッターに推薦して頂いたのです。</p>
<p>Apache Software Foundationでコミッターになるには、既存コミッターの投票が必要らしいのですが、これまでの貢献を認めてもらい、承認して頂きました。</p>
<p>PHP版Shindigは今や、全世界述べ5億人(!)が26以上のSNSで使っているといいます。にも関わらずフィードバックされていたパッチはそれほど多くなく、自分がやってきたことは貴重だったようです。</p>
<p>本来僕にとってOpenSocialというのは理想のSocialWebを実現するための道具に過ぎないのですが、少なくとも日本では実質的なデファクトであり、mixiやgooホームで使われているShindigというプロダクトは、その根幹を支えるものです。</p>
<p>今後はShindigのコミッターとしても、日本のSocialWebを作り上げ、支えて行ければと思います。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/ja/archives/656/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OpenSocial(Shindig)のサーバーアーキテクチャ</title>
		<link>http://devlog.agektmr.com/ja/archives/363</link>
		<comments>http://devlog.agektmr.com/ja/archives/363#comments</comments>
		<pubDate>Sun, 11 Jan 2009 21:55:08 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[Shindig]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/ja/?p=363&amp;language=ja</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F363", "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%252Fja%252Farchives%252F363%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22OpenSocial%28Shindig%29%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F363", "style": "big", "title": "OpenSocial(Shindig)のサーバーアーキテクチャ" });</script></div>
<p>OpenSocialと関わるには</p>
<ul>
<li>コンテナになる</li>
<li>ガジェットを開発する</li>
<li>RESTを使ったクライアントサービスを作る</li>
</ul>
<p>といった選択肢が考えられますが、そのいずれを選択するにしても、アーキテクチャについて知っておくことはとても重要です。特にガジェットを開発するに当たっては、アーキテクチャを知っていることでより開発しやすい場面が多々あります。</p>
<p>そこで今回は、OpenSocialに対応するコンテナのほとんどで利用されているオープンソースのリファレンス実装、<a target="_blank" href="http://incubator.apache.org/shindig/">Shindig</a>のアーキテクチャについて解説したいと思います。</p>
<h2>ガジェットとSNSの関係</h2>
<p>iGoogle(既にShindigが利用されている)ではどうやって第三者の作ったガジェットを表示しているかご存知でしたか？実は、別ドメイン(iGoogleならgmodules.com)上にレンダリングしたガジェットを、iframe内に表示しているのです。</p>
<p>理由は、同ドメイン上に第三者の書いたJavaScriptを置くことは、セキュリティ上危険だからです。詳しくは以前<a href="http://devlog.agektmr.com/archives/49">Cajaについて解説した記事</a>がありますので、そちらをご覧ください。</p>
<p><img src="/wp-content/uploads/2009/01/e38394e382afe38381e383a3-6.png" alt="OpenSocial Gadget Rendering" /></p>
<h2>APIはどこにあるか</h2>
<p>OpenSocialにはPeople, Group, Activity, Persistentの4つのソーシャルなAPIが用意されていますが、それぞれRESTfulによるJSON, XML, AtomPub形式と、RPCによるJSON形式が用意されています。ShindigのJavaScript APIでは、この中でもRPCによるJSON形式が使用されています。</p>
<p>先ほど2つのドメインについて説明しましたが、JavaScriptのAPIということはAjaxなので、当然同じドメインということで、エンドポイントはShindigのドメイン上に存在します。</p>
<p><img alt="OpenSocial Server Architecture" src="/wp-content/uploads/2009/01/e38394e382afe38381e383a3-7.png" /></p>
<h2>ガジェット表示の流れ</h2>
<p>基本的な構造が分かったところで、実際にガジェットを表示するまでの流れを見てみましょう。</p>
<h3>どのガジェットを表示するのか</h3>
<p>ガジェットを表示するためには、まずガジェットを表示したいというユーザーの意思が必要です。これはiGoogleであれば、ガジェットディレクトリから好きなガジェットを選び、自分のページを表示する、というサービス側での作業によって行われます。表示したいガジェットが分かったところで、サービス側もガジェットを表示するためのiframeを表示する必要があるため、ガジェットに関する情報を収集します。これはShindigのmetadata APIを使って行われます。</p>
<h3>metadataの取得</h3>
<p>metadata APIのリクエストを取得したShindigは、キャッシュを参照します。キャッシュにガジェットの情報が残っていない場合は、サービスからのリクエストに基づいてガジェットXMLを取得し、解析します。</p>
<h3>iframeのレンダリング</h3>
<p>ガジェットに関する情報を取得したサービスは、ガジェットを表示するためiframeをレンダリングします。これにより、iframe内にガジェットを表示するためのリクエストがブラウザからShindigに投げられます。</p>
<p>基本的にガジェットXMLに記述されたContentsの内容はそのまま表示されますが：</p>
<ul>
<li>指定されたガジェットのfeature(tabやminimessageなど、ガジェットが持つ機能セット)のJavaScriptがHTMLに追記される。</li>
<li>設定によってはJavaScript、CSS、画像などのあらゆる外部コンテンツがShindig上にキャッシュして呼び出される。</li>
</ul>
<p>という点は覚えておいて損はないでしょう。</p>
<p>これでガジェットの表示は完了です。Firebugなどを使ってAPIを試してみれば、Shindigにリクエストが飛んでいることが分かると思います。</p>
<h2>外部サーバーを使うAPI</h2>
<p>外部サーバーを使う際、JavaScript APIとしてgadgets.io.makeRequestが使用されます。コンテンツタイプとしてFEEDを選択すると、RSSやRDF、Atomを共通のフォーマットで返してくれたり、JSONを選択すると、データが返ってきた時点ですぐにJSONオブジェクトとして扱えるようになっています。</p>
<p>また、セキュリティ面でもいくつかの選択肢が用意されています。</p>
<ul>
<li>通常のリクエスト</li>
<li>Signed Request</li>
<li>OAuth</li>
</ul>
<p>通常のリクエストは、特に認証等のかかっていないAPIに対して行われるものです。Signed Requestとは、<a href="http://oauth.googlecode.com/svn/spec/ext/consumer_request/1.0/drafts/1/spec.htm" target="_blank">OAuth Consumer Request</a>を指しており、これを利用することで、外部サーバーはガジェットからのリクエストのみを扱うことができるようになります。OAuthは<a href="http://oauth.net/core/1.0/" target="_blank">OAuth Core</a>を指しており、外部サーバーはガジェットからのリクエストであることだけでなく、誰からのリクエストなのかをセキュアなクレデンシャルで認証した上で扱うことができるようになります。</p>
<p>OAuthについては<a href="http://devlog.agektmr.com/archives/79">この辺り</a>か<a href="http://devlog.agektmr.com/archives/174">この辺り</a>を参考にしてください。</p>
<p>ここで注意しなければならないのが、すべてShindigのproxyを介して行われるということです。先ほど書いた通り、ここでもGETリクエストには強力なキャッシュ機能が利用されるため、若干注意が必要な場合があります。キャッシュについては次回以降まとめて記事にしたいと思います。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/ja/archives/363/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>オープンソースのShindig対応SNS &#8211; Partuza!</title>
		<link>http://devlog.agektmr.com/ja/archives/71</link>
		<comments>http://devlog.agektmr.com/ja/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/ja/?p=71</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%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%252Fja%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%2Fja%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/ja/archives/71/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Shindigを読み解く</title>
		<link>http://devlog.agektmr.com/ja/archives/64</link>
		<comments>http://devlog.agektmr.com/ja/archives/64#comments</comments>
		<pubDate>Sat, 03 May 2008 16:11:34 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[Shindig]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/ja/?p=64</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F64", "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%252Fja%252Farchives%252F64%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Shindig%E3%82%92%E8%AA%AD%E3%81%BF%E8%A7%A3%E3%81%8F%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F64", "style": "big", "title": "Shindigを読み解く" });</script></div>
<p>以前インストール方法をご紹介した(<a href="http://devlog.agektmr.com/archives/6">Java版</a>、<a href="http://devlog.agektmr.com/archives/11">PHP版</a>)Shindigですが、ようやくPHP版も使えるレベルになってきましたので、ソースを読み解いてみました。なお、Java版の方が実装は進んでいますが、今回はPHP版に限った話ですのでご注意ください。</p>
<h2>Shindigとは何なのか</h2>
<p>そもそも、の話です。</p>
<p>Shindigはひとことで言うと「<strong>OpenSocialコンテナのサンプル実装</strong>」です。これをダウンロードして動かすだけで、iGoogleガジェットとOpenSocialガジェットの動作テストを行うことができます。実際はOpenSocialを広く普及させるよう、数多あるSNSがShindigを参考に、もしくは流用してOpenSocialに対応することを目的にしています。</p>
<ul>
<li><a href="http://incubator.apache.org/shindig/" target="_self">Shindig - </a><span class="smaller"><a href="http://incubator.apache.org/shindig/" target="_self">an Apache incubator project for OpenSocial and gadgets</a></span></li>
<li><a href="http://mail-archives.apache.org/mod_mbox/incubator-shindig-dev/" target="_self">メーリングリスト</a></li>
<li><a href="http://svn.apache.org/repos/asf/incubator/shindig/trunk/" target="_self">レポジトリ</a></li>
</ul>
<h2>主なディレクトリ構成</h2>
<ul>
<li>config: コンテナ設定</li>
<li>features: 各種機能セット(JavaScriptコード)</li>
<li>java: Javaソースコード</li>
<li>javascript: HTML, JavaScriptコード</li>
<li>php: PHPソースコード</li>
</ul>
<h2>ディレクトリ解説</h2>
<h3>config</h3>
<p>container.jsというファイルがコンテナのデフォルト設定となり、プロキシやOpenSocial APIのパス等の設定を行います。設定を変更したい場合はこのディレクトリにファイルを追加して、必要な部分のみをJSON形式で追記すれば、デフォルト設定が引き継がれます。なお、JSON形式なのは、PHPやJavaだけでなく、他の言語からも読み込むことを想定しているためと思われます。(Perl版やRuby版のShindigも開発される予定だそうです。)</p>
<h3>features</h3>
<p>ガジェットXMLに&lt;Require features=&#8221;"&gt;という形式で記述される機能(features)をセットとして読み込みます。featuresディレクトリ内は機能セットごとにさらにディレクトリに分けられていて、各ディレクトリにあるfeatures.xmlファイルで必要なJavaScriptライブラリセットが指定されています。</p>
<h3>php</h3>
<p>PHPのソースコードはJava版を参考にしているためか、あまりPHPらしくない実装になっています。</p>
<p>まずMVC形式を取っていません。オブジェクトの分け方は色々な方法がありますが、ウェブアプリケーション的なものと言うよりは、Java的な方法で(?)機能や設定ごとに、非常に細かく分けられています。メンバ変数にいちいちget〜やset〜メソッドを用意しているのもJavaっぽい。</p>
<p>PHPへのリクエストはリライトされ(.htaccessファイルで指定)、すべてindex.phpに読み込まれます。index.phpはリクエストのパラメータに応じて処理を6種類のサーブレットに振り分けます。</p>
<ul>
<li>静的ファイル(/gadgets/files)</li>
<li>JavaScript(/gadgets/js)</li>
<li>プロキシ(/gadgets/proxy)</li>
<li>ガジェット(/gadgets/ifr)</li>
<li>メタデータ(/gadgets/metadata)</li>
<li>OpenSocial API(/social/data)</li>
</ul>
<p>クラスのインクルードは__autoloadが使用されているため、ほとんど書かれていません。</p>
<p>config.phpには各種ファイルへのパスなど、設定が記述されています。(config/container.jsとは別物です)</p>
<p>なお、Shindigはデータベースを使っていないので、キャッシュは/tmpディレクトリ、設定はcookie、友達リストは静的XMLファイルでそれぞれ管理されます。</p>
<h2>まとめ</h2>
<p>ソースコードは一見シンプルですが、かなり複雑です。Java的な実装方法に加え、他言語版Shindigとの設定等の共有を想定した汎用化など、オプティマイズする余地はかなりありそう。PHP版Shindigを既存フレームワークに取り込むのは難しくはありませんが、あくまでも参考にする程度にした方がいいと思われます。</p>
<p>なお、今のところOpenSocialバージョン0.7対応ですが、まだまだバグも存在しています。バージョン0.8の機能仕様が出揃ってきたところですが、Shindigでの対応は時間差が出そう。</p>
<p>OpenSocial APIは実装されていますが、ShindigでOpenSocial機能が使えるようになったというには、まだまだ足りない感じ。あとはOAuthとか、RESTful APIとか、、、。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/ja/archives/64/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cajaとは何か</title>
		<link>http://devlog.agektmr.com/ja/archives/49</link>
		<comments>http://devlog.agektmr.com/ja/archives/49#comments</comments>
		<pubDate>Tue, 22 Apr 2008 16:26:50 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[Caja]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Shindig]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/ja/?p=49</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F49", "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%252Fja%252Farchives%252F49%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Caja%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F49", "style": "big", "title": "Cajaとは何か" });</script></div>
<p>OpenSocial周りの調査をしていると、Cajaという言葉に遭遇します。セキュアなJavaScriptを実現するもの、ということだけ分かっていたのですが、詳細を調べてみました。</p>
<h2>クロスサイトスクリプティングとブログパーツ</h2>
<p>gooやlivedoor、fc2などのホスティングを含めたブログサービスを使ったことのある方はご存知と思いますが、サービスによってブログパーツが貼れるもの、貼れないもの、一部だけ許可しているものがあります。なぜでしょうか？</p>
<p>Cookieには同一ドメインから実行されたスクリプトしか参照できないという特徴があります。これを利用して、Cookieをセッション情報や閲覧履歴の保存場所として活用しているサービスは少なくありません。上記ブログサービスがブログパーツを許可しないのは、これらの情報を悪意のあるJavaScriptから守るためです。逆に言うと、同一ドメイン上でJavaScriptが実行できれば、そのセッション情報や閲覧履歴を盗むことができてしまいます。これをXSS(クロスサイトスクリプティング)と言います。</p>
<p>XSSが発生するのは、投稿フォームを使って、そのドメイン上のページにJavaScriptを埋め込み、実行できるケースが挙げられますが、ブログパーツが貼れること自体もJavaScriptが埋め込めるという意味では同じであり、まともに作られたサイトであれば、まずこういったことは出来ません。</p>
<p>とはいえ、実際にブログパーツを貼付けることができるブログは存在しますし、セキュリティの問題を回避しつつこれを実現するためのアプローチがいくつか存在します。</p>
<h2>JavaScriptを貼付けるためのアプローチ</h2>
<h3>ドメインを分ける</h3>
<p>ブログを表示するドメインをセッション情報等のクリティカルなCookieを保存していないものにしてしまいます。盗むものがなければ、泥棒が入ったところで何も困ることはありません。このアプローチをとっているものにはlivedoorブログが挙げられます。</p>
<h3>安全性の確認できたJavaScriptのみ許可する</h3>
<p>サービス提供者が安全なブログパーツのリストを作り、ブログ管理者がそこから選ぶ、というアプローチです。ブログパーツの選択肢が狭くなるためユーザーには好まれませんが、全く貼れないよりはよいはず。gooブログやはてなダイアリがこのアプローチをとっています。</p>
<h3>iframeで表示する</h3>
<p>iframe内に別ドメインで表示してしまえば、上記「ドメインを分ける」と同様に扱うことができます。このアプローチを取っているものにiGoogleが挙げられます。iGoogleはブログではありませんが、ブログパーツ=ガジェットと捉えれば同じ問題を扱っていると言えます。</p>
<h3>JavaScriptの危険な部分を無力化する</h3>
<p>サーバーがJavaScriptを出力する前に危険な部分を書き換え、無力化してしまいます。このアプローチをとっているブログがあるか知りませんが、やり方としては誰でも思いつくのではないでしょうか。ただ、これを実現するためには膨大な労力と知識が必要となります。これがオープンソースで存在しているとすれば、どんなに素晴らしいでしょう。そして、これを実現することができるのが今回紹介する、Cajaです。</p>
<h2>Cajaで実現できること</h2>
<p>Cajaはカハと読みます。CajaはGoogleのオープンソースプロジェクトの名前で、これを使うことで、同一ドメイン上のページに安全に外部のJavaScriptを貼付けることが可能になります。</p>
<p><a href="http://devlog.agektmr.com/wiki/index.php?JavaScript%2FCaja" target="_blank">Caja紹介(日本語訳)</a></p>
<p><a href="http://code.google.com/p/google-caja/wiki/AttackVectors" target="_blank">開発に当たってCajaを使って防がれるべきとされた攻撃方法の一覧</a></p>
<h2>どこでCajaを使うのか</h2>
<p>CajaはOpenSocialコンテナ上での利用を想定して作られているようです。<a href="http://devlog.agektmr.com/wiki/index.php?JavaScript%2FCaja" target="_blank">Caja紹介(日本語訳)</a>の説明も、Shindigでアプリケーションを利用することが前提となっており、Cajaを使ってガジェットをインラインで表示した方がパフォーマンスが向上する旨が記載されています。</p>
<h2>Cajaの形態</h2>
<p>実はここがまだ調べきれていない部分なのですが、どうやらJavaによるサーバーサイドでのリライトと、JavaScriptのライブラリで構成されている、ぽいです。この辺はもう少し調べる必要がありそうです。</p>
<p>何か他に情報をお持ちの方がいらっしゃいましたらぜひ、教えてください。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/ja/archives/49/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shindigのphp版を試す</title>
		<link>http://devlog.agektmr.com/ja/archives/11</link>
		<comments>http://devlog.agektmr.com/ja/archives/11#comments</comments>
		<pubDate>Mon, 17 Mar 2008 05:35:14 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[Gadget]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Shindig]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/ja/archives/11</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F11", "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%252Fja%252Farchives%252F11%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Shindig%E3%81%AEphp%E7%89%88%E3%82%92%E8%A9%A6%E3%81%99%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F11", "style": "big", "title": "Shindigのphp版を試す" });</script></div>
<p>先日のGoogleディベロッパー交流会でShindigのphp版が公開されていることを知り、試してみました。</p>
<h2>Shindigをチェックアウトする</h2>
<pre>&gt; svn co http://svn.apache.org/repos/asf/incubator/shindig/trunk .</pre>
<p>Shindigのソースがチェックアウトされます。(今回試したリビジョンは637739)</p>
<pre>&gt; ln -s ~/Development/Shindig/php/gadgets /Library/WebServer/Documents/gadgets</pre>
<p>これでローカルホスト上で見れるはず。ブラウザに下記のURLを入力します。</p>
<pre>http://localhost/gadgets/ifr?url=http://www.labpixies.com/campaigns/todo/todo.xml</pre>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/03/notfound.jpg" title="NotFound"><img src="http://devlog.agektmr.com/wp-content/uploads/2008/03/notfound.jpg" alt="NotFound" /></a><a href="http://devlog.agektmr.com/wp-content/uploads/2008/03/notfound.jpg" title="NotFound"> </a></p>
<p>見れません、、、</p>
<h2>httpd.confを修正</h2>
<p>どうやら、Mac OS X(Leopard)のhttpd.confのデフォルト 設定が邪魔している模様。</p>
<pre>/etc/apache2/httpd.conf</pre>
<p>を書き換えます。/etc/httpd/httpd.confではないことに注意。(Tigerはこれだった)</p>
<pre>&lt;Directory "/Library/WebServer/Documents"&gt;</pre>
<p>内の</p>
<pre>AllowOverride None</pre>
<p>を</p>
<pre>AllowOverride All</pre>
<p>に変更します。これでいけるはず。。。</p>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/03/todogadget.jpg" title="ToDoGadget"><img src="http://devlog.agektmr.com/wp-content/uploads/2008/03/todogadget.jpg" alt="ToDoGadget" /></a></p>
<p>できた！これで、色々いじれますよ・・・</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/ja/archives/11/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Googleディベロッパー交流会</title>
		<link>http://devlog.agektmr.com/ja/archives/9</link>
		<comments>http://devlog.agektmr.com/ja/archives/9#comments</comments>
		<pubDate>Sat, 15 Mar 2008 01:07:36 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[Gadget]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Shindig]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/ja/archives/9</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F9", "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%252Fja%252Farchives%252F9%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Google%E3%83%87%E3%82%A3%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC%E4%BA%A4%E6%B5%81%E4%BC%9A%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F9", "style": "big", "title": "Googleディベロッパー交流会" });</script></div>
<p>表参道のダイヤモンドホールで行われたGoogleディベロッパー交流会に参加してきました。今回はOpenSocialがテーマということで、ドンピシャ。 色々な疑問を解決することが出来ました。</p>
<h2>OpenSocialアプリケーション(ガジェット)はSNS間を持ち回れない？</h2>
<p>とても基本的な疑問ですが、。OpenSocialは異なるSNS間でAPIを共通化することで、アプリケーション開発者の負担を軽くすることが目的のため、互換性は保証されるものと考えていましたが、どうもそういう訳でもないらしい。<strong>なぜなら、OpenSocialはアプリケーションを乗せるもの(OrkutではGoogle Gadget)について規定していないから。 </strong></p>
<p>OpenSocialの仕様書を見ると、サンプルコードはすべてGoogle Gadgetを想定して書かれていますが、実際の仕様にGoogle Gadgetが要件であるとは書いていません。つまり、別にOpera WidgetだろうとYahoo! WidgetだろうとDashboard Widgetだろうと、乗せられるところに乗せてよい訳です。そこでこの辺りをはっきりさせるため、プレゼンをしてくれたクリスさん(ラストネームは忘れた)に聞いてみました。</p>
<ul>
<li>ガジェットはGoogle Gadgetのみを想定している訳ではない。</li>
<li>MySpaceAppやhi5、OrkutはGoogle Gadget形式で提供される(未確認)</li>
<li>アプリケーションは基本的にSNS間で共有できるが、拡張機能に対応していると、別のSNSでは動かない可能性もある。</li>
</ul>
<p>僕の拙い英語力だと、なんだか釈然としない答えしか得られませんでした。なんだかまだもやもや感が残ってますが、個人的にこう思ってます。</p>
<ul>
<li>ガジェットはGoogle Gadgetである必要はない</li>
<li>アプリケーション開発者は、コア機能は共通かできるが、ガジェット部分についてはSNSごとに用意する必要がある。</li>
</ul>
<h2>OpenSocialはRESTful APIの仕様が出るまで役に立たない?</h2>
<p>OpenSocialはSNSから友達の情報を取得できることが目玉な訳ですが、当然認証認可が必要になります。JavaScriptのAPIでは、単純にnewDateRequestを使って簡単に取得できるように書いてはありますが、コンテナ側の実装はそう単純ではありません。</p>
<p>Google Gadgetを前提とした場合、コンテンツタイプとして2つの選択肢があります。1つはGadget XML中にHTMLも記述するhtmlモード。もうひとつはGadget XML中にリモートURLを記述するurlモードです。htmlモードはGoogleの管理するgmodules.comというドメイン上で動作しますが、urlモードの場合は、サードパーティーの管理する全く別のドメインで動作することになります。察しの良い人はこの時点で気付くかと思います。</p>
<p><strong>リモートサーバーからOpenSocialのSNS情報にアクセスするには、そのリモートサーバーのプロキシを介して、SNSのRESTful APIを叩く以外、方法がない</strong></p>
<p>これは単純にAjaxがドメイン超えできないということに起因していますが、とても重要なこと。RESTful APIがまだ正式に用意されていないOpenSocialなだけに、これがないと使い物にならないんじゃないの？MySpaceのRESTful APIってなによ！？ OrkutのiLikeアプリってリモートじゃね！？という疑問が募ってしまったのでした。(あれ？AjaxってJavaScript自体の置いてあるドメインだったら直接リクエスト投げられるのか!?)</p>
<h2> Shindigについて</h2>
<p>先日インストールしたShindigですが、まだJavaしか対応していないものだとばかり思い込んでました。そしたら、Javaよりも実装は遅れているけど、PHPもあるというじゃないですか！！早速帰ってコードを見てみると、、、確かにありました。お作法がJavaっぽいのでアレレな感じですけど、PHPメインの僕にとってはありがたい発見。</p>
<h2>他にも</h2>
<ul>
<li>リクルートの方が作ったというShindigを使った<a href="http://beta.doko.jp/sandbox/" target="_blank">OpenSocial対応のドコイクβサービス</a></li>
<li><a href="http://commusuke.eisbahn.jp/" target="_blank">こみゅすけ</a>のOrkutアプリ版</li>
<li>OpenSocialアプリコーディング環境CodeRunner(Orkut上のアプリ)</li>
<li>Orkut上に<a href="http://sandbox.orkut.com/Community.aspx?cmm=47213793" target="_blank">OpenSocial Japanというコミュニティ</a></li>
</ul>
<p>などなど、、、子供がうるさいので今日はこの辺で。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/ja/archives/9/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac OS XにShindigをインストールする</title>
		<link>http://devlog.agektmr.com/ja/archives/6</link>
		<comments>http://devlog.agektmr.com/ja/archives/6#comments</comments>
		<pubDate>Wed, 12 Mar 2008 08:28:14 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[Shindig]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/ja/archives/6</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F6", "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%252Fja%252Farchives%252F6%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Mac%20OS%20X%E3%81%ABShindig%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fja%2Farchives%2F6", "style": "big", "title": "Mac OS XにShindigをインストールする" });</script></div>
<p>参考資料 :<a href="http://incubator.apache.org/shindig/" target="_blank" title="Shindig - an Apache incubator project for OpenSocial and gadgets">Shindig &#8211; an Apache incubator project for OpenSocial and gadgets</a></p>
<h2>予めMavenのインストールが必要</h2>
<p><a href="http://maven.apache.org/download.html">Maven &#8211; Download Maven 2.0.8 </a>からダウンロード。特にインストール作業は必要なく、適当なところに置いといて、パスを切る必要あり。ひとまず</p>
<pre>&gt; ~/Development/apache-maven-2.0.8</pre>
<p>に置いておこう。環境変数も設定しておく。</p>
<pre>&gt; export JAVA_HOME='/System/Library/Frameworks/JavaVM.framework/Versions/A'&gt; export PATH=$PATH:/Users/ekita/Development/apache-maven-2.0.8/bin</pre>
<p>・・・とか思ったら、Maven入ってるじゃん！なにこれOS X!!</p>
<h2>Shindigを設置</h2>
<pre>&gt; mkdir Shindig</pre>
<p>レポジトリからShindigのソースをチェックアウトする</p>
<pre>&gt; svn co http://svn.apache.org/repos/asf/incubator/shindig/trunk .</pre>
<p>ビルドする</p>
<pre>&gt; cd ~/Development/Shindig/java/gadgets&gt; mvn package</pre>
<p>勝手に色々ダウンロードしてよしなにしてくれるみたい。</p>
<h2>Shindigを起動してみる</h2>
<pre>&gt; mvn jetty:run-war</pre>
<p>で動くらしいのだが、、、</p>
<pre>[INFO] Scanning for projects...[INFO] Searching repository for plugin with prefix: 'jetty'.[INFO] org.apache.maven.plugins: checking for updates from central[INFO] org.codehaus.mojo: checking for updates from central[INFO] artifact org.apache.maven.plugins:maven-jetty-plugin: checking for updates from central[INFO] ------------------------------------------------------------------------[ERROR] BUILD ERROR[INFO] ------------------------------------------------------------------------[INFO] The plugin 'org.apache.maven.plugins:maven-jetty-plugin' does not exist or no valid version could be found[INFO] ------------------------------------------------------------------------[INFO] For more information, run Maven with the -e switch[INFO] ------------------------------------------------------------------------[INFO] Total time: 2 seconds[INFO] Finished at: Wed Mar 12 16:18:09 JST 2008[INFO] Final Memory: 1M/2M[INFO] ------------------------------------------------------------------------</pre>
<p>うまく動かない、、、 どうやら<a href="http://jetty.mortbay.org/maven-plugin/index.html">Jetty</a>というのが必要らしい。</p>
<h2>Jettyを動かす</h2>
<p>Javaサーバーはさっぱりなのでよくわからないけど、とりあえずjetty-6.1.8をダウンロードし、~/Development配下に移動。</p>
<pre>&gt; cd ~/Development/jetty-6.1.8</pre>
<pre>&gt; java -jar start.jar</pre>
<p>とかやってみる。どうやらこれでjettyというウェブサーバーが動いてることになってるらしい(多分Apacheも動いてる必要アリ)そこで、先ほどビルドしたShindigのwarファイルをシンボリックリンクして</p>
<pre>&gt; ln -s ~/Development/Shindig/java/gadgets/target/gadgets.war ~/Development/jetty-6.1.8/webapps/gadgets.war</pre>
<p>アクセスしてみると、、、</p>
<pre>http://localhost:8080/gadgets/files/samplecontainer/samplecontainer.html</pre>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/03/shindig.jpg" title="Shindig"><img src="http://devlog.agektmr.com/wp-content/uploads/2008/03/shindig.jpg" alt="Shindig" /></a></p>
<p>動いた〜！！今日はここまで。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/ja/archives/6/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
