Parse.comを使ったサーバサイド実装不要のフロントエンド開発[後編]

本記事はParse.comを使ったサーバサイド実装不要のフロントエンド開発[前編]の後編です。前編では、Parseの管理画面と、JavaScript SDKのうちBackbone.jsをベースとしている部分とCollectionの生成に必要となるデータの取得方法をご紹介しました。
後編では引き続き、ParseのJavaScript SDKの機能として以下の3つをご紹介いたします。

  • Parse.User: アカウント管理
  • Parse.File: 画像をはじめとしたファイルのアップロード処理等
  • Parse.Promise: Defferedの仕組み
  • Parse.GeoPoint: 位置情報

Parse.User

Parse.Userは、ユーザーアカウントの管理に特化したオブジェクトで、サインアップやログイン機能を実装することができます。Userは、前編でご紹介したParse.Objectのサブクラスであり、Objectのすべての機能が使えます。Objectと同じように、情報はParseに自動的に永続化されます。Objectと異なる点として、User管理に必要な以下のプロパティを保持します。

  • username(必須)
  • password(必須)
  • email(任意)

■サインアップ

新規ユーザーの作成には、signUpメソッドを使います。サインアップ時には、ユーザー名およびe-mailが一意であるかどうかチェックされ、一意でない場合にはエラーが発生します。また、パスワードはハッシュ化されますので、平文で保存されることはありません。

// 実装時はuserName、passwordをログインフォームから取得var userName = "hiromitsuuuuu";var password = "xxxxx"; Parse.User.signUp(userName, password, {success: function(user){// サインアップ成功},error: function(user, error){// サインアップ失敗}});

emailをユーザー名として使ったり、パスワードのリセット機能を追加することもできます。

■ログイン

ログイン処理にはlogInメソッドを、ユーザーのログイン有無の確認にはcurrentメソッドを使います。一度ログインするとUserオブジェクトがlocalStrageにキャッシュされ、ログイン有無の判別に使われます。このキャッシュはログアウトすると消去されます。

// ログイン処理Parse.User.logIn(userName, password, {success: function(user){// ログイン成功},error: function(user, error){// ログイン失敗}}); // ログイン有無の確認(Boolean値が返ります)if(Parse.User.current()){// ログイン済}else{// 未ログイン} // ログアウトParse.User.logOut();

Userは、logInやsignUpといった認証の結果として得られたオブジェクトでなければsaveもdeleteもできない仕組みになっています。そのため、User一覧を取得したとしても他のユーザーは読み取り専用となり改編できません。Parse.User.current() は認証済みオブジェクトが返されます。

Parse.File

画像やファイルのデータはParse.Objectに収めるには大きすぎるため、これらを扱うためのParse.Fileというオブジェクトが用意されています。ドキュメントやビデオ、音声など最大10MBまでのバイナリデータを保存することができます。自力でファイルアップロードを実装する場合、multipart/form-dataエンコードが必要であったりしますが、Fileではエンコードの処理を書く必要がありません。base64形式のデータを引数として渡し、saveすればアップロードが完了します。

<input type="file" id="profile-photo">
var fileUploadControl = $("#profile-photo")[0];if (fileUploadControl.files.length > 0) {var file = fileUploadControl.files[0];// 新規Fileオブジェクトの作成var parseFile = new Parse.File(file.name, file);// Parseへのデータ保存parseFile.save();}

Fileを含む任意のObjectを作成したい場合、先に画像の保存が完了している必要があります。そのため、以下のような段階的な処理が必要となります。

// Parseへのファイル保存parseFile.save({success: function(file){// articleというObject(Model)のprofilePhotoフィールドに画像を保存するarticle.set("profilePhoto", file);article.save();},error: function(error){// ファイル保存失敗}});

このように、Parseでは非同期処理を段階的に行うことが多いため、SDKでParse.Promiseというオブジェクトが用意されています。

Parse.Promise

jQueryと同様に、ParseのJavaScript SDKの非同期メソッドはPromiseを返すよう設計されています。Backboneのシンタックスと共通のObjectのsaveや、先ほどご紹介したFileのsave、前編でご紹介したQueryのfindがこれにあたります。そのため、thenメソッドを使ってメソッドチェインさせることができます。thenはコールバックのペアを引数に取り、第1引数に成功時の関数、第2引数に失敗時の関数を指定します。

obj.save().then(saveSuccess, saveFailed);// 別途saveSuccess, saveFailed関数を定義 // チェインさせる。第1引数はすべてPromiseを返すメソッドobj.find().then(setAttribute).then(findStudents).then(setStudent, setStudentErrorHandler).then(sayHello, errorHandler);

whenメソッドも提供されているので、並列処理を行うこともできます。

query.find().then(function(results) { var promises = []; _.each(results, function(result) {// 同時に非同期処理を実行promises.push(result.destroy());}); // すべてのPromiseが解決済みになるのを待つreturn Parse.Promise.when(promises); }).then(function() {// すべての処理が完了してから実行される});

独自の非同期メソッドを作成することもできます。

function delay(time) {// Promiseの生成var promise = new Parse.Promise();setTimeout(function() {// Promiseを解決状態にするpromise.resolve();}, time);return promise;}; delay(500).then(function() {// 500ms後に実行される});

このように、Promiseを利用すればコールバックでネストが深くなりがちなソースコードを見通し良く保つことができます。

Parse.GeoPoint

Parse.GeoPointは、位置情報に特化したオブジェクトです。緯度および経度を保存するために使用しますが、Queryの検索条件として指定すれば近接するユーザーや場所を特定することもできます。

// GeoPointの生成var groPoint = new Parse.GeoPoint({latitude: 35.626446, longitude: 139.72344399999997}); // Objectのプロパティとして位置情報を保存するplaceObject.set("location", groPoint);placeObject.save();
// 検索条件に使いたい位置情報//(例:ユーザーの位置情報。userObjectも位置情報をプロパティに持つ場合)var userGeoPoint = userObject.get("location"); // Queryの生成var query = new Parse.Query(PlaceObject); // 検索条件に指定した位置情報に近い位置情報を持っているオブジェクト//(ここではPlaceObject)を検索するquery.near("location", userGeoPoint);query.find();

Related Post

Webフォントを使用したスマートフォン向け秀英体見本帳を公開Webフォントを使用したスマートフォン向け秀英体見本帳を公開

秀英体とは、大日本印刷オリジナルの書体です。秋からMORISAWA PASSPORTで秀英角ゴシック、秀英丸ゴシックが提供開始されるにあたり、スマートフォン向け見本帳を作成しました。以前より、Flash版の見本帳を公開していましたが、今回はWebフォントサービスのRealTypeさまにご協力いただき、秀英明朝/秀英初号明朝/秀英横太明朝/秀英丸ゴ/秀英角ゴ金/秀英角ゴ銀の6 書体を試験的にWebフォント化し、HTML版を作成しました。推奨閲覧環境はiOS5以上、Android 3.2以上となっております。本コンテンツではWebフォント機能を使用しているため、環境によってはフォントが適用されない場合がありますので、あらかじめご了承ください。 Flash版はこちら>Flash見本帳HTML版はこちら>スマートフォン向け秀英体見本帳(※2013/3/29現在、リニューアルに伴い公開停止中です。ご迷惑をおかけいたしますが、よろしくお願い致します。)  チャレンジしたこと Webフォントでの縦書き表現 CSS3のwriting-modeプロパティを使用すると、テキストを縦書き表示することができます。しかし、writing-modeを指定したテキストにWebフォントを指定すると、かなだけグリフが寝てしまう問題(参照:縦書きにWebフォントを使いたい!けど使えるのか検証してみた)がありました。そのため、HTML版秀英体見本帳内の縦組み部分ではSVGのtext要素、JavaScriptを使った縦組みライブラリのNehanを使用して縦組みを表現しています。

Kii Cloud JavaScript SDKを使ってアカウント登録とログイン機能を実装するKii Cloud JavaScript SDKを使ってアカウント登録とログイン機能を実装する

本記事は、Kii Cloud JavaScript SDKを使ったサーバサイド実装不要のフロントエンド開発[準備編]の続編です。準備編では、新規アプリケーションの作成からKii CloudのJavaScript SDKの概要までをご紹介しました。今回は、アカウント登録とログイン機能の実装についてご紹介します。※JavaScript SDKのv2.1.20から仮ユーザーの機能が追加され、アカウント登録をしない状態でもデータ操作が可能となったようです。 アカウント登録

縦書きにWebフォントを使いたい!けど使えるのか検証してみた縦書きにWebフォントを使いたい!けど使えるのか検証してみた

最近、IT系の記事や勉強会でWebフォントの話題を見かけるようになってきました。以前の記事では、Webフォントサービスのデコもじを使ってRIAXDNPブログの記事タイトルのフォントを変えてみましたが、今回は縦書きにした文字にWebフォントを適用できるのか検証してみました。検証環境はWindows版Safari(5.1.2)とMac版Safari(5.1.1)です。 WEBフォントを使う Webフォントサービスを使わずに自分でフォントを定義する場合、フォントのライセンスに注意してください。今回のフォントデータはデモ用に弊社の秀英体開発室からお借りしました。CSS3では以下のように@font-face規則を使って、フォントを定義することができます。 @font-face {font-family:’DNPShueiMinPr5B’;      src:url(‘../../fonts/DNPShueiMinPr5-B.otf’) format(‘opentype’);} .myFontStyle {      font-family:’DNPShueiMinPr5B’;}