GoogleWave Hackathon 京都に行ってきた

一昨日の26日、京都GTUG主催のGoogleWave Hackathonに行ってきた。京都リサーチパークさんのご厚意でパーク内の会議室を使わせていただけるという、とんでもなくありがたい企画*1。とりあえずなんとなくしかWaveを知らなかったので、強制勉強イベントとして参加。。。。のはずだったんだけど、いかにも僕クオリティな、準備不足というか能力不足というか、一言で言うとあたまわりー状態だったので、反省とか、あといろんな意味で勉強になったので感謝の気持ちも兼ねて。

Ideathon

ハッカソンの前の週、同会場で「何をやるか」を決めるIdeathonを行った。そのときから反省点だらけ。まず(勉強するのが目的にもかかわらず)最初のチーム分けで、いわゆる初心者チームに入ろうとしたこと(だってー)。ところが、皆さん奥ゆかしいというか、遠慮がちというか、予想通り?というか初心者チームに人が集中したので、スタート時から山下さん(GTUGマネージャー)のアドバイスで「是非、初心者チームではなく、どこかやりたいテーマのチームに入ってください」ということになり、<ここ最悪>人が少なそうな</ここ最悪>のと、まあやっぱりゲームおもしろそうだしー、という消極的な理由でGameチームに移ることにした。実は事前に別のアイディアを複数考えていた。それらはゲームとは全然違って、マインドマップの変形版(複数人でやるんだけど、しかし本来マインドマップは個人向け。そこで、それぞれ個人で一人向けのマインドマップを書いて、後からテーマ台に投げてみんなで共同マージするような「マージマップ」 or Twitterでやまもとさをんさん経由でもらったアイディアの「漢字一文字曼荼羅マインドマップ 」or 拡大縮小自由自在の共有の「紙」を用意してその中で拡大縮小コミュニケーションする「紙ニケーション」とか(ぉい、といわれそう)。
しかし、人少ないから・・・と思っていたんだけど、その後だらだらと二人ほど難民が、、、で結局4人になってしまった。
内容的に多人数での開発は難しいと考えていたGadget作品なので、この時点で隣のマルチメディアチームかどっかに移ればよかったんだけど、面倒くさがってそのまま居残ってしまった。
いくつか候補が挙がった。「みんなでやるテトリス」、「なんかボードゲーム」、僕はとりあえずよいゲームを考えつかなかったので、最初に考えていた「紙ニケーション」の説明を最初にして、、、という感じで紹介していった。で、結局参加メンバーの一人が以前に作ったFlashゲーム「メタリス」をGoogleWaveに移植する、という今考えると非常に消極的な何か、になってしまった。それも具体的ではなく、そのままでは形にできません状態。
メタリス自体はここ http://metarith.com/。四則演算+pow, modを使った数あわせゲーム。で、これをリアルタイムに多人数で対戦したり、協力プレイしたり、というアイディア。僕としては、やはりWaveならでは、でしかも*わかりやすい*ゲーム性をある程度確保したいなあ、とか思ったので、単純に数字を合わせるだけでなく、陣取りの概念を取り入れて、マス目上に数式を並べて成立すると線になり、その線で領域を囲むと囲碁のように自分の陣地になる。というのを提案してみたんだけれど、何故か皆さん全然乗り気でなくあきらめた。
その日はそのまま終了。特に全員でつるむとか無くて、帰りは学生さん一人と京都に飲みに行った(ちなみにその学生さんは残念ながら当日ドタキャン><)。ビルの地下にあるなかなかおいしい居酒屋見つけた。センマイとかおでんとかメッサうまかった。

事前検討

普通に考えてもドラッグ情報を全部waveサーバに投げてレイテンシを考慮しながら対戦やら協力やらって、かなり無理っぽい。何か別の方法で盛り上げるとか必要だろうなーとか考えながら一週間のろのろとかんがえる。タイミング悪く仕事の方もそこそこ時間をとられる仕事が多くなっていて+Cuzicさん主催忘年会とか、おうちの事情とかで、正直あまり時間が作れなかった。
結局前日に慌ててCanvasとかの勉強がてらいろいろ試してみたが、レイテンシが大きすぎる+WaveにSubmitDelta()した情報はすべてプレイバック情報として残るので、とてもじゃないけど非現実的。まあ予想通りだなあ、とか思いながら、代替案を考え始める。数式囲碁もそこそこおもしろいと思ったんだけどなあ。。。確かに難しいだろうか? とか考えて同じ発想から少しリダクションしてライフゲームのアイディアを作った。ついでなのでCreateElementでtableをこさえてライフゲームのゲーム版を生成するプログラムまでは書いて、寝た。

Hackathon当日

事前検討でドラッグを共有させるのはかなり難しいことが見えていたので、このままでは実現は困難。ドラッグ中の動作を見せることで得られる緊張感や協力プレイが使えない以上、ほかの部分でゲーム性を考えなくてはいけないが、さすがに5時間でそれは無茶。というわけで、事前に僕が考えておいた、対戦型ライフゲームに切り替えることした。提案してみると、おずおず、という感じで(できれば明確に「それ良い!やりてえ!つくりてえ!」とか「つまんねーよそれ!」とか言う元気な反応がほしかった)「まあそれで良いんじゃないですか?」のようなノリで承認されたりなどした。
これはかなりほかのチームに比べてビハインド状態。正直焦った。午前中にある程度動くものを用意できていて、午後は微調整、なスケジュールで行きたかったのに、午前中をほとんど方向転換の討論と、要件抽出と、仕事分け(なんか全部仕切ってしまった気が・・・悪いことしたかな)、などにとられてしまった。

対戦ライフゲーム

ゲームの基本は単純。普通のライフゲームと同じようにセルを配置。セルオートマトンとして一定の規則で増やしたり減らしたり、という部分も同じ。ただ多人数でやるところが違う。異プレイヤーのセルが入り交じっている場合、多数決でもっとも多い人がとる。という仕組みにした。同じ数なら対消滅する(これをしないというのもありだけど、そうすると勢力が拮抗する部分で常に膠着状態になってしまうので入れた)。また、ゲームは駒(セル)を置くフェーズと、実際に戦うフェーズに分けて、それを交互に実行する形態にした。
置くフェーズでおけるセルの数(ストック)は決まっていて、その分しかおけない。もちろん残しておけば繰り越し可能。
戦うフェーズで増減させて、次の置くフェーズでいくらかストックは補填される。また、戦うフェーズで増えて余ったセルは回収することでストックとしてとっておくこともできる。
最終スコアはボード上のセルの数。一番考えたのは、いつ新しいプレイヤーが混ざるかわからない環境なので、途中から参加しても問題が無いゲームにしたかった、というところ。明確に終わりがない、常に変化するゲームである、というふうにしたかった。その点ライフゲームはちょっとしたバランスの崩れで簡単にドラスティックな変化をするし、結果としてあっという間に後から来た人が逆転もあり得る。非常に都合が良い。
当初は、置くフェーズは全部サーバに投げて情報共有するが、戦うフェーズは通信せずに個々のクライアントでバラバラに実行して、それが終わったところでまた同期、という考えでいた。これでレスポンスもよく、サーバにもあまり負担をかけずにいける、とかうまうまーってバカ。
実際に作ってみると、全記録が残っているのが非常におもしろかったので、最終形では全部submitDelta()するような実装になる(予定)。

実装

何せほとんどJavaScriptを使ったことが無い。本来のwaveの知識も足りないし、メンバーもあまり組織化できなかったので、かなり苦労した。
メンバーの一人はsubversionをよく知らず、持ってきたマシンが非力で遅く、その上(Windows用クライアント入れろとゆうてるのにー)eclipsesvnつかうとか聞かないので、まず困った。結局まともに開発できる状態ではなさそう、と判断。まあ仕方がないので、その人はペアプロの見る人役に就いてもらって、もう一人の方には同時に僕が予習不十分だったwaveのユーザ管理について調べてもらうことにした。自分はメインコーディング。
しかし、さらにいけてないことに僕自身がよい開発サイクルを構築できてなかった。Wave GadgetはInternet上のどこかからファイルを持って来れればどこでもよいのだけれど、とりあえず提供されているのがGoogle Gadget Editorと呼ばれるwebappと Google Code上のサブバージョンリポジトリ。で、GGEはなかなかにバグッぽい動作をする上に共有とか不便なので、事前にkyoto GTUGさんの用意してくれていた svnリポジトリを使うことになるんだけど(最終結果はどのみちそこに入れる)、そうなるとちょっとしたテストをするのにもいちいちコミットしなきゃいけない。実は始まったときに「Dropbox使うと楽だよ」といいアドバイスをもらっていたにもかかわらず、実は僕自身がDropbox使ったことが無かったので、まじめに考えたり、それを用意する精神的余裕が全然無かった。ここはものすごく反省。もしもここでDropboxに移行していれば、相当加速できていたはず。
で、試行錯誤しながらなんとかコーディングを続けるがJavaScriptに起因する問題で、僕が填りまくる。余裕無いから仕方がない部分もあるんだけど、今から考えると本当に恥ずかしいくらいにトリビアルな部分で失敗し続け、いちいちテストするごとにコミットする、というバカなサイクルも相まってなかなか進まない。結局、午後だいぶ過ぎてもメインロジックまで到達できず、すでにタイムリミット一時間とかいう状況に・・・
ペアプロといいつつ、僕自身が余裕無く突っ走ってしまったため、ほとんどのロジックを共有できずに、相手役が置いてけぼり状態になっていた。うーん僕最悪。

ラストスパート

この辺からが僕のへんてこなところで、ぎりぎりになると急に落ち着いてくる。なんとかペアプロ二人で(微妙に)協力しながら問題点をつぶし、ある壁を乗り越えたところで急激にスパートした。なんとか一時間で1人向けのロジックまで書ききる。で、一人向け部分を書くと、あとはWaveが状態を面倒見てくれるので、実はそれだけである程度は遊べる「共有ライフゲーム」まではできあがった。あとはユーザ管理と色分け。しかし、ここでも僕のミス。調べてもらってはいたのだけれど、それをどうマージするかとかは、相手が考えてくれるだろうと甘えていて、具体的な方法を考えていなかった。結局この時間内には無理だ、と判断して、バグフィックスに専念。調べておいてもらって申し訳なかったんだけれど、とりあえず資料を作ってもらうことにした。

発表

で、もう疲れてしまったので発表はお願いしてだらー、っとモード。発表は最後になった。他のチームのスゲーできのよい成果物と発表を横目で見ながら、うーん残念すぐる、とか思っていた。対戦が実装しきれなかったので、平和的なゲームですとかうまいまとめをやってもらったもんだなーとか思いながら、他のチームの人が、「せっかく良いアイディアなのに」と言ってくれたのがとてもうれしかった。みんな優しいなあ。

飲み会

これはサイコーに楽しかった。マルチメディアチームのみとまさんとかと楽しい話をしまくって、僕にしては珍しく全然歩き回らずにそこでばかりお話ししていた。みなさんありがとうー!

Hackathon翌日

悔しかったのでとりあえず後からのろのろと完成させることにした。
メンバーの一人が言っていた「Dropboxをホストに使うとよい」を今更実行(バカ)。非常に快適にハックできるようになる。
で、結局こんな感じになった。まだ全体できてない。とりあえずマルチプレイヤーで遊べます。の状態。

結論

消極的じゃ駄目だ。もっと積極的に。自分の意見を大切に。開発サイクルは重要だ。十分に効率的なイテレーションができると確信するまでは絶対にコーディングを初めては駄目。人に頼りすぎるな。自分で考えろ。とか、当たり前のことを今更たくさん学んだ。
そういえば、なぜかプレイバックではプレイヤー(Participants)が正しく出ない(というか知らない人がでる)。バグかどうか特定して、Googleの人にレポートしようとか思う。
それと前にも反省したんだけど、やはりTwitterでブツブツつぶやいているだけでは振り返りとしては不十分過ぎる。Ideathonの段階でここに書いていたらだいぶ状況は変わっていただろうと思うと、本当に残念でもったいねー。やはりふりかえりは当日にすぐするようにしよう。
あとこんなおもしろい企画をして、機会を与えてくれた京都GTUGの皆さんに激しく感謝。できればスタッフとしてお手伝いしたいんだけど、ちょっと三田から遠いのが問題点。準スタッフくらいでお手伝い行こうかな。

Googleの回し者。

Wave、海外では結構な人気だそうなんだけど、日本では今一歩。正直、増やしたいというかたくさんいないと楽しくないので、一人でも多くの人にきてほしい感じ。実は招待枠が20人分近くあるので、やりたい人がいたら tkuro11(at)gmail.com にSubject: を "Wanna ride on Wave!"として本文にメールアドレス付きで送ってくれたら招待したいです。無茶かな。

*1:新館のお話も聞けて、すごくよかったです。あんなところでお仕事してみたいです正直