2011年9月17日土曜日

狭い部屋でKinectを使えるようにするZOOM for Xbox 360

Xbox 360 Kinect センサーを使うためにはそれなりの広さが必要(Kinectから1人だと1.8m、2人だと2.5m離れないと正しく認識されない)なため、買ったは良いけど部屋が狭くお蔵入りとなっていた。しかし、この距離の問題を解決してくれるZOOM for Xbox 360が発売されたので早速購入してみた。パッケージや商品のデザインは、純正品っぽい感じを出している。




仕組みとしては、焦点距離の短いレンズを本体に被せる形で装着して識別出来る範囲を近くするようだ。商品説明では40%程度近づくことが可能とある。装着もワンタッチで簡単に装着できる。装着した感じもあまり違和感がない感じに仕上がっている。


装着後、早速Kinectの設定を行ってみると、1.4mほどの位置で無事認識することができた。40%ちかづけるというのもホントだった。



とりあえず、ゲーム(ユアシェイプ フィットネス・エボルブ)をやってみた。他のレビューなどを見ると認識率が悪くなるようなことも書かれているのでちょっと気になるところもあるが、とりあえず遊べそうだ。ゲーム画面の右側に映っているのが自分なんだけど、Kinectって着ているものも含め結構細かく認識するんだな~と改めて関心。



Kinect SDKも公開されたし、これでKinectで色々と遊べそう。



2011年9月4日日曜日

getResourceAsStream()でリソースが読み込めない

getResource(),getResourceAsStream()でちょっとはまったので忘れないうちにメモっとく。
まずは動作の基本から、クラスローダ(ClassLoader)に対するgetResource(),getResourceAsStream()は、クラスパスのルートのパスを検索するようになっており、引数で渡した文字列でそのままクラスパスのルートから検索する。なので、文字列の頭に基本的に"/"は付けない。
一方、クラス(Class)に対するgetResource(),getResourceAsStream()は、引き数の文字列の頭に"/"が付いてる場合は"/"を以降の文字列で、引数の文字列の頭に"/"がついていない場合はパッケージ名の"."を"/"に置き換え引数の文字列と"/"とで連結した文字列を、クラスパスのルートから検索する。
例えば、foo.bar.TestMainというクラスがあり、同じパッケージのフォルダ内にTestMain.propertiesというリソースがあった場合、以下の3つの方法でアクセスが出来る(すべて同じ動作)。


TestMain.class.getClassLoader()
    .getResource("foo/bar/test.properties"));

TestMain.class
    .getResource("/foo/bar/test.properties"));

TestMain.class
    .getResource("test.properties"));

ここまでは、位置に依存しない方法でのリソースへのアクセスの仕様を見ればわかるのだけれど、実行時にクラスがjarファイルなどに格納されている場合、実行環境によりなぜかgetResourceAsStream()でリソースが読み込めない場合があるようだ。どうやら、内部的にファイルとしてアクセスしようとして、zip内のファイルを読み取ることが出来ずに例外が発生しているらしい。ちなみにgetResource()でURLはちゃんと戻るからファイルの存在は認識しているようなので不思議だ。
今回、Windowsで開発していたときは問題なかったのだが、LinuxのWebLogic上で実行した際に、リソースにアクセス出来ないという現象が発生していた(WebLogicはwarをデプロイすると/WEB-INF/classesがjarにまとめられる)。


結局のところ実行環境によらずにリソースにアクセスするための解決方法としては、下記のようにするのが良いようだ。
URL resource
    = new URL(TestMain.class.getResource("."),
              "test.properties");

InputStream in 
    = resource
      .openConnection().getInputStream();
:


※2014/02/09 ソースコードの表示方法を変えました。