とりあえずやってみればいいじゃん

とりあえずやってみればいいじゃん

エンジニア関連のことについてつらつら書くブログ

Firebaseハンズオンを実施しました #techplaygirls #fjug

先日FirebaseのハンズオンをTECH PLAY女子部で実施したので、どんなことをやったのか、軽く紹介したいと思います。

techplay.jp

流れ

講師にFirebase Japan User Group(以下FJUG)の方をお迎えしており、

  • Firebaseってどんなもの?
  • ハンズオンしてみよう
  • +αの情報

について実施していただきました。

ハンズオンはCodeLabsにあるFriendlyEatsをお題として取り組みました。

※当日の資料はこちらに上がっています。

Firebaseの説明

Firebaseとは

  • Googleが提供するMBass
  • いろいろなプロダクトが詰まった総合体
  • ほぼ全てのプロダクトが無料!!!
  • 単体で使うだけでなく、組み合わせるともっと幸せになれることも

今回のハンズオンで使うプロダクト

  • Cloud Firestore

    • NoSQL型のDB(not リレーショナル)
    • 高機能なクエリ処理が可能
    • リアルタイムアップデート可能✨
    • オフライン処理ができる
    • まだβ版ではあるものの、商用利用実績多数
  • Firestore Hosting

  • Firestore Authentication

    • 少ない操作で高品質な認証機能が使える🔒
      • 大幅なコスト減 ⤵
    • 認証情報を利用して他プロダクトとの連携が可能
      • 認証をパスした人だけサービスを利用できるなど
    • フェデレーションIDプロバイダとの統合が可能

ハンズオンの内容

FriendlyEatsを各自読みつつ、わからなければ質問という形式で進めました。

このFriendlyEatsに対する個人的な感想としてはこんなかんじです。

  • 説明に沿ってサンプルコードを書き換えていくと、短時間でほど良く何がどうなっているのかがわかって良い
  • 比較的平易な英語で読みやすい

あとで暇があれば日本語でなんとなくまとめた記事でも書こうかなと思います。とにかく今回やってみて良かったので、他のサンプルも触ろうかなと思いました。

+αの話

  • リレーショナルデータベース
    • 表をイメージすれば良い。
  • NoSQLデータベース(Firebaseの場合の話)

    • コレクションとドキュメントを使って保存
    • フォルダとファイルの関係と同じようなもの
    • 今日の場合はコレクションがレストラン、ドキュメントがレストラン情報
  • セキュリティルール

    • データ保護の機構
    • 普段の「admin」とかに代わるようなもの
    • Twitter IDの人だけアクセス可能にするなど
    • Firebaseコンソールやコマンドラインから操作可能
    • jsonのような書き方をする
    • テストモードは何でもOK状態なので気をつけること!
  • オフライン対応

    • オフライン時はローカルに保存して、オンラインになった時に同期させることが可能
    • この機能はON/OFFの切り替えができる
    • デフォルトではwebだとOFF、iOS, AndroidだとONになっている
  • 料金など

    • 1 ドキュメントは基本1write/sec
    • ドキュメントのread/write回数に大きく影響を受ける
    • 今日の場合だとレストラン1店舗のデータを読み書きする回数に影響する
    • そのため、データをどのように管理するかを考えること(ドキュメントを分けた方がいいのかどうかなど)
    • 1ドキュメントへの同時書き込みは避ける
    • 詳しくは公式ドキュメントで
  • データ管理

    • 様々な開発環境用のSDKがある
    • 取得/更新/追加/削除はクエリで行う
    • クエリはそこまで融通効かない(特に複合クエリ)

クエリの融通が効かない例としては、以下の通りです。
今回の例だと、現状では価格が3($$$)ピッタリの時は検索できるが、3以下という検索ができない状態になってます。試しに以下のように変更してみます。

query = query.where('price', '==', filters.price.length);
↓
query = query.where('price', '<=', filters.price.length);

すると、何も出てこなくなります。Firestoreにはindexという、事前にソートされたデータ列を自動生成しておく仕組みが働いています。今回のように複数のフィールドをまとめたindexについては明示的に作成を指示する必要があります。

whereをつなげて論理ANDを使うことはできますが、比較演算子を1つ以上加えるとうまくいかないなどの制約があります。

sortを使う時も注意が必要です。比較演算子を入れている場合は、比較に使ったフィールドでまずソートしなければいけないという制約があります。今回の場合は、価格でソートしなければなりません。

ということで価格3以下を抽出したい場合、次のように記述します。

query = query.where('price', '<=', filters.price.length);
query = query.orderBy('price', 'desc');

その他お役立ち情報

最後に

講師の皆様、参加者の皆様ありがとうございました!

f:id:akatsuki174:20181122091753j:plain