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

いや、なんのこっちゃだけど。
2023年、ツイッター亡き後の世界となった。ネット空間には祖国を奪われた難民たちで溢れかえり…というB級サイバーパンクSFの設定。
そこで再評価されることになった、実は古より存在するFediverseというネットの連合空間。ActivityPubという共通の言語で繋がるネット世界、ということになった。
てことで、「いっちょかみ」できるかなあ、とここ数日あれこれ検索しまくって試して、とりあえずmastdonで検索して仲間として検索結果に出るところまではたどり着いた。
最小限のActivityPub、いわゆるお一人様で、もちろん喋ることもフォローなどアクションをすることもできない。ただ、連合空間に顔を出した、だけなんだけど。
「mastodonなどに認識してもらえる」のがまずはゴールだったんで、ここまでやったことをメモ。
(すべてはネットで検索して得られたもので、先人たちに大感謝)
ActivityPubに参加するため用意するもの
サーバーやドメインをもっていることが前提。わたしはいつものlolipopサーバー。
どうやら以下の5つがあればActivityPubに顔を出すことはできる、っぽい。
nodeinfo(json)
まず最初サーバー情報のありかをこれで返す。
{
"links":[
{
"rel": "https://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は検索対象のユーザー名の文字列に置換される。
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のフェーズを追記。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
施餓鬼とかソラマチとか

わが家の猫たち、23歳と12歳のお墓参り。毎年、荼毘してもらったお寺さんの施餓鬼に行くことにしている。猫たちの名前を書いた小さな卒塔婆に印をもらって、焼香してくる。一日4回だかにわけて焼香があるんだけど、いつも満員御礼。この日はこのお寺さんに犬や猫、ハムスターや鳥たち、もろもろの霊が集まってる、かも。いや、いろんな名前が読み上げられるので、ペットとはいえ妙な名前をつけちゃいけません。毎年、梅雨末期の蒸し暑く、日差しも強烈になるこの時期。今年は雨まじりで、日差しこそなかったものの、湿気がひどくてまいったなあ。
その後、いつも精進落としとして、昼飯に日本酒。今年は浅草の銀鯱にいって、昼の定食をいただきながら「富久長 中汲み槽しぼり純米吟醸」定食のしまホッケ、つくね、鮭はあぶらがのってほくほくで、富久長は果実風味豊かでくいくい飲める。〆というか、お茶漬けに、と出された出汁がまた抜群。塩気と魚の香ばしい味。漬け物と合わせてむしゃむしゃ食ってしまった。
でもって、ついでなので、話題のソラマチにも。東武線の東京スカイツリー駅からつながっていて、入った瞬間、そりゃもうがっかり。なんじゃこりゃ、というのが第一印象。ユニクロだとかマリオンクレープだとか、おいおい、だれがそんなもん期待してんだ、ココに。どこにでもあるショッピングモールと同じ。すぐに飽きて、とっとと帰ろうと思いつつ、せっかくだし、見るだけ見てみようと、ソラマチの押上駅側を行くと、地元の職人たちの芸と技の展示場があった。江戸切子の繊細な細工とか革製品のしっかりした縫製と造形が並ぶ。こっちだよなあ。歩いていて商品が楽しい、発見があってテーマパークだ。
ソラマチに出かけるなら、東武線の東京スカイツリー駅側の建物はスルーして、京成線の押上駅側の建物を散策するのが正解。こっちはかなり面白かった。
んで、この湿気、蒸し暑さの中、朝から歩き回ったもんだから、帰宅したらバタンキュー(死語)寝こけてしまった。
電子書籍作成アプリのSakuttoBookが届いたので、試そうと思ってたんだけど、今日はもうダメ。体力がアウト。明日から頑張る。アプリ開発、登録のやりかたを調べる。
でも、SakuttoBook、どうやら今月末にもバージョンアップとのこと。うううう、今、買ったら損だったかも。ち。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
EPUBの縦書き

東京国際ブックフェアに出ていた端末やアプリは基本が EPUBだったのも確か。縦書きどうするのか、禁則どうするのか、ルビはどうなるのか、などなど気になるところだけど。
で、グーグル様3~5分。xhtmlとcssなんだな。んでフォントの埋め込みもできるらしいし、一部ではJavascriptを使ってすでに縦書きを実現しているらしい。てことは、わたし程度の素人芸でもなんとかなるような気がしてきた。
下町飲酒会駄文支部 日野裕太郎 ページに置いた「立ち読み」は、縦書き表示だ。javascriptも使ってなくて CSSだけ。IE対策に filterタグを使ってるけど、それを外せば html Validator も通るいたってノーマルなHTMLとCSS。
仕事でヘロヘロなので、平日はたぶん気力体力がないので、週末にまたちょっと調べてEPUBで縦書きを試してみるか。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
Libretto50が終わったか…

うちのLANの心臓、Libretto50がいよいよ終ったっぽい。ネットに出られないんで、あれ?と思ってあちこちみたら、今までずーっと黙々とルーターとして稼働してくれてたLibrettoが落ちてる。電源を入れたら
Bios is damaged !
と。何度やっても立ち上がらない。うげげげげげ、だ。無線で受けて有線の別セグメントに流してたのはこいつ。パソコンだけでなくHDDレコーダーやなんかもすべてLibrettoを通してた。
でもって手帳がわりにも使ってたんで、いろいろなID・PASSなんかもLibrettoの中だ。
うううううううう。真剣に弱った。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
梅雨寒?最後の認定日だった

朝の通勤ラッシュの電車に乗って、今日で最後の認定に錦糸町職安までいってきた。今月振りこまれる分でお小遣いは終了となり、無職の上に無収入となる。とっとと仕事を見つけないと干上がってしまうカウントダウン開始といったところだろうか。とはいえ、基本的に不況業種なので、手に職もない・金に繋がる営業力もないただのオヤジではひたすら厳しい状況だ。せいぜい採用がひとりのところに30人から応募があるんじゃ、なかなか順番も回ってこないってもんです。いろいろ合わせるとすでに16社からわたしは前途・健闘をお祈りされているのだけど、せっかくのみなさんのお祈りはまだ実を結ばないようですよ。
とりあえずはまた職安通いで仕事を探すだけだなぁ。
てことで、電車で指輪の追補編読了。ドワーフがかっこええ。ペレンノール野での合戦だけじゃなかったという裏設定が萌え〜。サムのその後とかレゴラス・ギムリのコンビの話なんかも想像させてくれるよなぁ。それにつけても。暦から発音、言葉までこんだけこまかく設定してあったのかと、何度もくどいけど、やっぱり呆れかえった。
物語を支える世界観というのは「細部から具体的に」作ってないといけないということでしょうか。
船大工のエルフ、キアダンがこっそりかっちょええっす!
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
ケツからエクトプラズム

検査本番…って午後2時半から。ロクなものを食ってない、夕べの夜7時から絶食状態なので、さすがに腹が減ってぼーっとしてしまう。終わったらビシっと食うぞと。
噂通り、ケツに穴の開いた紙製パンツを渡され、着替えて待つことしばし。呼ばれて入ると、胃のバリウムの時と同じような台。看護婦サンに腸の働きを鈍らせる注射を打たれる。筋肉注射だと聞いてたのだけど痛みは皮下注射程度でたいしたことはなかった。台の上で左を下にして横になると、先生が入ってきて直腸触診。力を抜いてラクにして、と言われ、ザクっとつっこまれスグ終了。管を入れますからね、口で息してラクにしてください、と看護婦サンに言われ、一瞬緊張が走る…っておれだけ。むにゅう、とひんやりしたものが入ってきた。けど、へ?もういいの?という感じ。
ケツに管がささった状態でひとり残されると、マイクごしに、バリウム入れますからね、とか、空気を入れます、ちょっと張る感じになります、と。
ストローで空気を入れられて腹がパンパンに張るカエルの気持ちがわかりますよ、と脅されてたほどじゃない。下腹部がどんより曇る感じに重くなるだけだ。
あとは胃のバリウム撮影と同じ。言われるがまま身体の向きを変え、息を吸ったり吐いたり止めたり。ただ、胃のバリウムと違って台の動かし方傾け方が半端じゃない。ぼぉっとしてると頭から落ちそうなほどの角度をつける。
エロ漫画だと穴に管をつけられたままあれこれ姿勢を変えるのは色っぽいシチュエーションかもしれんが、厄も終わったおっさんがケツに管をつけられたまま、台の上で右往左往する様子は、うー、いかんだろ。
それが終わったら、ちょっと待たされて診察室でスグ診断結果を聞かされる。って、なんもなし・異常なし。
いや、便潜血検査は、ちょっとでも血がまじると反応しますから、たとえば、腸が炎症起こしてたりとか…。
ううう。このカラ騒ぎはなんだったんだ。
下剤を飲んで開放された。
ところが、ここからが苦しかった。腸の働きを鈍くする薬が効いていたからか、その最中はラクだったのだが、時間がたち下剤で腸の働きが活性化したせいか、腹がバリウムと空気で重苦しくて破裂しそうで嫌な汗がこみあげる。
話によると女の子の便秘ってのがこんな感じらしい。吐き気すらともなう。検査が終わったら食うぞ、なんて余裕はない。人間、満腹感てのは大腸からくるのか、と心底実感した。
ううう。昔から詰まったことがないからこんな経験初めて。
ケツにモノを突っ込まれるということで、人格崩壊でも起こるかと思いきやそれもなく淡々と。粗相があっちゃいかんと思ってタオルとか替えのパンツも持ってたんだけど、それも必要なし。
ひとことで、 拍 子 抜 け だったな。
難儀なのは終わった後。ケツからエクトプラズムをひりだすのが苦しい。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」