Ardublock を Docker でビルドする ( openjdk11 で Ardublock )

ArduBlock は Arduino IDE で使えるブロック開発環境プラグイン。
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/07a7df6a-13e7-43f5-1cf7-cca333cba147.png)

Javaで記述される。これのビルドの記事を以前書いたが
「ArduBlock のビルド」
https://qiita.com/nanbuwks/items/dde4270eade41f8b75ec

古くなったので、いまどきのやりかたでビルド環境を試してみる。
Docker で Ubuntu22.04 をロードし、そこで作成してみます。
なお、Docker使わない場合でもこの記事の方法をなぞればビルドできるはず。

( 2022/11/17追記： Docker 使わない Ubuntu20.04 環境で同じ流れでビルド成功しました )

# 環境

- 母艦 Ubuntu 22.04
- Docker version 20.10.17, build 100c701 で Ubuntu22.04 コンテナ稼働
- コンテナ中：
- Ubuntu22.04
- openjdk 11.0.17 2022-10-18
- Ardublock 


# Docker でコンテナを用意

Docker は以下のようにしてインストールしています。
「Ubuntu20.04 に Docker を導入する (Also Ubuntu 22.04)」
https://qiita.com/nanbuwks/items/0ba1d13b3cd27e5c6426

ubuntu22.04 のイメージを用います。
```
$ docker pull ubuntu:22.04
```

母艦の /home/nanbuwks/Downloads/ardublock をコンテナ中の /mnt で見えるようにします。
```
$ docker run -v /home/nanbuwks/Downloads/ardublock:/mnt -it -d --name ardublock2204 ubuntu:22.04
```
実行
```
$ docker exec -it ardublock2204 /bin/bash
```

# 必要なソフトウェアをインストール

```
# apt update
# apt install tzdata
```
タイムゾーンを設定しておきます。
```
# apt install maven git
```
インストールされたバージョンを調べる
```
# mvn --version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.17, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "5.15.0-52-generic", arch: "amd64", family: "unix"
# java --version
openjdk 11.0.17 2022-10-18
OpenJDK Runtime Environment (build 11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64-Bit Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu222.04, mixed mode, sharing)

```

# Ardublock をクローン

作業場所を作り、移動します。
```
# cd /mnt
# mkdir ardublock_work_20221113
# cd ardublock_work_20221113/
```
レポジトリをダウンロード
```
# git clone https://github.com/taweili/ardublock.git
# cd ardublock
```


# openblock をインストールする
```
# ./install_openblocks
```
としてインストールしておきます。


# ドキュメント
```
ArduBlock
======

ArduBlock is a Block Programming Language for Arduino. The language and functions model closely to [Arduino Language Reference](http://arduino.cc/en/Reference/HomePage)

Installation
----
The project is managed by Maven. After checking out the source for the first time, one should run the following to install Arduino's pde.jar into the local repository. 

	$ mvn validate

Usage
----

	$ mvn exec:java -Dexec.mainClass="com.ardublock.Main"

Development
----
Change the /src/main/resources/com/ardublock/block/ardublock_def.xml to add new blocks to ArduBlock

	$ mvn clean package

	$ mvn compile exec:java -Dexec.mainClass="com.ardublock.Main"

The Visual Block environment should show up. Happy Hacking! ;) 

Deploy
----
Edit code of ardublock

	$ mvn clean package

copy the target/ardublock-all.jar to Arduino\tools\ArduBlockTool\tool


```

とあります。

これに従い、まず以下のコマンドを実行しておきます。
```
# mvn validate
```
# pom.xml を編集

```
# mvn compile
```

すると、
```

[ERROR] error: Source option 5 is no longer supported. Use 6 or later.
[ERROR] error: Target option 1.5 is no longer supported. Use 1.6 or later.

```

と出るので
```
                        <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-compiler-plugin</artifactId>
                                <version>2.3.2</version>
                                <configuration>
                                        <source>1.5</source>
                                        <target>1.5</target>
                                </configuration>
                        </plugin>
```

の1.5 を 1.6に変更しておきます。
# ソースの変更
```
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /mnt/ardublock_work_20221113/ardublock/src/main/java/com/ardublock/translator/block/dfrobot/lcdkeypad.java:[18,6] error: unmappable character (0xE9) for encoding UTF-8
[ERROR] /mnt/ardublock_work_20221113/ardublock/src/main/java/com/ardublock/translator/block/dfrobot/lcdkeypad.java:[18,10] error: unmappable character (0xE9) for encoding UTF-8
[ERROR] /mnt/ardublock_work_20221113/ardublock/src/main/java/com/ardublock/translator/block/dfrobot/lcdkeypad.java:[18,27] error: unmappable character (0xE8) for encoding UTF-8
```

と出るので、該当のlcdkeypad.javaを見てみます。

```
                // r�cup�ration des param�tres du module, ici le message plac� en rang 0
                // on �crit donc le code �  g�n�rer
                TranslatorBlock translatorBlock = this.getRequiredTranslatorBlockAtSocket(0, "lcd.print( ", " );\n");
                // cr�ation du texte de code correspondant
                translator.addHeaderFile("LiquidCrystal.h");

```

このコメント中に文字コードがヘンなキャラクタが入っているので、該当コメント行を消しておきます。



:::note

(2023/03/31追記)
該当箇所は vim で見ると読めました。フランス語だったようです。
```
                // récupération des paramètres du module, ici le message placé en rang 0
                // on écrit donc le code Ã  générer
                TranslatorBlock translatorBlock = this.getRequiredTranslatorBlockAtSocket(0, "lcd.print( ", " );\n");
                // création du texte de code correspondant
```
以下のように差し替えることにしました。
```
                // retrieve the parameters of the module, here the message placed in row 0
                // write the code to generate
                TranslatorBlock translatorBlock = this.getRequiredTranslatorBlockAtSocket(0, "lcd.print( ", " );\n");
                // create the corresponding code text

```
:::

# 再度 pom.xml の編集
```
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /mnt/ardublock_work_20221113/ardublock/src/main/java/com/ardublock/translator/block/dfrobot/lcdkeypad.java:[18,6] error: unmappable character (0xE9) for encoding UTF-8
[ERROR] /mnt/ardublock_work_20221113/ardublock/src/main/java/com/ardublock/translator/block/dfrobot/lcdkeypad.java:[18,10] error: unmappable character (0xE9) for encoding UTF-8
[ERROR] /mnt/ardublock_work_20221113/ardublock/src/main/java/com/ardublock/translator/block/dfrobot/lcdkeypad.java:[18,27] error: unmappable character (0xE8) for encoding UTF-8
[ERROR] /mnt/ardublock_work_20221113/ardublock/src/main/java/com/ardublock/translator/block/dfrobot/lcdkeypad.java:[18,63] error: unmappable character (0xE9) for encoding UTF-8
[ERROR] /mnt/ardublock_work_20221113/ardublock/src/main/java/com/ardublock/translator/block/dfrobot/lcdkeypad.java:[19,8] error: unmappable character (0xE9) for encoding UTF-8
```
と出るので、
```
    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/maven-v4_0_0.xsd">
```
および
```
                <repository>
                        <id>central</id>
                        <url>http://repo1.maven.org/maven2</url>
                </repository>
```

の5箇所の http を https に変更します。

# ビルドする

コンパイルが通るようになったので、 

```

# mvn package
```
とすると target/ardublock-all.jar が生成されるので、母艦で実行します。
```
$ java -jar ardublock-all.jar
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/24b07282-9b2e-f968-ef1c-cf24803bf605.png)

成功しました。


# トラブルシューティング

```
    [ERROR] Failed to execute goal on project ardublock: Could not resolve dependencies for project org.ardublock:ardublock:jar:0.1.0-SNAPSHOT: Could not find artifact arduino:arduino-core:jar:1.8.5 in central (https://repo1.maven.org/maven2) -> [Help 1]
```

が出るときは、` mvn validate `  を行う。