うわさの分析サービス Segment(旧Segment.IO)の使い方をまとめてみたよ


##はじめに
Segmentという分析サービスご存じですか？
ユーザーイベントの分析ができるサービスです。うわさはアオリです。が、他のサービスより優れている点として、

* 他の分析サービス(Google analytics, mixpanel, Flurry)と連携が容易。コンソール設定で追加することができる。
* 実装が容易。ほとんどのコールはメソッドチェーンで記述できる。
* 色々なプラットフォーム(Android, iOS, js, etc.)で利用できる。

ことがあります。Adトラッキングやエラートラッキングなど、複数の分析を追加していくと似たようなコードを書いたり、癖のあるApiの実装に困ったりしますが、Segmentを使うことでそれらを全て統合・管理することが可能になります。
今回はAndroidでの導入方法をまとめてみました。

##導入方法
###アカウント作成および分析ツールの設定
1.<https://segment.com/>へ行き、アカウントを作ります。

2.ログインすると、以下のような管理コンソールに入ることができます。
![スクリーンショット 2014-11-13 12.45.35.png](https://qiita-image-store.s3.amazonaws.com/0/39433/60a22012-f82a-5b86-5e57-a8512c343b4d.png)


3.右上のタブからOrganizationの作成とProjectの作成ができます。

4.管理コンソールのIntegrationでは統合したい他の分析サービスが選べます。スイッチを入れると、その分析サービスのAPIやkey情報等、トラッキングに必要な情報の入力を求められます。入力すると、統合が有効になります。なお、各種サービスが提供するSDKをアプリに入れることでも、データを送ることができます。

5.Debuggerでは実際に送付されたデータを確認することができます。  
![スクリーンショット 2014-11-17 15.42.15.png](https://qiita-image-store.s3.amazonaws.com/0/39433/e15981e9-18b1-b45d-e155-f3e94fc1faf9.png)


6.SQLでデータを取得することも可能ですが、business planに入らないといけないようです。

7.Project settingからプロジェクト名など各種設定ができます。ここのAPI keysタブにSegmentを利用するためのキーが記載されています。

###Android Studioへの導入

app/配下のbuild.gradleに以下のdependencyを入れるだけで、最新のビルドが入ります。

```groovy

dependencies {
  compile('com.segment.analytics.android:core:+@aar') {
    transitive = true
  }
compile 'com.google.android.gms:play-services:+'
compile 'com.mixpanel.android:mixpanel-android:+@aar'
}
```

上のcompileでcoreを指定すると、必要な分析サービスのみ別にコンパイルして導入することができ、サイズの節約ができます。allを指定すると全ての対応している分析サービスが入ります。

###Eclipseへの導入
jarファイルが公開されています。->  <https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=com.segment.analytics.android&a=core&v=LATEST>

このjarファイルを/lib配下におけば、普通に使えます。
ただし、最新のバージョンより若干updateが遅い＆特に告知なくupdateされるので、少し注意が必要です。
基本的にはSegmentが推奨するようにgradleで導入するのがオススメです。

##実装方法
###各種設定
AndroidManifest.xmlに以下の設定を施します。

```xml

 <!-- Required for internet. -->
<uses-permission android:name="android.permission.INTERNET"/>

```

以下はオプションですが、android.permission.ACCESS_NETWORK_STATEについては多くの分析サービスが利用するので、合ったほうが良いと思います。


```xml

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_LOGS"/>
-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>


```

res/values/analytics.xmlには設定情報を入れます。

```xml

<resources>
  <string name="analytics_write_key">YOUR_WRITE_KEY</string>
  <string name="analytics_logging">true</string>
  <integer name="analytics_queue_size">20</integer>
</resources>
```

* analytics_write_keyにはコンソール画面で確認したkeyを入力します。
* analytics_loggingはtrueにすると、ログが取れるのですが、Androidに関してはあまり役立つ情報が取れませんでした。iOSでは送付データが見れるようです。
* analytics_queue_sizeはサーバに送るデータキュー数になります。デバッグの時はanalytics_queue_sizeは小さめ(3とか)にしたほうが良かったです。キュー数が大きいとコンソールで確認に時間がかかります。

###実装
各種代表的なメソッドは以下のようになっています。

#### identify
ユーザーidを特定します。例えば、すでに別端末やPCで会員登録済みである場合に、ログイン後に呼び出すことで、モバイル端末をそのユーザーidに紐付けることができます。

```java

Analytics.with(context).identify(id);
```

ユーザー名やメールなどもidentifyで紐付けることができるようです。利用規約には注意が必要そうですね。

```java

Analytics.with(context).identify(new Traits().putName("Michael Bolton"));
Analytics.with(context).identify(new Traits().putEmail("mbolton@initech.com"));
```

#### Alias
新規会員登録時に呼び出して、新規会員登録するまでのイベントを新規会員情報と紐付けます。
統合する分析サービスとしてMixpanelを利用する際に必要な機能になります。
新規会員登録する前にuuidなどで`identify`していた場合は、それを結びつけることも可能です。

```java

Analytics.with(context).alias(uuid, new_id);
```

注意事項として、Mixpanelでは新しい会員に紐付けられるイベント履歴は1つだけです。そのため、`alias`は新規会員登録時のみで1度だけ呼ぶ必要があります。

#### Track
Segmentではかなり柔軟にトラッキング情報を取得できます。
トラッキング情報にプロパティを添付したい場合は、propertiesクラスでキーとバリューを設定してあげます。

```java

//トラッキング情報を送りたい場合
Analytics.with(context).track(trackName);

//プロパティ情報も送りたい場合
Properties properties = new Properties()
            .putValue("price", price)
            .putValue("category", CategoryId);  //object型なのでなんでもいける
Analytics.with(context).track(trackName, properties);
```

#### Options
こっちの分析サービスでは情報取得したいけど、あっちの分析サービスでは取得したくなよ、ということもありますよね。そういう場合はOptionsで詳細に設定できます。

```java

// Mixpanel は分析しない
Options options = new Options().setIntegration("Mixpanel", false);
analytics.track("Viewed Item", new Properties(), options);
```

##参考：取得データ
取得したデータは以下のようにjson形式となっています。かなり詳細な端末情報が取得できています。

```json

{
  "timestamp": "2014-11-20T06:37:52.000Z",
  "userId": "6a82225c-9c7b-4514-b06c-8257a5bd7041",
  "anonymousId": "6a82225c-9c7b-4514-b06c-8257a5bd7041",
  "event": "Hoge",
  "context": {
    "traits": {
      "userId": "6a82225c-9c7b-4514-b06c-8257a5bd7041",
      "anonymousId": "6a82225c-9c7b-4514-b06c-8257a5bd7041"
    },
    "userAgent": "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SCL23 Build/KOT49H)",
    "app": {
      //略
    },
    "device": {
      "manufacturer": "samsung",
      "name": "SCL23",
      "id": "b0fd050f313d8b4b",
      "model": "SCL23",
      "type": "android"
    },
    "os": {
      "version": "4.4.2",
      "name": "REL",
      "sdk": 19
    },
    "timezone": "Asia/Tokyo",
    "network": {
      "wifi": true,
      "bluetooth": false,
      "cellular": false,
      "carrier": "SoftBank"
    },
    //略
  },
}
```


##注意点 
開発が盛んなようで、頻繁にupdateがかかっています。例えば`alias`はjar(2.1.10)とgradle(2.4.1)で引数の順番が反対になっていたりします。  
ライブラリをupdateする際は変更がどうなったか彼らのDeveloperBlog(<https://segment.com/blog/>)で把握する必要があります。