ESM Advent Calendar 2024の4日目の記事です。
こんにちは、構文解析器研究部員のS.H.です。
皆さんご存じかもしれませんが、最近RubyのデフォルトのパーサーとしてPrismが導入されましたね。
デフォルトのパーサーが変更されたことにより、RailsなどのWebアプリケーションで影響が出るのかなどが気になりました。 そこでそこそこ大きいWebアプリケーションであるMastodonで利用できないかを試してみた記事になります。
環境
最新のMastodonのバージョンであるv4.3.1で試しました。
MastodonではDev Containerで開発ができるように環境が整備されています そのためVS CodeからMastodonのソースコードを開き、Dev Containerを使ってMastodonを動かすことにしました。
またRubyのバージョンとしてはPrismがデフォルトのパーサーになっている3.4.0-preview2を使用しました。
ソースコードのcloneと最新バージョンへの切り替え
まずはMastodonのソースコードをcloneします。
git clone git@github.com:mastodon/mastodon.git
次に、リポジトリへ移動し、最新のリリースタグであるv4.3.1に切り替えます。
cd mastodon git switch -d v4.3.1
VS Codeでディレクトリを開く
VS Codeでディレクトリを開くと以下のようにと確認ダイアログがでるので「コンテナーで再度開く」を押します。
その後、ローカル環境かGitHub Codespacesでコンテナを開くかを確認されます。
今回はローカル環境で動かしたいので「Mastodon on local machine」を選択します。 選択後、Dev Containerのセットアップが実行されます。
Ruby 3.4.0-preview2のインストールとbundle install
Mastodon ではDev Container用のコンテナは以下のイメージを利用しています。
このイメージではrvmを使っており、そちらで利用するRubyのバージョンを切り替えることができます。
rvm経由でRuby 3.4.0-preview2をインストールし、それを使うように変更します。
rvm install 3.4.0-preview2 rvm use 3.4.0-preview2
念のためRubyのバージョンが切り変わっているかを確認しましょう。
ruby -v # => ruby 3.4.0preview2 (2024-10-07 master 32c733f57b) +PRISM [x86_64-linux]
最後にbundle installで必要なgemをインストールします。
bundle install
Mastodonのアカウントの作成
次に、動作確認用のMastodonのアカウントを作成します。 アカウント名とメールアドレスを指定して、アカウントの作成を行います。
bin/tootctl account create <アカウント名> --email=<メールアドレス> --confirmed --role=Owner
コマンドでアカウント作成が完了した後以下のように初期パスワードが発行されますので、そちらをメモしておいてください。
New password: <パスワード>
最後に、作成したアカウントを承認します。 Mastodonではスパム対策として作成されたばかりのアカウントにはできることが制限されています。 管理者が承認しない場合は制限されたままで、タイムラインへの投稿などはできないのでここでアカウントの承認を行います。
bin/tootctl account modify <アカウント名> --approve
Mastodonを動かす
最後にMastodonをDev Container内で動かします。 開発環境向けにbin/devコマンドが提供されているのでそちらを実行します。
bin/dev
コマンド実行後、localhost:3000にアクセスすると以下のようにMastodonの画面が表示されます。
ログイン画面からメールアドレスとパスワードを入力してログインします。
ログイン後、以下の画面にリダイレクトされます。
最後に、画面左側の投稿フォームからつぶやきを投稿できればOKです。
まとめ
Prismがデフォルトのパーサーになったことで実際のWebアプリケーションで利用できるのかを確認してみました。 無事、ローカル環境では動作することが確認できました。
ただMastodonの場合はActivityPubでの投稿の配送や外部のサーバのアカウントのフォローなど外部連携が必要な部分も多くあります。 そのため実際にサーバを建ててみて、問題ないかをテストするほうがより確実かもしれません。
実際のRailsなどのWebアプリケーションで確認する場合は本番環境同等のステージング環境などを用意し、そこで動作確認も行うと安心できそうです。
余談1
僕が管理しているMastodonサーバではRubyのmasterブランチをビルドして動かしています。 その関係で一時的にPrismをデフォルトのパーサーとして動かしていた時期があり、問題なく動くこと自体は検証できていたりします。
余談2
現状ではMastodon自体は動きますが、まだRSpecでのテストは動かなかったりします。
root ➜ /workspaces/mastodon (9adb96f3a) $ RAILS_ENV=test bin/rspec /usr/local/rvm/gems/ruby-3.4.0-preview2/gems/activesupport-7.1.4.1/lib/active_support/core_ext/benchmark.rb:3: warning: /usr/local/rvm/rubies/ruby-3.4.0-preview2/lib/ruby/3.4.0+0/benchmark.rb was loaded from the standard library, but will no longer be part of the default gems starting from Ruby 3.5.0. You can add benchmark to your Gemfile or gemspec to silence this warning. ruby: prism/util/pm_newline_list.c:93: pm_newline_list_line_column: Assertion `cursor >= list->start' failed. Aborted (core dumped)
ちなみにRubyのmasterブランチだと修正されているのかテストが動くようになっていたりします。
参考
永和システムマネジメントでは、Ruby とアジャイルソフトウェア開発と構文解析器の研究を通じてコミュニティと成長したいエンジニアを絶賛募集しています。