Salesforceで開発したり

Salesforceで開発したり

Salesforce.comに触れ始めてからもう7年
当時から比べたら相当な進化を遂げている。
出来る事が増えた分、やり方を調べなきゃいけないので、日常と共にメモで残そうというお話。

Amebaでブログを始めよう!
いよいよ、恐れていたことが現実となった。

高校アフロ田中
中退アフロ田中
上京アフロ田中
さすらいアフロ田中

と、4部計40巻の歴史についに幕をおろした形だ。


高校アフロ田中全10巻 完結セット (ビッグコミックス)/小学館
¥5,322
Amazon.co.jp
中退アフロ田中全10巻 完結セット (ビッグコミックス)/小学館
¥5,303
Amazon.co.jp
上京アフロ田中全10巻 完結セット (ビッグコミックス)/小学館
¥5,397
Amazon.co.jp
さすらいアフロ田中 10 (ビッグコミックス)/小学館
¥580
Amazon.co.jp


以前、当ブログでも紹介した「ひめはじけ」の即終了(打切り?)に比べれば
断然長期連載であり、長く楽しめた作品であった。

しかしながら、また私の楽しみがひとつ減ってしまった。
今、本屋で最新刊を見つけて即買いする単行本と云えば、下記に限られる。


嘘喰い 29 (ヤングジャンプコミックス)/迫 稔雄
¥540
Amazon.co.jp

ハチワンダイバー 29 (ヤングジャンプコミックス)/集英社
¥540
Amazon.co.jp

トリコ 24 (ジャンプコミックス)/集英社
¥420
Amazon.co.jp

美味しんぼ 104 食と環境問題 (ビッグコミックス)/小学館
¥540
Amazon.co.jp

NARUTO―ナルト― 64 (ジャンプコミックス)/集英社
¥420
Amazon.co.jp


それらの中でも筆頭であった【アフロ田中】シリーズの終了は大変痛い。。。

いつも10巻毎にタイトルを変えて、新天地へ旅立っていた田中だが
まさか終了になるとは。。残念すぎる。

いつか、おじさんになった田中に再開できる日が来ると願って(作者さんに)
今はお別れを言っておこう。

中年アフロ田中、楽しみにしてます。
今回のSalesforceネタですが



アドベントカレンダー2012
Force.com Advent Calendar 2012

Facebookページ
Japan Force.com Developer Group


向けの記事になります。
2012年12月20日担当でしたが、
動作確認とかしていたら21日になっていました。。
失礼致しました。

気を取り直して、今回話題にしたいのは
[Force.comプラットフォーム上から外部サイトとAPI連携したい]なー、
みたいな時に利用するcalloutという仕組みについて。

これだけTwitterやFacebookが流行っている世の中、利用するシーンは無限大
それだけにみんなもう実践しているかと思いますが、まとめの意味も込めて。


さて、内容が目新しい物ではないという予防線を貼った所で具体的な内容ですが
このcalloutという仕組み、制限があります。
Force.com開発者は驚きもしないでしょうが。

まずは、回数制限
※一連の処理(Apex起動~処理終了まで)の間に10箇所まで設置することができます。(しかできません。)
※1日(24時間)で200Calloutが制限になり、それぞれ、それ以上実行するとエラーになります。

さらに呼び出し方にも注意点があります。
※callout(外部サイトからデータ取得)してからForce.comでそのデータを登録(DML)
※DMLでデータ取得してからcallout(外部サイトにデータ登録
上記の様な流れでしか呼出はできず、calloutの前後両方にDMLを設置したり
逆にDML前後両方にcalloutするとエラーになります。


最後に実装ですが、こちらはとても簡単。




メソッド定義

@future(callout=true)
public static void calloutHttpAccess(){
// ※1
Http http = new Http();

HttpRequest request = new HttpRequest();

request.setEndpoint('http://****アクセスしたいAPIのURLだよ!****');

request.setMethod('POSTとかGETとか!');

request.setHeader('Accept','text/plain, */*');

request.setHeader('Accept-Charset','Shift_JIS,utf-8;q=0.7,*;q=0.3');

request.setHeader('Accept-Encoding','gzip,deflate,sdch');

request.setHeader('Accept-Language','ja,en-US;q=0.8,en;q=0.6');

request.setHeader('Connection','keep-alive');

request.setHeader('Content-Type','text/xml; charset=UTF-8 ');

HttpResponse response = http.send(request);
String responseBody = response..getBody();
// ※2
}


※1 / ※2のどちらかにしかDMLは使えません。
また、普通の感覚だったら※1~※2までの間は別メソッドにすると思いますのでその様に。
まぁ普通にJavaでHttpRequestを利用したプログラムを書いたことあればすぐわかるような内容でした。


ちなみに、Force.comでの開発で必須であるテスト実装についてですが
callout呼出があるとテストが止まっちゃいます。

そこで、メソッドを実装するクラスに、public booleanなフラグを持って、デフォルトはOFF(false)にしておきます。
・フラグがoffの時は通常のcallout呼出をするように。
・フラグがonの時はcalloutを経由せずに文字列等のダミー結果をreturnするようにしておきます。

テストメソッドから呼び出す時にだけ、メソッド呼び出し前にON(true)にしてあげれば
テストではcalloutせずに、通常実行時のみcalloutされるようになります。(当たり前ですけど

この記述だと、OFFの時の分岐を通らなくなるのでテストカバレッジは少し下がっちゃいますけど
まぁcallout後が全部テストできないよりはずっといいんでないかと。

以上、今回はcalloutのお話でした。
2012/12/06 ビッグサイトにてSalesforce社国内最大イベントの
「CloudforceJapan2012」が開催されました。

Cloudforce2010には弊社もブース出展しました、もう2年か。。

今回は、会場がビックサイトになり日程が2日→1日に変更になったが
1日に人数が集中したわりに空いてた感じがするのは会場が広くなったせいかな?

今年の注目は、今回初のプラチナパートナー出展した
[NetyearGroup社 : SocialVoice]であろうか。

セッションにて、実際にSocialVoiceを利用したTwitterのカスタマーサポートを紹介していたのでなおさら注目されていた感じ。

他にも、ラジコン?を飛ばして航空写真を撮ってそれをSalesforceに送るという今までに無いタイプの製品も出展されていた。


仕事柄、知合いに何人か会ったし、予期しない人とも会えた。
でもやっぱり、ビックサイトは広いし会場わかりにくかったな。
影牢 刻命館 真章(PS1)



影牢 ~刻命館 真章~ PlayStation the Best/テクモ
¥2,940
Amazon.co.jp

PSStoreのアーカイブスで買えば600円
グラフィック的にはやはりPS1というか、FF7とか前後のレベルだが
ゲームシステムが画期的なのでご紹介。

ストーリー的な物もあるが、基本的には、館に侵入してくる敵を
床・壁・天井に仕掛けた罠と、部屋に元々ある仕掛けを利用して淡々と倒していくもの。

罠によるコンボでポイントを稼ぎ、より強い・残虐な罠をゲットしていく。
具体例としては、天井から落とす花瓶があるが、花瓶(目隠し)→油花瓶(火を付けると燃える)→溶岩花瓶(溶岩が入っていて一定時間で爆発する)がある。

花瓶被せる→飛び出す壁で吹っ飛ばす→床の罠で捕まえる→油花瓶を被せる→壁から火の矢を飛ばして燃やす→せり上がる床で天井に付いている刃物に押し付ける

みたいなコンボが可能。

えらい斬新なゲームである。
影牢Ⅱ(PS2)まで出ているようなので、ゲームアーカイブス化したらⅡも購入しようと思う。

おすすめである。
さて、私が毎週楽しみにしていた
週刊少年サンデー「ひめはじけ」
今日で最終話でした。

急展開で終わった所を見るに、
俗にいう打ち切りというやつだったのでしょう。

新連載をあまり読まない私としては、
昔から読んでいる連載+気にいった新連載くらいしか読まないのですが

サンデーでは
 ケンイチ(昔から組、今50巻弱くらい?)
 史上最強の弟子ケンイチ 49 (少年サンデーコミックス)/小学館
¥440
Amazon.co.jp

 ひめはじけ(新連載からのお気に入り、3巻で終了)
ひめはじけ 2 (少年サンデーコミックス)/小学館
¥440
Amazon.co.jp




マガジンは
 はじめの一歩(中学生の頃からの惰性、今100巻以上)
はじめの一歩(101) (講談社コミックス)/講談社
¥440
Amazon.co.jp


 About(新連載からのお気に入り今15巻前後くらい)
A-BOUT!(15) (講談社コミックス)/講談社
¥440
Amazon.co.jp


この位しか楽しみがない。
一歩に至っては惰性だし、ケンイチも飽きてきた感はある。
なので、ひめはじけが終わったことによりサンデーを買うことは無くなるだろう。。
Aboutが終わったらマガジンも買わなくなる。

ジャンプでは、ナルト・トリコ・ワンピースくらいは読んでるけど
新しいのはあんまり面白く無いし、古いのもブリーチとかワンピースとかあんまり読む気がしなくなってきた。

やはり今はモーニング系・ヤングジャンプ系が強いのだろうか。。
・田中シリーズ(高校~さすらい)
・宇宙兄弟
・嘘喰い
この辺りが面白い。


ひめはじけ、第2部に期待したいところだがそれも難しい終わり方をしてしまっている気がする。
残念だな。
ApexTriggerによる実装をしていたら、

Save error: map must have exactly 2 type arguments


なるエラーが出ていた。


訳せば単純に「Mapには2種類の引数が必要だよ!」っていう意味ですよね。
で、Mapに2つの引数てなんだろかと思ってソースを見ていても
Mapのオブジェクトから呼び出しているメソッドはget(Id id)のみ
引数一つでええじゃないですか。

newしてるわけじゃないからコンストラクタ呼び出してるわけでもないし。
と思った所で、元々Listを使おうとしていた所をMapに変えたことを思い出した。




Map<CustomObject__c> oldMap = Trigger.oldMap; ←元々Listで実装してた

List<CustomObject__c> newList = Trigger.new;


そりゃエラーになるよな、と。


Map<Id,CustomObject__c> oldMap = Trigger.oldMap;
List<CustomObject__c> newList = Trigger.new;

と、修正して無事直りました。5分はまった。
せめて何行目でエラーになってるか教えてくれれば一瞬で解決できるのに!

ところで、exactlyって聞くと、普通の三十路男子ならあれ思い出すよね。
弟のやつ。

exactly


SalesforceのApex開発において、積年の夢であったLIMIT / OFFSET の機能が
 Spring'12にてSOQL上に実装されている。

使い方はノーマルなSQLと同様  
 Limit : 取得行の件数
 Offset : とばす行の件数


[SELECT
Id,Name,CustomField__c
FROM
CustomObject__c
WHERE 
CustomField__c =:var
ORDER BY Name LIMIT :limit_var OFFSET :offset_var]



*varは変数
*limit_varは数値
*offset_varも数値

こうすれば、検索結果行の中で
【offset_var+1行目からlimit_var件分のデータ】 という取り方ができる。
limit_varを50件 offset_varを100にしておけば、
101件目~150件目のデータを取得できるわけだ。 

ちなみに、取得できる最大OFFSET行数は2000件の様子。
例えば、VisualforceのIFのtrue/false時に表示させる結果値の中に
javaScriptの記載があって、 ' や " が入っている場合どうしようか、という話。

Javaとかだと、 AA'BB'C を文字列で表現しようと思ったら

String aabbc = "AA\'BB\'C";

の様に、\でエスケープすると思う。


Visualforceだと、上記のエスケープだと文法的には通るけど、表示が

AA\'BB\'C 

とかなって\が残ってしまう。


今回やりたいのは、主にjavaScript記述で文字列を扱う場合なので例えば

onclick="location.href='TestVisualforce';"

をIF分の中に入れたい。

さてさて、色々試してみたのだけど、うまくいかないので、変数で持たせることにした。

<apex:variable var="locationTestVar" value="location.href='TestVisualforce'" />

んで、IF条件でボタンのリンク先を設定した。

<input type="button" 
  value="{!IF(NOT(row.flg),'OK','NG')}" 
  onclick="{!IF(NOT(row.flg), locationTestVar,'')}" 
  class="{!IF(NOT(row.flg),'','btnDisabled')}" />

これで、row.flgがTrueの時は活性OKボタンでクリックで遷移
row.flgがFalseであれば、非活性NGボタンでクリック無視

になる。

エスケープに拘っていたら徹夜コースだったかもしれぬ!
柔軟に生きて行こうと思った。


先日大々的に宣伝した、ひめはじけ、の方ですが。
来週の水曜日発売の週間少年サンデーでの掲載で最終回となるそうです。

ウヒャッ・ホイはいつまでも私の胸の中に。
ウヒャッ・ホイはいつでもあなたのすぐそばに。


さて、漫画好きな私ですが今一番のオススメは週間サンデーの



ひめはじけ 1 (少年サンデーコミックス)/小学館

¥440
Amazon.co.jp

ひめはじけ 2 (少年サンデーコミックス)/小学館

¥440
Amazon.co.jp

こちら、「ひめはじけ」という漫画。

主人公のお姫様は花嫁修業をしに日本に来ていて
心の中に飼っている、【戯れの衝動「 = ウヒャッ・ホイ」】
との高度な心理戦を描いている知的作品である。

私の中にも【ウヒャッ・ホイ】が住んでいるのかもしれない。