misimaの最近のブログ記事

漢詩詩語集を処理するに際して,Excel ファイルを CSV に一括変換するツール「Excel 一括 CSV」だと,JIS X 0212 のいわゆる JIS 第三・第四水準の文字の出力が「?」に化けてしまった。これをなんとかしたいと思い別のツールをいろいろ漁ってみたが,これというものが見当たらなかった。UNIX 系システムでの Excel ファイルのテキスト変換では,xlhtml というプログラムが昔から有名であるが,これとて日本語の扱いに関しては不十分なところがある。この調査の過程で,Windows でなくても動作する Perl Excel ファイルハンドリング・モジュール Spreadsheet::ParseExcel の存在を知り,これを使って一括変換ツールを自作することにした。このモジュールは標準ではないので,コマンドラインから cpan -i Spreadsheet::ParseExcel としてインストールする。

Excel は古いバージョンで作成したものだと,ファイル内の日本語文字コードが Shift_JIS なのか CP932 なのか UCS2 なのかよくわからない。おまけに私の目的として,出力すべきファイルは UTF-8 エンコードでなければならない。Spreadsheet::ParseExcelSpreadsheet::ParseExcel::FmtJapan という日本語処理のための下位モジュールを備えている。これらを併用すれば,日本語文字コードに煩わされずにすみ,JIS X 0212 文字もうまく処理でき,かつ UTF-8 で出力できることがわかった。Spreadsheet::ParseExcel のマニュアル(perldoc Spreadsheet::ParseExcel で閲覧できる)に API 解説とサンプルコードがあるので,参照いただきたい。

今回作成した Excel ワークシート一括 CSV 変換プログラム xlstocsv.pl を以下に掲げる。こんなに短いコードでできてしまうのなら,最初から自分の手を動かすべきであった。同じ課題をもつ方は必ずいらっしゃると思うので,以下のコードをコピって活用いただきたい。もちろん無保証,無サポートである。使い方は,コマンドラインで xlstocsv.pl 対象Excelファイル とする。引数に Excel ファイルを一つ指定する。すべてのワークシートが単一 CSV テキストストリームとして STDOUT に書き出される。ファイルに格納したいのならリダイレクトする。

#!/usr/bin/perl -w
# -*- coding: utf-8; mode: cperl; -*-
# Excel to CSV
# $Id: xlstocsv.pl 12 2012-02-05 16:57:06Z isao $
use strict;
use utf8;
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtJapan;
binmode STDOUT, ":utf8"; binmode STDERR, ":utf8";
($#ARGV < 0) && die "Usage: $0 xls-file\n";
my $fnm = $ARGV[0]; # Excel file name
my $ct = 0;         # 出力行数
# Excel object
my $xls = Spreadsheet::ParseExcel->new();
my $fmt = Spreadsheet::ParseExcel::FmtJapan->new(); # 日本語あり
my $bko = $xls->parse($fnm, $fmt); # Excel Book object
my @wsa = $bko->worksheets();      # Worksheet object 配列
utf8::decode($fnm);
# ワークシート毎の処理
foreach my $ws (@wsa) {
    my $wsnm  = $ws->{"Name"};
    my $mxrow = $ws->{"MaxRow"};
    my $mxcol = $ws->{"MaxCol"};
    print STDERR "*** $0 $fnm - sheet: $wsnm start.\n";
    if ((defined $mxrow) && (defined $mxcol)) {
        # 行毎の処理
        for (my $row = 0; $row <= $mxrow; $row++) {
            my $line = "";
            # 列毎の処理
            for (my $col = 0; $col <= $mxcol; $col++) {
                # セル値をセット
                my $cell = $ws->get_cell($row, $col);
                $line .= $cell->value() if (defined $cell);
                $line .= ",";
            }
            print "$line\n";
            $ct++;
        }
    }
}
print STDERR "*** $0 from $fnm wrote $ct lines\n";

もしワークシート毎にファイルをばらしたいのなら,foreach my $ws (@wsa) のブロック(ワークシート単位のループ)部分の始めと終わりに独自ファイル処理(「ファイル名+シート名」でファイルハンドルを割り当てる等)を入れればよい。また,このコードは CSV をカンマ区切り形式とし,かつセルの内容に半角カンマが含まれない前提である。もし半角カンマが含まれてもよいようにするなら,得られたセル値を出力時にダブルクォーテーションマークで括る,等の処置を施していただきたい。

これで,一つの Excel ファイルに夥しいワークシートがあろうが,いちいち Excel を開いて CVS として保存しなくても,コマンドラインから一発で CSV 変換ができるようになった。おまけに FreeBSD でも Linux でも Mac OS X でも動くのである。もちろん Windows でも動くし,Excel がインストールされていなくても Excel ファイルを処理出来る,というメリットがある。

私の課題 — いただいた詩語集の処理に関しては,71 の Excel ファイルそれぞれに何十ものワークシートがあって,Excel をひとつひとつ開いてワークシート毎に CSV エクスポートするのはとてもやっていられないが,xlstocsv.pl を使えば次のコマンド操作だけで二字詩語,三字詩語の CSV(2c.csv, 3c.csv)をまとめることができた。

isolde [1001] % foreach i (2c-xls/*.xls)
foreach? set BS=`basename $i .xls`
foreach? (xlstocsv $i > 2c-$BS.csv) >& 2c-$BS.err
foreach? end
...
isolde [1002] % foreach i (3c-xls/*.xls)
foreach? set BS=`basename $i .xls`
foreach? (xlstocsv $i > 3c-$BS.csv) >& 3c-$BS.err
foreach? end
...
isolde [1003] % env LC_ALL=C sort 2c-*.csv | uniq > 2c.csv
isolde [1004] % env LC_ALL=C sort 3c-*.csv | uniq > 3c.csv

xlstocsv.pl は引数に Excel ファイルを一つしか指定できないが,複数の Excel ファイルを扱いたいなら,上の tcsh 操作のようにループで回せばよい。次のシェルスクリプトは,カレントディレクトリにあるすべての Excel ファイルを,「xls と同じファイルベース名+拡張子 csv」という名の CSV ファイルに書き出す。

#!/bin/sh
for i in *.xls
do
    BS=`basename $i .xls`
    xlstocsv.pl $BS.xls > $BS.csv
done

misima 漢詩・詩語集拡充

|

misima 漢詩作成支援の詩語検索機能で参照する詩語データベースを大幅に拡充した。ここのところ,この漢詩プログラム改造に取り組んでいた延長で,詩語のデータベース拡充のための元ネタがないか探していたら,今月 2 日,ある方から個人的に集めた詩語集をいただいた。入手した Microsoft Excel 形式のファイルを CSV に変換して行数を確認すると,なんと 8 万行もある。長年の労苦が偲ばれる素晴らしい成果をいただいた次第である。これは早速データベースにして,提供してくれた方に使ってもらわないとバチが当たる。昨夜と今日のお休み一日かけて,これに取り組んだのである。

いくつものシートに分けられた Excel データを CSV データに変換するのに,「Excel 一括 CSV」を使わせてもらった。妻の Windows 7 で変換したのち,Mac OS X にコピーして,ここからいくつかプログラムを書いて既存のデータベースにマージした。主な作業手順は以下のとおり。

  • 文字コードを UTF-8 に変換(nkf 使用)。
  • CSV データをフォーマット編集(新規作成ツール)
  • 平仄付加(既存ツール)
  • 詩語を旧字体変換して増幅(既存ツール)
  • 新旧両字体で検索してもヒットするよう韻字カラム調整(新規作成ツール)
  • 重複排除(既存ツール)
  • SQLite3 import
  • FreeBSD サーバ Tomcat 環境への辞書・プログラムのデプロイ(配備・インストール)
  • 読み,意味,出典も詩語検索の結果に出力する処理(JavaScript)も追加した。旧字体変換を入れたので,韻字の検索で新旧字体のどちらを指定してもヒットするようデータ構造,クエリを変えた。例えば,韻字が「仏」・平仄「○-●」の検索で,「銅佛」が出て来るようにした。
     

    20120204-sigo.png

    これまでの詩語データベースは,ネットで漁った『唐詩選』の漢詩データ 470 首程度を Perl HTML::TreeBuilder パーサで処理して二字,三字の詩語に分解し,この結果得た約 4000 語程度しか蓄積してなかった。これがいまや二字 33601 語,三字 53657 語,計 87258 語にまで拡張された。まだまだ使い勝手としては疑問が残るけれども,詩語ブラウザとしてはそれなりの規模が備わったのではないかと思う。

    今回作業で使用した「Excel 一括 CSV」ツールでは,残念ながら JIS 第三・第四水準の漢字が文字化けしてしまった。データベースにはこれらは含めなかった。これらを反映するのが次なる課題である。

    misima 漢詩 Tomcat, Log4j エラー

    |

    misima 漢詩作成支援の機能追加を終えて,Tomcat ログ,misimaKansiServlet ログを眺めていたら,気になるエラーが出ていた。システム自体は正常に動作しているので,別に構わないわけだけれども対処することにした。
     

    * * *

    一つ目のエラーは Tomcat-5.5(JSP / Servlet コンテナのデファクトスタンダード・ソフトウェアのちょっと古めのバージョン)/usr/local/tomcat55/logs/stdout.log に出ていたもの。

    log4j:WARN No appenders could be found for logger →(折返し。実際は 1 行)
        (org.apache.commons.digester.Digester.sax).
    log4j:WARN Please initialize the log4j system properly.
    

    二行目の initialize 云々でロガー(ログ管理システム)Log4j の初期化がうまく行っていないようである。misimaKansiServlet そのものは独自に Log4j のプロパティ・ファイルを読み出して Log4j を初期化している。つまり,以下のように,デプロイメントディスクリプタ web.xmlinit-param タグにログ・プロパティ・ファイルの場所を書いておき,misimaKansiServlet Java プログラムから参照して logger を初期化している。

    web.xml:

    <servlet>
      <servlet-name>misimaKansiServlet</servlet-name>
      <servlet-class>misimaKansiServlet</servlet-class>
      ...
      <!-- logging プロパティのパス -->
      <init-param>
        <param-name>logproperty</param-name>
        <param-value>
          /usr/local/tomcat5.5/webapps/misimakansiservlet/log4kansi.properties
        </param-value>
      </init-param>
    </servlet>
    

    misimaKansiServlet.java:

    public class misimaKansiServlet extends HttpServlet {
        /** log4j property */
        private static String prop = "log4kansi.properties";
        /** log4j logger */
        private static Logger mslog;
        ...
     
        /** 初期化 */
        public void init() throws ServletException 
        {   
            // web.xml デプロイメントディスクリプタから初期パラメータを取得する.
            String p = getInitParameter("logproperty");
            if (p != null) { prop = p; }
     
            // log file initialize.
            mslog = Logger.getLogger(misimaKansiServlet.class.getName());
            PropertyConfigurator.configure(prop);
            mslog.info("misimaKansiServlet initialize.");
            mslog.info("- log properties file: " + prop);
        }
    ...
    

    これで何でまだ初期化されていないなどと言われるのか。misimaKansiServlet のログは初期化されてきちんとロギングできるので,どうやら Log4j の親玉みたいなクラスがシステムとしてのロガーの初期化ができないということのようである。調べたら,このためのプロパティ・ファイルを Log4j がきちんと読めるようにしておけばよいとわかった。つまり,/usr/local/tomcat5.5/conf/log4j.properties に全体用プロパティ・ファイルが格納されているとして,Tomcat 起動時に参照する JAVA_OPTS 環境変数に以下を追加記述しておけばよい。

    -Dlog4j.configuration=file:///usr/local/tomcat5.5/conf/log4j.properties
    

    これで Tomcat を再起動すれば,エラーは出なくなった。私の FreeBSD 環境の場合 Tomcat 起動用スクリプトのなかで JAVA_OPTStomcat55_java_opts 環境変数から取得しているので,/etc/rc.conf に以下を追加した。

    tomcat55_java_opts="-Dlog4j.configuration=file:///usr/local/tomcat5.5/conf/log4j.properties"
    
     
    * * *

    二つ目のエラーは,misimaKansiServlet ログの DWR 関連メッセージである。

    12/01/30 18:24:18.079, ERROR, [TP-Processor6] org.directwebremoting.util.LogErrorHandler,
    42: Line=23 The content of element type "dwr" must match "(init?,allow?,signatures?)".
    

    文面からは何も原因を想定できない。DWR サイト内を検索したら,メーリングリストに同じエラーに遭遇した人の投稿とそれへの回答があり,難なく原因がわかった。misimaKansiServlet 用の DWR 定義ファイル dwr.xml の記述において,今回追加した Java クラスのために allow タグも追加したのだが,これがまずかった。このタグは複数書いてはいけない仕様だったのである(それでも追加プログラムが動いてくれるのが面白い)。よって,対策は一つの allow タグにすべて放り込む,というのでOKだった。

    <dwr>
      <!-- without allow, DWR isn't allowed to do anything -->
      <allow>
        <create creator="new" javascript="SigoTable">
          <param name="class" value="SigoTable" />
        </create>
        <convert converter="bean" match="SigoBean" />
      <!--
      </allow> 単一 allow にするため削除
      <allow>  同上
      -->
        <create creator="new" javascript="KanjiTable">
          <param name="class" value="KanjiTable" />
        </create>
        <convert converter="bean" match="KanjiBean" />
      </allow>
    </dwr>
    

    misima 漢詩作成支援・平仄音韻分析・詩語検索ツールに,旧字体変換機能と漢字検索機能を追加した。ただし,このツールは友人向けの限定公開であり,ユーザ ID,パスワードを入力しないとアクセスできないようになっている。

    今回の追加機能は,先日,自分で漢詩を書く際に本ツールを使ってみて,足りないと思った機能である。そのときは手元の仮想端末から SQL を叩いて漢字データベースを検索して,欲しい平仄・韻をもつ漢字を探す,などしていた。せっかくだから,これらを Web 上で出来るようにした。旧字体変換はすでにある misima 旧字・旧仮名遣い変換サーブレットを呼び出すようにしただけである。漢字検索機能は,詩語検索とまったく同じ方式である(「DWR with Java: misima 漢詩詩語検索」を参照)。DWR(Dynamic Web Remoting)ライブラリをベースに,Java Beans クラス(KanjiBean.java)と,漢字 DB を検索してそのクラス配列にデータをストアするメソッド(KanjiTable.java)の二本の短い Java プログラム,非同期通信ライブラリ DWR とユーザインタフェースを制御する一本の JavaScript(kanji.js),検索用 HTML(kanjisearch.html)をごそごそと書いた。DWR のおかげで面倒な Java サーブレットのコーディング,非同期通信 Ajax JavaScript のブラウザ依存コーディングから解放され,たったこれだけの一日作業で機能追加が出来た。以下,追加機能の使い方を簡単にメモしておく。

    メインの画面(図 1.)に「漢字検索」と「旧字体」のボタンがある。
     

    20120128-kansi-1.jpg

    図 1. メイン画面

    分析対象漢詩テキストを入力し,「旧字体」のボタンをクリックすると,入力した内容が旧字体に置き換えられる。図 2. はその実行前後を示している。


    20120128-kansi-2.jpg

    図 2. 旧字体変換

    「漢字検索」右横の「開く」ボタンをクリックすると,漢字検索用の別ウィンドウがオープンする(図 3.)。
     

    20120128-kansi-3.jpg

    図 3. 漢字検索ウィンドウ

    ここで「漢字」,「韻字」,「韻目」で検索が可能である。ある漢字の平仄,韻目を知りたいとき,「漢字」のテキストエリアに文字を指定する。複数指定することができる。「韻字」のエリアに漢字を入力して検索すると,当該漢字と同じ韻目の漢字の一覧が得られる。押韻文字を考えるときに役立つはずである。「韻目」は,韻目を指定して該当する漢字の一覧を検索するためのものである。韻目は「上平聲一東」のような複雑なものでありかつシステム内部において特殊な形式で管理している。この形式でユーザが入力するのは困難なので,韻目テキストエリアにカーソルが位置づけられるとメニューがポップアップし,ここに一覧された平水韻 106 項目から求める韻目を選択することにより,検索条件が設定されるようになっている。図 4. に韻目検索のポップアップメニューを示す。
     

    20120128-kansi-4.jpg

    図 4. 韻目ポップアップメニュー

    「漢字」,「韻字」,「韻目」の条件は1回の検索ではどれかひとつしか指定できない。複雑な条件で検索するために「SQL」条件を設けてある。検索キー:漢字 ji; 平仄 hs; 字韻1 in1; 字韻2 in2; 音読 yo; 訓読 yk; 備考 bk を使って,SQL where 句のなかに書くクエリ条件を記述する。select * from KANJITBL where query condition; の SQL 文のうち query condition 部分のみをテキストエリアに記述する。最後の ;(クエリ終了を示すセミコロン)も書いてはならない。これはエキスパート向けであり,基本的には使う場面はないと思う。

    検索結果には,漢字,平仄,韻目,備考が出力される。備考欄には,音読み,訓などの付加情報があったりなかったりする。出力例を図 5. に示す。
     

    20120128-kansi-5.jpg

    図 5. 漢字検索結果例

    ここで,平仄欄の は平字, は仄字, は平仄両韻字(意味によって平仄が違う)を示している。韻目欄の,例えば「hs:07:陽」というのは下平聲七陽を示している。hk: 上平聲,hs: 下平聲,sj: 仄上聲,sk: 仄去聲,sn: 仄入聲であり,コロンで区切られた数字と漢字一文字で韻目を表している。

    これで,漢詩の平仄・音韻規則チェック,詩語の検索,漢字の平仄・韻目検索が揃った。これからは詩語データベースの充実を図り,漢詩作成の有益なツールになるようにしたいものである。
     

    20120128-kansi-6.jpg

    図 6. misima 漢詩作成支援・平仄音韻分析・詩語検索・漢字検索

    七絶・九段坂幻影

    |

    漢詩を書いてみた。七言絶句・仄起式平韻偏格。湯島天神初詣のとき思いついた。桜花の時候はまだまだ先だけど。ま,くだらない戯言である。ただ,平仄・押韻法は合っているはずである。

    九段坂幻影
    櫻雪蕭然昇九堽  桜雪蕭然たり。九堽(きゅうこう)を昇る。
    氣淸雀囀薄霞洸  気清く雀囀り 薄霞(はくか)洸(こう)たり。
    視靈廢卒幽跳坂  霊の廃卒の幽かに坂を跳ぶを視る。
    途上娟人仰彼蒼  途上の娟人(けんじん)彼蒼を仰ぐ。
    Sakura drifting on the wind lonely and silently. I'm going up the slope of Kyuko.
    Pure air. Sparraws twittering. Mist dim and thin.
    In my vision - transparent spirits of invalid soldiers jumping are coming down.
    At the end of road a woman stands looking up at the sky.
    (Facebook に載せたら英訳をと求められたので,通じればよいと適当に)

    「櫻雪」なんてのは和臭プンプンだろうけどかまわない。平仄その他のこじつけで,九段坂について「九堽」(きゅうこう)なんて造語を使っている。misima 漢詩平仄音韻分析・詩語検索(ただし,友人のための限定公開)をはじめて自身の実作で使ってみた。あれこれ悩むと,いろいろ機能がほしくなって来る。機能追加はそのうちということで。プログラムによるチェック結果は以下のとおり。
     

    20120122-kansi.jpg

    さてさて

    |

    柏レイソル VS セレッソ大阪の試合を NHK-BS1 で観戦。終盤レイソルは,水野選手(かつては日本代表として期待されたのに,いまやレギュラーですらないのは何でだ?)が右サイドに入って活性化し,同点に追付いてから圧倒的に試合を支配したのに,どうもフォワードがいまいちで決めきれず。柏フォワードの林・田中選手,途中出場なのにゴール前でボーっと突っ立っているばかりで,まったく動きが悪い。結局,1-1 ドローで J1 優勝争いは最終節に持ち越された。レイソル,ホームで勝っておかなけりゃ最終節での優勝はきついぞ。ま,今日のようにドミンゲスとワグネルがなんとかしてくれるさ。柏は,残念ながら,ここぞというときの外国人頼みなんである。優勝してくれよ!
     

    * * *

    出版社に勤務する妻が,いま担当している編集作業で,新字体を旧字体に変えないといけないという。俳句・短歌の世界ではいまだに旧仮名遣いが主流だけど,旧字体にこだわる人は少なくなっているようである。

    そこで「オレのツール使えよ」と misima の ID とパスワードを教えてやった。趣味で拵えたこのツールは,新字体・新仮名遣いテキストを旧字体・旧仮名遣いのそれに機械変換するもので,いまは基本的に自分のためだけのものであり,私は基本的に使わないので,要するにいまは誰も使っていない。妻の実務で役に立つなら,それこそ意味があったというべきである。

    妻は俳句・短歌の本を担当している。原稿はたいてい手書きであって,電子データによる入稿なんてほとんどないようだ。だから私のツールを使うにも,著者からの電子データを期待できず,自分で入力して文字を確認するだけの用途になる。電子入稿の場合は,計算機で文言の統一や文章の校正ができるし,組版スピードもおそらくケタ違いにアップでき,出版経費を落とすことができる。私が LaTeX 本の出版をお手伝いしたとき,訂正稿 LaTeX ファイルをメール送付したら,すぐさま出版社から,イメージセッタに掛けられるトンボ付版下 PDF が確認用に送付されて来て,それを見た妻はびっくりしていた。私なら電子入稿と紙入稿とで著者への支払いに大いなる差別をつけてやるんだけど,この出版社のように短歌・俳句の場合じゃそうもいかないようである。
     

    * * *

    朱川湊人の小説を二冊読む。『わくらば追慕抄』(角川書店,2011 年)と『本日,サービスデー』(光文社,2011 年)。ほぼ一年ぶりの朱川読み。残念ながら,最初に読んだ『かたみ歌』,『わくらば日記』ほどのインパクトはなかった。でも,『本日,サービスデー』のコミカルで心温まる物語は,いつ読んでも退屈しない部類に入る。
     

    わくらば追慕抄 (角川文庫)
    朱川 湊人
    角川書店(角川グループパブリッシング) (2011-09-23)
    * * *

    明日 27 日は大阪府知事・大阪市長ダブル選挙,サッカー W 杯アジア予選ホーム・シリア戦がある。「Yahoo! みんなの政治」の大阪都構想への賛否に関するインターネット投票結果(11.26 17 時ころ)をみると,賛成が他を圧倒している。
     

    20111126-osakato-bote.jpg
     

    回答者の都道府県がわかっているのなら,大阪府の回答だけによる集計結果も提示すべきではなかろうか,という気がする。そういう集計上の不満は措くとして,この結果が選挙を占う根拠となるなら,橋下さんの維新の会の圧勝ということになる。もちろん,ネット住民には大いなる偏向があるので,選挙結果と見比べてみたいという思いの方が私には強いんだけど。

    それにしても,この投票者の内訳は面白い。支持政党に関して,無党派層が半数以上であり,日本の政党のだらしなさが否応なく読みとれてしまう。日本の政党がいったい誰の利害や思想を代表しているのかまったくわからないのである。また,「正社員」という職業分けには笑ってしまう。「正社員」+「派遣・契約社員」がいわゆる一般の会社員・サラリーマンとすると 36% であり,「会社役員・経営者」+「自営業・自由業」の 34% とほぼ同じ。この数字は果たして日本の社会構造を反映しているのだろうか? 「10 代」の回答者が 0 なのに,「無職」+「その他」が 17% もいる。「自営業・自由業」なんてのも「自称」が多そうであって,そのじつ「無職」に近いのではと私なんかは思ってしまう(それくらい 18% という数値は大き過ぎるように思われるんである)。なんかいびつな回答者層という感じである。ここにも「ネット住民の大いなる偏向」が現われているように思われる。

    さて,選挙結果やいかに。ま,都道府県中で幸福度も,子供の学力も最低の大阪。生活保護者数最多の大阪。なのに,「いまの大阪を壊していいのか」なんてホント暢気なことを言っている現職・平松さんが仮に当選するとなると,私なんかには「世も末」に思われる。一方,橋下さんは「独裁者」と言われ,彼のやり方はファシズムに掛けて「ハシズム」などと揶揄されている。地方自治の独裁なんてなんぼのもんじゃ。警察・軍事権力と結びつかない独裁なら大いに結構である。私は公務員に厳しい政治家が好きである。何でも民営化したがる政治家が好きである。

    ruby マークアップ・ツール

    |

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

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

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

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

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

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

    misima 漢詩作成支援: 平仄音韻分析・詩語検索 misimakansiservlet を使っている方からメールをいただいた。そこで思い出したように,久しぶりに辞書のメンテナンスを行った。平仄などのデータを格納した辞書=漢字データベースは SQLite3 で作成したのだけど,SQLite3 オペレーションを中心とするメンテナンス手順を忘れてしまっていた。思い出したのを整理し,ここにも備忘録を残しておく。以下,beatirce:/home/isao[nnnn] % は misima サーバ機端末の tcsh プロンプト,nnnn はコマンド履歴番号を示す。

    misimakansiservlet において,漢詩分析デーモン misimakansiserver は漢字データベース KANJITBL で見つからなかった文字をログに出力するようになっている。私はこれを定期的にチェックし,それらの辞書にない文字(ユーザが入力したが辞書になかった漢字)を手作業で DB に追加する。ログのその部分を抽出する。

    beatirce:/home/isao[1000] % grep -e '\*\*\*' /var/log/kansiserver.log | sort | uniq
    ***** 㱕 が KANJITBL にありません.
    ***** 僲 が KANJITBL にありません.
    ***** 嵆 が KANJITBL にありません.
    ***** 扃 が KANJITBL にありません.
    ***** 涴 が KANJITBL にありません.
    ***** 疴 が KANJITBL にありません.
    ***** 裛 が KANJITBL にありません.
    ***** 髥 が KANJITBL にありません.
    beatirce:/home/isao[1001] % 
    

    というわけで,今回この 8 文字を追加。漢字字典を調べ,平仄,読み,語義などを DB のソースコード kanji.src にテキストエディタで追加する。完了したら,create table で漢字データベースファイル KANJI.db を生成する。そしてこれに kanji.src の内容を .import コマンドでロードする。kanji.src のデータ記述はカンマ区切りの CSV 形式なので,ロード実行には -separator , オプションを指定している。

    beatirce:/home/isao[1001] % cd misima
    beatirce:/home/isao/misima[1002] % sqlite3 KANJI.db < mkkanji.sql
    beatirce:/home/isao/misima[1003] % sqlite3 -separator , KANJI.db ".import kanji.src KANJITBL"
    beatirce:/home/isao/misima[1004] % 
    

    ここで,mkkanji.sql とは create 文で DB のスキーマ(データ項目とその属性)を定義する元ネタである。misimakansiservlet の場合は以下のようなものである。

    -- -*- coding: utf-8; mode: sql; -*-
    -- misimakansiservert 平仄音韻分析用漢字テーブルレイアウト
    -- 漢字 ji, 平仄 hs, 韻 in1, 韻 in2, 音読 yo, 訓読 yk, 備考 bk
    create table KANJITBL (
           ji text not null,
           hs text not null,
           in1 text not null,
           in2 text not null,
           yo text not null,
           yk text not null,
           bk text not null
    );
    

    これで漢字データベースはできた。データ内容を確認して問題なければ,/usr/local/etc/misima/ の下にコピーする。これで Web サーブレットから使えるようになる。以下,SQLite3 DB 操作のメモ。

    1. SQLite3 コマンドラインの起動
    2. 扱う DB を引数に指定する。
      beatrice:/home/isao/misima[1004] % sqlite3 KANJI.db
      SQLite version 3.7.7.1 2011-06-28 17:39:05
      Enter ".help" for instructions
      Enter SQL statements terminated with a ";"
      sqlite> 
      
    3. テーブル名の表示
    4. sqlite> .table
      KANJITBL
      
    5. DB スキーマの表示
    6. sqlite> .schema KANJITBL
      CREATE TABLE KANJITBL (
                 ji text not null,
                 hs text not null,
                 in1 text not null,
                 in2 text not null,
                 yo text not null,
                 yk text not null,
                 bk text not null
      );
      
    7. DB 件数の確認
    8. sqlite> select count(*) from KANJITBL;
      6929
      
    9. tcsh コマンドラインから直接 SQL を入力する
    10. sqlite3 [opt] [db-file] に続けてクオート(ダブルクオーテーションマークで括る)して SQL 文を書けばよい。SQLite3 は標準入力からも SQL を受け付けるので,テキストファイルに書いておきリダイレクトで読み込ませてもよい。
      beatrice:/home/isao/misima[1005] % sqlite3 KANJI.db \
      "select * from KANJITBL where ji='髥';"
      髥|◎|hs:14:塩|sk:29:艷|ぜん;ねん|-|ほおひげ;鬚髯:柔らかいあごひげとほおひげ;
      beatrice:/home/isao/misima[1006] % cat sql.txt
      select * from KANJITBL where ji='㱕';
      select * from KANJITBL where ji='僲';
      select * from KANJITBL where ji='嵆';
      select * from KANJITBL where ji='扃';
      select * from KANJITBL where ji='涴';
      select * from KANJITBL where ji='疴';
      select * from KANJITBL where ji='裛';
      select * from KANJITBL where ji='髥';
      beatrice:/home/isao/misima[1007] % sqlite3 KANJI.db < sql.txt
      㱕|○|hk:05:微|-|き|かえる;かえす|帰・歸の異体字;
      僲|○|hs:01:先|-|せん|-|仙人;僊の異体字;
      嵆|○|hk:08:齊|-|けい;げ|-|稽古の当て・古いことを集めて考える;嵆山:山の名;嵆康:姓の一;
      扃|○|hs:09:青|-|けい;きょう|-|かんぬき;とざす;
      涴|●|sj:13:阮|sk:21:箇|えん;おん;わ|-|涴演:川が曲がりまわって流れるさま;けがす・けがれる;
      疴|◎|hs:05:歌|sk:22:禡|あ;か;け|-|やまい;痾に同じ・痾疾;
      裛|●|sn:14:緝|sn:16:葉|ゆう;おう;よう|-|つつむ・香がまとわりつく;書物の覆い;しっとりと濡れる;衣の部;
      髥|◎|hs:14:塩|sk:29:艷|ぜん;ねん|-|ほおひげ;鬚髯:柔らかいあごひげとほおひげ;
      beatrice:/home/isao/misima[1008] % 
      

    これで追加した漢字の平仄分析ができるようになった。
     

    20111008-kanjituika.jpg

    FreeBSD メモリディスク

    |

    misima 旧仮名遣い・旧字変換サービスは大量の辞書を読み込む。高速化のためには出来る限りファイル入出力のオーバヘッドを減らしたい。そこでサイト運用において FreeBSD のメモリディスクに辞書などの misima リソースを格納して,インコアで処理できるようにしている。FreeBSD メモリディスクとはメモリに割り当てられたファイルシステム機能であり,昔の所謂 RAMDISK というのか,HDD に比べて高速なメモリにファイルを割り当てるものである。以下,そのオペレーションのメモ。

    misima の辞書等のリソースは一式 /usr/local/etc/misima ディレクトリ下に格納している。だいたい 5MB 程度である。この容量をもつファイルイメージでメモリファイルシステムを生成しマウントする。

    # [1] mkdir -p /usr/local/etc/misima
    # [2] cd /tmp
    # [3] dd if=/dev/zero of=newimage bs=1k count=5k
    # [4] mdmfs -F newimage -s 5m md0 /usr/local/etc/misima
    # [5] cd ~/src/misima/etc/
    # [6] tar cf - . | ( cd /usr/local/etc/misima; tar xvf -)
    

    [3] でまっさらな 5MB のファイル newimage を作成し(名前は任意。dd コマンドでゼロを 5MB = 1,024 x 5,120 バイト分書き込んでいるだけである),[4] でこれをメモリディスクデバイス md0 として /usr/local/etc/misima にマウントしている。もちろんこの時点で中味はまだ何もないので,[5][6] のように,開発ソースディレクトリから辞書などをコピーして準備完了となる。mdmfs コマンドの日本語マニュアルはここを参照。

    mount, df コマンドで確認すると,以下のような表示がされるはずである。

    # mount
    ......
    /dev/md0 on /usr/local/etc/misima (ufs, local, soft-updates)
    # df -k
    Filesystem  1024-blocks     Used     Avail Capacity  Mounted on
    ......
    /dev/md0           4718     3608       734    83%    /usr/local/etc/misima
    

    メモリ上のファイルシステムなので,当然ながらリブートすると跡形もなく消え去ってしまう。misima サービス起動時に上記オペレーションを自動的に実行するようなシェルスクリプトを書いて,運用するとよい。5MB くらいならキャッシュに入ってるって? ま,そうなんだけどね。

    大阪に帰省して蟬の声にはじめて気付いてなにか安堵を覚えた。やっと鳴いたかと。川崎に帰って来て,自宅周辺でも蟬のわしゃわしゃ騒ぐ音が聞かれるようになった。やっぱり梅雨明けは蟬の声と入道雲こそがそのしるしではなかろうか。

    暑い夏,スポーツざんまい。高校野球を観,女子バレーを観,プロ野球を観,と飽きない。ドイツでもブンデスリーガが開幕し,注目の香川選手擁するドルトムントは開幕ゲームで快勝した。ホームで 8 万人の大観衆のなか圧倒的強さを見せつけたらしい。「8 万人の大観衆」!— これだからドイツ代表は強くならないはずはない,と羨ましくなった。

    今日の朝日新聞の朝刊が,米国債の格下げを報じていた。ドル安も留まる様子がない。震災復興で生産性を高めなければならないこの時期に,円高は日本経済をさらに悪化させるような不安を掻立てている。でも,この円高のメリットを活かし米国から集中的にいっぱいモノを買って,いっぱいモノを作り,震災復興のために役立てればどうかと,私なんかは思う。海外へ売りに出るには不都合だけど,破壊された被災地の復興では,買うことが主体となるはずではないか。
     

    * * *

    そうはいってもやっぱりテレビでスポーツ観戦ばかりも,子供たちにバカにされてしまうので,本も一冊読みました。田中優子『春画のからくり』ちくま文庫,2009 年。「お父さん,エッチ」と言われても,私はまったく気にしない。著者は江戸学の専門家。女性なのにこんなテーマも的確に論じていて頼もしい(こんなことを言うことこそセクハラか)。

    「春画」とはいうまでもなくポルノグラフィである。江戸の文化遺産であるからには,春画はもっぱら名のある知識人によって文化的視点で論じられるわけであるけれども,やっぱりアダルトビデオ,ピンク映画,エロ写真集,ビニ本(古っ!)などと何も変わるところがない。日本人は幸せなことにこれら現代のポルノグラフィック・メディアが世界的にオープンな環境で(いや,あのモザイクには我慢ならねぇという方もまだまだいるだろうけど)観られるので,わざわざ「古典」に目を向けようという気持ちにはならないかも知れない。一方で,アダルトビデオ等々の性交描写に目を背けたくなるリアリズムを感じて,「不潔!」と思う真面目な人たちもいる。日本の江戸時代の春画は,面白いことに,「目を背けたくなるような誇張された醜悪なリアリズム」としては,現代のポルノグラフィを凌駕しているのである。江戸春画が現代の日本映画で引用されるシーンで,性器にボカシが入っていたという笑い話が本書にあった。

    田中が指摘するように,江戸春画は男女の性器をことさら巨大に描くのが常であり,しかも絢爛たる衣裳,閨房小道具が描き込まれることでフレーミングされ,性器がいよいよ際立つようになっている。ポルノグラフィをゴマンと観て来た私も,正直,恥ずかしくなるくらい凄い。河童や犬と女がいたすような獣姦ものあり,何組もの男女が絡む乱交ものあり,望遠鏡による覗見ものあり,豆ゑもんなる数センチの小人が男女の性交を見物して巡るシリーズものあり,とモチーフ,テーマも多岐にわたっていて,その懲りない性分は現代のサブカル的エロ・メディアとどこも変わらない。

    田中は適切にも,江戸春画の読者による受容の中心を,絵の分析から「笑い」であると指摘している。部屋でひとりコソコソ観てマスターベーションする,というのではなく,何人かでゲラゲラ笑いながら「この覗見センズリ野郎のバカな顔見ろよオイ」みたいなノリで見ていたに違いないと言っている。

    エロティック・アートを見ながら,そこに感情移入して追体験をはかり,性的興奮を得てマスターベーションにふけるという,西欧的なポルノグラフィーに比して,春画を幾人かで眺めて笑いに興じるという江戸時代の鑑賞方法が,遠眼鏡による覗きを描いたこれらの図〔歌川国貞『春情妓談水揚帳』:私註〕からも如実にわかる。
    田中優子『春画のからくり』ちくま文庫,2009年,184 頁。

    春画に書き込まれたセリフも大笑いさせてくれる。

    (男)「おめへのよふなうつくしい,やせもせづふとりもせづ,そのうへ此やふにぼゞがよくて,させやふがでふづ(上手)で,じんばりでよくよがる女ハ,此日本にたつたひとりだ。太極上開,たこぼゞのうまにぼゞで,たまらぬ\/〔繰返しを示すくの字点:私註〕。よこにして二三てふとぼしたら,またほんどりにして壱てふ,茶うすにして壱てふとぼしたら,まちつとやすもふ」
    (女)「アレさ,やすまづと,つゞけてたんのふするほどしてくんなよ。サア\/,モウ\/,いんすいのさるがまたがきれたそうだ。アレサ,モツトぐつときつく,ねまでづうと引といれてくんなよ。アヽ\/」
    喜多川歌麿『ねがひの糸ぐち』より。同書,91--2 頁。

    現代のアダルトビデオや官能小説以上にアケスケで,まさに大笑いするしかない。仮名遣いも,福田恆存大先生への面当てみたいに,痛快なくらいなんのこだわりもないようにみえる。もちろん仮に岩波古典文学大系本にこのくだりが収録されることになれば,「歴史的仮名遣い」にしかるべく「改竄」されるだろう。

    性的興奮と「笑い」を結合するのは,江戸の小説の魅力でもある。でもこれは,神代辰巳の日活ロマンポルノの特徴でもあり,江戸に限らない日本の「伝統」のひとつなんだと思い至るんである。日本の「伝統」には過剰な装飾も究極のグロも大哄笑もあるんである。日本の伝統的文化の特徴を「清楚で奥ゆかしい」みたいなことを自信満々で語る人がけっこういるんだけど,私はそんな独善を耳にするたびに「こいついったいどんな『古典』を読んでいるのか。多分,高校で『源氏』の一節をよくわからないなりに読んだ程度に違いない」と鼻で嗤うようになってしまった(この独善は「伝統主義者」に多いのがまた笑えるんである)。

    江戸の春画を描いたのは,当代一流の絵師だった。菱川師宣,喜多川歌麿,葛飾北斎,エトセトラ,エトセトラ。これ,いまふうに言えば,— こんなこと考えられないけれども — 黒澤明,小津安二郎,溝口健二なんかがじつはブルーフィルムも撮ってたんだよというくらいのインパクトがある。藝術のディアパゾンがおそろしく広大なのが江戸の文化なんだ,と改めて感心してしまう。

    けふもいつぱいかいたので,まちつとやすもふ。
     

    七末に早めの夏期休暇を取って大阪に帰省した。父の様子伺いと大叔母の墓参りのためである。大阪も暑かったが,新潟・福島の大雨による地獄絵からは遠いところにあった。

    病院に付き添い,主治医から父の病状を聴いたりした。父は何十年もの間,町工場の粉塵と騒音とのなかで仕事をした関係で,肺蔵には粉塵が溜りまくり耳が遠くなってしまった。そのくせ補聴器を付けるのを嫌がり,世の中の音を涼しい顔で無視して,ケロリとしている。医師との会話で私は大声で意思疎通の仲介をしなければならなかった。車の運転も長年の経験のおかげでまだ達者なもので,親戚の家に行く際も,中央環状線で頻繁に車線変更を行いスイスイ目的地に近づいて行く。昔の父には美人が道を歩いていると運転中でも目で追う習性があり,危なくてしようがなかったが,いまはさすがにそれはなくなったようである。

    帰省中,病院,墓参,親戚への挨拶以外はほとんど何もせず,麦酒をカックらって,タイガースの野球中継などテレビばかりを観ていた。甲子園での中日戦で,なでしこジャパンの川澄・海堀両選手が始球式に登場して盛り上がっていた。神戸は彼女たちの所属するクラブ INAC の地元である。関西では CM などこちら東京・横浜地域とはまるで違っていて面白い。こちらではもうまったく流れなくなったウナジェル(「♪魅せたい肌の虫さされケア・ウナジェ〜ル」)の CF が関西ではいまうるさいくらいに押し寄せて来る。また,『アホやねん!すきやねん!』なる NHK 大阪のローカル番組 — ガリガリガリクソン,桜 稲垣早希のオタク臭ぷんぷんのタレントが司会する NHK としては珍しいバラエティ番組 — が放映されていた。NMB48 が出て来るところもカンサイなんである。
     

    * * *

    そんなわけでまるで「痴」的な数日を過ごしたんだけど,往復の新幹線のなかで一冊だけ本を読んだ。ルース・タトロー著,森夏樹訳『バッハの暗号 — 数と創造の秘密』(青土社,2011 年刊)。

    バッハが作品のなかで数のアルファベットを使用したことは知られている。数のアルファベットとは,アルファベットに数値を対応付けて言葉や音階の数値に意味を見出す様式である。『フーガの技法』のなかで B-A-C-H という自身の名を音階のシ・フラット—ラ—ド—シに読み込んだことは有名だけれども,音階や小節に結びついた数 3, 7, 12 などの象徴性について論じられることも多い。フリードリッヒ・スメントが 1947 年に発表した論文は,その後のバッハの数の象徴性についての権威的存在になっている。本書はこのスメントの論理を批判しつつ,バッハの数のアルファベットが 17, 18 世紀ドイツ詩の文化状況に基づいていたことを文献学的に論証するものである。

    スメントがまったく疑念なくユダヤのカバラに数象徴を求めたのに対して,タトローは丹念に文献学的連接を追い,バッハの数のアルファベットの使用の源を探り当てている。本書の美点は,なにより,カバラとルター派神学(バッハは信仰厚いルター派プロテスタントであった)との相容れない神学的性質の解決を文献学的になしたところである。ドイツ・バロック期文学の一特徴の素描にもなっている。ただ残念なのは,遊び的要素の大きい「詩のパラグラム」にバッハのマナーの根源を求めるに際して,ではそれがいったいどのような音楽的あるいは文化的な思潮を意味しているのかという美学的問題論が,きちんと追究されていない。カバラの神秘主義的象徴はたしかにバッハに相応しくないのは理解できたけれども,パラグラムがバッハあるいは時代の美学的思想とどのような有機的意義をもって繋がっていたのか,という私にとって最大の関心ははぐらかされたような気がした。

    本書にはゲマトリア(文字と数値との対応付けによる数の象徴化),ノタリコン(頭文字・末尾文字による暗号的意味の読み込み),テムラー(アナグラム),クロノグラム(言葉からローマ数字を抽出することで数値を導く方法)などが詳細に記述されている。このパラグラムを成り立たせる数のアルファベット表が付録に整理されている。本書のもうひとつの価値である。挙げられている例がとても面白い。

    Johannes Baptista
    Hic Elias secundus

    このラテン語は「バプテスマのヨハネ // ここにいるのは第二のエリヤ」という意味。固有名詞を短い格言のようなものに結びつけるパラグラムの例である。二つの行は,数のアルファベット変換表に従って文字列の数値の総和を求めると,ともに 165 になるというもの。

    テムラーの例として次のようなものがあげられている。ヘブライ語 מלאכי (私の天使) は語順を変えると מיכאל (ミカエル) と読まれる。ギリシア語の例では Ἰησοῦς (イエス) を読み変えて οὺ ἡ ὀίς (あなたは子羊) となる。

    カバラでは神秘的啓示としての意味が追究されたのに対し,ドイツ・バロック期文学では,このような隠されたテクストの意味論は「言葉遊び」として盛んだったようである。暗号の面白さと同様,テクストの外的ルールが言語素材に豊かさをもたらす例でもある。この面白さは充分に理解できる。それでもやはり,バッハがどのような思想をこうしたパラグラムの音楽的表現に込めていたのかをもっと体系的に知りたいものである。
     

     
    * * *

    先日,Yahoo! コメンターによる「韓流垂れ流しフジは売国奴」なる書き込みをからかった。そのあと俳優の高岡蒼甫さんがツイッターで「正直,お世話になった事も多々あるけど 8 は今マジで見ない。韓国のTV局かと思う事もしばしば。しーばしーば。うちら日本人は日本の伝統番組求めてますけど」 と書き込んで大騒ぎ。結局,彼は事務所を退社した。別に好き勝手なことをツブヤイても罪はない。こんなことで,辞めることはないだろうと思う。社会人なら,雇主・スポンサーに対し根拠ない(なぜなら「韓国のTV局かと思う」くらい「韓流」垂れ流しでも,視聴率の上がらない「日本の伝統番組」とやらよりも総じて視聴者にとってありがたいわけなのだ。「日本の伝統番組」って何? 批判する一方で「つまんねぇ」と秘かに思う「日本の」番組にもアンタ出てたんじゃないの?)批判をするなら,辞めてからすべき。だから彼も事務所を辞めるしかなかったのだろう。

    でも一方で,この人,誰のおかげでメシ食えてんのかどうも認識が足りない人物のようである。作家・詩人には,本というものが読者の求めに応じて出版されその過程で,編集者・校正・組版担当・印刷業者など様々な無名の人たちによる共同作業があることを無視して,自分の才能だけで本が出来上がり売れて行くと勘違いしている人がいる。高岡さんもどうも自分のエラさだけでテレビに出られていると思っていたようである。そうでなきゃ,ただ単に「韓流が嫌いだ」といえば済むのに,わざわざ雇主たるテレビ局の批判にまで飛躍しないではおれない,このような愚かな「強がり」ないし「自信満々」は出て来ない。頭を冷やしたあと彼が世間知らずの拭い難い後悔に苛まれることは間違いなさそうである。ま,世間知らずが仕事をホされていよいよ世間に悪意を抱こうが,俺にはどうでもいいけど。

    雇う側と雇われる側との協調ということで,思い出した。九州電力が原発のシンポジウムかなんかで社員に原発賛成意見のサクラをやらせた — そういう「ヤラセ」が問題になっている。たしかにセコいやり方だとは思うけれども,原発を止めたくない九州電力,ひいてはその社員にとってこのような行動に出るのは,ある意味で当然である。社員も組織的な指示である以上,原発で食っている以上,反対意見に「民主的に」反対しようとしても(だって誰が応じてもよい意見募集なんでしょ?),どこにも悪はないと思う。

    そもそもこれが「ヤラセ」になるような意見の収集手段を採った「佐賀県民向け説明会」の運営方針こそまずいように思う。普通なら,多くの意見を正しく評価しようとすれば,無作為に選んだ電話番号に掛けて意見を問うなどの「作為が入りにくい,ヤラセの起きにくい」手段(新聞社が世論調査でよく行う手法)を採用するはずではないか。ということを考えると,この問題の首謀者は説明会の主催者にほかならないということになる。つまり,実行者の九州電力ではなく経産省,及びこれと結託した佐賀県こそが悪の元締めである。なのに,九州電力ばかりが槍玉に挙がっていて,海江田経産相は「九州電力はけしからん」としか考えていないというわけだ(笑わせてくれる)。ま,俺は原発推進には反対だから,この「ヤラセ」問題で推進勢力が叩かれるのは,悪くない。
     

    ※ 8.3 付記

    高岡蒼甫さんが Twitter 発言で結果的に事務所を辞めるハメになった件について,「言論弾圧」だと息巻いている人たちがいる。彼は己の軽率な発言の責任をとらさせられただけで,弾圧なんて受けていない。顧客をバカにしたかどで会社をクビになる。これは「弾圧」だろうか。これは単純に「社会常識」なんじゃなかろうか。こんなバカみたいなことで「言論弾圧」を持ち出すなんて,ロシアや中国で本当に弾圧されている — 要するに命の危険にさらされている — ジャーナリスト・活動家の目からは,日本は笑いたくなるくらい傷つきやすく健康的ないい国だと思われるに違いない。

    単に「韓流が嫌いだ」というに過ぎないのに,そこに「日本の伝統」がどうのこうのと持ち出してマスコミを叩く姿は,ネット「右翼」(本物の右翼に失礼であるから括弧書き)とまったく変わるところがない。「日本の伝統」って何でしょう?(高岡さんは「日本の伝統番組」っておっしゃっていますが)能や歌舞伎,茶の湯の特集番組でしょうか? では,高岡さんはいったいどのような「伝統番組」に出演されていたんでしょうか? — 「伝統」という言葉,ここではまったく抽象的で現実味がない。そういうところがこの高岡 Twitter 問題の唾棄したくなる点なのである。中国や韓国に対しては,何にせよ「伝統」や「民度」を持ち出して攻撃的になる — これは最近の若いネット住民の特性になっている。「オレは韓国人や中国人に仕事を取られて困っている。だから奴らを追い出せ」— 私には高岡発言はこのようにしか聞こえない。「伝統」を持ち出すなんてクソくらえである。

    仕事で契約書などの内容確認をしなければならないことが多い。また特許法などの条文を読まなければならないこともある。こういう事情で法令用語の基本を覚えさせられて来た。内閣法制局が『基本法令用語』というものを纏めていて,これが大きな指針になっている。これを見ると,法律に照らして判断しなければならない日本語文(契約書など。以下,仮に「法的文書」としておく)は,一種独特の文体をなしており,論理的正確性を担保するためにさまざまな「符牒」を決めていることがよくわかる。

    たとえば,法的文書においては「場合」,「とき」,「時」は,厳格に使い分けることになっている。「場合」,「とき」は仮定的条件を示し,「時」は一定の時刻を示す。ここで,仮定的条件が二つある時,より大きな条件を「場合」で,小さい条件を「とき」で示すということになっている。「とき」と「時」は表記の違いでしかないのに,決定的な意味論的差異を付加されているわけである。もうひとつ,「及び」,「並びに」,「又は」,「若しくは」といった接続詞も法的文書ではかなり厳格に用いられる。「A及びB若しくはC又はD」という記述は,((A and B) or C) or D という論理条件を規定しているのである。

    しかしながら,こうした法的文書の用語法は,甲・乙で相互に確実な理解を共有するための工夫,ルールであって,このあり方そのものはどんな文章にもついて回る意味論上の基本的属性・指向である。つまり『基本法令用語』は,措辞というものが,固定的意味を本来的にもっているのではなく,「ある条件のもとでそれに付加した取り決めを学ばなければ現実的意味をなさない」ものであることを示して余りある。文体,様式とは,こういう語彙的ルールを含む書記法の多様な統制の総体を,「文学的」・「美学的」に表現したものである。このルールとしての言語のあり方は「法的文書」特有の属性だと思う人があるかも知れない。私は違うと思う。文学をはじめとして,あらゆる言語行為は言葉の辞書的意味以外の意義を担わされている。「辞書的意味」というのは「製品の設計書」のようなもので,「実際の製品」である実際使用の言葉においては,別途意義づけられた意味のほうがむしろインパクトが大きい。そして,別途の意義づけがある統制を有しているとき「文体」とか「様式」というのである。

    世の中には「文体」を作家の体臭のような「個性」だと思っている人が結構いる。「文は人なり」という言を無邪気に信じている人のこと。ま,「感性」は人の勝手ではある。仮名遣い・表記について,「漢字で書ける物は何でも漢字で書けば意味が明らかになるので善い」としたり顔で言う人がいる(「正字正かな」派といわれる人たちである。字音仮名遣いの煩わしさから逃れられるからこんな極付けをするわけである)。「時」も「とき」も等価だと断言するような彼らは,法的文書なんかに関わりのない学生さんみたいな人だろう。ま,人の勝手ではある。「勝手」というのは,「相手」ないし「公」に対する責任を意識しないで済む,ということである。唯我独尊。幸せなんですね。

    『基本法令用語』は法律学関連書籍の付録に付いている。六法全書にも収録しているものがあるかも知れない。『基本法令用語』を収録している書籍を挙げておく。
     

     

    付記:

    言語解釈・表記における「ルール」の存在がわからない,勝手な解釈をする人がゴマンといる。私が作成した旧字・旧仮名変換ツール misima について,「ミシマなら mishima だろ」というバカにネットで遭遇したことがある。日本語のローマ字表記はヘボン式というものが「一般には」流通していてこれによれば「シ」は shi であり,この言をなす人は暗黙のうちに「一般的流通様式」が「正しい」ものとして身に染み付いていてこれを疑うことがない。しかし日本語のローマ字表記はもとより決め事=ルールにすぎず,その場合,昭和 29 年に内閣訓令として告示された綴り方によれば「シ」は si なのである(よって,学校でもまずはこの訓令方式を習うはずである)。私が misima と名付けたのは,これが「ミシマ」でも「ミジマ」でもなくあくまでただ単純に misima にしたかったからであるが,「ミシマなら mishima だろ」などと言う,「正しい表記」の身に染み付いた,「ルール」の意義のわからないバカどもを,暗に,陰険に,愚弄したかったからでもある。

    「増田・ますだ」という姓を,日本人なら誰でも,ローマ字で Masuda と綴る。でもフランス人やドイツ人なら,この表記をみてはじめから「マスダ」と発音できる人はまずいないと思う。おそらく彼らは「マズダ」あるいは「マジュダ」と発音するはずである。ヨーロッパの多くの言語では母音に挟まれた単一の s は,z と発音するのがほぼ決りになっているからである。「マスダなら massuda or massouda だろ」というわけである。表記と発音の関係なんて本来いい加減なものである。それがいい加減ではなくなる根拠は「ルール」というものが存在しているからにほかならない。

    集英社から出ていた「古典俳文学大系」所収の三冊を古書で手に入れた。『蕉門俳諧集』一及び二,そして『蕉門俳論俳文集』。集英社は『週刊少年ジャンプ』で儲けて,赤字垂れ流しでこういう本を作る。関係ありませんが,もうひとつ言うと,ベースボールマガジン社は『ベースボールマガジン』で大儲けする一方で,恒文社という版元名でロシア文学の良書を出して赤字を垂れ流す。わが国の出版文化の,しかもお国の強制とは無関係の面白い習性である。

    このシリーズは私にとって垂涎ものであって,高価でこれまで手が出なかった。これだけはと思う巻を個別にアマゾンのマーケットプレイスで見つけて購入したのである。『芭蕉七部集』以外の,たとえば『虚栗』などの俳諧書や,『去来抄』・『三冊子』以外の芭蕉高弟による俳論は,文庫本などの簡易な形では読むことが出来ない。本大系本は芭蕉関係論で言及される作品をほぼ収録しているんである。

    芭蕉の連句・俳句の理解のために少しずつ読みたいと思っている。とりあえず,郵送されて来てすぐ『蕉門俳論俳文集』を斜め読みしていたら,『二十五箇条』の「仮名遣ひの事」が眼に留まった。この書は解説によれば「従来秘伝書として伝写を重ねて来たもの」で,「内容は蕉門の作法書・俳論書として大方不都合な点はな」い。蕉門十哲のひとり各務支考が纏めたものだろうとある。

    世に定家卿のかな遣ひといふものあれども,あまりに繁きゆへ(ゑ)にまぎれてしれがたし。むかしはかなづかひの詮義(議)もなけれ共,其後の事なれば大概しりて,埒の明事なり。されば,はいかいには,さむふとも,あつふともかくなり。さむう・あつうと書ては,かな書の経文見るやうにてわろし。此類は心得あるべき事なり。
    大磯義雄・大内初夫校注『蕉門俳論俳文集』古典俳文学大系10,1976 年第三版,75頁。下線は私。

    岩波文庫で芭蕉の句を読んでいると,歴史的仮名遣いから外れる表記に頻繁に出くわす。たとえば,「さとのこよ梅おりのこせうしのむち」(貞享四年)。「おりのこせ」の「お」は,「折る」の歴史的仮名遣いならば,「を」が「正しい」ことになっている。『旧かなづかひで書く日本語』の著者・萩野貞樹ならば,「降り残せ? 意味不明」と宣うに違いない(国語が専門のくせに哀れな学者先生なんである)。この時代は「実態としての仮名遣い」(築島裕『歴史的仮名遣い—その歴史と特徴』による)が主であった,要するに正書法が確立していない実用本意の仮名遣いの時代であった,という認識しか私にはなかったのだけれど,文藝に関る者には独特の統制があったことを『二十五箇条』のこのくだりは示している。ここにあるのは,「正しい」仮名遣いなんて概念ではなくて,「経文」を連想させたくないという「スタイル」の議論である。「正しい」かどうかなんて気にするはずがない。何故なら,正否の判断を分ける「ルール(正書法)」がまだ確立されていなかったのだから。ここで「正しいかそうでないか」は無意味だというのを「相対主義」っていうんでしょうかね?(そういうバカがいるんである) それはそれとして,『二十五箇条』を読み,古典において書き言葉に意識的であるとはこういう立場なのかと私は感心してしまった。

    蓮實重彦 — 私はその文体が大嫌いだが言説についてはいたく尊敬してもいる — が,フローベールの書翰について面白いことを書いている。フローベールは若き日に熱愛した娼婦からの手紙にあった綴り誤りについて(彼女は作家への純な愛を書き綴るとき,automate を otomate と書いた),後年,綴り誤りに対する軽蔑と階級的優越感を愛人に書き送っている。これに対する蓮實の分析は以下のとおり。ちょっと長大な引用ですみませんが,仮名遣いを考えるにあたっても,きわめて示唆的で鋭い。

    つまり,正しく書くことがフランス語にとって知的財産と見なされうることになったのは,十九世紀前半のことにすぎないというわけだ。そして,一八四〇年に十八歳であった地方都市の青年ギュスターヴ〔フローベール:私註〕は,正しく綴ることが階級的符牒となった第一世代に属しているのである。その子弟をパリの大学に送って勉学を続けさせようとするほどの地方のブルジョワジーにとって,いまや正確な綴字法の習得が一つの知的資産となったわけだ。更にいうなら,階級的差別の新たな指標がそこに形成されたとでもしようか,とにかく,automate と otomate,catégorie と cathégorie をめぐる挿話は,そうした歴史的な文脈で捉えられねばならないのだ。一見,言葉への潔癖な姿勢かと思われるギュスターヴの中には,一つの政策として普及したばかりの綴字法を介して,無意識のうちに社会的抑圧に加担する加害者の姿が,その新興ブルジョワジーとしての階級意識として露呈されている。彼は,たった三代ほど昔の自分の祖先が,その姓を Flobert とも Flaubert とも綴ったことを知らずに,そこに見られるのと全く同じ母音の綴りをめぐって,automate と otomate の書き違いを許すことができない。現実に発音された場合は,ほとんど違いとして響くことがなく,ただ,ラテン語の知識があればこそ人が auto- と綴りうる一語へのこのフローベールへのこだわりが,自国語への愛の一形態だとするなら,その愛は,明らかに捏造された政治的な虚構にほかならぬ。

    「正しい」綴りや仮名遣いへの執着は近代人の幻想でしかない。実際の生きた言語の姿を,国語というフィクションを通してではなく,きちんと見よ,と蓮實はいうのである。なんか「正字正仮名」とやらの戯言をそのまま批判しているように私には思われる。「彼は,たった三代ほど昔の自分の祖先が,その姓を Flobert とも Flaubert とも綴ったことを知らずに,そこに見られるのと全く同じ母音の綴りをめぐって,automate と otomate の書き違いを許すことができない」ー「『正字正仮名』信奉者はたった三百年あまり昔の芭蕉が,俳句で『おりのこせ』と綴ったことを知らずに,そこに見られるのと同じ音の仮名遣いをめぐって,『を』りのこせと『お』りのこせの書き違いを許すことができない」。ちゃんと古典を読んでから「傳統」を語ってくださいまし。
     

    20110427-shomon.jpg

    古典俳文学大系〈10〉蕉門俳論俳文集 (1970年)

    古典俳文学大系 10
    大磯義雄・大内初夫校注
    集英社

    新常用漢字表

    |

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

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

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

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

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

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

    * * *

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

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

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

    あるいは,

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

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

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

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

     

    ※ 4.26 付記

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

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

    ※ 2011.5.28 付記

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

    misima 漢詩分析・詩語検索機能について,簡易版を追加した。旧版は SQL を直接入力する形態だった。これは DB に蓄積しているすべての項目について,柔軟な検索ができるのだけれども,SQL 操作ということもあり,限定公開とした。簡易版はごく限られた条件指定しかできない。それでもこれくらいありゃいいか,ということでこちらは一般の漢詩作成者の方々のお役に立てればと思い,一般公開とする。旧版も expert 版ということで残してある。方式的には expert 版も簡易版も同じで,簡易版は SQL 組立ての JavaScript を追加しただけである。

    開発・本番環境は FreeBSD 8.0-RELEASE, Mac OS X Snow Leopard, Tiger, J2SDK-1.5, J2SDK-1.6, Tomcat-5.5, DWR-3-rc1, SQLite-3-5.6, SQLite-JDBC-3.7.2。ブラウザは Safari-5.0.3, Safari-4.1.3, Google Chrome-9.0 にて確認している。Windows ではまったく試験していないのでちょっと不安。

    ここで簡易版の使い方を簡単にしるしておく。misima 漢詩分析・詩語検索機能のコンセプト,実現方式については「misimaKansiServlet 漢詩 Chinese Verse 平仄音韻分析」,「DWR with Java: misima 漢詩詩語検索」を参照。

    misima 漢詩平仄音韻分析(Servlet版)」ページの「詩語検索」欄にある をクリックすると,別ウィンドウで検索画面が開く。検索はここで実行する。検索条件は図 1. に示す「平仄パターン」,「詩語」,「韻字」,「韻目」 を指定できる。
     

    20110220-condition.jpg

    図 1. 検索条件

    「平仄パターン」(A) は求める詩語の平仄の並びである。プルダウンで平仄を設定する。「」は「平」,「」は「仄」を意味する。初期表示では「○-○-○」,すなわち「平-平-平」の 3 文字詩語の条件になっている。もし 2 文字の詩語を求めたいなら,3 番目のプルダウンで「-」を選択しなければならない。

    ○,●」いずれの場合も,検索結果に「」記号のものが含まれる。これは両韻を示す記号である。例えば,「思」という文字は意味によって「上平聲四支」と「仄去聲四寘」と平・仄どちらでも使用される可能性をもつ。もちろん詩語においてはどちらかに決まるのであるが,misima 平仄辞書で両韻のものは平・仄いずれの条件でもヒットするようになっている。だから当該詩語でその両韻文字がどちらの平仄で用いられているのか,辞書に当たって意味を確認する必要がある。

    「詩語」(B) は指定した一文字を含む条件である。一文字しか指定できない。

    「韻字」(C) 指定は詩語の末尾文字の条件である。押韻文字が決まっているときに用いる。

    「韻目」(D) は「一東」などの韻目で検索するための指定である。押韻文字が決まっているとき,その韻目を含む詩語を閲覧したい場合などに用いる。韻目指定は面倒なので,ポップアップから選択するようになっている。「韻目」の入力エリアにカーソルが位置づけられると,入力メニューがポップアップされる(図 2.)。その一覧から検索したい韻目をクリックすると,入力エリアに韻目条件が設定され,メニューが消えるようになっている。
     

    20110220-inmoku.jpg

    図 2. 韻目ポップアップメニュー

    条件 (A) は必須である。かつ,(B),(C),(D) から少なくともひとつは条件指定をしなければならない。そして,検索は (A) and ([(B)] or [(C)] or [(D)]) ([ ] 内はひとつ以上必要) という条件で実行される。これは長大な検索結果を防ぐためである。簡易検索はこれ以外の条件指定はできない。

    簡易版検索結果例を図 3. に示す。これは「●-○-○」の 3 文字でかつ韻字が「秋」である詩語の検索条件である。
     

    20110220-simple-search.jpg

    図 3. 簡易版検索結果例

    詩語韻目は,「ニモニック:番号:韻目」の様式で出力される。ニモニックの意味は次の通りである。hk: 上平聲; hs: 下平聲; sj: 仄上聲; sk: 仄去聲; sn: 仄入聲。「hk:01:東」は「上平聲一東」を意味する。; (セミコロン) は当該文字が複数の韻目を有することを示している。A;B;C は A, B, C 三つの韻目を持つ文字であることを示す。対応する文字の区切りは - (ハイフン) で判断できる。

    簡易版では,(A) and (B) and ((C) or (D)) などのような検索条件指定は不可である。こういう柔軟な条件設定は expert 検索でのみ可能である。expert 版の条件指定は,「実行 SQL」のテキストエリアに where 句の内容を直接コーディングする。検索キーはページにある通り,詩語: sg; 詩語平仄: hs1; 詩語韻目: in1; 押韻字: oj; 押韻字平仄 hs2; 押韻字韻: in2; 詩語字数: ss; 出典: ta が指定できる。expert 版の検索結果を図 4. に示す。
     

    20110220-expert-search.jpg

    図 4. expert 版検索結果例

     

    最後に参考文献を上げておく。
     

    Ajax の高度な活用集。詩語検索機能で利用した DWR についても,サンプル付で少し解説されている。しかし,addRows() 関数の仕様など,DB 検索結果表示に適したテクニックの解説までは望むべくもなく,少し自分の課題に応じた詳細事項は,やはり DWR サイトのドキュメントに当たらないと解決不可能である。
     

    オライリーのクックブック・シリーズは困ったときに必ず役に立つ。本書で述べられている便利なライブラリもオライリーのサイトからダウンロードできる。
     

    これは JavaScript のリファレンス本としてはいちばん優れていると思う。なんといっても,非同期通信オブジェクト,XML DOM オブジェクトについて整理されている。オライリーの「クイックリファレンス」よりも個人的には使いやすい。
     

    ※ 2011.12.23 付記
    Spam が多いので misimaKansiServlet は限定公開としました。悪しからず。

    漢詩作成支援の一環で今回,詩語検索を追加した。SQLite3 で構築した詩語データベースを Java サーブレットから JDBC でアクセスする。高速化のために Ajax + Java Servlet を基本とした。近年,Ajax も便利なライブラリが出現し,Web 2.0 の世界をより簡単に構築できるようになった。今回はそのひとつ DWR (Dynamic Web Remoting) を使うことにした。

    DWR の特徴は大きく二つある。第一に,JavaScript 動作の微妙に異なる数あるブラウザへの対応を吸収してくれること。第二に JavaScript からサーバの Java クラスの呼び出しを可能としたこと。とくに後者は,非同期通信インタフェースとサーバ (Servlet) の存在をプログラマから隠蔽することにより Java Servlet の約束事に精通していない Java プログラマにも (JavaScript が書けないとならないんだけど) Web サーバ・プログラミングを近しいものとする。

    以下,misima 漢詩詩語検索を作成したメモを残しておく。

    詩語データベースの構築

    太刀掛重男著『詩語完備 だれにもできる漢詩の作り方』は,詩語に基づいて漢詩を作成する方法を述べており,合わせて詩語集を掲載している。また,詩語の韻書としては『詩韻含英異同辨』という決定版が存在する。できればこうした詩語集をデータベースに蓄積するのがよいのだが,著作権問題があり公開 DB に入れるのは憚られる(自分だけの個人辞書として構築するならよいのだろうが)。しかも,データ入力に気の遠くなるような時間を要する。私のようなサラリーマンにはとうてい不可能である。

    そこで今回の詩語 DB は,どちらかというとコーパス・ビュア風のアイデアに基づくことにした。つまり,インターネットで大量に公開されている漢詩テクストを掻き集め,その詩行を 2 文字 + 3 文字 (五言詩) や 2 文字 + 2 文字 + 3 文字 (七言詩) に分解し,それぞれを「詩語」と見なし,これらに平仄・音韻分析処理を加えて,その結果をリレーショナル・データベースに仕立て上げるわけである。平仄・音韻分析用のデータベースは,「misima 漢詩平仄音韻分析」で構築済みだった。

    私はロシア語作文をする際,語結合が妥当かどうか Google で検索してみる。ロシア語は「〜において」というとき,в, на のいずれの前置詞を使うのか悩ましいことが多い。「お茶会で」は на чайной церемонии でよいのか? Google で検索するとこのフレーズを含むきちんとしたページがたくさんヒットするので,不自然ではないとハッキリする。コーパス・ビュア風というのはこういう使い方を指している。漢詩詩語についても過去の偉大な詩人の作品で同じような確認ができるはずである。もちろん,詩語の意味,題詠用の分類(秋思,離別などの詩語と結びついたテーマ論)がないと片手落ちなんであるが,求める平仄,文字,字韻とそれに合致する詩語にどのようなものがあるのかが調査でき,詩語検索機能としてはそれなりのものが得られるはずだと考えた。「平-平-仄のパターンでこの文字を含む詩語」,「脚韻がこの韻目の詩語」,程度でも検索できれば便利ではないか?

    『唐詩選』などの漢詩 500 首近くをネットから wget で戴いて来て,Perl HTML::TreeBuilder モジュールでもって詩テクストを解析,抽出して約 4,000 語の詩語テクストを得た。ついでに出典(詩人,題名)情報などの属性をぶら下げた。これに詩語の平仄データ,韻目などを追加して SQLite3 のデータベースが成った。

    Java 詩語検索クラスの作成

    DWR は様々な Java クラスの呼び出しをサポートしている。今回は JavaBeans で行くことにした。JavaBeans はデータを保持するオブジェクトで,データ項目の出し入れに set〜, get〜 なるメソッドを一式用意しておくというモジュール構造であり,データ部品化の基本になっている。サーバで DB を検索し,その結果を Bean に入れ,JavaScript から DWR インタフェースで取り出す。基本設計はそのようなものである。詩語のための JavaBeans SigoBean.java を以下に示す。本来なら DB に蓄積している項目はいくつもあるが,ここでは詩語,平仄,韻目のみに限定してある。

    // -*- coding: utf-8; mode: java; -*-
    /**
     *  misimaKansi SigoBean 漢詩詩語
     *  Copyright(c) 2011, isao yasuda, All Rights Reserved.
     */
    public class SigoBean
    {
        /**
         *  SQLite3 database
         *  詩語 sg, 詩語平仄 hs1, 詩語韻 in1
         */
        private String sg  = null; // 詩語
        private String hs1 = null; // 平仄
        private String in1 = null; // 韻目
     
        /** Constructor */
        public SigoBean(String sg,  // 詩語
                        String hs1, // 平仄
                        String in1) // 韻目
        {
            this.sg  = sg;
            this.hs1 = hs1;
            this.in1 = in1;
        }
     
        /** Getter メソッド */
        public String getSigo()    { return sg;  }
        public String getHyosoku() { return hs1; }
        public String getSigoIn()  { return in1; }
     
        /** Setter メソッド */
        public void setSigo(String sg)     { this.sg  = sg;  }
        public void setHyosoku(String hs1) { this.hs1 = hs1; }
        public void setSigoIn(String in1)  { this.in1 = in1; }
     
        /** テキスト取得用メソッド */
        public String getSigoBean(String sep) {
            return sg + sep + hs1 + sep + in1;
        }
    }
    

    さて,実際に詩語データベースを検索し,上記詩語 Bean の配列テーブルとして結果をストアする Java クラスが当然必要である。SigoTable.java コードを以下に示す。ここで,SQLite3 DB アクセスは JDBC インタフェースを使っている。SQLite 用 JDBC ドライバは SQLiteJDBC – Xerial – Trac から sqlite-jdbc-3.7.2.jar (2010.8.27 版) を落として,クラスパスに通しておくとともに,Servlet コンテナ Tomcat の $CATALINA_HOME/common/lib/ にもコピーしておく。

    // -*- coding: utf-8; mode: java; -*-
    import java.util.ArrayList;
    import java.util.List;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    /**
     *  misimaKansi SigoTable 漢詩詩語検索
     *  Copyright(c) 2011, isao yasuda, All Rights Reserved.
     */
    public class SigoTable
    {
        /** 詩語 DB path */
        private static final String dbpath = "/usr/local/etc/misima/SIGO.db";
        /** SQL */
        private String sqlcond = null;
        /** 詩語テーブル行データ */
        private ArrayList<SigoBean> dbRowList = null;
        /** データ行数 */
        private int gyosu;
       
        /**
         * 詩語 DB を検索し,詩語テーブルを SigoBean 配列として返却する
         * @return 詩語テーブル
         */
        public SigoBean[] getSigoTable(String cond) throws Exception {
            sqlcond = "select * from SIGOTBL where " + cond + ";";
            dbRowList = new ArrayList<SigoBean>();
            /** DB検索 */
            Class.forName("org.sqlite.JDBC");
            Connection conn = null;
            try {
                // create a database connection
                conn = DriverManager.getConnection("jdbc:sqlite:" + dbpath);
                Statement sttmnt = conn.createStatement();
                sttmnt.setQueryTimeout(30); // set timeout to 30 sec.
                ResultSet rset = sttmnt.executeQuery(sqlcond);
                while(rset.next()) {
                    // read the result set
                    dbRowList.add(new SigoBean(rset.getString("sg"),
                                               rset.getString("hs1"),
                                               rset.getString("in1")));
                }
                rset.close();
            }
            catch(Exception e) {
                System.err.println(e.getMessage());
            }
            finally {
                try {
                    if(conn != null)
                        conn.close();
                }
                catch(Exception e) {
                    // connection close failed.
                    System.err.println(e);
                }
            }
            gyosu = dbRowList.size();
            SigoBean[] dbrows = new SigoBean[gyosu];
            return dbRowList.toArray(dbrows);
        }
       
        /**
         * 詩語 DB 行数を返却する (for debug)
         * @return 行数
         */
        public int size() {
            return gyosu;
        }
    }
    

    DWR 環境の作成

    DWR のパッケージは DWR ダウンロードページ から dwr.war (Version 3. rc-1) を落として使った。DWR のサーバ側環境設定は大きく 3 点。以下簡単に示す。

    1. ダウンロードした dwr.war を詩語検索 Web アプリの WEB-INF/lib ディレクトリ直下に格納する。
    2. dwr.xml を,以下の内容で WEB-INF/ 下に格納する。これは JavaScript の記述とサーバ側 Java クラスを結びつけるための記述である。create タグで上記 SigoTable クラスが呼び出されるよう,convert タグによってそのデータ構造へのアクセスは JavaBeans SigoBean を介して行われるよう指定している。詳細は Configuring dwr.xml を参照のこと。
    3. <!DOCTYPE dwr PUBLIC
          "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
          "http://directwebremoting.org/schema/dwr30.dtd">
      <!-- -*- coding: UTF-8; -*- 
          misima 漢詩詩語検索用 dwr.xml
          Copyright (c) 2011, isao yasuda, All Rigths Reserved.
          $Id: dwr.xml,v 1.1 2011/02/17 13:55:58 isao Exp $
      -->
      <dwr>
        <allow>
          <create creator="new" javascript="SigoTable">
            <param name="class" value="SigoTable"/>
          </create>
          <convert converter="bean" match="SigoBean"/>
        </allow>
      </dwr>
      

    4. 詩語検索 Servlet 用のデプロイメント・ディスクリプタ web.xmlWEB-INF/ 下に準備する。今回,旧字・旧仮名遣い変換 misimaservlet のサブシステムとして作成したので,すでにある web.xml に DWR 関連用の servlet タグ及び servlet-mapping タグを追加した。DWR 部分は以下とまったく同じでよいと思う。詳細は DWR WEB-INF Reference を参照のこと。
    5. <!DOCTYPE web-app
          PUBLIC  "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
          "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
      <!-- -*- coding: UTF-8; -*- 
          misimaServlet web.xml デプロイメントデスクリプタ
          Copyright (c) 2007, isao yasuda, All Rigths Reserved.
      -->
      <web-app>
        <!-- misimaservlet サーブレット -->
        <servlet>
          <servlet-name>misimaServlet</servlet-name>
          <servlet-class>misimaServlet</servlet-class>
      ... (略) ...
        </servlet>
       
        <!-- DWR サーブレット -->
        <servlet>
          <servlet-name>dwr-invoker</servlet-name>
          <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
          <init-param>
            <param-name>debug</param-name>
            <param-value>true</param-value>
          </init-param>
        </servlet>
       
        <!-- misimaservlet サーブレットのマッピング -->
        <servlet-mapping>
          <servlet-name>misimaServlet</servlet-name>
          <url-pattern>/convert</url-pattern>
        </servlet-mapping>
        
        <!-- DWR サーブレットのマッピング -->
        <servlet-mapping>
          <servlet-name>dwr-invoker</servlet-name>
          <url-pattern>/dwr/*</url-pattern>
        </servlet-mapping>
      </web-app>
      

    クライアント・ページ JavaScript の作成

    最後に DWR のキモであるクライアント側 JavaScript を作成する。サービス用 HTML から呼び出す JavaScript として DWR ライブラリを次のように指定しておく。

    <script type="text/javascript" src="dwr/engine.js"></script>
    <script type="text/javascript" src="dwr/util.js"></script>
    <script type="text/javascript" src="dwr/interface/SigoTable.js"></script>
    

    はじめの 2 行はおまじないのようなものである。dwr/interface/SigoTable.js は,dwr.xml における javascript="SigoTable" という指定を受けて DWR が自動生成するスクリプトであり,ユーザアプリに応じて名前を変えて指定しなければならない。

    さて,DB を検索し,その結果が挿入される HTML は以下の通りである。input タグに SQL 条件を入力し,「検索」ボタンを押下すると,retrieveSigo() 関数(後述)を起動するコードになっている。

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
              "http://www.w3.org/TR/html4/loose.dtd">
    <!-- Copyright(c) 2011, isao yasuda, All Rights Reserved. -->
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>misima 漢詩詩語検索</title>
      </head>
      <body>
        <dl compact>
          <dt>実行 SQL</dt>
          <dd>select * from SIGOTBL where <br> 
            <input type="text" size="70" id="condition">;
            <input type="button" value="検索" onClick="retrieveSigo()">
          </dd>
        </dl>
        <!-- 詩語検索結果挿入するテーブル -->
        <table border="0">
          <thead>
            <tr style="background-color: #CCCCCC;">
              <th width="80px">詩語</th>
              <th width="120px">詩語平仄</th>
              <th width="400px">詩語韻</th>
            </tr>
          </thead>
          <tbody id="sigotable"></tbody>
        </table>
        <script type="text/javascript" src="dwr/engine.js"></script>
        <script type="text/javascript" src="dwr/util.js"></script>
        <script type="text/javascript" src="dwr/interface/SigoTable.js"></script>
        <script type="text/javascript" src="./sigo.js"></script>
      </body>
    </html>
    

    検索ボタンに紐づけられた検索実行制御処理 retrieveSigo() 関数は以下の通り。上記 HTML の sigo.js にこれを定義しておく。ここでサーバとの非同期通信を担っているのは SigoTable.getSigoTable(sql.value, ...); の部分である。サーバ側にある SigoTable クラスの getSigoTable() メソッドをコールしている。これは Java クラスを操作するのと同様の様式であり,DWR の特徴となっている。このコーリング書式は クラス名.メソッド名(メソッド引数, コールバック関数); である。サーバで実行されたメソッドの返値を引数として コールバック関数 が実行される。このなかでブラウザ表示に必要な処理を記述する。

    // -*- coding: utf-8; mode: javascript; -*- 
    // misima 漢詩詩語検索
    function retrieveSigo() {
        var sql = document.getElementById("condition").value;
        var cellFuncs = [
            function(data) { return data.sigo; },    // 詩語
            function(data) { return data.hyosoku; }, // 平仄
            function(data) { return data.sigoIn; }   // 韻目
        ];
        // insert table contents from DB    
        SigoTable.getSigoTable(
            sql,
            function(data){ // callback
                dwr.util.removeAllRows("sigotable");
                dwr.util.addRows("sigotable", data, cellFuncs, {
                    // 偶数行の背景色を変更
                    rowCreator:function(options) {
                        var row = document.createElement("tr");
                        if (options.rowIndex % 2 != 0) {
                            row.style.background = "#CCCCCC";
                        }
                        return row;
                    },
                    escapeHtml:false 
                });
            });
    }
    

    retrieveSigo() 関数の引数のなかに関数が記述されておりそこでさらに関数が入れ子になっている。わかりにくいのでもう少し説明しておく。ここでサーバからの返値は function(data) 関数 (コールバック関数) に渡され,こちらは DWR util.js のユーティリティ addRows() 関数で HTML のテーブル (上記 HTML の <tbody id="sigotable"> の位置) にデータを展開している。addRows() 関数の書式は以下の通りである。

    dwr.util.addRows(id, array, cellfuncs, [options]);
    - id: テーブル要素の id。テーブル要素は <tbody id="id"> とするのがよい。
    - array: 表にしたいデータ配列
    - cellfuncs: 行データの各セルに応じた処理を行う関数の配列
    - options: オプション (rowCreator, cellCreator, escapeHtml から複数指定可)
    

    retrieveSigo() ではサーバからの出力 datacellFuncs という名の関数配列で項目を抽出しつつ id="sigotable" のテーブル要素に編集している。この際,rowCreator オブジェクト・オプションを指定し,これに偶数行ごとに背景色を変える関数(= その返値オブジェクト)を対応づけている。また,escapeHtml:false オプションを指定して HTML タグのエスケープをしないようにしている。addRows() 関数は実行のたびに行を追加するだけなので,removeAllRows() 関数で予め行を削除する前処理を行っている。

    DWR の JavaScript の書き方,関数仕様詳細は DWR サイト・ドキュメント を参照。悩んだのは cellFuncs 関数配列中の data.sigo 等のオブジェクト指定であった。このうちの sigo の部分は JavaBeans の get〜 メソッドの 〜 を指定しなくちゃならないことに気づくのにえらく時間を要してしまった。それでも MVC デザイン・パターンに従って,しこしこ JSP をコーディングしていたのに比べると,遥かにわかりやすいと思う。DWR なら MVC のうちの C (Controller つまり Servlet) をほぼ意識せずに Web アプリを書くことができるからである。

    以上でリソースは整った。Java コードをコンパイルした上で,リソース一式を Tomcat 環境にデプロイしておく。

    実行イメージ

    misima 漢詩平仄音韻分析」ページに「詩語検索」のボタンを追加した。これをクリックすると,詩語検索のウィンドウがオープンして,詩語の検索ができる。詩語と平仄パターン,韻目が表示される。以下に検索イメージ図を掲げておく。これは平仄パターンが「○-●」(平-仄)もしくは「○-◎」(平-平仄両韻)の 2 字詩語で,かつ「秋」という文字を含む詩語を検索した結果である。ただし,今回作成した版は,直接ユーザが SQL を入力するというイビツにして危険なものであるため,公開は友人限定としている。(2.20 付記:その後,詩語簡易検索機能を一般公開した。その詳細は記事「misimaKansiServlet 漢詩平仄音韻分析・詩語簡易検索」を参照ください。)
     

    20110220-expert-search.jpg

    検索イメージ

     

    ※ 2011.12.23 付記
    Spam が多いので限定公開としました。悪しからず。

    misimakansi bug fixed.

    |

    misimaKansiServlet 漢詩平仄分析に要求を出す JavaScript におそまつなバグがあった。今日試しに Windows で実行してみたら,入力チェックで Windows の改行コード (CR: X'0d') がはじかれてしまう。私は普段,Mac OS X か FreeBSD しか使わないので,Windows で試験していなかったのである。失礼しました。訂正しました。
     

    * * *

    上の息子は最近,バイト以外はテニスと飲み会で出歩いてばかりいる。昨夜はバイト先の仲間との新年会。今日も大学のプレゼンなんとかのメンバーとの新年会で,午前様であった。

    しかしながら,大学に入っても卒業した高校のテニス部の練習に顔を出し後輩を指導したりしている。そんな姿をみると,人間付合いにおいてマメであって,私なんかより遥かによいところがある。大学のクラブが地域活動の一環で,新座キャンパス近くの中学校に行って,テニス教室を開いたりしている。物真似が好きな息子はそこでアントニオ猪木の真似をして,女生徒にモテモテだったらしい。誰に似たんだか。

    この歳になって,ホント,子供は勉強なんて出来なくてもよいと思うようになった。

    友人の皆様,あけましておめでとうございます。

    さて,この正月はまったくどこにも出歩かず,家でずっとプログラム作成,芭蕉研究をしていた。そして,最近,漢詩に興味があり自分でも書いてみたいと思い,漢詩の本に首っ引きであった。俳句・短歌と大きく異なり,漢詩はご存知のとおり,平仄,音韻規則が厳しくてちょっとやそっとじゃ立ち入ることすらできない。俳句なら「春の夜や兄が屁をひり咽せるまで」みたいなのは小学生でも作ってしまう。もちろん俳句・短歌もよい作品を詠むのは生半可のことではないのだけれども,漢詩はまずもって規則に準拠する壁の前に,へたくそな詩すら形をなすこと自体に苦労する。「規則」があるなら計算機の出番。ということで形式分析プログラムを自分のために作ってみた。

    misima を作成した際に漢字データベースを作ったこともあり,それに基づくこのサーバも misima シリーズとすることにした。入力した漢字が DB になかったとしてもご愛嬌ということで。この漢字 DB は 6,700 文字程度を蓄積している。覚えたての SQLite3 を使った。漢詩規則は何冊かの本を研究してロジックを考えた。3 年前に作成した misimaServlet, misimaserver を土台に,サーバ化するのは簡単であった。Java Servlet + Ajax + Perl Daemon という方式にした。Javascript が送信した電文を Java Servlet が受け,Perl サーバとソケット接続する。漢詩の分析ロジックは,すべて Perl サーバでこれを実行する。Perl サーバは 3 プロセス分プレフォークして処理依頼を待ち構えていている。ちょっと渡り歩きが多いのだが,Ajax + Java Servlet はページ書き換えが高速で,CGI よりは体感速度は良好のはずである。ただし,本プログラムで使用した Ajax の XMLHttpRequest 関数はクロスサイト・スクリプティング対策実装のため,プロキシを経由する企業 Web 環境からは misimaKansiServlet を利用できないかも知れない。

    試行版(まだきちんとデバッグしていない)を「misima 漢詩平仄音韻分析(Servlet版)」にしばらく置いておくので,興味のある方はお試しください。漢詩を作る方のお役に立てればと願っている。まだ出力がベタで汚い。そのうちできるだけ見やすくなるよう工夫したいと思う。

    主な仕様は次のとおりである。近体詩五言・七言の絶句,律詩を対象とする。詩格を自動判定する。国字(和製漢字)が含まれていると,デフォルトでは分析を停止する(オプションで無理矢理検査をすることもできる)。詩格に応じて,二四不同,二六対,下三連,弧平(五言詩では二段目,七言詩では四段目だけ)の禁則を検査する。韻字分析では,脚韻の妥当性,冒韻を検査する。拗体,通韻にはいまのところ対応していない。韻目は平水韻に準拠した。同字重出も検査するが,虚字,重言 (畳語) など許容される重複も含めて,重出と見なすようになっている。そのうち詩語データベースを作成して,詩作支援も盛り込みたいと思っている。

    実行イメージは次のようなものである。(※ 2.5 付記:画像を最新イメージで入換えた)
     

    20110103-kansi.jpg

    参考にした文献は以下である。
     

    本書は漢詩作りの入門書としては決定的な名著とされている。文字通り「誰にでもできる」と謳っている。掲載された詩語を検索しながら作詩する方法が丁寧に書かれている。漢詩とは言わば高級な着替人形のようなもので,形式と使い古された詩語との芳醇な組み合わせ自体に魅力を感じない人,新規なものにこそ魅力を感じる人には,もはや魂に訴えないだろう。ところがこの作法に慣れるにつれて,菅原道真,嵯峨天皇などの日本の古代の漢詩人たちに対して身近な親しみが芽生えて来るから不思議である。

    Amazon で古書が入手できるようなのでリンクを付けておく。新品は,版元に直接注文するか,中国書・漢籍関係を取り扱っている特殊な本屋でないと入手できない。私は東方書店 Web サイトから購入した。
     

    これは,細かいことがごちゃごちゃ書いてあるけれども,いまいち整理が足りないという欠点がある。「辞典」と銘打っているのに漢詩作詩法に関する用語の索引がないという,著者・版元の本作りに対する考え方,誠実さを疑いたくなるような書籍である。ただでさえ見た目の立派な函入りの高価な本なのだ。それでもここであげた書籍のなかではいちばん詳しく(雑然とではあるが)作詩法を解説しているので,私のプログラムも多く本書の記述に準拠している。

    著者は現代詩を憎悪しているようである。リズムも言辞もぶっとんだレベルの低い文学だとみなしているようである。漢詩が最高の文学表現らしい。ほぼ堂上にある詩語の使用しか認めず同時代の差し迫った表現を排除してしまう漢詩の本性を鑑みるにつけ,こんなことを言って殻に閉じ籠るから漢詩人が絶滅寸前になってしまったんだろう,ということが,ある意味でよくわかる書籍である。芭蕉の言う「不易流行」の「不易」ばかりを追い求め,「流行」の命脈を欠いた姿である。私はこういうのを「権威主義」だと思う。ローマはすでに亡んだのに。そのためか,著者・飯田の詩論は「負け犬の遠吠え」のような印象が拭えない。でも私なんかは,ふむふむ,なかなかいいこと言っていると思わないでもなかった。「負け犬」の言い分も聞くに値することがある,とくに世を支配している趣味が底の浅い時代にあっては。私は本書を読み,漱石,朔太郎,子規の偉大さを改めて思い知った。明治の文学的地殻変動期には,近代日本における「詩とはなにか」が深く追究されたのである。
     

    この本はどこでも手に入る。値段も手頃だし,薄くてすぐ読めてしまうし,著者も漢詩研究について日本の学会の権威的存在でもあり,簡にして要を押さえて,いちばんのお勧めかも知れない。『漢詩入門韻引辞典』とは違って著者のただの趣味でしかない詩論を押し付けないところもよい。なにより事項索引がきちんと付いているのがありがたい。さすが大修館書店である。
     

    詩韻含英異同弁 (1963年)
    浜 隆一郎,石川 梅次郎編校
    松雲堂書店

    略して「含英」と呼ばれている。求める韻を含む詩語を検索するための本である。江戸時代に書かれた書物で,しかも現代においても韻書の決定版とされている。これの引き方を覚えるのがまずひと苦労である。本書も新品は Amazon などでは入手できない。中古で出ているが,私は Yahoo! ブックスで探しまわってやっと新品を手に入れた(See: 詩韻含英異同弁 - 石川梅次郎/編校 浜久雄/編校 - Yahoo!ブックス)。
     

    『字源』は漢詩人御用達の漢字辞典である。そういう点でここにもリンクを設置しておく。misimaKansiServlet では平仄の確認において,原則,学研『漢字源 第四版』に準拠した。『字源』は適宜参照した程度である。

    これ,大正 12 年初版というのだから驚く。本辞典は収録漢語の多いのがなによりの美点である。私は普段は大修館書店『漢和辞典』か学研『漢字源 第四版』を愛用しているが(後者は Unicode コードポイントが検索できめっぽう便利なのだ),漢語・字訓を調べるときごくごくたまに『字源』を引く。

    本辞典は,大正期以降の漢詩人御用達の権威的辞書であるだけに,漢詩作成サイトの多くが「漢詩作成になくてはならぬ辞書である」かのごとく必要以上に本書を持ち上げている。でも,そんなのはウソに決まっている。『言海』など戦前に纏められた権威ある辞典は旧字・旧仮名遣いにこだわる人たちから大いに賞讃されているのだが,検索しづらいばかりか歴史的仮名遣いに誤りも散見される。『字源』にも「水」の字音を「すゐ」とするなどの誤りがある(正しくは「すい」— 「すゐ」は一般に流布していた誤りで,最近の辞典では「すい」に正されているのだ。「歴史的仮名遣い」なんてそんなものである)。また『字源』は,説明はすべて歴史的仮名遣い,漢音も字音仮名遣いのみの表示であり,初版増補の昔の活字組版がそのまま用いられていて,画数の多い漢字について活字が潰れて判読できないところすらある。エセ文化人の慕うくだらない「権威」よりも「学問性」と「有用性」に留意するならば,現代の新しい辞書のほうがよいと私は確信している。

    私はかつて古書で 4,000 円くらいで本書を手に入れたが,いまやプレミアが付いて 10,000 円以上の価格が付いているようである。経年変色した絵画に美を覚えるようなバカ文化人(歴史的仮名遣いへの回帰を叫ぶような奴ら)でない限り,普通の現代人にとって『字源』よりももっと検索しやすく内容も確かな漢字辞典はいくらでもある。
     

    ※ 2011.2.18 付記
    その後,詩語検索機能を追加した。記事「DWR with Java: misima 漢詩詩語検索」を参照ください。
     

    ※ 2011.12.23 付記
    Spam が多いので限定公開としました。悪しからず。

    事業仕分けもいい加減・SQLite

    |

    会社でも政府予算の動向把握は欠かせない。民主党政権の特色のひとつになった事業仕分けの結果も大きな関心を呼ぶ。なにせ時間と労力を掛けて必死こいて担当者が提案していたシステム化が,あの内実も知らない素人仕分け人のつっこみに対して役人がうまく対処できなかったために,一瞬のうちに「廃止,凍結」という話になってしまう。世の官庁関係の仕事をしている人で,これまでの苦労があの数十分の議論のおかげで水泡に帰してしまったような人には,あの仕分け人を後ろからブスリとやりたくなった奴もいるんじゃなかろうか。

    ま,国家事業の無駄排除のために侃々諤々議論したうえで,「無駄」と切り捨てること自体は悪いことではない。それで国税を国民生活全体にとってより有益な事業に振り向けることになるのなら,誰だって文句は言えない。もともと事業仕分けは,国税の使途において長かった自民党政権下で既得権益と化した事業,あるいは「天下り」官僚のための有名無実の事業に対する政治による裁断ではなかったか,と私は理解している。しかしいまや,ニュースでも報道されるように,すでに民主党政権となり彼ら自身が予算化したも同然の事業に,尚もつっこみを入れなければ気が済まないのは,この劇場会議,そもそも予算策定の過程に民主党がまったくコミットできていないという恥ずかしい証拠になっているだけじゃなかろうか。

    10 月末に行われた事業仕分け第三弾,特別会計の個別 48 事業の仕分け結果の資料を見た。特別会計とは,受益と負担の関係を明確にするために一般会計と区別して経理を行うものである。年金,労働保険など歳入に応じた行政の歳出で成り立っているような事業がこれに相当する。ま,事業はさすがにいろいろあるんだけど,このところ収賄事件で注目していた特許特別会計に私は目がいった。特許庁関係が特別会計になっているのは,ほぼ企業から得られる特許出願料・登録料という歳入だけで審査・審判・公報活動を行う財政構造・予算で成り立っているからである。要するに自分で稼いだカネで仕事をして日本国の産業,ひいては国民に成果を還元しているわけである。

    特許特別会計の平成 13 年度報告書が,情報公開法に基づき経産省サイトで閲覧できるようになっている。これを見ると,わが国の特許事業は 1,850 億円の歳入に対して歳出がなんと 950 億円であり,次年度繰越金が 900 億円近くもある。普通の会社なら利益率 100% に近い超優良企業である。それなら出願料を下げて出願人企業にもう少し還元したらどうかとも思う。しかしその一方で,なんのために存在しているのかもよくわからない政府外郭団体が無駄に税金を垂れ流す「天下り事業」と比べれば,稼いだ金の範囲で国益を創出している点で,遥かに健全な国家事業であるとも言える。

    ところが,事業仕分け第三弾の結論を見ると,特許電子図書館事業は「将来的に廃止」,知的財産権教育事業は「文科省の仕事であり,廃止」,とにべもない。前者は,特許庁の審査用庁内検索システムが将来的に一般にも公開されるという背景を踏まえるとまだ納得できるのだが,後者は,じゃあ文科省にきちんと予算化させるところまでフォローしろよと言いたくなる。技術的,組織的に文科省ができないから経産省・特許庁が音頭取りをしていることをまったく理解していない。なのに,やめろと言うだけでこうしたらどうかという前向きな意見がまるでない。また,「アンタじゃなく文科省がやるべき,アンタはそれを手伝いなさい」などと省庁の縦割り構造を無視した結論を出すのは,現実的な観点において無責任ではなかろうか。

    要するに,いまの事業仕分けはアラ探しばかりをする素人の無責任なつっこみにしか見えないのである。国益を考えた建設的意見がまるでない。そう考えるのは私だけではないと思う。だいたい,特別会計のような歳入と歳出の構造が明らかな国家事業にまで素人が首を突っ込むんじゃねぇ。技術立国の根本政策の実行官庁である特許庁の事業を,しかも健全な税金運用をしている特許事業を,井戸端会議的に引っ掻き回すんじゃねぇ。私はアタマに来た。私は当初の事業仕分けに対しては「政治主導」の端的な姿としてかなり好感を抱いていたが,今回の結果を見る限り,初心を忘れた素人つっこみ大会にしか思われなくなってしまった。事業仕分けはいまやただの劇場政治である。仕分ける前にきちんと予算化の段階でコミットすべきである。それはできるはずなんじゃないんでしょうか,政治主導というのだから。
     

    * * *

    最近,プライベートで漢詩を研究していて,misima の機能に漢詩規則分析を入れたいと思うようになった。平仄の妥当性の検証,孤平や下三連等の禁止事項のチェック,平仄に適合する詩語の検索など,漢詩を作りたいと思う人・漢詩の分析をしたい人のための支援機能である。misima の辞書を作りながら四声データも集めたので,まずはこれをもとにした平仄チェック,禁止事項チェックを行って診断結果を出力するとともに,すでにある機能と連携して \CID 形式の正字体に自動変換し,返り点命令変換を含めて,LaTeX 形式で出力するくらいはできそうである。

    漢字・詩語データベースをどうするか悩んで,これまでと同じように DBM にデータを格納し Perl の連想配列で回すのがいちばんラクだと考えたのだけれども,検索機能ものちのち入れるんなら,ちょっと大げさだけど RDB にしようと思った。そこで手軽な SQLite を少し勉強することにした。SQLite は,RBMS サーバなしにライブラリだけで RDB を使う枠組みを特徴とし,ユーザ管理機能も高度なトリガー機能もないけれどもシンプルで軽い,パブリックドメインの RDB ソフトウェアである。Safari や Firefox が SQLite でブックマークなどを管理していることをいまさらながら知った。

    会社の帰り,いつも行く虎ノ門の書店「書原」で本を漁った(この本屋,人文社会系の品揃えはなかなかである一方,コンピュータ関係はまったくダメである。またコミック,マンガ雑誌などまったく置いていない。よってコンビニ的風景を免れている。そのポリシーこそが私の贔屓にする所以でもある)が,SQLite の本は見当たらなかった。今日はいつもと違う道で新橋まで行こうか,とぶらぶら霞ヶ関を歩いた。日比谷公園にでも寄るか,ともふと思ったが時間が遅いのでこれはやめ。財務省と文科省の間の小道を抜け,桜田通り(国道 1 号線)を渡って霞ヶ関郵便局の辺りまで来ると,文教堂書店があった。小さい本屋だけど覗いてみたら,技術評論社刊行の『SQLite ポケットリファレンス』があった。このシリーズについてこれまで私は Perl, JavaScript, SQL, LaTeX に関する本を重宝していたので,迷わずこれをゲットした。DML の説明はあらかた普通の SQL 本と変わりがない。DB 運用に関る DDL, 端末コマンド仕様を帰りの電車で読んでイメージを理解した。
     

     

    2011.1.5 付記

    その後,漢詩平仄音韻分析プログラムをリリースした。SQLite3 を使った Java Servlet である。漢詩に興味のある方は「misima 漢詩平仄音韻分析(Servlet版)」をお試しください。

    misima SOAP Web Service 運用

    |

    misima SOAP Web Service を開けっ放しにしてしまっていた。これは,Microsoft Word 2003, Emacs, 秀丸, Jedit X などのアプリケーションからインターネット経由で直接 misima 旧字・旧仮名遣い変換操作を行うためのサーバである。私以外,誰も使わない。公開停止にするのを忘れてしまっていた。今日,ant undeploy でアンデプロイした。こっちの認証はちょっと手が込んでいるので,よほどのことがない限り放置することになりそうである。私自身は Macbook pro 上の Web サーバを使うことにした。

    最近,Google Desktop Gadget に興味がある。友人から文句が出たら,これで misima クライアントを書いてあげようかと考えている。でも,Google Desktop Gadget の SDK はどうやら Windows 版しかないようで,この時点で諦めムードになっている。Mac OS X ないし Linux / FreeBSD 用の SDK が出てからということになりそうである。

    Moon Calendar

    Profile

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

    Notice

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

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

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

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

    Links

    About this archive

    All Entries of Category misima

    Previous: liber

    Next: musica

    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