Visual Studio 2008 Express Edition 日本語版2008年03月07日 02時05分46秒

Visual Studio 2008 Express Edition 日本語版(無償) は以下から入手可能です。

http://www.microsoft.com/japan/msdn/vstudio/express/

Visual C++ 2008 Express Edition には、Windows Platform SDK も同梱されています。

Windows Vista 問題改め msvcr8x, msvcr9x 問題2008年03月07日 02時12分42秒

当初、MinGw でコンパイルした namazu.exe が Windows Vista で正常動作しないため、Vista 問題としていました msvcr8x 問題ですが、Visual C++ 2008 でコンパイルするとどうなるか確認してみました。

VC++ 2008 でコンパイルしたバイナリは msvcr9x に依存します。 この msvcr9x も msvcr8x 同様の不具合が生じました。 このため、VC++ 2008 もそのままでは namazu.exe のコンパイルには使えそうにありませんでした。

VC++ と msvcr のバージョンの関係は次の通りです。

  • Visual C++ 6.0 は msvcr60
  • Visual C++ .NET は msvcr70
  • Visual C++ .NET 2003 は msvcr71
  • Visual C++ 2005 は msvcr8x
  • Visual C++ 2008 は msvcr9x

namazu.exe で不具合が生じるのは msvcr[80]x です。 このため、VC++ .NET 2003 以前でスタティックリンクすればこの問題を回避できます。 このため、今のところ VC++ 6.0 でコンパイルしています。

Namazu 2.0.18RC3 公開 + 動作チェックに協力していただける方募集2008年03月07日 04時18分39秒

Namazu 2.0.18 のリリースを予定しております。

それに先立ち、Namazu 2.0.18RC3 を公開いたします。 この Namazu 2.0.18RC3 のコンパイル + 動作チェックをしていただける方を広く募集しておりますので、皆様ご参加のほどよろしくお願いします。

  • アーカイブファイル

http://www.namazu.org/test/namazu-2.0.18RC3.tar.gz

  • 署名ファイル

http://www.namazu.org/test/namazu-2.0.18RC3.tar.gz.sig

  • MD5sumファイル

http://www.namazu.org/test/namazu-2.0.18RC3.tar.gz.md5

(MD5sum: ed450d3332cd84ec21239f5d1aeb5976)

  • sha1sumファイル

http://www.namazu.org/test/namazu-2.0.18RC3.tar.gz.sha1

(sha1sum: d812c554d75ed608be9264343131afb9030d91b7)

<2.0.18RC2 からの変更点>

  • doc 以下を修正
  • Windows 版でコンパイル時にワーニングが発生する部分にキャストを追加、変数の型を変更、ヘッダの追加等

Windows ネイティブ版 Namazu 2.0.18RC3 公開2008年03月07日 06時01分14秒

Namazu 2.0.18 をリリースするにあたり、様々な環境での動作チェックを行う必要があるかと思っています。 このため動作チェックに協力していただけるボランティアを募集いたします。

Windows 環境で、コンパイル環境を整えるのは大変かと思いますので、コンパイル済みパッケージを用意しました。 皆様、ふるってご参加ください。

  • アーカイブファイル

http://www.akaneiro.jp/public/nmz2.0.18RC3.001-win32.zip

  • 署名ファイル

http://www.akaneiro.jp/public/nmz2.0.18RC3.001-win32.zip.sig

  • MD5sumファイル

http://www.akaneiro.jp/public/nmz2.0.18RC3.001-win32.zip.md5

(md5: 5e839ed2875ca869c2f9faae781ba3f1)

  • sha1sumファイル

http://www.akaneiro.jp/public/nmz2.0.18RC3.001-win32.zip.sha1

(sha1: eb010fdb04428abf6574aeb4654cd80f7d33c706)

<2.0.18RC2 からの変更点>

  • doc 以下を修正
  • Windows 版でコンパイル時にワーニングが発生する部分にキャストを追加、変数の型を変更、ヘッダの追加等

※本アーカイブには実験的に x64 版の namazu.cgi.exe も含まれています。

Re: Windows Vista 問題改め msvcr8x, msvcr9x 問題2008年03月07日 22時35分29秒

msvcr[89]x 問題ですが、この CRT のソースは VC++ に付いています。 (エディションにもよりますが)

それで少しソース見てみると、VC8 の wild.c はこのようになっていました。 (VC9 も同等)

#ifdef WPRFLAG
        for (argv = __wargv; *argv; argv++) /* for each arg... */
#else  /* WPRFLAG */
        for (argv = __argv; *argv; argv++)  /* for each arg... */
#endif  /* WPRFLAG */
                {
            *(*argv)++; // the first character of the argument is dropped
            /*
               - native case: all the arguments that were not within quotes
               in the command line have their first character duplicated.
               - native/managed case: all the arguments that were within quotes
               in the command line "arrive" here without the ending quote.
               - managed case: all the arguments that were not within quotes
               in the command line "arrive" here with a starting quote.
               The algorithm was initially designed not to expand the arguments
               within quotes and this is the reason for the first added character
               (to check if an expansion is desired and to be removed after that).
               In future this character will not be added anymore, but until there
               will be decided so, it must still be removed.
            */

            // if wild required --> expand, else only add.
                if (wchar = _tcspbrk( *argv, WILDSTRING)) {
                if (tmatch( *argv, wchar )) return (-1);
                }
            else {
                if (tadd(*argv)) return (-1);
            }
        }

ちなみに VC7 では次の通りです。

#ifdef WPRFLAG
        for (argv = __wargv; *argv; argv++) /* for each arg... */
#else  /* WPRFLAG */
        for (argv = __argv; *argv; argv++)  /* for each arg... */
#endif  /* WPRFLAG */
            if ( *(*argv)++ == QUOTECHAR )
                /* strip leading quote from quoted arg */
            {
                if (tadd(*argv))
                    return(-1);
            }
            else if (wchar = _tcspbrk( *argv, WILDSTRING )) {
                /* attempt to expand arg with wildcard */
                if (tmatch( *argv, wchar ))
                    return(-1);
            }
            else if (tadd( *argv )) /* normal arg, just add */
                return(-1);

どうやら managed に対応するために処理がテキトウだったようです。(泣)

従来は引数の1文字目がダブルクォートの場合、ワイルドカードのマッチング処理を行わずダブルクォートの中身を引数にしてプログラムに渡していました。

VC[89]では、1文字目を無条件で捨てて、引数にワイルドカード文字"*?"が含まれる場合はマッチング処理を必ず行うようになっています。 マッチングで一致しない場合はそのまま引数にしてプログラムに渡しますが、マッチングが一致した場合はワイルドカードが展開されてプログラムに渡されてしまいます。

つまり、ワイルドカード文字が引数に含まれる場合は、ダブルクォートで囲もうと、ワイルドカード展開が起こるということです。 ダブルクォートは空白文字(スペースとタブ)を引数に含める場合にしか意味をなしません。

これは仕様変更というよりは、バグでしょう。

もちろんこれは setargv.obj をリンクし、引数のワイルドカード展開を行った場合の話です。 setargv.obj をリンクせず、引数のワイルドカード展開を行わない場合には関係のない話です。

namazu.exe もワイルドカード展開を行わなければ問題なく使えます。 その場合は、引数に指定するインデックスをワイルドカードで指定できなくなってしまいます。

ただ、インデックスの指定にワイルドカードが使えないということを引き換えにしてでも、古い VC++ 6.0 から VC++ 2005(VC8), VC++2008(VC9) に切り替える方が x64 対応等を考えると良い気もしてきました。

nmz2.0.18RC3.002-win32.zip 公開2008年03月11日 06時09分17秒

nmz2.0.18RC3.002-win32.zip を公開しました。

  • MD5sumファイル

http://www.akaneiro.jp/public/nmz2.0.18RC3.002-win32.zip.md5

(md5: 08bc25777509e3eb7c30da51b27eca6a)

  • sha1sumファイル

http://www.akaneiro.jp/public/nmz2.0.18RC3.002-win32.zip.sha1

(sha1: 8e11cdfde2fbbb9972aa3cd971056131beff5fa9)

<nmz2.0.18RC3.001-win32.zip からの変更点>

  • x86 版は Visual C++ 2005 でコンパイル。これに伴い、namazu.exe のコマンドラインでインデックスを指定する場合にワイルドカードの使用ができなくなりました。
  • 従来の Visual C++ 6.0 でコンパイルした x86(VC6)版も含まれますが、今後サポートされなくなります。
  • 実験的に IA64 版の namazu.exe, namazu.cgi.exe が含まれています。
  • 実験的に x64 版の namazu.exe, namazu.cgi.exe が含まれています。

x86(VC6)版とx86版の namazu.exe について2008年03月11日 17時30分30秒

結局、Visual C++ 2005 を使って namazu.exe をコンパイルする方針に変更しました。

これにより従来の VC++6.0 でコンパイル + setargv.obj をリンクした namazu.exe とは動作が異なります。

以後、従来のものを x86(VC6)版、新しいものを x86版と区別して呼びますが、x86(VC6)版では、インデックスの指定にワイルドカードが使用できました。これに対し x86版ではインデックスの指定にワイルドカードが使用できなくなりました。

これは x86版では msvcr[89]x 問題のため検索式にワイルドカード文字が含まれた場合、ダブルクォーテーションでワイルドカードの展開を抑止できないためです。setargv.obj のリンクを外すことでワイルドカードの展開自体を行わないことで、検索式を保護することにしました。結果としてインデックスの指定にワイルドカードは使えなくなったということです。

従来の namazu.exe とは互換性がなくなりますが、ご了承ください。 なお、namazu.cgi.exe の方はというと CGI という性質上、引数がありませんので、何の影響もなく従来と互換です。

[実験] 64bit Windows への対応について2008年03月11日 17時57分50秒

実験的に 64bit Windows への対応を行っています。

IA64 版および x64版の namazu.exe と namazu.cgi.exe を配布アーカイブに含めています。

ただ残念ながら手元には IA64 も x64 のPCがなく、動作は未確認です。 現時点では Visual C++ 2005 でコンパイルしただけのものということになります。

特に 64bit Windows 向けに何か機能を追加したということではありません。

検索速度は 64bit 版の方が若干速くなるのかなという推測はできますが、実際のところは動かしていないので何とも言えません。 x64 環境の場合は、x86 版と x64 版を差し替えて使うことで検索速度の比較が可能でしょう。

なお、インデクサの mknmz や Namazu ユーティリティコマンドは Perl スクリプトであり、ActivePerl や Perl モジュールに依存します。 現在のところ配布している Perl モジュールは x86 版のみとなっていますので、芋蔓式に mknmz や Namazu ユーティリティコマンドは x86 で使うことになるかと思います。 (もちろんご自身で 64bit 版の Perl モジュールをご用意いただければ 64bit で使えるとは思います。)

日本語全文検索システム Namazu 2.0.18 リリース2008年03月13日 05時31分53秒

 Namazu Project は、オープンソースソフトウェア  Namazu 2.0.18 を
2008年03月12日にリリースいたしました。
 GPL2(GNU General Public License version 2)に従って、Webサイトにて
一般公開したことを発表します。

 Namazu は手軽に使えることを第一に目指した日本語全文検索システムです。
CGI として動作させることにより小中規模の WWW 全文検索システムを構築す
ることができるほか、コマンドラインから利用する用途にも使えます。 


■ 主な変更内容

1.セキュリティ面の強化
  * namazu.cgi

  (緊急度:低)
  - レスポンスヘッダで charset を必ず出力
  - namazurc(.namazurc) の ContentType に charset が含まれていない
    場合には charset を追加するように変更
  - 'Charset' ディレクティブの追加。Lang に対応する charset を指定
  - エラーメッセージ出力時にレスポンスヘッダに charset を追加
  - エラーメッセージ出力時に HTML, BODY タグを追加
  - '\'', '(', ')' を "'", "(", ")" に変換

2.追加/修正
  - ドイツ語、ポーランド語用のメッセージカタログを追加
    (但し、翻訳は行っておらず英文のまま)
  - シフトJISのメッセージカタログの charset 名を SJIS から 
    Shift_JIS に変更
  - ドメイン名の例を example.jp に変更
  - mknmzrc の $DENY_DDN のシリアルポートのパターン変更
    2桁のポートに対応
  - LTVERSION="8:0:1" に変更
  - pltests のテストの変更および追加

3.バグフィックス
  下記の他多数の不具合を修正

  - mknmz にディスク空き容量不足のエラーチェック追加
  - UTF-8 変換ツールによる処理の違いを修正
  - 改行コード、制御コード変換処理の修正
  - filter/hnf.pl: GRP 対応とバグフィックス

■ 配布元
  Namazu 2.0.18 は、
 Namazu Web サイト  で配布しています。

■ ライセンス
 GPL2

■ 商標について
 商品名・会社名等はすべて各社、各組織の商標または登録商標です。 

■ 本件に関するお問合せ先
  Namazu Project
 e-mail: info@namazu.org
  URL: http://www.namazu.org/

[技術資料] Namazu 2.0.18 に新設された Charset ディレクティブ関連の話2008年03月13日 05時34分11秒

Namazu 2.0.17 以前の namazu.cgi はデフォルトではレスポンスヘッダの
ContentType に charset を出力しません。
この時、Web ブラウザの charset 自動認識の誤認により脆弱性の問題が
起こることがあります。
http://www.namazu.org/security.html

しかし、Namazu 2.0.6 以降には namazu.cgi で出力するレスポンスヘッダの 
ContentType を .namazurc で直接指定する機能を有しています。

ContentType "text/html; charset=EUC_JP"

など明示的に指定することでレスポンスヘッダの ContentType に charset を
出力することができ、この脆弱性の問題を回避することができます。
ただし、この場合は charset の値が固定されるため、CGI変数 lagn を用いた
言語切替ができないという制限がかかります。
(.namazurc の Lang ディレクティブを用いて言語を指定した場合も言語切替
はできませんので、実質困る方は少ないとは思います。)


これに対して Namazu 2.0.18 の namazu.cgi では、デフォルトでレスポンス
ヘッダの ContentType に charset を出力します。
ContentType "text/html; charset=%charset%" として内部処理を行います。
(%charset% は言語に対応したキャラセット)

このため、ContentType を .namazurc で指定していなくても言語に合った
charset が出力可能です。(サポートしている言語の場合)

Namazu 2.0.18 がサポートしている言語については新設した Charset 
ディレクティブで指定することが可能です。(言語切替に対応)

もちろん 2.0.17 以前のように ContentType で直接 charset を指定しても
かまいません。(この場合には、言語切替は不可能)

Namazu 2.0.18 では、.namazurc で charset が未設定の ContentType を
直接指定した場合でも、"; charset=%charset%" を自動的に追加して、
charset を出力します。(言語切替に対応)


現在のところ、標準のメッセージカタログには EUC-JP, Shift_JIS, 
ISO-8859-1, ISO-8859-2 の charset が使われているだけですが、
それ以外の charset の利用も考えると全てを自動で切り替えることは
困難です。
このため、現在サポートしていない言語に対応するために Charset 
ディレクティブを新設しました。

現在サポートしている言語とその charset の対応は次の通りです。

Charset "ja"                "EUC-JP"
Charset "ja_JP.SJIS"        "Shift_JIS"
Charset "ja_JP.ISO-2022-JP" "ISO-2022-JP"
Charset "fr"                "ISO-8859-1"
Charset "de"                "ISO-8859-1"
Charset "es"                "ISO-8859-1"
Charset "pl"                "ISO-8859-2"

(ここには ja_JP.eucJP はありませんが、ja_JP.eucJP はテンプレート
ファイルの選択のルールと同じように完全一致する言語がなければ
ja_JP、ja と順にチェックします。ja_JP は未設定ですが、ja は設定されて
いるため、charset としては EUC-JP が選ばれます。)

上記以外の言語を利用する場合には Charset ディレクティブで charset を
設定してください。

例えば eo(エスペラント語)を ISO-8859-3 に対応付けるのには

Charset "eo" "ISO-8859-3"

のようにします。(デフォルトは ISO-8859-1)
これにより言語 eo を選択した場合には、namazu.cgi のレスポンスヘッダの
ContentType は "text/html; charset=ISO-8859-3" が出力されることに
なります。

なお、Charset ディレクティブはシステムでサポートする言語とその言語に
対応する charset を設定しなければなりません。
システムと異なる charset を設定すると不具合が生じます。

Charset ディレクティブで、言語の charset が自由に設定できるわけでは
なくて、システムの言語に対応する charset を namazu.cgi に教える機能
だと理解してください。