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 だと無事だけれども termux では lua-requests は依存モジュールのlua-cjsonがまだインストールできない。 )

Error: unhandled exception: error:1416F086:SSL 
routines:tls_process_server_certificate:certificate verify failed [SslError]

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

import net,httpclient

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

エラー

/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]


使わなくなったという 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 に似ている。Tmux もインストール可能。)

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

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

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

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 に設定を読み込ませる。

$PATH 設定の書式(通らない書き方)

export PATH=$PATH:~/.nimble/bin

とか

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

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

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

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

nim c -d:ssl hoge_request.nim

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

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

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

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

夏が終わる。