正規表現技術入門を読んだ

gihyo.jp

この本がTwitter上でたまに言及されているのを見て読んでみたいなと思っていたらちょうどタイミング良く例のDMMブックス70%オフクーポンが配布されたので購入して、すきま時間に読んでいたのがようやく読み終わった。

正規表現を支える理論と数理についての内容がメインの本で、自分の興味の方向性と良く合っていたので基本的に全編楽しみながら読めた。この本のおかげで正規言語、DFA、バックトラック、ポンピング補題、Myhill-Nerodeの定理、syntactic monoidに入門することができた。

数理的な内容とは別に実務的な面でも個人的にはそれまで使い方があまりよく理解できていなかった先読み/後読みに対する直観が得られたり、強欲な量指定子(possessive quantifier)を使うことでバックトラックを抑制できること(そして可能な場合は正規表現エンジンの最適化により自動強欲化が行われるのでプログラマ側が積極的に強欲な量指定子を使うよりは正規表現エンジンの最適化に任せたほうが良いこと)を知れたりと得るものが大きかった。

入門書なのである程度以上高度な証明は割愛されてしまっているのだけどそれでもAppendix 1のような簡単な証明を追うのは楽しい。計算機の理論の世界はやっぱり深淵で面白いな。

SML#のコンパイル・実行環境をdockerで立てる

「SML#で始める実践MLプログラミング」という本が発売されて買ったので読んでいる:

www.kyoritsu-pub.co.jp

それで本には動作環境例としてVirtualBoxを導入してUbuntuをセットアップすると書かれていて、macOSではどうなんだろと思って 本家サイトの動作環境ページ を見るとHomebrewでインストールできそうではあったものの、

Bottleが用意されているバージョンのmacOSを使用していない場合は, MassiveThreadsとSML#はソースからビルドされるため,このコマンドの 完了には長い時間がかかります.

と書かれておりあっはいとなったのでDockerfileを書くことにした。

正確に言うと既にeldeshさんという方がイメージをdocker hubに公開されていらっしゃるのですが、それに先に気付かなかったというのが本当のところです。

なのでこの記事は供養の意味が込められています。

書いたDockerfileは一応こちらにあります:

github.com

何も特別なことはしておらず、Debian GNU/Linuxでのインストール方法のページに従っているだけ。

LLVMやMassiveThreadsなどの依存するライブラリも必要に応じて インストールされます. SMLFormatなどのツールもおすすめパッケージとしてインストールされます.

と書かれており、それらの依存ライブラリをDockerfile内で自前ビルドする必要ももちろん無い。

これで生成されたイメージを使って1.4章の smlsharp -MMm main.smi > Makefilemake および ./main の実行ができました。よかったですね。

GCE上のVMインスタンスを起動・停止できるDiscord botを書いた

これのちょっとしたオマケというか続き:

pione30.hatenablog.com

インスタンスを起動しっぱなしだと月に5000円くらいかかってしまいそうなので、このマイクラサーバで遊ぶ人達には遊ぶ時だけ起動して終わったら停止してもらうようにお願いしていて、運用としては最初の頃はインスタンスの起動と停止ができる権限だけをその人達に付与してGCPのWebコンソール画面上から起動・停止ボタンをポチポチ押してもらっていたのだけど、基本的に皆がコミュニケーションをとる起点はDiscordなのでDiscordから離れることなくコマンドを打つだけでインスタンスの起動・停止ができたほうが便利だと思い簡単なbotを書いた:

github.com

今はマイクラサーバ用にしか使っていないけど一応誰でも自分の権限があるプロジェクトに導入できるように汎用的に書いている。

Googleが公式に推奨しているGCE用のクライアントライブラリはNode.js実装しか存在しなかった 1 のと、discord.jsというDiscord APIのNode.jsクライアントライブラリがあったのでこれらを使ってNode.jsで書くことにした。

github.com

github.com

discord.jsのほうは型定義が充実していて体験は良かったけど @google-cloud/compute のほうは型定義が存在しなかったので、実際にAPIを叩いてみて戻り値を見ながら「あ〜インスタンスの外部IPアドレスはこれね……」みたいに確認していく作業があったりして非常につらかった。

認証方法はsecret tokenを環境変数で渡す形式かなと思っていた(discord.jsのほうはそうだった)けど @google-cloud/compute のREADMEを読むと、サービスアカウントというアカウントを作成して適切な権限を付与してから、そのサービスアカウントの認証情報を検出させる、という方式であることがわかった:

cloud.google.com

botはDockerコンテナ化しても良かったけど今はマイクラサーバ用にしか使ってないしCloud Storageの容量を消費するのが嫌だったので無料枠のf1-microインスタンスを立ててSSHログインしてリポジトリをgit cloneしてから直実行するという令和とは思えない運用で動かすことにした。また困ったらもうちょいクラウドネイティブな感じに頑張るってことで良いんじゃないでしょうか。