| @技術/プログラミング

このブログを動かしている Ruby を 3.1 系から 3.2 系にアップデートした。

ネックになっていたのが tantiny で、オリジナル開発者の baygeldin 氏が自分でこの gem を使わなくなったようでメンテナンスされなくなっており、 fork してなんとか Ruby 3.1 対応までできていたが、 tantiny が依存する rutie が Ruby 3.2 以上に対応できておらず、にっちもさっちもいかなくて困っていた。

そんななかリポジトリを覗いてみると、 2025 年の 11 月に新しいメンテナーが見つかって Ruby 3.x に対応したバージョンがリリースされていた。

最新バージョンの 0.4.2 を入れてみたところ、 Ruby と Rust のブリッジは rutie ではなく magnus を使うようになっており、問題なく動くようになった。

tantiny の新しいメンテナーが現れているのを知らずに tantiny を捨てて MySQL の FULLTEXT インデックスで代替しようかと試みたが、検索精度が低いのとパフォーマンスも劣化してしまって途方に暮れていた。このブログに書いていることは自分の脳みその 30% くらいの領域を占めているので、精度が高く高速にレスポンスを返す全文検索が使えなくなってしまうとだいぶ困る。新しいメンテナーは会社のようなので tantiny はちゃんとメンテナンスされそうだ(元 Algoria のスタッフがやってる会社みたい)。ありがたや。

| @技術/プログラミング

このブログは Ruby 2.7 でずっと動かしていた。コミットログをたどると 2020 年の 1 月から Ruby 2.7 のようだ。 Ruby 2.7 は 2023 に EOL を迎えている。

さすがにまずいと思ったので Ruby 3 にしようと一日頑張ってみたが、なかなかうまくいかない。Ruby 3 の キーワード引数の仕様変更はかなり対応がきつい。どこで ArgumentError が起こっているのかが極めて追いかけづらい。他のメソッドに委譲している場合などは特に。

ガチャガチャやってトップページと個別記事ページまでは Ruby 3 化できたので Ruby 3 でデプロイしてみたが、動かない画面があることに気がついたので Ruby 2.7 に戻した。 Kaminari がちゃんと動かない(具体的には kaminari-sinatra と actionview v6 系の互換性がない)のが原因でページネーションするページがちゃんと動かなそうだったので Ruby 3 化は諦めた。 kaminari-sinatra の ActionViewTemplateProxy#initialize を actionview v6 対応させないと無理っぽい。

kaminari のような有名な gem の派生 gem ならきちんとメンテされてるかなーと思っていたが、 kaminari-sinatra の最終コミットは 4 年前だった。

Ruby で View まで作る人たちはほとんどいなくなってるのだろう。

なお動かないところのデバッグは ChatGPT と対話しながらやった。めっちゃ便利。一人だと気がつかないような部分のコードを見てみろと ChatGPT が言ってくれて、そこにデバッグコードを入れてみるとビンゴだったりする。便利な世の中になった。

忘れないようにやったこと・気づいたことをメモっておく。

  • sinatra は v4 にあげないといけないのでパスの正規表現から ^$ は消さないといけない
  • better_errors の REPL がちゃんと動かないので Backtrace を見たいときはログを開くか better_errors を使うのをやめる
  • fork していた sinatra-cache は sinatra 4 では動かないので外した(キャッシュできない部分をどうするかは要検討)
  • capistrano-puma も Ruby 3 対応させないといけない(期待される systemd のフォーマットが変わっているので単にデプロイするだけではだめで一部手作業が必要)
  • tilt は v2.1.0 に固定( Tilt::ErubisTemplate クラスが消えるため、 padrino-helper がエラーを出す)
  • concurrent-ruby は 1.3.5 未満に固定
  • compass は 1.0.3 に固定
  • SESSION_SECRET は 64 文字以上にする
  • haml の過剰な escape を抑制
  • kaminari-sinatra の ActionViewTemplateProxy#initialize を actionview v6.1.7.8ActionView::Base#initialize に対応させる