2009年7月アーカイブ

コンピュータ関係の書籍を読んでいて,その内容に刺激を受け,著者の力量に感銘を覚えることは少なくない。しかし,私の読書経験のなかで貴重な一冊だと思わせてくれる本はまずない(計算機科学の本なんかで感動するか,普通?)。私にはそんな本が二冊ある。B. W. カーニハン,D. M. リッチーの『プログラミング言語 C』と,D. E. クヌースの『TeX ブック』である。

前者は,C 言語の入門書にして言語仕様の解説書として,決定的な役割を果たし続けている名著中の名著である。私は UNIX サーバの仕事が舞い込みはじめた 1992 年あたりに,本書を購入して C を勉強したのである。計算機の勉強において,そのアーキテクチャに親和性を持つプログラミング言語を学び,システム・プログラムを自分で書いてみることが,OS 理解の王道である。その当時は UNIX といえば C 言語だったのである。

ガチガチの汎用機アセンブラの「文体」にそれまで浸かっていた私は,『プログラミング言語 C』に紛れもなく驚嘆したのである。解説に付したサンプル・コードの簡潔な美しさ。逆ポーランド記法,二分木の再帰探索,クイックソートなどのアルゴリズムのコードを一頁以内で示す書法。高度なアルゴリズムを,まったくムダがなく簡潔にシンプルに,実現してみせる。これこそプログラム書法というものだと,ひいては計算機言語のみならず「日常の文章」もこのように書けたらなあと,心底憧れを覚えたのである。

自分の伝えたい考えをしるすのにこの変数(単語)は必要か? もっとすっきり簡単にできないか? 一パラグラフにだらだら詰め込むのではなく,ある共通部分を関数(キーパラグラフ)に纏めたほうがよくはないか? そんなわけで,その後本書の影響により,私は日本語の文章をしるす場合にも,もう「推敲」などという故事は吹き飛んで,「設計」,「デバッグ」という態度で見直しをするようになってしまった。だけど,本書のコードの無駄のなさ・シンプルさ・明快さはなかなか身に付かない。

いまでも C のプログラムを書きながら本書を参照するたびに,「美しい」と思ってしまう。とくに,二分木アルゴリズムによるワードカウンタのコード例には惚れ惚れしてしまう。自己参照構造体の解説にあるものだ(pp. 168--73)。私は必死こいて本書を研究し,コンコーダンス・プログラムでたくさんのコードを拝借した。

プログラミング言語 C 第 2 版 ANSI規格準拠
B. W. カーニハン, D. M. リッチー 著
石田晴久 訳
共立出版

本書の Amazon 評をみると面白い。ぜひみてください。プログラムの書き方がわかりづらいとか,入門書としては勧められないとか,酷評している者がある(その一方で,Amazon 評者には『プログラミング言語 C』なんて読むより,GNU C コンパイラのソースを読めなどと諭す,どうも TPO を弁えない極端なXXもいるのがまたチョー面白い。C を「学ぶ」ための本が話題になっているのに,C 知識を前提とした提案をするのは,最初から C を知っていたかのような知ったかぶりの典型ではないか?)。これらの評を読んでいると,古典は論理的でなく意味がわからないのでつまらない,この作家ひでえ文体とか,まあそんなのに類する愚評を想起してしまう。なにか別のものを求めてませんか? わかりづらさを翻訳のせいにしている者もいる。評者自らの(本を読む)レベルをまる出しにしているわけだ。そんな人に合わせた甘口の C 言語本が売れるわけだとある意味で納得する。

私は断言する。この本は間違いなく「入門書」であるし,この本のようにコードを書くのが C のマナーである。そして,本書はそれに相応しく「わかり易く」書かれているし,訳されている。ただ,簡潔なのだ。そして読者に媚びない。これが「わかりづらい」という者は,C の前にまずシステマチックな日本語文(正確を志す,科学的主題に相応しい文章)を学ぶべきだということである(偉そうに)。

* * *

『プログラミング言語 C』は,プログラミング言語の習いはじめの第一声として "hello, world" を出力するコードを書いてみる,というあの有名なマナーを定着させた。"hello, Java world" だったり,"hello, Perl" だったり,その後あまりに当たり前になってしまって,病気かこいつらと思うほどになった。そんな常套手段に飽き飽きしていたちょうどその頃,私は古風な病いを得て,病院に収容されてしまった日々のなかで, D. E. クヌース『TeX ブック』に出会ったのである。

TeX, LaTeX そのものの面白さについてはここでは言うまい。この『TeX ブック』も TeX を一からはじめる初学者を対象に書かれた入門書にして決定版である。一方,ユーモアとジョークに満ちたその語り口は,コンピュータ書籍においてかつてないものではないだろうか(これはただの想像)。本書のジョーク精神の最たる部分は,第 6 章「TeX を実行するには」である。読者を端末の前に座らせ,ハイ次はこうやってみましょう,という初心者向けの例を示している。ところが,この最初の実行例の解説は次のようなものである。

うまく実行できると,TeX は次のようなメッセージを表示してくる。
This is TeX, Version 3.14 (preloaded format=plain 89.7.15)
**
 “**” は TeX が入力ファイル名を要求している印である。
 さて次に,\relax と(...)入力し,<改行> キー(...)を押してみよう。そうすると TeX は始動し,長い原稿を読み込む準備をする。しかしこれはごく簡単な実行例で,TeX に休んでいいよ,と言っているのである。つまり \relax は “何もするな” という意味のコントロール・シーケンスである。
D. E. クヌース『改訂新版 TeX ブック』鷺谷好輝訳,アスキー出版局,1989,p. 39.

これがクヌース先生一流の,超一級のジョークだということがおわかりだろうか? いったいどこの誰が,紹介したい対象となっているシステムのはじめの実行例で「休む」,「何もしない」なんて命令を入力させるだろうか? そう,まずは Relax しようというわけだ。でも,プログラミング言語のさまざまなトリックに讃歎した経験をもつ者は,このジョークの表面的な意味の裏に,TeX システムが「何もしない命令」を用意していることの重要性をきちんと読み取るのである。沈黙は金。このシステムはただものではないと知るのである。「今度は Hello? と入力してみる」という紋切型が,このあとに続く(同頁)。

TeX はバージョンが上がるたびに 3.1415... と π に近づく。クヌース先生がお亡くなりになったら(縁起でもないが)バージョン π でシステムは凍結とするのだそうである。こういう完全主義的ジョークで大いなる変化球を投げて来るところが,その後私を虜にしてしまった TeX の深さ,広さ,長いつきあいをさせてしまう親しみ,などなどの根源にあるのだ(仕事ではまったく使いませんが)。

今日,自宅の Windows XP に JIS X 0213:2004(所謂 JIS 2004)対応のMS明朝,MSゴシックのフォント,さらにメイリオ・フォントを導入した。ずいぶん前に,JIS X 0213 について書いたとき,なによりもこの規格でなされた 168 字の字体変更をこき下ろした。けれども,Utf82TeX CJK 統合漢字拡張 B 対応を行ったこともあり,「標準」に追随して行かざるをえないなあという気持ちが強くなったのである。たとえ愚かな君主の決めた愚かな法律・標準であっても,発効すれば文句を言いながらも従うしかありません。「標準」とはそのようなものである。

IE 7 で葛原妙子の「葛」は,もと 葛 だったのが 葛正字体 になった。これはこれで正しい。(でも奈良県葛城市が JIS のおかげで振り回されている...:2010.3 付記)

しかし,考えれば考えるほど,この JIS 2004 の字体変更の理屈が理解できない。この変更は,国語審議会の答申「表外漢字字体表」に示されている「印刷標準字体」に合わせたものである。それはそれで立派な理由かも知れないが,いまさら国語審議会の尻馬に乗ってどうする,という疑問も否めないのである。この表外漢字字体で「印刷標準字体」として認定された文字は新聞等の出現度数調査に基づいているとのことである。でも,文字の構成要素を度外視した原理・原則(一貫性)がいまひとつよくわからないのである。でもって JIS 2004 字体変更の「必然性」がどうも納得できないのだ。

「疼」は 疼疼正字体 に変えたのに,「冬」はなぜ 冬 のままで 冬正字体 にしないのか。「辻」について,辻 さんは結構いるのに 辻正字体 が標準というのは常識的に解せない。「辻」,「逢」を二点しんにょうにするなら,「道」,「遠」なども正字体にしたらどうかね。などなど。

「冬」,「道」,「遠」はこれが「印刷標準字体」ということなので変更しないわけである。でも,上例のとおり一貫性に欠ける。確かに,「標準」に一貫性が必要であるというわけではない。だとしても,いままでの文字形を否定する(「変更」は過去の否定なのである)ほどの必然性があるとはとても思われない。

通常,ものごとの取り決めというものは,いったん決定されると,それ自体に不良(目的とする仕様に適合しない事象)が見いだされない限り,なかなか「変更」されないものである。新しい要請に対しては,「追加・拡張」がなされるのが通例だろう。JIS もこれらの変更後の字体を「追加」すればよかったのではないだろうか。なぜなら,「変更」は過去の規範に則っていた者が自らの資産も「変更」を強いられる一方,「追加・拡張」ならば己の事情によってそれを無視できるからである。

この JIS の愚かな自己否定のおかげで企業・官公庁・自治体のシステムは,本当は別のサービス向上の機能追加をしなければならないのに,文字の取り扱いについて「本当に」余計な改修を強いられているのである。この不況のなか全国津々浦々で進行中のこういう「塵も積もれば山となる」調達は,誰からも税金のムダ遣いと言われないのが面白い。しかも,このシステム改造は,JIS 2004 の恩恵を活かすというのではなく,JIS 2004 文字(文字コードなんかになんの頓着もないユーザは Windows Vista の新 IME で知らず知らず入力してしまうのである)がシステムに入って来ないようにブロックするものが大半である。笑ってしまう。JIS が足を引っ張っているのは明らかなのだ。「どうする? 企業情報システムの『JIS X 0213:2004』対応:ITpro」などを参照のこと。

JIS の字体変更は JIS 2004 にはじまったわけではなく,JIS 83 においてすでに前例がある。どうも JIS は自己否定が好きなようである。これを見ていると,戦後間もないころの国語・国字改革の自己否定(現代仮名遣い,漢字制限)を連想させ,ほんと,日本国の標準策定というものの懲りない性格に呆れてしまうのである(私は現代仮名遣いを否定しているわけではありません)。そのうち,4 年くらいしたら,JIS はまた面白い改訂をしてくれるだろう。こんなことをしていたら,Unicode コンソーシアムが独自に CJK 漢字標準を整備し,日本国の JIS 標準が置いて行かれる — これがいちばん起こりそうなことだと思う。

自己否定 — これは,地震ですべてが崩壊し,すべてを一から作り直そうとしてしまう,地震国のお国柄なのだろうか。

私は個人的には文書作成を LaTeX で行う。LaTeX では,JIS X 0208(所謂 JIS 第一・第二水準)で足りない文字を Adobe_Japan1 コードに準拠して出力する方式が,広く浸透している。JIS 2004 の字体変更も Adobe_Japan1 の CID コードのおかげで cmap をちょちょいと変えて対応できる。JIS などの多様な意見を取りまとめなければならないお役所仕事よりも,Adobe という企業が印刷現場の要請に基づき一貫したポリシー(商業印刷の現場でほしいと思う文字を「追加」して行くポリシーだと思う)で作り上げた「標準」のほうが,よっぽど有用だと思う次第である。

※ 以上のとおり,さんざんぱら,JIS 2004 を批判しているのだけど,そうはいっても JIS の活動全般に懐疑を示すものではもちろんない。JIS はわが国のインダストリアル・スタンダードを決める責任ある機関である。上記のような問題は,その功績に比べると誠に微々たる話である。JIS で活動している研究者,企業人はわが国の斯界の権威であり,真に尊敬に値する人達である。私の軽口を大目に見てください。

* * *

上記字体変更の例で使用した文字の画像は LaTeX で出力した文字を,dvips, Ghostscript で png に変換したものである。コマンドラインから文字画像を生成するシェルスクリプトを書いた。以下に掲載しておくので,同じような課題がある場合にお使いください。OTF パッケージが必要。

#!/bin/sh
# tex2image: convert LaTeX command to image file
# コマンドラインの LaTeX 命令を画像(png, eps)出力する。
#                         coded by isao yasuda, July 27 2009.
 
if [ $# -lt 3 ]; then
    echo "usage: `basename $0` -e|-p out-file-base 'LaTeX fragment'"
    exit 1
fi
 
case $1 in
    # アウトライン EPS
    -e) CONV="gs -dNOPAUSE -dBATCH -dSAFER -sDEVICE=epswrite \
              -r9600 -sOutputFile=$2.eps $2-wk.eps"
        echo "Outlined EPS file genetation to $2.eps"
        break;;
    # PNG 
    -p) CONV="gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pngalpha \
              -dEPSCrop -r72 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 \
              -sOutputFile=$2.png $2-wk.eps"
        echo "PNG file genetation to $2.png"
        break;;
    # それ以外はエラー
     *) echo "$1 unknown option."
        exit 1;;
esac
 
echo "% 文字画像生成テンプレート
\documentclass[12pt]{jsarticle}
\usepackage[dvips]{graphicx,color}
\usepackage[multi,deluxe,expert]{otf}
\pagestyle{empty}
\begin{document}
\parindent=0pt
$3% こいつを LaTeX 処理
\end{document}" > $2.tex
 
# pLaTeX UTF-8 処理
platex --kanji=utf8 $2.tex
if [ $? -ne 0 ]; then
    echo "LaTeX error $2.tex."
    exit 1
fi
 
# dvips でまず普通の EPS にする
dvips -E -D 9600 $2.dvi -o $2-wk.eps
if [ $? -ne 0 ]; then
    echo "dvips error $2.dvi."
    exit 1
fi
 
# 画像変換
$CONV
 
# 後始末
rm -f $2-wk.eps $2.dvi $2.log $2.aux $2.tex
echo "done."

これを例えば tex2image というファイル名で,パスの通ったことろに UTF-8 エンコードで格納し,実行属性を付与する(chmod +x tex2image)。

tex2image -p ファイルベース名 'LaTeXコマンド'

とすると,LaTeXコマンド を処理した文字列が ファイルベース名.png という名の png 画像で生成される。LaTeXコマンド に前後のアポストロフィを付加しないと,特殊文字,空白文字を記述できないので注意。

png 画像はアルファ・チャンネルをもつ透過画像なので,背景色に追従可能である。文字そのものを着色したければ,LaTeX コマンドに "\textcolor{色名}{文字}" を指定すればよい。オプションを -e とすると文字のアウトラインを取った EPS 画像で出力する。ベクトル画像なので,Illustrator などで拡大編集してもギザギザで汚れはしないはずである。独自に必要な LaTeX スタイルがあれば,テンプレートに \usepackage 命令などを追加してほしい。dvips,Ghostscript がアウトラインフォントを拾える環境でないと動作しない(要するに,PK ビットマップフォントが混入しているとエラーになる)ので注意。

「葛」の JIS 2004 字体の画像: 葛正字体 の出力は,次のとおりとした。

tex2image -p 1kuzu '\LARGE\CID{7652}'

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

おっはー

|

最近,息子が受験生らしくなって来た。どうもガールフレンドに振られたらしい。時折,ぶつぶつこぼしている。気にするなと妻が慰める(私が学生のころ,ガールフレンドの話題が出ると,母には「孕ませたらアカンで」みたいなことばかり言われたものだが)。その一方で,お笑い番組を観てはバカ笑いをし,タレントや祖父母の物まねをやって家族を笑わせている性格は,誰に似たのか。その明るさには我が子ながら感心してしまう。

いつのまにか,子供も大きくなってしまった。なんて感傷に浸っていると,子供たちがまだ幼児だったころ,会社に行く前に『ひらけポンキッキ(ポンキッキーズ?)』や『おはスタ』などの朝の子供向けテレビ番組を,子供たちといっしょによく観てたなあとふいに思い出した。十四,五年前か。

『ポンキッキ』ではブレークする前の鈴木蘭蘭と安室奈美恵とが,ふたりしてうさぎの着ぐるみを着て,「まーさかり・かーついだ・きーんたろおー」と歌っていて愛くるしかった。バックダンサーを引き連れて「Body Feels EXIT!」とカッコ良く歌う安室を観たときは,「あれ? ポンキッキのお姉さんじゃんかー」というのが我が家の反応だったのである。その後,いろんなことが変わってしまった。

『おはスタ』はいまもまだ続いているようである。私の記憶にある『おはスタ』では,司会の山ちゃん(『新世紀エヴァンゲリオン』加持リョウジ役の,しかし加持リョウジにはまったく似ていない声優・山寺宏一)が,「レイモンドだよー」なる黒人タレントとともに,朝に相応しい元気なしゃべりでかしましかった。ポケモンが大流行したころである。「おはガール」という看板娘が日替わりで登場し,そのなかには『スポルト』のフジテレビ人気女子アナ・平井理央もいたことを知っているひとはどれだけいるだろうか。「おっはー」というチョー軽い挨拶が番組の合い言葉であった。『学級王ヤマザキ』という短篇アニメのコーナーがあって,この王様ヤマザキは「おはよう」のことを「おっぱいよー」といっていた。まあ,そのくだらなさが想像できると思うが,私は子供とおもしろがって観ていたのだ。おっはー。おっぱいよー。あぁあ。

最近,テレビで AKB48 なる大勢の若い娘さんたちが歌って踊っているのを観て,「エーケービー・シジュウハチ?」という私は,子供たちに失笑される始末である。「フォーティーエイト!」— でも 48 人もいないじゃないか。なんかの四十八手をもっているのか(と,下品な口がちょっと滑ってしまう)。「じゃなくて,いろんな女の子がいるってことだよ!」— あぁあ。なんだ昔のオニャン子か,というのは呑込んだ。

GNU Global

|

Lemmatizer ライブラリのソースコードの解析のために GNU Global を使っている。このツールは,ソースコードの関数や変数がどこで定義されているか,どのファイルで利用されているかを縦横に渡り歩いてブラウズする手段を提供する。grep で必死こいて探すのに比べるとその利便性は天と地ほどの差がある。C, C++, Yacc, Java と PHP4 のプログラミング言語をサポートしている。

Global はコマンドラインのみならず,GNU Emacs,Vim のほか,HTML 変換機能により,ブラウザによってハイパーリンクでソースコード探索できるインタフェースをサポートしている。今日は,FreeBSD で GNU Global 5.7.1 をインストールし,HTML ベースで利用する方法をメモしておく。

FreeBSD には Global の ports が用意されており,導入は簡単である。"cd /usr/ports/devel/global && make install clean" 一発でインストールできる。

ここでは AOT の Source 配下にある .c, .cpp と .h を抽出し,Global で処理する例を説明する。

  1. まずはソースコードの抽出。もともとの AOT ソースの場所を $RML/Source,Global のデータを作成するディレクトリを ~/src/aot とする。
  2. % cd $RML/Source
    % find . -name "*.c" -or -name "*.cpp" -or -name "*.h" > list
    % tar cf - `cat list` | ( cd ~/src/aot ; tar xvf - )
    

  3. gtags コマンドを発行してタグ・データベースを作成する。GPATH, GRTAGS, GSYMS, GTAGS の 4 ファイルが生成される。
  4. % cd ~/src/aot
    % gtags -v
    

  5. htags コマンドで HTML データを作成する。

    • ここでは,検索用の CGI プログラムを http://web-server-host/cgi-bin/global.cgi で,ブラウザからアクセスできるようにしよう。http://web-server-host/ は Web サーバのドキュメントルート URI の例である。実際の URI で読み替える必要がある。同様に,以下のコマンドラインで指定している cgi-bin,HTML 出力のディレクトリについても,運用で決めた場所で読み替えていただきたい。

    • 以下の指定オプションは -a: アルファベット・インデックス,-f: 検索フォーム,-n: 行番号表示,-F: フレーム表示,-I: アイコンリンク使用,-s: シンボルにもアンカー付与,-x: XHTML,-T: ファイルリストを <table> タグ付,-t: タイトルである。

    • オプションに --suggest を指定すると,初心者用のお勧めとして開発者が設定したオプション・セットが選択される。これも十分満足できるものと思う。ただし,5.7 未満の古いバージョンではサポートされていないようである。

    • HTML を生成したら,gtags で作成したタグ・データベースをそのディレクトリ直下にコピーしておく。CGI 検索用である。
  6. % cd ~/src/aot
    % su -m
    # mkdir -p /usr/local/www/apache22/data/aot
    # htags -afnFIsxT -S /usr/local/www/apache22/cgi-bin \
      -t 'AOT Source Tour' /usr/local/www/apache22/data/aot
    # cp G[P-T]* /usr/local/www/apache22/data/aot
    

  7. 生成された HTML データは,運用都合で別ディレクトリに移動すると,gtags で作成したデータベースを参照できず検索 CGI が動作しなくなるので注意しよう。もし Web サーバを外部公開している場合は,.htaccess の認証機能などで閲覧制限を設ける,検索エンジンからの収集を抑止するよう robots.txt に Global データ・ディレクトリを登録する,などセキュリティ上の工夫をしておくことをお勧めする(これは割愛)。

これで,ブラウザから "http://web-server-host/aot/HTML/" にアクセスすると,ソースコード探索ができるはずである。index.html は main 関数を有するプログラムの一覧,アルファベット索引,ソースコードのディレクトリを提示する。ここから,目的とするコードを探索する。

スナップショットを以下に示す。ソースコード中の関数やデータ構造にリンクが設定され渡り歩くことができ,検索ボックスにキーワードを入力して必要な部分を探すことができる。

gloal_ss.jpg

文章がうまくなりたいと思わない者はないだろう。誰しも一冊や二冊はその指南の書を手にしたことがあるのではなかろうか。私も高校生のころから,そのテの本をそれなりに読んで来た。「うまく」書けるようになりたいと。しかし,大学を卒業し,勤めに出るようになって,文章に対する考え方が根本的に変わった。自分の思想(というか「思考」)を簡潔に,明快に,わかり易く書くことが第一目標になった。「個性」,「表現」,「文体」というものが,なるたけちらつかないようにすること。

その過程で,文章の書き方についてしるした本についても評価がまったく変わってしまった。昔は作家が書いた『文章読本』を有り難がって読んだものだが,いまは十中八九,それらはその作家個人の単なる趣味の域を越えず,その多くはただの「たはごと」だと考えるようになった。要するに,丸谷才一や三島由紀夫などの『文章読本』を読んで,吹き出してしまうようになったのである。偉い作家の「書き方」が優れた文章指南の本としてまかり通っているから,文学をやった者が世の中にバカ者(でなければ気取屋)扱いされるのだと,真剣に考えるようになったのである。

それとともに,日本の国語教育のレベルの低級さがいや増しに感ぜられるようになった。作文では自分の「思っていること」をうまく「表現」し「個性的に」書くことが尊ばれ,起承転結などという「はぐらかし」文章構成法がもてはやされ,まあ要するに,個性もないのに個性的たろうとするバカを養成するのが学校の作文教育の目的であるように思われて来た。テーマの取扱い方・絞り方や,誰もが則るべき規則,事実と意見の書き分け方などの,どちらかというと没個性的な言語構成法をどうして子供たちに徹底的に仕込まないのかと思うようになった。

その一方で,埋め草や文学的な言い回し(要するに「表現」への指向)を排して,言いたいことの優先度を整理し,目的の実現に最大限奉仕するようパラグラフを構成し,わかり易い言葉を選びかつ一貫させることが,私の作文(というか仕事などでの資料作り)の主眼となった。そこには「雰囲気」,「空気を読ませる」,「陰翳」などの無意味な意図を絶対に潜り込ませてはならない。そんな「文芸」からもっとも遠いマナーを尊ぶようになった。いまの私にとって文章指南の最高の書籍は,木下是雄著『理科系の作文技術』(「理科系の」という表題が大いなる皮肉である)と M. J. アドラー・C. V. ドーレン共著『本を読む本』(後者は「読む立場」から書かれているが,逆にそれに答えるような書き方を教えてくれるのである)。この二冊につきると思っている。

R. J. ウィンジェルの著書『音楽の文章術』(宮澤淳一・小倉眞理訳,春秋社,1994 年)は,音楽という芸術に関する記述においても,幼稚な比喩や文学的言い回しで陽動するのではなく,「音楽についての考察」,「音楽の内部で何が起こっているのか」を思慮深く明晰に書かなければならないと述べている。音楽の感動を文章にしるすとなると主観的にならざるを得ない。昨日私の書いたブログ記事の「メンデルスゾーンの音楽は,自己主張の少ない慎ましやかなものだが,衷心さが心を打つ」なんてのも,ただの主観的書き散らしに過ぎない。それでも,音楽について公的になにかを主張したいという場合,やはり主観から客観に重心を移すべきであって,本書はそのための指南になっている。

音楽について書くのは難しい。そのため,音楽について実際に考察するのを避けるために,陽動作戦に訴え,まったく関係のない内容でページを埋めてしまう人がいる。... そういう文章の書き方について触れるのは,物笑いの種にするためではない。われわれが避けたい文章の書き方とはどのようなものかを明らかにするためである。なお断っておくが,これから挙げる例は直接的な引用ではなく,私が読んだことのある文章に手を加えたものである。...
...... ヴィオラはみずからの簡潔な主題によってさえぎろうと懸命になるのだが,木管楽器群はそれに心を動かされることなく,引き続き自分たちのおしゃべりを続ける。しかし,最後に金管楽器群が決着をつける。ほかのすべての楽器をかき消して,本来の秩序を回復させるのである。
あまり意味のない内容にいつまでも関っていても仕方がない。この文章は音楽について何も語っていない。凝ったつもりなのだろうが,楽器の擬人化は,有益どころか幼稚である。
リチャード J. ウィンジェル『音楽の文章術』春秋社,pp. 5--6.

引用を含む長い引用でいただけないけれども,ここで「物笑い」になっているような文章を『レコード芸術』などでいやというほど読まされた方は,頷かれるものと信ずる。私には喝采ものである。「陽動作戦」を排する — 肝に銘じたい。

ウィンジェルの本は,音楽学の学生に向けて書かれた実践的なものである。しかし,主観的なる芸術について真実を求めて書くという姿勢において,書くこと一般について示唆に富む一冊である。

音楽の文章術―レポートの作成から表現の技法まで
リチャード・J. ウィンジェル 著
宮澤淳一,小倉眞理 訳
春秋社

言及した,私のイチ押しの本も挙げておきます。

本を読む本 (講談社学術文庫)
M. J. アドラー,C. V. ドーレン 著
外山滋比古,槇未知子 訳
講談社

一昨日の夜だったか,NHK でライプツィヒ・ゲヴァントハウス管弦楽団演奏会の録画放映があった。オール・メンデルスゾーン・プログラム。ライプツィヒ・ゲヴァントハウスはメンデルスゾーンゆかりのオケである。交響曲『イタリア』,ヴァイリン協奏曲を視聴した。指揮はそれぞれ,リッカルド・シャイー,クルト・マズア。ヴァイオリン独奏はアンネ・ゾフィー・ムターという豪華な顔ぶれ。

メンデルスゾーンの音楽は,自己主張の少ない慎ましやかなものだが,衷心さが心を打つ。それにしても,『イタリア』ってこんなにいい曲だったっけー,と感動を新たにしてくれる演奏会であった。今年はメンデルスゾーン生誕 200 年の年だそうである。

以下の盤は私のお気に入り。

Mendelssohn: 5 Symphonies; 7 Overtures
C. Abbado (Dir),
London Symphony Orchestra.
Universal (2002-05-14)
メンデルスゾーン:ヴァイオリン協奏曲 ホ短調
N. ミルシテイン (Vln),
C. アバド (Dir),
ウィーン・フィルハーモニー管弦楽団.
ユニバーサル ミュージック クラシック (2006-11-08)

バレーボールと海と

|

今日は中学三年になる娘のバレーボールの試合だった。市のベストエイトが決まる日だった。浜川崎にある中学校の体育館。顧問の先生にご挨拶した。自身母親の身でありながら,休日,夏休み関係なくクラブで子供たちを指導している。私には,まったく頭の下がるタイプの先生である。

私は久しぶりに iPod を持参し,音楽を聴きながら,他の学校の試合含めバレーボール観戦を楽しんだ。バルトークの弦,打楽器とチェレスタのための音楽,ヴァイオリン協奏曲,弦楽四重奏曲全六曲を聴き通した。意外とノリがよかった。レシーブに秀でた娘のチームは三戦全勝で,見事ベストエイト進出を果たした。私にはセッター選手のプレーが光った。

そのあと,浜川崎まで来たついでに,海が見たくなった。川崎に移り住んでからもう二十年近くなる。そのうち一度は行ってみたいとかねがね思いつつ,果たせなかった臨海地区の散策を思いついた。

浜川崎駅は JR 南部支線の終着であり,JFE(東日本製鉄所,すなわち,かつての川崎製鉄)の工場に接していて,JR 貨物列車も入って来る。しかし,なんと無人駅であった。Suica の簡易改札をはじめて目にした。この大都会の,なんというか,陥穽に入った気分。自宅からの往路は南部支線駅で下車したが,臨海方面に行くには,道路を隔てた JR 鶴見線に乗り換えなければならない。駅舎のそばの植え込みに猫親子がいた。浜川崎線も鶴見線も私が川崎に住み着いた 1990 年代はじめころにはクモハ12型なるチョコレート色の古色蒼然たる車両が走っていたものだった。

1-hamakawasaki-1.jpg

ところが,鶴見線の無人のホームに立ち,次の列車の時刻を確認したら,50 分後。なぬ! 夕方少し前の時間帯は 1 時間に 1,2 本なのである。JR 東日本はこの 4 月から全面禁煙になったはずだが,この駅はまだホームの端に喫煙コーナーがあった。ベンチに座って狭いホームでひとり煙草を吹かす。持参した C++ 言語の本を読む。すぐ目の前に東日本製鉄所の錆び付いた工場が広がっている。

このあたりは,昭和二十年代〜四十年代くらいは破竹の勢いで鉄鋼・重化学工業が躍進し,労働者で溢れ返っていたはずだ。中学を卒業した少年が田舎から出て来て,ただひたすら働きに働く姿。周囲には,煤煙凄まじい工場のほかはなにもない。若者は月に一度,週末,女を買いに川崎の歓楽街・堀之内まで足を運ぶくらいしか,楽しみがなかったかも知れない。そんなことを想像した。『あしたのジョー』の川崎。

1-hamakawasaki-2.jpg

目指すは海に臨む海芝浦駅。車内はほとんど客がいなかった。元気な中国語が聞こえて来る。鶴見線・浅野駅。ここで,もう一度乗り換えが必要である。浅野駅もやはり無人駅。次の電車は 1 時間後である。駅の佇まいはまるで,かつて見た北海道の赤字ローカル線のようであった。十勝・士幌は周りにジャガイモ畑,ビート畑,麦畑,広大な林が広がっていたのに対し,こちらは工場,倉庫,高圧電線が錯綜している。なのに,のどかな雰囲気はなぜか共通している。潮の香りがする。青緑の見事な揚羽蝶が舞っている。黒猫が二匹いた。振り返るとクロネコヤマトの倉庫のロゴ。吹き出してしまう。白い服のお婆ちゃんが突然現われて猫達に水をやり,毛並みを整えはじめた。いつも世話をしているひとらしい。

2-asano.jpg

終着・海芝浦駅に到着。海に面した珍しい駅舎ではないだろうか。東京湾に開けた運河。向かいに首都高速湾岸線のベイブリッジが見えた。海の饐えた臭いはあまり快適ではなかった。手すりのすぐ下の海面は濁りに濁り,灰汁のようなものが縞模様に集まり,そのあわいをクラゲがたくさん漂っていた。欄干に凭れ,煙草を吹かし(この駅にも喫煙場所があった),しばらく海を眺めた。誰もいない。来てよかった。バッハのイタリア協奏曲 BWV 971 とコラール前奏曲 "Ich ruf'zu dir, Herr Jesu Christ" BWV 639 をちょうど聴き終えたころ,東芝の社員と思われる人達がぞろぞろ現われた(この駅は東芝敷地内にあり,社員でないと出ることができないらしい)。時計を見ると鶴見行き出発時刻にあと少しだった。

3-umisibaura.jpg

帰り,鶴見から川崎に出た。買い物客で溢れ返るメガストア・川崎 LAZONA に立ち寄り,丸善で二冊本を買った。汗だくになり,腹が減ってどうしようもなかったので,惣菜屋でコロッケを二個,買食いした。約 8,000 歩の散歩だったが,これでダイエットのためのカロリー消費はすべて無意味となった。


より大きな地図で 川崎臨海地区 を表示
* * *
Béla Bartók: The Miraculous Mandarin; Music for Strings, Percussion & Celesta
P. Boulez (Dir), Chicago Symphony Orchestra.
Deutsche Grammophon (1996-04-09)
Béla Bartók: Violin Concerto No. 2; Rhapsodies Nos. 1 & 2
Kyung-Wha Chung (Vln), S. Rattle (Dir),
City of Birmingham Symphony Orchestra.
EMI (1994-05-24)

自作のコンコーダンス・ソフトウェアを 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 ツールの簡単な使い方を紹介したいと思う。

なんと,栗本薫が

|

栗本薫が5月に亡くなっていたことを今日知って愕然とした。この多彩な資質を持つ天稟のストーリーテラーは,小説というものの物語性をいつも大事にしていた。私の大学時代の友人は,彼女の『グイン・サーガ』をいつも首を長くして待っては読み,讃歎していた。同時代の文学に心から共感できる仕合わせな人間だった。私にとって,栗本薫作品の筆頭は『ぼくらの時代』。

日本の近現代の作家には,物語を「拵えもの」と軽んずる傾向があった。要するに,文体に溺れた,貧弱な想像力が文学だと思っているところがあった。ワクワクするような物語,エンターテーメントを,子供が読むものとバカにしていたフシがあるのだ。栗本薫は,そんな蒼白いおエラいブンガク馬鹿,ゲイジュツ家を蹴散らして,文学を教養の煙幕にする似非知識人ではなく,本当に本を楽しむ読書人の支持を得ていたと思う。

あーあ。残念。

世の中わかりません

|

東京都議会選挙で自民党が惨敗した。衆議院選挙も8月に決り,民主党は政権奪取の意気込みに現実感が出て来た。ついこの間までは,小沢さんの問題で民主党は大人しかったのだが,思わぬ裏切り者のおかげで自民党内の内紛が国民の眼に際立って,政府への不信感を増長させてしまったのだろうか。自民党はきちんと政策論争で民主党と対峙すべきときなのに,折からの鳩山代表の献金問題ばかりを責め立てていてみっともない。

ついこの間までは自民党が衆議院選挙で勝つだろうと思っていたのに(私が自民党に投票する,ということではありませんので誤解なきよう。また民主党に投票する,ということでは尚更ありませんので誤解なきよう),わからないものである。私は麻生首相を高く買っている。その経済対策は時宜を得たものだったし — バラマキは否めませんが —,民主党が小沢問題できりきり舞いしていたときにも予算化に注力し,選挙よりも政策を優先させたのである(よいことにはまったく目を向けず,悪いことばかりを報道するマスコミのおかげで,それがいま裏目に出た)。国民がなにを考えているのか。それは「いっぺん民主党にやらせてみてもよいかも」という「変化」への期待感だと思う。世界同時不況からの回復状況,アジアの安全保障問題が不安定ないま,その変化は取り返しのつかないものになったりして。「いっぺん死んでみる?(閻魔あい)」。

最近,街頭で幸福実現党の演説がかしましい。幸福の実現においてどうして北朝鮮への強硬政策,そのための憲法改正が必要なのかさっぱりわかりません。子供たちも「チョーうさんくさ!」と話をしていた。日本国民はバカではないのだ。

* * *

夕方のテレビの番組で,少子化の話が出ていた。出生率 1.37 という信じられない時代。

この背景には,共働きの夫婦が増えつつあるなか,幼児を預ける託児施設が足りない事情があるとの話が出ていた。託児所を待っている幼児の数が 20,000 人いるのだそうである。番組の出演者はこの数字に大いに驚き,なんでこんなにいるんだ,なんで政府は託児所を増やす政策を採らないんだ,と言っていた。解説者は,この少子化時代に託児所を増やしても経営し続けていけるかどうかわからないという悪循環がある,と指摘していた。ということは,よく考えれば,少子化の根本原因が託児所の不足だということに決定的な嘘があるということではないだろうか。根本原因というものはループしないものである。どだい,子供が欲しけりゃ,託児所だの,共働きだの,関係なしに生んでしまうんである(ウチみたいに?)。夫婦がどうして子供を「欲しがらない」のか,という単純な観点から追求したほうがよくはないか?(もちろん,現在,4 人にひとりが年収 200 万以下であるという強烈な事情も,深刻なわけだけど)

そのあと,昨年度の児童虐待件数が過去最大の 42,000 件に昇ったとのニュースを見た。なのに,一方で,児童相談所が実施した「強制立ち入り調査」は,1 年間でわずか 2 件にとどまったそうである。42,000 件と 2 件の差はなんなのか。これは,児童相談所が仕事をしていないという単純な話ではなくて,親子関係というものに第三者が立ち入ることのいかに難しいかを物語っているのである。可哀相な子供たち。

児童虐待件数に比べりゃ,託児所待ち 20,000 人なんて数字はゴミである(待っている人には申しわけないけれど)。だいたい年間の自殺者数よりも少ないのだ。こんなのに少子化要因を持って行くテレビ局っていったい何を報道しているのか。それですぐ政策批判にもっていって,薄っぺらい正義感を発揮したがる。

子供は欲しがられていないだけなのだ。託児所がないからだって! 生まれれば虐待される。可哀相な子供たち。日本は亡国の道を間違いなく歩んでいるのである。そのうち労働者を海外から一生懸命集めなければならない時代がくるかも(いや,もう来ている。介護労働者や,私の職場のようなコンピュータ技術者もそうである。日本人よりよく働くのだ)。いや,そのまえにどこかの国にlkdsjklgち4tjvdlkvjmぽrとgjk;cjhgp

妻札幌から帰る・C++ の本

|

妻が札幌から帰ってきた。北大構内,大通り公園,すすきの,下宿のあった北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 氏の手になる英語訳をベースに各国語に翻訳するプロジェクトが進行中らしい。ロシア語訳も重訳である。ざっと見たところ,少なくともとんちんかんな翻訳ではなかった。北園の前衛詩はリアルからの遁走であって,ある意味「誤訳」なんてありえない性質だともいえるから,私はじつはあんまりロシア語の問題についてぐだぐだ言うつもりはないし,その資格もない。そういうことで,思いついた点を書き送ってあげるだけにしようと思う。

火曜日は娘の絵画教室。普段は妻が迎えに行くのだが,今日は町内会の会合があって都合が悪く,私がその役目を務めた。JR 鶴見駅から歩いて 10 分くらいの場所にそのアトリエがある。

20 時半に絵画教室に着いてロビーでぼっとしていた。そこへ,赤いシャツを着たおかっぱ髪の綺麗な娘さんが,教室のゴミを収集しているのか,ゴミ袋を狭いロビーに運んで来た。ゴミ袋の口を締めようとするが,ゴミの量が多くて思うようにいかない。いきなりスカートから白い足をぬっと出してゴミ袋につっこみ,袋口に余裕を作ろうとゴミを踏みつけはじめた。私が代わってやるべきだったのかも知れなかった。

帰り,鶴見の駅前にある鹿島家という横浜家系のラーメン屋で娘と豚骨ラーメンと餃子を食べた。BOA の曲が店内に流れていた。「学校で BOA 人気なのか?」と私。「学校じゃタレントの話ばっか」---「どうせ,このクミッキー(註:ティーン雑誌の売れっ子モデル),超モレてなーい(註:「盛れてる」---「素敵!」という意味のギャル語),ってな話ばっかりなんだろ? お前らバカじゃね?」---「うるさいなぁ! そうそう,この前,小田原で酔っぱらいがケンカしてホームから落ちて電車に轢かれて死んだって事件,お父さん知ってる?」---「知らない」---「ハル×ちゃん,テレビのニュースで,それ見たんだって。で,バカな大人がいるんだなって話してたの。ところが,ハル×ちゃんのお父さんがそのあと,知り合いのお葬式に行くって会社休んだらしいの。それがね,小田原で酔っぱらってホームから落ちて電車に轢かれて死んだ人のお葬式だったって!」---「世の中狭いね」。

あのお洒落な赤いシャツの女の子のことも娘に聞いてみた。「赤い服来たおカッパのかわいい子いたよね。あれ誰?」---「ずいぶん前からいるけどよく知らない。前は生徒さんだったんだけど,今教室のお手伝いしてるみたい」。画学生か。

「お父さん,子供のころ,夢ってあった?」といきなり娘が言う。「あったさ。野球の選手になりたかった。野球ばっかやってたからな。なのに高校に入ったら小説家になりたくなった。いい加減なものさ」---「いまは?」---「江戸川乱歩賞をとること」---「なにそれ?」---「ミステリーの文学賞」---「で,なんか努力してるの?」---「なんも。会社勤めで精一杯。そうだね,夢というのはそれに向かって努力しないと意味ないよね」---「じゃあ,そんなミステリー書いたらあたしが挿絵を描いて本のデザインしてあげるよ」。

帰宅して妻と四方山話。妻は今日午,近所の友人宅に遊びに行った。川崎市の地元高校,中学校の風評などが主たる話題だったらしい。「生田高校はお勉強,多摩高校はお遊び,百合丘高校は恋愛,なんだって。K さん,なんでそんなことに通じてんのかしら」---「そういう学校の噂の好きな主婦って多いんじゃないの」。このちゃっかり美人の K 夫人,父親は私の知っているくらいに有名な,本居宣長研究の第一人者とされる凄い学者であり,姉は NHK 朝の連続ドラマの脚本を書くくらいの売れっ子脚本家なんである。世の中狭いね。

ロシア語形態素解析器 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 などの正規表現ライブラリと組合わせて,コンコーダンス・プログラム,ロシア語旧正書法変換プログラムなどを開発したいと思っている。

蘭,都市の一隅

|

妻が会社から蘭の花を一輪,というか一首もって帰宅した。そんなのを手に通勤電車に乗るなんて,傍目からみるとシュールじゃね?なんて。冷たい仄かな紅。

090702ran.jpg

* * *

会社の帰り,本屋に寄ろうと川崎駅で下車。量販店 DICE の入り口で煙草を吹かしていると,道路沿いにある保管庫かなにかのステンレス面に眼が留まった。長年の風雨やら排気ガスやらによる汚れが,独特のタッチの水墨画のように見えた。なかなか見応え(?)があったので携帯デジカメで一枚。ちょっと幻想的。

suibokuga.jpg

段落冒頭単語のボールド化

|

ロシアの 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段落目でボールド化が解除されてしまうのである。

Moon Calendar

Profile

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

Notice

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

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

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

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

Links

About this archive

Entries at 2009年7月 in chronological order.

Previous: 2009年6月

Next: 2009年8月

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