どうしてもラズパイZeroWで最新(v3.4.4)のなでしこ３を動かしたい！


# 発端
　Raspberry Pi ZeroWになでしこ３をインストールする、あるいはarmv6lがサポート外となったv12以降のnode.jsの非公式ビルドをインストールをしてみた件については以前も書きました。

https://qiita.com/snowdrops89/items/2378046916f0cfb9fbd1

　しかし、それから一年半ほど経過し、なでしこ側の状況も大きく変わっています。
　当時は、node.js v12以上が**推奨**だったのですが、現在の最新バージョンv3.4.4ではv16以上が**必要**になっているようです。（2023/2/9現在）

　windows版も、v3.3.3以降、旧バージョンのnodeでは起動出来なくなっちゃっており、当時ワタクシのPCがwin7だったために、これまた苦労したものでした。

https://qiita.com/snowdrops89/items/eb90af3500a99ee5ceda

　以前はラズパイZeroWに標準で入るnode v10でも、なでしこ３インストール時に赤や黄色のWARNの嵐になりはするものの、ギリ動くことは動いたのですが、おそらく現在はこちらも、v16以上のnodeが入ってないと動かなくなってるものと思われます。

　と言うのも最近、なでしこ公式ＨＰの『ラズパイで動かそう』のページに「Raspberry Pi ZeroWの場合」の但し書きが追加され、node.jsの非公式バイナリをインストールする手順が記載されました。

https://nadesi.com/doc3/index.php?%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%9D%E3%81%86

　でもですよ、「動く場合があります」だって。
　しかも、「残念ながら、筆者の手元では動きませんでした」なのですって！
　しかもしかも、参考サイトとしてワタクシの記事にリンクを張って頂いておるではありませんか！！
　むむぅ、責任を取らなくては・・・

# なでしこ以前の準備

　とゆうワケで、一年半ぶりにラズパイZeroWを引っ張り出すｗ
## とりまアップデート
　なにしろまた一年半放置しましたからね。
```
sudo apt-get update       # パッケージリストの更新
sudo apt-get upgrade      # パッケージのアップグレード
sudo apt-get dist-upgrade # ディストリビューションの更新
```
## VNC
　SSHはつながるのにVNCがつながらないよぅ。なんでだ:persevere:
　VNCサーバ起動し直し。
```
sudo raspi-config

「Interfacing Options」→「VNC」→「はい」→「了解」
```

　前は一度起動したらずっとそのままVNC使えてたんですが、今回どうも一回落とすとつながらなくなっちゃってることが時々あるんです。ナゾです。
　SSHは問題ないので、つながらない時は都度起動し直し。いいのかそれで:sweat:
　しかも、この手順を踏んでもつながらない、何度やってもつながらない、って時があるんですよね～。そして、急に何事もなくつながる時もあるとゆう。なんなんだ、この現象:thinking:

# とりあえず最新のなでしこを試す

　前回の記事の時にインストールし、現在も入っているなでしこさんは、v3.2.24でした。
　ESModule対応したv3.3.3が大きな転機で、色々変わってるんだよねー。
　とりあえず、お試しでふつーにアップデートしてみたところ、またまたWARNの嵐です。
　v16以上入れろとかv14以上入れろとかv12以上入れろとかとか色々言っています。
　でも、入ることは入った。そして、前はそれで動くことは動いたんだよねー。

```
cnako3 -v
```
　ぽちっとな。
```
# Fatal error in , line 0
#

#
# Fatal error in , line 0
# Liftoff bailout should not happen. Cause: Armv6 not supported

#
#
#
#FailureMessage Object: 0xb61fe268
Trace/breakpoint trap
```

　わあぁ、やっぱダメだ～:sob:

```
node -v
→v16.5.0
npm -v
→v7.19.1
```

　えーっ、入ってるのにぃ。非公式だけど。

　でも、そういえば以前この非公式ビルドをインストールしてみたのはちょっとした自己満足で、なでしこ自体は簡単インストールコマンドで普通にインストールしただけだった。
　ですから、アップデートもその際にインストールされたnode v10.24.1、npm v6.14.12を参照していてWARNが出ていたものと思われます。

　一回アンインストールしちゃう。
```
# なでしこのアンインストール
sudo npm uninstall -g nadesiko3

# Node.jsのアンインストール
sudo apt remove nodejs npm
```

　今入ってる非公式バイナリも一回削除して、また１からやってみることにします。
```
# 非公式バイナリを手動で削除
rm -r /usr/local/lib/nodejs/node-v16.5.0-linux-armv6l
```

# 公式ページの手順でインストールしていきますよ

　node.jsをパッケージではなくバイナリでインストールする手順について、前回の記事では[nodejsのhelpのwiki](https://github.com/nodejs/help/wiki/Installation)の記載を見ながら進めましたが、今回は全て[なでしこさん公式ページの『ラズパイで動かそう』](https://nadesi.com/doc3/index.php?%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%9D%E3%81%86#hca2d4c58)の手順に沿って１からやっていきます。

## バージョンを指定
　今は推奨版が18.14.0、最新版が19.6.0とゆうコトらしいけど、とりあえず16あればいいようなので、ムリせず以前と同じ16.5.0を入れることにしておく。
　環境変数に入れて後のコマンドで使います。
```
# バージョンを指定
VERSION=v16.5.0
DISTRO=linux-armv6l
```

## パッケージのインストール？
　この後、なでしこさんＨＰの手順によれば、パッケージのインストールを行うことになっているけど、これは果たして必要ですかね？　別にコレをアップデートするわけじゃないしね。
　なでしこのためにここではじめてnode.jsをインストールするとか、なでしこでしかnode.js使わないとかゆうワタクシのような人には不要な気がします。
　とゆうワケで、飛ばしちゃった。
　はやくも手順通りじゃないぜ💧

## 非公式ビルドのインストール
```
# ダウンロード
sudo wget https://unofficial-builds.nodejs.org/download/release/$VERSION/node-$VERSION-$DISTRO.tar.gz

# 解凍してコピー
tar -zxvf ./node-$VERSION-$DISTRO.tar.gz
sudo mv ./node-$VERSION-$DISTRO /usr/local/lib/nodejs
```
　コピペすればカンタンです☆
　公式ページからのコピペで問題なく進められます。

## 設定を更新
　あれ？　どうやら、ちょっとパスが違ってますね。
　上記コマンドで、バイナリは`/usr/local/lib/nodejs/node-v16.5.0-linux-armv6l/`にインストールされているので、その中の`bin`に通します。
```
# 設定を更新
echo "export PATH=/usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin:$PATH" >> ~/.profile
echo "" >> ~/.profile
source ~/.profile
```
　それにしても、ファイルマネージャからテキストエディタで開いて編集してたけど、コレで書き込めるんですね。しゅごい☆

### てすと
```
node -v
→v16.5.0
npm -v
→7.19.1
```

　おっけー☆

## なでしこさんのインストール

```
# なでしこ3をインストール
npm -g install nadesiko3
```

　`sudo`は付けません。
　これで、非公式バイナリがインストールされた`node-v16.5.0-linux-armv6l`のnode_modulesのなかにnadesiko3がインストールされました。
　おおお、いっこもエラー出ないでインストールされたよ～！（感動）

　ところが！！！
　cnako3ができません！　やっぱりさっきのエラーです:sob:
```
# Fatal error in , line 0
# Liftoff bailout should not happen. Cause: Armv6 not supported
```
　`０行目で致命的なエラー`だって！
　リフトオフ救済ってなんなんだよ、ぐーぐる翻訳さん？！
　とりあえず`Armv6 はサポートしてないよ！`　と言ってるラシイ。
　知ってますよ～。そこをなんとかたのむ～～～:pray:

# オプションで回避する

　そこをなんとかたのむオプションがあるようです！

https://github.com/homebridge/homebridge/issues/3005

　nodeに`--no-expose-wasm`を付けて起動することで回避出来るらしい。
　やってみます！

```
cd ../../usr/local/lib/nodejs/node-v16.5.0-linux-armv6l/bin/
node --no-expose-wasm cnako3 -v
→v3.4.4
```

　できました！　やったね！！
　・・・無理矢理系過ぎますけれどね:sweat_smile:

# cnako3 で起動出来るようにする

　やっぱ、`cnako3`だけで起動したいよね、当然。
　上記参考サイトによれば、一行目の`#!/usr/bin/env node`を`#!/usr/bin/env -S node --no-expose-wasm`に変更して出来たとあるのですが・・・

　cnako3の一行目をそのように変更してみたところ、`/usr/bin/env`に`S`なんてオプションはない！　と怒られてしまいました。
　`-S`を外してみたところ今度は、`node --no-expose-wasm`なんてファイルもフォルダもない！　と怒られてしまいます。
　`--no-expose-wasm`がnodeのオプションとしてではなく、`node --no-expose-wasm`とゆう一個の名称として扱われてしまうラシイ。なにゆえに～。しくしくしく。

　と、ここで！
　モノスゴク役立つ記事をQiitaで発見。

https://qiita.com/hnw/items/0eb94e804a674c75a825

　やはり、これは環境依存で、Linux上では第一引数の後ろは全て第二引数としてまとめられてしまうとゆうことらしい。
　そして、それを回避するための知恵が書かれております！　神だね！！

　これでいけそう？
```
#!/bin/sh 
":" //# ; exec /usr/bin/env node --no-expose-wasm "$0" "$@"
```

　非公式バイナリをインストールしたフォルダの`bin`フォルダの中にある`cnako3`の一行目、`#!/usr/bin/env node`を消して、上の記述に置き換えます。
　結局やっぱりファイルマネージャからテキストエディタで開いて編集ｗｗｗ

　さてさてどうでしょう？
```
cnako3 -v
→v3.4.4

cnako3 -e "「こんにちは」と表示。"
→こんにちは

cnako3 -e "ナデシコバージョンを表示。"
→3.4.4
```

　できました！！！

## エディタも使えるようにする
　あんま使わなそうですが、`nako3edit`と`nako3server`の一行目も同様に書き換えます。
　これで、簡易サーバが起動して、node版のエディタ、web版のエディタがそれぞれちゃんと開きました。

　やったね☆

　ところが！
　web版のほうはちゃんとデモも実行されたのですが、node版の方は実行ボタンを押したらエラーが！
　どうやら実行ボタンを押すとフルパスで`node cnako3 nako3ファイル`を実行するコトになってるみたいなのねん。このnodeの部分にも件のオプションを付けてやらなければならないようです。
　捜索した結果、nako3editの217行目、
```
    const cmd = `"${NODE}" "${CNAKO3}" "${fullpath}"`
```
　を
```
    const cmd = `"${NODE}" --no-expose-wasm "${CNAKO3}" "${fullpath}"`
```
　に書き換えたら、実行できました！！
　やったね！！！

# おわります
　ラズパイZeroWでも、非公式バイナリを使用して、最新のなでしこが動くことを確認できました！
　わーいわーい♪♪♪

　もし、うまくいかない場合は、インストール先（手順通りなら`/usr/local/lib/nodejs/node-v16.5.0-linux-armv6l/`にnodeがインストールされ、その中の`lib/node_modules`の中にnadesiko3がインストールされています）や、ちゃんとパスが通っているか（ルートから`node -v`して、`v16.5.0`が出る）を確認。
　特に、他バージョンのnodeが混在してる場合は、ちゃんとv16のでcnako3を開けているかを確認。
 `bin`の中のcnako3を書き換えた呪文に誤りが無いかを確認。

　そんなところでしょうかねー？
　もしこれで動いた！　とか動かねえ！！　とかあれば、コメントでも[なでしこの掲示板](https://www.eznavi.net/site/bbs/)でもお寄せください。
　なんとかなるとも限りませんが、自分とこ以外の状況を知れると、役立つこともあったりなかったりするよねー。
　もちろん、もっと賢い知恵をお持ちの方がいらっしゃれば、教えて頂きたく思います。