ロシア・スラヴの最近のブログ記事

Facebook のスミルノフのページを訪れ,彼の『ヴァイオリン,チェロとピアノのためのトリオ作品 23・第一楽章』(1977)の YouTube 動画を発見。この作品は,彼の師であるエディソン・デニソフに捧げられている。ソヴィエト時代の作品としては自殺行為ともいえる前衛的な無調音楽である。集中力,密度の高い寡黙な音響というスミルノフ音楽の特徴が,この曲にもよく現われている。歌い出しにちょっとシュニトケ風を感じる人も多いと思う。

前衛的とはいえ,実験的ではない。西欧音楽とは一線を画した衷心さがある。弦のハーモニクスとピアノのモノローグ,悲痛な情感。なにか悲劇的な予感の高まり。ヒステリックなところのない,静謐なアンサンブルが美しい。

Posted by NewMusicXX.

この演奏は CD で入手可能である。ベルギーのレーベル MEGADISC からリリースされた "An Introduction to DMITRI SMIRNOV"(型番 Megadisc MDC 7818)。演奏は Patricia Kopatchinskaya (Vln), Alexander Ivashkin (Vlc), Ivan Sokolov (Pf)。ピアノ・トリオ以外にもヴァイオリン・ソナタほかスミルノフの室内楽が収められている。

smirnov-introduction.jpg

Usconcord ロシア語テクスト・コンコーダンス・パッケージの説明ページを改訂した。これまでは,単語条件式の説明が少し不親切だった。例を入れて詳しくしたのである。

Usconcord は主にロシア語テクストの KWIC(keyword in context)を自動生成するための Web サーバ・ツール・キットである。解析したいコーパス(文学テクストの電子ファイル)をサーバにアップロードし,単語条件式を入力し,解析を指示すると,条件に適合する単語のコーパスにおける出現度数・前後コンテキストからなる KWIC を表示する。コンコーダンス・サイトを運用したいひとはダウンロードサービスから usconcord-1.6.tar.gz アーカイブを取得してインストールできる。コンコーダンス解析オペレーションは Windows で稼働するブラウザから可能であるが,Usconcord サーバ運用は UNIX 環境(FreeBSD,Linux 等のオペレーティングシステムとその周辺ソフトウェア)が必要である(FreeBSD で開発したが,Linux gcc 4 でもコンパイルが通るようにしてある)。Windows ではサーバ・ソフトウェアが動作しない。

もっぱらスラヴ研究者向けに 2001 年にこのプログラムを書いた。とはいえ,対象テクスト処理の内部エンコーディング前提を X11 CTEXT(X Window System Compound Text)多言語形式としている関係で,X11 CTEXT,UTF-8 でコード化されたファイルであれば,フランス語,ドイツ語,スペイン語,ポーランド語,スウェーデン語などなど,だいたいの西欧・東欧・北欧語も処理可能である。正確には国際標準文字集合 ISO 8859-1, ISO 8859-2, ISO 8859-5 で記述できる言語を取り扱うことができる。日本文の解析は未対応である(日本語形態素解析ツール「茶筌」などを用いて予め分かち書きした日本語テクストであれば,処理できないことはない)。

コンコーダンスはある作家,作品群においてことばの用例,単語,フレーズの使われ方を総覧するのに絶大な威力を発揮する。昔からシェークスピア,聖書のコンコーダンスが出版されており,近年,ロシア文学研究文献についてもプーシキン『大尉の娘』,ドストエフスキイ『罪と罰』等のインデックスが刊行されている。しかしながら,手作業で KWIC インデックスを作るのは膨大な労力が必要であり,そのような古典,大作家以外のコンコーダンスはまず入手不可能である。自分の研究する文学作品のコンコーダンス生成,しかも論理条件指定に基づく必要語彙に特化した KWIC 生成を,個人で手軽に実行できる,というのが Usconcord の目的である。

私もプーシキン『エヴゲーニイ・オネーギン』論を書いたとき,Usconcord の元になったツール(弊サイト「プーシキン作品コンコーダンス・サービス」)を用いて,単語の用例・頻度調査を行い,悩ましい論証でブレークスルーを得た。ことばは複数の語義を有することが多いが,作家の用例をつぶさに見ると,単語を使う傾向がわかり,テクスト解釈が争われる論点においてその語義を特定するための根拠にできることがある。私の場合,語の色彩的印影の特定のため共起分析の際に,コンコーダンスを活用した。

文学研究者には Usconcord をぜひ活用いただきたいと願っている。Usconcord はユーザーが自分の Web サーバにインストールして運用するキットである。でもそんな面倒を抜きにして使いたい方は,弊サイトの「ロシア語電子コンコーダンス・サービス」を利用することができる。

今日,娘と高校の学校説明会に行って来た。JR 南武線・宿河原駅近くの高校である。川崎市の県立高校のなかでも古い名門であり,広い敷地に校舎がすべて二階層以下という贅沢な環境。裏手には多摩川の河川敷。大きな銀杏並木の接する広いグラウンドではサッカー部員が練習していた。旧き良き高等学校。校舎は老朽化が進み,校内の大きな庭は荒れ(整備の予算が付かないのだろう),寂れた印象が強かった。

学校の歴史・校風,進学実績,考査方法の方針などの先生の話は,私には「ふぅん」で終わった。それよりもなによりも,吹奏楽部が素晴らしい演奏を披露してくれた。司会の放送部女生徒の話す日本語が,明らかに放送向け発音訓練によって鍛え抜かれていて,端正この上なかった。びっくりした。おお,昔の NHK 女性アナウンサーはこんなしゃべり方をしたぞ。高校のクラブ活動では基本が徹底されていて,もはや大人にも侮れない。説明会のあと校内を少しぶらついた。女生徒のトランペット練習の音にいい知れぬ郷愁を覚えた。先生の話はそっちのけで,こういうことばかりに感心して帰って来た。

091024setumeikai.jpg

* * *

ロシアのヴラジヴォストークで,日本製中古車販売に高関税を課しいずれこれを禁止するというロシア政府の政策に対し,中古車販売業者を中心とした反政府デモがあった。今日テレビのニュースで,その様子を見た。ケンカの強そうないかにものロシア人が「プーチンに死を」なんて過激なシュプレヒコールをしていた。

ロシアのこの政策は,日本車によって国内の自動車産業がホネヌキになっていることを受けており,国内産業保護の観点に立った,いわゆる保護貿易主義の現われである。日本政府がこのロシアの政策に今後どう対応するか注目される。とはいえ,昨年来の金融不況のおかげで,最近,世界的に保護貿易主義的話題が目立つ。ロシアに限らないのである。つい先日も,米国が中国製タイヤへの 35% の高い追加関税措置に踏み切り,中国から保護主義だと批判されている。これは,かつての日本バッシングを今度は中国製品に対して大々的にやりはじめたという徴候だと思う。米中は今後厳しく対立するように思われる。日本と違い中国は「ハイそうですか」と唯々諾々と米国に頭を垂れる国ではない。保護主義は相手国から対抗策をお見舞いされる。その連鎖が起きると両国の関係が見る見る悪化する。ミサイルを配備したというような安全保障危機意識よりも,産業,ひいては生活に直結するだけに,ある意味で対外的国民感情を左右しやすい。

また同じニュース番組によれば,鳩山首相が ASEAN 首脳会議で「東アジア共同体構想」を各国首脳に呼びかけたという。これは地域経済ブロック圏の確立への提案と考えられる。欧米の保護主義に対抗するための,中国と日本を中心とした経済ブロック圏構想。岡田外相が米国を参加させない,と言っているのが印象的である。

経済不況,保護貿易,ブロック経済圏と来ると,第二次世界大戦前夜の帝国主義諸国による覇権争いに酷似して来たと思わないではいられない。こんな提案が日本から出るのは,自民党政権による長い対米従属政策に慣らされた者には信じられない。普天間の問題よりも私はこちらのほうが心配である。もしかすると,上海条約機構のような軍事同盟にも,そのうち日本が絡んで来るのではと思ってしまう。冷戦構造を前提とした日米同盟がいま揺らぎかけているのではないかという見方と相まって,日本が日英同盟を解消した結果 --- 老獪な英国に見放されて --- 外交力を喪失し国際的に孤立して行った歴史的前夜を私は連想してしまう。民主党政権の外交力の真価がいま問われている。舵取りを誤らないようお願いしたいものである。

うちの中学三年になる娘は『ポップティーン』などのギャル雑誌が大好きである。「ギャル」というのは「流行には敏感な(ちょっとおつむの弱い)娘さん」のことではなく,最近ではもう少し限定的に用いるようである。つまり,髪を「盛」ったように飾りつけ,ツケマ(付睫毛)をしたちょっとケバイ女の子のことである。「くみっきぃ,ちょー盛れてる」と浜崎あゆみ風の鼻にかかったしわがれ甘え声で言う。オヤジ・私は呆れるばかりである。私の趣味に合わないから。でも,まあ許せる。私の趣味に合わないだけだから。そういうスタイルがあってもよい。

娘の話では,先日『めざましテレビ』で外国人ギャルが採り上げられ,そのなかでフランス人ギャルがとくに多かったらしい。アニメ・マンガの受容もフランスが過激でもあり,日本のギャル文化に捕まるのもフランス人が多いということか。フランス人は個人主義が徹底していて,好きになったものはそれを誰がなんと言おうと貫いて憚らない潔さがある(そういう意味で,「皆がやってるから」式日本的女子高校生の集団的軽薄さとは相容れない喜悲劇を,私はこれらミニョン・ギャルたちの行く末に想像してしまう)。

娘の学校のとある友人宅は外国人留学生のホームステイを受入れている。いまポルトガルから来た女子高校生が滞在しているというので,娘たちは好奇心で会いに行ったらしい。なんとその子も他ならぬ「ギャル」であって,日本の「ジョシコーセー」スタイルを謳歌していたらしい。自己紹介を頼んだところ ---「え? 自己紹介? えー,なーんかちょー恥ずぃんだけど!」とそのアンジェラちゃんだか,ガブリエラちゃんは,日本人の女子高校生とまったく変わりない抑揚,発音でもって流暢なタメ口をききまくって,恥ずかしがったそうである。

このようにいまや日本は海外の若者(極々一部ではあろうけれども)にとって神秘的でも何でもなく,心から共感できるスタイルを持つ国になったようである。私などからすれば,このポルトガルの娘さんももう少し「まともな日本語」を覚えて帰国してほしいと願わない訳ではない。だけど,娘の伝える「ちょー流暢な」日本語だって「パロール」に他ならず,別に「正しい,礼節ある」日本語でなくても日本のナマの姿を彼女は歓喜をもって吸収しているようである。そう思うと,微笑ましい。少なくとも,武士道,禅,生花,能,などの,日本人の一般的生活からかけ離れた「高尚な」芸術・哲学のみに関心を向ける海外のエキゾチスム愛好文化人の話題なんかよりも,よっぽど日本が海外に受入れられていることを実感するのである。

それにしても,「難しい」とされる日本語の習得において,こういう十代の若者たちがアニメやギャル文化を通して日本人と変わりない言語マナーを早々に身につける姿を知ると,外国語の習得にはその国の生活・文化スタイルとそれに付随するオーラルな言語所作への共感がなにものにも優るということが改めてわかる。「秋葉いつき」なるペンネームをもつロシア人アキバおたく・ジェーニャ嬢(いつきたん〔註:「いつ来たん?」ではない。言うまでもなく「いつきさん」のオタ訛り〕)も,日本アニメの声優に憧れて来日し,瞬く間に日本語を我が物とした。おそらく彼女は日本語の文字,ことばの意味などよりも先に,愛するアニメ・キャラクタの声の所作を寸分違わずコピーしようとしたに違いない。

Facebook にあるドミトリ・スミルノフの頁を訪れて,誕生日メッセージのお礼をした。そこで,彼の夫人にして高名な作曲家エレーナ・フィルソヴァが,これまた現代ロシア音楽を代表する作曲家ソフィヤ・グバイドゥーリナのもとを訪れた際のフォトがアップされていた。こういうのを閲覧できるのが SNS のありがたいところ。日本では SNS のなかでは Mixi が圧倒的支持を得ているけれども,Facebook は,ワールドワイドの強みか,リゲティなどの作曲家や演奏家の頁,譜面が閲覧できる現代音楽コミュニティもあり,現代音楽好きには重要な情報源となる。請け合ってよい。

グバイドゥーリナの音楽は現代音楽とはいえ古典的な調性感があり楽器法も色彩豊かである。彼女はタタールの血を引くロシア人であるが,その音楽は現代ロシア音楽に特徴的な諧謔的ニュアンスが少なく,物語性を感じさせるダイナミズムがあり,現代音楽のキコキコ,スカスカ調が好きになれないひとでも楽しめるのではないだろうか。以下に彼女のヴィオラ協奏曲(1996 年)のレコードを挙げておく。ユーリイ・バシュメットによる名演である。ヴィオラの瞑想的なモノローグと狂のダンスとが印象的な曲である。
 

Kancheli: Styx; Gubaidulina: Viola Concerto
Yu. Bashmet (Vla), V. Gergiev (Dir),
Orchestra of the Mariinsky Theatre,
St. Petersburg Chamber Choir.
Deutsche Grammophon (2002-05-14)

ミッシャ・マイスキイの演奏によるバッハの無伴奏チェロ組曲を本当に久しぶりに聴いた。私は第二番と第五番が好きである。この曲の演奏はいくつも名演がある。私はムスチスラフ・ロストロポーヴィチ,ピエール・フルニエ,ミッシャ・マイスキイの盤がお気に入りである。なかでもマイスキイ盤には,ある特別な思い出がまつわりついている。

1985 年の春先,ソ連の最高権力者・共産党書記長コンスタンチン・チェルネンコが亡くなった。テレビを持たず新聞も購読できない貧乏学生であった私は,そのニュースを知らずにいた。札幌のまだ凍てつく下宿で,ロシアの文芸学者・文学史家ボリス・トマシェフスキイの詩論集 «О стихе»(『詩について』)を読んでいた。コーヒーをドリップする間に,NHK-FM を付けた。バッハの無伴奏チェロ組曲が流れていた。私は直感でミッシャ・マイスキイの出たばかりの盤だとわかった。一曲が終わったら,別の組曲が開始された。なにかおかしい。DJ なりアナウンサーなりの語りがなく,曲の演奏だけが延々と続く。なんの説明もない。すぐに,私は誰か貴人が亡くなったのだと悟った。ソ連では権力者が亡くなるとクラシック音楽をひたすらラジオで流すという話を思い出したのだ。そうか,書記長が死んだのだ。え,なんで? 就任してまだ少しじゃないか,本当か? でも,それは正しい判断だった。しばらくしてニュースがはじまり,チェルネンコ死去が報じられたのである。

異常な気分になり,トマシェフスキイどころではなくなったのを鮮明に覚えている。いま思うと,NHK はそういう放送局だったのだとへんな感銘を覚える。国際的最重要人物が亡くなろうと,このような放送は現在ではしないと思う。NHK にロシアの伝統を知る者がいたのだろう。それに合わせて哀悼の意を表したのだろう。「不可解」が国際情勢の緊張感を異様に高めるということが身に沁みた。「臨時ニュースを申し上げます」なんかより,観念させるようななにかがあった。

ソ連共産党書記長の死を告げるマイスキイのバッハ。もうひとつ強烈なのは,ミッシャ・マイスキイがソ連官憲によって投獄された経験を持つユダヤ系亡命ロシア人であったこと。そんなマイスキイの演奏でソ連の権力者の死を哀悼するなんて,NHK は端倪すべからざる意図を秘めた放送局だと思ったものである。そして,こういう歴史的事件の黎明の伴奏にはやはりバッハが相応しいと。チェルネンコを襲ったゴルバチョフはやがてソ連を解体させてしまい,冷戦は終局を迎えることになったのである。
 

バッハ:無伴奏チェロ組曲 全曲
マイスキー(ミッシャ)
ポリドール (1994-08-01)

井上陽水は私の好きなアーティストのひとり。1972 年にデビューし,1973 年『氷の世界』がヒットして有名になった。小学校 6 年のころ「心もよう」を耳にして,その歌詞にあるように「青い便箋」のようなうら悲しい歌に惹かれた。

学生運動の熱気が去って孤独に打ち拉がれた若者が世界に悪意を抱きつつ自分の弱さに苛立つ時代だったと思う。弱さは安易な集団的暴力と結びつくことがある。その当時,浅間山荘事件,三菱重工爆破事件など不穏なテロが頻発していたのである。陽水はそんな 1970 年代の荒んだ世代の敗北者精神を代表していたと私は勝手に思っている。

テレビでは我が国の将来の問題を
誰かが深刻な顔をしてしゃべっている
だけども問題は今日の雨 傘がない
井上陽水「傘がない」

1981 年,大学に入ったころ,「ジェラシー」がヒットした。「ワンピースを重ね着する君の心は ...」というような歌詞が,陽水らしいあの暗いわからなさを引き継いでいた。この曲を聞くと,国文学科に行った友人 M を思い出す。いつも坊主頭にしていて,ちょっと偏執狂的なところがあった。深夜に私の下宿をぶらっと訪ねて来ては「藤村の詩を読むと泣いてしまうんや」と金沢訛りで独言しながら,大真面目な顔で畳に座っていたものである。私の聞いたこともない 19 世紀ドイツ作家作品の,M による翻訳をよく読ませられた。そのころの私はビーダーマイヤー時代のドイツ小説は日本の私小説と同様つまらないものと誤解していたのだ。かと思うと彼は「裸の女二人が温泉に入るテレビ番組,あれ好きなんや」という一面も持ち合わせていた。私はこの深夜番組を見せてもらいに,よく同じ下宿の友人部屋に行った。私も大好きだったのだ。M はこういうところでへんに気が合う友であった。ドイツ人のように冗談を解さずまったく笑わない彼は,よく衿付シャツを重ね着していたのだ。彼は「不思議な世界を彷徨い歩いていた」のだと私はいまでも思う。

後輩の T は,露文研究室で学生同士話をしていると,ふといきなりギターを手に取って --- そのころは誰のものか知れないギターがどの研究室にも転がっていたのである ---「甘いくちづけ ... 遠い思い出 ...」とろうろうと歌い出すことがよくあった。ドストエフスキイに身も心も捧げた T の歌う陽水には凄みがあった。こいつ女にもてたのだ。いい男だった。そのころはギターで井上陽水や河島英五の弾き語りをする者が多かったのである。もうひとつ。農作業の手伝いをしたりその家の子供たちと遊んだりして,1週間ほど十勝で過ごしたことがある。そのとき一緒に行った同級生(三浪で大学に入った,風来坊のような男だった)は,宿泊施設(町の公会所みたいな掘建て小屋であった)で農家の子供たちとゲームをしたあとで,ギター片手に「心もよう」を歌って子供たちを神妙にさせた。

学生時代の思い出のなかでは,このように陽水の曲が流れていることが少なくない。井上陽水について語ることは感情のお里が丸出しになるような恥ずかしさがある。しかし,陽水的 70 年代の残骸のような者たちが暗い生き方をする(「ネクラ」と言われた)一方で,1980 年代は脇目も振らずバカ明るくてお金をもっている者たち(「ネアカ」と言われた)が我が物顔になった時代である。高校野球のような,皆が一律坊主にしてひとつの目標に向かって努力する集団的営みが鼻で嗤われる時代になったのである。努力,真面目はダサイものとなった。貧乏は恥となった。この「ネアカ」たちに圧倒的に支持されたのがサザンオールスターズである。ご存知のとおり,サザンはいまだにヒットを飛ばし,要するに JPOP の「勝ち組」であり,つまりは 1980 年代以降の日本人の趣味をある意味で決定づけたともいえる。

私はいまだにサザンより陽水を高く買っている(私は桑田佳祐も好きなんだけど)。あのサザンの時代・80 年代にこそいまこの現代の病巣があるとさえ思っている。ゆえに,私はいわゆる「負け組」である。
 

GOLDEN BEST
井上陽水
フォーライフ ミュージックエンタテイメント (1999-07-28)

仰天過去」といえば,かつて「疑惑の総合商社」と国会で非難され,斡旋収賄罪・政治資金規正法違反罪で公判中の鈴木宗男議員が,18 日の衆院本会議において外務委員長に就任した。私はこのニュースに本当にびっくりした。いま日本の政治が本当に面白くなって来たのだと痛感した。この人事は「自公など、『鈴木外務委員長』に異議=衆院本会議、開会遅れ」にあるように,批判を浴びている。リンクしたニュースに付加されているコメントをみると,「自公など」の「面白くない」政治をしてくれた方々と同様,「疑惑」を「事実」であるかのごとく鵜呑みにするおめでたい人達がほとんどのようである。

しかし,民主党がまっとうに主張するように,鈴木議員はまだ公判中であり,有罪が確定し公民権が停止した訳ではなく,なにより「選挙」という政治家にとって最大の審判を経て国会議員の立場にあるのだから,まったく問題がない。鈴木議員は,その「疑惑」がいかなるものであれ,北海道民の「圧倒的支持」を得ている。これはじつに大事なファクターであって,政治家として影響力・実力のある証左なのである。(Yahoo! のXXなコメント書き込みの夥しさと有権者の確かな選択との間にあるギャップで私が痛感したのは,ネットの偏向というものである。これを根拠に,ネットの書き込みは何者かによる情報操作の可能性も否定できないということである。)

昨年 6 月,アイヌの先住民族決議案が国会で採択されたことも,この政治家のしたたかな活動成果のひとつである。もちろんアイヌ民族の人権擁護とセットで問題提起をしたことに第一義的な意味がある。しかし,もうひとつこの決議の重要な意義は,アイヌを北海道周辺の先住民族として日本国が認知することで,北方四島,樺太等の先住民としての権利をアイヌが本来的にもっていることを国際的に主張しやすくなったことにある。アイヌは日本国に属する民族である,よってアイヌの土地は日本に帰属するという「先住権」ともいえる主張である。もちろん,北方領土返還運動がこれだけで解決できるはずもない。しかし,ロシアという国は多民族国家の難しさを痛いほど知る国であり,「民族に固有の大地」という論理を --- アタマでではなく --- 身体的に理解しているので,「侵略行為」,「戦後処理」,「歴史認識」などというような高度に政治的な概念に基づく交渉よりも,遥かに真摯に耳を傾ける。こういう事情を知らない人のなかには,日本が実質的多民族国家だということを認めたがらず,鈴木宗男を国賊扱いする無邪気な者もいるようである。

鈴木宗男は,田中角栄のような古いタイプの「利益誘導型」政治家である。そのためか日本のマスコミからは,「ムネオハウス」の利権体質をあげつらわれ,ほとんど「犯罪者」扱いされている。けれども,彼が起訴され政治の第一線から退いて以降,日露関係が台無しになったのは海外の識者も認めるところである(「ニューズウィーク日本版」参照)。その後,日本はロシアと外交らしい外交がまるで出来ていないのである。北方領土返還の一歩手前と言われるまで交渉を進めロシア人から信頼された「疑惑まみれ」の鈴木宗男と,日露交渉においてまったくロシア人に信用されずなんの仕事もしなかった「クリーンなエリート」の川口順子(田中眞紀子と鈴木宗男が失脚したあと実質的に日露交渉を引き継いだ外務大臣)と,いったいどちらが優れた政治家であろうか。

鈴木宗男は鳩山総理から「北方領土をよろしく」と言われたそうである。民主党も彼の業績を評価している訳だ。日露交渉にまた鈴木宗男が戻って来る。官僚による各種会見自粛にみられるように,新政権はのっけから官僚から「ご指示のとおり言われたことしかやりません」モードの主体性放棄の遵法闘争に応接されているけれども,良きにつけ悪しきにつけ前代未聞のようなことが起こって,しばらくは政治ブームが続くのではないだろうか。

(それにしても,鈴木宗男はあの「アホの坂田」に似た風貌と収賄「疑惑」とで,我が家では嫌われている。これが世の一般家庭の反応かと思うと,ホント,彼が不憫である)

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. ドイツ語辞書使用時

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 文字合成機能(文字にアクセント記号を後置すると合成して表示する。タイ語などでは必須の機能)がやっとサポートされたことである。

北園克衛詩のロシア語訳について先日メールのやりとりをしたニューヨーク在住のロシア詩人から,今日,連絡があった。掲載される予定の文芸雑誌 «Новая Кожа, 2009 No. 2»(日本語にすれば『新たなる皮膚』というのか。ニューヨークで発行されている independent なロシア語系雑誌のようである。米国に移住しても母国言語で創作活動の場を興そうというロシア人たちがいるのだと感心してしまった)の,彼の北園翻訳頁を PDF 版で送ってくれたのである。

冒頭に北園克衛のごくごく簡単な紹介文があった。伊勢で生まれたこと,エズラ・パウンドと文通をしていたこと,アヴァンギャルド雑誌 VOU 編集に携わったことが触れられていた。「モダニズムの古典的詩人」と評されていた。

訳は私がはじめに読んだものから少し変更が加えられていた。うれしいことに,頁の最後に私への謝辞が述べられていた。私の名が "литератураведа Исао Ясуду" と対格形でしるされ,しかも「文学研究者」なる肩書きが付されているのに,照れてしまった。Web サイトを公開していると時おりこういう貴重な経験ができる。

«Новая Кожа» の Web サイトはこちら。そのうち,Игорь Сатановский さんの北園詩翻訳がここにも掲載されるのではないかと思う。

kitasono_novaja_kozha_2009_.jpg

* * *

今週会社の夏期休暇を取った。それで昨日,妻と川崎駅周辺に買い物・食事に出た。Tower Records を何気なくぶらついていたら,前から欲しかった CD を 2 セット見つけ購入した。

ひとつはセルジウ・チェリビダッケがミュンヘン・フィルを指揮したブルックナー交響曲第 8 番ハ短調 1890 年ノヴァク版のライブ録音。私は彼の指揮によるブルックナーの CD を何枚も所有し愛聴している。EMI から 1998 年に出たシリーズが特に好みである。7 番と 9 番を発売当時すぐ手に入れたのだが,この 8 番は買いそびれてその後なかなか入手する機会がなかったのである。

ブルックナーのシンフォニーは一時期,ヘルベルト・フォン・カラヤン指揮ベルリン・フィルによるドイツ・グラモフォン盤をよく聴いていた。ところが学生時代 NHK-FM でチェリビダッケ,ミュンヘン・フィルのライブを聴きその集中力の高さと深い音場に心底感激して以来,チェリビダッケ録音ディスクを待望するようになった。彼は音楽の演奏を「一期一会」と見なしていたようである。録音を毛嫌いした。でも愛好家がそんな演奏を偲ぶ記録を手元に置きたい,というのも人情である。彼の死後,発売されたブルックナーの盤はその感動をもう一度再現してくれた。そのためか,私はもうカラヤン盤をまったく聴かないようになってしまった。

(カラヤンは 20 世紀の大指揮者である。けれども,私にとっては彼の録音は「どれもこれも」優れていて好みの演奏であるにせよ,そのうち個別曲の演奏において彼を圧倒的に凌駕する指揮者の盤が登場し,私にとって最高の盤といえるものがほとんどなくなってしまう,そういうタイプの名演奏家である。モーツァルト,ベートーヴェン,ブラームス,チャイコフスキイ,マーラー,ブルックナー,等々どれも一流であるが「私にとって最高」と言えるのものが残念ながらほとんどない。リヒテルと組んだチャイコフスキイのピアノ協奏曲くらいか。)

Bruckner 8
S. Celibidache(Dir), Münchner Philharmoniker
(Live recording: 12 & 13 Sept. 1993)
EMI Classics (1998-09-30)
 

もう一枚は巌本真理弦楽四重奏団による待望のシェーンベルク室内楽 CD 化である。私はこれまでずっとこの録音をアナログ LP で聴いて来た。Tower Records が企画し,復活させてくれたらしいのだ。1972 年の録音。

この盤ほど気合いの入ったシェーンベルクを私は聴いたことがない。少し解釈の重く生真面目すぎるきらいがあるが,長野羊奈子のソプラノの迫力は凄い。ジュリアード,ラサール,アルディッティよりも私はこの盤を上に置いているのである。このカルテットがシェーンベルクの全集を録音していてくれたらと残念である。

シェーンベルク:浄夜 & 弦楽四重奏曲第2番
巌本真理弦楽四重奏団,
江戸純子(Vla),藤田隆雄(Vlc),長野羊奈子(S)
TOWER RECORDS EMI CLASSIC (2009-03-04)

とあるロシア通の方と 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 のあとで処理されるため)ことに注意してほしい。

自作のコンコーダンス・ソフトウェアを Lemmatizer C++ クラスライブラリによって見出語でも解析できるようにしようとしている。Lemmatizer についてはふたつのバージョンについて,すでにここで書いた。AOT で公開されている版(「ロシア語形態素解析 lemmatizer」参照)と,lemmtizer.org で公開されている版(「Lemmatizer UTF-8 対応ライブラリ」参照)である。

AOT 版は解析できるロシア語テキストのエンコーディングが Windows CP1251 のみであるのに対し,lemmatizer.org 版はさらに UTF-8 をサポートしている。私は UTF-8 が扱えるということで後者を自作プログラムで使おうと検討していた。しかし,いまひとつ仕様のドキュメントがきちんとしていない。辞書のソースコードを丹念に読むと,なんとなくわかって来るけれども,どうしても不明点が残る。サイト管理者に問い合わせても,なしのつぶてである。その点,AOT 版はロシア語の文法構造について品詞,性・数・格,活動体・不活動体,時制などの解析結果出力仕様が明確である。

さらに AOT 版は,形態素解析ツール Lemmatizer のほか,統辞解析ツール Synan,語彙素抽出ツール Graphan(要するに Tokenizer)をも提供していて,私の知る限り,ロシア語自然言語解析のための最強のツールセットともいえるのである。私のコンコーダンス・ソフトの設計に関しても,UTF-8 でテキストを受入れて,見出語を Lemmatizer から取得するときに iconv ライブラリによって CP1251 にコード変換し,再び UTF-8 に戻せばよい,と考えるようになった。

これらについて調べるうち,じつはコンコーダンス生成ツール DDC(DWDS/Dialing Concordance)をも AOT が提供していることがわかった。ロシア語,英語,ドイツ語(ISO-8859-1)のコンコーダンス解析が可能である。そこで,これらすべてのツール(ここでは 「AOT ツール」と総称する)を FreeBSD にインストールして使ってみた。Linux ならおそらく苦もなく組込みができるのだろうが,BSD ユーザにとってはじつに面倒なので,私の失敗を踏まえたインストール・メモをしるしておく。コマンドラインは tcsh シェルである。

  1. AOT ツールのコンパイルには以下のソフトが必要である。バージョンが古かったり,インストールされていなければ追加導入しておく。最新の FreeBSD なら PCRE 以外ははじめから整備されているはずなので,ここでの説明は割愛する。PCRE については「ロシア語形態素解析 lemmatizer」を参照。( )内に私の試験環境をしるしておく。
  2. - gcc C/C++ コンパイラ 3.2 以上(4.2.1)
    - PCRE C/C++ 正規表現ライブラリ 6.4 以上(7.7 with UTF-8 options)
    - bison 構文解析器 1.875 以上(2.3)
    - flex 字句解析器 2.5.4 以上(2.5.4)
    - gmake GNU Make(3.81)

  3. 以下のアーカイブを AOT скачать 頁からダウンロードする。DDC についてのみ SorceForge から取得する。面倒だが,すべてダウンロードする。DDC を 1.74-1 と 1.80 の 2 版取得するのは,後者にはコンパイル用シェルスクリプトが添付されておらず,直近の古い版のそれを利用するためである(これについては,アーカイブになんの説明もなく,配布がちょっと杜撰ではないかと思う)。そして以下の順に同じディレクトリにおいて解凍する(いろいろややこしい)。ここではインストール・ディレクトリを /usr/local/lib/RML として説明する。
  4. - concord-1.74-1.tar.gz DDC-1.74-1
    - concord-1.80.tar.gz DDC-1.80
    - lemmatizer.tar.gz Lemmatizer
    - rus-src-morph.tar.gz 形態素解析辞書(露)
    - ger-src-morph.tar.gz 形態素解析辞書(独)
    - eng-src-morph.tar.gz 形態素解析辞書(英)
    - graphan.tar.gz Graphan
    - graphan_dicts.tar.gz 語彙素辞書
    - synan.tar.gz Synan
    - rus-syn-dicts.tar.gz 統辞解析用辞書(露)
    - ger-syn-dicts.tar.gz 統辞解析用辞書(独)

  5. 以下のように RML などの環境変数をセットする。これはインストールのみならず,実行時にも必要である。
  6. # setenv RML /usr/local/lib/RML
    # setenv RML_PCRE_LIB /usr/local/lib
    # setenv RML_PCRE_INCLUDE /usr/local/include
    

  7. DDC のアーカイブ concord-1.80 のディレクトリが $RML/ddc-1.8_kai として解凍されているはずである。この直下のファイルをすべて同じディレクトリ構成で $RML/Source の下に上書きコピーする。
  8. # cd $RML/ddc-1.8_kai
    # tar cf - . | ( cd ../Source; tar xvf - )
    

  9. 次にコンパイル用シェルスクリプトの修正を行う。FreeBSD では gmake は /usr/local/bin 下にあるが,AOT ツールのシェルスクリプトは /usr/bin/gmake を指しているので,これを訂正する。FreeBSD の gmake を /usr/bin/gmake にシンボリックリンクしてもよい。
  10. # cd $RML
    # mkdir shwork
    # foreach i (*.sh)
    foreach? cp $i shwork/$i.bak
    foreach? sed 's|/usr/bin/gmake|/usr/local/bin/gmake|' $i > shwork/$i
    foreach? mv $shwork/$i $i
    foreach? end
    #
    

  11. generete_syn_bin.sh 中の 26 行目 Language=`expr substr $i 1 3`Language=`expr $i : '\(...\)'` に書き換える。
  12. $RML/Source/ConcordDaemon/Main.cpp 及び $RML/Source/SynanDaemon/Main.cpp のファイル先頭に以下を追加する。あるいは,私の作ったパッチ bsdpatch$RML 直下に格納して patch -p1 < bsdpatch で適用してもよい。
  13. #include <sys/types.h>
    #include <sys/time.h>
    #include <sys/resource.h>
    #include <signal.h>
    

  14. いよいよ全 AOT ツールのコンパイル,辞書生成を行う。以下,順次添付シェルスクリプトを実行する。長い道のり...
  15. # cd $RML
    # ./compile_morph.sh
    # ./generate_morph_bin.sh Russian
    # ./generate_morph_bin.sh German
    # ./generate_morph_bin.sh English
    # ./gen_graphan_bin.sh Russian
    # ./gen_graphan_bin.sh German
    # ./compile_and_check_graphan.sh Russian
    # ./compile_and_check_graphan.sh German
    # ./compile_synan.sh
    # ./generate_syn_bin.sh Russian
    # ./generate_syn_bin.sh German
    # ./compile_concord.sh
    # ./check_concord.sh Russian
    # ./check_concord.sh German
    # ./check_concord.sh English
    

  16. 上記のそれぞれの実行後,エラーなくコンパイルが終了していることを確認する。synan(統辞解析ツール)のドイツ語チェック("./generate_syn_bin.sh German")でコンペア・エラーが出ても,$RML/test.tmp にドイツ語解析結果が出力されていれば問題ない。私の遭遇した問題からいえば,もしかすると,$RML/Source/SimpleGrammerLib 配下のモジュール・コンパイルで,s_qlex.cpp.tmp に文法不正があるとのエラーが発生するかも知れない。そのときは $RML/Source/SimpleGrammerLib/s_qlex.cpp.tmp をエディタで開いて,251--2 行目を確認し,以下のとおりに修正して,停止したシェルスクリプトから再実行してみてほしい。
  17. #include <FlexLexer.h>  // <-- 次行と繋がっている場合,改行を挿入する。
    int yyFlexLexer::yylex()
    

  18. ヘッダファイル,ライブラリをわかり易い場所にコピーしておく。AOT ツールのライブラリを使った自作プログラムをコンパイルするとき,-I/usr/local/include/RML-L/usr/local/lib/RML を指定すればよい。
  19. # cd $RML/Source
    # foreach i (*)
    foreach? mkdir -p /usr/local/include/RML/$i
    foreach? cp -p $i/*.h /usr/local/include/RML/$i
    foreach? end
    # find . -name "*.a" | xargs -J % cp % $RML
    

以上でインストールは完了である。ライブラリの利用,テストプログラムの実行が可能となる。日を改めて,Synan,DDC など,AOT ツールの簡単な使い方を紹介したいと思う。

妻が札幌から帰ってきた。北大構内,大通り公園,すすきの,下宿のあった北19条近辺など,学生時代の懐かしい場所を散歩してきたらしい。羨ましい。北大クラーク会館のすぐ裏手の,私が住んでいた北6条西8丁目付近は JR の高架化で様変わりしていたという。お土産は懐かしい六花亭のマルセイバターサンド。

今日の晩ご飯は私がビーフシチューを拵えた。肉が足りないので近所のマルエツにお買い物。肉売り場では「好き好きお肉! 好き好きお肉!」という歌が何度も何度も繰り返され,なかなかシチュー用のバラ肉を見つけられなかった私は,チョーイライラ。肉のついでに,安物 780 円のカリフォルニアワインもゲット。シチューは子供たちにも評判だった。

昼は,ロシア人からのメールへの返信文を書いた。北園克衛詩ロシア語訳の問題点をいくつか指摘して,LaTeX で作成した PDF を添付送信した。

* * *

Lemmatizer ライブラリを使った lemmatized コンコーダンスプログラムを設計中。私は O'Reilly から出た G. Satir, D. Brown による入門書で C++ をさらった程度で,この機会にもう少しきちんと勉強しなくちゃとさらに一冊 C++ 本を購入した。柏原正三『美しい C++ プログラミング見本帖』(翔泳社,2004年)。私は C++ のプログラムを何本も書いたけれど,「クラス・型の実装を強化した C」程度に C++ を扱っていた。オブジェクト指向云々も Java ほど気にする必要を感じなかった。それでも動く C++ プログラムが作れる訳である。

本書は C と C++ はまったく別のプログラミング言語であると強く主張する。 printf などの C の標準ライブラリ関数を使ってはいけない,プリプロセッサの #define による記号定数を使ってはいけない,などなど,私にとってびっくりするような指南がなされている。それが「美しい」ということか。でも,ちょっと納得のいかない点もある。

問題は,fprintf( ) 関数が C の入出力ストリームの関数であることです。C++ は C++ 独自の入出力システムとして入出力ストリームをサポートしていますが,それが C の入出力システムの関数と整合するという保証はありません。
柏原正三『美しい C++ プログラミング見本帖』翔泳社,2004年,p. 20.

「整合しない」例をどうして示してくれないの? このため,問題点の問題点たる所以がどこにあるのか,さっぱりわからないのである。C++ が C とは異なる言語だという考え方は正しい。でも,C++ の設計者は C++ を C のスーパーセットと位置付けているのではなかったか。やはり,ソフトウェアに関する日本人の著作は,米国人の足元にも及ばない,と思ってしまった。米国人なら「必ず」,きちんと具体例をあげ己れの命題の根拠を説明する。

まあ,それでも C に凝り固まった私にはこれくらい刺激的なことを言ってくれる本がよいのかも知れない。上記のような納得できない点もあるにせよ,C との違いを懇切に説明してくれる本である。

C++プログラミング入門
グレゴリー・サティア,ダウグ・ブラウン
オライリー・ジャパン

出版社に勤めている妻が珍しく出張。イベントを札幌でやるらしい。札幌は,私も妻も学生時代を過ごした土地。1日余計に遊んで来ることに。それで,私はやかましい子供たちと3人で日曜日まで過ごす訳である。

夜,店屋物の中華を3人で食いながら,テレ朝の「ミュージックステーション」を観る。私は JPOP にそれほど関心がない。Perfume が出て来て,子供たちは熱心に観ている。初音ミク以上にロボット風のボーカルが特徴の,テクノな,個性的な3人組の娘たち。よくこんな声が出せるものだと感心。「学校にアーチャンのファンがいるの,筋金はいってんの。なんでノッチじゃないのかな」と娘が言う。「アーチャン?」---「真ん中で歌ってるゴリラみたいな顔した子」---「ひでー,お父さんにはそうは見えんけど」。そのあと,これこそゴリラともいうべき,矢島美容室なる,とんねるずユニットが登場して来て,メシがまずくなった。

* * *

詩人・翻訳家だというロシア人からメールを受け取った。北園克衛の詩をロシア語に翻訳したのだが,原文と比べておかしな点がないか,意見がほしいとの相談だった。もっと適任者がいそうな気がするけれども,彼は,私の Web サイトで Кацуэ Китасоно の名前を見いだして,ロシア語と北園克衛との論理積条件に適合した唯一の人物として,私を買いかぶったようである。

『煙の直線』,『BLUE』からの数編のロシア語訳。日本の現代詩を楽しもうという外国人がいるとは想像もしていなかったが,興味深いことには違いない。John Solt 氏の手になる英語訳をベースに各国語に翻訳するプロジェクトが進行中らしい。ロシア語訳も重訳である。ざっと見たところ,少なくともとんちんかんな翻訳ではなかった。北園の前衛詩はリアルからの遁走であって,ある意味「誤訳」なんてありえない性質だともいえるから,私はじつはあんまりロシア語の問題についてぐだぐだ言うつもりはないし,その資格もない。そういうことで,思いついた点を書き送ってあげるだけにしようと思う。

ロシア語形態素解析器 Lemmatizer ライブラリ(Лемматизатор европейских языков)を利用した試験プログラムを書いてみた。Lemmatizer はロシア単語の文法構造と見出し語を解析する。このライブラリは C/C++ のアプリケーションから利用できる。UTF-8 テキストを解析できる点で,多国語混在テクスト中のロシア語解析にも応用可能である。このパッケージは先日紹介したものを少し拡張したもののようである。私は FreeBSD で試験したが,Linux,Mac OS X でも動くと思う。Lemmatizer の各ライブラリは静的ライブラリなので,アプリのプログラム・サイズが大きくなってしまうところが残念である。

【インストール】

インストールには CMake が必要である。FreeBSD なら "cd /usr/ports/devel/cmake && make install clean" で導入可能である。次に Lemmatizer の次の三つのライブラリ・アーカイブをダウンロードページから取得して展開する:libMAFSA-0.2.tar.gz, libturglem-0.2.tar.gz, turglem-russian-0.2.tar.gz。それぞれの展開ディレクトリ直下において,"cmake . ; make; sudo make install" を実行するだけの簡単なものである。turglem-russian-0.2 の make は辞書生成のため,かなりの時間と 100MB 以上のメモリを要するので注意。オペレーションは以下のとおり。

% cd libMAFSA-0.2
% cmake .
% make
% sudo make install
% cd ../libturglem-0.2
% cmake .
% make
% sudo make install
% cd ../turglem-russian-0.2
% cmake .
% make
% sudo make install

【試験プログラム】

Lemmatizer 利用アプリケーション・プログラムの流れは,tl::lemmatizer クラスを生成し,辞書・文法ルールをロードし,解析したい語に対して lemmatize<russian_utf8_adapter> を呼び出す。UTF-8 文字列もそのまま char* に入れればよい(UTF-16 にした wchar_t* などを期待しない)ので面倒がない。解析結果は tl::lem_result クラスに格納されるので,必要な情報をこのクラスから取り出して活用する。サンプルプログラムを参考に私が作成したテストプログラムを,以下に示す。テキストファイルを読込んで,単語を分割し,Lemmatizer に解析させる。単語リストの作成にはもう少しきちんとした(句読点を考慮した)tokenizer が必要だが,ここでは,指定文字で語分割するごく単純な自前の split 関数ですませている。

// -*- coding: utf-8; -*-
// lemtest.cpp: Lemmatizer test programm.
//                                    2009 (c) isao yasuda.
 
#include <turglem/lemmatizer.hpp>
#include <turglem/russian/charset_adapters.hpp>
#include <string>
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <stdio.h>
 
using namespace std;
 
// Lemmatizer
void lem_analyze(const tl::lemmatizer &lem, const char *s)
{
    tl::lem_result lr;  // instance for result of lemmatizer analyze.
    size_t sz_lem = lem.lemmatize<russian_utf8_adapter>(s, lr);
 
    if (sz_lem) {
        printf("(lemmatize results: %u)\n", sz_lem);
        for (size_t i = 0; i < sz_lem; i++) {
            printf("    ** %u: paradigm/form = %04d/%02d", i,
                    lem.get_paradigm(lr, i),
                    lem.get_src_form(lr, i)
                );
            string nform = lem.get_text<russian_utf8_adapter>(lr, i, 0);
            printf("\t\t\t\tNormal Form: '%s'\n", nform.c_str());
        }
    } else {
        cout << "Empty result! Check your text." << endl;
    }
}
 
// split 関数: 指定文字で文字列を分割
void split(const string &s, char c, vector<string> &v) {
    string::size_type i = 0;
    string::size_type j = s.find(c);
 
    while (j != string::npos) {
        v.push_back(s.substr(i, j-i));
        i = ++j; j = s.find(c, j);
        if (j == string::npos)
            v.push_back(s.substr(i, s.length()));
    }
}
 
// main
int main(int argc, char **argv)
{
    tl::lemmatizer lem;  // lemmatizer instance
    string buffer;
    ifstream in(argv[1]);
 
    if (!in) {
        cerr << "usage: " << argv[0] << " file-name" << endl;
        return 1;
    }
    // load dict, etc.
    try {
        lem.load_lemmatizer(
            "/usr/local/share/turglem/russian/dict_russian.auto",
            "/usr/local/share/turglem/russian/paradigms_russian.bin",
            "/usr/local/share/turglem/russian/prediction_russian.auto"
            );
    }
    catch (const exception &e) {
        cerr << "Error: " << e.what() << endl;
    }
 
    while (!in.eof()) {
        vector<string> v;
        getline(in, buffer, '\n');
        if (!buffer.c_str()) continue;
        split(buffer, ' ', v);
        cout << buffer << endl;
 
        for (int i = 0; i < v.size(); i++) {
            cout << "  " << i << " input word: " << v[i] << ' ';
            // lemmatizer analyze.
            try {
                if (v[i].c_str()) lem_analyze(lem, v[i].c_str());
            }
            catch (const exception &e) {
                cerr << "Error: " << e.what() << endl;
            }
        }
    }
    return 0;
}

コンパイルは以下のようにする。ライブラリの指定順序が違うとリンクでエラーとなる。

% g++ -I/usr/local/include -L/usr/local/lib -o lemtest lemtest.cpp \
    -lturglem -lturglem-russian -lMAFSA

"lemtest 入力ファイル" で実行する。入力と実行結果を以下に示す。

入力:

Я люблю вас
Саша прочитал книгу на русском языке

実行結果:

Я люблю вас
  0 input word: Я (lemmatize results: 1)
    ** 0: paradigm/form = 2297/00               Normal Form: 'Я'
  1 input word: люблю (lemmatize results: 1)
    ** 0: paradigm/form = 0913/01               Normal Form: 'ЛЮБИТЬ'
  2 input word: вас (lemmatize results: 3)
    ** 0: paradigm/form = 0742/01               Normal Form: 'ВЫ'
    ** 1: paradigm/form = 0742/03               Normal Form: 'ВЫ'
    ** 2: paradigm/form = 0742/05               Normal Form: 'ВЫ'
Саша прочитал книгу на русском языке
  0 input word: Саша (lemmatize results: 1)
    ** 0: paradigm/form = 2485/00               Normal Form: 'САША'
  1 input word: прочитал (lemmatize results: 1)
    ** 0: paradigm/form = 0440/01               Normal Form: 'ПРОЧИТАТЬ'
  2 input word: книгу (lemmatize results: 1)
    ** 0: paradigm/form = 0088/03               Normal Form: 'КНИГА'
  3 input word: на (lemmatize results: 1)
    ** 0: paradigm/form = 0026/00               Normal Form: 'НА'
  4 input word: русском (lemmatize results: 3)
    ** 0: paradigm/form = 0002/06               Normal Form: 'РУССКИЙ'
    ** 1: paradigm/form = 0002/19               Normal Form: 'РУССКИЙ'
    ** 2: paradigm/form = 0313/05               Normal Form: 'РУССКИЙ'
  5 input word: языке (lemmatize results: 2)
    ** 0: paradigm/form = 0010/05               Normal Form: 'ЯЗЫК'
    ** 1: paradigm/form = 0021/05               Normal Form: 'ЯЗЫК'

"paradigm/form" に文法構造が示される。この数値で品詞,性・数・格などが示される。詳細は現在調査中である。"Normal Form" は見出し語である。

自作プログラムから Lemmatizer を呼出す方法の概略を,これで理解できた。そのうち,PCRE や Boost::regex などの正規表現ライブラリと組合わせて,コンコーダンス・プログラム,ロシア語旧正書法変換プログラムなどを開発したいと思っている。

ロシアの TeX ユーザーズグループのメーリングリスト CyrTeX-ru@vsu.ru で,「段落のはじめの単語のみ自動的にボールド書体にしたいのだが,マクロ中の \expandafter がうまく動かないのは何故」との質問が出ていた(Message #8242)。私にとって,\expandafter 云々はどうでもよかったが,段落冒頭単語を自動的にボールドにする工夫にはちょっと興味があった。自分でマクロを書いて,こんなのどう?と投稿してみた。

段落は \par で改段落される。その際に,\everypar の設定によって新しい段落のはじまり方を変えることができる。しかし, latex.ltx が別の環境への切替えのときなどに \everypar を頻繁にリセットしてしまうようで,一度 \everypar をカスタマイズしてもすぐ元通りになってしまい,なかなか思うようにはいかない。こんなことで悩むより,段落の最初の単語に対し,素直に \textbf{} をマークアップするほうが早く確実だともいえる。

とはいえ,できたものを一応掲載しておく。boldpar 環境内で,段落の冒頭の単語だけをノーマルではなくボールドにする。ただし,あくまで欧文用であり「単語」は最初の空白文字までのテキストである。和文だと,空白を探して段落の終わりに到達し,段落全体,あるいはセクション全体がゴシック体で組まれてしまうかも知れない。この環境内にはいかなる環境も記述することができない。そんなこんなであまり使い勝手がよろしくない。

% -*- coding: utf-8; -*-
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T2A]{fontenc}
\makeatletter
\let\new@everypar=\everypar% get \everypar on the time
\newtoks\new@everypar%
\catcode32=13\relax% set space to catcode 13 
\def {\mdseries\space\catcode32=10\relax}% space is command \md
\def\boldpar{% make only the head word of paragraphs bold
\par\everypar\expandafter{\the\new@everypar%
\if@afterindent\else{\setbox\z@\lastbox}\@afterindenttrue\fi%
\bfseries\catcode32=13\relax}}%
\catcode32=10\relax% recover catcode
\def\endboldpar{\@nobreakfalse}% 
\makeatother
\begin{document}
\section{hogehoge}
\begin{boldpar}
Как лицо твое похоже на вечерних богородиц,
опускающих ресницы, пропадающих во мгле.
 
Как лицо твое похоже на вечерних богородиц,
опускающих ресницы, пропадающих во мгле.
 
Как лицо твое похоже на вечерних богородиц,
опускающих ресницы, пропадающих во мгле.
\end{boldpar}% recover bfserise --> mdserise
 
Как лицо твое похоже на вечерних богородиц,
опускающих ресницы, пропадающих во мгле.
\end{document}

上例では,boldpar 環境内で先頭の "Как" だけがボールド書体になるはずである。原稿の \makeatletter から \makeatother までが boldpar 環境定義マクロである。\everypar\bfseries 命令とインデント制御を埋め込む。空白文字の分類コードを一時的に 13 に変更して,これを \mdseries に置き換える。"\def {\mdseries\space ... }" の \def の次に空白がひとつあるのは,空白文字に命令を割り付けている訳である。命令を定義したすぐそのあとで,空白の分類コードを 10 に戻しておく必要がある。こうして,段落が開始された時点で \bfserise が実行され,最初の空白文字で \mdseries が実行され,見た目に元に戻るようにするというものである。デフォルト書体が bold だとドッチラケなんだけど。現時点のウェイトをチェックして振る舞いを変える必要があるだろう。\section 命令のあとのインデントの有無をコントロールするのに悩んだ。\@afterindenttrue\@nobreakfalse を設定しないと,\sectiton 命令指定時にインデントがおかしくなり,また3段落目でボールド化が解除されてしまうのである。

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 にはこの変更を反映していない。もうしばらく時間がかかりそうである。

『地獄少女』ロシア語吹替え版(といっても,日本語にかぶせてナレーターがロシア語で通訳するような形態なのだけど)をロシアのアニメサイトで観た。ロシア語タイトルは "Адская девочка" あるいは "Девочка из Ада" であった。今日は『地獄少女』のロシア語ネタ。

「恨み,聞き届けたり」という古風な台詞は,"Месть будет исполнена(復讐は果たされることになる)" と訳されていた。文法的に原語の完了形ではなく未来時制なのが面白い。要するに,日本語の意味する復讐の契約が成立したことではなく,確実に恨みが晴らされることに主眼がある翻訳になっていて,ロシア人の単刀直入な国民性がこういうところにも現われているのである。「先生」,「先輩」という呼びかけが日本語のままで使われていた。日本アニメ浸透の様子が窺われて興味深かった。日本語の「ケバい」を "вызывающе" と,きくりのようなおチビちゃんな女の子のことを "малявка" と言うようだ。

閻魔あい定番のあの地獄落としの台詞と,その吹替えでのロシア語テクストをあげておく。ロシア語訳も,弱強格韻律で書かれ,かつ тьмой -- тобой,смрада -- ада という具合に脚韻を踏んでおり,日本語の七五調文語を移植したらしく,詩的テクストになっている。こんなのを暗唱してロシア語に親しむというのは,縁起が悪いのでやめたほうがよい。罰が当たっても知りません。

闇に惑いし哀れな影よ      О жалкий дух, ты породнился с тьмой,
人を傷つけ貶めて  Жестоко жизнь других отравлена тобой
罪に溺れし業の魂  Душа твоя полна грехов и смрада...
一遍,死んでみる?  Падешь на веки ты в глубины ада!

ちなみに「人を呪わば穴二つ」は,"Мстишь --- копаешь сразу две могилы..." (恨みはいちどに二つの墓を穿つ)と訳されていた。手元にある『ロシア語ことわざ集』では,この日本の諺は "Не рой яму другому, сам в нее попадаешь (упадешь)."(他人に対して穴を掘るなかれ,自らがそれに落ち込むことになる)というロシア語になっていた(『日英仏対照 ロシア語ことわざ集』吉岡正敞編著,駿河台出版社,1986 年,87 頁)。穴に自分が落ちるというよりも,"Адская девочка" の言のほうが怖い。

あなたの恨み,晴らします。Мы отомстим за вас.
 

Profile

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

Notice

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

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

管理者が公序良俗に反すると判断したコメント,トラックバックは,断りなく削除される場合があります。

Links

About this archive

All Entries of Category ロシア・スラヴ

Previous: musica

Next: 一言居士

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

Web Pages

Powered by Movable Type 4.1