新しくなったForce.com OAuth Toolkit for phpの使い方
先日、Force.comのREST APIをphpから利用する際に便利なOAuth Toolkitを抜本的に書き直しました。新しくなってさらに簡単になったこのツールの使い方をご紹介しておきます。
まずはダウンロード。こちらからどうぞ。Webサーバの適当なディレクトリに保存してください。
https://github.com/nkjm/Force.com-OAuth-Toolkit-for-PHP
次に認証が必要なスクリプトにoauth.phpをインポートします。
$ vi index.php require_once 'oauth.php';
同スクリプトでoauthクラスのインスタンスを作成します。
$oauth = new oauth(CLIENT_ID, CLIENT_SECRET, CALLBACK_URL, [LOGIN_URL], [CACHE_DIR]);
- LOGIN_URLとCACHE_DIRはオプショナルです。
- CACHE_DIRは認証後に発行されるaccess token, refresh token, instance urlを保存するためのディレクトリです。auth_with_password()を用いた場合のみ利用されます。
oauthのインスタンスメソッドでOAuth認証を実施します。認証には2通りあります。1つはアクセスコードを用いる方法で、ユーザごとに認証を要する場合に利用します。
$oauth->auth_with_code([LIFETIME]);
LIFETIMEはオプショナルで、アクセストークンをリフレッシュする間隔を分単位で指定できます。
もう1つはusername/passwordを用いる方法で、不特定のユーザからアクセスを受け付ける場合に利用します。HomePageのバックエンドとしてForce.comを接続し、問い合わせ情報などをForce.comに取り込みたい場合などに適しています。
$oauth->auth_with_password(USERNAME, PASSWORD);
USERNAME, PASSWORDはあるユーザをゲストアカウントと見たてて、その情報をセットします。
認証が成功すると$oauthには下記のパラメータにそれぞれaccess token, refresh token, instance urlの情報がセットされ、この情報を使ってREST APIにアクセスできます。
- $oauth->access_token
- $oauth->refresh_token
- $oauth->instance_url
oauth_with_password()を使用する場合は事前にCACHE_DIRにしているディレクトリ(デフォルトではスクリプトと同じディレクトリ)が存在し、適切なパーミッションが設定されている必要があります。パーミッションはWebサーバプロセスのオーナーユーザー/グループの(一般的にはnobodyなど)からのRead/Writeアクセスが必要です。
OAuth Toolkitのセットアップと実行はこれだけです。
下記のサンプルコードで全体の流れをつかんでいただければ幸いです。
require_once "oauth.php";
// You have to change following paramenter depending on your remote access setting.
define('CLIENT_ID', '3MVG9rFJvQRVOvk40dRq5u_ZA0eT2KvZCvZq.XeA1hFtgc3PITGlLMp3V_kKIwtc6IaEGWkIO3cOu0IgVmujh');
define('CLIENT_SECRET', '1136279981407985294');
define('CALLBACK_URL', 'https://sugoisurvey.nkjmkzk.net');
$oauth = new oauth(CLIENT_ID, CLIENT_SECRET, CALLBACK_URL);
$oauth->auth_with_code();
$query = "select name from session__c";
$url = $oauth->instance_url . "/services/data/v24.0/query?q=" . urlencode($query);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: OAuth " . $oauth->access_token));
$response = json_decode(curl_exec($curl), true);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ( $status != 200 ) {
die("curl failed");
}
curl_close($curl);
return($response);
SSL証明書を購入してみた。
世は金色週間まっただ中ですが、私はSSL証明書を購入するなどしています。デモサイトをSSLで作った際に、「あれ、なにも見えないよ?」「いや、それはセキュリティ警告を無視してだな」という会話に疲れてきたので金で解決することにしたのです。
今回選んだのはRapid SSLというSSL証明書。SSL証明書といえばベリサインが有名ですが、個人が買うにはToo Muchでしょう。Rapid SSLは年間2600円という低価格から提供されており、さらに申請してから速攻で証明書が手に入るという代物です。
2600円のタイプは単一ドメインにのみ適用可能で、*.nkjmkzk.netといったワイルドカードには対応していません。nkjmkzk.netにはサブドメインがいくつもあるので本来ならワイルドカード対応版がのぞましいのですが、価格が18000円まで跳ね上がってしまいます。よっぽどサブドメインだらけじゃないかぎりは単品追加購入が吉だと思われます。
また、Force.comからHTTP Calloutで外部サービスへSSL接続する際には、自前署名SSL証明書は使えません。そういうことをするときもオフィシャルなSSL証明書が必要になります。今回のRapid SSLはForce.comからの接続でも問題なく動作しています(中嶋調べ)。
そのRapid SSLの申請、導入作業がやたら簡単&スピーディだったのでご紹介しておきます。私はNginx + OpenSSLという環境なのでその前提で手順を紹介します。
CSRを作成する
まず適当なディレクトリを作成&移動
$ mkdir /srv/nginx/conf/rapid-ssl $ cd /srv/nginx/conf/rapid-ssl/
こちらのコマンド一発で鍵とCSR(証明書のリクエストファイル)を作成できます。
$ openssl req -new -newkey rsa:2048 -nodes -keyout demo.nkjmkzk.net.key -out demo.nkjmkzk.net.csr
できあがったCSRをオーダーフォームにペーストして申請。Paypalで男らしく前払いします。
https://www.rapid-ssl.jp/ssl/orderForm.php
今回は1時間もしない内に確認メールが送られてきて、誘導されたURLで承認ボタンを押したらメールでCRT(証明書)が送られてきました。
サーバを設定する
送られてきたCRTをサーバ上に保存します。vi等でファイルを作成してメールのCRTをペーストすればOK。
$ vi demo.nkjmkzk.net.crt ペースト
中間証明書を保存します。Rapid-SSLの場合はこの辺を使うといいらしい。
https://www.slogical.co.jp/ssl/files/chainfile_rapidssl.txt
上記ファイルをまたコピー&ペーストします。
$ vi intermediate.crt ペースト
自分のCRTと中間証明書を合体させます。
$ cat demo.nkjmkzk.net.crt intermediate.crt > demo.nkjmkzk.net.chain.crt
Nginxの仮想ホスト設定でCRTと鍵ファイルを指定します。
$ vi /srv/nginx/conf/nginx.conf
server {
server_name demo.nkjmkzk.net;
listen 443 default ssl;
ssl on;
ssl_certificate /srv/nginx/conf/rapid-ssl/demo.nkjmkzk.net.chain.crt;
ssl_certificate_key /srv/nginx/conf/rapid-ssl/demo.nkjmkzk.net.key;
access_log /var/log/nginx/demo.nkjmkzk.net.log main;
index index.php;
root /srv/nginx/html/demo/public;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:8080;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_param SCRIPT_FILENAME /srv/nginx/html/demo/public/$fastcgi_script_name;
}
}
Nginxを再起動します。
$ sudo service nginx restart
完了。
結果
これまで10年以上感じていたなんとなく後ろめたい気持ちがなくなりました。
Database.comの魅力に迫る – Salesforce.comとAWSによるECO-SYSTEM

Salesforce.comとAWSの連携といえば、Force.comからS3を拡張ストレージとして使うようなインテグレーションはしばしば用いられてきました。
しかしDatabase.comの登場により、それとはまったく逆の方向で両クラウドサービスをインテグレートする用法が見えてきています。ここではその連携アーキテクチャについてお話します。
Salesforce.comはApex、Visualforceという独自言語を提供しながらも、Open Developmentというエリアを真剣に考えており、その最たるアプローチがDatabase.comです。
Database.comはForce.comのハートであるデータベース機能だけを切り出して単独で提供しているものです。課金体系もForce.comのユーザー単位に加え、データ容量やトランザクション量での従量課金を取り入れています。
Database.comはSalesforce.comが十年以上にもわたって磨き上げてきたデータベースプラットフォームをOpen Developerに開放するものです。Open DeveloperはRuby, PHP, Python, Java, Node.js, Clojure等、各々が得意なプログラミング言語からDatabase.comを利用することができます。
AWSではEC2という仮想マシンサービスが長らく提供されており、ユーザーはクラウド上で即座にOS環境を整え、任意のプログラミング言語の実行環境を自由に構築できます。このような環境で利用するデータベースとして、Database.comというのは魅力的な選択肢となるはずです。

では、Open DeveloperがDatabase.comを利用するメリットとはどのようなものなのか? 僕は次の2点にそのメリットを集約してみます。
メリット1:データベース運用からおさらば
データベースはほぼすべてのアプリケーションに必須のコンポーネントです。Open Developerの中には自身でアプリケーションに必要なデータベースを構築、運用することができる人たちがいるでしょう。あるいはアプリケーション開発会社であればデータベースを担当するインフラ部門があるかもしれません。
ただし、僕が思うにデータベースの独自運用は価値を生みません。
データベースの仕事は、常に十分な速度で安定してアプリケーションからの問い合わせに応答する、というシンプルなものです。しかし、この要件を満たすために必要な労力は一体どれほどのものでしょうか。データベースの設定項目はそれだけで辞書にできるほど多く、スケーラビリティや耐障害性を確保するのに極めて複雑な実装が余儀なくされます。
世の中には様々なスキルレベルのデータベースエンジニアが日々データベースに向き合っています。その中には上記の要件をかなり高いレベルで実装できるエンジニアもいるでしょう。
ただし、上には上がいます。
この「上」の最たる例が「クラウド」だと思います。僕の定義ではクラウドというのはノウハウの共有であり、ノウハウの開放です。
参考:オレ流クラウドの定義
自社サービスを長年に渡り提供し続けてきたサービスプロバイダーは、その歴史が長いほど、ビジネスボリュームが大きいほど、重要な経験、つまりノウハウを蓄積しており、そのインフラに研究と改善を重ねています。
この長年の経験に裏打ちされたインフラのレベルは一朝一夕で到達できるようなものではなく、かつ、大きな投資をおこなってデータベースプラットフォームを独自に構築したとしても、それはアプリケーションから見れば「当たり前の仕事をしている」に過ぎません。いくらこのレイヤーに投資しても決して自社のアプリケーション、サービスに差別化要素をもたらすことはできないでしょう。それより、磨き上げられたデータベースサービスがオンラインでサインアップするだけで使える時代なのです。これを利用しない手はないでしょう。
Database.comは誰でもすぐにサインアップして利用することができます。無料枠があるので、試用するのに費用はかかりません。
今すぐサインップするにはこちらから。
メリット2:REST API
単にマネージド・データベースというくくりであればまだDatabase.comでなければならない理由にはなりません。マネージド・データベースはDatabase.com以外にも存在します。その中でもDatabase.comをユニークにする要素は何なのか。
僕はその要素にREST APIを挙げたい。
データベースはForce.comのハートだと書きました。それは何故か?Force.comまたはDatabase.comではデータモデル(つまりテーブル。Force.com用語ではオブジェクト)を定義するだけでプログラミングの基礎部分が終わってしまうという特徴があります。テーブルを作成するとそのテーブルに対するデータの挿入、更新、削除を行うメソッドは自動的に作成され、開発者がテーブル毎にメソッドをコーディングする必要はありません。それだけでなく、テーブルを作成しただけでそのテーブルに対するREST APIまでもが自動的に生成されます。つまり、テーブルを作成した時点で、そしてまたカラムを追加した時点で、そのデータ構造に対するデータ挿入、更新、削除、検索がREST APIを通じておこなえるのです。
このことは特にHTML5アプリを開発する上で大きなアドバンテージになるでしょう。
HTML5アプリとはHTML5規格にのっとってコーディングされたHTML, CSS, JavaScriptによるユーザーインターフェースを持つアプリを指すアプリの緩い定義。一般的にHTML5アプリはWebサーバーからダウンロードしたHTMLでダイナミックなユーザーインターフェースを表現し、Ajaxによってサーバーと通信を行います。
AjaxはサーバーからダウンロードされたローカルのJavaScriptによってキックされます。JavaScriptはユーザーの操作によって特定のイベントで発火し、バックグラウンドでサーバーへリクエスト・データを送る、またはサーバーからデータを取得します。
このHTML5アプリの構造で必要になるプログラムコンポーネントは一般的なWeb/データベースサーバーのアーキテクチャでは下図のようになるでしょう。

- HTML – ユーザーインターフェースを構成するのに必要
- Web API Class – JavaScriptからのAjaxリクエストを受け付けるのに必要
- DB Class – AjaxリクエストをDBへのリクエストへ変換しSQLを発行するのに必要
一方、Database.comを擁するHTML5アプリに必要なプログラムコンポーネントは下図のようになります。

HTMLは依然としてコーディングする必要があるものの、JavaScriptから発行されるAjaxリクエストはDatabase.comが直接受け付けて処理できるため、Web API ClassとDB Classが不要になります。したがって開発者は基本的なメソッドを自身でコーディングする必要がなく、ユーザーの使い勝手を向上させるためのインターフェースやアプリの差別化に直結するコア機能の開発に集中して時間を費やすことができます。
さらにDatabase.comにアクセスするJavaScriptのコードも、いちから書き上げる必要はありません。Salesforce.comではForce.com JavaScript REST Toolkitなるものを提供しています。このJavaScriptライブラリをロードすれば、create(), update(), delete()といったより抽象化された手続きでDatabase.comにアクセスすることができます。
なお、Database.comではデータモデルを作成した際に自動生成されるAPIのほか、より複雑な処理が必要な場合は独自にAPIを拡張することも可能です。
したがってDatabase.comではデータモデルを定義するだけで多くの開発タスクが自動的に完了してしまいます。データモデルを定義するのが数少ない作業ではありますが、実はこのデータモデル定義作業もDatabase.comでは楽しい。
新機能のスキーマビルダーを使えばドラッグ&ドロップでテーブルを作成し、同様にドラッグ&ドロップで適宜カラムを追加することができます。未だPilot扱いの機能なのでページレイアウトが自動更新されない等、まだ至らない点はあるのですが、直感的な操作でデータモデル定義をEnjoyできます。
リレーションを張った場合はそのつながりも視覚的に確認することができ、手作業でER図を作成する必要はもうありません。
このDatabase.com、先日開通した東京データセンターでも稼働しているためAWSの東京リージョンとも極めて低いレイテンシーで通信できます。まさに今すぐ利用できる環境にありますゆえ、一度サインアップして操作画面だけでものぞいてみてみてはどうでしょうか。今回ご紹介したメリット2点以外にも、地味に便利な機能がふんだんに搭載されていますよ。
まとめ
Database.comを利用することで開発者は、
- 厄介なわりに差別化要素とならないデータベース運用から解放される。
- REST APIの自動生成により(特に)HTML5アプリ開発が加速する。
- 美しいUIで作業がなんだか楽しくなってくる。
*ちなみに、現在Salesforce.comではDeveloper Communityをすごい勢いでつなげ、技術情報を交換する環境を広げていきたいと考えています。まずはFacebookページをLike! オンラインで、オフラインでつながりましょう。近々オフラインで集会(飲み会)したいと思っています。
php on heroku
愛して止まないphpをherokuで走らせるQuick Tutorial。(phpサポートは非公式です。)
前提条件
- heroku CLIがインストールされていること
セットアップ手順
まずはローカルで適当なディレクトリを作成し、gitレポジトリを初期化。
$ mkdir myapp $ cd myapp/ $ git init
index.phpを作成し(色気を出してtest.phpとか他のファイル名にしてはならない)、テストに適した王道スクリプトを記述。
$ vi index.php <?php echo "Hello Salesforce.com!!"; ?>
gitレポジトリにコミット。
$ git add . $ git commit -m 'my first commit'
heroku上にアプリを新規登録。stackにはcedarを指定。
$ heroku create --stack cedar Creating growing-ice-9956... done, stack is cedar http://growing-ice-9956.herokuapp.com/ | git@heroku.com:growing-ice-9956.git Git remote heroku added
作成したアプリにレポジトリをプッシュ(アップロード)。
$ git push heroku master
Counting objects: 3, done.
Writing objects: 100% (3/3), 261 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
-----> Heroku receiving push
-----> PHP app detected
-----> Bundling Apache v2.2.19
-----> Bundling PHP v5.3.6
-----> Discovering process types
Procfile declares types -> (none)
Default types for PHP -> web
-----> Compiled slug size is 21.5MB
-----> Launching... done, v4
http://growing-ice-9956.herokuapp.com deployed to Heroku
To git@heroku.com:growing-ice-9956.git
* [new branch] master -> master
これだけ。ランダムに割り当てられたherokuapp.comサブドメインであなたのphpが動いています。今回だとhttp://growing-ice-9956.herokuapp.comですね。
herokuの管理画面ではこんな感じ。
まだ試してないですがWordpress on herokuとかもありますね。
JavaScriptからForce.com REST APIへアクセス
*このエントリーは「外部のphpからREST APIでForce.comにアクセスすためのOAuth Toolkit」の続きです。
JavaScriptからForce.com REST APIを使うにはForce.com JavaScript REST API Toolkitを使うのが近道です。今回は前回の外部php環境にこのToolkitを組み込んでみます。
本来はブラウザにダウンロードされたJavaScriptから直接リソースサーバ(Force.comでAPIを受けつけてデータアクセスを提供しているサーバ)にRESTアクセスできれば良いのですが、ブラウザのセキュリティ上そのままでは実行できません。ひとつの解はphp実行環境をプロキシとして利用することです。この形態であれば問題なくAPIにアクセスすることができます。
Force.com JavaScript REST API Toolkitではこの形態をサポートするためのproxy.phpを提供しています。これはphp実行環境に置いておけばそれだけでプロキシとして動作してくれるというなんとも便利なシロモノです。

まずはこのファイルをGithubからダウンロードしてドキュメントルート直下に配置します。
$ export DOCUMENT_ROOT='/srv/nginx/html/test'
[なんらかの方法でproxy.phpをダウンロード]
$ ls ${DOCUMENT_ROOT}/
proxy.php
次にToolkitの本体であるforcetk.jsをダウンロードして同じくドキュメントルート直下に配置します。
[なんらかの方法でforcetk.jsをダウンロード]
$ ls ${DOCUMENT_ROOT}/
forcetk.js
proxy.php
次にHTMLを生成してその中でforcetk.jsを読み込みます。また、forcetk.jsはjQueryを使用しているためjQueryも同様に読み込ませます。そして今回はAccountレコードを作成するJavaScriptを実装します。これらのHTML生成からJavaScriptライブラリの読み込み、Accountレコード作成処理までをindex.phpの中に記述していきます。(OAuthによる認証部分は実装されているものとします)
$ vi ${DOCUMENT_ROOT}/index.php
<?php
session_start();
if (!isset($_SESSION['access_token']) || !isset($_SESSION['instance_url'])) {
$_SESSION['oauth_return'] = $_SERVER['PHP_SELF'];
header( 'Location: oauth/oauth.php' );
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
</head>
<body>
<div id='account_form'>
<input type='text' name='account_name' />
<input type='button' value='create new account' />
</div>
<!--jQueryをロード-->
<script src="http://code.jquery.com/jquery-1.7.min.js"></script>
<!--forcetk.jsをロード-->
<script src="forcetk.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var $client_id = "[あなたのConsumer ID]";
var $proxy_url = "https://[あなたのWebサーバ]/proxy.php?mode=native";
// REST APIアクセスを抽象化するWrapperを初期化
var client = new forcetk.Client($client_id, null, $proxy_url);
// セッション情報をセット
client.setSessionToken('<?php echo $_SESSION["access_token"]; ?>', null, '<?php echo $_SESSION["instance_url"]; ?>');
$('#account_form :button').click(function(){
var $account_name = $('#account_form :text').attr('value');
// createメソッドでAccountレコードを作成。第一引数はオブジェクト名。第二引数はフィールド。第三引数は成功時のコールバック。第四引数はエラー時のコールバック。
client.create(
"Account",
{"Name":$account_name},
function(response){ alert('Success!'); },
function(jqXHR){ alert(jqXHR.responseText); }
);
});
});
</script>
</body>
</html>
ブラウザでWebサーバにアクセスし、フォームにAccountの名前を入力してボタンを押せばAjaxでAccount Recordの作成が実行されます。成功すればアラートウィンドが開き”Success!”と表示されるはずです。

Force.comの組織にログインして実際にAccountが作成されているか確認してみてください。
このToolkitの詳細なリファレンスに関してはドキュメントは見当たらなかったのですが、forcetk.jsを覗けば大体見当はつくと思います。
外部のphpからREST APIでForce.comにアクセスするためのOAuth Toolkit

2012.05追記
OAuth Toolkitはスクラッチから再開発されました。この記事は古いものです。
あたらしいOAuth Toolkitの使い方はこちら。
Force.comの外部にホストしているWebサービスからForce.comに対してREST APIでアクセスするためには認証が必要です。
自分でOAuth認証クライアントのコードをスクラッチから書くのはホネの折れる作業なので、php実行環境でのToolkitを作成してGithubに公開しておきました。
Force.com OAuth Toolkit for PHP
使い方をざっくりと説明します。
必要なもの
- Force.comの外部で稼動しているphp実行環境
- cURLがphp実行環境で有効になっていること
- JSONがphp実行環境で有効になっていること
- SSLがphp実行環境で有効になっていること
- アクセスするForce.comの組織
- APIがForce.com組織およびプロファイルで有効になっていること
インストールとセットアップ
php実行環境のドキュメントルートにoauthディレクトリを作成。
$ export DOCUMENT_ROOT='/srv/nginx/html/test'
$ mkdir ${DOCUMENT_ROOT}/oauth
作成したoauthディレクトリ配下にGithubからoauth.phpとconfig.phpをダウンロードして保存。
[何らかの方法でoauth.phpとconfig.phpをダウンロード]
$ ls ${DOCUMENT_ROOT}/oauth
config.php
oauth.php
Force.com側でRemote Accessレコードを作成。
[あなたの名前]->Setup->Develop->Remote Accessから。重要なのはCallback URL。下記のフォーマットで。プロトコルはHTTPSである必要があります。
https://[あなたのサーバ]/oauth/oauth.php
php実行環境のconfig.phpを編集してCLIENT_IDとCLIENT_SECRETを設定。それぞれの値はRemote Accessレコードを参照。
$ vi ${DOCUMENT_ROOT}/oauth/config.php
<?php
define("CLIENT_ID", "[あなたのConsumer Key]");
define("CLIENT_SECRET", "[あなたのConsumer Secret]");
define("LOGIN_URI", "https://login.salesforce.com");
?>
認証が必要なphpファイルの最上部に下記を追記
# vi ${DOCUMENT_ROOT}/index.php
<?php
session_start();
if (!isset($_SESSION['access_token']) || !isset($_SESSION['instance_url'])) {
$_SESSION['oauth_return'] = $_SERVER['PHP_SELF'];
header( 'Location: oauth/oauth.php' );
}
[あなたのコードが続く]
?>
これで完了。
ブラウザで認証が必要なコンテンツにアクセスすれば、未認証の場合は一度Salesforceのログインサイトにリダイレクトされます。そこで認証または認可を行い、リダイレクト元に再度リダイレクトされます。
その後のアクセスでは$_SESSION['access_token']にアクセストークンが、$_SESSION['instance_url']にインスタンスのURLが保存されますので、この2つをもってForce.comのREST APIをつつくことで認可済みの状態を維持することができます。
このOAuthのアクセストークンを用いてREST APIにアクセスするサンプルコードを最後に紹介しておきます。下記はChatterからFeedとその発信者を取得して表示するコードです。
$url = $_SESSION['instance_url'] . "/services/data/v23.0/chatter/feeds/news/me/feed-items";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: OAuth " . $_SESSION['access_token']));
$json_response = curl_exec($curl);
$response = json_decode($json_response, true);
echo "<!DOCTYPE html><html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'></head><body>\n";
foreach ((array) $response['items'] as $feed) {
echo $feed['actor']['name'] . " says \n";
echo $feed['body']['text'] . "<br/>\n";
}
echo "</body></html>\n";
参考情報
jQuery Mobileことはじめ – Force.comで試してみるjQuery Mobile
先日、9月29日にjQuery Mobile 1.0 RC1がリリースされました。
jQueryといえば今やFlashを凌ぐインストール数を誇ると言われているJavaScriptのライブラリ。そのjQueryをベースとしてjQueryモバイル端末向けに最適化されたライブラリがjQuery Mobileです。
Key FeaturesのページにjQuery Mobileの特徴がリストアップされていますが、一言で言えばjQuery Mobileのハートは「メジャーなモバイル端末をほぼ全てサポートし、異なる端末間の挙動の差異を吸収してくれる」というところでしょう。
Objective Cで書いたネイティブiPhoneアプリは当然ながらAndroid端末ではそのまま動かすことはできませんが、jQuery Mobileで書いたWebアプリケーションであればどのようなモバイル端末からも即座に利用でき、さらに通常のWebページではなくモバイル端末での操作に最適化されたネイティブアプリに近いインターフェースを提供してくれます。
- Objective Cとかを知らなくてもネイティブっぽいモバイルアプリが書ける
- 端末ごとのクセはjQueryにお任せ
素晴らしいじゃないですか。早速動かしてみましょう。
JavaScriptは純粋なWebサーバさえあれば走らせることができるのが良いところ。なのでWebサーバがある人はそこでindex.htmlでも作成してコーディングをスタートできます。
とはいえ手頃なWebサーバが手元にない、という人はこの機会にForce.comを利用してみましょう。
Force.comは一言でいえばアプリケーション開発、稼働、配信プラットフォームです。企業向けのアプリケーションに用いられることが多いですが、技術的には何にでも使えます。そして今回のようにjQueryベースのWebアプリケーションをホストさせることも簡単にできます。Developer Editionという無償で利用できるエディションがあるのでまずはこちらのページからサインアップしてアカウントを作成します。
UsernameはEmail形式である必要がありますが、有効なEmailである必要はありません。若干意味がわかりませんが、そこはかとなく「nkjm.kzk@jquerymobile.dev」とかそんな感じでOKです。(Email Addressは本当のEmailを入れてください)
サインナップするとすぐにWelcomeメールが届くのでそのメールにあるリンクから新しいパスワードを設定しつつログインします。
画面右上に自身の名前が表示されたプルダウンメニューがありますのでそこから「設定」を選択します。
左のサイドメニューから「開発」=>「ページ」をクリックし、「Visualforceページ」中の「新規」をクリックします。
表示ラベルと名前には「jquerymobile」等適当な名前を入力し、Visualforce Markupにこちらのコードをペタッと張り付けます。
このフォームに書いた内容がまさにHTMLで出力されることになります。HTML, CSS, JavaScriptといった一般的なマークアップでそのままコーディングできるのに加え、Apexというforce.com専用のマークアップを利用することができます。サンプルコードでは<apex:page>タグおよび<apex:ouputText>タグがありますが、それ以外は通常のHTMLであり、その中にごくシンプルなjQuery Mobileの要素を入れこんであります。すべて埋めたら「保存」をクリックしてページを保存します。
次に左のサイドメニューから「開発」=>「サイト」をクリックします。このページでWebサーバの設定を行うわけです。といってもごくシンプルな設定のみです。はじめにドメイン名を指定します。適当に取得可能なものを設定してください。
ドメイン名が登録できたら「新規」をクリックしてこのドメイン名にアクセスすると表示されるサイトを作成します。
ここでは適当なサイトの名前を設定し、「有効」にチェックをいれてこのサイトをアクセス可能な状態にし、「有効なサイトのホームページ」に先ほど作成したページを指定します。
これで完了です。
指定したURLにアクセスしてみましょう。こちらの環境ではhttp://nkjm-jquerymobile-developer-edition.na12.force.comですね。
こんなサイトが表示されればOKです。
PCのブラウザで確認できたらiPhone, iPad, Androidなどのモバイル端末で是非挙動を見てみてください。Webアプリなのにネイティブに近いインターフェースであることが実感できると思います。
iOSでは端末のオリエンテーション(縦横)を変えたときにうまく表示幅があわなくなるマイナーな不具合があるようですが、次期バージョンでFixされるとのことなので心配なさそうです。
そんなこんなで気になるjQuery Mobileですが、近々で正式版が出るようですので引き続き要チェックですね。
また、こんな感じでForce.comをWebアプリの開発環境として利用することもできます。今回はブラウザ上でコードを入力しましたが、Force.com IDEという統合開発環境も提供されており、Force.comのクラウドとローカル環境を同期しながらより効率的に開発作業を行うことも可能です。そちらも是非。
Started at Salesforce.com
9月15日付けでSalesforce.comに入社しました。
force.comをはじめとするプラットフォーム製品群の啓蒙活動とエンジニアリングを担当します。とりわけ、あらゆるISVの皆様にSalesforce.comが提供するプラットフォーム上で多くのアプリケーションを展開していただき、Salesforce.comのプラットフォームを真のプラットフォーム、つまりデファクトスタンダードにしていくことが私のミッションだと考えています。
Salesforce.comは言わずとしれたクリックだけで多くの開発作業を行えるアプリケーション開発/提供プラットフォームのforce.comをはじめ、Ruby, Java, Node.js, Clojureの開発/提供プラットフォームのHeroku、Public or Private等アクセス元を選ばず、どこからでも整合性をもったデータにアクセス可能な統合データベース:database.com、クラウドから必要な個人データをスムーズに手に入れることができるdata.com、企業のコミュニケーションをSocialに変えていくChatter、Social Mediaでの活動をモニターして傾向分析を行うRadian6といった多種多様な製品を提供しています。(一部日本では未提供の製品あり)
そしてこれらの製品群に共通しているのが、クラウド型の提供形態であり、プラットフォームというものを意識しており、さらについ先日開催された年次最大のイベントであるDreamforceでも色濃かったようにSocial、それもSocial Enterpriseという新しいコンセプトを踏襲しているところだと思います。
私はこれらのコンセプトとそれを広めていくこのポジションに強い魅力を感じ、Salesforce.comへ入社するはこびとなりました。
私は最近「プラットフォーム」というものがつくづく重要であると感じています。これは単にPaaSといったものを意味しているのではなく、より実質的な意味でのプラットフォームです。例えばEmailは非常にトラディショナルなプロトコルの上に成り立っており、ユーザーからすれば今も昔もEmailアプリーションという認識だと思いますが、Emailは実質的に情報交換の「プラットフォーム」になっています。単なるプロトコルであり、アプリケーションであるEmailをプラットフォームたらしめているのはその利用ユーザ数以外のなにものでもないでしょう。皆が使っている。このことがあるプロトコル、ソフトウェア、サービスをプラットフォームというように認知させます。Emailよりもモダンで勢いのあるプラットフォームがFacebookでしょう。はじまりはとあるWebサービスですが、今や情報交換、広告など、一般ユーザとエンタープライズ双方において様々なアクティビティのプラットフォームになっています。
私はSalesforce.comの製品群をこのようなプラットフォームにしたい、そう考えています。大それたゴールであり、入社したばかりの人間がこんなことを言うのはお恥ずかしい限りで社内のエキスパート達の目が痛い、という感じですが、これまで通り我が道を強引に走っていこうと思います。
これまで私はサーバ仮想化、ストレージ、データベースといったまさにド基盤な路線を歩んできました。なので今回の選択はちょっと意外、と思われた知人も少なくありませんでした。ただし私はDemo Developerとしての顔も持っており(何だそれは)、全く畑が違うところに行くわけではありません。それに基盤の知識も顧客視点でSalesforce.comのサービスをアセスする際にもちろん重要になってきます。なにより、面白いと思ったものがあったなら自分を広げてみる、という選択も決して悪くないなと思うのです。Steve Jobsの言葉を借りれば、
“You can only connect the dots looking backward. You have to trust in something, it will give you the confidence to follow your heart.” by Steve Jobs
*ちょっとアレンジしてます。
これから全力でこのチャレンジに向かっていきます。
My Last Day in Oracle.
本日、9月14日をもって日本オラクルを退職することになりました。
私は元々前職でXenに携わっていたということもありOracle VMの立ち上げメンバーとして日本オラクルに入社しました。その後次第にデータベース、ストレージといった社内でいうところのテクノロジー製品全般にカバレージを拡げて啓蒙活動をおこなってきました。
私が日本オラクル在籍中に最も時間を費やしたのは「いかにして顧客の利益と自社の利益を同時に最大化するか」というチャレンジでした。恐らく外資系ベンダーというのは自社の利益を最大化させることに極めてアグレッシブな会社だと思います。自社の利益を追求するのは企業としての基本的な営みであり、欠かせない視点だと思います。ただし私には提案活動で最も重要な視点は常に「顧客指向」だという理念があります。
以前Twitterにも同じ旨を発言しましたが、一般に営業は前者を考えるのが得意でエンジニアは後者を考えるのが得意だと思います。しかし前者だけでは押し売りになり、後者だけでは企業経営が成り立たない。なのでこの2つを同時に叶える提案が不可欠。顧客の利益を最大化する提案で、かつ、自社の利益を最大化する提案。それを考えることが自分のミッションであり、それがまさにセールスシナリオというものだと考えています。
私の考える磨かれたセールスシナリオというのは、顧客にとってベストなものを提案し、それが何故ベストなのかを全てにおいて説明できるものであり、同時に競合をできる限り排除して自社の利益を最大化するものです。ベストであることを証明するにはその分野のテクノロジーと競合情報に関して深いインサイトが必要になり、最終的にシナリオという一本の理論を形成するにはイマジネーションが必要になります。私はこのセールスシナリオ作成という作業に心血を注いできました。
ORACLEという会社は極めて多くの、そして先進の製品を開発し提供している会社であり、それが故に埋没している製品や、より良いメッセージ、用法が見いだせる製品が潜在しています。その中でセールスシナリオを作成する作業は会社にとって重要であり、そして私にとってエキサイティングでした。
しかしながら今回、今以上にこの活動を集中し、より大きな結果を作り出して行きたいと考えるにあたり、新しい環境に移ることを決意しました。タフな決断ではありましたが、熟慮の末、この選択が必要なことであり、ベストであると信じています。
日本オラクルで一番わがままな男、などという異名をとりながらも、そのわがままを受け入れ続けてくれたマネジメントの方々に御礼申し上げます。毎週毎週わがままや謎の提案を繰り返しおこなうこんなにも厄介な人間でしたが、懲りずに耳を傾けていただき感謝しています。本当に有難うございました。
最後に、一緒に働いたみんなにとても感謝しているということを言わせてください。
セールスシナリオを作成するという活動にあたって、私は多くのエキスパートに支えられてきました。Storage GRID構成における性能測定、障害試験。Recovery Manager、Flashback、Data Guardを使ったバックアップ/リカバリ検証。Real Application Clustersでのデータベースクラウド検証。いつもエキスパートが検証作業に手を差し伸べてくれました。私がセミナーでお話してきたプレゼンテーション、デモンストレーション、そしてその反響は彼らの力がなくては完成し得ないものでした。多くの仲間に恵まれて、私は本当に幸運でした。
また、退職するにあたり有志のメンバーが集まってくれたとき、自分には支えてくれていた人達、仲間がこんなにもいたんだ、とあらためて感じ、感動しました。
みんなが開いてくれたパーティ、集まってくれた人達、かけてくれた言葉、贈ってくれたプレゼント、決して忘れません。
みんな、本当にありがとう。いってきます。
Twitterについて今、ふと思うこと。
僕がTwitterのアカウントを作成したのは確か2007年の春頃。比較的早くからサービスに触れていた方だと思います。といっても当初は試しに「今、皿を洗った。」とかつぶやいてみて、一体何が面白いんだこのサービスは?と瞬時に放置した記憶があります。はてブ等のソーシャルブックマークとかも同じようなスタートを切ったように記憶しています。
しかし今ふとこの2年を思い返せばTwitterは僕の仕事や人生に大きな影響を与えたと感じます。
Twitterをはじめとするソーシャルネットワークによってこの2年間、情報を入手するプロセスがキュレーションという言葉に表されるように変化し、また自分の考えを#タグというStreamに乗せてあたかもTVコマーシャルのように彼方まで送り出すことができるようになり、さらにFollowerやRTによって情報は増幅され自分のTweetも再帰的に大きな発信力を持つようになりました。そしてその情報のInput/Outputを繰り返す中で多くの人と出会いました。
考えてみると今自分がここにいる過程にはTwitterで発信したあの発言、入手したあの情報、あの会話、出会ったあの人達がマイルストーンとして存在します。一見Twitterとは関係なさそうなあの人も、実はTwitterが契機となって出会ったあの人に紹介したもらった、とかいうのがポロポロ出てくる。今、自分の身の回りにいる人、ある物、状況、よくよく考えれば直接的、間接的にTwitterの影響がそこら中に確認されます。
Twitterがなければ随分違う今になっていただろうと思います。それはそれですが、Twitterの影響を受けた今の自分のシチュエーション、僕はとても幸せです。
Twitterサービスのスペックは驚くほど単純なもので、スペック的にはそこにブレークスルーはないように思えます。しかしサービスは単純であっても、それが生活やビジネスを大きく変える可能性がある。発明(テクノロジー、アプリケーション、サービス)は最終的な価値(何かを劇的に変え豊かさを生み出すこと)に紐づくまでいくつかのホップがあると思います。ものによってはそれなりのホップ数を数えることもあるでしょう。僕はこの発明 => ホップ => 価値をイメージできる人間がビジョナリーであり、人に伝えて心を動かすことができるのがエバンジェリストだと思います。
僕はこのエバンジェリストという仕事をとても気に入っています。:)










