Windows版 Livebook DesktopのTips

## 0.Prologue
先般、待ちに待った Windows向け Livebook Desktopアプリがリリースされました:sparkling_heart:
**Livebook**とは、あれですあれ。赤丸急上昇の **Elixir**のための Jupyterみたいなプログラミング&ドキュメント環境です。

**[インストール in just a minitue]**
そのインストールは至って簡単で、下記のサイトの下記のダウンロード・ボタンをポチってインストーラーをダウンロードし、実行するだけです。Erlangランタイムを含むまるまる一式の **Elixir/Livebook**実行環境がインストール先フォルダーにセットアップされ、即**Livebook**ライフをエンジョイできます:smile: そこのあなたも**今**からアルケミストの仲間入り♫
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14158/83ba7985-be87-93aa-01fb-a4f9da387cca.png)

## 1.Tips,Tips,Tips…
そんなお手軽でCoolな**Livebook Desktop**なのですが、まだ若いソフトウェアで巷に情報が少ないため、些細な「はてな(。´･ω･)?」に遭遇し試行錯誤することがあります。本稿では、小生が遭遇したそんな「はてな?」とその回避方法を2～3紹介したいと思います。

#### ■ ワーキング・フォルダは何処なの?
**Livebook**のnotebook上でデータを**Elixir**で加工していると、時々その加工済みデータをファイルに保存したくなる場合があります。ファイルの保存先を常に絶対PATHで指定すれば何ら不都合はありませんが、相対PATHで指定しようとすると……「今いるフォルダ(ワーキング・フォルダ)は何処なの?」と言う「はてな?」に遭遇します。

【回答】
ワーキング・フォルダの場所は、基本的にWindowsの標準の振る舞いに従います。Windows版 Livebook Desktopを起動する方法は二つあり、それぞれでワーキング・フォルダの場所は異なります。

一つは、WindowsエクスプローラーからLiveMarkdown("*.livemd")ファイルをクリックして関連アプリとして起動する方法で、この場合はLiveMakedownファイルが置かれているフォルダがワーキング・フォルダになります。

もう一つは、Windowsデスクトップに置かれたショートカット・アイコンをクリックする方法で、この場合はLivebook Desktopをインストールしたフォルダがワーキング・フォルダになります。尤もこの場所は、ショートカットのプロパティの「作業フォルダ」を書き換えることで好きな場所に変えることができます。

![Livebook起動.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14158/6fdcf003-6b3e-d93f-c3a3-f58f450b5fe9.jpeg)

さて、ここからがちょっとした落とし穴の話になります。Livebookのメイン・ページには、下図の様にフォルダ&LiveMarkdownファイルを選択して notebookをオープン出来る機能が用意されています。ところがこの操作では、ワーキング・フォルダは移動しないのです。起動時の場所がそのまま使用されます(Livebook Desktop v0.6.3)。それに気づかずにデータをファイルに保存すると…思わぬところにファイルが:sweat_smile:

と言う訳で、Livebook Desktopは Windowsエクスプローラーから LiveMarkdownファイルをクリックして起動するのが吉です:blush:

(注:アルケミストは File.cd!/1するかも知れないが:sweat_smile:)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14158/8927d43e-1979-eb97-8d75-c0172d585d2a.png)

----
#### ■ NIFs拡張モジュールが利用できない? (v0.6.3 - 2022/7/30現在)
Elixirのモジュールには、pure Elixirで記述されたモジュールの他に C++言語などで記述されたNIFs(Native Implemented Functions)拡張モジュールがあります。拙作のCImgモジュールなんかもNIFs拡張モジュールです。ところが、Windows Livebook Desktop(v0.6.3)で NIFs拡張モージュールを利用しようとすると、C++が"erl_nif.h"が見つからないぞとコンパイル・エラーしてしまい止まってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14158/667fbbc0-2736-3f97-ad8d-c3b11c9f0197.png)

【回答】
この不具合の原因は、Livebook Descktopインストーラーが行うべきセットアップ項目から `usr`フォルダのセットアップが抜けてしまっているための様です。

C/C++で書かれた NIFsのビルドでは"elixir_make"と言う Mix.Taskをよく利用します。このツールは、Erlang関係のＣヘッダーファイル&ライブラリの置き場所として `[Livebookイントール・フォルダ]/rel/usr`を期待しているのですが、そのフォルダが無いために NIFsのビルドが失敗してしまうのでした。

この不具合については、José Valimさんが issueとして取り上げてくれたので、近いうちに解決すると思います。 

https://github.com/livebook-dev/livebook/issues/1310

当面の間の応急処置は、WindowsにインストールしたElixir/Erlangのフォルダ(C:\Program Files\erl-24.0\usr\)から、`usr`フォルダを`[Livebookインストール・フォルダ/rel`の下にコピーすれば良さそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14158/12b38b66-44c5-6fa1-fd55-d773f53d68e6.png)

----
#### ■ どうしてVisual C++のビルドが止まってしまうの?
NIFs拡張モージュールで起こるかも知れないもう一つの「はてな?」です。たぶん日本語Windows限定だと思います。

NIFs拡張モージュールをビルドするC++コンパイラが Visual C++の場合、下図の様に :io.put_chars/2で「標準出力になにやら見知らぬ文字列(バイナリ)を出力しようとしているぞ」と怒られエラー停止してしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14158/94fe9d27-9dca-22e4-9134-91d91822222e.png)

【回答】
上のエラーログに吐き出された"何やら見知らぬ文字列"を調べてみると、

> <<46, 78, 69, 84, 32, 70, 114, 97, 109, 101, 119, 111, 114, 107, 32, 140, 252, 130, 175, 32, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 66, 117, 105, 108, 100, 32, 69, 110, 103, 105, 110, 101, 32, 131, 111, 129, ...>>

↓こんな文字列でした
> .NET Framework 向け Microsoft (R) Build Engine バ...

ここまで判れば、昭和世代の技術者にはピンと来ます:wink:
Visual C++が出力した上の文字列はShift JIS(CP932)です。一方、Elixirが扱える文字列はUTF-8(CP65001)です。そうコード・ページの不整合が発生していたのです。

対策は、下図の様に "Mix.install"の前に

> System.shell("chcp 65001")

の一行を追加すれば良さそうです。Visual C++等はコマンド・プロンプト(shell)のコード・ページに合わせてメッセージを出力するようになっています。それ故に、Livebookから起動されたコマンド・プロンプトのコード・ページを`chcp`で UTF-8(CP65001)に変えれば良いという理屈です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14158/24cfc391-45f0-aac7-6775-825b35794961.png)

## Epilogue
Windows版 Livebook Desktopを触り始めた当初は、上の様な「はてな?」で困ってしまいましたが、その回避策が分ってからはこれといった「はてな?」に遭遇していません。とても快適にLiveboohライフを過ごせています。

尤も、上の様な「はてな?」に遭遇するのは、小生の様にElixirで画像処理やエッジAIをやりたいからとNIFs拡張モジュールを自作する方ぐらいかも知れませんね:sweat_smile:

(Fin)