2010年10月11日 (月)

PODとログイン後のURL

セールスフォースのシステムは「POD」と呼ぶクラスター単位で構築、運用されており、各PODは1個のOracle RAC(Oracle Real Application Clusters:単一のデータベースをサーバーのクラスタ全体で実行できる)、およそ100台のサーバーで構成されています。

ユーザーは地域に応じて各PODに割り当てられ、割り当てられたPODによって、ログイン後のURLが以下のように変わってきます。

Browserwindow

インスタンス名ユーザの地域
AP0 日本
AP1 アジア・太平洋
EU0 欧州・中東・アフリカ
NA0~NA7 北米
CS0~CS5 Sandbox

PODの数は、上記のように現時点では17個のようです。待機系も同じ数だけあるので、
サーバー台数は 100台 × 17POD × 2(本番系、待機系) = 3400台 くらいだと推測されます。
サーバー台数はGoogleと比べるとかなり少なく、サーバーリソースを効率的に利用していることが分かります。

ちなみに、上記の「ユーザの地域」は、あくまでPODが管理するユーザの地域であって、「データセンターの場所」ではありません。例えば、日本のユーザはAP0のPODに割り当てられますが、現在日本にSalesforceのデータセンターはありません。

先日の「Cloudforce 2010 Japan」で発表されましたが、Salesforceは、2010年年末には東京データセンターを完成させ、2011年中に稼働開始予定のようです。日本では、データを国内に置きたいという要望が根強いですからねえ。これで提案時の大きな障害が1つ解消され、嬉しい限りです。

2010年10月 3日 (日)

API参照名が項目一覧に表示されるようになりました

日本時間で10月2日の12~19時ぐらいの間に、NA1、NA6、NA7のインスタンスにWinter '11の機能がリリースされました。

早速ログインしてみたら、項目一覧にAPI参照名が表示されるようになってました

20101003_1

たったこれだけですが、開発者にとってはかなり嬉しい機能かも。API参照名を知りたいことはよくあるので、クリック回数が減りますし、一覧で見ることができると何かと便利です。

2010年9月21日 (火)

Winter '11 新機能

ついこの間Chatterが出たなあと思っていたら、もうWinter '11のリリースです。日本時間で10月2日~10日のリリースなので、もうすぐですね。正確な日時は組織毎に違うようですので、ここで確認してください。

リリースノートはこちら

というわけで、今日はWinter '11で気になった機能をご紹介。

System Log Console

ガバナ制限やプロセスのステップを追跡して、どこで落ちたかを調査できるようになります。どのメソッドに多くの実行時間がかかっているかも分かるみたいです。これでデバッグが少し楽になりそうです。

20100921_1

ガバナ制限の改訂

<廃止>
・1回のコールアウトの合計要求時間(現在の制限は120秒)
・1回のコールアウトの最大サイズ(現在の制限は1MB)

<緩和>
・一般的ヒープサイズ 2MB → 3MB
・Apexクラス/トリガ 100,000/32,000文字 → 1,000,000文字(@isTestで定義されたコメント、テストメソッド、クラスを含まない)
・1組織に許可されるApexコードの最大量 1MB → 2MB
・許可されるオブジェクトのChildRelationship、RecordTypeInfo及びPicklistEntryの総数とfieldsコールの総数 10 → 100

Web Services APIの強化

Dashboard及びReportオブジェクトで、ダッシュボードとレポートの表示が可能になります。どんな感じか早く使ってみたいですね。

1回の呼び出しで複数のオブジェクトを作成/更新可能になります(最大10種類)。今までは1種類ずつ作成/更新する必要があったので、使いやすくなりますね。

AllOrNoneHeader SOAPヘッダーを利用することにより、create、update、delete、undelete、upsert呼び出しで、全てのレコード処理が成功していなければ、ロールバックすることが可能になります。今までは、トランザクション制御はApexでしかできませんでしたが、これでWeb Services APIでもトランザクション制御が可能となります。Web Services APIの弱点が1つ解消されましたね。

Sandbox

・開発者のみSandbox、設定のみSandboxは毎日更新可能になります。これでSandboxを気軽に使えますね。但し、フルSandboxは今まで通り30日に1回しか更新できないので、ご注意を。

・Sandboxの削除が可能になります。

入力規則の制約追加

入力規則で複合項目(住所、姓名、連動選択リスト、連動ルックアップ)を使用できなくなります。なぜかこれだけグレードダウンしてます。要注意。

Chatter機能追加

・フィードの検索機能

・トピックス機能
 Twitterのタグに似た機能

・ファイルタブ
 フィードに添付したファイルが表示されるタブ。ファイルもフォロー可能です。

・Chatterタブ
 フォローしているレコード及びユーザの更新と参加グループの更新が表示されるタブ。推薦するユーザやグループも表示されます(ミクシーの「あなたの友人かも?」に似た機能)。

・Chatter Components for Visualforce (Pages)
  Visualforceで使えるChatterのコンポーネントです。
 <chatter:feed>、<chatter:feedWithFollowers>、<chatter:follow>、<chatter:followers>タグが利用可能になります。

2010年9月16日 (木)

Force.comからAmazon EC2とS3を利用する方法

Force.com for Amazon Web Servicesをインストールすると、
Force.com上からAmazon EC2とS3を利用することができます

機能は最低限のものしかありませんが、EC2とS3へアクセスするアプリを作成する際、ソースコードが大変参考になります。

インストール方法

1. パッケージのインストール

以下のリンクをクリックし、インストールしたい組織にログインして、パッケージをインストールします。

運用環境/Developer Edition用
Sandbox用

2. リモートサイトの設定

「管理者設定」→「セキュリティのコントロール」→「リモートサイトの設定」に、以下を新規追加します。

https://ec2.amazonaws.com
https://s3.amazonaws.com

20100916_1

3. AWS Credential情報の設定

「Force.com for Amazon Web Services」アプリケーションの「AWS Credential」タブで、 「新規」を押下し、以下の情報を入力して、AWS Credential情報を作成します。
・Credential Name : 任意の名称(6. Apexコードの修正で使用します)
・Key : AWSのAccess Key ID
・Secret : AWSのSecret Access Key

20100916_2

4. AWS S3 Objectオブジェクトの新規ボタン押下時アクションの上書き

「作成」→「オブジェクト」→「AWS S3 Object」→「標準ボタンと標準リンク」で「新規」ボタンのアクションを選択し、上書き手段で「Visualforceページ」と「news3object」を選択して、保存します。

20100916_3

5. Force.com IDEで、インストールした組織のプロジェクトを作成し、最新情報を取得します。

6. Apexコードの修正

・AWS_ExplorerCon.cls
・AWS_S3_ExampleController.cls
・S3FormController.cls
・EC2Consoleontroller.cls

AWSCredentialNameの値を、3.で設定した「Credential Name」の値に変更し、保存します。

20100916_4

利用方法

○EC2 Consoleタブ
EC2仮想マシンの運用状況を確認できます。シャットダウンと再起動も実行できます。

20100916_5

<注意>
US East(Virginia)以外のRegionを利用している場合は、追加で以下の設定が必要です。

追加1. Apexコードの修正

EC2 Query APIで情報を取得する際、エンドポイントが「https://ec2.amazonaws.com/」だと、US Eastの情報を取得してしまうので、

・EC2Connection.cls
のmakerequestメソッド内のreq.setEndpointの引数に渡しているURLを、利用しているRegionに合わせて、以下のように変更します。

US West(N.California) : https://ec2.us-west-1.amazonaws.com/
EU West(Ireland) : https://ec2.eu-west-1.amazonaws.com/
Asia Pacific(Singapore) : https://ec2.ap-southeast-1.amazonaws.com/
Asia Pacific(Tokyo) : https://ec2.ap-northeast-1.amazonaws.com/

20100916_6

追加2. リモートサイトの設定

追加1.で変更したURLをリモートサイトの設定に追加

○AWS Explorerタブ
S3のバケット構造を閲覧できます。

20100916_7

○S3 Samplesタブ
バケットの追加・削除、ファイルのアップロード(ローカル→S3、Force.com→S3)ができます。

20100916_8

○AWS S3 Objectsタブ
ファイルのアップロード(ローカル→S3)とプレビューの閲覧ができます。

20100916_9

2010年9月 7日 (火)

Apexで承認プロセスを操作するには?

有効な承認プロセスに対して、Apexから承認申請や承認/却下を行うことができます。

承認申請はApproval.ProcessSubmitRequestクラスで行います。
ソースコードはこんな感じ↓

// プロセスの作成
Approval.ProcessSubmitRequest psr
= new Approval.ProcessSubmitRequest();

// 申請するオブジェクトの設定
psr.setObjectId(objectId);

// 次の承認者の設定(自動割当の場合はnull)
psr.setNextApproverIds(new Id[] {UserInfo.getUserId()});

// プロセス実行
Approval.ProcessResult submitResult = Approval.process(psr);

// 成功 or 失敗の確認
System.assert(submitResult.isSuccess());

// 状態の確認
// Pending:未承認、Approved:承認済み、
// Rejected:却下、 Removed:取消済み
System.assertEquals(
'Pending', submitResult.getInstanceStatus());

// 承認申請により作成された
// ProcessInstanceWorkitemオブジェクトのIDを取得
// (承認申請すると、ProcessInstanceWorkitemオブジェクトに
// レコードが作成される)
List<Id> newWorkItemIds = submitResult.getNewWorkitemIds();

承認/却下はApproval.ProcessWorkitemRequestクラスで行います。
ソースコードはこんな感じ↓

// プロセスの作成
Approval.ProcessWorkitemRequest pwr
= new Approval.ProcessWorkitemRequest();

// 承認するProcessInstanceWorkitemオブジェクトのIDの設定
pwr.setWorkitemId(newWorkItemIds.get(0));

// 次の承認者の設定
// (自動割当や最終承認の場合はnull)
pwr.setNextApproverIds(new Id[] {UserInfo.getUserId()});

// アクションの設定
// Approval:承認、Reject:却下、
// Removed:削除<システム管理者のみ>
pwr.setAction('Approval');

// コメントの設定
pwr.setComments('コメント');

// プロセス実行
Approval.ProcessResult workitemResult
= Approval.process(pwr);
System.assert(workitemResult.isSuccess());
System.assertEquals(
'Approved', workitemResult.getInstanceStatus());

上の例では、ProcessInstanceWorkitemオブジェクトのIDを、
承認申請時の結果から取得していますが、SOQLで検索して取得する方法もあります

承認フローで利用するオブジェクトは、以下の4つです。
ProcessInstance:参照のみ可
ProcessInstanceHistory:アクセス不可
ProcessInstanceStep:参照のみ可
ProcessInstanceWorkitem:参照、更新、削除のみ可

どのオブジェクトに対してもレコードの作成ができないので、オブジェクトのレコード操作によって、申請や承認といった承認フローの操作をすることはできません

承認プロセスの操作はApproval.ProcessSubmitRequestクラスとApproval.ProcessWorkitemRequestクラスで行い、未承認オブジェクトや承認者などのデータ取得時に、これらのオブジェクトを利用します。

2010年8月31日 (火)

Force.com IDEで同期するメタデータを設定するには?

Force.com IDEの「Refresh from Server」で、サーバーのメタデータをローカルに落としたのに、画面上で設定したはずのメタデータを持って来れていない場合があります。

これは、Force.comプロジェクトで設定している「同期するメタデータ」の中に含まれていないのが原因です。

操作方法を覚えてしまえば、なんてことはないのですが、ハマる人が多いトピックなので、詳しく説明しておきます。

同期したいメタデータを設定に追加するには、以下の手順を実施します。

1. Force.comプロジェクトを右クリックして、プロパティを選択

2. [Force.com] → [Project Contents]を選択

3. [Force.com Project Contents]ダイアログで、右上の[Add/Remove]ボタンを押下

20100831_1

4. [Choose Metadeta Components]ダイアログで、右上の更新ボタンを押下

20100831_2_2

5. [Choose Metadeta Components]ダイアログで、同期するメタデータを選択して、[OK]押下

20100831_3

6. [Force.com Project Contents]ダイアログで、[OK]または[適用]押下

7. 同期するメタデータの設定が更新される

結構忘れやすいのが、4.の手順。
更新しないと、前回アクセス時のメタデータが表示され、最近追加したメタデータが表示されません。

5.では、ツリーを展開して確認した方が良いです。
メールテンプレートやレポート等は、それぞれ個別に選択してあげる必要があります。

設定変更後は、「Refresh from Server」で、メタデータの同期がされるようになります。

2010年8月25日 (水)

Visualforceで数値や日付のフォーマットを指定して表示するには?

Visualforceで数値型の項目を、{!ItemNumber}のように差し込み項目で表示しようとすると、「10.0」のように小数で表示されてしまいます。

整数で表示したいんだけど。。。

これは、Visualforceで意外と(?)ハマりがちな問題だと思います。

最初に思い浮かぶのは、項目の設定ですが、
項目の設定で小数点の位置を0にしても、小数で表示されてしまいます。

Visualforceでは、<apex:outputText>タグと<apex:param>タグを使用して、フォーマット指定できます。↓に代表的な例を列挙しますので、参考にして下さい。



	




	




	

フォーマットの設定方法は、JavaのMessageFormatクラスと同じです(こちら)。

2010年8月17日 (火)

スケジュール実行するApexのテストメソッドと実行時刻の詳細設定

今回は前回の続きで、スケジュール実行するApexのテストメソッドの書き方と実行時刻の詳細設定方法のお話。

スケジュール実行するApexのテストは、

・Test.startTestメソッド
System.scheduleメソッド
・Test.stopTestメソッド

の順に呼び出すことで、実施します。

System.scheduleメソッドは、Apexをスケジュール設定するメソッドで、
・第1引数:ジョブ名(任意の名前)
・第2引数:クーロン式(実行時刻を設定)
・第3引数:Apexクラスのインスタンス

を受け取り、ジョブIDを返します。

クーロン式は、'0 0 0 3 9 ? 2022'のような式で、左から順に秒、分、時、日、月、曜日、年を表しています(年は省略可)。

<クーロン式の例 ・・・ 詳しい説明は こちら

・'0 0 13 * * ?':毎日13時に実行
・'0 0 10 ? * MON-FRI':月~金の10時に実行

テスト時に、System.scheduleメソッドで設定した実行時刻になるのを待つ必要はありません。Test.stopTestメソッドをコールすることで、System.scheduleメソッドで設定したジョブが実行され、ジョブの処理結果を確認することができるようになっています。

ソースコードはこんな感じ↓

// テストメソッド
static testMethod void hogeClassTest() {
	// テストデータ準備

	// テスト開始
	Test.startTest();
	
	// Apexをスケジュールに登録
	String jobId = 
		System.schedule('TestScheduledApex',
		'0 0 * * * ?', new HogeClass());
	
	// テスト終了(登録したスケジュールが実施される)
	Test.stopTest();

	// テストデータの確認
}

前回、『画面からの設定だと、「1日に1回しかスケジューリングできない」「1時間単位でしかスケジューリングできない」』と書きましたが、System.scheduleメソッドを利用すれば、1日に複数回実行することや、分単位で実行することも可能となるので、細かく設定したいときはこちらが便利です。

2010年8月10日 (火)

Apexをスケジュール実行する方法

Winter '10 API バージョン17.0から、Apexをスケジュール実行できるApex Schedulerが利用できるようになりました。これはかなり便利。

画面からの設定だと、「1日に1回しかスケジューリングできない」「1時間単位でしかスケジューリングできない」といった制約はありますが、これがあれば、日次バッチや週次バッチが作れちゃいます

やり方は簡単。ApexクラスにSchedulableインタフェースのexecuteメソッドを実装するだけです。executeメソッドの中にスケジュール実行させたい処理を記述します。

実装例はこちら↓

global class HogeClass implements Schedulable {
    global void execute(SchedulableContext sc) {
// スケジュール実行させたい処理
    }
}

後は、このクラスをスケジューリング設定してあげれば完了です。
「アプリケーションの設定」→「開発」→「Apexクラス」→「Apexをスケジュール」を押下すると、こんな画面↓になるので、先ほど作ったクラスを「Apexクラス」に設定してあげて下さい。

ここで、「Apexクラス」には、Schedulableインタフェースを実装したクラスしか設定できないので注意して下さい。

20100810_1

20100810_2

スケジューリングされていることは、「管理者設定」→「監視」→「スケジュール済みジョブ」で確認できます↓

スケジュール実行を取り消したい場合は、ここから削除します。

20100810_3

2010年8月 5日 (木)

カスタム表示ラベル

Salesforceにはカスタム表示ラベルという、テキスト値を定義できる機能があります↓

20100805_1

定義したテキスト値は、ApexやVisualforceから利用可能なので、エラーメッセージや文字列などの定数を外出ししたい場合に便利です。

Apexからの利用方法

System.Label.<ラベル名>

Visualforceからの利用方法

$Label.<ラベル名>

組織でトランスレーションワークベンチを有効にすると、カスタム表示ラベルは利用言語に合わせて翻訳されるので、多言語アプリケーションを作成する時も便利です。

採用情報

株式会社フレクトでは、事業拡大のため、
・Salesforce/Force.comのアプリケーション開発
・HerokuやAWSなどのクラウドプラットフォーム上
でのWebアプリケーション開発
エンジニア、マネージャーを募集中です。

未経験でも、これからクラウドをやってみたい方、
是非ご応募下さい。

フレクト採用ページへ

会社紹介

  • 株式会社フレクトは、
      ・認定コンサルタント
      ・認定上級デベロッパー
      ・認定デベロッパー
    が在籍している、セールスフォースパートナーです。
    また、heroku partnersにも登録されています。
    herokuパートナー
    株式会社フレクト
    Salesforce/Force.com
    導入支援サービス
    弊社の認定プロフェッショナルが支援致します。
    ・Visualforce/Apexによるアプリ開発
    ・Salesforceと連携するWebアプリ開発
    も承っております。
    セールスフォースご検討の際は、
    お気軽にお問合せください。

Twitter

リファレンス

■Developer's Guide(リファレンス)
・Apex  HTML | PDF | 日本語PDF | ガバナ制限
・Visualforce  HTML | PDF
・Web Services API  HTML | PDF | 日本語PDF
・Bulk API  HTML | PDF
・REST API  HTML | PDF | 日本語PDF
・Metadata API  HTML | PDF
・Migration Tool  HTML | PDF
・AJAX Toolkit  HTML | PDF
・Data Loader PDF | 日本語PDF

■早見表 (日本語)
数式
Apex
Visualforce
Web Services API
Chatter