Nim開発環境 in Chromebook(IdeaPad Duet)

少し前にLenovo製のChromebookであるIdeaPad Duetを買いました。

そとで記事を書いてみる的なことは試してみたものの、基本的な利用パターンはAndroidアプリ主体では面白みがありません。
そこで、そろそろ「開発環境としても扱ってみよう」と思い立ち、Nimのビルド環境を用意してみました。

## 4ステップで導入するNim

- Linuxアプリを有効化する
- Nim(とNimble)をセットアップする
- IDE(code server)を導入する
- CLIのビルドと実行をしてみる on Chrome

### Linuxアプリを有効化する

以前の記憶などではそこそこ手間のかかるLinux環境の用意も、今となってはChromebook側の機能として提供されています。[^1]

「設定」>「Linux（ベータ版）」>「オンにする」という手順を踏むだけでLinuxコンテナの用意をしてくれます。楽ですね。

最終的には、ターミナルがインストールされて起動するので、そこから後続の作業を進めていきましょう。

### Nim(とNimble)をセットアップする

さて、インストールされたLinux環境はDebian 10系となっています。つまり`àpt`が使えます。
そのため、何も考えずに`sudo apt update`からの`sudo apt install nim`でセットアップ完了！！

...といきたいところですが、そうは問屋がおろしません。

```bash
attakei@penguin:~$ apt list nim
Listing... Done
nim/stable 0.19.4-1 arm64
```
stableリリースのNNimは未だに1.0系にはなっていないんですね。
というわけで、testingリリースから1.4系をインストールしてきます。

*なにはともあれ、リリースパッケージ情報を追加*

```/etc/apt/source.list
# Generated by distrobuilder
deb https://deb.debian.org/debian buster main
deb https://deb.debian.org/debian-security buster/updates main
# ここから下を追加
deb https://deb.debian.org/debian testing main non-free
```

*からの、何も考えずにインストール*

```sh
$ sudo apt install nim/testing
...(略)...
$ nim --version
Nim Compiler Version 1.4.2 [Linux: arm64]
Compiled at 2020-12-02
Copyright (c) 2006-2020 by Andreas Rumpf

active boot switches: -d:release
$
$ nimble --version
nimble v0.12.0 compiled at 2020-12-02 13:39:46
git hash: couldn't determine git hash
```

ここまでで、少なくとも`nim`,`nimble`の両コマンドは実行できそうです。[^2]

#### Hello world by Nimble

Nimble経由で最短でCLIを作ってみましょう。

```
$ nimble init trynim
    Prompt: Your name? [Anonymous]
    Answer: 
    Prompt: Package type?
    Answer: binary
    Prompt: Initial version of package? [0.1.0]
    Answer: 
    Prompt: Package description? [A new awesome nimble package]
    Answer: 
    Prompt: Package License?
    Answer: Apache-2.0
    Prompt: Lowest supported Nim version? [1.4.2]
    Answer: 
   Success: Package trynim created successfully
$ cd trynim
$ nimble run trynim
  Verifying dependencies for trynim@0.1.0
   Building trynim/trynim using c backend
Hello, World!
```
:+1:

ここまでで、Nimのビルド環境の準備はOKそうです。
他に外部ライブラリが必要な場合は、`apt`経由で適宜インストールしましょう。

### IDE(code server)を導入する

Linux環境上には、Vimがインストールされています。
もちろんこの環境での開発も頑張れるのですが、せっかくなのでVSCodeでの開発も体験してみましょう。

とはいえ、Linux環境上で日本語入力まで考慮するとfcitxやらで面倒らしいので、今回はちょっと楽して `code-server` によるVSCode導入をしてみます。

#### code-server

https://github.com/cdr/code-server

簡単に書くと、「ブラウザ上でVSCodeを使えるようになるサーバーアプリケーション」です。
GitHubのCodespacesをローカル環境で実現する感じになります。

#### インストール

インストールスクリプトが用意されています。楽ですね。

```
$ curl -fsSL https://code-server.dev/install.sh | sh
```

このコマンドで、必要なローカルフォルダの用意、パッケージのダウンロードとインストールなどをまるっと実施してくれます。

なお、

```
To have systemd start code-server now and restart on boot:
  sudo systemctl enable --now code-server@$USER
Or, if you don't want/need a background service you can run:
  code-server
```

と出るように、systemdへのサービス登録もできるのですが、今回はひとまずCLIでサーバー起動して運用してみます。[^3]

#### 起動

とりあえず`code-server`コマンドで起動してみます。
設定ファイルが存在しない場合は、この時点で設定ファイルがデフォルト設定で作成されます。
インストール済みのChromeで `http://localhost:8080` にアクセスすると、code-serverが表示されます...が、パスワードの入力を求められます。

![認証ダイアログ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6805/c003a98b-43d9-99dc-d5cf-1d7828e13340.png)

設定ファイルは`~/.config/code-server/config.yaml`なので、開いて`password`に記載されている値を使って認証しましょう。[^4]

![エディターの様子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6805/50e76d66-72a5-6dc3-a9f4-92034c47e5dc.png)

使用感としては、CodespacesやVSCodeのリモートアクセスと同じ感じになります。
（フォルダ移動がOS側ではなく、VSCodeのUI上での挙動になります）

ターミナルも起動するので、これで開発はできそうです。拡張のインストールも簡単にできるので、シンタックスハイライトや補完も割と普通に動きます。

## パフォーマンス検証タイム

ところで、頑張って環境構築してみましたけど、実際のところ開発に耐えられるんでしたっけ？

というわけで、NimのWebアプリケーションフレームワークのjesterを土台にして試してみました。

### 最小ビルド

[jesterのREADME](https://github.com/dom96/jester#-jester-)の最小ソースをビルドしてみました。(.nimbleファイルにjester追加して、`nimble install jester`実施後の状態)

```sh
$ date && time nimble build demo && date
Sun 20 Dec 2020 12:41:55 PM JST
  Verifying dependencies for demo@0.1.0
(略)
real    0m10.445s
user    0m10.076s
sys     0m1.417s
Sun 20 Dec 2020 12:42:06 PM JST
$ date && time nimble build demo && date
Sun 20 Dec 2020 12:42:43 PM JST
  Verifying dependencies for demo@0.1.0
(略)
real    0m6.434s
user    0m5.627s
sys     0m0.815s
Sun 20 Dec 2020 12:42:50 PM JST
```

1回目がいわゆる初回ビルドで、なにも変えずにもう一度ビルドをしてみたのが2回目です。

流石にちょっとばかり処理時間がかかりますね。[^4] [^5]
とはいえ、本格的な開発をするわけでもない予定なので、そのあたりは逆に心に余裕を持つための時間と考えることにしましょう。

## 今後

そもそも想定としては、そこまでガチガチにこの環境ではありません。
ので、この環境で1,2機能ぐらいの編集あたりを実際に試して、面倒かそうじゃないかを体感したいかなと思います。

[^1]: β版とはなっています
[^2]: recommendsがついてくるため、`gcc`もセットでついてきます
[^3]: 多分ですが、Linuxアプリ自体の起動をしないとサービスとして動作しないんじゃないかと思ってます。
[^4]: 「ローカルでしか使わないし、認証とか邪魔」という人は、`config.yaml`で`auth`を`none`にして無効にしましょう
[^5]: ちなみに、ちなみにメインのソースを`echo("Hello world")`に変えると、同じ試行が2.5秒->1秒に縮みます。
[^6]: 手元にあったThinkPadで試すと、同じソースでも3.5秒->1秒でした。こう考えるとさほど変わらないように感じなくもない？