小道具の最近のブログ記事

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 サーバにインストールして運用するキットである。でもそんな面倒を抜きにして使いたい方は,弊サイトの「ロシア語電子コンコーダンス・サービス」を利用することができる。

ここのところ会社の PC の調子が悪かった。ブレードサーバのモジュールをセキュア PC から操作する形態で使っている。何年分ものメールが溜まり,ディスク C ドライブの残容量が少なくなり,とうとうウィルス・スキャンソフトのパターンファイル更新のための作業エリアすら確保できない状況になった。このままだと,さらに状況が深刻になる。なにしろ,私は毎日 100 通以上の電子メールを受け取っているのだ。そこで,使っていないソフトを片っ端から消去したり,一時ファイル削除ツールで掃除したりしたが,だめ。いろいろテキトーにファイルを消しまくっていたら,再起動の瞬間に Windows XP システムがおかしくなってしまったのだった。

タスクバー左端の「スタート」ボタンが消えた。タスクバーにあったショートカットアイコンが全滅。起動中のタスクが表示されない。IME のメニューも出ない。IE 6(いまどき!)は動くけどメニューバーが消え,テキストエリアで仮名漢字変換ができない。Office 2000(いまどき!)は動くのに,メモ帳や Adobe Reader,そしてなにより業務上最重要の自社製メールソフトが起動しなくなってしまった。「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります」と Windows からおしかりを受ける。ところが,インストーラそのものを起動しても,同じようにしかられるのだ。いったいなんのためのエラーメッセージなのか。

こんな状態では,根本的に手を打つ必要があるのだけど,やるべき本業の仕事もある訳である。自社製メールソフトには統合クライアント版と Light 版が用意されていて,普段使っている Light 版ではなく,余計な機能ゆえ重たい統合版だと動いた。アプリの切替えも Alt + Tab で可能である。IE でのテキスト入力も,Microsoft Word 上で作成した日本語テキストをコピペすれば,なんとかなった。「スタート」ボタンがなくても,Alt + Ctrl + Del からシャットダウンを選択できる。こうしてこの一週間,かかるオペレーションで仕事をしたのである。うん,確かに Microsoft Windows ってよくできている。ささいなミスにつけ込みひとをどん底に落としておいて(そもそもファイルを消しまくってたのは誰?),最後に少し親切にすることで気を引くタイプのようである(まさにアメリカ人の行動様式ではないか)。

今日,金曜日の定時後,ようやく時間が取れたので,リカバリに取りかかった。でも,現象からして,なにかしら必須のファイルを削除したからには再インストールしか手がなさそうに思われた。しかし,眼の前にあるのは Thin クライアントでしかなく,実際に命令が走行するマシンはセンターにあり,OS のメディアをおいそれと利用できる訳ではない。我が社の情報セキュリティは完璧なのだ。情管(情報管理部署)に話を持ちかけるとなると,余計な交渉や事務手続きが必要になり,来週さらに余計な労力を使わさせられそうである。ああ,さらにその先に業務に必要な大量のアプリの再組込み・再設定,地獄のデータ移行が待っている... ってな思い煩いをしつつ,まずはやはりエリアを空けるため,最後手段として腹を決め,2年経過した古いメールを別ドライブにエクスポートして削除することにした。4万通以上あるメールを処理するのに1時間。これで5GBの余裕ができた。

その間に,情管の関与なしにとりあえずできそうなことを考える。消した記憶のあるフォルダを,子分の PC からいただいて来るか。これは私の個人ファイルを上書きして二次災害を起こし,さらに酷い事態に陥れるかも知れない。却下。部下がいい加減な見積書を持って来る。叩いて,見直しを命ずる。却下。お前,ひでえ見積のバツとしてこの PC も月曜日までに ... などとパワハラめいた誘惑に駆られたが,抑え込む。そもそもこれは私自身の自業自得というものである。IE でググってみたがこれという解決策が見当たらない。トルストイが言ったように,不幸はそれぞれの姿で不幸な訳であって,計算機環境の壊し方は千差万別,そう簡単に対処法が見つかるはずはなさそうであった。

結局,Service Pack をもう一度適用してみることを思いつき,Microsoft のサイトからダウンロード。350MB の大容量通信もいまや煙草を吸う間に終わってしまう。これがバッチリだったようで,見事に回復した。ウィルス・パターンファイル更新も無事終了。その後,なんかイヤな予感がして情管の掲示板をみていたら,「Service Pack 3 の適用は沙汰あるまで禁止」との通達を見つけた。自動配信ソフトウェアが未対応だからというのである。しまった,Service Pack 2 にしておけばよかった。いまさらやり直す気力は失せていた。まあ,仕事に必要なソフトは完全に動くようになったのでいいや。

それにしても,我ながら軽率に過ぎる。同じ軽はずみで自宅サーバの Web 環境を壊したばかりであった。呆れる。こういうことは続けて起こるものである。溜息が出る。本業の作業環境はおまんXに直結するだけに MUST の意気込みで取り組むのだが,一方,自宅サーバについては日頃の作りっぱなしのごちゃこちゃ,ノーコントロール,足場の残骸を思うにつけ,何十年も散らかした部屋の後片付けのように,面倒でやる気がなかなか出て来ないんである。喝!

月曜日,私は年休をいただいた。娘とボーリングに行った。娘も,その日は授業参観だった土曜日の振替休日で,しかもバレーボールクラブも珍しくお休み。ということで横浜に遊びに出たのだった。もともと WBC 日本代表の活躍の影響もあってバッティングセンターに繰り出すつもりだったのだけど,横浜駅西口近くにあるお目当ての遊興施設では,バッティングセンターは廃業されてしまっていた。まあボーリングでもよいかとなった。2 ゲームずつやって私の勝ち。「お父さん,意外とやるじゃん」--- でも 118 が最高だった。今,腕が痛くてしようがない。

お隣のレーンで,お年を召した奥様三人がプレーしていた。横目でちらちら窺うと,じつに上手い。ボールも自前のようであり,専用手袋も着けていて,相当の力の入れようが察せられた。奥様仲間でボーリングに夢中になるという話は珍しくないのかも知れない。ボーリングはあまり体力を要しないし,ゲートボールのような爺婆むささがなく,なにより誰かの顔を想像しながらピンをなぎ倒すことで鬱憤ばらしになる。お金がかかるよなあ,でもゴルフほどじゃないか,なんて貧乏臭いことを私は考えていた。

料金の支払いを終え,レーン横にあるボーリンググッズショップ前のソファーで一休みしていると,その奥様のうちの二人がショップにやって来た。ショップは昼休み閉店中で 15:30 開店との貼紙があった。開店まであと 15 分ある。「あーら残念ねぇ」とひと言発して奥様方はエレベーターを降りて行った。「あとちょっと待ちゃいいのに。お年寄りは残りの時間が短いだけ気短なのよ」と娘は口性ない。「おいおい,やめとけ,聞こえるぞ」と制するのにひと苦労であった。

* * *

今夜,晩ご飯のあと,娘のピアノ練習に付き合った。4 月 29 日にピアノ教室の発表会が予定されていて,今その課題曲をさらっている。シューベルト作曲 Impromptus OP. 90-4 変イ長調。バッハが好きな娘は,シューベルトのよさがいまいち解らないとこぼしていたが,内田光子の宝石のような名演 CD を聴いて,真面目に取り組むようになった。指はまあ回るようになった。Allegretto 3 拍子の軽快さとためらい,トリオの光と影を,まだ思うように出せない。暗譜もできていない。あと 10 日しかないのに大丈夫? シューベルトのあとは,バッハの『G 線上のアリア』を自己流に編曲したものを娘が聴かせてくれた。

* * *

愛用のライターが壊れてしまった。IMCO 製のオイルライターである。Zippo 用のフリント(発火石)を流用しているためか,なかなか発火せず,ぐりぐり圧迫しながら使っているうちにトリガーがバカになってしまったのだ。それでもまだ十分用途に耐える訳なんだけど,買い替えようか思案中。一個 700 円くらいでめちゃ安いのだ。

IMCO は since 1918 年。オーストリア・ウィーン製ということもあって,第二次大戦中におけるドイツ軍兵士愛用の一品である。 私にとっては,ロシア兵がドイツ兵からかっぱらった IMCO で煙草を吸う戦争映画シーンの記憶のほうが強く,このせいで IMCO を愛用するようになった。ありきたりの Zippo なんかより,小振りにして渋い。

imco.jpg

Amazon のリストマニアでロシア語学本と,LaTeX 本のリストを公開した。いずれも私を培ってくれた良書。

ロシア語学・私の必携
LaTeX 本・精選!

多言語辞書 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 インデックスを生成する。
  11. % su - m
    # mv jmdict.sdic /usr/local/share/dict
    # cd /usr/local/share/dict
    # mkary jmdict.sdic
    # ls -las jmdict*
    ... 23972286 Feb 12 23:24 /usr/local/share/dict/jmdict.sdic
    ... 82669060 Feb 12 23:26 /usr/local/share/dict/jmdict.sdic.ary
    #
    

  12. Emacs 初期設定ファイル .emacs に以下を設定する。和英辞典として JMdict を指定する。
  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
    						  (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++ 版よりもメモリを大食いし,その実行速度でも劣るかも知れない。

2 月 6 日のスミルノフ還暦記念コンサート Dream Journey 作品 140 初演は大成功だったようだ。Facebook に掲載された参加者のコメントで知った。そのときの写真などを拝見した。ソプラノ Erika Colon さんの晴着姿も so beautiful であった。録音でもよいので聴けたらなあ。

* * *

ブログのデザインを変更。これまでは出来合いのテンプレートをそのまま使っていたのだけれど,もう少し自分の好みに合うように調整した。ちょっと和風に,シンプルにということで。でもまだまだいまいち。

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) でも動作する。

友人から Facebook へのお誘いを受け,アカウント登録を行った。Facebook は米国の学生が作った SNS だそうである。SNS というと日本ではミクシィ Mixi が多くのひとの支持を得ているが,Facebook の進出で競争が激しくなっているのではないだろうか。

「友人」とだけ共有できる写真をアップロードしたりした。Facebook ではアルバム機能やイベント登録ができるようになっている。友人はロンドン在住のロシア人なので,書き込みはもっぱら英語。英辞郎が大いに役立っている。いま,ロシア語辞書もしこしこ作ろうかと考えている。

私の Web ページ,ブログも,口性ないこと,大人げない不用意なことをぽんぽん書いてしまい,一般的に顰蹙を買いかねないところもあり,この際,クローズドな Facebook に移行してしまおうかとも考えている。友人なら指摘してくれればすぐに訂正できる。

* * *

misima を訂正した。終止形が「う」で終わるワ行ウ音便活用動詞の旧仮名遣い変換に不正があった。「彷徨うて死ぬ」はこれでよいが,「彷徨うひと」は「彷徨ふひと」でなければならない。連用形の語尾のみ「う」にしなければならないのに,無条件に「う」にしてしまっていた。

今日,会社の帰り,虎ノ門の書店で『英辞郎第四版』(アルク) を購入した。英辞郎は,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 リファレンスには書かれている。

    角川文庫『源氏物語 ビギナーズ・クラシックス』を読んだ。「あらすじ+さわり古文」でもって,よいとこどりをしようとした。それなりに全体の趣きを把握することはできた。でも,時間をかけて本文全体をすべて読まないと,やはり作品時間を共有できない。まるで,いいときだけ顔を出す遊び仲間になったような気後れがある。よい一節も退屈な部分もおしなべて付き合ってこそ味わえる達成感がない。とはいえ,作品の世界的古典たる所以,源氏香,仮名遣いなどについて,いろいろ自分なりに考えることがあり,興味深い時間を過ごすことができた。

    昔,大学の教養部時代,国文学の講義で大朝雄二教授 --- 岩波新古典文学体系本『源氏物語』の校注者である --- が「源氏物語は女性のための文学だ」というようなことを冗談混じりにおっしゃっていたことを思い出した。作品は主に主人公の雅な女性遍歴を物語る訳だけど,雨夜の品定め,源の内侍 (好色な老女官) や末摘花 (鼻の赤い醜女) の描写などに,男性の独善的でご都合主義な女性観が如実に,残酷なまでに描かれていて,一方でそんな男の身勝手さを皮肉に眺める作者の眼差しも散見される。

    「[ ... ] 今よりのちの御心にかなはざらむなむ,言ひし違ふ罪も負ふべき」など,さしもおぼされぬことも,情け情けしう聞こえなし給ふことどももあめり。(現代語訳: [ 源氏は ]「[ ... ] 今後あなた [ 末摘花 ] に不満があった場合には,約束違反の罰を受けよう」と,それほど真剣に考えていないのに,いかにも情のこもったふうに言いくるめた。)
    『源氏物語 ビギナーズ・クラシックス』p. 158

    もちろん『源氏物語』は現代的な意味でのジェンダー文学ではない。しかし,薫を拒絶する浮舟の姿 --- 大ロマンの掉尾を飾る名場面 --- は,男女の仲,世の動かせない規範にしばられた女性の「ものあはれ」,運命的抵抗を象徴して感動的である。

    * * *

    本書には源氏香の解説が掲載されている。源氏香とは香道の遊技である。5 種類のお香をそれぞれ 5 袋づつ計 25 袋用意し,このなかから無作為に 5 袋を取り出し,順に聞き分けて同じ香の出現パターンを,対応する源氏の巻名で答える。香を聞き分ける熟練と古典の知識とを競う優雅な遊びである。香の組み合わせは全部で 52 通りあり,そのパターンは縦線とそれを結ぶ横線とで記号化され,「桐壷」と「夢浮橋」以外の (つまりはじめと終わりを除いた) 52 の巻名に対応づけられている。その印は本書中,巻の中扉に掲げられている。

    さて,そこで問題: 源氏香が 52 パターンとなることを数学的に示せ。これは高校数学における順列・組合せの面白い問題である。河添健・林邦彦共著『楽しもう!数学を』(日本評論社, 2002) に掲載されていた。同じ香が 1〜5 の何種類含まれるかで場合分けして,それぞれの組合せの数の和を求めればよい,とあった。源氏香は同じ香りがどこで現れるかに焦点があり,5 種類の香 A〜E において,ABBCD も CDDEA も同じ「夕顔」であるところが,この問題の難しいところである。高校生の方は自力で解いてみてください。なんでこんな話題を書いているのか。来年,子供が受験生になるからか。

    * * *

    さてさて,また一方で源氏香の記号を LaTeX で組版できないか探ってみた。それが今昔文字鏡フォントに含まれていることを知った。源氏香文様は,同じ香の場合縦線を横線で繋ぐシンプルなものなので,フォント形式でなくても TeX の作図命令で描画することもそれほど難しくはないと思う。とはいえ,さすが文字鏡である。ちょっと遊びで組んでみた。

    今昔文字鏡 LaTeX 用パッケージ一式,文字鏡フォントは『パソコン悠悠漢字術 2002』の付録 CD に収録されている。今昔文字鏡サイトなどのインターネット・リソースからもダウンロードできるはずである (ただし今昔文字鏡サイトのダウンロードサービスは 2009/1 現在再構築のためサービス停止中であり,多少古くても書籍を購入したほうがよいかも知れない)。

    TEXPACK.TBZbzip2, tar で解凍し,添付の install.txt ドキュメントに従って LaTeX システムに追加する。もちろん文字鏡フォントも,TrueType ないし Type1 いずれかの形式のファイルを TeX, dviware が参照できるパスに格納しておく必要がある。ここでは,『パソコン悠悠漢字術 2002』添付 CD から UNIX システム (Mac OS X 含む) にインストールする方法を,以下に示す。pLaTeX2e はすでにインストール済みとする。tcsh シェルでのオペレーションである。

    1. まず CD 内 TEX ディレクトリ以下にあるファイル TEXPACK.TBZ 及び PFB, TFM, JFM ディレクトリ一式をワークディレクトリ (仮に ~/tmp/mojikyo とする) にコピーする。オペレーションは省略。
    2. ワークにコピーした PFB ディレクトリの下にある文字鏡 Type1 (PostScript) フォントを解凍する。フォントアーカイブがいくつもあり,ひとつひとつ解凍するのは面倒なので,tcsh foreach 文で纏めて処理する例である。解凍にはしばらく時間がかかる。
    3. % cd ~/tmp/mojikyo/
      % ls -F
      JFM/        TEXPACK.TBZ*
      PFB/        TFM/
      % cd ~/tmp/mojikyo/PFB
      % foreach i (PFB TFM JFM)
      foreach? cd $i
      foreach? foreach j (*.TBZ)
      foreach? bzcat $j | tar xvf -
      foreach? end
      foreach? cd ..
      foreach? end
      ... 解凍にしばらく時間がかかる ...
      

    4. TEXPACK.TBZ を解凍し,スタイルファイル,マップファイルを TDS(TeX Directory Standard)所定の位置にコピーする。さらに各種フォントファイルも TeX フォントツリーに移動しておく。次のようなオペレーションを行えばよいはずである。

      % cd ~/tmp/mojikyo
      % ls -F
      JFM/        TEXPACK.TBZ*
      PFB/        TFM/
      % bzcat TEXPACK.TBZ | tar xvf -
      % su -m
      # setenv TEXDIR /usr/local/teTeX/share/texmf-local
      # mkdir -p $TEXDIR/fonts/{map/dvips,tfm,type1}/mojikyo
      # mkdir -p $TEXDIR/tex/latex/mojikyo
      # cp -p style/* $TEXDIR/tex/latex/mojikyo/
      # cp -p dvips/* $TEXDIR/fonts/map/dvips/mojikyo/
      # mv TFM/*.tfm JFM/*.tfm $TEXDIR/fonts/tfm/mojikyo/
      # mv PFB/*.pfb $TEXDIR/fonts/type1/mojikyo/
      # mktexlsr
      

    5. フォントマップを登録する。
    6. # updmap-sys --nomkmap --enable Map=momin.map
      # updmap-sys --nomkmap --enable Map=moten.map
      # updmap-sys
      

    これで文字鏡 LaTeX 環境の作成は完了である。文字鏡フォントを LaTeX で使うためには,Type1 フォント使用オプション指定でスタイルファイル mojikyo.sty を読込んでおく (\usepackage[type1]{mojikyo})。\MO{文字鏡番号} 命令によって文字鏡フォントを出力することができる。源氏香フォントは文字鏡番号 064801--064852 範囲にある。dvips, dvipdfmx によって dvi ファイルから,それぞれフォント埋め込み PostScript ファイル,PDF ファイルを生成できる。EUC で記述した LaTeX 原稿 (genjiko.tex) をコンパイルし,PostScript, PDF を生成するまでは以下のとおりである。

    % platex --kanji=euc genjiko
    % dvips genjiko.dvi -o
    % dvipdfmx genjiko.dvi
    

    以下のような LaTeX 原稿を書いて組版してみた。組版結果の画像を原稿の下に示す。PDF もここに置いておく。

    % 今昔文字鏡フォント 源氏香出力
    \documentclass[a4j,12pt]{jsarticle}
    \usepackage[type1]{mojikyo}% 今昔文字鏡スタイル (PostScript フォント指定)
    \pagestyle{empty}
    \long\def\kan#1#2{% 巻名・源氏香出力マクロ
      \parbox[c]{5zw}{\hfil(#1)\hfil\baselineskip=18pt\relax\par%
      \centering\bgroup\LARGE\ifx#2\empty  \else\MO{#2}\fi\egroup}}%
    \begin{document}
    \def\arraystretch{2.5}%
    \begin{center}
      \begin{tabular}[c]{cccccc}
        \kan{桐壺}{\empty}&\kan{帚木}{064801}&\kan{空蝉}{064802}&
        \kan{夕顔}{064803}&\kan{若紫}{064804}&\kan{末摘花}{064805}\\
        \kan{紅葉賀}{064806}&\kan{花宴}{064807}&\kan{葵}{064808}&
        \kan{賢木}{064809}&\kan{花散里}{064810}&\kan{須磨}{064811}\\
        \kan{明石}{064812}&\kan{澪標}{064813}&\kan{蓬生}{064814}&
        \kan{関屋}{064815}&\kan{絵合}{064816}&\kan{松風}{064817}\\
        \kan{薄雲}{064818}&\kan{朝顔}{064819}&\kan{少女}{064820}&
        \kan{玉鬘}{064821}&\kan{初音}{064822}&\kan{胡蝶}{064823}\\
        \kan{螢}{064824}&\kan{常夏}{064825}&\kan{篝火}{064826}&
        \kan{野分}{064827}&\kan{行幸}{064828}&\kan{藤袴}{064829}\\
        \kan{真木柱}{064830}&\kan{梅枝}{064831}&\kan{藤裏葉}{064832}&
        \kan{若菜上}{064833}&\kan{若菜下}{064834}&\kan{柏木}{064835}\\
        \kan{横笛}{064836}&\kan{鈴虫}{064837}&\kan{夕霧}{064838}&
        \kan{御法}{064839}&\kan{幻}{064840}&\kan{匂宮}{064841}\\
        \kan{紅梅}{064842}&\kan{竹河}{064843}&\kan{橋姫}{064844}&
        \kan{椎本}{064845}&\kan{総角}{064846}&\kan{早蕨}{064847}\\
        \kan{宿木}{064848}&\kan{東屋}{064849}&\kan{浮舟}{064850}&
        \kan{蜻蛉}{064851}&\kan{手習}{064852}&\kan{夢浮橋}{\empty}\\
      \end{tabular}
    \end{center}
    \end{document}
    

    genjiko.jpg

    * * *

    さてさて,角川文庫『源氏物語 ビギナーズ・クラシックス』を読んでいて,仮名遣いについても少し考えるところがあった。

    本書に「鈴虫」の一節からの写本表記が掲載されている。紫式部による『源氏物語』オリジナルは失われたことになっている。現在残っているのは鎌倉時代以降の写本だという。それでもその写本は,紫式部の時代の書き方からそう隔たっていないと思う。それらは変体仮名を含む草書体である。

    次はその表記をこんにちの活字にしたものである:「十五夜農遊ふくれ二佛の於万へ二宮於盤して八しちかくな可め堂万ひつゝ念珠し堂万婦わ可支あ万支三多ち二三人盤那多て万徒るとてなら須あ可つ支の於と,三徒のけ者ひなときこゆ」(pp. 330-1) 云々。ちなみにこのくだりは二千円札の裏面にその一部が刷られている。大学の国文学科でまじめに印影本を解釈する訓練を受けた者には,これがすらすら読める。私などは本当に尊敬してしまう。

    しかし,普通の読書人には,次のように歴史的仮名遣いに「改変」されていないと理解できないのではないだろうか:「十五夜の夕暮れに,仏の御前に宮おはして,端近うながめ給ひつゝ念誦し給ふ。若き尼君たち二三人,花奉るとて,鳴らす閼伽坏の音,水のけはひなど聞こゆ」。

    写本の表記は,変体仮名を含むだけでなく漢字の宛て方も独特であり,歴史的仮名遣いとの差異が著しい。歴史的仮名遣いでは多様な変体仮名が,現代でも使われる仮名文字に包摂され,画一化され,書写したひとが籠めたかも知れぬ意図(草書体としての見た目の麗しさ等)が捨象される。「歴史的仮名遣いこそが日本の伝統的な仮名遣いである。現代仮名遣いは愚かな誤謬であり,日本の伝統との断絶を齎す。すべからく歴史的仮名遣いに復古すべきである」と宣うひとたちは,この『源氏物語』写本の仮名遣いを見てなんと言うだろうか。「伝統」って何? この写本から,「歴史的仮名遣い」が自然に,合理性に基づいて生まれ出た伝統的形式などではなく,むしろ,仮名遣いとはその時代の要請に応じた統制を受け,変幻自在に変化してきたということが,窺われる。古典は,校訂者による言わば「歴史的仮名遣いによる改竄」によってこそ,我々にとって親しいものとなっているのだ。

    歴史的仮名遣い復古主義者・「正字正仮名」信奉者には,きちんと一次文献を調べ表記の「実態」をよく知る国語国文学研究者ではなく,雰囲気として古めかしい「歴史的仮名遣い」こそが「伝統的で正しい」と勘違いしているに過ぎないひとが,実は多いのではなかろうか。彼らは仮名遣いの「実態」を知らずに,契沖及び明治以降戦前までの仮名遣いを基準に議論しているだけのように私には思われる。

    国語表記は「伝統」の本質ではない。「正字正仮名」信奉者が大げさに言う歴史的仮名遣い表記の「正統性」を杓子定規に受入れてしまうと,現代人が『源氏物語』などの古典と真に繋がるための本性を逆に喪失してしまう。古典の表記の真の姿は「歴史的仮名遣い」から大きく乖離しているのだから。まあ,「正字正仮名」信奉者が「現代仮名遣いは伝統との断絶だ」なんて大げさに危機感を煽るのは,文化人ぶっているだけだと私には思われる。

    * * *

    本書は今昔文字鏡フォント活用の実践的解説書である。付録 CD にはフォントだけでなく,上記 LaTeX パッケージなどのツールが収録されている。惜しむらくは,この 2002 年版では LaTeX での活用方法が割愛されてしまったこと。でも,添付 CD の TEX ディレクトリにある usage.pdf を参照すれば,使い方を知ることができる。

    最近,自宅のメールサーバから fetchmail でメールを取得しようとすると,「認証に失敗した」などというエラーが出るようになった。調べたところ,メールスプールのフォーマットが壊れているとこのような事態になるようである。

    メールスプールを修復するには,次のように formail を使う。以下のオペレーション例における user はメールスプールファイルであり,実際はメールアカウントのユーザ名と同一の名称に読み替えればよい。

    % cd /var/mail
    % cp -p user /tmp/user.bak
    % formail -b < user > /tmp/user
    % cp /tmp/user user
    

    しかし,これで修復してみると,From ヘッダも To ヘッダも何もない空メールであることがわかる。あまりに頻繁にこの現象が発生するので,その根本原因を探ってみた。procmail のログをみると,SpamAssassin (スパムチェッカー) が SIGPIPE シグナルで異常終了しているとき ([xxxxx] warn: spamassassin: killed by SIGPIPE メッセージ),この状態に陥るようである。この場合,チェックされたメールはただの空白文字でスプールされてしまい,結果的にメールスプールが壊れた状態になってしまうという訳であった。なぜ SpamAssassin がコケるのか。Assassin とは「暗殺者」の意味だけど,殺し屋がターゲットを始末する前に自らが不慮の死に襲われるなんてマヌケではないか。詳しくはわからない。いちばんありそうなのはメモリ不足だろうか。ご存知の方はご教示いただけると幸いである。

    SpamAssassin が異常終了するとメールが壊れるというのは大問題である。大事なメールがスペースに化けて失われてしまうのだから。アベンドの原因は不明である以上,適切な対策を施すことは難しい。とりあえず SpamAssassin を 3.2.5 にバージョンアップし,これまで spamassassin コマンドを使用していたのを,spamd に切替えることにした。spamd はデーモンとして動作する SpamAssassin 付属のプログラムであり,より高速にスパムチェックを行うとのこと。よって所要リソースも spamassassin コマンドより少ないだろうと期待したのである。

    FreeBSD では mail/p5-Mail-SpamAssassin を ports でインストールすると,spamd とともに,これを起動するための sa-spamd.sh が組込まれる。/usr/local/etc/rc.d ディレクトリにおいて sa-spamd.sh start を実行するか,もしくは /etc/rc.conf に spamd_enable="YES" 行を追加してリブートすると,spamd が起動して常駐する。

    spamd にチェックを依頼するクライアントプログラムは spamc である。procmail で自動的にスパムチェックする場合は,以下のような記述を $HOME/.procmailrc に追加する。

    :0fw
    * !^X-Spam.*
    | /usr/local/bin/spamc
     
    :0:
    * ^X-Spam-Status: Yes
    spam/.
    

    いまのところ,受信したメールの処理状況を見ているいる限り SIGPIPE アベンドは出ていない。しばらくは受信したメールすべてをバックアップした上で,スパムチェックを施す運用とすることにした。

    とある顧客でシステム性能問題が沸騰していて,ここ三ヶ月ほど極めて危機的な状況にある。業務単体性能の取得,トレースの解析,高トラフィック試験などをやって来た。その過程でデータベースのインデックス設定,ロギング設定の対策をやった。改善提案のうち,あとはアプリケーション・オブジェクト (このシステムはいまだに CORBA ベースなんである) の並列処理とデータベース・ソフトのキャッシュ・チューニングとを残すところとなった。

    不幸はたかってやって来る。別顧客のシステム基本設計がいま山場である。また別の顧客システムで障害が発生する。てな具合で,今回も担当主任と担当者の首が回らなくなって来た。追加の仕事が湧いても人はおらず。打つ弾はいつも同じ。いくらでも人を雇いたいが,そのための金もなし。ハードやソフト開発には金を出してもシステム・エンジニアには出し渋る客が多いのだ。企業というのは本来的に人に冷たい訳である。だからと言って「あんた,性能・信頼性設計支援費用見積りを断ったよね。人的資源に対して金をくれないそんなあんたのいまさらのわがままは無視!」とも言えない。「性能・信頼性はメーカーの責任だ」と撥ね付けられる。業者は弱いのだ。

    こうしてシステム・エンジニア,プログラマはご飯を食べさせてもらえずに仕事ばかりが増えて,客からは責めまくられ,社内からは吹き出す赤字で突き上げを喰らい,絶体絶命に追い込まれてゆく。体を壊すだけでなく,心を病んでしまう者も出て来る訳である。世のコンピュータ・エンジニアの皆さん,自分ひとりだけと思い詰めないでプワーッと,暢気にゆきましょう!

    それはさておき,私は一応プロジェクト・マネージャなので,基本的には作業をグリップせず担当者に任せ,工程管理と懸案事項・リスク管理に徹することにしている。しかし,ここに来て担当者のアブれた作業を外注するだけでは回せなくなり,顧客から責められている性能問題に自分の手を染めることになった。それ自体,私のマネージメント能力を疑われてもしようがないのだが。私はプライベートでは misima,コンコーダンスプログラム, LaTeX マクロ・スタイルを拵えたりしているのに,本業ではまったくシステムに触らないのである。データベースのチューニング,メモリ設計なんて何年ぶりか。

    Windows パフォーマンスモニタで CPU,メモリ,ディスクリソースを調査した。どうもディスクネックで,CPU,メモリは余裕しゃくしゃく。そこでデータベースの高頻度データをメモリ・キャッシュしてディスクアクセス削減により高速化を図ることにした。データベース・ソフトは自社製 RDBMS である。商用システムでは Oracle 全盛のこの時代,国産の RDBMS と聞いて小馬鹿にして吹き出すヤツがいる。私にはむしろ,他人の製品を買って来て,アプリを付け加えることでしか商売のできないほうが哀れである。最後まで責任をもってサポートできるこの RDBMS に,私は担当顧客の要求仕様をいくつも注入して来たし,たいへんな愛着がある。本製品の統計情報機能を利用してキャッシュ・ヒット率を調査し,テーブル・エリアの利用状況をもとにチューニング案を策定した。知り合いの RDBMS 設計者とレビューし,顧客提案資料を纏めた。Oracle を使っているいったい誰がその設計者と一体になってチューニングを施すことができようか。そういう点で,私はなにからなにまで自社で面倒を見ることの出来るこの RDBMS 製品に,メーカーとしての誇りをもっている。

    今日午後,麹町にある顧客先にチューニング案の説明に赴いた。顧客ビルは,地下鉄半蔵門駅を出て国立劇場の方に向かって徒歩数分,英国大使館,皇居のすぐ側の一等地にある。さすが日本を代表する電機メーカーの情報システム部門。いつもなら子分に一任して行かせるのだが,今回は若い営業担当者と私の二人だけであった。キャッシュ・チューニングの考え方,変更パラメータ,メモリマップトファイルの注意事項 (Windows は,巨大なメモリファイルシステムを使った運用で軽率なオペレーションを行うと,NTFS キャッシュのストアでディスクを占有し,オンライン・システムがほぼスローダウンしてしまうことがある),Windows プロセス・メモリ・ストレージ設計等々について,時に冷や冷やしながら,説明した。チューニング試験日程の検討を依頼した。久しぶりに手を動かした資料をもとに,顧客を相手に珍しくテクニカルな話題でしゃべりまくって疲れ果ててしまった。

    会議資料の準備でお午を抜かしてしまったので,打合せの終わった午後 6 時には,腹がペコペコだった。ちょっとした開放感も手伝って,神保町に出ることにした。地下鉄で半蔵門からわずかに二駅である。中古レコード屋で,セルジュ・チェリビダッケがミュンヘン・フィルを指揮したモーツァルト『レクイエム』ライブ録音と,エリオット・ガーディナーが珍しくウィーン・フィルを振ったブルックナー『ミサ曲ニ短調・モテット集』の二枚,輸入盤 CD を購入。夕食を摂り,神保町のいつも行く喫茶店で,コーヒーを飲みつつ,宮部みゆき『火車』を堪能した。クレジット・カードの支払いに端を発してサラ金地獄に陥った孤独な若い女性。彼女を殺害して成り済ます女性。現代の豊かさへの幻影と社会的陥穽。悲しい物語。日テレの『相棒』でも同じような話があったけど。帰りの電車,アコムのすぐ横に自己破産申告相談を承る弁護士事務所の広告。やり切れない。

    Celibidache Plays Mozart's Requiem
    S. Celibidache(Dir)
    Münchner Philharmoniker
    EMI Classics (2004-10-04)
    Bruckner: Masse Nr. 1 d-moll für Soli, Chor und Orchester; 5 Motetten.
    J. E. Gardiner(Dir)
    The Monteverdi Choir
    Wiener Philharmoniker
    A Universal Music Company (2001-02-25)

    弊ブログ・サイトの CMS ソフトウェア Movable Type 4.1 (MT-4.1) で CAPTCHA 認証設定を施した。これまでブログのコメントはユーザ登録・認証しないと投稿できないようになっていた。スパム・コメントがあまりに多く,コメントを付けてくれるユーザも極めて稀だと思われたので,これまで初期設定のまま適当に運用してきたのだけれど,CAPTCHA 認証によってコメント投稿の敷居をもう少し低くしようと思った訳である。

    CAPTCHA 認証とは,ランダムな英数字を人間が見れば認識できる画像で表示し,それをユーザに入力させる仕組みによって,機械的スパムを抑止する認証方式である (最近はこれをもすり抜けるスパム投稿ソフトがあるらしいのだが)。MT-4 ではそのプラグインが実装されていて,設定変更で利用可能になる。その設定は MT ドキュメント「コメントに CAPTCHA 認証を利用する」に詳しい。これを見れば設定方法がわかるのだけど,以下,私の行った設定メモを簡単にしるしておく。

    1. CAPTCHA 認証のための MT 環境は Image::Magick Perl モジュールを必要とする。これを CPAN から入手し組込んでおく。
    2. 「コメント設定」--「コメントポリシー」--「即時公開する条件」で「自動的に公開しない」にチェック。これは MT 管理者のポリシーによって選択すればよい。弊サイトの場合,「自動的に公開する」に設定してしまうと公序良俗違反やいわゆる「荒し」のコメントが野放しになる可能性があるので,私の「検閲」を経た上でコメントが公開されるよう「自動的に公開しない」を選択した。
    3. 「コメント設定」--「表示オプション」--「CAPTCHAプロバイダ」に「Movable Type 既定」を指定する。
    4. 「登録/認証設定」で「認証なしコメント」にチェック。「メールアドレスを要求」は随意でチェック。その他の項目:「Movable Type」, 「OpenID」, 「LiveJournal」, 「Vox」はオフにしておく。
    5. 「テンプレートモジュール」--「ブログテンプレート」の「コメント入力フォーム」を開き,<MTIfNonEmpty tag="MTCaptchaFields"> コントロール・タグの記述内容を以下のように修正する。
    6. <MTIfNonEmpty tag="MTCaptchaFields">
        <div id="comment-form-recaptcha">
          <MTIfCommentsAccepted>
            <MTIfRegistrationRequired>
              <MTElse>
                <$MTCaptchaFields$>
              </MTElse>
            </MTIfRegistrationRequired>
          </MTIfCommentsAccepted>
        </div>
      </MTIfNonEmpty>
      

    7. 上記が完了したら,再構築を行う。

    以上で環境設定は終了である。ブログ記事のコメント入力の画面に次のような CAPTCHA 画像が表示されるはずである。

    captcha_img.jpg

    ネットを検索していたら,面白いロシア語学習サイトを見つけた。「ロシア語習得支援サイト ruruwara.com --- ロシア人をロシア語で笑わせて!」というサイト。最近はこのような事業が成り立つようになったのかと感心してしまった。

    ruruwara.com は教科書を通信販売で提供し,例文の発音を YouTube の動画で公開するというユニークなものである。サイトの副題から想像されるように,例文はくだけた会話主体のものである。しかも,その動画たるや,ロシア美女がちょっときわどいお色気でもって例文を発音している一風変わったコンテンツである。

    1980 年代前半,私が大学に入ってロシア語を習いはじめたころは,ロシア人の生の発音が聞けるロシア語教材といえば NHK 講座もしくはソ連製中心の LP レコード/カセットテープくらいしかなかった。社会主義国家のお堅いアナウンサーが「話者のあとに続けて繰り返しなさい。そして比較しなさい」と規律正しく発音練習を促す。例文もいたって真面目な内容に限られていた。ruruwara.com はというと,金髪・ノーブラ・ボディコンの女性が「わたしはあなたのもの」みたいな例文を速度を変えて繰り返しながら,胸の谷間を「見せつける」。視聴していると目的がわからなくなってきた。隔世の感がある。私でさえ信じられない時代になった。明治は遠くなりにけり。

    興味のある方はどうぞ。このサイトで学習しても,プーシキン,ドストエフスキイを読めるようにはならないだろうけど。効果 (どんな?) のほどを私が保証する訳ではありませんので悪しからず。

    Mac OS X の Emacs.app Version 9.0-rc2 をインストールした.Mac 用の Emacs も Cocoa 対応になり,Emacs Version 23 になっている.

    私は Mac OS X では通常,X11-Emacs を利用している.BDF フォントが使えて多言語環境としては最適であると思う.一方 Mac OS X のアプリケーションとのデータのやり取りでは Mac OS X ネイティブの Emacs が優れている.

    Emacs 初期設定ファイル .emacs に以下を追加して,X11-Emacs と Emacs.app で使い分けるようにした..emacs-23.el に Emacs.app 用の定義を記述しておく.

    (if (string-match  "^23" emacs-version)
        ;; For Emacs.app 
        (load "~/.emacs-23.el")
      (if (string-match "^22" emacs-version)
          ;; For X11-Emacs 22.1 
          (load "~/.emacs-22.el")
        )
      )
    

    なんといっても,Emacs.app は仮名漢字変換として「ことえり」が使えるところが嬉しい.初期状態では日本語が表示できなかったが,Option メニューからフォント設定を「Monaco -- Regular -- 12pt」に変更したら表示できるようになった.この場合も,通常の日本語フォントにある「・」(中黒) や「▼」などの一部記号がいわゆる豆腐になってしまうのが難点である.多言語入力・表示に拘らないならフォントを Mac OS X 標準日本語フォント「ヒラギノ角ゴシック」に設定することをお勧めする.

    Monaco フォントではロシア語も古典ギリシア語もタイ語もヴェトナム語も表示できる.教会スラヴ語,古スラヴ文字はダメだったけれど,実用において十分である.教会スラヴ語,古スラヴ語をきちんと表示したい場合は,「Optima -- Regular -- 12pt」を選択すればよい.

    多国語インプットメソッドについては通常の Emacs と同じである.私の書いたスラヴ語/古典ギリシア語インプットメソッドも OK であった.

    旧仮名遣い・旧字変換支援 misima (SOAP Web Service) も,Utf82TeX 多言語文字 TeX コンバーターも問題なく動作した.ただし,/usr/local/bin にある外部コマンドを Emacs.app から呼び出すには,標準設定ではダメで,Emacs 設定ファイル (上記例に即して言えば .emacs-23.el) に対し,以下のようにコマンドパスを追加しておかなければならない.

    ;; コマンドパスの追加
    (setq exec-path (cons "/usr/local/bin" exec-path))
    (setenv "PATH"
            (concat '"/usr/local/bin:" (getenv "PATH")))
    

    misima, Utf82TeX を Emacs.app から使うには,次のような設定をしておく.それぞれの Emacs Lisp を Emacs が参照できるロードパスに格納しておくのはもちろんである.

    ;;
    ;; UTF-8 多言語 -- TeX コード変換支援 Utf82TeX
    ;; - utf82tex コマンドの絶対パスを utf82tex-path に設定する.
    ;;
    (require 'utf82tex)
    (setq utf82tex-path "/usr/local/bin/utf82tex")
    (setq utf82tex-rc   "/usr/local/etc/utf82tex/utf82texrc")
    (setq utf82tex-out-encoding 'utf-8)
     
    ;;
    ;; 旧仮名遣い・旧字変換支援 misima SOAP Web Service 版
    ;; - misima.jar を CLASSPATH に設定しておく.
    ;; - misima.sh の絶対パスを misimasoap=path に設定する.
    ;;
    (require 'misimasoap)
    (setq misimasoap-path "/Users/isao/bin/misima.sh")
     
    ;;
    ;; 旧仮名遣い・旧字変換支援 misima ローカル版 (現在非公開)
    ;; - misima コマンドの絶対パスを misima-path に設定する.
    ;;
    (require 'misima)
    (setq misima-path "/usr/local/bin/misima")
    (setq misima-rc "/Users/isao/.misimarc")
     
    

    Safari との間でコピー&ペーストもできるし,これからはこちらがメインとなりそうである.以下のスナップショットは,多言語混在文書 (日本語,フランス語,ドイツ語,ロシア語,古典ギリシア語,韓国語,タイ語) の表示例である。

    emacsapp23.jpg

    ※ 2009/09/07 付記
    その後,Mew 作者で有名な山本氏のブログで Emacs-23 のフォント設定を知り,日本語をヒラギノ丸ゴシック,キリル文字を DejaVu Sans Mono に設定してみた。これで「・」(中黒) や「▼」などの一部記号がいわゆる豆腐になる問題が解消した。キリル及びギリシア文字は ISO 国際標準にあるものは英字と同じ DejaVu を,Unicode にしかない古スラヴ文字や古典ギリシア語複式アクセントのギリシア文字は Lucida Grande で表示する設定である。

    ;; フォントフェースの設定
    ;; see http://d.hatena.ne.jp/kazu-yamamoto/20090122/1232589385
    ;;; デフォルトフォント: DejaVu Sans Mono
    (set-face-attribute 'default nil
                        :family "DejaVu Sans Mono"
                        :height 120)
    ;;; 日本語フォント: ヒラギノ丸ゴシック 
    (set-fontset-font
     (frame-parameter nil 'font)
     'japanese-jisx0208
     '("Hiragino Maru Gothic Pro" . "iso10646-1"))
    (set-fontset-font
     (frame-parameter nil 'font)
     'katakana-jisx0201
     '("Hiragino Maru Gothic Pro" . "iso10646-1"))
    (set-fontset-font
     (frame-parameter nil 'font)
     'japanese-jisx0212
     '("Hiragino Maru Gothic Pro" . "iso10646-1"))
    ;;; Unicode フォント: Lucida Grande
    (set-fontset-font
     (frame-parameter nil 'font)
     'mule-unicode-0100-24ff
     '("Lucida Grande" . "iso10646-1"))
    ;;; キリル,ギリシア文字 
    ;;; - iso に定義されているものは DejaVu Sans Mono で表示
    ;;; - そうでない Unicode 独自のものは Lucida Grande で表示 
    ;;; - mule-unicode-0100-24ff より後に定義すること
    ;;; キリル文字フォント: DejaVu Sans Mono
    (set-fontset-font
     (frame-parameter nil 'font)
     'cyrillic-iso8859-5
     '("DejaVu Sans Mono" . "iso10646-1"))
    ;;; ギリシア文字フォント: DejaVu Sans Mono
    (set-fontset-font
     (frame-parameter nil 'font)
     'greek-iso8859-7
     '("DejaVu Sans Mono" . "iso10646-1"))
    

    なお,set-fontset-font 関数,set-face-attribute 関数で指定するフォントファミリー名は,fc-list コマンドで表示される一覧から選択するとよい。":" の前までがファミリー名として使用できる。

    emacs-app-fonts.jpg

    iPod が壊れてしまった.3 年前の 40GB モデルである.音楽のみならず朗読や語学データなど 200 時間くらいのオーディオデータを格納していた.間欠的にカチカチと悲鳴を上げて,痛々しい.ディスクが飛んだようである.もういちど初期化して延命できないかとも思ったが,無理みたい.

    音楽再生で異常を来たしてもゲームは動いていた.この期に及んではじめて iPod 付属ゲームで遊んでみた.ところが,Power Mac G5 に USB 接続した瞬間に「サポートに連絡せよ」とのメッセージが出て,フリーズし,もはやなにも出来なくなってしまった.

    妻におねだりして,新しい 80GB モデルを Apple Store に発注してしまった.お小遣いから分割払いということに.これまで 10GB もあれば事足りた訳で,80GB もの容量は必要ないのだけど,その下になるといきなり iPod nano 8GB になってしまうらしい.中途半端.

    misima SOAP Server をインストールして,リモートクライアントから実行すると,変換はうまくゆくのに,Tomcat のログに "log4j:ERROR Could not open [log4j.xml]." なるエラーが出る.misima SOAP の実行ログも出力されていない.log4j.xml は標準的な場所 webapps/axis/WEB-INF/classes に格納しているのに.

    なんのことはない.Tomcat の起動スクリプトに log4j.xml へのクラスパスが通っていなかったためのようである.FreeBSD ports でインストールされた起動シェルに log4j.xml, Axis 関連 jar への CLASSPATH を設定して再起動すれば解消した.

    SLAVISTIKAのために論文を書き直した.研究室の方から論文の投稿書式をいただいたところ,Microsoft Wordでしか受け付けられないことが判明した.LaTeXで組んだPDFを入稿しようとしていた私は愕然としたが,しかたない.

    LaTeXをWordに変換するソフトの体験版をダウンロードして試してみた.ロシア語を扱えないばかりか外部マクロスタイルを理解せず,まったく使い物にならなかった.しかたなくLaTeXで組んだPDFからテキストをコピーして,Wordに貼り付けて整形した.面倒この上ない.時間がかかるだろうと悲観していたが,今日一日集中して仕上げることができた.ロシア語をT2Aエンコーディングで組むと,PDFの選択テキストをキリル文字できちんとWord上にペーストできる.

    しかしWordでないと論文を受け付けないというのは学術研究機関らしくないと私は思う.WordはほぼWindowsユーザを前提とするわけであるし,ソフトの購入を投稿者に強要することになる.私は学術論文集はLaTeXで編集するのが一番だと信じている.Wordと違って多くのOSで動作するし,プリンタドライバ要因だけで仕上がりが変わるWordと違って,機種に依存せず同一の文書が得られるし,フリーにして高品質である.複数の投稿者の論文の体裁を統一するのもLaTeXのほうがマクロの調整によってWordより容易だと思われるからである.LaTeX人口を考えるとWordの採用は分からないではない.でも,数学や物理学の学会はLaTeX入稿が希ではないと聞く.それは投稿者に対し投稿規程として課す制約のひとつでしかないのである.

    私はWindowsが多言語を扱えない時代に,それゆえにUNIXを使うようになり,LaTeXを知るところとなった.ロシア語が日本語,ドイツ語などと同時に組めるLaTeXに血道をあげるようになってしまった.正書法をきちんと踏まえて外国語を組めること,淵源において数学者が自分の著書を組むために開発し無料で配布したこと,その素晴らしい言語パッケージの多くがその道の研究者の手になるものであることなど,LaTeXこそ理科のみならず,外国語,古典籍の複雑な組版が必要な文科にも適した学術研究論文作成ツールだと考えるのである.

    論文をWordに書き換えてみて,正直なところ,文書の仕上がりの品質はLaTeXには遠く及ばない.章立て,文献参照,引用,図表,キャプションなど,文書構造に応じて文書作成をコントロールできるほうが,見た目を調整してゆくワープロよりも美しく,効率よく論文集を仕上げるのに資すると思う.ロシア語フォントもWindowsのTimes New RomanのプロポーションよりLaTeX Babel標準のLHフォントのほうが遥かに学術論文としての気品があり美しい.SLAVISTIKAの編集者は,Wordの応募原稿を集めたあと,ファイルを纏め,しこしこ目次を作り,ノンブルやヘッダ・フッタを調整し,各人の書式を統一するのに途方もない時間を使うに違いない.投稿規程をLaTeXクラスファイルとして配布しマークアップ規則を徹底して投稿者に入稿させれば,あっという間に論文集を組み上げることができると思うのだが.LaTeXは文系ではその存在を知るひと,使うひとが数少ないのでそうもいかないのだ.

    論文の投稿規定には一般に文字数(和文),語数(欧文)の制限が付く.自分の論文についてこれらを集計したいと思い,インターネットでツールを探索してみたが以外と少ない.あっても LaTeX で書いた論文を対象にすることは難しそうであった.考えてみれば,文字数,単語数とひとことで言ってもそのカウント基準は千差万別であり,汎用的なものを用意するのは現実的でないかも知れない.

    Microsoft Word などのワードプロセッサは編集中文書の文字数を表示する機能を備えているけれども,数字や記号などどのレベルで集計しているのか,それをコントロールできるのか,その仕様がよくわからない.また,TeX 原稿テキストだとこの方法は意味がない.

    そこで自作することに.とはいっても,大半は UNIX のテキストユーティリティを使い回すのが主体である,日本語対応 dvi2tty で dvi ファイルから抽出したテキストをネタにするところがポイントである.自前で書いたプログラムは,Perl 言語による簡単な単語・文字カウンタとキリル文字変換フィルタだけである.

    LaTeX 原稿はノンブルや行番号などを出力するマークアップをしていたり,ロシア語などは dvi 上は必ずしも英字で埋め込まれるわけではないので,dvi2tty の出力テキストはそのままでは正確な単語数を把握するのに不都合がある.そのため事前に原稿を sed で書き換えて救ってやる必要があった.

    参考までに単語・文字カウンタを掲載しておく.欧文は単語数,和文は文字数を集計する.UTF-8 テキストを前提としている.ちょっと乱暴だけど,Unicode コードポイント U+3000 以上の文字を和文として扱う仕様である.数字を単語として扱いたくない,などの必要があれば,事前に sed で数字を置換しておくなどの工夫をしておく.このプログラムそのものは LaTeX 専用というわけではない.

    #!/usr/bin/perl
    #  -*- coding: utf-8; mode: cperl; -*-
    #  $Id: artclcount,v 1.6 2007/03/18 13:02:07 isao Exp $
    #
    #  artclcount: 論文の文字数と単語数を計算する
    #
    #             2007 (c), isao yasuda, All Rights Reserved.
    #
    #  USAGE
    #  -----
    #  artclcount [-p] < text
    #    -p: 欧文句読点,括弧類 .:;,!?<>()[]'"`~_ をカウントしない.
    #
    #  CAUTION
    #  -------
    #  LaTeX dvi出力を処理する場合は,ノンブル,ヘッダ,注セパレータなども
    #  すべて対象となる.これを外すには事前にページスタイル調整,sed 
    #  による置換を行っておくこと.
    #
    use utf8;           # UTF-8 hundling
    use Getopt::Std;    # コマンドライン引数処理
    use File::Basename; # ファイル名の取得
    binmode STDIN,  ":utf8";
    binmode STDOUT, ":utf8";
    binmode STDERR, ":utf8";
     
    %opts = ('p' => 0); # p option: not include punctuations.
    Getopt::Std::getopts('p', \%opts) || usage();
     
    my($kcharsc,$charsc,$wordc,$numberc,$nonumberc,$charscall,$lno);
    my($buffer1,$buffer2,$chr,$word,$pattern,$opattern);
     
    $kcharsc=$charsc=$wordc=$numberc=$lno=0;
    $pattern='[\.:;,!\?\<\>\(\)\[\]\'\"\`\~\_\s+]';
    # 文字としてカウントしない記号のパターン
    if ($opts{'p'}) {
        $opattern='[\.:;,!\?\<\>\(\)\[\]\'\"\`\~\_\s+]';
    } else {
        $opattern='\s+';
    }
    while (<STDIN>) {
        # UTF-8 デコード,行末改行除去
        utf8::decode($_);
        $buffer1 = $_;
        chomp($buffer1);
        $buffer2 = "";
        # 漢字文字数カウント
        foreach $chr (split(//, $buffer1)) {
            if ($chr ge "\x{3000}") {
                $kcharsc++;
                $buffer2 .= " ";
            } else {
                $buffer2 .= $chr;
            }
        }
        # 欧文単語カウント(記号 .,:;!? は対象外)
        foreach $word (split(/$pattern/, $buffer2)) {
            if ($word) {
                $wordc++;
                # 数字要素カウント
                if ($word =~ /[0-9]+/) {
                  $numberc++;
                }
            }
        }
        foreach $chr (split(//, $buffer2)) {
            $charsc++ unless ($chr =~ /$opattern/g);
        }
        $lno++;
    }
    $nonumberc = $wordc - $numberc;
    $charscall = $kcharsc + $charsc;
    print "** Words: $wordc\n";
    print "**  - Ordinary: $nonumberc\n";
    print "**  - Number:   $numberc\n";
    print "** Chars: $charscall\n";
    print "**  - Kanji:    $kcharsc\t[with codepoint >= U+3000]\n";
    print "**  - Other:    $charsc\t[Ascii, Russian, etc.";
    if ($opts{'p'}) {
        print "; not counting .,:;!?<>()[]\'\"`~]\n";
    } else {
        print "]\n";
    }
    printf STDERR "Words/Characters counter processed $lno lines.\n";
     
    # Help
    sub usage {
        my($prog) = basename($0);
        die <<"EOM";
    Usage: $prog \<-p\>
     -p  not count puctuations and signs .,:;!?\<\>\(\)\[\]\'\"\`\~
     * 2006-2007 (c), isao yasuda, All Rights Reserved.
     * absolutely no warranty.
    EOM
    }
    

    簡単に使い方を記しておく.上記プログラムを artclcount という名で格納するとする.以下の説明では「対象文書」はカウント処理用に複製した TeX 原稿を指している.

    1. 対象文書 (EUC) に対し,\pagestyle{empty} を指定する.これはノンブルなど余計な情報をカウント対象から外すためである.
    2. Babel パッケージで外国語を記述している場合,対象文書に対し,\selectlanguage 命令の直後に \language=255 を指定することにより,ハイフネーション処理がなされないようにしておく.分綴されると一単語が二語と扱われるためである.カウント処理を想定して,予めもとの TeX 原稿にこれらの切替をコメントとして書いておき,sed で一括変換するのがよいと思う.例えば原稿は次のようなマクロで言語切替を行うようにしておき,カウント処理用対象文書でコメントを外すようにすればよい.
      \newcommand{\rutxt}[1]{%
        \begingroup\selectlanguage{russian}%
      % ハイフネーション抑止
      % カウント処理の前に次行をコメント解除する.
      %\language=255%
        #1\endgroup\relax}%
      
    3. ロシア語単語数を計算する必要がある場合,できるだけ T2A エンコーディングで組むとよい.OT2 だと dvi 抽出テキストが空白で出力される文字があり,計算上取り扱いが面倒になる.OT2 原稿ならば対象文書の文字 ёжйъьэюя (大文字,小文字とも) を c (合字として扱われることがない) に変換しておく.
    4. LaTeX で対象文書をコンパイルする.このとき生成される dvi ファイル名を target.dvi とする
    5. dvi2tty (日本語対応版) で target.dvi からテキストを抽出し,count.txt に出力する.このとき,dvi2tty オプションに -w132 -l (一行132文字整形,改頁^Lマーキング) を指定しておくとよいと思う.
      % dvi2tty -w132 -l -o count.txt target.dvi
      
    6. count.txt を UTF-8 にコード変換し,GNU sed で傍点,脚注セパレータ,改頁^Lマーキングを削除し,その結果を count-sed.txt に出力する.このあたりのテキスト整形は count.txt を眺めて決める.
      nkf -w count.txt |\
      sed -e 's/ \. //g' \
          -e 's/___*//g' \
          -e 's/\^L$//g' > count-sed.txt
      
    7. 本カウントプログラムで単語数,文字数を計算する.
      % artclcount < count-sed.txt
      ** Words: 2516 .. 全単語数 (欧文)
      **  - Ordinary: 1917 .. 通常単語数 (欧文)
      **  - Number:   599 .. 数値含む単語数
      ** Chars: 25762 .. 全文字数
      **  - Kanji:    14360 [with codepoint >= U+3000] .. 漢字
      **  - Other:    11402 [Ascii, Russian, etc.] .. 欧文
      

    Movable Type 3.2 でメモリ不足でサーバエラーが頻繁する対策を少し探ってみた.EntriesPerRebuild 値を調整することで改善された.

    「サイトを再構築」をインデックス,エントリーアーカイブ,...とひとつずつやっていくと,月別アーカイブ作成でエラーとなる場合が多い.これは多くのエントリーをまとめて処理するため,それに応じたエリアを一度に要求する MT 仕様によってきたるようである.そこで少しずつやる手だてはないかと,Google で探してみたら,あった.

    mt-config.cgi という MT の動作カスタマイズ用 cgi スクリプトがあり,そこに EntriesPerRebuild なるパラメータがある.デフォルトは 40 である.エントリーアーカイブ作成などはこの数値ごとにまとめて処理されるようである.月別アーカイブ作成は,この数字を適当に弄って試した限りにおいて,これの 10 倍値ごとに束ねて処理されるようである.つまり標準値は 40 x 10 = 400.

    いま現在,本サイトの記事数は 200 程度なので,この半分ずつ処理させるとして EntriesPerRebuild を 10 に設定したら,おおむねうまくいった.デフォルト値の 1/4 の設定であって,処理時間がトレードオフとなるのが想定される.が,背に腹は変えられない.

    これでようやく,落ち着いて記事を登録できるようになったかと思ったら,カテゴリーアーカイブで引っかかる場合がある.これの分割はどうもできないのか.うーむ.ところで,このメモリ不足によるエラーが httpd-error.log には "Premature end of script headers" と出力されるのはどうも解せない.

    MT の登録エントリー数が増えてアーカイブ作成でエラーが発生するようになって困っている方.EntriesPerRebuild 値調整は,それでも,お試しあれ.

    Profile

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

    Notice

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

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

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

    Links

    About this archive

    All Entries of Category 小道具

    Previous: 一言居士

    Next: 文房清玩

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

    Web Pages

    Powered by Movable Type 4.1