屍者の帝国

楽しんで読むことができた。いろいろあるにしても、きちんとエンターテイメントとして読める。

何よりも素晴らしいのは、円城塔であるにもかかわらず、十分に伊藤計劃を感じられることだろう。

確かに、伊藤計劃だったらこうはならないのではないか、と思うところはある。しかし冷静に考えれば、円城塔だったらこうはならない、とも言えそうなのだから、これは「伊藤計劃×円城塔」という著者のデビュー作だと考えるべきだ。

伊藤計劃の作品は、かなり映像的に感じられる。スピード感も、場面転換も、情景の描かれ方も。文章を読んでいて、その情景が浮かんでくるというのはよくある話だが、伊藤計劃の作品においては、その傾向は非常に顕著であるように思える。ガジェットあり、アクションありの、ハリウッド的な豪華さもある。格好良く、難解すぎない。

一方で円城塔の書く文章は、自分の中では、例えばクラインの壺のようだったり、フラクタルであったり、そんな風なイメージになる。物語の内容というよりは、物語全体の作り出す形状が興味深い。ある程度読み進めないと形すら見えないし、読み進めると物語の外に何かしらが構築されてしまう。それが恐ろしくもあり、面白い。が、物語が脳内で直接映像化される伊藤計劃の作品とは、プロセスが違うというかなんというか。

だから、公開前にはどうなることやらと思っていたが、ある意味では想定外なほど視覚的な、伊藤計劃的な作品だった。「円城塔の文章なんて読めねぇ」という人でもこれは読めるだろう。普通に、頭からおしりまで読めばいいだけ。豪華で魅力的な登場人物とガジェット、そして展開。ちゃんと「次のページをめくりたくなる」あの楽しさが宿っている。それって何のひねりもなく、ただの良い本じゃないか。

本書を読んで、伊藤計劃という著者か喪われたことが改めて惜しくて堪らなくなったが、でも実際は、こうして作品が出てくるわけで、結局のところ、失われていないのかもしれない。そんなオチをつけてしまうあたりは、円城塔らしい。

屍者の帝国

図書館戦争

ライトでさっくり読めてしまうが、本好きの人たちが喜んだ理由というのはわかる気がした。

本好きの人(≠本を読む人)たちって、決してマイノリティではないけれどかといって今どきマジョリティってわけでもなく、若干肩身の狭い思いもありつつ(それは自分がSF読みだからか?)、それでも本のない世界など想像も出来ないから、きっと本のために何かを投げ出せるような気持ちがある。というなんとも漠然としたところをすくい上げているのかなぁ、などと思った。

SF読み的には、要するに平行世界モノとして考えて(えー)、あの事件あたりであっち方向にかじ取りするとこうなるのかなー、なんてことを考えたりする。何でもSF的に考えるのはほとんど習性です。

図書館戦争  図書館戦争シリーズ(1) (角川文庫)図書館内乱  図書館戦争シリーズ(2) (角川文庫)図書館危機 図書館戦争シリーズ3 (角川文庫)図書館革命 図書館戦争シリーズ4 (角川文庫)

連環宇宙

「スピン」シリーズの完結編。2作目の「無限記憶」では、少し勢いが衰えたかなと思わせたが、本作では十分に盛り返している。終盤は壮大な世界観が描かれているのだけれど、お話として発散し過ぎることもなくきちんとスタートに戻ってくるあたりが、さすがというかなんというか。「クロノリス」がなかなかだったので大失敗はなかろうとは思っていたけれど、想像以上にお上手だと思った。

連環宇宙 (創元SF文庫)

cf.時間封鎖〈上〉 (創元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を作っている。その後先頭にシークし直し、全体が入る領域を確保してから読み出している。

インポートしてみた

id:onishiが、インポート機能とても頑張ったといっていたので、気になってインポートしてみた。確かに素晴らしい出来栄えでした。

ただ、たぶん自分の場合「戻す」ということがないので、機能の核でもある「いつでも戻せる」を試すことはないかもしれない。「戻す」は「どんなに素晴らしくてもうまく行くほど使われない」という切ない代物だけれど、「安心感」という形でしっかりと機能はしている。コードが実際に動くことはないのに機能しているなんて、なんというSF…(←SFかぶれ)。

プランク・ダイブ

打って変わってハードな感じに。ううむ、やっぱりこのほうがしっくりくる。

イーガンは全般的に評価が高いけれど、それでも自分は、良し悪しとは別の「好き嫌い」が相当あるだろうと思っている。 例えば自分は、離散しすぎて尻すぼみな感の否めない「ディアスポラ」とかが苦手だ。

とは言え。短編は意外とハズレなく楽しめていて、今回もそんな感じだった。「ディアスポラ」と同じような世界観も多々登場するが(きっと作者が好む設定なんだろう)、世界観に関して文句があったわけではないから、これらも充分に、いやとても楽しませてもらった。

より抽象度の高い数学ネタもあって、最近円城塔が気に入っている自分にはびったりと来た。

全体的に、攻めすぎず守りすぎないバランスが良かったように思う。

プランク・ダイヴ (ハヤカワ文庫SF)

時の地図

まあ…SFではないね。うん。ハヤカワ的にも、SF枠ではないし。なんか微妙に苦戦したのはたぶんそのせい。

ストーリー的にも、なんだかもっと圧縮できたのではないか、とかは思ってしまった。 最後はSF的アイデアでまとめられるのだけれど、濃度は低い。そこを狙っていないのだろうから、当然でもあるけれど。

あのくらいの時代もののお話が好きであれば良いのかもしれない。

時の地図 上 (ハヤカワ文庫 NV ハ 30-1)時の地図 下 (ハヤカワ文庫 NV ハ 30-2)