アーカイブ

‘Java’ カテゴリーのアーカイブ

Oracle JDeveloper 11gのチュートリアルと学習

2010 年 2 月 7 日 oklab コメントはありません

Java の開発は 統合開発環境として Eclipse を使うのが一般的です。私も仕事でよく使うのですが、今後使用するかもしれないので、 休日中に、Oracle JDeveloper 11g  調べてみました。

Oracle は数年前に Weblogic アプリケーションサーバで有名な BEA システムズ を買収し、最近 サンマイクロシステムズを買収しました。そのため Eclipse と比較すると、IDE にWeblogicが組み込まれている点と、Oracle 用の SQL開発環境が組み込まれている点が Eclipse に対するメリットと感じました。 Weblogic向けのEJB関係の自動生成機能などは非常に便利で、EJB2.0 のころと比べると作る敷居がかなり下がった印象でした。

デメリットは、Eclipse のような豊富なプラグインでカスタマイズできないことと、日本語ドキュメントの少なさを感じました。そのため、Weblogic と Oracle を使う前提だと強力な統合開発環境ですが、開発は、Tomcat アプリケーションサーバを使ったり、Seaserフレームワークなど様々なフレームワークを使う場合は Eclipse のほうが使いやすいです。

学習するドキュメントについては、英語ですが、Oracle.com – Getting Started: Java が参考になります。はじめは、Oracle JDeveloper 11g のドキュメントを Google でがんばって探したのですが入門レベルの日本語ドキュメントはないようでした。英語は大変ですが上記ドキュメントで学習したほうが早いです。また、このチュートリアルはスクリーンショットがあるので何とかなると思います。

チュートリアルのはじめの章(Step 3)で、簡単な Java のクラスを作成したり、リファクタリング、ビルド、デバッグなどを通して、その作業で、JDeveloper がどのような動きをするのかが理解できます。 休日にVisual Studio 、NetBeans を使ったりしてある程度いろいろな統合開発環境には慣れているのですが、Weblogic がどのように統合されているかなどを理解するためにも、はじめの章は試してみたほうがよいです。所要時間は30分ぐらいです。

また、Step 4 の Build the business logic for an application using EJB 3.0 で Weblogic向けの EJB3.0 と JPA が学習できます。所要時間はこれも30分くらいです。

私の場合はここまでで1時間30分ぐらい掛かりましたが Step 4まで行えば 今後 JDeveloper で J2EE 側の実装が可能になります。Step 5まで行えば、Web層を含めて開発ができるようになると思います。Step 6 ではさらに SOA の学習となります。

今回 JDeveloper 11g をはじめて使ってみましたが、やはり自社製品との連携機能は強力でした。Oracle データベースは、CPUなどのハードウェアの制約がありますが、Oracle XE が無償で使えるので、Weblogic も個人向けに 無償版ライセンスができると、もっと JDeveloper と Weblogic のユーザが増えそうですね。

カテゴリー: Java, データベース タグ: , ,

OracleのWebLogic Server 11gR1、Eclipse、Oracle 11gでEJB3.0の概要を学習

2010 年 1 月 30 日 oklab コメントはありません

限られた時間でEJB3.0の概要を把握するため、2日という期間でEJB3.0が何かを調べたときの資料です。

EJB3.0は自動化やDI,O/Rマッピングなどを機械的にやるので、概要を把握する際にトライアンドエラーをするコストがすごく高くつきます。また、学習段階だとそのエラーが何を意味しているのかは理解できても、その対策方法を行うのにすごく時間がかかってしまいます。

下記で説明する「Oracle Fusion Middleware ドキュメント・ライブラリ」を読みつつ、Google検索すれば、EJB3.0の概要がわかると思います。用語を押さえたら、「Introduction to Oracle Enterprise Pack for Eclipse 11g JPA Workbench」で手を動かすことで実装のスタートラインに立てると思います。

環境

  • DB:Oracle 10g XE or Oracle 11g
  • 開発ツール:Oracle Enterprise Pack for Eclipse(OEPE)
  • アプリケーションサーバー:WebLogic Server 11gR1
  • OS:Windows Server 2008

参考資料

上記環境で開発するために、参考になるリンク。

Getting Started With the Oracle Database Plugin for Eclipse

Oracle Database Pluginの概要。

http://download.oracle.com/docs/cd/E14545_01/help/oracle.eclipse.tools.database.doc/html/gettingStarted/files/gettingStarted.html

 Introduction to Oracle Enterprise Pack for Eclipse 11g JPA Workbench

Oracle Enterprise Pack for Eclipse、WebLogic Server 11gR1、Oracle 10g XEを使ってEJB3.0のセッションBean、エンティティBean、JPA、呼び出しとなるJSP/Servletのユーザーインタフェース作成をして、EARパッケージをデプロイするまで記述されています。また、このチュートリアルで使ったサンプルのZIPがあるので、EJB3.0をどのように実装すればわからない場合はお勧めです。

http://www.oracle.com/technology/pub/articles/cioroianu-eclipse-jpa.html

Oracle Enterprise Pack for Eclipse 11gR1 PS1

OEPEのページ。WebLogic Server 11gR1は、アプリケーションサーバのみと、OEPEバンドル版があるので、バンドル版をインストールする場合は必要ありません。

 http://www.oracle.com/technology/global/jp/products/enterprise-pack-for-eclipse/index.html

Oracle Fusion Middleware ドキュメント・ライブラリ

アプリケーションのデプロイメントアプリケーションの開発Web アプリケーション、サーブレット、JSP の開発エンタープライズ JavaBeans バージョン 3.0 プログラマーズ ガイド から必要なところをつまみ食いすれば、EJB3.0がわかってきます。

http://download.oracle.com/docs/cd/E16340_01/dev.htm

EJB3 – HelloWorld example Using Weblogic 10.3

JNDI lookupでのEJB3.0の呼び出しサンプルです。上記の「Introduction to Oracle Enterprise Pack for Eclipse 11g JPA Workbench」を見つけ出す前まで、JSP/ServletからEJB3.0のセッションBeanをうまく呼び出せなくて試行錯誤しているときに見つけました。

ドキュメント内のNoteで書かれていますが、ユーザ名、パスワード、プロバイダURLは各自設定する必要があります。

http://upog.wordpress.com/2009/10/18/ejb3-helloworld-example-using-weblogic-10-3/

James Bayer’s Blog - Workshop for WebLogic 10.3 JEE 5 Trial and Error

クライアントPC上のJavaVMで動作するJavaクライアントプログラムから、サーバ側のWebLogic Server のEJB3.0セッションBeanを呼び出すための記事です。Oracle Enterprise Pack for Eclipse(OEPE)上で、J2EE アプリケーションクライアントを実行するには、実行の設定で、Bootstrap EntriesからWeblogic関係のライブラリを削除すること、User Entriesにwlclient.jarを追加する事について書かれています。

http://blogs.oracle.com/jamesbayer/2008/08/workshop_for_weblogic_103_jee.html

用語

  •  Oracle E-Business Suite

ERPパッケージ。財務会計、人事管理(HRM)、サプライチェーンマネジメント(SCM)、購買調達、プロジェクト管理、マスターデータ管理のソリューションを包括的に提供。

  • Java EE5
    • EJB3.0(セッションBean,エンティティ,インターセプター)
    • Webサービス
    • JSF/JSTL
    • JPA O/Rマッピング
    • その他、トランザクション管理、リソース管理など

 

  • EARファイル

EJBパッケージ、WARパッケージ(JSP/ServletなどWeb層のアプリケーション)などをまとめたものです。Eclipseの場合は、Enterprise Applicationプロジェクトを作成します。エンタープライズアプリケーションとも呼ばれます。これはただまとめるための器となるプロジェクトです。これに、EJBプロジェクト、Dynamic Web プロジェクト、JPAプロジェクトを追加します。

EARファイル = WARファイル + EJB Jarファイル …

  • Oracleの永続化プロダクト

もともとは、Oracle Kodo JPA/JDOがでしたが、マニュアルを確認すると現在は非推奨となっています。Oracle TopLinkを使うように促しています。2010年現在、Oracle TopLinkは、Eclipse Foundationに寄与されたのでEclipseLinkになっています。よって、EclipseからJPAプロジェクトを作成すれば、EclipseLinkをJPA実装として使えます。

  • 依存性注入

アプリケーションが起動中に、Javaのフィールド変数に値を埋めてくれる機能と考えればわかりやすいです。DIとも呼ばれます。EJBでは、SQLを使わないようにJPAのO/Rマッピング、EJB2.0時代のホーム/リモートインターフェースの省略などで使われます。

  • インターセプター

アスペクト指向を組み入れる方法です。プログラムをするとき、業務ロジック以外に、ログ出力機能、セキュリティチェック機能、例外処理機能など、本来業務ロジックとしてはではないプログラミングが必要になります。これらのコードを業務ロジックとともに記述すると、複雑になってくるので、普通はオブジェクト指向の継承や委譲機能を使って、プログラムを分割します。これをさらに発展させたのが、インターセプターです。セキュリティチェック機能の後に、ログ出力機能を呼び出し、その後業務ロジックを呼び出す。また設定だけで、呼び出す順番を変更できたりします。EJB側で使えるフィルターです。

  • J2EE アプリケーションクライアント

EARファイルに含めることのできるクライアントモジュール(JARファイル)の事です。J2EE標準デプロイメント記述子のapplication-client.xmlが含まれています。またWeblogic

  • T3プロトコル

Oracle独自の通信プロトコルです。

  • Weblogic フルクライアント

OracleのT3プロトコルを使ったJava RMIクライアントです。Weblogicのwlfullclient.jarがライブラリとして必要になります。

カテゴリー: Java タグ: , ,

Javaで固定小数点の計算

2009 年 11 月 26 日 oklab コメントはありません

JavaでWebアプリケーションを作成している場合は、小数点の計算には、浮動小数点のfloat型やdouble型を使い、お金の計算には、java.math.BigDecimal 型が使われます。またサーバ用コンピュータとしてある程度ハードウェアの性能が期待できるのと、保守性を考慮して、上記の型を使います。

近年、Google 製の携帯電話が発売されましたが、携帯電話でぎりぎりまで性能を引き出すには、固定小数点での計算が有力だそうです。以下にAndroid携帯でのゲーム開発について解説があるのですが、パフォーマンスチューニングのために、関数を使わないや、固定小数点を使うなどは普段Webアプリケーションでは考慮しない事なのでとても興味深いです。

Android でリアルタイムゲームの開発方法 : Google Developer Day 2009 Japan ,スピーカー : クリス プルエット

/**
 * Javaで固定小数点の計算.
 * @author Satoshi Okita
 * 参考資料:
 * 固定小数   http://www.sage-p.com/compone/toda/fixdec.htm
 * 整数化小数 http://www.geocities.co.jp/Berkeley/2093/clab.html
 * 固定小数点 http://www2s.biglobe.ne.jp/~nuts/labo/daal/daal07.html
 * Javaでfixpointのライブラリを作っている方がいました。三角関数も実装されています。
 * http://blog.numfum.com/2007/09/java-fixed-point-maths.html
 */
public class FixpointTest {

    /**
     * @param args
     */
    public static void main(String[] args) {

        // 整数の計算.
        int five = 5;                        // 0000 0000 0000 0000, 0000 0000 0000 0101 (32bit)
        int ffive= Fixpoint.int2fix(five);    // 0000 0000 0000 0000, 0000 0101 0000 0000 (32bit)
        int rfive = Fixpoint.fix2int(ffive);// 0000 0000 0000 0000, 0000 0000 0000 0101 (32bit)
        System.out.println("整数5をそのまま表示した値=" + five);
        System.out.println("整数5をfixpointで表した値=" + ffive);
        System.out.println("整数5をfixpointから戻した=" + rfive);

        // 小数点のある値の計算.
        // 小数を代入するときは、2のシフト数乗をかけた値を指定
        int f   = Fixpoint.fvalue(1.23f);
        System.out.println("小数1.23をfixpointで表現 =" + f);

        // fixpoint型での加算. 5+1.23
        int fixr = ffive + f;

        System.out.println("小数6.23をfixpointで表した値=" + fixr);

    }

}

final class Fixpoint {
    public static int FIX_POINT  = 8;

    public static int fvalue(float fx) {
        int r = 2;
        for (int i = 2; i <= FIX_POINT; i++) {
            r = r * 2;
        }
        System.out.println("r=" + r);
        return (int)(fx * r);
    }

    public static int int2fix( int x ) {
        // return value = x * 2のFIX_POINT乗
        // 例) return value = x * 2^8 (Javaでは^はサポートされていない)
        return x << FIX_POINT;
    }
    public static int fix2int( int x ) {
        return x >> FIX_POINT;
    }

    public static int multiply( int x, int y ) {
        return (int)(( ( long )x * ( long )y ) / FIX_POINT);
    }

    public static int divide( int x, int y ) {
        return (int)(( ( long )x * FIX_POINT ) / ( long )y);
    }
}
カテゴリー: Java タグ:

ApacheとTomcatを連携するとHTTPリクエスト毎にSessionIDが変わってしまう

2009 年 10 月 5 日 oklab コメントはありません

作成したWebアプリケーションの状態

開発時は、Tomcatにポート番号8080で接続して開発を行いました。アプリケーションの機能は簡単で、ゲストユーザは閲覧権限のみ持っていて、ログインを行うと管理者になったりできます。これはどこでも使われるWebアプリケーションの仕組みだと思います。Tomcat上ではセッションの保持が問題なく行われました。つまりログイン処理を行ってHttpSessionによるセッションオブジェクトを生成した後だと、ブラウザからのHTTPリクエストが行われても、sessionid で一意性を保持できた状態です。

Apache と Tomcat の連携と問題

その後、ある程度動作するようになったので、Apache 2.2 と Tomcat 5.5 を mod_proxy_ajp で連携しました。以下は、リバースプロキシの設定になります。1行目では、インターネットからhttp://www.oklab.org/devlink/ にリクエストが来たら、該当のリクエスト先の ajp://localhost:8009/OKLabDevLink/ にHTTPリクエストを送信します。2行目は、リダイレクトの対応のために記述しています。この設定だけだと、Apache 2.2 と Tomcat 5.5 は連携できるのですが、ブラウザのCookie に保存された JSESSIONID が常に変更される状態でした。

ProxyPass /devlink/ ajp://localhost:8009/OKLabDevLink/
ProxyPassReverse /devlink/ ajp://localhost:8009/OKLabDevLink/

ProxyPassReverseCookiePath による問題解決

いろいろ調べてみると Apache 2.2 の設定の ProxyPassReverseCookiePath ディレクティブで、Cookie の Path  を変更できるので、元々の Path である /OKLabDevLink から /devlink に変更し対応できました。

ProxyPass /devlink/ ajp://localhost:8009/OKLabDevLink/
ProxyPassReverse /devlink/ ajp://localhost:8009/OKLabDevLink/
ProxyPassReverseCookiePath /OKLabDevLink /devlink

何故こうなるかは、もう少し調べてみないと分からないのが現状ですが、次の機会にしたいと思います。

その他

Firebug の拡張プラグインの、 Firecookie を使うと、ブラウザで cookie の状態を確認できるので便利でした。 あと Live HTTP Headers アドオンを追加すると 横取り丸などのプロキシも不要になりそうです。

カテゴリー: Java, 環境設定 タグ:

Javaの正規表現で POSIX 文字クラスを使い、句読文字、制御文字、空白文字を変換し無効化(サニタイジング・サニタイズ)する

2009 年 9 月 15 日 oklab コメントはありません

Javaの正規表現で POSIX 文字クラスを使い、句読文字、制御文字、空白文字を変換し無効化(サニタイジング・サニタイズ)するサンプルクラスです。 POSIX  文字クラスというのは、正規表現の定数です。

例えば、半角空白、タブ、改行コードなどを一つにまとめて、\p{Space} のように記述できます。これを使えば、空白文字はAに変換したいとした場合に簡単に記述できます。詳しくはサンプルソースコードを見ていただければ分かると思います。

また、POSIX 文字クラスだけでは、複雑な表現に対応できないため、Perl は独自拡張しているため非常にテキストの解析が得意な言語となっています。Java では、Jakarta ORO が強力な正規表現機能を持っていて、デファクト・スタンダードに近い存在になっています。

package org.oklab.sandbox;

import java.util.regex.Pattern;

/**
 * Javaの正規表現で POSIX文字クラスを使い、
 * 句読文字、制御文字、空白文字を変換し無効化(サニタイジング・サニタイズ)するサンプルクラスです。
 *
 * @author satoshiokita
 * @since 2009/09/15
 *
 */
public class SampleSanitize {

	/**
	 * テストを実行する。
	 * @param args
	 */
	public static void main(String[] args) {
		// 変換したい文字列.
		String src = "h1llo 	.#s/ggg 	test.2test \t\n\f\r AAAAA!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ZZZ";

		// 正規表現でサニタイジング
		String buff = sanitize(src);

		// テスト時にデバッグしやすいように、目盛りを表示.
		System.out.println("12345678901234567890123456789012345678901234567890");
		System.out.println("---------+---------+---------+---------+---------+");

		// 結果出力。
		System.out.println(buff);
	}

	/**
	 * 正規表現で、句読文字、制御文字、空白文字を無効化する。
	 * @param src 変換したい文字列
	 * @return 変換後の文字列
	 */
	private static String sanitize(String src) {
		String replacedStr = null;

		// 句読文字 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ を空文字("")にして無効化.
        Pattern pattern = Pattern.compile("\\p{Punct}");
        replacedStr = pattern.matcher(src).replaceAll("");

        // 制御文字: [\x00-\x1F\x7F]を空文字("")にして無効化.
        pattern = Pattern.compile("\\p{Punct}");
        replacedStr = pattern.matcher(replacedStr).replaceAll("");

        // 空白文字: [ \t\n\x0B\f\r]を半角空白にする。
        pattern = Pattern.compile("\\p{Space}");
        replacedStr = pattern.matcher(replacedStr).replaceAll(" ");
		return replacedStr;
	}

}
カテゴリー: Java タグ:

SocketでHTTP接続を行い、HTTPステータス、HTMLのtitle要素、HTMLのmeta要素のkeyword属性を解析

2009 年 9 月 14 日 oklab コメントはありません

Java で HTML を解析する場合はオープンソースでいろいろなライブラリがあります。 これらは強力で便利なのですが、件名のように特定の用途のみだけに使う場合は、解析ツールの学習コスト、運用後のライブラリ管理などでコストが高くなります。そこでちょっとしたHTMLの解析コードを実装してみました。解析部分は甘いところが多々ありますが、解析のとっかかりソースコードにはなると思います。

javaでは、HTTP接続用のライブラリとして、java.net.HTTPURLConnection クラスが存在するのでこれを使えば簡単にできます。しかし、以下コードでは、細かい制御や、プログラミング言語を変更した場合のコード変換を考慮してSocket接続をしています。

execute メソッド内の while ループが大元の繰り返し処理です。一般的な繰り返し処理と違うところは、title解析の parseTitle メソッドや、keyword解析の parseKeywords メソッド内に、ループするオブジェクトを渡していて、メソッド内で繰り返し処理を行っているところです。HTMLでは、title要素が1行とは限りません。そのためタグの終端まで読み込む必要があります。

また、あまり複雑にならない程度に正規表現を利用して、HTMLの要素解析を行っています。たとえば、HTMLでは以下を許容します。そのためif文で評価していません。

  • <meta name=keyword …
  • <meta name=’keyword’ …
  • <meta name=”keyword” …

追記:2009/09/22 titleタグや、keyword属性が日本語の場合を考慮して、HTTPヘッダのContent-Typeをで、文字コードを取得し変換するようにしました。WordPressにコピーペーストした際に、<>などが変換されずに、ソースコードがおかしくなっていたのを修正しました。

/**
 *
 */
package org.oklab.socket;

import static java.net.HttpURLConnection.HTTP_OK;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * SocketでHTTP接続を行い、HTTPステータス、HTMLのtitle要素、HTMLのmeta要素のkeyword属性を解析します。
 *
 * @author satoshiokita
 *
 */
public class SocketConnectionSample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SocketConnectionSample scs = new SocketConnectionSample();
		scs.execute();
	}

	/**
	 *
	 */
	private void execute() {
		String host = "www.oklab.org";
		int port = 80;
		try {
			Socket socket = new Socket(host, port);
			BufferedReader sin = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));
			BufferedWriter sout = new BufferedWriter(new OutputStreamWriter(
					socket.getOutputStream()));

			// ソケットに書き込む。つまりHTTPリクエストを作る。flashで送信。
			sout.write("GET / HTTP/1.1\r\n"
			+ "Host: " + host + "\r\n"
			+ "Connection: close\r\n"
			+ "\r\n");
			sout.flush();

			// ソケットから読み出す。つまり応答を解析する。
			long   lineCount = 0;
			String buff;
			int httpStatus = HTTP_OK;
			String title = "";
			boolean alreadyParseTitle = false;
			String keywords = "";
			boolean alreadyParseKeywords = false;
			String charset = "";
			boolean alreadyParseContentType = false;
			while ((buff = sin.readLine()) != null) {
				lineCount++;

				// HTTPヘッダー HTTPステータスの解析.
				if (lineCount == 1) {
					httpStatus = Integer.parseInt(buff.split(" ")[1]);
				}

				// HTTPヘッダー Content-Typeの解析.
				if (!alreadyParseContentType && (buff.indexOf("Content-Type: text/html; charset=") != -1)) {
					if (buff.indexOf("=") != -1) {
						charset = buff.substring(buff.indexOf("=") + 1, buff.length()).trim();
					}
					alreadyParseContentType = true;
				}

				// HTML meta要素 keyword属性の解析.
				if (!alreadyParseKeywords
						&& ((buff.toLowerCase().indexOf("name=\"keyword\"") != -1)
								|| (buff.toLowerCase().indexOf("name=keyword") != -1)
								|| (buff.toLowerCase().indexOf("name='keyword'") != -1))) {
					keywords = parseKeywords(sin, buff);
					alreadyParseKeywords = true;
				}
				// HTML title要素の解析.
				if (!alreadyParseTitle && (buff.toLowerCase().indexOf("<title>") != -1)) {
					title = parseTitle(sin, buff);
					alreadyParseTitle = true;
				}
			}

			sout.close();
			sin.close();
			socket.close();

			System.out.println("HTTP Status         =" + httpStatus);
			System.out.println("HTML title          =" + new String(title.getBytes(), charset));
			System.out.println("HTML meta keywords  =" + new String(keywords.getBytes(), charset));
			System.out.println("HTML meta charset   =" + charset);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private String parseTitle(BufferedReader sin, String buff) {
		String title = "";
		StringBuilder titleBuff = new StringBuilder();

		try {
			boolean isParsingTitleNow = true;
			do {
				if (isParsingTitleNow) {
					titleBuff.append(buff);
				}
				if (buff.toLowerCase().indexOf("</title>") != -1) {
					isParsingTitleNow = false;
					break;
				}
			} while ((buff = sin.readLine()) != null);

			Pattern p = Pattern.compile("</?title>", Pattern.CASE_INSENSITIVE);
			Matcher m = p.matcher(titleBuff);
			title = m.replaceAll("").trim();
		} catch (IOException e) {
			title = "";
			e.printStackTrace();
		}
		return title;
	}

	private String parseKeywords(BufferedReader sin, String buff) {
		String keywords = "";
		StringBuilder keywordsBuff = new StringBuilder();

		try {
			boolean isParsingKeywordsNow = true;
			do {
				if (isParsingKeywordsNow) {
					keywordsBuff.append(buff);
				}
				if (isParsingKeywordsNow) {
					if (buff.toLowerCase().indexOf(">") != -1) {
						isParsingKeywordsNow = false;
						break;
					}
				}
			} while ((buff = sin.readLine()) != null);

			// \p{Punct}  は、句読文字を判定。
			// \\p{Punct} の、先頭\は、文字列内なのでエスケープしている。
			// \\p{Punct}?の、?は、数量が0以上現れるかどうか判断.
			// 上記により、 name=keyword, name="keyword" name='keyword'を解析できる.
			Pattern p = Pattern.compile(
                            "<meta.+name=\\p{Punct}?keyword\\p{Punct}?.+content=\\p{Punct}?",
                            Pattern.CASE_INSENSITIVE);
			Matcher m = p.matcher(keywordsBuff);
			keywords = m.replaceAll("");

			// "/> や '>など閉じ括弧を削除.
			p = Pattern.compile("\\p{Punct}?\\p{Space}*/>", Pattern.CASE_INSENSITIVE);
			keywords = p.matcher(keywords).replaceAll("").trim();

		} catch (IOException e) {
			keywords = "";
			e.printStackTrace();
		}
		return keywords;
	}
}
カテゴリー: Java タグ:

Eclipse 3.5 (Galileo)のJPA機能でOracle XE(Oracle10g)に接続した時のpersistence.xml

2009 年 8 月 29 日 oklab コメントはありません

Eclipse 3.5 でJPAプロジェクトを新規に作成して、OracleXE に接続した時のpersistence.xml です。データソースを取得して設定したい場合は、<non-jta-data-source>、<jta-data-source>で設定が可能です。JavaEE アプリケーションサーバを使わない場合やJPAを試してみる場合は、persistence.xml にデータベース接続先を記述してしまったほうが効率が良さそうです。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

    <persistence-unit name="OKLabJPASandbox" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>org.oklab.devlink.jpa.Operator</class>
        <properties>
            <property name="eclipselink.target-database" value="Oracle" />
            <property name="eclipselink.logging.level" value="INFO" />
            <property name="eclipselink.jdbc.driver" value="oracle.jdbc.OracleDriver" />
            <property name="eclipselink.jdbc.url" value="jdbc:oracle:thin:@192.168.11.2:1521:XE" />
            <property name="eclipselink.jdbc.password" value="xxPASSxx" />
            <property name="eclipselink.jdbc.user" value="xxUSERxx" />
        </properties>
    </persistence-unit>
</persistence>
カテゴリー: Java タグ: ,

Java 配備ツールキット(deployJava.js)の使い方

2009 年 2 月 22 日 oklab コメントはありません

今までJavaアプレットを動作させるには、objectタグやappletタグをHTMLに記述しいました。 ただしappletタグをそのまま使ってしまうと、Javaがインストールされていない環境では ブラウザが停止してしまうなどの問題がありました。最近では、appletの起動や、 JavaのバージョンチェックなどができるdeployJava.jsが公式にリリースされているので、 安全にJavaアプレットを動作させることができます。

<script src="http://java.com/js/deployJava.js"></script>
<script>
    var attributes = {codebase:'applet',
                      code:'org.oklab.upload.DnDClient.class',
                      archive:'dnd.jar',
                      width:400, height:200} ;
    var parameters = {fontSize:16, MAYSCRIPT:true} ;
    var version = '1.6' ;
    deployJava.runApplet(attributes, parameters, version);
</script>
カテゴリー: Java, JavaScript タグ:

Java5でJNDI経由のLDAP接続

2009 年 2 月 15 日 oklab コメントはありません

Javaは、1.3から標準でJNDI経由でのLDAP接続ライブラリが付属されているため、別途ライブラリをダウンロードする必要はありません。JDK1.2 の時は、サンマイクロシステムズのからJNDI1.1.jarなどを落としてくる必要があります。またOpenLDAPではなく、マイクロソフトの ActiveDirectoryでテストする場合は、バインドDNのContext.SECURITY_PRINCIPALという設定部分が、バインド DNだけでは駄目で、 “バインドDN” + “@” + “サーバURL”としなければなりません。

    テスト環境

  • CentOS 5.1
  • OpenLDAP 2.3.27
  • JDK 1.5(=Java 5.0)
package org.oklab.ldap;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
/**
 * CentOS 5のOpenLDAP2.3.xに、接続、切断をしてみる.
 * @author Satoshi Okita
 * @version 1.0
 */
public class LDAPConnectSample {

    public static void main(String [] args) throws NamingException {
        /*
         * 初期設定.
         * 接続先URLを指定したり、ユーザID(LDAP用語では、バインドDN)やパスワードを
         * 定義する.
         */
        System.out.println("接続情報をHashに詰める.");
        Hashtable env = new Hashtable();
        // JDNI接続で、LDAPを使いますよという指定.
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        // 接続先.
        // /etc/openlap/slapd.confに書いたsuffixの部分?
        //env.put(Context.PROVIDER_URL, "ldap://192.168.11.2:389/dc=oklab,dc=org");
        env.put(Context.PROVIDER_URL, "ldap://192.168.11.2:389/");
        // 認証方式.simpleだと平文のパスワード認証.
        env.put(Context.SECURITY_AUTHENTICATION, "simple"); 

        // バインドするDN つまりユーザID.
        // /etc/openlap/slapd.confに書いたrootdnで接続してみる.
        env.put(Context.SECURITY_PRINCIPAL, "cn=admin,dc=oklab,dc=org");
        // パスワード。
        // /etc/openlap/slapd.confに書いたrootpw
        env.put(Context.SECURITY_CREDENTIALS, "secret");
        /*
         * envに定義した情報で接続する. (LDAP用語ではバインドという)
         */
        System.out.println("接続.(LDAP用語ではバインドという)");
        DirContext dirCtx = new InitialDirContext(env);
        /*
         * 切断
         */
        System.out.println("切断.");
        dirCtx.close();
    }
}
カテゴリー: Java タグ:

Oracle10g Express EditionのHTTPポート番号変更

2008 年 7 月 19 日 oklab コメントはありません

Oracle9iとTomcat6をインストールした時もポート番号が干渉して再設定が必要でしたが、Oracle10g XE でも同じようです。そのためポート番号を変更するには以下の手順が必要になります。
設定が終わったら、ブラウザでhttp://127.0.0.1:18080/apex/に接続して、ブラウザベースの管理画面が出ることを確認すればよいと思います。Oracle XDBは、XMLのデータ管理に最適化されているようです。

systemユーザで接続。

C:\Documents and Settings\a>sqlplus system@xe
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
に接続されました。

dbms_xdb.gethttpport()で現在のポート番号確認.

SQL> select dbms_xdb.gethttpport(), dbms_xdb.getftpport() from dual;
DBMS_XDB.GETHTTPPORT() DBMS_XDB.GETFTPPORT()
---------------------- ---------------------
                  8080                     0

pl/sqlの書き方で、dbms_xdb.sethttpport関数を呼び出して設定.

SQL> begin dbms_xdb.sethttpport('18080'); end;
  2  /
PL/SQLプロシージャが正常に完了しました。

変更を確認

SQL> select dbms_xdb.gethttpport(), dbms_xdb.getftpport() from dual;
DBMS_XDB.GETHTTPPORT() DBMS_XDB.GETFTPPORT()
---------------------- ---------------------
                 18080                     0
カテゴリー: Java, データベース タグ: