うさぎ組

ソフトウェア開発、チームによる製品開発、アジャイル、ソフトウェアテスト

プログラミングGROOVYに書いてないけど、便利なGroovyプロダクト #gadvent2011

G* Advent Calendar 2011 : ATND
G* Advent Calendarの一日目です!Advent Calendar初参加!
最初に用意していた記事*1があまりにも一日目らしからぬ感じだったので後日別の記事にする事にしました。
で、いろいろ悩んだのですが、コードとかよりもとりあえず紹介でいいかなっていうことでかなり誰でもできる記事になりました。
まぁゆるふわで!


プログラミングGROOVY

プログラミングGROOVY

プログラミングGROOVY

の中で「GROOVYエコシステム」として様々なプロダクトが紹介されています。
今回はそこではとりあげられなかったけど、素晴らしいプロダクトを紹介しようと思います。
使い方とかはリンク先のWikiとかUserGuideを読めばいいんじゃないかな!
あと、後続の人が書いてくれてもいいと思います!(お

ちなみにプログラミングGROOVYにとりあげられていたものは

Grails

Webフレームワーク。そろそろ2.0がリリースされるみたいで注目度が高い。
Grails - The search is over.

Griffon

GUIアプリケーション用のフレームワークDSLで書けるし、バインドもできるしで便利。
Griffon - Home

GPars

7つもの並列処理モデルを備える多機能並列処理ライブラリ。
gpars (Groovy Parallel Systems) - Home

Gant

Antというビルドツールのラッパー
http://gant.codehaus.org/

Gradle

現代的ビルドツールDSLで書けてGroovy文法も使える。大好き。
Gradle - Build Automation Evolved

Jenkins

世界で最も注目されるCIサーバー。Jenkins上で使えるスクリプトがGroovyだったりと、親和性が高い。
Welcome to Jenkins CI! | Jenkins CI



ということで、ここからがプログラミングGROOVYに記載されなかったプロダクトです。
サンプルコードはリンク先から拝借しました!

YouDebug

Javaアプリケーションに対する非対話的デバッガ。JVMが実装しているデバッグAPIをつかってGroovyからJavaアプリケーションにアクセスする。
YouDebug -


サンプルコード
プロダクトコード

public class SubStringTest {
    public static void main(String[] args) {
        String s = someLengthComputationOfString();
        System.out.println(s.substring(5));
    }

    private static String someLengthComputationOfString() {
        ...;
    }
}

YouDebugコード

breakpoint("com.acme.SubStringTest",7) {
  println "s="+s;
}

BetaMax

HTTPリクエスト/レスポンスを記録できます。記録したオブジェクトをWebAPIがないときにモックとしてつかうことができる。
Betamax - Record & replay HTTP traffic
robfletcher/betamax · GitHub


BetaMax入門スライド


サンプルコード

betamax {
    tapeRoot = new File("test/fixtures/tapes")
    proxyPort = 1337
    proxyTimeout = 30000
    defaultMode = TapeMode.READ_ONLY
	ignoreHosts = ["localhost", "127.0.0.1"]
	ignoreLocalhost = true
}

Cucumber4Duke

Ruby界隈で有名なCucumberをJVM上で使えるようにしたものです。
ScalaやGroovyでも使えます。
cucumber/cuke4duke · GitHub

this.metaClass.mixin(cuke4duke.GroovyDsl)

Given(~/I have entered (\d+) into the calculator/) { int number ->
  calc = new calc.Calculator()
  calc.push number
}

Play-Groovy

最近JavaでHotなWebフレームワークであるPlay!のGroovyプラグインです。
1.xではGroovyが本家に入っていましたが、2.xからはプラグインでの提供になりました。
clarkdave/play-groovy · GitHub


GExcelAPI

POIをラッピングしたExcel操作ライブラリです。
かなり手軽に扱えるのでオススメ。
nobeans/gexcelapi · GitHub

サンプルコード

    void testCellRange_wildcardOfColumn() {
        assert sheet.A_ in CellRange
        assert sheet.A_ == [sheet.A1, sheet.A2, sheet.A3, sheet.A4, sheet.A5, sheet.A6, sheet.A7]
    }

    void testRectangleCellRange() {
        assert sheet.A1_B2 == [[sheet.A1, sheet.B1], [sheet.A2, sheet.B2]]
        assert sheet.A1_B3 == [[sheet.A1, sheet.B1], [sheet.A2, sheet.B2], [sheet.A3, sheet.B3]]
        assert sheet.A1_A3 == [[sheet.A1], [sheet.A2], [sheet.A3]]
        assert sheet.A1_C1 == [[sheet.A1, sheet.B1, sheet.C1]]
    }

    void testHowToUseRowIterator() {
        assert (
            sheet.findAll { row -> row.A_.isStringType() }.collect { row -> row.A_.value + "," + row.B_.value }
        ) == ["Sheet1-A1,B1の内容", "あいうえお,B2の内容"]
    }

GroovyFX

JavaFXをGroovyでラップしたものです。2.0対応がされているのでかなりかっこよくなりました。
groovyfx-project/groovyfx · GitHub


サンプルコード

GroovyFX.start {
    def sg = new SceneGraphBuilder(it)

    sg.stage(title: "GroovyFX Accordion Demo", x: 100, y: 100, visible: true, style: "decorated", primary: true) {
        scene(fill: groovyblue, width: 400, height: 400) {
            accordion {
                titledPane(id: "t1", text: "Label 1") {
                    content {
                        label(text: "This is Label 1\n\nAnd there were a few empty lines just there!")
                    }
                }
                titledPane(id: "t2", text: "Label 2") {
                    content {
                        label(text: "This is Label 2\n\nAnd there were a few empty lines just there!")
                    }
                }
                titledPane(id: "t3", text: "Label 3") {
                    // this is content
                    label(text: "This is Label 3\n\nAnd there were a few empty lines just there!")
                }
            }
        }
    }
}

GMetrics

Groovyコードのメトリクス測定ができます。メソッドあたりの行数、クラスあたりの行数、サイクロマティックとか。
GMetrics - GMetrics - Home


GBench

Groovy用のベンチマークを計れます。
gbench - the benchmarking module for groovy - Google Project Hosting


サンプルコード

import gbench.*

def benchmarker = new BenchmarkBuilder()
def benchmarks = benchmarker.average(repeat: 5, idle: 1) {
    int num = 25
    'recursive fibonacci' {
        { n ->
            if (n < 2) return n
            return call(n - 1) + call(n - 2)
        }(num)
    }
    'iterative fibonacci' {
       { n ->
            int a = 0
            int b = 1
            int c
            for (int i in 2..n) {
                c = a + b
                a = b
                b = c
            }
            return b
        }(num)
    }
}
benchmarks.sort().prettyPrint()

アウトプット

                              user        system               cpu            real

iterative fibonacci              0             0                 0          647596
recursive fibonacci     2923458740      18720120        2942178860      2947965327


どうでしたでしょうか?
次は id:nobusue さんです!

*1:Groovy本体を含むG*プロダクトをいくつか選んで、テストコードの特徴の分析や品質を測定した結果をまとめたものを書いた。完全に自分得状態で、いくつかのプロダクトについては批判せざるを得ない場面があり、そんなものを初日に掲載するわけにもいかず。。。的な。