2015年5月12日火曜日

DroidKaigiに参加してきました その1

今更ですがDroidKaigiに参加した報告です。
記憶があいまいになってるので内容には気を付けてください(笑
しかし、DroidKaigiに参加できて本当に幸運でした。
また開催されることがあれば例え有料だろうが参加したいです。

資料
https://twitter.com/DroidKaigi

当日の資料はDroidKaigi(Official)様が公開先を書いてくれてますので、
そこをご参照ください。

私が参加したセッションは次の通りです。

[ROOM:A]開発を効率的に進められるまでの道程
[ROOM:B]ゲームアプリケーションのアップデートサイクル
[ROOM:B]初学者にうれしいAndroid開発環境
[ROOM:B]Android学ぶ君へ。生き抜くためのナレッジ共有
[ROOM:B]新言語KotlinでAndroidプログラミング
[ROOM:B]Bitmapは怖くない。
[ROOM:B]モバイルにおける電力最適化のための1プラクティス
[ROOM:B]デザイナーがXMLを書くことでできる改善しやすいアプリ開発
[ROOM:B]JellyBeanとKitKatで実現するマテリアルデザイン
[ROOM:B]僕らのデータ同期プラクティス
[ROOM:B]AndroidとSELinux

ほぼ B ですね(笑
本音を言うと実は A の方が興味のあるタイトルが多かったのですが、
興味のある内容は後から自分で調べるだろう!ということで、
逆を選んでいった結果ほぼ B になりました。
そのおかげか、今まで知らなかったことばかり学べたのでいい選択だったと思います。


■[ROOM:A]開発を効率的に進められるまでの道程
http://www.slideshare.net/TakaoSumitomo/ss-47393000

要約:テストを書け!とにかくテストを書け!!

テストがあるだけでどれだけ幸せなことかっていう体験をしないとテストの重要性はわからないだろうなぁ。
テスト大事ですよ!
自分のために書くのですよ!!


■[ROOM:B]ゲームアプリケーションのアップデートサイクル
http://www.slideshare.net/kentaroiizuka/droidkaigi

私たちmeleapでも将来必要になる技術であったため、
この話を聞くことができてよかったです。
Unity+Androidという組み合わせですが、
2つのプロジェクトを組み合わせるときに考慮が必要になりそうですね。

セッションで紹介していた「ゲーム・映像制作パイプライン構築マニュアル」を読んでから、
再度このセッションの内容を学びなおそうと思います。
meleapで環境構築したら、そのときは紹介しますね。


■[ROOM:B]初学者にうれしいAndroid開発環境
http://www.slideshare.net/hiroyukikusu/droidkaigi2015androidmvc

便利ツール・ライブラリの紹介でした。
メモには次の内容が。

・Butter Knife
・Genymotion
・Gson

うん。どれも便利ですね。
知ってると知らないのでは、
それだけで大きな差が生まれそうです。
※私は当日まで知らなかったです。。。
知らないというのは罪ですね。


■[ROOM:B]Android学ぶ君へ。生き抜くためのナレッジ共有
https://github.com/operando/DroidKaigi

要約:鍛えたいならば、
      Androidソースコード検索サービスを利用して、
      たくさんのソースコードに触れよう!

発表者の方は今後IOSの勉強を進めるそうです(笑
Androidだけで生きていくのも大変だということ。


以下、また次回...
■[ROOM:B]新言語KotlinでAndroidプログラミング
■[ROOM:B]Bitmapは怖くない。
■[ROOM:B]モバイルにおける電力最適化のための1プラクティス
■[ROOM:B]デザイナーがXMLを書くことでできる改善しやすいアプリ開発
■[ROOM:B]JellyBeanとKitKatで実現するマテリアルデザイン
■[ROOM:B]僕らのデータ同期プラクティス
■[ROOM:B]AndroidとSELinux

2015年5月2日土曜日

MyoをハックしてAndroidで筋電位データを取得し、ポーズ検出できるようにしてみた。

Myoってこんなのです。


この動画の中でいろんな手のポーズが認識されているようにみえますが、
現時点で実際にMyoで認識できるポーズは、
Fist、Spread、Rest、Wave In、Wave Outの5パターンだけです。
(グー、パー、力抜いてる、手を内側に折り曲げる・外側に折り曲げる)

自分だけの自由なポーズの登録や認識はできません。

今回僕らがやったことにより、
MyoをつけていればAndroidアプリで忍術の印を結んで技を発動させる!
なんてことも実現できます。

ナルトごっこが捗りますね!

チャクラ溜めて~~~印をいくつか結んで~~~
火遁豪火球の術!!!ゴオオオオオ!!!!!

なんてね!にんにん!



さて、ここからはおもいっきりエンジニアさん向けです。

モーション認識デバイスMyoに興味ある!
それをAndroidで使いたい!
加えてMyoのデフォルト5パターンのポーズじゃ満足できない!
という方のためのアプリの紹介です。

めっちゃニッチ!笑

Myoを触っている人は知っていると思いますが、
このデバイスは筋電位データを取得できます。
そして、現時点ではWindows、Mac、そして最近 iOSでも
販売元であるThalmic Labの公式SDKで
筋電位データへアクセスできるようになりましたね。

ただ、AndroidではThalmic Labの公式SDKだと筋電位データにアクセスできません。
開発フォーラムで質問しましたが、Thalmic Labのアップデートプランの中に、
Android端末で筋電位データへアクセスできるようにする、という項目はないようです。

その主な理由は、AndroidのBluetooth仕様が貧弱で、授受できるデータ量が少ないため、
他デバイスに比べて筋電位データの更新頻度が低くなり、
ポーズ認識などでやれることが限られてしまうこと、にあるそうです。

おそらくThalmic Labの開発メンバーも困っているみたいです。

公式SDKのアップデートを待っていてはいつやれるようになるかわかりません。

そこで、僕らはMyoのBluetooth送受信データをハックし、
Android端末で筋電位データへアクセスできるようにしました。
そして、3パターンのポーズを自由に登録し、ポーズ認識できるようになってます。
機械学習を組み込んでいないが故に、誰でも自分のポーズをお手軽に登録し、
登録したポーズを認識することができます。

コードはgithubで公開してます。

Android Studioのプロジェクトデータ形式で公開しているので、
ここまで読んでくださっている人ならば、すぐにAndroid端末にインストールできるはずです。

公開しているアプリの使い方は、この動画の通りです。



ぜひ使ってみて下さい。

公開しているコードにはまだ課題もあります。
一番大きな課題としては、ポーズ検出を何回かやっていると、筋電位データ授受が停止します。
挙動を見る限りでは筋電位データが溢れかえっているような感じです。(外れかも)

解決策をご存知の方はコメントやgithubにプッシュ頂けるとめっちゃありがたいです!
それだけでなく、どんなフィードバックでも頂けたらすっごくありがたいです。

また、少しだけ近況を。
4月から新メンバーが加入してくれたおかげで、弊社のHADO開発もガンガン進んでます。
HADOの詳細はこちら

テストがめっちゃ楽しい!
そして技を毎日出しまくるため、腕が太くなってきてます。
また、スウェーや反復横跳びの動きで攻撃をよけたりするので汗だくになってるw

アプリのテストで体が鍛えられるなんて斬新!
うちの開発メンバーはテストすればするほど健康になっちゃうね。

それではまた!

2015年4月29日水曜日

【KPI分析(第3回)】DAUに代わるKPI編

ソーシャルゲーム(に限らずアプリ全般)のKPI分析講座、第3回目は「DAUに代わるKPI編」です。
1回目、2回目は下記をご覧ください。

【KPI分析(第1回)】用語解説編
【KPI分析(第2回)】DAUを狂わすノイズ編

前回の「DAUを狂わすノイズ編」では、ホワイトノイズやスパイクノイズによってDAU(daily active users)が増減してしまうということを書きました。
ゲームが面白いかどうか以外の部分でDAUは大きく変動してしまうので、DAUを指標にしていては、本当楽しんでいるユーザーがどれだけいて、どのような推移をしているのかはわかりません。

そこで、ホワイトノイズやスパイクノイズを取り除いた新たなKPIが必要です。
ただ、実際のところコレといった業界共通の指標というのは存在していません。
各社が自社のタイトルにマッチしたノイズの取り除き方を行い、それを指標としているといった感じです。

ここでは、その指標を公開している3社(現在はもっと洗練された取り方をしているかも)の例を取り上げます。

<コロプラ>
まずは、「白猫プロジェクト」や「黒猫のウィズ」などの超ビッグタイトル連発のコロプラさん。
コロプラさんはQAU(Quarterly Active Users)という指標を採用しています。


QAUとは、アプリをダウンロードしてから7日以上経ったユーザーを対象としたアクティブユーザーの値です。
アプリの継続率は、ダウンロード後7日間で急激に低下し、その後はある程度安定していきます。
なので、ダウンロード後7日間のユーザーを取り除くことで、定着したユーザーのみを抽出しています。
これにより、広告出稿などによる急激なダウンロード数の増加があり、DAUが跳ね上がっている場合も、QAUは7日後も遊んでくれているユーザーのみを抽出した値のため、ある程度安定した値になります。
ただ、この方法ではユーザーの気まぐれが起因しているホワイトノイズは取り除けません。
例えば、プッシュ通知などを行うと、休眠ユーザーが一時的にアプリを起動したりするので、QAUも一時的に跳ね上がってしまいます。

<gloops>
続いてブラウザソシャゲで一時代を築いたgloopsさん。ソシャゲのデータマイニングにおいては最初期から力を入れていらっしゃいます。
基本的にはコロプラさんと同じ考え方ですが、こちらの記事によると、gloopsさんの場合はゲーム開始後30日間というのを指標の区切りにしています。
過去30日間のログイン日数でユーザーを数段階に分類し、セグメント別にユーザー推移を見たり施策を検討したりしています。
さらに、ゲーム内のパラメータ(強さ)とクロスさせてセグメント化することで、「昔はハマっていたけど最近はあまりプレイしていない」といったユーザー層も可視化でき、より具体的な施策を行いその結果をウォッチすることができます。
ただ、このやり方はデータマイニングの非常に高度なノウハウや仕組み、人員が必要です。また、タイトルによって指標が異なるため、タイトルをまたいでの指標としては使えないので、簡単には導入できない(使いこなせない)方法だと思います。

<ドリコム>
最後はドリコムさんです。
ドリコムさんは、コロプラさんやgloopsさんの事例を参考に、さらにホワイトノイズを除去するために5日間連続でログインしたユーザーのみを抽出しています。
これにより、広告出稿により急激にDAUが上昇しても(スパイクノイズ)対応でき、気まぐれでログインしたユーザー(ホワイトノイズ)も除去された、純粋に毎日楽しんでいるユーザーのみを対象とした推移を見ることができます。
さらに、この指標でとれたユーザーの課金額が全体の売上の80%以上を占めているということで、売上に影響を与えるユーザーを常にウォッチできる非常に優れた指標だと言えます。
ただ、メンテナンスなどでログインできない時間帯があると、大きく下がってしまうので、5日間中4日間ログインしたユーザーを対象にするなど、さらなる試行錯誤をされているようです。

このように各社様々な「ゲームの面白さ」を測るKPIを検討しています。
ゲームのジャンルによってもそのKPIは異なるし、会社の規模(人員やお金)によっても使いこなせるKPIは変わってきます。
ただ、大事なのは数値を見ることではなく、その先にあるユーザーを見ることなので、そのあたりを忘れず自社にあったKPIを追求していくのが大切ですね。

2015年4月22日水曜日

Intellij IDEAでクリップボードを有効にする方法

Intellij IDEAは独自のCopy&Pasteの機能を実装しているようで、
デフォルトのままだとクリップボード(Clipboard)を利用できないようです。
※ほかのアプリでコピーした内容をペーストできない。

このような状態になってしまった方は次の内容を試してみてください。
私はこの方法で利用できるようになりました。

修正ファイル

Windows:

「<IntelliJ IDEA>/bin/idea.properties」次の内容を追加する。
※Macでも同様のファイルがあると思います。

idea.use.alt.clipboard.sync=true


Mac:

ide.mac.useNativeClipboard=True


2015年4月13日月曜日

Android StudioとUnityで一緒に開発する方法

今日はAndroid StudioとUnity両方で開発する方法を伝えます。

私の環境は次の内容です。
Unity 4.6.2f1
Android Studio 1.1.0

まずはUnityで次の作業を実施してください。

1. Build Settings (Ctrl + Shift + B)を開く
2. PlatformでAndroidを選んでSwitch Platformをクリック
3. Google Android Projectのチェックボックスにチェックを入れる
4. Exportをクリックしてフォルダを選択する。



上記を行うことで次の内容のフォルダが出力されます。

出力フォルダ
│  AndroidManifest.xml
│  project.properties

├─assets
│  └─bin
├─libs
│  │  QCARUnityPlayer.jar
│  │  unity-classes.jar
│  │  Vuforia.jar
│  │
│  └─armeabi-v7a
│        
├─res
│  ├─drawable
│  │      app_icon.png
│  │    
│  └─values
│          strings.xml
│        
└─src
    └─Javaパッケージ

※ 「libs/armeabi-v7a」は環境によって異なると思います。

ここからAndroid Studioに反映していきます。
Android Studioのプロジェクトが次のようになっていると思います。
存在しないフォルダがある場合は手動で作成してください。
※ assets,jniLibsあたりが無いかもしれません。

Android Studio
├─.gradle
├─.idea
├─app
│  ├─libs
│  └─src
│      ├─androidTest
│      └─main
│          ├─assets
│          ├─java
│          ├─jniLibs
│          └─res
├─build
└─gradle


1. Unity側の「assets」をAndroid Studioの「app/src/main/assets」にコピーする。
2. Unity側の「libs/*.jar」をAndroid Studioの「app/libs」にコピーする
3. Unity側の「libs/armeabi-v7a」をAndroid Studioの「app/src/main/jniLibs」にコピーする。
   ※「armeabi-v7a」以外にもフォルダがあった場合はそのフォルダもコピーしてください。
4. Unity側の「res」配下の内容をAndroid Studioの内容とマージする。
5. Unity側のAndroidManifest.xmlとAndroid Studioの内容とマージする。
6. Unity側の「Javaパッケージ」を「app/src/main/java」にコピーする。


あとは「UnityPlayerNativeActivity」を継承した独自のActivityを作成したり、
直接「UnityPlayerNativeActivity」を修正したりしてActivityを開発してください。
一度ここまで行ってしまえば、
Unity側を更新した際は、
「assets/bin」を置き換えるだけでUnity側の内容が更新されます。
※ 念のため、Android Studionの「assets/bin」を削除した後、コピーしてください。

それでは楽しいAndroid, Unityライフを

2015年4月8日水曜日

Android で Myo のデータを取得しよう

どうも、モーション認識部分を担当している太田です。m(_ _)m 

みなさん、Myo ご存知ですか?
知らない方のために、リンク貼っておきます。(for Developer)


・・・どうです?楽しそうでしょ?

 Developer 向けに様々な SDK が公開されています。
が、残念なことに一番面白そうな筋電位データ (EMG) が Android で見れない!

なので、Bluetooth 通信からゴリゴリと取得してみました。
参考にしたのは、制作元が公開している Bluetooth の仕様(C++ のヘッダファイル)と Android のサンプルページ。
https://github.com/thalmiclabs/myo-bluetooth https://developer.android.com/guide/topics/connectivity/bluetooth-le.html

サンプルページの固有値に関して、Myo の仕様に合わせていけば万事 O.K. です。
ただし注意としては、characteristic から取得できるバイト値がリトルエンディアンであること。また、Myo が送信するデータの種類をユーザ側から設定しないといけないので、Myo のコマンドをデータ取得より先に設定してあげることが必要になります。
Myo の仕様を見るとデータ類は全て notification によって取得されるので、この辺りの実装も当然必要です。


まぁ、こんな感じに取得できます。カッコ内の値は秒間のデータ数です。


値を取得するのは出来たのですが、characteristic の notification の設定を有効にすると characteristic の read が使えません。その逆もまた然りです。(T^T)
今のところ、設定の早いもん勝ち状態です。

Android の仕様なのか掴みきれてませんが、同じようなことを言ってる人がチラホラ・・・。
http://stackoverflow.com/questions/17910322/android-ble-api-gatt-notification-not-received
http://stackoverflow.com/questions/22817005/why-does-setcharactersticnotification-not-actually-enable-notifications
そもそも、notification の設定をする descriptor を BluetoothGatt に書き込むのが解せません。。。

どなたか良いアイデアあれば教えて下さい。m(_ _)m

2015年4月3日金曜日

Node.js+Socket.ioを利用してサーバ<->サーバ間通信

クライアント<->サーバ間でリアルタイム通信をしたい場合にsocket.ioを利用すると思いますが、
今回はこれを利用してサーバ<->サーバ間通信を実現してみます。

※ socket.ioのバージョンは「1.3.5」を利用しています。


受信側:
server.js

var socketio = require("socket.io");
var io = socketio.listen(3000);
console.log("start socket.io server.");
io.sockets.on("connection", function (socket) {
console.log("user connect!")

socket.on("message", function (data) {
console.log(data);
});
});

受信側は特に特殊な実装はなし。
クラサバ通信の時と同じ実装で問題ありません。


では、次に送信側の実装内容です。

送信側:
client.js

var io = require('socket.io-client');
var socket = io('http://localhost:3000');
  socket.on('connect', function () {
    socket.emit("message", 'send message.');
});


socket.io-clientパッケージを利用すれば簡単に実装できてしまいました。


最後に起動方法を記載して終了とさせていただきます。

受信側:
]$ sudo npm install socket.io
]$ node server.js
start socket.io server.

送信側:
]$ sudo npm install socket.io-client
]$ node client.js

※ 受信側を実行した後、送信側を実行すると受信側に次のメッセージが表示されます。

user connect!
send message.