Fediverseの辺境で秘密基地
この記事は 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で検索してみたら、アカウントとして認識されました。
ただ無言で顔を出しただけなんですが、これで念願の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サーバーの自作実装」
というページも作ってみました。何かの参考になれば。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
GBLシーズン17でACE到達
ポケモンGOの対人戦GOバトルリーグ。シーズン16「時を超えた旅」でACE到達。
あれ?シーズン通算番号がなんかズレてるけど、GOバトルリーグのシーズンとメインのシーズンだとカウントが違ってたりするのかな??
てのはともかく。
12月2日スタートしたGBL(GOバトルリーグ)で、今日レート2007となってACE到達。初期レートが出たのは12月12日で、レートは1908からのスタートだった。
前シーズンは、ランク18になった頃からポケモンGO自体ほとんどやってなくて(夏の暑さにやられた)シーズン終盤になってぼちぼち再開したら初期レートは2131と過去最高でびっくりした。
そして、今期は従来通りやってやっぱりほぼ従来通り10日ほどでレートをもらってレート戦に入ったらやっぱり前々回ぐらいの初期レート1900前後…てことは、もしかすると、早い時点でそれなりのレートをもらえるのはちゃんとやってるガチ勢、ということなんだろうか。
ボケ老人のわたしのヘボいスキルだとこのあたりでの着地が適当・妥当てことなんだろな。
涼しくなってウォーキングもはかどるし、対人戦はその時間内であれこれ考えることが多くてボケ防止にもなるし、6年も続いてる&続けてるゲームなだけはある。ほんと飽きないんだよなあ。
まずはGBLでの目標をクリアしたのでこの後はゆっくり。
称号の上を目指してのレート戦はストレスもかかるんで、ただ楽しむためのゲームとはちょっとニュアンスが違ってくる。ストレスを感じながらゲームを遊ぶのもどうかと思うので、マイペースで遊んでいこう。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
おひとり様サーバーのおもて側
ActivityPubを喋ってFediverseと繋がる、とか言っても、それって具体的にどう見えているのかわからないと、ナンジャソレだと思う。
ActivityPubとか裏側の面倒くさそうなのはとりあえず置いておいて。
使い方見え方、おもて側の紹介をしてみる、のが今回のエントリ。
ActivityPubを通じて、他のサーバー(インスタンス)に投稿したり投稿を閲覧したりする具体例のひとつと見てもらえれば。
【コントロールパネルっぽもの】
ログインするとページの最上部に
・投稿を記入するテキストエリア
・添付画像
・データベースを検索するチェックボックス
・こちらでフォローするためのアカウント名入力欄
フォロー/フォロワー数とフォローのリスト表示のためのリンク
・他のFediverseの投稿をこちらで表示させるためのURL入力欄
などのコンパネっぽいものが並ぶ。
その下は
・フォローされたら確認と承認ボタンのエリア
・Likeされたらその表示エリア
・Mentionされたらその表示エリア
が表示される。
他サーバーの投稿をこちらで表示させるのは。
ここからブーストしたり、いいねしたりすることで、おひとり様サーバーのフォロー/フォロワーを増やす可能性に繋がるんで、けっこう重宝する機能。
※これはログインユーザーにだけ表示される。
【ホームタイムライン】
フォローした人の投稿が最大20個並ぶエリア。
個々の投稿には
・Announce=ブーストボタン
・Like=いいねボタン
絵文字は対応してない。
こちらでフォローしたいろんなサーバーのいろんな人の投稿が流れ込んでくる。ActivityPubを通じて他のサーバーと繋がってるからこそ閲覧できる。
例えば。Twitterにログインして投稿を読んでいて、Facebookの投稿をそこでは閲覧できない。でも、Fediverseに参加しているとTwitterだけじゃなくてFacebookの投稿も同時に閲覧できる、みたいなもの。
読んでいてほんとに面白い。
サーバーごとで特色があるし、フォローしたひとたちは当然ながらわたしの嗜好・志向とあったひとたちなので、楽しくないわけがない。
上限20個でそれ以上は遡れないタイムラインだけど、各々の投稿者さんのoutboxは取得できる=アカウントのプロフィール・過去投稿(の1ページ分)を見ることはできるので、20個は少ないようで、少なくないボリュームでもある。
MastodonやMisskeyなどのPWAやアプリだとJavascriptやAPIを駆使して、非同期で新着の投稿を取得&表示させている。んだけど、わたしはJavascriptがよくわからないので、Ctrl+Rや、画面を下に引っ張って手動での更新。
今のところ、特に不便は感じてない。
※これはログインユーザーにだけ表示される。
【ローカルタイムライン】
おひとり様なのでこのサーバーではわたしの壁打ちが並ぶだけ。
「edit」は、削除と編集更新。
※これはログイン不要で誰でもみることができる。
ActivityPubを喋ってほかのサーバーと繋がるというのはこういうことにもあって。
↑Fediverseの他のサーバーにおひとり様の壁打ちが投げ込まれて、向こう側で表示されることになる。これがあるからこそ、ActivityPubとFediverseの面白いところ。
他のサーバーの投稿が流れ込んでくるホームタイムラインと同じく、ローカルタイムラインに投げ込むだけで、ツイッターにもFacebookにも投稿される、ようなもんだ。
よく言われるように、TwitterやFacebookの代替になるかと言われるとそれは無理で無茶。
億単位のひとがひとつの場所に集まってる化け物と同じになれるわけがない。
だけど、いろんなサーバーと繋がる、分散して独立・存在するメリットはあるはず。
わたしはFacebookにはまったくアクセスしなくなったし、Twitterもほとんどアクセスしなくなった。
Twitterは呪術廻戦やゲ謎の考察、ファンアートを漁るためにたまにアクセスするんだけど、関係のないツイートがぶら下がってるんでうんざりする。どうにかならないのかなあ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
Fediverseで参加してるサーバー紹介
ActivityPubという共通の言葉でつながるFediverseサーバー群が面白くてperlでおひとり様サーバーを自作実装した、というエントリをオンラインイベントに投入した。
「Fediverse Advent Calendar 2023」
https://adventar.org/calendars/8730
※わたしのエントリは2023/12/18(第3会場)
イベントなので、「デスマス調」でがんばって、長くなっても面白くないだろうし、サーバーを立ち上げるところまでで絞って書いてみた。
…てことで、書いたけど削ったところをこちらで追記。
おひとり様サーバーのタイムラインを作るためには、ほかのサーバーに参加していて、そっちでフォローするひとを見つけてくる必要があるよね。という話。
いまわたしが参加しているFediverseのサーバー(インスタンス)
https://bookwor.ms/
登録日:2017年8月2日
「本好きのためのMastodonサーバー」で、6年ほど前、毎年毎年電子書籍元年だった頃に参加。たまたま電子書籍関係のひとたちの飲み会で管理者の@skoji@bookwor.msさんと同席して猫の話をした記憶。
当時はMastodon?なにそれ状態で、社会人のサークル活動というか本好きのひとが集まるmixiみたいな?という捉え方しかできてなかった。
こちらのローカルタイムラインは本好きのひとたちの本や映画、美術館、博物館なんかの情報が静かにながれてきていて居心地がとても良い。参考になったり気づかされることが多い。とか言いつつ、ツイッターにどっぷりだったのでしばらく幽霊部員だった(て、大学のサークル感覚)
イーロン・マスクの登場でツイッターが終了して、個人的には6月に27歳のみけさんがいなくなったことが大きくて、自分の環境を変えるタイミングってあるんだなあ、ということでご無沙汰してたこちらを眺めて、改めて使ってみて、MastodonとはなんぞやActivityPub?みたいな調べ物を始めることとなった。
※残念ながら、今日時点、新規登録は受け付けてない。
以下は、登録日を見てもらえばわかるかと思うけど、ActivityPubで飛び交うJSONの具体例が欲しくて登録参加させてもらった。
https://mstdn.jp/
登録日:2023年7月16日
Mastodonの日本サーバーといえばとりあえずここだということで登録してみた。ローカルタイムラインはカオス。正直なところ、なにがなにやらよくわからないまま。
参加者が多いからしょうがないと思うけど、見通しの悪いツイッターという印象。たぶんそれって、個人設定とかちゃんといじれば大丈夫、かな。
FollowやAnnounceなどなど、JSONの実物をこのアカウントとやり取りして採取していた・している(感心できない使い方、参加者ですみません)
https://himagine.club/
登録日:2023年7月21
MastodonだけじゃなくてMisskeyもどんなJSONが飛んでるのか具体例を知りたくて最大手と言われてるMisskey.ioを見たところ、盛大な絵文字の奔流ついていけず。老眼だし無理。
Misskey系はだいたい表示が重たい。画面内の情報量が多すぎてついていけない。
…と思ってたところ、見かけたのがこちら。firefishというサーバーでMisskey系ということだし、参加者さんもわたしの観測範囲では静かな印象で、落ち着けそうだったので登録。
緩やかに日常風景が流れてくるローカルタイムラインで違和感疎外感も覚えなくて、アクセスする頻度こそ低めだけど、まったり眺めて過ごせる。
https://fedibird.com/
登録日:2023年7月26日
こちらはローカルタイムラインがないMastodon。ということでなにが違うんだろかと、具体的なJSONを見てみたくて登録(招待制だけど、管理者の@noellabo@fedibird.comさんが時々招待コードを流してくれる)
わたしの見た、めちゃくちゃ小さい範囲だけで言っちゃうと、ここが一番ツイッターに近い。登録して居座った。
タグや検索で共通の興味をもつひとを捕捉できるのがありがたくて、言葉はアレだけど、こちらから「芋づる式」におひとり様サーバーでフォローするひとを引っ張ってくることが多い。
↓fedibirdの招待コード
https://fedibird.com/invite/NGBid2CH
もし興味をお持ちでしたらこちらからどうぞ。
ActivityPub確認検証のために参加したサーバーだけど、mstdn.jp以外はどれもオススメできる(mstdn.jpはすみません。ほとんど見てない)面白いサーバーで、サーバー管理者の顔が見えるところも安心できる要因のひとつ。
どのサーバーもFediverseに繋がるので、あまり深く考えずに「とりあえず」どこかに登録参加することをおすすめします。
(わたしは絵文字文化が苦手なので、Misskey系よりMastodon系の方が好き、かな)
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
網脈絡膜萎縮
11月10日の検診。相変わらずで、特に緊急なことはなく。
とはいえ、もう歳だし、この人間ドックもいつまで受けられるかわからない。毎回ひっかかってた目が今年もやっぱりひっかかったので、今回は眼医者に行くことにした。
2008年。最初にひっかかった時に地元の有名眼科にいって診てもらったんだけど、拍子抜けするぐらいあっさり、ナニカアッタラマタキテネー(カタカナ)
大したことはないんだなあ、ということでずっと放置。
https://t2aki.doncha.net/?id=1214705446
今回は地元の別の眼科で診てもらった。
家人が診てもらってるところで、ここの先生は腕が良くて、慈恵医大の眼科部長とも繋がってるらしい。眼科と小児科というレアな?お医者さんだ。
眼底検査を始め、あれこれ3時間弱ほど検査。
網脈絡膜萎縮というやつ。
ほんらいもう少し厚みがあるはずの膜なのに、薄くなってるところがある、ということらしい。
原因はほとんど眼底出血。なんだけど、わたしにその経歴はない。
先生によると、生まれつきの可能性。
萎縮が広がると視力に影響するので経過観察。定期的に検査しましょうということだった。
還暦、60歳過ぎて、まさか生まれつきの何かが見つかるのって、新鮮な驚きだった。
まじかー。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
GBLシーズン16でACE到達
ポケモンGOの対人戦GOバトルリーグ。シーズン16「冒険の日々」シーズンでACE到達。
今期は9月1日スタート。で、今日は11月15日、今までで一番遅い日にちでのACE達成だった。
初期レートは過去最高の2131でちょっと嬉しかった。タイミングなんだろなあ。その後1セットやってACE到達。なんせ5戦全敗してもレートは2000超が確定の初期レートなので、安心。
にしても。今期はまったくモチベーションが上がらなくて、それでも9月10日すぎぐらいまではそれなりにGBLに参戦してたんだけど、ぱったりやらなくなった。GBLではなく、そもそものポケモンGO自体、立ち上げない日々が続いていた。
最大の原因は暑さ。
わたしはがっつりメタボ、生活習慣病で毎月医者通いするポンコツ。ウォーキングを1万歩目安でやってたんだけど、この夏の暑さでは無理。そんなところにもってきてナイアンティックは何を考えてるんだか、ユーザーの作ったルートを辿るタスクなんかも導入して、うんざりしてしまった。ひらたくいうと「このくそ暑い時に、やってられっか」だった。
ということを思いかえすに。わたしにとってポケモンGOはIngressからの流れのお散歩アプリ、ゲームとしての位置が大きかったんだなあ、と。
Ingress、ポケモンGOのウォーキングのおかげで、メタボの数値が先生も感心するぐらいには好転したのも事実。
で、ポケモンGOを立ち上げないと、GBL(GOバトルリーグ)へのモチベーションもがっつりなくなった。
GBLは集中力という名の体力が必要なので、やっぱりこのくそ暑さで消耗してる時にやれるもんじゃなかった。
もちろん、それだけじゃなくて、ほかもろもろ時間を使わなきゃいけないことがあったことはあったけど、時間てのは作るものだし、時間の取り合いでポケモンGOの優先順位ががくっと下がったということ。
今期はまだ今月25日までやってる。時間が取れれば参戦するかぁ、ぐらいでやっていこう。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」