人生、気合いと具合 - blog

2013年03月

3/22(金)のjava-ja.dddに参加してきました!
といかjava-jaのイベントは(たぶん)初参加だし、DDD全然知らないしで少々心配でしたが、とても楽しかったです。(java-jaこわいとか書いちゃダメ!といわれるからこわい)

会場を提供していただいたGREEさん、入り口で水を無料で配っていただいた上に、ピザとアルコール類まで無料でいただいてしまいました。GREEさん最高!
そんなわけでアルコールも入りながらということもありなかなかのハイテンションでした。ていうかjava-jaはこういう感じでいつもやってるんだろうか。

で、個人的には増田さんの話がとても興味深かった。
正直1日聞いただけではDDDがどんなもんかはよくわからなかったのですが、
・ドメインオブジェクトを細かく作る。細かい概念にもちゃんとクラスを割り振るという感じ?
・イミュータブル大事。
・ドメインオブジェクトの構造を安易にコードに埋め込まない。
といったあたりは、確かに役立ちそうな予感がしました。

全体的に、想像していたよりもDDDが俺に合うかも?という印象をもったので、「エリック・エヴァンスのドメイン駆動設計」、とりあえず注文しました。


...関係ないけど、いまだにDequeを「デキュー」って読んじゃうんだよな...

初参加がいきなり100回記念、ということでScala勉強会(rpscala)100回記念ハッカソンに参加してきました。

自己紹介のあともくもくとハッカソン。せっかくなので、自分が作ってたものを一応以下に公開。(少し当日から修正あり)
といっても、scalafxが使えて、タッチパネルがある(実質、ほぼWindows8専用みたいなもの?)という条件なので、著しく実行環境が制限されるけども。

画面下部の白い円にタッチしてフリック(?)すると、その方向に赤い円が飛んで行きます。緑の円に当ててください。
単なるサンプルなのでスコアとかゲームオーバーとかはありません。

rpscala100



















package com.bugworm.rpscala100

import scalafx.application.JFXApp
import scalafx.stage.StageStyle
import scalafx.scene.Scene
import scalafx.scene.layout.Pane
import scalafx.scene.input.TouchEvent
import scalafx.scene.paint.Color
import scalafx.scene.shape.Circle
import scalafx.Includes._
import scalafx.animation.{KeyFrame, Timeline}
import scalafx.event.ActionEvent
import collection.immutable.List

object Sample extends JFXApp{

    var startBall : Option[Circle] = None
    var myBalls = List.empty[Circle]
    var targets = List.empty[Circle]

    val base = Circle(512, 700, 64, Color.WHITE)
    val rootPane = new Pane{
        prefWidth = 1024
        prefHeight = 768
        content = base
    }

    new JFXApp.PrimaryStage{

        initStyle(StageStyle.UNDECORATED)

        scene = new Scene(rootPane){

            fill = Color.DARKBLUE

            onTouchPressed = {e : TouchEvent =>
                val p = e.touchPoint
                startBall = if(base.contains(p.getX, p.getY))
                    Some(Circle(p.getX, p.getY, 32, Color.RED)) else None
                startBall.foreach(rootPane.children.add(_))
            }

            //onTouchReleasedじゃないのはscalafxのバグ回避
            delegate.onTouchReleasedProperty().setValue({e : TouchEvent =>
                startBall.foreach{ball =>
                    val end = e.touchPoint
                    val dx = end.getX() - ball.centerX()
                    val dy = end.getY() - ball.centerY()
                    if(math.abs(dx) > 5 || math.abs(dy) > 5){
                        myBalls = ball :: myBalls
                        val tx = if(dx == 0) 1000 else 600 / math.abs(dx)
                        val ty = if(dy == 0) 1000 else 800 / math.abs(dy)
                        val time = math.min(tx, ty)
                        new Timeline{
                            keyFrames = at (time * 200 ms) {Set(
                                ball.centerX -> (ball.centerX() + dx * time),
                                ball.centerY -> (ball.centerY() + dy * time)
                            )}
                            onFinished = {e : ActionEvent =>
                                rootPane.children.remove(ball)
                                myBalls = myBalls.filterNot(_ == ball)
                            }
                        }.play
                    }else{
                        rootPane.children.remove(ball)
                    }
                    startBall = None
                }
            })

            onRotate = close
            onKeyPressed = close
        }
    }

    new Timeline{
        cycleCount = Timeline.INDEFINITE
        keyFrames = KeyFrame(50 ms, "main", {e : ActionEvent =>
            myBalls.foreach{b =>
                targets.filter{t =>
                    math.pow(b.centerX() - t.centerX(), 2) + math.pow(b.centerY() - t.centerY(), 2) < 4000
                }.foreach{hit =>
                    rootPane.children.remove(hit)
                    targets = targets.filterNot(_ == hit)
                }
            }
            if(math.random > 0.95){
                val target = Circle(math.random * 896 + 64, -64, 64, Color.LIGHTGREEN)
                targets = target :: targets
                rootPane.children.add(target)
                new Timeline{
                    keyFrames = at ((6 + math.random * 3) s) {target.centerY -> 832}
                    onFinished = {e : ActionEvent =>
                        rootPane.children.remove(target)
                        targets = targets.filterNot(_ == target)
                    }
                }.play
            }
        })
    }.play
}


会場はチームラボさんに提供していただきました。
ちょっとオシャレ?な感じで開放感のある部屋、ハッカソンするのにとてもよい感じでした。ありがとうございます。
 

2013/3/2~3に行われたScala Conference in Japan 2013にスタッフとして参加したので、その感想など。

・準備期間
打ち合わせや会場の下見等はほとんど参加しましたが、役に立てたかというと微妙。
積極的に引っ張ってくれる人や英語ができる人にタスクが集中してしまって、あまり力になれず申し訳なかった感じですね...。

・1日目
朝の受付と、昼のお弁当引き換えが心配でしたが、思ったほどは混雑しませんでした。
進行も、多少時間が押したりというのはありましたが、まずまずスムーズだったと思います。
ただ、セッションのあとの質問の時間で、質問者がいるかどうか確認しづらかったというのが反省点ですね。気付かずに終わってしまうケースがあって申し訳なかったです。

・2日目
準備と後片付けはありましたが、基本的にずっとコード書いてたので、ほぼ参加者な感じでした。
ハッカソンは初めてでしたが、まったりした雰囲気で面白かったです。

・番外
スタッフ間の普段のやりとりで使ったco-meetingというサービスが(まだ荒削りな感じですが)かなり役に立ちました。今後が期待できるサービスだと思います。


なんというか、個人的にはいろいろ勉強になりました。

カンファレンス自体は成功だったと思うので、次回以降も続けていけたらいいですね。
というか、まだスタッフとして残作業があるので、そこをちゃんと片付けてからですけど。

このページのトップヘ