Tuesday, January 31, 2012

Edit Salesforce.com Records Inline

Editing multiple records in salesforce.com can often become a tedious process. The use case for our Multi-Edit Salesforce Related List challenge was to help manage job applicants. A contact can apply for multiple positions and we wanted an easy way to manage the status of the applications. The requirements were to write a Visualforce page which implements inline editing and allows a user to edit multiple records in a related list format. Some great submissions from community members with some awesome code. Make sure you check out rubixtious' video for his submission.
Place: 1
Money: $1750
rubixtious - video submission
Place: 2
Money: $750
Place: 3
Money: $250

Monday, January 30, 2012

Automate Salesforce Administrative Tasks with Selenium

The salesforce.com Metadata API is a great invention. It allows you to script updates, synchronize changes between orgs and much more! Sadly, not everything in salesforce.com is updateable via the Metadata API. Nothing is more painful than setting field level security for 10+ profiles on 10+ custom objects.

We wanted to make the lives of countless administrators and developers more enjoyable by automating these configuration tasks with Selenium. So we ran our Automate Salesforce Config Changes with Selenium challenge and boy did we get the results. Three awesome ones to be exact.

Selenium automates browsers. That's it. You can record your button clicks in one org and then play them back in another org to produce the same results. As Selenium generates Java code, we wanted to make the challenge even more fun, so we thought it would be cool to make this process repeatable by scripting it with ANT.

peakpado  - video submission
Place: 1
Money: $1000
jordanbaucke  - video submission
Place: 2
Money: $1000
Place: 3
Money: $250

CloudSpokes Google+ Hangout - 9am EST 1/31

We'll be holding another CloudSpokes "Hangout" on Google+ tomorrow, Tuesday January 31 from 9am-10am EST. Feel free to stop by and meet the gang, inquire about challenges, ask questions about how things work or just hangout.

On Google+ make sure you add Jeff Douglas and David Messinger to your circles and we'll add you as well. At 9am we'll send out the invite to your stream but you also might want to follow @cloudspokes on Twitter as we'll be blasting out info there as well. You can also search for Jeff or Dave by name in Google+ and any hangouts that are currently active will display on their pages.

Look forward to hanging out together!

Friday, January 27, 2012

CloudSpokes Public Scorecard & Submissions

We recently roll out our January release at CloudSpokes and with it comes the functionality to view participant scorecards and submissions. In the spirit of learning and openness, this is something that we've wanted to do for quite awhile.

We've changed the look of the challenge winners page so that it displays all of the members that submitted entries for the challenge and each of the scorecards for the participants that the judges submitted. Also, if you submitted a valid entry for a challenge, you will be able to view and download the other submissions.

Scorecards may not be available for some older challenges due to migration issues or other factors but challenges that closed this year should have them available as well as all challenges going forward. We are encouraging judges to provide more feedback to make this process more valuable.

Friday, January 20, 2012

Double the Prize Money for our Amazon DynamoDB Challenge

We launched our Build an #Awesome Demo with Amazon DynamoDB challenge yesterday and it's gotten a lot of attention so far. As an extra incentive to see what types of applications we can build, we are doubling the prize money for the challenge from $500 to $1000.

The requirements for the challenge are very simple.... build the coolest application you can using Amazon DynamoDB and the technology/language/platform of your choice.

Wednesday, January 18, 2012

Demo - How to Get Started with Amazon DynamoDB for CloudSpokes Challenges

This morning, Amazon announced Amazon DynamoDB, their Internet-scale NoSQL database service. Back in November we were fortunate enough to be invited to participate in a private beta for Amazon DynamoDB. We’ve since then had some time to “work it over” a bit and have put together a demo application to show off some functionality. The code is posted at our GitHub repo for your forking convenience.

We are very excited about the possibility of using Amazon DynamoDB for a few services at CloudSpokes so you can plan on seeing some really cool CloudSpokes challenges in the near future.


The API is very straight forward and easy to work with. If you’ve used other NoSQL databases then you should have no problem wrapping your head around Amazon DynamoDB. It has simple storage and query methods, allowing you to store and access data items with a flexible number of attributes using simple “Put” or “Get” web services APIs. Amazon DynamoDB provides a native API for HTTP and SDKs for Java, PHP and .NET. More are reportedly in the works.

What is Amazon DynamoDB and why would I want to use it?

Amazon DynamoDB is a fast, highly scalable, highly available, cost-effective non-relational database service that scales automatically without limits or administration. This service is tightly coupled with Amazon S3 andAmazon EC2, collectively providing the ability to store, process and query data sets in the cloud.

If you have massive amounts of highly transactional data then Amazon DynamoDB might be for you:

  • Store Social Graph data for processing
  • Storing GPS data for devices
  • Data storage for Hadoop processes
  • Record user activity logs
  • NFC processes
  • Recording clicks for A/B testing

Blazing Fast - Amazon DynamoDB runs on a new solid state disk (SSD) architecture for low-latency response times. Read latencies average less than 5 milliseconds, and write latencies average less than 10 milliseconds. We found our applications to be extremely responsive.

Hands Off Administration - Amazon DynamoDB is a fully managed service – no need to worry about hardware or software provisioning, setup and configuration, software patching, or partitioning data over multiple instances as you scale. For instance, when you create a table, you need to specify the request throughput you want for your table. In the background, Amazon DynamoDB handles the provisioning of resources to meet the requested throughput rate.

Auto Scaling - To continue with the “no administration” theme, Amazon DynamoDB can automatically scale machine resources in response to increases in database traffic without the need of client-side partitioning. Alternatively, you can also proactively manage performance with a few simple commands.

Security Baked In - Amazon DynamoDB is integrated with AWS Identity and Access Management (access keys and tokens) allowing you to provide access to defined users and groups, assign granular security credentials and user access, much more.

Centralized Monitoring - As with most everything in AWS-land, you can easily view metrics for your Amazon DynamoDB table in the AWS Management Console. You can also view your request throughput and latency for each API as well as resource consumption through Amazon CloudWatch.

API Overview

From a high level, Amazon DynamoDB API provides the following functionality:

  • Create a table
  • Delete a table
  • Request the current state of a table
  • Get a list of all of the tables for the current account
  • Put an item
  • Get one or more items by primary key
  • Update the attributes in a single item
  • Delete an item
  • Scan a table and optionally filter the items returned using comparison operators
  • Query for items using a range index and comparison operators
  • Increment or decrement a numeric value

Data Model

Amazon DynamoDB stores data in tables containing items with a collection of name-value pairs (attributes). Items (anaglous to a record) are managed by assigning each item a primary key value. Unlike traditional databases, the table is schemaless and only relies on the primary key. Items can contain combination of attributes. For example:

"Name" = "Member Search with Redis"
"ChallengeId" = 1219
"Categories" = "aws", "ruby", "mobile"
"Ratings" = 17, 36

Primary Keys & Indexes

When creating a new table, you define the primary key and type of key to be used. Amazon DynamoDB supports a one name/value pair primary key (a hash primary key; string or number) or two name/value pair primary key (a hash-and-range primary key) for index values.

Hash key example: "ChallengeId" = 1219
Hash-and-range key example: "MemberId" = "romin", "MemberNumber" = "976"

Note: the Query API is only available for hash-and-range primary key tables. If you are using a simple hash key, then you need to use the Scan API.

Data Types

Amazon DynamoDB supports two scalar data types (Number and String) and multi-valued types (String Set and Number Set). Everything is stored in Amazon DynamoDB as a UTF-8 string value. You designate the data as a Number, String, String Set, or Number Set in the request but there is no distinction between an int, long, float, etc. For example:

item.put("member", new AttributeValue().withS("romin"));
item.put("challenge", new AttributeValue().withN("1219"));

Amazon DynamoDB supports both Number Sets and String Sets:

 "members":{"SS":["kenji776, romin, akkishore"]},
 "wins" : {"NS":["14", "10", "8"]}

Amazon DynamoDB uses JSON as the transport protocol. However, the JSON data is parsed and stored nativly on disk.

That’s a quick overview so make sure to check out the DynamoDB documentation for more details. The documentation is very well done and has clear instructions and code samples for Java, PHP and .Net. If you are into database performance, check out the details on provisioned throughput, data consistency, conditional operations, performance factors and more.

How to get started?

Sign up for a new AWS account (if you don’t already have one) and get your AWS Access Key ID and Secret Access Key from your account’s security section. Walk through their Getting Started Guide for samples. In your code, just add your credentials to the AWSDynamoDBClient and you are ready to start making requests. All of the API calls are pretty straightforward and work as you would expect them to.

Pricing is, again, pay as you go but Amazon DynamoDB is part of the AWS’s Free Usage Tier so check it out for more info.

Friday, January 13, 2012

Heroku's Waza - Calling All Application Developers

We had an awesome opportunity to attend Heroku's first developer event, Waza, on Wednesday. As defined, Heroku's Waza is "a free developer event for the study of technique". "Technique" was also the password for the wireless - fun stuff.

Waza had a precisely tuned focus on the developer experience. Perhaps they used the Feynman Problem-Solving Algorithm to address their main goal, which was obviously something close to "set the standard for developer events". Adam Seligman and team outdid themselves.

In the keynote, founder Adam Wiggins touched on a topic that is key to the CloudSpokes community.  He mentioned that there's a difference between application developers and programmers. While partly a semantic argument, the differentiation he brought up was that on one hand, you have app developers who are working in a real world environment for a real world experience. On the other hand, you have ivory tower programmers, usually centered solely on a single language and far removed from the customer experience. Heroku's founders have mentioned before that they believe the new PaaS-driven cloud development world is ushering in a new kind of polyglot app developer. While careful not to dismiss the value of pure programming, Wiggins encouraged developers to not work in an ivory tower (and not to miss out on connecting with the excellent crowd as the priority over the sessions, which were being recorded), as he closed his remarks.

While we were unable to attend every session, we'll post the recordings from our favorites as soon as they're available. Some notes from some of the talks we did catch:

Morten Bagai, Heroku PM: "The Cloud Services Revolution"
  • The evolution: Agile --> PaaS --> Cloud Services...
    • The value to the cloud is the service - some community of experts committed to making this solution work for you
    • There's a difference between running something in the cloud, and having a cloud service
    • App Devs need to be able to focus on the app, using the service, not scaling and maintaining
    • Cloud Services are built for developers, designed to make your life better
  • Why is this significant now?
    • We've had IaaS for a while now, but not quite in this way
    • 5 years ago, it was the G Drive, for example. Service was a support contract. Scale meant adding more boxes
    • Now with AWS leading the way, you have a shared, worldwide, low-latency infrastructure with low ping times - all in the same cloud
  • What does the future hold?
    • A way to measure the quality of a cloud service, similar to how you can rate your experience in an ecommerce environment

Corey Haines, Facilitator, Coderetreat: "Effective Development From Full-page Refresh to Real-time Interactions"

  • Deploy on Day One
    • Every minute you're not deploying is a minute you're not getting feedback from users
    • Cut down the feedback cycle
    • As you develop, get it infront of the customer - you want to have the ability to quickly see if what you're building is what you should be building
  • The Feynman Problem-Solving Algorithm:
    • 1. Write the problem down
    • 2. Think hard
    • 3. Write the solution down (that's a lot of what coding itself actually is)
    • There's often controversy about whether to code, think, wait, etc
    • What's missing from the Feynman Algorithm: 4. Repeat!
    • And the key here, is to do this as fast as possible
  • "The 5 Whys"
    • "I want XXX"
    • Why?
    • "Because XXX"
    • Why? (Obviously this is an annoying exercise, but fundamental)
    • By constantly asking yourself why you're building this first, or adding this feature in that manner, and continuing to ask until you get to the real root of the problem, you force yourself to address your problem correctly without bias
    • For fancy new "shiny objects" (new tech), have your side projects and hobbies. For your real world apps - do what's right and do what works

Here at CloudSpokes, we're very excited to be at the forefront of this new shift in enterprise development. We agree that the application developer, who can leverage many different languages and quickly solve business problems, is the future. Therefore we gear our challenges towards multi-language attempts at real-world solutions, where speed and efficiency are key, and the ultimate end goal is a seamless user experience.

As Morten states above, cloud services is the next evolution of development, and we wholeheartedly agree. We believe in services, and often look at CloudSpokes as a service to our community members and sponsors. This community rebuilt our entire site using services, and it's something we're extremely proud of.

We're also obviously big fans of Heroku, and highly recommend checking out any of their future dev events and our Heroku challenges.

Thursday, January 12, 2012

Salesforce 2 Salesforce "Data Dumper" & Obfuscator

We wrapped up or Salesforce 2 Salesforce "Data Dumper" challenge with 6 really cool submissions. It's too bad that we only had first and second place prizes as the submissions were really good! If came down to specific functionality for the tasks. We really liked elukaweski's submission as it was well documented but some of the other entries had more bells and whistles.

One of our frequent tasks at CloudSpokes is to spin up Force.com Developer orgs for challenge participants to use during a specific challenge. We typically use ANT to install code and configurations but importing data is always a chore. We wanted to build a tool that runs on a local machine or in the cloud that takes data from a source salesforce.com org and dumps it into target salesforce org.

The salesforce Data Loader performs these tasks but we wanted a few little tweaks. The tool allows you to specify multiple objects, the fields to query for each object and the credentials for both the source and target orgs. We also wanted to have the ability to obfuscate specific field data. For instance, when dumping data from production to a developer org, we typically change email addresses to something like “noemail@cloudspokes.com”.

Place: 1
Money: $2500
Place: 2
Money: $1000
Place: 3
Score: 85
Place: 4
Score: 75

Sgurumurthy's Video Submission - view full screen

Unable to display content. Adobe Flash is required.

Hirday's Video Submission - view full screen

Unable to display content. Adobe Flash is required.

Tuesday, January 10, 2012

Offline Mobile Account Maintenance with jQuery Mobile & Google App Engine

Mobile apps are awesome but what about those times when you don't have service? We wanted to build n CRM app that works seamlessly no matter if you are online or not.

Once again akkishore delivers big for our Offline Mobile Account Maintenance with jQuery Mobile challenge. The task was to build an offline-capable, mobile HTML5 application that provides for Account and Contact management. The application would utilize jQuery Mobile to provide a native iPad / tablet look and feel in a browser. The offline capabilities needed to leverage “local storage” within the browser, and include the marshaling of data between the application and a datastore.

Akkishore used Google App Engine for his back and his video shows some really cool functionality. To the end user, they never really know (or care) of they are currently online or not. The application still works the same. Great job!!
Place: 1
Money: $2000

Thursday, January 5, 2012

Mobile Lead Conversion for Salesforce

Mobile! Mobile! Mobile! Everyone wants to be away from the office but still be able to conduct business. We spun up our Mobile Lead Conversion for Salesforce challenge with this need in mind. We wanted to allow busy salespeople to be able to convert leads while at the golf course, walking the dog, getting a mani-pedi or wherever.

The challenge was to write an HTML5 mobile lead conversion app using jQuery, Sencha Touch or PhoneGap for salesforce.com using their new Mobile SDK. The application simply displays a list of leads on the user’s phone/tablet and allows them to quickly convert a lead to an existing account or a new account.
Place: 1
Money: $1500
Place: 2
Money: $500

Abhar's video submission

 Andyj24' video submission. View full in a new window.

Unable to display content. Adobe Flash is required.

Here it is! An FTP Service for Google App Engine

FTPing files using Google App Engine is not the easiest thing to do given some of the platform's restrictions. Socket connections are not available and you must use URL fetch instead. We want to come up with the best way to accomplish the task of uploading and downloading files with App Engine.

Here's the use case for our challenge. Let's say you have an App Engine application that generates an XML, text, or PDF files, based on Datasource inputs. The challenge is to send this file to an FTP server. Also, the FTP server on occasion has files that the application needs to pull down and store in Google's.

Luckily wcheung hates martians and reindeer enough (you gotta watch his video!!) that he came up with a solution for our FTP with Google App Engine challenge.

His entry writes items into Big Table and then uses an FTP proxy that he wrote on Heroku to send files to an FTP server. He also uses the FTP proxy to download files from the FTP site into Big Table. Really cool solution! Congrats to wcheung!

Check out his submission video. Not only is it informative but its highly entertaining as well.
Place: 1
Money: $750

Wednesday, January 4, 2012

All your Badges are Belong to Us

If Gamification were only this easy. Collect a few badges and then become President. Everyone would want to be the President... right? #fail

Well at CloudSpokes we are adding badges and other gamification elements to our platform. We have selected a third party gamification platform to host our gamification elements. To interact with the platform we will need to create some tables and utilities to create, update and send the records to the third party platform.

We spun up our Gamification SFDC Toolkit challenge to build out the objects, utilities and Apex REST service needed for sending our gamification raw data. The results are in and pkuphenix wins his first CloudSpokes challenge.
Place: 1
Money: $1000
Place: 2
Money: $500

Create New Salesforce Employees with a Wave of your Wand

Everyone loves using wizards to fill out data. Users get to see only the fields necessary and developers get to determine the flow that data is entered. Everyone wins! If you like creating wizards, talking about wizards or just looking at pictures of wizards then you'll love the magical results from our Salesforce New Employee Wizard challenge.

The use case for this challenge is new hire data entry. When you onboard a new employee you want to collect data about them to be used internally. Our wizard creates contact records, multiple records for various related objects and finally upload attachments. All with or without a wand.

Apparently a lot of developers really like developing wizards as we had 8 submissions! We only chose the top three so make sure you check out
rubixtious - video
Place: 1
Money: $1500
Place: 2
Money: $500
hirday -  video
Place: 3
Money: $250

Tuesday, January 3, 2012

Be Social & Connect LinkedIn to Chatter!

We are back from vacations so it's time to get to work. If you've ever wanted to see the status updates of our LinkedIn contacts in Chatter than our LinkedIn Status Updates to Chatter challenge is for you.

LinkedIn provides an API to retrieve status updates and profile changes. This challenge asks you to allow a salesforce.com user to subscribe to a LinkedIn profile and to receive status-updates and profile-updates as Chatter feeds off that profile. Another excellent submission from avidev9. Make sure you check out his video to see it in action.
Place: 1
Money: $1000