おひとり様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」に入れるのか、特に決まりごとはないっぽいけど、現状これで問題なくお相手に通知が届く。


[2024/09/04 07:41:50]追記

メンションは「to」にお相手のinbox、エンドポイント、「cc」に自分のフォロワー、というのがお約束っぽい。


ただ、twitterやfacebook、あるいはLINEのように相手にだけ直接送ってそれ以外のひとに見えなくするのは無理。ActivityPubというか分散型サーバーというか。サーバー管理者はPublic指定がないものも含めて全部見ることができる。

twitterだからLINEだから安心とは言えないんだけど、なにかあった時に、抗議する先が一箇所なのか、あちこちいろいろあるのかということ。

ネットは信用しちゃいけいない(閑話休題)


[2024/09/04 07:41:50]追記

「to」にお相手のinboxだけにしておくとActivityPubの約束事として、お相手だけしか見ることができない・第三者は見ちゃいけないことになっている。この「約束事」を守ることで成り立っているのがFediverse。


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で繋がるわけだから、そりゃそうかという話。

iPhone13ProMAXに機種変更

2023/9/15 [13:22:16] (金) 天気

今日はiPhone15の予約開始の日。

そして、わたしのところには整備品で買ったiPhone13ProMAXが届いた。これまで使ってたXSでそれほど問題も感じてなかったんだけど、バッテリーの持続時間が倍違う、という家人のプッシュに乗ってしまった。

アップルケア(2年保証)や、ケース、カバーもろもろで17万円ぐらい。ビンボ世帯にとっては安い買い物じゃないんだけど、正規で買うよりは安かったし、などなどモゴモゴ。


iPhoneに限らず。スマホで最優先されるべきはバッテリーの持続時間。ネットに繋がって、たまには電話できればそれで十分で、それ以外はすべてオマケ。


機種変更でハマったのが。

データ通信は問題なかったんだけど、ネットワークが繋がらない。IPアドレス取得のあたりが怪しい?と思ってキレちらかしてたら、家人がVPSをインストールしてあっさり接続、解決。

iOSとmineoの問題なのか、よくわからないんだけど、mineoのページに行って、VPSをインストールする必要があったらしい。


それ以外は問題なく、XSの環境がそのまま13に移行して、今まで通りに使える。

横に並べておいておくだけで移行できるのって、未来だよなあ、と感心するばかりだった。

image

これはXSで撮った13の写真。13はカメラが売りらしいんで、それっぽい対象を見つけたら撮ってみてみよう。

iPhoneで撮った写真の向きが逆

2023/9/14 [22:03:58] (木) 天気

iPhoneで撮った写真が、タテのはずがヨコになったり、ヨコのはずがタテになったり。iPhoneを縦に構えて撮ってるのに、写真では横になる。

前からちょっと気になってた。


「写真」アプリだと意図通り縦で表示されている。

WEBにアップすると横に転んでしまう。意味がわからない。なんでやねん。

image

検索してみるとiPhoneのジャイロセンサーで縦横が決められるという話が出てくるんだけど、なんか違う。


identify -verbose

してみたら。

Geometry: 4032x3024+0+0

Orientation: RightTop

て、思いっきり横位置で保存されていた。それをExifのOrientationで縦に起こしている。

RightTop

「Right」は横向きで保存されている上側を右側にする

「Top」は横向きで保存されている左側を上側にする

という指示。この通りに表示すれば時計回りに90度回転して縦位置となる。Exif情報を読んで表示できる環境(アプリ)であれば。


とはいえ、そもそも横位置で保存されてしまってるんで、そのままjpgファイルをpngファイルに変換したら横写真になる。


しょうがないんで、画像の回転指示(Orientation)を確認して、指示が入っていたらRotateして縦位置で保存するようにした。

image

Image::ExifToolというexif情報を取得できるモジュールがlolipopにはインストールされていたので実装はすんなり。


my $is_rotate;
my $exif = new Image::ExifTool;                                                                                                                          
my $pinfo = $exif->ImageInfo($ofile);
$is_rotate = $1 if( $pinfo->{’Orientation’} =~ m!Rotate *90 *(CW|CCW)! )

iPhoneで縦位置で写真を撮る=デジカメを縦に構えて写真を撮るということらしい。

ということなら、写真を横で保存するのは正しい動作。てことで回転は90度決め打ち。


だけど、Exif情報にカメラ位置補正を入れるぐらいなら、保存する時に補正してくれ。


てのはともかく、上野の科学博物館で開催の「海展」は、ほんと語彙をなくすほどの凄さだった。どの展示も目を奪われて立ち尽くす時間が長くなる。はやぶさがリュウグウから持ち帰った砂を見られるとは思わなった。ほんとスゲー。

まじオススメ!

「国立科学博物館」

「海 ―生命のみなもと―」

<<2026/1>>
    123
45678910
11121314151617
18192021222324
25262728293031
検索:

【最近の20件】