おひとり様ActivityPubサーバーにBlock実装

2023/12/27 [09:44:09] (水) 天気

おひとり様APサーバーにBlockを実装した。

ActivityでBlockが飛んできてもめっちゃレアケースなのでスルーしてたんだけど念のため。


というか、アドベントカレンダーに参加して投入したエントリ「Fediverseの辺境で秘密基地」「SNSのソーシャルディスタンス」がどこかでブーストされたらしくて、珍しくぷちバズった。

Followリクエストも飛んできてフォロワーさんも増えた。のと、珍しくBlockリクエストも飛んできた。記憶に間違いがなければ、これまで半年ほどやっててBlockリクエストは3度目。


届けたいところじゃないところに届いたんだなぁ…じゃなくて、ちゃんと対応を考えないといけない。ツイッターのブロックと同じ扱いで、ブロックされた該当アカウントの投稿がブーストやなんかで飛んできてもタイムラインに流さない・間違ってフォローリクエストを送ったらまずい。

てことで、ブロックされてるリストを作成して、該当アカウントを登録することにした。


おひとり様サーバーでは投稿はJSONファイルのまま、Signature検証がOKだったら、所定のフォルダに移動してるんで、その前にブロックリストを確認してそこで弾くようにした。Followリクエストも同様。

ActivityPubというプロトコル、とかいうとなんか難しそうだけど、約束事の塊とその約束事を守ることで成立している。極端な話というか乱暴な話、約束事を守る/守らないはサーバー管理者次第。

だからこそ仕様上のMUSTやSHOULDはちゃんと対応する必要がある。


image

久しぶりに上手く巻けた、かな。

弁当用で、出汁少なめなので失敗は少ない。ウチで食べる用だと出汁を150ccぐらい入れるんでゆるゆるで難易度があがるんだよなあ。

SNSのソーシャルディスタンス

2023/12/25 [10:55:05] (月) 天気

Twitter(X)やFacebookからFediverseに引っ越しを開始したのが7月。それからちょっとずつ移住を進めて8月にはほぼ引っ越し完了。

Fediverse生活5ヶ月弱の振り返りが今回のエントリ。


Twitter、facebookからfediverseに移住して変わったところ


1)リプライやメンションをほぼしなくなった

2)RTをほぼしなくなった

3)いいねが増えた


こうしよう、と自分の意志で決めたことじゃなくて、Fediverseの特徴というか、おひとり様サーバーのポリシー、仕様が原因。

1)

リプライは実装していない。

メンションは実装済みだけど、DM的な使い方をしたいので簡単にできるようなUIはつけてない(送りたい相手のユーザー名サーバー名をいちいち手入力する必要がある)

2)

RTが減ったのは、ActiviryPubのRTは自分の投稿としての扱いになるから。ということは、RTするためにはDBに登録する必要がある。

おひとり様サーバーではひとのデータを極力持たないという方針で、ひとの投稿をDBに取り込んだりしたくない。ので、RTとうちのおひとり様サーバーは相性が悪い。

急場しのぎで、7日間の期限付きでDBに登録。期限がきたら削除&Undoを飛ばすことにした。

3)

いいねが増えたのは、リプライ代わりでweb拍手みたいな位置づけになったからかな。リプライほど積極的じゃない、ちょっとしたリアクションを送る感じで使ってる。


瓢箪から駒とか。

このおかげでSNSでのソーシャルディスタンスが保たれることになった


ツイッターの良いところは、

ネットを通じて人と出会いがあって、人との繋がりができること。Twitterがきっかけでリアルでの繋がりにまで広がることもある。

個人でもちょっとしたメディア並みの拡散力、影響力をもつ、こともある。


その仕組として、リプライやメンションするのも手軽だし、RTも気楽にできる。

他人の投稿に対して、たとえばテレビのニュースやワイドショーを見て、テレビに向かって何かいうのと同じような気軽さじゃないかな。

リアクションしてリアクションされてるうちに、距離感を間違えてしまうことがあるような気がする。


まだ様子見かなあというお店に何回か通って

「いつも」ありがとうございます

と言われると引いてしまって足が遠のくことがあったり。


向こうから顔見知りのひとがきたので満面の笑みで手をふったら相手も手を降ってやって来た、と思ったら、おれの後ろの人に手を降って笑いかけてて、満面に笑みを貼りつけたまま通り過ぎるしかない状況だったり。


いやいや、だいたいわたしとあなたは赤の他人ですよ?


ツイッターではありがちな光景だと思う。


その点、FediverseというかActivityPubのおひとり様サーバーは、ちょっとずつ面倒くさいんで、距離感を意識することができる。


そもそもおひとり様サーバーで壁打ちと言いつつ、ActivityPubで繋がる別サーバー、リモートサーバーに投稿を投げることになっている。

ぜんぶ「よそんちのお宅」だ。まずそこで少しハードルがあがって(これでも)ちょっと「よそ行き」になっている。


もちろん、ツイッターなどで、適切な距離感を保てるなら問題ない。

なんせ億単位でひとが集まっている。情報収集や情報拡散は巨大SNSの方がメリットが大きい。


ツイッターFacebookから離れて、わたしはそちらではソーシャルディスタンスが保てないということを痛感した。いや、いい歳こいて振り回されすぎるんだよなあ。みっともない。


おひとり様サーバーは20個しか表示しない(保存しない)し、検索もできない。

でも、平穏は得られている。


コロナ禍と同じ。SNSでもソーシャルディスタンスは必要だよなぁ。

image

Blueskyにも登録した。AT protocol?分散型というのに興味があったから。

けどなあ、ツイッターを作って放りだした・だされたジャック・ドーシーだよ?信用できるかとなると、イーロン・マスクやマーク・ザッカーバーグと同じ穴の狢だと思う。

ActivityPubサーバーのGETリクエストに署名

2023/12/20 [23:14:57] (水) 天気

おひとり様サーバーのGETリクエストを署名付きで投げるようにした。

今のところ、特に問題が出てるようには見えない。


前々から気になってたところ。

actor情報や投稿を取得するために、アクセスすると401や403で弾かれることがあって、それってリモートサーバーからのアクセスを拒否してるのかなあ、ぐらいに思いつつもなんかひっかかってた。

GETリクエストにひょっとするとSignatureが必要なわけ?と。

でも、POSTと違ってGETだよ?Body(content、本文)もないのに、いったい何に対してサインする?んなもんないよなあ、とも思ってた。


2023Fediverseアドベントカレンダー第3会場19日目の黒ヰ樹さんの記事

「DenoとHonoでThreadsのContent-Type: application/activity+jsonをGETする」

当初ActivityPubのHTTP Message Signaturesはhostとdateを認証するPOSTのみで使われてきました。

ThreadsのContent-Type: application/activity+jsonをGETするにはこの署名が必須なので、Threadsをフォローできないサーバーがあったりなかったりしたんですね。


↑こちらに詳細があった(感謝)

GETでのHTTP Signatureは

(request-target)

host

date

の3つを署名対象にすればOKということらしい。

(ひょっとしてわたしが知らなかっただけで、100年前からの常識だったのかな?)

この署名付きでGETを投げて403で弾かれることがあるけど、401は今のところない。これで大丈夫っぽい。


HTTPのレスポンスは。

401 認証できない

403 認証できるけど権限がない

404 そんなファイル、ディレクトリはそもそもない


403を返すと「そんなファイル」はある、ということを自白してるのでセキュリティ的にあえて404を返してることがある。なので、403と404は同じで原因の特定ができないとしても、401が返ってくるのはこちらに何らかの問題がある、ということ。


表示が無駄に重くなるだけなので、うちのおひとり様サーバーでは、400番台が返ってくるサーバーはリストに登録してアクセスしないようにしてた。

とりあえず。この対応で401は回避、できるかな。


image

今日は3回目のゲ謎。哭倉村。

ほんと、今年No.1だなー。


[12/21 14:07:43]追記。

401でエラーを出してた某サーバーのactor情報がこの変更で取得できたので、やっぱりGETにSignatureがなかったのが問題だったのか…。


[2024/01/09 11:46:23]追記。

HTTP SignatureをつけてGETしても403で弾かれるサーバーがあった。

いろいろ試してみたところ、お相手のHTTP HeaderのkeyIdのURLについてる「#main-key」が原因っぽかった。


お相手からのポストの署名を検証するためにPublickeyを取得する必要があって、Publickeyを取得するにはこのkeyIdのURLにリクエストを投げてPersonのJSONをもらわなきゃいけない。

Mastodon系などはkeyIdのURLにそのままGETリクエストしていて問題はなかった。んだけど、なんか「#main-key」付きって微妙なURLだなあ、とか思ってたこともあって、試しにURLの「#main-key」を削除してリクエストしたら問題なく200が返ってきて、無事JSONを取得できた。


だけど、今度はそれはそれで、keyIdのURLに「#main-key」なんてつけないで欲しいよなあ。「keyId」の意味がないのでは?

Fediverseの辺境で秘密基地

2023/12/18 [00:00:00] (月) 天気

この記事は Fediverse Advent Calender 2023 (第三会場)18日目の記事です。


Fediverseというネットの連合空間、ActivityPubという共通の言葉を喋るサーバー群というのが面白そうで「いっちょかみ」してみました。以下は、その時々の経緯というか思ったことの垂れ流しエントリとなります。

ちなみに、還暦過ぎのポンコツで、話が無駄にだらだら長いのはご容赦ください。



■レンタルサーバーとperlでおひとり様


MastodonやMisskeyをインストールして運用管理するスキルはわたしにはないので、自分のできる範囲、最小限のActivityPubサーバーをperlで自作実装しました。


レンタルサーバーとドメイン、perlがあれば、それ以外に新しく必要なものはなくて、このブログなど今まで使ってるロリポップのライトプランの環境で十分でした。


試しながら少しずつ実装していったんですが、おひとり様サーバーは、たぶんみんな大好き「秘密基地」ごっこ。

いちいち面白くて、すっかりハマりました。空いた時間のほとんどを費やしてます。


■おひとり様サーバーとして必要なことは2つ


・Fediverseの仲間入り、アカウントとして認識されること

・ActivityPubの決まりごと通りにGETやPOSTなど、リクエストのキャッチボールができること


■Fediverseにわたしが来た!


すみません。言ってみたかっただけです。

7月12日。Fediverseからアカウントとして認識されました。


何をどうすりゃいいのかまったくわからない状態からだったので、グーグル先生に聞きまくりです。

nodeinfo(json)

host-meta(xml)

webfinger(json)

actor.json(json)

以上4つのファイルを用意すればいいという話だったのでサーバーに設置。


今回作った自分のアカウント「@t2aki@tokoroten.doncha.net」をMastodonで検索してみたら、アカウントとして認識されました。

image

ただ無言で顔を出しただけなんですが、これで念願のFediverse仲間入り!です。


■ActivityPubおひとり様サーバー最低限の実装


アカウントとして認識されたら、後はActivityPubの決まりごとをちゃんとキャッチボールできればOKです…とか言って、これもまったくわかってなくて「そこからかよ!?」の状態でした。


リクエストのキャッチボールを始めるにはHTTP Signatureが必須になります。

(このリクエストはわたしが投げたものですよ、というのを保証するサイン・署名みたいなもの、という理解で大丈夫かな)


ところが、レンタルサーバーのロリポップでは署名のために一般的に良く使われているらしい「Crypt::OpenSSL::RSA」というperlのモジュールがない。つまり、Signature、署名ができない、ので立ち往生。

しかたなく、ローカルのPCに「Crypt::OpenSSL::RSA」をインストールして、PCのコマンドラインから投稿を送信することにしました。


7月26日。右往左往しながらも、Fediverseからアカウントとして認識されて、HTTP署名付きで投稿ができるようになりました。

発信専用と割り切ればこれでひとつゴール達成ということでしょう。

この時点でこのアカウントのフォロー/フォロワーはほかのサーバーに登録した自分のアカウントだけですが。


しばらくローカルPCからの発信専用でやってたんですが、WEB上で作業が完結した方が手間もなく気楽だし、また、ほかのひとの投稿をこのサーバーで読めないのは物足りなくなりました。

…というか。送信するのはローカルPCから、ほかのひとの投稿を読むのはMastodonのクライアントを立ち上げて、というのはやっぱり面倒くさいです。


ふたたびグーグル先生にお願いしたところ、署名するために必要な、PurePerlの(perlだけで実装されている、ユーザーレベルでインストール可能な)Cryptモジュールを見つけたので、ロリポップにインストールしました。

このperlだけで署名できるモジュールの作者さんには感謝するばかりです。


8月22日。HTTP Signatureを解決することで、やっとリクエストの送受信、キャッチボールができるようになりました。最低限の構成ですが、おひとり様ActivityPubサーバーということで大丈夫でしょうか。


■おひとり様サーバーのタイムライン


【ローカルタイムライン】

サーバーに登録しているユーザーの投稿が流れるタイムライン。

おひとり様なのでわたし一人の壁打ちタイムラインです。Fediverseに投げ込むには一意のIDが必要で、投稿へのURLもそれをもとに生成します。そのためにデータベースを使うのが手っ取り早いし、以前から使ってる自分メモ用の掲示板を改築して流用しました。


【ホームタイムライン】

フォローした人たちの投稿が流れ込んでくるタイムライン。

ここは考えなきゃいけないことがいろいろありました。


その1.

まず大前提として

「ひと様のデータは持たない、抱え込みたくない」

わたしのショボいスキルと還暦過ぎたポンコツの体力だと何があるかわからないので、リスク回避が最優先です。

その2.

タイムラインというからには「投稿は流れて消えていく」

流されてしまったものは見ない、アクセスしてたまたまその時その場にあるものを見るモノだということですね。

「袖すり合うも多生の縁」です。


ということで、こちらはデータベースも使わず、保存する投稿は、上限20個、保存期間最長1日。それ以上は古いものからところてん式に押し出されて削除、遡ることができないタイムラインということにしました。

(保存するNoteは宛先がPublic指定されているもの・わたし宛Mention投稿。それ以外は破棄)


そもそもホームタイムラインを見るにはログインが必要で、おひとり様サーバーでログインできるのはわたしひとり、見ることができるのはわたしだけです。


自分の使い方として、twitterもFacebookもそうですが、スクロールして遡るのはせいぜい2〜3画面だったので、上限20個保存ぐらいでも問題はありません。


アクセスしない間も、飛んでくるリクエストをcronで処理することにしたので、わたしが知らないうちに流れてきて、知らないうちに消えていく投稿の方が圧倒的に多い状態です。

SNSとの距離感はこのぐらいでちょうどいいんじゃないかと思ってます。


■タイムラインの育成、フォロー・フォロワー


なにはなくとも、まずフォローをして繋がらないと始まりません。

最初は、すでに登録して参加している別サーバーの別アカウントでフォローしているひとたちを、このおひとり様サーバーから少しずつフォローしました。

(聞いたこともない変な野良サーバーということもあってか、403や401で弾かれてすべてはフォローできませんでしたが)

こちらでフォローをしていくことで、ほかのひとの投稿を流し込んで読めるようになりました。


おひとり様サーバーでタイムラインを作ってると、フォロー/フォロワーでいうと、いかにフォローするのが大切かというのを実感します。


タイムラインというのは、盆栽とか本棚とかと同じ「よく育ってくれましたねえ」の世界。


twitterやFacebookだとフォローを見つけるのもそんなに大変でもないんですが、連合サーバー群だとなかなか難しくて、いくつかのサーバーにアンテナを張って少しずつこちらのタイムラインに持ってくるしかなくて。地引網でどばっと攫うのと、釣り竿を垂らして一本釣りするのと。それがまた面白いんですが。


サーバーごとの特徴があって、他のサーバーのアカウントをフォローして投稿の流入経路をひとつ増やすだけで、それまでになかった投稿が流れるタイムラインになります。

せっかくなので、いろんなサーバーをフォローしたいと思ってます。

(今ではフォローしているひとのブースト経由で他サーバーの様子も垣間見えるので、フォローを探すのもほとんどこのホームタイムライン経由になっています)


twitterなんかだとフォロワー数でのマウント合戦が見られますが、タイムラインの面白さは、フォロワーの数ではなくて、どれだけフォローしてるか、でしょう。


■おひとり様サーバーという名の秘密基地


ActivityPubという共通の言葉で繋がっているので、登録するサーバーに拘る必要はありません。どのサーバーにいても他のサーバーをフォローできる、繋がって広がるのがFediverseの特徴・メリットです。

…とはいえ、いろんなサーバー、それも個性的・特徴的なサーバーがたくさんあって、どのサーバーにしていいのか悩んでしまいますよね。


それなら、おひとり様サーバーを立ち上げて、そこを起点・窓口にActivityPubを喋っていろんなサーバーのアカウントをフォローしてFediverseに参加してみよう、そんなのが自分で作れたら面白そう、というのが始まりでした。

Activityを1つ実装するたびに、これってどうして必要?これは何か理由があるよね?など、いろいろ考えて、自分で決めて自分で作る手作り秘密基地です。


目の前にある20個だけでそれ以上は遡れないし検索もできないホームタイムラインは、穏やかに過ごせるもんだなあ、と眺めてます。

自分のために自分で作った場所というのはストレスフリーで居心地が良くて入り浸り状態。すっかりログインすることがなくなったtwitterやFacebookを見ていた時以上の時間をここで過ごすようになりました。


Fediverse空間のどこかでお会いすることがありましたら、どうぞよろしくお願いします。

だいたい映画、小説、アニメなどについて垂れ流してます。

鬼太郎誕生スゲー、復讐の記憶やべえ、トム クルーズおかしいだろ、やっぱルブランのアルセーヌ・ルパンだわ、など語彙力に問題のある投稿を見かけたら、それはたぶんわたしです。


ちなみに。

『鬼太郎誕生 ゲゲゲの謎』と『復讐の記憶』はわたしが今年映画館で観た映画でベスト。

この2本とも、おひとり様サーバーに流れてきた投稿で知った・気づいた作品です。フォローしたひとたちのおかげです。ほんとウチのおひとり様サーバーのタイムラインは「よく育ってくれました」(自画自賛)


■おひとり様サーバーを作るのに参考にさせていただいたサイト。


・まさに、このひと言。

「Webhook的に ActivityPub に投稿する実装を作った」

オープンな仕様 ActivityPub の力を借りて自前実装で他の実装とつながれる体験は心躍るものがあり


・perlでActivityPubサーバーを立ち上げるならこちらにすべてがあります。

「Fediverse入門―非中央集権型SNSサーバを作ろう!」


・静的ファイルだけでActivityPubサーバー構築。こちらの具体例が参考になりました。

「NetlifyとSupabaseでほぼ静的なActivityPubサーバ」


・こちらを発端としてActivityPub実装についてのサイトを辿りました。

「田舎の昼のサイレンbotをActivityPubで実装する(マストドンにアカウントを認識してもらう編)」


・レンタルサーバーとperlのCryptモジュール

「ロリポップ!レンタルサーバー」

「Crypt-Perl-0.38」


■蛇足というか手前味噌というか


わたしのActivityPub自作実装について。

Follow、Like、Announce、Attachment、Hashtagなどを少しずつ実装した時の具体的なメモをまとめてます(関連する各エントリは「ActivityPub」というタグづけしてます)

ActivityPubの共通言語として飛び交うJsonの具体的な例を残すようにしてますので、何かのお役にたてれば幸いです。


[2024/10/30 11:59:47]追記。

「おひとり様ActivityPubサーバーの自作実装」

というページも作ってみました。何かの参考になれば。

GBLシーズン17でACE到達

2023/12/17 [09:14:36] (日) 天気

ポケモンGOの対人戦GOバトルリーグ。シーズン16「時を超えた旅」でACE到達。


あれ?シーズン通算番号がなんかズレてるけど、GOバトルリーグのシーズンとメインのシーズンだとカウントが違ってたりするのかな??


てのはともかく。

12月2日スタートしたGBL(GOバトルリーグ)で、今日レート2007となってACE到達。初期レートが出たのは12月12日で、レートは1908からのスタートだった。

前シーズンは、ランク18になった頃からポケモンGO自体ほとんどやってなくて(夏の暑さにやられた)シーズン終盤になってぼちぼち再開したら初期レートは2131と過去最高でびっくりした。

そして、今期は従来通りやってやっぱりほぼ従来通り10日ほどでレートをもらってレート戦に入ったらやっぱり前々回ぐらいの初期レート1900前後…てことは、もしかすると、早い時点でそれなりのレートをもらえるのはちゃんとやってるガチ勢、ということなんだろうか。

ボケ老人のわたしのヘボいスキルだとこのあたりでの着地が適当・妥当てことなんだろな。


涼しくなってウォーキングもはかどるし、対人戦はその時間内であれこれ考えることが多くてボケ防止にもなるし、6年も続いてる&続けてるゲームなだけはある。ほんと飽きないんだよなあ。


まずはGBLでの目標をクリアしたのでこの後はゆっくり。

称号の上を目指してのレート戦はストレスもかかるんで、ただ楽しむためのゲームとはちょっとニュアンスが違ってくる。ストレスを感じながらゲームを遊ぶのもどうかと思うので、マイペースで遊んでいこう。

image
<<2026/1>>
    123
45678910
11121314151617
18192021222324
25262728293031
検索:

【最近の20件】