2015年10月2日金曜日

[Android]AndroidHttpClientがNGになっていたので、HttpURLConnectionでアクセスしてみた

AndroidHttpClientを利用しようとすると利用してはいけないと怒られてしまうので、
HttpURLConnectionを使ってHttp通信を行いました。
今回はヘッダー領域はいらないのでページの内容だけを取得するクラスです。
HttpURLConnectionを使用してHTTP通信を行う
http://techbooster.jpn.org/andriod/application/6812/
HttpClient.java
public class HttpClient {
    private HttpURLConnection connection = null;

    public String get(String url){
        String pageData = "";
        try {
            URL u = new URL(url);
            connection = (HttpURLConnection)u.openConnection();
            connection.setRequestMethod("GET");
            connection.setInstanceFollowRedirects(false);
            connection.connect();

            InputStream is = connection.getInputStream();
            pageData = // ストリームの内容を転記;
            is.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return pageData;
    }
}
URLやHttpURLConnectionのインスタンスを再利用できないかあれこれ頑張ろうとしましたが、
少なくともHttpURLConnectionはインスタンスの再利用はできないようです。
それと非同期でないため注意してください。
// 使い方
HttpClient client = new HttpClient();
String page = client.get("http://localhost:8080/index.html")

2015年9月3日木曜日

[Android]ACRAを利用して好きなタイミングでクラッシュレポートを送信する

ACRAライブラリを利用することでクラッシュレポートの通知ができます。
ただ、ネットワーク環境がない状態でエラーが発生した場合の状況も入手したかったので、
その方法をメモで残そうと思います。
エラー発生時はエラー情報をファイルに保存するだけにし、
ネットワーク環境につながっているときに後から送信するという方法で実装しました。
  1. クラッシュレポート用のクラス作成
  2. ReportSenderの作成
  3. ACRAの設定

クラッシュレポート用のクラス作成

クラッシュレポートの内容をファイルに保存、読み込みを行うクラス
※Read,Write処理部分は省略
CrashReport.java
public class CrashReport {
    private static final String CRASH_REPORT_FILE = "crash_report.txt";

    private Context context;
    private StringBuilder report = new StringBuilder();
    public CrashReport(Context context) {
        this.context = context;
        // ロード処理
        .
        .
        .
        report.append(loadData);
    }

    public void add(CrashReportData errorContent) throws JSONReportBuilder.JSONReportException{
        // レポートを追加
        report.append("\n------------------------------------------------------------\n");
        report.append(errorContent.toJSON().toString().replaceAll("\\\\n", "\n").replaceAll("\\\\t", "\t"));
    }

    public void save() throws IOException{
       // レポートの保存
    }

    public void send(String email){
        // メールでクラッシュレポートを送信
        Intent intent = new Intent();
        intent.setType("message/rfc822");
        intent.setAction(Intent.ACTION_SENDTO);
        intent.setData(Uri.parse("mailto:" + email));
        intent.putExtra(Intent.EXTRA_SUBJECT, String.format("Crash report![%s]", context.getPackageName()));
        intent.putExtra(Intent.EXTRA_TEXT, report.toString());

        context.startActivity(intent);
    }

    public void clear(){
        // クラッシュレポートのクリア
        report = new StringBuilder();
        try {
            save();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

ReportSenderの作成

クラッシュしたときに動作するSenderクラスを作成
CrashReportSender.java
public class CrashReportSender implements ReportSender {

    @Override
    public void send(Context context, CrashReportData errorContent) throws ReportSenderException {
        CrashReport crashReport = new CrashReport(context);

        try {
            crashReport.add(errorContent);
            crashReport.save();
        }catch (Exception e){
            Log.e("CrashReportSender", "CrashReport save is failed.");
            e.printStackTrace();
        }
    }
}

ACRAの設定

最後にACRAを設定して完了!
AcraCrashReportApplication.java
@ReportsCrashes(
        mode= ReportingInteractionMode.TOAST,
        resToastText = R.string.acra_dialog_text,
        resDialogCommentPrompt= R.string.acra_dialog_comment_prompt // 発生状況を入力する欄のラベル
)
public class AcraCrashReportApplication extends Application {
    @Override
    public void onCreate() {
        // The following line triggers the initialization of ACRA
        super.onCreate();

        // ACRAの設定
        ACRA.init(this);
        CrashReportSender sender = new CrashReportSender();
        ACRA.getErrorReporter().setReportSender(sender);
    }
}
AndroidManifest.xml
android:name=lang:AcraCrashReportApplication
あとは、どこかの画面でCrashReportのsendを呼び出せばOKです。

2015年8月12日水曜日

[Unity][Android]Unity画面からfinishしてAndroidの画面に戻す方法

単純にfinish()するだけだとアプリが落ちてしまうようです。
次のように実行したところ元画面に遷移しました。
UnityPlayerNativeActivityを継承したActivityを作成する。
次の内容のメソッドを実装する。
public void end() {
  runOnUiThread(new Runnable() {
      @Override
      public void run() {
          mUnityPlayer.quit();
          finish();
      }
  });
}
一応これで元画面に戻ったのですが、
内部的には一回アプリを落として再起動しているようで、
static変数ですら初期化されてしまいました。

2015年7月8日水曜日

Android と Unity の座標系

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

meleap では Android + Unity で開発を進めています。端末の位置情報なりを入力として用いてますがこれが一筋縄では行きません。なぜなら、両者で空間座標系の定義が異なるんです。涙
今回はそんな面倒くささをちょこっと紹介しておきます。

【Unity の座標】


上の図は Unity マニュアルから引っ張ってきました。Unity を使ったことのある人からすると、見慣れた座標系ですよね?でもこの座標系、ちょっと違和感感じませんか?上向きに y 軸があるって、3次元座標系として見慣れない感じじゃありません?少なくとも僕は違和感ありまくりで、初見でとても気持ち悪かったです。

この違和感、数学や物理での3次元空間座標の表現と『異なる』からです。
数学や物理はいわゆる「右手系」で「右ねじの法則」からなる座標系を設定することが多いです。対して Untiy では上図のように「左手系」を採用しています。

「だからどうした?それのどこが問題なんだ!」と思われるかもしれません。問題はここからです。
同じく Unity マニュアルから引用しましょう。
モバイルデバイス: 
(中略) 
各軸に沿った加速が重力の値としてハードウェアにより直接報告されます。 値が 1.0 の場合、与えられた軸に対する +1 G の力を示し、-1.0 の値は -1 G を示します。 目の前にデバイスを垂直に持ち(ホームボタンが下)、X 軸は右向きが正の値を示し、 Y 軸は上向きが正の値を示し、Z 軸は自身に向かう向きが正の値を示します。
Unity からもデバイスの加速度センサの値を取得することができます。上記は Input のリファレンスから一部抜粋して引用しました。ここで出てくる3軸の定義は、なんと「右手系」です!つまり、Input.acceleration で得られる値を直接 Unity 内の座標系に適応すると、期待通りには動いてくれません。

これは何も加速度に限ったことではありません。ジャイロに関しても同様のことが言えます。回転方向の定義も「右ねじ」と「左ねじ」で異なるので注意が必要です。

というわけでデバイスからの入力を Unity 内で使うには都合の良い座標変換を入れる必要が有ります。座標変換の一例として下記のサイトを参考にしてください。
http://qiita.com/fuqunaga/items/b1a3e38af71f062f0781
座標変換は一意に決まるものではないので、仕様に合った選択をするようにしましょう。

ではでは今日はこの辺で。。。


2015年6月30日火曜日

[Node.js]ファイルDB「NeDB」を使ってみた

先日「Node学園 16時限目 ES2015発行記念」に参加させていただきました。
その発表の中でファイルDBである「NeDB」を知れたので試してみました。
基本的には以下のパワポの内容を実行しているだけです。

http://www.slideshare.net/isamusuzuki54/loop-backapiswift-46901252?next_slideshow=1


準備:
npm install nedb --save

※これだけ!


ソースコード:(今回は「nedb_test.js」というファイルで作成しています。)
var NeDB = require('nedb');
var db = {};
db.users = new NeDB({
  filename: 'usersfile'
});

db.users.loadDatabase();

// insert
db.users.insert({name: 'hoge'});
db.users.insert({name: 'fuga'});
db.users.insert({name: 'uga'});

db.users.insert([
  {name: 'foo'},
  {name: 'bar'}
  ], function(err, newDoc){
    console.log("[INSERT]");
    console.log(newDoc);
});

// find
db.users.find({name: 'fuga'},
  function(err, docs){
    console.log("[FIND]");
    console.log(docs);
});
db.users.find({name: /f*uga/},
  function(err, docs){
    console.log("[FIND F*]");
    console.log(docs);
});

// remove
db.users.remove(
  {name: 'fuga'},
  {multi: true},
  function (err, numRemoved){
    console.log("[REMOVE]");
    console.log(numRemoved);
});
db.users.remove(
  {name: 'uga'},
  {multi: true},
  function (err, numRemoved){
    console.log("[REMOVE]");
    console.log(numRemoved);
});


実行結果:
%]node nedb_test.js
[INSERT]
[ { name: 'foo', _id: 'ShGylbRFFiR4nZcR' },
  { name: 'bar', _id: '7Kkhma6FdLUzQI7o' } ]
[FIND]
[ { name: 'fuga', _id: '8AKesKQfsnvVOdob' } ]
[FIND F*]
[ { name: 'fuga', _id: '8AKesKQfsnvVOdob' },
  { name: 'uga', _id: 'vbDsvmXtaB5xHNYo' } ]
[REMOVE]
1
[REMOVE]
1

実行後のファイル(usersfile)の内容:
{"name":"hoge","_id":"WuA7LFB50CWMnSX2"}
{"name":"fuga","_id":"8AKesKQfsnvVOdob"}
{"name":"uga","_id":"vbDsvmXtaB5xHNYo"}
{"name":"foo","_id":"ShGylbRFFiR4nZcR"}
{"name":"bar","_id":"7Kkhma6FdLUzQI7o"}
{"$$deleted":true,"_id":"8AKesKQfsnvVOdob"}
{"$$deleted":true,"_id":"vbDsvmXtaB5xHNYo"}


いやぁこんな簡単にDBを利用できるようになるなんてすばらしいですね!
利用できるAPIはMongoDBに準拠しているらしいので、
しっかりとしたDBに移行する際にも楽に対応できるかもしれないのがまた素敵ですね。

インストールするとついてくる次のマニュアルを見れば使い方も大体把握できると思います!

マニュアル:
node_modules/nedb/README.md

DroidKaigiに参加してきました 後半

前半を書いたのがひと月前で、
DroidKaigi自体がもっと前で、
いまさら感が強いですが、
感想後半戦を始めます!

[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

■[ROOM:B]新言語KotlinでAndroidプログラミング

KotlinかわいいよKotlin
JVM上で動作するプログラミング言語です。
開発はAndroidStudioの元のIntelliJ IDEAを開発している
「JetBrains」だそうです。

詳しくは次のURLをご参照ください!
https://sites.google.com/site/tarokotlin/home

Androidアプリの開発もすでにできるようになっているようで、
Kotlinを利用すればラムダ式などが使えるようになるそうです。
Javaのめんどくさい部分もKotlinを使えばかなり楽になりそうでよさげ。


■[ROOM:B]Bitmapは怖くない。

と言いつつもやっぱり怖いそうです(笑)

Bitmapを扱えるPicasso,Glide,Frescoの3種を紹介していただきました。
講師曰く、Bitmapを利用する際に多少面倒な指定が必要になるが、
基本的にはGlideがいい感じだそうです。
Picassoは利用したことはありますが、
Glideはないので、次に利用するシーンがあればGlideを試そうと思います。

「android:largeHeap="true"」は最終兵器


■[ROOM:B]モバイルにおける電力最適化のための1プラクティス

少しハードよりな話でした。
アプリの動作上で何を行っているときに
大量の電力が発生しているかを実験するための装置の説明でした。

この装置なんと自作!すごい!!
たしか計5000円くらい(もう数か月前なのでまったく覚えていない)だったと思います。

WebViewはかなりの電力食いなので気を付けよう。
2Dより3Dの方が電力食い。
Unityも電力食い。

はい。弊社の製品は全部該当ですね。。。
いつか利用電力の問題をクリアして皆様に提供できるようがんばります!


■[ROOM:B]デザイナーがXMLを書くことでできる改善しやすいアプリ開発

デザイナーさん話でした。
デザイナーさんとプログラマーでバトルしているところが多い中、
そこをなんとか上手にできましたよって話。

デザイナーでもAndroidのUI作成なら何とかできるので、
それ以外(開発環境の準備など)をしっかり面倒見てくださいとのこと。

プログラマーはとにかくよりよい製品を作るために、
デザイナーさんにコードを触ってもらう努力をしましょう!


■[ROOM:B]JellyBeanとKitKatで実現するマテリアルデザイン

ごめんなさい。。。体力切れで休んでいた模様。。。
AppCompatActivityを使っていこうとだけメモが書いてありました(笑


■[ROOM:B]僕らのデータ同期プラクティス

通信で過酷な状況での話をおっしゃってました。
広い畑の中心部だと通信が届かないそうです。
まずはそこに驚きましたね。

バックグラウンド通信で動機で一応可能だけれども、
とても大変かつバッテリー食いになってしまうので、
過酷な環境の場合はNG。

SyncAdapterというAndroid提供の機能を利用すれば解決できるかもとのこと。


■[ROOM:B]AndroidとSELinux

バージョンが上がるたびにセキュリティが厳しくなっていくため、
よくわからないエラーが発生している場合は、
SELinuxを疑ってみてくださいとのこと。

セキュリティの外し方は講演資料に記載されているので、
そこをご参照ください。

マニフェストで指定できない部分もあるのですね。。。



無料なのにとても意義のあるところに参加ができました!
DroidKaigiのスタッフ様、講演していただいた皆様には感謝しかありません。


2015年6月22日月曜日

HoloLensまとめ

Microsoftが開発したARヘッドマウントディスプレイ(HMD)「HoloLens」についてまとめました。


ARヘッドマウントディスプレイの特徴

ヘッドマウントディスプレイとは、頭にかぶり、眼前のディスプレイにCGによる表示映像をするデバイスですが、これはOculus RiftやsonyのProject MorpheusのようなVR用と異なり、現実世界も透けて見えます。

また、Oculus RiftとMorpheusはディスプレイ機能がメインで、PCやゲーム機につなげて処理する必要がありますが、HoloLensは,それ自体にWindows 10を搭載しており、PCに接続する必要はありません。

業界筋ではプロセッサして「Atom」SoC(System-on-a-Chip)の搭載が有力視されています。


距離センサーで空間にCGを貼り付ける

現実視界にCGをオーバーラップ表示できるシースルータイプのHMDとしては,すでにセイコーエプソンがAndroidベースのMOVERIOシリーズを出しています。

ただ、MOVERIOとHoloLensは周辺環境の認識という点において大きく異なります。HoloLensには,「Kinect」と同じ投射型深度センサーが使用されています。これは赤外光を面照射して,その反射光が返ってくるまでの時間をCMOSベースの距離イメージセンサからToF(Time of Flight)方式で測定するものです。照射範囲は120度。

ToFとは,照射された赤外光が反射されて照射側に戻ってくるまでの時間差から、シーンの深度分布を計測する技術です。これはMicrosoftが2009年に買収したイスラエルの3DV Systemsが持つ技術をベースとしています。Xbox One用KinectのToF測距精度は130億分の1秒だといわれ、HoloLensでもこれに準じた精度で深度値を取得しているものと思われます。

このため、「現実視界にCGが完全に張り付いている」という感覚を得られるのです。
mine craftのデモ


網膜投影型は焦点調整が不要だが、デメリットもある

Oculus RiftやMorpheusでは,直視型の液晶ディスプレイを眼前において見せているので、眼球を動かしても映像が見切れたり消失することはありません。一方で、HoloLensのような網膜投射型デバイスの場合、網膜に映像を直接投射する関係で、眼球が常に正面を向いていることが前提になっています。なので、眼球を動かすと途端に映像が消失したり,外周が消えてしまったりするとのことです。

そもそも、網膜投影型とはどのようなものなのでしょうか。
通常、物体を立体視する際、光は水晶体で収束し、網膜上で結像します。物体までの距離が変化すれば、水晶体の厚みを変え、光を屈折させます。それに対し、網膜投影型では、光を瞳孔の中心で収束させるため、水晶体の屈折率の影響はうけません。
つまり、現実の視界で遠くのものを見ても、近くのものを見ても、ディスプレイのCGがぼやけないのです。近視、乱視、老眼なども関係ありません。

また、ディスプレイには表示部が存在しないため、解像度・輝度・コントラスト・表示色とも従来のディスプレイを凌駕する性能が実現できます。



ジェスチャー操作、音声入力が可能

HoloLensのデモでは、空中をタップする、つまむ、引き延ばす、などのジェスチャーでCGを実際のモノのように操作できる様子が公開されています。
指の認識はHMDの前面に付いているセンサーで行っているようです。現状、可能な操作は限られており、あまり複雑な指の動きまでは対応していません。
また、音声の入力も可能で、かなりの精度で認識してくれるそうです。(英語)家の中で使うのであれば、音声入力はかなり便利になりそうですね。



画角が今後の課題

また、体験した方によると、映像画角はかなり狭いといいます。30°×17.5°というデータもあります。
少し頭の向きを変えるとCGが途切れてしまうため、仮想世界への没入感は少なくなってしまいます。
平面の2D映像を見たり、サインを表示する分にはいいのですが、3Dのゲームなどをやろうとすると、物足りない感があると思います。
おそらく、網膜投影の仕組み的に、この画角の問題はすぐに解決されるものではないと思われます。
弊社のHADOのような没入感のあるゲームではある程度の画角が必須なので、初期のHoloLensに対応させるのは難しいかもしれませんね。
今後に期待です。


その他のデモ動画

テクノスポーツ!超人スポーツ!

おはようございます。
meleapの福田です。

今月、『HADO』はNHKの報道番組で紹介された他、日テレ「シューイチ」の「まじ★すか」、テレビ東京の「WBS」にてとりあげて頂きました!

テレビは全てを伝えられないので、カットして繋ぎ合わされた結果、不思議なテンションになっていることもありますが、僕の周りでは大きな反響を頂き、ありがたい限りです。

本日は、弊社の「テクノスポーツ五輪」と同様のビジョンを掲げる、「超人スポーツ協会」についてご紹介しようと思います。

「超人スポーツ協会」という協会をご存知でしょうか?
最近メディアでもとりあげられ、注目を集めているので、耳にしたことがある方も多くいらっしゃると思います。


技術によって「人」は「超人」になれる

「超人スポーツ協会」それは、
「人間の能力を補綴・補強・拡張可能なAugmented Human技術に基づき,皆が個々人の身体的な能力の差など目立たなくなるくらい超人的な力を身につけることで,同じ超人 (Superhuman) 同士として一緒のフィールドで競い合う,人間と機械が融合した「人機一体」の新たなスポーツを創造」している協会なのです。


え?
個々人の身体的な能力差をなくすってどういうこと!?
それでどうやって競うの!?
スポーツの意味あるの!?
と、感じてらっしゃる方もいらっしゃると思います。

そうです。
超人スポーツ協会を立ち上げた方達は大のスポーツ嫌いなんです。
嫌い、というと語弊がありますね。恐らく、苦手意識が強く、嫌いになってしまった類いだと思います。

ですが、どうでしょう、スポーツが得意な人たちは、自身の体一つで対決するスポーツを従来通り、いや、それ以上に盛り上げていただき、自分自身の体力だけでは自信が持てない、という人たちが、こうしてまた「スポーツ」を楽しめるようになる、というのはとても素敵な話だと思います。

今後、ARやVR以外にも、ロボット技術、ドローン技術やIoT技術を組み合わせ、様々な競技が生まれてきます。攻殻機動隊の世界がすぐそこまできているのです。


東京オリンピックと同時開催で国際大会を!

僕自身も、『HADO』の紹介の際、いたるところで2020年の東京オリンピック・パラリンピックと同時開催で「テクノスポーツ五輪を開催する!」と言い続けてきましたが、なんと、超人スポーツ協会も「超人スポーツ競技の国際大会の開催」をビジョンに掲げ、活動をされています!!

忍者のように水面を駆け抜ける人や、空中飛行、怪力…そんな大会が開催されたら……と考えるだけでワクワクしますね!
ちなみに、僕たちmeleapも超人スポーツ協会に参加しています。

『HADO』も老若男女、全ての方たちに楽しんでもらえるようなスポーツを目指して日々、開発を進めていますので、今後ともどうぞ注目して頂けたらと思います!



余談ですが、「WBS」でHADOを体験してくださっていた方、どなたかわかりましたか??
名刺の受け渡しの際に映っている男性に注目です。

WBSオンデマンド
http://txbiz.tv-tokyo.co.jp

シューイチ「まじ★すか」
http://www.ntv.co.jp/shu-ichi/majisuka/2015/06/15344.html

超人スポーツ協会
http://superhuman-sports.org

2015年5月27日水曜日

[Android]Error:Unable to make the module が出た場合の対処方法について

参考URL:
http://stackoverflow.com/questions/28193980/unable-to-make-the-module-related-gradle-configuration-was-not-found-please-r

Android Studioを更新したときに次のエラーが出てしまいました。
そのときに行った対処方法を記載します。

エラー内容:
Error:Unable to make the module: プロジェクト名, related gradle configuration was not found.
Please, re-import the Gradle project and try again.

対応方法を要約するとGradleプロジェクトをリフレッシュするという方法です。

1. Gradleビューを開く

  ツールバーで [View] > [Tool Windows] > [Gradle] をクリックしてください。





2. リフレッシュする

  Gradle projectsウィンドウでプロジェクトをリフレッシュしてください。
  下記図の赤い丸に囲まれたアイコンをクリックすればOKです。




この手順で私は対応できました。
困っている方は試してみてください。


2015年5月24日日曜日

【機械学習 序説】

 ジェスチャ周りをリサーチしている太田です。

 ここ1ヶ月ほど、Myo で取得した筋電位(詳しくはこちら)からハンド・ジェスチャを特定する為に機械学習の導入を試みてます。

 実装のためにいろいろなブログやサイトを閲覧してきましたが、どうも偏っているものが多い様に感じました。もちろん、大半は「こうしたら使えるよ」系のモノ。あるいは少数ですが、数式をゴリゴリ示す理論系のモノ。残念ながら、両者をつなぐ様なサイトがあまり見受けられませんでした。

 そこで今回は、機械学習の前座として、「こんな知識が無いと理論を理解するのは辛いよ」的な前提知識を紹介していきます。なので、「機械学習がどのようにして事例判断を行うか」をザックリと説明できる方には当たり前、「原理なんて興味ないわ」って方にはどうでも良い話です。ごめんなさい。m(_ _)m

1)線型代数学
 理系大学生ならばおそらく1・2年で必ずや履修しているであろう単元ですね。
 機械学習においては、「多次元」問題を扱うために必須です。いきなり「多次元」ときましたが何も恐れることはありません。プログラムに学習してほしい「要素の数」のことです。例えば、人の肥満度を測るために、「身長」「体重」「体脂肪率」「性別」を学習して欲しい要素とすれば4次元になります。こうした、全く性質の異なる要素を「同時」に扱うために線形代数が必要になります。細かいところは理解しなくても、行列の表現・逆行列・転置行列・固有値・固有ベクトル・規格化などがあればいいでしょう。

2)統計学
 こちらは、文理問わず必要とされる機会が多い分野ですね。
 学習における正誤の判定を、命題の真偽として考えるならば、統計学に基づく「検定」が必要になるでしょう。専門用語が多いのでとっつきにくいですが、普段持ち合わせている「感覚」を「数学的に表現する」ことを目指しているだけです。数学的な手順に目が行きがちですが、むしろ「感覚」をもとにした概念や考え方を捉えておくと、機械学習の理解が深まるように思います。

3)数値解析学
 おそらく、機械学習において最も核となる部分です。
 コンピュータは四則演算(加減乗除)によって離散的にしか数値を扱うことができません。(僕の知る範囲では・・・ですが。汗)つまり、コンピュータには無理数(整数同士の割り算で表せない数)が理解できないのです。ということは、コンピュータのは2次方程式を解く事が出来ないのです。我々人間であれば、係数がどんなものであれ、解の公式を用いれば平方根によって簡単に解が求まるのに。(いや、面倒な場合があるかもしれないけど、「公式を用いればいい」という単純さにおいて「簡単」と表現しました。)
 2次方程式を解くという問いに対して「誤差」を許容する事にしましょう。小さい事に目を瞑る事にして、「だいたい」の値を求める事は出来ないか。計算可能な「ある値」から出発して、少しずつ「答え」に近ずく事は出来ないか。これこそが「学習」の肝です。つまり、間違ってもいいから一旦やってみて、間違っていたら少し修正して再チャレンジ!このプロセスを繰り返す事によって、少なからず間違っているんだけども「答えに近い」状態にする事、が「学習」です。
 残念ながら人間にはこんな事できません。いや、少なくとも僕は、何度やってもやり直しを命じられるなんて耐えられません。が、コンピュータは人間のよう(僕のように)に「飽きる」ことがありません。電気さえ供給してやれば、おそらく何万回でも何億回でも同じ操作をしてくれます。
 こうした考えのもと、「ある手順にのっとって何度も繰り返す事によって2次方程式を解きましょう」というのが、ニュートン法です。解の公式が数値の計算手順であるのに対して、ニュートン法は解を求める操作手順を示しています。

 さてさて話が長くなりましたが、肝となるエッセンセスはここに挙げた3要素だと思います。あとはどの様にミックスされるか。あるいは操作手順の中でどんな順番に処理を行うかです。少なくともニュートン法さえ知っていれば、機械学習の勉強の際に迷子になる事はないでしょう。


 以上、サムズアップするシュワちゃんを理解するために必要な最低限の知識でした!(ターミネータ2より) 

2015年5月18日月曜日

Unity5でのアニメーション

Unity5にアップデートされてAnimatorが新しくなりました
今回はAnimatorをさわってみようと思います


やりたいこと
 ・Stayを起点としてFireAttack , TailAttackをランダムに実行させる


①3種類のアニメーションを用意

②ParametersにisFireAttackとisTailAttackをTrigger型で追加

③StayからFireAttackへ伸びる矢印を選択しInspectorのConditionsにisFireballAttackを追加
    ※FireAttackからStayへ伸びる矢印には追加しません

④StayからTailAttackへ伸びる矢印を選択しInspectorのConditionsにisTailAttackを追加
    ※TailAttackからStayへ伸びる矢印には追加しません

⑤csファイルを作り下記スクリプトをコピペ

using UnityEngine;
using System.Collections;

public class DragonMotionManagement : StateMachineBehaviour
{

public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
//新しいステートに移り変わった時に実行
int MotionNumber = 0;
MotionNumber = Random.Range (0, 2);
if (MotionNumber == 0) {
animator.SetTrigger ("isFireAttack");
}
if (MotionNumber == 1) {
animator.SetTrigger ("isTailAttack");
}
}
}

⑥矢印周辺の何もないところをクリックしてInspectorに⑤で作ったcsファイルを追加

⑦実行確認


これでStayを起点としてFireAttack , TrailAttackがランダムに実行されます
Unity4のときはモーションの終わりを取るのが面倒でしたがとても簡単になりました
他にも実行するタイミングを設定できるので下記参考サイトを見てやってみて下さい


参考サイト
 http://japan.unity3d.com/blog/?p=1672
 http://riberunn50.blog.fc2.com/blog-entry-25.html
 http://qiita.com/toRisouP/items/b6540b7f514d18b9a426


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.




2015年3月28日土曜日

SXSWで見たウェアラブル、IoTの今後

SXSW(サウスバイサウスウエスト)とは、毎年3月にアメリカテキサス州オースティン市で行われる、音楽と映画、ITの祭典です。

もともと音楽のイベントとして始まったということもあり、この時期になるとオースティンは音楽に包まれ、夜になると路上はパーティ状態です。ちなみにtwitterが有名になったのもこのイベントです。毎年その時々の旬なプロダクトが世界中から集まってきます。そんな楽しいイベントに参加し、ITを中心にいろいろ見てきました。

今年のSXSWで注目されていたテーマは、IoT、ウェアラブル、デジタルヘルス、AI、ロボット、ビッグデータ、VRあたりです。これらのテーマを中心に数千のセッションが組まれ、街中の至る所で議論がされています。その中で私はVR/AR/ウェアラブル/IoTなどの展示、セッション中心に見てきました。

ちなみにVRとARの違いはこんな感じです。
VRはユーザーがゲームの世界、宇宙空間などの異世界に入ること、ARは現実世界にバーチャルの要素を取り込むということです。分かりやすく言うとこんな感じです。



VRの様々な可能性が追求されている
VRはoculus riftの登場、そしてfacebookによる買収により圧倒的な注目を集めています。もともとはFPSゲームに使うデバイスとして考えられていたデバイスですが、現在VRはゲームを超えて様々な用途で注目されています。
例えば、乗り物やインテリアのシミュレーション、教育、旅行、医療などです。
それだけヘッドマウントディスプレイ(HMD)の解像度や、ヘッドトラッキングの精度が良くなり、「本当にその世界に没入した感覚」が得られと考えているのです。
そのVRの可能性を感じ、多くのメーカーがVR用の端末を発表し始めており、その数は数えきれないほどになってきています。代表的なのはoculusとSonyのMorpheusですが、それ以外にも日本の「Fove」やオープンソースVRHMD「OSVR」などもあります。
今回SXSWではその中のいつくかを体験してきました。
Foveは視線でコントロールするVRHMDです。デバイスの内側に視線を認識するセンサーが組み込まれており、ゲームプレイ時に視線で照準を合わせることができます。ゲームの他にも、体に障害のある子どもがピアノを視線で弾けるようにするなどのプロジェクトも行われています。


こちらはOSVRのHMD

VRはこれからますます盛り上がりを見せていくと思います。
CG映像だけでなく、360°映像を撮影する環境も整ってきました。リコーのシータやGoproを使って撮影する会社も多いです。さらにfacebookが360°映像をアップロード可能にしたので、これから360°映像のコンテンツは増えてくるのではないでしょうか。



ARデバイスはステルスで開発中、アプリもまだ出てきていない
今回SXSWでは、ARの将来性を語るセッションはあったものの、ARの展示は全くありませんでした。Microsoftの「HoloLens」やベンチャーのmagic leapなどが注目されていますが、デバイスはまだ露出されていません。イメージムービーのみが出てきている段階です。
これはmagic leapのイメージムービー。

そしてこれがHoloLensのムービーです。

ARはまだ開発者向けとしても出ているものは非常に少なく、まだまだこれから立ち上がってくる市場だと思います。ちなみにガートナーが出しているハイプサイクルを見てもARはこれからの技術であることはわかります。

oculusのCEOであるPalmer Luckey氏はSXSWのセッションにて、「ARには興味があるがまだこれからの市場であり、今はARのキラーアプリはない。VRであればイケてる体験を作れる」と言ってました。
弊社meleapはこのARを全力で切り開いていこうとしています。非常にチャレンジングでワクワクするテーマです。0から1をつくる瞬間ですね。


混沌としているIoT
IoTというテーマも最近非常に注目されていますが、定義も曖昧でカオスな印象があります。
IoTが盛り上がっている背景にはスマホが普及し、通信環境が整い、センサーを安く作れるようになったという動きがあると思います。
SXSWの展示では「身の回りの様々なモノにセンサーを設置し、スマホで情報をみる」というものが数多くありました。例えば、ベッドにセンサーを付けて睡眠を分析する、歯ブラシにセンサーをつけてどのくらい磨いたか分析するなどです。こういうのを見ると何でもありだな!とびっくりします。
また、スマートウォッチもIoTに含まれると思いますが、Apple Watchが出るということもあり、今後の展開に注目が集まっています。最近ではpebbleがkickstarterで史上最高額を集めました。
スマートウォッチやスマートグラスのように常にディスプレイを身につけることで、そのとき必要な情報を素早く取得できるようになりますし、街中で起きた出来事がいち早くネットにアップされます。こうやって世界中を飛び交う情報の速度がどんどん加速していくでしょう。

2015年2月27日金曜日

MyoのAndroidサンプルを動かしてみる

15分もあればできると思います


①https://developer.thalmic.com/downloadsにアクセスしてAndroid SDK 0.10.0 (Dec 19, 2014)をダウンロード

②AndroidStudioを起動してFile→Import Projectをクリックしてsamplesを選択しOKを押す

③インストールしたいアプリを選択してRunボタンを押す

④インストールするスマホを選択してOKをおして少し待つとインストール完了

⑤Myoを腕につけてキャリブレーションを行う

⑥Hello Worldアプリを起動してScanボタンを押す
 

⑦接続できるMyoが表示される
  ※このときパソコンにドングルを接続したままだと一覧に表示されません

⑧戻るボタンを押してダブルタップすると認識が始まります





2015年2月26日木曜日

【KPI分析(第2回)】DAUを狂わすノイズ編

ソーシャルゲーム(に限らずアプリ全般)のKPI分析講座、第2回目は「DAUを狂わすノイズ編」と題してお送りします。
第1回目の用語解説編は下記をご覧ください。

【KPI分析(第1回)】用語解説編

さて、前回の用語解説の中で、DAU(daily active users)という1日にそのアプリを使用した人数という値があったかと思います。
DAUという値は、売上を算出するのにも使用しますし(売上=DAU×ARPPU)、ごく一般的で各社共通の指標なので、用いられることは多いです。また、偉い人とかがこの値で一喜一憂したりする極めて重要なKPIです。

ですが、DAUという値は、広告などのブースト施策などを行うと急激に増えるし、翌日には急激に減ってしまうなど、あまりにも変動が大きい値です。
純粋にゲームを楽しんでくれているユーザーが何人いるのか、ゲームバランスやバグなどで離脱してしまっているユーザーはいないか、などの分析をするにはノイズが多すぎて信頼性に欠けてしまいます。

そこで、DAUに代わるアプリの使われ具合がわかる別の指標が必要になってくるのです。

まずは、そもそもDAUに含まれるノイズって何?ってとこですが、下記のようなものが考えられるかと思います(ドリコムさんのslideshareを参考にさせていただいています)。

<ホワイトノイズ>
  • 遊んでないけどアップデートされてたから起動してみた
  • 通知のバッジを消したくて起動だけした
  • ログインボーナスや補填の課金アイテム目当てで起動してみた
  • 休日で暇すぎるから起動してみた
  • メンテナンスやサバ落ちなどで起動できなかった
<スパイクノイズ>
  • 広告出稿してインストール数急増
  • テレビCM開始してインストール急増
  • 他タイトルとのコラボキャンペーンでインストール急増

ホワイトノイズはユーザの気まぐれが起因します。このノイズによるDAUの増減にはまったくといっていいほど意味はありません。このようなノイズを取り除いたきれいなデータが必要です。
また、スパイクノイズは広告出稿などにより一時的にDAUが急増する事を意味します。それにより、ARPU(ユーザ一人あたりの平均課金額)は激減します(インストールしたばかりのユーザは基本的には課金しないため)。これでは、純粋にゲーム内の施策が成功しているのか判断がつきません。なので、このようなスパイクノイズも取り除く必要があります。

今回は簡単ですがここまで。
次回は実際に各社がどのような数値をアプリの使われ具合の指標にしているかを書いていきます。

2015年1月22日木曜日

TangoでARを出してみた。




これまでXperia Z3で開発してましたが、
TangoでARを出してみました。

一番の違いはぬるぬる滑らかに動くこと!
ARで表示されるドラゴンや背景のカメラ映像が全くカクつくことなく表示される。
リアルタイムで認識した特徴点を追加しまくるので、3Dモデルを余裕で回り込る。

ただしサイズが大きい!
そしてアタッチメントにつけるとタブレットサイズなので頭がすっごく重くなります。
これがXperia Z3のサイズになったら走り回るのは全く苦にならないだろうな。

すべてのスマートフォンがTangoの鬼スペックを最低限積んでくれたらいいのに!

---Tango Tablet スペック----------------------
 CPU:NVIDIA Tegra K1
 RAM:4GB
 内部ストレージ:128GB
 OS:Android 4.4 KitKat
 カメラ周り:4MPカメラ、モーショントラッキングカメラ
  センサー:赤外線センサー、深度センサー
 サイズ:7インチ



今は現実的に厳しいと思うので、一部の
ゲーマー向けにゲーミングスマートフォンを発売しないかなぁ。
ゲーミングPCのように需要あると思います。
チャレンジングなメーカーさん、ぜひぜひ作ってくださいませ。

机や床の上を飛び跳ねたり壁をブチ破ってくるモンスターを倒すリアルモンハンとか、
カメラ映像の中を自然にどこまでも走り回る初音ミクとか、
画像処理による数センチ単位でのユーザ位置追跡とか、
ケーブルなしのデバイスで実現できる世界がここまで来てる。

Tangoをいじってみたいエンジニアさんはぜひご連絡ください。
好きなアプリを作るのでもいいですし、試しに既存のアプリを動かしてみるのでも構いません。
tangoを触りながら可能性を一緒に模索しましょ!




Tangoって何?って方向け → ProjectTangoとは?


--以下エンジニアさん向け--------------------------------

2015年1月11日時点で4つのデモアプリが用意されています。  
    1. Project Tango Cube Mover
    2. Project Tango Wizard Demo
    1. Project Tango Explorer
    2. Project Tango Debug Overlay Viewer
開発者向けSDKとしてJavaだけでなくUnityも提供してくれてるのがすごくありがたいですね。




2015年1月15日木曜日

ウェアラブルexpoまとめ

ウェアラブルexpoに行ってきましたのでざっくりと注目展示をご紹介します!


YAMAHA
指、腕の動きを認識するデバイス


グローブの伸び縮みで指の動きを認識させる。
元々医療用に作ったものらしい。
グローブ以外にも胸や足など全身に装着するパーツがある。












Flexible Battery - Jenax
シート状の折り曲がるバッテリー

これがあればウェアラブルデバイスをコンパクト化できますね。
衣類系なんかに埋め込むのも便利です。







castAR
kickstarterに出てたやつですね。仕組みは特徴的で、HMDのプロジェクターから前方に映像を投影し、反射した光を偏光メガネで見るというものです。ヘッドトラッキングの精度はいまいちでしたが、画角はかなり広く、環境を選ばなければmoverioよりもリッチな体験ができそうです。



杉原SSEI
位置情報計測システム
加速度・地磁気(一部wifiも)などのセンサーなどを使い、ユーザーの位置を計測するシステム。デモ動画は精度かなりよかった。
複数のセンサーを使っているのがポイント。センサーの種類はスマホと変わらないとのこと。



welcat

腕に装着するバーコードリーダー
作業中に使うウェアラブル。
写真のデバイスを腕に装着する。
物流倉庫などで使えるのでは?
レーザーがかっこいい。











brother工業

以前から片眼HMDを出しているが、今回出していたのは頭に装着するタイプのもの。
位置を自由に調整できます。透過型と非透過を選べる方式。非透過はやはり映像が綺麗に映し出されますね。見るのにコツがいりますが。
http://www.brother.co.jp/news/2015/150107_airscouter/