自作ActivityPubの改修メモ

2026/3/21 [13:50:16] (土) 天気

いつ何をしたか、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で回して処理するためのスクリプトがある。こっちは本体の改修がひと段落してから、だなあ。

本体側に入れこんじゃって一本化したいところもあるし…。

ボケ防止にはちょうどいいかもだ。


今回のエントリに画像がない…先日買った鰯の写真を無理やり載せよう。


image

最近、マイワシが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))!ge;
     return $str;
}

19世紀のオマイラ

2015/3/21 [19:37:33] (土) 天気

米川正夫訳の「地下生活者の手記」(河出書房ドストエーフスキイ全集5)を写経してるんだけど、こりゃとんでもないしろもの。びっくり。


わたしは単に意地悪な人間ばかりでなく、結局なにものにもなれなかった。悪人にも、善人にも、卑劣漢にも、正直者にも、英雄にも、虫けらにもなれなかった。

いやもう世の中に対する呪詛にこじらせてくどい自意識に…おもしろくってしょうがない。

まだ「第一 地下の世界」で、このわくわく感。


見栄をはってもしょうがないのでぶっちゃけると。

ドストエフスキーは北垣訳の『罪と罰』を電子書籍で読んでぶっとんだんだけど、『白痴』『賭博者』が途中放棄で、『悪霊』も『カラマーゾフの兄弟』も未読。


「地下生活者の手記」がこれほどとは。

ディックも平井和正も、ネットのこじらせたひとたちも、これに全部出てきてるような気がする。


ところで、諸君、わたしはいま諸君が聞くことを望むにしろ、望まないにしろ、なぜわたしが虫けらにさえなれなかったかというわけを、話して聞かせたいとおもう。堂々といってのけるが、わたしは今までなんど虫けらになりたいと思ったかしれない。けれども、わたしはそれにさえ値しない人間だったのだ。諸君、誓っていうが、あまり意識しすぎるということは、それは病気なのである。間違いのない本ものの病気なのである。

文中にかなりの頻度で「諸君」という呼びかけがはいってるんだけど、これって般若心経でいう「舎利子」だよなあ。



まずは写経をして、それから音声合成をする。

こんなブラックホールのような小説に音声をつけて聞きながら読むのはどんな体験になるのであろうか。

(図書館の返却期限が4/1なので、それまでには写経を終える予定…は未定)




[2016/01/01 09:24:05]

2016年1月1日。米川正夫訳の著作権が切れたので、ドストエーフスキイ『地下生活者の手記』を公開。


EPUB3電子書籍とテキストデータ

http://t2aki.doncha.net/release/chikaseikatsusya-no-syuki.zip

image


結局、音声合成作業は中断・断念。


作業してたんだけど、音声のクオリティを考えた時に、無料で使える音声としてはOtoya(Mac)やHaruka(WINDOWS)などのシステム音声の方が聞きとりやすいというのを実感。

ただ、システム音声をつけた電子書籍を公開することは権利的にできないので、そのかわりと言うのも変だけど「音声付きEPUB3電子書籍の作り方」についての説明ページを作った。


音声付きEPUB3電子書籍の作り方

http://t2aki.doncha.net/?id=1449791838


↓江川卓訳・新潮社版はこちら

地下室の手記

『地下室の手記』

ドストエフスキー

[更新]2016-02-08 16:02:03

かんたん電子書籍作成の小ネタ

2013/3/21 [12:48:36] (木) 天気

「EPUB3::かんたん電子書籍作成」(http://books.doncha.net/epub/)に限った話ではなくて、EPUB3のHTMLにスタイルシートを直接書き込んで調整。


かんたん電子書籍作成は、面倒くさそうなものは極力見せない方針で、今日時点で用意しているオプションも小見出し・扉・挿絵・縦中横・ルビ程度(中は単純なHTMLなので、ここで作ったファイルをひな形として、高度なレイアウトデザインは直接HTMLやCSSをいじり倒して編集してもらおうということで)


要望の多そうな3つの編集例

・小見出しだけを横書きにする

・章立て以外のところで改ページする

・字下げする


OEBPS/text/contents001.xhtml をエディタで編集。

image

【赤の部分 小見出しだけ横書き】

小見出しの h2 にスタイルを直接記入する(styleの「”」でくくられてる中は改行しても大丈夫)

「Part1 Beginning」だと長いので「Part1
Beginning」として改行している。


・横書きの指定2行

-webkit-writing-mode:horizontal-tb
 -epub-writing-mode:horizontal-tb

・h2の横幅を指定する(文字数で指定して確認)

width:6em

・4文字分字下げ

margin-top:4em

・フォントのサイズを1em

font-size:1em

・アンダーラインをひく

border-bottom:1px #666 solid

【青の部分 強制的に改ページ】

「かんたん電子書籍作成」は目次への登録もかねて、章立て(小見出し・扉)単位でファイルを分割して改ページとなる。章の中で改ページするにはスタイルシートをHTMLに直接記入する。


「翌朝は〜」の前で改ページする。

page-break-<span style="color:#dd3300">before</span>:always <span class="note">(後ろで改ページなら page-break-after:always)</span>

【緑の部分 3文字分字下げする】

margin-top:3em
で、この段落(pタグ)全体が3文字分字下げされる。


以下、Kindle Previewer でのスクリーンショット

image
image
image

[更新]2013-04-25 18:08:43

冷たい雨の春分

2011/3/21 [10:44:25] (月) 天気

朝から冷たい雨。

東日本巨大地震の影響で、東京電力が計画停電。となると、ウチのポンコツサーバーを稼働させておくのがヤバイ。そもそも停電するのかしないのか分からないし。UPS程度じゃ持たない。稼働中に、バチンと停電して電源が落ちて、ハードがいかれてデータを飛ばしたり、復旧不能修復不能になると怖い。


ということで、ウチのサーバーは電力事情が落ち着くまで、休止することにした。読書SNSを利用してくださっているかたにはほんとに申し訳ありません。


この雑記帖と自作twitterクライアントはlolipopに避難。ケータイ投稿はフォト蔵を使うことにした。読書SNSも避難を考えたんだけど、DBとperlのモジュールがlolipopじゃ無理で、そもそもlolipopのmysqlは、いったいナニやってんだ、と呆れるぐらい重い。


聞きかじり。

原子力発電がまるっと全部なくなったとしても、1985年水準の電力供給能力があるらしい。経済とか技術とかひたすら右肩上がりじゃなきゃいけないから原子力発電に頼らざるを得ないとすれば、なんか変だよなあ。1985年って充分じゃん。

星待ち花の揺れる庭

『星待ち花の揺れる庭』

日野裕太郎

[更新]2013-02-18 22:20:31

久しぶりに御茶ノ水神保町

2009/3/21 [21:02:54] (土) 天気

漫画屋塩山さんの新著「出版奈落の断末魔 エロ漫画の黄金時代」(アストラ 1600円)が御茶ノ水神保町の東京堂という本屋には並んでいるということなので、久しぶりに御茶ノ水に出かけてみた。罵倒芸、啖呵が健在。自爆風味も混じって切れ味も鋭い。

山田正紀が山田風太郎の「甲賀忍法帖」を書いたという「神君幻法帖」(徳間書店)それだけでも買いなんだけど、なんと表紙が佐伯俊男さん。これも慌てて買わなければならない本だったので、レジに。


と、昼ごろから出かけたのはいいけど、なんだか体調が悪い。風邪っぽいのか熱っぽいのか。体のふしぶしが痛だるい。

調子が出なくて、早々に地元に引き上げる。亀有ラーゾでカレーを食って、駅前でフィルムを引き取って帰宅。ウチでボンベイサファイアを飲みながらこうしてだらだらへたる。


image
COSINA CT1 SUPER Kitstar 28mm F2.8

Kitstarという出自も不明なレンズで、寝ぼけた写りなんだけど。28mmという画角はやっぱりいいなぁ。視野と似てるというか、スナップにはちょうどいい画角だ。


…今日は早めに転がるか。


神君幻法帖

『神君幻法帖』

山田 正紀

[更新]2012-06-18 18:04:05

<<2026/03>>
       
1234567
891011121314
15161718192021
22232425262728
293031

【最近の10件】

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