狠狠撸

狠狠撸Share a Scribd company logo
Parseでちゃんとアプリ
を作るコツ
~サーバー運用をしないアプリ開発の時代へ~
Indie Inc.
Co-Founder & CTO
Takuya Tejima
自己紹介
? Takuya Tejima (@tejitak)
? IBM -> LINE -> Indie Inc
※ DevMorningという朝活を毎週やってます
Parseとは
? https://parse.com/
? 2013年にFacebookが買収したMBaaS(Mobile Backend as a Service)
2015/12現在?IoTなどに力を入れている模様
(AppleTV / AppleWatch向けSDK公開)
ReactベースのDashboardに書き換えられた
日本だと、CyberAgent, mixi, Wantedly, Tokyo OtakuModeなどが大きなユーザー
Parseの特長
? バックエンド実装のサービス化
? Data Store
? インデックス自動生成&勝手にスケールしてくれる!!
? ユーザー管理 (Auth / Role)
? プラットフォーム対応
? SDK for Desktop + Web / Mobile / Embedded + IoT
? File / Code Hosting
? Mobile Push配信
? App Monitor / Analytics
Pricing
? https://parse.com/pricing
Data Store
30req/sec
Data/File 20GB / Transfer 2TB
までFree
Push
100万通知/月まで
Free
Analytics
Free
実際BaaSってどうなの?
? 複雑な処理やクラス構造に対応できるの?
? -> できる
? パフォーマンスは?
? -> 自前でチューニングした方が速いかもしれないが、Facebookが作ってるし大丈夫かと
? 学習コストは?
? -> 2, 3日ドキュメント読めば大体わかるかと
? 将来replaceできるの?
? -> Parse上で定義したAPIと同じものであれば容易に移行できるはず
個人的な結論
使うかどうかは結局費用対効果の問題。例えばサーバーの運用をす
るメンバーがいない場合は、積極的に使う価値がある
Parseで作ってみた
? https://hashdish.com
現在Beta版。ぜひご意見などお待ちしております。
ちゃんとアプリを開発するためのParseの機能紹介
? SDK
? Data Store
? Class定義
? GeoPoint
? File
? relationship (Pointer / Relation)
? 認証 / SNS連携
? Role / ACL
? API Console
? Cloud Code
SDK
? 豊富な種類のSDKが用意されている
? https://parse.com/docs
まずはREST APIのDocumentを読むことがオススメ(他のSDKはREST APIをWrapしている)
https://parse.com/docs/rest/guide
SDK
? オブジェクトを新規保存するコード例 (JS)
var GameScore = Parse.Object.extend("GameScore");
var gameScore = new GameScore();
gameScore.set("score", 1337);
gameScore.set("playerName", "Sean Plott");
gameScore.save(null, {
success: function(gameScore) {
alert('New object created with objectId: ' + gameScore.id);
},
error: function(gameScore, error) {
}
});
? オブジェクトを読み出すコード例 (JS)
var GameScore = Parse.Object.extend("GameScore");
var query = new Parse.Query(GameScore);
query.get("xWMyZ4YEGZ", {
success: function(gameScore) {
// The object was retrieved successfully.
},
error: function(object, error) {
}
});
https://parse.com/docs/js/guide
(JS SDKはbackbone.jsベースで作られている)
クラス定義
? Data Browserで直接データの管理ができる
? クラス定義
? データセットの雛型をクラスとして定義できる
? 自由にカラムを追加できる(後から柔軟にスキーマの変更が可能)
? カラム(クラスのフィールド)ごとに型の定義が可能
? 選択可能な型指定: Boolean, String, Number, Date, Object, Array,
GeoPoint, File, Pointer, Relation
? 型はJSON形式で“__type”プロパティとして格納される (e.g. __type: ’Pointer’)
? 全てREST APIで操作が可能
/1/classes/<className> POST Creating Objects
/1/classes/<className>/<objectId> GET Retrieving Objects
/1/classes/<className>/<objectId> PUT Updating Objects
/1/classes/<className> GET Queries
/1/classes/<className>/<objectId> DELETE Deleting Objects
REST API
File
? S3みたいなもの
? APIでPOST
? http://files.parsetfss.com/bc9f32df-2957-4bb1-93c9-
ec47d9870a05/tfss-db295fb2-8a8b-49f3-aad3-dd911142f64f-
hello.txt
? Objectの任意のpropertyに関連付け可能
? File自体のDELETEにはMaster Keyが必要
{
"name": "Andrew",
"picture": {
"name": "...pro?le.png",
"__type": "File"
}
}
GeoPoint
? GeoPointクラスを使用すると位置情報のクエリを簡単に実現で
きる
? __type=“GeoPoint”でlatitude /longitudeプロパティ
を持つ
? GeoQuery
? 与えた位置情報の近くを検索: $nearSphere
? 指定した2地点を橋とする四角形内で検索: $winthin.$box
Relationship (Pointer vs Relation)
? 参照?関係を表現する型としてPointerとRelationが使用できる
Pointer 参照オブジェクトを格納するもの。Pointerを保有クラスへの1回のクエリとして展開して含めることができる
Relation 関連を定義し、関連アイテムの追加?削除が可能。Relationを保有するクラスへの1回のクエリでは取得できない
? 関連ごとに幾つかのアプローチが可能
? Pointer (one-to-one、one-to-manyリレーション向け)
? Pointer Arrays (one-to-many、many-to-manyリレーション向け)
? Parse Relations (many-to-manyリレーション向け)
? Join Tables (many-to-manyリレーション向け)
? ArraysとRelationsの使い分けは?-> 一回で取得したい場合、そして数が少量(約100以下)ならArray
? Join Tabelsは?
? ケース1 参照関係を双方向から同レベルで解決したい時にArraysやRelationを双方向に持つより有
効 (e.g. この写真にいいねをした人のリストが欲しい / この人がいいねをした写真のリストが欲し
い)?relationを双方に持たなくても逆のクエリは発行できるが、queryが非効率だったりする
? ケース2 “関係”そのものにメタデータが必要な時有効(e.g. 関係の作られた日時など)
認証?SNS連携
? 認証
? Pre-definedなUser / Sessionクラスが用意されている
? 各SDKに用意されているloginメソッドを使用するだけで、ユーザーデータ
の更新とセッションの管理をしてくれる
? SDKを使用しない場合は自前でsession tokenを保持する必要あり
(Webならcookieなどに保持してX-Parse-Session-Tokenをhttp
headerに付与)
? sessionのvalidationするには https://api.parse.com/1/
users/me or https://api.parse.com/1/sessions/me
? Facebook / Twitter OAuth認証はParseの設定画面でAppIDなどを
セットしておけばSDKによってコードレスで実現可能
Role / ACL
? UserにAssignできるRoleを定義できる
? 例: Admin roleの定義など
? 各Role / UserごとにACLを設定できる
? 例: Publicにはread only, adminと特定ユーザーだけwriteも許可
API Console
? Debug用に便利なAPI Consoleが提供されている
? Demo
Likeの実装例
? クラス構成のアプローチ
? 1 Pointer Arrayを使う
? 2 Relationを使う
? 3 Join Tableを使う
? HashDishでは将来の拡張性を考慮してActivityというクラスをJoin Tableとして使っている
? 適切なACLの設定
? ACLの付与はRow単位。Columnごとに設定できないので、一つのクラスに編集させ
たくないデータとユーザが変種可能なデータは基本的に混在してはいけない (->
後述のCloud Codeをすることで実装することは可能)
Cloud Code
? Trigger: コードをParseにhostして、データ変
更をhookすることができる
? beforeSave, afterSave,
beforeDelete, afterDelete
? 追加処理 (e.g. likeされたら別クラス
にlike countをincrement)
? validation (e.g. すでに同じユーザー
がlikeしているかどうかcheck)
? Function:
? JSのコードで独自のAPIを実装できる
? session tokenがvalidなリクエストの場合User情報を利用できる
? リクエストをまとめたい時に便利
? debugは少し大変
? debugger + node-inspectorでなんとかなる
? https://github.com/mariusciocan/parse-cloud-debugger
? JSのコードをホスティングして、API hookや独自のAPIを定義することができる強力な仕組み
Cloud Code Triggerの例
? likeした時にadmin roleとそのユーザー自身のみwrite可のACLを付与するhookを追加する例
var Activity = Parse.Object.extend("Activity");
var createMyACL = function(userId) {
var acl = {};
acl["*"] = {"read": true};
acl["role:admin"] = {"read": true, "write": true};
acl[userId] = {"read": true, "write": true};
return acl;
};
var assignACLTrigger = function(request, response) {
// allow master
if (request.master) {
return response.success();
}
// user must be authenticated
if (request.user) {
// Request to update existing row. Let it proceed.
// The PUT request will cause error by ACL if the user is invalid
if (!request.object.isNew()) {
return response.success();
}
// set ACL for POST request
request.object.set('ACL', createMyACL(request.user.id));
response.success();
} else {
return response.error("Not logged in.");
}
}
// modify POST request with ACL
Parse.Cloud.beforeSave(Activity, assignACLTrigger);
Parseを活用するためのコツ
? クラスの定義はPointer / Relation / JoinTableを場合に応じて利用する
? ACLの設定はきちんとする(デフォルトでpublic read/writeになってたら誰
でもデータ消せちゃうよ)
? Cloud Codeの活用
? 適切な追加処理の実装
? ACLの付与やvalidationなど各プラットフォームのクライアントでの冗
長な実装の防止。
? リクエストの効率化
? 完全にRESTfulだと初期ページに3 requestsくらい必要だったりする
-> cloud codeで一つにまとめる
他にも色々な機能がある
? サーバーテンプレートのホスティング (cloud codeでexpressが動くらしい)
? Jobs
? Schedule可能なbatch処理の実行
? Push
? ユーザーグループを作って配信するだけ
? schedulingもdashboardから可能
? localize
? 100万件/月 配信まで無料
? Analytics
Thank you
Ad

Recommended

PPTX
データを扱いたい!はじめての础奥厂
ShoichiYashiro
?
KEY
20121103 #odstudy できる! VBAマクロ
Hiyou Shinnonome
?
PDF
意识低く惭别迟别辞谤绍介
hashedrock
?
PDF
DevMorning
Takuya Tejima
?
PDF
海外で注目されてるJs framework “mithril”の特徴
Shoyo Kyou
?
PDF
Riot + generator で始める新しいデータバインディング
Tsutomu Kawamura
?
PDF
React Canvasて?作るFlappy Bird
Takuya Tejima
?
PPTX
Global Startup Creators vol.5 - Facebook bot development handson
Takuya Tejima
?
PDF
笔补谤蝉别触ってみた
Naoya Harasawa
?
PDF
5分でわかったつもりになる笔补谤蝉别.肠辞尘
Kenta Tsuji
?
PDF
笔补谤蝉别.肠辞尘を使ってみた感想とまとめ
Fumiya Sakai
?
PPTX
Facebook Parseの世界
maruyama097
?
PDF
Parse introduction
Tamura Koya
?
PPTX
北海道勉强会冲20140531
Hiraku Komuro
?
PDF
尘叠补补厂の基本的な扱い方の事始め(辫补谤蝉别.肠辞尘と狈颁惭叠の使い方比へ?)
Fumiya Sakai
?
PDF
MBaaS - Parse
Junya Yamaguchi
?
PPTX
RESTからGraphQL APIへの移行て?学んた?こと.pptx
Yuya55
?
KEY
スマートフォンアプリケーション开発の最新动向
Tsutomu Ogasawara
?
PDF
2014.09.16 jsオシ?サン3
pandeiro245
?
PDF
滨翱厂/础苍诲谤辞颈诲アフ?リの3つの大事な设计方针
Ken Morishita
?
PDF
Api
Jun Chiba
?
PPTX
初めての笔补谤蝉别.肠辞尘
Shigeki Yamato
?
PDF
Ext JS version 5 を始めよう
久司 中村
?
PDF
Hypermedia: The Missing Element to Building Adaptable Web APIs in Rails (増補日本語版)
Toru Kawamura
?
PDF
【2018/09/11】PAYでのReact Nativeにおける APIクライアント実装 について
Natsuki Yamanaka
?
PDF
罢4使ってみた
Ryota Murohoshi
?
PDF
JavaScript.Next
dynamis
?
PPTX
FacebookAPI for iOS
Hidetoshi Mori
?
PDF
Nest.js Introduction
Takuya Tejima
?
PDF
モダンフロントエンド开発者に求められるスキルとは
Takuya Tejima
?

More Related Content

Similar to 笔补谤蝉别て?ちゃんとアフ?リを作るコツ (20)

PDF
笔补谤蝉别触ってみた
Naoya Harasawa
?
PDF
5分でわかったつもりになる笔补谤蝉别.肠辞尘
Kenta Tsuji
?
PDF
笔补谤蝉别.肠辞尘を使ってみた感想とまとめ
Fumiya Sakai
?
PPTX
Facebook Parseの世界
maruyama097
?
PDF
Parse introduction
Tamura Koya
?
PPTX
北海道勉强会冲20140531
Hiraku Komuro
?
PDF
尘叠补补厂の基本的な扱い方の事始め(辫补谤蝉别.肠辞尘と狈颁惭叠の使い方比へ?)
Fumiya Sakai
?
PDF
MBaaS - Parse
Junya Yamaguchi
?
PPTX
RESTからGraphQL APIへの移行て?学んた?こと.pptx
Yuya55
?
KEY
スマートフォンアプリケーション开発の最新动向
Tsutomu Ogasawara
?
PDF
2014.09.16 jsオシ?サン3
pandeiro245
?
PDF
滨翱厂/础苍诲谤辞颈诲アフ?リの3つの大事な设计方针
Ken Morishita
?
PDF
Api
Jun Chiba
?
PPTX
初めての笔补谤蝉别.肠辞尘
Shigeki Yamato
?
PDF
Ext JS version 5 を始めよう
久司 中村
?
PDF
Hypermedia: The Missing Element to Building Adaptable Web APIs in Rails (増補日本語版)
Toru Kawamura
?
PDF
【2018/09/11】PAYでのReact Nativeにおける APIクライアント実装 について
Natsuki Yamanaka
?
PDF
罢4使ってみた
Ryota Murohoshi
?
PDF
JavaScript.Next
dynamis
?
PPTX
FacebookAPI for iOS
Hidetoshi Mori
?
笔补谤蝉别触ってみた
Naoya Harasawa
?
5分でわかったつもりになる笔补谤蝉别.肠辞尘
Kenta Tsuji
?
笔补谤蝉别.肠辞尘を使ってみた感想とまとめ
Fumiya Sakai
?
Facebook Parseの世界
maruyama097
?
Parse introduction
Tamura Koya
?
北海道勉强会冲20140531
Hiraku Komuro
?
尘叠补补厂の基本的な扱い方の事始め(辫补谤蝉别.肠辞尘と狈颁惭叠の使い方比へ?)
Fumiya Sakai
?
MBaaS - Parse
Junya Yamaguchi
?
RESTからGraphQL APIへの移行て?学んた?こと.pptx
Yuya55
?
スマートフォンアプリケーション开発の最新动向
Tsutomu Ogasawara
?
2014.09.16 jsオシ?サン3
pandeiro245
?
滨翱厂/础苍诲谤辞颈诲アフ?リの3つの大事な设计方针
Ken Morishita
?
初めての笔补谤蝉别.肠辞尘
Shigeki Yamato
?
Ext JS version 5 を始めよう
久司 中村
?
Hypermedia: The Missing Element to Building Adaptable Web APIs in Rails (増補日本語版)
Toru Kawamura
?
【2018/09/11】PAYでのReact Nativeにおける APIクライアント実装 について
Natsuki Yamanaka
?
罢4使ってみた
Ryota Murohoshi
?
JavaScript.Next
dynamis
?
FacebookAPI for iOS
Hidetoshi Mori
?

More from Takuya Tejima (14)

PDF
Nest.js Introduction
Takuya Tejima
?
PDF
モダンフロントエンド开発者に求められるスキルとは
Takuya Tejima
?
PDF
Next.js Storybook Driven Development
Takuya Tejima
?
PDF
グローバルエンジニアキャリア はじめの一歩
Takuya Tejima
?
PDF
骋础翱骋础翱発表资料?エンジニアギルドミートアップ?
Takuya Tejima
?
PDF
尝补谤补惫别濒管理画面ジェネレーター
Takuya Tejima
?
PDF
エンジニア?コミュニティ?ドリブンで会社を成长させていく骋础翱骋础翱
Takuya Tejima
?
PDF
「コリビング&コワーキング / スキルアップ / ジョブマッチング / 起業支援」GAOGAO(ガオガオ)エンジニア事務所 18
Takuya Tejima
?
PDF
GAOGAO (ガオガオ) サービス事業概要 2018年8月
Takuya Tejima
?
PDF
骋础翱骋础翱ゲート2期生サービス概要资料
Takuya Tejima
?
PDF
骋础翱骋础翱事业のご绍介
Takuya Tejima
?
PDF
Global Creators Workshop in Asia
Takuya Tejima
?
PPTX
How to Build SPA with Vue Router 2.0
Takuya Tejima
?
PPTX
Vue 2.0 + Vuex Router & Vuex at Vue.js
Takuya Tejima
?
Nest.js Introduction
Takuya Tejima
?
モダンフロントエンド开発者に求められるスキルとは
Takuya Tejima
?
Next.js Storybook Driven Development
Takuya Tejima
?
グローバルエンジニアキャリア はじめの一歩
Takuya Tejima
?
骋础翱骋础翱発表资料?エンジニアギルドミートアップ?
Takuya Tejima
?
尝补谤补惫别濒管理画面ジェネレーター
Takuya Tejima
?
エンジニア?コミュニティ?ドリブンで会社を成长させていく骋础翱骋础翱
Takuya Tejima
?
「コリビング&コワーキング / スキルアップ / ジョブマッチング / 起業支援」GAOGAO(ガオガオ)エンジニア事務所 18
Takuya Tejima
?
GAOGAO (ガオガオ) サービス事業概要 2018年8月
Takuya Tejima
?
骋础翱骋础翱ゲート2期生サービス概要资料
Takuya Tejima
?
骋础翱骋础翱事业のご绍介
Takuya Tejima
?
Global Creators Workshop in Asia
Takuya Tejima
?
How to Build SPA with Vue Router 2.0
Takuya Tejima
?
Vue 2.0 + Vuex Router & Vuex at Vue.js
Takuya Tejima
?
Ad

Recently uploaded (6)

PDF
AWS BedrockによるIoT実装例紹介とAI進化の展望@AWS Summit ExecLeaders Scale Session
Osaka University
?
PPTX
[Liberaware] Engineer Summer Internship.pptx
koyamakohei
?
PDF
フィシ?カル础滨时代のセキュリティ:ロホ?ティクスと础滨セキュリティの融合のあり方
Osaka University
?
PDF
React Native vs React Lynx (React Native Meetup #22)
Taiju Muto
?
PDF
音学シンポジウム2025 招待讲演 远隔会话音声认识のための音声强调フロントエント?:概要と我々の取り组み
Tsubasa Ochiai
?
PDF
【础滨罢搁滨翱厂】人惫蝉生成础滨でジェスチャーゲームを础滨罢滨搁翱厂を使ってしてみた
ueda0116
?
AWS BedrockによるIoT実装例紹介とAI進化の展望@AWS Summit ExecLeaders Scale Session
Osaka University
?
[Liberaware] Engineer Summer Internship.pptx
koyamakohei
?
フィシ?カル础滨时代のセキュリティ:ロホ?ティクスと础滨セキュリティの融合のあり方
Osaka University
?
React Native vs React Lynx (React Native Meetup #22)
Taiju Muto
?
音学シンポジウム2025 招待讲演 远隔会话音声认识のための音声强调フロントエント?:概要と我々の取り组み
Tsubasa Ochiai
?
【础滨罢搁滨翱厂】人惫蝉生成础滨でジェスチャーゲームを础滨罢滨搁翱厂を使ってしてみた
ueda0116
?
Ad

笔补谤蝉别て?ちゃんとアフ?リを作るコツ

  • 2. 自己紹介 ? Takuya Tejima (@tejitak) ? IBM -> LINE -> Indie Inc ※ DevMorningという朝活を毎週やってます
  • 3. Parseとは ? https://parse.com/ ? 2013年にFacebookが買収したMBaaS(Mobile Backend as a Service) 2015/12現在?IoTなどに力を入れている模様 (AppleTV / AppleWatch向けSDK公開) ReactベースのDashboardに書き換えられた 日本だと、CyberAgent, mixi, Wantedly, Tokyo OtakuModeなどが大きなユーザー
  • 4. Parseの特長 ? バックエンド実装のサービス化 ? Data Store ? インデックス自動生成&勝手にスケールしてくれる!! ? ユーザー管理 (Auth / Role) ? プラットフォーム対応 ? SDK for Desktop + Web / Mobile / Embedded + IoT ? File / Code Hosting ? Mobile Push配信 ? App Monitor / Analytics
  • 5. Pricing ? https://parse.com/pricing Data Store 30req/sec Data/File 20GB / Transfer 2TB までFree Push 100万通知/月まで Free Analytics Free
  • 6. 実際BaaSってどうなの? ? 複雑な処理やクラス構造に対応できるの? ? -> できる ? パフォーマンスは? ? -> 自前でチューニングした方が速いかもしれないが、Facebookが作ってるし大丈夫かと ? 学習コストは? ? -> 2, 3日ドキュメント読めば大体わかるかと ? 将来replaceできるの? ? -> Parse上で定義したAPIと同じものであれば容易に移行できるはず 個人的な結論 使うかどうかは結局費用対効果の問題。例えばサーバーの運用をす るメンバーがいない場合は、積極的に使う価値がある
  • 8. ちゃんとアプリを開発するためのParseの機能紹介 ? SDK ? Data Store ? Class定義 ? GeoPoint ? File ? relationship (Pointer / Relation) ? 認証 / SNS連携 ? Role / ACL ? API Console ? Cloud Code
  • 9. SDK ? 豊富な種類のSDKが用意されている ? https://parse.com/docs まずはREST APIのDocumentを読むことがオススメ(他のSDKはREST APIをWrapしている) https://parse.com/docs/rest/guide
  • 10. SDK ? オブジェクトを新規保存するコード例 (JS) var GameScore = Parse.Object.extend("GameScore"); var gameScore = new GameScore(); gameScore.set("score", 1337); gameScore.set("playerName", "Sean Plott"); gameScore.save(null, { success: function(gameScore) { alert('New object created with objectId: ' + gameScore.id); }, error: function(gameScore, error) { } }); ? オブジェクトを読み出すコード例 (JS) var GameScore = Parse.Object.extend("GameScore"); var query = new Parse.Query(GameScore); query.get("xWMyZ4YEGZ", { success: function(gameScore) { // The object was retrieved successfully. }, error: function(object, error) { } }); https://parse.com/docs/js/guide (JS SDKはbackbone.jsベースで作られている)
  • 11. クラス定義 ? Data Browserで直接データの管理ができる ? クラス定義 ? データセットの雛型をクラスとして定義できる ? 自由にカラムを追加できる(後から柔軟にスキーマの変更が可能) ? カラム(クラスのフィールド)ごとに型の定義が可能 ? 選択可能な型指定: Boolean, String, Number, Date, Object, Array, GeoPoint, File, Pointer, Relation ? 型はJSON形式で“__type”プロパティとして格納される (e.g. __type: ’Pointer’)
  • 12. ? 全てREST APIで操作が可能 /1/classes/<className> POST Creating Objects /1/classes/<className>/<objectId> GET Retrieving Objects /1/classes/<className>/<objectId> PUT Updating Objects /1/classes/<className> GET Queries /1/classes/<className>/<objectId> DELETE Deleting Objects REST API
  • 13. File ? S3みたいなもの ? APIでPOST ? http://files.parsetfss.com/bc9f32df-2957-4bb1-93c9- ec47d9870a05/tfss-db295fb2-8a8b-49f3-aad3-dd911142f64f- hello.txt ? Objectの任意のpropertyに関連付け可能 ? File自体のDELETEにはMaster Keyが必要 { "name": "Andrew", "picture": { "name": "...pro?le.png", "__type": "File" } }
  • 14. GeoPoint ? GeoPointクラスを使用すると位置情報のクエリを簡単に実現で きる ? __type=“GeoPoint”でlatitude /longitudeプロパティ を持つ ? GeoQuery ? 与えた位置情報の近くを検索: $nearSphere ? 指定した2地点を橋とする四角形内で検索: $winthin.$box
  • 15. Relationship (Pointer vs Relation) ? 参照?関係を表現する型としてPointerとRelationが使用できる Pointer 参照オブジェクトを格納するもの。Pointerを保有クラスへの1回のクエリとして展開して含めることができる Relation 関連を定義し、関連アイテムの追加?削除が可能。Relationを保有するクラスへの1回のクエリでは取得できない ? 関連ごとに幾つかのアプローチが可能 ? Pointer (one-to-one、one-to-manyリレーション向け) ? Pointer Arrays (one-to-many、many-to-manyリレーション向け) ? Parse Relations (many-to-manyリレーション向け) ? Join Tables (many-to-manyリレーション向け) ? ArraysとRelationsの使い分けは?-> 一回で取得したい場合、そして数が少量(約100以下)ならArray ? Join Tabelsは? ? ケース1 参照関係を双方向から同レベルで解決したい時にArraysやRelationを双方向に持つより有 効 (e.g. この写真にいいねをした人のリストが欲しい / この人がいいねをした写真のリストが欲し い)?relationを双方に持たなくても逆のクエリは発行できるが、queryが非効率だったりする ? ケース2 “関係”そのものにメタデータが必要な時有効(e.g. 関係の作られた日時など)
  • 16. 認証?SNS連携 ? 認証 ? Pre-definedなUser / Sessionクラスが用意されている ? 各SDKに用意されているloginメソッドを使用するだけで、ユーザーデータ の更新とセッションの管理をしてくれる ? SDKを使用しない場合は自前でsession tokenを保持する必要あり (Webならcookieなどに保持してX-Parse-Session-Tokenをhttp headerに付与) ? sessionのvalidationするには https://api.parse.com/1/ users/me or https://api.parse.com/1/sessions/me ? Facebook / Twitter OAuth認証はParseの設定画面でAppIDなどを セットしておけばSDKによってコードレスで実現可能
  • 17. Role / ACL ? UserにAssignできるRoleを定義できる ? 例: Admin roleの定義など ? 各Role / UserごとにACLを設定できる ? 例: Publicにはread only, adminと特定ユーザーだけwriteも許可
  • 18. API Console ? Debug用に便利なAPI Consoleが提供されている ? Demo
  • 19. Likeの実装例 ? クラス構成のアプローチ ? 1 Pointer Arrayを使う ? 2 Relationを使う ? 3 Join Tableを使う ? HashDishでは将来の拡張性を考慮してActivityというクラスをJoin Tableとして使っている ? 適切なACLの設定 ? ACLの付与はRow単位。Columnごとに設定できないので、一つのクラスに編集させ たくないデータとユーザが変種可能なデータは基本的に混在してはいけない (-> 後述のCloud Codeをすることで実装することは可能)
  • 20. Cloud Code ? Trigger: コードをParseにhostして、データ変 更をhookすることができる ? beforeSave, afterSave, beforeDelete, afterDelete ? 追加処理 (e.g. likeされたら別クラス にlike countをincrement) ? validation (e.g. すでに同じユーザー がlikeしているかどうかcheck) ? Function: ? JSのコードで独自のAPIを実装できる ? session tokenがvalidなリクエストの場合User情報を利用できる ? リクエストをまとめたい時に便利 ? debugは少し大変 ? debugger + node-inspectorでなんとかなる ? https://github.com/mariusciocan/parse-cloud-debugger ? JSのコードをホスティングして、API hookや独自のAPIを定義することができる強力な仕組み
  • 21. Cloud Code Triggerの例 ? likeした時にadmin roleとそのユーザー自身のみwrite可のACLを付与するhookを追加する例 var Activity = Parse.Object.extend("Activity"); var createMyACL = function(userId) { var acl = {}; acl["*"] = {"read": true}; acl["role:admin"] = {"read": true, "write": true}; acl[userId] = {"read": true, "write": true}; return acl; }; var assignACLTrigger = function(request, response) { // allow master if (request.master) { return response.success(); } // user must be authenticated if (request.user) { // Request to update existing row. Let it proceed. // The PUT request will cause error by ACL if the user is invalid if (!request.object.isNew()) { return response.success(); } // set ACL for POST request request.object.set('ACL', createMyACL(request.user.id)); response.success(); } else { return response.error("Not logged in."); } } // modify POST request with ACL Parse.Cloud.beforeSave(Activity, assignACLTrigger);
  • 22. Parseを活用するためのコツ ? クラスの定義はPointer / Relation / JoinTableを場合に応じて利用する ? ACLの設定はきちんとする(デフォルトでpublic read/writeになってたら誰 でもデータ消せちゃうよ) ? Cloud Codeの活用 ? 適切な追加処理の実装 ? ACLの付与やvalidationなど各プラットフォームのクライアントでの冗 長な実装の防止。 ? リクエストの効率化 ? 完全にRESTfulだと初期ページに3 requestsくらい必要だったりする -> cloud codeで一つにまとめる
  • 23. 他にも色々な機能がある ? サーバーテンプレートのホスティング (cloud codeでexpressが動くらしい) ? Jobs ? Schedule可能なbatch処理の実行 ? Push ? ユーザーグループを作って配信するだけ ? schedulingもdashboardから可能 ? localize ? 100万件/月 配信まで無料 ? Analytics