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のフェーズを追記。

[更新]2024-09-04 23:52:13

施餓鬼とかソラマチとか

2012/7/12 [20:12:40] (木) 天気

わが家の猫たち、23歳と12歳のお墓参り。毎年、荼毘してもらったお寺さんの施餓鬼に行くことにしている。猫たちの名前を書いた小さな卒塔婆に印をもらって、焼香してくる。一日4回だかにわけて焼香があるんだけど、いつも満員御礼。この日はこのお寺さんに犬や猫、ハムスターや鳥たち、もろもろの霊が集まってる、かも。いや、いろんな名前が読み上げられるので、ペットとはいえ妙な名前をつけちゃいけません。毎年、梅雨末期の蒸し暑く、日差しも強烈になるこの時期。今年は雨まじりで、日差しこそなかったものの、湿気がひどくてまいったなあ。

image

その後、いつも精進落としとして、昼飯に日本酒。今年は浅草の銀鯱にいって、昼の定食をいただきながら「富久長 中汲み槽しぼり純米吟醸」定食のしまホッケ、つくね、鮭はあぶらがのってほくほくで、富久長は果実風味豊かでくいくい飲める。〆というか、お茶漬けに、と出された出汁がまた抜群。塩気と魚の香ばしい味。漬け物と合わせてむしゃむしゃ食ってしまった。


でもって、ついでなので、話題のソラマチにも。東武線の東京スカイツリー駅からつながっていて、入った瞬間、そりゃもうがっかり。なんじゃこりゃ、というのが第一印象。ユニクロだとかマリオンクレープだとか、おいおい、だれがそんなもん期待してんだ、ココに。どこにでもあるショッピングモールと同じ。すぐに飽きて、とっとと帰ろうと思いつつ、せっかくだし、見るだけ見てみようと、ソラマチの押上駅側を行くと、地元の職人たちの芸と技の展示場があった。江戸切子の繊細な細工とか革製品のしっかりした縫製と造形が並ぶ。こっちだよなあ。歩いていて商品が楽しい、発見があってテーマパークだ。

ソラマチに出かけるなら、東武線の東京スカイツリー駅側の建物はスルーして、京成線の押上駅側の建物を散策するのが正解。こっちはかなり面白かった。


んで、この湿気、蒸し暑さの中、朝から歩き回ったもんだから、帰宅したらバタンキュー(死語)寝こけてしまった。


電子書籍作成アプリのSakuttoBookが届いたので、試そうと思ってたんだけど、今日はもうダメ。体力がアウト。明日から頑張る。アプリ開発、登録のやりかたを調べる。

でも、SakuttoBook、どうやら今月末にもバージョンアップとのこと。うううう、今、買ったら損だったかも。ち。


[更新]2026-02-02 08:43:55

EPUBの縦書き

2010/7/12 [23:01:02] (月) 天気

東京国際ブックフェアに出ていた端末やアプリは基本が EPUBだったのも確か。縦書きどうするのか、禁則どうするのか、ルビはどうなるのか、などなど気になるところだけど。


で、グーグル様3~5分。xhtmlとcssなんだな。んでフォントの埋め込みもできるらしいし、一部ではJavascriptを使ってすでに縦書きを実現しているらしい。てことは、わたし程度の素人芸でもなんとかなるような気がしてきた。


下町飲酒会駄文支部 日野裕太郎ページに置いた「立ち読み」は、縦書き表示だ。javascriptも使ってなくて CSSだけ。IE対策に filterタグを使ってるけど、それを外せば html Validator も通るいたってノーマルなHTMLとCSS。


仕事でヘロヘロなので、平日はたぶん気力体力がないので、週末にまたちょっと調べてEPUBで縦書きを試してみるか。

[更新]2026-02-03 09:17:55

Libretto50が終わったか…

2007/7/12 [23:11:54] (木) 天気

うちのLANの心臓、Libretto50がいよいよ終ったっぽい。ネットに出られないんで、あれ?と思ってあちこちみたら、今までずーっと黙々とルーターとして稼働してくれてたLibrettoが落ちてる。電源を入れたら

Bios is damaged !

と。何度やっても立ち上がらない。うげげげげげ、だ。無線で受けて有線の別セグメントに流してたのはこいつ。パソコンだけでなくHDDレコーダーやなんかもすべてLibrettoを通してた。

でもって手帳がわりにも使ってたんで、いろいろなID・PASSなんかもLibrettoの中だ。


うううううううう。真剣に弱った。


[更新]2013-03-31 10:10:21

梅雨寒?最後の認定日だった

2005/7/12 [17:15:00] (火) 天気

朝の通勤ラッシュの電車に乗って、今日で最後の認定に錦糸町職安までいってきた。今月振りこまれる分でお小遣いは終了となり、無職の上に無収入となる。とっとと仕事を見つけないと干上がってしまうカウントダウン開始といったところだろうか。とはいえ、基本的に不況業種なので、手に職もない・金に繋がる営業力もないただのオヤジではひたすら厳しい状況だ。せいぜい採用がひとりのところに30人から応募があるんじゃ、なかなか順番も回ってこないってもんです。いろいろ合わせるとすでに16社からわたしは前途・健闘をお祈りされているのだけど、せっかくのみなさんのお祈りはまだ実を結ばないようですよ。

とりあえずはまた職安通いで仕事を探すだけだなぁ。


てことで、電車で指輪の追補編読了。ドワーフがかっこええ。ペレンノール野での合戦だけじゃなかったという裏設定が萌え〜。サムのその後とかレゴラス・ギムリのコンビの話なんかも想像させてくれるよなぁ。それにつけても。暦から発音、言葉までこんだけこまかく設定してあったのかと、何度もくどいけど、やっぱり呆れかえった。

物語を支える世界観というのは「細部から具体的に」作ってないといけないということでしょうか。


船大工のエルフ、キアダンがこっそりかっちょええっす!


[更新]2013-06-10 08:46:45

<<2026/07>>
   1234
567891011
12131415161718
19202122232425
262728293031

【最近の10件】

日常読書映画アニメゲーム健康料理グルメカメラ写真ネタ仕事パソコンインターネットperlEPUB3電子書籍ActivityPub
検索: