MacOS 8.5 から標準添付されるようになった, ローカル/ネットワーク・ボリュームおよび Web リソースに対する検索機能 Sherlock は, オープン・ソースの検索エンジン Namazu 1.2.x.x との組み合わせでは文字化けを起こす.
これは Sherlock 側の責任であるが, 例によって、問題のあるクローズドな売りモノが出回った結果の不都合については、 対応可能な側で対処するより他はない。われわれに責任はないが、 エンドユーザにも罪はない。
もっとも, 商品選択の自由は商品選択の責任であって、 最終的には問題ある商品の普及は消費者に責任がある。
Namazu 側でのこの回避方法と、 Sherlock 定義ファイルの書き方をメモランダムとしてみた.
これは私的なメモであり, 内容の正しさについては一切保証しない. このページの記述内容の利用は自由であるが, 記述内容を元にした行動によって受けたいかなる損失に対しても 一切関知しない.
(バージョン 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 への対応を行う場合は,
この問題にも対処する必要がある.
charset="iso-2022-jp" は入れない.
NMZ.head.ja に <META HTTP-EQUIV.. を入れない.
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>
のような定義は動作しない.
また、検索結果ごとに結果表示ペインに出すべきバナー内容を
(resultItemStart 〜 resultItemEnd の中の)
bannerStart 〜 bannerEnd のパターンマッチで拾う.
これは、各検索結果ごとに出てくる HTML 片を拾うものなので注意.
パソコンに関するリンクだったらパソコン通信販売業者のバナー、
クルマやバイクの話題だったら結婚相談所..とか.. ^^;
商用サーチエンジンではこの機能は死活問題なのかもね。
この機能を活用するならば、少なくとも Sherlock からの検索時に のみバナー(の HTML)を送出する、など配慮すべきである. (後述)
Sherlock 定義ファイルに charset="iso-2022-jp"'
は入れない.
入れるとかえって化ける.
これは, 検索結果ごとのバナーではなくて, 検索結果全体に対するバナーである.
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 にセット.
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 は relevanceStart 〜
relevanceEnd 間の数値をスコアとして受け取り,
棒グラフとして表示し,
これに基づいて結果をソートする(ことができる)が,
対応する値範囲は 0〜100 である。
Namazu のスコアは「比率」ではないので、どうもうまくない.
また、各種サーチエンジンの結果をひとまとめに表示、ソートできるのが Sherlock の売りのひとつなので, namazu の返すスコアがあまりに大きい, または小さいと不便.
下世話な対策として、サーチエンジン各社がみな 100% に近いスコアを返して, なるべく Sherlock の表示上位を狙いだしらすっげーイヤかも(笑)
その場しのぎとしては、mknmz 内のスコア値要素をいじる,
hlist.c の 552 行あたりに手を入れてなんとなく
0〜100% っぽい数値にしてやることは、できる..
もちろん当座しのぎ、子供だましの方法なので、技術的良心のある行為ではない
:-p
なお、100 以上の数値を返しても, Sherlock は 100 で切り捨てるようなので大丈夫.
より進んだ設定としては
HTTP_USER_AGENT =~ / Apple Find /
だったら Sherlock パターンマッチ用のシグネチャを入れる.
HTTP_USER_AGENT はMozilla/4.x (compatible; Apple Find 2.0; Macintosh PPC)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 $