古事連記帖

趣味のこと、技術的なこと、適当につらつら書きます。

Mastodon 自前インスタンスと disk full と戦う

割と前から Mastodon でおひとりさまインスタンスをさくら VPS でだらだらとdocker 運用しているんですが、メンテナンスとか放りっぱなしで気がつけば disk full になるケースが増えてきてしまいました*1
最初の一回目は、Mastodon 以外に運用していた (すでに別サービスへ移行済み) データがあったので、それを削除して事なきを得ていたんですが、二度目はそんなデータも無く何を削除したら良いのかわからなくなり、tootctl を使ったデータ削除も disk full の前にはどうすることもできず*2、もがいていたところこんな記事に出会いました

miha.hateblo.jp

この通りに

$ sudo docker system prune -f

と打ち込むわけです。ありがたや、これのおかげでどうにか空き容量を作ることができ、

$ sudo docker-compose run --rm web bin/tootctl media remove-orphans

が通り、どうにか生きながらえることができました。


ところが数ヶ月後、またしても disk full の悪夢にうなされるわけです。頼みの綱であった

$ sudo docker system prune -f

を試すも、

Total reclaimed space: 0B

と返り、削除できるものがなくもう諦めかけていましたが、docker の prune コマンドにはまだいくつか選択肢が存在していました

qiita.com

試したところ、

$ sudo docker volume prune
...
Total reclaimed space: 66.07MB

なんとかかろうじてスペースが空いたので、すかさず

$ sudo docker-compose run --rm web bin/tootctl media remove-orphans

を実行、無事通り

Removed 1708 orphans (approx. 163 MB)

と出ましたが、これだと数日以内には埋まる可能性があります。
tootctl コマンドには他にもメンテナンスコマンドがいくつかあり、外部サーバーからの古いメディアファイルを削除する `remove` コマンドが存在します。これに気づけなかった。

qiita.com

$ sudo docker-compose run --rm web bin/tootctl media remove
...
Removed 204389 media attachments (approx. 103 GB)

いいですね。借りている VPS は 200GB ストレージなので、実に半分以上を削除できたことになります。
ついでにプレビューカードの削除もしました。これは `preview_cards remove` でできます。

$ sudo docker-compose run --rm web bin/tootctl preview_cards remove
...
Removed 244063 preview cards (approx. 8.54 GB)

いい具合です。これでしばらくは大丈夫でしょう。

とはいえ、放置していればおそらく 1 年後くらいには同じ問題に出くわすかもしれません。そのときのために自力で気づいたときにコマンドを叩くか、cron で定期的に削除したりする必要はありそうです。

*1:PCリフレッシュ時にしばらく見なくなってしまうなどだいぶ放置しすぎている感じは…

*2:一時退避とかするための空きがないやつ

リモートワークで OBS Studio と戯れた話し

新型コロナウイルス感染症への対応として所属する会社でリモートワークが始まり、早 4 ヶ月が経ちました。
2 月と言えば、ダイヤモンド・プリンセス号が日本で隔離措置を受けていた頃です。世界各地で感染者が増えつつある中、日本での感染爆発が起こるかどうか?というところでもありました。それを思うと、会社の意志決定の早さを感じています。

リモートワークでオフィスと変わらぬ働き方をするために、様々な試行錯誤をしてきました。その中で感じたことは:

  • スピーカー出力でオンラインミーティングに参加すると、相手の声が耳に入ってこないことがわかった
  • -> イヤホン・ヘッドフォンを使用することで (自分は) 問題が解消したと思っている
  • 顔が見えないことは相手の声が入ってこないことの一因だと思っていたが、上記により (自分は) 実はそうではないと感じた

一方で、地方に拠点を持っているこの会社で、これまで「東京本社」と「地方拠点」で塊があって、そこを繋げる導線が Skype であったり*1、Slack であったりといったものがあり、どうしても「距離の不均一」を感じてしまう部分がありましたが、一斉にリモートワークになったことで「距離が均一」になり、地方拠点のメンバーとの交流が積極的になった一方、所属する拠点との距離は離れてしまい、いっそうの自己表現を求められるようになってきたと感じています。
例えば、社内では定期的にコミュニティ勉強会のようなものがおこなわれています。リモートワーク環境下においてオンラインでの開催になりましたが、検証環境が家にあって、それをそのまま発表できるという利点を生かした発表を目の当たりにしたりと、表現の幅が広がったなと感じていますし、利点を生かした何かをもっと追求するべきだとも思っています。

仕事中においても、Slack による「文字でのコミュニケーション」では不足する状況が来たとき、遠慮無しに突発でオンラインミーティングの場が立ちあがり、状況を声で説明したり、画面を共有して見せたりという環境が生まれつつあります。こういった場が生まれることも、自分の会社の良いところでもあり、これからの仕事のあり方を示すものだなあと感じています。これらで普段オフィスでやっていることがおおよそ再現できている感じがしています。

そんな中、自分がやってきたことは、常に自分をカメラで映すことでした。特に理由は無いんですが、試行錯誤していく中で、自分が率先して顔を出して参加することにより、メンバーが顔を出しやすい環境を作り上げたいという気持ちもありました。
そして、ただ顔を出すだけではなく、自分らしい何かを表現したいというところもあり、OBS Studio を使った表現に行き着きました。

OBS Studio とオンラインミーティング

会社では Meet を使ったミーティングがおこなわれています。OBS Studio はそのままだとカメラとして使うことができませんが、OBS VirtualCam を使うことで仮想カメラとして出力することができるようになりました。こうなれば、OBS Studio ができることをフル活用できるようになります。使い方はいろいろな方が既に書かれているのでそちらに譲ります。

最初にやったことは、テレビ番組っぽくしたくなったので「中継」のテロップを作るところからスタートしました。Adobe Illustrator では、テロップ制作に使えるようにか、映像規格にあわせたテンプレートがあらかじめ用意されています。カメラで出力できる画面比率を確認して生成することにより、おきたいものをそのままポンおきできるのが魅力です。

f:id:ChiiAyano:20200628230916p:plain
今はこれで落ち着いていますが、他にもいろいろ作りました

そして、obs-web-socket を使うと、その名の通り WebSocket 経由でいろいろな制御ができることにも気付きました。これを使って最初に作ったのは時計でした。テレビ番組っぽい何かに近づけるため、例えば 12 時間表記にしたり、正午は 0 時と見せたり、区切りの時間に数秒だけ表示したり…みたいなことも設定でできるようにしたりしました。

f:id:ChiiAyano:20200628231211p:plain
時刻の表現方法もいろいろ工夫したりしましたね

さらに、ニュース番組などではおなじみの「天気」も出せるようにしました。OpenWeatherMap を利用したシステムで、まだアニメーションさせながらテロップ切り替えなどの手法がわかっていないので、現時点では「住んでいるところの現在の天気」を出すまでにとどまっています。

f:id:ChiiAyano:20200628231633p:plain
割とそれっぽく見えてくるやつ

最近は「気軽に相談に来て欲しい」という気持ちから、常に Meet でルームを立ち上げたままにしています。そこで自分が離席していることを明示するために「離席中」のシーンを作ってるんですが、OBS Studio をフォアグラウンドにして、差し替えるシーンを選んでトランジション…が面倒になってきたので、画面ロックをフックに自動でシーン切り替えをできるようにもしました。マイクだけは OBS Studio で制御していないので、Meet 側でマイクをオフにする手間はまだ残っていますが、かなり便利になりました。

作ったツールの公開とオープンソース

作った 3 つのツールは github にまとめてリリースしました。
使い方などはそこまで詳しく書いてなかったり、天気を表示するツールでは OpenWeatherMap の API を用意する必要があったりと面倒なところはありますが、それでもよければぜひ使ってみてください。
基本的にはシーンに用意したラベルに対して文字列を差し込むだけなので、OBS Studio で表示したいところにラベルを配置し、フォント設定をしておけばいいはずです。
github.com

ツールは以下
github.com

最後に

緊急事態宣言も解除され、リモートワークも解除される企業も多くあります。一方で、海外では未だに感染者が増え続け、日本でも緊急事態宣言後から感染確認者の数が上昇傾向にあります。
リモートワークの重要性が増してきています。その中で自分をどう仕事現場で表現していくかがますます求められていく、そんな気がしています。
作ったツールはネタではありますが、表現の方法の一つとして、これらをそのまま使うもよし、新しい何かを作ってみるもよし、そんな手助けができたらなと思っています。

*1:他のリモート会議システムも含みます

C97 頒布「あたいいろの景色」の委託頒布情報

いろいろ動いてるのでちらっと書きます

コミックマーケット 97 で頒布しました作品「あたいいろの景色」は現在以下の媒体にて委託頒布をおこなっています。


あきばお~こく

物理で CD メディアをお手にすることができます。
価格は 715円 + 税です。
www.akibaoo.com

ダウンロード頒布

東方同人音楽流通さまを通して、以下 3 つの媒体を通してダウンロードでもお手にとっていただけます。

BOOTH

booth.pm
価格は 750円です。

iTunes Store

iTunes Store でもダウンロードできるようになりました。
1 曲 150円から、5 曲ぜんぶで 750円です。

Google Play Music

play.google.com
Google Play でもダウンロードでお手にとっていただけます。こちらも 1 曲 150円から、5 曲ぜんぶで 750円です。

コミックマーケット 98 の中止に伴う頒布予定の新譜について

久しぶりにサークルの話しです。
AncientChronicle のサイトにて当選および新譜の告知はしてありましたが、ご存じの通りコミックマーケット 98 は中止となりました。
www.comiket.co.jp

大変残念ではありますが、イベント開催に取り巻く状況を考えると致し方ないものと認知しています。

AncientChronicle として頒布予定でした新譜について、以下の通りで予定しています:

  • CD メディアとして頒布するものはコミックマーケット 99 以降に延期します
  • コミックマーケット 98 で頒布予定だった作品は順次 Sound Cloud で公開します (メディアにした際の収録曲はここから出します)
  • CD メディアとするまで、BOOTH やあきばお~を含む委託はおこないません

先述の公式告知にありますとおり、「2020年7月・8月にコミックマーケット98を延期することは現状考えておりません。」とあることから、現時点では 99 以降を目標に動きますが、仮に 98 が延期開催となった場合は参加し、予定通りの作品を頒布する予定です。

あけましておめでとうございます

今週のお題「2020年の抱負」

書いているのはもう 1 月 1 日の 22 時とか遅い時間ですが。

あけましておめでとうございます。2020 年もぜひよろしくお願いします。
f:id:ChiiAyano:20200101221840p:plain

ふと、bayfm を聞いてて聞こえてきた「2020 年」の英語での言い方で、Two thousand-Twenty*1 なのか、Twenty-Twenty*2 なのか気になってたんですが、どっちでもいいらしいです。

去年の目標とか未達のまま今年を迎えるとかザラなので、今年もとりあえずのんびり過ごします。あともうちょっとで出せそうな Android アプリを今年の早い段階で出せたらいいなってお気持ち。
曲作りもちまちまやっていきたいですね。頑張ります。

今年は初日の出を拝みに行きませんでした。ここでは書きませんでしたが、コミックマーケット 97 の 4 日目に参加してきたため、体力的な問題で取りやめとなりました(´・ω・`)
31 日じゃなかったら多分行ってたのかも。来年はどうなることやら。
初詣は今月中に行こうかなと思っています。お守りの更新とかしないと。

*1:門脇知子さんはこっちだった

*2:僕はこっちがカッコイイと思った

Xamarin.Android で System.IO.Stream を MediaPlayer に流し込む

Android.Media.MediaPlayer クラスの SetDataSource メソッドは、そのままだと System.IO.Stream を受け取ることができず*1、例えば WebAPI で拾ってきたバイト配列を MemoryStream に入れたり、FileIO で拾ってきた Stream といった .NET Framework 系のストリームとの相性があまりよくありません。

とはいえ、 SetDataSource メソッドのオーバーロードには MediaDataSource クラスのインスタンスをパラメーターとして受け取るものが用意されています。これは開発者が独自の方法でデータを読み込ませたいときに使うものですが、これを使って Stream も読めるようにします。

gist.github.com

*1:他の口があるかもしれない?

Windows 10 Insider Preview Build 18995 をインストールしようとしたらうまくいかなかった話と解決法

日本時間の 10 月 4 日未明に、Windows 10 Insider Preview Build 18995 が Fast RIng 向けにリリースされました。

blogs.windows.com

さっそく入れようと Windows Update で確認ボタンをポチポチしても、なかなか更新チェックが終わらず、最終チェック日が押した時間ではなくその前のチェック時間になって返ってきました。
Update 用のサービスを再起動してみたり、トラブルシューティングを試してみたりといろいろやってみましたがうまくいかなくて、このまま次のビルドまで待とうかなと思っていたところ、Answers にこんな記事がありました

answers.microsoft.com

I pressed the Pause Updates button, then pressed it again to re-enable updates, and Windows Update started working again.

要するに「更新を 7 日間一時停止」を選んでからもう一度再開させてみたら良い感じに動いた とのことだったので試してみたところ、一時停止後すぐ再開ではダメで*1、一時停止にしておいてしばらく放置 (おでかけしてたので10時間くらい放置してたかも) して再開したら、無事降ってきました。

f:id:ChiiAyano:20191005222056p:plain

*1:いろいろ試行錯誤した直後だったのでうまくいかなかったのかも