2015-02-16

神々廻楽市『鴉龍天晴』楽しく読んだのだがまとまりは悪い



神々廻楽市『鴉龍天晴』

第2回ハヤカワSFコンテスト最終候補作。

関ヶ原の戦いで小早川秀秋が日和見を決め込み、結果として徳川の支配する東国と豊臣の支配する西国に別れたまま200年の太平の世が過ぎた後、ペリー来航から日米修好通商条約あたりまでの「幕末」を描いている。

東国は三種の神器に由来する技術を受け継いだ鬼巧というメカがいて、西国は古来の妖怪たちが味方する、という異世界的な設定と、幕末の史実通りの人と史実にはいない人間とが虚実ないまぜで跳梁する歴史ファンタジーというかスチームパンクというか、といった風情。

良い点をまず挙げると、キャラの描き方は魅力的なところ。ちょっとラノベっぽい感じでもあるが、読んでいるあいだは楽しいし魅力的だ。いろんな(裏)設定も見え隠れするし、それぞれにキャラが立っている。キャラクターの語り口調も江戸時代〜幕末っぽさと現代っぽさがいい塩梅で入り混じっており、読みづらさもないが変に現代っぽすぎず、楽しい。

悪い点は、良い点と表裏一体ではあるけれど、キャラクターも設定も詰め込みすぎてしまったところ。いろんなキャラクターのそれぞれの立場が次第に明らかになってくる中盤以降、さてこれをどうまとめるのかな、と思っていたら今ひとつまとまらずに終わってしまった感がある。

よく「アイデアを詰め込みすぎて話としては破綻している」っていうのはSFに対しては褒め言葉になっている(と思う)し、個人的にもそういうSFって好きなんだけど、残念ながら本作はそういうのとは少し違う。単に個別の要素がいまひとつうまく昇華されていないように思われる。もう一歩といった感がある。

そしてもう一つ、この架空の歴史においてこの物語が描いている事件とはなんだったのか?というところにもいささか疑問がある。日米和親条約が結ばれてから日米修好通商条約と将軍跡継ぎ問題のタイミングを描いているのだが、なぜこのタイミングのこのエピソードを描いたのか? いわゆる「歴史が動いた」タイミングはほかにもありそうな気がするのだが……まあそれは難癖みたいなものだけれど、少し気になるところでもある。

そういうわけで、面白いんだがもうひとつまとまりが悪いのが惜しい。ただ同作者の次回作が気になるほどには楽しんで読んだ。

# それとこのペンネーム……ちょっと読めないですよ。奥付にふりがなふってあるけど次に見ても読み方わすれてる自信があるな……

2015-02-07

ES6 Symbolとはなんなのか

なんか最近WebKit (JSC) に ES6 Symbol が実装されたようなんですが、Symbol とかそんなのあったのか……というレベルだったので調べてみました。調べてみたらけっこう知らない世界でした。ES6、いつのまにかこんなことができたのかって感じ。

シンボルとは何なのか

プログラミング言語におけるシンボルというのは……名前がついて区別可能なモノ、というのが一般的な理解である気がします。LISPでは多用されますね。たとえばメソッドの名前とか構造体のフィールド名、連想配列のキーやenumのようなものとして使ったりします。Rubyでもおなじみです。

まあこういう説明が必要な人はあんまりここを読んでない気もするのでwikipediaへのリンクで済ませたい。

ES6のシンボル

ES6のシンボルも似たような感じなんですが、いろいろ違うところもあって戸惑います。以下はおおむねMDNからもってきたものですが……

まず、シンボルは Symbol() で作ります。

a = Symbol()

引数に文字列も渡せます。

b = Symbol("foo")

ただ、この文字列はいわゆるシンボル名ではありません。

a == a // => true
a == b // => false
b == Symbol("foo") // => false

Symbol()が呼ばれるたびに毎回あたらしくシンボルが作られるという感じです(gensymと同じですかね)。Symbol()に渡す引数は仕様ではdescriptionと呼ばれています。

もちろん特定の名前と関連付けられたシンボル、というのも作ることができます。Symbol.forというのがそれです。Symbol.keyForによって名前を逆引きできます。

c = Symbol.for('foo')
c == Symbol.for('foo')  // => true
b == c  // => false
Symbol.keyFor(c)  // => 'foo'
Symbol.keyFor(b)  // => undefined

んでシンボルの用途ですが、オブジェクトへのキーにできます。

o = {}
o[a] = 1
o[a]  // => 1

まあ文字列と一緒ですね。ただし、文字列化しているわけではありません。

o[a.toString()]  // => undefined

そしてなぜか、oのキーとして、シンボルは通常見えなくなります。たとえばObject.keys()やfor...in構文などでは無視されるようになります。

Object.keys(o)  // => []
o[a]  // => 1

JSON.stringifyでも無視されます。

JSON.stringify(o)  // => "{}"

いちおう「キーのうちシンボルだけ」を取り出すAPIもあるので頑張れば持ってこれますが、基本的には見えてこないということですね。

ES6 シンボルの用途

さてこれなんに使うんだろうか……と不思議だったんですが、プライベートなフィールドを作るのに便利そうです。http://tc39wiki.calculist.org/es6/symbols/ の例……はモジュールを使ってますが、ふつうのJSっぽく書くと、

var Foo;
(function() {
  var sym = Symbol('foo');
  Foo = function() {
    this[sym] = 'foo';
  }
  Foo.prototype.bar = function() {
     // do something with this[sym]...
  }
})()

こんなふうに書くと、symのフィールドには外部からはわりと不可視になります。外部から不用意にアクセスできないようなフィールドには便利ですね。

もう一つとして、ある種の構文を提供できるようになるようです。というかたぶんこれが主な用途なんですかね。

たとえばSymbol.iteratorというシンボルが定義されていますが、これによって任意のオブジェクトを for...of構文に渡したりできます。

function Range(s, e) {
  this.start = s;
  this.end = e;
}
Range.Iterator = function(range) {
  this.range = range;
  this.current = range.start;
}
Range.Iterator.prototype.next = function() {
  if (this.current >= this.range.end)
    return {done: true};
  return {value: this.current++, done: false};
}

Range.prototype[Symbol.iterator] = function() {
  return new Range.Iterator(this);
}
for (var x of new Range(4, 10)) { console.log(x); }  // => 4, 5, 6, 7, 8, 9

こういう特殊なシンボル(Well-known symbols)は現行のES6において11個定義されているみたいですが、Chromeにはまだiteratorしかないようです。

2015-02-02

The Imitation Game

コンピュータの仕事をしていたらだれでも知ってる数学者のアラン・チューリング、その生涯のうち、とくに第二次大戦中にドイツのエニグマ暗号をやぶったくだりを中心に描いた映画。ベネディクト・カンバーバッチ主演。あんまし情報ないので日本上映は先なのかな、と思ったらトレイラーもありました。
映画はみっつの時代を行き来する。映画は1950年にはじまる。マンチェスター大学に赴任していたチューリングのもとに警察が訪れる。チューリングは軍籍があったが、その軍歴は極秘でありうかがい知ることはできない……。

そして時代は1940年、チューリングが「ラジオ工場」に赴任し、ナチスドイツの暗号分析にはいる。同僚は名だたる数学者やチェスチャンピオン。傍受した暗号の解読にいそしんでいたチームだったが、チューリングはまったく別のアイデアを構想する。暗号解読機械を構築し、人手を介さずに瞬時にして暗号を解くのだ。

最後は1920年代末、チューリングの少年時代。いじめられがちだったチューリングだったが、クリストファーという親友ができ、本で読んで覚えたばかりの暗号(映画ではよくわからないがおそらく単純なシーザー暗号)でメッセージをやりとりするようになる。同性愛者であったチューリングにとって、クリストファーへの思いはある種の恋愛感情をもったものであることが示唆される。

---

映画にはふたつのテーマが隠されている。

ひとつは暗号解読チームの成功物語だ。

チューリングの同僚たちはプライドも高く、はじめはチューリングのやり方に納得できずに去ってしまう。やがて和解し、一丸となって機械の構築に挑むが、機械はなかなか動かない。どうしても最後の一手に欠ける。いっぽう、なかなか成果の出ないままわけのわからない機械を作っているチューリングに業を煮やした将軍は強制的に停止しようとするが……。

チームものとしてはおあつらえ向きの展開だ。はじめは対立するがやがて和解するのはチェスチャンピオンでもあるヒュー・アレクサンダー。対立して去ってしまった人手を埋めるために採用した女性、ジョーン・クラークとチューリングは親密さを増していき、あるときチューリングはジョーンに求婚するまでになる(この辺、実在の人物なのかよくわからんな……と見ながら思ってたのだが主要登場人物はちゃんと実在だし、チューリングが求婚したのも本当のことらしい。知らなかった)。

だがチューリングを語る上で大事なもうひとつの軸は、彼が同性愛者だということであり、1950年台の物語も、20年台の物語も、そちらが主要なテーマとなる。そして彼が同性愛者だということ(そして当時のイギリスではそれは違法だということ)は物語に深刻な影を落とし始める。

---

よくできた映画だと思う。

チームの成功物語としてもなかなかよくできているし、何かあるとしどろもどろになってしまうしコミュ障にもほどがあるチューリングもキャラが立っている(しかし、あんなわかりやすくコミュ障な人だったんだろうか。序盤のランチのくだりは笑ってしまった)。

構築したマシンのかっこよさも格別で、ついに解析に成功して機械が停止するシーンとかも良いかんじ。

でもそういう脳天気な話にはならない。戦時下の厳しさ、チューリングの性的傾向の問題、スパイ嫌疑の問題などが重くのしかかる。そんななか、ジョーンとの友情とも愛情ともつかない不思議な関係の描写も面白い。

タイトルの "imitation game" というのは、直接的には作中で語られるチューリングテストのことだ。機械による人間の模倣のゲーム。だがそれは同時に暗号のモノマネでもあるし、同性愛者が異性愛者のふりをすることでもあるように思われる。ほとんど社会不適合者なチューリングが頑張って普通の人のふりをすることでもあるだろう。

まあ見ると良いと思いますよ。

2015-01-20

芝村裕吏『宇宙人相場』。オチはよい



芝村裕吏『宇宙人相場』

一部にコアなファンのいる芝村裕吏の早川のSF3本目。

子供の頃からずっとオタクでその業界で頑張ってきた結果、35歳にして小さなアニメ関連グッズ会社の社長をやっていた主人公が、でもそろそろ結婚したいなと思っていた矢先にふと出会った病気がちな女性と結婚することになり、だが病気がちな妻といっしょに過ごすために、義父の手ほどきを受けてデイトレーディング(スキャルピング)を始めることになるが、いっぽうなぜか質問ばかりしてくるスパムメールの主は自分が宇宙人だと主張をはじめ……

といったあらすじ。意味わからんと思ったかもしれませんがわりと適正なあらすじかと思います。オタク、デイトレーディング、宇宙人ファーストコンタクトというだいぶ無理な組み合わせの三題噺といった風情。ただ、この三要素は作中でうまく絡み合っているとは思えず、またそれぞれの書き込みというか内容についても、ディープな向きからは不満も残るもののようす。

たとえば株についてみると、主人公がふつうに勝ちすぎという点がレビューなんかで指摘されている……ってまあそれはそういう話だと思って読むべきかなと思ったし、「オタクであればあるほど現実と虚構の区別はつく」という作中の主人公の述懐を引くまでもなく、こんなの読んで株やろうという阿呆はおらんと思うので別に良いのでは、とは思うけれど。それに主人公も失敗して死にそうになったりしてるし。

ただ言い方を変えると、いわゆる経済小説としての完成度はべつに高くない。素人がいきなりはじめて大儲けしました、反射神経と判断力が鍵なのですが頑張りました、という話なので、だからなにっていう感じはある。

オタク方面については個人的にもにょるところがあって、主人公がコミュニケーション能力の薄いオタクだということがあって、いささか身につまされる面もある一方、主人公が嫁とトレーディングにのめり込んでいくうちにアニメとかどうでもよくなってくるのを見るのは悲しい気分になってくる(降って湧いたように嫁が登場する展開だからか、願望充足的という指摘も見た気がするけれど、ふつうのオタクの願望充足はこういうものではないでしょう)。後半の主人公はほとんど嫁かわいいに終始しており(あとは嫁の実家の問題に気に病むぐらいであり)、アニオタというアイデンティティはこの小説に必要なのか?というのは疑問を抱かざるをえない面はある。まあ結婚してオタクをやめるってのは、ある意味リアルだとは思うけれど……(そういう意味でエピローグでの元社員の反応なんかはリアルに思える)。

ただオタクを描く芝村の手つきは非常に手慣れており、主人公のオタクらしい言動や考え方や周囲との噛みあわなさというのは読んでいて楽しく、この作品を豊かにしているとも思える。

まあさっくり読めて総合的にはよろしいんじゃないでしょうか。ただ宇宙人、どうなの、この話にいるの、ってのはよくわからんですね……。

---

と思ったけど最後の宇宙人のセリフで設定が明らかになるわけですね。最初すごい雑に読み飛ばしてしまったが、ああなるほどね、ってなる。

きちんと伏線を張って回収するのが良い向きにはあまり好まれないかもしれませんが、あんまり溜めずに、さりげなく一言で世界をひっくりかえすというのは、個人的には好き。一種のギャフンオチですね。

2015-01-13

tarを解凍しつつキャッシュに展開するService worker

というのを書いてみました。なんかたくさんアセットのある例、ってことで emojify.js という絵文字系のJSライブラリのデモページを使ってます。

https://googledrive.com/host/0B8b5YMw-yJleQ3N4bkxrNVlfYjA/

このページはemojify.jsのデモページである http://hassankhan.github.io/emojify.js/ とほとんど同じです。タイトルと注意書きと、service workersの登録を除けば。

ただ、もとのデモページと違って images ディレクトリを消してるので画像ロードが盛大に失敗します。画面スクロールするとサンプル絵文字が読み込み失敗になっていくのが見えるはずです。

ところがChrome 40以降であれば、この時点でservice workerが登録され、動き始めます。service workerは画像ファイルをアーカイブしたimages.tarを取得し、なかのファイルを取り出してキャッシュに突っ込みます。

なので、数秒待ってから(この処理が完了してから)リロードすると、さっきは読み込み失敗してた画像が突然表示されるようになります。しかもキャッシュから取ってくるので速い!という。

書いていて途中で「まあでもコネクションを減らす目的だったらpipeliningしたりspdy使ったりしたほうが効率いいよな……」とふと我に返るタイミングもありましたが、あまり気にしないことに。

---

tarってしょせんヘッダとコンテントが並んでるだけのデータ構造でしょ、って思ってて、詳細しらんけどそれぐらいJSでも読めるんじゃないかなぁ、ということで思いついたのがこのデモのきっかけです。tarのパーサはGNUのマニュアルを見ながら超適当に書きました。

tarは512バイトごとのブロック単位になっており、512バイトのヘッダブロックにそのファイルのメタデータを記述し、必要ならそのファイルのコンテンツを保持したブロックが続きます(ディレクトリやシンボリックリンクなどはコンテントは存在しないのでいきなり次のブロックが続く)。

ファイルの終端は0クリアされたブロックが2つ続くとか、フォーマットやチェックサムの項目があるとか、そういう細々したのがいろいろあるのですが、今回はそういうのは完璧に無視し、ファイル名とファイル長だけを取ってくる単純な仕様にしました。ArrayBufferを使って512バイトごとに区切り、特定のオフセットにアクセスするだけなので簡単でした。

ちょっと驚いたのはサイズのフィールドはASCIIの数字で8進数表記ということですかね。なんでそんな仕様なんでしょうか。

2015-01-07

ウィリアム・ソウルゼンバーグ『ねずみに支配された島』



ウィリアム・ソウルゼンバーグ『ネズミに支配された島

面白かったけれど、『捕食者なき世界』ほどの面白さはないかな、と思いました。著者のソウルゼンバーグはこういった著書など生態系に関するテーマに強い科学ジャーナリスト。

本書の指摘は単純明快。ねずみに代表される害獣によって多くの固有種が絶滅の危機に瀕しています。害獣駆除の試みが始まって、いちおう成功を収めつつあります。以上。

著者も指摘するように、「野生動物の絶滅」とかというと、多くの人が思い浮かべるのは、毛皮や角などを求めて(多くは西洋文明の)人間によって根絶させられるというものかも。ですが、多くの絶滅は孤立した島の固有種に対して起こり、それは西洋文明とはあまり関係なく、人間の移住や、それにともなうねずみなどの害獣によって引き起こされると著者は書く。

主な舞台はニュージーランドとアリューシャン列島。ニュージーランドの飛べない鳥カカポやアリューシャン列島の海鳥たちはねずみによって絶滅の危機に瀕しているとされます。ねずみは空腹でなくても獲物を狩れるうちには狩ってしまう習性があり(過剰な分はためこんで腐らせてしまったりする)、そういう獲物が生態系に存在しなかった島では少数であってもおそるべき効果を発揮してしまうとか。あるところではネコが、またあるところではキツネが、ヒツジやブタが、生態系を崩壊させてしまう。

イースター島の文明崩壊、ヤシの木を刈りつくしてしまったのも、住民がみずからすべて伐採したというジャレド・ダイヤモンドの説(『文明崩壊』)よりも、住民が持ち込んだねずみにむしろ原因があることが示唆されるのだとか。

こういう問題への対抗策は、そういう外来種の害獣たちを一匹残らず駆除すること。駆除というのはつまり、ねずみの場合は毒を含んだ餌をばらまいて殺し尽くすこと。ねこなら罠や銃で狩り尽くすことを意味します。ですが多くが絶海の孤島であるこうした島において、駆除のプロジェクトは簡単なものではありません。ここにねずみ根絶に向けた一大プロジェクトが発足するわけですが……

---

著者はどちらかといえば野生動物の保全という目的に疑問を抱いていないけれども、個人的にはいささか割り切れない面もあります。野生動物というのはねずみがいなくても、勝手に滅んでいたものかもしれません。その地に適応してしまったねずみを殺すのは、ねずみがありふれた種であり、よそにいくらでもいるからですが、それは命の比較なのでは。ねずみを殺すにしても、もっと人道的な方法はないのだろうか……などなどの指摘は本書でも一応取り扱われています。ほかにも、複雑な因果関係がきちんと議論されないまま、動物を根絶させるという点から反対運動が起こるということもあるようで、ブタを根絶させようとして反対運動が起こった事例なども紹介されています。

また、毒餌によって根絶させるという場合、ねずみだけがターゲットになるともかぎりません。毒餌はほかにも効いてしまうでしょうし、ねずみの死骸を食べた野生動物が犠牲になるケースもあるのだとか。複雑な生態系の話なので、問題はそうそう簡単でもありません。

でも、そういった問題を抱えつつも、総合的にはいろんな問題が実際に解決されているのは事実であり、ともかくも先に進めていく、というのが本書の結末であり、ある種感動的ではあります。

個人的に前作より劣るかなと思ったのは、「害獣によって生態系が破壊される」というテーマが、『捕食者なき世界』のテーマほどの意外性がなく、予想よりはるかにすごいとはいえ「まあそうなんだろうな」というものであることと、毒餌のような対応策の単純さにあるのかもしれません。

2015-01-02

ベン・ウィンタース『カウントダウンシティ』。『地上最後の刑事』の続編。わるくはないが……



ベン・ウィンタース『カウントダウンシティ』

地上最後の刑事』の続編(→感想)。

『地上最後の刑事』では、小惑星の衝突による人類滅亡まであと半年という時期において、とある片田舎の街のふつうの刑事が事件を追う、という話だった。いわゆる破滅ものだけれど、あまり真剣にSFしてなくて、あくまでも警察小説としての体裁を保つことで、そこからかいま見える人類社会を描いているところがユニークで面白かった。

続編の本作は、衝突までもう3ヶ月を切ったある日。警察組織自体がほぼ崩壊していて退職した主人公が、知り合いの女性に頼られて失踪した夫を探す、という筋立て。

前巻の感想の最後に、続刊はつまらなくなるかも、という懸念を書いておいた。人類滅亡の日は決まっているけれどもそれはまだ半年先で、人によってはいろいろ好き勝手なことが始まっているけれども、社会は崩壊しきっていなくて、警察も士気は低いけれどもいちおう組織としては残っていて、みたいな奇妙なバランスが妙味だと思ったので、破滅が近づくとこのバランスが崩れちゃうっていう気もしたので。

この懸念はある程度あたっていた。滅亡までのカウントダウンは始まってしまい、社会はいろんなレベルで壊れている。食品配給制度が始まっていて、インフラは壊れ、電気や水道が使えなくなることもあり、主人公は警察をクビになっている。主人公が捜査の必要からあちこちに赴いた結果として、そういう社会の有り様が明らかになっていく小説手法は健在で、そこは面白かったのだけれど、前巻のような奇妙なバランスはもうない。これはほとんど破滅SFといってよく、そのわりに失踪者を探すという事件の「大したことなさ」はもうバランスが取れていない。それに最終的な事件の解決もあっさりしていて、なぜこの設定とこの展開にたいしてこんな事件なのか?というのが謎めいている。

前巻は士気の下がりきった警察組織のなかで何故か捜査を行う主人公というのがノワールっぽくなっている、という指摘があったけれど、その点で言うと今巻では主人公はもうクビになっているので、ある種「元警察の探偵」風味になっているところは面白くはある。でもまあそれは些事かな。

前巻でも奇妙に空虚だった主人公の捜査への動機はいっそう空白になり、一人称小説なのに主人公が何を考えて行動しているのか疑問と言わざるをえない話になっている……というのはまあ、主人公が実質的に狂言回しだからなのだけれど、そういう構成が読者にあからさまになってしまうのは残念感もある。

ここまで来たら最後まで読みたいところだし、個人的には面白く読んだけれど、まぁ前巻ほどではないかな。前巻を読んですごく気に入った自分みたいな人は読むべきですね。