KLab若手エンジニアの これなぁに?

KLab株式会社の若手エンジニアによる技術ブログです。phpやRubyなどの汎用LLやJavaScript/actionScript等のクライアントサイドの内容、MySQL等のデータベース、その他フレームワークまで幅広く面白い情報を発信します。

2010年03月

ソーシャルアプリの作り方 第三回 - OpenFeint

umjammer です、 ソーシャルアプリの作り方の第三回になります。 ソーシャルアプリとして Mixi アプリを作成しましたが、単なるゲームを Mixi に持ってきただけではソーシャルな要素が全くなく、ソーシャルなプラットフォームを使う意味がありません。 このシリーズでは前回前々回にすでに出てきているようにハイスコア管理をソーシャル要素として使用します。アプリの内容がゲームですからソーシャルグラフ上でスコアを競ってもらいます。またできるだけ簡単に作ることを方針としていますので、一から API を実装するつもりはありません。Mixi はゲームに特化した API は公開していませんので、すでに世の中にあるソーシャルプラットフォームを探し出してきて使用します。 今回はゲームに特化したソーシャルプラットフォームとして今 iPhone で盛り上がりつつある OpenFeint を使用することにします。SPACE INVADERS INFINITY GENE も採用してますよ。
OpenFeint Logo


ここからがこのシリーズの一番の目玉になります! OpenFeint は iPhone 用に SDK をオープンソースで提供しています。今のところ Objective-C で書かれた iPhone 用しか存在しません。盛り上がっているソーシャルプラットフォームなのでぜひ使用したいものです。幸い SDK はオープンソースなのでプロトコルを解析してやれば他のプラットフォームでも動かすことが出来そうです。

OpenFeint プロトコル解析

iPhone 用の SDK にコンパイル時オプションとして -DDEBUG を設定してやります。あとソースを追っかけていくと最終的に NSURLConnection クラスを使用しているので通信メソッドに渡すパラメータなどを NSLog で出力させるようにします。そして iPhone 用に OpenFeint を使用したサンプルゲームを作成して、実際操作しながら機能に対する通信ログを取っていきます。OpenFeint SDK は UI も含めた膨大な機能を持っていますので、今回は OpenFeint に対するログインと、ユーザー操作、ハイスコア、アチーブメント機能あたりに絞って解析しました。 解析して分かったことは、OpenFeint API は REST を用いて API 認可には HMAC-SHA1 シグネチャの OAuth を使用しています。そしてデータとして XML を返します。JSON じゃないんですね。

REST & OAuth

OAuth はライブラリが公開されていますのでそれを使用します。簡単に使用するために軽くラップします。 http://code.google.com/p/umjammer/source/browse/trunk/vavi-apps-gae03/src/main/java/vavi/util/openfeint/OpenfeintOAuthUtil.java GAE/J 上ではホワイトリストの関係上 HTTPClient4 が使用できなかったのでその辺りを自作します。通信は OpenFeint API が https を使用しているため、頻繁にタイムアウトが起こります。GAE/J の API の URLFetch にはソケットのタイムアウト指定ができないため URLConnection を使用します。 http://code.google.com/p/umjammer/source/browse/trunk/vavi-apps-gae03/src/main/java/vavi/util/openfeint/GaeHttpClient.java

XML Binding

戻り値である XML の定義 XSD を OpenFeint は用意してくれていませんので、さきほど解析した実データの XML インスタンスを素に XSD を作ります。Castor というソフトウェアにその機能が備わっていますので使用します。ただしパッチが必要なのですが。 XML インスタンスから XSD を作成する ant のマクロ定義例

  <macrodef name="xml2xsd"
            description="Generate XML Schema from XML Instance.">
    <attribute name="in" />
    <attribute name="out" />
    <sequential>
      <java classname="org.exolab.castor.xml.schema.util.XMLInstance2Schema"
            fork="true">
        <classpath>
          <pathelement location="${dir.build}" />
          <path refid="run.class.path" />
          <fileset dir="${ant.home}/lib">
            <include name="*.jar" />
          </fileset>
        </classpath>
        <arg value="@{in}"/>
        <arg value="@{out}"/>
      </java>
    </sequential>
  </macrodef>
XSD ができれば JAXB を使用して Java XML バインディングを行います。これで OpenFeint API の XML を気にすることなくコーディング出来ます。 JAXB で XML Binding を行う ant のマクロ定義例

  <macrodef name="xsd2jaxb" description="works fine">
    <attribute name="package" />
    <attribute name="url" />
    <attribute name="dir" />
    <sequential>
      <delete>
    	<fileset dir="@{dir}">
    	  <include name="*.java" />
    	</fileset>
      </delete>
      <exec executable="${xjc.bin}">
        <arg line="-p @{package}"/>
        <arg line="-d @{dir}"/>
        <arg line="@{url}"/>
      </exec>
    </sequential>
  </macrodef>
OAuth API をラップしたコードと自動生成された XML Binding コードを使用して OpenFeint API for GAE/J を作成していきます。


完成したところで、外部 API であるハイスコアリストを呼び出してみます。
OpenFeint Ranking on GAE/J


まとめ

ハイスコア管理を外部 API として GAE 越えで OpenFeint API にアクセスするソーシャルアプリがこれで完成しました。通信が二段階で行われるため実用スピードにするにはもう少し工夫する必要がありますね。 OpenFeint API は GAE/J に移植できたわけですから Android にも簡単に移植できますね。これで iPhone, Android, Mixi 共通でハイスコア管理できたりできるようになりますよ。 もう一つ、XML のインスタンスから XSD を作成する方法は、●天 WEB SERVICE をはじめ国内の XML を返すウェブサービスがほとんど XSD なり DTD を公開していないためよく活用させてもらっています。

シリーズのまとめ

三回にわたりソーシャルアプリをお手軽に作成する方法を紹介しました。アプリ、ホスティング、ソーシャル API すべて無料で作成することができます。そして将来的に Mixi 等で公開してトラフィックが増えたとしても僅かな課金で行えそうだと言うレポートも存在します。みなさんもチャレンジしてみてはいかがでしょうか? OpenFeint for Java も独立したプロジェクトとして公開したいと思います。API が膨大なため実装が大変です。協力してくれる人いないかな?OpenFeint for Android を本家より先に出せたらなぁ?と妄想中です。

ソーシャルアプリの作り方 第二回 - GAE ホスティング

umjammer です、 ソーシャルアプリの作り方の第二回になります。 第一回目で Mixi アプリを作成しましたが、それをホスティングする必要があります。また外部 API としてハイスコア管理をしたいので、それを行う Web App を作成してホスティングする場所が必要になります。 今回はある程度の規模までならタダで、しかも簡単にスケールしてくれる Google App Engine で Mixi アプリをホスティングすることにします。
GAE Logo


まず Mixi アプリですが ガジェット XML やその他 html, javascript は普通に配置します。
OpenSocial, GAE


次に外部 API のハイスコア管理を実装するために Web App を実装します。

足回り

GAE はどこからでもアクセスできてしまいます。そのため Mixi アプリ以外からのリクエストを遮断するために OAuth を使用します。 OAuth は OpenSocial でも使用されている API 認可方式です。Mixi API は OpenSocial ベースなので同じものを採用します。 サーブレットフィルタとして実装されているソフトウェアが存在するので利用させていただきます。 フィルタ実装ですと Web App は認可を気にせずコーディングできるので大変便利です。Mixi から取得した公開鍵、アプリID, ガジェットXMLのURL を設定して、web.xml にフィルタとして登録します。


Mixi 公開鍵の URL

Web App 実装

外部 API は簡単に作成するために REST API のフレームワークを使用します。JSR-311 のリファレンス実装である Jersey を採用してみました。アノテーションと DI が使えるのでかなり楽にプログラムが組めます。HTML のテンプレート等を簡単に扱えるレンダラがあれば言うこと無しなのですが。 http://code.google.com/p/umjammer/source/browse/trunk/vavi-apps-gae03/src/main/java/vavi/apps/umjammer03/lr/LodeRunnerResource.java Data Store に関しても楽をしたかったので SpringFramework の AOP Transaction を使用した JPA で書いてみました。私トランザクションの例外処理を書くのが大嫌いなんです。 http://code.google.com/p/umjammer/source/browse/trunk/vavi-apps-gae03/src/main/java/vavi/apps/umjammer03/lr/MixiFeint.java http://code.google.com/p/umjammer/source/browse/trunk/vavi-apps-gae03/src/main/java/vavi/apps/umjammer03/lr/MixiFeintService.java あとはチューニングとして Cache API なども使用します。

まとめ

フレームワークを使いすぎました。Web App 自体は簡単に作成することができましたが、実際に動かしてみると spin-up にものすごく時間がかかります。 GAE/J はこのあたりを気にしないといけないのが辛いところですね。 ともあれ、SpringFramework や JSR-311 などは何も気にせずに GAE/J に載せることができたので、アプリケーションを簡単に GAE でホスティングすることができました。 次回はこのシリーズの目玉になります。お楽しみに。

ソーシャルアプリの作り方 第一回 - Mixi アプリ

umjammer です。 ソーシャルアプリ、盛り上がっていますね。 クライアントが多いゲームだとユーザー数が100万人単位とか、B2Cシステムの極みともいえる大規模分散処理が必要とされるインフラが求められます。そんな大掛かりなアプリケーションを作成する場合は、手前味噌になりますが DSAS Hosting for Social 等を利用することになるでしょう。 一方、小ぢんまり始めるのなら世の中にはソーシャルアプリを動かすインフラがすでに用意されています。 このシリーズでは簡単に始めてしまおうをコンセプトに、ソーシャルアプリの作り方を三回にわたって紹介していこうと思います。
Social Application Map


まずは第一回として Mixi アプリを作ってみます。 Mixi アプリに限らず、ソーシャルアプリは基本 JavaScript もしくは Flash で作成しますが、一から作るとなると面倒ですよね。しかし良く考えてみるとブラウザと連携が可能なプラットフォーム、つまりプラットフォームから JavaScript にアクセス出来る仕組みさえあれば、開発は JavaScript に限らず行うことができます。最近では 3D プラットフォーム なども存在します。 今回はちょうど手元にあった、いにしえの Java Applet のプログラムを移植してみます。ブラウザで動く Java には LiveConnect というブラウザとの連携 API が存在します。すべてのブラウザに載っているわけではないのですが Firefox 3.6, Safari 4 等は対応していますのでまあ良しとしましょう。 Mixi アプリはダウンロード元が Mixi のホストになります。Java Applet は自前でホスティングしています。Java Applet はクロスドメイン制約があるため直接 Mixi ホストの OpenSocial API にアクセスすることはできません。よって LiveConnect を使用して JavaScript の関数をを呼ぶことになります。 Java Applet から JavaScript 関数を呼ぶ (ハイスコア)

    JSObject window = JSObject.getWindow(applet);
    window.call("setScore", 1000);

JavaScript 側 (外部 API)

    function setScore(score) {
      var params = {};
      params[gadgets.io.RequestParameters.AUTHORIZATION] =
          gadgets.io.AuthorizationType.SIGNED;
      gadgets.io.makeRequest(url + "/" + score, setScoreCallback, params);
    }
JavaScript 側で OpenSocial API や外部 API 呼出しを行ってあげれば Applet で OpenSocial API を制御できます。 また JavaScript 側の API 呼び出しは非同期が基本ですので、 Java 側にあとで値を設定する場面が出てきます。 JavaScript から Java メソッドを呼ぶ

document.applets["appletName"].java_method(args)

出来上がりはこんな感じ、
Mixi Lode Runner


ゲームオーバーになると自分のスコアが外部 API 呼び出しで登録され、ハイスコアランキングが更新されるようになっています。 版権モノなので残念ながら Mixi では一般公開はしていません。 Java Applet で Mixi アプリのソース まとめ Java Applet で Mixi アプリができました。あなたの PC の中でホコリを被っている Applet や、ここで紹介している方法 で iAppli なども Mixi アプリにすることが可能になりますよ!もちろん Flash や JavaScript のゲームですともっと簡単に移植できますね!みなさんが持っていて使わなくなったゲームを再び日の当たる場所に出してあげませんか?

Java Native Access (JNA) で遊んでみる

umjammer です、 社内の Tech ML に同僚が Java Native Access 面白そうだよと投稿したのを見て、私も Java Native Interface (JNI) はよく触る方なので興味をそそられました。試してみようと今までに JNI で書いた物を JNA に適用することにしました。 題材としては、日本語をしゃべってくれる AquesTalk を JNI でラップしたライブラリを以前作ったことがあったので、それを使用します。 AquesTalk は C のライブラリでヘッダーファイルは以下のように定義されています。 C Header http://vavi-sound.googlecode.com/svn/trunk/vavi-speech/etc/include/AquesTalkDa.h それを JNA の方法にのっとって Java のクラスに変換します。 JNA http://vavi-sound.googlecode.com/svn/trunk/vavi-speech/src/main/java/vavi/speech/aquestalk/jna/AquesTalkDa.java 以前書いた JNI だとこんな感じでした。 JNI http://code.google.com/p/vavi-sound/source/browse/trunk/vavi-speech/src/main/jni/win32/AquesTalkWrapper.c AquesTalk のライブラリが簡単なメソッドの構造なので JNA に適用するのは簡単でした。 JNI と違い C のコードを一切書かなくて済むので楽ですね。 できたところで日本語をしゃべらせようとしましたが、AquesTalk は単語辞書を持っていませんので、漢字を読むことができません。ついでなので形態素解析を使用して漢字も読めるようにしてみました。さらについでに Java Speech API 1.0 にも対応させてみました。形態素解析は sen を使用しました。 JSPAI + 形態素解析 http://code.google.com/p/vavi-sound/source/browse/trunk/vavi-speech/src/main/java/vavi/speech/aquestalk/jsapi/AquesTalkSynthesizer.java 今までのコードはこちら JNA 化している最中に気づいたのですが AquesTalk ってあれの中の人だったんですね。

    synthesizer.speakPlainText("ゆっくりしていってね", null);
    synthesizer.speakPlainText("漢字も読めるよ", null);

AquesTalk は Windows 用を使用したのですが、実は開発は Mac で行っています。wine で AquesTalk 動かせちゃいます。 最後に、 調べていくうちに JNAerator なるものを見つけました。C のヘッダーファイルを食わせて JNA に変換してくれるものみたいです。複雑な C のコードもこれだと楽ができるかもしれません。 AquesTalk2 なるものもリリースされています。Mac や iPhone のライブラリまであります。音声も自分で作れるみたいです。いろいろ楽しいことになりそうです。

ワークスアプリケーションズ様、KLab合同勉強会

どうも初めまして、 3月に入社したてピチピチのnakamura-tです。 みなさま今後とも宜しくお願いします。 さて今回は、日本の大手企業向けERPパッケージ「COMPANY」の開発元である ワークスアプリケーションズ様と合同勉強会をさせていただきましたので、その様子のレポートさせて頂きます。 まずは弊社の鈴木による発表です。 KLabセッション(その1) :Tokyo Tyrant + Lua Extensionで作るクエリキャッシュサーバ


Tokyo Tyrant(Tokyo Cabinet)の説明と、実験的にLuaで作ったクエリキャッシュサーバのパフォーマンス結果とその考察でした。 パフォーマンスが上がらない原因の一つにLuaの文字列処理系が遅いのかもとのことでした。 僕は以前、iPhoneアプリ開発をしてたのですが一番のネックはファイルアクセスだったので、ファイルシステムにアクセスしてもこの速さでinsert処理が出来るって事は個人的に驚きました。 Tokyo Tyrantは知らなかったのですがBarkleyDBとかSQLiteに比べ比較的パフォーマンスが良いらしく、mixiさんでログイン履歴の保存に使われてるそうです、時には10000QPSを1台のサーバでこなしてるとか。 あと日本からの技術発信というのも嬉しいものです、僕もいつかはと思わされました。 続きまして弊社、竹井による発表です。 KLabセッション(その2):Android時代のミニ四駆考


うおおおおーーーーっい!! これですよ!これ!! 子供の頃に学研の未来予想図ってのがありましたよね、空飛ぶ車に動く道路、ロボットの友達などなど。 毎日RSSで最新技術の記事は読めど実際に日常で見かける事はないですよね。 どこいったんすか?未来。 なんて事を日々思ってたんですが、。 素直に感動です。 ないなら作ろうよって事なんですよね。 考えさせられる良い刺激でした、ありがとうございます。 最後の電子書籍が読めるミニ四駆とはミニ四駆を転がすことによってPC画面上のスクロールバーがスクロールするというナイスなデモでした。 最後にワークスアプリケーションズ 川中様による発表です。 ワークスアプリケーションズ様セッション:クラウドと並列プログラミング
発表している写真


発表資料はこちら! 昨今のトレンドになってるクラウドコンピューティングについて。MVCにおいてViewのスケールアップは比較的に簡単、Modelも散々語られてきた。 そろそろControllerもスケールの対象にしよう。 しかし、複数のコンピュータでの並列計算となるとプログラミング的にもデバック作業などにおいても色々面倒な処理が必要になる。 ところが最近のプログラミング言語(Google GO, Scala)などではシングルスレッド感覚でマルチスレッドプログラムを書く仕組みが言語仕様として組み込まれていますよという話でした。 デスクトップの世界では随分と前から、CPUは単純にクロックを上げるより複数のコアを搭載するようにシフトしていると思います、でもデスクトップアプリのマルチコア対応があまり積極的ではない様に感じていたのですが、こういう原因も背景にあったのかもしれません。今後はいろんな分野で飛躍的にパフォーマンスのあがる可能性を感じました。 蛇足ですが、僕はobjective-cな人でした。 でMacのcocoaフレームワークにはマルチスレッド処理の為のNSOperationというものがあります。 それは、NSOperationサブクラスを作ってmainメソッドを定義して行いたい処理を記述、そのインスタンスをNSOperationQueueインスタンスに追加するだけで後は勝手にバックグラウンド処理してくれ、スレッドセーフとかロックとかややこしいのは比較的考えなくても良いというものでした。 しかも、Mac OS X. 10.6 Snow LeopardからはNSOperationQueueが内部的にはGrand Central Dispatchで実装されてるようです。 なるほどApple、エレガントです。 勉強会終了後は懇親会に移り、 技術の話や趣味な話を語り合う楽しい夜になりました。 お越しいただいたワークスアプリケーションズの皆様、本当にありがとうございました。
 KLab若手エンジニアブログのフッター