昔(2006年頃)Fedora 4か5で作成したLDAPのデータをFedora 10で使おうとしたら、DB_CONFIGファイルがないとか、いろいろSELINUX関係の問題があって、それはそれでクリアして、slapdサーバは一応動作したのだが(あなただれみたいな簡単な質問には応える)、/var/lib/ldap内のBerkeley DBのフォーマットがかなり違っているのか、単にコピーしてきただけではダメであった。ハードディスクは残っていたので、eSATA変換アダプターでせっかくコピーしたのにである。
実際にはLDIFフォーマットでのバックアップがあったので、まず、/var/lib/ldapのディレクトリをもとのF10(Fedora 10のことをこういうらしい)のものに戻し(mvコマンドで名前を変えただけ)、うまくいかなかったディレクトリは記念に他の名前に変更した。
そして、
ldapadd -v -x -D cn=ある管理名,c=jp -W -f sdp4-20060410.ldif -h あるホスト -p 389
-p 389はデフォルトなので本当はいらない。
-x はデフォルトの認証がSASLであるので単純なパスワード認証をしてしている。
-D は追加コマンドなのでLDAPのルート管理者(UNIXのルート管理者ではない)を指定するもの。
-Wはパスワードを聞いてくれということ。
-f はファイル名を指定する。
-h はLDAPサーバが動作しているホストを示す。
-cを追加すると、すでに存在しているというエラーを表示はするが、操作を継続(continue)できる。
などとして追加した。
検索は
ldapsearch -v -x -h 127.0.0.1 -p 389 -b ‘c=JP’ ‘(objectclass=*)’
などとする。
-bはベース(そこからサーチしたい)
(objectlass=*) はサーチしたいもの。personとか組織とか全部をサーチしたいのでこのようにする。シングルクオートはunixのshellの特殊記号とぶつからないようにつける。カッコや*が衝突するので。
-vは検索時のようすを詳しく知りたいのでVerbose指定にしてある。
-h 127.0.0.1はlocalhostに問い合わせている。
設定ファイルの
/var/lib/pgsql/data/postgresql.conf
の
#listen_address = ‘localhost’
とある行を
listen_address= ‘*”
に変更すること。デフォルトではlocalhostつまり127.0.0.1
でlistenするので、他のホストからの接続要求はインタフェースが違うので無視されてしまう。
または
/etc/initt.d/postgres
に-iをつけること
ただし、接続可能ホストは
/var/lib/pgsql/data/pg_hba.conf
という
host based address restriction file
に認証方法と一緒に記述すること。
openjdk ICE版ではだめだったので、
http://plugindoc.mozdev.org/linux-amd64.html
にあった方法で試した。
基本的には、sun から1.6.0_18(でなくてもよいだろう)のjdkを持ってきて、
chmod +x そのrpm.binファイル
su
./そのrpm.bin
としてインストールしたあとに、
ln -s /usr/java/jdk1.6.0_18/jre/lib/amd64/libnpjp2.so /usr/lib64/mozilla/plugins/libnpjp2.so
そしてfirefoxを再起動!
about:pluginで以下のような状態であればOK。

32ビット版に比べると遅い!
tomcatを使ってかなり年月がたつが、ログの管理がもう少しどうにかならないかと思うことがたびたびあった。
そこで、ここで公開します。
tomcatのディレクトリ/bin/catalina.shの実際にtomcatをstartで走らせるところで、以下のようにします。
elif [ "$1" = "start" ] ; then
touch “$CATALINA_BASE”/logs/catalina.out
if [ "$1" = "-security" ] ; then
echo “Using Security Manager”
shift
(“$_RUNJAVA” $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs=”$JAVA_ENDORSED_DIRS” -classpath “$CLASSPATH” \
-Djava.security.manager \
-Djava.security.policy==”$CATALINA_BASE”/conf/catalina.policy \
-Dcatalina.base=”$CATALINA_BASE” \
-Dcatalina.home=”$CATALINA_HOME” \
-Djava.io.tmpdir=”$CATALINA_TMPDIR” \
org.apache.catalina.startup.Bootstrap “$@” start \
2>&1 | /usr/sbin/rotatelogs “$CATALINA_BASE”/logs/catalina.out.%Y%m%d 86400 540 > /dev/null 2>&1 ) &
if [ ! -z "$CATALINA_PID" ]; then
echo $! > $CATALINA_PID
fi
else
(“$_RUNJAVA” $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs=”$JAVA_ENDORSED_DIRS” -classpath “$CLASSPATH” \
-Dcatalina.base=”$CATALINA_BASE” \
-Dcatalina.home=”$CATALINA_HOME” \
-Djava.io.tmpdir=”$CATALINA_TMPDIR” \
org.apache.catalina.startup.Bootstrap “$@” start \
2>& 1 | /usr/sbin/rotatelogs $CATALINA_BASE”/logs/catalina.out.%Y%m%d 86400 540 >/dev/null 2>&1) &
if [ ! -z "$CATALINA_PID" ]; then
echo $! > $CATALINA_PID
fi
fi
(編集後記:startup.sh secuirtyではなく、startup.shだけの場合もあるので、elseの場合も同様なコマンドを追加した)
このようにこのプロセスでパイプでファイルを拾い、ファイル名を日付でつけていくほ方法が単純でいいのである。なぜならログを書き出す側は全くどこに書き出しているかを意識しなくていいのであって、パイプでつないだプログラムにお任せしてしまえばいい。反対に、外部の別のプログラム(crontab)
で無理やりファイル名を変更する部分は問題がないだろうが、catalina.outというファイル名が12月31日を越えたあたりで12月31日のファイルという名前になって、新年を迎えるが、新年のファイルを気ままに作成しても、書き込み方法が、
1. Appendでファイルを開く、
2. 書く
3. ファイルを閉じる
という風になっていれば問題は小さいが((1.でファイルを開きなおしているので、ファイルが新しく他人によって作成されても問題ない)、これでは効率がかなり悪い。
ということで、javaの場合はファイルは開いたままで単純に書くのが効率がよいので、ファイルが開かれたまま書きつづける。どこに?
ファイルが指し示すi -nodeは12月31日という名前にリネームされたファイルであるので、そこに書き続けることになる。そこで、catalina.outというカレントファイル(現在大きさがゼロ)に書かせるには、tomcatにファイルをもう一度開き直すように言わねばならない。しかし、そのような仕掛けはない。
別のシステムとしてsyslogインタフェースでログを書く場合があるが、これもログを書き込む側と通信で(UDP)接続しているという意味では上記のパイプと似た手法である。
また、同一のtomcat内でいくつかのアプリケーションで共通のログファイルを使って、log4jのサイズや日付などでファイル名の切り替えを行う処理をよかれと思ってしていると別のスレッドと内部でファイルの競合が起きて、行が交じり合ってかついろいろな日付の行がめちゃくちゃになって、という事態に遭遇する。また外部プログラムとの競合も起きる。できるプログラマーに限ってそういう目にあったりする。
もっと問題なのは、ログの設定を何度も至るところで行っていると、ファイル等がどうなるかは、神のみぞ知るという漢字になる。
tomcat6になって、libがひとつだけになって大変うれしい。またローダーの仕様もすっきりしたようだ。むかしはこのディレクトリなるものは、commonやsharedやserverやいろいろあって、私はそれに対しては大変批判的であった。ユーザのCLASSPATHを優先するとかあたり前の決断をよくしてくれた!!実はわかったふりをしている人間もよくわかっていなくて苦労していたようだ。その極めつけはcommons loggingであった。その著者もざんげをしたりしていたが、ともかくcommons loggingも禁止の方向ということで大変めでたい。わかんない!と言うところから理解が始まるのでは?盲目的な洋物万歳主義は権威主義に依存することになり、広く自由で理性的な思考を抑圧することになるので避けたい。
相変わらず、不況で少し暇なので、むかし棋聖堂というところで発売していたC60パズルの解答を3d的に表示してみることにした。
解いたときには、シュタイナー展開という、1つの面を取り除くと2dの平面の多面体(オイラー標数を求める場合に使う)に還元される方法を使った。
ホモロジーではかなり本質的な計算をしていたが、初等数学での証明もかなり面白い。
JavaViewは
http://www.javaview.de/
からダウンロードできる。(アプレットを動かすだけならダウンロードの必要はない)
今回は解答の面の色分けだけが問題なので、プログラムを組む必要はなくJava View XML(JVXフォーマット)というもので、解答を作成した。
http://www.melange.co.jp/c60solution.html
を見てもらえたらと思う。
ブラウザーではjavaをenableしておくこと。
長年、同じようなことをしていると、ついつい昔のプロジェクトのファイルを使いまわしたりするので、
究極の簡単な設定ファイルをコメントつきで記述しておくことにした。
以下のようなlog4j.propertiesをクラスパスに置くだけでよい。
##下記で、ルートカテゴリー(デフォルト)のログレベルをinfoに,Appenderをstdoutという名前にした。
log4j.rootCategory=info, stdout
## ここからはstdoutというAppenderの定義である。
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#右辺はそのままにすること。または自分で作成してもよい。
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#これもそのままのクラスを使うのがよい。
log4j.appender.stdout.layout.ConversionPattern=%d <%-5p> (%t) [%F:%L]- %m%n
## AppというAppenderの定義を以下のようにする。
## (DailyRollingFileAppenderであるので日付でファイル名が変更される)
log4j.appender.App=org.apache.log4j.DailyRollingFileAppender
log4j.appender.App.File=/home/hitoh/tomcat/logs/app.log
log4j.appender.App.DatePattern=’.'yyyyMMdd
# app.log.20100115にようなファイル名になる。
log4j.appender.App.layout=org.apache.log4j.PatternLayout
log4j.appender.App.layout.ConversionPattern=%d <%-5p> (%t) [%F:%L]- %m%n
## 普通の場合(常に同じファイル)
#log4j.appender.App=org.apache.log4j.FileAppender
#log4j.appender.App.File=log4j.log
#log4j.appender.App.layout=org.apache.log4j.PatternLayout
#log4j.appender.App.layout.ConversionPattern=%d <%-5p> (%t) [%F:%L]- %m%n
# パッケージ名によりレベルを変える
# これがとても柔軟にできている部分である。
log4j.category.net.sf.hibernate=warn
log4j.category.jp.co.melange.lgwan=debug, App
#AppというAppenderにも出力される。
log4j.category.jp.co.melange.zip=debug
# ZIP(郵便番号)関係のパッケージではレベルをdebugにする。
年末にインターネットでEE関係の記事を探していたら、三菱UFJは再起動しないで、ソフトの修正ができるようなものを求めていたというような記事を読んだ。
弊社でも、テストモードでは面倒なので、ant でwarファイルをコピーするだけで再起動なしで便利!というような使い方をしていたので、紹介する。
(あとにつづく)
tomcat 5では、
<Host name=”mel1″ appBase=”webapps”
autoDeploy=”true” deployXML=”true” liveDeploy=”true”
xmlValidation=”true”
unpackWARs=”false” debug=”0″ >
とし、かつContext用のXMLファイルを
~/tomcat/conf/Catalina/localhost/
に(上記のホストでlocalhostとしているから最後がlocalhostになるのだが)、
zip.xmlという名前で
<Context path=”/zip” reloadable=”true” docBase=”/home/hitoh/tomcat/webapps/zip” debug=”1″/>
というふうな感じで書いておくと、ant jarしたら即座にそれが反映されるようになる。これをしないとまったく再ロードしないようだった。
ant jarでは、~/tomcat/webapps/zip/WEB-INF/libにzip.jarをコピーしている。zip.jarについては、「郵便番号で住所を探すajax」という投稿で利用しているjarである。
このコンテクストには普通はdbcp(Database connection pool関係やデータソースを定義するところである)
tomcat 6での同様だった。
ログをみると、
2010-01-15 17:15:43,661 <INFO > (http-8080-1) [GetAddress.java:26]- try to make ZIPFind … with zip7=2540043
2010-01-15 17:15:43,663 <INFO > (http-8080-1) [GetAddress.java:28]- made ZIPFind instance
2010-01-15 17:15:43,705 <DEBUG> (http-8080-1) [ZIPFind.java:37]- connected ..
2010-01-15 17:15:43,712 <DEBUG> (http-8080-1) [ZIPFind.java:39]- sql is select ken, city, cho from zip where zip7=’2540043′
2010-01-15 17:15:43,753 <INFO > (http-8080-1) [ZIPFind.java:47]- ken = 神奈川県, city=平塚市, cho = 紅谷町
2010/01/15 17:17:16 org.apache.catalina.core.StandardContext reload
情報: このコンテキストの再ロードを開始しました
2010-01-15 17:17:26,750 <INFO > (http-8080-1) [GetAddress.java:26]- try to make ZIPFind(zip7=2540042)
2010-01-15 17:17:26,753 <INFO > (http-8080-1) [GetAddress.java:28]- made ZIPFind instance
2010-01-15 17:17:26,756 <DEBUG> (http-8080-1) [ZIPFind.java:37]- connected ..
2010-01-15 17:17:26,757 <DEBUG> (http-8080-1) [ZIPFind.java:39]- sql is select ken, city, cho from zip where zip7=’2540042′
2010-01-15 17:17:26,802 <INFO > (http-8080-1) [ZIPFind.java:47]- ken = 神奈川県, city=平塚市, cho = 明石町
というふうに、かってに再ロードしたといっている。try to make ZIPFind(zip7=2540042)に変更されているのであたらしいzip.jarが反映されている。
しかーし、これには欠点があって、少し遅くなるらしい。
というものを作成してみた。これは、郵便番号関連のCSVファイルを総務省がOpenにしているので、
それをダウンロードし、postgresにいれ、ajaxで使えるようにした。
http://www.melange.co.jp:8081/zip/zip.html
でいけるはず。
郵便番号を入力してから、TABを押すと、住所が埋まる。
これは、日経ソフトウエア2009年12月号特別付録の簡単10分プログラミングレシピのWSH(Windows Script Host)で書かれていたものをjava + postgreSQLで書き直し、ajaxで利用可能にしたもの。HTTPRequestの部分にブラウザーごとの違いなどを書きたくないので、dojo.jsを利用した。
サーバ側はtomcat 6である。
郵便番号のCSVデータは地方自治体の合併などで頻繁に変わるようである。また対応が1:1でないことがたまにあるが(同じ番号で2通りの地名があったり、あるはその逆がある)、今回は最初に求まったものを返すようにした。行内の県名や町名などのフィールドを貼り合わせているだけ。
このログを見ると、
2010-01-15 17:36:15,532 <INFO > (http-8080-1) [GetAddress.java:26]- try to make ZIPFind(zip7=2540044)
2010-01-15 17:36:15,533 <INFO > (http-8080-1) [GetAddress.java:28]- made ZIPFind instance
2010-01-15 17:36:15,536 <DEBUG> (http-8080-1) [ZIPFind.java:37]- connected ..
2010-01-15 17:36:15,536 <DEBUG> (http-8080-1) [ZIPFind.java:39]- sql is select ken, city, cho from zip where zip7=’2540044′
2010-01-15 17:36:15,539 <INFO > (http-8080-1) [ZIPFind.java:47]- ken = 神奈川県, city=平塚市, cho = 錦町
となっていて、sqlの実行が0 mili secであることがわかる。数百nanoはかかっているのだろけれど。また、connection poolを使っていないので、接続に時間がかかっているようだ。
wordpress-2.9.1.zipをダウンロードし、解凍し、できたファイルたちをサブディレクトリごと/var/www/html/blogにコピーしてapacheの再起動をした。
DBはかってにアップデートされた。簡単。ついでにしばらくテーマをiphone-likeにして見る。前のバージョンでは日本語がおかしかった部分が直っている。
2年ほど前にJavaのグラフ表示用サーバプログラムをサーブレットで利用したことがあるが、最近はRIA(Rich Internet Application)がはやっているので、クライアント側のCPUで処理したほうがイベントへの反応等については良好な結果が得られるはずということで、AIRのデモンストレーションについてきたサードパーティー(KAPLAB)のCommunity versionなるものを使ってみた。本来はFlex SDKで十分なんだと思うが、いろいろなリソースの配置がよくわからないので、Flex Builder 3の60日限定試用版で作成してみた。これは使用方法が簡単であった。昔からのemacsでのコンパイルとは違って新鮮であった。2年ほど前もEclipseでがりがりとコーディングしていたこともあるが、編集部分はemacs風であればいいのにと思った(慣れの問題であるが)。
実際には大体のところで日本語が使えるか否かを調べただけ。また、DataGridのイベントが拾えるかどうかとか。
http://www.melange.co.jp/air/RadarChart/RadarChartDemo.html
にその例がある。