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

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

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

3/19 Realm World Tour - The Realm Mobile Platform Experience #realmworld

アジェンダ

  • The Realm Mobile Platform Experience
  • Product updates
  • Guest presentations
    • Ito
    • Fumihiko Siroyama
  • Introduce Error Prone
  • Realm Mobile Platform Demo
  • Realm本、Tシャツプレゼント
  • 写真撮影、懇親会

連絡先(日本語で質問できる)

f:id:akatsuki174:20170320231010j:plain

The Realm Mobile Platform Experience@Marius Rackwlzさん

f:id:akatsuki174:20170320230014j:plain

  • ベルリンからtry!Swiftのスピーカーとして来た
  • どういった機能を持っていて、どのように活用していくのかについて

  • 長い間βバージョンだった

    • 昨年、1.0になった
  • メジャーアップしない限りは破壊的な仕様変更はない
  • 多くの企業に採用して貰った
  • あなたのiPhoneにあるアプリの少なくとも1つはRealmを使っている

  • Realmは既存のDBを使っているのではない

    • 1からスクラッチで作ったDBエンジンを使っている
    • そのため省メモリでデバイスに最適化されたものになっている
  • 特徴的なもの:LiveObject
    • データを更新した時に自動的に他も更新されて常に最新の状態に保たれる
    • メモリに出来る限りデータをコピーしないようにしている
    • これによって高速が保たれている
    • 最近のモバイル開発に求められるスムーズなインタラクションの提供やUIの変更をできるだけシンプルにしたいという要求にこたえられるSDKになっている

f:id:akatsuki174:20170320230019j:plain

  • ライブオブジェクトを提供するために重要だと考えている部分の部品
  • リアクティブなアプリをシンプルに作れる

Object

f:id:akatsuki174:20170320230025j:plain

  • 保存するオブジェクトをどのように作ればいいのか

    • クラス定義を作ればオブジェクトを作れる
    • CoreDataのように中間生成物を作る必要はない
    • 他のクラスと同じようにメソッドを定義したりできる
  • オブジェクトをRealmに保存して、使う時はクエリを使う

    • 得られるオブジェクトはListだったりResultオブジェクトだったりする
    • 遅延ロード、メモリにコピーしないということに拘っているのでResultを取るだけだとメモリにはコピーされない
    • 1つ1つのオブジェクトのプロパティにアクセスするまではデータを取ってこない
    • Resultセットはある時点でのスナップショットで実際のデータは保持されていない
    • 再度アクセスした時には最新の状態のデータが取って来れるようになっている

Query

f:id:akatsuki174:20170320230030j:plain

  • コードを一見するとdocテーブルのオブジェクトを一気に取得してフィルタリングしているように見えるが、メタデータだけ取得している
  • クエリを発行した時点ではデータはメモリ上にコピーされない
  • puppiesのプロパティにアクセスした時にコピーされる
  • Dogオブジェクトが増えた時、再度このクエリを実行する必要はない

  • オブジェクトを取得してバックグラウンドで追加するのが典型的な例

  • Realmに変更があった場合、Notificationを使ってUIを更新しなければいけないということを知ることができる

Notification

f:id:akatsuki174:20170320230034j:plain

  • 先程のクエリの結果に対してaddNotificationBlock、もしくはaddChangeListenerで登録する
  • 変更がある度に呼ばれる
  • 件数が増えた、削除された、プロパティの値が変わったなど、どのレコードがどのように変わったかを細かく知ることができる
  • 変更に対してブロックで変更を受けてUIを更新するということができる
  • TableViewに向いている
  • 全体を書き換える必要はなく、変更があったところだけアニメーションで変化させるなどということができる

    • 全てが遅くなってしまわないようにしている
  • 逆に、UIの操作によってデータが変わることもある

  • データを更新する場合、Realmではトランザクションを使う決まりになっている

Transaction

f:id:akatsuki174:20170320230039j:plain

  • モデルのプロパティはRealmのテーブルのカラムを表している
  • これを変える場合にはTransactionを介して変更する
  • トランザクションを開いて閉じるというAPIもあるが、blocksで変更できる
    • 自動で閉じてくれる

  • ここまでが基本的な部分の解説
  • Realmは高速に動くし、簡単なAPIで動くように設計されている
  • マルチプラットフォームで使えるようになっている

Seamless Data Sync for Realtime Apps and Collaborative Features

  • 開発時にたくさんの要望をもらった
    • データの同期のリクエストが多かった
  • その問題を解決するためにサーバサイドの連携機能をもったモバイルプラットフォームを開発
  • サーバからデータをダウンロードしてクライアントで変更してそれをサーバに送るのは簡単ではない
    • Realmが肩代わりして任せてしまえるようになっている

Realtime sync with REST

f:id:akatsuki174:20170320230045j:plain

  • データを同期するアプリは簡単ではない
  • 難しさを表現するためにこの図をよく使っている
    • やりたいことは氷山の部分
      • リクエストしてデータ受け取ってUIをアップデートする
    • でも考えなければ行けない要素がいっぱいある
    • 最初は接続できてたけど途中で繋がらなくなったとか
    • これに加え、1人目のユーザは成功したけど2人目のユーザが失敗した時、など考えなければいけない
  • この図にあるようにエラーが起こる時はたくさんある
  • 全てに対処するのは大変
  • エラーを全て網羅してもうまくリトライするのは難しい

The Realm Mobile Platform vs REST API

f:id:akatsuki174:20170320230050j:plain

  • Realmを使った場合RESTを使った場合と異なる
    • 自分でjsonをパースしたりする必要はない
  • 基本的にサーバとクライアントの状態が不一致になるということはない
  • サーバではMySQLでクライアントではSQLiteというのとは違う
    • バイスにあるものとほぼ同じものをサーバで開いて編集できるイメージ
  • 同時に複数人が同じ行、同じカラムを変更しようとするとコンフリクトしそうだが、Realmが自動的に頑張ってくれる
    • その挙動をカスタマイズすることも可能
  • Realmを使うことによって特別にネットワークとやりとりするものを書く必要はない
    • ローカルDBに書くだけで良い
    • サーバから取ってくるとかはRelamがやってくれる
    • 他のデバイスで行われている変更が自分のデバイスでも検知できる
    • シームレスに行われるので同じデバイスの別のスレッドで変更が行われているようなイメージでできる
    • 全てのデバイス、サーバサイドで同じデータベースを持つことになる
  • 本当に簡単に書けるようになる
    • REST、jsonと違ってデータの変更を書く必要がない
    • ローカルのデータベースを使っているときと同じようにローカルのDBに保存するという処理をやればいい
    • データ転送は極力少なくなるように最適化している
    • あるモデルのあるプロパティを変更したという場合はその差分だけが送られる
    • オンラインの場合は常にデータが同期することが保たれる

Changing your apps architecture from this…

f:id:akatsuki174:20170320230056j:plain

  • RestAPIを使う場合はこのように複雑になっている
    • 何らかのSQLiteを使う、APIの層があって、パースする必要があってなどいろいろ考慮する必要がある
  • それだけで済めばいいが何かダウンロードした後にサーバ側に反映する前に他のユーザが変更した場合は何かしらの対処をしなければならない
  • 不具合を出さずに保つのは結構大変なこと

…to this

f:id:akatsuki174:20170320230100j:plain

  • 先程の複雑なアーキテクチャ全てのいろいろな渾然一体になっていたものから、Realmを使うとシンプルに、Realmだけを使ったアーキテクチャにすることができる
  • この場合だとjsonからオブジェクトに直したりしなくてもいい
  • もしサーバサイドで別のシステムと連携しても、サーバサイドにもRealmのAPIがあるのでそれを使えばモダンなやり方で徐々に変えていくことができる
    • データ連携のAPIを使ってサーバサイドの玄関だけでも置き換えるということが可能

Data Access API

f:id:akatsuki174:20170320230107j:plain

  • サーバサイドでRealmを使う時の例
  • 先程のクライアントのコードと同じような形で書くことができる
    • このコードではRealmのオブジェクトサーバに接続する部分は省き、変更するところだけ書いている
  • 接続するコードは1,2行の話
  • 変更する時にはTransactionがあってサーバで加えた変更は自動でそれぞれのクライアントに同期される
  • 今までAPIを通じてやっていたことをRealmで置き換えられる

More Server Features

f:id:akatsuki174:20170320230112j:plain

  • これまで紹介してきた基本的な機能に加えてRealmのモバイルプラットフォームが提供しているサーバサイドの機能はこちら
  • 通信はSSLで暗号化される
  • 同期はリアルタイムで行われている
  • ロードバランサや複数のサーバに負荷を分散させて 水平方向のスケーラビリティを増やす機能もある
  • 何かサーバに障害があってもある時点のバックアップを復元する機能もある

Demo #1


Realm Mobile Platform

f:id:akatsuki174:20170320230116j:plain

  • realm.ioのページから試すことができる
  • このスクショにあるようなTodoアプリも入っているのですぐに試すことができる
  • サーバと同期する部分、TableViewを使った時のテクニックを学ぶことができる
  • Java, ReactNativeなどを使ったサンプルある
  • OSSではないが無料で使うことができる
  • サーバサイドのロジックを書く場合は料金が必要になるが、2ヶ月のトライアル期間がある
  • フィードバックください

We’re hiring

f:id:akatsuki174:20170320230120j:plain

  • Realmを使うのは簡単
  • Realmを使ってアプリ作ったらぜひ教えてほしい

    • それを見て自分としても改善していくべきことが見つかる
  • 自分はRealmの中で初めてリモートで働き始めたうちの一人

  • 世界中でリモートで働いている人もいる
  • Realmで働くことに興味があれば連絡ください

Question

f:id:akatsuki174:20170320230128j:plain

  • RealmDBに画像のバイナリデータを入れるというのは良いアイディアでしょうか。何か他の方法があるでしょうか。

    • 一般的にはあまりいい方法ではない
    • クエリにヒットするわけでも、ソートできるわけでもないので
    • AWSやその他既存サービスに保存してURLを保存した方が
  • Webコンソールや管理画面でパーミッション変更を行えるようにする予定はあるのか

    • Webコンソールを用意する予定はある
    • ユーザ一覧見たり追加したりする画面があるがそれに入れるつもり
  • データを同期するソリューションはFirebaseなど他にもあるが使い所は?

    • Firebase
      • ソフトウェアサービス
      • 従量課金
      • スキーマレス
    • Realm Mobile Platform
      • オンプレミスで自分で使うこともできる
      • ユーザ数に関わりなく一定料金で使える
      • データ構造がある
      • モバイルのためにスクラッチで新たに作ったものなので他のソリューションよりモバイルの体験という意味ではかなり有力だと考えている
  • データ共有をテーブルやオブジェクトの管理単位でできるのか

    • パーミッションコントロールは現在はファイル単位での共有
    • ユーザ1人1人によって異なっていてそれを共有するように権限変更できる
    • 質問のようにもっと細かいパーミッションのコントロールは今のところはできないがロードマップにある
    • クエリのところはまとめて取ってこれるような機能も合わせて機能追加を検討している
  • モバイルプラットフォームは実際の製品でどのような場面で使われているか

    • 具体的な名前は言えないがローンチする前から協力してもらった病院がある
    • どこに病院があるかを探すアプリ
    • その他データ配布するためにつかっていた
    • 暗号化で使われたり
    • まずはRealmのサンプルを見るといろいろわかる
    • Todoアプリは典型的な、APIをRealmで置き換えている例

togetter

3/19 Realm World Tour #realmworld - Togetterまとめ