こんにちは、虎の穴ラボ Advent Calendar 2021 - Qiita 2日目の記事です。
初日は松尾さんによる「多様化するエンジニアのアウトプット方法 ~ブログだけに縛られるのはもったいないというブログ~」でした。
3日目は古賀さんが「Tailwind CSS 3.0 alpha1〜2の注目の新機能をご紹介!」のタイトルで記事を書かれる予定です。
はじめに
みなさんはRailsでの開発時に、普段どのようなデバッグを行っていますか?
私はソースコードにpryを仕込むのですが、現在アルファ版のMetaworkが便利そうだったので紹介します。
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のどちらかで認証を行ってください。
認証を終えるとこのような画面が出てきます。
左側のパネルが起点となるメソッドとそこで呼ばれているメソッド、右側のパネルが選択中のメソッドの内容となります。
右側のパネルの大半はコメントですが、読み進めていくとメソッドの最後(endの右)でIntegerの42という値が返されるのを確認できます。
answer_to_everything
が42というのは鉄板ネタですね。
Rubyは最後に実行した結果を返すので、answer_to_everything
に代入されているfoo
をクリックしてみましょう。
するとfoo
の中身が展開され、同時に左パネルもfoo
から呼び出されるメソッドに切り替わりました。
平文でない箇所はマウスオーバーで情報が表示され、クリックでの詳細表示も可能です。
下線が引かれている場合、クリックで先ほどのfoo と同様に処理の内容が展開されます。
それでは最初に出てくるPerson.new("Neo", "Hacker")
を見てみましょう。
Person.new()
でPerson#initialize
が呼ばれており、マウスオーバーでname
とoccupation
が渡ってきていることが確認できます。
このように、実行された際に受け渡しされる値を容易に確認できるのが強みでしょうか。
続いてPerson#initialize
を閉じ、次のtraveler.hacker?
の部分をマウスオーバーしてみましょう。
中身を開くことなく、ここでtrue
が返ることを確認できました。
どこを通過するか分かりやすくて良いですね。
traveler.hacker?
をクリックすると、実態はPerson#hacker?
であることがわかり、そこでのself
の内容もマウスオーバーで確認できます。
チュートリアルをやってみて
@occupation
はHacker
であり、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へアクセス
ここで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のリンクになっています。
アクセスするとこの通り、チュートリアル同様の内容が表示されます。
ページを更新すると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
が呼ばれていることが確認できました。
New Message押下で新規作成画面に遷移した場合も特に変わった箇所はありません。
値を入力しCreate Messageを押下すると、「保存処理」と「保存後にリダイレクトされた詳細ページ」で二つキャプチャが作られました(∆: Recorded XXX
の箇所)。
確認の際は個別のURLを叩いても構いませんが、ページ上部のExploreからも追うことができます。
時系列順に並んでおり、どこにアクセスしたか表示されるので直感的にわかりやすいですね。
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