40歳からのキャリアチェンジ

20代はエンジニア・PM、30代はWeb系エンジニア向けのキャリアアドバイザー。40代の今はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連あたり

忘年会の余興採点アプリでACS活用した話

Titanium™ Advent Calendar 2013 14日目です。

CraftBeerFanのAndroid版をリリースした後に、ここ最近実施してなかったStreetAcademyでのTitaniumワークショップを再開しようと思っていたのですが、忘年会の余響採点アプリを作ることになって、Appcelerator が提供してる MBaaSのACS連携アプリを作っていました。

以前作ったアプリでもACS連携するものだったのですが、今回は前回作ったアプリよりもACSの利用度が高かったので、ここ数週間の出来事を振り返る内容を書いていこうと思います

作ろうとおもった背景

「会社の忘年会の余興を、金ちゃんの仮装大賞みたいな感じでみんなで採点できるようなアプリを誰か作ってー」というのを社内SNSで見つけました。

別に特定の誰かに向けた内容ではなかったのですが、Titaniumだったらこういうのはサクっと出来るっていうのを見せることで、自分が考えてた新規事業的な部分について再度考えてもらうキッカケになるかと思って着手しました。

作ったアプリを時系列で振り返る

ひとまず、モックとなるものを最初こんな感じで作りました

f:id:h5y1m141:20131214072932p:plain

その後、採点アプリとなると各自のログイン処理が必要になると思い、Facebookアカウントでのログインを考えてこんな画面も別途作りました

f:id:h5y1m141:20131214073022p:plain

投票時にはこんな感じで、余興一覧が表示されてて、投票するをタッチすることで投票画面がアニメーションでひょうじされるものを作りました

f:id:h5y1m141:20131214073109p:plain

ところが、色々話が変わってきたのと、それほどITリテラシーが高くないユーザが多いことがわかり、 最終的に作ったのはこんな感じのUIに落ち着きました

自分の名前を探して、タッチすることでログイン処理を行い、あとは東vs西という対抗戦形式ということでスライダーコントロールにして、投票するという感じにしました。シンプルすぎますけどね^^;

f:id:h5y1m141:20131214072830p:plain

作業に費やしたおおまかな時間

上記のつぶやきが11月20日で、忘年会の1週間前を締め切りということになったので、実際に作業に費やせる期間は2週間強でした。

ただ、私の本業はそもそも開発の仕事でない上に、土日祝日は基本的に家族サービスにあてるので、出社前 or お休みの日に家族が起きる前の1,2時間しか毎日あてられないので、実際の作業時間としては多めに見積もって40時間程度かなと思ってます

ACSを使った理由

前置きとして自分のバックエンド側というかサーバーサイドのアプリケーション開発についてのスキルレベルを簡単に書いておきます。

今回作ろうとしていたアプリのバックエンド側は、特定のエンドポイントにアクセスすると、該当するリソース取得してJSON形式で値を返すようなAPIだけ提供すればいいような類のもので、PC/スマフォ用に表示できる仕組みは不要でした。

あと、Facebookアカウント or 開発者向けにAPIが提供されている某企業向けSNSアカウントを利用してのユーザ登録、ログイン機能ほ必須かなと考えていました。

環境構築含めて、上記のものを最低限動作するものをサクっと作れるレベルではないというのが自分自身のレベルです。

そういうスキルレベルで時間的に余裕があるわけでもなく、かつ、とてもザックリとしたアイデアのものを作ろうと思った場合に、フロント側のアプリ&バックエンド側のアプリともある程度変更に耐えやすい構造がよりよい状況かなと素人なりに考えて、選択肢としてはTitaniumと連携しやすいACS しか選択肢としては考えられなかったというのが正しい言い方かもしれませんね

ACS使って良かったポイント

それぞれのデータの持たせ方が柔軟に出来る

忘年会の余興の採点をするアプリなので

  • 忘年会の余興自体の情報
  • 忘年会の参加者の情報
  • 忘年会の運営者の情報
  • 忘年会の余興中に撮影される写真の情報

あたりがまずは管理しないといけないデータになりそうだと考えました。

ただ、細かい情報、例えば

  • 余興の名前
  • 余興自体が単独で行われるのか、複数チームなのか
  • 余興の開始時間とかも厳密に決まってるのか

という部分は正直後でどうにかなるかなと思っていましたし、実際どうにかなりました。

というのも、ACS側であらかじめ設定されてるフィールドを基本活用して、例えばUsersというオブジェクトの場合に

  • email
  • username
  • password
  • first_name
  • last_name
  • photo
  • role

みたいなものがあり、それぞれに該当する情報を入力したり、を別途アップロードした写真情報と紐付けることで簡単にプロフィール機能が出来上がったりします。

上記の項目で管理しきれない場合には、custom_fieldsという項目があり、ここで{custom_fields:{street_address:"東京都xxx"}}みたいな感じにすることも出来たりします。

実際途中で何度かデータ構造を変更して対応しましたがそんなに労力かからずに対応できたのですが、これはACSというか、正しくは、ACSのバックエンドのDB(MongoDBでしたっけ?)の特徴があったからこそ今回のような、プロトタイプとなるものをデモしながらちょっとづつ作り上げていくアプリに向いていたのかなと思います

Photo オブジェクトには便利機能があった

余興中に、各自のスマフォで写真を撮って、それをシェアーするようなことがきっとあるのかと思い、今回初めてACSのPhotoを利用してみました。

スマフォアプリでのバックエンド側での利用が想定されているだけあって、かゆい所に手が届く機能があらかじめ提供されてました。

具体的には、アップロードされた写真に対して、オリジナルの画像は当然のことながら、75x75、100x100、240x240・・という感じの正方形サイズの画像が取得できるようなプロパティが提供されており、こういう画像のリサイズは地味に面倒なのでこのあたりをバックエンド側でサクっと提供してくれてこれは使って良かったかなと思ってます。

最終的な完成系では、写真撮影機能は採用されなかったのですが、この辺りの作りこみはそれほどしてなかったので、採用されなかったとしても精神的にはそんなに苦痛を感じることがなかったですね。

ACSでここを改善してもらいたいと思うポイント

管理機能面

世の中完璧なものはあるわけではなく当然のことながら、課題もあります。どっかで書いた記憶があるのですが一番の課題は管理機能です。

ACSの管理画面である程度の機能はそろっているのですが、例えば、Eventオブジェクトだけを全部消すというような機能は少なくとも私が見てる限りではみつかりませんでした。

また、削除に限らずデータを一括登録するような仕組みも存在してないため、別途ACSのREST APIを叩くようなシェルスクリプトを書くか、がんばって手作業で登録をする等、何らかの工夫が必要になります。

ACSの全てのデータを削除する機能はあるんですけどね・・・何かこの辺りがちょっと中途半端な感じがしてますが、そもそもACSが想定するシナリオでは、こういうデータ一括登録とか特定のオブジェクトだけ削除というのが想定されてないのかもしれませんね。

ドキュメント情報が若干不十分

忘年会の参加者は、Users オブジェクトを利用してここにユーザ情報を登録しました。ドキュメントには記載ないのですが、adminという項目があり、見る限りtrue/false で値設定が出来るようでした。

そこで運営者は、admin をtrueにしようと考えて

if userFlg is true
  # 運営者用のウィンドウを生成 
else
  # 一般参加者のウィンドウを生成

というコードを書いたのですが、何故か意図した処理が実施されませんでした。

Ti.API.info typeof userFlg   

したところ、Boolean型が返ると思いきや、String型が返ってきました。

こういう部分含めてドキュメント情報がちょっと不足してるかなと思いました。

トラブルがあった場合

テスト中は無かったですが、過去こういう苦い思い出があり、ACSが利用できなくなった場合のことを想定しておかないといけないのは、結構つらいかなと。

今回の場合には、ある程度オフラインで動作するように作ってるのですが、最後の投票処理だけは、サーバー側にスコアーを投稿しないといけないため、そこだけは、もう神のみぞ知るという感じですね

まとめ

@ryugoo_ さんが Titanium™ をはじめるときというエントリの中でTitanium 向きのアプリとして、

OS 標準の UI を持つ、ウェブ API と連携するタイプのアプリ

これが Titanium 向きのアプリだと思います。 Titanium には HTTPClient API があり、これを使うと少ないコードでシンプルな HTTP 通信を行うことができます

ということを書かれていました。

私も過去作ったアプリはこういうタイプのアプリなのでとても実感しており、これまでTitaniumの開発で培ったスキルをある程度活用しながらスマフォアプリフロント側とバックエンドとをまとめて作りこむ必要がありそうな状況の中では、Titanium+ACSの組み合わ(*1)は選択肢としては結構良いかなと思いました。

足りない部分の管理機能は、Appcelerator が提供するNode.ACSというものを使って、好みの管理ツールを自作するというアプローチを取ることで解決できそうな気がしてます。

以前作ったCraftBeerFanのお店情報の管理機能が前から欲しかったのと、ちょっと気分転換したい気持ちもあったので、好みのツールを作ってみようかなと思ってます。

(*1) これ書いてて、 MBaaSとしてはメジャーなParseがTitaniumから使えるのかなとふと気になって調べたら、GitHubにiOS Parse.com Module for Appcelerator Titaniumなるものがありました。

ACSをもっと本格的に使うようになったら、別途Parseとの比較とかやってみたい気もしますが、そこまでやると正直手を広げすぎかなと ^^;