あひるの勉強部屋

つらつらつら~と不定期にカキコするブログ

久々にmikutter install battleした話

Apple SiliconのMacBook Airを買いました。

???「買うとどうなる」
あひる「知らんのか。mikutterInstallBattleが始まる。」

というわけで?mikutterInstallBattleをやっていきしたので記録です。
とはいえ久々なので、まずは過去の誰かの記録を見て思い出すことから。

mikutterinstallbattle [検索]

GitHub - Na0ki/mikutterInstallBattle: mikutterInstallBattle の覚書

はい、パーソナライズのせいな気もしますが私のGitHubリポジトリが出てきました。
過去の私えらい。

ざっと見て思い出したような出さないような。
とりあえず今回の目標は起動するところまでとします。
日本語入力?nanisore oishiino?

バトル環境

名称 バージョン
ハード MacBook Air M2 2022
OS Sonoma (14.2.1)
ruby 3.3.0
mikutter eadafa50 (2024/02/24時点の最新のmaster)

バトル開始

リポジトリのクローン

なぜか既にされていた。mikutterユーザーは新しいマシンを買ったら無意識のうちにmikutterをgit cloneしてしまうものだし仕方がないね。

依存のインストール

以前から必要な依存が変わってるかもしれないので、一旦homebrewでは色々と入れずbundleを走らせてみます。
他の環境構築の過程で必要な依存入れてたらごめんって感じ。

$ bundle
  1. gobject-introspection

     An error occurred while installing gobject-introspection (4.1.7), and Bundler cannot continue.
    
     In Gemfile:
       gtk3 was resolved to 4.1.7, which depends on
         gdk3 was resolved to 4.1.7, which depends on
           gdk_pixbuf2 was resolved to 4.1.7, which depends on
             gio2 was resolved to 4.1.7, which depends on
               gobject-introspection
    

    怒られたので追加

     $ brew install gobject-introspection
    
  2. pango

     An error occurred while installing pango (4.1.7), and Bundler cannot continue.
    
     In Gemfile:
       gtk3 was resolved to 4.1.7, which depends on
         gdk3 was resolved to 4.1.7, which depends on
           pango
    

    怒られたので追加

     $ brew install pango
    

これで完走しました。(たしか)
なんだか拍子抜け。

起動

いざ起動

bundle exec ruby mikutter.rb --debug

ruby 3.3.0 環境で実行しているせいか、依存gemでstandard libraryからロードしてるやつがdefault gemになるからGemfileとかに書いとけよってwarningがちょいちょい出てるっぽい(チケットにしろそれはそう)

warning: observer was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.4.0. Add observer to your Gemfile or gemspec.
warning: mutex_m was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.4.0. Add mutex_m to your Gemfile or gemspec. Also contact author of httpclient-2.8.3 to add mutex_m into its gemspec.

途中再現性のないゴタつきはあったものの、起動自体はできてしまいました。
詰まるところがなさすぎでは?

mastodonアカウント追加

流石に起動して終わりは終わってるのでmastodonのアカウントでも追加しようと思います。
私は social.mikutter.hachune.net にいるので、アカウント追加からmikutterを選んで連携すれば終わりです。

ここでOpenSSL 3.0の問題を引きました。
今mikutterで一番ホットかもしれない気がしなくもない話題です。知らんけど。

(mikutter.rb:17126): Gtk-WARNING **: 20:48:38.827: Couldn't export handle, unsupported windowing system
notice: {MIKUTTER_DIR}/core/serialthread.rb:48:in `force_exit!': all Serial Thread Group jobs canceled.
notice: mikutter.rb:91:in `boot!': raise mainloop exception `OpenSSL::Cipher::CipherError'
notice: mikutter.rb:96:in `error_handling!': catch OpenSSL::Cipher::CipherError
/Users/ahiru/ghq/mikutter/mikutter/plugin/world/keep.rb:125:in `initialize': unsupported (Global default library context, Algorithm (BF-ECB : 0), Properties ()) (OpenSSL::Cipher::CipherError)
        from /Users/ahiru/ghq/mikutter/mikutter/plugin/world/keep.rb:125:in `new'
        from /Users/ahiru/ghq/mikutter/mikutter/plugin/world/keep.rb:125:in `encrypt'
        from /Users/ahiru/ghq/mikutter/mikutter/plugin/world/keep.rb:120:in `block in account_write'
        from /Users/ahiru/ghq/mikutter/mikutter/plugin/world/keep.rb:119:in `open'
        from /Users/ahiru/ghq/mikutter/mikutter/plugin/world/keep.rb:119:in `account_write'
        from /Users/ahiru/ghq/mikutter/mikutter/plugin/world/keep.rb:75:in `block in account_register'
        from /Users/ahiru/ghq/mikutter/mikutter/plugin/world/keep.rb:73:in `synchronize'
        from /Users/ahiru/ghq/mikutter/mikutter/plugin/world/keep.rb:73:in `account_register'
        from /Users/ahiru/ghq/mikutter/mikutter/plugin/world/world.rb:84:in `block (3 levels) in <top (required)>'
        from /Users/ahiru/ghq/mikutter/mikutter/vendor/bundle/ruby/3.3.0/gems/pluggaloid-1.7.0/lib/pluggaloid/listener.rb:25:in `call'
        from /Users/ahiru/ghq/mikutter/mikutter/vendor/bundle/ruby/3.3.0/gems/pluggaloid-1.7.0/lib/pluggaloid/event.rb:241:in `block (2 levels) in call_all_listeners'
        from /Users/ahiru/ghq/mikutter/mikutter/vendor/bundle/ruby/3.3.0/gems/pluggaloid-1.7.0/lib/pluggaloid/event.rb:240:in `each'
        from /Users/ahiru/ghq/mikutter/mikutter/vendor/bundle/ruby/3.3.0/gems/pluggaloid-1.7.0/lib/pluggaloid/event.rb:240:in `block in call_all_listeners'
        from /Users/ahiru/ghq/mikutter/mikutter/vendor/bundle/ruby/3.3.0/gems/pluggaloid-1.7.0/lib/pluggaloid/event.rb:239:in `catch'
        from /Users/ahiru/ghq/mikutter/mikutter/vendor/bundle/ruby/3.3.0/gems/pluggaloid-1.7.0/lib/pluggaloid/event.rb:239:in `call_all_listeners'
        from /Users/ahiru/ghq/mikutter/mikutter/vendor/bundle/ruby/3.3.0/gems/pluggaloid-1.7.0/lib/pluggaloid/event.rb:62:in `block in call'
        from /Users/ahiru/ghq/mikutter/mikutter/vendor/bundle/ruby/3.3.0/gems/delayer-1.2.1/lib/delayer/procedure.rb:26:in `run'
        from /Users/ahiru/ghq/mikutter/mikutter/vendor/bundle/ruby/3.3.0/gems/delayer-1.2.1/lib/delayer/extend.rb:126:in `run_once_without_pop_reserve'
        from /Users/ahiru/ghq/mikutter/mikutter/vendor/bundle/ruby/3.3.0/gems/delayer-1.2.1/lib/delayer/extend.rb:117:in `run_once'
        from /Users/ahiru/ghq/mikutter/mikutter/vendor/bundle/ruby/3.3.0/gems/delayer-1.2.1/lib/delayer.rb:38:in `method_missing'
        from /Users/ahiru/ghq/mikutter/mikutter/plugin/gtk3/mainloop.rb:23:in `block (2 levels) in mainloop'
        from <internal:kernel>:187:in `loop'
        from /Users/ahiru/ghq/mikutter/mikutter/plugin/gtk3/mainloop.rb:12:in `block in mainloop'
        from /Users/ahiru/ghq/mikutter/mikutter/plugin/gtk3/mainloop.rb:10:in `catch'
        from /Users/ahiru/ghq/mikutter/mikutter/plugin/gtk3/mainloop.rb:10:in `mainloop'
        from mikutter.rb:79:in `boot!'
        from mikutter.rb:115:in `<main>'

これは既にチケット化されており、以下で議論がされているっぽいです。
tsutsuii さんありがとう。

バグ #1585: OpenSSL 3.x 環境 (ubuntu 22.04 等) で mikutter が起動しない - mikutter - やること

私の環境はruby 3.3.0であり、これにバンドルされているopenssl gemのバージョンは3.2.0のため、レガシープロバイダをロードする方法が楽にできます。
というわけで、雑対応。(チケット内の対応をぶっ飛ばしてすんません)

diff --git a/plugin/world/keep.rb b/plugin/world/keep.rb
index c4ae7d3b..ea120a22 100644
--- a/plugin/world/keep.rb
+++ b/plugin/world/keep.rb
@@ -122,12 +122,14 @@ module Plugin::World
       account_data end
 
     def encrypt(str)
+      OpenSSL::Provider.load("legacy")
       cipher = OpenSSL::Cipher.new('bf-ecb').encrypt
       cipher.key_len = ACCOUNT_CRYPT_KEY_LEN
       cipher.key = key
       cipher.update(str) << cipher.final end
 
     def decrypt(binary_data)
+      OpenSSL::Provider.load("legacy")
       cipher = OpenSSL::Cipher.new('bf-ecb').decrypt
       cipher.key = key
       str = cipher.update(binary_data) << cipher.final

これでなんかアカウント追加できたし、再起動してもmastodonのアカウント読み込みできたし大丈夫なはず。

というわけで日本語が打てないmikutter環境が作れたので、これにてバトル終了です。
taisen arigatou gozaimashita. 39.39 :mikuslime:

丼のホストをメンテした話

こちらは smhn Advent Calendar 2023 7日目の記事です。

久々にsocial.mikutter.hachune.net(a.k.a smhn, s25t, mikutterサーバー)のホストのメンテナンスを行ったので記録です。

このところ環境の変化のダメージから丼自体の追従しかできておらず周辺のメンテナンスができていませんでした。(時期によっては丼の追従も怪しくて申し訳NASA
しかし 11/23 にサーバーの炎上記念 を開催してもらったのもあり、ここらで一つメンテをするかということで実施しました。(2boさんをはじめ、皆さんありがとうございました)

実施したメンテは大きく3つ

  • 炎上記念の記念品を使った厄払い
  • サーバー内部の掃除
  • 各種ソフトウェアのアップデート

炎上記念の記念品を使った厄払い

mikutterサーバーは神田明神のIT情報安全守護及び熱田神宮の災難除守のお守りによって守られています。
3年前の炎上障害から、原因の除去に加えて神頼みを追加してバフをかけている状態です。
炎上障害以降、燃えていないことから効果は明らかですね。

juyo.kandamyoujin.or.jp

今回は久々の物理メンテということもあって、更なるバフをかけたい気持ちがありました。
そこで炎上記念レースの記念品としていただいたゼッケンをメンテ前に掲げることでサーバーの業と競馬の業の対消滅を狙いました。

メンテ中にmacの充電器を足の小指に落とす重大インシデントが発生しましたが、バフをかけていたおかげでこの程度で済みました。
きっとこの儀式をしていなければサーバーは爆散していたことでしょう。知らんけど。

サーバー内部の掃除

1年以上掃除をせずに、ほぼ24/365で稼働していたため、それなりに埃が溜まっていました。
エアダスターと掃除機をフル活用し主要な箇所の埃を大まかに除くことはできたと思います。
当初想定より埃が溜まっていたため装備が足りず、完全に掃除しきることはできませんでしたが、残りは年末年始あたりに追加で行おうかと思っています。

特にCPUのヒートシンクの掃除が効いたのか、CPUの冷却効率が上昇しました。(ソフトウェアの更新により負荷が少し落ちたのでそれの影響もあるでしょうが)
ヒートシンクの隙間には埃が詰まりやすいので、定期的な掃除は必要ですね。

メンテ前後のCPU温度のグラフのスクリーンショット
メンテ前後のCPU温度のグラフ(期間は1w)

各種ソフトウェアのアップデート

OSやら各種ソフトウェアを更新しました。 更新前後を比較するとLoadAverageが有意に低下するなどしたので何やらパフォーマンスが向上してるっぽいです。

サボっていたdockerの更新も行ったことでようやくdockerのサブコマンドにcomposeが使えるようになりました。

他に更新後良かった点として、nvmeの温度がhwmonから取得できるようになっていたことです。
従来は nvme-cli の smart-log から取得していましたが、これの難点としてはroot権限を要求することでした。
それが最近のカーネルではhwmonから取得できるようになったのでそちらを参照する形に変更しました。
Linux 5.5 To Finally Expose NVMe Drive Temperatures Via HWMON - Phoronix

まとめ

事前にVPSにあるステージング環境で各種アップグレードを実施し手順の確認はしていましたが、物理サーバーの構成の違いによって何かしら起こる可能性はあったので若干ヒヤヒヤしつつも楽しめました。

次回は年末にできれば同様のメンテナンスを追加で行いたいと思っているので、その時はまたよろしくお願いします。

39.39 :mikuslime:

自分用Redmineのデータを吹っ飛ばした話

やらかした時は戒めも込めて記録してネタにして昇華するのが一番いいので記録です。

昨年あたりに引っ越しをする際にタスク管理のためにRedmineを利用していました。
引越しにあたり何をいつまでにするのか、何が終わっていて何をする必要があるのか。
そういったことをまとめていました。

引越しが終わってもうすぐ1年くらいということで、Redmineを建てておく必要もなくなってきたのでDBのバックアップ等をとってサーバーを退役させようと思いました。
いつかまた引越しをする際にリストアして確認できればいいだろくらいの感じです。

ちなみにRedmineはdocker composeで管理しており以下が設定の抜粋(一部改変済み)です。

db:
  image: postgres:14.2
  container_name: postgres_redmine
  volumes:
    - ./postgres/data:/var/lib/postgres/data
    - ./postgres/initdb:/docker-entrypoint-initdb.d
  restart: always
  environment:
    POSTGRES_ROOT_PASSWORD: xxxxx
    POSTGRES_DATABASE: xxxxx
    POSTGRES_USER: xxxxx
    POSTGRES_PASSWORD: xxxxx
    TZ: Asia/Tokyo

実はここに大きな罠があったんですね。

バックアップに伴いちょっと設定を変えて、compose down && upをしてバックアップを実行しローカル環境でリストアすると何かおかしいです。
今まで使っていたユーザーがいないし、DBの中身を見てもusersに自身のレコードがないしissuesテーブルも空です。
バックアップミスったかな〜と軽い気持ちで本番のWebUIにアクセスするとログインができなくなっている。
嫌な予感がしたので本番機のDBに入るとusersに自身のレコードがないし、issuesも空。。。

DB吹っ飛ばしたーーーーーーーーーーーーーー!!!!!!!!!!!!!!!!!!
ああああああああああああああああああああああ!!!!!!!!


直前まで動作していたことや、バックアップはごく普通の pg_dump を叩いただけということで残すところは compose down && up しかないんですが、ボリュームマウントしてるんですよね。
ってことでボリュームのディレクトリを見に行くと。。。

postgres# ls -lh data/
total 0

完全に宇宙猫ですね。

ここで先ほどのymlファイルを思い出しましょう。

volumes:
    - ./postgres/data:/var/lib/postgres/data
    - ./postgres/initdb:/docker-entrypoint-initdb.d

/var/lib/postgres/data ???
/var/lib/postgresql/data では????

あああああああああああああ!!!!!!!(2回目)

ホストのマウントディレクトリ名に引きずられて、マウント先のディレクトリ名を間違えていました。

感想

一応RedmineのWebUIでできるCSVエクスポートは事前にしておいたので、チケットの全てが消えたわけではないんですが、コメントで結構残してたところもあってその辺りが消えてしまいました。

コンテナでデータボリュームマウントした時は、本当に期待したディレクトリがマウントされているか確認しようと思いました。 また、このレベルなら事前にマウントディレクトリごとバックアップを事前に取ってもよかったかも。

yamlでこれを防げると一番いいんだけど、なんかあるんですかね? 久々に取り返しのつかないオペレーションをしてしまい、若干放心気味なので今日のところは肉でも買って焼いて回復に努めます。

吉祥寺の美味しいお店(smhnアドベントカレンダー)

smhn Advent Calendar 2022 20日目の記事(遅刻)
吉祥寺で開拓したお店で写真を発掘できたお店を紹介する。

書いてて意外と写真撮ってないなって気づいた。 写真がなくて載せてない店もちょいちょいあるので、機会があれば写真撮って追加で紹介したい。

武蔵野珈琲店

なんとなく吉祥寺で珈琲飲めるところないかなと探した時に美味しそうだったので入ってみたカフェ。 めちゃくちゃ美味しかった。(語彙力の喪失)

ネルドリップで淹れているらしく、オリジナルブレンドはマンデリンがブレンドされていて好みの苦み。 食器も良くて公式サイト曰く、大倉陶園、マイセン、ヘレンド、ウエッジウッドなどを取り揃えているらしい。 2回ほど行ったけど、今のところ2回とも大倉陶園のブルーローズだった。 回数重ねないと分からないけどメニューによって食器変えてたりするんかな?

店の中はかなり狭いけど、一人でも気にすることなく入ってコーヒーを楽しめるいいお店。 オリジナルブレンドとケーキ

Webサイト

武蔵野珈琲店

まめ蔵

家族にオススメされて行ってみたカレー屋。 写真は平日限定のきのこカレー。

まめ蔵という名前なのにまだ豆カレーをいただいてない…

辛いものが苦手な自分としてはかなりギリギリ(飲み物飲みながら休み休みなんとか)って感じの辛さ。 辛さの調整できるのかは確認してない。 美味しいのでオススメ。 まめ蔵の平日限定きのこカレー

Webサイト

まめ蔵(食べログ)

香港贊記茶餐廳

香港中華の楽しめるお店。 写真はワンタンメンとチャーシュー腸粉。

日本語以外の方がよく聞こえてくる感じでそれもまたいい。 ワンタンメンも美味しいけどチャーシュー腸粉が特に最高なので食べてほしい。

久々に食べようと昼時に行ったら行列ができてたので諦めた。(昼時と言いつつ14時過ぎくらいだった気がするけど) 時間外してリベンジしたい。 香港贊記茶餐廳のワンタンメン 香港贊記茶餐廳のチャーシュー腸粉

Webサイト

香港贊記茶餐廳(食べログ)

mikutterサーバー4.0.2アップデート備忘録

v3.5.3からv4.0.2に上げるにあたってアイコンリソースの配置が変わったり再生成が必要だったりしたので、その作業を将来の自分に向けて簡単に書き残しておきます。

まず4系に上げるにあたってアイコンリソースがめんどいみたいな話を @hota がしており、魔剤?と反応していたところ丁寧にも以下のリソース更新が必要だったと教えてくれました。
この辺は知ってて作業するのと、知らずに作業するのとではかかる時間も負担も段違いなのでめちゃくちゃ助かりました。 ありがとうございました。 github.com

アイコンリソース作成周りについては、ちょうどあひるアイコンをcanvasでいい感じにできる何かができないかとsvgを読み込んでpngにする部分だけ作ってあったので、それを流用してmikutterカラーに変更したsvgから必要なサイズを出力するスクリプトを書きました。
こういうのをよしなに生成してくれるサイトは色々あるのでそっち使った方が早いそれはそう。 命名とか諸々雑すぎるけど動くのでヨシとしました。 Base64に通すために削ってる箇所、 , でsplitでしてindex 1を見ればいいな…

mikutterサーバーの丼アイコン錬成するのに使ったやつ · GitHub

あとは生成したファイルで丼のリソースを上書きして終了です。

コンテナのビルドをGitHub Actionsに任せているんですが、今回の作業で非推奨なアクションが多数あったのでそれらの更新も合わせて行いました。 ちょうどその作業をしている際にGitHub Actionsの障害が発生してビルドができなくなりウンウン悩んで時間を無駄に溶かしました。

今回も無事立ち上がってよかったですね。

mastodonアップデートメモ

mastodonのv3.5.1への更新及びDBの更新をした。

手順としてはまず、下記のPRのPart1 - Part3を実施した。
[Docker-Compose] [Breaking] Postgres 9.6 is EOL (11th Nov 2021) - Migrate to 14 Stable by shleeable · Pull Request #16947 · mastodon/mastodon · GitHub

続いてPart4に書いてある通りリリースノートの手順を行った。
今回はv3.4.3からの更新だったため、v3.5.0のリリースノートにある更新手順を参考にした。
Release v3.5.0 · mastodon/mastodon · GitHub

最後は自身のmastodon手順メモにあるように、webとsidekiqをscaleしつつ起動してログを確認しつつ一通りの操作ができていることを確認して作業完了した。

gettext 3.4.1とruby 3.1.0での対応覚書

どんな問題が起きて、どう調べたか忘れてもいいようにメモ。

やったこと

ruby 3.1.0環境でmikutterを初めて起動してみたときに以下のエラーが発生した。

/home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/mo.rb:178:in `require': cannot load such file -- mathn (LoadError)
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/mo.rb:178:in `next_prime'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/mo.rb:217:in `save_to_stream'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/mo.rb:292:in `block in save_to_file'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/mo.rb:292:in `open'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/mo.rb:292:in `save_to_file'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/tools/msgfmt.rb:58:in `run'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/gettext-3.4.1/lib/gettext/tools/msgfmt.rb:38:in `run'
        from /home/ahiru/work/mikutter/mikutter/plugin/uitranslator/uitranslator.rb:37:in `block in spec='
        from /home/ahiru/work/mikutter/mikutter/plugin/uitranslator/uitranslator.rb:34:in `each'
        from /home/ahiru/work/mikutter/mikutter/plugin/uitranslator/uitranslator.rb:34:in `spec='
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:156:in `block (2 levels) in load'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/pluggaloid-1.7.0/lib/pluggaloid/plugin.rb:39:in `instance_eval'
        from /home/ahiru/work/mikutter/mikutter/vendor/bundle/ruby/3.1.0/gems/pluggaloid-1.7.0/lib/pluggaloid/plugin.rb:39:in `create'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:155:in `block in load'
        from /home/ahiru/work/mikutter/mikutter/core/utils.rb:288:in `block in atomic'
        from /home/ahiru/work/mikutter/mikutter/core/utils.rb:288:in `synchronize'
        from /home/ahiru/work/mikutter/mikutter/core/utils.rb:288:in `atomic'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:147:in `load'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:149:in `block (2 levels) in load'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:148:in `each'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:148:in `block in load'
        from /home/ahiru/work/mikutter/mikutter/core/utils.rb:288:in `block in atomic'
        from /home/ahiru/work/mikutter/mikutter/core/utils.rb:288:in `synchronize'
        from /home/ahiru/work/mikutter/mikutter/core/utils.rb:288:in `atomic'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:147:in `load'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:99:in `block in load_all'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:40:in `block in each_spec'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:35:in `each'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:35:in `each'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:38:in `each_spec'
        from /home/ahiru/work/mikutter/mikutter/core/miquire_plugin.rb:98:in `load_all'
        from /home/ahiru/work/mikutter/mikutter/core/boot/load_plugin.rb:14:in `<top (required)>'
        from mikutter.rb:55:in `require'
        from mikutter.rb:55:in `<main>'

mikutterのuitranslatorプラグインがgettextを使っている箇所で依存がないと怒っているらしい。 最初はあまりコードを追わずに mathn を依存に追加してみたが、最終的に prime を追加しないと動かなかった。(ここがすでにあやふや)
ここで一旦問題が発生している箇所のコードを読んだが、 mathn のロードはフォールバック処理だった。そもそも prime が呼び出せていないのがおかしい気がする。 他のmikutter開発者は特に言及していないのと依存しているgettextは直近で更新されていなかったので環境依存かrubyのバージョンかを疑い始めた。
この時shibafu528氏がruby 3.1.0で再現できたということでrubyのバージョン依存の問題ということで調査を進めることにした。(ありがとう shibafu528) ちなみにrubyを3.0.3にしたところ問題なく動作した。

ruby 3.0.3と3.1.0周りで何か起きているのかと調べたところ、以下のstackoverflowの質問がヒットした。

stackoverflow.com

エラーの内容的にもrubyのバージョン的にも同じであるため、かなり近づいた気がした。 Answerのリンクに下記が示されていた。

github.com

PRのタイトルに Add former default gems as a dependency for Ruby 3.1 compatibility とあるからして、どうやら予想のとおり 3.1.0 では何かしら変わったようだ。 PRのリンクを更に追うと RubyRedmineにたどり着いた。

bugs.ruby-lang.org

この時点でdefault gemとbundled gemについては知らなかったが、示されているリストに prime が入っているのでかなり答えに近づいていると思い読み進めた。
とはいえ読み進めるにあたりdefault gemとbundled gemについて大雑把でいいので知りたかったので以下のブログを参考にした。

zenn.dev

gemの種類の違いをざっと把握したところで、今までのリンクの情報をまとめたところ状況が理解できた。
3.1.0からはgettextの依存しているprimeがdefault gemからbundled gemになったため明示的に依存を宣言しないと使えないということだった。

ここでとりあえずmikutterのRedmineに問題の報告をした。

dev.mikutter.hachune.net

今にして思えば最初のエラー発生時にとりあえずチケットを切っておくべきだったと反省している。

そこから数日後にruby-gettextにissue報告をしたところ速攻で対応していただき、対応済みのgettext 3.4.2を出していただいた。

後は mikutter 側に新しい3.4.2を使うチケットを投げて終わり。(イマココ)

まとめ

gemの種類の違いについて知ることができたのと、最近mikutterに貢献できていなかったので貢献できたのがいい点。
課題として次はもっと早く報告をできるようにしたい。

追記

default gemやbundled gemについては Ruby Standard Gems を見ればいいっぽい。