倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

Groovy

Groovy でグループを使った正規表現マッチを試す

なんとなく今まで正規表現を回避してたんだけど、定型文字列を String のメソッドだけで解析するの面倒すぎるので、Groovy パワーであれこれ試してみました。 Groovy 使うと、グループを使った正規表現でマッチしたグループの内容を List の要素アクセスのよ…

Windows 厨でも gvm したい ~Cygwin 編~

別に Windows 厨というほど使い倒してるワケではないんですが、Windows でも GVM (Groovy enVironment Manager →) を使いたいなぁと思って試してみました。 GVM は Groovy 関連のツールを簡単にダウンロード & インストールできるツールです。 Groovy をはじ…

Spock ことはじめ ~without IDE 編~

Java/Groovy のテスティング・フレームワーク Spock の使い方をあれこれ調べてみました。 まぁ、Gradle 使えるならそれに越したことはないですが、なんとなく Maven3 やコマンドラインからの使用方法も試してみました。どうも Maven3 から GMaven が Groovy …

GDK に Java8 で導入された日時 API の拡張が追加されてたので試してみた

Java8 の目玉機能はラムダ式ですが、その次によく取り上げられるのが新しい日時 API である Date and Time API(JSR-310) でしょう。 ただ、この API はナカナカに取っつきにくいという非難の声が。 まぁ、日時の扱い自体が面倒なので仕方がないという擁護の…

List 風の getAt() を更にしつこくやるよ

前回、GDK が List インターフェースに追加している getAt() メソッドの挙動をちょっと詳しく見てみました。 今回は、もしそれを実装するとどんなコードになるかを見ていきます。 実装に興味ない方はスルーよろしく。 あと、実際の GDK のソースコードは参照…

List の getAt() をしつこくやるよ

最近 GDK が List に追加しているメソッドをあれこれ試しているんですが、Java の配列のように要素を取得できる [] 演算子、すなわち getAt() メソッドにいろいろなインデックスを渡したときの挙動がいまいちシックリこないので、もう少しあれこれ試してみま…

GDK のList がこんなに可愛いわけがない。 (List 編3) シーケンス

今回は GDK が List に追加しているメソッドのうち、関数型言語にある型、シーケンスに関するメソッドを見ていきます。 シーケンスは順序づけられたオブジェクトの列といったイメージで、要素列の走査は1度しか行われない気持ちです*1。 Groovy にはシーケン…

GDK が List に追加している getAt() と putAt() に指定できるインデックス範囲についての絞殺

『GDK の List がこんなに可愛いわけがない。』の List 編1、List 編2で、GDK が List インターフェースに追加しているメソッド getAt(), putAt() を見てきました。 そのときに API を見たりサンプルコードを書いたりしていて思ったのですが、インデックスを…

GDK のList がこんなに可愛いわけがない。 (List 編2) 要素の追加・削除

今回は GDK が List インターフェースに追加しているメソッドのうち、要素の追加・削除に関連するメソッド。 前回見た要素の取得に関するメソッド getAt() と対になっている putAt() メソッドなどを見ていきます。 今回見ていくメソッド: boolean addAll(in…

GDK のList がこんなに可愛いわけがない。 (List 編1) 要素の取得

前回までで GDK が Object クラスや Collection クラスに追加しているメソッドを見てきました。 ただ、普段よく使う型はこれらというより今回から見ていく List でしょう。 Object や Collection に追加されていたメソッドのサンプルを書いているときも、基…

GDK のコレクションがこんなに便利なわけがない。 (Collection 編8) 型変換

今回は GDK が Collection インターフェースに追加するクラスのうち、型変換をするものを見ていきます。 今回でやっと Collection 最後かな。 ただ、まだ List をやらんといかんのだが。 型変換は便利だけどあんまり面白くないんでサラッといっちゃいましょ…

GDK のコレクションがこんなに便利なわけがない。 (Collection 編7) 多重コレクション

今回は GDK が Collection インターフェースに追加している多重コレクション(多次元コレクション)に関連するメソッドを見ていきます。 今回扱うのは以下のメソッド: Collection flatten() Collection flatten(Closure flattenUsing) Collection split(Clo…

GDK のコレクションがこんなに便利なわけがない。 (Collection 編6) Reduce 処理

今回は GDK が Collection インターフェースに追加しているメソッドの内、Reduce 処理を行うものを見ていきます。 Reduce 処理とは各要素もしくはそれから得た値などをある意味で「足し上げる」メソッドです。 今回扱うメソッドはは以下のもの: Number coun…

GDK のコレクションがこんなに便利なわけがない。 (Collection 編5) その他の集合生成

今回は GDK が Collection クラスに追加している、いろいろなコレクションを生成するメソッドを見ていきます。 「コレクションを生成する」と言っても、(static) ファクトリ・メソッドを集めて見ていくというわけではなく、メソッドの返り値がコレクションな…

GDK のコレクションがこんなに便利なわけがない。 (Collection 編4) 要素の蒐集 collect

今回は GDK が Collection クラスに追加しているメソッドの内、要素の蒐集を行うメソッドを見ていきます。 メソッド名は「collect」で始まるもの。 要素の蒐集とは、引数としてとったクロージャを各要素に適用し、その結果返される要素を集めて新たなコレク…

GDK のコレクションがこんなに便利なわけがない。 (Collection 編3) 要素の検索 find

今回は GDK が Collection クラスに追加しているメソッドの内、要素を検索するメソッドを見ていきます。 メソッド名でいうと「find」で始まるメソッドです。 これらは GDK が Object クラスに追加しているメソッドを見ていたシリーズ「あんたに GDK の何が分…

GDK のコレクションがこんなに便利なわけがない。 (Collection 編2) 要素の追加・削除

今回は GDK が Collection クラスに追加している要素の追加・削除に関連するメソッド。 要素の追加・削除は Java の標準 API にもあれこれありますが、GDK が追加しているのは Groovy の演算子に対応するもの(plus(), leftShift())、可変長引数(配列 Obje…

GDK のコレクションがこんなに便利なわけがない。 (Collection 編1) 集合演算、文字列関連

さて、今回から GDK が Collection に追加しているメソッドを見ていきます。 Object クラスに追加されているメソッドも、オーバライドされているものはまた扱います。目次 集合演算 文字列関連 要素の追加・削除 要素の検索 findXxxx() 要素の蒐集 collectXx…

Groovy ノミックス (Class 編)

今回は Collection に突入しようかと思ってたんですが、前回のメタクラスの流れにのって、GDK が Class クラスに追加しているメソッドを見ていきます。 今回見ていくメソッドは以下の通り: boolean isCase(Object switchValue) // インスタンス生成 Object …

あんたに GDK の何が分かるっていうの!? (Object 編6) メタプログラミング用メソッド

今回は GDK が Object クラスに追加しているメタプログラミング用のメソッド。 Groovy ではメタオブジェクト・プロトコルという方式を使ってオブジェクトの挙動を動的に変更できるので、メタプログラミングを行いたい場合はメタクラスの設定をあれこれ行うこ…

あんたに GDK の何が分かるっていうの!? (Object 編5) デバッグ用メソッド

今回は GDK が Object クラスに追加しているデバッグ用のメソッドを見ていきます。 主に print(), println() のような標準出力へメッセージを書き出すメソッドや、オブジェクトの情報を文字列に変換する toString(), dump(), inspect() などを扱います。 具…

あんたに GDK の何が分かるっていうの!? (Object 編4) コンテナ・メソッド 後編

前回に引き続き、今回も GDK が Object クラスに追加しているコンテナ・メソッドを見てきます。 今回見ていくのは find で始まる名前のメソッド。 結構あれこれあるんですね。 今回見ていくメソッドは以下のもの: Collection findAll(Closure closure) Coll…

あんたに GDK の何が分かるっていうの!? (Object 編3) コンテナ・メソッド 前編

今回は GDK が Object クラスに追加しているコンテナ・メソッド。 ちょっと多かったので前後編に分けます(後編は findXxxx() メソッド)。 コンテナ・メソッドとはコレクションや配列のような、要素を保持する入れ物を指して使っています。 今回扱うメソッ…

あんたに GDK の何が分かるっていうの!? (Object 編2) プロパティ、リフレクション

今回は GDK が Object クラスに追加しているプロパティ、リフレクション関連のメソッド。 (正式な仕様はともかく)Groovy でのプロパティとは getter/setter メソッド*1で値の取得・設定ができるメンバという感じでしょうか。 Groovy ではフィールドを定義…

あんたに GDK の何が分かるっていうの!? (Object 編1)

最近 Java 8 の Stream による Map/Reduce 処理の API をあれこれイジってて、GDK の同様のメソッド群と比べてみようと思い GDK の API 見てたんですが、each() とか collect() とかが Object クラスに定義されてて List や Collection の前に Object クラス…

Groovy JDK? It's GDK! (File 編7) traverse() 再訪

今回は、以前の記事で簡単に見た traverse() メソッドをもう少しきちんと見て行きます(目次)。参考 URL 「Groovy JDK」 File オーバーロードされた3つの traverse()まずは traverse() メソッドのオーバーロードされているシグニチャを見てみましょう: voi…

Groovy JDK? It's GDK! (File 編6) その他のメソッド

さぁ、今回は GDK が File クラスに追加するメソッドのうち、今まで扱ってなかった残りのメソッドを見ていきます(目次)。 残りのメソッドは以下の通り: メソッド 返り値 since ファイル操作 size()renameTo(String newPathName) longboolean 1.5.01.7.4 …

Groovy JDK? It's GDK! (File 編5) データストリーム・オブジェクトストリーム

今回はデータストリームとオブジェクトストリームに関連するメソッド(目次)。 あんまり詳しくないんで、サラッと流しマース。データストリームまずはデータストリームに関連するメソッド。 データストリームとは、Java のプリミティブ型のストリームって感…

Groovy JDK? It's GDK! (File 編4) ファイル・ディレクトリの走査

今回は GDK が java.io.File クラスに追加している、ファイル・ディレクトリの走査に関するメソッドを見ていきます(目次)。 扱うメソッドは下表の通り: メソッド 返り値 since 非再帰 eachFile(Closure c)eachFile(FileType type, Closure c)eachDir(Clos…

Groovy JDK? It's GDK! (File 編3) 行処理

前回に引き続き、今回も GDK が java.io.File に追加している文字列関連のメソッドを見ていきます(目次)。 readLines() メソッドは各行を String オブジェクトとする、List<String> オブジェクトを返す「一括読み込み」メソッドです。 それ以外のメソッドは、Closu</string>…

Groovy JDK? It's GDK! (File 編2) 文字列・文字ストリーム

前回に続き、今回は GDK が java.io.File オブジェクトに追加する文字列・文字ストリーム関連のメソッドを見ていきます(目次)。 前回のバイト配列・バイトストリーム関連のメソッドよりよく使うかと思います。文字はデータ的に見れば「バイト + 文字セット…

Groovy JDK? It's GDK! (File 編1) バイト配列・バイトストリーム

Groovy では GDK の機能によって java.io.File クラスにいろいろメソッドが追加されていて、ファイル入出力が非常に手軽になっています。 その反面、追加されているメソッド数が多いため、どんなメソッドがあるのか把握し切れていない人も多いのではないでし…

() で call() メソッドが呼ばれないこともあるようで。

Closure 型のプロパティを使って class Main{ def closure = { println 'This is closure.' } } def main = new Main() main.closure() とやると普通に実行できて「This is closure.」と表示されます。 Groovy ではオブジェクトに対して () を付けると call(…

Groovy スクリプトを実行するバッチファイル

こちらの記事で、Groovy をインストールしていない環境で Groovy スクリプトを実行する方法が書かれてました。 この方法では、スクリプトの実行に必要な Groovy と Ivy*1 の Jar ファイル自体は実行者に用意してもらう必要がありました。最近、Clojure の勉…

Groovy でのコンストラクタあれこれ

今さらかも知れませんが、Groovy でコンストラクタを実装する方法をあれこれ試してみました。 今回試したのは以下のような方法です: 基本 デフォルト・コンストラクタ 名前付き引数 コンストラクタ定義 アノテーションによる AST 変換 @InheritConstructors…

拡張モジュールを試してみる

以前に、既存のクラスに対してメソッドを追加するメタプログラミングの1つの方法として「マジック・パッケージを試してみる」ってことをやってみました。 この方法では、メタクラスを使う方法に比べて「動的にメソッドを追加する処理を実行する必要がない」…

Clojure のマクロって Groovy で書くとこんな感じじゃないの?

Clojure やっててマクロのあたりの構文クォート、アンクォート、スプライシング・アンクォートあたりが全然分かんなかったので、無理矢理 Groovy っぽく解釈してみました。 サンプルの Groovy コードはかなり力ずくで、(動作はするけど)実際に使えるコード…

Closure クラスの API を使ってみる (7) : メモ化 memoize()

今回はクロージャのメモ化 (memoize)。 カリー化、トランポリン同様、メモ化も関数型言語では大抵実装されている機能ですね。 メモ化すると「キャッシュするバージョンのクロージャ」が生成されます。参考 「クロージャのメモ化」 「Groovy v1.8の新機能をサ…

Closure クラスの API を使ってみる (6) : トランポリン trampoline()

今回はクロージャのトランポリンに関するメソッドを見ていきます。 前回見たカリー化(部分適用)と同じく、トランポリンも関数型プログラミングでは大抵サポートされている機能なようで、それを Groovy に取り入れたって感じのようです。 主な解説は書きの…

Closure クラスの API を使ってみる (5) : カリー化(部分適用?) curry(), rcurry(), ncurry()

今回はカリー化、というか部分適用を行うメソッドを見ていきます。 クロージャのカリー化(部分適用?)とは、あるクロージャに対して予め引数の一部を固定したクロージャを生成する操作です。 拙者は関数型プログラミング初心者なので、カリー化と部分適用…

Closure クラスの API を使ってみる (4) : クロージャの合成 leftShift(), rightShift()

前回までで Groovy 1.7 以前に Closure クラスに定義されていたメソッドは大体使ってみました(幾つか残ってますが)。 1.8から追加されたメソッドは『プログラミングGROOVY』で解説されてるし、ネット上でも記事を見つけられるので、今まで以上に雑な説明で…

Closure クラスの API を使ってみる (3) : 制御構造!? isCase(), directive

今回は Closure クラスに定義されている、制御構造に関するメソッドもしくは制御構造風に使えるメソッドを見ていきます。 今回扱うメソッドと定数は以下の通り: boolean isCase(Object candidate) int getDirective() void setDirective(int directive) sta…

Closure クラスの API を使ってみる (2) : this, owner, and delegate

今回はクロージャを込み入った方法で使う際に意識しておくべき3つのオブジェクト this (thisObject) owner delegate とそれに関するメソッドを見ていきます。 まぁ、この記事読んだところで、結局よぉ分からんってオチになりそうだけど。this, owner, and de…

Closure クラスの API を使ってみる (1) : パラメータ情報 getMaximumNumberOfParameters(), getParameterTypes()

前の記事で Closure オブジェクトを 実行するメソッド call(), run() を見ましたが、それの続編として Closure クラスに定義されている他のメソッドを使ってみます。 今回はパラメータ(引数)に関連するメソッドです。目次 パラメータ情報 getMaximumNumber…

クロージャ実行あれこれ

なんか今更な記事ですが、Groovy の Closure オブジェクトを実行する方法をあれこれと試行。Closure クラスに定義されている実行用のメソッドには以下のようなものがあります: Object call() Object call(Object arg) Object call(Object... args) void run…

Groovy で Initialization On Demand Holder パターン

『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』に載っているデザインパターンを Groovy/GPars で書こうシリーズ、今回は Initialization On Demand Holder パターン。 このパターンは static フィールドの遅延初期化 (lazy initializa…

Groovy で Double-checked Locking パターン

『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』に載っているデザインパターンを Groovy/GPars で書こうシリーズ、今回は Double-checked Locking パターン。 このパターンは、複数のスレッドからアクセスされる可能性のあるフィールド…

Groovy で Active Object パターン

『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』に載っているデザインパターンを Groovy/GPars で書こうシリーズ、今回は Active Object パターン。 これは別名 Actor パターンとも呼ばれるので、GPars の Actor を使っての実装を試み…

Groovy で Thread-Specific Storage パターン

『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』に載っているデザインパターンを Groovy/GPars で書こうシリーズ、今回は Thread-Specific Storage パターン。 このパターンは java.lang.ThreadLocal を使えば実装できます。 あんまり …

Groovy で Two-Phase Termination パターン

『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』に載っているデザインパターンを Groovy/GPars で書こうシリーズ、今回は Two-Phase Termination パターン。 このパターンでは、スレッドを終了したいときにいきなり止めるのではなく、…