_ golf場 TODO
なんか IRC で話してていくつか
- 8 characters hello world 。8種類しか文字使えない hello を書けというもの。 goruby が h だけでいいのはいいかげんあれだし HELLO, WORLD! とかにしてやればいいか
- edit distance がコードサイズになってないといけない cyclic な quine 。これ書けるかまだわからんからとりあえず解いてから…
- rejudge button 。 random base な解答はちょっとアレなので、 deadline つきの新しい問題は rejudge button をつけて、それを押すと解答の check をもう一度走らせる、ってもの。 time limit が厳しい解答がかわいそうになるかもなので、 rejudge の時は time limit を増やすと良い
(05:25)
_ random seed
rejudge よりは rand seed 全部殺すのが良いんじゃないかと言われた。
そんなの無理だと思ってたんだけど、結構できそうな気もしてきた
- rm /dev/urandom; cp /dev/zero /dev/urandom
- personality(personality(0xffffffff) | ADDR_NO_RANDOMIZE) で address randomization は全滅するらしい
- rdtsc は cr4.tsd というのをセットすると殺せるらしい
- gettimeofday はフック
- getrusage あたりが rdtsc 内部的に使ってたりしないだろうか
最後の3つは色々互いに絡んでる恐れがあるかな。
話としては、
- 基本的にはコードが長くならなきゃいいわけなんで、言語実装が勝手に呼ぶ srand の seed として使われてるシステムコールさえ殺せば問題なし
- rdtsc 殺しても kernel 内部で使っててかつそのシステムコールを言語処理系が seed として使ってると終わるので、やはり使ってる system call を全部殺すのが良さげ
- 今時の gettimeofday は vsyscall とかそのへんの仕組みで userland で rdtsc 呼んでるとか無いだろうか→となると libc hook を復活させないといけなくてだるい気もする
- 言語実装が勝手に自力で rdtsc を呼んでる…ってことはさすがに無いだろうか
あとは他に乱数源ってあったかなあ…
普通に考えると /dev/urandom とか time 系だけだと思うけど…
(11:09)
getpidとか?
あー getpid は既に克服された問題だったので書いてなかったんですがそうですね。特定の PID 狙って投稿する人がやりやすいように、ゴルフ場は setpid なんていう素頓狂なもの用意してあったりします。
http://golf.shinh.org/setpid.html
golfは全くやってないので頓珍漢なことかもしれませんが,/proc/net/devのRX packetsなどはどうなんでしょう.
おおたしかに /proc の下とかは結構色々アレですね。 file の inode なんかもイヤな感じだったりします。ただそのへんは記述量が多くなりそうなので、ゴルフとしては特殊な問題以外では使えないかもですね…