メイン

UNIX アーカイブ

2005年11月06日

FreeBSDでISO9660イメージファイルをmountするには

筆者は最近Linuxしか触っていない。
FreeBSDであるこのサーバーでCD-ROMのイメージファイルをmountしようとして、
 mount -t iso9660 -o loop /tmp/cdimage.iso /mnt
としたら、mountにloopというオプションが無いことが判明した。(Linuxでは上記コマンドでmountできるはず)
それでFreeBSDでループバックデバイスをmountする方法を調べたら、vnodeに行き着いた。
FreeBSDで上記と同じことをするには、
 vnconfig vn0c /tmp/cdimage.iso
 mount -t cd9660 /dev/vn0 /mnt
とすれば良い。(カーネルがpseudo-device vn有効の設定でコンパイルされていて/dev/vn*が存在する必要がある)

続きを読む "FreeBSDでISO9660イメージファイルをmountするには" »

2006年01月23日

Linuxがshutdownしない

ごく稀に、Linuxでshutdown -h nowコマンドを実行してもshutdownしないことがある。
前に色々やったらshutdownしてくれたことがあったが、今日は何をしても全く効かない。
Ctrl+Alt+Delキー、haltコマンド、rebootコマンド、"init 6"コマンドも効かない。
/dev/initctlの中身をinitプロセスが読んでないことを突き止めたが、telinit Qやtelinit Uや"kill -USR1 1"を実行しても、駄目だった。
何だこれは~

2006年01月24日

(Linux)SRPMパッケージの扱い方

RedHat系のLinuxを構築した人なら誰でも、RPMパッケージをインストールしたことはあり、インストールする方法は知っていると思う。
しかし、SRPMパッケージを扱える人は、意外に少ないのではないだろうか。

・SRPM aaa.src.rpmから全自動でRPMを作る方法
rpm --rebuild aaa.src.rpm
(オプションが無いというエラーが出る場合は、rpmbuild --rebuild aaa.src.rpm)
→ソース展開、コンパイルがなされ、RedHatの場合は/usr/src/redhat/RPMS/にRPMができる。

・SRPMをインストールする(ソース、specファイルを展開する)方法
rpm -ivh aaa.src.rpm
→RedHatの場合は、/usr/src/redhat/SOURCES以下にソースが、/usr/src/redhat/SPECS以下にspecファイルが展開される。

・インストールしたSRPMをコンパイルする方法
1. 必要があれば、/usr/src/redhat/SOURCES以下のソースを編集する
2. cd /usr/src/redhat/SPECS
3. 必要があれば、specファイル(aaa.spec)を適宜編集する
4. rpmbuild -ba aaa.spec
→RedHatの場合は、/usr/src/redhat/RPMS/にRPMができる。

・できたRPMをインストールする方法(普通のRPMのインストールと同じ)
rpm -ivh /usr/src/redhat/RPMS/aaa.rpm (名前はaaa.rpmとは限らない)


私も、半年前まではSRPMの使い方を知らなくて、インストールしたいソフトがRPMでなくSRPMでしか提供されてない場合は、諦めてtar.gz形式のソースを拾ってきて自力でコンパイルしていた。
しかし、半年前のある時、どうしてもSRPMをインストールしないといけないことが発生して、Webで検索したら、とても簡単であることが判明した。こんな簡単なことも調べずに、それまでにたくさんのSRPMを目にして、使い方がわからないからスルーしたことを、とても後悔した。

(参考)SRPMからプログラムをインストールするには

2006年01月30日

(Linux)VMWare+RedHat9.0でvmware.logが溢れる

VMWare 3.xでRedHat9.0を使うと、何らかの条件が揃った時に、VMWareが大量のログを吐いてしまうらしい。

私のPCでもカーネル再構築に伴ってそれが発生し、以下のようなログが、1分間に1000行のペースで吐かれるようになった。
------------------------------------------------
Jan 30 16:28:00: VMX|F(120):745 himem 0023:420d09fc
Jan 30 16:28:00: VMX|F(122):1189 eip=ffffe002
Jan 30 16:28:00: VMX|F(122):1189 eip=ffffe002
Jan 30 16:28:00: VMX|F(122):1189 eip=ffffe002
Jan 30 16:28:00: VMX|F(122):1189 eip=ffffe002
Jan 30 16:28:00: VMX|F(120):745 himem 0023:420d17c5
Jan 30 16:28:00: VMX|F(122):1189 eip=ffffe002
Jan 30 16:28:00: VMX|F(120):745 himem 0023:420ac7d9
Jan 30 16:28:00: VMX|F(120):745 himem 0023:420ac819
Jan 30 16:28:00: VMX|F(120):745 himem 0023:420d1733
------------------------------------------------
その結果、半日するとログが800Mを超えてしまった。(HDD溢れでログが止まっていた)

下記の参考ページ2によると、RedHat9.0の2.4.20カーネルに追加されている、2.5.xの機能を取り込む実験的なパッチ(native threading関係?)が悪さをしているらしい。

対処方法は、以下のどれかだそうだ。
(1) RedHat 9.0を使わない(実質これが推奨らしい)
(2) VMWareのログを無効にする
 方法:ゲストOSの構成ファイルに logging = "FALSE" という行を追加する
(3) nosysinfoオプションを付けてカーネルを起動する
 方法:grubを使ってる場合は、grub.confのkernel行の最後にnosysinfoを書き加える
 例:kernel /boot/vmlinuz-2.4.20-8.2.skas ro root=LABEL=/ nosysinfo

(3)を試した所、とりあえず大量のログは出なくなり、パフォーマンスが改善した。
VMWareがサポートしない何かをしてる可能性があるというのが気にはなるが…

参考Webページ)
1. http://software.groupbrowser.com/vmwarelog_file_gets_enormous-t60825.html
2. http://software.groupbrowser.com/Re_Log_file-t60890.html
3. http://www.vmware.com/community/thread.jspa?threadID=2045&tstart=165

2006年12月26日

(FreeBSD)10分おきのsambaのエラー

FreeBSDサーバーを新規に構築して、大昔の記憶を頼りにsambaをセットアップしたら、一発で使えるようになったのだが、10分おきに下のようなメッセージが出るようになった。
----------------------------------------------------------------------
Dec 25 13:23:18 **-freebsd inetd[527]: netbios-ns/udp: bind: Address already in use
----------------------------------------------------------------------

そのサーバーにはDHCPのIPアドレスと固定IPアドレスを同時に割り当てたり、LAN内の固定アドレスを入れ替えたりしているので、てっきりその辺りの設定のミスか過去の情報が残ってるのかと思って、LAN内のIPアドレスとarpキャッシュされてるMACアドレスを全て見直して、数日様子を見たが、改善しなかった。

それでネットで調べてみたら、既にsmbdが動いてる(-D オプション付きで通常のdaemonとして動かしてる)のにinetdでさらに起動しようとしてるからだということが判明した。
すなわち、/usr/local/etc/rc.d/samba.shが置かれた状態で/etc/rc.confに`samba_enable="YES"'を追加したのに、/etc/inetd.confのnetbios-*の行を有効にしていたのだ。

凡ミスだったが、これって普通は上のメッセージから類推できるものなんだろうか?
"Port already in use"だったら一発でわかったのだが。

続きを読む "(FreeBSD)10分おきのsambaのエラー" »

2007年01月13日

Mebius MN-340へのFreeBSD再インストール記(1)

このサーバーはMebius MN-340(CPU: Pentium 150MHz) + FreeBSD 4.10で構成されていた。たまにCPUのパワー不足を感じる以外は問題なく動いていたが、長年色々なアプリをインストールしては消したりしていたためか、HDDにゴミが溜まり、不自然に空き容量が無くなってしまった。
しかも、おそらくセクタ不良によるHDDの"hardware error"がこれまでに何回か発生して、使用不能な領域が増えている。
そのため、HDDをフォーマットしてFreeBSDを再インストールすることにした。

●最新バージョンを試す
せっかくなので、最新バージョンである6.1をインストールしようと思った。CD-Rが勿体無いので、インストーラーをFD起動してネットワークインストールしようと思って、6.1-RELEASE/floppies/の
boot.flp
kern1.flp
kern2.flp
をダウンロードしてFDにコピーしてPCをFD起動したら、右側にポップな"FreeBSD"のアスキーアートが出るブートメニューでデフォルトのものを選択し、カーネルが起動開始した直後に"page fault"が出て固まってしまった。
FDが悪いのかと思って、6.1-RELEASE-i386-bootonly.iso をCD-Rに焼いてCD起動したが、結果は同じだった。PCIドライバ起動中に出てる感じだ。

以前にもこのPCのFreeBSDを5.xにバージョンアップしようとして、同じことが起こって断念した経緯がある。6.xになって解決してるかもと期待したが、残念だった。
仕方なく、4.xの最終バージョンである4.11をインストールすることにした。

●FreeBSD 4.11インストール
4.11のインストールCDのISOイメージをFreeBSDのミラーサイトからダウンロードしようとしたら、古過ぎるためか、ミラーサイトの無いftp-archiveサーバーに移されていた(なぜか2.2.9だけはftpサーバーに残されていた。2.2.9は現役なのだろうか?)。そのftp-archiveサーバーからのダウンロードが非常に遅いため、通常の2枚分のCD-ROMイメージの取得を諦めて、233Mの4.11-RELEASE-i386-miniinst.isoを2時間かけてダウンロードし、8分でCD-Rに焼いた。

そのCD-ROMにはX11が入っていなかったので、この際、X Window無しのWebサーバーとして構築することにした。
CD-ROMを起動して、Kern-Developerのセットを選択して、特に工夫せずインストールしてFreeBSDを起動したら、PCMCIAのネットワークカードが認識されなかった。dmesgで起動ログを見ると、pcic0(PCMCIAドライバ)は正常に起動していたのに、カードを抜き差ししても反応しなかった。認識失敗の下り調子のBEEP音も出ない。原因がわからなくて、再度インストーラーを起動してKernel configurationにてシリアルポート(IRQ=3-4)とパラレルポート(IRQ=7)のドライバを無効にして、ネットワークインストールする振りしてIRQ=3,7指定でPCMCIAのNICを認識させてみたら、あっさり認識されたので、そのままFreeBSD全体を再インストールした。そうすると、シリアルポート(IRQ=3)を有効にして起動しても、PCMCIAのNICが正常に認識された。

おそらく、rc.confのpccard_*の行がおかしかったのだろう。最終的には

pccard_enable="YES"
pccard_mem="DEFAULT"
pccard_flags="-i 3"

の設定で正常に動いている。

●カーネル再構築
なにぶん低スペックのマシンなので、まずカーネルをスリムにすることにした。

cd /usr/src/sys/i386/conf/
cp GENERIC MINE

として、MINEを編集した。結果はこちら。SCSI関連、PCI NICドライバ、USB関連を全て無効にした。Webサーバーとしての動作を考えると、もっとスリムにできるだろうだが、追求するのは後日にすることにした。
MN-340に浮動少数点演算のコプロもあるようなので、MATH_EMULATIONも無効にしてみた。これを消すのは初挑戦だ。

MINE編集後、

config MINE
cd ../../compile/MINE
make depend
make
make install

として再構築(約2時間)したカーネルをインストールして再起動すると、起動しなかった。この時、MINEのcpuの行を誤って"I386_CPU"としていたため、"Unknown processor type"というエラーが出たのだ。

そこで、/usr/share/doc/の教え通り、カーネル起動前の10カウント中に停止し、

unload
boot kernel.old

としてカーネルを起動し(10カウントより前にkernel.oldと打っても起動するが、正しく起動しないようだ)、
cd /
mv kernel.old kernel.good
mv modules.old modules.good

として、正しく動くカーネルを退避した。

その後、MINEのcpuの行を"I586_CPU"に修正して同じ手順で再構築すると、今度は無事に起動した。
再構築前のカーネルが4.2Mだったのに対し新しいのは1.9M、起動直後のRAM使用量は24Mから21Mに減少した。(カーネル単体のRAM使用量は調べ方がわからなかった)

●Portsのアップデート
4.11のpackagesは当然もはやネット上に存在しないので、各種アプリケーションはportsでインストールするのだが、4.11のportsのままだと、必要とする各ソースコードパッケージのバージョンが古すぎて、やはりネット上に存在しないものが多数ある。従って、まずはportsを最新のものにしなければならない。
portsの更新は、現在はPortsnapとかいう手段が主流のようだが、今回は昔ながらのCVSupで行うことにした。

1. cvsupインストール

cd /usr/ports/net/cvsup-without-gui
make install

 なんと、依存関係により、これだけで12のパッケージがインストールされてしまった。
2. 環境変数の設定
 環境変数SUP_UPDATE, PORTSSUPFILEを設定する。
setenv SUP_UPDATE
setenv PORTSSUPFILE /usr/share/examples/cvsup/ports-supfile

 (本当はports-supfileを別の場所にコピーした方が良い)
3. ports-supfileの編集
 $PORTSSUPFILEで示されるファイルを編集する。特に"*default host="の右側に近所のサーバー名を指定する。
 今回は/usr/share/docs/を参考に(今回はよくお世話になった)
*default host=cvsup4.jp.FreeBSD.org

 とした。
4. CVSup実行
cd /usr/ports
make update

とすると、約3時間で更新が完了した。
5. portupgrade
 cvsupの道連れに大量の古いバージョンのツールがインストールされたので、portupgradeを使用して全てバージョンアップすることにした。
 portupgradeをインストールし(これでまたrubyを含むいくつかのツールが芋づる式にインストールされてしまった)、
portupgrade cvsup-without-gui
を実行すると、無事に全てバージョンアップされた。

portsを更新するだけで20近いパッケージがインストールされてしまうとは、えらいものだ。最初は最新のports.tar.gzをダウンロードした方が良かったのかも知れない。

2007年01月21日

Mebius MN-340へのFreeBSD再インストール記(2)

カーネルをスリム化し、Portsを更新できたので、Webサーバーとして必要なソフトのインストールを始めた。まずはこのWeblogを実現するMovableTypeに必要な環境だ。

●Apacheインストール
新しいバージョンの方が良かろうと思ってapache2.2をインストールしたが、httpd.confがあまりにも複雑だったのと、同時接続クライアント数(旧MaxClients)の設定がわからなかったので、apache1.3に入れ替えた。
(1) ports/www/apache13をインストール
(2) /usr/local/etc/apache/httpd.confをコメントに従って編集
(3) /etc/rc.confに'apache_enable="YES"'を追加してOS再起動
(4) 別PCから'http://(IPアドレス)/'にアクセスして/usr/local/www/data-distが見えることを確認
(5) 'http://(IPアドレス)/cgi-bin/test-cgi'にアクセスしてCGIが正常実行されることを確認

●MySQLインストール
MySQLは(少なくとも現時点でportsがサポートする最新の5.1までは)バージョンが上がる度に結構基本的なDBの機能が追加されているので、新しい方が良いと思われる。
そう思っていたのだが、5.1の新機能に魅力を感じなかったので5.0をインストールしてしまった。
(1) ports/databases/mysql50-serverをインストール
(2) /etc/rcに'mysql_enable="YES"'他必要な設定を加えてOS再起動
(3) 'mysql -e "select version()"'を実行、適切な結果が得られることを確認(今回は5.0.27と出た)

●MovableTypeリストア
MovableType自体は一式をtarで固めてバックアップしたものを展開すれば即動いた。
これまではBerkeleyDBを使っていたので、DBも一緒にリストアされた。

mt-check.cgiを実行すると、Perlが5.005であるということで、Perl 5.6.1以上を強く推奨された。
他に、このWeblogのエントリー作成で必要なHTML::Entities, Image::Magickが無かった。

●Perl 5.6.2インストール
portsにlang/perl5(Perl5.6.2)とlang/perl5.8があり、Perl 5.8のことはよく知らないし、Perl5.6.2で十分だろうと思ったのとで、perl/lang/perl5をインストールした。
その後、下記の要領でPerlの追加モジュールをインストールしていると、最新のportsではImage::Magick、XML::Atom等がPerl5.8を必要とすることが判明したので、5.8に入れ替えた。

●Perl 5.8インストール
ports/lang/perl5.8をインストールした後、ports/graphics/ImageMagickをmakeすると、configureスクリプトでPerlのバージョンが5.005だと診断されてしまい、Image::Magickがインストールされなかった。
/usr/bin/perlが5.005のままで、5.8は/usr/local/bin/perlとしてインストールされており、autoconfでは/usr/bin/perlが優先的に使用されてしまうらしい。
・/usr/bin/perlを/usr/local/bin/perl へのシンボリックリンクにしても駄目だった。
・/usr/bin/perlを/usr/local/bin/perl へのハードリンクにしても駄目だった。
・configureを実行する時のパス順序を/usr/local/bin優先に変更しても駄目だった。
ということでmanやdoc等かなり調べまくって悩んだのだが、たまたま/usr/ports/lang/perl5.8/pkg-messageというファイルが存在することに気付き、開いたらあっさり答えが書いてあった。

use.perl port

とすると、5.8がデフォルトになるらしい。use.perl systemで5.005がデフォルトに戻る。/usr/local/bin/use.perlの中身が何なのかは、疲労により追究する気力が無かった。

●HTML::Entitiesのインストール
Portsにそれらしいのが無かったので、CPANでインストールした。
(1) 'man CPAN'の記述に従い、'perl -MCPAN -e shell'を実行
(2)設定を色々尋ねられるが全てデフォルト設定、FTPサイトは日本国内のを選択
(3)'install HTML::Entities'実行

●Image::Magickのインストール
上記の通りPerlのバージョン認識エラーにより失敗を繰り返したが、それがクリアされたら、ports/graphics/ImageMagickをインストールするだけで完了した。
なお、ports/graphics/ImageMagickのオプションメニュー(初回のmakeまたはmake configで出る)にて"IMAGEMAGICK_PERL"にチェックが入っているのを確認しておくべし。

2007年02月09日

LinuxがVMWareのNICを認識しなければ

VMWareでLinuxを動かすと、ディストリビューションによっては、ドライバが仮想ネットワークアダプタを認識しないことがある。
そういう時は、/etc/sysconfig/network-scripts/ifcfg-eth*に
----------------------
check_link_down() {
return 1;
}
----------------------
を加えると、うまくいくかも知れない。

(Linux)GRUBのブートフロッピーの作り方

LinuxでGRUBのブートフロッピー(実際はVMWareの仮想フロッピー)を作成したので、その方法を記録しておく。

まず、フロッピーにGRUBをインストールする。
info grubの"Installing GRUB using grub-install"の節を参考に、以下のようにした。
#mke2fs /dev/fd0
#mount -t ext2 /dev/fd0 /mnt/floppy
#grub-install --root-directory=/mnt/floppy '(fd0)'

続けて、grub.confをフロッピーにインストールする。
#cp .../grub/grub.conf /mnt/floppy/boot/grub/

必要に応じて、grub.confを編集する。
以上でumount /mnt/floppyして完了。

続きを読む "(Linux)GRUBのブートフロッピーの作り方" »

2007年03月07日

Mebius MN-340へのFreeBSD再インストール記(3)

MovableTypeが動いたことで、Webサーバとしてすぐに必要な環境はとりあえず揃った。次に、X無しの日本語入力環境を構築したので、その手順を記録する。他に、sambaとPython Infoのインストール、カーネルのオープンファイル数超過対策についても記録する。

●konインストール
デフォルトのコンソールでは日本語(マルチバイト文字、日本語フォント)が使えないので、konを使うことにした。
portsにkon2-14dotとkon2-16dotというのがあったので、両方試したが、kon2-14dotの方が見栄えが良かったので、こちらを採用した。

●jvimインストール
かな漢fepとしてcannaとFreeWnnを使うことに決め、portsのjvim-canna+freewnnをインストールした。

●cannaインストール
上記の手順でjvimをインストールすると、cannaは自動的にインストールされた。
システム起動時にcannaを起動するよう、rc.confに次の行を足した。

canna_enable="YES"

●FreeWnnインストール
FreeWnnは自動的にインストールされなかったので、portsのFreeWnn-serverをインストールした。
システム起動時にjserverを起動するよう、rc.confに次の行を足した。

wnn_enable="YES"

●Emacs(without X)インストール
個人的に欠かせないPython Info(info pythonで見るマニュアル)をmakeしようとしたら、Emacsが必要であることが判明したので、Emacsの日本語環境も作ることにした。
ports/japaneseを見ると、muleにはmule-canna+freewnnがあるのに、emacsにはそれらしい物が無かった。代わりにemacs-emcwsというのがあり、何だろうと思って見てみたら、これがEmacs+Canna+Wnn+Sj3だった。

emacs-emcws/Makefileを見ると、"NO_X11"が定義されているとX無しになりそうだったので、setenv NO_X11してmakeすると、emacs21がXありでmakeされてしまった。こちらはWITHOUT_X11が必要のようだ。

(1) portsのemacs-emcwsディレクトリに移動し、Makefileを編集
  WITH_FREEWNNをYESに変更、WITH_SJ3をNOに変更
(2) 環境変数NO_X11, WITHOUT_X11設定
  setenv NO_X11; setenv WITHOUT_X11
(3) make install

なお、上記手順でインストールした後、日本語入力可能なEmacsを起動するには、シェルから"emacs"でなく"emcws"で起動する必要があるのでご注意。


●python infoインストール
portsのlang/python25を普通にmakeすると、Python Infoがmakeされなかった。
仕方なく、手動でwork/Python-2.5/Doc/infoでmakeすると、エラーが出た。Makefileの依存関係を追っ掛けて編集しながら試していると、gmakeでないと通らないということに気付いた。
それでもなおpython-lib.infoのmakeには失敗した(Python-2.5.tgzのDoc/lib/*.texがおかしいようだ)ので、python-lib.infoだけはlang/python24の下でmakeした。

Infoのインストールは、手動で行った。手順はDoc/info/READMEに記されているが、*.info*を/usr/local/info/にコピーし、python.dirの内容を/usr/local/info/dirにマージすればOKだ。
なお、infoのトップページが/usr/share/infoにあるので、ついここにinfoを加えてしまいそうになるが、/usr/local/infoに加えるのが好ましいので、注意が必要だ。

●sambaインストール
(1) ports/japanese/sambaをインストール
(2) cd /usr/local/etc; cp smb.conf.default smb.conf
(3) smb.confを編集
(4) /etc/rc.confに'samba_enable="YES"'を追加

●kern.maxfilesの変更
"/kernel: kern.maxfiles limit exceeded by uid ..."というエラーメッセージがコンソールに出るようになった。カーネル再構築時にmaxusersを5にしたので、kern.maxfilesが200になっており(tuning(7)によると数千が普通らしい)、長時間サーバーとして動かして色々やってると、簡単に限界に達するようだ。

kern.maxfilesの値は、次のコマンドで見れる。(sysctl(8)参照)

sysctl kern.maxfiles

現在開いてるファイル数は、kern.openfilesという変数名で参照できる。
sysctl kern.openfiles

見た感じ、kern.maxfilesを300にすれば大丈夫のようだったので、/etc/sysctl.confに次の行を追加した。

kern.maxfiles=300

続きを読む "Mebius MN-340へのFreeBSD再インストール記(3)" »

2007年09月22日

(FreeBSD)TomcatでServletする(1/2)

HTTPのクライアント側で動作する小さなJavaアプリを指すアプレット(applet)と呼ぶが、それに対してサーバー側で動作する小さなJavaアプリを指すサーブレット(servlet)という言葉がある。昔かすかに聞いた覚えはあるが、その後servletなんて言葉はすっかり忘れていた。
先月から興味があってJDBCを勉強し始めているが、その関連の本を読むと、よくServletの話が出てくる。JavaはWebで使われることが多く、データベースをクライアント側で使うことは稀であるから、JDBCはServletで使われることが多い、ということになるのだろうか。

という訳で、このFreeBSDのWebサーバーにServletを動かす環境を作ってみたので、その過程を報告する。

まず必要なソフトであるが、Java開発環境であるJDK、Java動作環境であるJRE(Java VM)は当然として、クライアントの要求を受けてJavaアプリを起動するHTTPサーバーが必要だ。当初はCGIと似たような動作なのでApacheの設定かプラグインでできると思っていたが、過去にはJServというプログラムを使ってそのようなことをしていたようだが、今はTomcatという異なるHTTPサーバーを使うのがオープンソースでは主流のようだ。他にJRunやResinなどがあるが、これらは基本的には商用である。
蛇足だが、現在TomcatはApacheのプロジェクトで開発されているらしい。Jakarta TomcatとApache Tomcatは同じものである。

次に具体的なインストールの方法を記す。

●FreeBSDへのJDKのインストール
JDKにはJREが含まれているので、Java環境としてはJDKだけをインストールすれば良い。
しかし、最初につまづくのが、Sunが配布するJDKには、Linux用のバイナリはあるが、FreeBSD用のバイナリが無いことだ。従って、インストールするバイナリは次の3通りから選択する必要がある。
 (1) JDKのソースコードをコンパイルしてFreeBSD nativeなバイナリを作る
 (2) FreeBSDのLinux emulationによって、Linux用のバイナリを使う
 (3) Sun以外が配布するFreeBSD nativeなバイナリを使う

勿論(3)が一番楽である。FreeBSDのバージョンが5.5以降でJavaのバージョンが(1.4以前でなく)1.5で良いなら、FreeBSD Foundationが配布するDiablo JDKをインストールすれば良い。これはportsを使用してインストールすることもできる。

しかしながら、このサーバーのように、4.x以前のFreeBSDしか動かず(未だ原因不明)、HDDの空き容量が2G以上必要なJDK1.5のコンパイルができない場合は、別の選択をせざるを得ない。

JDK1.4については、(3)のようなバイナリは存在しない。CPUがPentium 150MHzであるこのサーバーでは、(2)のようにしてLinux emulationでLinuxのJREを動かすのでは、動作速度に難があり使い物にならない。
従ってJDK1.4をソースからコンパイルしたいのだが、少なくとも現時点のportsでは、なんとJDK1.4をコンパイルするのに(2)のLinux emulationによるLinuxのJDK1.4が必要になる。そして、portsのMakefileに書かれていたが、LinuxのJDK1.4を動かすには、FreeBSDが5.4以降である必要がある。
ついでに、JDK1.4のMakefileを動かし始めると、コンパイルには1.7GのHDDの作業領域が必要だという注意書きが表示された。このサーバーには0.4Mも空きが無いので、どの道無理であった。

Tomcat 5.5を動かすにはJDK1.4以上が必要なのだが、Tomcat 4.1なら、JDK1.2以上があれば良いので、このサーバーにはJDK1.3を入れることにした。
JDK1.3についても現在は(3)のようなバイナリが存在しない(過去にはDiablo JDKの1.3があったようだ)が、portsを使えば、JDK1.3のソースコードからのコンパイルは、Linuxのバイナリが必要になることも無く、実に簡単にできた。JDK本体のコンパイルはPentium 150MHzでも2~3時間でできたし、HDDの作業領域も300Mで足りた。

●Tomcatのインストール
packages/portsを使えば、特に難しいことは無かった。このサーバーにTomcat 4.1を、別のPCにTomcat 5.5をインストールしたが、どちらもバイナリのインストール自体は容易だった。
敢えて注意すべきことを挙げると、上に書いたことと重複するが、JDKが1.3以前だとTomcat 5.0以降は動かせないことと、packages/portsのパッケージ名ではtomcat??とapache-tomcat??は同じものだということがある。

Tomcatの起動スクリプトは/usr/local/etc/rc.d/に作られるので、それを参考に、/etc/rc.confにtomcat_enable等の行を追加すれば、Tomcatが起動できるようになる。(OS起動時にも自動的に起動されるようになる)
ちなみに、このサーバーの/etc/rc.confの設定は、

tomcat41_enable="YES"
tomcat41_java_home="/usr/local/jdk1.3.1"
tomcat41_java_vendor="sun"
tomcat41_java_version="1.3"
tomcat41_java_os="native"
tomcat41_java_opts="-Xverify:none"

である。最後の行は、JDBCのI/Fの都合で追加したものであり、Tomcat単体としては必要ない。

ただ1点問題なのは、Tomcat 4.1は、起動スクリプトを使ってTomcatの起動はできるが、状態表示や終了ができないことだ。通常運用だと特に問題無いのだが、Servletのクラスファイルを更新するとTomcatを再起動する必要がある(Tomcat自体がJava VM上で動いておりServletを1回起動したらその名前のクラスはロード済になってしまうため)ので、Servlet開発中は不便である。
原因はロックファイル(/var/run/tomcat41.pid)がうまく作られない(中身が空になる)ことなのだが、/usr/local/etc/rc.subrとにらめっこしているが、今の所修正方法を発見していない。
FreeBSD 5.5のTomcatだとそういう問題は起こらないので、Tomcat 4.1のportsがFreeBSD 4.x以前のことを考えていない可能性がある。
また、samba等他のサーバープログラムの起動スクリプトを一通り見たが、サーバープログラムが自前でdaemon起動しロックファイルを管理しているものばかりで、Tomcatのようにdaemonコマンドを使用してJavaのようなインタプリタをdaemon起動するものは無く、参考にならなかった。起動スクリプトにてJava起動後のpidを取得してロックファイルに格納するというのは、OSの助けが無い限り、並の手段では不可能のように思える。

続きを読む "(FreeBSD)TomcatでServletする(1/2)" »

2007年09月23日

(FreeBSD)TomcatでServletする(2/2)

インストールし立てのTomcatを起動してHTMLブラウザでアクセスすると、予め用意されているコンテンツ(TomcatではWebアプリと言うらしい)が表示され、ブラウザがJavaに対応していれば、サンプルのServletやJSPがすぐに動く。サンプルのServletのソースを見ることもでき、開発意欲をかき立てられる。

なお、Tomcatのマニュアル(RUNNING.txt)には、デフォルトの設定ではポート8080で待ち受けると書いてあるが、FreeBSDのportsはそれを8180に書き換えるので、注意が必要だ。

そのサンプルソースを改造して、自前のServletを作成して、いざTomcatで動かそうとすると、作成したServletをどこに置いてどういう設定をすれば良いかがわからない。
とりあえず、最初のテストとしては、クラスファイルをサンプルServletのある所(webapp/examples/WEB-INF/classes/)に置いて、サンプルServletの設定があるwebapps/examples/WEB-INF/web.xmlに同じような設定(<servlet>と<servlet-mapping>)を加えればよい。そうして新たなServletが動けば、JDKの動作には問題なしだ。

Servletのきちんとした配置と設定は、大変見つけにかったが、TomcatのマニュアルのDeploymentのページ(TomcatのデフォルトのWebアプリのページから"Tomcat Documentation"→"App Developer Guide"→"Deployment"と順に辿る)に書いてあった。Servletを動かすための最低限の準備は、
(1) Tomcatのwebappsディレクトリに新たなディレクトリ(ここでは"sample"とする)を作成し、
(2) webapps/sample/WEB-INF/classes/ にクラスファイルを置き、
(3) webapps/sample/WEB-INF/ に設定ファイルであるweb.xmlを置く
だ。web.xmlは、conf/web.xml.sampleをコピーして編集するが、筆者が試した所、Tomcat 4.1では<web-app>の中に<servlet>と<servlet-mapping>だけでうまくいったが、Tomcat 5.5では<session-config>も必要だった。


今回、試験的なアプリとして、ランダムな表を出力するServletを作ってみた。
RandomTable Servletへのリンク
 ※アクセス後、ブラウザでページの更新(再読み込み)をすると違う表が出てくると思います。
 ※JRE 1.3.1 + Tomcat 4.1で動かしています。
RandomTable Servletのソースコードへのリンク
web.xmlへのリンク
 ※Tomcat 4.1で不要だった部分はコメントアウトしています。

続きを読む "(FreeBSD)TomcatでServletする(2/2)" »

2007年09月30日

MySQL Connector/J導入記

JDBCを使ってMySQLにアクセスするためのJava側のドライバとして、MySQL Connector/Jというものがある。
今回、JDK 1.3、Tomcat 4.1が動いている環境にMySQL Connector/J 5.0をインストールし、動かしてみて気付いたことや、遭遇したトラブルと実際に行った対処を書き留める。

(1) JDK 1.3でMySQL Connector/Jを使う時の注意点
MySQL Connector/Jのマニュアルの§1.1.1にあるが、JDK 1.4未満では、class verifierをOFFにする必要がある。コマンドラインからJava VMを起動する場合は、-Xverify:noneを指定すれば良い。

(2) JDK 1.3+TomcatでMySQL Connector/Jを使う時の注意点
上記(1)の制限により、TomcatのJava VM起動時オプションに"-Xverify:none"を指定する必要がある。FreeBSD 4.11でTomcat 4.1を動かしているこのサーバーでは、/etc/rc.confに

tomcat41_java_opts="-Xverify:none"

を加えている。

なお、シェルのコマンドラインからjavaコマンドを使用する場合は、mysql-connector-java.jarをJDKのディレクトリの下のjre/lib/ext/に置いておくとCLASSPATHの指定が不要になるが、Tomcatの場合はこれは無効である。インストールマニュアルの通り、mysql-connector-java.jarをTomcatのディレクトリの下のcommon/lib/に置く必要がある。

(3) MySQL Connector/JのExample 10がSQLエラーになる
あるMySQLのサーバーに対して、MySQL Connector/JのマニュアルのExample 10のコードを動かすと、

You have an error in your SQL syntax near 'DEFAULT, 'AUTO INCREMENT here?')' at line 1

というメッセージと共にSQLExceptionが発生した。
そのサーバーに対してMySQLのコマンドライン(クライアント)からサンプルコードと同等の処理である
INSERT INTO ... VALUES (DEFAULT, "...");

を実行すると、同様のエラーとなった。

MySQLのinfoによると、MySQLをconfigureする時にDONT_USE_DEFAULT_FIELDSを指定すると、そういう動作になるらしい。このコンパイルオプションはバージョン5.0.2で削除されているが、システム変数sql_modeをSTRICT_TRANS_TABLESにすると同じことが起こる。

このエラーを回避するには、rs.insertRow();の前に

rs.updateInt("priKey", 0);

を足すと良い。
第2引数は、0以外だと、auto incrementの初期値を与えることになるので正しくない。

2007年10月29日

jvim+cannaでローマ字かな入力できない時

このサーバーには、FreeBSDのportsを使って、jvim-canna+freewnnをインストールしていた。
先日、ふとこのサーバー上で日本語の文章を書きたくなって、jvimで書き始めた。ヘルプを見ていると、日本語入力中にかな漢変換エンジンを切り替えることができるとあったので、FreeWnnからCannaに切り替えると、ローマ字入力がひらがなやカタカナに変換されないことに気づいた。aiueoと打つと、日本語入力モードにも関わらず、画面にaiueoと表示され、スペースキーを押しても漢字変換がされなかった。

jvimは日本語入力fepとしてONEWというものを使っているらしい。ONEWのREADMEを読むと、どうやらONEWに対してCannaのローマ字かな変換表(ONEW_CANNA_RKTAB)、またはその探索パス(ONEW_CANNA_RKPATH)を指定する必要があるらしかった。

さらに調べていると、Cannaのデフォルトのローマ字かな変換表はdefault.cbpという名前らしく、このサーバーには/usr/local/share/canna/dic/default.cbpが存在したので、cshで

setenv ONEW_CANNA_RKPATH /usr/local/share/canna/dic/

としてみると、jvim上のCanna選択状態でローマ字入力による日本語入力ができるようになった。

続きを読む "jvim+cannaでローマ字かな入力できない時" »

2009年08月29日

(FreeBSD)かなキー入力をするための設定

FreeBSD 7.1を使っていて、どうしても(ローマ字入力でない)かな入力をしたくなったので、設定方法を調べてみた。
以下、キーボードは日本語106キーボードを使用することを前提にする。

●X Windowの設定
まず、デフォルトの設定では、バックスラッシュキー(「ろ」キー)と¥キー(「ー」キー)のkeysymが同じでアプリの設定ではどうしようも無いため、「ろ」キーが"_"になるよう、keysymを変更する。また、Shift+0キーがShift+^キーと同じチルダ記号だと「を」キーとしての設定がうまくいかないことがあるので、Shift+0が"|"になるように変更する。

~/.Xmodmapに以下の2行を加える。

keycode 211 = underscore underscore
keycode 19 = 0 bar kana_WA kana_WO

それをすぐに反映するには、次のコマンドを実行する。

xmodmap ~/.Xmodmap

おかしい時は、xmodmap -pkeとして、現在の状況を確認する。

●Emacs+Anthyの場合
まず、anthy-conf.el(筆者の環境では/usr/local/share/emacs/site-lisp/anthy/にある)の「ろ」「を」「ー」キーの割り当てを変更する。ついでに、Shift+"["、Shift+"]"が「」(かぎ括弧)でなく{}(波括弧)になっているが、「」の方が使う機会が多いので、Shift+"["、Shift+"]"、を「」に割り当てる。


("_" . "ろ")
("|" . "を")
;;("_" . "ー")は削除
("\\" . "ー")
("{" . "「") ("}" . "」")

ひらがな用とカタカナ用の設定があるので、カタカナ用の設定も同じように変更する。

次に、~/.emacs.elに次の3行を加えるか、Emacs上でこれを実行する。

(load-library "anthy")
(anthy-kana-map-mode)
(setq default-input-method "japanese-anthy")

これでC-\でかな入力ができるようになる。

日本語入力切り替えキーとしてC-\が使えない時は、Canna流にC-oを割り当てる。

(global-set-key "\C-o" 'anthy-mode)

●Emacs+Cannaの場合
(1) default.canna(筆者の環境では/usr/local/share/canna/)を~/.cannaにコピー
(2) ~/.cannaの"default.cbp"を"kana.cbp"に変更
(3) ~/.cannaのdefsymbolの行を全てコメントアウトし、以下を追加

(defsymbol
?_ "ろ" "ろ" )

(4) ~/.emacs.elに(canna)を加えて、emcwsコマンドでEmacsを起動
または、
(4') emcwsコマンドでEmacsを起動し、M-x canna
これでC-oでかな入力ができるようになる。

●jvim+Cannaの場合
jvimは、DIRECT_CANNAを有効にしたもの(ONEWを無効にしたもの)をインストールすること。
packagesなら ja-jvim-direct_canna-3.0.j2.1a_2 など、"direct_canna"が付いたものを選択する。portsならjvimのmake configでDIRECT_CANNAを選んでからコンパイルする。

上記のEmacs+Cannaの場合と同様に~/.cannaを設定してjvimを起動すると、インサートモードにてC-\でかな入力ができるようになる。

以上、FreeBSDには限らない設定だとは思うが、他の環境では試していない。

続きを読む "(FreeBSD)かなキー入力をするための設定" »

2010年04月18日

FreeBSD 7.xにext3のイメージファイルをmountする方法

Linuxでdd if=/dev/hda1 of=/tmp/ext3image.imgなどとやって作成したext3のディスクイメージをFreeBSD 7.3にマウントするのに手間取ったので、成功した手順を記録する。

(1) カーネルにext2fsモジュールをロードしておく
 例)kldload ext2fs
(2) fsckする必要がある場合は、e2fsprogsをインストールしておく
(3) mdconfig -f (イメージファイル名)
以下、(3)によりmd0と表示された(unit 0に割り当てられた)ものとする。
(4) fsckする場合は、e2fsck /dev/md0
(5) mount -t ext2fs /dev/md0 /mnt

続きを読む "FreeBSD 7.xにext3のイメージファイルをmountする方法" »

2010年05月03日

(FreeBSD) Emacs+anthy.elのかなキー入力の設定

以前にFreeBSDで(ローマ字でない)かなキー入力の設定をして、たまにjvim+cannaやEmacs+cannaでかな入力をしていたのだが、先月訳あってFreeBSD 7.3を新規にインストールすると、何と7.2まであったcanna-serverがpackagesから無くなっていた。portsを使えば時間はかかってもトラブル無くインストールできるのだろうが、今回はなるべくインストール作業に時間と手間を掛けたくなかったので、この機会にpackagesだけでインストールできるEmacs+anthy.elに完全に乗り換えることにした。

ところが、使ってみるとanthy.elのかな入力モード(anthy-kana-map-mode)のデフォルトの設定は使いづらいことがわかった。特に、全角数字や全角記号を入力する手段が無い(全角のアルファベットは入力できる)のが個人的に支障がある。漢字変換の辞書として登録しようにも、半角記号は漢字変換の対象にならないし、そして全角記号を片っ端からanthy-conf.elのキーマップに登録すると動かなくなってしまったのである。
丁度、GW開始と同時にえげつない風邪をひいて(咳と痰で窒息死するかと思った)未だ蟄居を余儀なくされており、パソコンに向かえるくらいには回復したものの、これより難しいことに取り組めるほど頭が回らないので、この機会に色々調べてanthy.elをカスタマイズしてみた。

(1) X Windowのキーの設定
以前のエントリーに書いたように、X Windowのデフォルトの設定では「ろ」「を」「ー」キー識別に問題があるので、keysymを変更する。
~/.Xmodmapに以下の2行を加える。

keycode 211 = underscore underscore
keycode 19 = 0 bar kana_WA kana_WO

(2) Emacsの設定
後述のキーマップの設定は文字コードがJISでないといけないので、anthy.el関連の設定は.emacs.elとは別のファイルに書くことにした。また、以前のエントリーではシステムのanthy-conf.elのキーマップの設定を書き換えていたが、ここではkeysymの設定をホームディレクトリに置いてるので、これもホームディレクトリに置くことにした。

~/.emacs.elの記述

(load (concat (getenv "HOME") "/.anthy-conf.el"))

~/.anthy-conf.el(文字コード:JIS)

;;anthy.elの設定
(load-library "anthy")
(setq defualt-input-method "japanese-anthy")
;(global-set-key "\C-o" 'anthy-mode)

(anthy-kana-map-mode) ;かなキー入力モード

;;xmodmapの変更に合わせたキーバインド
(anthy-change-hiragana-map "_" "ろ")
(anthy-change-hiragana-map "|" "を")
(anthy-change-hiragana-map "\\" "ー")
(anthy-change-katakana-map "_" "ロ")
(anthy-change-katakana-map "|" "ヲ")
(anthy-change-katakana-map "\\" "ー")

;;Anthyのひらがなモードとカタカナモードのキーマップを同時に設定する関数
(defun anthy-load-bothkana-map (map)
(mapcar (lambda (x)
(let ((key (car x)) (str (cdr x)))
(anthy-change-hiragana-map key str)
(anthy-change-katakana-map key str))) map))

;;日本語でよく使う記号(ワンプッシュにする)
(anthy-load-bothkana-map '(("{" . "「") ("}" . "」") ("?" . "・")))

;;その他全角記号("Q"+キーにする)
;;=”@‘+*は元々Shiftとの組み合わせで出るので省略
(anthy-load-bothkana-map
'(
("Q0" . "0") ("Q1" . "1") ("Q2" . "2") ("Q3" . "3") ("Q4" . "4") ("Q5" . "5") ("Q6" . "6") ("Q7" . "7") ("Q8" . "8") ("Q9" . "9")
("Q-" . "-") ("Q^" . "^") ("Q\"" . "\")
("Q!" . "!") ("Q#" . "#") ("Q$" . "$") ("Q%" . "%") ("Q&" . "&") ("Q'" . "’") ("Q(" . "(") ("Q)" . ")")
("Q~" . "~") ("Q|" . "|")
("Q[" . "[") ("Q]" . "]") ("Q{" . "{") ("Q}" . "}")
("Q;" . ";") ("Q:" . ":")
("Q," . ",") ("Q." . ".") ("Q<" . "<") ("Q>" . ">") ("Q/" . "/") ("Q?" . "?")))

;;カタカナは設定数が多いとダメのようなので、_はひらがなのみ
(anthy-change-hiragana-map "Q_" "_")
;;(anthy-change-katakana-map)をこれ以上実行すると固まる(\C-gで抜けられる)
;;(anthy-change-katakana-map "Q_" "_")

;;かな/カナ/全角アルファベットの切り替えのカスタマイズ
(setq anthy-rkmap-keybind
'(
;; \C-j --> ひらがな <=> カタカナ
(("hiragana" . 10) . "katakana")
(("katakana" . 10) . "hiragana")
(("walphabet" . 10) . "hiragana")
;; \C-p --> ひらがな <=> カタカナ
(("hiragana" . 16) . "katakana")
(("katakana" . 16) . "hiragana")
(("walphabet" . 16) . "hiragana")
;; \C-q --> ひらがな <=> ABC
(("hiragana" . 17) . "walphabet")
(("katakana" . 17) . "walphabet")
(("walphabet" . 17) . "hiragana")
;; H --> ひらがな
(("katakana" . 72) . "hiragana")
(("walphabet" . 72) . "hiragana")
;; K --> カタカナ
(("hiragana" . 75) . "katakana")
(("walphabet" . 75) . "katakana")
;; L --> ABC
(("hiragana" . 76) . "walphabet")
(("katakana" . 76) . "walphabet")
))

コメントにも少し書いているが、anthy-change-katakana-mapを使ってカタカナモードのキーマップにあまり多く登録すると、Anthyの応答が無くてEmacsが固まってしまう。その時にCtrl-Gを押すと、Emacs上にSegmentation faultと表示される。その後も日本語入力ができない訳ではない。謎である。

(5) anthy.elの修正
anthy-9100hのanthy.elは、Emacs23で使うと起動や変換候補一覧表示にやたら時間がかかる、よく知られたバグがある。これはanthy.elを書き換えて直すしかない。
ついでに、anthy.elをロードすると毎回

old-style backquotes detected!

と出て鬱陶しいので、それも修正する。

59c59
< (if (string-match "^22\." emacs-version)
---
> (if (>= emacs-major-version 22)
164,168c165,169
< (` (progn
< (defvar (, var) (, default-value)
< (, (format "%s\n\(buffer local\)" documentation)))
< (make-variable-buffer-local '(, var))
< )))
---
> `(progn
> (defvar ,var ,default-value
> ,(format "%s\n\(buffer local\)" documentation))
> (make-variable-buffer-local ',var)
> ))

これをファイルに保存して
cd /usr/local/share/emacs/site-lisp/anthy
patch anthy.el < (ファイル名)

とすると、修正が反映される。

2010年05月23日

EmacsのX Windowフォントの設定方法(1)

筆者は普段EmacsをX Windowで使わない。そもそもX Windowを使っていないからだ。使うのはFreeBSDやLinuxで動くEmacsだが、WindowsからTelnetやSSHでアクセスしているので、キャラクターベースである。マウスも使わ(え)ない。
昔はパソコンの性能に対してWindowsが重かったので、FreeBSD+X Windowを愛用していたが、その時はEmacsも重かったので、Emacsはktermやrxvtの中でしか使わなかった。
そのさらに昔、大学の研究室にはX Windowの端末があったので、X上のEmacsを使おうと思えば使えたのだが、Emacsを知ると同時にTelnetも知ってしまい、EmacsをXで使う利点よりも、コンピューターを遠隔操作することの魅力に取り憑かれてしまったので、やはりEmacsは文字ベースの端末で使っていた。
だから、X上のEmacsのカスタマイズというのはほとんどやったことがなかった。

時代は変わって、Windows上の仮想マシンでX Windowがスムーズに動くようになった。先月、訳あって、仮想マシンにFreeBSD 7.3をインストールした。XもEmacsもインストールした。ところで、筆者は昨年より再びEmacsを使い始め、今Emacsがマイブームなのである。そのため、XのEmacsのカスタマイズもやり始めている。大学の研究室でEmacsに出会ってからの1x年に渡る旧知の仲、しかも歳を重ねて英語もEmacs Lispもそれなりに読めるようになった今、もはや何もつまずくことはなかろうと高を括っていたら、フォントの設定にコテンパンにやられてしまった。何ゆえかくも複雑なのであろうか。

たかがフォントの設定に膨大な時間を費やしてしまったので、調べまくったことをここにメモしていくことにする。

●Emacs 22と23の違い
Xのフォントに関して、Emacsのバージョン22と23とでは大きな違いがある。バージョン23ではXftがサポートされ、アンチエイリアスされた滑らかなフォントが表示できるのである。また、フォント名として、あの長ったらしいXLFD名のみでなく、Xftの短い名前も使える。

・通常のビットマップフォントの例
(東雲ゴシック 16ドット)
-shinonome-gothic-medium-r-normal-*-16-150-75-75-c-160-jisx02081990-0
-shinonome-gothic-medium-r-normal-*-16-150-75-75-c-80-iso8859-1
(Ayuゴシック 20ドット)
-ayu-gothic-medium-r-normal-*-20-190-75-75-c-200-jisx02081990-0
ayu-gothic-medium-r-normal--20-190-75-75-c-100-iso8859-1

・アンチエイリアスされたTrueTypeフォントの例(M+2VM+IPAG circle 14pt)
M+2VM+IPAG circle
M+2VM+IPAG circle

しかしながら、その分ちょっと重い。

●Emacs23起動後のフォント変更方法
Shift+左クリックで開くポップアップメニューの"Change Buffer Font..."を選ぶと、フォント選択ダイアログが出てくる。
ダイアログの下半分のプレビューエリアには、Xのセレクションを使って、日本語をペーストすることもできる。(別プロセスのウィンドウの日本語文字列を左ボタンでドラッグして選択し、ここに中ボタンでペーストする等)

しかし、これで設定したフォントはバッファローカルであり、終了時に保存されないどころか、別のファイルを開くと引き継がれない。

●Emacs23のフォントの設定方法(X resourcesを使う場合)
Emacsのフォントの設定は.emacsの中にも書けるが、.emacsに書くには考慮することが色々あって結構難しい。それに対し、Xのリソースに登録する方法は、無難で手軽である。
例えば、~/.Xdefaultsに次のように記述する。

Emacs.font: M+2VM+IPAG circle

"M+2VM+IPAG circle"は、筆者のお気に入りのフォントの名前である。
M+2VM+IPAG circleにすると、ウィンドウサイズが横に広がりすぎるので、ウィンドウサイズも指定する。
Emacs.geometry: 40x32+30+0

ウィンドウサイズが40×32文字、表示位置が(30,0)という意味である。

フォントサイズを変更するには、フォントの高さをpt単位で指定する。
Emacs*attributeHeight: 140
設定する値は実際のpt数の10倍である。14ptなら140、10.5ptなら105とする。
"*"でごまかすのでなく、default faceのattributeHeightだけ指定すれば良いはずなのだが、書き方がわからなかった。("Emacs.default.attributeHeight: 140"では効かなかった)

万一、デフォルト起動でEmacsのXftが有効にならない場合は、

Emacs.FontBackend: xft

を含めておくと良いらしい。

余談だが、Xのリソース設定を~/.Xdefaultsに書いている場合は、アプリケーションの起動時に毎回自動的に読み込まれるので、ここに書いてEmacsを起動すると、設定したフォントで起動する。Xのセッション起動時に読み込まれる~/.Xresourcesに書いている場合は、追記した内容をすぐに反映させるには、次のコマンドを実行すると、Xのリソースに登録される。

xrdb -merge ~/.Xresources

●Emacs23のフォントの設定方法(.emacsに書く場合)
筆者の環境では、たまにEmacs23は重いと感じることがあるため、Emacs22をデフォルトにしている。そのため、XのリソースをEmacs23の設定にしたくない。そのような場合は、.emacsにてフォントを設定することもできる。

フレームのフォントの変更はset-frame-font、フレームのサイズの変更はset-frame-sizeでできる。また、ありがちな問題として、これらの設定はC-x 5 2で別のフレームを開いた時に引き継がれないということがあるので、こういうのはdefault-frame-alistに登録する必要がある。ついでにEmacsのバージョンもチェックするようにして、

(when (>= emacs-major-version 23)
(when window-system
(set-frame-font "M+2VM+IPAG circle") ;最初のフレームのフォント設定
(set-frame-size (selected-frame) 40 32) ;最初のフレームのサイズ
(setq default-frame-alist ;以後のフレームの設定
(append '(
(width . 40)
(height . 32)
(font . "M+2VM+IPAG circle")
) default-frame-alist))
))

でOKである。

筆者の環境では、ここでset-frame-fontをしなくても、この後の処理で最初のフレームのフォントがdefault-frame-alistに書いたフォントになることが確認できたので、set-frame-fontは外した。フレームのサイズについては、このように明示的にset-frame-sizeしないと変わらなかった。

フォントサイズの設定は、詳細を省くが

(set-face-attribute 'default nil :height 140)

のようにするとできる。これはフレームに対する設定ではなく、"default" faceに対する設定である。.emacsにこれを書いても、最初のフレームに関してはfaceの設定は済んだ後なので、最初のフレームについては、face設定の再読み込みが必要である。
(when (>= emacs-major-version 23)
(when window-system
;;(set-frame-font "M+2VM+IPAG circle") ;最初のフレームのフォント設定
(set-frame-size (selected-frame) 40 32) ;最初のフレームのサイズ
(setq default-frame-alist ;以後のフレームの設定
(append '(
(width . 40)
(height . 32)
(font . "M+2VM+IPAG circle")
) default-frame-alist))
(set-face-attribute 'default nil ;default faceの設定
:height 140 ;フォント高さ(/10pt)
)
(face-set-after-frame-default (selected-frame)) ;;最初のフレームのface再読み込み(NG)
))

…が、筆者の環境ではすぐにフォントサイズが戻ってしまった。Emacsの起動時には.emacsが実行された後も色々な処理が走るので、そのどこかで別の値に再設定されてしまうのだろう。その処理が特定できなかったので、今回はEmacs起動の最後の方で実行されるwindow-setup-hookに登録して乗り切ることにした。
(when (>= emacs-major-version 23)
(when window-system
;;(set-frame-font "M+2VM+IPAG circle") ;最初のフレームのフォント設定
(set-frame-size (selected-frame) 40 32) ;最初のフレームのサイズ
(setq default-frame-alist ;以後のフレームの設定
(append '(
(width . 40)
(height . 32)
(font . "M+2VM+IPAG circle")
) default-frame-alist))
(set-face-attribute 'default nil ;default faceの設定
:height 140 ;フォント高さ(/10pt)
)

;;最初のフレームのfaceの再読み込み(後処理)
(add-hook 'window-setup-hook
'(lambda ()
(face-set-after-frame-default (selected-frame)
))
))

続きを読む "EmacsのX Windowフォントの設定方法(1)" »

2010年05月29日

EmacsのX Windowフォントの設定方法(2)

次に、日本語とかASCIIとかの文字集合の単位で別々のフォントを設定してみる。
日本語と英語しか使わなくても、日本語文字の分しか無いフォントとか、ASCII文字の分しか無いフォントとかを使う場合、そういうことが必要になることがある。アラビア語とかハングルとか、日英以外の文字も表示したいのにフォントが自動的に読み込まれないような時も、必要になる。
Xftが有効なEmacs23を使う場合、fontconfigの設定が適切であれば、そのような事態はあまり起こらないような気がするし、起こってもEmacs側で対処するよりfontconfig側で直すべき話になるかも知れないが、筆者の環境ではEmacs22が現役であるので、そのような事態は基本的に発生するのである。

Emacsのフォントは文字セット(文字集合、charset)とフォント名の組で管理される。その文字セットとフォント名の組のリストをフォントセットと言う。文字セットは、JIS X 0208とかiso8859-1等の単位で指定するのが基本であるが、Emacs23では文字コードの範囲で指定することもできる。Emacsで定義されている文字セットは、M-x list-character-setsするとわかる。日本語文字とASCII文字に関係するのは以下のものである。
・ascii: 言うまでもなくASCII文字
・japanese-jisx0208: 日本語、大体第1〜2水準漢字を含む
・japanese-jisx0212: 大体第3〜4水準漢字
・japanese-jisx0213: JIS X0208 + JIS X0212
・katakana-jisx0201: 日本語のいわゆる半角カナ、Emacs23ではjisx0201
・unicode-bmp: Unicodeの基本面(0群0面、UCS-2で表現できる範囲)(Emacs23のみ)
半角カナを使わなければ、asciiとjapanese-jisx0208のフォントを設定すれば十分である。
フォントセットを意識せずにset-frame-fontとかで1つのフォントのみを指定してフォントを変更しても、裏では何らかのフォントセットが自動的に構成される。

現在使用されているフォントセットは、M-x describe-fontsetでcurrent frameを指定すると表示される。これの出力形式は、Emacs22と23とで全然異なる。Emacs22の方が単純でわかり易い。Emacs23の方がきめ細かな設定ができるので仕方ないのだろうが、非常にわかりづらい。困ったものである。Emacs22で実行すると、以下のような感じになる。

Fontset: -etl-*-medium-r-normal-*-16-*-*-*-*-*-fontset-16
CHARSET or CHAR RANGE FONT NAME
--------------------- ---------
ascii -etl-fixed-medium-r-normal--16-160-72-72-c-80-iso8859-1
[-ETL-fixed-bold-r-normal--16-160-72-72-C-80-ISO8859-1]
[-ETL-Fixed-Medium-R-Normal--16-160-72-72-C-80-ISO8859-1]
latin-iso8859-1 -etl-fixed-*-iso8859-1
latin-iso8859-2 -*-iso8859-2
latin-iso8859-3 -*-iso8859-3
(中略、以下抜粋)
katakana-jisx0201 -*-jisx0201-*
[-Shinonome-Gothic-Medium-R-Normal--16-150-75-75-C-80-JISX0201.1976-0]
japanese-jisx0208 -*-jisx0208.1990-*
japanese-jisx0212 -*-jisx0212-*
[-Misc-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISX0212.1990-0]
japanese-jisx0213-1 -*-jisx0213.2000-1
[-Misc-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISX0213.2000-1]
japanese-jisx0213-2 -*-jisx0213.2000-2
[-Misc-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISX0213.2000-2]

文字セットの右側が指定したフォント名、[]内が実際にロードされたフォント名である。ちなみに、上の出力は、FreeBSD7.3でintlfontsというpackageをインストールして、intlfontsのdocに書かれている設定をそのまま使った状態である。

Emacs23だとこれを読み取るのは困難であるが、同じような意味の設定をすれば十分である。Emacs23だとiso10646とか"unicode-bmp"とかの名前もあって、これを使ってもまあ悪くない。

フォントセットの定義は、Xリソースでも.emacsでもできる。
今回は、Emacs23用に.emacsでやってみた。(筆者のXリソースはEmacs22に合わせている為)
まずは、フォントセットを定義せずに、自動的に作られたフォントセットのフォントを変更してみる。

(when (>= emacs-major-version 23)
(when window-system
;;(1)ASCIIフォント設定
(setq default-frame-alist
(append '(
(font . "Sazanami Mincho:style=Regular:size=22") ;ASCII文字のフォント
(width . 80) ;文字が大きいので、ついでにウィンドウサイズ変更
(height . 24)
)
default-frame-alist))

;;(2)最初のフレームのサイズ変更
(set-frame-size (selected-frame) 80 24)

;;(3)日本語フォント変更
(add-hook 'window-setup-hook
'(lambda ()
;;日本語→VLゴシック
(set-fontset-font (frame-parameter nil 'font)
'japanese-jisx0208
(font-spec :family "VL Gothic"))
;;全角カタカナのみ、さざなみ明朝に戻す
(set-fontset-font (frame-parameter nil 'font)
;;'(#x3041 . #x309f) ;ひらがな
'(#x30a0 . #x30ff) ;カタカナ
(font-spec :family "Sazanami Mincho"))
;;半角カナ→Kappaのイタリック体
(set-fontset-font (frame-parameter nil 'font)
'jisx0201
"-kappa-*-medium-i-*-*-20-*-*-*-*-*-jisx0201.1976-*")
))
))

結果

ASCIIフォントの設定はset-frame-font、現在のフォントセットの一部フォント変更は(set-fontset-font (frame-parameter nil 'font) ...)でできる((frame-parameter nil 'font)は現在のフレームのフォントセット名を返す)ので、それらを単に並べればできそうなものであるが、色々ややこしいことがあってそれではうまくいかなかったので、色々工夫してみた。
(1)のASCIIフォント設定は、default-frame-alistに登録するのでなくset-frame-fontを使うと、少なくとも筆者の環境では、.emacs実行後に(おそらくface設定の処理でdefault-frame-alist等のフォントに)また変えられてしまう。もし変えられなくても、C-x 5 2で開いたフレームにはフォント設定が引き継がれなくなってしまう。initial-frame-alistに登録するのでも同様の問題がある。
(2)のウィンドウサイズ変更は、せっかくdefault-frame-alistに書いても、筆者の環境では、最初のフレームについてはこの後default-frame-alistのwidthやheightが反映されない(fontは反映される)ので、仕方なく加えた。initial-frame-alistに登録してもだめだった。
(3)は、set-fontset-fontをすぐに実行すると、この時点ではまだdefault-frame-alistに登録したフォントに切り替わっていないため、無意味になってしまう(おそらくfontset-startupに対する設定になってしまう)ので、強引だがwindow-setup-hookに登録して後で実行させるようにした。

(face-set-after-frame-default)
(set-fontset-font ...)

とすれば、default-frame-alistのフォントに切り替わり、それに対するフォントセットも作られるようで、(3)と同じ結果が得られることを確認したが、どうせ後でdefault-frame-alistのフォントへの切替が発生するし、筆者がfaceの動作を理解していないので、今回は見送った。
なお、(1)でフォントサイズを22ドットとやたらでかくしているのは、さざなみフォントが20ドット以下だとアンチエイリアスされない(20ドット以下はビットマップフォントが内蔵されているため、TrueTypeでなくそちらが使われる)為である。同様に、東風フォントだと16ドット以下と20ドットがアンチエイリアスされない。
また、筆者の環境(FreeBSD 7.3のデフォルトのfontconfig)では、さざなみフォントの場合は(3)をしなくても日本語や半角カナが表示されない訳ではない。


さて、実際にフォントが切り替わってから現在のフレームのフォントセットに対して変更を加えるのは、set-fontset-fontだけで済むのである意味単純だが、あまり美しくない。上のように苦しくなってwindow-setup-hookのコールバックでフォントを切り替えるのでは敗北感すら漂う汚さである。そもそも、普通は先にフォントセットを定義してからフォントをそのフォントセットに切り替えるものである。Xのリソースでの設定ではそのようにしかできない。

そこで、次にフォントセットの定義をやってみる。フォントセットの定義は、create-fontset-from-ascii-fontしてからset-fontset-fontするのが定跡である。次のように書くと、上の例と同じ設定になる。

(when (>= emacs-major-version 23)
(when window-system
;;(4)フォントセット"fontset-test0"の定義
(create-fontset-from-ascii-font
"Sazanami Mincho:style=Regular:size=22" nil "test0")
;;日本語→VLゴシック
(set-fontset-font "fontset-test0"
'japanese-jisx0208
(font-spec :family "VL Gothic"))
;;全角カタカナのみ、さざなみ明朝に戻す
(set-fontset-font "fontset-test0"
'(#x30a0 . #x30ff) ;カタカナ
(font-spec :family "Sazanami Mincho"))
;;半角カナ→Kappaのイタリック体
(set-fontset-font "fontset-test0"
'jisx0201
"-kappa-*-medium-i-*-*-20-*-*-*-*-*-jisx0201.1976-*")

;;(5)フォント設定
(setq default-frame-alist
(append '(
(font . "fontset-test0")
(width . 80)
(height . 24)
)
default-frame-alist))

;;(2)最初のフレームのサイズ変更
(set-frame-size (selected-frame) 80 24)
))


(2)の部分は不満だが、かなりマシになった。

参考:Emacs InfoのDefining fontsetsの章

続きを読む "EmacsのX Windowフォントの設定方法(2)" »

2010年06月02日

EmacsのX Windowフォントの設定方法(3)

次に、X resourcesでEmacsのフォントセットの定義を行ってみる。
今回は、Emacs22用の定義を~/.Xdefaultsに書いた。~/.Xresourcesでも良い。筆者の環境では.XdefaultsはEmacs起動の度に、.XresourcesはXセッション起動時のみ読み込まれ、両方ある場合は.Xdefaultsが無視される。全ユーザー共通の設定なら/usr/X11R6/lib/X11/app-defaults/以下のファイルに書いても良い。それらを以下、リソースファイルと呼ぶ。

説明の前に、リソースファイルでのEmacsのフォントセットの定義の例を示す。(ascii文字は東雲(しののめ)フォント、日本語は東風(こち)フォントにする例)

Emacs.Fontset-0: -shinonome-gothic-medium-r-normal--16-*-*-*-*-*-fontset-kochi16g,\
katakana-jisx0201:-kochi-gothic-medium-r-normal--16-*-*-*-*-*-jisx0201.*-*,\
japanese-jisx0208:-kochi-gothic-medium-r-normal--16-*-*-*-*-*-jisx0208.*-*
Emacs.Fontset-1: -shinonome-mincho-medium-r-normal--16-*-*-*-*-*-fontset-kochi16m,\
japanese-jisx0208:-kochi-mincho-medium-r-normal--16-*-*-*-*-*-jisx0208.*-*,\
katakana-jisx0201:-kochi-mincho-medium-r-normal--16-*-*-*-*-*-jisx0201.*-*

1つのフォントセットの定義は次のようなフォーマットで書く。
Emacs.Fontset-[n]: (asciiのフォント名)-fontset-(フォントセット名),\
 (文字セット名): (フォント名),\
 (文字セット名): (フォント名)...

まずフォント名であるが、筆者のFreeBSD 7.3のEmacs22はxftをサポートしていないので、フォント名は全て、ハイフンで区切られた14個のフィールドからなる、XLFD(X Logical Font Definition)表記である。XftをサポートしているEmacsではxftのフォント名を用いた別の書き方があるのかも知れないが、筆者は今の所知らない。Xftをサポートしている筆者のEmacs23でも、elispのx-list-fontsを実行するとEmacsで使用可能なフォントのリストがXLFD形式で得られるので、X Window上のEmacsのフォント設定において、XLFDと縁が切れることは当分無いと思う。
幸いにして、フォント指定時はXLFDのほとんどのフィールドにワイルドカードが使えるので、全てのフィールドを理解する必要は無い。大体、
-(フォント名)-(ファミリー)-(medium/bold)-(r/i)-normal-*-(サイズ)-*-*-*-*-*-(文字セット名)-(Encoding)
で十分と思う。mediumは通常、boldは太字、rは通常、iは斜体(Italic)である。文字セット名以降の部分は、iso8859-1ならそのまま(1がEncodingの部分)だが、jisx0208の場合はjisx0208.1983-0のようにjisx0208の後にピリオドとさらなる情報があり、さらにEncodingが0だったり1だったり2だったりするので、面倒ならjisx0208.*-*と指定するのが良い。

1行目の[n]の部分は、0から始まる連番でなければならない。Emacs.Fontset-1以上しか無ければ1つも有効にならないし、0,1,2と4以上しか無ければ0,1,2の分しか有効にならない。(過去には連番でなくてもいい方法があったような気がするが、Emacs22のInfoには見つけられなかった)

1行目のasciiのフォント名の部分は、"iso8859-1"の代わりに"fontset-(フォントセット名)"と書く。これにより、新たなフォントセットが定義される。実際のasciiのフォントは、"fontset-(フォントセット名)"の部分を"iso8859-1"に置換されたものが使われる。
iso8859-1に限らず、"fontset-(フォントセット名)"の部分を*-*にして該当する全ての(Emacsがサポートする)文字セットのフォントが、そのフォントセットのデフォルトとして使われるようである。例えば、

Emacs.Fontset-2: -shinonome-gothic-medium-r-normal--16-*-*-*-*-*-fontset-shinonome16

と書くと、iso-8859-1のみでなく、jisx0208やjisx0201についても東雲フォントが使われるようになる。
従って、1行目のasciiのフォント設定だけで足りることもある。その場合は、2行目以降と1行目のカンマ以降は不要である。

最初の例(東雲フォントと東風フォントの例)のように、特定の文字セットに対してasciiのフォントとは別のフォントを指定する時は、"(文字セット名): (フォント名)"という形式で、カンマで区切って書く。次の行に書く場合は(XLFDなら普通次の行に書くであろう)、行末に"\"(バックスラッシュ)を置いて次の行に書く。
Emacsがサポートする文字セット名は、M-x list-character-setsとすると調べられる(Emacs22以前ならM-x describe-fontsetの出力でもわかる)。
同じ行の\の後(改行コードの前)には何も書いてはいけない(直後の改行文字をエスケープするためのものであるため)。カンマの前にはスペースを入れてはいけないが、カンマの後ろなら良い。コロンも同様である。

リソースファイルへのフォントセットの定義が済んだら、それが読み込まれる状態で(自動的に読み込まれないならXを再起動するなりxrdb -mergeするなりして)Emacsを起動して確認する。最初からデフォルトのフォントを定義したフォントセットにするのは、フォントセットの定義に誤りがあるとEmacsが起動しないことがあるので、避けた方がいいと思う。
Emacsのウィンドウ上でShift+左クリックでポップアップメニューを開き、"Fontset"のメニューに定義したフォントセットが出てこなければ失敗である。
Fontsetメニューに出てきて選択可能でも、成功しているとは限らない。定義に問題があると、フォントが切り替わっても、フォントセットの定義がそのまま使われず、自動的にフォントセットが再構築されてしまうことがある。定義通りになっているかどうかは、そのフォントセットに切り替え、定義に関係する全文字セットの最低1文字ずつを含むファイルを開いた後、M-x describe-fontsetして確認する。もし、1行目に出てくるフォントセット名が、定義した名前でなく"fontset-default"や"fontset-auto??"となっていると、失敗している可能性が高い。そこはクリアしていても、一部の文字セットのフォントが正しく読まれていないかも知れないので、[]内のワイルドカードが展開されたフォント名をそれぞれ確認すると良いと思う。

1行目のmedium/bold、r/iの別は、フォントセット名と共に、フォントセットを区別する情報として用いられる。同じフォントセット名に対して、medium-r, bold-r, medium-i, bold-iのそれぞれのフォントセットを定義することが可能であり、そのようにすると、同じバッファにレギュラー体とイタリック体、細字と太字が混在する時も、それらの全てのフォントセットを設定することができる(1つのバッファに指定できるフォントセット名は1つであり、そのフォントセット名のmedium-rのフォントとかbold-rのフォントとかが使われる)。
残念ながら、medium/boldやr/iの部分を*にして、(medium/bold)-(r/i)の4通りのフォントセットを1つのEmacs.Fontset-[n]にまとめて定義することはできないようである。従って、同じフォントセット名で(medium/bold)-(r/i)の4通りを定義するには、Emacs.Fontset-[n]が4つ必要になる。
例:

Emacs.Fontset-20: -kappa-*-medium-r-normal--20-*-*-*-*-*-fontset-kappa
Emacs.Fontset-21: -kappa-*-medium-i-normal--20-*-*-*-*-*-fontset-kappa
Emacs.Fontset-22: -kappa-*-bold-r-normal--20-*-*-*-*-*-fontset-kappa
Emacs.Fontset-23: -kappa-*-bold-i-normal--20-*-*-*-*-*-fontset-kappa

今回、筆者がFreeBSD 7.3のpackagesで手当り次第に日本語のフォントをインストールして、Emacs22で使えそうなフォントを、リソースファイルにフォントセット定義として色々登録してみたものを、参考までに添付する。
リソースファイルへの記述例
Emacs.Fontset-0〜3は、intlfontsというパッケージに含まれるサンプルをそのまま使用したものである。それ以降は、筆者が主に16〜20ドットを使うので、その範囲のサイズを重点的に定義している。

参考:Emacs InfoのDefining fontsetsの章

続きを読む "EmacsのX Windowフォントの設定方法(3)" »

2010年06月06日

(FreeBSD 7.3) Emacsで多言語フォント表示

FreeBSD 7.3のpackagesの
・ar-ae_fonts1_ttf-1.1_2
・gnu-unifont-ttf-20080907
・indic-ttf-fonts-0.5.6
・junicode-0.6.17
をインストールし、.emacs.elにて

(set-fontset-font (frame-parameter nil 'font)
'ethiopic
(font-spec :family "Goha\-Tibeb Zemen"))

することにより、Emacs23でM-x view-hello-fileすると
HELLO in various languages
ここまで表示されるようになった。

続きを読む "(FreeBSD 7.3) Emacsで多言語フォント表示" »

2010年06月07日

Emacsでの全Xフォントの表示を画像化してみた

Emacsで使える色々なX Windowのフォントを、実際にEmacsで表示したらどうなるかを一覧形式で見てみたくなって、自動的にフォントを切り替えながらウィンドウイメージを画像ファイルに保存するEmacs Lispのコードを作った。

コード(elisp)
結果の抜粋
 "tt-数字"の先はTrueType(要xft、Emacs23で表示したもの)
 "tt-noaa"とあるのはTrueTypeの中のアンチエイリアスされないフォント(xft不要、Emacs22で表示したもの)
 それ以外はビットマップフォント

上記コードを実行して、


本日は晴天で酷暑あるいは氷雪でブリザードなり。

のようなバッファを表示した状態でM-x captureなどとして実行すると、次々にフォントが切り替わって画像ファイルに保存されていく。ウィンドウイメージのキャプチャーにはImageMagickのimportコマンドを使用している。
キャプチャー画像からサンプル文字列だけを抜き出すのは、同じくImageMagickのconvertコマンドを使って、シェルスクリプトで一括変換した。
例:
foreach i (*.tif)
convert -crop 700x80+60+30 $i -trim `basename $i .tif`.png
end

Trim(autocrop)できる範囲を切り出せるように、文字列部分の上下左右にたっぷりと余白を取っておくのがコツである。

キャプチャー画像を.tifで保存しているのは、convertで-trimする時に画像圧縮によるノイズに邪魔されないようにするためである。もう少しがんばって、elispで文字列の表示位置を特定してそこだけキャプチャーするようにできればかなりいい感じなのだが、そこまでするためのelispの関数を調べ切れなかった。(というか、なんとなく不可能な気がする。文字列部分を特定して切り出すImageMagickのコマンドをelispに埋め込む方が有望かも)

続きを読む "Emacsでの全Xフォントの表示を画像化してみた" »

2014年07月20日

JIRAとOpenLDAPを連携させてみる

JIRAという課題管理システムがシェアを伸ばしてるらしく、興味を持ったので、評価用ライセンスでインストールしてみた。
JIRAのユーザー管理にはLDAPが使えるとのことなので、ついでにOpenLDAPとの接続を試してみたので、その過程を記録する。

使用環境
OS: FreeBSD 9.2
packages: OpenJDK6, Tomcat6, openldap-server
JIRA version: 5.2.11

●slapd.confの設定
・inetOrgPerson, posixAccountクラス用のincludeを追加

include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/nis.schema

・ベースDN設定

suffix "dc=raffine,dc=moriguchi,dc=jp"

ldapsearch等のコマンドの利便のため、ldap.confのBASEも同じにしておくと良い。

・ルートDN(特権DN)設定

rootdn "cn=Manager,dc=raffine,dc=moriguchi,dc=jp"
rootpw {SSHA}s/98X4C3ex/vtSrL3wzP0CyRub2ZdYoL

暗号化パスワード文字列は、slappasswdで作成できる。

●基本コンテナの作成
以下の内容を、init.ldifとして保存する。

dn: dc=raffine,dc=moriguchi,dc=jp
objectClass: dcObject
objectClass: organization
o: Raffine Moriguchi
dc: raffine

dn: cn=Manager,dc=raffine,dc=moriguchi,dc=jp
objectClass: organizationalRole
cn: Manager

dn: ou=People,dc=raffine,dc=moriguchi,dc=jp
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=raffine,dc=moriguchi,dc=jp
objectClass: organizationalUnit
ou: Group

次に、ldapaddコマンドで実行する。

ldapadd -x -D "cn=Manager,dc=raffine,dc=moriguchi,dc=jp" -W -f init.ldif

パスワードが覗かれたりシェルのヒストリーに残っても良ければ、"-W"を"-w (password)"としても良い。

●ユーザー情報の登録
以下をuser01.ldifとして保存し、ldapaddで実行

dn: cn=user01,ou=people,dc=raffine,dc=moriguchi,dc=jp
objectClass: inetOrgPerson
cn: user01
sn: User No.01
mail: user01@localhost
userPassword: user01

dn: cn=user02,ou=people,dc=raffine,dc=moriguchi,dc=jp
objectClass: inetOrgPerson
cn: user02
sn: User No.02
mail: user02@localhost
userPassword: user02

dn: cn=jira-users,ou=group,dc=raffine,dc=moriguchi,dc=jp
objectClass: groupOfUniqueNames
cn: jira-users
uniqueMember: cn=user01,ou=people,dc=raffine,dc=moriguchi,dc=jp
uniqueMember: cn=user02,ou=people,dc=raffine,dc=moriguchi,dc=jp

●JIRAへのディレクトリー追加
1. システム管理メニューの"Users"→"User Directories"の画面で"Add Directory"ボタンを押し、Directory TypeとしてLDAPを選択
2. Configure画面にて以下のように設定し、"Save and Test"ボタン押下
Name: LDAP server 1
Directory Type: OpenLDAPを選択
Hostname: localhost
Username: cn=Manager,dc=raffine,dc=moriguchi,dc=jp
Password: (ルートDNのパスワード)
Base DN: dc=raffine,dc=moriguchi,dc=jp
3. "Test basic connection: Succeeded"と表示されているのを確認し、再バインド用に、"For extended testing ..."の所で 
User name: user01
として"Test Settings"ボタン押下
4. システム管理メニューの"Users"→"User Directories"の画面でuser01とuser02が追加されていること、Groupがjira-usersであることを確認

●ユーザー情報の追加
以下をuser03.ldifとして保存し、ldapaddで実行

dn: cn=user03,ou=people,dc=raffine,dc=moriguchi,dc=jp
objectClass: inetOrgPerson
cn: user03
sn: User No.03
mail: user03@localhost
userPassword: user03

dn: cn=user04,ou=people,dc=raffine,dc=moriguchi,dc=jp
objectClass: inetOrgPerson
cn: user04
sn: User No.04
mail: user04@localhost
userPassword: user04

以下をuser03m.ldifとして保存し、ldapmodifyで実行

dn: cn=jira-users,ou=group,dc=raffine,dc=moriguchi,dc=jp
add: uniqueMember
uniqueMember: cn=user03,ou=people,dc=raffine,dc=moriguchi,dc=jp
uniqueMember: cn=user04,ou=people,dc=raffine,dc=moriguchi,dc=jp

ldapmodify -x -D "cn=Manager,dc=raffine,dc=moriguchi,dc=jp" -W -f user03m.ldif

●JIRAでの確認
"User Directory"画面で"LDAP server 1"の"Synchronize"をクリックし、
"User"画面でuser03やuser04が追加されていることを確認


●ユーザー情報の登録(Posix Schemaのテスト用)
以下をuser11.ldifとして保存し、ldapaddで実行

dn: uid=user11,ou=people,dc=raffine,dc=moriguchi,dc=jp
objectClass: posixAccount
objectClass: inetOrgPerson
cn: user11
uid: user11
uidNumber: 10011
gidNumber: 10918
homeDirectory: /home/user11
userPassword: user11
mail: user11@localhost
sn: User No.11

dn: uid=user12,ou=people,dc=raffine,dc=moriguchi,dc=jp
objectClass: posixAccount
objectClass: inetOrgPerson
cn: user12
uid: user12
uidNumber: 10012
gidNumber: 10918
homeDirectory: /home/user12
userPassword: user12
mail: user12@localhost
sn: User No.12

#dn: cn=jira-users,ou=group,dc=raffine,dc=moriguchi,dc=jp
#is already used by the above groupOfUniqueName object.
dn: gidNumber=10918,ou=group,dc=raffine,dc=moriguchi,dc=jp
objectClass: posixGroup
description: the default group in JIRA
gidNumber: 10918
cn: jira-users
memberUid: user11
memberUid: user12


posixAccountは補助型なので、他に何か構造型が必要であるが、その構造型としてinetOrgPersonを選んだのは、mail属性を使用するため。
posixGroupオブジェクトのRDNは"cn=jira-users"とするのが普通だと思うが、user01.ldifの例で既に使ってしまっており、それと共存させたので、gidNumberをRDNに用いた。
ou=PosixGroupというサブグループを作って、その下に置くのがbetterだと思うが、手を抜いた。
なお、10918としたのは、A=1, B=2とするとJ=10, I=9, R=18だから。

●JIRAへのディレクトリー追加(Posix Schema)
1. システム管理メニューの"Users"→"User Directories"の画面で、
"LDAP server 1"の"Disable"をクリック(※理由は後述)し、
"Add Directory"ボタンを押し、Directory TypeとしてLDAPを選択
2. Configure画面にて以下のように設定し、"Save and Test"ボタン押下
Name: LDAP server 2
Directory Type: OpenLDAP (Read-Only Posix Schema)
Hostname: localhost
Username: cn=Manager,dc=raffine,dc=moriguchi,dc=jp
Password: (ルートDNのパスワード)
Base DN: dc=raffine,dc=moriguchi,dc=jp
3. "Test basic connection: Succeeded"と表示されているのを確認し、再バインド用に、"For extended testing ..."の所で 
User name: user11
として"Test Settings"ボタン押下
4. システム管理メニューの"Users"→"User Directories"の画面でuser11とuser12が追加されていること、Groupがjira-usersであることを確認

※Configure画面のGroup Schema Settingsセクションを開くと
Group Object Class: groupOfUniqueNames
となっているが、これを特に"posixGroup"に修正しなくても、posixGroupクラスのオブジェクトからグループ情報が取得されるようである。

●"LDAP server 1"と"LDAP server 2"の共存のための設定
ここまでの状態で"LDAP server 1"を有効にすると、use11やuser12がinetOrgPersonクラスである為、"LDAP server 1"から取得されてしまい、"LDAP server 2"のuser11やuser12が無効になり、posixGroupオブジェクトによるグループ設定も無効になり、user11やuser12がグループ無しになってしまう。
これをJIRA側で解決する方法は、2つほど考えられる。
(a) "LDAP server 2"を"LDAP server 1"より優先する
 "User Directories"の画面でディレクトリーの参照順序を入れ替えるだけである。
(b) 該当するユーザーが"LDAP server 1"から取得されないようにする
 "LDAP server 1"の"Edit"からConfigure画面に入ると、User Schema SettingsのセクションのUser Object Filterが"(objectClass=inetOrgPerson)"になっているのがユーザーの検索条件で、これを、例えば"(&(objectClass=inetOrgPerson)(!(objectClass=posixAccount)))"とすれば良い。

●ユーザー情報の追加、JIRAでの確認(Posix Schemaのテスト用)
以下をuser13.ldifとして保存し、ldapaddで実行

dn: uid=user13,ou=people,dc=raffine,dc=moriguchi,dc=jp
objectClass: posixAccount
objectClass: inetOrgPerson
cn: user13
uid: user13
uidNumber: 10013
gidNumber: 10918
homeDirectory: /home/user13
userPassword: user13
mail: user13@localhost
sn: User No.13

dn: uid=user14,ou=people,dc=raffine,dc=moriguchi,dc=jp
objectClass: posixAccount
objectClass: inetOrgPerson
cn: user14
uid: user14
uidNumber: 10014
gidNumber: 10918
homeDirectory: /home/user14
userPassword: user14
mail: user14@localhost
sn: User No.14

以下をuser13m.ldifとして保存し、ldapmodifyで実行

dn: gidNumber=10918,ou=group,dc=raffine,dc=moriguchi,dc=jp
add: memberUid
memberUid: user13
memberUid: user14

→"User Directory"画面で"LDAP server 2"の"Synchronize"をクリックし、
 "User"画面でuser13やuser14が追加されていることを確認

続きを読む "JIRAとOpenLDAPを連携させてみる" »

2014年08月24日

Tomcat7でWARがwebappsに展開されない

FreeBSD 9.2のpackagesでインストールしたTomcat7を使うと、WARファイルのdeployには成功し、正常に動作するのに、WARが$CATALINA_BASE/webapps/に展開されなかった。
筆者は昔からTomcatを使用しており、conf/server.xmlにunpackWARs="true"と書いてあれば、WARは実行時にwebapps/に展開されるものだと思っていたが、そうならなかったのである。

Webで調べてみると、Tomcat7はappBaseの外にあるWARをappBaseに展開しないと書いてあるページを見つけた。
しかし、FreeBSD 9.3のpkgngでインストールしたTomcat7では、全く同じ設定で、WARがwebapps/に展開されていたので、納得できなかった。

何が違うのだろうと思って、設定ファイルやログをいくら調べても、Tomcatのバージョンは、FreeBSD 9.2のpackagesのは7.0.40、FreeBSD 9.3のpkgngのは7.0.54と僅かに異なる以外には違いは見つけられなかった。
まさかマイナーバージョンが違うくらいで根本的な動作が変わることは無いだろうと思っていたのだが、念の為探してみると、7.0.12〜7.0.47の間のバージョンだけ、Tomcatの仕様がそのように変わっていたことがわかった。

続きを読む "Tomcat7でWARがwebappsに展開されない" »

2016年10月10日

psvn.el+Subversion 1.7がネストされたワーキングコピーでエラーになる件

筆者はpsvn.elを6年くらい愛用している。仕事でSubversionを使ってるのだが、Subversionのクライアントソフトとして、周囲がTortoiseSVNを使う中、一人で頑にpsvn.elを使っている。マウス操作やトラックパッド操作が必要なく、全てがキーボード操作で完結するのが、個人的に気持ち良いのである。

最近、仕事で使うSubversionのバージョンが1.6から1.8に変わり、それまで使っていた、2009年のバージョンのpsvn.elが動かなくなった。Subversion 1.7でワーキングコピーの形式が大幅に変わったからである。

そこで、Subversion 1.7にも対応している、最新のpsvn.el(2015-07-20版)をダウンロードして使い始めた所、ワーキングコピーのルートディレクトリにチェックアウトしたワーキングコピーでM-x svn-statusすると、

Wrong type argument: stringp, nil
というエラーが出て使えなかった。つまり、
svn co (URL1) aaa
cd aaa
svn co (URL2) bbb
とした時のディレクトリbbbの下でM-x svn-statusができなかった。
svn coの代わりに、svn propsetでsvn:externalsを指定してbbbを取得しても同じエラーになった。
ディレクトリaaaの下でsvn switchして別のワーキングコピーを取得した場合は同じ問題が起こらないのだが、あいにくURL1とURL2とでSubversionのリポジトリが異なる為に、svn switchでbbbを取得することができないのである。

これが筆者としては非常に困ったので、自力で修正してみた。
変更箇所をdiff形式で示す。

修正案1

--- psvn.el.org	2015-07-20, 21:42:00
+++ psvn.el	2016-09-30
@@ -6063,6 +6063,7 @@
         ;; it doesn't, e.g we reached / already.
         (setq parent (expand-file-name (concat wc-root "..")))
         (or (and (< (length parent) (length wc-root))
+                 (not (file-exists-p (concat wc-root (svn-wc-adm-dir-name))))  ;; stop if .svn or equivalent exists
                  (svn-status-base-dir-1 (expand-file-name (concat wc-root ".."))))
             wc-root)))))
svn-status-base-dir-1関数の中で、ワーキングコピーのルートディレクトリを探すのに、できるだけ上位のディレクトリを探すようで、上に辿る途中にエラーになるので、.svnを発見したらそれ以上遡らないようにするものである。

修正案2

--- psvn.el.org	2015-07-20, 21:42:00
+++ psvn.el	2016-10-10
@@ -3084,7 +3084,7 @@
     (let ((svn-process-buffer-name "*svn-info-output*"))
       (when (get-buffer svn-process-buffer-name)
         (kill-buffer svn-process-buffer-name))
-      (svn-run nil t 'parse-info "info" ".")
+      (svn-run nil t 'parse-info "info" default-directory)
       (svn-status-parse-info-result)))
   (unless (eq arg t)
     (svn-status-update-buffer)))
原因がよくわからないが、途中にワーキングコピーのルートディレクトリがあると、そこから1つ上に遡った時に、カレントディレクトリがdefault-directoryでなく、もう1つ上のディレクトリにずれてしまうようで、カレントディレクトリがワーキングコピー中でないと svn info . がエラーになる(*)ので、 svn info する時に常にdefault-directoryを使うように変えるものである。

どちらも適切な修正かどうかはわからないが、とりあえず筆者の環境(Linux + Subversion 1.8 + Emacs 2.4)では標記の問題は解決した。

続きを読む "psvn.el+Subversion 1.7がネストされたワーキングコピーでエラーになる件" »

About UNIX

ブログ「Weblog on mebius.tokaichiba.jp」のカテゴリ「UNIX」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

前のカテゴリはPC一般です。

次のカテゴリはウェブログ環境構築です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35