RaspberryPi + processingでヘッドレスに画像を生成させる(ちょっと微妙)

# processingヘッドレスをRaspberryPiで試してみる

processingで画像を生成させて保存したい場合
RaspberryPiだとGUIを使いたくない場合があるしそもそもprocessingが重くて使いづらい
そこで、ヘッドレス(GUI無し)で画像を保存する方法があったので備忘録がてら記述
(ただ、最後の画像保存のところが微妙なのでお詳しい方解決策をお願いしたい思いもあります)

# 1. Processingをインストールする

processingはLinux 32bit 2.2.1をインストールした

参考

[PROCESSING 2.1 + ORACLE JAVA + RASPBERRY PI + SERIAL + ARDUINO = ☺](http://scruss.com/blog/2014/01/07/processing-2-1-oracle-java-raspberry-pi-serial-arduino-%E2%98%BA/)

```
$ sudo apt-get update
$ sudo apt-get upgrade
```


oracle javaのインストール
```
$ sudo apt-get install oracle-java7-jdk
```


processingのインストール
```
$ wget http://download.processing.org/processing-2.2.1-linux32.tgz
$ tar xvzf processing-2.2.1-linux32.tgz
```


processingに入ってるjavaを削除する
```
$ rm -rf ~/processing-2.2.1/java
```


oracle javaを反映させる
```
$ ln -s /usr/lib/jvm/jdk-7-oracle-armhf ~/processing-2.2.1/java
```

jSSCのインストール
```
$ wget https://java-simple-serial-connector.googlecode.com/files/jSSC-2.6.0-Release.zip
$ unzip jSSC-2.6.0-Release.zip
```


processingにjSSCを反映
```
$ mv jSSC-2.6.0-Release/jssc.jar ~/processing-2.2.1/modes/java/libraries/serial/library/
```

使用するjavaを変更する
```
$ sudo update-alternatives --config java
```
おそらくRaspberryPiだと


```
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                                 Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt/jre/bin/java   318       auto mode
  1            /usr/lib/jvm/jdk-7-oracle-armhf/jre/bin/java          317       manual mode
  2            /usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt/jre/bin/java   318       manual mode

Press enter to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/lib/jvm/jdk-7-oracle-armhf/jre/bin/java to provide /usr/bin/java (java) in manual mode

```

というのが出てくると思うので、1のjdk-7-oracle-armhfを用いる

1をタイプしてEnterする





これで、processingおよびprocessing-javaがRaspberryPi上で動くようになった


次に、仮想的にxserverでprocessingを使うためにxvfbを導入する

# 2. xvfbの導入



参考
[Running Headless Selenium on a Raspberry Pi](http://joejanuszk.com/blog/2014/03/29/running-headless-selenium-on-a-raspberry-pi/)

Xvfbのインストール
```
$ sudo apt-get install xvfb
```

フォントも念のためインストールする
```
$ install xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic
```

Xvfbを起動する
```
$ Xvfb :1 -screen 0 1024x768x24 &
```

```
_XSERVTransSocketOpenCOTSServer: Unable to open socket for inet6
_XSERVTransOpen: transport open failed for inet6/raspberrypi:1
_XSERVTransMakeAllCOTSServerListeners: failed to open listener for inet6
[dix] Could not init font path element /usr/share/fonts/X11/misc, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/cyrillic, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/100dpi/:unscaled, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/75dpi/:unscaled, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/100dpi, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/75dpi, removing from list!
[dix] Could not init font path element /var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType, removing from list!

```

みたいなのが出てくるけど無視して大丈夫(フォントをインストールしていた場合[dix]の行数が減るはずです)


仮想的にディスプレイに反映させる
```
$ export DISPLAY=:1
```

これで準備は整ったので、プロセシングファイルを作って実行する

# 3. processingファイルの作成
とりあえず画像を出すのが目的なので適当なプロセシングファイルを作る

```
$ mkdir sample
$ cd sample
$ vi sample.pde
```

単純な円を描くプログラム

```java:sample.pde
void setup() {
  size(200, 200);
}

void draw() {
  background(0);
  ellipse(100,100,100,100);
  save("test.jpg");
}
```

うまく実行出来れば、test.jpgという名前のファイルが作成される
processing-javaを用いて実行してみる。実行はsample.pdeを実行するのではなくて、sampleフォルダを実行することに注意
プロセシングのフォルダやsampleフォルダはhomeディレクトリに保存しているが、これらは適宜移動させても大丈夫

```
$ ./processing-2.2.1/processing-java --sketch=/home/pi/sample --output=/home/pi/sample/output --force --run
```

ちょっと時間がかかるので待つ

画面に

`Listening for transport dt_socket at address: 8752`


と表示されたら成功

sampleディレクトリにtest.jpgというファイルが生成しているはず

これでヘッドレスでprocessingを用いて画像を生成することができます


ただし、プロセシングプログラムで画像を生成しても、上手く生成できたり出来なかったり
というのが現段階の状況

無限ループを使用しているのが悪いのかもしれないのでこのあたりなんとか解決しておきたい・・・