2009年10月7日水曜日

Fedora9 FTPサーバの立ち上げ

手順:
・vsftpdがインストールされたかを確認
$ rpm -qa | grep vsftpd

インストールされなければ、yumコマンドでインストール

・インストールされたら、yum updateで更新(省略可)

・vsftpdの設定(/etc/vsftpd/vsftpd.conf
下記は、参照用の設定例:
anonymous_enable=YES←anonymous FTPを禁止

connect_from_port_20=YESをコメントオフする
※標準WindowsのFTPポートは、21であるから

ascii_upload_enable=YES 
←ASCIIモードでのアップロードを許可
ascii_download_enable=YES 
←ASCIIモードでのダウンロードを許可

chroot_list_enable=YES 
←ホームディレクトリより上層への移動を禁止
chroot_list_file=/etc/vsftpd.chroot_list 
←ホームディレクトリより上層への移動を禁止する
ユーザーを指定ファイル
上記設定をして、下記コマンドでユーザー「foo」を
ホームディレクトリより上層へ移動できないようにする
# echo foo >> /etc/vsftpd.chroot_list


xferlog_std_format=NO ←詳細なログを記録する
xferlog_file=/var/log/vsftpd.log 
←ログファイルの指定

use_localtime=YES ←ファイルのタイムスタンプ
をローカル時間にする

・vsftpdを起動
# service vsftpd start

Linux再起動時に、自動的にvsftpdを実行する
# chkconfig vsftpd on

※ディフォルトのFTPサーバディレクトリ:
var/ftp/pub

2009年7月1日水曜日

Fedora9 Firefox3.5のインストール


1.パッケージマネージャを利用せずに真ストール:
①Firefox3.5のLinuxバージョンをダウンロードする
②ユーザのホームディレクトリに解凍
>cd ~
>tar xzjf firefox-3.5.tar.bz2
③元のバージョンのfirefoxを開いている場合、閉じてください
④~/firefox/firefoxで実行

★該当方法は、元にパッケージマネージャでインストールしたバージョンと共存している。
また、システムが直接認識できないから、メニューから該当Firefoxを見えない。
該当ユーザのホームフォルダにアクセス権限を持っていないユーザが該当Firefox
の起動もできない。

2.上記Firefoxのショットカットの作成
①デスクトップに右クリックして、「ランチャの生成」をクリックする
②ランチャ作成のウィンドウで下記情報を入力する
 「種類」:アプリケーション
 「名前」:自分が好きな名前
 「コマンド」:「参照」ボタンでFirefoxスクリプトがあるパスを選ぶ
③「OK」をクリックすると、デスクトップにFireFox起動用のショットカットが作成された

Fedora9 rpmコマンド

よく使われる「rpm」のコマンドオプション:

// 新規インストール
rpm -i ファイル名

// アンインストール
rpm -e パッケージ名

// -v インストール時の情報表示、-h インストール際に '#' で表示
rpm -ivh ファイル名

// 依存問い合わせをしないでアンインストール:--nodeps 依存問い合わせをしない
rpm -ev --nodeps パッケージ名

強制インストール:--force 強制
rpm -i --force --nodeps ファイル名

// パッケージに含まれているファイルを表示
rpm -qa パッケージ名

Fedora9 yumコマンド

よく使われる「yum」のコマンドオプション:
// 指定したパッケージをインストール
yum install パッケージ名
// アップデート可能なパッケージをアップデート
yum update
// 指定したパッケージをアップデート
yum update パッケージ名
// 指定したパッケージを除いてアップデート
yum update --exclude=パッケージ名
// 指定したパッケージをアンインストール
yum remove パッケージ名
// アップデート可能なパッケージ一覧
yum check-update
// 利用可能なパッケージ一覧
yum list
// インストール済みのパッケージ一覧
yum list installed
// ダウンロードしたパッケージと古いヘッダを削除する。
yum clean all
// 指定したパッケージを再インストール
yum reinstall パッケージ名

Fedora9 パッケージのインストールコマンド

1.圧縮ファイルのパッケージのインストール:
①解凍
・*.tar.bz2ファイルの場合:
>tar xvjf *.tar.bz2
※「j」:bz2のフォーマットのファイルを指します。

・*.tar.gzファイルの場合:
>tar xvzf *.tar.gz
※「z」:gzのフォーマットのファイルを指します。

②解凍後のsrcフォルダに移動
>cd パッケージフォルダ名/src

③コンパイル
>make

④インストール
>make install

2.*.rpmファイルのインストール:
>rpm ivh *.rpm

★yumコマンドを使って、インストールやアップデートなどができる
3.ネットから直接ダウンロードし、インストールする
>yum instal -y パッケージ名

4.パッケージのアンインストール:
>yum remove パッケージ名

2009年6月24日水曜日

JavaのGCに関する説明(WAS6.1のIBM JVMを元に説明する):

JavaのGCに関する説明(WAS6.1のIBM JVMを元に説明する):
一、GCに対する理解:
1.GC発生頻度:ヒープサイズとアロケーション・レートに依存
2.GC時間の長さ:ヒープサイズとヒープ内のオブジェクト数に依存

二、GC方式に対する理解:
1.ヒープ領域確保の仕方
①Mark & Sweep GC
②Copying GC
2.GC実行時のGCスレッドとアプリケーションスレッド
①"Stop The Worlde"とはどういう意味?
そもそもGCは、オブジェクトのヒープ領域への割り当てが失敗した際 に、発生します。そして、GC処理が開始されると、GC処理を担当するスレッド 以外のスレッドは一時停止されます。それは、GC処理においてオブジェクトの 移動やリファレンスの走査などを行うため、アプリケーション処理がGCと並行 されることによるメモリ情報の整合性などの問題発生を防ぐためです。
GC処理開始から終了までの間、GC処理スレッド以外のスレッドが「一 時停止状態」になるため、一般に、これを“Stop The World”と呼んでいます。
②IBM JVMが提供する二種類のスレッド:
・Parallel Collector:
特徴:GC処理時間の短縮
Parallel Collectorとは、GC処理をマルチ・スレッドで実施するため、 GC処理時間の短縮が期待できます。CPU数の多い大規模システムで効果的であ るといえます。ただし、GC処理の間は、アプリケーション・スレッドは停止さ れます(“Stop The World”)。

・Concurrent Collector:
特徴:アプリケーション・スレッドの停止時間の短縮

3.分割ヒープ領域とフラットなヒープ領域
①フラットなヒープ領域:従来のモデル
②分割(Generational)ヒープ:
WAS6.1のIBM JVMから提供した短命オブジェクト向けのGCモデル

三、WAS6.1のAPサーバに対するJVM設定:
WAS管理コンソール→「サーバ」→「アプリケーションサーバ」に
対象APサーバの設定画面で右側のメニュー「Java及びプロセス管理」の
「プロセス定義」→「Java仮想マシン」画面を開く
この画面でJVMに対する設定を行う。
「汎用JVM引数」には、下記4種類のパラメータがある:

1.-Xgcpolicy:optthruput:
Throughputの最適化。
フラット・ヒープを採用。アプリケーションのスループット重視。
Parallel Collector(Stop The World)、Parallel Mark、Parallel Sweep

2.-Xgcpolicy:optavgpause:
Pause Timeの最適化。
アプリケーションのレスポンスを重視し、GCによる影響を抑える
フラット・ヒープを採用。Concurrent Collector(GCポーズタイムを最小化)、Concurrent Mark、Concurrent Sweep

3.-Xgcpolicy:gencon:
アプリケーションが生成するオブジェクトが短命である。
(Generational Concurrent)
分割ヒープを採用。Nursery AreaはParallel Collector(Stop The World)、
Copying GC。Tenured AreaはConcurrent Collector、Concurrent Mark、
Concurrent Sweep

4.-Xgcpolicy:subpool :
アプリケーションが多量のスレッドを使用し(大規模SMPマシン環境)、
多くのオブジェクトをアロケーション(Subpool)。
フラット・ヒープを採用。スループット重視。Parallel Collector
(Stop-the-world)、Parallel Mark、Parallel Sweep。大規模SMP環境用に
オブジェクト・アロケーション・アルゴリズムを最適化。AIX、Linux PPC、
zSeries、z/OS、i5/OSでのみサポート

EclipseでStruts1.3.10のWebアプリプロジェクトを作成手順

EclipseでStruts1.3.10のWebアプリプロジェクトを作成手順:
1.JDKをインストールして、JAVA_HOMEを環境変数に設定
2.Tomcatをインストールして、TOMCAT_HOMEを環境変数に設定
3.Eclipseを開いて、動的Webプロジェクトを新規作成
4.該当プロジェクトのビルド・パスにStrutsのjarファイルを追加
5.作成したプロジェクトのWarファイルを作成し、Tomcatのwebappsフォルダに配備
6.EclipseのTomcatを起動する
※もし下記ActionServletに関するエラーが出たら、
===============
- サーブレット action を利用不可能にマークします
- Error loading WebappClassLoader
===============
「ウィンドウ」→「Tomcat」→「拡張」にある「JavaプロジェクトをTomcatのクラスパスへ追加」
のプロジェクトリストを切り替えてしたら、エラーを解消できる
7.Struts1.3のJSPにあるtablibの宣言方法に注意が必要です
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
これは、以前のバージョンと違う

8.Struts1.3は、Struts1.2より、いくつかの変更があるから、注意してほしい
例:1.2のstruts.jarを1.3のいくつかstruts-**.jarに分割する
ActionErrorをActionMessageに変更

アプリケーションの停止とスレッドの停止

アプリケーションの停止とスレッドの停止:
環境:
WAS6.1+WindowsXP
仕様:
スレッドは、Servletアプリケーションで呼ばれている
要求:
Websphereの管理コンソールであるServletアプリケーションを停止する
かつ、該当Servletアプリケーションが呼び出しているスレッドも停止する
現状:
Websphereの管理コンソールで対象Servletアプリケーションを停止しても、
該当Servletアプリケーションに呼ばれているスレッドの停止ができない

解決方法:
対象スレッドのrun()メッソドにあるwhile(true)ループに対して、常にループ
できるではなく、条件をつけるようにする。

1.対象スレッドに、下記変数と対応メッソドを定義する
private volatile Thread blinker;
public void setThreadObject(Thread blinker){
this.blinker=blinker;
}

2.run()にあるwhile(true){}に対して、下記のように条件をつける
Thread current = Thread.currentThread();
while (this.blinker==current) {}

3.Servletのinit()に変数blinkerの初期値と終了値を設定
this.qrViewWatcher.setThreadObject(this.qrViewWatcher);

4.Servletのfinalize()に変数blinkerの終了値を設定
this.qrViewWatcher.setThreadObject(null);

上記設定によって、Servletアプリを停止すると、該当アプリオブジェクトが呼び出した
スレッド対象のrun()が機能しないようになる(while(){}を実行しない)。
また、Servletアプリを始動すると、新しいIDを持っているスレッドが動作する
(元のスレッドは、一定時間に経って、GCより回収されるかな?)
これで、Servletアプリの動作は、中にあるスレッドの動作と一致される。
※もちろん、TomcatのようにWebsphereAPサーバを停止すれば、スレッドも一緒に停止される

JavaでPL/SQLのパッケージに定義されているProcedureの呼び出す手順

JavaでPL/SQLのパッケージに定義されているProcedureの呼び出す手順:
1.該当Procedureを呼び出すSQL文の用意:
例:
String sql = "{ call PKG_TMP_RESULT.CREATE_TMP_RESULT(?,?) }";
説明:
①PKG_TMP_RESULT:PL/SQLのパッケージ名
②CREATE_TMP_RESULT:一時テーブルを作成するProcedure名
③"?":入力/出力パラメータ

2.DBに接続Connection対象の用意:
org.apache.commons.dbcp.DelegatingConnectionを使って、
Connectionオブジェクトを取得することをお勧め
※必要に応じて、特定なデータベース用のConnectionに転換する
例:
Connection tmpCon = ((DelegatingConnection)con).getInnermostDelegate();
oCon = (OracleConnection)tmpCon;

3.ストアドプロシージャを呼び出すためのCallableStatementオブジェクトを生成
※prepareCall(String sql)メソッドを使う
※必要に応じて、特定なDB用CallableStatementに変更
例:
CallableStatement stmt = oCon.prepareCall(sql);
OracleCallableStatement ostmt = (OracleCallableStatement)stmt;
※注意:
prepareStatement(String sql)は、パラメータ付きSQL文をデータベースに
送るためのPreparedStatementオブジェクトを作成します。

4.入力パラメータの設定:
CLOB clob = CLOB.createTemporary(oCon,true,oracle.sql.CLOB.DURATION_SESSION);
clob.setString(1, para1);
ostmt.setCLOB(1, clob);
説明:
①CLOB.createTemporary(java.sql.Connection conn,boolean cache,int duration)
該当メソッドは、一時のCLOBを作成
パラメータの意味:
cache - Specifies if LOB should be read into buffer cache or not.
duration - The duration of the temporary LOB.
The following are valid values: DURATION_SESSION, DURATION_CALL.
②clob.setString(long pos,String str)
指定するCLOBへ対象文字列をposの位置に書き込む
③ostmt.setCLOB(long pos,Clob clob)
oracle.sql.CLOBに指定位置でパラメータを含んでいるclob値を設定する

5.Procedureの実行結果を返す用出力パラメータの声明:
ostmt.registerOutParameter(2, Types.INTEGER);
※声明できるタイプ:
CHAR、VARCHAR、LONG、RAW、LONG RAW

6.ストアド・プロシージャの実行
ostmt.execute();

7.返すパラメータの取得:
ostmt.getXXX(long pos);
posは、パラメータのindex;
例:
int exec_stat = ostmt.getInt(2);

※補足:
Procedureの呼び出す側で指定したパラメータのindexは、
Procedureの定義側のindexと一致しないといけない

WASの「セキュリティ」設定でWebshpere起動ができない問題

WASの管理コンソール画面で「セキュリティ」に関する設定を行って、
ローカルのDEBUG環境でWASが起動できなくないことがある
その時、フォルダ「C:\Program Files\IBM\SDP70\runtimes\base_v61\
profiles\AppSrv00\config\cells\mmh-sv99Node01Cell」
にある「security.xml」を編集して、中にあるタグ「security」の「enable」
をfalseに変更すると、WASが起動できるとなる

JWS(Java Web Start)の概要

JWS(Java Web Start)の概要:
1.JWSの応用構成:
①ロジック、リソースなどを含んでいるjarファイル
②クライントから該当アプリをdownload、launch用のjnlpファイル
③Web Appから該当JWSを呼び出す用のjnlpファイルへのリンク

2.JWSの配布:
①アプリのjarファイルは、Webサーバが見えるところに配布
②クライント用のjnlpファイルを作成
③jnlpファイルへアクセス用リンクを作成
※同じアプリのjarに対して、クライント側が違っても、違うjnlpファイル
だけを作成すればOKです。これでアプリが多数のWebユーザに配布できる

3.JWSの特徴:
①従来のWebアプリと違って、JWSの場合、JNLPファイルによって、ソースコードベース
のアプリを呼び出すことができる。
つまり、JNLPによって、アプリソースをリモートのWebサーバホストからローカルにdownloadし、
実行させることができる
②アプリのjarを実行用のJREバージョンを判断し、必要なら自動downlaodできる
③System.loadLibaryメソッドでnative libariesの実行をサポートできる
※native libaryとは、the libary is contained in jar file.
④JNLPによって、3種類のリソースがdownloadできる。jarファイル、imageファイル、jnlpファイル
⑤JNLPファイルによって、該当リソースに対する参照は、全てhrefより義されるURLを通じて実施

4.JNLPの実行ステップ:
①Retrieve jnlp file
②Parse the jnlp file
③Determine the right JRE to use
[④download extension jnlp file in the jnlp file]
[⑤run the installer/uninstaller defined by extension jnlp file]
⑥download the jar files
⑦Verify the signing and security
⑧Setup the jnlp services
⑨Launch the application/applet/installer/uninstaller

※補足
Java開発用の各種フレームワーク:
プッシュ型:
1.Struts
2.Django
3.Ruby on Rails
4.Spring MVC

プル型:
1.Tapestry
2.JBoss Seam
3.Velocity

NetBeansは?
Wicket

HTTPメッセージのヘッダ部の監視

HTTPメッセージのヘッダ部の監視:
Axisのツールtcpmonを使って、Webブラウザでページをアクセスする時、
通信のHTTPヘッダ部の情報を監視できる
実行手順:
1.AxisをApacheのサイトからダウンロードする
2.解凍したAxisフォルダにあるlibサブフォルダに、
axis.jarがあることを確認する
3.コマンドラインで上記パスにアクセスし、下記コマンドを実行
>java -cp axis.jar org.apache.axis.utils.tcpmon

4.結果として、ポップアップウェインドが表示される
5.該当管理画面で監視用のポート、ホストIPとHTTP通信ポートなど
を入力し、追加する
6.成功したら、新しいタグ画面がでてきた
7.例として、監視ポート番号:1234;
ホストIP:127.0.0.1、HTTP通信ポート:8080
下記URLでWebブラウザをアクセスする
http://127.0.0.1:1234/
8.タグ画面で上記通信のHTTPヘッダ情報を確認できる
※監視ポートを設定すると、各ページへのアクセスは、まず、該当ポートを通じて、
次に通常のHTTPポートで通信を行う

Applet画面の見た目にかかわっている「LookAndFeel」

Applet画面の見た目にかかわっている「LookAndFeel」の説明:
一、LookAndFeelの種類:
1.CrossPlatformLookAndFeel(OSに関係なし):
これは、Java自分のデフォルトL&F:MetalLookAndFeel
(javax.swing.plaf.metal)

2.SystemLookAndFeel(OSに関係ある):
・Windows系:WindowsLookAndFeel
    (com.sun.java.swing.plaf.windows.WindowsLookAndFeel)
同じL&Fの名前があっても、実際Classic Windows、
Windows XP、Windows Vistaという実装があるから、見た目が
多少違う

・Solaris, Linux with GTK+ 2.2 or later:GTK
(com.sun.java.swing.plaf.gtk.GTKLookAndFeel)

・Other Solaris, Linux:Motif
(com.sun.java.swing.plaf.motif.MotifLookAndFeel)

・IBM UNIX:IBM
・HP UX:HP
・Macintosh:Macintosh

二、Appletの場合、LookAndFeelのロード優先順位:
1.ソースの中に直接LookAndFeelの定義がある場合、これは、Appletの
LookAndFeelとして使われる

2.ソースの中に定義されていない場合、自分が作った「swing.properties」
に定義されたLookAndFeelが使われる
例:
# Swing properties
swing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel

3.上記とも見つからない場合、Java自分のLookAndFellがデフォルトで使われる

三、自分なりの見た目を定義したい
LookAndFeelによって、定義されている見た目は、デフォルトのものですが、
自分がほしい色などがあったら、paintComponentメッソドをオーバーライドし、
親の該当メッソドを実行した後、自分のフォーマットを定義すればOK
例:
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("This is my custom Panel!",10,20);
g.setColor(Color.RED);
g.fillRect(squareX,squareY,squareW,squareH);
g.setColor(Color.BLACK);
g.drawRect(squareX,squareY,squareW,squareH);
}

注:自分のフォーマットを定義する場合、このメッソドしかできない
また、裏側親クラスのpaint()を実行しないといけないから、ここにある
「super.paintComponent(g);」が不可欠

※SwingのGUIを作成することやSwing Componentとinteractionすることなど
の場合、処理スレッドは、event dispatching threadとして実行されることが
必要となる。
event dispatching threadとしての処理方法:
①Runnableの実装クラスを作成
②SwingUtilities.invokeLater(Runnable runObject)で上記クラスを実行

※要注意A:
Time-consuming tasks should not be run on the Event Dispatch Thread.
Otherwise the application becomes unresponsive.
Time-consuming tasks should be dealed with in worker thread.(SwingWorker)
※要注意B:
javax.swing.SwingWorkerは、JDK6から提供されるから、これまですでに存在している
SwingWorkerクラスとは、別物です。

Ant用build.xmlの作成及び実行

Ant用build.xmlの作成及び実行:
※参照サイト:http://www.alles.or.jp/~torutk/oojava/maneuver/2001/ant/ant.html

1.サンプルプロジェクトの構成:
・Amazon SimpleDBのアンプルプロジェクト
※参照サイト:http://docs.amazonwebservices.com/AmazonSimpleDB/latest/GettingStartedGuide/
・ディレクトリ構成:
AntProject
  ¦-build.xml
  ¦-lib
¦-src
¦-com
  ¦-amazonaws
¦-sdb
  ¦-samples
¦-CreateDomainSample.java

2.build.xmlの構成要求:
・「.classファイル」のフォルダが自動に作成される
・「.jarファイル」のフォルダが自動に作成される
・コンパイルタスクができる
・実行タスクがる
・クリンタスクがある
※build.xmlを実行用のapache-antパッケージの用意が必要

3.build.xmlファイルの作成
※詳しくは、build.xmlのサンプルを参照

4.build.xmlによって、Antのコマンドを実行
①コマンドラインから、AntProjectフォルダへ移動
>cd /AntProject
②コンパイルの実行
>C:\apache-ant-1.6.3\bin\ant.bat
または
>C:\apache-ant-1.6.3\bin\ant.bat dist
③jarファイルの実行
>C:\apache-ant-1.6.3\bin\ant.bat executeJar
④コンパイルより作成されたフォルダ及びファイルを削除
>C:\apache-ant-1.6.3\bin\ant.bat clean

2009年6月19日金曜日

Java Plug-inのOut Of Memory Error問題の対策

1.十分の物理メモリを確保した上で、
JVMのパラメータ「-Xmx」をできるだけ、大きく設定
してください。

2.GCが効率よくさせるために、JVMの関連パラメータを
適当な値を設定してください。
例:
-XX:NewRatio
該当変数がヒープサイズにNew Generation領域とOld Generation領域
の割合比率を示すパラメータです。
Old Generationの量が少なくても、New Generationの量と2つの
Survivor spaceの量の全体と同じですが、実際の運用は、これ以上
にしてください。
Old Generationの量が少なくなると、GCが正常に完了できない恐れがある。
-XX:NewRatio=3にしたら、NewとOldの比率が1:3と言う意味です。
つまり、New Generationがヒープサイズの1/4を占めるということ。

3.メモリリーク(漏れ)のチェック
通常、JVMのGCが自動に廃棄されたオブジェクトなどを回収しますが、
いったんオブジェクトが参照されていたら、この参照自体が削除された限り、
GCが該当オブジェクトを回収しないまま。これは、Javaのメモリリークです。
メモリリークがアプリの中に存在しているかを確認するため、いくつかの
手段があります。
・GCログの解析
Java Plug-inのJVMパラメータに「-Xloggc:java-plugin-log.gc」のように
設定すれば、アプリが実行されるたびに、GCファイル「java-plugin-log.gc」が
生成される。
生成したGCログに関しては、直接解析するか、ツール(GCViewer、JTuneなど)
により解析するか、自分の運用に従って、実施してください。

・JVMPI(JVM Profiler Interface)よりの統計、解析
この方法がいまだJavaの正式なリリースものではないですが、いつか正式の
リリースになるでしょう。
ほかの手段より、もっと詳しく、幅広いJVM関連情報が取れる。
一方、自分が実装しないといけないらしい。ちょっと複雑かなと思います。

・アプリ自体の解析
アプリの処理ロジックを分析し、参照が存在しているところ(HashMapなど)
に対して、必要な参照が参照先のオブジェクトの廃棄に伴い、削除されているか
を確認してください。
特に、グローバルの参照、クラスラベルの参照など。

2009年6月17日水曜日

Java Plug-inのヒープメモリーサイズ設定

Java Plug-inのヒープメモリーサイズ設定
――――JRE6とJRE1.4、JRE5の違い

アプレットをブラウザに実行する時、
"Out Of Memory Error"のエラーが発生したことが
よくある。
原因は、Java Plug-in用のヒープメモリーが不足です。
では、Java Plug-in用のヒープメモリーサイズが大きく変更できないのか?

具体的いえば:
M1:ブラウザ本体のプログラム、スタック、ヒープなどが使う
 (予約)メモリサイズ(アドインを含む)
M2:JavaVM本体のプログラム、スタック、ヒープなどが使う
 (予約)メモリサイズ
M3:Java Plug-in確保できるメモリーサイズ(-Xmxで指定可能なサイズ)
  =2GB-M1-M2(実は、他の要素もある)
通常の場合、M1=約512MB、M2=約512M;M3最大で1GB割り当て可能
つもり、Win2000、WinXPであれば、Java Plug-in用のヒープメモリーサイズが
1GBより小さい

JRE5、JRE1.4の場合:
①Java Plug-inがブラウザのプロセスに実行されている
②Java Plug-in用のメモリーサイズがブラウザの関連Componentがあるため、
さらに限られている(最大512Mぐらいまでできる?)
③いったん-Xmxに設定されていたヒープメモリーサイズが確保できなければ、
ブラウザが落ちます。

JRE6の場合:
①Java Plug-inが独自のプロセスに実行されている
②Java Plug-inが利用できるヒープメモリーサイズがJRE5とJRE1.4よりもっと
大きく設定できる(1GBぐらい?)
③いったん-Xmxに設定されていたヒープメモリーサイズが確保できなければ、
JRE6のデフォルトサイズ(最大65Mぐらい)でJava Plug-inが実行される。
かた、ブラウザが別のプロセスで実行されるから、落ちることもなくなる。
④JNLPの定義によって、アプレットごとに違うバージョンのJVMが設定できる
(Java Web Startの考えでしょう)

Java Plug-inのヒープメモリーサイズ設定 ――――JRE6とJRE1.4、JRE5の違い

Java Plug-inのヒープメモリーサイズ設定
――――JRE6とJRE1.4、JRE5の違い

アプレットをブラウザに実行する時、
"Out Of Memory Error"のエラーが発生したことが
よくある。
原因は、Java Plug-in用のヒープメモリーが不足です。
では、Java Plug-in用のヒープメモリーサイズが大きく変更できないのか?

具体的いえば:
M1:ブラウザ本体のプログラム、スタック、ヒープなどが使う
 (予約)メモリサイズ(アドインを含む)
M2:JavaVM本体のプログラム、スタック、ヒープなどが使う
 (予約)メモリサイズ
M3:Java Plug-in確保できるメモリーサイズ(-Xmxで指定可能なサイズ)
  =2GB-M1-M2(実は、他の要素もある)
通常の場合、M1=約512MB、M2=約512M;M3最大で1GB割り当て可能
つもり、Win2000、WinXPであれば、Java Plug-in用のヒープメモリーサイズが
1GBより小さい

JRE5、JRE1.4の場合:
①Java Plug-inがブラウザのプロセスに実行されている
②Java Plug-in用のメモリーサイズがブラウザの関連Componentがあるため、
さらに限られている(最大512Mぐらいまでできる?)
③いったん-Xmxに設定されていたヒープメモリーサイズが確保できなければ、
ブラウザが落ちます。

JRE6の場合:
①Java Plug-inが独自のプロセスに実行されている
②Java Plug-inが利用できるヒープメモリーサイズがJRE5とJRE1.4よりもっと
大きく設定できる(1GBぐらい?)
③いったん-Xmxに設定されていたヒープメモリーサイズが確保できなければ、
JRE6のデフォルトサイズ(最大65Mぐらい)でJava Plug-inが実行される。
かた、ブラウザが別のプロセスで実行されるから、落ちることもなくなる。
④JNLPの定義によって、アプレットごとに違うバージョンのJVMが設定できる
(Java Web Startの考えでしょう)

JVMのGCに関する各パラメータの設定

※詳しくは、http://www.tagtraum.com/gcviewer-vmflags.htmlを参照してください

1.-Xms、-Xmx
JVMのTotal Heap Size範囲を決めるパラメータ。
例:
-Xms256m -Xmx256m
※メモリーの確保ができれば、両パラメータに同じな値を設定してください。
(FULL GCの回数を減らせて、性能向上できるから)

2.-verbose:gc/-Xloggc:output-to-file-path
JVMのGCログを出力できるようにする設定
output-to-file-path:gcログ出力先のファイルパス
(例:-Xloggc:jvm1-4-2.gc)

3.-XX:NewRatio
New世帯領域(Young Generation)とOld世帯領域(Old Generation)の割り率
例:
-XX:NewRatio=3
意味:New世帯領域が全体ヒープサイズの四分の一を占める
Old世帯領域が四分の三を占める

※注:
①New世帯領域の方が小さくなると、Minor GCの発生頻度が高くなる
逆にOld世帯領域の方が小さくなると、Major GC(FULL GC)の発生頻度が高くなる
②MinorGCより、New世帯領域のObjectをOld世帯領域にコピーすることを行うから、
MajorGCには、十分なFREE領域を確保できなければ、MinorGCの操作が成功に完了できない
ですから、できれば、MajorGCのFree領域の量は、New世帯領域+2つのSurvivor Spaceの領域
より大きく設定する

4.-XX:NewSize、-XX:MaxNewSize
この2つのパラメータの設定により、New世帯領域のサイズ範囲を確定する
例:
-XX:MaxNewSize=1024m
※NewRationより、もっと精確にNew世帯領域の容量を確保できる

5.-XX:PermSize、-XX:MaxPermSize
Permanent Generation領域の容量を定義する(通常、Permanent Generationは、GCの動作と関係ない)
※System.gc()より、強制にMajorGCを呼び出し

6.-XX:MinHeapFreeRatio、-XX:MaxHeapFreeRatio
強制にGC後のFree Spaceを定義する

2009年6月12日金曜日

Apache+Tomcat+Eclipse+AxisでWebサービスの構築手順(2)

二、デプロイのWebサービスの利用:
1.WDSLからjavaプロキシコードを生成(org.apache.axis.wsdl.WSDL2Java)
>java org.apache.axis.wsdl.WSDL2Java http://localhost:8081/axis/services/Test001?wsdl
※これでEclipseの該当プロジェクトがあるworkspaceにlocalhostパッケージフォルダが作成された
このフォルダには、該当Webサービスのコードを生成する

2.Webサービスの参照
上記localhostパッケージフォルダからWSTest001.jarに作成し、クライント側のプロジェクトに
普通のjarファイルとして、ビルド・パスに追加して、ソースに参照できる
※\axis-1_4\libにある全てのjarファイルを該当プロジェクトのビルド・パスに追加することが必要
※jarファイルの作成には、2つの方法がある。一つは、Antで作る(build.xmlが必要);
もう一つは、localhostパッケージフォルダを単純なJavaプロジェクトとして、Eclpseに追加し、
jarファイルを作る

例:
import localhost.axis.services.Test001.TestWS_001;
import localhost.axis.services.Test001.TestWS_001Service;
import localhost.axis.services.Test001.TestWS_001ServiceLocator;

public class ApplyWSClient{
public void printMessage(){
TestWS_001Service locator = new TestWS_001ServiceLocator();
TestWS_001 wsTest;
try {
wsTest = locator.getTest001();
wsTest.printHelloMessage();
} catch (ServiceException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}catch (RemoteException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}

3.上記プロジェクトをコンパイルし、実行してみよう
※Webサービスプロジェクト側で処理内容が変わっても、クライント側が呼び出している
インタフェースが変わらない限り、クライント側の修正がなくてもいいという確認も
できる

Apache+Tomcat+Eclipse+AxisでWebサービスの構築手順(1)

※下記axisの説明は、axis-bin-1_4を使う前提で行う
※注意:
デプロイする時、Webサービス側のAPサーバを立ち上げる必要がある
今回の場合、Tomcatが起動されている状態でデプロイを実行、
そうしないとConnectionエラーが発生
==========================================

一、Webサービスの作成とデプロイ:
1.下記サイトから、axis-bin-1_4.zipをダウンロード
http://xml.apache.org/axis/
2.axis-bin-1_4.zipを解凍し、\axis-1_4\webappsフォルダ
にあるaxisフォルダをそのまま、Tocmatのwebappsにコピー
3.\axis-1_4\libにある全てのjarファイルを環境変数のclasspathに設定
4.Eclipseを使って、Webサービスとして使われる予定のJavaプロジェクト
を新規作成する
5.自分のニーズに応じて、クラス、メソッドを作成し、コンパイルする
6.コンパイルした対象クラスファイルを%CATALINA_HOME%\webapps\axis\
WEB-INF\classesにコピーする
7.作成したプロジェクトのjarファイルを%CATALINA_HOME%\webapps\axis\
WEB-INF\libにコピーする
8.デプロイ用のdeploy.wsddファイルを作成
※deploy.wsddファイルに関しいて、次の説明を参照してください
9.デプロイ
コマンドラインから、下記コマンドを実行
>java org.apache.axis.client.AdminClient -lhttp://localhost:8081/axis/services/
AdminService deploy.wsdd
※ポート8081を自分のポートに変更してください

下記の内容が出たら、デプロイが成功:
===================================================================
ファイルdeploy.wsddの処理中 / [en]-(Processing file deploy.wsdd)
処理を実行しました / [en]-(Done processing)
===================================================================

10.デプロイ結果の確認
http://localhost:8081/axis/services/Test001より、デプロイが成功か
どうか確認できる
※http://localhost:8081/axis/より、デプロイ成功の確認もできる

11.wsdlファイルの生成
http://localhost:8081/axis/services/Test001?wsdlにより、該当サービスのwsdlファイル
が表示される

2009年6月10日水曜日

WSDL と UDDI(Microsoftから)

UDDI を使用する Web サービスの記述と発見 (第 1 部)

Karsten Januszewski
Microsoft Corporation

October 3, 2001
日本語版最終更新日 2001 年 11 月 26 日

この記事のソース コードの表示とダウンロード

※この記事のリンク先:http://msdn.microsoft.com/ja-jp/library/aa480517.aspx

はじめに

これまでの At Your Service コラムでは、ビジネスに影響する初期設計ドキュメントから最終的な配置に至るまで、Web サービスを構築する方法に関する現実的な事例を説明してきました。次の論理的な検討段階は、Web サービスに関心を示すクライアントが Web サービスを容易に発見でき、クライアントのアプリケーションで利用できるように、この Web サービスを公開する方法です。 現在、 この要求を実現する発見のメカニズムが UDDI (Universal Description Discovery and Integration) です。 UDDI は、テクノロジやプラットフォームにまたがって Web サービスの発見をサポートする業界全体のイニシアティブです。

At Your Service コラムの著者は、 私にゲスト コラムニストとして、UDDIの紹介と登録プロセスに関する記事を書くことを熱心に勧めてくれたので、 私は喜んでこの依頼を引き受けることにしました。 まず、技術的な観点とビジネスの観点の両方から UDDI の影響を見ていきます。 次に、UDDI と Web サービス記述言語 (WSDL) との関係を見ていきます。 最後に、UDDI の登録手順と UDDI の潜在能力を最大限に引き出すための必要なことを検討します。 次回のコラムでは、この記事の第 2 部として、 UDDI を十分に活用するために At Your Service チームが実行した手順を検証する予定です。

UDDI?Web サービスのグローバル レジストリ

UDDI は、ビジネスやサービスに関する情報を、 構造化して保管するように設計されたパブリック レジストリです。 UDDI を使用して、 ビジネスや Web サービスに関する情報を公開および発見できます。 このデータは、標準的な分類法を使用して分類されているので、 分類を基準に情報を検索できます。 最も重要なことは、 UDDI がビジネスのサービスの技術的なインターフェイスに関する情報を保持することです。 SOAP ベースの XML API 呼び出しのセットを使って、 デザイン時と実行時の両方で UDDI と対話して、 サービスを起動および使用できるような技術的なデータを発見できます。 この方法では、 UDDI は Web サービスに基づくソフトウェアの全体像のインフラストラクチャとして動作します。

なぜ UDDI なのでしょうか。 このようなレジストリの必要性とは何でしょうか。 数千、あるいはおそらく数百万の Web サービスのソフトウェアの全体像に目を向けると、 以下のような困難な問題が浮かび上がってきます。

  • どのような方法で Web サービスを発見するのでしょうか。
  • どのように、この情報を意味のある方法で分類するのでしょうか。
  • ローカリゼーションにはどんな影響があるのでしょうか。
  • 独自の周辺テクノロジにはどんな影響があるでしょうか。 どうしたら、発見メカニズムに相互運用性を保証できるのでしょうか。
  • アプリケーションを Web サービスに依存するようにした場合、 どうしたら実行時にこのような発見メカニズムと対話できるのでしょうか。

このような問題に応えるために、UDDI イニシアティブが誕生しました。 Microsoft、IBM、Sun、Oracle、Compaq、Hewlett Packard、Intel、SAP などの多くの企業を始めとして、 300 を超えるその他の企業 (完全なリストについては UDDI: CommunityNon-MS link をご覧ください) が、 これらの諸問題を解決するためのオープン標準に基づき、 専用のテクノロジを使用しない仕様の開発に共同で取り組んできました。 その結果が、 ユーザーが自由に検索と公開ができる、複数のオペレータ ノードでホストされたグローバル ビジネス レジストリでした。 これは、2000 年 12 月にベータとして運用が開始され、 2001 年 5 月に実稼働環境に移行されました。

このように Web サービスのインフラストラクチャが決まった場所に存在することによって、 Web サービスに関するデータは、 一般的で、完全にベンダ中立の立場の一貫性のある、信頼できる方法で検索できるようになります。 分類による正確な検索を、 拡張可能な分類システムと識別を使用して実行できます。 実行時 UDDI 統合をアプリケーションに組み込むことができます。 その結果、Web サービス環境がさらに充実します。

どのように機能するか

UDDI データはオペレータ ノードによってホストされます。 オペレータ ノードとは、 UDDI.org コンソーシアムが管理する仕様に準拠するパブリック ノードを運用していることを表明している企業のことです。 現在は、バージョン 1 UDDI 仕様に準拠する 2 つのパブリック ノードが存在します。 1 つは Microsoft がホストするノードで、もう 1 つは IBM がホストするノードです。 また、Hewlett Packard もバージョン 2 仕様でノードをホストすることを表明しています。 全体的な UDDI 集団に冗長性を持たせるために、 ホスト オペレータはセキュリティで保護されたチャネルを経由して、 別の ホスト オペレータとの間でデータを複製する必要があります。 あるノードに公開されたデータは、複製が行われた後に別の ノードで発見できます。 現時点では、24 時間間隔で複製が行われていますが、 今後は、多くのアプリケーションが UDDI データに依存するようになるので、 複製と次の複製の間隔は短くなっていくでしょう。

ホスト オペレータがノードを実装する方法に関する限り、 専用の必要条件が存在しないことは注目に値します。 ノードは単に UDDI 仕様に準拠する必要があるだけです。 たとえば、Microsoft のノード (http://uddi.microsoft.com/default.aspx) は、 全体が C# で記述され、.NET Beta 2 共通言語ランタイムの稼働環境で実行されます。 コード ベースの多くの部分で、.NET システム クラスが提供するネイティブな SOAP サポートや、 シリアル化を利用しています。 Microsoft オペレータ ノードは、 バックエンドで Microsoft® SQL Server 2000 をデータ ストアとして利用しています。 IBM ノードについては、ノードを運用するのに別のテクノロジを使用している言うにとどめておきましょう。 しかし、これら 2 つのノードは同じ SOAP ベースの XML API 呼び出しに準拠しているので、 同じように動作します。 クライアント ツールはどちらのノードともシームレスに相互運用できます。 このように、 UDDI のパブリック集団は、 XML Web サービス モデルが異なる環境にまたがって、いかに機能するかを示す主要な例になります。

UDDI イニシアティブを理解する次の段階として、 どのようなデータが UDDI に格納され、どのような方法で構造化されるかを見ていきましょう。 UDDI は比較的簡易な形式で、"リポジトリ" ではなく、"レジストリ" としてデザインされています。 その違いは微妙ですが、 きわめて重要です。 リポジトリが実際の情報ストアであるのに対して、 レジストリはユーザーをリソースにリダイレクトします。 一例として Microsoft® Windows® レジストリを考えてみましょう。 このレジストリは基本的な設定やパラメータを含みますが、 最終的にはアプリケーションをリソースまたはバイナリに導きます。 プログラム ID に基づいて COM コンポーネントを検索すると、 まずクラス ID に導かれ、 このクラス ID がバイナリ自体の場所に導きます。

UDDI の動作もこれに似ています。 Windows レジストリと同様に、 GUID (グローバル一意識別子) に依存して、 リソースの場所の検索と決定を実行することを保証します。 UDDI クエリは最終的にインターフェイス (WSDL ファイル、XSD ファイル、DTD ファイルなど)、 または別のサーバーに存在する実装 (ASMX ファイルまたは ASP ファイルなど) に導きます。 このように、UDDI は以下のような疑問点に答えます。

  • 「指定した業界向けに、WSDL に基づく Web サービス インターフェイスはどのようなものが公開され、実現されているでしょうか」
  • 「どのような企業が、これらのインターフェイスの 1 つに関連する実装を作成しているでしょうか」
  • 「一定の方法で分類されている Web サービスは、 どのようなものが現在提供されているでしょうか」
  • 「指定した企業はどんな Web サービスを提供しているでしょうか」
  • 「企業の Web サービスの使用に関して誰に連絡すればよいでしょうか」
  • 「特定の Web サービスの実装の詳細はどのようになっているでしょうか」

WSDL と UDDI

WSDL は、Web サービス プロトコル スタックの重要な一部として出現しました。 したがって、 UDDI と WSDL が互いにどのように機能するか、 インターフェイスと実装の概念が各プロトコルにどのように組み込まれているかを把握しておくことは重要です。 WSDL と UDDI は共に抽象的なメタデータと具体的な実装の区別を明確にするようにデザインされました。 そのため、この区別の意味を理解することが、 WSDL と UDDI を理解する上できわめて重要になります。

たとえば、WSDL はメッセージとポートを明確に区別しています。 メッセージは、Web サービスで必要な構文と意味を示し、常に抽象的です。 それに対して、 ポートは Web サービスを起動できるネットワーク アドレスで、常に具体的なものです。 WSDL ファイルにポート情報を提供する必要はありません。 WSDL には抽象的なインターフェイス情報だけを含めることができ、 具体的な実装データはまったく提供しません。 このような WSDL ファイルが有効だと考えられます。 この手法により、WSDL ファイルが実装から切り離されます。

このことが意味する最も重要なことの 1 つは、 1 つの WSDL インターフェイスに対して複数の実装があり得るということです。 このデザインにより、 異種のシステムが同じインターフェイスの実装を記述でき、 その結果そのシステムが別のシステムと対話できることを保証します。 異なる 3 社が同じ WSDL ファイルを実装していて、 クライアント ソフトウェアの一部に WSDL インターフェイスからのプロキシ/スタブ コードを作成すると、 そのクライアント ソフトウェアは単純にアクセス ポイントを変更するだけで、 同じコード ベースでこれら 3 つの実装すべてと通信できます。

UDDI では、抽象と実装の同様の違いを tModels の概念を使って説明しています。 tModel は "Technology Model" の省略形です。 tModel 構造は、技術的な特徴、インターフェイス、およびメタデータの抽象型を表します。 tModel は、必然的に 1 つ以上の tModel の具体的な実装であるバインディング テンプレートになります。 バインディング テンプレートの内部では、 tModel の特定の実装のアクセス ポイントを登録します。 WSDL のスキーマがインターフェイスと実装の切り離しを可能にしたのと同様に、 tModel と tModel を参照するバインディング テンプレートとを別に公開できるので、 UDDI も同じようなメカニズムを提供します。 たとえば、標準そのもの、または業界グループが特定の業界向けに基準となるインターフェイスを公開すると、 このインターフェイスの実装を複数の企業が作成できます。 したがって、これらのビジネスの実装はそれぞれ同じ tModel を参照することになるでしょう。 WSDL ファイルは、UDDI tModel の完全な例です。

UDDI での登録

UDDI に公開することは、比較的簡単なプロセスです。 最初の手順は、 企業とそのサービスを UDDI にモデル化する方法に関する基本的な情報を決定することです。 これを決定した後の次の手順は、 登録を実際に実行することです。 登録は、Web ベースのユーザー インターフェイスからでも、 プログラムからでも実行できます。 最後の手順は、 エントリが正しく登録されているか、 および異なる種類の検索やツールを使って期待通りに表示されるかを確認するために、 エントリをテストします。

手順 1: UDDI エントリのモデル化

上記で概説したデータ モデルを考えると、 UDDI エントリを確立する前に、収集しておく必要のある重要なデータがいくつかあります。

  1. Web サービスの実装に使用する tModel (WSDL ファイル) を決定します。

    COM コンポーネントの開発と同様に、 Web サービスは既存のインターフェイスに基づいて、 または独自にデザインしたインターフェイスを使用して開発されます。 Web サービスが既存の WSDL に基づいている場合は、 UDDI にその WSDL ファイルが登録されているかどうかを調べる必要があるでしょう。 登録されている場合は、その名前と tModelKey を記録しておく必要があります。 tModelKey は、その WSDL ファイルが登録されたときに UDDI が生成した GUID です。

    一方、Web サービスが WSDL ファイルに基づいていて、 その WSDL ファイルが UDDI に登録されていない場合は、 このインターフェイスを表す新しい tModel を作成する準備が必要になります。 この tModel は URI (Uniform Resource Identifiers) 形式の名前 (たとえば MyCompany-com:SampleWebService-interface:v1) を持ち、 WSDL ファイルの場所を指している必要があります。

    Web サービスが Microsoft® Visual Studio® .NET サービスの場合は、 ASMX ファイルからのクエリ文字列 (たとえば ) を使用して、 WSDL 記述を生成できます。 ただし、Visual Studio .NET が生成する WSDL ファイルは、 その Web サービスを呼び出すためのアクセス ポイントと密接に結び付けられており、 これは Web サービスが複数の実装を持つ場合は適切ではない場合があります。 WSDL ファイルに複数の実装を持たせるつもりがなければ、 このことは問題になりません。

  2. 企業名および企業の簡単な説明を、必要に応じて複数の言語で提供し、 企業内の Web サービスの主な連絡先を決定します。

    UDDI は xml:lang 名前空間をサポートします。 この名前空間を使って、ビジネスが複数の言語で企業の説明を提供できるようにします。 また、UDDI は電子メール、電話番号、住所情報などの連絡先を一覧することを可能にします。 この連絡先リストは、 その企業の Web サービスに関して問い合わせを行う場合の企業内のリソースの一覧に使用します。 たとえば、誰かがその企業の Web サービスを使い始めたいと考えたときに、 適切な取引関係の責任者に接触する必要がある場合は、 それが誰であるかを記載します。 その Web サービスの使用に関して技術的な連絡先がある場合は、 その担当者も同様に一覧します。

  3. 企業にとって適切な分類と ID を決定します。

    UDDI で現在サポートされている分類については、 Microsoft UDDI ノード (http://uddi.microsoft.com/default.aspx) をご覧ください。 現在サポートされている分類は、 North American Industry Classification System (NAICS)、 Universal Standard Products and Services Codes (UNSPSC)、 ISO 3166、 Standard Industry Classification (SIC)、および GeoWeb Geographic Classification です。 企業を表す最適なカテゴリを選択します。

  4. 企業が UDDI を使って提供する Web サービスを決定します。

    次に、企業がパブリック UDDI ノードに登録する Web サービスを決定します。 このサービスに対して複数のアクセス ポイントが存在しますか。 クライアントがこの Web サービスを利用するために必要なその他のパラメータや情報はありますか。

    Web サービスを UDDI に登録することが、 誰でもそれにアクセスできることにつながるわけではないことを理解することは重要です。 セキュリティ、認証、および承認を、UDDI レジストリ エントリと連係させることができます。 「Web サービスが存在することを知った人がだれでも実際にそれを呼び出せるわけではありません。」 Web サービスに対するアクセス権を許可する前に、 企業間で別の手段でやり取りすることが一般的です。

  5. サービスにとって適切な分類を決定します。

    企業を分類したのと同様に、Web サービスも同様に分類できます。 したがって、企業がビジネス レベルで NAICS: Software Publisher (51121) として分類されても、 その企業のホテル予約 Web サービスはサービス レベルで NAICS: Hotels and Motels (72111) として分類されることもあります。

手順 2: UDDI エントリの登録

モデル化の実施が完了した後の次の手順は、企業を登録することです。 UDDI レジストリを使うアカウントを入手する必要があります。 利用同意書に同意する必要があるので、アカウントの取得をプログラムから行うことはできません。 Microsoft ノードは認証に Passport を使用しているので、 登録を進めるには Passport (http://www.passport.com/Consumer/default.asp) を取得する必要があります。

登録には 2 つの選択肢があります。 1 つは Microsoft ノードが提供する Web ユーザー インターフェイスを使用する方法で、 もう 1 つはそのノード自体に SOAP API 呼び出しを発行し、プログラムから登録を行う方法です。 エントリに多くの変更を行う予定がない場合、 またはエントリが比較的簡単な場合は、 Web ユーザー インターフェイスを使う方法で十分です。 しかし、頻繁に更新する予定がある場合、 またはエントリがかなり複雑な場合は、 Microsoft UDDI SDK を使用して登録プロセスをスクリプト化することは意味があります。 また、Microsoft ユーザー インターフェイスはほかの言語にはローカライズされていません。 その結果、UDDI API の機能を利用する場合も、プログラムから登録する必要があります。

注意 http://test.uddi.microsoft.com/default.aspx でサンドボックス環境の登録を練習することができます。 このノードは、実稼動ノードのレプリカです。 実稼動環境に移行する前に、プロセスに馴染んでおくことをお勧めします。

Microsoft の Web ユーザー インターフェイスの使用

Microsoft の Web ユーザー インターフェイスを使用して登録することは、 比較的直感的な処理です。 まず、Administer ページ (http://uddi.microsoft.com/administer.aspx) にナビゲートします。 ログインすると、 tModels とビジネスを登録するオプションが表示されます。 以下に処理の過程で知ることになることを少し示しておきます。

  1. プロセスの後半で tModel が必要とするので、 サービスを登録する前に必ず WSDL ファイルを tModel として登録します。
  2. WSDL ドキュメントを tModel として登録するときは、 UDDI Types Taxonomy を使用して、 その tModel を分類する必要があります。 少なくとも、WSDL は "Specification for a Web Service" (wsdlSpec) として分類される必要があります。

    この方法で分類することにより、 tModel が 「UDDI レジストリにおける WASL の使用」 ベストプラクティス ドキュメントNon-MS link に従って分類されることが保証されます。 tModels は WSDL ファイル以外のドキュメントへの参照を保持できるので、 tModel に何らかの分類を提供することは重要です。 Visual Studio .NET などのツールは、 実行したクエリの結果セットを絞り込むためにこのような分類に依存します。

  3. WSDL インターフェイスを tModel として登録した後に、 適切な連絡先情報と分類情報と共にビジネスを追加する必要があります。 適切だと思われる数の分類を追加できます。
  4. UDDI を使用して公開したい Web サービスの追加に進みます。 サービスは複数の実装を持つことができるので、 追加するサービスごとにバインディングを追加する必要があります。 バインディングごとに、 Web サービスのアクセス ポイント、 つまり を提供する必要があります。
  5. 各バインディングは、 サポートするインターフェイスへの参照を作成する必要があります。 Microsoft UI はこれらを "specification signatures" と呼んでいます。 specification signature は WSDL インターフェイスを含む tModel です。 Microsoft UI は、その URN に基づいた tModel を検索できる画面を用意しています。 この tModel は、手順 1 で登録したものか、 誰かほかの人が登録した WSDL ファイルの tModel のいずれかです。
  6. 最後に、 Web サービスの特定のインスタンスに関する概要ドキュメントの http 位置と任意の適切なインスタンス パラメータを提供するオプションが表示されます。

Microsoft UDDI .NET SDK を使用したプログラムからの登録

登録のもう 1 つの選択肢は、 プログラムから登録することです。 Microsoft UDDI SDK を使用することで、 これを簡単に行えます。 Web UI を使用して UDDI アカウントを取得する必要がありますが、 その作業が完了すれば、 残りのプロセスはスクリプトを使用して処理できます。 まず、http://msdn.microsoft.com/library/default.asp?url=/downloads/list/websrvuddi.asp から UDDI SDK をダウンロードして、インストールします。 次に、Visual Studio .NET を使用して新規 C# コンソール アプリケーションを作成します。 Microsoft UDDI SDK dll への参照設定を追加します。 この DLL は既定では C:\Program Files\Microsoft UDDI SDK\VS7\Microsoft.Uddi.Sdk.dll にインストールされます。 その後、コードの先頭で以下のようにいくつか名前空間参照を追加します。

using Microsoft.Uddi;
using Microsoft.Uddi.Binding;
using Microsoft.Uddi.Business;
using Microsoft.Uddi.Service;
using Microsoft.Uddi.ServiceType;

static void Main (string[] args) 関数に次のコードを追加します。

//次のサイトでのテスト登録に対してこのプログラムを最初に実行します。
//https://test.uddi.microsoft.com/publish
Publish.Url = "https://uddi.microsoft.com/publish";
Publish.User = "取得したアカウントを記述します";
Publish.Password = "************";

これにより、アカウントの認証が確立されます。 次に、WSDL ファイルを tModel として発行するために、以下のコードを追加します。

//tModel を作成します。
SaveTModel stm = new SaveTModel();
stm.TModels.Add();
stm.TModels[0].Name = "ここに URN を記述します";
stm.TModels[0].Descriptions.Add("en","ここに説明を記述します");
stm.TModels[0].OverviewDoc.OverviewURL = "ここに WSDL の URL を記述します";
//次の行は、tModel を適切に分類するために必要です。
stm.TModels[0].CategoryBag.Add
( "uddi-org:types",
"wsdlSpec",
"uuid:c1acf26d-9672-4404-9d70-39b756e62ab4" );

string sTModelKey = "";

//UDDI に送信します。
try
{
TModelDetail tmd = stm.Send();
sTModelKey = tmd.TModels[0].TModelKey;
}
catch (UddiException ue)
{
Console.WriteLine ( ue.Message );
return;
}
catch (Exception e)
{
Console.WriteLine ( e.Message );
return;
}

正しく保存されたときに、 UDDI は新しい一意な tModelKey を生成します。 tModelKey は、後で Web サービスのバインディングに使用します。 続いて、ビジネス エントリを作成します。

//ビジネスを作成します。
SaveBusiness sb = new SaveBusiness();
sb.BusinessEntities.Add();
sb.BusinessEntities[0].Name = "ここにビジネス名を記述します";
sb.BusinessEntities[0].Descriptions.Add("en","ここに説明を記述します");

//ビジネス サービスを作成します。
sb.BusinessEntities[0].BusinessServices.Add();
sb.BusinessEntities[0].BusinessServices[0].Name = "ここにサービス名を記述します";
sb.BusinessEntities[0].BusinessServices[0].Descriptions.
Add("en","ここにサービスの説明を記述します");

//バインディング テンプレートを作成します。
sb.BusinessEntities[0].BusinessServices[0].BindingTemplates.Add();
sb.BusinessEntities[0].BusinessServices[0].BindingTemplates[0].
Description.Add("en","ここにバインディングの説明を記述します");
sb.BusinessEntities[0].BusinessServices[0].BindingTemplates[0].
AccessPoint.Text = "ここにアクセス ポイントを記述します";
sb.BusinessEntities[0].BusinessServices[0].BindingTemplates[0].
AccessPoint.URLType = Microsoft.Uddi.Api.URLTypeEnum.Http;

//tModel のインスタンス情報を作成します。
sb.BusinessEntities[0].BusinessServices[0].BindingTemplates[0].
TModelInstanceDetail.TModelInstanceInfos.Add();
sb.BusinessEntities[0].BusinessServices[0].BindingTemplates[0].
TModelInstanceDetail.TModelInstanceInfos[0].Descriptions.
Add("en","ここに説明を記述します");
//上記の tModelKey 文字列を使用します。
sb.BusinessEntities[0].BusinessServices[0].BindingTemplates[0].
TModelInstanceDetail.TModelInstanceInfos[0].TModelKey = sTModelKey;

//UDDI に送信します。
try
{
BusinessDetail bd = sb.Send();
//xml を表示します。
Console.WriteLine ( bd );
}
catch (UddiException ue)
{
Console.WriteLine ( ue.Message );
return;
}
catch (Exception e)
{
Console.WriteLine ( e.Message );
return;
}

この時点で、WSDL 定義とビジネス情報の両方が UDDI に保存されます。 適切なキーを渡すことによって、 今後常にこのエントリを編集できます。

手順 3: エントリを UDDI で検索する

エントリを UDDI に登録後、3 つの確認を行うことをお勧めします。 まず、 Microsoft Web ユーザー インターフェイスを使用して、 名前と分類に基づいて登録したビジネスを検索し、 返される結果セットを確認します。 次に、 Visual Studio .NET を開き、 [Web 参照の追加] ダイアログ ボックスに登録したビジネスが表示されることを確認します。 表示されない場合は、 おそらく tModel が上記で説明した uddi-org:types 分類を使用して正しく分類されていません。 プロジェクトにその Web サービスを追加でき、 WSDL ファイルに基づくプロキシ コードを生成できます。 最後に、24 時間後に登録したエントリが IBM ノードに複製されるので、 https://www-3.ibm.com/services/uddi/protect/findNon-MS link でその UI を使ってエントリを検索して確認します。

まとめ

UDDI と WSDL は、 Web サービスに基づくソフトウェアの全体像を有効にすることを支援する優れた仕様です。 WSDL は、次世代のリモート プロシージャ コールを実現できるように、 Web サービスを定義するベンダ中立の、公式の手段を提供します。 それに対して、UDDI は Web サービスを記述し、発見できるように、 広範な、標準化されたインフラストラクチャを提供します。 これら 2 つの標準を組み合わせることによって、 Web サービスの世界を広げていくことができます。

次週のコラムでは、 Favorites Service を UDDI にモデル化し、 登録するときに At Your Service チームが経験したことを検証してみましょう。

ETX-Rでインターネットと接続できない場合

問い合わせ電話:
(03)3254-1144

対応方法:
※HELP用のホームページ:http://www.iodata.jp/lib/manual/etx-r/top.htm
、http://www.iodata.jp/support/manual/index_e.htm

対応1:
http://www.iodata.jp/lib/manual/etx-r/htm/data/o_35_2.htm
方法2:
http://find.iodata.jp/cgi-bin/seeker.cgi?whence=0&max=20&idxname=faq&sort=date:late&result=short&query=ETX-R

2009年6月8日月曜日

Ant用build.xmlの作成及び実行(3)

4.build.xmlによって、Antのコマンドを実行
①コマンドラインから、AntProjectフォルダへ移動
>cd /AntProject
②コンパイルの実行
>C:\apache-ant-1.6.3\bin\ant.bat
または
>C:\apache-ant-1.6.3\bin\ant.bat dist
③jarファイルの実行
>C:\apache-ant-1.6.3\bin\ant.bat executeJar
④コンパイルより作成されたフォルダ及びファイルを削除
>C:\apache-ant-1.6.3\bin\ant.bat clean

Ant用build.xmlの作成及び実行(2)

※build.xmlのサンプル。参照前、( → <に変更、) →>に変更

(?xml version="1.0" encoding="Shift_JIS"?)
(project name="CreateDomainSample" default="dist" basedir=".")
(property name="src" value="src" /)
(property name="build" value="classes" /)
(property name="dist" value="bin" /)
(property name="classpath" value="D:\AmazonProject\AntProject\" /)

(target name="prepare")
(!-- 名前がプロパティbuildの値であるディレクトリを作成する --)
(mkdir dir="${build}" /)
(/target)

(target name="compile" depends="prepare")
(!--
javaコンパイラを実行。プロパティsrcの値にある名前のディレクトリの
中とそのサブディレクトリを再帰的に探して存在するJavaソースファイル
をコンパイルする。コンパイルされたバイトコードは、destdirプロパティ
で指定されたディレクトリ以下に生成される。
つまりjavacが-dオプション付きで実行される。
--)
(!--(javac srcdir="${src}" destdir="${build}" /)--)
(javac srcdir="${src}" destdir="${build}" )
(classpath)
(pathelement path="${classpath}"/)
(fileset dir="lib")
(include name="*.jar"/)
(/fileset)
(/classpath)
(/javac)
(/target)

(target name="dist" depends="compile")
(mkdir dir="${dist}/lib" /)
(!--
jarコマンドを実行する。
jarfile:生成するjarファイルパス
basedir:jarfileとjar化するファイルのディレクトリパス
--)
(jar jarfile="${dist}/lib/CreateDomainSample.jar"
basedir="${build}" )
(manifest)
(attribute name="Main-Class" value="com.amazonaws.sdb.samples.CreateDomainSample"/)
(/manifest)
(/jar)
(/target)

(target name="executeJar" )
(!--
javaコマンドを実行する。
classname:実行対象のクラス名
classpath:外部jarファイルの参照定義
--)
(java classname="com.amazonaws.sdb.samples.CreateDomainSample" )
(classpath)
(pathelement path="${classpath}"/)
(fileset dir="bin/lib")
(include name="*.jar"/)
(/fileset)

(pathelement path="${classpath}"/)
(fileset dir="lib")
(include name="*.jar"/)
(/fileset)
(/classpath)
(/java)
(/target)

(!--
deltreeは、属性dirで指定されたディレクトリとその下のファイルとディレクトリを削除する。
--)
(target name="clean")
(delete dir="${build}" /)
(delete dir="${dist}" /)
(/target)
(/project)

Ant用build.xmlの作成及び実行(1)

Ant用build.xmlの作成及び実行:
※参照サイト:http://www.alles.or.jp/~torutk/oojava/maneuver/2001/ant/ant.html

1.サンプルプロジェクトの構成:
・Amazon SimpleDBのアンプルプロジェクト
※参照サイト:http://docs.amazonwebservices.com/AmazonSimpleDB/latest/GettingStartedGuide/
・ディレクトリ構成:
AntProject
  ¦-build.xml
  ¦-lib
  ¦-src
     ¦-com
        ¦-amazonaws
           ¦-sdb
              ¦-samples
                 ¦-CreateDomainSample.java

2.build.xmlの構成要求:
・「.classファイル」のフォルダが自動に作成される
・「.jarファイル」のフォルダが自動に作成される
・コンパイルタスクができる
・実行タスクがる
・クリンタスクがある
※build.xmlを実行用のapache-antパッケージの用意が必要

3.build.xmlファイルの作成
※詳しくは、build.xmlのサンプルを参照

TIFFファイル処理と表示の非常識(2)

上記のような画像をIrfanViewなどの専用の画像編集ツールで確認できる。
(画像処理専門のSnowboundでも、確認できる)

3.なぜ上記条件の白黒2色のTIFF_G3_FAXとTIFF_G4_FAXがこういう
ことが起こるのか?
ひとこと言えば、色表示定義用の属性が2つあるのせい。
下記は、具体的な説明:
・CCITTフォーマットが自分の色定義属性を持っている、該当属性
が白=0か黒=0か定義しる
・TIFF_G3_FAXとTIFF_G4_FAXがCCITTをベースに定義した
TIFFファイルです。しかし、全てのTIFFファイルに色表示定義の
タグ「PhotometricInterpretation」もある
・問題になったのは、このようなTIFF画像をどういる基準色で
表示するかつまり、CCITTの定義に従うか、TIFFの定義に従うか

この問題を解決するため、TIFF画像処理のチームは、下記の規約
を勝手に決めた。
①TIFF_G3_FAX/TIFF_G4_FAX、かつ、PhotometricInterpretation =0:
CCITTが定義した白黒色表示の基準に従って、画像を表示する

②TIFF_G3_FAX/TIFF_G4_FAX、かつ、PhotometricInterpretation =1:
CCITTが定義した白黒色表示の基準を逆して、画像を表示する
すなわち、CCITTが定義した白黒色表示の基準は、白=0であれば、
この場合、画像が黒=0で表示する
これは、画像のWindows表示とSnowboundやIrfanViewで表示した結果が
逆になった原因。

めちゃくちゃかもしれないが、TIFFのSpecification定義の混乱が原因
でしょう。だが、もうきめたものだから、このような変なTIFFファイルが
消えない限り、このルールに従わなければならないでしょう。
本当に悲しい~~~:(

補足:
該当問題に当たっている英語の説明:
An encoded CCITT string is self-photometric,
defined in terms of white and black runs. Yet TIFF defines a tag
called PhotometricInterpretation that also purports to define
what is white and what is black. Somewhat arbitrarily, we adopt
the following convention:

The "normal" PhotometricInterpretation for bilevel CCITT
compressed data is WhiteIsZero. In this case, the CCITT "white"
runs are to be interpreted as white, and the CCITT "black" runs
are to be interpreted as black.
However, if the PhotometricInterpretation is BlackIsZero, the
TIFF reader must reverse the meaning of white and black when
displaying and printing the image.

TIFFファイル処理と表示の非常識(1)

画像ファイルの一種として、TIFFファイルがいろいろな
フォーマットで定義されている。
(TIFF 6.0 Specificationを参照ください)

このうち、2つ特別なフォーマットがある。
これらは、TIFF_G3_FAXとTIFF_G4_FAXです。

1.フォーマット定義の違い:
"TIFF 6.0 Specification"により、TIFF_G3_FAX及び
TIFF_G3_FAXが「Class F for facsimile」で定義されている。
ほかと違うのは、「Class F for facsimile」に(Class B tags plus...)
もあります。
つまり、TIFF_G3_FAX及びTIFF_G3_FAXがClass F、Class B両方の属性を
持っている。これは、ほかのTIFFファイルとの最大の違い

2.見た目の違い(非常識のポイント):
"君はWindowsに見たものは本来の様子ではない"と急にだれから言われたら、
どう思いますか?
"ええ~?!マジですか?"と言い返すかもね。:)
しかし、Windows(あるいはWindows自分のImageツール:Windows Picture
and Fax Viewer、Paintなど)から見た白黒2色のTIFF_G3_FAXと
TIFF_G4_FAXのTIFF画像の様子が本来の様子ではない(Windowsから
見た白黒は、画像の実際の黒白となっている)!!
悲しいのは、これは事実だ。
でも、要注意のは、全ての白黒2色のTIFF_G3_FAXとTIFF_G4_FAXに
対して、こういうことがない!

下記条件に合う画像だけです。
①PhotometricInterpretation =1
②Compression = 3 (CCITT Group 3)/ 4 (CCITT Group 4)

2009年6月5日金曜日

Fedora9:有線ネットワーク設定手順(2)

問題2:
イーサネットカードの認識ができても、ネットワークの接続ができない

解決手順(suユーザ権限):
①Fedora9のファイアワォールを停止
>chkconfig iptalbes off
>chkconfig --list iptables(状態確認用)
②NetworkManagerを停止
>chkconfig NetworkManager off
>chkconfig --list NetworkManager
③networkを起動
>chkconfig network up
>chkconfig --list network
④イーサネットカードを起動
>ifconfig eth0 start
⑤メニュー「システム」→「管理」→「ネットワーク」を選び
⑥ネットワーク設定ウィンドにイーサネットの設定を行う
注:設定画面にある「NetworkManagerで管理」をチェック
⑦reboot
⑧動作確認
起動時、eth0のIP情報は成功に取得できること、あるいは
ifconfigによって、イーサネットカードの状態が確認できる

※ほかのコマンド:
uname -r
lsmod
ifconfig
lspci
modprobe
rpm -ql コマンド名

Fedora9:有線ネットワーク設定手順(1)

問題1:
イーサネットカードが認識できない
★該当イーサネットカードのドライバ:
Intel(R) 82567LM Gigabit Network Connection

解決手順(suユーザ権限):
①Linux用の該当ドライバファイルをダウンロード
(*.tar.gzファイル)
②該当ファイルを解凍
>tar zxf *.tar.gz
③解凍の該当ファイルのsrcフォルダに移動
>cd /sample/src
④コンパイル
>make
⑤インストール
>make install
⑥システム起動時、イーサネットカードを自動に認識するため、
下記設定を行う
>vi /etc/modprobe.conf
alias eth0 e1000e
上記一行を追加(e1000eは例としてのイーサネットカードモジュール名)
⑥再起動
>reboot
⑦イーサネットカード認識の確認
>lsmod
e1000eが含む行の確認
>ifconfig
eth0の配置情報の確認

補足:
上記手順④のところ、コンパイルする時、kernel-develのinstallが必要という
ようなメッセージが出る場合、コンパイルできないから、下記手順より、
kernel-develのパッケージをインストールしよう。
・kernel-develパッケージをダウンロード(rpmファイル)
・rpm -ivh kernel-devel***.rpm
(必要ならば、kernel-sourceパッケージもインストール)
この後、引き続き、上記手順④から実行

2009年6月3日水曜日

Fedora9 dhcpよりeth0の動的なIPが取れない問題

現象:
>sudo /etc/init.d/network start

実行すると、下記のメッセージが出る
determining IP information for eth0....Failed

可能の解決方法:
※br0 is the gateway to the external network

方法1:
・[selinuxに permissiveを設定]
・[reboot]
・ifconfig eth0 up
・dhclient eth0(dhclientは、どんなコマンド?)


方法2:
ネットワーク設定画面の中にある「NetworkManagerで管理」をチェックして、
・reboot
・eth0を起動


方法3:
・chkconfig network off
・chkconfig NetworkManger on
・chkconfig iptables on
(networkサービスの停止、NetworkMangerサービスの起動が必要かどうか後検討)
・ネットワーク設定画面の中にある「NetworkManagerで管理」をチェック
・reboot
・eth0を起動

2009年6月1日月曜日

Fedora9:sudoersにユーザを追加

普通権限のユーザでsudoよりコマンドを実行
すれば、事前に/etc/sudoersファイルに
該当ユーザ情報の追加が必要。
追加例:
rootユーザでログインして、下記のように
sudoersファイルにユーザ情報を追加

>vi /etc/sudoers

root ALL=(ALL) ALL

#zaruユーザはパスワード入力を必要としない
zaru ALL=(ALL) NOPASSWD:ALL

#piyoユーザはパスワード必須
piyo ALL=(ALL) PASSWD:ALL

2009年5月20日水曜日

Struts応用(七):独自のActionMappingの拡張(3)

3.Actionクラスのexecute()メソッドに、パラメータ
mappingを明示的に上記ActionMappingサブクラスに変換すること
が必要
例:
public class HelloAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {

// ロギング部分
// LoggingActionMappingへ明示的に型キャストする必要がある
((LoggingActionMapping) mapping).writeLog(request,
"にリクエストする。", LoggingActionMapping.INFO);

return mapping.findForward("success");
}
}

Struts応用(七):独自のActionMappingの拡張(2)

2.struts-config.xmlに上記ActionMappingクラスの登録
★ソースを参照する時、(を<に変更、)を>に変更

①ActionMappingサブクラスの登録
2つの方法があります
・全てのactionに対して、該当ActionMappingサブクラスを応用:
(action-mappings)タグに下記のように、独自のActionMappingクラス
を該当タグのtype属性に追加:
(action-mappings type="{packagename}.LoggingActionMapping")
・特定なactionだけに対して、該当ActionMappingサブクラスを応用:
(action path="/hello"
className="{packagename}.LoggingActionMapping"
type="qjb.struts.pkgOne.HelloAction")
......
(/action)
②ActionMappingサブクラスに独自のプロパティを渡す
各(action)要素内に(set-property)子要素を記述し、
そのproperty属性にプロパティ名、value属性に値を指定
例:
  (action path="/hello"
type="qjb.struts.pkgOne.HelloAction")
(set-property property="logLevel" value="2"/)
(set-property property="logFilePath" value="c:\struts_log.txt"/)
(forward name="success" path="/hello.jsp"/)
(/action)

Struts応用(七):独自のActionMappingの拡張(1)

ActionMappingクラスの拡張:
簡単にいえば、ActionMappingクラスのサブクラスを実装する
こと下記で例を用いて、手順を説明します。
例としての仕様要求:
下記の独自のロギング機能の実装が必要
・特定のログファイルへログを出力するメッソドを持ち
・Actionクラスの呼び出しによって、ログを出力
・パラメーラlogLevelによって、ログ出力レベルを設定できる
・パラメータlogLevelの初期化は、struts-config.xmlで実施
・パラメータlogFilePathによって、ログファイルパスを設定
・パラメータlogFilePathの初期化は、struts-config.xmlで実施

拡張の実施手順:
1.ActionMappingクラスのサブクラスを作成
①変数logLevelとsetLogLevel、getLogLevelメソッドの定義
②変数logFilePathとsetLogFilePath、getLogFilePathメソッドの定義
③デフォルトのログファイルパスを定数として定義
④ログ出力メソッドの定義
⑤ログレベルとして、レベルごとの定数フラグを定義
(例:private static final int info=2;)

2009年4月28日火曜日

vistaにあるjdk1.4.2のJVM異常終了問題

buglist
http://bugs.sun.com/bugdatabase/view_bug.do;
jsessionid=e6d5c1817eb35f4fa58ed3bef6db0?
bug_id=6830549

2009年4月10日金曜日

Struts応用(六):Tilesの関連設定手順

※下記ソースを使う時、()→<>に変更してください。
Tilesタグは、画面のテンプレート化と画面設計の共通化のため使われるStrutsのタグです。
1.Tilesプラグインを有効にする設定:
各struts-config.xmlに下記の設定を追加する
(plug-in className="org.apache.struts.tiles.TilesPlugin" )
(set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" /)
(set-property property="moduleAware" value="true" /)
(/plug-in)
※注:moduleAwareの値はfalseであれば、Web.xmlにある一番目のモジュールのstruts-config.xml
にある該当設定が有効、かつ、他のすべてのモジュールにも有効;trueの場合、自分のモジュール
だけに有効

2.自定義Tilesタグの作成:
ファイル「tiles-defs.xml」を編集し、自定義ものを追加
例:
(tiles-definitions)
(definition name="tilesName" path="/layout.jsp")
(put name="title" value="タイトルです"/)
(put name="menu" value="/menu.jsp"/)
(put name="contents" value="/contents.jsp"/)
(/definition)
(/tiles-definitions)
これで「layout.jsp」というテンプレートの画面レイアウト
を定義した

3.Tilesタグプラグイン定義ファイルの参照:
二つの方法がある
・JSPのヘーダ部に直接該当定義ファイルを参照
(%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %)
・web.xmlにtaglibの定義ファイル参照URIを定義し、JSPから参照
「web.xmlの定義」
(taglib)
(taglib-uri)/WEB-INF/struts-tiles.tld(/taglib-uri)
(taglib-location)/WEB-INF/struts-tiles.tld(/taglib-location)
(/taglib)
※この場合、tldファイルが/web-inf/下に追加しないといけない
「JSPの参照」
(%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %)
※方法一は、直接Webからファイルを参照するから、通信とバージョン確定が
難しいから、二番目の方法がいいでしょう

4.JSPにTilesタグの利用:
①上記「3」の参照方法で定義ファイルのURI参照をJSPに追加
②struts-tiles.tldに定義されているタグの方法が利用できる
例:(layout.jsp)
(%@taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %)
(html:html)
(body)
(table width="100%")
(tr colspan="2")
(td align="center")(tiles:getAsString name="title"/)(/td)
(/tr)
(tr)
(td width="20%" valign="top")(tiles:insert attribute="menu"/)(/td)
(td width="80%" valign="top")(tiles:insert attribute="contents"/)(/td)
(/tr)
(/table)
(/body)
(/html:html)

5.layout.jsp画面の遷移定義:
該当モジュールのstruts-config.xmlにあるActionタグに下記属性を追加する
例:
(action-mappings)
(action name="formName" path="/MyAction" type="pkg.MyAction" validate="false" scope="request")
(forward name="success" path="tilesName"/)(!--該当pathの値は、 tiles-defs.xml」に
定義されているdefinationのnameの値と同じ名前--)
(forward name="error" path="error.jsp"/)
(/action)
(/action-mappings)
これでTilesタグを使っているJSP「layout.jsp」への遷移ができる

Struts応用(五):validation.xmlに検証対象情報の定義方法

※下記ソースを使う時、()→<>に変更してください。
例:
(?xml version="1.0" encoding="Shift_JIS" ?)
(!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//
DTD Commons Validator Rules Configuration 1.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_0.dtd")
(form-validation)
(formset)
(form name="testForm")(!-- アクションフォームBeansの論理名 --)
(field property="title" depends="required,maxlength")
(arg0 key="タイトル" resource="false" /)
(arg1 name="maxlength" key="100" resource="false" /)
 (arg2 name="maxlength" key="maxlength.max" resource="true" /)
(arg3 name="maxlength" key="${var:maxlength}" resource="false" /)
(var)
(var-name)maxlength(/var-name)
(var-value)100(/var-value)
(/var)
(/field)
(!--(field)要素を繰り返し記述--)
(/form)
(!--(form)要素を繰り返し記述--)
(/formset)
(/form-validation)
※説明:
1.arg0~arg3まで定義できる
2.name:検証名(validator-rules.xml/自定義validator-rules.xmlに定義される)
対応エラーメッセージのキー:error.検証名
3.resource:「true」の場合、リソースのプロパティファイルをキーによって参照
4.key:検証標準定義(三つの方法がある)
  ①arg1のように:
検証標準値は、keyの設定値である
  ②arg2のように:
検証標準値は、リソースプロパティファイルにあるキー=「maxlength.max」
の値である
  ③arg3のように:
検証標準値は、varタグによって定義されている変数「maxlength」の値である

Struts応用(四):Validatorプラグインの利用手順

※下記ソースを使う時、()→<>に変更してください。
1.Validatorプラグインに関する設定:
場所:struts-config.xml及び各モジュールのstruts-config.xml
形式:
(plug-in className="org.apache.struts.validator.ValidatorPlugIn")
(set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,
/WEB-INF/validation.xml,
/WEB-INF/myvalidator-rules.xml"/)
(/plug-in)
説明:
①設定できるpropetyには、ValidatorPlugInのドキュメントを参照
②validator-rules.xml:標準な検証情報ファイル(変更の必要なし)
③validation.xml:フォーム要素に対して適用する検証の種類、
検証時に必要なパラメータ、エラーメッセージなどのマッピング
④myvalidator-rules.xml:自定義の検証ルール

2.Actionタグの設定:
属性validate=trueを設定すると、サーバ側の検証を有効にする
input属性には、検証エラーのエラー画面など定義できる

3.message-resources要素:
エラーメッセージファイルを指定
※注意:
該当メッセージリソースファイルに日本語を含んでいる場合、
事前に該当リソースファイルに対して、Unicode変換が必要。
Unicode変換は、コマンドラインで行う
(変換前の名前は、変換後の名前と別々にする)
例:
>native2ascii ApplicationResources.properties.sjis
ApplicationResources.properties

4.validation.xmlに検証対象情報の定義:
5.自分のアクションフォームBeanは、ActionFormではなく、
ValidatorFormのサブクラスにしなりといけない
public class TestForm extends ValidatorForm{
}

Struts応用(三):Struts-config.xmlファイルを複数の設定ファイルに分割する方法

※下記ソースを使う時、()→<>に変更してください。
1.初期化パラメータの設定値をカンマで区切る方法
例:
(servlet)
(servlet-name)action(/servlet-name)
(servlet-class)org.apache.struts.action.ActionServlet(/servlet-class)
(init-param)
(param-name)config(/param-name)
(param-value)/WEB-INF/struts-config.xml,
/WEB-INF/struts-config2.xml
(/param-value)
(/init-param)
(load-on-startup)1(/load-on-startup)
(/servlet)

2.モジュール化によるファイル分割を用いる方法
(servlet)
(servlet-name)action(/servlet-name)
(servlet-class)org.apache.struts.action.ActionServlet(/servlet-class)
(!-- デフォルトモジュール --)
(init-param)
(param-name)config(/param-name)
(param-value)/WEB-INF/struts-config.xml(/param-value)
(/init-param)
(!-- 登録モジュール --)
(init-param)
(param-name)config/reg(/param-name)
(param-value)/WEB-INF/struts-config-reg.xml(/param-value)
(/init-param)
(load-on-startup)1(/load-on-startup)
(/servlet)

モジュール化では、プレフィックスを用いて名前空間を分割します。
デフォルトモジュール:http://ホスト名/コンテキスト名/アクション名.do
登録モジュール:http://ホスト名/コンテキスト名/モジュール名(reg)/アクション名.do
※これは、上記configファイルの(param-name)のURIで決めるもの
要注意のは、上記モジュール化によって、JSPのactionパスは、サブモジュールの
設定ファイル(例:struts-config-reg.xml)に定義されたActionMappingと合えない可能性
があります。原因は、URIにモジュール名があること。これは、Strutsが決めたものだ。
解決の一つ方法は、仲介役の遷移画面が用意し、該当仲介画面を通じて、上記モジュールの
実際の作業JSPが表示される。
例:
(html:link module="/reg" action="/forwardLoginReg")regモジュールへ(/html:link)
「action="/forwardLoginReg"」がstruts-config-reg.xmlに定義される。

(action path="/forwardLoginReg" forward="/loginReg.jsp")
(/action)
これで、loginReg.jspがモジュールregを含んでいるURIに表示されることができる
※struts-config.xmlに定義できる属性:
* (data-sources)要素
* (form-beans)要素
* (global-exceptions)要素
* (global-forwards)要素
* (action-mappings)要素
* (controller)要素
* (message-resources)要素
* (plug-in)要素

Struts応用(二):Tomcatサーバデバッグ環境の作成手順

目的:Eclipseの開発環境に直接Tomcatサーバを使って、デバッグをする
手順:
1.Eclipse画面にある「サーバー」ビュー画面を右クリックする
2.「新規」→「サーバー」をクリックする
3.「新規サーバー定義」の画面でTomcatサーバーを選んで、「次へ」をクリックする
4.左側のデバッグ対象プロジェクトを右側の「構成プロジェクト」に追加して、
「終了」をクリックする。
5.StrutsのlibフォルダにあるjarファイルをTomcatの「common」→「lib」にコピー

これでTomcatサーバのデバッグ環境ができる

Struts応用(一):Strutsプロジェクトの作成手順

1.Eclipseの「ファイル」→「新規」→「プロジェクト」を開く
2.動的Webプロジェクトを選んで、「次へ」をクリック
3.プロジェクト名を入力し、他の項目をデイフォルトのままで「次へ」
4.「終了」ボタンをクリックする
5.作成したプロジェクト名前を右クリックし、「プロパティ」設定を行う
6.プロパティ設定画面の「Javaのビルド・パス」画面を開く
7.「ライブラリ」タブ画面にStrutsのlibフォルダにあるjarファイルを該当
画面に追加する
8.「OK」をクリックする
ここまで、Strutsフレームワークを使うWebプロジェクトの作成ができる