TinkerBord にKivyを入れる

RaspberryPiではkivyの入れ方は公式に掲載されている中、公式に掲載されておらず
TinkerBoard　Kivyの記事が少ないため記録として残します。
(おかしな作業も含まれているかもしれません)


TinkerBoardを利用する理由としてRaspberryPiの処理能力より高く、形状も類似しているため上位互換として利用が考えれたため（特にフルスクリーンの動画では顕著に差が発生）


TinkerOS　v2.0.7
https://www.asus.com/Single-Board-Computer/Tinker-Board-S/HelpDesk_Download/
or
https://tinkerboarding.co.uk/wiki/index.php/TinkerOS
(日本の公式サイトのOSは古い)

Kivy 1.10
https://kivy.org/doc/stable/installation/installation-linux.html#debian-jessie-or-newer

基本的には、TinkerOSは Debian 9(stretch)なのでインストールマニュアルのdebianの項目を参照

#インストール方法
## 1. /etc/apt/sources.list へdeb追加
マニュアルよりstable版
`deb http://ppa.launchpad.net/kivy-team/kivy/ubuntu xenial main`

上記コード/etc/apt/sources.list に追記する

```/etc/apt/sources.list 
deb http://http.debian.net/debian/ stretch main contrib non-free
・・・省略・・・
deb-src http://http.debian.net/debian/ stretch-updates main contrib non-free
deb http://ppa.launchpad.net/kivy-team/kivy/ubuntu xenial main
```
その後、下記コマンドで登録
`sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A863D2D6`

`sudo apt update`

これでapt(パッケージ管理システム)に参照されるようになります。
**updateを忘れてapt installをすると1.9がインストールされますので注意**

## 2. インストール　aptコマンド

`sudo apt install python-kivy`

python2.7版がインストールが開始されます。
(2.７版にしかないライブラリを使用するため)
**python3版は　sudo apt install python3-kivy**


基本的にここまででkivyインストール完了です。

***kivy実行時に　エラーが発生する場合　SDL２の変更をお勧めします。おまけ3に記載***

## おまけ1. examplesのインストール
`sudo apt install kivy-examples`

## おまけ2. pipのインストール
apt install python-pipコマンドで入るpipのバージョンが古いので
kivyインストール後にまともにライブラリが入らないので手動で入れる方法(get-pip.py)
https://pip.pypa.io/en/stable/installing/

```
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
```

`pip -V`にでバージョン確認

## おまけ3 SDL2の変更

今回の記事を書くキッカケです。
デスクトップ環境では動作はするのですが求めていたのは、RaspberryPiと同じくSSHやCLIからの起動、および自動起動をしたい。raspberryと同様に操作すると、下記のエラーがでます。
`[CRITICAL] [Window      ] Unable to find any valuable Window provider at all!`
（あと明らかにデスクトップ環境のkivyの動作が重い、Raspberryの方が軽快と感じるほどに）

解決方法について下記のフォーラムに答えがありました。
> https://groups.google.com/forum/#!topic/kivy-users/jwBnYxe969g

SDL2を手動で入れ直しましょうということです。
これがなかったら諦めていました。感謝します。

https://wiki.libsdl.org/Installation#Linux.2FUnix
より　インストール方法を参照

＊homeディレクトリで操作しています。

### hgコマンドを使用可能にする（mercurialのインストール）
インストール方法のhgコマンドがないためmercurialをいれてhgコマンドを使用可能にします。
`sudo apt-get install mercurial`

### SDLのサイト通りの作業
`mkdir build`まで実行

```
hg clone https://hg.libsdl.org/SDL SDL
cd SDL
mkdir build
```

### インストール開始
`./configure --disable-video-rpi --disable-video-opengl --enable-video-opengles2 --disable-video-mir --enable-video-kmsdrm && make && make install
`
上記コマンドで　/usr/local/lib に追加されます。

### リンクの変更（要方法変更）。
フォーラムのやりとり内でインストールしても動作しないというやり取りがあります。
回答として、インストールしてもライブラリの読み込み上、手動で入れたSDL2じゃなくて元々のSDL2を参照しているからなんとかしてねということらしいです。
参照先を確認します。

```
$  sudo ldconfig -p | grep SDL
	libSDL2_ttf-2.0.so.0 (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libSDL2_ttf-2.0.so.0
	libSDL2_mixer-2.0.so.0 (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libSDL2_mixer-2.0.so.0
	libSDL2_image-2.0.so.0 (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libSDL2_image-2.0.so.0
	libSDL2-2.0.so.0 (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libSDL2-2.0.so.0
	libSDL_ttf-2.0.so.0 (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libSDL_ttf-2.0.so.0
	libSDL_mixer-1.2.so.0 (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libSDL_mixer-1.2.so.0
	libSDL_image-1.2.so.0 (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libSDL_image-1.2.so.0
	libSDL-1.2.so.0 (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libSDL-1.2.so.0
```

~~/usr/lib/arm-linux-gnueabihf/libSDL2-2.0.so.0を参照しています。
このファイルはリンクファイル(/usr/lib/arm-linux-gnueabihf/libSDL2-2.0.so.0.4.1)なので参照先を書き換えます。~~
~~これで差し替え完了になり想定している動作が行えるようになります。~~

ライブラリを読まれる順番を替えてあげます。
`/etc/ld.so.conf.d/`に`arm-linux-gnueabihf.conf`より先に読まれる
configファイルを作りその中に`/usr/local/lib`をいれてください。
`ldconfig`にて先によまれます。


### import osによる環境設定
kivyを使用するpyファイルに追記してください

```python
import os
os.environ ['KIVY_GL_BACKEND'] = 'sdl2'
```
もしくは起動時に
`KIVY_GL_BACKEND = sdl2 python xxx.py`
として入れても動作します。

**SDL2の変更後、GUIまわりの処理能力も上がっている気がします。**


# さいごに
RaspberryPiに比べて処理能力が高くコストもそこまで高くないのでGUIを回すことを考えると便利です。
Piに比べて情報量が少ないのが難点でしょうか。


一点うまくいってない点はsystemctlにてOS起動時にkivyを動かしたいのに動かないことです。
手動(systemctl start) ではうまくいくのでkivy起動前になにか転けてる感じがします。
(raspberry piのときはうまくいってました)