フリーSolarisでここまでやれる! (追記) |
山森丈範 YAMAMORI Takenori ●yamamori |
SoftwareDesign 1999年2月号掲載版
では,日本語対応はできたものの
Netscape 上で Java
アプレットがうまく動作しませんでした.
その後,試行を重ねた結果,Java
アプレットを動作させる方法がわかりましたので,
ここに改訂版を公開します.
以前は,netscape がリンクする X11 関係のライブラリはすべて X11R6.4 のものと強引にリンクしていましたが,改訂版では libX11.so のみ X11R6.4 のものを使うようにしました.fakelocale.c の LD_PRELOAD は,以前と同様に必要です.(fakelocale.c のソース自体には変更はありません) これで,Java アプレットも OK となりました. |
日本語 locale の無い Free Solaris 7 上で,Netscape の日本語化に挑戦しましょう.
Free Solaris 日本語版の場合は、日本語版との違い
も合わせて御覧下さい。
日本語版の場合でも、Netscape リソースや、netscape
の起動スクリプトの書き方などは、英語版で用いたものと同様です。
lesstif が安定すればそちらに移行したいところですが,現状では Solaris 7 に付属の Motif をインストールします.SUNWmfrun にあります.(依存警告が出ますが無視します)
openwin のライブラリのうち,
libXmu.so.4 libXt.so.4 libXext.so.0 libSM.so.6 libICE.so.6
の5つのみが必要です.そこで,これらを CD-ROM からインストールします.
これらはパッケージの,SUNWxwplt と,SUNWxwice の中に入っています. pkgadd でこれらのパッケージごとインストールしてもいいのですが, 不要なファイルも多く,X11R6.4 と重複してややこしくなることから,筆者は pkgadd を使わず,unzip を使って直接ファイルを取り出しました.
具体的には,CD-ROM を /cdrom にマウントして,以下のようにします.
$ cd /cdrom/Solaris_2.7/Product/SUNWxwplt/archive $ unzip -d /tmp none # 奇妙ですが,none というアーカイブ名です $ cd /cdrom/Solaris_2.7/Product/SUNWxwice/archive $ unzip -d /tmp none
すると,/tmp/openwin 以下にファイルが展開されますので, /tmp/openwin/lib から,上記の5つのライブラリを, /usr/openwin/lib にコピーします.
さらに,fakelocale.c のリンクのため,/usr/openwin/lib で,
libXt.so -> libXt.so.4
というシンボリックリンクを作っておきます.
# cd /usr/X11R6.4/lib # ln -s libX11.so libX11.so.4
として,X11R6.4 の,libX11.so (libX11.so.6.1) のみ, openwin のバージョン番号,libX11.so.4 ででも参照できるようにします.
SoftwareDesign 掲載版にしたがって,X11R6.4 の libXmu.so.4, libXt.so.4, libXext.so.0 のシンボリックリンクも作ってしまった方は, これらは削除して下さい.手を加えるシンボリックリンクは,libX11.so.4 のみです.
この fakelocale.c を用いて,共有ライブラリを作成し,netscape の実行時に LD_PRELOAD で読み込ませます.setlocale() で XtSetLanguageProc() を呼んでいますが,これだけでは不十分で,XmTextField などがおかしくなります.原因は /usr/dt/lib/libXm.so.3 が libc 内の mbtowc() などのマルチバイトや wchar 関係の関数を直接呼んでいるためです.そこで,fakelocale.c では mbtowc() などのエミュレートも行なっています.これで XmTextField も OK になります.fakelocale.c のコンパイルは,
$ gcc -shared -fPIC -o fakelocale.so \ fakelocale.c -O2 -pipe \ -I/usr/X11R6.4/include \ -R/usr/openwin/lib \ -L/usr/openwin/lib \ -lXt |
とします.include と lib の PATH がちょっとトリッキーですが,これで OK です.
コンパイルできたら /usr/X11R6.4/lib にインストールします.
# install -c fakelocale.so /usr/X11R6.4/lib
*注意:Solaris 7 の /usr/sbin/install だとうまく行かないので,GNU install など,あるいは cp で代用して下さい.
リソースファイル Netscape を作り ます.Netscape 3.x 4.x 共通です.オリジナルの Netscape.ad とマージする必要はありません.
リソースファイルは,たとえば /usr/local/lib/netscape などのディレクトリの下に置き,このディレクトリを XAPPLRESDIR で指定するようにします.
ここまでの設定作業で,結果的に netscape が意図通りのライブラリとリンクされていることを,ldd コマンドで確認します.B-シェル文法で,LD_LIBRARY_PATH と,LD_PRELOAD を一時的に設定して ldd を実行します.Netscape 4.08 での例です.
$ LD_LIBRARY_PATH=/usr/X11R6.4/lib LD_PRELOAD=fakelocale.so ldd netscape fakelocale.so => /usr/X11R6.4/lib/fakelocale.so libXm.so.3 => /usr/dt/lib/libXm.so.3 libXt.so.4 => /usr/openwin/lib/libXt.so.4 libXmu.so.4 => /usr/openwin/lib/libXmu.so.4 libXext.so.0 => /usr/openwin/lib/libXext.so.0 libX11.so.4 => /usr/X11R6.4/lib/libX11.so.4 libsocket.so.1 => /usr/lib/libsocket.so.1 libnsl.so.1 => /usr/lib/libnsl.so.1 libdl.so.1 => /usr/lib/libdl.so.1 libresolv.so.2 => /usr/lib/libresolv.so.2 libm.so.1 => /usr/lib/libm.so.1 libc.so.1 => /usr/lib/libc.so.1 libSM.so.6 => /usr/openwin/lib/libSM.so.6 libICE.so.6 => /usr/openwin/lib/libICE.so.6 libmp.so.2 => /usr/lib/libmp.so.2
以上のようになっていれば OK です.libX11.so.4 は /usr/X11R6.4/lib とリンクしていることがわかります.
以上を確認の上,netscape408 のような起動スクリプトを書きます.LD_PRELOAD と LD_LIBRARY_PATH を両方指定するのがポイントです.これで日本語対応の Netscape が立ち上がります.(リストは Netscape 4.08 での例ですが,他のバージョンでも同様です)
FilterEvents に対応した kinput2 を使っていれば,kinput2 での日本語入力もできます.
Netscape 3.04, 4.08, 4.5 すべてについて,動作を
確認しました.(Netscape 4.5 については,Xlib
がダイナミックリンクされた Solaris2.4
用バイナリを使って下さい)
注:Netscape 4.51 では、Solaris 2.5.1
用バイナリで OK です。
SoftwareDesign 掲載版では,日本語対応はできたものの Java アプレットについては動作しませんでしたが,この改訂版により,Java アプレットも無事動作可能となりました.
その他,Web ページタイトル,セレクトメニュー,ブックマーク, TEXTAREA など,日本語表示,kinput2 での入力などにはもちろん対応できていますので,これで英語版 Free Solaris 上で,充分使いものになるようになったのではと思います.
このページの設定内容の他、以下の設定も再度確認して下さい。
ひとつ問題が確認されています.
fakelocale.so のために LD_PRELOAD をセットして Netscape を起動していますが,これが Netscape から起動される子プロセスに影響して,問題になることがあることがわかりました.
具体的には,ページをプリントアウトしようとして,Netscape
の
#!/bin/sh unset LD_PRELOAD exec /bin/lp "$@" |
これで,lp によるプリントアウトもうまくいきます.
なお,この問題を fakelocale.c 内で putenv("LD_PRELOAD="); を行なう方法も試してみましたが,Netscape の場合はこれでうまく行き,上記の wrapper も要らなくなりますが,putenv() の方法では JDK 方がうまく行かなくなりますので,やはり,falelocale.c は,変更無しとし,lp のように,必要なものについては wrapper を挿入する方法が最善と思われます.