気分屋SE りゅう

SEとして思うことや技術的なことを書いて、自己の技術力向上かつ読者の技術力向上につながっていったら最高!! 開発記やその知識紹介等々書いていきます!

Leap Motion Controller(モーションセンサー) -性能テスト1-

Leap Motion Controllerのサンプルプログラムを用いて性能テストを実施!!

Leap Motion Controllerのサンプルプログラムを元に編集
モーションセンサーがどのくらいの感覚でデータを取得するのかを調べるコード

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.Math;
import java.util.ArrayList;
import java.util.List;

import com.leapmotion.leap.*;
import com.leapmotion.leap.Gesture.State;

/**
 * リスナークラス
 */
class SampleListener extends Listener {
	public List<Frame> frameList = new ArrayList<Frame>();

	/**
	 * 初期化メソッド
	 */
	public void onInit(Controller controller) {
		System.out.println("Initialized");
	}

	/**
	 * Leap Motion Controllerに接続
	 */
	public void onConnect(Controller controller) {
		System.out.println("Connected");
		controller.enableGesture(Gesture.Type.TYPE_SWIPE);
		controller.enableGesture(Gesture.Type.TYPE_CIRCLE);
		controller.enableGesture(Gesture.Type.TYPE_SCREEN_TAP);
		controller.enableGesture(Gesture.Type.TYPE_KEY_TAP);
	}

	/**
	 * Leap Motion Controllerの接続切断
	 */
	public void onDisconnect(Controller controller) {
		// Note: not dispatched when running in a debugger.
		System.out.println("Disconnected");
	}

	/**
	 * Leap Motion Controller終了
	 */
	public void onExit(Controller controller) {
		System.out.println("Exited");
	}

	public void onFrame(Controller controller) {
		// Get the most recent frame and report some basic information
		Frame frame = controller.frame();
		frameList.add(frame);
	}
}

class Sample {
	public static void main(String[] args) {
		// Create a sample listener and controller
		SampleListener listener = new SampleListener();
		Controller controller = new Controller();

		// Have the sample listener receive events from the controller
		controller.addListener(listener);

		// Keep this process running until Enter is pressed
		System.out.println("Press Enter to quit...");
		try {
			//leap motion controller読み取り開始
			System.in.read();
		} catch (IOException e) {
			e.printStackTrace();
		}

		// Remove the sample listener when done
		controller.removeListener(listener);
		// 取得した合計数
		System.out.println(listener.frameList.size());
		File file = new File("/Users/nagataryou/Documents/leapmotion.csv");
		try (PrintWriter pw = new PrintWriter(new BufferedWriter(
				new FileWriter(file)));) {
			float time = 0; // 1/10^6秒
			float oldTime = 0;// 1/10^6秒
			for (Frame frame : listener.frameList) {
				time = frame.timestamp();
				pw.println(frame.id() + "," + String.valueOf(time) +"," + String.valueOf(time - oldTime));
				System.out.println(frame.id() + "," +String.valueOf(time) +"," + String.valueOf(time - oldTime));
				oldTime = time;
			}
			pw.close();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

出力結果

Initialized
Press Enter to quit...
Connected

Exited
262
103870,1.19077437E10,1.19077437E10
103871,1.19077519E10,8192.0
103872,1.19077612E10,9216.0
103873,1.19077693E10,8192.0
103874,1.19077847E10,15360.0
103875,1.19078001E10,15360.0
103876,1.19078154E10,15360.0
103877,1.19078308E10,15360.0
103878,1.19078461E10,15360.0
103879,1.19078615E10,15360.0
103880,1.19078769E10,15360.0
103881,1.19078912E10,14336.0
103882,1.19079055E10,14336.0
103883,1.19079188E10,13312.0
103884,1.19079322E10,13312.0
103885,1.19079455E10,13312.0
103886,1.19079588E10,13312.0
103887,1.19079721E10,13312.0
103888,1.19079844E10,12288.0

平均すると0.13秒ごとに1回取得
調子がいい時だと0.1秒ごとに1回くらい

なので8fps(1秒間に8回取得)くらい
映画のコマ数が24fps、現在のテレビのコマが1秒に30fpsなのでスムーズとは言えない感じですね!

公式サイトの性能は平均120fpsとのことなのであれ!?って感じ
(今回はデータの書き出しとかは別途行っており、描画も行っていないので、、)

Javaは遅いってよく言うし、次はCかC++で性能確認してみようと思います。

何かアドバイスとかやってほしいことがある人はコメントとかください!

Leap Motion Controllerを用いた開発環境構築 -Java-

Leap Motion Controllerの開発環境構築について説明します。

eclipseに環境を構築します。
公式サイトのJavaの開発環境構築の説明↓
https://developer.leapmotion.com/documentation/java/devguide/Project_Setup.html

Leap Motion Installer と SDKを下記公式サイトからダウンロード
https://developer.leapmotion.com/downloads

Javaの開発に関係のあるライブラリ等(Mac
/lib/LeapJava.jar ->Java用のライブラリ
/lib/libLeapJava.dylib ->Mac用のLeap Motion Javaライブラリ
/lib/libLeap.dylib ->MacLeap Motion ライブラリ

②適当にプロジェクとを作る。
③作成したプロジェクトのsrcにSample.javaをコピーする。
④外部ライブラリーを設定する。
 1.外部ライブラリに/lib/LeapJava.jarを設定する。
 2.LeapJava.jarを展開し、「ネイティブ・ライブラリーのロケーション」に/libを設定する。
⑤実行の構成を設定する。
 1.引数タブのVM引数を設定する。
  -Djava.library.path=/lib
⑥実行する。正しく実行されれば環境構築終了

次回はSample.javaのコードを読み解いてみたいなと思います。

Leap motion Controllerを使ったIoT開発1 -アジャイル開発を用いて-

開発ものを一本軸としてやってみようという企画です!

試作開発として1つしっかりやってみると学びが多いと思うし、経過を残すのも面白いよね?ってことで始めます。

ちょっと盛りだくさんな気もするけどね!

テーマは3つ!
Leap motion Controllerを用いたNUI(ナチュラルユーザーインターフェイス)の学習
・IoTシステムの開発
アジャイル手法による開発

ということでまずはLeap motion Controllerの紹介!
小型センサーで人間の動きを読みとるモーションセンサーです。

人の動きを読み取って、PCを操作したりとかできるわけです!
動きとかの解析をしっかりとしたら大学の研究のテーマになりそうな感じする。

IoTシステムの開発!
ほんとはこれがメインのはずなんだけど、開発が始まるのはいつになることやら、、まずは企画を立てるところから頑張ります。

アジャイル的な開発手法で開発を行っていきます!
アジャイル開発は日本の大企業的なシステム開発の現場ではなかなか受け入れられにくい手法なんだけど、個人の開発や企業の自社開発のアプリケーション開発とかだと意外と合っていると思っている手法です。

まぁそんな感じで開発します。

とりあえずこれから企画考えます!!

ということで、乞うご期待!

IoT -これからのインターネットの世界-

今回も副題を付けてみた!
「これからのインターネットの世界」と書いたけど、今まさにIT業界で熱いお話だと思います。

IoT(アイ オー ティー)はInternet of Things 日本語に訳すとモノのインターネットと言います。

モノのインターネットとはいろんなモノをインターネットで繋げて、今までできなかったことを実現していこう!!というもの!

とは言われてもよく分からないですよね!?
僕も初めはよく分からなかった!!

今までもM2M(Machine to Machine)と言って機械間通信ってのはよくやってました。
例えば、室内の気温を感知して空調の温度を調整したり、世界各地の工場の生産状況を本社で管理したりとか!
今までは機械間通信が主流だったわけなんだけど、ITの成長とともにICとかが安くなったり、小型化してきて様々なモノがネットワークにつなげるようになってきたわけなんです。

イメージしやすい具体例を挙げると、Google Glass,Apple Watchとか!今までネットワークにつないでいなかったモノもネットワークに繋いじゃおう!ってこと!

IoTで重要なキーワードが無線LAN「センサー」
・インターネットにつなぐためには無線LANが必須!
・色々なモノ(機械とは限らない)を機械がわかる情報に変換する方法としてセンサーがある。
  モーションセンサー
  温度センサー
  加速度センサー
  ジャイロセンサー
  赤外線
などなど色々なセンサーを使って情報を電子化してインターネットにつないで、今までになかったことを実現する。

すごい面白いよね!



IoTのシステムを考える上で役に立つアイデア出し方法がある。
今から自分の身の周りにあるモノを5個書きあげてみてください。
本当は100個くらい書いてやるんだけどとりあえずは5個で!


※時間がある人はやってみてください!!
思いつかないいいアイデアが出てくるかもしれないですしね!
思いついたら私にご一報を!!作ってみます♪

ということで僕も10個書きあげます。
・ペットボトル
・ドア
・鍋
・手
・財布

こんな感じで書き上げます。そんで次の式の答えを考えるわけです。

・ペットボトル×インターネット=飲み物の温度を管理
・ドア    ×インターネット=鍵が閉まっているかスマホでチェック、鍵の開け閉めをスマホで行える
・鍋 ×インターネット=鍋の温度を管理→IHで調整する技術はある。→お店の鍋をIHで管理し、沸騰したら弱めたりといった管理
・手     ×インターネット=手の動きでモノを操作
・財布    ×インターネット=お金をスマホで見れる。(これお財布携帯でよくない??あんまり使ってる人見えないけど、、)

こんな感じで100個くらいやれば何か面白い案が出てくるはず!

とまぁIoTとはいろんなモノをインターネットにつなげることで面白いことをしようということ!

これからどんどん流行ってくるというのは明確!!
ただ、一方でセキュリティの問題も発生する。
スマホから玄関の開け閉めが可能だということは悪意のある人が不正にアクセスして解錠されるかもしれないっていう可能性もある。

これからのITはセキュリティ技術の強化も課題になってくると思う。

可読性・保守性の高いコーディング1

ぜひ、PG、SEの仕事を始めたばかりで可読性、保守性の大事さに気づいていない人に読んでほしい。

可読性・保守性の高いコーディングは本当に大事!!

可読性・保守性が高いとは
読みやすくて、他の人でも修正しやすいコードのこと

「他人」ってのが大事!
自分は分かっていても、他の人が分からないと可読性が高いとは言えない!

すごく簡単なJavaのプログラム2つほど書いてみた。
可読性が高い方はプログラミングが未経験でなんとなくは理解できるはず!
ぜひ二つを何回か見比べてほしい。

※補足
/* */で囲まれているところや //の後ろに書いてあるのはコメント
【プログラム1】

public class M {
 public static void main(String[] args){
  System.out.println(ans(4,5,ope.M));
 }
 public static double ans(double a, double b,ope o) {
  switch (o) {
   case A:
     return a + b;
   case S:
    return a - b;
   case M:
    return a * b;
   case D:
    return a / b;
  }
  return 0;
 }
 public enum ope{
  A,
  S,
  M,
  D
 }
}

【プログラム2】

/**
* 計算用クラス
* @author りゅう
*/
public class Math {
 /**
 * プログラムを実行すると呼ばれるメソッド
 * @param args 今回は使わない引数
 */
 public static void main(String[] args){
  /* 計算結果を入れる変数 */
  double result;
  //answerメソッドを呼び出して計算を行う。4×5を行う。
  result = answer(4,5,operator.MULTIPLICATION);
  //計算結果を出力する。
  System.out.println(result);
 }	
 /**
 * 計算を行い、計算結果を返すメソッド
 * @param value1 値1
 * @param value2 値2
 * @param operatorType 演算子型
 * @return 計算結果
 */
 public static double answer(double value1, double value2, operator operatorType) {
  //演算子型によって計算方法を帰る
  switch (operatorType) {
   case ADDITION:
     //足し算の時
     return value1 + value2;
   case SUBTRACTION:
     //引き算の時
     return value1 - value2;
   case MULTIPLICATION:
     //掛け算の時
     return value1 * value2;
   case DIVISION:
     //割り算の時
     return value1 / value1;
  }
  System.out.println("計算に失敗しました。");
  //本当はException投げたいけど今回の本筋ではないので今回は0
  return 0;
 }
 /**
 * 列挙型 演算子の型を指定する
 * @author りゅう
 */
 public enum operator{
  ADDITION,   	//足し算
  SUBTRACTION,	//引き算
  MULTIPLICATION,	//掛け算
  DIVISION	     //割り算
 }
}

比べてみると2の方がわかりやすいはず!
説明が書いてあることと、メソッド名や変数名に意味のある単語を使っている。
また、省略系はあまり使わない方が良い。
AとADDITIONだとどっちが分かりやすいだろうか??
明らかにADDITIONだとおもう。


プログラム1と2を見てわかるように2の方が何を行っているのか説明しなくても他人が見て理解できる。

ぜひ2のようにコメントをしっかり書き、変数名を省略しないでほしい。
これをしっかり行うSE、PGが増えていけば世の中幸せになると思う。

第2段もいつか書きます

他言語学習のすすめ!ー初めて学ぶ言語は?ー

言語学習のすすめ!
副題として初めて学ぶ言語は?とつけてみました。

大学のときや、周りのSEとたまに話題登るのが、
「初めてプログラミングを学ぶならどの言語がいい??」

C言語派が多数を占めると思う!

残念ながら今までC言語を使う機会に恵まれなかった。
(今現在IoTの勉強中でC言語を勉強中)
C言語派に聞くと「メモリ管理が大事」とか「値型と参照型の違いがわかる」といった答えを良く聞く
その通りだとは思うけど、個人的には学ぶのはどれでもいいと思っている。
興味のあることから始めるのが一番!

実際、僕は大学でExcelVBA,Javaをはじめの1年で学んだ。
それから今までいろんな言語を使って遊んだりしてきたが困ったことは一回もない!!

参考 やったことある言語:Java,ExcelVBA,Swift,Python,PHP,JavaScript,Ruby,.NET

多少構文は異なるものの基本は同じなのでどの言語でも初めて学ぶのに問題ないと思うわけだ!
そんな中、僕が初めて学ぶのにオススメな言語は
ExcelVBA,C,Javaの3つ!
初めて学ぶなら参考になるドキュメントが多い言語の方がいいというのが理由の1つ

その中で特におすすめなのはExcelVBA!(これが主題の他言語学習のすすめにつながってくるのだが、、、)

おすすめな理由
・環境構築が簡単(PCにExcelが入っていれば誰でもできる
・エクセルのセルから値を取得することができるので色々なデータを簡単に利用できる。
・社会人になってから重宝される。(IT系に就職しなかったとしても使えると役に立つ言語
・痛いところに手が届く(Excel関数ではできないことをできるようになるので利便性を感じやすい)
・ファイルの入出力が比較的簡単

ということでExcelVBAが個人的に結構好きなんですよ♪

さてここで本題!!!!
なぜ僕が他言語を勉強しておくことをおすすめするかというと、
各言語には得意不得意がある!

JavaでもCでもVBAでもできるけど、VBAの方が向いている!
だとか
コマンドプロンプトのコマンドでできるけど、RubyPythonの方が簡単!とか

そうすると仕事が早く終わったり、仕事を任されたり、いろんなチャンスをつかむ機会も増える!
ということでいろんな言語をやってみましょう!!

とりあえずExcelVBAをやったことない人はやってみましょう!!

やってみたくなった人はお題!
Sheet1のA1~A5とC1~C5に数字を入れ、B1~B5に+(たす) -(ひく) /(わる) *(かける) をいれD1~D5に答えを出力するプログラムをExcelVBAで書いてみよう!
例A1:3 B1:* C1: 6 D1:18

ヒント
まずはA1~A5とC1~C5から数字を取得してそれぞれを足した答えをD1~D5に書くプログラムを書く!

 

 

技術ブログ始めました!

技術ブログをはじめてみようと思いブログ開設!
(昨日作って今日はてなブログに移転してきました!笑
やはりソースコードとか書きやすいしね!)

SEとして思うことや技術的なことを書いて、自己の技術力向上かつ読者の技術力向上につながっていったら最高!!

使用したことのある言語やサーバー、ミドルウェア等紹介!
言語
 ・Java
 ・Python
 ・VB.NET
 ・ExcelVBA
 ・Swift
 ・JavaScriptJQuery
 ・C
Server
 ・Windows Server
 ・Linux
VM
 ・Hyper-v
 ・VMware
データベース
 ・Oracle
 ・MySQL
検索エンジン
 ・Apache Solr
WebServerなど
 ・Apache
 ・Apache Tomcat
 ・IIS

開発記やその知識紹介等々書いていきます!

以後、よろしくお願いしますm(_ _)m