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

ホームページに「おひとり様ActivityPubサーバーの自作実装」ページを追加した。元ネタはこのブログに書いてきたエントリ。
ブログは便利なんだけど、ひとつのテーマのエントリを追いかけるのが面倒くさい。タグづけしたところで、わかりやすい体裁にはならない。なもんで、個人ホームページの静的ページで再構成してみようとちょっとずつ。
おひとり様ActivityPubサーバーの自作実装
https://www.doncha.net/activitypub.html
ていうか、2023年8月頃にActivityPubサーバーを実装…たかだか去年のことなのに、もはやいろいろ忘れていて、自分にビックリ、だ。機能追加のたびに、自分で自分のブログのエントリを辿って確認するのが怠い。
それと、この自作ブログは日常雑記を対象に作ったもので、スクリプトやHTMLなんかのコードの記述・掲載は後からつけたし。めちゃくちゃ見にくい。
ホームページでペラ1枚の静的ページにしてしまえば、問題はすべて解決。
エディタで直接html、cssを書くだけなので、タグやコードなんかもやりたい放題。
webfingerなどFediverseからアカウントとして認識されるのに必要なファイル
https://www.doncha.net/activitypub/activitypub001.html
公開鍵・秘密鍵を使って署名の生成と認証
https://www.doncha.net/activitypub/activitypub002.html
↑xmlなんかの不等号記号だけは変換する必要があるけど、それ以外は全部OKなのが気楽。
そもそもブログは動的なので、入力されたものはリスク回避もろもろのために入力内容を確認してよろしくない記述、文字は別のものに置き換えたり削除したりしている。
ので、書き込む時にどうしても不自然で不便になってしまいがち。
静的ページの自由度には敵わない。
松戸市立博物館の特別展で変な土器をたくさん見てきた!
展示の数も内容もはんぱなく充実していて驚いた。ハコモノ行政の正しい使い方だなあ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
On Golden Pond

昭和還暦の黄昏箱庭ホームページもそろそろ見せびらかしてもいいかな、というところまで仕上がったので、お知らせエントリ。
『On Golden Pond』
https://www.doncha.net
今日時点のメニューは
・ひまつぶし雑記帖(当ブログ)の更新情報
・ため池::ところてん(おひとり様ActivityPub)の更新情報
このふたつは各々のURL、ページへの外部リンク。
・掌編雑文の書き散らかしページ
・ダウンロードフリーの電子書籍ページ
・リンク集ページ
・運営者ページ
これらは内部ページ。随時更新予定。
ActivityPub自作実装ページやEPUB電子書籍制作ページなんかも作る予定。
javascriptなんかは使わない、htmlとcssだけのホームページ。
アクセスログの取得もしないし、シェアボタンやアフィリエイトボタンも設置しない。
すべて静的ページで、ほんとただの「ペラ1枚」のホームページ。
内部ページについてはエディタでHTMLとCSSを手作業で直接書いてFTPでアップロード。という80年代そのままの作業フローだ。
いやもう、アクセスして表示するまでの「超っ早さ」には改めてびっくりした。
うちのサイトはほとんどがperlで動的表示させていて、アクセスだのデータベースだのいろいろ動くのでアクセスして表示が完了するまで、少しくるくるすることが多い。
「on golden pond」はただの静的ページだけ。
80年代のホームページみたいなもんだ。当時と違って格段に早くなってる回線状況ということもあって、ほんと「超っ早」
ただ、ヘッダーやフッター、メニューなんかは各ページで共通なので、そのあたりまでいちいち手作業でHTMLを書いたところにコピペするのはタイプミスの元。
本文部分を作ったら静的ページ生成はperlにまかせることにした。
オレオレMovableTypeだ
ブログやおひとり様ActivityPubの更新情報は各々、ブログが吐くRSS、ActivityPubが吐くoutboxをcronで1日2度スクリプトを実行して自動収集。
自動収集したら静的ページを生成。
各ページは本文を手作業でHTMLとCSSを書いてFTPでアップロード。
アップロードしたら、既存のページとタイムスタンプを比較して新規ページの方が新しかったら静的ページを生成。
これも1日2度のcronで実行するスクリプトに仕込んだ。
手作業、エディタでhtmlを書くのは久しぶり。
何であれ、カタチにする作業は楽しいものだなあ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
ホームページを作った

タイトルまんま。ホームページを作った!
ブログだのSNSだの、インターネットで承認欲求とか小銭稼ぎとか、面倒くさいというかしんどい。いや、五月蝿い。
デザインもオサレでゴージャス、それでなおかつ、きちんと情報が整理されたシンプルな構成で、動線設計なんかもユーザーフレンドリーで、とか、そういうのももういい。
アクセスがたくさんあって、いいねされたり言及されたり、そんなのももうどうでもいい。
ということになった(自分協議の結果)
で、アクセスログも取らない、シェアボタンも設置しない、情報も乱雑で、デザインなんかテキトー、たぶん誰にも見られないものを作って自己満足してしまおうと。
それって今どきのブログやSNS、「WEBサイト」じゃなくって、80年代の「ホームページ」
初めてbiglobeでホームページを作った時のことを思い出しながら、改めて「ホームページ」を作った。
当時はそれこそわけもわからず、何になるのかもわからず、とりあえず参考書を見ながらエディタでHTMLを書いてFTPでアップロード。ブラウザで自分の作ったものが表示されるだけで嬉しかった。いやマジでめっちゃ嬉しくて、ディスプレイを見ながらにやにやしてた。
今どきのインターネッツだとそれだけじゃダメで、拡散してたくさん見てもらってこそ、とか。ぶっちゃけ、それに踊らされて躍起になったこともあった。仕事でSEOなんてのを担当してたこともあったしなぁ。
ホームページのタイトルは「On Golden Pond」
これはヘンリー・フォンダ、ジェーン・フォンダ親子共演の映画『黄昏』の原題。
デイブ・グルーシンの音楽と、めちゃくちゃ綺麗な絵が印象的で大好きな映画。biglobeに作った初めての「ホームページ」のタイトルに使わせてもらった。
今回もそのタイトルにした。
回帰、というか。
還暦を過ぎて、もういい加減、かなり歳を食ったことを自覚実感したなあ、ということかもしれない。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
サブルーチンの確認

perlで自作したおひとり様ActivityPubサーバーはその後も増築改築をちまちま続けていて、例によってその場での思いつき、やっつけ仕事の現物合わせ仕様で、わけわかめ状態となっている。
Activityを約束事どおりに対応するモジュール(pmファイル)で、いったい何をしてるのか。
もうすでに忘れてる自分がいるので、サブルーチンの洗い出し用にテキトーなスクリプトをでっちあげた。という覚え書きが今回のエントリ。
#!/usr/bin/perl
use strict;
use utf8;
use Encode;
my $f = shift(@ARGV);
if(! -e $f ){
printf qq{Not Found pm %s\n}, $f;
exit;
}
open(IN, $f) || die;
my $name; my @buf=; close(IN);
foreach (@buf){
if( m!^sub (.+) *\{! ){
$name->{$1}++;
}
}
printf qq{sum : %s\n}, scalar( keys %{$name} );
foreach my $sub (sort keys %{$name}){
my $pm = join('', @buf);
my $cnt = $pm =~ s!$sub!!g;
printf qq{%s :\n}, $sub;
my @called; my $zzz;
if( $cnt > 1 ){
my $subname;
foreach (@buf){
if(m!^sub (.+) *\{!){
$subname = $1;
next;
}
if( m!\$self\-\>$sub! && !$zzz->{$subname}++ ){
push(@called, $subname);
}
}
}
printf qq{\t%s\n}, join("\t", sort @called);
}
・サブルーチンの総数
・サブルーチンの名前
・サブルーチンを呼び出しているサブルーチン
ぐらい見えれば、そこそこ役に立つかなあ、と。
文字列検索でひっかけてるだけで、signなんかはサブルーチン呼び出しじゃない部分にもヒットする。本当は動かしながらcaller()でチェックするのが確実…だけど、ざっくり見るだけのためにあちこちにcaller()を仕込むのはうっとーしいんで却下。
使い捨てのつもりで書いたスクリプトだけど、思ったよりちゃんと見えるようにしてくれたので自画自賛&エントリとして書き起こし
10/4、ポケモンGOの対人戦GBLでACEに到達。
初期レートが1984で、ACE到達時のレートは2007。GBLで遊んでいて、ずっと継続してACEにたどり着いてたんだけど、前期初めてACEに到達できず、今期もやべえかなあ、と思ってたので、ほっとひと息。
まる6年続いているゲームで、まだ全然飽きないのがすげーす。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
ファイル同期のためのrsyncで使うオプション

仕事で使っているchromebook2台でスクリプトファイル類を同期しておきたい。
そのためにメイン機から更新のあった(タイムスタンプが新しい)ものだけをコピーしたい。
てな時にlinuxだとrsyncが便利。
scpやsftpもあるけどscpもsftpもタイムスタンプを比較できないっぽいので、今回のような場合はrsync一択。
unix系ツールの例に漏れず、rsyncもオプションが豊富ですぐにわけわからなくなってるんで、自分の使う範囲のオプションをメモ。
rsync --include="*.pl" --include="*.pm" --exclude="*" -auv -e "ssh -p 10022" [ローカルディレクトリ] ユーザー名@192.168.0.NN:[リモートディレクトリ]
--incluce="*.pl"
--incluce="*.pm"
同期したい対象ファイルは拡張子が「pl」か「pm」
--exclude="*"
includeしたもの以外は同期対象外
↑これがわかりにくくて、includeとexcludeの順番がだいじ。
まず、対象を指定して、最後にそれ以外全部除外という命令になっている、らしい。
-a
以下全部をまとめて指定
・ディレクトリを再帰的に処理する
・シンボリックリンクをシンボリックリンクのままコピーする
・パーミッションを保持する
・タイムスタンプを保持する
・所有グループをそのまま保持する
・所有者をそのまま保持する(自分以外の所有者を保持するにはroot権限が必要)
・デバイスファイルや特殊ファイルを保持する(「--devices --specials」相当
-u
・更新のあったものだけをコピーする
-v
・転送状況を表示する
-e "ssh -p 10022"
・sshで接続する。ポート番号指定つき
わたしの場合は、以上で意図通りに同期される。実際にrsyncを走らせる前に
-n
--dry-run
↑このふたつは、どちらもrsyncを走らせるけど、実際はコピーをしない。コマンドが意図したものになっているか確認するために使うオプション。
--delete
↑コピー元になくて、コピー先だけあるファイルを削除するオプション。deleteから始まるオプションはあぶないのでよっぽどのことがない限り使わない。
rsyncコマンドはコピー元、リモートのコピー先、両方に必要。
(リモートにインストールしてなくて、コマンドが見つかりませんとハマったのは内緒)
ローカルにあるディレクトリごと、USBメモリなんかに同期させるだけなら
from=/mnt/chromeos/removable/USBDrive/_works
to=/mnt/chromeos/removable/_TMP/_works
if [ -d $from ] && [ -d $to ]; then
rsync -anu --delete --log-file=$to/rsync2usb-works.log $from/ $to/
fi
バックアップというより、持ち出して作業する一時的な扱いなので、こういうのは「--delete」をつけて、ローカルにないファイル・ディレクトリはUSBから削除してくれるので便利…でも、くれぐれも「delete」は要注意
[09/19 00:26:35]追記
ディレクトリ指定に注意が必要だった。
ローカルdir1/ リモートdir1
「/」がついてると、ローカルdir1に配置されているファイルがリモートdir1のファイルと同期される。
ローカルdir1 リモートdir1
「/」がついてないと、「リモートdir1/ローカルdir1」とローカルdir1がディレクトリごとリモートdir1の下にコピーされる。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
chromebookでssh

chromebook同士でファイル共有する方法としてニアバイシェアというのがあるけど、なんか思ってたのと違う。なので、sshで繋いでファイルのやりとりを直接やってしまおう、のメモ。
chromebookを2台使っていて、メインとサブという役割分担。
メインで使っていて作業した内容をサブ機にsshで転送・バックアップしておきたい。
まずはchromebookの設定。メイン機のLinux環境からサブ機のLinux環境に繋ぐためにポート転送を設定する。道路を繋ぐための作業、みたいなもの。
サブ機側のポート転送を設定。
「ChromeOSについて→Linux開発環境→ポート転送」
ポート番号はすでに使われている番号以外ならなんでもOK
sudo less /etc/service
↑これで確認できる。とりあえず10001〜10080のあたりが空いてるので「10022」とした
ポート転送を設定することで
1)サブ機のローカルIPアドレス192.168.0.NNにSSHでポート番号を指定してアクセスする
2)サブ機側がポート転送してくれて、サブ機のLinux環境にログインできる
サブ機のLinux環境でsshdサービスを立ち上げる
(サブ機をsshdサーバーにする)
sshdサービスがどうなってるのか確認。
sudo systemctl status sshd.service
この時点では「Active: inactive (dead)」という表示が出ている。ssdは立ち上がっていないので、sshdを立ち上げるために以下の作業。
(sudo、root権限で/etc/以下のファイルを編集することになるので、念のためバックアップを取っておくのが安心安全)
「/etc/ssh/sshd_not_to_be_run」というファイルがあるとsshdが立ち上がらないらしいので削除
sudo rm /etc/ssh/sshd_not_to_be_run
「/etc/ssh/sshd_config」というのがsshdの設定ファイル。
Port 10022
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
PermitRootLogin no
UsePAM no
AcceptEnv LANG LC_*
chromebookのポート転送で指定したポート番号を記載。それ以外は呪文でOK(ルートでアクセス許可するかとか)で、上記以外はデフォルトのままでOK.
設定ファイルを編集したらsshdサービスを立ち上げる
sudo systemctl restart sshd.service
立ち上がってるか確認
sudo systemctl status sshd.service
「Active: active (running)」という表示が見えたら無事sshdのサービスは立ち上がっている。
サブ機のLinux環境のHOMEディレクトリに「.ssh」というディレクトリを作成。
chmod 700 .ssh
として、権限をオーナー限定にしておく。
メイン機でsshの秘密鍵と公開鍵を作る
ホームディレクトリで
ssh-keygen
途中パスフレーズ聞かれて、入力すると「id_rsa」(秘密鍵)「id_rsa.pub」(公開鍵)がHOMEディレクトリの「.ssh」ディレクトリに作られる。公開鍵以外の権限はオーナー限定(0600)
メイン機で作った公開鍵をサブ機のHOMEディレクトリの.sshディレクトリにコピー
scp -P 10022 id_rsa.pub ユーザー名@192.168.0.NN:~/.ssh/.
メイン機で作った公開鍵をサブ機にコピーしたら、サブ機で作業
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
サブ機の.sshディレクトリの「authorized_keys」というファイルに公開鍵を登録(追記コピーしてるだけ)
以上でsshは繋がる。
ssh -p 10022 -i id_rsa.pub ユーザ名@192.168.0.NN
とか
ssh -p 10022 -l ユーザー名 192.168.0.NN
メイン機からサブ機にログインしてごそごそいじったり
scp -P 10022 -r work ユーザ名@192.168.0.NN:work
などとメイン機からサブ機にファイルコピーしたり
sftp ユーザー名@192.168.0.NN:DIR
とか、sftpでログインしてアップしたいディレクトリに移動してから
put -r DIR/
などとメイン機からサブ機にディレクトリごとアップしたり、
ファイル操作がらくちんになった。
とはいえ、コマンドラインなので、上書き事故には気をつけないといけない、よなあ。
ちなみに注意するところがあって。
linux開発環境も、ポート転送も手動。chromebookを立ち上げたり、再起動したら
・Linux開発環境を立ち上げる
・ポート転送をONにする
…というのもあって、どうせ確認するわけだし、IPアドレスも自動割り当てのままにした。
以下のサイトを参考にさせていただきました(多謝
【Chromebook】SSHサーバの設定
ChromebookのLinuxコンテナにSSHでログインする
最近のネタ切れの時の弁当は2色、3色弁当。
なんかこういう手抜きの方が美味しかったりするから、ちょっと悔しい。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」