読者です 読者をやめる 読者になる 読者になる

『G*ワークショップ「Vert.x+JavaOne+Groovy2.0なG*」 #jggug』に参加してきた

Groovy 勉強会

第3回社内LT大会に見た顕在化した失望と一握の希望

勉強会でも殆ど聞かない

Groovyの勉強会あります!
どこで情報収集すればいいかわからない?
ここにカレンダーが!
JGGUG イベントカレンダー

告知が足りない?
勉強会カレンダーにも載ってるし、
こくちーずでGroovy、Grailsタグもある。
Facebookのグループも、MLもあるよ。




2012/10/26に行われたG*ワークショップ「Vert.x+JavaOne+Groovy2.0なG*」 #jggugに参加しました。
そのレポートです。

G*なJavaOne報告2012秋 〜サンフランシスコの風に吹かれて〜 @gantawitter

Rasberry Pi

Rasberry Piが一番盛り上がった。
落ちるところが・・・

Design Patterns in Groovy

写経してみる。

  • Cascade
    • method chaining Tarditional way
class Mailer {
    def to(addr) { println 'to ...' }
    def from(addr) { println 'from ...' }
    def sub(subject) { println 'sub ...' }
    def body(msg) { println 'body ...' }
    def send() { println 'send ...' }
}
// Tarditional way
Mailer mailer =new Mailer()
mailer.to('sameone@example.com')
mailer.from('sender@example.com')
mailer.sub('build fixed')
mailer.body('...message...')
mailer.send()
to ...
from ...
sub ...
body ...
send ...
    • method chaining
class Mailer {
    def to(addr) { println 'to ...'; this }
    def from(addr) { println 'from ...'; this }
    def sub(subject) { println 'sub ...'; this }
    def body(msg) { println 'body ...'; this }
    def send() { println 'send ...'; this }
}
// Chaining
new Mailer()
    .to('sameone@example.com')
    .from('sender@example.com')
    .sub('build fixed')
    .body('...message...')
    .send()
to ...
from ...
sub ...
body ...
send ...

return this のreturnが省略されてる。
参考:return省略のルール


    • fluency
class Mailer {
    def to(addr) { println 'to ...' }
    def from(addr) { println 'from ...' }
    def sub(subject) { println 'sub ...' }
    def body(msg) { println 'body ...' }
    def static send(block) { 
        Mailer mailer = new Mailer()
        mailer.with block
        println 'send...'
    }
}

Mailer.send {
    to 'sameone@example.com'
    from 'sender@example.com'
    sub 'build fixed'
    body '...message...'
}
to ...
from ...
sub ...
body ...
send...

こういう流暢なコード書けないな。。。
えっ?輝彩滑刀の流法と呼べ?

Intercept, cache, and invoke pattern
class Person {
    def activities = ['Football', 'Tennis']
    def methodMissing(String name, args) {
        println "interceptiong $name"
        if (name.startsWith('play')) {
            def activity = name.split('play')[1]
            if (activities.contains(activity)) {
                def impl = { Object[] tehArgs ->
                    println "I like playing $activity"
                }
                getMetaClass()."$name" = impl
                return impl(args)
            }
            throw new MissingMethodException(name, this.calss, args)
        }
    }
}

Person sam = new Person()
sam.playTennis()
sam.playTennis()
sam.playTennis()
sam.playTennis()

sam.playFootball()
sam.playFootball()
interceptiong playTennis   ・・・1回目でキャッシュされてないのでこのメッセージがでる
I like playing Tennis・・・・・・2回目以降はキャシュされてるので、「interceptiong〜」のメッセージはでない
I like playing Tennis
I like playing Tennis
I like playing Tennis
interceptiong playFootball・・・・1回目のFootballなので、このメッセージがでる
I like playing Football
I like playing Football

methodMissingは、プログラミングGROOVYには書いてあるけど、Webだとるびまに起稿した@uehajさんの記事か?
methodMissing と invokeMethod


この辺はJavaOneの動画も見てみよう。

ScirptBowl

Scala vs JRuby vs clojure vs Groovy
去年はGroovyの優勝。
今年は、Scalaの指笛部隊によって優勝をかっさらわれた。
JavaOneに行くGroovyistは指笛を覚えるように。

カニ

JavaOneに行った日本人はカニを食うのが習慣らしい。
どうしても、去年の@nobeansの顔が思い浮かんでしまう。


非同期したり イベント駆動したり 〜Vert.xのちょっとした話〜 @touchez_du_bois

前回できなかった。今回もあまりいい状態ではないのですが・・・
モヤッとしたら、Tweetで質問してくれれば、答えます。

本題(アニメネタ)
余談(Vert.x)

Vart.xの読み方は、「バーテックス」

    • C10K問題とは、

http://www.hyuki.com/yukiwiki/wiki.cgi?TheC10kProblem

  • C10K問題を解決するためのフレームワーク
    • シングルスレッドモデル
    • ノンブロッキングI/O(非同期I/O)
    • イベント駆動 (イベントが発生した時点でサーバに依頼)
  • G*界隈だと
    • Gretty
  • 満を持して登場したのがVert.x
  • すべてノンブロッキング
  • JVM上で動作

Cloujure、Scalaは現在でも、classファイルにすれば使用可能

  • TCP、SSL、HTTP、HTTPS、Websocketsといった従来のプロトコルに対応

Vert.xのインスタンス:Verticle=1:N
JVM:Verticle=1:1
あってる??
資料公開されたら確認しよう。。。

  • Verticle同士はイベントバスを通じて通信
  • 複数のVerticleがイベントバスを通じて連携
  • 共有マップ、共有セットは同じVert.x内でのみ共有可能
  • ワーカーVerticleは処理をブロックしてもよい
  • イベントループ
  • マルチ・リアクター・パターン
  • HelloWorld
    • ソース
vertx.createHttpServer().requestHandler { request ->
    request.response.end("""
<html>
    <body>
        <h1>Hello, World!</h1>
    </body>
</html>
""")
}.listen(8080, 'localhost')
  • 変数vertx、変数requestは、vert.xにより自動バインドされる
    • Groovyだとimport文もいらないんだ。

GroovyでVert.x - 1. インストールとHello, World!の 「"vertx"って?」のところ

    • 実行方法
    $ vertx run HelloWorld.groovy
  • Vert.xのドキュメントは充実。Mybetabookで絶賛翻訳中。


ここにリンク貼らないんとたどりつけない気がする。
jggug - 日本Grails/Groovyユーザーグループ


モヤモヤ
@touchez_du_bois さん、資料どこで公開されてますか〜〜
公開されました


Groovy 2.0の新機能 〜疾きこと@CompileStaticのごとし〜 @uehaj

AST変換
静的Groovy
  • @TypeChecked
  • @CopmileStatic

タイポが多い僕としては、@TypeCheckedをつけたほうがいいのか?
メソッド名の誤りに対する指摘なら、IntelliJ IDEAの補完に任せたほうがよさそうな気もする。


  • GGTS (Eclipse Plugin Groovy/Grails Tool Suite) 3.0.0から利用可能

http://grails.org/products/ggts

IntelliJ IDEAは12からGroovy2.0サポート。
まだEPA版の状態なので、Groovy2.0は使えない。
NetBeansはどうだっけ?

Groovy++ と静的Groovy
  • @TypedアノテーションからGroovy2.0の@TypeChecked 静的型チェック、@CompileStatic 静的コンパイルへ
    • ただし、ソースの継続性はない
  • mixedモードコンパイル、末尾最適化、traitsなどは未対応
    • きょんさんが実装すると聞いて


性能

Groovy++って早かったんだな
JVM言語BOFベンチマーク20120402
でも、Groovy++がんばってたんだよなー。Groovy2.0だとどうなるだろう。

それじゃだめじゃんw indy
懇親会でJRubyindy対応版の方が早く、indyにうまく対応してると聞いた。
Groovyも今後のindy対応での速度Upに期待

ライブラリ強化
  • 初期値無しinject

お世話になるかな?

  • Matcher#matchesPartially()

バリデーションチェック以外で使用用途を募集中。
http://yamkazu.hatenablog.com/entry/2012/07/06/153541

  • takeWhile{}、dropWhile{}

はじめにfalse、trueになった以降の要素を、それ以降の値は問わずに取り出す
資料の図がすごいわかりやすいから、資料を見た方がいい。


モジュール化

拡張モジュールは「カスタム拡張メソッド」を提供できる
AdventCalendarやGhelloのようなイベントで使う黒魔術的なものが増えたということか。(違

Groovyの今後

2012年の残りでGroovy2.1、2013年もGroovy3.0への進化は続く。


@gantawitter さん、@touchez_du_bois さん、@uehaj さん 発表ありがとうございました。
レポートにお礼をこめて。

座席表


やっちまったい・・・編集権つけるの忘れた。
終了間際に、追加したけど・・・


編集




新しい人増えて、右側が分からず。良かったら、編集してください。

@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@

関連ブログ

G*Workshop「Groovy2.0の新機能」を発表してきました



その日のうちにレポートをあげる人はほとんどいないわな・・・