Grails Quick Start(3)

さてさて、亀のようにすすんでますが、続きです。

Create the Controller

次は、Controllerというやつですね。
クライアントから受け取ったリクエストを適当に捌いてビジネスロジックを起動するコンポーネントです。詳しい説明はここ


ドメインモデル同様、grailsコマンドで雛形を生成できるようです。

> cd firstapp
> grails create-controller

名前を聞いてくるので、チュートリアルにしたがって”book”とします。

init-props:
  [groovy] statements executed successfully

create-controller:
  [input] Enter controller name:
book
  [groovy] statements executed successfully
  [copy] Copying 1 file to ...
  [echo] Created controller: grails-app/controllers/BookController.groovy

internal-create-test-suite:
  [groovy] statements executed successfully
  [echo] Created test suite: grails-tests/BookTests.groovy


以下のようなファイルが作られました。
firstapp\grails-app\controllers\BookController.groovy:

class BookController {

	@Property index = { }
}

これって、URLにマップされるのかしら?
サーバーを動かして...

> cd firstapp
> grails run-app

ブラウザからアクセス → http://localhost:8080/firstapp/book
エラーだ。↓

HTTP ERROR: 404
/WEB-INF/grails-app/views//book/index.jsp
RequestURI=/firstapp/book
Powered by Jetty://

Viewが必要なのかな。そうかそうか、フライングか。


というわけで、チュートリアルに奴隷のように従い、以下のように実装を加えておきます。

class BookController {
   @Property index = {
         redirect(action:list)
   }
   @Property list = {
             [ books : Book.list() ]
   }
}

ここによると、Controllerに属性としてクロージャを持つと、URLとそのクロージャが関連つけられるのだそうです。なるほどー。
どういうことかと言うと、たとえば、上のBookControllerの、

   @Property list = {
             [ books : Book.list() ]
   }

という属性は、名前が”list”なので、http://localhost:8080/firstapp/book/list というURLと関連つけられて、URLにリクエストがあると { } の中のロジックが実行されるのですね。
属性名をindexとすると、index.htmlみたいにデフォルトとして扱われるそうです。ふーん。


ちなみにクロージャというのは、処理のひとかたまり(ブロックとかいうといいのだろうか?)がオブジェクトとして扱える、、みたいなイメージ?正しい定義はご勘弁を。
詳細はこちら
上の例をJava的に書くと、

interface Function { abstract Object exec(); }
....
  public Function list = new Function(){
    Object exec() {
      Map m = new HashMap();
      List books = Book.list();
      m.put("books", books);
      return m;
    };
  };

こんな感じ?


Groovyでは、コレクションの宣言が簡略化されていて、
list = [] で、 List list = new ArrayList();
list = [1,2,3] のように初期化できる模様。
map = [:] で、 Map map = new HashMap();
map = [label1:"value1", label2:"value2"] なんて書ける。
これはすごく便利!
詳細は例によってこちら

The Back Room/Editors

Back Room

Back Room

名前も見た目も地味だし、ニューウェーブリバイバル系のUKバンドということで、いまいち興味がなかったのですが、ちょっと視聴してJoy Divisionっぽかったので買ってみたんですが、このバンドいいですねー。


何がよいって、やはりJoy Divisionを彷彿させるからなんですが。
なかなかいなかったんですよ。そういうバンドが。Joy Divisionはもう存在しませんし、再結成してもIan Curtisはいないわけですから、音源に限りがあるわけです。
そんな中、こういう音が聞けてとてもうれしいんです。IsolationとかDead SoulsとかLove will tear us appartとかAtomosphereとか。。声質も似てるし。くぅー。
Rockin' Onのレビューにもありましたが、曲自体すごく良いです。


中には、WARとかの頃のU2っぽいナンバーもあるんですよ。
あー、U2ニューウェーブだったんだっけ、と。
BONOがLove will tear us appartを歌ったらかなりはまるかも、なんて思ったりして。
そんな発見もあったうれしい1枚でした。以上。

Grails Quick Start(2)

気を取り直して、つづきです。

Configure a Data Source

アプリケーションが使うデータベース接続先の定義は、以下のようにクラスとして定義するようですね。
デフォルトでは、HSQLDBを使う設定になっています。
”アプリケーションフォルダ/grails-app/conf”にある、ApplicationDataSource.groovyを開くと、

class ApplicationDataSource {
   @Property String url = "jdbc:hsqldb:mem:testDB"
   @Property String driverClassName = "org.hsqldb.jdbcDriver"
   @Property String username = "sa"
   @Property String password = ""
}

@Property というのは、Groovyの記法で、クラスの属性とその属性用のsetter/getterメソッドが定義されるようです。一瞬、Java5のアノテーションかと思いましたが、JDK1.4でも動作するみたいです。
今のところは、このままにして進めるとしましょう。

Create a Domain Class

Domain Classというのは、アプリケーションの領域に存在するビジネスオブジェクト、、みたいな感じ?
以下のように、コマンドで雛形が作成されるようだけど、デフォルトではDomain Classのフィールドはデータベースにマップされるそうです。
作ってみましょう。
アプリケーションフォルダに移動してコマンドを実行ぉー。

> cd firstapp
> grails create-domain-class

例によって、Domain Classの名前を聞いてくるので、チュートリアルにあるとおり、”Book”とします。

> create-domain-class:
  [input] Enter domain class name:
Book
  [groovy] statements executed successfully
  [copy] Copying 1 file to ...
  [echo] Domain class created: grails-app/domain/Book.groovy

internal-create-test-suite:
  [groovy] statements executed successfully
  [copy] Copying 1 file to ...
  [echo] Created test suite: grails-tests/BookTests.groovy

モデルのソースらしきファイルと、そのテストモジュールらしいのができているようです。


できたgroovyファイルは、こんな風になっています。
firstapp\grails-app\domain\Book.groovy

class Book { 
    @Property Long id
    @Property Long version

    String toString() { "${this.class.name} :  $id" }
}

id と version というのがデフォルトで出来るようですね。
id はBookエンティティのユニークIDなのかな?
versionは分からん。。serialVer ではないですよね。。おいおい調べるとしましょう。
例に従って、Bookの属性を追加しておきましょう。

class Book { 
    @Property Long id
    @Property Long version

    @Property String title
    @Property String author

    String toString() { "${this.class.name} :  $id" }
}

ね、眠い。。今日はここまで。

また今度!

日曜に区の剣道大会がありまして、出場して参りました。
直近1週間、練習に励んでみたのですが、結果は惨憺たる敗戦。。やはり付け焼刃ではだめですね。。というか、みなさん強かったです。
剣道連盟55周年の記念大会ということで、各団体、出場人数が限定されてたそうなのですが、それでか選手のレベルが高かった気がします。
まぁ、私のレベルが低いんですが。
試合慣れしていないのがバレバレのうぶな試合をしてしまいました。ダサダサ。
それなりに悔しいので、次回がんばります。

痛い。。

今朝、目が覚めたら身体のあちこちが痛くて容易に起き上がれませんでした。
特に、左ひざと肩がひどく、足踏ん張れないし、真面目に肩があがらなかった。
四十肩、五十肩とはこのことか!
明日が剣道の試合なので、このところめずらしく練習に励んでいたので、筋肉痛がまとめて押し寄せてきたのかもしれない。
まじで動かないので、ストレッチをしてやったら、そこそこほぐれて日常生活はこなせるようになりました。


夜、1時間ほど稽古に出てきましたが、どうも、打つときに身体が曲がっているらしくよく注意されます。
素振りで随分矯正してみてはいるんだけど、相手ありの試合稽古になると、どうしても元に戻っていがちです。わかっちゃいるけどうまくいかない。難しいもんですね。


基本が身体に染み付いているような人たちは、やっぱり強いなぁと思います。
下手に応用に走ってはいかんのだなぁ、とつくづく思います。
日ごろ、ソフトウェアの開発なんかを生業にしてますが、同じことが言えますねー。基礎がしっかりしてる人はバランス良く仕事しますものね。


まぁまぁ身体も動くようになってきたけど、試合に勝てるレベルには到底達していません。まぁ、オリンピック精神で臨むこととします。

Grails Quick Start

さて、インストールしてみたGrailsですが、QUICK STARTというチュートリアルがあるようです。
まずは、ざっと概要をつかむために、やってみましょう。

Create a Grails project

前の投稿を参照。
アプリケーション開発の土台を生成しました。


確か、RubyRailsだと、この時点でもサーバーを起動すれば張りぼてアプリが動いたはず。
どれどれ、ページの下のほうに、Start Grailsというのがあるね。

> grails run-app

とやるらしい。やってみよう。。。おー、Antなのか。。コンパイルとか始まったよ。。
すごく重そう。いつもそうなのか???
コンソールが落ち着いたらCtrl+Cで止めてもう一回やってみる。。あー、すっと動いた。最初だけなのか。。


ブラウザでアクセスしてみよう。。

http://localhost:8080/firstapp

おー、動いてますね。張りぼてだけど。
コマンド一発でWebアプリが動くって気持ちよいですよ。

Grailsインストール

http://grails.codehaus.org/Installation
今回は、CVSからソースをダウンロードしてビルドしてみた。

CVSROOTは、
:pserver:anonymous@cvs.grails.codehaus.org:/home/projects/grails/scm
※パスワードは空でした
Eclipseを使うとそのままプロジェクトになるので便利です。


ビルドは簡単。
ダウンロードしたモジュールのTOPに移動して、antを実行するだけ。たとえば、

> cd c:\grails
> ant


次に、Quick Start Guide

grails create-app

というコマンドでアプリケーション(の土台)を作ってくれるようですね。
Railsrailsコマンドに相当するものですね。
railsでは、引数にアプリケーション名を渡すんだと思いましたが、"grails create-app"を実行すると、インタラクティブに名前を聞いてくるらしいです。


さて、binにパスを通して早速実行!

> cd c:\work
> grails create-app

。。。う、パスがないとか何とか言われちゃった。。なぜだ。。
ようわからんので、binの下のgrails.batをエディタで開いて、@echo offをREMる。
もう一回!
う、GRAILS_HOMEを設定してないじゃない。。ちゃんと読まないとね。


では、再度実行!
おおー!動いた!
名前は、、、"firstapp"とかにしておこう。。ベタだけど。

こんな感じで、フォルダ、ファイルが自動生成されました↓

> ls
firstapp
> cd firstapp
grails-app grails-tests hibernate lib spring src web-app

とりあえず、はじめの一歩はここまでー。