ひまつぶし雑記帖

おひとり様ActivityPubサーバーにLike実装

2023/10/6 [10:10:37] (金) 天気

おひとり様APサーバーにもLikeを実装してみた。
自分の投稿に対するLikeはどうでもよくて、Likeされる方じゃなくて、する方の実装。

せっかくSNSだし、WEB拍手的なノリ(あれ?もしかして「Web拍手」って死語?)でポチっとできればなあ、と。
リプライ(返信する)のはちょっと厚かましい?馴れ馴れしい?恥ずかしい?空気読んで遠慮した方がいい?的なところに「WEB拍手」という控えめなリアクションは(主語を大きくすると)日本人向きの仕組みだなあ、と思う。

Likeに使うjson

{"@context": [
    "https://www.w3.org/ns/activitystreams",
     {"Hashtag": "as:Hashtag"}],
"type": "Like",
"id": "https://tokoroten.doncha.net/t2aki#a69b50a5-636b-11ee-83a8-d34678f16ad4",
"actor": "https://tokoroten.doncha.net/t2aki",
"object":"https://example.com/users/status/123456"}


typeがLikeのjsonで、actorは自分、objectに対象となる投稿のURLというお約束。
このjsonをお相手のエンドポイントにPOSTするだけ。他になにかが必要ということもなかった。
ブーストと違って運用的に考えなきゃいけないこともないんでサクっと実装できた。

とはいえ。
Like、イイネも承認欲求の対象、ハマると危険なので、自分の投稿に対するLikeは取得しない。
この危険はブースト(リツイート、リポスト)と同じだ。
これらに引きずられて言わなくてもいいことを言ってしまったり、デマ拡散に加担してしまったり。ロクなことはない。

SNSのもっともダメなところだ…SNSのせいにしちゃいけない。か。ひとの弱いところをつかれてしまう、ということだな。

[10/17 05:23:58]
とか言いつつ、前言撤回。
自分に対するLikeも取得するようにした。
Likeするひとにしてみたら、Likeしたのになんの反応もないんじゃ無視されてるように見えるなあ、と。とりあえずLikeについては3日間保持ということで対応。

[2024/01/11 02:32:48]
like一覧を実装してみた。
Likeしたものについては、タイムラインのJSONと違って投稿のURLだけで投稿内容はないので大丈夫だろうとそのまま保存してたら…上記したように、Web拍手的なノリでLikeをポチっとしてるので保存しているJSONが大量に溜まっていく。
ページングするのも面倒くさいんで、タイムライン同様、保存上限を設定して古いものは削除ということにした。保存期間は2週間。
一覧するのは日付と投稿のリンク。リンクを叩いてNoteのJSONをGETして表示。投稿を確認して手動でも削除できるようにした。
「いいね」するのもされるのも、その時その場、だなあ。
残しておきたいような投稿は、それこそひとり掲示板にメモしてるしね。

image
河童べこ。久しぶりにガチャガチャ回してる。

»電子書籍制作代行についてはこちら

おひとり様ActivityPubサーバーのjsonの実例

2023/10/3 [09:14:42] (火) 天気

今さらだけど改めて。
おひとり様ActivityPubサーバーで投稿する・しゃべる時に必要になりそうなもの。
・投稿本体(Note)
・画像添付
・メンション(リプライやDM)
・ハッシュタグ(検索する/される時のキーワード設定)

投稿本体は当たり前として。
画像添付やMention、Hashtagも実装してあるので、忘れないうちにメモ…というか、ActivityPubで使うJsonの実例、exampleをメモ。ソースを見ればいいだけの話なんだけど、覚えてないことの方が多いので具体例をちゃっちゃと見られるように。

以下のJSONがウチで使ってる、上記を実装した投稿のフルセット。
投稿はCreateの中のobjectにあるNoteが本体で、その中の本文(content)はともかく、それ以外について。

{"@context":
    ["https://www.w3.org/ns/activitystreams",
    {"Hashtag": "as:Hashtag"}
    ],
"type": "Create",
"id": "https://tokoroten.doncha.net/t2aki/activity/00341-20231003",
"url": "https://tokoroten.doncha.net/t2aki/activity/00341-20231003",
"published": "2023-10-03T00:01:31Z",
"actor": "https://tokoroten.doncha.net/t2aki",
"to": ["https://www.w3.org/ns/activitystreams#Public"],
"cc": ["https://tokoroten.doncha.net/t2aki/followers"],
"object": {
    "type": "Note",
    "id": "https://tokoroten.doncha.net/t2aki/items/00341-20231003",
    "url": "https://tokoroten.doncha.net/t2aki/items/00341-20231003",
    "published": "2023-10-03T00:01:31Z",
    "to": ["https://www.w3.org/ns/activitystreams#Public"],
    "cc": ["https://tokoroten.doncha.net/t2aki/followers",
          "https://mstdn.jp/users/donbe2023"],
    "attributedTo": "https://tokoroten.doncha.net/t2aki",
    "content": "\u003ca href=\"https://mstdn.jp/users/donbe2023\"\u003e@donbe2023@mstdn.jp\u003c/a\u003e うちでも花を飾ることになって、駅前の花屋さんを見てると、けっこうな人が花を買っていてビックリ。ほんと、今さらだけど、世間のひとたちはカジュアルに花を買っていくんだなー。\u003ca href=\"https://tokoroten.doncha.net/tameike.pl?tag=%23%E3%81%B2%E3%81%BE%E3%82%8F%E3%82%8A\"\u003e#ひまわり\u003c/a\u003e",
    "attachment"[
        {"type":"Document",
        "mediaType":"image/png",
        "url":"https://tokoroten.doncha.net/20231003.png",
        "name":null,
        "blurhash":null,
        "width":271,
        "height":320}
    ],
    "tag": [
        {"name":"@donbe2023@mstdn.jp",
        "type":"Mention",
        "href":"https://mstdn.jp/users/donbe2023"
        },
        {"name":"#ひまわり",
        "href":"https://tokoroten.doncha.net/tameike.pl?tag=%23%E3%81%B2%E3%81%BE%E3%82%8F%E3%82%8A",
        "type":"Hashtag"
        }
    ]
}
}


・画像添付
Noteのアタッチメントという配列に入る。

"attachment"[
    {"type":"Document",
    "mediaType":"image/png",
    "url":"https://tokoroten.doncha.net/20231003.png",
    "name":null,
    "blurhash":null,
    "width":271,
    "height":320}
]


配列の中、typeがDocumentのブロックひとつが1枚の画像の情報。ウチは1枚限定なので、ブロックはひとつだけ。複数入れる場合はここに追加。
画像情報として。
・画像のURL
・画像の種類(mediaType)
・名前(たぶんAltで使われる)
・blurhash
↑ぼや〜っとしたプレビュー用のハッシュ文字列。よくわからないんで未対応。
・画像の縦横サイズ

・メンション(リプライやDM)
Noteの中の宛先「cc」にお相手のinbox、エンドポイントを追加。

"cc": ["https://tokoroten.doncha.net/t2aki/followers",
      "https://mstdn.jp/users/donbe2023"]


「to」に入れるのか「cc」に入れるのか、特に決まりごとはないっぽいけど、現状これで問題なくお相手に通知が届く。

ただ、twitterやfacebook、あるいはLINEのように相手にだけ直接送ってそれ以外のひとに見えなくするのは無理。ActivityPubというか分散型サーバーというか。サーバー管理者はPublic指定がないものも含めて全部見ることができる。
twitterだからLINEだから安心とは言えないんだけど、なにかあった時に、抗議する先が一箇所なのか、あちこちいろいろあるのかということ。
ネットは信用しちゃいけいない(閑話休題)

Noteの中の「tag」の配列にMentionのブロックを追加。

"tag": [
    {"name":"@donbe2023@mstdn.jp",
    "type":"Mention",
    "href":"https://mstdn.jp/users/donbe2023"
    },


Mentionブロックは
・お相手の名前
・お相手の届け先(エンドポイント)

・ハッシュタグ(検索する/される時のキーワード設定)

@context": [
"https://www.w3.org/ns/activitystreams",
{"Hashtag": "as:Hashtag"}
]


ハッシュタグはActivityPubで決められたものじゃないということで「@context」に定義する必要があるらしい。

定義したら、Mentionと同じくNoteの中の「tag」の配列にHashtagのブロックを追加。

"tag": [
    {"name":"#ひまわり",
    "href":"https://tokoroten.doncha.net/tameike.pl?tag=%23%E3%81%B2%E3%81%BE%E3%82%8F%E3%82%8A",
    "type":"Hashtag"
    }


Hashtagブロックは
・タグの名前
・タグのURL

ハッシュタグは、おひとり様ActivityPubサーバーで使う意味があるか疑問。
そもそもハッシュタグは複数人で共有するもの。それをひとりしかいないサーバーで使う意味は、たぶんない。ただまあ、データベースに検索かける時にリンク一発叩けばいいだけになるので、便利っちゃ便利なので実装してみた。

仕様・規格からちゃんと読めと言われたら謝るしかできないんだけど、何をするにしても、素人なので実例、exampleが欲しいんだよなあ。
image
にしても、駅近くの花屋さんの盛況っぷりに驚いた。ウチに花を飾る、なんてことを自発的にやったことがなかったんで、なおさら。

»電子書籍制作代行についてはこちら

おひとり様ActivityPubサーバーにブースト実装

2023/9/21 [09:25:34] (木) 天気

twitter(現X)に代表されるSNSの一番の特徴はリツート(ブースト、リポスト)
これがあるおかげで?せいで?SNSへの投稿は拡散力を持つことになった。良い悪いはおいといて、ウチのおひとり様APサーバーにも実装してみた。

考えなきゃいけない一番の優先順位は。
「デマの拡散に加担してはいけない」

なので、ブーストはブースト取り消しの実装と同時。

ブーストはActivityPubだとタイプAnnounceのjson。対象となるNoteのIDをobjectに入れる。
宛先の「cc」には自分のfollowersに、対象となるNoteの投稿者も含めておく。

{"@context": ["https://www.w3.org/ns/activitystreams", {"Hashtag": "as:Hashtag"}],
"type": "Announce",
"id": "https://tokoroten.doncha.net/t2aki/announce/TIMESTAMP",
"actor": "https://tokoroten.doncha.net/t2aki",
"to": ["https://www.w3.org/ns/activitystreams#Public"],
"cc": [DELIVER-LIST],
"object":"NoteID"}



Announceの取り消しはタイプUndoのjsonに、Announceに使ったjsonをobjectにそのまま入れる。

{"@context": ["https://www.w3.org/ns/activitystreams", {"Hashtag": "as:Hashtag"}],
"type": "Undo",
"id": "https://tokoroten.doncha.net/t2aki#UUID",
"actor": "https://tokoroten.doncha.net/t2aki",
"object":ANNOUNCE-OBJECT}


以上のjsonを自分のフォロワーさんのinboxに署名付きpostでリクエストをすれば、ブースト・ブーストの取り消しとなる。

これだけっちゃこれだけなんだけど、ブーストはスクリプトじゃないところに問題があるんだよなあ。

ブーストを実装したいと思ったのは。
いま、フォロワーさんの数が16人ほどで拡散力もなにもないんだけど、それでもイベントのお知らせや、発売の宣伝なんかは、微力ながら協力できればなあ、というのが動機。
せっかくSNSなんだし。

ブーストはヤバイなあと思うのは。
デマの拡散に加担する可能性、というのがもちろん一番で。
それ以外というか、他人の投稿を拡散することで自分が何かを語ったつもりになる、という乗っかりの承認欲求、自己顕示欲を得られるところ。

自分の頭で考えて自分の言葉で語ることをしなくなる、簡単に闇落ちする(自戒をこめて)
実装はしたけど、ブーストするのは基本的にイベントや発売告知だけにする。

また、ウチのおひとり様は、他人のデータを持たない、というのが原則。
なので、Annouceの投稿も期限つき。最長7日間にした。
イベントなんかは終わってたら残念だし、発売関連は初動に少し貢献できれば十分かなあ、と。

image
ひとつ何かを実装するのに、やっぱりけっこういろいろ考慮しなきゃいけないことってあるもんだなあ(今さら
自分のとこだけのことならどうでもいいんだけど、ActiviyPubで繋がるわけだから、そりゃそうかという話。

»電子書籍制作代行についてはこちら

おひとり様ActivityPubサーバー自作実装メモ

2023/9/8 [15:45:34] (金) 天気

ActivityPubを通じてMastodonなどFediverseと呼ばれるネット連合からアカウントとして認識されるように最低限のサーバー構成を作ったのが7/12。その後、秘密鍵・公開鍵を使えるperlのモジュールをlolipopレンタルサーバーにインストールできたことで、それっぽいものにしあがって、実際に運用して今日に至る。

「ため池」
↑perlで自作実装したおひとり様ActivityPubサーバー

そもそもMastodonやMisskeyなどのサーバーを立てるスキルがない。わたしには難易度が高すぎる。
自分のわかる範囲で自作実装したので、間違ってる・勘違いしてるところもあるかも知れないけど、今のところ意図通り。
この雑記帖と同じレンタルサーバーに展開して追加の費用なども必要ない。

自作とはいえ、スグ忘れるのでまとめてメモしておこう、というのがこのエントリ。
5分以上前の自分はアカの他人。

Fediverseからアカウントとして認識されるために必要なもの
1)nodeinfo(json)
 サーバー情報。
2)host-meta(xml)
 webfingerのURL。
3)webfinger(json)
 ユーザー情報のURL。
4)actor.json(json)
 ユーザー情報。type:Personのjson。
上から順番にアクセスされて4のユーザー情報にたどり着けばActivityPubサーバーのアカウントとして認識される。
1と2はなくても大丈夫らしいけど、webfingerのURLは「/」だったり「/.well-known/」だったりするので、2の「/host-meta」で教えてあげる。

「ActivityPubを使ってFediverseにたどり着く」
↑各ファイルの詳細。


おひとり様サーバーとして動作しているスクリプトは2つだけ。
・飛んでくるリクエストをさばく門番的スクリプト
・タイムラインを表示、投稿、管理するスクリプト


【飛んでくるリクエストをさばく門番スクリプト】

ActivityPubでの会話を求めて飛んでくるリクエストはいろいろ。
アカウント情報を取得するためにactor.jsonをリクエストされるし、ActivityとしてCreate(投稿)Follow(フォロー)などのリクエストが飛んでくる。

まず「.htaccess」を設置
rewrite ruleでパラメータをつけて門番スクリプトにリダイレクトするところからスタート。

リダイレクトされてリクエストを受けつける門番スクリプトの仕事は以下。

サーバー情報やユーザー情報はGETでリクエストが飛んでくる。
リクエストされたURLに応じて、門番は用意してある静的ファイル、jsonやxmlファイルを返す。
ActivityPubのjsonファイルは「Content-Type: application/activity+json; charset=utf-8」をヘッダにつけるのが必須。

followerやfollowingにアクセスされた時はfollower、followingを記載したテキストファイルを読んで、静的ファイルにそのリスト情報をくっつけて返すようにした。

Activityリクエストは「ユーザー名/inbox」にPOSTでリクエストが飛んでくる。
これはまとめて門番で受け取って。
・HTTPヘッダ類
・content(ボディ)
これをひとつのログファイルとして、所定のディレクトリに保存する。
ボディ=jsonを読んで、CreateだのFollowだのUndoだのログファイル名の一部にしておく。
門番スクリプトの仕事はここまで。

ヘッダ類もログファイルに収録するのは。
公開鍵とhttp signatureで、飛んできたリクエストが正しく署名されているか検証する必要がある。
Mastodonなんかはたぶんリクエストが来たらその場で検証までしてるはずで、ログファイルなど必要ないと思う。
わたしの場合、まだよくわかってないことが多くて、ログファイルで確認したいことがあるので、そのためにログファイルを残している。

ActivityのPOSTリクエストのうちいくつかは今時点スルーしている。
仕様的にはMUSTとかSHOULDだったりするものもあって、対応が必要と思われるけど、ウチの運用的にそれ必要?と微妙なもの…要検討。


【タイムラインを表示、投稿、管理するスクリプト】
あまり考えず「ため池」という名前にした。

Mastodonでいうところの「ローカルタイムライン」のために投稿用のデータベースを用意。

といっても、テーブル2つだけ。それも1つはログインに使うだけのもの。投稿用のテーブルはテキストと、画像のURLや幅・高さぐらいを記録するメモ帳。
投稿するには重複しない一意のIDが必要で、それにはデータベースが便利に使える…ほぼそのため。

おひとり様サーバー、ユーザーはわたしだけ。サーバーに登録しているユーザーの投稿を表示する「ローカルタイムライン」は、わたしの壁打ちとなる。


フォローしたひとの投稿を表示する「ホームタイムライン」はファイル管理。

自分以外、ひと様のデータを持たないのが原則。ひと様のデータを溜め込むといろいろ考えなきゃいけないことが出てくるから。

ため池にアクセスすると、門番スクリプトが保存したログファイルを開いて。
まずはHTTP SignatureのVerify。
actor情報をリクエストして、公開鍵を取得。公開鍵を使ってログファイルのヘッダ情報にあるSignatureを検証する。
Signatureに問題がなければ、Activityに応じた所定のフォルダに、所定の命名規則で名前をつけたjsonファイルを保存。元のログファイルを削除。

「RSAモジュールで公開鍵と秘密鍵」
「HTTP Signatureをlolipopレンタルサーバーで作成」
↑秘密鍵、公開鍵について

タイムライン用に保存するjsonファイルはCreateかAnnounceのNote
・上限20個
・期間1日
ディレクトリのファイルを読んで制限以上になっていたら削除。
フォローイングが増えてくると、読まないまま削除される方が多いし、さらにフォローは増やすつもりなので、読む・目にする投稿の方が圧倒的に少なくなる。知らない間に流れてきて知らないうちに削除されている。

でも、SNSはそのぐらいで適正だと思う。
その時その場で見たものがすべて。「袖すり合うも他生の縁」だ。

「ホームタイムライン」用に保存するjsonファイルは「to」に「Publish」(全公開)が指定されているもの限定(サークル投稿を除く)
この「ホームタイムライン」を表示するにはログインが前提。つまり、見ることができるのはわたしだけだ。

ホームタイムラインの投稿にフォローしたひとのアイコンや名前を表示させるために、actor.jsonをリクエストしてpersonを取得してそこからアイコンのURLや名前を取ることになる。
これだけのためにリクエストが生じるんで、ホームタイムラインの表示が重い。

[10/24 09:27:53]
さすがに重すぎでキレた…ので、不本意ながら、表示名とアイコンURLに限っては、キャッシュすることにした。
当然、表示は劇的に早くなった。
キャッシュの期間は30日(要検討)。
Updateのリクエストがpersonだったら確認してキャッシュに反映。

本当だったら非同期で情報を更新したいところだけど、Javascriptとか面倒くさいし、メンテやエラーの特定にあっちもこっちもになってコスト高なので却下。手動更新。

見るのが自分ひとり、一般公開はしないということから、表示が重いのは我慢、また、同じ理由でいくつかのリクエストはスルーしてもいいかな、と。

[10/04 12:53:50]
というのが、ログファイルが貯まるとさすがに重すぎるので、このフェーズだけ抜き出したスクリプトを作ってcronで5分間隔で回すようにした。


MentionとFollowは別扱い。
両方とも確認してから返事するなりフォロー返しするなりしてから手動で削除することにした。

FollowをAcceptしたら、Followのjsonを保存して、followersのリストに登録する。
Following、こちらからフォローする場合も同じ。Followingに使ったjsonを保存して、followingのリストに登録する。Followingのjsonを保存するのは、フォロー解除するUndoのために、元になったjsonが必要だから。uuidでIDを作ることにしてしまって、残しておかないと元のjsonを再現できないというオチ。

Mention
連絡先としてサイトや名刺など今まではtwitterのアカウントを入れたんだけど、twitterがなくなったんで、こっちを「連絡先はこちら」にしたい。Mentionを見落としちゃまずいんで、これも確認からの手動にした。

[09/21 10:05:12]
リクエストとして飛んでくるブーストは対応済みで、こちらからブーストのリクエストを飛ばすのも実装してみた。
「おひとり様ActivityPubサーバーにブースト実装」
いろいろ考えなきゃいけないことあった(改めて)

[10/03 10:57:44]
「おひとり様ActivityPubサーバーのjsonの実例」
投稿するのに実際に使ってるActivityPubのJSONの実例をメモした。

[10/06 10:26:14]
「おひとり様ActivityPubサーバーにLike実装」
Likeされる方じゃなくて、する方の実装。
WEB拍手みたい感じで使うのがいいかな、と。

[12/22 07:40:43]
「ActivityPubサーバーのGETリクエストに署名」
GETリクエストでactor情報などを取得する時にHTTP Signatureが必要なサーバーもあった。
GETにも署名することにした。

[12/27 10:01:38]
「おひとり様ActivityPubサーバーにBlock実装」
レアケースだけどBlockも対応した。

[2024/01/23 09:08:36]
「おひとり様サーバーの改修」
Fedibird.comやkmy.blueなど一部のサーバーが実装しているサークル機能に対応…といっても読むだけ。サークル作成やサークル投稿に対する返信は未対応。

■以上、雑なまとめでした■
ディテールというか無駄の多いエントリはカテゴリからどうぞ。
「ActivitiyPub::ひまつぶし雑記帖」


以下のサイトを参考にさせてもらっておひとり様ActivityPubサーバーを実装することができた。感謝深謝。
「NetlifyとSupabaseでほぼ静的なActivityPubサーバ」
「Fediverse入門―非中央集権型SNSサーバを作ろう!」
「田舎の昼のサイレンbotをActivityPubで実装する(マストドンにアカウントを認識してもらう編)」
「ActivityPubの実装についてのメモ」

ActivitiPub本家本元。
「ActivityPub」
「ActivityPubの仕様(和訳)」

image
[12/13 08:30:17]追記。
Activityなどの実装・対応状況

[済]Create
noteを投げ込むのに使用
[済]Follow
followしたらfollowingリストに追加。json保存。
followされたらfollowersリストに追加
[済]Accept
followされたら許可
[未]Reject
followされたら拒絶
[未]Update
noteやpersonなどオブジェクトの更新
[済]Delete
noteの削除…のはずだけど削除できてない。要調査。
[未]Add
オブジェクトの追加
[未]Remove
オブジェクトの削除
[済]Block
ブロックされたらリストに登録。間違えてFollowするといけないので、Followリクエストを飛ばす時にブロックリストも確認する。
[済]Like
いいね。
したらjson保存。14日間。
されたら1日だけ表示。jsonは3日間だけ保存。
[済]Announce
ブースト。
したら、7日間ため池データベースに保存。期限がすぎたら削除、undo
されたものはスルー
[済]Undo
やり直し。
ブーストの取り消しとフォロー解除は対応済み。Likeは未対応。


[済]Mention
DMみたいなものだからJSON保存。確認して手動で対応。
[済]Hashtag
お一人さまだと意味はないけどとりあえず
[未]Replies
リプライは実装しない方向で

Json-LDの署名について不明。手がかりにできそうなURL
jsonの日本語訳PP版
MastodonのJSON-LD署名と検証
MastodonのJSON-LD署名の実装rubyのコード
JSON-LD関連のコード
graph rdfとかよくわからんけど、関係しそうなところ
LDのAPI

»電子書籍制作代行についてはこちら

おひとり様ActivityPubサーバーにタイムライン追加

2023/8/30 [14:11:40] (水) 天気

発信専門でいいかと思ってた「おひとり様APサーバー」をしばらく使ってて、やっぱりタイムラインが欲しくなった。フォローしたひとの投稿を表示する、Mastodonでいうところのホームタイムライン。
結局、投稿を閲覧するのにあっちのMastodonこっちのfirefishと行ったり来たりするのが面倒くさくなった、ということもあって、ここだけで完結できればそれに越したことはない。

とはいえ、要求される機能を満たすのはなかなかしんどいので、ここも必要最小限で追加してみた。
たぶん、すぐ忘れるのでメモ。5分以上前の自分なんてあかの他人だしなあ。

表示させるのは「to」に「Public」の指定のあるもの=全公開OKなものだけ(公開範囲がいろいろあって、全部を振り分けするのは面倒くさいし事故の元)
そして保持するのは1日だけ、最大個数20個まで(設定ファイルで制御)
データベースは使わない。ログファイルを振り分けて保存して、規定の期間個数に達したら古いものから削除する。

自分以外のひとのデータを持つのはいろいろ考えなきゃいけなくて、削除してしまうのは、そのリスク回避もある。データベースでも同じことだけど、ただのファイルだと、何かあったらFTPでログインしてその場で削除すればいいしね。慌ててデータベースにdeleteを投げるのは事故の元。

フォロー数が増えたら、この程度のデータ保持数だと見られない投稿の方が全然多くなる。
でもSNSなんて「袖すり合うも他生の縁」その時その場での関わりでいいと思ってるんで問題はない。むしろ本来こういうカタチが正しいと思ってる。

Mentionだけは別扱い。「連絡先はこちら」というのでこれまでtwitterのアカウントを使ってたんだけど、twitterがなくなったのでどうしたもんかと思ってたところ。今後は「連絡先はこちら」におひとり様APサーバーを使う。

「@t2aki@tokoroten.doncha.net」

↑これを検索してもらえれば、おひとり様APサーバーのアカウントが表示されて、そこにメッセージを飛ばしてもらえればわたしに届く。
もちろん、MastodonやMisskeyなんかにログインしている・アカウントが必要となる。twitterやfacebookと違ってハードルは高い。これについてはそのうちMastodonなんかが当たり前になればハードルは下がるし、そもそも、公開する連絡先なんて多少ハードルがあるぐらいでちょうどいい。

MentionはNoteの中のtag配列に「type:Mention」のブロックがあったらそこに宛先も記載されている。それで判定できる。
Mentionは、ログインしてないと見られない=見られるのはおひとり様サーバーのわたしだけ。

自分の投稿に対するLikeや、自分の投稿をブーストされたら、それらもリクエストが飛んでくる。
ご褒美とか承認欲求という言葉になるんだろうけど、ここは割りとどうでもいいので、それらのリクエストは受けた時点で破棄。
だいたい、こんなのはサイトのアクセスログを見ればわかることで、そっちの数字の方が確実だ。
本や雑誌でいうと、評価よりも実売部数、というのを肌身に染みて思い知らされてきたしね。

どうでもいいごたくを並べたけど。
こういったフロント側、閲覧側はかなりうっとーしーことがいろいろ。
タイムラインというからにはリアルタイムで表示を更新するのが当たり前。だけど、同期にしろ非同期にしろJavascriptなんかを使って閲覧してる裏でデータを確認取得しなきゃいけない。
飛んでくるリクエストを捌く、入口で門番をしてるスクリプトがあるのでデータが来たことはそれこそリアルタイムで検知している。
でもJavascriptは触りたくない。メンテが大変なのだ。どこが原因なのか特定するのにこっちまで見なきゃいけないのは労力に見合わない。
てことで、リアルタイム更新は却下。手動F5にした。

そんなオレオレAPサーバーは
「ため池」https://tokoroten.doncha.net/tameike.pl
絶賛壁打ち中です。
image

Noteの公開範囲についてはfedibird管理人ののえるさんの投稿
https://fedibird.com/@noellabo/110573926847901369
「ToにPublicが指定されていれば『公開』」
を参考にさせていただきました。ありがとうございます。

»電子書籍制作代行についてはこちら

HTTP Signatureをlolipopレンタルサーバーで作成

2023/8/22 [09:42:59] (火) 天気

ActivityPubでPOSTするには電子署名が必要。
というエントリを書いたけど、WEBでサーバー同士でやりとりしたり、WEBサービスのAPIを利用したり、電子署名が必要なのはActivityPubに限らず。

ちらほら書いてきたように、lolipopレンタルサーバーにはperlで電子署名をする時によく使われるモジュール「Crypt::OpenSSL::RSA」がインストールされていない。
ということは。lolipopではHTTP Signatureを作ることができない「Cryptが使えないんじゃ話にならない」ということになる。

しょうがないんで、ローカルにcpanから「Crypt::OpenSSL::RSA」をインストールして、ActivityPubにPOSTする時はローカルのスクリプトを使う、という急場しのぎ。
これはこれで、投稿するのにひと手間あった方が事故も起こさなくていいかな、と思ってやってたんだけど、やっぱりサーバー上だけでやれるならラクちんなことは確か。

なもんで、グーグル先生にお願いしてみたら
「Crypt-Perl-0.38」https://metacpan.org/pod/Crypt::Perl
↑pure perlのCryptモジュールがあった。

インストール時にコンパイルが必要なモジュールはOSやファイル構成、環境に依存するけど、PurePerlというのはperlだけで作られているので、perlさえあればサーバーにそのままアップロードして使える。

さっそくダウンロードして展開。テストスクリプトで試したところ、依存関係で必要なモジュールがあったのでそいつらもダウンロードして展開。

Class-Accessor-0.51
Bytes-Random-Secure-Tiny-1.011
Convert-ASN1-0.34
Crypt-Format-0.12
(あと、たぶん以前amazonのAPIがらみでインストール済みのpure perlのDigest::SHAも必要)
当然ながら(?)これらのモジュールもpure perlなので、コンパイル不要、展開するだけで使える。

サーバーの適当なところ、例えば「lib」というディレクトリを作って展開したファイル群をアップロードするだけ。
lib/Bytes/
lib/Class/
lib/Convert/
lib/Crypt/ 
スクリプトで use lib 'lib' などとやればlolipopレンタルサーバーでもCrypt RSAが使えるようになる。

いや。ぶっちゃけ。これらモジュールの作者のみなさんには大感謝。大袈裟じゃなく狂喜乱舞小躍りだった。ほんとうにありがとうございます。
マジperl使いすげー。perl話者が減ってるだろう昨今、凄腕のperl使いはワシントン条約で保護すべき存在。

使い方は「 RSAモジュールで公開鍵と秘密鍵 」とほぼ同じ。

秘密鍵を使う
my $privatekey = Crypt::Perl::RSA::Parse::private($private-pem);
公開鍵を使う
my $publickey  = Crypt::Perl::RSA::Parse::public($public-pem);

Signatureを作る。

my $sign = $privatekey->sign_RS256($sign-str);
encode_base64($sign, "");


Signatureを検証する。

my $decoded = decode_base64($sign);
$publickey->verify_RS256($sign-str, $decoded);



あとは。
こうすると、思いつきから投稿放流までが直結するので、事故を起こさない自制心が必要となるです、はい。
image

»電子書籍制作代行についてはこちら

profile

profile

 
doncha.net
contact:
»運営者
@t2aki@tokoroten.doncha.net

ところてんx5

2024/5/10 01:21

昨日、部屋で転んで強打した手のひらと手首。内出血して青とか紫とか赤とかサイケな色になってるんで、ぶっちゃけビビる。痛みが引かないようなら医者行くしかないな。骨が折れてると、軽く触るだけで激痛らしいんで、折れてはいないと思うけど、かなりエグい見た目だ。これ。

2024/5/9 19:02

動線も分かりやすくしておこう

2024/5/9 19:00

門番スクリプトで画像表示を忘れてた。画像対応は後付けだから、こっちにも必要なところがあるのに気づいてなかったな。
帰ったら対応するか、シフト明けにするか、考えよう

検索
<<2024/5>>
   1234
567891011
12131415161718
19202122232425
262728293031

リンク

WINDOWS版サウンドノベル
おかえりください PC WINDOWS版サウンドノベル
『おかえりください』体験版

[3 Page]« »
1 2 3

TOTAL:2982

2024 (5)
1 (2)
2 (2)
3 (1)
2023 (53)
1 (1)
2 (5)
3 (1)
4 (1)
5 (3)
6 (9)
7 (9)
8 (6)
9 (5)
10 (3)
11 (2)
12 (8)
2022 (16)
1 (1)
3 (2)
6 (2)
7 (1)
8 (4)
9 (2)
10 (1)
11 (2)
12 (1)
2021 (12)
1 (3)
2 (1)
6 (1)
8 (2)
9 (1)
10 (1)
11 (2)
12 (1)
2020 (18)
1 (2)
2 (6)
4 (1)
6 (1)
7 (2)
8 (2)
12 (4)
2019 (17)
1 (3)
2 (4)
3 (2)
4 (2)
5 (1)
6 (1)
8 (1)
10 (1)
12 (2)
2018 (21)
1 (3)
2 (2)
3 (2)
4 (1)
5 (1)
6 (6)
8 (1)
9 (1)
10 (2)
12 (2)
2017 (32)
1 (2)
2 (1)
4 (2)
5 (1)
6 (6)
7 (3)
8 (5)
9 (3)
10 (2)
11 (2)
12 (5)
2016 (41)
1 (5)
2 (5)
3 (2)
4 (3)
5 (4)
6 (6)
7 (2)
8 (2)
9 (3)
10 (1)
11 (4)
12 (4)
2015 (99)
1 (11)
2 (12)
3 (9)
4 (6)
5 (8)
6 (8)
7 (3)
8 (5)
9 (16)
10 (6)
11 (1)
12 (14)
2014 (112)
1 (16)
2 (5)
3 (6)
4 (12)
5 (16)
6 (19)
7 (9)
8 (6)
9 (4)
10 (8)
11 (6)
12 (5)
2013 (145)
1 (24)
2 (15)
3 (18)
4 (23)
5 (14)
6 (11)
7 (7)
8 (11)
9 (5)
10 (4)
11 (6)
12 (7)
2012 (103)
1 (1)
2 (1)
3 (4)
4 (3)
5 (7)
6 (26)
7 (17)
8 (5)
9 (8)
10 (10)
11 (11)
12 (10)
2011 (54)
1 (4)
3 (7)
4 (4)
5 (14)
6 (6)
7 (3)
8 (3)
9 (1)
10 (4)
11 (2)
12 (6)
2010 (70)
1 (12)
2 (7)
3 (6)
4 (6)
5 (3)
6 (10)
7 (6)
8 (4)
9 (3)
10 (4)
11 (3)
12 (6)
2009 (144)
1 (15)
2 (12)
3 (12)
4 (6)
5 (15)
6 (6)
7 (10)
8 (9)
9 (17)
10 (12)
11 (14)
12 (16)
2008 (148)
1 (10)
2 (6)
3 (10)
4 (11)
5 (13)
6 (10)
7 (13)
8 (19)
9 (18)
10 (12)
11 (13)
12 (13)
2007 (106)
1 (7)
2 (5)
3 (3)
4 (7)
5 (5)
6 (9)
7 (8)
8 (13)
9 (18)
10 (11)
11 (8)
12 (12)
2006 (158)
1 (28)
2 (28)
3 (25)
4 (7)
5 (9)
6 (7)
7 (12)
8 (13)
9 (10)
10 (7)
11 (6)
12 (6)
2005 (350)
1 (31)
2 (26)
3 (26)
4 (27)
5 (29)
6 (30)
7 (32)
8 (30)
9 (30)
10 (32)
11 (29)
12 (28)
2004 (292)
1 (24)
2 (24)
3 (29)
4 (27)
5 (28)
6 (25)
7 (26)
8 (24)
9 (12)
10 (19)
11 (26)
12 (28)
2003 (318)
1 (22)
2 (25)
3 (21)
4 (28)
5 (28)
6 (28)
7 (28)
8 (29)
9 (26)
10 (29)
11 (28)
12 (26)
2002 (317)
1 (29)
2 (26)
3 (26)
4 (25)
5 (28)
6 (30)
7 (27)
8 (21)
9 (25)
10 (27)
11 (28)
12 (25)
2001 (277)
1 (17)
2 (21)
3 (23)
4 (20)
5 (31)
6 (18)
7 (26)
8 (25)
9 (29)
10 (19)
11 (24)
12 (24)
2000 (53)
6 (9)
7 (4)
8 (2)
9 (3)
10 (1)
11 (15)
12 (19)
1999 (3)
7 (1)
10 (2)
1998 (18)
9 (9)
10 (7)
11 (2)