Dreamforce 2012に参加したよ - Mini Hack -
せっかく来たんだし、何かネタになるかも...と思って、Mini Hackに参加しました。
※参加、といっても単にMini Hackのお題が書かれたカードを手にすれば良いだけなのですが。。
Mini Hack自体は「笑点」のように(?)、予めお題が用意されていて、そのお題に答えて(コードを書いて)、Force.com Staff にデモしながらチェックしてもらう...という流れでした。
お題は6つあって、こんな感じでした。
- Visualforce + jQuery Mini Hack
- Force.com Mobile Mini Hack
- Force.com Integration Mini Hack
- Force.com Canvas Mini Hack
- Amazon Web Services Mini Hack
- New Relic Mini Hack
景品は
- MacBook Air : 6つ全部をクリアした人で先着1名
- Nexus 7 Tablet : 6つ全部をクリアした人で先着20名
- $50 Amex Gift Card : Force.comに関するお題(上の1.〜4.)のうち2つクリアした人で先着100名
- Amazon Gift Card(だったかな?) : Amazozn のMini Hackを答えた人
- New Relic Tシャツ : New Relic のMini Hackを答えた人
といった感じでした。
Mini Hackゾーンでは、電源&LANケーブルが完備されていて、Mini Hackに取り組んでいる方も、そうでない方も沢山いました。
基本的に、みんな黙々と何かしてるだけ...という感じでしたね。
個人的には、Force.comのお題を2つ(「1.」と「2.」)答えて、幸いにも$50 Amex Gift Card をゲットできました!
スタッフの方に説明するのも、しどろもどろでしたが、OKもらえて良かったですw
ちなみに、ギフトカードは家族へのお土産代として使わせて頂きました。多々感謝!
セッション聞きながらとか、時差ボケと戦ったりするのはちょっと疲れたけど、結果的には良かったです。
※単にGift Cardもらえたから満足しているだけなんですが...
Cloudforce 2012 Japanでも、Mini Hackをやるとかやらないとか...
Developerな方々は、ぜひ取り組んでみても良いのでは?w
Dreamforce 2012に参加したよ - 2日目 -
Dreamforce 2012に参加したよ - 1日目 - - yonet77的な雑記帳の続きで、2日目の内容です。
2日目 (9/19)
参加したセッションはこんな感じでした。
- Business is Social - Marc Benioff and Friends
- Advanced Asynchronous Apex
初日と比較して、いきなりガクッと減りました。。(苦笑)
※後で言い訳を追記します。
Business is Social - Marc Benioff and Friends
前半戦の山場であるBenioffのKeynote!非常に大きな会場にも関わらず、非常に混んでました。
(そのため、Wifiに全く繋がらず...でしたが。)
派手なステージショーとか、大幅な時間延長とか色々ありましたねw
今回は、製品の紹介が色々あったのではないかな?と思います。
- Marketing Cloud
- Work.com
- Chatter Community
- Salesforce Touch ..etc
マーケティングや人事管理の分野にまで展開しているのが印象的でした。
他の人が話してことですが、Salesforceがこれまで買収してきた Rypple や Radian6 をちゃんとSalesforceとつなげて、新しいソリューションとして世に出した、ということがサスガだなーと思いました。
サービスを着実にリリースしていく姿勢は見習わねばなりませぬ。。
あと、色々と分野を広げるのは非常に良いとは思いますが、それならば
- APIコール数
- データストレージ容量
の制約をもっと広げて欲しいかなー...と思った次第です。
いずれ、ERPをSalesforceで実現しようとしたときには、データストレージ容量は、かなりネックになるかと思います。
(中の人、よろしくお願いします...w)
Advanced Asynchronous Apex
非同期プログラミングへのススメ、みたいな話でした。
Apexプログラミングにおいて、同期 vs 非同期の方法としては、それぞれこんな感じになっているよ、と。
■Synchronous Framework:
- Triggers
- VisualForce Controllers
- Apex Web Services
- Testing
■Asynchronous Framework:
- @future
- Batch Apex
- Scheduled Apex
一般的に、非同期プログラミングは難しいとされているけど、使いこなせるようになると実装の自由度が増して、色々できるようになるよ!
という話だったかなー、と。(正直、英語が分からんかったです...)
難しいところとしては、こんなところがポイントじゃないの?という話でした。
- 実行順序
- 非同期処理のエラーハンドリング
- 非同期処理のテストコード
その他、Message Queueの話もありましたが、英語が聞き取れず状態ですみません。。
あと、Batch Apexでは、こんなところにも気をつけなきゃいけないよ、という話だったかと思います。。
- 並列処理じゃないよ
- ロールバックをどうするか?
正直、拙すぎて申し訳ないので、このネタでもう少し自分なりに深堀りしていきたいと思います....
番外(1)
一応、こんなセッションも申し込んでいました。
- Breakouts8: Building a Custom Formula Language on Heroku and Force.com
- Breakouts9: Choosing the Right Integration Strategy for Force.com
ただ、PCや携帯のバッテリーが切れていたことと、自分自身のバッテリーも切れていて、Moscone Center West 3Fの寛ぎスペースにて、充電しておりました。。このスペース、非常にリラックスできて、大変素晴らしいので、ぜひ次のCloudforce 2012 Japan でも取り入れて欲しいスペースです。
ただ、リラックスし過ぎて、意識がちょっと浪漫飛行してしまいました。
旅に出た意識が戻ってきた時には、既にアフターカーニバル状態でしたので、セッションに参加できず、Mini Hackしてました。。
(Mini Hackの話はまた後ほど...)
番外(2)
2日目は、Red Hot Chili Peppers の野外ライブがありました。
- Dreamforce Gala with the Red Hot Chili Peppers
実はレッチリの曲は詳しくない不届きモノなのですが、行くだけ行ってみようと〜。
途中でピザを買って、野外ライブ会場に着いたら、予想以上に人が多くて大変でした。。。
正直、レッチリといったら
くらいしか思いつかない程度で、本当にごめんなさいでした。。
Dreamforce 2012に参加したよ - 1日目 -
突然ですが、Dreamforce2012に参加してきました。
実はSan Franciscoに来るのは10数年ぶりでして、当時の記憶は幾分残ってましたが、泊まったホテルとかは思い出せず。。ちなみに、初めて1人旅したのがSan Franciscoだったので、勝手に感慨深く思ってましたw
それはさておき、Dreamforceは初参加でしたので、色々と圧倒されまくりな4日間でした。(あー疲れた...w)
(忘れないうちに)覚えている限りで所感を残しておこうと思います。
1日目 (9/18)
参加したセッションはこんな感じでした。
- Building Desktop & Mobile HTML5 Applications with Sencha and Force.com
- Apex Design Patterns
- Introduction to Force.com Canvas Apps
- Test Driven Development Fundamentals on Force.com
Building Desktop & Mobile HTML5 Applications with Sencha and Force.com
Javascript UI FrameworkであるSenchaを使って、Force.comと組み合わせて、いかにしてMobileアプリやらWebアプリを作りましょうか?といった話でした。
Salesforce.comでもSencha(というかExtJSといった方が良いかな?)は使われていて、開発者コンソールや、レポートビルダー等で見かけることができます。
その他、おそらくRemoteActionにも使われているのではないでしょうか?
自分もExtJSを使っておりまして...個人的には結構気に入ってます。
※ちなみに、ライセンス形態としては、商用版とオープンソース版の2種類が用意されています。
セッションの内容としては、このために書いた..と思われるブログが2つあって、それを見た方が早そうですのでご紹介します。
- Developing Mobile Applications with Force.com and Sencha Touch - Part 1 | Blog | Sencha
- Developing Mobile Applications with Force.com and Sencha Touch - Part 2 | Blog | Sencha
ちなみに、既に日本語訳までも!w(素晴らしいです)
- Force.comとSencha Touchを使ったモバイルアプリケーション開発 Part1 | 株式会社ゼノフィ
- Force.comとSencha Touchを使ったモバイルアプリケーション開発 Part2 | 株式会社ゼノフィ
個人的には、Part2 で取り上げられている "Step 8: Adjusting the Model and Adding a Data Proxy" が非常にタメになりました。
SalesforceでExtJS4を使ってみようか (1) - yonet77的な雑記帳にて、ExtJSからForce.comにデータを連携するProxyクラスを(頑張って)自作してましたが、"Step8"のやり方を勉強して、現在製作中のアプリをより良い方向に変えていきたいと思います。。
あと、発表して頂いた方に自分が作っている最中のアプリを紹介することができました。(I can't speak English.. なので、どこまで伝わったか疑問ですが。。)
汗かきながら説明している自分がなんだか滑稽でしたが、まぁせっかく来たんだし、と。
日本にもExtJSを使ってForce.com上でアプリ作っているヤツもいるんだゼ!と知らしめる(?)ことができて何よりでした。
Apex Design Patterns
GoFのデザインパターンをApexでやってみたよ!という類いの話です。
紹介したパターンはこんなところでした。
- Singleton
- Strategy
- Decorator
- Facade
- Composite
- Bulk State Transition(これは自作した...?)
ここでは、
- こんなところで問題が起きたよ
- このパターンを使えばいいんじゃない?
- コード書いてやってみよう!
という順番で各パターンを説明してました。
何を隠そう、デザインパターンは詳しくない(おい!)のですが、内容自体は割とよく見かける話でした。個人的にはCompositeパターンの例がなかなか面白かったです。
こんな感じにCompositeパターンを使った演算子の実装を紹介していました。
■実装
public interface Expression { Expression add(Expression expr); Expression set(String name, Boolean value); Boolean evaluate(); } public abstract class Composite implements Expression{ public List<Expression> children {get; private set;} public Composite(){ this.children = new List<Expression>(); } public Expression add(Expression expr){ children.add(expr); return this; } public Expression set(String name, Boolean value){ for(Expression expr : children) expr.set(name,value); return this; } public abstract Boolean evaluate(); public Boolean hasChildren{get{ return !children.isEmpty(); } } public class AndComposite extends Composite{ public override Boolean evaluate(){ for(Expression expr : children) if(!expr.evaluate()) return false; return true; } } public class OrComposite extends Composite{ public override Boolean evaluate(){ for(Expression expr : children) if(expr.evaluate()) return true; return false; } } public class Variable implements Expression{ public String name {get;private set;} public Boolean value {get;private set;} public Variable(String name){ this.name = name; } public Expression add(Expression expr){ return this; } public Expression set(String name, Boolean value){ if(this.name != null && this.name.equalsIgnoreCase(name)) this.value = value; return this; } public Boolean evaluate(){ return value; } }
■使用例:
//1 OR (2 AND 3) Expression expr = (new OrComposite()) .add(new Variable('1')) .add((new AndComposite()) .add(new Variable('2')) .add(new Variable('3')) ) .set('1',false) .set('2',true) .set('3',false); System.debug(expr.evaluate()); //FALSE OR (TRUE AND FALSE) => FALSE expr.set('3',true); System.debug(expr.evaluate()); //FALSE OR (TRUE AND TRUE) => TRUE
なるほどねーと思いました。そもそもの話で、GoFパターンをちゃんと理解しておかないとなーと常日頃思ってますので、引き続き精進しようと思います。。。
Introduction to Force.com Canvas Apps
このDreamforceで何度もデモを見させられたCanvas Appsの紹介でした。
New at Dreamforce 12: Force.com Canvasが参考になるのではないでしょうか。
すごーくざっくり言うと、"FacebookアプリのForce.com版"といった感じでしょうか。。
Canvasアプリを新たに作成するときには、テンプレートが用意されているので、それに従って作れば「あっ!」という間にHeroku上にCanvasアプリが作成されます。
既にあるものをForce.comに組み込むこともできるみたいです。
ここらへんの情報は色々出回っているので、既にご存知かと思いますが、最後に大事なポイントを。
Test Driven Development Fundamentals on Force.com
TDDの基礎...という感じでした。"on Force.com"とありますが、別にForce.comに限った話ではなく、割と一般的な話でした。とはいっても、非常に大事なテーマなので、どっかの誰かに聞かせてやりたい気持ちで一杯です。
大きなポイントとしては、
といった"黄金の回転"を回し続けていくことが大事なんだよ、ということを語ってくれていました。
セッションでは、この回転を途中まで紹介して、残りの回転は各自(以下を参考にして)やってみよう!という締めでした。
knthornt/Dreamforce-2012---TDD-Session · GitHub
最後に、質問セッションにて「TDDの中で、リファクタする最も良いタイミングはどう思いますか?」的な質問を投げてみました。
回答としては(多分)「テストがGreenになった後ならいつでもいいと思うし、自分で『このコード気持ち悪いな』と思ったらリファクタすべきじゃないかな」といった感じでした。(英語を全て聞き取れなかった... orz)
とにかく
マイクを手に取って、英語で質問する
ということを経験してみたかったので、内容はさておき、緊張感Maxの状態でやり遂げられて良かった...と思います。(すげー汗かきました...)
とまぁ、1日目としてはこんな感じでした。2日目以降はそのうち....
インストールしたパッケージをカスタマイズする上でハマったこと
Force.com上で開発していく上で、パッケージをカスタマイズしていくことも多々あるのではないでしょうか?
(当方、glovia OrderManagementをカスタマイズすることが多いですが...)
そんなパッケージのカスタマイズの中で、思わぬ出来事に遭遇しましたのでご紹介しようかと。
結論から先に言うと...
ということです。
※予期せぬ例外が発生することもあるので避けるべき、ということです。
具体例
準備
今回発生したケースの前提です。
- パッケージ管理内で、「Status__c」というAPI名がテキスト型として定義されている(実際には、xxx__Status__c というAPI名になります)
- 上記のオブジェクトにカスタム項目として「Status__c」を選択リスト型として追加する
パッケージ内のオブジェクトとしては、こんな項目が定義されたようになります。
- xxx__Status__c(テキスト型)
- Status__c(選択リスト型)
ここで、さらに入力規則 or 項目自動更新で、「Status__c」を数式に使ってみます。例えば
IF( TEXT ( Status__c ) = 'xxxx', 100, 0);
という感じの数式を埋め込んでみます。
※ココでは、新たに追加した選択リスト型のStatus__cを使う感じです。
例外発生!
項目自動更新が実行されると、こんなエラーが発生するようになりました。
このレコードを保存するとき、ワークフローまたは承認プロセスの項目自動更新によるエラーが発生しました。(中略)
関数 'TEXT()' のパラメータが間違っています。期待数字, 日付, DateTime, 選択リスト、受信テキスト
え?
関数 TEXT() は選択リスト型で使用しているのに、なぜこんなエラーがッ...!?
大まかに書くと、こんな感じの現象でしょうか。。
原因は?
管理パッケージ内のトリガが起動したとき、それに併せて入力規則(パッケージ管理外で定義された入力規則も含めて)が評価されると思います。
入力規則を評価する際に、パッケージ内のトリガで発生してきた場合にはパッケージ内の項目を優先的に参照するのではないでしょうか?
(ただ、標準のSalesforce画面からデータ操作した場合、エラーなく処理されることもあったりと良く分からない・・ところもあります。すみません。。。)
回避策は?
結局のところ、
パッケージ内で定義されているAPI名で項目を追加するのは避けましょう
に尽きると思います。
今回の例でいうと、
- パッケージ内では Status__c(テキスト)で定義されている。(外部からは xxx__Status__c)
- パッケージ外で Status__c(選択リスト)で定義する
ということは止めましょう、という話ですね。
ただ、上記の現象とは別に、類似した名称で定義するのは混乱の火種になりかねないので、名前付けは熟考しましょう、ということですね。
※当たり前すぎる話でオチもないですが・・(苦笑)
最後に
一応、Salesforceに問い合わせたところ、既知の不具合のようで将来的なリリースにて修正予定とのことでした。(時期は未定)
そんなわけで、しばらくは
類似したAPI名を使うのは避ける
という回避策で逃げましょう。
今回はパッケージをカスタマイズしていく上でハマったお話でした。
ではでは〜
Glovia Order Management (on Salesforce) を使ってみようか (10)
久々のgOMネタでも更新します。
本日のネタは開発者よりのネタです。
gOMをカスタマイズするならコレだけは知っとけ
的なネタです。
gOMで用意している機能をApexから利用する
gOMには様々な機能が定義されており、色んなところで使われてます。ざっと見渡しても、こんな機能が思い浮かぶのではないでしょうか?
- 受注残消し込み(いわゆる在庫引当)
- Quick梱包
- Quick出荷
- 出荷確認
- 請求書作成 ....etc
gOMをカスタマイズしながらも、gOM内で想定しているデータの流れに乗っかっていくには、これらの機能をApexから利用することは避けられ...ないでしょう。
というか、自前で作るのは超面倒ですし、gOMのアップグレードに伴って、いちいち修正していくのは...これまた現実的ではありません。。
というわけで、gOMで定義されている機能をApexから呼び出す方法についてご紹介しようと思います!gOMをカスタマイズしていく上で、知っておくと色々と便利かと思います(たぶん)。
※1 JoJo風に言えば、この辺りで、「ドギャーン!」とか擬態音を入れたいところですが、控えます。(ゴゴゴゴゴ..!!)
※2 このあたりはGlovia社の方にもご協力頂きました。多々感謝です!
gOMで定義している機能の利用方法
受注残消し込み
gii.inventoryReserve.clearBackorder(LIST<Id> inventoryReserveId);
- 第1引数: 処理対象となる在庫予約のIdのList
在庫予約
gii.inventoryReserve.reservation(LIST<Id> salesOrderLineId);
- 第1引数: 処理対象となる販売オーダラインのIdのList
Quick梱包
gii.inventoryPack.createPackList(LIST<Id> selectedRecordIds, String groupBy, String IvStatus, String calledFrom);
- 第1引数: 処理対象となる在庫予約のIdのList
- 第2引数: 集約単位(販売オーダ毎の場合、'SalesOrder' と指定 それ以外は知らない...)
- 第3引数: 'Reserved' を指定 それ以外は知らない...
- 第4引数: ''を指定 本来はコール元の画面等を指定するみたいだけど、ブランクでも可
梱包指示確認
gii.inventoryPack.confirmPackList(LIST<Id> selectedRecordIds);
- 第1引数: 処理対象となる梱包指示のIdのList
梱包指示キャンセル
gii.Cancellation.cancelPacklist(SET<Id> PackListId, String calledFrom);
- 第1引数: 処理対象となる梱包指示のIdのSet
- 第2引数: ''を指定 本来はコール元の画面等を指定するみたいだけど、ブランクでも可
出荷確認
gii.packListShipment.shipPackList(LIST<Id> selectedRecordIds, String groupByAndShippedDate, String calledFrom);
- 第1引数: 処理対象となる出荷指示のIdのList
- 第2引数: 集約単位(販売オーダ)と日付(出荷日)を指定 例)'SalesOrder;2012-08-20'
- 第3引数: ''を指定 本来はコール元の画面等を指定するみたいだけど、ブランクでも可
Quick出荷
gii.inventoryReserve.quickShip(LIST<Id> selectedRecordIds, String groupByandShippedDate);
- 第1引数: 処理対象となる在庫予約のIdのList
- 第2引数: 集約単位(販売オーダ)と日付(出荷日)を指定 例)'SalesOrder;2012-08-20'
請求書作成
gii.OrderInvoicing.createInvoice(LIST selectedRecordIds, String groupByandInvoiceDate);
- 第1引数: 処理対象となる請求書作成準備のIdのList
- 第2引数: 集約単位(販売オーダ or 取引先)と日付(請求日)を指定 例)'SalesOrder;2012-08-20', 'Account;2012-08-15'
補足です
上記に書いた内容は、自分がよく使っていた範囲の内容となります。パッと見た感じでは、「出庫」に関する機能もApexから利用できると思います。
調べた方法に関しては...泥臭いですが、gOMをインストールした環境で、Apexクラスを参照して自分で試してみたりしました。もちろん中身は参照できないので、名前だけで判断することになりますが。。(苦笑)
例えば、こんなところから「くさいなー」という雰囲気を感じたらテストコード書いて試してみたり...ですね。
そこから推測したりしながら、適当に試してみる感じです。。
※もちろん、この他にGlovia社に問い合わせることもしました。
最後に
ちなみに、先日Glovia社に伺ったところ、gOM内で定義している機能はAPIとして公開しようと考えているそうです。(時期までは分かりませんが)
そんなわけで、それが公開されたら、このエントリも不要となりますね。。(苦笑)
まぁ、そんな期間限定的なエントリということでした。
それではより楽しい(?)gOMカスタマイズを!
Force.com Developer Group Japan Meetup#2 に参加しました
気を抜いてしまった模様で、あっという間に8月です。
"8月病"にかからないよう(?)気をつけたいところですね。
さて、Force.com Developer Group JP Meetup#2に参加してきました。
今回はデジタルコーストさんにご協力頂いて、STARTUP Base Campにて開催しました!
このオフィスは非常にキレイで色々と便利なので、普段から使えるのは羨ましい限りです(笑)
今回も80人募集にて、実際には5,60人くらい来て頂けたんじゃないでしょうか。有り難いことです。
Force.comはまだまだ注目されているのではないか?と再確認できて良かったです。
発表内容
今回はGoogle Docsで資料を作りました。準備不足感がハンパなくて色々と反省です。。
内容自体は入れ子集合モデルをForce.com上で実現してみたよ、という内容です。
古くから考えられたものですので、内容自体は枯れてるけど、割とマニアックな概念かと思います。そして、Force.comの上でも十分実現できるよ、という紹介でした。
本来であれば、自己結合など、通常のSQLが書けるプラットフォームで実装した方が色々と便利なことも多いんですが、Force.com上でどこまでできるのか?という可能性を垣間見ることができたんじゃないでしょうか?
これからも引き続き、Force.comでの可能性について色々と検証していきたいと思います。
(ただし気が向いたときに限る...と思います)
そして、引き続き、次回は未定です。。
Force.com Developer Group Japan Meetup#1 に参加しました
Force.com Developer Group JP Meetup#1に参加してきました。
定員65名のところ、大半の方々に参加頂いて大変有り難く思っています。
そして、この人数を前にして最初の挨拶で30分程の枠を割り当てられるというのも人生初でした....
大変緊張して、途中妙なことを話したりしてたような気がしますし、参加者の方々の表情を確認するような余裕もありませんでしたが、とても良い経験をさせてもらいました!
もう少し場慣れしたりする必要があるなーと痛感しました。
あと、LTの発表内容が期待以上でスゴかった...自分の勉強不足を痛感しました。。(苦笑)
当日の様子は、ココから確認できます。ご参考までに...
- Force.com Developer Group JP Meetup #1 - Togetter
@a_kuratani: [URL] URL Developers Meetup #1 の個人的まとめ URL
発表内容
"Force.com"らしく(?)、このためにDeveloper Editionを1つ作成して、Visualforce Pageで作成しました。多分もうやらない。(苦笑)
Force.com Developer Group Japanについて...
僕が初回の挨拶で言いたかったことは概ね(一応)伝えられたかと思います。一番の思いとしては、
開発者が「会社」という枠組みから解放されて「いち開発者」として気兼ねなく参加する"Force.com Developer"コミュニティが欲しかった
ということに尽きるかな?と今は思っています。
今まではSalesforce.com主体でDevleoper向けのイベント等ありましたが、そこにはどうしても「企業に所属する開発者として...」という色が感じられました。
確かに自分も、とある企業に所属していますし、所属している会社の知名度が上がって仕事が増えるようになるために、そういったイベントでも活動していく必要はあるかと思います。
ただ、それとは別に開発者として、純粋にスキルを磨きたい、という思いも当然あるわけで、そういった思いをぶつけるコミュニティもあったらいいなぁ...という思いがたまたま実現できた、ということになります。
そんなわけで、"Force.com Developer"コミュニティを一緒に作ろう!と賛同してくれたメンバーには非常に感謝しております。
一応、"Force.com"というキーワードを残しつつ技術的に面白そうなネタを追っかけていきたいなーと思います。
※別に"Force.com"に限定しなくても、別のネタを"Force.com"ではどうやったら適用できるか!?なんてネタもアリだと思います。
そんな活動を地道に続けながら、Force.com Developer User Groupsにも掲載されるようになったり、他の勉強会で「"Force.com"の開発やってます....」と堂々と言えるようになったり(笑)したらいーなー...と思います。
千里の道も一歩から
という言葉もありますし、地道に途切れることなく(そして過度な無理もせずに)活動を続けて行きたいと思います。