2007-11-19

Xen 3.1.2 Released

Xen 3.1.1からのさらなるバグフィックスリリース。

[Xen-devel] ANNOUNCE: Xen 3.1.2 released!

Gentooなら Portageにもう入ってる。

ラベル:

2007-11-18

OpenJPA 1.0.1 Released

1.0のメンテナンスリリース。

リリースノート
ダウンロード

openjpa-1.0.0.jar を openjpa-1.0.1.jar に差し変えるだけで良さそう。

ラベル:

Mac OS Xで、rm -fコマンドでも削除出来ないファイルが出来てしまった時の対処

BSDではファイルにフラグというものが付けられるらしく、Immutable というフラグがついていると rm -f コマンドでも消せない。
Finderからファイルを「ロック」するとこのフラグが付くようだ。ロックを解除するか、いったんゴミ箱に捨てて ShiftキーとOptionキーを同時に押しながらゴミ箱を空にすると消せるようだが、Finderからロックした覚えなどないのに、なんらかの拍子にたくさんのファイルが Immutableになってしまった場合(TigerからLeopardに移した一部のファイルでそうなった)など、その方法では日が暮れてしまう。

コマンドラインでファイルから Immutableフラグを剥奪するには
chflags -R nouchg (filename)
とする。

CXFで作ったWebサービスからHttpServletRequestにアクセスしたい

SpringとApache CXFで簡単に Webサービスを作る の続き。

本来HTTPに依存しないはずのSOAPとはいえど、非Webサービス(普通のHTMLベースなWebアプリケーション)との連携を簡単にするためには HTTP Cookieでの状態保持に対応するのが現実的だ。

理想のことはともかく Webサービスから HttpServletRequestなど HTTPに依存するコンテキストにアクセスしたい場合、 javax.annotation.ResourceアノテーションでWebサービスフレームワークにその事を教えてやることによってコンテキスト情報へアクセスするための仲介オブジェクト javax.xml.ws.WebServiceContext をインジェクトしてもらえる。
@Resource private WebServiceContext context;
public void setContext(WebServiceContext context) {
this.context = context;
}
この contextオブジェクトから HttpServletRequestの参照へたどり着くには、
MessageContext ctx = context.getMessageContext();
HttpServletRequest request =
(HttpServletRequest) ctx.get(AbstractHTTPDestination.HTTP_REQUEST);

のようにする。あとはクッキーでもセッションでもクライアント情報でも好きなようにどうぞ。

えーと、うちはWebサービスの実装クラスをシングルトンにしてるんだけど(Springで普通にやるとそうなる)、大丈夫なのこれ?という疑問が沸いたので Apache CXFのソースを調べてみたところ、WebServiceContextの実装で ThreadLocalなデータを持ってるようだったのでそこらへんはケアされてるのだろうと判断した。
リモートメソッドのコンカレントな呼び出しも試したところ、ちゃんと同時実行されているようだったので、synchronized { /* リクエストのはじまりからおわりまで */ } みたいなアホアホ実装でもないらしい。ちゃんとしてるね。あたりまえか。

2007-11-14

PostgreSQLのTimestamp型フィールドでマイクロ秒を切り捨てようとした時の動作がアホアホな件について

PostgreSQLには date_trunc() っていう関数があって、指定した日付時刻フィールド未満の値を切り捨て出来るんだけど、
他の処理系ではまず扱ってもらえないマイクロ秒を切り捨てようとして

date_trunc('milliseconds', timestamp '2007-11-14 19:49:56.487924')

のようにしたら何故か '2007-11-14 19:49:56.488' を返してきた。( 8.0.13, 8.2.4で確認 )
その動作は truncじゃなくて round っていうんじゃないだろうか。さーせん、これ仕様ですかバグですか。

しょうがないので - interval '00:00:00.000500' してから date_truncにかけるようSQLを修正。
というか、だいたいマイクロ秒なんて本当にちゃんと計測して入れてるのか?
マイクロ秒対応と言いたいだけちゃうんかと小一時間(以下略)

Apache CXF 2.0.3 Released

Webサービスでthrowした例外をAegis-Bindingsがちゃんと処理できるようになったように見える。
その他、型バインディング周りを含む多数のバグフィックス。Performance Improvementはなさそう。

cxf-2.0.2-incubator.jar → cxf-2.0.3-incubator.jar
XmlSchema-1.2.jar → XmlSchema-1.3.2.jar

2007-11-10

xinetdのサービスで IPv6を有効にする

ローカルの Subversionリポジトリにアクセスしようとしたら名前解決のとこでIPv6のリンクローカルアドレスを引いてきてしまって、しかも svnはIPv4にフォールバックしちゃくれないのでそのまま Connection refused. って言われて終わってしまい困っている全国1万人の皆さんこんにちは。

ここでIPv6を切るという後ろ向きな選択がテクノロジの発展を(以下略)!
あとそこのおまえ、svn over sshにすりゃいんじゃネーノ?っていうな。アカウント作るまでもない用途ってのもあるんだ。それに Windowsと相性悪いっつーか Windowsで喜んでSSHを使おうとするやつの気が知れねー(めんどくさすぎ。というかWindowsにそういう文化がないから人に使い方を説明するのが特に面倒)

で、xinetdで svnserveを動かしてる場合、IPv6にも対応するには(注:リンクローカルのみ想定):
service svn {
: 略
flags = IPv6
only_from = ::1 fe80::/16
}
svnプロトコルで話したければ IPv6でアクセスしな!という過激派諸氏は上の設定で。そうでないなら only_from に IPv4のアドレスも書くべし。

flags = のとこに IPv4 IPv6 って書くと「両方指定すんな」って言われてサービスが無効にされちゃうので注意だ。

2007-11-04

Rubyで Sennaを使って全文検索を行う

全文検索エンジン Senna には Rubyバインディングが標準で添付されている。
N-GRAM, UTF-8キメ打ちですぐに Rubyから Sennaを使う手順をメモ。

まずはSennaをインストールする。今回は N-GRAM決め打ちなので MeCabは入れない。また、デフォルトエンコーディングをUTF-8にする。そのための configureは下記。
./configure --without-mecab --with-encoding=utf8

configureが終わったら make && make install で /usr/local 以下に Sennaがインストールされる。
NFKC正規化エンジンのコンパイルにものすごくメモリと時間がかかるので注意されたし。マシンがチープでどうしてもリソースが不足している場合はconfigureの時に --enable-nfkc=no を付ければその機能を外せるかもしれない。

Sennaのインストールが出来たらソースツリー内の bindings/ruby に移動し、ruby extconf.rb で Makefileを生成、make && make installすると Rubyバインディングがインストールされる。

Rubyから Sennaを使用するには require 'senna' とする。
下記はいくつかの呼び出し例。

■インデックスを新規作成する
index = Senna::Index::create("hoge",0,Senna::INDEX_NGRAM | Senna::INDEX_NORMALIZE)
これで
hoge.SEN
hoge.SEN.i
hoge.SEN.i.c
hoge.SEN.l
というファイルが作成される。これらがワンセットになってひとつのインデックスとなる。

■既に存在するインデックスをオープンする
index = Senna::Index::open("hoge")

■インデックスに文書を追加する
index.upd('123',nil,'ぎゃぼっ')
第一引数は文書ID(key)。任意のFixnumまたは文字列
第二引数は変更前文書の内容。追加の場合 nilまたは '' で良い。
第三引数はインデックスに追加したい文書の内容。

■インデックスから単一キーワードで文書を検索する
r = index.sel('ぎゃ')
if r != nil then
r.each {|key,score|
...
}
end


■インデックスをクローズする
index.close

Sennaはオリジナルの文書を保存しないため検索の実行結果は文書IDやスコアのみとなることに注意。
オリジナルの文書を保存する必要がある場合呼び出し側で行わなければならない。

プログラム言語への直接バインディングでは使い方が難しいという人には MySQLへの組み込み(Tritonn)やPostgreSQLへの組み込み(Ludia)をお勧めする。データベース側の環境設定やチューニングが難しいと感じるかもしれないが、SQLだけでインデックス作成と全文検索が実行できるためプログラムは簡単になる。

Sennaがなんだかエラーを返してきてうまく動かない場合は、/var/senna/log ディレクトリを作成して書き込めるようにパーミッション設定をするとログがそこに書き出されるので原因を探す助けになるかもしれない。必要に応じて自分で Sennaのソースにログ出力のコードを足しても良いだろう。

2007-11-03

iShowU, Keynote, iMovie, Garagebandで制作したプレゼン動画

※先日mixiにも載せたものです

iShowUという画面録画ソフトを購入したのでKeynoteの練習がてら作ってみた。

Introduction to てきとうSNS

iShowU - 画面録画
Keynote - プレゼンテーション
iMovie HD - 映像編集
GarageBand - 楽曲作成

2007-11-01

FlashのFileReferenceがLeopardで動かない

Flash(Flex)でサーバにファイルをアップロードする唯一の機能である FileReferenceが Mac OS X 10.5 Leopardで動作しない。各所で問題になっており致命的。Adobeが悪いのかAppleが悪いのか知らないが、早急に直してもらわないと困る。

■追記■
最新の Flash Playerで直った。

Macで動作するSOAP呼び出しのテストツール

Mac SOAP Client

たまたま発見した便利ツール。これでわざわざサーバ側デバッグのために Flex Builderを起動しなくてもいいぞと。

Mac OS Xネイティブで SOAP呼び出しをするための APIについてはこちら