ActivityPub サポート:フェーズ 1 RFC

Federation support for Discourse - #21 by rishabh ActivityPub Implementation for Discourse の続きから

なぜ必要か?

多くの Discourse ユーザーが直面する共通の課題は、自分が購読しているすべての興味関心グループの集約を表示できないことです。複数の Discourse インスタンスからのコンテンツを、中央集権的で社会的なユーザーフィードの形で簡単に消費する方法が存在しません。Reddit のような中央集権型プラットフォームは、すべてのコミュニティで単一のログインを利用でき、reddit.com のランディングページにすべてのコミュニティを集約したフィードを単一のストリームとして表示することでこの問題を回避しています。この後者の機能が、ActivityPub プロトコルを通じて Discourse で実現したいものです。

例えば、あるユーザー(A 氏)は複数の Discourse インスタンスを頻繁に利用しています。政治に関するもの 1 つ、趣味に関するもの 2 つ、地元の近隣フォーラム 1 つなどですが、これらすべての関連コンテンツを単一のフィードで消費する方法がありません。対照的に、Facebook グループや Reddit のサブreddit に複数参加している場合、最も関連性の高い投稿がすでにフィードに表示されます。

仕様(v1)

Discourse プラグインを通じて以下の機能を有効にすることで、MVP をプロトタイプ化できます:

  1. 必要に応じて ActivityPub フィードを生成する(RSS フィードが既に存在するすべてのページに対して)

    • URL に .rss を追加するのと同様に、適切なエンドポイントを要求することで、AP プロトコルを使用してコンテンツを取得できるようになります。

    • URL にユーザーの API キーを追加することで、プライベートコンテンツに対してもこれを有効にできるかもしれません。

  1. フォーラム管理者がカテゴリごとに ActivityPub(送信側)を有効にできるようにするか、デフォルトで有効にするか?
    @Falco 氏にはこの点についていくつかの考えがあると思われます)

  2. Discourse フォーラムや Mastodon フィードでこのコンテンツを受信(受信側)する方法を確立する

次のステップ

まずは小さく始める必要があります。そのため、最初に最初のイテレーションに含める小さく実現可能な機能セットを決定する必要があります。私は ActivityPub プロトコル を確認してきましたが、その内部動作についてはまだ十分に慣れていません。そこで、このトピックに強い関心を示している他の皆様(@Falco@hellekin@merefield)に、最初のイテレーションのための実現可能な仕様を構築し、上記の仕様に対する変更を提案するよう招待します。

リソース

「いいね!」 39

古いトピックからのいくつかのハイライトを以下に示します :arrow_down:

同意します。これは @Falco が v1 の動作として提案したものとまさに一致していると思います。

「いいね!」 6

素晴らしい取り組みですね、ありがとうございます。

まず申し上げたいのは、最初は「どうやるか(how)」ではなく「何をやるか(what)」に焦点を当てるべきではないでしょうか?技術アーキテクチャは後回しでよいと思います。その理由は、技術選定を早めに行うと機能性が制限される可能性があるからです。

バージョン1では、「発見の発見」リストの導入をぜひ実現したいと考えています。まずは以下のリストから始めます:

  • 「最新」リスト:対象ソースに含まれる各最近のトピックのプレビューを表示(全ソースの「最新」の単純な統合)
  • 「ウォッチ中」リスト:通知を受け取るよう選択したアクティビティがある各トピックのプレビューを表示(これは既存のモバイルアプリの仕組みに由来します。ウォッチ中のトピックにおける新しいアクティビティの通知を、その根本となるトピックのプレビュー自体に展開する仕組みです)。
「いいね!」 9

これを始めてくれてありがとうございます!

正直に言わせてもらうと、Facebook の比喩を用いた元の提案は私には理解できませんでした。Facebook が何をしているのか全くわかりませんし、それが Discourse とどのように関係しているのかも理解できません。

Discourse における ActivityPub サポートについての私の理解は、それがトピックのフェデレーションを可能にしたり、Discourse インスタンス間でカテゴリを共有したりするものだということです。例えば、discourse.joinmastodon.org 上の一つの発表トピックが、関連する #software:mastodon カテゴリを通じて socialhub.activitypub.rocks へフェデレーションされることが考えられます。そこでは、ローカルユーザーが、それがローカルトピックであるかのように「いいね」をつけたり、返信したり、引用したりできます。ただし、元のトピックは joinmastodon のインスタンス上に存在し続けます。

もう一つの側面として、両方のインスタンスにアカウントを持っている場合、それらのアカウントをリンクさせる方法があるべきだということです。つまり、特定の Discourse インスタンスを主な ID プロバイダーとして使用できるようにすることです。これは最初のイテレーションの焦点ではないと理解していますが、覚えておくことは重要です。なぜなら、最終的に「[お気に入りの ActivityPub 実装] でサインイン」という形になる可能性があるからです。

上記の提案から私が理解しているのは、Discourse の Android アプリの複製のようなものです。そこでは複数のインスタンスのリストがあり、それらすべてからの通知を受け取ります。文脈を失いながら、多くのソースからの無関係な応答を混在させるのは、少し危険に思えます。

私の理解は正しいでしょうか?また、私の理解は、ActivityPub と Discourse の統合についてのあなたのビジョンにとって、良い次のステップとなるでしょうか?

「いいね!」 5

現在のすべての ActivityPub 実装は、投稿が安定したアクターによって公開されることを前提としているため、以下のいずれかが必要です。

  • すべての投稿を公開するシステムアカウント
  • フォロー可能なフィードごとに 1 つのアカウント
  • 各 Discourse ユーザーのアカウントによって仮に作成された投稿の Announce を行う、フォロー可能なフィードごとのアカウント

最初の実装が最も簡単でしょう。3 番目はデータモデルの統合において最も優れた結果をもたらします。

また、完全なトピックの内容を公開するのか、トピックの最初の投稿のみを公開するのか、それとも StackExchange の Twitter フィードのように /top ページからの投稿を宣伝する個別の投稿を作成するのか、といった選択肢もあります。あるいは、それが単に「トップ投稿」フィードの動作であり、他のフィードはすべてを公開するということになるかもしれません…

技術的なレベルでは、URL を変更する必要はありません。すべてのサーバーが Accept: application/activity+json またはその代替形式を送信します。


ActivityPub で異なるソースからのフィードを異なるタイミングで混合し、オプトイン機能として「アルゴリズムによるタイムライン」を再現するリーダアプリケーションは、以前から私が望んでいたものであり、現在では存在していないようです。


@hellekin: クロスドメインでの作成は、Discourse が持つ多くのスパム対策を致命的に回避する可能性が高いと思います。実装において重要なのは「読み取り」の方です。結局のところ、読み取りは基本的です!

「いいね!」 11

そうは思いません:リモートユーザーは、ローカルアカウントと連携しない限り、引き続きステージング対象となり得ます。連携した場合、そのアカウントにはアンチスパム機能が適用されます。

正直なところ、コメントは少ししか見ていません。すべてのカテゴリを独自のアクター(タイプは「Group」)として扱うことを提案します。そうすれば、外部のユーザーが特定のカテゴリを簡単に購読できるようになります。これらのカテゴリ内の投稿は、「Group」アカウントがユーザーの投稿をアナウンスする形で実現できます。これにより、カテゴリと著者の両方を保持できます。これは、私たちのソフトウェアでも採用している方法です。JSON-LD署名を使用する場合、非公開のカテゴリであっても安全に機能します。

問題は、外部からのコメントをどう扱うかです。グループアカウントを「手動承認」方式として定義することを提案します。これにより、ランダムなスパムを防ぐための検証プロセスを追加できます。検証されたアカウントは、これらの投稿にコメントできるようになります。

これにより、ほぼすべてのフェディバースの人々が、Discourseシステムと即座に接続し、相互作用できるようになります。

「いいね!」 7

@heluecht さんの提案に賛成です。

さらに、以下のような機能があると素晴らしいと思います:

  1. 各カテゴリのグループアクターには、カテゴリを管理できるオーナーが存在し、投稿権限の制御、ユーザーの禁止や削除、公開・非公開の設定などが行えるようにする。
  2. ローカルユーザーは、インスタンスのスタッフが承認する限り、自インスタンスでカテゴリを作成できるようにする。
  3. カテゴリオーナーが不適切な場合、サイトスタッフがオーナーを変更できるようにする。

これは多くの中央集権型のフォーラムやコミュニティで採用されている仕組みです。改善すべき点は、これをフェデレーション対応にすることです。

とはいえ、まだ課題は残っています:

  1. アクター ID は変更可能にするべきでしょうか?Discourse では、サイト設定でユーザー名の変更を許可できます。しかし、他の ActivityPub ソフトウェアがこれを扱えるか疑問です。Is Object's `id` immutable? - ActivityPub - SocialHub
    (さらに追加する予定)
「いいね!」 5

来週開催される OFFDEM の SocialHub に、Discourse チームの方々は参加されますか?他の AP 実装者との出会いや連携の絶好の機会になると思います。

「いいね!」 7

私の知る限りではありませんが、お尋ねいただきありがとうございます!

「いいね!」 5

いくつかの参考情報:
Friendica と Hubzilla は、RSS フィードを ActivityPub/Diaspora*/OStatus 互換のフェデレーションアカウントに変換することができます。

また、投稿を ActivityPub 投稿に変換する WordPress プラグインもご覧ください。

「いいね!」 10

いくつかの参考点があります。

  • Feneas ActivityPub ウォッチリスト では、Mastodon の他に、参考になる可能性がある Ruby で実装された 3 つのプロジェクトがあります。
  • @heluecht@misaka4e21 は、Group アクターのサポートについて言及しました。SocialHub では、これをより標準化された方法で実装するための 進行中の議論 があります。
「いいね!」 5

EUの資金獲得おめでとうございます!

ロードマップはありますか?

DiscourseチームからActivityPubカンファレンスに来る人はいますか?
他のAP実装者と会い、交流する絶好の機会になるでしょう。
https://conf.activitypub.rocks

「いいね!」 5

さまざまな理由により、これは実際には進展しませんでした。それは単に RFC 提案でした。

「いいね!」 1

来週の日曜日、APConf2020 の Birds of a Feather セッションで、Discourse における ActivityPub の実装について議論できることを願っています。SocialHub の専用トピックをご覧ください:

@rishabh 日曜日に参加できなくても、少なくともトピックに同席していただけると嬉しいです。正確な時間はまだ分かりませんが、日曜日の午前中です。分かった時点でこの投稿を更新します。

「いいね!」 7

こんにちは @hellekin さん、

参加できず申し訳ありません。NGI0 の資金調達申請は行っておらず、現在この件に取り組んでいる方もいないことをお伝えします。また、私はこのプロトコルに詳しくないため、このプロジェクトを主導する最適な人物ではありませんが、@Falco さんに連絡を取って、ご意見やご関心があるかどうかを確認させていただきます。

「いいね!」 4

ええと、その当時はチームのメンバーの一人が申請しました。たとえ現在は参加していなくても、選出されました。つまり、誰かが承認したはずです。「私たち」というのは誰を指しているのか分かりません。:slight_smile: とにかく、@Falco と議論できることを楽しみにしています。何らかの AP サポートは ActivityPub コミュニティにとって非常に有益でしょう。特に、Discourse インスタンス間での連携を容易にし、Fediverse との統合をよりスムーズにする点で重要です。

スパム対策の問題は認識していますが、ローカルアカウントを登録するまで、未登録のメールユーザーのように「ステージング」された Fediverse ユーザーとして扱うことで緩和できると思います。

「いいね!」 5

もちろん、それが実現するのはとても喜ばしいことです。

はい、私たちは過去に資金提供を申請しましたが、今年初めに NLnet チームと協議し、プロジェクトを終了し、私たち向けに確保されていた資金を解放することにしました。当時選ばれていたとしても、NGI0 との協力は現時点ではキャンセルされています。もちろん、将来改めて提案を出すことは自由です。

思い出しましたが、@riking も興味を持っているかもしれませんね :slight_smile:

「いいね!」 1

興味深いですね。

このプロジェクトは、欧州委員会の次世代インターネットプログラム(DG コミュニケーションネットワーク、コンテンツ、技術局の管轄下)の助成契約番号 825322 に基づき、NLnet によって設立された NGI0 Discovery Fund を通じて資金提供されました。

つまり、これは別の「Discourse」について話しているのでしょうか?
「プロジェクトの公式サイト: https://discourse.org」があるため、単に確認のためにお尋ねしています。

「いいね!」 1

ああ、そのページが存在しているとは知りませんでした。NLnet の担当者にメールを送り、削除し忘れているかもしれないので促し、ここで更新を投稿します。

編集:変更は NLnet; Discourse ActivityPub に反映されています。

「いいね!」 1