Last modified: Mon Dec 05 01:34:55 JST 2005 現在のサーバの仕様 (詳しくはコードにあたること) ・ server completion (正式なプロトコル) 4 「送り無し」又は「abbrev」エントリの中から、midasiで始まるものを 全てピックアップし、それらの見出しを '/' で結合したものを返す。 # このプロトコルは詳しい定義はされていませんが、 # 送り有りエントリは検索対象としないのが一般的のようです。 # 「送り無し」・「abbrev」エントリの補完共に、 # 初回のリクエストでは時間がかかります。 ・ looseな abbrevエントリの検索 入力語・辞書のエントリ双方の見出し中に含まれる[#0-9A-Za-z]以外の文字を無視し、 downcaseしてから検索する。 現在は /^[!-~]*[a-z]/i にマッチするエントリを対象としており、 一文字目に限っては記号であっても無視されない。 短く、記号の多いエントリなどでは無関係なものまでヒットする可能性があり、 入力語に含まれる[#0-9A-Za-z]な文字数が一定以上の場合にのみ有効にするなど、 改善の余地あり。assoc辞書を利用すると切実な問題になるかも。 # 初回のリクエストは時間がかかります。 ・ auto-okuri-process的検索 DDSKKの skk-auto-okuri-processと同様な機能ですが、以下の点が異なります。 a. 送り有り変換でも有効であり、送り位置の指定が間違ってる場合に対応できる。 b. 送り有りエントリの[]ブロックを利用できないので、 「おおきく」→「多きく」のような候補も返してしまう。 a. に関しては「NagoyaKa」→「和やか」は出来ますが、 「NagoYaka」→「和か」は(当然)出来ません。 b. に関しては、プロトコルを拡張し、サーバに skk-henkan-okuriganaを送るようにし、 共有辞書にも送り有りのブロックを用意すれば可能でしょうが、現実的ではありません。 # 特に重くはありません。 ・ 正規表現検索 r or rは、送り有り変換 = 1, abbrev modeの変換 = 2, 見出しの表示 = 4の論理和。 ・midasi-pattern に対し、サーバ側で '^','$'を付加し、 /^midasi-pattern$/ で検索する。 ・candidate-pattern が指定されていると、midasi-patternでマッチした エントリに対し、更に /candidate-pattern/ で絞り込む。 '^','$'はサーバ側で付加されない。 ・midasi-pattern, candidate-pattern共に、先頭文字が '!'であると、 それを除いた残りの文字列を元にした正規表現にマッチしないエントリ を検索する。 # !~ Regexp.new('^' + midasi-pattern[1..-1] + '$') # '!'で始まるパターンにマッチさせたい時は、'\!pattern'のように # '\'でエスケープすればよい。 ・candidate-patternにスペースを含める事は出来ないので、 ' ' → '\s', '\' → '\\'の変換をする。 ・返り値は、r/candidate1/candidate2/.../の形式。 # は、エラー、候補の有無、タイムアウト、候補が切り詰められたかのステータス。 # 検索所要時間はパターン次第で数秒〜数十秒。上限設定可。 ・ パラメータ ・ 変更 set [param1 value1] [param2 value2] ... let [param1 value1] [param2 value2] ... ※スペースの数は任意 setは永続的な変更、letは一時的な変更。 letによる効果は続く一回のリクエストのみであり、それが検索要求であろうと、 別の let, set等であろうと無関係である。 サーバは現在のパラメータを返す。(let時はそれを考慮したものを返す。) 変更できるパラメータは dicts 検索対象の辞書の IDを '|'で継いだもの。 max-string-length 検索結果の最大長(おおよそ)。これを越えると検索を途中で打ち切る。 time-limit タイムリミット。これを越えると検索を途中で打ち切る。 ・ 表示 parameters しかし、set, letはパラメータを伴なわなくてもエラーにならないので、 それで代用できる。 ・ リセット reset TODO ・ 検索時や SIGHUPで辞書のリロードする時、Mutexでロックする? 必要性はどうなのか。 正規表現変換では連続して何度も検索しつつ、 他のクライアントの要求にも応じる必要があるが、 毎回ロック・アンロックしてると性能にどの程度響くだろうか。 個人利用では現状でも問題無いとは思うけど。 ・ かなり太るのをどうにかできないものか。 特に ckskkservを利用して一気に大量の検索をした時に酷い。 cdb_initの直後にcdb_freeを入れると解決するが、 間違ってるんだろうし、検索速度も多少落ちる。 ↓ と思ったが、別に構わないような。 ただ、ruby-cdbには munmapするメソッドは用意されてないのが難。 Changes サーバ 2005-06-28 looseな abbrev変換について挙動の選択肢を追加。 オプションの整理。 辞書関連の変数をグローバル変数からクラス変数に。 2005-06-26 loose_searchの高速化。 2005-06-24 LOOSE_ABBREV_SEARCHの条件を、/^[a-z]/i から /^[!-~]*[a-z]/i に変更。 数値変換を考慮し、無視しない文字に'#'を加えた。 LOOSE_ABBREV_SEARCH_INCLUDE_MIDASIが真であれば、 looseにマッチした場合、辞書収録の見出しも返すように。 2005-06-17 LOOSE_ABBREV_SEARCHと AUTO_OKURI_PROCESSが両立してなかったのを修正。 2005-06-15 okuri_searchを 'すっぱい' => 'すt' でなく 'すp' になるように。 2005-04-15 server completionを高速化。 ignore-case/looseな abbrev変換に対応。 2004-02-23 okuri_searchを書き直した。 AUTO_OKURI_PROCESS_BREAK_WHEN_FOUNDが真ならば、 見出し語を切り詰めた検索を途中で打ち切るように。 2004-01-01 EOFでコネクションを切るように。 2003-12-14 クラスの導入。 辞書指定形式の変更。 最大同時接続数の制限。 set, let, reset, parametersの導入。 送り仮名の自動処理の実験的サポート。 正規表現検索: リターンコード変更。 候補パターンによる絞り込み。 文字列先頭に '!'付加により、マッチしないエントリの選択。 2003-12-04 最初の公開バージョン。 クライアント 2004-03-08 設定ファイルから一部を regex-skkserv.elに分離した。 2003-12-23 my-skk-search-progsで skk-henkan-okuriganaを設定するように。 skk-server-versionの初期値を nil → "" に。 skk-open-server へのアドバイスでのサーバ初期化処理を、 skk-open-network-stream, skk-open-server-1 で skk-server-initialize を呼ぶアドバイスに変更。 2003-12-20 skk-server-letの後処理で accept-process-outputするように。 my-skk-search-progsで okuri-charを設定するように。 2003-12-14 正規表現検索のリターンコードの変更に対応。 正規表現検索における候補パターン指定コマンド。 サーバとの接続時にバージョンの取得、必要に応じてパラメータの設定するように。 skk-server-letによる、検索環境の一時的変更。 2003-12-04 最初の公開バージョン。