自作ActivityPubの改修メモ

いつ何をしたか、5分前の自分などあかの他人なので、「いつ何をやって、いまどんな状態になっているのか」記録しておくのが大切。そのためにはブログ形式がちょうどいいよね。
という還暦高齢者のメモが今回のエントリで、以下は、まとまりもなくとっちらかっていて、文字通りのメモとなります。
2023年7月頃からActivityPubをちょっとずつ自作実装してきていて、
「ActivityPubを使ってFediverseにたどり着く」
https://t2aki.doncha.net/?id=2946
2023年8月ぐらいにはヨタヨタとActivityPubのカタコトを喋りながらフェディバースへ参加
・読み書きができるようになった。
絵文字や引用など仕様にはないけど、メジャーなActivityPubサーバーに実装されている機能にもどうにかついていってる。
Activityを追加するたびに、スクリプトに「その場しのぎのやっつけ仕事」が追加されていて、スクリプト/コードはカオスで、純喫茶のスパゲッティナポリタン、クリームソーダつきセット状態で、(自分の仕事に)うんざりげんなり。
このへんで改修しておかないと、今後の機能追加や対応がヤバいんで少しずつ見直し。
今年1月にHTTP SignatureのRFC9421対応して、今回Activityを生成する部分を切り離した。
【今日時点の構成】
.
├── tameike
│ ├── activity.pm
│ ├── misc.pm
│ └── signature.pm
└── tameike.pm「tameike.pm」という本体があって、その下に分割したモジュールがいくつか。
サブルーチンは大雑把に全部で136個ぐらい。
(ド素人のクソコード合計4000行ぐらいでActivityPubを実装できて、フェディバースで遊べるんだからperlはやっぱ凄いっすよ!)
tameike.pm:23:sub new
tameike.pm:120:sub DESTROY
tameike.pm:126:sub strtime
tameike.pm:134:sub vacuum_db
tameike.pm:139:sub connect_db
tameike.pm:147:sub disconnect_db
tameike.pm:153:sub change_db
tameike.pm:166:sub execute_sql
tameike.pm:182:sub select_data
tameike.pm:204:sub latest_id
tameike.pm:214:sub make_tameike
tameike.pm:246:sub make_members
tameike.pm:263:sub check_post_limit
tameike.pm:275:sub check_limit
tameike.pm:283:sub get_webfinger
tameike.pm:305:sub update_entry
tameike.pm:382:sub blank2null
tameike.pm:401:sub publish_activity
tameike.pm:461:sub check_undo_boost
tameike.pm:483:sub check_request_follow
tameike.pm:499:sub request_follow
tameike.pm:545:sub stamp_like
tameike.pm:583:sub deliver
tameike.pm:634:sub list_logs
tameike.pm:678:sub disp_list
tameike.pm:808:sub disp_list_pool
tameike.pm:816:sub _disp_list_pool
tameike.pm:848:sub disp_list_pool_note
tameike.pm:887:sub disp_list_follows
tameike.pm:917:sub disp_accountline
tameike.pm:984:sub use_cache
tameike.pm:996:sub check_cache
tameike.pm:1011:sub update_cache
tameike.pm:1033:sub update_cache_actors
tameike.pm:1081:sub check_delete_note
tameike.pm:1123:sub check_delete_forwarding
tameike.pm:1136:sub check_delete_announce
tameike.pm:1164:sub check_block
tameike.pm:1190:sub _update_list
tameike.pm:1206:sub _get_list_stat
tameike.pm:1216:sub _get_list
tameike.pm:1240:sub _check_list
tameike.pm:1267:sub _register_list
tameike.pm:1284:sub disp_timeline
tameike.pm:1342:sub disp_note
tameike.pm:1509:sub _is_public
tameike.pm:1530:sub _is_to_followers
tameike.pm:1549:sub _check_quote
tameike.pm:1586:sub _quoted_note
tameike.pm:1656:sub get_preview_card
tameike.pm:1708:sub get_actor_info
tameike.pm:1727:sub check_pool_dir
tameike.pm:1798:sub _duplicate_note
tameike.pm:1820:sub check_is_
tameike.pm:1855:sub check_is_liked
tameike.pm:1881:sub disp_form
tameike.pm:1962:sub put_image
tameike.pm:2004:sub check_image_dir
tameike.pm:2015:sub check_image_rotate
tameike.pm:2038:sub _mp4_put_video
tameike.pm:2104:sub make_rdf
tameike.pm:2161:sub _thumbhash
tameike.pm:2171:sub forwarding_mention
tameike.pm:2198:sub post_actpb
tameike.pm:2250:sub deliver_list
tameike.pm:2287:sub get_actpb
tameike.pm:2337:sub _request
tameike.pm:2364:sub parse_logdir
tameike.pm:2375:sub _locked
tameike.pm:2395:sub _unlocked
tameike.pm:2402:sub disp_list_logfiles
tameike.pm:2429:sub disp_follow_form
tameike.pm:2477:sub disp_search_note_form
tameike.pm:2487:sub disp_healthcheck_down
tameike.pm:2506:sub disp_foreign
tameike.pm:2521:sub disp_is_liked
tameike.pm:2546:sub disp_is_announced
tameike.pm:2572:sub to_pool
tameike.pm:2745:sub _log2json
tameike.pm:2768:sub _check_logfile_in_rules
tameike.pm:2813:sub _is_follows
tameike.pm:2828:sub _suspect_server
tameike.pm:2840:sub _deny_server
tameike.pm:2857:sub undo_activity
tameike.pm:2879:sub undo_announce
tameike.pm:2905:sub undo_block
tameike.pm:2922:sub reject_follow
tameike.pm:2955:sub undo_follow
tameike.pm:2992:sub accept_follow
tameike.pm:3027:sub put_access_log
tameike.pm:3065:sub login_form
tameike.pm:3078:sub check_login
tameike.pm:3133:sub set_session
tameike.pm:3151:sub make_pass
tameike.pm:3158:sub check_pass
tameike.pm:3165:sub disp_static
tameike.pm:3187:sub check_pool_trash
tameike.pm:3232:sub check_follow_list2json
tameike.pm:3267:sub _healthcheck_by_lwp
tameike.pm:3390:sub _healthcheck
tameike/activity.pm:12:sub new
tameike/activity.pm:22:sub DESTROY
tameike/activity.pm:26:sub json_str
tameike/activity.pm:42:sub _setting_voc
tameike/activity.pm:83:sub publish_for
tameike/activity.pm:132:sub can_quote
tameike/activity.pm:147:sub id_ymd
tameike/activity.pm:156:sub published_datetime
tameike/activity.pm:165:sub uuid
tameike/activity.pm:171:sub conv_entry
tameike/activity.pm:195:sub make_envelope
tameike/activity.pm:272:sub make_envelope_orderedcollection
tameike/activity.pm:292:sub make_note
tameike/activity.pm:344:sub make_announce
tameike/activity.pm:372:sub make_delete
tameike/activity.pm:398:sub make_follow
tameike/activity.pm:418:sub make_accept
tameike/activity.pm:445:sub make_like
tameike/activity.pm:474:sub parse_content_local
tameike/misc.pm:9:sub new
tameike/misc.pm:19:sub DESTROY
tameike/misc.pm:24:sub get_keyid
tameike/misc.pm:37:sub emoji_tag
tameike/misc.pm:72:sub emoji_list
tameike/misc.pm:121:sub emoji_list_unicode
tameike/signature.pm:14:sub new
tameike/signature.pm:24:sub DESTROY
tameike/signature.pm:29:sub sign
tameike/signature.pm:40:sub verify_signature
tameike/signature.pm:55:sub prepare_verify_signature
tameike/signature.pm:97:sub parse_http_env
tameike/signature.pm:161:sub _make_signature_base
tameike/signature.pm:205:sub _check_logfile
tameike/signature.pm:234:sub is_RFC9421
tameike/signature.pm:243:sub signature_legacy
tameike/signature.pm:303:sub signature_RFC9421・signature.pm
→HTTP Signature生成・認証
・activity.pm
→各種ActivityのJSON文字列生成
・misc.pm
→その他絵文字など
本体に残ってるのは
・表示周り、フロント側
・リクエスト、POSTやGET、activityの配送
・受けとったActivityへの対応
配送やAcitivity対応は、言ってみりゃコアなところなので本体として運用するとして、表示周りのフロント側は切り分けが必要だろなあ。
フロント側といいつつ、リクエストのパラメータで動作を変えるので、本番環境でのテストが必要。
間違えてよそんち/リモートサーバーにリクエストを飛ばさなければ迷惑もかけないから、リクエストの蛇口を閉じて本番環境をprint文まみれで試すか。
これとは別に、飛んでくるリクエストを捌くためだけのスクリプトとcronで回して処理するためのスクリプトがある。こっちは本体の改修がひと段落してから、だなあ。
本体側に入れこんじゃって一本化したいところもあるし…。
ボケ防止にはちょうどいいかもだ。
今回のエントリに画像がない…先日買った鰯の写真を無理やり載せよう。

最近、マイワシが1尾100円弱。自販機のお茶やジュース類より安い。ビンボ人の強い味方だ。
とりあえず安定定番の塩焼き。魚の塩焼き、不味いワケはない。
この値段だったら、買いこんで自分ちでオイルサーディンでも作る? と思ってレシピを検索したら
>ひたひたに漬かるぐらいのオリーブオイル
…オリーブオイルのお値段!?、てことで解散。残念。
[03/21 20:04:20]
げ。エスケープ処理を間違えてた。
モリーオ @ozoramore@social.t2arc.net 46 分前
@t2aki
いいださんのポスト、こっちの鯖からだとこの辺のから壊れてる?
RE: https://tokoroten.doncha.net/t2aki/items/07452-20260320
フェディバースでフォロワーさんに教えていただいて気づかないと、みっともない投稿を晒しっぱなしにするところ。
ご指摘、ありがとうございました!!
今回からエスケープ処理をperlのjsonに丸投げしたんで安心してたらば、今まで自前でテキトーにエスケープ処理してたところが残ってて「\」を2重にエスケープしてたのが原因。
それはしかたがないにしても、確認をローカルだけで済ませちゃいけない。初歩の初歩。
[03/21 22:23:41]
perl の Json はエンコードする時に
・記号だったらエスケープ
・日本語(バイナリ)だったらエスケープしない
という細かい制御ができないらしい。
やりたいことは「<」「>」をエスケープしておきたい、だけなのに手強くて…結局、encodeした文字列を正規表現で置換するのが解決方法らしい。
sub json_str{
my $self = shift;
my $args = shift;
return if ! $args->{ref};
my $json = JSON->new->canonical(1)->indent(0)->space_before(0)->space_after(0);
my $str;
eval{ $str = $json->encode( $args->{ref} ) };
if( $@ ){
printf qq{ERROR json_str :: activity.pm --- %s\n}, $@;
exit;
}
my $esc = sub{ my $str = shift;
$str =~ s!<!\\u003c!g; $str =~ s!>!\\u003e!g;
return $str;
};
$str =~ s!"content":"([^\"]+)"!sprintf(qq{"content":"%s"}, $esc->($1))!e;
return $str;
}

