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
ビルドのためのツールは別途必要。