あひるの勉強部屋

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

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 を見ればいいっぽい。

Ubuntu20.04でカーソルテーマの設定をした

mikutterをWSL2のUbuntu20.04環境で構築するにあたり、GTK3のテーマをAdwaitaにしてみたのでメモ。 既定の状態で /usr/share/icons/ 配下に Adwaitaディレクトリがあり、パッケージ的にも adwaita-icon-theme の3.36.1がインストール済みだった。 $HOME/.config/gtk-3.0/settings.ini に下記設定を追加し、テーマを適用してみた。

[Settings]
gtk-application-prefer-dark-theme = true
gtk-theme-name = Adwaita

ダークモードでmikutterが立ち上がったので満足していたが、リンクにカーソルをホバーした瞬間に以下のエラーで落ちる現象が発生した。

Gdk-Message: Unable to load hand2 from the cursor theme

どうやらホバーした際に使われるhand2というカーソルアイコンのアセットがロードできない落ちているらしい。 いろいろとググったところ このissue にたどり着き、コメントを参考にパッケージを追加することでカーソルテーマが追加され問題が解消した。

sudo apt install adwaita-icon-theme-full

パッケージインストール後に /usr/share/icons/Adwaita 配下にそれまでなかった cursors ディレクトリができて中にhand2があるのを確認した。

mikutterメモ20210921

参考にしたサイトと履歴を誤って飛ばしたので、見つけ次第追記する。。。

問題

gtk2 をgemでインストールする際に下記エラーが発生した。(抜粋)

rbgdkdisplay.c:450:22: error: implicit declaration of function 'gdk_x11_display_get_startup_notification_id' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    return CSTR2RVAL(gdk_x11_display_get_startup_notification_id(_SELF(self)));

環境

名称 バージョン
OS macOS 11.6
CPU Intel Core i9
mikutter コミットハッシュ: 3a36070a

対応

とりあえずビルドを成功させたいため implicit-function-declaration をフラグで無視することにした。

gemコマンドによる確認

下記コマンドを実行して、ビルドが通ることを確認した。

gem install gtk2 -v '3.4.3' --source 'https://rubygems.org/' -- --with-cflags="-Wno-error=implicit-function-declaration"

bundlerによる確認

gemでのビルドを確認できたので、bundlerについても下記コマンドを実行して確認した。

bundle config --local build.gtk2 --with-cflags=\"-Wno-error=implicit-function-declaration\"

これによりプロジェクトディレクトリの .bundle/config ファイルに下記設定が追記された。

diff --git a/config b/config
index 2369228..445a81b 100644
--- a/config
+++ b/config
@@ -1,2 +1,3 @@
 ---
 BUNDLE_PATH: "vendor/bundle"
+BUNDLE_BUILD__GTK2: "--with-cflags=\"-Wno-error=implicit-function-declaration\""

ctfmon.exeの再起動

IMEで日本語と英語入力の切り替えができない状態になったので調べた。
実行環境は管理者として実行した powershell 7.1.3。

taskkill /im ctfmon.exe && ctfmon.exe

参考

macOSのMicrosoft Remote Desktopアプリでエラーが発生した

スクショを忘れたが Error code: 0x204 が出てリモートのWindowsにアクセスできない問題が発生した。
なお、同一ネットワークにおいて別のWindowsマシンから対象のリモートマシンにはリモートデスクトップ接続ができている。
ちなみに数ヶ月前には同一ネットワークにおいて今回問題が起きたマシンからリモートデスクトップができていた。

対応としてはMicrosoft Remote Desktopアプリを ctrl+q で終了した上で /Users/{USERNAME}/Library/Group Containers/UBF8T346G9.com.microsoft.rdc を削除する。

以下のQAを元に行った

www.reddit.com

debian busterのstableにおけるiostatの異常値

debian busterのstableを運用しているマシンで iostat における %util についてNVMe SSDの場合のみ異常に数値が高かったのでとりあえず調査した。 特に原因の特定とかまではできておらず、雑に調べた内容を適当にメモしておくだけ。

現象

最初に書いた通り iostat%util の値が NVMe SSD に対してのみ高い。(2台のマシン、合計3つのメーカーが異なるNVMe SSDで再現を確認)
型番メモるのめんどいのでやる気が出たら追記する。
ちなみにHDDは特に異常に見える値は出ていなかった。

問題が発覚したマシンの iostat の結果が以下の通り。

Device            r/s     w/s     rMB/s     wMB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
nvme0n1         21.29   33.76      0.27      1.11     1.09     3.00   4.88   8.15    0.73    0.27   0.87    13.13    33.81  15.38  84.65
sda              7.00    3.64      0.99      0.21     0.00     1.34   0.04  26.91    2.43   10.41   0.05   145.53    57.86   1.58   1.68

nvme0n1%util がやたら高い数値になっている。

調査内容

Debian の stable と testing の最新を使って差異を確認した。
ちなみにいずれもクリーンインストールした状態で行った。

調査環境

- -
マシン Lenovo E495 Ryzen5 3500U
ディスク WD BLUE SN550
OS Debian Buster (4.19.0-10), Debian Bullseye (5.7.0-2)

調査途中結果

二つのカーネルで大きな差が出た。
iostat に関してはバージョンの違いにより項目が変わっていたりするが %util を比較すると 4.19 の高さが際立つ。
/proc/diskstats の差も見ると time spent doing I/Os (ms)weighted time spent doing I/Os (ms) の値が大きく違うことが分かる。
いずれのdiskstatsの値も起動後10分程度で取得した値である。
10分のうち7分以上もI/Oに費やされているとは思えない。

これらはカーネルの更新によって直ったとみるべきだろうか。
なお、/proc/diskstats の項目数が異なるのはカーネル5.5+より2項目増えたためである。 *1

時間とやる気ができればそのうちもうちょっと調べるかもしれない。

Debian Buster (4.19.0-10) の場合

sysstat のバージョンをメモるのを忘れたが、たしか 12.0.3 だったと思う。

$ iostat -xdm
Linux 4.19.0-10-amd64 (auburn)  08/09/2020      _x86_64_        (8 CPU)

Device            r/s     w/s     rMB/s     wMB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
nvme0n1          7.26    3.18      0.38      0.17     0.01     0.60   0.11  15.79    1.01    0.90   0.95    53.29    54.02  90.74  94.74

$ cat /proc/diskstats
 259       0 nvme0n1 3744 4 399146 3734 1630 308 175074 1406 0 456044 459884 0 0 0 0
 259       1 nvme0n1p1 1133 0 7370 2560 2 0 2 0 0 32 2484 0 0 0 0
 259       2 nvme0n1p2 2375 4 378624 1151 1248 308 175072 1295 0 1392 2400 0 0 0 0
 259       3 nvme0n1p3 153 0 9752 7 0 0 0 0 0 8 8 0 0 0 0

Debian Bullseye (5.7.0-2) の場合

sysstat のバージョンは 12.3.3 だった。

$ iostat -xdm
Linux 5.7.0-2-amd64 (auburn)    08/09/2020      _x86_64_        (8 CPU)

Device            r/s     rMB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wMB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dMB/s   drqm/s  %drqm d_await dareq-sz     f/s f_await  aqu-sz  %util
nvme0n1          3.25      0.26     0.02   0.53    0.40    81.37    2.72      0.20     0.44  13.95    1.01    76.00    0.00      0.00     0.00   0.00    0.00     0.00    0.49    0.31    0.00   0.40

$ cat /proc/diskstats
 259       0 nvme0n1 2610 14 424763 1036 2183 354 331801 2211 0 3240 3372 0 0 0 0 394 124
 259       1 nvme0n1p1 107 0 6323 26 1 0 1 0 0 72 26 0 0 0 0 0 0
 259       2 nvme0n1p2 2325 14 409240 999 1788 354 331800 2084 0 3168 3084 0 0 0 0 0 0
 259       3 nvme0n1p3 114 0 6800 4 0 0 0 0 0 48 4 0 0 0 0 0 0

参考情報

DebianBug Report #927184 に同じような症状の報告が上がっていた。