Java FX in RPi 〜プロパティファイルの読み込み JavaFX実装〜

今回は、プロパティファイルの読み込みを実装します。
以前、コンソールアプリ作成でやったものもあるのでそちらもどうぞ。

ちなみに、前回は大まかにどんなものを作るのか?ということと、実装環境に関して記載しました。

プロパティファイルを読む

目的は、アプリケーションの起動時に初めに設定を読み込み表示するYoutubeのURLを設定、?秒おきに表示を切り替えるものです。

ちなみに作成したプロパティファイルは下のようなものです。

# Properties for this application

#########################################################
# URL List for load Youtube (rule "url" + number        #
#########################################################
url1=https://www.youtube.com/watch?v=6qhJsvpd0ds
url2=https://www.youtube.com/watch?v=w9BubZIEGdg
url3=https://www.youtube.com/watch?v=YPuaUUvCdMg
url4=https://www.youtube.com/watch?v=w9iiCnX0STw
url5=https://www.youtube.com/watch?v=XW7FgoR5pzQ&t=63s
url6=https://www.youtube.com/watch?v=DZEWd0Viiuk&t=1s
url7=https://www.youtube.com/watch?v=45xcPvhGhDo
url8=https://www.youtube.com/watch?v=w9BubZIEGdg

プロパティファイルの読み込み

使用するクラスはPropertiesクラスです。

早速プログラムを作成しました。Githubにアップしてあります。
そして、テスト駆動開発ですので、テストケースから作成しています。

テストケースを作成する

JUnitでのテストを作るのに、以下のような手順で作成します。

  1. 作成するクラスはどのように動くか決める
  2. 作成したものが、想定通りに動く確認する処理をかきます
  3. 実行して緑色になることを確認(下の図を参照ください)

作成する時にJUnitでやる時のポイントも記載しておきます。
Junitをビルドパスニ追加しておく必要があります。そして、Mavenでdependencyを追加したときはすでにビルドパスに追加されています。。。

アノテーションで設定

「@Test」: 実行するテストを使用します。
「@Before」: テストを実行する前に起動する。主にテストの実行準備などを行う

具体的に。。。

public class MainTest {
    /** テスト対象クラス */
    private Main target;

    /**
     * テストを行うための準備処理
     */
    @Before
    public void initTest() {
        // テスト対象クラスのインスタンスを生成
        target = new Main();
    }

/** loadProperties()のテスト */
    @Test
    public void testLoadProperties() {
        target.loadProperties();
        Set keySet = target.getKeySet();
        keySet.forEach(System.out::println);
    }
}

上のコードを実行したものが、下のキャプチャです。

そして、@Beforeのついているメソッドは。。。

/**
 * テストを行うための準備処理
 */
@Before
public void initTest() {
    // テスト対象クラスのインスタンスを生成
    target = new Main();
}

のようになっています。単純にテスト対象クラスをインスタンス化してフィールド変数「target」に代入しています。

そして、テストケース(メソッド)「testLoadProperties()」

/** loadProperties()のテスト */
@Test
public void testLoadProperties() {
    target.loadProperties();
    Set keySet = target.getKeySet();
    keySet.forEach(System.out::println);
}

テストとして実行するメソッド(テストケース)は「@Test」をつけてやります。実行結果に関しては上のキャプチャに記載しています。
ちなみに実行したコードは下のものです。

/** loadProperties()のテスト */
@Test
public void testLoadProperties() {
    target.loadProperties();
    Set keySet = target.getKeySet();
    assertNull(keySet);
    keySet.forEach(System.out::println);
}

これは失敗したコードです。そしてテストとしては失敗しなくてはいけないコードです。

どーゆーことか?

コードに色付けができなかったのですが、下のようなコードを追加しました。
assertNull(keySet);このコードは取得したキーセットがNullにならないとAssertErrorを出力するメソッドです。
本当であれば、assertNotNull()を使わないといけません。このような部分はテスト仕様なのでどのような処理を行うかちゃんと設計しなくてはいけません。。。

そして、下のコードが直したものです。

/** loadProperties()のテスト */
@Test
public void testLoadProperties() {
    target.loadProperties();
    Set keySet = target.getKeySet();
    assertNotNull(keySet);
    keySet.forEach(System.out::println);
}

そして、実行結果は緑色になっています。

こんな感じでプロパティファイルが読めていることを確認しています。
keySet.forEach(System.out::println);
出力結果

*** testLoadProperties ***
url5
url6
url3
url4
url1
url2
url7
url8
*** testConvertKeySet ***
test4
test2
test3
test1

こんな感じで作成しました。

でわでわ。。。



Java FX in RPi 〜ラズパイで動くJavaFX〜

Javaで作成する、画面アプリをラズパイで動かそうと言うものです。
今回は、作成したアプリをラズパイ上で動かし、「Youtubeプレイヤーとして動かそう!」と言うものです。

JavaFX in RPi

開発環境構築

前提として、自分が使用している開発環境について記載します、

  1. SceneBuilderを使用しています。(JavaFXの初期コード生成などしてくれます)
  2. JDK1.8を使用(RPiもJDK1.8を使用します)

SceneBuilderのインストール

こちらの記事にインストール手順と実際に動かした時の内容を記載しました。(動かしてみた時の記事)
このセットアップをしておくとJavaFXのプロジェクトを作成した時に、下のようなコードを生成してくれます。

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root,400,400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

ちなみに、プロジェクトをMaven化しているのでPOMファイルがあります。生成されるのはapplication.cssとMain.javaです。

開発開始

現状(上こコード)では下のような表示ができます。

まぁ何も実装していないので何もないです(笑)
ここに必要なもの(コンポーネント(ボタンなど))を追加していきます。

設計

設計の大まかなところはGithubにアップしています。
なので、とりあえずはURLをロードして、表示する画面を作成します。
大まかな仕様は以下の通りです。
<仕様>

  1. JavaFXを起動
  2. プロパティファイルをロード(読み込む)
  3. プロパティファイルにあるURLを読み込み表示する

とりあえずはここまで実装しようと思っています。

JavaFXの起動

とりあえず生成されたコードで動いているので、この部分は飛ばします。

1.プロパティファイルの読み込み

RPi(ラズパイ)で動かす時にはMavenのプラグインで出力するJARファイルを起動して動かすので、別途プロパティファイルをJARファイルの隣(同じ階層)に配置する必要があります。
しかし、開発段階では気にしなくて良いので、resources/いかにプロパティファイルを配置します。

そんなわけで実装開始〜

プロジェクトの設定

単純に使用したいライブラリ、JARファイルの出力を設定します。
まずは使用するJUNIT(使い方など)dependencyに追加、使用できるようにします。

ちなみに、EclipseのMavenプロジェクトの場合はPOMファイルに下のような設定をかき、ビルド(Install)すると必要なライブラリが追加されます。

実行するときは下のようにPOMファイルを右クリックして Maven Installを実行します。

ちなみに、自分が作成したPOMファイル(コピペで作成)は以下のようなものです。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>RPiMediaPlayer</groupId>
  <artifactId>RPiMediaPlayer</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>RPi メディアプレーヤー</name>

<!-- 必要な情報をプロパティとしてもつ -->
  <properties>
      <java.version>1.8</java.version>
      <maven.compiler.target>${java.version}</maven.compiler.target>
      <maven.compiler.source>${java.version}</maven.compiler.source>
  </properties>  
<!-- 使用したいライブラリ(依存性)の設定 -->
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
<!-- ビルドの設定 -->
  <build>
    <sourceDirectory>src</sourceDirectory>
    <resources>
      <resource>
        <directory>src</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <mainClass>zenryokuservice.socket.server.SocketServerBasic</mainClass>
            <classpathPrefix>dependency-jars/</classpathPrefix>
          </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
      </configuration>
      <executions>
        <execution>
          <id>make-assembly</id> <!-- this is used for inheritance merges -->
          <phase>package</phase> <!-- bind to the packaging phase -->
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <version>2.5.1</version>
      <executions>
        <execution>
          <id>copy-dependencies</id>
          <phase>package</phase>
          <goals>
          <goal>copy-dependencies</goal>
          </goals>
          <configuration>
           <outputDirectory>
             ${project.build.directory}/dependency-jars/
           </outputDirectory>
          </configuration>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
</project>

実装まで行きませんでしたが、ここら辺で失礼いたします。

でわでわ。。。



Java FX RPi Media Player 〜ラズパイ・メディアプレーヤー〜

今回は、ラズパイ上で動くメディアプレーヤーを作成しようと思います。

経緯

本当はYoutubeを再生するアプリを作成しようとしたのですが、これを設計している最中に「作成していく途中で結局メディアプレーヤーを作ることになるな・・・」と思い、このようになりました。

開発準備

いつも通りに、Eclipseを使用します。

そして、セットアップ関連はこちらの記事を参考にしてください。

Windows版はこちらの記事でEclipseのインストールを行いました。

ラズパイで動かす

今までにラズパイ上で動かすため、Eclipse Kuraのセットアップに挑戦していましたが、ちょっとこちらをストップ。
シンプルにJavaSE(JDKに入っているAPI)で進めてみようと思いました。

JavaSEはラズパイだろうが、PCだろうが、Arduinoだろうが動かすことができます。
ただし、Bluetoothなどのデバイスにアクセスしたい場合には、以下のような手間があります。

  1. ちょっとしたライブラリを使用
  2. 自分でデバイス用のプログラムを書く

なので、今回はそれらを使用しない方法でやろうと思います。
つまり。。。

JavaSEでの開発

Java 8 以降、JavaSEにはJavaFX(画面作成API)が梱包されているので、そのまま使用することができます。
具体的には下のようなコンポーネント(画面とか、ボタンとか)をJavaで作成、動かすことができます。
下のものは JavaFXでのサンプルアプリです。

そして、自分が作成したものです。

これらは、Javaのみで(PCに付けたUSBとかディスプレイなど)にアクセスしないで起動できるのでJavaSEのみで作成、起動することが可能です。

と言うわけでJavaFXでの開発方法を以下にまとめます。

開発方法

実際に開発するのには、手間が少ない方が良いです。(みんなそう思うし、時間ができれば色々なことができます)
なのでなるべくなら「手間を少なく」「良いアプリを作る」ここら辺に注力して準備を進めたいと思います。

  1. NotePCでのEclipseでの開発(プログラム作成)
  2. NotePC上でテスト(ローカル・テスト)
  3. RPi上でテスト(実機テスト)

こんな感じで開発を進めたいのですが、これを実現するためにMavenを使用します。
英語のサイトなので日本語訳してみます(最近のものは意味がわかるようになってきています)

まとめると下のようになります。

  1. Eclipseにプロジェクトを作成する
  2. Githubにリポジトリを作成する
  3. NotePC上でテストしたコードをコミット(PUSH)
  4. ラズパイでGithubからPULLしてソースを取得
  5. Mavenビルドで起動ファイル(*.JAR)を生成
  6. ラズパイのSHELLでOS起動時に動かす

まずはNotePCで動かす

そんなわけで、NotePC上で開発を始めます。ちなみに、上の手順「4」の確認は行いました。ハローワールドプログラムを起動することに成功しています。JavaFXも起動確認済みです。ただし、Xサーバー(GUIサーバー)を起動する必要があるのでラズパイをCUIモードで動かすとJavaFXが動きません。。。

ちょっと長くなってきたので、今回はここまでにします。

でわでわ。。。

関連ページ

Eclipseのインストール〜java学習フロー



Eclipse Kuraインストールできた〜IMGから VDI作成、RPiの設定など〜

今度こそ、Eclipse Kuraをラズパイにインストールしたいと思います。

いまさらCPUの違いに気づく

そう!、ラズパイはARMで動いています、これに気がつかなかった。。。VBoxでARMはどうなんだろうか?調べてみると、QMUなどを使用するという記載がほとんど。。。
なるほど。。。そんなわけで。。。

QEMUインストール

こちらのサイトから各OSようにダウンロードできるようです。
自分はMacなので、コマンドでインストールします。
brew install qemu
これが結構長い。。。

そして、インストールができたら、確認を行います。
ターミナルを開き、以下の入力をします。
qemu-を入力してからTABキーを押します。

上のように、コマンドの一覧が表示されます。これはインストールされていて環境変数にQEMUが登録されている状態を示します。

次回は、QEMUを使用して環境構築を行います。

でわでわ。。。



失敗「エミュレータを間違えていた」

失敗A: Oracleのページを参照

ここのページでJavaSE8のドキュメントを参考にラズパイへJavaSE8のセットアップを行います。
Eclipse Kuraとか関係なくなってきました(笑)

失敗B: Kuraのページ参照

参考サイトはこちらです。(クイックスタート)

RaspberryPi

ラズビアンをVBoxにインストトールします。
上の参考サイトにしたがって、やらないと前回同様失敗しそうなので、ちゃんとやります。

イメージをVDIに変換

まずは、OSのイメージファイルをダウンロードします。ダウンロードしたのは下のようなファイルです。
2019-09-26-raspbian-buster-lite.zip.torrent
そして、このファイルはイメージファイルではないのでここからIMGファイルをダウンロードしてくる必要があります。
「ダウンロード?」と疑問に思った方、さすがでございます。

Trrentファイル

trrentファイルはIMGファイルを作成するために必要なデー
タをダウンロードするためのものらしいです。
ここのページからtrrentの変換をできるツールがダウンロードできるのでtrrentファイルから下のようなファイルを生成します。
2019-09-26-raspbian-buster-lite.img

VBoxへのVDIファイルのインポート

IMG → VDI

そして、IMGファイルからVDIファイルに変換してVBox上で起動できるようにします。参考サイト
<Macの場合>:WindowsはVBoxManageコマンドが使えるように環境変数がVBoxへ通っていることを確認してください。下のようなコマンドで変換しました。
VBoxManage convertdd 2019-09-26-raspbian-buster-lite.img RaspberryPi.vdi

VDIファイルのインンポート

下のような手順でインポートすることが、できます。

・新規で仮想マシンを作成します。

・ハードディスクの選択時にVDIファイルを選択します。

RPiの設定(VBox)

・32bitのデビアンの仮想マシンを作成、出力したVDIをセット

Java IoT 開発準備〜BlueJの使い方+Eclipseインストール(RPi)〜

IoTをJavaでやる

JavaでのIoT開発をやるのに、色々と考え、試しましたが、結局はPC上に仮想マシンを立てて実行、テスト、デプロイの順でやるのがやりやすいといところに至りました。

BlueJを使う

VMBoxにインストールしたRPiにデフォルトでインストールされているJavaのIDE(開発ツール)としてBlueJというものがあります。

ちょっと動かしてみました。

Eclipseを使う

参考サイトをみてセットアップを行い開発を進めるのも1つの手段です。

インストール手順

  1. ラズパイでターミナルを開き、以下のコマンドで「dhcpcd5パッケージ」を削除する(互換性がないため)
    sudo apt-get purge dhcpcd5

    これをやった後にネットワークの切り替えをやらないといけません。
    sudo systemctl enable networking
    そして、ここに記載しているものは抜粋なので参考サイトを翻訳してよく読む必要がありますので注意です。

  2. そして、ラズパイでのネットワーク設定はこちらを参照してやってみる→削除したDHCPネットワークを使用不可にしたのでネットワークを切り替えます。
    sudo systemctl enable networking
    これで、通常の(ラズビアン)デビアンのネットワークが動くようです。

  3. gdebiコマンドラインツールをインストールします。
    sudo apt-get update
    sudo apt-get install gdebi-core

  4. Java 8がインストールされていることを確認してください。ターミナルを起動してから下のコマンドを叩きます。と参考サイトに記載がありましたが、openjdk8がインストールできないので(apt-getで見つからなかった)デフォルトのJDK(OpenJDK11)でやってみようと思います。
    java -version

参考にしたサイトの手順にしたのようなものがありました。がdhcpを削除したらネットに繋がらないです。。。当たり前ですが。。。なので、ネットワークの切り替えを上の手順でやりました。
sudo systemctl enable networking

Javaのバージョンが11なので8をインストールします。
sudo apt-get install openjdk-8-jre-headlessしかし、インストールできませんでした。パッケージが見つからないようで。。。

しかし、インストール!

sudo gdebi kura_ <バージョン> _raspberry-pi-2-3_installer.deb

そして、失敗!
やっぱり、JDK8でないといけないようです。
なのでOracle JDK8をインストール!
このサイトを参照

補足

ラズパイのネットワーク

ネットワークの設定を行いました。が結局繋がらなかったので、実物をダウンロードしてインストールする方向に切り替えました。。。こちらのサイトから落とします

ダウンロードしている最中に、(終わるかは別)VMBoxの共有フォルダを作成します。
VMBoxの設定を開き、共有フォルダを選択します。

緑色のプラスボタンを押下して下のように入力しました。

そして、ゲストOS(ラズパイ)を起動して共有フォルダを探してもありませんでした。。。

VBoxAdditionインストール

結論から言うとアプリが足りないのです。。。
と言うわけで、VBoxAddtion〜をインストールします。
VBoxのメニューから「Device」を選択します。VMBoxからゲストOSを起動した状態で行うのでキャプチャが取れませんでした。。。
「Insert Guest Additions CD image」と言う文字が見えるのでそれをクリックします。
するとゲストOS上にCDが見えるようになりますので、それを確認します。さらに以下の手順を行います、

Guest Additions〜のインストール

ターミナルを起動して以下のコマンドを叩き、CDをマウントします、これをやらないとファイルを起動できません。

  1. ディレクトリの移動
    cd /mnt
  2. CD用のディレクトリの作成と
    mkdir cdrom
  3. CDをマウント
    mount -r /media/cdrom /mnt/cdrom/
    ちなみに、CDは/media/cdromにありました。
  4. そしてインストールを行います。
    sudo sh /mnt/cdrom/VBoxLinuxAdditions.run
  5. 共有フォルダをマウント、ファイルパーミッションの変更します。
    sudo mount -t vboxsf 共有フォルダの名前 /mnt/マウントするフォルダ名
    自分の場合は下のようなコマンドになりました。
    sudo mount -t vboxsf VMBox_Fld /mnt/vmbox_fld

そして、パーミッションの変更(誰でもアクセスできるようにします)以下のコマンドを叩きます。
chomod 777 マウントしたフォルダ
自分の場合は、以下のコマンドを叩きました。
sudo chomod 777 /mnt/vmbox_fld

パーミッションの詳細に関しては、こちらを参考にしました。さらに、グループ権限の登録も行います。
sudo gpasswd --add pi vboxsf

しかし、うまくいかず。。。他の人はこれでだいたいうまくいっているようです。

Macのやり方があるようだ

こちらのサイトを見ると<VMBox.app/XXX>のファイルを何かしら、しないといけないようです。

でわでわ。。。