あなごると抽象化のほつれ?
気のむくままに言語を増やしました。 Perl6 は dankogai さんから、 Unlambda は konn さんから、 Erlang は jijixi さんから、 J と Minus は flagitious さんからそれぞれ提案をいただきました。各言語のこと全然知らないのでなんかミスってたらごめんなさいという。
Minus はなんか flagitious さんが明らかに短く書けることを意識して作った言語で、そこらじゅうからゴルフの香りがして面白いです。
ちょっと書いてみましたが、強烈にループが書きにくいです。だから既にラベルとかを処理できるアセンブラを書いてたりします。それ以外はまぁ普通に書けるかなと。符号がすぐひっくり返るのに注意。
JS はなんか行末に改行が無い場合に、 gets にあたる関数がバグ入りでして、これ最新版でもなおってないぽかったので Nightly とか見つつパッチ送らないとなぁと思いました。
タイムアウト時に stdout とかが見えないのは不便なので修正しました…がこれが理由で今日 submit サバが落ちたんだよなーと。
Ruby はまぁラクでいいのですが、ゴルフサバのテストサーバ側の方は、そこはかとなく Ruby の抽象化の限界に達している気がします。プロセス作ってその標準入出力を読む…って部分は open4 を使ってるのですが、タイムアウト時にプロセス殺す部分がどうしてもあらっぽくなってしまったり、 execve のカウントは strace を使ってムリムリやっていたり、と、まぁそれなりにアジャイルーに作れた気はしているのですが、なかなか厳しいものがある感じです。 Binary Hacks の shiro さんの「本書に寄せて」の、抽象化のほつれってヤツかなぁと。
http://0xcc.net/binhacks/sample.html
こういうプロセス監視みたいなものは、色々と需要があるにも関わらず、なかなか定番の解は無いのかなぁというのが難しいところです。というか、確実度を高めれば高めるほどめんどうな処理になっていく気がするのです。
- 標準出力とエラーのハンドリングについて
- C でやるなら pipe とかでやるけどこれはめんどくさい
- Ruby だと open4 が便利だけど標準出力が巨大な場合にどうもうまくいかない
- プロセスのタイムアウトについて
- 別プロセスから kill 、だと思うけど、この SIGINT くらいじゃ止まらないプロセスが多い
- かといっていきなり SIGKILL というのも
- だとすると SIGINT で止まるまで待つタイムアウトとかもいるのかな… (kill -INT => sleep 0.1 => kill -KILL みたいな?)
- 子プロセスの execve を禁止したい
- CodeGolf みたいに各言語で止めるのはとても大変
- LD_PRELOAD で execve を止めるのが簡単、だけどこれでは直接システムコール呼ばれるとアウト
- ptrace を使えばできるけど、遅いしめんどくさい。 strace でやるとラクだけどさらに遅そう(未調査)
- VMM みたいな何かでできない?
- kernel まわりいじる? (パッチなり LSM なり?)
- 子プロセスのファイル書き込みを禁止したい
などと、考えていくとどんどんと色々と問題が出てきて、ゆっくりと取り組む時間があれば面白い問題も多いかなぁと思うのです。こういうことをまとめてやってくれるプロセス監視ツールなんてのがあるとなかなかに便利かもしれません、し、探せば既にどこかにあるのかも。というわけでいつかやってみたいと思い
ません。そんな暇無いはずだよゴルフ中毒者!