G*ワークショップ 2012新春SP のまとめ

G*ワークショップ 2012新春SP

会場

VMware東京本社 セミナールーム
JR浜松町 北口でて目の前だ。
品川はビル名が分からずに迷ったけど、今回は迷わずにすんだ。

アナウンスもあったしね。


と思ったけど、あれ?(^_^;)





飲み物は買い忘れた。。。


座席表


編集

参加者

[twitter:@kazuchika]
[twitter:@nobeans]
[twitter:@gantawitter]
[twitter:@kiy0taka]
[twitter:@ko1kun]
[twitter:@yamkazu]
[twitter:@toby55kij]
[twitter:@yamadamasaki]
[twitter:@Solti]
[twitter:@dontakosu1234]
[twitter:@mike_neck]
[twitter:@nobusue]
[twitter:@_y_u_]
[twitter:@tyama]
[twitter:@nagai_masato]
[twitter:@uehaj]
[twitter:@hiranasu]
[twitter:@bikisuke]
[twitter:@nemo_kaz]
[twitter:@kimukou_26]
[twitter:@tetsuonatom]
[twitter:@atanaka]
[twitter:@smachida]
[twitter:@tamatamatamata]
[twitter:@earu]
[twitter:@literalice]
[twitter:@touchez_du_bois]
[twitter:@notexy]
[twitter:@ab_xy]


これは由々しき問題だ




新年の挨拶 & 2012のJGGUG [twitter:@yamadamasaki]

  • Developers Summit 2012 (2012/16,17)
    • JGGUGOfficial Community として参加
    • 【16-B-7】デブサミオフィシャルコミュニティから選出のLT大会2012 に参加
    • 【16-B-3】教科書と現場のあいだ 〜学びを活かすために〜 プロフィールに注目

  • JavaOne Tokyo 2012 (2012/4/4,5)
  • GR8 in Japan

第一部:Groovy&Grails eXchange 2011@ロンドン 報告! by JGGUG遣英使節団 ( [twitter:@bikisuke] [twitter:@kiy0taka] [twitter:@mkawax] [twitter:@tyama] )

  • DISCOBOT:GROOVY ON ANDOROID
    • で、Dsicbotは動くの?


  • GALEYK
    • 認知率100%
  • ADVANCED GRADLE
  • Gradle は2012年中に1.0がでる。
    • GantMaven? イケてないな。なら作っちゃおうか。というでノリで作られたのか
    • 2012/1/7に1.0-milestone-7がでてた
    • milestoneいくつまで行くの・・・
  • 「GETTING GROOVY ON THE WEB AND DESKTOP」と「THE GRIFFON EXPERIENCE」
    • @tyamaと@kiy0taka でどちらかが面白いかで意見がわかれた。
  • 「Lukeは超イケメン」は何回言ったんだ(^_^;)
    • 東京 @uehaj、@nobeans
    • 東京2 @bikisuke、touchez_du_bois
    • 名古屋 @kyon_mm、@fumokmm
    • 大阪 @kiy0taka、@irof
  • GRAILS-DATA-MAPPING,GROM & NEO4J の STEFAN ARMBRUSTERは @touchez_du_bois に姿も、ちょこちょこネタを仕込む話し方も似ている
  • TESTING HTTP DEPENDNCIES WITH BETAMAX のセッションはJGGUG @nobusue の方がわかりやすいかった
  • PRODUCTIVE GRAILS FUNCTIONAL TESTING
    • イケメン、テスト・・・もう書かなくても言いたいことは分かるか
  • 未来のGrailsを考える
    • Spock風(when,then)にロジックを記述
    • Grailsをプラットフォームとして発展できないか
  • 最安で行けば25万円ぐらいでいけると言ってたが・・・
  • @kiy0taka のデモ

LTは申し込み順ということで、準備し始めたら
自分のノートPCがブルーバック・・・焦った。
と言うわけで見てなかった ><。


技術的な内容は、togetterを参照。





第二部:新春LT大会

Grezieであーそーぼー @orange_clover

Grezi
PreziのようなズーミングプレゼンテーションをGroovyFXで実装したもの。


























import javafx.beans.property.SimpleStringProperty
import javafx.scene.effect.DropShadow
import javafx.scene.paint.Color
import javafx.scene.web.WebView


showGreziLogo = false
def prezHome = "${System.getProperty('user.dir')}/presentations/BubbleTreeFX"

def yMove = 100
def xMove = 50
def y = 0
def x = 0
def view = new WebView(layoutX: 30, layoutY: 30, visible: false, opacity: 0.0)
def switchWebWiew

map = {
    path << label(layoutX: x, layoutY: y, onMousePressed: focusOnNode, text: 'Greziであーそーぼー')
    path << label(layoutX: x += xMove, layoutY: y += yMove, onMousePressed: focusOnNode, text: '自己紹介')

    path << imageView(x: x += xMove, y: y += yMove, onMousePressed: focusOnNode) {
                image(new File("./presentations/G_Workshop201101SP/resource/orange_clover_Groovyist.png").toURL(), width: 83, height: 83)
    }
    path << text(x: x += xMove*2, y: y , text: "Twitter:@orange_clover\nはてな:orangeclover", fill: orange, font: "32pt", textOrigin: "top")
    
    path << label(layoutX: x += xMove, layoutY: y += yMove*4, onMousePressed: focusOnNode, text: 'ミドルウェアの保守')
    path << label(layoutX: x += xMove, layoutY: y += yMove, onMousePressed: focusOnNode, text: 'C屋')
    path << label(layoutX: x += xMove, layoutY: y += yMove, onMousePressed: focusOnNode, text: '普段見てるもの')
    path << imageView(x: x += xMove, y: y += yMove, onMousePressed: focusOnNode) {
                image(new File("./presentations/G_Workshop201101SP/resource/core.png").toURL())
    }
    path << label(layoutX: x += xMove, layoutY: y += yMove*10, onMousePressed: focusOnNode, text: '何かか作りたくなった')
    path << label(layoutX: x += xMove, layoutY: y += yMove, onMousePressed: focusOnNode, text: 'Groovyで気分転換')
    path << label(layoutX: x += xMove, layoutY: y += yMove, onMousePressed: focusOnNode, text: 'いつのまにかGroovyのネタで気分転換')
    path << imageView(x: x += xMove, y: y += yMove, onMousePressed: focusOnNode) {
                image(new File("./presentations/G_Workshop201101SP/resource/groovyたん.png").toURL())
    }
    path << label(layoutX: x += xMove, layoutY: y += yMove*10, onMousePressed: focusOnNode, text: 'どうしてこうなった/(^o^)\')
    path << label(layoutX: x += xMove, layoutY: y += yMove, onMousePressed: focusOnNode, text: '2012年は技術的なことを増やしたい')
    
    switchWebWiew = { event ->
        if (view.opacity == 0) {
            mapGroup.effect = boxBlur(width: 10, height: 10, iterations: 3)
            
            view.engine.load("http://itpro.nikkeibp.co.jp/article/COLUMN/20110420/359631/")
            //view.engine.load("file:///${System.getProperty('user.dir')}/presentations/G_Workshop201101SP/resource/prezi/hmtl")

            view.visible = true
            view.requestFocus()
            
            timeline {
                at(900.ms) {
                    change(view, 'opacity') { to 0.8 }
                }
            }.play()
        } else {
            map.effect = null
            mapGroup.effect = null
            view.opacity = 0.0
            view.visible = false

        }
    }
    path << hbox(layoutX: x += xMove, layoutY: y += yMove, onMousePressed: focusOnNode) {
            label(font: '30pt', 'そこでGrezi')
            label(id:'Grezi', styleClass: 'start-label', '読み方', onMousePressed: switchWebWiew)
    }

    path << label(layoutX: x += xMove, layoutY: y += yMove, onMousePressed: focusOnNode, text: 'Prezi=プレジーなので')
    path << label(layoutX: x += xMove, layoutY: y += yMove, onMousePressed: focusOnNode, text: 'たぶんGrezi=グレジー')
    path << label(layoutX: x += xMove, layoutY: y += yMove, onMousePressed: focusOnNode, text: 'ズーミングプレゼーンテーション')
 

}

withScene = { scene ->
    scene.stylesheets.add("file:///${System.getProperty('user.dir')}/presentations/Slideshows/style.css".toString())

    scene.root.children.add(view)
    view.prefWidthProperty().bind(scene.widthProperty().subtract(60))
    view.prefHeightProperty().bind(scene.heightProperty().subtract(60))

    def label = label(styleClass: 'exit-label', 'exit', visible: bind { view.visible }, onMousePressed: switchWebWiew)
    scene.root.children.add(label)
}









import javafx.scene.web.WebView
import javafx.scene.paint.Color
import groovy.json.JsonBuilder
import groovy.json.JsonSlurper
import groovy.text.GStringTemplateEngine
import groovyx.javafx.ClosureEventHandler


showGreziLogo = false

def prezHome = "${System.getProperty('user.dir')}/presentations/BubbleTreeFX"
def switchWebWiew

def view = new WebView(layoutX: 30, layoutY: 30, visible: false, opacity: 0.0)

map = {
    btView = webView(prefWidth: 800, prefHeight: 600)

    def outputFile = new File(prezHome, 'BubbleTreeFX.html')

    def templateFile = new File(prezHome, 'BubbleTreeFX.tpl.groovy')
    def engine = new GStringTemplateEngine()
    def template = engine.createTemplate(templateFile.newReader("UTF-8"))

    def js = new JsonSlurper()
    def doc = js.parse(new FileReader(new File("${System.getProperty('user.dir')}/presentations/G_Workshop201101SP/resource/BubbleTreeFX.json")))

    def colorToWeb = { c ->
        "#${sprintf('%02x', c.red*255 as int)}${sprintf('%02x', c.green*255 as int)}${sprintf('%02x', c.blue*255 as int)}"
    }
    def r = new Random()
    def addColor
    addColor = { children, cp ->
        children.eachWithIndex { e, i ->
            def c
            if (cp == null) {
                c = Color.hsb(i*360/children.size(), 0.7, 0.5)                
            } else {
                c = cp.deriveColor(r.nextDouble(), 1, r.nextDouble()+0.6, 1)
            }
            e['color'] = colorToWeb(c)
            if (e['children'])
                addColor(e['children'], c)
        }
    }
    addColor(doc.children, null)

    def json = new JsonBuilder(doc)

    def fw = new OutputStreamWriter(new FileOutputStream(outputFile), 'UTF-8')
    template.make([data: json.toString()]).writeTo(fw)
    fw.flush()

    btView.engine.load("file:///${outputFile.path}")
}

withScene = { scene ->
    scene.stylesheets.add("file:///${prezHome}/style.css".toString())

    btView.prefWidthProperty().bind(scene.widthProperty())
    btView.prefHeightProperty().bind(scene.heightProperty())

    scene.root.children.add(view)
    view.prefWidthProperty().bind(scene.widthProperty().subtract(60))
    view.prefHeightProperty().bind(scene.heightProperty().subtract(60))

    def label = label(styleClass: 'exit-label', 'exit', visible: bind { view.visible })
    scene.root.children.add(label)

}
{
    "id": "Grezi",
    "label": "Grezi",
    "amount": 100,
    "children": [
        {"id": "prezen", "label": "プレゼンの種類", "amount": 50, "children": [
            {"id": "PreziLike", "label": "Prezi風", "amount": 20},
            {"id": "SlideShow", "label": "スライドショー", "amount": 20},
            {"id": "Bubble", "label": "バブル", "amount": 20},
        ]},

        {"id": "Tech", "label": "使用している技術", "amount": 50, "children": [
            {"id": "Java", "label": "Java", "amount": 20},
            {"id": "JavaFX", "label": "JavaFX", "amount": 20},
            {"id": "Groovy", "label": "Groovy", "amount": 20},
            {"id": "GroovyFX", "label": "GroovyFX", "amount": 20},
            {"id": "Gradle", "label": "Gradle", "amount": 20},
            ]
        },
        {"id": "knowledge", "label": "必要な知識", "amount": 50, "children": [
            {"id": "map", "label": "map", "amount": 20,},
            {"id": "mapGroup", "label": "mapGroup", "amount": 20,},
            {"id": "path", "label": "path", "amount": 20,},
            {"id": "withScene", "label": "withScene", "amount": 20,},
            {"id": "scene", "label": "scene", "amount": 20,},
            {"id": "forcusOnNode", "label": "forcusOnNode", "amount": 20,},

            {"id": "prezi", "label": "Prezi風なら", "amount": 20, "children": [
                {"id": "text", "label": "text", "amount": 7},
                {"id": "label", "label": "lable", "amount": 7},
                {"id": "imageView", "label": "imageView", "amount": 7},
            ]}
        ]},
        {"id": "gain", "label": "得られるもの", "amount": 50, "children": [
            {"id": "impact", "label": "インパクト", "amount": 20 },
            {"id": "failure", "label": "失敗しても・・・", "amount": 20 },
            {"id": "courage", "label": "勇気", "amount": 20 },

        ]}
    ]
}

GreziのサンプルのJSONを変えただけ。


groovist.jpとったどー [twitter:@ko1kun]


http://www.slideboom.com/presentations/478739/Goovyist%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6




Apache Pivot × Groovy [twitter:@toby55kij]

Apache Pivot

JavaFX/GroovyFX みたいなGUIを作成するフレームワーク
GroovyFXと違って、XMLにコードを埋め込むような感じ。



正しいベンチマーク in Groovy [twitter:@nagai_masato]



GBenchについては、G*ワークショップで60分セッションでやってくれることを期待。



年末年始のGroovy的大掃除 [twitter:@nemo_kaz]




docx renamer Word文書のファイル名を タイトル+最終更新日
大掃除 上記の話がメインだったと思うけど、
キャラクター方が反響が大きかったようだ。

GroovyたんとGitHubの非人間キャラクターなど2つの間に、Groovyも1つキャラクターが
欲しいよねとの一言から、それは始まった。



http://technode.com/wp-content/uploads/2011/11/github-profile1.png





夢に出てくるような非人間的キャラとGroovyたん



「GLOOMY」ってのがいるけどね。
http://yaplog.jp/morichack/
http://www.chax.cc/main.html?ja



なるほど、それでこれにつながるのか (違っ
鹿駆動勉強会



griffon pluginを実際に使ってみよう [twitter:@kimukou_26]

ASSUSのXTION PRO(Kinectもどき) + Griffon プラグイン を使ったカメラで「手」を認識。
デモは「手」ではなく、「顔」を認識していたようだけど。
Kinectはでかいのと電源が別に必要。
こいつはUSB出力でいける。
ただ、値段がねぇ・・・


XTION PRO LIVE
B0067PGV8M




Grails (で今困っていること) [twitter:@literalice]
  • herokuでGrails
  • セッション管理してないので(?)ログインしてるのに、ログイン未の状態になってしまう
  • 解決方法を知ってる人は教えて。

懇親会

:detail]
:detail]
ドタキャンどころか、参加したい人が増えてたので、一部の人が
離れたテーブルになってしっまうという事態に。


編集
狭かったので、奥の方は半分は怪しいので訂正して。


あと、詰め込まれたから、奥の人も大変だったようだ。




Togetter




次回

デブサミ2012、JavaOne Tokyo 2012があるので、
2〜4月はG*ワークショップはないさそうだ。
@mike_neckプレゼンツのスピンオフ企画かな。
Grails2.0勉強会