LWPでtimeout指定が効かない
自作実装のActivityPubサーバーから、フォロワーさんの所属しているリモートサーバーに投稿を送信する時に、お相手のリモートサーバーがなんらかの事情で落ちてるケースがある。
レスポンスは500番代のエラーとなる。
perlで定番のLWP UserAgentを使ってリクエストを投げてるんだけど。
400番代のエラーと違って、サーバーに問題が発生している500番のエラーの場合、返事が戻ってくるのに時間がかかる、待たされる。投稿するためのPOSTもアカウント情報取得のためのGETもなかなか戻ってこない。
デフォルトだと、リクエストを投げてお相手の反応が返ってくるまで180秒(3分)待つことになっている。
LWP::UserAgent - Web ユーザエージェントクラス
https://perldoc.jp/docs/modules/libwww-perl-6.04/LWP/UserAgent.pod
timeout( $secs )
秒単位のタイムアウト値を取得または設定します。 デフォルトのtimeout()の値は180秒、つまり3分です。
サーバへの接続においてtimeout秒反応がないと、リクエストは中断します。 つまり、トランザクションが完了してrequest()メソッドが実際に返るまでの 時間を意味します。
ということなのでtimeoutに10秒とか設定してみてたんだけど、どうもそれが効いてない。
検索したら、やっぱりtimeoutの指定は効かないことがあるらしい。
LWP::UserAgentのタイムアウトがうまく効かなかった事象の調査 (序章)
https://papix.hatenablog.com/entry/2020/12/25/180640
もう少し粘って検索してみると
lWP::UserAgentの「:content_cb」(コールバック)のサブルーチンでSIGNALを設定してalarmで対応できるという記事を発見。
LWP::UserAgent get callback with timeout
https://stackoverflow.com/questions/29071348/lwpuseragent-get-callback-with-timeout
リクエストをサブルーチンで処理することになるのが、素人のわたし的に難しそう…影響範囲がわからない。
思いつきでデフォルトを180秒にしたわけじゃあるまいし、なにか理由がありそう。それをここで指定しちゃうと、全部に影響するわけだしなあ、と。
てことで、それならリモートに投稿を送信するリクエストのサブルーチン限定にしてしまえば大丈夫っぽいんじゃないかと。
サブルーチン丸ごとSIGNALのALRMを設定してevalで捕まえることにした。
結果オーライとか、やっつけ仕事だけは昔から得意だし。
my $res = "";
eval{
local $SIG{ALRM} = sub{die "timeout";};
alarm $self->{timeout};
$res = $self->post_actpb({url=>$u, content=>$args->{json}});
alarm 0;
};
if( $@ ){
printf qq{ERROR deliver %s ::: %s}, $u, $@;
}
設定を15秒にしてみたら、意図通りにtimeoutをキャッチして、待ち時間が少なくなった。
ちゃんとしたActivityPubサーバーのMastodonなんかだと、リクエストの送受信は裏側でやってるんで、アクセスしてるユーザーが待たされることはないはず。
わたしの自作ActivityPubサーバーは最低限で、いろいろ手抜きしていて表示するだけのために3分以上待たされるんだよなあ。自業自得というか。
サーバーのお守り代わりの画像
(松戸市立博物館)
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
perlの再帰でlocalの使い途
perlでディレクトリを辿ってファイルをリストする。
というのは File::Find というモジュールがあるのでそれを使えば一発で解決するんだけど。自分のモジュールに組み込む方法がよくわからず。
File::Find - ディレクトリツリーを辿る
https://perldoc.jp/docs/modules/File-Find-1.19/File/Find.pod
読んでもなんか使い勝手が違う、というかナニソレwanted?
てことで自分のモジュールで使えるものを自作。
「static」というディレクトリ以下にある、ホームページ用のhtmlファイルをリストアップする。というもの。以前から同じことをやってるスクリプトからの使い回しのサブルーチンの再帰。
use vars qw( $HTML );
〜〜〜〜〜
〜〜〜〜〜
sub parse_static{
my $self = shift;
my $args = shift;
my @dirs = ();
my $d = ($args->{dir} || 'static');
opendir(DIR, $d ) || die;
@dirs = grep(!/^\.\.?/, readdir(DIR));
closedir(DIR);
foreach my $f (sort @dirs){
if(-d $d . '/' . $f ){
$self->parse_static({dir=> sprintf(qq{%s/%s}, $d ,$f) });
}
else{
push(@{$HTML}, $d . '/' . $f) if $f =~ m!\.x?html!;
}
}
return $HTML;
}
1)ディレクトリ一覧を取得して
2)ファイルなら配列に放り込んで
3)ディレクトリなら(1)に戻る
というありがちなスクリプト。
…なんだけど、放り込む配列は use vars を使ってのグローバル変数。そうグローバル変数!なのが前から気に入らなかった。
もっと「かっこいい書き方」があるんじゃないかと。わたしのような野良、素人にとって「かっこいい」かどうかがポイント。
検索してみた。やっぱりこれも以前からちょっと気になってた my と local の違いがきっと魔法の種だと思ったらビンゴだった。
Perl で再帰呼出し時のスタック間データ共有
https://amachang.hatenablog.com/entry/20061010/1160506848
知りたかったのが、まさにこれ。かっちょええよなあ。
ダイナミックスコープとかレキシカルスコープとか意味は分からない、グローバル変数を局所化するとかも分からない。
けど、匂いでわかるかっこよさ。さっそくこのままいただいた(多謝!
sub parse_static{
my $self = shift;
my $args = shift;
my @dirs = ();
my $d = ($args->{dir} || 'static');
local $ongoldenpond::html = $ongoldenpond::html;
opendir(DIR, $d ) || die;
@dirs = grep(!/^\.\.?/, readdir(DIR));
closedir(DIR);
foreach my $f (sort @dirs){
if(-d $d . '/' . $f ){
$self->parse_static({dir=> sprintf(qq{%s/%s}, $d ,$f) });
}
else{
push(@{$ongoldenpond::html}, $d . '/' . $f) if $f =~ m!\.x?html!;
}
}
return $ongoldenpond::html;
}
おかげで、このサブルーチンの中だけで記述が完結することができた。
パッケージ名ongoldenpondというのは、わたしがここんとこどっぷりハマってる 個人ホームページ(On Golden Pond) 用のオレオレMovableTypeのスクリプトだから。
このブログ『ひまつぶし雑記帖』にはperlの小ネタもあるから、その手のも集めて、改めて個人ホームページに掲載するかなあ。
前にも書いたように、ここは日常雑記のために記法というか、書き込んだものを変換するけど、perlやhtmlのコードをそのまま掲載しても見づらいだけになってしまう。今さら変換規則を変えると過去25年以上の分全部に影響するんで、HTMLやperlのコードをそのまま掲載できる個人ホームページの方が見やすくなる。
ちょっと整理してみるか。
「よんでますよアザゼルさん」
アザゼル篤史とベルゼブブ優一
たぶん、今、こんなものTV放映したら大騒ぎだろう(最上の褒め言葉
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
オレオレMovableType
個人ホームページにハマってる今日このごろなわけで。
HTMLを書いて、FTPでレンサバにアップロードして公開する
という20世紀型ホームページ。
めっちゃ面白いんでいいんだけど、さすがに21世紀に合わせないといけないこともある。
レスポンシブ対応とかオープングラフ対応。
まず、個人ホームページのHTMLの構成(レイアウト)
大きく分けて
・ヘッダー
・メインコンテンツ(本文)
・フッター
の3つで構成していて、本文はprimayとsecondaryのふたつで構成。
エディタでHTMLを書いて、それに対してCSSを当てる(スタイルシートを作る)のは「本文」の「primary」の部分についてだ。そこがホームページのコンテンツってやつだし。
本文以外の部分をコピペしてたりするのはミスの元。ヘッダ、フッター、メインコンテンツにあるsecondaryのメニューについてはスクリプトでテキトーにつけ足してくれればそれに越したことはない。
たぶん、ブログが大流行したその元祖、MovableTypeも、そこんとこがポイント高かったんだと思う。楽できるのはいいことだし、ホームページで見てもらいたいのは「本文」であって、ヘッダーとかメニューとかフッターなんかどうでもいい部分。
Movable Type バージョン1.0は、2001年10月8日にアメリカのサンフランシスコでリリースされた。ブログツールとして最も長い歴史をもつ製品のひとつである
で、 「On Golden Pond」 を作るためにオレオレMovableTypeを急遽でっち上げて本文部分以外をスクリプトに任せることにした。
オープングラフとかに対応すると、それが何行も必要になるので手作業で同じことを記入するのは無駄でしかない。なので、そういうのはスクリプトの出番。
見た目のレイアウトはスタイルシートでなんとでもなる構成にした。
特に指定しなければタテ1列にコンテンツが並ぶし、本文とメニューなんかを横並びにしたければ、それもスタイルシートで指定すればいいだけ。スマホ対応もスタイルシートでなんとでもなる。
これについては21世紀型ホームページのメリットだなあ。
そして、今さらなんだけど。
MovableTypeってちゃんとWebをいろいろ理解して作られてるなぁと。
今どきは動的にページを作って返すのがいいよね、と思われるんだけど、MovableTypeは静的ページの生成、ジェネレーター。
WEBの最適化についていろいろあって、その中で、わたしは「WEBは速度が正義」というのに全面的賛成。
となると、当時、ダサいと思ってたMovableType。静的ページを生成して公開する。これは正義だ。
今回作ったスクリプトは、もちろんMovableTypeとは比べることもできないチープなものだけど。
所定のディレクトリに本文部分のHTMLをアップロードしたら、そのディレクトリを読み込んで、静的ページを生成する。それだけでもずいぶんラクチンになった(自画自賛
20世紀型ホームページの静的ページの「超っ早」表示を体験してもらいたい
On Golden Pond
https://www.doncha.net
てなことも 個人ホームページ訪問 Advent Calendar 2024 のネタにしてもいいかなあ、というネタ出しエントリでした。
ホームページ面白いっすよ!
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
個人ホームページのアドベントカレンダー2024
個人ホームページが面白い!楽しいいいい〜!とSNSでひとり騒いでたら、リアクションをいただいてプチバズった。
ここでも最近書いてるけど、ペラ1枚のHTMLとCSSのページを作るのが本当に楽しい。
てことで、個人ホームページのオーナーさんの集まるアドベントカレンダーを設定してみた。
個人ホームページ訪問 Advent Calendar 2024
https://adventar.org/calendars/10172
個人ホームページの自宅紹介、自宅自慢。ほかのひとのお宅訪問ができるカレンダーです。
リンクバナーを持ち寄ってリンクページに使ってもらえれば。
「アドベントカレンダーとは?期間やおすすめの中身、楽しみ方を紹介」
https://www.takashimaya.co.jp/shopping/gift/story/christmas/605182/
欧米ではクリスマス前の4週間をアドベントシーズンとして大切にする習慣があります。アドベントとはイエス・キリストの誕生を待ち望む期間のことで、ラテン語で「到来」に近い意味があります。本来は12月25日の約4週間前の日曜日からクリスマス・イブまでですが、現在のアドベントカレンダーは12月1日からの24日間が一般的に。クリスマスまでの日めくりタイプの暦として、1から24の数字を開けると“お楽しみ”が出てくる仕かけが人気です。日本でもエンターテインメントなギフトとして選ぶ方が増えています。
というのが元々のイベントらしい。
ネットでのアドベントカレンダーも、12/1から12/24まで参加するひとたちが各自持ち寄った記事エントリを公開していく、というもの。
…てことなんだけど、今どきのインターネッツに *いわゆる* 個人のホームページは絶滅危惧種じゃないかな。
個人ホームページって、構成、メニュー、コンテンツなどなど、「自己表現」とか「自分の棚卸し」で、作ってて自分グルーミングでセルフヒーリングになる。
誰かに見てもらうとか承認欲求は、どうでもいい要素。ホームページを作ること自体が目的で、ユング派の箱庭療法っぽい。
他人の目を意識しなきゃいけないSNSにはない面白さがある。
80年代後半から90年代は個人ホームページがたくさんあって、おっかなびっくり遠慮がちに相互リンクのお願いメールなんかをしてたなあ。
わたしが今つくってる個人ホームページはこちら
「On Golden Pond」
書き散らかし以外のActivityPub自作実装とかダウンロードフリーの電子書籍のメニューあたりは少しお役に立てるかもしれません…。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
おひとり様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」