Saturday, January 31, 2009

01/31/2009


  • 午前中に目覚めたが、あまりに天候が悪そう(確認していない)で、二度寝した。

  • 結局、15 時前に起床した。

  • 自社の勉強会が 10:00 から開始されていたが参加した時刻は 16 時を過ぎたころ。

  • 18 時から、近くのお好み焼き屋で 1 次会

  • 2 次会は別の飲み屋で。

  • 頭痛

Friday, January 30, 2009

01/30/2009


  • 眠すぎて何もできなかった。

  • 会社で使用していた自分のマシンを持って帰れなかった。




Using JMeter

// TODO

JMeter

Thursday, January 29, 2009

01/29/2009


  • 4:30 AM に起床した。

  • 来月からの案件の契約をするため、営業さんが自社を訪れたようだ。

  • 不規則に強烈な眠気が。



Using Facelets

// TODO

Facelets のテンプレートと再利用性機能



<!-- template.xhtml -->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets">

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>Sample Template</title>
    </head>

    <body>
        <h1>#{title}</h1>
        <div><ui:insert name="menu" /></div>
        <p><ui:insert name="body" /></p>
    </body>

</html>




<!-- template-client.xhtml -->

<!-- content above will be trimmed -->
<ui:composition template="template.xhtml">
    <ui:param name="title" value="Here's my Title"/>
    <ui:define name="menu">Here's My Menu</ui:define>
    <ui:define name="body">Here's My Body</ui:define>
</ui:composition>
<!-- content below will be trimmed -->




<!-- template.xhtml -->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets">

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>Sample Template</title>
    </head>

    <body>
        <h1>Here's my Title</h1>
        <div>Here's My Menu</div>
        <p>Here's My Body</p>
    </body>

</html>




あるページにおいて、他の composition を使用したいとき :

<!-- include.xhtml -->

...
<span id="leftNav">
    <ui:include src="/WEB-INF/siteNav.xhtml"/>
</span>
...




<!-- siteNav.xhtml -->

...
<ui:composition>
    <!-- myfaces tomahawk components -->
    <t:tree2 value="#{backingBean.options}" var="opt">
        ...
    </t:tree2>
</ui:composition>
...





<!-- include.xhtml -->

...
<span id="leftNav">
    <!-- myfaces tomahawk components -->
    <t:tree2 value="#{backingBean.options}" var="opt">
        ...
    </t:tree2>
</span>
...




パラメータを渡す :

<!-- include.xhtml -->

...
<span id="leftNav">
    <ui:include src="/WEB-INF/siteNav.xhtml">
        <ui:param name="menuBean" value="#{backingBean.options}"/>
    </ui:include>
</span>
...




<!-- siteNav.xhtml -->

...
<ui:composition>
    <!-- myfaces tomahawk components -->
    <t:tree2 value="#{menuBean}" var="opt">
        ...
    </t:tree2>
</ui:composition>
...

Wednesday, January 28, 2009

01/28/2009


  • 非常に眠い日だった。

  • 眠すぎて何もできなかったような。

  • 理解していない annotation が多すぎる...。

  • 定時で退社した。

  • シャワーを浴びた後、あまりにも眠すぎてベッドに横たわったところ、そのまま眠ってしまった。

Tuesday, January 27, 2009

01/27/2009


  • クレジットカードのポイントを BICCAMERA のポイントへ移行する手続きをした。30,000 円ちょいに交換できた。

  • 田町で面談してもらった例の案件に、来月から参加することになった。

Learning C - 01/27/2009

- GNU bash のソースファイルを読む。
- // TODO 多数の *.c ファイルと *.h ファイルが存在し、どれから目を通すべきか判断できない。
- 経験者に質問する予定

OpenSSH ant Heartbeat

% vi ~/.ssh/.ssh_config
Heartbeat 30

Monday, January 26, 2009

01/26/2009

9:30 に田町で待ち合わせだった。9:00 ごろ到着した。改札の外で待っていたが、かなり寒くて完全に体を冷やしてしまった。

あっさりと面談を終了した。

水曜日の午前中までに結果をもらえる、らしい。

新木場の面談の結果は、ダメだったようだ。理由は不明だったり。

PHS を解約する手続きをした。

Amazon Web Services の Virtual Machine を設定してみた。

Using Amazon Web Services

// TODO : MUST BE UPDATED

Amazon Web Services ( AWS ) を利用についてメモしておく。コマンドラインにおいての利用を想定して説明する。


参考 :

http://docs.amazonwebservices.com/AWSEC2/latest/GettingStartedGuide/


なお、このポストが対象とする内容は、上記のページの左に位置する見出しの

"Setting up the Tools"
"Running an Instance"

を対象にしている。



"Setting up the Tools"



以下の環境変数が定義する。"EC2_HOME' は、Amazon EC2 API Tools 用の環境変数だ。

% export JAVA_HOME<path-to-tools>
% export PATH=$JAVA_HOME/bin:$PATH
% export EC2_HOME=<path-to-tools>
% export PATH=$EC2_HOME/bin:$PATH
% export EC2_PRIVATE_KEY=~/.ec2/pk-********************************.pem
% export EC2_CERT=~/.ec2/cert-********************************.pem


// TODO : 異なった region を指定する


以上で、Amacon EC2 を利用する準備を完了した。





適切な AMI を発見する。

% ec2-describe-images -o self -o amazon | grep machine | awk '/getting-started/{ print $1, $2, $3 }'
IMAGE ami-235fba4a ec2-public-images/getting-started-v1.07.manifest.xml
IMAGE ami-3c47a355 ec2-public-images/getting-started.manifest.xml
%

黄色の文字列が "AMI ID" と呼ばれる。



Generating an SSH Key Pair

これから、public AMI のインスタンスを起動する。public AMI にパスワードが設定されていないため、インスタンスにログインするため、public / private のキーのペアを作成する。以下のコマンドを実行すると、文字列が Standard Output に write される。

% ec2-add-keypair gsg-keypair
KEYPAIR gsg-keypair 1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f
-----BEGIN RSA PRIVATE KEY-----
文字列文字列文字列文字列文字列文字列文字列文字列文字列文字列
文字列文字列文字列文字列文字列文字列文字列文字列文字列文字列
文字列文字列文字列文字列文字列文字列文字列文字列文字列文字列
文字列文字列文字列文字列文字列文字列文字列文字列文字列文字列
文字列文字列文字列文字列文字列文字列文字列文字列文字列文字列
-----END RSA PRIVATE KEY-----
%

この行から
-----BEGIN RSA PRIVATE KEY-----
この行までを
-----END RSA PRIVATE KEY-----
含めて、"gsg-keypair.pem" というファイル名で保存する。




パーミッションを設定する。

% chmod 400 gsg-keypair.pem





Running an Instance



AMI のインスタンスを起動する。AMI ID を指定し、"ec2-run-instances" コマンドを実行する。起動し終えるまで少し時間を必要とするようだ。

% ec2-run-instances ami-235fba4a -k gsg-keypair

"ec2-run-instances" コマンドを実行した後に "INSTANCE" という文字列の右に表示されいてる "instance ID" をメモしておく。

次のコマンドは、インスタンスの状態を表示する。

% ec2-describe-instances i-ae0bf0c7




インスタンスにポート接続を許可する。

% ec2-authorize default -p 22
% ec2-authorize default -p 80


80 番ポートをオープンしたので、Web ブラウザでアクセスしてみる。

http://$yourhost/



// TODO
% ec2-get-console-output $instance_id

// TODO
% ssh -i gsg-keypair.pem root@hotname

// TODO
% ec2-terminate-instances $instance_id

Sunday, January 25, 2009

01/25/2009

- gTLD のドメインを更新した。
- 17:30 に目覚めた...。
- パソコン工房HTS543232L9A300 を x 2 で注文した。
- Seam と JSF でゴニョゴニョしていた。

Creating SQL statements in Bash

% for ((x=0; x<10; x++)) ; do printf 'INSERT INTO $tableName VALUES (%b, %b, %b)\n' $value1 $value2 $value3 ; done

A technique for finding good books

自分なりの「良書」を発見&読むコツ


1. 検索する

まず、自分が発見した本を、http://www.amazon.com/ で検索する。例えば、PHP の本を購入する予定なら、amazon.com の book カテゴリで、素直に "PHP" を検索する。この段階においてのポイントは、www.amazon.co.jp で検索しないこと、だ。理由は、日本語に限定されてしまう ( "洋書" カテゴリで検索してもいいが ) から。日本語のみの本を検索する、という行為は、良書を発見できる確率を著しく下げる。


2. 絞り込む

私は O'Reilly から出版されている本を好む ( 理由を後述する ) ので、O'Reilly から出版されている PHP の本をピックアップする。

理由 :
// TODO


3. レビューを確認する

amazon.com で検索した本の、以下の点について確認する。

・対象としている読者(レベル
・レビューの数
・レビューの平均ポイント
・レビューの内容


4. Safari Books Online で確認する

私は、Safari Books Online の会員である。上記の過程で絞り込みした本の内容を確認する。特に対象 OS など。基本的に Windows を対象とした本を読まない。また、目次の内容を確認して、自分が学習したい内容が記載されているかを確認する。


5. 読む

満足できそうな本を発見できたら、Safari Books Online で読みまくる。



以上だ。

最近、かなりこのパターンで本を発見し、かつ本を読んでいるので、本屋で無駄に本を探したり、読まない本を購入しなくなったし、amazon.co.jp で本を購入しておいて読まないうちに古くなってしまった、などというような悲しい出来事はなくなった。Safari Books Online の場合、ほぼ常に最新の本にアクセスできるからだ。

javax.ejb.EJBTransactionRolledbackException: @In attribute requires non-null value: hoge.fuga

javax.ejb.EJBTransactionRolledbackException: @In attribute requires non-null value: hoge.fuga

Learning C

今年の目標のひとつに、

    C 言語を学習する

という目標をかかげた。


もう 1 月が終わりそうなこの時期に今後の方針を決定しておきたいと思う。

- オープンソースソフトウェアのソースコードを教材に学習する
- 身近なソフトウェアを選択する ( shell とか
- エディタは Emacs とする

Saturday, January 24, 2009

01/24/2009

08:00 を過ぎたあたりで眠くなったので、1 時間だけ仮眠して池袋へ移動する予定だった。目覚めたら 13:30 になってしまっていた。諦めて寝た...。結局、目覚めて活動しはじめた時刻は 16:00 ごろ。駅前のファミリーマットで買い物をした。夕食に、キムチ鍋をいただいた。

Friday, January 23, 2009

01/23/2009

月曜日の午前中、田町で JBoss Seam の案件の面談をする予定だ。
そのため、まず JSF を復習してみたが、完全に忘れていた。
いや、「忘れていた」でなく「理解していなかった」だった。
便利だな、と今ごろになって気づいた。
土日で Seam を復習しておきたい。
土曜日の勉強会に参加するか、は、微妙だ。

OpenJDK 1.6 + JBoss AS 5.0.0 + JBoss Seam 2.1.1 + Ant 1.7

基本的に、これ

SATOSHI ABE ON BLOG: Configuration Of Eclipse, JBoss AS, JBoss Seam

の内容で大丈夫だ。


メモ
- JDK 1.6 でも大丈夫そう
- Ant 1.7 でも大丈夫そう
- シングルコアなマシンだと負荷が

org.hibernate.AnnotationException: No identifier specified for entity

If you got an error message below:


org.hibernate.AnnotationException: No identifier specified for entity


Probably you did not define an '@Id' annotation in your entity bean class.

Thursday, January 22, 2009

01/22/2009

午前
・新木場で面談

午後
・自社にて作業
・金曜か月曜に面談の結果をもらう予定
・結果は微妙なので平行で面談をスケジュール
・ひとつは書類でダメ
・もうひとつの案件の要求は JBoss Seam + JSF なので避けたいかもしれない
・JBoss AS + JBoss Seam + JSF の環境で、まもとに開発できていない(自宅


・あまり寝ていない

Wednesday, January 21, 2009

01/21/2009

また 5 時まで活動していたせいで、かなり寝不足だった。うっかりマブタを閉じて深呼吸しようものなら、速攻で落ちてしまいそうな状態だった。体力ないな...。池袋の事務所に出社する前に、前の会社、つまり原宿の事務所に立ち寄った。保険証を手渡した後、移動して、いつもどおりに出社した。自習で作成している Web アプリケーションを、フレームワークを使用して改めて構築しはじめた。だが、寝不足で集中できず、ほとんど作業を進められなかった。明日、10 時から面談が予定されているため、さすがに今夜、夜更かしできない。2 時までに寝たいと思っている。JBoss と Seam を使用して Web アプリケーションを開発するための環境を準備している。サンプルまで確認できる状態だが、とりあえずアプリケーションサーバの起動に時間を必要とする。2 分を考慮しておきたい。(古いマシンなので

Creating a jar file

% jar cf jar-file input-file(s)

Tuesday, January 20, 2009

01/20/2009

05:00 過ぎに寝たので、日中、かなり眠かった。まぶたを閉じたら速攻で眠れるような状態だった。Hibernate の動作を確認してドキュメント化した。動作させるだけなら簡単だな、という印象。パフォーマンスはどうなんでしょうか?ついてに JPA について調査したが、いまいち理解できず。Jakarta プロジェクトに JCS というプロジェクトを発見し、簡単に動作させてみた。キャッシュな機能を提供してくれるらしい。パフォーマンスを測定してみないと何とも言えないが、効果はあるんだろうな。依存関係のある jar がソースだけで提供されているので手間どってしまった。恥ずかしす。Yahoo! オークションに出品されていた T42p を落札できなかった。値段が高くなりすぎたため。翌朝、原宿に立ち寄ってから出社する予定だ。

Using JCS

// TODO : must be updated
// must be added
// --- commons logging
// --- concurrent


参考 :
Build faster Web applications with caching



Java の Web アプリケーションにて利用できるキャッシュの機能を提供してくれるツール?を発見した。早速、基本的な取り扱いを確認してみようと思う。まず、以下のリンク

JCS - Java Caching System

を表示し、バイナリパッケージをダウンロードする。

"jcs-1.3.tar.gz"

現在、バージョンは、1.3 のようだ。アーカイブを unpack すると、次の jar ファイルを確認できるだろう。

"jcs-1.3.jar"

この jar ファイルを、

"${contextRoot}/WebContent/WEB-INF/lib"

にコピーする。続いて、設定ファイルを記述する。ファイル名は、

"cache.ccf"

だ。ディレクトリ

"${contextRoot}/WebContent/WEB-INF/"

に保存しておく。記述する内容は、以下のとおり。


jcs.default=jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=1000
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache




JCS を使用して簡単なアプリケーションを動作させてみよう。まず、Person クラスを作成する。

Person.java

package jp.launchpad.example;

import java.io.Serializable;

public class Person implements Serializable {

    private static final long serialVersionUID = 6200983303551684087L;

    private String id;
    private String firstname;
    private String lastname;
    private String age;

    public Person(String id, String firstname, String lastname, String age) {
        this.id = id;
        this.firstname = firstname;
        this.lastname = lastname;
        this.age = age;
    }

    public String getId() {
        return id;
    }

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

    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 String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String toString() {
        return "'id' is: " + id + "\n";
    }

}



Person オブジェクトを取り扱うマネージャクラスの主なタスク

- Person オブジェクトを取得する。
- Person オブジェクトをキャッシュに保存する。
- Person オブジェクトをキャッシュから削除する。



PersonManager.java

package jp.launchpad.example;

import org.apache.jcs.JCS;
import org.apache.jcs.access.exception.CacheException;

public class PersonManager {

    JCS personCache;
    Person person;

    public static void main(String[] args) {
        PersonManager pm = new PersonManager();
        Person person = pm.getPerson("10");
        if (person != null) {
            System.out.println(person.toString());
        } else {
            System.out.println("person is null!");
        }
    }

    public Person getPerson(String id) {
        try {
            personCache = JCS.getInstance("default");
            person = (Person) personCache.get(id);
        } catch (CacheException ce) {
            person = null;
        }
        if (person == null) {
            // Retrieving user data from database
            person = new Person("10", "firstName", "lastName", "age");
            if (this.setPerson(
                    person.getId(),
                    person.getFirstname(),
                    person.getLastname(),
                    person.getAge()
                    )) {
                return person;
            }
        }            
        return null;
    }

    public boolean setPerson(String id, String firstname, String lastname,     String age) {
        Person person = new Person(id, firstname, lastname, age);
        try {
            personCache = JCS.getInstance("default");
            personCache.put(id, person);
            return true;
        } catch (CacheException e) {
            e.printStackTrace();
            return false;
        }
    }

    public boolean cleanPerson(String id) {
        try {
            personCache = JCS.getInstance("default");
            personCache.remove(id);
            return true;
        } catch (CacheException e) {
            e.printStackTrace();
            return false;
        }
    }
    
    public boolean cleanPerson() {
        try {
            personCache = JCS.getInstance("default");
            personCache.clear();
            return true;
        } catch (CacheException e) {
            e.printStackTrace();
            return false;
        }
    }

}

Using Hibernate

http://www.atmarkit.co.jp/fjava/rensai3/ormap01/ormap01.html

を参考に、Hibernate を使用してみる。上記の URL で解説されている内容が古いため、今回の解説と異なる部分が存在する。



環境は以下のとおり。

Ubuntu Linux 8.10
JDK 1.6
Eclipse 3.4
PostgreSQL 8.3
Hibernate 3.3.1



まず、Eclipse でプロジェクトを作成する。"Dynamic Web Project" を選択すると仮定し以下に記述していく。



まず、データベースをインストールしておく。

% sudo apt-get install postgresql

設定ファイルの編集を省略する。




JDBC ドライバをダウンロード

% wget http://jdbc.postgresql.org/download/postgresql-8.3-604.jdbc4.jar

し、

"${contextRoot}/WebContent/WEB-INF/lib"

に保存する。




最新の Hibernate をダウンロードする。

% wget http://nchc.dl.sourceforge.net/sourceforge/hibernate/hibernate-distribution-3.3.1.GA-dist.tar.gz

アーカイブを展開する。まず、

"hibernate-distribution-3.3.1.GA"

ディレクトリに存在する

"hibernate3.jar"

を、

"${contextRoot}/WebContent/WEB-INF/lib"

にコピーする。続いて、以下のディレクトリ

"hibernate-distribution-3.3.1.GA/lib/required/"

に存在するファイル、具体的に

antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
javassist-3.4.GA.jar
jta-1.1.jar
//slf4j-api-1.5.2.jar



"${contextRoot}/WebContent/WEB-INF/lib"

にコピーする。



SLF4J の最新バージョンを http://www.slf4j.org/download.html からダウンロードする。

ディレクトリ

"slf4j-1.5.6"

に保存されている以下のファイルを、

slf4j-api-1.5.6.jar
slf4j-nop-1.5.6.jar
slf4j-simple-1.5.6.jar
slf4j-log4j12-1.5.6.jar
slf4j-jdk14-1.5.6.jar

"${contextRoot}/WebContent/WEB-INF/lib"

にコピーする。



続いて、Hibernate の設定ファイルを作成する。ディレクトリ

"${contextRoot}/src"



"hibernate.cfg.xml"

を作成する。


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd" >
<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">org.postgresql.Driver</property>
        <property name="connection.url">jdbc:postgresql://localhost:5432/yourdb</property>
        <property name="connection.username">you</property>
        <property name="connection.password">yourpassword</property>
        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="show_sql">true</property>
        <property name="use_outer_join">true</property>
        <mapping resource="EMP.hbm.xml" />
    </session-factory>
</hibernate-configuration>




ディレクトリ

"${contextRoot}/src"



"EMP.hbm.xml"

を作成する。


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
    <class name="jp.launchpad.entity.Emp" table="EMP">
        <id name="empno" column="EMPNO" type="int">
            <generator class="assigned" />
        </id>
        <property name="ename" type="string" column="ENAME" />
        <property name="job" type="string" column="JOB" />
        <property name="hiredate" type="date" column="HIREDATE" />
    </class>
</hibernate-mapping>




テストテーブルとテストデータ:

CREATE TABLE emp (empno INT NOT NULL PRIMARY KEY,ename VARCHAR(10),job VARCHAR(10),hiredate date);
INSERT INTO emp VALUES(1,'aaa','AAA','2000-04-01');
INSERT INTO emp VALUES(2,'bbb','BBB','2001-04-01');
INSERT INTO emp VALUES(3,'ccc','CCC','2002-04-01');
INSERT INTO emp VALUES(4,'ddd','DDD','2003-04-01');
INSERT INTO emp VALUES(5,'eee','EEE','2004-04-01');




Emp.java:

package jp.launchpad.entity;

import java.io.Serializable;
import java.util.Date;

public class Emp implements Serializable {

    private Integer empno;
    private String ename;
    private String job;
    private Date hiredate;

    public Emp() {
        //
    }

    public Integer getEmpno() {
        return this.empno;
    }

    public void setEmpno(Integer empno) {
        this.empno = empno;
    }

    public String getEname() {
        return this.ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public String getJob() {
        return this.job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Date getHiredate() {
        return this.hiredate;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

}




FindSample.java:

package jp.launchpad;

import java.util.List;

import jp.launchpad.entity.Emp;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class FindSample {

    public static void main(String[] args) throws HibernateException {

        SessionFactory sessionfactory = new Configuration().configure().buildSessionFactory();

        Session session = sessionfactory.openSession();

        List<?> list = session.createCriteria(Emp.class).list();

        for (int i = 0; i < list.size(); i++) {
            Emp emp = (Emp) list.get(i);

            System.out.println(emp.getEmpno() + ":" + emp.getEname());
        }
    }
}




"FindSample" を実行する。



続いて、アップデートを実行するクラスを作成する。


package jp.launchpad;

import jp.launchpad.entity.Emp;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class UpdateSample {

    public static void main(String[] args) throws HibernateException {

        SessionFactory sessionfactory =new Configuration().configure().buildSessionFactory();
        Session session = sessionfactory.openSession();

        Transaction trans = session.beginTransaction();

        Emp emp = (Emp) session.load(Emp.class, new Integer(1));

        emp.setJob("Sales");

        session.update(emp);

        trans.commit();
        session.close();
    }

}




続いて、インサート実行するクラスを作成する。


package jp.launchpad;

import jp.launchpad.entity.Emp;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class InsertSample {

    public static void main(String[] args) throws HibernateException {

        SessionFactory sessionfactory =new Configuration().configure().buildSessionFactory();
        Session session = sessionfactory.openSession();

        Transaction trans = session.beginTransaction();

        Emp emp = new Emp();
        emp.setEmpno(new Integer(6));
        emp.setEname("fff");

        session.save(emp);

        trans.commit();
        session.close();
    }

}

Monday, January 19, 2009

01/19/2009

自分用の「アドレス帳 Web アプリケーション」の開発を再開した。JSP と Servlet で構築していて、フレームワークを使用していない。アクションクラスに dispatch を記述しまくりで、ゴチャゴチャしてきた。近いうちに Struts ベースに移行する予定だ。Perl の案件 --- 八重洲の --- は、ダメだった。というか、交代するかもしれない担当者が交代しないことになってしまったそうで。まぁ、本当の理由が別にあるかもしれないが。ただ、顔合わせした会社さんの担当者が、別の案件を紹介してくれそうな雰囲気で。とりあえず待ち。予定していなかったが、17 時から神保町で面談することに。というか、メインは若手のふたりで、私はオマケというか、顔を出しておくだけというか、そんな感じだった。以前から?付き合っている会社さんのようで、こっちの担当者とフランクにコミュニケーションしているように見えた。毎回のことながら、経験の少ない自分の経歴を、どうやってステキに見せるか考えなければならないので、いささか疲れた。慣れたけれど。原宿に立ち寄って帰宅する予定だったが、面談が長引いたため立ち寄れなかった。明日にリスケする。

Using Seasar

最近、よく耳にするようになった? Seasar をためしてみる。とりあえず、チュートリアルのパッケージを利用してサンプルを実行してみる。まず、次のページ

Super Agile Struts - Tutorial

で説明されているとおり、

Super Agile Struts - Setup

を参考に、環境をセットアップする。次のページにて、

Super Agile Struts - Download

ファイル

"sa-struts-tutorial-1.0.4-sp3.zip"

をダウンロードする。ダウンロードする時期によりファイル名が異なるはず。unpack すると、

"sa-struts-tutorial"

というディレクトリが生成される。ここで、チュートリアルのページの最下部に記載されているプリミティブなセットアップを選択する。なぜなら、Tomcat Plug-in など、余計なプラグインをインストールしたくないからだ。そこで、まず、Eclipse において新規にプロジェクトを作成する。作成するプロジェクトの種類は、

"Dynamic Web Project"

だ。まず、ファイル

"${contextRoot}/WebContent/.classpath"

に入力されている

"<classpathentry kind="output" path="build/classes"/>"



"<classpathentry kind="output" path="WebContent/WEB-INF/classes"/>"

に変更する。続いて、unpack したディレクトリの

"sa-struts-tutorial/src/main/resources"

に存在するファイルを、

"${contextRoot}/src"

ディレクトリにコピーする。続いて、

"sa-struts-tutorial/src/main/webapp/WEB-INF"

に存在するファイル ( チュートリアルに記載されている PATH が異なる ) を、

"${contextRoot}/WebContent/WEB-INF"

にコピーする。続いて、

"sa-struts-tutorial/src/main/webapp/WEB-INF/lib"

に存在するファイル ( チュートリアルに記載されている PATH が異なる ) を、

"${contextRoot}/WebContent/WEB-INF/lib"

にコピーする。続いて、

"sa-struts-tutorial/src/main/java/tutorial"



"${contextRoot}/src"

にコピーして、ビルドする。最後に、プロジェクトを Tomcat のサーバに追加する。Tomcat を起動し、以下の URL を表示して確認する。

http://localhost:8080/${projectName}

以下の

"Welcome to Super Agile Struts Tutorial"

メッセージが表示されるはずだ。

Using regular expressions to extract a value in Java

とりあえずサンプルだけ。

package jp.launchpad.example;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestRE {

    public static void main(String[] args) {
        System.out.println(extractString(
                "http://localhost:8080/addUser?firstname=satoshi&lastname=abe",
                "firstname=[^&]+"));

    }

    public static String extractString(String targetString, String regex) {
        System.out.println(regex);
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(targetString);
        if (matcher.find()) {
            return (matcher.group()).substring(10);
        }
        return "Not Found";
    }

}

Sunday, January 18, 2009

01/18/2009

5:30 ごろに寝た。11:00 に目覚ましをセットし、13:00 から髪をカットする予定だった。おかしな夢を見て目覚めたら、既に 13:30 だった。そのまま放置して、別の店を探そうかとも考えたが、通っている店を気に入っているので、できれば変更したくなかった。そのため、まず電話して謝罪し、リスケジュールしてもらった。18:00 から。「大丈夫ですよ」と言ってくれたが、自分だったら内心キレているかもしれない。私は、カットしてもらっている途中、ほとんど目を閉じている。お任せモードだ。散髪した後、いつも「こんなんなっちゃうのかー」と後悔というか妥協しているが、あの人にカットしてもらうと、不思議と納得できる髪型にしあげてもらえる。今日もそんな感じ。帰り際に、再度、謝罪しておいた。リスケジュールしてから 18:00 までの間、別の X31 の HDD を交換し、キーボードも JIS から US へ変更した。Debian か FreeBSD をインストールするつもりだったが、いろいろ --- Debian は、インストール途中に wireless lan を有効にできなくて諦めた。FreeBSD は、インストーラが途中で停止してしまい何もできないので諦めた。 --- あって、結局 Ubuntu をインストールしてしまった。その Ubuntu を使用して、このポストを書き込みしている。

Saturday, January 17, 2009

01/17/2009

6:00 AM ごろに就寝し、3 時間ほど寝てから活動を再開する予定だったが、目覚めた時刻は 3:30 PM だった...。自社にて新人が勉強をしているはずで、その勉強会に参加する予定だったり、原宿の事務所(前の会社)に立ち寄る予定だったが、いずれも実行できず。Perl な案件の準備をしようとしていたが、なぜか C++ の本を読んでいる。

Using Automatic Indentation in Vim

:set cindent
:set sw=4

Starting to learn C++

% vi hello.cpp

#include <iostream>

int main()
{
    std::cout << "Hello World\n";
    return 0;
}


% g++ -g -Wall -ohello hello.cpp

% ./hello
Hello World
%

Friday, January 16, 2009

use Error in Perl


use Error qw(:try);

try {
    something;
} catch Error with {
    something;
} finally {
    something;
};

Thursday, January 15, 2009

Using XPath in Java

XPath を Java で使用するためのメモ


参考にした Web サイト:

http://www.ibm.com/developerworks/library/x-javaxpathapi.html




${contextRoot}
        |--- conf/
                |--- addressbook.xml
        |--- src/
                |--- jp/
                        |--- launchpad/
                                    |--- app/
                                            |--- UseXPath.java





使用する XML ファイルの例

addressbook.xml:

<?xml version="1.0" encoding="UTF-8"?>
<addressbook>
    <person>
        <firstname>aaa</firstname>
        <lastname>AAA</lastname>
    </person>
    <person>
        <firstname>bbb</firstname>
        <lastname>BBB</lastname>
    </person>
    <person>
        <firstname>ccc</firstname>
        <lastname>CCC</lastname>
    </person>
</addressbook>






使用する Java アプリケーション

UseXPath.java:

package jp.launchpad.app;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class UseXPath {

    public static void main(String[] args)
            throws
                ParserConfigurationException,
                SAXException,
                IOException,
                XPathExpressionException {

        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true);
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse("conf/addressbook.xml");

        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        XPathExpression expr = xpath.compile("//person[firstname='bbb']/lastname/text()");

        Object result = expr.evaluate(doc, XPathConstants.NODESET);
        NodeList nodes = (NodeList) result;
        for (int i = 0; i < nodes.getLength(); i++) {
            System.out.println(nodes.item(i).getNodeValue());
        }

    }

}






実行する

Validating with Commons Validator

http://commons.apache.org/validator/

Wednesday, January 14, 2009

Declaring the web.xml file for Servlets 2.5 and JSP 2.1

<web-app
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
    <display-name>web app name here</display-name>

    <!-- rest of declarations go here -->

</web-app>

Tuesday, January 13, 2009

getQueryString()

このメソッド

"getQueryString()"

の動作をメモしておく。



TestMethodClass.java

package jp.launchpad.example;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class TestMethodClass extends HttpServlet {

    public void doGet(
                HttpServletRequest    request,
                HttpServletResponse    response)
            throws    IOException,
                ServletException {
        PrintWriter out = response.getWriter();
        out.print("<html><head><title></title></head><body>");
        out.print("<h1>request.getQueryString()</h1>");
        out.print("<p>" + request.getQueryString() + "</p>");
        out.print("</body></html>");
    }

}




Deployment Discriptor を、いつもどおりに記述しておく。

web.xml

<servlet>
<servlet-name>aaa</servlet-name>
<servlet-class>jp.launchpad.example.TestMethodClass</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>aaa</servlet-name>
<url-pattern>/TestMethodClass</url-pattern>
</servlet-mapping>




アプリケーションサーバを起動し、以下のような URL を表示して確認する。"${projectName}" に、使用しているプロジェクト名を指定すること。

http://localhost:8080/${projectName}/TestMethodClass?aaa=AAA&bbb=BBB

Configuring Spring and iBATIS

// TODO : かきかけ

iBATIS と Spring Framework を設定したときの作業メモ



Apache iBATIS:
http://ibatis.apache.org/

Spring Framework:
http://www.springsource.org/



参考にした Web サイト:
iBatis tutorial ibatis Spring Integration ibatis tutorials iBatis interview questions iBatis FAQs Hibernate Tutorial



// 環境を設定する

0-1. Spring - iBATIS を stand alone アプリケーションとして使用する

- Spring Framework の設定ファイル --- applicationContext.xml --- を定義する。
- iBATIS の設定ファイル --- SqlMapConfig.xml --- を定義する。
- iBAITS が読み込む SQL Map ファイルを定義する。


0-2. Spring - iBATIS を Web アプリケーションとして使用する

上記の設定に加え、web.xml を設定する。



==================================================
==================================================

01. Spring Framework を設定する


http://satoshiabe.blogspot.com/2009/01/blog-post_1569.html





02. iBATIS をダウンロードする


iBATIS for Java Downloads


ダウンロードしたファイル:

ibatis-2.3.4.726.zip


ダウンロードしたファイルを展開する。"lib/ibatis-2.3.4.726.jar" を、iBATIS の jar ファイルを、アプリケーションのクラスパスに設定されているディレクトリ、通常、"WEB-INF/lib" に保存する。ダウンロードしたバージョンによりファイル名が異なるはず。





03. 他に必要なパッケージ


jar ファイルをアプリケーションのクラスパスに設定されているディレクトリに保存する。

http://commons.apache.org/dbcp/download_dbcp.cgi
http://commons.apache.org/pool/download_pool.cgi





04. Trade.java


package jp.launchpad;

public class Trade {

    private long tradeId;
    private String action;
    private String symbol;
    private long shares;
    private double price;
    private String state;

    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public long getShares() {
        return shares;
    }

    public void setShares(long shares) {
        this.shares = shares;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getSymbol() {
        return symbol;
    }

    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }

    public long getTradeId() {
        return tradeId;
    }

    public void setTradeId(long tradeId) {
        this.tradeId = tradeId;
    }

    public String toString() {
        return ("TRADE " + tradeId + ": " + action + ", " + symbol + ", " + shares + " shares, $" + price + "/share (" + state + ")");
    }

}






05. Creating a table


参考にした Web サイトの解説が Oracle を想定していたため、CREATE TABLE 文を PostgreSQL に適応させた。具体的に、NUMBER 型を INT 型へ変更した。

CREATE TABLE TRADE (
TRADE_ID int NOT NULL,
SIDE varchar (10) NOT NULL,
SYMBOL varchar (6) NOT NULL,
SHARES int NOT NULL,
PRICE int NOT NULL,
STATE varchar (20) NOT NULL,
PRIMARY KEY (TRADE_ID)
)




テーブルにデータをインサートしておく。

INSERT INTO trade VALUES (1, 'hoge', 'HOGE', 10, 100, 'hogehoge')
INSERT INTO trade VALUES (2, 'fuga', 'FUGA', 20, 200, 'fugafuga')





06. applicationContext.xml


Spring Framework の設定ファイルを作成する。iBATIS の情報などを記述する。

"${contextRoot}/WebContent/WEB-INF/applicationContext.xml"


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

    <bean
        id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property
            name="driverClassName"
            value="org.postgresql.Driver" />
        <property
            name="url"
            value="jdbc:postgresql://localhost:5432/yourdb" />
        <property
            name="username"
            value="you" />
        <property
            name="password"
            value="yourpassword" />
    </bean>

    <bean
        id="sqlMap"
        class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property
            name="configLocation">
        <value>classpath:SqlMapConfig.xml</value>
        </property>
        <property
            name="dataSource"
            ref="dataSource" />
    </bean>

    <bean
        id="tradingService"
        class="jp.launchpad.TradeServiceImpl">
        <property
        name="sqlMapClient"
        ref="sqlMap" />
    </bean>

</beans>






07. SqlMapConfig.xml


iBATIS SQL maps を定義する。


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL MAP Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
    <settings useStatementNamespaces="true"/>
    <sqlMap resource="TradingSQLMap.xml"/>
</sqlMapConfig>






08. TradingSQLMap.xml


SQL map ファイルを作成、および内容を定義する。


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL MAP 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="trading">

    <typeAlias alias="trade" type="jp.launchpad.Trade"/>
    <cacheModel id="tradeCache" type="LRU" readOnly="true">
        <flushInterval hours="24"/>
        <flushOnExecute statement="trading.executeTrade"/>
        <property name="cache-size" value="1000"/>
    </cacheModel>

    <resultMap id="tradeResult" class="trade">
        <result property="tradeId" column="TRADE_ID"/>
        <result property="action" column="SIDE"/>
        <result property="symbol" column="SYMBOL"/>
        <result property="shares" column="SHARES"/>
        <result property="price" column="PRICE"/>
        <result property="state" column="STATE"/>
    </resultMap>

    <select
        id="getTrade"
        parameterClass="long"
        resultMap="tradeResult"
        cacheModel="tradeCache">
        SELECT
            TRADE_ID,
            SIDE,    
            SYMBOL,
            SHARES,
            PRICE,
            STATE
        FROM
            TRADE
        WHERE
            TRADE_ID = #id#
    </select>

    <update id="executeTrade" parameterClass="long">
        UPDATE
            TRADE
        SET
            STATE = 'EXECUTED'
        WHERE
            TRADE_ID = #id#
    </update>

</sqlMap>






09. ITradeService.java


interfarce を作成する。


package jp.launchpad;

import jp.launchpad.Trade;

public interface ITradeService {

    public Trade getTrade(long tradeId) throws Exception;
    public void executeTrade(long tradeId) throws Exception;

}






10. TradeServiceImpl.java


実装クラスを作成する。


package jp.launchpad;

import com.ibatis.sqlmap.client.SqlMapClient;

public class TradeServiceImpl implements ITradeService {

    protected SqlMapClient sqlMap = null;

    @Override
    public void executeTrade(long tradeId) throws Exception {
        sqlMap.update("trading.executeTrade", tradeId);
    }

    @Override
    public Trade getTrade(long tradeId) throws Exception {
        return (Trade) sqlMap.queryForObject("trading.getTrade", tradeId);
    }

    public void setSqlMapClient(SqlMapClient sqlMap) {
        this.sqlMap = sqlMap;
    }

}






10. IBatisClient.java


実行クラスを作成する。


package jp.launchpad;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class IBatisClient {

    public static void main(String[] args) {

        try {

            System.out.println("IBatisClient started");
            System.out.println(" ");

            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
            System.out.println("Classpath loaded");
            System.out.println(" ");
            ITradeService service = (ITradeService) ctx.getBean("tradingService");
            int tradeId = 1;
            System.out.println("BEFORE: " + service.getTrade(tradeId));

            service.executeTrade(tradeId);
            System.out.println("AFTER : " + service.getTrade(tradeId));
            System.out.println(" ");
            System.out.println("Hurry!!!! Its done!");

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}






11. 実行する。


IBatisClient.java を実行し、結果を確認する。SELECT ---> UPDATE ---> SELECT の順序で実行される。

Using Comparator In Java

1. """java.util.Comparator""" を実行するクラスを作成する。

2. Comparator で宣言されているメソッド compare で順序関係を定義する。

3. compare は 2 つのオブジェクトを引数にとる。最初の引数が
    """小さい""" とき ---> 負の整数を return するよう実装する。
    """等しい""" とき ---> 0 を return するよう実装する。
    """大きい""" とき ---> 正の整数を return するよう実装する。





Person.java

package jp.launchpad.app;

public class Person {

    public String username;
    public int age;

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}






PersonComparator.java

package jp.launchpad.app;

import java.util.Comparator;

public class PersonComparator implements Comparator>Person> {

    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge() - o2.getAge();
    }

}






UseComparator.java

package jp.launchpad.app;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class UseComparator {

    public static void main(String[] args) {

        Person person01 = new Person();
        person01.setUsername("Satoshi ABE");
        person01.setAge(30);

        Person person02 = new Person();
        person02.setUsername("Taro Yamada");
        person02.setAge(23);

        Person person03 = new Person();
        person03.setUsername("Hanako Yamada");
        person03.setAge(36);

        Person person04 = new Person();
        person04.setUsername("Hoge Fuga");
        person04.setAge(10);

        List >Person> list = new ArrayList >Person> ();
        list.add(person01);
        list.add(person02);
        list.add(person03);
        list.add(person04);

        Collections.sort(list, new PersonComparator());
        for (Person p : list) {
            System.out.println(p.getUsername() + " " + p.getAge());
        }
    }
}

Monday, January 12, 2009

Creating A Calendar In Java

コンソールにカレンダー情報を出力する Java のソースコードだ。Calendar クラスを使用する練習を兼ねて。

package jp.launchpad.app;

import java.util.Calendar;

public class CreateCalendar {

    public static void main(String[] args) {
        createCalendar(2009, 12);
    }

    public static void createCalendar(int year, int month) {

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month - 1);
        calendar.set(Calendar.DATE, 1);

        int theFirstDayOfTheWeek = calendar.get(Calendar.DAY_OF_WEEK);
        int theLastDayOfTheMonth = calendar.getActualMaximum(Calendar.DATE);

        System.out.println("SU MO TU WE TH FR SA");

        for (int x = 1; x <= theFirstDayOfTheWeek - 1; x++) {
            System.out.print("** ");
        }

        for (int x = 1; x <= theLastDayOfTheMonth; x++) {
            if (x <= 9) {
                System.out.print(" " + x + " ");
            } else {
                System.out.print(x + " ");
            }
            if ((x + theFirstDayOfTheWeek - 1) % 7 == 0) {
                System.out.println("");
            }
        }
    }
}

Saturday, January 10, 2009

UI design with Struts and Tiles

Apache Struts 1.3.10 と Struts Title 2.0.7 を組み合わせしたときの作業メモ。Tiles のメモを中心に記述するため、Struts の作業を省略する。


Struts Tiles のファイルを、以下の URL からダウンロードする。

Apache Tiles 2
http://tiles.apache.org/download.html

ダウンロードしたファイル:
tiles-2.0.7-bin.tar.gz

この binary distribution は、Java 5.0 以上を必要とする。自分は、1.6 つまり 6 を使用している。



### 基本的に Tiles のオフィシャルなドキュメンテーションを確認しつつ作業する ###

Apache Tiles - Framework - Getting started
http://tiles.apache.org/2.0/framework/getting_started.html


以下のファイルを "WEB-INF/lib" ディレクトリに保存する。なお、これらの jar ファイルは、Tiles ディストリビューションの "lib" ディレクトリなどに保存されているため、それらを使用すればよさそうだ。

tiles-core-VERSION.jar
tiles-api-VERSION.jar

以下の、依存関係のあるファイルも "WEB-INF/lib" ディレクトリに保存する。もし、JSP サポート ( TODO : "JSP サポートの意味" ) を必要とするなら、tiles-jsp-VERSION.jar も "WEB-INF/lib" ディレクトリに保存する。

Jakarta Commons BeanUtils 1.7.0 or above;
Jakarta Commons Digester 1.8 or above;
Jakarta Commons Logging (at least API) 1.1 or above.

とりあえず、以上で準備を終了する。


続いて、Deployment Discripter --- DD --- に設定を記述する。

web.xml:

<servlet>
    <servlet-name>tiles</servlet-name>
    <servlet-class>org.apache.tiles.web.startup.TilesServlet</servlet-class>
    <init-param>
    <param-name>
        org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG
    </param-name>
    <param-value>
        /WEB-INF/tiles-defs.xml,/org/apache/tiles/classpath-defs.xml
    </param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>




続いて、具体的に設定してみる。

http://tiles.apache.org/2.0/framework/tutorial/basic/concepts.html



${contextRoot}/WEB-INF/layouts/classic.jsp

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<table>
    <tr>
        <td colspan="2"><tiles:insertAttribute name="header" /></td>
    </tr>
    <tr>
        <td><tiles:insertAttribute name="menu" /></td>
        <td><tiles:insertAttribute name="body" /></td>
    </tr>
    <tr>
        <td colspan="2"><tiles:insertAttribute name="footer" /></td>
    </tr>
</table>




${contextRoot}/WEB-INF/tiles-defs.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN" "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
    <definition name="myapp.homepage" template="/layouts/classic.jsp">
        <put-attribute name="header" value="/tiles/banner.jsp" />
        <put-attribute name="menu" value="/tiles/common_menu.jsp" />
        <put-attribute name="body" value="/tiles/home_body.jsp" />
        <put-attribute name="footer" value="/tiles/credits.jsp" />
    </definition>
</tiles-definitions>




以下のファイルを作成する。

${contextRoot}/WEB-INF/tiles/banner.jsp
${contextRoot}/WEB-INF/tiles/common_menu.jsp
${contextRoot}/WEB-INF/tiles/home_body.jsp
${contextRoot}/WEB-INF/tiles/credits.jsp



以下のファイルを作成する。

${contextRoot}/WEB-INF/pages/index.jsp

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<tiles:insertDefinition name="myapp.homepage" />




Tomcat を起動し、以下の URL を表示して確認する。

http://localhost:8080/${projectName}/pages/index.jsp

Friday, January 09, 2009

Using Spring Framework

Spring Framework を設定したメモ。あとで例を記述する。

このページを参考にした。
http://www.atmarkit.co.jp/fjava/rensai3/springdi01/springdi01_2.html


ファイルをダウンロードする。

http://www.springsource.org/download

現在の最新版は、2.5.6 だった。

"spring-framework-2.5.6-with-dependencies.zip"


ダウンロードした zip ファイルを展開する。続いて、以下の jar ファイルを、"${contextRoot}/WEB-INF/lib" に保存する。

./spring-framework-2.5.6/dist/spring.jar
./spring-framework-2.5.6/lib/jakarta-commons/commons-logging.jar



Target.java

package jp.launchpad.core;

public class Target {
    public Target() {
        //
    }
    private String message;
    public String getMessage() {
        return this.message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}




SpringTest.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {
    public static void main(String args[]) {
        ApplicationContext contxt = new ClassPathXmlApplicationContext("applicationContext.xml");
        Target target = (Target) contxt.getBean("target");
        System.out.println(target.getMessage());
    }
}




"applicationContext.xml" ファイルを作成し、CLASSPATH が設定されているディレクトリに保存する。


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="target" class="jp.launchpad.core.Target">
        <property name="message">
            <value>Hello World!</value>
        </property>
    </bean>
</beans>




SpringTest ファイルを実行し、コンソールに "Hello World!" が出力されたら成功だ。


((つづく))

Using DynaValidatorForm

DynaValidatorForm を使用したときのメモ。



"DynaValidatorForm" を使用するため、"struts-config.xml" に以下が記述されていること。

struts-config.xml
<plug-in
    className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property
        property="pathnames"
        value="/org/apache/struts/validator/validator-rules.xml, /WEB-INF/validation.xml" />
</plug-in>



"DynaValidatorForm" を使用するための FromBean の記述の例:

struts-config.xml
<form-beans>
    <form-bean name="exampleName" type="org.apache.struts.validator.DynaValidatorForm">
        <form-property name="id" type="java.lang.String" />
        <form-property name="name" type="java.lang.String" />
        <form-property name="address" type="java.lang.String" />
    </form-bean>
</form-beans>



Action の記述の例:

struts-config.xml
<action
    path="/examplePath"
    name="exampleName"
    scope="session"
    type="jp.launchpad.example.ExampleAction"
    input="/pages/0.jsp">
    <forward
        name="success"
        path="/pages/1.jsp"
        redirect="false" />
</action>



Action クラスの例:

package jp.launchpad.example;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.DynaValidatorForm;

public class ExampleAction extends Action {

    public ActionForward execute(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
        throws ServletException, IOException {

        DynaValidatorForm dynaForm = (DynaValidatorForm) form;

        request.setAttribute("dynaForm", dynaForm);

        return mapping.findForward("success");
    }

}



POST を実行する JSP

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>0.jsp</title>
</head>
<body>
<form action="/struts-1/examplePath.do" method="post">
<p>id : <input type="text" name="id" /></p>
<p>name : <input type="text" name="name" /></p>
<p>address : <input type="text" name="address" /></p>
<input type="submit" value="SUBMIT" />
</form>
</body>
</html>



POST された内容を表示する JSP

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>1.jsp</title>
</head>
<body>
<p><%= ((org.apache.commons.beanutils.DynaBean)request.getAttribute("dynaForm")).get("id") %></p>
</body>
</html>

Using DynaActionForm

ActionFormBean は、

- プライベート変数
- アクセッサメソッド

の集合である。単純に ActionFormBean を使用するだけなら、このようなクラスを作成する作業を手間を感じるかもしれない。Apache Struts のバージョン 1.1 から DynaActionForm を使用できるようになっている。この DynaActionForm を使用すると、ActionFormBean を作成せずに済ませられる。



"struts-config.xml" に、以下のように記述する。ActionFormBean に記述していたプライベート変数ごとに、変数名と型を指定する。

<form-bean name="exampleName" type="org.apache.struts.action.DynaActionForm">
    <form-property name="id" type="java.lang.String"/>
    <form-property name="name" type="java.lang.String"/>
    <form-property name="address" type="java.lang.String"/>
</form-bean>




"struts-config.xml" に記述する Action クラスの指定は、いつものとおり。

<action
    path="/examplePath"
    name="exampleName"
    scope="session"
    type="jp.launchpad.example.ExampleAction"
    input="/pages/0.jsp">
    <forward
        name="success"
        path="/pages/1.jsp"
        redirect="false" />
</action>




Action クラスの例。

package jp.launchpad.example;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;

public class ExampleAction extends Action {

    public ActionForward execute(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response) {

        DynaActionForm objectForm = (DynaActionForm) form;

        request.setAttribute("objectForm", objectForm);

        return mapping.findForward("success");

    }

}




HTML フォームを表示する "0.jsp" を作成する。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>0.jsp</title>
</head>
<body>
<form action="/LaunchPad/examplePath.do" method="post">
<p>id : <input type="text" name="id" /></p>
<p>name : <input type="text" name="name" /></p>
<p>address : <input type="text" name="address" /></p>
<input type="submit" value="SUBMIT" />
</form>
</body>
</html>




POST されたデータを表示する JSP を、"1.jsp" として作成する。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>1.jsp</title>
</head>
<body>
<p><%= ((org.apache.struts.action.DynaActionForm) request.getAttribute("objectForm")).get("id") %></p>
</body>
</html>




確認する。

http://localhost:8080/pages/0.jsp

Thursday, January 08, 2009

Using ValidatorForm

Validator は、バージョン 1.1 から Apache Struts の一部となっている。



"ActionForm" を extends して FormBean クラスを定義する場合、FormBean が保持する内容を validation するなら、自分で validate() メソッドを実装しなければならない。だが、この "ValidatorForm" を使用して、もっと楽に validation を実行できる。

以下に例のクラスを記述するが、変数とアクセッサメソッドを定義しているだけだ。ただし、"ValidatorForm" を extends する。

package jp.launchpad.example;

import org.apache.struts.validator.ValidatorForm;

public class RegisterUserForm extends ValidatorForm {

    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}






ActionForm のクラス:

package jp.launchpad.example;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class RegisterUserAction extends Action {

    public ActionForward execute(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
        throws
            IOException,
            ServletException {

        HttpSession session = request.getSession();
        ActionErrors errors = new ActionErrors();

        RegisterUserForm registerUserForm = (RegisterUserForm) form;

        session.setAttribute("user", registerUserForm);

        return mapping.findForward("success");
    }

}






struts-config.xml の設定:

FormBean の設定:

<form-bean
    name="registerUserForm"
    type="jp.launchpad.example.RegisterUserForm"/>


ActionForm の設定:

<action
    path="/registerUser"
    name="registerUserForm"
    scope="session"
    type="jp.launchpad.example.RegisterUserAction"
    input="/pages/register.jsp">
    <forward
        name="success"
        path="/pages/complete.jsp"
        redirect="false" />
</action>






続いて、"WEB-INF/validation.xml" に validation ルールを記述する。

Struts 1 - Validator Guide
http://struts.apache.org/1.3.10/faqs/validator.html


<form-validation>
....
    <formset>
....
        <form name="registerUserForm">
            <field
                property="username"
                depends="required">
                <arg
                    key="registerUserForm.username" />
            </field>
            <field
                property="password" depends="required,mask">
                <arg
                    key="registerUserForm.password" />
                <var>
                    <var-name>mask</var-name>
                    <var-value>^[0-9a-zA-Z]*$</var-value>
                </var>
            </field>
....
        </form>
    </formset>
....
</form-validation>






MessageResources.properties に記述する例:

registerUserForm.username=username
registerUserForm.password=password





JSP の例:

/pages/register.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html:html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>register.jsp</title>
</head>
<body>
<html:errors/>
<html:form action="registerUser.do" method="post">
<p>username : <html:text property="username"/></p>
<p>password : <html:password property="password"/></p>
<html:submit value="register"/>
</html:form>
</body>
</html:html>




/pages/complete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html:html>
<head>
<title>complete.jsp</title>
</head>
<body>
<html:errors/>
<p>username : <bean:write name="user" property="username"/></p>
<p>password : <bean:write name="user" property="password"/></p>
</body>
</html:html>






アプリケーションサーバを起動し、以下の URL を表示して確認する。

http://localhost:8080/struts-1/pages/register.jsp

Using Apache Struts 1.x

// TODO : 説明が不足している

Apache Strutu 1.x のメモ

過去に記述したメモを紛失してしまった。改めてメモしておく。



1. blank プロジェクトを稼働させる


ゼロからの設定を回避し、Apache Strutu に付属しているアプリケーションを起動させる。とりあえず、Apache Struts のファイルをダウンロードする。現時点の最新版は、1.3.10 だった。以下の URL を表示し、

http://struts.apache.org/download.cgi

ファイル

"struts-1.3.10-all.zip"

をダウンロードし、ファイルを展開する。すると、

./struts-1.3.10/apps/

ディレクトリに、war ファイルが保存されている。これらの war ファイルから、"struts-blank-1.3.10.war" を使用する。





2. Eclipse にインポートする


[File] ---> [Import] ---> [Web] ---> [War file]

サーバを設定する(事前にアプリケーションサーバ(Apache Tomcat など)を設定しておくこと





3. ビルド


以下のファイル

${contextRoot}/WebContent/WEB-INF/src/build.xml

を右クリックし、

[Run As] ---> [Ant Build]

を実行する。





4. 確認


アプリケーションサーバを起動し、以下の URL を表示して確認する。

http://localhost:8080/${contextRoot}/

正常に設定できていれば、メッセージが表示されるはずだ。





5. カスタマイズ


# /pages/register.jsp

JSP ファイルを作成する。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html:html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>register.jsp</title>
</head>
<body>
<html:form action="/registerUser" method="post">
<p>username : <html:text property="username"/></p>
<p>password : <html:password property="password"/></p>
<html:submit value="register"/>
</html:form>
</body>
</html:html>




# /pages/registered.jsp

JSP ファイルを作成する。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html:html>
<head>
<title>registered.jsp</title>
</head>
<body>
<p>username : <bean:write name="user" property="username"/></p>
<p>password : <bean:write name="user" property="password"/></p>
</body>
</html:html>




// struts-config.xml

<struts-config>
    <form-beans>
        <form-bean name="registerUserForm" type="jp.launchpad.example.RegisterUserForm" />
    </form-beans>
    <action-mappings>
        <action
            path="/registerUser"
            name="registerUserForm"
            scope="session"
            type="jp.launchpad.example.RegisterUserAction"
            input="/pages/register.jsp">
            <forward
                name="success"
                path="/pages/complete.jsp"
                redirect="false" />
        </action>
    </action-mappings>
</struts-config>




// RegisterUserForm.java

package jp.launchpad.example;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

public class RegisterUserForm extends ActionForm {

    private String username = null;
    private String password = null;

    public void reset() {
        this.username = null;
        this.password = null;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
        ActionErrors errors = new ActionErrors();

        if (getUsername().length() < 1) {
            errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("errors.required", "USERNAME"));
        }
        return errors;
    }

}




// RegisterUserAction.java


package jp.launchpad.example;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class RegisterUserAction extends Action {

    public ActionForward execute(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response) {

        HttpSession session = request.getSession();
        ActionErrors errors = new ActionErrors();

        RegisterUserForm registerUserForm = (RegisterUserForm) form;

        session.setAttribute("user", registerUserForm);

        return mapping.findForward("success");
    }

}





アプリケーションサーバを起動しなおし、以下の URL を表示する。

http://localhost:8080/pages/registerUser.jsp


フォームに値を入力し、POST して動作を確認する。