私の世界を変えた10行のコード
Ten Lines of Code That Changed My World
Hello Worldから自己書き換えする6502アセンブリ、CSSで書かれたアニメーション詩まで、著者にとって特別な意味を持つ10行のコードを紹介。JavaScriptの奇妙な挙動を笑い飛ばす一行や、Windowsでtouchを実現するバッチファイル、ゲームの無限ライフPOKE、Linux問題を「解決」するrm -rf /など、懐かしさと危うさが同居するコードの数々。それぞれがコンピュータとの関係を形作った瞬間を振り返る。
コンピュータはあなたが言ったことは何でもやってくれるということを、2行目が強く印象づけた。
HNでの議論
38- dahart
BASICのprint+gotoループは、たぶん僕の最初のプログラムでもあったかもしれない(80年代に)でも確実に言えるのは、それは絶対に「Hello, World」じゃなかったってことだ。僕も他のみんなも、くだらないもの、ランダムな単語、ジョーク、子供じみたフレーズ、何でもかんでも画面に埋め尽くした。でもなぜか「Hello, World!」はCのもので、高校のCの授業で初めて見て、大学でもっと頻繁に見るようになったのを覚えてる。
'poke'の記憶もある。Atari 800では、メモリをpokeしてキーストロークのリピートレートとリピート開始までの遅延を変更できた。だから当然、遅延をゼロにしてリピートを最大(たぶん毎秒60文字)にした。すると誰かがタイプしようとしても、キーを十分速く叩けずにリピートが避けられない。直すにはマシンの電源を入れ直すしかない。11歳の僕には爆笑ものだった。
彼の'poke'の説明に似ているけど、メカニズムは違う。IBM PC jrでdebug.comを使ってUltimate IIIのセーブファイルを編集し、お金とライフを最大にする。
いい時代だった!
- andsoitis
Lispの深遠さを捉えた3行がこちら:コードがコードを生成し、そのコードがまたコードを生成する。
———————
(defmacro twice (form)
`(progn ,form ,form))
(twice (print "Reality"))
———————
twiceは引数を2回実行するのではない。実行前にプログラム自体を次のように書き換える:
(progn
(print "Reality")
(print "Reality"))
- probably_wrong
タトゥーにすると良さそうな小さなコードスニペットを集めているんだけど、この中にはコレクションに加えると良さそうなものがいくつかあるね。
CSSには"hotpink"より"red"の方がいい派だけど、それはただの僕の好みさ。
- tptacek
うーん。なんて素晴らしい質問だ。
while(1) { fork(); }
これは僕にとって何か意味があったに違いない。Usenetのシグにあったからね。それから:
exit(main(kfp->kargc, argv, environ));
FreeBSDのcrt0から。main()の下にもっとCコードがあると気づいたのは、僕にとって大きな瞬間だった。
次に:
statements: /*E*/ | statement statements
Yaccがピンと来た瞬間。あの行は深遠だったけど、その瞬間をより正確に表すなら、パーサジェネレータでやっているのは木を構築することだけで、各プロダクションの副作用は木のノードを返して差し込むためのものだと気づいたことだ。
「ハッシュテーブルがいっぱいになったらサイズを2倍にする」という一行を思いつけたなら、ここに一席値するだろう。
そしてもちろん(アセンブリだからズルできる):
jmp .call
.pop: pop esi
...
.call: call .pop
「デルタオフセット」トリック。x86ウイルス文化から来たと思うけど、90年代のオーバーフローエクスプロイトでは、文字列やその他のメモリ参照を位置非依存で得る方法として普遍だった。
間違いなく:
void walk(node *n) { if(!n) return; walk(n->left); visit(n); walk(n->right); }
write-select(2)を一行に収める方法を考え出すべきだ。これも僕にとっての「やばい」瞬間だから。
同様に:Vern Paxsonが、TCP再構成を単にファイルを開いて"seek"で受信セグメントを正しい位置に置くだけで実装したと説明してくれたとき。おそらく一行にゴルフできる!でもそれはアン[…]
- metanonsense
友達を感心させるためにいつもこれを実行してた
10 for i = 0 to 359
20 plot 100+100*cos(i), 100+100*sin(i)
30 next i