Namazu & MacOS 8.5 Sherlock に関するメモ

Abstract

MacOS 8.5 から標準添付されるようになった, ローカル/ネットワーク・ボリュームおよび Web リソースに対する検索機能 Sherlock は, オープン・ソースの検索エンジン Namazu 1.2.x.x との組み合わせでは文字化けを起こす.

これは Sherlock 側の責任であるが, 例によって、問題のあるクローズドな売りモノが出回った結果の不都合については、 対応可能な側で対処するより他はない。われわれに責任はないが、 エンドユーザにも罪はない。

もっとも, 商品選択の自由は商品選択の責任であって、 最終的には問題ある商品の普及は消費者に責任がある。

Namazu 側でのこの回避方法と、 Sherlock 定義ファイルの書き方をメモランダムとしてみた.

Standard Disclaimer

これは私的なメモであり, 内容の正しさについては一切保証しない. このページの記述内容の利用は自由であるが, 記述内容を元にした行動によって受けたいかなる損失に対しても 一切関知しない.

現象

(バージョン 1.2.x.x の) Namazu は, 検索結果として生成される キャラクタセット iso-2022-jp の HTML の <HEAD> 部に

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-2022-JP">

を入れて, HTML のキャラクタセットを明示している.
これは正しいことなのであるが, Sherlock は却ってこれを入れると文字化けを起こす.
Sherlock 定義ファイル側にもキャラクタセット定義項目があるが, これを指定しても事態は好転しない. したがって, (Namazu 1.2.x.x を使っている) Web サーバで Sherlock 定義ファイルをユーザに提供し Sherlock への対応を行う場合は, この問題にも対処する必要がある.

対処方法および設定の概要

結論

Sherlock 定義ファイル側

Sherlock 定義ファイルはプレインテキストである. もちろんキャラクタセットは MS 漢字コード, 改行は LF. たとえば単純に SimpleText で書けばよい.

(namazu 向けの)スケルトンは以下のような感じ:

<search
    name = "検索サービスの名称"
    action = "http://www.foo.co.jp/cgi-bin/namazu.cgi" 
    method = get
    queryEncoding = 2561

    # オプション
    description = "より詳しい説明"

    # これもオプション. 検索結果のペインに出す画像
    # うまく出ないときがあるが原因不明
    bannerImage = "http://www.foo.co.jp/buy_it.gif"

    # 上の bannerImage をクリックしたときの飛び先.
    # 本当はオプションだが, bannerImage を指定するなら書いたほうがいい
    bannerLink = "http://www.foo.co.jp/"
>

<input name="key" user>
<input name="max" value="100">
<input name="format" value="long">
<input name="lang" value="ja">

<interpret
    resultEncoding=2080
    resultTranslationEncoding=1
    resultTranslationFont="Osaka"
    resultListStart="<DL>"
    resultListEnd="</DL>"
    resultItemStart="<DT>"
    resultItemEnd="<BR><BR>"    # <BR> ふたつ
    relevanceStart = "</STRONG> (score:"
    relevanceEnd = ")"

    # 入れちゃダメ
    # charset="iso-2022-jp"

    # オプション
    # bannerStart = "pattern"
    # bannerEnd = "pattern"
>
</search>

要は, CGI で返された内容に単純パターンマッチを行って結果を拾い, 活用するもの.
もちろん従来通りローカル/ネットワークディスクの検索機能も持っている.
tkNamazu, bnamazu, namazu.el や Emacs の M-x grep, find, locate の遠い 親戚のようなものか.

resultListStart から resultListEnd にマッチする間の結果を吟味対象 とし, そのなかの resultItemStart から resultItemEnd にマッチするものを検索結果ひとつとして拾う.

拾われた検索結果の HTML 片において、ある程度の HTML タグは Sherlock の 表示結果に反映される. (ex. A, H1〜H6, B, I, etc..)

スコア

さらに, それぞれの検索結果のスコアも意識する.
resultItemStart から resultItemEnd中の, relevanceStart から relevanceEnd の中にある, 最初の数値パターンをスコア値として拾う.

ただ、このスコアの範囲は 0〜100 なので、namazu と Sherlock を きちんと対応させるためには、Namazu 側にも工夫が必要. (後述)

エレメントのスタック

単純パターンマッチであり、SGML タグ/エレメントのスタックは意識しないので,

  resultListStart="<DIV CLASS=list>"
  resultItemStart="<DIV CLASS=item>"
  resultItemEnd="</DIV>"
  resultListEnd="</DIV>"

  <DIV CLASS=list>
    <DL>
    <DIV CLASS=item>
      <DT>検索結果1: <A HREF="http://www.foo.com/">なんたら</A></DT>
      <DD>かんたら..</DD>
    </DIV>
    <DIV CLASS=item>
      <DT>検索結果2: <A HREF="http://www.bar.com/">ほげほげ</A></DT>
      <DD>もごもご..</DD>
    </DIV>
    </DL>
  </DIV>

のような定義は動作しない.

検索結果ごとのバナー

また、検索結果ごとに結果表示ペインに出すべきバナー内容を (resultItemStartresultItemEnd の中の) bannerStartbannerEnd のパターンマッチで拾う.
これは、各検索結果ごとに出てくる HTML 片を拾うものなので注意.

パソコンに関するリンクだったらパソコン通信販売業者のバナー、 クルマやバイクの話題だったら結婚相談所..とか.. ^^;
商用サーチエンジンではこの機能は死活問題なのかもね。

この機能を活用するならば、少なくとも Sherlock からの検索時に のみバナー(の HTML)を送出する、など配慮すべきである. (後述)

charset 指定

Sherlock 定義ファイルに charset="iso-2022-jp"' は入れない.
入れるとかえって化ける.

bannerLink 指定

これは, 検索結果ごとのバナーではなくて, 検索結果全体に対するバナーである.

bannerLink 無指定時は, bannerImage クリックにて action の URL に飛ぶはず.
しかし飛び先に 2 バイトほどゴミがついてエラーになる. (CR とか LF の類ではない.)
これは Sherlock のバグ. bannerLink は明示的に指定したほうがよい.

仕上げ

こうしてできたプレインテキストを, ResEdit でも何でも使って, Creator: fndf, Type: issp に変更してできあがり.

MacOS はファイルの拡張子なぞ関係ないが、他の Sherlock 定義ファイルは みな *.src になっているので, 同じく *.src にしておいたほうがなんとなく安全?

また, 定義ファイルのアイコンに任意の画像をペーストしておくと, Sherlock 画面にて、また検索結果にて反映される. おすすめ.

Web サーバからの配布にあたっては, StuffIt とかで圧縮して BinHex で ASCII ファイルとして拡張子 *.hqx にして置いておく, などが一般的であろう.
もちろんその Web サーバの *.hqx に対する MIME Type は application/mac-binhex40 にセット.

CGI Script (namazu) 側

Sherlock に対応させる場合は, NMZ.head.ja
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-2022-JP">
を入れない.

Sherlock 側は定義ファイルの別項目にてキャラクタセットを独自の数値で 定義できるので、化ける心配はない(だろう).
また, iso-2022-jp は euc-jp or x-sjis と明らかにバイトパターンが異なるので, キャラクタセット判定ミスの王者 MSIE 3.x でも, 根本的なキャラクタセットの判定間違いは起こりにくい(だろう).

表示するスコアのすりあわせ

Sherlock は relevanceStartrelevanceEnd 間の数値をスコアとして受け取り, 棒グラフとして表示し, これに基づいて結果をソートする(ことができる)が, 対応する値範囲は 0〜100 である。

Namazu のスコアは「比率」ではないので、どうもうまくない.

また、各種サーチエンジンの結果をひとまとめに表示、ソートできるのが Sherlock の売りのひとつなので, namazu の返すスコアがあまりに大きい, または小さいと不便.

下世話な対策として、サーチエンジン各社がみな 100% に近いスコアを返して, なるべく Sherlock の表示上位を狙いだしらすっげーイヤかも(笑)

その場しのぎとしては、mknmz 内のスコア値要素をいじる, hlist.c の 552 行あたりに手を入れてなんとなく 0〜100% っぽい数値にしてやることは、できる..
もちろん当座しのぎ、子供だましの方法なので、技術的良心のある行為ではない :-p

なお、100 以上の数値を返しても, Sherlock は 100 で切り捨てるようなので大丈夫.

より進んだ設定

より進んだ設定としては

HTTP_USER_AGENT =~ / Apple Find / だったら Sherlock パターンマッチ用のシグネチャを入れる.
なお, Sherlock の返す HTTP_USER_AGENT
Mozilla/4.x (compatible; Apple Find 2.0; Macintosh PPC)
である. (see http://www.maqmakmac.com/)
namazu 1.3.0.0-beta12 に対するパッチ を置いてみたので良かったらどうぞ. (テストとかしてないよ)
Sherlock ユーザ向けのリンクを「検索結果のひとつ」として入れる
「MacOS 8.5 ご利用のみなさまへ..」とか、やだな(笑)
Sherlock に必要なだけの, 簡素な HTML を返す
などができる. これらもおすすめ.

MacOS 8.5 出荷時に Sherlock に定義済みのサーチエンジン各社もこれをやっている。

参考

謝辞

Namazu 作者の高林さん及び contributor のみなさん、 namazu-ml のみなさん, Namazu 用 Sherlock 定義ファイルのサンプルを namazu-ml に投げてくださった 斎藤さん, そしてオープン・ソース文化の正のフィードバックに対して感謝と敬意を表します.

morimoto@mrmt.net

$Id: sherlock.html,v 1.4 2010-07-14 11:57:07 morimoto Exp $