JBossでDIGEST認証ができるようになったようです

はじめに。JBossでDIGEST認証?

JBossは、オープンソースJava EE Application Server*1です。市販のアプリケーションサーバ製品に引けを取らない性能と使い勝手の良さがあります。JBossApache TOMCATサーブレットエンジンとして搭載していますが、ログイン認証のモジュールはJBossのセキュリティフレームワーク(JBoss SX)に委譲するようにできています。*2JBoss 4.0.3まで、JBoss SXはDIGEST認証をサポートしていませんでした。個人的な意見としてコンテナマネジド認証では、DIGESTやBASICを使うよりもFORMを使うことが多いだろうと考えていたのですが、コンテナマネジド認証でDIGEST認証を使う機会に恵まれましたので、せっかくですのでJBoss 4.0.4で新しく実装されたDIGEST認証の機能を使ってみました。

JBossのインストール

JBossでDIGEST認証を使うには、ver. 4.0.4+が必要になります。現在入手できるJBossの最新版バイナリは、4.0.4 CR2ですので、これを入手してインストールします。*3

REALM名の決定

DIGEST認証ではREALM名が重要になります。どんな名前を選んでも良いですが、設定の中で何度か登場しますので、先に決定しておきましょう。ここでは、SampleRealmという名前にすることにします。

login-config.xmlファイルの記述

${JBOSS_HOME}/server/default/conf/login-config.xmlファイルの編集が必要になります。application-policyエレメントのname属性はjboss-web.xmlから参照されることになります。ここでは"SampleRealmDigestという名前に設定した例を示します。login-config.xmlファイルを編集して追加してください。*4

    


MD5
rfc2617
false
true
true
org.jboss.security.auth.spi.RFC2617Digest


JBossの起動

編集したlogin-config.xmlが有効になるように、JBossを再起動してください。

web.xmlへの変更

作成するウェブアプリケーションのweb.xmlを編集してDIGEST認証を適用します。




DIGEST
SampleRealm


AuthorizedUsers



restricted contents
/secure/*


AuthorizedUsers



この例では、AuthorizedUsersというroleに割り当てられたユーザだけが/secure/以下のコンテンツにアクセスできるようになります。認証はDIGEST認証が使われ、そのRealmはSampleRealmです。

jboss-web.xmlを記述する

web.xmlを配置するのと同じ場所、すなわちWEB-INF/にjboss-web.xmlというファイルを作成します。このファイルでどの認証モジュールのインスタンスを使うかを決定します。今回、SampleRealmDigestというインスタンス名を与えていますから、これを参照するように記述を行います。


java:/jaas/SampleRealmDigest

DIGEST認証のパスワードとロールを収めるファイルを用意する

DIGEST認証用のパスワードとロールを収めるファイル*5は、users.propertiesとroles.propertiesになります。拡張子からご想像いただけるように、これはJavaのpropertiesファイルの形式を取っています。users.propertiesには、ユーザ名=パスワードの形式。roles.propertiesには、ユーザ名=ロール名*6の形式です。これら二つのファイルは、各アプリケーションのために用意されるクラスローダによって読み込まれます。ですので、WEB-INF/classes以下においてしまっても良いですし、JBoss自体が参照するシステムクラスパスのどこかにいれてしまってもかまいません。しかしながら、開発段階では、やはりWEB-INF/classesディレクトリに配備するのがわかりやすくて良いと思います。

ところで、ここで重要な点が一つあります。users.propertiesに記載するパスワード値なのですが、A1ハッシュと呼ばれる値で格納しなければいけません。これは具体的には以下のようなデータになります。

MD5(ユーザ名:Realm名:平文パスワード)
つまり、users.propertiesファイルを準備するためには、事前にRealm名が決定している必要があり、かつハッシュ値を事前に計算しておく必要があるということになります。

A1ハッシュの計算

JBossは、このA1ハッシュの値を計算するルーチンを用意してくれていますので、これを使いましょう。
コマンドラインから以下のように入力することでA1ハッシュ値が出力されます。

$ java -cp ${JBOSS_HOME}/server/default/lib/jbosssx.jar org.jboss.security.auth.spi.RFC2617Digest ユーザ名 realm名 パスワード
実際にuser1のパスワードがpassword1であると仮定してSampleRealm用のハッシュを計算してみましょう。
$ java -cp ${JBOSS_HOME}/server/default/lib/jbosssx.jar org.jboss.security.auth.spi.RFC2617Digest user1 SampleRealm password1
RFC2617 A1 hash: e32f7d1d79180d0b1884d83a5e3f9097

これでA1ハッシュの値を得ることができましたので、これを元にusers.propertiesファイルを作成します。

user1=e32f7d1d79180d0b1884d83a5e3f9097
ユーザを定義しただけでは、ロールがアサインされませんから、roles.propertiesファイルも記述します。ここではA1ハッシュ値やRealm名を気にする必要はありません。
user1=AuthorizedUsers

ウェブアプリケーションの配備

これでDIGEST認証の設定が完了です。
今回、JBoss 4.0.4のドキュメントがまだ公式にリリースされていませんので、JBossのソース読みながらやってたので、少し手間取ってしまいました。

*1:J2EE Application Serverと呼んだほうがリズムが良いと思うのは私だけでしょうか・・・

*2:設定の詳細については、${JBOSS_HOME}/server/default/deploy/jbossweb-tomcat55.sar/server.xmlをご覧ください

*3:JBossのインストールと活用についての記事も書いていく予定ですが、今回はDIGEST認証を使うTIPSだけにフォーカスします。

*4:念のために申し上げますが、の前に記述してくださいね。

*5:正確にはorg.jboss.security.auth.spi.UsersRolesLoginModuleが参照するファイル

*6:複数ある場合にはカンマで区切って指定します

FedoraCore5(FC5)上のemacsでAnthyを使う

はじめに。やっぱりemacs!

私がUNIXにこだわる理由の一つはemacsであると言っても過言ではありません。Emacsがなければ私の生産性はきっと半分以下に落ちてしまうと思っています。

Thanks to GNU, Richard, 半田先生 and all emacs communities!!

ところでFreeのUNIXで日本語入力をする場合に問題として、漢字変換エンジンがあまり賢くない*1という不満がありました。私の場合は、OMRON SoftのWnn7を購入して利用していました。当時、emacs@linuxで「貴社の記者が汽車で帰社した」というセンテンスが一発で変換できたときの喜びはひとしおでした。ところでFC5には、Anthyという新しい漢字変換エンジンが搭載されています。この漢字変換エンジンはこれまでのFreeWnnやCannaに比べると効率の良い漢字変換を実現してくれると感じています。というわけで、今回のTIPSはAnthyemacsから使えるようにするというものです。

RPMのインストール

emacs, anthyに関連するパッケージは基本的にrpmで提供されていますから、導入は非常に簡単です。yumを使ってインストールを行うことをお勧めします。

# yum install emacs emacs-leim anthy-el
インストールはこれで完了です。

.emacsの設定

.emacsanthyを使うための設定を記述します。もちろん、/usr/share/emacs/site-list/site-start.d/に作成しても良いです。

;; anthy
(set-language-environment "Japanese")
(setq default-input-method "japanese-anthy")
これは個人的な好みなのですが、CTRL-SPACEで入力モードのトグルができるようにしています。以下の記述を.emacsに追加してください。
(global-set-key [?\C-\ ] 'toggle-input-method)

SCIM対策

FC5上のX Windowで単純にemacsを起動すると、SCIMemacsの必要とするキーバインディングのいくつかを奪ってしまいます。個人的な好みとして設定しているCTRL-SPACEによる入力モードのトグルや、標準でeval-print-last-sexpにバインドされているCTRL-jなどが使えないのです。そこで、emacsを使うときにはSCIMからの干渉を受けないように設定を行う必要があります。
これはemacs起動時にコマンドラインから環境変数を設定することで実現することができます。

$ XMODIFIERS=@im=NONE emacs
/etc/profile.d/emacs.shとして、以下のような内容のファイルを作成して使っています。
alias emacs=’XMODIFIERS=@im=NONE emacs'
こうしておくことで、シェルからemacsを起動したときにはいつでも、SCIMの干渉を受けないような設定でemacsが起動します。

UTF-8への対応

日本語環境としてインストールした場合、FC5のデフォルトロケールは、ja_JP.UTF-8になります。そこでemacsでもエンコーディングUTF-8のファイルを読めるようにしたいと思います。
FC5で提供されているemacsは最初からUTF-8に対応した形でコンパイルされていますので、.emacsへの設定を追加するだけで行うことができます。

(prefer-coding-system ‘utf-8)

なお、UTF-8で記述されたファイルを端末上で閲覧するときには、lessコマンドの変わりにlvコマンドを使うようにすると便利です。

*1:ごめんなさいっ

Oracle XEをFedoraCore5(FC5)にインストールする。

はじめに。Oracle XEとは?

Oracle XEは、Oracleの戦略的リリースだと私は考えています。
Oracle XEは、評価・開発目的だけなく、商用利用も可能な無料のOracle 10gのサブセットです。いくつかの制限はあるものの、MySQLPostgreSQLを想定するような開発案件については、Oracle XEの採用を考慮することが可能です。
Oracle XEを採用することで、将来のスケールアップやスケールアウトに対応できますし、何よりも使い慣れたOracle環境を使うことができるメリットが大きいです。

アプリケーション開発において、DBとの接続部分をプラッガブルにするということがよく行われます。たとえば廉価版にはMySQLを使い、高い拡張性を求められた場合にはOracleを使うという具合です。
このような構成を行うときには、DBについて良く理解している人の意見を尊重することが重要です。DB製品はそれぞれの長所を出し、より高速で高機能なクエリを実現するために、各DBには独自のSQL拡張があります。この拡張を使わないようにするとパフォーマンスや生産性が下がります。DBをプラッガブルにする際に陥りがちなのは、最大公約数的なSQL文だけを使うようになってしまい、DBの長所を十分に生かしきることができなくなるという問題です。ところが各DBの長所を十分に生かそうとなると、対応するDBの数だけアダプタの実装を増やさなければいけなくなってしまいます。これは生産性の低下をまねいてしまいます。

Oracle XEは、このような問題に対する救世主です。Oracle XEは無料ですから、廉価版の製品を作る際にはOracle XEを採用すればよいのです。そして、必要に応じてStandardからEnterpriseまでに対応させてあげることができます。プログラムコードは〜Enterprise Editionに特有の拡張を使うことを除けば〜全て共有できます。これはアプリケーション開発者にとっての福音ではないでしょうか。

FC5へのOracle XEのインストール

そんなOracle XEをFC5にインストールして使うことができます。インストールも非常に簡単ですので、今までOracleを使ったことのない方もこれを機会に挑戦してみてはいかがでしょうか。

  • 事前の準備
    • 既にFC5自体のインストールのTIPSを書いた記事とかぶりますが、SELinuxをdisableにしておいてください。また、swapが足りない場合にはswaponコマンドを使ってswapを一時的に増やしてあげる必要があります。
  • Oracle XEインストーラを入手します。
  • libaioのインストールします。
    • yumから行うのが最も簡単でしょう。
      # yum install libaio
  • Oracle XEのインストールを行います。
    • 通常のrpmパッケージと同様にインストールします。
      # rpm -ivh oracle-xe-univ-10.2.0.1-1.0.i386.rpm
  • 初期設定を行います。
    • /etc/init.d/oracle-xeにconfigureというパラメタを与えることで、初期設定ウィザードが走ります。
      # /etc/init.d/oracle-xe configure
    • 質問には基本的に全てデフォルトで答えればOKです。
    • 個人的な慣例として、ウェブサーバのポート番号を8888に変更しています。デフォルトは8080が指定されています。これは8080版でJBOSSを動かしているという個人的な理由のためです。
    • システム起動時にOracleを開始するかどうかの質問については、必ずYESと答えてください。*1

/etc/init.d/oracle-xeスクリプトに対する不満とプライベートパッチ

/etc/init.d/oracle-xeスクリプトは、デフォルトのままだと微妙に不便です。chkconfigで/etc/rc?.dからエントリを消去するのではなく、oracle-xe enable|disableというコマンドで、自動起動の設定ができるのは良いのですが、enable(すなわち自動起動がONになっている状態)のときでないと手動起動もできないという問題があります。
開発機でOracleを使う場合、システムの起動時のOracle自動起動は必要ではないと思います。実際にアプリケーションをテストする瞬間まで、Oracleインスタンスは起動してくれなくて良いというのがほとんどの場合でしょう。そのようなケースを考えると、自動起動をoffにしながら手動起動ができないデフォルトの/etc/init.d/oracle-xeスクリプトはあまりにも不便なのです。*2

作成した起動スクリプトの仕様は以下の通りです。

  • enable/disableの設定に関係なく、stopが期待通りに動作します。
  • enable/disableの設定に関係なく、restartが期待通りに動作します。
  • enable/disableの設定に関係なく、/etc/init.d/oracle-xe force-restartと入力することで手動起動ができます。

このプライベートパッチを使うと、以下のような運用ができます。

  • oracle-xe自体の自動起動はoffにしておきます。これは/etc/init.d/oracle-xe disableとすることで指定できます。
  • oracleを手動起動するときには、/etc/init.d/oracle-xe force-startを実行します。
  • oracleの再起動には、/etc/init.d/oracle-xe restartを実行します。
  • oracleの停止には、/etc/init.d/oracle-xe stopを実行します。

以下に、プライベートパッチをあてた/etc/init.d/oracle-xeスクリプトを掲載します。

#!/bin/bash 
#
#
# chkconfig: 2345 80 05
# description: This is a program that is responsible for taking care of
# configuring the Oracle Database 10g Express Edition and its associated
# services.
#
# processname: oracle-xe
# Red Hat or SuSE config: /etc/sysconfig/oracle-xe
# Debian or Ubuntu config: /etc/default/oracle-xe
#
# change log:
# svaggu 09/28/05 - Creation
# svaggu 11/08/05 - Source function Library change for SuSE
# svaggu 11/09/05 - Password validation is added
# jlbec 11/22/05 - Debianization
# svaggu 12/02/05 - Errors messages are updated
# svaggu 12/14/05 - Anonymous is removed from password message prompt and
# changing the password for anonymous user logic is also
# removed
# svaggu 12/12/05 - Password validation is modified
#

# Source fuction library
if [ -f /lib/lsb/init-functions ]
then
. /lib/lsb/init-functions
elif [ -f /etc/init.d/functions ]
then
. /etc/init.d/functions
fi

# Set path if path not set (if called from /etc/rc)
case $PATH in
"") PATH=/bin:/usr/bin:/sbin:/etc
export PATH ;;
esac

# Save LD_LIBRARY_PATH
SAVE_LLP=$LD_LIBRARY_PATH

RETVAL=0
ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
ORACLE_OWNER=oracle
ORACLE_SID=XE
LSNR=$ORACLE_HOME/bin/lsnrctl
SQLPLUS=$ORACLE_HOME/bin/sqlplus
SU=/bin/su
export ORACLE_HOME
export ORACLE_SID
export PATH=$ORACLE_HOME/bin:$PATH
LOG="$ORACLE_HOME_LISTNER/listener.log"

export LC_ALL=C

if [ $(id -u) != "0" ]
then
echo "You must be root to run the configure script. Login as root and then run the
configure script."
exit 1
fi

CONFIG_NAME=oracle-xe
CONFIGURATION="/etc/sysconfig/$CONFIG_NAME"
if [ -f /etc/redhat-release ]
then
. /etc/init.d/functions

init_status()
{
return 0
}
exit_status()
{
exit $?
}
success_status()
{
success
echo
}
failure_status()
{
failure $?
echo
}

elif [ -f /etc/SuSE-release ]
then
. /etc/rc.status

init_status()
{
rc_reset
}
success_status()
{
echo "OK"
return 0
}
failure_status()
{
echo "Failed"
return 1
}
exit_status()
{
exit $?
}

else
if [ -d /etc/default ]
then
CONFIGURATION="/etc/default/$CONFIG_NAME"
fi

init_status()
{
return 0
}

success_status()
{
echo "OK"
return 0
}

failure_status()
{
echo "Failed"
return 0
}

exit_status()
{
exit $?
}
fi

# Source configuration

[ -f "$CONFIGURATION" ] && . "$CONFIGURATION"

init_status

#
# if_fail()
#
# Evaluates return codes. If 0, prints "OK", if 1, prints "Failed"
# and exits. If 2, status is "already done" and nothing is printed.
# The rest of the functions in here all honor this convention.
#
if_fail()
{
RC="$1"
REASON="$2"
if [ "$RC" = "0" ]
then
return
elif [ "$RC" = "2" ]
then
return
fi
failure_status "${REASON}"
exit 1
}


#
# write_sysconfig()
#
# Writes the system configuration
#
write_sysconfig()
{
cat >"$CONFIGURATION" </tmp/local_listener$$ <> $ORACLE_HOME/config/scripts/init.ora
else
cat >/tmp/local_listener <> $ORACLE_HOME/config/scripts/init.ora
fi

if test -f /tmp/local_listener
then
rm -fr /tmp/local_listener
elif test -f /tmp/local_listener$$
then
rm -fr /tmp/local_listener$$
fi

sed -i "s/%port%/$LISTENER_PORT/g" $ORACLE_HOME/config/scripts/init.ora
sed -i "s/%hostname%/`hostname`/g" $ORACLE_HOME/config/scripts/init.ora
/bin/chown oracle:dba $ORACLE_HOME/config/scripts/init.ora

fi

sed -i "s/%httpport%/$HTTP_PORT/g" $ORACLE_HOME/config/scripts/DatabaseHomePage.sh
/bin/chown oracle:dba $ORACLE_HOME/config/scripts/DatabaseHomePage.sh

sed -i "s/%httpport%/$HTTP_PORT/g" $ORACLE_HOME/config/scripts/readonlinehelp.sh
/bin/chown oracle:dba $ORACLE_HOME/config/scripts/readonlinehelp.sh

homedir=`echo $HOME`
if [ "$homedir" = "/root" ]
then
homedir=`sh -c "echo ~$USER"`
fi

if [ -f $homedir/.gnome-desktop/oraclexe-gettingstarteddesktop.desktop ]
then
/bin/chown oracle:dba $homedir/.gnome-desktop/oraclexe-gettingstarteddesktop.desktop
/bin/chmod 664 $homedir/.gnome-desktop/oraclexe-gettingstarteddesktop.desktop
fi
if [ -f $homedir/Desktop/oraclexe-gettingstarteddesktop.desktop ]
then
/bin/chown oracle:dba $homedir/Desktop/oraclexe-gettingstarteddesktop.desktop
/bin/chmod 664 $homedir/Desktop/oraclexe-gettingstarteddesktop.desktop
fi

if [ -f $ORACLE_HOME/bin/tnslsnr ]
then
echo -n "Starting Oracle Net Listener..."
$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR start" > /dev/null 2>&1
echo "Done"
fi

echo -n "Configuring Database..."
$SU -s /bin/bash $ORACLE_OWNER -c "$ORACLE_HOME/config/scripts/XE.sh" > /dev/null 2>&1
err=`grep "ORA-44410" $ORACLE_HOME/config/log/*.log`
if test "$err" != ""
then
echo "Database Configuration failed. Look into $ORACLE_HOME/config/log for details"
exit 1
fi
echo alter user sys identified by \"$ORACLE_PASSWORD\"\; | $SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s / as sysdba" > /dev/null 2>&1
echo alter user system identified by \"$ORACLE_PASSWORD\"\; | $SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s / as sysdba" > /dev/null 2>&1
echo "Done"

/bin/chmod -R 640 /usr/lib/oracle/xe/oradata/XE
/bin/chmod 750 /usr/lib/oracle/xe/oradata/XE
rm -fr $ORACLE_HOME/config/seeddb

if [ -f /etc/oratab ]
then
echo "XE:$ORACLE_HOME:N" >> /etc/oratab
else
echo "XE:$ORACLE_HOME:N" >> /etc/oratab
/bin/chown oracle:dba /etc/oratab
/bin/chmod 644 /etc/oratab
fi

echo -n "Starting Oracle Database 10g Express Edition Instance..."
pmon=`ps -ef | egrep pmon_$ORACLE_SID'\>' | grep -v grep`

if [ "$pmon" = "" ];
then
$SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql" > /dev/null 2>&1
fi
echo "Done"

echo "Installation Completed Successfully."


return 0
}

#
#configure_ask()
#
# Ask configuration questions,setting the variables.
#

configure_ask()
{
cat <

                                                                                                • -

This will configure on-boot properties of Oracle Database 10g Express
Edition. The following questions will determine whether the database should
be starting upon system boot, the ports it will use, and the passwords that
will be used for database accounts. Press to accept the defaults.
Ctrl-C will abort.

EOF

#get the http port value
while :
do
while [ 1 ]
do
echo -n Specify the HTTP port that will be used for Oracle Application Express [8080]:
read LINE
if [ -z $LINE ]
then
LINE=8080
fi
port=`netstat -n --tcp --listen | grep :$LINE | awk '{print $4}' | cut -d':' -f2`
if [ "$port" = "$LINE" ]
then
echo Port $port appears to be in use by another application.\
Please specify a different port.
else
break;
fi
done

case "$LINE" in
"")
break
;;
*[^0-9]*)
echo "Invalid http port: $LINE"
;;
*)
HTTP_PORT=$LINE
break
;;
esac
done

#get the listener port value
while :
do
echo
while [ 1 ]
do
echo -n Specify a port that will be used for the database listener [1521]:
read LINE
if [ -z $LINE ]
then
LINE=1521
fi
echo
port=`netstat -n --tcp --listen | grep :$LINE | awk '{print $4}' | cut -d':' -f2`
if [ "$port" = "$LINE" ]
then
echo Port $port appears to be in use by another application.\
Please specify a different port.
else
break;
fi
done

case "$LINE" in
"")
break
;;
*[^0-9]*)
echo "Invalid port: $LINE" >&2
;;
*)
if [ "$HTTP_PORT" != "$LINE" ]
then
LISTENER_PORT=$LINE
break
else
echo Database listener cannot be configured on the same port as Oracle Application Express.
fi
;;
esac
done

#get the database password
while :
do
echo -n "Specify a password to be used for database accounts. Note that the same
password will be used for SYS and SYSTEM. Oracle recommends the use of
different passwords for each database account. This can be done after
initial configuration:"
while [ 1 ]
do
/bin/stty -echo > /dev/null 2>&1
temp=`echo $IFS`
export IFS="\n"
while [ 1 ]
do
read LINE
while [ -z "$LINE" ]
do
echo
echo -n "Password can't be null. Enter password:"
read LINE
done

result=`expr index "$LINE" [\'\"]`
if [ $result != 0 ];
then
echo
echo -n "The password you entered contains invalid characters. Enter password:"
else
break
fi
done
echo
echo -n "Confirm the password:"
read LINE1
echo
if [ "$LINE" != "$LINE1" ];
then
echo
echo -n "Passwords do not match. Enter the password:"
else
break
fi
done
/bin/stty echo > /dev/null 2>&1
ORACLE_PASSWORD=$LINE
export IFS=$temp
break;
done

while :
do
if [ "$ORACLE_DBENABLED" = "true" ]
then
CUR=y
else
CUR=n
fi
echo
echo -n "Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]:"
read LINE
if [ -z $LINE ]
then
ORACLE_DBENABLED=true
fi
echo
case "$LINE" in
"")
break
;;
y|Y)
ORACLE_DBENABLED=true
break
;;
n|N)
ORACLE_DBENABLED=false
break
;;
*)
echo "Invalid response: $LINE " >&2
break
esac
done
}

configure()
{
if test -f "$CONFIGURATION"
then
echo "Oracle Database 10g Express Edition is already configured"
exit 1
fi
configure_ask
configure_perform
CONFIGURE_RUN=true
write_sysconfig
echo To access the Database Home Page go to \"http://127.0.0.1:$HTTP_PORT/apex\"

}

start() {

if [ "$CONFIGURE_RUN" != "true" ]
then
echo "Oracle Database 10g Express Edition is not configured. You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
exit 0
fi
status=`ps -ef | grep tns | grep oracle`
if [ "$status" == "" ]
then
if [ -f $ORACLE_HOME/bin/tnslsnr ]
then
echo "Starting Oracle Net Listener."
$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR start" > /dev/null 2>&1
fi
fi
echo "Starting Oracle Database 10g Express Edition Instance."
$SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql" > /dev/null 2>&1
RETVAL=$?
if [ $RETVAL -eq 0 ]
then
echo
else
echo Failed to start Oracle Net Listener using $ORACLE_HOME/bin/tnslsnr\
and Oracle Express Database using $ORACLE_HOME/bin/sqlplus.
RETVAL=1
fi
return $RETVAL
}

stop() {
if [ "$CONFIGURE_RUN" != "true" ]
then
echo "Oracle Database 10g Express Edition is not configured. You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
exit 0
fi

# Stop Oracle 10g Express Edition Database and Listener
echo Shutting down Oracle Database 10g Express Edition Instance.
$SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/stopdb.sql" > /dev/null 2>&1
echo Stopping Oracle Net Listener.
$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR stop" > /dev/null 2>&1
RETVAL=$?
echo
if [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$LSNR
then
return $RETVAL
fi
}

dostatus() {
if test ! -f "$CONFIGURATION"
then
echo "Oracle Database 10g Express Edition is not configured. You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
exit 0
elif [ "$CONFIGURE_RUN" != "true" ]
then
echo "Oracle Database 10g Express Edition is not configured. You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
exit 0
fi

$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR status"
RETVAL=$?
}

# See how we were called
case "$1" in
start)
if test -f "$CONFIGURATION"
then
if test "$ORACLE_DBENABLED" != "true" -o "$FORCE" != "true"
then
exit 0
fi
else
echo "Oracle Database 10g Express Edition is not configured. You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
exit 0
fi
start
;;
force-start)
FORCE=true
start
RETVAL=$?
;;
configure)
configure
;;
stop)
if test ! -f "$CONFIGURATION"
then
echo "Oracle Database 10g Express Edition is not configured. You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
exit 0
fi
stop
;;
restart|reload|force-reload)
FORCE=true
stop
start
RETVAL=$?
;;
status)
dostatus
;;
enable)
if test -f "$CONFIGURATION"
then
ORACLE_DBENABLED=true
write_sysconfig
else
echo "Oracle Database 10g Express Edition is not configured. You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
exit 0
fi
;;

disable)
if test -f "$CONFIGURATION"
then
ORACLE_DBENABLED=false
write_sysconfig
else
echo "Oracle Database 10g Express Edition is not configured. You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
exit 0
fi
;;

*)
echo $"Usage: $0 {start|force-start|stop|restart|force-reload|configure|status|enable|disable}"
exit 1
esac

*1:この指定を行わないと、configure終了後にoracleインスタンスを停止させることができなくて、パニクルかもしれません。その場合には、/etc/init.d/oracle-xe enable; /etc/init.d/oracle-xe stop; /etc/init.d/oracle-xe disable;の順にコマンドを実行してあげてください。

*2:もちろん/etc/rc?.d/からoracle-xeスクリプトを削除してしまうというのは簡単な解決方法です

FC5にSunのJDKをインストール

はじめに〜どうしてGCJじゃないの?〜

FC5では、GCJ*1が標準でインストールされるようになっています。これはJavaバイトコードをネイティブのコードに変換して実行するという非常にパワフルな開発環境です
しかし、気になる点もあります。その最も大きな点は、Javaのバージョンが最新のものではないということです。GCJがサポートしているJavaのバージョンは1.4系のそれです。最新のJavaであるJavaSE 1.5ではイテレーションの記述が格段にやりやすくなっていることなど、魅力的な変更が多数加えられています。
また、gcjのネイティブコンパイラという言葉に強く魅力を感じることもありますが、SunのJDKにはHotSpotテクノロジによるJITコンパイラが搭載されています。実際に速度を測定してみると、必ずしもどちらが早いということもないようです。ネイティブコンパイラという言葉につられて、GCJにこだわる必要はないように考えています。

とまれ、ここではFC5にSunのJDKをインストールする方法について解説してみたいと思います。

SunのJDKの入手

SunのJDKは、SunMicrosystemsのサイトから無料でダウンロードすることができます。

http://java.sun.com/j2se/1.5.0/ja/download.html

好みはあると思いますが、私はEmacs+JDEEで開発するのを好みますので、JDK本体のみをダウンロードしました。
画面中段の「JDK 5.0 Update 6 JVM テクノロジを含む」から「JDKのダウンロード」を選択して、ダウンロードを行います。せっかくですのでRPMバージョンをダウンロードさせてもらうことにします*2

JDKのインストール

RPM版のJDKのインストールは通常のRPMのインストールと全く同じです。

# rpm -ivh jdk-1_5_0_06-linux-i586.rpm
インストールだけなら、これで完了です。

パスの設定

インストールだけならこれで完了ですが、少なくともPATHの設定をしてあげる必要があります。JDKは/usr/java/jdk1.5.0_06というディレクトリにインストールされますので、ここにパスを通してあげましょう。
パスの設定ですが、FC5では/etc/profile.dという便利な仕組みが用意されていますので、これを使うことにしましょう。
/etc/profile.dに*.shというファイルを置いておくと、ログイン時*3、自動的に実行してくれるというものです。ここでは、以下のようなファイルを/etc/profile.d/java.shという名前で用意しました。

JDK_HOME=/usr/java/jdk1.5.0_06
PATH=$JDK_HOME/bin:$PATH
export JDK_HOME PATH

それでは、一度ログアウトしてからログインしなおしてみてください。javaコマンドやjavacコマンドが実行できるようになっていれば成功です。

[hiro@fc5 ~]$ java -version
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode, sharing)
[hiro@fc5 ~]$ javac -version
javac 1.5.0_06
javac: ソースファイルがありません。
使い方: javac
使用可能なオプションには次のものがあります。
-g すべてのデバッグ情報を生成する
-g:none デバッグ情報を生成しない
-g:{lines,vars,source} いくつかのデバッグ情報だけを生成する
-nowarn 警告を発生させない
-verbose コンパイラの動作についてメッセージを出力する
-deprecation 推奨されない API が使用されているソースの位置を出力する
-classpath ユーザクラスファイルを検索する位置を指定する
-cp ユーザクラスファイルを検索する位置を指定する
-sourcepath 入力ソースファイルを検索する位置を指定する
-bootclasspath ブートストラップクラスファイルの位置を置き換える
-extdirs インストール済み拡張機能の位置を置き換える
-endorseddirs 推奨規格パスの位置を置き換える
-d 生成されたクラスファイルを格納する位置を指定する
-encoding ソースファイルが使用する文字エンコーディングを指定する
-source 指定されたリリースとソースの互換性を保つ
-target 特定の VM バージョン用のクラスファイルを生成する
-version バージョン情報
-help 標準オプションの概要を出力する
-X 非標準オプションの概要を出力する
-J を実行システムに直接渡す

フォントの設定

ここまででjavacの起動までできるようになりましたが、もう一点気になる問題があります。FC5でJavaGUIアプリケーション*4を実行すると、日本語がうまく表示されません。具体的には全て「□」で表示されてしまうのです。これは、デフォルトではJavaVMがkochiフォントを読みに行くように設定されているからなのですが、FC5にはkochiフォントがインストールされません。ここではkochiフォントのかわりにsazanamiフォントを利用するように設定を記述する方法を解説します。

作業自体は非常に簡単です。sedを使ってkochiフォントの設定をsazanamiフォントに変更します。

# cd /usr/java/jdk1.5.0_06/jre/lib/
# sed -e 's/kochi/sazanami/g' fontconfig.RedHat.properties.src |\

SwingSet2などを実行してみて漢字が適切に表示されることを確認してみてください。

cd /usr/java/jdk1.5.0_06/demo/jfc/SwingSet2
java -jar SwingSet2.jar
このTIPSの裏には、JavaVMが正式にFedora Coreをサポートしていないという事情があります。JavaVMはFC5をRedHat Linuxであると理解してRedHat Linux用のフォント設定を読み込もうとします。そこで、RedHat Linux用のフォント設定ファイルを適切に構成することで回避するわけです。*5

*1:GCCに含まれるJavaコンパイラ

*2:self-extractingファイル形式をダウンロードすると、自分の好きなディレクトリにJDKをインストールできるというのがメリットですが、rpm版を使うと/usr/java以下をインストール先のディレクトリとして使うように設定されます。これはSunが提示している標準的なJavaのインストール場所であると理解することができますから、こちらのインストール場所を使うことで他のドキュメントやアーカイブとの整合性を取れるのではないかと期待することができます

*3:/etc/profile実行時

*4:コンソールアプリケーションではなく、SwingやAWTを使ったアプリケーションという意味です

*5:Sunのglobalizationチームには、既にこのtipsについてお知らせしてありまして、次のupdateではFedoraCoreをOSバージョンとして適切に認識してくれるようにしてくれるといいんじゃない?というリクエストも送ってあります。

FC5インストール後の設定あれこれ

yumの設定

yumはFCの自動アップデートエンジンです。しかし、デフォルトの設定のままでは、本家のサーバを参照してしまいます。そのため日本からアクセスすると、どうしてもストレスを感じてしまうことがあります。そこで、日本のミラーサーバが参照されるように設定を変更すると幸せになれます・・・よね?

ここでは、yumの設定管理を/etc/yum.repos.dというディレクトリの中にあるファイルを操作することで行おうと思います。
最初に/etc/yum.repos.dの下に三つの新規ファイルを作成します。

次にfedora-core.repo, fedora-extras.repo, fedora-updates.repoという三つの既存ファイルを以下の内容で置き換えます。

ここまでの設定をしたあとで、

# yum update
などのコマンドを実行すると、日本のミラーサーバを対象にしてyumが動作するようになります。

VMWare-Toolsを使う

まず最初にVMWareのメニューからVMWare Toolsのインストールを実行してください。
rpmパッケージをインストールするのが楽でよいです。

ところで、FC5ではFC4から比べて次の二点の問題があるので、普通にVMWareToolsをインストールしただけでは、望むだけの機能は使えません。

  • asm/page.hの構造体変更
  • X11R7の採用

そこで、これを解決するためのpatchを作りました。


589a590,593
> # The location of the modules dir has changed in X.org 7
> my $cXModulesDir7 = '/usr/lib/xorg/modules';
> my $cX64ModulesDir7 = '/usr/lib64/xorg/modules';
>
1968a1973
> . shell_string('-I' . $answer . '/asm-i386/mach-default')
3875a3881,3884
> sub xserver7 {
> return '/usr/bin/X';
> }
>
4030a4040,4041
> } elsif ($x_version == 7) {
> $x_server_file = xserver7();
4076a4088,4167
> sub xorg_7 {
> my $xconfig_path = '/etc/X11';
> my $xconfig_file_name = 'xorg.conf';
> my $xversion = 7;
> my $xversionAll = '';
> my $xserver_link = '';
> my $major;
> my $minor;
> my $sub;
>
> $xversionAll = direct_command(shell_string(xserver7()) . ' -version 2>&1') =~
> /X Protocol Version 11.* Release (\d+\.\d+)/ ? $1 : '0.0.0';
>
> if (defined $ENV{'XORGCONFIG'} && file_name_exist('/etc/X11/' .
> $ENV{'XORGCONFIG'})) {
> $xconfig_path = '/etc/X11';
> $xconfig_file_name = $ENV{'XORGCONFIG'};
> } elsif (defined $ENV{'XORGCONFIG'} &&
> file_name_exist('/usr/X11R6/etc/X11/' . $ENV{'XORGCONFIG'})) {
> $xconfig_path = '/usr/X11R6/etc/X11';
> $xconfig_file_name = $ENV{'XORGCONFIG'};
> } elsif (file_name_exist('/etc/X11/xorg.conf-4')) {
> $xconfig_path = '/etc/X11';
> $xconfig_file_name = 'xorg.conf-4';
> } elsif (file_name_exist('/etc/X11/xorg.conf')) {
> $xconfig_path = '/etc/X11';
> $xconfig_file_name = 'xorg.conf';
> } elsif (file_name_exist('/etc/xorg.conf')) {
> $xconfig_path = '/etc';
> $xconfig_file_name = 'xorg.conf';
> } elsif (file_name_exist('/usr/X11R6/etc/X11/xorg.conf-4')) {
> $xconfig_path = '/usr/X11R6/etc/X11';
> $xconfig_file_name = 'xorg.conf-4';
> } elsif (file_name_exist('/usr/X11R6/etc/X11/xorg.conf')) {
> $xconfig_path = '/usr/X11R6/etc/X11';
> $xconfig_file_name = 'xorg.conf';
> } elsif (file_name_exist('/usr/X11R6/lib/X11/xorg.conf-4')) {
> $xconfig_path = '/usr/X11R6/lib/X11';
> $xconfig_file_name = 'xorg.conf-4';
> } elsif (file_name_exist('/usr/X11R6/lib/X11/xorg.conf')) {
> $xconfig_path = '/usr/X11R6/lib/X11';
> $xconfig_file_name = 'xorg.conf';
> }
>
> print wrap("\n\n" . 'Detected X.org version ' . $xversionAll . '.'
> . "\n\n", 0);
>
> ($major, $minor, $sub) = split_X_version($xversionAll);
>
> # If there is an existing driver, replace it by ours.
> if ($major == 7) {
>
> backup_file_to_restore($gXVideoDriverFile, 'OLD_X4_DRV');
> if (file_name_exist($gXVideoDriverFile)) {
> unlink $gXVideoDriverFile;
> }
>
> # Install the drivers.
> my %p;
> undef %p;
> if ($minor == 0) {
> # This is the best driver we can install for X.org 7.0.0
> install_file(db_get_answer('LIBDIR') . '/configurator/XOrg/6.8.x' .
> ($gIs64BitX ? '_64' : '') . '/vmware_drv.o',
> $gXVideoDriverFile, \%p, 1);
> install_file(db_get_answer('LIBDIR') . '/configurator/XOrg/6.8.x' .
> ($gIs64BitX ? '_64' : '') . '/vmmouse_drv.o',
> $gXMouseDriverFile, \%p, 1);
> } else {
> print wrap("\n\n" . 'No mouse driver for X.org version: ' . $xversionAll . '.'
> . "\n\n", 0);
> }
> fix_X_link('7');
> } else {
> error ('Problem extracting verion of X.org' . "\n\n");
> }
> return ($xversion, xconfig_file_abs_path($xconfig_path, $xconfig_file_name),
> $xversionAll);
> }
>
4936c5027,5043< if (file_name_exist(xserver6())) {

    • -

> if (file_name_exist(xserver7())) {
> if (is64BitElf(xserver7())) {
> $gIs64BitX = 1;
> # 64-bit FreeBSD puts it's 64-bit X modules in lib not lib64
> if (vmware_product() ne 'tools-for-freebsd') {
> $gXMouseDriverFile = "$cX64ModulesDir7/input/vmmouse_drv.o";
> $gXVideoDriverFile = "$cX64ModulesDir7/drivers/vmware_drv.o";
> } else {
> $gXMouseDriverFile = "$cXModulesDir7/input/vmmouse_drv.o";
> $gXVideoDriverFile = "$cXModulesDir7/drivers/vmware_drv.o";
> }
> } else {
> $gXMouseDriverFile = "$cXModulesDir7/input/vmmouse_drv.o";
> $gXVideoDriverFile = "$cXModulesDir7/drivers/vmware_drv.o";
> }
> ($xversion, $xconfig_file, $xversionAll) = xorg_7();
> } elsif (file_name_exist(xserver6())) {

これを、vmware-config-tools.patchなどの名前で保存して、/usr/bin/vmware-config-tools.plにあててください。

# cd /usr/bin
# patch vmware-config-tools.pl < vmware-config-tools.patch

あとは、いつも通りvmware-config-tools.plを実行してあげれば望む動作が得られるようになります。

以下は個人的なTIPSですが、参考になれば・・・。

  • せっかくX11R7でVMWareSVGAドライバをサポートしてくれているので、これをそのまま使います。
    1. vmware-config-tools.plを実行する前に、オリジナルの/etc/X11/xorg.confを保存しておきます。(もちろん自動的にバックアップしてくれますが、念のため)
    2. vmware-config-tools.plを実行します。
    3. 保存しておいたxorg.confを元に戻します。
    4. xorg.confのmouseセクションに、driver "mouse"となっている箇所があります。これを driver "vmmouse"に変更します。
  • 不要なサービスを停止します。これはデスクトップ→管理→サービスとメニューを選択することで、GUIから行うことができます。以下は、私が停止しているサービスのリストです。iptablesを停止していますが、これはNAT ONLYでの利用を行っているからで、ホストOSからは不正なアクセスは行われないだろうという仮定のもとで行っています。

FedoraCore5(FC5)をVMWareに導入する

はじめに

半分お仕事、半分趣味で、VMWareの上でLinuxを動かしています。UNIXがいつも手元においておけるというのはすごくメリットがあると思うのです。私がWindowsになれていないだけ・・・というのもありますが、どうしてもやりたいことがすぐできるのがUNIXというプラットフォームです。既にFC5の導入は完了していて、快適に動作していますが、その過程でいくつかのTIPSを見つけました。せっかくですので、これを公開して共有したいと思います。

VMWareを稼動するのは、Lenovo/IBMThinkPad T43です。Pentium M 770(clock 2.13GHz)のCPUに、メモリを2Gバイト搭載しています。光学ドライブが入っているウルトラスリムベイにはセカンドHDD増設アダプタを導入していて、7200rpm/100Gのハードディスクドライブを接続しています。結果、本体にハードディスクドライブが2基内蔵されている状態*1になっています。セカンダリのハードディスクドライブは、バーチャルマシンのデータを置く専用の場所として使っています。こうすると、体感できるレベルでバーチャルマシンのパフォーマンスを向上させることができます。

今回のFC5の導入には、次のような目的があります。

  • Sunの最新のJDKを稼動させる
  • 最新の安定版JBOSSを稼動させる
  • Oracle XEを稼動させる
  • Emacsでプログラミングできる環境を整える

この条件を満たすようにFC5を導入するというのが今回の趣旨となります。*2


まずはバーチャルマシンの設定

  • Virtual Machineのタイプとしては、RedHatLinux 4を選択
  • HDのサイズは8Gで、preallocatedにしています。この設定はコマンドラインツールを使えばあとからでも変更できます。スナップショットを沢山取るような場合にはpreallocateしない設定、自分のワークステーションとして使う場合にはpreallocateする設定という風に使い分けています。
  • Networkの設定はvmnet8(NAT)ですが、DHCPは使わないようにしています。以前のVMWareではDNSのデリゲーションなどがうまく動いていなかったように記憶していますが、最新のVMWareでは問題なく稼動しています。

ディスクのパーティショニング

このあたりは個人の趣味が出るところだとは思いますが、私の設定は以下です。

  • /boot 100M
  • swap 1024M
  • / 残り全部。
    • /home*3は実は別の仮想ディスクにとってあります。こうすることで、将来FC6が出たときにも、そのままFC5で使ってきたホームディレクトリをそのまま移すことができます。このあたりについては割愛をします。

インストールパッケージの選択

インストールパッケージの選択では、ソフトウェア開発を選択します。また、カスタマイズについては今すぐカスタマイズするという選択をしておきます。基本的にはデフォルトのままでよいのですが、いくつか留意する点があります。

  • Desktop
    • 必要に応じてKDEを追加しておきます。
  • アプリケーション
    • 技術系と科学系・著作と発行もインストールしておきます。
    • emacsは、ここでインストールしても不完全な状態になってしまうので、後からインストールします。
  • 開発
    • Javaを含めてはいけません。これは、GCCに含まれるGCJを使ったJavaになります。GCJでも良いのですが、JDKのバージョンが最新にならない*4ので、あとからSUNのJDKをインストールすることを考え、ここはインストールをしないという選択をします。
    • レガシー開発を含めてください。
  • ベース
    • 繰り返しですがJavaをはずしてください。
    • システムツールを追加します。
    • ダイアルアップネットワークのサポートをはずします。・・・必要ないですよね?
    • 管理ツールを追加します。

ファイアウォールSELinux

  • Firewallの設定はデフォルトのまま
    • 後からhost OSとの間の通信を全てACCEPTするようにすれば、必要なことはたいていできるようになると思います。
  • SELinuxはdisableにします。
    • SELinuxについては、私が詳しくないというのが問題なのですが、Oracle XEの導入で問題がでました。おそらく、スクリプトからのsuコマンドの実行が制限されているようなのですが、これがオラクルには必要な作業となります。どうせVMWareですし、インターネットに公開するようなことはないです・・・よね?

Xの設定

  • VGAカードの設定
    • FC5では、X11R7がインストールされるのですが、既にVMWare用のXサーバの設定があります。これは自動的に選択されることになるので、解像度の設定だけを行うことになります。
  • 画面の設定
    • TP43は1400x1050なので、Generic LCD Displayを選択してこの値を選択しておきます。
  • 解像度の設定
    • 個人的なお気に入りは1280x800です。Xを使うにしても十分な画面の広さがあり、またTp43の画面にちょうど収まる感じになります。

ここまでのTIPSで、とりあえずインストールを完了することはできると思います。VMWareToolsのインストールや、yumの設定など、いくつかやることは残っていますが、長くなってしまったので続きは次回ということにさせていただきます。

*1:T43では、プライマリのハードディスクドライブはSATA, セカンダリのハードディスクドライブは従来のATAになっています。ご注意ください。

*2:順次、SunのJDKインストールのTIPSなども公開していくつもりです

*3:正確には/exportにしています

*4:1.4系になります