職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

Cocoa勉強会関西#54でCoreDataについて話してきました

第54回 Cocoa勉強会関西 で、CoreDataについて話をしてきました。

3行要約

  • CoreDataのベースはRDBMS。データベース界隈の知識をCoreDataでの開発に活かそう!
  • Atomicity(原子性)を気にしよう!
  • データのバックアップは超重要

どんな話?

デモで使ったサンプルアプリのソースコードは、こちら(Github)
ViewController.mの途中にある「#define WITHOUT_ATOMICITY」の行をコメントアウトしたりしなかったりして、挙動の変化をお楽しみ下さい。

なぜ、この話をしようと思ったのか

2013年の前半頃だったと思いますが、AustraliaのAppStoreでランキング上位に居たアプリの中で、Monopoly(モノポリー)というゲームがありました。ご存知の方も多いかと思いますが、Monopolyは米国生まれの双六ゲームです。これのiOS版が流行っていた訳です。
MONOPOLY on the App Store on iTunes
※なぜか日本のストアでは見当たりません。権利関係でしょうか??

このゲームは、2名から最大8名(iOSアプリでは最大4名)のプレイヤーが順番にサイコロを降り、止まったマスに書かれた指示に従ったり、土地を購入したり、他人が所有している土地に止まれば、その土地にある建物の豪華さに応じてお金を支払うというゲームで、債務超過に陥るとゲームオーバーです。
僕がiOS版で遊んでいると、サイコロを振って、自分の駒が「所得税を支払う」マスに止まるはずだったのですが、所得税を支払う直前でアプリがクラッシュすることがありました。アプリを立ち上げ直すと、自分の駒は「所得税を支払う」マスにあったのですが、所持金は減っていませんでした。

これっておかしいですよね。アプリをkillすることで、嫌なサイコロの目が出てもそれを回避するチート(イカサマ)が可能になってしまいます。

そう、「所得税を支払うマスに止まる」ことと「所得税を実際に支払う」ことの2つの事実には原子性を持たせなければならないのです。「所得税を支払うマスに止まる」事実が発生したのならば、必ず「所得税を実際に支払う」事実も発生させ、その情報(またはその事実の結果)が永続的に保存されなければならないのです。

このようにランキングの上位に君臨するようなアプリでさえこのような実装をしているようであれば、世の中のアプリの多くも似たような問題を抱えているのかもしれません。Cocoa界隈の皆さんに向けてトランザクション処理の原子性についてお話するのは価値があることだと考え、今回の話を持ち出そうと思うに至りました。


次に発表するときには、Isolation(排他制御/独立性)に主眼を置いた話をしたいと思います。

発表時のトラブル

僕の発表の直前は休憩時間だったので、壇上でゆったりと準備をしていました。
ところが、Mac(MacBookPro early 2010)をプロジェクタに接続すると、動作が少しおかしくなりました。

  1. 画面全体は一瞬青くなった(ここまでは正常動作)
  2. 画面が復活しても、プロジェクタには信号が行ってないようだった
  3. システム環境設定を開いて「ディスプレイ」をクリックすると、レインボーカーソルが出現した
  4. システム環境設定を強制終了して再度システム環境設定を開いても同じ
  5. Dockが死んだ(マウスポインタを近付けても拡大されなくなった、FinderのアイコンがDockから飛び出したまま動かなくなっている)
  6. コマンド+Tabのショートカット(WindowsでのAlt-Tabみたいな機能)が利かなくなった

という状態に陥ったので、再起動をかけました。しかし、画面が灰色になったまま進む気配がありません。発表を開始する時刻が1〜2分後に迫っていたので、自分のMacで発表することを諦め、直前に発表していた @yashigani さんのMBAをお借りして発表することにしました。ありがとうございました。

発表資料(Keynoteファイルのzip)は、自分のWebサーバの非公開領域にバックアップを置いていました。ssh経由でこれを公開領域に移動させてブラウザからダウンロードすることですぐに復活することができました。
こういった事態に備えるためのバックアップという意味ではDropboxやEvernoteなどのサービスを利用するのが一般的かと思いますが、こういう焦る状況において、借り物のPCですぐにデータを取り出すのは、やっぱり自分のサーバの方が楽かもな、と思いました。もちろん、DropboxやEvernoteの方が、バックアップを取るという動作の面で圧倒的に優れていますが。

デモで使ったアプリのソースコードは、Github上に置いていたので、こちらもすぐに復活することができました。


バックアップあれば憂いなし!

BDD

Beer Driven Development
f:id:t_motooka:20140215182342j:plain
BDDの話をお伺いしたからには、実践あるのみ!!

最後に

話を聞いて下さった皆さん、他に発表されていた皆さん、会場をご提供下さった皆さん、そしてBDDを共にした皆さん、どうもありがとうございました!

関連リンク集

他に発表された皆さんのブログ記事や発表資料など(の一部)

参考になる本たち

iOS Core Data徹底入門

iOS Core Data徹底入門

これは2013年11月に出版されたばかりの新しい本です。僕も買いました。
Objective-Cを一通り触ってきたけどCoreDataはまだ触ったことない、そしてその必要性を感じてきているという方向けにオススメの本です。

トランザクション処理 上

トランザクション処理 上

トランザクション処理 下

トランザクション処理 下

この2冊の本は、リレーショナルデータベースの生みの親の一人、Jim Gray氏の本の、日本語訳になります。原著は1993年に出版されたものです。少し古いですが、RDBの知識を深めるには必要な本でしょう。僕はまだ買っていませんが。。