Tuesday, May 31, 2011

Write Android Task Manager App... Check!!

Ppandhi wins our Android Task Manager for the Google Tasks API challenge and takes the $1000 first prize.

If you would like to install and use the application, he has created a companion site, My Task Manager, complete with installation instructions and a user guide. Check out the guide for an overview of the functionality.

Congrats ppandhi!!

Friday, May 27, 2011

Infested with the CloudSpokes bug

Romin Irani
Guest Blogger: Romin Irani

I am a big fan of programming challenges, especially those that allow me to learn something new. When CloudSpokes came along a few months back, I did not know what to expect. Little did I know that as of today, I am completely infested with the "CloudSpokes" bug and make it a daily ritual to check out the site, blog, any new contests, any submission updates and much more. And that is not a complaint.... :-) In this blog post, I wanted to discuss why I "CloudSpoke" and why you should too.

One of the challenges that we as developers face is to keep ourselves updated with latest technologies. The pace at which things are moving is both a good and bad thing. Its a bad thing since it is difficult to keep learning all the stuff happening on the Development stack. Its a good thing because it presents a great opportunity to focus yourself on an important area, learn stuff fast, do some serious assignments and build your brand and make yourself known among your peers.

CloudSpokes for me is now the vehicle to do all the above. I have participated in a handful of challenges by now and have focused on what I think I know well. So since Google App Engine is an area I know well, I tend to gravitate towards those challenges. The experience has been fun. The challenges are clear in what they want you to develop and you are working against time to learn, implement and deliver it. There have been challenges where I was not much familiar with the stuff but ended up learning it, fixing the little errors or so and delivering it, no matter what the end result.

Where CloudSpokes really shines is that it gives you a great platform to be a better developer. And let me explain why? You might be a master of coding but that is not enough in a community setting. It forms just a part of the overall delivery package. How about documentation on what you have done? A video? How about commenting your code so that others can understand? I think all of us developers now have a chance to try out all these things and present our work in different ways. And once we crack the problem of communicating what we have done to others via various mediums like our code, documentation, video, etc -- the sky (sorry Cloud!) is the limit for us.

My next step with CloudSpokes is to learn about stuff that I am not familiar with. For e.g. SalesForce challenges are a plenty but I do not know much about it. And CloudFoundry, the latest PaaS play sounds exciting too. I am going to roll up my sleeves and start learning them. Here is where I have a suggestion for CloudSpokes i.e. a "CloudSpokes University" sort of a page, which links tutorials, blogs, etc where one can get started quickly. They have taken the lead with CloudFoundry and the tutorial videos and hopefully can replicate it across other platforms too.

Thanks for reading. Are you ready to CloudSpoke now?

Thursday, May 26, 2011

We Made it to Gluecon!

So after tornados, cancelled flights and broken aircraft, the CloudSpokes team finally made it to Gluecon late yesterday. Unfortunately Dave missed his keynote with VMWare, Google and Microsoft. However, we did announce a series of new challenges with VMWare's Cloud Foundry which we are really excited about!

Rumor has it there is a 10,000+ backlog of requests for new Cloud Foundry accounts. However, we've worked with VMWare to guarantee accounts for our community members. The first 100 people to sign up for one of our 3 Cloud Foundry challenges will have their Cloud Foundry account enabled. We have also whipped up some new Cloud Foundry badges to go along with the challenges. You can expect more Cloud Foundry challenges in the future for cash, badges and prizes.

We spent last night at the Colorado Rockies game with the guys from Isidorey and some potential CloudSpokes sponsors. A lot of great stuff coming down the pipe! We wrap up today with our breakout session, How to Effectively Crowdsource Cloud Development and then back home Friday morning.

Wednesday, May 25, 2011

We Got Skillz - Get Into Badges With VMware and CloudFoundry

CloudSpokes loves awarding developers money for creating beautiful code and solutions. Yet, we know it all starts with humble beginnings. As a result, we also want to help developers build their skills with real world development problems. So we are launching a series of badges that demonstrate your skills with specific cloud technologies -as well as those that recognize your contest prowess with them.

Contests that award badges instead of money give you a chance to learn and be recognized for your accomplishments with a badge of achievement. Our first "skillz badges" will be related to VMWare's Cloud Foundry.

Cloud Foundry is a VMware hosted, managed and supported service that provides a multitenant PaaS from VMware that runs on the industry leading vSphere cloud platform. Initially, CloudFoundry.com supports Spring for Java apps, Rails and Sinatra for Ruby apps, Node.js apps and apps for other JVM frameworks including Grails. Cloud Foundry also offers MySQL, Redis, and MongoDB data services.

Cloud Foundry launched to great acclaim and getting into their private beta has accordingly, been very difficult. Yet, we are happy to announce, VMware has agreed to move our first 100 registrants into the Cloud Foundry Skills challenges into that exclusive beta !

You can register for any one of three challenges:
While these first challenges are for badges (and coveted registration spots), its only the beginning of the challenges we will run with Cloud Foundry. We are excited to work with VMware and the Cloud Foundry team to run a series of additional contest and incorporate it as a major platform in working on a broad cross section of paid CloudSpokes challenges.

For more information on what we are doing with Cloud Foundry, watch the presentations from GlueCon 2011 and the key panel on developer ecosystems.


In case you don't have a metaphone app installed, the title converts to "Announcing the Metaphone Winner". We had two equally good submissions for our Apex Metaphone challenge so we have awarded them both 1st place with $500 each.

Knthornt's submission was well written, thoroughly documented and highly reusable. His video submission is below and I highly recommend watching it.

Arvind took a little different approach as he ported the Apache Common Codec library from Java to Apex. His implementation took into account potentially large data sets and their implications with Force.com governor limits. Typically we don't allow the use of other libraries unless pre-approved. All work must be original in nature.

Congrat to both for great submissions!

Unable to display content. Adobe Flash is required.

Tuesday, May 24, 2011

The CloudSpokes Team Arrives at #Gluecon 2011

A handful of the crew behind CloudSpokes are on their way to the 2011 Glue Conference in Broomfield CO. Looking forward to spending some quality time with our type of people: cloud developers and API providers.

We're excited to be given the opportunity to sponsor the conference. We'll also be in two different sessions, one on Wednesday, and one on Thursday. We're hoping to catch them on video, but if you're there live, this is where you'll find us!

Wednesday, May 25

Thursday, May 26

Lazy loading tree with jQuery, Force.com, jsTree and REST JavaScript toolkit

Guest Blogger: Tim Inman

I recently took part in my first CloudSpokes challenge and was lucky enough to be the winner. The challenge was to use the Salesforce REST JavaScript toolkit to create a tree component that represented the parent/child relationship of an object to itself (think parent account/account relationship). Another requirement was that it would load “lazily”, only loading one level of children at a time. This would allow for a quick overall page load if there was a deep and complex tree that needed to be rendered. Here is a link to the challenge.

Below is an overview of my entry and my thought process. You can download the code in its entirety here.

What you will need

I decided to use jsTree to render my tree in. I had never used it before but it looked to have all the things I needed in order to render a fully functional tree. The documentation and files can be downloaded here:

I also had to download the REST JavaScript tool kit. This is a pretty slick toolkit created by Pat Patterson that makes using the REST API via JavaScript a breeze. You get the toolkit here:

Once I got both of these libraries I zipped them up and loaded them to my dev org as a static resource that I would reference later in my component.

Add all the files into a zip and load it to Salesforce

Lastly I created a custom object to run it on. This was a simple custom object named Parent Object with a lookup relationship to itself.

Parent Object

Define lookup to itself
Now on to the code…

I decided to create my tree as a custom component so I would be able to use it across any object that has a relationship with itself. To learn more about custom components check out the Visualforce developer’s guide.

The first step was to define my custom component and all the attributes that would need to be passed to it to make it dynamic. We will see these referenced later in the code.

Next, we need to include the libraries from the static resource we uploaded earlier.

Then we define the div that the tree will be rendered in once the page loads.

Now we can get to the actual code that queries Salesforce and renders the parent/child tree. The following code is all written in JavaScript and I am leaving out the script tag in my demo because Blogger does not like it. The first thing I did was convert the attributes to JavaScript variables. This is not a necessary step. I just find it easier when I do not have to type the merge syntax around my variables throughout my code.

/////////////////////////////////////////////////        //        // VARS        //        //////////////////////////////////////////////////               var objectToQuery = '{!objectToQuery}';        var parentId = '{!parentId}';          var fieldToQuery = '{!childField}';        var childRelationshipName = "{!childRelationshipName}";        var parentRecordName = "{!parentRecordName}";

Since jsTree uses jQuery we need to get a reference to jQuery that works. I also needed to load the jsTree themes and get an instance of the REST API Client.

//////////////////////////////////////////////////        //        // Get a reference to jQuery that we can work with        //        //////////////////////////////////////////////////                $j = jQuery.noConflict();                ///////////////////////////////////////        //        // Load the themes        //        ///////////////////////////////////////                $j.jstree._themes = "{!URLFOR($Resource.restJavascript, '/rest/themes/')}";                ///////////////////////////////////////        //        // Get an instance of the REST API client        //        ///////////////////////////////////////             var client = new forcetk.Client('{!$Api.Session_ID}');

Next I created an instance of a tree and stick it in the “tree” div we created earlier. You will see that three major things are defined here. (1) The plugins needed. (2) The parent node name, state and id. Notice that I use the id of the parent object as the id. I will reference that later as I build nodes for the tree. (3) The themes for the different nodes. These themes are what define what icons will show up for the different types of nodes and what type of children they can have.

//////////////////////////////////////////////////        //        // Instantiate the inital jsTree        //        /////////////////////////////////////////////////                $j("#tree").jstree({           "plugins" : [ "themes", "json_data", "ui", "crrm", "dnd",  "types" ],                     "json_data" : {                 "data" : [                     {                          "data" : parentRecordName,                         "state": "closed",                          "attr" : { "id" : parentId }                                          },                 ]             },             "types" : {     "max_depth" : -2,     "max_children" : -2,     "type_attr" : "rel",     "valid_children" : [ "default" ],                          ////////////////////////////////              // Define the themes              ////////////////////////////////                            "types" : {           "children" : {        "icon" : {          "image" : "{!URLFOR($Resource.restJavascript, '/rest/folder.jpg')}"         },        "valid_children" : ["noChildren","children" ]       },       "noChildren" : {        "icon" : {          "image" : "{!URLFOR($Resource.restJavascript, '/rest/leaf.jpg')}"         },        "valid_children" : ["noChildren","children" ]       },              "default" : {        "icon" : {          "image" : "{!URLFOR($Resource.restJavascript, '/rest/home.jpg')}"         },        "valid_children" : [ "noChildren","children" ]       }     }    }  });         

The next two functions are the ones that query Salesforce for data. “firstNodeLoad” is called on page load and loads the children of the parent object. We will see this called later in my code. The second one called “loadNode” is used for every subsequent call and accepts an Id of a Salesforce object and queries for that object’s children.

//////////////////////////////////////////////////    //    // Load nodes    //    /////////////////////////////////////////////////     function firstNodeLoad() {          var query = "SELECT Id," +fieldToQuery +", Name, (Select Id From "+childRelationshipName+") FROM " + objectToQuery + " WHERE " +fieldToQuery +" = '" + parentId + "'";     client.query(query,parseNode);         }     function loadNode(parentIdPassed) {         var query = "SELECT Id," +fieldToQuery +", Name, (Select Id From "+childRelationshipName+") FROM " + objectToQuery + " WHERE " +fieldToQuery +" = '" + parentIdPassed + "'";      client.query(query,parseNode);        }        
Both of those functions call “parseNode” when their API call is complete and pass their results into it. This function parses the response and builds a node for each child found for that parent. It also determines if those children have children.

//////////////////////////////////////////////////    //    // Parse the REST repsonse    //    /////////////////////////////////////////////////        function parseNode(response) {               for(var i=0; i < response.records.length; i++) {                  var hasChildren = false;       /// Determine if they have childrenif(response.records[i][childRelationshipName]!= null) {                         hasChildren = true;          }      addNode(response.records[i][fieldToQuery],response.records[i].Name,response.records[i].Id,hasChildren);  }             }         
The final function “addNode” is called as each child is parsed in the parseNode function. This function takes all the information about that child and creates a node or “leaf” on the tree for the child. It defines things like style, id, closed, etc. You will notice that I use the record id for the id of the leaf. This way I will be able to quickly add children to it when I need to.
//////////////////////////////////////////////////    //    // Add each node    //    /////////////////////////////////////////////////           function addNode(localParentId,nodeName,nodeId,hasChildren) {            ////////////////////////////////////////////      //      // Create a new node on the tree      //      ////////////////////////////////////////////            if(hasChildren) {       /// If it has children we load the node a little differently    /// give it a different image, theme and make it clickable        $j("#tree").jstree("create", $j("#"+localParentId), "inside",  { "data" : nodeName ,"state" : "closed","attr" : { "id" : nodeId,"rel":"children"}},null, true);       } else {       // Nodes with no trees cannot be opened and     // have a different image             $j("#tree").jstree("create", $j("#"+localParentId), "inside",  { "data" : nodeName ,"state" : "leaf","attr" : { "id" : nodeId,"rel":"noChildren"}},null, true);      }    } 
Lastly I need to bind some events to the nodes that are created in the tree.

The first event was to load any child nodes of a leaf if it was opened up by the user. This was a major requirement of the challenge. Up until now in our code we only query one level of the tree. I accomplished this by using the “open_node.jstree” method that is part of jsTree. Basically every time a node is opened I call the “loadNode” method on the children of that node and load up any children they may have.
//////////////////////////////////////////////////    //    // Add the logic to query if there are children    //    /////////////////////////////////////////////////  $j("#tree").bind("open_node.jstree", function (e,data) {    /// Make sure it is not the parent node     if(data.args[0].attr("id") != parentId) {      // Get the current node                      var thisNode = $j('#'+data.args[0].attr("id"));                     /// This makes sure that it does           /// not load the childeren more than once                      if(thisNode.find('li').length == 0) {                       /// Load all the child nodes                         loadNode(data.args[0].attr("id"));                       }  }       })
Then I also delegated the click of links (record names) within the tree to open up the record they represented in a new window.

//////////////////////////////////////////////////    //    // Setting up the link to the object on the label     // of a tree node    //    //////////////////////////////////////////////////   $j("#tree").delegate("a","click", function (e) {        /// Dont open a window for ultimate parent    if($j(this).parent().attr("id") != parentId) {         window.open("/" + $j(this).parent().attr("id"),"mywindow","status=1,toolbar=1,location=1,menubar=1,resizable=1,scrollbars=1");    }  }); 
Finally when it is all done I call the “firstNodeLoad” method to kick it all off.
//////////////////////////////////////////////// // // Load the first node on window load // ////////////////////////////////////////////////  window.onload = firstNodeLoad;

All I had to do now was include this component in a Visualforce page. You will see that we call the "lazyLoadingTree" component and then pass into it the attributes required to render the tree. This component could be called on any object that had a child/parent relationship with itself.

Then include that page in a standard page layout and I get this pretty little tree that loads “lazily”.

Hopefully this was helpful. It was my first time working with jsTree and I am a bit of a jQuery hack. As always would love to hear any feedback/suggestions. Thanks again to Pat Patterson for putting the toolkit together as well as CloudSpokes for putting on some fun challenges!

You can download the code in its entirety here.

Friday, May 20, 2011

Why I CloudSpoke

Daniel Llewellyn
Guest Blogger: Daniel Llewellyn

Dan (aka Kenji776), our most recent contest winner for his entry in the CloudSpokes Scoreboard Challenge, has graciously volunteered on twitter to join our ridiculously talented series of guest blogger entries.

Dan, who hails from Minnesota, works with Apex, Visualforce, Coldfusion, SQL, lots of Javascript hacking, and has been known to play with some C# here and there.  He's put together an excellent perspective post on his experience with CloudSpokes, it's too good to not share!

When my boss first gave me a heads up about this cloud coding contest called CloudSpokes, and told me I should compete I thought he was crazy. Who would pay real money to let a bunch of nobodies write code for them? I mean if you want code written you hire a contractor and lay out spec and work with them until completion. How could you get quality results from crowdsourcing? Also, I figured it would be a waste of time because I’m no programmer. There would be real pros there, I’m just some wanna be hacker. Sure I’ve played with some different things, and can be clever time to time, but there was no way I could square off with people who really know what they are doing. Still, I decided to check it out, just to be a good sport. It was my boss who told me to take a look after all.

I signed up and started looking through the challenges, “nope, nope *scroll scroll scroll*, nope”. I don’t know how to do any of this. What the hell is ruby on rails? I don’t know how to write objective C, I can’t write an iPad application. Was looking pretty out of my league. Then, one challenge caught my eye. “Jailbreak Chatter” it said. Excitedly, yet pensively I clicked the link and waited impatiently for it to load. What was this? They want to “hack” Salesforce to allow custom content. This was a challenge I could sink my teeth in to. Back in the day I prided myself on bending and breaking systems, Salesforce itself seemed like a worthy competitor. I mashed the register button immediately.

The next several hours were a blur. Now I had a challenge, and to me, my pride was on the line. I didn’t even care about the money. Now it was me vs the system and a panel of judges watching. I said I was going to do this, so I damn well better do it. I tried all the classic attacks for injecting code, clever syntax, url tricks, even directly modifying the post data. Salesforce had it covered. Their validations were too good. It was clear I was going to need to think a bit outside the box here. Eventually I came up with my javascript injection technique that won me second place. When the word came down I could hardly believe it. Me, some idiot who hardly feels like I know what I am doing manged to take second place in a contest between some of the more prominent programmers in the cloud computing arena. I felt validated. Maybe I could do this? Maybe I am good enough? I told my boss that I had placed. He sent an email to the company letting them know. All day I received congratulations and pats on the back. I was hooked.

That is why I compete. It’s not about the money. It’s not even really about the technology. For me it’s a form of validation. To know that I can run with some of the best. That I can solve problems others can’t. To know that I am at the cutting edge and pushing it further. Of course I love problem solving and the friendly competition, learning new stuff and making a bit of cash. Really though the best part is just the challenge itself. Maybe it’s all inside my head, but that’s good enough for me.

PS and for the record, it turns out the crowd is great for the cloud. The results that I’ve seen and have been amazing. Maybe it’s due to a bit of a shared mindset about pride being on the line, but the entries are always top notch. As an article I read about this topic the other day said “It’s not about the worst submissions you get, it’s about the best ones” or something along those lines. One awesome entry can totally make up for a bunch of mediocre ones and this particular community is amazing. So I humbly admit I was mistaken. The cloud-crowd owns.


Kenji776 Crushes the CloudSpokes Scoreboard Challenge

You may have read that we were the scoring platform for the $25,000 DocuSign Hackathon held last weekend. When we agreed to run the competition we realized that we needed some type of scoreboard to display messages, teams and winners. So Dave and I brainstormed ideas and put together a time-sensitive challenge for the community to build the scoreboard for us (honestly, we really aren't lazy). The community came through with 5 great submissions! We are awarding first and second place money for this challenge.

The requirements for the Dynamic Scoreboard for CloudSpokes challenge where pretty detailed and in-depth:

The scoreboard app will be written in HTML5, jQuery or Ext JS and read configuration data from an XML or JSON file in the current working directory.The scoreboard will have multiple display states based upon the stage of the competition and load data from an external file. The app will read configuration data from an XML or JSON file in the local directory and refresh it every 5 seconds to check for changes and updating the view accordingly. This time period should be configurable.

Kenji776 totally crushed this challenge... in record time. So not only does he take home $2000 for first place but also an additional $250 for the first acceptable solution. Mural finishes second and receives $750. Congrats to all everyone that participated! Here's the accompanying video that Kenji776 submitted:

Unable to display content. Adobe Flash is required.

Thursday, May 19, 2011

"Checkin' In" our iPad Challenge Winners!

We're thrilled to announce the winners of our iPad Account Checkin App for Salesforce.com!  As a refresher on the specific challenge details, the object of this mission was to leverage Force.com / OAuth / iOS / and the awesome code from our previous Geolocation Toolkit challenge to create an iPad app to allow users to “find” and “check-in” to nearby salesforce.com accounts.

joeferraro won our second place prize of $2000 with his submission,

and superfell took first place (also $2000) with his entry!

Wednesday, May 18, 2011

You are the Power of Crowdsourcing

Nick Hamm
Guest Blogger: Nick Hamm

Continuing our guest blogger series, we just can't help but "crowdsource" this excellent post from Nick Hamm over to the CloudSpokes blog.  Nick addresses what crowdsourcing is, and how to do it right.

Nick is the former chief tech guy for Infowelders and now a solutions architect for Appirio.  He's also a vocal proponent for CloudSpokes on twitter.

Crowdsourcing is by no means a new concept.  It has been applied, both successfully and unsuccessfully, to a wide variety of tasks and applications over the last several centuries.  Yet there still remain naysayers who claim that the crowd is dumb and that you can't get quality results from unwashed masses of people.  I hope to dispell some of the myths and FUD around crowdsourcing by talking about how it can be harnessed for the beneift of both the sourcer and the sourced.

The term "crowdsourcing" is fairly new, comprised of the combination of "crowd" and "outsourcing".  Its practice has taken many forms and structures, some of which have better outcomes than others.  Before delving into the use of crowdsourcing, it's important to distinguish what I see as two primary uses - generally unskilled bulk tasks that can be tackled collaboratively by masses of people with little direction, and finite technical tasks that require specialized skills.  These are not the only two uses; there are many other uses for crowdsourcing as well that you may not realize you already use.  Ever ask a question on Twitter, Quora, or a public message board to help solve a problem?  That's crowdsourcing.  Ever contributed to an open source software project?  That's crowdsourcing, too.  For the purposes of this post, I'll focus primarily on finite technical tasks requiring specialized skills.  Why?  Because this is where I see the most promise and potential for harnessing the power of crowd intellect to solve problems.

If you follow me on Twitter, you have no doubt seen many tweets regarding CloudSpokes, a community of cloud developers who compete in sponsored development competitions for money, badges, and bragging rights.  Almost every competition hosted here has had at least one, if not multiple, submissions that met or exceeded all of the requirements.  Based on crowdsourcing naysayers, you would not expect this to be the case.  If the crowd is dumb, Cloudspokes would be getting a bunch of junk code and in the end would not be solving any of the problems they set out to solve.  Why is this not the case?  There are several reasons:
  • If you expect quality results, it is critical to give quality guidance and instructions.  This is true of any task, and working with the crowd, or any other outsourced workforce for that matter, increases the need for clarity in direction.
  • Make the pay-off equivalent to the commonality of the skill sets needed to produce the output.  If you are offering $500 for an integrated mobile application that uses 3 different APIs and needs to work on multiple platforms, you're not targeting the right segment of the crowd.  It's unlikely that a large portion of your crowd will have the experience needed to pull off something that complex, and the ones that do aren't going to do it for $500.
  • The crowd is made up of individuals with a diverse set of experiences and skills - play to those strengths.  The power of the crowd in this example really lies in the skills of each individual, not the collective skills of everyone combined.  There is no implied collaboration between contestants, so the results are as diverse as the people competing.  This means that your results will be as good as your BEST contestant, not as bad as your worst contestant.  This is a common misconception of crowdsourcing, and one that lies mainly in the control of the crowdsourcer.
  • Foster your crowd and they will accomplish great things for you.  The gamification of crowdsourcing is another way to keep your crowd engaged, retain quality community members, and bring new members into the community to make them feel connected.  Using the crowd as an unidentified workforce is a recipe for trouble.  While the crowd members are not your employees per se, you must treat them with respect and reverence.  After all, they are performing services for you that are hopefully adding value to your business.
The wisdom of individuals is not normalized with this model - in fact it is amplified to let the cream of the crop rise to the top.  Every day we are seeing many new applications of crowdsourcing used to reduce the time and investment needed to deliver discrete solutions.  But in the end, the success of these initiatives depends on the knowledge of the crowdsourcers and you the individual, the true power of crowdsourcing.

CloudSpokes Scores the 2011 DocuSign E-Sign Hackathon!

This weekend the CloudSpokes team was extremely excited to be given the opportunity to showcase our framework to support hackathons at DocuSign’s E-Sign Hackathon, part of their 2011 Summit. Using CloudSpokes to run hackathons is something we’ve been experimenting with for some time now for two very simple but powerful reasons:

  1. There is currently no solution (or none that we know of!) to manage hackathons - Hackathons are by nature organized chaos, but that doesn’t necessarily mean they have to be managed using excel spreadsheets and email. By using CloudSpokes, DocuSign was able to double their list of judges, as some were unable to meet schedule conflicts and be there in person. The hackathon was completely run in the cloud, allowing all involved to focus on the hackathon, and the code

  2. CloudSpokes provides an excellent platform to facilitate a hackathon - CloudSpokes challenges are in many ways virtual mini-hackathons. To expand CloudSpokes’ functionality to manage a hackathon was an easily digestible task, would help fill a need in the dev community, and would obviously help give CloudSpokes more exposure amongst our peers.  This was really a no-brainer for the team
Our new CloudSpokes Hackathon Framework provides a publicly accessible way to support teams, team leaders, team images, app submissions, judging, scoring, and has a dynamic scorecard to announce winners. Hackathons-as-a-Service? Sure, why not!  

Overall we were thrilled to be a part of what turned out to be a superbly run Summit and Hackathon. All credit to Mike Borozdin, DeVaris Brown, Julia Ferraioli, and the rest of the DocuSign dev team for putting on a killer show. The category winners were all fantastic.  One of our personal favorites amongst the finalists was the Kindlegraph, by Evan Jacobs.

Congrats to all involved!

Below is a quick CloudSpokes highlight video from the announcement dinner:

Tuesday, May 17, 2011

5 Twilio SMS for Force.com Winners! W00t!

Our Twilio SMS for Force.com challenge was a great success with 13 registrants and 5 winning code submissions. Unfortunately, with success comes the actual judging of the submission which is a time consuming process. Fortunately, most contestants submitted unmanaged packages (thank you!) and videos detailing their entries.

All of the winners met the challenge requirements (for the most part) but a few bells and whistles made the difference. Developers stored the Twilio account configuration in either a custom object or custom settings and they used a Force.com Sites page to listen for messages from Twilio.

We are awarding $1500 for first place and $500 each for both second place finishers.

Fourth Place - Techtrekker's entry met all of the requirements but he was hindered by the fact that he couldn't actually use Twilio since he is located in the UK. He mocked up the Twilio returns to make the most of his app. Great effort with tools available to him.

Unable to display content. Adobe Flash is required.

Third Place - Kenji776 had the best looking app of the bunch. It looks very slick and could easily be converted to a successful managed app for the AppExchange. The only problem was that the judges couldn't get the opt-out functionality to work using the Twilio test account. Kenji776 also stores the geo location info from each received message, included a workflow rule that informs the contact of a name change and makes debugging easy by writing to an error log object.

Unable to display content. Adobe Flash is required.

Second Place - Both chriswoolcott and clintslee tied for second. They both had great submissions with detailed instructions, setup guide and commented code. Clintslee's submission worked for both Contacts and Leads and also included a setting to append the Twilio sandbox pin to outgoing messages.

Clintslee's video below is a little hard to view so you might check out a larger version here

Unable to display content. Adobe Flash is required.

First Place - TehNrd's entry edged out everyone with some really cool additional features. He included the functionality to receive an email notification whether the outgoing message was delivered successfully, failed or both. His outgoing message status is initially set to "queued" and then is updated by Twilio based upon the actual delivery status. He also used "Inbound" and "Outbound" recordtypes for different page layouts and buttons. He included a "Resend" button for failed outbound messages and a "Reply" button for inbound messages. There is also a really nice "View All" features that displays the entire conversation in an iphone-ish view of the conversation.

TehNrd included both a short and long versions of his demo but I've embeded the long version below. Make sure to watch it! This is his third winning challenge.

Monday, May 16, 2011

Home Security "MacGyver-style" with Twilio and Arduino

Acorv wins our first Twilio sponsored challenge, Getting Physical with Twilio, with a super cool Intruder Detection mashup with Arduino and Twilio SMS. In Acorv's own words:
"I've developed a simple alarm system. It uses a webcam for input and the Twilio REST API for notifications. Using VLC media player, the system captures webcam input at regular intervals. With basic image processing, it detects changes on the surveilled scene. When a change is detected, the system saves every captured frame for a period of time. Saved frames are encoded into a short video. The video is made available through a website. Using the Twilio REST API, an SMS is sent, notifying the incident and providing a link to the online video. When the SMS is received, the user can view the video and decide whether it's a false alarm or a real intrusion."
This is our first Twilio sponsored challenge and we were waiting for their announcement and notification to Acorv before announcing the results of the challenge. Acorv came second last week with his Facebook Scoreboard Application, so he's definitely on a roll.

Intruder Alert from acorv on Vimeo.

Wednesday, May 11, 2011

CloudSpokes Challenges to Support Google I/O

Google I/O is in full swing today with a ton of great announcements. With all of the excitement, sessions and new products swirling in the air, we almost forgot to turn off the live stream and get some work done.

Never fear, in the true spirit of Google I/O, we launched three challenges in support of the event. (More may be coming so be sure to check back.) This gives you a chance to participate in new technologies even if you aren't physically at I/O. In addition, the prize money doesn't hurt either.

Android Task Manager for the Google Tasks API - Create an Android application that uses the Google Tasks API to manage all of those things that keep us busy throughout the day. The app will use JSON for data representation and OAuth2 for authentication. The only other requirement is that the app provides the functionality to query, manage and sync a user’s tasks and task lists.

Google Meeting Inspector Gadget - Develop a "Meeting Inspector" calendar Google gadget. This is used to give calendar power-users additional insights into their events, particularly recurring events. The gadget must be an HTML-type gadget, Use 3-legged OAuth and be displayed anytime a user has selected a meeting, either by clicking on it, or while editing/viewing it.

Google Support Bot - Build a virtual helpdesk operator, who will redirect support questions to an available helpdesk agent that a user might pose over XMPP (e.g. from Google Talk). The app must be built in AppEngine (Java or Python) and an admin page to assign a user as a helpdesk agent must be included.

Get started in one of these challenges today to build up your resume and make some cash. The total prize money for all three challenges is nearly $5000!

Tuesday, May 10, 2011

CloudSpokes to "Score" DocuSign's $25,000 Hackathon

Do you like coding up awesome solutions in a room with other innovators while a DJ spins some music in the background? Want a chance at up to $25,000 USD in cash prizes? Will you be in the San Francisco Bay Area on May 14th and 15th?

If you’ve answered yes to any of these questions then join us at the DocuSign Hackathon! Hang out with other entrepreneurs, developers and systems integrators as you hack the weekend away for fun, food, cash and prizes.

The CloudSpokes team will be there actively participating in the hackathon. DocuSign will be using the CloudSpokes site as the submission and scoring platform for the hackathon so we'll be an integral part of the process. The cloud-based nature of the platform will allow judges to rate submissions even if they are attending virtually. All they need is a CloudSpokes login. All hackathon contestants must be physically located at the venue to compete.

You may have noticed our Dynamic Scoreboard for CloudSpokes challenge that is wrapping up today. The scoreboard application produced by this challenge will be used throughout the hackathon venue as well as during the awards process. It should be a great time so check out the hackathon site for more info.

Thursday, May 5, 2011

Why I Compete In CloudSpokes Challenges

Kyle Thornton

Guest Blogger: Kyle Thornton

We'd like to welcome our first guest blogger, Kyle Thornton! Kyle is a salesforce.com admin, an admitted math and computer science geek and an avid support of CloudSpokes.

Kyle has been involved in three challenges so far and recently won our Email Upload Chatter Pictures to Picasa challenge.

I was chatting with Jeff Douglas a few days ago and he mentioned that he is keeping quite busy lately with the rapid growth of CloudSpokes and that they are looking to revamp the site. I asked if there was anything I could do to help and Jeff asked if I could write a guest post for the CloudSpokes blog. Clearly I accepted.

Jeff asked me to write about why I compete in the CloudSpokes Challenges and what I get out of them, so here it goes.

I am currently the sole Salesforce.com Admin at my company and Salesforce.com has been here since 2003, so the company is fairly set in their ways and there are’t a lot of new ideas that pop up. This means I am often working on minor changes and building reports, which is fine, but I don’t really get to “spread my wings.” When I came across CloudSpokes I saw an opportunity to take part in some challenges that would allow me to try, and more importantly learn, new things.

So far I have entered two challenges. The first challenge was developing a Generic Related List for Salesforce.com. As I began to research this, I came across Dynamic Bindings and was able to use this new feature to complete my entry for the challenge. Had it not been for the challenge, I may not have ever had a chance to learn how to use Dynamic Bindings. I ended up coming in second place to TehNrd who put together an amazing submission.

The second challenge I entered was to send Chatter images to Picasa Web Albums. Before this challenge was posted, I did not even know Picasa could accept images via email, but as I looked into the challenge, it seemed interesting. I was able to dig into FeedItems and FeedComments a bit to understand them more (my company hasn’t really adopted chatter, as much as I try) and I also learned how to create and send emails, with attachments, using apex. I am happy to say that my submission was a winning entry.

Although I have only entered 2 challenges, CloudSpokes has proven to be a good starting point to dive into other technologies. I am interested in both Twilio and iOS development as well as Ruby on Rails and contests geared towards these technologies have sparked my interest in branching out. I have gained some rudimentary knowledge in all three of these areas and hope to learn more in the future.

For me, CloudSpokes is a way to find use cases which I would never come across in my day to day job. By investigating the use cases and taking part in these challenges, I have a way to learn new things which I would never have the chance to learn otherwise. Oh, and the cash prizes are nice too.

Calling for Guest Bloggers on CloudSpokes

Do you know the different between a dangling participle and an async callout? If so, we want you as a guest blogger on our CloudSpokes blog.

We are looking for community members that would like to write about crowdsourcing, their experience or thoughts regarding competing in CloudSpokes challenges, why they compete or perhaps detailed explanations of their contest submissions.

So if you crave fame and glory and have some time to kill, drop us a line at jeff{at}cloudspokes[dot]com and we'll get you set up on our blog!

Wednesday, May 4, 2011

Hola Pablo! Here are my Chatter Photos

Many companies use Picasa to manage their corporate photo album as it’s free and easy. However, a ton of great company photos are uploaded daily to Chatter. Wouldn’t it be great if photos posted to Chatter could automatically be sent to a company’s Picasa Web Album?

We thought it was such a great idea that we developed a challenge for it. Our Email Upload Chatter Pictures to Picasa challenge has ended and while we had a number of entries, only three made the cut. We are awarding $350 to first place and $150 $350 to second place. The judging for first and second was very tight and only an extra, non-requested feature made the difference. In the end knthornt slightly nudged out techtrekker for first place. Knthornt included the functionality to send the Chatter photo to a specific album within Picasa and this made the difference in the end.

Update: we've taken a second look at techtrekker's submission based upon a tweet from him. It also had similar functionality for handling albums. Therefore, we are going to award him $350 as well.

Congrats to knthornt for his winning submission! Congrats to techtrekker as well!

Monday, May 2, 2011

Winner - Lazy Loading Tree with the Force.com JavaScript REST Toolkit Challenge

Timothyainman's submission for our Lazy Loading Tree challenge more that met the requirements. He even included a Visualforce component for extra credit.

One of the problems with tree components is that they can quickly suck up query limits due to their recursive nature. Timothyainman's tree uses the JavaScript REST toolkit to load nodes in the tree as needed. When the Visualforce page loads, the tree component queries for and loads the first and second level nodes in the tree. Nodes with child elements display as a folder. Expanding a folder causes the tree to use the Force.com JavaScript REST Toolkit to fetch the next level of nodes and display them accordingly.

CloudSpokes Team is Heading to Glue!

So the CloudSpokes team is heading to Gluecon May 25-26 in Denver for some serious networking, promotional activities and other "work". The agenda looks #awesome and there are still ticket available.

This should be a great event as Glue is the only conference devoted solely to solving the web application integration problem-set. So if you are into things like APIs, web protocols and formats, open data sets, platforms and providers (PaaS, IaaS, etc), cloud storage, cloud management frameworks or identity and security then Glue is probably for you.

Dave, Allie and I will be roaming the conference in search of cool things but I've actually got some work to do during the conference. I'm part of the Keynote Panel on Wednesday (4:35pm - 5:15pm) with some other heavy-hitters in the industry:

Keynote Panel: The Evolution of Developer Ecosystems

Then on Thursday (3:15pm - 3:50pm) I'm leading a break session on crowdsourcing called, How to Effectively Crowdsource Cloud Development. I'm guessing that's right up my alley??

Glue should be a great time so if you are attending, please stop by and say "hi"!