b-shock. Fortress

トゥートをCWに変える

その後構築したものがいくつかあり。
これらの作業ログも記事にしたいのだけど、なかなか時間がない。
今月ぐらいに上げられるといいなぁ。

今日のやつはそんなに大層なものではなく、小ネタです。
想定する読者さんは、SQLがちょっとだけわかってpsqlコマンドも扱える、 Mastodonのインスタンスを持っている管理者さん。

ネタバレを含んだ含んだトゥートをCWにする。

プリキュアのテーマインスタンス「キュアスタ!」に、いつも お世話になっている。
このようなテーマインスタンスでは、概ね「ネタバレを含むトゥートにはCWを」という 推奨がある。先日唐突に「一度送信したトゥートをCWに変えることも可能なはず」と 思い立って、軽く調べてみた。

この時点では純粋な技術的な好奇心であり、「あとからCW」の是非については一旦保留 する。これについては後ほど。

PostgreSQLに接続

手っ取り早く、 psql コマンドを叩いて試す。
FreeBSD環境でデフォルト設定でセットアップがされているなら、以下のコマンドで Mastodonのデータベースに接続できる。

1
sudo -u postgres psql mastodon

直近のトゥートを探す

CWにする対象のトゥートを特定する。
連合のトゥートを排除してローカルのトゥートのみ残し、せいぜい10件も取得すればよいのでは ないか。

1
2
3
4
5
6
7
8
9
10
11
SELECT
id, -- トゥートID
created_at, -- 投稿日
text, -- トゥート本文
spoiler_text, -- CWタイトル
sensitive -- 本文を隠すか?
FROM statuses
WHERE
local='t'
ORDER BY updated_at DESC -- 更新日降順
LIMIT 10 OFFSET 0; -- 先頭10件

目的のトゥートを見つけたら、トゥートのIDを控えておく。

トランザクションを利用しつつ更新

1年運用しているが、Mastodonのデータベースを直接更新するなんて、経験のないこと。
理由がなければやるべきじゃないし、いつでもロールバック出来る様な備えをするに越したことは ない。
もしステージング的な環境を持っているなら、そちらで試してほしい。

早速、トランザクションを開始。

1
BEGIN;

次に、実際の書き換えを行う。

1
2
3
4
5
6
UPDATE statuses SET
spoiler_text='ネタバレ注意なのです!ストーップなのです!',
sensitive='t', -- 「隠す」フラグを立てる
updated_at=now() -- 更新日付を現在時刻に
WHERE
id='00000'; -- 先程控えた、トゥートのID。絶対忘れちゃダメw

結果反映を確認

トランザクション中の更新である為、この時点ではMastodonの画面に反映しない。
画面上で確認できないので、更新の結果を確認するには、この場でSELECTする必要あり。(以下)

1
2
3
4
5
6
7
8
9
SELECT
id, -- トゥートID
created_at, -- 投稿日
text, -- トゥート本文
spoiler_text, -- CWタイトル
sensitive -- 本文を隠すか?
FROM statuses
ORDER BY updated_at DESC -- 更新日降順
LIMIT 100 OFFSET 0; -- 先頭100件

先ほどとほぼ同じだが、意図しない書き換えが行われていないか確認するために、以下の修正を行った。

  • WHERE句を削除。
  • 件数を100軒に増やす。

トランザクションの終了、又は破棄

意図通りの更新であれば、

1
COMMIT;

を実行すれば、この時点でMastodonの画面に反映。
「キャッシュのクリア」的な処理が必要かと思ったが、そうでもなかった。 おれが普段作っているものより素直な作りだなw。わかりやすくてよい。
反映を確認できた?

万一、期待した結果と異なっていたら、

1
ROLLBACK;

を実行。

「あとからCW」の是非

先ほど、「一旦保留」と言った件。

まず、技術的な観点から、やむを得ない場合のみにするべき。間違っても、これを前提にした 運用はやめたほうがいい。
DBの詳細な説明、どこかにあった?もしあるなら(どこかにあるのをおれが知らないだけかも)、 それを熟読精査した上で実行するのは、まずは技術的にはOK。

コミュニティとしてどうなのか?という問題も。
発言を容易に書き換えたり出来ると、そもそも会話が成り立たない。 出来ることならするべきではないし、仮に行うのでも、この点を念頭に置くべき。
CWは…、まぁ微妙か。会話が成り立たなくなる種類の修正ではないし。

ネタバレ禁止というのも、「推奨事項」程度のものと思っていて。
本人から「これCWにしたいんですけど〜」的な申し出があったら初めて動くぐらいで、 大抵は十分なのではないか。と、個人的には思う。

以上。