ActivityPubを使ってFediverseにたどり着く

2023/7/12 [02:17:04] (水) 天気

いや、なんのこっちゃだけど。

2023年、ツイッター亡き後の世界となった。ネット空間には祖国を奪われた難民たちで溢れかえり…というB級サイバーパンクSFの設定。


そこで再評価されることになった、実は古より存在するFediverseというネットの連合空間。ActivityPubという共通の言語で繋がるネット世界、ということになった。


てことで、「いっちょかみ」できるかなあ、とここ数日あれこれ検索しまくって試して、とりあえずmastdonで検索して仲間として検索結果に出るところまではたどり着いた。

image

最小限のActivityPub、いわゆるお一人様で、もちろん喋ることもフォローなどアクションをすることもできない。ただ、連合空間に顔を出した、だけなんだけど。


「mastodonなどに認識してもらえる」のがまずはゴールだったんで、ここまでやったことをメモ。

(すべてはネットで検索して得られたもので、先人たちに大感謝)


ActivityPubに参加するため用意するもの

サーバーやドメインをもっていることが前提。わたしはいつものlolipopサーバー。


どうやら以下の5つがあればActivityPubに顔を出すことはできる、っぽい。

nodeinfo(json)

まず最初サーバー情報のありかをこれで返す。

{                                                                                                                                                           
    "links":[
    {
        "rel": "http://nodeinfo.diaspora.software/ns/schema/2.1",
        "href": "https://tokoroten.doncha.net/nodeinfo/2.1"
    }
    ]
}


nodeinfo2.1(json)

サーバーの情報、でいいのかな。ここにGETでアクセスされて、ウチはactivitypubやってますよ、ユーザーは1人ですけどね、というのを返す。

{                                                                                                                                                            
  "openRegistrations": false,
  "protocols": [
    "activitypub"
  ],
  "software": {
    "name": "tokoroten",
    "version": "0.1.0"
  },
  "usage": {
    "users": {
      "total": 1
    }
  },
  "version": "2.1"
}


host-meta(xml)

webfingerのURLを返す。uriは検索対象のユーザー名の文字列に置換される。


<?xml version="1.0"?>                                                                                                                                        
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
<Link rel="lrdd" type="application/xrd+xml" template="https://tokoroten.doncaha.net/.well-known/webfinger?resource={uri}" />
</XRD>


webfinger(json)

host-metaで得られたwebfingerのURLにGETでアクセスされるのでユーザー情報のエンドポイントを返す。


具体的にはこんなGETリクエストが飛んでくる。

https://tokoroten.doncaha.net/.well-known/webfinger?resource={uri}

https://tokoroten.doncaha.net/.well-known/webfinger?resource=@t2aki@tokoroten.doncha.net


{                                                                                                                                                            
  "subject": "acct:t2aki@tokoroten.doncha.net",
  "links": [
    {
      "rel": "self",
      "type": "application/activity+json",
      "href": "https://tokoroten.doncha.net/t2aki"
    }
  ]
}


とりあえず確認するには、

「WebFinger」https://webfinger.net/

↑たとえばこんなページがあるので、ここの検索窓にユーザー名を入れて、以上の情報が表示されたらwebfingerは正しく設定されている。


actor(json)

webfingerで取得したユーザーのURLにアクセスするとこの情報を返す。


{                                                                                                                                                            
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/security/v1"
  ],
  "id": "https://tokoroten.doncha.net/t2aki",
  "type": "Person",
  "url": "https://tokoroten.doncha.net/t2aki",
  "inbox": "https://tokoroten.doncha.net/t2aki/inbox",
  "outbox": "https://tokoroten.doncha.net/t2aki/outbox",
  "followers": "https://tokoroten.doncha.net/t2aki/followers",
  "following": "https://tokoroten.doncha.net/t2aki/following",
  "name": "t2aki",
  "preferredUsername": "t2aki",
  "summary": "@t2aki@tokoroten.doncha.net",
  "icon": {
      "type": "Image",
      "mediaType": "image/jpeg",
      "url": "https://tokoroten.doncha.net/images/prof-image.jpg"
  },
  "pubKicKey": {
      "id": "https://tokoroten.doncha.net/t2aki#main-key",
      "owner": "https://tokoroten.doncha.net/t2aki",
      "publicKeyPem": "-----BEGIN PUBLIC KEY-----\n略==\n-----END PUBLIC KEY-----",
      "type": "Key"
  }
}


nodeinfoやhost-metaはわかってないまま設置。

たぶん、webfingerでユーザー情報のURLを返して、そのURLにアクセスするとユーザー情報を得ることができますよ、というやりとりがあればまずは第一関門突破だと思われる。


HTTPでリクエストの投げ合いをして相互理解を深める。WEBの基本。


と、わかったようなことを書いたけど、ここにいたるまでハマりまくった。


サイトの構成をどうすればいいのか、そもそもそこから。

結論。考える必要はまったくなかった。

ActivitiyPubはディレクトリ構造とか拘束しないというか全然関係ない。全部jsonやxmlの設定ファイルでリクエストに返答できればいいだけだった。


アクセスされて、ActivityPubを構成するファイルを返す時のヘッダは以下がMUST

Content-Type: application/activity+json; charset=utf-8

てことは動的にヘッダをつけて返答する必要があるのか、ということで、スクリプトで対応。そのために.htaccessのrewriteruleで振り分けることにした。※1


.htaccess

RewriteEngine On                                                                                                                                             
RewriteCond %{QUERY_STRING} ^resource=(.*)$
RewriteRule webfinger.* script-finger%1 [L]
RewriteRule nodeinfo$ script-nodeinfo0 [L]
RewriteRule nodeinfo/2\.1$ script-nodeinfo [L]
RewriteRule host-meta$ script-hostmeta [L]
RewriteRule t2aki$ script-actor [L]

ここでのハマり。

apacheのrewriteruleはそのままだと「クエリを含まない」

fingerはresourceというクエリをつけてやってくる。そのクエリが分からないんじゃ何を求められてるのかわからない。それを解決するにはRewriteCondでクエリを判定させてやれば良い、てことにたどり着くのに2時間弱。


この先、フォローしたり投稿したりするには公開鍵秘密鍵で署名する必要があって、わたしの脳みそで理解できるレベルではない。そもそもlolipopではCrypt::OpenSSL::RSAのモジュールが使えないのでないものねだり。


手元、ローカルで作って手作業で鍵を作ってリクエストを投げる、ということを考えるしかなさそう。それもHTTPのヘッダ構成を調べる必要があって、高いハードルを見上げすぎて首を痛めるレベル。

とはいえ、せっかくだし、もう少し頑張ってみるかなあ。


※1

検索していてビックリしたのが静的ファイルだけでActivityPub実装してるかたいらっしゃった。

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


今回まででとても参考になったサイト

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

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

ActivityPubの実装についてのメモ

本当に助かりました。多謝!!!


さっそく、ひとり言掲示板「ところてんx10」が役に立った、ぞ。


[2024/09/04 22:55:57]

nodeinfo→nodeinfo2.1のフェーズを追記。

ひとり言掲示板:ところてんx10

2023/7/6 [23:29:00] (木) 天気

ひとり言、メモ用掲示板を作ってみた。

・保存するのは100個まで。

・画像投稿はできない。

・検索機能はない。

・カテゴリづけもない。

・表示順は日付の新しいもの順だけ。

・一度書いたものを編集、削除することはできない。


投稿できるのはテキストだけ。

テキストの文字数制限はたしか80KBぐらいまでにしたのでけっこう長めのものも書き込める。


というなんかめちゃくちゃ手抜きのスクリプト。

一応RDFというかRSSは取得できるようにしてみたけど、これはおまけ。

image

スクリプト的には。公開はしてないけど、すでにメモ代わりのひとり言掲示板みたいなものは作って今も使っていて、ほぼそれの流用で、そこから検索機能やあれこれ機能を削っただけのシロモノ。


その、今すでに使ってるメモは、発注納品締切とか、スーパーでの買い物、ポケモンの対戦結果、医者、内科や歯医者、目医者の予約とかとか。

ほんとのメモ、めっちゃ個人的な備忘録。そんなものを公開の場に出すワケにもいかないし、そもそもそんなものわたし以外のひとには意味も価値もない。


ひとり言というなら、そのメモで勝手にやってりゃええやろ、というのはもっともな話。


とはいえ。

ツイッターにほとほと愛想が尽きて、みけさんもいないとなると、snsを利用することもない。

なので、この雑記帖に引きこもるぞー!てのは少し前に言ったけど、なかなか雑記帖に書くようなボリュームのネタもない。

なので、雑記帖の元ネタになりそうなことをメモする場所にしようかと。


それでも、今のその非公開のメモとやらでやってりゃええんとちゃうんか、は変わりないんだけどね。

人通りのほとんどないここ、辺境とはいえ、公開する、ひと目につく可能性があると、それを意識することになる。

少しはマシなもの、誰かにとって有用なものが出てくる、かもしれない。


底辺とはいえ、いちおう出版社で編集なんてのをやってた昭和平成の頃、痛感したのが、ひと目に晒してナンボ、ということ。ひと目に晒すことで面白いものになるというのは事実で真実。


そんなひとり言掲示板、せっかくだからちょっと考えて名前もつけた。

「ところてんx10」

ところてん式に古いものから押し出されてなくなっていく。

保持するのは100だけ。てことで「ところTENx10」という寒いおやじギャグをドヤ顔。

「ところてんx10」


てのはともかく、みけさんがいなくなると、時間を持て余すんでスクリプトをいじる時間に当ててるだけっちゃだけのそれだけの話でもあるなあ。

twitterが使えなくなった

2023/6/29 [01:44:56] (木) 天気

twitterのapiが昨日あたりから死んでる。認証で弾かれて使えない状態。

ていうか。APIの仕様が変わったらしくあちこち阿鼻叫喚の様相。呆れたというかツイッターにはうんざりげんなり。


twitterは、web本棚で本棚に本を登録した時に書名をツイートしたり、本棚アカウントにリプライして、自分の本棚を検索したり、といったことで利用している・していた。


ガラケーの時に、自分の本棚を開いても、検索したりする状況で、あのチマチマした画面が使いにくくてうっとーしーったらありゃしない。なもんで、ツイッターを利用することにした。


…という経緯でもあるんで、ガラケーが終了してスマホ前提なら画面、UI的なことは、それほど問題じゃない。web本棚のツイートについて確認してみるとほぼ利用実態もない。公開しているサービスの一部を取り止めにするのは、サービスレベルの低下だろ、と言われるとごめんなさい、だけど、この際、いろいろ不明、不透明なツイッター依存は取り止めにするしかない。


PC版

image

スマホ版

image

趣味は読書2 https://doncha.net/

このWEB本棚で、ツイッターを使う、ツイッターのAPIを使ってる部分をばっさり削除してまわった。

何度も言ってる、というか何度も自画自賛するんだけど。

このWEB本棚は実によくできていて、役割分担単位でのモジュール設計のおかげで、ツイッターが絡んでるところを排除するのもスグだった。これを作った17年前の自分を褒めてあげたい。


んで、身も蓋もないことをぶっちゃけると。

このWEB本棚は「あれ?これって読んだっけ?持ってなかったっけ?」

の確認をどこでもしたいという、かなりしょぼいところが始まり。

なので、元々は「既読・未読」の分類だけ。そのほかの機能はオマケ。


読んだことさえ忘れることがあるんで、買っただけで積んでる本はまったく覚えてない。本屋さんで書棚を眺めていて、を!これは面白そうじゃん!と思って、あれ?ひょっとしてもう読んでたり買ってたりしてないか?実際、部屋には同じ本が2冊あったりするわけで。

それにはネットでアクセスできる自分の本棚が重宝する。

という自分都合でやってるということもあるからこそ、20年近くも続いてる。


ツイッターは行政なんかの公的機関も通信インフラとして使ってる。

私企業に依存してるととんでもないことになる良い例というか悪い例というか。FacebookもLINEも同じ穴のなんちゃら。

ツイッターの今の状態はとても健全とは思えないんで、政府・行政は自前、内製で使いやすい通信インフラを構築する時じゃないかな。


[06/29 12:17:18]追記

とか、のんきなコトを書いてる場合じゃなかった。


2011年11月に公開した同人誌応援サイト「創作文芸見本誌会場HappyReading」の方は、サイトを閉鎖せざるを得なかった。

Twitterアカウントでログインして本を登録するサイトなんだけど、ログインできなくなってるよ、と嫁さんに聞かされてビックリ。OAuth認証は生きてると聞いてたのに、それもダメになったのか。てことは利用しようにも利用できない状態。ほんと困った、というか弱った。なんでまたそんな根本的な部分を使えなくするんだか。

しかたがないので、トップページにお知らせを上げて、サイトの閉鎖作業。


WEB本棚の方はメールアドレスで登録、ログインすることにしてるんだけど、実はこれもあやしい、かな。メールアドレスは個人情報にあたるので本当ならPマークなんてのが必要となる、はず。ただ、このサイトを「業」としてやってない、個人の趣味の範囲だから大丈夫かなあ、と思ってるんだけど、ツッコミというか突っ込まれどころかもしれん、か。


いろいろ面倒な時代になったなあ。

スパイダーマンとか古処誠二とか

2023/6/27 [17:57:36] (火) 天気

昨日はスパイダーマン・アクロス・ザ・スパイダーバース

いやもう評判以上で2時間半ほどもうバクバクうるうるしっぱなしだった。

大切なひとを守るために頑張っていて、大切なひとを守るために頑張ってるひとを全力で応援するひとたちがいて、という王道、ド直球。

昔っからわたしは家族の話に抵抗力がなくて、すぐに涙腺がイッてしまう。

そこにもってきて、週刊少年ジャンプだ。仲間が集結して応援するんだからもういかんかった。


マルチバースの均衡を保つためvs家族もマルチバースも守るため、という図式。

ツッコミどころとしては、え?それってミゲルが始めちゃったんじゃないの?というのがあって、グウェンのお父さんの仕事が?ピーターの子供にも?とかとかネタバレになるのであまり触れない。


キャラ的には今回の新キャラ、ドレッドヘアのホビーが美味しいところをもってく。もろ好みのタイプだった。


今日は古処誠二『敵前の森で』

やっぱ間違いないがないなあ。傑作。

最近の古処誠二は『ルール』や『七月七日』の頃のようなウエットなところがないんだけど、みんながみんな、その時その場での自分の最善を尽くしたその結果、という軸はブレず、本書もホント熱い。冒頭、佐々塚兵長のエピソードで始まるプロローグがめっちゃ効いてくる。というかみんなの行動原理がここに集約されてたんだということに最後まで読んで改めて気づかされて、じわ〜っと滾る。


良いフィクションの摂取ができた昨日今日だった。

て、2作ともわたし狙い撃ちされてた。


明日から週末にかけてはシフト仕事。

これがもうさすがに体力の限界なんだよなあ。朝シフトは4時起きだし、夜シフトは帰宅が0時を回る。還暦の体力でこんなシフトは無理。健康保険加入で人間ドックなんかがありがたいというか美味しいんだけど、そもそも健康を害するようなシフトなわけで、改めて見直すとこれって本末転倒。


てなことを今まではツイッターなどSNSでたらたら書き散らしてたんだけど。

みけさんもいなくなり、世界に向けて発信するぞ!みたいなこともないんで、昔に戻ってこっちに引きこもることにした。

SNS利用はこの雑記帖更新告知と、ゲームを進めるために作ったポケモンGOのツイッターアカウントだけにする。


ちょっと前にも書いたように、この雑記帖なら、書き散らかしたコンテンツの管理も自分でコントロールできるし、呆けてしまったり、死んでしまったりしたら、レンサバとの契約が切れてそれっきりで後腐れもないしねー


敵前の森で

『敵前の森で』

古処 誠二

お線香をいただいた

2023/6/26 [13:45:28] (月) 天気

嫁さんの友人さんからみけさんの供養にということでお線香をいただいた。

ウチはわたしの両親と嫁さんの両親の位牌が本棚の上にあり、手向け水はお供えしていた。


線香立てがないので、買い出しついでにスーパーの隣の仏具屋さんで購入。

灰をいれて差して立てるものや、寝かせて使うものなど宗派も絡んでいろいろあった。

一度に大量に使うこともなさそうなので、一本差しのものにした。たぶん、仏具とはちょっとジャンルが違って、デザインも可愛いのでみけさん向けだ。


人間より寿命の短い生き物とのつき合いには必ず死別がともなう。

それは理解してるんだけど、わかっちゃいるけど、というやつで。一緒に過ごした時間の重みがなくなるわけもなく。空白を埋められるわけでもなく。置き換えもきかない。


よく言われることだけど。

死別に慣れることなどありえない。

猫と死別するのは4回目。だけど、それはみな各々個別の出来事。みけさんと死別するのは今回が初めてだ。

ヒザ下の高さの目線位置の何もないことに気づかされることが続くんだろうと思う。

ベッドに乗ってくるみけさんがいない明け方に慣れるのも時間がかかるんだろうと思う。


気がついたら猫3人分と、人間4人分のなにがしかが本棚の上にある。

image

そういや、みけさんは鯛だけは飽きずに欲しがった。

体調が悪くて食欲がない時でも食べるものがあるのは安心感。


にしても、最初嬉しそうに飛びついてたカツオに飽きたのにはビックリで、鯛ももしかして、と不安がよぎったけど、鯛だけはいつ出しても飛びついて食べてくれた。なもんで、地元スーパー3件の鯛のさくの値段はいつも把握してたなあ。

<<2026/2>>
       
1234567
891011121314
15161718192021
22232425262728
検索:

【最近の20件】