« June 2007 | Main | August 2007 »

July 2007

2007.07.29

Teedaでログアウト

 Teedaで、ログインしたらやはりログアウトの処理も必要ってことで。

 例えば、ログインしているという情報をLoginDtoというDtoオブジェクトに格納し、このオブジェクトのライフサイクルをSessionにしていたとします。となると、ログアウトのページではこのオブジェクトをセッションから破棄すればOKのはず・・・ってことで、Re: [Seasar]Session スコープのコンポーネントの破棄を参考に、以下のような感じのLogoutPage.javaを作成してみました。なお、念のためLoginDtoに格納しているデータも破棄できるよう、このDtoにはlogout()というメソッドを実装しています(このメソッドを呼び出すとインスタンス変数の内容をクリアする)。

Continue reading "Teedaでログアウト"

| | Comments (0) | TrackBack (0)

2007.07.28

Teedaのカスタムバリデータ

 Teedaで使用するカスタムValidatorの作成のテスト。参考にしたのはValidatorのカスタマイズについてのページなのですが・・・Validationロジックは具体的にはどのように書けば? ってことで、Teedaのソースを参考にしながら作成してみました。

public class SampleValidator implements Validator {
 public void validate(FacesContext context, UIComponent component, Object value) throws FacesException {
  if (value == null || value.equals("")) return;
  if (!checklogic(value)) {
   FacesMessage message = new FacesMessage("入力内容を確認してください");
   throw new ValidatorException(message);
  }
 }
 public boolean checklogic(Object value) {
  // 何らかのチェックロジック
 }
}

Continue reading "Teedaのカスタムバリデータ"

| | Comments (0) | TrackBack (0)

2007.07.27

Seasar2でConnectionPoolの情報取得

 JNDI経由でDataSourceを取得している場合、そのプーリングの状態はjconsoleで簡単に取得することが可能です。
 Seasar2ではjdbc.diconの設定でいくつかのDataSourceを切り替えることが可能ですが、どのデータソースを使うのがベターなのか? (サーバを使用しない)テストの時のことを考えるとJNDIを使用しない方法かなぁ、と思いつつ・・・この方法だと、コネクションプールの状況を取得するにはどうすれば??

 ってことでたどり着いたのが、MXBeanを使用する方法です(Java6以降限定になってしまいますが)。MXBeanを作るにあたって参考にしたのは、Java in the Box - Java SE 6 じゃじゃ馬ならし User Defined MXBeanです。

Continue reading "Seasar2でConnectionPoolの情報取得"

| | Comments (0) | TrackBack (0)

2007.07.23

Teedaでログイン管理

 Teedaでページを表示する際にログインしているかどうかを管理する方法。

 まずはTomcat等のコンテナに任せるという手が考えられますが、自前で管理する場合はInterceptorを使用するという手もあります。

参考
[Seasar-user:3397] ログインアプリケーション
[Seasar-user:8968] [Teeda]ログイン認証のIntercepter
sou - Interceptorでひとはまり。

Continue reading "Teedaでログイン管理"

| | Comments (0) | TrackBack (1)

2007.07.22

PostgreSQLのパーティショニングテーブル

 PostgreSQLのパーティショニングテーブルの処理速度を調べてみました。ただし、すごく簡単なテスト(ベンチマークテスト)となっていますので、これを一般化するのはちと危険かも(^^; 本当はスレッド数を変えたり、レコード数を増やしたり、データの生成処理を変えたり、別端末にするなど、いろいろとしなければならないのですが。

 測定環境は以下の通り。

1.Timestamp型で1ヶ月単位でテーブルを分割。とりあえずは2007年1月~12月の12個を作成。
2.ループで5万レコードを挿入。列および挿入データは以下の通り。

・serial型:nextvalで採番しながらデータを生成
・Timestamp型:このフィールドの内容でテーブルを分割。1月→12月の順で1レコードずつ挿入し、12月の次は1月に戻る。日は、各月の最大日の範囲内で乱数で設定。
・varchar(20):英数字を乱数で連結。文字数は10~20文字をやはり乱数で。
・int:1~20の番号を順番に。
・varchar(40):英数字を乱数で連結。文字数は30~40文字をやはり乱数で。
・int:1~Integer.MAX_VALUEの範囲の数値を乱数で。
・varchar(20):英数字を乱数で連結。文字数は10~20文字をやはり乱数で。
・int:1~Integer.MAX_VALUEの範囲の数値を乱数で。

3.パーティショニングを行っていない1テーブルの状態と、12個にパーティショニングを行った状態とで所要時間を比較。
4.ついでに検索処理もテスト。検索条件は年:2007年、月:1月→12月の順(12月の次は1月に戻る)、日:各月の最大日の範囲内で乱数で設定。各Select文でレコードの取得件数を取得(SELECT COUNT(*) FROM~)。検索処理も5万回ループし、所要時間を比較(検索対象フィールドにはインデックスをはっています)。

Continue reading "PostgreSQLのパーティショニングテーブル"

| | Comments (0) | TrackBack (0)

2007.07.21

S2DaoとPostgreSQLのパーティショニングテーブル

 PostgreSQLパーティショニングテーブルに対応しており、レコード件数が多くなる傾向のあるテーブルに対して適用すると効果があるといわれています。

 で、試しに「月単位」で別テーブルに切り替えるようなパーティショニングを作成し、S2Daoでデータを追加するような処理を書いたのですが・・・思わぬところではまってしまいました。

  • パーティショニングされたテーブルに対してInsertを行った場合、正しく書き込めても挿入件数の戻り値が"0"となってしまい、NotSingleRowUpdatedRuntimeException が発生する(従って、トランザクション制御を書けている場合はロールバックしてしまう)。
  • S2Daoを使用せず、普通にStatement等を使用してInsertをした場合も戻り値は0件なので、ドライバ側の問題?(パーティショニング後のテーブルに対して直接Insertをした場合の戻り値は1件となります)
  • 自動SQL生成機能を使用しない場合は、戻り値が0件でも例外は発生しないとのこと。
  • なので、.sqlファイルを生成し、Insert文を実行するように方針変更。
  • すると、今度は自動採番機能が機能せず、該当フィールドの値がnullとなってしまいDB側のドライバが例外をスローしてしまう。

  • Continue reading "S2DaoとPostgreSQLのパーティショニングテーブル"

    | | Comments (0) | TrackBack (0)

    2007.07.19

    S2DxoとJAXB2.0 その4

     S2Container経由で取得したオブジェクトに対してUnmarshalしたわけですが・・・そのオブジェクト内で、Stringやint等以外のクラスを使用している場合に期待通りの動きをしてくれないことが判明。

     Unmarshalで最初に渡すクラスは確かにS2Container経由で渡すことが可能ですが、JAXBの内部で処理されるクラスに対してはJavaの管理下なのでS2Containerから手を加えることはできないですよね・・・。

     結局、InterTypeを適用可能なクラスと適用できないクラスが混在することとなり、すごく中途半端な状態に(S2Dxoを用いる場合、InterTypeを適用できないクラスはgetterを書く必要があります)。いっそ、InterTypeの適用をあきらめた方がわかりやすくていいような気がしてきました(苦笑)。

    | | Comments (0) | TrackBack (0)

    2007.07.18

    S2DxoとJAXB2.0 その3

     S2DxoとJAXB2.0の組み合わせで、Unmarshal(XMLテキスト→オブジェクト)に関してはとりあえずは動いたので次はその逆のMarshal処理。

     何も考えず、S2Container経由で取得したオブジェクトをMarshalした場合、

    Marshaller marshaller = context.createMarshaller();
    StringWriter writer = new StringWriter();
    marshaller.marshal(entity, writer);
    writer.flush();
    System.out.println(writer.toString());

    以下のような例外がでて失敗してしまいます。
    [com.sun.istack.internal.SAXException2: unable to marshal type "test.HogeEntity$$EnhancedByS2AOP$$124111a" as an element because it is missing an @XmlRootElement annotation]

     これは、

  • Marshal処理の際は@XmlRootElementを基準に処理する。
  • @XmlRootElementアノテーションは@Inheritedアノテーションが指定されていない。
  • InterTypeを適用した「サブクラス」には@XmlRootElementが指定されていない状態となる。

    ことに起因していると思われます。

  • Continue reading "S2DxoとJAXB2.0 その3"

    | | Comments (0) | TrackBack (0)

    2007.07.17

    S2DxoとJAXB2.0 その2

     JAXBでのバインド先にInterTypeを適用ですが、とりあえず以下のような感じでできました。

    Hoge _hoge = (Hoge)s2container.getComponent(Hoge.class);
    JAXBContext context = JAXBContext.newInstance(_hoge.getClass());
    Unmarshaller unmarshaller = context.createUnmarshaller();
    JAXBElement<?> hogee =
      unmarshaller.unmarshal(new StreamSource(new StringReader(xml)), _hoge.getClass());
    Hoge hoge = (Hoge)hogee.getValue();

    って感じで記述すると、最終的に得られたhogeはInterTypeが適用された状態のオブジェクトとなっていますので、Dxoでサクッとプロパティのコピーが可能です。

     なお、

    Hoge hoge = (Hoge)unmarshaller.unmarshal(new StringReader(xml));

    だと、InterType適用前の状態となります。デバッガで見たところ、JAXBContextを作成する際、引数のクラスの「親クラス」も自動的に登録されてしまうようで、まずはそちらから優先的に処理されているような感じ?

    | | Comments (0) | TrackBack (2)

    2007.07.16

    S2DxoとJAXB2.0

  • S2Dxoを使うと、オブジェクトのプロパティを別のオブジェクトに変換可能(Dto->Entityの変換等)。
  • SeasarのInterTypeを使用すると、setter/getterの自動生成が可能。
  • JAXB2.0を使用すると、アノテーションでサクサクッとXMLのデータをオブジェクトにバインドすることが可能。

     さて、これを組み合わせると・・・??

  • Continue reading "S2DxoとJAXB2.0"

    | | Comments (0) | TrackBack (2)

    2007.07.14

    Seasar SMART deploy環境でのDaoへのIntercept

     Seasar2.4では、ルールに則ったパッケージ構成を行うことで、SMART deployを行うことが出来ます。SMART deployを適用すると、diconファイルの記述量が激減する(場合によっては、diconファイルの追加/修正が不要となる)わけですが、逆に言うと、標準のルールの範囲外のことをやろうと行おうとした場合は、それなりに設定の変更等が必要になってくるわけで。

     SMART deployの設定方法においていろいろとまとめられています(というか、いろいろと試行錯誤した後でこのページの存在に気づいてしまったのですが(苦笑))。

    Continue reading "Seasar SMART deploy環境でのDaoへのIntercept"

    | | Comments (2) | TrackBack (0)

    2007.07.09

    PostgreSQLのロール設定

     PostgreSQL(8.2.4)のロール設定のメモ。Windows版のPostgreSQLを使用し、pgAdminIIIで設定する場合の例です。なお、設定は全てユーザpostgres(スーパユーザ権限)で行っています。

  • グループロールの作成
      ロール名testrole
      ログイン可チェックなし
      パスワード(空欄)
      アカウントの失効(空欄)
      ロール権限全てオフ

       ここでログイン可をチェックありでロールの作成を行うと、おそらく次の「ログインロールの作成」は不要となるかと思います。詳しく調べたわけではないのですが、グループロールとログインロールを分けることにより、ログインロールを「ログイン用のアカウント」のような感じで扱えるのではないかと思います(複数のログインユーザに対して同じロールを割り当てたり、逆にあるログインユーザに対して複数のロールを割り当てたりすることがしやすくなるのではないかと)。


  • Continue reading "PostgreSQLのロール設定"

    | | Comments (0) | TrackBack (0)

    2007.07.08

    PostgreSQL用のJDBCドライバ

     PostgreSQLをインストールすると、JDBCドライバとしていくつかインストールされます。例えば、僕の環境では8.2.4(Windows版)をインストールすると、以下の3ファイルがコピーされました。

  • postgresql-8.2-505.jdbc2.jar
  • postgresql-8.2-505.jdbc2ee.jar
  • postgresql-8.2-505.jdbc3.jar

     どういう風に使い分ければいいのかなぁ・・・と思っていると、PostgreSQL JDBCドライバ ダウンロードページJDBC Version Selectionにまとめられていました。

     これによると、使用するJavaのバージョンによって、使用するjarファイルを選択すればOKって感じですね。最初ドライバのTypeかなぁ、と思っていたのですが、Javaで使うところのJDBC2.0とかJDBC4.0とかいう分類に対応したもののようです(ちなみに、PostgreSQL用のJDBCドライバはTypeIV)。

  • Continue reading "PostgreSQL用のJDBCドライバ"

    | | Comments (0) | TrackBack (2)

    2007.07.07

    JAXB2.0と列挙(enum)型

     JABX2.0と列挙(enum)型・・・というか、JABX2.0全体に関する内容かもしれませんが、Unmarshallerの処理の際、特に何も指定していなければValidationは行われないような感じ?

     enum型のものを@XmlTypeで定義し、それに対応する項目を@XmlElement(あるいは@XmlAttribute)で指定したクラスを用いてUnmarshallerした場合、enumで定義されていない値を処理してもエラーとはならずにnull(処理がスキップされている?)となるだけのようですね。

     となると、schemagenコマンドを用いてXMLSchemaを生成し、それを用いてValidationを行うようにするしかないんでしょうかね(もちろん、自力でValidation用のクラスを作成しても目的は達成できますが・・・)。

    | | Comments (0) | TrackBack (0)

    2007.07.06

    SunbirdとGoogleとTask

     Sunbirdは、スケジュールの他にタスクの登録もできます。
     が、残念ながら、タスクに関しては、GoogleCalendarとの連携はできないようですね・・・。まぁ、GoogleCalendarの方に「タスク」に相当するものが存在しないので、仕方がないところでしょうか。というか、連携できないのみならず、登録そのものにも失敗してしまうようで、頑張って入力したデータをロストしてしまうのはなかなか悲しいものが(^^;

     ところで、この動きからすると、ネットワークにつながっていない環境だと、カレンダを「GoogleCalendar」に設定している場合は予定の登録もできない?(データはGoogleCalendarにしか保存していない?) まぁ、その場合、とりあえずはローカルに登録後、ネットワークに接続する環境に戻ったときに予定の登録先をHomeなどからGoogleCalendar側に切り替えれば何とかなりそうな気もしますが。

    | | Comments (0) | TrackBack (0)

    2007.07.05

    JAXB2.0とスレッド

     Performance and thread-safetyUnofficial JAXB Guide)およびJAXB FAQより。

     ざっくりとまとめると、

    Java6に含まれているSunの参照実装(RI)においては、JAXBContextはスレッドセーフだが、Marshaller、Unmarshaller、Validatorはスレッドセーフではない

    ということになるようです。

     で、パフォーマンスを向上させる場合、スレッドセーフとなっているJAXBContextは毎回生成するのではなくSingletonでstaticに保持するようにした方がよい、ということだそうです。
     なお、VM起動時等にJAXBContextを初期化する場合、そのアプリケーションで使用する可能性のあるクラスを全て(JAXBContextに)登録しておく必要があるので、注意が必要な場合もあるかと。

    #JAXBContext#newInstance(String)の初期化方法を使用する場合がよくわからない・・・(newInstance(Class...)は簡単なのですが)。

    | | Comments (0) | TrackBack (0)

    2007.07.04

    ラジオのノイズ

     なんかラジオ(FM)のノイズが急にひどくなったなぁ・・・と思っていたら、どうもアンテナのアース部分が外れかかっていた模様(^^; HD/DVDレコーダのメンテナンスや、CATVの電波状況確認で配線周りをいじりまわしていたときにその部分がずれてしまったんですかね?(このあたりの機器はすぐそばに配置されているので)

    | | Comments (0) | TrackBack (0)

    2007.07.03

    Dolteng/Churaでソースフォルダーを追加

     Doltengプラグインを用いてChuraプロジェクトを生成すると、src/main/java、src/main/resources、src/main/webapp/view、src/test/java、src/test/resourcesの5つのソースフォルダーが生成されます。

     普段使用しているユーティリティー系のクラスをこのプロジェクトに持ち込む場合・・・これらのソースフォルダー内には、規約に従ったパッケージが大量に生成されているため、避けておきたいところ?(まぁ、追加しても問題なく動くとは思いますが)

     なので、新たにソースフォルダー(例えばsrc/commonという名前)を生成し、そこに格納することにしたわけですが・・・コンパイルは通るがTomcat実行時に参照できないという現象が。
     調べてみると、なんのことはない、Tomcatから参照しにくる場所にクラスファイルが出力できていなかったことが原因でした。なので、追加したソースフォルダーのOutputFolderをsrc/main/webapp/WEB-INF/classesにすればOKです(デフォルトではtarget/test-classesになっていました)。

    #もちろん、普段使用しているユーティリティー系のクラスをjarファイルとして取り込むという選択肢もありますが。

    | | Comments (0) | TrackBack (0)

    2007.07.02

    Eclipse3.3(Europa)

     Eclipse3.3がリリースされました。Eclipse IDE for Java Developersをはじめ数種類のパッケージが準備されているようですが・・・for Java Developersは主にEclipseを用いてJavaアプリケーション等の開発を行う(Eclipse用のプラグイン等は作成しない)用途向け? Eclipse Classicってのが、今までのパッケージのイメージなんでしょうか。ファイルサイズが倍くらい違っていますが(^^;
     他に、Eclipse IDE for Java EE DevelopersEclipse for RCP/Plug-in Developersなどもあるようです。

    Continue reading "Eclipse3.3(Europa)"

    | | Comments (0) | TrackBack (0)

    2007.07.01

    Sunbird

     Mozillaが開発を進めているカレンダーアプリケーションであるMozilla Sunbird日本語サイト)。

     アドオンの1つであるProvider for Google Calendarと組み合わせることで、Google Calendarとデータの連係を行うことができるとのことなので、試しにインストールしてみました。

    Continue reading "Sunbird"

    | | Comments (0) | TrackBack (0)

    « June 2007 | Main | August 2007 »