Opensocial入門を読んで見た(第五章)四回目

今日、「1億人のユーザーを抱える『FarmVille』の開発と運用・・・Zynga 」の連載を見ました。

Facebookアプリの『FarmVille』は僅か5週間という開発期間の中で、11名のスタッフによって制作されました。今、インストール数では1億1000万人以上、3100万人が毎日遊ぶというゲームみたいです。

いくつか今後の参考になる部分がありました。 1、開発は以下のプログラミング言語で作られています。

  • サーバー側にPHP
  • クライアント側にFLASHを採用。

2、スケーラビリティに関してはネットワークレイヤーを置く。 スケーラビリティとは、コンピュータシステムの持つ拡張性。システムの利用者や負荷の増大に応じて、柔軟に性能や機能を向上させられることを意味する。

3、その他 ロード時間の短縮には リモートコールの徹底した排除や、 ソーシャルネットワークラッパーの中の遅いFacebook APIの呼び出しや、 DBラッパーの中のSQLなどをキャッシュすることで対処しています。

ZyngaではNagiosやMuninを使って常にサーバーの負荷を監視しています。ロード時間/トラフィックのグラフ、Memcacheの解放回数などをチェックしているようです。

OpenSocial入門 ~ソーシャルアプリケーションの実践開発 OpenSocial入門 ~ソーシャルアプリケーションの実践開発

mixiアプリ内でFlashを使ってみよう

上記の記事にも書いてあるように、実際に利用者の方に見てもらう画面はFlashで作ればより動的に表現をすることができます。 利用方法は簡単に以下の3点です。 1、Flashに対応するためには、Gadgets XMLファイル内で設定が必要です。その際にはタグのfeatureを使います。 [cc lang="javascript"] [/cc]

2、次にの中にパラメータを記載 [cc lang="javascript"]

[/cc] 注意点 mixiアプリ内でFlashコンポーネントを使用する際に、他のマイミクにmixiアプリの利用を勧めるための招待機能を利用すると、表示上の問題が発生する場合があります。 これを回避するために、wmode属性値として、”transparent”もしくは”opaque”を記述します。 上記の対応により、招待機能のポップアップ画面がFlashコンポーネントよりも手前に表示されるようになります。

3、実際にmixiアプリにFlashを埋め込む [cc lang="javascript"]

[/cc] gadgets.flash.embedFlash()の引数は以下の通りです。

  1. swfファイルのURL
  2. Flashコンテンツを埋め込む先となるDOM要素またはID文字列
  3. 対象Flashコンテンツが必要とする「Flash player」の最小バージョン
  4. Flashコンテンツが埋め込まれる際に指定したいパラメータを持つオブジェクト

第二引数としてDOM要素をしていることになるため、あらかじめタグの[CDATAセクションのなかに「div」を仕込んでおくか、動的要素に生成しておくことが求められます。

情報を共有しよう。

※抜粋 mixiアプリは、Persistence APIを利用することで、情報の永続化および共有を行うことが可能となります。その際、特に共有に関して、扱われる情報の持ち主が誰なのか、という点を考慮した処理を記述することになります。つまり、永続化された情報の取得に関して「誰の情報を取得するか」という指定が必要となるということです。

1、情報の永続化 [cc lang="javascript"] var exp = "1<x<3"; var result = 2; var req = opensocial.newDataRequest(); req.add(req.newUpdatePersonAppDataRequest(opensocial.IdSpec.personId.VIEWER,"exp",exp),"response1"); req.add(req.newUpdatePersonAppDataRequest(opensocial.IdSpec.personId.VIEWER,"result",result),"response2");

req.send(function(data){ if(data.hadError()){ var msg =data.getErrorMessage(); //要求を失敗した際のエラー }else { var response1 = data.get("response1"); if(response1.hadError()){ var code = response1.getErrorCode(); var msg = response1.getErrorMessage(); //永続化に失敗したときのエラー処理         } // response2についても同様の処理 } }); [/cc]

永続化で利用するのは「req.newUpdatePersonAppDataRequest」です。

  • 第一引数には会員を特定するためのID(ほとんどの場合VIEWER)
  • 第二引数には永続化する情報のキー文字列
  • 第三引数は永続化する情報の文字列

これらの引数を呼び出した結果を、「opensocial.DataRequest.add()関数」に渡して、send()でにリクエストを送ります。

2、永続化された情報を取り出す。

[cc lang="javascript"] var req = opensocial.newDataRequest(); req.add[req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer"); var keys =["exp","result"]; var idSpecPrams = {}; idSpecParams[opencioal.IdSpec.Field.USER_ID] = opensocial.idSpec.PersonId.VIEWER; var idSpec = opensocial.newIdSpec(idSpecParams); req = add(req.newFetchPersonAppDataRequest(idSpec,keys),"stored"); //この際、取得対象とする情報のキー名(stored)を指定します。 req.send(function(data){ var viewer = data.get("viewer"),getData(); var stored = data.get("stored").getData(); var obj = stored[viewer.getId()]; var exp = obj["exp"]; var result = obj["result"]; //expおよびresultを画面に表示 }); [/cc]

永続化された情報を取り出す際には「誰の情報を取得する」かを指定する必要があります。今回はVIEWERを対象としています。今回は変数(idSpecParams)で対象となるVIEWERを設定し、それを引数に新しいopensocial.idSpec()オブジェクトを生成します。

Persistence APIにて提供されるnewFetchPersonAppDataRequest()関数を使うことで、永続化された情報を取得することができます。第一引数に対象者を、第二引数に永続されている情報を特定するキー文字列を指定しています。(今回は情報が2つあるので配列で"exp""result"を入れている)

後はsend()で指定しているコールバック関数を使い、取得した永続化情報を取り出しています。 永続化されている全ての情報を取得したい場合には、全てのキー文字列を配列で渡す方法の他に、「」を指定することも可能です。 [cc lang="actionscript"] req = add(req.newFetchPersonAppDataRequest(idSpec,""),"stored"); [/cc]

3、永続化された情報を削除する。

[cc lang="actionscript"] var req = opensocial.newDataRequest(); req.add(req.newRemovePersonAppDataRequest( opensocial.IdSpec.PersonId.VIEWER, keys), "stored"); req.send(function(data) { var response = data.get("stored").getData(); if(response.hadError()){ //エラーの出た際の処理 }); [/cc] 【mixiアプリの場合】 newRemovePersonAppDataRequest()関数の第1引数には、 opensocial.IdSpec.PersonId.VIEWERのみ指定することが可能となっています。

第二引数には削除対象のキー文字列の配列、あるいは全てのキーを表す「*」を指定します。