Re: いまさらだけど、Java言語にはクロージャーがない

id:ryoasaiさんと先日会社で話した内容が、「いまさらだけど、Java言語にはクロージャーがない」にまとめられたけれど、関数リテラルが利用できるという文法の話と、引数以外の外部変数(自由変数)が参照できるという機能の話が混ざっている気がします。
前者の意味では現在の Java 6 にはクロージャがないけれど、後者の意味では Java でも内部クラスで同様なことが実現できます。他の言語が内部的にクロージャをどう実現しているか詳しくは知りませんが、クロージャを導入する土台は既にあると考えています。C/C++クロージャを実現するよりはかなり敷居が低いかと。

想像以上にガラパゴス化した日本のIT業界?」で、Groovy と Scala の比較もされているようなので、クロージャに関して、JavaScala、Groovy の違いを整理しておこうと思います。

続きを読む

メタモデルなしで JPA 2.0 の Criteria API を使う

仕様書のサンプルや Web の記事を見ると、JPA 2.0 の Criteria API を使うにはメタモデルを作らないといけないかと一瞬思うけれど、属性名を文字列で指定してもいいんですね。

メタモデルを使用する場合、

@Entity
public class Customer {
  @Id
  Long id;
  String name;
  ...
}

というエンティティに対して、

@StaticMetamodel(Customer.class)
public class Customer_ {
  public static volatile SingularAttribute<Order, Long> id;
  public static volatile SingularAttribute<Order, String> name;
  ...
}

のようなメタモデルを作って、

@PersistenceContext
EntityManager em;

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Customer> cq = cb.createQuery(Customer.class);
Root<Customer> r = cq.from(Customer.class);
cq.select(r).where(cb.equal(r.get(Customer_.name), "hoge"));
List<Customer> result = em.createQuery(cq).getResultList();

のようにするみたいですが、

メタモデルを作らずに、

@PersistenceContext
EntityManager em;

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Customer> cq = cb.createQuery(Customer.class);
Root<Customer> r = cq.from(Customer.class);
cq.select(r).where(cb.equal(r.get("name"), "hoge"));
List<Customer> result = em.createQuery(cq).getResultList();

としても良いみたいです。
自社フレームワークなどで使う場合はこちらの方が使いやすそう。
というか、アプリケーションのプログラマにこれを使いこなせっていうのは厳しくないかな? 素直に JPQL や SQL 使った方が簡単そう。

参考

直交表作成ツール

複数条件の組合せテストで、少ないテストケースでいかに網羅率を上げて品質を確保するかという目的で、直交表というツールが利用できます(詳細は最後の参考文献を参照)。
テストの条件(因子)に対してバリエーション(水準)が2の直交表は比較的簡単に作成できます。ただし、実業務で使用するとなると、水準が10くらいは欲しいところ。そこで、勉強がてら直交表を作成するツールを作成してみました。
言語は Ruby です。作成したデータも一部置いています。
http://svn.sourceforge.jp/svnroot/glad/trunk/oa-ruby/
http://sourceforge.jp/projects/glad/svn/view/trunk/oa-ruby/

使用方法

直交表の大きさを2の対数で第1引数に指定します。水準は一般的に使いそうなものを出力します。
直交表の大きさを第1引数に指定します。水準は一般的に使いそうなものを出力します。

prompt> ruby mkOA.rb 16
"OA(16; 4^5)"
 ,1,2,3,4,5
1,0,0,0,0,0
2,0,1,1,1,1
...
16,3,3,0,1,2

水準を変更したい場合は同じく2の対数で指定することができます。
水準を変更したい場合は第2引数に L^n の形式で指定することができます。

prompt> ruby mkOA.rb 32 "8^1,4^2"
"OA(32; 8^1, 4^2, 2^18)"
 ,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2,0,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1
...
32,7,3,0,0,1,0,1,1,0,0,1,0,1,1,0,1,1,1,0,0,1

つぶやき

参考文献

ソフトウェアテストHAYST法入門 品質と生産性がアップする直交表の使い方

ソフトウェアテストHAYST法入門 品質と生産性がアップする直交表の使い方

はじめて学ぶソフトウェアのテスト技法

はじめて学ぶソフトウェアのテスト技法

参考URL

大人買い

何となく気持ちが大きくなって大人買い

ハジマリノウタ【初回生産限定盤】

ハジマリノウタ【初回生産限定盤】

BEST DESTINY

BEST DESTINY

風の谷のナウシカ [DVD]

風の谷のナウシカ [DVD]

天空の城ラピュタ [DVD]

天空の城ラピュタ [DVD]

英語が苦手な大人のDSトレーニング えいご漬け

英語が苦手な大人のDSトレーニング えいご漬け

さまよう刃

http://yaiba.goo.ne.jp/
@ヒューマントラストシネマ渋谷

最愛の娘を少年に凌辱され殺された父親が犯人を追う。少年法のあり方を採り上げた東野圭吾の問題作の映画化。
犯行の残虐さや被害者の父親の感情は、ぼかされていてあまり強調されておらず、事件が淡々と進んでいく描き方がされているので、見る側が頭で考え補う必要がある。
ラストシーンで、父親が携行した猟銃が空砲だったのは、単に少年法強化を良しとするわけではないという意図の表れかな?
ただ、極刑はともかく、死ぬほどの恐怖を味わないと本当の意味で更生も難しいのはそうかもしれない。

休日出勤の振休だったけれど、休みの最終日に見るには少し重いテーマだった。

さまよう刃 (角川文庫)

さまよう刃 (角川文庫)