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)
- JavaOne Tokyo 2012 (2012/4/4,5)
- GR8 in Japan
第一部:Groovy&Grails eXchange 2011@ロンドン 報告! by JGGUG遣英使節団 ( [twitter:@bikisuke] [twitter:@kiy0taka] [twitter:@mkawax] [twitter:@tyama] )
- Groovy&Grails eXchange 動画
- http://skillsmatter.com/event/groovy-grails/groovy-grails-exchange-2012
- 必見の動画は、スライドショーに「動画必見」と記されている。
- DISCOBOT:GROOVY ON ANDOROID
- で、Dsicbotは動くの?
- GALEYK
- 認知率100%
- ADVANCED GRADLE
- Gradle は2012年中に1.0がでる。
- 「GETTING GROOVY ON THE WEB AND DESKTOP」と「THE GRIFFON EXPERIENCE」
- @tyamaと@kiy0taka でどちらかが面白いかで意見がわかれた。
- 「Lukeは超イケメン」は何回言ったんだ(^_^;)
- メタプログラミングの超高速TDDライブコーディング
- 日本でなら、以下で見てみたい。
-
- 東京 @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
- イケメン、テスト・・・もう書かなくても言いたいことは分かるか
- 最安で行けば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]
GroovyFXと違って、XMLにコードを埋め込むような感じ。
正しいベンチマーク in Groovy [twitter:@nagai_masato]
- Groovy の AST を楽に書く方法
- G5、Groovyでのスライドショーツール
- 参考 http://nagaimasato-ja.blogspot.com/2011/12/g-advent-calendar121313-groovyg5-new-g5.html
- 他人のふんどしで取った GreziのLTをやった人のせいで、G5のヤル気が下がったしまったそうだ・・・
- LTならGreziはいいけど、内容で勝負の場合はG5の方がいいね。
- あとは、資料の公開もGreziは困るんだよね。そこは、PDFに出力できるG5の強み。
- 参考 http://nagaimasato-ja.blogspot.com/2011/12/g-advent-calendar121313-groovyg5-new-g5.html
- GBench
GBenchについては、G*ワークショップで60分セッションでやってくれることを期待。
年末年始のGroovy的大掃除 [twitter:@nemo_kaz]
docx renamer Word文書のファイル名を タイトル+最終更新日
大掃除 上記の話がメインだったと思うけど、
キャラクター方が反響が大きかったようだ。
GroovyたんとGitHubの非人間キャラクターなど2つの間に、Groovyも1つキャラクターが
欲しいよねとの一言から、それは始まった。
「GLOOMY」ってのがいるけどね。
http://yaplog.jp/morichack/
http://www.chax.cc/main.html?ja
なるほど、それでこれにつながるのか (違っ
鹿駆動勉強会
griffon pluginを実際に使ってみよう [twitter:@kimukou_26]
ASSUSのXTION PRO(Kinectもどき) + Griffon プラグイン を使ったカメラで「手」を認識。
デモは「手」ではなく、「顔」を認識していたようだけど。
Kinectはでかいのと電源が別に必要。
こいつはUSB出力でいける。
ただ、値段がねぇ・・・
懇親会
:detail]:detail]
ドタキャンどころか、参加したい人が増えてたので、一部の人が
離れたテーブルになってしっまうという事態に。
編集
狭かったので、奥の方は半分は怪しいので訂正して。
あと、詰め込まれたから、奥の人も大変だったようだ。
Togetter
次回
デブサミ2012、JavaOne Tokyo 2012があるので、
2〜4月はG*ワークショップはないさそうだ。
@mike_neckプレゼンツのスピンオフ企画かな。
Grails2.0勉強会