UbuntuでUnity3D

UbuntuでUnity3Dの開発環境を作ってみました

事前準備

今回は、Androidデバイスをターゲットにした開発を想定してセットアップします。
AndoridSKD等のセットアップを、事前に行っておきます。

セットアップするもの

  • Java
  • gradle
  • Android SDK
  • Android Studio

まずは、Java及びビルドツールのgradleをセットアップします。

$ sudo apt-get update
$ sudo apt-get install openjdk-8-java
$ sudo apt install gradle

次に、AndroidStudioをセットアップします。

$ unzip android-studio-ide-xxxxx.zip
$ sudo mv ./android-studio /opt
$ /opt/android-studio/bin/studio.sh

AndroidStudioのインストールは、解凍して任意の場所に配置するだけ完了です。
AndroidSKDはAndroidStudioの実行時に行われます。

Unity3Dのセットアップ

Linux版のUnity3Dは下記のコミュニティスレッドに最新の情報が入りますので、チェックします。
Unity3D(Linux版)コミュニティスレッド

スレッドをたどると(Build #20180504)が最新のようですので、ダウンロードページよりインストラーを取得し
記事の通りにセットアップを進めます。


$sudo chown -R $USER:$USER Unity-2018.1.0f2
$chmod +x Unity-2018.1.0f2
$./Unity-2018.1.0f2

インストーラーに沿って幾つか選択をすると、インストール完了です

Unity3Dの起動を行うと、ユーザの登録とライセンスの選択を促されるので
適切な内容を入力します。

ライセンス


personalを選択した場合、ライセンスは3種類より選択となります
無料で使うには、2番め、または3番めのライセンスとなります。
2番目は前年度の売上が100,000ドル以下の会社が対象
3番めはホビーユースとして利用する場合が対象
といったライセンスとなります。
一番上のものは、前年売上が100,000ドル以上の会社が対象となり、PlusまたはProで利用する事になります。
広告等を入れて、配布を行う場合は1番目、または2番目のライセンスを選択する必要があるようです。

アンケート


ライセンスを選択後にアンケートがありますので、入力します。
国籍、会社についての情報、Unityで何を作るのか等の入力をします。

起動


$ [インストールディレクトリ]/Unity-2018.1.0f2/Editor/Unity

正常にインストールが完了していれば、Editorが起動されます。

スクリプトエディタ

このままでも開発はできるのですが、スクリプトのデフォルトエディタがMonoEditorとなっています。

MonoEditorでのスクリプトデバッグでBread等、上手く動作しない部分がありましたので、VSCodeに変更します

VSCodeのインストール

VSCode公式にDebianパッケージが用意されていますので
ダウンロード後にインストールします。
Debianパッケージになっていると簡単で良いすね。

インストール後に、幾つかのプラグインをインストールします。

C#
Debugger for Unity
MonoBehaviour Snippets
あたりをインストールしました。

VSCodeプラグイン

インストールしただけではUnityEditorと連携できません。AssetStoreにプラグインが用意されていますので、検索しImportします。

Import後にスクリプトを選択してみると、VSCodeが表示され当該コードが表示されています(^^)

これで開発する準備ができました。

SpringBootでNeo4jを組み込む

アプリケーションにDBを組み込めると、テスト時やアプリケーションの構成を単純にしたいときにうれしいです。

SpringBootアプリケーションでSQLなDBを使用する場合、DBにH2を選べば特に設定しなくても組み込みで使用できます。便利ですね。同様にNeo4jを組み込みで使用ようとした時に少々手間取ったので、その方法をメモとしてここに残します。

■ 基本的なコード

プロジェクトのひな型は「SPRING INITIALIZR」で簡単に作成できます。また、「SpringData Neo4j」の「クイックスタートページ」に分かりやすいサンプルコードがあります。ただし、Neo4jサーバに接続するコードになっています。次のコードの「uri」の部分です。

■ 組み込みで使用する場合の「uri」について

「SpringData Neo4j」の「リファレンスマニュアルの組み込みドライバ設定方法」をみると、この「uri」の部分を下記のように「file」にすると良いようです。

※1 Windows環境の場合、URI(Path)の表記が「file:///ドライブ名:/」という形になります。「file://c:/tmp」というような、「/」が一つ足りない記述をすると下記のような例外が発生します。 気をつけてください。(→自分)

※2 「uri」を省略するとJVMのシャットダウン時に削除される一時ファイルを利用した使い捨てデータストアとして使用できます。

■ 依存ライブラリの追加

「SPRING INITIALIZR」で生成したプロジェクトは、組み込みで使用する想定をしていません。依存ライブラリが足りずに下記のような例外が発生します。

次のような依存を一行だけ追記するとNeo4j本体とドライバーライブラリが組み込まれます。(gradleの場合)

※SpringBoot、Neo4j本体、ドライバなどのバージョンの組み合わせは、「バージョンテーブル」を参照してください。正しい組み合わせでない場合、動作しないことがありました。

■ まとめ

SpringBootアプリケーションで組み込みでNeo4jを使いたい場合、次の設定をします。

  1. Configurationの「uri」に「file://」を設定。もしくは、uriを設定しない。
  2. 依存ライブラリにNeo4j本体と組み込みドライバーライブラリを追加する。

以上です。

「Spring Boot」で「Hello world」

みんな大好きSpringBootを使って「Hello world」。

■1.開発ツールのダウンロード

下記のページからSpring謹製のIDE「Spring Tool Suite」(以下STS)をダウンロードしました。

https://spring.io/tools/sts/all

落としたファイルは、7zipなどのイケている解凍ツールで解凍してください。
パスが深いファイルは、うまく解凍できないツールがあるようなのです。

■2.開発ツールの起動

解凍先の「sts-bundle/sts-x.x.xRELEASE/STS.exe」を実行して、開発ツールを起動します。
sts-dir

こんなツールが起動します。はい、Eclipseです。
sts

■3.「Gradle」プラグインを追加インストール。

みなさん(誰?w)がmavenから移行しているのにならって、私も「Gradle」をインストールしてみました。(Gradle。良い解説書を探してます。)

ゾウさんが好きです。Buildshipを使うことにします。
メニューを以下のように選択してインストールしました。
「Help」->「Eclipse Marketplace」->Findに「Gradle」を入力し検索->「Buildship Integration 1.0」
インストール後、STSを再起動するとプラグインが有効化されます。
sts-marketplace0sts-marketplace1

■4.「SpringBoot」プロジェクト生成ウィザード

STSには超簡単に「SpringBoot」のプロジェクトを作成するツールが用意されています。超便利です。あちょー。

①次のメニューから起動します。

「File」->「New」->「Spring Starter Project」
sts-new-project-0

②STEP1 プロジェクトの基本構成

「Type:」が「maven」になっていたら、「Gradle(Buidship)」に変更してください。他はそのままで大丈夫だと思います。「Next」を押下します。(各項目の意味はいつか探求しますん)
sts-new-project-1

②STEP2 使用するモジュールの選択

ブラウザで「Hello world!」したいので、Web->Vaadinを選択します。

Vaadinは「Java-based Web Framework」(だそう)です。
「javaさえ知っていれば、Html5とかJSを知らなくてもでリッチUIブラウザアプリが作れますよー」という素晴らしいフレームワーク(らしいっす)。Wicketとかと同じ路線ですかね…(いや、むしろWeb版Swing?)
SPA(JS)+REST勢が優位なわが社においてなぜ今・・・。(ФωФ)フフフ・・・。
sts-new-project-2

③STEP3 完了

最後のステップは、何もせずそのまま「Finish」を押下します。
sts-new-project-3

■5.「Hello world!」コードを記述

生成されたプロジェクトを開き、「src/main/java」の「com.example」パッケージに下記のクラスを追加しました。むぅ。Javaですねー。

■6.実行

上記のクラスができたら、実行してみます。
「com.example.DemoApplication.java」を選択し、
コンテキストメニュー(右クリックメニュー)の「Run As」->「Spring Boot App」を選択すると実行できました。(埋め込みTomcatが起動します)
sts-hello-run

■7.ブラウザでアクセス

ブラウザで次のURLにアクセスしてください。
「http://localhost:8080/index.html」
ボタンを押下すると「Hello Workd!」と表示されれば成功です。
sts-run-b

■8.まとめ

「STS+SpringBoot」を使ってコードをほとんど書かず「Hello world!」できましたー。

Neo4j(グラフDB)

Neo4jに触る機会があったのでちょっと調べた事を書いておきます。

Neo4jとは
・Javaで記述されている
・スキーマレスでデータを登録できる
・データ間の関連を定義、登録できる
・データをCypherと呼ばれるSQLライクな言語で操作できます
・グラフ理論に基づいたデータベース
・関連定義、検索するのが得意

グラフてなんだ?
ノード(Vertices,節点,頂点)の集合とエッジ(edges,枝,辺)で構成され、関連をノードとエッジにより表現したものをグラフと言う,,,らしいです
エッジが向きを持たない場合は無向グラフ
エッジが向きを持つ場合は有効グラフと言われます

無向グラフ:Facebookのフレンド
有向グラフ:Twitterのフォロー
有向-無向グラフ

グラフDBてなんだ?
・グラフ構造を持ったDBはグラフDBと言えるのか
→そういう事では無いらしい
・なので、RDBでグラフ構造を定義してみる
rdb%e3%81%a7%e3%81%ae%e3%82%b0%e3%83%a9%e3%83%95
と、こんな感じになります(ちなみに、DocumentDBでも定義できます)
この場合、Aに隣接する要素(BまたはC)を取得する場合はインデックスツリーを参照しBを特定します
例の場合は単純なので想像しにくいのですが、Facebookの多くのユーザが存在するサービスで、友達の友達に特定の属性を持った人は何人いるか?などを調べる場合、かなりの時間が必要となるでしょう
・では、グラフDBだと
グラフDBでは要素(ノード、エッジ)が隣接する要素のポインタを直接持っています
なので、全体のデータ量が増えたとしても一定のコストで隣接要素を取得することができます
特定のルートノードを起点に関連をたどる事が効率的に行えるといえます

・グラフDBの苦手な事
要素全体に対する処理は苦手です

  • ノードの関連が10以上のノードを取得したい
  • データ全体の平均値を取得したい

まとめ
Neo4jじゃ無くてグラフDBについての記事だよね
関連を中心にデータを操作したいときには有効だよ
データ全体に対する操作は苦手だよ
あまりまとまりの無い文章だったね、、、

antlr4を使う(2)

シーマークすずきです。

前回の続きで、antlr4が生成したパーサーソースをjavaから呼び出して、利用してみます。

■ eclipseのGradleプロジェクト作成

build.gradleは以下としました。antlr4が生成するソースをjp.co.seamark.csv.generatedパッケージに吐かれる様にします。また、構文木を捜索する方式は、リスナー方式とビジター方式がありますが、今回は、リスナー方式としました。

 

■ CSVの単純なパース

前回生成したソースのCSVBaseListenerクラスを拡張します。簡単にcsvファイルの全行をString型で受け取る方式とします。まずは、構文木の文字列形式に変換して返すだけにします。

実行すると、以下の様に前回grunでコンソール出力した結果と同じ結果が表示されました。(注意)fileToString()は割愛します。

テスト用のtest.csvは前回と同じ以下。

CSVSimpleParserの実行結果。

>AST=>(file (hdr (row (field user.name) , (field string#!user.age) , (field *omit*user.gender) \n)) (row (field suzuki) , (field 50) , (field male) \n) (row (field ange) , (field 12) , (field female) \n) (row (field seamark) , (field 20) , (field male) \n))

■ 構文木をウォークスルーしてみましょう

ParseTreeクラスをParseTreeWalkerクラスでwalk()することで、構文木の各構文ノードへのenter,とexitのリスナーイベントが呼ばれますのでメソッドをOverrideすることで自分用に処理を追加できます。

プログラムで処理する場合、構文ルール毎にexitほげほげのタイミングが分かりやすいでしょう。以前のCSV.gの文法を記述した際、構成要素はfieldというルールで各行rowが構成される、としました。fieldの構文ノードを抜けるタイミング、つまり、exitField()の関数でrowリストにfield文字列を追加していきます。先頭行のヘッダー行として、headerに、取り込みたい場合、exitHdr()のタイミングです。各CSV行の行毎のタイミングであれば、exitRow()となります。headerが空でない場合にCSVデータをheaderのラベルと一緒にMapに取り込みましょう。

■ JSON形式に変換してみる。

List<Map<String,String>> rowsに全ての行が取り込まれましたので、exitFile()をOverrideしてJSON形式に出力してみましょう。以下のメソッドを追記します。

出力結果は、以下。

もう少し考慮すれば、以前のNode.jsのcsvtojson.jsと同じ様な変換ができそうです。”string#!”や”number#!”がヘッダーに付いていれば、JSON型を文字列、数値型にするとか、”*omit*”が付いていれば、JSON出力しない、とか。残りは、後日。