おやきーずが『One day...』というアプリを作った話。

 この記事はクックパッドさんが主催された『第3回 開発コンテスト24』

に、おやきーずが『One day...』というアプリを作って応募した記録です。なんと!今回は見事に受賞!





……できませんでした!!

「参加してダメだった人たちの話もあっていいじゃないか!」との思いを胸に、この記事をかいています。というわけで、24時間を戦って負けた人たちの話をどうぞ。


おやきーずのゆかいな仲間たち

BGMをどうぞ


ただのBGMです。

テーマ発表時|12日|9:00

 今年のテーマは『一日の終わりを楽しくするもの』でした。テーマ発表時、私はお布団の中でぐっすりと眠っていて、変態猫からのSkypeチャットを全力で無視していました。正直すまんかった。

第1案決定|12日|12:00

 お昼過ぎに颯爽と目覚め、変態猫からのSkypeチャットを確認。サンドウィッチを作り珈琲を淹れた後で、まったりとアイディア出しを始めました。

 「すごい、全然面白いの思いつかない。お腹いっぱいになったら眠くなってきたし、もう諦めて寝ようかな。」と思っていたところに、変態猫からインターセプトが入ったので、しぶしぶミーティングをすることになりました。ここで出た使えそうなアプリアイディアは2つ。

  • 見知らぬ誰かと寝落ちまでお話出来るアプリ
  • 家に帰ると「おかえりなさい。」と言ってくれるアプリ

上の寝落ちアプリは「斉藤さん」という類似した既存製品があったので、却下しました。このため、開発するアプリは

  • 家に帰ると「おかえりなさい。」と言ってくれるアプリ

に決定しました。「その日の天気や、スケジュールに応じて台詞が変わってくれると良いよねー。」とか「出かける前に天気とかスケジュール言ってくれると良いよねー。」とか「これで一人暮らしでも寂しくない!大勝利!!」とか言いながらミーティングを終えました。完全に悪乗りです。

 このあと変態猫は用事があり、18時まで手が空かなかったので、私1人でプロトタイプの開発を始めました。同時に、じぐそうとみつお君に声をかけておきましたが、同日に開催された高専カンファレンスin奈良2に参加していたので、きっと疲れて来れないだろうなぁ……と思っていました。結局参加することはできませんでしたが、また違う機会に2人とはハッカソンとかしてみたいですね。

僕、アルバイトォオオオオオオ!!!|12日|14:00 - 18:00

 私は18時からアルバイトが入っていましたので、それまでにプロトタイプを形にしておく必要がありました。帰ってきた瞬間に音声を流す方法には様々ありますが、今回はKinectの骨格検出を利用することにしました。Kinectを弄りたい場合、使うライブラリ(OpenNI or 公式SDK)によって使えるOSと開発言語が違ってきます。おやきーず内でKinect本体を持っているのは私だけでしたので、私が1番使いやすい環境を使うことにしました。

  • 言語(環境):Processing
  • ラッパー:simple-openni
  • ライブラリ:OpenNI+NITE

 私が使う環境がMac+Winであること、変態猫が使う環境がWinだけであることを考え、「この際だから他OS同士でペアプロしてみよう。上手く動かなかったらWindowsオンリーにスルッと以降しやすい言語にしよう。」と思い、どちらの環境でも同一のコードが動いてくれるProcessingを選択しました。Javaベースなのでクラス毎に担当を区切ることもでき、アプリの生成もすこぶる楽、グラフィカルな処理も気軽なので、これで行こうと思いました。個人的なタスクもあって、Processing+Kinectの環境にも慣れておきたかったので、「このコンテストを出汁にして、勉強できればいいやー。」ぐらいの気持ちでした。

 そんな感じで適当に4時間ぐらいコードをバシバシした結果、Kinectの骨格検出(ユーザトラッキング)を利用し、ユーザーを検出時に「おかえりなさいませ、ご主人様。」と音声を流す所までできました。「おかえりなさいませ、ご主人様(はぁと」な音声を聞きすぎて、頭がおかしくなりそうでした。隣の部屋の人に、「ついに隣人は狂ってしまった。関わらないようにしておこう。」と思われてしまったかもしれません。

 ここらへんで時間が来たので、着替えてアルバイトに行きました。その日は新しいアルバイト(女の子←重要)が初出勤する日だったので、少しだけワクワクしながら出勤しました。

仕様変更は突然に|12日|22:00

 アルバイトを終えて帰宅した後、変態猫とSkypeをつなげて楽しいペア☆プロを開始しました。初めてのペア☆プロだったので、ペア☆プロ童貞は変態猫に奪われてしまったことになります。どうせなら、俺よりコードが書ける気が強いツンデレなお姉さんに罵られながらコードを書いて、最後に「あなたと一緒にコードがかけて楽しかったわ。」とか言われたかったです。嘘です。そんな事を考えつつ、珈琲やモンスターエナジーを用意していたら23時を回っていました。開発が少し進んで、天気のデータがXMLで取得出来た辺りで、おやきーずは大変なことに気が付きます。

「なんかこのアプリ、すげぇつまんない。」

 なんということでしょう。悪乗りで企画して作ったアプリは、驚くほどつまらないのです。匠たちは一体、この状況をどのように打破するのでしょうか。

企画案の練り直し|13日|0:00

 このまま初期案を開発し続けて行けば、募集時間には余裕で間に合う事は2人のスキル及び経験的に明白でした。しかし、自分でいじっていて楽しくない物を応募しても確実に負けます。なおかつ、モチベーションがまったく出ません。仕事でも学校の課題でもないコンテストへ自主的に参加する以上、モチベーションの持続は最も重要な要素だと思いました。「つまらないものは作っていてもつまらない」のです。ここで、再度作戦会議を始めました。締め切りまで、9時間を切っていました。


 私たちは、もう一度手持ちのカードを確認することにしました。

 残念ながら、おやきーずは『スマートフォン向けアプリとWebアプリに全く明るくない』という致命的な弱点を持っていました。そのため、開発するのはローカルアプリか組み込み系アプリである必要がありました。コンテストのテーマが『一日の終わりを楽しくするもの』であることから『ベッドの中でスマートフォンをいじってうんぬん』というアプリが多くなることは想像に難くなかったので、あえてローカルアプリで攻めようと思いました。それしか手がなかった、とも言います。

 次に、私自身がTwitter4Jを使ってTwitterAPIを叩いたことがあり、最近Processingでも叩けるようにコードを書きなおしている事を共有しました。そこから2人で、Twitterの1日分のログを使って面白いことができないかと考え始めました。UserStreamの実装以降、favやRT、フォローなどの通知をトリガーにしてアクションを起こすコードの実装が、すごく簡単に出来るようになりました。(これすごく楽しいので、遊んでみるといいですよ!

 1日の終りということもあり、その日最も人気だったツイートを表示してみたり、人気だったユーザを出してみたり、時間毎の人気ツイートを表示してみたりなどというアイディアが出ましたが、どの案でも既存感が拭えずモヤモヤ〜っとしていました。

 その時、私はイトウカイトさんが

と言っていたことを思い出しました。これを丸パクヒントにして、時間単位で取得したツイート数をビルの高さにし、TLにだれかがツイートすると星が流れるようにしようと考えました。朝、アプリを起動して、夜帰ってくると沢山ビルが建っていて、星が流れている。なんだか良い感じになりそうだぞ、とウキウキしながらコードを書き始めました。

開発なう|13日|1:00 -

 こうして、スタートダッシュを見事に失敗したおやきーずの開発が始まりました。今回の開発の役割分担は 

  • 変態猫:フロントエンド担当。星を降らせたりビルを大きくしたり、月をボタンにする。
  • Atom:バックエンド担当。TwitterのStreamAPIを叩いてログをとったり、各種関数を呼んであげる。

となっていました。私がバックエンドの担当し、変態猫がフロントエンドを担当することは結構珍しいことでした。ですが、特に居心地が悪い事もなく、
「この役割分担は珍しいなー。」とか言いながら開発をしていました。変態猫が作るフロントエンドなモジュールはとても使いやすく、快適でした。「くやしい……でも、使いやすい……っ!」とか言いつつ、バックエンドからフロントエンドにデータを投げつけて行きました。アルゴリズマーを名乗るだけあって、あやつなかなかやりおる。

 自分が昔書いたJava用のコードを参考にしようとしたら、色々無駄な処理をしてたりスコープがおかしかったりして、THE・バグの温床になっていたので、新しく書き直しました。なんであんなクラス分けにしたのか、未だにわかりません。

機能を追加しないという機能|13日|6:00 -

 締め切りが近づいていました。ここからは新しい機能の実装をせず、発表できるようにコードを整えていく事に注力しました。この時点で一旦提出してしまおうと考え、ver.0.5として仮提出を行いました。同時に動画撮影、応募登録、メール処理の手順の確認も行いました。

 ココらへんから、私がバックエンドでヒィヒィ言っている間に「これやっといて!」「あれやっといて!」と、適当に仕事を投げつけて置く事が多くなりました。逆に相手がヒィヒィ言っている時は、私がYoutubeアカウントの設定変更や動画撮影の準備、提出用メールの文章を清書していました。時には「デバッグ任せた!」といってソースコードが投げつけられて、「ゴミコードめ!」と投げ返す作業もありました。

 この様に、流動的に開発の担当区分が変わっていくフットワークが軽い感じは、とても楽しくて刺激的でした。一人で開発している時に「あー、後であれやっておかないとな。」と思う作業を口にすることで、手の空いた相手が作業してました。この感じはとても快適で、作業のし忘れを防止する意味でも効果的でした。


Dropboxの更新通知が騒がしい夜でした。

ギリギリの提出|13日| - 8:56

 画面を整えたり、応募用の紹介文(ポエム)を考えていたら8:30になっていました。「楽しい時間は過ぎ去るのが早いものですね。」とか言っている暇も無かったので、さくっと紹介動画を撮ってYoutubeにアップロードし、応募フォームにポエムを書き込み、Dropboxのパブリックフォルダにアプリを置き、メールでパブリックリンクを送りつけました。メールを送り終わった時には8:55を少しまわっていました。

 モンスターエナジー2本とレッドブル3本、そして珈琲1.5リットルが胃の中で暴れまわっていました。

出来たもの


~ 応募用ポエム ~

One day... 星を見上げながら 眠りについた
沢山のTweet 沢山のReTweet そして沢山のStar
上を向けば いつでもそこに流れてる
あの日見た星空に またいつか巡り逢えるかもしれない
Today... 今日も星が生まれては消えていく
One day... また星を見上げよう


「わーい、きもちわるい〜。」と思ってもらえれば、私たちの勝ちです。

反省点

 まず、朝起きなかったという点が致命的なエラーとして報告されています。後はスマートフォンアプリいじった方が良かったのかなとか、Twitterを使うのはやっぱ目新しく無かったのかな、という反省があります。ですが、1番の理由は『一日の終わり』というテーマに、上手なアプローチが出来なかった事だと思います。面白さの追求だけに勤しんでしまい、『一日の終わりを楽しくする』という問題解決を疎かにしてしまった事が、最大の敗因だと思います。アイディア力と、目標をしっかりと捉える力が、まだまだ足りないなあと実感しました。


まとめ

 スマートフォンアプリとWebアプリに関する技術力不足を実感しました。コンテストが終わった今色々調べてみると、結構サクッと開発が出来るようですね。iPhoneアプリは『ネイティブな言語で書いて、デベロッパプログラムに参加しないと作れない』という固定概念があったのも、もったいない感じです。ココらへんの知識が増えたのは良いことでした。

 他に学んだことと言えば、

  1. Processing 楽チン!(でもメモリ管理とかどうなってんのまじ怖い。)
  2. TwitterのUserStreamAPI楽しい!
  3. ペアプロ楽しい!
  4. Macの画面撮影機能便利

です。特にペアプロの楽しさと、Processing+UserStreamAPIの楽しさを学べたのは、良い糧になりそうです。入賞できなかった事は、もちろん悔しいですが、24時間という短時間でここまで色んな事を学べたことは、大きいと思いました。次回のコンテストにも是非参加したいです。

最後に

  • 一緒に参加してくれた変態猫
  • 素敵なコンテストを主催していただいたクックパッドさん
  • このコンテストの存在を知るキッカケとなったじゅーんさん(@june29)
  • 本アプリのヒントになった画像を作っていたイトウカイトさん(@itoukaito)

 皆さんのお陰で、楽しい時間を過ごすことができました!本当にありがとうございました!特に変態猫マジ乙。そしてここに書かれてない事は、君が補足してくれると信じているよ(丸投げ)。


ではでは。