Nim on chromebook / on Android termux

#Arm64 での Nim のビルドについて

Android のアプリの termux で Nim 1.4.8 を使ってネットワークのプログラムを書いたところ HTTPS の通信で問題があった。cURL ならだいじょうぶかもしれない。
テストは同じ termux 上で Ruby,python,go で同じ動きのプログラムは問題ないことを確かめてあるので Nim に固有の問題だった。
termux では certificate ファイルが見つからないというエラーで、Nim 1.4.8 に固有の問題でバージョンアップされないと解決しない。（ ... かな ?  → termux Lua の `http`,`httpclient`でも同じようなエラーになった。
**2021.12.7 追記: Nim Compiler Version 1.6.0 [Android: arm] にバージョンアップされて問題なくなった。**

[luasec](https://gitter.im/luarocks/luarocks?at=613467f963dca8189141eacc) だと無事だけれども termux では lua-requests は依存モジュールの`lua-cjson`がまだインストールできない。 ）

```
Error: unhandled exception: error:1416F086:SSL 
routines:tls_process_server_certificate:certificate verify failed [SslError]
```
https://forum.nim-lang.org/t/8345

https://github.com/nim-lang/Nim/pull/18520

termux の SSL ca（証明証）を Nim プログラムコードに指定してもエラーになります。

```nim
import net,httpclient

let ctx = newContext(caFile = "/data/data/com.termux/files/usr/etc/tls/cert.pem")
var client2 = newHttpClient(sslContext = ctx)
```

エラー

```bash
/data/data/com.termux/files/home/nim-1.4.8/lib/pure/net.nim(647) newContext
Error: unhandled exception: Failed to load SSL/TLS CA certificate(s). [IOError]
```
https://github.com/nim-lang/Nim/issues/18519

---

使わなくなったという Acer tab 10 Chromebook を借りてきて、`sudo apt update` してから（ `sudo  apt -get update` **ではない**ので注意。使われていない間に、この Linux OS のレポジトリ自体が修正されているから apt-get ではレポジトリにたどり着かない。chrome OS のアップデートと コンテナの Linux は切り分けられているようだから修正されてる現時点で apt-get では弾かれるレポジトリにアップグレードデータがあるため。）使ってみるとデベロッパーモードのコンテナ（　crostini　）の Linux はスリープしたあとサスペンドから戻ると 100% クラッシュする（そんなんありか ? ）ので、今必要な数時間稼働させておくようなことには全く使えそうにないが（でも、Chrome ブラウザでデベロッパーツールが使えるので短時間で終わるスクレイピングプログラムを作るのには向いている。スリープさせなければクラッシュしないのでバッテリー次第）、Linux なのでこちらでもテストできると考え、Go と Nim をインストール。

（ 参考までに chromebook でも termux アプリは使える。だが、**google アプリの termux は死んでいる。F-droid からインストールできるならば、そうしたほうがいいが、できるかどうかは未検証。Termux の利点は新しいバージョンのパッケージがリポジトリから利用できること。**マルチセッションにするには`~/.termux/termux.properties` でショートカットキーを割り当てる。アプリでは左から右にスワイプして new session のスイッチを表示させるが chromebook では、その動きはリロードになってしまうので、ショートカット・キーコマンドでセッションを増やしたり、選んだりするより他はない。基本的にショートカットは [Tmux](https://en.m.wikipedia.org/wiki/Tmux) に似ている。Tmux もインストール可能。）![Screenshot 2021-09-02 18.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/6ce2c10d-206c-9bac-8ec9-a892d4a130cb.png)



APT のリポジトリにある Nim バイナリはとても古いので別の方法でインストールする必要があった。

```
curl https://nim-lang.org/choosenim/init.sh -sSf | sh
```

こちらのインストール方法は arm64 では不可であったので、

```bash
wget  https://nim-lang.org/download/nim-1.4.8.tar.xz

tar -vxf nim-1.4.*

cd nim-1.4.8

sh build.sh

bin/nim c koch

./koch boot -d:release

./koch tools
```

というようにしてビルドする方法の一択だった。

Rf.https://nim-lang.org/install_unix.html

そのあと、PATH を設定するのに三時間かかった。知っていればなにも問題はないはずだが、知らなかったので



**最終的**には、 

```
export PATH=$PATH:$HOME/.nimble/bin
```

を

```
vim ~/.profile
```

で書き込んだ。`~/.profile`に書き込んで保存したあと、 `soruce ~/.profile`するか、ターミナルを exit して再度ターミナルを起動させて、bash に設定を読み込ませる。

![Screenshot 2021-08-31 15.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/ca750abc-2c77-873c-5109-7101a797639c.png)


## $PATH 設定の書式（通らない書き方） 
>
```
export PATH=$PATH:~/.nimble/bin
```

とか
>
```
export PATH=$PATH:/HOME/chatnoir/.nimble/bin
```

などでは**全く PATH が設定されなかったのだった**。（ここを二時間繰り返した）


そして、アンドロイドの termux でテストしたコードをコンテナ（　crostini　）の Linux 環境でテストした。

現状 ssl 接続の場合はコンパイル時に

```nim
nim c -d:ssl hoge_request.nim
```

のようにする。ssl はちょっと特別といった感がある。
で、このテストは通った。
プログラム自体は、[nim4colab](https://github.com/demotomohiro/nim4colab) でもほぼ同じコードで 1.4.8 よりも新しいバージョンのコンパイラでテストしていたので、1.4.8 の普通のバージョンで、termux 以外でという条件のテストになった。


Android に戻って、termux の pkg で用意されているバージョン 1.4.8 nim ではなく、ソースからビルドしたバージョン 1.4.8 nim コンパイラならどうなのかということで、調べてやってみた。
結論は、やはり最初のエラーと同じ。pkg って誰がビルドしたりメンテナンスしているんだろう ? Termux が独自に　ca ファイルを用意していることを Nim のビルドした人が知らなかったということになるのだと思われる。

## ソースからのコンパイルのしかたが、おそらくは探しにくいのでここにメモしておく。


```terminal
wget  https://nim-lang.org/download/nim-1.4.8.tar.xz

tar -vxf nim-1.4.8.tar.xz

cd nim-1.4.8

sh build.sh --os android

bin/nim c koch

./koch boot -d:release

./koch tools
```

ビルドのためのツールは別途必要。

Rf.https://forum.nim-lang.org/t/8345#54065

夏が終わる。
![IMG_20210831_171421_447.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/4810bdfc-d058-3208-bf65-5c0fd94e6fb7.jpeg)