めざましテレビ

今日の早耳ムスメ木下ココちゃん,お題は「この秋大活躍!! おしゃれニット」.
この秋大活躍がいきなりキャミソールとはさすが.
まぁ,うちの彼女も寒くなればなるほど薄着になっていきますからねぇ (当然アウター羽織るけど).
みんな風邪ひかないようにねー.
それにしてもココちゃん,帽子似合いますね.っていうか,帽子被るか髪まとめるかした方が魅力的っぽい.
シンシアローリーのニットジャケットがいい感じ.でもうちの彼女の好みじゃないかも〜.残念!!
最後のニットスカートのコーディネート,随分とギャルっぽい... でもココちゃんらしい感じで悪くないかも〜.


スタジオモデルはなぜか愛子ちゃんのみ.
今日みたいにトップスのアイテム中心なら必殺「ウェストから上しか映さない作戦」が活かせるからナカミーでも大丈夫なはずなのに!!

Prolog 写経記 その 54 gcd/3

(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.

Prologユーティリティライブラリ

Prologユーティリティライブラリ

今日は gcd/3 を写経します.

解説

gcd(N, M, Gcd)NM の最大公約数を Gcd に具体化する.

らじゃあ.

モード

gcd(+, +, -).

ふむ.

定義

では,こいつの定義を写経しませう.

gcd(N, 0, N) :-
	integer(N), !.
gcd(N, M, Gcd) :-
	integer(N),
	integer(M),
	G is N mod M, !,
	gcd(M, G, Gcd).

ふむ.
引き算じゃなくて余りを求めていく方法ですね.
でもでも,それだけって感じで特にどうという事もなく...

注記

引数 NM が整数でない場合 gcd は失敗する.

らじゃあ.

では使用例を写経しませう.

2 ?- gcd(28, 144, X).

X = 4 

Yes
3 ?- gcd(225, 37, Gcd).

Gcd = 1 

Yes
4 ?- gcd(4.9, 490, G).

No

結果もどうという事もなく...
すげー手抜きっぽいけど手抜きしたいわけじゃなく,そういう内容だからしょうがないのだ.
つまらなくてもひたすら淡々と写経するのだ.


Re: hibernateを利用してはいけない5つのシチュエーション

通りすがりさんから頂いたコメント.

「実はUserTypeのequalsメソッドあたりの実装をミスしてる」に一票

ふむ.もし Hibernate が永続オブジェクトが変更されているかチェックするのに永続クラスの equals() を使っていて,でもでもそいつの実装がヘボヘボだとなにも変更されていない永続オブジェクトを勘違いして UPDATE しちゃうかもしれない,というわけですか.
とりあえず試してみましょうか.
せっかくなので,永続クラスに埋め込みオブジェクトも使ってみましょう.


Model には firstNamelastName という二つのプロパティがあります.
このプロパティを持つ FullName という埋め込みクラスを用意しましょう.

package hoge;

public class FullName {

    private String firstName;
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public boolean equals(Object o) {
        return false;
    }
}

見ての通り,こいつの equals() は常に false を返します.
そして永続クラス Model はこいつを使います.

package hoge;

public class Model {

    private int id = -1;
    private FullName fullName;
    private Magazine magazine;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public FullName getFullName() {
        return fullName;
    }

    public void setFullName(FullName fullName) {
        this.fullName = fullName;
    }

    public Magazine getMagazine() {
        return magazine;
    }

    public void setMagazine(Magazine magazine) {
        this.magazine = magazine;
    }

    public boolean equals(Object obj) {
        return false;
    }

    public String toString() {
        return fullName.getFirstName() + " " + fullName.getLastName() + ", " + magazine;
    }
}

こっちの equals() も無条件に false() を返します.


んで,テスト用のメソッド.

    public void testHibernateTransaction() throws Exception {
        Configuration config = new Configuration();
        SessionFactory factory = config.configure("hibernate3.cfg.xml").buildSessionFactory();
        Session session = factory.openSession();
        Transaction tx = session.beginTransaction();
        Magazine magazine = (Magazine) session.get(Magazine.class, new Integer(1));
        Model model = (Model) magazine.getModels().iterator().next();
        System.out.println(model);
        tx.commit();
    }

今度はなにも変更していません.
Magazine を取得して,関連をたどることで Model を取得します.
さて Model は更新されるでしょうか?


発行された SQL

Hibernate: select 
               magazine0_.id as id0_, 
               magazine0_.title as title1_0_ 
           from 
               Magazine magazine0_ 
           where 
               magazine0_.id=?
Hibernate: select 
               models0_.contract as contract1_, 
               models0_.id as id1_, 
               models0_.id as id0_, 
               models0_.firstName as firstName0_0_, 
               models0_.lastName as lastName0_0_, 
               models0_.contract as contract0_0_ 
           from 
               Model models0_ 
           where 
               models0_.contract=?

そんなわけで (どんなわけで?),更新されませんでした.(^^;


HibernateRDB から取得したデータをセッションに保持しているのですが,それは永続クラスのインスタンスとしてではなく,ResultSet から取得した StringInteger などで保持しています.たぶん.Hibernate 2.x ではそうだったはず.
たぶん,Hibernate3 では org.hibernate.engine.PersistentContext あたり.
なので,永続クラスの equals() がヘボヘボでも

hibernateでTransactionを使用すると、同一Transaction内でセレクトした全てのオブジェクトをTransactionコミット時に勝手に更新します。

にはならないような気のせいが...


やはり,元記事の著者さんに解説をお願いしたい今日この頃です〜.


CanCam 11 月号 エビちゃんベストセレクション 11

CanCam2005年11月号の蛯原友里ちゃん

CanCam から,お気に入りの蛯原友里ちゃんを紹介しようというこのコーナー.
今日も prideglide とのタイアップ「秋のめちゃモテ♥ライフがはじまります!」から P224 の友里ちゃん.
キリッとシャープな表情の友里ちゃんです.なんか,いつもと違うでしょ?
説明しよう.
このカットは鏡に映った友里ちゃんなのだ.だから,いつもと左右反転してるわけです.
ほら,前髪もたいていの場合と逆ですよね.
そんなわけで (どんなわけで?),やっぱり CanCam 買うしか!!