Vim で端末ウィンドウを複製する
Vim で端末ウィンドウを使ってるとスクロールされた出力を見たくなる時があると思います。
ただシェルでコマンド実行中なので、 <C-w>N
すると出力も止まってしまう。なるべくなら出力を止めたくないと思います(たぶん)。
そういう時は以下を vimrc に貼り付ければ <C-w>y
で端末ウィンドウの複製バッファができます。色とかもそのまま。
追記 (9/25) すみません、以下のコードだとやっぱりスクロールされた出力は見れませんでした…直すのでお待ちください…というか誰か直してください…
tnoremap <C-w>y <C-w>:<C-u>call <SID>dup_term_buf()<CR> function! s:dup_term_buf() abort let file = tempname() call term_dumpwrite('', file) call term_dumpload(file) setlocal nolist call delete(file) endfunction
追記
term_dumpload() で一部の色が復元されないと思って現実逃避気味によっしゃ term_scrape() で頑張るぞ!ってやってたコードが単に setlocal nolist すれば出ると知った時の顔
— tyru🍆 (@_tyru_) 2018年9月22日
— tyru🍆 (@_tyru_) 2018年9月22日
しばらく Prolog やってみた感想
ここ最近 Prolog を書いていて、「Prolog はどうせ遅いし Prolog の良さはそこじゃない」がやっと体感的に分かってきた気がします。
ぶっちゃけPrologはどうせ遅いしPrologの良さはそこじゃない
— h_sakurai (@h_sakurai) September 11, 2018
Prologの良さは簡単に書けることだ。
高階な述語は使うのやめたほうが簡単だという。
勉強になった。
今の私なりの解釈で言うと、効率の良いデータ構造とアルゴリズムを考えるのが第一義の場面では Prolog の良さは発揮できないという事です。
Prolog でもデータ構造をちゃんと設計してカット多様すればそれなりに速いプログラムを作れるのかもしれませんが、それは普通に逐次的な(手続き的な)プログラムを書いてるのと同じで*1、それよりもバックトラックでナイーブにルールを総当たりする所が Prolog の強みの一つなんだなというのがようやく実感と共に分かった気がします。
しばらく Prolog やってみた今の私の場合、シンプルに素早く人間の思考に近い形で宣言的に書いたコードがそのまま動いてほしい、って事なら Prolog を選ぶと思います。
こう書くと誇張していて良いことずくめの様に聞こえますが、実際にプログラムを作ってさらに公開するとなるとユーザーの環境に合わせる必要があり、その中で選択肢が段々限られてくるので当てはまるケースは意外と少なくなってきます。
他にも必須ではないものの、
- ワンバイナリで動くと良い (Go, Rust) とか
- Windows で GUI を使いたいなら .NET 系が楽とか
- 様々な目的でユーザーが多い言語のが良いとか
- コントリビューションを貰いたいとか
- 仕事だったら人員確保のためとか
ちょっと挙げてみただけでも、公開するとなるとユーザーが介入してくるため色々取捨選択をしたり考える事が結構あり、 まぁ当たり前なんですがプログラミング言語はシンプルに素早く人間の思考に近い形で宣言的に書いたコードがそのまま動くだけでは良くないので、必然的に選べる選択肢は狭まります。
私はプログラミングとは目的を達成するために最適なアルゴリズムとデータ構造を考える事だと思っています(いました)。 しかし Prolog 「らしい」コードはそれをむしろ放棄して、アルゴリズム(手順)の代わりにロジック(論理式)を書き、データ構造の代わりに記号操作とユニフィケーションの対応を考えると自然とプログラムが出来上がります。 どちらが優れているという話ではなく、扱っている抽象度のレベルは明らかに Prolog の方が高い。
前述したように Prolog でも手続き的に書いたり、データ構造をモジュールとして定義して提供する事もできますが、そういう使い方が生きる言語というよりは「計算機に計算させたい」というニーズが一番にあってそれを書き下すと勝手に解いてくれる言語、それが Prolog という言語なんだな、というのが今の所の感想です。
論理式がまずあって、自動的に計算させたい。それがPrologの始まりにあるのである。だから、Prologは速いとか遅いとかの尺度で見てもしかたない。静的型があるとかないとかも結構どうでもいい話なのだ。
— h_sakurai (@h_sakurai) September 6, 2018
*1:それぞれの目標 (goals) 一つ一つの直前にカットを差し込めば、バックトラックがない単純に上から下へ書いた順に動くコードになります
Let's Encrypt の証明書の有効期限をチェックする Cron 用シェルスクリプト
まぁ certbot-auto renew
を定期的に実行すればいいんですが、チェックだけしたいって場合のスクリプト。
Cron で毎日実行する事を想定してます。
追記:切れる前メール通知来るの知りませんでした…
具体例
REPORT_DAYS_AGO
はデフォルトで 14 が指定されていますが、実行時に指定した場合、その日数でチェックします。
以下は REPORT_DAYS_AGO=20
として実行した場合の出力です。
example.com の証明書が報告日 (=有効期限の終了日 - REPORT_DAYS_AGO) を迎えているので終了コードは 1 です。
$ sudo REPORT_DAYS_AGO=20 ./check-le-date.sh ========== example.com ========== 有効期限が 2018/09/29 で切れます (残り 20 日) $ echo $? 1
以下は REPORT_DAYS_AGO=19 として実行した場合の出力です。 まだ報告日を迎えていないので出力はなしで、終了コードは 0 です。
$ sudo REPORT_DAYS_AGO=19 ./check-le-date.sh $ echo $? 0
スクリプト
趣あふれるスクリプトですが、良かったらどうぞ。