Announcing Certification Rollout for Force.com Developers and Salesforce Administrators
by Jon Mountjoy on July 17, 2008 at 03:07 AM
- "It's easier to get funding for courses that are part of a certification program that a stand alone course"
- "[I was] overlooked due to the inability to really affirm my prowess with Salesforce.com"
- "That would be good for SFDC, their users and for my CV"
Community Update: Wiki Pruning, lots of Code Samples and IDE/Workbench/Google news
by Jon Mountjoy on July 15, 2008 at 07:46 AM
It's been far too long since the previous community update. To be fair, I have been doing a fair bit of traveling, mostly on the Tour de Force. Check out our videos from the Dublin event for a taste. In the interim we've released the awesome Google Data API Toolkit, and a new version of the Force.com IDE.
Besides the events, I've been doing a fair bit of blogging and learning about the platform. Right now I'm spending a lot of time pruning the wiki. I hope to make a few improvements, including making things a little easier to find. I've also started to use some of the wiki capabilities such as categories. So for example, here is a page of multimedia items on the wiki. It's not complete yet, but I hope you find it useful. Feel free to ping me about the wiki and any changes you would like to see (or not to see :-) ).
Enjoy the rest of this post, wherein I point to most of the new items that have appeared on developer.force.com recently.
Regards,
Jon
Resources
We have a couple of new resources for you:
- Force.com Toolkit for Google Data APIs - Code the Clouds and integrate Google applications with the Force.com platform
- Workbench 2.0 - a web-based, open source suite of tools to manage your org
- Force.com Developer Library - fact sheets, white papers, tutorials and two full-length books
- Force.com IDE Developer Preview Updated to Summer '08 - as I blogged, there's a new version of the IDE now available
Code
Check out the following new code samples:
- Testing Email Services with Inbound Attachments
- Creating Ideas from Inbound Emails using Email Services
- Visualforce Sample - Dynamic Edit Page
- Visualforce Sample - Consolidated Case History Timeline
- Visualforce Sample - Quote Generation with Pages2PDF
Many thanks to Andrew Waite and Rasmus Mencke for these great samples.
Blogs
Here are some blog posts that caught my eye:
- What the Cloud can Carry - Peter makes the case for enterprise developers to use SaaS and PaaS, not just SMSs
- Workbench: From Idea to 2.0 - Ryan explaining the history behind Workbench
- Intercepting Workflow Outbound Messages in a Ruby Server - I've been experimenting with Workflow and Ruby
- Emailing Visualforce Pages Rendered as PDFs - I've been experimenting with Visualforce and creating PDFs using the new
renderAstag
Multimedia
The following events/screencasts/webinars are now available for your viewing pleasure:
- Master Visualforce in Summer '08 - Move Beyond S-Controls
- The Force.com Platform & Google Data APIs in Action
Upcoming Events
From our event calendar, we have the following events that may interest you:
- Dreamforce '08 - Tour de Force at Dreamforce (November 2-5)
Technorati Tags: salesforce, tourdeforce, visualforce
What the Cloud can Carry
by Peter Coffee on July 10, 2008 at 05:06 PM
It's almost unfortunate that early generations of Software as a Service were strongly influenced by small-and-medium business (SMB) needs for simplicity and ease of use. When that origin is combined with the limited feature set and shallow customization tools of many consumer-grade Web applications, people can easily underestimate the true capability of cloud-based applications and platforms.
When you look at the most pressing needs facing enterprise IT professionals -- to engage business units in more of their data-related tasks, to provide strong policy leadership in information security and business process governance, and to ramp up their initiatives in data analytics and search -- it's really quite clear that SaaS and PaaS are not merely capable, but ideal solutions to these needs.
- When software as a service is delivered with powerful and accessible customization tools like salesforce.com’s programmable workflows, Apex Code for custom logic and Visualforce for user interface design, the business unit takes more ownership of the application and adopts the new tools far more broadly and rapidly.
- When application usage is observable through a service provider’s dashboards and other assessment aids, there’s far better visibility into who’s using different types of data in various ways.
- When a platform as a service makes it easy for applications to share data, conveniently but selectively, the most difficult and brittle parts of a business analytics initiative are handled with ease and flexibility, right up front.
I've made this case for the enterprise readiness of the cloud in this 4-minute video, as well as in a more complete white paper available for free download. Please tell me what you think.
Salesforce Mobile on AppStore
by Jon Mountjoy on July 10, 2008 at 06:12 AM

Well, as you can see from the iTunes App Store snapshot, Salesforce Mobile v1.0 for iPhone is now available on the Apple App Store! You obviously need an iPhone (running version 2.0) to use it. I understand it will run on iTouch 2.0 as well.
I'm sitting here waiting for version 2.0 to become available for my iPhone so that I can start playing!
Update (2008-July-11): Here's the official press release
Technorati Tags: iPhone, salesforce mobile
IT's Not Supposed to be a Dirty Job
by Peter Coffee on July 8, 2008 at 09:15 AM
IT World has put out a list of the "seven dirtiest jobs in IT": it's dated in March, but just surfaced this week on my Google News radar. The good news, they hasten to say, is that mastering the associated skill sets for any of these tasks will pretty much assure you of employment; the bad news is that you can't expect to enjoy it.
Pardon my jumping out of the box, but my question is -- why should anyone have to do them at all? I'm not saying that any of these roles could be completely killed off, but I am suggesting that the need for them should be absolutely minimized.
For example: Dirty Job No.7 is "Legacy Systems Archaeologist." I totally agree that COBOL skills are more valuable than almost anyone realizes -- after all, I'm the guy whose quotation once appeared on an IBM COBOL T-shirt, saying that "Sharks Just Keep on Swimming." I had published a comment that COBOL is like the shark, which has been at the top of its food chain since the day of the dinosaurs.
On the other hand, there's a right way and a wrong way to get continued leverage from your COBOL assets. Wrong way: find or train people to write new COBOL that revises and extends the functions of old COBOL. Right way: use any of several technologies that wrap COBOL in a Web services interface, minimizing the need for future touching of actual COBOL source code.
Dirty Job No. 6 is "Help Desk Zombie": most organizations are staffing too many help-desk slots because they're using too much on-premise technology. Andy Steggles, CIO of the Risk and Insurance Management Society, told Baseline magazine last month that using software-as-a-service has allowed him to shift his limited IT headcount away from management and support toward addressing project backlogs.
Dirty Job No. 5 is "On-Site Reboot Specialist." The less fat-client code you run, the fewer times you'll have to help a system to its feet after it collapses beneath the weight.
Dirty Job No. 4 is "Interdepartmental Peace Negotiator." The conflict between control-oriented IT departments and innovation-hungry business units is substantially defused by a multi-tenant SaaS architecture, with its combination of disciplined governance and metadata-based flexible customization.
Dirty Job No. 3 is "Enterprise Espionage Engineer" -- and I have to admit, I believe I'd actually enjoy doing white-hat social-engineering and penetration tests for clients checking out the state of their systems. What SaaS can do, though, is minimize the value of stolen user credentials and reduce the amount of data that's readily stolen from the network's edge.
Dirty Job No. 2 is "Datacenter Migration Specialist." I can understand why that would be an ever more valuable skill -- but I hardly need point out that SaaS adoption can largely void the question, "where do we build the new data center?" (and how do you find the person to do it?)
Finally, Dirty Job No. 1 is "Sludge Systems Architect" -- and there, they have me. As ever more sophisticated IT goes into the bowels of the factory and the process plant, the digital roughneck who can interface bits with atoms is going to be an in-demand synthesist. If you're looking for a job that you can do today, or do next decade on Mars or next century on a starship, this is one of your options.
But if you want to stay out of the sludge, SaaS can help you stay away from the other six slots on this list.
Intercepting Workflow Outbound Messages in a Ruby Server
by Jon Mountjoy on July 8, 2008 at 06:31 AM
I'm learning about workflow and approvals, and I've just got a Ruby server intercepting SOAP messages that are sent via the Force.com workflow system when changes are made to an object.
The Basic Idea
The way I see it is that you can use the Force.com Workflow system to carry out actions under certain conditions on particular objects. So for example, if object Y has its field X set to Z then perform action Q.
The conditions I chose were on the Contact object, with an evaluation criteria of "Every time a record is created or edited." The action I chose was what this blog post is all about: an outbound message. Essentially you can have the Force.com server send out a SOAP message to your destination of choice with data.
This is very powerful functionality, and takes 3 minutes to set up. You can imagine using it for integration between Force.com and some other external system. You can also perform simpler actions, like updating fields, sending emails and so on. All of this happens automatically, and the actions are managed by the server.
Here's how I set this up to send a SOAP message to a Ruby server sitting on my own remote site.
Setting up the Workflow
Go to Setup/Workflow & Approvals/Workflow Rules/New Rule. Select the Contact object, give the rule a name such as "ServerPingChange", set up some evaluation criteria (I chose "Every time a record is created or edited") and a Rule Criteria (I set mine to "Formula evaluates to true" and have a formula of "true"). Hit "Save and Next" and "Done".
That's it. As you can see, you have a lot of control over the conditions under which the workflow rule will be selected. Now let's go ahead and create the action, which are reusable. That is, if we create an action for Rule Y we can also use it for a different rule too.
Setting up the Action
Hit "Edit" under "Workflow Actions" for the workflow rule you just created, then "Add" "Outbound Message". I gave it a name of "MyOutboundMsg" and for endpoint address you need to select your server name. For example, I used http://www.jonmountjoy.com:8080/ (Don't use my server please ;-) ). You can then select which fields you want to send along in the message. I simply chose Id and Lastname.
That's it! You'll now see a cool "Click for WSDL" which you'll want to do. Download that WSDL file - that defines what your SOAP server endpoint needs to look like. You'll want to activate your workflow rule now (hit "Activate" on the rule), and set up your security now in Security Controls/RemoteSites to ensure that your remote server has access to Force.com.
Now whenever you add/modify a contact, a SOAP message will be sent to your endpoint.
Monitor
You can check your progress so far. Go ahead and edit a contact for example. Now go to Setup/Monitoring/OutboundMessages. You'll see a log of outbound messages because, of course, at this point you have nothing listening on the other end.
Setting up your Ruby Server
I chose to use Ruby here. (I'll be trying this some day with Java and the Spring Framework if there's any interest.) Here's how I set up my Ruby server. It's somewhat convoluted as I had to set up a private gem home as my server is hosted and I don't have full control over it. Hopefully this will help folk doing the same.
Modify your .profile to accommodate a location for your gems if your server is hosted. I have mine include the following lines:
export GEM_HOME=~/ruby/gems/ export RUBYOPT=rubygems
Then I installed the soap4r gem, which provides the basis for my SOAP server. I did this by running
gem install soap4r
(Is there a better SOAP server out there for Ruby? This one looks pretty stale, although it works for my purposes. )
Now in a directory in which you have the WSDL downloaded from the previous step, execute:
~/ruby/gems/bin/wsdl2ruby.rb --wsdl wsdl --type server
You should now have a basic SOAP server! Let's tweak:
I modified NotificationService.rb like so, so that it listens on the correct port (the line is near the bottom of the file):
server = NotificationPortApp.new('app', nil, '0.0.0.0', 8080)
I added a line to DefaultMappingRegistry.rb so that it starts:
require 'default.rb' gem 'soap4r' require 'soap/mapping'
Unfortunately it took me an exceedingly long time to figure out that piece of magic. Why I need, I have no idea...
Now you can start hacking the piece that really matters, defaultServant.rb, which is the Ruby code that runs when a message is received. The soap4r gem makes it pretty simple to interact with the SOAP. Here's my final code that simply prints the incoming id and lastname:
def notifications(request)
p "Jack was here"
p [request.notification[0].sObject.id]
p [request.notification[0].sObject.lastName]
ackResponse = NotificationsResponse.new
ackResponse.ack = true
return ackResponse
end
The only tricky bit is ensuring that you create and return an ackResponse object. Without this, you'll receive the message but Force.com will keep resending it because it hasn't received a successful acknowledgement response.
Finally, run your server:
ruby NotificationService.rb
That's it! Here's the output I get whenever I modify the contact Tim Barr:
mountjoyj@sobek:~/oof$ ruby NotificationService.rb "Jon's Workflow Outbound Message Server Received:" ["0035000000N1GwjAAF"] ["Barr"]
Summary
I found outbound messaging pretty straightforward and easy to use. It took 3 minutes to set up the workflow rule, criteria and SOAP message, and I had great fun pulling my hair out getting the Ruby server to run :-)
Have fun!
History
I started learning this stuff as I was going to give part of the Workflow talk at Tour de Force in Dublin. Rick Greenwald ended up giving the entire presentation, thankfully. I don't know enough yet, and Rick knows it all. Thanks Rick!
Summer '08 Developer Preview Release of the Force.com IDE
by Jon Mountjoy on July 3, 2008 at 06:07 AM
In case you missed it, there's a new release of the Force.com IDE available for download right now.
From the release notes, the Summer '08 developer preview release of the Force.com IDE contains the following major new features:
- Summer '08 Metadata API, adding the following components:
- Home Page Components
- Home Page Layouts
- Page Layouts
- Validation Rules
- Workflows
- Project Contents Selection lets you control what to download:
- All packages and default unpackaged components (identical to previous releases)
- Single package
- Selected metadata types only
- None (if loading project from version control system)
- Usability Enhancements
- Simplified connection options in the New Force.com Project wizard
- Refresh objects list from within the New Apex Trigger and New Workflow wizards
- Force.com Projects now use Eclipse proxy server settings, rather than per-project settings
- Improved stability and performance
Here are all the bits:
Workbench: From Idea to 2.0
by Ryan Brainard on July 1, 2008 at 09:57 PM
About a year ago, I started learning PHP and was just getting my feet wet with the Force.com API, and I soon realized what I would need to do to really learn both -- build a web-based version of Apex Data Loader.
I had used the Data Loader to import and extract data, and it did this
pretty well, but thinking how cool it would be if this could all be
done directly in a web browser like the rest of the Salesforce on-demand applications, I was very excited to start this project.
It started with downloading the open source PHP Toolkit and understanding how to make basic connections and calls to the Force.com API, and this quickly progressed into building out all the major functions of the Data Loader completely in PHP. Being my first major project in PHP, it was still had its fair share of not-so-good practices, but as a testament to the simplicity of both PHP and the Force.com API, the DataLoader.PHP (as the Workbench was once known) became reality. Building on this foundation, more and more features were added and the existing code was refactored to be more efficient and extensible. Soon I realized that I had something that could do much more than the Data Loader with the new Describe, Undelete, and Purge functions and plans to implement a whole suite of useful tools for Salesforce administrators and developers, the application was renamed the Workbench and version 1.0 was released as an open source project on Google Code.
With a modest number of downloads and feedback from the open source community, the feature requests started to roll in for the next generation of the Workbench. Back at the drawing board, I implemented a SOSL Search function, added new Smart Lookup capabilities, built an extensible configuration framework, and tuned the overall performance. All of this was packaged in a new, clean user interface and delivered as Workbench 2.0 just in time for the Salesforce Summer '08 release.
Videos from Tour de Force Dublin
by Jon Mountjoy on June 30, 2008 at 11:46 AM
I've just spent the day at Tour de Force here in Dublin, where I had a spectacular time meeting prospective developers, ISVs, clients, partners, system admins and folk such as CODA and Fairsail.
The web team here in EMEA created a few videos highlighting some of the activities of the day. So thanks to Mark Stanley, Kieran Guckian, Fintan Lillis, Aonghus Flynn and Stephanie Robotham for these vids!
Announcement of Google Data APIs on Force.com
by Jon Mountjoy on June 23, 2008 at 09:00 AM
CalendarService service = new CalendarService();
service.setAuthSubToken(fetchToken());
GoogleData.Calendar cal = service.getCalendarByTitle('TechCalendar');
GoogleData feed = service.getFeed( cal.alternate );
for( xmldom.element e: feed.entries)
titles.add(new MyEvent(e.getValue('title'), e.getValue('content')));
As you can see, it takes about 5 lines of code to connect to a calendar and iterate through the events.
Creating an event is similarly straightforward:
CalendarService service = new CalendarService();
service.setAuthSubToken(fetchToken());
GoogleData.Calendar cal =
service.getCalendarByTitle('TechCalendar');
Event ee = new Event(
subject = 'Cool new Event',
description = 'Clouds in the sky',
ActivityDateTime = system.now(),
DurationInMinutes = 120
);
service.insertEvent(cal, ee);
The only part that requires brain cycles in getting any of this to work was the authentication structure, which is part of the Google Data API architecture. Essentially you (as the Google Calendar user, for example) have the authenticate your application with Google, which requires a few page redirects and token exchanges. At the end of the day you end up with a token that you use in all subsequent interactions (see the fetchToken() above).
There's plenty of documentation (and test coverage) to get you going, and as the code is open source you can go and scrabble around for yourself too. Here are all the bits:
- Force.com Toolkit for Google Data APIs - The Home Page
- Google Data APIs
- Google Data APIs Toolkit Setup
- Google Documents API
- Google Calendar API
- Google Spreadsheets API
- Blogger API
- Contacts API
- Google Data Authentication
- Browse the Toolkit code here
Technorati Tags: google data, force.com, google
