Tuesday, November 25, 2014

[Salesforce / Lightning] Loading scripts with RequireJS



UPDATE

Due to the introduction of the ltng:require, this post is no more a valid solution. Refer to the official Lightning documentation.

The following is a post that summarizes this blog post's solution (if you are not a TLDR; reader you will find there all my trials and errors).

Dreamforce 2014 came out with new awesome features on the Salesfoce platform: one of the most interesting has been the introduction of the new Lightning framework for fast development of reusable components.
In addition to the (still in pilot) Lightning App Builder (an amazing drag & drop tool for easy creation of apps), it's not hard to figure out how far this new technology will lead the Force.com platform.

The main reason you want to develop a new Lightning component is the fact that you can compose components like a puzzle making them communicating using events: read the official development guide for more details on how to build your first lightning component.

One of the things you'll be doing while developing new components, is using external libraries to give more and more features to your applications.
You'll face the following constraints:
  • You can only get external libraries loaded from a static resource
  • You cannot use the {!$Resource.resourceName} expression because we are not inside a VisualForce page, so you have to simply refer to "/resource/[resourceName]" in your <script> tags

When loading more than one external scripts, sometimes happens that the order of loading is not the expected one (even if you have inserted the script tags in the right order).

You could use RequireJS library to overcome this problem (being sure that he'll be responsible for loading libraries in the correct order).

But the question is: who is responsible to load RequireJS script?

Who will be executing the RequireJS loading code ONLY AFTER the library has been loaded?

Trying to get the right answer (see more details on the "fail" steps here and the community thread that brought me to the solution), I came to the following solution.

The solution is simple (to ease its understanding): you can improve it to add more features (e.g. style sheets loading) and to make a component out of it.

This is the main code (all the code has been packaged into this GitHub repository):

BlogRequireJSDinamic.app

<aura:application>
        <aura:handler event="forcelogic2:BlogRequireJSEvent" action="{!c.initJS}"/>
        <aura:registerEvent type="forcelogic2:BlogRequireJSEvent" name="requireJSEvent"/>
        <aura:handler name="init" value="{!this}" action="{!c.doInit}" />
        <div id="afterLoad">Old value</div>
    </aura:application>

BlogRequireJSDinamicController.app

({
    /*
        Sets up the RequireJS library (async load)
    */
    doInit : function(component, event, helper){
        
        if (typeof require !== "undefined") {
            var evt = $A.get("e.forcelogic2:BlogRequireJSEvent");
            evt.fire();
        } else {
            var head = document.getElementsByTagName('head')[0];
            var script = document.createElement('script');
            
            script.src = "/resource/RequireJS"; 
            script.type = 'text/javascript';
            script.key = "/resource/RequireJS"; 
            script.helper = this;
            script.id = "script_" + component.getGlobalId();
            var hlp = helper;
            script.onload = function scriptLoaded(){
                var evt = $A.get("e.forcelogic2:BlogRequireJSEvent");
                evt.fire();
            };
            head.appendChild(script);
        }
    },
    
    initJS : function(component, event, helper){
        require.config({
            paths: {
                "jquery": "/resource/BlogScripts/jquery.min.js?",
                "bootstrap": "/resource/BlogScripts/boostrap.min.js?"
            }
        });
        console.log("RequiresJS has been loaded? "+(require !== "undefined"));
        //loading libraries sequentially
        require(["jquery"], function($) {
            console.log("jQuery has been loaded? "+($ !== "undefined"));
            require(["bootstrap"], function(bootstrap) {
                console.log("bootstrap has been loaded? "+(bootstrap !== "undefined"));

                $A.run(function(){
                    //do whatever GUI initialization you want
                    //in the aura context
                    $("#afterLoad").html("VALUE CHANGED!!!");
                });
                
            });//require end
        });//require end
    }
})

This is what you'll get in the developer console of your browser:
RequiresJS has been loaded? true
    jQuery has been loaded? true
    bootstrap has been loaded? true 

And you will see "Old value" string replace with "VALUE CHANGED!!!" in the page body.

What has happened?

When the app loads (init event) the doInit function tries to understand if the RequireJS library has been loaded.
If so fires a BlogRequireJSEvent event.
If not yet loaded, dynamically creates a <script> tag with the path to RequireJS, binding an onload handler, which in fact will inform that the library has been loaded, using the same event.

The same app is also an handler for the BlogRequireJSEvent event trhough the initJS function: it will load sequentially jQuery and Bootstrap libraries: this way you are pretty sure libraries will be loaded in the correct order.

The next step is to make a component out of this app so you can use a RequireJS loader component in all your apps and make all your components handling the BlogRequireJSEvent event.

Thursday, November 20, 2014

TCO14 (My) Chronicles

Top Coder Open 2014 has passed and again has been awesome.
The coolest things? Absolutely the developer talks, made by important and influent people from the tech world.
The second cool thing is that I had the chance to blog the whole event and also that I got the 3rd place in the Super Awesome Cloud Mashaton.

The followings are all the posts (in chronological order) I wrote for the TCO14 Blog in the past 3 days.
Enjoy it!

Registration has started!

Short story long: 24 hours trip, 9 hours time zone delay, 3 flights, 1 run at New York airport not to lose my flight connection, but finally I'm here!

I knew it would have been awesome, but it is more that I thought!



Lot of awesome boots, great sponsors, and the whole world ready to compete!


What are you waiting for?
Registration has started, come here to enjoy Top Coder Open 2014!

Topcoder Open Booths

I needed 3 beers to get the right confidence with English (hey children out there, don't do this at home!) but I managed to talk to all the company's booths at the 2014 Topcoder Open I could , and I can say it's been awesome!

In alphabetical order:
  • Appirio: is it necessary to talk about it? I talked the whole time with "Appirians" so I don't need to tell you how awesome this booth was!
  • Drumpants: as a drummer, I've been attracted to this booth like bears on honey. It is a wearable device to make your body have the beat! Try it and you will love it!
  • Facebook: like last year, this booth is full of awesome #swag, pens, note books, stickers, frisbees, a chance to get into this #amazing company!
  • Google: again, do they need a presentation? Come to this booth to see an amazing Chromecast broadcasted game, have a chance to talk to some Google guys and grab some cool swag!
  • IBM Bluemix: they have a cool booth (and cool gadgets). It is actually something you want to explore, a big sets of useful tool for developing advanced and ready for production apps, using advanced features (such as Watson)...check it out!
  • IDEA market: I've been attracted by this booth because a sign said "IDEA Market is a curated crowd-sourced marketplace for ideas" and "START YOUR OWN COMPANY TODAY!"...well these are words I constantly think in my head. They simply try to make your ideas come to life searching for investors that could fund your thoughts...isn't it awesome?
  • HP Idol On Demand: they had developed a bunch of APIs to give your app more and more features (sentiment analysis, language recognition, categorization, ...), and I had a cool chance to have a talk with the developers that make these services up and running. Come here to have a great talk!
  • HP Sprout: I've been attracted by the fact that they presented something to put my hands on. HP Sprout is a creative workstation with which you can do a lot of cool stuff (3D modeling, realtime graphical design, multitouch support, ...); it is also equipped with developer APIs to enhance its features, watch its demos to see this in action!
  • Nymi: I had a chance to see this technology before Top Coder Open, and I found it really fascinating and "romantic": it is a device (and a set of APIs) used to authenticate you using your heart beat. You will log in with your heart and no more with a cold keyboard :) BTW have a talk with the guys and the booth and let them inspire you!
  • Two Sigma: don't you know 2 Sigma's mission? You better know, they are a technology company that applies a rigorous, scientific method-based approach to investment management, they are focused on invest in the best ideas out there, so why not talk to them? (They also have awesome gadgets!)
  • 3DSystems: their booth is really attractive. They have an oculus rift to play their game (sort of Jenga) using a "force-feedback" pen: if you participate to their tournament, you can win a ready to use 3D printer...is it sufficient to visit their booth? If not, they develop cool stuff based on 3D scanning and reproduction of objects / parts. Come to their booths to know more!
Again...if you haven't come yet, we are waiting to share this awesomeness with you!


Mashathon competitors warriors: let the fight begin!

Are you brave enough to spin the wheel?

I actually was and with me 61 other mighty warriors.

These were the APIs you could "select" from (actually it was a wheel of fortune...so APIs choose you!):
  • Amazon
  • Facebook
  • Google
  • HP Idol on Demand
  • IBM BlueMix
  • Microsoft
  • Nymi
  • Salesforce


And this is the final list of participants to the competition, that ends tomorrow November 18th at 9 am.
Handle APIs

1
adinici Facebook, Salesforce, Pick Any

2
afamefunaudoba Google, Amazon, Salesforce

3
akinwale Facebook, Microsoft, Pick Any

4
alazyrabbit Salesforce, HP IDOL OnDemand, Bionym

5
alexei.bordei Microsoft, Bionym, Pick Any

6
ambatvinay IBM Bluemix, Bionym, Pick Any

7
amethystlei
wintokk
Google, Amazon, Bionym

8
andkon Amazon, IBM Bluemix, Bionym

9
avarada Google, Salesforce, Pick Any

10
Battlecruiser Google, HP IDOL OnDemand, IBM Bluemix

11
bharathMG
sharmibala92
Amazon, Salesforce, Pick Any

12
caLLMEKATOOTIE Amazon, HP IDOL OnDemand, Bionym

13
cjlittle
jasonwiener
Google, HP IDOL OnDemand, Pick Any

14
cyberjag Google, Amazon, Salesforce

15
d_jash Amazon, IBM Bluemix, Pick Any

16
dbradleyfl Amazon, HP IDOL OnDemand, IBM Bluemix

17
defatigue Facebook, Salesforce, HP IDOL OnDemand

18
degupta Salesforce, Microsoft, IBM Bluemix

19
djiofack007 Google, Salesforce, Microsoft

20
elkhawajah Facebook, HP IDOL OnDemand, Pick Any

21
FMX Facebook, Amazon, Microsoft

22
forcelogic Google, IBM Bluemix, Pick Any

23
gabrielgrant Salesforce, IBM Bluemix, Bionym

24
gauravs23 Google, Amazon, Pick Any

25
gkowligi Facebook, Amazon, Pick Any

26
harish_r88 Google, Salesforce, Pick Any

27
hi4sandy
sidthekid
Facebook, Google, Microsoft

28
igorbarinov Facebook, Microsoft, IBM Bluemix

29
james.le Facebook, Amazon, Salesforce

30
KadynCBR Google, Microsoft, IBM Bluemix

31
kennethFax Amazon, Microsoft, IBM Bluemix

32
leejefon
quattrozhou
HP IDOL OnDemand, IBM Bluemix, Pick Any

33
makarochkin
urname
Salesforce, Microsoft, Bionym

34
myung Google, Salesforce, IBM Bluemix

35
nf_happy
lunana
Google, Amazon, Microsoft

36
nickdr Facebook, IBM Bluemix, Pick Any

37
notpad Facebook, Google, Salesforce

38
peda Pola Google, Microsoft, Pick Any

39
pglotov Google, Amazon, Microsoft

40
phyllis Google, Amazon, Salesforce

41
ralphFurmaniak Facebook, Bionym, Pick Any

42

rewinning
nicks1087
mmconrad
Facebook, Google, Bionym

43
rogueleaderr Google, Amazon, IBM Bluemix

44
rriazi Amazon, HP IDOL OnDemand, Microsoft

45
selvaa89 Facebook, Google, HP IDOL OnDemand

46
shadyElyaski
lukedayze
Facebook, Google, IBM Bluemix

47
stephenhan Facebook, Salesforce, Bionym

48
supercharger Salesforce, HP IDOL OnDemand, Microsoft

49
talesforce Facebook, Google, Salesforce

50
terjen Google, IBM Bluemix, Bionym

51
vicho Amazon, Salesforce, HP IDOL OnDemand

52
williscool
Salesforce, HP IDOL OnDemand, IBM Bluemix

53
yedtoss Google, Amazon, Bionym
So good luck to you all (and also to me), be prepared to watch awesome brand new applications fighting against each other to achieve the top of the list!

Developer talks series: Cathy Lewis [CMO @ 3D Systems]

In the first morning talk we had the pleasure to meet Cathy Lewis, CMO at 3D Systems.



She had a great talk about 3D printing systems, from their early adoption (about 32 year ago, when I was born!) to current days.

Good thing about 3D printing systems is that you actually build things only when necessary (think of their use in the International Space Station where bringing all replacement parts could be way too expensive), they use only the right amount matter needed to create that reproduction, they reduce the dimensions of production lines, thus increasing production efficiency.

Today the constantly adoption by companies of such systems allow to break creativity barriers, making easier for developers / designers to touch with hands what they are designing.

Current 3D printing technology is evolving day by day, from healthcare (create body part replacements) to food (that's right, they are printing food!! from delicious candies to astronauts space food); recently they have developed a way to print using metals, creating a more durable and reliable product.

One of the coolest applications is the idea that in the near future, when traveling, you won't need to bring things with you because they will be ready (e.g. in your hotel room) "freshly printed" for your own use!

Lastly they are developing a haptic technologies to actually feel things before they are printed!

They are also hosting a series a topcoder challenges at touch.topcoder.com: come over to discover this powerful technology!

Developer talk series: Matt Thompson [General Manager of Microsoft's Developer Evangelism and Startup Efforts]

First evening talk is with Matt Thompson, General Manager of Microsoft's Developer Evangelism and Startup Efforts.



The first topic in this awesome talk was about last Microsoft's announcement of open sourcing .NET platform to be available for all platforms.
This follows the philosophy of Matt's group, that is allowing developers doing what they do better: hacking!

He distinguishes two kind of tech people in the market:
  • Consumers: they influence the market with their way to use technology
  • Developers: they have the ability to build things

We actually want to be part of the second group, he says, the most important for the market actually!

Don't think of the word "hacker" as something necessarily bad: "Hacking is wanting to build", and when building there is also a great tendence toward learning, and when they learn, they also share their skills "open sourcing" them.
That's why we have to make programming a crucial part of every child study path, so students could be active participants in the global economy and not just passive consumers.

This has been a really inspiring talk, made by a man who works for one of the colossal IT companies out there, that shows how big companies not necessarly tends to sit down at certain age, but still try to improve themselves and innovate.




Developer talks series: Anthony Stevens [Solution Architect for the IBM Watson Ecosystem]

The second speaker of this morning is Anthony Stevens, Solution Architect for the Watson Ecosystem.



He told the story of IBM Watson echosystem starting from the famous Kasparov vs Deep Blue chess match till the recent Jeopardy! win of Watson (1st price of 1 Million dollars, see details here).

It is all about cognitive systems that can extract information from large amount of data, create their own categorization and are capable of providing the best answer.

Humans are part of the equation: cognitive systems can mimic human reasoning process with image recognition and language, evaluate data and provide responses, learn and adapt to new information. From last century computers are evolving by being at first tools, then assistants, then consultant and finally peer!

Watson is about creating the building blocks for cognitive science application (pretty much like Legos are created by single distinct parts that connect each other).

That's why it perfectly fits into IBM BlueMix PAAS (Platform As A Service), a sets (really big set) of built-in tools (for whatever programming language you love) that helps developers integrate Watson and other IBM services with their apps, without worrying about all the build/deploy phase of the code, leaving the freedom to concentrate on what you like, the code.


Developer talks series: Gayle Laakman McDowell [Programmer, Founder, Author, Consultant, Speaker]

Closing the morning a great speach by Gayle Laakman McDowell, Programmer, Founder, Author, Consultant, Speaker.



Gayle took an awesome speech about how to face an Algorithm interview.

Algorithm questions test your ability to make trade-offs, they highlight your capability to work in team, Solving a problem together.

She listed some of the most important steps to consider when facing such an interview:
  • Code on a paper, this way you make less errors (no synthax highlighter, no autom complete, slow debugging)
  • Always talk while thinking: this way the interviewer can follow your stream of thoughts. Don't stay in silence!
  • Listen to what is in the problem (make sure you know all the details) and ask questions, so you don't lose anything
  • When executing your code test it with generic data set and not special cases (e.g. if confronting arrays, avoid using same size arrays)
  • Testing is really important: use test cases and try to test the majority of tricky cases that could make your code crash (null values, strangely shaped date, ...)
  • Write beautiful code (this is the most difficult suggestion for me)
She leave us with one important quote: "Be a great engineer".

Developer talks series: Mike Hines [Developer Evangelist, Amazon Appstore]

In this Tuesday morning, let's meet Mike Hines, Developer Evangelist @ Amazon.



I've been really amazed by Mike's talk; he is what an evangelist should be. He transmits his passion for what he does and make you want to do the same things!

The main focus of this awesome speech was "How to make money with your app?", and his first suggestion for us programmers has been "Don't forget to make money, please!".

Mike presented a series of suggestions of how to increase app revenues, showing why the top 50 apps on the Amazon App Store makes more money than the rest of the apps.

It is not all about the quality of the game: there are great games on the store that don't make much money, while other games, undoubtedly less cool, makes way more revenues!

This happens because of different factors.

Mike demonstrates, showing graphics, pie charts, numbers, and percentages, that on average basis 80% of the users that download an app become inactive users after just one week. Seeing this we could argue that it is better to speed up in app purchases on the first week of activity.

It turns out that this is not what it actually is needed to make a high revenue app: users on a span of 30 days spend more money than the first 24 hours, so the less users we have active the better service we have to give them to increase their loyalty to the app and make them purchase more and better.

Here is a list of suggestions I grabbed during the talk.
  • Tutorials are useful to instruct users how to buy things, but in app purchase should not be a mandatory action to have success in the game (top apps maintain their non-paying users!)
  • Generate post purchase tutorials to make user aware of what they bought: this is important because if user is not happy with their purchase, they won't buy anymore!
  • Add new items on app regularly, differentiate your offering but not too much (you can confuse users)
  • Be clear about value and benefits of purchased items
  • Reduce barriers to frequent use (if user does a thing frequently, make it easy to go straight to the needs: e.g. level selection, difficulty selection)
  • Make the status of the game available on all user devices (es. level, purchases, ...): it is frustrating to switch devices and lose all achievements
  • Tune the game difficulty: if it's too hard, users leaves, if it's too easy, users gets bored.
    Use "A|B testing": tune the game variables to keep people in the game by understanding the right tuning of inner behavioral variables of the game (e.g. number of enemies, speed of vehicles, buttons labels, ....)
  • Adopt social engagement: this could increase users sense of competition, that is more play and more purchases
  • Make purchasing easy: this could lead to an increase in revenue by 75%
  • Market your app to all customers and be in all the stores: if you have spent money to make a game, make it available in all market places
Top developers know all these "secrets" and how to handle them, thus selling top apps.

Developer talks series: Scott Jelinsky [Principal Research Scientist at Pfizer]

I present you Scott Jelinsky, Principal Research Scientist at Pfizer.



As you may know, Pfeizer is one of the world's premier biopharmaceutical company. Why would the company be interested in the topcoder community?

Scott shows how topcoder has been involved in the past year in several challenges to improve human genome analysis.

The community has been called upon to improve the algorithms behind this kind of analysis.

They posted the challenges with the following aims:
  • Increase computational speed
  • Maintain accuracy
  • filtering low prob markers
  • create reasonable sized data sets
They followed then the following steps to improve different pieces of the calculation flow:
  1. Improve algorithm speed: this leads to an incredible 14x improvement
  2. When the algorithm was no more a problem, they concentrated with data access to big data sets, achieving  2x improvement
  3. Then they tried the multithread path and achieve an important 2.2x increase in speed
  4. Then coarse-grained parallelization for further parallelization for additional speedup and division of large dataset across compute nodes to raise memory capacity with a 5x improvement
The whole work lead to an incredible increase of the computational speed by 1200x, from 10 hours to nearly 28 seconds!

The results became even more evident when comparing the analysis time for phenotypes: analyzing 203 phenotypes needed about 95 days to be completed, while now it takes only 10 minutes, an incredible 1300x improvement!

These numbers makes absolutely clear of much topcoder has helped Pfizer into enhancing their software analysis skills.

Developer talks series: Samantha Ready [Developer Evangelist at Salesforce.com]

I've already had a pleasure to interview Samantha in the past weeks for the TCO14 blog.

She joined 2014 Topcoder Open with a tech talk about Heroku and its integration with Salesforce.



Samantha showed how simple it is putting an application on production with Heroku: install Heroku toolbelt, push your git repo into an Heroku app, and instantly Heroku acknowledges what kind of app it is and runs the right environment for it to be ran. The only thing you have to think of is your code and how much you want to scale your app (the only limit is your wallet :), but you can still use Heroku for free! ).

One of the features she used is the Heroku Button: with an Heroku button you simply click on a button to make an app working in few seconds. All you have to do is sit down on your chair and wait for the green light!

The demo application was used to handle a list of personal contacts (no built-in integration with external services) using NodeJS server side and AngularJS on client side.

In few minutes Samantha added integration with Salesfoce (using forceng.js, a set of services for integrating AngularJS apps with the Force.com platform) allowing her app to communicate directly with her Salesforce ORG to make it showing her contacts on the CRM and easily (and smoothly) view / edit them with a single tap!

In half an hour she had her app up and running and easily communicating with her Saleforce ORG!

Awesome!

Last thing to say, Samantha has a really swagged-out laptop (envy in my words).



Developer talks series: Robert Severn [Head of Development at HP Aurasma]

If I were the judge of this talk I would give A+++.

Why?

At the beginning of the presentation a 3D "augmented reality" Ironman showed up in the stage with Robert Severn (Head of Development at HP Aurasma)...simply awesome!

I was too amazed to take any pic, but believe me it was amazing!

Robert briefly presented Aurasma, a cool SDK for augmented reality (desktop and mobile). It is available as an SDK or as a free app for iOS and Android mobile devices. Its image recognition technology uses the camera to recognize real images and then overlay awesome things over them in the form of animations, videos, 3D models, and web pages.
Its no mystery that teachers are among the most active group using the platform.

Then it was HP Idol OnDemand time: a cool set of RESTful APIs free and ready to use (I've actively developed on it, believe they are awesome) for processing unstructured data to solve some of the toughest information challenges. These APIs can compute analysis with large data sets providing categorization of contents, indexing, fast search, image recognition, and other useful features (jump here to create your free account).

The topcoder community has worked a lot in the past months on integrating HP Idol OnDemand with diverse applications (see the track here).

Finally I want you to have a look at Sprout technology: an immersive experience for creativity!

Watch this video for more details!

Girls in STEM @TCO14

"Where are all the girls?" I'm usually asked this when attending my university computer science courses, in fact the guys used to heavily outnumber the girls. Why this discrepancy?

Today's panel shown the following "girls in STEM" and Glenn Weinstein (he's a guy in STEM :) ):
  • Deepti Srivastava, Technical Manager at Google (moderator)
  • Leah McGowen-Hare, Master Technical Trainer at @salesforce
  • Grace Nordin, Technical Program Manager at Google
  • Ashley Mennel, CRM Strategy Consultant at Appirio
  • Jefreena Packianathan, Workday Integrations Consultant at Appirio
  • Glenn Weinstein, Chief Information Officer at Appirio


The talk was focused on describing which barriers to reach the heights of their companies each woman invited to the panel has faced in their careers.

It seems that the most of the problem is related to the fact that computer science is, among society, considered male and nerdy stuff, thus this makes studying science (or in our case computer science) an unacceptably difficult challenge for women (a society challenge, not intellectual).

The suggestion is: do what you like, don't stop listening to your passion and follow your way.

Computer science is not only programming but a full set of technology related activities that not necessarily leads to be the best programmer in the world: the important thing is to do what you love being yourself.

As Jefreena said, you don't have to be the very best programmer in the world but you have to give to your work something special, creative, that gives you and your company value.

The panel presented personal experiences, point of views, to demonstrate that women worth the same weight as men, if not more sometimes, given the fact that as of today (luckily things are changing) they have to struggle more to achieve the same results (they talked about the "glass ceiling" that sometimes seems to block you from getting in the highest steps of your company).

Closing quote: "no one fits into a single box, you aren’t one thing and don’t let people put you in one" (Leah McGowen-Hare), so go on with your ideas and be yourself!

Super Duper Awesome Cloud API Mashathon


I waited all the year for this event (hoping to be part of it) and it finally arrived!

I have a little conflict of interest (my app is the 7th) that's why I won't write any comment on the apps but simply report the description that each team gave us.

Watched
Voice recognition keyword search


Car pooling app
Car pooling android application for people to share their car rides. Without using any backend server, Facebook Parse syncs the data between the devices, AWS stores user data and Firebase for Realtime Chat between users.


Be a hero!
A web based platform that enable people to inform the world around Ebola especially it provides tips to avoid the disease. It does that automatically in many languages.


Meet Grinder
Meet Grinder prepares you for your next meeting or conversation, pulling the people from your upcoming Google Calendar events and showing you the highlights of their FB, Twitter, and LinkedIn feeds and profiles. Show up to your next BizDev deal, job interview, or Tinder date armed with immediate opposition research fresh in your brain.


Tely.vision
Tely.vision creates never-ending video streams using your favorite shows.


Social game
A social games app that gamifies your friends facebook activity. How well do you really know your facebook friends?


Moar Learn
Moar Learn is a book recommendation engine that utilizes the HP Idol OnDemand and Amazon Product Advertising APIs


Google Drive to Salesforce.com easy connector
Google Drive easy connector for Salesforce.com to view, edit and search for large amount of files.


Forcebook
Forcebook is an iPhone and iPad app built to leverage the social capablities of Facebook with the business power of Salesforce CRM. It lets you use Facebook social analytics for Salesforce contacts & leads and bridges the gap between personal and business communication by allowing cross-posting between Facebook and Salesforce Chatter.


Chainlock
Chainlock is a user-friendly bitcoin wallet - secured with the signature of your heart.

Monday, November 17, 2014

[Salesforce / Apex] Retrieving zipped static resource files from code

Some days ago one of my awesome colleagues asked me: "Can you get a zipped file into a static resource from Apex?".
My very first thought was NO.

But after having said that syllable, I understood that this could be possible, using an HTTP GET call + cookies + correct resource URL.

This is the solution I came into:

Http h = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint(URL.getSalesforceBaseUrl().toExternalForm()+'resource/ZIPPEDRESOURCE/file.ext');
request.setMethod('GET');
request.setHeader('Cookie','sid='+UserInfo.getSessionId()+';');
request.setTimeout(60000);
HttpResponse request = h.send(request);
if(request.getStatusCode() != 200){
    //handle the error
    throw new CustomException('Unable to load resource');    
}
//now you can get the content
String fileContent = request.getBody();
//or
Blob fileContentAsBlob = request.getBodyAsBlob();

The last thing to do is to enable your instance URL from Setup > Remote Site Settings, allowing https://xxx.salesforce.com but also I suggest https://c.xxx.visual.force.com and wathever it makes sense (there could be some URL path I haven't though to).

No surprise that this could be used to get any resource in the CRM (with the proper URL handling).

Sunday, November 16, 2014

[-1 to #TCO14] - TCO14 for Dummies

6 Days to Top Coder Open and 6 blog post for each day!

I'm almost there, I'm writing from Rome airport waiting for the flight that will bring me (in "just" 15 hours) to San Francisco.

Move out, the geek army is coming!

The following is a blog post I wrote for the Top Code Open 2014 blog. Enjoy!



When I talked to my wife (a proud non tech-addicted woman) about blog post subjects, she first asked me "What is TCO? How can you describe this event to people that are not coders?".

This has been a really good suggestion.

The Topcoder Open is about passion.

What do you call spending hours a day sitting in front of a computer trying to solve problems, creating new awesome apps, and exploring new technologies?

This is without doubts called passion.

Non technical people often ask me how I do my job, what programming looks like, and when I start describing it they watch me like I'm a big genius (or a strange alien). This happens because I don't have a computer at my side and can't show them how a window of my app simply shows a bunch of information or a button makes a panel appear (I know, a tech guy that is reading these lines, it is not always that simple, but it's a starting point!).

Sometimes people don't like things just because they never had a chance to test them.

This is your amazing chance!

The Topcoder Open is a great way to see code in action: from the Matrix style coding (Algorithm competitions...I must admit I feel a little dumb when watching these kind of competitions) to awesome apps created in few days (like in the Mashahton competition). You can breathe tech passion everywhere for 24 hours a days for the whole event and also learn from the best of the best.

New technologies come out daily and topcoder tries to get the best from them and people are happy to start competing with something they have never tried or seen before, just for the sake of learning and increasing their skills (if this comes with money...well...that will make your day!).

This is the main aspect of the Mashathon Competition: developers spin the API wheel and select 3 APIs (i.e. online data services, such as Facebook, Google, Amazon...it's like when you use your Google+ account to login to another site or when another site shows your Facebook friends) and all the competitors have to do is write an awesome app that integrates these services and come up with a brand-new and innovative application...isn't it fascinating? I assure you the results are incredible!



If what you want is all but learning to code, you always could participate in the awesome tech talks by leading tech specialists, meet big sponsors (Google, Facebook, Amazon, HP, TwoSigma, and Microsfoft) grabbing tons of gadgets from their booths: for me, this would be a sufficient reason to come!

 

 

And yes, there is always a time to party, meet new, awesome people and be part of one of the greatest events of this year!

Friday, November 14, 2014

[-2 to #TCO14] - 10 Reasons you should participate to TCO14

6 Days to Top Coder Open and 6 blog post for each day!

The following is a blog post I wrote for the Top Code Open 2014 blog. Enjoy!



1) Opportunity to compete live with or to watch competing the best of the best coder in the world

Tens of coders wisely selected among the Topcoder community will fight one another to become the best in their own track.
For the algorithm track, you can even watch them live solving incredible problems on video screens...it is pretty like watching the itch on the Matrix...you could be Morpheus for real (and you can even find the woman in red, cit.).

The Marathon track is like a fast run against time to complete different programming tasks one after the other!

The First to Finish track is like a code frenzy, where contestants try to finish tasks as quickly as they can!

For the Mashaton track, you will see contestants spin the wheel of fortune to get randomly 3 APIs: they have to combine them to achieve a new and innovative product.

You will have a chance to see awesome prototypes, made in few hours, that could be the next killer app (maybe you have just met the next IT billionaire). I personally love this track (I had a chance to get into it at TCO13).

The "Studio" track is the most visually attractive, you can appreciate amazing designers creating new logos, graphics, UIs just in front of you.

You will appreciate their immagination and creativity and maybe see the next TCO15 logo!

Marathon

2) Know coders (friends) from all over the world

People are there to share / show their skills, to have a couple of days of fun; the "mood" is incredible, all people are friendly even when it is difficult to communicate (I'm talking about my past experience...generally topcoders speak a great English, but I do not, so sometimes I used gestures to explain myself) you can still find someone to "eat your meal with".

You can also learn just by chatting, receiving advices, new point of views, new ideas. I assure you will have a lot of new good friends at the end of the event!



3) What about the "staff"?

Without them Topcoder would not be so amazing!

Maybe I'm influenced by past event and I should not add any word to this point (I have a "bromance" with one of them, we literally fell in bro-love at first sight). The staff is there with at least a smile for each other; they try to make you feel part of the whole (and they actually do it).



4) Big companies on site!

Do you want to meet a guy from a big company and ask him something about your dream job?
Do you want a chance to get in touch with Google, Two Sigma, HP, Amazon, MemSQL, Sequoia Capital and maybe have a chance to get an interview or to get hired (yes, by competing you can also come to this!)?

If your answer is yes, you only have to book a flight to San Francisco!



5) SWAG

Point number 4 leads to point number 5. Get a bag and grab all the gadgets you can take.





6) Chance to visit San Francisco!



7) Listen to experienced and innovative speakers.

We are hosting the first TCO Developer Conference with an incredible lineup! See the agenda and speakers!

8 ) Did I mention the staff? Oh yes, I did, but they certainly deserve 2 places in this list



9) Cool lists have always about 10 items...

10) Do I really need to add another point?

Watch the TCO13 Closing film if you're not yet convinced!

Thursday, November 13, 2014

[-3 to #TCO14] - An evening talk with Samatha Ready, salesforce.com Evangelist

6 Days to Top Coder Open and 6 blog post for each day!

The following is a blog post I wrote for the Top Code Open 2014 blog. Enjoy!



The main reason I started competing in topcoder is because of salesforce.com contests.

In 2009, (casually), I became a salesforce.com developer, and from that time, I started working with this fast growing platform.

In the last 6 years I had the honor to see the platform getting bigger and bigger with new features, powerful tools, a stable cloud platform, and an expanding set of possibilities (Heroku is my favorite one) that really makes my job worth getting done.

But I think that the most valuable "feature" of this technology is the immense amount of docs, blog posts, forums, and repositories, all for free and ready to be consumed in your projects.

The salesforce.com community is really amazing and you always can find an expert ready to help you. If to this awesomeness you add a BIG event, DreamForce, and hundreds of evangelists that "spread the word", you get why salesforce.com is one of the fastest growing companies in the world.

The 2014 Topcoder Open will see a great line up of speakers with its first Developer Conference Unplugged.

For all these reasons, I decided to ask Samantha Ready, Senior Developer Evangelist at Salesforce.com, and speaker for the event a few questions.

Hi Samantha, it is a pleasure to chat with you.

How does it feel to be a central part of this awesome community?

I am overtaken with gratitude and excitement all the time to be able to be at the hub for technology surrounded by some of the smartest minds in the business. Absolutely love the fact that I get to mingle with developers from all over the industry to hear about the cool things they are cooking up for their companies, and love when I can help with those innovations.

What does really mean to be an evangelist? I mean, the main reason is that your job is to spread the "Salesforce word", but is there some sort of feeling of responsibility in front of the dev community?

I think being a developer evangelist is partially spreading the "word" aka the whys and how to's of Salesforce. In addition to that, its also a matter of inciting imagination and possibility with devs helping them envision what they can build for their company and empowering them to use the building blocks they need to do those things. Documentation doesn't always give that kind of context, and so I try to do it through stickier ways like a Udacity course, developer guides, Project Trailhead for learning paths, webinars, and talks to name a few.

You've been a girl that used to talk with robots (you have a background in computer engineering with a concentration in robotics), how and when did you chose to follow the web development and the Salesforce Evangelist path?

So don't get me wrong, I loved robotics. It was a challenging beast and it was extremely satisfying seeing your robot compete or shipping a product. Truthfully though, most of the programming I did for my last job as an software engineer was low-level embedded C and Perl scripting which plays tricks on your psyche after a while. I lived out of the command line and didn't really talk to any of the engineers I worked with because we were so heads down. I found Salesforce through a friend and while I had no idea what Salesforce was at the time, the company seemed extremely innovative and I thought it sounded like a good opportunity for growth. I jumped over to an internal development role and felt the atmosphere and company was a fit from day 1. Rapid development, tons of new languages and frameworks, competitive, and collaborative...my favorite things! I immediately loved the "instant gratification" aspect of web development rather than the 10-week push for an inch of progress at my former company, and haven't really looked back. Both disciplines are great for sure, and they each have their own set of challenges, but I think I prefer the fast iteration of web development and the infinite learning possibilities for new tech.

Has the robotic passion ended or do you plan to reach that path again?

The robotics passion has definitely not ended, and I'm so happy that the internet of things trend is making its way into the enterprise!

How has this passion helped you in your evangelist career?

I think that my passion for robots has helped me geek out more times than I can count. I love to tinker, and I love to talk to people about their pet projects as well. In addition to that, I think it made me more confident in trying other things because it laid a foundation for my own self confidence which was "even if this seems impossible and you have no idea...google it, and figure it out."

It is not usual to see a woman that loves to code, but recently (and luckily) the number is increasing. In my experience I always felt it was a matter of lack in interest. How do you, as an expert and successful woman, see this?

I think the best analogy I heard was from a colleague of mine (Mary Scotton) who said,"Just like some time ago when being a doctor was seen as a job only men do, that’s how some people see programming right now. But now, being a doctor is seen as a job for both men and women, and that’s where it’s going with programming." I see the increasing number as a good sign and a definite trend, but I think for this to grow there still needs to be more proactive efforts. I think we need more awareness overall in schools, families, friends about motivating young men and women at a young age to take an interest in STEM education. There are already efforts in this direction: GoldieBlox, Girls Who Code, Hour of Code, Made with Code to name a few, but I think it needs to be even more prominent in both school programs and extracurricular activities to catalyze exponential change. I think if high schoolers have more of an opportunity to learn how to code or get a taste of computer engineering or computer science, we'll see a big shift in the gender balance.

Were you attracted to the "nerd" world of coders or simply had a secret passion for computers and robotics or the random nature of life is the only explanation?

I fell in love with coding for the exact reason above--my school had a C++ class, and I had no idea what it was but I took it as an elective and had a blast. I took more programming courses after that, and eventually started tinkering on PCB layouts. I'm a polyglot nerd though, because besides coding I'm obsessed with physics, space, and marine science. I'll nerd out over space or the ocean any day of the week.

You've actively worked on Salesforce1 recently. This is an important step for Salesforce and, as far as I worked on it, it actually is a great and important piece for the whole Force.com platform. Which is the feature you love most of Salesforce1?

So up until DreamForce my answer would have been the ability to implement custom Visualforce within Salesforce1 to be able to build dynamic mobile pages instantly deployed. I've made a few different iterations of a "Find Nearby" page that will locate restuarants, accounts, people, etc near where you are completely in JavaScript, Visualforce, and Apex in a little under an hour and displayed in an interactive google map.

Can you anticipate any future (and top secret) features?

Now that DreamForce is over, I can tell you about my not-so-secret new feature Lightning Components. Salesforce1 is a Lightning App that is built using Lightning Components, and as such the places where Salesforce1 uses Lightning Components will become extension points for developers. The Salesforce1 UI will not only be customizable to the point where you can not only build completely custom features from scratch but you will also be able to develop on top of the standard UI and still utilize all of the built in functionality the platform provides.

How do you see Salesforce1 in the next future?

Salesforce1 right now is a mobile app and a platform. This mobile app will eventually become the full experience for Salesforce--a new UI and unified desktop across all devices. This means build once and deploy everywhere, which will be huge.

Have you been working on side projects besides your evangelist job that you want to share with us?

I had started tinkering on an integration between the FitBit and Salesforce to store information over time to get more in depth and filterable analytics. I was hoping to build that out even further utilizing your Salesforce network on Chatter and turning it into a competition with colleagues.

What do you plan/want to say at the TCO14 developer talk? Any particular subject?

This is still TBD... Top Secret :)

Your bio in the TCO14 site states that you love "scuba diving, scaling mountains searching for the world’s best hot sauce while listening to good music": did you find the world's best sauce?

If you like pasta I can give you wise advice :) World's best is the search for the holy grail...and as such I think is equally futile. The "best" hot sauce is subjective depending on what you're eating! So here are a couple: Fall foods (butternut squash, roasted veggies, chili) - Yucatan Sunset Picante Sauce, Chicken/Grilled foods - Nando's HOT Peri Peri, Eggs or Beef - Yucatero XXXtra Hot Habanero, Veggies - Marie Sharp's. Old faithfuls are Cholula and Sriracha :)

Wednesday, November 12, 2014

[-4 to #TCO14] - An evening chat with Gayle Laakmann McDowell

6 Days to Top Coder Open and 6 blog post for each day!

The following is a blog post I wrote for the Top Code Open 2014 blog. Enjoy!



When I first was invited to TCO13 I was both afraid and excited about competing with worldwide champions.
Moreover with such a BIG sponsor like Google it seemed to me incredible to have a chance to be part of it as a main character in this awesome event.

I have to admit I also became shy when I spent 2 words with the Google guys at the event: this is not because I thought of them as the most important developers in the world (and I suppose they actually were not developers at all) but because they had a big "G" on their shirts (but also cool gadgets...I barely managed to travel with my luggage back to Italy).
Thinking back to those 2 shy words I said to them, I smile, but I understand that this was caused by the fact I think of Google (and Apple, Facebook, Microsoft, Amazon...) as an unreachable nerd heaven where only the choosen ones can be allowed to enter.
Gayle Laakmann McDowell, speaker at TCO14, embodies what I thought was not really possible in life, that is to say working with the most known and desired tech companies.

And besides this she tries constantly to help people to focus their skills to reach what she has managed to do.

In her book Cracking the Tech Career Gayle presents the good and evil of big (new & old) tech companies, stating which is their recruiting model and how you can thus focus on their model to possibly get a chance to be a choosen one, or how you can understand if you simply could be that chosen one.

The original interview has a slightly different set of questions: I wanted to ask smart questions but I overestimated my English skills; thus Gayle helped me to re-organize them (thank you very much!).


Hi Gayle and thanks for this chance to chat with you.
Do you feel like you chose your career, or that it chose you?

I think luck and choice/skill play together. Luck opens doors a crack. Choice/skill is what enables you to walk through it and actually leverage the luck.

Many of the major turning points in my life were preceded by luck. For example, a friend from college introducing me to someone at Microsoft. However, it's only because I had done a lot of coding projects that I was able to land a job there, despite being only a freshman. We all have a lot of doors opening, but sometimes it's so small that we don't even notice it. We have to be observant, confident, and skilled to walk through it though and actually capture the opportunity.


You've spent a lot of time both writing books and writing software. Do you feel that those are related skills or independent skills?
They overlap. Writing books isn't a skill by itself. It's a thing you do because you possess multiple skills. Same thing with writing software. Some of those sub skills overlap. Writing books and writing software both require focus, logical thinking, hard work, and initiative. And in my case, both require coding skills.

Do you think the perception of programming as a man's field discourages women from pursuing the field?
It's not the only thing, but it's certainly an important factor. Both men and women are influenced by society. Just as people often follow in their parents' footsteps, they often follow in the footsteps of other people around them.


When a man doesn't see many men in nursing, it doesn't really occur to him as a good fit for him. This doesn't mean it's not though. Likewise, when a woman doesn't see many women in engineering, this doesn't really jump out as a great career option. There are so many options and this one doesn't seem especially ideal.

Role models and society influence people.

Unfortunately, the causality also operates in the opposite direction: when few women enter engineering, it continues to be perceived as man's field. This is part of why efforts to encourage more women to enter engineering are important. Society subtly influences women not to. These efforts exist to counteract those.

Is there something in your career that you regret (bad choices, lost opportunities)? On the other side which have been your "luckiest" circumstances?
Regret is difficult for me. I love what I'm doing and where I am in life. What if changing some part of my background would set off a chain reaction and radically change where my life is?
However, if I could give myself career advice, unaware of the future would hold, I'd say this: Go check out a startup while you're in college. You've had several summers at big companies. Go get some diversity in your experience.


For luckiest, I think becoming a teaching assistant (TA) in college. I was asked to be a TA for one of the most challenging computer science classes. My grades were okay in the class, but not great. One of the current TAs recommended me because she observed me teaching some concepts to a friend. She was confident that I could learn the material well enough and would be a great teacher. (I could and I was.)
This gave me a ton of experience with both explaining concepts and with public speaking. Developing those skills have been incredibly valuable for what I'm doing now.


In the hiring process, can love and passion overcome real and quantifiable knowledge?
They won't necessarily overcome large knowledge gaps, but they will eliminate them over time. Developers who are passionate about programmer aggressively learn what they need to know. They take on the challenging projects and, pretty soon, the knowledge gap goes away.

With new technologies coming out all the time, how do you keep up to date on them when at a big company who might not adopt them?
The best thing to do is to make programming your hobby too. You should spend at least a bit of time outside of work coding. Use that to stay up to date with technologies.


You don't need to know all of the latest technologies - that's too much. You should know at least some of the modern tools though.

Do you have some final advice for all TCO14 participants?
Recognize the opportunities in front of you and seize them. Know when that door has opened just a little bit for you. Don't let that little voice that says "I'm not good enough for this" get in the way. Almost everyone has that little voice. If you do too, remember that having that voice doesn't mean the voice is right.

Tuesday, November 11, 2014

[-5 to #TCO14] - TCO14 Rockstars: pt 2

6 Days to Top Coder Open and 6 blog post for each day!
The following is a blog post I wrote for the Top Code Open 2014 blog. Enjoy!


You know what? You are the guy that almost destroied my TopCoder dreams! Yes that's true, I'm talking honestly! After the Cloudspokes experience (in which I felt really comfortable, really high % of wins, considered by someone a rockstar) and after the beautiful TCO13 experience, I finally started competing into TopCoder...and what happens? You were the one that made me feel a noob! Why? Because the first challenge I did which I thought I'd won, was won by you with an impressive 100% score.

They say "face your demons", that's why after seeing you winning the TCO14 Development final and after beeing honored to be asked to write some posts for TCO14, I thought that writing of you would have been a good subject (you are not my demon, I'm just kidding!).

Dear audience, I'm actually talking to TCO14 Development champion Sky_.

So let's start with some noob questions: what do u do in your life and how did u start coding? How did u get to the TopCoder's community? How TopCoder changed your professional life and your productivity?

I started coding in High School. My first programming language was Pascal and I was solving only algorithmic problems. I believe all programmers start their career in the same way. I heard about TopCoder in High School, because tomek had won TopCoder Open, but I hadn't heard about Development Track until I went to the University. I remember when 5-6 years ago I was reading about Development Component track (it was very popular those days, but now it's dead at the moment) and I was trying to compete in few contests. Unfortunately my codings skills were very low and I was unable to do anything so. I gave up TopCoder for 4 years. During these 4 years I've been studying and working as a .NET developer and I came back to TopCoder 2 years ago. I was looking for a better job, so I've decided to quit my current one and do full time TopCoder contests.

In a scale from "I'm not a nerd, shut up and give me your lunch's money!" to "Beam me up, Scotty" how much do you feel nerd? If your are dangerously near the Star Trek limit, how does this helped you in your coding carreer? In your professional experiece, did you find "geekyness" a common "language" that goes across countries and cultures?

I am not a nerd and I don't like Star Trek :) I've never met geeks or nerds in my job. "Geekyness" might be a common "language", but only for World of Warcraft players or anime fans.

Personally I feel awkward when I say to other "common people" that programming is not only my job but also one of my strongest passions. What do you think about it? Same feeling? Do you have any other hobby? How does them helped you in your professional life? If you could choose, what did you wanted to be / do in your life?

I agree. You won't be a good programmer if programming is not your passion. People who choose this job only because of money will never be successful. I hate people saying "Will I earn good money as a programmer if I learn xxx book or finish yyy course?". If you don't have passion you might be a coder, but never a top coder.(This is the quote of the day!!) I don't have any special hobbies. I used to play poker and it's changed my attitude towards money, so now I am not scared about of losing or winning any money. I am also happy about my current life.

If you have to leave for TCO14 with only 3 objects in your luggage, what would you choose? (and BTW will you actually bring them to San Francisco?)

Laptop and my mobile phone, because the flight will be very long. Nothing else special.

Will you be the next TCO15 champion?

Hard to say, because TCO15 will be different than TCO14. TC Admins are going to do the onsite tournament and they haven't announced any information about the finals yet. I hope the onsite event will be different than current F2F finals.

Monday, November 10, 2014

[-6 to #TCO14] - TCO14 Rockstars: pt 1

6 Days to Top Coder Open and 6 blog post for each day!
The following is a blog post I wrote for the Top Code Open 2014 blog. Enjoy!


I was a rockstar at Cloudspokes (in the sense that I won almost every challenge I participated in), so it's been really painful since the Cloudspokes and topcoder communities join together....I felt like I was not that special anymore!

And I have to secretly admit that I feared mostly 2 handles: albertwang and Sky_.

You may ask (I hope you'll do...please...do it for my interview) "Why?"

The reason is simple:
  1. Can you figure out who won the first contest I entered in topcoder (and the first I lost)? Sky_
  2. Can you figure out who won the last challenge I lost the last month (even with a good 90% score)? Albertwang
  3. In both cases they both get an impressive 100% score!
And seeing both of them as winners of Design and Developer tracks made me feel a little mouse in front of big tigers but also gave me relief about my past losses!

That's why I decided to get a chance to say a word or two to Albertwang, one of topcoder greatest rockstars!

So the first question is: how do you get those incredible scores? Magic? Super powers? You sold your soul to the devil? And if it is not magic (I really hope it is), how long you've been practicing programming? How your love for programming began? Excluding your family time, which is the % of time you dedicate to coding (reading, thinking and speaking included)? Is it enough or you would like more?

I'd attribute my achievements to commitment, hardworking and passion to learn new technologies.

I have been primarily focused on software architecture challenges, and for each project I usually spend a lot of time thinking and trying out various design ideas to approach the problem, and revise the designs in iterations. I'm particularly excited about projects involving emerging technologies/ideas or something I'm not familiar with, although usually they take much more time and effort to finish - I think curiosity and eagerness to learn new stuff keep me productive.


Which aspects of programming / designing software do you like more? Which of them helps you in the "common" life? If you had to convince me to start learning programming what would be your arguments? Technically speaking, which platform would you suggest me if I were a noob (or "noober")? Or which aspect of programming do you suggest to improve?

I put elegance in an important position when either coding or designing a software system, and that's probably the most enjoyable aspect for me in technical sense. Also making something useful, cool and awesome is always exciting and interesting to me, and coding an app is the easiest way for me to do so. I'm fascinated by the endless possibilities and innovations in mobile and wearables, that's my current adventure and I'd definitely suggest to others.

Do you have a contest in your topcoder career that you love particularly? E.g. You learned something new? You got a really huge price? You felt like the best requirements in the world? You found your solution really elegant and effective? you particularly enjoyed coding? all of them?

NASA - ISS Food Intake Tracker iPad App is my favorite in terms of genre, knowing that the app will be used by astronauts on daily basis at the International Space Station :)

The most challenging and interesting one is the Healthcare Fraud Prevention series (Java and Python), which aims to develop a full set of secure and efficient data exchange protocol for healthcare service providers, and implement a scalable data exchange network infrastructure. It involved many technologies and presented quite a lot tough technical problems. I spent more than 100 hours and dropped three different failed attempts, yet I truly enjoyed the experience, I really liked the solution I proposed and I had great sense of achievement :)


How did you get to topcoder's community? In which ways it has changed (and is changing) your life (at least the professional one)?

I started my topcoder adventure a decade ago, when I was in college. I'd say topcoder changed my life significantly, it opens great flexibility for my work and life, I have learned so much from the challenges and from the community.

I wanted to finish my interview with a "Will you be the next TCO15 winner?" but I got this answer back:

Well, since there won't be software design track in the next TCO15, I could be the last TCO Software Design champion, and I probably won't be at the next TCO finals at all. It's really a shame that software design tracks are underrated these days.

All I can say is: Dear albertwang, there couldn't be a TCO15 Design track next year but you certainly have the skills to win other tracks as well, so just move on and rock!

Monday, November 3, 2014

[Salesforce / Apex] Queueable interfaces - Unleash the async power!

The next Winter '15 release came with the new Queueable interface.

I wanted to go deep on this, and tried to apply its features to a real case.

If you are (like me) in a TLDR; state of mind, click here.

The main difference between future methods (remember the @future annotation? ) and queueable jobs are:

  • When you enqueue a new job you get a job id (that you can actually monitor)...you got it, like batch jobs or scheduled jobs!
  • You can enqueue a queueable job inside a queueable job (you cannot call a future method inside a future method!)
  • You can have complex Objects (such as SObjects or Apex Objects) in the job context (@future only supports primitive data types)

I wanted to show a pratical use case for this new feature.

Imagine you have a business flow in which you have to send a callout whenever a Case is closed. Let's assume the callout will be a REST POST method that accepts a json body with all the non-null Case fields that are filled exactly when the Case is closed (the endpoint of the service will be a simple RequestBin).

Using a future method we would pass the case ID to the job and so make a subsequent SOQL query: this is against the requirement to pass the fields we have in the case at the exact time of the update.
This may seem an exageration, but with big Orgs and hundreds of future methods in execution (due to system overload) future methods can be triggered after minutes and so the ticket state can be different from when the future was actually triggered.

For this implementation we will use a Callout__c Sobject with the following fields:

  • Case__c: master/detail on Case
  • Job_ID__c: external ID / unique / case sensitive, stores the job id
  • Send_on__c: date/time, when the callout has taken place
  • Duration__c: integer, milliseconds for the callout to be completed
  • Status__c: picklist, valued are Queued (default), OK (response 200), KO (response != 200) or Failed (exception)
  • Response__c: long text, stores the server response

Let's start with the trigger:

    trigger CaseQueueableTrigger on Case (after insert, after update) {

    List calloutsScheduled = new List();
    for(Integer i = 0; i < Trigger.new.size(); i++){
        if((Trigger.isInsert || 
           Trigger.new[i].Status != Trigger.old[i].Status)
            && Trigger.new[i].Status == 'Closed' )
        {
            ID jobID = System.enqueueJob(new CaseQueuebleJob(Trigger.new[i]));
            calloutsScheduled.add(new Callout__c(Job_ID__c = jobID, 
                                                 Case__c = Trigger.new[i].Id,
                                                Status__c = 'Queued'));
        }
    }
    if(calloutsScheduled.size()>0){
        insert calloutsScheduled;
    }
}

The code iterates through the trigger cases and if they are created as "Closed" or the Status field changes to "Closed" a new job is enqueued and a Callout__c object is created.
This way we always have evidence on the system that the callout has been fired.

Let's watch the job code

    public class CaseQueuebleJob implements Queueable, Database.AllowsCallouts {
    . . .
    }

The Database.AllowsCallouts allow to send a callout in the job.
Next thing is a simple constructor:

    /*
     * Case passed on class creation (the actual ticket from the Trigger)
     */
    private Case ticket{get;Set;}
    
    /*
     * Constructor
     */
    public CaseQueuebleJob(Case ticket){
        this.ticket = ticket;
    }

And this is the content of the interface's execute method:

    
     // Interface method. 
     // Creates the map of non-null Case fields, gets the Callout__c object
     // depending on current context JobID.
     // In case of failure, the job is queued again.
     
    public void execute(QueueableContext context) {
        //1 - creates the callout payload
        String reqBody = JSON.serialize(createFromCase(this.ticket));
        
        //2 - gets the already created Callout__c object
        Callout__c currentCallout = [Select Id, Status__c, Sent_on__c, Response__c, Case__c,
                                     Job_ID__c From Callout__c Where Job_ID__c = :context.getJobId()];
        
        //3 - starting time (to get Duration__c)
        Long start = System.now().getTime();
        
        //4 - tries to make the REST call
        try{
            Http h = new Http();
            HttpRequest request = new HttpRequest();
            request.setMethod('POST');
            //change this to another bin @ http://requestb.in
            request.setEndpoint('http://requestb.in/nigam7ni');
            request.setTimeout(60000);
            request.setBody(reqBody);
            HttpResponse response = h.send(request);
            
            //4a - Response OK
            if(response.getStatusCode() == 200){
                currentCallout.status__c = 'OK';
            //4b - Reponse KO
            }else{
                currentCallout.status__c = 'KO';
            }
            //4c - saves the response body
            currentCallout.Response__c = response.getBody();
        }catch(Exception e){
            //5 - callout failed (e.g. timeout)
            currentCallout.status__c = 'Failed';
            currentCallout.Response__c = e.getStackTraceString().replace('\n',' / ')+' - '+e.getMessage();
            
            //6 - it would have been cool to reschedule the job again :(
            /*
             * Apprently this cannot be done due to "Maximum callout depth has been reached." exception
            ID jobID = System.enqueueJob(new CaseQueuebleJob(this.ticket));
            Callout__c retry = new Callout__c(Job_ID__c = jobID, 
                                                 Case__c = this.ticket.Id,
                                                Status__c = 'Queued');
            insert retry;
            */
        }
        //7 - sets various info about the job
        currentCallout.Sent_on__c = System.now();
        currentCallout.Duration__c = system.now().getTime()-start;
        update currentCallout;
        
        //8 - created an Attachment with the request sent (it could be used to manually send it again with a bonification tool)
        Attachment att = new Attachment(Name = 'request.json', 
                                        Body = Blob.valueOf(reqBody), 
                                        ContentType='application/json',
                                       ParentId = currentCallout.Id);
        insert att;
    }

These are the steps:

  1. Creates the callout JSON payload to be sent (watch the method in the provided github repo) for more details (nothing more than a describe and a map)
  2. Gets the Callout__c object created by the trigger (and using the context's Job ID)
  3. Gets the starting time of the callout being executed (to calculate the duration)
  4. Tries to make the rest call
    1. Server responded with a 200 OK
    2. Server responded with a non OK status (e.g. 400, 500)
    3. Saves the response body in the Response__c field
  5. Callout failed, so fills the Respose__c field with the stacktrace of the exception (believe me this is super usefull when trying to get what happened, expecially when you have other triggers / code in the OK branch of the code)
  6. Unfortunately if you try to enqueue another job after a callout is done you get the following error Maximum callout depth has been reached., this is apparently not documented, but it should be related by the fact that you can have only 2 jobs in the queue chain, so apparently if you queue the same job you get this error.
    This way the job would have tried to enqueue another equal job for future execution.
  7. Sets time fields on the Callout__c object
  8. Finally creates an Attachment object with the JSON request done: this way it can be expected, knowing the precise state of the Case object sent and can be re-submitted using a re-submission tool that uses the same code (Batch job?).

This is a simple Callout__c object on CRM:

And this is an example request:

{
    "values": {
        "lastmodifiedbyid": "005w0000003fj35AAA",
        "businesshoursid": "01mw00000009wh7AAA",
        "engineeringreqnumber": "767145",
        "casenumber": "00001001",
        "product": "GC1060",
        "planid": "a05w000000Gpig7AAB",
        "ownerid": "005w0000003fj35AAA",
        "createddate": "2014-08-09T09:54:17.000Z",
        "origin": "Phone",
        "isescalated": false,
        "status": "Closed",
        "slaviolation": "Yes",
        "accountid": "001w0000019wqEIAAY",
        "systemmodstamp": "2014-11-03T19:33:31.000Z",
        "isdeleted": false,
        "priority": "High",
        "id": "500w000000fqNRaAAM",
        "lastmodifieddate": "2014-11-03T19:33:31.000Z",
        "isclosedoncreate": true,
        "createdbyid": "005w0000003fj35AAA",
        "contactid": "003w000001EetwEAAR",
        "type": "Electrical",
        "closeddate": "2013-06-20T18:59:51.000Z",
        "subject": "Performance inadequate for second consecutive week",
        "reason": "Performance",
        "potentialliability": "Yes",
        "isclosed": true
    }
}

The code and the related metadata is available on this GitHub repo.