0.Prologue
先般、待ちに待った Windows向け Livebook Desktopアプリがリリースされました
Livebookとは、あれですあれ。赤丸急上昇の Elixirのための Jupyterみたいなプログラミング&ドキュメント環境です。
[インストール in just a minitue]
そのインストールは至って簡単で、下記のサイトの下記のダウンロード・ボタンをポチってインストーラーをダウンロードし、実行するだけです。Erlangランタイムを含むまるまる一式の Elixir/Livebook実行環境がインストール先フォルダーにセットアップされ、即Livebookライフをエンジョイできます そこのあなたも今からアルケミストの仲間入り♫
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のメイン・ページには、下図の様にフォルダ&LiveMarkdownファイルを選択して notebookをオープン出来る機能が用意されています。ところがこの操作では、ワーキング・フォルダは移動しないのです。起動時の場所がそのまま使用されます(Livebook Desktop v0.6.3)。それに気づかずにデータをファイルに保存すると…思わぬところにファイルが
と言う訳で、Livebook Desktopは Windowsエクスプローラーから LiveMarkdownファイルをクリックして起動するのが吉です
(注:アルケミストは File.cd!/1するかも知れないが)
■ 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"が見つからないぞとコンパイル・エラーしてしまい止まってしまいます。
【回答】
この不具合の原因は、Livebook Descktopインストーラーが行うべきセットアップ項目から usr
フォルダのセットアップが抜けてしまっているための様です。
C/C++で書かれた NIFsのビルドでは"elixir_make"と言う Mix.Taskをよく利用します。このツールは、Erlang関係のCヘッダーファイル&ライブラリの置き場所として [Livebookイントール・フォルダ]/rel/usr
を期待しているのですが、そのフォルダが無いために NIFsのビルドが失敗してしまうのでした。
この不具合については、José Valimさんが issueとして取り上げてくれたので、近いうちに解決すると思います。
当面の間の応急処置は、WindowsにインストールしたElixir/Erlangのフォルダ(C:\Program Files\erl-24.0\usr)から、usr
フォルダを[Livebookインストール・フォルダ/rel
の下にコピーすれば良さそうです。
■ どうしてVisual C++のビルドが止まってしまうの?
NIFs拡張モージュールで起こるかも知れないもう一つの「はてな?」です。たぶん日本語Windows限定だと思います。
NIFs拡張モージュールをビルドするC++コンパイラが Visual C++の場合、下図の様に :io.put_chars/2で「標準出力になにやら見知らぬ文字列(バイナリ)を出力しようとしているぞ」と怒られエラー停止してしまいます。
【回答】
上のエラーログに吐き出された"何やら見知らぬ文字列"を調べてみると、
<<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 バ...
ここまで判れば、昭和世代の技術者にはピンと来ます
Visual C++が出力した上の文字列はShift JIS(CP932)です。一方、Elixirが扱える文字列はUTF-8(CP65001)です。そうコード・ページの不整合が発生していたのです。
対策は、下図の様に "Mix.install"の前に
System.shell("chcp 65001")
の一行を追加すれば良さそうです。Visual C++等はコマンド・プロンプト(shell)のコード・ページに合わせてメッセージを出力するようになっています。それ故に、Livebookから起動されたコマンド・プロンプトのコード・ページをchcp
で UTF-8(CP65001)に変えれば良いという理屈です。
Epilogue
Windows版 Livebook Desktopを触り始めた当初は、上の様な「はてな?」で困ってしまいましたが、その回避策が分ってからはこれといった「はてな?」に遭遇していません。とても快適にLiveboohライフを過ごせています。
尤も、上の様な「はてな?」に遭遇するのは、小生の様にElixirで画像処理やエッジAIをやりたいからとNIFs拡張モジュールを自作する方ぐらいかも知れませんね
(Fin)