MizuhoHackathonでVirtual Private Assistantを部分的にPepperで実現しようとしたときのメモです。
僕の担当分はチャットアプリでした。こんな感じの動作をします。
主な機能は次の2つです。Mizuho Hackathonで作成したiOSアプリのデモ https://t.co/M9e0qVNoYC @YouTubeさんから
— 龍一郎 (@K_Ryuichirou) 2016年5月23日
- チャット
- iBeaconによる来店通知
それぞれどんな感じで実装したか、書く気があるうちに書いておきます。
I. チャット
基本方針は速度優先です。現状、チャットの実装で最速の手段はLINE Botを使い実装すらしないというのが最適解です。
実際そのような方針をとったところを2組程度お見かけしました。
今回はBotの返すデータをBluemix上のWatsonサービス群を使ってパーソナライズしたいということを見据え、自分で実装しました。
ですが、今振り返るとLINE Botで良かったような。要反省ですね。
I.I UserInterface
OSSを使って実装しました。使ったのはJSQMessagesViewControllerです。
この辺を参考にして実装しました。というか、サンプルアプリを改変して実装しました。
- JSQMessagesViewController/SwiftExample/SwiftExample at develop · jessesquires/JSQMessagesViewController · GitHub
- JSQMessagesViewController/getting_started.md at develop · jessesquires/JSQMessagesViewController · GitHub
- [iOS] JSQMessagesViewController でチャットアプリを実装する | Developers.IO
この辺り見た感じだとFirebaseを組み合わせるとより高速化できたんじゃないかと思います。
I.II. Network
慣れた道具で手早くが理想ですが、せっかくなのでSwiftで書いてました。こちらもOSS利用が基本方針です。
SwiftyJSON
サーバーから受信したJSONをパースするのにSwiftyJSONを利用しました。
-
GitHub - lingoer/SwiftyJSON: The better way to deal with JSON data in Swift
-
[iOS 8/Xcode 6] SwiftではじめるiOS開発 #3 [API取得&JSONパース] | Developers.IO
NSURLSession
通信にはNSURLSessionを用いてAlamofireは使いませんでした。今思うと使っておけばよかったです。
ポーリング・非同期処理・同期処理(dispatch_async)
なお、データの更新にはdispatch_asyncとか使って並列処理を書き、ポーリングしてやってました。
この実装の最中、mainスレッド以外でUI部分の更新をしてはいけないのを忘れていて、バグを発生させたりもしてました。
こうやって見てみると、WebSocketとか、Firebase SDKとか使いたくなります。
II. iBeacon
Pepperに近づいたという情報を取得するため、iBeaconを利用しました。
なお、用語(セントラルとかペリフェラルとか)は次をご参照ください。
II.I. セントラル(BLE信号の受け手側): CoreLocation
定石通り、CoreLocationを使いました。とはいえ、全く苦労しなかったわけではないです。
II.II. ペリフェラル(BLE信号の発信側)
モノを持っていなかったので実装しようとしてハマりました(後述)。結局、AppStoreからiBeacon ScannerをDLし、iPhoneやiPadをiiBeaconとして動作させて解決しました。
III. ハマったところ
上記の通り色々やりましたが、何事も無く順調なわけでもなかったです。
III.I. CocoaPods利用不可
開発しようとしたらOS X を El Capitanにアップデートしていたのでrootlessの影響をバッチリ受けてCocoaPods利用不可になってました。
頑張ってインストールするフォルダを変更して対処しました。
III.II. JSQMessagesViewControllerがSwiftじゃない
せっかくなのでSwiftで開発しようとしたらJSQMessagesViewControllerがObjective-C。
普通にObjective-C bridging headerを作成して対処しました。
でもよく見るとJSQMessagesViewControllerがSwift対応済みでした。結局、SwiftExampleフォルダ以下のサンプルプロジェクトを利用しました。
III.III. 画面遷移がSegueだけどSegueよく知らない
調べればなんとかなる。
III.IV. ViewControllerのプロパティ
プロパティにvarを使ったらinitを実装しなければいけないのだけれど結構面倒でした…。なおかつ、ViewControllerのインスタンスを作成した時点では確定しないものについてはOptional を使わなければいけないから結構気を使いました。(nilでアプリが落ちた箇所については後述)
III.V. Settings.bundleでの設定ができない
アプリへの設定用画面を作るのが面倒だったので、Settings.bundleを用いた設定アプリの利用をやろうとしたときのこと。
アプリインストール直後、何らかの値の保存前ににSettings.bundleにアクセスするとnilへのアクセスになって、強制アンラップすると落ちます。
結局、アプリの設定要画面を作成してSettings.bundleは使いませんでした。
III.VI. UIButtonの枠線設定がInterfaceBuilderからできない
「いつもやってるのになんで出来ないんだろ」と思っていたら、クラスを書くのを忘れていました。これは本当に便利なのでXcode側で実装しておいてくれないかな。
III.VII. 数値と文字列の相互変換
Swiftでの数値と文字列の相互変換はSwiftのバージョンによって書き方が違うのに驚きました。こんなところまでまだ変わっていくんですね。
III.VIII. 忘れてたATS
アプレッソ様のDataspiderを利用させて頂いたのだけど、まずつながらなかった。サーバー側にHTTPリクエストが届いていない状態だったので悩んだのだけど、よく考えなくてもATSでした。最近のiOSではHTTPSがこういう形で強要されてるの忘れてました。
III.IX. MacをiBeacon化できない
iBeacon持っていないのにiBeaconの実装しなければいけないけどmacをiBeacon化すれば行けるだろ、そう思っていた時期がありました。
でも動かない。理由はNode.jsのバージョンが適していなかったためのようです。
面倒だったので諦めてiOSアプリiBeacon Scannerを使いました。
III.IX. iPhoneをiBeacon化できない
でも動かない。1時間位ハマりました。色々試しましたが、最終的に分かったことは「iPhoneのBlueToothがOffになっていたのでiBeaconとして動作しない」ということでした…。
iBeacon Scannerを使うときにはBlueToothをOnにしましょう。
III.X. アプリのアイコン画像を用意するのが面倒
アプリアイコンは一つの画像じゃなくていくつもサイズを用意して一つ一つ手作業登録という作業をなんとかしたいのですが、今回そういう方法は見つからなかったのでひとつひとつ手作業で登録してます。
せめてアイコンの画像くらいは自動生成したかったので、1024x1024の画像をWebサービスでリサイズして利用しました。
III.XI. アプリ名の変更の仕方を忘れてた
プロジェクトの設定でどこに何を設定するとどういう効果があるのかを理解できる日はいつ来るのでしょうか。アプリ開発指南書はたくさんありますが、プロジェクトの設定項目について解説しているものはほとんど見かけないような気がします。
今回もホーム画面で表示されるアプリ名を変更したかっただけだったのですが、それがどこで設定されているのか分からず、次の記事にあるすべての箇所で変更を行いました。
III.XII. JSQMessagesViewControllerのアイコン画像が設定できない(未解決)
本当に自分でも呆れてるのですが、UIImageがうまく使えませんでした…。近いうちにリベンジします。
III.XIII. Swiftで書いたソースにBreakpointを設定したときのXcodeの動作がObjective-Cと違う(未解決)
Objective-Cだと「ここ!この行だよ今実行しているのは!あとそれぞれのオブジェクトの中身今こんな感じね!」って感じに表示してくれるのですが、Swiftだと「Breakpoint来たから止めたで。行数はこの画面のどこかに探したから自分で探せや」って感じでした。
この辺りは慣れなんですかね…?
IV. その他
Swiftの基本文法は調べながら書いてました。こういうのは検索する必要なく調べられるようになっておきたいです。
最後に
Pepperを使ったハッカソンに参加するのはコレで3度目なのですが、1度目に作ったアプリは「Pepperの操作をiPhoneから行う」というものでした。これはこれで悪くないかもしれないのですが、個人的には方向性を誤ったとそれ以降反省しているシロモノです。
それ以降、2回目、3回目とPepperに指示を出さないアプリに取り組んでみたのですが、今回は「Pepperとコミュニケーションする」というコンセプトを部分的に実現できた点は進歩かなと。
実際、Pepperを何かを行うためのツールとして捉えると、大概の場合他にもっと良い手段があります。技術的に捉えると、Pepperは胸にブラウザが搭載されている人型のLinuxマシンで、カメラやスピーカー・近接センサーがついています。LinuxマシンというよりはAndroidの方が近いかもしれないです。が、センサーは高級Android端末ほどではありませんし処理能力もあんまり高くないです。何らかの処理を行うためのスペックは低いといって差し支えないと思います。
一旦角度を変えて過去に視点を向けます。今までに流行したコンシューマー用ロボットはあまりなく、家庭に入りこんだ例はほとんどありません。例外は2つあり、Aiboとルンバです。特にAiboは「ロボットに人間が奉仕する」形で使われているため、通常のコンピューターやロボットの用途とはかけ離れています。
個人的に、Pepperがコミュニケーション用のロボットだというのは、Pepperの持つ何らかの機能を指すのではなく、人間がPepperから影響をうけて何かしたくなる人間側の錯覚を指すのだと理解しています。Pepperの手助けをしたくなるような、Pepperに奉仕したくなるような、我々の持つ感覚を呼び起こすのがPepperというロボットの特徴ではないでしょうか。
というわけでそういったアプリを作成してみたいのですが、過去に余り例がないのですよね。シーマン・たまごっち・デジモンあたりの育成アプリが参考になるでしょうか。次はもっと役に立たないアプリを作成しようと思います。