Firebase Meetup#10にブログ枠で参加させていただき、
その時の内容を簡単に報告をさせていただきます。
※何か間違いなどございましたらご指摘いただけますと幸いです
Firebase Meetup#10
FJUC(Firebase Japan User Group)コミュニティの紹介
どういうところ?
日本のFirebaseユーザーのコミュニティ
主な活動
勉強会などイベントの開催
Slackチャンネルはこちらから参加
Twitter ハッシュタグ #FJUG
発表
以下に発表内容をまとめます
タイトル
What's new in Cloud Firestore and MLKit
登壇者
@d_dateさん
- GDE https://developers.google.com/experts/people/daiki-matsudate
- 株式会社FOLIO iOSエンジニア
- FirebaseのPodcastをやっている FJUG CAST
- try! Swift Tokyoオーガナイザー https://www.tryswift.co/events/2019/tokyo/jp/
資料
内容
FirestoreとMLKitの最新情報
FirestoreがGAになりました
Google Cloud Blog
https://cloud.google.com/blog/products/databases/announcing-cloud-firestore-general-availability-and-updates
Firebase Blog
https://firebase.googleblog.com/2019/01/cloud-firestore-in-general-availability.html
10個の新しいローケーションに対応
Multi-region
- Europe (eur3)
North America (Regional)
- Los Angeles (us-west2)
- Montréal (northamerica-northeast1)
- Northern Virginia (us-east4)
- South America (Regional)
- São Paulo (southamerica-east1)
- Europe (Regional)
- London (europe-west2)
Asia (Regional)
- Mumbai (asia-south1)
- Hong Kong (asia-east2)
-
Tokyo (asia-northeast1)
- Australia (Regional)
- Sydney (australia-southeast1)
東京リージョンになると何が嬉しいのか?
- レイテンシーが少なくなる(特にCloud Functionを使っても海を超えることがなくなる *Podcastより)
プロジェクトのロケーションを指定する時の注意点
ドキュメントにも記載があるように
警告: プロジェクトのロケーションを選択した後は、ロケーションを変更できません。
プロジェクトのロケーションの設定は複数のプロダクトに適用されます。
なので注意が必要。
国内で使うなら東京リージョンを選択すること。
SLAが利用可能に
SLAとは、Service Level Agreementの略で簡単に言うと、サービスを落とさずに稼働しつづけることができる確率。
これに違反した場合は請求金額から割引をしてくれる。
- マルチリージョンインスタンス: 99.999%以上
- 各リージョンのインスタンス: 99.99%以上
マルチリージョンの設定が可能に
マルチリージョンとは複数のリージョンで同じDBのデータを保持することで災害時のデータ復旧に備えることができる
※
ゴジラが来ても大丈夫!!!と書いてある。
料金が最大50%オフ
3月3日に発表実施されるらしい(現在2月9日)
※料金に関してはこちら
Firestore
インターネット下り料金
Stack Driverでモニタリングが可能に(まだBeta)
ReadやWriteがどのくらいされているのか、料金がどのくらいかかっているのかをモニタリングして
アラートを飛ばすこともできるように。
これから色々な機能が追加されていくようです。
Cloud Databaseユーザーは2019年の後半に自動アップグレードがあるらしい
ブログに記載がありました。
Existing Cloud Datastore users will be live-upgraded
to Cloud Firestore automatically later in 2019.
MLKit for Firebase(Beta)
VisionAPIやTensorFlow Liteのカスタムモデルを使用して
簡単に機械学習をさせることができます。
認識できる5つのもの
- テキストの認識
- 顔の検出
- バーコードのスキャン
- 画像のラベル付け
- ランドマークの認識
料金
オンデバイスの学習モデルは無料
- テキスト認識はLatin文字のみなので日本語を使用する場合はオンラインでやる必要がある
- バーコードスキャンができる
- カスタムモデルの推論ができる
API通信が挟まるモデル
- $1.50 /K(Blazeのみ)
- 認識できる種類が増える
実は自然言語処理ができるように??
日本語ドキュメント更新されていませんが、
実はLanguage Identificationが追加になっていました。
https://firebase.google.com/docs/ml-kit/
https://firebase.google.com/docs/ml-kit/identify-languages
iOSでの使い方
Podfileを作成し、
pod 'Firebase/Core'
pod 'Firebase/MLNaturalLanguage'
pod 'Firebase/MLNLLanguageID'
importして
import Firebase
以下のような感じで実装(動きません)
let languageId = NaturalLanguage.naturalLanguage().languageIdentification()
languageId.identifyLanguage(for: inputTextView.text) { (languageCode, error) in
if let error = error {
print("Failed with error: \(error)")
return
}
if let languageCode = languageCode, languageCode != "und" {
print("Identified Language: \(languageCode)")
} else {
print("No language was identified")
}
}
デフォルトだとund(undefined)の結果は返さず、
信頼係数が0.5を超えるものしか変えられませんが、
Optionで調整もできるようです。
let options = LanguageIdentificationOptions(confidenceThreshold: 0.4)
let languageId = NaturalLanguage.naturalLanguage().languageIdentification(options: options)
また、LanguageIdentificationを使うことでどの言語に近いかどうかのリストを返してくれます。
let languageId = NaturalLanguage.naturalLanguage().languageIdentification()
languageId.identifyPossibleLanguages(for: text) { (identifiedLanguages, error) in
if let error = error {
print("Failed with error: \(error)")
return
}
guard let identifiedLanguages = identifiedLanguages,
!identifiedLanguages.isEmpty,
identifiedLanguages[0].languageCode != "und"
else {
print("No language was identified")
return
}
print("Identified Languages:\n" +
identifiedLanguages.map {
String(format: "(%@, %.2f)", $0.languageCode, $0.confidence)
}.joined(separator: "\n"))
}
ちなみに1つの文字列で1つの言語にしか対応しておらず、
複数言語が混ざっていても認識はできないようです。
また、こちらもOptionで信頼係数の変更ができます。
let options = LanguageIdentificationOptions(confidenceThreshold: 0.4)
let languageId = NaturalLanguage.naturalLanguage().languageIdentification(options: options)
TensorFlow LiteがモバイルのGPUを使うことでより高速に
タイトル
Firebaseでつくるグループチェックリスト管理サービス
登壇者
- iOS、Androidエンジニア
資料
https://speakerdeck.com/mogaming/check-list-apps-on-firebase?slide=35
https://gist.github.com/mogaming217/5a672f2ed05ed84ef3ceeb2572fb5642
内容
Firebaseを使ってchecka!というアプリを作った際の知見(特にFirestoreとCloud Functions)
https://itunes.apple.com/jp/app/checka-チェッカ/id1451433619
Firebaseで使用しているサービス
- Cloud Functions
- Firestore
- Authentication
- Analytics
- Crashlytics
- Firebase Cloud Messaging
Firestore
rulesで権限の管理をする
- 読めるデータと書き込めるデータを制限
データ構造の工夫が必要
- 必要なデータは同じデータを複数のドキュメントにコピーする
- その中で非同期でデータの整合性を取るようにする
Cloud Functions
firestore.rulesで複雑で表現しきれない部分を補う
特にデータのの作成が複雑な場合や権限でユーザーが作成できない範囲をカバー
※
Cloud FunctionsはAdmin SDKを使用する
具体例
データ構造
設計する時に考えた大事なこと
create権限は重要な箇所には与えない
Board, Task, Commentグループに属していれば作成できようしたい
↓
グループに属しているかどうかを権限で管理したい
↓
exists(path)を使用する
https://firebase.google.com/docs/firestore/security/rules-conditions?hl=ja
exists(/../gruops/$(groupID)/users/$(requestUserID))
重要なデータはCloud Functionsで作成
グループに属するユーザーはグループ参加用のCloud Functionsをアプリから呼び出して作成する
↓
同時にUserの属するグループも作成する
工夫したこと
updateの反映は非同期にする
グループの名前の変更
あるユーザーがグループの名前を変更したい
↓
でもupdate権限は渡したくない
↓
User側のグループの名前を変更してCloud Functionsを呼び出し変更を反映する
その他の工夫していること
SnapshotListnerの活用
リアルタイムにUIを更新できて気持ちが良い
Userのデータはアプリ内で別途キャッシュ機構を作っている
User名を表示する箇所は多数あるのでパフォーマンスや料金を意識
タイトル
無限スクロールの解説
登壇者
- 株式会社scouty
資料
https://slides.com/kahirokunn/deck-9#/
https://github.com/kahirokunn/book-management
内容
Firestoreやライブラリを使った無限スクロールの解説
使用ライブラリ
Firestoreのデータ取得は順序が決まっていない
更新日時の降順で取得することで更新されたことも一番上に来るようにする
{id:data}形式で流れてきたデータを全部保持しておき、getterで降順に並べ替え
タイトル
Firestore導入前に検討したかったベスト5
登壇者
@pitownさん
- 株式会社Hotspring
- ズボラ旅というサービスを作成
資料
内容
FirestoreをメインDBとしてFirestore中心に本番のプロダクトを開発した話
第5位 料金
結構な使用量でも1万円もかかっていないので安い(これからさらに安くなる)
第4位 プロダクトへの適正
DB構造さえも変わってしまうような仕様変更のあるスピード感が必要なサービスには良い。
スキーマレスなので変更に非常に強い。
一方でリレーションがすごい重要なデータを扱い場合には合わないかも(そんなにあるかは疑問)
※
TipsとしてReadとWriteの型があっていると処理が楽になる
第3位 アーキテクチャ
Firestoreの変更をトリガーにCloud Functionsを呼びだしてさらにFirestoreに書き込み
まずはクライアントジョインでいいや(2箇所でデータを置くと更新が面倒)
↓
パフォーマンスがまずくなる(1万件 x 1万件くらいのクライアントサイドジョインで辛くなる)
↓
CQRS(読み込みと書き込み用のテーブルを用意)の考えを導入
書き込みはやや正規化し、Cloud Functionsで読み込み用にデータ整形する
Mobxを使用して極力シンプルに
State管理を行うライブラリ
https://github.com/mobxjs/mobx
第2位 バグ
UTF-8 UTF-16の実装を間違えると何も返ってこれない、Console画面も開けなくなった
1分くらい書き込めていないということが何度かあった
サーバサイドでコネクションを張りっぱなしにしているとたまに切れる
色々あったが特性を理解することで解決できるものばかりであった。
制限事項
https://firebase.google.com/docs/firestore/quotas
第1位 実際の知見
「ぶっちゃけ、どうなの?」という話が聞きたかったがなかった。
↓
実際運用してみると本番運用に十分に耐えられるものだった!
とりあえず、Firestoreおすすめだからやってみるのが良い
タイトル
最近のFirebase
登壇者
@コキチーズさん
- 株式会社Hotspring
- FJUGオーガナイザー
- GCPUG Tokyo
資料
https://speakerdeck.com/k2wanko/recent-firebase
https://github.com/firebase
https://github.com/firebase/functions-samples
https://github.com/k2wanko/fire-timeline
内容
最近のFirebase事情
Firebaseとは?
- モバイルアプリ作成のプラットフォーム
- クライアントアプリだけでの開発が可能
- サーバのメンテが不要
対応プラットフォーム
- Android
- iOS
- Web
- C++
- Unity
とは言ってもサーバーが必要な時もある
Admin SDKはサーバーでFirebaseを操作する
対応言語
- C#
- Node.js
- Python
- Go
Github
いくつかのクライアントコードやSDKはOSSで提供
https://github.com/firebase
Firebaseを始めるだけならまずここから
- Google Analytics for Firebase
- Cloud Storage for Firebase
- Firebase Hosting
- Firebase Authentication
- Cloud Firestore
- Firebase Cloud Messaging
- Cloud Functions for Firebase
- Google Analytics for Firebase
Google Analytics for Firebase
- 無料で使えるモバイル向けのアナリティクスサービス
- イベントベースに分析が可能
- BigQueryにデータエクスポート可能
- 独自のイベントの定義も可能
- 特定の行動をしたユーザーをグループ化して追うことができる
新機能
除外するユーザーを指定できるように
それに伴いオーディエンスをより柔軟に制御できる機能も追加された
ドキュメント
https://firebase.google.com/docs/analytics/
有効期間の設定
「2週間以内にこの操作を行ったユーザー」というセグメンテーションが可能になどの設定ができる
Android, iOS向けのGoogle AnalyticsSDKが終了
- 2019年10月
- 移行先はFirebase
- 有料版のGoogleAnalytics360は影響なし
Cloud Functions for Firebase
- イベント駆動で独自の関数を実行できるサービス
- PubSubやHTTPやFirebaseのほとんどのサービスのイベントを取得できる
- 標準のサポートはNode.jsのみ
- GCP経由のCloud FunctionsでもFirestoreやRealtime DB、Analyticsのいべんとも受け取れる
gcloud functions event-types list
でイベントの確認ができる
Firebase Management API
FirebaseプロジェクトのFirebaseリソースやFirebaseアプリなどの設定や管理を
プログラムから行うことができるように。
Goサポート
Firebaseでという訳ではない
https://github.com/firebase/firebase-admin-go
Authentication
- パスワード認証、Google、Twitterなどのプロバイダー認証、SMS認証、独自認証に対応を使ってFirebaseユーザーにできる
Cloud Identity for Customers and Partners
SAML認証やOIDCなどもサポートされた
Firebase Hosting
- 静的ファイルを配信するホスティングサービス
- 標準でHTTPS/HTTP2に対応
- 独自証明書には対応していない
- Cloud Functionsとの接続で動的コンテンツ配信もできる
- サーバーサイドレンダリングやOpen Graph Protocolでに使える
複数のサイトを1つのプロジェクトで管理できる
そんなに新しくはない
Firebase Cloud Messaging
- Push通知を遅れるサービス
- Webにも対応
- トピック機能でサブスクライブしているユーザーにだけ送ることも可能
スケジューリングの設定が可能
毎日決まったメッセージを送ることなどが可能に。
https://firebase.google.com/docs/notifications/?hl=ja
GCMの終了
- 2019年4月11日
- 古いSDKやエンドポイントを使っている場合は移行が必要
Cloud Firestore
- リアルタイムにデータを同期できる分散NoSQLデータベース
- クエリーの全ては強い整合性を持つ
- クライアントから直接書き込める。オフラインでも書き込み可能
- 読み書きの制限はセキュリティルール
基本構造
- Collection
- Document
- Data
GAになりSLA99.999%で利用可能に
値下げが行われる
東京リージョンが安い。(変動している?)
https://cloud.google.com/firestore/pricing
ローカルエミュレーターでセキュリティルールのテストができる
セキュリティルール
- クライアントから直接書き込めるFirestoreでデータを保護する
- Javascriptのような独自構文
- テストモードで誰でも読み書き可能にできるが、最初からルールは作成するべき(後々の漏れを防げる)
書き方
認証しているユーザーのみに読み書きさせる。
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.uid != null;
}
}
}
基本ルール
- read
- get
- list
- write
- create
- update
- delete
検証はAuthorization → Scheme Validation → Business Logicの順に行う
参考サンプル
https://github.com/k2wanko/fire-timeline
Realtime DBとの使い分け
- ほとんどの場合はFirestoreでOK
- 少ないデータを頻繁にアップデートする用途の場合はRealtime DBの方が安いこともある
- ユーザーがオフラインになったことを検知したい場合はRealtime DBでしかできない
Firebaseより深く知るためには
ドキュメントを読む
サポートに聞いてみる
コミュニティに参加してみる
FJUG CASTを聞いてみる
Youtube Channel
最後に
現在、社内で1つのサービスにFirebaseの導入を検討しています。
そんなときにFirebase Meetupを見つけ初参加をしてみたところ、
非常に多くのことを知ることができました。
Web上にも情報はたくさん乗っていますが、
実際の運用経験や使用状況などの情報はあまり見つからず、
今回の参加を通して実際に使っている方のお話を聞くことができ
導入していくにあたっての不安が少し和らいだと感じています。
今後も機会があった際はMeetupに参加して知見を深めると共に、
実際に使用していく中で何か情報共有できることができてきた際は
発表などを通してFirebaseの輪を広げていけたら良いなと思っております。
運営のみなさま、
会場や飲食物などをご提供くださった株式会社メルカリ様、
登壇されたみなさま、
会場やTwitterなどで共に参加されたみなさま、
今回は有意義な時間を誠にありがとうございました。