Grails Code Reading 第15回

前回に引き続き、今回も行ってきました。これで3回目。
今回は前回に比べて人が少なかった。。。
なお、前回の第13.8回は第14回とカウントすることになったそうです。

概要

  • 2008/11/28(金)CIJ@横浜 19:30 - 21:30
  • 実践Groovyスクリプティング
    • 関谷さん
    • groovylab.org
    • JavaWorld 2004年11月号 with 上原氏
  • Groovy イン アクション
    • 高い
    • 難しい
    • 入門本が欲しい

本日のお題

  • 自作アプリ
    • Groat(HTTPサーバ)
    • WeatherBot(Twitterボット)

Groat(古い銀貨)

  • 動機
    • 練習として
    • Groovy in ActionにはSimpleWebserver.groovyもある
    • groovletも動かしたい
      • 普通はServletエンジン上で動かす

  • 機能
    • html,css,jpgなどの静的コンテンツ
    • ディレクトリリスティング
    • .groovyをgroovletとして動かす
    • groovletは明確な仕様がない
      • Servletが決まっているから良い?
    • cookie/sessionサポート
  • 内部構成
    • 550行ぐらい
      • メインクラス+14クラス

    • with系メソッド
      • GDKで追加されたwith〜メソッド
      • src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
        • 10000行ぐらいある
        • GDKで追加されているメソッドが全てある
        • 必ず読みたい
      • クロージャを渡すとリソースのクローズなどをやってくれる

    • 機能テスト
      • Canoo WebTest
      • テストケースもGroovyで書く(XMLでも書けるが)

WeatherBot

  • 動機
    • Rubyで書いたTwitterBotをGroovyで書き直してみた
  • 方針
    • 既存のJava資産を生かす
    • tokyoweather, yokohamaweather

  • ポイント
    • Java資産の活用
      • ロギング:log4j
      • TwitterAPI:twitter4j
    • ConfigSlurper
      • プロパティファイルをgroovyで書ける
      • 複数の設定をマージできる
        • Javaに渡す場合にはPropertyConfiguratorでプロパティ化する
    • クロージャでのreturn(ハマりポイント)
      • クロージャの中と外で振る舞いが異なる
      • [1,2,3].each { print it; return }
        • -> 123
        • eachの中の1回分だけから抜ける->returnがあっても無くても一緒
      • for (it in [1,2,3]) { print it; return }
        • -> 1

      • 抜けたい場合は例外を使って無理やり抜ける??
      • 要素を絞ってからループすべき??

  • groovlet
    • groovlet内で「println 'Hello'」とあったら標準出力(System.out)ではなく、画面上に表示する(という仕様らしい)
      • その仕様がいかがなものかというのは置いといて・・・
      • どうやって切り替えるか?
      • 今のところカテゴリで無理やり差し替えている
        • GroovletEnvironmentクラス

感想など

  • Twitterボットは簡単なコードでいろいろ出来そうで面白い
    • XMLをパースしてGPathで要素抜き出しとか超簡単で感動
  • Canoo WebTestのテストケースをGroovyで書くというのは面白そう
  • いずれにしてもGroovy本とGrails本を読んで手を動かさないことには始まらんというのが良く分かった
  • gina(=Groovy in Action)の簡易版としてのGroovy入門本とかニーズあるんじゃないかと妄想。。。