あひるの勉強部屋

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

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

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\""