unixらしい、かな漢字変換システムなら、ソースがないといやだ。 いざとなれば自分でメンテナンスできる。 変換効率が多少良くても、バイナリだけじゃ、どうしようもない。
-->Sj3は良さそうだと噂をきいて、 試しにインストールして、ちょっと使ってみたけれど、 デフォルトの設定ファイルがほげほげで、 なんだこりゃと思われる、そんな状況です。 最初から、canna や emacs-egg 風のインターフェースなら、 良さをわかってもえらえるのに、もったいない。
更新履歴:
2008-08-10 FreeBSD 7.0
2007-09-05 FreeBSD 6.2 での問題
2007-03-08 環境変数のこと
2005-06-26 FreeBSD 5.3 と 4.11 の sj3 の問題
2004-11-08 .sjrc 修正 for Moziila 落ち
2004-02-17 最近の FreeBSD ではソースから make 一発とはいきません
2003-03-05
2002-11-04 強化辞書
2002-02-18
since 2001-10-04
もくじ
賢くて軽くて、しかもフリー
なぜマイナーなの
Sj3とWnnとCannaの比較
Sj3 対策済み 設定ファイル .sjrc (euc-jp)
Sj3 対策済み 設定ファイル .sjrk (euc-jp)
Sj3 対策済み 設定ファイル .sjhk (euc-jp)
Sj3 システム辞書 増補版(9万語) visual+.dic.gz (gzipped euc-jp)
Sj3 ユーザー辞書の一例 sj3dictext (euc-jp)
kinput2-v3.1用 非公式パッチ AuxPanel.c.diff (iso-2022-jp)
デフォルト設定ファイルの問題点 (euc-jp)
Sj3日記 (euc-jp)
FreeWnnやWnn6やCannaやSKKに比べるとマイナーなSj3。
Sj3は, Sony NEWSの遺産です。
Sj3はもともと,Sonyのワークステーション"NEWS"(日本語がちゃんと使えたBSD)に搭載されていたかな漢字変換システムでした. NEWSはもうなくなってしまいましたが, Sj3のソースはフリーになってSonyから公開されています. (フリー版Sj3は,NEWS版Sj3のすべての機能を完全に含んではいないそうですが)
Sj3には、かな漢字変換サーバーのsj3servと, 端末用日本語入力フロントエンドのsj3などが含まれます.
小文字のsj3は、端末用日本語入力フロントエンドを指し, 大文字で始まるSj3は、sj3servとsj3などを含んだかな漢字変換システム全体を指すものとします。
kinput2-sj3は、sj3servと通信できるようにしたkinput2(X用日本語入力フロントエンドのひとつ)のことです. 厳密に言えば, kinput2-sj3は,Sj3ではありません.
変換効率の高いsj3servは、kinput2からでも、muleからでも利用できるにもかかわらず、ほとんど使われていないそうです。
たぶん、デフォルトの設定ファイルがいい加減なので、デフォルトでちょっと使ってみて、だめだこりゃと思われてるのかもしれません。
デフォルトの設定ファイルには少し問題があって、そのまま使うとSj3そのものの印象が悪くなってしまいます.
WnnとCannaとSj3はフリーのかな漢字変換サーバーの御三家で、変換効率が高いのがSj3だと言われていました。しかもSj3は非常に軽い。Wnnは商用Wnn6(1万円)になってSj3を変換効率でわずかに追い超したかもしれませんが, フリー版Sj3の約20倍のメモリを消費します。
Sony NEWSを使っていて、Sj3のことを知ってたとか、Wnn4やCanna3.2の変換効率の悪さに嫌気がさしていた、という条件が重ならないと、WnnとCannaの影に隠れてしまっているSj3を信じてじっくり使ってみようとはなかなか思わないかもしれません。
雑誌や本も、WnnとCannaを紹介しただけで終わってしまいます。「BSDを256倍使うための本」(アスキー 1995/03)に紹介されてるのが唯一かも。 紹介されることが少ないからますます誰にも知られなくなる。
sj3servは軽くて賢くて、kinput2-sj3は柔軟で強力にカスタマイズできるし, ユーザー辞書登録の設計もスマートでクール。
sj3servが賢いといってもそれは他にWnn4やCannaしかなかったころの話です。Wnn6/Wnn7/ATOK/VJEなど商用かな漢字変換システムが登場している現在, sj3servだけが優位とは言えないのですが, Wnn6程度の変換効率ならとっくのむかしにsj3servは持っていました。
しかも,フリーでソースが公開されてますから,どんなunixでも make すれば動いてくれます.
Wnn6のようにバイナリだけ売るという形では, OSがどんどん新しくなっていくフリーなunixに対応できません. わたしもWnn6のバイナリの正規ユーザーですが、ソースがないものには愛着をもてないし、バイナリが古いから、最新のFreeBSDではいろいろ問題があって使いにくくなってきてるし、だからといってWnn7に買い替えるのも納得いかないし。
ソースがあればいつでもmakeしなおして完璧な状態に維持できるのにね.
kinput2で辞書登録が最もスマートに行えるのもSj3を使う利点です。
正しく変換できた時点で、確定する前に、C-tで辞書登録モードに入ります。このとき反転表示されてる文節が登録対象になります。対象文節はC-i/C-oで長さを調節します。あとは読みと品詞を入力するだけ。つまりegg並の操作性です。
kinput2-cannaの辞書登録は最初からまた変換し直しさせられてしまいます。せっかく変換した漢字が無駄になります. とてもスマートとは言えません.
kinput2-wnnはそれ自体に辞書登録の手段がないし, 頻度情報は保存できるものの文節区切り情報までは保存できません。
(kinput2-wnnのプロセスを kill -TERM した時点で頻度情報だけは書き出します。だから kill -TERM する前に shutdown -h now などやっちゃうと駄目)
辞書登録はdtoa/atodなどのWnn辞書メンテナンス用コマンドに頼るしかなく、これらのコマンドは一括登録な設計なので、日常のこまめな単語登録には使いにくい。
結局, Wnn系はemacsのeggで使うものなのでしょう. emacsしか使わない人にとってkinput2はtgifやMozillaで使う程度の存在だから、辞書登録の手段がkinput2に無くてもたいしたことではない.
kinput2しか使わない場合(vi や emacs -nw), 辞書登録の操作性は気になる問題です.(テキスト化されてるユーザー辞書をエディタで開いて単語を追加してから,コマンドでバイナリにすればいいじゃないかと言えばそれまでですが)
ユーザー辞書メンテナンスコマンドsj3dicもスマート。
分散した環境(会社と自宅とノートパソコン)でのユーザー辞書のメンテナンスがとても楽。ユーザー辞書の差分を気にする必要なくユーザー辞書のアップデートができます。(この辺りに関してはCannaのコマンドcatdic,addwords,delwordsもよくできてるのですが独特の品詞コード丸出しなのでわかりにくい. たとえば#T35といわれても何の品詞か想像できませんし、その品詞コードの説明が文書になってないし)
Sj3のソースはパッチが統合されていてすっきり。
そのまま、FreeBSD/NetBSD/OpenBSDやLinuxであっさりmakeできてしまいます。
(BSD系ならそのままmakeいっぱつ、Linuxの場合はほんの一部だけの修整でmakeできます)
(2004-02-17: 最近のFreeBSDでは「ソースから make いっぱつ」とはいかなくなっています。いろんなパッチをあてないと make できません。portsで入れたほうが楽です)
前提
Canna は 3.2
Sj3 は 2.0.1.20_1
FreeWnn は 1.1.1
Wnn6 は R3.02
kinput2 は 3.1b2
skkinput は 2.03
emacs系から使った場合のことは考慮していません。
特にWnn6はkinput2で使うと本来の能力を発揮しません。
kinput2-wnn6は頻度を学習保存できる。文節は学習も保存もできない.
kinput2-freewnnは頻度を学習保存できる。文節は学習も保存もできない。
kinput2-cannaは文節の状態によって頻度が学習保存できる場合とできない場合がある。このあたりのなんともいえない一貫性のない怪しさはCannaの特徴。文節は学習も保存もできない。
(Canna3.5b2ならきちんと頻度と文節の学習ができます。頻度と文節の保存もできます。Cannaなら3.5b2がいいと思う)
kinput-sj3は頻度と文節のどちらも学習保存できる.
(辞書メンテナンス用のコマンドを使わずに)単語登録できるのは,
kinput2-canna
kinput2-sj3
skkinput
です.
cannaは辞書登録しにくい.
「F1押してメニュー出して辞書登録を選んで単語を変換してから」読みを入力する。
テキスト辞書を辞書メンテナンス用コマンドで管理できるが、品詞がコードむき出しなので品詞コード表と首っ引きになる.
品詞コードをいっぱい増やして変換効率を稼ぐ設計思想なので、品詞コードをむき出しにせざるを得ないんだろうけど。
辞書メンテナンス用コマンドはたとえば以下のように使う.
(ユーザー辞書をuserという名前で作ってるとして)
catdic user > cannadictext addwords user < cannadictext
sj3は「C-tを押す」だけで読みを入力できる.
(つまりemacs-egg並のスマートさ)
辞書メンテナンス用コマンドは優秀。上書きではなくマージしてくれるのでテキスト形式辞書が複数ある時に使いやすい。親切でスマートな設計.
sj3dic -text > sj3dictext sj3dic -dict < sj3dictext
wnn系はkinput2から辞書登録できない.
辞書メンテナンス用コマンドを使ってテキスト形式辞書を単純にバイナリ形式辞書に変換して使う。これはこれで慣れてしまえば便利な方法ではあるが、テキスト辞書をそのまま単純にバイナリ辞書に変換するだけなので複数のテキスト辞書があるとマージが面倒。このあたりのぶっきらぼうさはWnnっぽい.
(ユーザー辞書が/usr/local/lib/wnn/ja_JP/dic/usr/$USER/udの場合)
dtoa /usr/local/lib/wnn/ja_JP/dic/usr/$USER/ud > wnndictext atod /usr/local/lib/wnn/ja_JP/dic/usr/$USER/ud < wnndictext wnntouch /usr/local/lib/wnn/ja_JP/dic/usr/$USER/ud
Wnn6 >= Sj3 > FreeWnn > Canna
(最近は、Wnn6 >= Sj3 > FreeWnn >= Canna)
Wnn6がいいけど、Sj3の20倍のメモリを消費するし、巨大なシステム辞書(岩波辞書)を最初から持ってるわけだから当然ともいえる。
ユーザー辞書を強化してあるSj3とWnn6の差は、文脈の判断にわずかに現れる程度である. Sj3のほうが有利な(Sj3のエンジンの賢さを思わせる)場面もあって総合的(体感的)にはWnn6とSj3は互角といえる. Sj3には文節区切り学習機能があるので、Sj3がWnn6より良い変換を見せる場合もある。逆にSj3の文節区切り学習は効きすぎて邪魔なときもたまにある。
canna3.5b2ならSj3並の変換効率をみせるけどやはりcanna自体の限界かなと思わせるところは残る. cannaはユーザー辞書登録が素直に変換効率の向上に現れないような気もする. cannaは品詞コード分けが独特で細かいものだから、ユーザー辞書を強化しにくい.
FreeWnnはユーザー辞書を強化しないとcanna3.5b2 に負けるが、
ユーザー辞書さえ強化すればSj3並になる。
ユーザー辞書の強化が素直に変換効率に反映してくる。
FreeWnnで岩波辞書が使えればWnn6とたいした違いは無いのではないか。
skkは美しい。最近は skkinput が Mozilla で問題なく使えるようになってきてるので、うれしい。
設定ファイルだけで終了キーを変更する方法がわからない。viではESCキーでkinput2を切りたい。(続けてESCでinsertモードも切れて便利)
skk系はshiftキー入力が頻発するから、文章の発想の流れが淀んでしまう。シフト連発は慣れればなんともないのかもしれない。
kinput2はバージョン3.1b2以降からATOKが使えます. ATOK X for Linux(9800円)を持ってないので何も書けません. 文脈解析変換(「それ」「その」などの指示詞にも対応)が売りみたいですが, とっくにWnn6で実現されてることなので特にアドバンテージはないと思う.
ちなみにフリー版Sj3は文脈解析はできませんが, NEWS版Sj3は文脈解析らしきことをやってたようです. その辺のコードを削られたものがフリー版として公開されてるのかもしれない. 文脈解析なんて大げさなことが, かな漢字変換システムに, ほんとに必要かということについては疑問があります. 文節の区切り方を学習する機能が賢ければ, 文脈解析までできなくても実用的にはそんなに困らないというのが実感です.
対策済み設定ファイルはそのまま使えます. ぜひ使ってみてください. 自分用にどんどんカスタマイズしてください。カスタマイズの柔軟さは kinput2-sj3 の利点のひとつです。
システム辞書増補版は、単漢字、人名、地名を大幅に補強してあります. (システム辞書は約9万語までという制限があるので、一般的名詞はあえて補強してません)
ユーザー辞書は 変換エンジンの弱点を少し補強します.
パッチは、kinput2 -sj3の辞書登録モード時の junk pointer を解決します。FreeBSD-4.6.2とXFree-4.2.0で動作確認済み。(2002-11-04)
対策済み Sj3設定ファイル .sjrc.kinput2 (euc-jp)
対策済み Sj3設定ファイル .sjrk (euc-jp)
対策済み Sj3設定ファイル .sjhk (euc-jp)
Sj3システム辞書増補版(9万語) visual+.dic.gz (gzipped euc-jp)
Sj3ユーザー辞書の一例 sj3dictext (euc-jp)
kinput2-v3.1用 パッチ AuxPanel.c.diff (iso-2022-jp)
kinput2-v3.1用 パッチ patch-AuxPanel.c (iso-2022-jp)
AuxPanel.c.diffと patch-AuxPanel.cは 同じ内容です。形式が違うだけです。
FreeBSDの場合、patch-AuxPanel.cを /usr/ports/japanese/kinput2-freewnn/files/に置いてから /usr/ports/japanese/kinput2-sj3/で make; make install するだけでOK
です。
ようするに、対策済み設定ファイルを kinput2 に読ませるにはどうするか、ということです。
kinput2 は 環境変数 SJ3SERV, SJRC, SJRK を見ます。環境変数が設定されてない場合、単純に kinput2 -sj3 を起動するとデフォルトの /usr/X11R6/lib/X11/sj3def/sjrc などが読まれます。
% su # cp -p /usr/X11R6/lib/X11/sj3def/sjrc /usr/X11R6/lib/X11/sj3def/sjrc.orig # cp -p /usr/X11R6/lib/X11/sj3def/sjrk /usr/X11R6/lib/X11/sj3def/sjrk.orig # cp -p /usr/X11R6/lib/X11/sj3def/sjhk /usr/X11R6/lib/X11/sj3def/sjhk.orig # cp .sjrc.kinput2 /usr/X11R6/lib/X11/sj3def/sjrc # cp .sjrk /usr/X11R6/lib/X11/sj3def/sjrk # cp .sjhk /usr/X11R6/lib/X11/sj3def/sjhk # exit
あとは
% kinput2 -sj3 &
です。
環境変数 SJRC, SJRK が関係します。
環境変数を設定しないとホームディレクトリの設定ファイルは読まれません。
単純に kinput2 -sj3 を起動するとデフォルトの /usr/X11R6/lib/X11/sj3def/sjrc などが読まれます。
sjrc はもうひとつあります。/usr/local/lib/sj3/sjrc です。これは sj3 用の設定ファイルです。kinput2 用の設定ファイルではありません。
すでに sj3 を使っているなら、ホームディレクトリにはもう .sjrc があるかもしれません。
ホームディレクトリに sjrc を置くとき、きちんと区別するために、
sj3 用設定ファイルの名前を .sjrc
kinput2 用設定ファイルの名前を .sjrc.kinput2
にします。
で、kinput2 には ~/.sjrc.kinput2 を読ませればよいわけです。
ですが、kinput2 は環境変数 SJ3SERV, SJRC, SJRK しか見ないと思うので、sjhk をどうするかという問題が残ります。sjhk だけはシステムのデフォルトファイルを置き換えるしかありません。
設定ファイルの切り替えには環境変数を設定してから kinput2 を起動する必要があります。 環境変数を毎回設定するのはめんどくさいので、コマンドにしておきます。 コマンドの内容は
#!/bin/sh export XMODIFIERS="@im=kinput2" export SJ3SERV="localhost" export SJRC=".sjrc.kinput2" export SJRK=".sjrk" kinput2 -sj3 &
これをホームディレクトリの bin ディレクトリに ks という名前で置きます。 実行可能にしておきます。
% chmod 700 ~/bin/ks
あとは
% ks
で kinput2 が起動します。
おまけ: kinput2 を kill するコマンド kk
#!/bin/sh num=`ps -ax|grep 'kinput2 -'|grep -v grep|awk '{printf("%s",$1)}'` if test -n "$num"; then echo "kinput2: $num" kill $num echo "killed (pid $num)." exit 0 else echo "$0: Cannot find the process." exit 1 fi
Sj3をインストールすると、辞書管理用のコマンドもいろいろ入ります。
sj3mkdic は、EUC のテキスト単語辞書ファイルから sj3serv(1) で使用できるバイナリ形式の辞書ファイルに変換します。 変換された辞書のファイル名は必ず ".dic" で終わるようにしてください。
% sj3mkdic word_dict_text output.dic
ちなみに、Sj3のシステム辞書(バイナリ) sj3main.dic (29770語)は、 sj3mkdic コマンドで visual.dic から作られたものです。
% sj3mkdic visual.dic sj3main.dic
sj3dic は、仮名漢字変換サーバ sj3serv(1) とソケットを使用したプロセス間通信をすることにより、サーバの動作しているマシン上のユーザ辞書をメンテナンスします。
1) ビジュアルユーザ辞書ファイルの作成
サーバマシン上のユーザ辞書(private.dic)の内容を編集可能なテキストに変換し output_file に出力します。
% sj3dic -text > output_file
2)ユーザ辞書ファイルへの追加登録
ビジュアルユーザ辞書ファイルである input_file の内容をサーバマシン上のユーザ辞書(private.dic)に追加登録します 。
% sj3dic -dict < input_file
% gunzip visual+.dic.gz % sj3mkdic visual+.dic temp.dic
できた temp.dic を sj3main.dic という名前で
/usr/local/lib/sj3/dict/ に置きます。
ユーザーの study.dat は残ってるとまずいので消しておきます。
/usr/local/lib/sj3/dict/user/$USER/study.dat を消してから
sj3servを kill -TERM してから起動します。
kill -HUP では辞書が読み込まれません。
# cp -p temp.dic /usr/local/lib/sj3/dict/ # cd /usr/local/lib/sj3/dict # mv sj3main.dic sj3main.dic.original # mv temp.dic sj3main.dic # rm user/$USER/study.dat # kill -TERM `ps | grep kinput2 | awk '{printf("%s",$1)}'` # kill -TERM `ps | grep sj3serv | awk '{printf("%s",$1)}'` % sj3serv % kinput2 -sj3 &
have fun!
Sj3とKinput2のソースは次のところでダウンロードできます。
(2002-11-04)
ftp://ftp.sony.co.jp/pub/unsupported/src/ (サービス終了)
ftp://ftp2.jp.freebsd.org/pub/FreeBSD/ports/distfiles/
ftp://ftp.sra.co.jp/pub/x11/kinput2/
ftp://ftp2.jp.freebsd.org/pub/FreeBSD/ports/distfiles/
2008-08-10
FreeBSD-7.0 の /usr/ports/japanese/sj3 は i386 でさくっと動きます。 おー。かっこいぃ。ありがとうございます。
2007-09-05
FreeBSD 6.2 でも /usr/ports/japanese/sj3/ が相変わらず壊れているのですが、 以前に紹介した方法 「files を PORTREVISION 1 に戻して、 Makefile で patch site を見ないようにする」 だけでは make できなくなっています。 原因は libxpg4 がリンクできないことだけです。 ちょっとコンフィグレーションをいじる必要があります。
FreeBSD 6.2 なら libxpg4 は要りませんから、 sj3.tmpl ファイルの CODE_LIBS が -lxpg4 な行を削除すればいいだけです。 sj3.tmpl を手で書き換えたほうが早いような話ですが、 パッチ patch-sj3.tmpl を作ってみました。 「files を PORTREVISION 1 に戻して、 files の patch-ad を削除して、 files に patch-sj3.tmpl を置いて、 Makefile で patch site を見ないようにする」 と make できます。 kinput2-sj3 でかな漢字変換できることをで i386 で確認しています。
/usr/ports/japanese/sj3/files/ を PORTREVISION 1 の頃の内容に戻す方法は以下を読んでください。戻すのにたいした手間はかかりません。ソースとパッチで make しましょう。
ここには make package したバイナリはあえて置いていません。 非公式の package を非公式のサイトからダウンロードして pkg_add でインストールする行為は推奨されるべきではありません。 だからここには make package したバイナリはあえて置いていません。 パッチならどんなことをしているか一目瞭然です。
2005-06-26
開発元 Sony による公式配布 (ftp.sony.co.jp) が 2005年3月31日で終了してしまいました。セキュリティに関するパッチがソースに取り込まれた最後の bug fix は 1998年でした。その最新(最終)のソース (version 2.0.1.20) は FreeBSD の distfiles にあります。
FreeBSD-4.11 から ports/japanese/sj3/ が壊れています。
sj3serv が動きません。make できますし、sj3serv は起動しますし、クライアントと通信もできてますが、かな漢字変換ができません。
動かない port は sj3-2.0.1.20_3 です。 FreeBSD-4.10 で動いていたのは sj3-2.0.1.20_1 でしたから PORTREVISION が 1 から 3 へあがってます。
メンテナさんが変わっています。
新しいメンテナさんが作ったパッチキット
sj3-patches-20040916.bz2
に問題があるようです。
これを使うと sj3serv が動かなくなります。
ちょっと予習:
ports/japanese/sj3/files/ に置かれるパッチ群
- strcpy(tmp, path); + strlcpy(tmp, path, sizeof(tmp)); - strcpy(tmp, dict_dir); - strcat(tmp, "/"); - strcat(tmp, path); + snprintf(tmp, sizeof(tmp), "%s/%s", dict_dir, path); strcpy(path, tmp);
上記以外のパッチ群は、既に本家のソース (version 2.0.1.20) にとりこまれています。 ソースと上記のパッチ群があれば FreeBSD/i386 で build できるはずです。
で、port revision 3 は
patch-aa, patch-ab 以外の (in the Attic な) パッチ群を、
files から出して sj3-patches-20040916.bz2 にまとめています。
この sj3-patches-20040916.bz2 には、新しいメンテナさんの書いた追加パッチが含まれます。その追加パッチが問題です。
とにかく動きません。
なので、
revision 3 ではなく 1 を (sj3-2.0.1.20_1 を)
FreeBSD の cvsweb からダウンロードします。
i386 の 5.4-RELEASE で make install できました。かな漢字できてます。
amd64 マシンがないので確認できませんが、
revision 1 (sj3-2.0.1.20_1) は BROKEN on amd64 and ia64: Coredump during build (by kris) です。
revision 2 から amd64 で build できるよう改造中なので (development status なので)ちゃんと動かない、ということかもしれません。
であれば sj3/ と sj3-devel/ にきちんと別けてほしい。