東京Ruby会議03に参加してきました。もともと並カンで宣伝してたのが縁というかきっかけで、ここ最近Rubyに手こずっていたので、何かのきっかけになればと思って参加しました。最近疲れ気味だったので午前中のメタプログラミングの話はちょっと失礼して、午後のハンズオンから参加してきました。場所は例によって青山オラクルセンター。一昨日も行きましたね、はい。(写真は、記事の内容とはほとんど関係ありません)
参加したのは id:t-wada さんのRSpec入門。ひたすら写経するというスパルタ(?)…もとい、手を動かすのは大切なことです。昔ちょっとだけ気になっていたテーマ「テストコードのテストはどうやるの?」について明確な答えが得られたので、それだけでも十分な収穫でした。ちなみにこの質問を社内でやったときは「ひたすら頑張ってレビュー」との答えが得られたのですが、質問した当時は「そんなもんかぁ」と思った私が甘かったです。すいませんでした><
RSpecの使い方を覚えるのも目的なのですが、テストの書き方や考え方を身につけるのも大切なことです。今回は、「今後の開発・メンテ・改良を通じてコードは何度も書き換えられるが、テストはずーっと残る」ことを意識すると、テストのレビュー・デバッグ・リファクタリングはいつやるのか?という問題に当たります。この答えは明確で「なるべく早い段階でテストコードはリファクタリングまで済ませる」ということでした。つまり、最初はテストコードをテストするために本体のコードをスタブにして作ってしまうのです。これによって、まずはテストを最適な形にしていくことを目指し、テストができたら本体を書いていく。本体が書けたらまた新しいテストを追加する…というサイクルを回していきます。
ウォーターフォールな私としては「仕様決めるとか設計はいつやるの?」という疑問が湧いたのですが、それはTDDの枠からはちょいと外れるかなとも思い、遠慮してしまいました。
成瀬ゆいさんの「国際化のはなし」はすごかった。「日本という国に生まれたことを後悔することになるだろう」と思いきや「地球に生まれてきたことを後悔するだろう」とのこと。文字コードの深ーい歴史の話を知ることができた。そして「この世界には踏み込むべきでない」「文字コードのサポートはバッサリ諦めてたErlangはすごいなぁ」などと思ったのでした。
さて私が聞きたかったのは「open3のはなし」でした。BSDでforkできない理由でもちょっと触れられていますが、lib/open3.rbとかRubyのforkというかプロセスの生成周りはいろいろ使いにくいと思っていたので、これを聞きたかったのでした。気になっていたことをひたすらつぶやいていたところ、ゆとりが釣れました…というのは冗談ですが、double forkは割と根が深い問題みたいですね。RubyだとWindowsの都合まで考えないといけないので、困ったものです。以下、当時の記録です。
sleepy_yoshi | @kuenishi ダブルforkにはそんな理由があったのですね.RT @kuenishi 親プロセスが死ぬと子プロセスがinitの養子になる。initはwaitしまくってるのでゾンビプロセスを回収できている。 #tork03 | 2010/02/28(日) 23:29:37 | |
kuenishi | RT @mrkn: ちなみに、spawn の資料は既にある #tork03 http://bit.ly/bclpwe | 2010/02/28(日) 18:00:07 | |
kuenishi | trunkのopen3.rbのソース見たら1.8系とガラリと変わっててびっくりした #tork03 | 2010/02/28(日) 17:08:24 | |
kuenishi | RT @tsuka: 「double forkはinitを意図的に利用してゾンビを避けるテクニック」 #tork03 | 2010/02/28(日) 17:07:07 | |
kuenishi | 制約を入れる代わりに、fool proofに作ったんだな #tork03 | 2010/02/28(日) 17:06:18 | |
kuenishi | 親プロセスが死ぬと子プロセスがinitの養子になる。initはwaitしまくってるのでゾンビプロセスを回収できている。 #tork03 | 2010/02/28(日) 17:05:28 | |
kuenishi | double forkになっている理由!waitを忘れるとゾンビプロセスが発生するから。ずっと疑問だったんだけど納得した。 #tork03 | 2010/02/28(日) 17:04:31 | |
kuenishi | そうそうProcオブジェクトをコルーチンみたいにしてforkに渡せる言語仕様がまずびっくりなんだよね。 #tork03 | 2010/02/28(日) 16:54:42 | |
kuenishi | posix_spawn(2)初めて知った #tork03 | 2010/02/28(日) 16:50:10 | |
kuenishi | おお。リダイレクトは便利かも #tork03 | 2010/02/28(日) 16:43:37 | |
kuenishi | pythonだとsubprocessがあるからなー #tork03 | 2010/02/28(日) 16:39:53 |