11
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2023

Day 13

Elixir OSSハック①【Livebook①】:LiveViewフロントデバッグを使って易々とLivebookを改造

Last updated at Posted at 2023-12-14

この記事は、Elixir Advent Calendar 2023 シリーズ12 の13日目です


piacere です、ご覧いただいてありがとございます :bow:

今回は、下記を追体験いただく … つまり「OSSの改造をする」コラムです

昨年/今年のElixir界隈と、Elixir Advent Calendarを賑わす、高機能Web開発環境「Livebook」ですが、OSSなので、当然ソースコードは読める訳です

しかし、素晴らしいWeb上開発体験を提供しているからこそ、複雑そうに思われるコードを読む気は、なかなか高まらないですよね?

そこで、みんなでコードを眺めて、震えて、納涼するというイベントをLiveViewJP#21「Livebookコードを眺めてみんなで震えて納涼する会」で、今年9月に開催しました

ちな、私もマトモにLivebookコードを読んだことが無かったので、会が成立しない位、グダグダになったらゴメンナサイ … と予め謝った上で開催しました 😋

ですが結果的には、新たなLiveViewデバッグ機能も使い倒す、ステキなElixir printfデバッグ(正確にはIO.inspectだがw)のシェア会になりましたので、その一端をコラムでも共有します

あと、このコラムが、面白かったり、役に立ったら、image.png をお願いします :bow:

事前準備:Livebookのgit clone

Livebookのソースコードは、下記GitHubにあります

まず、これをgit cloneで落としてきます

$ git clone https://github.com/livebook-dev/livebook.git

VSCodeで開きます(別に他のエディタでもOKです)

$ cd livebook
$ code . -r

image.png

Livebookのファイル内訳

下記コマンドでLivebookコードのファイル数をカウントすると、880件(バージョンはLivebook 0.12.0-dev、2023/12/14現在)もあるようです(なお、mix desp.getを先にやると数が変わるので、その前に実施)

$ find -type f | grep -v "^./.git/" | grep -v "^./.github/" | wc -l
880

うち、Elixirコードであるlib配下は27%程度のようで、うち.exファイルが大半を占め、残りは.livemdと.jpegのようです

$ find -type f | grep "^./lib/" | wc -l
238

$ find -type f | grep "^./lib/" | grep ".ex$" | wc -l
226

$ find -type f | grep "^./lib/" | grep -v ".ex$"
./lib/livebook/notebook/learn/intro_to_vega_lite.livemd
./lib/livebook/notebook/learn/kino/custom_kinos.livemd
./lib/livebook/notebook/learn/kino/intro_to_kino.livemd
./lib/livebook/notebook/learn/kino/smart_cells.livemd
./lib/livebook/notebook/learn/kino/vm_introspection.livemd
./lib/livebook/notebook/learn/deploy_apps.livemd
./lib/livebook/notebook/learn/distributed_portals_with_elixir.livemd
./lib/livebook/notebook/learn/intro_to_maplibre.livemd
./lib/livebook/notebook/learn/intro_to_explorer.livemd
./lib/livebook/notebook/learn/intro_to_livebook.livemd
./lib/livebook/notebook/learn/files/portal-list.jpeg
./lib/livebook/notebook/learn/files/portal-drop.jpeg

その他のファイルは、下記の割合のようです

$ find -type f | grep "^./assets/" | wc -l
77
$ find -type f | grep "^./assets/" | grep ".js$" | wc -l
63
$ find -type f | grep "^./assets/" | grep -v ".js$"
./assets/package-lock.json
./assets/.babelrc
./assets/package.json
./assets/css/components.css
./assets/css/global.css
./assets/css/tooltips.css
./assets/css/notebook.css
./assets/css/editor.css
./assets/css/live_view.css
./assets/css/markdown.css
./assets/css/js_interop.css
./assets/css/app.css
./assets/css/utilities.css
./assets/css/ansi.css

Livebookを起動

下記コマンドでLivebookを起動します

$ mix deps.get
$ MIX_ENV=prod iex -S mix phx.server
…
==> livebook
Compiling 239 files (.ex)
Generated livebook app
[Livebook] Application running at http://localhost:8080/?token=pleguigyspnkwph5thoxi2ul3w5ywgix
Erlang/OTP 26 [erts-14.1.1] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

Interactive Elixir (1.15.7) - press Ctrl+C to exit (type h() ENTER for help)
iex(livebook_xxxxxxx)1>

上記の末尾の方に出てきたURLをブラウザで開きます
image.png

LiveViewフロントデバッグ機能でLivebookコードをブラウザ上から特定

いきなりコード実行画面(下記)から行くと、脱落しやすそうなので、手慣れをする意味でも、大して面白くない(笑)ホーム画面から始めてみましょう
image.png

LiveView 0.20から、LiveViewコードやLiveComponentsをフロントデバッグできる機能が入ったので、早速これを有効活用してみます

LiveViewJP#21「Livebookコードを眺めてみんなで震えて納涼する会」イベント開催当時は、LiveView 0.20がリリースされて3日後(!)だったので、LivebookにLiveView 0.20が梱包されておらず、自身で mix.exsdeps に追加する必要がありましたが、今ならLivebookに勝手に入ります

フロントデバッグの設定を、下記の通り、入れてみてください

config/config.exs
import Config

import_config "#{Mix.env()}.exs"
+
+config :phoenix_live_view, :debug_heex_annotations, true

Ctrl-Cを2回押した後、再度ビルドします(LivebookのURLが変わるのでブラウザに再度、入力し直します)

$ MIX_ENV=prod iex -S mix phx.server

ブラウザ上で、「RUNNING SESSIONS」で右クリックし、「検証」を選択すると、下部にブラウザのデバッガペインが表示され、HTMLコメントでLiveViewコードのファイル名と行番号が表示されるようになるのが、LiveView 0.20で入ったフロントデバッグです
image.png

実際に、該当ファイルとその行番号を見てみると、render関数の先頭行が特定できました … つまり、この部分はLiveComponentで構成されているということが分かります(まぁ、ファイル名からもお察しですがw)
image.png

試しに、「Running sessions」の文言を変えてみましょう
image.png

Livebookを起動したターミナルでiexが起動しているので、下記で再コンパイルし、ブラウザをリロードしてみましょう

iex> recompile

下図の通り、Livebookを改造することができました :tada:
image.png

試しに、右上の「New notebook」から幾つかセッションを追加してみましょう
image.png

すると、下図の通り、日本語メッセージでセッション数を表示してくれます
image.png

終わりに

複雑なOSSも、デバッグのテクニック次第で易々と改造していけることが伝わったでしょうか?

ポイントは、Livebookと言えど、所詮、「LiveViewアプリの1つ」に過ぎないので、LiveViewやLiveComponentsの構造を把握していればハックしていけるという、たったそれだけのことです

次回は、Livebookコードブロックの実行付近を攻略していきます

p.s.このコラムが、面白かったり、役に立ったら…

image.png にて、どうぞ応援よろしくお願いします :bow:

11
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?