2014年2月25日火曜日

アプリのクラッシュ検知・クラッシュレポート系ライブラリを調べてみた

アプリのクラッシュを検知したり、クラッシュレポートを作成したりするライブラリやサービスを試してみたくなったので色々調べてます。まだ実際に検証できていないので主に自分用メモです。

■なぜクラッシュ検知なのか?

以下の様なメリットが考えられます。
  • アプリのクラッシュを100%絶対完全に阻止する方法は無い。どんなアプリでもクラッシュする可能性がある。
  • 開発者のメリットとして、クラッシュ時に詳細なクラッシュレポートやクラッシュログを数多く収集することができれば、迅速確実な修正が可能になり、結果としてユーザーのメリットに繋がる。
  • ユーザーのメリットとして、クラッシュを検知して即座に編集中データが失われないよう退避したり、次の起動時に同じクラッシュが発生しないようセーフモード起動するなどの措置を開発者が取ることができるかもしれないので、利便性向上につながる。
  • アプリを通じたサービス提供者のメリットとして、カスタマーサポートに飛んでくる何の付加価値もない「動きません」「落ちます」といった苦情を具体的に解決しやすくなり、カスタマーサポート品質を高めたり要員コストを削減したりすることが可能になるかもしれない。
  • ゲームなどでは、例えばクラッシュが発生したら、次の起動時に1つのバージョンに付き1回だけ自動的に詫び石が配られる仕組みなどを作ることができるかもしれない。ゲームのキャラクターにごめんなさい><と謝らせるとなおグッドかもしれない。
逆にデメリットもあって、例えば
  • クラッシュ検知の仕組みが入ることで動作がかえって不安定になるおそれがある。SDK自体が問題を起こすなど。
  • クラッシュ検知の際に対応して行う処理がかえって致命的な問題を起こすリスクもある。exception handlerやsignal handlerを捕まえて検知する仕組みのため、それらを利用している他のSDKなどと競合するおそれがある。
  • 当然それらの機能の分だけ実装とQAと保守のためのコストが上がる。
  • 特にプロプライエタリなサービスのものに関しては会社の方針で導入ができないことがある。
メリデメをよく考えて導入する必要がありそうです。

■サービスとして提供されているもの

以下のページのまとめが詳しいです。
http://www.raywenderlich.com/33669/overview-of-ios-crash-reporting-tools-part-1

Crashlytics
http://try.crashlytics.com

Crittercism
https://www.crittercism.com

Bugsense
https://www.bugsense.com

TestFlight (クラッシュ検知以外の方が有名)
https://www.testflightapp.com

HockeyApp (クラッシュ検知以外の仕組みもある)
http://hockeyapp.net

■オープンソースなもの

KSCrash (iOS)
https://github.com/kstenerud/KSCrash

ACRA (Android)
https://github.com/ACRA/acra

実際に使ってみてまたレポートなど書いてみようと思います。

2014年2月24日月曜日

Google Analytics for iOS SDK バージョン3で自動セッションマネージメントをするライブラリを書きました

Google Analytics for iOS SDK バージョン3にちょっとした機能を追加するライブラリを書いてみましたので公開いたします。

https://github.com/akisute/GAI-AutomaticSessionManagement

iOS 5.0以上で動作します。MITライセンスです。

■これは何?

Google Analytics for iOSは皆さんご存知の通りiOSアプリのセッション解析を行ってくれるSDKです。WebのGoogle Analyticsと同様に、ユーザーさんがどれぐらい、どのように自分のアプリを使ってくれているのかを調査することができます。

そんな便利なGoogle Analyticsなのですが、iOS向けのSDKバージョン3から何故か自動セッションマネージメント機能がなくなってしまいました。すなわちアプリがHomeボタンを押されてバックグラウンドに入ったとしてもセッションが自動的に切れないためセッション数およびセッション時間の正しい計測ができません。iOS SDKバージョン2以前、およびAndroid SDKバージョン3では相変わらず自動セッションマネージメント機能が有効になったままのため、何も考えずにSDKを導入するとAndroidとiOSで大幅に数値が異なるという悲しい事態に陥ります。多分大人の事情なんだろうと思います

ということでこのライブラリを作りました。このライブラリを突っ込めばこれまでどおりアプリがバックグラウンドに入ったら自動的にセッションが切れます。他にも同じように困っている人が居るはずだと思って似たようなことをしている人を探してみたのですが、まったく見つからず困ったので自分で作ることにしました。

インストール方法や使い方などはgithubのリポジトリを見ていただければと思います。

2014年1月18日土曜日

ユビレジを支える技術


年末にユビレジさんのところでちょっと仕事のお手伝いをさせていただいたので、その時の内容をご紹介させていただきます。

■ユビレジって何?

iPadをキャッシュレジスタに変えてしまうサービスです。会計からレシートの印刷までやってくれます。最近飲食店などでレジがなくiPadだけが置いてあるお店などを散見するかと思いますが、アレがそうです。一般的なキャッシュレジスタ+店舗システムよりもはるかに安価で導入でき、しかも使いやすいというのがウリです。

開発者的に言うと、Scalaモヒカン@kmizuさんやiOSモヒカン@k_katsumiさんなどが在籍されていまして、エンジニアのレベルが高いです。

■開発スタイル

少人数のため、厳密なウォーターフォール管理やアジャイル/スクラムなどは無く、チケット/Issueベースの開発になっています。githubをフル活用します。すべてPull Request(以下PR)ベースで開発され、すべてのPRについてレビュー/CI完備です。forkして修正してPRを投げると自動的にJenkinsがテストを回し、githubのPRページに問題なし/問題ありのコメントを投げるところまで自動化されています。正直半端ないです。

完全に裁量労働になっているため、エンジニア勢は猛烈に朝が遅いです。全員が揃うのが普通に昼過ぎだったりします。朝が弱い人でも安心です。

社内コミュニケーションのためにHipChatを使用しています。使用したのは初めてだったのですが、SkypeやIRCよりも以下の様な点で非常に使いやすく魅力的でした。もし機会があれば私もHipChatを導入したいです。

  • IRCと異なり、自分がいない間の過去ログがきちんと残る。
  • Skypeと異なり、APIが公開されているためbotが作りやすい。Jenkinsやgithubとの連携もらくらく。
  • SkypeやIRCと異なり、モバイルアプリの出来が非常に良い。
  • ただし、SkypeやIRCに比べて外部のお客さんを誘うときにちょっと抵抗があるかも。

■サーバサイド

Railsです。私が余りRailsに詳しくないのと殆ど触ってないのでどうすごいのかよくわからなかったのですが、確かRails 3.X系を使用していて、ちょうど4にアップグレードする作業を進めていたかと思います。コードは全PRがレビューされているだけあってものすごい綺麗です。

先述の通りCucumberテスト完備です。
ドキュメントもAPIを外部公開しているので (http://ubiregiinc.github.io/ubiregi-api/) ある程度揃っていますが、完備と言うまでではありません。必要に応じてコードを読めスタイルです。私も結構読みました。というわけでクライアントサイドのエンジニアの方でもある程度以上サーバサイドを理解している必要があります。

フロントエンドまわりの技術については私が係る箇所がなかったためよくわかりませんでした。すみません(´・_・`)

インフラはHerokuを使用してます。デプロイもgithubから一発という仕組みになっています。

■クライアントサイド

ユビレジは現在iPadでのみサービスを展開されているので必然的にクライアントはiOSでiPad向けのみとなっています。ここだけ聞くとiOS/Android両対応だのハンドセット/タブレット両対応だのが必要ないため簡単そうに思えますが、そんなことは全くありません。お客さんがお金を払ってサービスを導入するB2Bアプリで、かつレジという会計を扱うアプリであるため並大抵の無料B2Cアプリとは比較にならないレベルで不具合が許されません。さらに注文を取るハンディ機などの外部アプリ連携、レシートプリンタなどの外部ハードウェア連携、サーバとの会計情報同期、iOS 5&初代iPad対応などが要求され、会計回数も大規模なお店だとそれなりの件数に達するためCore Dataもパフォーマンス最適化が必要になるなど、実はそれなりに難易度が高いです。iOS 7にiPadでのみ発生する問題が多いのも逆風ですね。

まずModel層について、データストアはCore Data+自作の薄いラッパです。MagicalRecordはちょっと複雑で大規模すぎるため導入していないとのことです。通信周りは普通にAFNetworking (1.X系)を使用。2.X系は今後iOS 5を切ってから導入する流れになるのではないかなとのことです。

View層についてはほぼすべてStoryboard/xib化されていますし、Segueもバリバリ使います。シンプルなUIが多いため派手派手なUIライブラリはほとんど使用していませんが、広い画面を有効に使う必要があるiPadアプリならではとして、Container View Controllerの概念をよく使うことになっています。

ちょっと変わっているのが、ビジネス用途で使うためSingle App Modeを有効にしてユーザーがホームボタンを押してもユビレジアプリから外に出られないように設定するのですが、この設定を有効にした時にモーダルなView Controllerを出すと問題が生じる場合があるのでワークアラウンドを導入していたりなどします。こういう問題は普通のB2Cアプリを作っているとほぼ気づかないので大変です。

それからユビレジ特有の問題としてハードウェア連携周りが挙げられます。このへんはは完全に自作です。Raspberry Piを使った自社ハードウェアとWiFi経由でデータをやりとりする仕組みになっています。普通のプロダクトではこういう開発が出来る場所は殆どないので貴重な体験になりました。

サーバサイドにもありますが、クライアントサイドにもfrankを利用した受け入れテストがある程度用意されていて、こちらもPR時に自動的に走るという仕組みになっています。ただしちょうど私が参加したのが次のアプリの大改修に備えていた時期だったため、テストの整備が追いついていない感じでした。

■まとめ

非常に短い期間だったのですが、エンジニアが一度は夢見る理想的な環境みたいなのをある程度実現されているのが素晴らしいと思いました。もちろん完璧というわけではなく今後も維持改善が必要なところがありますが、このような理想環境を一度体験してみたいというエンジニアの方には非常に魅力的な場所だと思います。

現在ユビレジさんはエンジニアの方を募集されているそうなので、興味を持たれた方は一度オフィスまで遊びに行ってみてはいかがでしょうか?