2022/8/27(土)

なんか自分で運営しているメールサーバーに繋がらないなあ、と思って調べたところ、証明書の期限が切れていた。それでcertbot renewしてみるも証明書の期限は切れていないように見える。まさかと思ってpostfixとdovecotを再起動したところ、無事接続された。更新された証明書を読み込んでいなかったらしい。なんとも面倒くさいことだ。

ダウンタイムが許されないような商業用のちゃんとしたメールサーバの場合は二重化とかして対策するんだろうか。MXレコードに複数メールサーバを登録する機能はこういうところでも役立つのか。


今日解いた競プロの問題。

ABC263-F: 以前に解説だけ読んだやつをupsolve。

「各試合についてその試合で人iが勝ち残った場合のその試合に繋がる試合のスコア合計の最大値を記録する」というのが全てなのだが、実装方針にちょっと悩んだ。各試合についてvectorを用意するのでもまあ多分間に合うとは思うのだが、効率は悪い。ちょっと考えたところ、$N\times 2^N$配列を用意して、同じ木の深さに位置する試合をまとめればいいことに気付いた。このように記録すると$O(N2^N)$で済むことがとても分かりやすい。

また各試合に関する情報についても、N要素の配列を用意してセグ木みたく決勝から順に数字を振っていけばよい。÷2切り捨てで親に、×2および×2+1で子に移動できる。

本質部だけでなく実装がちょっと面白い問題だった。


祖母が訪ねてきて自宅で一緒にお茶をした。

話の流れで、あまり聞いたことが無かった祖母の過去の話などが聞けた。

自分はもう割といい年なのだが、祖母は「孫がかわいい」という文脈で自分に対し割と「かわいい」という言葉を連発する。「さすがにかわいいなんて言う人は他にいないか」と聞かれて、今の時代ならバ美肉の文脈でありえそうだなということをちらと考えたが、説明が面倒なので「まあいないね」とお茶を濁した。


美術部ガールの最新話、「取引の終了=関係の終了なのでそれをしない」というラブコメをやってたので「あっここ胎界主でやったやつだ!」になった。さくぴーは稀男みたいな気グルじゃないだろ!


コメントシステムの開発を進める。

やった:

  • コメント送信時にメールアドレスへ通知する機能を実装した。
  • メール送信が終わるまでレスポンス返せない問題が発生したので、バックグラウンドワーカー的なの用意してそいつに処理を投げるようにした
  • env_loggerでデバッグ出力をするようにした
  • CORS対応をした結果、viteのdevサーバーからのAPIアクセスはできるのに普通にactixから配信したHTMLからのJS読み込みができないという謎状態になったので、production環境ではactix-corsを完全に切るようにした

やる:

  • Docker化
  • README書く
  • markedのサニタイズ

いよいよ日がない。明日半日で全部終わらせてVRフレームワークの方に着手したい。

バックグラウンドワーカー的なのを実装する方法を見つけるのにだいぶ時間を費やした。actix_web内でtokioとかを使うとろくな目に合わないのを前に経験したので、actixの範疇でやるのが恐らく相性的に良いだろうと踏んだ。

ググったところ割と良さげなサンプルコードが見つかったので大いに参考にした。古いactix_webを利用したコードなのでハンドラへのデータの渡し方とかが違うが、そこだけ変えればほぼそのまま通用した。

https://github.com/sstelfox/actix-background-worker

そもそもactixはもともとWebフレームワークではなくアクターモデルを提供するフレームワークだ。actix_webではないactixの説明書があるので、これもちょっと理解の参考にした。

最初はactix_corsやactix_sessionのようにバックグラウンドワーカーのサービスを提供するミドルウェアみたいなのを組んでwrapで登録してDIする、みたいなのを考えていたが、単にワーカー的なものをapp_dataで登録してactix_web::web::Dataとして授受すればよいだけだった。変に難しく考えすぎていた。

CORS問題の対応は混迷した。なにしろ、フロントエンドのdevelopmentサーバーから配信したスクリプトでAPIを叩くのは成功し、APIと同じactixのサーバーから配信したスクリプトはダメなのだ。どうやらAPIを叩けないのではなく、HTMLの配信までは成功してスクリプトはそれ自体が読み込めない。

とにかくバックエンド側のCORS対応処理を無くせば当たり前のように上手く行く(当然フロントのdevサーバから叩くことはできなくなるが)ので、production環境ではCorsミドルウェアを完全に切ることにした。ミドルウェアの良い感じのオンオフの方法が分からなかったので、前は苦肉の策としてproduction環境では無のCorsミドルウェアを挟む仕様にしていたのだが、どうやらactix_web::middleware::Conditionというもっと筋の良い方法があるらしいことを発見したのでこれを利用することにした。無事収まった。

CORSポリシーの設定と読み込むもの次第では同一オリジンですらロードが拒否されうる、というのは衝撃だった。

ちなみにエラーの原因を確認するため`actix_web::middleware::Logger`を入れたのだが、どうもエラーがちゃんと出てこずかなり悩んだ。env_loggerを入れていないとそもそも出力されないというオチだった。そういうのはちゃんとエラーとか出してほしい!env_loggerが入ってないときは一体Loggerはどこにログを吐いているんだ?


なんか21時ごろにConoHaで障害が起きて一時的にサイトが落ちた。たった1つしかない収容ホストに該当して障害の影響を受けるとは運があるんだかないんだか。

一応面白いものが見れたという意味では運が良かった。記念写真。

少し不安なのだが、収容ホストをネットで晒したとしても「ConoHa運営内部に自分個人を狙った悪意のある人間がいた場合」とかでもない限り問題はない…よね?

Categories: