DAO パターン

Core J2EE Patterns – Data Access Object
データソースや製品依存の処理を隠蔽して、例えばテーブル単位でアクセス用の API を作り、insert, delete, find, update など必要な処理はインターフェイスにして、それを実装する。複数の形式に対応するにはこの DAO インターフェイスを実装すればいいだけなのがメリット。
 
DAO だけでなく、シリアル化可能な値オブジェクトの、 Transfer Object も用意しておけば、DAO とクライアントの通信では Transfer Object がレコードの代用になるため抽象度が増す。
 
説明では、複数のソースと複数のテーブルが存在するため、利便性のために Abstract Factory Method Pattern でソースタイプ毎に階層を作り、メソッドでテーブルを作れるようにしている。
 
難点は、簡易的な実装だと条件をしぼりきれずオーバーヘッドがかかりそうなことや、どうしても JDBC とかを直接さわるより開発コストがかかること。単純な実装では select で全てとって Collection にしてしまえば楽だけど、たとえば数万行のテーブルが毎回格納されるとなると大変。単純な実装とは別にシステム特化のメソッドを実装すればいいかも。

リモートから任意のコマンドを実行する

$ ssh user@host command…
– CUI でどうやるんだっけなと思って ssh(1) を見たらそのままでした。コマンドは引数をとれるが、interactive な挙動も可能。って shell の代用で動かすのだからできて当然か。公開鍵認証とかでパスワードレスにすると遠隔バッチ処理に便利。

JDK1.5 の javadoc で package.html を指定すると複数のパッケージコメントのソースと言われて警告になる

– 正しく出力されるので害はないものの、毎回警告がでていたので調べてみた。警告内容は次の通り。

javadoc: 警告 – パッケージ “x.y.z” に複数のパッケージコメントのソースが検出されました。

英語だと以下。

Multiple sources of package comments found for package “x.y.z”

Java Forums <http://forum.java.sun.com/thread.jspa?threadID=599721&tstart=0> にずばり回答が。

Yep. The Doclet interface of the Doclet API specifies a method
 
void setRawCommentText(String text)
 
prior to 1.5 this method did exactly what its name implies. With 1.5 the implementation was changed to generate a warning and do nothing if it was attempted to set the comment text multiple times.
What happens is this:
Javadoc sees the package.html files in the sources, creates an appropriate Doc (PackageDoc) instance and sets the comment text. Then for some reason Javadoc encounters package.html files for already existing Doc instances and tries to set the comment text a second (third, fourth, …) time.
So, all you need to do is to ensure that Javadoc parses the package.html file for a given package only once, i.e. ensure that only sourcepath points to the package.html files but not classpath.

1.5 から package.html が複数見付かった時に上書きしつつ、警告を出すようになったとのこと。
ここで例にあるとおり、 javadoc のオプションで、 sourcepath でパッケージのある場所を示しつつ、なおかつ classpath でも示していたのが原因だった。Eclipse ではリリースディレクトリにも package.html をコピーしてくれていて、結局それが source のものと重複してしまった。
 
そもそも不要な、classpath からリリースディレクトリ(bin)の指定を外して解決。

javadoc でパッケージの説明をつける

– package.html というファイルを、指定したいパッケージのソースディレクトリに入れれば自動で読みとってくれる。<body> ~ </body> の最初の文を、概要のほうのパッケージの一行説明に使い、それ以外はパッケージの説明ページに使われる。
<http://java.sun.com/j2se/1.5.0/ja/docs/ja/tooldocs/windows/javadoc.html#packagecomment>
– javadoc – Java AAPI ドキュメントジェネレータ: パッケージコメントファイル
JDK1.2 から利用可能。

emacs で diff

<http://www.math.s.chiba-u.ac.jp/~matsu/emacs/emacs20/ediff.html>
– Emacs 活用法: Ediff の使い方
M-x ediff-merge として、二つのファイルを選択する事で可能。そのままマージができるので便利そう。
M-x ediff-files で主に片方のファイルにするとか。
終わったら q で閉じて ediff-merge バッファをファイルとして保存すればいい。やめたくなったら C-] 。
 
Info -> Emacs -> Emerge の項目にその他コマンド等の説明があるらしい。

FreeBSD で java/linux-sun-jdk14 を使っていると "Can’t detect initial thread stack location" が出る原因

– make で表示されるインフォメーション通りにやっていないと jar で出たりする。

FreeBSD JDK, in ports/java/jdk14.
 
This Java VM will attempt to obtain some system information by
accessing files in linux’s procfs. You must install the Linux
emulation procfs filesystem for this to work correctly. The JVM
will exhibit various problems otherwise. This can be accomplished
by adding the following line to your /etc/fstab file:
 
linprocfs /compat/linux/proc linprocfs rw 0 0
 
and then, as root, executing the commands:
 
kldload linprocfs
mount /compat/linux/proc

説明通り、 /etc/fstab に

linprocfs /compat/linux/proc linprocfs rw 0 0

を追加して
$ mount /compat/linux/proc
を実行すればよい。

失敗

cat foo | sed -e ‘s/any/proc/’ > foo

ファイルの破壊、うっかりしてるとちょくちょくやる。 foo は 0 byte になってさようなら。これを回避するには、

sed -e ‘s/any/proc’ foo

でよい。

tmpfs

メモリ上に置ける FileSystem.
次のようにして使う.

mkdir /var/lib/mysql/shm
mount -t tmpfs -o size=1024m tmpfs /dev/shm
mount -t tmpfs -o size=1024m /dev/shm /var/lib/mysql/shm

Apache を簡単に chroot する

ports:www/mod_chroot
(http://core.segfault.pl/~hobbit/mod_chroot/)
Apache13 でも問題なく動くようにテストされてるけど 20 以降だとさらに手軽にできるとか書いてる.
mod_security の chroot 特化バージョンという位置付け.
ただし Directory, Location, VirtualHost の中には入れられない.
 
追記(2008-03-21):
FreeBSD の ports を使って Apache22 で試したところ、問題なくビルド、インストールできました。
VirtualHost を使っている場合は、VirtualHost ごとに chroot にするのではなく共通の chroot を使い, Apache を root 権限実行して VirtualHost ごとに所有者を分け, DocumentRoot を 0700 にして suexec で所有者権限でしか実行できなくするのが望ましいかもしれません。

SSH を SOCKS Proxy として使う

ssh -D port remort オプションで ssh クライアントが SOCKS サーバになる. PuTTY でもトンネルという機能でできますな.
あるいは Port Forwarding + tinyproxy で ssh -L 8888:localhost:8888 remotehost みたいな.
AAAA を持った web サーバにアクセスすると空白ページになる.. IPv6 が甘い? FireFox で試しても空白ばっかでよくわからず..
追記: 以下のようにすることで IE で成功.
1. PuTTY の設定でトンネル追加に Dynamic, IPv4 チェック, Listen するポートを任意のポート(8888)に設定. 宛先は空にする.
2. IE の proxy 設定で SOCKS を localhost:8888 にし, それ以外のプロトコルを空白にする.
3. ブラウザでローカルネットワークを叩く.
<http://google.co.jp> とかやったら PuTTY が強制終了した…
追記 : 結構頻繁に切れる. Firefox/Thunderbird では proxy をドメインやホスト名でなく IP アドレスにしないとつながらないとかいう現象もあり(Thunderbird 1.0).