2022/5/8(日)

ConoHa APIを叩いてcertbotのDNS認証を自動化するスクリプトを組めた。Rustで。

リポジトリも公開してみた。その内記事でも書く。

certbotのmanual-auth-hookは環境変数として目標のドメイン名と認証トークンを渡してくるので、ネットを見ると大体環境変数周りと相性の良いシェルスクリプトか、Web関係と相性の良いPHPでの作例が目立つ。

今回初めてある程度実用のためにRustをガリガリ書いてみたが、所感としてはやっぱりPHPとかに比べると初期の開発スピードでは劣りそうだな―という感じがする。こういう小さいプログラムを多少汚くともササッと書く、みたいなのはRustでは難しい気がする。慣れてないだけかも知らんが。

ただRustで書くと本当に「きれいにしか書けない」というマジヤバ特性があるので、ちょっとでも規模の大きいプログラム、あるいは長期にわたってメンテナンスするプログラムになるとそのメリットはPHPなんかの比ではないと思う。自分で書いたコードが自分で読みやすすぎてびっくりした。クソコードを書くとコンパイラがギチギチと締め上げてくるので自然と良いコードになっていく。いやまあもうちょっと関数分けて整理せいよとか変数名もっと考えろみたいな部分もそれなりにあるのだが。

とにかくRustの仕様とそれを取り巻くライブラリの仕様上、「あって欲しい構造」をまず書いてからそれを組み上げていくという形になるので、処理フローはどうあがいても最初に書いた「あって欲しい構造」に従うことになる。この感覚はちょっと他の言語では体験したことがない。普通の言語だとだいたい「どういう動作をして欲しい」から書き始めることになるので、「結局どうなって欲しい」を達成するためにコストが払われる。Rustはその逆のことが起こる。


おやつのためにバーガーショップに入った。

デカいハンバーガーにかぶりつくのは久しぶりだった。とてもうまかった。

ポテトについていたケチャップが少し薄く感じたが、まあそういうタイプの味付けなのだろう。


新しい洋菓子店を開拓した。興味で入ったがかなりいい店だった。近所なのに知らなかったが、割と人気な店らしい。


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

ABC244-F: どこを通った数が奇数でどこを通った数が偶数か、というパターン数は$2^N$なので、それプラス最後の地点を持てばパスを探索していける。最初悩んだがNが小さかった。(N≦17)

dp[len][ptn][last]:=(長さlenのパスであって,通った数の偶奇がptnで表されるパターンであり,最後の地点がlastであるようなパスが存在するか)というdpで通した。しかし解説を読んだらもっと単純で、通った数の偶奇パターンと最後の地点の組み合わせを頂点としたグラフを考え、その上をBFSして最短経路を求めていた。まあ本質的にはまるで同じだが賢い。

というか自分はあそこまで思いついてなぜBFSに出来なかったのか?

ちなみにグラフをvectorとか使ってちゃんと構築すると遅いが、vectorを捨てて毎回遷移先を計算する方式にすると爆速になる。グラフと見なせるからと言ってvector<vector<int>>みたいなのをいちいち構築してやる必要はない。


今日摂取したコンテンツ。

単なる熱血ものの類かと思ったら、意外とトリッキーでなかなかこの後の気になる展開だった。

バレエの動画を見終わったところでのポーズがオチの伏線になってるところとか好き。


勉強机の椅子に冬物のコートがかけっぱなしになっていたので、クローゼットに押し込んだ。

Categories: