ロシアは旧ソ連時代,1930 年代後半から 1950 年代前半にいたる間,スターリンの恐怖政治によって粛正の嵐が吹き荒れた。根も葉もない罪状で強制収容所に投獄されたり銃殺刑に処せられた。ソ連のアネクドートに次のようなものがある。
ラーゲリで三人の囚人がなぜここに来たのか理由を語り合った。
囚人A:私はポポフを批判したために投獄された。
囚人B:私はポポフを礼賛したために投獄された。
囚人C:私がそのポポフだ。
ソ連のひとびとは信頼できるひととの間でのみ,このようなジョークをこっそりと耳打ちし合いながら,笑っていたのだ。官憲に摘発される可能性があるため,決して書き物で流布することはなく,口伝えに広まった。
米原万里の『オリガ・モリソヴナの反語法』はスターリン時代を生き抜いた女性の壮絶な物語である。しかし一方でロシアのこうしたジョーク精神が力強く漲っている。「去勢ブタは雌ブタに跨がってから考える」などの考えの浅い者に対する罵倒も,哄笑とともにロシアの痛切な悲哀を秘めている。その時にはもうラーゲリ送りというわけか。
収容所に囚われた者たちが,本のない環境にあって,かつて読み諳んじた物語を暗唱して聴かせ合うシーンがある。ドストエフスキイ,ゴーゴリ,トルストイなどなど。ロシアのインテリの凄まじい知力。アネクドートにみられるように,不用意なメモが命取りになるソ連時代ではとにかく記憶するという営みが生きることであった。「生きよ,そして記憶せよ」という題名のロシアの小説がある。
先頃亡くなった巨匠ムスチスラフ・ロストロポーヴィチの面白い逸話が本書で紹介されていた。彼は喰うに困ってもっぱら大工のアルバイトで糊口を凌いだ。その超一流のチェロ演奏で稼ぐことはしなかったそうである。それは知らず知らずに客への迎合癖が身について音楽を致命的に損なうからだという。ソ連崩壊前夜のクーデターにおいて自らカラシニコフ銃を手にして自由派とともにその拠点に立てこもったこの芸術家に相応しい。
この書物は,謎めいた人物を追い求めることがすなわち謎めいた時代の探求であり,いまこの時代の認識でもあるということを示す。思想的に抑圧されながらも闊達だったソヴィエトの学校と比較して,日本の学校 — マルバツ式の試験,返された答案をこっそり確認する生徒,受験だけを目的とした教育 — は千篇一律であってソ連以上に社会主義的であるとの指摘が巻末の対談にある。
ここ何年かで読んだなかで大いに笑わせ,泣かせてくれる数少ない作品のひとつである。つまりそれは最高の物語の属性なんである。このような本が日本人によって書かれたことは奇跡だと思う。
米原万里はそのほかいくつも楽しい本を残した。昨年の5月に亡くなったのは本当に残念である。
* * *
旧字・旧仮名遣い変換サーバ misimaserver 2.5 をリリースした。misima SOAP Web Service クライアントからのアクセスにおいて,こちらを利用するようにした。辞書の読み込みをすっ飛ばす分,これまでよりも若干高速に動作するはずである。
SOAP は実はそれ自体の処理(XML パースなど)が重くて misimaserver の改善効果を減らしてしまう。ソケット通信するクライアントで misimaserver を使うと,先に書いたようにパフォーマンスが大幅に改善される。もし Perl 5.8 以上と,ポート番号 34000 で外に接続できるインターネット環境とをお持ちなら,以下に掲げる Perl コード(misimasc)でアクセスするとよい。これは misimaserver の試験用に作ったものである。標準入力から対象テキストを読んで,標準出力に変換結果を書く仕様なので,配布している SOAP クライアントに置き換えて使うこともできると思う。
misimasc -S yasuda.homeip.net -P 34000 -kyitq -s c < UTF-8テキスト
とやると変換できるはずである。-S と -P 以外の引数 (-kyitq -s c) は misima 変換オプションである。
#!/usr/bin/perl
# -*- mode: cperl; coding: utf-8 -*-
# $Id: misimasc,v 1.1 2007/12/02 15:30:58 isao Exp $
# misimasc: misima client connecting by socket to misimaserver
# 2007(c) isao yasuda, All Rights Reserved.
# DESCRIPTION
# -----------
# - misimaserver への電文を組み立てる。
# - misima オプションを <misima_param> と </misima_param> に挿入する。
# - 変換対象テキストをオプションにすぐ続けて連結する。
# - 変換対象テキスト中の改行文字を :#;~ に変換して一行とする。
# - 電文をソケットに送出する。
# - 変換結果中の :#;~ を改行文字に復元する。
# - 変換結果を出力する。
# HISTORY
# -------
# - 2007/12/04 Ver.2.5 初期作成
use utf8; # UTF-8
use IO::Socket; # Socket
use Getopt::Std; # コマンドライン引数処理
use File::Basename; # ファイル名の取得
use Time::HiRes # 高精度タイマー
qw(gettimeofday tv_interval);
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";
# 開始
my $ts = [gettimeofday]; # start time
my $host = 'yasuda.homeip.net'; # 接続先
my $port = 34000; # ポート番号
my ($senddata, $moption); # 送信データ
# コマンドラインオプション
my %opts = (
'S' => '0', # server hostname
'P' => '0', # port number
's' => '0', # 旧字変換: しない
'y' => 0, # 用字・用語変換: しない
'k' => 0, # 旧かな変換: しない
't' => 0, # 単純変換: しない
'm' => '0', # マーク: しない
'i' => 0, # 連続文字変換: しない
'n' => 0, # 仮名反転: しない
'x' => '0', # TeX 変換: しない
'c' => '0', # OTF \UTFx 文字
'h' => 0, # 十六進形式変換: しない
'q' => 0, # quiet
'g' => 0, # Germany active: しない
'b' => 0, # BibTeX Compatible: しない
'v' => 0, # Verbose
'd' => 0 # デバッグ: なし
);
if ($opts{'v'}) {
printf STDERR loggingtime() . " * misimaclient start.\n";
}
# コマンドラインオプションから misima パラメータを組立て
Getopt::Std::getopts('s:ym:ktnx:c:hqidgbvS:P:', \%opts) || usage();
foreach my $op (keys %opts) {
if (($opts{$op}) && !($op =~ /[vSP]/)) {
$moption .= "-$op ";
if ($opts{$op} ne '1') {
$moption .= "$opts{$op} ";
}
}
}
$host = $opts{'S'} if ($opts{'S'});
$port = $opts{'P'} if ($opts{'P'});
printf STDERR loggingtime() . " * host: $host; port: $port; parameter:\n"
if ($opts{'v'});
my $param = "<misima_param>$moption<\/misima_param>";
# 標準入力から対象テキストを読む
while (<STDIN>) {
utf8::decode($_);
$senddata .= $_;
}
# 改行コードを特定文字列に変換しておく
$senddata =~ s/\n/:#;~/gm;
# Socket 通信処理
my $socket = IO::Socket::INET->new(PeerAddr =>> $host,
PeerPort => $port,
Proto => 'tcp'
) || die "Cannot connect: $@\n";
binmode $socket, ":utf8";
printf STDERR loggingtime() . " * $param\n" if ($opts{'v'});
print $socket $param . $senddata . "\n"; # 送信
$socket->flush();
$buf = <$socket>; # 受信
chomp($buf);
printf STDERR loggingtime() . " * receive:\n$buf\n" if ($opts{'v'});
$socket->close();
$buf =~ s/:#;~/\n/gm; # 改行コードを復元
print $buf; # 変換結果出力
# 終了
printf STDERR loggingtime() . " * misimaclient ended. elapse: " .
tv_interval($ts) . " sec.\n" if ($opts{'v'});
# ロギング時刻取得
sub loggingtime {
my ($epocsec, $microsec) = gettimeofday();
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) =
localtime($epocsec);
return sprintf("%04d/%02d/%02d %02d:%02d:%02d.%06d",
$year+1900, $mon+1, $mday, $hour, $min, $sec, $microsec);
}
# Usage
sub usage {
my($prog) = basename($0);
die <<"EOM";
misima client programm connecting by a socket to misimaserver Ver.2.5
Usage: $prog [-k|-y|-i|-t|-n|-h|-g|-b|-q|-d|-s [opt]|-x [opt]|
-c [opt]|-m [opt]|-S server|-P port]
-k Convert to historical orthography according to dics and rules
-y Convert according to youji-yougo dic
-i Convert to iteration marks (No marking)
-t Convert according to dic of replace (No marking)
-n Invert kana (convert hira to kata, kata to hira; No marking)
-s Convert to seiji; available alternative options:
c UTF-8 characters
h HTML numeric references (hex decimal)
u TeX OTF package UTF-8 references (hex decimal)
a TeX OTF package CID references
m TeX Konjaku-Mojikyo package DAIKANWA ID references
-x Convert to TeX commands; available options:
k Kanbun kundoku format
u Cyrillic, Latin, Greek, UTF8 characters to TeX sequences
f force TeX convert of UTF8 characters
x use extend tables
r Cyrillic to T2A sequences
t Thai word breaking and TIS-620 hex conversion
T Thai word breaking and UTF-8 output
h UTF-8 to hex conversion
i iterations of multi characters to kunojiten
a k, u and i
-c \\UTFx option; available alternative options:
K Convert JIS to \\UTFK
C Convert JIS to \\UTFC (KANTAIJI)
T Convert JIS to \\UTFT (HANTAIJI)
-m Mark converted string; available alternative options:
h HTML tags
t TeX control sequence
-g Convert Latin diacritical marks to TeX formats in Germany style
-b Convert Latin diacritical marks to TeX formats in BibTeX style
-h Convert all characters to hexadecimal strings 0xFFFF
-q Quiet run
-d Debug: Chasen analysys, dictionary entries display.
-v Verbose
* The programm reads data from stdin and writes to stdout.
EOM
}
# end of file
なぜポート番号が 34000 か。ミシマ(3.4 万)だからですよ。
付記:
旧字・旧仮名遣い変換サービスはその後限定公開としました。上記コードでのアクセスは現在は不可になっています。