2009年7月5日

197X第2回 LT大会に参加した #197X

appengine/java用の開発環境を簡単に作れるよ!というLTを行ったが、デモの最後のmaven integration-testの実行中のappengine-java-sdkのzipファイルのダウンロードに時間がかかりすぎてしまって、その間にドラ!となっちゃったw 質疑応答中に完了していたっぽいので、20秒ほど足りなかったよぅだ。

皆のLT

やっぱ197XメンバのLTはどれも面白い。そんな中でLT大賞をあげたい!と思ったのが kousyou さんの暗渠ネタ。"暗渠"という単語は初めて聞いたけど、buzzってたし、今後大流行間違い無し!

ありがとう

参加された皆様、会場を提供してくださったグリー株式会社様、会場の温度調整をがんばったいちいくん、「作る」「営む」に励んでおられるござ先輩、2日後くらいに筋肉痛が来るはずでお気の毒ですなyamashiroさん、ドラで多数の心臓を止めかけたドラ娘、みんなありがとうございました!

あと、Jiemamyメンバがいつも下品なワケじゃないよ!普段はちゃんとマジメな話してますから!

2009年6月27日

BPStudy#22に参加して来た

GAE/Jってどう使う?

スティルハウス佐藤一憲氏。佐藤一憲氏といえば、"Google App Engineのtips集"のエントリでの秀逸なまとめがありますね、ありがたいです。

JavaVMはServerVMじゃなくてHotspot ClientVM
これは今まで意識した事が無かった。ヒープのチューニングとかもあまり関係無さそうだし(できない)、あんまり意識する必要は無いかな…?と思ってる。
セッションは勝手には消えないので自分で掃除しなきゃダメ
Frameworkを使えばそっちがやってくれるはずだと思うけど、手動でやる場合は当然そぅなりますねぇ。気をつけなきゃならん。
JVM的なGlobalはダメ
使わないからこれもまた意識した事は無いけれど、ノードが違ったらダメだとの事。確かにそりゃそぅだ。ノードが同じでも、アプリが終了させられてしまぅ場合もありそぅだし。Session、Memcache、Datastore等をうまく使い分けなきゃなりませんね。
GAEのスケールアウト。50分くらい高負荷が続くとスケールされる、とかの話がどこかにあった。→実際はそれよりももっと早くスケールされてる気がするね、等等。
ここはGoogle様任せの話だけれど、ある程度の仕組みは出して欲しいトコですねぇ。たぶん皆もそぅ思っているだろぅし。
bigtableの履歴に関してはAppengineは使えない
GFSの仕組み的に全てのデータに対する履歴が絶対にあるはずで、そいつらをなんとか利用できないのか?という点がずっと気になってたけど、やっぱそーなんだなー、とあきらめがついた。
インデックスの話
これらはDatastoreの最も特徴的なところだから、特に新しい話は無かったが、説明するときの用語としてとても勉強になった。
プロパティが無い、値がnullは区別される
これはあんまり意識してなかったし、試した事も無い。実際はスキーマの拡張が行われた時にしか発生しないように思うが、Low-Level APIを使った場合は「ひとつのKindが同じプロパティ構成とは限らない(必要なPropertyだけに最適化されたRecordでKindを構成する)」という状態でスキーマを構成できる(むしろこれこそスキーマレス?)ので、それを実際に試してみよぅと思う。やっぱ無理にJDOとか使うよりLow-Level APIの方が使い勝手よいよね?というのが自分的な結論だったりするし。
アプリ全体でのACIDを行う為の実装はある
知らなかったけど、あんまりやってはいけない事だと思うし、設計や実行時のパフォーマンスに無理が出て後悔するだろぅからこの話は見なかった事にしよぅかと…。…。たぶん逃げ道としては便利なんだろけどね…。

自分としては、GAE/JのDatastoreを誰かに説明する時の説明方法を勉強できた、といぅ感想。

資料へのリンクがはてなダイアリーにあるよぅです。また、今回と同じ資料をベースにしたセミナーが7/17 18:30-20:30に開催されるようです。今回は時間の問題ではしょられた内容等の説明もあるだろぅと思われます。

scala/lift on GAE/J

yuroyoro氏。開催時間になっても登場しないとか大物すぎる。

SeasarConでの資料を拝見済みだったので内容はだいたい把握していたが、Scalaに関する理解とLiftに関する理解は深まったと思う。やっぱ資料だけ見るのと発表を聞くのは全然違うね。

自分としてLiftの"Html内のイベントとScalaの関数のバインド"が滅茶苦茶興味を持ったので、実際にGAE/J上で動かす事になるだろうと思う。コンテキストの保持を意識せず、こういった処理を行うって…これWicketやん?Scalaのパワーを持ったWicketやん!…といぅ風に見えたから。これは良い。jQueryとの親和性も高そうで、View層のコンポーネントも充実してそぅだし、もぅWicketにしか見えない。$ mvn archetype:generateして$ mvn jetty:runしたらいきなり動作するとか、やっぱりあなたはWicketなんでしょぅ?View層はWicketの方が美しそうにも感じたが、発表ではあまり深くは触れられていなかったのでよくわからない。でもたぶんWicket。まぁ、そんな感じに壮大に勘違いしてるんだけど、大変気になるものが増える事となった…。

メモ:Liftは1.1-SNAPSHOT(GAE対応版)、Scalaは2.7.5を使えばいいそぅだ。

追記

yuroyoro氏の資料もアップロードされたようです。

スタッフの方々、スピーカーの方々、皆様ありがとぅございました!

なお次回のBPStudy#23は7/31(金)19:00-21:30、"edeg2.ccクラウドコンピューティング研究プロジェクト"といぅ事だそうです。自分も仕事と調整がつけば参加したいと思います。

2009年6月19日

GAE/JのDevAppServerMainを起動するmaven pluginを作った

今までmaven archetype pluginをいくつか作って来たけど、どれも「Eclipseが前提」となっていて、せっかくarchetype:generateでプロジェクトが作れるし、単体テストもできるのに結局Google Plugin for Eclipseappengine-java-sdkも必要なんだよな〜、mavenを使った開発っぽくないよな〜、というカンジがあった。

mavenを使うんだから、sdkなんていちいち落としてくるなんておかしいよ、プラグインが勝手に解決しろや〜、て思うもんね。そこで、以下のようなMavenプラグインを作った。

  • com.google.appengine.tools.KickStartを使ってcom.google.appengine.tools.development.DevAppServerMainを起動する。
  • 試験のためのプラットフォームとしてSDK本体が必要になるが、公式のダウンロードサイトからダウンロードしてくる事が可能。ダウンロードしてきた場合は例えばtarget/sdkなどに展開し、そこをSDKのルートとして使用する。

つまり、jettyプラグインとかcargoプラグインみたいにselenium等でintegration-testを自動で行ったり、さくっとアプリを起動して動作確認するためのモジュールです。

使い方

pluginRepositoryとしてhttp://gae-j-samples.sourceforge.jp/maven/repositoryを追加し、com.shin1ogawa:gae-maven2-plugin:1.2.1-SNAPSHOT:start(つまり、groupId=com.shin1ogawa, artifactId=gae-maven2-plugin, version=1.2.1-SNAPSHOT, goal=start)を実行してください。stopゴールはパラメータは無しで、startゴールのパラメータは以下の通り。

address(localhost),disableUpdateCheck(true),port(8080),server
これらはDevAppServerMainにそのまま渡すパラメタです。それぞれカッコ内の値がデフォルトの値です。server、って何に使うんだっけ…?
javaHome
javaを起動するためのホームディレクトリです。省略した場合はSystem.getProperty("java.home")の値を使用します。
warDirectory
SDKが使用するアプリケーションのディレクトリです。デフォルトの値はwarが設定されています。この直下にWEB-INFが配置されている必要があります。
sdkRootDirectory
appengine-java-sdkがインストールされたディレクトリを指定しますが、sdkUnZipDirectoryが指定されているとそっちを優先します。
sdkZipFile
SDKのZipファイルの場所。デフォルトの値はhttp://googleappengine.googlecode.com/files/appengine-java-sdk-1.2.1.zipが設定されています。
sdkUnZipDirectory
SDKのZipファイルを展開するディレクトリ。
sdkSaveAs
もしsdkZipFileパラメータがhttpだったりしてローカルじゃない場合に、保存するファイル名。デフォルトの値はappengine-java-sdk-1.2.1.zipが設定されています。sdkUnZipDirectoryで指定したディレクトリ配下に作成されます。もし既に存在していた場合は、リモートからダウンロードしません。
wait
DevAppServerMainを起動した状態で、そのプロセスが終了するのを待ちます。mavenでintegration-testを実行する際はpre-integration-testフェーズでfalseを指定してstartゴールを実行し、post-integration-testフェーズでstopゴールを実行して停止する必要があります。ちなみに、falseで起動してしまうと、プロセスがふたつ(KickStartと、そこから起動されたDevAppServerMain)起動されて、maven実行後にもこのふたつは止まらずに残ってしまいます。この場合は手動でkillする必要があります。

とりあえず細かい事は気にせず、以下の例を見るのが手っ取り早いです。一度でも使用するとローカルリポジトリに入ってくるので、$ mvn help:describe -Dplugin=com.shin1ogawa:gae-maven2-plugin:1.2.1-SNAPSHOT -Ddetailすると説明が表示されるはずです。

例えば、以下のようにpom.xmlintegration-test用のprofileを定義して、$ mvn -P integration-test installのようなカンジでprofileを指定しつつintegration-testフェーズが実行されるようなゴールを実行する。すると以下のように動作する。

  1. 通常のsurefire-testはskipされる。
  2. で、integration-testフェーズの直前にgae-maven2-plugin:startが実行される。
    1. 公式サイトからSDKがダウンロードされる
    2. SDKがtarget/sdkに展開される
    3. そのSDKを利用してKickStart経由でDevAppServerMainを起動する
  3. integration-testフェーズでは**/servlet/*Test.javaにマッチするテストケースが実行される。
  4. integration-testが終了すると、gae-maven2-plugin:stopが実行され、DevAppServerMainも終了する。
ちなみに、ゴールにintegration-testを指定すると、post-integration-testフェーズが実行されない。この挙動は初めて知った!!モチロン、stopゴールも実行されない為、KickStart,DevAppServerMainのふたつのプロセスが残ってしまう。

また、このプラグインを動作確認する程度だけれども、WebDriverを使ったintegration-testを行うサンプルを以下のプロジェクトに追加しています。

  • http://sourceforge.jp/projects/gae-j-samples/svn/view/gae-jdo-simple-sample/?root=gae-j-samples

2009年6月16日

GAE/Jで1MBを超えるファイルのアップロード、保存

GAEではFileのアップロードは10MBまでOKだが、DataStoreに保存できるのは1MBまで…という制限がある。分割して保存すればいいんだけど、それをラクにするためのライブラリが作られているよぅで、Google Cookbookで紹介されている。

google-file-service - Google Codeで公開されていて、そのままeclipseのプロジェクトとして配布しているっぽい。

2009年6月14日

Seasar Conference 2009 springに参加した

参加したと言っても、2コマだけ。3コマ参加する予定だったけど、3コマ目のBigtable/JDOが人大杉で入れなかった。LTと事例紹介に関しては、公式ページのタイムテーブルに情報無さ過ぎで最初からスルーを決め込んでいた。

Cubby in Action

Cubby2.0の話を聞きたくて参加した。前回聞いたときとあまり変わっていなかったように感じたが、モノ自体は着々と進んでいそう。後OValとか知らなかった。たぶんhttp://oval.sourceforge.net/の事だろぅ。guiceと連携した状態でGAE上で動作しているようだ。Guiceの時代ですね!

ServletのMockを使う事でJUnit4でActionの試験ができるそぅだ。CookieもServletのMockがどう扱うかという事で、問題無さそう。Contollerの試験ができるのは大きい。

とはいえ、JSとか描画周りの試験はやっぱりWicketTester最強、またはSelenium…となるんでしょぅねぇ。それでもデータの疎通テストとかをサクサクJUnitで回せるのはありがたいです。

T2 in Action - サンプルから学ぶT2 -

よねさんが時間を後ろに引っぱり過ぎたせいでで次のコマに並ぶ事すらできなかったです…ていうのは冗談です。よねさん+よこたさん+なぜか部屋の一番後ろで立っていたかたやまさん、の絶妙なコンビネーションによる、楽しいセッションであった。

自分としてはAMFの機能を見たかったので、AMFの機能が実際に動作しているアプリも見れてよかった。待っていたよ、AMF。細かい話だけど、リクエストを判断するためのアノテーションについて。既存のものは@GETとか@POSTなのに、@AMFじゃなくて@Amf(全部大文字じゃない)なのね。何か理由があったんだろか?BlazeDSを使ってもいいし使わなくてもT2内部の実装だけでも可能、という話は事前に聞いていて、「そりゃBlazeDS使うでしょ、安心でしょ」とか思っていたけど、T2内部の実装だと「型変換が柔軟」といぅメリットがあるらすぃ。具体的にどぅいぅ事なのかな?現在の状態だと、blazedsのjarがあるかないかで、自前の実装が適用されるかblazeDSの実装が適用されるか、が変わるらしい。今AMFを試す為のバージョンはたぶん0.6.0-SNAPSHOTかな。

参加して良かった。待ってました。というのも、自分としてはT2がGAE/Jと最も親和性が高いフレームワークだと思っているから。html5が現実的に普及するまでは、クライアント側はやっぱりリッチなプラットフォームの方が便利だと思うから(作る立場、使う立場両方で)。html5が現実的に普及したとしても、おそらく(今のアプリのアーキテクチャでよく使う)ステートはhtml5の機能で管理するだろうし、サーバ側でステートを保持しない考え方に今のうちに慣れておいた方がいいと思うし(モチロン今風に。昔はそうだったとか関係なく、新鮮な気分で)。GAE/Jではデフォルトではセッション機能が無効になっているんだけど、つまりそういう事なのかなーとか考えている。あ、別にT2がステートレス専門ってわけじゃないですよ。ちゃんとステートフルにも使えるし、SeamでいうCanversationとかBusinessProcessみたいな超絶便利な機能も、コンテナがサポートすれば使えるんでしょうから(ステートフルに使える場合はスコープの概念があると便利よねー)。

Navigationの実装として、ProtocolBufferがあってもいいのかもしれないなー。GAEの内部ではかなり使われていますよね…?

あ、MLもあるらすぃ。

Scalaのwebフレームワーク liftの紹介

自分としては上記のT2の時間はコレに参加する予定にしていたのだが、前日にshot6さんが「[T2Framework]T2AMF完成とGAEアプリのお披露目」とか書いていて、どーしてもT2の話を聞きたくなったためT2の方に浮気してしまった…。yuroyoroさんの資料はslideshareに上がっていて、家に帰ってから拝見させていただいた。わかりやすい、良い資料だからおすすめ。liftは去年にCometを使ってみたくてちょっと試したが、改めて面白そうだ、とオモタ。これも聞きたかったなー。

BigtableとJDOの勝ちパターン

人大杉で参加できなかった。。。けど、LT枠でアンコールされたらすぃ。その内容は@yamashiroさんがわかりやすく実況してくれていて、それを見る限りはGoogleのインフラの説明っぽく聞こえた。たぶん、Googleを支える技術 ‾巨大システムの内側の世界 (WEB+DB PRESSプラスシリーズ) を読んでいて、既にGAE/Jを触っている人なら聞けなかったとしても平気だよ、とか無理矢理安心しておいた。

全体的な感想とか

今後のSeasarConは、年に何回やるかは良いとして、S2Con biz と S2Con Tech みたいにわけてしまってはどぅだろか?と思った。S2Con bizでは今回で言う事例紹介的な内容にして、平日開催にするとか(ターゲットにしたい層が業務として参加しやすいはず。土日だと来ない可能性の方が高い?)。今回はちょっと技術者向けっぽく無かったし。技術的なセッションが35人部屋とかひどいよなーと。無料のカンファレンスに文句つけるならスタッフとして協力しろカス、とか言われそうだけど、フィードバックとして書いてみた。

後、アンケートを出し忘れて帰って来てしまったんだけど、認定制度みたいな話については、必要無いと思った。アジャイル関連でも結構意見が分かれていますよね。それに、SeasarFoundationの場合は具体的にどんな制度になるかは知らないけど、プロダクトもたくさんあるし、漠然とした制度を用意したところで細かいプロダクトまで知識を広げるのも大変だし。Seasar Expertみたいな中途半端ぽくなりやすそぅな制度とか、Seasar Hoge Expartみたいなやけに範囲が狭い制度があったところで…何の役に立つんだろう?結局ビジネスになりにくいんじゃないか、とかも思う。それよりは各プロダクトでコミッタをされている方々をうまく使う方向で考える方がいーんじゃないのかな?と思っちゃった。体力が必要だけど、日本にそういう組織があって欲しいし、今のところJava界隈ではSeasar Foundationが一番近そうだし。