Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@shiz

Firebase Meetup#10 参加報告

Firebase Meetup#10にブログ枠で参加させていただき、
その時の内容を簡単に報告をさせていただきます。

※何か間違いなどございましたらご指摘いただけますと幸いです:bow_tone1:

Firebase Meetup#10

FJUC(Firebase Japan User Group)コミュニティの紹介

どういうところ?

日本のFirebaseユーザーのコミュニティ

主な活動

勉強会などイベントの開催

Slackチャンネルはこちらから参加

Twitter ハッシュタグ #FJUG

発表

以下に発表内容をまとめます

タイトル

What's new in Cloud Firestore and MLKit

登壇者

@d_dateさん

資料

内容

FirestoreとMLKitの最新情報

FirestoreがGAになりました:raised_hands_tone1:

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):clap_tone1:
- 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がどのくらいされているのか、料金がどのくらいかかっているのかをモニタリングして
アラートを飛ばすこともできるように。

これから色々な機能が追加されていくようです。

下記はFirebaseのブログ記事にあった画像です

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でつくるグループチェックリスト管理サービス

登壇者

@mogamingさん

  • 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を使用する

具体例

データ構造

113d83f2e5a4a5bd437620859688c268-png.png

設計する時に考えた大事なこと

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名を表示する箇所は多数あるのでパフォーマンスや料金を意識

タイトル

無限スクロールの解説

登壇者

@kahirokunnさん
- 株式会社scouty

資料

https://slides.com/kahirokunn/deck-9#/
https://github.com/kahirokunn/book-management

内容

Firestoreやライブラリを使った無限スクロールの解説

使用ライブラリ

pring
rxfire
rxjs
vue + vuex

Firestoreのデータ取得は順序が決まっていない
更新日時の降順で取得することで更新されたことも一番上に来るようにする
{id:data}形式で流れてきたデータを全部保持しておき、getterで降順に並べ替え

タイトル

Firestore導入前に検討したかったベスト5

登壇者

@pitownさん
- 株式会社Hotspring
- ズボラ旅というサービスを作成

資料

内容

FirestoreをメインDBとしてFirestore中心に本番のプロダクトを開発した話

第5位 料金

結構な使用量でも1万円もかかっていないので安い(これからさらに安くなる)

第4位 プロダクトへの適正

DB構造さえも変わってしまうような仕様変更のあるスピード感が必要なサービスには良い。
スキーマレスなので変更に非常に強い。

一方でリレーションがすごい重要なデータを扱い場合には合わないかも(そんなにあるかは疑問)


TipsとしてReadとWriteの型があっていると処理が楽になる

第3位 アーキテクチャ

f91d0c4407d48b8cf2f7497a6a767ab2-png.png

83dc61008471e6382c460df28a81634c-png.png

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などで共に参加されたみなさま、
今回は有意義な時間を誠にありがとうございました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
7
Help us understand the problem. What are the problem?