2007年12月アーカイブ

ジュリアン・グラックの死

|

12 月 22 日,フランスの作家ジュリアン・グラックが亡くなった。享年 97 歳。

大学時代,日影丈吉のエッセイのなかで彼の名を知った。その小説『アルゴールの城にて』を読んで,こんな魔法のような小説があるのだと驚愕した。日本語訳で読んでも,その煌めく想像力に圧倒されてしまった。爾来,目に留まったグラック作品を片っ端から手にいれて愛読してきた。少しでも原典の雰囲気を知りたいとの思いから,フランス語をろくに知らないのに,José Corti 社から出ていた Au château d'Argol の原著を丸善で取り寄せて,八頁折をペーパーナイフで切りながら(※),仏語辞書を片手に読んだものである。

(※)何を言っているのかわからない人がいるかも知れない。八頁折とは裏表で八頁分印刷した紙を二回折り畳んで綴じる本作りである。昔の本は,折り畳んで綴じただけで,カッティングしていないものが普通にあった。読者はナイフで頁を切りながら読み進めなければならない。頁の切っていない本を処女に喩えたりした人もいたとか。

白水社版『アルゴールの城にて』(安藤元雄訳,1985 年)の「水浴」の章から,私のなかんづく酷愛するくだりを,少し長大ではあるが,引用させていただく。息の長い文に畆る白昼夢のような想像力に,文章を読む快楽というものを知る。

三人は墓石の間で服を脱いだ。太陽が靄の中から湧き出してこの場面に照明の光を当てたのは,いままさにハイデが,その輝くばかりの裸体を見せて,海の方へと,沙漠の牝馬よりももっと力強い,もっと柔らかい足どりで歩き出したときだった。長大な濡れた反映によって形づくられたこのきらめく風景の中,たなびく靄,平になめらかな波,滑るような太陽の光線などがことごとく水平に走っている中で,彼女は突如としてその垂直線の奇蹟によって目を驚かせた。太陽に食いちぎられ,影という影が姿を消している砂浜の上に,彼女は無上の反映を走らせた。まるで水の上を歩いているように見えた。エルミニアンとアルベールが,力にあふれ,なめらかな暗い影をなしている彼女の背中や,重く垂れている彼女の髪にいつまでも目を走らせ,みごとなゆるやかさで動く彼女の両脚とともに胸を高鳴らせている前で,彼女は昇る太陽の円盤の上にくっきりと身を浮き出させ,太陽は彼女の足もとまで一面に液体の火の絨毯を流した。彼女は両腕を上げ,まるで生きた女人像柱(カリアテイード)のように,両手で苦もなく天を支えた。かつて見たこともない,心を奪うその優美さの満ち潮が,もうあと一瞬でも長く続いたら,その息づまるリズムに心臓の血管がことごとく破れるのではないかとさえ思われた。そのとき,彼女は首をのけぞらせ,肩が繊細な柔らかい動きで持ち上がって,彼女の胸と腹とに飛び散る飛沫の冷たさが身のうちにこらえ切れないほどの快感を走らせたので,彼女の唇が思わずめくれ上がって歯を見せる — そして,見ている二人の驚いたことには,その一瞬,この刺戟的なシルエットから,一人の女の,いまにもこわれそうな取り乱した動作がほとばしり出た。
ジュリアン・グラック『アルゴールの城』安藤元雄訳,白水社,1985 年,pp. 97-8,下線部は白水社版では傍点。

物語構造の根幹をなしているのは,人物の性格やプロットの描き込みというよりもむしろ,描写のビジョンそのものである。水平な海浜で垂直に腕を擡げて「天を支える」女人,その描写の細部そのものが縦横上下前後に発散する,幾何学的,化学的,光学的,その他もろもろのイメージの意味深さ。

この作家は私にとって別格の存在。何度でも,何度でも,舐めるような再読に耐える彼の作品には,その他,『半島』,『森のバルコニー/狭い水路』,『シルトの岸辺』がある。グラック作品はいまや何故か書店ではなかなか手に入れることができなくなってしまった。プレミアの付きつつある古書を探すなり図書館で借りるなりして,ぜひとも読んでいただきたい。私の心から敬愛する作家(ホンモノの作家)は — グラックの存在を教えてくれた日影丈吉を含めて — 皆故人になってしまった。
 

20120120-argol.jpg

Julien Gracq - Au Château d'Argol. 12e tirage, Paris: José Corti, 1982.

 

アルゴールの城にて (白水Uブックス)

ジュリアン・グラック
安藤元雄 訳
白水社

Mac OS X プリンタ共有

|

長年使ってきたシャープのイメージスキャナの具合が悪くなった。読み取った画像に影が出るようになり,品質低下が著しい。どうもセンサーもしくは光源が経年劣化してしまったようである。SCSI 接続で値がはったが,FreeBSD SANE でも利用でき重宝していたのに。年賀状を作るのに子供の描いた絵を読み込む必要があり,仕方なく買い替えることにした。もうあまり出費もできないので,安価なキヤノン製 CanoScan LiDE 90 を購入した。個人的な利用では A4 原稿を 300dpi でスキャンできれば十分である。USB 接続で電源も不要。ローエンドモデルとはいえイメージスキャナも 1 万円を切る時代になった。

Mac OS X ドライバ関連を添付 CD からインストールしようとした。ところが,インストーラが途中で黙り込んでしまった。Mac OS X 10.4 もサポートしているとマニュアルにも明記されているし,へんなアプリを実行しているわけでもなく,どうも解せない。キヤノンのサイトから最新版のドライバをダウンロードして試しても同様である。頭に来てカスタマーサポートの Web から問い合わせを出した。今日のうちに年賀状を作らなくちゃいけないので,しようがなく,Windows 2000 マシンにドライバを導入した。こちらは正常に終了。Windows 上でスキャン画像を JPEG 形式で保存し,これを Mac OS X に転送して,Photoshop で加工する。

Windows 上の Excel 住所録から宛名印刷をするかも知れないので,スキャナのついでに,Windows から Mac 接続のプリンタ (これもド安物のキヤノン製インクジェットプリンタ iP4300) を共有する設定も試みた。ところがこれもうまく行かない。「システム環境設定」の「共有」画面において Windows 共有とプリンタ共有とをチェックするだけではだめなのである。Mac OS X はリソースシェアリングを UNIX のオープンソフトで実現しており,プリンタ共有についても cups でサポートしている。cups の適切な設定が必要なのである。以下にその設定手順を整理しておく。

  1. Mac OS X「システム環境設定」を起動し,「プリントとファクス」---「プリント」タブにおいて,通常 Mac ローカルで使う iP4300 のプリンタ名とは別名称で Windows 共有用 iP4300 のエントリ (例えば "iP4300 for Windows") を追加しておく (Mac OS X Tiger ではこれを行わないと Windows から出力できない)。
  2. スーパーユーザになり lpinfo -v コマンドで direct usb のプリンタ URI (プリンタの名称とシリアル番号) を調べる。例えば次のような行があるはずである。
    direct usb://Canon/iP4300?serial=B55565
    
  3. /etc/cups/printers.conf 定義中の当該プリンタエントリ (<Printer iP4300_for_Windows>) について,"DeviceURI file:///dev/null" の記述を,この URI で "DeviceURI usb://Canon/iP4300?serial=B55565" のように書き換える。
  4. スーパーユーザ権限で cupsd に HUP シグナルを送って定義を再読み込みさせる。つまり,ps コマンドで cupsd のプロセス番号を調べ,これに対し kill -HUP を実行するわけである。例えば以下のようにする。
    # ps ax | grep cupsd [プロセス番号の調査]
      210  ??  Ss     2:42.97 /usr/sbin/cupsd
     3027  p5  R+     0:00.01 grep cupsd
    # kill -HUP 210 [cupsd のプロセス番号を指定してシグナルを発行]
    
  5. Windows 環境で iP4300 のプリンタドライバをインストールする。プリンタドライバはキヤノンのダウンロード・サイトから取得できる。
  6. Windows「プリンタ追加」ウィザードからネットワークプリンタを "http://Macホスト:631/printers/共有プリンタ名 (この場合 "iP4300_for_Windows")" で登録する。

これでやっとオッケーになった。Windows から "iP4300_for_Windows" プリンタを選択して印刷すると Mac OS に接続されたプリンタから印字されるはずである。

Apple のサイトで解説を漁ったが,なかなかこの特別な設定の情報が得られなかった。「ちょっと便利かも / MacプリンタをWindowsから利用する」というページに助けていただいた。著者に感謝。

* * *

[※ 08/1/4 追記]
CanoScan Mac OS X ドライバについては,その後サポートから回答があり,メーカでは再現せず不明とのことであった。でも所定の場所にドライバファイルが格納されているならば,読み込みしてみてくれとのこと。TWAIN 対応アプリケーション (Photoshop) からスキャンさせるとうまく動作した。サポートには早々の対応をしていただいた。

蟹食べいこう!

|

ボーナスが出て,家族四人で蟹を食べに行こうと決まった。年に一度か二度の贅沢をしよう。今日,川崎駅の蟹料理屋に行った。蟹ミソなどのオードブル,蟹のお刺身,蟹鍋。ああシアワセ,と子供たち。妻の長電話で食事の前の買い物がお流れになり膨れっ面をしていた下の娘も上機嫌。残った出汁で最後に雑炊を作ってもらった。万能葱と海苔の薬味が香ばしくて最高だった。やっぱりご飯が食べたい。

* * *

粂井康孝著『猫でもわかる Windows プログラミング』で Win32 API によるプログラミングを勉強中。先日,『Windows プログラミングの極意』を読み,その気になった。別段,作りたい Windows プログラムがあるわけではないのだけど,まずは基本的なところをさっと一巡りしておきたいという思い。

星の数ほどある Windows プログラミング本のなかから本書を選んだ理由は,現在の主流かと思われる Visual C++ MFC や .NET には目もくれず,基本中の基本である Win32 API に特化して解説し,Borland C++ Compiler 5.5 でコンパイルすることを考慮した記述になっていることである。Borland C++ Compiler 5.5 は,定評のあるコンパイラであるだけでなく,無償ダウンロードで入手でき,本書 CD-ROM にも同梱されている (昔は LSIC という無料の DOS 用 C コンパイラを使ったものだが,いまや Borland も無償で製品を配布する時代になったのかと,ちょっと感銘を受ける)。特別の出費なしに本書のサンプルプログラムをビルドして試すことができる。私のような日曜プログラマは Microsoft Visual C++ .NET を購入するのに二の足を踏むのではないだろうか。ただしスクリーンセーバーの解説サンプルだけは Visual C++ を所有していないとコンパイルできない。

本書は — 別途 C 言語文法を勉強していないといけないけれども — Windows プログラミングの初心者向けに書かれている。当然デバイスドライバなどのシステムプログラミング,インターネットアプリの作成,数値計算といった目的まではカバーしていない。また本書は日曜プログラマの実用指向であって,なんでそれをしなければならないか,してはならないかの原理までを掘り下げた解説を行うには限界がある。それでも,メッセージループに基づく Windows プログラミングモデル,リソーススクリプトによる GUI の作法を巧みに説明していて,印刷,レジストリ操作,画像処理の基本をも扱っている。ちょっとしたツール,デスクトップアクセサリーを C で書けるようになるはずである。

もう少し欲をいえば,ビギナー向けの書籍なのだから,Windows プログラミングのさらに先を行きたいひとのために著者お勧めの参考書をあげるとか,本書で述べていない重要なトピックのリファレンスを示すとかが欲しい。最近 Windows プログラミングは C/C++ に限っても MFC,.NET などのフレームワークが華やかで,目的と手段が多様化し過ぎていて,私のように不案内なものにはこれらの位置づけを簡単にでもよいので解説してほしいと思うのではないか。

それにしても本書の著者粂井さんは,本業が超多忙な医師でありながらこうした書物を著してしまう方である。日曜プログラマの鏡なんである。本書のほか,ネットワーク/ゲームプログラミングについて述べた『猫』シリーズもある。

タクシードライバー

|

今年も年末,開発作業がピークを迎えつつあり,いくつかの担当顧客システムのリリース作業が立てこんでいる。出来る限り集中しないようにスケジューリングしたはずだった。余裕をもって日程を分散させたつもりだった。が,ある顧客作業でのトラブルがもとでイベントが順延した結果,皮肉にも集中するはめになりつつある。ここでミスを犯すと,また昨年のトラブルプロジェクト対応のように年末年始が吹っ飛ぶリスキーな状況にある。加えて,予算時期に打ち当り,もう泣きたくなるくらいなんである。

そんなわけで今夜も子分と相乗りタクシー。最近は深夜帰宅のタクシー利用に会社もやかましい。まあかまうものか。でも精算できていない伝票が溜る一方である。事務所ビルの入り口には例によってタクシーの行列。子分と乗り込んで行き先を告げる。いまひとつ運ちゃんの反応が鈍い。耳順を越えたと思しきおじさんタクシードライバー。いきなりスタートしてしばらくたってから,「高速でよいですか?」。「ええ...」と私(さっきそう言いましたよ...)。子分とバカ話をしながらだったのであまり気にもしなかったが,西小山で彼を先に下ろした瞬間に不安になってきた。

中原街道から西小山周辺に入ると,一方通行の狭い道が入り乱れるような住宅街である。もういちど中原街道に出るように言うと,案の定,タクシーは道に迷ってしまった。まあよい。もう深夜の二時で,やっと捕まえた通行人に道を尋ねる。バイクでこれから中原街道に出るので後ろを付いてこいと言う。親切なひとである。一方通行を逆戻りするときタクシーは家屋の植木にテールをぶつける。あちゃー。沈黙。 おじさんは気にせずバイクに続く。やっと中原街道に出た。いまさらながら,スピードを出さないのに気付く。ほかの車がみな 70〜80 km/h 程度で走っているのに 50 を越えることのない「安全運転」である。そのほうが反って危険な臭いを覚えるのは私だけだろうか。

環八からガス橋方面に折れてくださいと私は言ったが,あれよ,タクシーは曲がり損ねてしまった。結局,矢口の第二京浜を川崎方面に右折させた。道を知らないタクシードライバーほどやきもきさせるものはない。「この車,禁煙車ですか?」と私。沈黙。しばらくしてからおじさんがポツリ「どんどん吸ってください。」—「じゃあ,スイマセン,吸います」。 沈黙。おじさんがまたポツリ「来年一月から禁煙になるんですよねー」。 あまり話しかけないで運転に集中いただいたほうがよさそうだ。昨日も夜中の三時まで仕事をして,タクシーに乗るまでは,私は眠くて仕方がなかった。信頼を置けそうなドライバーなら車中で眠ろうかとも思ったが,いまや眠気も吹っ飛んでしまった。

やっと自宅のそばまで漕ぎ着けた。最後にもうひとつ不安があった。果たしてそれは的中した。今日,私は現金の持ち合わせがなかった。クレジットカードで支払いをしようとしたら,このおじさん,カードの磁気が印刷されていない側で読み取らせようと必死になっている。沈黙。六十歳を過ぎて真夜中にタクシーを操っているこのドライバーに,同類相哀れむ惻隠の情がしみじみと涌いてきた。

「すいません,カードはあまり使ったことがないのでね。」—「この黒い色の付いているほうで,こう,擦ってみましょう」と私。おじさんはしげしげとクレジットカードを眺める。沈黙。おじさんは決然としてカードをリーダに通した。「センタートコウシンチュウデス... センタートコウシンチュウデス... センタートコウシンチュウデス... センタートコウシンチュウデス... センタートコウシンチュウデ...」 ..........................................................................................................................................................................................................................

仕事でドタバタしてお午をとる暇もなかった。夕方に少し落ち着いて,移動の合間に,東京駅の高架下にある飯屋「なか卯」でカレーを食った。安くて旨いどんぶりものを食わせてくれる「なか卯」は,懐具合いの寂しい家族持ちサラリーマンの味方なんである。

東京駅のこの店舗は最近なぜかクラシック音楽を流していて,オヤジの多い客の風情にそぐわない。今日,カウンタ席について耳をそばだてると,メンデルスゾーンのあの有名なヴァイオリン協奏曲の第一楽章と知れた。この前はモーツァルトのニ短調弦楽四重奏のトリオ。なにか喜劇の一幕に身を置く気分になった。いま現在の仕事の乱調ぶりにつけても,これは狂奏曲か,幻楽四十奏曲かとひとり合点して苦笑してしまう。楽章が終わらぬうちにカレーを平らげて出てきてしまった。

「なか卯」でのクラシック音楽のような場違いに面食らうと,「いったい誰がなにを狙って?」と詮索したくなる。昔,就職して上京したおり,お上りさんよろしく渋谷というところに行って,真夜中にクラシック喫茶「らんぶる」に入ったときをふっと思い出した。コーヒーを注文したら,いきなりウェーベルンの弦楽四重奏が大音響で弾け出てきて,大いに驚いたのだった。札幌にいたころ,狸小路や北大通りのクラシック喫茶にしばしば足を運んだのだけど,ベートーヴェンやブラームス,チャイコフスキイのシンフォニーが鳴り響いているのが常であって,そこには古典音楽のロマンとともに,一杯のコーヒーで何時間も粘る昔ながらの学生気質が漂っていた。現代音楽に特有の無調音楽のレコードはせいぜいストラヴィンスキイが掛るくらいであった。で,「ウェーベルンがリクエストされる東京って凄いところだ」と思ったのである。強烈だった。いったいどんなひとびとがここに暮しているのかと打たれたのだ。

私はウェーベルンなどの新ウィーン楽派の音楽は大好きである。だけど,クラシック喫茶など他人と共有する場においては,ドビュッシーやラヴェル,ラフマニノフ,モーツァルトなど,それなりに広い聴衆を得た曲を私ならリクエストするだろうと思う。他人の趣味との最大公約数を模索するはずである。心から愛していても,ジョン・ケージやルイジ・ノーノを所望したりしないと思う。要するに,なんのことはない,あの渋谷のウェーベルンは,首都の斬新な趣味を見せつけられたというよりも,他人とは無関係に己れの趣味を押し通す場面にブチ当ったと考えた方がよさそうだ。とまあ,その後東京生活に慣れるにつれ,感じ方が変わってきたんである。

* * *

夜十時半に帰宅すると,ピアソン・エデュケーションの『プログラミング言語 Java 第4版』が届いていた。Amazon で注文したもの。第4版は Java 5.0 Tiger に基づいている。Ken Arnold, James Gosling といった Java を創造した技術者自身による決定版で,Java 言語における「K & R」(C言語の名著中の名著) の位置づけにある。各章に題銘が掲げられていて,西欧のインテリの伝統に忠実なところも私の好むところである。

訳者の仕事ぶりも,度重なる改訂を通じて原著者と連絡をとりながら正しい日本語訳を期するという良心的なものである。私は第3版も読んだが,そのへんにころがっている Java 本に比べると,言語仕様を「正確に」伝えることにおいて,渾身の訳業を果たしているといってよい。

ところが Amazon のカスタマーレビューをみると本書を酷評しているものがあった。曰く「訳が最悪,できるなら原著を読め」云々。まるで「あいつの顔が嫌い」というのと変わらない無教養な書きっぷりである。おかげで本書は二つ星の評価になっている。ひとの仕事をこきおろすなら,きちんとその問題点の例をあげて,自身のスマートな解を示して読者に判断を委ねるのが礼儀であろう。このような見るからに頭の悪い言もいったん書かれるとそれにつられるものがいるのは致し方なく,それだけいっそうこの手の愚評をなす輩に私は我慢ならない。

確かに,本書はある体系の記述において正確さを指向するがゆえに,すっと入ってくる口当たりのよい記述にはなっていない。それでもなおかつ私には十分理解しやすく訳されていると思う。このような解説本は一から十まで秩序立てて全体を正確に説明しなければならず,読者に阿って十のうちの三か四を甘く味付けて分かった気にさせる入門書 — 日本人の書いたコンピュータ書籍は多くこのタイプでないだろうか — とは根本的に性質が違うのである。

プログラミング言語Java 第4版 (The Java Series)
ケン・アーノルド,ジェームズ・ゴスリン,デビッド・ホームズ著
柴田 芳樹訳
ピアソンエデュケーション (2007/04)

ドメイン IP 更新の悩み

|

気づかないうちにルータに付与された IP アドレスが変更されていて,昨日から私のサイトにアクセスできなくなっていたようである。

昨年の 11 月だったと思うが,インターネット環境を B フレッツ 100Mbps 光ファイバに変えた。それに伴い IP ルータを,それまで使っていた YAMAHA 製 RT55i から NTT のレンタル品 RT-200NE にリプレースした。コストからくる選択である。

ところがこの RT-200NE の機能は,YAMAHA 製品に比べ大きくデグレードしていて,私として致命的とも言えることとしては,Telnet による設定変更ができない。このため,インターネット通信は著しく高速化した一方,運用が極めて面倒になってしまった。今回の問題もここに関係する。

FTTH 環境は回線を占有し続けることは想定されておらず,メンテナンスやら利用者側の要因で接続が切れて,そのタイミングで IP アドレスが変わってしまうことが頻繁に起こる。私のようにダイナミック DNS サービスからドメイン名を取得していると,ルータに付与される IP アドレスの変更に応じて,ドメイン名に割り付けるべき IP アドレスも変更登録する必要がある。Telnet でルータ設定が可能ならば,— 定期的にルータに Telnet ログインして IP アドレスを問い合わせし,変更があった場合,新しいアドレスでダイナミック DNS にドメイン更新を行う,— そういうプログラムが簡単に書けてしまう。YAMAHA RT55i のときは自前で書いたそのような仕事をする自動更新プログラムで IP 変更がチェックでき,DNS 自動登録ができたので,1 時間もすれば DNS が書き変わって外部から再びアクセスできるようになっていたのだった。

RT-200NE になって事情が変わった。Web インタフェースでも同様の処理ができないことはないだろうが,ルータへの問い合わせの回数が多くて複雑になり,プログラムを書く気が失せてしまう。よってもって RT-200NE の場合,IP 変更に気づいたとき Web ブラウザを操作して新しい IP アドレスを確認した上で,ダイナミック DNS 登録アドレスを手動で変更しなければならない。面倒このうえない。IP 変更に気づかなければ,今回のようにしばらくサイトが利用できない状況に陥る次第である。

また始末が悪いことに,RT-200NE では,DNS で引いた私のドメインのグローバルアドレスで,ルータの内側から自宅サーバにアクセスすることができない (こんなことそもそもできないと思うひとがいるかも知れないが YAMAHA RT55i ではできたのである)。RT-200NE の IP マスカレードとルーティングの機能が不十分なのだ。よって自宅クライアント PC から自宅サーバへの,つまり yasuda.homeip.net もしくは nox-insomniae.ddo.jp へのアクセスは,/etc/hosts に内部プライベート IP を登録しておいて直接サーバと通信する方式となり,インターネットから本当に接続できるのか否かが判断できないのである。気づかないで放置してしまう可能性がさらに膨らむわけである。

最近のコンシューマ向けのルータ製品は「簡単設定」の名目で Web ブラウザでの設定操作インタフェースしか有していないことが多い。そんななか,インターネット常時接続契約以来愛用してきた YAMAHA 製品はよく考えられていて,Telnet で接続できる制御プログラムをずっと提供し続けている。ハードウェアの設定機能は一般ユーザの目に付きにくいだけ,原価低減のためにサボるメーカが多いと思われるだけに,さすが YAMAHA なんである。RT-200NE はどこの OEM 製品かは知らないが,懐具合を見てさっさと捨て去って,YAMAHA 製品に戻したいと考えている。

本業で,とある顧客にブレードサーバを納めた。OS は Windows 2003 Server R2。子分の担当 SE に設定に行かせた。サーバはセンタに設置し,これを顧客事務室から遠隔で操作する環境の構築からはじまった。ブレードサーバ 5 台へのアプリケーションソフトウェアの組み込みのため,別に設置した 1 台の運用管理 Windows サーバに置いたパッケージアーカイブを一時的に共有設定にして,それを各ブレードから参照してインストール作業をすることになっていた。

ところが,ブレードサーバ群に IP アドレス設定を行い,LAN ケーブルを接続したあと,運用管理サーバから各ブレードに疎通確認しようとしたが, ping が通らないという。一方ブレードサーバのコンソールから運用管理サーバに向けた ping は応答がある。IP アドレス,デフォルトゲートウェイの設定は問題ない。どうして!? これだと以降のインストール作業がストップしてしまう。かつセンタはセキュリティ管理・時間管理が厳しく,登録した要員以外の保守員の入室もできないし,残りの時間も限られている。

子分にまずブレード管理 LAN を含めたケーブルの接続確認とブレードサーバの工場への電話問い合わせを指示し,事務所にいる私は社のネットワーク専門部隊に相談を持ちかけた。工場からの回答は,ブレードサーバの管理プロセッサ用のポートに通信用ケーブルを挿していないかとの指摘。おお,やってるよ。挿し直す。でもまだダメである。現場はパニック状態に陥りつつあった。

ネットワークグループから受けた見解は。サーバを繋ぐ L3-LAN スイッチで ICMP パケットをフィルターしていないか,Windows ファイアウォールがオンになっていないかというものであった。LAN スイッチは顧客設備であり,顧客に確認したところパケットフィルタリングは設定していないという。そこで Windows ファイアウォール設定を確認させたところ,ドンピシャ。オフに変更したら相互で ping が通るようになった。

なんともおそまつな導入設計に因って来るところとしかいいようがなく,顧客に迷惑をかけてしまった。それでもなんとかチームワークでピンチを切り抜けることができた。2 台のサーバ間通信で一方通行の事態で悩んだら Windows ファイアウォールをまず疑え。私の教訓。

サイモン・シン『暗号解読』

|

新潮文庫から刊行されているサイモン・シン著『暗号解読』を読んだ。『フェルマーの最終定理』で有名な著者によるサイエンスノンフィクションである。仕事の上でも RSA 暗号や DES 暗号は身近なテクノロジーであるし,企業が個人情報の取り扱いにつとにセンシティブになっている昨今,機密情報管理への関心は世の中一般に高まっている。

本書は,秘密の文書を交換するための人間の歴史を概観させてくれるとともに,軍事機密と技術革新のうらに隠れた人間ドラマをも紹介している。そこがこのような本の核心である。英国情報部の徹底した秘密主義にあって,三十年もの間そのアイデアや開発実績を世間の誰からも認知されなかった人々の逸話が面白かった。コンピュータの計算理論において不朽の名を残したアラン・チューリングが第二次大戦時の英国暗号解読活動に大きな功績を残したということを,はじめて知らされた。彼がホモセクシュアルの追及を受けて悲劇の最期を遂げたことも。

本書が述べているもうひとつの興味深いテーマは,古代の言語・文字の解明である。解るように記したはずが,歴史の過程で失われた意味の繋がりを再構成する試み。ここでも目的は異なれ,暗号解読の基本的技術が大きな役割を果たしたという主旨を述べている。面白いと思うのは,このアプローチは文学テクストなどの隠された意図や背景の探求にも有効ではないか,ということ。文学研究においても記号学というのがあって,テクストをコード化されたものと捉えてその現象の意味や機能を記述するわけであるが,記号学においては暗号解読技術における統計・数学的アプローチを私はみたことがない。

量子コンピュータ,量子暗号の話は,私にはさっぱり解らなかった。面白いことが起こりつつあるということだけ。
 

暗号解読 上巻 (1) (新潮文庫 シ 37-2)暗号解読 下巻 (新潮文庫 シ 37-3)
サイモン・シン著,青木 薫訳
新潮社 (2007/06)
サイモン・シン著,青木 薫訳
新潮社 (2007/06)

ところでこの本,Amazon の売り上げランキングが上巻:732位,下巻:631位(07.12.10現在)となっている。売れていることがわかるが,下巻の方が高いのが面白い。

misima Ajax & Servlet 版 Ver. 2.5

|

旧字・旧仮名遣い変換ソフトウェア misima Servlet 版を公開した。同時に,JIS 第一・第二水準範囲内での旧字変換の問題(単純変換などを同時に指定したとき範囲外の漢字が混入してしまう問題)をやっと訂正した。こちらから利用できる。

辞書を先読みすることで高速化を図った misimaserver を,バックエンドで利用する。オプションを簡易化し,従来サーバで行っていた misima オプション引数の組立てをブラウザ側で実行する。Ajax を用いてページのリロードなしに変換結果を挿入する。従来のものと比べ,変換オプションが限られていてユーザ辞書も受け付けない欠点がある一方,高速に動作する。シンプルな画面で簡易に使いたいひとに向いている。処理可能なテキストサイズは 8,000 バイトの制限を設けた (Tomcat 5.5 server.xml の maxPostSize パラメータによる)。

Ajax に基づくコード実装において,久しぶりに JavaScript と格闘した。先に紹介した O'Reilly の『Ajax & Java — Java プログラマのための Ajax プライマー』が役立った。サーバを Perl で書くか,Java Servlet にするか悩んだのだけれど,本書の影響もあって後者を選択。

Ajax は JavaScript の一テクノロジーに過ぎないが,Google の地図アプリで俄然脚光を浴びるようになった。非同期にサーバと通信を行い,ページの一部を書き換えることで軽快な Web アプリを実現する。misima Servlet 版 JavaScript のコアな部分をあげておく。

<!-- Ajax misima フォーム -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>misima Servlet版</title>
<script language="JavaScript">
var req;
// misima 変換要求
function misimaconvert() { 
    var it  = document.getElementById("obj").value;
    var url = "/misimaservlet/convert";
    // misima オプションパラメータの組立て
    var ss  = "<misima_param>" + parameter() + "</misima_param>" 
        + it.replace(/\r?\n/g, ":#;~");
    // HTTP リクエストの生成
    if (window.XMLHttpRequest) { 
        req = new XMLHttpRequest(); 
    } 
    else if (window.ActiveXObject) { 
        req = new ActiveXObject("Msxml2.XMLHTTP"); 
        if (!req) {
            req = new ActiveXObject("Microsoft.XMLHTTP"); 
        }
    }
    // 変換要求 (非同期実行のポイント)
    req.open("POST", url, true); 
    req.setRequestHeader("content-type",
        "application/x-www-form-urlencoded; charset=UTF-8");
    req.onreadystatechange = callback; 
    req.send("obj=" + encodeURI(ss));
}
// misima パラメータ組立て
function parameter() {
    var params = "-q";
    switch (document.getElementById("bopt").selectedIndex) {
    case 0:  params = params + " -kyit -s"; break;
    case 1:  params = params + " -kyt -s"; break;
    case 2:  params = params + " -kt -s"; break;
    case 3:  params = params + " -t -s"; break;
    default: break;
    }
    if (document.getElementById("jopt").checked) {
        params = params + " j";
    } else {
        params = params + " c";
    }
    if (document.getElementById("topt").checked) {
        params = params + " -x kuit -g";
    }
    if (document.getElementById("nopt").checked) {
        params = params + " -n";
    }
    return params;
}
// Ajax コールバック: 非同期に受信した変換結果をページに挿入する。
function callback() { 
    if (req.readyState == 4) { 
        if (req.status == 200) { 
            var res = req.responseText.replace(/:#;~/g, "<br />"); 
            document.getElementById("out").innerHTML = res;
        } 
    }
}
</script>
</head>
<body>
オプション<br />
<select id="bopt">
 <option value="1" selected>旧字/旧仮名/用語/繰返</option>
 <option value="2">旧字/旧仮名/用語</option>
 <option value="3">旧字/旧仮名</option>
 <option value="4">旧字</option>
</select> 
<input type="checkbox" id="topt" />LaTeX&nbsp;
<input type="checkbox" id="jopt" />第一・二水準内&nbsp;
<input type="checkbox" id="nopt" />仮名反転<br />
テキスト入力<br />
<input type="button" value="変 換" 
onclick="focusIn();misimaconvert();" /><br />
<textarea id="obj" cols="40" rows="6"></textarea>
変換結果<br />
<div id="out" />
</body>
</html>

HTTP リクエストオブジェクトを生成し,misima パラメータ+対象テキストを POST リクエストで送信し,一方コールバックで非同期に結果を待ち受けるところがポイントである (req.open から req.send まで)。オプションパラメータの組立ての関数 (parameter()) において,getElementById() メソッドでないと select や checkbox のオブジェクトが参照できないのは何故? 「document.フォーム名.エレメント名」ではダメなんである。ここが悩んだところである。

このフォームから起動される Java Servlet は次のとおりである。socket を使って misimaserver と通信する以外はまったく普通のサーブレットである。出力テキストは UTF-8 なので,setContentType メソッドの引数に charset=UTF-8 を入れておかないと,getWriter().write() が正しく動作しない。

// misima servlet for misimaserver & Ajax client
// 2007 (c) isao yasuda, All Rights Reserved.
import java.io.*;
import java.net.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class misimaServlet extends HttpServlet {
    private static String HOST = "localhost";
    private static int PORT = 34000;
    private Socket sock;
 
    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException
    {
        /** ユーザリクエストの取得 */
        String obj = (String) req.getParameter("obj");
        StringBuffer rbuf = new StringBuffer();
        String ct = "?";
 
        if (obj != null) {
            /** misimaserver ソケット接続 */
            try {
                sock = new Socket(HOST, PORT);
                /** 対象テキストを送信する */
                Writer send = new OutputStreamWriter(
                    sock.getOutputStream(), "UTF-8");
                send.write(obj + "\n");
                send.flush();
                /** 変換結果テキストを受信する */
                InputStreamReader recv = new InputStreamReader(
                    new BufferedInputStream(sock.getInputStream()), "UTF-8");
                int c;
                while ((c = recv.read()) != -1) {
                    rbuf.append((char)c);
                }
            }
            catch (Exception e) {
                rbuf.append("** Error occured in connection.\n" + obj);
            }
            finally {
                if (sock != null) sock.close();
                sock = null;
            }
            ct = rbuf.toString();
        }
        /** 結果出力 */
        res.setContentType("text/xml; charset=UTF-8");
        res.setHeader("Cache-Control", "no-cache");
        res.getWriter().write(ct);
    }
}

ロシアは旧ソ連時代,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 万)だからですよ。
 

付記:

旧字・旧仮名遣い変換サービスはその後限定公開としました。上記コードでのアクセスは現在は不可になっています。

Moon Calendar

Profile

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

Notice

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

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

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

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

Links

About this archive

Entries at 2007年12月 in chronological order.

Previous: 2007年11月

Next: 2008年1月

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