Money Forward Developers Blog

株式会社マネーフォワード公式開発者向けブログです。技術や開発手法、イベント登壇などを発信します。サービスに関するご質問は、各サービス窓口までご連絡ください。

20230215130734

Elixir の Livebook で Jupyter Notebook 風に開発をしよう!

こんにちは クラウド経費開発チームクラウド債務支払開発チーム の 宮村(みやむー) @miyamura.koyo です。

最近はプライベートで Elixir を使った開発をガッツリやっていて、実装知見も溜まってきた今日この頃です。

今回は Elixir の Livebook について紹介します。 livebook.dev

Livebook はインタラクティブな notebook ベースで Elixir コードを実行できる実行環境です。 Jupyter Notebook に近いですね。

インストール方法

Docker を使う方法を紹介します。以下のコマンド一発で環境が立ち上がります!

docker run --env LIVEBOOK_TOKEN_ENABLED=false -p 8080:8080 -p 8081:8081 --pull always ghcr.io/livebook-dev/livebook

http://localhost:8080/ にアクセスすると Livebook が起動しています!

Docker 以外の方法は公式ドキュメントを参考にしてみてください。なんとデスクトップアプリまであります!

livebook.dev

使ってみる

Elixir コードを書く

早速使ってみましょう。右上の New notebook をクリックします。

そうするとスマートセルが起動して Elixir コードを書くことができます!(しかもコード補完付き...!)

入力して左上の Evaluate をクリックする、もしくは command + Enter などのショートカットで式の評価がされます。

もちろん複数行の入力もできます。

Mix.install/2 を使うことでライブラリの動作確認だってできちゃいます!

Elixir コード以外を書く

Elixir コードを書く以外にも、右下の Smart をクリックすることで様々なセル(スマートセルと呼ばれます)が起動します。

いろいろあるのですが、なんと Neural Network task もあります...!

マシンパワーが必要ではありますが機械学習のモデルをロードして Livebook 上で簡単に機械学習できます!

Phoenix アプリケーションと接続する

ここまでは Livebook 単独で開発する方法をご紹介しました。

ここからは Phoenix (Rails のようなフルスタック Web フレームワーク)と連携する方法を紹介します!

これにより開発中の Web アプリケーションのコードをリアルタイムに notebook で実行することができてしまいます...!

Livebook と Phoenix アプリケーションを接続するにはいくつか手順が必要で有志の方が記事を書いてくれています。

zenn.dev

筆者が上記をベースに Phoenix + Livebook が同時に立ち上がる Dockerfile / docker-compose.yml を作っているので今回はこちらを使って紹介します。(パブリックに公開しているのでご自由にお使いください)

github.com

今回は上記リポジトリの mac_with_livebook ディレクトリで実行します。(お使いのマシンが Windows や Linux であれば non_mac_with_livebook を使ってみてください)

README に記載の手順で myapp という名前でアプリケーションを作成し起動します。

docker compose up -d

http://localhost:4000/ で Phoenix アプリケーションが起動します。

http://localhost:8080/ で Livebook も起動しています!

サイドバーの接続情報を見ると接続できていますね 👍

Phoenix アプリケーション上のモジュールを Livebook 側で操作して、その手順をローカルに保存する

テーブルを作成して Livebook 側で操作する

Phoenix アプリケーション側で users テーブルとそれを操作する Accounts モジュールを作成してみます。

$ docker compose exec web mix phx.gen.context Accounts User users name:string age:integer

$ docker compose exec web mix ecto.migrate
Compiling 2 files (.ex)
Generated my_app app

10:41:32.982 [info] == Running 20230830104110 MyApp.Repo.Migrations.CreateUsers.change/0 forward

10:41:33.087 [info] create table users

10:41:33.152 [info] == Migrated 20230830104110 in 0.0s

そうするとなんと Livebook でも作成されたモジュールが使えるようになっています!しかもなんと補完も効きます!

Phoenix アプリケーションで定義されたモジュールを利用してユーザーを作成することができました 👍

実行結果も見やすいですね!

DB にもちゃんとレコードが追加されています 👍

$ docker compose exec db psql my_app_dev -U postgres
psql (14.8)
Type "help" for help.

my_app_dev=# select * from users;
 id |  name  | age |     inserted_at     |     updated_at
----+--------+-----+---------------------+---------------------
  1 | miyamu |  28 | 2023-08-30 10:45:14 | 2023-08-30 10:45:14
(1 row)

保存して共有する

この Livebook 上の notebook は保存することもできます。

上記ファイルを保存するとホストマシンの livebook/users.livemd にファイルが保存されます!

マークダウンの拡張になっているのでこのままでも読みやすいですね。

これをリポジトリに保存しておくと、起動時にこのファイルをロードすることで他のマシンでも操作例を共有できます!新しく入ったメンバーのオンボーディングにも使えますね!

まとめ

Elixir には iex という対話的実行環境(Ruby でいう irb)があり、それでも十分便利なのですが、Livebook を用いることでより便利になります!

例えば実行内容をリポジトリで管理してチームメンバーに共有したり、リッチなビジュアライズを活かして開発を補助したり、AI・ML 系のタスクを行なってみたり。

分散技術に強みのある Elixir の特徴を活かしていて素敵ですね!

まだまだ出始めたばかりの技術で、先進的な機能もたくさんあったりアップデートも続いていたりするので、普段 Elixir 書かない方もぜひやってみてください。

Elixir コミュニティの方で入門記事もいくつか用意されており、Discord のチャンネルもあるので興味が湧いたらぜひコミュニティにもご参加ください!

elixir-lang.info


マネーフォワード福岡拠点では、いろんな言語や技術を楽しむエンジニアを募集しています!笑

ぜひジョインして社内勉強会などで知見を広めてみてください👍

hrmos.co

福岡開発拠点のサイトもあるのでぜひみてください!

fukuoka.moneyforward.com