読者です 読者をやめる 読者になる 読者になる

携帯電話の買い換え、iPhone 4から6sへ

iPhone 4をこの6年間ほど使っていた。使い始めて4、5年経った頃からいいかげん買い換えたいと思っていたんだけど、ソフトバンクの解約月がめぐってきたこの機会に、ようやく買い換えることにした。6年前といえばiPhoneを取り扱っているキャリアはソフトバンクしかなくて、ソフトバンクもそのとき契約したのだった。

メッセージのやり取り以上の使い方をあんまりしないから使えるだけ使い続けようと思っていたけど、6年目ともなると使っていてストレスを感じる部分は多々あった。そもそも(もう誰も覚えていないだろうけども)iPhone 4はホームボタンのききが悪い機種で、自分のものも反応するまで何度もボタンを押し直さないといけないことが結構頻繁にあった。もっともそれは意外にも慣れて、むしろ困ったのは、度重なるiOSアップデートの末に(といっても7までしか上がらないが)OSが期待するハードウェアの性能を満たさなくなり、UIがlaggyになること。メモリ不足ゆえにアプリケーションの切り替えにいちいちそのアプリケーションの再起動を要したり、最近ではパスコードの入力すら画面に表示されるまでにラグがあったり……。iPhone 4はちょうどRetinaディスプレイが導入された機種で、その意味でちょうどいいタイミングで買ったつもりになっていたけど、一方で過渡期のものを買うことにはこういう弊害(ソフトウェアのアップデートについていけない)があるのかもしれない。

買い換え先の機種は少し悩んだ。私の使い方の範囲内だと、とにかく見目さえよければいいや、という感じだったんだけど。iPhoneにこだわりはないつもりで、実際最後のNexusシリーズとかも検討したんだけど、結局Androidの使い方を覚えるのが面倒な気がして、ずるずるiOSを使い続けることに。SIMフリーのiPhone 6sで中古で買った。中古といってもほとんど目に見える傷もないもので、Apple Storeの新品との差額も1万円とあといくらかしかないんだけど、なんとなく5万円前後で抑えたかったので中古を買うことに。iPhone SEなら中古でなくともそれより安い値段で買えるけど、iPhone 4の頃からあまり形状が変わってないし、気分を変えたかったので。

iPhone 4のときはケースをつけずに使ってきたけど、iPhone 6sは背面に入っているラインがあまり好みでないのもあってケースも買うことにした。こういうの。

フラワーリング iPhoneケース 6 6s対応 和風 チェック柄 ネイビー  SC-0573-NV

フラワーリング iPhoneケース 6 6s対応 和風 チェック柄 ネイビー SC-0573-NV

転入したIIJmioのSIMを挿して使っている。UIがまともに動いているのがうれしい。少なくとも4、5年この調子でいてくれたらいいのだけど。

最近遊んだゲーム

f:id:alpicola:20161226125707j:plain

The Elder Scrolls V: Skyrim

前の記事で書いたとおり、ゲームが十全に遊べるパソコンを導入してから、しばらく遊んでいた。TESシリーズを遊んだのは初めてで、Falloutのような同じオープンワールドと比べると、地形に地域ごとの特色があるというか、何よりマップ中央に高い山があって山登り気分を楽しめるゲームだった(これはTESシリーズというよりSkyrim地方の特色かもしれないけど)。景色を楽しみながら歩いていると、物陰から現れた野生動物に襲われて殺されたりする山登りだけど。それと、登場する人々がやたらと政治的にいがみあっているのがこのゲームの楽しさ。特にTESにおいては架空の種族が登場するファンタジー世界であるのを利用して、民族主義に根ざした対立、差別などが描かれていている(あくまで現実のアメリカをモチーフとしているFalloutだと、これは広い市場獲得を目指すタイトルとしてやりづらい )。で、そうした対立の歴史を含むTES世界を記述したゲーム内書籍も膨大に存在しており、この世界のloreを形作っていて、それらを読み込むのも楽しい。メインクエストを実はまだ終わらせてないんだけど、にもかかわらずプレイ時間が200時間を超えている……

ちなみに10月にリマスター版が配信されたものの、こちらは未プレイ。いつか気が向いたときにやるだろうか。旧作だと中世ヨーロッパ風ファンタジーの文脈を直接参照しないという意味でBethesdaのオリジナリティがある世界が描かれているTES III: Morrowindに興味がわいているので、むしろそちらのリマスターが出てほしい。

The Elder Scrolls: Legends

TESのloreに入れ込んだのをきっかけに、比較的最近オープンベータになったTESを題材としたdigital CCGである本作を9月くらいに始めた。結論から言うとこのカードゲームは地名や人物への参照はあるものの、TESのloreを生かしたそれには現状あまりなっていないし、card artがloreとの整合性がとれているか疑わしいこともあったりする(修正されることもある)。しかしながらカードゲームとしてはバランスのとれたゲームデザインになっている、みたい。この手のCCG自体ほぼ初めてだったので、最初は種族などでコンセプト付けしたデッキを作ろうとしたりしていたが、段々digital CCGの厳しい世界(強いデッキ構築に関する情報が出回っており、みなそれをベースにしている)を知り、プレイ実況などを見ながらそっちの文化を学んでいった気がする。

Life Is Strange

オレゴン州を舞台としたジュブナイルで時間操作ものなアドベンチャーゲーム。セーブ、ロードというメタな操作がなく、代わりに主人公に与えられる時間巻き戻しの力が使える。エピソード1だけやってそれなりによかったのだけど、システム面で心情的な引っかかりを感じて残りを積んでいるところ。

Gang Beasts

相手を場外にはじき飛ばせば勝ちというスマッシュブラザーズみたいなルールの乱闘ゲーム。4人で集まってプレイしている動画がとても楽しそうだったのでやってみた。が、思ったほど入力に対してうまくアクションが決まらない。操作のままならなさを楽しむのかな……。AIは実装されていないため、オンライン対戦機能を使って遊ぶんだけど、生き残った2人が試合を放棄してラウンドが終わらなくなったりする。友達と空間を共有して一緒に遊ぶのが楽しいだろうな、きっと。

Fallout 4

Skyrimの世界の魅力が山歩きとするならFalloutにおける楽しみは廃墟探索だろうか。昔遊んだFallout 3やNVと比べると最近のFPSやTPSっぽいプレイフィールがより取り入れられていて、戦闘の楽しさもいくらか増した気がする。こう書くとFPSやTPSの経験者のようだけど、実際はその系統のゲームはプレイ動画を見たことがあるくらいで、むしろFallout 4をはずみにしてもう少し本格的なFPSにも手を出してみたいと思っているところ(もっともPvPをやるつもりまではないけど)。コントローラーで遊んでるし、オートエイム代わりにVATS使ったりしてるが……

SFとして見ると……。人造人間を製造し、Mankind Redefinedなんて掲げてるthe Instituteの人々が、人造人間は人間に見えるけどもあくまで機械なんだって言って道具扱いするあたりにちぐはぐさを感じる。まあ所々で参照されているのであろう『ブレードランナー』を観てみてもいいのかもと思った。


振り返ると自制がきかないくらいゲームに何度かはまりこんでいるので、来年は少しひかえたい。TESもFalloutも次のタイトルが出るのは当分先だろうから大丈夫かな。

初めてのパソコン自作

もう2ヶ月ほど前のことになるけど、いわゆるパソコンの自作をした。初めてのことだったので、まずとっかかりになる情報を調べた。

Wikibooksの方は一般的なことが書いてあり、AKIBA PC Hotline!の記事は組み立てる時の様子が写真付きで詳しい。

パーツ選び

パーツは基本的にはマザーボードを起点としてその他のパーツがマザーボードに合うように選んでいればよいようだ。ケースはマザーボードATXmicroATXMini-ITXのような規格に応じて、CPUはソケットのLGA1151のような規格に応じて、メモリはDDR4-2133MHz……といった風に。メモリは規格上問題ないはずでもマザーボードとの相性問題が生じることがあるらしい。Asusなどは自社のマザーボードと各社のメモリの動作確認したもののリストを提供している(こんな風に)。あと気をつけないといけないのは、パーツ同士がぶつからない、またケースに収まるという物理的制約をクリアしているか(これが満たされない状況を「干渉している」というそう)。具体的なパーツの選び方はいろんな人のブログ記事(例えば下林さんのブログ)やPCPartPickerが参考になった。

私が購入したのは以下。

  • ケース: Fractal Design Define Nano S White
  • マザーボード: ASUS H170I-PRO
  • CPU: Core i5-6600
  • GPU: Zotac GTX 970
  • メモリ: TEAM DDR4-2133MHz 8GBx2
  • SSD: Crucial BX200 SSD 480GB
  • CPUクーラー: 虎徹 SCKTT-1000
  • 電源ユニット: Corsair CX550M

合計でおおよそ12万円くらいした。

組み立て

別に電子工作が要求されるわけでもなく、ただの組み立てなので、そんなに難しいことはない……はずだけど、いくつか苦労した点があった。

一つは、マザーボードへの各種ケーブルの接続。CPUとCPUクーラーを取り付けたマザーボードをケースに固定し、それから、ファンや音声のケーブルをマザーボードに差し込もうとすると、ケースと大型のCPUクーラーの狭い隙間に手を差し入れて作業しないといけない箇所があり結構苦労した。おまけにCPUクーラーの薄く何枚も並んだ放熱板に手が擦れると痛い。もしかすると取り付けの手順を前後させることでスムーズにできたのかもしれないけど、残念ながら私には思いつかず。手の甲にたくさん擦り傷をつくりながらなんとかやり遂げた。

起動を確認する段にあたっては、おおよそのパーツはきちんと認識されていたものの、ケース付属のケースファンの一つが認識せず、その原因調査をしないといけなかった。結局のところケース付属のケースファン周りのケーブルで、コネクタ部分が内部のケーブルから引き抜けて接触不良を起こしやすくなっていたからだとわかったのだけど、調査の過程で上に書いた作業しずらい部分に手をつけないといけなかったため少し大変だった。

最後に動作も確認して、ケースのふたをしめる際は、裏面の配線がかさばってなかなかうまくいかなかった。単純にケーブルの取り回しが下手ということかもしれないけれど、苦労した理由の一つは、ケースに通常のHDDラックのようなものはなく、裏面にSSDを取り付けるスペースが確保されたタイプのものだったこと。SSDに取り付けたSATA電源ケーブルがケースのふたにやや干渉してしまっていた。

その後

組み立て終わったマシンにはWindowsをインストールして無事に動いている。ゲームを動かしても静か。そもそも自作をすることにした動機は、ゲームを満足に動かせるパソコンが欲しい、そしてかつケースのデザインなどが自分の好みで選べるものが欲しい、というもの。その目的は達成できたのでよかった。

遊んでいるゲームというはSkyrim。ちゃんと最高設定で動く。少し古いゲームだけどこれが遊びたかったので。最新のものは追い追いやれれば。多少古いものも最新のものも変わりなく遊べるのがコンソールでなくPCでゲームを遊ぶメリットだと思う。

組み立て後に実はフロントパネルのヘッドフォンのジャックがなぜか動作しないのに気づいてしまった。が、マイクのマークの付いている方のジャックや背面のものは動作しているので、気にしないことにする。

グレッグ・イーガン『祈りの海』

祈りの海 (ハヤカワ文庫SF)

祈りの海 (ハヤカワ文庫SF)

(以下結末などのクリティカルな部分に言及なし)

初めてのイーガンということで、この短編集を手に取ってみた。ちゃんと面白い。

この作品群の肝として、科学的言説やそれに支えられた技術が、人々の自己や世界に関する認識を逆撫でし撹乱する小道具として機能させるためのセッティングがそれぞれ用意されている。そうした仕掛けの上に、そこまでくせのないサスペンス・ドラマが物語のプロットとして与えられる形になっており、科学そのものよりも人間のリアクションに主眼がおかれているため、その意味では読みやすいものが多いだろうと思う。

例えば『ぼくになることを』では、絶え間ない学習によってその振る舞いを脳と区別できなくなった機械を想像する。素朴に意識をコピーする技術を仮定するのでないのがいい。私が気に入ったのは『繭』と『ミトコンドリア・イブ』。この二作品も、生命科学を題材にした(ディテールを無視すれば)全く有り得ないとはいえない設定を用いていて思考実験としての強度を保っているとともに、それがもたらす政治的狂騒がよく描かれていて楽しい作品だった。

一方『放浪者の軌道』などは、非直観的な性質を示す数理的な対象を引き合いに出すことによって成立する一風変わった寓話という趣き。そうやってアイデンティティや自由意思の問題に言及する『放浪者の軌道』は論理的にはナンセンスだけど、なんだか面白い視点を見つけた気分にさせる。『無限の暗殺者』もこの類型だと思うが、残念ながらこちらはあんまりうまくやれていないように思った。

表題作『祈りの海』はこの短編集の中では少し長めで、章に分かれるなどやや違う性質を持っている。作品に用意されている「トリック」も他作品と比べると込み入ったものではなく、我々とは異なる異星の人々の暮らし、そしてそのうちの一人である主人公の体験とそれを通じた変化について丁寧に描写されている。主人公の信仰と、彼が一学徒として明らかにしていく事実がそれを根底から揺るがしかねないものであること、そのせめぎ合いが見所であるはずだが、それほど私には訴えなかった。

ところで、この短編集で女性のせりふはほとんどが古典的な女性の役割語を伴って訳出されていたが、イーガンのような現代的な作品においてそれは適切なのだろうかと感じてしまった。とりわけ『祈りの海』では、我々の世界とは異なった様相のジェンダーを構築せしめるはずの身体的特徴が人々にあるにもかかわらず、作品とは違う世界のジェンダーの文脈が否応無くついてまわる役割語が無頓着に使用されているのは、読んでいて作品世界から押し戻されるようだった。もっとも上記の点についても原著者によってどれだけ意識的になされたものなのかはわからないし、いずれにしても作品内であまり掘り下げられていないようなのではあるが。

TypeScriptの型システム

実際に使うまで、TypeScriptの型システムについてJavaActionScriptのようなものをイメージしていたけど、いくつか他にはあまり見られない特徴のあるものだということが分かってきたので、まとめる。

Specificationはあまり読んでいなくて、コンパイラ(TypeScript 1.1.0-1)の挙動を見て書いているので、誤解はあるかもしれない。また、ここに書いたことはHandbookでだいたい言及されている。

Parameter type bivariance

TypeScriptにはジェネリクスがある。ジェネリクスを使用したときのsubtyping relationをまず見てみる。

class Base {
    foo(): void {}
}
class Derived extends Base {
    bar(): void {}
}
 
class Box<T> {
    constructor(public value: T) {}
}
 
var a: Box<Base> = new Box<Derived>(null); // ok
var b: Box<Derived> = new Box<Base>(null); // error: Cannot convert 'Box<Base>' to 'Box<Derived>'

Subtyping relation A \le Bとは型ABとしても使える、すなわち型Aの値を型Bの変数に代入することができるということだと思ってもいい。

A \le B \quad \text{iff} \quad \mathrm{Box}(A) \le \mathrm{Box}(B)

つまり、covariantになっているみたいだ。

関数型について見てみると

var c: () => Base = () => new Derived; // ok
var d: () => Derived = () => new Base; // error: Cannot convert '() => Base' to '() => Derived'
var e: (x: Base) => void = (x: Derived) => { x.bar() }; // no error, but 'e(new Base)' causes a runtime error!
var f: (x: Derived) => void = (x: Base) => {}; // ok

返り値の型に関してはcovariantになっていてこれは普通だけど、引数の型ではどちらでも通ってしまう(bivariant)。コメントに書いた通り、これは生じうるruntime errorを見逃してしまう。

このような仕様になっている理由は、JavaScriptで頻出する次のようなパターンを許したいからのようだ。

interface EventTarget {
    addEventListener(type: string, listener: (e: Event) => void): void;
    ...
}
target.addEventListener('keypress', (e: KeyboardEvent) => {
    // use e.keyCode
});

No nominal typing

Nominal typingがないとはどういうことかというと、上の例で代わりに

class Base {
    foo(): void {}
}

class Derived extends Base {}

としたときに、型BaseDerivedは同値になる。実際、こうすると上で見た型エラーも起こらない。つまり、classにしてもinterfaceにしてもstructuralな定義に別名をつけるにすぎないということになる。これを利用して

interface Id extends Number {}
var id: Id = 1;

みたいなことも書ける。

Overloading is not resolved statically

TypeScriptのOverloadingは、シグネチャごとに実装を用意しておいて、呼出側では型によって静的にdispatch先が決まるような、いわゆるOverloadingとは違う。実行時に処理を振り分けるコードを自分で書く。

function ppr(o: string): string;
function ppr(o: { ppr: () => string }): string;
function ppr(o: any): string {
	if (typeof o === 'string') {
		return '"' + o + '"';
	} else if (typeof o === 'object') {
		return o.ppr();
	}
}

ppr('a');
ppr({ ppr: () => '{}' });
ppr({}); // error: Could not select overload for 'call' expression

引数の型がanyにつぶれてしまっているように見えるけど、実際に呼出側が利用できるのは実装のない上2つのシグネチャなので大丈夫。

このようになっているのも、元々あるJavaScriptのコードに型を付与するのにはこうでないといけないというのと、またきっとTypeScriptと変換後のJavaScriptでメソッドの対応が1対1になるようにしたいからなのだろう。


TypeScriptは方針として、既存のJavaScriptライブラリとの相互運用性を重視している、さらにいえばJavaScriptでよくあるプログラミング作法にしたがって書かれたコードに対して、できるだけ型を付けて書けるようにするというところを目指しているのだと思う。逆にいえば、この世界に異なる作法を持ち込むことは想定されていない。

他、型システムと直接関係ないところでは、関数型を書くのに引数の変数名が必須なのがまだるっこしいとか、スコープの扱いがコンパイル後のJavaScriptを考えないと想像しずらいとか、あるけれどこれくらいで。