虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

MetaworkでRails開発のデバッグをしてみよう!

こんにちは、虎の穴ラボ Advent Calendar 2021 - Qiita 2日目の記事です。

初日は松尾さんによる「多様化するエンジニアのアウトプット方法 ~ブログだけに縛られるのはもったいないというブログ~」でした。

3日目は古賀さんが「Tailwind CSS 3.0 alpha1〜2の注目の新機能をご紹介!」のタイトルで記事を書かれる予定です。

はじめに

みなさんはRailsでの開発時に、普段どのようなデバッグを行っていますか?

私はソースコードにpryを仕込むのですが、現在アルファ版のMetaworkが便利そうだったので紹介します。

Metaworkとは

f:id:toranoana-lab:20211126125125p:plain
Metaworkの実際の画面

Metaworkはバックグラウンドに常駐して処理をキャプチャし、その内容を後から確認できるツールです。

現在RubyとNode.jsに対応しており、将来的にはPython、PHP、Java、Rust、Goにも対応するそうです。

注意点としてアルファ版であるため、思わぬ不具合が潜んでいるかもしれません。

また、今のところrbenv、RVM、nvm、nodistなどのバージョン管理システムには対応していません。

一般公開(GA)版ではメジャーなバージョン管理システムに対応予定とのことで、今から期待しています。

Metaworkの概要
  • 常駐し実行された処理をキャプチャ

  • キャプチャされた内容をブラウザで確認できる

  • 現在アルファ版である(プロダクション環境などでのご利用はお控えください…)

  • アルファ版の利用は無料

  • LinuxとMacOSに対応(WSLは現状積極的にはサポートされていないものの、こちらで利用可能)

Ruby版Metaworkを試す

まずはインストールし、チュートリアルを確認しましょう。

Metawork CLIをインストール

$ eval "$(curl -fsSL get.metawork.com)"

Ruby用のランタイムをインストール

$ mw install ruby

Rubyの確認

$ ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-darwin20]

3.0.2とかなり新しめです(執筆時点での最新は2021/11/24リリースの3.0.3)。

どこのRubyを見ているのか

$ which ruby
/Users/XXXXXXX/.metawork/runtimes/ruby/bin/ruby

あくまでMetaworkが指定するrubyです。

GA版ではメジャーなバージョン管理ツールに対応する予定ですが、アルファ版では非対応です(詳細はこちら)。

アルファ版で競合した場合は、バージョン管理ツールをアンインストールしてください。

Metaworkのアンインストール

$ mw implode

先にMetaworkのアンインストール方法を記述しておきます。

キャプチャしたデータなども一緒に消えてしまいますが、構わない場合はyesを選択しましょう。

ここでアンインストールした場合、以降のチュートリアルを実行するためにMetawork CLIを再度インストールしてください。

チュートリアルスクリプトの実行

$ ruby "$METAWORK_HOME/learn/ruby.rb"

上記の実行でこのような文字が出力されます。

🎉 Run `mw open last` and enjoy the magic

このmw open lastを実行するとブラウザが立ち上がり、いよいよMetaworkとのご対面です。

初めて利用する際はGoogleかGitHubのどちらかで認証を行ってください。

認証を終えるとこのような画面が出てきます。

f:id:toranoana-lab:20211126134336p:plain
起動時の画面

左側のパネルが起点となるメソッドとそこで呼ばれているメソッド、右側のパネルが選択中のメソッドの内容となります。

右側のパネルの大半はコメントですが、読み進めていくとメソッドの最後(endの右)でIntegerの42という値が返されるのを確認できます。

answer_to_everythingが42というのは鉄板ネタですね。

f:id:toranoana-lab:20211126134609p:plain
メソッドが返す値

Rubyは最後に実行した結果を返すので、answer_to_everythingに代入されているfooをクリックしてみましょう。

するとfooの中身が展開され、同時に左パネルもfooから呼び出されるメソッドに切り替わりました。

f:id:toranoana-lab:20211126135650p:plain
fooの中身

平文でない箇所はマウスオーバーで情報が表示され、クリックでの詳細表示も可能です。

下線が引かれている場合、クリックで先ほどのfoo と同様に処理の内容が展開されます。

それでは最初に出てくるPerson.new("Neo", "Hacker")を見てみましょう。

f:id:toranoana-lab:20211126141433p:plain
Person.new("Neo", "Hacker")とは…

Person.new()Person#initializeが呼ばれており、マウスオーバーでnameoccupationが渡ってきていることが確認できます。

このように、実行された際に受け渡しされる値を容易に確認できるのが強みでしょうか。

続いてPerson#initializeを閉じ、次のtraveler.hacker?の部分をマウスオーバーしてみましょう。

f:id:toranoana-lab:20211126143316p:plain
traveler.hacker?でマウスオーバー

中身を開くことなく、ここでtrueが返ることを確認できました。

どこを通過するか分かりやすくて良いですね。

traveler.hacker?をクリックすると、実態はPerson#hacker?であることがわかり、そこでのselfの内容もマウスオーバーで確認できます。

f:id:toranoana-lab:20211126143951p:plain
traveler.hacker?とは

チュートリアルをやってみて

@occupationHackerであり、self.occupation == "Hacker"は真であり、このメソッドはtrueを返す。

これら一連の流れをpryで確認する場合、まず止めたい箇所へbinding.pryなどを仕込む作業が必要になります。

pryの場合は、止めたその場で処理を実行し試せるのが強みです。

一方でレガシーシステムの調査など、「全体の流れを把握したい」場合にMetaworkは有効だろうと感じました。

Metaworkでアタリをつけ、pryを仕込み不具合を潰すといった併用も良いかもしれません。

チュートリアルの続きは実際に処理を追ってみてください。

チュートリアルのスクリプト自体はcat $METAWORK_HOME/learn/ruby.rbなどで見ることができます。

次は実際にRailsで使ってみます。

Railsで実行してみる

Metaworkの検証が目的であり、環境も検証用なのでそのままインストールしてしまいます。

Railsのインストール

$ gem install rails

yarnなど必要なものがあれば別途インストールしてください(ここでは割愛します)。

バージョンの確認

$ rails -v
Rails 6.1.4.1

アプリケーションの作成と起動

$ rails new proving_ground
$ cd proving_ground
$ bin/rails s

localhost:3000へアクセス

f:id:toranoana-lab:20211126152541p:plain
Yay!

ここでrails serverが実行されているコンソールを見てみましょう。

最後に見慣れない1行が追加されているのがお分かりでしょうか。

Started GET "/" for ::1 at 2021-11-26 15:26:33 +0900
   (3.9ms)  SELECT sqlite_version(*)
Processing by Rails::WelcomeController#index as HTML
  Rendering /Users/XXXXXX/.metawork/runtimes/ruby-3.0.2/lib/ruby/gems/3.0.0/gems/railties-6.1.4.1/lib/rails/templates/rails/welcome/index.html.erb
  Rendered /Users/XXXXXX/.metawork/runtimes/ruby-3.0.2/lib/ruby/gems/3.0.0/gems/railties-6.1.4.1/lib/rails/templates/rails/welcome/index.html.erb (Duration: 13.7ms | Allocations: 507)
Completed 200 OK in 39ms (Views: 21.6ms | ActiveRecord: 0.0ms | Allocations: 3798)


∆: Recorded rails/welcome#index: http://localhost:9160/explore/recordings/GaEEof97eGy

このhttp://localhost:9160/explore/recordings/GaEEof97eGyがMetaworkのリンクになっています。

アクセスするとこの通り、チュートリアル同様の内容が表示されます。

f:id:toranoana-lab:20211126153143p:plain
Railsでlocalhost:3000へアクセスした内容

ページを更新するとURLの最後の文字列が変わりました。

∆: Recorded rails/welcome#index: http://localhost:9160/explore/recordings/GaEFogCNeJV

どうやらリクエスト単位でキャプチャされているようです。

余談ですが、コマンドラインでmw open GaEFogCNeJVを実行してもキャプチャを開くことができました。

もう少し複雑な処理の確認

ここではscaffoldを使いメッセージ機能を作ってみます。

$ bin/rails g scaffold message title:string body:text 
$ bin/rails db:migrate
$ bin/rails s

localhost:3000/messagesへアクセスすると、MessagesController#indexの後にAbstractController::Rendering#renderが呼ばれていることが確認できました。

f:id:toranoana-lab:20211126163029p:plain
messages

New Message押下で新規作成画面に遷移した場合も特に変わった箇所はありません。

f:id:toranoana-lab:20211126165955p:plain
新規作成

f:id:toranoana-lab:20211126163257p:plain
messages/new

値を入力しCreate Messageを押下すると、「保存処理」と「保存後にリダイレクトされた詳細ページ」で二つキャプチャが作られました(∆: Recorded XXXの箇所)。

f:id:toranoana-lab:20211126164041p:plain
メッセージ作成

確認の際は個別のURLを叩いても構いませんが、ページ上部のExploreからも追うことができます。

時系列順に並んでおり、どこにアクセスしたか表示されるので直感的にわかりやすいですね。

f:id:toranoana-lab:20211126165008p:plain
キャプチャリスト

Metaworkを試してみて

Metaworkを触った印象としては「なくても構わないが、あれば普段の開発を楽にしてくれるようなツール」でした。

一方で「対象の言語(今回はRuby)を学習し始めた人」または「テストが少なくドキュメントもないレガシーシステムを改修しなければならない人」にとっては大変便利だとも感じました。

アルファ版であるため、まだ業務での利用はお勧めしませが、Metaworkの今後の発展を期待しつつ、この辺りで締めさせていただきます。

明日の担当は古賀さんです。 Tailwind CSS 3.0 alpha1〜2の注目の新機能を紹介してくださるとのことで、私も今から楽しみです!

P.S.

採用情報

■募集職種
yumenosora.co.jp

カジュアル面談も随時開催中です

■お申し込みはこちら!
news.toranoana.jp

■ToraLab.fmスタートしました!

メンバーによるPodcastを配信中!
是非スキマ時間に聞いて頂けると嬉しいです。
anchor.fm

■Twitterもフォローしてくださいね!

ツイッターでも随時情報発信をしています
twitter.com