[Fediverse]テーマ鯖構築のススメ


この記事は [Fediverse (2) Advent Calendar 2022](https://adventar.org/calendars/7719) の24日目の記事です。

今年のFediverseアドベントカレンダーは2件登録させていただきました。
書きたいことが多くてまとめきれなかったり、自宅鯖のリプレース作業で1回目に登録した日じゃ間に合わなそうだなってなったり。師走を師走らしく、わすわすと慌ただしい日々を送っている今日この頃です。

さて、この記事も当日ギリギリになって書いているわけではありますが、前回の題名「 [\[Fediverse\]テーマ鯖運営のススメ - Qiita](https://qiita.com/guskma/items/846909cc2930d234d9eb) 」とあるように、シリーズ記事となっております。ただ、あちらはお気持ち表明的な記事で、 **今回はどちらかというと技術的な話** がメインです。前回記事を読まなくても大丈夫ですが、読んでもらえると今回の記事で僕が取り上げることの想いが理解してもらえると思います。知らんけど。

# 本日の本題：LTLをテーマ鯖用に作り変えよう

今回の記事は、 **マストドン標準で実装されている機能「ローカルタイムライン(以降LTL)」のコードを改造し、テーマ鯖に適したタイムラインを流すように作り変えよう！** というものです。

**って考えていたんですよ。** で実際に改造したコードをぐんますとどんに適用して本番運用してドヤァ…してたんですよ。

残念ながら、タイムアウトとなりましたorz

改造は一通り終えて、開発環境ではうまく動いたんだけど本番環境にデプロイしようとしたところで何らかの環境差異によりv4以上に上げることが出来ず。。

仕方ないので **今日は解説だけ** にします！ **ソースコードはgithubに上げてある** ので、人柱どんとこいな鯖缶の方は是非導入してみてください！改めてアップデートできた暁には改めて導入手順の記事を書かせてもらいます。

[guskma/mastodon at default-hashtag - GitHub](https://github.com/guskma/mastodon/tree/default-hashtag)

# 改造ポイント：mecabによる構文解析を利用したデフォルトハッシュタグ追加機能

まずは以下のスクリーンショットを御覧ください。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391534/90083015-49c0-4aae-d209-f8b8922e12aa.png)

これは左から **「ハッシュタグタイムライン」「ローカルタイムライン」「アカウントのタイムライン」** です。

この中には3つの改造ポイントが載っています。

**1. LTLにハッシュタグタイムラインと同じ投稿が載っている**
**2. タグタイムラインにハッシュタグがついていない**
**3. 投稿範囲が「公開(public)」になっているにも関わらずLTLに表示されていない**

これらを順に説明していきます。

## 1. LTLにハッシュタグタイムラインと同じ投稿が載っている

これには、LTLをハッシュタグタイムラインに置き換える改造が施されています。

従来のLTLは鯖に登録されたユーザが公開範囲を「公開(public)」にしている投稿がすべて表示されていました。  
これが小規模の鯖において特定ユーザの投稿が際立つ結果となってしまい、新規ユーザが「LTLあまり盛り上がってないな」って感じる原因となっていると思っています。(詳細は後述)

LTLをタグタイムラインにすることで、テーマ鯖にメリットとなるTLとすることが出来ます。

1. 鯖特有のハッシュタグを利用することにより、「その鯖にいるユーザに見てほしい投稿」を選んで投稿することができる。
2. リモート鯖からローカルタイムラインを見ることができる
3. リモート鯖からローカルタイムラインに投稿をすることができる。

**「テーマ鯖では特定のテーマのことを中心に話さなければならない」「テーマ鯖の中の人と絡みづらい」といった欠点を改善できた** と思います。

この改造では主に [REST APIの置換はここ](https://github.com/guskma/mastodon/commit/07a6c09aaf6a635ca80ba8844e8cacbe94d7e361#diff-65ea661c133885e51f70ad5e690cf73818dc2745c6e77d5a39e3c0d96dcb1d79) とか [ストリーミングの置換はここ](https://github.com/guskma/mastodon/commit/07a6c09aaf6a635ca80ba8844e8cacbe94d7e361#diff-f9eb75341ce6bbfb6d0468e132684dc0b0d86cb8e26d9460602563cc46115c49) らへんを弄ってTLを置き換えています。

## 2. タグタイムラインにハッシュタグがついていない

今回の改造を「デフォルトハッシュタグ機能」として紹介したのはここの部分がメインとなるためです。

**LTLをタグタイムラインに置き換えた代わりに、特定の(鯖缶が設定した)タグを自動挿入するようにしています。**

毎回ハッシュタグを自分で入力するのは面倒ですよね。なので自動で挿入することができるようになっています。

また、普通であれば表示されるはずのハッシュタグが表示されていません。

僕は **隠しハッシュタグ** なんて呼んでいますが、単純にハッシュタグを処理するときにタグ情報だけを挿入する事ができるようになっている部分を突いただけのものになっています。

この改造は [この辺の行近辺](https://github.com/guskma/mastodon/blob/07a6c09aaf6a635ca80ba8844e8cacbe94d7e361/app/services/process_hashtags_service.rb#L65) がメインの処理となっています。

また、デフォルトハッシュタグを挿入するためには、 `.env.production` に `DEFAULT_HASH=<ハッシュタグ>` を記載した上で `bundle exec rails db:migrate` を行う必要があります。これによりLTLを置換する前にLTLに流れていた投稿には自動でデフォルトハッシュタグが挿入され、従来のLTLからスムーズに移行することが出来ます。

本当は隠しハッシュタグではなく実際に表示されるよう弄りたかったんですが、コード解析が間に合わなかったため、今回は既知のコード部分を弄るだけに留めさせてもらいました。

## 3. 投稿範囲が「公開(public)」になっているにも関わらずLTLに表示されていない

個人的にはここが一番いい感じに改造できていると思っている部分です。

これは [Abyss.fun](https://abyss.fun/about) で実装した機能 **「キーワードタイムライン」** を汎用的にリファクタリングしたものになります。

ぐんますとどんは群馬をテーマにした鯖なので、群馬に関係するキーワードが流れてきた場合のみ隠しハッシュタグを挿入するようにしています。

それによりLTLに乗る投稿は群馬に由来のある投稿に厳選され、関連性の低い投稿は未収載のように扱われることとなります。

**キーワードの抽出には構文解析では定番のmecabを利用** しています。本当はこの記事でmecabの導入方法についても書きたかったんですが、これも時間切れですね。メモ書き程度にはなりますが、 [Abyss.fun構築時に書いたキーワードタイムラインのwikiページ](https://wiki.abyss.fun/abyss-fun/ktl) がmecab導入には参考になるとは思います。今回はパッケージをaptで入れたりシステム辞書をNEologdに置き換えたりしてますが。

コードの弄ったところは [process_hashtag_service.rb全般](https://github.com/guskma/mastodon/commit/07a6c09aaf6a635ca80ba8844e8cacbe94d7e361#diff-e9dfb41d8d6f75ec86f367bbac3ef819a67c4814f7487066a414c0281e50cf19) です。Lintエラーがたくさん出てるのは見なかったことにしてください。日曜プログラマにはこれが限界です。

# ローカルタイムラインの必要性について

技術的なところが絡むのは以上です。あとは蛇足的な追加記事です。

前回記事が長くなりすぎてしまったのと、こっちの記事で書けばいいかなってところがあって書かなかったところを補足しておきます。

**テーマ鯖を盛り上げる上で厄介なのがローカルタイムライン** だと考えています。小規模鯖の悩みの種と言ってもいいかもしれません。  
「LTLの流速が遅いから誰も投稿してない」「特定の人しか投稿していなくて面白くない」という意見があります。

**「そんなの気にするな！オレはオレの好きなように投稿する！」** という姿勢を持ってほしいという内容は [前回の記事](https://qiita.com/guskma/items/846909cc2930d234d9eb) に書きました。しかしそれは **鯖缶や一部のSNS中毒症状末期患者が持ってればいいもの** であって、一般ユーザに強制するものではありません。というか、どうあっても意識してしまうものだと思っています。

なので、僕の出した結論としては **「LTL廃止したほうがよくね？」** です。

実際、Fedibirdは廃止してますし、MisskeyにはLTL非表示の設定もあると聞いています。  
LTLがあれば自分でタイムラインを構築しなくてもいろいろな人の投稿が見れますが、それは自分の眺めていたいタイムラインとは別のはずです。自分の見たくない投稿も流れてくることは少なくないのではないでしょうか。

そういったわけで 僕はLTLには否定的な側の人間ですが、一方で **「新しいフォロワーを増やす機会となる」という側面を取ってみるとテーマ鯖を潰してはもったいない** と思っています。

で、今回のハッシュタグタイムラインに置き換える改造につながってくるということです。

LTLを特定のキーワードが含まれている投稿に厳選することで、自分の趣向と合う人が見つけやすく出来たのではないかと思っています。

今回のタイトルである「テーマ鯖構築のススメ」ですが、おそらく **テーマ鯖を運用するためにはバニラの状態のマストドンでは運営するのに適していない** と思っています。

テーマ鯖を運用しようとしている皆様方、マストドンを改造してテーマ鯖としてユーザの居心地が良くなる鯖構築を目指してみませんか？

# 蛇足の蛇足

この「LTLをハッシュタグタイムラインに置き換える」という発想自体は僕のアイデアではなく、かつて初期マストドンブームの頃にあったざぼてくという鯖のアイデアを参考にしています。

連合のカスタム絵文字を全てローカルに取り込む改造を施したり、鯖がもっている全アカウント情報を抜き出してきて無差別フォローをし始めたり、かなり尖った改造をする鯖缶でした。

やることは奇抜でしたが、参考にできるアイデアも多かったものです。

今回のTwitter騒動でまたマストドンユーザが増えましたが、これに乗じてああいう鯖缶がまた出てきてマストドンの特定界隈を混沌に陥れてくれたらまた面白いことが起きそうだな。なんてことを思っています。