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

チューリング不完全

What are you afraid of? All you have to do is try.

ISUCON6予選 TOPで敗退するまでの道のり


supermomonga(@supermomonga), aomoriringo(@aomoriringo), purintai(@specepro_be)の3人でISUCON6に出場しました。
チーム名はSMAP(SuperMomongaAomoriringoPurntai)です。

ISUCON4には出場したことがあり、2年ぶりの出場となりました。

チーム構成

aomoriringoは3人の中では一番SQLを書いたことがあるっぽかったので、MySQLまわりを主に担当することにしました。
Rubyはほとんど書いたことがないのですが、コードを読んでここはN+1問題が発生してる、というのは普通にわかります。appコードを読みつつのSQL改善や、MySQLの解析ツール、パラメータチューニングなどをもろもろやりました。あとは強いて言えばRubyに閉じた中でのアルゴリズムの改善とか。

purintai は主にRuby app部分を担当。参照頻度の高いデータのRedisへの載せ替えや、Sikekiqによる非同期処理などをサクサクやってくれた。

supermomonga もメインはRuby app部分の担当ですが、3人の中で一番幅広い分野を触ってくれました。Redisの構築と設定、Ruby周りの解析ツール設定、書き捨ての便利スクリプトの作成、unicornの設定・・・などほんとにいろいろ。

チーム登録から本番まで

8/31 (3週間前)

supermomonga, purintai 両氏に「isuconどうですか」と誘ってもらい参加することに。
その日のうちに以下のことをやりました。

slackには本番までに必要そうなことや、参考になりそうな記事を各位投稿してやりとりをしていました。
前日から、とかではなく、3週間というある程度の時間の中で「ここはこういう風がいいのではないか」「環境はこうしたい」など各位の意見が見えることによって、ゆっくりと全員の意識共有が醸成できたのは大きかったなと思います。

9/1~9/8

  • 各自の得意分野について共有
  • 使用する言語の決定
    • supermomonga, purintai のメイン言語がRubyだったのでRubyにした
  • ISUCONの参加記事をslackに投稿し、とるべき方針や参考になりそうな部分についてやりとり
  • crowiの作成
    • 以降、調べたことをmarkdown形式でwikiとして保存できるようになった

9/8

  • aomoriringo がISUCONもくもく会@Wantedlyに参加
    • appの編集環境やデプロイツール周りなどの環境について考慮しておいた方がよい、ということを聞く
    • 使用されるIaaSについて
      • 今回はISUCONとしては初のAzure。インスタンスの作成や再起動試験などの概要について共有
    • 「最初の1時間で何をするか決めておく」という概念を学ぶ

9/9~9/10

  • supermomonga 邸に aomoriringo が訪問して練習会
    • matsuu氏によるISUCON5予選問題Azure版を構築
    • slackに#benchmark部屋を作成し、ベンチマーカーの実行結果を slackcat を使って実行完了時に結果が投稿されるようにした
    • 速くするためのappの変更よりも、実際の環境を触りながら使えそうな構築ツールのインストールや使用方法、便利そうなshellコマンドなどをwikiにまとめることを重点的に行う
    • redisの試用、各種解析ツールの試用

この時点ではMySQLのキャッシュについて深く把握しておらず、「再起動するとスコアが半分ぐらいになる・・・実行するごとにスコア上がる・・・なんで・・・?」とか言ってました。(クエリキャッシュの影響)

9/11~9/15

  • gitのrepository構成の決定
    • app repositoryとconf repositoryの2つを作成することにする
      • app repository (対象となるwebappディレクトリ以下を管理)
      • conf repository (/etc以下のmysql, nginx, redis等設定ファイルを管理)
  • 練習会の経験を得て、当日の進め方について話し合い
    • いきなりMySQLに初期状態のappで呼んでいるSQLを最適化するようなindexを貼ってしまうと、N+1解消するような変更をしたときにスコアとして改善が見えにくい。まずはappで見て明らかに無駄なところを直す

slackで書いてたことの例
f:id:aomori-ringo2:20160919003816p:plain

  • mysqlについて調べる
    • パラメータチューニング
    • B-Treeアルゴリズムについて
    • EXPLAINの読み方
    • 既存テーブルへのカラム追加手順

9/16-9/17

金曜日に有給を取得して supermomonga 邸に3人集合。(結果的に金曜日から月曜日にかけて3泊しました)

金曜日は既にたててあるISUCON5予選問題, 土曜日はpixiv社内ISUCON問題に取り組みました。

9/9,10に練習会をしたときと同じく、ツールの使用方法やテンプレになる処理をwikiにまとめながらの作業となるので、あまり厳密に時間の測定は行いませんでした。

過去問に取り組むときの方針

ISUCON4に出場したときは予選本番の前の週にチーム3人で集まり、本番と同じように時間を測ってISUCON3の問題に取り組んだのですが、これは失敗だったなあという思いがずっとありました。この時はメンバー全員がISUCON初参加だったし、事前に十分な予習やツール検討をできていたわけではありません。
本番と同様に10時~18時で行うとそのあとに何が良くなかったかを検討することもあまりできず、結局惨敗してしまいました。

その経験を踏まえて、今回は過去のISUCON予選通過組のブログを読み、有効な手段を試し、それぞれについて都度メンバーと共有をする、ということをたくさんやることにしました。
幸い今回は練習時間を多く確保することができたので、後半はwikiに書き留める作業が収束し、より対象のアプリや環境に集中して、高速化を検討することができるようになりました。

最終的にはISUCON5予選問題は5万点, pixiv社内isucon問題は19万点ぐらいになりました。

「最初の1時間にやることリスト」の作成

crowiはknowledge baseとしてはとてもよかったのですが、チーム全員が同時に編集するには使いづらい。
そこで、複数人で同時に1テキストを編集することができるhackmdを使ってやることリストを用意しました。

f:id:aomori-ringo2:20160919212426p:plain

やることリストテンプレ
現時点で何が完了しているのか、何がまだできていないのかをすぐに確認することができ、各自がここを見ながら「じゃあ次はこれやります」「よろしく」みたいなやりとりをしてました。

9/18

予選当日です。
8時ごろに起床し、食べ物・飲み物を買い揃え、机の配置などの準備をしました。


メモ用紙と筆記具もあると良いです。

本番の取り組み

やったことを全部記録しているわけではないので、効果があった取り組みをいくつか書いてみます。

Isutar部分の消去

今回はIsuda, Isutar, Isupamという3つのサービスが連携している、いわゆるMicroservice的な作りでした。
Isupam部分はバイナリであり、かつボトルネックとしては最後まで問題にならなかったので正直忘れ去ってました。
IsudaとIsutarはMySQL側にそれぞれデータベースを持っていたのですが、Isudaは2テーブル, Isutarは1テーブルしかない小さなデータベースです。また、レコード件数もそんなに多くない。
そこで、Isutar部分の処理はIsuda側に移し、データはRedisに全部載せるようにしました。
この辺はMySQLの状態を確認できるように準備していたmyphpadminが地味に貢献していて、各テーブルの構成やデータ量把握を各自がすぐ行えるのがよかったかなと思います。

Etagの活用

今回の問題は「はてなキーワード」的なサービス内容でした。
キーワードとその説明を1記事(entry)として投稿することができ、閲覧すると説明文の中に、サービスに保存されているキーワードと同じ文字列があれば自動でリンクタグを挟むというものでした。
参考実装では、記事の閲覧(GET)が呼ばれるたびに説明文の文字列に対してリンクタグを入れていくという処理があります。お約束の対策としては事前にリンクタグが挿入済みのHTMLをあらかじめ生成しておき、キャッシュしてGETが呼ばれたときに即座に返すというものですが、問題はキーワードのPOSTが全記事に影響を及ぼす可能性があるということです。
あるキーワードがPOSTされると、そのキーワードを説明文に含む全ての記事は影響を受けます。キーワードの中でも特に短いもの、例えば「9年」などはテストデータ中の4割近くに含まれており、POST時に全てのHTMLを再生成するというのは現実的ではありません。
そこで、記事(entry)テーブルに「modified_at」カラムを追加し、キーワードの追加/削除時に以下のようなSQLを発行するようにしました。

UPDATE entry
SET modified_at = '#{now}'
WHERE description LIKE '%#{keyword}%';

HTTPにはEtagというレスポンスヘッダがあります。サーバがレスポンスを送信する時にEtagフィールドをセットすると、クライアントは次回同じURLにリクエストする際に先ほど送信されたEtagをIf-None-Matchヘッダに入れてHTTPリクエストを送信します。
このEtagに先ほどの「modified_at」の結果を入れ、GET時にもしDBに保存されている「modified_at」と同じであれば内容が変わっていないとし、「304 Not Modified」レスポンスを返すようにしました。

非同期処理(Sidekiq)による直近投稿部分のキャッシュ生成

トップページ`/`が表示されると、最新の投稿20件が表示され、画面最下部の「もっと見る」をクリックするとさらに次の20件が表示されるという仕様がありました。
解析ツールを見るとこのトップページに対するアクセスがとても多いため、直近数十件のエントリに対して非同期でエントリの生成を回し続けるという処理をSidekiqを使って実装しました。

その他

説明文文字列のHTML化(htmlify)部分には結局、大きく手をいれることができませんでした。
今思えばキーワードすべてを「|」で並べた正規表現が遅いことや、差し替えをするときの方針などもっといろいろ考えられたはずなので、大変悔やまれる部分です・・・

結果

今回の最終結果を見ると、予選通過のボーダーラインは90214点です。
我々のチームは一時的に11万点を超えるスコアを出すことができたのですが、ベンチマーカーやキャッシュの問題か計測によってかなり揺れがあり、最後のスコアが89923点となってしまいました。
予選落ち組の中ではほぼトップのスコアかと思います。とても悔しい・・・

反省

Rubyは読めるけど書けない」、個人的な一番の課題はここです。
特にアルゴリズム部分を考える際、「Pythonなら書けるけどRubyだと・・・?」みたいなことをいちいちググったり人に聞いたりしていては話になりません。来年までにProject Eulerなどで訓練したいと思いました。
それから今回の問題ではデータベースのテーブル構成がとてもシンプルで、事前に調べていたSQLの知識がほとんど使えませんでした。JOINが1つもなかった気がします。
理解が完全であったかどうかはかなり怪しいところがありますし、次回の設問では揺り返しとしてテーブル構成が複雑な問題となるのではないかという感じがするので、SQL部分の知識も蓄えたいところです。

逆にチームとしては3週間前からのslackのやりとりと数日の泊まり込み合宿の成果がいかんなく発揮され、かなりスムーズに動けていたと思います。ここはぜひ次回にも活かしたいです。




おわりに

かなり真面目に取り組んだので、1000点差で本選に出られないのは忸怩たる思いがあります。
楽しかったけど、悔しかった。
悔しかったけど、楽しかった。
ISUCON7で会いましょう。

作業用BGM(現代音楽編)

この記事は作業用BGM Advent Calendar 2015 15日目の記事です。

普段は現代音楽とテクノミュージックを中心に聞いています。
現代音楽が好きなのでたびたび人に薦めるのですが、その度にドン引きされてしまいます。
「作業用BGM Advent Calendar」というのを見つけたので、これを機に私の知っている現代音楽の紹介を記事として昇華させ、人にこのような市民権の得られない音楽を直接押し付ける衝動を抑えたいと思います。
hoge

うるさいやつ

G.リゲティ「100台のメトロノームのためのポエム・サンフォニック」(1962)


György Ligeti - Poema sinfónico para 100 Metrónomos ...

メトロノーム100台「のみ」が使用された音楽です。YouTubeのものは8分程度の動画ですが、フルだと20数分あります。
前半はとにかくガチャガチャといっているのですが、だんだんとテンポの速いメトロノームが止まっていくと、個々のメトロノームの音がはっきりと聞こえてくるようになります。
ライヒのドラミングなどで使われているリズムを少しずつずらしていく手法、「漸次的位相変異プロセス」のよりプリミティブな形ですね。

K.シュトックハウゼン「ヘリコプター弦楽四重奏曲」(1993)


Helikopter-Streichquartett (Helicopter Quartet ...

正式タイトルは弦楽四重奏、4ヘリコプターとパイロットと4技師/4テレビジョン・トランスミッタ、4×3サウンド・トランスミッタ/段積みテレビ4組と段積みスピーカー4組を備えたオーディトリウム/サウンド・プロジェクショニストとミキシング・コンソール/司会者(任意)のための『ヘリコプター弦楽四重奏曲』」です。
カルテットの4人がそれぞれ4台のヘリコプターに乗り込み演奏します。ヘリコプターはコンサートホールの周りを旋回していて、観客は4人それぞれの演奏した音と映像の中継をホール内で聴きます。
映像では奏者がヘッドホンしていますが、これはお互いの音を聴いているのではなく「それぞれの小節の拍子をインパルス音で示してドイツ語で数える『クリック・トラック』」というものを聴いています。

個人的には人が叫びだすところらへんで「オッやばいな」という感じがします。

http://3.bp.blogspot.com/-yn2-xv3KMXw/U6OwHm96lxI/AAAAAAAAFag/lHc8B6kQPR0/s1600/DSCN2673.jpg
楽譜は4色に塗り分けられていて、これにも意味があります。
この曲は単独の作品ではなく、「光」という全部で7日間、28時間のオペラの一部です。スーパーフォルメルという1分程度の主題がオペラの様々な部分に展開されていて、ヘリコプター弦楽四重奏曲もそうらしいのですが、「光」の他の曲を聞いたことがないのでわからないです。
シュトックハウゼンの曲はとにかく金がかかるものが多くて、たしかCDも1枚20000円みたいな意味不明な値段がついていたと思うので買えませんでした。

K.シュトックハウゼン「天国への扉」(2005)


Heaven's Door Lugo - YouTube

「ヘリコプター弦楽四重奏曲」のところに補足的に付け加えるぐらいの気持ちでいたのですが、YouTubeで動画を見つけてしまったので貼っておきます。

打楽器奏者と一人の少女のために書かれており、「クラング」の中では例外的に演劇的な要素が加えられた作品である。演奏時間は約28分。
打楽器奏者が6つの板からなる扉を叩きまくる。床にも板が敷いてあり、奏者の足音によるリズムも加わって、リズムが次第に複雑になっていく。やがて扉が開かれると、演奏者がその中へと消えてゆき、今度はタムタムやシンバルなどの金属打楽器を演奏する。そこにサイレンの音も加わり、轟音が響くなか、客席に座っていた少女がステージに上がり、扉の中へ入ってゆく。打楽器とサイレンの音がフェード・アウトし、曲が閉じられる。

https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%A9%E3%83%B3%E3%82%B0_(%E3%82%B7%E3%83%A5%E3%83%88%E3%83%83%E3%82%AF%E3%83%8F%E3%82%A6%E3%82%BC%E3%83%B3)#4.E6.99.82.E9.96.93.E7.9B.AE.E3.80.8C.E5.A4.A9.E5.9B.BD.E3.81.B8.E3.81.AE.E6.89.89_HIMMELS-T.C3.9CR.E3.80.8D.282005.29

この曲は音自体よりも、『サイレンの音も加わり、轟音が響くなか、客席に座っていた少女がステージに上がり、扉の中へ入ってゆく。打楽器とサイレンの音がフェード・アウトし、曲が閉じられる。』という曲解説の文章から想像される脳内イメージの方が面白いです。動画を見てみても特にここ面白くないんですが、字面で見た時の神秘性とか超然とした雰囲気がやばい。

「作業用BGM」の紹介のはずなのに曲よりも文章が面白いとかいって紹介するのどうなのというのがありますが、せっかく書いたので許して。

西村朗「2台のピアノと管弦楽のためのヘテロフォニー」(1987)

www.youtube.com

西村朗はとにかくこの曲ばかり聴いていますね。初聴だとおそらくピッコロあたりのとても高い音がぶつかりまくりながら上昇していく部分で厳しい気持ちになる方が多いと思いますが、慣れてくるとこの緊張感がたまらないんです。なんか麻薬やってる人みたいなこと書いてるな俺。
ちなみに西村朗は2015年、吹奏楽コンクールの課題曲のために「秘儀Ⅲ -旋回舞踊のためのヘテロフォニー」という作品を書いています。
「響け!ユーフォニウム」に曲名が出て勝手に盛り上がっていました。
http://livedoor.4.blogimg.jp/anico_bin/imgs/c/f/cf8fb607.jpg

矢代秋雄交響曲」(1958)

youtu.be
4楽章(23:20~)をよく聴いてます。私を現代音楽沼に引きずり込んだ元凶。
いまだに拍子がわからないです。5/8と7/8と11/8がまざっている。

三善晃「祝典序曲」(1970)

www.nicovideo.jp
22:40~27:15。タイトルはクラシック音楽にはありふれたものですが、はじめから異様なテンションで突っ走っています。
重要なのは、この曲は大阪万博の開会式のために書かれた曲なんですよね。これから夢のような万博が始まるぞ!って勢いの聴衆につきつけられるのがこれ。テンションが高いということだけは共通しているが、異常に禍々しい。
1970年の高度経済成長という時代背景などが関係しているのかどうかわからないですが、考えちゃいますね。これは誰にとっての「祝典」なんでしょうね。
三善晃は好きすぎて何挙げるか悩みました。他には「交響三章」「響紋」「魁響の譜」なども大好きです。


うるさい曲の紹介欲がだいぶ満たされたので、もっと作業用BGMとして受け入れられそうな曲についても書きます。

おだやかめなやつ

Steve Reich「Drumming」(1971)

www.youtube.com
おそらく今回のAdvent Calendar中で他の誰かが挙げることになると思いますが、私自身も大好きなのであまり気にせずに書きます。
Steve Reichという人は(本人は一度も言ったことがないはずですが)「ミニマル・ミュージック」というジャンルの大家です。同じリズムやフレーズを執拗に繰り返すというスタイルですね。(オスティナートと言ったりもする)
このドラミングはPart1~4が続けて演奏される曲で、それぞれPart1では膜鳴楽器(いわゆる太鼓)、Part2ではマリンバ+声、Part3ではグロッケンシュピール(鉄琴)+ピッコロというように、Partが進むにつれて使われる楽器の音が高くなっていきます。最後のPart4では全ての楽器が使われます。
「ドラミング」というタイトルの通り、曲中ではとにかく複数人が複雑に絡みあったリズムを鳴らし続けます。はまるとだんだんトランス状態になってきて作業が捗って仕方ない。
ライヒはこの他にも、ごく初期の「It's gonna rain」「Come out」「振り子の音楽」を除けばだいたい同じ作風で、不協和音が曲中に出てくることはほぼありません。安心して聞けると思います。

John Adams「Chairman Dances」(1985)

www.youtube.com

Steve Reichと似たものをもう1つ。動画のサムネイルで分かる人にはわかると思いますが、この曲は現代音楽家が発表した楽曲でありながら、「Civilization 4」というゲームのBGMとして採用されました。
John AdamsSteve Reichに比べれば作風が広いです。この曲が気に入った場合は、他に「China Gates」「Grand Pianola Music」などもおすすめです。

Morton Feldman「Palais de mari」(1986)

www.youtube.com
直訳だと「マリの宮殿」なのですが、日本での出版時に「廃墟の静寂」といういかす邦題が付けられました。
もうとにかく廃墟感がすごいです。日本の軍艦島や病院の廃墟というよりは海外のイメージがしますね。

三輪眞弘「愛の讃歌」(2007)

www.youtube.com

日本人が作ったガムラン音楽。ガムランで適当に探すと結構リズムが激しい物が多いんですが、この曲は終始瞑想的な雰囲気が漂います。
こういうの聴くとなぜか脳裏に小学生のときの記憶が。聖剣伝説2かな。
同じ作曲者の「鈴掛マタリ」も好き。

まとめ

こういうの聴きながらコード書いてます。
テクノ編は他の人がやると思いますが、もし僕がやるとしたらdub techno(not dubstep), tech dance, death technoあたりの紹介になると思います。

いらすとやの奇妙な冒険 第1話

いらすとや Advent Calendar 2015 7日目

ドッギャァ~ン
http://2.bp.blogspot.com/-qeY0sjmUK2A/U401E5rfi-I/AAAAAAAAg9Q/0inLmwepOJE/s800/mizugi_woman.png

『血は生命なり!』
http://3.bp.blogspot.com/-la0WXIEj3Og/VA7mbmBn1UI/AAAAAAAAmQY/FlJynwAD9ro/s800/yuusya_game.png

ドッガァ!
http://4.bp.blogspot.com/-lVhR8beIFw0/VJF_lKI5_hI/AAAAAAAAp4o/ltuV33tBWj8/s800/game_ken.png

ブシューッ
http://1.bp.blogspot.com/-L00Bym3hhig/Ul5qQgqV_TI/AAAAAAAAZCA/gqhfZH-fc-M/s800/funsui.png

美女の返り血はこの石仮面にある無数の細かいヒビに吸い込まれていく!
仮面は生き血を吸って動き出したッ!
http://1.bp.blogspot.com/-sXCRxDscQEc/VahRquDP2gI/AAAAAAAAvuw/KP_kKl5Dwl0/s800/noumen.png

侵略者ディオの巻

ビンビン
ビンビン
ドスッ
ドスドスドスドスドスドス
http://3.bp.blogspot.com/-IDs-NUvUYTE/UvTdwySZPSI/AAAAAAAAddg/JvfTZNymRoQ/s800/saihou_hari.png

『おぉお~ん』
実にッ!

実に奇怪だった!
男は死なない!
どのような仕掛けになっているのかこの石仮面から飛び出た数本の骨針に頭をさされているのに!
http://3.bp.blogspot.com/-hRKCZ3bXovc/U5l6FB6XpYI/AAAAAAAAhYI/HcgJ_FNInuc/s800/setsubun_kodomo.png

『我はついに手に入れたぞ!!』
『永遠の生命を!』
http://3.bp.blogspot.com/-Os449TVwhnI/VCOJwW2w5kI/AAAAAAAAm2M/KdNCpvTag7g/s800/job_seijika_man.png

ウォォォォォン
http://2.bp.blogspot.com/-sGec_su9wSg/U7O61I-cqpI/AAAAAAAAiTk/eBb1Vbh3TRc/s800/setsumeikai_seminar.png

『汝!わたしの生命となるか!』
『は!喜んで!』
http://2.bp.blogspot.com/-47rRGlJCk2M/Ugsrla17PBI/AAAAAAAAXF8/Xu7TePCXAhY/s800/gomasuri_businessman.png


ビスッ
ボゴ!
ボゴボゴ
『生命を吸いとるッ!』
http://1.bp.blogspot.com/-ZJil2Q2DItA/U32NtSeQRzI/AAAAAAAAg0o/cirn0qzpKJU/s800/sick_gekiyase.png

『そして!この石仮面から真の支配者の力を手に入れたぞ!』
バゴォ
http://1.bp.blogspot.com/-8kolqN-9IU8/VGX8kcAlZfI/AAAAAAAApI8/gH_pPbZMZYo/s800/karate_kawarawari.png

ウオォオォオォオォ~ッ
族長!族長!族長!
http://3.bp.blogspot.com/-RtobcWeidcQ/UdoE2jnA10I/AAAAAAAAV9k/XRyDlvSBDJE/s800/senkyo_car.png

西暦12世紀から16世紀にかけメキシコ中央高原に強大で勇猛な王国があった!
国家的規模のすさまじい生贄と人肉喰いの儀式が伴うこの文化!

その名を太陽の民アステカ!
http://4.bp.blogspot.com/-l9k1vsBSHho/VaYrPvwQvJI/AAAAAAAAvms/VdMJzYNnxwY/s800/space01_sun.png


そしてその中にこの「石仮面」の能力で世界に君臨しようとする野望をもつ一部族がいた!
「石仮面」は彼らに伝わる奇跡!永遠の生命と真の支配者の力をもたらす!

しかし!ある時その部族は目的をとげずこつ然と歴史から姿を消す!
無人の廃墟を残して!

http://3.bp.blogspot.com/-kyY7d96QffE/VRUSM5jKsCI/AAAAAAAAsng/E-CuZhl7xvA/s800/maya_kukulcan.png


なぜなのか!?どこへ行ったのか!
謎のすべてはこの「石仮面」にある!

この物語はメキシコから発掘された謎の「石仮面」にまつわる2人の少年の数奇な運命を追う冒険譚である!

http://1.bp.blogspot.com/-sXCRxDscQEc/VahRquDP2gI/AAAAAAAAvuw/KP_kKl5Dwl0/s800/noumen.png

第1部ジョナサン・ジョースター その青春


聞こえねえのか…ディオ…
ディオ……ゴホッ…ゴホッ!ゴホゴホゴホ
http://3.bp.blogspot.com/-sjVI30MeGM8/UvTeP929dWI/AAAAAAAAdl8/-Vxm1QC32W8/s800/roujin_museru_seki.png


ここへ来いディオ!
聞こえねぇのかァ…ディオ
ゴホゴホゴホゴホ
http://2.bp.blogspot.com/-mLEIFaPUH-4/Uj_21DlORzI/AAAAAAAAYCM/ZlgkUb7EcpA/s800/dokusyo_man.png

パタン
http://4.bp.blogspot.com/-7mHxdQtnGHA/VCOJfgYKECI/AAAAAAAAmyM/_8XFWkRbfMk/s800/pose_yareyare_man.png

なんだい父さん薬かい?
い いいや薬はいらねえ……
ディオ!ちょいとここへ来い話がある
http://1.bp.blogspot.com/-NB0JpC-N6ac/VRUP7o2TnuI/AAAAAAAAsds/qwuSGUGFiOw/s800/byouki_oldman.png


おれはもう長いことねぇ…
わかるんだ……
じき死ぬ……
http://3.bp.blogspot.com/-saonpkzjcbw/UxbL0dacztI/AAAAAAAAeFE/kPscjWgPwQQ/s800/unhappy_man1.png

死んだあとの気がかりはひとり息子のおめぇだけだ
………いいかディオ
http://1.bp.blogspot.com/-NB0JpC-N6ac/VRUP7o2TnuI/AAAAAAAAsds/qwuSGUGFiOw/s800/byouki_oldman.png


ゴホ!おれが死んだらこの手紙を出してこの宛名の人の所へ行け!
こいつはおれに恩がある……
きっとおまえの生活の面倒を見てくれる
学校へも行かせてくれるだろう!
http://3.bp.blogspot.com/-saonpkzjcbw/UxbL0dacztI/AAAAAAAAeFE/kPscjWgPwQQ/s800/unhappy_man1.png

こいつはおれに恩があるんだケケケ!
http://4.bp.blogspot.com/-xj-dlczJQN4/Vf-ak6b-4gI/AAAAAAAAyHY/3q8yehxoqjQ/s800/wakadukuri_man.png

そう…12年前
あれは1868年の雨の日だった
こんな話息子のディオには話せねえがよォ……
http://2.bp.blogspot.com/-8NdJg3QsXpQ/U401GmwJh5I/AAAAAAAAg90/EvoZgrkuxIw/s800/rain_ame.png

あそこの崖は雨で崩れやすくなる……
よく馬車が落ちてた
http://2.bp.blogspot.com/-kUWQzMt7vY4/VSufjaMD2hI/AAAAAAAAs-U/d4gv0wzHhLg/s800/car_jikosya.png

たまたまおれは酒場の女を連れて通りかかった
http://1.bp.blogspot.com/-hZ0j7hOAMy0/VRUSf8Bsj7I/AAAAAAAAsrs/vII-kOiL-Jo/s800/couple_man_woman.png


ウヘヘヘヘヘヘヘヘ
おい見ろよッ!
事故だぜッ!
ちょっとォだんな!
あたしゃかかわりあいはゴメンだよォ
うるせェッ!金持ちの馬車だぜ
……貴族だッ!
http://2.bp.blogspot.com/-fZPvL3CtBYY/Vkcakg-ua5I/AAAAAAAA0dI/3vlu971kQ68/s800/shinsyakaijin_run2.png

おェッ
http://3.bp.blogspot.com/-tQmyxi367Fo/UxbL1yiVEvI/AAAAAAAAeFc/qnOG8wRQt1c/s800/unhappy_man4.png

ひェ~
http://3.bp.blogspot.com/-e7FojpyN3s4/VGLMvfM8jSI/AAAAAAAApEw/TYL7jMIJzLE/s800/syoukyaku_noyaki.png

ひでェーッ
……こっちのやつも即死だな

だんなァ!馬車の中
女は死んでるけど赤んぼうが生きてるよッ
子供をかばったんだねこの人…
http://1.bp.blogspot.com/-KPvXcvB5OZE/VYJrasbRLAI/AAAAAAAAucw/zrvrVQHdRRM/s800/akachan_nango.png


赤んぼ!?
そんなのほっときやがれーッ
グイグイ
ズボォ
http://1.bp.blogspot.com/-zE-HbO7CdEI/UaVVSsu96tI/AAAAAAAAUD4/eentZA6WZfg/s800/yubiwa_ruby.png

な……何すんのさ?

決まってんだろ!マヌケーーッ
カネ目の物をいただくッ!
ある人間の不幸ってのはある人間を幸福にする
ウワッハハハハーーッ

そ……それもそうね!
あんた賢いわぁ!

ついてるゥ!
ザックリ持ってやがったぜェ!
http://2.bp.blogspot.com/-xyUcjya7HR8/U82zM5Ox0xI/AAAAAAAAjMk/wsjK8A3sV0g/s800/family_syunyu.png


なんだこれは?
き……気味の悪い仮面だ
こ…こいつはいらねェな!
http://1.bp.blogspot.com/-sXCRxDscQEc/VahRquDP2gI/AAAAAAAAvuw/KP_kKl5Dwl0/s800/noumen.png

おい……
こいつの口を開けるの手伝え!
前歯をひっこ抜こう!
歯医者に持って行くと差し歯用に高く売れんだ
http://3.bp.blogspot.com/-dz2j7rkyIGg/Vf-ek-eJvwI/AAAAAAAAyQw/jyoTFDXf0OQ/s800/teeth_sashiba.png

あ……あんた

どうせ歯を買えるのは貴族だしこいつも貴族だ!何が悪いんだ!

ガッギィ
http://1.bp.blogspot.com/-oDxTrasqNhQ/UZ2VKe52yGI/AAAAAAAATwQ/NyhsRFYkKmA/s800/roujinparty_super_45.png


おげェーーッ!?
http://1.bp.blogspot.com/-pYeNd5OykjQ/UxbL21RsJXI/AAAAAAAAeF8/zWVxohhkWq0/s800/unhappy_man6.png


き…………
…君………
http://3.bp.blogspot.com/-uKYWhvudYnA/VZ-TlKTnDxI/AAAAAAAAvR8/qytZgmLgHlU/s800/ojiisan04_cry.png

どヒェエエエ~~っ
こ……こいつ生きてるゥ!

き……君が
介抱してくれたのかありがとう

妻!……妻は
妻と息子は…どうした?
ふたりは……無事か?

くたば……
……いやご婦人と御者はすでに亡くなっておりました
で……でも赤ちゃんは無事です

こいつおれを命の恩人と思っているようだぞ
http://2.bp.blogspot.com/-8AROLi2gvas/U8XlXylongI/AAAAAAAAi-A/2wRauiNe8rM/s800/usotsuki.png


妻のかわりにわたしが死ねばよかったのに
……でも息子は無事……
これも運命か
http://3.bp.blogspot.com/-uKYWhvudYnA/VZ-TlKTnDxI/AAAAAAAAvR8/qytZgmLgHlU/s800/ojiisan04_cry.png

礼をさしあげようと思ったが
あなたが来る前に誰かに財布や指輪を盗られたらしい……

ドキン
http://2.bp.blogspot.com/-vSBqAZQoj-Q/UzoZ_Y5FnFI/AAAAAAAAexU/ij3IWeTjd4Y/s800/kinchou_man.png


わたしの名はジョースター
命を救ってくれた礼をしたい
また気を失う前にあなたの名を聞かせてほしい
このジョースター決して恩を忘れはしまい
http://4.bp.blogspot.com/-q8sXd4zTHzY/UvTd8T7X8OI/AAAAAAAAdg4/C36owPwwgQ0/s800/keizai_fuyuusou.png


このバカめ!……ケケケ!
名のって損はなかろう!

名のるほどの者じゃあありやせんがブランドーといいやす


あの後ー
さらにジョースター卿からもらった多額の礼金で酒場を始めたが
ツキに見放され女房が死に店はつぶれ
病気になってこのざまだ--チクショウ!
ディオッ!
おれが死んだらジョースター家に行けッ
お前は頭がいいっ!!
誰にも負けねぇ一番の金持ちになれよッ
http://3.bp.blogspot.com/-saonpkzjcbw/UxbL0dacztI/AAAAAAAAeFE/kPscjWgPwQQ/s800/unhappy_man1.png

ビュウウウオオオオ
http://1.bp.blogspot.com/-gl7W8l_2vdk/VMIvIFksqoI/AAAAAAAAq4E/MjKF81NHOgA/s800/ohaka_seiyou.png


醜くってズル賢くって
母に苦労をかけて死なせ最低の父親だったぜ!
一番の金持ちになれだと?
ああ!なってやるとも!
おまえの「遺産」受けとるぜ!
ひとりでも生きられるが利用できるものはなんでも利用してやる!
だからこのジョースターとかいう貴族を利用してだれにも負けない男になるッ!

くずめッ
http://4.bp.blogspot.com/--cbdje5OBQ0/VhHgJVf3GCI/AAAAAAAAy3A/pHmbH65zx7w/s800/manner_tsuba.png

http://1.bp.blogspot.com/-gl7W8l_2vdk/VMIvIFksqoI/AAAAAAAAq4E/MjKF81NHOgA/s800/ohaka_seiyou.png



19世紀!
それは産業と貿易の発展が人びとの思想と生活を変えた時代だッ!
http://4.bp.blogspot.com/-fhZ8FDL0BmM/UU--3WYrKkI/AAAAAAAAO_A/AqIyaVTzkqo/s1600/norimono_kikansya.png

依然!食糧不足や貧富の差が激しいにもかかわらず
大人も子供も「自分もいつか金持ちと同じようなくらしができるッ」
このような幻想をいだいていたッ!
http://2.bp.blogspot.com/-UtyHZTr8itg/VYJru5mxDMI/AAAAAAAAukE/6iB071EEzdA/s800/party_formal_rissyoku.png

それは嵐のようなすさまじい渇きだったッ!

バッ
http://1.bp.blogspot.com/-xiy8xTlQPGI/U6Qo0QBu2bI/AAAAAAAAhjc/ltYQ_cZq9Kg/s800/omocha_ningyou.png

イエー!
かえしてッ!かえしてッ!
手がとれるゥ!!

おいエリナ!この人形買ってもらったのか!
おまえの親父ヤブ医者のくせにもうけてっからなッ!
http://1.bp.blogspot.com/-HCV3Twow1Fk/VMItZ9o1gJI/AAAAAAAAqtQ/wW-VHv-CKkE/s800/boys_kenka_omocha.png

よし!人形の服をぬがせてやるぜッ!
あそこが本物と同じかどうか見てやるッ!
http://2.bp.blogspot.com/-JIZGNO9fCqo/U8XlOStzugI/AAAAAAAAi64/Rko35d_lSd0/s800/kai_awabi.png

シクシク
http://1.bp.blogspot.com/-ut65pPjrzGs/U2ssF0-c1AI/AAAAAAAAf-8/V2CEAzZUnMQ/s800/hankachi_naku.png


わーっエリナエリナ!
泣き虫エリナッ

やめろォ!
人形をかえしてやるんだッ!
http://4.bp.blogspot.com/-at_18dgXa5s/VIhOk9oN8eI/AAAAAAAApeY/GkiJOqtN1Fk/s800/1_26.png

なんだ!?おまえ!
エリナの知り合いかッ!?

知らない子だがぼくには戦う理由があるッ

ドッカァァ~ン

こ この野郎ッ
女の子の前だからってカッコつけるヤツ
おれ こーゆーヤツは大嫌いだッ!
やっつけてやるッ
http://3.bp.blogspot.com/-Gv4iMpQJPcM/UxbLdHc1tXI/AAAAAAAAd-g/f1RPu8ZgE6I/s800/kodomo_kenka.png

ガシィィィン
ギャッ
http://3.bp.blogspot.com/-WrUFsJKa8tw/VcMlc9dhcwI/AAAAAAAAwcM/z_y_wCFeMcQ/s800/pose_zasetsu.png

おやァ なんでェ~
こいつてんで弱いぞッ!

うう~

ギャハハハハハ
これ以上みじめなことがあろーか!
助けに入って逆にやられてやがる
おいッ こいつ誰か知ってるか?

知らないね!
まさかジョースター家のひとり息子じゃあねえだろーな!!

おれは金持ちが嫌いだッ!
恨みはねーがとにかく嫌いだッ!
もしあそこのジョースター家のヤツだったらもっとこっぴどくブチのめしたるッ!

http://3.bp.blogspot.com/-SHx-5ozaCSE/VD3SCt0eH6I/AAAAAAAAoNE/oTR79TraUl8/s800/handkerchief_boy.png

あっ!!

こいつッ
やっぱりジョースター家のひとり息子だッ!

この野郎!お高くとまるんじゃあねェーぜ!
思い知れ!

http://4.bp.blogspot.com/-A_udd1pVVxY/UylATbnJUMI/AAAAAAAAeRo/uFTOMnwLhLk/s800/bakuhatsu.png

ふん!金持ちはてめーの敷地内だけで遊びやがれ!

行こーぜ!

ハア ハア
http://3.bp.blogspot.com/-42EB7CfEAm8/VD3Sg3Xbg6I/AAAAAAAAoVo/JMYBdWuTxTE/s800/tsukare_boy.png

いいからほっといて!

向こうへ行けよッ
ぼくは君に感謝されたくってあいつらに向かっていったんじゃあないぞッ!
http://1.bp.blogspot.com/-bTvFHE2RP6s/VPQTzDH-v4I/AAAAAAAAsCM/zgZNVx1c5sk/s800/apron_woman2-1idea.png

ぼくは本当の紳士をめざしているからだ!
君が女の子で困っていたからだ!
相手が大きいヤツだからって負けるとわかってるからって
紳士は勇気を持って戦わなくてはならない時があるからだぞッ!!
でもいつか勝てるようになってやる!
http://4.bp.blogspot.com/-at_18dgXa5s/VIhOk9oN8eI/AAAAAAAApeY/GkiJOqtN1Fk/s800/1_26.png


ジョナサン・ジョースター

でもなんだってこのハンカチをポケットから出したの?

名前をわざわざ見せなければあんなに殴られなかったのに

きっと--
これも彼の言う本当の「紳士」になるために必要なことなのね……
http://2.bp.blogspot.com/-qLDBpHAIxvc/VPQT0pD_jnI/AAAAAAAAsCk/X76IdJgoBGs/s800/apron_woman2-4think.png

ガガッ

バン
http://4.bp.blogspot.com/-kbKGNXLO4WY/VfS5-6gdV8I/AAAAAAAAxMU/sJAi9Gdp6ro/s800/basya.png

ドザア!
http://1.bp.blogspot.com/-CVRGLMGIB-4/UgsrwoLlZuI/AAAAAAAAXKI/XWwwkVoiXFo/s800/travel_suitcase.png

シャン!
http://4.bp.blogspot.com/-WxpuLNvBy-Q/U6llSS4DyiI/AAAAAAAAhuY/jkuze8oG22U/s800/jump_boy.png

スタッ
http://1.bp.blogspot.com/-Qlvf1tTs0lQ/VZt5G9qVelI/AAAAAAAAuzg/i1y0VViLKsc/s800/jiko_jump_yuka.png

グゥゥン
バァーン
http://4.bp.blogspot.com/-dplUuTaontc/Vkb-9f6lvjI/AAAAAAAA0Yk/6NBmovENCCs/s800/achilles_man.png

誰だろう……?
http://1.bp.blogspot.com/-HMFExFItLgM/VZ-QazWvIKI/AAAAAAAAvLY/ABYQKsh7gxg/s800/man_question.png

ハッ!
そうだ…ディオ!
この子の名はディオ・ブランドーだ!
http://1.bp.blogspot.com/-9PoEbu1VJqs/VZ-PTsjrlHI/AAAAAAAAvD4/On6tsR_sD_I/s800/man_idea.png

父さんの命の恩人が亡くなられたので
父さんがその息子をひきとり
ジョースター家で生活することになった…
ぼくと同い年の男の子だ!

君はディオ・ブランドーだね?
そういう君はジョナサン・ジョースター
http://4.bp.blogspot.com/-_Lx0MQ57Irw/VXOUJD0DNJI/AAAAAAAAuHM/_es1QFhQBuY/s800/businessman_aisatsu.png


みんなジョジョって呼んでるよ…
これからよろしく

ワンワンワン
ハッハッハッハッハッ
http://1.bp.blogspot.com/-I9kzaYgztqc/VOsJpnW6YQI/AAAAAAAArrs/_1utqDdX-zw/s800/dog1_smile.png


ダニーーッ

紹介するよダニーってんだ!
ぼくの愛犬でね
利口な猟犬なんだ
心配ないよ!
決して人は噛まないから
すぐ仲よしになれるさッ
http://1.bp.blogspot.com/-Rr_coDquGtM/UzoaD8xfsvI/AAAAAAAAeyY/JysIA0x7ceI/s800/pet_dog_boy.png


ふん!
http://3.bp.blogspot.com/-saonpkzjcbw/UxbL0dacztI/AAAAAAAAeFE/kPscjWgPwQQ/s800/unhappy_man1.png
ボギャアア
http://1.bp.blogspot.com/-L118A_4TRMg/VRUSWhxaaNI/AAAAAAAAsqM/5ooeCDDHgLQ/s800/thai_kickboxing.png

なっ
ドサーーッ
ダニーーッ
http://4.bp.blogspot.com/-WNowxI0ESwI/VCkbPZnsGyI/AAAAAAAAnDo/d8QMnNq2rNw/s800/pet_byouki_dog.png

なっ!
何をするだァーーーッ
ゆるさんッ!
http://3.bp.blogspot.com/--CoKuZF3Znc/VPQTtSqMf1I/AAAAAAAAsAw/37SkDQmVrPc/s800/apron_man1-2angry.png

こいつがジョースター家の跡継ぎ
ひとり息子のジョジョか!
こいつを精神的にとことん追いつめ
ゆくゆくはかわりにこのディオがジョースター家の財産をのっとってやる!
http://2.bp.blogspot.com/-k0Z_SHye1B8/VPLqqIcwhzI/AAAAAAAAr68/OZZDYziXRNo/s800/eieiou_man.png

ピクピク
http://3.bp.blogspot.com/-iTb1N_ZG_Jk/VYJcVnXsTrI/AAAAAAAAuW4/PkJZiHRlKLE/s800/inu_ashi_yowaru.png


おわり

Vimで任意精度整数演算ができるライブラリを作った

github.com

vital.vimに「Data.BigNum」という名称でmergeされました。
vital.vimを入れればお使いいただけます。

なぜVim

Vim scriptでProject Eulerを解こうと思ったのがきっかけでした。
Project Eulerを順に解いていくと、3問目に1つの壁にぶち当たります。

The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?


13195 の素因数は 5、7、13、29 である。

600851475143 の素因数のうち最大のものを求めよ。

https://projecteuler.net/problem=3

問題に出てくる数字が32bit integerの範囲(-2147483648 ~ +2147483647)を超えています。
最近登場した言語であれば標準で多倍長整数が扱えますし、そうでない言語でもそれを実現するライブラリが既にあります。
しかしVimには存在していないらしく、これではProject Eulerを解き進められない!

私は新しい言語の理解をしようとするときはProject Eulerを解きます。言語で最初に書くプログラムはHello, WorldとかFizzBuzzとか言われますが、その次にProject Eulerを解くことで基本的な数値演算、リスト/辞書の扱い方、map/filterの使い方、外部ファイルの読み込み、ライブラリの読み込み方法・・・などを段階的に学習できます。よい題材だと思います。

私はVim Scriptの理解を深めるためにVim ScriptでProject Eulerを解き進めたかったのですが、3問目で止まってしまうのは悔しい。

とにかく遅くてもいいから四則演算ができるものを作りたい、ということでググりつつ自分で野良実装をしました。
作成進捗を逐次Lingrで書いていたところ、「汎用的なのでvital化しましょう」ということでPR, 無事mergeされました。

使い方

Project Euler 3のコード例が以下です。

Project Euler 3

現状は四則演算のためのadd, sub, mul, div, 比較のためのcompare, あとは文字列とBigNumデータ間の変換をする関数などがあるだけの、ごくごくシンプルなものです。
計算時間は悲しいぐらい遅いですが、フィボナッチ数列の10000番目などもちゃんと計算することができます。

今後

基数変換、ビットシフト、高速化、BigRationalなどいろいろやりたいことがあるので、Project Eulerやりつつ機能追加できればいいなあと思っています。

インフラエンジニアがプレイするべきゲーム「Papers, Please」

プレイしたゲームがあまりにも自分の仕事内容を思い起こさせるものだったのでご紹介します。
(実はゲームをプレイしてこういう記事を書こうかな、と思ってから1年位経ってる)


今回ご紹介するのは「Papers, Please」というゲームで、Steamで980円で購入することができます。(ただし年に数回あるセールのときは80%OFFとかで買えるので、そっちを狙うのがオススメ)

2015/02/03 追記

iPadでもプレイできるらしい。


Steamにあるゲーム紹介の文章を以下に貼ります。

おめでとう。
10月度勤労抽選により貴方を入国審査官に命ずる。
即座配属のため、至急グレスティン国境検問所の入国管理省に赴くように。
貴方とその家族には、東グレスティンの8等級の住居が割り当てられる。
アルストツカに栄光あれ。


ここは、共産主義国アルストツカ。隣国コレチアとの6年間の戦争がついに終わり、国境の町グレスティンの半分を正当に取り戻し、晴れて国交を再開することに。あなたの仕事は入国審査官としてアルストツカへの入国者を審査することです。仕事を探している移民や観光客の中に潜む密輸業者、スパイ、テロリストたちを見極める必要があります。入国希望者のパスポートをはじめとする数々の書類をもとに、入国を認めるか、拒否するかを判断しなければなりません。

説明文にある通り、このゲームでは国境に来る人が提出してくる書類を見て、全てが正しいかどうかを判定するわけです。
これをIT業界ではフローチャートと言います。
端的に言ってしまえば、人間フローチャートをするゲームなのです。


以下では、ゲームの中でどのようなことをやらされるのかを見て行きたいと思います。

ゲームの流れ

ゲームは1日単位で区切られており、日の始まりにルールが通達されます。
1日のうちに何人の人間をチェックしたかで給料が決まります(歩合制)。ただし、書類に不備がある人の入国を認めてしまう、また逆に不備がないのに拒否してしまった場合は当然ペナルティとなります。
この基本ルールに加えて、入国希望者とのいろいろなやりとりによるストーリーがあってそれが面白いのですが、そういう要素については全部割愛。

1日目

[規則]

  • 入国者はパスポートが必須
  • 入国はアルストツカ国民のみ

1日目はチュートリアルですから、提出されたパスポートがアルストツカのものであるかどうかだけを確認すればOKです。

2日目

[規則]

  • 入国者はパスポートが必須
  • 全ての書類は期限内でなければならない


1日目の「アルストツカ国民のみ」という制限が外れ、正規パスポートを所持していれば外国民でも通れるようになりました。
さて、パスポートには顔写真、氏名、生年月日、性別、パスポート発行地域、有効期限、パスポート番号、と情報満載です。これらを分解すると以下の様な確認事項があります。

[確認項目]

  • 顔写真が本人か
  • 性別が正しいか
  • パスポート発行地域が正しいか
  • 有効期限内であるか

3日目

[規則]

  • 入国者はパスポートが必須
  • 全ての書類は期限内でなければならない
  • 外国人は入国券が必須


2日目のルールに「入国券」が加わりました。
入国券には有効期日のみが書いてあります。このぐらいのルール追加ならまだまだ余裕ですね。

[確認項目]

  • 顔写真が本人か
  • 性別が正しいか
  • パスポート発行地域が正しいか
  • 有効期限内であるか
  • 外国人(アルストツカ人以外)は入国券を持っているか
  • 入国券の有効日が正しいか

4日目

[規則]

  • 入国者はパスポートが必須
  • 全ての書類は期限内でなければならない
  • アルストツカ国民はIDカード必携
  • 外国人は入国許可証が必須



さて、ここで登場する「IDカード」と「入国許可証」が確認項目を一気に増やすことになります。
特にIDカードに記載されている身長/体重はよく見逃してしまう危険項目です。(身長は人物後ろの高さの線、体重は画面下部に表示されている)
また、入国希望者に対する質問との照合も必要になります。

[確認項目]

  • 共通
    • パスポートの顔写真が本人か
    • パスポートの性別が正しいか
    • パスポート発行地域が正しいか
    • パスポートが有効期限内であるか
  • アルストツカ人
    • IDカードに記載された地区がアルストツカの行政区画として正しいか
    • IDカードの顔写真が本人か
    • パスポートとIDカードに記載された生年月日が一致しているか
    • IDカードの身長が正しいか
    • IDカードの体重が正しいか
  • 外国人
    • 入国許可証の印が正しいか
    • パスポートと入国許可証に記載された氏名が一致しているか
    • パスポートと入国許可証に記載されたパスポート番号が一致しているか
    • 入国許可証に記載された入国目的と発言した入国目的が一致しているか
    • 入国許可証に記載された滞在期間と発言した滞在期間が一致しているか
    • 入国許可証の入国期限が期限内か

と、このように毎日ルールがどんどん増えていきます。
アルストツカは他国と戦争状態にあり情勢が不安定ですから、日々刻々とやることが変わってしまうわけです。
また、例えばテロが起こったりするとそのような人物を入国させてはいけないということになりますから、書類とか確認項目が山盛りになっていってしまいます。

それでは一気に飛んで、15日目の確認項目を見てみましょう。

15日目

[規則]

  • 入国者はパスポートが必須
  • 全ての書類は期限内でなければならない
  • アルストツカ国民はIDカード必携
  • 外国人は入国許可証が必須
  • 労働者は労働許可証が必須
  • 武器、密輸品を持ち込ませるな
  • 外交官は特権証明が必須
  • 外国人は身分証明補足書が必須




書類が目に見えて増えているのがお分かりいただけると思います。
規則に加えて指名手配犯の顔写真リストが渡されており、それも確認しなければいけません。
さらに、不正を見つけたらそれを指摘してつっこみを入れる必要があるのですが、つっこみを入れると入国希望者の指紋を採取します。その際、指紋データとの照合も必要になります。
では、分解してみましょう。

[確認項目]

  • 共通
    • パスポートの顔写真が本人か
    • パスポートの性別が正しいか
    • パスポート発行地域が正しいか
    • パスポートが有効期限内であるか
    • 指名手配犯の顔写真リストに含まれていないか
  • アルストツカ人
    • IDカードに記載された地区がアルストツカの行政区画として正しいか
    • IDカードの顔写真が本人か
    • パスポートとIDカードに記載された生年月日が一致しているか
    • IDカードの身長が正しいか
    • IDカードの体重が正しいか
  • 外国人
    • 入国許可証の印が正しいか
    • パスポートと入国許可証に記載された氏名が一致しているか
    • パスポートと入国許可証に記載されたパスポート番号が一致しているか
    • 入国許可証に記載された入国目的と発言した入国目的が一致しているか
    • 入国許可証に記載された滞在期間と発言した滞在期間が一致しているか
    • 入国許可証の入国期限が期限内か
    • 身分証明補足書の身長が正しいか
    • 身分証明補足書の体重が正しいか
    • 身分証明補足書の特徴が矛盾していないか (例えば「視力良好」なのにメガネをしている、など)
    • 身分証明補足書の期日が期限内か
  • 外交目的の入国の場合
    • 外交特権証明書の印が正しいか
    • パスポートと外交特権証明書に記載された氏名が一致しているか
    • パスポートと外交特権証明書に記載されたパスポート番号が一致しているか
    • 外交特権証明書に記載された入国許可リストにアルストツカが含まれているか
  • 指紋を採取した場合
    • 入管省ID記録の氏名(もしくは別名)とパスポートの氏名が一致しているか
    • 入管省ID記録の指紋と採取した指紋が一致しているか

これでもまだ書き出しきれてないはずです。やばさが伝わるでしょうか。
この段階に来ると、日が変わって新たな条件が与えられた時点で「アッ、もう無理」と悟ってしまいます。


(既にだいぶネタバレを書いてしまっていますが、)ゲームの紹介はこのぐらいにしておきます。

なぜこのゲームをインフラエンジニアに薦めるのか?

このゲームは「人は必ず間違いを犯す」ということを実にわかりやすく痛感させてくれるからです。
システムの構築、設定の変更、障害時の対処・・・運用で起こる様々なイベント、あなたの会社では自動化されているでしょうか。それともWordやExcelWikiなどで管理された手順書を元に人が行なっているでしょうか。
全てが自動化されており、ルーチンワークなどないという環境にある方はおめでとうございます。しかしそうでない環境で働いている人がまだまだ大半だと思います。
できればエンジニアの人達には常に「これを手作業でやるのは無駄だから自動化を検討しよう」という意識でいて欲しいのですが、中にはフローチャート通りに間違いなくこなすことに非常に長けている人というのがいます。
もしフローチャートに沿った手順をこなすのを得意としていて「自分は間違ったことがない、だから大丈夫」だと思っているエンジニアがいたら、一刻も早くこのゲームをプレイしてください。そして早くミスをしてください。
別にフローチャートが得意でなくても、運用事故を起こしたことがない人にはおすすめします。他人からいくら言われても、やはり自分で実際に体感しなければわかりませんからね。


ゲーム内でどんどん事故を起こして、仕事では事故を起こさない仕組みづくりを心がけたいものです。

VimConf 2014への参加とコミュニティの関係性について思ったこと

VimConf 2014に参加してきました。

今回の会場はmixiさん。

最後の方はピザを取りにいくお手伝いをしていたために全ての発表を聞くことはできませんでしたが、ほとんどについては拝聴して楽しませて頂きました。以下、特に気になった発表について書きます。

気になった発表と感想

Identity of the Vim / @kaoriya

VimVimたらしめているものは一体なんなのか、アイデンティティについてのお話でした。今回の資料ははVimというものの立ち位置を説明する際に立ち返ることになるものになりそうです。
人から「なんでVimなの?」「なんで○○使わないの?」と言われた時に、自分の中で確固とした理由・意見を持つことは、今後Vimに本当にcommitしていく価値が本当にあるのかどうかを見つめるという意味で非常に重要なことです。

PM2 / @ujm

ProcessManager及びPM2ライブラリの紹介でした。
でもCiv5の話が強烈すぎてPM2の方をあまり覚えてない。終始笑いまくっていた気がする。

auto closing parenthesis / @c0hama

カッコを自動で閉じようという話。
私はこの発表をきいて、「ああ、俺自動補完あまり好きじゃないんだなあ」と思いました。
(|)のときに)を入力すると()|になるのにいつもイライラしてしまうんですよね。カッコならまだしも、シングルクォートとダブルクォートが混在するようなコードを書くときは本当につらいので…
そういうことを見つめ直せたのでよかったです。

かなりすごい発表(かなり) / @supermomonga

この唯一無二の芸風である。

/-improved / @haya14busa

gifによる操作説明が超わかりやすい。(ああいうのどうやって作るのかな)
incsearch.vimは、今回の発表で一番気になったプラグインでした。入れよう。


Vimコミュニティに見たスモールワールド性

私は今回はじめてVimConf(およびVimConfに連なるこれまでの勉強会)に参加しましたが、TwitterLingrを見ると参加者の全体的な満足度がとても高いように感じました。
「過去最高だった」「感極まってきた」「便利」との感想が飛び交っています。(Lingrに生息している一部の人は日常的に発している言葉ですが。)
懇親会も、私が見た限りではどのテーブルもかなり活発に会話が行われているように見受けられました。50人超の勉強会でこういう状態は、結構すごいことなのではないでしょうか。

というのも、過去に自分が参加した同規模の勉強会を振り返ると、発表を聞いてそのまま誰とも話さず解散となったり、懇親会で周りも自分と同じくらいの初心者ばかりで、時たま気まずい時間が流れてしまう、などを経験したことがあったからです。

Vimコミュニティに長年関わっているujihisa(@ujm)さんは、今回の感想記事で以下のようなことを書いています。

日本のVimコミュニティは今年をもって別の段階に進化したといえるでしょう。集中と継続。大きく分断されることなく、かつ、独裁ではない。持続可能な有機的コミュニティができています。この事実は、目に見えるものではないものの、ものすごく偉大なことではないでしょうか。

https://gist.github.com/ujihisa/1e8925470d01794a002c

私はこれを読んで、大学時代に少し勉強したスモールワールドのことを思い出しました。

スモールワールド

スモールワールドは「友達の友達の友達の…」と辿っていくと6〜7ステップで全世界の人に辿り着ける、という「7つの隔たり」の話に象徴されるような、現実の人間関係をモデル化した複雑ネットワークという分野の言葉です。

詳しくは各自ググっていただきたいと思いますが、ざっくり言うと複雑ネットワークではグラフ理論のノードを人間、エッジを知りあい関係で表します。

以下に、かなり極端な例を出してみます。


例えば上のようなグラフの場合、中心の3人にエッジが集中しています。これは勉強会でいうなら、講演会に近いようなタイプが連想されます。真ん中の3人は発表者であったり、主催者であったりといった存在です。
このような構造の場合、エッジが集中している人間にかなり依存した状態になります。ここで、例えば一番エッジをたくさん持っているノードを消してみましょう。


すると、左側の多くのノードが非連結な状態となってしまいました。特定の人間に関係が集中したグループの場合、中心人物が関係できなくなると、グループとして存続することが危うい状態となります。
例えば勉強会を立ち上げたけれど、発表者の募集、会場準備、次回の計画をたてる…などなど、会を催す上での諸々に中心人物がコミットすることができなくなり、結果数回で消滅の憂き目を見る…このような勉強会は数多くあります。


では次に、同じノード数、エッジ数のもう1つのグラフを見てみましょう。

エッジを多く持つノードはありますが、最初のグラフほど極端な形ではありません。
このグラフについても、ノードを1つ消してみましょう。


やはり独立するノードが発生してしまいましたが、最初のグラフに比べればだいぶましな状態です。
このような関係性であれば、参加者に様々なタスクを任せたり、1人が急遽参加できなくなった場合でもコミュニティ自体は存続し続けられる可能性が高いです。


コミュニティが成長する際、最初のグラフからだんだんと2つ目のグラフに移行していくことが多いと思います。*1
上記の2種類のグラフは、構造の説明の為に同じノード数、エッジ数のものを例として出しましたが、実際はエッジ数は基本的に増えていきますから、例よりももっと網の目のような構造に至るでしょう。



先ほど書いたような、「ノードを1つ消したときにグラフ全体の関係性がどのように変化するか」は、グラフの平均距離を計算することで数値化することができます。
詳しくはこの辺を読んでみてください。


さて、ここでようやくVimConfの話に戻ります。

コミュニティと貢献

ujihisaさんの言う「持続可能な有機的コミュニティ」という言葉を、私は前述した複雑ネットワークの話として捉えました。
このような構造を作り上げるためには、黎明期の中心人物が継続して貢献することが必要になるでしょう。またイベントのみでなく、TwitterLingrを通した日常的な関わり合いであったり、Vim advent calendarなどに代表される精力的な記事の公開が大きく寄与しているのではないでしょうか。結果、明確な中心的人物というものがなく、その人がいない状態でもコミュニティとしては正常にイベントを作ることができる。また、このような構造は新たなノードを取り込むという意味でも有利なように思います。


私は、今回のVimConfの参加者の中でもVimの使い方が極めてライトです。Vimは日常的に使ってはいるけれども、vimrcを編集する頻度も少ないし、プラグインを導入することもそんなにありません。Vim scriptも全然書けません。それでもLingrに毎日いたら仲良くしてくれる方がたくさんいて、それだけで既にいろんな恩恵を受けていると感じます。
もっと即物的には、数ヶ月前に出版されたVim script本をthincaさんから頂いたので、そのレビュー記事とか、プラグインを作るとか…とにかくいろいろと、contributionしていきたいなあということは考えています。

まとめ


*1:別の移行パターンとして、中心人物同士のみで強固なクラスタが構成され、他のノードがそれぞれ孤立した状態になる、という状態もあるかと思います。すなわち新参の拒絶です。この場合はコミュニティのノード数がなかなか増えないという問題に陥ることが考えられます。