Kotlin + Gradle + Processing + ND4J で GUIシミュレータを作ってみた
流行りの Kotlin に挑戦したくなったので,前回作った Java + Processing + ND4J のGUIシミュレータの Kotlin 版を作ってみた.
前回と同様,IntelliJ等の特定のIDEの機能に頼らず,Gradleを用いて直接プロジェクトを作成する.
環境
実装
プロジェクトの新規作成
まずは,Gradleを用いてプロジェクトを新規作成する. 以下のコマンドを実行し,kotlin プロジェクトの雛形を生成する:
$ mkdir simulator $ cd simulator $ gradle init --type kotlin-application ... Enter selection (default: Groovy) [1..2] [Enter] ... Enter selection (default: JUnit 4) [1..4] [Enter] ... Project name (default: simulator): [Enter] Source package (default: simulator): [Enter] ...
パッケージのインストール
Processing および ND4J のライブラリを利用するために,次のパッケージを導入する:
- Processing3 https://search.maven.org/artifact/org.processing/core/3.3.7/jar
- ND4J https://search.maven.org/artifact/org.nd4j/nd4j-native-platform/0.9.1/jar
これらのパッケージを利用するために, build.gradle.kts の "dependencies" 内に次の記述を加える:
implementation("org.processing:core:3.3.7") implementation("org.nd4j:nd4j-native-platform:0.9.1")
メインプログラムの作成
src/main/kotlin/simulator/App.kt を次のように書き換える:
package simulator import processing.core.* import org.nd4j.linalg.api.ndarray.INDArray import org.nd4j.linalg.factory.Nd4j class App : PApplet () { var p = Nd4j.zeros(2) // position var v = Nd4j.zeros(2) // velocity var d = 40F // diameter override fun settings() { size(200, 200) } override fun setup(){ p = Nd4j.create(doubleArrayOf(0.0, height / 2.0)) v = Nd4j.create(doubleArrayOf(1.0, 0.0)) } override fun draw(){ background(255) p = p.add(v) if(p.getDouble(0) >= width + d/2) { p.putScalar(0, -d/2) } ellipse(p.getFloat(0), p.getFloat(1), d, d) } fun run(args: Array<String>) : Unit = PApplet.main("simulator.App") } fun main(args : Array<String>) : Unit = App().run(args)
実行
次のコマンドを実行する:
$ gradle run
結果
ウィンドウが出現し,円が左から右に流れるアニメーションが再生される.
おわりに
次のところがJavaと違った.
- プリミティブ型 (int, doubleなど) がすべてオブジェクト (Int, Double など) に統一されている.
- クラス変数は、宣言と同時に必ず初期化しなければならない.このように、クラス直下の宣言 & 初期化を行う部分をKotlinでは「プライマリコンストラクタ」といい、クラス生成時に自動実行される。
- Double や Float などの小数型に数値を代入するときは,小数点を明記しないとエラーになる.例えば " 0.0" は代入できるが "0" は代入できない.
参考
Java + Gradle + Processing + ND4J で GUIシミュレータを作ってみた
Processing と ND4J を使って,強力なベクトル計算機能を備えたGUIシミュレータを作る.
IntelliJ等の特定のIDEの機能に頼らず,Gradleを用いて直接プロジェクトを作成する.
Processing とは
Java をベースに作られた,ビジュアルアートのための言語. 初心者でも簡単にコーディングできるため,プログラミングやコンピュータグラフィックスの入門教材としてもよく使われる.
ND4J とは
Java などの JVM 系言語の上で動作するオープンソースの線形代数ライブラリ. JVM 系言語用の深層学習ライブラリ Deeplearning4j (DL4J) を開発した Adam Gibson らによって開発された. Python の科学技術計算ライブラリである NumPy に似ている.
環境
プロジェクトの新規作成
まずは,Gradleを用いてプロジェクトを新規作成する. 以下のコマンドを実行し,java プロジェクトの雛形を生成する:
$ mkdir simulator $ cd simulator $ gradle init --type java-application ... Enter selection (default: Groovy) [1..2] [Enter] ... Enter selection (default: JUnit 4) [1..4] [Enter] ... Project name (default: simulator): [Enter] Source package (default: simulator): [Enter] ...
パッケージのインストール
Processing および ND4J のライブラリを利用するには,次のパッケージを導入する必要がある:
- Processing3 https://search.maven.org/artifact/org.processing/core/3.3.7/jar
- ND4J https://search.maven.org/artifact/org.nd4j/nd4j-native-platform/0.9.1/jar
これらのパッケージを利用するために, build.gradle の "dependencies" 内に次の記述を加える:
implementation 'org.processing:core:3.3.7' implementation 'org.nd4j:nd4j-native-platform:0.9.1'
メインプログラムの作成
src/main/java/simulator/App.java を次のように書き換える:
package simulator; import processing.core.*; import org.nd4j.linalg.api.ndarray.INDArray; import org.nd4j.linalg.factory.Nd4j; public class App extends PApplet { private INDArray p; // position private INDArray v; // velocity private int d = 40; // diameter public void settings(){ size(200, 200); } public void setup(){ p = Nd4j.create(new double[] {0, height / 2}); v = Nd4j.create(new double[] {1, 0}); } public void draw(){ background(255); p = p.add(v); if(p.getDouble(0) >= width + d/2){ p.putScalar(0, -d/2); } ellipse(p.getFloat(0), p.getFloat(1), d, d); } public static void main(String args[]){ PApplet.main(new String[] {App.class.getName()}); } }
実行
次のコマンドを実行する:
$ gradle run
結果
ウィンドウが出現し,円が左から右に流れるアニメーションが再生される.
おわりに
参考
Hello World
いっちょまえに情報発信するために,はてなブログを始めることにした.
Qiita や GitHub 等の他の媒体も併用しているので,迷わないように独自のポリシーを定めておく.
- 三次情報色の強い内容
- 他の方が書かれた記事・投稿に対する感想やブックマーク
- 読んだ書籍・論文のメモやまとめ
- 焼き直しや寄せ集めに近い,独自性の低い備忘録
- イベントの感想
- 成果物の紹介
- その他,特に他媒体で発信する必要がなさそうな内容すべて
Qiita
- 他の方が再利用する価値のある,ある程度の独自性を持ったソースコード
- 他の方の記事を参考に作業してハマった際のトラブルシューティング
- 二次情報色の強い内容
- その時点で誰も書いていなさそうな備忘録
- 既存の古くなった備忘録に対してアップデートする役割の備忘録
まとめ
三日坊主だけど続くことを祈る.