ほんと、今年No.1だなー。14:07:43]追記。401でエラーを出してた某サーバーのactor情報がこの変更で取得できたので、やっぱりGETにSignatureがなかったのが問題だったのか...。11:46:23]追記。SignatureをつけてGETしても403で弾かれるサーバーがあった。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」なんてつけないで欲しいよなあ。(第三会場)18日目の記事です。Fediverseというネットの連合空間、ActivityPubという共通の言葉を喋るサーバー群というのが面白そうで「いっちょかみ」してみました。以下は、その時々の経緯というか思ったことの垂れ流しエントリとなります。ちなみに、還暦過ぎのポンコツで、話が無駄にだらだら長いのはご容赦ください。■レンタルサーバーとperlでおひとり様MastodonやMisskeyをインストールして運用管理するスキルはわたしにはないので、自分のできる範囲、最小限のActivityPubサーバーをperlで自作実装しました。レンタルサーバーとドメイン、perlがあれば、それ以外に新しく必要なものはなくて、このブログなど今まで使ってるロリポップのライトプランの環境で十分でした。試しながら少しずつ実装していったんですが、おひとり様サーバーは、たぶんみんな大好き「秘密基地」ごっこ。いちいち面白くて、すっかりハマりました。空いた時間のほとんどを費やしてます。■おひとり様サーバーとして必要なことは2つ・Fediverseの仲間入り、アカウントとして認識されること・ActivityPubの決まりごと通りにGETやPOSTなど、リクエストのキャッチボールができること■Fediverseにわたしが来た!すみません。言ってみたかっただけです。Fediverseからアカウントとして認識されました。何をどうすりゃいいのかまったくわからない状態からだったので、グーグル先生に聞きまくりです。nodeinfo(json)host-meta(xml)webfinger(json)actor.json(json)以上4つのファイルを用意すればいいという話だったのでサーバーに設置。今回作った自分のアカウント「@t2aki@tokoroten.doncha.net」をMastodonで検索してみたら、アカウントとして認識されました。無言で顔を出しただけなんですが、これで念願のFediverse仲間入り!です。■ActivityPubおひとり様サーバー最低限の実装アカウントとして認識されたら、後はActivityPubの決まりごとをちゃんとキャッチボールできればOKです...とか言って、これもまったくわかってなくて「そこからかよ!?」の状態でした。Signatureが必須になります。(このリクエストはわたしが投げたものですよ、というのを保証するサイン・署名みたいなもの、という理解で大丈夫かな)ところが、レンタルサーバーのロリポップでは署名のために一般的に良く使われているらしい「Crypt::OpenSSL::RSA」というperlのモジュールがない。Signature、署名ができない、ので立ち往生。しかたなく、ローカルのPCに「Crypt::OpenSSL::RSA」をインストールして、PCのコマンドラインから投稿を送信することにしました。右往左往しながらも、Fediverseからアカウントとして認識されて、HTTP署名付きで投稿ができるようになりました。発信専用と割り切ればこれでひとつゴール達成ということでしょう。この時点でこのアカウントのフォロー/フォロワーはほかのサーバーに登録した自分のアカウントだけですが。ローカルPCからの発信専用でやってたんですが、WEB上で作業が完結した方が手間もなく気楽だし、また、ほかのひとの投稿をこのサーバーで読めないのは物足りなくなりました。送信するのはローカルPCから、ほかのひとの投稿を読むのはMastodonのクライアントを立ち上げて、というのはやっぱり面倒くさいです。グーグル先生にお願いしたところ、署名するために必要な、PurePerlの(perlだけで実装されている、ユーザーレベルでインストール可能な)Cryptモジュールを見つけたので、ロリポップにインストールしました。このperlだけで署名できるモジュールの作者さんには感謝するばかりです。Signatureを解決することで、やっとリクエストの送受信、キャッチボールができるようになりました。最低限の構成ですが、おひとり様ActivityPubサーバーということで大丈夫でしょうか。■おひとり様サーバーのタイムライン【ローカルタイムライン】サーバーに登録しているユーザーの投稿が流れるタイムライン。おひとり様なのでわたし一人の壁打ちタイムラインです。Fediverseに投げ込むには一意のIDが必要で、投稿へのURLもそれをもとに生成します。そのためにデータベースを使うのが手っ取り早いし、以前から使ってる自分メモ用の掲示板を改築して流用しました。【ホームタイムライン】フォローした人たちの投稿が流れ込んでくるタイムライン。ここは考えなきゃいけないことがいろいろありました。その1.まず大前提として「ひと様のデータは持たない、抱え込みたくない」わたしのショボいスキルと還暦過ぎたポンコツの体力だと何があるかわからないので、リスク回避が最優先です。流されてしまったものは見ない、アクセスしてたまたまその時その場にあるものを見るモノだということですね。「袖すり合うも多生の縁」です。いうことで、こちらはデータベースも使わず、保存する投稿は、上限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本とも、おひとり様サーバーに流れてきた投稿で知った・気づいた作品です。フォローしたひとたちのおかげです。ほんとウチのおひとり様サーバーのタイムラインは「よく育ってくれました」(自画自賛)■おひとり様サーバーを作るのに参考にさせていただいたサイト。・まさに、このひと言。力を借りて自前実装で他の実装とつながれる体験は心躍るものがあり・perlでActivityPubサーバーを立ち上げるならこちらにすべてがあります。・静的ファイルだけでActivityPubサーバー構築。こちらの具体例が参考になりました。・こちらを発端としてActivityPub実装についてのサイトを辿りました。■蛇足というか手前味噌というかわたしのActivityPub自作実装について。いうタグづけしてます)ActivityPubの共通言語として飛び交うJsonの具体的な例を残すようにしてますので、何かのお役にたてれば幸いです。11:59:47]追記。「おひとり様ActivityPubサーバーの自作実装」というページも作ってみました。05:53]目が覚めてしまった...老人は朝が早い、てのを実感するしか。いつ勝者が判明するのかhttps://www.bbc.com/japanese/articles/cy5le1qxzggoさすがに気になるんだが。