ActivityPubサーバーに絵文字リアクション

自作実装のActivityPubサーバーで、フォローさんや投稿に対するリアクション「Like」(いいね)は実装済み。WEB拍手的な使い方、ちょっとした賛同をお相手に送るというリアクション。
これで十分だと思ってやってたんだけど。追悼など失意系の投稿に対して「いいね」はさすがに使えない。そんな時は、メンションを送ってお悔やみを投稿するという方法しかなくて、お相手との距離感的に言葉を選ぶのが難しいケースも多い。
Misskeyに代表されるFediverseのサーバー(インスタンス)では絵文字リアクションという方法がある。
「いいね」だけで足りないところを、絵文字で違うニュアンスのリアクションを送り合う。
言葉ではなくて、たぶんこういうふんわりしたちょっとした感情表現もコミュニケーション、SNSならでは、というやつだ。
てことで、
送信する場合限定で絵文字リアクションを実装することにした。
ちなみに、
受信する場合の絵文字リアクションは実装しない。良いリアクションも悪いリアクションも、等しくリアクションという認識なので気にしない。
ただ、
絵文字リアクション=EmojiReactはActivityPubの仕様には入ってないので、サーバーによって対応にばらつきがある。
「EmojiReact」というActivityは仕様にはないので、対応していないサーバーのことも考慮してのことだと思うけど「Like」のActivityに絵文字を仕込むことが慣例的(?)っぽい。
これだと、お悔やみ系の絵文字を送ったつもりが、絵文字に対応していないサーバーに届くと「いいね」や「ハート」になってしまう。
逆に(?)そういった事故を防ぐために「Like」ではなくて「EmojiReact」をActivityとして送れば、対応していないサーバーは「いいね」にすることもなく、Activityをスルーしてくれる。
というやりかたもあると教えていただいた。
どちらを採用するにしてもサーバーが絵文字に対応してるかどうか確認が必要となる。
サーバーが絵文字に対応してるかどうかは、たぶん「nodeinfo」に記載されているだろうから、nodeinfoを見てから送信する/しないの判定を入れるのが良いと思う。
…けど
1)nodeinfoを見てnodeinfo2.NのURIを取得する
2)nodeinfo2.Nを見てemojiの有無を確認する
という2つリクエストが必要になる、よなあ。
その都度リクエストを飛ばして、サーバーの対応状況確認については、ちょっと保留。
現状見た感じで、サーバーごとの絵文字対応状況は
絵文字非対応→「いいね」になるサーバー
→Mastodon系ほぼ全部
絵文字対応サーバー
→Misskey系(IceshrimpやFirefish)、Akkoma・Pleroma系、Fedibird、kmyblue、mitra
無駄なリクエストを飛ばさないようにリストでも作って運用かな。
実際のActivityやJSONでの絵文字の指定などは、もう少し固まったらホームページの方でページを作ろう
「おひとり様ActivityPubサーバーの自作実装」
https://www.doncha.net/activitypub.html
使う絵文字は、unicodeで既定の絵文字、カスタム絵文字(独自の絵文字)の2種類。
本当は絵文字を自作したかったんだけど…て、メモ用紙に手書きで絵を描いてスキャナーで取り込んで4時間ぐらいごちゃごちゃやってみたんだけど、話にならない。目も当てられない。便所の落書きにもならない酷いシロモノ。
40年ぐらい前、エロ漫画の編集をやってた頃は原稿取りに行ってトーン貼りベタ塗りとか手伝ってたし、官能小説雑誌の穴埋めコラムのイラストも描いてたというのにまるで駄目だ。
手を動かす脳を動かすのはある意味筋肉と同じで使ってないとダメになるから、とマンガ家さんたちが口を揃えてたのを思い出した。
https://volpeon.ink/emojis/neocat/
SNSでぼやいたらフリーで使える絵文字を教えていただいてダウンロード。280弱あって全部入れても老眼にはツライだけなので、5つぐらいに絞って登録。とりあえずこれで様子見。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
満身創痍だった

5月9日に整形外科で診てもらった。
・左手の人差し指と中指の指先が痺れている、絆創膏が一枚貼り付いたような感じ
→頚椎に異常。軟骨が神経に干渉圧迫していることが原因
・右脇、お腹に力が入ったら(咳や姿勢を変えたりしたら)ギリっと痛み
→肋骨が折れていた
どちらも自然発生らしく、特にこれといった治療はなく自然治癒。骨折の痛みに湿布が処方されて終了、だった。
自然発生/自然治癒…なにそのひとりマッチポンプ状態、だなあ。
3/20に背中、左肩甲骨の上あたりに激痛。
大動脈なんちゃらとか膵臓なんちゃら!?とかの噂がよぎって焦る痛みで、かかりつけの内科に。
心電図、レントゲン、CTの検査の結果、内科的なところは問題がなさそう、放射線専門医(?)にも所見をもらうのでそれも見てから、整形外科で診てもらいましょう、ということだった。
次回の定期診断は4月1日だし、それまでは待機となった。
背中の激痛は2日ほど続いて、その後、今度は肩の痛みだったり、左胸と腕の付け根あたりがつっぱったような痛みが2週間ほど続き、指先の痺れが始まった。
4月の半ばあたりに今度は右脇に痛み。
姿勢を変えたり、咳をしたり、お腹に力が入るような状況でギリギリっと痛みが走る。
どちらも、特になにかをした/あったという心当たりもなく。
整形外科の先生に「歳ですかねえ」と聞いたら「いえ、年齢は関係ありません」ときっぱり。わりとありがちなことらしい。
生活面で気をつけるようなことは特にないらしい。とはいえ肋骨が折れてるので激しい運動はNG。
肋骨の骨は2〜3週間で自然治癒。頚椎の異常は時間がかかるらしく自然治癒に半年以上はかかるとのこと。
で、今回一番の問題は、整形外科で診てもらうまでに1ヶ月以上放置しなきゃいけなかった、ということ。
今年度、2025年3月31日で契約を終了した会社から、契約終了に伴うもろもろの書類がすぐに届かず、社会保険から健康保険に切り替えができなかったのだ。
結局、書類が届いたのは5月8日。
まるまる1ヶ月と1週間、無保険状態となっていた。
なもんで、やっと5月8日に国民健康保険に切り替えて、5月9日に整形外科で診てもらえた。
この手の書類で1ヶ月以上かかったのは今回が初めて。わたしの場合は健康保険が切実だったけど、失業給付の手続きにも影響する書類だ。たしか離職票の発行(?)なんかは法律で決められてるはずで、これだけ放置されると労基署案件(今週届かないようだと来週には労基署に行って相談しようと予定してた)
いろいろ、うんざりとげんなり。
地元公園はすっかり新緑。空気まで緑に染まっていた。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
GBLシーズン力と極みでACE到達

どうにか今シーズンACEに到達。
去年2024年5月以来だからほぼ一年ぶりの称号だ。
ここんとこポケモンGOを開くこともなくなっていて、GBLもそのモチベーションがガタ落ちしてた。
自作実装のSNSが面白くてそっちにほとんど時間を使っていて、それ以外のことはぜんぶ後回しだった。
なもんで、昨シーズンなんかはランク10。対戦数はわずか45というありさま。
このままアプリとはさよならかな、と思ってたところ、コロナ禍以来、古巣の友人でいまはポケモンGO友達から久しぶりのメールでふたりオフ会。彼はレジェンド到達者でご家族で今もポケモンGOを楽しんでる。
話してるうちにふたたびモチベーションが高まったというところ。
そもそも、ほとんどやってなかったんで、なにそのパワースポット?ダイマックスてなに?とか新しく実装されたイベントなんかの遊び方も教えてもらってウォーキングの時もポケモンGOを開くようになった。
おもてに出て、フィールドでのポケモンGOはやっぱり面白いよなあ、と改めて。
で、GBLもふたたび参戦するようになり、先日やっとACEに到達。春カップというCP1500以下の特殊レギュレーション。
ポケモンGOは
・歩くことで健康的に
・対人戦で頭を使うことでボケ防止に
還暦過ぎた老人に、カネもかからないし良い趣味のひとつだ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
perlでMP4やMOVの縦横サイズを取得する

タイトルのまんまのエントリ。
動機としては、ウチのおひとり様ActivityPubサーバーに動画をアップロードしてみたい。
んで、ActivityPubサーバーは、フォロワーさんのところに投稿(ActivityのJSON)を配送するんだけど、この時に縦横のピクセルサイズが必要っぽい。
動画を扱う時に、鉄板の定番のffmpegでサイズ取得も当然、ほかに解像度変更やファイルサイズの圧縮とかいろいろできるんだけど、レンタルサーバーでffmpegを使えるという話を見たことがなく、当然わたしが利用しているロリポップも使えない。
となると、縦横のピクセルサイズは自力でなんとかする必要がある。
ぐーぐる先生に聞きまくってなんとかなったのでメモ。
「MP4のファイル構造を解説」
https://qiita.com/satken2/items/d14b4113fe3fb5f5597b
↑こちらのサイトで一発解答(多謝!)
MP3とMOVファイルは基本3つのブロックの塊らしい。
サイズ | タイプ名 | データ |
4バイト | 4バイト | 可変 |
最初の4バイトに入ってるサイズでブロック全体の長さがわかる。
BOXの長さの情報が2^32バイト(=4294967296)を超える場合、最初の4バイトには0x00000001が格納され、その変わりに9バイト~16バイトに実際のBOXの長さが書かれます
ということだけど、今回わたしの場合は10秒もないようなSNSに上げるためだけの動画なのでスルーする。
そのブロックにもろもろの情報が入っているので、欲しいところを取得する。
このブロックのタイプはいったいなんなの?というのは
「QuickTime File Format」
https://developer.apple.com/documentation/quicktime-file-format#//apple_ref/doc/uid/TP40000939-CH204-SW1
↑こちらに全部ある。
ここまでわかればやることはわりと単純。
1)最初の4バイトをみてブロックサイズを取得
2)次の4バイトをみてブロックのタイプを取得
3)必要なタイプだったらそこで情報を取得して終了
必要なタイプじゃなかったら次のブロックをみにいく
ちょっとハマったのが
各ブロックはデータを持たないものと持ってるものがあるということ。
しょうがないんで、次のブロックを先読みしてタイプ名があるかないかで判定。
以下で欲しい情報が取れた。
わたしが欲しいのはタイプ「tkhd」(たぶん、トラックヘッダーの略)のブロックのデータ部に入ってる幅と高さ。
my @parent = (
'cmov', 'ctts', 'edts', 'esds',
'free', 'ftyp', 'iods', 'junk',
'mdia', 'minf', 'moov', 'mvhd',
'pict', 'pnot', 'rmda', 'rmra',
'skip', 'stbl', 'trak', 'uuid',
'wide');
my @child = (
'fiel', 'mdat', 'rdrf', 'rmcd',
'rmcs', 'rmdr', 'rmqu', 'rmvc',
'wfex', 'cmvd', 'co64', 'dcom',
'elst', 'gmhd', 'hdlr', 'mdhd',
'smhd', 'stco', 'stsc', 'stsd',
'stss', 'stsz', 'stts', 'tkhd',
'vmhd');
open(IMG, $file) || die;
binmode IMG;
my $len; my $type; my $data;
my $width; my $height;
while(1){
my $buf;
read(IMG, $buf, 4);
$len = unpack("N", $buf);
read(IMG, $type, 4);
last if ! $type;
# check next type
my $has_data;
seek(IMG,4, 1) || last;
read(IMG,$buf,4);
last if ! $buf;
$buf = quotemeta $buf;
unless( grep(m!$buf!, @parent) || grep(m!$buf!, @child) ){
$has_data = 1;
}
seek(IMG, -8, 1);
if( $has_data ){
$len -= 8;
last if $len < 0;
my $begin = tell(IMG);
read(IMG, $data, $len);
}
if($type =~ m!tkhd!){
my @check = unpack("x76 n x2 n", $data);
if( $check[0] && $check[1] ){
$width = $check[0]; $height = $check[1];
last;
}
}
}
perlはやっぱり凄くて、バイナリファイルも簡単に扱うことができる。
とはいえ、それを扱うスキルがない人間のせいでずいぶん時間がかかってしまった。
これでうちのActivityPubサーバーに動画をあげるための下準備はできた!
…と思ったんだけど、動画ファイルって5秒ぐらいのものでも1M〜2Mもあって慌てた(今さら
わたしはロリポップのビギナーコース。そんなでかいファイルを気楽に上げてたらあっという間に利用できるディスクスペースを食い尽くしてしまう。
なもんで、ここまで作ったけど諦め。きっとそのうち何かの約に立つ、こともある、かな。
今の時期、まじでタケノコ美味くて悶絶する。
刺身で美味いのはもちろん、焼きタケノコがもう絶品。
水分を飛ばすイメージでじっくり弱火のフライパン。水分が飛んできたかなと思ったらオリーブオイルを回しかけてタケノコに焼きめをつけて、塩をふたふり。
これだけでいくらでもご飯が食えるし酒が飲める。
マジでオススメ!!!
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
おひとり様ActivityPubサーバーの詳細

先月、ウチのおひとり様ActivityPubサーバーの全体像、実際やってることはホームページに個別ページを作って掲載した。
あらためて、こっちのブログでもその告知。
ブログとホームページの棲み分けというか、以前、SNSに投げた通り
1)SNSで思いつきをちらほらメモ
2)ブログで自分のSNSを見ながら動機や経緯を整理
3)1と2を経て、ホームページに完結した個別ページとして掲載
各Activityを実装するにあたってのブログのエントリとそれを完結させた個別ページはあるけど、サーバー構成について完結させた個別ページはあるけどブログのエントリはなかった。
上記の棲み分けでいうと、2)→3)ではなく3)→2)が今回のエントリ。
おひとり様ActivityPubサーバーの構成::On Golden Pond
https://www.doncha.net/activitypub/activitypub013.html
↑ホームページ掲載はこちら
大雑把にやってることは
・htaccessでリクエストのリダイレクト設定
・リダイレクトされたリクエストをスクリプト1で処理
・ActivityPubの仕様通りにスクリプト2で対応
ウチの構成を丸裸…こういうページを作ることで、自分でも未確認だったり再確認することがいろいろ出てきてびっくり。
昔からよく言われるように「ひとに教えるのは自分に教えることになる」というやつか。
自作実装したのは「自分のわかる範囲で片付ける」ため。
仮にMastodonなど定評のあるActivityPubサーバーソフトウェアをめちゃくちゃ頑張って導入/設定したとしても、何か問題が出た時に、自分のスキル/知識では解決できるとは思えない。管理運用するサーバーの種類も多いし、それらを操作する言語もひとつじゃ済まないし。
おひとり様でサーバーを立ててFediverseに参加できても、すぐに退場することになるんじゃ困る・面白くない。
てことで
・ドメイン取得済み
・レンタルサーバー契約済み
・perlならどうにか手癖で書ける
・apacheなら少しわかる
・データベースも少しはわかる
・htmlとcssは手書きできる
という現状環境と自分のスキル/知識の範囲内。
ActivityPubの仕様、というか決められてる「約束事」は最低限のリクエストのやりとりだけだし、上記程度のスキルで対応できる。
仕様を実装した上で、気をつけたのはひと様の投稿の扱いだけで、それ以外はいろいろがっつり省いた。
だいたい、フロント側はアクセスしたらタイムラインを表示するだけ。もちろん、ページ更新は手動で再読み込みというチープな作りだ。
それでも十分面白いし、自分のタイムラインにどっぷりハマってる。
現状環境、スキル/知識の範囲内でいうとphpやrubyを使えるひとが多いだろうし、phpやrubyでwebというひとはデータベースも使えるだろう。ドメインやレンタルサーバーなんかは外食2回分ぐらい。
やってみると、思っていたよりもFediverse参加のハードルは低い。
おひとり様サーバーを作って参加してみませんか!?
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
お散歩デジカメ日記2025年3月号

個人ホームページのお散歩デジカメ日記に月刊デジカメ徘徊老人日記3月号追加した。
今年はウォーキングを頑張るのがひとつの目標。
還暦すぎると健康第一。その健康維持とボケ防止のため。年初から3ヶ月続いていて、ウォーキングがほぼ習慣化してる。デジカメでパシャパシャ撮るものを探して歩いて、同じコースでもちょっとした発見があるので飽きない。
そうして撮りためた写真をホームページに掲載する、という成果物を得られるんで、一石二鳥。
お散歩デジカメ日記::On Golden Pond
https://www.doncha.net/toydigi.html
1月2月は撮ったものを、なんの加工もせずそのまんま。
今月、3月は縦横比こそそのままだけど、少しトリミングをしてみた。
KODAK PIXPRO FZ45はデフォルトのワイドの画角は50mm換算27mmとかなり広い。ズームすればいいんだろうけど、ぱっと撮りたい時にいちいちズームして〜とかやってられない。
そもそもウォーキングの記録、みたいなもんだしあまりこだわってもなあ、と。
とはいえ、ホームページに掲載するにあたって、写真を選んでると、ここもっと寄りたいよなあ、こっちに詰めてこっちは広がりを残したよなあ、とか欲が出てくる。
色味の調整とかフォトショでやりだすとキリがない。そもそもFZ45で写真の保存形式はjpgなのでそれをいじると劣化することになるし。
ただ、構図については、少しいじってみようと、今回はいくつかの写真でやってみた。
昔、新卒で入った底辺エロ出版社で写真集のために写真のトリミングはさんざんやってたことを思い出す。見せたいものを見せたいように見せるのも編集者の仕事、ということだったなあ。
まあ、還暦すぎの趣味、続かないと意味がないんで気楽にやっていこう。
個人ホームページ 『On Golden Pond』 はオレオレMovableTypeが生成する静的ページ。それってのは、表示速度最優先のため。
なので、1ページに表示させる写真は1枚限定。
ページ遷移してもらう=クリックしてもらう、というのはかなりコストが高くてほとんどのひとはクリックしないもの、というのは理解してるけど、それでも、それ以上に表示速度はだいじだ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」