2008年3月20日木曜日

JavaEE 5 SDKを使ってみる

JMSのチュートリアルを読んでいたら、J2SE1.3のSDKをベースに書かれていたので、
それなら、とJavaEE 5 SDKを使ってみることにした。
だって、各アプリケーションサーバのJNDIのセッティング方法を調べるのが面倒なんだもん!
#実際、プラットフォームがごちゃごちゃな環境では、各APサーバごとに管理方法が異なるため、厄介な話なのだ。

(注意事項)
2008/3/21現在、JavaEE 5 SDK Update 4 は、英語版のみです。
日本語を含めた多言語をサポートした最新バージョンはJava EE 5 SDK Update 3です。
以下のインストール手順はJavaEE 5 SDK Update 4のスナップショットです。
ダウンロードするときは、くれぐれも間違えないように。

1.前提
・JDK 1.6がインストールされていること。
・Windows環境であること。


2.ダウンロード

JavaEEのSDKは以下のリンクからダウンロードする。
※ダウンロードには、SunDeveloperCenterのユーザアカウントが必要です。
http://sdc.sun.co.jp/java/javaee/downloads/index.html

日本語対応の多言語版は、ページの下のほうにあるので、注意してください。


3.インストール

2.でダウンロードした、「java_ee_sdk-5_04-windows-nojdk.exe」を起動する。

Step1. Welcome
「Next」を押す


















Step2. Agreement

「Yes」を選択して、「Next」を押す


















Step3.インストールディレクトリの指定

例ではC:\Sun\SDKとしている。お好きなところで。



















Step4.JDKインストールディレクトリの指定
JDKをインストールしたディレクトリを指定する




Step5. 管理用の設定

・管理者のユーザ名、パスワードを設定する。
・管理機能を呼び出すごとにユーザ名・パスワードを求められるのは面倒なので、
 「Don't Prompt for Admin User Name and Password」を選択する。
・ポートはデフォルトのままにしておく。

















Step6. インストールオプションの設定

  • 「Upgrade from Previous Version」
    • 前バージョンからの設定ファイルの移行は無いので、チェックを外す
  • 「Enable Updatechecker Client」
    • 勝手にバージョンチェックされるのも嫌なので、チェックを外す
  • 「Create Desktop Shortcut to Autodeploy Directory」
    • 便利だけど、これ以上デスクトップを汚したくないので、チェックを外す
  • 「Add bin directory to PATH」
    • パスは追加しておかないとね
  • 「Create Windows Service」
    • 手動でサーバ起動・停止を行うので、チェックは外しておく

















Step7. インストール内容の確認
「Next」を押す
















Step8. インストール中
しばし待たれよ
















Step9. ユーザ登録
登録しておくとパッチの情報とか貰えるらしいけど、
ちょこっと使うだけなので、「Skip Registration」を選択する。

















Step10. インストール完了
サーバの起動は別途手動で行うので、
ここでは「Finish」を押して、インストールを完了する。

















----------[インストール完了]-----------------

(おまけ)
3'. アンインストール
「プログラムの追加と削除」から「Java Platform, Enterprise Edition 5 SDK」を選択して、削除する。
一部のディレクトリは削除されないので、手動で削除。


4.サーバを起動する

JavaEE5SDKをインストールすると、漏れなく
  • Sun Java System Message Queue 4.1
  • Sun Java System Application Server 9.1
が付いてきます。
Sun Java System Application Serverは、GlassFishをベースとしたAPサーバです。
IBMがGeronimoをベースとしてWAS-CEを作っているのと似ている。
今回使ってみて思ったけど、やっぱり標準サポートのSDKであり、日本語対応がされているという点は大きい。学習用にはもってこい。何よりJNDIの設定が簡単!

話が逸れましたが、サーバを起動するためには、
[スタートメニュー]→[Sun Microsystems]→[JavaEE SDK]→[Start Default Server]をクリックするか、
コマンドプロンプトにて、以下のコマンドを実行する。

asadmin start-domain

サーバが起動するので、ブラウザを使って管理コンソールにアクセスする。
URLは以下のとおり。
(インストール時に管理用コンソールのポートを別の番号にした場合は、そのポート番号を指定する)

http://localhost:4848/login.jsf









ユーザ名、パスワードは、インストール中に指定したものを入力する。
ログインすると、ユーザ登録がどうたら、と聞かれるので、
「Never Register」をクリックする。
















  で、いろいろとメニュー項目を眺めたりするんだけど、全部英語だYO!
  まぁダウンロードするときにEnglishしか選べなかったので、わかっていたことですが。
  そういえばJ2EE 1.4のSDKを使っていたときは日本語だったなぁ、と思い出して、調べたら多言語版があったよorz
  というわけで、多言語版をインストールし直し・・・。
  でもでも、日本語でConnectionFactoryを接続ファクトリと言われてもピンと来なくて、微妙だったりする(笑)

5.JMSの設定を行う
普通ならここでHelloWorld的なWebアプリケーションを作って終わるところだけど、
そんなこたぁ、どうでもいいんです!ルックアップがしたいのですよ!

まずは接続ファクトリの設定から。
管理コンソール画面の、左側にある共通操作ペインから、[リソース]→[JMSリソース]→[接続ファクトリ]を選択して、「新しいJMS接続ファクトリ」作成画面を開く。
















「JNDI名」を「jms/QueueConnectionFactory」とする。
「リソースタイプ」を「javax.jms.QueueConnectionFactory」とする。
他の設定はデフォルトのまま、「了解」ボタンを押して登録する。
なんて簡単なんだ!

続いて、キューの設定を行う。
先ほどと同様に、管理画面左側のペインから、
[リソース]→[JMSリソース]→[接続リソース]を選択して、「新しい接続先リソース」作成画面を開く。

「JNDI名」は「jms/MyQueue」とする。
「物理送信先名」は「MyQueue」とする。(これは送信先リソースのNameプロパティの値になる)
「リソースタイプ」は「javax.jms.Queue」とする。

続いて、キューを作成する。
ここでの操作は、
Sun Java System Message Queue 4.1に反映される。
今度は[構成]→[Javaメッセージサービス]→[JMSホスト]→[物理送信先]を選択する。
「新規」ボタンを押して、以下の設定でキューを作成する。
名前:MyQueue
タイプ:javax.jms.Queue

6.ルックアップを行う

スタンドアロンのアプリからメッセージをputしたい。
やり方は2つ。
まず1つ目は、JMSプロバイダが提供する接続ファクトリとキューを生成して、
宛先名やらキュー名やらを設定する方法。
2つ目は、JNDIでConnectionFactoryとQueueをルックアップして取得する方法がある。

1つ目の方法だと、JMSプロバイダガ提供する独自のクラスを生成する必要があり、
ソースコードの移植性が落ちる。
そこで2つ目の方法を使う。

JNDIを使うためには、まずInitialContextに環境定義を渡す必要がある。

InitialContextのAPIを見ると分かるが、やり方は
  1. プロパティを渡す
  2. jndi.propertiesファイルに設定しておく
の2通りである。
APサーバ上で実行されるAP(Webアプリケーション等)は、APサーバが環境定義を把握しているので、勝手にプロパティを読み込まれる。そのため、AP実装時に、InitialContextのコンストラクタに引数を渡す必要がない。

では、APサーバ上で実行しないAPはどうなるのか。
この場合、自前でプロパティを渡すしかない。
つまり、ソースコードにプロパティを記述して、それをInitialContextのコンストラクタ引数に渡すか、
クラスパス上にjndi.propertiesファイルを作成するか、だ。

以下、Sun Java Application Server上で、先ほど設定したQueueConnectionFactoryをJNDIで取得するためのサンプルだ。

import java.util.Properties;

import javax.jms.Queue;
import javax.jms.QueueConnectionFactory;
import javax.naming.Context;
import javax.naming.InitialContext;

public class JmsSender {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
InitialContext context = new InitialContext(props);
System.out.println("context ok");
QueueConnectionFactory factory = (QueueConnectionFactory)context.lookup("jms/QueueConnectionFactory");
System.out.println("factory ok");
Queue queue = (Queue)context.lookup("jms/MyQueue");
System.out.println("queue ok");
}
}


Propertiesを生成して、値を自前で設定している。

put(Context.INITIAL_CONTEXT_FACTORY
,"com.sun.enterprise.naming.SerialInitContextFactory");

Context.INITIAL_CONTEXT_FACTORYは、実際には「java.naming.factory.initial」という値である。
したがって、jndi.propertiesファイルを用意する場合は、
 java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory
という定義を記述すればよい。これでソースファイルの環境依存性が無くなる。

ただし、厄介なのがこのプロパティ。今回は、「
com.sun.enterprise.naming.SerialInitContextFactory」というコンテキストファクトリを指定したが、
これは今回に限った話で、JNDIプロバイダが異なれば、設定が変わってくる。
しかも、どの値を設定していいのか、よく分からない。

実は、「
com.sun.enterprise.naming.SerialInitContextFactory」という値を取得するために、
一度、Webアプリケーションを作成して、その上でInitialContextを生成して、
そこから環境定義を取得している。
これによってInitialContextの実体クラスを把握できたのだ。

public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
Context context = null;
PrintWriter pw = res.getWriter();

context = new InitialContext();
pw.println("get InitialContext: ok");

Hashtable table = context.getEnvironment(); // コンテキストの環境定義を取得する
pw.println(table.toString());
}


今回はJMSプロバイダとAPは同じホスト上で実行した。
そのため、本来指定しなければならない、Context.PROVIDER_URLの値(JNDIプロバイダのURL)は指定せずに済んだ(※)。
(※指定せずに済んだのは、
コンテキストがSerialInitContextFactoryだったからというのもある)

このURLの指定も、APサーバの設定で異なる。
rmiregistryだったらrmi://localhostとか、
LDAPを使うなら、ldap://ldapserver:900/o=myObjectsとか、ファイルシステムだったら、file:///C:/tempとか、
ActiveMQが提供するファクトリクラスなら、tcp://localhostだってOKだし、
CosNamingならiiop://とか。
とにかくJNDIを使うのは骨が折れるのだ。

JNDIは自前でbindを行ってしまえば、それで使える。

Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
props.put(Context.PROVIDER_URL, "rmi://localhost");
InitialContext context = new InitialContext(props);
context.rebind(JNDI名,オブジェクト);

こうすればコンテキストの生成時に、自分で把握しているプロパティを渡せるので、
今回のようにいちいち調べなくてもよくなる。
ただし、こうなるとAPサーバの管理コンソールに頼れなくなり、管理を全て自前で行う必要がある。


7.まとめ
Sun Java System Application Serverは無償ながら、
多言語にも対応しており、リソースの設定が楽。だけど・・・

JNDIプロバイダ(大抵はAPサーバ)ごとに、以下の情報が異なる。
  • イニシャルコンテキストのファクトリークラス
  • プロバイダーURL
この値を調べるのが大変なので、APサーバには、管理コンソールから、JNDI名とこれらの情報を紐付けてみられるような機能があると嬉しい。
Sun Java System Application Serverにもメニュー項目からそれが見当たらなかったので、また旅に出ます。
とにかくスタンドアロンのJNDIクライアントには厳しい世界です。

2008年3月18日火曜日

JNDI(Java Naming and Directory Interface)

JNDI(Java Naming and Directory Interface)(※下書き中です)

JNDIとは、Javaにおけるネーミングサービス(名前付け)とディレクトリサービス(検索)を扱うためのインタフェースを規定したもの。

どこぞかしこでネーミングネーミングと言うので、ネーミング=検索機能のようなイメージが植付けられてしまっていたけど、よくよく考えたらnaming=名前付けだよなぁ。
それは置いといて、

JNDIの構成は、API(Application Programming Interface)とSPI(Service Provider Interface)から成る。

APIはアプリケーション実装者が使うインタフェース。
SPIはサービス提供者が使うインタフェース。
両者の間にはフレームワークなりアダプタなりが仲介する。

APIとSPIって語呂が似てるけど、
ProgrammingとProviderのところが違うよね。
どうせなら、Programmingに合わせてProvidingにするとか、ProgrammerとProviderにするとか。


回りくどい話はいいとして、本題に入る。

JNDIはオブジェクトと名前を紐付けて管理したり、名前からオブジェクトを検索できたりする。
例えばデータベースは、製品ごとにJDBCドライバが用意されている。
OracleとDB2では、それぞれ用意されているJDBCドライバが異なるので、ドライバのクラス名も当然異なってくる。

こんな感じ
 Class.forName("org.gjt.mm.mysql.Driver")


そうなると、Oracle用のソースコードと、DB2用のソースコードを用意しなければならなくなる。
じゃあクラス名だけ外部ファイルに定義しておけばいいじゃないか、って話になる。
でも、2つのドライバを同時にロードしたいときは?ってなるとそれぞれコードを書かなきゃいけなかったり、いろいろと面倒。いろいろ、のところは各自の経験からあれこれと想像頂きたい。

そこで、JNDIの出番ですよ。ドライバクラスを直接ロードするのではなく、DataSourceを取得する方法をとる。
どういうことかというと、JNDIを使って予めドライバクラスをJNDIネームスペース(※)に登録しておく。
(※名前付けしたオブジェクトを保管しておく領域をJNDIネームスペースという)
で、検索キー(名前)を使ってJNDIネームスペースを検索して、ドライバを取得する。
そうするとDataSourceというオブジェクトが取得できるから、これを使ってさらにConnectionが取得できたりする。
他にもJMSとかいろいろ。

あー、書いてるのめんどくさくなった。とっとと次いこう。

JNDIの使い方よくわからん。おまえ何ぞや。と、思ったわけです。
でも、おかげで、RMIで使ってたrmiregistryは何故立ち上げておく必要があるのか、ようやく理解しました。

JNDIはAPIとSPIからなるものです。そんだけです。だからJNDIを具現化して、JNDIが規定した機能を提供する人が必要です。その人は、アプリケーションサーバだったり、rmiregistryだったり、あるいはファイルシステムだったりします。


基本的な使い方は以下のとおり。

InitialContext context = new InitialContext();
Hoge hoge = (Hoge)context.lookup("ルックアップ名");

まずコンテキストを生成して、そのコンテキストを通して、ルックアップ(検索)を行う。
lookupの引数には、登録したオブジェクトに紐づく名前を指定する。
Hogeは予め登録しておいたオブジェクト。
これで欲しいオブジェクトのインスタンスが取得できた。

基本のスタイルはこれだけ。
でも、これがきっちり出来るようになるためには、JNDIの仕組みをしっかり理解しておかないといけない。
なぜなら、実際は各製品ごとにJNDIの設定を行う事になるから。そして製品ごとに設定の仕方が異なる。



ルックアップ名の定義場所

1.コンテナの配下で動くアプリケーション:web.xml
2.スタンドアローンで動くアプリケーション:application-client.xml

1.はサーブレットやWebアプリケーションやエンタープライズアプリケーション等でJNDIを使いたいときに使う。通常はこちらの方法をとる。
2.は、単独で稼動するアプリケーション(要はmainメソッドがあるようなやつ)がJNDIを使いたいときに使う。ただし、こちらの方法はあまりお勧めはしない。何故なら、ルックアップ名に紐づく定義が変更されると、クライアントアプリケーションの設定(application-client.xml)を変更しなければならないからだ。
つまり、サーバとクライアントが1:Nの関係になっているとして、1箇所直すのか、複数個所直すのか、という運用の話。

そうはいっても、2.を使わなきゃいけないときもある。
何故なら、JMSやらJDBCやらのクライアントアプリケーションが、常にアプリケーションサーバなどのコンテナ上で稼動しているとは限らないからだ。


JNDIの利用シーンとして、JDBCとJMSを使用するときにJNDIを利用するとどうなるか、サンプルコードを示す。

あと、LDAPとか、ファイルシステムとか、java:comp/envとかiiopとかrmi:とかなんとかかんとか。
あ、あとEJBも!

まとまらないので、一時中断。

2008年3月16日日曜日

WAS-CEでJNDIとか

WAS-CEをインストールした
WASの面影が無い
まさにgeronimoだった

それはいいとして、WAS-CEでJDBCプロバイダってどうやって作成するんだ・・・

というわけで、セッティング。

【環境】
WebSphere Application Server Community Edition 2.0.0.1
DB2 9.5

開発環境にEclipseを使うならWAS-CEのサーバアダプタをインストールしておこう!
update siteはこちら。
http://download.boulder.ibm.com/ibmdl/pub/software/websphere/wasce/updates/

(注意)
  Geronimoをインストールしている場合、環境変数「GERONIMO_HOME」を外しておくこと。
  WAS-CEがGERONIMO_HOMEにあるgeronimoを見に行ってしまう。
  #WAS-CEを初回起動したとき、コンソール画面がそのまんまGeronimoで思わず突っ込みを入れてしまった。
   正しい画面を開いても、Geronimoそのままって感じですが。
   (※見た感じはGeronimoの青い画面が紫になっただけ)

【前提】
DB2とWAS-CEはインストールしておいて、立ち上げておく。
DB2にはsampleデータベースをインストールしておく。

【手順】
WAS-CEの管理コンソールから「Database Pools」の管理画面を開く。

「Using the Geronimo database pool wizard」というリンクから、
新規にデータベースプールを作成する。

Create Database PoolのStep1画面が開くので、とりあえず、以下のように設定する。

Name of Database Pool:DB2Pool
Database Type:DB2

次のページ(Step2)に移ると、JDBCドライバを選択する画面になる。
しかし、DB2 9.5用のドライバが見当たらない。
「Download a Driver」というリンクボタンを押しても、DB2 9.5用のダウンロード先が出てこない。

そこで、DB2 9.5のインストール先からjarファイルをコピーする。

まず、9.5用のディレクトリを以下の場所に作成する
{WAS-CEのインストールホーム}/repository/com/ibm/db2/db2jcc/9.5


上記ディレクトリに、以下のdb2jcc.jarファイルをコピーして、「db2jcc-9.5.jar」という名前にリネームする。

{DB2 9.5のインストールホーム}/java/db2jcc.jar
  ↓
{WAS-CEのインストールホーム}/repository/com/ibm/db2/db2jcc/9.5/db2jcc-9.5.jar

で、もう一度、先ほどのCreate Database PoolのStep2画面に戻る。
すると、Dirver Jar一覧の中に、先ほどコピーした9.5用のドライバが出現するので、それを選択する。

あとはDB2の設定環境をそのまま入力。
DBのユーザ名、パスワードを入れて、
ホストやポートの設定をおこなう。


JDBC Driver Class:

See the documentation for your JDBC driver.
Driver JAR:

The JAR(s) required to make a connection to the database. Use CTRL-click or SHIFT-click to select multiple jars.
The JAR(s) should already be installed under GERONIMO/repository/ (or )
DB User Name:

The username used to connect to the database
DB Password:
Confirm Password:

The password used to connect to the database
Driver Connection Properties
Typical JDBC URL:
jdbc:db2://{Host}:{Port}/{Database}
Port:

A property used to connect to DB2. May be optional (see JDBC driver documentation).
Host:

A property used to connect to DB2. May be optional (see JDBC driver documentation).
Database:

A property used to connect to DB2. May be optional (see JDBC driver documentation).


設定が終わったら、次のページ(Step 3)に行く。
ここでは、Final Pool ConfigurationとしてDBの接続テストを行う。
何も気にせず、「Test Connection」ボタンを押せばいい。


Database Pools [view]

Create Database Pool -- Step 3: Final Pool Configuration

JDBC Connect URL:

Make sure the generated URL fits the syntax for your JDBC driver.
Driver Status:
Loaded Successfully
Connection Pool Parameters
Pool Min Size:

The minimum number of connections in the pool. Leave blank for default.
Pool Max Size:

The maximum number of connections in the pool. Leave blank for default.
Blocking Timeout:
(in milliseconds)

The length of time a caller will wait for a connection. Leave blank for default.
Idle Timeout:
(in minutes)

How long a connection can be idle before being closed. Leave blank for default.

Cancel




成功すると、以下のような画面が出る。



Database Pools [view]

Create Database Pool -- Step 4: Test Connection

Test Result:
Connected to DB2/NT SQL09050

Cancel



Deployボタンを押したら、設定完了。


設定が完了したところで、登録されたかどうかを確認する。
Geronimo、もといWAS-CEの管理コンソールより、「JNDI Viewer」を開く。

Search Textと書いてあるボックスに、先ほど設定したデータベースプール名「DB2Pool」を入力して、Findボタンを押す。

すると、「ResourceAdapterModule」という項目の配下に、

 console.dbpool/DB2Pool/1.0/rar

という項目が出てくる。ちなみにrarというのはリソースアダプタ。決して圧縮解凍ではない。

次は、管理コンソールから離れて、Eclipse上で作業を行う。
新規プロジェクトで、[Web]-[動的 Web プロジェクト]を選択して、プロジェクトを作成する。
ここでは、プロジェクト名を「wasce_jndi_sample」とする。

ターゲットランタイムは「IBM WASCE v2.0 デフォルト構成」とする。
※一覧になければ、右側の新規ボタンを押して、「新規サーバ・ランタイム画面」から選択する。
 「新規サーバ・ランタイム画面」になければ、その画面右上にある「追加サーバ・アダプターのダウンロード」リンクを押して、WASCEv2.0のアダプタをダウンロードする。

プロジェクトを作成したら、WEB-INF/web.xmlに以下を追加する。
<?xml version="1.0" encoding="UTF-8"?>
<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>wasce_jndi_sample</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>

<servlet>
<servlet-name>lookup</servlet-name>
<servlet-class>DSLookup</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>lookup</servlet-name>
<url-pattern>/lookup</url-pattern>
</servlet-mapping>
<resource-ref>
<res-ref-name>jdbc/DB2DataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
</web-app>


次に、geronimo-web.xmlを編集する。
編集しようとすると、Geronimo配備プラン・エディターという画面に切り替わるので、
画面下にある「ネーミング」タブを選択する。
左上に「リソース参照」という項目が出るので、その中の「追加」ボタンを押して、
以下の設定で登録する。

参照名:jdbc/DB2DataSource
リソース・リンク:DB2Pool

次に、「デプロイメント」タブを押して、依存関係の設定を行う。
追加ボタンを押して、以下の設定で登録する。

グループID: console.dbpool
アーティファクトID: DB2Pool
バージョン:
Artifact Type:


これで環境面の設定は一通り完了。
ようやくネーミングを行うソースの作成に入れる。長い・・・。
DSLookup.javaを追加する。ソースの中身は以下のとおり。


import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;


public class DSLookup extends HttpServlet {
DataSource ds = null;
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
Context context = null;
PrintWriter pw = res.getWriter();

try {
context = new InitialContext();
pw.println("get InitialContext: ok
");
}
catch(NamingException ne) {
pw.println("get InitialContext: ng
");
ne.printStackTrace(pw);
}

try {
ds = (DataSource)context.lookup("java:comp/env/jdbc/DB2DataSource");
pw.println("get DataSource: ok
");
Connection conn = ds.getConnection();
pw.println("get Connection: ok
");
} catch(NamingException ne) {
pw.println("get DataSource: ng
");
ne.printStackTrace(pw);
} catch (SQLException se) {
pw.println("get Connection: ng
");
se.printStackTrace(pw);
}
}
}

ここまでで、必要な資材は準備完了。
Eclipseのプロジェクト・エクスプローラ画面から、wasce_jndi_sampleプロジェクトを右クリックして、
[エクスポート]-[WARファイル]を選択する。
適当なディレクトリに「wasce_jndi_sample.war」をエクスポートする。

次に、WAS-CEの管理コンソールより、「Deploy New」画面を開く。
Archive:は先ほど出力したwarファイルを選択する。
Plan:は、Eclipseのwasce_jndi_sample内にあるgeronimo-web.xmlを選択する。(先ほど編集してたやつね)

Start app after install のチェックをつけて、「install」ボタンを押す。
これで、デプロイ完了。
あとはブラウザからサーブレットにアクセスする。
web.xmlの編集にて、サーブレット名をlookupと指定したので、アクセスURLは以下のようになる。

http://localhost:8080/wasce_jndi_sample/lookup


こんな感じの画面が表示されれば成功!
get InitialContext: ok

get DataSource: ok

get Connection: ok

brタグが余計だったorz

2007年8月4日土曜日

Google Analytics

Googleが提供するアクセス解析。
JavaScriptのタグを挿入するだけで、自動でアクセス解析をしてくれます。
Blog等では使えるサイトと使えないサイトもありますんで気をつけましょう。

GoogleAnalytics と検索すると直ぐに使えます、ただで。

世界規模のアクセス解析が可能。
データ収集に皆さんご協力お願いしますm(_ _)m


2007年7月31日火曜日

JavaFX

2007年 RIA戦争勃発

ということで、今度はJavaFXを試してみる。
現在、JavaFXの実装はOpenJFXがある。
OpenFX(3Dツール)と名前が似ていて紛らわしい。

■OpenJFX
ダウンロードはこちらから。
https://openjfx.dev.java.net/servlets/ProjectDocumentList

ダウンロードした圧縮ファイルを展開すると、
思いっきりSubversionなディレクトリ構成がみえる。
※Subversionは最新バージョンをtrunk、枝分けしたバージョンをbranches、タグ付けしたバージョンをtagsというディレクトリにそれぞれ配置して管理する文化がある。

ここではtrunkディレクトリをOpenJFXとでもリネームして、適当なディレクトリに配置しておく。
(例)C:\OpenJFX

■Eclipseプラグイン
リモートサイトを新規追加
http://download.java.net/general/openjfx/plugins/eclipse/site.xml

■作る
Javaプロジェクトを新規作成して、srcディレクトリに新規追加でJavaFX File。
ファイル名はsample.fxとした。

import javafx.ui.*;
Frame {
title: "Hello World"
width: 640
height: 480
content: Label {
text: "Hello World"
}
visible: true
}

実行からJavaFXアプリケーションで、構成を作って、引数にsampleと入力して実行。
フレームが表示された。

2007年7月30日月曜日

F# (F Sharp)

ふとF#を試してみようと思いついた。
F#はLispやHaskell、Omal等のいわゆる関数言語に属する。

■ダウンロード
http://research.microsoft.com/fsharp/fsharp.aspx
上記ページの「F# Downloads」から、最新のF#をダウンロードする。
2007/7/30時点の最新版は InstallFSharp-1.9.1.18.msi となる。

■インストール
ダウンロードしたファイルを実行するだけ。
インストール場所もデフォルトのままで。
F#のコンパイラと、VisualStudio(がインストールされている場合)のアドオンがインストールされる。

インストールするとスタートメニューに「Microsoft Research F# 1.9.1.18」というメニューが出てくる。

●パスを通しておく
コマンドラインからコンパイルする場合等のために、binのパスを通しておこう。
C:\Program Files\FSharp-1.9.1.18\bin

■起動してみる
スタートメニューからF#インタラクティブを起動する。
F#インタラクティブにはコンソール版とVisualStudio版があるようだ。
●コンソール版














インタラクティブコンソールはよくわからなかったので、
ソースファイルを書いて、コンパイルしてみる。

hello.fsを作成し、以下のように記述する。

printf "Hello World\n";

hello.fsがある場所までコマンドプロンプトで移動し、コンパイルする。

>fsc hello.js

コンパイルに成功するとhello.exeが作成される。

>hello.exe
Hello World

●VisualStudio版

インタラクティブモードの場合:
VisualStudioを起動して、「ツール」-「アドインマネージャ」をクリックして、
F# interactiveを選択する。

プロジェクトを作成する場合:
VisualStudioを起動して、新規プロジェクトの「その他プロジェクト」から、F#を選択する。













プロジェクトを作成したら、ソリューションエクスプローラビューから、プロジェクトを右クリックして、
「追加」-「新しい項目」を選択し、「F# source file」を追加する。ファイル名はhello.fsとしている。











あとはソースファイルを書いて、実行するだけ。

■何か作ってみる
●足し算
let x = 10
let y = 20
let z = x + y
do Printf.printf "z = %d\n" (z)

結果:
z=30

●文字列
let hello = "Hello"
let world = "World"
do Printf.printf "%s %s!\n" hello world

結果:
Hello World!

●関数
let square x = x*x
do Printf.printf "6^2=%d\n" (square 6)

結果:
6^2=36

●mapを使う場合
let square x = x*x
let m = List.map square [2;4;8]


うん、いい暇つぶしになった。

2007年7月29日日曜日

Flex 3.0

RIAブームの昨今、プラットフォームの選定は開発者にとって悩みの種の一つと言える。
EclipseRCPは使いやすそうだし、OpenLaszloもカバー範囲が広くてよさげだし、
Swingでいくのが手っ取り早いか、Webブラウザに依存するAjaxに走るか。

それぞれに一長一短があり、堅牢さを求めると、
HTMLベースでJavaScript主体でちまちま制御、という話に成りかねない。
であれば、標準でサポートされているSwingなら、5.0から性能も向上したのだし、
ここはSwingで、とも思う。現に、証券や会計等のWebアプリで採用されている。
だが、VBやDelphiと比べ、機能面で見劣りする点は否めない。
(6.0からドラッグ&ドロップやOS連携等の強力なサポートがなされているので、今後期待できることは間違いない)

そんな時折、見つけたのがこれ。
http://finance.google.com/finance

抜群の操作性。Flashで作られている。そういうわけで、Flashをやろうと。

Flash自体はWebデザイナ向けという感じで、デベロッパは手を出しにくい事情があるが、
Flashベースのデベロッパ向けのフレームワークとして、Flexがある。

Flexが3.0からオープンソース化されるとかいう話が出たので、
今後普及に拍車がかかると見込んで、いざ挑戦。

Flex開発環境であるFlex Builderには、以下の2種類がある。
  • スタンドアロン版(Eclipseを拡張して単独で動くようにしたもの)
  • Eclipseのプラグイン版
■必要なもの
JDK6.0
Eclipse 3.3
(上記2つはインストール済みの前提)
Flex Builder 3.0 beta Eclipse plug-in

■Flex 3.0 beta ダウンロード
AdobeのID登録(無償)が必要。
http://labs.adobe.com/technologies/flex/flexbuilder3/
flexbuilder3_b1_win_plugin_061107.exe

beta版なのに30日試用らしい。
シリアル番号の入力はEclipseの「ウインドウ]-[Manage Flex Licences」から行える。
2007年10月まではFlex2のライセンスが有効とのことなので、Flex2のライセンスを持っているk方は存分に試して欲しい。

ダウンロードしたら、実行ファイルを起動して、ちゃちゃっとインストール。
Flexのインストール先と、eclipseのインストール先ディレクトリを聞かれる。

■Flexプロジェクト作成

Eclipseを起動したら、プロジェクトの新規作成ウィザードで、
「Flex」-「Flex Project」を選択する。




















次にプロジェクト名を聞かれる。今回は以下のようにした。

プロジェクト名:FlexSample
Server Type:Other/none


次にSDKの選択。
SDKはプラグインインストール時にインストールされたものを使うので、
今回はdefaultを選択。

Use Default SDK

他は特に変更する部分はないので、道なりにウィザードを進めて完了。

■Flexサンプルアプリケーション
●画面のデザイン
プロジェクトの作成が完了すると、Flexパースペクティブへ画面遷移するかを聞かれるので、yes。
Flex開発画面はおおよそ以下のような感じ。














中央のmxmlファイルの編集ビューでは、sourceとdesignに切り替えられる。
画面はdesignモードにて、FlexSample.mxmlファイルに、
Label、InputText、Buttonを配置したところ。
各コントロールは左下のコンポーネントビューからドラッグ&ドロップで配置できる。

ここでは名前を入力して、挨拶を表示するサンプルを作る。
デザインモードでFlexSample.mxmlファイルにコントロールを配置するか、
ソース編集モードで、以下のコードを打ち込む。



<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Label x="10" y="10" text="名前" width="34" height="20"/>
<mx:TextInput x="40" y="8" id="nameText"/>
<mx:Button x="147" y="38" label="send" id="sendButton" />
<mx:Label x="10" y="68" id="helloLabel" width="212"/>
</mx:Application>




この状態で、Eclipseの実行ボタンを押すと、ブラウザが起動し、デザインした画面を見ることが出来る。
制御コードを何も書いていないので、画面に配置したボタンを押しても何も起こらない。

●アクションの実装

アクションを指定するには、ActionScriptを使ってイベントリスナを実装する必要がある。
FlexSample.mxmlのソース編集画面で、以下の赤字のコードを追加入力する。


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
private function sayHello():void {
helloLabel.text = "hello " + nameText.text + "!";
}
]]>
</mx:Script>
<mx:Label x="10" y="10" text="名前" width="34" height="20"/>
<mx:TextInput x="40" y="8" id="nameText"/>
<mx:Button x="147" y="38" label="send" id="sendButton" click="sayHello();"/>
<mx:Label x="10" y="68" id="helloLabel" width="212"/>
</mx:Application>





Scriptタグに囲まれた箇所でsayHello関数を定義している。
JavaScriptっぽいが、ActionScriptである。
sendボタンのclick定義でsayHello関数を呼び出すように変更している。

●いざ、実行
こんな感じ。








Flexの魅力をまったく感じないサンプルになってしまった。

参加ユーザー

今月の本

  • 臆病者のための株入門
  • TSPガイドブック:リーダー編
  • 夜明けの街で
  • 詳解Oracleアーキテクチャ
  • Ajax イン・アクション
  • 実践Ajax
  • すごい「実行力」
  • More Effective C++
  • 母子関係の理論
  • コンピュータアーキテクチャのエッセンス