2013年5月25日土曜日

Agile Japan 2013 サテライト<名古屋>

昨日Agile Japan 2013が開催されました。 
名古屋のサテライト会場は『モデリングxアジャイル』テーマで、名古屋アジャイル勉強会が主催で開催。
午後のワークショップは私が担当しました。
YOU&Iさんをはじめとする名古屋アジャイル勉強会のスタッフのみなさん、ドメイン駆動設計読書会@名古屋DDDNagoya) 主催のRKTMさんと参加者のみなさんのサポートによりなんとかできました。
心より感謝申し上げます。


今回は「アジャイルにモデリング」ということで、モデルの書き方ではなく、どういう『姿勢』でモデリングするかという事が主題。
特に、

  • モデルを使ってコミュニケーション
  • インクリメンタルにモデリングする

という2点を意識した内容でいきました。

今回のワークショップの準備で、スコット・W・アンブラーの『アジャイルモデリング』をそれなりにちゃんと読んでたりして、モデリングという行為について良く考えるいい機会になったと思う。
普段の仕事でも、もう少し無駄を省けるかなという気がする。

”モデリング”と言うと、表記法などモデルそのもの書き方が話題の中心となることが多い。
まあそれはとても普通の事なんだけど。
『アジャイルモデリング』は、アジャイルにモデリングに取り組む『姿勢』が語られている本。タイトルに「モデリング」という言葉がはいっていて、これだけ記法などが書かれていない本は他にないんじゃないかな。
今回のワークショップで、参加者の皆さんにその”姿勢”が伝わっていたらとても嬉しいです。


  • 複数人でモデリングするという事
  • やりすぎてわけわかんなくなる前に実装してみるという事

が、結構イイ感じである事は皆さん感じていただけたのかなと思う。

普段の仕事でも、ホワイトボードに簡単にモデルを書いて「こうじゃね?」という感じでディスカッションする事は時折あって、生産性の高いコミュニケーションになっていると思う。
ドメイン駆動設計読書会@名古屋(DDDNagoya) でも、参加者みんなでわいわいと意見を出し合いながらモデリングしたりして、これがまた楽しかったり(私はなかなか参加できていないが…)。
また、Qcon Tokyo 2013でも、原田騎郎さんの『DDD を Scrum で廻す。あるいは Scrum を DDD で廻す。』というセッションがあって、その中で複数人でホワイトボードでやるのが良いと言われていた。
そうする事によって、メンバーのモデリングスキルも上がってゆく。
もっと積極的にこのやり方を使っていきたいと思う。




2013年1月15日火曜日

ExtJS 覚書 #2 validation

Ext.data.Modelを使ったクライアントサイドバリデーション

データモデルにvalidationの定義を含めることができる。
Ext.define('User', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'name',     type: 'string'},
        {name: 'age',      type: 'int'},
        {name: 'phone',    type: 'string'},
        {name: 'gender',   type: 'string'},
        {name: 'username', type: 'string'},
        {name: 'alive',    type: 'boolean', defaultValue: true}
    ],
    validations: [
        {type: 'presence',  field: 'age'},
        {type: 'length',    field: 'name',     min: 2},
        {type: 'inclusion', field: 'gender',   list: ['Male', 'Female']},
        {type: 'exclusion', field: 'username', list: ['Admin', 'Operator']},
        {type: 'format',    field: 'username', matcher: /([a-z]+)[0-9]{2,3}/}
    ]
});

バリデートはExt.data.Modelのvalidate()で行う。
結果は、Ext.data.Errorsが返される。

var errors = instance.validate();

サーバサイドバリデーション

サーバサイドのバリデーションの結果をExt.data.Model.validate()と同じ形で得るためには、データモ
デルのproxyにreaderを正しく設定する必要がある。
 Ext.define('Employee', {
    extend : 'Ext.data.Model',
    idProperty : 'id',
    fields : [
        { name : 'id', type : 'string' },
        { name : 'firstName', type : 'string' },
        { name : 'lastName', type : 'string' },
        { name : 'gender', type : 'string' }
    ],
    proxy : {
        url : "/コンテキストルート/employeeService",
        type : "rest",
        reader : {
            type : 'json',
            messageProperty : 'errors'
        }
    }
});

このデータモデルのsave()メソッドに対して、サーバ側バリデーションを返す場合、以下のようなJSONデータをサーバは返さなければならない。
{
    'success' : false,
    'errors' : { 'id' : 'Error Message1', 'firstName' : 'Error Message 2', 'lastName' : 'Error Message3' }
}

readerのmessagePropertyの値と、JSONデータのエラーのプロパティを一致させること。
バリデーション結果は、モデルのload(), save(), destroy()メソッドのsuccess, failureコールバックの引数 operation (ext.data.Operation) から得られる。
var emp = Ext.ModelManager.getModel('Employee');
emp.set('123', 'Fidel', 'Castro', 'Male');
emp.save({
    waitMsg : 'Saving...',
    success : function(operation){ },
    failure : function(operation){
        var errors = operation.getError();
    }
});

validationの結果をformに適用する
formのmarkInvalid()を使ってvalidationの結果をformに適用する事が出来る。
var errors = instance.validate();
form.markInvalid(errors);

jax-rs(jersey)覚書 #4 自前のシリアライザー : 日付フォーマットを指定する

jax-rsはオリコウさんで、pojoがそのままjsonになって飛んでいきます。
ところが、java.uti.Dateのフィールドがイケてない形で行ってしまいました。
その結果、Ext JSのグリッドやformのdate型のフィールドに表示されず。
jsonにシリアライズするときにフォーマットの指定できないかしらと調べてみた。

まず、org.codehaus.jackson.JsonGenerator を継承したシリアライザーを作る。
serializeというabstractのメソッドを実装してあげればよい。
Date型を yyyy/MM/DD にするならこんな感じ。

import java.io.IOException;
import java.text.SimpleDateFormat;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;

public class MyDateSerializer extends JsonSerializer<Object> {

    @Override
    public void serialize(Object value, JsonGenerator gen,
   SerializerProvider provider) throws IOException,
   JsonProcessingException {

        SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
        String formattedDate = formatter.format(value);

        gen.writeString(formattedDate);
  
    }
}

そして、jsonに変身するクラスの、作ったシリアライザーを適用したいフィールドを @JsonSerialize アノテーションで修飾する
public class Person {
 
    private String firstName;
    private String lastName
    
    @JsonSerialize(using = MyDateSerializer.class)
    private Date birthday;
    

こんな感じでした。