狠狠撸

狠狠撸Share a Scribd company logo
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
新井 元基

Copyright(c)2009 Cyworks Inc. All Rights Reserved.
前提

? 以下については理解しているものとして進め
  ます
 ?Opensocialの仕様
 ?Javascript, jqueryの文法
 ?Ajaxの仕組み




            Copyright(c)2009 Cyworks Inc. All Rights Reserved.
オープンソーシャルアプリ?

? Javascript API(PC向け)
  ? クライアントサイドでJavascriptをばりばりコーディ
    ングする必要あり
  ? 普段サーバサイドでプログラムを書いているWEB
    屋さんにとっては、敷居が高い?過去の資産=
    ソースコードを活用できない?




            Copyright(c)2009 Cyworks Inc. All Rights Reserved.
オープンソーシャルアプリ?

? No!!
  →サーバサイドアプリケーションの土俵に持ち込む




         Copyright(c)2009 Cyworks Inc. All Rights Reserved.
どうやって?

? Iframe
  ○完全にサーバサイド
  ×Javascript APIにアクセスできない
? Ajax
  △一部クライアントサイド
  →クライアントサイドは可能な限りいじらなくて済む
   ように、毎回共通で使うクライアントプログラムを
   用意

           Copyright(c)2009 Cyworks Inc. All Rights Reserved.
具体的に

? アプリ領域全体を<div>で囲み、div領域全体
  をAjaxで書き換える
? アプリ起動時にJavascript APIでOWNER,
  VIEWER, FRIENDS(OWNER)などのSocial Data
  を取得してサーバへPOST
? サーバ側のセッションはURLパラメータでセッ
  ションIDを引き回すことで維持
? アクティビティの送信はサーバレスポンスで
           Copyright(c)2009 Cyworks Inc. All Rights Reserved.
div領域をAjaxで書き換える

? <div id="gadget_container"></div>
? gadgets.io.makeRequest でサーバからHTML
  を取得
? $(“#gadget_container”).html(<取得した
  HTML>);




           Copyright(c)2009 Cyworks Inc. All Rights Reserved.
gadget.xml
<Module>
 <ModulePrefs title="test">
  <Require feature="opensocial-0.8"/>
  <Require feature="views"/>
  <Require feature="dynamic-height"/>
 </ModulePrefs>
 <Content type="html">
  <script src=/slideshow/ss-2601386/2601386/"http:/xxxx/jquery-1.3.2.min.js" type="text/javascript"></script>
  <script src="http://xxxx/jquery.mixigadget.js" type="text/javascript"></script>
  <link href="http://xxxx/style.css" rel="stylesheet" type="text/css" />

  <script type="text/javascript">
   (function(){
     $('#gadget_container').mixigadget();
   })();
  </script>

  <div id="gadget_container"></div>
 </Content>
</Module>

                             Copyright(c)2009 Cyworks Inc. All Rights Reserved.
jquery.mixigadget.js
;(function($) {
   var name_space = 'mixigadget';
   $.fn[name_space] = function(config){
     config = jQuery.extend({
        session_id: "",
        session_key: "",
        base_url: "",
        view_name: gadgets.views.getCurrentView().getName()
     },config);

    gadgets.util.registerOnLoadHandler(gadgetInit);

    function gadgetInit() {
      switch(config.view_name) {
      case 'canvas':
        canvasInit(); break;
      }
    }

    function canvasInit() {
      klass.requestContainer('/test.html‘);
    }



                                 Copyright(c)2009 Cyworks Inc. All Rights Reserved.
klass.requestContainer = function (urlPath, urlParams) {
  requestServer(urlPath, urlParams, function(obj) {
     var html = obj.text

          var ScriptFragment = '<script[^>]*>([??S??s]*?)<?/script>';
          var scripts = html.match(new RegExp(ScriptFragment, 'img'));
          if (scripts) {
             for (var i=0; i<scripts.length; i++) {
                var script = scripts[i].match(new RegExp(ScriptFragment, 'im'));
                if (script) eval(script[1]);
             }
          }

          $("#gadget_container").html(html);
          gadgets.window.adjustHeight();
    });
}




                                   Copyright(c)2009 Cyworks Inc. All Rights Reserved.
function requestServer(urlPath, urlParams, callbackFunction) {
      if (urlParams==null) urlParams = {};
      var url = config.base_url + urlPath;
      var params = {};
      params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST;
      params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.TEXT;
      params[gadgets.io.RequestParameters.POST_DATA] = gadgets.io.encodeValues(urlParams);
      gadgets.io.makeRequest(url, callbackFunction, params);
    }

    $[name_space] = klass;
    $[name_space.replace(/_([a-z])/g, function () { return arguments[1].toUpperCase() })] = klass;
    return this;
   };
})(jQuery);




                                 Copyright(c)2009 Cyworks Inc. All Rights Reserved.
test.html
<h1>TEST</h1>
<p><a href=“#” onclick=“$.mixigadget.requestContainer('/test2.html');”>test2へのリンク</p>



test2.html
<h1>TEST2</h1>
<p><a href=“#” onclick=“$.mixigadget.requestContainer('/test1.html');”>test1へのリンク</p>




                          Copyright(c)2009 Cyworks Inc. All Rights Reserved.
Social DataをサーバへPOST

? JavaScript APIのPerson & Friends APIからデー
  タを一通り取得
? 取得したデータをJSON化
? サーバへPOST




            Copyright(c)2009 Cyworks Inc. All Rights Reserved.
jquery.mixigadget.js(追加?修正部分のみ)

 function canvasInit() {
   var req = opensocial.newDataRequest();

   var friend_params = {};
   friend_params[opensocial.DataRequest.PeopleRequestFields.MAX] = 1000;

   req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.OWNER), "owner");
   req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");

    req.add(req.newFetchPeopleRequest(opensocial.newIdSpec({'userId':opensocial.IdSpec.PersonId.OWNER,
  'groupId':opensocial.IdSpec.GroupId.FRIENDS}), friend_params), "friends");
    req.send(function (res) {
        var params = {
           "owner" : person_to_json(res.get("owner").getData()),
           "viewer" : person_to_json(res.get("viewer").getData()),
           "friends" : people_to_json(res.get("friends").getData())
        };
        klass.requestContainer('/register', params);
    });
 }


                              Copyright(c)2009 Cyworks Inc. All Rights Reserved.
function person_to_json(_person) {
  return gadgets.json.stringify(_person_to_hash(_person));
}

function people_to_json(_people) {
  var people = [];
  _people.each(function(_person) {
      people.push(_person_to_hash(_person));
  });
  return gadgets.json.stringify(people);
}

function _person_to_hash(_person) {
  var fields = {
     'mixi_id' : opensocial.Person.Field.ID,
     'thumbnail_url' : opensocial.Person.Field.THUMBNAIL_URL
  };
  var person = {};
  for (var key in fields) {
     person[key] = _person.getField(fields[key]);
  }
  person['nickname'] = _person.getDisplayName();
  return person;
}



                              Copyright(c)2009 Cyworks Inc. All Rights Reserved.
/register(サーバ側プログラム)
略(POSTされたJSONデータをセッションなりDBなりに保持する)

※Ruby on Railsの場合、以下のようにPOSTされたデータを取得できる
owner_data = JSON.parse(params['owner'])
viewer_data = JSON.parse(params['viewer'])
friends_data = JSON.parse(params['friends'])




                  Copyright(c)2009 Cyworks Inc. All Rights Reserved.
サーバのセッション維持

? /register のレスポンスHTMLでSession IDを
  Javascriptの変数にセットする




           Copyright(c)2009 Cyworks Inc. All Rights Reserved.
jquery.mixigadget.js(追加?修正部分のみ)

 klass.setSession = function(session_key, session_id) {
   config.session_key = session_key;
   config.session_id = session_id;
 }

 function requestServer(urlPath, urlParams, callbackFunction) {
   if (urlParams==null) urlParams = {};
   if (config.session_id) urlParams[config.session_key] = config.session_id;
   (以下同じ)
 }




                              Copyright(c)2009 Cyworks Inc. All Rights Reserved.
/registerのレスポンス
<script type="text/javascript">
$.mixigadget.setSession(‘_sid', ‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
</script>
<p>Hello World!!</p>




                             Copyright(c)2009 Cyworks Inc. All Rights Reserved.
アクティビティの送信

? サーバからのレスポンスHTMLでアクティビ
  ティを登録するJavascriptを実行




       Copyright(c)2009 Cyworks Inc. All Rights Reserved.
レスポンス例
<script type="text/javascript">
var params = {};
params[opensocial.Activity.Field.TITLE] = "Hello!";
var activity = opensocial.newActivity(params);
opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.HIGH,
    function(response) { // do something... });
</script>
<p>アクティビティを送信したよ!</p>




                             Copyright(c)2009 Cyworks Inc. All Rights Reserved.
まとめ

? Javascript APIしか提供されていない(mixi)
  オープンソーシャルアプリでも、サーバサイド
  アプリケーションと同じような感覚でつくること
  ができる!




         Copyright(c)2009 Cyworks Inc. All Rights Reserved.
mixiアプリモバイル

? mixiアプリモバイルでは、携帯端末で
  Javascriptが動作しないので、代わりにRESTful
  APIが提供されている




         Copyright(c)2009 Cyworks Inc. All Rights Reserved.
ということは

? モバイル向けには、サーバサイドでプログラ
  ムを組む必要がある
 ? PC向けにはJavascriptで、モバイル向けにはサー
   バサイドだと、別々のプログラムを組むことになる


→PC向けをサーバサイドアプリとして作ってい
 れば、モバイル向けにも同じプログラムを使
 える!!

        Copyright(c)2009 Cyworks Inc. All Rights Reserved.
というわけで

? 今回紹介した方法を使えば、一度でPC?モバ
  イル両対応のアプリをつくることができるので
  かなりおすすめ
 ? すでにあるWEBアプリをmixiアプリ対応するのに
   もおすすめ




        Copyright(c)2009 Cyworks Inc. All Rights Reserved.
より詳細な情報

? Peeled unshiu
  ? http://wiki.unshiu.jp/
  ? ドリコム社提供
  ? オープンソースのモバイルSNSサイト構築パッ
    ケージ(Ruby on Rails)
  ? プラグインとしてmixiアプリの構築基盤を提供
     ?ユーザー数等の各種効果測定が可能
     ?ドリコム社提供のポイント広告システム『poncan』対応


             Copyright(c)2009 Cyworks Inc. All Rights Reserved.
より詳細な情報

? mixiapp_base
  ? git://github.com/araimotoki/mixiapp_base.git
  ? Peeled unshiuのmixiアプリプラグインを改良し、単
    独でmixiアプリを作成できるようなパッケージ
    (Ruby on Rails)




              Copyright(c)2009 Cyworks Inc. All Rights Reserved.
Peeled unshiu/mixiapp_baseの紹介

? クライアント側プログラム(Javascript)がすでに用
  意されており、普段はそれらを意識する必要がな
  い
? helperが充実しており、通常の流れでJavascriptを
  直接書くことはあまりない(リッチUIの実装のため
  にjavascript(jquery)を書くことはある)

→普通にRuby on Railsでアプリケーションをつくるの
 とあまり変わらない

        Copyright(c)2009 Cyworks Inc. All Rights Reserved.
test_controller.rb
class TestController < ApplicationController
 before_filter :validate_session

 def profile
 end
 def friends
 end
end


profile.html.rb
<h1>プロフィール</h1>
<p>
 <img src=/slideshow/ss-2601386/2601386/"<%= current_owner.thumbnail_url %>"><br>
 mixi_id: <%= current_owner.mixi_id %><br>
 nickname: <%= current_owner.nickname %><br>
</p>
<%= link_to_update “友達", :url => { :action => “friends” } %><br>


friends.html.rb
<h1><%= current_owner.nickname %>の友達</h1>
<% current_owner.friends.each do |user| %>
 <p>
  <img src=/slideshow/ss-2601386/2601386/"<%= user.thumbnail_url %>"><br>
  mixi_id: <%= user.mixi_id %><br>
  nickname: <%= user.nickname %><br>
 </p>
<% end %>
<%= link_to_update “戻る", :url => { :action => “profile” } %><br>



                                               Copyright(c)2009 Cyworks Inc. All Rights Reserved.
mixiapp_baseの実用例

? マイミク記念日
 ? http://mixi.jp/run_appli.pl?id=7981
 ? 記念日のカウントダウン+マイミクの記念日に
   メッセージを送るアプリ
 ? PC?モバイル両対応




              Copyright(c)2009 Cyworks Inc. All Rights Reserved.

More Related Content

What's hot (19)

PDF
サーバサイドで動的にhtml生成していたりjQueryをガッツし使っている既存プロジェクトにAngularJSを部分的につっこんでみた @jscafe21
佐藤 俊太郎
?
PDF
Try Jetpack
Hideaki Miyake
?
PDF
Start React with Browserify
Muyuu Fujita
?
KEY
はじめてのCouch db
Eiji Kuroda
?
PPTX
BPStudy32 CouchDB 再入門
Yohei Sasaki
?
PDF
自作苍辞诲别.箩蝉フレームワークと苍驳颈苍虫を使ってラジオサイトを作ってみた
Yuki Takei
?
PDF
「スピード」と「品质」を実现する笔贬笔开発チームの取り组み~础苍驳耻濒补谤闯厂+贵耻别濒笔贬笔+础蝉辫别肠迟惭辞肠办~
leverages_event
?
PPTX
まだ顿翱惭操作で消耗してるの?
IRI MO
?
PDF
Functional JavaScript with Lo-Dash.js
Shogo Sensui
?
PDF
Webに今求められているレベル: HTML5 コントロールを利用した開発
インフラジスティックス?ジャパン株式会社
?
PDF
IgGrid 入門編
Daizen Ikehara
?
PDF
Creators'night#13 tech#2今井
Daisuke Imai
?
PDF
奥辞谤诲笔谤别蝉蝉関数の処理コストを考えよう
Naoki Matsuda
?
PDF
20150207コテ?アルエンシ?ニア学生向けハッカソン就活イヘ?ント発表资料
codeal
?
PDF
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
Tomohiro Kumagai
?
PPTX
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
Fujio Kojima
?
PDF
10分で作る Node.js Auto Scale 環境 with CloudFormation
Kazuyuki Honda
?
PDF
颁辞诲别滨驳苍颈迟别谤による笔丑飞颈迟迟谤
kenjis
?
PDF
はじめよう Backbone.js
Hiroki Toyokawa
?
サーバサイドで動的にhtml生成していたりjQueryをガッツし使っている既存プロジェクトにAngularJSを部分的につっこんでみた @jscafe21
佐藤 俊太郎
?
Try Jetpack
Hideaki Miyake
?
Start React with Browserify
Muyuu Fujita
?
はじめてのCouch db
Eiji Kuroda
?
BPStudy32 CouchDB 再入門
Yohei Sasaki
?
自作苍辞诲别.箩蝉フレームワークと苍驳颈苍虫を使ってラジオサイトを作ってみた
Yuki Takei
?
「スピード」と「品质」を実现する笔贬笔开発チームの取り组み~础苍驳耻濒补谤闯厂+贵耻别濒笔贬笔+础蝉辫别肠迟惭辞肠办~
leverages_event
?
まだ顿翱惭操作で消耗してるの?
IRI MO
?
Functional JavaScript with Lo-Dash.js
Shogo Sensui
?
Webに今求められているレベル: HTML5 コントロールを利用した開発
インフラジスティックス?ジャパン株式会社
?
IgGrid 入門編
Daizen Ikehara
?
Creators'night#13 tech#2今井
Daisuke Imai
?
奥辞谤诲笔谤别蝉蝉関数の処理コストを考えよう
Naoki Matsuda
?
20150207コテ?アルエンシ?ニア学生向けハッカソン就活イヘ?ント発表资料
codeal
?
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
Tomohiro Kumagai
?
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
Fujio Kojima
?
10分で作る Node.js Auto Scale 環境 with CloudFormation
Kazuyuki Honda
?
颁辞诲别滨驳苍颈迟别谤による笔丑飞颈迟迟谤
kenjis
?
はじめよう Backbone.js
Hiroki Toyokawa
?

Viewers also liked (17)

PPTX
Ptca office renovation
Presbytery of the Twin Cities Area
?
PPT
Understanding vc mc gill x-1_july 2016
Daniel Drouet
?
PPTX
Angelina Weld Grimke
Cassondra08
?
PPTX
Presentation Nayely
UNIVERSIDAD BANCARIA DE MEXICO
?
PPT
Futebol
yuri1995
?
PPT
Inspiratiesessie_v1.0 IM Lounge Sept 2009
IM Lounge
?
PPT
Futebol
yuri1995
?
PPTX
Las Palomas Rocky Point Mexico
Karen Lanz
?
PPS
Oxy Sales Presentation 09
Oxytrillion Science
?
PPT
Ekologinen selk?reppu ja kest?v? el?m?ntapa
One Did It Ltd
?
PPTX
Into a Changing World: PTCA
Presbytery of the Twin Cities Area
?
PPTX
Izlaganje - HR nakon tri godine recesije
Marino Milo?
?
PPTX
Radionica - Organizacijska kultura kao temelj motivacije i radnog u?inka
Marino Milo?
?
DOCX
Tugasan Kumpulan Teknology
sharina686
?
PPT
Teacher's package, Sustainable Lifestyle
One Did It Ltd
?
PPTX
Innovation centre?e utilisateur
Aix Marseille Université
?
PPTX
Brand Equity Presentation
Pradip Kumar
?
Ptca office renovation
Presbytery of the Twin Cities Area
?
Understanding vc mc gill x-1_july 2016
Daniel Drouet
?
Angelina Weld Grimke
Cassondra08
?
Presentation Nayely
UNIVERSIDAD BANCARIA DE MEXICO
?
Futebol
yuri1995
?
Inspiratiesessie_v1.0 IM Lounge Sept 2009
IM Lounge
?
Futebol
yuri1995
?
Las Palomas Rocky Point Mexico
Karen Lanz
?
Oxy Sales Presentation 09
Oxytrillion Science
?
Ekologinen selk?reppu ja kest?v? el?m?ntapa
One Did It Ltd
?
Into a Changing World: PTCA
Presbytery of the Twin Cities Area
?
Izlaganje - HR nakon tri godine recesije
Marino Milo?
?
Radionica - Organizacijska kultura kao temelj motivacije i radnog u?inka
Marino Milo?
?
Tugasan Kumpulan Teknology
sharina686
?
Teacher's package, Sustainable Lifestyle
One Did It Ltd
?
Innovation centre?e utilisateur
Aix Marseille Université
?
Brand Equity Presentation
Pradip Kumar
?
Ad

Similar to ソーシャルアプリ勉强会(第一回资料)配布用 (20)

PPT
Mixiアプリで体験する Open Social
ngi group.
?
PDF
Google Dev Fest 2010 Japan LT: OpenSocial JavaScript API is good, Lightweight...
Nobuhiro Nakajima
?
PDF
SocialWeb Conference vol.5 OpenSocial Night #2
Nobuhiro Nakajima
?
PDF
Mobile Web
Makoto Kato
?
PDF
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
Takashi Okamoto
?
PDF
Jqm20120804 publish
Takashi Okamoto
?
PDF
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Akira Inoue
?
PDF
増井雄一郎の「wri.pe」を事例に学ぶ、自作サービスの作り方?開発編 先生:増井 雄一郎
schoowebcampus
?
PDF
jQuery Mobile で作る" 実用" スマフォアプリ
Takashi Okamoto
?
PDF
Web API 標準の OpenSocial の現状と今後
FatWireKK
?
PDF
Hypermedia: The Missing Element to Building Adaptable Web APIs in Rails (増補日本語版)
Toru Kawamura
?
PPTX
ABC2012Spring 20120324
Tak Inamori
?
PDF
翱辫别苍厂辞肠颈补濒のアーキテクチャ
Eiji Kitamura
?
PDF
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
Shumpei Shiraishi
?
PDF
尘颈虫颈アプリ虫窜别苍诲贵谤补尘别飞辞谤办
清水树
?
PDF
20130315 abc firefox_os
Tomoaki Konno
?
PDF
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Naoya Ito
?
KEY
BEAR.Sunday Note
Akihito Koriyama
?
PDF
あにみた!(笔贬笔カンファレンス用资料)
Hiroyuki Ishiyama
?
PDF
Twitter連携chrome extension作り方
Hiroshi Oyamada
?
Mixiアプリで体験する Open Social
ngi group.
?
Google Dev Fest 2010 Japan LT: OpenSocial JavaScript API is good, Lightweight...
Nobuhiro Nakajima
?
SocialWeb Conference vol.5 OpenSocial Night #2
Nobuhiro Nakajima
?
Mobile Web
Makoto Kato
?
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
Takashi Okamoto
?
Jqm20120804 publish
Takashi Okamoto
?
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Akira Inoue
?
増井雄一郎の「wri.pe」を事例に学ぶ、自作サービスの作り方?開発編 先生:増井 雄一郎
schoowebcampus
?
jQuery Mobile で作る" 実用" スマフォアプリ
Takashi Okamoto
?
Web API 標準の OpenSocial の現状と今後
FatWireKK
?
Hypermedia: The Missing Element to Building Adaptable Web APIs in Rails (増補日本語版)
Toru Kawamura
?
ABC2012Spring 20120324
Tak Inamori
?
翱辫别苍厂辞肠颈补濒のアーキテクチャ
Eiji Kitamura
?
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
Shumpei Shiraishi
?
尘颈虫颈アプリ虫窜别苍诲贵谤补尘别飞辞谤办
清水树
?
20130315 abc firefox_os
Tomoaki Konno
?
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Naoya Ito
?
BEAR.Sunday Note
Akihito Koriyama
?
あにみた!(笔贬笔カンファレンス用资料)
Hiroyuki Ishiyama
?
Twitter連携chrome extension作り方
Hiroshi Oyamada
?
Ad

ソーシャルアプリ勉强会(第一回资料)配布用

  • 18. 新井 元基 Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 19. 前提 ? 以下については理解しているものとして進め ます ?Opensocialの仕様 ?Javascript, jqueryの文法 ?Ajaxの仕組み Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 20. オープンソーシャルアプリ? ? Javascript API(PC向け) ? クライアントサイドでJavascriptをばりばりコーディ ングする必要あり ? 普段サーバサイドでプログラムを書いているWEB 屋さんにとっては、敷居が高い?過去の資産= ソースコードを活用できない? Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 21. オープンソーシャルアプリ? ? No!! →サーバサイドアプリケーションの土俵に持ち込む Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 22. どうやって? ? Iframe ○完全にサーバサイド ×Javascript APIにアクセスできない ? Ajax △一部クライアントサイド →クライアントサイドは可能な限りいじらなくて済む ように、毎回共通で使うクライアントプログラムを 用意 Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 23. 具体的に ? アプリ領域全体を<div>で囲み、div領域全体 をAjaxで書き換える ? アプリ起動時にJavascript APIでOWNER, VIEWER, FRIENDS(OWNER)などのSocial Data を取得してサーバへPOST ? サーバ側のセッションはURLパラメータでセッ ションIDを引き回すことで維持 ? アクティビティの送信はサーバレスポンスで Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 24. div領域をAjaxで書き換える ? <div id="gadget_container"></div> ? gadgets.io.makeRequest でサーバからHTML を取得 ? $(“#gadget_container”).html(<取得した HTML>); Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 25. gadget.xml <Module> <ModulePrefs title="test"> <Require feature="opensocial-0.8"/> <Require feature="views"/> <Require feature="dynamic-height"/> </ModulePrefs> <Content type="html"> <script src=/slideshow/ss-2601386/2601386/"http:/xxxx/jquery-1.3.2.min.js" type="text/javascript"></script> <script src="http://xxxx/jquery.mixigadget.js" type="text/javascript"></script> <link href="http://xxxx/style.css" rel="stylesheet" type="text/css" /> <script type="text/javascript"> (function(){ $('#gadget_container').mixigadget(); })(); </script> <div id="gadget_container"></div> </Content> </Module> Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 26. jquery.mixigadget.js ;(function($) { var name_space = 'mixigadget'; $.fn[name_space] = function(config){ config = jQuery.extend({ session_id: "", session_key: "", base_url: "", view_name: gadgets.views.getCurrentView().getName() },config); gadgets.util.registerOnLoadHandler(gadgetInit); function gadgetInit() { switch(config.view_name) { case 'canvas': canvasInit(); break; } } function canvasInit() { klass.requestContainer('/test.html‘); } Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 27. klass.requestContainer = function (urlPath, urlParams) { requestServer(urlPath, urlParams, function(obj) { var html = obj.text var ScriptFragment = '<script[^>]*>([??S??s]*?)<?/script>'; var scripts = html.match(new RegExp(ScriptFragment, 'img')); if (scripts) { for (var i=0; i<scripts.length; i++) { var script = scripts[i].match(new RegExp(ScriptFragment, 'im')); if (script) eval(script[1]); } } $("#gadget_container").html(html); gadgets.window.adjustHeight(); }); } Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 28. function requestServer(urlPath, urlParams, callbackFunction) { if (urlParams==null) urlParams = {}; var url = config.base_url + urlPath; var params = {}; params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST; params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.TEXT; params[gadgets.io.RequestParameters.POST_DATA] = gadgets.io.encodeValues(urlParams); gadgets.io.makeRequest(url, callbackFunction, params); } $[name_space] = klass; $[name_space.replace(/_([a-z])/g, function () { return arguments[1].toUpperCase() })] = klass; return this; }; })(jQuery); Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 29. test.html <h1>TEST</h1> <p><a href=“#” onclick=“$.mixigadget.requestContainer('/test2.html');”>test2へのリンク</p> test2.html <h1>TEST2</h1> <p><a href=“#” onclick=“$.mixigadget.requestContainer('/test1.html');”>test1へのリンク</p> Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 30. Social DataをサーバへPOST ? JavaScript APIのPerson & Friends APIからデー タを一通り取得 ? 取得したデータをJSON化 ? サーバへPOST Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 31. jquery.mixigadget.js(追加?修正部分のみ) function canvasInit() { var req = opensocial.newDataRequest(); var friend_params = {}; friend_params[opensocial.DataRequest.PeopleRequestFields.MAX] = 1000; req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.OWNER), "owner"); req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer"); req.add(req.newFetchPeopleRequest(opensocial.newIdSpec({'userId':opensocial.IdSpec.PersonId.OWNER, 'groupId':opensocial.IdSpec.GroupId.FRIENDS}), friend_params), "friends"); req.send(function (res) { var params = { "owner" : person_to_json(res.get("owner").getData()), "viewer" : person_to_json(res.get("viewer").getData()), "friends" : people_to_json(res.get("friends").getData()) }; klass.requestContainer('/register', params); }); } Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 32. function person_to_json(_person) { return gadgets.json.stringify(_person_to_hash(_person)); } function people_to_json(_people) { var people = []; _people.each(function(_person) { people.push(_person_to_hash(_person)); }); return gadgets.json.stringify(people); } function _person_to_hash(_person) { var fields = { 'mixi_id' : opensocial.Person.Field.ID, 'thumbnail_url' : opensocial.Person.Field.THUMBNAIL_URL }; var person = {}; for (var key in fields) { person[key] = _person.getField(fields[key]); } person['nickname'] = _person.getDisplayName(); return person; } Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 33. /register(サーバ側プログラム) 略(POSTされたJSONデータをセッションなりDBなりに保持する) ※Ruby on Railsの場合、以下のようにPOSTされたデータを取得できる owner_data = JSON.parse(params['owner']) viewer_data = JSON.parse(params['viewer']) friends_data = JSON.parse(params['friends']) Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 34. サーバのセッション維持 ? /register のレスポンスHTMLでSession IDを Javascriptの変数にセットする Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 35. jquery.mixigadget.js(追加?修正部分のみ) klass.setSession = function(session_key, session_id) { config.session_key = session_key; config.session_id = session_id; } function requestServer(urlPath, urlParams, callbackFunction) { if (urlParams==null) urlParams = {}; if (config.session_id) urlParams[config.session_key] = config.session_id; (以下同じ) } Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 37. アクティビティの送信 ? サーバからのレスポンスHTMLでアクティビ ティを登録するJavascriptを実行 Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 38. レスポンス例 <script type="text/javascript"> var params = {}; params[opensocial.Activity.Field.TITLE] = "Hello!"; var activity = opensocial.newActivity(params); opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.HIGH, function(response) { // do something... }); </script> <p>アクティビティを送信したよ!</p> Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 39. まとめ ? Javascript APIしか提供されていない(mixi) オープンソーシャルアプリでも、サーバサイド アプリケーションと同じような感覚でつくること ができる! Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 40. mixiアプリモバイル ? mixiアプリモバイルでは、携帯端末で Javascriptが動作しないので、代わりにRESTful APIが提供されている Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 41. ということは ? モバイル向けには、サーバサイドでプログラ ムを組む必要がある ? PC向けにはJavascriptで、モバイル向けにはサー バサイドだと、別々のプログラムを組むことになる →PC向けをサーバサイドアプリとして作ってい れば、モバイル向けにも同じプログラムを使 える!! Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 42. というわけで ? 今回紹介した方法を使えば、一度でPC?モバ イル両対応のアプリをつくることができるので かなりおすすめ ? すでにあるWEBアプリをmixiアプリ対応するのに もおすすめ Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 43. より詳細な情報 ? Peeled unshiu ? http://wiki.unshiu.jp/ ? ドリコム社提供 ? オープンソースのモバイルSNSサイト構築パッ ケージ(Ruby on Rails) ? プラグインとしてmixiアプリの構築基盤を提供 ?ユーザー数等の各種効果測定が可能 ?ドリコム社提供のポイント広告システム『poncan』対応 Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 44. より詳細な情報 ? mixiapp_base ? git://github.com/araimotoki/mixiapp_base.git ? Peeled unshiuのmixiアプリプラグインを改良し、単 独でmixiアプリを作成できるようなパッケージ (Ruby on Rails) Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 45. Peeled unshiu/mixiapp_baseの紹介 ? クライアント側プログラム(Javascript)がすでに用 意されており、普段はそれらを意識する必要がな い ? helperが充実しており、通常の流れでJavascriptを 直接書くことはあまりない(リッチUIの実装のため にjavascript(jquery)を書くことはある) →普通にRuby on Railsでアプリケーションをつくるの とあまり変わらない Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 46. test_controller.rb class TestController < ApplicationController before_filter :validate_session def profile end def friends end end profile.html.rb <h1>プロフィール</h1> <p> <img src=/slideshow/ss-2601386/2601386/"<%= current_owner.thumbnail_url %>"><br> mixi_id: <%= current_owner.mixi_id %><br> nickname: <%= current_owner.nickname %><br> </p> <%= link_to_update “友達", :url => { :action => “friends” } %><br> friends.html.rb <h1><%= current_owner.nickname %>の友達</h1> <% current_owner.friends.each do |user| %> <p> <img src=/slideshow/ss-2601386/2601386/"<%= user.thumbnail_url %>"><br> mixi_id: <%= user.mixi_id %><br> nickname: <%= user.nickname %><br> </p> <% end %> <%= link_to_update “戻る", :url => { :action => “profile” } %><br> Copyright(c)2009 Cyworks Inc. All Rights Reserved.
  • 47. mixiapp_baseの実用例 ? マイミク記念日 ? http://mixi.jp/run_appli.pl?id=7981 ? 記念日のカウントダウン+マイミクの記念日に メッセージを送るアプリ ? PC?モバイル両対応 Copyright(c)2009 Cyworks Inc. All Rights Reserved.