« 4月 2006 | Main | 2月 2006 »

2006年03月31日

久々に

特に書く事もないんですが、取りあえず近況報告でも。

北海道から帰って以来、ここ最近ずっとFINAL FANTASY XIIしかやってませんでした。
いやぁ、3年ぶりにやるRPGは本当面白いですわ。

こんな遊び惚けてるとどんどん駄目になるんだろうなー。
買ったばっかの技術書も全く目を通してないです。
定期購読のJavaWorldも積みっぱなし・・・。
せっかく短眠法で作った時間も全てFFへ投入。

一体何やってんだろーね俺は。

Posted by Akishin at 12:04 午前
Categories: その他
|

2006年03月21日

北海道旅行その2

北海道旅行二日目は、有名な摩周湖へ。

雪の降る中苦労して辿り着いたものの、 生憎の天気で何も見えません・・・。
やっぱり時期を選ばないと駄目ですね。
仕方ないので、摩周ブルーというソフトクリームを食べて帰ってきました。

微妙な青さが一体何の青なのかは不明。
味の方も色と同じく微妙な感じでした。

で、このまま帰るのも何なので、帰りにタンチョウヅルを見て行く事に。

といっても、みぞれみたいな雪が降り続く中、結局じっくり見てる余裕もなくてさっさと写真だけ撮って帰ってきちゃったんですけどね。
とことんついてないです。

こんな感じで大変だった二日目ですが、最後にはいいもの見れました。

虹の根っこをちゃんと見たのって生まれて初めてかも。
ラッキー♪

んで最後三日目。

あちらではわりとメジャーらしい「スパカツ」 を食べてきました。
味は・・・フツーにトンカツとスパゲティって感じ。

なんだかんだといろいろあったけど、なかなか楽しい旅行だったように思います。
でもできれば今度は観光シーズンに行きたいもんですね。

Posted by Akishin at 11:52 午後
Categories: その他
|

2006年03月20日

北海道旅行その1

いつもはヒッキーな俺ですが、ちょっくら北海道まで行ってまいりました。
行ってきたのはココ

一言で言うと、のどかな田舎町って感じでした。
港町という事で、とりあえずは白糠港へ。

午後3時くらいに撮ったんですが、生憎天候に恵まれなかったためちょっと暗いです。
何の鳥かよくわかんないけど、とにかくすごい沢山の鳥がいてちょっとビビりました。
近づいても全然逃げないし、いい根性してます。
この辺りはわりと釣り船が盛んらしいですね。
まぁ俺は釣りはやらないので、ただ船を見に行って来ただけですが。

で、初日の夕食は釧路まで出て念願の本場のジンギスカン。

右側は一緒に食べたラムしゃぶです。
どちらも美味しかったんですが、欲をかいて両方食べ放題のコースを頼んだのに、結局ほとんどおかわりできませんでした。
無念だ。

この時期の北海道って、まだまだ夜とかすっごく寒いのかと思ってたら、意外とそうでもなかったです。
こっちでの1月頃と同じような感じかな~?

今日は帰ってきたばかりで疲れてるので、二日目はまた明日にでも。

Posted by Akishin at 11:48 午後
Categories: その他
|

2006年03月17日

AspectJ 5に触ろうとしてみる

MYCOM PC WEBの記事を読んで、AspectJがアノテーション使えるようになったと知り、早速使ってみたくなりました。
が 、いろいろ調べてるうちについに力尽き倒れる。
相変わらずなダメっぷりです。

まぁダイエット&運動不足解消のために久々にエアロこいじゃったもんだから仕方ない。
7万も払って布団干しに成り下がってるというのも哀しいもんだしね。

ちょい見た感じだと、pointcutとかがアノテーションで指定できるのが良さげ。
ソースコードがまんまJavaなので、Javaグラマにとって結構敷居が低くなった感じ。
便利そうだしちょっとずつ時間作っていろいろ触ってみよーっと。

というわけでいろいろとメモ。

AspectJ Development Tools (AJDT)
http://www.eclipse.org/ajdt/

【コラム】ライトニングJava (MYCOM PC WEB)
第36回 AspectJ 5(1) - JavaでAOPを実現する
http://pcweb.mycom.co.jp/column/java/036/
第37回 AspectJ 5(2) - メソッドの実行時間を測定する
http://pcweb.mycom.co.jp/column/java/037/
第38回AspectJ 5(3) - 逆コンパイルで探るアスペクトの裏側
http://pcweb.mycom.co.jp/column/java/038/
第39回AspectJ 5(4) - 逆コンパイルで探るアスペクトの裏側@Aroundの実態
http://pcweb.mycom.co.jp/column/java/039/
第40回AspectJ 5(5) - アスペクトを活かす
http://pcweb.mycom.co.jp/column/java/040/

Eclipse への AJDT のインストール方法
http://sel.ist.osaka-u.ac.jp/~t-isio/ajdt-install/

dW - Java technology - EclipseとAJDTでアスペクト指向のJavaアプリケーションを作成する
http://www-06.ibm.com/jp/developerworks/java/041126/j_j-ajdt.html

スタックアスタリスク 初めてのAspect指向プログラミング第2回
Eclipseを用いたAOP開発(AJDTプラグイン)

http://www.stackasterisk.jp/tech/java/aspect02_01.jsp

AspectJとは全く関係ないけど最近ずっとthe pillowsの『MY FOOT』聞いてる。
pillowsいいねやっぱり。

Posted by Akishin at 3:06 午前
Categories: Java
|

動物記

新堂冬樹の『動物記』を読了。
動物を主人公にした3つのお話です。
久しぶりに泣けました。
やっぱ動物ものはいいですね。

人間と野生動物ってテーマなんで、大方想像通りの展開だったりしますがそこがいいです。
ベタベタでもいいから期待通りの展開で泣かせてくれる方が好き。

動物好きなら是非一度読んでみることをお薦めします。
熊と一緒に暮らしたくなります。
無理だけど。

Posted by Akishin at 2:20 午前
Categories: 読書
|

2006年03月14日

EclipseでJUnit4

JUnit4からAnnotationでテストが書けるって事で、今更感もありますが取りあえず使ってみました。

実際使ってみると、AnnotationでTestCaseが書けるって随分スッキリしていい感じですね。
例えば、テスト対象クラスがこんなんだとすると・・・。


public class Greeting {
    private String greeting = "Hello, World.";

    public Greeting() {}

    public void setGreeting(final String greeting) {
        this.greeting = greeting;
    }

    public String greet() {
        return greeting;
    }
}

TestCaseがこんな感じで書けます。

import static org.junit.Assert.*;
import junit.framework.JUnit4TestAdapter;
import org.junit.Before;
import org.junit.Test;

public class GreetingTest {
    private String greeting;

    @Before public void prepare() {
        this.greeting = "こんにちは";
    }

    @Test public void greet() {
        Greeting greet = new Greeting();
        assertEquals(greet.greet(), "Hello, World.");

        greet.setGreeting(this.greeting);
        assertEquals(greet.greet(), this.greeting);
    }

    public static junit.framework.Test suite() {
        return new JUnit4TestAdapter(GreetingTest.class);
    }
}

JUnit4だとTestCaseクラスを継承する必要もないし、テストメソッドも@Testアノテーションさえ付ければ名前は何でもOK。
setUpやtearDownメソッドも、@Beforeアノテーションや@Afterアノテーションを付けるだけなので楽チンです。
Assert系のメソッドはorg.junit.Assertをstatic importすれば今までと同じ感じで書けちゃいます。

ただ、残念ながらEclipse3.1.xのJUnitプラグインではJUnitのアノテーションに対応していない模様。
常日頃からIDEに甘やかされまくってる自分としては、いくら便利になってもEclipseで使えないとちょっとなぁ・・・って感じだったんですが、↓みたいにJUnit4TestAdapterのインスタンスを返すstaticなsuiteメソッドを追加すれば使えるみたいです。

    public static junit.framework.Test suite() {
        return new JUnit4TestAdapter(Hoge.class);
    }

Eclipseの3.2だとJUnit4対応するらしいから、そうなればsuiteメソッドもいらなくなってもっとスッキリしますね。
楽しみだ。
Posted by Akishin at 11:23 午後
Categories: Java
|

Oracle SQL Developer 1.0がリリース

Oracle純正のDB開発ツール「Oracle SQL Developer」の正式版がリリースされたみたいです。

Oracle SQL Developer
http://www.oracle.com/technology/products/database/sql_developer/index.html

JDeveloperと同じく無償で使えるのが嬉しいところ。
PL/SQLデバッガもついてるようなので、SI ObjectBrowserの代わりになるかも。

ダウンロードサイトは英語ですが、ソフト自体はちゃんと国際化対応されてるみたいでメニューとか日本語になってました。
ヘルプはまだ英語しかないみたいだけど、そのうち日本語のも提供されるといいなー。

2006年03月13日

ウチの近所のウルトラマン

なんとウチの近所にウルトラマンがいました。

以前からすっごく気になっていたのですが、今日たまたまチャンスがあったのでコッソリ撮影。
一見普通の民家のベランダのようなのですが、一体何故あんなデカいウルトラマンが・・・謎だ。

Posted by Akishin at 1:08 午前
Categories: その他
|

JSFで複数ボタンがあるFormでのValidation

JSFで、一つのFormに「登録」「戻る」のように複数のcommandButtonを配置し、入力項目にValidatorを設定した場合、「戻る」ボタンをクリックした際にもvalidationが行われてしまいます。

で、これを解決するため(?)にJSFにはcommandButtonにimmediate属性というものがあり、この値をtrueにしたcommandButtonのSubmit時にはvalidationがかからなくなります。
が、しかし、ここで一つ問題があります。

immediate属性をtrueにすると、画面上の値はSubmitされません。
その為、前後の画面間で使用しているManagedBeanのscopeがrequestの場合、前の画面に戻った時点で値が消えてしまっています。
なんてこった。

この問題についてはYahoo!グループのJSFメーリングリストでも話題になった事があるみたいですが、どうやらあまりお手軽な解決方法はない模様。

で、今回どうしたかというと、単純に1つのJSP内に<h:form>を複数配置して逃げました。
戻るボタン専用Formにhiddenで値持たせて、戻るボタンにはimmediate=trueは付けない。
「登録」ボタンと「戻る」ボタンを横に並べて置くのはHTMLのTABLEタグで無理矢理やってます。


<form id="hogeForm">
・
・
・
  <table border="0">
    <tr>
      <td>
        <input type="hidden" name="userId" value="${requestScope['fugaBean'].userId != null ? requestScope['fugaBean'].userId : param['userId']}">
        <h:commandButton id="registBtn" value="登録" action="#{fugaBean.registAction}" actionListener="#{fugaBean.paramAction}"/>
</h:form>
      </td>
      <td>
       <h:form id="fugaForm">
         <input type="hidden" name="userId" value="${requestScope['fugaBean'].userId != null ? requestScope['fugaBean'].userId : param['userId']}">
         <h:commandButton id="backBtn" value="戻る" action="#{fugaBean.cancelAction}" actionListener="#{fugaBean.paramAction}"/>
       </h:form>
      </td>
    </tr>
</table>

JSF的にいいのか悪いのかよくわかりませんが、今のところこれで問題なく動作しているようです。
みんなどうやってんのかなぁ・・・。

Posted by Akishin at 1:01 午前
Categories: Java
|

2006年03月12日

JSFでh:inputHiddenの値が消えてしまう問題

ここ数日、仕事で再びJSFを触っていたのですが、今回もハマる事数度。
日頃の勉強の成果(?)か、以前ほど深刻ではなかったのがせめてもの救い。
ハマりの一番の原因はやっぱり、JSFのLifecycleをしっかりと理解していない事なんだろうなー。

で、今回一番悩んだのが、JSFのValidatorでバリデーションエラーになると、h:inputHiddenで保存していた値が消えてしまうという問題。
調べてみると、ひがさんのブログで以下のような記事を発見。

ひがやすを blog : hiddenが消える?
http://d.hatena.ne.jp/higayasuo/20051027

今回使っているのはApache MyFacesなので、ひがさんのやり方を真似て↓のようにしてみる。

<form id="hogeForm">
    <h:inputHidden id="userId" value="#{fugaBean.userId != null ? fugaBean.userId : param['hogeForm:userId']}"/>
    ...
</form>

これで確かに値は消えないのだが、これだとSubmit時に以下のような例外が出る。

java.lang.UnsupportedOperationException: Cannot set ServletRequest Parameter

読み取り専用のParameterMapにValueBindingしてしまい、Submit時に値を入れようとして例外吐いてるっぽい。
で、いろいろ試行錯誤した結果、結局以下のようにしました。

<input type="hidden" name="userId" value="${requestScope['fugaBean'].userId != null ? requestScope['fugaBean'].userId : param['userId']}">
<h:commandButton id="hogeBtn" value="ほげ" action="#{fugaBean.hogeAction}" actionListener="#{fugaBean.paramAction}"/>

をJSP側に置いておき、ManagedBean内で

public void paramAction(ActionEvent event) {
    FacesContext ctx = FacesContext.getCurrentInstance();
    Map paramMap = ctx.getExternalContext().getRequestParameterMap();

    String param = (String)paramMap.get("userId");

    if (param != null) {
        this.setUserId(param);
    }
}

こんな感じ。

ポイントは通常のHTMLのhiddenと、JSFではなくJSTLのELを使うようにして、送られてきたパラメータはActionListenerで取得するってところ。
ActionメソッドじゃなくActionListenerにしたのは、単に複数のActionメソッドにパラメータ取得用のメソッド書くのが嫌だったからです。

と、これでValidation使いつつ、hiddenによるRequestスコープでの値の持ち回りが無事できるようになりました。
なんか無理矢理感溢れる方法で気持ち悪いですが・・・。
他にもっとスマートな解決方法があるとは思うのですが、足りない俺の頭ではちょっとこれ以上はわかりそうになかったので妥協です。

JSFだと画面間の値の持ち回りはスパッと割り切ってSessionスコープのManagedBean使うべきなのかなぁ?
IDEでサクサク作った場合ってここら辺どうなんだろ?
やっぱりいちいち意識して組まなきゃならないんだろうか。

この辺り、もし何か良い方法を知ってる方いたら是非教えてください。

Posted by Akishin at 9:13 午前
Categories: Java
|

2006年03月08日

ポーションでHP回復・・・か?

あのFFのポーションが清涼飲料水として発売、との事で、以前から職場で話題になっていたのですが、発売日(7日)の今日、なんと先輩が買ってきてくれました!

FINAL FANTASYRXIIとのコラボレーション商品化 サントリー
http://www.suntory.co.jp/softdrink/FF/

 

お味の方は・・・なんだか回復しそうな感じ、という事で、お察し下さい。
今日ハマりがほとんど無かったのはこれのお陰かな~?

Posted by Akishin at 12:13 午前
Categories: その他
|

2006年03月05日

歯医者通い

金曜に会社でハイチュウ食ってたら銀歯が取れちゃった。
仕方なくアパート近辺の歯医者さん予約して行ってきました。

歯医者なんてこっち来てから行ってないから、4年ぶりくらいですねー。
当然のように虫歯になってる歯が何本かあったりして、ついでに治療するハメに。
さらに先生から「結構深いんで、もしかしたら神経抜くかも」との恐ろしいお言葉を頂き、後悔先に立たずという言葉の意味を今更ながら痛感してます。

プログラムもそうだけど、先に楽して手を抜いてると、後で必ず痛い目見るもんですね。
人生上手い事できてるよなぁ・・・。

まぁ割と近くに土日も診察してくれる歯医者さんが 見つかったのは不幸中の幸いと言ったところでしょうか。
これで可愛い歯科衛生士さんが大勢いれば最高だったんだが・・・贅沢言っちゃいかんか。

Posted by Akishin at 9:55 午後
Categories: その他
|

Hibernate Tools for Eclipse

FAQの中の

How to make the reverse engineering tools create an appropriate annotated composite id?
The reverse engineering mechanism from DB to the annotated domain model is currenlty in alpha stage. Composite ids are not yet properly handled.

ってのが気になって、HibernateToolsを試してみる。
ちなみにDBはMySQL4.1.13のWindows版。
でもJDBCドライバ使ってるようなので、ドライバさえあれば大体イケそう。

リファレンス斜め読みして適当に使った手順は↓こんな感じ。

  1. 公式からHibernateTools-3.1.0.beta4.zipをダウンロード。
  2. Eclipse3.1.1+WTP0.7.1環境にインストール。
    リファレンスではWTP1.0と書いてあるみたいだったが、取りあえず試した限りでは動いてた。
  3. EclipseでJavaプロジェクトを作成。
  4. 「ファイル」→「新規」→「その他」→「Hibernate」から「Hibernate Configuration File (cfg.xml)」を選択し、hibernate.cfg.xmlを生成。
    項目は手書きの時と同じもの。
    ここで「Create a console configuration」にチェックを入れておくと、続けてConsoleの設定を行える。
  5. 「Create a console configuration」にチェックを入れなかった場合は、 「ファイル」→「新規」→「その他」→「Hibernate Console Configuration」を選択し、「Create Hibernate Console Configuration」ウィザードを起動。
    先程生成した「hibernate.cfg.xml」を選択し、Consoleの名前と、JDBCドライバの指定、あと「Enable hibernate ejb3/annotations (requires running eclipse with a Java 5 runtime)にチェックしたら「終了」。
  6. 再び「ファイル」→「新規」→「その他」と辿り、今度は「Hibernate Reverse Engineering File (reveng.xml)」を選択。
  7. 親フォルダに作成したJavaプロジェクト、ファイル名はデフォルト(hibernate.reveng.xml)のままで「次へ」。
  8. 「Console configuration」で先程作成したConsoleの名前を選択し、「Refresh」をクリック。
    「Database schema」のところにConsoleで指定したDB上のスキーマ一覧が表示されるので、その中から作成したいスキーマ、テーブルなどを選択し「Include」して終了。
    指定した場所にreveng.xml(名前は指定したもの)が生成される。
  9. メニューアイコンのところ(実行とかデバッグ用のボタンが並んでるところ)にHibernateのアイコン(サイトにあるやつ)が追加されているので、それをクリックし「Hibernate Code Generation.....」を選択。
  10. 「新規」で新規構成を作成し、「Console configuration」、「Output directory」などを適宜選択。
    「Reverse engineer from JDBC Connection」にはチェック。
    「reveng.xml」には先程生成したreveng.xmlを選択。
  11. 「Exporters」タブでは生成したいファイルにチェックをつける。
    Entityクラスを生成させるには「Generate domain code(java)」のところにチェックをつければいいみたい。
    今回はAnnotationを使うので「EJB3/JSR-220 annotations」にチェック。
    ついでにTigerにしとこうと思い「JDK 1.5 Constructs (generics, etc.)」にもチェック。
  12. 設定済んだら「実行」。

たったこれだけでDBからリバースしてAnnotation付きのEntityクラスを生成してくれました!
すげ~!!

他にも「Exporters」タブのとこで「Generate DAO code (java)」にチェックを付けると、Entityを使用するDAOクラスが、「Generate schema html-documentation」にチェックを付けるとJavaDoc風のDB定義書を出力してくれるみたいです。
もちろんAnnotationじゃなくてMappingファイルを生成するオプションもあり。

Annotationをいちいち手書きは面倒くせー!って思ってたけど、これならMiddlegen並みに楽でいいな~。
若干手を加える必要はあるだろうけど、1から手書きよりは全然楽。

まだベータの状態でこれだけできるとは、今後のバージョンアップが楽しみなツールです。

Posted by Akishin at 1:59 午前
Categories: Java, ソフトウェア
|

2006年03月04日

お祝いパーティー

前職でお世話になった方から、姉と元・上司の入籍お祝いパーティーというものにお誘い頂いたので、遠路はるばる西所沢まで行って参りました。
基本的には引篭もり体質なんで、休日に 外出するなんて随分久しぶりな気がするなぁ。

それにしても、たまに外出するといい気分転換になりますね。
特に行った事ない場所だったりすると新鮮でいい。
なんて思いながらも電車の中で読んでたのはWEB+DB PRESSだったり。

人見知り激しいもので、初対面の方とはあまりお話はできなかったですが、いろいろな話を聞けて楽しかったです。
姉も元・上司も幸せそうでなにより。
「お義兄さん」と言わされたのには若干参りましたが・・・。
さて、今後の呼び方はどうしたものか・・・。

しかし今回一番嬉しかったのは無事お酒に飲まれず帰宅できた事ですかね~。
今年はのっけからやらかしたんで、飲み会の度にビクビクしてます。
まぁ今のところセーフなんで、せめて年内はこの調子で大人しく行こう。


そういえば、結婚式の案内状に「一言お願いします」とかいう不吉な匂いのする紙が入ってた気がするんだけど、きっとこの所あまり寝てないんで疲れてるんですね。
見なかった事にしようっと。

Posted by Akishin at 11:49 午後
Categories: その他
|

Ajaxイン・アクション

Ajaxイン・アクション』出るんですね~!!
このシリーズはクオリティ高いだけにかなり楽しみ。
3/24発売だそうで、そろそろ予約入れとこうかな。

つーか前買ったAjax本も全然読みきれてないんですけどね・・・。

このシリーズであと翻訳出て欲しいのはSpring in Actionかな。
日本語版はカラフルで並べとくだけでも楽しいので、技術書マニアにはマジおすすめ。
でもなんかこれはソフトバンクじゃないみたいだから、表紙違うかも。

Posted by Akishin at 1:08 午前
Categories: 技術書, 買い物
|

2006年03月02日

Hibernate Annotationsその5

公式に「Hibernate Annotations FAQ」なるドキュメントがあるのを発見。
てか、やっぱちゃんと公式サイト見ないとダメだよね・・・。
英語だとついつい問題が発生するまでは見ないって事をやってしまいます。
だって分かんないし疲れるんだもん。

で、前も書いたhbm.xmlでの「inverse="true"」の指定ですが、以下の様に書いてありました。


   Q.How can I set inverse="true"?
   A.The semantic equivalent is mappedBy in the association annotations. Have a look at the reference guide for a complete explaination.

つまり、「mappedBy」つければいいってことですね。
FAQに書いてあるからあんま聞いてる人とかいなかったのか。

この指定が「inverse="true"」指定って事だとすると、双方向関連のListに@org.hibernate.annotations.IndexColumnを指定してるにも関わらず、indexカラムの値が更新されなかったのは「mappedBy」も同時に付けてたから、って事になるなー。

Hibernate イン アクションのP.283やP.287に、関連の「inverse="true"」の場合にHibernateはindexカラムを更新しない、ってな事が書いてあるんで、多分ここが原因だったんだろう。
そこら辺の扱いは3.xでもAnnotationsでも一緒、って事か。

Posted by Akishin at 2:03 午前
Categories: Java
|

かったほん

恒例の図書購入履歴をば。

RailsによるアジャイルWebアプリケーション開発
Seasar入門 はじめてのDI&AOP
一瞬で信じこませる話術コールドリーディング
なぜ、占い師は信用されるのか? 「コールドリーディング」のすべて
コミュニケーションのための催眠誘導
すごい解決 ― すぐに使える問題解決カード(32枚)付 ―

ついに出ましたSeasar入門。
何回も発売日延期になってたけど、ちゃんと発売されてよかった、よかった。
Seasar本は多分これが初のはず。
今までSpringしか触った事ないけど、いい機会だからこの本で勉強しよう。

Railsのは、結構あちこちで話題になってた『Agile Web Development With Rails: A Pragmatic Guide』の翻訳らしいですね。
やっぱ話題の本だと翻訳も早いなぁ。
Ruby全然分からないんですが、Rails使ってみたくて思わず購入。
これを気にRubyも使えるようになりたいなー。

あとの本は技術書じゃないやつです。
今回はコールドリーディングに興味を持ったので、それ系を2冊ほど買ってみた。
技術書の合間にこーゆー本を混ぜて読むと、いい感じの気分転換になるんですよね。
別に例のモテる呪文の人に憧れて占い師目指しはじめたわけでは決してないです。

Posted by Akishin at 1:07 午前
Categories: 技術書, 買い物
|