SlideShare uma empresa Scribd logo
1 de 47
Baixar para ler offline
新井 元基

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="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="<%= 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="<%= 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.

Mais conteúdo relacionado

Mais procurados

サーバサイドで動的にhtml生成していたりjQueryをガッツし使っている既存プロジェクトにAngularJSを部分的につっこんでみた @jscafe21
サーバサイドで動的にhtml生成していたりjQueryをガッツし使っている既存プロジェクトにAngularJSを部分的につっこんでみた @jscafe21サーバサイドで動的にhtml生成していたりjQueryをガッツし使っている既存プロジェクトにAngularJSを部分的につっこんでみた @jscafe21
サーバサイドで動的にhtml生成していたりjQueryをガッツし使っている既存プロジェクトにAngularJSを部分的につっこんでみた @jscafe21佐藤 俊太郎
 
Start React with Browserify
Start React with BrowserifyStart React with Browserify
Start React with BrowserifyMuyuu Fujita
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch dbEiji Kuroda
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門Yohei Sasaki
 
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみたYuki Takei
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~leverages_event
 
まだDOM操作で消耗してるの?
まだDOM操作で消耗してるの?まだDOM操作で消耗してるの?
まだDOM操作で消耗してるの?IRI MO
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 
Creators'night#13 tech#2今井
Creators'night#13 tech#2今井Creators'night#13 tech#2今井
Creators'night#13 tech#2今井Daisuke Imai
 
WordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えようWordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えようNaoki Matsuda
 
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料codeal
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiTomohiro Kumagai
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)Fujio Kojima
 
10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormation10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormationKazuyuki Honda
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittrkenjis
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.jsHiroki Toyokawa
 

Mais procurados (19)

サーバサイドで動的にhtml生成していたりjQueryをガッツし使っている既存プロジェクトにAngularJSを部分的につっこんでみた @jscafe21
サーバサイドで動的にhtml生成していたりjQueryをガッツし使っている既存プロジェクトにAngularJSを部分的につっこんでみた @jscafe21サーバサイドで動的にhtml生成していたりjQueryをガッツし使っている既存プロジェクトにAngularJSを部分的につっこんでみた @jscafe21
サーバサイドで動的にhtml生成していたりjQueryをガッツし使っている既存プロジェクトにAngularJSを部分的につっこんでみた @jscafe21
 
Try Jetpack
Try JetpackTry Jetpack
Try Jetpack
 
Start React with Browserify
Start React with BrowserifyStart React with Browserify
Start React with Browserify
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch db
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門
 
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
 
まだDOM操作で消耗してるの?
まだDOM操作で消耗してるの?まだDOM操作で消耗してるの?
まだDOM操作で消耗してるの?
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
Webに今求められているレベル: HTML5 コントロールを利用した開発
Webに今求められているレベル: HTML5 コントロールを利用した開発Webに今求められているレベル: HTML5 コントロールを利用した開発
Webに今求められているレベル: HTML5 コントロールを利用した開発
 
IgGrid 入門編
IgGrid 入門編IgGrid 入門編
IgGrid 入門編
 
Creators'night#13 tech#2今井
Creators'night#13 tech#2今井Creators'night#13 tech#2今井
Creators'night#13 tech#2今井
 
WordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えようWordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えよう
 
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
 
10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormation10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormation
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittr
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.js
 

Destaque

Understanding vc mc gill x-1_july 2016
Understanding vc mc gill x-1_july 2016Understanding vc mc gill x-1_july 2016
Understanding vc mc gill x-1_july 2016Daniel Drouet
 
Angelina Weld Grimke
Angelina Weld GrimkeAngelina Weld Grimke
Angelina Weld GrimkeCassondra08
 
Inspiratiesessie_v1.0 IM Lounge Sept 2009
Inspiratiesessie_v1.0 IM Lounge Sept 2009Inspiratiesessie_v1.0 IM Lounge Sept 2009
Inspiratiesessie_v1.0 IM Lounge Sept 2009IM Lounge
 
Las Palomas Rocky Point Mexico
Las Palomas Rocky Point MexicoLas Palomas Rocky Point Mexico
Las Palomas Rocky Point MexicoKaren Lanz
 
Ekologinen selkäreppu ja kestävä elämäntapa
Ekologinen selkäreppu ja kestävä elämäntapaEkologinen selkäreppu ja kestävä elämäntapa
Ekologinen selkäreppu ja kestävä elämäntapaOne Did It Ltd
 
Izlaganje - HR nakon tri godine recesije
Izlaganje - HR nakon tri godine recesijeIzlaganje - HR nakon tri godine recesije
Izlaganje - HR nakon tri godine recesijeMarino Miloš
 
Radionica - Organizacijska kultura kao temelj motivacije i radnog učinka
Radionica - Organizacijska kultura kao temelj motivacije i radnog učinka Radionica - Organizacijska kultura kao temelj motivacije i radnog učinka
Radionica - Organizacijska kultura kao temelj motivacije i radnog učinka Marino Miloš
 
Tugasan Kumpulan Teknology
Tugasan Kumpulan TeknologyTugasan Kumpulan Teknology
Tugasan Kumpulan Teknologysharina686
 
Teacher's package, Sustainable Lifestyle
Teacher's package, Sustainable LifestyleTeacher's package, Sustainable Lifestyle
Teacher's package, Sustainable LifestyleOne Did It Ltd
 
Brand Equity Presentation
Brand Equity PresentationBrand Equity Presentation
Brand Equity PresentationPradip Kumar
 

Destaque (17)

Ptca office renovation
Ptca office renovationPtca office renovation
Ptca office renovation
 
Understanding vc mc gill x-1_july 2016
Understanding vc mc gill x-1_july 2016Understanding vc mc gill x-1_july 2016
Understanding vc mc gill x-1_july 2016
 
Angelina Weld Grimke
Angelina Weld GrimkeAngelina Weld Grimke
Angelina Weld Grimke
 
Presentation Nayely
Presentation NayelyPresentation Nayely
Presentation Nayely
 
Futebol
FutebolFutebol
Futebol
 
Inspiratiesessie_v1.0 IM Lounge Sept 2009
Inspiratiesessie_v1.0 IM Lounge Sept 2009Inspiratiesessie_v1.0 IM Lounge Sept 2009
Inspiratiesessie_v1.0 IM Lounge Sept 2009
 
Futebol
FutebolFutebol
Futebol
 
Las Palomas Rocky Point Mexico
Las Palomas Rocky Point MexicoLas Palomas Rocky Point Mexico
Las Palomas Rocky Point Mexico
 
Oxy Sales Presentation 09
Oxy Sales Presentation 09Oxy Sales Presentation 09
Oxy Sales Presentation 09
 
Ekologinen selkäreppu ja kestävä elämäntapa
Ekologinen selkäreppu ja kestävä elämäntapaEkologinen selkäreppu ja kestävä elämäntapa
Ekologinen selkäreppu ja kestävä elämäntapa
 
Into a Changing World: PTCA
Into a Changing World: PTCAInto a Changing World: PTCA
Into a Changing World: PTCA
 
Izlaganje - HR nakon tri godine recesije
Izlaganje - HR nakon tri godine recesijeIzlaganje - HR nakon tri godine recesije
Izlaganje - HR nakon tri godine recesije
 
Radionica - Organizacijska kultura kao temelj motivacije i radnog učinka
Radionica - Organizacijska kultura kao temelj motivacije i radnog učinka Radionica - Organizacijska kultura kao temelj motivacije i radnog učinka
Radionica - Organizacijska kultura kao temelj motivacije i radnog učinka
 
Tugasan Kumpulan Teknology
Tugasan Kumpulan TeknologyTugasan Kumpulan Teknology
Tugasan Kumpulan Teknology
 
Teacher's package, Sustainable Lifestyle
Teacher's package, Sustainable LifestyleTeacher's package, Sustainable Lifestyle
Teacher's package, Sustainable Lifestyle
 
Innovation centrée utilisateur
Innovation centrée utilisateurInnovation centrée utilisateur
Innovation centrée utilisateur
 
Brand Equity Presentation
Brand Equity PresentationBrand Equity Presentation
Brand Equity Presentation
 

Semelhante a ソーシャルアプリ勉強会(第一回資料)配布用

初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣Yuji Takayama
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Yuji Takayama
 
【ネイティブアドを支えるPhantomJS】
【ネイティブアドを支えるPhantomJS】【ネイティブアドを支えるPhantomJS】
【ネイティブアドを支えるPhantomJS】Kengo Shimada
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -Yuji Takayama
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-EdoYuji Takayama
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
Express Web Application Framework
Express Web Application FrameworkExpress Web Application Framework
Express Web Application FrameworkLearningTech
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for JavaTakuya Tsuchida
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Akira Inoue
 
Infrastructure as code for azure
Infrastructure as code for azureInfrastructure as code for azure
Infrastructure as code for azureKeiji Kamebuchi
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方Fumihiko Shiroyama
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
進化する Web ~ Progressive Web Apps の実装と応用 ~
進化する Web  ~ Progressive Web Apps の実装と応用 ~進化する Web  ~ Progressive Web Apps の実装と応用 ~
進化する Web ~ Progressive Web Apps の実装と応用 ~Microsoft Azure Japan
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
SocialWeb Conference vol.5 OpenSocial Night #2
SocialWeb Conference vol.5 OpenSocial Night #2SocialWeb Conference vol.5 OpenSocial Night #2
SocialWeb Conference vol.5 OpenSocial Night #2Nobuhiro Nakajima
 
初めての Data api
初めての Data api初めての Data api
初めての Data apiYuji Takayama
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxNobuhiro Sue
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 

Semelhante a ソーシャルアプリ勉強会(第一回資料)配布用 (20)

JavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, PerformanceJavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, Performance
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
 
【ネイティブアドを支えるPhantomJS】
【ネイティブアドを支えるPhantomJS】【ネイティブアドを支えるPhantomJS】
【ネイティブアドを支えるPhantomJS】
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-Edo
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
Express Web Application Framework
Express Web Application FrameworkExpress Web Application Framework
Express Web Application Framework
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for Java
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
Infrastructure as code for azure
Infrastructure as code for azureInfrastructure as code for azure
Infrastructure as code for azure
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
進化する Web ~ Progressive Web Apps の実装と応用 ~
進化する Web  ~ Progressive Web Apps の実装と応用 ~進化する Web  ~ Progressive Web Apps の実装と応用 ~
進化する Web ~ Progressive Web Apps の実装と応用 ~
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
SocialWeb Conference vol.5 OpenSocial Night #2
SocialWeb Conference vol.5 OpenSocial Night #2SocialWeb Conference vol.5 OpenSocial Night #2
SocialWeb Conference vol.5 OpenSocial Night #2
 
初めての Data api
初めての Data api初めての Data api
初めての Data api
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
 
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 

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

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 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="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="<%= 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="<%= 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.