Rails勉強会@東京 第1回

前日の オブジェクト倶楽部に続いて 、12/17、秋葉原某所での Rails勉強会 @東京の第1回に行って来た。第0回には行けなかったので、今回初参加。

Rails勉強会は各地で盛況な様子。

まず、朝刊を見たら東京新聞12/17、28面「 TOKYO発 」にて高橋メソッドが紹介されていた。高橋さんの顔写真とプレゼンの様子も乗ってる。プレゼンの写真は LL Day のときのみたい。

なぜ今日なのか。狙ったとしか思えないタイミング。高橋さんに聞いてみたら、1週間くらい前に載る予定が載らなかったので没になったかと思っていた所、16日にいきなり連絡が来て「明日載ります」と言われたらしい。

集合

12:30集合の筈が、誰もいない。そりゃ5分前に集まるとは思ってないから私も時間ぴったりに行ったんだけど、でも誰もいない。1人, 2人ぐらいはぴったりにくると思ったんだけどなー。

目印の AWDwR を持ってうろうろする。それらしい人はいない。この本持ってる人がいたら相当目立つと思うんだけど、見渡す限り客引きのメイドさんauの販促員ばかり。

しょうがないので本を持って数分ぼーっと立っていたら、自転車に乗った人に声を掛けられた。やっと1人。そして、ぼちぼち集まり、主催の井上さんは飲物の買い出しに行ってくださったらしくペットボトルを大量にぶら下げて登場。

後から来る人の目印に、集まって来た参加者の輪の外周で駅の側を向いて本を持ってたら、道行く人たちが「これは何の集まり? 何かの客引き?」って目で本をちらっと見て、そして不思議そうな顔で去って行く。いっそメイド服でも着てたら納得してもらえたかも知れないけど、それは関係ない人が混ざって来ると言う弊害が大きそう。

会場にて

オープンスペース という形式で、1セッション90分を2回やった。

ポジションペーパー を用意するように言われてたので、私が描いたのを(一部伏せて)清書したのが下図。イベント終了後に清書って言うのも何だけど。

第1セッション

6つのテーブルに分かれた。でも6番目は終止、無人。実質5つ。

  • Rails入門査読会
  • 淡々とRailsCHANGELOGを読むよ
  • Railsにおけるデザイナーとの分業開発のあり方
  • AWDwR邦訳査読会
  • Actvie Record Basics(AWDwR Chap.14)を読むよ
  • 上司に関する愚痴を言うよ&雑談&Rails記事のライターを狩るよ

かくたにさん がオーナーの「CHANGELOG」に出た。ノートPCの用意が推奨な感じだったけれども、古いノートPCの復活が間に合わず、当日は持って行けなかった。かくたにさんが画面をみせてくれた。かくたにさん、ありがとうございます。御迷惑をお掛けしてすみません。

で、かずひこさんのコメントに従い、みんなで Upgrading to Rails 1.0 を読む。

  • 0.14は既に1.0にかなり近い。

    • 0.13から0.14/1.0への違いが大きい。これが問題。
  • railsコマンドでアプリケーションを生成するとき、結構な量のコードが生成されていたけれど、これが減った。

    • こういうののおかげで、今後のバージョン移行は楽になるはずだからUpgrating Guideなんてものが書かれるのはこれが最後となるだろう。
    • config/*からはrails自体をセットアップするのに必要だったコードが消えた。
      • config/*はもはや純粋にユーザーアプリケーションを設定するためだけにあり、config/environment.rbは12行しかない。
      • それですら、デフォルトではコメントアウトされている。単にユーザーがオーバーライドする時の便宜のためのもの。
    • Rakefileも短くなった。
      • 基本的タスクはlib/tasks/*.rakeに定義されていて、Rakefileはそれを参照してるだけ。
      • 過去にRakefileをカスタマイズした人はその変更をlib/tasks/*.rakeに反映しないといけない。
      • シンプルでバージョン移行は楽になったかも知れないけど、rakeタスクをカスタムするにはlib/tasks/*.rakeを見ないといけないのでちょっと大変。
      • script/*ももはや単なるスタブに過ぎない。
    • 全体として、ライブラリコードとユーザーコードの分離が徹底された。だから今後バージョンアップが楽。
  • transacitonal_fireturesがデフォルトでonに、instanciated_fiexturesがデフォルトでoffになった。

    • テストのスピード向上。
    • もし古いテストコードがこの変更で問題を生じるようなら、単にtest/test_helper.rbでself.use_initialized_fixturesとself.use_transactional_fixturesを陽に指定してやれば古い挙動に戻る。これはAWDwRでtransactional_fixturesについて触れてたのが、ただデフォルト設定が逆になっただけ。

ここで、速くなったと言っても、14秒って長いよね、という指摘。やっぱり、テストと実装のサイクルが途切れてはいけない。ただし、その方は rake でのテストスイート全部の実行しか知らなかったらしいので、テストケースのファイルをそのまま実行すればtest/test_helper.rbが何とかしてくれるからちゃんと動きますよーと言った。。AWDwR Chap.12にも書いてある。

でも、それでも3秒掛かる。ノートPCでCPUが低速と言うのはあるんだけど、でもテストのドライブ感を保って楽しくテストするには1秒掛かっちゃダメだよね、と。時間が掛かるとだんだんテストしたくなくなる、と だんさん 。そういう流れになってしまうなら何か間違ってるし、ハイエンドマシンでしか開発できないRailsっていうのも間違ってる。何とかしたいね、と言う話になった。

とか。うちの会社みたいにもうRailsでプロジェクトが走ってる軽薄なところは少ないみたいで、実際使ってみてどうよ? と聞かれたり。そこからペアプロの話になったり。

かくたにさん曰く、ペアプロというのには反対だそうだ。ペアプロ? それ当然でしょ? これからは2人でやるのを「プログラミング」と呼んで、1人でやるのは「ソロプログラミング」と呼ぼう、と言っていた。激しく賛同。

後半はこんな感じでRails全般への雑談に流れた。「ActiveRecordという名前はやっぱりPoEAAのactive recordからきてて、ドメインモデル貧血症への危惧があるんでないか」と私がRailsの経緯なんか全然知らないで莫迦なことをいったら、「でもrailsActiveRecordはこれリッチすぎてactive recordじゃないよね、そもそも、ドメインモデルとactive recordは直交だよ」とかくたにさんに教えてもらったり。全体にできる人が集まったイメージだったんだけど、私のレベルで混ざって良かったのか。

他のテーブルでは、

  • Rails入門査読会

    インストールがうまく行かない環境があり、入門記事としてはインストールのサポートが重要。 Instant Rails が、出来上がる環境はインスタントだけど良いらしい。 tanabeさんの記事 が詳しい。

  • Railsにおけるデザイナーとの分業開発のあり方

    やっぱり溝は深いね、と。

  • AWDwR邦訳査読会

    いくつか誤植が見付かった模様。私はセッション後にパラパラ見ただけだけど、JoeとDavidの似顔絵はやっぱり欲しいよと高橋さんに伝えた。

  • Actvie Record Basics(AWDwR Chap.14)を読むよ

    JavaのORM vs Active Recordって話が盛り上がっちゃったみたい。moroさんが 議事録を公開 なさってる。

第2セッション

テーブル4つに分かれた。

  • Active Supportのソースを読むよ
  • switchtowerを使ってみるよ
  • railsのテストについて教えてもらう
  • i18n on rails

私はテストのところに行った。railsにまだあんまり慣れてない方もいるので、まずはtest/{fixtures,unit,functional,mocks}についてAWDwR Chap.12の概要みたいなことを復習する。

  • fixturesはunit,functionalで使うテスト用DBの初期状態を定義するデータ。各テストメソッド実行前にこの状態に設定される。Java使いはDBUnitを考えると分かりやすい。

    • script/generatorはcolumnのNOT NULL制約とかは考慮してくれないので、fixtureにデータを足さないとgeneratorで生成しただけのスケルトンもテストをパスしない事がある。
  • unitは、app/models/*のクラスを単体テストするためのもの。fixtureのおかげで書くのは楽。

  • functionalはapp/controllersのコントローラをテストするためのもの。

    • railsではこれを機能テストと呼ぶ。
    • だんさん曰く、これのおかげで開発中のコントローラのテストをブラウザ無しで簡単にチェックできるので楽になる、と。
    • 私が言ったのは、Request, Responseのmock objectを使ったテストが簡単にできるのは魅力だということ。Cactusでもちゃんと使えばできるけど、Cactusより遥かに簡単で使いやすいしね、と。
  • mocks/*は、JavaでDIとかいうときのMockとはちょっとイメージが違う。AWDwRによれば、外部システムとの連係がある時にそのゲートを上書き定義して、テストが外部に影響を与えないようにするもの。

コントローラーの単体テストはやらないの? ともっともな指摘が。私が自分の思い込みで勝手に答えたことには、「コントローラ - ロジック - XML設定 - ORM - ...」と続いていると確かに下の方と切り離して単体テストしないと危ないし効率悪いけれど、ActiveRecordなら、unit/*でモデルがしっかりしてると確認されたなら、別にControllerとModelが結合してるぐらいは悪くないって考えでないのかな、と。DBもテスト専用の環境があるし。

コントローラーでvalidationはしないの? というのについては、「JavaでFormBeanとロジック部分で触るオブジェクトが分かれてる場合、validation掛けずに詰め替えるのはレイヤーが閉じてなくて気持悪いけれど、railsではmodelがドメインロジックとFormBeanを兼ねてるから要らないんでないの? 私的には、こんなに結合しててうまく行くのが驚異だけど、rails特有の結合度の高さを良しとするならわざわざ2重にvalidationする必要はないよね」と答えてみた。

あとはデザイナーさんとの分業の話とか、雑談になった。私が思ったのは、railsだと、viewに複雑なロジックを組み込んでしまうのはむしろやりづらいから、分業楽でないかな、と。modelに対して1:nな属性を、何かしら加工してから列挙出力したいとき、これはあくまでもviewの領域の都合だから加工をmodelのメソッドにするのは変だ。でも、これをviewの方で何とかするのに、rhtmlに複雑なロジックを書いちゃ分業しにくい。J2EEならJSPでカスタムタグを使うのが正解だけれど、カスタムタグはmodelのメソッド程には気楽に書けないし。でもrailsなら、helperにメソッドを足して中でyieldするだけ。rhtmlにうだうだかくよりプログラマは管理が楽だし、デザイナーさんの目に目障りなコードが入らない。万歳。

他のテーブルでは、

  • Active Supportのソースを読むよ

    読んだらしい。高橋さんが講義して。walf443さんが 議事録を公開 してらっしゃる。

  • switchtowerを使ってみるよ

    やっぱり凄いらしい。railsの環境構築から始めて、20分でapp開発、deploy、バージョンアップ、upgrade、rollbackができたと。

  • i18n on rails

    get_text使うかな。でもプロジェクト乱立してるしね。rhtmlを複数持って切替える? という流れだったらしい。

懇親会=宴会

第1セッションでご一緒した ちくわ さんや、えっと、書いちゃって良いのか分からないからお名前は伏せるけれどもあとお二方とお話しした。なんか調子に乗ってずいぶん喋ってしまった。お一人には、前々から興味があった「 XMLの文体と新しい社会契約論 」の載った雑誌の現物を見せて頂いたり。

あと、喋ったのは前日のまつもとさんの講演を聞きながら思い付いたデータへの次元付けの話とか、前述「XMLの文体……」でいうWeb 4.0に必要と思われる、オープンかつフリーかつセキュアな通信インフラの可能性をどこに見るかとか。

データへの次元付けというのは、現代的言語におけるデータには型はあっても次元がないよね、と言う話。物理学で言う所の物理量の「次元」ね。一昨日考えて昨日酔いながら喋ったヨタ話だけれど。

簡単のため、主にRubyを意識しながらOOPLにおいて型=クラスであると考える。するとデータは自分自身のクラスを知っていて、つまりどういったデータを有し、どういった操作を許すかを知っている。でも次元は知らない。数値オブジェクトにも文字列オブジェクトにも"* 3"というメッセージを送れるのはいいことだ。どっちも、自分の型を知っててそのメッセージを受け入れるのだから。でも、重さを表す数値オブジェクトと長さを表す数値オブジェクトを足せるのはナンセンスじゃない? Curlなんかだと、長さという型があってなんとかしようとしてくれたりする。10cm + 1mとかできるけれども10cm + 1(m2)はできない。これは次元を型に落す事によって次元の違う演算を型チェック上何とかしようとしていると考えられる。

でも本来、型と次元は別でないかい。実は、かなり直交してたりしないかい。動的型言語における型のようにデータが自分の次元を知ってるんでも良い、静的型言語のように、コンパイラが知ってるんでも良い。でも、とにかく、次元の情報があれば3g + 5mのようなナンセンスな演算を未然に防止できるし、物理学の次元解析の手法をもっと大胆に採り入れて、lintあたりがバグ候補を警告できるかも知れない。陽な次元変換は陽な型変換同様許されるべきかもしれないけれども。「TimeオブジェクトとIntegerオブジェクトの和は明確に定義され得るか、どういった挙動が望ましいか」という議論も、次元を導入すれば明らかだ。次元が違うからナンセンス。次元エラーだ。

原始、マシン語アセンブリ言語、B言語あたりは明確な型がなかった(Matz曰く、動的言語は型がないんじゃない。実行時にはある。だから型を無視した変な演算が行われる事はなく、ちゃんと例外が発生する)。ひょっとして、今の言語はそれと同様、明確な次元のない混沌の中にいるのかもね。次元のある言語ってどうだろうね、という話。

その他

宴会では、ささださんにも会って話せたし。雑誌記事のネタ、なんかない? とかいう話題が上がって、みんなでわいわい言ったり。私は初心者にリソースリークさせないためのブロックのありがたさ(File.openとか)を語ってみたり。

あとは、本当は Ruby/AJP の完成度をもっと高くして持って行きたかったのだけれど、間に合わなかったので、「railsAJPで繋ごう」とだけ宣伝してきた。次回までには何とかrailsapacheajpで繋がるところまで持って行って、1テーブルもらってデモを動かしながら「この機能が欲しい・こんなのいらん」とか、「ソースのここが下手だ」とか言って貰ったり、「従来のscgiに比べた営業的なアドバンテージを語る」とかしたいところ。っていうか、勢いで「次回までに動くようにして来る」と言っちゃったので、頑張る。