EDIT MODE

モバイルアプリ開発に関することを書いています

CollaboTips vol.2 に参加しました

主にデザイナーとエンジニアを対象として、お互いに役立つ Tips を披露するという勉強会に参加してきたので、そのレポートを書きたいと思います。

概要

主旨
デザイナーとエンジニアの垣根を取り払いたい人のための勉強会

イベントページ
http://collabotips.connpass.com/event/40038/

日時
2016年10月5日(水)19:30 - 21:30

場所
株式会社 FiNC

ハッシュタグ
#CollaboTips

f:id:androhi:20161005191949j:plain

ウェルネスタイム

まずは LT の前に、FiNC トレーナーの方によるウェルネスタイムから始まりました。FiNC で勉強会が開催される時は恒例となっているようです。参加者のほとんどがデスクワークのため、上半身を中心としたストレッチ行いました。

勉強会も基本座りっぱなしなので、こういうのはいいですね。他の勉強会でも取り入れると良さそうだなと思いました。

LT : 1人5分

LT は全部で10回あり、みなさんそれぞれが本当にいろんな視点での発表だったので、とても楽しく聞くことが出来ました。 以下、発表順に要約と感想を書かせて頂きます。(資料が公開されたら、随時リンクを貼っていきます。)

そして本勉強会では、 @nnnzzz000 さんによるグラフィックレコーディングが行われました!今回の勉強会のまとめとしては、そちらをご覧になると楽しく理解できると思います。(記事の最後に画像をアップしました。)

1. kanamorit さん

タイトル: デザイナとの協働を通じて分かったこと

要約: 協働することで大切なのは、相手の提案、考え方を受け容れ任せる所は任せる。

感想: 実際に現場での経験を話されていたので、とても興味深かったです。

2. yucovin さん

タイトル: プログラミングのすごいところ

要約: デザインとは違う楽しさがあるから、興味ある人はぜひやって欲しい。

感想: デザインとプログラミングの対比がとても納得&面白かったです。

3. masaki_ohsumi さん

タイトル: デザインエンジニアという考え方

要約: デザイナーとエンジニアの橋渡しをするポジションとして、デザインエンジニアという役割を考察する。

感想: 双方の努力で溝を埋められるのもいいけど、その役割を担う人を立てるという考えも、なるほど理にかなってるなと思いました。

4. よこ[りんごマーク]てっく さん

タイトル: PhotoShop でプログラムを使い効率化を図ろう!

要約: スクリプト機能を使うと面倒な作業や些細なミスを激減出来るので試してみて欲しい。デザイナーさんの場合、難しければ周りのエンジニアにお願いしちゃおう。

感想: 座標情報とか本当に大変そうなので、自動化素晴らしいなと思いました。

5. d_date さん

タイトル: Storyboard を使えるようになりたいデザイナーのための思考実験

要約: 簡単な UI を使えるようにしつつ AutoLayout を理解する。ただし Storyboad のコンフリクトに注意。

感想: 最近は sketch 使ってるデザイナーさん多いみたいだし、割とすんなり AutoLayout は理解できるんじゃないかなと個人的には思います。

6. MutsumiOkano さん

タイトル: パッションがとっても大切だった話し

要約: 技術やツールの話しをする前に、お互いの思い(=パッション)を共有する。

感想: 同じゴールを向いてコミュニケーションすることが大切と、理解しました。そういうのひっくるめてパッションと呼ぶのいいかもしれないですね。

7. tomomasa_masuzawa さん

タイトル: 見えないデザイン

要約: よりたくさんの人にサービスを使ってもらうために、アクセシビリティに注意を払おう。

感想: iOS の VoiceOver や Android の TalkBack は、一度自分で使ってみると重要さが分かりますよね。

8. fumiyasac さん

タイトル: デザイナーだった記憶を忘れないために自分なりに気をつけていること

要約: お互いの役割を理解した上で、歩み寄って作業をすると良い。自作アプリなどで実際に自分でいつもと違う役割を体験してみるのもいい。

感想: デザイナーとエンジニアの両方を経験するのは中々難しそうなので、もしそういう人に出会ったら良く話を聞いてみたいなと思いました。

9. JPMartha さん

タイトル: Collaboration

要約: ZenHub の GitHub Project Management のブログは一見の価値あり。ユーザーストーリーをきちんと考えて共有することが大切。

感想: 僕もあまりデザイナーさんとの協働について考える機会を持たなかったので、上記ブログを全部読んでみます。

10. akio さん

タイトル: なし(急遽発表となったため)

要約: iOS の UI パーツを理解するために PlayGround が便利

感想: iPad でプログラミング&実行が楽しめるのは本当に便利そうでしたが、やはりソフトウェアキーボードは辛そうだなと思いました。

まとめ

この勉強会はデザイナーとエンジニアの垣根にフォーカスしてましたが、突き詰めていくとやはり「良いチーム作りとは?」という問題に収束していくのかなと感じました。

少し前に「チームが機能するとはどういうことか」という本を読んだのですが、その中でも職種を横断したチーム作りについて述べられていたり、いかにメンバーを尊重する(決して譲るわけではない)かなど、この勉強会の答えに繋がりそうな内容が多かったなと思います。

ということで、良いプロダクトは良いチームがあってこそ!ということを、今回再認識出来たように思いました。

グラフィックレコーディング

冒頭でふれたグラフィックレコーディングの画像です。 発表を聞きながらスラスラと書かれていたのに、なぜこんなに綺麗にまとめられているのか不思議でなりません。

f:id:androhi:20161005210952j:plain

f:id:androhi:20161005211008j:plain

f:id:androhi:20161005211037j:plain

分割されたv4 Support Librariesのリスト

1. 概要

Android Support Library のバージョン 24.2.0 がリリースされましたが、このバージョンから v4 Support Library を分割されたものが使えるようになりました。

参考:Support Library Features

以下の Library 群として提供されています。

  • support-compat
  • support-core-ui
  • support-core-utils
  • support-fragment
  • support-media-compat

とはいえ、Support Library 群で最も大きかった v4 なので、どのライブラリに何があるのか分からないのが不便だったので、調べてみました。

2. パッケージ構成

support-compat

  • android.support.v4.accessibilityservice
  • android.support.v4.animation
  • android.support.v4.app
  • android.support.v4.content
  • android.support.v4.content.pm
  • android.support.v4.content.res
  • android.support.v4.database
  • android.support.v4.graphics
  • android.support.v4.graphics.drawable
  • android.support.v4.hardware.display
  • android.support.v4.hardware.fingerprint
  • android.support.v4.internal.view
  • android.support.v4.net
  • android.support.v4.os
  • android.support.v4.text
  • android.support.v4.text.util
  • android.support.v4.util
  • android.support.v4.view
  • android.support.v4.view.accessibility
  • android.support.v4.view.animation
  • android.support.v4.widget

support-core-ui

  • android.support.v4.app
  • android.support.v4.view
  • android.support.v4.view.animation
  • android.support.v4.widget

support-core-utils

  • android.support.v4.app
  • android.support.v4.content
  • android.support.v4.content.res
  • android.support.v4.graphics
  • android.support.v4.graphics.drawable
  • android.support.v4.print
  • android.support.v4.provider
  • android.support.v4.text

support-fragment

  • android.support.v4.app

support-media-compat

  • android.support.v4.media
  • android.support.v4.media.session

パッケージ単位で分割されているわけではないので、これだけ見てもよく分かりませんね。(support-compat は、まだでかいなというは分かりますが。)

どのライブラリを使えばいいかは、クラスごとに見てみないと判断が難しそうです。

3. 提供しているクラス

注)以下のリストは、API互換性のための実装クラスは除いてあります。

support-compat

android.support.v4.accessibilityservice

  • AccessibilityServiceInfoCompat

android.support.v4.animation

  • AnimatorCompatHelper
  • AnimatorListenerCompat
  • AnimatorProvider
  • AnimatorUpdateListenerCompat
  • ValueAnimatorCompat

android.support.v4.app

  • ActivityCompat
  • ActivityManagerCompat
  • ActivityOptionsCompat
  • AppOpsManagerCompat
  • BundleCompat
  • BundleUtil
  • NotificationBuilderWithActions
  • NotificationBuilderWithBuilderAccessor
  • NotificationCompat
  • NotificationCompatExtras
  • NotificationCompatSideChannelService
  • NotificationManagerCompat
  • RemoteInput
  • ServiceCompat
  • ShareCompat
  • SharedElementCallback

android.support.v4.content

  • ContentResolverCompat
  • ContextCompat
  • IntentCompat
  • ModernAsyncTask
  • ParallelExecutorCompat
  • SharedPreferencesCompat

android.support.v4.content.pm

  • ActivityInfoCompat

android.support.v4.content.res

  • ConfigurationHelper
  • ResourcesCompat

android.support.v4.database

  • DatabaseUtilsCompat

android.support.v4.graphics

  • BitmapCompat

android.support.v4.graphics.drawable

  • DrawableCompat
  • DrawableWrapper
  • TintAwareDrawable

android.support.v4.hardware.display

  • DisplayManagerCompat

android.support.v4.hardware.fingerprint

  • FingerprintManagerCompat

android.support.v4.internal.view

  • SupportMenu
  • SupportMenuItem
  • SupportSubMenu

android.support.v4.net

  • ConnectivityManagerCompat
  • DatagramSocketWrapper
  • TrafficStatsCompat

android.support.v4.os

  • AsyncTaskCompat
  • BuildCompat
  • CancellationSignal
  • EnvironmentCompat
  • OperationCanceledException
  • ParcelableCompat
  • ParcelableCompatCreatorCallbacks
  • ResultReceiver
  • TraceCompat
  • UserManagerCompat

android.support.v4.text

  • ICUCompat
  • TextDirectionHeuristicCompat
  • TextDirectionHeuristicsCompat
  • TextUtilsCompat

android.support.v4.text.util

  • LinkifyCompat

android.support.v4.util

  • ArrayMap
  • AtomicFile
  • CircularArray
  • CircularIntArray
  • ContainerHelpers
  • DebugUtils
  • LogWriter
  • LongSparseArray
  • LruCache
  • MapCollections
  • Pair
  • PatternsCompat
  • Pools
  • SimpleArrayMap
  • SparseArrayCompat
  • TimeUtils

android.support.v4.view

  • AccessibilityDelegateCompat
  • ActionProvider
  • GestureDetectorCompat
  • GravityCompat
  • InputDeviceCompat
  • KeyEventCompat
  • LayoutInflaterCompat
  • LayoutInflaterFactory
  • MarginLayoutParamsCompat
  • MenuCompat
  • MenuItemCompat
  • MotionEventCompat
  • NestedScrollingChild
  • NestedScrollingParent
  • OnApplyWindowInsetsListener
  • PointerIconCompat
  • ScaleGestureDetectorCompat
  • ScrollingView
  • TintableBackgroundView
  • VelocityTrackerCompat
  • ViewCompat
  • ViewConfigurationCompat
  • ViewGroupCompat
  • ViewParentCompat
  • ViewPropertyAnimatorCompat
  • ViewPropertyAnimatorListener
  • ViewPropertyAnimatorListenerAdapter
  • ViewPropertyAnimatorUpdateListener
  • WindowCompat
  • WindowInsetsCompat

android.support.v4.view.accessibility

  • AccessibilityEventCompat
  • AccessibilityManagerCompat
  • AccessibilityNodeInfoCompat
  • AccessibilityNodeProviderCompat
  • AccessibilityRecordCompat
  • AccessibilityWindowInfoCompat

android.support.v4.view.animation

  • PathInterpolatorCompat

android.support.v4.widget

  • CompoundButtonCompat
  • EdgeEffectCompat
  • ListPopupWindowCompat
  • ListViewCompat
  • PopupMenuCompat
  • PopupWindowCompat
  • ScrollerCompat
  • SearchViewCompat
  • TextViewCompat
  • TintableCompoundButton

support-core-ui

android.support.v4.app

  • ActionBarDrawerToggle

android.support.v4.view

  • AbsSavedState
  • AsyncLayoutInflater
  • NestedScrollingChildHelper
  • NestedScrollingParentHelper
  • PagerAdapter
  • PagerTabStrip
  • PagerTitleStrip
  • ViewPager

android.support.v4.view.animation

  • FastOutLinearInInterpolator
  • FastOutSlowInInterpolator
  • LinearOutSlowInInterpolator
  • LookupTableInterpolator

android.support.v4.widget

  • AutoScrollHelper
  • CircleImageView
  • ContentLoadingProgressBar
  • CursorAdapter
  • CursorFilter
  • DrawerLayout
  • ExploreByTouchHelper
  • FocusStrategy
  • ListViewAutoScrollHelper
  • MaterialProgressDrawable
  • NestedScrollView
  • ResourceCursorAdapter
  • SimpleCursorAdapter
  • SlidingPaneLayout
  • Space
  • SwipeProgressBar
  • SwipeRefreshLayout
  • ViewDragHelper

support-core-utils

android.support.v4.app

  • AppLaunchChecker
  • NavUtils
  • TaskStackBuilder

android.support.v4.content

  • AsyncTaskLoader
  • CursorLoader
  • FileProvider
  • Loader
  • LocalBroadcastManager
  • PermissionChecker
  • WakefulBroadcastReceiver

android.support.v4.content.res

  • TypedArrayUtils

android.support.v4.graphics

  • ColorUtils

android.support.v4.graphics.drawable

  • RoundedBitmapDrawable
  • RoundedBitmapDrawableFactory

android.support.v4.print

  • PrintHelper

android.support.v4.provider

  • DocumentFile
  • RawDocumentFile
  • SingleDocumentFile
  • TreeDocumentFile

android.support.v4.text

  • BidiFormatter

support-fragment

android.support.v4.app

  • BackStackRecord
  • DialogFragment
  • Fragment
  • FragmentActivity
  • FragmentContainer
  • FragmentController
  • FragmentHostCallback
  • FragmentManager
  • FragmentManagerNonConfig
  • FragmentPagerAdapter
  • FragmentStatePagerAdapter
  • FragmentTabHost
  • FragmentTransaction
  • ListFragment
  • LoaderManager
  • NoSaveStateFrameLayout
  • SuperNotCalledException

support-media-compat

android.support.v4.media

  • MediaBrowserCompat
  • MediaBrowserCompatUtils
  • MediaBrowserProtocol
  • MediaBrowserServiceCompat
  • MediaDescriptionCompat
  • MediaMetadataCompat
  • RatingCompat
  • TransportController
  • TransportMediator
  • TransportMediatorCallback
  • TransportPerformer
  • TransportStateListener
  • VolumeProviderCompat

android.support.v4.media.session

  • MediaButtonReceiver
  • MediaControllerCompat
  • MediaSessionCompat
  • ParcelableVolumeInfo
  • PlaybackStateCompat

4. どのくらいの容量削減が見込めそうか?

公式サイトには

For backwards compatibility, if you list support-v4 in your Gradle script, your APK will include all of the v4 modules. However, to reduce APK size, we recommend that you just list the specific modules your app needs.

という記述があり、support-v4 を必要なものだけ組み込む方が、APK サイズが小さくなるらしいので試してみました。

以下のような条件で、アプリの APK サイズを比較してみた結果です。

共通の条件

  • Android Studio v2.1.3 で新規プロジェクトを EmptyActivity で作成
  • ProGuard なし
  • Debug ビルド
  • compileSdkVersion 24
  • support library 24.2.0
Library Size
アプリ A support-v4 1,323,263 byte
アプリ B support-core-ui
support-core-utils
support-fragment
1,322,866 byte

ということで、その差は 397 byte でした。ProGuard かければもっと差が出てくれるでしょうけど、それにしても微々たるものですね。

今回は support-compat を外して検証しましたが、仕事で触ってるアプリだったら必要だし、結局あまり分割の恩恵を受ける機会は少なそうだなと感じました。 それだけ support-v4 のお世話になってるってことですね。

「独習Python入門-1日でプログラミングに強くなる」を読みました

Python で Android アプリの Publishing を自動化するのをやりたくて、Python 入門本を探していたところ、会社の人が本書を献本いただいたという話しを聞き、お借りして読んでみたので感想を書きます。

読んだ本はこちらです。

gihyo.jp

本書の概要

本にも対象読者が記載されていますが、これからプログラミングを始める人を想定した内容となっています。

Python 言語については、その題材として用いられている側面が強く、前半は Python に限らずプログラミングの基本的な内容がメインです。後半では、Python の言語仕様やオブジェクト指向などにも触れ、Python でのスクレイピングや Web アプリケーション作成のサンプルを試したりと、より実践的な内容でした。

良かった点

一通り読み終えて、良かったなと思った点を挙げてみます。全体的な感想は最後に書いたので、ここでは具体的な内容を挙げながら、良かった点を書きました。

1. ソフトウェア・エンジニアとしても入門させてくれる

本書はプログラミング初級者向けなので、Python のセットアップや基本的な構文、関数とは?といった内容が続くのですが、ソフトウェア・エンジニアとして必要となる知識についても丁寧にフォローしてくれます。

ざっくり書くと、文字コード、絶対パス・相対パス、DRY、関数を上手に作るコツ、テストを書く理由、プロトコル(主にHTTP)などなど。最初は知らなくても何とかなるけど、良いエンジニアになるためには避けては通れないことが分かりやすく書かれています。

プログラミングを学び始めるタイミングで、これらのことを一緒に学べるように構成されているのは、素晴らしいなと思いました。

2. 広範囲な内容にも関わらず、要点は丁寧に説明されている

本書で扱っている内容は、概要でも書いた通りかなり広範囲です。オブジェクト指向や例外処理、ユニットテスト、さらには Python を使ったスクレイピングや Web アプリケーションについても触れています。

これだけの内容にも関わらず、くだけた分かり易い比喩や図解などのおかげで、基本的な部分を無理なく理解できるように工夫されているなと感じました。 もちろんサンプルコードは GitHub で公開されているので、動くコードが簡単に試せるようにも配慮されています。

3. 最終章のまとめのクオリティが素晴らしい

最後の1章は、まるまる本書全体のまとめになっています。このような構成は初めて目にしたのですが、すごくいいなと思いました。各章で重要なポイントが簡潔にまとめられていて、後でさっと読み返したいときなどは、このまとめの章を読むだけでも復習になりそうです。

さらに、読者が今後の学習の参考になるようにと、筆者の考えやおすすめの本を紹介しているのですが、きちんとテーマごとに分けて解説しているため、プログラミング初級者にとってはものすごく参考になりそうだなと思いました。

物足りなかった点

良くなかったと思った点は特に無かったので、個人的に物足りなかった点を書きました。

1. Python についてもう少し触れて欲しかった

プログラミング入門としての側面が強いためか、Python そのものについては本当に基本的な部分を抑えるに留まっているなと感じました。 ただその点は筆者も意図しているらしく、本書の中で Python の入門本はぜひ別途読んで欲しいと書かれているので、なるほどなと思っています。

2. もう少しボリュームがあっても良かったかも

これは単に既に知っている内容が多かったから、そのように感じただけだと思いました。

とは言え、スクレイピングや Web アプリケーションの章については、もう少しボリュームがあったら良かったのになと感じました。サンプルは本当にミニマムなコードなので、もう少し実用性を感じられるやや大き目のサンプルだと良かったなと感じました。

個人的な感想

前述しました通り、本書はプログラミング入門本としての側面が強いので、既にプログラミングの経験がそれなりにある人には、簡単すぎる内容かと思います。なので、そういった人が Python を新たに学びたいというケースで選ぶ本では無いように思います。

しかし、これからプログラミングを始めたい、勉強したいという人には、とても素晴らしい本だと思います。今後、もし誰かに「プログラミングをどうやって勉強したらいい?」と相談されることがあれば、僕はきっと本書をすすめると思います。本当に素晴らしい入門本だと思います。

ちなみに、中・上級のプログラミング経験者が読むメリットもあると思っています。初級者に何を説明すればいいのか?それらをどのように説明すると理解しやすいのか?といった視点で読むと、なるほどなと思える部分が多々ありました。普段当たり前のようにやっていることを、うまく説明するのはとても難しいですから...。

最後に一通り読んでみて、「プログラミング入門」とか「Python で始めるプログラミング」みたいなタイトルの方が良かったのになという感想で終わりにしたいと思います。

Firebase Analytics Guide

前回は Firebase Analytics の概要をまとめたのですが、ドキュメントや Google I/O 2016 のセッション動画などを見て、もう少し具体的な内容をまとめたいなと思い、この記事を書きました。

androhi.hatenablog.com

Firebase Analytics の位置づけ

Firebase Analytics は、Firebase のコアとして、無料かつ無制限のアナリティクス・ツールとなっています。 Google I/O 2016 での各セッションでも、そのことが繰り返し述べられていました。

Google Analytics とは異なり、モバイルアプリのためのツールとなっているため、対象となるプラットフォームは現在のところ Android と iOS のみとなっています。

なお Google Analytics との違いは、以下のヘルプページで詳しく解説してありました。

上記にも記載がありますが、Google Analytics との大きな違いは以下の2点だと思います。

  1. イベントベースのデータ収集モデル
  2. いくつかのイベントやプロパティの自動測定

どのように機能するのか?

Firebase Analytics は、iOS もしくは Android アプリでいくつかのイベントとユーザープロパティを、自動で収集してくれます。 どのような項目を自動収集するのかは、以下のページに詳細があります。課金イベントも自動で収集されるのは嬉しいですね。

これらの自動収集されたデータは、Firebase console のダッシュボードで確認することができます。

f:id:androhi:20160527003216p:plain

他のサービスとの統合

Firebase Analytics は、他の Firebase サービスのログも収集することができ、それらをダッシュボード上で確認することが出来ます。 たとえば Notifications の通知イベントは、自動収集対象にもなっているので下図のように細かくログを確認することが出来ます。

f:id:androhi:20160603014823p:plain

他のサービスについては、どのように統合されているのかを示すにはサンプルアプリでは限界があるので、以下の Google I/O 2016 のセッション(英語)を見ていただくのがいいかと思います。

Analytics の基本的な使い方

Analytics では、最初に次の 1〜4 を行ったあと、必要に応じて 3 と 4 を繰り返していくことを想定しているようです。それぞれの手順を、以下にまとめました。

1. アプリを Firebase に接続する

"Get started with Firebase Analytics for Android" を参考に、解析したいアプリでデータの自動収集が行われるようセットアップします。 詳細は上記サイトを見ていただいて、以下はおおまかな流れです。

a. Firebase SDK のセットアップ

やるべきことは次の3つです。

  • Firebase console にアプリのパッケージ名(=ApplicationId)を登録
  • build.gradle を編集
  • app/build.gradle を編集
b. FirebaseAnalytics オブジェクトの初期化

ドキュメントには、アプリのサインイン・アクティビティの onCreate() メソッドに、以下の初期化処理を書くように記載されています。

// Obtain the FirebaseAnalytics instance.
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
c. [オプション]: ログイベントの使い方

いくつかのイベントは、b までのステップが完了したらログは自動収集されますが、もちろん開発者が自分でログを送信するイベントを記述する方法も用意されています。 以下のように、 logEvent() メソッドを使って実現します。その際、自動収集対象のイベントは FirebaseAnalytics クラスに定数として用意されているので、それを使用することも可能です。

Bundle bundle = new Bundle();
bundle.putString(FirebaseAnalytics.Param.ITEM_ID, id);
bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, name);
bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "image");
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle);

ちなみに、以下のように adb コマンドを叩くと logcat 上で logEvent() のログが見れるようになります。


ターミナルなどで

$ adb shell setprop log.tag.FA VERBOSE
$ adb shell setprop log.tag.FA-SVC VERBOSE
$ adb logcat -v time -s FA FA-SVC


logcat から抜粋

06-03 01:00:26.952 D/FA      (23012): Logging event (FE): select_content, Bundle[{_o=app, item_category=button}]
06-03 01:00:26.952 V/FA      (23012): Using measurement service
06-03 01:00:26.953 V/FA      (23012): Connecting to remote service
06-03 01:00:26.969 D/FA      (23012): Connected to remote service
06-03 01:00:26.970 V/FA      (23012): Processing queued up service tasks: 1
06-03 01:00:27.008 V/FA-SVC  (11813): Saving event, name, data size: select_content, 43
06-03 01:00:27.009 V/FA-SVC  (11813): Event recorded: Event{appId='com.androhi.firebaseextensionsample', name='select_content', params=Bundle[{_o=app, item_category=button}]}
06-03 01:00:27.025 V/FA-SVC  (11813): Upload scheduled in approximately ms: 3579219
06-03 01:00:27.027 V/FA-SVC  (11813): Background event processing time, ms: 55
06-03 01:00:31.977 V/FA      (23012): Inactivity, disconnecting from AppMeasurementService

2. カスタム・イベントのログを送る

これは前述した「ログイベントの使い方」とほぼ同じですが、以下のようにイベント名を任意の名称にすれば、独自のイベントとしてカウントされるという内容です。 ドキュメントでいうと、"Firebase Analytics - Log Events" の項目です。

Bundle params = new Bundle();
params.putString("image_name", name);
params.putString("full_text", text);
mFirebaseAnalytics.logEvent("share_image", params);

3. オーディエンスを作成する

いわゆる収集データのフィルタリングです。

イベントやユーザープロパティ、デバイスデータなどを使って、収集されたデータにフィルタをかけます。 Firebase console にて、下図のようにフィルタする条件を選択することができます。

f:id:androhi:20160603015007p:plain

4. ターゲットへの施策を実行する

手順3で施策を打ちたいターゲット層を決定し、他の Firebase サービス、例えば Notifications や Remote Config などを使って、プロモーションなどを行います。

f:id:androhi:20160603023905p:plain

補足:既に Google Analytics を使って場合はどうするのか?

以下の内容は、個人の見解です。

まずは公式の見解はどうなのかというと、Google のヘルプページに参考となる情報が載っていました。

  1. アプリ専用の企業の場合: Firebase Analytics をご利用ください
  2. ウェブサイトのみを運営する企業の場合: Google アナリティクスをご利用ください
  3. アプリとウェブサイトの両方を運営する企業の場合: Firebase Analytics と Google アナリティクスの両方をご利用ください

つまり今後モバイルアプリは、 Firebase Analytics を使って欲しいということのようです。確かにページビューなどによる計測は、アプリの場合あまり意味を成さないですし、無料枠での Google Analytics ではデータのサンプリングなども行われるので、すぐにでも Firebase Analytics に移行しても良い気がします。

それ以外では、以下の状況によって移行の是非や時期を関係者で良く話し合うのが、現実的なのかなと思います。

  • Google Analytics はプレミアムか?
  • AppIndexing や AdWords など、Firebase に統合されたサービスを使っているか?
  • 今後アプリのグロースを強化したいか?

ちなみに、上記3に該当するような場合、両方の管理画面をチェックするのが面倒になりそうですが、Google Analytics 上で Firebase Analytics のレポートを見られるように設定ができるようです。


参考:Google Analytics と Firebase Analytics の接続

f:id:androhi:20160603022250p:plain

f:id:androhi:20160603022316p:plain

まとめ

簡単な導入ステップされ終えれば、基本的なデータは自動的に収集されるので、まずは Firebase Analytics だけを先行して導入してみても十分なメリットが得られるように思います。(場合によっては、Google Analytics からの移行に検討が必要かもしれませんが。)

しかし、Firebase Analytics の真価は他のサービスとの連携にあるようなので、導入した際には積極的にアプリのグロース関係を始めとして、他のサービスの利用も検討してみるべきかなと感じました。

Firebase Analytics Overview

Firebase Analytics とは?

Google I/O 2016 で発表された、Firebase 拡張機能群のうちの1つです。

Google Analytics をモバイル向けに最適化したもので、特に「アプリの利用状況」と「ユーザーエンゲージメント」の監視に特化しているようです。 Android と iOS に対応していて、解析内容は専用の Firebase Console 上で確認できるようになってます。


f:id:androhi:20160527003313p:plain Firebase Console

公式のドキュメントはこちら。

Firebase Analytics Guides


拡張された Firebase の概要は、このセッションが参考になりました。(英語ですがデモが多くて見やすいです。)

Firebase Overview - Google I/O 2016

Firebase Analytics の利点

ざっと触った中で、(主に Google Analytics と比較して)良かった点を挙げてみようと思います。

なお以下は、個人的な見解です。

1. 導入および実装がものすごく簡単

Firebase Analytics のセットアップは驚くほど簡単です。
この公式の手順通り進めていけば、特に迷うことは無いと思います。 ちなみにAnalytics は Firebase-Core に含まれているので、上記の共通手順を終えるだけで組み込むことが出来ます。


注意点

"通常はスムーズにセットアップ出来ると思いますが、1点だけ僕がハマったところがあります。 Firebase Console は Google Account でログインした状態で使用しますが、ブラウザに複数アカウントをログインさせてる状態だと、設定ファイル(google-services.json)のダウンロードに失敗するようです。
もしそういった状況になった時は、Firebase Console で使用しないアカウントをログアウトしてから、再度 Firebase Console にログインするとうまくいくようになりました。"


プラグインとライブラリをセットアップしたら、Analytics のセットアップ方法にあるように、 FirebaseAnalytics.getInstance(Context) を Activity の onCreate() などで呼ぶだけです。 必要なコードの追加は、ものすごく少ないです。

getInstance() メソッドコール以降は、Analytics 側で自動でログを収集してくれるようです。 何を自動収集するかは、以下に書かれています。


f:id:androhi:20160527003216p:plain 収集されたイベントログ

Google Analytics で xml 書いたりログ送信処理書いたりしていたのが、嘘みたいな簡単さですね...

2. Web のダッシュボードが見やすい

下図のように、モバイルアプリに必要な項目に絞って各レポートが表示されており、とてもスッキリして見やすいです。 また、フィルターを組み合わせていけば、レポート表示をカスタムすることもできます。

個人的には普段 Android 端末メインなので、Console 全体が Material Design に沿って作られていることも良いなと思います。


f:id:androhi:20160527001921p:plain Analytics ダッシュボード

まだ細かく触っていないので、どこまで詳細な分析ができるか未知数ですが、Google Analytics よりも操作は直感的に行えるように思えました。

3. 他機能との連携が強力

Firebase Analytics の真価は、他の機能と一緒に使うことで発揮されるようです。 具体的にはこのあたりに、どういった連携がなされるのかが書いてあります。

中でも Firebase Notifications は、関連するイベントが自動で記録されたり、下図のように「送信数(予測)」や「既読率」なども計測できるようです。


f:id:androhi:20160527003647p:plain Notifications ダッシュボード

まとめ

Firebase Analytics は Google Analytics に比べると、シンプルでアプリに特化している分、使いやすくなっているなと思います。 加えて、導入も簡単で他の Firebase 機能との連携もあるなど、開発者視点だと今すぐにでも Google Analytics から移行したいほど、Firebase Analytics は良く出来ているなと感じました。

ただし、Web 的な指標がベースの Google Analytics とは、分析内容がかなり異なる部分もあります。そのため、もしその分析内容を共有しているメンバー(特に非エンジニアが含まれる場合)がいるようなプロダクトに投入したい場合は、しっかりと事前に検討が必要そうだとも思いました。

サンプルコード

この記事を書くにあたり、実際に Firebase Analytics と Firebase Notifications が動くサンプルアプリを、GitHub にアップしています。 とはいっても、本当に追加したコードは少ないので、ドキュメント見たほうが早いかもしれません...。

サンプルアプリ - GitHub

Zaim 開発合宿を開催しました

5月10日、11日の1泊2日で Zaim メンバーにて、開発合宿を行いました。 合宿地は、湯河原温泉にある「おんやど恵」という旅館です。

会議室を借りることが出来るので、そこで「普段気になってるけど中々実行出来ないタスクをやる」というコンセプトで、各メンバー取り組みました。

f:id:androhi:20160511171850j:plain

合宿で何をやったか?

合宿中にやるタスクについては、各々事前にいくつか候補を出しておきました。 合宿開始時に、実際にやるタスクを発表し、途中で進捗報告の発表も入れながら、メンバーが何をやっているのか共有するようにしました。

ちなみに合宿の大まかなスケジュールは、このような感じでした。

1日目

時間 内容
10:30 湯河原駅にて集合
11:00 おんやど恵に到着
会議室にて合宿開始
13:00 昼食
14:00 足湯などしつつ午後の部開始
18:30 夕食
20:00 温泉
21:30 ボードゲーム大会
??:?? 力尽きた者から就寝

2日目

時間 内容
08:00 朝食
09:00 午前の部開始
13:00 昼食
14:00 足湯などしつつ午後の部開始
18:00 合宿終了
18:40 湯河原駅にて解散

旅館はどうだったか?

今回宿泊した「おんやど恵」さんで、僕の主観ですが良かったな〜と感じた点を紹介します。

1. 足湯が気持ちいい

素敵な中庭を眺めながら、足湯に浸かることが出来ます。 さらにその中庭を見ながら、朝食や夕食を取ることが出来るので、とても癒やされました。

f:id:androhi:20160511171939j:plain

f:id:androhi:20160511172226j:plain

2. ボードゲーム標準装備

フロントで申し込むと、ボードゲームを借りることが出来ます。 Zaim にはボードゲームにかなり詳しいメンバーがいることもあり、1日目の夜はボードゲーム大会で盛り上がりました。

3. 会議室にBluetooth対応スピーカーがある

運が良かったことに、我々が合宿をする一月前から会議室にスピーカーが設置されたようです。しかも会議室利用者なら無料で使えます。

Bluetooth対応なので、作業中のBGMをスマートフォンからも流せます。(僕は全然スピーカーに詳しくないのですが、ハーマン・カードン社といえばオーディオ機器では有名みたいです。) Zaim の合宿でも、このスピーカーで音楽を流しながら作業しました。

感想

開発合宿についての、個人的な感想です。

「普段気になってるけど中々実行出来ないタスク」が出来たことは、思っていた以上に有意義な時間でした。加えて合宿という形式で作業するのも、良い気分転換になりました。ボードゲーム大会楽しかったです。

僕は開発合宿というものは初めてだったのですが、感覚としては通常勤務と社員旅行の中間みたいな感じがしました。 Zaim では今回が第1回目となる開発合宿でしたが、良い合宿だったと思います。ぜひ第2回目も開催できればなと思っています。

Kotlin/Pluginもくもく会を開催しました

先日、Kotlin や IntelliJ Plugin をテーマにもくもく会を開催しました。

もくもく会の様子

当日は、簡単な自己紹介をした後、1名飛び込みで LT をしていただいたりしました。

その後、Kotlin グループと Plugin グループとで何となく分かれ、開発を始めたのですが、 飲み物とピザをサムライズム山本さんが用意して下さってので、飲んだり食べたりしながら楽しくもくもく出来ました!

ちょっと写真が無くて申し訳ないのですが、サムライズムさんはプロジェクターやマイク、電源、WiFiと何でも揃っているので最高でした。

僕は Plugin グループでもくもくしてたのですが、意見交換とかも出来て楽しかったです。 Kotlin グループも Kotlin エヴァンジェリスト?のたろうさんも来て下っていたし、ちょこちょこ会話も聞こえてきて楽しそうでした。

同じ目的でもくもくするのって、やっぱりいいですね。

会を終えて思ったこと

過去2回やった Plugin 勉強会でも思ったのですが、少人数開催とはいえ初対面の方や開発中に声かけづらいとかもあり、コミュニケーション取るの難しいなと思っていました。

そのため今回は、参加者のみなさんに簡単な自己紹介をお願いして、コミュニケーションしやすくなればいいなと思ったのですが、 もしかしたらあまりプラスに働かなかったかもしれません。

他に何か良い方法は無いかなと考えたところ、slack のグループがあったらいいのかもと思いました。

Kotlin を始め、メジャーなテーマでは既に slack の公開グループがいくつかありますが、Plugin 開発は無さそうでした。 今後も勉強会やもくもく会でコミュニケーションが円滑になったり、継続して情報交換が出来るようになればいいなと思い、Plugin 開発をテーマとした slack グループを作成しました。

だいぶニッチかもしれませんが、興味ある方は誰でも参加可能ですので、もしよろしければ以下のリンクから参加申請してみてください。

IntelliJ Plugin Developer への参加申請リンク

勉強会 or もくもく会の方も、都合が悪く参加出来なかった方もいらしたので、ぜひまた次回開催できればいいなと思っています。