Hatena::ブログ(Diary)

しんさんの出張所 はてな編 このページをアンテナに追加 RSSフィード

カレンダー
2007 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 11 | 12 |
2015 | 02 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 |
2016 | 05 | 08 | 10 | 11 | 12 |
2017 | 01 | 02 | 06 | 08 | 11 |
2018 | 02 |

2013-06-27

[][]JavaEE 7 JPA 2.1の新機能コンバータ

JPAのバージョンは2.1と前バージョンから0.1しか上がっていないが、非常にいいものが追加されている。

2.1の目玉機能としてはストアド呼び出しが可能になったとかあるのだろうが、基本ストアド使いたくないのでおいらは無視する。

で、地味・・・ではなくド派手なのにあまり語られない新機能もある。

それがコンバータだ。やっときた!


これはどういうものかというと、たとえば、DB上には文字列で保存をして、Entity上はIntegerで保持するといったもの。

もちろん、ラッパクラス以外でもふつうに使えるので、アプリケーションに合わせて積極的にコンバータを作っておくと既存のDBを変更せず、かといってそれにEntity操作が引きずられない、非常に良いものが出来上がる。


コードは昨日のエントリのJPA2.0のサンプルをもとに変更してみよう。

addressという文字列型には都道府県が入っていたので、そこに使ってみる。

これをDB上は文字列のまま変更せず、Entity上で扱う場合はIntegerで都道府県コードを利用するようにしてみよう。

コンバータ作成

@Converter
public class AddressConverter implements AttributeConverter<Integer, String>{

    @Override
    public String convertToDatabaseColumn(Integer x) {
        if(x == null){
            return "";
        }
        switch(x){
            case 1:return "北海道";
            case 2:return "青森県";
            case 3:return "岩手県";
            case 4:return "宮城県";
            case 5:return "秋田県";
            case 6:return "山形県";
            case 7:return "福島県";
            default:return "あとはめんどくせ";
        }
    }

    @Override
    public Integer convertToEntityAttribute(String y) {
        if(y == null){
            return null;
        }
        
        switch(y){
            case "北海道":return 1;
            case "青森県":return 2;
            case "岩手県":return 3;
            case "宮城県":return 4;
            case "秋田県":return 5;
            case "山形県":return 6;
            case "福島県":return 7;
            default:return -1;
        }
    }
    
}



Entityにコンバータを設定する

@Entity
@Access(AccessType.FIELD)
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    public Long id;
    public String name;
    
    @Convert(converter = AddressConverter.class)
    public Integer address;
    
}

「@Convert」がそれ。これでコンバータのクラスを設定する。

グローバル設定

グローバルに設定した場合はコンバータの指定はいらなくなる。設定方法は簡単。

@Converter(autoApply = true)

これだけでその型が見つかると自動でコンバータ適用される。

そのため、上記のサンプルのようなIntegerとかラッパクラスでは利用してはいけない。

Integerを使っているところすべてに適用されてしまうからだ。



コンバータのすごさがおわかりだろうか。これでオブジェクト指向らしいコードが標準APIのみで書ける。

コレクション的なものを安全にカンマ区切りで文字列として突っ込む、取り出すとかも可能だ。


JavaSEで動かす場合、コンバータのクラスがJPAに自動登録されないためEntityと同じくpersistence.xmlまたはorm.xmlに記述するとよいだろう。

2013-06-26

[][]JavaEE 6 JPA 2.0をもう少し

Java EE 6やJPA 2.0なんてもう枯れた誰もが知っていて当たり前の技術になっているけど、おさらいで。

古いバージョンでも過去に紹介してなかった便利なものもたまには出していこうとは思う。


今回はJPA2.0。最新は2.1になっているけど、2.0ではメジャーバージョンが上がっただけあって結構大きい変化がありますね。重要そうなのに紹介してなかったのを書いてみる。


public フィールド対応

実は2.0からはアクセサメソッドは必須ではなくなった。

@Entity
@Access(AccessType.FIELD)
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    public Long id;
    public String name;
    public String address;
}

特別な値の加工がなければこれでいいんです。@Accessがポイントですね。

NetBeansはこのアノテーションつけても文句言ってきますが無視しましょう。


生コネクション取得

JTAつかってるならアノテーションでDataSourceを注入すればいいので別に必須というわけではない。が、アプリケーションサーバーを利用していないなどそうでない場合はなかなかややこしい上に実装依存だった。

それが単純になった。

public class Jpatest {
    public static void main(String[] args) throws SQLException {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpatestPU");
        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();
        Connection con = em.unwrap(Connection.class);

        System.out.println(con.getMetaData().getDatabaseProductName());
        
        em.getTransaction().commit();
        
        em.close();
        
        emf.close();
    }
}

トランザクション開始していないと取得できないので注意。

ほかにもJPA実装の独自のコネクション情報とか取得できるのでかなり扱いやすいものになったと思う。

2013-06-23

[]モナ王とモナカジャンボを食べ比べる

ロッテモナ王森永のモナカジャンボ。

大きさ

大きさはモナ王のほうが大きいか。厚さは若干モナカジャンボのほうが大きいが、誤差の範囲。


モナカの色

モナ王は黄色く明るい色なのに対して、モナカジャンボはくすんだ色。


モナカの食感

最大の違いはここ。モナ王のはふにゃふにゃしている。一方モナカジャンボはぱりぱりしている。


モナ王バニラは素直においしい。モナカ部分が邪魔をしないように作られているため、バニラアイスをスプーンを使わずに食べたいもの、モナカは手で持てるようにしただけのものといった感じ。

一方でモナカ部分の主張があるモナカジャンボはバニラ部分は甘めで、その甘さを引きずるような味。単体だとすっきりしないが、モナカとの相性でこうなっているのだろう。


つまり・・・?

おおむね、モナ王は懐かしい昔からあるふにゃふにゃ柔らかいモナカを目指しているのに対して、モナカジャンボは食感を含めて他とは違うアイスを目指しているというのが面白い。アイスであそこまでパリパリをいじできるのはすごいなぁとか。

バニラ部分は微妙にモナ王のほうが好きなので、モナ王バニラでモナカはモナカジャンボを利用したアイスを食べてみたい。


総合的にはアイスモナカはやはりカップとは違い、モナカ部分を楽しめる、モナカらしさという点でモナカジャンボのほうが上かな。


ちなみに、あの甘ったるいバニラにチョコがはいることによってすっきりとした味と森永のモナカの食感をさらに強調するチョコが板状ではいる森永の「チョコモナカジャンボ」が最強なのは変わらずで。

ただし、カロリーがさらに跳ね上がっているので、「ジャンボ」ではなくもう少し量を抑えて250kcal以下にしてくれると食べやすいのだが。同様に俺のエクレアも量半分でいいよ。なにあのカロリー。それより今のシーズンになってから発売するという時期が誤っているとしか思えない。チョコとけまくりだろみたいな。


と、少し脱線したが1年じゅうほぼ毎日アイス食べる人の意見で。

2013-06-22

[][]JavaEE 7 JSF 2.2の超簡単カスタムコンポーネント

2.2ではカスタムコンポーネントをすぐに作成、実装することができる。

XMLとかなにもいらない。

やっと来たかーって感じ。


カスタムコンポーネントのコード。


package jsf;

import java.io.IOException;
import javax.faces.component.FacesComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;


@FacesComponent(value = "custom.aoi_blink" ,tagName = "aoi_blink" , createTag = true)
public class Blink extends UIComponentBase{

    @Override
    public String getFamily() {
        return "com.example.blink";
    }

    @Override
    public void encodeBegin(FacesContext context) throws IOException {
        ResponseWriter rw = context.getResponseWriter();
        rw.write("<span style='color:blue;text-decoration:blink;'>");
    }

    @Override
    public void encodeEnd(FacesContext context) throws IOException {
        ResponseWriter rw = context.getResponseWriter();
        rw.write("</span>");
    }
}

テンプレート

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:jsf="http://xmlns.jcp.org/jsf"
      xmlns:hoge="http://xmlns.jcp.org/jsf/component">
    <head jsf:id="head">
        <title>JSF 2.2ですね</title>
    </head>
    <body jsf:id="body">
        <hoge:aoi_blink>青いブリンク</hoge:aoi_blink>
    </body>
</html>

実行結果は以下の通り。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="head">
    <title>JSF 2.2ですね</title>
</head>
<body id="body">
    <span style='color:blue;text-decoration:blink;'>青いブリンク</span>
</body>
</html>

ポイントは@FacesComponentアノテーション

2.0では名前となるvalueしかなかったが、2.2ではいろいろと増えている。

tagName要素はなければクラス名の先頭を小文字にしたものが有効となる。

createTag要素がポイント。これをtrueにするだけでタグの設定がいらなくなる。省略はfalseで従来通り。

namespace要素はxmlnsで指定できるもの。デフォルトは「http://xmlns.jcp.org/jsf/component」。


というわけで、カスタムコンポーネントを利用するのに必要なものはなくなった。

  1. カスタムコンポーネントを作る
  2. カスタムコンポーネントを使う

この2つの手順だけである。




Firefox以外では実行結果がおもしろくないので注意です。

ちなみにNetBeansではカスタムコンポーネントのクラスを作るとカスタムコンポーネントの補完もきくようになるので楽々開発できる。

2013-06-20

[][]JavaEE 7 HTML5に対応したJSF 2.2

JSF 2.2はHTML5に対応したのもポイントになっています。

というか、柔軟性はかなり意識してきていますね。

HTML5ではフォーカスの設定やプレースホルダ、カスタムデータ属性など属性による設定が柔軟に使える必要があります。

そして今後もおそらく属性はどんどん追加されていきますが、そのすべての設定をJSFがサポートするのは骨が折れます。というか、きりがありません。

というわけで、JSF2.2は属性を簡単に設定できるようになりました。


まず基本

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:jsf="http://xmlns.jcp.org/jsf"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://xmlns.jcp.org/jsf/passthrough">
〜省略〜
<form jsf:id="form">
  <input type="text" jsf:id="input1" p:placeholder="名前を入力してください"/>
</form>

「p:」の後ろにある文字列がそのまま属性として設定されます。


生成されるHTMLは以下のようになります。

<input id="form:input1" name="form:input1" placeholder="名前を入力してください" type="text" />

もちろんバリューバインディングしてもかまいません。

  <input type="text" jsf:id="input1" p:placeholder="#{hoge.attr}"/>
public class Hoge {
  public String getAttr(){
    return "名前を入力してください";
  }
}

属性名も動的に

定型のものはこれでいいのですが、属性の名前はこれでは変更できませんね。バリューバインディングできませんので。

というわけで2つ目の方法です。

<input type="text" jsf:id="input2">
  <f:passThroughAttribute name="placeholder" value="名前を入力してください"/>
  <f:passThroughAttribute name="data-hoge" value="カスタムな値"/>
</input>

f:passThroughAttributeタグを使います。複数ここに並べることができます。

出力結果はこれ。

<input id="form:input2" type="text" placeholder="名前を入力してください"
  data-hoge="カスタムな値" name="form:input2"/>

2つの属性が追加されていますね。


可変の数の属性設定

名前と値を設定できるようになりました。では、属性の数自体が可変の場合はどうしましょうか。

以下のように記述します。

<input type="text" jsf:id="input3">
  <f:passThroughAttributes value="#{hoge.attrs}"/>
</input>
public class Hoge {
    public Map<String,String> getAttrs(){
        HashMap<String, String> attrs = new HashMap<>();
        attrs.put("placeholder", "名前を入力してください");
        attrs.put("autofocus", "true");
        
        return attrs;
    }
}

ちなみにELが拡張されていますので割と自由に書けます。将来はコードでわたすようにするとしてもプロトタイプ的なのはうめこんでおいたほうがいいかもしれません。このようにも書けます。

<input type="text" jsf:id="input4">
    <f:passThroughAttributes value='#{{"placeholder":"名前を入力してください", "data-foo":"bar"}}'/>
</input>

コンポーネントバインディングも対応

コンポーネントバインディングも対応しています。

<input type="text" jsf:id="input5" jsf:binding="#{hoge.compo}"/>
UIInput compo = new UIInput();//フィールド
//コンストラクタ
public Hoge() {
    compo.getPassThroughAttributes().put("placeholder", "名前を入力してください");
}
    
public UIInput getCompo() {
    return compo;
}

最近はJavascriptフレームワークなどでカスタムデータ属性などを使うことも増えたと思います。それに対応できているのがわかりますね。

JavascriptJSFの相性がいいとは思いませんが。

2013-06-18

[]JavaEE 7 Servlet 3.1の新機能

Servlet 3.1は非同期などまぁとっつきが悪いのが目玉です。

しかし、お手軽かつシンプルによくなったものが追加されています。


それはPartです。


え?Part自体はすでにあるって?

http://d.hatena.ne.jp/shin/20090723/p1

たしかに、ちょうど4年くらい前に紹介してますね。もう4年もたってるんですね。そりゃJavaEE 6はかれた旧世代の環境だわー。誰もが知っていて当たり前の技術だわー。


ですが、当時からパワーアップしているのですよ、こいつも!

サーブレットかくのたるいので、UPLOADが対応したJSF 2.2を使います。すごいらくちんにかけますよ。

テンプレート

昨日のエントリをすこしいだけいじります。今回は先にテンプレートから。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:jsf="http://xmlns.jcp.org/jsf">
    <head jsf:id="head">
        <title>JSF 2.2ですね</title>
    </head>
    <body jsf:id="body">
        <form jsf:id="form" enctype="multipart/form-data" >
            <input type="file" jsf:value="#{hoge.part}" />
            #{hoge.text}
            <hr/>
            <input type="submit" value="送信" jsf:action="#{hoge.action1}" />
        </form>
    </body>
</html>

はい、普通のXHTMLですね。inputFileという新しいタグの存在を知る必要はありません。ふつうにinputタグのtype属性にfileを設定してjsf:valueでバインドしたいプロパティを設定します。実はこちらの方が覚えるものが少ないかもしれないという。

コード

こちらも前回のに少し手を加えます。

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.servlet.http.Part;

@ManagedBean
@RequestScoped
public class Hoge {
    String text = "初期値";
    private Part part;

    public Part getPart() {
        return part;
    }

    public void setPart(Part part){
        this.part = part;
        text = part.getSubmittedFileName();//ココ!
    }
    public String action1(){
        return null;
    }

    public String getText() {
        return text;
    }
    
}

setPartメソッドをみてください。なんとアップロードしたファイル名が取得できます。

・・・え?

はい、Servlet 3.0のときはなかったのです。たしかみんなヘッダからパースしていたと思います。


3.1というわけではないですが、JSFの場合サーブレット用のアノテーションであるマルチパートコンフィグは使えませんから、ファイルアップロード制限はweb.xmlに書くとよいでしょう。javax.faces.webapp.FacesServletはfinalですので継承してアノテーションをつけるというわけにはいきません。

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
        <multipart-config>
            <max-file-size>50</max-file-size>
        </multipart-config>
    </servlet>

個別設定にはvalidatorを利用することが可能です。


JSF 2.2 Uploadについての基本的な設定や動きはこちらを参照するとよいでしょう。

http://den2sn.hatenablog.com/entry/2013/06/18/235018

特に文字コードのところ大事です。


はい、今回はタイトル詐欺でお届けしました。

2013-06-17

[]JavaEE 7 JSF 2.2のすげーいいところ

まずはJSF2.2のすげーいいところを軽く書く。簡単で効果が大きいもの。

解説用ということで前提となる知識を減らすためにCDIもなにも使わない。AJAXもなにもつかわない。

マネージドビーン

package jsf;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class Hoge {
    String text = "初期値";

    public String action1(){
        text = "action1";
        return null;
    }
    public String action2(){
        text = "action2";
        return null;
    }

    public String getText() {
        return text;
    }
    
}

このコードから画面に登場するものは以下のものであることが予測できると思う。

  • 表示用のゲッターのみのtextプロパティ
  • 2つのアクションボタン

テンプレート

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:jsf="http://xmlns.jcp.org/jsf">
    <head jsf:id="head">
        <title>JSF 2.2ですね</title>
    </head>
    <body jsf:id="body">
        <form jsf:id="form">
            #{hoge.text}
            <hr/>
            <input type="submit" value="アクション1" jsf:action="#{hoge.action1}" />
            <input type="submit" value="アクション2" jsf:action="#{hoge.action2}" />
        </form>
    </body>
</html>

はい、普通のHTMLですね。「jsf:なんちゃら」と書くとそこはJSFコンポーネントとして認識されるようになります。jsfcを利用していた時はコンポーネント名をいれるためすべてきっちり把握する必要があったのに対してこれは非常にわかりやすい。とりあえず「jsf:id」をいれといてくれればいいため、デザイナに任せることも可能になった。

実行結果

開いた時。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0617-01.png


それぞれボタンを押したとき

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0617-02.png

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0617-03.png

JSF 1.1とかからさわってるとほんと楽になりましたね。設定ファイルはいらないし、本当にこの2つのファイルとこのコードだけでこの動き。テンプレートもそのまま。


最大のポイントはアクションベースのテンプレートのままコンポーネントベースでの開発ができるということ。

場合によっては一周まわってコンポーネントバインディングしてガリガリやれるようなの作っても面白いのかもしれない(まぁそこまではやりませんけど)。

2013-06-16

[][]JavaEE 7にJSONライブラリなんてきてなかった

javax.jsonjavadocみてみたが、どうもXMLにおけるDOM操作みたいな低レベルなのはないようだ。

かといってBeansマッピングする高機能なのもない。


うん、使い道ない。

これ誰が設計したの?なんでこれでGOがでるの?


高レベルでも低レベルでもおとなしく、jackson使っとく方がいいみたい。

※追記

低レベルAPIはEE8ではいるとかいうことらしい。けど、それならなおさらEE7で入れるべきではなかったですね。パーサーとの相互運用がきれいなAPIにならないので。

2013-06-14

[][][]JavaEE 7 超入門 8クリックでEE7Webアプリ?起動確認とか

なにが「超入門」かというとおいらにとって超入門。

まずはJavEE7なアプリを起動させることを今回の目標にする。

サンプルは過去の例を見ても大げさすぎて、でかすぎて把握しにくいので無視で。

適当にフィーリングで行き当たりばったりでいい。JavaEEとはそういう感じのゆるい誰でもお気楽極楽に触れるものですよ。肩ひじ張るようなものではない。

しかし、「NetBeansタグ」すげー久々だのう。


ダウンロード

ダウンロードはここから。

https://netbeans.org/downloads/

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-01.png

JavaEEをえらぶ。このへん。


インストール

ダブルクリックインストーラ起動。適当に押していけばOK。Glassfish 4もついてくるのでチェックを外さないように。

別途ダウンロードする必要もないのでインストーラ版がおすすめ。ダウンロードIDE上で完成するので別にいいけど。

とにかくすぐに確認ができるのでNetBeansを常用はするつもりはないけどどんなものか知りたい人はこちらで。


起動

インストールしたアイコンダブルクリックで立ち上げよう。

起動時に旧バージョンのNetBeansがあると設定を引き継ぐが、その場合、Glassfish4が追加されていないため、お手軽に試したい場合は設定を引き継がないほうがいいかも。

たぶんNetBeans 7.3.1のバグ。速攻でバグを踏むのもお約束。


プロジェクト作成

プロジェクトを作成する。

アイコンは右上のこのへんにあるのでクリック。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-02.png


ウィザードが立ち上がったら以下の順序でクリック。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-03.png


パスとプロジェクト名を入力して「次」ボタンクリック。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-04.png


Glassfish 4 とJavaEE 7が設定されているのを確認して 「次」をクリック。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-05.png


フレームワークは特別何も設定しないでよい。あとでも設定できるため。「終了」をクリック。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-06.png

これでプロジェクトの新規作成はおわり。


実行

上にある緑色の再生ボタンをクリック。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-07.png


ブラウザが自動で立ち上がり、表示する。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-08.png

NetBeansを立ち上げてから8クリックだけで新規作成からGlassfish4上でのJavaEE稼働の確認までできたわけだ。


EE7なの?

たしかにログはGlassfishが立ち上がっていることはわかるが、表示しているのがHTMLでぜんぜんEE7って感じがしない。

実はGlassfish 3とかTomcatじゃないの?といわれても仕方がないレベル。

というわけで、index.htmlを消して以下のようにJSPを書いてみる。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-09.png

うん、ちゃんとラムダ式も補完きくね。

ちなみに「<c:」とうつとtaglib設定してくれるんでまぁ楽。

    <body>
        合計=<c:out value="${[4,3,1,2].stream().sum()}" />
    </body>

ブラウザのリロード。JSPの変更程度はもちろん再デプロイは必要ない。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-10.png

JavaEE 7ではJavaSE 8より一足お先にラムダがかけるw


ここでネタに走ってStrutsでラムダを書く・・・とおもったけど、みんなやってると思うのでやめておく。

プロジェクトを右クリックして「プロパティ」を選んで、フレームワーク>追加>Strutsとやるとライブラリも設定ファイルも全部初期設定してくれるんで、やりたい人はそこから始めるとよいだろう。


いまいち定数を合計しても面白くないのでBeansを作ってそれをアクセスしてみるか。

package bean;

public class HogeArray {
    private int[] array = {2,1,4,3,5};

    public int[] getArray() {
        return array;
    }
}

とつくっておいて

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<jsp:useBean id="hoge" scope="page" class="bean.HogeArray"/>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        合計=<c:out value="${hoge.array.stream().sum()}" />
    </body>
</html>

これでJavaコードから配列をもらってEL側で合計されているのがわかる。

もちろんソートもできる。

    <body>
        合計=<c:out value="${hoge.array.stream().sum()}" />
        <hr>
        <c:forEach items="${hoge.array.stream().sorted().iterator()}" var="row">
            <div><c:out value="${row}"/></div>
        </c:forEach>
    </body>

実行

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-11.png

ちゃんとソートもされてるね。


ラムダの例。フィルタ奇数のものだけ処理してる。

    <body>
        合計=<c:out value="${hoge.array.stream().filter((num)->num%2==1).sum()}" />
        <hr>
        <c:forEach items="${hoge.array.stream().filter((num)->num%2==1).sorted().iterator()}" var="row">
            <div><c:out value="${row}"/></div>
        </c:forEach>
    </body>

まずはいろいろと遊んでみるといいかもですね。

2013-06-13

[][]JavaEE 7 登場

次の数年を支える技術の登場です。

RI(参照実装)であるGlassfish 4がでています。

また、Glassfish4を同梱したNetBeans7.3.1も出ていますので、試す場合はJavaEE版のNetBeansをDLするのが一番手軽でよいでしょう。


注目する技術はやはりJAX-RS 2です。フィルターやクライアントなど今までは実装依存の技術が必要でしたがこれが標準化されました。これにより、サーバーのみならずHTTPクライアントもApacheHttpなどではなくJAX-RSを使うのが普通になるでしょう。フィルター等もはいったことによってサーブレットAPIを扱わないでほぼすべてのことが可能になります。

JAX-RSというとすぐRESTがどうだとか説明が出てくると思いますが、無視して結構です。こいつはアクションベースの処理>Viewレンダリングをするためのものなので、つまりWeb用フレームワークであるということです。コンテナなしでテストもしやすく、はまりも非常に少ないので一番おすすめできます。


JSFは2.2になり、大幅に変わります。ファイルアップロードやアクションのような動き(ロジック=>Viewレンダリング)なども可能になりました。JSFはマネージドビーンの初期化をするタイミングがつかみにくく、アクションベースだとビューをレンダリングする前にどうすればいいかがわかりにくかったと思います。ボタンクリック時などのタイミングでのロジックを入れるのは容易でしたが、アクション的なものしか触ってこなかった人には厳しいものがあったと思いました。それが改善されます。



EEに限らないですが、開発はストレスの少ない軽い開発重視がいいと思います。Javaでの開発を無駄に重くする人がいますが、自分はそういうのは好きではありません。JAX-RSベースでサーブレットコンテナを立ち上げない開発がおすすめです。

NetBeansを利用する場合、標準のプロジェクトが軽いのでお勧めです。軽い高速な開発をする場合Mavenは利用してはいけません。

アプリケーションサーバーといえば重そうなイメージですが、Glasshfish はかるいです。遅延ロードしていますので起動も1-2秒程度とすぐです。

また、個々のプロダクトはサーブレットAPIもEE6の3.0に依存するなど古めの環境でも単独で使いやすいようになっています。EE6のときもサーブレットAPIはEE5に含まれる2.5に依存していたりしてましたので触りやすかったですが。


Web層はわりと差し替えやすい上に開発効率に直結しますので、JAX-RSJSFを試してみてはいかがでしょうか。DBアクセスなどは政治が絡みやすいと思うのでDAOのままで後回しでもよいと思います。

2013-06-12

[]Nintendo Direct @E3 2013 出展映像 まとめ

スマブラ更新しました

ドンキーコング追加しました

備忘録的な。あとで見直すのに便利な。

ゼルダの伝説 風のタクトHD

D

GCリメイク。1080Pと公式でいわっちが言ってる。


ポケットモンスターX・Y

D

新しいタイプが追加。ドラゴンタイプに強いとのこと。


ピクミン3

D

対戦もある感じ。


スーパーマリオ3Dワールド

D

3Dタイプで同時プレイは厳しいんじゃと思ったが、ダンジョンマスター(もちろんMSX版の3人同時アクションRPGのこと)やダンジョンエクスプローラーとかそんな感じでワイワイ遊べていい感じに見える。

この方向に成長要素つけて多人数で遊べるマリオRPGとかもあるといいかもですね。


スマブラ最新作

D

D

D

D

むらびとが極悪キャラに。

ロックマンは音楽と効果音がずるい。おっさんは反応してしまう。

しかし、トレーナーって。バランスボードのほうがまだゲームっぽいというのに。WiiFit上でもくねくねうごくし。


マリオカート

D

とりあえず画質は影響しやすいゲームだと思うのでいいですね。

リトライとかロード時間gな短いといいのだけれども。7はDS版よりその辺がもっさりだったのがちょっとつらい。


モノリスソフト大作RPG

D

今回の映像見てるとゼノブレイドを思い出す感じなのを意識して作ってるかも。

この映像にくらっと来た人はゼノブレイド買うといいですよ。


ベヨネッタ2

D

ダイレクトよりこっちの映像が大幅に追加(というか編集か)されてる感じ?

ドンキーコング トロピカルフリーズ

D

面白そうな仕掛けたくさんありそう。

2013-06-06

[][]世界樹の迷宮4 クリア

ちまちまと寝るまえに15〜分ずつやってクリア。こういうRPGはやはり携帯機は強い。

前作と同じような項目で書いていく。

http://d.hatena.ne.jp/shin/20100503/p1


ボリュームについて

3よりボリュームは少ない気がした。

1つの層は3フロア。さらに小迷宮が3つくらいあるので迷宮そのもののボリュームが少ないわけではない。大地もあるわけだし。

これは前作以上にサクサク進みやすいことが原因だろうか。

経験値が入りやすく、LVが上がりやすく感じた。もともと世界樹シリーズはLVがさくさくあがるのが特徴ではある。

前作は攻撃力やスキル倍率が非常に抑えられていて爽快感にかけていた。雑魚戦でも長引く戦闘。それが今作では改善したため、さくさくすすむのだろう。


難易度について

難易度は前作より低いと感じた。全滅するのは序盤だけだろう。中盤以降からFOEは初めてであっても倒すことが可能、2連戦くらいはできるとかなり余裕があった。

ただし、今作はTP回復アイテムが絶望的に入手できずそのほかのアイテムもかなりの貴重品。今までのシリーズで最もアイテムを使わなかったと思う。結果こまめに町に戻ることが多く感じた。そのため全力で雑魚戦を行いやすかったのかもしれない。

正確には使えなかった、だが。その結果素早いキャラの価値が大幅に減ってしまった。今までは素早い回復アイテムでピンチを救うというのが多かったが、今回はそんな余裕はない。

序盤のFOEやボスを除くと最も苦戦したのが3層のボス。HPが異様に多く、アホみたいに時間がかかった。弱くする方法はあるとのことだが、まわりこんでいけば大丈夫・・・とおもったら左は行き止まりだった…それで仕方なく戦ったのだが。


NPCについて

今回は各層のボス戦の前にNPCを仲間にして進むことができる。これは非常にいい仕組みだと思ったが、キャラによって前衛後衛がわかれている。そのため、そのキャラが戦えるように配置しようとすると、こちらのメインキャラ達の戦力が大きくそがれたりするためそこだけはなんとかしてほしかった。前衛後衛どちらも戦えるように装備やサブクラスをかえてくれるとかそういう仕組みがほしかった。

改良されたスキルシステム

LVに応じて覚えることが可能なスキルが制限されるようになった。その結果最短で一番使えるスキルを取っていくという楽しみ方は減ったが、結果バランスが崩壊しにくくなったのは良いことだと思う。また、サブクラスは半分のスキルレベルまでしか取れないように改良された。

2ではスキルの倍率の暴走があり、3で抑えすぎてコンボを決めないとかなりいまいちになり、パッシブゲー化してしまっていた。

4では倍率とTPのバランスが全体的に改善しており、すさまじい倍率の技が出るようになった・・・と思わせて、実は倍率がかかるスキルは重ねると効果が弱くなるようになった。その結果、単体で使った場合もしっかり効果を発揮し、重ねた場合も崩壊することなくしっかり強くなるのがわかりやすくなった。

パッシブ系は後半のポイント(最大8ポイントのスキルならば5ポイント以降)での伸びが大幅に弱くなり、サブクラスの立場が単体で使う場合、不当に弱くなることはなくなったが、そのかわり、伸びが悪いといえども、重ねると倍率低下をおこすため、実は意外と効果が発揮されるという非常に素晴らしいバランスになった。単体で使うなら半分のポイントしかつかえないサブクラスでもきっちり効果が出る。それでいて、いろんなスキルを組み合わせて最高のダメージを出したい場合はしっかりと考えないといけないとなったのだ。おもしろい。すばらしい。


わかりにくい2刀流システム

2つ装備できるようになったが、基本左手で攻撃できるわけではなく、その武器に対応したスキルが使えるようになるだけというのはわかりにくいと思った。たしかに、サブクラスを考えると複数の種類の武器スキルを使えるほうがバランスはいい。入手した武器がスキルの関係で持ちにくいといったことが減るためだ。

しかし、防御を捨てているわけなのだから何とかしてほしかったところ。個人的には左手攻撃のスキルはナイトシーカーがもっててもいいが、それがなくとも30%くらいのダメージで2回攻撃するとなっているとよかったかも。ナイトシーカーのスキルでその倍率が増えていく、と。2回攻撃するとその分バーストのチャージがしやすい、リンク系のスキルが反応しやすい、となれば価値はあるだろう。

あと、両手に武器を持っていても盾が持てるというのもわかりにくいと思った。ふつうは装備できないと思ってしまうよね。


大地について

前作のパズルゲーもそれはそれで面白かったが、純粋にマッピングできる今作のほうがやはりいいと感じた。ただし、高さの概念がマッピングを複雑にしており、高さの概念はなくした方がよかったのではないかと感じた。せいぜい1段階上昇くらいで、序盤は低いところを動く、後半は高いところを動く程度でよかったのではないか。


鍛冶システムについて

世界樹は割と武器や防具をどんどん変えていくシステムなため、前作の鍛冶システムは使いにくかった。

それが、今作では素材のみで手軽に鍛冶ができるようになった。これはうれしい。

のだが、鍛冶素材がそうそうてがるに入手できるはずもなく、スロットがない武器も多く、思ったより生かし切れていない感じだった。そもそもATKとSTRって分けてる意味あるの?みたいなのとか。

前作よりはいいけど、素材を絞ることによって武器そのものが入手できないものも多くでたと感じた。完全に0エンではなく、武器の価格の1/10+入手しやすい素材くらいでよかったんじゃないかな。


音について

シリーズとしてみてもそこまで悪くはない。が、FM音源を捨てた今作はやはり違うと感じた。

特に3作目はFM音源の使い方が素晴らしく、どれもが名曲という感じで全盛期のYK-2を思い出す完成度だった。

それとくらべるとやっぱりおちるよな、みたいなのはある。いや、ほんと悪くないんだよー。でも、前作が頂点いっちゃったので。ねぇ。

3の大航海クエストのアレンジ曲があるが、それもかなりひどいし。

戦闘曲は前半のがかなりバランスよくてよい。終盤の戦闘曲は曲の後半部分がすごく嫌い。ボスの曲もまぁわるくはない。ラスボスはあんま覚えてないレベルで。3のラスボスはザスキームとか全盛期をおもいだすレベルなのでそれと比較してはいかん。

迷宮の曲もわるくはないけど、1層と4層以外ぱっとしない感じ。1層はお約束なのであれだし、事実上4層のみというか。


自分がメインで使用したクラスの感想

ソードマン

復活職業にして、やっとスタンダードな物理戦士職が完成された。今までのソードマンとかスタンダードな戦士タイプかと思わせてイロモノすぎてなんじゃこりゃという職業だったのがおかしい。

そもそもチェイスというのがこのシリーズでたびたび出るが、かなり使いにくい。属性を合わせると追撃するということで、魔法全体攻撃に合わせる程度。

それが今作では名前がリンクとなり、まず特定の属性攻撃。同一の敵に誰かが物理属性、関係なく攻撃を加えたら追撃発生というものに変更されている。ソードマン自体素早い職業ではないが、防御を捨てて最初に行動するスキルを持っているためそれとの組み合わせが非常に強い。固有スキルもあり、集中して攻撃が非常に強力だ。

また、盾スキルで敵単体の攻撃力や属性攻撃力を下げることも可能。そのおかげでPTの生存率を大幅に上げることもできる。もちろん、物理攻撃、物理防御のスキルも備えており、自分と同じ列の見方を守るスキルもありと非常にバランスがよく使い勝手が良い。使っていて楽しい、それでいてバランスを壊さない、完成された職業だと思う。サブで利用しても非常に使いやすい。

1作目からだいぶ時間がたったが、やっとソードマンがスタンダードな戦士になれた。


ナイトシーカー

状態異常にするスキルをたくさん持ち、状態異常になった敵に大ダメージを与える職業。状態異常はどうしても運頼みであり、安定はしない。左手での攻撃があるため、通常攻撃力は高いものの、STRやスキルなどの関係でソードマンとくらべて強いわけでもない。素早さが売りではあるが、アイテム役は前述したとおり動けず、微妙なところだ。最初から最後まで使ってみたが、うたれ弱く、総合的に見てはずれ職業だと思う。

状態異常職業としてミスティックも存在するため、サブとしてとらないと状態異常がかかりにくい、その場合にどちらの状態異常スキルを使うべきなのかなどを考えても微妙である。

瞬間的にはすさまじいダメージは出るけど、安定して化け物みたいなダメージを出せるインペリアルがあるのもマイナスだよなぁ・・・。ロマン職にも慣れてない感じ。せめてアイテムが使い勝手がよかったら高AGIが生きてたとは思うんだけどね。サブミスティックでいざというときの全体回復程度か。

サブとしても微妙。


ダンサー

非常にバランスの良い職業その2。

ダンススキルは本人の枠しか圧迫せず、同一列に効果を及ぼす。固有スキルのおかげでダンスの効果は非常に長く、踊りながら攻撃や回復などを入れていくことができるのが強い。また、回避率を高めるスキルや本人の素早さが高いこと、敵をスタンさせるスキルがあることなど本人の攻撃もそこそこ強い。

ダンススキルには物理攻撃や物理防御を増やしたり、状態異常を毎ターン直したり、敵に買うんtなーを喰らわせたりとかなり強い。特に強いのがターン終了時HPを回復させるワルツスキルだ。これがあればメディックのヒール系はいらない。ヒール系は発動が遅いため、ワルツスキル中にのみ可能なヒールダンスをつかうのがよい。回復量はしっかりあり、消費は少なめ、発動速度にペナルティもない。毎ターン回復と併せて即死系が来ない限りこれだけでほぼもつ。

隊列移動でターンを消費しなくなったことと、ダンサーは弓を装備できることなどもあり、何をしても強い。できればサブでもいいので前後に1人ずつ配置するとよいだろう。リジェネワルツで毎ターン最大HPの5割が回復するのがよわいはずがない。しかもMP消費が少ない。


メディック

復活職業その2。回復特化&殴りもち。基本行動速度が遅く頼りにくい。リザレクトする時にはいいけど。中盤くらいまでは戦後手当をがっつりふることで圧倒的安定感を与える。オートヒールやオートリザレクトがあるのはいいけど、正直かなり弱い。状態異常回復があるけど、それならサブでとってもいいし。メインメディックでやってたけど、よくよく考えると回復スキルはほとんど使わなかったので実は中盤以降は結構地雷なのかもしれない。

HP全開スキルなんて1度も使わなかった。サブとして使う場合はルーンマスターにしか・・・微妙。


ルーンマスター

過去作と比べて属性攻撃使い、いわゆる魔法使いのポジションだが、こいつも今作で最も完成されたものとなった。

理由は2つある。

1つは敵に前列や後列などの隊列が追加されたことによって、遠距離攻撃の意味合いが出たこと。今までは前衛はどの敵も問題なく攻撃可能だったが、近接武器は敵の後列に対してはダメージが減ってしまうようになったのだ。

2つ目は、序盤から範囲攻撃が使えるようになったこと。RPGにおいて魔法は範囲攻撃を可能とするすばらしいもの、という位置づけがあった。古くはDQ2のバギ、WIZのマハリトなど。しかし、世界樹は伝統的に属性スキルは単体小ダメージ、全体中ダメージ、単体大ダメージのような段階がつねにあるため、序盤に範囲攻撃を入手することができなかったのだ。それが、なんと最初のスキルはすべて範囲で単体がない。実際ンその方がバランスが壊れにくくてよいだろう。


ミスティック

ナイトシーカーよりTP消費は多いが、全体に効果&持続効果というのは面白い。単に発動ターンに状態異常をかける場合、きかないとがっかりすることも多いが、これの場合とりあえず陣をひいておけばHPは回復するし、そこからの別の行動もできるし、そのうち状態異常がかかるかもしれないし、とかなり面白い職業となった。カースメーカーのようなものはつまらないよね。ダメージ系の職業から状態異常を奪って分離しただけじゃないの?みたいになるし。そういう意味では単体状態異常は属性攻撃もちがもってるほうがいいかなぁ。


モノノフ

羅刹はバランスが悪いかなとは感じる。固有スキルはいいとしても。つかいにくいからいいのかもしれないけれども、時間をかければTPが全開可能ってのはあんまり好きな感じではない。インペリアル並に効率が悪いならまだいいけど。とりあえずサブでいれとけばTP回復手段が付くってのはすきじゃないなぁ。

固有スキルとマスタースキルの通常攻撃HPとTP回復はいいとは思う。


全体を見回して

ダンサーとソードマンが非常に使いやすい。サブクラスがない初期はほぼ回復もメディックのみなのでメディックいれてこの3人は鉄板か。

インペとかおかしい数値が出るのもあるけど、全体的にシリーズで一番バランスがとれていてや楽しさが強めで嬉しい。

属性攻撃使いがはじめて範囲攻撃要員として使われたのもよかった。属性攻撃キャラが範囲があんまり得意でもないとかちょっとね。



5段階評価

以下いつもの5段階評価。

 評価
システム★★★★★
シナリオ★★−−−
サウンド★★★★−
グラフィック★★★−−
総合評価★★★★★

前作よりシステムやバランス調整がうまくいっているためゲームとして面白くなったが、シナリオやサウンドでやや劣るといったところ。

ただ、たまにはFOEとかで極悪なのがあってもいいとは思う。終盤は特にFOEが単純に刈る対象になっちゃってる気がするので。

隊列ができたのだから槍とかで中衛武器ってことになると前作のファランクスみたいなのが使いやすくなっていいと思った。ただ、敵の前後は見にくいので今後はそれを改善してほしい。

ただし、世界樹の特徴でもある封じはやっぱり微妙かなぁとかおもた。

あとずっと言い続けてるけど、上のダンジョンの3D表示では曲がれるかどうかがわからないというダンジョンRPGの基本がなってない。左右に曲がれるかどうか確認するためにいちいち左右を向かないといけないのはダメだと思う。


2013-06-02

[]ワカメを食べ比べる

用意したのは壱岐鳴門三陸岩手)。

ワカメの旬なので。

戻す前の磯の香り三陸が一番強く、続いて鳴門。たぶん、塩の量と比例していると思われる。

戻した後の色は鳴門が一番k緑色に近く、三陸が一番濃い色となっている。

何もつけずに食べる。

食感が一番強い(かため)のは鳴門。次に壱岐三陸が一番弱い。

続いてポン酢でたべる。うむ、どれも同じくうまい。

見た目としては壱岐のが一番植物っぽい(表現として微妙だが)感じで、三陸が一番滑らかな感じ。おそらくこの3つを並べた場合三陸だけはすぐに見分けがつくと思う。


問題は、普段見慣れている、食べなれているのが生まれ故郷のせいで三陸であるということ。たべて、見て、そしていつも通りの味、食感と感じてしまい何とも面白みがないため、それ以外の産地が斬新に、よく見えてしまう。

そういう点を含めてなので一応参考程度で。

サラダとして使う場合は壱岐鳴門三陸という順位に感じた。食感なら鳴門がいいが、バランスでは壱岐かなぁと。

みそ汁などの料理ではまた大きくかわりそうではあるし、おそらくワカメの場合同じ産地でも加工の工場によって味が大きく変わりそうでもある。



とりあえずしばらくワカメみたくない…。

[][]森田和郎氏が亡くなっていた

http://book.mycom.co.jp/blog/shogi/2013/06/01/3063/


森田将棋といえば有名なソフトではあるが、知名度的にはミネルバトンサーガやジャストブリードという作品のほうが有名かもしれない。コンシューマ用RPGがもっとも勢いがあった時代であるし。

また、歌謡曲、CMの曲やドラクエの曲で有名なすぎやまこういち氏がゲーム音楽を始めるきっかけにもなっていたソフトでもある。

http://www.nintendo.co.jp/ds/interview/ydqj/vol1/index2.html

ニュースというにはなくなった日から時間がたちすぎてはいるが、これは記しておかねばなるまい。