Wednesday, July 27, 2011

Art Meets Text - A Mashup Love Story


Ever think you could make up a caption funnier than whats in the comic?  Thats the concept behind our Art Meets Text mashup challenge.

We're looking for cool submissions here because it will be used publicly to manage at least one non-coding contest in the next month.  

You can use any cloud platform we have worked with, but this one seems directly in the sweet spot of Rails developers.  Fun, Fame and of course $2600 in prize money all await!

Tuesday, July 26, 2011

Email from Apex : A Breakdown of my CloudSpokes Chatter to Picasa Entry

Guest post by Kyle Thornton:

I thought someone might find it useful to see how I approached my winning CloudSpokes Email Upload Chatter Pictures to Picasa entry a while back, specifically around how to send an email in Apex. This writeup has been cross posted on my blog which you can find here. I have been asked to refrain from giving the full code so you won't get the whole solution here, but it is available on this CloudSpokes GitHub repo.

The idea was to email a photo to a Picasa web album leveraging the "Upload photos by email" functionality whenever a keyword was found in the post. I won't go into this as Picasa appears to be getting engulfed by Google+ and I don't know how the setup will work going forward. Regardless, I leveraged two triggers, the first was on the FeedItem object and the second was on the FeedComment object. In each trigger I essentially looked for a keyword in the chatter post/comment, defined during setup, and if found, grabbed the picture from the post and emailed it to Picasa.

Jeff Douglas did a wonderful job of explaining this all, so I'll hand this over to him:



The important part that I want to share is how the email is sent. This is all handled inside a class which is called from either of the triggers. This is the definition of the SendEmail method. Not all of the parameters are needed to send an email, though they were necessary for this particular application.

public void SendEmail(FeedItem f, String description, String emailAddr, String keyword, Boolean AllowAlbumLoad){
....
}

First, you want to set up the basic message, setting the to address (which was passed in the emailAddr parameter), replyTo, subject (which comes from the post's title), BccSender(sends email to the person sending the email) and PlainTextBody (which isn't really used here).

Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
//Set email address
String[] toAddresses = new String[] {emailAddr};
mail.setToAddresses(toAddresses);
mail.setReplyTo('noreply@salesforce.com'); //the reply address doesn't matter
mail.setSubject(f.Title);
mail.setBccSender(false); //we don't want to Bcc ourselves on this
mail.setPlainTextBody('Body Text - This will not be utilized, picasa will not use it.');


Once the basic email is set up, you need to create the attachment, which in this case was pulled from the feedItem passed in.

Messaging.EmailFileAttachment efa = new Messaging.EmailFileAttachment(); //create the attachment
efa.setBody(f.ContentData); //set the body of the attachment to the Content Data
efa.setFileName(f.ContentFileName); //set the file name appropriately
mail.setFileAttachments(new Messaging.EmailFileAttachment[] {efa}); //attach to the email


At this point you have an email and just need to send it. You do this by leveraging the Messaging class.

//send the email
Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });

Monday, July 25, 2011

Come Help! Announcing Challenges to Rebuild CloudSpokes

Captain Coder?
Everyone wants to be a superhero... including this guy. Now is your chance! We are launching a number of challenges over the next couple of months to rebuild the entire CloudSpokes site on Database.comHeroku and other PaaS platforms. That's right... you may think it sounds ridiculous to let your members build your site for you, but that's how we roll. We're crazy about the crowd that way!

We launched CloudSpokes in February and the first 100 days have blown us away. Every day we are looking to build in more functionality as demands from members and sponsors grow. This is a process we've been planning for a number of months and now we can finally kick it off.

How are we going to go about doing this? Like everyone else, we are going REST and JSON for our applications. This will allow us to use web and mobile clients written in virtually any language. We are going to start out with challenges that build out the backend on Database.com. Then we'll start running challenges for the middle tier, web tier and finally mobile clients.

Plenty of Challenges for all Types of Developers

You're a rails guy? Great! We have challenges for you. Java is your "go to" language? Challenges abound for you my friend. Force.com developer? Ah... YEAH! We have loads of challenges in the hopper so make sure you sign up for notification of new challenges.

However, even though we'll be using Database.com for persistence we are fairly platform agnostic for the rest of the site. We may use Heroku for the front end, store images on App Engine, use Beanstalk to send email through Amazon SES or write a polling service on Cloud Foundry. That's the great thing about the cloud... we can quickly tie into the service that best fits our needs.

So if you are a Force.com developer (or want to become one!!), this is a great chance to sharpen your dev skills on some of salesforce.com's newest technologies and make some money in the meantime. Talk about a resume builder? You'll get streed cred for building one of the coolest sites using Database.com, Apex REST Services, Chatter API and much, much more.

Here are some of the challenges that we currently have running:

1. CloudSpokes Scorecard Service
Write an Apex REST service on Force.com for scoring of CloudSpokes challenge submissions.

2. CloudSpokes Recommendation Service
Write an Apex REST service on Force.com to allow CloudSpokes members to submit recommendations for each other.

3. CloudSpokes Challenge Service
Write an Apex REST service on Force.com with the functionality manage challenges including categories, prizes and reviewers.

4. CloudSpokes Participant Service
Write an Apex REST service on Force.com that allows members to register for a challenge and submit entries.

Friday, July 22, 2011

DocuSign Hackathon - Official Video

Back in May, we posted our quick feedback from being part of scoring DocuSign's E-Sign Hackathon at their 2011 Summit, using the CloudSpokes Hackathon Framework as the platform behind the scenes.

DocuSign just released their extremely well produced video, which has some great interviews with the participants and does a great job of capturing the energy at the event.

You can catch a quick CloudSpokes cameo at the 1:07 min mark!

Thursday, July 21, 2011

CloudSpokes Open Source Sweetness

The CloudSpokes team has the community bug. We're crowdsourcing everything - the redevelopment of CloudSpokesour promotional videos and our IKEA needs. We've got a fever and the only prescription is more cowbell community involvement.

A part of allowing communities to prosper is to give back. Whether it be your neighborhood or CloudSpokes, this principle still applies and we'd like to contribute apps and expertise to a set of collective knowledge. That said, we are finally ready to announce two exciting programs to help make it happen:
  1. Open Sourcing CloudSpokes Challenges
    First, we will be open sourcing many of the CloudSpokes challenges. Initially we will be open sourcing over 75% of the challenges that are not client or partner specific (i.e. those we control). Of the ones we're open sourcing, their challenges can be found on the CloudSpokes Open Source page with all of the code and assets here on github. Most of the challenges use the MIT license but you can find the specific license used on the details page of the challenge as well as in the "docs" directory in the individual github repos.

  2. Get Started with Open Source - No Administrative Cost
    CloudSpokes is open to any company - ISV or enterprise - to run contests on. We have a small administrative fee (to partly cover the cost of W-9 forms, payment processing, the platform, etc). For those interested in running qualifying open source contests, we are waiving fees for the first $5,000 of contests.
Our goal is to contribute as much back to the community as possible. We're doing this on a hunch that developers not only like money and recognition, but also receive some extra satisfaction knowing that their hard work can be reused to make someone's else's job easier. We think the open source model is the way to do that. Here are the challenges that we are initially open sourcing. More are sure to follow. Let's all get involved to make the (coding) world a happier, more productive place!

You can find the following projects at our GitHub account: https://www.github.com/cloudspokes:
  1. Twilio SMS for Force.com (blog | code)
  2. Facebook "Like Box" Visualforce Component (blog | code)
  3. OAuth2 with OmniAuth for Force.com & Heroku (blog | code)
  4. iPhone Admin Application (blog | code)
  5. Salesforce.com Org Chart (blog | code)
  6. Network Detection with Javascript (blog | code)
  7. Android Salesforce.com Admin Application (blog | code)
  8. Geolocation Toolkit (blog | code)
  9. Generic Related List Visualforce Component (blog | code)
  10. Chatter Profile "Jailbreak" (blog | code)
  11. Google Chat Bot Reminder (blog | code)
  12. The Cloudy Cloud Obfuscated Code Challenge (blog | code)
  13. Beat Jeff Douglas (blog | code)
  14. Lazy Loading Tree with the Force.com JavaScript REST Toolkit (blog | code)
  15. Type-Ahead/Auto-Complete Visualforce Component (blog | code)
  16. Opportunity Questionnaire (blog | code)
  17. Google App Engine Image Storage (blog | code)
  18. Ruby Social Network Status Updater (blog | code)
  19. Apex Metaphone (blog | code)
  20. Customer Portal Dashboard with Google Chart Tools (blog | code)
  21. Google Support Bot (code)
  22. iPad Event Management with SFDC (blog | code)
  23. Google Doc Exporter (blog | code)
  24. Reassign Google Docs Owners (blog | code)
  25. Visualforce Gauge Component (code)
  26. iOS Lead Management (blog | code)
  27. Google Sites Embedded gDocs Inventory (code)
  28. Android Task Manager for the Google Tasks API (blog | code)
  29. Email Upload Chatter Pictures to Picasa (blog | code)
  30. iPad Account Checkin App for Salesforce.com (blog | code)

Wednesday, July 20, 2011

Building APIs with Salesforce.com Apex REST Services

This post should probably have been titled, "How to get started building Apex REST Services for CloudSpokes challenges to help us rebuild our platform and put some money in your pocket ", but that was waaay too long. We want to enlist you again in our endeavors to rebuild the CloudSpokes site. Like most cool companies, we are using REST and JSON as well so that we can play nicely with virtually all platforms.

First of all, let me state that developing Apex REST services is not only fun but ridiculously easy. If you've used SOAP web services you'll love the new REST feature. I couldn't wait to see what our member could come up with. However, we launched a couple of challenges recently and were surprised that we received zero submissions. So I put on my thinking cap and spoke with a couple of developers who are agressive challenge submitters. Their comments were that the technology was too new, Developer orgs didn't have the feature enabled, there was no documentation and they didn't know how to get started.

Well, let my tell you my friend, I have solved all of your problems!

I've put a video together that shows you everything (yes, everything) you need to know to get started participating in our Apex REST challenges. The tutorial walks you through the entire process of building our Members service. It shows you how to structure your services (easy), how to use the new REST classes (easy), and how to use the Apigee Console for Salesforce.com to test your services (super-duper easy).  The Apigee console even handles the OAuth for you!! Why write your own Java or Rails client app to test your classes? Just use the Apigee console! I've even published the entire code for the Members service at github so you can use it as a template.

Salesforce.com held an Apex REST webinar yesterday (it should be available here any day now) and release a bunch of documentation and code examples. They even made the announcement that all Developer org would automatically be enabled with the Apex REST feature. So now there's no excuse not to get started!

Here's the video mentioned above but it might be easier to view it at Youtube in full screen.




So here's how you can get started:

  1. Sign up for a new developer org at developer.force.com. All new orgs are now enabled with the Apex REST services so you can get started right away without waiting for the feature to get enabled.
  2. Take a peek at the Force.com REST API site for tutorials, code snippets, webinars and documentation. You can even post questions to the message boards for quick answers to your problems.
  3. Watch this awesome video by our friends at Apigee entitled RESTful API Design: Teach a Dog to REST. We love the design principles.
  4. Watch the video above for a quick tutorial services and then check out the code.
  5. Install our package into your DE org to get started. It contains all objects, code and metadata you should need to begin developing for our challenges.
  6. Pick a challenge that you want to participate in.
  7. Use the Apigee Console for Salesforce.com as your client application and beginning writing your entry!

Better Know a CloudSpoker - Dan Llewellyn

Welcome to our second installment of our monthly series where we interview CloudSpokes members and see what makes them tick.

This week I interviewed Dan Llewellyn (aka kenji776) to see why this "young punk programmer" is tearing it up on CloudSpokes. Not only do we talk about the fundamentals of programming but we hit more socially relevant topics such as women and brewing beer.

Monday, July 11, 2011

Run Apache Cassandra in the Cloud with Cloudsandra

The CloudSpokes team is attending the Cassandra SF 2011 conference today with our buddies from Isidorey who are unveiling their Cloudsandra product. If you're not familiar with Cassandra you should probably start looking at it. Now.

Cassandra is an open source distributed database management system that is designed to handle very large amounts of data spread out across many commodity servers while providing a highly available service with no single point of failure. It'a NoSQL solution that was initially developed by Facebook to power their inbox search. It's elastic, durable, decentralized and fault tolerant.

We attended GLUE Conference a month ago and in a session by Matt Pfeil (DataStax), he stated a barrier to adoption was the fact that Cassandra is extremely difficult to setup and configure. Luckily the cloud makes this low-level administration obselete.  Isidorey has introduced a cloud version of Cassandra. Cloudsandra takes everything awesome about the Cassandra database management system, packages up the latest innovations from DataStax, and makes it all configurable and accessible via a REST API hosted on Amazon EC2.

In conjunction with the event, we've launched two challenges to get you started with Cloudsandra:

Anything Goes with Cloudsandra! - Create something cool with or for Cloudsandra. A movie about why Cloudsandra beats a relational datastore, an infographic about REST API access to your data instead of drivers, connect a mobile GPS logger to Cloudsandra, pipe database files to Cloudsandra for easy map reduce jobs, load Google public transit feeds into Cloudsandra, etc. The top 5 most creative and useful ideas when $100.

Cloudsandra Admin Console - Use the Cloudsandra REST API to create an Admin Console on any public cloud platform or a straight PHP solution is fine as well. The best solutions take home $750 and $500.

It's easy to get started with Cloudsandra. See the individual challenges for more details.

CloudSpokes Weekly - 07/04/11

Guest blogger, Romin Irani, made a recent suggestion to us that we consider putting together a weekly recap of the last week's Cloud news. We're all for promoting great ideas surfaced by the community (thanks Romin!) so we thought we'd give it a go.

This new series of weekly blog posts will be focused on the interesting nuggets of cloud information we come across during the week. This is by no means a capture of all the great things happening in this fast moving world, but it’s also not an auto-digest (paper.li) of random stories either. We hope this helps us all keep tabs on what’s going on in our industry.

During the week, should you come across a post worthy of being noted here, simply tweet it with the hashtag -  #spokesweekly  - and we'll add it to the recap!!



Friday, July 8, 2011

Testing Apex REST Services with Apigee Console

Since we are spinning up more and more challenges using the Apex REST service (like the Member Service and Challenge Service challenges), I thought it might be good to put together a couple of pointers on developing with it.

The first tip is that the Apex annotations only work with v22 of the salesforce.com Api. So you will receive an error if you try to save an Apex class like below.

@RestResource(urlMapping='/AccountService/*')
global with sharing class AccountRestSvc {

  @HttpGet
  global static Account getAccount(RestRequest req, RestResponse res) {
    return [select id, name from account limit 1];    
  }

}

In Eclipse, you'll need to open the associated XML file (in this case AccountRestSvc-meta.xml), change the API version to 22 and then commit the file back to the server.

Another tip is to use the Apigee console to test your REST calls. This tool is invaluable and make developing fun since it will do the OAuth for you. Check out the video below and then hop over to the Apigee console to get started.

The URL to use to call the REST service should look something like: https://[instance].salesforce.com/services/apexrest/[urlMapping]

Thursday, July 7, 2011

Let's Write Some Great (Apex) REST APIs

Over the next couple of months we'll be running a series of contests using the new Apex REST services from salesforce.com. We've already launched the CloudSpokes Member Service and CloudSpokes Challenge Service challenges with more to come!

This is your chance to get ahead of the curve since the Apex REST service is currently a developer pilot and somewhat difficult to get enabled (can take up to a week or two). So go ahead and get your Developer enabled for the Apex REST feature now in anticipation. You don't want to miss a challenge just because you #failed to get your org enabled in time.

Get your org enabled for the Apex REST service today!

Here's what you need to do. Send an email to cloudspokes@appirio.com with the subject "Apex REST Org ID" and your Org ID in the body. We'll shoot your info over to the Apex REST PM and get your org enabled ASAP.

Our buddies over at apigee have a great presentation on REST design best practices. In the presentation, Brian Mulloy starts with a typical poorly-designed API and iterated it into a well-behaved RESTful API. Check out the presentation for rules and advice on how to do REST right, including handling complex variations, pagination and API versioning. We love this video and the concepts!


Teach a Dog to REST from Apigee on Vimeo.

Reassign Google Docs Owners Winner - Romin

Romin wins another challenge taking home $1000! This time it's our Reassign Google Docs Owners challenge.

The challenge was to develop an Google App Engine app that takes a JSON list of Google Doc IDs and copies them and their existing permission settings to another provided Google Apps User account. Once copied, the App should return a JSON list of old and new Google Doc IDs.

Congrats to romin for the great entry and we look forward to more submissions!

Wednesday, July 6, 2011

Opportunity Questionnaire Winner -- Kenji776

There are a number of survey apps on the AppExchange but none of them are flexible enough to fit our needs. So we held a contest to build one!

Kenji776 produced the winning submission and he (again) takes home the $1200 prize for our Opportunity Questionnaire challenge. We like his solution so much we are contemplating tweaking the code and using it as part of our new scoring system on Force.com. It even comes with a nifty jQuery slider, Visualforce interface and reporting.

Great job by kenji776 as he rapidly ascends the leaderboard!

Unable to display content. Adobe Flash is required.

Tuesday, July 5, 2011

Announcing our first official partnership - Isidorey!

Today we’re excited to announce that Isidorey is helping launch our partnership program here at CloudSpokes by signing on as our first partner!

Isidorey provides a platform for connecting embedded mobile devices to the cloud - a natural fit for our mobile and cloud development focuses (not to mention that Kyle & team are great friends). We’re super impressed with what they’ve accomplished in short order. If you want to meet the team, Isidorey will be sponsoring the upcoming Cassandra Summit with a focus on their Cloudsandra platform.

Part of being a cross-cloud community means exactly that - enabling cross-cloud development and showcasing the power of the cross-cloud community. Roughly half of our challenges have some sort of cross-cloud integration, a natural way to develop the best solution in this new API-driven, hackathon, world.

By bringing in partners like Isidorey, we’re expanding the potential for what CloudSpokes can achieve in public cloud development. Isidorey has a fantastically creative team and we’re eager to see what interesting challenges their team brings to the table. We'll be launching the first set of Isidorey contests on July 11th during the Cassandra Summit with the Cloudsandra theme (it's free for developers, so register today and get a head start).

Stay tuned for more partnership announcements as we continue to add best-of-breed API providers and public cloud platforms to our partner ecosystem.

iPad Event Management for Salesforce.com Winner!

Acerbetti wins his second challenge with our iPad Event Management with Salesforce.com challenge for $750.

The challenge was to build a campaign manager to modify the status of the members on-the-fly. The app starts by asking for the user's saleforce.com credential and uses the OAuth protocol to authenticate with the server. Once the credentials are verified the user can choose the campaign from the list of active available in the org. The iPad screen is divided in two parts, on the left there are the basic details of the campaign and the associated statuses with the number of members for each status. The status cell also acts as a filter for the members visualized in the main part of the screen. The user can select the member to change the current status and the app will save the new status in saleforce.com. The user can also filter the current list using the search bar. The text is used to find record where first name, last name or email are starting with the input string.

CloudSpokes Weekly - 06/27/11

This new series of weekly blog posts will be focused on the interesting nuggets of cloud information we come across during the week. This is by no means a capture of all the great things happening in this fast moving world, but it’s also not an auto-digest (paper.li) of random stories either. We hope this helps us all keep tabs on what’s going on in our industry.

During the week, should you come across a post worthy of being noted here, simply tweet it with the hashtag -  #spokesweekly  - and we'll add it to the recap!!





Friday, July 1, 2011

Google Docs Exporter Challenge Results

We scored our Google Doc Exporter challenge yesterday and are showcasing the top four entries. The requirements were to create a website asking the user to log into a Google account and give them the option to export all docs, spreadsheets and presentations for the user. The application uses the Google Docs API and downloads all files as a single zip in the appropriate formats.

We didn't specify the platform for the challenge but the top four entries all chose Google App Engine. Three were written in Python and one in Java. Akkishore came in first ($1000), Romin ($500) in second and then Kenji776 and kzer95 tied for third.

One of the great things about this challenge was that Kenji776 stated that this was his first Google App Engine project and it was spurred on by this challenge! Awesome to see people using CloudSpokes to broaden their skills.

Akkishore (Python)



Romin (Java)



Kenji776 (Python)



kzer95 (Python)

Unable to display content. Adobe Flash is required.

$2K Challenge - Build a Dreamforce Mobile Party App


Dreamforce '11 is rapidly approaching and in the spirit of fun stuff, we'd like to create a mobile-friendly party app for Dreamforce attendees. There is going to be 25,000+ attendees at Dreamforce 11 this year and this is your chance. You can be a rock star with your name in lights (no... you won’t be onstage with Metallica) by building a kick-ass mobile app that thousands of attendees use to find out what “extra curricular” activities are going on at the event. Not only will you be featured prominently on the app but you’ll make a cool $2K in the process. Talk about showcasing your talents!

There is a bit of creativity required around this application, as the basic structure is very simple but the possibilities to make this a useful and fun application are limitless. Throw in as many bells, whistles and dangly things to make it appealing and attractive. The app with the most functionality and eye-candy wins!

This will be a mobile web app (no native apps!) that plays nicely with mobile devices (iPhone, Android, iPad, etc.) as well as standard browsers. The app will allow party planners to submit information surrounding a party and attendees to review local parties and get involved (review, register, see who else is registered, all synced to social media, etc.).

Check out the full details of the challenge and get crackin!!