uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

groovy

Groovy Stream

Groovy Streamというのがあるようです。「Lazy Generator class for Groovy」とのこと。 http://timyates.github.com/groovy-stream/ http://blog.bloidonia.com/post/22117894718/groovy-stream-a-lazy-generator-class-for-groovy サンプル。 @GrabResolve…

JavaOne 2012 Tokyo/JVM言語BOF

JavaOne Tokyoに参加しています。 表記のBOFにはスピーカーの一人として参加致しました。資料はこちら。 Java One 2012 Tokyo JVM Lang. BOF(Groovy) View more presentations from Junji Uehara 直前の暴風雨で、予定していた懇親会が流れたせいで(?)、慣れ…

"Codeplex" Groovy

ちまたには、複数の実装があってこその成熟した言語、と言う見方もありますが、その意味ではGroovyにも別実装があってもいいのかもしれません。でもあまり聞きませんね。この理由はたとえば「Mavenの別実装」「antの別実装」が無いのと同様に、groovyはツー…

静的で行こう

Groovy 2.0系では、静的型チェック(STC)の実装がぼちぼち進んでいます(参考過去記事,GEP-8 Static Type Checking)。さて、もう早速静的型の悪魔に魂を売り払いたい*1、という諸兄におかれましては、「@TypeChecked」というアノテーションを付けるのももどか…

Groovyじゃんけん作ってみた

JGGUGのイベントではおなじみの「Groovyじゃんけん」を実際に作ってみました。 import static Hands.* enum Hands{ GOO,CHOKI,PAR; public result = [:].withDefault{"$this is even with $this"} } def rule(Hands x) { [defeats:{Hands y-> x.result[y]="$…

Groovyクロージャはいかにしてクロージャであるか?

前回記事「Groovyのクロージャはちゃんとしているか?の続きです。前回検討したGroovyのクロージャの振る舞いは、実際にJavaバイトコードとしてどのように実現されているでしょうか、ってのが今回のテーマです。本来ならここで、 groovycコマンドでコンパイル…

Groovyのクロージャはちゃんとしているか?

先日参加したStartupGroovy #1にて、参加者の方から「Groovyのクロージャはちゃんとしたクロージャか?」という質問がありました*1。 クロージャが「ちゃんとしている」とは何か 「クロージャがちゃんとしてる」とは何を意味するか、あるいは「ちゃんとしたク…

1.8.1以降をキャッチアップするシリーズその5、collectAllのcollectNestedへのリネーム、collectManyの新規追加

Groovy 1.8.1以降で追加されたGDKメソッド(主にコレクション関係)を解説するシリーズ第5段、「collectAllのcollectNestedへのリネーム、collectManyの新規追加」です。とりあえずこれでシリーズ打ち止め予定です。 collect系とfind系の概括的な違い まずは、…

1.8.1以降をキャッチアップするシリーズその4、findResultsの新規追加

Groovy 1.8.1以降で追加されたGDKメソッド(主にコレクション関係)を解説するシリーズ第4段、「findResultsの新規追加」です。 findResultsの新規追加 Groovy 1.8.1では新規GDKメソッドfindResultsが追加されました。findResultsは既存メソッド「findResult」…

1.8.1以降をキャッチアップするシリーズその3、引数無しfind/findAllの新規追加

Groovy 1.8.1以降で追加されたGDKメソッド(主にコレクション関係)を解説するシリーズ第3段、「引数無しfind/findAllの新規追加」です。 引数無しのfind()とfindAll() Groovy 1.8.1では以下の2つのGDKメソッドが追加されています。 public Object find() publ…

1.8.1以降をキャッチアップするシリーズその2、複数クロージャによる多段groupBy

あけましておめでとうございます。書き初めならぬ、エントリ初め。今年もよろしくお願いします。みなさまにとって飛躍の年になりますように。さて、Groovy 1.8.1以降で追加されたGDKメソッド(主にコレクション関係)を解説するシリーズ第2弾、「複数クロージ…

1.8.1以降をキャッチアップするシリーズその1、非破壊的sort/unique

大晦日も押し迫ってきたところで連続エントリを書き始めて年の瀬の区切りを悪くする試みです。本記事から続く一連のエントリでは、Groovy 1.8.1で追加されたGDKメソッド(主にコレクション関係)について解説してみます。書籍「プログラミングGROOVY」を執筆し…

Groovyの疑似デバッガgdb

G* Advent Calendarの22日目の@uehajです。Groovy関係のツール紹介ということで、Groovyの疑似デバッガgdbの紹介。gdbといってもGNUデバッガではありませんよ。gdbの説明や入手はこちら。これは、一般的なデバッガというより、コード上の特定の場所(com.gdb.…

Java Developer Workshop #2にてGroovyについて話すことに

来る12月1日に開催される、日本オラクル株式会社主催の「Java Developer Workshop #2」にてGroovyについて話すこととなりました。わりとGroovy紹介的な内容ですが、Spring One 2GX 2011に参加して(今日が最終日@シカゴ)感じた「熱気」みたいなものが伝えられ…

さらにもう一つの静的Groovy…Grumpyプロジェクト

旧聞に属するのですが、8月の頭ぐらいからGroovy-devのメーリングリストで、Groovyコアコミッターたち(の一部)による「"Grumpy"プロジェクト」なるものが始動していたことが話題になってました。 議論は、プロジェクトリードのGuillaume Laforge氏の休暇中に…

第18回 G*ワークショップ周知

http://kokucheese.com/event/index/16071/ より 〜〜 今回のG*ワークショップは「G*なGUI祭り」として、G系デスクトップアプリケーション技術をフィーチャーしたセッションをお届けします。Grailsと並びG系を代表するフレームワークであるGriffonと、JavaFX…

static変数にも@Fieldを指定できる

Groovyでstatic変数を@Fieldにしたくなる時があります(@Fieldについてはこちらを参照)。たとえば、 class Hoge { def method() { if (verbose) { .. } } } verbose = cli.parse(args).verboes はエラーになります。なぜなら、バインディング変数は他のクラス…

GVM: GroovyでJavaVMを書いたよ

前置き さてやっと発売日となりました、私も著者の一人として執筆に参加している「プログラミングGroovy」ですが、ご覧になった方もいらっしゃると思います。プログラミングGROOVYposted with amazlet at 11.07.06関谷 和愛 上原 潤二 須江 信洋 中野 靖治 …

Groovyなどのソースコードのビジュアライゼーションの動画

昨日の記事で、Groovyなどのソースコード変遷のビジュアライゼーション動画について言及しましたが、見つけましたのでご紹介します。これらはSVNなどのバージョンコントロールシステムのコミットログなどから、Gourceというツールで生成されたもののようです…

メタプログラミング機構の考古学

Groovyのメタプログラミング機構にはMetaClassがあります。MOPってやつですね。これがいつ導入されたのか気になって、調べてみました。codehausのリポジトリから入手できるうちで探した限り最古のgroovyのソース(11-May-2004 14:59 211K)をダウンロードして…

@Fieldかわいいよ@Field

はじめに 息切れ直前企画「プログラミングGroovyの発売日まで1日1エントリ書くぞう」の第4回目です。今いちネタがないので、先日JGGUG G*WorkshopでGroovy 1.8の新機能について紹介した際の補足として、新規AST変換の1つ@Fieldを解説してみたいと思います。 …

groovyConsoleでお絵書き

本日、「プログラミングGroovy」の見本本が届きました。青がいい感じ!さすがプロの手腕だわ(最初はGroovyな感じじゃなくてCoolすぎる、とか文句言ってたのは内緒)。うちの奥さんは、一目見るなり、表紙のペンギンが気に入りました。ってそこか。 ということ…

AST変換の途中結果をGroovyソースに戻してみよう(ファイルで)

Groovy AST Browser Improved!の記事に書いたように、Groovy 1.8のGroovy ConsoleはAST変換の過程を見ることができるのです。では、ファイルでスクリプトのコードが(Groovy Consoleからコピペせずに)欲しいときはどうすれば良いかというと、以下のようにしま…

G*Workshop 16th発表、Groovy 1.8の新機能

JGGUG G* Workshop 16thにて発表してまいりました。以下、発表資料です。 Groovy 1.8の新機能について View more presentations from Junji Uehara 内容は、準備不足の感もありますが、私の主観で便利なところ、役にたつところ、をメリハリつけて紹介してみ…

G*ワークショップ16th

来週末の6/17(金)に、JGGUGでGroovy 1.8について話します。よろしければどうぞです。 http://kokucheese.com/event/index/12173/ 日本Grails/Groovyユーザーグループの2010年度総会を開催します。総会に続いては、恒例のG*ワークショップを開催し、G*ワール…

シナトラといえばスペシャルローリングサンダー

Ratpackというものがあるそうで。こちらの記事によれば、 Compared to Grails, it's a more bootstraped experience but is useful for small projects. Just as Sinatra coexists with Rails, Ratpack can coexist with Grails. Rubyの軽量Webフレームワー…

流れるようにGEP3(Fluent GEP3)

流れるような(フルーエント)インタフェースは、Groovy 1.8の新規機能である「拡張コマンド式(GEP3)」と親和性が高いのではないかと思い、S2JDBCチュートリアルを参考にして、具体的には上に含まれるテストコードをGEP3でいくつか書きなおしてGroovyから呼び…

GroovyにおけるProject Coin相当拡張について

id:fumokmmさんの日記で、「5分で理解するProject Coin」というすばらしい記事があり、Java 7の言語に関連する拡張がすぐに良くわかるように紹介されています。(私もしばらく前に記事をかきました。)Groovyでもじつは、Coinの文法拡張について細かいものも…

Groovy AST Browser Improved!

昨日のブログでも言及しましたが、Groovy 1.8.0では、Groovy ConsoleのASTブラウザ([Script]-[Inspect AST]で呼び出す)が進化して、AST変換前後のASTを、Groovyコードとして表示してくれるようになりました。 上は下のコードをInspect ASTしてみたものです。…

GroovyConsoleの改善と、その背景にあるワザ(@ThreadInterrupt AST変換)

@tyuki39さんの groovyconsoleってスクリプトの実行を中止出来ないのかな?組み合わせパターンを間違って多めに作ったときに固まって困る。2011-04-16 21:58:38 via Teeweeのつぶやきを切っ掛けとして、Groovy 1.8のGroovyConsoleを試してみて気づいたのです…

println -1やprintln[1]はなぜエラーなのか

Groovyで、println -1やprintln[1]を、println(-1)やprintln([1])のつもりで書いても以下のようなエラーになります。 $ groovy -e 'println -1' Caught: groovy.lang.MissingPropertyException: No such property: println for class: script_from_command_l…

java -jarで起動できるGroovy

http://jira.codehaus.org/browse/GROOVY-2128によれば、Groovy 1.8以降では java -jar /tool/groovy-1.8.0-rc-3/embeddable/groovy-all-1.8.0-rc-3.jar hoge.groovyのようにGroovyスクリプトやGroovyのクラス定義を起動できるようになります。beta4でFix-Cl…

GEP3のさらなる拡張

Groovyの1.8のどこか(たぶんbeta3)から、代入式右辺のメソッド呼び出しにおけるカッコの省略ができるようになっています。 home =System.getProperty "groovy.home" foo = System.getProperties().setProperty 'foo', 'bar' // 1.7ではエラーだが1.8の新しい…

クロージャにとってdelegateとは何か

短い答え 短い答え: クロージャにとって、delegateってのは、変更可能なthisですよ。 長い答え メソッドにとってthisとは何だったか まず、thisとは何だったかを確認します。thisの中核的な意味は、インスタンスメソッドから見て自分自身が所属するインスタ…

Builderとは何か

Builderというのは、Groovyのとても特徴的な機能だと思います。たとえば、MarkupBuilder。 new MarkupBuilder().root { a( a1:'one' ) { b { mkp.yield( '3 < 5' ) } c( a2:'two', 'blah' ) } } こんなんを書くと、 <root> <a a1='one'> <b>3 &lt; 5</b> <c a2='two'>blah</c> </a> </root> こんなのが表示されま…

Groovy 1.8 modularizationとは何か

Groovy 1.8の新機能として、「モジュール化」というのがちらほら出て来ています。たとえば、1.8.0-beta1のリリースノートには、 .. and we're also seizing this opportunity to work in parallel on making Groovy more modular. Some early work towards m…

GROOVY_HOMEを設定しない方が良い理由

Why You Should Never Set GROOVY_HOMEという記事があり、GROOVY_HOME環境変数を設定してしまうと、複数のGroovyをインストールしてるときとか、あるいはGrailsとGroovyの両方をインストールしてるときに邪魔でしかないので、GROOVY_HOMEは設定せず、PATHにG…

Groovyではprivateが無視されるというのはバグとみなされている

これもトリビア。現在のGroovyはprivateを無視します。なのでjava.lang.String#valueの値を変えることも容易にできます。試験に便利なときもあるかもしれません。しかしこの機能(?)は古来からバグとみなされてます。いにしえのjsr-03では禁止されていたらし…

Groovyの生産性

GroovyとJavaとの生産性の比較について、groovy-userのMLで報告してた人がいたので紹介。 groovy/javaの混合言語のプロジェクトで、Javaコードをgroovyにコンバートすることをやってた。たいていは、拡張したりバグ修正したり必要に応じてリファクタリングも…

GroovyはPure Javaじゃない

トリビア?です。GroovyはPure Javaじゃないんですね。 $ jar tvf /tool/groovy-1.7.3-bin/lib/jline-0.9.94.jar | grep dll 16069 Fri Feb 22 03:02:14 JST 2008 jline/jline32.dll 48128 Fri Feb 22 03:02:14 JST 2008 jline/jline64.dll groovyに同梱され…

「int i = null」はエラー

groovy 1.8からは、「int i = null」はエラーです。 $ groovy -e 'int i=null' Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'null' with class 'null' to class 'int'. Try 'java.lang.Integer' instead at …

(再告知)g*workshop 14th, 「Groovyの使い倒し方、Hudsonの場合」他

以下で周知させていただいた、「g*workshop 14th, 「Groovyの使い倒し方、Hudsonの場合」他」ですが、いったん満席となったものの、調整され、今ちょっとだけ人数に余裕があるようです。http://d.hatena.ne.jp/uehaj/20110210 http://kokucheese.com/event/i…

g*workshop 14th, 「Groovyの使い倒し方、Hudsonの場合」他

来る2/24、Hudson改めJenkinsの開発者、川口耕介さんが来日するのにあわせ、G*ワークショップが開催され、じきじきにHudon&Groovyの話がお伺いできます。日本を代表するJavaハッカーの川口さんがいかにGroovyを使い倒しているか聞いたら凄いことになりますね…

DevLOVEぐるぐるGroovyで「気楽に使おうGroovy」の再演をしてきました

1/24日、DevLOVEのぐるぐるGroovyでCCCでやった「気楽に使おうGroovy」の再演をしてまいりました。会場を提供いただきましたクラスメソッドさま、参加者のみなさん、DevLOVEのみなさん、ありがとうございました。様子をid:kimoku26さんがTogetterしてくれま…

Closure#trampoline()続き

昨日trampoline()について書きましたが、今日はtrampoline()で相互再帰もできますという話。まずはtrampoilne()使わないバージョン。 oddp = { n -> if (n==0) { false } else evenp(n -1) } evenp = { n -> if (n == 0) { true } else oddp(n - 1) } printl…

Closure#trampoline()とは何か

Closure#trampoline()はGroovy 1.8の新機能の1つです。何かっていうと、「明示的な末尾再帰の指定*1」を行うためのものです。これを使うと実際には再帰じゃなくなります。ループになります。スタックを消費しなくなります。だから正確に言うと、「いっけん再…

Fieldアノテーションって何?

Groovy 1.8.0 beta 2 から@Field*1というAST変換アノテーションが使えるようになっています。これは何かといいますと、いままではスクリプト中で int x = 3 def y() { println x } y() の様に書くとエラーになっていました。なぜならxは、このスクリプトが実…

ANTLRパーサプラグインでGroovyコードを加工

メーリングリストを眺めてたら目にとまった、「ANTLRパーサプラグインを作成して、Groovyコードに任意の加工を行う」というテクニックをご紹介。Groovy web console - Custom antlr parser pluginここではメソッド呼び出しの括弧を挿入しているようです(GEP3…

速いぞGroovy!

Javaと同等レベルに高速に実行できるGroovyコードを書く方法が紹介されてます。 Yes, Fibonacci in Groovy can be as fast as Java ! こんなスクリプトです。 @ast.Bytecode int fib(int i) { l0 iload 1 iconst_2 if_icmpge l1 iconst_1 _goto l2 l1 frame …

Announcing CodeNarc 0.11

Groovy用の静的解析ツールであるCodeNarcの0.11リリースのアナウンスが出ています。Groovy版checkstyleと思えばよろしい。今バージョンではチェックルールが増えたようです。業務開発ではコーディング規約を揃える必要がありますが、これを使うとGroovy開発…