Using Julia on Android?

これからやることのメモだから、これから検証。2020年の情報を元にしている。
前回、[jupyter notebook を pydroid3 のアプリ内のターミナルから起動して使えるようにした](https://qiita.com/dauuricus/items/2471d0fa3af8b7d03e4f)が、その方法だと pydroid3 だから julia を android 上の jupyter notebook **だとか**（[Pluto.jl](https://qiita.com/dauuricus/items/8f29f1116f0377c3244e#plutojl-%E3%81%A7%E3%81%8D%E3%82%93%E3%81%AE%E3%81%8B%E3%81%AA)）のカーネルにすることができない。

要するに、Android タブレット（現時点では 32bit Arm **Amazon Fire 7 2019** / Armv8l **Amazon Fire HD 10 第 9 世代** と **Amazon Fire HD 8** ）で termux を使って、julia を起動できるようにしたい。python とか julia とか プログラミングスキルとかのはなしは全く出てこないし、そもそも知らないですが、どうやったら企業側に利益率が低く、そしてユーザー側に不利の多いツールを有益にたのしめるかという目線で多めに時間を使っているリポートという感じではないかとおもいます。2021年５月に発送される新製品 [Amazon Fire HD](https://www.itmedia.co.jp/news/articles/2104/28/news084.html)シリーズより前の世代のタブレットに相当します。   

えっと、ネットとブラウザで、android だろうがなんだろうが... という場合はこちらへ、どうぞ。

＞**julia を googlecolab で使えるようにしたい。**

https://qiita.com/dauuricus/items/1235f7188f2fc5c2f771


レシピ

* https://github.com/termux/proot-distro
* https://github.com/MFDGaming/ubuntu-in-termux

＞[検証済みのインストール手続きについては、ここ](https://qiita.com/dauuricus/items/8f29f1116f0377c3244e#%E4%BB%8A%E3%81%AE%E3%81%A8%E3%81%93%E3%82%8D%E3%81%AF%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B-julia-%E3%81%AF%E6%9C%80%E6%96%B0%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%81%A8%E3%81%84%E3%81%86%E3%81%93%E3%81%A8%E3%81%AB%E7%95%99%E6%84%8F%E3%81%97%E3%81%A6%E6%89%8B%E9%A0%86%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B)へ飛んで。

https://m.youtube.com/watch?v=YI5ZYTRuGrY&feature=youtu.be

https://youtu.be/itXiltXEeac

---
##資料

**Aug 2020**

**Step 1**
Download the termux app on your Android (Play Store worked for me)
**Step 2**
Install Ubuntu on termux by following this [guide](https://github.com/MFDGaming/ubuntu-in-termux) . For those who are too lazy to open the page, here are the instructions from the page
Installation steps

Update termux, install wget, proot, git

```bash
Update termux: apt-get update && apt-get upgrade -y
Install wget: apt-get install wget -y
Install proot: apt-get install proot -y
Install git: apt-get install git -y
```

Go to HOME folder:

```bash
 cd ~
```
Download script: 

```bash
git clone https://github.com/MFDGaming/ubuntu-in-termux.git
```

Go to script folder:

```bash
cd ubuntu-in-termux
```

Give execution permission: 

```bash
chmod +x ubuntu.sh
```

Run script:

```bash
./ubuntu.sh
```

Fix resolv.conf: cp ~/ubuntu-in-termux/resolv.conf ~/ubuntu-in-termux/ubuntu-fs/etc/ – for me not required
Now just start ubuntu:

```bash
./startubuntu.sh
```

**Step 3**
Update apt-get and install wget (for downloading packages) install Julia using

```bash
apt-get update 
apt-get upgrade
apt-get install wget
```

Then download and install the Julia 1.5 binaries for ARM (do not use apt-get install julia because this would install an old Julia version):

https://discourse.julialang.org/t/using-julia-on-android/8086/33

---

##実践。

まず、termux のレポジトリが応答エラーなのでチェンジする。
前にもおなじことがあったが、そのときは手動で切り替えたのだけど、こっちが推奨されていた。よく見たら。

```bash
termux-change-repo
```

![Screenshot_20210429-201642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/162b81a4-8bf8-37c1-012e-d42033ab68a0.png)

資料 **step 2** までの Ubuntu をインストールして OS をスタートするところまで問題なし。
 
```bash
./startubuntu.sh
```

やや、ややこしいが、androidOS のアプリである termux のターミナルを使って、ubuntu OS をインストールして、その ubuntu へ　julia のバイナリを設置して、ubuntu のターミナル（でも termux であることに変わりない）からコマンドで julia を起動するというイメージ。
という重箱構造になっているので一重目に vim がインストールされていても、二重目の ubuntu は空っぽなので、ファイルに追記するだとかの用事には、こちらにもエディターがあった方がいい。 

**step 3** 
あとは julia をバイナリで ubuntu にインストールしてパスを通すという謎（知らない）なことを詳細に調べたらいい。エラーが出たら。

[Julia のサイトでバイナリを選ぶ](https://julialang.org/downloads)とき、インストールするタブレットの CPU が、なになのかを知っておく必要がある。知らなかったが arm 64ビットだろう、たぶん、と思っていて実際やってみて、あとづけで調べたら違った。

スペックをデバイス名から調べても良いけど、このコマンドで 64 ビットか 32 ビットかの二者択一はできる。調べましょう。

```bash
uname -a
```

Platform Specific Instructions for Official Binaries

https://julialang.org/downloads/platform/

シンボリックリンクの作り方とか、わからないので、こちらの通り意味もわからずやって、

https://ferrolho.github.io/blog/2019-01-26/how-to-install-julia-on-ubuntu

パーミッションのエラーが出たので、調べているうちに時間切れバッテリー残りが 5% に。

「julia をバイナリで ubuntu にインストール」で調べれば、そこのところは先人がきっちり書き記しているものに行き着くので安心してほしい、自分。

###julia-1.6.1 バイナリの起動のエラー
エラー内容は
           
```
root@localhost:~# julia --version
julia: error while loading shared libraries:
libjulia.so.1: cannot enable executable stack as shared object requires: Permission denied
```

おしい。コーヒー 4 杯くらいかかりそう。

**コーヒー 1 杯目**

step 3 をよく見てみる。

>It is strongly recommended that the official generic binaries from the downloads page be used to install Julia on Linux and FreeBSD. The following set of commands downloads the latest version of Julia into a directory named julia-1.6.1.

>```
wget https://julialang-s3.julialang.org/bin/linux/x64/1.6/julia-1.6.1-linux-x86_64.tar.gz
tar zxvf julia-1.6.1-linux-x86_64.tar.gz
```

>Running Julia
The generic Linux and FreeBSD binaries do not require any special installation steps, but you will need to ensure that your system can find the julia executable. The directory where Julia is installed is referred to as <Julia directory>.

>To run Julia, you can do any of the following:

>* Invoke the julia executable by using its full path: <Julia directory>/bin/julia

>* Create a symbolic link to julia inside a folder which is on your system PATH

>* Add Julia's bin folder (with full path) to your system PATH environment variable

>To add Julia's bin folder (with full path) to PATH environment variable, you can edit the ~/.bashrc (or ~/.bash_profile) file. Open the file in your favourite editor and add a new line as follows:

>```
export PATH="$PATH:/path/to/<Julia directory>/bin"
```

>Apart from this, there are several ways through which you can change environment variable. You can follow [this guide](https://help.ubuntu.com/community/EnvironmentVariables) to find out a way convenient for you.

RF. https://julialang.org/downloads/platform/

Fire 7 termux
![Screenshot_20210430-121650.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/16281809-274a-acd7-7f6f-6470fa09e2d5.png)

これは、シンボリックリンクをこのようにつくってみて、

```
cp -r julia-1.6.1 /opt/
ln -s /opt/julia-1.6.1/bin/julia /usr/local/bin/julia
```

エラーになるので、いったんシンボリックリンクを外して

```
unlink /usr/local/bin/julia
```

外してみて、`.bashrc`にこのようにして書き込んでみて、

```
echo "export PATH=~/julia-1.6.1/bin:$PATH" >> ~/.bashrc
source ~/.bashrc
```

やはり同じエラーになるから、`julia: error while loading shared libraries: `の問題をチェックしているところ。
参照はここ。
https://discourse.julialang.org/t/cannot-start-julia-1-4-2/41267/4


ldd ってなに？
RF.
【lddコマンド】依存関係を確認する方法
https://qiita.com/tkhshiq/items/7c678cf3a87440cbce16

**コーヒー 2杯目**
これは文字通り、`libjulia.so.1`の問題か。雨が降りそう。

```bash
root@localhost:~# cd julia-1.6.1
root@localhost:~/julia-1.6.1# ls -la
total 40                                     
drwxr-xr-x. 8 root root 4096 Apr 23 19:35 .
drwx------. 3 root root 4096 Apr 30 06:27 ..
-rw-r--r--. 1 root root 5087 Apr 23 19:35 LICENSE.md
drwxr-xr-x. 2 root root 4096 Apr 23 19:35 bin
drwxr-xr-x. 3 root root 4096 Apr 23 19:35 etc
drwxr-xr-x. 3 root root 4096 Apr 23 19:35 include
drwxr-xr-x. 3 root root 4096 Apr 23 19:35 lib
drwxr-xr-x. 2 root root 4096 Apr 23 19:35 libexec
drwxr-xr-x. 7 root root 4096 Apr 23 19:35 share
```

**コーヒー 3~4 杯**

この問題を考えて、冷えたコーヒーを温めて飲みつつ繰り返し同じことを２回やってみると、もしかして？

![Screenshot_20210430-161952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/f5a2a634-3fea-ebed-c715-ab95feeb9796.png)

と、バイナリのバージョンをさかのぼって、同じことをしてみる。だんだん醒めてきて、資料にしてるこの書き込みも一年以上は前だし、当時は問題なくできていて誰もが納得している今できないってことはあって、それで直近の書き込みが最近とはいかないのかな？という最初から無意識に了解していることに気がつき始める。
だから、このエラーってプログラムのバージョンアップで出てきたものかもしれないし、方法自体は読み間違っているわけでもないのかもしれないので、それを確かめたい。
Fire 7 は arm 32bit 系なので、バージョン julia-1.3.1 までダウンする。

![Screenshot_20210430-163419.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/ce71d226-b240-610c-21e0-e89a746de5d5.png)

エラーは出るが、なにか...しばらく待つと

![Screenshot_20210430-163558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/4fbe6d08-ed9d-c2c4-d516-6ca2cb7c15d2.png)

done! やったね。

erorr 類の詳細は以下。でも julia はたちあがる。

```
$ ./startubuntu.sh
root@localhost:~# echo "export PATH=~/julia-1.3.1/bin:$PATH" >> ~/.bashrc
root@localhost:~# source ~/.bashrc
root@localhost:~# echo $PATH
/root/julia-1.3.1/bin:/usr/local/sbin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/games:/usr/local/games
root@localhost:~# julia
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/３v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
```

つまり、julia-1.6.1 の arm 32bit 版のバイナリが Fire 7 ではエラーになっていて、その原因はまだわからないが、バージョンを`https://julialang-s3.julialang.org/bin/linux/armv7l/1.3/julia-1.3.1-linux-armv7l.tar.gz`まで下げると、同じ方法でインストールできる。

##今のところは、インストールする julia は、最新バージョンではないということに留意して、手順をまとめる

####現時点では Amazon Fire 7 2019 / Fire HD 10 と 8 （ARMv8l） だけを使っています。[2021-05-01]

番号がついているところを順番にやっていくと目的は達成するはずですが、その補足もありますので一見長いですが、 10 分程度でできる事です。

###**instruct 000**

まず、termux のアプリを android にインストール。Fdroid からの方がいいと思う。（termux のドキュメントのどこかに理由が書いてあると思います。）

termux のターミナルコマンドで、

###**instruct 001**

```bash:001
apt update && apt update
```

これがうまくいかない場合は、リポジトリの速度などでエラーになる可能性がある。
エラーの例として:

```
Error reading from server - read (5: I/O error) [IP: 54.187.47.108 443] E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
```

この場合は、リポジトリをミラーに変更する。
例えば、こうやって手動でやるか、

https://youtu.be/nCaYiozDRNE

ターミナルコマンドで

```
temux-change-repo
```

で変更する。

https://github.com/termux/termux-packages/wiki/Mirrors

次は termux の linux コマンドで使うパッケージをインストールする。

###**instruct 002**
termux で用意されているパッケージをインストールする。
これは、termux で使えるコマンドを用意するということ。

```bash:002
apt-get install wget -y
apt-get install proot -y
apt-get install git -y
```

ホームディレクトリに移動する。ホームディレクトリは、ここになっているのです。

```bash
/data/data/com.termux/files/home
```

だから、コマンドは、`チェンジディレクトリ　チルダ`

###**instruct 003**

```bash:003
cd ~
```

現在のディレクトリ階層を見るのは、`pwd`というコマンドだから、チェックしてみては？

わからないな…という人は、悪くない。説明が悪いだけだと思うので、たとえば、こことか丁寧に書いているようだ。
https://www.lisz-works.com/entry/termux-init

ホームディレクトリがわかって、自分がどこにいるのか理解できたなら、次はギットします。

###**instruct 004**

```bash:004
git clone https://github.com/MFDGaming/ubuntu-in-termux.git
```

この場合、ホームディレクトリにギットハブに置かれているファイルが該当する github そのままのディレクトリ構造でコピー（clone）される。
それを確認するには、`ls`コマンドでリストされる。うまくいっていたら、ホームディレクトリに`ubuntu-in-termux`というディレクトリが出現している。

###**instruct 005**

```bash:005
cd ubuntu-in-termux
```

ubuntu-in-termux の中に移動したわけですね。`ls`してみてください。
いくつか、`.sh`ファイルがあります。bash スクリプトというものですね、きっと。これを実行すれば、自動的にスクリプトに書かれていることをターミナルが実行していきます。

例えば、ubuntu.sh はこうなっているので、見てみますか。
>**What's This?**
This is a script that allows you to install Ubuntu in your termux application without a rooted device

> https://github.com/MFDGaming/ubuntu-in-termux/blob/master/ubuntu.sh

このスクリプトを実行するために、パーミッションを変更します。

###**instruct 006**

```bash:006
chmod +x ubuntu.sh
```

`+x`ってなんだろうと思うことは大切だとおもいます。
![IMG_20210502_014015_365.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/9588f00b-a995-20fa-fdc0-f09909fc0983.jpeg)


```bash
chmod 700 ubuntu.sh
```

と同じでした。

![IMG_20210503_220733_818.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/d8204e69-346f-1d40-c721-6849b2af5db6.jpeg)


スクリプトを run します。run しますって、いいですね。`./`に続けてスクリプトファイル名でエンターキーで run です。

###**instruct 007**

```bash:007
./ubuntu.sh
```

なんか、他のプログラムで昔、ドキュメントに、「次に実行。それで終わり。」みたいなことが書いてるだけで、そこまでできてたのに、実行の仕方がわからなかったことがありました。GUIアプリケーションでアイコンをクリックに慣れていていると、「え？クリックってどうすんの？コマンドで？」と困ることがあると思います。ありました。そして、一度やっても、忘れてしまうので、ここで確かめてください。・・・ハイ。

次は、このスクリプトでインストールした ubuntu をスタートします。ubuntu って OS ですよ。ubuntu OS のコマンドを移植しているってことかな？ 

###**instruct 008**

```bash:008
./startubuntu.sh
```

スタートしましたか。

ターミナルの様子が、この行から変わりました。

```bash
root@localhost:~#
```

となった。ちょっと変ですが、ubuntu OS 見たことある人は、見たような感じかと思います。ラズパイとか。
タブレットの OS があって、その中のアプリの中で、また OS を使っているような感じです。または、ターミナルから他のコンピューターに root でログインしているのに似ている。

ということで、ここから ubuntu の設定になります。ubuntu は空っぽです。ラズパイの場合はけっこう最初から使いそうなものが用意されていたような気がしますが。

デバイス・・・今使っているタブレットのCPUについて調べます。ARMv7か、ARMv8かのどちらかを`uname -a`コマンドを使って調べます。どっちでもない場合もありますが、この検証は、Amazon Fire 7(2019)によって行っています。チェック後、ARMv7の場合は、32ビット、ARMv8の場合は 64 ビット（かな？この記事の一番最後を見て）の julia プログラムのバイナリの圧縮ファイルを`wget`コマンドでダウンロードします。

```bash:cpu-check
uname -a
```

julia プログラムのバイナリの圧縮ファイルをダウンロードするサイト
**Download Julia**
https://julialang.org/downloads/

Amazon Fire 7(2019)の場合は、ARMv7lだったので、32ビット向けのバイナリで、なおかつバージョンを現時点で最新の1.6.1からさかのぼっていくと、v1.3.1 (Dec 30, 2019)まで戻らないと該当するバイナリが存在しないので、ダウンロードリンクはこちらからコピーします。
**Older Unmaintained Releases**
https://julialang.org/downloads/oldreleases/
![ARMv7向けのバイナリ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/46d7c459-cf7e-1bfb-8186-69ab4b6a1014.jpeg)


各 OS ごとのオフィシャルバイナリの扱い方
**Platform Specific Instructions for Official Binaries**
https://julialang.org/downloads/platform/

ubuntu のターミナルで使うプログラムを揃えます。

###**instruct 009**

```bash:009
root@localhost:~# apt-get update 
root@localhost:~# apt-get upgrade
root@localhost:~# apt-get install wget
```

###**instruct 010**

```bash:010
root@localhost:~# wget https://julialang-s3.julialang.org/bin/linux/armv7l/1.3/julia-1.3.1-linux-armv7l.tar.gz
root@localhost:~# tar zxvf julia-1.3.1-linux-armv7l.tar.gz
```

`armv7l/1.3/julia-1.3.1-linux-armv7l`は、32ビットの Arm CPU の場合ということです。

###**instruct 011**

/opt/ という場所にコピーして、シンボリックリンクを作ります。

```bash:011
root@localhost:~# cp -r julia-1.3.1 /opt/
root@localhost:~# ln -s /opt/julia-1.3.1/bin/julia /usr/local/bin/julia
```

これで、ターミナルから

```bash
root@localhost:~# julia
```

というコマンドで Julia がたちあがります・・・・か？たちあがった場合は、これで完了です。

否という場合は、また別の方法で、PATH を設定します。でもまず、ついでなので確認してみますか。

シンボリックリンクが何らかの理由で意図したとおりにできてなかったということになります。

```bash
root@localhost:~# cd /usr/local/bin
root@localhost:/usr/local/bin# ls -l
```

としてみて `/usr/local/bin` という場所に先ほどシンボリックリンクを作ったわけですが、そこがどうなっているのか見てみましょう。
見るだけですが。上のコマンドのレスポンスに、以下のような箇所があればシンボリックリンクになっているんですが。

```bash
julia -> /opt/julia-1.3.1/bin/julia
```

つまり`/usr/local/bin/julia`が`/opt/julia-1.3.1/bin/julia`を指しているので、`julia`がコマンドとして機能して、`/opt/julia-1.3.1/bin/julia`のプログロムを呼ぶというような仕掛けが意図したことです。

つまり、`julia`というコマンドを使うと、シンボリックリンクをコマンドで実行するというこになっていて、

```bash:シンボリックリンク
root@localhost:/usr/local/bin# ./julia
```

それは、シンボリックリンクが指しているプログラムが呼び出されるので、これと同じことが起きているということ。

```bash:実体
root@localhost:/opt/julia-1.3.1/bin# ./julia
```

ここでは何らかの理由で、その動作とは違っているということになります。

シンボリックリンクを解除しておきます。

```bash
root@localhost:/usr/local/bin# cd ~
root@localhost:~# unlink /usr/local/bin/julia
```

シンボリックとは別の方法として PATH を設定しましょう。

```bash
root@localhost:~# echo %PATH
```

というコマンドで、PATH がどう表示されるか確認してください。レスポンスが、なにも無かったり、`julia-1.3.1/bin/julia`ではなさそうな別の何かだった場合は、`which`コマンドで julia がどこにあるか探してみます。

```bash
root@localhost:~# which julia
```

###**instruct 012**

```bash:012
root@localhost:~# echo "export PATH=~/julia-1.3.1/bin:$PATH" >> ~/.bashrc
root@localhost:~# source ~/.bashrc
```

このようにして`.bashrc`へ追記します。`>>`はすでにあるところに追加で書き込みですが、`>`は上書きになると思います。追加で書き込みですから特に気をつけてください。
この作業は「環境変数を設定する」といわれていることです。
`export` ... とすると環境変数にセットするようですね。
`.bashrc`に記述されたことは自動的に読み込まれるようになるということです。
しかし、書き込んだだけでは反映しないので`source`コマンドで手動で自動的？に読み込ませます。
この場合の「自動的に」と言うのは、bash が呼ばれたときに自動的に`export PATH=~/julia-1.3.1/bin:$PATH`が実行されるわけではないでしょうか。それはログインした時ってことで、いったんログアウトしてログインするとこの設定は反映されるけど、`source`コマンドでも反映できるということですね。

追記されると、`.bashrc`を開いて（とはいえ、開くにはテキストエディターのプログラムが ubuntu-in-termux にインストールされている必要がありますが）、一番最後の部分を見るとこのようになっています。

```bash:.bashrc
export PATH=~/julia-1.3.1/bin:/usr/local/sbin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/games:/usr/local/games
```

もう一度、PATH を確認します。

```bash
root@localhost:~# echo $PATH
root/julia-1.3.1/bin:
```

このようになっている？
OK の場合は、

```bash
root@localhost:~# julia
```

とコマンドすると、julia が呼びだせます。対話モードが開始されます。
julia 対話モードを終了するには Ctrlキー + dキー です。

```julia
Julia> Ctrl+d
```

### ubuntu-in-termux を終了するには

```
root@localhost:~# exit
```

で ubuntu-in-termux から exit できます。

termux を終了する場合は、さらに

```bash
exit
```

とすると、termux を終了できます。

---
##pluto.jl できんのかな？

https://github.com/fonsp/Pluto.jl

**[2021-05-01]**
わからないけれども Amazon Kindle Fire HD 10 第 9 世代 でも 同じようにトライしてみたが バージョン 1.6.1 の 64 ビット版からダウングレードしてバージョン 1.4.2 の 64 ビット版のバイナリはすべてダメで、Fire 7 と同じく、バージョン 1.3.1 の 32 ビット版の julia バイナリ `julia-1.3.1-linux-armv7l.tar.gz` でようやく起動した。
雨が降ってきた。

Amazon Kindle Fire HD 10 **Armv8l**
![IMG_20210501_144022_462.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/97edecd4-f156-4219-9298-9d6b2a283be7.jpeg)
EG.
pluto.jl ... 
`add Pluto`... fail 
![Screenshot_20210501-153621.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/64f2451a-3942-1262-e7d4-ff4889447c14.png)

`add Pluto`... success ?! コーヒー８杯目くらい。**[2021-05-02]**
![Screenshot_20210502-181425.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/227d49ed-59d0-8f5d-b6e4-6abc926f72d4.png)

succeseed !
**[2021-05-02]**
![Screenshot_20210502-182730.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/f720fa79-0824-8c8a-8287-0472c61fec0c.png)

<details><summary>たくさんのエラーとともに **[2021-05-02]**</summary>
<div>

```julia
julia> import Pluto
[ Info: Precompiling Pluto [c3e4b0f8-55cb-11ea-2926-15256bba5781]
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
WARNING: Error during initialization of module LinearAlgebra:
ErrorException("could not load library "libopenblas"
libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
┌ Error: Error during initialization of module CHOLMOD
│   exception =
│    could not load library "libcholmod"
│    libopenblas.so.0: cannot enable executable stack as shared object requires: Permission denied
│    Stacktrace:
│     [1] #dlopen#3(::Bool, ::typeof(Libdl.dlopen), ::String, ::UInt32) at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109
│     [2] dlopen at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/Libdl/src/Libdl.jl:109 [inlined] (repeats 2 times)
│     [3] __init__() at /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:89
└ @ SuiteSparse.CHOLMOD /buildworker/worker/package_linuxarmv7l/build/usr/share/julia/stdlib/v1.3/SuiteSparse/src/cholmod.jl:176
┌ Info:
│     Welcome to Pluto v0.14.4 🎈
│     Start a notebook server using:
│
│   julia> Pluto.run()
│
│     Have a look at the FAQ:
│     https://github.com/fonsp/Pluto.jl/wiki
└

julia> Pluto.run()
┌ Warning: `merge(uri::URI; kw...)` is deprecated, use `URI(uri; kw...)` instead.
│   caller = ip:0x0
└ @ Core :-1

Go to http://localhost:1234/?secret=GfXfm1lA in your browser to start writing ~ have fun!

Press Ctrl+C in this terminal to stop Pluto
```
</div>
</details>

![Screenshot_20210502-190300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/4e30188f-1687-f574-087f-572bb067d0cb.png)
![Screenshot_20210502-191257.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/c7f0312c-4586-aa9d-7ed2-2dfd787b4ba8.png)


Amazon Fire HD 8 **Armv8l**
![Screenshot_20210501-193628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/79f76c84-1e19-c57c-faa9-d348b63eea91.png)

https://youtu.be/8mBcGppMI6A

![Screenshot_20210501-222416.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/c4d5120d-aef3-bcab-2565-44c15109d42b.png)

![Screenshot_20210502-122650_kindlephoto-266245746.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/44f0f9ba-f84e-f459-6e57-8732d74e8c1b.png)
julia-1.3.1
![Screenshot_20210502-123446_kindlephoto-266721927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/0b412945-efb0-36fc-a85c-2dc1a4c1b218.png)

julia-1.6.1 の[バイナリが起動しなかったのも`libjulia.so.1`が原因の1つ](https://qiita.com/dauuricus/items/8f29f1116f0377c3244e#julia-161-%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%81%AE%E8%B5%B7%E5%8B%95%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC)だった。
ここで julia-1.3.1 の場合を見てみると参照する場所の予想ができた。

参考1.ldconfig :共有ライブラリを認識させる
http://linuxcom.info/linux-cmd-ldconfig.html

参考2.ldconfig - 動的リンカーによる実行時の結合関係を設定する
https://manpages.ubuntu.com/manpages/bionic/ja/man8/ldconfig.8.html

参考3.ld.so, ld-linux.so* - 動的なリンカー/ローダー
https://manpages.ubuntu.com/manpages/bionic/ja/man8/ld.so.8.html

あと、libopenblas、libchom をロードすることができないという悲痛そうな警告が出ています。（これは pluto.jl を動かしている間、ずっと悲痛そうで、しかも動作が遅くなります。）

また、Fire HD 8 に **ubuntu.sh** の bash スクリプトで ubunu をインストールしている過程で、
![Screenshot_20210501-185915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/08da6b3d-9852-cde8-1c4e-92cb01bdc3bf.png)
資料の **step 2** の最後のあたりにあった

>Fix resolv.conf: cp ~/ubuntu-in-termux/resolv.conf ~/ubuntu-in-termux/ubuntu-fs/etc/ – for me not required
Now just start ubuntu:
https://discourse.julialang.org/t/using-julia-on-android/8086/33

という部分の解決が bash スクリプト上で成されているらしいという察しがついた。ubuntu.sh も 2019 ~ 2020 年時点でバージョンアップされているのだろう。

Amazon Fire HD 8 **Armv8l** **[2021-05-02]**
![Screenshot_20210502-195036.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/8cdfce6c-e6ce-b48d-4ac0-0c5eadfd1219.png)


バイナリから起動できるのは、julia-1.3.1 armv7l だった。
バイナリから実行したときに参照する生成された箇所への参照を修正できるのか（`libjulia.so.1`の問題
）わかりません、ということと線形代数のライブラリともうひとつのライブラリのロードについては、julia と pluto の開発者にたずねるしかないかとおもいますが julia-1.3.1 はちょっともう古いので質問内容をよく整理しないと。

https://github.com/JuliaLang/julia/issues/8038

![Screenshot_20210503-224229_kindlephoto-202103196.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/eb4823ec-3ebf-3c88-6928-6e3dd2a1bf0d.png)


共有ライブラリが見つからないとか読み込めない問題は結構あるみたい。

```
/etc/ld.so.conf.d/
```

以下に共有ライブラリを検索してほしい path を書いたconf ファイルを作れば良いらしいのでやってみたが、バージョン 1.6.1 の場合は、ライブラリファイルが見つからないのではなく実行パーミッションが無いというエラーなので解決しなかった。

https://tetsuyai.hatenablog.com/entry/20111201/1324792477

`export LD_LIBRARY_PATH=`での設定の場合は、LD_LIBRARY_PATHに追記していく。
そしてさらに`.bashrc`に追記しておくと毎回読み込まれるようになるらしい。

https://w.atwiki.jp/futoyama/pages/60.html

いずれの方法でも解決しなかった。


というところで、Plutoの異常な遅さ（速さを期待できるタブレットではないうえサポートされているOSでさえないことが前提ですよね）で思うのはプリコンパイルが速いというわけでもなさそう。
きのどくなことをしいているようにも思うけれども、目的までの過程でプログラミング以前のところに発見があった。
同じこと何度もタッチキーボードで入力するのは、なんとか vim みたいに最小のキータイピングでできたら...と fish shell を入れてみたりして改善された。

いろいろまだわからないということでもうちょっと言語以前のレイヤーについての興味につながっていく。
比較的新しいコンピューター言語って、どうやって作ってるんだろう？
julia の　end でブロック閉じるのって begin で始まるやつを思い出したが、fortran だったっけ？とか比較していく間に、全く興味の持てない ruby の使い方の本じゃない古い本を（2003年から2008年あたり）アマゾンで探し出して注文した。わりと最近の雑誌でコンパイラを扱っているものも見つけたので出版社に発注した（いつ届くのか不明らしい）。本って不思議だな（というか再販もアマゾンでは無茶苦茶カオスになっていてデータがフェイクらしいので、出版社が公式にアマゾンに出店した販売価格が機械学習でフェイクと判断されるという、ちょっと調べたらわかるだろうということが当然の想定外という扱いを受けるらしい事例を最近聞いた）。

* Rubyで作る奇妙なプログラミング言語
* 初めてのRuby

雨降りに本を選択し続けていると、まず一冊目が届いた。

![IMG_20210506_125147_474.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/82822864-6d12-4c69-9997-8d5c6adc3207.jpeg)

低レベルについての本　￥ 1,897
ポストに届いて、最初に自動的に開いたところが p.231 dlopen 動的リンクについてのページでいきなり核心だった。知識ゼロだったが、予想の答えが一致していたので役割を達成、開封から30秒。

晴れた。

エラーのでる dlopen() 自体をネットで調べると、まず、共有オブジェクトを探すとき LD_LIBRARY_PATH から検索するということが書かれている。
ので、LD_LIBRARY_PATH にライブラリの場所がセットできるのが理想的。パーミッションの設定方法は別問題だけれども。

![IMG_20210506_150419_403.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/4a16e20b-f811-81dc-a2ea-7c5cb78ac50c.jpeg)

ランチでも食べてるとき以外はマスク着用がマナーらしい。外で、一人でも。

藤が咲いている。山道で正面から来たカーブを曲がってきた車に急ブレーキかけてバランスを崩してそのままはねられそうになる。

エラー

```
ErrorException("could not load library "libopenblas"
 libopenblas.so: cannot enable executable stack as shared object requires: Permission denied")
````
が気になっている。

低レベルについての本によると、[「第5章ランタイムHack オブジェクトファイルを自力でロードする」](http://0xcc.net/binhacks/toc.html)が近いところ。
なぜパーミッションが与えられないのか？という根本は置いておいて、パーミッションは変えられるのかと、SharedObjectは置き換え可能なのか？という疑問が先に解決されたい。

How To Write Shared Libraries
Ulrich Drepper
drepper@gmail.com
December 10, 2011

という文献がおすすめされている。なんかとてもいい本に思えてきた。ブックオフにも 1300 円くらいで売っていたが、よく売れてた本なのかな。翻訳本じゃないから、仕事上の翻訳日本語になっていなくていいですね。仕事だとこれは、わかんないし要らんよね？という主観を排して徹頭徹尾、欠損なく翻訳するからとても江戸的な、明治的な（いや、しらんけど）文体になるものだけど、そうなっていない。書いてる人にコーヒー豆を贈りたいような気になりながら藤の垂れ下がる高い樹樹を見た。

libopenblas.so とりあえずどこにあるのか、少ないボキャブラリーで探してみる。

```
root@localhost ~# ldconfig -p | grep libopenblas.so
libopenblas.so.0 (libc6,hard-float) => /lib/arm-linux-gnueabihf/libopenblas.so.0
libopenblas.so (libc6,hard-float) => /lib/arm-linux-gnueabihf/libopenblas.so
root@localhost ~# ls -l /lib/arm-linux-gnueabihf/ | grep libopenblas
lrwxrwxrwx.  1 root root      51 May  2 12:04 libopenblas.a -> /etc/alternatives/libopenblas.a-arm-linux-gnueabihf
lrwxrwxrwx.  1 root root      52 May  2 12:04 libopenblas.so -> /etc/alternatives/libopenblas.so-arm-linux-gnueabihf
lrwxrwxrwx.  1 root root      54 May  2 12:04 libopenblas.so.0 -> /etc/alternatives/libopenblas.so.0-arm-linux-gnueabihf
```

あるけど、`apt-cashe search`で探してインストールしたものかな。

`apt install libopenblas-dev`だと on x86 ではうまくいくとか書いてるが、なにも読んでなかった。

https://www.howtoinstall.me/ubuntu/18-04/libopenblas-dev/

すごく丁寧なインストール方法が公開されている。
金子邦彦研究室 クリエイティブコモンズ BY NC SA

https://www.kkaneko.jp/tools/ubuntu/cblaslinux.html

そして、そこからたどると

https://github.com/xianyi/OpenBLAS/wiki/Precompiled-installation-packages

おっと。
違うのか、そっか。
>**Multiple operating systems**
Binaries designed to be compatible with Julia are regularly provided in https://github.com/staticfloat/OpenBLASBuilder/releases . Note that their 64bit builds with INTERFACE64=1 have _64 appended to the function symbol names, so your code needs to refer to e.g. gemm_64_ rather than gemm_

https://github.com/JuliaLinearAlgebra/OpenBLASBuilder/releases

**[2021-05-08]**
曇り。[x11 転送にとりくんで](https://qiita.com/dauuricus/items/8b3c079b0cea067909d0)、というか書いていて、おなかがへって倒れていると2冊目が音もなく届く。

![IMG_20210508_173427.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/7232d51b-27ee-c519-6ba8-5afad8959592.jpeg)

ruby の本で、気になった3冊のうちの一冊。他と違う雰囲気なのは、タイトル。2005年4月29日初版発行。著者　秋山智俊さん。
￥ 1,261

本が出た頃は ruby の知名度が上がってきた頃のようで、一年後2006年は[ライブドアショック](https://ja.m.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%89%E3%82%A2%E3%83%BB%E3%82%B7%E3%83%A7%E3%83%83%E3%82%AF
)がありました。おそらく、きっとこの頃、ruby を使うよという人向けに、本の企画があったのではないかと思う。

一日待っていた本とはちがうのが先に届いていた。

**[2021-05-09]**
Ruby についての本をアマゾンをぶらぶら見て、古い方から気になったものをなんとなく憶えて、さらに qiita でタグ検索（初めて知った。）で、Ruby を探してみる。

ruby created:<2012

とかしてみたて、気になった記事を書いている方のページの一番下の方に貼られているリンクを見ていくと、ちょうどいいのが見つかった。

https://i.loveruby.net/ja/rhg/book/minimum.html

わかりやすく書いていて、ミニコミのような感じ。本自体はもう売られてないようだ。

**[2021-05-10]**

出版社へ注文した本はどこかで迷子になっているようで、届かないものも、いつか届くものもあってどうなんのかな？と思いながら、ずっとアマゾンの本の価格と本の情報を見ながら古い Ruby　情報を見て termux と [googlecolab](https://qiita.com/ngotogenome/items/d95a7a66c63e26b23de7) で Ruby の制御構文とか　loop　と配列の書き方をこうかなぁ？とやってみて結果を見て、あ、ちがうとかやっている。ドットシンタックスは、[ActionScript](https://www.amazon.com/New-Masters-Flash-Joel-Baumann/dp/1590592093) を思いだすようなオブジェクト指向。

最新情報は、[クックパッドにはあるだろう](https://techlife.cookpad.com/)と見てみたら、ある。
でもブラウザ向けのデモはブラウザが落ちるので、確認できない。
楳図かずおさんの本が欲しくなってきた。アマゾンでの価格に興味がある。

https://mame.github.io/emruby/

https://youtu.be/DI62v6JhdIg

必要になりそうなのは、python と連携できることなんだろうな。「Rubyは死んだ」と言う話題については、生みの親の人もネタにしているようだが、時代的にウェブサービスのサーバーのしかけの面倒みるための道具のための言語って認識からどこにも移行せずにきたところで、もっとパーソナルなツールに使える部分がフィーチャーされてないので python ほどかんたんになんか寄せ集めてパッとできたよってものが「できなさそう」というか、そういうことするのに選択肢にも上がらないということではないかと思う。死んだとか言っているのは、サーバーとか「業務」とか使っていた人が思うことで、新たに出会うというきっかけのところがロストしている。小学生とか中学生で、ゲームとかアプリつくりたいっていうシーンからは、見えないかもしれない。おそらく、不自由ではない言語としては、他の言語影響を与えているので、興味深い。

https://github.com/mrkn/pycall.rb

[pycall](https://qiita.com/stat/items/a383451e7f824e4c9627)について見ている間に本が届いた。[pycall（ Pycall.jl ）ってたしか julia でも　python を呼びだすのに使う](https://github.com/JuliaPy/PyCall.jl)んじゃなかったっけ？と、うっすら思いつつ、そのように越境して使えるという形がいいなぁと、なんか寄生して、そうやって使えたら、いい。
配達の人に酷使されてポストが壊れてきている。どうしよう。

2008年6月24日発行 2014年9月5日初版第10刷/ 著者 Yugui　さん
![IMG_20210510_190441_830.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/c48aedb5-bd5b-bb4f-d4e7-e9cda72dff4e.jpeg)

2008年12月25日発行　/ 著者　原　悠　さん
![IMG_20210510_191930_355.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/b22a0243-51e9-dbc8-c8d0-141f87d32de5.jpeg)

もう一冊は、一番先に発送されたはずだけど…もう、届かないかな。

class を使ってゲーム作りって [ActionScript 2.0](https://board.flashkit.com/board/forumdisplay.php?30-ActionScript-2-0) みたいだなぁ。
https://magazine.rubyist.net/articles/0018/0018-GameProgramingForRubySDL.html

2008年辺りの時代背景がよくわからない。映画だと「[おくりびと](https://ja.m.wikipedia.org/wiki/%E3%81%8A%E3%81%8F%E3%82%8A%E3%81%B3%E3%81%A8)」が 2008 年 9 月に公開されている。[日本初のコンピューターウィルス作成者の逮捕](https://ja.m.wikipedia.org/wiki/%E5%8E%9F%E7%94%B0%E3%82%A6%E3%82%A4%E3%83%AB%E3%82%B9)がこの年らしい。

[Ruby/SDL](https://github.com/ohai/rubysdl) が気になるけど、pygame みたいなものだとしてサスペンド状態なのかな。

同じような 2D ゲームエンジンのこっちの方は、最近までは存在しているよう。コミュニティーがありそう。

https://www.youtube.com/watch?v=hLvlHCnv_k8

[Gosu](https://www.libgosu.org) これは SDL2 のゲームエンジンで今現在アクティブ。
https://confreaks.tv/videos/rubyconf2016-attention-rubyists-you-can-write-video-games
>It’s available for macOS, Windows, Linux, and iOS.

届いた。
![IMG_20210511_125702_kindlephoto-77246459.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/2fd3a98e-aae9-94a9-411c-5335c195fdc7.jpeg)

ざっと中見て、またよく見ることはしばらくなさそう。見ても読むところがない。読むというより、チラッと見てイディオムを潜在意識に刷り込む。閉じる。
濃縮。業界新聞みたいな、ぱっと踏み込めない濃厚なコモンセンス。
チラチラと時々開いていこう。主成分分析の記事は読みやすそう。

**[2021-05-12]**
マンガと Amazon の関係で[サトウシュウホウさん](https://note.com/shuho_sato/n/ncd6528910168)のことや [Line](https://en.m.wikipedia.org/wiki/Line_Webtoon) のこと 雑誌のことを調べていたはずなのに、なぜか julia と雑誌 interface のつながったページへたどり着いていた。julia に戻ってきた。  

2020-05-13 からあげ

https://karaage.hatenadiary.jp/entry/2020/05/13/073000

はからずもちょうど去年の今ごろ書かれたブログ記事らしい。主成分分析について検索してたら、IBM かどこかの方が書いた Qiita 記事、さらに　[Github](https://github.com/makaishi2/profitable_ai_book_info)　という導線をたどって、本のレビューのリンクから [からあげ](https://karaage.hatenadiary.jp/entry/2020/08/19/073000)　ブログへきて、あ、julia の記事 ?? と見てみると雑誌 interface がフィーチャーされている。
雑誌の読者層って、どういう？と昨日からそのコモンセンスにすんなりは入れない感覚を考えていたが、リアル読者で本のレビューされている、なぞな　からあげ　キャラクターとの相関に補完された。
雑誌 interface 、業界新聞みたいな感じが漂うが、また注文するかもしれない。

雑誌 interface については [Amazon](https://m.youtube.com/watch?v=JV7GqhDQosE) で売られていて、それもどうも二次流通なんだけども定価くらいで、でも出版社から取り寄せるより少し安いというところに着目して興味を持ったのだった。どうなっているんだろうか？と。

そして、今現在 Android を使って julia に触れれるのかということだけに時間を費やしたが、大分路線がずれたままで、Android　以外での環境については一切知らないので、そういった事は、一年くらい前の情報から参考になるのかもしれない。

**[2021-05-13]**
どっぷり Ruby の基礎にはまる。UI を探す。armv8l って 64bit だと思うが termux でインストールされる ruby って 32bit ?? 64bit?? 64bit だと思っているけど、確かではない。 

**[2021-05-14]**
Ruby の UI の問題を掘っていると、なぜ julia が 32bit　のバイナリでしか起動できないかがわかった。[termux の FAQ](https://wiki.termux.com/wiki/FAQ) を読めば、Android OS の ABI が 32bit 仕様であれば、たとえ 64bit の CPU でも 32bit の termux になると書いてあって、[Ruby で調べると armeabi](https://qiita.com/kojix2/items/1bf6b999973ea3bc17e6#comment-06382bb972594145e1e0) なので動いてるプログラムは 32bit で間違いない。Armv8l の CPU だけれども。つまり ABI が arm64-v8a だった場合だけ 64bit プログラムとして動くから、それ以外は、pkg も 32bit の用意されているプログラムになるはず。
libopenblas は 64bit じゃなくて 32bit のものが必要。
一体どれが、どこにあるのか、ということを冷静に追わないとわからなくなる。

https://www.youtube.com/watch?v=7fyIqx3v_MQ

で、どれやろ

https://github.com/JuliaLinearAlgebra/OpenBLASBuilder/releases

**[2021-05-24]** 雨だ。
ゼロから ruby やり始めて、まだ何も知らない。昨日初めてハッシュの読み書きのコードを書いた。構造化されたテキストをxmlにパースしてオブジェクトに返すところで、googlecolab でやっていると重たくなってきた。
使っているのブラウザへの資源だけなので、テキストの出力への表示だけが原因だと思うので、出力消せばなんとかなるかと思ったが、プログラムが多岐にわたると、もう限界らしいタブレットでは。うごかへん。自動保存のタイミングとプログラムのランの両方でブラウザのスレッドが止まる。
そこでふと疑問に思った別のこと、このxmlオブジェクトだとか、配列オブジェクトだとか、オブジェクトどうやってdelするの？と。
調べると、ruby ではできない。できなそう。
自動的に開放するよってことで、オブジェクトを自前で消すってことができないぽい。普通は。googlecolab で動かすには、明らかに解るように自分で消したい。消したいよ。

rf.
https://stackoverflow.com/questions/19523039/how-to-destroy-ruby-object

**[2021-05-2?]**
晴れた。本を三冊注文。ずっとスクレイピングを研究。誰に頼まれたわけでもなく違法、明らかに違法なサイトについてどうなっているのか考察し、ある程度予測をしたので実証するための方法を考える。そこで Proxy サーバが必要になったがないので、用意するために、じゃあProxyサーバを作ってみたいと思うようになった。明日は雨らしい。
fireOS アップデートされて、wifi の接続先情報や wifi 並み情報が一切見えないようになった。これはひどい。これアップデートというよりウイルスかもしれない。