八発白中

技術ブログ、改め雑記

Day 18: trivial-signal

これは fukamachi products advent calendar 2016 の18日目の記事です。

今日はtrivial-signalについて話します。土日に細かいライブラリ紹介が並んでいるのはただの手抜きです。

Common LIspスクリプト

継続的なCommon Lispの課題として、スクリプトを書きづらいというものがありました*1

開発時はREPLなので問題にならないのですが、アプリケーションの起動などを考えればコマンドラインで起動できなければいけません。他のUNIXコマンドとの連携を考えてもCLIから離れられるわけではありません。

これは8日目に紹介したShellyで解決しようとした課題でもありますが、それでもまだその他の軽量プログラム言語ほどの手軽さはありませんでした。

その理由の一つがシグナルハンドリングでした。

POSIX シグナルハンドリング

シグナルハンドリングはUNIXでのプロセス間通信の方法の一つです。プロセスが特定のシグナルを受け取ったときにどうするかを指定しておけば他プロセスから制御することができます。

たとえば、スクリプトをターミナルで起動して、C-cを押すとINTが送られます。コマンドラインだとkill -INT <pid>のように送ることができます。

Common LispではPOSIX APIが仕様に含まれておらず *2、当然シグナルハンドリングもできません。C-cをするとSBCLではSB-SYS:INTERACTIVE-INTERRUPTというコンディションが発生できSIGINTのハンドリング自体はできますが、これでは2つ問題があります。

  1. 処理系依存である
  2. 他のシグナルはハンドリングできない

処理系可搬で、SIGINT以外のシグナルもハンドリングしたい。

それを解決するために生まれたのが「trivial-signal」です。

誰か作ってくれ

trivial-signalに関しては、他に誰か得意な人がやってくれたほうがいい、と当初から考えていました。あまり自分自身が使う機会も多くありません。とはいえ誰かが都合よく書いてくれるわけでもないので今必要な自分がとりあえず書く、けれどいつか誰かに引き継げるなら引き継ぎたいと思っていました。

名前に"trivial"と含まれるライブラリはAPIが自明の小さなライブラリがほとんどで、言ってしまえば標準ライブラリのような立ち位置の名前です。"Woo"や"Envy"のようなユニークな名前でなく、公共性の高い名前を敢えてつけたのは、やっぱりあまり思い入れがなくメンテナンスも頑張るつもりがなかったからでしょうかね。

ライセンスも珍しく"public domain"にしており、誰でも自由に使ってもらうようにしました。

浅井さん登場

そしてGitHubに置いてQuicklispに申請してほんの2ヶ月ほど。浅井さん(@guicho271828)からPull Requestを2つもらいました。

浅井さんと言えばCommon Lispやclfreaks界隈をウォッチしている人はご存知かもしれません。eazy-processなどGitHubでいくつかCommon Lispライブラリを公開しています。

Pull Requestをもらったとき、もはや早くもtrivial-signalの存在さえ忘れていました。この機会だから浅井さんにメンテナお願いしよーっとと思って声をかけます *3

深町: 実はこのライブラリあんまり使わないし、質を高く保てる自信ないんだよね。よかったらメンテしてくれない?
浅井: わかった

というような二つ返事であっさりメンテナを引き受けてくれました。ありがたし。

そういった経緯で、trivial-signalはこのアドベントカレンダーで紹介するライブラリで唯一僕がメンテナではありません。作者にあまり愛されずにドナドナされた不遇なライブラリだと思うとかわいそうなのでここで紹介して罪滅ぼしとします。

おわりに

trivial-signalはGitHubで公開されています。

明日のアドベントカレンダーは19日目のclfreaksについてです。お楽しみに。

*1:今ではRoswellスクリプトにより随分と快適になっている

*2:SBCLなど一部の処理系では処理系依存のパッケージとして提供している

*3:https://github.com/guicho271828/trivial-signal/pull/3