Emacsの最近のブログ記事

ruby マークアップ・ツール

|

昨日書いた泉鏡花『貧民倶樂部』の記事において,鏡花テクスト引用のために大量のルビをマークアップしなければならなかった。HTML で <ruby><rb></rb><rp></rp><rt>これ</rt><rp>)</rp></ruby> とマークアップすると,これ となる。<ruby> タグをサポートしていないブラウザならタグ以外のテキストがそのまま出力されて 此(これ)となる。LaTeX にも奥村先生のマクロ集に \ruby 命令があり,この場合は \ruby{此}{これ} とマークアップする。これらのルビ付加用マークアップ作業は,やっている最中に元の文章が分断されて判りにくくなりかつ極めて面倒なので,私は自分で書いた簡単なツールで一括整形している。今日はその整形ツール convertruby を紹介しておく。私は Mac OS X で使用しているが,FreeBSD, Linux でも動作するはずである。同じ必要に迫られた方はプログラム・コードをコピってお使いください。

このツールは,標準入力から UTF-8 テキストを読み,此(これ)のように,漢字 + + 読み + のように書いた文字列に対して,マークアップを行う。デフォルトでは HTML タグを付加する。-l オプションを指定すると LaTeX 形式で整形する。対象テキストの括弧は全角でないといけない。そういう融通の利かないところがある。開括弧より前のテキストを後ろから逆方向に走査し,漢字以外が出現するまで漢字をスタックにプッシュし,あとでこのスタックからポップして得られる文字列(先入れ後出しにより文字の順番が戻る)を親文字と判定する。「漢字」は Unicode CJK 統合漢字に属するかを \p{InCJKUnifiedIdeographs} 正規表現文字クラスで判断している。Perl コードは以下の通り。

#!/usr/bin/perl -w
# -*- coding: utf-8; mode: cperl; -*-
#
#     convertruby: ルビ・マークアップ
#     - ベタのテキストを <ruby> or \ruby シーケンスに整形する
#     - 例: 此(これ) ["(", ")" は全角括弧]
#       -> <ruby><rb>此</rb><rp>(</rp><rt>これ</rt><rp>)</rp></ruby> (default)
#       -> \ruby{此}{これ} (with -l option)
#     - usage: convertruby [-l] < stdin
#          -l: for LaTeX; default: for HTML
#
use strict;
use utf8;
use Getopt::Std;
use File::Basename;
binmode(STDOUT, ":utf8");
# コマンドライン・オプション処理
my %opts = ('l' => 0);
Getopt::Std::getopts('l', \%opts) ||
    die "Usage: " . basename($0) .
    " [-l] \< (stdin)\n   -l: for LaTeX; default: for HTML\n";
# 行毎の主処理
while (<STDIN>) {
    my $line = $_;
    utf8::decode($line); utf8::decode($_);
    my ($yomi, $leftt, $rightt);
    # 「(読み)」を含まない行はそのまま出力
    unless ($_ =~ /([^)]*)/gi) {
        print $line; next;
    }
    # 「(読み)」を走査し,これがある限りその前後を切り出す
    while ($line =~ /([^)]*)/gi) {
        $yomi = $&; $leftt = $`; $rightt = $';
        # 「(読み)」から括弧を外す
        $yomi =~ s|[()]||g;
        # 対象漢字部を後方から走査し,漢字スタックに push する
        my @kstack = (); my $k;
        my @istack = split(//, $leftt); # 「読み」の左側テキストの文字配列
        while ((@istack) &&
               (($k = pop(@istack)) =~ /\p{InCJKUnifiedIdeographs}/g)) {
            push(@kstack, $k); $k = "";
        }
        # 最後に pop した非漢字を左側テキスト配列スタックに戻しておく
        push(@istack, $k) if ($k);
        # 漢字スタックから漢字部文字列を pop で復元
        my $kanji = "";
        while (@kstack) {
            $kanji .= pop(@kstack);
        }
        # 抽出した漢字部よりも前の文字列を出力
        if (@istack) {
            print $_ for @istack;
        }
        # ruby マークアップ部分を出力
        if ($kanji) {
            if ($opts{'l'}) {
                # LaTeX (with -l option)
                print '\ruby{' . $kanji . '}{' . $yomi . '}';
            } else {
                # HTML (default)
                print '<ruby><rb>' . $kanji .
                    '</rb><rp>(</rp><rt>' . $yomi . '</rt><rp>)</rp></ruby>';
            }
        } else {
            # 「漢字(読み)」のパターンでないものはそのまま出力
            print "($yomi)";
        }
        # 走査対象文字列に右側テキスト(残り)文字列を格納して,繰り返し
        $line = $rightt;
    }
    # 残り文字列を出力
    print $rightt if ($rightt);
}
GNU Emacs からは,以下を .emacs に追加すれば,利用できるようになる。ここでは convertruby/usr/local/bin 下にインストールされているものとしている。この定義を Emacs に評価させた後,テキスト・リージョンを指定し,M-x convert-ruby-html, M-x convert-ruby-latex を実行すると,当該リージョンがそれぞれ HTML, LaTeX のルビ・マークアップ整形を施される。

;; convertruby for HTML
(defun convert-ruby-html (start end)
  "Convert text to ruby HTML sequence."
  (interactive "r")
  (call-process-region
   start end
   "/usr/local/bin/convertruby"
   t (list t nil) nil
   "")
  )
;; convertruby for LaTeX
(defun convert-ruby-latex (start end)
  "Convert text to ruby HTML sequence."
  (interactive "r")
  (call-process-region
   start end
   "/usr/local/bin/convertruby"
   t (list t nil) nil
   "-l")
  )

泉鏡花『貧民倶樂部』の引用に際しては,新字・新仮名遣いで引用文を作成し(図 1),自作のソフトで旧字・旧仮名遣いに変換し,次に,ルビを付けたい漢字に「(よみ)」を付加し(図 2),最後に Emacs 上で convertruby を実行して <ruby> タグをマークアップした(図 3)。ただし,図 3-1 は HTML 整形の,図 3-2 は LaTeX 整形の結果例である。
 

20111012-ruby-1.jpg図 1. ルビなしで新字・新仮名遣いで記述
20111012-ruby-2.jpg図 2. 表記変換後,ルビを付加
20111012-ruby-3.jpg図 3-1. HTML 整形実行結果
20111012-ruby-4.jpg図 3-2. LaTeX 整形実行結果

自宅サーバ復旧

|

土曜日,自宅のサーバが故障した。NFS マウントしたビデオデータを Mac OS から観ていると頻繁に停止する。挙げ句,サーバ接続が切断される。FreeBSD サーバのログを確認すると,LBA read に失敗した旨のエラーメッセージが大量に出力されている。南無三宝,ディスクがぶっ飛んだらしい。サーバをリブートしたところ,ハードウェアの probe のあと fsck で回復不能エラーを検知して起動が停止してしまった。「エッチな映画ばかり観てるからバチが当たったのよ」とは妻。正しい。教訓その1:NFS サーバにエッチな映画を入れて楽しむのはやめよう。

ディスクを買って来て,交換し,FreeBSD をインストールし,Apache やらなにやら大量のプログラムをインストールし,サーバ環境を整え,... と考えると気が遠くなった。しかしメールサーバが使えなくなるとやっかいか,ブログもパーか,などなど考えるにつけ,しようがないなーとサーバ復旧に着手したのである。おかげでこの連休はほとんどパーになってしまった。

日曜日,娘の学園祭を見に行ったあと,川崎駅前ヨドバシカメラで Hitachi Global Storage Technology 社製の SATA2 7200 rpm 1TB HDD バルク品を 5,000 円足らずで購入。帰宅して,サーバ筐体を開けて HDD を交換しようとしたら,なんと壊れた既設の HDD が取り外せない。このベアボーンは,HDD を装着したネジを覆うように,特殊な方法で電源を固定していたのである。「じゃ増設」と考えたんだけど,予備の SATA 用電源コネクタがひとつも空きがない。しかも,SATA 用ケーブルもない。私の知らないうちに(PC を自分で組立てるなんてもう 15 年くらいやっていない) PC の世界も当然ながら様変わりしているわけで,内蔵 HDD の電源コネクタはいまや 4pin ならず,マザーボードとの接続も IDE ケーブルならぬ SATA ケーブルなんである。昔悩んだ IDE プライマリ/セカンダリのジッパ設定から解放されたのは嬉しかったんだけど。ふたたびヨドバシカメラに逆戻りして,4pin-SATA 電源変換ケーブル,SATA ケーブルを追加購入しなければならなかった。教訓その2:内臓周辺機器を増設するときは,あらかじめ筐体内部を確認し,追加の必要なケーブル類を洗い出しておこう。

20110920-pcsata.jpg
4pin-SATA 電源変換ケーブル(上)/SATA コネクタ(下)

取得してあったシステムのバックアップは何ヶ月か前のものであり,ブログをはじめ日々更新されるデータは最新状態ではない。教訓その3:バックアップはこまめに取得し DVD-R などに焼いておこう。ディスクを「増設」するついでに,壊れた HDD 内のまだ生きているデータを漁って,使えるものは使おうということにした。今日はその苦肉の方法のメモを残しておく。

まずは SATA のプライマリソケットに再度旧 HDD をつないでブートする。当然,fsck で悲鳴を上げて,次のメッセージとともに停止する。

Automatic file system check failed; help!
ERROR: ABORTING BOOT (sending SIGTERM to parent)!
Sep 18 16:03:45 init: /bin/sh on /etc/rc terminated abnormally, going to user mode
Enter full pathname of shell or RETURN for /bin/sh:

help! は機械のお前じゃなくこっちのセリフじゃ! これに対し,Enter キーを押して,シングルユーザモードでログインする。自作プログラム,文書,ブログ記事など大事なデータを格納しているディスク・パーティションをマウントしてみる。/etc/fstab を参照し,デバイス名とマウンティングポイントを特定する。これらは利用者のインストールの仕方によって変わるので注意。

# cat /etc/fstab
# Device  Mountpoint FStype Options Dump Pass#
/dev/ad4s1b  none    swap   sw      0    0
/dev/ad4s1a  /       ufs    rw      1    1
/dev/ad4s1g  /home   ufs    rw      2    2
/dev/ad4s1h  /shared ufs    rw      2    2
/dev/ad4s1f  /tmp    ufs    rw      2    2
/dev/ad4s1d  /usr    ufs    rw      2    2
/dev/ad4s1e  /var    ufs    rw      2    2
/dev/acd0 /cdrom  cd9660 ro,noauto  0    0
linprocfs /compat/linux/proc linprocfs rw 0 0

私の目的とするデータは /usr/home にあるので,この二つだけをもう一度 fsck でチェックし,そのあとで mount してみる。幸いにもこれらパーティションは無事だったようである。vi などのツールは /usr/bin にあるので,それらツールを使う場合もマウントしておく必要がある。

# fsck -y /dev/ad4s1d
# fsck -y /dev/ad4s1g
# /sbin/mount /dev/ad4s1d /usr
# /sbin/mount /dev/ad4s1g /home

必要なデータをアーカイブする(ここでは省略)。上記マウントができれば当該ファイルシステムは書き込みも可能なはずである。ルートパーティションはおそらく書き込み不可なので,アーカイブはマウントしたファイルシステムに格納する。アーカイブデータを別のコンピュータにコピーするには,ネットワークが使えないといけない。この時点ではネットワーク通信の準備ができていないので,次にこれを行い,取得したデータを scp (ftp でもよい) で別マシンに転送する。以下では anotherpc のユーザ user のホームディレクトリにコピーしている。anotherpc 上でも ssh が動作可能でなければならない。Mac OS など UNIX 系 OS なら OK である。

# ifconfig msk0 inet 192.168.1.4 netmask 255.255.255.0
# scp mydata-archives.tar.gz user@anotherpc:/Users/user/

msk0 はネットワークインタフェース名であり,利用する LAN カードによって変わって来る。忘れてしまっていたら,/etc/rc.conf 中に ifconfig_XXX=... なる行があるはずなので,その XXX をネットワークインタフェース名に指定する。IP アドレスは使っていたものをそのまま使うのがよい。詳細は ifconfig のマニュアルを参照。

必要なデータをすべて別マシンに転送し終わったら,ほっと一息。煙草で一服し,コーヒーでも飲もう。シャットダウンし,電源コードを抜く。新しく追加した HDD の SATA ケーブルをプライマリに,旧い HDD のケーブルを DVD ドライブの次のソケットあたりに繋ぎ直す。ついでに筐体内部に溜まりまくったホコリをエアスプレーで吹き払っておく。とくに冷却ファンの近辺を念入りに。これで PC の騒音がピタリと止む。

ここからは新しい HDD に最新バージョンの FreeBSD を導入する作業となる。私は Mac で,FreeBSD 8.2-RELEASE の DVD イメージをダウンロードし,ディスクユティリティで DVD-R に書き込んで,このメディアでインストールを行った。とにかく真っ先に sendmail,POP 環境を整えた。その後,上で取得したコピーデータを再度新環境に転送してからもろもろの復旧を行った。まだまだ入れ込めていないプログラムもたくさんあってうんざりである。もう二度とやりたくない。けれども,3 年に一度はやるはめになる。次はもうやる気力が起こらないかも知れない。教訓その4:自宅でサーバ運用なんてやめたほうがよい。

最後に。警告その1:上記方法がいつもうまく行くとは限らない。 
 

P.S.

復旧中に,misima 旧字旧仮名変換支援サービスを使ってくれている友人から「つかえなくなっちゃったけど,どうしたの? 体調でも悪くしてサーバ運用やめちゃったの?」とのメールをもらった。ありがとう。四苦八苦しながらもリカバリしましたよ! 教訓その5:へたに自作プログラムの公開などしないほうがよい。

新常用漢字表

|

「𠮟」という文字がいまあなたのモニタに表示されているだろうか? 私の愛用する Mac OS X Snow Leopard: Safari 5.0.4 あるいは Mac OS X Tiger: Safari 4.1.3 ならしっかり見えるが,Windows ユーザはどうだろうか? Windows 7 なら大丈夫か。XP ユーザは見えないのではないだろうか? なんでこんなことを記すのかというと,昨年,11 月 30 日に告示された改訂常用漢字表にこの文字が追加されたからである。1981 年以来の改訂である。なんとその前は 1946 年。

上の「𠮟」という文字は「しかる」という訓を持つ字である。口偏に「七」と書く「しかる」。「しかる」と入力して仮名漢字変換されて普通に出て来る「叱」なら,おそらく誰のモニタにも表示されるはずである。ところが,いつもパソコンで入力している「叱」という文字のほうは誤字であって,「𠮟」こそがじつは正しい「しかる」なのだ(『字源』には「俗に叱と作るは非」とある)。JIS がはじめのボタンを着け間違えた次第なのである。ここに来て常用漢字表に正しい字体が入れられた。

文字「𠮟」は Unicode CJK Unified Ideograph U+20B9F というコードポイントを持つ。いわゆるサロゲートペアと呼ばれる拡張領域(Extension B)に配置されている(JIS では JIS X 0213:2000 第三水準区点 4752)。この領域をきちんと読書きできるソフトウェアはまだ多くないのではなかろうか。私はここで「𠮟」の文字を Mac OS の「ことえり」で入力したわけではない。多言語テキストエディタ GNU Emacs 24 の ucs-insert 関数に 20b9f を指示して得られたものを,コピペしたんである。

そう,そんな特殊なところにある文字(正しい文字なんだけど)が常用漢字表に収録されたんである。このことはいまあんまり騒がれていないが,官庁,地方自治体はもとより,出版や報道業界にも少なからざる影響が出るはずである。その筋のシステム屋は,もうすでに,これら常用漢字表にあるにも拘らずシステムで表示・印字できない文字の取扱いに悩まされているはずである。大騒ぎにならないうちになんとかしなくっちゃと。

官庁・地方自治体のシステムは,つい最近に設計された新しいものは別として,Unicode 対応すら進んでいないのが実情だと思う。文字コードは JIS X 0208:1983, :1990 準拠が基本ではなかろうか。漢字コード草創期の設計を踏襲して大きくなって来た官庁・自治体システムは,人名許容漢字の法令に従わなければならず,貧弱な JIS X 0208 を補うために,JIS 第一水準/第二水準にない文字のために大量の外字を抱えている。そして,文字周りはいろんなところに影響するので,おいそれとは改修できない。(同じようなことを JIS 2004 についても書いたような気がする。)

JIS の独善的標準なら「システム仕様として対応してません」で済むかも知れないが,こと日本国政府ご指定の「常用漢字」に扱えない文字があるとなると深刻である。国民との文書交換を考慮すれば,世の官庁・自治体もこの常用漢字改訂で Unicode 対応システム改修に重い腰を上げることになると思う。また税金が本質的でないことのために消えて行くというわけである。漢字・仮名遣いという悪魔的正書法に立つ日本は,いつまでたっても文字を巡る混乱から解き放たれない宿命にある。「歴史的仮名遣いに戻せ」云々のエセ文化人による戯言よりも,もっと高度で抜差しならない宿命である。
 

* * *

ことのついでに,「𠮟」のようなサロゲートペア文字をどうしても入力できないとき,Perl で出力させるワンライナーを示しておく。Perl 5.8.5 くらいのバージョンが必要だと思う。

端末コマンドラインから次を叩くと,「𠮟」(=U+20B9F)が出力される。(※ 4.27: 少し簡略化した)

% perl -e 'binmode STDOUT, ":utf8"; print pack("U", 0x20b9f);'

あるいは,

% perl -e 'binmode STDOUT, ":utf8"; print "\x{20b9f}";'

20b9f のところに必要な文字の Unicode コードポイント十六進数を指定する。20bb7 を指定すると「𠮷」(吉野家のつちよし)が出力される。この出力をファイルにでもリダイレクトしてコピペして利用すればよい。Mac OS X Tiger 以降のターミナルなら端末上にきちんと文字が表示されるので,それをコピーすればよい。もちろんターミナルの LC_ALL 環境変数は ja_JP.UTF-8 に設定されていなければならない(これはデフォルトのはず)。

Unicode コードポイント十六進数は,学研の『漢字源』なら JIS コードとともに掲載されている。何の役にもたたない『JIS 漢字字典』なんて高価本を買うのはやめて,ぜひこちらを座右に置いていただきたい。私は改訂第四版を愛用しているが,最近第五版が刊行された。

Windows Vista, Windows 7 なら IME パッドから CJK Unified Ideograph Extension B 領域の文字を入力できると思う。Office も 2007 ならきちんと使えるはずである。
 

 

※ 4.26 付記

この記事を書いたあと,ネットを渉猟していたら,京大の安岡孝一先生(文字コードに関する権威でもある。日本語文字コードに関する見識において私が尊敬する学者のひとりである)が,2009 年 12 月の段階で「新常用漢字表が迫るUnicode移行,『シフトJIS』では対応不可能」というコラムを ITpro に掲載し,新常用漢字表の改訂について IT 業界に警鐘を鳴らしていた。さすがである。

上で「いつもパソコンで入力している「叱」という文字のほうは誤字であって」と書いた。この記述そのものを訂正するつもりはないのだけれど,「叱」という字体はすでに一般に浸透しており,もはや「誤り」とするのは時代錯誤というものである。出版の世界でも「しかる」「しっせき」に対して「叱」を表記しても,「無知無教養」でも「恥ずかしい」わけでもない。きちんとした国語辞典,しかもコンピュータの利用が一般化する以前に出版された新潮国語辞典(昭和 40 年初版)でもすでに「叱る,呵る」となっている(ただし,私の手元にある昭和 58 年刊岩波書店『広辞苑』第三版では「𠮟」という正字体のみが掲載されているし,平成 14 年再版・大修館書店『新漢語新辞典』では正字体「𠮟」のみが見出しになっており「叱」字体については「叱(口を開くさま)は別字であるが,俗に混用する」という記事がある)。つまり,JIS 第一・第二水準における「叱」採用は,JIS が「間違った」というよりも,もとよりこうした俗化・混用の「定着」の反映と捉えるべきである。
 

※ 2011.5.28 付記

会社の Windows XP professional Version 2002, SP3 + IE 6.0.2900.5512 では「𠮟」がきちんと表示された。どのタイミングかのパッチで改善されたようである。

URL encode in LaTeX

|

LaTeX でロシア語テクストを含む URL を出力しなければならないとき,url パッケージの \url 命令だと,キリル文字が出力できない。hyperref パッケージの \href{URL}{text} 命令を使って,text 部にロシア語テクストを記述すれば,これが可能となる。ところが,後者の場合でも,URL 部にロシア語 URL をそのまま指定しても,PDF にした際にそのリンクから当該リソースに飛んでくれない。この URL 部にはエンコード形式,つまり,ロシア文字を 1 オクテットずつ %xx の十六進数とした形式を指定しておかなければならないようである。

URL エンコードを行うツールはあちこちに転がっていて,Web なら http://www.tagindex.com/tool/url.html などの便利なサイトがある。Emacs 用の Elisp も探せばあるかも知れない。でも,LaTeX で,この URL エンコードを埋め込むとなると,% 文字が含まれるため,これをいちいちエスケープする手間が別途発生し,これまた面倒である。そこで,これくらいならツールを探す時間の間に出来てしまうと思い,自前で LaTeX 向け UTF-8 前提 URL エンコード・ツールを作ってみた。Perl である。U+0080 以上の UTF-8 文字を URL エンコードするので,ロシア語以外に日本語,ドイツ語などを含む URL にも適用できるはずである。同じ必要に駆られる方もいらっしゃると思うので,以下にそのコードを掲載しておく。ここにも置いておくので,ダウンロードして使っていただいてよい(無保証)。

#!/usr/bin/perl -w
# -*- coding: utf-8; mode: cperl; -*-
#  URL encoding: convert chars over U+0080 to format %hex.
#  Usage: urlenc [ -l ] < stdin (url text)
use strict;
use utf8;
use Getopt::Std;    # command line processing
use File::Basename; # get file basename
 
# command line
my %opts = ('l' => 0);
Getopt::Std::getopts('l', \%opts) ||
    die "Usage: " . basename($0) .
    " [ -l ] \< (stdin)\n  -l: insert \\ before % for LaTeX\n";
my $sfx = "%"; $sfx = "\\" . $sfx if ($opts{'l'});
 
# hex format
while (<STDIN>) {
    utf8::decode($_);
    my $enc = "";
    foreach my $chr (split(//, $_)) {
        if ($chr ge "\x{0080}") {
            utf8::encode($chr);
            foreach my $bchr (split(//, $chr)) {
                $enc .= $sfx . sprintf("%x", ord($bchr));
            }
        } else {
            $enc .= $chr;
        }
    }
    print $enc;
}

Perl コードはこれだけである。標準入力から読んだ URL 文字列のうち U+0080 以上を %xx 形式に変換して,標準出力に書き出す。オプション -l を指定すると LaTeX 向けに \%xx とエスケープした形で出力する。このプログラムを urlenc と名付けて,パスの通ったところにコピーして利用する。Mac OS X ターミナルでの実行例を以下に示す。

url-term.jpg

Emacs から利用する場合は,以下の内容を .emacs に記述し,関数定義を C-x C-e で Emacs に認識させるか,Emacs を再起動すれば,urlencode 命令が利用可能となる。ウラで上記 urlenc プログラムが動くので先きにこれを組込んでおくこと。urlenc の絶対パスは利用者の環境に応じて変更する必要がある。LaTeX 原稿において変換したいテクストをリージョン設定し,M-x urlencode RTN とすれば,当該リージョンが URL エンコード変換される。Emacs の set-default-coding-systems'utf-8 にセットしておかなければならない。

;;
;; URL encoding for LaTeX
;;
(set-default-coding-systems 'utf-8) ;; すでに設定されていれば不要
;;
(defun urlencode (start end)
  "URL encoding for LaTeX"
  (interactive "r")
  (call-process-region
   start end
   "/usr/local/bin/urlenc" ;; urlenc の絶対パスを指定
   t (list t nil) nil
   "-l") ;; urlenc LaTeX 用オプション
  )

Emacs 上での変換の様子を以下に示す。

url-emacs.jpg

サーバ機 FreeBSD 8.0-RELEASE にインストールした Emacs 24.0.50 でもロシア語メールを書く必要が発生し,メールエージェント Mew, スペルチェッカ Aspell をセットアップした。前に書いたメモ「Meadow 3.01-dev, GNU Aspell 多言語環境(露・英・仏・独)」に従って Emacs - Aspell 環境を準備したのだが,flyspell-mode (入力の都度スペルチェックが自動で行われるモード) を起動すると,Error: The filter "nroff" does not exists なるエラーが出てスペルチェッカが使えない。

調べたところ,Aspell-0.60.6 では filter-mode がサポートされていて,例えば tex filter を使えば LaTeX の命令のスペルチェックをスキップしてくれるのだが,インストールの仕方によっては nroff などの filter が組込まれないらしい。そのくせ,これを要求しに行って,上記のエラーになったようである。

対策は各種フィルタを付加すること。FreeBSD 8.0-RELEASE で私が Aspell を再導入した場合では,./configure --enable-compile-in-filters で生成した Makefile で組込めば OK になった。

もし同じエラーが出てかつ再インストールが面倒なら,filter 使用設定を外す。すなわち,.emacs の Aspell 起動オプション設定に --mode=none(filter なし)を指定すればよい。以下のように書いておく。

(setq ispell-extra-args '("--sug-mode=ultra" "--encoding=UTF-8" "--mode=none"))

現在の Aspell にどんな filter がインストールされているかは,aspell dump filters とコマンド発行すれば確認できる。私の環境では当初 url filter しか組込まれていなかったが,再インストールで,email, html, sgml, context, url, nroff, tex, texinfo の各種フィルタが認識されるようになった。
 

* * *

Emacs 24.0.50 でメールを書くに際していまひとつ問題があった。fontset-standard で起動してもキリル文字で日本語フォント(要するに全角文字)が拾われて極めてみっともないのだ。なんて Emacs は面倒なんだ!

しようがないので,いちいち set-charset-priority (文字コードの優先順位), set-fontset-font (文字コードに応じたフォント設定) を指示しなければならなかった。フォント名(IPAGothic など)は,fc-list コマンドの出力からユーザの好みのものを指定する。備忘録として .emacs のその部分を掲載しておく。

;;
;; charset priority
;;
(set-charset-priority
 'cyrillic-iso8859-5
 'greek-iso8859-7
 'mule-unicode-0100-24ff
 'japanese-jisx0208
)
;; char width for Mew Summary
;;; iso 8859-5
(map-charset-chars
 (lambda
   (range ignore)
   (set-char-table-range char-width-table range 1))
 'cyrillic-iso8859-5)
;;; iso 8859-7
(map-charset-chars
 (lambda
   (range ignore)
   (set-char-table-range char-width-table range 1))
 'greek-iso8859-7)
 
;;
;; font face
;; - See output of fc-list command for fontname.
;;
(set-face-attribute 'default nil
            :family "DejaVu Sans Mono"
            :height 100)
;; japanese
(set-fontset-font
 (frame-parameter nil 'font)
 'japanese-jisx0208
 '("IPAGothic" . "iso10646-1"))
(set-fontset-font
 (frame-parameter nil 'font)
 'katakana-jisx0201
 '("IPAGothic" . "iso10646-1"))
(set-fontset-font
 (frame-parameter nil 'font)
 'japanese-jisx0212
 '("IPAGothic" . "iso10646-1"))
;; Unicode
(set-fontset-font
 (frame-parameter nil 'font)
 'mule-unicode-0100-24ff
 '("DejaVu Sans Mono" . "iso10646-1"))
;; cyrillic
(set-fontset-font
 (frame-parameter nil 'font)
 'cyrillic-iso8859-5
 '("DejaVu Sans Mono" . "iso10646-1"))
;; greek
(set-fontset-font
 (frame-parameter nil 'font)
 'greek-iso8859-7
 '("DejaVu Sans Mono" . "iso10646-1"))

Wnn7egg on Emacs 24.0.50.1

|

MacBook Pro, Mac OS X Snow Leopard に Emacs-24 を組み込んだ際,Emacs 起動後の最初の Wnn7 変換がタイムアウトし,二回目以降は動作が正常になる,という問題があった。Mac なので別マシンで稼働する Wnn7 jserver と接続して,仮名漢字変換を行う環境である。これまでちょっと我慢して使っていたのだけど,今日会社がお休みだったこともあり,調べてみた。

結論から言うと,eggrc-wnn7 中 121, 122 行目あたりにある以下の 2 行をコメントアウトすれば,タイムアウトしなくなった。Elisp message 関数で網を張り,どこで止まっているのか探り当てた。コメントアウトの影響はよくわからない。変換はできているのでよしとしておく。

(wnn7-add-notrans-dict (concat wnn-usr-dic-dir "/katakana") 15 t)
(wnn7-add-bmodify-dict (concat wnn-usr-dic-dir "/bunsetsu") 15 t)

Emacs-24 で Wnn7egg を動かすには,jpl.org で公開されている wnn7-elisp-el-1.02-1.patch.gz を適用しておく必要がある。このパッチ適用については「Wnn7, Mew-6.2 with Emacs 23.1.50」を参照。このパッチを当てた上で eggrc-wnn7 の訂正を行う。

昨日は憲法記念日だった。

朝日新聞朝刊 1 面に改憲世論調査結果が掲載されていた。「9 条改正 67% 反対」とのことだった。それでも改憲不要 39% に対し,必要 47% と改憲賛成のほうが多いのはどうしてか。象徴天皇の条文だろうか。二院制の問題だろうか。朝日には,9 条以外の改憲議論にもう少し光を当ててほしかった。

憲法改正論者には,現憲法が米国押付けによって成立したとでもいうような点(古関彰一『日本国憲法の誕生』は,この「押付け」成立論を否定している)に自立精神の欠如を見て現憲法を否定する人が多いように見受けられる。私には動機でものごとの正否を判断するような馬鹿げた考えに思われる(横道に逸れますが,新字体・現代仮名遣いを否定する人たちもこの手の安直な「自立精神」論者が多い)。そのくせ彼らは,滑稽にも,大日本帝国憲法のようなそれこそ「輸入品」に憧憬を覚えていたりする(横道に逸れますが,「正字正假名」論者も,滑稽にも,明治時代の書き方を「日本の傳統」などと騙る)。何故,戦後の日本人の決断に意義を見出せないのか。酷い話になると,石原東京都知事などは日本国憲法の「文体」が気に入らないなどと言っている。石原文学の「文体」のほうがその和製マッチョぶりで私にはよっぽど酷いものに感じられるのだが。

私は改憲反対である。保守だからである。戦争放棄も,象徴天皇制も,二院制も,変える必要性をどこにも見出せない。

* * *

妻と池袋に行った。まずは腹ごしらえ。カジュアルなフレンチを東通りの小さなお店でいただく。「牛のタルタルステーキ」を注文したのだが,火が通っているので,なんのことはない,ただのハンバーグであった。薬香が効いて旨かった。

そのあと,ジュンク堂で本巡り。この書店,私がかつて見た最大クラスの店構えである。本棚を眺めながら散歩気分で店内を歩いた。散歩は何も町並,自然,人を眺めて歩くばかりじゃない。この国の人々の関心事を書物の背表紙で総覧するのも面白い。ジュンク堂はまさにそういう散策のできる本屋である。

中西進著作集,江戸漢詩文学論集,日本画家・速水御舟の画集,ロシア音楽史 2 巻本,バルトーク室内楽に関する論文集,等々に目が止まる。O'Reilly 原書コーナーで TeX 本を探してみたが,やはりなさそう。寺山修司やアレクサンドル・ソクーロフ,フランス・フィルムノワールの映画 DVD コーナーに誘惑される。リチャード・ストールマンのエッセイ集と,中世武家短歌の伝統に関する本を購入した。
 

フリーソフトウェアと自由な社会 ―Richard M. Stallmanエッセイ集
リチャード・M・ストールマン Richard M. Stallman 著
長尾高弘訳
アスキー
* * *

帰宅して,Mac OS X Snow Leopard に Emacs を組込む。Bazaar で最新 trunk を落として来て,ChangeLog を確認したら,メジャーバージョンが 24 に上がっていた。前提となる画像・フォント周りのライブラリを configure エラーが出るたびにいちいち追加するのも面倒なので,MacPorts で gimp を組込み,その筋のライブラリがわんさか勝手にインストールされるようにした。Emacs はこれですんなり make できた。

Wnn7egg でまたもやトラブル。起動してしばらくするとミニバッファに "backend timeout" が出て elisp 処理が中断する。その原因を探ったら Wnn7egg の egg-use-input-predict 関数,つまり楽々入力機能の指定のところであった。これを外せば OK になった。それでも,一発目の変換でしばらく考え込み,"backend timeout" が出る。その後は問題なく変換できる。Emacs を起動して最初の Wnn7 変換だけ時間がかかるのである。

よい辞書を備えたフリーの仮名漢字変換 IME がないので,私はいまだに Wnn7 を使っている。FreeBSD サーバ上で jserver を稼働させ,Mac OS X のクライアントからネットワーク越しに変換するのである。FreeBSD の版が新しくなるたびに面倒なライブラリ調整をしなければならず,いい加減 Wnn7 から足を洗いたいのだけど。でもオムロンは新しいバージョンを出してくれない。

Mac OS X Snow Leopard で X11-Emacs を使うなら,キーボード設定を変更したくなるはずである。C-SPC でリージョンをマーキングできるように,Spotlight のショートカットキーを変更しておくことをお勧めする。また,X11 の環境設定で「X11 のキーボードショートカットを使用可能にする」をオフにしておかないと,M-w で Emacs が終了してしまう。私はシステム環境設定・キーボードで,ファンクションキーを fn キーなしで使えるように設定する(ファンクションキーのほうがモニタの明度などのハード調整よりも頻繁に使うと思うのだけれど,デフォルトはそうなっていない)とともに,caps lock キーにコントロールキーを割り当てている。MacBook Pro には HOME, END キーがなく,それぞれでバッファの先頭,末尾にジャンプする使い方には工夫が必要である。.emacs で (global-set-key [M-up] 'beginning-of-buffer) などとして,M-up で HOME と同じ動作をするように設定しておくとよい。

※ 7.21 付記
Wnn7egg の一発目変換タイムアウト問題はその後解決した。記事「Wnn7egg on Emacs 24.0.50.1」を参照。

VNC の利用

|

FreeBSD 8.0-RELEASE を稼働させている IBM ThinkPad X40 のキーボードが故障した。それ以外はまだなんとか動く。キーボードだけの問題であれば,他のマシンからリモートログインして,作業ができる。ssh でもよいのだけれど,デスクトップの操作ができると嬉しいので,VNC を使うことにした。FreeBSD 上に vncserver を起動し,Mac OS X の VNC Client からこれに接続し FreeBSD を操作するわけである。

FreeBSD での VNC プログラム vnc-4.1.3 のインストールは cd /usr/ports/net/vnc && make install clean でできる。Mac OS X の VNC クライアントはフリーウェア Chicken of the VNC を使うことにした。こちらも dmg パッケージを落として来てマウントし,アイコンをアプリケーションフォルダにドラッグすれば,組込みは完了である。

サーバ側で vncserver :1 -geometry 1024x768 -depth 24 などとして VNC Server を起動し,初回にパスワードを応答しておく。クライアント側では Chicken of the VNC の connection --> open connection メニューから,ホスト名,パスワード,ディスプレイ(この場合 1)を指定して接続を実行すると,Mac 上に FreeBSD のデスクトップが現われる。

vncserver を実行するユーザの $HOME/.vnc/xstartup に X クライアントや X ウィンドウマネージャ等の起動コマンド列を記述しておく。.xinitrc の内容とだいたい同じである。ただし,Emacs などのアプリを使おうとすると,次のようなエラーが出て異常終了してしまうことがある。

Xlib:  extension "RANDR" missing on display ":1.0".
Xlib:  extension "Generic Event Extension" missing on display ":1.0".
Undefined color: "black"

これには結構悩まされたのだけれど,計算機と戯れる日々:2009-05-31 記事に救っていただいた。ありがとうございました。rgb.txt を vncserver に指示してやればよいとのこと。というわけで,次のとおり再起動すれば,Emacs もきちんと動いた(Xlib のエラーは解消しないけれど,実害はなさそうである)。

% vncserver -kill :1
% vncserver :1 -geometry 1024x768 -depth 24 \
  -co /usr/local/share/emacs/23.1.91/etc/rgb

また,X スクリーンセーバーが働くとにっちもさっちも行かなくなるので,止めておいたほうがよい。xset s off を端末から投入するか,xstartup に書いておく。

これで,X40 のキーボードがダメでも,Mac から FreeBSD Mew on Emacs を使ってメールチェックする,などの作業ができるようになった。スクリーンショットはこんな感じ。ちなみに X ウィンドウマネージャは Enlightenment DR-16 である。X40 とまったく同じ画面で FreeBSD が使えるのである。

vnc_screen.jpg

Emacs 23.1.91・面接練習

|

FreeBSD インストール大会 5 日目。Emacs 最新版の導入に取り組む。ChangeLog 2010.1.12 の履歴も新しい 23.1.91 である。

Emacs の開発最新版はかつて Emacs-CVS と呼んでいたと思う。だが昨年末,バージョン管理システムが Bazaar に変更され,これに伴いいまやチェックアウトを bzr コマンドで行うようになった。「伽藍からバザールに」というわけか。Download and Install Bazaar から FreeBSD 向けアーカイブ bzr-2.0.3.tar.gz をダウンロードし,展開後のディレクトリで python setup.py install を実行するとインストールできる。Python 2.4 以上が必要である。

Emacs 最新の trunk の取得は以下のとおり。bzr branch に恐ろしく時間が掛かる。CVS のころが偲ばれるほどである。bzr 実行のたびに No handlers could be found for logger "bzr" が出て煩い場合,$HOME/.bzr.log に書き込み権限を付加すれば解消すると思う。

% bzr branch --stacked http://bzr.savannah.gnu.org/r/emacs/trunk emacs-trunk
% cd emacs-trunk
% bzr pull

このあと,Emacs をビルドする。INSTALL ドキュメントによれば,./configure はオプションなしでよいようである。gmake が終了したら,./src/emacs -q & で,できたてのモジュールの動作確認をする。OK なら,スーパユーザで gmake install

% ./autogen.sh
% ./configure
% gmake bootstrap
% ./src/emacs -q &
% sudo gmake install

そのあとは,site-lisp をバックアップからコピーし,Mew だけを再度インストールし直した(Mew は実行ファイルも提供しているため)。今回は,珍しく,なにも問題がなく終了した。

付記:FreeBSD の最近の ports では,Bazaar は /usr/ports/devel/bazaar-ng に用意されている。ここで make install clean とするほうがインストールは簡単である。
 

* * *

娘の受験準備で小論文・面接の練習に付き合う。こういうことに対しても,きちんと「準備」をし,父や母を掴まえて練習しようとする態度は,私よりも妻に似たようである。そう,「準備」をしたかどうかが大事なのである。私も会社訪問してくる就活学生の面接官をやったことがあるが,「当社のどこに興味をもったのか」など,聞かれて当たり前のことにも,内容を整理して応えられないヤツがいる。こちらは立派な意見を聞きたいのではなく「あらかじめ準備しているかどうか」をチェックしているだけなのに。

「自分のよいところを PR してください」,「本校を志望する理由はなんですか?」など基本中の基本にはじまり,「2009 年を象徴する漢字はなんだったか知っていますか? また,あなたにとっての 2009 年の漢字はなんですか?」,「2009 年に日本で起こったことでなにがいちばん大きな出来事だと思いますか?」,「地球温暖化のなにが問題だと理解していますか?」など時事問題についても質問。とにかく相手の顔をちゃんと見てハキハキ応えること。「夜なにを着て寝ていますか?」---「そういうご質問にはお応えできません」。そうそう,それでよい。

Mew 6.2.52 on Emacs-23 を使いはじめて,ロシア語メールの Subject が全角キリル文字(さざなみ日本語フォントにあるキリル文字)で表示されることに気づいた。メール本文は問題ない。外国語はそれ用のフォントでないと醜いし,幅広だと情報量も落ちてしまう。Mew-dist や Mule-ja メーリングリストに問い合わせたところ,次のようなことが判明した。

Mew の Summary(メール一覧表示)では,多言語対応のため,CTEXT(X11 Compound Text)コーディングシステムを採用している。一方,Emacs はバッファを CTEXT で符号化する際に,エスケープシーケンスに包む個別の文字コードを優先順位を付けて選択する。日本語環境では,標準は japanese-jisx0208 が優先される。このため,バッファのキリル文字は,国際標準 ISO 8859-5 キリルではなく,JIS で定義されたキリル文字コードにエンコードされる。この結果,Summary の表示は JIS コード用の日本語フォントが使われた。

つまり対策は,その文字コードの優先順位を,ISO 8859-5 が japanese-jisx0208 よりも高くなるように指示してやればよいということになる。そのための関数 set-charset-priority がある,とメーリングリストで教えていただいた。Emacs の info で set-charset-priority 関数仕様を調べて,優先度設定コードを .emacs に追加したら,DejaVu フォント・半角のキリル文字で Summary 表示できるようになった。ギリシア語も同じ構造に嵌るので,greek-iso8859-7 も追加しておいた。また,キリル文字は width が 2 のため Subject エリアの空白数が文字数分不足することで,Summary のレイアウトがいびつになってしまう。width を 1 に設定し,キリル文字数と width を合わせるコードも入れた。これらの .emacs 対策コードは以下のとおり。

;; iso-8859-5 優先
(set-charset-priority
 'cyrillic-iso8859-5
 'greek-iso8859-7
 'mule-unicode-0100-24ff
 'japanese-jisx0208
)
;; キリル・ギリシア文字の width を 1 に
;; (Mew Summary レイアウト不正対策。Unicode-cyrillic は不要)
;;; iso-8859-5 キリル文字
(map-charset-chars
 (lambda
   (range ignore)
   (set-char-table-range char-width-table range 1))
 'cyrillic-iso8859-5)
;;; iso-8859-7 ギリシア文字
(map-charset-chars
 (lambda
   (range ignore)
   (set-char-table-range char-width-table range 1))
 'greek-iso8859-7)

前に書いた記事「Emacs 22.0.50 の Ctext」で CTEXT のエスケープシーケンスが変わってしまったことに触れた。この要因について今回わかったという収穫もある。上記の設定により,エスケープシーケンス X"1b2d4c" + ISO 8859-5 文字コードでキリル文字を CTEXT 符号化することができるようになった。

※ 2009/09/05
漢字フォントキリル文字が Unicode フォントに変更されたスナップショットを以下に示す。

mew-ctext-problem.jpg

外国語で文書を作成する際,なくてはならないのがスペルチェッカである。私は FreeBSD において,GNU Emacs 上で ispell + ロシア語辞書を昔から愛用してきた。Emacs は,比較的容易な設定変更で多言語スペルチェックもできるという意味で,秀丸,サクラ,WZ など日本で圧倒的に支持されている和製テキストエディタが太刀打ちできないくらい強力である。これこそ世界中の人々によって鍛えられている強みである。UNIX 文化の典型である Emacs は,ドキュメントをよく読まないと使いこなすのは難しい。しかし,外国語テキスト抜きでは計算機生活ができないユーザーにとって Emacs は,苦労も多いが得られることも多大なソフトウェアなのである。

最近,Unicode でテキストファイルを作成することが一般的になりつつある。Emacs 上で用いるスペルチェッカについても,UTF-8 テキストを取り扱うことのできる GNU Aspell を Emacs 付属の lisp プログラム ispell.el からドライブする形態で,スペルチェックを行う方式が主流のようである。

一般に日本語サイトでは,Emacs スペルチェッカ環境の整備方法について英語に関するリソースばかりで,ロシア語のような ASCII 範囲外の文字を使用する言語に関する活用情報を見かけることが極端に少ない。あったとしても,設定内容に踏み込んだ説明がまったくなく,応用の効かないものが多い。

そこで本稿では,もう少し言語を増やして環境構築を行う方法をしるす。UTF-8 エンコーディングで文書を作成しつつ,ロシア語,英語,フランス語,ドイツ語を切替えて利用できるようにするための導入記録である。先日,Mac OS X Tiger での Emacs-CVS 23.1.50 のインストールメモを書き,GNU Aspell のロシア語環境についても合わせて触れた。本稿の記述はこれと一部重複するところがある。

圧倒的シェアを誇る Windows 環境で説明する。Windows で動作する GNU Emacs である Meadow 開発最新版 3.01-dev から,Aspell-0.60 を使う前提である。私の試したのは Windows XP SP3 である。Windows Vista でもほぼ同じオペレーションで導入できるものと考える。露・英・独・仏語で Aspell を使えるようにすれば,第二外国語として多くのひとが選択する外国語をカバーするわけで,私のような「特殊辺境言語」ロシア語を学ぶ者のみならず,いろんな方の役に立つと考える。英語は標準であるとしても,その他の辞書とその設定は必要なものを選択すればよいように説明するつもりである。

Meadow で Aspell を使うには Cygwin 環境でインストールしたモジュールを使うのがよい。Aspell には Win32 ネイティブで動作する版も存在するが,辞書の追加のし易さから,ここでは Cygwin 版(Cygwin 用というのではなく,単に Cygwin 環境で make された Aspell パッケージと理解してほしい)を前提とする。Cygwin とは簡単にいえば Windows で動作する UNIX 疑似環境である。

以下の説明では Meadow のコマンド操作は Emacs の伝統的表記を用いている。C-x は Ctrl + x キー,M-x は Alt + x キー(Esc のあとに x キー押下でもよい),RET はリターンキーを示している。

  1. Cygwin の導入

    以下の Aspell 利用環境の構築の前に,Cygwin パッケージをインストールしておく。セットアップ・プログラム setup.exe をダウンロード・実行し,指示に従って行けば,簡単にインストールできる。 Cygwin インストーラはパッケージ選択メニューから同時にインストールするソフトウェアを選択できる。このとき,Aspell(0.60.5-1)GNU Make(3.81-2)Wget にチェックを付けてインストールしておく。その他,GNU C/C++ コンパイラ(gcc4-core 4.3.2,gcc4-g++ 4.3.2)も入れておきたい。本稿では Cygwin を C:\cygwin にインストールしたものと仮定して説明をする。別の場所にした場合は読み換えること。

    Cygwin のインストールが終了したら,ユーザーのホームディレクトリを決めて,そのフォルダ・パスを環境変数 HOME に登録しておく(「システム」→「詳細設定」タブ→「環境変数(N)」)。ここでの説明は C:\home をホームディレクトリと仮定して説明する。Cygwin シェルでは $HOME~/ でホームディレクトリのパス参照が可能である。

  2. Meadow-3.01-dev の導入

    Meadow-3.01-dev についても,日本語 Netinstall: setup-ja.exe を入手して,インストールしておく。インタフェースは Cygwin とほぼ同じで,操作はしごく簡単である。同様に,Emacs 外部パッケージを選択インストールができる。apel(10.7-1)mule-fonts 多言語 BDF フォント(1.0-4)を必ず選択して導入しておく。

    ここでは Meadow は C:\meadow 以下にインストールされたものと仮定する。また Meadow の初期設定ファイル .emacs$HOME ディレクトリに格納されたものとする。

    Emacs 外部パッケージ一覧において ispell パッケージを選択する必要はない。もし選択する場合は,ispell パッケージの auto-autoloads.el と,本稿の .emacs 設定とが競合する問題があるため,前者をロードしないような操作を施す必要がある(後述)。

    Emacs 外部パッケージをあまりに欲張って選択・インストールすると,各パッケージの自動設定プログラム auto-autoloads.el が相互に競合を起こして,.emacs 初期設定処理中にエラーが発生し,うまく動かなかったりすることがある。このため,まずは必要最小限のパッケージで所期の目的を確認しつつ安定動作させたのち,追加して行くことをお勧めする。もし,初期処理中にエラーが発生したら,*Messages* バッファに出力されたメッセージを確認し,エラーの原因となったパッケージ auto-autoloads.el の存在するフォルダ(C:\meadow\packages\pkginfo の下にある)を別の場所に移動させると,問題を回避できることがある。このようにしたとしても,.emacs 設定をしかるべく記述すればパッケージを利用することができる。

  3. Meadow 言語環境の設定

    本稿での Aspell 設定は Unicode 環境を想定したものである。Meadow の言語環境も Unicode に最適化された設定にしておくこととする。以下の内容を .emacs に追加する。

    (set-language-environment "Japanese")
    (set-default-coding-systems 'utf-8-dos)
    (set-buffer-file-coding-system 'utf-8-dos)
    (set-selection-coding-system 'utf-16le-dos)
    (prefer-coding-system 'utf-8)
    

    set-selection-coding-system 関数の設定は IE 等の他の Windows アプリケーションとの間でテキストをコピー・ペースト(Emacs 用語でいえば,キル・ヤンク)するために必要である(UTF-16 Little Endian を指定している)。この記述がないと,ASCII 以外のあらゆる文字列のコピー・ペーストが文字化けを来す。こんな設定はデフォルトにすべきもののように思われるが,現在の開発版 Meadow 3.01-dev では明示的に記述する必要がある。

    その他,Meadow-3 の多言語環境一般の設定(BDF フォント,インプットメソッド等)については,弊サイト記事『Windows Meadow 3.00』を参考にしてほしい。

  4. 辞書のダウンロード・解凍

    GNU Aspell ホームページ http://aspell.net/ にある辞書アーカイブへのリンクから,以下の辞書アーカイブをダウンロードする。

    ダウンロードしたら,Cygwin シェルの ~/tmp(Windows パスは C:\home\tmp)下に解凍しておく。tar.bz2 アーカイブを処理できるアーカイバ(lhaplus 等)が必要である。Cygwin シェルでダウンロード,解凍するなら,次のようにすればよい。ロシア語辞書の例であるが,これを英,仏,独についても繰返し行う。

    $ mkdir -p ~/tmp
    $ cd ~/tmp
    $ wget -nH -nd \
    ftp://ftp.gnu.org/gnu/aspell/dict/ru/aspell6-ru-0.99f7-1.tar.bz2
    $ tar jxvf aspell6-ru-0.99f7-1.tar.bz2
    
  5. 辞書の組込み

    Aspell 辞書のインストールは Cygwin のシェルで実施する。以下のロシア語辞書のオペレーションを英・仏・独語用辞書についても同様に行う。いずれも,各言語用辞書の解凍ディレクトリにおいて,./configure,make,make install を順次実行するだけである。

    $ cd ~/tmp/aspell6-ru-0.99f7-1/
    $ ./configure
    $ make
    $ make install
    
  6. ispell auto-autoloads.el の移動

    Meadow Netinstall で ispell パッケージを選択してインストールすると,ispell 用の自動設定 elisp: auto-autoloads.elC:\meadow\packages\pkginfo\ispell フォルダ下に組込まれ,Meadow が起動するたびに自動的にロードされる。この auto-autoloads.el は,本稿の Aspell 用 .emacs 設定(後述)を反古にしてしまう。このため,ispell 設定用の auto-autoloads.el がロードされないよう,pkginfo フォルダから ispell フォルダを別の場所に移動させておく

  7. Aspell 用 .emacs の調整

    Aspell スペルチェックの設定 elisp を 初期設定ファイル .emacs に追加する。すなわち,以下のテキストをコピーして,.emacs にペーストすればよい。ただし,このテキストには,露・独・仏語の文字が含まれるため,ペーストして格納する前に,必ず C-x RET f utf-8 RET としてバッファ・コーディングシステムを UTF-8 に設定しておく。.emacs に エンコーディング指示を書き込んでいる場合は,これも utf-8 に書き換えておく。.emacs を修正・格納したら,Meadow を再起動すれば,定義が有効になる。

    ;;
    ;;  Aspell -- spell-checking UTF-8 text -- .emacs に追加する elisp
    ;;    based on "Настройка проверки правописания Ispell" by KOSTAFEY
    ;;    (see http://kostafey.blogspot.com/2009/07/emacs-aspell.html)
    ;;
    ;;  注意: .emacs を UTF-8 エンコーディングとすること。 
    ;;  - C-x RET f utf-8 RET で .emacs バッファを UTF-8 にする。
    ;;  - .emacs 先頭に -*- mode: emacs-lisp; coding: utf-8; -*- を記述しておく。
    ;;
    (require 'flyspell)
    (require 'ispell)
    (setq
     ispell-program-name "c:/cygwin/bin/aspell.exe" ;; ユーザー環境に依存
     ispell-dictionary-alist 
     '(
       ;;【ispell-dictionary-alist 指定パラメータ概略】
       ;; 1. Dictionary name: 辞書名
       ;; 2. Case characters (regex): 対象文字セット(正規表現)
       ;; 3. Non case characters (regex): 非対象文字セット(正規表現)
       ;; 4. Other characters (regex): 単語構成特殊文字(正規表現)
       ;; 5. Many other characters (bool): 単語構成特殊文字複合有無(t or nil)
       ;; 6. ispell Arg (list): Aspell コマンド引数リスト("A" "B" "C") → "aspell A B C"
       ;; 7. Extended character mode (const ~tex, ~nroff, etc. or nil): チェックモード
       ;; 8. Coding System: コーディングシステム
       ("English"                       ; English
        "[a-zA-Z]" 
        "[^a-zA-Z]" 
        "[']" nil ("-d" "en") nil iso-8859-1)
       ("Russian"                       ; Russian
        "[АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя]"
        "[^АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя]"
        "[-]" nil ("-d" "ru-yeyo") nil utf-8)
       ("German"                        ; German
        "[a-zA-ZäöüÄÖÜß]"
        "[^a-zA-ZäöüÄÖÜß]"
        "[']" t ("-d" "de_DE") nil utf-8)
       ("French"                        ; French
        "[a-zA-ZçàâéèêëîïôûüÇÀÂÉÈÊËÎÏÔÛÜ]"
        "[^a-zA-ZçàâéèêëîïôûüÇÀÂÉÈÊËÎÏÔÛÜ]"
        "[']" t ("-d" "fr_FR") nil utf-8)
       (nil                             ; Default
        "[A-Za-z]"
        "[^A-Za-z]"
        "[']" nil ("-C") nil iso-8859-1)
       )
     ;; ロシア語を標準とする
     flyspell-default-dictionary "Russian"
     ispell-dictionary "Russian"
     ispell-local-dictionary "Russian"
     ;; Aspell に渡す付加オプション: 高速モード,UTF-8 インタフェース
     ;; see Aspell Manual: http://aspell.net/man-html/index.html
     ispell-extra-args '("--sug-mode=ultra" "--encoding=UTF-8")
    )
     
    ;;; 不正単語ハイライト表示フェース(デフォルト)
    (setq ispell-highlight-face 'flyspell-incorrect)
    ;;; Text-mode で flyspell を自動起動
    (add-hook 'text-mode-hook 'flyspell-mode)
    ;;; check 前のウェイト秒数
    (setq flyspell-delay 1)
     
    ;;; 各国語用切替関数の定義
    ;;; Russian, English, French, German in ispell-dictionary-alist
    ;;;; Flyspel
    ;;;; ロシア語
    (defun flyspell-russian ()
      (interactive)
      (flyspell-mode t)
      (ispell-change-dictionary "Russian")
      (flyspell-buffer)
      (message "Russian dictionary - Spell Checking completed."))
     
    ;;;; 英語
    (defun flyspell-english ()
      (interactive)
      (flyspell-mode t)
      (ispell-change-dictionary "English")
      (flyspell-buffer)
      (message "English dictionary - Spell Checking completed."))
     
    ;;;; 仏語
    (defun flyspell-french ()
      (interactive)
      (flyspell-mode t)
      (ispell-change-dictionary "French")
      (flyspell-buffer)
      (message "French dictionary - Spell Checking completed."))
     
    ;;;; 独語
    (defun flyspell-german ()
      (interactive)
      (flyspell-mode t)
      (ispell-change-dictionary "German")
      (flyspell-buffer)
      (message "German dictionary - Spell Checking completed."))
     
    ;;;; Ispell-buffer
    ;;;; ロシア語
    (defun ispell-russian ()
     "Russian aspell for UTF-8"
     (interactive)
     (ispell-change-dictionary "Russian")
     (ispell-buffer))
     
    ;;;; 英語
    (defun ispell-english ()
     "English aspell for UTF-8"
     (interactive)
     (ispell-change-dictionary "English")
     (ispell-buffer))
     
    ;;;; 仏語
    (defun ispell-french ()
     "French aspell for UTF-8"
     (interactive)
     (ispell-change-dictionary "French")
     (ispell-buffer))
     
    ;;;; 独語
    (defun ispell-german ()
     "German aspell for UTF-8"
     (interactive)
     (ispell-change-dictionary "German")
     (ispell-buffer))
     
    ;; ファンクションキー
    (global-set-key [(control f1)] 'ispell-word)
    (global-set-key [(control f2)] 'ispell-region)
    (global-set-key [(control f3)] 'ispell-buffer)
    

    Cygwin,Aspell を本稿の前提パス C:\cygwin 配下とは違う場所にインストールしている場合,ispell-program-name のパス指定を修正しなければならない。上記 elisp が目的とする機能は以下のとおりである。

    • Aspell 露・英・仏・独辞書名をそれぞれ,RussianEnglishFrenchGerman として定義する。先頭は大文字にしてある。
    • スペルチェック対象の各国語エンコーディングを UTF-8 とする。
    • Text mode で flyspell-mode を自動的に起動する(text-mode-hook)。flyspell はカーソル位置の単語に,もしくは単語入力のつど,誤りがあれば,赤く強調表示をする(正確には,オレンジレッド,ボールド,下線付き。これは flyspell-incorrect フェースに定義されている)。辞書に適合している単語は通常の表示である。ここで Text mode とは,通常の .txt プレーンテキストのみならず HTML, LaTeX などをも対象としたテキスト形式編集モード(html-mode,LaTeX-mode 等)のことを指している。
    • 標準辞書はロシア語としている。他の言語辞書に切替えるには,M-x ispell-change-dictionary RET French(切替えたい辞書名) RET とする。以下の flyspell-言語名 もしくは ispell-言語名 のユーザー関数を使うと,その過程で辞書が切替わる。
    • M-x flyspell-russian RET によって露語辞書に切替え flyspell チェックを行う。
    • M-x flyspell-english RET によって英語辞書に切替え flyspell チェックを行う。
    • M-x flyspell-french RET によって仏語辞書に切替え flyspell チェックを行う。
    • M-x flyspell-german RET によって独語辞書に切替え flyspell チェックを行う。
    • M-x ispell-russian RET によって露語辞書に切替え ispell-buffer チェックを行う。
    • M-x ispell-english RET によって英語辞書に切替え ispell-buffer チェックを行う。
    • M-x ispell-french RET によって仏語辞書に切替え ispell-buffer チェックを行う。
    • M-x ispell-german RET によって独語辞書に切替え ispell-buffer チェックを行う。
    • C-f1 によって,現在選択されている辞書で ispell-word を実行する。ispell-word 関数はカーソル位置の単語をチェックし,誤りがあれば別バッファに候補を表示する。
    • C-f2 によって,現在選択されている辞書で ispell-region を実行する。ispell-region 関数はテキスト・リージョン(選択範囲テキスト)に対してスペルチェックを実行し,ミススペルの語を強調表示するとともに別バッファに訂正候補を表示し,ユーザー応答を促す処理を繰り返す。
    • C-f3 によって,現在選択されている辞書で ispell-buffer を実行する。ispell-buffer 関数は編集バッファ全体に対してチェックを行う。

    各国語辞書はそれぞれの言語の方言・正書法に応じて複数用意されている。それは Aspell コマンド引数リスト,例えば,ロシア語辞書定義の ("-d" "ru-yeyo") のうちの "ru-yeyo" の部分に指定することができる。-d は Aspell の辞書を指定する引数であり,それに引き続いて辞書名を指定するわけである。このロシア語用定義で指定されている ru-yeyo は,е(イェ)と ё(イョ)のいずれの表記にも対応できる辞書である。つまり твердый でも,твёрдый でもチェックできる指定である。仮に,ru-ye を指定すると,твёрдый が綴り誤りとしてチェックアウトされる。この方法で指定できる辞書のオプションは,各国語辞書パッケージに添付されている README に説明がある。必ずこれを読んで,ユーザー自身の目的に応じた辞書を("-d" "辞書名") に指定してほしい。

    デフォルト選択辞書をロシア語にしている。別の言語を設定したいのならば,上記 elisp 中の変数 flyspell-default-dictionaryispell-dictionaryispell-local-dictionary の各オペランドを "Russian" ではなく "German" 等の辞書名に書き換えればよい。

    この Aspell 用 elisp 設定は,Windows Meadow のみならず,FreeBSD,Linux,Mac OS X の Emacs でも有効である。もちろん,ispell-program-name のパス指定を使用環境に応じて書き換える必要がある。

  8. 非アクティブ・モード行表示不正対策

    Meadow 標準設定では,非アクティブのモード行(バッファの下にあるステータス表示行)のキリル文字が文字化け(いわゆる「豆腐」)で表示されてしまう。これは Meadow において modeline-inactive 属性のフェース・フォントが,キリル文字を含まないデフォルト・フォントに設定されているためである。この対策として set-face-font 関数によって modeline-inactive 属性に用いるフォントセットを mule-fonts16 に再設定すればよい。M-x set-face-font RET modeline-inactive RET mule-fonts16 RET を実行するとよい。いちいちこれを入力するのが面倒であれば,mule-fonts パッケージ C:\meadow\packages\pkginfo\mule-fonts\auto-autoloads.el を Meadow で開いて,最後尾に以下を追加して格納し,Meadow を再起動すればよい。対策前後を図 1 に示す。

    (set-face-font 'modeline-inactive "mule-fonts16")
    

    なお,この定義は .emacs に記述できない。フォントセット mule-fonts16 は .emacs よりあとで読込まれる mule-fonts\auto-autoloads.el で定義されているからである。

    m-04-modline-zengo.jpg

    図 1. 非アクティブ・モード行キリル文字問題対策


Meadow 3.01-dev における GNU Aspell 露・英・仏・独辞書環境設定は以上のとおりである。図 2 に,ispell-buffer によってロシア語テキストをスペルチェックするスクリーンショットを示す。

m-08-ru-buffer.jpg

図 2. ispell-buffer ロシア語スペルチェック

今回,露・英・仏・独四カ国語を切替える設定を示したけれども,ユーザーにとって不要な言語を削る設定はそれほど難しくないと思う。C-f1 などのショートハンドについても,global-set-key 関数によって,好みのキーに割り当ててもらいたい。

ここで対象にしなかった言語についても,Aspell でサポートされている言語ならば,辞書追加を同じように実施し,上記 elisp の ispell-dictionary-alist に辞書エントリを追加すればよい。エントリの 8 つのパラメータについて上記 elisp 中にもコメントとして概略仕様を簡単にしるしておいたので参考にしてほしい。また,標準 ispell 辞書用の定義が ispell.el にあるので,これを参考に Aspell 用を定義してもよい。詳しくは開発者によるマニュアルを参照のこと(M-x describe-variable RET ispell-dictionary-alist RET から参照できる)。

複数の言語が混在した文書のスペルチェックは当然ながら辞書を切替えながら実施することになる。仏語辞書が選択されているとき独語テキスト部分で誤りと判断される単語が大量に出てしまうのは致し方ない(図 3. フランス語辞書選択時と,図 4. ドイツ語辞書選択時の画面を比較せよ)。ロシア語辞書の場合は,ispell-dictionary-alist 定義によって,キリル文字のみが対象文字セットに指定されているため,ASCII 文字からなる単語には反応しない。

m-10-flys-fr.jpg

図 3. フランス語辞書使用時

m-11-flys-de.jpg

図 4. ドイツ語辞書使用時

Wnn7, Mew-6.2 with Emacs 23.1.50

|

FreeBSD にも Emacs-CVS をインストールした。Emacs 22 の Mew 5.1 draft-mode(メールを書くときのモード)でメールを書いているときに flyspell がうまく動作しないので,どうしたものか悩んだためである。FreeBSD でもバージョンアップしてみることにした。Mew も 6.2 が公開されていた。ふたつともいっしょにバージョンアップした。Mew の X-mailer から Emacs 23 において Mule バージョンも「賢木」から「花散里」になったことを知った。日本人による Emacs コントリビューションの最大の成果である Mule は,『源氏物語』の巻名でバージョンを表現する習わしである。

これで,Mew の draft-mode でも flyspell が動作するようになった。ところが,今度は Wnn7 のかな漢字変換において「候補が 1 つも作れませんでした」とミニバッファに出て,漢字変換ができない。なんじゃこりゃー! もうサイテー! オレはインスコ・ヲタクじゃねーのに,余計なことさせんなー! 調べたところ,Wnn7 elisp: wnn7egg は Emacs 23 ではそもそもうまく動かないらしい。

捨てる神あれば拾う神あり。この問題でパッチが公開されていることをここで知った。最新の Emacs 23.1.50.2 でもこのパッチが有効かどうか少し疑問であったが,ダメ元で試してみた。wnn7-elisp-el-1.02-1.patch.gz をダウンロード。オムロンのサイトにある wnn7egg v1.02 ソースアーカイブをダウンロード・展開したものに対して,このパッチを適用する。オペレーションは以下のとおり。

% cd ~/tmp
% wget -nH -nd \
http://www.omronsoft.co.jp/SP/pcunix/wnn7/support/modules/wnn7egg/wnn7-elisp-el-1.02-1.tgz
% tar zxvf wnn7-elisp-el-1.02-1.tgz
% cd wnn7
% wget -nH -nd ftp://ftp.jpl.org/pub/elisp/wnn7-elisp-el-1.02-1.patch.gz
% gunzip wnn7-elisp-el-1.02-1.patch.gz
% patch -p1 < wnn7-elisp-el-1.02-1.patch
% su -m
# mv /usr/local/share/emacs/site-lisp/wnn7egg ~/tmp/wnn7egg.bak
# cp -R wnn7/elisp/emacs20 /usr/local/share/emacs/site-lisp/wnn7egg
# exit

これで,かな漢字変換ができるようになった。M-x egg-use-input-predict による Wnn7 入力予測機能への切替えも OK であった。

※ 09.8.28 付記
Mew のバージョンについて,Emacs-23 では Mew-6.2.52 以降を使う。Mew 作者は 6.2.52 で Emacs-23 対応のバグを fix したという。たしかに,Mew-6.2 では draft-mode でのテキスト入力が異常に遅く使い物にならなかったが,6.2.52 で改善されていた。

Mac OS X Tiger 10.4.11,X11 環境の GNU Emacs(22.0.50)において,ロシア語テキストの flyspell-mode(単語入力と同時にスペルチェックし,ミスがあると修飾表示してくれるモード)設定をしたところ,"Symbol's function definition is void: ispell-maybe-find-aspell-dictionaries" というエラーが出てスペルチェックができない。ispell-buffer などは OK である。調べたところ,どうも Emacs の新しい版では訂正されているとのことであった。そこで,意を決して久々に CVS から Emacs を構築することにした。バージョンは 23.1.50.2(ChangeLog 最新日付は 2009.8.15)。

ところが,Mac OS X でのコンパイル,起動確認は厄介だった。オープンソース・プログラムの構築では,ユーザーの環境により様々な問題が出る可能性があり,一様ではないだろうけれども,私と同じ問題に遭遇した人のために,その問題と対処メモをしるしておく。

まずは Emacs CVS リポジトリ http://savannah.gnu.org/cvs/?group=emacs からローカル・ワークにチェックアウトする。続いて,configure スクリプトを実行し,make。

% cd ~/tmp
% setenv CVS_RSH ssh
% cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs co emacs
% ./configure --with-x
% make bootstrap

ftfont.c のコンパイルで問題が出た。'FC_WEIGHT_REGULAR' undeclared や 'FC_WIDTH' undeclared といったエラーが出て停止する。これは GTK+2 ライブラリがないために出るようである。Version-23 から GTK+2 を使うようになったらしい。そこで,このライブラリをインストールした。今回は source tar ball からではなく,EasyPackage インストーラで Tiger 用バイナリを導入した。x11-toolkits 分類から gtk+2 をダブルクリックするだけ。いとも簡単。これで再度 make をしてコンパイルは完了した。sudo make install でインストールは終了。

次にいよいよ Emacs を起動したところ,次のようなエラーで Emacs が abort した。

Error reading Pango modules file
 
(emacs:24574): Pango-CRITICAL **: _pango_engine_shape_shape: assertion
`PANGO_IS_FONT (font)' failed
 
Pango-ERROR **: file shape.c: line 75 (pango_shape): assertion failed: 
(glyphs->num_glyphs > 0)
aborting...

Pango ってなんじゃ? これはフォントのレンダリングでアンチエイリアス表示をする仕組みのようである。こんなんいらんのにと,configure オプションを調べなおしたりしたが,抑止できるオプションがなさそうであった。でも /usr/local/lib,/opt/local/lib の下を確認すると,libpango* のライブラリがすでにインストールされており,設定の問題らしいことがわかった。Google で検索した結果,pango.modules の設定がよろしくない。これを作りなおすコマンド pango-querymodules を実行すればうまくいった。

# cd /usr/local/etc/pango
# pango-querymodules > pango.modules

Emacs のコンパイルでトラブルは毎度のこと。どうしてこんなに面倒なのか。FreeBSD ports や Mac Carbon-Emacs dmg,Mac Darwin ports を利用して構築することを強く推奨する。こんなことで時間を浪費するのは,スキ者に任せておくべきである。

flyspell もばっちり OK になった。これを契機にロシア語スペルチェック環境を改善した。ロシアの KOSTAFEY 氏によるブログ "KOSTAFEY'S BLOG" 2009.7.28 日の記事 Emacs, Aspell и одновременное использование словарей を参考に .emacs から以下の elisp を読込むようにした(つまり (load-file "~/elisp/aspell.el") を追加した)。これは text mode で自動的にロシア語用 flyspell が起動し,カーソル上の単語にスペルミスがあれば赤色・下線付きで強調表示してくれる。C-F1 キーで ispell-word 関数(カーソル上の単語チェック),C-F2 キーで ispell-region 関数(指定範囲のチェック),C-F3 キーで ispell-buffer 関数(バッファ全体のチェック)が起動し,スペルチェックが出来る。flyspell-english 関数と flyspell-russian 関数によって,英語とロシア語の切替えが出来るようになっている。ispell-change-dictionary 関数で辞書を切替えてもよい。辞書はデフォルトをロシア語にしてある。もちろん,GNU Aspell とロシア語辞書を予めインストールしておく必要がある。ru-yeyo とは,е(イェ)と ё(イョ)どちらの綴りにも対応したロシア語辞書指定である。

;; -*- coding: utf-8; -*-
;; aspell.el
;;
;; Настройка проверки правописания Ispell
;; From http://kostafey.blogspot.com/2009/07/emacs-aspell.html
;;
;; .emacs に (load-file "hoge/aspell.el") を指定して読み込ませる。
;;
 
(require 'flyspell)
(require 'ispell)
(setq
 ispell-program-name "/usr/local/lib/aspell-0.60/ispell" ;; aspell path
 ispell-dictionary-alist 
 '(("english"                       ; English
    "[a-zA-Z]" 
    "[^a-zA-Z]" 
    "[']" nil ("-d" "en") nil iso-8859-1)
   ("russian"                       ; Russian
    "[АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя]"
    "[^АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя]"
    "[-]" nil ("-d" "ru-yeyo") nil utf-8)
   (nil                             ; Default
    "[A-Za-z]"
    "[^A-Za-z]"
    "[']" nil ("-C") nil iso-8859-1)
   )
 ispell-russian-dictionary "russian"
 ispell-english-dictionary "english"
 flyspell-default-dictionary ispell-russian-dictionary
 ispell-dictionary ispell-russian-dictionary
 ispell-local-dictionary ispell-russian-dictionary
 ispell-extra-args '("--sug-mode=ultra" "--encoding=UTF-8") ;; added
)
 
;; Russian
(defun flyspell-russian ()
  (interactive)
  (flyspell-mode t)
  (ispell-change-dictionary ispell-russian-dictionary)
  (flyspell-buffer)
  (message "Russian dictionary - Spell Checking completed."))
 
;; English
(defun flyspell-english ()
  (interactive)
  (flyspell-mode t)
  (ispell-change-dictionary ispell-english-dictionary)
  (flyspell-buffer)
  (message "English dictionary - Spell Checking completed."))
 
;; ハイライト表示フェース
(setq ispell-highlight-face 'flyspell-incorrect)
;; テキスト編集モードで flyspell 自動起動
(add-hook 'text-mode-hook 'flyspell-mode)
;; check 前にウェイト 1 秒
(setq flyspell-delay 1)
 
;; short hands
(global-set-key [(control f1)] 'ispell-word)
(global-set-key [(control f2)] 'ispell-region)
(global-set-key [(control f3)] 'ispell-buffer)

Cygwin 環境で Aspell を組込めば,これとほぼ同じ設定で Windows Meadow-3.01dev においても,flyspell,ispell-buffer,ispell-region,ispell-word が動作する(修正点は aspell のパス)。ただし,Meadow Netinstall で ispell パッケージを組み込んでいる場合,%MEADOW%\packages\pkginfo\ispell フォルダに格納される auto-autoloads.el の定義が上記 aspell 用 elisp との相性が悪く(おそらく,この auto-autoloads.el は英単語チェックしか考慮していない設定になっていて,上記 aspell.el 設定と矛盾するためだろう),ispell-buffer と ispell-region がうまく動作しない。対策として ispell フォルダを pkginfo から外す必要があるので注意。(さらにもうひとつ。Windows Cygwin 環境でも aspell 辞書をインストールするには,アーカイブを解凍してできる辞書データを aspell 辞書フォルダにコピーするだけでは不十分である。必ず,./configure; make; make install オペレーションを実施して,*.rws ファイルをインストールする。)

Windows Meadow で aspell を使う場合,もう一点,注意事項がある。スペルチェック中綴誤りのある単語について aspell が問い合わせを行うバッファ・フレームのモードラインのロシア語が,デフォルト状態では「豆腐」で出力されてしまう。これは inactive なモード行のフォント設定がデフォルト・フォントであるために,キリル文字が表示できない事情による。Meadow 多言語フォント・パッケージ mule-fonts を導入しているなら,M-x set-face-font RET modeline-inactive RET mule-fonts16 RET として,mule-fonts16 に fontset をインターラクティブに変更するか,mule-fonts パッケージの auto-autoloads.el の最後に (set-face-font 'modeline-inactive "mule-fonts16") を追加する。キリル文字を含む多言語用の fontset を Meadow に定義しているなら,mule-fonts16 でなくその fontset 名を代わりに指定してもよい。

Emacs の苦労多き構築作業が終わったあとになって,flyspell の訂正版が出ていることが判明。なにも Emacs-CVS の追っかけをやる必要はなかったのだった。Manuel Serrano 氏の flyspell ページから flyspell-1.7o.el をダウンロードし,FreeBSD の Emacs 22.0.90 lisp/textmodes/flyspell.el をこれに入れ替えたら,きちんと動作するようになった。トホホ。

でも Emacs-23 にバージョンアップしてよかった点がひとつある。Unicode 文字合成機能(文字にアクセント記号を後置すると合成して表示する。タイ語などでは必須の機能)がやっとサポートされたことである。

※ 2010/01/11 付記
Emacs の最新 trunk は,2009 年末,ここでしるしている cvs から bzr (bazaar) にバージョン管理が変更された。もう cvs は適用できないので注意。

とあるロシア通の方と LaTeX や Meadow についてメールをやりとりする機会があった。その方は Windows Meadow 3 を使っておられるのだが,ロシア語を編集する際,24 ドットフォントが利用できないとのことであった。

私は普段 X11 でしか Emacs を使わず,BDF フォントの設定で 14, 16, 24 の各サイズで多言語表示できるようにしている。また,24 ドットフォントだと Emacs の画面サイズが巨大になり,かなりの高解像度でモニターを使用していないと煩い。16 ドットフォントが使えれば十分だと私は思っていた。そういう事情で,私には彼の悩みがいまひとつ解らなかった。私の Windows Meadow 環境で確認したところ,Meadow 3.00 の BDF フォントパッケージ mule-fonts では,たしかに 16 ドット表示しかできない設定になっていた。Meadow のフォント設定は UNIX X11 Emacs とはまったく違う。

mule-fonts パッケージ添付の elisp,BDF フォントのリストを確認し,これに足りない BDF ファイルを補い,elisp コードを追加することにより,24 ドットでも編集できるようにしてみた。件の方に差し上げたところ,24 ドットの大きい文字が使えるようになったとよろこんでくれた。同じ問題で困っている方もあるかと思い,せっかくなので,ここにもそのメモをしるしておく。Meadow Netintall インストーラでもって,mule-fonts パッケージがすでに組込まれていることが前提である。

  1. mule-fonts は intlfonts, /efont/, cdacfonts などのさまざまな多言語 BDF フォントを纏めた便利なパッケージである。しかし,/efont/ Unicode 24 ドットフォントを添付していない。まず,24 ドットフォントを追加するため,efont-unicode-bdf-0.4.2.tar.bz2 をダウンロードし,適当なフォルダで解凍する。.tar.bz2(tar のアーカイブを bzip2 で圧縮したもの)を取り扱うことの出来る Windows 用アーカイバ(lhaplus 等)が必要である。
  2. 数ある /efont/ フォントから,b24*.bdf(b24.bdf, b24_b.bdf, b24_i.bdf, b24_bi.bdf)4 ファイル%MEADOW%\packages\fonts\efonts フォルダの下にコピーする。%MEADOW% は Meadow をインストールしたフォルダ名に読み替える。
  3. mule-fonts には初期設定 elisp: auto-autoloads.el が添付されている。Meadow を起動すると自動的にこれが読込まれて,"mule-fonts16" という名のフォントセットが設定される仕組みになっている。これに 24 ドット用のフォントセット "intlefonts-24" を追加した私の版 auto-autoloads.el を用意した。これをダウンロードし,%MEADOW%\packages\pkginfo\mule-fonts\auto-autoloads.el に上書きコピーする。その際,必ずオリジナル auto-autoloads.el のバックアップを取得しておいてほしい。
  4. Meadow を再起動すれば,「Shift + 左クリック」で Font Menue に "intlefonts-24" が追加されているはずである。これを選択すると 24 ドットフォントで編集ができるようになる。/efont/ b24*.bdf は Unicode のラージフォントであり,ロシア語のみならず,古スラヴ語・教会スラヴ語,古典ギリシア語,ヴェトナム語,CJK 統合漢字等々を含んでいる。
  5. いつも 24 ドットを使いたいわけでなく,必要になった時点で設定したい場合は,次のようにすることもできる。intl_efonts_24.el を適当な場所において,M-x load-file RTN 適当な場所/intl_efonts_24.el RTN とすれば,同様に "intlefonts-24" フォントセットが追加される。ただし,この elisp は auto-autoloads.el がすでに読込まれていることが必要なので,.emacs に記述できない(auto-autoloads.el は .emacs のあとで処理されるため)ことに注意してほしい。

Utf82TeX 0906 Release

|

Utf82TeX 0906 をリリースした。Unicode CJK Unified Ideographs Extension B(CJK 統合漢字拡張 B)をサポートし,Unicode 漢字の \UTFx, \CIDx 命令変換を改善した。漢字についてはほぼ遺漏なく処理できるようになったはずである。本サイトのダウンロード頁から取得できる。ドキュメントも改訂した。

Windows Vista がリリースされてから入力文字の範囲が拡張され,CJK 統合漢字拡張 B の文字も IME から普通に入力できるようになった。例えば,吉野屋の吉(つちよし):牛丼の吉野家の「吉」=「つちよし」もこのエリアに定義されている。従来の Utf82TeX だとそのまま出力されてしまい,コンパイルでエラーとなっていた。Utf82TeX 0906 は「つちよし」(U+20BB7)を \CID{13706} に変換する。

齋藤さんの OTF パッケージを前提としている。CJK 統合漢字拡張 B 領域文字を OTF パッケージで出力するには,安定版(stable)ではだめで,開発版(devel)を導入する必要があることに注意いただきたい。

今回いちばん苦労したのが,変換テーブル。Unicode コードポイントとそれに対応する CID 番号の対である。TeX コミュニティの権威者・角藤先生の utf8toutf 変換ツールがこのテーブルを持っていることを知った。先生にメールを書いて,流用許諾をお願いした。先生は快く了承してくださった。

テーブル構築用のプログラムを何本も書いた。UCS コードとビット列との相互変換などのコードを書くうちに,UTF-8 や UTF-16BE の符号化方式についても勉強になった。

Unicode Home Page にある Unihan database: Unihan.txt をダウンロードし,UCS と Adobe_Japan1_6 コード(つまり CID 番号)の対を抽出し,プログラムで加工した。Adobe Reader に添付されている CMap(日本語用 UniJIS-UTF16-H,中国語簡体字用 UniGB-UTF16-H,中国語繁体字用 UniCNS-UTF16-H,韓国語用 UniKS-UTF16-H)と突き合わせして,UCS — CID JP, CID CS, CID CT, CID KR のレコードを生成した。これでできたテーブルを角藤先生のテーブルデータとマッチングして不足,不正をチェックした。最終的に 15,790 字のテーブルとなった。このうち CJK 統合漢字拡張 B 領域の変換可能文字は日本語,中国語合わせ(韓国語のハンチャはそもそもこの領域には定義されていない)1,939 文字となっている。

0906 の改修で少し Perl コードを整理した。strict でないし,余計な処理の残骸もこれまで野ざらしにしていたのだ。まだ misima にはこの変更を反映していない。もうしばらく時間がかかりそうである。

ロシア語電子辞書

|

ロシア語電子辞書 CASIO 製 Ex-word XD-SF7700 を手に入れた。PC で文書作成時に利用するロシア語辞典をいろいろと構築するその一方で,携帯電子辞書もほしいアイテムだった。

ロシア語電子辞書はなかなか出なかった。ロシアで販売されている露英・英露電子辞書を買おうかとかつては思案したものだったが,カシオが「特殊辺境言語」であるロシア語モデルを出してくれた。さすがトップメーカー。キヤノン,ソニー,シャープにはとても真似ができないと思われる。実はこの初号機が昨年すでに発売されていたのを私は知らず,この 2 月 20 日に新モデルが発売されたのをタイミングよくゲット。コンサイス露和辞典第5版,コンサイス和露辞典第3版,Oxford Russian Dictionary のほかにも,小学館大辞泉,ブリタニカ国際大百科事典,大修館新漢語林,大修館明鏡国語辞典,小学館類語例解辞典など,全 53 コンテンツが収録されている。英語系も,Oxford Advanced Learner's Dictionary 7th ed., ジーニアス英和大辞典,プログレッシブ和英中辞典が含まれる。ロシア語,英語ともに Oxford の有名な学習辞典が入っているのがうれしい。

XD-SF7700 のキリル・キーボードは,ロシア本国の標準であるロシア語配列である。もちろん英数字・かなも併記されている。ロシア語配列は,当然ながら,ロシア語をタイプするのに便利なように文字が巧みに配置されていて,п, р, о, в, а, с, м, и, к, е, н などロシア単語で頻出する文字が中央に集中配置されている。私は Emacs やら SCIM やら PC ではフォネティック(ローマ字式)キリル配列を使っているので,この電子辞書のキーボードに早く慣れないといけない。

casio-xd-sf7700.jpg

多言語辞書 JMdict (Japanese Multi-lingual Electronic Dictionary) を Emacs 辞書検索ツール sdic で利用できるようにしてみた。その概略を示す。Emacs で使える和露,和仏,和独辞典をお探しの方の参考になれば幸いである。

先日 sdic をインストールし,英辞郎辞書を検索できるようにして以来,ロシア語辞書の電子データが手に入らないか探していた。フリーの露和辞典はなかなか見いだせなかったけれども,JMdict 日本語–多言語辞書を発見した。これは JMdict プロジェクトによってメンテナンスされている巨大な電子辞書である。ライセンスもフリーのようだ。ダウンロードした版で私が勘定したところ,13 万 4 千語を収録している。主に和独・和英がメインであるが,ロシア語,フランス語の訳も収録している。ロシア語訳が付与されている見出し語は,そのうち 6 千 7 百程度に過ぎない。それでもロシア語にはアクセントまで付加されていて感心した。

以下,手順を整理する。sdic,sufary のインストールについては,「英辞郎第四版を Emacs で使う」に纏めた。

  1. JMdict は,賢明にも,XML 形式 UTF-8 エンコードで配布されている。このため,別のフォーマットに変換したり,ロシア語訳がついているものだけ抽出するなど,加工が極めて容易になっている。そこで,sdic 形式に変換すれば,和独・露・仏・英辞典として sdic でも使えるだろうと考えた。XML から sdic へのフォーマット変換は,プログラムを書いてもよいが,お手軽に XSLT を使うことにした。
  2. FreeBSD,Linux の世界では,Apache XML プロジェクトによる Xalan XSLT プロセッサが有名である。ここでは,高速な C/C++ 版 Xalan-c-1.10.0 を使うことにする。Windows ユーザは Microsoft が無償配布している MSXML を利用することができる。Xalan("ザーラン" と呼ぶらしい)は,同じく Apache XML プロジェクトによる XML パーサ・ライブラリである Xerces-c を前提とする。FreeBSD ports でこれらパッケージを組込む。cd /usr/ports/textproc/xalan-c && make install clean とするだけでよい。
  3. JMdict アーカイブをダウンロードし,解凍しておく。ここでは ~/tmp に JMdict ファイル名で XML 形式のファイルが解凍されたものとして説明する。
  4. 次に XSLT 変換のためのスタイルシートを準備する。これがいちばん厄介な作業であった。XML::Parser で Perl プログラムを書いたほうがラクなのかも知れなかった。JMdict には辞書として必要な様々な情報が付加されている(cf: JMdict 仕様)。私はこのなかから見出し,読み,品詞,反意語,参考情報,訳語(ドイツ語,フランス語,ロシア語,英語)を抽出し,sdic 形式に再編成することとした。sdic 形式は,見出し語を <H> タグで,検索語を <K> タグでそれぞれマークアップし,あとは一行内に情報をぶら下げるテキストである。見出し語は JMdict の漢字表記から採用し,同じ漢字表記と読みすべてを検索語としてタグ付けするようにした。こうしておくと sdic での検索を様々な表記で行い,見出し語を引くことができる。こうした仕様のために私が作成したスタイルシートを以下に掲げる。これを jmdict2sdic.xsl ファイル名で格納する。
  5. <xsl:stylesheet version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="UTF-8" />
     
    <!--
        JMdict XML -> SDIC 形式変換 
        JMdict XML タグ仕様
            entry          エントリ
              k_ele        日本語漢字エレメント(表記の違いなど)
                keb        日本語漢字
              r_ele        日本語読み情報 
                reb        日本語読み
                re_restr   日本語読み追加情報
              sense        意味エレメント
                pos        日本語品詞
                xref       日本語関連語
                ant        日本語反意語
                gloss      多言語意味
                  xml:lan  言語 (英・独・仏・露ほか)
    -->
     
    <xsl:template match="JMdict">
        <xsl:apply-templates select="entry" />
    </xsl:template>
     
    <xsl:template match="entry">
        <xsl:text>&lt;H&gt;</xsl:text>
        <xsl:value-of select="k_ele/keb | r_ele/reb" />
        <xsl:text>&lt;/H&gt;</xsl:text>
        <xsl:for-each select="k_ele/keb | r_ele/reb | r_ele/re_restr">
            <xsl:text>&lt;K&gt;</xsl:text><xsl:value-of select="." />
            <xsl:text>&lt;/K&gt;</xsl:text>
        </xsl:for-each>
        <xsl:for-each select="sense">
            <xsl:if test="pos[not(.='')]">
                <xsl:text>【</xsl:text><xsl:value-of select="pos" />
                <xsl:text>】</xsl:text>
            </xsl:if>
            <xsl:if test="ant[not(.='')]">
                <xsl:text>〔反: </xsl:text>
            </xsl:if>
            <xsl:for-each select="ant">
                <xsl:value-of select="." />
            </xsl:for-each>
            <xsl:if test="ant[not(.='')]">
                <xsl:text>〕</xsl:text>
            </xsl:if>
            <xsl:if test="xref[not(.='')]">
                <xsl:text>〔参考: </xsl:text>
            </xsl:if>
            <xsl:for-each select="xref">
                <xsl:value-of select="." />
            </xsl:for-each>
            <xsl:if test="xref[not(.='')]">
                <xsl:text>〕</xsl:text>
            </xsl:if>
            <xsl:for-each select="gloss">
                <xsl:text> [</xsl:text><xsl:value-of select="@xml:lang" />
                <xsl:text>] </xsl:text>
                <xsl:value-of select="." /><xsl:text>; </xsl:text>
            </xsl:for-each>
        </xsl:for-each>
        <xsl:text>
    </xsl:text>
    </xsl:template>
     
    </xsl:stylesheet>
     
    

  6. Xalan XSLT プロセッサで XML から sdic 形式にフォーマット変換を行う。JMdict が巨大な上,Xalan はすべてのノードツリーをインコアで展開するため,処理には CPU,メモリコストもそれなりにかかる。IBM ThinkPad X40 Mobile Pentium-M 1.2GHz プロセッサで,実行時間約 7 分 15 秒,メモリ 300 MB を要した。メモリ(仮想記憶)不足にならないよう注意すべきである。
  7. % cd ~/tmp
    % Xalan  -o jmdict.sdic JMdict jmdict2sdic.xsl
    

  8. 生成された sdic 形式辞書 jmdict.sdic は下図のようなイメージのはずである。
  9. jmdicru.jpg

  10. 次に,jmdict.sdic を sdic 用ディレクトリに移動し,さらに高速化のため sufary インデックスを生成する。もし英辞郎の和英辞典も使いたいなら,JMdict とマージしてしまおう。
  11. % su - m
    # mv jmdict.sdic /usr/local/share/dict
    # cd /usr/local/share/dict
    # cat jmdict.sdic waeijirou.sdic | sort > waeijirou-jmdict.sdic # 和英辞郎マージ
    # mkary jmdict.sdic
    # mkary waeijirou-jmdict.sdic # 和英辞郎マージ
    # ls -las jmdict* waeijirou-*
    ...  23972286 Feb 12 23:24 /usr/local/share/dict/jmdict.sdic
    ...  82669060 Feb 12 23:26 /usr/local/share/dict/jmdict.sdic.ary
    ... 167112343 Feb 12 23:25 /usr/local/share/dict/waeijirou-jmdict.sdic
    ... 508872436 Feb 12 23:28 /usr/local/share/dict/waeijirou-jmdict.sdic.ary
    #
    

  12. Emacs 初期設定ファイル .emacs に以下を設定する。sdic-waei-dictionary-list 変数に対し,和英辞典として JMdict(jmdict.sdic)を指定する。和英辞郎マージ辞書の場合は waeijirou-jmdict.sdic である。
  13. ;; sdic
    (autoload 'sdic-describe-word "sdic" "単語の意味を調べる" t nil)
    (global-set-key "\C-cw" 'sdic-describe-word)
    (setq sdic-eiwa-dictionary-list
              '((sdicf-client "/usr/local/share/dict/eijirou.sdic" 
    						  (strategy array))))
    (setq sdic-waei-dictionary-list
              '((sdicf-client "/usr/local/share/dict/jmdict.sdic" ;; JMdict
    ;         '((sdicf-client "/usr/local/share/dict/waeijirou-jmdict.sdic" ;; 和英辞郎+JMdict
    						  (strategy array))))
    (setq sdic-default-coding-system 'utf-8-unix)
    ;;
    

  14. 以上で JMdict 設定は完了である。sdic で検索してみた際のスナップショットを下図に示す。

    sdicmulti.jpg

    使い勝手において注意事項がひとつ。英文字を含む語,例えば「CDプレーヤー」などの語を引くとき,英文字は sdic 和英辞典検索では無視されるため,これで入力・検索してもヒットしない。この場合「シーディープレーヤー」と仮名表記で検索すればよい。これは,JMdict は様々な読みの表記を収録しており,上記スタイルシートではこれらをすべて検索対象語(<K> タグ)に設定するようにしているからである。だから「シーディープレイヤー」でも検索できる。検索結果では,見出し語(<H> タグ)として登録した「CDプレーヤー」が表示される。漢字表記の言葉も仮名で検索できるわけだ。「うたう」で検索すると,「歌う(sing, chanter, петь, singen, etc.)」,「謳う(express, énoncer, besingen, rühmen, etc.)」の訳語を調べることができる。


私は品詞情報に関して英語で付与された長たらしいそのままの情報を【 】に入れるようにスタイルシートを調整したけれども,一般的には日本語に変換して使うのがより便利だと思われる。その場合,XML ファイル冒頭に記述されている DTD のうち,実態参照定義を日本語で書直せば(つまり,<!ENTITY adj-i "adjective (keiyoushi)">"adjective (keiyoushi)""形容詞" あるいは "形" などとする),Xalan はそこから拾って本文に埋込んでくれるはずである。また,JMdict の XML そのものを眺めて,私が割愛した情報を取込むようスタイルシートをコーディングしてもよいだろう。

それにしても,この JMdict,おかしな日本語の見出しがかなりある。「誤った日本語」というのではなく「おま○こ」だの「Hな映画」だの「Tバック」だの,要するに俗語・卑語が満載で,かつ大阪弁などの方言も載っている。それだけ,ホットで実用的な電子辞書だと言うことが出来る(?)。外国人から見た日本文化というもののイメージが,こういうところにも現われているのではないだろうか。
 

本書は XSLT スタイルシートの書き方を,XPath 含めコンパクトに整理している。比較的安価なリファレンスである。XSLT プロセッサは主に Java 版の Xalan について触れていて,これは,Windows でも UNIX でも同一の操作が可能である。できることは C/C++ 版とほぼ同じであり,コマンドラインが異なるだけである。ただ Java 版は C/C++ 版よりもメモリを大食いし,その実行速度でも劣るかも知れない。

misima SOAP Client Perl 版

|

今日は,Perl で misima SOAP クライアントを簡単に作成する方法について述べる。

misima 旧字・旧仮名遣い変換支援は Web 版を数多くの方に使っていただいている。しかし,misima SOAP Web Service を利用しているひとはほとんどいない。misima SOAP Web Service パッケージには,Emacs / Meadow 用,Microsoft Word 用,Jedit X 用,TeXShop 用,秀丸用のクライアント,Java API クラスライブラリが添付されている。これによって,まるで自分の PC で misima が動いているかのような使い方ができるのに。作者としては残念である。

SOAP といえば Java という印象があるけれども,一方,Perl の世界でも,SOAP 通信基盤モジュール SOAP::Lite が提供されており,CPAN (Comprehensive Perl Archive Network) から入手できる。これを使うと,いとも簡単に misima SOAP クライアントが書けてしまう。misima 変換オプションと対象文字列を二つのパラメータにセットし,SOAP サービスオブジェクトを生成し,パラメータを引数にして misimaConvert メソッドを実行すると,misima 変換結果が返却される。

#!/usr/bin/perl
use utf8;
use SOAP::Lite;
binmode STDOUT, ":utf8";
my $p1 = "-kyitq -s a -x fki"; # 旧字旧仮名TeX変換指定
my $p2 = "鴎外は団扇であおいだ。Я люблю вас. Ça, déjeunons!"; # 変換対象 text
my $uri = "http://yasuda.homeip.net/webservices/misimaSoapConnector";
my $svc = SOAP::Lite->service("$uri?wsdl");
print $svc->misimaConvert($p1, $p2);

以上のような Perl コードを misimaconvert とでも名前を付けて格納する。コマンドラインでこれを実行すると「\CID{7646}外は團\CID{13883}であふいだ。YA lyublyu vas. \c Ca, d\'ejeunons!」(旧字・旧仮名遣い・多言語 TeX 変換)と出力される。

もちろん,これは核心部分だけのコードなので,実用的なプログラムには,パラメータの組立て,変換対象文字列の取得,結果の編集・加工など,その前段,後段が必要なのは言うまでもない。でも,misima の遠隔変換オペレーションはこれだけでできてしまうのである。SOAP はいかに簡単なのかということが分かると思う。misima サーバが Java で記述されているなんてことはまったく意識しないでよい。XML による標準化というものがいかに強力なのかが分かるというものである。

おそらく SOAP::Lite モジュールの組込みの方がよっぽど面倒だろう。MIME-Lite, MIME-Tools, XML-Parser, Compress-Zlib など,いくつかの前提モジュールを別途インストールしておく必要があるからである。FreeBSD ならば ports: net/p5-SOAP-Lite が用意されているので,cd /usr/ports/net/p5-SOAP-Lite && make install clean 一発でインストールできる。私の場合,前提 Perl モジュールの版が古かったためか,「.../Base64.so: Undefined symbol "Perl_Tstack_sp_ptr"」などのエラーが出て make が失敗するという問題があった。エラーになっているライブラリ(例では BASE64.so)の Perl モジュールを再インストール(make deinstall reinstall)すればうまくいった。

ユーザでもし独自に misima アクセスクライアントを作成し運用する場合は,私に連絡いただきたい。

※ 2010.11.2 付記
misima SOAP Web Service は停止しました。上記プログラムを実行しても動作しません。

slavonic.el 更新

|

Emacs 用スラヴ語汎用インプットメソッド slavonic.el を更新した。アクセントの入力仕様を追加・修正した。ラテン文字系の鋭アクセント (U+0301) と重アクセント (U+0300) を入力できるようにした。

slavonic.el は Emacs の Leim-Quail アプリケーションである。Emacs 標準でもロシア語用,ウクライナ語用などのメソッドが用意されているけれども,これは自作の Emacs Lisp プログラムである。趣味というか,スラヴ研究を曲がりなりにもやった者として,標準品に対する己れの不満を解消したかったのである。その特長として,ロシア語,ウクライナ語,マケドニア語はもちろん,教会スラヴ語,古スラヴ語,旧ロシア語正書法文字など,Unicode Cyrillic で定義されている文字すべてを,これひとつで入力できる。 キリル文字のレイアウトは私の好みである яверты (フォネティック) 配列であり,ロシア語キーボード йцукен 配列に慣れた方はとまどうかも知れない。

最近の Emacs は,文字合成機能をサポートし,「親文字+アクセント」の入力で文字を合成して表示できるので,ロシア語などの教科書・辞書にあるような力点付きの文書入力ができるのである。下図のような感じ。教会スラヴ語・古スラヴ語文字が豆腐になっているのは Monaco フォントの問題である。Optima ないしは DejaVu フォントを選択すればきちんと表示される。

slavonic-input.jpg

slavonic-oldchar.jpg

slavonic-greek-im-0902.tar.gz としてリリースした。関心のある方は,ダウンロードサービスから落としてご利用ください。このアーカイブには古典ギリシア語用のインプットメソッドも同梱している。インストール方法はこちらを参照。Emacs 20 以降で使用できる。Mac OS X ネイティブ Emacs.app (Emacs-23) でも動作する。

英辞郎第四版を Emacs で使う

|

今日,会社の帰り,虎ノ門の書店で『英辞郎第四版』(アルク) を購入した。英辞郎は,EDP というプロジェクトによって育てられた英和・和英電子辞書である。書籍の帯には「166万項目を収録!」とある。大手出版社が学者チームを組織し学問的編集方針に則って作り上げる通常の辞書に比べると,英辞郎はインターネットにおいて草の根的に成長した電子辞書であり,怪しい語釈・訳語も散見されるという。それでも,様々な分野のプロに支持され,活用され,鍛えられ,成長し続けているツールである。『英辞郎第四版』はその活用本であるが,当然ながら,英和・和英辞書と Windows / Mac OS X 用検索アプリケーションを収録した CD を添付している。

私の文房具である多言語エディタ GNU Emacs 22 で英辞郎英和・和英辞書を使えるようにした。『英辞郎第四版』は Windows と Mac での辞書検索ブラウザの活用方法を紹介している。UNIX 環境でも,フリーソフト sdic, sufary を利用すれば,設置に手間暇を要するという欠点があるにせよ,Emacs で文書を閲覧・作成しながら一発操作で英辞郎を参照できるようになる。つまり同一環境内ですぐに辞書にアクセスできるわけで,その意味で辞書検索ブラウザの操作よりも便利なところがある。

備忘録として,FreeBSD,Mac OS X の UNIX X11 Emacs 環境に英辞郎辞書をセットアップするレシピを,以下に整理しておく。UNIX — 商用アプリケーションの世界から冷遇されている — のユーザが,英辞郎を我がものにするために行う作業は,まず Windows に英辞郎 Ver.4 を構築することである...。それは,本書 CD にはテキスト形式の辞書データが添付されておらず,付属プログラムの辞書変換機能で抽出せざるをえないからである。ここでのインストール処方では wget (ダウンローダ),nkf (ネットワーク漢字フィルタ) と ruby 言語が必要なので,予め組込んでおくこと。

  1. Windows 環境を起動し,書籍添付 CD からインストールを行う。完了したら,CD を抜く前に一度,辞書検索ブラウザ・プログラム PDIC Unicode for EIJIRO IV (以下,検索ブラウザ) を起動する。これを行わないと利用できないようになっている (CD のコピーでは使わせない工夫かも知れない)。
  2. 辞書データを,次の操作によって PDIC テキスト形式で抽出する。検索ブラウザ「FILE」--「辞書設定 (詳細)」から,辞書の一覧を表示させる。Eijiro112.dic を選択し,右クリックから「辞書の変換」を選ぶ。変換先テキストファイル名 (例えば Eijiro112.txt) を指定し,変換先ファイル形式を「PDIC1行テキスト形式」に設定して「OK」を押下すると辞書変換が行われる。これを,他の辞書についても繰り返す。こうして,Eijiro112.txt, Waeijiro112.txt, Ryaku112.txt, Reiji112.txt の 4 つの PDIC テキスト形式辞書が生成されたものとする。
  3. PDIC テキスト形式辞書を,UNIX 環境から参照できるところに格納する。ファイル共有の仕方はいくつもあるので,ユーザの都合に合わせてこれを実施する。Windows と FreeBSD をデュアルブートで使用しているなら,FreeBSD から Windows 領域を msdosfs マウントするのがもっとも手短な方法だろう。ここでは,NFS 共有ディレクトリ /shared/eijirou 下に PDIC テキスト形式辞書を格納したものとする (私がそうしているからに過ぎない)。
  4. UNIX 環境に sdic をインストールする。sdic は Emacs で辞書を閲覧するためのフリーウェアである。以降の操作はターゲットである UNIX 環境において行うものである。sdic については作者・土屋雅稔氏のページ「English Japanese dictionary for mule/emacs」を参照。
  5. % cd ~/tmp
    % wget -nH -nd http://namazu.org/~tsuchiya/sdic/sdic-2.1.3.tar.gz
    % tar zxvf sdic-2.1.3.tar.gz
    % cd sdic-2.1.3
    % ./configure
    % make
    % sudo make install
    

  6. PDIC 形式を SDIC 形式に変換する。このため,eiei さんがそのブログ記事「[emacs][英辞郎]英辞郎第四版買ってみた。emacsで使いたい。 sdic編」で掲載している ruby プログラムを,ここで拝借する。このページにあるスクリプトをコピーして,pdic2sdic.rb というファイル名で保存する。そして以下のオペレーションで辞書を変換する。sdic の辞書は /usr/local/share/dict 下に格納するものとしている。
  7. % su -m
    # cat /shared/eijirou/Eijiro112.txt /shared/eijirou/Ryaku112.txt |\
     nkf -w8 | ruby pdic2sdic.rb > /usr/local/share/dict/eijirou.sdic
    # nkf -w8 /shared/eijirou/Waeijiro112.txt |\
     ruby pdic2sdic.rb > /usr/local/share/dict/waeijirou.sdic
    # exit
    

  8. 英辞郎は英和辞書テキストだけも 180 万行あり,sdic を裸の状態で利用すると — 辞書先頭から grep で検索するためか — ファイル後方に位置する単語エントリの探索において長い旅に出てしまい,とても快適に使える代物ではない。sdic は,かかる事態を想定し,インデックスによって検索を高速化する外部プログラムインタフェースを備えている。次にその外部プログラムである sufary をインストールする。sufary は作者・山下達雄氏の Web ページによれば Ver. 2.3.8 が最新である。しかし,sdic と連携して利用する場合,現時点では 2.1.1 を使うのがよい。sdic が期待する sufary プログラム名称・仕様が新しい版では変更されてしまったからである。sufary 2.1.1 インストールは以下のとおり。
  9. % cd ~/tmp
    % wget -nH -nd http://nais.to/~yto/tools/sufary/src/sufary-2.1.1.tar.gz
    % tar zxvf sufary-2.1.1.tar.gz
    % cd sufary-2.1.1
    % make
    % sudo cp -p array/array /usr/local/bin
    % sudo cp -p mkary/mkary /usr/local/bin
    % rehash
    

  10. sdic 辞書のインデックスを,mkary コマンドで作成する。ソート処理で結構な時間と CPU コストを要する。また,インデックスファイルはもとの辞書の 3 倍もの容量を消費するので,ディスクの空き容量をチェックしておく。次のオペレーションの結果,eijirou.sdic.ary, waeijirou.sdic.ary の 2 つのインデックスが生成されるはずである。
  11. % su -m
    # cd /usr/local/share/dict
    # mkary eijirou.sdic
    # mkary waeijirou.sdic
    # exit
    

  12. sdic を使うため,Emacs 初期設定ファイル .emacs に対し以下のような Elisp コードを追加する。(strategy array) という指定が sufary インデックスを参照するために必要である。追加した Elisp を評価させるか,Emacs を再起動すれば sdic が使用可能となる。
  13. ;; sdic 英辞郎 英和・和英辞書
    (autoload 'sdic-describe-word "sdic" "sdic 英和・和英辞書検索" t nil)
    ;; カーソル位置の語を検索するキー設定
    (global-set-key "\C-cw" 'sdic-describe-word)
    ;; 英和辞書
    (setq sdic-eiwa-dictionary-list
              '((sdicf-client "/usr/local/share/dict/eijirou.sdic" 
    						  (strategy array))))
    ;; 和英辞書
    (setq sdic-waei-dictionary-list
              '((sdicf-client "/usr/local/share/dict/waeijirou.sdic"
    						  (strategy array))))
    (setq sdic-default-coding-system 'utf-8-unix)
    

  14. Mac OS X ネイティブ Emacs (Emacs.app) の場合は,sufary -- array コマンドが格納されているディレクトリパスを Emacs から参照できるように,以下のような記述を .emacs に追加しておく必要がある。X11 Emacs の場合は,起動シェルのパス環境変数に設定されているはずなので,これは不要である。
  15. ;; コマンドパスの追加
    (setq exec-path (cons "/usr/local/bin" exec-path))
    (setenv "PATH"
    		(concat '"/usr/local/bin:" (getenv "PATH")))
    

以上で設定は完了である。Emacs のバッファ・テキストにおいて,意味を調べたい語 (英語,日本語) にカーソルを位置づけて,C-c w とタイプするとミニバッファに "Input word : [カーソル位置の単語]" と表示され,ここで Enter キーを押すと,下図のような辞書検索結果が表示される。

sdic-cap.jpg

「Input word : 」に対する sdic の検索指定は以下のとおり。指定によりいくつかのトランケーションが可能になっている。完全一致以外の検索 (とくに全文検索) は時間がかかる。ここでは,検索したい語を word と表記している。

  • 'word' (シングルクォートで囲む):word に完全一致する単語を検索
  • word* (末尾に * ):word に前方一致する単語を検索 ex: word-blind
  • *word (先頭に * ):word に後方一致する単語を検索 ex: bear a sword
  • /word (先頭に / ):word 全文検索 ex: fixed-word-length computer
  • これで Emacs 作業の強力なツールが追加できた。ロシア語辞書もあるとうれしいのだけど。私は英辞郎辞書を NFS 共有ディレクトリに格納し,これを FreeBSD, Mac OS X それぞれの /usr/local/share/dict からシンボリックリンクして,共用している。

    以上,UNIX Emacs 環境で英辞郎を利用する方法をしるした。sdic の詳細マニュアルは Emacs info や,作者・土屋雅稔氏のサイトで参照できる。一方,Windows で動作する Emacs である Meadow でも sdic を使うことができる。sufary による高速化についても,Cygwin 環境でこれをインストールすれば可能であると sdic リファレンスには書かれている。

    Moon Calendar

    Profile

    ISAO YASUDA。システムエンジニア。神奈川県在住。昭和 30 年代を懐かしむオヤジ。ロシアに興味があります。
    [more], [About our site]

    Notice

    この文書はフィクションであり,実在する個人,団体等とは一切関係ありません。

    R-18 指定サイトです。そのうち「18 歳以上ですか」の認証を入れる予定です。

    文書の記述内容は無保証です。不適切な表現があればコメントにてご指摘ください。

    コメント,トラックバックは,現在,運用を停止しています。ご意見等ありましたら isao@yasuda.homeip.net 宛電子メールにてお願いします。

    Links

    About this archive

    All Entries of Category Emacs

    Next: FreeBSD

    Recent Entries in Main Index.
    All Entries in Archive Index.

    February 2012

    Sun Mon Tue Wed Thu Fri Sat
          1 2 3 4
    5 6 7 8 9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29      
    Powered by Movable Type 4.1 blog counter