今日の早耳ムスメは太田在ちゃん,お題は「癒し効果絶大!! 最新バスグッズ」.
なんてこった!!
入浴シーンがあるのに,バスタオル一枚なのに,それなのにそれなのに在ちゃんだとは!!!!
激しく落胆...
さっき書いたコメントに刺があるのはそのせいに違いない.
ごめんなさい,言い訳です.すみません.
Prolog 写経記 その 55 lcm/3
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
![Prologユーティリティライブラリ Prologユーティリティライブラリ](https://images-fe.ssl-images-amazon.com/images/I/41j7Jf4szdL._SL160_.jpg)
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
lcm/3
を写経します.解説
lcm(N, M, Lcm)
はN
とM
の最小公倍数をLcm
に具体化する.
らじゃあ.
モード
lcm(+, +, -).
ふむ.
定義
では,こいつの定義を写経しませう.
lcm(N, M, Lcm) :- gcd(N, M, Gcd), Lcm is (N * M) // Gcd, !.
・・・
そうかぁ,最小公倍数ってこうやって求めるんだぁ.
最大公約数の求め方はよく見るけど,最小公倍数の方は知らなかったよ.
一つ賢くなりました.たぶん今だけ (苦笑).
注記
引数
N
とM
が整数でないときは失敗する.
らじゃあ.
例
では使用例を写経しませう.
2 ?- lcm(31, 217, L). L = 217 Yes 3 ?- lcm(6, 9, Lcm). Lcm = 18 Yes 4 ?- lcm(3.1, 15.0, X). No
結果どうという事もなく...
すげー手抜きっぽいけど手抜きしたいわけじゃなく,そういう内容だからしょうがないのだ.
つまらなくてもひたすら淡々と写経するのだ.
といいつつ,基本的に昨日のこぴぺで所要時間 5 分くらいですが.心より恥じる.
ていうか,昨日これも一緒にやっておけばよかったよ...
Re: hibernateを利用してはいけない5つのシチュエーション
ヤドカリデンキ商会さん (id:yad-EL) に「執拗につっこみ」などと言われてしまったとです...
でもでも,ひがさんや通りすがりさんからコメントを頂いたから連日書いているだけで,決して「執拗につっこみ」しようと思っているわけではないのですが...
そんなわけで (どんなわけで?),今日はこのネタは控えようかと思っていた矢先,id:digo さんからコメントを頂いてしまいました.
hibernateの件ですが、なんらかの理由でgetterで取得する値とsetterで設定される値に差がある場合に起きるかも・・・
以前、「フィールドがnullだったら””を返すgetter」みたいなのを作ったら、毎回dirty checkに引っかかって更新が走ってしまう現象にハマったことがありました。
おぉ,この脳内補完はいけてそう.これなら無条件 (っていうのは変ですが) に更新されても不思議はありません.
さっそく試してみましょう.
例によって Model
なんですが,firstName
と lastName
の getter は null
の場合に空文字列を返します.
package hoge; public class Model { private int id = -1; private String firstName; private String lastName; private Magazine magazine; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFirstName() { return firstName == null ? "" : firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName == null ? "" : lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public Magazine getMagazine() { return magazine; } public void setMagazine(Magazine magazine) { this.magazine = magazine; } public String toString() { return getFirstName() + " " + getLastName(); } }
そしてテストメソッド.
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(); Model model = (Model) session.get(Model.class, new Integer(1)); tx.commit(); }
問い合わせというか主キーを指定して取得しているだけ.とてもシンプル♪
そして用意したデータの lastName
は null
にしておきます.
これによって発行された SQL.じゃーん.
Hibernate: select model0_.id as id0_, model0_.firstName as firstName0_0_, model0_.lastName as lastName0_0_, model0_.contract as contract0_0_ from Model model0_ where model0_.id=? Hibernate: update Model set lastName=? where id=?
更新されました!! \(^o^)/
っていうか,これで喜んでいいわけじゃありませんね.
そうですか,こういうことをやっちゃったんでしょうかねぇ?
ちなみに,このような getter を使いたい場合には,Hibernate にプロパティ (getter/setter) ではなくフィールドを使わせることができます.
マッピングファイルで次のように
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping auto-import="false" package="hoge"> <class name="Model" dynamic-update="true"> <id name="id" unsaved-value="-1"> <generator class="assigned"/> </id> <property name="firstName" access="field"/> <property name="lastName" access="field"/> <many-to-one name="magazine" column="contract"/> </class> </hibernate-mapping>
<property>
要素の access
属性で "field"
を指定するだけ.
これで先のテストメソッドを実行すると...
Hibernate: select model0_.id as id0_, model0_.firstName as firstName0_0_, model0_.lastName as lastName0_0_, model0_.contract as contract0_0_ from Model model0_ where model0_.id=?
更新されなくなります.
いちいちプロパティごとに指定するのが面倒なら <hibernate-mapping>
要素の default-access
属性でまとめて指定することも可.
フィールドアクセスは入門記ではお馴染みですね.
なんせ,getter/setter 作らないでやってましたからねぇ...
心より恥じる.
出演予定 TV 番組
情報なしですぅ...