一週間ほど遅れたけれども、5月21日にRails勉強会@東京第6回に行ってきたのでレポートする。今回も会場は秋葉原で、30人弱が参加した。
4つのテーブルに分かれた。
私は「SeasarでRailsを作れるか」のオーナーをやった。セッション数が足りていなかったので割とネタ気分で言ってみたのだけれど。あとから「Changelog」なんかも出てきたので「誰も来ないかもしれないけれど、それはそれで良し」と思っていたら、id:moroさん、id:yad-ELさん、井上さん、安藤さん、ソフトバンクの杉山さんと、なんだか凄い人達が集まってしまった。
先日のSeasar ConferenceでHot DeployとかS2Axis2とか面白い技術を沢山見て、ここまで柔軟になればそろそろJavaでもRailsを本格的に実現可能じゃないか、とぼんやり思ったのが元ネタ。
RailsにインスパイアされたJavaのフレームワークとしてはtrailsが実在するけれど、言語の限界からなかなかRailsの動的さ加減は実現できていない。そこでSeasarですよ、と。バイトコード操作や種々のテクニックによるJVM上への動的性質の導入に関してはSeasarプロダクトはなかなかのものだ。しかも、"Less Configuration = Convension over Configuration + Convension by Exception"を宣言している。Hot Deployまで揃った今月のSeasarの力で、どこまでRailsを再現できるか、1つ思考実験をしてみようじゃないか、とみんなで考えてみた。
まずは軽くSeasarプロダクトのまとめ。それから、「じゃあRailsの差別化要因って何?」というのを洗い出してみた。
ある意味よくやった。
別にActive Recordパターンの実装自体はどうということはない。Rails ARの良い所は属性をいちいち宣言する必要が無いことだ。DB schemaがそこにあるんだから、データモデルはいちいち書かなくてもFramework側で察して欲しい。
そう、察してほしいのだ。私はConvension over Configurationをいろんな言葉で言い替えるのが好きだけれども、その1つは「つーか空気嫁 >>framework」だ。
URLをカスタマイズできることや、特にPATH_INFOを簡単に取り扱えるところは嬉しい
最近のフレームワークでは結構ありがちだけれど、これは大切。特にscaffold。
こういうところでgeneratorは開発者のモチベーション維持に多大なる貢献をしている。
generatorのお蔭で。そしてRakeによるサポートも大きい
ビルド言語はプログラミング言語でなければならないと偉い人が言ってたね。誰だっけ? ファウラー?
Antタスクを書くのにもう疲れたよ。
弊害を心配しなければならないほど簡単だ。システム同士を繋げて発展させていくための心理的障壁を無くしていく。
宣言的に書けるという嬉しさ。設定が分散しない利点
Viewテンプレートのための式言語が結局複雑化していくなら、始めからERBでいいじゃないか
WebにはWebのための定番の処理があって、それを汎用言語に組み込んでしまうと多用途において邪魔だ。だからそれはライブラリとして実現する。
でも、いやしくもOOPLであるならば、文字列のための処理はStringオブジェクトのメソッドであってほしい。そこでActive Supportだ。
Rubyの表現力。「至高の言語Ruby」(by id:secondlife)
上のような特徴を、Seasarを中心としてJava技術でどれだけ実現できるか考えた。
やればできる。
Hibernateがもうかなり近い所までやって来ている。
特にTigerのannotationを使うと設定ファイル生成もいらないし。XDocletは結局はannotationがない世界におけるbad know howだったと思う。
S2Hibernateがあればセッション管理まわりで定型コードを書く必要もない。あとはバイトコード生成してSchemaからクラス定義を作ってくれればそれで良いよねという話になった。セッションのときはとっさに出てこなかったけれど、良く考えてみたら既に無定義Hibernateがある。
このあたりを組み合わせて、Hot Deployで実行時の差し替えも可能にすればActiveRecordは再現可能である。
単一のサーブレットに*をマッピングしてdispatchさせればできる。というか、既存のフレームワークでも結構ありがちな機能。あとはPATH_INFOの使いかたぐらいだけれども、これもやればできる。
generator自体は技術的に特に難しい点はない。Railsの良い所は、一連のgeneratorセットをきちんと用意した所、scaffoldするセンスであって、後追いは難しくない。
ビルド言語はプログラミング言語でなければならず、できれば親しんだ言語が良い。これには賛同するので、そのうち暇ができたらJava版Rake(Jakeとでもいうのか)を作ろうという気持ちはある。既存のものがあるのかどうかは知らない。問題はRakeを再現するにはJavaはsyntaxがpoorなことだけれども、これは言語のところに書く。
Webサービスサポートについてだけは、S2Axis2がAction Web Serviceを超えている。Java自体に型があるし元々interface定義のための語彙もあるから、言語内DSLで改めてinterface定義をするような手間も必要ない。
Apache Axisを直に使うにはちょっとした作業は必要だけれども、S2Axis2ならdiconファイルに1行書くだけでメソッドをWebサービスとして公開可能だ。
括弧を省略できないというJava言語のシンタックスの問題は置いておく。それは別として、宣言的validationの実装については既にid:moroさんが挑戦し、問題点を明らかにしてくれていた。
Javaで実装する上での問題は、JavaにおいてはクラスとClassオブジェクトは異なるということだ。クラスがそれ自体はオブジェと出ないために、クラスメソッド(staticメソッド)はpolymorphicでない。このためにインスタンスと異なり、クラスに対してはTemplate Methodパターンやその変形が使えない。これがActiveRecord::Base.validateの実現を阻む。
やはりJavaではAnnotationを使うのが王道ではないかということになった。Annotationならパラメータの名前渡しもできるし、それなりに可読性があるので悪くはない。
ERB相当が欲しいならJSPでいいよね。あとはHelperだけれども、Javassistを使えばメソッドを他のクラスにコピーするのは難しくないから、これも実現可能だよね、と言った。
そうしたら、「いやもっと欲張ってもよい」と言われた。SeasarプロダクトにはMayaaもありS2JSFもありTeedaもある。Viewに関してはJavaはRailsを超えることができる。
Groovyを使うかなぁとか。あれはコアクラスに対してメソッドを追加しているようにみせかけて、内部ではユーティリティクラスの呼び出しに書き換えていた筈。
あるいは、Railsを志す以上フレームワークとしての全体の結合度が高くなるのは避けられないから、開きなおってシステムクラスローダを書き換えて、rt.jar内のクラスを書き換えてしまうというのも考えた。
ちょっと前まで、AspectJはコアクラスにはweaveできなかったと思ったけれど、id:moroさん情報では最近は限定的ながらweave可能とのこと。
Rubyには言語内DSLを実現する記述力がある。Rake然り。Routing然り。AWS然り。Javaにはそれがない。
最近Pythonを勉強していて、やはりメソッドに対応するオブジェクトを簡潔な式で取得できるのは羨ましいと思った。Rubyは括弧をを省略可能な文法の為に instance.method_name という式ではメソッドを取得できない。これではメソッド呼び出しになってしまう。Methodオブジェクトを簡単に取り出せないというのは純粋OOPLとしてはちょっと情けないところだ。
しかし、これが言語内DSLを生み出す力の源であるからには、メソッドオブジェクトの問題はトレードオフとして許容できるかなと思う。
そしてJavaを見てみるとどうしようもなく表現が貧しい。でもJavaにはGroovyがある。JSRに上がったせいで最近のGroovyは随分「Java的」になってしまい魅力が薄れたらしいけれど、だったら昔のGroovyを使えば良い。Groovy + Hot DeployはRubyにかなり近いのではないか。
他にもJRubyがある。Pnutsもある。
Java on Railsというのか、Seasar on Railsというのか、S2Railsというのか知らないけれど、そういうものを仮に作るとして、「SSeasarの力をもってすれば、やってやれなくはない」というのが結論である。そして、Railsの魅力を再発見した。
3つのテーブルに分かれた。
私は、id:moroさんがオーナーのvalidationのところに参加した。ここでは基本に戻ってActiveRecordのvalidationメソッド群を一通り眺めた。
まあ、これらのメソッド群は大部分が名前そのまんまの機能なんだよね。特に何か書くべき事があるのはこんなもんか。
途中、抜け出して「テストの章」の方にも顔を出してきた。こちらは、行ってみたらAWDwRの1st ed.と2nd ed.のTestingの章の違いを探す企画になっていた。AWDwR 2nd ed.はRails 1.1に対応しているから結構違いがあったようだ。
後半セッションの途中で帰ってしまったお2人がいて、あれは誰だったんだろうという話になった。RubyやJavaで開発を仕事にしているという感じでは無いし、ちょっと研究者っぽい雰囲気で不思議に思っていた。
そうしたら、年配の男性の方はJIS X 0218やなんかのときの符号化文字集合調査研究委員会の委員長をやっていた芝野さんだということが判明。高橋会長以外は誰も芝野さんの顔を知らなくて、高橋さんは「知ってる人は知ってるだろう」と思って何も言わなかったらしい。みなで「本にサインしてもらいたかった」と後悔することしきり。
id:ogijunさんの周りで数学の話で盛り上がった。折紙で任意角の三等分ができる理由を教えてもらったり。抽象代数学の魅力をみんなに伝えようとしてみたり。
お昼を食べていなくてお腹が空いていたので、ご飯がとてもおいしかった。