屍者の帝国
楽しんで読むことができた。いろいろあるにしても、きちんとエンターテイメントとして読める。
何よりも素晴らしいのは、円城塔であるにもかかわらず、十分に伊藤計劃を感じられることだろう。
確かに、伊藤計劃だったらこうはならないのではないか、と思うところはある。しかし冷静に考えれば、円城塔だったらこうはならない、とも言えそうなのだから、これは「伊藤計劃×円城塔」という著者のデビュー作だと考えるべきだ。
伊藤計劃の作品は、かなり映像的に感じられる。スピード感も、場面転換も、情景の描かれ方も。文章を読んでいて、その情景が浮かんでくるというのはよくある話だが、伊藤計劃の作品においては、その傾向は非常に顕著であるように思える。ガジェットあり、アクションありの、ハリウッド的な豪華さもある。格好良く、難解すぎない。
一方で円城塔の書く文章は、自分の中では、例えばクラインの壺のようだったり、フラクタルであったり、そんな風なイメージになる。物語の内容というよりは、物語全体の作り出す形状が興味深い。ある程度読み進めないと形すら見えないし、読み進めると物語の外に何かしらが構築されてしまう。それが恐ろしくもあり、面白い。が、物語が脳内で直接映像化される伊藤計劃の作品とは、プロセスが違うというかなんというか。
だから、公開前にはどうなることやらと思っていたが、ある意味では想定外なほど視覚的な、伊藤計劃的な作品だった。「円城塔の文章なんて読めねぇ」という人でもこれは読めるだろう。普通に、頭からおしりまで読めばいいだけ。豪華で魅力的な登場人物とガジェット、そして展開。ちゃんと「次のページをめくりたくなる」あの楽しさが宿っている。それって何のひねりもなく、ただの良い本じゃないか。
本書を読んで、伊藤計劃という著者か喪われたことが改めて惜しくて堪らなくなったが、でも実際は、こうして作品が出てくるわけで、結局のところ、失われていないのかもしれない。そんなオチをつけてしまうあたりは、円城塔らしい。
図書館戦争
ライトでさっくり読めてしまうが、本好きの人たちが喜んだ理由というのはわかる気がした。
本好きの人(≠本を読む人)たちって、決してマイノリティではないけれどかといって今どきマジョリティってわけでもなく、若干肩身の狭い思いもありつつ(それは自分がSF読みだからか?)、それでも本のない世界など想像も出来ないから、きっと本のために何かを投げ出せるような気持ちがある。というなんとも漠然としたところをすくい上げているのかなぁ、などと思った。
SF読み的には、要するに平行世界モノとして考えて(えー)、あの事件あたりであっち方向にかじ取りするとこうなるのかなー、なんてことを考えたりする。何でもSF的に考えるのはほとんど習性です。
プリントダイアログを出さずに印刷する話
MFCな話。
印刷する時はプリントダイアログを使ってDEVMODE構造体を作り、それを用いてdcを更新してごにょごにょする。
CPrintDialog dlg(FALSE); if ( dlg.DoModal() == IDCANCEL ) { return FALSE; } DEVMODE* mode = (DEVMODE*)::GlobalLock(dlg.m_pd.hDevMode); // ...
ダイアログを出さずに印刷する場合は、デフォルトのDEVMODE構造体を作っておき、それに色々な設定をする。
CPrintDialog dlg(FALSE);
dlg.GetDefaults();
DEVMODE* mode = (DEVMODE*)::GlobalLock(dlg.m_pd.hDevMode);
mode->dmOrientation = DMORIENT_LANDSCAPE;
// ...
// DEVMODEで設定出来る内容:DEVMODE structure (Windows)
なのだが、プリンタ固有の機能、例えばフチなし印刷だとか写真モードだとかはドライバ依存で、そう言う機能へのアクセス方法がよくわからない。
いろいろ調べると、そう言ったデータはDEVMODEに続くメモリ領域に保存されているらしい。それをデータとして取り出してどうにか保持すれば、初回(データを作る際)はともかくそれ以降は、ダイアログを出さずそのデータを流用出来るのではないか。と考えてやってみたら成功した。
DEVMODEに続く領域、というのがどれくらいかは、その大きさがDEVMODE構造体内にdmDriverExtraとして保持されている。従って、DEVMODEの先頭を指し示すポインタを起点に、DEVMODE構造体のサイズ+dmDriverExtra分読めば良い。
とりあえずファイルに書き出してみる。
CPrintDialog dlg(FALSE); if (dlg.DoModal() == IDCANCEL) { return FALSE; } CFile file( PATH_TO_SAVED_DEVMODE, CFile::modeWrite | CFile::shareDenyWrite | CFile::modeCreate); DEVMODE* mode = (DEVMODE*)::GlobalLock(dlg.m_pd.hDevMode); file.Write( mode, sizeof( DEVMODE ) + mode->dmDriverExtra ); file.Close(); // ...
再利用時、ファイルから読み出してDEVMODEを作れば、ダイアログを出す必要が無い。
CFile file(PATH_TO_SAVED_DEVMODE, CFile::modeRead | CFile::shareDenyWrite ); DEVMODE tmp; file.Read( &tmp, sizeof( DEVMODE ) ); file.Seek( 0, CFile::begin ); DEVMODE* mode = (DEVMODE*)malloc( sizeof( DEVMODE ) + tmp.dmDriverExtra ); file.Read( mode, sizeof( DEVMODE ) + tmp.dmDriverExtra ); file.Close(); // ... free( mode ); // ...
dmDriverExtraを取得するために、一時的なDEVMODEを作っている。その後先頭にシークし直し、全体が入る領域を確保してから読み出している。
プランク・ダイブ
打って変わってハードな感じに。ううむ、やっぱりこのほうがしっくりくる。
イーガンは全般的に評価が高いけれど、それでも自分は、良し悪しとは別の「好き嫌い」が相当あるだろうと思っている。 例えば自分は、離散しすぎて尻すぼみな感の否めない「ディアスポラ」とかが苦手だ。
とは言え。短編は意外とハズレなく楽しめていて、今回もそんな感じだった。「ディアスポラ」と同じような世界観も多々登場するが(きっと作者が好む設定なんだろう)、世界観に関して文句があったわけではないから、これらも充分に、いやとても楽しませてもらった。
より抽象度の高い数学ネタもあって、最近円城塔が気に入っている自分にはびったりと来た。
全体的に、攻めすぎず守りすぎないバランスが良かったように思う。