<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3097847322885970584</id><updated>2011-11-28T09:16:05.182+09:00</updated><title type='text'>OpenSocialist</title><subtitle type='html'>OpenSocial習得のための備忘録</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-1882538647478472090</id><published>2009-08-14T10:23:00.007+09:00</published><updated>2009-08-15T05:04:35.185+09:00</updated><title type='text'>OpenSocialはmixiアプリだけじゃないよ</title><content type='html'>&lt;p&gt;
&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/D4AXFZWZ6nI&amp;hl=ja&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/D4AXFZWZ6nI&amp;hl=ja&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="510" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/p&gt;

&lt;p&gt;
今、日本でOpenSocialというと、下手すると「mixiアプリをつくるためのもの」のようなイメージになってしまっているかもしれないけれど、OpenSocialを採用しているところは、他にも沢山ある。
&lt;/p&gt;

&lt;p&gt;
世界に目を向ければ、（Facebookに負ける前は）世界最大手だったユーザ数2億人の「&lt;a href="http://jp.myspace.com/"&gt;MySpace&lt;/a&gt;」、ユーザ数4500万人にまで成長したシリコンバレー定番のソーシャルビジネスネットワーク「&lt;a href="http://www.linkedin.com/"&gt;LinkedIn&lt;/a&gt;」、現在100万のネットワークを持つソーシャルネットワーク構築サービス「&lt;a href="http://www.ning.com/"&gt;Ning&lt;/a&gt;」など。他にも、米Yahoo!、Salesforce.com、Six ApartなんかもOpenSocialを採用している。
&lt;/p&gt;

&lt;p&gt;
日本でOpenSocialを採用しているのは、mixi以外に「&lt;a href="http://home.goo.ne.jp/"&gt;gooホーム&lt;/a&gt;」や「&lt;a href="http://www.openpne.jp/"&gt;OpenPNE&lt;/a&gt;」がある。gooホームは、mixiアプリに比べるとどうしても地味だけれど、mixiよりも早くOpenSocialに対応していて、ドキュメント等も色々充実しているようだ。
&lt;/p&gt;

&lt;p&gt;
加えて、日本国内でも今後の展開が注目されるのは、&lt;a href="http://www.google.co.jp/ig"&gt;iGoogle&lt;/a&gt;だ。iGoogleは最近一新されて、OpenSocialを使ったソーシャルガジェットを利用できるようになった。日本でiGoogleがどれくらい使われているかはよく分からないが、自分なんかは、GmailやTwitterやニュースなどはiGoogleでチェックしているので、結構利用している。
&lt;/p&gt;

&lt;p&gt;
OpenSocialに対応しているところは、大抵&lt;a href="http://incubator.apache.org/shindig/"&gt;Apache Shindig&lt;/a&gt;を使っている。なので、自分のWebサービスをOpenSocialを対応させたかったら、Shindigを導入すればよい。Shindigの勉強もしたいなーと思っているのだけれど、なかなか実行できない。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-1882538647478472090?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/1882538647478472090/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/08/opensocialmixi.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/1882538647478472090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/1882538647478472090'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/08/opensocialmixi.html' title='OpenSocialはmixiアプリだけじゃないよ'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-2262415670838823833</id><published>2009-08-03T01:28:00.009+09:00</published><updated>2009-08-03T02:46:05.523+09:00</updated><title type='text'>Persistence API で JSONデータを保存する</title><content type='html'>&lt;p&gt;
OpenSocial APIは、v0.8からPersistence APIでJavaScriptのオブジェクトをそのまま永続化できるようになったと聞いていたのだけれど、どうもmixiアプリのOpenSocialコンテナは、この機能をまだ実装していないようだ。
&lt;/p&gt;

&lt;p&gt;
つまり、今のところPersistence APIのnewUpdatePersonAppDataRequest()で保存できるのは普通の文字列だけということで、配列やオブジェクトを保存したい場合は、一旦、JSON形式の文字列にしてから永続化リクエストを送る。
&lt;/p&gt;

&lt;p&gt;
文字列化するためには、gadgets.jsonオブジェクトのgadgets.json.stringify()というメソッドが利用できる。例えば、

&lt;pre name="code" class="javascript"&gt;
var object = {"name": "John Smith", "age": 33};
var string = gadgets.json.stringify(object);
&lt;/pre&gt;

というような感じで、オブジェクトを文字列に変換できる。あとは、このJSON形式の文字列を、newUpdatePersonAppDataRequest()の第３引数に渡せばOK。

&lt;pre name="code" class="javascript"&gt;
var req = opensocial.newDataRequest(); 
req.add(req.newUpdatePersonAppDataRequest(opensocial.DataRequest.PersonId.VIEWER, "key", string), "data"); 
req.send(コールバック関数); 
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
注意しなければならないのは、このJSONデータを受け取る際に文字列がHTMLエスケープされているので、アンエスケープしてからパースしなければならない点。
&lt;/p&gt;

&lt;p&gt;
&lt;pre name="code" class="javascript"&gt;
var req = opensocial.newDataRequest(); 
req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");
req.add(req.newFetchPersonAppDataRequest(opensocial.DataRequest.PersonId.VIEWER, ["key"]), "data"); 
req.send(function(response) { 
  var id = response.get("viewer").getData().getId();
  var data = response.get("data").getData(); 
  var string = data[id]["key"];
  string = gadgets.util.unescapeString(string);
  var object = gadgets.json.parse(string); 
});
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
gadgets.util.unescapeString()を使ってHTMLアンエスケープし、gadgets.json.parse()でJSONをパースすることで、普通のJavaScriptオブジェクトが得られる。
&lt;/p&gt;

&lt;p&gt;
関連エントリー：&lt;br/&gt;
&lt;a href="http://opensocialist.blogspot.com/2009/07/mixipersistence-api.html"&gt;mixiアプリのPersistence APIで日本語入力すると文字化けする場合&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://opensocialist.blogspot.com/2009/06/persistence-api.html"&gt;情報の永続化 Persistence API サンプル&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-2262415670838823833?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/2262415670838823833/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/08/persistence-api-json.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/2262415670838823833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/2262415670838823833'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/08/persistence-api-json.html' title='Persistence API で JSONデータを保存する'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-865132954031951378</id><published>2009-07-31T00:25:00.005+09:00</published><updated>2009-07-31T01:31:25.609+09:00</updated><title type='text'>mixiアプリのPersistence APIで日本語入力すると文字化けする場合</title><content type='html'>&lt;p&gt;
OpenSocialには、Key-Valueデータを保存できるPersitence APIというものがあるのだが（→&lt;a href="http://opensocialist.blogspot.com/2009/06/persistence-api.html"&gt;情報の永続化 Persistence API サンプル&lt;/a&gt;）、現状、mixiアプリでPersistence APIを使うと、日本語を保存したとき文字化けしてしまう。
&lt;/p&gt;

&lt;p&gt;
これはmixi側の不具合で、今後直されるとのこと。ただ、いつ直されるかは分からないので、とりあえず文字化けを回避する応急処置法をご紹介。
&lt;/p&gt;

&lt;p&gt;
日本語を文字化けさせないためには、newUpdatePersonAppDataRequest()でデータを送信する前にJavaScriptのescape()でエンコードし、newFetchPersonAppDataRequest()でデータを受信した後にunescape()でデコードすればよい。
&lt;/p&gt;

&lt;pre name="code" class="javascript"&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt; 
&amp;lt;Module&amp;gt;
  &amp;lt;ModulePrefs title="PersistenceTest2"&amp;gt; 
    &amp;lt;Require feature="opensocial-0.8"/&amp;gt;
  &amp;lt;/ModulePrefs&amp;gt;
  &amp;lt;Content type="html"&amp;gt;
  &amp;lt;![CDATA[
  &amp;lt;script type="text/javascript"&amp;gt;
  
  function saveData() {
    var value = document.getElementById("input_data").value;
    value = escape(value); // escape()でエンコード
    var req = opensocial.newDataRequest();
    req.add(req.newUpdatePersonAppDataRequest(opensocial.IdSpec.PersonId.VIEWER, "key", value));
    req.send(function(response) {
      if (response.hadError()) {
        alert(response.getErrorMessage());
      } else {
        alert("データが保存されました。")
      }
    });
  }
  
  function loadData() {
    var req = opensocial.newDataRequest();
    req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");
    req.add(req.newFetchPersonAppDataRequest(opensocial.IdSpec.PersonId.VIEWER, ["key"]), "viewer_data");
    req.send(function(response) {
      if (response.hadError()) {
        alert(response.getErrorMessage());
      } else {
        var myId = response.get("viewer").getData().getId();
        var data = response.get("viewer_data").getData();
        data = unescape(data[myId]["key"]); // unescape()でデコード
        alert(data);
      }
    });
  }
  &amp;lt;/script&amp;gt;
  
  &amp;lt;input type="text" id="input_data"/&amp;gt;
  &amp;lt;button onclick="saveData()"&amp;gt;データ保存&amp;lt;/button&amp;gt;
  &amp;lt;button onclick="loadData()"&amp;gt;データ取得&amp;lt;/button&amp;gt;
  ]]&amp;gt; 
  &amp;lt;/Content&amp;gt;
&amp;lt;/Module&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
聞くところによると、文字化けしてしまう原因は、mixiサイトの文字コードにあるそうだ。mixiのサイトでは文字コードにEUC-JPを使っているのに、mixiアプリのiframeではUTF-8を使っており、これが何か悪さをしているみたい。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-865132954031951378?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/865132954031951378/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/07/mixipersistence-api.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/865132954031951378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/865132954031951378'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/07/mixipersistence-api.html' title='mixiアプリのPersistence APIで日本語入力すると文字化けする場合'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-8948786935255446017</id><published>2009-07-22T20:12:00.006+09:00</published><updated>2009-07-22T21:01:28.750+09:00</updated><title type='text'>mixiオフィスに入ってみた感想</title><content type='html'>&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LEJ5MCd0MoE/Smb0yEW1aoI/AAAAAAAAAEQ/uAzOmQJhCiY/s1600-h/22l.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 265px;" src="http://2.bp.blogspot.com/_LEJ5MCd0MoE/Smb0yEW1aoI/AAAAAAAAAEQ/uAzOmQJhCiY/s400/22l.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5361241547431307906" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
原宿にあるmixiのオフィスに行く用事があったのだけれど、これがまたキレイなオフィスだった（画像は&lt;a href="http://mixi.co.jp/jobs/officetour/"&gt;mixiのサイト&lt;/a&gt;より）。受付にもキレイなお姉さん。ビビッドな色使いしてる点とかは、先日行ったGoogleの東京オフィス（渋谷にある）と似てるかもだけれど、mixiの方が、オフィス環境に金使ってるなーって印象。
&lt;/p&gt;

&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LEJ5MCd0MoE/Smb96IA06sI/AAAAAAAAAEY/rNHGBoBnRuI/s1600-h/06l.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 265px;" src="http://1.bp.blogspot.com/_LEJ5MCd0MoE/Smb96IA06sI/AAAAAAAAAEY/rNHGBoBnRuI/s400/06l.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5361251581456345794" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
面白かったのは、Webに関するキーワード（「semantic web」とか「social bookmark」とか）がびっしり描かれたデザインの壁があったのだけれど、その中にさりげなく「I love &amp;hearts; Nagasawa-Masami」とあったこと。
&lt;/p&gt;

&lt;p&gt;
聞いてみるに、壁に描かれたキーワードは、あるブレスト中に出てきたキーワードだそうで、「I love &amp;hearts; Nagasawa-Masami」は、そのときの取締役の誰かによるものらしい（笑）。特に、mixiと長澤まさみに何か関係がある訳ではないそうだ。
&lt;/p&gt;

&lt;p&gt;
オフィスに遊び心があるのは、楽しくていいね。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-8948786935255446017?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/8948786935255446017/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/07/mixi_22.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/8948786935255446017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/8948786935255446017'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/07/mixi_22.html' title='mixiオフィスに入ってみた感想'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_LEJ5MCd0MoE/Smb0yEW1aoI/AAAAAAAAAEQ/uAzOmQJhCiY/s72-c/22l.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-8394105776982193854</id><published>2009-07-04T03:55:00.005+09:00</published><updated>2009-07-05T03:40:29.590+09:00</updated><title type='text'>mixiアプリ開発におけるキャッシュの問題</title><content type='html'>&lt;p&gt;
mixiアプリ開発をする人が必ず一度は通るといわれるキャッシュの問題。OpenSocialコンテナでは、負荷軽減のためにGadget XMLファイル等をサーバ側でキャッシュしているので、開発の過程でファイルを書き換えた場合、それがすぐに反映されないという問題が起こることがある。
&lt;/p&gt;

&lt;p&gt;
キャッシュの扱いについてはOpenSocialコンテナごとに違うとは思うけれど、mixiアプリの場合は、mixi Developer Centerの
&lt;a href="http://developer.mixi.co.jp/appli/pc/lets_enjoy_making_mixiapp/tips_for_developing#toc-gadget-xml"&gt;Gadget XMLファイルのキャッシュについて&lt;/a&gt;に詳しく書いてある。
&lt;/p&gt;

&lt;blockquote&gt;
mixiアプリでは、様々なレイヤーで強力にキャッシュが働きます。これは、mixiアプリの動作に関する負荷をできるだけ減らして、利用者に快適にアプリを利用してもらえるようにするための工夫です。しかし、mixiアプリの開発において、そのキャッシュが開発の妨げになってしまうケースも十分に考えられます。
&lt;/blockquote&gt;

&lt;p&gt;
対策方法としては、
&lt;ol&gt;
&lt;li&gt;アプリ設定画面から、「キャッシュの消去」をする&lt;/li&gt;
&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sk-amIj_tNI/AAAAAAAAAEA/zcK-ZLRsT38/s1600-h/cache.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 195px;" src="http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sk-amIj_tNI/AAAAAAAAAEA/zcK-ZLRsT38/s400/cache.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5354668461890974930" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;li&gt;ブラウザで、アプリのURIのパラメータに「nocache=1」をつける&lt;/li&gt;
&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sk-dCYEyhxI/AAAAAAAAAEI/5NutBF9ggG0/s1600-h/nocache.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 25px;" src="http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sk-dCYEyhxI/AAAAAAAAAEI/5NutBF9ggG0/s320/nocache.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5354671146114647826" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
開発中のちょっとした確認であれば、2. のnocache=1のやり方でOK。更に、&lt;a href="http://opensocialist.blogspot.com/2009/06/mixidropboxpublic.html"&gt;この前の記事&lt;/a&gt;で紹介したように、Gadget XML置き場にDropboxを用いれば、「ローカルで保存＋ブラウザをリロード」するだけで更新結果を見ることができるのでとっても便利。
&lt;/p&gt;

&lt;p&gt;
ただ、Safari (4.0.1) の場合、nocache=1しなくても、なぜかキャッシュがかからない。Firefoxだとキャッシュされたものが表示されるのだが...なぜだろう？詳しい方、もしご存知でしたら、ご教授くださいませ。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-8394105776982193854?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/8394105776982193854/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/07/mixi.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/8394105776982193854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/8394105776982193854'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/07/mixi.html' title='mixiアプリ開発におけるキャッシュの問題'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sk-amIj_tNI/AAAAAAAAAEA/zcK-ZLRsT38/s72-c/cache.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-8817083267148803260</id><published>2009-07-03T00:44:00.007+09:00</published><updated>2009-07-03T01:33:52.354+09:00</updated><title type='text'>「SNS」という言葉を使うのをやめようかと思う</title><content type='html'>&lt;p&gt;
日本では、mixiのようなサイトを「ソーシャル・ネットワーキング・サービス（あるいはサイト）」という意味で、「SNS」と呼ぶのが普通だ。ただ、この「SNS」という言葉、ビジネスシーンではすこぶる評判が悪い。
&lt;/p&gt;

&lt;p&gt;
というのも、日本でmixiが流行って以来、mixiと同じような「専門SNS」が乱立し、そのほとんどが失敗に終わっているからだ。今、新規ビジネスを語る際に、下手にSNSという「死語」を使ってしまうと、それだけで印象が悪くなってしまう感さえある。
&lt;/p&gt;

&lt;p&gt;
僕がOpenSocialの勉強をしているのは、ソーシャルグラフ（人と人との繋がり情報）を活用したアプリケーションで、世に出したいアイデアがあるからだ。決してmixiのクローンサイトを立てたい訳でも、mixiアプリベンダーになりたい訳でもない。
&lt;/p&gt;

&lt;p&gt;
例えば、SNSというと「友達に対して日記を書く」ようなイメージが強いけれど、ソーシャルネットワーキングに「日記」がある必要はない。SNSの１つであるmixiが日記機能でヒットしただけのことで、日記機能がなくたって、ソーシャルグラフを持ったサービスであれば、立派なSNSである。
&lt;/p&gt;

&lt;p&gt;
そもそも世界を見渡すと、「SNS」という単語は日本でしか使われていないようだ。&lt;a href="http://www.google.co.jp/trends"&gt;Google トレンド&lt;/a&gt;で調べると分かるのだが、アメリカ等では、Social Networking ServiceのことをSNSとは略していない。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LEJ5MCd0MoE/Skzaly5EGzI/AAAAAAAAADo/Hpb0Z4OyXVM/s1600-h/sns_in_usa.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 236px;" src="http://2.bp.blogspot.com/_LEJ5MCd0MoE/Skzaly5EGzI/AAAAAAAAADo/Hpb0Z4OyXVM/s400/sns_in_usa.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353894399887809330" /&gt;&lt;/a&gt;

&lt;p&gt;
「SNS」という単語が一番検索されているのはオランダだが、これは違う意味のSNS。ソーシャルネットワーキングという意味でSNSという言葉を検索しているのは、世界の中で断トツで日本が多い。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LEJ5MCd0MoE/SkzcI_zOMZI/AAAAAAAAADw/3oh28exZeOI/s1600-h/sns_world.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 293px; height: 320px;" src="http://4.bp.blogspot.com/_LEJ5MCd0MoE/SkzcI_zOMZI/AAAAAAAAADw/3oh28exZeOI/s320/sns_world.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353896104160014738" /&gt;&lt;/a&gt;

&lt;p&gt;
SNSとは呼ばずに、じゃあなんと呼ぶんだ、ということだけれど、「ソーシャルグラフを使ったもの」という抽象的な意味では、「Social Web」という言葉がいいんじゃないかと僕は思っている。「Semantic Web」のような感じで。
&lt;/p&gt;

&lt;p&gt;
ところで、Googleトレンドで何かを比較するのは面白い。例えば、日本国内でのmixi、Facebook、Twitterの検索傾向を比較すると、以下のようになった。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LEJ5MCd0MoE/Skzd4tmC0xI/AAAAAAAAAD4/REy99uqs2xI/s1600-h/mixi_facebook_twitter.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 237px;" src="http://3.bp.blogspot.com/_LEJ5MCd0MoE/Skzd4tmC0xI/AAAAAAAAAD4/REy99uqs2xI/s400/mixi_facebook_twitter.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353898023418254098" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-8817083267148803260?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/8817083267148803260/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/07/sns.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/8817083267148803260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/8817083267148803260'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/07/sns.html' title='「SNS」という言葉を使うのをやめようかと思う'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_LEJ5MCd0MoE/Skzaly5EGzI/AAAAAAAAADo/Hpb0Z4OyXVM/s72-c/sns_in_usa.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-7032336051627671181</id><published>2009-07-01T20:09:00.009+09:00</published><updated>2009-07-01T23:01:03.609+09:00</updated><title type='text'>Bloggerのスパム判定からやっと解放された</title><content type='html'>&lt;p&gt;
このブログはGoogleのBloggerを使って書いているのだが、先月22日から何故かロックされてしまっていた。Bloggerは、ブログがスパムであるかどうかをロボットが自動的に判定しており、そのロボットにスパムブログだと誤認されてしまったようなのだ。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LEJ5MCd0MoE/SktEqdADh9I/AAAAAAAAADY/-kPdW6UvvCA/s1600-h/blogger_spam.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 273px; border: none;" src="http://2.bp.blogspot.com/_LEJ5MCd0MoE/SktEqdADh9I/AAAAAAAAADY/-kPdW6UvvCA/s400/blogger_spam.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353448078190020562" /&gt;&lt;/a&gt;

&lt;p&gt;
ロックされた状態でも、一応記事を書いて投稿することはできるのだけれど、色々な場面でいちいち文字認証をせねばならず、非常に面倒くさい。また、RSS配信も止められるし、検索エンジンにもクロールされなくなる。
&lt;/p&gt;

&lt;p&gt;
もちろんこのブログはスパムブログではないので、すぐに「ロック解除のリクエスト」を行ったのだが、数日経っても何の音沙汰もない。Googleのヘルプフォーラムで訴えたりもしてみたのだが、Googleからの返事はなかった。一週間経つと、なぜかロック解除のリクエストのプロセスが再び生じており、もう一度リクエストしたら、次の日やっと解除された。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LEJ5MCd0MoE/SktEzR0a69I/AAAAAAAAADg/Rrlgiqzo8sE/s1600-h/blogger_spam_2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 314px; border: none;" src="http://1.bp.blogspot.com/_LEJ5MCd0MoE/SktEzR0a69I/AAAAAAAAADg/Rrlgiqzo8sE/s400/blogger_spam_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353448229807254482" /&gt;&lt;/a&gt;

&lt;p&gt;
同じようにBloggerにスパムだと誤認されてしまった人がいるかもしれないので、&lt;a href="http://www.google.com/support/forum/p/blogger?hl=en"&gt;Blogger Help Forum&lt;/a&gt;で得た情報をまとめておこう。Bloggerにスパムと誤認されたら、以下のステップを踏むべきだそうだ。
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ロック解除のリクエストを出したら、10営業日はまず待つ&lt;/li&gt;
&lt;li&gt;10営業日経っても何もなければ、&lt;a href="https://spreadsheets.google.com/viewform?key=pZHHZdeYKeHjcTRpnBYV0Qw&amp;email=true"&gt;ここ&lt;/a&gt;でロック解除のアピールをする&lt;/li&gt;
&lt;li&gt;それでも駄目なら、ヘルプフォーラムで訴える&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
正直、スパムの確認なんて１日、２日とかでやってほしいものだ。結局、なぜスパム判定を受けたのかもよく分からなかった。Googleには、もう少しユーザーサポートを充実していただきたい。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-7032336051627671181?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/7032336051627671181/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/07/blogger.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/7032336051627671181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/7032336051627671181'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/07/blogger.html' title='Bloggerのスパム判定からやっと解放された'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_LEJ5MCd0MoE/SktEqdADh9I/AAAAAAAAADY/-kPdW6UvvCA/s72-c/blogger_spam.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-7012093848708290617</id><published>2009-06-28T12:45:00.002+09:00</published><updated>2009-06-28T13:28:13.044+09:00</updated><title type='text'>mixiアプリ開発にはDropboxのPublicフォルダが便利</title><content type='html'>&lt;p&gt;
&lt;a href="http://opensocialist.blogspot.com/2009/06/mixi.html"&gt;最初の記事&lt;/a&gt;で、mixiアプリの開発には
&lt;ol&gt;
&lt;li&gt;mixiアカウント&lt;/li&gt;
&lt;li&gt;テキストエディタ&lt;/li&gt;
&lt;li&gt;Webサーバ&lt;/li&gt;
&lt;/ol&gt;
が必要だと書いたけれど、「Webサーバなんて持ってねーよ！」という方もいるんじゃないかと思う。実は、簡単なmixiアプリを作るだけの場合、大層なWebサーバを用意する必要はなくて、&lt;a href="https://www.getdropbox.com/"&gt;Dropbox&lt;/a&gt;等のオンラインストレージで十分なのだ。
&lt;/p&gt;

&lt;p&gt;
要は、ガジェットXMLファイルを置くための、「Web上に公開された場所（＝Webブラウザで誰でも見れる場所）」がありさえすればいい。
&lt;/p&gt;

&lt;p&gt;
DropboxをガジェットXML置き場に使えるんじゃないかというアイデアを閃いたときは、「俺☆天才」と思ったんだけど、「opensocial dropbox」でググってみたら、同じことを考えてた方が既にいらっしゃった。
&lt;/p&gt;

&lt;blockquote&gt;&lt;a href="http://jmblog.jp/archives/263"&gt;DropBox を OpenSocialアプリ開発に利用する&lt;/a&gt;&lt;/blockquote&gt;

&lt;p&gt;
つまり、DropboxのPublicフォルダを使うことで、「ローカルで保存したら、即座に同期されてmixiアプリに反映される」という素晴らしい開発環境をタダで手に入れられるというわけ。是非お試しあれ。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-7012093848708290617?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/7012093848708290617/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/06/mixidropboxpublic.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/7012093848708290617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/7012093848708290617'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/06/mixidropboxpublic.html' title='mixiアプリ開発にはDropboxのPublicフォルダが便利'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-1862950341109703707</id><published>2009-06-25T22:28:00.007+09:00</published><updated>2009-07-02T00:03:37.599+09:00</updated><title type='text'>ビュー間の移動の仕方</title><content type='html'>&lt;p&gt;
OpenSocialには、
&lt;ul&gt;
&lt;li&gt;preview（アプリ登録前のプレビュー用）&lt;/li&gt;
&lt;li&gt;home（自分が見るホーム画面）&lt;/li&gt;
&lt;li&gt;profile（他人が見るプロフィール画面）&lt;/li&gt;
&lt;li&gt;canvas（全画面表示）&lt;/li&gt;
&lt;/ul&gt;
の４つのビューがある（ただしmixiアプリは、現状previewビューには対応していないようだ）。これまでのサンプルアプリでは、ビューを区別せずに全てのビューで同じものを表示するようなものだったけれど、今回は各ビューで違うものを表示させてみる。また、ビュー間の遷移の仕方も見てみようと思う。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LEJ5MCd0MoE/SkQrwOSt8JI/AAAAAAAAADA/NcyzHxOLk5g/s1600-h/HomeView.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 228px; height: 189px;" src="http://4.bp.blogspot.com/_LEJ5MCd0MoE/SkQrwOSt8JI/AAAAAAAAADA/NcyzHxOLk5g/s320/HomeView.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5351450364693311634" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LEJ5MCd0MoE/SkQrzl6MReI/AAAAAAAAADI/B6t8tvLPaVc/s1600-h/CanvasView.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 316px; height: 158px;" src="http://1.bp.blogspot.com/_LEJ5MCd0MoE/SkQrzl6MReI/AAAAAAAAADI/B6t8tvLPaVc/s320/CanvasView.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5351450422572500450" /&gt;&lt;/a&gt;

&lt;pre name="code" class="javascript"&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;
&amp;lt;Module&amp;gt;
  &amp;lt;ModulePrefs title="ViewTransitionTest"&amp;gt;
    &amp;lt;Require feature="opensocial-0.8"/&amp;gt;
    &amp;lt;Require feature="views"/&amp;gt;
  &amp;lt;/ModulePrefs&amp;gt;
  
  &amp;lt;Content type="html" view="home"&amp;gt;
  &amp;lt;![CDATA[
    &amp;lt;div&amp;gt;ここはHomeビューです。&amp;lt;/div&amp;gt;
    &amp;lt;input type="button" onclick="navigateToProfile()" value="Profileビューへ移動"/&amp;gt;
    &amp;lt;input type="button" onclick="navigateToCanvas()" value="Canvasビューへ移動"/&amp;gt;
  ]]&amp;gt;
  &amp;lt;/Content&amp;gt;
  
  &amp;lt;Content type="html" view="profile"&amp;gt;
  &amp;lt;![CDATA[
    &amp;lt;div&amp;gt;ここはProfileビューです。&amp;lt;/div&amp;gt;
    &amp;lt;input type="button" onclick="navigateToHome()" value="Homeビューへ移動"/&amp;gt;
    &amp;lt;input type="button" onclick="navigateToCanvas()" value="Canvasビューへ移動"/&amp;gt;
  ]]&amp;gt;
  &amp;lt;/Content&amp;gt;
  
  &amp;lt;Content type="html" view="canvas"&amp;gt;
  &amp;lt;![CDATA[
    &amp;lt;div&amp;gt;ここはCanvasビューです。&amp;lt;/div&amp;gt;
    &amp;lt;input type="button" onclick="navigateToHome()" value="Homeビューへ移動"/&amp;gt;
    &amp;lt;input type="button" onclick="navigateToProfile()" value="Profileビューへ移動"/&amp;gt;
  ]]&amp;gt;
  &amp;lt;/Content&amp;gt;
  
  &amp;lt;Content type="html" view="home, profile, canvas"&amp;gt;
  &amp;lt;![CDATA[
    &amp;lt;script type="text/javascript"&amp;gt;
      function navigateToHome() {
        gadgets.views.requestNavigateTo(new gadgets.views.View("home"));
      }
      function navigateToProfile() {
        gadgets.views.requestNavigateTo(new gadgets.views.View("profile"));
      }
      function navigateToCanvas() {
        gadgets.views.requestNavigateTo(new gadgets.views.View("canvas"));
      }
    &amp;lt;/script&amp;gt;
  ]]&amp;gt;
  &amp;lt;/Content&amp;gt;
&amp;lt;/Module&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
それぞれのビューの内容を別に記述するには、Content要素のview属性に、&amp;lt;Content view="canvas"&amp;gt;などと設定する。複数のビューを設定する場合は、&amp;lt;Content view="home, profile"&amp;gt;のように「,」で区切って書く。
&lt;/p&gt;

&lt;p&gt;
ビュー間でページの遷移をするためには、gadgets.viewsクラスのrequestNavigateTo()メソッドを使う。gadgets.viewsクラスを使うためには、&amp;lt;ModulePrefs&amp;gt;要素の中に&amp;lt;Require feature="views"&amp;gt;を入れないといけないので注意。
&lt;/p&gt;

&lt;p&gt;
requestNavigateTo()メソッドは、gadgets.views.Viewオブジェクトを引数にとるので、例えばCanvasビューに移動させたかったら、
&lt;/p&gt;


&lt;pre name="code" class="javascript"&gt;
gadgets.views.requestNavigateTo(new gadgets.views.View("canvas"));
&lt;/pre&gt;

&lt;p&gt;
とすればOK。
&lt;/p&gt;

&lt;p&gt;
参考URL:&lt;br/&gt;
&lt;a href="http://code.google.com/intl/ja/apis/gadgets/docs/ui.html#nav"&gt;gadgets.* API デベロッパー ガイド&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-1862950341109703707?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/1862950341109703707/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/06/blog-post_25.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/1862950341109703707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/1862950341109703707'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/06/blog-post_25.html' title='ビュー間の移動の仕方'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_LEJ5MCd0MoE/SkQrwOSt8JI/AAAAAAAAADA/NcyzHxOLk5g/s72-c/HomeView.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-6425151255698166716</id><published>2009-06-21T22:38:00.020+09:00</published><updated>2009-06-28T22:54:36.687+09:00</updated><title type='text'>makeReqeustによる外部サーバの呼び出し</title><content type='html'>&lt;p&gt;
ある程度以上のアプリを作ろうと思ったら、外部サーバとの連携は必須といっていいと思う。mixiアプリから外部サーバを呼び出すには、Gadgets Core JavaScript APIを用いる。具体的には、gadgets.io.makeReqeust()を使うことで外部サーバとの通信を行う。
&lt;/p&gt;

&lt;p&gt;
「opensocial.*」ではなく「gadgets.*」という名前空間を使っているところから分かるように、makeRequest()はOpenSocial API独自の機能ではなく、Gadgets APIの機能だ。関係としては、OpenSocialはGoogle Gadgetsの拡張で、mixiアプリはOpenSocialを採用した一例である。
&lt;/p&gt;

&lt;p&gt;
makeRequest(url, callback, params)の3つの引数は、
&lt;ol&gt;
&lt;li&gt;url: 取得したいコンテンツの位置を示すURL&lt;/li&gt;
&lt;li&gt;callback: URLからデータをフェッチしたら、そのデータを添えて呼び出す関数&lt;/li&gt;
&lt;li&gt;params: 外部サーバへの要求に関するパラメータ&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
パラメータparamsに何が設定できるかは、&lt;a href="http://code.google.com/intl/ja/apis/gadgets/docs/reference/gadgets.io.RequestParameters.html"&gt;gadgets.io.RequestParametersクラス&lt;/a&gt;に定義されている。リクエストのコンテンツ タイプ (TEXT、DOM、FEED、JSON) や、リクエストのメソッド タイプ (POST または GET) などが指定できる。
&lt;/p&gt;

&lt;p&gt;
コールバック関数には、結果を持つオブジェクトが呼び出し時に渡される。そのオブジェクトは、以下のような格好をしている。
&lt;/p&gt;

&lt;pre name="code" class="javascript"&gt;
{
  data : &amp;lt;パースされたデータ&amp;gt;,
  errors : &amp;lt;生じたエラー&amp;gt;,
  text : &amp;lt;生のテキストデータ&amp;gt;  
}  
&lt;/pre&gt;

&lt;p&gt;
サンプルアプリとして、このブログ「OpenSocialist」のフィードを取得して表示するmixiアプリを書いてみた。
&lt;/p&gt;

&lt;pre name="code" class="javascript"&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;
&amp;lt;Module&amp;gt;
  &amp;lt;ModulePrefs title="GetFeedApp"&amp;gt;
    &amp;lt;Require feature="opensocial-0.8"/&amp;gt;
  &amp;lt;/ModulePrefs&amp;gt;
  &amp;lt;Content type="html"&amp;gt;
  &amp;lt;![CDATA[
    &amp;lt;script type="text/javascript"&amp;gt;
      
      function getFeed() {
        var params = {};
        params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.FEED;
        var url = "http://opensocialist.blogspot.com/feeds/posts/default";
        gadgets.io.makeRequest(url, callback, params);
      }
      
      function callback(response) {
        // response.dataがフィードのデータを持っている
        var feed = response.data;
        var html = "";
        
        // ブログのTitle, Descriptionを表示
        html += "&amp;lt;div&amp;gt;&amp;lt;b&amp;gt;" + feed.Title + "&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;";
        html += "&amp;lt;div&amp;gt;" + feed.Description + "&amp;lt;/div&amp;gt;";
        
        var entries = feed.Entry;
        // ブログの各エントリーのタイトル（+リンク）を表示
        for (var i = 0; i &amp;lt; entries.length; i++) {
          html += "&amp;lt;div&amp;gt;"
            + "&amp;lt;a href='" + entries[i].Link + "'&amp;gt;"
            + entries[i].Title
            + "&amp;lt;/a&amp;gt;"
            + "&amp;lt;/div&amp;gt;";
        }
        document.getElementById("content_div").innerHTML = html;
      }
      
      gadgets.util.registerOnLoadHandler(getFeed);
      
    &amp;lt;/script&amp;gt;
    
    &amp;lt;div id="content_div"&amp;gt;&amp;lt;/div&amp;gt;
  ]]&amp;gt;
  &amp;lt;/Content&amp;gt;
&amp;lt;/Module&amp;gt;
&lt;/pre&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LEJ5MCd0MoE/Sj8lyDQdXpI/AAAAAAAAABo/XzA7HJyHLNY/s1600-h/GetFeedApp.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 148px;" src="http://3.bp.blogspot.com/_LEJ5MCd0MoE/Sj8lyDQdXpI/AAAAAAAAABo/XzA7HJyHLNY/s320/GetFeedApp.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5350036424137465490" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LEJ5MCd0MoE/Sj8l5QxdmeI/AAAAAAAAABw/3OdYoDGtTuQ/s1600-h/GetFeedApp2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 220px;" src="http://4.bp.blogspot.com/_LEJ5MCd0MoE/Sj8l5QxdmeI/AAAAAAAAABw/3OdYoDGtTuQ/s400/GetFeedApp2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5350036548024637922" /&gt;&lt;/a&gt;

&lt;p&gt;
リクエストのコンテンツタイプに「FEED」を選択し、ブログのAtomフィードを取得している。
&lt;/p&gt;

&lt;p&gt;
参考URL:&lt;br/&gt;
&lt;a href="http://code.google.com/intl/ja/apis/gadgets/docs/remote-content.html"&gt;gadgets.* API デベロッパーガイド&lt;/a&gt;, 
&lt;a href="http://developer.mixi.co.jp/appli/pc/lets_enjoy_making_mixiapp/require_servers"&gt;mixi Developer Center&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-6425151255698166716?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/6425151255698166716/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/06/makereqeust.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/6425151255698166716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/6425151255698166716'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/06/makereqeust.html' title='makeReqeustによる外部サーバの呼び出し'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LEJ5MCd0MoE/Sj8lyDQdXpI/AAAAAAAAABo/XzA7HJyHLNY/s72-c/GetFeedApp.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-7712852004973803320</id><published>2009-06-20T17:39:00.015+09:00</published><updated>2009-06-23T21:55:07.655+09:00</updated><title type='text'>情報の永続化 Persistence API サンプル</title><content type='html'>&lt;p&gt;
通常、アプリケーションで何か情報を保持するためには、MySQL等のデータベースを用意して保存させる必要があるが、OpenSocialにはデータの永続化のためのPersistence APIというものがある。Persistence APIにできることは、
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ある情報に名前を付けて永続化する&lt;/li&gt;
&lt;li&gt;永続化されている情報を取り出す&lt;/li&gt;
&lt;li&gt;永続化されている情報を削除する&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
要は、Key-Valueペアの文字列情報を保存することができる。そこで、データを保存して取得するだけの、Persistence APIを使ったシンプルなサンプルアプリを作ってみた。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj2_mRzw76I/AAAAAAAAABg/Zjo79PXy08A/s1600-h/persistence.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 228px; height: 193px;" src="http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj2_mRzw76I/AAAAAAAAABg/Zjo79PXy08A/s320/persistence.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5349642596722470818" /&gt;&lt;/a&gt;

&lt;pre name="code" class="javascript"&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt; 
&amp;lt;Module&amp;gt;
  &amp;lt;ModulePrefs title="PersistenceTest"&amp;gt; 
    &amp;lt;Require feature="opensocial-0.8"/&amp;gt;
  &amp;lt;/ModulePrefs&amp;gt;
  &amp;lt;Content type="html"&amp;gt;
  &amp;lt;![CDATA[
  &amp;lt;script type="text/javascript"&amp;gt;
  
  function saveData() {
    var value = document.getElementById("input_data").value;
    var req = opensocial.newDataRequest();
    req.add(req.newUpdatePersonAppDataRequest(opensocial.IdSpec.PersonId.VIEWER, "key", value));
    req.send(function(response) {
      if (response.hadError()) {
        alert(response.getErrorMessage());
      } else {
        alert("データが保存されました。")
      }
    });
  }
  
  function loadData() {
    var req = opensocial.newDataRequest();
    req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");
    req.add(req.newFetchPersonAppDataRequest(opensocial.IdSpec.PersonId.VIEWER, ["key"]), "viewer_data");
    req.send(function(response) {
      if (response.hadError()) {
        alert(response.getErrorMessage());
      } else {
        var myId = response.get("viewer").getData().getId();
        var data = response.get("viewer_data").getData();
        alert(data[myId]["key"]);
      }
    });
  }
  &amp;lt;/script&amp;gt;
  
  &amp;lt;input type="text" id="input_data"/&amp;gt;
  &amp;lt;button onclick="saveData()"&amp;gt;データ保存&amp;lt;/button&amp;gt;
  &amp;lt;button onclick="loadData()"&amp;gt;データ取得&amp;lt;/button&amp;gt;
  ]]&amp;gt; 
  &amp;lt;/Content&amp;gt;
&amp;lt;/Module&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
「データ保存」ボタンを押すと、savaData()関数がnewUpdatePersonAppDataRequest()メソッドを使って、入力されたデータの永続化を行い、「データ取得」ボタンを押すと、loadData()関数がnewFetchPersonAppDataRequest()メソッドを使って永続化されたデータの取得を行う。
&lt;/p&gt;

&lt;p&gt;
newUpdatePersonAppDataRequest()メソッドやnewFetchPersonAppDataRequest()メソッドは、newFetchPersonRequest()メソッドと同様、opensocial.DataRequestオブジェクトのメソッドだ。DataRequestオブジェクトに追加してリクエストを送信する。
&lt;/p&gt;

&lt;p&gt;
newUpdatePersonAppDataRequest()メソッドは3つの引数は、
&lt;ol&gt;
&lt;li&gt;ユーザのID&lt;/li&gt;
&lt;li&gt;永続化する情報のキー文字列&lt;/li&gt;
&lt;li&gt;永続化する情報の文字列&lt;/li&gt;
&lt;/ol&gt;
mixi Platformでは、第1引数のユーザIDは、セキュイティの観点からopensocial.IdSpec.PersonId.VIEWERしか許可されていないそうだ。
&lt;/p&gt;

&lt;p&gt;
newUpdatePersonAppDataRequest()メソッドでは、「誰のデータを取得するか」を指定するidSpecと、「どのデータを取得するか」を指定するキー文字列を指定する。キー文字列は配列で指定するところに注意（つまり、複数のデータを一度に取得できる）。
&lt;/p&gt;

&lt;p&gt;
このサンプルアプリでは、自分 (VIEWER) のデータを保存し、自分 (VIEWER) のデータを取得する。
&lt;/p&gt;

&lt;p&gt;
参考URL:&lt;br/&gt;
&lt;a href="http://code.google.com/intl/ja/apis/opensocial/docs/0.8/devguide.html#Persistent"&gt;OpenSocial API デベロッパーガイド&lt;/a&gt;, 
&lt;a href="http://developer.mixi.co.jp/appli/pc/lets_enjoy_making_mixiapp/share_info"&gt;mixi Developer Center&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-7712852004973803320?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/7712852004973803320/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/06/persistence-api.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/7712852004973803320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/7712852004973803320'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/06/persistence-api.html' title='情報の永続化 Persistence API サンプル'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj2_mRzw76I/AAAAAAAAABg/Zjo79PXy08A/s72-c/persistence.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-1843199947990505721</id><published>2009-06-19T21:18:00.015+09:00</published><updated>2009-06-23T01:31:46.730+09:00</updated><title type='text'>アクティビティの送信</title><content type='html'>&lt;p&gt;
今回は、アクティビティの送信の仕方。「アクティビティ」とは、OpenSocialアプリに対する、何らかのアクションのこと。例えば、mixiアプリでのアクティビティは、「マイミクシィ最新アプリ更新履歴」としてプロフィール画面に表示される。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LEJ5MCd0MoE/SjuHd4leE9I/AAAAAAAAABI/Y7PYVrsnhK4/s1600-h/activity.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 145px;" src="http://3.bp.blogspot.com/_LEJ5MCd0MoE/SjuHd4leE9I/AAAAAAAAABI/Y7PYVrsnhK4/s320/activity.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5349017929908098002" /&gt;&lt;/a&gt;

&lt;p&gt;
マーケティング用語でいえば、バイラルマーケティングに有効な機能だ。さて、「ボタンを押したら"Hello!"というアクティビティを送信する」だけのシンプルなアプリだったら、以下のようになる。
&lt;/p&gt;

&lt;pre name="code" class="javascript"&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;
&amp;lt;Module&amp;gt;
  &amp;lt;ModulePrefs title="ActivityTest"&amp;gt;
    &amp;lt;Require feature="opensocial-0.8"/&amp;gt;
  &amp;lt;/ModulePrefs&amp;gt;
  &amp;lt;Content type="html"&amp;gt;
  &amp;lt;![CDATA[
    &amp;lt;script type="text/javascript"&amp;gt;
      function submitActivity() {
        var params = {};
        params[opensocial.Activity.Field.TITLE] = "Hello!";
        var activity = opensocial.newActivity(params);
        opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.HIGH, onResponse);
      }
      
      function onResponse(response) {
        if (response.hadError()) {
          alert(response.getErrorCode() + ":" + response.getErrorMessage());
        } else {
          alert("Success!");
        }
      }
    &amp;lt;/script&amp;gt;
    
    &amp;lt;button onclick="submitActivity();"&amp;gt;Say Hello!&amp;lt;/button&amp;gt;
  ]]&amp;gt;
  &amp;lt;/Content&amp;gt;
&amp;lt;/Module&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
ボタンを押すと、submitActivity()関数が呼び出され、アクティビティの作成、送信が行われる。アクティビティを作成しているのが
&lt;/p&gt;

&lt;pre name="code" class="javascript"&gt;
var params = {};
params[opensocial.Activity.Field.TITLE] = "Hello!";
var activity = opensocial.newActivity(params);
&lt;/pre&gt;

&lt;p&gt;
の部分で、opensocial.newActivity()メソッドがアクティビティを作成している。このメソッドは引数を一つだけとり、アクティビティに関する各種パラメータを指定することができる。ここでは、アクティビティのタイトルを"Hello!"としたものを引数にとっている。
&lt;/p&gt;

&lt;p&gt;
そして、
&lt;/p&gt;

&lt;pre name="code" class="javascript"&gt;
opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.HIGH, onResponse);
&lt;/pre&gt;

&lt;p&gt;
で、アクティビティを実際に送信している。opensocial.requestCreateActivity()は３つの引数（アクティビティオブジェクト、優先度、コールバック関数）をとるが、mixiアプリでは「優先度」をサポートしていないようなので、第2引数はopensocial.CreateActivityPriority.HIGHとしておけばよいようだ。
&lt;/p&gt;

&lt;p&gt;
あとは、コールバック関数onResponse(response)で、エラー処理をしている。responseは、opensocial.ResponseItemオブジェクトで、hadError()メソッドなどを用いることができる。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LEJ5MCd0MoE/Sjugl43mJXI/AAAAAAAAABQ/bpTyWK4jbvw/s1600-h/activity_test.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 229px; height: 191px;" src="http://3.bp.blogspot.com/_LEJ5MCd0MoE/Sjugl43mJXI/AAAAAAAAABQ/bpTyWK4jbvw/s320/activity_test.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5349045555213772146" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LEJ5MCd0MoE/SjugtVFZD0I/AAAAAAAAABY/RvQTbsNXbGI/s1600-h/activity_hello.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 47px;" src="http://4.bp.blogspot.com/_LEJ5MCd0MoE/SjugtVFZD0I/AAAAAAAAABY/RvQTbsNXbGI/s320/activity_hello.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5349045683046911810" /&gt;&lt;/a&gt;

&lt;p&gt;
参考URL:&lt;br/&gt;
&lt;a href="http://developer.mixi.co.jp/appli/pc/lets_enjoy_making_mixiapp/send_activity"&gt;mixi Developer Center&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-1843199947990505721?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/1843199947990505721/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/06/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/1843199947990505721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/1843199947990505721'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/06/blog-post.html' title='アクティビティの送信'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LEJ5MCd0MoE/SjuHd4leE9I/AAAAAAAAABI/Y7PYVrsnhK4/s72-c/activity.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-4479949661092929293</id><published>2009-06-18T14:05:00.015+09:00</published><updated>2009-06-23T12:33:22.651+09:00</updated><title type='text'>mixiアプリで "Hello, [ユーザ名]!" (2)</title><content type='html'>&lt;p&gt;
&lt;a href="http://opensocialist.blogspot.com/2009/06/mixi-hello-1.html"&gt;前回&lt;/a&gt;の続き。
&lt;/p&gt;

&lt;pre name="code" class="javascript"&gt;
function init() {
  var req = opensocial.newDataRequest();
  req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");
  req.send(function(data) {
    var viewer = data.get("viewer").getData();
    var name = viewer.getDisplayName();
    document.getElementById("target").innerHTML = name;
  });
}
gadgets.util.registerOnLoadHandler(init);
&lt;/pre&gt;

&lt;p&gt;
の中身を見てみよう。これは何をしているかというと、最後の
&lt;/p&gt;

&lt;pre name="code" class="javascript"&gt;
gadgets.util.registerOnLoadHandler(init);
&lt;/pre&gt;

&lt;p&gt;
というイベントハンドラで、アプリが読み込まれた後にinit()という関数を呼び出している。init()関数の中では、まず
&lt;/p&gt;

&lt;pre name="code" class="javascript"&gt;
var req = opensocial.newDataRequest();
&lt;/pre&gt;

&lt;p&gt;
で、DataRequestオブジェクトのreqを作成している。DataRequestオブジェクトは、mixiのサーバに対してデータ取得のリクエストを投げてくれるオブジェクトだ。ただ、これだけでは何にもリクエストしてくれないので、このreqに対して、個別のリクエストオブジェクトを追加する必要がある。
&lt;/p&gt;

&lt;pre name="code" class="javascript"&gt;
req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");
&lt;/pre&gt;

&lt;p&gt;
それをしているのがこの部分で、reqのnewFetchPersonRequest()というメソッドを使って、プロフィール情報を取得するためのリクエストオブジェクトを作成し、それをadd()メソッドによって、DataRequestオブジェクトのreqに追加している。
&lt;/p&gt;

&lt;p&gt;
newFetchPersonRequest()メソッドの引数には、プロフィールを取得したいユーザのIDを与える。ここで使っているopensocial.IdSpec.PersonId.VIEWERは、「このmixiアプリを開いているユーザのID」を表す。addメソッドの第2引数の"viewer"は、後でリクエストのレスポンスを識別するためのキー文字列なので、任意の文字列でOK。
&lt;/p&gt;

&lt;p&gt;
次に、reqのsend()メソッド
&lt;/p&gt;

&lt;pre name="code" class="javascript"&gt;
req.send(function(data) {...});
&lt;/pre&gt;

&lt;p&gt;
によって、実際にリクエストをサーバに送信している。このリクエストは、Ajaxで非同期に行われる。send()メソッドの引数には、データ取得後に実行するコールバック関数を入れる。コールバック関数に渡されるdataは、DataResponseクラスのオブジェクト。
&lt;/p&gt;

&lt;p&gt;
コールバック関数では、
&lt;/p&gt;

&lt;pre name="code" class="javascript"&gt;
var viewer = data.get("viewer").getData();
&lt;/pre&gt;

&lt;p&gt;
の部分で、DataResponseオブジェクトのdataから、リクエストの際に指定しておいた"viewer"というキー文字列を使ってブロフィール情報を取得している。get()メソッドの戻り値はResponseItemクラスのオブジェクトで、そこから更にgetData()することで、目的のオブジェクト（Personクラスのオブジェクト）が手に入る。
&lt;/p&gt;

&lt;p&gt;
あとは、PersonオブジェクトのgetDisplayName()で、ユーザ名を取得し、それを使ってHTMLを更新すればOK。
&lt;/p&gt;

&lt;p&gt;
参考URL:&lt;br/&gt;
&lt;a href="http://developer.mixi.co.jp/"&gt;mixi Developer Center&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-4479949661092929293?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/4479949661092929293/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/06/mixi-hello-2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/4479949661092929293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/4479949661092929293'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/06/mixi-hello-2.html' title='mixiアプリで &quot;Hello, [ユーザ名]!&quot; (2)'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-1470249222637126584</id><published>2009-06-18T10:11:00.019+09:00</published><updated>2009-06-23T12:32:58.296+09:00</updated><title type='text'>mixiアプリで "Hello, [ユーザ名]!" (1)</title><content type='html'>&lt;p&gt;
&lt;a href="http://opensocialist.blogspot.com/2009/06/mixi.html"&gt;前回&lt;/a&gt;作ったHello, world!アプリは、文字列を表示させるだけだった。
&lt;/p&gt;

&lt;p&gt;
OpenSocialを使ったソーシャルアプリケーションの醍醐味は、SNSのソーシャルグラフ（mixiだったらマイミク情報など）を活用できる点なので、今回はOpenSocial APIを使ってmixiからユーザ情報を取得してみようと思う。
&lt;/p&gt;

&lt;p&gt;
前回、ガジェットXMLの説明をなにも説明しなかったけれど、ガジェットXMLは、iGoogleで有名な「Googleガジェット」の記述言語だ。OpenSocialは、Googleガジェットをベースにつくられている。
&lt;/p&gt;

&lt;p&gt;
ガジェットXMLは、&amp;lt;Module&amp;gt;をルート要素に、以下のような格好をしている。ModulePrefs要素にアプリのメタデータを書き、Content要素中に、HTMLやJavaScriptを使ってアプリの内容を書く。
&lt;/p&gt;

&lt;pre name="code" class="xml"&gt;
&amp;lt;Module&amp;gt;
  &amp;lt;ModulePrefs .../&amp;gt;
  &amp;lt;Content ...&amp;gt;
     // アプリの内容
  &amp;lt;/Content&amp;gt;
&amp;lt;/Module&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
前回のアプリのModulePrefs要素の中には何も書いていなかったが、今回、&amp;lt;Require feature="opensocial-0.8"/&amp;gt;というタグを中に入れる。これは、「OpenSocial APIを使いますよ」という宣言だ。
&lt;/p&gt;

&lt;pre name="code" class="xml"&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;Module&amp;gt;
  &amp;lt;ModulePrefs title="HelloApp2"&amp;gt;
    &amp;lt;Require feature="opensocial-0.8" /&amp;gt;
  &amp;lt;/ModulePrefs&amp;gt;
  &amp;lt;Content type="html"&amp;gt;
  &amp;lt;![CDATA[
    // アプリの内容をHTML/JavaScriptでここに書く
  ]]&amp;gt;
  &amp;lt;/Content&amp;gt;
&amp;lt;/Module&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
さて、「Hello, [ユーザ名]!」と表示させるアプリのコード（Content要素の中身）は以下のようになる。
&lt;/p&gt;

&lt;pre name="code" class="html"&gt;
&amp;lt;div&amp;gt;Hello, &amp;lt;span id="target"&amp;gt;&amp;lt;/span&amp;gt;!&amp;lt;/div&amp;gt;

&amp;lt;script type="text/javascript"&amp;gt;
function init() {
  var req = opensocial.newDataRequest();
  req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");
  req.send(function(data) {
    var viewer = data.get("viewer").getData();
    var name = viewer.getDisplayName();
    document.getElementById("target").innerHTML = name;
  });
}
gadgets.util.registerOnLoadHandler(init);
&amp;lt;/script&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
コードの説明はまた&lt;a href="http://opensocialist.blogspot.com/2009/06/mixi-hello-2.html"&gt;次回&lt;/a&gt;。
&lt;/p&gt;

&lt;p&gt;
参考URL:&lt;br/&gt;
&lt;a href="http://developer.mixi.co.jp/"&gt;mixi Developer Center&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-1470249222637126584?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/1470249222637126584/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/06/mixi-hello-1.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/1470249222637126584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/1470249222637126584'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/06/mixi-hello-1.html' title='mixiアプリで &quot;Hello, [ユーザ名]!&quot; (1)'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-3017049191647715201</id><published>2009-06-17T20:44:00.047+09:00</published><updated>2009-06-28T13:32:12.752+09:00</updated><title type='text'>mixiアプリで "Hello, world!"</title><content type='html'>&lt;p&gt;
まず最初ということで、mixiアプリでHello, world!してみよう。
&lt;/p&gt;

&lt;p&gt;
必要なものは、
&lt;ol&gt;
&lt;li&gt;mixiアカウント&lt;/li&gt;
&lt;li&gt;テキストエディタ（僕は&lt;a href="http://www.panic.com/jp/coda/"&gt;Coda&lt;/a&gt;使ってます）&lt;/li&gt;
&lt;li&gt;Webサーバ（&lt;a href="https://www.getdropbox.com/"&gt;Dropbox&lt;/a&gt;とかでも&lt;a href="http://opensocialist.blogspot.com/2009/06/mixidropboxpublic.html"&gt;OK&lt;/a&gt;）&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
まだmixiアプリは「オープンβ」の状態なので、まずは&lt;a href="http://developer.mixi.co.jp/appli/pc/pc_prepare/regist_community_pc"&gt;オープンβコミュニティに登録&lt;/a&gt;する必要がある。登録後、&lt;a href="http://platform001.mixi.jp/"&gt;オープンβ環境&lt;/a&gt;にログインすると、画面上部に「アプリ」のメニューが表示される。そのリンク先に「アプリを作成する」というリンクがあるので、ここからアプリを新規作成できる。一番最初は、&lt;a href="http://developer.mixi.co.jp/appli/pc/pc_prepare/developer_account_regist_pc"&gt;デベロッパ登録&lt;/a&gt;をする必要あり。
&lt;/p&gt;

&lt;p&gt;
さて、「Hello, world!」と表示させるだけのアプリの場合、XMLファイルを１つWebサーバ上に置くだけでOKだ。以下のようなXMLファイルをテキストエディタで作成し、そのファイルを任意のWebサーバにアップロードしよう。
&lt;/p&gt;

&lt;pre name="code" class="xml"&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;Module&amp;gt;
  &amp;lt;ModulePrefs title="HelloApp"&amp;gt;&amp;lt;/ModulePrefs&amp;gt;
  &amp;lt;Content type="html"&amp;gt;
  &amp;lt;![CDATA[
    Hello, world!
  ]]&amp;gt;
  &amp;lt;/Content&amp;gt;
&amp;lt;/Module&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
ちなみに、このXMLファイルは「Gadget XMLファイル」と呼ばれる。あとは、mixiのアプリ作成画面の「ガジェットXML」という項目に、今アップロードしたGadget XMLファイルのURIを入力して作成すれば完了だ。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sjj9-713CvI/AAAAAAAAABA/6NfDDpskrB0/s1600-h/HelloApp.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 232px; height: 192px;" src="http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sjj9-713CvI/AAAAAAAAABA/6NfDDpskrB0/s320/HelloApp.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5348303815159778034" /&gt;&lt;/a&gt;

&lt;p&gt;
うまく作成されれば、自分のホーム画面に上のようなmixiアプリが表示されるはず。
&lt;/p&gt;

&lt;p&gt;
参考URL:&lt;br/&gt;
&lt;a href="http://developer.mixi.co.jp/"&gt;mixi Developer Center&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-3017049191647715201?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/3017049191647715201/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/06/mixi.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/3017049191647715201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/3017049191647715201'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/06/mixi.html' title='mixiアプリで &quot;Hello, world!&quot;'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sjj9-713CvI/AAAAAAAAABA/6NfDDpskrB0/s72-c/HelloApp.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3097847322885970584.post-8735491813577385648</id><published>2009-06-16T12:44:00.022+09:00</published><updated>2009-06-17T22:09:41.089+09:00</updated><title type='text'>OpenSocial 0日目　- OpenSocialとは -</title><content type='html'>&lt;p&gt;
OpenSocialには以前から興味があったのだけれど、mixiアプリのデベロッパ登録にiPhoneの「@i.softbank.jp」が使えなかったので、ずっと後回しにしていた。先日やっとiPhoneでも登録できるようになったので、いっちょ勉強を始めようかと思い立つ。
&lt;/p&gt;

&lt;p&gt;
OpenSocialとは、2007年11月にGoogleが公開した、「ソーシャルアプリケーション」のための共通APIだ。OpenSocialを使うことで、SNSのソーシャルグラフ（人と人の繋がり情報）を利用したアプリケーションを簡単に作成することができる。
&lt;/p&gt;

&lt;p&gt;
現在、MySpaceやFriendster等の多くのSNSが参加しており、日本でもmixiが参加している。アメリカSNS最大手のFacebookは独自の規格でやっているので、「Facebook vs. OpenSocial陣営」といった格好だろうか。
&lt;/p&gt;

&lt;p&gt;
OpenSocialは、HTMLやJavaScript等の、標準的なWeb技術の知識さえあれば、容易に習得できるようだ。mixiアプリがどこまで面白くなるかは未知数だけれど、OpenSocialは学んでおいて損はないと思うので、これから時間を見つけて徐々に学習を進めたいと思う。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3097847322885970584-8735491813577385648?l=opensocialist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensocialist.blogspot.com/feeds/8735491813577385648/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://opensocialist.blogspot.com/2009/06/opensocial-0-opensocial.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/8735491813577385648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3097847322885970584/posts/default/8735491813577385648'/><link rel='alternate' type='text/html' href='http://opensocialist.blogspot.com/2009/06/opensocial-0-opensocial.html' title='OpenSocial 0日目　- OpenSocialとは -'/><author><name>mach</name><uri>http://www.blogger.com/profile/15353643939688306570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_LEJ5MCd0MoE/Sj-e1R125pI/AAAAAAAAAB4/WJNfXtJpgI4/S220/chimp.jpg'/></author><thr:total>0</thr:total></entry></feed>
