yaskkserv

yaskkserv とは?

C++ で書かれた、シンプル、高速で省メモリな独自形式の辞書 (変換にかかる時間は数秒です) を使用する SKK サーバです。 Linux/MacOSX/FreeBSD/OpenBSD/Cygwin で動作します。

バージョン 0.3.6 以降のライセンスは SKK と同じ GPL です。

何かありましたら twitter @wachikunwac@umiushi.org へのメイルなど、お気軽にどうぞ。

stable

0.6.1 : (2014年2月9日(日) 更新)
yaskkserv-0.6.1.tar.xz (sha1sum:ae008123564b12aebbbb48cf7fa5fe385aee8f17)
yaskkserv-0.6.1.tar.gz (sha1sum:ef22ebdc436b5a799373c8d87e478218a7b5dcf3)
0.6.0 : (2014年1月12日(日) 更新)
yaskkserv-0.6.0.tar.xz (sha1sum:2577ef28f867cb124504ce4b5ed5f6ef9cfdef42)
yaskkserv-0.6.0.tar.gz (sha1sum:f03e922359c346ae5d55bf4980e7220ed40e311b)
0.5.5 : (2013年10月12日(土) 更新)
yaskkserv-0.5.5.tar.bz2 (sha1sum:ab1b4ca6e1a17dea4d6f0c40b3102443781c0149)
0.5.4 : (2012年8月18日(土) 更新)
yaskkserv-0.5.4.tar.bz2 (sha1sum:75ed8dd242f19575c367d4bb2f18e6b8ca8b31eb)
0.5.2 :(2011年10月29日(土) 更新)
yaskkserv-0.5.2.tar.bz2 (sha1sum:fbaab07b74121961e70844d806d1be9330ce7eea)
0.5.1 :(2011年10月18日(火) 更新)
yaskkserv-0.5.1.tar.bz2 (sha1sum:d7a8a037af366ec4b609ffc9eb2780cb326c1a3b)
Git : git clone git://github.com/wachikun/yaskkserv (Mercurial でバージョン管理しているため、反映は遅いです)

News

2014年2月9日(日)
0.6.1
主な変更は yaskkserv_hairy の不具合修正とキャッシュ保存機能の追加です。
前のバージョン 0.6.0 からの変更点
  • yaskkserv_hairy : FreeBSD で Google Japanese Input 関係が動作していなかった不具合を修正
  • yaskkserv_hairy : --google-cache-file=FILENAME オプションでキャッシュを save/load できるようにした
  • yaskkserv_hairy : https の GnuTLS 対応(デフォルトでは GnuTLS -> OpenSSL の順で探します)
  • yaskkserv_hairy : --use-http で辞書の https 指定を上書きしていた不具合を修正
  • yaskkserv_hairy : 起動時に syslog へ protocol や辞書情報を出力するようにした
  • yaskkserv_hairy : キャッシュで不必要な領域を確保をしていた不具合を修正
  • yaskkserv_hairy : SIGHUP で動作が不安定になることがあった不具合を修正
  • yaskkserv_hairy : SIGHUP でキャッシュ情報を syslog に出力するようにした
  • yaskkserv_hairy : メインループでブロックしていたのをポーリングするようにした
  • configure : pkg-config を見るようにした
追加や変更された引数
  • yaskkserv_hairy : --google-cache-file=FILENAME を追加
  • configure : --disable-gnutls を追加
  • configure : --disable-openssl を追加
  • configure : --disable-https を追加
GnuTLS ではなく OpenSSL を使うことを明示する場合
$ ./configure --disable-gnutls --enable-openssl
or
$ ./configure --disable-gnutls
https を使わない場合
$ ./configure --disable-https
or
$ ./configure --disable-gnutls --disable-openssl
キャッシュをファイルに保存する
--google-cache-file=FILENAME オプションを付けると、起動時にキャッシュファイルが読み込まれ、 SIGHUP を送るとキャッシュファイルに保存します。
  • キャッシュファイルのバージョンが異なると読み込むことはできません
  • キャッシュエントリが同じか小さいものは全て読み込みます
  • キャッシュエントリが大きいキャッシュファイルを読み込もうとすると、読めるだけ読み込みます
# yaskkserv_hairy --google-cache-file=/var/cache/yaskkserv/yaskkserv.cache ...
2014年2月4日(火)
0.6.1beta4
主な変更は yaskkserv_hairy の不具合修正とキャッシュ保存機能の追加です。
前のバージョン 0.6.1beta からの変更点
  • yaskkserv_hairy : FreeBSD で Google Japanese Input 関係が動作していなかった不具合を修正
  • yaskkserv_hairy : --google-cache-file=FILENAME オプションでキャッシュを save/load できるようにした
  • configure : 細かな調整
追加や変更された引数
  • yaskkserv_hairy : --google-cache-file=FILENAME を追加
キャッシュをファイルに保存する
--google-cache-file=FILENAME オプションを付けると、起動時にキャッシュファイルが読み込まれ、 SIGHUP を送るとキャッシュファイルに保存します。
  • キャッシュファイルのバージョンが異なると読み込むことはできません
  • キャッシュエントリが同じか小さいものは全て読み込みます
  • キャッシュエントリが大きいキャッシュファイルを読み込もうとすると、読めるだけ読み込みます
# yaskkserv_hairy --google-cache-file=/var/cache/yaskkserv/yaskkserv.cache ...
2014年2月3日(月)
0.6.1beta
主な変更は yaskkserv_hairy の https まわりや不具合修正です。
前のバージョン 0.6.0 からの変更点
  • yaskkserv_hairy : https の GnuTLS 対応(デフォルトでは GnuTLS -> OpenSSL の順で探します)
  • yaskkserv_hairy : --use-http で辞書の https 指定を上書きしていた不具合を修正
  • yaskkserv_hairy : 起動時に syslog へ protocol や辞書情報を出力するようにした
  • yaskkserv_hairy : キャッシュで不必要な領域を確保をしていた不具合を修正
  • yaskkserv_hairy : SIGHUP で動作が不安定になることがあった不具合を修正
  • yaskkserv_hairy : SIGHUP でキャッシュ情報を syslog に出力するようにした
  • yaskkserv_hairy : メインループでブロックしていたのをポーリングするようにした
  • configure : pkg-config を見るようにした
追加や変更された引数
  • configure : --disable-gnutls を追加
  • configure : --disable-openssl を追加
  • configure : --disable-https を追加
GnuTLS ではなく OpenSSL を使うことを明示する場合
$ ./configure --disable-gnutls --enable-openssl
or
$ ./configure --disable-gnutls
https を使わない場合
$ ./configure --disable-https
or
$ ./configure --disable-gnutls --disable-openssl
2014年1月12日(日)
0.6.0
主な変更は yaskkserv_hairy の https / Google suggest 対応や不具合修正です。
前のバージョン 0.5.5 からの変更点
  • yaskkserv_hairy : https 対応(http を明示しない限り https をデフォルトに)
  • yaskkserv_hairy : --google-suggest オプションで Google サジェストの一番上の候補を取得できるようにした
  • yaskkserv_hairy : Google Japanese Input で、ひらがなと(いわゆる半角)カタカナのみのエントリを除くようにした
  • yaskkserv_hairy : Google Japanese Input/Suggest のキャッシュとして --google-cache オプションを追加
  • yaskkserv_hairy : リンカへ渡すライブラリオプションの位置に問題があったのを修正
  • yaskkserv_hairy : 一部の IPv6 環境で Google API へアクセスできなかった不具合を修正
  • yaskkserv_hairy : Google 系辞書を使用しているときにプロトコル 4 で補完すると、サーバが落ちる不具合を修正
  • yaskkserv_hairy : Google API で HTTP status code を確認していなかった不具合を修正
  • yaskkserv_hairy : iconv が const char ** を要求する環境でビルドに失敗する不具合を修正
  • yaskkserv_hairy : あきらかに大きな内部バッファを小さくした
  • package の圧縮フォーマットを bz2 から gz と xz にした
  • configure の --gplusplus オプションを廃止予定にして --compiler オプションを追加
  • clang 対応
  • リファクタリング
追加や変更された引数
  • yaskkserv_hairy : https でアクセスする Google Japanese Input 辞書 https://www.google.com の追加
  • yaskkserv_hairy : サジェスト用辞書 https://suggest.google.com or http://suggest.google.com の追加
  • yaskkserv_hairy : 辞書を明示しない場合に http でアクセスする --use-http オプションの追加
  • yaskkserv_hairy : Google API キャッシュ --google-cache=ENTRIES の追加
  • yaskkserv_hairy : サジェストを優先する --google-japanese-input=notfound-suggest-input の追加
  • yaskkserv_hairy : Japanese Input を優先する --google-japanese-input=notfound-input-suggest の追加
  • configure : --gplusplus オプションを廃止予定にして --compiler オプションを追加
注意すべき点
  • yaskkserv_hairy : --google-cache オプションは過去に変換した文字列を推測される恐れがある
  • yaskkserv_hairy : http://www.google.com のように http 指定した場合は、これまでと同様 http でアクセス
  • yaskkserv_hairy : --use-http は辞書を明示しない notfound 系に対して有効(https://www.google.com のように辞書として https 指定した場合は https)
キャッシュありのサジェスト使用例
# yaskkserv --google-japanese-input=dictionary --google-suggest --google-cache=1024 /DICPATH/SKK-JISYO.total+zipcode.yaskkserv https://www.google.com https://suggest.google.com
キャッシュがあると API アクセスの遅さがあまり気にならなくなりますが、信頼できないネットワークでの使用はおすすめできません。
キャッシュなしのサジェスト使用例
# yaskkserv --google-japanese-input=dictionary --google-suggest /DICPATH/SKK-JISYO.total+zipcode.yaskkserv https://www.google.com https://suggest.google.com
毎回 API アクセスがあり少しストレスを感じるため、 --google-japanese-input=dictionary よりも以下のように --google-japanese-input=notfound-input-suggest の方がいいかもしれません。
# yaskkserv --google-japanese-input=notfound-input-suggest --google-suggest /DICPATH/SKK-JISYO.total+zipcode.yaskkserv
2014年1月10日(金)
0.6.0beta9
  • キャッシュの探索効率を向上
  • リンカへ渡すライブラリオプションの位置に問題があったのを修正(レポートありがとうございます!)
  • リファクタリング
2014年1月2日(木)
0.6.0beta8
  • package の圧縮フォーマットを bz2 から gz と xz にした
  • ひらがな/カタカナ判定に長音記号が考慮されていなかったのを修正
  • 内部バッファチェックを強化した
2014年1月1日(水)
0.6.0beta7
  • バージョンを 0.5.6 から 0.6.0 に上げた
  • google API で HTTP status code を確認していなかった不具合を修正
0.5.6beta6
  • あきらかに大きな内部バッファを小さくした
  • google 系辞書を使用しているときにプロトコル 4 で補完すると、サーバが落ちる不具合を修正
  • リファクタリング
2013年12月31日(火)
0.5.6beta5
  • clang 対応
  • configure の --gplusplus オプションを廃止予定にして --compiler オプションを追加した
0.5.6beta4
  • Google Japanese Input で、ひらがなと(いわゆる半角)カタカナのみのエントリを除くようにした
  • Google Japanese Input/Suggest のキャッシュとして --google-cache オプションを追加

--google-cache を使用すると、サーバの応答時間を見ることで、過去に変換した文字列を推測される恐れがあります。

SKK サーバへのアクセス権は、ユーザ単位でないことに注意が必要です。確実に安全な環境でのみ使用することをおすすめします。

2013年12月28日(土)
0.5.6beta3
  • Google Japanese Input で候補が見付からなかったときの対策をした
  • Google 関連の文字列処理を C 文字列から文字列クラスに変更した
  • リファクタリング
2013年12月26日(木)
0.5.6beta2
  • リファクタリング
2013年12月26日(木)
0.5.6beta1
  • Google API へ https でアクセスできるようにした
  • Google suggest の一番上の候補を辞書として使えるようにした(japanese input では候補に出ない比較的新しい語対策)
  • configure で --disable-google-japanese-input が機能していなかった不具合を修正
  • 一部の IPv6 環境で Google API へアクセスできなかった不具合を修正
2013年10月12日(土)
0.5.5
  • MacOSX でビルドできなかった不具合を修正
  • configure の Google Japanese Input 設定をデフォルトで有効にした
  • yaskkserv normal と hairy に --no-daemonize オプションを追加

News ログ

つかいかた

まず yaskkserv_make_dictionary で専用の辞書を作成する必要があります。

$ yaskkserv_make_dictionary SKK-JISYO.L SKK-JISYO.L.yaskkserv

以上の操作で SKK-JISYO.L から SKK-JISYO.L.yaskkserv が作られます。

作成した辞書を指定してサーバを起動します。

$ yaskkserv SKK-JISYO.L.yaskkserv

作者は以下のように使用しています。この設定では Google に変換文字列が送信される上、変換した候補がサーバに接続可能なクライアントから推測可能であることに注意してください。

# yaskkserv --max-connection=32 --google-japanese-input=dictionary --google-japanese-input-timeout=1.0 --google-suggest --google-cache=2048 --google-cache-file=/var/cache/yaskkserv/yaskkserv.cache /DICPATH/SKK-JISYO.total+zipcode.yaskkserv https://www.google.com https://suggest.google.com

ビルドとインストールについて

できるだけ外部ライブラリや言語に依存しないようにしてありますので、ほとんどの環境で ./configure && make && make install 一発です。

と、いいながらも configure は Perl 製ですが、 Perl が無い場合は、大抵の環境で make -f Makefile.noperl でビルドできると思います。

コマンドラインオプションについて

オプション 機能 simple normal hairy
--check-update 辞書の更新をチェックし自動で再読み込みします。デフォルトは disable です。 ×
--debug 現在は使用していません。デフォルトは disable です。
--help ヘルプメッセージを表示し、終了します。
--log-level=LEVEL ログレベルを指定します。 0 - 9 の範囲で指定でき、数値が大きいほど詳細なログを出力します。ログは syslog に出力されます。デフォルトは 1 です。
--max-connection=N 最大同時接続数を指定します。デフォルトは 8 です。
--port=PORT ポートを指定します。デフォルトは 1178 です。
--server-completion-midasi-length=LENGTH completion で返す見出しの最大数を指定します。この数を越えると completion は失敗します。デフォルトは 0.3.5_SKK_ML_TEST_20070814_0 より前の版では 1024 、以降は 2048 です。あまり大きな値を指定する意味はない (補完候補は事実上 100 程度を越えた時点意味がなくなるのでは?) ので、デフォルトを小さな値にし失敗時に特定のメッセージを返すか、指定数までは返すような実装にすべきかもしれません。 × ×
--server-completion-midasi-string-size=LENGTH completion で生成される文字列バッファを LENGTH バイト用意します。生成される文字列がこのサイズを越えると completion は失敗します。デフォルトは 0.3.5_SKK_ML_TEST_20070814_0 より前の版では 131072 、 以降は 262144 です。 × ×
--server-completion-test=type SKK ML 「server completion の仕様の欠陥」で提案された 1 - 4 案を指定します。デフォルトは 1 です。 × ×
--google-cache=ENTRIES このオプションを使用すると、過去に変換した文字列を推測される恐れがあることに注意が必要です。 Google Japanese Input と suggest 用に ENTRIES 個のキャッシュを用意します。内部的には、 ENTRIES 個の小さなキャッシュと ENTRIES/16 個の大きなキャッシュが確保されます。 × × ○ (0.5.6beta4 以降)
--google-japanese-input=type type には disable, notfound または dictionary を指定します。デフォルトは disable です。 notfound は SKK 辞書に候補が見付からなかったときのみ Google Japanese Input を使用します。 dictionary は Google Japanese Input を辞書として使用します。辞書を https://www.google.com と指定すると Google Japanese Input になります。このモードでは変換するたびに Google にアクセスすることになります。 0.5.0beta3 以降で configure に --enable-google-japanese-input を付けてビルドした場合に有効になります。 0.5.6beta1 以降では https に対応し、 type に notfound-suggest-input と notfound-input-suggest が追加されました。 --google-suggest を指定したとき、辞書として https://suggest.google.com を使用できるようになりました。 × × ○ (0.5.0beta3 以降)
--google-japanese-input-timeout 0.5.0beta2 以降で configure に --enable-google-japanese-input を付けてビルドした場合に有効になります。タイムアウト時間を秒で設定します。デフォルトは 2.5 です。 × × ○ (0.5.0beta2 以降)
--google-suggest 0.5.6beta1 以降で configure に --enable-google-suggest を付けてビルドした場合に有効になります。 × × ○ (0.5.6beta1 以降)
--use-http 0.5.6beta1 以降で辞書(www.google.com or suggest.google.com)を明示しない API アクセス時に https ではなく http でアクセスします。 × × ○ (0.5.6beta1 以降)
--use-ipv6 0.5.6beta1 以降で IPv6 対応します。 × × ○ (0.5.6beta1 以降)
--no-daemonize 0.5.5 以降でデーモン化しません。 × ○ (0.5.5 以降) ○ (0.5.5 以降)
--version サーバのバージョンを表示し、終了します。

SKK ML 「server completion の仕様の欠陥」で提案された 1 - 4 案について

yaskkserv では以下のような実装になっています。

type サーバの実装
1 変更なし。
2 / を含む見出しを含めない。
3 スペース区切りにする。
4 プロトコル c を追加しスペース区切りにする。プロトコル 4 は / のまま。

Google Japanese Input について

0.5.0 から Google Japanese Input に対応しました。この機能は configure と yaskkserv の起動時双方にオプションを付けないと有効になりません。

--google-japanese-input=type の設定例

Google Japanese Input を使用しません。 --google-japanese-input=type を指定しない場合も disable になります。

$ yaskkserv_hairy --google-japanese-input=disable SKK-JISYO.L.yaskkserv

SKK 辞書に候補が見付からない場合のみ Google Japanese Input を呼び出します。 Google へアクセスする頻度が減るので、そこそこ軽快に動作します。

$ yaskkserv_hairy --google-japanese-input=notfound SKK-JISYO.L.yaskkserv

SKK-JISYO.L.yaskkserv の次に Google Japanese Input を辞書ファイルとしてふるまうよう呼び出します。(辞書を書くべきところに https://www.google.com と記述すると Google Japanese Input を指定したことになります。) 毎回 google へアクセスすることになるため、多少もたつきますが、 SKK 的ではない変換も可能になります。

$ yaskkserv_hairy --google-japanese-input=dictionary SKK-JISYO.L.yaskkserv https://www.google.com

SKK-JISYO.L.yaskkserv の前に Google Japanese Input を辞書ファイルとしてふるまうよう呼び出します。毎回 google へアクセスすることになります。あまりメリットはないかもしれません。

$ yaskkserv_hairy --google-japanese-input=dictionary https://www.google.com SKK-JISYO.L.yaskkserv

Google Japanese Input のみを辞書ファイルとして使用します。毎回 google へアクセスすることになります。辞書を用意するのが面倒なときに便利かもしれません。

$ yaskkserv_hairy --google-japanese-input=dictionary https://www.google.com

Google Japanese Input のみを辞書ファイルとして使用します。アクセスした結果はキャッシュされ、二度目以降は高速になりますが、どのような文字列を変換したかをレスポンス速度から推測可能であることに注意が必要です。

$ yaskkserv_hairy --google-japanese-input=dictionary --google-cache=1024 https://www.google.com

注意が必要な点

gcc3.3 系 + メモリが少ない環境でコンパイラのバグを踏む問題について

gcc3.3 系 + メモリが少ない環境で、コンパイラのバグを踏むためコンパイルできないという問題が確認されています。作者の環境ではメモリが 256M の機械でバグを踏みます。 512M の機械では問題ありません。この問題はオプティマイズレベルが高いと発生するようです。

yaskkserv-0.3.3 以降では configure でコンパイラバグを踏みそうな環境を検知し、自動的にオプティマイズレベルを下げます。

yaskkserv-0.3.3 より前のバージョンでは

といった対処をする必要があります。

ビルドについて

その他

独自形式の辞書について

以下のような特徴があります。

探索コアで必要なメモリサイズ

使用した辞書は 2005年10月12日(水) あたりの SKK-JISYO.total+zipcode です。(482220 エントリ 15930937 bytes)

「最小サイズ」はインデックスデータとブロックリードバッファを同じ領域に置くことでメモリを節約した場合のサイズです。(この場合は当然、インデックスデータを毎回ストレージから RAM へ読み込む必要があります。)

現在の実装ではインデックスデータとブロックリードバッファを別に確保するので、「合計サイズ」だけメモリを消費します。

「--short-block」は辞書サイズを大きくすることでインデックスデータを小さくする形式です。

オプションブロックリードバッファサイズインデックスデータサイズ合計サイズ最小サイズ
--block-size=40964k58k62k58k
--block-size=81928k32k36k32k
--block-size=1638416k18k36k18k
--block-size=4096 --alignment --short-block4k36k40k36k
--block-size=8192 --alignment --short-block8k20k28k20k
--block-size=16384 --alignment --short-block16k11k27k16k

辞書サイズ

SKK-JISYO.total+zipcode (482220 エントリ 15930937 bytes) をコンバートした場合のサイズです。

オプションサイズ比率
--block-size=40961415264888.8%
--block-size=81921412525288.6%
--block-size=163841411150088.5%
--block-size=4096 --alignment1465645691.9%
--block-size=8192 --alignment1510419694.8%
--block-size=16384 --alignment1592602899.9%
--block-size=4096 --alignment --short-block1463507291.8%
--block-size=8192 --alignment --short-block1509315694.7%
--block-size=16384 --alignment --short-block1592020099.9%

「ひらがなエンコード」について

文字列がひらがなまたは ASCII だけで構成されていれば下位バイトのみ使用し、それ以外の文字が存在する場合は先頭に \x1 を追加するエンコード形式です。

ex.)
ああああ → \xa2\xa2\xa2\xa2 (下位バイトのみ)
ひらがな漢字 → \x1ひらがな漢字 (先頭に \x1)
LIFEFORCE → LIFEFORCE (ASCII のみ)
ぐらでぃうす2 → \xb0\xe9\xc7\xa3\xa6\xb9\x32 (下位バイト + ASCII)
沙羅曼蛇 → \x1沙羅曼蛇 (先頭に \x1)

見出しやインデックスデータ中の文字列でこのエンコード形式を採用しています。

「インデックスデータ」について

インデックスデータは一般に RAM 上へ置かれます。ここでストレージ上にある辞書の読み込むべきブロックが確定するため、ストレージへのアクセスは 1 度の探索あたり必ず 1 回以下 (運が良ければキャッシングされ 0 回) になります。

インデックスデータをストレージに置いておき、ブロックリードバッファと同じ領域に読み込んでから使うこともできます。この場合メモリは節約できますが、ストレージへのアクセスが 1 度の探索あたり必ず 2 回 (インデックスデータの読み込み + 辞書のブロック読み込み) になります。

インデックスデータは以下の要素から構成されます。 (詳しくはソースコード skk_jisyo.hpp のコメントをごらんください。)

struct FixedArray は「通常エントリ」の探索に使用します。「ひらがなエンコード」された先頭 1 バイトが添字となります。「特殊エントリ」は struct FixedArray を参照せず、直接ブロックを探索します。

struct FixedArray には struct Block の開始インデックス、長さとブロック終端文字列へのオフセットが含まれています。ここで指定されたどこかのブロックに探索文字列は存在することになります。どのブロックに含まれるかは、ブロック終端文字列と探索文字列を比較することで判定します。

                                            文字列を比較して
                        +---------+         「探索文字列」が「終端文字列」以下ならば
                        |Block N-1|         そのブロックに存在
+----------+   index=N  +---------+         探索文字列が "あい" ならば Block N+1 に存在
|FixedArray|--+-------->|Block N  |
+----------+  |    ^    +---------+---"ああああ" Block N の 終端文字列
              |    |    |Block N+1|
              |  len=4  +---------+---"あいいいいい" Block N+1 の 終端文字列
              |    |    |Block N+2|
              |    v    +---------+---"あかかかか" Block N+2 の 終端文字列
              +-------> |Block N+3|
                        +---------+---"あさささ" Block N+3 の 終端文字列
                        |Block N+4|
特殊エントリ開始        +---------+
ブロック -------------> |Block N+5|
index = N+5             +---------+
                        |Block N+6|
                        +---------+

struct Block の個数と文字列格納領域は 2005年10月12日(水) あたりの SKK-JISYO.total+zipcode の値です。

ブロックサイズstruct Block の個数 (通常エントリ + 特殊エントリ)文字列格納領域 (通常エントリ + 特殊エントリ)
4k3563 + 1 個27644 + 4 bytes
8k1839 + 1 個14043 + 4 bytes
16k970 + 1 個7241 + 4 bytes

「ブロック」について

ブロックサイズが大きいとインデックスデータサイズは小さくなりますが、ブロックの読み込みに時間がかかり、ブロックリードバッファ内での探索時間が少し増えます。

ブロックサイズが小さいとインデックスデータサイズは大きくなりますが、ブロックの読み込み時間とブロックリードバッファ内での探索時間は減ります。しかし同一の struct FixedArray に含まれる struct Block が増え、ここでの探索時間が少し増えます。

いろいろ

作者の環境

yaskkserv は以下の環境で動作確認しています。

OSCPUcompiler
gentoo linux(amd64)Core i7 CPU L 620g++ (Gentoo 4.4.5 p1.3, pie-0.4.5) 4.4.5
gentoo linux(amd64)Athlon X2 4850eg++ (Gentoo 4.4.5 p1.2, pie-0.4.5) 4.4.5
gentoo linux(x86)Atom N455g++ (Gentoo 4.4.5 p1.3, pie-0.4.5) 4.4.5

なぜいまさら SKK サーバを書くの?

わざわざ書きおこしたのは

といった理由からです。

特徴

サーバについて

用途によって、いくつかのサーバを用意しています。

yaskkserv_simple
もっともシンプルなサーバ (skkserv から辞書再読み込み機能を除いたもの相当)
yaskkserv_normal
一般的なサーバ (skkserv + 複数辞書 + 辞書の自動再読み込み相当)
yaskkserv_hairy
なんでもありサーバになる予定 (yaskkserv_normal + server completion + beta 版では Google Japanese Input API に対応)

基本戦略

めも

辞書変換時間

コマンド yaskkserv_make_dictionary の実行にかかる時間を time で適当に計測してみました。

使用した辞書は 2005年10月12日(水) あたりの SKK-JISYO.total+zipcode です。(482220 エントリ 15930937 bytes)

CPUメモリOS変換にかかった時間
P3-600320Mgentoo linux4-6 sec.
C3 1000256Mgentoo linux3-5 sec.
C3 1000512Mgentoo linux3-5 sec.
Athlon64 X2 3800+2Ggentoo linux(amd64)1 sec. 程度

SKK protocol メモ

"0"

サーバへコネクションを切断するよう要求します。

"1eee "

「見出し」 eee に対する「変換文字列」を要求します。 " " (スペース)でターミネートされていることに注意が必要です。

サーバから返される「変換文字列」は / で区切られた "1/foo/bar/baz/\n" のような形式です。

サーバから返される文字列の末尾には "\n" が必要なことに注意が必要です。

「見出し」が存在しない場合は入力の先頭の "1" を "4" に変換したものをそのまま返します。 (実はプロトコル的には 4 で始まる文字列ならば何でも良いらしいですが、一部のクライアントで問題が出るとのことです。)

"2"

サーバへ「バージョンナンバー」を要求します。

サーバから返される「バージョンナンバー」は "A.B " のような形式です。 " " (スペース)でターミネートされていることに注意が必要です。

skkserv/skkserv.c に A はメジャーバージョン B はマイナーバージョンのような記述がありますが、 skkserv 自体 "A.B.C " のような形式で返していますし、他のサーバではサーバ文字列を返しているものもあるので、バージョンナンバーというよりバージョン情報と表現すべきなのかもしれません。

"3"

サーバへ「サーバのホスト名と IP アドレスのリスト」を要求します。

サーバから返される「サーバのホスト名と IP アドレスのリスト」は "hostname:addr:[addr...:] " のような形式です。 " " (スペース)でターミネートされていることに注意が必要です。

yaskkserv では未実装です。(ダミー文字列が返されます。)

"4eee "

「見出し」 eee で始まる見出しを要求します。" " (スペース)でターミネートされていることに注意が必要です。

サーバから返される「見出し」は / で区切られた "1/foo/bar/baz/\n" のような形式です。

サーバから返される文字列の末尾には "\n" が必要なことに注意が必要です。

これは新しいプロトコルで、今のところきちんとした定義は無いようです。

あいまいな点としては

といったものが挙げられます。

yaskkserv では

といった実装になっています。

上記以外の不正な入力について

skkserv/skkserv.c ではデバッグモード時にエラーメッセージをコンソールへ出力するだけのようです。

yaskkserv-0.3.0 以降では "0\n" を返します。 yaskkserv-0.3.0 より前は何も返しません。

SKK メモ

SKK に関するメモ

情報ソース
見出しサイズは 510 バイトskkserv/README
プロトコルskkserv/skkserv.c 、 regex-skkserv の MEMOSKK専用スレッド Part7 の 74 さん

戻る