Translate

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)で何とかしようとしていたけど、
質問した人は画像処理について詳しい方のようで
もっといい方法を紹介してくれている。

勉強になった。

ClaudeをOpenAI O1のように思考させるDifyサンプルを試す

 Difyの「探索」タブにはさまざまなサンプルが載っており、その1つに「Thinking Claude (OpenAI O1 Alternative)」というものがある。   このサンプルがどういうものか、未だに自分でも解けない以下の問題をためしに聞いてみることにした。 『人類の...