金曜日はエビユリDay

さぁ,明日金曜日は1週間待ちに待った蛯原友里ちゃんの出演番組放送日です.

23:00-23:30 TBS 「恋するハニカミ!」
プロ野球中継があるので延長に注意.
出番は少ないですが,それでもいいのだ.メインのゲストは小野真弓らしい.
深夜02:10-02:30 フジ 「プレミアの巣窟」
ファン必見,友里ちゃんをたっぷり堪能できる史上最高,空前絶後の番組.
予告では「キャイーン暴走!?」となっているのですが,天野ぉ,暴走して友里ちゃんに失礼なことするなよぉ!餌食にするなら後ろの女子大生にしたまえ.

うぅー,待ちきれん!

CanCam 6月号

日付が変わって発売日(23日)になったので,早速コンビニで購入してきました.あ,一言いっておきますが,決してCanCam蛯原友里写真集と間違えて買ってきたわけではありませんよぉ.あくまでも,彼女と楽しく会話するためのネタとして買ってきただけです.その証拠に,JJとRayも一緒に買ってきました... 心より恥じる.
とはいえ蛯原友里を応援するこの日記としては,友里ちゃんを取り上げないわけにはいきません.ということで(いみふめ),レポートです.


実はひそかに友里ちゃん半年ぶりの単独表紙を期待したのですが,今月は押切もえちゃんでした.残念.しかし,もえちゃん単独表紙はこれが初めてだったんですねぇ.すっごく意外です.それじゃしょうがないかなぁ,と一応納得.来月は是非とも友里ちゃん単独表紙でお願いしたい.>CanCam編集部
テレビ出演の影響もあるのか,友里ちゃんの登場ページは以前より少ない気がしないのでもないですが,その分(?)大きめの写真が多いのでよしとしましょう.
なかでもP30〜P39にかけてはかなり満足できる写真の連続.もう最高!
予想はしていましたが,水着のコーナーでは出番なし(苦笑).
もはやこれがなければCanCamではないと言っても過言ではない,「優OL vs エビちゃんOL」という1ヶ月CD(コーディネート)のコーナーでは,6ページに渡って1ヶ月分30+2カットの友里ちゃんが怒濤のごとく掲載されています.特に注目はP123,髪をアップにしています.これまた最高.
P176ではバイクの後ろに腰掛けているのですが... すげー脚ほそー!なげー! 体うすー! こういうスレンダーなスタイル大好き! あぁ,これはグラビア系が好きな人には通じないんだろうなぁ.
P307では珍しくバンダナ巻いてます.こうやって見ると若い頃(二十歳くらい?)と印象が変わってないんだなぁ,と変に感心.友里ちゃん,テレビで見ると年相応(24歳)な感じだけど,CanCamで見ると二十歳くらいかと思うような写真が多い気がします.最初,山田優ちゃんより年上だとは思ってなかったもんなぁ.っていうか優ちゃん絶対二十歳に見えないってことですが.
P27の「CanCamモデルリレー連載」では3回目にして友里ちゃん登場.今月買ったもの大公開ということなんですが,「友里にそっくり!?のブライス人形」... うーん,似てるか?
今月のCanCamはちょっと薄めとはいえそれでも500ページもあるため,まだざっとしか見ていませんが,こんなところかな.いやぁ,当分楽しめそうです.


その他今月号で目に付いたのは,ちょっと前からCanCam専属になった徳澤直子ちゃん.Seventeenだったかで人気のあった子らしいけれど,そこら中に出まくってます.この子もここ数年のCanCam顔(目が離れ気味で口が大きめ)ですねぇ.いずれ優や友里ちゃんが卒業した後のエース候補なのでしょうか.


という具合に何人かまぶしてみたので,出勤前にぐぐってみてください>ひがさん
ちなみに臼田あさ美のどアップきれいめ写真も何枚かあるので見てみそ>まこたん

ZaizenerOff(仮) tpircs教祖の総回診です

「多少おかしくないと正気ではてなでZaizener集めて,総回診なんて実行したりできんよ!」 ってことで、ちゃんちゃらおかしいかもしれませんがid:koichikさんの呼びかけにより実現です! 乾杯の音頭は「無念だ・・・」で(w。

総回診日時 4月28日。
場所とか店とかどうしましょーかね? 川崎がいいですかね? 当方、川崎 or 品川 or 新橋キボンヌです。 参加資格は「Zaizenerとは何か知っている」「Zaizenerとは何か気になる」「Zaizenerには興味ないけどなんとなく」でいいですかね? > Zaizenerの皆様。

ということでZaizenerの皆様,結集しましょう.
参加表明はtpircs教祖の日記にコメントでお願いします〜.
Wiki作ってくれちゃってます.
http://www.wikiroom.com/tpircs/?ZaizenerOFF
もうそういう時代なんですねぇ.自分にはそういうフットワークみたいなのが足りてないなぁ.

お仕事スタイル

  • 黒のジップアップブルゾン(VIKTOR & ROLF Monsieur 03-04AW)
  • 黒とグレイのボーダーニット(BURBERRY Prosum 03SS)
  • 黒のベルベットパンツ(JIL SANDER 03-04AW)
  • 黒のショートブーツ(JIL SANDER 03-04AW)

もうブーツはありえねーだろって感じなんですが,パンツのすそ幅が16cmだったかな? 超細いのでついついブーツに合わせたくなってしまいます.

Spring Framework 入門記 Transactionその3 JTA

今日は待ち時間の長い作業をやっているため普段より早めの入門記,今回はJTA(Java Transaction API)を使用します.
JTAといえば,先日書いた「JTA/JTS」なんですが,はぶさんの日記からたどって来てくれた人がたくさんいらしゃるようで.リファ見てる限り過去最高です.それまでは「僕の生きる道」のキーワードからが最高だったのですが,さすがはぶさん,人気ドラマを越えてます.すごいなぁ.
その「JTA/JTS」で書いたように,JTAはX/Open DTPの焼き直しのような仕様で,

UserTransaction
アプリとトランザクションマネージャ間のインタフェース.X/Open DTPのTXに相当.
XAResource
トランザクションマネージャとリソースマネージャ間のインタフェース.X/Open DTPのXAに相当.

という二つの主要なinterfaceがあるのですが,JTAにはもう一つ,

TransactionManager
アプリケーションサーバ(コンテナ)とトランザクションマネージャ間のインタフェース.

というのも用意されています((JTAを実装するには他のinterfaceも理解する必要がありますが,ここでは不要ということで他は無視.)).
X/Open DTPの頃は,TMは事実上TPモニタそのもので,独立したコンポーネントという扱いではなかったのですが,JTAでは一つのコンポーネントとしてプラガブルに扱えるようにデザインされているのですね.
これらのinterfaceのうち,XAResourceは通常JDBCドライバの一部として提供されたりします.そして,UserTransactionTransactionManagerは,JTAの実装が提供します.


Springでは独自のJTA実装を提供していませんが,別途JTAを用意して利用することができるようになっています.
そのためには,前回まで使ってきたDataSourceTransactionManagerに代えて,JtaTransactionManagerを使用します.これも当然,PlatformTransactionManagerimplementsしたクラスです.
JtaTransactionManagerは,次のプロパティを持っています.

  • userTransaction
  • userTransactionName
  • transactionManager
  • transactionManagerName
  • jndiTemplate

このうち,userTransactionNametransactionManagerNameは,JNDIからルックアップしてそれぞれのインスタンスを取得する際に設定します.その場合は,InitialContextの初期化に必要なプロパティ(Propertiesの意味のプロパティ)をjndiTemplateに設定します.
JNDIを使わない場合は,userTransactionおよびtransactionManagerを設定します.
なお,userTransactionimplementsしたクラスがTransactionManagerimplementsしている場合は,transactionManagerまたはTransactionManagerNameの設定は省略できます.これ,逆でもいいと思うんですけどねぇ.インタフェース的にUserTransactionTransactionManagerのサブセットなので,TransactionManagerが設定されていればUserTransactionは設定しなくてもいいっていう方がいいような気がするのですが... 無念だ.
SpringでJTAを使うのに必要なことは以上でOKみたいです.


それで次はJTA実装を用意するわけですが,通常はアプリケーションサーバが提供するJTA実装を使うことが多いのだろうと思われます.しかし今回は,我らがひがさんによるJTA実装,S2JTAをSpringで使ってみることにしましょう.S2JTAはS2のコンテナとは独立しているということで,たぶんSpring上でも使えるとひがさんの03/25の日記に書かれていたので,いつかやらねばと思っていたのです.ついに,その日がやってまいりました!
ということで,S2JTAを見ていきます.
S2JTAはS2コンテナからは独立しているのですが,そのS2JTAをS2コンテナに組み込むための設定ファイルがj2ee-config.xmlです.その解説が「コネクションプーリング」というドキュメントにまとまっています((ConnectionPoolImplxaDataSourceというプロパティはXADataSourceが正しいと思われ>ひがさん)).なるほど.これをそのままSpringの定義ファイルに持っていけばよさげです.
必要なコンポーネントは次の4つです.

org.seasar.extension.jta.TransactionManagerImpl
TransactionManagerimplementsしたクラス.文字通りのトランザクションマネージャです.
org.seasar.extension.dbcp.impl.XADataSourceImpl
XAResourceimplementsしたクラスで,普通(XA非対応)のJDBCドライバをJTAで使えるようにしてくれます.
org.seasar.extension.dbcp.impl.ConnectionPoolImpl
いわゆるコネクションプールで,トランザクションマネージャと連携して,トランザクション終了時にコネクションをプールに戻してくれたりします.
org.seasar.extension.dbcp.impl.DataSourceImpl
DataSourceimplementsしたクラス.コネクションプールをDataSourceとして使うためのアダプタという位置付けみたいです.

このように,トランザクションマネージャと連携するコネクションプール上にDataSourceを用意してくれているので,SpringのDataSourceUtilsのようなものが不要なんですね.さすが.
ちょっと問題になったのは,(2.0.5以前の)S2にはUserTransactionimplementsしたクラスが存在しないこと.S2で使う分には必要ありませんからねぇ.ということで,S2のTransactionManagerImplを次のように修正しました.

public final class TransactionManagerImpl implements TransactionManager, UserTransaction {

先ほども書いたように,UserTransactionTransactionManagerのサブセットなので,新たにメソッドを実装する必要はありません.この修正はS2の新しいリリースに含めてもらえるみたい? です.


さて,それではSpringでS2のJTAを使うための定義ファイルです.基本的に前々回TransactionProxyFactory版をベースに,JTA対応を行いました.こんな感じです.

<!-- S2の設定 -->
<bean id="jtaTM" class="org.seasar.extension.jta.TransactionManagerImpl"/>
<bean id="xaDataSource" class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
    <property name="driverClassName"><value>org.hsqldb.jdbcDriver</value></property>
    <property name="URL"><value>jdbc:hsqldb:.</value></property>
    <property name="user"><value>sa</value></property>
    <property name="password"><value></value></property>
</bean>
<bean id="connectionPool" destroy-method="close" 
    class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
    <property name="transactionManager"><ref bean="jtaTM"/></property>
    <property name="XADataSource"><ref bean="xaDataSource"/></property>
</bean>
<bean id="dataSource" class="org.seasar.extension.dbcp.impl.DataSourceImpl">
    <constructor-arg><ref bean="connectionPool"/></constructor-arg>
</bean>

<!-- Spring TMの設定 -->
<bean id="springTM"
    class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="userTransaction"><ref bean="jtaTM"/></property>
</bean>
<bean id="debug" class="org.springframework.aop.interceptor.DebugInterceptor"/>

<!-- アプリケーションの設定 -->
<bean id="foo" 
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="target">
        <bean class="study.Foo">
            <property name="dataSource"><ref bean="dataSource"/></property>
        </bean>
    </property>
    <property name="transactionManager"><ref bean="springTM"/></property>
    <property name="transactionAttributes">
        <props>
            <prop key="insert">PROPAGATION_REQUIRED,+java.lang.UnsupportedOperationException</prop>
            <prop key="update">PROPAGATION_REQUIRED,-java.io.IOException</prop>
            <prop key="*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
    <property name="postInterceptors"><ref bean="debug"/></property>
</bean>

うん,やっぱりTransactionProxyFactoryの方が素敵!(キラッ)
S2JTAの設定のところは,ほとんどj2ee-config.xmlのパクリです.
そして,SpringのTMとしてJtaTransactionManagerを定義しています.そのuserTransactionプロパティには,S2JTAのTransactionManagerImplを設定しています.これはTransactionManagerでもありますから,transactionManagerプロパティの設定は省略しています.
残りのお試しクラスFoo前回と同じ,実行用のクラスは前々回と同じです.
それを実行すると...

 Debug interceptor: count=1 invocation=[Invocation: method=[public void study.Foo.createTable 以下略
 Debug interceptor: next returned
 - Initiating transaction commit
 Debug interceptor: count=2 invocation=[Invocation: method=[public void study.Foo.insert 以下略
 Debug interceptor: next returned
 - Initiating transaction commit
 Debug interceptor: count=3 invocation=[Invocation: method=[public java.lang.String study.Foo.query 以下略
 Debug interceptor: next returned
 - Initiating transaction commit
 Ebihara
 Debug interceptor: count=4 invocation=[Invocation: method=[public void study.Foo.insert 以下略
 - Initiating transaction commit
 Debug interceptor: count=5 invocation=[Invocation: method=[public java.lang.String study.Foo.query 以下略
 Debug interceptor: next returned
 - Initiating transaction commit
 Yada
 Debug interceptor: count=6 invocation=[Invocation: method=[public void study.Foo.update 以下略
 - Invoking rollback for transaction on method 'update' in class [study.Foo] due to throwable [java.io.IOException]
 - Initiating transaction rollback
 Debug interceptor: count=7 invocation=[Invocation: method=[public java.lang.String study.Foo.query 以下略
 Debug interceptor: next returned
 - Initiating transaction commit
 Yada

かーんぺき!!


と,こんな感じなんですが,これで早くもトランザクション編は終わりにしようかと.まだプログラマティックにトランザクションを扱うとか,アプリケーションサーバ上で使うとかがドキュメントにはあるのですが,あまり興味をもてないもので.心より恥じる.
ということで,次回からは「Chapter 7. Source Level Metadata Support」に進みたいと思います.「AOPその14 Metadata-Driven Autoproxying」でやったメタデータのことなのかな? それにいきます.