<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Embracing the Cloud</title>
    <link>http://www.embracingthecloud.com/</link>
    <description>public String CloudThoughts{ get; set;}</description>
    <language>en-us</language>
    <copyright>Mike Leach</copyright>
    <lastBuildDate>Mon, 31 Oct 2011 01:15:23 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>mike@cubiccompass.com</managingEditor>
    <webMaster>mike@cubiccompass.com</webMaster>
    <item>
      <trackback:ping>http://www.embracingthecloud.com/Trackback.aspx?guid=528cb1a8-dcbd-4c33-bcde-5ba7f8e41a52</trackback:ping>
      <pingback:server>http://www.embracingthecloud.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.embracingthecloud.com/PermaLink,guid,528cb1a8-dcbd-4c33-bcde-5ba7f8e41a52.aspx</pingback:target>
      <dc:creator>Mike Leach</dc:creator>
      <wfw:comment>http://www.embracingthecloud.com/CommentView,guid,528cb1a8-dcbd-4c33-bcde-5ba7f8e41a52.aspx</wfw:comment>
      <wfw:commentRss>http://www.embracingthecloud.com/SyndicationService.asmx/GetEntryCommentsRss?guid=528cb1a8-dcbd-4c33-bcde-5ba7f8e41a52</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <div id="fb-root">
        </div>
        <script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) {return;}
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
        <div class="fb-like" data-href="http://www.embracingthecloud.com/2011/10/31/SalesforceOracleIntegrationBeyondClosedWon.aspx" data-send="false" data-width="450" data-show-faces="true" data-action="recommend">
        </div>
        <p>
Integrating CRM with ERP/Financial systems can be a challenge. Particularly if the
systems are from 2 different vendors, which is often the case when using Salesforce.com
CRM.<br /><br />
At Facebook, we've gone through several iterations of integrating Salesforce with
Oracle Financials and the team has arrived at a fairly stable and reliable integration
process (kudos to Kumar, Suresh, Gopal, Trevor, and Sunil for making this all work).<br /><br />
Here is the basic flow (see diagram below):<br /><br />
1) The point at which Salesforce CRM needs to pass information to Oracle is typically
once an Opportunity has been closed/won and an order or contract has been signed.<br /><br />
2) Salesforce is configured to send an outbound message containing the Opportunity
ID to an enterprise service bus (ESB) that is configured to listen for specific SOAP
messages from Salesforce.<br /><br />
3) The ESB accepts the outbound message (now technically an inbound message on the
receiver side) and asserts any needed security policies, such as whitelist trusting
the source of the message.<br /><br />
4) This is the interesting part. Because the Salesforce outbound message wizard only
allows for the exporting of fields on a single object, the ESB must call back to retrieve
additional information about the order; such as the Opportunity line items, Account,
and Contacts associated with the Order.<br /><br />
In Enterprise Application Integration (EAI) speak, this is referred to as a <a href="http://eaipatterns.com/DataEnricher.html">Content
Enrichment pattern</a>.<br /><br />
5) An apex web service on Salesforce receives the enrichment request, queries all
the additional order details, and returns a canonical XML message back to the ESB.<br /><br />
6) The ESB receives the enriched message and begins processing validation and de-duplication
rules, then transforms the message into an object that can be consumed by Oracle.<br /><br />
7) The ESB then inserts the Order into Oracle.<br /><br />
8) The Oracle apps API inserts/updates the various physical tables for the order and
throws any exceptions.<br /><br /><img src="http://www.embracingthecloud.com/content/binary/Salesforce_Oracle_Integration.png" border="0" /></p>
        <img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=528cb1a8-dcbd-4c33-bcde-5ba7f8e41a52" />
      </body>
      <title>Salesforce Oracle Integration : Beyond Closed Won</title>
      <guid isPermaLink="false">http://www.embracingthecloud.com/PermaLink,guid,528cb1a8-dcbd-4c33-bcde-5ba7f8e41a52.aspx</guid>
      <link>http://www.embracingthecloud.com/2011/10/31/SalesforceOracleIntegrationBeyondClosedWon.aspx</link>
      <pubDate>Mon, 31 Oct 2011 01:15:23 GMT</pubDate>
      <description>&lt;div id="fb-root"&gt;
&lt;/div&gt;
&lt;script&gt;(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) {return;}
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));&lt;/script&gt;
&lt;div class="fb-like" data-href="http://www.embracingthecloud.com/2011/10/31/SalesforceOracleIntegrationBeyondClosedWon.aspx" data-send="false" data-width="450" data-show-faces="true" data-action="recommend"&gt;
&lt;/div&gt;
&lt;p&gt;
Integrating CRM with ERP/Financial systems can be a challenge. Particularly if the
systems are from 2 different vendors, which is often the case when using Salesforce.com
CRM.&lt;br&gt;
&lt;br&gt;
At Facebook, we've gone through several iterations of integrating Salesforce with
Oracle Financials and the team has arrived at a fairly stable and reliable integration
process (kudos to Kumar, Suresh, Gopal, Trevor, and Sunil for making this all work).&lt;br&gt;
&lt;br&gt;
Here is the basic flow (see diagram below):&lt;br&gt;
&lt;br&gt;
1) The point at which Salesforce CRM needs to pass information to Oracle is typically
once an Opportunity has been closed/won and an order or contract has been signed.&lt;br&gt;
&lt;br&gt;
2) Salesforce is configured to send an outbound message containing the Opportunity
ID to an enterprise service bus (ESB) that is configured to listen for specific SOAP
messages from Salesforce.&lt;br&gt;
&lt;br&gt;
3) The ESB accepts the outbound message (now technically an inbound message on the
receiver side) and asserts any needed security policies, such as whitelist trusting
the source of the message.&lt;br&gt;
&lt;br&gt;
4) This is the interesting part. Because the Salesforce outbound message wizard only
allows for the exporting of fields on a single object, the ESB must call back to retrieve
additional information about the order; such as the Opportunity line items, Account,
and Contacts associated with the Order.&lt;br&gt;
&lt;br&gt;
In Enterprise Application Integration (EAI) speak, this is referred to as a &lt;a href="http://eaipatterns.com/DataEnricher.html"&gt;Content
Enrichment pattern&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
5) An apex web service on Salesforce receives the enrichment request, queries all
the additional order details, and returns a canonical XML message back to the ESB.&lt;br&gt;
&lt;br&gt;
6) The ESB receives the enriched message and begins processing validation and de-duplication
rules, then transforms the message into an object that can be consumed by Oracle.&lt;br&gt;
&lt;br&gt;
7) The ESB then inserts the Order into Oracle.&lt;br&gt;
&lt;br&gt;
8) The Oracle apps API inserts/updates the various physical tables for the order and
throws any exceptions.&lt;br&gt;
&lt;br&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Salesforce_Oracle_Integration.png" border="0"&gt; 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=528cb1a8-dcbd-4c33-bcde-5ba7f8e41a52" /&gt;</description>
      <comments>http://www.embracingthecloud.com/CommentView,guid,528cb1a8-dcbd-4c33-bcde-5ba7f8e41a52.aspx</comments>
      <category>Apex</category>
      <category>Facebook</category>
      <category>Salesforce</category>
    </item>
    <item>
      <trackback:ping>http://www.embracingthecloud.com/Trackback.aspx?guid=6da03772-c450-4b4e-ba4b-d88c9186c565</trackback:ping>
      <pingback:server>http://www.embracingthecloud.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.embracingthecloud.com/PermaLink,guid,6da03772-c450-4b4e-ba4b-d88c9186c565.aspx</pingback:target>
      <dc:creator>Mike Leach</dc:creator>
      <wfw:comment>http://www.embracingthecloud.com/CommentView,guid,6da03772-c450-4b4e-ba4b-d88c9186c565.aspx</wfw:comment>
      <wfw:commentRss>http://www.embracingthecloud.com/SyndicationService.asmx/GetEntryCommentsRss?guid=6da03772-c450-4b4e-ba4b-d88c9186c565</wfw:commentRss>
      <title>Salesforce at Facebook: Dreamforce 11</title>
      <guid isPermaLink="false">http://www.embracingthecloud.com/PermaLink,guid,6da03772-c450-4b4e-ba4b-d88c9186c565.aspx</guid>
      <link>http://www.embracingthecloud.com/2011/08/21/SalesforceAtFacebookDreamforce11.aspx</link>
      <pubDate>Sun, 21 Aug 2011 18:52:04 GMT</pubDate>
      <description>&lt;div id="fb-root"&gt;
&lt;/div&gt;
&lt;script src="http://connect.facebook.net/en_US/all.js#appId=277835848897790&amp;amp;xfbml=1"&gt;&lt;/script&gt;
&lt;fb:like href="http://www.embracingthecloud.com/2011/08/21/SalesforceAtFacebookDreamforce11.aspx" send="true" width="450" show_faces="true" action="like" font=""&gt;&lt;/fb:like&gt;
&lt;br /&gt;
&lt;a href="http://www.salesforce.com/dreamforce/DF11/schedule/agenda/"&gt;Dreamforce 11&lt;/a&gt; is
just around the corner and fellow Facebook Engineer Mike Fullmore and myself have
been invited to speak at the following panel:&lt;br /&gt;
&lt;p style="background-color:#e0e0e0;"&gt;
&lt;b&gt;Enterprise Engineering&lt;/b&gt;
&lt;br /&gt;
Friday, September 2&lt;br /&gt;
10:00 a.m. - 11:00 a.m.&lt;br /&gt;
Can you really develop at 5x a regular speed when you're at enterprise scale? In this
session, a panel of enterprise technical engineers will discuss engineering best practices
for the Sales Cloud, Service Cloud, Chatter and Force.com. Topics include security,
sandbox, integration, Apex, and release management.&lt;br /&gt;
&lt;br /&gt;
Speakers: Mike Leach, Facebook, Inc.; David Swidan, Seagate Technology LLC; Mike Fullmore,
Facebook, Inc. 
&lt;/p&gt;
In case you're not able to attend, here are the high level points from our presentation.
:-) 
&lt;br /&gt;
&lt;h3&gt;Moving Fast on Force.com
&lt;/h3&gt;
Facebook has been using Salesforce for several months to rapidly prototype, build,
and deploy a number of line of business applications to meet the needs of a hyper-growth
organization. This presentation shares some best practices that have evolved at Facebook
to help develop on the Force.com platform. 
&lt;h3&gt;People
&lt;/h3&gt;
Before sharing details about Facebook's processes, methodologies, and tools; it's
important to point out that the people on the enterprise engineering team are what
really make things happen. Each Engineer is able to work autonomously and carry a
project through from design to deployment. Great people instinctively take great pride
in their work and consistently take the initiative to deliver awesomeness. I would
be remiss not to point them out here. All these Engineers operate at MVP levels. 
&lt;ul&gt;
&lt;li&gt;
&lt;a target=_new href="https://www.facebook.com/mfullmore"&gt;Mike Fullmore&lt;/a&gt; 
&lt;li&gt;
&lt;a target=_new href="https://www.facebook.com/trevor.m.ford"&gt;Trevor Ford&lt;/a&gt; 
&lt;li&gt;
&lt;a target=_new href="https://www.facebook.com/timainman"&gt;Tim Inman&lt;/a&gt; 
&lt;li&gt;
&lt;a target=_new href="https://www.facebook.com/brandonblack"&gt;Brandon Black&lt;/a&gt; 
&lt;li&gt;
&lt;a target=_new href="https://www.facebook.com/srikumarp"&gt;Srikumar Nair&lt;/a&gt; 
&lt;li&gt;
&lt;a target=_new href="https://www.facebook.com/jwchan86"&gt;Jon W Chan&lt;/a&gt; 
&lt;li&gt;
&lt;a target=_new href="https://www.facebook.com/jonathanc"&gt;Jonathan Chan&lt;/a&gt; 
&lt;/ul&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Team.png" border="0" /&gt; 
&lt;br /&gt;
The effort that goes into recruiting a great development team should not be underestimated.
Recruiting an awesome team involves several people doing hundreds of phone screens
and dozens of interviews. Facebook is in a unique situation in its history and we
don't take it for granted that we have access to unprecedented resources and talent.
It's actually very humbling to work with such a stellar team at such a great company. 
&lt;br /&gt;
&lt;br /&gt;
("yes" we're &lt;a target=_new href="https://www.facebook.com/careers/department.php?dept=IT&amp;req=387184410968"&gt;still
hiring&lt;/a&gt;) 
&lt;hr /&gt;
&lt;h3&gt;Business Processes
&lt;/h3&gt;
Projects and applications generally fall into one of 9 major process buckets. Engineers
at Facebook seeking to have a high impact will typically either have a breadth or
depth of knowledge. Some focus on the long-term intricate details and workflows of
a single business process while others are able to move around and generally lead
several, concurrent, short-term development efforts in any business area.&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Processes.png" border="0" /&gt; 
&lt;hr /&gt;
&lt;h3&gt;Sandbox-&gt;Staging-&gt;Deploy
&lt;/h3&gt;
Each Project has it's own development sandbox. Additionally, each Engineer may also
have their own personal sandbox. When code is ready to be deployed, it's packaged
using the Ant migration tool format and typically tested in 2 sandboxes: 1 daily refreshed
staging org to ensure all unit tests will run and there are no metadata conflicts,
and a full sandbox deploy to give business managers an opportunity to test using real-world
data. 
&lt;br /&gt;
&lt;br /&gt;
Change sets are rarely used, but may be the best option for first time deployments
of large applications that have too many metadata dependencies to reliably be identified
by hand.&lt;br /&gt;
&lt;br /&gt;
The &lt;a href="http://security.force.com/sourcescanner" target=_new&gt;online security
scanner&lt;/a&gt; is used as a resource during deployment to identify any potential security
issues. A spreadsheet is used for time-series analysis of scanner results to understand
code quality trends.&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Orgs.png" border="0" /&gt; 
&lt;br /&gt;
Once a package has been reviewed, tested, and approved for deployment; a release Engineer
deploys the package to production using Ant. This entire process is designed to support
daily deployments. There are typically 3-5 incremental change deployments per week. 
&lt;hr /&gt;
&lt;h3&gt;Obligatory Chaotic Process Diagram
&lt;/h3&gt;
"Agile" and "process" are 2 words that are not very complimentary. Agile teams must
find an equilibrium of moving fast yet maintaining high quality code. Facebook trusts
every Engineer will make the right decisions when pushing changes. When things go
wrong, we conduct a post-mortem or retrospective against an "ideal" process to identify
what trade-offs were made, why, and where improvements can be made.&lt;br /&gt;
&lt;br /&gt;
All Engineers go through a 6 week orientation "bootcamp" to understand the various
processes.&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/ReleaseFlow.png" border="0" /&gt; 
&lt;hr /&gt;
&lt;h3&gt;Typical Scrum Development Process
&lt;/h3&gt;
The development "lingua franca" within Silicon Valley, and for most Salesforce service
providers, tends to be &lt;a href="http://en.wikipedia.org/wiki/Scrum_(development)" target=_new&gt;Scrum&lt;/a&gt;.
Consultants and contractors provide statements of work and deliver progress reports
around "sprints". Scrum training is readily available by a number of agile shops.&lt;br /&gt;
&lt;br /&gt;
This industry standard has been adopted internally and keeps multiple projects and
people in sync. Mike Fullmore developed a Force.com app named "Scrumbook" for cataloguing
projects, sprints, and stories.&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/ScrumProcess.png" width="500px" border="0" /&gt; 
&lt;br /&gt;
&lt;br /&gt;
A basic Force.com project template with key milestones has been created to give Project
Managers an idea of when certain activities should take place. Whenever possible we
prefer to avoid a "waterfall" or "big bang" mentality; preferring to launch with minimal
functionality, validate assumptions with end-users, then build on the app in subsequent
sprints.&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Sprints.png" border="0" /&gt; 
&lt;hr /&gt;
&lt;h3&gt;Manage The Meta(data)
&lt;/h3&gt;
The general line of demarcation within IT at Facebook is: 
&lt;ul&gt;
&lt;li&gt;
Admins own the data 
&lt;li&gt;
Engineers own the metadata 
&lt;/ul&gt;
The Salesforce Metadata API is a tremendously powerful resource for scaling an enterprise,
yet remaining highly leveraged and lean. We've developed custom metadata tools to
help us conduct security audits and compare snapshot changes.&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/SONAR.png" border="0" /&gt; 
&lt;br /&gt;
&lt;span style="font-size:10px"&gt;(Credit to our Summer Intern, &lt;a href="https://www.facebook.com/austin.wang"&gt;Austin
Wang&lt;/a&gt;, who initiated the development of internal tools! )&lt;/span&gt; 
&lt;hr /&gt;
&lt;h3&gt;Change Management
&lt;/h3&gt;
The advantage to using Salesforce is the ability to use declarative configuration
and development techniques to produce functional applications, then use more powerful
Apex and Visualforce tools to maximize apps around business core competencies. "Clicks
over code" is a common mantra in Salesforce shops, and Facebook is no exception.&lt;br /&gt;
&lt;br /&gt;
A &lt;a href="http://www.embracingthecloud.com/2010/11/21/SalesforceChangeManagementMatrix.aspx"&gt;change
management matrix&lt;/a&gt; is a useful tool for determining when "clicks-over-code" is
preferred over a more rigorous change management process.&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/ChangeManagementMatrix.png" border="0" /&gt; &lt;img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=6da03772-c450-4b4e-ba4b-d88c9186c565" /&gt;</description>
      <comments>http://www.embracingthecloud.com/CommentView,guid,6da03772-c450-4b4e-ba4b-d88c9186c565.aspx</comments>
      <category>Facebook</category>
      <category>Salesforce</category>
    </item>
    <item>
      <trackback:ping>http://www.embracingthecloud.com/Trackback.aspx?guid=cb9182f6-a8b3-42d8-9e03-2a1c4cf8c5e8</trackback:ping>
      <pingback:server>http://www.embracingthecloud.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.embracingthecloud.com/PermaLink,guid,cb9182f6-a8b3-42d8-9e03-2a1c4cf8c5e8.aspx</pingback:target>
      <dc:creator>Mike Leach</dc:creator>
      <wfw:comment>http://www.embracingthecloud.com/CommentView,guid,cb9182f6-a8b3-42d8-9e03-2a1c4cf8c5e8.aspx</wfw:comment>
      <wfw:commentRss>http://www.embracingthecloud.com/SyndicationService.asmx/GetEntryCommentsRss?guid=cb9182f6-a8b3-42d8-9e03-2a1c4cf8c5e8</wfw:commentRss>
      <title>Docusign Hackathon 2011</title>
      <guid isPermaLink="false">http://www.embracingthecloud.com/PermaLink,guid,cb9182f6-a8b3-42d8-9e03-2a1c4cf8c5e8.aspx</guid>
      <link>http://www.embracingthecloud.com/2011/05/23/DocusignHackathon2011.aspx</link>
      <pubDate>Mon, 23 May 2011 03:24:38 GMT</pubDate>
      <description>DocuSign's &lt;a href="http://www.docusign.com/hackathon/"&gt;Hackathon&lt;/a&gt; on May 15th
and 16th, 2011 brought out some serious talent to DocuSign's new office in downtown
San Francisco. For 2 days, developers took a shot at the $25K purse in 3 categories;
consumer, enterprise, and mobile.&lt;br&gt;
&lt;br&gt;
My app, SocialSign, was based on the T-Mobile Fave 5 campaign:&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
Select 5 Facebook friends&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
Sign an unlimited voice/text contract through DocuSign&lt;/li&gt;
&lt;li&gt;
Merchants manage the contract in Salesforce. 
&lt;/li&gt;
&lt;/ul&gt;
I admittedly spent about 75% of the hackathon working with the Facebook app canvas
and Salesforce Sites APIs, which probably explains why SocialSign placed as runner-up
in the consumer category (other developers got far more creative with the actual Docusign
API).&lt;br&gt;
&lt;br&gt;
In the end, it was a great opportunity to demonstrate the feasibility of conducting
social commerce through Facebook using Salesforce CRM to manage contacts, orders,
and contracts. Thank you DocuSign for hosting such a great event!&lt;br&gt;
&lt;br&gt;
(Video demo of SocialSign available &lt;a href="http://www.screencast.com/t/MxLc8V9nA"&gt;here&lt;/a&gt; and
embedded below)&lt;br&gt;
&lt;p&gt;
&lt;object id="scPlayer" width="960" height="600" type="application/x-shockwave-flash" data="http://content.screencast.com/users/CubicCompassVideo/folders/Camtasia/media/6af3ae82-f41a-4bc6-b500-3defca080a69/mp4h264player.swf" &gt;
&lt;param name="movie" value="http://content.screencast.com/users/CubicCompassVideo/folders/Camtasia/media/6af3ae82-f41a-4bc6-b500-3defca080a69/mp4h264player.swf" /&gt;
&lt;param name="quality" value="high" /&gt;
&lt;param name="bgcolor" value="#FFFFFF" /&gt;
&lt;param name="flashVars" value="thumb=http://content.screencast.com/users/CubicCompassVideo/folders/Camtasia/media/6af3ae82-f41a-4bc6-b500-3defca080a69/FirstFrame.jpg&amp;containerwidth=960&amp;containerheight=600&amp;content=http://content.screencast.com/users/CubicCompassVideo/folders/Camtasia/media/6af3ae82-f41a-4bc6-b500-3defca080a69/Docusign-Hackathon-2011.mp4&amp;blurover=false" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="scale" value="showall" /&gt;
&lt;param name="allowScriptAccess" value="always" /&gt;
&lt;param name="base" value="http://content.screencast.com/users/CubicCompassVideo/folders/Camtasia/media/6af3ae82-f41a-4bc6-b500-3defca080a69/" /&gt;
&lt;iframe type="text/html" frameborder="0" scrolling="no" style="overflow:hidden;" src="http://www.screencast.com/users/CubicCompassVideo/folders/Camtasia/media/6af3ae82-f41a-4bc6-b500-3defca080a69/embed" height="600" width="960" &gt;
&lt;/iframe&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=cb9182f6-a8b3-42d8-9e03-2a1c4cf8c5e8" /&gt;</description>
      <comments>http://www.embracingthecloud.com/CommentView,guid,cb9182f6-a8b3-42d8-9e03-2a1c4cf8c5e8.aspx</comments>
      <category>Facebook</category>
      <category>Salesforce</category>
      <category>Visualforce</category>
    </item>
    <item>
      <trackback:ping>http://www.embracingthecloud.com/Trackback.aspx?guid=a6cb9c6b-775d-4219-a0d1-55092ef22360</trackback:ping>
      <pingback:server>http://www.embracingthecloud.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.embracingthecloud.com/PermaLink,guid,a6cb9c6b-775d-4219-a0d1-55092ef22360.aspx</pingback:target>
      <dc:creator>Mike Leach</dc:creator>
      <wfw:comment>http://www.embracingthecloud.com/CommentView,guid,a6cb9c6b-775d-4219-a0d1-55092ef22360.aspx</wfw:comment>
      <wfw:commentRss>http://www.embracingthecloud.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a6cb9c6b-775d-4219-a0d1-55092ef22360</wfw:commentRss>
      <slash:comments>7</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">JAWS is "Just A Web Shell" framework developed
by the Facebook IT group for running Force.com web applications on iOS (iPhone/iPad)
devices. 
<br /><br />
JAWS is a "hybrid" mobile application framework that provides a native iOS application
on the mobile desktop that instantiates a web browser to a Force.com web page.<br /><br /><br /><p></p><img src="http://www.embracingthecloud.com/content/binary/JAWS_Overview.png" border="0" /><br /><br /><b>Prerequisites:</b><br /><ul><li><a href="http://developer.apple.com/xcode/">Apple XCode Developer Tools</a></li><li>
JAWS Framework (<a href="https://github.com/mleach/Force.com-Toolkit-JAWS-for-iOS">GitHub
download</a>)</li><li><a href="http://wiki.developerforce.com/index.php/Force.com_IDE">Force.com IDE</a></li><li><a href="http://jquerymobile.com/">jQuery Mobile</a> (optional)<br /></li></ul>
The Force.com-Toolkit-JAWS-for-iOS <a href="https://github.com/mleach/Force.com-Toolkit-JAWS-for-iOS">project
on GitHub</a> includes all of the following steps and source code for building a mobile
iOS app on Force.com.<br /><br />
1) Start in XCode by creating a new View-based iPad or iPhone application.<br /><br /><img src="content/binary/JAWS_NewXCodeApp.png" border="0" height="386" width="475" /><br /><br />
2) Define a UIWebView controller with a default URL of https://login.salesforce.com.<br />
Append the retURL parameter to the URL to define which Visualforce page to load upon
authentication.<br /><img src="http://www.embracingthecloud.com/content/binary/JAWS_XCode_IDE.png" border="0" height="513" width="629" /><br /><br />
3) Launch the Interface Designer and create a simple toolbar with UIWebView to emulate
a basic browser UI.<br /><br /><img src="http://www.embracingthecloud.com/content/binary/JAWS_InterfaceDesigner.png" border="0" height="348" width="492" /><br /><br />
4) Build and launch the iOS simulator from XCode to view the Salesforce login page
loaded within the UIWebView<br /><br /><img src="http://www.embracingthecloud.com/content/binary/JAWS_LoginPage.png" border="0" /><br /><br />
5) Upon login, the return URL (retURL) Visualforce page is loaded. In this case, using
the <a href="http://jquerymobile.com/">jQuery Mobile</a> framework to display a simple
mobile UI.<br />
 <br /><img src="http://www.embracingthecloud.com/content/binary/JAWS_MobileLandingPage.png" border="0" /><br /><br />
That's it! The native web shell runs the Visualforce directly on iOS. With some crafty
mobile-friendly UI design in HTML5, the end-user may not even detect the app is actually
running entirely in the cloud on Force.com!<br /><img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=a6cb9c6b-775d-4219-a0d1-55092ef22360" /></body>
      <title>iOS Mobile Web Framework for Force.com</title>
      <guid isPermaLink="false">http://www.embracingthecloud.com/PermaLink,guid,a6cb9c6b-775d-4219-a0d1-55092ef22360.aspx</guid>
      <link>http://www.embracingthecloud.com/2011/03/27/iOSMobileWebFrameworkForForcecom.aspx</link>
      <pubDate>Sun, 27 Mar 2011 18:38:30 GMT</pubDate>
      <description>JAWS is "Just A Web Shell" framework developed by the Facebook IT group for running Force.com web applications on iOS (iPhone/iPad) devices. &lt;br&gt;
&lt;br&gt;
JAWS is a "hybrid" mobile application framework that provides a native iOS application
on the mobile desktop that instantiates a web browser to a Force.com web page.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/JAWS_Overview.png" border="0"&gt;
&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Prerequisites:&lt;/b&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://developer.apple.com/xcode/"&gt;Apple XCode Developer Tools&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
JAWS Framework (&lt;a href="https://github.com/mleach/Force.com-Toolkit-JAWS-for-iOS"&gt;GitHub
download&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://wiki.developerforce.com/index.php/Force.com_IDE"&gt;Force.com IDE&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://jquerymobile.com/"&gt;jQuery Mobile&lt;/a&gt; (optional)&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
The Force.com-Toolkit-JAWS-for-iOS &lt;a href="https://github.com/mleach/Force.com-Toolkit-JAWS-for-iOS"&gt;project
on GitHub&lt;/a&gt; includes all of the following steps and source code for building a mobile
iOS app on Force.com.&lt;br&gt;
&lt;br&gt;
1) Start in XCode by creating a new View-based iPad or iPhone application.&lt;br&gt;
&lt;br&gt;
&lt;img src="content/binary/JAWS_NewXCodeApp.png" border="0" height="386" width="475"&gt;
&lt;br&gt;
&lt;br&gt;
2) Define a UIWebView controller with a default URL of https://login.salesforce.com.&lt;br&gt;
Append the retURL parameter to the URL to define which Visualforce page to load upon
authentication.&lt;br&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/JAWS_XCode_IDE.png" border="0" height="513" width="629"&gt;
&lt;br&gt;
&lt;br&gt;
3) Launch the Interface Designer and create a simple toolbar with UIWebView to emulate
a basic browser UI.&lt;br&gt;
&lt;br&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/JAWS_InterfaceDesigner.png" border="0" height="348" width="492"&gt;
&lt;br&gt;
&lt;br&gt;
4) Build and launch the iOS simulator from XCode to view the Salesforce login page
loaded within the UIWebView&lt;br&gt;
&lt;br&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/JAWS_LoginPage.png" border="0"&gt;
&lt;br&gt;
&lt;br&gt;
5) Upon login, the return URL (retURL) Visualforce page is loaded. In this case, using
the &lt;a href="http://jquerymobile.com/"&gt;jQuery Mobile&lt;/a&gt; framework to display a simple
mobile UI.&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/JAWS_MobileLandingPage.png" border="0"&gt;
&lt;br&gt;
&lt;br&gt;
That's it! The native web shell runs the Visualforce directly on iOS. With some crafty
mobile-friendly UI design in HTML5, the end-user may not even detect the app is actually
running entirely in the cloud on Force.com!&lt;br&gt;
&lt;img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=a6cb9c6b-775d-4219-a0d1-55092ef22360" /&gt;</description>
      <comments>http://www.embracingthecloud.com/CommentView,guid,a6cb9c6b-775d-4219-a0d1-55092ef22360.aspx</comments>
      <category>JQuery</category>
      <category>Salesforce</category>
      <category>Visualforce</category>
    </item>
    <item>
      <trackback:ping>http://www.embracingthecloud.com/Trackback.aspx?guid=e9b8b8b8-c172-4298-b20c-707dec8bfbc7</trackback:ping>
      <pingback:server>http://www.embracingthecloud.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.embracingthecloud.com/PermaLink,guid,e9b8b8b8-c172-4298-b20c-707dec8bfbc7.aspx</pingback:target>
      <dc:creator>Mike Leach</dc:creator>
      <wfw:comment>http://www.embracingthecloud.com/CommentView,guid,e9b8b8b8-c172-4298-b20c-707dec8bfbc7.aspx</wfw:comment>
      <wfw:commentRss>http://www.embracingthecloud.com/SyndicationService.asmx/GetEntryCommentsRss?guid=e9b8b8b8-c172-4298-b20c-707dec8bfbc7</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <img src="http://www.embracingthecloud.com/content/binary/ForceMVP.png" border="0" height="77" width="109" />
        <br />
        <br />
One thing I really enjoy about Force.com development is the ability to learn something
new everyday. I subscribe to the blogs of just about everyone on the <a href="http://blog.sforce.com/sforce/2011/03/welcome-to-our-inaugural-class-of-forcecom-mvps.html">inaugural
Force.com MVPs</a> list and make it a standard practice to follow what they are doing
and learn new tricks. In addition to blogging, some of these Developers have written
excellent books on Force.com and Google App Engine Development (I have them all on
my shelf) or make significant contributions to the open source community. Congrats
to all of them.<br /><br />
Thank you Salesforce for including me in this list. I'm very honored to call these
guys my "peers".<br /><br /><img src="http://www.embracingthecloud.com/content/binary/ForceMVP2011.png" border="0" /><img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=e9b8b8b8-c172-4298-b20c-707dec8bfbc7" /></body>
      <title>Force.com MVPs</title>
      <guid isPermaLink="false">http://www.embracingthecloud.com/PermaLink,guid,e9b8b8b8-c172-4298-b20c-707dec8bfbc7.aspx</guid>
      <link>http://www.embracingthecloud.com/2011/03/13/ForcecomMVPs.aspx</link>
      <pubDate>Sun, 13 Mar 2011 02:16:24 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/ForceMVP.png" border="0" height="77" width="109"&gt;
&lt;br&gt;
&lt;br&gt;
One thing I really enjoy about Force.com development is the ability to learn something
new everyday. I subscribe to the blogs of just about everyone on the &lt;a href="http://blog.sforce.com/sforce/2011/03/welcome-to-our-inaugural-class-of-forcecom-mvps.html"&gt;inaugural
Force.com MVPs&lt;/a&gt; list and make it a standard practice to follow what they are doing
and learn new tricks. In addition to blogging, some of these Developers have written
excellent books on Force.com and Google App Engine Development (I have them all on
my shelf) or make significant contributions to the open source community. Congrats
to all of them.&lt;br&gt;
&lt;br&gt;
Thank you Salesforce for including me in this list. I'm very honored to call these
guys my "peers".&lt;br&gt;
&lt;br&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/ForceMVP2011.png" border="0"&gt;&lt;img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=e9b8b8b8-c172-4298-b20c-707dec8bfbc7" /&gt;</description>
      <comments>http://www.embracingthecloud.com/CommentView,guid,e9b8b8b8-c172-4298-b20c-707dec8bfbc7.aspx</comments>
      <category>Salesforce</category>
    </item>
    <item>
      <trackback:ping>http://www.embracingthecloud.com/Trackback.aspx?guid=be16dcec-ad77-4d9e-a847-4a2e9b2a34e2</trackback:ping>
      <pingback:server>http://www.embracingthecloud.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.embracingthecloud.com/PermaLink,guid,be16dcec-ad77-4d9e-a847-4a2e9b2a34e2.aspx</pingback:target>
      <dc:creator>Mike Leach</dc:creator>
      <wfw:comment>http://www.embracingthecloud.com/CommentView,guid,be16dcec-ad77-4d9e-a847-4a2e9b2a34e2.aspx</wfw:comment>
      <wfw:commentRss>http://www.embracingthecloud.com/SyndicationService.asmx/GetEntryCommentsRss?guid=be16dcec-ad77-4d9e-a847-4a2e9b2a34e2</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <a href="http://salesforce-blog.de/">Hannes</a> raises
a <a href="http://www.embracingthecloud.com/CommentView,guid,58280a43-1e6f-4d6f-b224-9f8522d534b4.aspx#commentstart">great
question</a> about <a href="http://developer.force.com/releases/release/Spring11/Change+Sets">Change
Sets</a> in my previous blog post on Release Management.<br /><br /><i>"One thing I really like about the deployment connections are, that you have a
deployment history right in your salesforce live-org. With comments and an insight
into the packages.<br /><br />
Which pros do you see as for deploying with the ant script?"</i><br /><br />
We occasionally use change sets at Facebook. The decision to use Ant vs. Change Sets
is akin to a <a href="http://en.wikipedia.org/wiki/Editor_war">Vi vs. Emacs</a> religious
war. They both accomplish the same thing, just in different ways.<br /><br />
General best practice guidelines: 
<ul><li>
Initial deployments of new custom applications are much easier using Change Sets 
</li><li>
Incremental deployments are more easily managed using Ant 
</li></ul>
The decision to standardize on Ant packages is largely for compliance reasons. When
there is a need to internally document who changed what and when, a SVN repository
of all changes with author and reviewer notes satisfies most compliance requirements
(such as <a href="http://en.wikipedia.org/wiki/Sarbanes%E2%80%93Oxley_Act">Sarbanes-Oxley</a>) 
<br /><br />
Some high level thoughts on the 2 approaches: 
<ul><li>
Some metadata simply is not packageable via Ant, therefore Change Sets must be used 
</li><li>
The dependency checker in the Change Set packager, while not 100% perfect, is much
more reliable than manually adding 100+ individual components 
</li><li>
In the absence of an IT-Engineer who can create Ant packages, business process owners
and non-technical users always have the fallback option of using change sets 
</li><li>
Prior to Spring '11, invalid inbound change sets could not be deleted, resulting in
an accumulation of cruft 
</li><li>
The ability to delete deployed change sets in Spring '11 removes the ability to audit
change history (a compliance violation) 
</li><li>
The ephemeral nature of some sandboxes means constantly re-establishing deployment
connections. 
</li></ul><img src="http://www.embracingthecloud.com/content/binary/changesets.jpg" border="0" /><img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=be16dcec-ad77-4d9e-a847-4a2e9b2a34e2" /></body>
      <title>Force Migration Tool vs. Change Sets</title>
      <guid isPermaLink="false">http://www.embracingthecloud.com/PermaLink,guid,be16dcec-ad77-4d9e-a847-4a2e9b2a34e2.aspx</guid>
      <link>http://www.embracingthecloud.com/2011/02/26/ForceMigrationToolVsChangeSets.aspx</link>
      <pubDate>Sat, 26 Feb 2011 18:07:06 GMT</pubDate>
      <description>&lt;a href="http://salesforce-blog.de/"&gt;Hannes&lt;/a&gt; raises a &lt;a href="http://www.embracingthecloud.com/CommentView,guid,58280a43-1e6f-4d6f-b224-9f8522d534b4.aspx#commentstart"&gt;great
question&lt;/a&gt; about &lt;a href="http://developer.force.com/releases/release/Spring11/Change+Sets"&gt;Change
Sets&lt;/a&gt; in my previous blog post on Release Management.&lt;br&gt;
&lt;br&gt;
&lt;i&gt;"One thing I really like about the deployment connections are, that you have a
deployment history right in your salesforce live-org. With comments and an insight
into the packages.&lt;br&gt;
&lt;br&gt;
Which pros do you see as for deploying with the ant script?"&lt;/i&gt;
&lt;br&gt;
&lt;br&gt;
We occasionally use change sets at Facebook. The decision to use Ant vs. Change Sets
is akin to a &lt;a href="http://en.wikipedia.org/wiki/Editor_war"&gt;Vi vs. Emacs&lt;/a&gt; religious
war. They both accomplish the same thing, just in different ways.&lt;br&gt;
&lt;br&gt;
General best practice guidelines: 
&lt;ul&gt;
&lt;li&gt;
Initial deployments of new custom applications are much easier using Change Sets 
&lt;/li&gt;
&lt;li&gt;
Incremental deployments are more easily managed using Ant 
&lt;/li&gt;
&lt;/ul&gt;
The decision to standardize on Ant packages is largely for compliance reasons. When
there is a need to internally document who changed what and when, a SVN repository
of all changes with author and reviewer notes satisfies most compliance requirements
(such as &lt;a href="http://en.wikipedia.org/wiki/Sarbanes%E2%80%93Oxley_Act"&gt;Sarbanes-Oxley&lt;/a&gt;) 
&lt;br&gt;
&lt;br&gt;
Some high level thoughts on the 2 approaches: 
&lt;ul&gt;
&lt;li&gt;
Some metadata simply is not packageable via Ant, therefore Change Sets must be used 
&lt;/li&gt;
&lt;li&gt;
The dependency checker in the Change Set packager, while not 100% perfect, is much
more reliable than manually adding 100+ individual components 
&lt;/li&gt;
&lt;li&gt;
In the absence of an IT-Engineer who can create Ant packages, business process owners
and non-technical users always have the fallback option of using change sets 
&lt;/li&gt;
&lt;li&gt;
Prior to Spring '11, invalid inbound change sets could not be deleted, resulting in
an accumulation of cruft 
&lt;/li&gt;
&lt;li&gt;
The ability to delete deployed change sets in Spring '11 removes the ability to audit
change history (a compliance violation) 
&lt;/li&gt;
&lt;li&gt;
The ephemeral nature of some sandboxes means constantly re-establishing deployment
connections. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/changesets.jpg" border="0"&gt;&lt;img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=be16dcec-ad77-4d9e-a847-4a2e9b2a34e2" /&gt;</description>
      <comments>http://www.embracingthecloud.com/CommentView,guid,be16dcec-ad77-4d9e-a847-4a2e9b2a34e2.aspx</comments>
      <category>Salesforce</category>
    </item>
    <item>
      <trackback:ping>http://www.embracingthecloud.com/Trackback.aspx?guid=58280a43-1e6f-4d6f-b224-9f8522d534b4</trackback:ping>
      <pingback:server>http://www.embracingthecloud.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.embracingthecloud.com/PermaLink,guid,58280a43-1e6f-4d6f-b224-9f8522d534b4.aspx</pingback:target>
      <dc:creator>Mike Leach</dc:creator>
      <wfw:comment>http://www.embracingthecloud.com/CommentView,guid,58280a43-1e6f-4d6f-b224-9f8522d534b4.aspx</wfw:comment>
      <wfw:commentRss>http://www.embracingthecloud.com/SyndicationService.asmx/GetEntryCommentsRss?guid=58280a43-1e6f-4d6f-b224-9f8522d534b4</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">Managing the release of Force.com changes
in a fast paced environment requires an agile development methodology with a focus
on: 
<ol><li>
Continuous Integration - Support daily deployments 
</li><li>
Minimalism - Incrementally deploy only what is needed, and nothing more 
</li><li>
Reliability - Changes should be 100% backwards compatible and not break existing functionality 
</li></ol>
The <a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_deploying_ant.htm" target="_new">Force.com
Migration Tool</a> is a key component to a successful release management process.<br /><br /><b>Release Management Overview</b><ul><li>
Start the refresh of a sandbox named "staging" 
</li><li>
Package a release using Eclipse 
</li><li>
Create an ant package and validate the deployment against the staging sandbox 
</li><li>
Deploy the changes to production 
</li></ul>
It's assumed that standard change approvals, code review, and user acceptance testing
have already taken place prior to these steps.<br /><br /><b>Setting Up The Environment</b><br /><br />
(Note: The following examples are all using Macbook Bash shell. The windows shell
counterparts for making directories and copying files are very similar)<br /><br /><a href="https://na7.salesforce.com/dwnld/SfdcAnt/salesforce_ant_21.0.zip" target="_new">Download
the Force.com Migration Tool</a> and unzip to a temp directory.<br /><br />
Create a directory for managing ANT deployment packages named something like "changes".
Copy the ant-salesforce.jar file to this directory. (It may be easier to manage changes
from within the Eclipse workspace folder)<br /><br />
This directory will contain 2 files used by all releases.<br /><pre class="brush: html;">
~/Documents/workspace/changes/ant-salesforce.jar
~/Documents/workspace/changes/sforce.properties
</pre><br />
Manually create the sforce.properties file from the following template. 
<br /><pre class="brush: text;">
# sforce.properties
#

# =================== Sandbox Org Credentials ===============
sandbox.username	= user@domain.com.staging
sandbox.password	= password
sandbox.url			= https://test.salesforce.com

# =================== Package Deployment Credentials ================
deploy.username		= user@domain.com
deploy.password		= password
deploy.url			= https://login.salesforce.com

# Use 'https://login.salesforce.com' for production or developer edition (the default if not specified).
# Use 'https://test.salesforce.com for sandbox.
</pre><b>Creating the Deployment Package</b><br /><br />
The Force.com Migration Tool expects a structured directory that includes a package.xml
file describing the changes to be deployed. You can manually create this structure
but it's far easier to let Eclipse create the package for you.<br /><br />
1) Begin by opening Eclipse and starting a new Force.com project.<br /><img src="http://www.embracingthecloud.com/content/binary/ant_new_project.png" width="640" border="0" /><br /><br />
2) Give the project a change-specific name and provide connection credentials to the
source development environment (not production).<br /><img src="http://www.embracingthecloud.com/content/binary/ant_new_project_details.png" border="0" /><br /><br />
3) When given the option to choose initial project contents, check the "Selected metadata
components" option and click "Choose..."<br /><img src="http://www.embracingthecloud.com/content/binary/ant_choose_meta_option.png" border="0" /><br /><br />
4) Expand the component tree folders and select only the components to be deployed
(see principle #2 on minimalism. "Deploy only what is needed, and nothing more")<br /><img src="http://www.embracingthecloud.com/content/binary/ant_meta_select.png" border="0" /><br /><br />
5) You should now have a project in the structure required by the Force.com migration
tool<br /><img src="http://www.embracingthecloud.com/content/binary/ant_chg_package.png" border="0" /><br /><br />
6) Create a new sub-directory under the changes directory; in this case named CHG12345;
and copy the 'src' directory to this folder.<br /><pre class="brush: java;">
mkdir ~/Documents/workspace/changes/CHG12345
cp -r ~/Documents/workspace/CHG12345/src ~/Documents/workspace/changes/CHG12345
</pre><br />
7) Copy the following ant build.xml template to the change directory.<br /><br /><pre class="brush: java;">
&lt;project name="Salesforce Package Deployment Script" default="usage" basedir="." xmlns:sf="antlib:com.salesforce"&gt;
	&lt;property file="../sforce.properties"/&gt;

	&lt;target name="usage"&gt;
		&lt;echo&gt;Usage: ant [task]
Task options:
ant validate: Simulates a deployment of the package and returns pass/fail debugging information
ant deploy: Deploys the package items defined in package/package.xml
ant undeploy: Rolls back deployed items (must follow ant deploy)
	&lt;/target&gt;
	
	&lt;target name="validate"&gt;
		&lt;sf:deploy 
			username="${sandbox.username}" 
			password="${sandbox.password}" 
			serverurl="${sandbox.url}" 
			deployRoot="src" 
			logType="Detail" 
			checkOnly="true"
			runAllTests="true"
			pollWaitMillis="10000"
			maxPoll="200" /&gt;
	&lt;/target&gt;
	
	&lt;target name="deploy"&gt;
		&lt;sf:deploy 
			username="${deploy.username}" 
			password="${deploy.password}" 
			serverurl="${deploy.url}" 
			deployRoot="src"
			pollWaitMillis="10000" 
			maxPoll="200"&gt;
		&lt;/sf:deploy&gt;
	&lt;/target&gt;
	
	&lt;target name="undeploy"&gt;
		&lt;sf:deploy username="${deploy.username}" password="${deploy.password}" serverurl="${deploy.url}" deployRoot="src"/&gt;
	&lt;/target&gt;
&lt;/project&gt;
</pre><br /><br />
Some notes on the build.xml template 
<ul><li>
Notice that the environment variables are pulled in from sforce.properties in the
parent directory. 
</li><li>
The "validate" target uses a sandbox for testing the deployment 
</li><li>
Winter '11 introduced the ability to refresh dev and config sandboxes daily. Validating
a deployment against a recently refreshed sandbox will identify any potential production
deployments upfront 
</li><li>
The "deploy" target uses the production credentials 
</li><li>
"undeploy" must be run immediately after a "deploy" to work. Undeploy has some quarky
requirements and is not always known to work as expected 
</li></ul><b>Deploying the Package</b><br /><br />
All that is left to do is run ant from the change directory and call the specific
validate or deploy targets. If validation or deployment time out, then adjust the
polling attributes on the targets.<br /><br /><i>Note: It's common to check-in the package to a source control repository prior
to deployment to production.</i><br /><br /><pre class="brush: java;">
cd ~/Documents/workspace/changes/CHG12345
ant validate
ant deploy
</pre><img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=58280a43-1e6f-4d6f-b224-9f8522d534b4" /></body>
      <title>Salesforce Release Management</title>
      <guid isPermaLink="false">http://www.embracingthecloud.com/PermaLink,guid,58280a43-1e6f-4d6f-b224-9f8522d534b4.aspx</guid>
      <link>http://www.embracingthecloud.com/2011/02/22/SalesforceReleaseManagement.aspx</link>
      <pubDate>Tue, 22 Feb 2011 05:00:00 GMT</pubDate>
      <description>Managing the release of Force.com changes in a fast paced environment requires an agile development methodology with a focus on:
&lt;ol&gt;
&lt;li&gt;
Continuous Integration - Support daily deployments 
&lt;li&gt;
Minimalism - Incrementally deploy only what is needed, and nothing more 
&lt;li&gt;
Reliability - Changes should be 100% backwards compatible and not break existing functionality 
&lt;/ol&gt;
The &lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_deploying_ant.htm" target="_new"&gt;Force.com
Migration Tool&lt;/a&gt; is a key component to a successful release management process.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Release Management Overview&lt;/b&gt; 
&lt;ul&gt;
&lt;li&gt;
Start the refresh of a sandbox named "staging" 
&lt;li&gt;
Package a release using Eclipse 
&lt;li&gt;
Create an ant package and validate the deployment against the staging sandbox 
&lt;li&gt;
Deploy the changes to production 
&lt;/ul&gt;
It's assumed that standard change approvals, code review, and user acceptance testing
have already taken place prior to these steps.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Setting Up The Environment&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
(Note: The following examples are all using Macbook Bash shell. The windows shell
counterparts for making directories and copying files are very similar)&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://na7.salesforce.com/dwnld/SfdcAnt/salesforce_ant_21.0.zip" target="_new"&gt;Download
the Force.com Migration Tool&lt;/a&gt; and unzip to a temp directory.&lt;br /&gt;
&lt;br /&gt;
Create a directory for managing ANT deployment packages named something like "changes".
Copy the ant-salesforce.jar file to this directory. (It may be easier to manage changes
from within the Eclipse workspace folder)&lt;br /&gt;
&lt;br /&gt;
This directory will contain 2 files used by all releases.&lt;br /&gt;
&lt;pre class="brush: html;"&gt;
~/Documents/workspace/changes/ant-salesforce.jar
~/Documents/workspace/changes/sforce.properties
&lt;/pre&gt;
&lt;br /&gt;
Manually create the sforce.properties file from the following template. 
&lt;br /&gt;
&lt;pre class="brush: text;"&gt;
# sforce.properties
#

# =================== Sandbox Org Credentials ===============
sandbox.username	= user@domain.com.staging
sandbox.password	= password
sandbox.url			= https://test.salesforce.com

# =================== Package Deployment Credentials ================
deploy.username		= user@domain.com
deploy.password		= password
deploy.url			= https://login.salesforce.com

# Use 'https://login.salesforce.com' for production or developer edition (the default if not specified).
# Use 'https://test.salesforce.com for sandbox.
&lt;/pre&gt;
&lt;b&gt;Creating the Deployment Package&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
The Force.com Migration Tool expects a structured directory that includes a package.xml
file describing the changes to be deployed. You can manually create this structure
but it's far easier to let Eclipse create the package for you.&lt;br /&gt;
&lt;br /&gt;
1) Begin by opening Eclipse and starting a new Force.com project.&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/ant_new_project.png" width="640" border="0"&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Give the project a change-specific name and provide connection credentials to the
source development environment (not production).&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/ant_new_project_details.png" border="0"&gt;
&lt;br /&gt;
&lt;br /&gt;
3) When given the option to choose initial project contents, check the "Selected metadata
components" option and click "Choose..."&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/ant_choose_meta_option.png" border="0"&gt;
&lt;br /&gt;
&lt;br /&gt;
4) Expand the component tree folders and select only the components to be deployed
(see principle #2 on minimalism. "Deploy only what is needed, and nothing more")&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/ant_meta_select.png" border="0"&gt;
&lt;br /&gt;
&lt;br /&gt;
5) You should now have a project in the structure required by the Force.com migration
tool&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/ant_chg_package.png" border="0"&gt;
&lt;br /&gt;
&lt;br /&gt;
6) Create a new sub-directory under the changes directory; in this case named CHG12345;
and copy the 'src' directory to this folder.&lt;br /&gt;
&lt;pre class="brush: java;"&gt;
mkdir ~/Documents/workspace/changes/CHG12345
cp -r ~/Documents/workspace/CHG12345/src ~/Documents/workspace/changes/CHG12345
&lt;/pre&gt;
&lt;br /&gt;
7) Copy the following ant build.xml template to the change directory.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: java;"&gt;
&amp;lt;project name="Salesforce Package Deployment Script" default="usage" basedir="." xmlns:sf="antlib:com.salesforce"&amp;gt;
	&amp;lt;property file="../sforce.properties"/&amp;gt;

	&amp;lt;target name="usage"&amp;gt;
		&amp;lt;echo&amp;gt;Usage: ant [task]
Task options:
ant validate: Simulates a deployment of the package and returns pass/fail debugging information
ant deploy: Deploys the package items defined in package/package.xml
ant undeploy: Rolls back deployed items (must follow ant deploy)
	&amp;lt;/target&amp;gt;
	
	&amp;lt;target name="validate"&amp;gt;
		&amp;lt;sf:deploy 
			username="${sandbox.username}" 
			password="${sandbox.password}" 
			serverurl="${sandbox.url}" 
			deployRoot="src" 
			logType="Detail" 
			checkOnly="true"
			runAllTests="true"
			pollWaitMillis="10000"
			maxPoll="200" /&amp;gt;
	&amp;lt;/target&amp;gt;
	
	&amp;lt;target name="deploy"&amp;gt;
		&amp;lt;sf:deploy 
			username="${deploy.username}" 
			password="${deploy.password}" 
			serverurl="${deploy.url}" 
			deployRoot="src"
			pollWaitMillis="10000" 
			maxPoll="200"&amp;gt;
		&amp;lt;/sf:deploy&amp;gt;
	&amp;lt;/target&amp;gt;
	
	&amp;lt;target name="undeploy"&amp;gt;
		&amp;lt;sf:deploy username="${deploy.username}" password="${deploy.password}" serverurl="${deploy.url}" deployRoot="src"/&amp;gt;
	&amp;lt;/target&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Some notes on the build.xml template 
&lt;ul&gt;
&lt;li&gt;
Notice that the environment variables are pulled in from sforce.properties in the
parent directory. 
&lt;li&gt;
The "validate" target uses a sandbox for testing the deployment 
&lt;li&gt;
Winter '11 introduced the ability to refresh dev and config sandboxes daily. Validating
a deployment against a recently refreshed sandbox will identify any potential production
deployments upfront 
&lt;li&gt;
The "deploy" target uses the production credentials 
&lt;li&gt;
"undeploy" must be run immediately after a "deploy" to work. Undeploy has some quarky
requirements and is not always known to work as expected 
&lt;/ul&gt;
&lt;b&gt;Deploying the Package&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
All that is left to do is run ant from the change directory and call the specific
validate or deploy targets. If validation or deployment time out, then adjust the
polling attributes on the targets.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Note: It's common to check-in the package to a source control repository prior
to deployment to production.&lt;/i&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: java;"&gt;
cd ~/Documents/workspace/changes/CHG12345
ant validate
ant deploy
&lt;/pre&gt;
&lt;img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=58280a43-1e6f-4d6f-b224-9f8522d534b4" /&gt;</description>
      <comments>http://www.embracingthecloud.com/CommentView,guid,58280a43-1e6f-4d6f-b224-9f8522d534b4.aspx</comments>
      <category>Salesforce</category>
    </item>
    <item>
      <trackback:ping>http://www.embracingthecloud.com/Trackback.aspx?guid=d17b467a-c2be-4987-be65-67e07668d0d7</trackback:ping>
      <pingback:server>http://www.embracingthecloud.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.embracingthecloud.com/PermaLink,guid,d17b467a-c2be-4987-be65-67e07668d0d7.aspx</pingback:target>
      <dc:creator>Mike Leach</dc:creator>
      <wfw:comment>http://www.embracingthecloud.com/CommentView,guid,d17b467a-c2be-4987-be65-67e07668d0d7.aspx</wfw:comment>
      <wfw:commentRss>http://www.embracingthecloud.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d17b467a-c2be-4987-be65-67e07668d0d7</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">I've decided to borrow an old Harley-Davidson
saying as my definition for the cloud.<br /><br /><i>"If I have to explain, you wouldn't understand"</i><br /><br />
Once you're riding the cloud development wave, you'll never turn back :-)<br /><p></p><img src="http://www.embracingthecloud.com/content/binary/Explain_Cloud.jpg" border="0" /><img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=d17b467a-c2be-4987-be65-67e07668d0d7" /></body>
      <title>"If I have to explain (the cloud) you wouldn't understand"</title>
      <guid isPermaLink="false">http://www.embracingthecloud.com/PermaLink,guid,d17b467a-c2be-4987-be65-67e07668d0d7.aspx</guid>
      <link>http://www.embracingthecloud.com/2011/02/21/IfIHaveToExplainTheCloudYouWouldntUnderstand.aspx</link>
      <pubDate>Mon, 21 Feb 2011 03:38:13 GMT</pubDate>
      <description>I've decided to borrow an old Harley-Davidson saying as my definition for the cloud.&lt;br&gt;
&lt;br&gt;
&lt;i&gt;"If I have to explain, you wouldn't understand"&lt;/i&gt;
&lt;br&gt;
&lt;br&gt;
Once you're riding the cloud development wave, you'll never turn back :-)&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Explain_Cloud.jpg" border="0"&gt;&lt;img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=d17b467a-c2be-4987-be65-67e07668d0d7" /&gt;</description>
      <comments>http://www.embracingthecloud.com/CommentView,guid,d17b467a-c2be-4987-be65-67e07668d0d7.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.embracingthecloud.com/Trackback.aspx?guid=174ff02c-2cb4-4ef7-9dd0-1bee446c273d</trackback:ping>
      <pingback:server>http://www.embracingthecloud.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.embracingthecloud.com/PermaLink,guid,174ff02c-2cb4-4ef7-9dd0-1bee446c273d.aspx</pingback:target>
      <dc:creator>Mike Leach</dc:creator>
      <wfw:comment>http://www.embracingthecloud.com/CommentView,guid,174ff02c-2cb4-4ef7-9dd0-1bee446c273d.aspx</wfw:comment>
      <wfw:commentRss>http://www.embracingthecloud.com/SyndicationService.asmx/GetEntryCommentsRss?guid=174ff02c-2cb4-4ef7-9dd0-1bee446c273d</wfw:commentRss>
      <slash:comments>7</slash:comments>
      <title>Using Batch Apex</title>
      <guid isPermaLink="false">http://www.embracingthecloud.com/PermaLink,guid,174ff02c-2cb4-4ef7-9dd0-1bee446c273d.aspx</guid>
      <link>http://www.embracingthecloud.com/2011/01/23/UsingBatchApex.aspx</link>
      <pubDate>Sun, 23 Jan 2011 20:07:02 GMT</pubDate>
      <description>Salesforce Administrators and Developers are routinely required to manipulate large amounts of data in a single task.&lt;br /&gt;
&lt;br /&gt;
Examples of batch processes include: 
&lt;ul&gt;
&lt;li&gt;
Deleting all Leads that are older than 2 years 
&lt;li&gt;
Replacing all occurrences of an old value with a new value 
&lt;li&gt;
Updating user records with a new company name 
&lt;/ul&gt;
&lt;br /&gt;
The tools and options available are: 
&lt;ol&gt;
&lt;li&gt;
Browser-based Admin features / Execute anonymous in System Log 
&lt;li&gt;
Data loader 
&lt;li&gt;
Generalized Batch Apex &lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_batch_interface.htm" target=_blank&gt;(Online
documentation)&lt;/a&gt; 
&lt;li&gt;
Specialized Batch Apex 
&lt;/ol&gt;
Option 1 (Admin Settings) represents the category of features and tools available
when directly logging into Salesforce via a web browser. The transactions are typically
synchronous and subject to Governor Limits.&lt;br /&gt;
&lt;br /&gt;
Option 2 (Data Loader) provides Admins with an Excel-like approach to downloading
data using the &lt;a href="http://wiki.developerforce.com/index.php/Apex_Data_Loader" target=_new&gt;Apex
Data Loader&lt;/a&gt;, manipulating data on a local PC, then uploading the data back to
Salesforce. Slightly more powerful than browser-based tools, doesn't require programming
skills, and subject to web service API governor limits (which are more generous).
But also requires slightly more manual effort and introduces the possibility of human
error when mass updating records.&lt;br /&gt;
&lt;br /&gt;
Option 3 (Generalized Batch Apex) introduces the option of asynchronous batch processes
that can manipulate up to 50 million records in a single batch. Doesn't require programming
(if using the 3 utility classes provided below in this blog post) and can be executed
directly through the web browser; but limited to the general use cases supported by
the utility classes. Some general purpose batch Apex utility classes are provided
at the end of this article.&lt;br /&gt;
&lt;br /&gt;
Option 4 (Specialized Batch Apex) requires Apex programming and provides the most
control of batch processing of records (such as updating several object types within
a batch or applying complex data enrichment before updating fields).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Batch Apex Class Structure:&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
The basic structure of a batch apex class looks like:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: java;"&gt;
global class BatchVerbNoun implements Database.Batchable&amp;lt;sObject&amp;gt;{
    global Database.QueryLocator start(Database.BatchableContext BC){
        return Database.getQueryLocator(query); //May return up to 50 Million records
    }
  
    global void execute(Database.BatchableContext BC, List&amp;lt;sObject&amp;gt; scope){       
        //Batch gets broken down into several smaller chunks
        //This method gets called for each chunk of work, passing in the scope of records to be processed
    }
   
    global void finish(Database.BatchableContext BC){   
        //This method gets called once when the entire batch is finished
    }
}
&lt;/pre&gt;
An Apex Developer simply fills in the blanks. The start() and finish() methods are
both executed once, while the execute() method gets called 1-N times, depending on
the number of batches.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Batch Apex Lifecycle&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
The Database.executeBatch() method is used to start a batch process. This method takes
2 parameters: instance of the batch class and scope.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: java;"&gt;
BatchUpdateFoo batch = new BatchUpdateFoo();
Database.executeBatch(batch, 200);
&lt;/pre&gt;
The scope parameter defines the max number of records to be processed in each batch.
For example, if the start() method returns 150,000 records and scope is defined as
200, then the overall batch will be broken down into 150,000/200 batches, which is
750. In this scenario, the execute() method would be called 750 times; and each time
passed 200 records.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;A note on batch sizes: Even though batch processes have significantly more access
to system resources, governor limits still apply. A batch that executes a single DML
operation may shoot for a batch scope of 500+. Batch executions that initiate a cascade
of trigger operations will need to use a smaller scope. 200 is a good general starting
point.&lt;/i&gt;
&lt;br /&gt;
&lt;br /&gt;
The start() method is called to determine the size of the batch then the batch is
put into a queue. There is no guarantee that the batch process will start when executeBatch()
is called, but 90% of the time the batch will start processing within 1 minute.&lt;br /&gt;
&lt;br /&gt;
You can login to Settings/Monitor/Apex Jobs to view batch progress.&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Batch_Apex_Monitor.png" border="0"&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Unit Testing Batch Apex:&lt;/b&gt;
&lt;br /&gt;
The asynchronous nature of batch apex makes it notoriously difficult to unit test
and debug. At Facebook, we use a general Logger utility that logs debug info to a
custom object (adding to the governor limit footprint). The &lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_batch_interface.htm" target=_blank&gt;online
documentation&lt;/a&gt; for batch apex provides some unit test examples, but the util methods
in this post use a short hand approach to achieving test coverage.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Batch Apex Best Practices:&lt;/b&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
Use extreme care if you are planning to invoke a batch job from a trigger. You must
be able to guarantee that the trigger will not add more batch jobs than the five that
are allowed. In particular, consider API bulk updates, import wizards, mass record
changes through the user interface, and all cases where more than one record can be
updated at a time. 
&lt;li&gt;
When you call Database.executeBatch, Salesforce.com only places the job in the queue
at the scheduled time. Actual execution may be delayed based on service availability. 
&lt;li&gt;
When testing your batch Apex, you can test only one execution of the execute method.
You can use the scope parameter of the executeBatch method to limit the number of
records passed into the execute method to ensure that you aren't running into governor
limits. 
&lt;li&gt;
The executeBatch method starts an asynchronous process. This means that when you test
batch Apex, you must make certain that the batch job is finished before testing against
the results. Use the Test methods startTest and stopTest around the executeBatch method
to ensure it finishes before continuing your test. 
&lt;li&gt;
Use Database.Stateful with the class definition if you want to share variables or
data across job transactions. Otherwise, all instance variables are reset to their
initial state at the start of each transaction. 
&lt;li&gt;
Methods declared as future are not allowed in classes that implement the Database.Batchable
interface. 
&lt;li&gt;
Methods declared as future cannot be called from a batch Apex class. 
&lt;li&gt;
You cannot call the Database.executeBatch method from within any batch Apex method. 
&lt;li&gt;
You cannot use the getContent and getContentAsPDF PageReference methods in a batch
job. 
&lt;li&gt;
In the event of a catastrophic failure such as a service outage, any operations in
progress are marked as Failed. You should run the batch job again to correct any errors. 
&lt;li&gt;
When a batch Apex job is run, email notifications are sent either to the user who
submitted the batch job, or, if the code is included in a managed package and the
subscribing organization is running the batch job, the email is sent to the recipient
listed in the Apex Exception Notification Recipient field. 
&lt;li&gt;
Each method execution uses the standard governor limits anonymous block, Visualforce
controller, or WSDL method. 
&lt;li&gt;
Each batch Apex invocation creates an AsyncApexJob record. Use the ID of this record
to construct a SOQL query to retrieve the job’s status, number of errors, progress,
and submitter. For more information about the AsyncApexJob object, see AsyncApexJob
in the Web Services API Developer's Guide. 
&lt;li&gt;
All methods in the class must be defined as global. 
&lt;li&gt;
For a sharing recalculation, Salesforce.com recommends that the execute method delete
and then re-create all Apex managed sharing for the records in the batch. This ensures
the sharing is accurate and complete. 
&lt;li&gt;
If in the course of developing a batch apex class you discover a bug during a batch
execution, Don't Panic. Simply login to the admin console to monitor Apex Jobs and
abort the running batch. 
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Utility Batch Apex Classes:&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
The following batch Apex classes can be copied and pasted into any Salesforce org
and called from the System Log (or Apex) using the "Execute Anonymous" feature. The
general structure of these utility classes are: 
&lt;ul&gt;
&lt;li&gt;
Accept task-specific input parameters 
&lt;li&gt;
Execute the batch 
&lt;li&gt;
Email the admin with batch results once complete 
&lt;/ul&gt;
To execute these utility batch apex classes.&lt;br /&gt;
1. Open the System Log&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Batch_Apex_Sys_Log.png" border="0"&gt;
&lt;br /&gt;
2. Click on the Execute Anonymous input text field.&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Batch_Apex_Sys_Exec_Anon.png" border="0"&gt;
&lt;br /&gt;
3. Paste any of the following batch apex classes (along with corresponding input parameters)
into the Execute Anonymous textarea, then click "Execute".&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Batch_Apex_Exec_Anon_Window.png" border="0"&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;BatchUpdateField.cls&lt;/b&gt; &lt;pre class="brush: java;"&gt;
/*
Run this batch from Execute Anonymous tab in Eclipse Force IDE or System Log using the following

string query = 'select Id, CompanyName from User';
BatchUpdateField batch = new BatchUpdateField(query, 'CompanyName', 'Bedrock Quarry');
Database.executeBatch(batch, 100); //Make sure to execute in batch sizes of 100 to avoid DML limit error
*/
global class BatchUpdateField implements Database.Batchable&amp;lt;sObject&amp;gt;{
    global final String Query;
    global final String Field;
    global final String Value;
   
    global BatchUpdateField(String q, String f, String v){
        Query = q;
        Field = f;
        Value = v;
    }
   
    global Database.QueryLocator start(Database.BatchableContext BC){
        return Database.getQueryLocator(query);
    }
   
    global void execute(Database.BatchableContext BC, List&amp;lt;sObject&amp;gt; scope){   
        for(sobject s : scope){
            s.put(Field,Value);
         }
        update scope;
    }
   
    global void finish(Database.BatchableContext BC){   
        AsyncApexJob a = [Select Id, Status, NumberOfErrors, JobItemsProcessed,
            TotalJobItems, CreatedBy.Email
            from AsyncApexJob where Id = :BC.getJobId()];
       
        string message = 'The batch Apex job processed ' + a.TotalJobItems + ' batches with '+ a.NumberOfErrors + ' failures.';
       
        // Send an email to the Apex job's submitter notifying of job completion. 
        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        String[] toAddresses = new String[] {a.CreatedBy.Email};
        mail.setToAddresses(toAddresses);
        mail.setSubject('Salesforce BatchUpdateField ' + a.Status);
        mail.setPlainTextBody('The batch Apex job processed ' + a.TotalJobItems + ' batches with '+ a.NumberOfErrors + ' failures.');
        Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });   
    }
   
    public static testMethod void tests(){
        Test.startTest();
        string query = 'select Id, CompanyName from User';
        BatchUpdateField batch = new BatchUpdateField(query, 'CompanyName', 'Bedrock Quarry');
        Database.executeBatch(batch, 100);
        Test.stopTest();
    }
}
&lt;/pre&gt;
&lt;b&gt;BatchSearchReplace.cls&lt;/b&gt; &lt;pre class="brush: java;"&gt;
/*
Run this batch from Execute Anonymous tab in Eclipse Force IDE or System Log using the following

string query = 'select Id, Company from Lead';
BatchSearchReplace batch = new BatchSearchReplace(query, 'Company', 'Sun', 'Oracle');
Database.executeBatch(batch, 100); //Make sure to execute in batch sizes of 100 to avoid DML limit error
*/
global class BatchSearchReplace implements Database.Batchable&amp;lt;sObject&amp;gt;{
    global final String Query;
    global final String Field;
    global final String SearchValue;
    global final String ReplaceValue;
   
    global BatchSearchReplace(String q, String f, String sValue, String rValue){
        Query = q;
        Field = f;
        SearchValue = sValue;
        ReplaceValue = rValue;
    }
   
    global Database.QueryLocator start(Database.BatchableContext BC){
        return Database.getQueryLocator(query);
    }
   
    global void execute(Database.BatchableContext BC, List&amp;lt;sObject&amp;&amp;gt; scope){   
        for(sobject s : scope){
            string currentValue = String.valueof( s.get(Field) );
            if(currentValue != null &amp;&amp; currentValue == SearchValue){
                s.put(Field, ReplaceValue);
            }
         }
        update scope;
    }
   
    global void finish(Database.BatchableContext BC){   
        AsyncApexJob a = [Select Id, Status, NumberOfErrors, JobItemsProcessed,
            TotalJobItems, CreatedBy.Email
            from AsyncApexJob where Id = :BC.getJobId()];
       
        string message = 'The batch Apex job processed ' + a.TotalJobItems + ' batches with '+ a.NumberOfErrors + ' failures.';
       
        // Send an email to the Apex job's submitter notifying of job completion. 
        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        String[] toAddresses = new String[] {a.CreatedBy.Email};
        mail.setToAddresses(toAddresses);
        mail.setSubject('Salesforce BatchSearchReplace ' + a.Status);
        mail.setPlainTextBody('The batch Apex job processed ' + a.TotalJobItems + ' batches with '+ a.NumberOfErrors + ' failures.');
        Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });   
    }
   
    public static testMethod void tests(){
        Test.startTest();
        string query = 'select Id, Company from Lead';
        BatchSearchReplace batch = new BatchSearchReplace(query, 'Company', 'Foo', 'Bar');
        Database.executeBatch(batch, 100);
        Test.stopTest();
    }
}
&lt;/pre&gt;
&lt;b&gt;BatchRecordDelete.cls:&lt;/b&gt; &lt;pre class="brush: java;"&gt;
/*
Run this batch from Execute Anonymous tab in Eclipse Force IDE or System Log using the following

string query = 'select Id from ObjectName where field=criteria';
BatchRecordDelete batch = new BatchRecordDelete(query);
Database.executeBatch(batch, 200); //Make sure to execute in batch sizes of 200 to avoid DML limit error
*/
global class BatchRecordDelete implements Database.Batchable&amp;lt;sObject&amp;gt;{
    global final String Query;
   
    global BatchRecordDelete(String q){
        Query = q;   
    }
   
    global Database.QueryLocator start(Database.BatchableContext BC){
        return Database.getQueryLocator(query);
    }
   
    global void execute(Database.BatchableContext BC, List&amp;lt;sObject&amp;&amp;gt; scope){       
        delete scope;
    }
   
    global void finish(Database.BatchableContext BC){   
        AsyncApexJob a = [Select Id, Status, NumberOfErrors, JobItemsProcessed,
            TotalJobItems, CreatedBy.Email
            from AsyncApexJob where Id = :BC.getJobId()];
       
        string message = 'The batch Apex job processed ' + a.TotalJobItems + ' batches with '+ a.NumberOfErrors + ' failures.';
       
        // Send an email to the Apex job's submitter notifying of job completion. 
        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        String[] toAddresses = new String[] {a.CreatedBy.Email};
        mail.setToAddresses(toAddresses);
        mail.setSubject('Salesforce BatchRecordDelete ' + a.Status);
        mail.setPlainTextBody('The batch Apex job processed ' + a.TotalJobItems + ' batches with '+ a.NumberOfErrors + ' failures.');
        Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });   
    }
   
    public static testMethod void tests(){
        Test.startTest();
        string query = 'select Id, CompanyName from User where CompanyName="foo"';
        BatchRecordDelete batch = new BatchRecordDelete(query);
        Database.executeBatch(batch, 100);
        Test.stopTest();
    }
}
&lt;/pre&gt;&lt;img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=174ff02c-2cb4-4ef7-9dd0-1bee446c273d" /&gt;</description>
      <comments>http://www.embracingthecloud.com/CommentView,guid,174ff02c-2cb4-4ef7-9dd0-1bee446c273d.aspx</comments>
      <category>Apex</category>
      <category>Salesforce</category>
    </item>
    <item>
      <trackback:ping>http://www.embracingthecloud.com/Trackback.aspx?guid=bd18cccb-f783-4508-94f9-46c8ec74ebe1</trackback:ping>
      <pingback:server>http://www.embracingthecloud.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.embracingthecloud.com/PermaLink,guid,bd18cccb-f783-4508-94f9-46c8ec74ebe1.aspx</pingback:target>
      <dc:creator>Mike Leach</dc:creator>
      <wfw:comment>http://www.embracingthecloud.com/CommentView,guid,bd18cccb-f783-4508-94f9-46c8ec74ebe1.aspx</wfw:comment>
      <wfw:commentRss>http://www.embracingthecloud.com/SyndicationService.asmx/GetEntryCommentsRss?guid=bd18cccb-f783-4508-94f9-46c8ec74ebe1</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">If you’re a Developer, then Dreamforce
2010 was a very good year. Perhaps there was a new killer business user feature announced
in a Sales breakout session somewhere, but I unfortunately missed it. The conference
kicked-off with <a href="http://www.cloudstockevent.com">Cloudstock</a> on Monday
and each subsequent day brought about one announcement after another targeting cloud
developers.<br /><br />
The ultimate in serendipitous geekery had to be the Node.js session with Ryan Dahl.
One day I’m <a href="http://www.embracingthecloud.com/2010/12/05/InstallingNodejsOnAmazonEC2.aspx">hacking
away</a> on node.js and the next I’m running into the core developer at CloudStock.
I’m really hooked on this new recipe for the cloud of Linux+Node+NoSQL (is there a
cool acronym for this stack yet? LinodeSQL?). Thread based web server processing is
starting to feel “old school” thanks to Ryan.<br /><br /><a href="http://www.database.com">Database.com</a> was the major announcement on Tuesday
and, in my opinion, was way past due. The .NET open source toolkit <a href="http://blog.sforce.com/sforce/2006/09/open_source_por.html">co-launched
with Salesforce in 2006</a> was built on the premise of using Salesforce as a language
agnostic platform. Whether you are a Java, C#, Ruby, or PHP Developer should be irrelevant
when using a database in the cloud that is accessible via web services (Given that
~50% of enterprise IT shops have Microsoft Developers on staff and C# adoption continues
to grow, it seemed logical to win over this community with next generation tools and
services that make them more productive in the cloud).<br /><br />
However, the launch of Apex and the AppExchange brought about a few years of obligatory
Marketing and promotion of only native platform features while the language agnostic
"hybrid" crowd sat patiently, admiring the work of <a href="http://www.pocketsoap.com/weblog/">Simon
Fell</a>'s web services API and the potential for real-time integration between apps.<br /><br />
The “language agnosticism” of database.com was further reinforced with the announced
acquisition of <a href="http://heroku.com/">Heroku</a>. Whether the Ruby community
would have naturally gravitated to database.com on their own or the acquisition was
necessary to accelerate and demonstrate the value will be perpetually debated.<br /><br />
But the Heroku acquisition somewhat makes sense to me. Back in April I <a href="http://www.embracingthecloud.com/2010/04/29/ThoughtsOnVMForce.aspx">wrote
the following</a> about VMForce:<br /><br /><i>"I think other ORM Developer communities, such as Ruby on Rails Developers, will
appreciate what is being offered with VMForce, prompting some to correctly draw parallels
between VMForce and Engine Yard.</i>"<br /><br />
Same concept, different Ruby hosting vendor (Engine Yard has the low-level levers
necessary for enterprise development IMO). The ORM mentality of RoR Developers; who
are simply tired of futzing around with relational DBs, indexes, and clusters; are
a good D-Day beachhead from which Salesforce can launch their new platform message.<br /><br />
Salesforce Marketing will probably need to tread carefully around the message of “Twitter
and Groupon use Ruby on Rails” to maintain credibility in this community. While these
statements are technically true, Fail Whales galore prompted Twitter to massively
rearchitect their platform, which resulted in the development of <a href="http://en.wikipedia.org/wiki/FlockDB">Flock
DB</a> and crap loads of memcache servers.<br /><br />
The fact remains that very few massively scaled cloud services run on a relational
database. Twitter, Groupon, Facebook, and most other sites run on eventually consistent,
massively scaled NoSQL (Not only SQL) architectures. Only Salesforce has developed
the intellectual property, talent, and index optimizing algorithms to carry forward
relational ACID transactions into the cloud.<br /><br />
The pricing and scalability of database.com appear to fit well for SMB apps or 1-3
month ephemeral large enterprise apps (campaigns or conference apps like Dreamforce.com).<br /><br /><b>REST API</b><br />
The RESTful interface hack blogged <a href="http://www.embracingthecloud.com/2010/05/28/ASimpleRESTfulInterfaceUsingSalesforceSitesVisualforceAndApex.aspx">back
in May</a> will soon be a fully supported feature in Spring ‘11.<br /><br /><b>SiteForce</b><br />
SiteForce looked pretty impressive. I’m guessing SiteForce is the work of SiteMasher
talent. Web Designers and Developers accustomed to using apps like Dreamweaver or
Front Page will definitely want to check this out.<br /><br /><b>Governor Limits</b><br />
Oh yeah, we all hate ‘em but understand they’re a necessary evil to keep rogue code
from stealing valuable computing resources away from other tenants on the platform.
The big news was that the number of governor limits will be dropping from ~55 down
to 16 in the next major release by removing the trigger context limits (this brought
serious applause from the crowd).<br /><br /><b>Platform State of the Union </b><br />
The Developer platform state of the union was full of surprises. Shortly after being
given a Developer Hero award for the <a href="http://www.embracingthecloud.com/2010/06/25/ChatterDeveloperChallengeAndHackathonRoundup.aspx">Chatter
Bot</a> app developed earlier this year, Salesforce demonstrated full breakpoint/step-through
debugging between Eclipse and a Salesforce Org. 
<br /><br />
This is a skunkworks-type project still in it’s infancy that will hopefully see the
light of day. The demo definitely left me wondering “How’d he do that? Persistent
UDP connections? Is that HTTP or some other protocol? Is a database connection being
left open? What are the timeout limitations? How does Eclipse get a focus callback
from a web browser?”<br /><br /><b>Permission Sets</b><br />
Where were they? I was really hoping Salesforce would go all in and take their cloud
database technology to the next level of access control by announcing granular permission
management with the release of permission sets.<br /><br />
This is a subtle feature not widely appreciated by most Salesforce users or admins,
but any Salesforce org with more than 100 users understands the need for permission
sets.<br /><br /><b>Conclusion</b><br />
The technology and features were great, but the real highlight of the conference was
networking with people.<br /><br />
I really need to hang out with more Salesforce employees now that I live in the bay.
Conversations with the Salesforce CIO, Evangelists, Engineers, and Product Managers
were energizing. 
<br /><br />
To have our <a href="http://venturebeat.com/2010/12/08/tim-campos-dreamforce-comments/">CIO</a> and
IT Team attend Dreamforce and be aligned on Force.com as a strategic platform is invigorating
and makes Facebook an exciting place to work. 
<br /><br />
The family of Salesforce friends on Twitter continues to grow. It’s always great to
meet online friends in person and hang out with existing friends. See you all at Dreamforce
2011!<br /><br /><p></p><i>Honored to receive one of three Developer Hero awards. Thank you Salesforce!</i><br /><img src="http://www.embracingthecloud.com/content/binary/df10Award.jpg" height="555" width="416" border="0" /><img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=bd18cccb-f783-4508-94f9-46c8ec74ebe1" /></body>
      <title>Dreamforce 2010: Bring On The Developers</title>
      <guid isPermaLink="false">http://www.embracingthecloud.com/PermaLink,guid,bd18cccb-f783-4508-94f9-46c8ec74ebe1.aspx</guid>
      <link>http://www.embracingthecloud.com/2010/12/15/Dreamforce2010BringOnTheDevelopers.aspx</link>
      <pubDate>Wed, 15 Dec 2010 06:39:19 GMT</pubDate>
      <description>If you’re a Developer, then Dreamforce 2010 was a very good year. Perhaps there was a new killer business user feature announced in a Sales breakout session somewhere, but I unfortunately missed it. The conference kicked-off with &lt;a href="http://www.cloudstockevent.com"&gt;Cloudstock&lt;/a&gt; on
Monday and each subsequent day brought about one announcement after another targeting
cloud developers.&lt;br&gt;
&lt;br&gt;
The ultimate in serendipitous geekery had to be the Node.js session with Ryan Dahl.
One day I’m &lt;a href="http://www.embracingthecloud.com/2010/12/05/InstallingNodejsOnAmazonEC2.aspx"&gt;hacking
away&lt;/a&gt; on node.js and the next I’m running into the core developer at CloudStock.
I’m really hooked on this new recipe for the cloud of Linux+Node+NoSQL (is there a
cool acronym for this stack yet? LinodeSQL?). Thread based web server processing is
starting to feel “old school” thanks to Ryan.&lt;br&gt;
&lt;br&gt;
&lt;a href="http://www.database.com"&gt;Database.com&lt;/a&gt; was the major announcement on Tuesday
and, in my opinion, was way past due. The .NET open source toolkit &lt;a href="http://blog.sforce.com/sforce/2006/09/open_source_por.html"&gt;co-launched
with Salesforce in 2006&lt;/a&gt; was built on the premise of using Salesforce as a language
agnostic platform. Whether you are a Java, C#, Ruby, or PHP Developer should be irrelevant
when using a database in the cloud that is accessible via web services (Given that
~50% of enterprise IT shops have Microsoft Developers on staff and C# adoption continues
to grow, it seemed logical to win over this community with next generation tools and
services that make them more productive in the cloud).&lt;br&gt;
&lt;br&gt;
However, the launch of Apex and the AppExchange brought about a few years of obligatory
Marketing and promotion of only native platform features while the language agnostic
"hybrid" crowd sat patiently, admiring the work of &lt;a href="http://www.pocketsoap.com/weblog/"&gt;Simon
Fell&lt;/a&gt;'s web services API and the potential for real-time integration between apps.&lt;br&gt;
&lt;br&gt;
The “language agnosticism” of database.com was further reinforced with the announced
acquisition of &lt;a href="http://heroku.com/"&gt;Heroku&lt;/a&gt;. Whether the Ruby community
would have naturally gravitated to database.com on their own or the acquisition was
necessary to accelerate and demonstrate the value will be perpetually debated.&lt;br&gt;
&lt;br&gt;
But the Heroku acquisition somewhat makes sense to me. Back in April I &lt;a href="http://www.embracingthecloud.com/2010/04/29/ThoughtsOnVMForce.aspx"&gt;wrote
the following&lt;/a&gt; about VMForce:&lt;br&gt;
&lt;br&gt;
&lt;i&gt;"I think other ORM Developer communities, such as Ruby on Rails Developers, will
appreciate what is being offered with VMForce, prompting some to correctly draw parallels
between VMForce and Engine Yard.&lt;/i&gt;"&lt;br&gt;
&lt;br&gt;
Same concept, different Ruby hosting vendor (Engine Yard has the low-level levers
necessary for enterprise development IMO). The ORM mentality of RoR Developers; who
are simply tired of futzing around with relational DBs, indexes, and clusters; are
a good D-Day beachhead from which Salesforce can launch their new platform message.&lt;br&gt;
&lt;br&gt;
Salesforce Marketing will probably need to tread carefully around the message of “Twitter
and Groupon use Ruby on Rails” to maintain credibility in this community. While these
statements are technically true, Fail Whales galore prompted Twitter to massively
rearchitect their platform, which resulted in the development of &lt;a href="http://en.wikipedia.org/wiki/FlockDB"&gt;Flock
DB&lt;/a&gt; and crap loads of memcache servers.&lt;br&gt;
&lt;br&gt;
The fact remains that very few massively scaled cloud services run on a relational
database. Twitter, Groupon, Facebook, and most other sites run on eventually consistent,
massively scaled NoSQL (Not only SQL) architectures. Only Salesforce has developed
the intellectual property, talent, and index optimizing algorithms to carry forward
relational ACID transactions into the cloud.&lt;br&gt;
&lt;br&gt;
The pricing and scalability of database.com appear to fit well for SMB apps or 1-3
month ephemeral large enterprise apps (campaigns or conference apps like Dreamforce.com).&lt;br&gt;
&lt;br&gt;
&lt;b&gt;REST API&lt;/b&gt;
&lt;br&gt;
The RESTful interface hack blogged &lt;a href="http://www.embracingthecloud.com/2010/05/28/ASimpleRESTfulInterfaceUsingSalesforceSitesVisualforceAndApex.aspx"&gt;back
in May&lt;/a&gt; will soon be a fully supported feature in Spring ‘11.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;SiteForce&lt;/b&gt;
&lt;br&gt;
SiteForce looked pretty impressive. I’m guessing SiteForce is the work of SiteMasher
talent. Web Designers and Developers accustomed to using apps like Dreamweaver or
Front Page will definitely want to check this out.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Governor Limits&lt;/b&gt;
&lt;br&gt;
Oh yeah, we all hate ‘em but understand they’re a necessary evil to keep rogue code
from stealing valuable computing resources away from other tenants on the platform.
The big news was that the number of governor limits will be dropping from ~55 down
to 16 in the next major release by removing the trigger context limits (this brought
serious applause from the crowd).&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Platform State of the Union &lt;/b&gt;
&lt;br&gt;
The Developer platform state of the union was full of surprises. Shortly after being
given a Developer Hero award for the &lt;a href="http://www.embracingthecloud.com/2010/06/25/ChatterDeveloperChallengeAndHackathonRoundup.aspx"&gt;Chatter
Bot&lt;/a&gt; app developed earlier this year, Salesforce demonstrated full breakpoint/step-through
debugging between Eclipse and a Salesforce Org. 
&lt;br&gt;
&lt;br&gt;
This is a skunkworks-type project still in it’s infancy that will hopefully see the
light of day. The demo definitely left me wondering “How’d he do that? Persistent
UDP connections? Is that HTTP or some other protocol? Is a database connection being
left open? What are the timeout limitations? How does Eclipse get a focus callback
from a web browser?”&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Permission Sets&lt;/b&gt;
&lt;br&gt;
Where were they? I was really hoping Salesforce would go all in and take their cloud
database technology to the next level of access control by announcing granular permission
management with the release of permission sets.&lt;br&gt;
&lt;br&gt;
This is a subtle feature not widely appreciated by most Salesforce users or admins,
but any Salesforce org with more than 100 users understands the need for permission
sets.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Conclusion&lt;/b&gt;
&lt;br&gt;
The technology and features were great, but the real highlight of the conference was
networking with people.&lt;br&gt;
&lt;br&gt;
I really need to hang out with more Salesforce employees now that I live in the bay.
Conversations with the Salesforce CIO, Evangelists, Engineers, and Product Managers
were energizing. 
&lt;br&gt;
&lt;br&gt;
To have our &lt;a href="http://venturebeat.com/2010/12/08/tim-campos-dreamforce-comments/"&gt;CIO&lt;/a&gt; and
IT Team attend Dreamforce and be aligned on Force.com as a strategic platform is invigorating
and makes Facebook an exciting place to work. 
&lt;br&gt;
&lt;br&gt;
The family of Salesforce friends on Twitter continues to grow. It’s always great to
meet online friends in person and hang out with existing friends. See you all at Dreamforce
2011!&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;i&gt;Honored to receive one of three Developer Hero awards. Thank you Salesforce!&lt;/i&gt;
&lt;br&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/df10Award.jpg" height="555" width="416" border="0"&gt;&lt;img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=bd18cccb-f783-4508-94f9-46c8ec74ebe1" /&gt;</description>
      <comments>http://www.embracingthecloud.com/CommentView,guid,bd18cccb-f783-4508-94f9-46c8ec74ebe1.aspx</comments>
      <category>Salesforce</category>
    </item>
  </channel>
</rss>
