filter/zip.pl の修正2008年09月02日 01時36分30秒

zip.pl: (HEAD, development-2-1, stable-2-0)

以前の修正で、$$contref の中身を空にする処理が抜けてしまったので再度修正です。

unzip 版の時しか不具合が生じなかったので気づくのが遅れました。

開発マシンは修復中なのですが、現状の環境でのコミットのテストも兼ねています。

SWIG を使ってみよう! [第1回] Perl 編2008年09月04日 01時32分21秒

SWIG を使って libnmz の様々な言語用のバインディングを作成してみましょう。

最初は UNIX 環境で libnmz の nmz_get_version を呼び出すことを考えます。

nmz_get_version は、namazu/libnamazu.h に定義されています。

extern char *nmz_get_version();

この関数は libnmz の Namazu のバージョンを文字列で返す関数です。 (Namazu 2.0.13 以降利用可能です。libnmz のバージョンを返すわけではありません。)

今回はこれを Perl から呼び出す Perl バインディングを作成してみましょう。 (libnmz の Perl バインディングとしては Search-Namazu がありますが、 現在の Search-Namazu は nmz_get_version に対応していません。)

モジュール名を決めます。ここでは Sample というモジュール名にします。 SWIG 用インターフェイスファイルを Sample.i という名前で作成します。

%module Sample
%{
#include "namazu/libnamazu.h"
%}
char *nmz_get_version();

swig コマンドを使ってラッパ用コードを生成します。

$ swig -perl5 Sample.i

実行すると Sample_wrap.c が生成されます。

次に Perl 用モジュールを作成するために Makefile.PL を用意します。

use ExtUtils::MakeMaker;
WriteMakefile(
    'NAME'   => 'Sample',
    'INC'    => '-I/usr/local/include',
    'LIBS'   => '-L/usr/local/lib -lnmz',
    'OBJECT' => 'Sample_wrap.o'
);

Makefile.PL から Makefile を作成します。 (Namazu を /usr/local にインストールした場合)

$ perl Makefile.PL

make を実行します。

$ make

Sample モジュール(Perl バインディング)が作成されました。

インストールして使うこともできますが、ここではカレントディレクトリにリンクして使ってみましょう。

$ ln -s blib/arch/auto/Sample/Sample.so .

Sample モジュールを呼び出す Perl プログラム main.pl を作成します。

#!/usr/bin/perl

use Sample;

print Sample::nmz_get_version() . "\n";

このプログラムは nmz_get_version の値を表示するだけの単純なプログラムです。 実行すると、Namazu のバージョンが表示されます。

$ perl main.pl
2.0.18

非常に簡単な例ですが、SWIG を使って libnmz を Perl から利用する方法をしめしました。 他の関数も同様に呼び出すことが可能です。いろいろと工夫してみてください。 ここでは Perl を使いましたが Java 等の SWIG がサポートしている他の言語から利用することもできます。

[お断り]

  • SWIG Version 1.3.36 を使用しました。
  • perl v5.8.0 を使用しました。
  • Namazu 2.0.18 を使用しました。
  • libnmz は GPL ライセンスです。libnmz を動的であれ、静的であれリンクして使用するプログラムは GPL ライセンスと 矛盾しないライセンスである必要があります。
  • SWIG を用いて作成した Sample モジュールは libnmz をリンクしますので、GPL ラインセンスとして公開します。
  • Sample モジュールは GPL ライセンスですので、Sample モジュールを利用するプログラムは GPL ライセンスと矛盾しないライセンスでなければなりません。ご注意ください。

SWIG を使ってみよう! [第2回] Java 編2008年09月08日 20時24分51秒

SWIG を使って libnmz の様々な言語用のバインディングを作成してみましょう。

今回は UNIX 環境(Linux)で Java から libnmz の nmz_get_version を呼び出すことを考えます。

モジュール名は前回と同じ Sample とします。 SWIG 用インターフェイスファイルを Sample.i という名前で作成します。 中身は前回と全く同じです。

%module Sample
%{
#include "namazu/libnamazu.h"
%}
char *nmz_get_version();

swig コマンドを使ってラッパ用コードを生成します。 今回は Java 用ですので引数に -java を指定します。

$ swig -java Sample.i

実行すると Java 用の Sample_wrap.c と Sample.java, SampleJNI.java が生成されます。 (JNI を用いて C ライブラリを呼び出します。)

javac で Sample.java, SampleJNI.java をコンパイルします。

$ javac Sample.java SampleJNI.java

Sample.class, SampleJNI.class が生成されます。

次に Sample_wrap.c をコンパイルします。 (ここでは Linux + J2sdk1.4.2_18 での例をしめします。)

$ gcc -c Sample_wrap.c -I /usr/java/j2sdk1.4.2_18/include 
       -I /usr/java/j2sdk1.4.2_18/include/linux
$ gcc -shared Sample_wrap.o -o libSample.so -L /usr/local/lib -lnmz

Java バインディングの Sample モジュール(Sample ライブラリ)が作成されました。

インストールして使うこともできますが、ここではカレントディレクトリに生成したライブラリをそのまま使ってみましょう。

Sample ライブラリを呼び出す Java プログラム を main.java という名前で作成します。

public class main {
  static {
    try {
        System.loadLibrary("Sample");
    } catch (UnsatisfiedLinkError e) {
      System.err.println("Native code library failed to load. See 
          the chapter on Dynamic Linking Problems in the SWIG Java 
          documentation for help.\n" + e);
      System.exit(1);
    }
  }

  public static void main(String argv[])
  {
    // Print out the value of some enums
    System.out.println(Sample.nmz_get_version());
  }
}

このプログラムは nmz_get_version の値を表示するだけの単純なプログラムです。 コンパイルして main.class を生成します。

$ javac main.java

実行すると、Namazu のバージョンが表示されます。 カレントディレクトリにある Sample ライブラリを利用するため、引数でパスを指定しています。

$ java -Djava.library.path=. -cp . main
2.0.18

非常に簡単な例ですが、SWIG を使って libnmz を Java から利用する方法をしめしました。 モジュールの生成方法は各言語ごとに異なりますが、 Perl の時に使ったものと同じインタフェースファイルから作成できることが分かったかと思います。 他の言語でも同じように利用することができますので、いろいろと工夫してみてください。

[お断り]

  • SWIG Version 1.3.36 を使用しました。
  • java version "1.4.2_18" を使用しました。
  • Namazu 2.0.18 を使用しました。
  • libnmz は GPL ライセンスです。libnmz を動的であれ、静的であれリンクして使用するプログラムは GPL ライセンスと 矛盾しないライセンスである必要があります。
  • SWIG を用いて作成した Sample モジュールは libnmz をリンクしますので、GPL ラインセンスとして公開します。
  • Sample モジュールは GPL ライセンスですので、Sample モジュールを利用するプログラムは GPL ライセンスと矛盾しないライセンスでなければなりません。ご注意ください。

ActivePerl 5.8 Build 824 リリース2008年09月08日 21時19分35秒

ActivePerl 5.8 Build 824 が 2008年09月04日にリリースされました。

http://aspn.activestate.com/ASPN/docs/ActivePerl/5.8/changes-58.html

まだ Namazu for Windows の動作確認は行っておりませんが、特に問題はないものと思います。

また、ActivePerl 5.10 Build 1004 が 2008年09月04日にリリースされました。 こちらはビルド1000番台ですので、Namazu 用に配布している PPM (MeCab PPM も)は利用できませんのでご注意ください。 (ご自分で PPM を用意されれば Namazu for Windows を使用することはできます。)

http://aspn.activestate.com/ASPN/docs/ActivePerl/5.8/changes-510.html

[情報]Namazu for Windows 2.0.18 ダウンロード数(2)2008年09月10日 21時11分27秒

アクセスログの保存期間が3ヶ月しかないので、前回以降の集計です。

2008/6/1~2008/8/10までの nmz2.0.18.001-win32.zip のダウンロード数は、約2,488 でした。 nmz2.0.17.002-win32.zip、nmz2.0.17.003-win32.zip のダウンロード数はほぼ 0 ですが、 nmz2.0.17.001-win32.zip のダウンロード数は 214 でした。

相変わらず何故か nmz2.0.17.001-win32.zip が人気です!? Namazu 2.0.18 の 10% 程度も...。 (古いバージョンは使わないようにお願いいたします。)

NKF, File-MMagic, Text-Kakasi, Search-Namazu の PPM のダウンロード数はそれぞれ約1,150 でした。 (ビルド1000番台での File-MMagic のダウンロード数は 13 でした。) Text-ChaSen の PPM のダウンロード数は約 17 でした。 MeCab の PPM のダウンロード数は約 194 でした。

ppm, PPM のセッション数は 132、1,424、合わせて約 1,556 でした。 このことから、この期間のインターネットからの Namazu 2.0.18 for Windows ののべインストール数は約 1,150~1,500 台ということでしょう。

なお、前回の調査と合わせると、nmz2.0.18.001-win32.zip ののべダウンロード数は約 4,648 でした。 Namazu 2.0.18 for Windows ののべインストール数は約 2,130~2,480 ぐらいのようです。

SWIG を使ってみよう! [第3回] Ruby 編2008年09月13日 08時44分35秒

SWIG を使って libnmz の様々な言語用のバインディングを作成してみましょう。

今回は UNIX 環境(Linux)で Ruby から libnmz の nmz_get_version を呼び出すことを考えます。

モジュール名は前回と同じ Sample とします。 SWIG 用インターフェイスファイルを Sample.i という名前で作成します。 中身は前回と全く同じです。

%module Sample
%{
#include "namazu/libnamazu.h"
%}
char *nmz_get_version();

swig コマンドを使ってラッパ用コードを生成します。 今回は Ruby 用ですので引数に -ruby を指定します。

$ swig -ruby Sample.i

実行すると Ruby 用の Sample_wrap.c が生成されます。

Makefile を作成するために次の内容の extconf.rb ファイルを作成します。

require 'mkmf'

dir_config('nmz', '/usr/local');
$libs = append_library($libs, 'nmz');
create_makefile("Sample");

ruby コマンドで実行し、Makefile を作成します。

$ ruby extconf.rb

make を実行してモジュールを作成します。

$ make

Ruby バインディングの Sample モジュールが作成されました。

インストールして使うこともできますが、ここではカレントディレクトリに生成したライブラリをそのまま使ってみましょう。

Sample ライブラリを呼び出す Ruby プログラム を run.rb という名前で作成します。

#!/usr/local/bin/ruby

require 'Sample'

print Sample::nmz_get_version(), "\n";

このプログラムは nmz_get_version の値を表示するだけの単純なプログラムです。 実行すると、Namazu のバージョンが表示されます。

$ ruby run.rb
2.0.18

非常に簡単な例ですが、SWIG を使って libnmz を Ruby から利用する方法をしめしました。 モジュールの生成方法は各言語ごとに異なりますが、 Perl や Java の時に使ったものと同じインタフェースファイルから作成できることが分かったかと思います。他の言語でも同じように利用することができますので、いろいろと工夫してみてください。

[お断り]

  • SWIG Version 1.3.36 を使用しました。
  • ruby 1.8.7 (2008-08-11 patchlevel 72) を使用しました。
  • Namazu 2.0.18 を使用しました。
  • libnmz は GPL ライセンスです。libnmz を動的であれ、静的であれリンクして使用するプログラムは GPL ライセンスと 矛盾しないライセンスである必要があります。
  • SWIG を用いて作成した Sample モジュールは libnmz をリンクしますので、GPL ラインセンスとして公開します。
  • Sample モジュールは GPL ライセンスですので、Sample モジュールを利用するプログラムは GPL ライセンスと矛盾しないライセンスでなければなりません。 ご注意ください。

libiconv 日本語エンコーディングパッチの謎2008年09月15日 10時01分46秒

森山さんの libiconv 日本語エンコーディングパッチを見ていてふと気になったことが...

パッチをあてた iconv で次のコマンドを実行すると、

$ iconv -l | grep grep CP932
CP932 MS932 SHIFFT_JIS-MS SJIS-MS SJIS-OPEN SJIS-WIN WINDOWS-31J
WINDOWS-932 CSWINDOWS31J

という結果が得られます。

気になるのは SHIFFT_JIS-MS という文字列。

意味的には SHIFT_JIS-MS だろうと思うのですが、何故 'F' を重ねるのでしょうか...。謎です。

[解決] libiconv 日本語エンコーディングパッチの謎2008年09月16日 06時19分16秒

「libiconv 日本語エンコーディングパッチの謎」が解決しました。

答えは「単純な typo」だそうです。(>_<;)

...最初はそうも思ったのですが、長年間違ったままだったとは思わなかったのと、ソースを見ると何箇所も使われていたので何らかの意図があるのかと勝手に思ってしまいました。

ということで、libiconv-1.12 に対するパッチ

http://www2d.biglobe.ne.jp/~msyk/software/libiconv-1.12-ja-patch.html

が公開されました。 古いバージョンの libiconv に対する今回の修正パッチは今のところないようです。

[追記]

使ってみたのですが、残念ながらうまく動いていないようです。

$ iconv -l |grep SHIFT_JIS-MS
CP932 MS932 SHIFT_JIS-MS SJIS-MS SJIS-OPEN SJIS-WIN WINDOWS-31J
WINDOWS-932 CSWINDOWS31J

$ echo abc | iconv -f EUC-JP -t CP932
abc

$ echo abc | iconv -f EUC-JP -t SHIFT_JIS-MS
iconv: conversion to SHIFT_JIS-MS unsupported
iconv: try 'iconv -l' to get the list of supported encodings

[追記]

make -f Makefile.devel を実行し忘れていたとのことでした。

修正済みのパッチは libiconv-1.12-ja-3.patch.gz です。

http://www2d.biglobe.ne.jp/~msyk/software/libiconv-1.12-ja-patch.html

GNU libiconv バージョン 1.12 のバージョン表示誤りについて2008年09月17日 00時23分35秒

GNU libiconv バージョン 1.12 のバージョン表示に誤りがあります。

$ iconv --version
iconv (GNU libiconv 1.11)
Copyright (C) 2000-2007 Free Software Foundation, Inc.
License GPLv2+: GNU GPL version 2 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Bruno Haible.

このように前のバージョンと同じ 1.11 と表示されます。 これは、include/iconv.h に

#define _LIBICONV_VERSION 0x010B    /* version number: (major<<8) +
minor */

となっているためです。(本当は 0x010C でなければならない)

指摘すると、

You are right. Thank you for reporting this. It should not happen again: I have set up a list of release steps that will help me not to forget to bump the version number before the release.

と返事が来たので、次のバージョン以降は間違うことはなくなるでしょう。

バージョンナンバーの更新忘れってよくやってしまいますからね。 私も気を付けないと。

SWIG を使ってみよう! [第4回] Python 編2008年09月19日 06時12分45秒

SWIG を使って libnmz の様々な言語用のバインディングを作成してみましょう。

今回は UNIX 環境(Linux)で Python から libnmz の nmz_get_version を呼び出すことを考えます。

モジュール名は前回と同じ Sample とします。 SWIG 用インターフェイスファイルを Sample.i という名前で作成します。 中身は前回と全く同じです。

%module Sample
%{
#include "namazu/libnamazu.h"
%}
char *nmz_get_version();

Sample モジュールを作成するために次の内容の setup.py ファイルを作成します。

#!/usr/local/bin/python

 from distutils.core import setup, Extension

Sample_module = Extension('_Sample',
                            sources=['Sample.i', ],
                            library_dirs = ['/usr/local/lib'],
                            libraries = ['nmz'],
                            )

setup (name = 'Sample',
        version = '0.1',
        author = "teranishi",
        description = """Simple swig example""",
        ext_modules = [Sample_module],
        py_modules = ["Sample"],
        )

python コマンドで実行し、Sample モジュールを作成します。

$ python setup.py build_ext --inplace

Python バインディングの Sample モジュールが作成されました。

インストールして使うこともできますが、ここではカレントディレクトリに生成 したライブラリをそのまま使ってみましょう。

Sample モジュールを呼び出す Python プログラム を run.py という名前で作成します。

#!/usr/local/bin/pyton

import Sample

print Sample.nmz_get_version()

このプログラムは nmz_get_version の値を表示するだけの単純なプログラムです。 実行すると、Namazu のバージョンが表示されます。

$ python run.py
2.0.18

非常に簡単な例ですが、SWIG を使って libnmz を Python から利用する方法をしめしました。 モジュールの生成方法は各言語ごとに異なりますが、 Perl や Java の時に使っ たものと同じインタフェースファイルから作成できることが分かったかと思います。 他の言語でも同じように利用することができますので、いろいろと工夫してみてください。

[お断り]

  • SWIG Version 1.3.36 を使用しました。
  • Python 2.5.2 を使用しました。
  • Namazu 2.0.18 を使用しました。
  • libnmz は GPL ライセンスです。libnmz を動的であれ、静的であれリンクして使用するプログラムは GPL ライセンスと矛盾しないライセンスである必要があります。
  • SWIG を用いて作成した Sample モジュールは libnmz をリンクしますので、GPL ラインセンスとして公開します。
  • Sample モジュールは GPL ライセンスですので、Sample モジュールを利用するプログラムは GPL ライセンスと矛盾しないライセンスでなければなりません。ご注意ください。