Magazine
vol.8

Japan Grails/Groovy User GroupContents
Series 10

Groovy 臨機応変（第三回）〜 Groovy 2.3 の新機能〜… …………………………… 2

Groovy 臨機応変（第四回）〜 Groovy 2.4 の新機能〜… …………………………… 7
Series 16

Gradle Plugin 探訪～第 1 回 Gradle SSH Plugin ～………………………… 9Series 05

Grails Plugin 探訪〜第 9 回 CodeNarc plugin 〜… ……………………… 14
Information

リリース情報…………………………………………… 19

G*Magazine vol.8

Groovy臨機応変（第三回）〜Groovy 2.3の新機能〜

10series

上原 潤二（うえはら じゅんじ）
NTT ソフトウェア株式会社 Grails 推進室所属。JGGUG（日本 Grails/Groovy ユーザ会）運営委員。
「Grails 徹底入門」（翔泳社）、「プログラミング GROOVY」（技術評論社）執筆メンバーの 1 人。
Groovy 技術に関するブログ「Gr な日々」を主宰している。

今回は、Groovy 2.3 の新機能をピックアップして紹介します。

詳しくはリリースノートを参照ください。

@TailRecursive
def foo(int n, int lim) {if (n < lim) {トレイト (Traits)

foo(n+1, lim)}

Groovy 2.3 における目玉機能としてトレイトが導入されましelse {た。Groovy のトレイトは、実装の継承が可能なインターフェーnスです。Java8 では、インターフェースにおいて、サブクラスで定義しなかった場合の「デフォルトのメソッド」を定義することができるようになりましたが、Groovy のトレイトも同種の機構}}であると言えます。しかし、Groovy のトレイトは、メソッド以上は以下のようにループに変換されます。

な実装をすることができます。また JDK7 以前の Java 上でも利用@groovy.transform.TailRecursive

外にもメンバー変数を定義・使用したり、Proxy を経由した動的することもでき、より強力な機構であると言えます。Groovy のpublic java.lang.Object foo(int n, int lim) {トレイトは Scala のトレイトと似ています。詳しくは以下を参照_lim_ = lim（参考リンク）

while (true) {_n_ = n

ください。

try {

• http://beta.groovy-lang.org/docs/groovy-2.3.0/html/

if ( _n_ < _lim_ ) {documentation/core-traits.html

java.lang.Integer __n__ = _n_• http://www.slideshare.net/uehaj/groovy-trait

java.lang.Integer __lim__ = _lim__n_ = __n__ + 1

新規 AST 変換の導入_lim_ = __lim__
continue@TailRecursive, @Builder, @Sortable, @SourceURI の 4 つ の AST} else {変換が導入されました。以下にそれぞれの説明を示します。

return _n_}@TailRecursive}

メソッドの自己再帰呼び出しをループに変換します。メソッド

を跨った相互末尾再帰等には対応していないなどいくつかの制約

catch (org.codehaus.groovy.transform.
tailrec.GotoRecurHereException ignore) {があります。

continue

以下の自己末尾再帰呼び出しを含むコードに @TailRecursive を}適用してみます。

finally {}}return null}

繰り返し数に比例してスタックを消費することがなくなるので、スタックオーバーフローを気にすることなく、適切な場合には再帰呼び出しでわかりやすくロジックを書くことができます。

2

Groovy 臨機応変（第三回）〜 Groovy 2.3 の新機能 〜

G*Magazine vol.8（参考リンク）• http://beta.groovy-lang.org/docs/latest/html/gapi/groovy/transform/TailRecursive.html@Builderimport groovy.transform.Sortable@Sortableclass Book {int price

インスタンスを初期化するための、フルーエントなメソッド呼び出しによるビルダパターンを可能とする AST 変換です。
使用例を以下に示します。

import groovy.transform.builder.Builder@Builderclass Book {int price
String title

String title}
data = [new Book(price:10, title:"abc"),
new Book(price:9, title:"def")]
Collections.sort(data)assert data[0].price == 9 && data[0].title == "def"assert data[1].price == 10 && data[1].title == "abc"}def book = Book.builder().price(100).title(" 我輩は猫である ").build()

上記以外に、いくつかのパターンでのサポートメソッドを AST

変換の引数で指定することもできます。たとえば、setter をチェインさせていくようなパターンのビルダメソッドを生成することもできます。

（参考リンク）• http://beta.groovy-lang.org/docs/latest/html/gapi/groovy/transform/builder/Builder.html@Sortable

指定したクラスに対して以下を行います。

• compareTo メソッドを生成し、インターフェース Comparable（参考リンク）• http://beta.groovy-lang.org/docs/latest/html/gapi/groovy/transform/Sortable.html@SourceURI

String や URL クラス型の変数定義に指定すると、その変数の値に Groovy スクリプト自身の URI が初期設定されます。
import groovy.transform.SourceURI@SourceURI String src
println src

上記のスクリプトを、ファイルに保存して実行すると file: でを実装する。

始まる URI が表示されます。あるいは、スクリプトを Web サー

ソッド (comparatorByXXX()) を生成する。

URL が表示されます。さらに、以下のように -e オプションでスク• それぞれのフィールドに関して比較する Comparator を返すメ
• → 返 さ れ た Comparator は、java.util.Collections.sort(List list,

Comparator c) や、java.util.Arrays.sort(T[] a, Comparator<?
super T> c) に渡してソート処理に適用できる。

コード例を以下に示します。

バに置き、URL を指定して groovy コマンドを実行すると、そのリプトを指定したり、GroovhShell.evaluate(String) でスクリプトを実行すると、@SourceURI は data: で始まるデータ URI を生成します。

$ groovy -e 'import groovy.transform.SourceURI; @SourceURI String src; println src'
data:,import%20groovy.transform.SourceURI;%20@
SourceURI%20String%20src;%20println%20src（参考リンク）• http://beta.groovy-lang.org/docs/latest/html/gapi/groovy/transform/SourceURI.html

Groovy 臨機応変（第三回）〜 Groovy 2.3 の新機能 〜

3

G*Magazine vol.8

ライブラリの拡張・改善

パラメータ

説明

INDEX_OVERLAY

高速。REST 呼び出し・WebSocket メッ
セージ・AJAX などに適している。シ
リアライズされたオブジェクトの展
開処理を特に高速化している。

した。マークアップテンプレートエンジンは、DOM 的な構造をLAX

コメントや、クオート無しのマップのキーを許す。

る例を以下に示します。

CHAR_BUFFER

int,date,long などの貪欲 (eager) な
パース処理が特長。既存の Slurper の動作に近い。

CHARACTER_SOURCE

2MB を越える JSON ファイルの処理に適する。

■■マークアップテンプレートエンジン

新種のテンプレートエンジン、マークアップテンプレートエン

ジ ン (groovy.text.markup.MarkupTemplateEngine) が 追 加 さ れ ま
記述するための DSL の一種であるとも言えます。参考リンクにあyieldUnescaped '<!DOCTYPE html>'
html(lang:'en') {head {
meta('http-equiv':'"Content-Type" content="text/html; charset=utf-8"')
title('My page')}

これらのパラメータは以下のように指定します ( 参考リンクに示した API リファレンスより引用 )。

parser = new JsonSlurper().setType(body {

JsonParserType.INDEX_OVERLAY );p('This is an example of HTML contents')}（参考リンク）• http://beta.groovy-lang.org/docs/groovy-2.3.0/html/gapi/}
これは以下のような XML を生成するとのことです。
<!DOCTYPE html><html lang='en'><head><meta
http-equiv='"Content-Type" content="text/

groovy/json/JsonParserType.html■■ConfigSlurper の拡張

Grails で定義されていて利用可能であるような、prod/dev/test

html; charset=utf-8"'/><title>My page</title></といった「環境」を、新たに定義し指定できるようになりました。

head><body><p>This is an example of HTML

（参考リンク）

contents</p></body></html>
マークアップテンプレートエンジンは、MarkupBuilder と同様に、クロージャや疑似メソッドの呼び出しを使用してツリー構造

を記述・構築し、文字列表現に落とすことができます。加えて、以下の特長があります。

• 静的コンパイルで高速化• 静的型チェックが可能• 整形 ( インデント、エスケープ ) 機能付き

• テンプレート記述を別ファイルにして include なども可能（参考リンク）• http://beta.groovy-lang.org/docs/groovy-2.3.1/html/• http://mrhaki.blogspot.jp/2014/05/groovy-goodness-extendconfigslurper.html

Java8,7 の対応■■Java8

実行環境として JDK 8 が公式にサポートされました。

■■Java7Java 7 の NIO2 に対応しました。例えば、いくつかの GDK メソッ

ドで、java.io.File の代りに java.io.Path クラスが使用できます。
以下はリリースノートからの例です。

documentation/markup-template-engine.html

path.withReader { Reader r -> ... }■■JSON Slurper

Groovy 2.3 ライブラリではいくつかの性能改善がなされており、特に、JSON 処理が従来より最大 20 倍高速化され、Java ベースのライブラリの中で最速の部類となっているとのことです。

JSON Slurper については、以下のパラメータを指定できるようになりました。

4

Groovy 臨機応変（第三回）〜 Groovy 2.3 の新機能 〜

path.eachLine { String line -> ... }path.eachFileRecurse { Path p -> ... }path << 'some content'
path << bytes
path.readLines()

G*Magazine vol.8

JUnit 4 対応
groovy.test.GroovyAssert に以下の静的メソッドが追加されました (GROOVY-6588)。これらは、従来より GroovyTestCase のインスタ

ンスメソッドとしては対応するものが定義されていたのですが、JUnit4 でテストクラスを GroovyTestCase から継承させない場合に使用するための、静的メソッドが定義されたクラス groovy.test.GroovyAssert では定義されていませんでした。
メソッド

説明

static void

assertScript(String script)

文字列のスクリプトを実行結果を assert する

static boolean

notYetImplemented(Object caller)

試験の成功 / 失敗を逆転させて扱う (Fail なら Pass とし、Pass なら Fail とする。

static ThrowableshouldFail(Class clazz, String script)

文字列のスクリプトを実行し指定した例外が発生したら Pass とする

static ThrowableshouldFail(String script)

文字列のスクリプトを実行し例外が発生したら Pass とする

Closure 引数に対する静的型チェック
従来、クロージャを引数としてとるメソッドにおいて、クロー

ジャ型の引数の引数に型を宣言する方法がありませんでした。
例えば、

void foo(Closure clos) {// クロージャ clos の「引数の型」を宣言する方法がない。
clos("ABC")// 引数 clos のクロージャには、常に 1 つの文字列が引数として与えられるのだが…。
}["a","b","c"].collect { it.toUpperCase() }この場合、「クロージャの引数の型」は、レシーバの List の「要素の型」と一致していなければなりません。

collect は、GDK メ ソ ッ ド と し て、DefaultGroovyMethods.

java(DGM) 中で、以下のように定義されています。

public static <S,T> List<T> collect(Collection<S>
self,@ClosureParams(FirstParam.FirstGenericType.class)
Closure<T> transform) {というメソッドが定義されているとき、以下のコード：@TypeChecked

return (List<T>) collect(self,
new ArrayList<T>(self.size()), transform);}

def func() {foo { it -> it.toUpperCase()// 静的型エラー。it の型は Object とみなされる。
}「 @ C l o s u r e P a r a m s ( F i r s t P a r a m . F i r s t G e n e r i c Ty p e . c l a s s )transform」では、クロージャの引数 transform の引数の型は、第一引数 (FirstParam) すなわちレシーバであるコレクション self のジェネリックス型引数 (S) である、と宣言しています。ちなみに T}

はクロージャの戻り値の型です。
は、 ク ロ ー ジ ャ 引 数 it の 型 を 知 る 方 法 が 無 く、it に 対 す る

toUpperCase() の呼び出しが静的型チェックや静的コンパイルでエラーになるので、以下のように型を指定する必要がありました。
foo { String it ->it.toUpperCase()}
しかし、foo の宣言時に @ClosureParam を以下のように使用することで、it の型は推論されるようになり、型を明示的に指定する必要がなくなります。

void foo(@ClosureParams(value=SimpleType.class,options="java.lang.String") Closure clos) {clos("ABC")}@ClosureParams を 使 用 す る こ と で、 ラ イ ブ ラ リ 側 の 定

義 は 煩 雑 に な り ま す が、 そ れ を 呼 び 出 す コ ー ド に お い て @TypeChecked、@CompileStatic は よ り 賢 く 振 舞 う よ う に な り、
コードを簡潔にすること、及び動的 Groovy コードに適用した際の修正を減らすことに貢献してくれます。

なお、Groovy 2.4 beta 4 では、同様の指定が @DelegatesTo ア

ノテーションでも可能になりました。(GROOVY-6956)（参考リンク）• http://melix.github.io/blog/2014/01/closure\_param\_
inference.html• [1] Java8 では Generics の引数型に対してアノテーションが付与できるようになったので、このような間接的な指定方法ではなく直接指定できるはずである。あるいは Groovy 自体の拡張

で同種の指定も可能であっただろう。しかしながら、Groovyのコンパイル・動作環境は Java8 には限定されておらず、また ClosureParams を 使 用 す る 主 な 場 所 は Java で 定 義 さ れ た

話はジェネリクスが入ってくるともうちょっとややこしくなり[1]ます 。次の例です。

DGM(DefaultGroovyMethods.java) で あ る た め、Java 7 以 前 でも使用できるこの方法が採用された。

Groovy 臨機応変（第三回）〜 Groovy 2.3 の新機能 〜

5G*Magazine vol.8

ツールの拡張■■Groovysh の拡張と変更

Groovysh は着々と拡張されています。まず、補完が賢くなりました (GROOVY-6399,GROOVY-6395)。たとえば、マップのキーを補完できるようになりました。
% groovysh
groovy:000> m = [abc:123, def:456]
groovy:001> m.a [ タブを押す ]
any(

abc

groovy:001> m.ab [ タブを押す ]groovy:001> m.abc // 補完される
この機能は、DOM ツリーや AST など、ツリーをたどりながら表示させる場合に絶大な効果を発揮します。

また、機能の変更として、groovysh 中でのコマンド (load, edit,

alias など ) にはプリフィックス「:」が必要となりました。変数名
や関数名と重なることがなくなります。 (GROOVY-6397)% groovysh
groovy:000> :load test.groovy // 従来はコロン無しの「load」で実行していた■■GroovyConsole の拡張

GroovyConsole には以下の拡張がなされています。

• プリファレンス API を通じてフォントが指定できるようになったとのことです。ただしフォント指定のための GUI はまだ用意されていません。(GROOVY-6303)• 選択範囲で実行 (Run Selection) したときに、import 文を意識してくれるようになりました。つまり、選択範囲に import 文が含まれていなくても、同じソース中の冒頭位置などに含まれている import があたかも選択範囲中にも指定されているかのように解釈して実行してくれます。

• コメント・コメント解除の機能とショートカットキーが追加されました。(GROOVY-6459)

ドキュメントの改善
その他、ドキュメントが抜本的に改善されています。改善された内容は、現時点では Groovy のβ版ドキュメントページで公開
されていますが、将来的には公式サイトの内容に置換されます。
（参考リンク）• http://beta.groovy-lang.org/download.html

6Groovy 臨機応変（第三回）〜 Groovy 2.3 の新機能 〜

G*Magazine vol.8

Groovy臨機応変（第四回）〜Groovy 2.4の新機能〜

10series

上原 潤二（うえはら じゅんじ）
NTT ソフトウェア株式会社 Grails 推進室所属。JGGUG（日本 Grails/Groovy ユーザ会）運営委員。
「Grails 徹底入門」（翔泳社）、「プログラミング GROOVY」（技術評論社）執筆メンバーの 1 人。
Groovy 技術に関するブログ「Gr な日々」を主宰している。

今 回 は、Groovy 2.4 の 新 機 能 を、 現 時 点 で 公 開 さ れ て い る

例)正式リリースまでにはさらに機能が追加されるでしょうから、

assert [4,1,2,2,3,3,4].toUnique() == [4,1,2,3]

Groovy 2.4 beta4までのリリースノートから抜粋して紹介します。
正確には Groovy 2.4 の機能の一部ということになります。

assert [4,1,2,2,3,3,4].toSorted() == [1,2,2,3,3,4,4]（参考リンク）• https://jira.codehaus.org/secure/ReleaseNote.jspa?projectId=10242&version=20369• https://jira.codehaus.org/secure/ReleaseNote.jspa?projectId=10242&version=20433• https://jira.codehaus.org/secure/ReleaseNote.jspa?projectId=10242&version=20544• https://jira.codehaus.org/secure/ReleaseNote.jspa?projectId=10242&version=20612

Android 対応
Groovy 2.4 では Android アプリケーションを開発できるようになりました。Groovy を Android で動作させるための試みは過去にもいくつかありましたが、今回はパッチなどではなく、公式の Groovy メインラインで対応されているのが特徴です。基本
的には、Static Compile 配下で動作する機能を使用します。この

Android 対応に合せて SwissKnife、grooid-tools などの開発用ラ■■init(), dropRight()、takeRight() の追加

Scala の同名メソッドの導入です。(GROOVY-6867)
メソッドの説明を以下に示します。
メソッド

意味

例 (a = [1,2,3] のとき )init()

末尾以外。

assert a.init()==[1,2]dropRight()

末尾の指定個数を削除

assert a.dropRight(2) == [1]takeRight()

末尾の指定個数を取得

assert a.takeRight(2) == [2,3]■■System.currentTimeSecond() の追加

エ ポ ッ ク か ら の 経 過「 秒 数 」 を 返 す メ ソ ッ ド System.

currentTimeSecond() が 追 加 さ れ ま し た。JDK の System.
currentTimeMillis の 1000 分の 1 を返します。(GROOVY-6294)
groovy:000> System.currentTimeSeconds()===> 1416000159

イブラリもでてきています。(GROOVY-6861)

groovy:000> System.currentTimeMillis()（参考リンク）===> 1416000167901• https://github.com/Arasthel/SwissKnife• https://github.com/karfunkel/grooid-tools

ライブラリの拡張
toUnique(),toSorted() の追加。

List など、Iterable なコレクションに対する GDK メソッドの追加です。(GROOVY-6945)

従 来 か ら JDK に 存 在 し た List#sort() は 破 壊 的 操 作 で し た が、

toSorted はイミュータブルな、「ソートしたものを返す操作」です。
また、toUnique() も同様に、重複要素を削除したものを返し、もとのコレクションを変更しません。またこれらは Iterable なコレ
クション一般もしくは配列に対する適用も可能です。

Java8 では、コレクションに対する sort メソッドが新規に追加

Groovysh の拡張
groovysh が地道に拡張されています。
• groovysh ではメソッド補完が効くようになっているのです

が、補完候補の表示に ANSI のエスケープシーケンスを使って、インスタンスメソッドはボールド表示、static メソッドやsuper クラスのメソッドは通常表示となるようになりました。
(GROOVY-6563)• 以前の Groovysh では、行の単位で Groovy の式を評価するため、シェル変数以外の型宣言した変数を行をまたがって使用することができませんでしたが、可能となります。(GROOVY-6623)

されましたが、GDK の sort と名前が被るので、混乱を避けるためにという意味合いもあるようです。

Groovy 臨機応変（第四回）〜 Groovy 2.4 の新機能 〜

7

G*Magazine vol.8（例）以下が可能となる。
String s = "abc"import groovy.transform.*
import java.util.concurrent.CopyOnWriteArrayList

println s• groovysh の起動時に、-e オプションで任意の Groovy コードを実行できるようになりました。また、コマンドラインに指定した groovy スクリプトを読み込むようになりました。

@CompileStatic@SelfType(List)
trait LispLikeList {Object car() {（例）

first()}> cat test.groovy

Collection cdr() {println "hello"tail()> groovysh -e 'println 1+1' test.groovy
Groovy Shell (2.4.0-beta-3, JVM: 1.8.0_25)
Type ':help' or ':h' for help.
-----------------------------------------------------------------------------------groovy:000> println 1+1}}
class LispLikeCoWList<E> extends
CopyOnWriteArrayList<E> implements LispLikeList {LispLikeCoWList(list) {2

super(list)===> nullgroovy:000> :load test.groovy
hello===> nullgroovy:000>

SelfType アノテーション
トレイトの定義において、そのトレイトを実装するクラスが実装していなけれならないクラスもしくはインターフェースを @SelfType というアノテーションで指定できるようになりました。
SelfType アノテーションによって、以下の利点が得られるようになります。

• トレイトが、どんなクラス・インターフェース ( およびそのサブクラス ) に注入可能であるかを制約する。この制約を満していないクラスがそのトレイトを実装しようとするとコンパイル
エラーとなる。

• その結果、トレイトで定義するメソッド中で、使用できるはずのメソッド群が静的に予期できるようになり、実装クラスのメソッドを自由に呼び出せる。

• トレイトのメソッド中での this の型が静的に確定するので、}}def list1 = new LispLikeCoWList([1,2,3])
assert list1.car() == 1
assert list1.cdr() == [2,3]（参考リンク）- http://docs.groovy-lang.org/2.4.0-beta-4/html/

documentation/core-traits.html#_self_types

Macro Groovy
その他、AST 変換における AST の生成を簡易に書けるようにす

る「Macro Groovy」機能の、Groovy 公式機能としての導入が検討されています。この過程で、AST の木のパターンマッチングサ
ポートも検討されているようです。
（参考リンク）• https://github.com/bsideup/MacroGroovy• http://groovy.329449.n5.nabble.com/State-of-the-macrostd5721429.html#a5721475

this を他のメソッドに渡す際などに静的型チェック可能になる。

要は、トレイトと静的 Groovy(@CompileSattic, @TypeChecked)との相性がより高まったということです。
コード例は以下のとおり。

Groovy 2.4 正式版は本記事執筆後に公開されました。冒頭にお断りしているように、Groovy 2.4 正式版では本記事で記載した以外にも多数の機能が追加されております。また、Macro Groovy の採用は 2.4.0 時点では見送られています。悪しからずご了承ください。
( 参考リンク )http://docs.codehaus.org/display/GROOVY/Groovy+2.4+release+notes

8

Groovy 臨機応変（第四回）〜 Groovy 2.4 の新機能 〜

G*Magazine vol.8

Gradleプラグイン探訪〜第1回 Gradle SSH Plugin〜

16

series

須江 信洋（すえ のぶひろ）
日本 Grails/Groovy ユーザーグループ サポートスタッフ。『Groovy イン ･ アクション』（毎日コミュニケーションズ）翻訳チーム、および『プログラミング GROOVY』（技術評論社）「Gradle 徹底入門（翔泳社）」執筆チームの一員。 本稿は著者
個人の考えおよび経験に基づいて記述したものであり、所属する会社や組織の意見を表すものではありません

Gradle SSH Plugin は、Gradle のビルドスクリプトから SSH によるリモート操作や、SFTP によるファイル転送を行うためのプ

ラグインです。ビルドプロセスにおけるファイル転送やサービス

クイックスタート開発者の @int128 氏がテンプレートプロジェクトを提供してく

起動・停止など、さまざまな操作を自動化することができます。

れていますので、参考にするとよいでしょう。

別なエージェントやデーモンなどを導入する必要がないため、導Vagrant で SSH 可能な仮想マシンを準備するサンプルを用意しま

鍵認証、SSH エージェント、SOCKS プロキシ対応など、さまざまてみましょう。以下のコマンドでサンプルを入手してください。

操作対象のサーバーには SSH でアクセス可能であればよく、特入の敷居が低いことも特徴です。加えて、パスワード認証や公開な利用パターンに対応しています。

また、Gradle SSH Plugin の SSH 接続機能だけを単体で切り出した Groovy SSH というライブラリも提供されており、Gradle とは無関係に単体の Groovy スクリプトから利用することも可能です。

本 稿 で は、 テ ン プ レ ー ト プ ロ ジ ェ ク ト に 少 し 手 を 入 れ てしたので、そちらを利用して Gradle SSH Plugin の動作を確認し

git clone -b gmag-8 https://github.com/nobusue/
gradle-ssh-plugin-template.git
サンプルコード内の build.gradle は以下のようになっています。

Gradle SSH Plugin 概要
開発者 : @int128 ( いわてぃ ) 氏

最新バージョン : 0.4.5 (2014/11/24 時点 )プロジェクト Web サイト :• Gradle SSH Plugin [https://gradle-ssh-plugin.github.io/]• Groovy SSH [https://groovy-ssh.github.io/]
ライセンス : Apache License Version 2.0

本プラグインのバージョン 0.4.x は Gradle2.0 以降が必要です。

Gradle1.x から利用する場合はバージョン 0.3.x を利用してください。

Gradle SSH Plugin を使うメリット
Java で実装された SSH ライブラリはいくつかありますが、標準入出力の処理など低レベルの処理を自分で実装しなければなりま
せん。

Gradle SSH Plugin は独自の DSL( 以降「SSL DSL」と表記します )を提供することでこのような煩雑さをなくし、かつ処理対象のグループ化などを見通しよく実装できるように工夫されています。
( 内部では JSch を利用しています。)

SSH DSL の文法は Groovy SSH と共通なので、Gradle から利用するだけでなく、高機能なシェルスクリプトのように利用することも可能です。

Gradle プラグイン探訪 〜第 1 回 Gradle SSH Plugin 〜

9G*Magazine vol.8

plugins {id 'org.hidetake.ssh' version '0.4.5'

合は、remotes ブロックの内容を適宜修正してください。
）
vagrant up}./gradlew showPlatformVersion

remotes {実行結果は以下のようになります。

targethost {host = '192.168.33.10'
user = 'vagrant'
identity = file("${System.properties['user.
home']}/.vagrant.d/insecure_private_key")}$ ./gradlew showPlatformVersion:showPlatformVersion
Linux precise32 3.2.0-23-generic-pae #36-Ubuntu
SMP Tue Apr 10 22:19:09 UTC 2012 i686 i686 i386
GNU/Linux
DISTRIB_ID=Ubuntu}

DISTRIB_RELEASE=12.04

ssh.settings {logging = 'stdout'}

DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04 LTS"BUILD SUCCESSFUL

task showPlatformVersion << {ssh.run {session(remotes.targethost) {execute('uname -a')execute('cat /etc/*-release || true')}}}

Total time: 6.248 secs
このように、簡単にシェルコマンドを実行することができるので、複数のサーバーに対して同じシェルスクリプトを実行する場
合などに威力を発揮します。

シェルコマンドと Groovy の連携

Gradle SSH Plugin の便利なところは、単にシェルコマンドを

task wrapper(type: Wrapper) {gradleVersion = '2.1'}

remotes ブロック実行できるだけでなく、実行結果を Groovy の文字列として受け取って処理することができる点にあります。

前述のサンプルの ssh.run ブロックを以下のように修正して実行してみてください。
ssh.run {ここでは SSH 接続先の情報を定義します。

session(remotes.targethost) {サンプルでは Vagrant で起動したサーバー (192.168.33.10) に対

def uname = execute('uname -a')

して SSH 鍵認証でログインする設定をしています。

assert uname.contains('precise64')

複数のサーバーに対する定義を列挙することも可能です。

execute('cat /etc/*-release || true')}ssh.settings ブロック

ここでは SSH Plugin 全体の設定を行います。

サンプルではログ出力先を標準出力 ( および標準エラー出力 )に設定しています。

ssh.run ブロック

リモートサーバーに対する操作を定義します。

サンプルでは、remotes.targethost で定義したサーバーに SSH

接続し、execute() で uname コマンドおよび cat コマンドを実行しています。

サンプル実行

以下のコマンドでサンプルを実行します。(Vagrant を利用しま

すので、別途導入しておいてください。Vagrant を利用しない場

10 Gradle プラグイン探訪 〜第 1 回 Gradle SSH Plugin 〜}
実行結果は以下のようになります。

G*Magazine vol.8:showPlatformVersion FAILEDFAILURE: Build failed with an exception.

リモートホストおよび接続定義

remotes ブロックで定義します。remotes.<id> で Remote 型のオブジェクトとして参照可能です。

以下のパラメータを指定できます。
キー* Where:Build file '/Users/nobusue/work/gmag/gradle-ssh-

型

説明

host

String( 必須 )ホスト名 or IP アド
レス

port

Integer

ポート番号 ( デフォ
ルト 22)

gateway

RemoteSSH ポートフォ
ワードを行う

proxy

Proxy

SOCKS/HTTP プロ
キシを指定

user

String( 必須 )ユーザー名

password

Stringパスワード

identityFile

秘密鍵ファイル'uname -a' の結果に 'precise64' が含まれていないため、assert

passphrase

String

秘密鍵のパスフレーズ

これは非常に単純な例ですが、例えばシェルコマンドの実行結

agent

BooleanPutty or ssh-agent
を利用

knownHosts

Fileknown hosts
ファイル ( デフォルト ~/.ssh/
known_hosts)
allowAnyHosts 設
定時はチェックを無効化

retryCount

Integer

接続リトライ回数( デフォルトはリト
ライなし )

retryWaitSec

Integer

リトライ間隔 ( 秒
数、デフォルト 0)

plugin-template/build.gradle' line: 21* What went wrong:
Execution failed for task ':showPlatformVersion'.
> assert uname.contains('precise64')
|

|

|

false

Linux precise32 3.2.0-23-generic-pae#36-Ubuntu SMP Tue Apr 10 22:19:09 UTC 2012 i686
i686 i386 GNU/Linuxが失敗して例外が発生しています。

果を Groovy で解析して、その結果を次のシェルコマンドの入力として渡すことも可能です。うまく使いこなすと、非常に高度な処理を自動化することができます。

Gradle SSH Plugin の機能
Gradle SSH Plugin は多くの機能を提供しているため、ここでは特に利用頻度が高いと思われるものについてまとめます。

詳細についてはユーザーガイドを参照するとよいでしょう。

また、SSH DSL の利用方法については acceptance-test のコードも参考になります。

プロキシ定義proxies ブロックで定義します。proxies.<id> で Proxy 型のオブジェクトとして参照可能です。SOCKS および HTTP に対応しています。

以下のパラメータを指定できます。
キー

型

説明

host

String( 必須 )ホスト名 or IP アド
レス

port

Integer( 必須 )

ポート番号

type

ProxyType( 必須 )プロキシのタイプ(SOCKS or HTTP)

user

String

ユーザー名

password

Stringパスワード

socksVersion

Integer

SOCKS バージョン(4 or 5, デフォルト
5)

Gradle プラグイン探訪 〜第 1 回 Gradle SSH Plugin 〜11

G*Magazine vol.8
ロール定義

role() でリモートサーバーを役割ごとにグループ化できます。

task sshTask << {ssh.run {各 Remote に対してロールは複数指定可能です。

session(remotes.server1) {// do operations for server1

ssh.remotes {}server1 {session(remotes.server2) {role('web')// do operations for server2

role('all')}host = 'x.x.x.x'}

user = 'root'}}
server2 {role('web')role('all')host = 'y.y.y.y'user = 'root'

複数のサーバーに同じオペレーションを行う場合は、sesssionの引数に Remote オブジェクトの配列を渡します。
task sshTask << {ssh.run {}server2 {role('db')

session( [remotes.server1, remotes.server2]){// do common operationsrole('all')}host = 'z.z.z.z'
user = 'root'}}}
この場合、オペレーションは server1 と server2 に対して並列実}ロールを定義しておくと、remotes.role() でリモートサーバーをまとめて指定できます。
ssh.run {行されるわけではなく、指定した順にシーケンシャルに行われることに注意してください。

オペレーションとして利用可能なものは以下の通りです。

session(remotes.role('web')) {// operations for web}
session(remotes.role('web','db')) {// operations for web and db}
session(remotes.role('all')) {// operations for all}}

オペレーション実行

ssh.run ブロックで SSH 接続およびオペレーションの実行を定義します。

SSH 接続ごとに session ブロックを定義し、内部でオペレーションを記述します。

12 Gradle プラグイン探訪 〜第 1 回 Gradle SSH Plugin 〜

オペレーション

動作

executeコマンドを実行します

executeBackground

バックグラウンドでコマンドを実行します

executeSudo'sudo -S -p' を指定してコマンドを実
行します

shell

シェルによる対話処理を実行します

put

リモートサーバーにファイル / ディ
レクトリを送信します

get

リモートサーバーからファイル /ディレクトリを取得します

execute() によるコマンド実行は、コマンド終了までブロックされます。また、コマンドが 0 以外のリターンコードを返した場
合には例外が発生します。

コマンドの実行結果は変数もしくはクロージャで受け取ることができます。具体的には以下のようにします。

G*Magazine vol.8

def hostname = execute 'hostname -f'$ curl -L -O https://github.com/int128/groovy-

println hostname

ssh/releases/download/v0.1.7/groovy-ssh-0.1.7all.jar

execute('hostname -f') { result -> println result$ java -jar groovy-ssh-0.1.7-all.jar sshTasks.

}

groovyまた、オペレーション実行時には以下のパラメータを指定でき

Groovy SSH で SSH DSL を実行する場合にはコンテキストの指ます。

定が必要です。以下のように "ssh." を記述するようにしてくださキー

dryRunpty

型
BooleanBoolean

説明
ドライランを有効にします ( デフォル
ト false)String

ログ出力先を指定します ( デフォルト
slf4j)

outputStream

OutputStream

コマンドの標準出力のリダイレクト
先を指定しますencoding

interaction

extensions

OutputStream

StringClosureList of classes

ssh.remotes {server {host = 'x.x.x.x'

PTY( 擬似端末 ) を有効にします ( デフォ
ルト false)

logging

errorStream

い。

コマンドの標準エラー出力のリダイ
レクト先を指定します
入出力エンコーディングを指定します ( デフォルト
UTF-8)
対話処理のためのクロージャを指定します
ミックスインする
拡張モジュールのクラスを指定しますuser = 'someone'
identity = new File('~/.ssh/id_dsa')}}
ssh.settings {logging = 'stdout'}
ssh.run {session(ssh.remotes.server1) {execute 'hostname -f'}}

まとめ
Gradle SSH Plugin/Groovy SSH ライブラリは Gradle による作業の自動化だけでなく、シェルスクリプトの高機能な代替物としてGroovy を利用可能にする、可能性を秘めたプロダクトです。

ドキュメントが英語のみということもあってか、なぜか日本よりも海外で人気があるようですが、この機会にぜひ試してみてく
ださい。

対話処理

オペレーションの実行結果に対してパターンマッチングを行う

ことで、対話的な処理を実現できます。expect コマンドと類似の処理が可能です。

詳細についてはユーザーガイドを参照してください。

Groovy SSH ライブラリ利用時の注意事項
Groovy SSH ライブラリは Gradle に依存しておらず、単体で利用することができます。

使い方は簡単で、Groovy SSH の JAR ファイルをダウンロード

し、java -jar で実行するだけです。

Gradle プラグイン探訪 〜第 1 回 Gradle SSH Plugin 〜13

G*Magazine vol.8

Grails Plugin 探訪
第9回~ CodeNarc プラグイン ~URL: http://grails.org/plugin/codenarc
プラグインのバージョン : 0.22

対応する Grails のバージョン : 1.3 以上

杉浦孝博
最近は Grails を使用したシステムの保守をしている自称プログラマ。
日本 Grails/Groovy ユーザーグループ事務局長。

共著『Grails 徹底入門』、共訳『Groovy イン・アクション』

はじめに

plugins {....

今回ご紹介する Grails プラグインは、CodeNarc プラグインです。

本記事は、次の環境で動作確認をしております。

• OS : Windows 7 SP1, Mac OS X 10.9.5• Java : 1.8.0_25• Grails : 2.4.4

果を省略しており、実際の出力と異なる場合があります。ご了承願います。

$ grails codenarc
デフォルトでは、分析結果は target/CodeNarcReport.html とい

CodeNarc プラグインとはCodeNarc プラグインは、Groovy のソースコードに対して静的

コード分析を行うための機能を提供するプラグインです。

既存のツールである CodeNarc を使用し静的コード分析を行います。

うレポートファイルに出力されます。

サンプルコードで静的コード分析
実際に試してみましょう。

サンプルプロジェクトの作成

なお、CodeNarc については、Vol.1 から Vol.3 まで連載がありますので、そちらも参照してください。

プラグインのインストール
CodeNarc プラグインのインストールは、Grails のバージョン

が 1.x の場合、次のコマンドを入力してインストールします。
$ grails install-plugin codenarc

Grails のバージョンが 2.x の場合、BuildConfig.groovy の pluginsに「compile ':codenarc:0.22'」を追加します。

Grails Plugin 探訪

静的コード分析の実行
静的コード分析は、次のコマンドを実行します。

なお、コマンドの実行結果については、紙面の都合上、出力結

14compile ':codenarc:0.22'}

第 9 回 ~ CodeNarc プラグイン ~サンプルのプロジェクトを作成します。
$ grails create-app testcodenarc

サンプルのドメインクラスの作成

次にサンプルのドメインクラスを作成します。今回もいつもの様に、本 (Book) のドメインクラスとします。
$ cd testcodenarc$ grails create-domain-class Book

Book ドメインクラスのコードは次のとおりです。

G*Magazine vol.8

package testcodenarc
class Book {String title
int price
String isbn13
static constraints = {title blank: false
price min: 0
isbn13 blank: true}}

コントローラ、ビューの生成

ドメインクラスから、コントローラとビューを自動生成します。
$ grails generate-all testcodenarc.Book

静的コード分析の実行自動生成したコードも含め、静的コード分析を実行します。
$ grails codenarc...
..Running CodeNarc (rulesets/basic.xml,rulesets/

ご覧のとおり、自作したドメインクラス、自動生成されたコントローラももちろんですが、テストコードも Groovy コードです
ので、分析の対象となっているのがわかります。

exceptions.xml,
rulesets/imports.xml,rulesets/grails.
xml,rulesets/unused.xml) ...
.CodeNarc finished; report(s) generated: [target/
CodeNarcReport.html]

静的コード分析結果の参照

出力されたファイル target/CodeNarcReport.html を Web ブラ

ウザで開きます。

Grails Plugin 探訪

第 9 回 ~ CodeNarc プラグイン ~15

G*Magazine vol.8

CodeNarc プラグインの設定

codenarc.reports = {MyXmlReport('xml') {CodeNarc プラグインは、デフォルトの設定でも十分使えます

outputFile = 'target/CodeNarc-Report.xml'

が、場合によっては設定を変更したい場合があると思います。そtitle = 'Sample Report by XML'のような場合は、BuildConfig.groovy に「codenarc.」で始まるプ}

ロパティに設定を記述します。

MyHtmlReport('html') {変更できる内容は次のとおりです。

outputFile = 'target/CodeNarc-Report.

• レポートの形式やファイルパスなど

html'• CodeNarc ルールセット

title = 'Sample Report by HTML'• 分析対象のソースコード}• CodeNarc のルールのプロパティ

MyTextReport('text') {• ルール違反数の上限

outputFile = 'target/CodeNarc-Report.
text'
title = 'Sample Report by Text'

レポートの設定

レ ポ ー ト は、 デ フ ォ ル ト で は HTML 形 式 で target/

CodeNarcReport.html ファイルに出力されます。

分析結果のレポートについては、形式やファイルのパス、タイ

トルを変更することができます。

レポート形式については、HTML 形式以外に、XML 形式とテキスト形式もサポートしています。

レポートは、1 つだけでなく、複数指定することができます。

}}

CodeNarc ルールセットファイルの設定

CodeNarc のルールセットファイルは、デフォルトでは次のファイルが使用されます。
• rulesets/basic.xml• rulesets/exceptions.xml

設定の仕方は、• rulesets/imports.xml• rulesets/grails.xml

codenarc.reports = {
レポート名 ( レポート形式 ) {outputFile = レポートのファイルパス
title = レポートのタイトル• rulesets/unused.xml
CodeNarc のルールセットファイルの設定を変更したい場合、BuildConfig.groovy に「codenarc.ruleSetFiles」プロパティを記述

}

します。

...
}
と、
クロージャで設定します。レポート名は任意の名前、レポー

ト形式は次の表のとおり、ファイルパスは相対パスの場合、アプ
リケーションのルートディレクトリからのパスとなります。
形式

値

HTML

'html'

XML

'xml'

テキスト

'text'

任意の出力

CodeNarc の ReportWriter イン
タフェースを実装したクラスの完全修飾クラス名

例を見てみましょう。次のとおり設定を記述すれば、target ディ

レクトリに 3 つのレポートファイルが作成されることになります。

16 Grails Plugin 探訪 第 9 回 ~ CodeNarc プラグイン ~codenarc.ruleSetFiles プロパティに指定するファイルは、クラスパスから参照できる必要があります。ファイルシステム上のファイルをし指定した場合、次のように「file:」を先頭に付加します。

codenarc.ruleSetFiles="file:grails-app/conf/
MyRuleSet.groovy"codenarc.ruleSetFiles プロパティに複数ファイルを指定したい

場合、カンマ (,) で区切って 1 つの文字列で指定するか、リスト形
式で複数の文字列で指定します。

G*Magazine vol.8
codenarc.extraIncludeDirs プロパティで任意のディレクトリを

codenarc.ruleSetFiles="rulesets/basic.

対象にした場合、リスト形式で指定します。例えば、grails-app/

xml,rulesets/exceptions.xml," +jobs ディレクトリを指定したい場合、次のように指定します。

rulesets/imports.xml,rulesets/grails.

codenarc.extraIncludeDirs=['grails-app/jobs']

xml,rulesets/unused.xml"
codenarc.ruleSetFiles=[CodeNarc のルールのプロパティ"rulesets/basic.xml",

CodeNarc の各ルールはいくつかプロパティを持っており、"rulesets/exceptions.xml",

BuildConfig.groovy 中に codenarc.properties プロパティを記述し"rulesets/imports.xml",て、ルールのプロパティ値を変更することができます。

"rulesets/grails.xml",

形式は次のとおりです。

"rulesets/unused.xml"]

ルール名 . プロパティ名 = プロパティ値
例えば、ドメインクラスが equals メソッド、toString メソッ

分析対象のソースコード

分析対象のソースコードは、デフォルトでは、分析対象となるGroovy コードは次のディレクトリ配下の Groovy ファイルが対象となります。

ド を 持 つ こ と を 示 す ル ー ル、GrailsDomainHasEquals ルー ル とGrailsDomainHasToString ルールを無効にしたい場合は、次のように指定します。

codenarc.properties = {• src/groovy

GrailsDomainHasEquals.enabled = false• grails-app/controllers

GrailsDomainHasToString.enabled = false• grails-app/domain}• grails-app/services

また、CodeNarc のルールのプロパティを別ファイルですでに• grails-app/taglib• grails-app/utils

持っている場合、そのファイルパスを BuildConfig.groovy 中の• test/integrationを実現できます。

codenarc.propertiesFile プロパティに記述することで同等のこと• test/unit

先程の例は、次と同等です。

分析対象のソースコードを変更したい場合、次の表に示すプロ

パティを BuildConfig に記述します。プロパティの値として trueを指定した場合は指定したディレクトリ配下の Groovy ファイルが分析対象となり、false を指定した場合は分析対象とはなりません。

// grails-app/conf/BuildConfig.groovycodenarc.propertiesFile = 'grails-app/conf/
codenarc.properties'// grails-app/conf/codenarc.properties

プロパティ名

対象ディレクトリ

デフォルト値

GrailsDomainHasEquals.enabled = false
GrailsDomainHasToString.enabled = false

codenarc.processSrcGroovy

src/groovytrue

codenarc.processControllers

grails-app/
controllers

true

codenarc.processDomain

grails-app/domaintrue

codenarc.processServices

grails-app/servicestrue

codenarc.processTaglib

grails-app/
taglibtrue

codenarc.processTestUnit

test/unit

true

codenarc.processTestIntegration

test/integration

true

FAILED -- Exceeded maximum number of priority 2codenarc.processViews

grails-app/
views

false

violations: (p1=0; p2=11; p3=3)

codenarc.extraIncludeDirs

任意のディレクトリ—

ルール違反数の上限

CodeNarc のルールにはプライオリティが設定されており、プ

ライオリティ毎に違反数の上限を設定することができます。デフォルトは、Integer.MAX_VALUE です。上限を越えた場合、次のメッセージが標準出力に出力され、静的コード分析が失敗となります。ただし、静的コード分析は最後まで実行され、レポートファイルも出力されるようです。

違反数の上限を設定する場合、BuildConfig.groovy に次のように設定します。

Grails Plugin 探訪

第 9 回 ~ CodeNarc プラグイン ~17

G*Magazine vol.8// プライオリティ 1 の違反数の上限
codenarc.maxPriority1Violations=10// プライオリティ 2 の違反数の上限
codenarc.maxPriority2Violations=20// プライオリティ 3 の違反数の上限
codenarc.maxPriority3Violations=30

ルール違反数の上限超過時の動作

ルール違反数の上限を超過した場合、デフォルトでは、先程の失敗メッセージを標準出力に出力し、System.exit(1) を呼び出して終了します。この動作を変更し、例外をスローして終了することもできます。

BuildConfig.groovy で codenarc.systemExitOnBuildException プ

ロパティを指定することで、動作を変更することができます。プ
ロパティ値として true を指定した場合、デフォルトの動作と同様、失敗メッセージを標準出力に出力し、System.exit(1) を呼び出して終了します。プロパティ値として false を指定した場合、例外をスローして終了します。

codenarc.systemExitOnBuildException = false

おわりに
今回は静的コード分析を行うプラグインをご紹介いたしました。Groovy コードの静的コード分析ツールとして定評のある
CodeNarc を使用していますので、一度お試ししてはいかがでしょうか。

18 Grails Plugin 探訪 第 9 回 ~ CodeNarc プラグイン ~18

G*Magazine vol.8

リリース情報 2014.11.29
GrailsGrails は、Groovy や Hibernate などをベースとしたフルスタックの Web アプリケーションフレームワークです。
URL: http://grails.org/
バージョン : 1.3.9, 2.1.5, 2.2.5, 2.3.11,2.4.4■更新情報• 2.2.5 では、ユーザガイドの "withFormat" セクションに"form"mime-type についての記述が追加されたり、いくつかバグ対応が行われています。
• 2.2.5 リリースノート : https://grails.org/2.2.5+Release+Notes• 山本さんのブログ : http://d.hatena.ne.jp/
mottsnite/20140304/1393946239• 2.3.11 では、いくつかバグ対応が行われています。
• 2.3.11 リリースノート : https://grails.
org/2.3.11+Release+Notes• 山本さんのブログ : http://d.hatena.ne.jp/
mottsnite/20140626/1403777424• 2.4.4 では、@DirtiesRuntime アノテーションが追加されたり、ユニットテストでの forwardedUrl の値が変更になったり、いくつかバグ対応が行われています。
• 2.4.4 リリースノート : https://grails.org/2.4.4+Release+Notes• 山本さんのブログ : http://d.hatena.ne.jp/
mottsnite/20141028/1414514707

Gant
Gant は、XML の代わりに Groovy で Ant タスクを記述し実行する
ビルド管理ツールです。
URL: http://gant.codehaus.org/
バージョン : 1.9.11■更新情報• 1.9.11 での更新内容は不明です。

GMavenGMaven は、Maven 用の Groovy プラグインです。
URL: 1.x http://gmaven.codehaus.org/], 2.x [http://groovy.github.
io/gmaven/
バージョン : 1.4, 2.0

GradleGradle は、Groovy でビルドスクリプトを記述し実行するビルド管理ツールです。
URL: http://www.gradle.org/
バージョン : 2.2.1■更新情報• 2.2.1 では、OS X と Java 7 の組み合わせでオフライン時にGradle デーモンが起動しない問題に対応しました。
• 2.2.1 リリースノート : http://www.gradle.org/docs/2.2.1/
release-notes

GroovyGaelykGroovy は、JavaVM 上で動作する動的言語です。
URL: http://groovy.codehaus.org/
バージョン : 1.8.9, 2.0.8, 2.1.9, 2.2.2, 2.3.8, 2.4.0-beta-4

Gaelyk は、Groovy で記述する Google App Engine for Java 用のライトウェイトなフレームワークです。
URL: http://gaelyk.appspot.com/
バージョン : 2.1.2■更新情報• 2.2.2 では、@Delegate を使用した際スタックトレースに行
番号が出力されるようになったり、いくつかバグ対応が行われています。
• 2.2.2 リリースノート :https://jira.codehaus.org/secure/
ReleaseNote.jspa?projectId=10242&version=19832• 2.3.8 では、BigInteger.power(Biginteger) メソッドが追加されたり、いくつかバグ対応が行われています。
• 2.3.8 リリースノート : http://jira.codehaus.org/secure/
ReleaseNote.jspa?projectId=10242&version=20648• 2.4.0-beta-4 では、JSON ビルダーの実装が書きなおされたり、trait 用に @SelfType アノテーションが追加されたり、いくつかバグ対応が行われています。
• 2.4.0-beta-4リリースノート : http://jira.codehaus.org/secure/
ReleaseNote.jspa?projectId=10242&version=20612

Griffon
Griffon は、デスクトップアプリケーションを開発するためのア
プリケーションフレームワークです。
URL: 1.x http://griffon.codehaus.org/], 2.x [http://new.griffonframework.org/index.html
バージョン : 1.5.0, 2.0.0■更新情報• 1.5.0 では、Groovy のバージョンが 2.2.1 に、Spring のライブ
ラリのバージョンが 3.2.7 にそれぞれ変更されています。
• 1.5.0 リリースノート : http://docs.codehaus.org/display/
GRIFFON/Griffon+1.5.0• 2.0.0 では、依存するプラグインが最新のバージョンにアップグレードされています。
• 2.0.0 リリースノート : http://new.griffon-framework.org/
news/griffon_2.0.0.html■更新情報• 2.1.2 では、Groovy 2.3 に対応し、いくつかバグ対応が行われています。
• 2.1.2 リリースノート : http://gaelyk.appspot.com/download

Google App Engine SDK for Java
Google App Engine SDK for Java は、Java で Google App Engine
用の Web アプリケーションを開発するための SDK です。
URL: https://cloud.google.com/appengine/バージョン : 1.9.15■更新情報• 1.9.15 では、Datastore の統計情報にエンティティのカウン
トが表示されないバグ対応が行われています。
• 1.9.15 リリースノート : https://code.google.com/p/
googleappengine/wiki/SdkForJavaReleaseNotes

GPars
GPars は、Groovy に直感的で安全な並行処理を提供するシステム
です。
URL: http://gpars.codehaus.org/
バージョン : 1.2.1GA■更新情報• 1.2.1GA での更新内容は不明です。

Groovy++Groovy++ は、Groovy 言語に対して静的な機能を拡張します。
URL: http://code.google.com/p/groovypptest/
バージョン : 0.9.0
リリース情報19

G*Magazine vol.8

Spock
Spock は、Java や Groovy 用のテストと仕様のためのフレームワー
クです。
URL: http://code.google.com/p/spock/バージョン : 0.7

GroovyServ
GroovyServ は、Groovy 処理系をサーバとして動作させることでgroovy コマンドの起動を見た目上高速化するものです。
URL: http://kobo.github.com/groovyserv/
バージョン : 1.0.0■更新情報• 1.0.0 では、ログファイルや authtoken ファイルのパスを
GROOVYSERV_WORK_DIR や GROOVYSERV_LOG_DIR 環境変数で明示することができたり、パッケージ名が変更になったり、バグ対応が行われています。
• 1.0.0 チェンジログ : http://kobo.github.io/groovyserv/
changelog.html

Geb
Geb は、Groovy を使用した Web ブラウザを自動化する仕組みです。
URL: http://www.gebish.org/
バージョン : 0.10.0■更新情報• 0.10.0 では、要素の CSS プロパティにアクセスするために
Navigator に css() が追加されたり、いくつかバグ対応が行われています。
• 0.10.0 リリースノート : http://www.gebish.org/manual/
current/project.html#0100

Easyb
Easyb は、 ビ ヘ イ ビ ア 駆 動 開 発 (Behavior Driven
Development:BDD) 用のフレームワークです。
URL: http://www.easyb.org/
バージョン : 1.5

Gmock
Gmock は、Groovy 用のモック・フレームワークです。
URL: http://code.google.com/p/gmock/バージョン : 0.8.3

HTTPBuilder
HTTPBuilder は、HTTP ベースのリソースに簡単にアクセスするための方法です。
URL: http://groovy.codehaus.org/modules/http-builder/バージョン : 0.7.2■更新情報• 0.7.2 での更新内容は不明です。

CodeNarc
CodeNarc は、Groovy 向けの静的コード解析ツールです。
URL: http://codenarc.sourceforge.net/
バージョン : 0.22
■更新情報

• 0.22 では、新しく 4 つのルールや IDE のテキストレポートタ

20 リリース情報

イプが追加され、いくつかバグ対応が行われています。
• 0.22 リリースアナウンス : http://groovy.329449.n5.nabble.
com/ANN-Announcing-CodeNarc-0-22-td5721472.html

GMetrics
GMetrics は、Groovy ソースコードのサイズや複雑さを計算したり報告するためのツールです。
URL: http://gmetrics.sourceforge.net/
バージョン : 0.6

GContracts
GContracts は、Groovy で契約プログラミングを行うためのフレームワークです。
URL: http://gcontracts.org/
バージョン : 1.2.12

GroovyFX
GroovyFX は、JavaFX を Groovy で書きやすくするためのフレームワークです。
URL: http://groovyfx.org/
バージョン : 0.4.0■更新情報• 0.4.0 では、ビルダーに catch-all ビーン・ノードが追加されたり、TableView や ComboBox のバグ対応が行われています。
• 0.4.0 リリースノート : http://jira.codehaus.org/browse/GFX/
fixforversion/19127

GBenchGBench は、Groovy のためのベンチマーク・フレームワークです。
URL: http://code.google.com/p/gbench/
バージョン : 0.4.2■更新情報• 0.4.2 では、新しいシステムプロパティをサポートしたり、いくつかバグ対応が行われています。
• 0.4.2 リリースノート : https://code.google.com/p/gbench/
wiki/ReleaseNotes042

Betamax
Betamax は、HTTP 通信の内容を保存し再生するテストツールです。
URL: http://freeside.co/betamax/
バージョン : 1.1.2

Caelyf
Caelyf は、Groovy で記述する Cloud Foundry 用のライトウェイト
なツールキットです。
URL: http://caelyf.net/
バージョン : 1.3.1■更新情報• 1.3.1 では、Groovy 2.3.7、Gradle 2.1 に対応し、GPars 1.2.1を同梱しました。
• 1.3.1 リリースメッセージ : https://groups.google.com/
forum/#!msg/caelyf/UW3XNI-jdjo/OwNxJCU9-sEJ

Vert.xVert.x は、非同期アプリケーション開発のためのフレームワーク

G*Magazine vol.8
です。
URL: http://vertx.io/
バージョン : 2.1.5■更新情報• 2.1.5 では、Groovy 言語モジュールが 2.1.1 にアップグレー
ドされたり、SSLv2Hello プロトコルがサポートされたり、いくつかバグ対応が行われています。
• 2.1.5 リリースメッセージ : https://groups.google.com/
forum/#!topic/vertx/x7Dlhkc8tuA

GVM (Groovy enVironment Manager)
GVM は、様々な Groovy 関連のツールをインストールし、複数のバージョンを切り替えて使用するためのツールです。
URL: http://gvmtool.net/
バージョン : -GaidenGaiden は、Markdown でドキュメントを作成するするためのツールです。
URL: https://github.com/kobo/gaiden/
バージョン : 1.0▼ぐるーびーたん

第 6 話までのあらすじ

プログラマを目指して熊本から上京したぐるーびー

たん。その若さ故、色々飛びつくのは良いこと !?

※この作品は、たいがいフィクションです。実在の人物、団体とは関係ありません。

21

■企業スポンサー

個人サポータ制度のお知らせ
JGGUG では , 昨年に引き続き 2015 年度も個人サポータを募集いたします。.
個人サポータとなっていただいた方には、一年間にわたって JGGUG が発行する G* Magazine（年数回刊。基本的に電子版として配布予定）に個人サポータとしてお名前を掲載します（掲載を希望しない旨お申し出いただけば掲載しません）。
個人サポータとなるには、まず supporters@jggug.org にメイルで• お名前• 予定金額G* Magazine へのご芳名掲載の可否をお知らせください。追って、運営委員より振込先の情報などを返信します。
皆様のサポートをお待ちしております。

日本 Grails/Groovy ユーザーグループ
代表

山田 正樹

G* Magazine vol.8 2015.2
http://www.jggug.org

発行人：日本 Grails/Groovy ユーザーグループ
編集長：川原正隆
編集：G* Magazine 編集委員（杉浦孝博、奥清隆）
デザイン：㈱ニューキャスト
表紙：川原正隆
編集協力：JGGUG 運営委員会
Mail：info@jggug.org© 2015 JGGUG 掲載記事の再利用についてはCreative Commons ライセンスによります。

Publisher：Japan Grails/Groovy User Group
Editor in Chief：Masataka Kawahara
Editors：G* Magazine Editors Team
(Takahiro Sugiura, Kiyotaka Oku)
Design：NEWCAST inc.
CoverDesign：Masataka Kawahara
Cooperation：JGGUG Steering Committee
Mail：info@jggug.org