まだ間に合う！着々と進化しているFirebaseをまとめてみるよ #Firebase #FJUG

今回の記事は，Firebaseをこれから触る人，以前触ってしばらく離れていた人，全体像を復習したい人向けになります．
既にある程度知っているよ～というかたは，併せて[過去記事](https://qiita.com/Yatima/items/23797ca868ee988c824b#firebase%E9%96%A2%E9%80%A3%E9%81%8E%E5%8E%BB%E8%A8%98%E4%BA%8B)もご覧ください．

適宜加筆していきます．

#tl;dr
**そのうちAWSも超えそうなパワーみ感じる**
**Firestore，Predictions, Cloud Functionsあたり一押し**
**いろんな使い方できるね**

# おしながき
そもそもFirebaseとは何か
利用実績
追加されてきた良機能
全機能まとめ
具体的な使い方（システム構成）
公式による使い方一覧
サンプル

#そもそもFirebaseとは何か
「**AWSやGCPのようなもの，そしてもう少し的を絞ったもの**」
と考えると，なんとなくのイメージは掴めるかもしれません．

むしろAWS超えるくらいのポテンシャルは秘めている[^aws]と考えています．
[^aws]: これは使いやすさという意味ももちろんありますが，本質的には裏側で支えているGoogleの研究開発によるところが大きいです．Amazonは研究開発がGoogleほど活発ではないので，追従するにしてもかなり後手後手になると思います．
（GCPでサービスを選ぶためのフローチャートでも，Firebaseにゴールしやすくなっています[^flowchart]）
[^flowchart]: [元記事](https://cloudplatform-jp.googleblog.com/2017/07/choosing-the-right-compute-option-in-GCP-a-decision-tree.html)をちゃんと読むと，実は元記事に対してフローチャートがミスリードしている感は否めません．ただし，個人的にはフローチャートくらいの意味合いが妥当と思っています．なぜか？裏側で特殊な処理をするにしても，GUIはFirebaseならば容易（インフラ等管理不要）だからです．GUIに関与しない開発は少数でしょう．
![GCP decision tree](https://qiita-image-store.s3.amazonaws.com/0/17440/15d0c17f-9ee3-18f0-6755-d6675038d752.png)
*（長いので以下略）*
　
もう少し具体的には，
「**手軽だが大規模にもできる[^large-scale]システム基盤** + **便利なツール群**（mobile向けが多いがPC向けとしても十二分に使える）」
と言った感じです．
[^large-scale]: まっとうなエンジニアなら，この表現に違和感を覚えるのは当然かと思います．確かにNoSQLによる制限はありますし，[このような独特な開発手法](https://qiita.com/Yatima/items/f76c9af0cc43a45d0e6e)を取らない限りは，規模が大きくなるにつれ，やはりそれなりに複雑になる（手軽さが減少する）というのは事実でしょう．とは言え，インフラやAPI管理のような，本質的ではない部分の労力を大きく省けるのもまた事実です．慣れさえすればこれまでの中で銀の弾丸に一番近いもの，といったイメージでしょうか．
　
Web, Android, iOSはもちろん，UnityやC++(Cocos2d-x含む)もSDKが用意されています．
![platform](https://qiita-image-store.s3.amazonaws.com/0/17440/178f289e-2a71-ae6c-c511-65c6539f625d.png)

管理用のSDKも，Node.js, Java, Python, Goがあります．
最近はIoTあたりでも，手軽に使えると注目を浴びているようですね！

一般的にはmBaaS（mobile Backend as a service）と呼ばれる類です．
良くも悪くも，mBaaS界はFirebase一強状態かなぁと思います．
FirebaseはGoogleに買収[^M/A]されており，**Googleの異次元な技術力とFirebaseの使いやすさが融合**して（進行形）いい感じです．
[^M/A]: ちなみに買収時はまだRealtime Database, Authentication, Hostingしかありませんでした．現在ではいずれもDevelopに分類されているものたちですね．

# 利用実績
論より証拠，実際どんな企業に使われているかを見ていただきましょう[^eg_co][^eg_co2]．
[^eg_co]: 注1：Firebase内にも多くのサービスがあるので，フルに使っているところもあれば，一つだけというところもあります．
[^eg_co2]: 注2：日本でそこそこ知名度がありそうなもののみにしています．
　

- [クックパッド](https://firebase.google.com/docs/app-indexing/#case_studies)
- [食べログ](https://firebase.google.com/docs/app-indexing/#case_studies)
- メル○リ
- pix○v
- Go○gle
- Amaz○n
- McDonald○s
- Pinterest
- [TED](https://firebase.google.com/docs/dynamic-links/use-cases/#social_email_and_sms_campaigns)
- Ub○r
- Sp○tify
- SoundCl○ud
- Snap○hat
- Duolingo
- Trivago
- [alibaba](https://firebase.google.com/docs/cloud-messaging/js/case-studies)
- shazam

などなど…

Firebase公式サイトに掲載されていない企業は一応伏せ字にしておきます．
もし問題ある場合はご一報ください．

#追加されてきた良機能

Firebaseは，話題としてはだいぶ前から挙がっていました．
自分が使い始めた時ですら，「2週遅れで始める～」という記事を見かけた覚えがあります．

しかし，Firebaseは**当時から明らかに進化**しています！
そこで，一度触った/調べたことあるけどイマイチだったよなぁ，という人向けに，追加されてきた良い機能を独断と偏見でピックアップしてみます．

##[Cloud Firestore](https://firebase.google.com/docs/firestore/?hl=ja)
これは本当にすごい．
**手軽なのに実戦投入にも耐えうる，しかも安め**なデータベース（ただし17/12/05現在β）．

手軽さを具体的に言うと，**クライアントから直接書き込める，リアルタイム同期，オフライン対応，自動で暗号化[^Encryption]**
[^Encryption]: 以下を参照：[Server-Side Encryption < Cloud Firestore Documentation](https://cloud.google.com/firestore/docs/server-side-encryption)
実戦に耐えうる要素としては，**障害・ダウンタイムまずない，スケーラビリティ青天井，マルチリージョン，強整合性，トランザクション，クエリもそれなりに**
　
元データがいくら増えても**クエリが全く遅くならない**とか化け物です[^query]．
[^query]: インデックス張れば当たり前じゃんと思うかもしれませんが，張ったとしてもじわじわ遅くはなっていきます（logのオーダで）．
ただし**NoSQL**なのは注意です．

関連記事：
[Firebase RTDB + GCP datastore = Firestoreについて第一印象](https://qiita.com/Yatima/items/54ea22d0cea1acc6cbcb)
[DatastoreとFirestoreとApp Engineの関連](https://qiita.com/sinmetal/items/7c6e146fbad8ff8a0f5a)
[Cloud Firestoreは進化したFirebase Realtime Database](https://qiita.com/1amageek/items/8179aebe871beb230194)
[Cloud Firestore のご紹介: アプリ用の新しいドキュメント データベース](https://developers-jp.googleblog.com/2017/10/introducing-cloud-firestore.html)（公式ブログ）
[Realtime Database デベロッパーのための Cloud Firestore](https://developers-jp.googleblog.com/2017/10/cloud-firestore-for-rtdb-developers.html)（公式ブログ）


##[Predictions](https://firebase.google.com/docs/predictions/?hl=ja)
今はやりの機械学習，これがちょー簡単に活用できちゃう（ただし17/12/05現在β）．

Analytics内の**好きなパラメータを選ぶだけで，一週間後の予測が**でき，更にそれに対して通知を送るなどのアクションもできます．
（デフォルトで「課金してくれるかどうか」「離脱しちゃうかどうか」は設定済）
しかも**無料**．

TensorFlowなど，機械学習で最前線を走るGoogleならではのサービスでしょう．

関連記事：
[Firebase Dev Summit 2017 で発表された新機能ざっくり，これまでとの違いも](https://qiita.com/Yatima/items/1b2af3094874c4a6bb77#predictions)
[Announcing Firebase Predictions Beta](https://firebase.googleblog.com/2017/11/announcing-firebase-predictions-beta.html)（公式ブログ）


##[Cloud Functions](https://firebase.google.com/docs/functions/?hl=ja)
**サーバ管理なしにサーバ側の処理を**行えます（ただし17/12/05現在β）．

AWSで言うLambda[^Lambda]，いわゆるFaaSですね．
[^Lambda]: Lambdaと比べると，Node.jsしか使えないものの，依存パッケージはnpmの`package.json`を書くだけで済みます．
Firebase内やGCP内の他サービスとも連携しやすいです．
途中でHostingとの連携にも対応し，みんな大好き**Server Side Rendering**[^SSR]ができるようになりました．
[^SSR]: 普段はブラウザ上で動くjavascriptを，サーバ側で演算してしまおう，という技術です．ちなみに個人的には，ちょっとなぁと思います．複雑になりやすいし，サーバ側リソースも消費するためです．
　
その他，バッチ処理やbotでない確認の実装方法なども公式ブログには掲載されていました．
上述2件と比べると**派手ではないけどとても重要**ですね．
　
関連記事：
[Vue.js サーバサイドレンダリング on Cloud Functions for Firebase](https://qiita.com/koki_cheese/items/64f429ac764983525dcc)
[Cloud Functions を使って Firebase Hosting から動的コンテンツを提供する](https://developers-jp.googleblog.com/2017/06/serving-dynamic-content-with-cloud.html)（公式ブログ）
[Cloud Functions for Firebase でジョブをスケジューリング（cron）する](https://developers-jp.googleblog.com/2017/04/how-to-schedule-cron-jobs-with-cloud.html)（公式ブログ）
[reCAPTCHA と Firebase でウェブ コンテンツを不正使用から守る](https://developers-jp.googleblog.com/2017/09/guard-your-web-content-from-abuse-with.html)（公式ブログ）

#全機能まとめ
たくさんあるので正直わからないですよね．
短く表にまとめてみましたのでご参考にどうぞ．
（個人的にはもうちょっとわかりやすく分類できる気がするのですが，ひとまず表のほうは公式準拠としておきます[^classify]）
[^classify]: 自分的にはこんな感じに分類しています；開発系（Realtime Database, Cloud Firestore, Hosting, Authentication, Cloud Storage, Cloud Functions），便利機能系（Cloud Messaging, Dynamic Links, Invites），監視系（Analytics, Crashlytics, Performance Monitoring, Predictions），テスト系（Test Lab for Android, Remote Config），広告系（App Indexing, AdWords, AdMob）
　

|サービス名|一言で|ポイント|価格|備考|
|:-:|:-:|:-:|:-:|:-:|
|**Develop**||||||
|Authentication|twitter認証とか簡単に|メルアド会員，仮会員や電話認証も<br>カスタム認証もいける|無料|他サービスでの権限付与連携|
|Realtime Database|便利なデータベース|クライアントと直接<br>オフライン対応<br>リアルタイム|DL $1/GB など|クエリ貧弱<br>レイテンシはFirestoreより強い|
|Cloud Firestore|便利で強力なデータベース|[詳細上記参照](https://qiita.com/Yatima/items/23797ca868ee988c824b#cloud-firestore)|$0.18/10万write など|β|
|Cloud Storage|メディア置き場|ネット状況に応じDL一時停止・再開|DL $0.12/GB など||
|Hosting|ウェブサイトの配信|https対応<br>バージョン管理|DL $0.15/GB など||
|Cloud Functions|サーバ側処理|[詳細上記参照](https://qiita.com/Yatima/items/23797ca868ee988c824b#cloud-functions)||β|
|**Stability**|||||
|Crashlytics|エラー分析|エラーの優先順位<br>グループ化<br>脱獄機マーク<br>「解決済み」ボタン|無料|β|
|Crash Reporting|エラー分析|||Crashlyticsに移行する運命|
|Performance Monitoring|時間計測で性能監視|バックグラウンドでのアクティビティ，ネットワークリクエストなども|無料|β|
|Test Lab for Android|クラウドでアプリテスト|既存環境と容易に統合<br>テストコードなしでも|仮想 \$1/機器/hr<br> 実機 $5/機器/hr||
|**Analytics**|||||
|Analytics|ユーザ統計|カスタムのユーザ情報，イベント<br>多数の広告サービスと連携<br>BigQueryとも|無料|変更できない問題は未だに|
|**Grow**|||||
|Predictions|ユーザグループの行動予測|[詳細上記参照](https://qiita.com/Yatima/items/23797ca868ee988c824b#predictions)|無料|β|
|Cloud Messaging<br>(Notifications)|通知|ブラウザにも<br>優先度<br>有効期限|無料||
|Remote Config|ユーザのアプリ更新なしで変更|A/Bテストは目標設定なども可能|無料||
|Dynamic Links|アプリ内への直リンク||無料||
|AdMob|広告収入|コンテンツそっくり広告もある|N/A||
|**その他**|||||
|Invites|招待機能||無料|Dynamic Links上のサービス|
|App Indexing|アプリをグーグル検索に|コンテンツも反映|無料||
|AdWords|広告入稿||ものにより||

# 具体的な使い方（システム構成）

後述しますが，公式にも使い方の記事は多くあります．そのため別の粒度でざっくり書いてみます．
ちなみに，ツール群については好みでいくらでも組み合わせが考えられると思うので，システム基盤のほうのみ書きます．

##大抵のウェブアプリ
これを基本構成とします．以降の場合に当てはまる場合は適宜追加してください．
Cloud Firestore + Authentication + Hosting + Cloud Storage

##大抵のネイティブアプリ
これを基本構成とします．以降の場合に当てはまる場合は適宜追加してください．
Cloud Firestore + Authentication + Cloud Storage

##サーバ側処理が必要な場合（バッチ処理，隠蔽すべき処理，外部API利用等）
Cloud Functionsを追加します．
上記の他にクライアント側負荷軽減，SSR等にも使えます．
[詳細上記参照](https://qiita.com/Yatima/items/23797ca868ee988c824b#cloud-functions)
[公式サンプル](https://github.com/firebase/functions-samples)も種類が豊富で参考になります．

##検索を含む場合
検索は苦手なことの一つです．
**[Algolia](https://www.algolia.com/)というサービスと連携**するのがいいでしょう．
公式サンプル（[Realtime Database](https://github.com/firebase/functions-samples/tree/master/fulltext-search)，[Firestore](https://github.com/firebase/functions-samples/tree/master/fulltext-search-firestore)）もあります．

ElasticSearchという選択肢もありますが，ちょっと手間ですね．

##複雑な統計処理など含む場合
Firebaseのデータベースは，いずれも複雑なクエリが苦手です．
そこで，Cloud Functions経由でデータを**BigQueryに突っ込んでしまうのはあり**かもしれません（[公式サンプル](https://github.com/firebase/functions-samples/tree/master/bigquery-import)）．

ご存知のかたも多いとは思いますが，安価で分析の得意なサービスで，Firebase同様インフラ管理は不要です．
Google同士ですし，Node.js用ライブラリも用意されているので連携も非常にしやすいです．

ただし**クエリによっては10秒単位で時間がかかる**[^bq]場合もあります．
それから**同時に50クエリ**[^bq]しか実行できません（ただクエリだけですし，ユーザ数換算ではそこそこ対応できるかとは思います）．
上記が解決できるのであれば，だいぶ**安価で便利**だと思います．
[^bq]: そもそもはログなどの莫大なデータでも割と素早く分析してくれるというサービスなので，エンドユーザ向けのノリにはチューニングされていないためです．
　
難しい場合は，Cloud Spanner with 金で殴るか，無難にCloud SQLに繋ぐか，おとなしくクライアント側でごりごりデータ加工しましょう．

##リアルタイムストラテジーなど，レイテンシを抑えたいゲームを作る場合
Realtime Databaseがいいでしょう．
Firestoreは同期に数秒単位でかかる場合があります．

FPSなど作ろうとすると悲しみに包まれますのでやめておきましょう．
さすがに**そこまでレイテンシ低くはない**ですし，無料枠がすぐ蒸発します（後述）．


##お絵かきチャットなど，高頻度で同期させたい場合
Realtime Databaseのほうが安くつくかもしれません．
Firestoreは読み書きの度に課金されますが，Realtime DatabaseはDLした総データサイズでの課金です．

高頻度の同期が継続する場合は，課金額に注意してください．
もしやるなら，（例えばゲームなら）キー入力のみ同期して，後は各々の端末上でキー入力の影響をシミュレート，などの工夫をしたほうが良いと思います．

##IoTやる場合
IoTは何を作るかで様々だとは思いますが，Realtime DatabaseとIFTTTを使いこなしているかたが多そうですね（もう少し調べたらまとめ直すかも）．
Googleが最近出したキットでも，裏側ではRealtime Databaseが使われています．
https://papersignals.withgoogle.com/

##外部と統合させたシステムの場合
Authenticationは導入しやすく恩恵も受けやすいかと思います．
データベースなどはケースバイケースでしょうか．

Firebaseは構成をシンプルにできるのも強みなので．Firebase内で完結できそうなら思い切って完結させてしまうのが一番，という気持ちではあります．


#公式による使い方一覧
前項の冒頭に置こうとしていたのですが，案外量が多かったので別にしました．
　
[公式ユースケース集](https://firebase.google.com/use-cases/)

- 効果的なオンボーディング フロー（注：ログイン画面）を作成
- 「おかえりなさい」画面をカスタマイズ
- 新機能を段階的に公開
- 端末間のユーザー ジャーニー（注：ユーザ行動）をフォロー
- アプリにチャット機能を追加
- Optimize ads based on user behavior（注：ユーザ属性に合わせた広告最適化）
- ユーザーが写真の共有やサイズ変更をできるようにする
- サーバーを使用せずに、サードパーティの支払いを処理
- Reward your referrals（注：紹介への謝礼）

[カスタム オンボーディング プロセスを作成する](https://firebase.google.com/docs/use-cases/custom-onboarding?hl=ja)
[Firebase による支払い処理](https://firebase.google.com/docs/use-cases/payments?hl=ja)
[再開画面のカスタマイズ](https://firebase.google.com/docs/use-cases/welcome-screen?hl=ja)
[Follow users across devices(How to do cross-platform analytics with Google BigQuery)](https://cloud.google.com/blog/big-data/2017/04/how-to-do-cross-platform-analytics-with-google-bigquery?hl=ja)

また，サービス毎にもガイド内に掲載されている場合があります．

ユースケース；
[Cloud Functions で可能な処理](https://firebase.google.com/docs/functions/use-cases?hl=ja)
[Firebase Dynamic Links のユースケース](https://firebase.google.com/docs/dynamic-links/use-cases/)
　[モバイルウェブ ユーザーをアプリユーザーに転換する](https://firebase.google.com/docs/dynamic-links/use-cases/web-to-app?hl=ja)
　[ユーザー間でコンテンツを共有する](https://firebase.google.com/docs/dynamic-links/use-cases/user-to-user?hl=ja)
　[紹介報酬を付与する](https://firebase.google.com/docs/dynamic-links/use-cases/rewarded-referral?hl=ja)
[Firebase Predictions を使用して収益化戦略をテストする](https://firebase.google.com/docs/predictions/use-cases/conditional-ads?hl=ja)
[Firebase Predictions を使用してプロモーション戦略をテストする](https://firebase.google.com/docs/predictions/use-cases/optimize-offers?hl=ja)
[Firebase Predictions を使用してユーザー定着戦略をテストする](https://firebase.google.com/docs/predictions/use-cases/prevent-churn?hl=ja)
[導入事例](https://firebase.google.com/docs/games/setup#example_use_cases)（モバイルゲーム）

ケーススタディ；
[事例紹介: ウェブ対応 Firebase Cloud Messaging（JavaScript）](https://firebase.google.com/docs/cloud-messaging/js/case-studies)
[事例紹介: Cloud Functions for Firebase](https://firebase.google.com/docs/functions/case-studies)
[事例紹介: Firebase Authentication](https://firebase.google.com/docs/auth/case-studies/)
[事例紹介](https://firebase.google.com/docs/app-indexing/?hl=ja#case_studies)（App Indexing）
[事例紹介](https://firebase.google.com/docs/invites/case-studies)（Invites）

#サンプル
[公式サンプル一覧](https://firebase.google.com/docs/samples/?hl=en)
[Cloud Functions 公式サンプル](https://github.com/firebase/functions-samples)

#まとめ
そんな感じで，
**そのうちAWSも超えそうなパワーみ感じる**
**Firestore，Predictions, Cloud Functionsあたり一押し**
**いろんな使い方できるね**
というおはなしでした．

#コミュニティ
できたてほやほや．
ロゴかっこいいよ！よろしくね．
[Firebase Japan User Group](https://firebase.asia/)
![Firebase Japan User Group](https://firebase.asia/logo.png?198d711b493f1e2ad15472f9f7f8bb2e)

#Firebase関連過去記事
　
[結局Firebaseのdbでは何に気をつけるべきか？少しマニアックな内容も含め，わかりやすく説明する(realtime database)](https://qiita.com/Yatima/items/8a54acc8fda3e5fce741)（Firestoreでも大半は参考になると思います）
[大規模でも開発保守を極めて容易にする；データベースすらコンポーネント化](https://qiita.com/Yatima/items/f76c9af0cc43a45d0e6e)
[Firebase RTDB + GCP datastore = Firestoreについて第一印象](https://qiita.com/Yatima/items/54ea22d0cea1acc6cbcb)
[Firebase Dev Summit 2017 で発表された新機能ざっくり，これまでとの違いも](https://qiita.com/Yatima/items/1b2af3094874c4a6bb77)
[Firestoreに負荷試験(Loadroid)してみた+補足](https://qiita.com/Yatima/items/2abb633191080ee1447c)

　

　

　

└(・∀・)┘ﾔﾘｨ!