Translate

2011年5月3日火曜日

Apexトリガのサンプルコード

以下のコードは、
Force.com開発者コース研修のDEV541内演習1-1です。

ApexトリガHelloWorldPositionTriggerから
ApexクラスHelloWorldPositionClassを呼び出す
シンプルなコード。




// Apex Code 演習1-1
// 募集職種(Position__c)に新規レコードが格納される直前、もしくは更新直前に
// 処理される
//
// 起動はSystem権限で行われる
//
// Apexトリガを宣言する場合、classキーワードの代わりにtriggerを使う
// onの後に発生元オブジェクト、括弧内は発生の原因となるイベントを書く
trigger HelloWorldPositionTrigger on Position__c (before insert, before update) {

  // Apexクラスのクラス名、トリガ名、メソッド名、変数名などは
  // 大文字小文字区別しない

  // Apexトリガ内で使えそうなTriggerクラスの主要な静的フィールド
  // Trigger.new: トリガ発生元となったレコード群
  // Trigger.newMap: 同じく発生元となったレコード群だが
  //                 IDとレコードのMapとして使える
  // Trigger.old: トリガ発生元となったレコード群だがレコード操作前の
  //              状態で格納されている
  // Trigger.oldMap: Mapのold版
  // Trigger.isInsert: 発生原因が新規追加の場合、真
  // Trigger.isUpdate: 発生原因が更新だった場合、真
  // Trigger.isDelete: 発生原因が削除だった場合、真
  // Trigger.isUndelete: 発生原因がゴミ箱から復帰の場合、真
  // Trigger.isBefore: 発生原因が格納直前の場合、真
  // Trigger.isAfter: 発生原因が格納直後の場合、真
  List<position__c> positions = Trigger.new;

  // ApexクラスHelloWorldPositionClassの静的メソッドhelloWorld()を
  // 呼び出している
  // メソッド呼び出しはそっくりJavaとおなじ
  // 勿論インスタンスメソッドとしても実装できる
  HelloWorldPositionClass.helloWorld(positions);
}



こっちがApexトリガから
呼び出されるApexクラス。





// アクセス修飾子はほぼJavaと同じ
// (globalやwebserviceなどJavaにないものもある)
public class HelloWorldPositionClass {
  // 静的メソッドhelloWorld()
  // 引数: positions 募集職種レコード群
  // 戻り値: なし
  public static void helloWorld(List<Position__c> positions){
    // Java5風のfor文も書ける
    for (Position__c p:positions){
      // Javaと違うのは文字列はシングルクォート
      // で囲むこと
      if (p.Hello__c != 'World') {
        // カスタムオブジェクトや項目は__cがつく
        p.Hello__c = 'World'; 
      }
    }
  }
}



宣言的なトリガ(ワークフロー)では

起動時に条件や対象レコードの選択が出来たが、

Apexコードでトリガを書く場合は

このtriggerクラスで

条件チェックやレコードのより分けをして

実際の処理を別のクラスに記述するのが

一般的である。



この辺りはコーディングなので

正直実装はバラバラになってしまうので

コーディング規約で開発者間で品質が均質に

したほうがいいだろう。



追記:

この処理両方とも insert や update がなく、

単にTrigger.new上のレコード情報を上書きしているだけ

である。

これはbefore insert, before updateでのトリガ起動

であるためこの処理の後に

実際の追加・更新処理が働くため記述されていない。

2011年4月24日日曜日

Force.com開発コースを受講する

Salesforce社の最後の研修、
Force.com開発コースを受講した。

以下がテキストの目次。
#2011年2月版

Force.comイントロダクション
  • Force.comとは
  • Force.comのメリット
  • Force.comプラットフォームでの開発
  • アップグレードとメンテナンス
  • Force.comプラットフォームでの開発に適するアプリケーション
  • 人材採用管理アプリケーション
このコースはあまり内容がないので
実際に速攻で省略された。
まあ前提研修受講済みの人なら飛ばされても
文句を言う人はいないと思う程度の内容。
この研修では前回の基礎コース同様
人材採用管理アプリをベースに演習が構築されている。


Force,comでの開発(DEV551)
  • Modile1: Development as a Service
  • Application Lifecycle Management(ALM)入門
  • Development as a Service に関するSalesforce.comの考え方
  • Module2: 統合開発環境
  • 概要
  • メタデータAPI
  • Force.com IDE
  • Force.com Sandbox
  • Force.com Code Share
  • 参考資料:変更管理
Force.com IDEはEclipseのForce.com開発用プラグイン。
Code Shareとあるが、構成管理ツールが提供されるわけではない。
SandboxやDeveloper Editionの使い方についての解説がメインかな。


Force.com Code(Apex)(DEV541)
  • Module1: Apexの紹介
  • Apexの紹介
  • Apexはクラウド
  • Apexの紹介使用例
  • Module2: データ型とロジック
  • データ型
  • ロジック
  • Module3: Apexでのオブジェクト指向プログラミング
  • クラス
  • 変数とメソッド
  • Apexライブラリクラス
  • Module4: データベース
  • sObjectリレーション
  • SOQL
  • SOSL
  • DML
  • Apex共有
  • Module5: Apexトリガ
  • トリガの型
  • トリガコンテキスト
  • トリガの制限
  • Module6: 例外、デバッグとテスト
  • 例外
  • デバッグ
  • テスト
  • Module7: 配置
  • 配置の概要
  • 他組織への配置
  • Module8: ApexとWebサービス
  • SOAP Webサービス
  • SOAP Webサービスコールアウト
  • REST Webサービスコールアウト
  • 非同期Apex
  • Module9: ApexとE-mail
  • インバウンドEmailサービス
  • Apexからのメール送信
  • Module10: 高度なトピック
  • 動的Apex
  • Visualforceコントローラ
  • バッチApex
  • カスタム設定

Apexクラス中心のコース。
文法は基本的な書き方程度で
言語仕様をがっつりという講義はなかった。
中心はDML/SOQL/SOSLか。
Force.com環境ではSOAPサーバ、クライアントどっちにもなれるので
それを説明してくれる。
Force.com上のメールアドレスへメールを送ると
トリガが走ったり指定のアドレスへ送信するとかもできることを学ぶ。
バッチは重要だけどとばされてしまった。
どうも時限起動できるバッチが作れるらしい。
工夫すれば出来るのかもしれないが、
この研修では
RESTサービスのサーバとしては使えないと教えている。
ガバナ制約があるのでRESTサーバにするのは
正直つらい基盤であるのでしょうがないところはある。


Force.com(Visualforce) Pages(DEV511)
  • Module1: visualforceの紹介
  • Visualforceの概要
  • Visualforceの基本
  • Module2: Visualforceコンポーネント(タグ)
  • タグの基本
  • タグバインディング
  • Module3: Visualforceコンポーネント(タグ)ライブラリ
  • コアコンポーネント
  • デフォルトLook and Feelコンポーネント
  • Module4: フォームとアウトプットコンポーネント
  • フォームコンポーネント
  • 出力コンポーネント
  • Module5: Visualforceコンポーネントの部品化
  • Module6: VisualforceでのJava Script
  • アクションバインディングとJava Script
  • JavaScript機能
  • ページの部分的な更新
  • 非同期オペレーションステータス
  • イベント上のAJAXの動作
  • Module7: Introduction to Visualforce(Apex)コントローラ
  • コントローラの概要
  • 標準コントローラ
  • カスタムコントローラ
  • 拡張コントローラ
  • Module8: その他
  • VisualforceとSite
  • VisualforceとSiteモバイル
apexタグをひとつひとつ解説してくれるわけではない。
こういうのがあるよというインデックスレベルでどんどん進むし
テキストにすべてのタグが記載されているわけではない。
Siteについてもがっつりとばされてしまった。
このコースの内容からすると、
どうも既存の宣言的開発ではちょっと届かない範囲
をこのコース内の知識でナントカクリアしてね
といった構成に読めた。
コントローラについては解説があったが
どうも最近次のコースに独立したためか
概要レベルにとどまった。

Force.com(Visualforce)Page Controllers(DEV521)
  • Module1: Visualforceの復習
  • Visualforceページ
  • Module2: Visualforce標準コントローラ
  • Visualforceコントローラ
  • 標準コントローラ
  • Module3: Visualforce拡張コントローラとカスタムコントローラ
  • カスタムコントローラの作成
  • 拡張コントローラ
  • カスタムコントローラの作成
  • Module4: その他のVisualforceコントローラトピック
  • カスタムウィザードコントローラ
  • コンポーネントコントローラ
  • コントローラのテストと配置
  • Visualforce付録

このコースでコントローラについて説明。
Force.com上ではセッションが使えないが
そのかわりにViewStateという機能があり
これでやりくりする方法を学ぶ。






この研修では計5日間で、
開発環境から、DML、SOQL/SOSLなどのDBまわり、
Apexクラス、トリガ、Visualforce、そしてコントローラと
毎日毎日新しいことを講義と演習で綴られている。

テキストは本体が約400ページ、
ページ数が振られていないので詳しく数えていないが
演習テキスト(別冊)も100ページは超えている。

予想通りテキストも演習も全部学習できるわけではない。
以下は演習ガイドの目次だが、右端に*をつけた部が
実際に演習を行った。
だいたい6割といったところか。

Force.comでの開発(3/8)(DEV551)
  • 演習1-1 Sandbox組織の作り方*
  • 演習1-2 Force.com IDEのインストールと構成
  • 演習1-3 Force.com IDEプロジェクトの作成*
  • 演習2-1 組織の構成を調査
  • 演習2-2 スキーマブラウザによるSOQLクエリの実行*
  • 演習2-3 既存オブジェクトと修正
  • 演習2-4 新しいオブジェクトとリレーションシップの作成
  • 演習2-5 Force.com IDEとForce.com Builder間の連動*
本研修の環境作りも入っている演習と行ったところ。


Apex(12/18)(DEV541)
  • 演習1-1 Hello World Apexクラスとトリガの作成*
  • 演習2-1 匿名ブロックを使用した簡単なApexコーディング*
  • 演習4-1 募集職種(Position)の共有*
  • 演習5-1 申し込み(job Application)のStatusの変更*
  • 演習5-2 応募者(Candidate)の重複防止*
  • 演習5-3 給与(Salary)情報の共有*
  • 演習5-4 求人サイトに募集職種(Position)を掲載
  • 演習5-5 申し込み(Position)の共有(Option)
  • 演習5-6 と給与(Salary)の関係を1対1に制限
  • 演習6-1 テストクラスの作成*
  • 演習7-1 別の組織へのApex配置*
  • 演習8-1 カスタムSOAP Webサービス*
  • 演習8-2 外部WSDLのインポート*
  • 演習8-3 非SOAP HTTPコールアウト
  • 演習9-1 インバウンドメールサービス*
  • 演習9-2 アウトバウンドメールの送信*
  • 演習10-1 動的SOQLでの検索
  • 演習10-2 Apexトリガを使用した上級な承認プロセス
Apexトリガが利用される業務要件ケースを
演習タイトル化してくれている。
穴あきソースを埋める形式なのだが、
埋めなくてはいけないコードの説明が
コメントで書かれている。
おまけに全部英語..
しかもその文面が人材管理アプリのオブジェクト構造を
きちんと理解していないと時間内にとても終えることは出来ない。
このため、ほとんどの研修受講者は回答コードをEclipseに
貼り付けてコードを読んで理解するという方式をとらざるを得なかった。
講師も一部日本語化して配布していたが、
正直研修前に全部日本語化しておいてほしかったところだ。


Visualforce Pages(8/11)(DEV511)
  • 演習1-1 Visualforce Hello Worldの作成*
  • 演習2-1 VisualforceでのPDFの生成*
  • 演習3-1 Salesforce詳細ページの再作成*
  • 演習4-1 別のUIウィジェットを使用したデフォルト編集ページのオーバライド*
  • 演習4-2 インラインページの表のデータの表示*
  • 演習5-1 Flashウィジェットを含むデフォルト編集ページのオーバライド*
  • 演習5-2 カスタムコンポーネントの作成
  • 演習5-3 ページテンプレートを使用したページの作成
  • 演習6-1 状況フィールドのための部分的ページリフレッシュの作成*
  • 演習7-1 カスタムコントローラを使用したVisualforceページの作成*
  • 演習7-2 より複雑なコントローラの使用
Visualforceの演習では
apexタグが大量に出てくる。
のでほぼコードを独力で埋めることは出来なくなった。
毎日の詰め込みで記憶飽和量をほぼ全員が突破している。
特筆すべきはカスタムコンポーネントの作り方か。
これはコミュニティサイトのドキュメントで学習するのは
とても効率が悪いので。


Visualforce Controllers(3/7)(DeV521)
  • 演習3-1 拡張コントローラの作成*
  • 演習3-2 拡張コントローラへのGetter/Setterの作成
  • 演習3-3 カスタムコントローラへのGetter/Setterの作成
  • 演習3-4 オブジェクトラッパークラスを使用するコントローラの作成
  • 演習4-1 マルチウィザード用の拡張コントローラの作成*
  • 演習4-2 カスタムコンポーネントコントローラの作成
  • 演習4-3 カスタムコントローラの単体テストの実施*

コントローラとなるApexクラスの作り方が中心。
ViewStateの使い方がポイント。
結論を言うと
コントローラクラスは JSF の
Managed Bean だとおもえばいい。
そのManaged Bean上の
Transient以外のフィールドが
自動的にViewState上にのっかる。
ただしSavePointがフィールドとして
乗っけられないので、
データベース(sObject)のトランザクションは
1リクエスト完結せざるをえない。
まあアプリとしてロールバック処理を
1行1行書いていけばつくることはできる。




この研修受講前提として
Java/.NETでWebアプリ開発をやったことのある人、
Java開発者でいえばJSFないしはStrutsでWebアプリを作った経験がある人か。

正直未経験者は
テキストをもらいにこの研修に参加するだけになってしまう。
部下を研修に行かせようとする人は
投資が無駄になるような人は送り込まない方が良い。



今回の講師は
Salesforce研修全部の講師の中で
一番腰が引けていた。
ただ
研修期間内は講師はSalesforce社に質問を
なげられるらしい。
なので、知識のない人が先生やっていても
きがねなくばんばん質問しちゃって良いようだ。

ただし
認定試験の内容に関する質問に答えると
講師資格を剥奪されるらしい。
サイトに置いてあるStudyGuide以上の内容は
回答できない「ガバナ制約」が働いている事に注意。

2011年4月15日金曜日

Salesforce for Social Media4.1を試す















自分のFacebookのウォールに
Salesforce社のコメントで
「Salesforce for Social Media4.1」
についての案内が出ていたので、
ためしにDeveloper Editionに
なんとなくいれてつかってみた。


自社の商品やサービスについて
TwitterアカウントやFacebook(ファン)ページをつくっていて
TLや検索結果のつぶやきやコメントを取り込んで評価を分析したり
有用なつぶやきをFacebookウォールコメントや社内のChatterへ回送したり
TwitterやFacebookコメントをくれたユーザをリードや取引先責任者化したり
するマーケティング担当者用のアプリケーションだ。

ただ、アプリとしてTwitterやFacebookからデータを取り込むところまで
はできるのだけど、
自動的に評価してくれる
とかの機能はざんねんながらない。


自動評価振り分けのようなものを
やろうとおもえば
たとえばHadoopやAmazon Map&Reduce とかを使って実装して
ワークフローのアウトバウンドメッセージとかで
別システムにそっくり投げて結果をもらうとかしないと
いけなくなる。


インストールすると
「Salesforce for Twitter」というカスタムアプリケーションが増える。
このアプリには以下のようなタブがデフォルトで見えている状態になる

・ホーム
・Salesforce for Twitter(上の絵)
 設定へとぶことができる
・ダッシュボード
 現時点で取り込んだメッセージ分析のダッシュボード
・取引先責任者
・リード
・ケース
・キャンペーン
 取り込んだメッセージからレコード化されたものを見るための
 標準タブ
・Twitterの会話
 取り込んだタイムライン
 1行1行ちくちくと人間が評価する
・Twitterアカウント
 設定画面
 複数のアカウントをセットできる
 パスワードを指定するとSalesforce内のフィールドから
 Twitter、Chatter両方同時にメッセージを投げることができる
 (上の絵の画面から)
・Twitter検索
 ハッシュタグ検索取り込みの場合使用する
 キャンペーンレコードを先に作っておいて、
 そのキャンペーンで使ったハッシュタグをセットするのが
 どうも正しい使い方らしい
・Facebook Page
 Facebook Userが管理者となっているFacebookページ
・Facebook User
 Facebookページの管理ユーザを登録する

あくまでFacebookページのみで
Facebook個人ページのウォールは取り込まれないようだ
Facebook Userは管理者となっているアカウントを登録するだけである

海外の企業は
FacebookページやTwitterアカウントを積極的に
営業ツールとして使用しているが
国内ではどれくらいいるのか..
あまりいないのかなあ..

マニュアル(?)も英語のPDFしかないし..

2011年4月13日水曜日

「Salesforce CRM システム管理者コース修了者対象Force.com基礎コース」を受講する




長ったらしいタイトルのコースだが
先日受講してきた。


もらったテキストは以下のコース(章)に
わかれている。

・Force.comイントロダクション
Force.com概要をざっくり説明する。
正直さきのコースの焼き直しだが、
Salesforceの研修で「Force.com」と記載のあるものは
基本PaaSとしてSalesforceを使うらしいことと、
Force.comライセンスとSalesforce CRMライセンスとの
違いくらい。

・アプリケーション基礎
アプリケーション、タブ、ページレイアウトを
含むオブジェクトの作り方の復習。
カスタム項目として暗号化項目
(入力したら*やらXでマスクされる項目)の作り方、
変更セット(SVnのタグみたいなやつ)くらいが新出。

・複数ユーザのためのアプリケーション設計
プロファイル、ロール、共有ルール、手動共有などの
セキュリティモデル復習が中心。
新出はApex共有
(手動共有ボタン押したときの理由項目を増やす)
くらい。
あとForce.comライセンスとSalesforce CRMライセンスとの
違いかな。

・ビジネスプロセスの実装
入力規則、ワークフロー、承認プロセスの復習。
新出はデバッグログ
(指定したオブジェクトの操作を20件までログをとる)。
ワークフローや承認プロセスで埋め込める
アウトバウンドメッセージを使ったり、
動的に承認者を割り当てる方法
(Apexトリガを使うが詳細説明なし)
などを学習する。

・データ管理
インポートエクスポートのより実践的な方法の説明。
新出はデータローダを
コマンドラインから実行する方法くらいか。
実際にインポートする演習が山かな。

・分析
レポート機能の復習..らしい。
結局時間がなく、
新出項目以外はばっさり省略されてしまった。
新出は分析スナップショット
(レポートを時間串で見るための機能)のみ。


もともと演習テキストが充実していて
人材採用システムをカスタムアプリを
ほぼ宣言的実装で作ってしまうという
Force.comの基礎ともいう位置づけのコンテンツで、
これを管理者コース受講者は差分だけ学習する。

なので、演習もとびとびで
いまいちやったという充実感が常に欠ける
研修だった。

ぶっちゃけていえば、
上記の新出項目をヘルプで読み解いて
Developer Editionで試しておけば
わざわざお金をはらって受講する必要はない。

特に
正直コンサルタント資格取得を目指す人は
不要だと思う。
管理者コース終わったら、
コンサル受験のコースへそのまま進めばいい。

演習自体は
ワークブックのアプリをもう少し難しくしたくらいの内容。
Developer Editionではライセンス数の上限があるので
どうしてもプロファイルやロールにバリエーションが
だせないので、
その辺は実践的とは言えるかもしれないけど。


内容が復習8割新規2割だったためか、
受講しても
ふわふわした感じがして
他の研修と比べるとどうしても
手抜き感をうけてしまう。


興味のある方は受けてみてください。

2011年4月12日火曜日

Chatterのデモ環境を立ててみる

捨ててもよいメールアドレスで
Salesforce Developer Editionを使って
デモ環境を作ってみた。

と、かくとかっこよく読めるが、
なんのことはない。
Developer Edition上にChatter Freeアカウント4つつくって
ちょっとデモ用のつぶやきを書き入れただけだ。
一応どこからでも入れるように
全IPアドレスからのアクセスをOKにセットしているくらい。


Chatterをよく知らない人でも

https://login.salesforce.com/?locale=jp

から
ユーザ名「kircheis@empire.gov」
パスワード「P@ssw0rd」
でログインすればなんとなく使い方はカンでわかるはずだ。


なお、上記アカウントなら
メッセージは自由に書き込んでもらって
かまわない。



使ったことのある人、
上記IDでログインした人はわかるとおもうけど、
まあ社内Twitterという理解でいいとおもう。

ハッシュタグでの検索もできるが
グループお作ってその中でつぶやきを共有するのが
いいとおもう。

Salesforce CRM/Force.com ってログインされなくなると
とたんに契約を切られてしまうので
それを防ぐために Twitter 機能をつくって
5000ライセンスを契約者にタダで配って大盤振る舞いして
Chatter使っている関係上契約がなかなか切れない
状況をつくろうとしているのだとおもう。

Salesforceを使ってみると
微妙に機能が足りなくて
それを満たすのにライセンス追加やEdition変更とかを
やらなくてはならない。

いい商売しているなあ..

2011年4月4日月曜日

Salesforce.com システム管理者コース後篇を受講する

受講してかなり時間がたってしまったが、
後篇についても書いておく。

大まかな章立ては以下の通り。

ワークフロー
・ワークフローの理解
・ワークフロールールの定義
・ワークフローアクションの設定

承認プロセス
・承認プロセスの計画
・承認プロセスウィザードの使い方
・承認プロセスの作成

分析―レポート
・カスタムレポートの作成
・高度な絞り込み
・条件付き強調表示
・カスタム集計項目
・カスタムレポートタイプ
分析―ダッシュボード

マーケティング管理
・リードの利用
・キャンペーンとキャンペーンメンバの管理
・リードキューと割り当てルール
・Web-to-リードと自動レスポンスルール

コールセンタ
・ケース管理の設定
・ソリューションの管理

Salesforceの拡張
・カスタムオブジェクト
・カスタムタブ
・カスタムアプリケーション

AppExchange
・AppExchangeの概要

前編の難易度から
気合を入れて後編にのぞんだが、
それほど難しくなかった。

どうも前篇の
ユーザ、プロファイル、ロールと
共有モデルの部分が
Salesforceのヤマだったようだ。

前編で標準オブジェクトを中心にカスタマイズを行い、
後篇の最初のワークフローや承認プロセスで
プロセス面の味付けをするといった流れのようだ。
で、SFAを中心とした標準オブジェクトで解説だったので
抜けていた
・リード(見込み顧客)
・キャンペーン
・ケース(問い合わせ)
・ソリューション(FAQ)
などに特化した機能について解説してくれた。

SFA中心のテキスト構成なので、
マーケティングやコールセンターをメインに
Salesforceを使用したい会社にとっては
正直不満が残る。

カスタマーポータルの作り方や
なによりService CloudとSales Cloudの違いが
研修にでてもさっぱりわからない。

電話連携やソフトフォンなどの
コールセンタを構築する側が一番知りたいところは
全く触れられずおわってしまう。

講師に質問しても
Salesforce営業・サポートに聞いてほしい
ってかえってくるし..


前・後編を受講すると
「標準オブジェクトをベースにカスタマイズを行い
 セールス(、マーケティング、コールセンタ)を利用できるようにする」
までが独力でできるようになる。

2011年3月9日水曜日

Salesforce.com システム管理者コース前篇を受講する

Salesforce.com Spring'11 Enterprise Edition/Unlimited Edition
システム管理者コース ワークショップ
の前後編研修計4日間受けてきた。


研修内容は、以下の通り。
これくらいは公開してもいいだろう。
今回は前篇分だけ。

- Salesforceの概要
あまり内容がない。

- ID確認機能とIPアドレスの制限
ログインの時に聞かれる「有効化」の意味が分かる。

- カスタマイズ
プロファイルとユーザの関係がわかる。
オブジェクト、項目の設定まではいいが、
ページレイアウト、レコードタイプ、ビジネスプロセスで混乱する。
ページレイアウトは詳細を表示するページの画面構成をさす、
レコードタイプはオブジェクトのタイプごとに属性を変えたい場合に使用する。
ビジネスプロセスは商談、リード、ケース、ソリューションの4つ、
すなわちレコード各々に"状態"を持つ標準オブジェクト固有の機能で、
レコードタイプによって状態を表す属性の出しわけを行える機能。
ページレイアウトでは項目をどこに出すかどうかまでは設定できるが、
状態を表す属性を選択するためのリスト項目を操作するには
この機能が必要になる。
このあたり、研修受講中には理解しきれなかった。
カスタマイズ終盤で初日終了。

- ユーザインターフェイスの設定
検索機能の説明や、カレンダなどの使い方、
インライン編集や拡張リストなどを学ぶ。
Chatterのために結構Salesforceが
おもいきってUIをいじったことがわかった。

- 入力データのチェック
式が書けるが、結構支援してくれるので
わざわざ関数名を覚えたり標準オブジェクトの項目ラベル名を
覚えたりしなくていい。

- セキュリティとアクセス
2日目の山場、ロール、プロファイル、組織の共有設定、共有ルール
の関係がややこしい。
Siebelも可視性と組織のカスタマイズが結構ややこしかったが、
同じCRMだけあって同じ機能が厄介だったりするのが
さもありなん。

- データ活用のための機能
インポート、エクスポートとツールの話。

参加者は10名、研修用データの入ったSalesforce環境がわたされ
演習をその上でやりながらすすめるが、
前の研修設定が入ったていで次の演習がつづくので
たとえば2日目の朝遅刻するとついていけなくなる。

今回の研修でも1名遅刻してきて昼休み補習(?)を
やっていた。
この人結構ルーズで、研修室内でお菓子食べたり、
フリスクぼりぼり噛んだり結構プチトラブルメーカだった。
(たぶんI社の人だとおもう)

一般的に研修は時間内に終わるのだけど、
この研修は(後編も)30分くらい伸びてしまう。
もともと研修内容が時間にあっていない。
講師もテキスト全部説明できないので
ややとばしとばしだし、
結局質問は研修が終わった後以外にはできない状態だった。

Salesforceは結構簡略化されているように見えるが、
Siebel2000の研修のボリュームとあまりかわらない。
むしろSiebelのほうが演習時間や質問がたっぷりあるので、
Salesforceの方が研修という面では洗練されていないといえる。

Siebelもそうだが、
Salesforceの研修を受ける人は知識を浅く広く
つめこませられてしまうので、
それに対応できるように
途中で意識をなくしたりすると
すぐにおいつけなくなる。
フリスクぼりぼり君も2日目午後は
ついていけない匂いが結構していた。

これから受講される方は
意識をたもって受講してください。

2011年1月19日水曜日

Salesforceのユーザと組織の構造を調べてみる

先に書きますが、
ここにかかれている情報は
ちゃんとチェックしているわけではないので
誤りがあるかもしれません。

もし誤りを発見された方は
コメント欄にご指摘いただけると
私もほかの参照されている方も
うれしいとおもいますので、
よろしくです。



Salesforceの無料トライアルへ登録して
カスタマイズを一切しない状態での
Salesforce CRMを調べ始めた。

こういう業務アプリ系は
組織構造やユーザとの関係を把握しておかないと
ビジビリティとかアクセス権とかでやっかいなので
まずそこだけのぞいてみた。





















Salesforceではテーブルに相当するものを
オブジェクトとよんでいるようで、
このオブジェクトの関係を把握してみようと
クラス図もどきを書いてみた。


Salesforce契約すると
組織という単一唯一のインスタンスができるようだ。

休日、営業時間、会計年度が紐づいているかは
正確に設定画面からはわからなかったけど、
おそらく規定関係があるのだと思う。

ユーザはメールアドレスが必須だけれど、
ユーザアカウントにもアドレスを使う。
ユーザアカウントは全世界で1つの
Salesforce CRMというシステムインスタンスへ
ログインするので、
世界で単一である必要がある。

便宜上一人の人が複数アカウントを
持てるようにユーザアカウントには
・メールアドレス形式であること
・異なるアカウントで同一のメールアドレスでもよいこと
となるようだ。

chatter使いなら
メールアドレスの先頭に
chatter-をつけるなどすればよいらしい。

でも無料お試し登録時に
そんなことはわからないから
会社のアドレスで登録してしまった..
ちょっと気になる..

Chatterでつかっている「グループ」と
「公開グループ」というやつは異なるようだ。

公開グループはいわゆるPartyオブジェクトなのだとおもう。
1名以上複数名をあらわすオブジェクト
というやつだ。

ロールは組織名をそのまま使うことが前提っぽいが
組織名をユーザオブジェクトの属性として
別途文字列で持っていて、
これがロールとは別に書き込めるようになっている。


とすると、組織改編の激しい会社などでは
ロールを会社内の役割として使えるようにしているのだろう。


組織は
無料登録した時の組織名がそのまま入っていた。
ディビジョンも属性にあるから..
会社=Salesforceの組織、にしないで
会社の1組織=Salesforceの組織、にもできるような
配慮かな。
Onyxのように部署単位でSFAを入れることが多い
業務アプリもあるからだとおもう。



キュー..というのはアプリ側のビューからは
見えていなかったので使い方はわからない。
MLなどの同報通信を表しているのかな..


やはりSiebelとくらべて、
(..といっても2000(Ver6)の知識だけど..)
オブジェクトの数がSalesforceのほうがシンプルだ。

Siebelの組織なんか
完全なCompositeパターンで構成されているから
どんな組織でもアプリ上で実現できたけど、
Salesforceはそれよりはフラットな構造をしているので
拡張性は多少無視してシンプルさをとったって感じか。


Siebelは、システムの設計上
なんでもかんでもできまっせ、を実現するために
ほぼすべてのエンティティを事前に定義していた。

カスタマイズ担当者にはよけいなエンティティを
作らせない、
カスタマイズする奴はみんな悪さをるという性悪説ベース
の設計なのだろう。

今になって考えると、
あの時代のERPも似たような思想なので
対抗させるにはそういった設計を採用したのかもしれない。

だから複雑になりすぎて
使いこなせるカスタマイズ担当者、ユーザがいなかったのだとおもう。


Salesforceはシンプルな構造のみを提供して、
必要があればユーザがオブジェクトを新たに作ったりできる
ようにしたのか。
PaaS環境提供も想定されていたのだとおもうので
オブジェクトをユーザに自由に作らせないと対応できないし。


Siebel勉強してた時はいやいやでしょうがなかったけど、
同一業務の複数のアプリケーションを知る機会ができて
いまはラッキーだったなと
ちょっと思った。

2011年1月18日火曜日

書籍「Force.comクラウドアプリケーション開発」に悩まされる

セールスフォースを使いこなそう
Force.comクラウドアプリケーション開発


という本を買った。

1章の概要は
ほんとうに必要最小限の情報だけ。
エディション別の比較があったところは参考になった。

2章、3章は
ざらっとパラ見したが
コードを書かないで設定だけでアプリを作る方法を
紹介している。
ワークブックだと画面スナップがなくよくわからない
という人には参考になるかもしれない。

ただ画面はバージョン10なので
現時点で1世代前だから
多少入力項目名などが変わっているかもしれない。

私はワークブックをやっていたので
読まずにパス。

4章に
VisualforceとAPEXコードを書いた
アプリを作成し、
Force.comアカウントのない人にも
使える公開アプリの作りかたを紹介するもの。

なので、4章からはじめた..

が!
この本..
本当に校正やらチェックやらやったのだろうか..

まず、
Visualforceコードが
画面スナップのみでしかみせていない。
しかも、
スナップ内のコードの文字サイズが
0.5ミリくらい..

これ、読めってか!

..仕方ないので
目を細めて精読して読み取った。
読み取ったコードは以下の通り。


1画面目Visualforce:forminput
<apex:page controller="form_controller" tabStyle="lead">
<apex:form >
<apex:commandButton action="{!step2}" value="確認" />
</apex:form>
</apex:page>

2画面目Visualforce:formconfirm
<apex:page controller="form_controller" tabStyle="lead">
<apex:form >
<apex:commandButton action="{!step1}" value="Previous" />
<apex:commandButton action="{!step3}" value="Next" />
<apex:commandButton action="{!cancel}" value="Cancel" immediate="true" />
</apex:form>
</apex:page>

3画面目Visualforce:formfinish
<apex:page >
入力完了しました。
ありがとうございました。
</apex:page>

..なんだ、これ..
「確認」押して、
「Next」押して、
固定文言のページを表示するだけじゃん..
サンプルにしても
もうちょっと入力するフォームとかにすればいいじゃん..

..文句はあるけど
とりあえず続ける。

Controllerにあたるコードが4.2.3章に載っているんだけど、
まず前の章では一挙手一投足画面スナップで紹介しているのに
ここの章は全然書かれていない。
どこにAPEXコードを新規登録すればいいのか
一切書かずにコードだけペロンと載せている..

まあワークブックやっているので
設定→開発→Apexクラス選んで、
Visualforceのpageタグで定義しているform_controller
って名前のクラスを新規で作って、
本に載ってるコードをそのまま打ち込んだ。

で、
保存しようとしたら..
step2(), cancel()がないとかでエラー..

ああこのソースコード完成してないじゃん..
で、以下のように修正。

Apexコード:form_controller
public with sharing class form_controller{

public PageReference cancel() {
return Page.forminput;
}

lead ld;

public lead getLd(){
if(ld==null) ld= new lead();
return ld;
}

public void setLd(lead ld){
this.ld = ld;
}

public PageReference step1() {
return Page.forminput;
}

public PageReference step2() {
system.debug(ld);
return Page.formconfirm;
}

public PageReference step3(){
lead ld = getLd();
return save(ld);
}

PageReference save(lead ld) {
if(ld.Company == null){
ld.Company = 'uhuru';
}

if(ld.LastName == null) {
ld.LastName = 'abe';
}

insert ld;

PageReference leadPage = new PageReference('/apex/formfinish');
leadPage.setRedirect(true);
return leadPage;
}
}

..またこれも、
内容のないサンプルだなあ..

leadオブジェクト作って、
必須項目の会社名、名前だけ決め打ちで入力して
保存するだけ、じゃん..

いくら表紙で
マウス操作だけで作れる!
っていれたからって、
Visualforce/Apexコードの章
めちゃくちゃだ..

本当にゲラチェックとか
してるのかな..

..と書いた人のウフルなる会社のサイトを
見たのだけれど..

Salesforceの開発者ブログなどは
全然上級者っぽいひとがいそうな感じだ..

こういった技術者がいるのに、
なんであんな本つくってしまうのだろうか..




p.s.

この記事を書いた後に
Force.com開発者コースという研修を受けたのだが、
ある演習問題のソースをコピペしたんじゃないか..
っていう片鱗を見つけた..

いやいや!
Force.com開発の雄ウフル社の書籍だから
決してそのようなことはしないだろう。

これはきっと腹黒い私の憶測でしかない考えだ。
うんうん気のせい、気のせい。
こんな憶測書いてしまってごめんなさい。

2011年1月13日木曜日

Chatterのチュートリアルをやってみる













社内でTwitterクローンを作るのも良いけど
社外で仕事しているメンバが使えない。

使えるようにするには
DMZに置かないといけないとか
色々面倒だ..

となると候補に出てくるのは
Salesforce.comのChatterだ。

最初金取られると思ったのだけど
サイトをみると無料版もあるみたいだ。

developerforceにあるチュートリアルを
とりあえず.NETから使うところ(4つめ)を飛ばしてやってみたが、
まあ..うん簡単かな。

ファイルの投稿もできるし
グループも作れる。

ユーザ単位でのフォローもできる。

ハッシュタグのかわりは
グループでできるかもしれない。
ただ複数グループ同時(ハッシュタグを複数打つ)は
できなさそうか。

ただまだ携帯はiOSだけだ。
Androidはまだ出てないみたい。
#BlackBerryもでるみたいだけど
#こっちは..いいか

Javaアプリから
Webサービス使うときも
ConnectorConfig#setProxy(host, port)
使えばproxy設定できるので
定時連絡アプリとかも社内で実行できる。


にしても..
どうも Salesforce.com の Chatter サイトは
理解しずらいので
結局自分で実際に使ってみないとよくわからなかった。

無料と書かれているのに使い方がすぐにわからない..
Developer Editionからのルートが書かれていない。

「ほんとに、CRMをやっている企業か?」
と思ったけど
ひょっとしてわざとわかりづらくして
見込み顧客からSalesforce.comへアクセスさせるのが
目的なのかもしれない。
もしそうなら大人な会社だ..
もしそうなら、だけどね。


Google先生に聞いてみると下記の記事がヒットした。

この記事をよむと Developer Editionからだと100ユーザまで使えるらしい。
Force.comではなくCRM側のContact Manager EditionでもChatterつかえる
ってあるけど、
Salesforce.com社のサイトの
にはそれらしいことが書かれていない。
あ、Contact Managerって5ユーザ(20GB)までじゃん..

とりあえず、
ざっくりわかったところまで書いてみると..

・Chatterを理解するにはDeveloper Force JapanのChatter Workbookを
 半日実際にやってみれば覚えられる
 フリーメールアドレスをつくり、試せばよい。
・ChatterはSalesforce CRM/Force.comへログインして使う
・ログインして右上のアプリ選択で Salesforce Chatterを選んで使う
 ログイン名はメールアドレス形式だが、架空でもよい
 ただしユーザは必ず使っているメールアドレスを別途指定する
 このアドレスに初期パスワードやフォロー先の更新情報が来る
・グループが作れる
・ファイルも添付できる(エディションの上限まで)、グループにファイルを置ける
 同じファイルをアップロードしても同一ファイルの更新にはならず別々
・フォローは個人、グループや個別のファイルに対して張れる
 フォローをはると更新がタイムライン(?)にでる
・社内のJava/.NET アプリからアクセス可能
 Webサービスで接続、proxy経由でもOK
 コーディングはSObject(Force.com/Salesforce CRMのDBテーブルのようなもの)を
 知らないとできないのでChatterだけでなく
 Force.comのworkbookもやっておくとよい
・Google App EngineからSObject連携ができるので、正直RDBになれたアプリ屋
 からすると使いづらい面をBigtableにかわってForce.comを使って逃げることもできる
 Amazon RDSもあるか..JDBCがApp Engineに載るかどうか知らんけど..
・Workbookをやっている人は「Force.comクラウドアプリケーション開発」を買わないでよい
 細かなエディションだとかの情報がまとまっている部分のみ有用
 画面もバージョン10ですでに現時点で1つ前
・無料でChatter使えるのはForce.com Developer Editionで100ユーザまで
・有料でChatter使える一番安いのはSalesforce CRM Contact managerだが
 5ユーザまでらしい
・Chatter単独だと1500円/月人
 1000人の会社が1年で2300万以上になる
 ので意外と高い→社内サイトorAWS micro上にTwitterクローンのほうが安い
 Contact Manager以外のCRMエディションは3000円以上になる
・Salesforce CRM/Force.com裸単騎の機能では帳票を作る部分の機能が弱い
 AppExchangeに帳票系のアプリはありそう(ウイングアークとか)
・Salesforce.com サイトはCRMを売っている会社なのに顧客にとってわかりずらい
 開発者のコミュニティもさほど活性化していないのも、
 このSalesforce.com社の迷彩戦術の結果かもしれない



あと知りたいのは、
Active Directoryのユーザ認証連携がわかれば
万々歳なのだけど..これはまだ良くわからない。
Open IDとかでなくできれば社内のActive Directoryを
フェデレーションゲートウェイとかうにうにやって使いたいなあ..

もしご存知の方は
よろしければコメント欄にでも
書いていただけるとありがたいです。

2011年1月6日木曜日

Androidで画像縮小する方法いろいろ

以前GridViewに画像をたくさん並べる方法
のときにサムネイル化するために
画像を縮小する必要があったのだけど、
あまり考えずに
Google App Engine で以下のようなServletを書いて
処理していた。




public class ResizeServlet extends HttpServlet {

private static final long serialVersionUID = -999999L;

/** デフォルトの高さ(ピクセル) */
public static final int HEIGHT = 50;

/** ロガー */
private static final Logger log =
Logger.getLogger(ResizeServlet.class.getName());
/**
* 生存確認
*/
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
PrintWriter pw = resp.getWriter();
pw.print("ResizeServlet is alive!");
pw.close();
}
/**
* 画像を高さ100spに変更して戻す
*/
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException{
DataInputStream dis = new DataInputStream(req.getInputStream());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int c;
while((c = dis.read())!=-1){
baos.write(c);
}
byte[] org = baos.toByteArray();
log.info("doPost: length=" + org.length);
Image image = ImagesServiceFactory.makeImage(org);
int height = image.getHeight();
int width = image.getWidth();
Transform resizer =
ImagesServiceFactory.makeResize(
(int)(((double)width*HEIGHT)/((double)height)), HEIGHT);
ImagesService service = ImagesServiceFactory.getImagesService();
byte[] result =
service.applyTransform(resizer, image).getImageData();
DataOutputStream dos = new DataOutputStream(resp.getOutputStream());
dos.write(result, 0, result.length);
dos.close();
dis.close();
}
}



App Engineの上記のServletサイトへPOSTで送った画像を
App Engineに用意されているGoogle APIで高さ100ptの画像に変換して
送信元へ返しているだけの単純なつくりだ。
実際にはパラメータで高さ指定できるものを利用しているが
サンプルコードは決め打ちにしてある。

ちなみに、Android側はURLConnectionを使ってbyte[]でもらってくればいい。
private byte[] resizeImage(String url, byte[] org) throws IOException{
 URLConnection conn = new URL(url).openConnection();
 Log.d(TAG, "getImage: url =" + url);

 conn.setDoInput(true);
 conn.setDoOutput(true);
 conn.setRequestProperty("Content-Type", "application/octet-stream");
 conn.setRequestProperty("User-Agent", "androidSample");
 conn.setRequestProperty("Content-Length", 
  new Integer(org.length).toString());

 // 送信
 OutputStream os = conn.getOutputStream();
 DataOutputStream dos = new DataOutputStream(os);
 dos.write(org, 0, org.length);

 // 受信
 InputStream is = conn.getInputStream();
 DataInputStream dis = new DataInputStream(is);
 int b;
 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 while((b = dis.read())!=-1){
  baos.write(b);
 }
 dis.close();
 is.close();

 dos.close();
 os.close();

 byte[] result = baos.toByteArray();
 Log.d(TAG, "resize: org_length=" + org.length + ", result_length=" + 
  result.length);
 return result;
}


引数の変数urlは先のApp Engineの該当ServletのURLを
書けば良い。
カメラにせよ、S3上にせよ画像データをbyte[]で渡してやれば
戻り値として小さくなった画像を返してくれる。
これを非同期でGridLayoutを更新させるように実装すればいい。
#ボタンイベントなどに書くと、とたん固まってしまうから、やらないほうがいい
#とりあえず動けばいい人は書いてもいいが..


けれど、
昨日Androidの会のMLに以下のようないくつかの方法が
紹介されていた。

画像をきれいに縮小する方法

まだ試してはいないけれども
これだと通信事情が悪い場所でも
縮小できそうだ。

画像に関する知識が私にはまったくなかったので
ありもの(AppEngineのImageService)で何とかしようとしていたけど、
質問した人は画像処理について詳しい方のようで
もっといい方法を紹介してくれている。

勉強になった。

Google Colab相当の環境をローカルPC上のDocker Composeで実現する

 Docker Composeの有料版に、お金を払いたくない ^H^Hが使えない ため古いゲーミングPC(GeForce3080)にDocker Composeを入れてその上のコンテナでGoogle Colab相当のノート操作ができないかためしてみた: コンテナイメージとして a...