夏ですね。2008年08月06日 01時47分12秒

Namazu 開発(作業用)マシンがお亡くなりになりました。 以前より様々故障していたのを騙し騙し動かしていたのですが、boot できなくなりました。 今回はとうとうHDDのスーパーブロックが壊れちゃったみたいです。 修復には結構時間がかかりそうです。

ext3: No journal on filesystem on ide0(3,2)
mount: err 22 mounting ext3
pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed: 2
umount /initrd/proc failed: 2
Freeing unuset kernel memory: 132k freed
Kernel panic: No init found.  Try passing init= option to kernel.

Virtual PC の仮想HDDを物理ハードディスクにコピーする方法2008年08月09日 11時45分14秒

開発マシンの HDD を他の Linux に接続して、何とか修復を試みたところ、 ようやく中身が読み込めるようにはなりました。 ただ、かなりのダメージを受けてしまっていて、lost+found に沢山ファイル やディレクトリが移動されていました。

ブートも無理そうなので、別の HDD に OS をインストールした上で、 救出したファイルをコピーすることにします。

以前、Virtual PC に開発マシンとほぼ同じ環境を構築していましたので、 内容が古いとは言え、これを物理ハードディスクにコピーできれば復旧が楽そうです。

ここから本題。 Virtual PC の仮想HDDを物理ハードディスクにコピーする方法です。 仮想HDDを作成する際に、物理ハードディスクのリンク(読み込み専用のチェックは外す)として作成することができます。 Virtual PC 2007 では、物理ハードディスクにリンクされた仮想ハードディスクの使用を サポートしなくなりましたが、その前のバージョンである Virtual PC 2004 SP1 なら 物理ハードディスクにリンクされた仮想ハードディスクが使用できます。

ディスク1 に起動用 Linux の仮想HDD, ディスク2 にコピー先の物理ハードディスクにリンクされた仮想HDD、 ディスク3 にコピー元の仮想HDD として OS を起動します。

Linux が起動したら、


$ dd if=/dev/hdd of=/dev/hdb bs=512

で、ディスク3(/dev/hdd) を ディスク2(/dev/hdb) にコピーします。 (仮想CDドライブがセカンダリマスタなのでディスク3が /dev/hdd になるようです。)

コピーにはかなりの時間を要しますが、とりあえずこれで物理ハードディスクに Virtual PC の 仮想HDDの中身を丸ごとコピーすることができました。 もちろん、コピーした物理ハードディスクからのブートも可能です。

物理HDD同士のコピーならセンチュリーの「これdo台PRO」を使うと、簡単にコピーできていいのですがね。

Robocopy2008年08月20日 21時55分17秒

エクスプローラや xcopy ではディレクトリの更新日時を含めてコピーすることができません。 Robocopy では、タイムスタンプやセキュリティ アクセス制御リスト (ACL) など、 関連ファイル情報をすべて保存することもできます。

Robocopy は Windows 2003 resource kit に含まれますが、ディレクトリのタイムスタンプをコピーする /DCOPY:T オプションが指定できるのは、 GUI 版に含まれる robocopy.exe XP026 です。

http://technet.microsoft.com/ja-jp/magazine/cc160891.aspx

GUI 版をインストールすると、コマンドライン版の robocopy.exe XP026 もインストールされます。

例えば、C:\src の内容を C:\dst にタイムスタンプを含めてコピー(ミラー)するにはこのようにします。

C:\> robocopy C:\src C:\dst /DCOPY:T /MIR

※ /MIR オプションの場合、C:\dst\ にコピー前に存在するファイルは削除されますので注意してください。

Java から Namazu の検索を行うには2008年08月23日 18時39分23秒

Java から Namazu の検索を行う方法としてはいろいろあるかと思いますが、 シェアードライブラリの libnmz を Java から呼び出す方法が良いでしょう。 (Windows の場合は nmz.dll を呼び出します。)

libnmz は Perl モジュールの Search::Namazu でも利用している Namazu の検索コアライブラリで、 libnmz を利用することで簡単に Namazu の検索機能を利用することができます。
libnmz API については 「libnmz API -初級編-」 をご覧ください。

Java から libnmz を呼び出す方法としては、JNI を使います。 libnmz の主要な関数を呼び出すように実装すれば良いでしょう。
注意点としては文字コードの変換があります。 検索式を Java から libnmz に渡す時は UNICODE -> EUC-JP に変換し、 libnmz から Java へ文字列を返す時は、EUC-JP -> UNICODE に変換すると良いでしょう。 コード変換には libiconv を使うと UNIX/Windows の両方に対応できて良いでしょう。

鯰―イメージとその素顔2008年08月26日 17時02分40秒

鯰(ナマズ)―イメージとその素顔 (琵琶湖博物館ポピュラーサイエンスシリーズ)

本書は「琵琶湖博物館ポピュラーサイエンスシリーズ」の第1冊目として出版されたもの
ナマズの魅力と不思議のすべてを紹介!
鯰の最新の研究成果をもとに解説を行っています。


琵琶湖博物館のミュージアムショップで販売されているほか、一部の書店でも取り扱っています。


SWIG を使ってみてはどうでしょう2008年08月29日 22時01分10秒

libnmz の Perl バインディングには Search::Namazu があります。 また、最近 libnmz を Java バインディングとして JNI を使う話も書きました。 その他の言語から libnmz を使いたい場合はその言語用のバインディングを用意すれば良いだけです。

しかし、個々の言語用にそれぞれ専用のバインディングを用意することは大変です。 代わりに SWIG を使って共通のソースから様々な言語のバインディングを作成するのが楽で良いでしょう。 SWIG を使った方がオーバーヘッドはあるものの、生産性、保守性は高いと思います。

SWIG は Tcl/Tk、Perl、Python、Ruby、PHP 等のスクリプト言語の他、 C#, CLISP, Java 等の言語用のバインディングを作成することができるツールです。

http://www.swig.org/

Namazu の身近なところで SWIG が使われている例としては MeCab があります。 mknmz から利用している MeCab の Perl バインディングは SWIG によって生成されています。 (ちなみに Text-ChaSen と MeCab Perl バインディングの処理速度にあまり差がないのは、 SWIG のオーバーヘッドによるものではありません。お間違いのないように)

ただ、SWIG が生成したコードは、VC++ でコンパイルできないようなので、 Windows 環境のことを考えるとちょっと腰がひけてしまいますがね。 (MinGw + gcc ではコンパイルできるようですが、x64 対応とか考えると少々厄介です。)

追記:

SWIG 自体は VC++ に対応しているので、SWIG 用インターフェイスファイルを記述する時に gcc, g++ に依存しないようにすれば VC++ でもコンパイルできるかもしれません。