ESM アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

Mastodon meets Prism

ESM Advent Calendar 2024の4日目の記事です。

こんにちは、構文解析器研究部員のS.H.です。

皆さんご存じかもしれませんが、最近RubyのデフォルトのパーサーとしてPrismが導入されましたね。

bugs.ruby-lang.org

デフォルトのパーサーが変更されたことにより、RailsなどのWebアプリケーションで影響が出るのかなどが気になりました。 そこでそこそこ大きいWebアプリケーションであるMastodonで利用できないかを試してみた記事になります。

環境

最新のMastodonのバージョンであるv4.3.1で試しました。

MastodonではDev Containerで開発ができるように環境が整備されています そのためVS CodeからMastodonのソースコードを開き、Dev Containerを使ってMastodonを動かすことにしました。

github.com

また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用のコンテナは以下のイメージを利用しています。

github.com

このイメージでは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ブランチだと修正されているのかテストが動くようになっていたりします。

参考

github.com

docs.joinmastodon.org


永和システムマネジメントでは、Ruby とアジャイルソフトウェア開発と構文解析器の研究を通じてコミュニティと成長したいエンジニアを絶賛募集しています。

agile.esm.co.jp