2012年1月29日日曜日

PicTack:iPhoneでBluetooth通信の巻

PicTackでは、Bluetooth or 同一WiFi で端末を接続しマルチプレイを実現しています。
iPhoneでBluetooth接続するには GameKit Frameworkを使用できます。

GameKitは、GameCenterのライブラリ + PeerToPeer接続のライブラリ + Voiceのライブラリ。
今回使用した PeerToPeer接続のライブラリは、ローカルワイヤレスネットワークとBluetooth を行うことができます。

接続は対話式。

Aさん : 接続したい人募集!
Bさん : だれか接続出来る人いないかなー
Bさん : Aさん発見! 接続させてくれー
Aさん : お。Bさんから接続依頼きた。OKですよー
Bさん : お。AさんからOKきた!

みたいな感じ。
接続は 、GKSessionのクラスで管理されて、セッションのID と 端末毎に PeerID が振られます。
通信は NSData型(バイナリ型)で行います。つまり文字列はもちろん、画像とかも送れます。

2台の端末で接続を行う時は、GKPeerPickerController を使うと楽。
接続対象のリストの表示、選択された端末への接続 などの一連の処理を行なってくれるControllerが標準で用意されています。
素敵なサンプルも公開されています (GKTank)

PicTackでは、GKPeerPickerController を使わず、GKSessionという基本のクラスを使って実装しています。
理由は、GKPeerPickerControllerは2台の接続であること。専用のViewが表示されてしまって、ユーザの手順がわずわらしいこと。

後々知ったのですが、「BlueToothが設定ONになっているか?」というのを知るのは private methodを使わないと出来ない。
だけど、このGKPeerPickerControllerを使えばそれもやってくれるみたい。このメリットは大きいですねー。

GKSessionを使う方法をとると、前述の接続も自前でイベントハンドルして処理してあげることになります。

接続方法は、PeerToPeer と Client-Server と Ring の3種類から選べます。

PicTackで選択したのは、ネットワーク負担も軽そうなClient-Server方式。
Appleのドキュメントによると、最大16人まで接続できます。

接続して通信するのは、比較的簡単に実装できます。
"GKSession" でググればたくさん記事が見つかりますので、ここではハマった点を紹介。

BlueToothの設定がONになっているかどうかを判断できない。

Privateメソッドを使えばできるっぽいけど、それをしたら正式にリリースできない。
BluetoothPowerChangedNotification のイベントを取得したらどうにかなる? とチャレンジするもうまくいかず...

そこで、取った方法は、 GKSessionDelegate の didFailWithError でエラーを取得する方法。
#if 0
#define kGKSessionErrorDomain GKSessionErrorDomain
#else
#define kGKSessionErrorDomain @"com.apple.gamekit.GKSessionErrorDomain"
#endif
- (void)session:(GKSession *)session didFailWithError:(NSError *)error {
    if ([[error domain] isEqual:kGKSessionErrorDomain] &&
        ([error code] == GKSessionCannotEnableError)) {
        // Bluetoothもしくは同一WiFiが無い時のエラー
 
    } else {
       //何かのエラー
    }    
}
ただ、このエラーはセッションを作成して開始したタイミングでは飛んでこない。
タイミングをみてavaliableの値を変えるなどしてチェックし直す感じにしました。

また、BlueToothの設定がOFFでもWiFiに接続しているとこのエラーは発生しないのでご注意を。

いつまで経ってもセッションが確立されない時がある

セッションのゴミが残ってしまう時がどうやらあって、そこに接続しようとすると、
> Bさん : Aさん発見! 接続させてくれー
の後に、Aさんから一切応答が無くなるという自体が発生する。

セッションの接続を切って、すぐにまたセッションを開始しようとするとゴミが残るような感じ (ちょっと不明)
ゴミが残ると暫くの間ずーっと残ったままになってしまう。

できたら、ゴミが残るのを避ける対処をしたかったのですが、こうやったら大丈夫! という保証がなかなか出来なかったので、接続できなかったらタイムアウトして他の端末を探すというような事をしました。
この問題は、"ゴミのセッションが残っている" と理解するまでに時間かかってしまってハマリました (;_;)



Bluetooth接続して、描画データの送受信する という所を実装したのは数日でできたのですが、
上記2つを調べるのになんやら色々時間を食ってしまった 感じです。
開発期間を1ヶ月と区切っていたので妥協点も多いのですが... 最悪の事態にはならないように、落ちたりしないように という方向に集中しました。

始めてマルチプレイの画像をtweetしてもらった時は、いやぁ ホント、ホッとしましたww


PicTack
価格 : 無料 (一部のお題は有料)
カテゴリ : ゲーム
対応機種 : iPhone
対応OS : iOS4.1以上
サポートページ : http://pictack.places-inc.com/
リリース日 : ver1.0 2012/01/16


• • •

2012年1月28日土曜日

CROSSのイベントで思ったこと

先日、CROSSのイベントにいってきました。
いろんな人が集まっての混在イベントで楽しかったです。
スポンサーのサントリーさんがトン単位のプリミアムモルツ提供が素晴らしかったですっ

私は、フロントエンドCROSSを聞いた後、スマートフォンCROSSに途中参加してきました。
はじめのフロントエンドCROSS(UX/デザイン)を聞いて思ったこと。

このCROSSでは、デザイン/UXの立場の方4人が実際やられている方法や、経験談、思っていること などを喋っていく形式でした。
私なりの要点をまとめると
- 実際のユーザの不満を手や足を使ってしっかり調査すること
- デザインはかなり検討時間を割いておこなっている
- びっくり要素を入れると差別化しやすい
- WEB/スマートフォンなど画面にとどまらないインターフェースが身近に作れるようになっていること

たしかにーって思うことも多くて楽しくききました。
こういう話って聞く方も楽しく聞けていいですね。

そんな中思ったのは、なんだかベルトコンベア式だなーと。
デザイン室でデザインして、画面詳細まで落としてプログラマに作成させる って感じ。
話の中にはプログラマも一緒に仕様を詰めた方がいいよ とか、UXを考えるプログラマはあんまりいないから考えたほうがいいよ みたいな話もでてきたり。

セッションで、開発者、デザイナー、プロジェクトマネージャーがお互いをどう思っているかがよくわかる1枚の画像


が出てきたのですが、この中のちょうどデザイナー/プロジェクトマネージャーからみるデベロッパーの図なんだろうな..と。

私はプログラマなので、どうしてもその目線でムッとしたりも正直するw
...と同時に本当にプログラマーってそうなんだろうか?と考えてしまった。
プログラマーだって人間だし一般ユーザと一緒。綺麗なお花をみたらきれいだなーって思う。
プログラマーだって、かっこよいデザインは好きだし、使っていて気持ちいい! と思えるアプリの方が好き 。
私個人はデザインを作ってもらえてると、実装にもテンションあがりますw
それじゃ、プログラマだけで作ったアプリはどうしてカッコ悪いのか?

よいデザインが作れない
確かにそれはあるけど、それだけじゃない。
それだったら、画面のレイアウト/構成が適当なものが出てくる理由にもならない。

何をやっていて達成感/満足感を感じるか?
ってところなんじゃないかなーと思います。

スマートフォンCROSSの会話の一部。
「デザイナーと組んでやらないのか?」という問いに対して、
「個人で作っているアプリは趣味。プラモデルを作っていて色を塗るのが得意じゃないからプロに頼んでお金を払う人はそうそういないだろう。それと一緒」

これ、解。

デザインは気にしないのか? というのではない。
ただ、そこに時間を割くほどのテンションは上がらないというだけ。

そんなプログラマーは、よくプロジェクトの一番最後で
「こんなアプリだれが使うんだよw」とか「使い勝手悪いわー」とか「こうしたほうがもっといいのにな」とか感じながらも、仕様書通りに納期に間に合うような作業工になりがち。

デザイナ+プログラマが入って作ったアプリとプログラマだけで作ったアプリを見ると、お店の料理と家庭料理を思い出す。
パプリカやハーブ、ソースで綺麗に着飾った料理はたしかに素敵! と思うけど、家庭料理でそんなんは作らない。お腹が満たされておいしいと思えば基本OKだから。
いざ、お店の料理を作ってみよう! とすると、下ごしらえ大変だし、頑張ってやっても想像通りのものできないし。
...プログラマ的発想ですかね?

じゃぁ最初からみんな一緒に作業を進めたらいいのか? といったらそれも違う。
それができたらよいんだろうけど、そんなに人件費割けないだろうし、だれかが率先しないとモノゴトはなかなか決まらない。
グループで仕事するのって、結婚するようなもの。
今まで違った環境で育ってきた人同士が一緒に暮らしたら、常識も違うしボキャブリーも違う...しすんなりうまくいくハズがない。
だから、トップダウンやベルトコンベア式のような家庭内別居(疎結合)の方がうまくいくから、そういう形になるんだろう。

1つの解は、セッションで出てきた UXのハニカム構造なのかもしれない。
Useful
役に立つこと
Usable
使いやすいこと
Desirable
望ましいこと
Findable
探しやすいこと
Accessible
アクセスしやすいこと
Credible
信頼できること
Valuable
価値があること

このハニカム構造はよくできている。
デザイナ、プログラマ....ユーザと、立場が違っていても理解が出来る。
どれが抜けても駄目だと思える。
そして哀しいかな、あまり注意していなかった所があったりしてハッとしたりもする。

私は、ピカソの絵が素敵! とは思えない。ファッションショーに出てくる衣装が素敵! とも思えない。
統一感がない、機能的じゃない と普通に思う。
だけど、UXのハニカム構造の観点のフィルターを通したら理解できたりするのかもしれない(上記2つはやっぱわからないけどw)
相手が理解出来る発言が出来るかもしれない。理解出来る質問ができるかもしれない。

多分大事なのは、UXのハニカム構造のこのGOALは他人の責任だから任せておけばいい(=考えない) とならないようにすることなのかな。

正直、デザイナーさんがいたら、「使いやすい」デザイン作ってくれるはず と任せてしまう所は私にはある。
逆に、デザイナーさんも、「信頼できる」システムを作ってくれるはず と任せる所があったりするのではないか。
それは"リスペクト"でもなんでもなくて、自分のテンションが上がらない所は任せる っていうだけ。
テンションが上がる所を中心にやると効率も良いはずだから、それもまた良し だと思うんだけど、
無責任になってしまわない程度を見計らう必要はあるし、すべての人がその責任を感じる体制を作る努力はいるよね。
その体制は、ベルトコンベア式ではないよなー多分。

結論?
そんなものはいらないのですw
そう思ったんなら何かチャレンジして...失敗して...と何か行動を起こすのみです。
• • •

2012年1月23日月曜日

PicTack:デザイナーさんとの共同作業の巻

iPhoneアプリはいくつか作成していましたが、今回のPicTackでは始めてデザイナーさんとの共同作業 という挑戦をしました。

PLACES inc. は、私も含め3人在籍していて、分担としては以下。
- プログラムを行う人 (私)
- 画面UIデザインを行う人
- 回答サンプルや音を作成する人

私以外の2人はデザイナーさんなので、プログラムは書いたことがない ましてや XCodeを触るのは始めて という状態。
ただし、Subversionは使ったことがある という感じです。

【チャレンジ内容】
- みんながXCodeで実行できて、自分の端末で実行できること。
- 自分がやる作業はXCode上で自分で組み込みが出来ること。

画面デザイン

画面デザインを行なってもらうためにまずやったことは、InterfaceBuilderで画面UIをつくること。
(個人で作成しているアプリではInterfaceBuilderを使わず、コードですべて作成していました。)
今回は、InterfaceBuilderをつかって、まずは大枠の部分をデザイン無しで私が作成。
出来あがったXIBファイルを直接触ってもらう方向にしました。

基本、問題なく触ってもらえました。
問題点としては、InterfaceBuilderでできないことはコード上で実装しないといけない点。
もともと想定していた所.... 参加ユーザ数に応じて結果画面の表示を切り替えるとか...については、個別のXIBを用意して組み込みしていたので大丈夫でしたが、ちょっとしたところがInterfaceBuilderで出来ないのが惜しい感じ。

例えば、
  1. ラベルの文字列を国際化できない (もう一つXIB作るのは嫌だー)
    InterfaceBuilder上でも、NSLocalizedString使わせて欲しい。
  2. 右5度に傾ける とかができない
  3. 内部状態により表示/非表示の切替ができない
    ピクタクの場合は、シングルプレイはキャンセルボタンを表示するが、マルチプレイの時には表示しない ということをしたかった。

InterfaceBuilderでできないことは、Controllerのコード上にUIViewをマッピングさせて操作する感じになるので、
どんどんControllerが汚く...
ココらへんは、できるだけ、Controllerが大きくならないようにコードをわけたりする技が必要になってきますね。

コンテンツ(回答サンプル)の登録

お題カテゴリのメタ情報用のplistを1つ作成。
お題のメタ情報用のplistをカテゴリ毎に作成。
画像ファイルとのマッピングは、メタ情報内のタイトル属性と同じ名前で登録 という名前のルールを決めて行いました。

これで、直接 plist を触って、画像を組み込んでもらいました。
plistはXCode上に編集用のUIがあるので、こちらも問題なくやってもらえた。

画像が多いのでコンパイルに時間がかかってしまうという問題はありますが....

まとめ

できるだけ、デザインと実装コードを分けたかったんだけど、どんどん処理コード(Controller)にUIViewの参照を付け加えていくはめになってちょっと、嫌な感じ。
でも、InterfaceBuilderを使わなかった時と比べて、さすがにControllerはスッキリとしたコードになるので、あー、XIBのデザインはアリだなーとも思った。
オススメは、InterfaceBuilderを使わずコードで実装して仕組みを理解してから、InterfaceBuilderを使うこと!
よくわからずInterfaceBuilderを使っていると、なぜ動かないのか? ということが判断できなくなって、嫌になっちゃうのでw

デザイナさんの感想を聞いてみたら、「カーテンを閉めて画面遷移する... とか、そういう動きも絡んだ所を触りたい!」とのこと。わかる。動いたら楽しいもんねー!
[UIView animateWithDuration]でアニメーション書くのは簡単なので、ぜひデザイナさんにも触ってもらって楽しんでもらいたい。
そういう部分を触りやすいように部品化して、触りやすくするのは、プログラマの役目かなーと。
そういうデザイナーとプログラマーの隙間を埋めていく試みも今後チャレンジしてみたい。

ちなみに、審査結果待ちの時に時間がかかった場合、カーテンの後ろから、ちらっと ペンのキャラが見え隠れするようなコードを密かに入れまして....
発見された時には、興奮していただけた模様。みなさんは、みることは出来たかな?!?!

最近、iPhoneを触っていて気持ちがいいUIと感じるのは、静的なデザインだけでなく、動的なデザイン が多い気がする。
もっと 気持ちがいい! 触りたい!と思えるようなアプリを今後、作っていきたいです。

次回は、Bluetoothで接続して通信 した所のお話を書いてみますー!


PicTack
価格 : 無料 (一部のお題は有料)
カテゴリ : ゲーム
対応機種 : iPhone
対応OS : iOS4.1以上
サポートページ : http://pictack.places-inc.com/
リリース日 : ver1.0 2012/01/16


• • •

2012年1月19日木曜日

祝!! PicTackリリース


PLACES inc. として始めて作成したiPhoneアプリ PicTack(ぴくたく) をリリースしました!

PicTack は、みんなでお絵かき対戦が出来るゲームアプリです。
絵が上手い人とヘタな人...両方いるほうがなぜか盛り上がるゲームになっています。
対戦は5人まででき、一人でも遊べます。



何を隠そう、私は絵が下手。
PLACES inc. のお二人はデザイナーさんで絵がうまい。
その中に混じってアプリの動作チェックを兼ねてゲームをしていると、いつもオチの役目で悲しい思いをしておりました。
晴れてリリースできたので、私より下手な人と一緒にやりたいですww (@ikikko please!)

...それはさておき...

PicTackは、デザイン会社のPLACESらしく、とってもかわいい、ほのぼのとしたUIになっています。
最初のアプリで、ゲームを選んだのは、PLACESらしさ が出てよかった。

さて、今回このアプリでは、私個人として以下の挑戦がありました。

1. デザイナーさんと共同作業すること
2. Bluetoothで接続して通信をすること (最大5人まで接続できる仕様にすること)
3. アプリ内課金をすること
4. 1ヶ月でアプリを完成すること

Bluetooth部分は罠があったり。アプリ内課金の所でリジェクトされたり..と色々ありました。
これらの挑戦内容については、また このブログで書いていきます。

最後に、レビューに付き合っていただいた皆様有難うございました!
レビュー内容はまだ反映されていないのですが、今後の改善内容として使わせて頂く予定です。


PicTack
価格 : 無料 (一部のお題は有料)
カテゴリ : ゲーム
対応機種 : iPhone
対応OS : iOS4.1以上
サポートページ : http://pictack.places-inc.com/
リリース日 : ver1.0 2012/01/16


• • •

2012年1月18日水曜日

Withings使い始めた


測定した体重/体脂肪を自動でサーバーにデータ保存してくれる体重計 Withingsを購入しました。
購入きっかけは、AppleStoreの初売りで対象になっていたからw

4日間ほど使っていますが、とっても楽。
私は目が悪いので、立って体重計にのると数値が見えないので、いつも座って数字をみていましたが、
数字をみなくてもOKなのも嬉しい (私だけ?)

この体重計は APIが用意されているのが素敵。
だけど見てみるとちょっと気になる点が。

https じゃない!

よくよく見ると、WEB上で体重のグラフを見るページも http だし。
私的には、住所とかemailアドレスのような個人情報よりも見られたくない内容なのにな....w

認証部分は、v2 から OAuthになっている模様。
v1の useridとpublickeyでの認証だったら使ってなかっただろうな。まだよかった。
遊び道具がまた1つ増えましたー。
• • •

2012年1月5日木曜日

[しょーもない話]鶏肉が安かった

鶏肉が100gあたり178円の細かく切ったものと、ブロック98円 のものが売っていた。
思わずブロックを買った。

ブロックは、小さいサイズのものがなく、593gが一番小さいものを購入。
普段1食あたり、約250gぐらいを使用すると考えると

細かく切ったもの 178円×250/100g=445円
ブロック 98円×593/100g=581円

178円のものを593g買ったら1,055円なので、474円お得した感じ。

...が、果たしてどれだけお買い得なんだろうか。

ブロックは多すぎるので、次回に回すため冷凍保存。味は落ちるので、なんとなく5割引になると考えて、
98円×(593/2)/100g×0.5=290円 損したと考えてみる
お肉を切る作業、包丁/まな板を洗う時間 を 2分。時給が1600円と換算して80円の人件費損。
290円+80円=370円。

474円 - 370円 = 104円。

そうか、お得感は104円ぐらいか。思ったより嬉しくないという結論。
• • •

2012年1月4日水曜日

振り返りと今年の抱負

年が明けました。今年もよろしくお願いします!

昨年は、大震災、ジョブスの死去などいろんな事がありましたが、私個人としては"作業場所が自宅になった"というのは思った以上に大きな出来事だった。

健康管理は自分の役目なので、意識するのは当然の事ですが、いままでそれにあまり注意を払っていなかった自分にびっくりしたり。
仕事でノッてくるとずっとやりたい と思うタイプなので、ずーっとズルズルしてしまう。
今まで自宅で行なっていた個人の開発も、明確な区切りができないので少なくなってしまった傾向も。
しかし、逆に見ると、自分にあった生活スタイルを確立しやすい状況なのは確か。
短時間睡眠だって4時間半睡眠だって試しやすいし、効率のよいタイミングで仕事に集中したりもできる。

複数人が一緒に仕事している時には、"待ち"というのが発生するタイミングがある。
ある人が作業が終わらなければ、先に進めない or 先に進んでも後戻りがある可能性がある というもの。
仕事時間が決められている時にはゆるゆると作業をすすめたりしていたが、仕事時間に融通がある場合には、よいタイミングで集中して仕事にとりかかれば効率もよくなるはず。
自宅作業は半年弱ぐらい経験したが、今までの仕事スタイルが抜けきらず、あまり効率がよくなかったと感じている。

そんな生活でもう一つ変わったのは日々のお金の減り方。
お昼ごはんを渋谷などで食べていた時は1,000円は毎日消費していたが、自宅で食べると100円ぐらいで済む。
差分を、Cafeでのお金に割り当てるほうが私としてはとても満足感がある。

そんな思いを胸に、今年の目標は
効率のよい生活スタイルを目指したい。仕事も、健康も、私生活も。

早速、Appleの初売りでは、WiFi体重計を購入w
その他のライフログはどうやって記録していこうか悩み中。
理想とする基本生活リズムを登録して、それに合わせたアラートを出してくれたり、実際との差分をみることができる なにかいい方法はないかな。
• • •