aquarlaのブログ

141文字以上のつぶやき

Fediverseの飯テロを支える技術 2021 / ごちそう画像投稿専用マストドンサーバ「ごちそうフォト」の独自機能を紹介

f:id:aquarla:20211224105356p:plain

どうもこんにちは。ごちそうフォト ( https://gochisou.photo/ ) 管理人の あくあーら ( https://gochisou.photo/@aquarla) と申します。

ごちそうフォト Advent Calendar 2021 ( https://adventar.org/calendars/6210 ) 25日目の記事となります。

私が管理しているマストドンサーバ「ごちそうフォト」では、標準のマストドンとは異なる機能をいくつか独自に提供しています。

Advent Calendar 最終回の今回は、「Fediverseの飯テロを支える技術」と題し、ごちそうフォトの独自機能を一挙紹介していきたいと思います。(ところどころ文中にメシ画像が挟まる点はご容赦ください。)

なお、今回紹介する全ての機能は以下で公開しておりますので、興味がある方はぜひチェックしてみてくださいね。

github.com

目次

ホームタイムラインのメディア限定表示

マストドンのホームタイムラインを使用していると、

「私はメシ画像だけを見たいのに、ろくに画像も添付されていない投稿ばかりが表示されてジャマすぎる!」

と思うときが頻繁にありますよね?

多くの人が抱えるその悩み、一気に解決してくれる機能がごちそうフォトには搭載されているんです。

f:id:aquarla:20210307125936j:plain

マストドンのローカルタイムラインや連合タイムラインでは、「メディアが添付された投稿のみを表示する」という機能がありますが、ごちそうフォトではこれと同等の機能をホームタイムラインでも実装しています。

Web UIからは、ホームタイムラインの上部にある「メディアのみ表示」のチェックをONにします。

f:id:aquarla:20211224104936p:plain

本機能は、標準のマストドンAPIを拡張して実装しているため、一般的なクライアントアプリからはON/OFFの切り替えができません。

クライアントアプリから本機能を使用する場合は、マストドンの管理画面を開き「ユーザー設定」→「その他」→「メディア限定ホームタイムライン」のチェックをONにします。

f:id:aquarla:20211224105133p:plain

ホームタイムラインをメディア添付の投稿だけで絞り込む機能は、いくつかのクライアントアプリにも搭載されているかと思いますが、「サーバ側で実現しているため、処理がクライアント側の負荷にならず、APIのページングの件数も正常に動作する」「メディアタイムライン専用の記憶領域をサーバ側で用意しているため、より多くの投稿を遡れる」というメリットがあります。

ローカルタイムライン/連合タイムラインと異なり、ホームタイムラインの投稿一覧が Redis 上にアカウント単位で保持されている関係で、ストリーミングサーバやWeb UIの変更など、そこそこ大きめの変更になっています。

具体的なソースコードは以下を参照ください。

github.com

ホームタイムラインの保持件数を増やす

上に書いた通り、メディア付きの投稿のみを保持する専用タイムラインを設置しているものの、標準のマストドンではホームタイムラインに保持できる投稿数は最新400件まで。それより古い投稿は消えてしまうため、

「昨日は忙しくてマストドンを開けなかった...昨日のメシ画像を見たいけど、ホームタイムラインの過去の投稿が消えてしまっている!」

とお嘆きの方も相当数いるのではないかと思います。

はい、ごちそうフォトを使えばそんな問題も解決です!!

f:id:aquarla:20211224145411p:plain

ごちそうフォトでは、ホームタイムラインの投稿保持件数を400件から4000件まで増やしています。

PGroongaによるメディア限定検索

マストドンを日々使っていると

「昨日はタイムラインを全く覗けなかった...。昨日見逃したラーメンの画像をくまなく検索したい!」

と思うことが毎日のようにあるかと思います。

そんな便利な機能、ごちそうフォトには当然のように搭載されているんです。ご存知でしたか?

f:id:aquarla:20211224110259p:plain

Elasticsearch による全文検索は、マストドンの標準機能としてサポートされていますが、Elasticsearch 自体がサーバリソースを多めに食うプロダクトであるため、ごちそうフォトでは、PGroongaをベースとした投稿の全文検索機能を提供しています。

ごちそうフォトで提供している本機能には、以下のような特徴があります。

  • 標準のマストドンの検索機能と同じインターフェースで使用可能
  • N-gram による完全一致検索
  • 検索対象は「メディアが1個以上添付されている全ての公開投稿」

f:id:aquarla:20211224111756p:plain

PGroongaによる検索はそれなりに軽快に動作するものの、PGroonga自体がPostgreSQLのバージョンに強めに依存する点とか、Amazon RDSなどマネージドな環境で使用しようとすると構成に工夫が必要だったりする点とか、いくつか引っ掛かりポイントが増えるため注意が必要です。(ただそれらを差し引いても、サーバリソースを食わないメリットは大きい)

それと、N-gramがどうしても嫌な人は、Mecab tokenizer も使えたりするらしいので別途調べてみてください。

具体的なソースコードはこちら。

github.com

#gochisou_photo デフォルトハッシュタグの付与

メシ画像を日々投稿するみなさんだったら

「自分が投稿したメシ画像を、もっと多くの人に見てもらいたい!この幸せを、できるだけたくさんの人と共有したい!!」

と毎日のように考えていることと思います。

ごちそうフォトは、そんなみなさんの想いに応える機能をもちろん用意しています。知りたいですよね?

f:id:aquarla:20211224112354p:plain

ごちそうフォトのローカルアカウントからの投稿には、一定条件により自動でハッシュタグが付与されます。

具体的には、以下のすべての条件を満たす場合のみ、#gochisou_photoハッシュタグを投稿に自動付与します。

  • 公開範囲が「公開 ( public )」
  • メディアが1つ以上添付されている

ハッシュタグは内部的に付与されているため、投稿本文には表示されません。

これにより、「ごちそうフォトのローカル向け投稿」と「#gochisou_photo ハッシュタグ付きの投稿」が タグタイムライン上で見事に統合されるようになります。

私たちは #gochisou_photo タグタイムラインを見続けていれば、常時たくさんのメシ画像が流れてくる。非常に便利ですね!!

gochisou.photo

本機能を利用するためには、ソースコードの変更の他に以下の設定が必要となります。

  • .envX_DEFAULT_HASHTAG に 自動付与したいハッシュタグ文字列 を指定
  • .envX_DEFAULT_HASHTAG_MEDIA_ONLY に true を設定
    • false または未指定の場合は、メディア添付の有無にかかわらず、全ての公開投稿にハッシュタグが自動付与されます

具体的なソースコードは以下の通りです。

github.com

ハッシュタグタイムラインの「追加のタグ」として20個までタグを指定できるように変更

Fediverseには、 #gochisou_photo 以外にも、多くのメシ画像用ハッシュタグが存在しています。

「メシ画像を観測するためのハッシュタグは色々あるのに、それを一元的に表示できないのは不便すぎる!!!」

という不満、多くの方が日頃からお持ちではないでしょうか。

そんな不満、ごちそうフォトでも解決できないとお思いですか?いいえ、それすらも解決できるんです。ごちそうフォトならね。

f:id:aquarla:20211224114000p:plain

マストドンの Web UI 上、タグタイムラインの右上をクリックすると、「このカラムに追加のタグを含める」というチェックが表示されます。

f:id:aquarla:20211224115126p:plain

たとえば「いずれかを含む」の欄に異なるハッシュタグを入力するとOR条件、「すべてを含む」の欄に入力するとAND条件でタグタイムラインを統合してくれるのです。こちらはマストドン標準で提供されているので、どのサーバでも使用可能です。便利ですね!

一方、「いずれかを含む」「すべてを含む」「これらを除く」の各欄ごとに、「指定できるハッシュタグの上限数」が実は設定されています。この数を超えて指定した場合、エラーとはならないものの、指定が無視されることになります。特にUI上で表示されてないので気付きにくいですよね。

標準のマストドンでは、本上限数は固定で4と設定されているのですが、ごちそうフォトではこれを20にまで増やしました。これにより、多くのメシ画像ハッシュタグをひとつのタイムライン上に統合することが可能になります!

わたしの場合はこれを活用して、以下のように複数のハッシュタグ投稿を同時に観測し続けています。コレ非常におススメなので、みなさんにもぜひ試してみて欲しいです。

f:id:aquarla:20211224115859p:plain

具体的なソースコードは以下の通り。どなたでも出来る非常に簡単な変更ですね!

github.com

/media_proxy のレートリミットを増やす

Web UIをお使いのみなさんであれば、アカウント詳細画面のメディアタブを遡ってメディア一覧を表示、メシ画像を漁ることは日常茶飯事かと思います。...日常茶飯事だよね?

f:id:aquarla:20211224141621p:plain

このメディア一覧を表示する際、リモートアカウントかつ画像の再ダウンロードが必要な場合、マストドン/media_proxyAPIをコールし、画像の再ダウンロードを行う挙動になっています。

...なのですが、この /media_proxy APIのレートリミットが「10分ごとに30回」というなんとも微妙な数字になっており、メディアタブの遡りを行うとすぐにAPI切れが発生してしまうという問題がよく発生していました。

f:id:aquarla:20211224143003p:plain

そこでごちそうフォトではこの制限を「10分ごとに600回」に緩和し、スムーズに過去画像の遡りを行えるようにしています。これも快適なので、特定アカウントの過去画像を漁る際にはぜひとも活用していただきたいところです。

具体的なソースコードは以下になります。

github.com

Web UIにハッシュタグタイムラインへのリンクを設定

デフォルトタイムラインを採用しているマストドンサーバのうちいくつかは、ローカルタイムラインをタグタイムラインに置換するカスタマイズも併せて行っていますが、ごちそうフォトでは、ローカルタイムラインとタグタイムラインを併用する形を採用しています。

マルチカラムのWeb UIだとこの位置。

f:id:aquarla:20211224144658p:plain

シングルカラムだとこの位置にリンクが設定されています。

f:id:aquarla:20211224144812p:plain

具体的なソースコードは以下。

github.com

#gochisou_photo ハッシュタグを常にトレンドタグの最上位に表示

f:id:aquarla:20211224161948p:plain

ごちそうフォトユーザーならびに #gochisou_photo タグを活用するみなさんにとって、#gochisou_photo タグこそが至高であり、#gochisou_photo タグ以外がトレンドの最上位に来ることは許されないのは当然の事実であります。

そのためごちそうフォトでは、#gochisou_photo タグは常にトレンドの最上位である必要があります。常にトレンド最前線なハッシュタグ、それが #gochisou_photo なのです。

具体的には以下の通り。

github.com

添付メディア付きの投票

オリジナルのマストドンでは、何かの事情があって添付メディア付きの投票を無効にしている...という話を聞いたのですが、ごちそうフォトはそんなものを気にしません。

「画像付きの投票でどっちが美味そうか決着を付けたい!決着を付けたい!!!」

というユーザーのニーズにしっかり応えていきます。

その結果がこちら。

具体的なソースは以下の通りです。フロントエンドで制限してるだけと思いきや、サーバサイドでもほんのちょっぴりチェックが入ってるので、そこを外す必要があります。

github.com

その他細かい変更

f:id:aquarla:20211224163414p:plain

Node.jsのバージョンを管理画面に表示

なんとなく Node.js のバージョンが見たかった。それだけ。

github.com

stoplight-admin を Rails engine 化したものを設置

最初はそのままオリジナルの stoplight-adminを入れようとしたのですが、オリジナルが Sinatra 上で動く実装になっており気持ち悪かったため、自分で頑張って Rails engine 化しました。

オリジナルの stoplight-admin の実質的なフォークではあるのだけど、根本的に作り替えてしまった部分が大きいためGitHubからforkもしづらく、今後どうしていくかは未定です。

github.com

おわりに

f:id:aquarla:20211224164650p:plain

「Fediverse の飯テロをささえる技術」と題して紹介した今回の記事、いかがだったでしょうか?

何はともあれ、ごちそうフォトならびに #gochisou_photo ハッシュタグを今年もご愛顧いただき、本当にありがとうございました!

来年もごちそうフォトとともに、引き続き飯テロ道に邁進していきたいと思います。何卒よろしくお願いいたします!