2016年3月6日日曜日

HTC Viveセットアップ

HTC Viveが届いた!
ということでViveデビュー記事です。


ちなみに2セット届いてますw
その理由は2/10-11にロサンゼルスで開催された
UnityのVision Summit 2016に弊社から2名で参加したからです。
keynoteでValveのGave Newellさんが
「ここにいる開発者全員にViveプレゼントするぜ!」
って発表し、会場が文字通り熱狂した流れから、
いま手元にViveがあります。
本当に届けてくれるとは思わなかったぜ。
しかも爆速で。(一か月経たずに届いた)
ただでさえ収穫の多いイベントだったけど、さらに最高!

さて、本題に戻します。
Viveインストール時にいくつかトラップがありました。
それらトラップを割けることを目的としてます。
2016/03/06時点の情報なので齟齬があれば
コメントくださるとうれしいです。随時アップデートします。

【目次】
1.PCの用意
2.ハードウェアのセットアップ
3.ソフトウェアのセットアップ
4.アカウントのアクティベート

1.PCの用意

ポイント⓪ 必要スペックを満たすPCを用意します。
 Viveの必要スペックは以下の通り。
    -----------------------------------
     GPU: NVIDIA GeForce® GTX 970
             AMD Radeon™ R9 290 equivalent or greater
     CPU: Intel® i5-4590 / AMD FX 8350 equivalent or greater
     RAM: 4GB+
     Video Output: HDMI 1.4 or DisplayPort 1.2 or newer
     USB Port: 1x USB 2.0 or greater port
     Operating System: Windows 7 SP1 or newer  
    -----------------------------------

 ちなみにうちの子はこんなん。MouseComputerさんに感謝!
  これならOculus製品版の必要スペックも満たしてる。
 グラボ積み替えもできたらいいなということでBTOデスクトップPCにした。
    -----------------------------------
     NG-i650PA1-EX2
       GPU: NVIDIA GeForce® GTX 980
       CPU: Intel® i7-6700K
       RAM: 16GB
       OS: Windows 10  
    -----------------------------------



2.ハードウェアのセットアップ

届いた段ボールのサイズにビビります。でかいw
Oculus DK2の比じゃないww


定番の開封の儀な写真を撮ったりしましょう。

※片っ端からデバイスを箱から出さないこと
 大量のコードがあるので、油断すると何がどこにいったかパニックになりますw

SteamVRのユーザーガイドを見よう!
 Viveが作成したユーザーガイドは本当に分かりづらいので
 SteamVRのユーザーガイドを見ましょう。
 3/8時点でユーザーガイドが日本語対応となってます。
 もう一週間早くリリースしてくれたらすごい楽だったのに!

以下、SteamVRのユーザーガイドに沿って進めていきます。

2-1 適当な広さがある部屋を用意する
      ※この段階でリモコンの充電だけし始めておくとスムーズに遊べる

2-2 赤外線のBase Stationをセットアップする
      高さ2m程度(プレイヤーが腕上げて超えないくらいの高さ)で
      対角5m以内に設置します。
      どのご家庭にもあるカメラの三脚を使うとお手軽ですね!

      コンセントを繋げたらLEDが光るので背面ボタンを押してモード設定します。
      ひとつのBase Stationの英語表記を b に設定
      もうひとつのBase Station の英語表記を c に設定

2-3 ヘッドマウントディスプレイのセットアップ
 2-3-1 注意すべきは、リンクボックスとPCだけをはじめにつなぐこと。
        この時、リンクボックスとヘッドマウントディスプレイ(以下HMD)は
        つなげてはいけない。
        リンクボックスだけPCにつなげると初めにドライバをインストール
        しているらしい。なので一旦つなげたらしばらく抜いちゃだめ。
      
 2-3-2 ドライバのインストールが終わったかなって頃にHMDをつなげる。
        インストがいつ終わったか明確にわからないので
        自分は5分後くらいにブスっとつなげた。
        
※リモコンやらBase Stationの無線接続は!?って思うだろうけど問題ないです。
  このあとやります。


3.ソフトウェアのセットアップ

 3-1 Steamをインストールする
      ここからSteamをダウンロードする。持ってない場合はアカウントも作る。

 3-2 Steamを起動し、ライブラリ>ツールの中で
      SteamVRを見つけ、ダウンロード&インストールする。
      ※ユーザーガイド中にはSteamVR Betaがどうのこうのって書いてあるけど
        3月頭時点でそんなものはない!無視!

      
           インストールでき次第、デバイス類のステータスウィンドウが現れる。
           現れたステータスウィンドウの上にさらにひとつ、ウィンドウが現れると思う。
     指示に従い、HMDのドライバやコントローラのドライバをアップデートする。



      
 3-3 Room SetupとTutorialを実行
      出現したViveデバイス類のステータスウィンドウの中で、
      SteamVRアイコンをクリックし、Run Room Setupなどを実行する。


      あとは簡単。映像を見ながらファンキーな動きをするアバターと一緒に、
      HMDやコントローラをRoom中央に置いて認識させたり、
      動けるスペースをキャリブレったり(コントローラがトコトコ震えて楽しいw)、
      画面の指示に従ってやればまずつまづかない。
 

      画面中央下のステータスがReadyってなったら準備完了。
      後はいろんなソフトダウンロードするなりunityで開発に使うなり。

4.アカウントのアクティベート

リンク先の内容に従ってアカウントをアクティベートします。
  私はAAAAA-BBBBB-CCCCCみたいなコードでした。

  アクティベートにより、3/6時点ではTilt Brush、Job Simulator、
 Space PiratesやNinja ほにゃららなど10本以上のデモアプリを楽しめます。

  以上です。
  うまくセットアップできたでしょうか?
  では良いViveライフを!

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のスタッフ様、講演していただいた皆様には感謝しかありません。