<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>Summa Blog</title>
	<atom:link href="http://www.summa-tech.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.summa-tech.com/blog</link>
	<description>Summa Blog</description>
	<lastBuildDate>Thu, 17 May 2012 14:13:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Summa Is Award Finalist at IBM’s Impact 2012</title>
		<link>http://www.summa-tech.com/blog/2012/05/17/summa-is-award-finalist-at-ibms-impact-2012/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=summa-is-award-finalist-at-ibms-impact-2012</link>
		<comments>http://www.summa-tech.com/blog/2012/05/17/summa-is-award-finalist-at-ibms-impact-2012/#comments</comments>
		<pubDate>Thu, 17 May 2012 14:13:24 +0000</pubDate>
		<dc:creator>Betty George</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4973</guid>
		<description><![CDATA[Summa was recognized three times as an award finalist last week during Impact 2012, IBM’s premier conference for business and IT leaders. The Impact Awards recognize partners who have demonstrated excellence in delivering business value solutions to clients based on their integrations with IBM’s WebSphere Portfolio. • Smart SOA Award &#8211; Summa was acknowledged for [...]]]></description>
			<content:encoded><![CDATA[<p>Summa was recognized three times as an award finalist last week during Impact 2012, IBM’s premier conference for business and IT leaders.  The Impact Awards recognize partners who have demonstrated excellence in delivering business value solutions to clients based on their integrations with IBM’s WebSphere Portfolio. </p>
<p>•	Smart SOA Award &#8211; Summa was acknowledged for the SOA integration work performed at various clients utilizing WebSphere Message Broker and WebSphere Enterprise Service Bus solutions.   </p>
<p>•	Smarter Decision Management Award &#8211; This award recognizes the decision management rules work that Summa has performed using rules technologies to solve complex business problems. </p>
<p>•	Impact Best of Show &#8211; Summa demonstrated the BodyMedia FIT coach solution running on IBM WebSphere Optimization Decision Management rules software.  </p>
<p>It was an exciting and exhausting week full of educational sessions, meetings and networking.  Summa participated in four technology and business breakout sessions: we co-presented with two of our customers discussing decision management solutions, we took part in a panel discussing BPM technologies in Healthcare, and we led a session on how WebSphere Message Broker is being used to connect Microsoft .NET SaaS applications.  It was a great week!</p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/05/17/summa-is-award-finalist-at-ibms-impact-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Working with JqGrid and ASP.NET MVC &#8211; Setting up a base jqgrid parameters class</title>
		<link>http://www.summa-tech.com/blog/2012/05/09/working-with-jqgrid-and-asp-net-mvc-setting-up-a-base-jqgrid-parameters-class/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=working-with-jqgrid-and-asp-net-mvc-setting-up-a-base-jqgrid-parameters-class</link>
		<comments>http://www.summa-tech.com/blog/2012/05/09/working-with-jqgrid-and-asp-net-mvc-setting-up-a-base-jqgrid-parameters-class/#comments</comments>
		<pubDate>Wed, 09 May 2012 18:29:35 +0000</pubDate>
		<dc:creator>Doug DiFilippo</dc:creator>
				<category><![CDATA[Agile and Development]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4778</guid>
		<description><![CDATA[Our team has been using <a title="Trirand Blog" href="http://www.trirand.com/blog/" target="_blank">JqGrid</a> on a few projects now and I am really impressed with the ease of use and functionality it provides. Out of the box it gives us immediate benefits in the form of paging, sorting, and basic transformation of tables. ASP.NET MVC makes it easy to send and receive data from the grid without writing much code at all. In this post we will look at a basic class to handle the parameters passed from JqGrid in regards to current page, records per page, sort column, and sort order.]]></description>
			<content:encoded><![CDATA[<p>Our team has been using <a title="Trirand Blog" href="http://www.trirand.com/blog/" target="_blank">JqGrid</a> on a few projects now and I am really impressed with the ease of use and functionality it provides. Out of the box it gives us immediate benefits in the form of paging, sorting, and basic transformation of tables. ASP.NET MVC makes it easy to send and receive data from the grid without writing much code at all. In this post we will look at a basic class to handle the parameters passed from JqGrid in regards to current page, records per page, sort column, and sort order.</p>
<p>If you have worked with JqGrid before you will no doubt be familiar with the default parameters passed to any ajax request: &#8220;page&#8221;, &#8220;rows&#8221;, &#8220;sidx&#8221;, &#8220;sord&#8221;. As mentioned above, these parameters correspond to current page, records per page, sort column, and sort order respectively. The grid passes these parameters with every user interaction so that the server can respond with updated data. For example, if a user clicks a sortable column or changes the number of rows per page then the grid will make an ajax request sending in the updated parameter values.</p>
<p>With MVC model binding it is relatively easy to receive these values as four string parameters on our action method. The <a title="Default Model Binder Documentation" href="http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultmodelbinder.aspx" target="_blank">DefaultModelBinder</a> will locate them and match them by name to the parameter names in our method. So we could end up with an action method signature similar to this:</p>
<p><code>public ActionResult GetJqGridData(string page, string rows, string sidx, string sord)</code></p>
<p>This is a good starting point and does highlight how well the DefaultModelBinder abstracts away request variables. We do not need to specify if these parameters are contained within the url structure, the query string, or the posted form. However, with a little configuration we can make this signature look much cleaner.</p>
<p>Let’s start by creating a class to model the data we receive from the grid. We’ll call the class JqGridArgs and provide public properties for each of the four data parameters. Here is what this class could look like:</p>
<p><code>public class JqGridArgs<br />
{<br />
public string Page { get; set; }<br />
public string PageSize { get; set; }<br />
public string SortColumn { get; set; }<br />
public GridSortOrder SortOrder { get; set; }<br />
}<br />
</code></p>
<p>There are a few things to notice in the above class example. Our property names do not exactly match the default JqGrid names. Our first three properties are declared as strings, but the SortOrder property is declared as a custom Enum. This is not a requirement, but simply provides some additional type safety. The enum, which is not shown, only declares two members with names of Asc and Desc representing ascending and descending respectively.</p>
<p>Our goal at this point is to replace our cluttered method signature above with a cleaner version that accepts our new JqGridArgs class as a single parameter. Luckily we are not very far off from making this happen.</p>
<p>As it stands now, our main problem is that we have a mismatch between the arguments the grid sends (page, rows, sidx, sord) and the property names in our new class (Page, PageSize, SortColumn, SortOrder). The DefaultModelBinder will be able to map Page correctly, but the other three will fail. One option would be to create our own custom model binder to handle this scenario. MVC provides the extensibility to do this, but luckily JqGrid makes it even easier.</p>
<p>The setup call to JqGrid provides <a title="JqGrid Options" href="http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options" target="_blank">numerous options</a>, one of which allows you to specify the parameter names for the ajax requests. In our example, we simply need to tell the grid to use our parameter names instead of the default names. This allows us to rely on the DefaultModelBinder in MVC to handle all of the mappings for us. Here is a snippet of what this setup looks like:</p>
<p><code>$('#myGrid').jqGrid({prmNames:{rows:'pageSize', sort:'sortColumn', order:'sortOrder'}})</code></p>
<p>Now we can update our original method signature to contain one nicely defined object instead of four disjointed strings:</p>
<p><code>public ActionResult GetJqGridData(JqGridArgs gridArgs)</code></p>
<p>This implementation definitely isn&#8217;t ground breaking, but it does provide a nice foundation. The class we created can serve as a base class for all of our grids. If necessary we can even inherit this class and append additional properties to match custom data being sent from the grid &#8212; in the postData array for example. Check out the <a title="JqGrid Documentation" href="http://www.trirand.com/jqgridwiki/doku.php?id=wiki:jqgriddocs" target="_blank">documentation for JqGrid</a> and please feel free to let us know your tips for this great plugin!</p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/05/09/working-with-jqgrid-and-asp-net-mvc-setting-up-a-base-jqgrid-parameters-class/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rebase a Slave Mercurial Repo to a Subversion Master</title>
		<link>http://www.summa-tech.com/blog/2012/05/04/rebase-a-slave-mercurial-repo-to-a-subversion-master/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rebase-a-slave-mercurial-repo-to-a-subversion-master</link>
		<comments>http://www.summa-tech.com/blog/2012/05/04/rebase-a-slave-mercurial-repo-to-a-subversion-master/#comments</comments>
		<pubDate>Fri, 04 May 2012 14:08:57 +0000</pubDate>
		<dc:creator>Alex Wang</dc:creator>
				<category><![CDATA[Agile and Development]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[SCM]]></category>
		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4776</guid>
		<description><![CDATA[Recently I worked on a client project where the client ran an older version of <a http://subversion.tigris.org/">Subversion</a>, which was missing some useful SVN features.  A team of us was brought in to work on a major project that was to last several months and make fundamental changes to the client's flagship web application.  Due to the length of the project and the far-reaching changes, we were asked to keep our changes on an SVN branch and to rebase periodically to changes committed to the SVN trunk.

To boost productivity, our team decided to use <a href="http://mercurial.selenic.com/">Mercurial</a> to manage our development.  Among all the benefits that Mercurial could offer, two stood out to us if we ran our own Mercurial repo:
<ol>
	<li>The distributive nature of Hg allows us to make local commits (and revert them back if needed) when offline or offsite; and</li>
	<li>The flexibility of managing our own feature branches and CI integration without affecting the client or requiring client admin support.</li>
</ol>
You may find different reasons for running a slave repository, but we found such need quite common among our project teams.

A critical challenge of running a slave Hg repo outside the SVN master is how changes can flow back and forth smoothly and correctly.  It goes without saying that our bottom line was to not introduce errors into the client's SVN code base, be it missed revisions, merge errors, or improperly recorded merge history.  After some trial and error, we arrived at a rebase strategy that we could confidently execute repeatedly without introducing procedural errors.]]></description>
			<content:encoded><![CDATA[<p>Recently I worked on a client project where the client ran an older version of <a http://subversion.tigris.org/">Subversion</a>, which was missing some useful SVN features.  A team of us was brought in to work on a major project that was to last several months and make fundamental changes to the client&#8217;s flagship web application.  Due to the length of the project and the far-reaching changes, we were asked to keep our changes on an SVN branch and to rebase periodically to changes committed to the SVN trunk.</p>
<p>To boost productivity, our team decided to use <a href="http://mercurial.selenic.com/">Mercurial</a> to manage our development.  Among all the benefits that Mercurial could offer, two stood out to us if we ran our own Mercurial repo:</p>
<ol>
<li>The distributive nature of Hg allows us to make local commits (and revert them back if needed) when offline or offsite; and</li>
<li>The flexibility of managing our own feature branches and CI integration without affecting the client or requiring client admin support.</li>
</ol>
<p>You may find different reasons for running a slave repository, but we found such need quite common among our project teams.</p>
<p>A critical challenge of running a slave Hg repo outside the SVN master is how changes can flow back and forth smoothly and correctly.  It goes without saying that our bottom line was to not introduce errors into the client&#8217;s SVN code base, be it missed revisions, merge errors, or improperly recorded merge history.  After some trial and error, we arrived at a rebase strategy that we could confidently execute repeatedly without introducing procedural errors.</p>
<p>The beginning of our journey is depicted in Figure 1.  First we created an <strong>S1</strong> branch off the SVN trunk to keep our changes.  A copy of the <strong>S1</strong> branch was then used in creating a Mercurial repository.</p>
<div id="attachment_4794" class="wp-caption aligncenter" style="width: 265px"><img class="size-full wp-image-4794" src="http://www.summa-tech.com/blog/wp-content/uploads/2012/04/rebase01.png" alt="Initial creation of SVN branch and Hg repository" width="255" height="116" /><p class="wp-caption-text">Figure 1. Initial creation of SVN branch and Hg repository</p></div>
<p>After the development had gone on for a while (both in SVN and in Hg), and it was time to rebase the Hg changes, the two repositories would look like Figure 2, where we assume that the Hg repo had been rebased at least once, and the last merge point in SVN was tagged <strong>M1</strong>.  The last merge point in Hg was also tagged.  (This is the general case so that the rebase procedure described below can be applied repeatedly. For the first rebase effort after the creation of the Hg repo, the <strong>M1</strong> tag would just be the root of the <strong>S1</strong> branch in SVN, and the last Hg merge point the initial Hg revision.)  In Figure 2, the head of the <strong>S1</strong> branch contains the merge results of the <strong>M1</strong> tag in SVN and the marked revision in Hg.  In both repositories, additional changes have been committed beyond the last merge points.</p>
<div id="attachment_4795" class="wp-caption aligncenter" style="width: 295px"><img class="size-full wp-image-4795" src="http://www.summa-tech.com/blog/wp-content/uploads/2012/04/rebase11.png" alt="Figure 2. Statuses of two repositories at the beginning of a rebase session" width="285" height="159" /><p class="wp-caption-text">Figure 2. Statuses of two repositories at the beginning of a rebase session</p></div>
<p>Below is the rebase procedure that we developed for rebasing the Hg changes to the head of the SVN trunk:</p>
<ol>
<li>First create a new named branch, <strong>H1</strong>, in Hg to receive the changes from SVN.  This new branch should be created off the last Hg revision where rebasing took place as shown in Figure 3.  Depending on how often rebasing is carried out, the branch point of <strong>H1</strong> could be many revisions back from the head of the default branch, but this is normal and necessary. <em> It is important that we d</em><em>o not create the <strong>H1</strong> branch off the head of the Hg default branch.  Doing so will cause all changes from SVN to be accepted as new changes and overwrite changes in Hg.</em> Update the local Hg working directory to the <strong>H1</strong> branch.
<p><div id="attachment_4796" class="wp-caption aligncenter" style="width: 296px"><img class="size-full wp-image-4796" src="http://www.summa-tech.com/blog/wp-content/uploads/2012/04/rebase2_create_hg_branch1.png" alt="Figure 3. Create a new branch in Hg to receive changes from SVN" width="286" height="166" /><p class="wp-caption-text">Figure 3. Create a new branch in Hg to receive changes from SVN</p></div></li>
<li>Export SVN changes to the Hg working directory.  We will describe how to do this using TortoiseSVN.  If you are a hard-core command-line SVN user, you will have to come up with the equivalent SVN commands.
<ul>
<li>Create a new merge tag <strong>M2</strong> off the head of the SVN trunk as shown in Figure 4.  In the TortoiseSVN repo browser, right-click on the <strong>M2</strong> tag and select “Mark for Comparison” from the pop-up menu.  Next navigate to the last merge tag <strong>M1</strong>; right-click and select “Compare URLs.”  All the files that are different between <strong>M1</strong> and <strong>M2</strong> tags will be listed in a pop-up window<a name="_ftnref2" href="#_ftn2">1</a> titled “Changed Files.”  To extract changes correctly from SVN, <em>it is very important that you select the new merge tag <strong>M2</strong> for comparison first, because when you export the diff in the next step, the files from the first marked branch/tag will be exported.</em>
<p><div id="attachment_4797" class="wp-caption aligncenter" style="width: 295px"><img class="size-full wp-image-4797" src="http://www.summa-tech.com/blog/wp-content/uploads/2012/04/rebase3_export_svn_changes1.png" alt="Figure 4. Create a merge tag M2 in SVN and export changes between M1 and M2 to Hg " width="285" height="175" /><p class="wp-caption-text">Figure 4. Create a new merge tag M2 in SVN and export changes between M1 and M2 to Hg </p></div></li>
<li>Select all files listed in the “Changed Files” window, right-click and select the “Export selection to” menu option.   Choose your local Hg working directory as the export destination.  After the export, you can examine one or two changed file to make sure that the exported files come from the <strong>M2</strong> tag.  In Hg, commit the extracted SVN changes to the <strong>H1</strong> branch.  It would be a good idea to include the two SVN merge tags in the Hg commit log message.  Now we have captured all the changes from the SVN master in one revision on the <strong>H1</strong> branch in Hg.</li>
</ul>
</li>
<li>Merge the SVN changes with the Hg default branch.  As shown in Figure 5, first update the Hg working directory to the head of the default branch, and then merge the head of the <strong>H1</strong> branch, which contains the changes from SVN, with the local copy.  Resolve any merge conflict as we normally would and commit the merged code.  We should test the merged code and correct any merge errors as needed.  At this point, our code in Hg has been rebased to the SVN trunk at tag <strong>M2</strong>.
<p><div id="attachment_4798" class="wp-caption aligncenter" style="width: 291px"><img class="size-full wp-image-4798" src="http://www.summa-tech.com/blog/wp-content/uploads/2012/04/rebase4_merge_svn_change_in_hg1.png" alt="Figure 5. Merge changes from SVN with the Hg default branch" width="281" height="183" /><p class="wp-caption-text">Figure 5. Merge changes from SVN with the Hg default branch</p></div></li>
<li>(Optional) If merge history of the <strong>S1</strong> branch in SVN is important, then we would want to perform a “pseudo-merge” so that SVN recognizes that trunk changes up to tag <strong>M2</strong> has been merged into the <strong>S1</strong> branch.  This &#8220;pseudo-merge&#8221; should be done before we move the merged code from Hg back to SVN.  We call this a pseudo-merge because the “real” merge was actually conducted and tested in Hg.  Without going into detail, merge the changes between the <strong>M1</strong> and <strong>M2</strong> tags onto a working copy of the <strong>S1</strong> branch.  Conflict resolution in this case is not important (real merged code will come from Hg), for example, we could opt to take all local changes.  We could either commit immediately after the pseudo-merge, or wait until the Hg changes are overlaid in the next step.
<p><div id="attachment_4799" class="wp-caption aligncenter" style="width: 289px"><img class="size-full wp-image-4799" src="http://www.summa-tech.com/blog/wp-content/uploads/2012/04/rebase5_record_merge_in_svn1.png" alt="Figure 6. Conduct a &quot;pseudo-merge&quot; so that SVN recognizes the merge up to tag M2" width="279" height="182" /><p class="wp-caption-text">Figure 6. Conduct a &quot;pseudo-merge&quot; so that SVN recognizes the merge up to tag M2</p></div></li>
<li>Export the merged code from Hg back to the SVN branch.  First tag the merged and tested revision in Hg so that we know where we left off for the next rebase.  Next export an archive of the new Hg merge tag over a working copy of the <strong>S1</strong> SVN branch.  This takes care of overlaying all the new and modified files over the SVN working copy.  However, for any file that was deleted in Hg, we will need to manually delete it from the SVN working copy.  This should not be difficult to do if we have a diff tool (which we did) that lets us easily compare two folder structures and see orphans on either side (Beyond Compare is such a tool).  One more thing to be careful about here is that Hg archive generates some Hg-specific files (such as “.hgtags”).  Make sure that these files are deleted from the SVN working copy and not get committed to SVN.  Now we can commit the Hg changes to the <strong>S1</strong> branch in SVN.
<p><div id="attachment_4800" class="wp-caption aligncenter" style="width: 289px"><img class="size-full wp-image-4800" src="http://www.summa-tech.com/blog/wp-content/uploads/2012/04/rebase6_commit_tested_code_to_svn1.png" alt="Figure 7. Export merged code from Hg back to S1 branch in SVN" width="279" height="197" /><p class="wp-caption-text">Figure 7. Export merged code from Hg back to S1 branch in SVN</p></div></li>
</ol>
<p>We are done! (For a while, anyways.)  Our changes in Hg are rebased to SVN changes, and the merged code is exported from Hg back to our SVN branch.  Merge tags are created in both repositories and ready to be used for the next rebase effort.  And last but not least, SVN properly recognizes that our <strong>S1</strong> branch has merged in the changes between the <strong>M1</strong> and <strong>M2</strong> tags.  This information will be useful when it comes time to merge the <strong>S1</strong> branch back into the SVN trunk.</p>
<div><!--[if !supportFootnotes]--></p>
<hr size="1" /><!--[endif]--></p>
<div>
<p><a name="_ftn2">1</a> In Step 2, if for any reason, you’d like the comparison to be made against specific revisions rather than the heads of the two selected branches, you can do so:  In the “Changed Files” window, click on the “HEAD” button for either chosen branch and enter the particular revision against which the comparison should be made.</div>
</div>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/05/04/rebase-a-slave-mercurial-repo-to-a-subversion-master/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Social Enterprise Part 2 – How To Set Up Chatter In Less Than 30 Minutes</title>
		<link>http://www.summa-tech.com/blog/2012/04/25/the-social-enterprise-part-2-how-to-set-up-chatter-in-less-than-30-minutes/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-social-enterprise-part-2-how-to-set-up-chatter-in-less-than-30-minutes</link>
		<comments>http://www.summa-tech.com/blog/2012/04/25/the-social-enterprise-part-2-how-to-set-up-chatter-in-less-than-30-minutes/#comments</comments>
		<pubDate>Wed, 25 Apr 2012 16:58:18 +0000</pubDate>
		<dc:creator>Paul Harrington</dc:creator>
				<category><![CDATA[Cloud Applications]]></category>
		<category><![CDATA[chatter]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4719</guid>
		<description><![CDATA[In the <a href="http://www.summa-tech.com/blog/2012/03/29/the-social-enterprise-part-1-%E2%80%93-improving-collaboration-with-salesforcecoms-chatter/">last post</a> we opened this series with an overview of the importance of collaboration and some of the features found within Salesforce.com’s social media tool, <a title="Chatter" href="http://www.salesforce.com/chatter/overview/" target="_blank">Chatter</a>.  Now we want to take a closer look at some of Chatter's main features and the value they bring to your business.  We'll also show you how you can set up and deploy Chatter in less than 30 minutes.]]></description>
			<content:encoded><![CDATA[<p>In the <a href="http://www.summa-tech.com/blog/2012/03/29/the-social-enterprise-part-1-%E2%80%93-improving-collaboration-with-salesforcecoms-chatter/">last post</a> we opened this series with an overview of the importance of collaboration and some of the features found within Salesforce.com’s social media tool, <a title="Chatter" href="http://www.salesforce.com/chatter/overview/" target="_blank">Chatter</a>.  Now we want to take a closer look at some of Chatter&#8217;s main features and the value they bring to your business.  We&#8217;ll also show you how you can set up and deploy Chatter in less than 30 minutes.</p>
<h3>Chatter&#8217;s Main Features</h3>
<p><strong>Customization</strong> – As we mentioned last week, Chatter gives the user the ability to cut through the clutter and noise surrounding your day to day activity and zero in on what meaningful and relevant to you.  Chatter does this by providing highly customizable selections on what information you want to hear about, and how often.  For example, your sales team is going to be very interested in the Opportunities that are in the pipeline.   By enabling “Feed Tracking” for your Opportunities they will get notified in real time when updates are made to the Opportunities they’re following.  Chatter also allows you to select which fields trigger feed updates.  If you want the team to be notified whenever a Demo is scheduled, simply select that field.  Chatter provides the flexibility to select which objects and fields to receive feeds for across your entire Salesforce instance: Leads, Accounts, Contacts, Opportunities – even Cases and Campaigns.</p>
<p><strong>Follows</strong> – Like other social media tools, Chatter allows the user to select who and what to follow in order to get updates.  First, you can follow your colleagues and receive feeds whenever they post updates to Chatter.  It’s a great way to distribute information from subject matter experts and notices from your Senior Leadership Team.  You can also follow individual records within Salesforce.  By default Salesforce will have you follow any record that you own (this can be turned off, by the way).  But if you want to see updates on a deal that a colleague owns, simply go to the Opportunity and click “Follow”.   If you have insight that can help the deal along, you can post directly onto the feed – everyone following the Opportunity will receive your post.</p>
<p><strong>Groups</strong> – Organizing your Chatter activity around Groups brings collaboration to a new level.  “Groups” is one of the most powerful features of Chatter, and can be created instantly around any subject: Competition, Product Teams, Projects, Market Insight, etc.  Members of a Group automatically receive feeds when other Group members make updates and posts.  Say you have a large deal being worked with GenCom.  As the Team working the deal post information about meetings and details, everyone on the Team can access the information in a centralized, searchable hub.  Presentations, spreadsheets and documents can also be shared.  Updates to any of these files will produce a feed update, alerting the team that a new version exists.  Files can even be shared with your prospects and customers from within Chatter.  If you want to deliver an agenda for an upcoming meeting on the large opportunity, a Chatter wizard creates a private website for the agenda, and sends a URL to the prospect.  Everyone following the deal can see when the client has viewed the agenda.</p>
<p><strong>Feeds</strong> – Chatter not only gives you the flexibility to select which Groups to join, and which people and records to follow, it allows you to select how often to receive your updates via email.  For example, you can receive an update whenever someone mentions you in a post, comments on a post you made, or simply follows you.  Chatter also aggregates these updates into Digests, which you can select to receive daily, weekly – or never.</p>
<h3>How To Set Up Chatter In Less Than 30 Minutes</h3>
<p>Using this information, let&#8217;s take a look at how you can quickly set up and deploy Chatter for your Salesforce users in less than 30 minutes:</p>
<p><strong>Step One &#8211; Feed Tracking</strong> After enabling Chatter for your organization, select which objects and fields you want to trigger updates.  In the screen grab below, we&#8217;ve enabled Feed Tracking for our Opportunities and checked the fields we think are relevant to Opportunity owners.</p>
<p><img src="http://www.summa-tech.com/blog/wp-content/uploads/2012/04/screen-grab-13.jpg" alt="screen-grab-13" width="550" height="299" class="aligncenter size-full wp-image-4893" /></p>
<p>In our example, followers of an Opportunity will receive a feed update any time the &#8220;Stage&#8221; is changed.  Users will see these updates on the record itself &gt;&gt;</p>
<p><img src="http://www.summa-tech.com/blog/wp-content/uploads/2012/04/screen-grab-2.jpg" alt="screen-grab-2" width="703" height="677" class="aligncenter size-full wp-image-4864" /></p>
<p>and on their Chatter Home Page &gt;&gt;</p>
<p><img src="http://www.summa-tech.com/blog/wp-content/uploads/2012/04/screen-grab-3.jpg" alt="screen-grab-3" width="752" height="428" class="aligncenter size-full wp-image-4866" /></p>
<p>Both places will show a running record of all of the updates for the records you&#8217;re following.</p>
<p><strong>Step Two &#8211; Set Chatter Personal Email Settings</strong> Chatter fosters collaboration within your organization and provides lots of opportunities to connect with your colleagues.  You can customize when you receive email updates on this interaction.  For example, you may want to receive an email whenever someone comments on a post you&#8217;ve made on your profile.  In the Personal Email Settings (shown below) you can select what type of interactions trigger these emails, or you can choose not to receive any Chatter emails at all.</p>
<p><img src="http://www.summa-tech.com/blog/wp-content/uploads/2012/04/screen-grab-4.jpg" alt="screen-grab-4" width="721" height="668" class="aligncenter size-full wp-image-4903" /></p>
<p>As previously mentioned, you can also choose when to receive the Chatter Digest, which collects all of the emails you&#8217;re received and aggregates them into one email.</p>
<p><strong>Step Three &#8211; Set Chatter Group Email Settings</strong> Chatter also allows you to select how often to receive posts and updates made by Group Members.  As shown in the screen grab below, I will receive email notifications of every post made by Group members for Groups I&#8217;ve joined our will join.</p>
<p><img class="aligncenter size-full wp-image-4770" src="http://www.summa-tech.com/blog/wp-content/uploads/2012/04/screen-grab-5.jpg" alt="screen-grab-5" width="837" height="261" /></p>
<p>And that&#8217;s it!  In less than 30 minutes you&#8217;ve set you and your organization up for improved collaboration and efficiency.  Chatter will peel away the unnecessary information and bring the conversation to the subject.  You&#8217;re now better connected with your team members and more aware of relevant activity on all of your deals.</p>
<p>To learn more about Chatter and the Social Enterprise, contact Orion Wolff at orionw@summa-tech.com.</p>
<p>Next: Chatter deployment strategies</p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/04/25/the-social-enterprise-part-2-how-to-set-up-chatter-in-less-than-30-minutes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Implement Clear Governance for BRMS</title>
		<link>http://www.summa-tech.com/blog/2012/04/09/implement-clear-governance-for-brms/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=implement-clear-governance-for-brms</link>
		<comments>http://www.summa-tech.com/blog/2012/04/09/implement-clear-governance-for-brms/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 12:20:51 +0000</pubDate>
		<dc:creator>Via Tsuji</dc:creator>
				<category><![CDATA[Process Integration]]></category>
		<category><![CDATA[brms]]></category>
		<category><![CDATA[governance]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4726</guid>
		<description><![CDATA[All technologies go through the life cycle of maturity and adoption. For most technologies, over-enthusiasm or “hype” and subsequent disappointment precedes mainstream adoption and realization of how the technology solves real business problems. Gartner has modeled this evolution in the Hype Cycle and identified distinct key phases (Gartner).

Business Rule Management Systems (BRMS) began the descent towards the “Trough of Disillusionment” in 2011 (Dixon &#38; Jones, 2011), wherein many implementations fail to deliver what businesses expected it could.

The focus of this series is to provide guidelines for truly reaping the benefits of a business rule management system. It clarifies certain implementation steps, debunks unrealistic expectations, and warns of common pitfalls to a BRMS implementation.

The conclusion to this series discusses the often forgotten discipline of governance, surrounding the BRMS. Proceeding without a governance model could, at best, limit BRMS adoption and, at worst, spell failure for the entire system. Defining and implementing clear BRMS governance is important to sustaining the benefits of business rules for the long term. ]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal">Like other software projects, a successful business rule management system (BRMS) implementation does not stop after the system is installed. But because of the shift in roles and responsibilities, it is critical for the organization to have a governance model in place to manage rule changes. Otherwise, stakeholders will be entrenched in miscommunication or playing the “blame game”. At best, rule changes could simply be delayed. However, the confusion could result in deploying rules that are incorrect or incomplete.</p>
<p class="MsoNormal">The basic definition of governance includes: (1) definition of stakeholders and their roles and responsibilities; and the (2) process flow, encompassing rule authoring and change management. Thus, designing the governance model early in the implementation of a BRMS is a critical success factor. Make sure to allocate time and resources to completing this task in the beginning of the implementation. Consider the following guidelines in doing so:</p>
<ul>
<li><strong>Define Goals.</strong> Know the purpose of the governance model. Before designing the model, clearly state the governance charter and goals – what the organization wishes to achieve with the model. This would guide how the governance process is formed and validate its completion.</li>
<li><strong>Reuse and Reach Out. </strong>Ensure that existing processes are not ignored and all the relevant user groups are involved with the governance definition. Some processes may be reused or redefined to suit the governance goals for your BRMS.</li>
<li><strong>Keep it Simple.</strong> Opt for the minimum number of participants and steps to the workflow as allowed by the organizational policies and regulations. With many changes being introduced by the system, making the governance model complex (e.g. to support different scenarios) could overwhelm the stakeholders. The model can change over time and be different for other rule based applications.</li>
<li><strong>Think Agile. </strong>Though it is important to keep the process simple, a single process may not fit all. Consider establishing a more agile process for low-risk, simple rule changes and maintaining existing software development processes for more high-risk, complex changes. Make sure all the stakeholders agree with the less involved version of the process.</li>
<li><strong>Have Checks and Balances.</strong> With the process being new to the business users and IT, each group may have doubts over themselves and each other. Incorporate testing and, perhaps, simulation into the process, as well as a mechanism to demonstrate that they have been completed. Also make sure that the governance model is able to provide evidence that the model is consistently executed.</li>
<li><strong>Continuous Integration. </strong>Revisit the model every time a new set of rules and business users are introduced to the system. Governance may change from one project to another, depending on available resources, the critical nature of the system, and the urgency in which the changes must be deployed to production.</li>
</ul>
<h4>Conclusion</h4>
<p class="MsoNormal">According to the Gartner Hype Cycle, BRMS technologies would have to traverse the “Trough of Disillusionment” before reaching the “Plateau of Productivity”. But not all organizations need to undergo the disappointments before realizing the benefits of a business rule management system.</p>
<p class="MsoNormal">Reap the benefits of BRMS using the guidelines outlined in this blog series:</p>
<ul>
<li><strong>De-mystify the benefits.</strong> Understand the benefits and limitations of a BRMS. Clarify what the system can offer with what the organization can support.</li>
<li><strong>Identify the need. </strong>Validate the need of the tool in the enterprise before getting caught up in the “hype”. Know the needs of the organization and how a BRMS can fulfill the requirements.</li>
<li><strong>Distinguish from similar technologies. </strong>Explore other decision management technologies and ensure that a BRMS is the right system for the organization.</li>
<li><strong>Determine enterprise readiness.</strong> Management, the LOB and IT must all be ready and prepared for the BRMS implementation. Agree on roles and responsibilities and commit to necessary organization changes.</li>
<li><strong>Implement in coordination.</strong> Balance the implementation between business users and IT. Increase the communication and coordination of the two groups to ensure success.</li>
<li><strong>Proceed with clear governance.</strong> Design the process for change management and monitoring of the BRMS. Share the governance model with the stakeholders and check for compliance.</li>
</ul>
<p class="MsoNormal">Business rule management systems can undeniably benefit enterprises with real business problems associated with highly variable and complex decision logic. However, clouded with unrealistic expectations, confused by its true purpose, or plagued with improper planning and implementation, an enterprise can be disillusioned by its BRMS implementation. Ensure success by avoiding the common pitfalls outlined in the series.</p>
<h4>References</h4>
<p class="MsoNormal">Dixon, J., &amp; Jones, T. (2011, July 25) <em>Hype Cycle for Business Process Management, </em>2011.</p>
<p>Gartner. (n.d.). <em>Gartner Hype Cycle.</em> Retrieved February 21, 2011, from Gartner: http://www.gartner.com/technology/research/methodologies/hype-cycle.jsp</p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/04/09/implement-clear-governance-for-brms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Reaping the Benefits of BRMS]]></series:name>
	</item>
		<item>
		<title>Power Hour &#8211; an alternative to Pomodoro</title>
		<link>http://www.summa-tech.com/blog/2012/04/02/power-hour-an-alternative-to-pomodoro/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=power-hour-an-alternative-to-pomodoro</link>
		<comments>http://www.summa-tech.com/blog/2012/04/02/power-hour-an-alternative-to-pomodoro/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 15:23:30 +0000</pubDate>
		<dc:creator>Ben Northrop</dc:creator>
				<category><![CDATA[Agile and Development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Pomodoro]]></category>
		<category><![CDATA[power hour]]></category>
		<category><![CDATA[time management]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4582</guid>
		<description><![CDATA[I'm not a psychologist, but it seems to me like the science is in, and it doesn't look good for <a href="http://en.wikipedia.org/wiki/Human_multitasking">multitasking</a>.  

The idea that the brain can do two things simultaneously has been <a href="http://www.brainrules.net/attention?scene=">myth busted</a>.  Instead, we've learned that we have a serial processor running in our craniums, and although it may be deft enough to provide the illusion of multitasking, on the inside it's just an <a href="http://en.wikipedia.org/wiki/Human_multitasking#The_brain.27s_role_in_multitasking">executive controller</a> quickly switching back and forth from one task to another.  

But is there anything wrong with an illusion, if the result is the same?    ]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m not a psychologist, but it seems to me like the science is in, and it doesn&#8217;t look good for <a href="http://en.wikipedia.org/wiki/Human_multitasking">multitasking</a>.  </p>
<p>The idea that the brain can do two things simultaneously has been <a href="http://www.brainrules.net/attention?scene=">myth busted</a>.  Instead, we&#8217;ve learned that we have a serial processor running in our craniums, and although it may be deft enough to provide the illusion of multitasking, on the inside it&#8217;s just an <a href="http://en.wikipedia.org/wiki/Human_multitasking#The_brain.27s_role_in_multitasking">executive controller</a> quickly switching back and forth from one task to another.  </p>
<p>But is there anything wrong with an illusion, if the result is the same?    </p>
<p>Well, yes.  The problem is that there&#8217;s a cost to this context switching.  A big one.  For starters, studies have shown that we are actually <a href="http://www.dailymail.co.uk/health/article-1205669/Is-multi-tasking-bad-brain-Experts-reveal-hidden-perils-juggling-jobs.html">less productive</a> overall while multitasking, and make significantly <a href="http://www.nytimes.com/2007/03/25/business/25multi.html?pagewanted=all">more mistakes</a>.  In addition, multitasking also <a href="http://news.stanford.edu/news/2009/august24/multitask-research-study-082409.html">inhibits learning</a>, <a href="http://news.bbc.co.uk/2/hi/uk_news/4471607.stm">lowers IQ</a>, and <a href="http://seattletimes.nwsource.com/pacificnw/2004/1128/cover.html">increases stress</a>.  And as though that wasn&#8217;t enough, it turns out the more we multitask, the <a href="http://www.pnas.org/content/early/2009/08/21/0903620106.abstract">worse we are</a> at it.  Whew.</p>
<p>Despite all we know about the problems and perils of multi-tasking, however, the possibility of unitasking in the modern software development organization looks bleaker than ever.  Cramped or open office environments increase the possibility for disruptions from our physical surroundings, and the ubiquity of social networking technology (e.g. email, text, instant message, Facebook, etc.) invite interruptions from beyond.  </p>
<p>What&#8217;s more, within the world of software development, there&#8217;s a strong trend toward <a href="http://en.wikipedia.org/wiki/Agile_software_development">agile techniques</a>, which value above almost all else <a href="http://www.agilemodeling.com/essays/communication.htm">communication</a> and <a href="http://www.infoq.com/news/2011/03/agile-feedback-loops">continuous feedback</a>.  More interruptions!</p>
<p>Now it might seem at this point like I&#8217;m a luddite, a social recluse, or (gasp!) a <a href="http://en.wikipedia.org/wiki/Waterfall_model">waterfall</a> advocate, but in fact it&#8217;s just the opposite.  I&#8217;ve seen first hand the benefits of both Agile processes and new tools for communication, it&#8217;s just that I think (in some environments more than others) we might take it too far.  Responsiveness is important, but as the science of multitasking shows, there&#8217;s such a thing as over-communication.  For the sake of our productivity, our sanity, and the quality of what we&#8217;re building, at some point we need to tune out the world, sink into a state of concentration, and get some freaking work done.  But how?  </p>
<h3>Pomodoro</h3>
<p>The time management practice of <a href="http://en.wikipedia.org/wiki/Pomodoro_Technique">Pomodoro</a> seems to be getting <a href="http://www.summa-tech.com/blog/2011/10/04/micro-time-management-to-dos-and-to-donts/">more attention</a> lately, especially within the <a href="http://www.infoq.com/news/2009/09/Pomodoro">Agile community</a>.  The idea is simple: set a clock for 25 minutes and allow yourself to work on one task, uninterrupted.  At the end of the Pomodoro, you get a quick break, and then you start again.  If something pops up during the Pomodoro (an email from a colleague, a phone call from the product owner, etc.) you&#8217;re advised to record it and get back to it when the 25 minutes are up.  Sounds great, right?</p>
<p>In my experience, it&#8217;s not so easy.  If a business owner pays you a visit from 2 floors up about a bug in the application, he may not be happy when you ask him to wait 17 minutes until you&#8217;re done with your &#8220;Pomodoro&#8221;.  Basically, the world doesn&#8217;t hinge on your stop watch.  </p>
<p>Even if it did, without knowing when you start or stop the clock, it&#8217;s impossible for a colleague to know when it&#8217;s appropriate to interrupt and when it&#8217;s not.  Depending on the size/activity of a team, a half dozen interruptions (of different forms) are easily possible within a 25 minute span.  Just acknowledging these is enough to lose concentration.</p>
<p>Lastly, if each developer is on his own Pomodoro cycle, you could easily (albeit absurdly!) reach a deadlock.  Joe pings Bill during Bill&#8217;s Pomodoro, and so Bill defers till after, but when he does, Joe&#8217;s in the middle of his Pomodoro and defers as well, and so on.  Eventually someone&#8217;s Pomodoro has got to budge.</p>
<h3>Introducing Power Hour</h3>
<p>What&#8217;s needed is a shared Pomodoro, whereby the team understands when the clock starts and stops, and collectively agrees not to interrupt each other during that time.  This is exactly what my we&#8217;ve created on my current project, and we call it &#8220;Power Hour&#8221; (not to be confused with any bevarage-oriented games you may or may not have played in college).</p>
<p>So far it&#8217;s been simple and effective.  Each day we have two Power Hours, one at 10am and one at 2pm.  During those two hours we all go &#8220;heads-down&#8221;, and get work done.  If one of us has a question for another during that time, we wait till after Power Hour to ask it.  There are obvious exceptions (bugs in production, calls from directors, free food in the cafeteria, etc.), but for the most part the sanctity of the hour is respected (even, now, by others outside of the team).  </p>
<p>It may seem that this technique might thwart communication, but in practice it just consolidates it, often to the 15 minutes before and after a Power Hour.  If I need an answer to a question before I start my work, I know I&#8217;ll need to ask my colleague before Power Hour begins, and vice-versa.  This is healthy trade &#8211; rather than a work-day full of randomly distributed interruptions, discussions organically converge into concise bursts.  </p>
<p>Who knows if we&#8217;ll have the discipline to keep up our Power Hours, but for now they&#8217;ve been a big help in countering the pressures for multitasking.  I&#8217;d be interested to hear your strategies for getting quality work done, efficiently.  Please share!</p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/04/02/power-hour-an-alternative-to-pomodoro/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Local Agile Leaders Share Their Experiences at the Summa Agile Cafe</title>
		<link>http://www.summa-tech.com/blog/2012/03/30/local-agile-leaders-share-their-experiences-at-the-summa-agile-cafe/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=local-agile-leaders-share-their-experiences-at-the-summa-agile-cafe</link>
		<comments>http://www.summa-tech.com/blog/2012/03/30/local-agile-leaders-share-their-experiences-at-the-summa-agile-cafe/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 17:09:42 +0000</pubDate>
		<dc:creator>Chris Ruch</dc:creator>
				<category><![CDATA[Agile and Development]]></category>
		<category><![CDATA[Summa]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Coaching]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4680</guid>
		<description><![CDATA[Summa, along with our partner Rally Software, hosted an Agile Cafe on March 27th to bring several local Agile leaders together to share their experiences implementing Agile and Scrum within their organizations. Summa’s CEO, Audrey Dunning, welcomed the more than 70 attendees who joined us for this half-day interactive event that included in-depth discussions about what Agile is and  how three local companies are using Agile to increase productivity, time-to-market, lower risk and increase visibility.]]></description>
			<content:encoded><![CDATA[<p>Summa, along with our partner Rally Software, hosted an Agile Cafe on March 27th to bring several local Agile leaders together to share their experiences implementing Agile and Scrum within their organizations. Summa’s CEO, Audrey Dunning, welcomed the more than 70 attendees who joined us for this half-day interactive event that included in-depth discussions about what Agile is and  how three local companies are using Agile to increase productivity, time-to-market, lower risk and increase visibility.</p>
<p>The speakers included leaders from three of our customers, each talking about their personal experiences introducing Agile into their organizations, the benefits that they have realized, and the challenges that they overcame.</p>
<p>Tom Vrana, Assistant Director of Enrollment System, discussed how Carnegie Mellon University is using Agile to reduce risk and engage business users to revamp their proprietary enterprise student information system.</p>
<p>Gerry Perham, CTO of SmartOps, shared how his organization rapidly adopted Agile, leading to a significant upgrade in technical competitiveness in only 6 months.</p>
<p>Michael Meissner, VP of Software and R&amp;D at Omnyx, stressed the importance of culture and getting the organization comfortable with being uncomfortable in order to reap the benefits of &#8216;unconstrained Agile.&#8217;</p>
<p>The keynote address was given by Andre Dhondt with Rally Software. Andre’s talk focused on the importance of establishing a culture of team work and cooperation to the successful implementation of Agile.</p>
<p>An interactive question and answer session with all four of the speakers followed the individual presentations. This provided an opportunity for the attendees to relate the benefits and challenges that they have in their organizations, and to ask for advice on addressing them from the panelists. Questions included topics such as how to make Agile work in a distributed environment, how to scale Agile across large organizations, and how it can help users prioritize feature requests.</p>
<p>It was great to see so many enthusiastic attendees coming out to learn how Agile best practices can help improve their organizations.</p>
<p>Special thanks to Tom Vrana, Gerry Perham, and Michael Meissner in making this event possible and sharing their stories.</p>
<p>Agile can provide many benefits, but it is not always easy to get started.  One of the themes that each of our customer speakers touched on was the importance of having the right partner to help make the transition to Agile successful and the right tools to help facilitate communication within their teams. Are you starting your Agile journey and looking for advice or support? Have you already started to use Agile and are looking to take you teams to the next level? Summa can provide experienced Agile coaches, as well as skilled architects and technical consultants with experience working with Agile teams.  Contact us to find out more.</p>
<div id="attachment_4683" class="wp-caption alignnone" style="width: 310px"><img class="size-medium wp-image-4683" src="http://www.summa-tech.com/blog/wp-content/uploads/2012/03/agile-cafe-panel-300x224.jpg" alt="Q&amp;A Panel with (from left to right) Andre Dhondt, Tom Vrana, Gerry Perham, and Michael Meissner" width="300" height="224" /><p class="wp-caption-text">Q&amp;A Panel with (from left to right) Andre Dhondt, Tom Vrana, Gerry Perham, and Michael Meissner</p></div>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/03/30/local-agile-leaders-share-their-experiences-at-the-summa-agile-cafe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Social Enterprise Part 1 – Improving Collaboration with Salesforce.com&#8217;s Chatter</title>
		<link>http://www.summa-tech.com/blog/2012/03/29/the-social-enterprise-part-1-%e2%80%93-improving-collaboration-with-salesforcecoms-chatter/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-social-enterprise-part-1-%25e2%2580%2593-improving-collaboration-with-salesforcecoms-chatter</link>
		<comments>http://www.summa-tech.com/blog/2012/03/29/the-social-enterprise-part-1-%e2%80%93-improving-collaboration-with-salesforcecoms-chatter/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 19:47:26 +0000</pubDate>
		<dc:creator>Paul Harrington</dc:creator>
				<category><![CDATA[Cloud Applications]]></category>
		<category><![CDATA[chatter]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[Salesforce.com]]></category>
		<category><![CDATA[Social]]></category>
		<category><![CDATA[Social Enterprise]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4597</guid>
		<description><![CDATA[It’s actually been quite a few years now that the term “social” has taken on a new significance in our lexicon.   It still means what it’s always meant, of course: “<em>pertaining to…relations…community…companionship</em>”.  And the underpinning of the social communal relationship has always been sharing – sharing feelings, ideas and thoughts.

The growth of social media outlets has fostered this sharing like never before.  The most widely-recognized social platforms (Facebook, Twitter, YouTube, LinkedIn) have enabled personal, individual connections and sharing by bringing strangers together and reconnecting lost relationships.  Seeing an opportunity to leverage these social networks, businesses also can now reach discreet segments of their customers, receive immediate feedback and target promotions like never before.]]></description>
			<content:encoded><![CDATA[<p><em>This is the first in a series of Summa blog posts delivering an overview of Salesforce.com&#8217;s foray into the Social Enterprise.  In future posts we will go in-depth on Chatter features, provide deployment strategies that drive higher user adoption, and explore the Social Enterprise in a broader sense.</em></p>
<p>It’s actually been quite a few years now that the term “social” has taken on a new significance in our lexicon.   It still means what it’s always meant, of course: “<em>pertaining to…relations…community…companionship</em>”.  And the underpinning of the social communal relationship has always been sharing – sharing feelings, ideas and thoughts.</p>
<p>The growth of social media outlets has fostered this sharing like never before.  The most widely-recognized social platforms (Facebook, Twitter, YouTube, LinkedIn) have enabled personal, individual connections and sharing by bringing strangers together and reconnecting lost relationships.  Seeing an opportunity to leverage these social networks, businesses also can now reach discreet segments of their customers, receive immediate feedback and target promotions like never before.</p>
<p>But what about within the organization?  Should companies be considering ways to use social platforms to increase collaboration, efficiencies – and revenues?</p>
<p>There is, in fact, a role for social collaboration throughout the enterprise.  And there is a solution – Salesforce.com’s Chatter.</p>
<h3>Collaboration&#8217;s obstacles</h3>
<p>As efficient as we’ve become, collaboration in the workplace is generally much harder today:</p>
<ul>
<li>Organizations are larger, with unique structures and roles</li>
<li>Organizations are more disperse, with multi-site locations</li>
<li>The virtual workspace has moved employees away from each other</li>
<li>Business is faster-paced</li>
<li>We are all exposed to content overload, and sifting through it all takes time</li>
<li>…and then there’s NOISE…the irrelevant, insignificant and unneeded information</li>
</ul>
<h3>What is Chatter?</h3>
<p>Chatter is Salesforce’s cloud-based enterprise social network.  Chatter fosters collaboration within your organization by:</p>
<ul>
<li>Enabling relevance – your staff chooses the information that’s important to them, bringing the conversation to the subject</li>
<li>No more seeking for important information &#8211; Chatter pushes relevant updates directly to users </li>
<li>Delivering efficiency – through automated feeds, your employees have quick and seamless access to relevant content</li>
<li>Shrinking the organization – bringing remote locations together</li>
<li>Cutting through the noise</li>
</ul>
<h3>Chatter’s value</h3>
<p>In a <a href="http://nucleusresearch.com/research/notes-and-reports/the-return-on-investment-from-chatter/">study</a> done by Nucleus Research in July 2011, Chatter has proven to directly contribute to an organization’s productivity and efficiency:</p>
<ul>
<li>Companies adopting Chatter to support business collaboration drove greater productivity – but also made employees more aware and aligned with company goals</li>
<li>Chatter users experienced a 12.5% increase in productivity (on average)</li>
<li>Productivity savings were often seen to have a direct impact on the improved performance of the sales team</li>
<li>With increased manager visibility through automated feeds, managers are more quickly aware of events, setbacks or actions needed</li>
<li>Improved responsiveness was seen with topic/customer-specific questions, delivering solutions that are more on target with reduced cycle-time</li>
</ul>
<h3>Features of Chatter</h3>
<p>Taking some of the best features of the most popular social platforms, Chatter brings your workforce together, and improves the visibility and dialog throughout the enterprise.  Some of Chatter’s key features include:</p>
<li><strong>Groups</strong> – Groups help your teams organize around business processes, topics and customers.  By collaborating within specific categories they share relevant information and work more productively.  They can even set up private groups to work on sensitive projects.</li>
<li><strong>Feeds</strong> – with Feeds your team can monitor the projects, people and groups that matter most in one spot.  The automated content push sends updates on sales pursuits, customer projects, and marketing campaigns.</li>
<li><strong>File Sharing</strong> – Chatter’s file sharing improves access to important files across your team – right from your browser.  You can even receive notifications whenever a document has been updated.</li>
<li><strong>Messenger</strong> – a new feature, Chatter Messenger enables private and group instant messaging to enhance productivity.</li>
</ul>
<p>
<object style="width:425px; height:344px;">
<param name="movie" value="http://www.youtube.com/v/jJgZpMkAKqE?version=3" />
<param name="allowScriptAccess" value="always" />
<param name="wmode" value="window" />
<embed src="http://www.youtube.com/v/jJgZpMkAKqE?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" wmode="window" width="425" height="344"></object>
</p>
<p>To learn more about Chatter and the Social Enterprise, contact Orion Wolff at orionw@summa-tech.com.</p>
<p>Next week: a deeper dive on some of Chatter&#8217;s most impactful features.  </p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/03/29/the-social-enterprise-part-1-%e2%80%93-improving-collaboration-with-salesforcecoms-chatter/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Detecting CSRF attacks in your Apache logs</title>
		<link>http://www.summa-tech.com/blog/2012/03/28/detecting-csrf-attacks-in-your-apache-logs/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=detecting-csrf-attacks-in-your-apache-logs</link>
		<comments>http://www.summa-tech.com/blog/2012/03/28/detecting-csrf-attacks-in-your-apache-logs/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 14:42:44 +0000</pubDate>
		<dc:creator>James Cox</dc:creator>
				<category><![CDATA[Agile and Development]]></category>
		<category><![CDATA[CSRF]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4553</guid>
		<description><![CDATA[After doing some analysis of User Agent strings within Apache logs, I stumbled over an unusual one; Tencent Traveller.  A quick google search showed me that Tencent Travleller was the <a href="http://en.wikipedia.org/wiki/Tencent_Holdings">third most popular browser in China.</a> Interesting, but now I was curious as to why someone in China was trying to access a secure web site that should only be accessible to US based users.]]></description>
			<content:encoded><![CDATA[<p>After doing some analysis of User Agent strings within Apache logs, I stumbled over an unusual one; Tencent Traveller.  A quick google search showed me that Tencent Travleller was the <a href="http://en.wikipedia.org/wiki/Tencent_Holdings">third most popular browser in China.</a> Interesting, but now I was curious as to why someone in China was trying to access a secure web site that should only be accessible to US based users.</p>
<p>I grepped the logs, and the first result looked something like this:</p>
<p><code>123.123.123.123 - - [27/Feb/2012:01:40:24 -0500] "GET /reporting/some_report?param1=somevalue&amp;param2=something HTTP/1.1" 302 - "https://mail.google.com/mail/?ui=2&amp;view=bsp&amp;ver=ohhl4rw8mbn4" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; TencentTraveler ; .NET CLR 2.0.50727; .NET CLR 1.1.4322; msn OptimizedIE8;ZHCN)"</code></p>
<p>The request was for a sensitive report.  You can see in the same line that this request resulted in a redirect (302).  Subsequent log entries showed that the redirect was for the login page.  This is expected behavior for a user that is not currently logged in and attempts to deep link into the application.</p>
<p>The unusual thing about this request was the referrer; gmail.  The other accesses with the same User Agent showed a similar pattern.  All had tried to access the same report and were then re-directed to the login page.  All of the original referrers were an obvious web mail client.</p>
<p>It was clear that this was a <a href="http://en.wikipedia.org/wiki/Csrf">CSRF attack</a>.  The user had opened up a malicious email using their web mail client.  The attacker who had sent the email then issues a request for the sensitive report, hoping that the user is currently logged into the application.  How the attacker harvests this information is unclear.</p>
<p>I wanted to see how many CSRF requests were in the logs.  I could have just grepped for the report string that I saw in the Tencent Traveller entry but<br />
that would have also shown me all of the legitimate accesses.  I also wanted to see if different reports/pages were trying to be accessed as well.</p>
<p>Time for a a perl script:</p>
<div><font color="#0000ff">my</font>&nbsp;<font color="#8B008B">$log_pattern</font>&nbsp;= <font color="#ff6060">qr/</font><font color="#ff6060">^</font><font color="#ff40ff">(?</font><font color="#ff6060">&lt;ip&gt;</font><font color="#ff40ff">\d</font><font color="#ff40ff">{1,3}</font><font color="#ff40ff">\.\d</font><font color="#ff40ff">{1,3}</font><font color="#ff40ff">\.\d</font><font color="#ff40ff">{1,3}</font><font color="#ff40ff">\.\d</font><font color="#ff40ff">{1,3}).*?</font><font color="#ff40ff">\]\s</font><font color="#ff40ff">+</font><font color="#ff40ff">\&quot;\w</font><font color="#ff40ff">+</font><font color="#ff40ff">\s</font><font color="#ff40ff">+(?</font><font color="#ff6060">&lt;request_uri&gt;</font><font color="#ff40ff">.*?)</font><font color="#ff40ff">\s</font><font color="#ff40ff">+</font><font color="#ff6060">HTTP</font><font color="#ff40ff">.*?</font><font color="#ff40ff">\&quot;</font><font color="#ff6060">[</font><font color="#ff40ff">\s\d\-</font><font color="#ff6060">]</font><font color="#ff40ff">+?</font><font color="#ff40ff">\&quot;</font><font color="#ff40ff">(?</font><font color="#ff6060">&lt;referrer&gt;</font><font color="#ff40ff">.*?)</font><font color="#ff40ff">\&quot;</font><font color="#ff6060">/</font>;<br />
<font color="#0000ff">my</font>&nbsp;<font color="#8B008B">$login_page</font>&nbsp;= <font color="#ff6060">qr/</font><font color="#ff40ff">.*</font><font color="#ff6060">login</font><font color="#ff40ff">\.</font><font color="#ff40ff">(?:</font><font color="#ff6060">htm|mobi</font><font color="#ff40ff">)</font><font color="#ff6060">/</font>;<br />
<font color="#0000ff">my</font>&nbsp;<font color="#8B008B">$my_domain</font>&nbsp;= <font color="#ff6060">qr/</font><font color="#ff6060">^https:</font><font color="#ff40ff">\/\/</font><font color="#ff6060">www</font><font color="#ff40ff">\.</font><font color="#ff6060">some</font><font color="#ff40ff">.</font><font color="#ff6060">client</font><font color="#ff40ff">\.</font><font color="#ff6060">com</font><font color="#ff6060">/</font>;</p>
<p><font color="#0000ff">foreach</font>&nbsp;<font color="#0000ff">my</font>&nbsp;<font color="#8B008B">$argnum</font>&nbsp;(<font color="#ff6060">0</font>&nbsp;.. <font color="#8B008B">$#ARGV</font>) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;say <font color="#ff6060">&quot;</font><font color="#ff6060">processing log file: </font><font color="#ff6060">&quot;</font>, <font color="#8B008B">$ARGV</font>[<font color="#8B008B">$argnum</font>];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process_log_file(<font color="#8B008B">$ARGV</font>[<font color="#8B008B">$argnum</font>]);</p>
<p>}</p>
<p><font color="#0000ff">sub</font><font color="#8B008B">&nbsp;</font><font color="#8B008B">process_log_file</font><font color="#8B008B">&nbsp;</font>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">my</font>&nbsp;<font color="#8B008B">$filename</font>&nbsp;= <font color="#0000ff">pop</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">open</font>&nbsp;<font color="#0000ff">my</font>&nbsp;<font color="#8B008B">$fh</font>, <font color="#ff6060">&#8216;</font><font color="#ff6060">&lt;</font><font color="#ff6060">&#8216;</font>, <font color="#8B008B">$filename</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">or</font>&nbsp;<font color="#0000ff">die</font>&nbsp;<font color="#ff6060">&quot;</font><font color="#ff6060">Cannot read &#8216;</font><font color="#8B008B">$filename</font><font color="#ff6060">&#8216;: </font><font color="#8B008B">$!</font><font color="#ff40ff">\n</font><font color="#ff6060">&quot;</font>;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">while</font>&nbsp;() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process_line(<font color="#8B008B">$_</font>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</p>
<p><font color="#0000ff">sub</font><font color="#8B008B">&nbsp;</font><font color="#8B008B">process_line</font><font color="#8B008B">&nbsp;</font>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">my</font>&nbsp;(<font color="#8B008B">$line</font>) = <font color="#8B008B">@_</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font>&nbsp;( <font color="#8B008B">$line</font>&nbsp;=~<font color="#0000ff">&nbsp;/</font><font color="#8B008B">$log_pattern</font><font color="#0000ff">/</font>) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">my</font>&nbsp;<font color="#8B008B">$ip</font>&nbsp;= <font color="#8B008B">$+</font>{ip};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">my</font>&nbsp;<font color="#8B008B">$request_uri</font>&nbsp;= <font color="#8B008B">$+</font>{request_uri};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">my</font>&nbsp;<font color="#8B008B">$referrer</font>&nbsp;= <font color="#8B008B">$+</font>{referrer};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font>&nbsp;(<font color="#8B008B">$referrer</font>&nbsp;<font color="#0000ff">ne</font>&nbsp;<font color="#ff6060">&#8216;</font><font color="#ff6060">-</font><font color="#ff6060">&#8216;</font>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; <font color="#8B008B">$request_uri</font>&nbsp;&nbsp;<font color="#0000ff">ne</font>&nbsp;<font color="#ff6060">&#8216;</font><font color="#ff6060">/</font><font color="#ff6060">&#8216;</font>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; <font color="#8B008B">$referrer</font>&nbsp;!~<font color="#0000ff">&nbsp;/</font><font color="#8B008B">$my_domain</font><font color="#0000ff">/</font>&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; <font color="#8B008B">$request_uri</font>&nbsp;!~<font color="#0000ff">&nbsp;/</font><font color="#8B008B">$login_page</font><font color="#0000ff">/</font>&nbsp;){&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;say <font color="#8B008B">$line</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">else</font>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;say <font color="#ff6060">&quot;</font><font color="#ff6060">Could not parse </font><font color="#8B008B">$line</font><font color="#ff6060">&quot;</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
</font></div>
<p>This perl script will process multiple log files looking for accesses where the referrer is not from the expected domain and the request is not the login page or the root context (/).  The most complicated thing about this script is the regular expression that is used for parsing each line of the access log.   $log_pattern uses the newer perl feature of named captures to capture the fields that I&#8217;m interested in $+{referrer}.</p>
<p>Running the script showed many more accesses for the same sensitive report all with referrers that were obvious mail clients.  My next question was if any of these CSRF attacks were successful.  I confirmed that submitting a request for /reporting/some_report in the test environment resulted in a response with a 200 return code.  All I needed to do was to see if any of the CSRF requests in the logs also had a 200 return code instead of a redirect return code of 302.</p>
<p>I modified the regular expression to also capture the return code:</p>
<div><span style="font-family: monospace;"><br />
<span style="color: #0000ff;">my</span> <span style="color: #8b008b;">$log_pattern</span> = <span style="color: #ff6060;">qr/</span><span style="color: #ff6060;">^</span><span style="color: #ff40ff;">(?</span><span style="color: #ff6060;">&lt;ip&gt;</span><span style="color: #ff40ff;">\d</span><span style="color: #ff40ff;">{1,3}</span><span style="color: #ff40ff;">\.\d</span><span style="color: #ff40ff;">{1,3}</span><span style="color: #ff40ff;">\.\d</span><span style="color: #ff40ff;">{1,3}</span><span style="color: #ff40ff;">\.\d</span><span style="color: #ff40ff;">{1,3}).*?</span><span style="color: #ff40ff;">\]\s</span><span style="color: #ff40ff;">+</span><span style="color: #ff40ff;">\&#8221;\w</span><span style="color: #ff40ff;">+</span><span style="color: #ff40ff;">\s</span><span style="color: #ff40ff;">+(?</span><span style="color: #ff6060;">&lt;request_uri&gt;</span><span style="color: #ff40ff;">.*?)</span><span style="color: #ff40ff;">\s</span><span style="color: #ff40ff;">+</span><span style="color: #ff6060;">HTTP</span><span style="color: #ff40ff;">.*?</span><span style="color: #ff40ff;">\&#8221;\s</span><span style="color: #ff40ff;">(?</span><span style="color: #ff6060;">&lt;return_code&gt;</span><span style="color: #ff40ff;">\d</span><span style="color: #ff40ff;">{3})</span><span style="color: #ff6060;">[</span><span style="color: #ff40ff;">\d\s\-</span><span style="color: #ff6060;">]</span><span>+?</span><span style="color: #ff40ff;">\&#8221;</span><span style="color: #ff40ff;">(?</span><span style="color: #ff6060;">&lt;referrer&gt;</span><span style="color: #ff40ff;">.*?)</span><span style="color: #ff40ff;">\&#8221;</span><span style="color: #ff6060;">/</span>;<br />
</span></div>
<p>and an additional check on the return code:</p>
<div><span style="font-family: monospace;"><br />
<span style="color: #0000ff;">if</span> (<span style="color: #8b008b;">$referrer</span> <span style="color: #0000ff;">ne</span> <span style="color: #ff6060;">&#8216;</span><span style="color: #ff6060;">-</span><span style="color: #ff6060;">&#8216;</span><br />
&amp;&amp; <span style="color: #8b008b;">$request_uri</span> <span style="color: #0000ff;">ne</span> <span style="color: #ff6060;">&#8216;</span><span style="color: #ff6060;">/</span><span style="color: #ff6060;">&#8216;</span><br />
&amp;&amp; <span style="color: #8b008b;">$referrer</span> !~<span style="color: #0000ff;"> /</span><span style="color: #8b008b;">$my_domain</span><span style="color: #0000ff;">/</span><br />
&amp;&amp; <span style="color: #8b008b;">$request_uri</span> !~<span style="color: #0000ff;"> /</span><span style="color: #8b008b;">$login_page</span><span style="color: #0000ff;">/</span><br />
&amp;&amp; <span style="color: #8b008b;">$return_code</span> <span style="color: #0000ff;">eq</span> <span style="color: #ff6060;">&#8216;</span><span style="color: #ff6060;">200</span><span style="color: #ff6060;">&#8216;</span>){<br />
</span></div>
<p>Running the script again revealed no successful attacks.  The attacker was probably mass mailing untargeted SPAM in the hopes that he would be lucky enough to find not only a logged in user but also some one who even used the application.  I would be surprised if this site was the only site that was being targeted by each email.</p>
<p>A quick way to guard against most CSRF attacks is to examine the referrer on accesses to sensitive URLS.  But this is not a magic bullet.  The referrer field can be spoofed in a sophisticated attack.  The correct solution is to generate a unique token per session and have each user request submit that token as either a query string or a post parameter.    </p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/03/28/detecting-csrf-attacks-in-your-apache-logs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BodyMedia and Summa &#8211; Live Virtual Panel on 3/28</title>
		<link>http://www.summa-tech.com/blog/2012/03/26/bodymedia-and-summa-live-virtual-panel-on-328/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=bodymedia-and-summa-live-virtual-panel-on-328</link>
		<comments>http://www.summa-tech.com/blog/2012/03/26/bodymedia-and-summa-live-virtual-panel-on-328/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 18:10:53 +0000</pubDate>
		<dc:creator>Jason Armstrong</dc:creator>
				<category><![CDATA[Process Integration]]></category>
		<category><![CDATA[BPM]]></category>
		<category><![CDATA[brms]]></category>
		<category><![CDATA[customers]]></category>
		<category><![CDATA[IBM]]></category>
		<category><![CDATA[Summa]]></category>
		<category><![CDATA[webinar]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4611</guid>
		<description><![CDATA[I now have something new to obsess about -- making sure I lose some weight in time for IBM’s Impact 2012 Conference at the end of April, and my <a href="http://www.bodymedia.com">BodyMedia FIT</a> and the FITCoach will help me do it.  FITCoach is an enhancement to the existing FIT product that analyzes your performance and provides personalized feedback to better achieve your goals.  It looks like I may need to go hiking today, <em>“You can still reach your calorie burn target today.  Try hiking for 1 hour and 5 minutes, or attend an exercise class.”</em>  

It’s also telling me I could Golf for 1 hour and 15 minutes to still hit my goal.  That sounds like more fun.

Last summer and fall, Summa worked with BodyMedia, Inc. to design and implement the new FITCoach feature.  We did it using <a href="http://www-01.ibm.com/software/decision-management/operational-decision-management/websphere-operational-decision-management/">decision management technology from IBM</a>.]]></description>
			<content:encoded><![CDATA[<p>I now have something new to obsess about &#8212; making sure I lose some weight in time for IBM’s Impact 2012 Conference at the end of April, and my <a href="http://www.bodymedia.com">BodyMedia FIT</a> and the FITCoach will help me do it.  FITCoach is an enhancement to the existing FIT product that analyzes your performance and provides personalized feedback to better achieve your goals.  It looks like I may need to go hiking today, <em>“You can still reach your calorie burn target today.  Try hiking for 1 hour and 5 minutes, or attend an exercise class.”</em>  </p>
<p>It’s also telling me I could Golf for 1 hour and 15 minutes to still hit my goal.  That sounds like more fun.</p>
<p>Last summer and fall, Summa worked with BodyMedia, Inc. to design and implement the new FITCoach feature.  We did it using <a href="http://www-01.ibm.com/software/decision-management/operational-decision-management/websphere-operational-decision-management/">decision management technology from IBM</a>.</p>
<p>This week, Brett Stineman of IBM is hosting a virtual panel with Steve Menke, CIO of BodyMedia, and myself, to talk about the project.  <strong>The panel is at 1PM ET on Wednesday, March 28.  You can register for the virtual panel <a href="http://ibmimpactvpanel-odm.eventbrite.com/">here</a>.</strong></p>
<p>BodyMedia is also going to be featured as a main tent session at <a href="http://www-01.ibm.com/software/websphere/events/impact/">IBM&#8217;s Impact</a> conference in Las Vegas next month.  Christine Robbins, CEO of BodyMedia will be presenting at the main tent.  <a href="http://www.summa-tech.com/blog/summa-bloggers/#ViaTsuji">Via Tsuji</a>, our resident BRMS expert and regular blogger, will also be co-presenting at a technical session with Steve Menke, CIO of BodyMedia.</p>
<p>We&#8217;d love to see you at the Virtual Panel this Wednesday, or at Impact in Las Vegas in April!</p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/03/26/bodymedia-and-summa-live-virtual-panel-on-328/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ready the Enterprise for BRMS</title>
		<link>http://www.summa-tech.com/blog/2012/03/22/ready-the-enterprise-for-brms/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ready-the-enterprise-for-brms</link>
		<comments>http://www.summa-tech.com/blog/2012/03/22/ready-the-enterprise-for-brms/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 15:05:45 +0000</pubDate>
		<dc:creator>Via Tsuji</dc:creator>
				<category><![CDATA[Process Integration]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4435</guid>
		<description><![CDATA[All technologies go through the life cycle of maturity and adoption. For most technologies, over-enthusiasm or “hype” and subsequent disappointment precedes mainstream adoption and realization of how the technology solves real business problems. Gartner has modeled this evolution in the Hype Cycle and identified distinct key phases (Gartner).

Business Rule Management Systems (BRMS) began the descent towards the “Trough of Disillusionment” in 2011 (Dixon &#38; Jones, 2011), wherein many implementations fail to deliver what businesses expected it could.

The focus of this series is to provide guidelines for truly reaping the benefits of a business rule management system. It clarifies certain implementation steps, debunks unrealistic expectations, and warns of common pitfalls to a BRMS implementation.

All systems require an enterprise to be ready for a successful implementation. But having an ill-prepared organization for a BRMS implementation could quickly result in its demise. The third part of the this series focuses on how your organization can avoid this common pitfall. It will help you determine and prepare your group's readiness for BRMS and implement the system with the collaboration and coordination required to be successful (and perhaps produce a happy organization as well). ]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal">Though business rule management systems allow the business users to author rules, independent of IT, it doesn’t mean the two groups would have less interaction. In fact, increased coordination between the line of business (LOB) and IT is required for a successful BRMS implementation.</p>
<p class="MsoNormal">BRMS requires a paradigm shift in most organizations. Before embarking on a BRMS implementation, know that the enterprise is ready and prepare it for the changes that a BRMS would need to be truly successful:</p>
<ul>
<li><strong>Reliance on Stakeholders. </strong>Stakeholders from both IT and the line of business must understand that in order to fully define, build, deploy and maintain rule-based applications, both parties must be fully committed to the task. Resistance from the business users to author rules (i.e. “I don’t want to be a programmer”) must be managed. And IT must resist the urge to implement the changeable logic for business users (i.e. &#8220;It&#8217;s easier and faster if I do it in code&#8221;). Both parties must share the same vision&#8211; the heavy lifting upfront is done to make the work easier and faster in the future.</li>
<li><strong>Management Endorsement. </strong>Support from management is critical to the success of a BRMS implementation. BRMS requires a comprehensive set of management capabilities to handle the specific needs of the LOB and IT (Stineman, 2009). Managers have to understand and support the changes in roles and responsibilities that will occur as a result. Expectations from the LOB and IT must be mutually agreed upon and overseen. As such, job descriptions, performance goals, and support structures would need to change as well. For example, business users are more involved with rule authoring and troubleshooting, while IT would need to coordinate with business users more, knowing when deployments are made.</li>
<li><strong>Enterprise Wide.</strong> Oftentimes, BRMS is considered for a specific application. The return on investment (ROI) may not always be worth the implementation. Consider sharing the BRMS to the entire enterprise – not only does the ROI increases, but stakeholder support as well.</li>
</ul>
<p class="MsoNormal">As important as it is for the business users and IT to plan the BRMS implementation together, it is even more important that they <em><span>execute</span></em> it together.</p>
<p class="MsoNormal">In normal software implementations, business users participate in the elaboration phase for requirements specification, become minimally involved during IT development, and return for quality assurance. But in BRMS, building the “business user interface” is important (Sparkling Logic, 2010). Design the BRMS around the business. Balance the focus of the implementation between the technical and the business aspects.</p>
<p class="MsoNormal">When approaching the implementation from the business’ point-of-view, IT is forced to design the BRMS interface such that it makes sense to the business. Doing so will allow the business users to be more efficient and effective when writing the rules and increase the quality of the underlying artifacts. Likewise, IT will also gain efficiencies by not having to field questions or troubleshoot problems that they could have avoided if they would have designed the system around the business users.</p>
<p class="MsoNormal">The key aspects to focus on when designing the user interface are the following:</p>
<ul>
<li><strong>Representation of Business Concepts.</strong> Depending on the BRMS product selected, this task could be easier on some and more difficult in others, but the intent is the same – design the business object model and/or the vocabulary used to author rules close to the “business user speak”. The underlying data models could be complex and difficult to navigate, but if the object model (perhaps accompanied by a well-mapped vocabulary) designed to write the rules is easy to understand, the business users will find it easier to write the rules.</li>
<li><strong>Packaging and Grouping. </strong>Packaging (e.g. rule sets) is natural for an IT practitioner, but is often a foreign concept to a business user. Name rule folders, packages and sets with simple, business-friendly names. Avoiding cryptic naming conventions involving numbers and IT codes. Structure the packages such that the business user need not traverse multiple locations for maintaining related rules. Within the rule sets, design a folder hierarchy that makes sense to the business user – often, it is effective to associate the names of the folders closely with the rule flow.</li>
<li><strong>Navigation and Metadata.</strong> Often, business rules are related to other rule artifacts. As more rules are developed, business users require more dynamic navigation. Depending on the BRMS product, built-in features may already be available to support these types of activities. Work with the business users when designing these components. Keep in mind how they can also be employed for the technical design and implementation.
<ul>
<li><strong>Tagging.</strong> If the product supports tagging (e.g. categorization), choose categories that make sense to the business users.</li>
<li><strong>Rule Metadata. </strong>If the product supports adding custom metadata to rule artifacts, consider how the business users might need additional attributes to describe the rule artifacts for their documentation and search.</li>
<li><strong>Custom Views.</strong> If the product supports custom views and queries for presenting rules, design them to support business users’ day-to-day activities.</li>
</ul>
</li>
</ul>
<p class="MsoNormal">Though the business user interface is important, this does not imply that the technical implementation is less valuable to the success of an implementation. They are equally critical to the whole system. In fact, it is important that developers are responsible for the structure of the rule projects and the pilot development of the rules. Though rules can be written by business users, the initial structure must be designed to ensure good performance and consistency. This cannot be done by business users alone.</p>
<p class="MsoNormal">Thus, IT must guide the business users with the following:</p>
<ul>
<li><strong>Naming conventions.</strong> Business users should be able to name rule artifacts in a user-friendly manner, but conventions are still important and is not a concept that business users are generally accustomed with. Establish conventions for consistency across different business user groups. This helps both business and technical users when working in different rule spaces.</li>
<li><strong>Templates. </strong>If the BRMS product allows, make use of their template features. Otherwise, share rule templates with business users, when they start to author new rules after the initial implementation.</li>
<li><strong>Rule Authoring Guides. </strong>IT can provide rule authoring guides to business users, outlining the best practices for authoring and/or updating rules. This can help with quality maintenance, e.g. suggest rule patterns for good performance, warn against rule patterns that can cause infinite loops, encourage running rule analysis (if the BRMS product supports this feature), and establish guidelines for testing and validation.</li>
</ul>
<p>Management, the line of business and IT must all be ready and prepared for the BRMS implementation. Agree on roles and responsibilities and commit to necessary organization changes. Balance the implementation between the business users and IT. Increase the communication and coordination of the two groups to ensure success. With the entire organization on board and the system designed and configured to support the business, you can reap the benefits of a successful BRMS implementation, that is not only reflected in your bottom line but by your stakeholders as well!</p>
<h4>References</h4>
<p><span>Dixon, J., &amp; Jones, T. (2011, July 25) </span><em>Hype Cycle for Business Process Management, </em>2011<span>.</span></p>
<p>Gartner. (n.d.). <em>Gartner Hype Cycle.</em> Retrieved February 21, 2011, from Gartner: http://www.gartner.com/technology/research/methodologies/hype-cycle.jsp</p>
<p>Sparkling Logic. (2010, February 16). <em>#1 Pitfall in Decision Management.</em> Retrieved February 18, 2011, from Everything Decision Management, Technically Speaking: http://techondec.wordpress.com/2010/02/16/1-pitfall-in-decision-management/</p>
<p>Stineman, B. (2009, November). <em>IBM WebSphere ILOG Business Rule Management Systems: The Case for Architects and Developers.</em> Retrieved February 18, 2011, from IBM: ftp://ftp.software.ibm.com/common/ssi/sa/wh/n/wsw14091usen/WSW14091USEN.PDF</p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/03/22/ready-the-enterprise-for-brms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Reaping the Benefits of BRMS]]></series:name>
	</item>
		<item>
		<title>The several flavors of random in Java</title>
		<link>http://www.summa-tech.com/blog/2012/03/14/the-several-flavors-of-random-in-java/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-several-flavors-of-random-in-java</link>
		<comments>http://www.summa-tech.com/blog/2012/03/14/the-several-flavors-of-random-in-java/#comments</comments>
		<pubDate>Wed, 14 Mar 2012 11:46:40 +0000</pubDate>
		<dc:creator>Jorge Lee</dc:creator>
				<category><![CDATA[Agile and Development]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4448</guid>
		<description><![CDATA[Random number generation is one of most basic features in any programming language. The basic utilization is always the same: generate a random number between 0 and 1. With such a simple resource at hand we sometimes overlook some interesting features.]]></description>
			<content:encoded><![CDATA[<p>Random number generation is one of most basic features in any programming language. The basic utilization is always the same: generate a random number between 0 and 1. With such a simple resource at hand we sometimes overlook some interesting features.</p>
<h3>What do we learn from the books?</h3>
<p>The most obvious and maybe intuitive way to generate random numbers in Java is simply calling:</p>
<pre>java.lang.Math.random()</pre>
<p>Random generation is in the <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html">Math</a> utility class with abs, pow, floor, sqrt and other mathematical functions we see in all other languages. Most people will learn about this class in books, tutorials and classes. The utilization is simple: a double is returned between 0.0 and 1.0. With this basic information, a developer usually writes something like:</p>
<pre>Math.random() * 10</pre>
<p>&#8230;to generate a double between 0.0 and 10.0, and:</p>
<pre>Math.round(Math.random() * 10)</pre>
<p>&#8230;to generate a integer between 0 and 10. Static imports can make these expressions shorter but  casting can be annoying, especially if wrapper classes are involved.</p>
<h3>One step further</h3>
<p>By reading the source code of Math.random() or simply playing with the IDE&#8217;s auto-completion feature, a developer can easily notice that java.lang.Math.random() uses an internal random generator object &#8211; a powerful object with the flexibility to generate randoms of booleans, all numeric types (with and without range) and even Gaussian distributed doubles.  For example:</p>
<pre>new java.util.Random().nextInt(10)</pre>
<p>This amazing object does have one drawback, however: it is an object. Its methods are only accessible through an instance, which means the constructor must be called. Expressions like the one above are acceptable if memory is not an issue, but it feels that something is not right.</p>
<p>A simple solution to avoid creating a new instance of Random each time you need a random number is to have a singleton instance using a static class, but by doing this you will be essentially replicating what java.lang.Math does.  Maybe a safe way is to copy the lazy initialization and have your improved version of java.lang.Math. This works, has low maintenance, but you may want some simple unit testing just to make sure it is working.</p>
<p>The storage problem comes from the assumption that the code which calls it only wants a random value. Sometimes there is a need to manipulate or protect the seed, an internal number used to store the state and calculate the next random number. In these special cases a public accessible random generator is not appropriate.</p>
<h3>Concurrency</h3>
<p>In a multi-threaded environment like a Java EE application, the random generator object instance can still be stored as a static attribute in a class or some other implementation of the singleton pattern. Fortunately, <a href="http://docs.oracle.com/javase/6/docs/api/java/util/Random.html">java.util.Random</a> is thread-safe so there is no risk to corrupt the seed with calls from multiple threads.</p>
<p>Another option worth considering in a multi-threaded scenario is a <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html">java.lang.ThreadLocal</a> instance. The idea of a lazy initialized singleton is implemented by a native Java API and you also have a guarantee of one instance object per thread. No more trouble with concurrency and no more trouble with unit testing.</p>
<p>One thing is still not right: Java did not provide a good way to manage the singleton java.util.Random instance and through this post it was discussed ways to build that. Well, the long awaited <a href="http://jdk7.java.net/">Java 7</a> provides a new way to generate random values:</p>
<pre>java.util.concurrent.ThreadLocalRandom.current().nextInt(10)</pre>
<p>This new API mixes the advantages of the two other approaches: singleton/static access like Math.random() and flexibility. <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadLocalRandom.html">ThreadLocalRandom</a> is also faster than any other approach in high concurrence scenarios.</p>
<h4>EDIT</h4>
<p>Fellow summanoid Chris Marasti-Georg pointed that
<pre>Math.round(Math.random() * 10)</pre>
<p> causes an unbalanced distribution, e.g.: 0.0 &#8211; 0.499999 will round to 0 while 0.5 to 1.499999 will round to 1. The correct way to achieve a balanced distribution with the old style syntax is
<pre>Math.floor(Math.random() * 11)</pre>
<p> Fortunately we don’t have to worry if we are java.util.Random or java.util.concurrent.ThreadLocalRandom.<br />
Effective Java item 47 describes some the dangers of not using the java.util.Random API in the correct way. The lesson is do not use
<pre>Math.abs(rnd.nextInt())%n</pre>
<p> instead use the API as designed: rnd.nextInt(n).</p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/03/14/the-several-flavors-of-random-in-java/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The Branch Not Taken:  A Practical Mercurial Workflow</title>
		<link>http://www.summa-tech.com/blog/2012/03/08/the-branch-not-taken-a-practical-mercurial-workflow/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-branch-not-taken-a-practical-mercurial-workflow</link>
		<comments>http://www.summa-tech.com/blog/2012/03/08/the-branch-not-taken-a-practical-mercurial-workflow/#comments</comments>
		<pubDate>Thu, 08 Mar 2012 20:19:49 +0000</pubDate>
		<dc:creator>Steve Ayers</dc:creator>
				<category><![CDATA[Agile and Development]]></category>
		<category><![CDATA[branching]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[SCM]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4474</guid>
		<description><![CDATA[I can still remember the sweat running down the back of my neck all these years later.  I was a young, spry teenager with a full head of luxuriant hair sitting in AP English waiting for the teacher to call on me.

See today, this day, it was up to us to present our interpretation of a poem by Robert Frost, the well known '<a href="http://en.wikipedia.org/wiki/The_Road_Not_Taken_(poem)">The Road Not Taken</a>'.  I agonized over the twenty lines of iambic tetrameter in front of me at the last minute, hoping, praying, that something, ANYTHING would jump off the page at me and give me a topic to discuss.  Why would the traveler not come back?  Is he dying?  Why is he sighing?  Is he sad about the yellow wood?  My mind was racing.

All I could remember thinking was, 'why on earth do I have to bother with this cryptic stuff?'  I was fresh from the Cliff's Notes of Walden when now I had another piece of dusty old prose to analyze.  'How would this ever benefit me in the future?  <em>When am I ever going to need this??</em>'

Well, it took seventeen years and one head of formerly-luxuriant hair, but I finally have a practical application for Frost's poem.  And yes, while it may be a stretch, if you have a better explanation for how I spent my formative years reading hundred-year old literature, then I'm all ears.

Recently, a colleague and I were discussing version control.  He had been using <a href="http://git-scm.com/">Git </a>on a current project and I was using <a href="http://mercurial.selenic.com/">Mercurial</a>.  He then asked me a pointed question for which I now regrettably realize I didn't have a sufficient answer.  He asked me, 'what sort of daily workflow do you follow?'  I asked, 'what do you mean, like commit, push, pull, etc.?' and he replied, ‘yes’, basically asking how I maximize my efficiency in a distributed version control environment.]]></description>
			<content:encoded><![CDATA[<p>I can still remember the sweat running down the back of my neck all these years later.  I was a young, spry teenager with a full head of luxuriant hair sitting in AP English waiting for the teacher to call on me.</p>
<p>See today, this day, it was up to us to present our interpretation of a poem by Robert Frost, the well known &#8216;<a href="http://en.wikipedia.org/wiki/The_Road_Not_Taken_(poem)">The Road Not Taken</a>&#8216;.  I agonized over the twenty lines of iambic tetrameter in front of me at the last minute, hoping, praying, that something, ANYTHING would jump off the page at me and give me a topic to discuss.  Why would the traveler not come back?  Is he dying?  Why is he sighing?  Is he sad about the yellow wood?  My mind was racing.</p>
<p>All I could remember thinking was, &#8216;why on earth do I have to bother with this cryptic stuff?&#8217;  I was fresh from the Cliff&#8217;s Notes of Walden when now I had another piece of dusty old prose to analyze.  &#8216;How would this ever benefit me in the future?  <em>When am I ever going to need this??</em>&#8216;</p>
<p>Well, it took seventeen years and one head of formerly-luxuriant hair, but I finally have a practical application for Frost&#8217;s poem.  And yes, while it may be a stretch, if you have a better explanation for how I spent my formative years reading hundred-year old literature, then I&#8217;m all ears.</p>
<p>Recently, a colleague and I were discussing version control.  He had been using <a href="http://git-scm.com/">Git </a>on a current project and I was using <a href="http://mercurial.selenic.com/">Mercurial</a>.  He then asked me a pointed question for which I now regrettably realize I didn&#8217;t have a sufficient answer.  He asked me, &#8216;what sort of daily workflow do you follow?&#8217;  I asked, &#8216;what do you mean, like commit, push, pull, etc.?&#8217; and he replied, ‘yes’, basically asking how I maximize my efficiency in a distributed version control environment.</p>
<p>When I explained my rather pedestrian daily routine, he sent me a link to a <a href="http://randyfay.com/node/91">post explaining an effective way to do it in Git</a>.  After reading, I felt like the same teenage dope that stood in front of the class and explained that the yellow wood in Frost&#8217;s poem meant rebirth (it doesn&#8217;t).  I essentially had no real explanation at all.  I simply wasn&#8217;t prepared.</p>
<p>So, this is my attempt at constructing a daily workflow, Mercurial-style, while simultaneously making use of my years in English class.  Now if anyone can provide a reason why I read the Red Badge of Courage, I’m all ears.</p>
<p style="text-align: center;"><em>Two branches diverged in a local repo<br />
And sorry I had to push from both<br />
And be one developer, long I stood<br />
And looked through the history as far as I could<br />
To where they were cloned in the undergrowth</em></p>
<p>The first thing I noticed in the blog post about Git was that its purpose was a rebase workflow.  It favored the approach of branching to contain and isolate all your incremental changes and commits locally.  Then when they were ready for primetime, they were rebased to the main branch and inflicted on an unsuspecting populace.  The only problem was that using branches for this sort of thing would not work in Mercurial.  At least not effectively.</p>
<p>Branches in Mercurial represent a parallel path of development within the same repository.  For example, a branch, &#8216;Release1&#8242; is creating from the default where all developers can apply bug fixes for Release1, while at the same time the default branch represents &#8216;Release2&#8242; and continues on with its new feature sets.  These branches can be created on the central repository and then pulled down locally.  If you are working on a Release1 fix, you simply update your working directory to Release1 locally.  Working on a new Release2 feature?  Update to default.</p>
<p>The problem lies in the realization that when it is time to push, ALL commits in BOTH branches will need to be pushed.  Sure, there are extension-based ways around this with shelving and transplanting, but the out-of-the-box behavior is to send all commits on their way.  This means that if your fixes for Release1 must go out the door now, then they&#8217;re taking everything with them, including all those work-in-progress Release2 features you&#8217;ve committed locally.</p>
<p>So, the Mercurial way is actually a combination of branching and cloning.  My approach is to clone my repository into as many child repos as is needed, say one for every active branch in the central repo.  This way, you can push from a repo of your choosing, while still holding back any changesets you committed but aren&#8217;t ready to unleash.  So, taking our scenario above, the setup would look something like this:</p>
<p><img src="http://www.summa-tech.com/blog/wp-content/uploads/2012/03/mercurial-layout4-300x279.png" alt="mercurial-layout4" width="300" height="279" class="aligncenter size-medium wp-image-4493" /><br />
Granted, because the clones are uhh, clones of the main local repo, which is in turn a clone of the central repo, they will contain both branches.  However, all you need to do is make sure each is always updated to their appropriate branch and you never need worry about which branch you&#8217;re in when making a change.  Trust me, this is not always easy and has burned me quite a few times.</p>
<p style="text-align: center;"><em>Then took the other, as just as fair,<br />
And having perhaps the new feature<br />
Because it was buggy and wanted flair<br />
Though as for that the coding there<br />
Had diverged it into its own new creature</em></p>
<p>So, now you have two repo clones that are based off of your main local repository, which in turn, is based off the central repo.  The newly cloned repo is even smart enough to know from whence it came, so now you are free to make changes to this cloned repo, commit at will, and then when ready, the feature or the bug fix can be pushed to the main local repo.</p>
<p>Before you do however, you will want to pull from the central repo to your local and then in turn, pull into your cloned repo.  This way, all merging that needs done will be performed on the cloned repo, leaving your main repo as the staging area for shoves back into the central one.  </p>
<p>Mercurial&#8217;s approach of requiring merge commits can leave the repository cluttered with numerous commits with the message, &#8216;Merge&#8217; with no real content.  In addition, each developer&#8217;s local commits will also be pushed, so every &#8216;Ugh, still broken&#8217;, &#8216;Bug fix&#8217;, and &#8216;DO NOT navigate to this page yet&#8217; commits will be bared to all.  However, there is an answer to this, but its not an easy one to accomplish.  Each of these nonsensical merges and interim commits can be combined into one changeset.  You can perform this concatenation in the clone repos and then push a single, solitary, meaningful changeset (or several as long as they&#8217;re meaningful) to the main repos.  Take a look at <a href="http://mercurial.selenic.com/wiki/ConcatenatingChangesets">this link for further reading on ConcatenatingChangesets.</a></p>
<p style="text-align: center;"><em>And both that morning equally lay<br />
In revisions no commit had trodden black<br />
Oh, I kept the default for another day!<br />
Yet knowing how testing leads to dismay,<br />
I doubted if I should ever update back</em></p>
<p>Once this setup is up and running, you’ll find that very little need be done on your central local repository.  The idea of having to clone an entire repository, especially one per branch as we did above seems like overkill, but it does provide a clear and definitive way to keep your lines of work distinct and separate while at the same time giving you great flexibility in managing your code.</p>
<p>Now, for a practical example.  To start off, notice my prompt in the terminal.  Through the use of a very nice Mercurial plugin called <a href="https://bitbucket.org/sjl/hg-prompt/src">Hg Prompt</a>, I am able to print repository information in my prompt so that I am always aware of 1) what repo I’m in 2) what branch of the repo I am in and 3) what I have incoming and outgoing.  This simple plugin makes working in a multi-repo and multi-branch environment extremely easy.   </p>
<p><img src="http://www.summa-tech.com/blog/wp-content/uploads/2012/03/terminal11.png" alt="terminal11" width="471" height="225" class="aligncenter size-full wp-image-4502" /></p>
<p>1.  Notice the main repo (<strong>frost</strong>) has two branches, one for release1 and one for default, which represents the current line of development.  What I’ve done here is clone my main local repo twice, one for each branch.  So I now have a local repo cloned from the central (frost) and two additional ones cloned from that.</p>
<hr />
<div style="margin-top:50px"></div>
<p><img src="http://www.summa-tech.com/blog/wp-content/uploads/2012/03/terminal21.png" alt="terminal21" width="471" height="200" class="aligncenter size-full wp-image-4508" /></p>
<p>2.  Next, I update the frost-release1 repository to the release1 branch and leave it there.  This way I don’t have to worry about mucking around with changing branches.  I then do the same to release2.  Each repo is now dedicated to a branch.</p>
<hr />
<div style="margin-top:50px"></div>
<p><img src="http://www.summa-tech.com/blog/wp-content/uploads/2012/03/terminal3.png" alt="terminal3" width="471" height="225" class="aligncenter size-full wp-image-4513" /></p>
<p>3.  Now, we are actually making changes to the repos.  Notice that I’ve added a new file to the release2 repo.  The ‘?’ in my prompt tells me I have an untracked file and the ‘!’ tells me I have changes to commit.  All thanks to our hg-prompt extension.</p>
<hr />
<div style="margin-top:50px"></div>
<p><img src="http://www.summa-tech.com/blog/wp-content/uploads/2012/03/terminal4png1.png" alt="terminal4png1" width="407" height="296" class="aligncenter size-full wp-image-4536" /></p>
<p>4.  Next, we change back to our main local repo.  Here, I have configured two additional paths so that I can determine incoming changes to my main local repo from my clones.  Notice the additional parameter to ‘hg in’, which allows me to specify a repo to find incoming changes.  The paths are denoted in your repository-specific hgrc file as follows:</p>
<p><img src="http://www.summa-tech.com/blog/wp-content/uploads/2012/03/terminal5.png" alt="terminal5" width="460" height="86" class="aligncenter size-full wp-image-4517" /></p>
<hr />
<div style="margin-top:50px"></div>
<p>5.  Now, I am able to see that I have one incoming changeset from one of my local clones.</p>
<p><img src="http://www.summa-tech.com/blog/wp-content/uploads/2012/03/terminal6.png" alt="terminal6" width="471" height="178" class="aligncenter size-full wp-image-4519" /></p>
<hr />
<div style="margin-top:50px"></div>
<p>6.  Say that I need to get release 1 changes pushed quickly for a patch tonight.  In regular One Repo Land, I would have to push all committed changesets in my local repo.  But, here, we can simply pull from the repo we need and push the changes up.  Running an ‘hg out’ on my main local repo will show that my only outgoing changes are for my release1 fixes.  My release2 features are still safe and sound in their own repository.  A simple push and the fix is in.</p>
<p><img src="http://www.summa-tech.com/blog/wp-content/uploads/2012/03/terminal7.png" alt="terminal7" width="433" height="158" class="aligncenter size-full wp-image-4521" /></p>
<p>A few notes:</p>
<p>1.	 I understand it may seem a bit heavy-handed to make three clones for local work, but cloning in Mercurial is not only easy and cheap, but encouraged.  Mercurial uses hard-linking on the file system to only track differences, not entire files throughout their history.</p>
<p>2.	The reason I chose one main local repo and two clones instead of just two clones of the central repo is that this gives me a staging area for ready-to-push changes while also allowing me to pull and run the most current code MINUS my changes.</p>
<p>3.	Again, I understand it is possible to avoid pushing all commits from every local branch, but this involves some maneuvering of changesets using extensions.  I am trying to give a simple approach that will avoid that process.</p>
<p>So, that is my humble attempt at creating a practical rebase workflow in Mercurial while pretentiously incorporating turn-of-the-century lore.  I always knew there was a reason I was sweating over those wordy old poems and tomes.</p>
<p style="text-align: center;"><em>I shall be telling this with a sigh<br />
Somewhere projects and projects hence:<br />
Two repos diverged in a local wood, and I&#8211;<br />
I took the one less developed by<br />
And that has made all the difference</em></p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/03/08/the-branch-not-taken-a-practical-mercurial-workflow/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Scoping JavaScript &#8211; An Overview</title>
		<link>http://www.summa-tech.com/blog/2012/02/21/scoping-javascript-an-overview/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=scoping-javascript-an-overview</link>
		<comments>http://www.summa-tech.com/blog/2012/02/21/scoping-javascript-an-overview/#comments</comments>
		<pubDate>Wed, 22 Feb 2012 02:41:11 +0000</pubDate>
		<dc:creator>Jon Theis</dc:creator>
				<category><![CDATA[Agile and Development]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4337</guid>
		<description><![CDATA[<div>Scope is an important concept in programming.  For developers using object oriented languages, scope is an integral part of encapsulation.  In simple terms, encapsulation can be defined as making the internal representation of an object (it's implementation) hidden from the client that is using it.  As an example, this concept is second nature to Java developers who define Interfaces and public methods to expose functionality to the outside world, but can hide the nitty gritty, implementation specific details in code not visible to the outside world (private methods for instance).</div>
Can this same paradigm be applied to JavaScript?  How can elements be scoped in JavaScript to provide for a clean interface to the outside world but still hide those low-level implementation details?  Let's discuss these questions by providing an overview of the different types of scope in JavaScript and then reviewing how they are implemented.]]></description>
			<content:encoded><![CDATA[<div>Scope is an important concept in programming.  For developers using object oriented languages, scope is an integral part of encapsulation.  In simple terms, encapsulation can be defined as making the internal representation of an object (it&#8217;s implementation) hidden from the client that is using it.  As an example, this concept is second nature to Java developers who define Interfaces and public methods to expose functionality to the outside world, but can hide the nitty gritty, implementation specific details in code not visible to the outside world (private methods for instance).</div>
<div>Can this same paradigm be applied to JavaScript?  How can elements be scoped in JavaScript to provide for a clean interface to the outside world but still hide those low-level implementation details?  Let&#8217;s discuss these questions by providing an overview of the different types of scope in JavaScript and then reviewing how they are implemented.</div>
<h3>Global Scope</h3>
<div>
<div>When a variable is defined outside of a function or is not explicitly defined, it is considered to be in <span style="font-family: 'Courier New';">global</span> scope. Variables in this scope can be accessed from anywhere in a script. (Technically, it is added as an attribute of the <span style="font-family: 'Courier New';"><a title="JavaScript Global Object description on Mozilla Developer Network" href="https://developer.mozilla.org/en/JavaScript/Guide/Values,_Variables,_and_Literals#Global_variables" target="_blank">Global Object</a></span> provided by JavaScript).  You might equate this scope to <span style="font-family: 'Courier New';">public static</span> in Java.</div>
<pre name="code" class="javascript:nocontrols">
var globalVar = "This is a global variable";
globalNotExpliciltyDefined = "global variable not explicitly defined";</pre>
<div>
<div>
<div>Global variables are often <a title="JavaScript Global Variables Are Often Considered Evil" href="http://yuiblog.com/blog/2006/06/01/global-domination/" target="_blank">considered evil</a> due to namespace issues and the problems they can introduce regarding program behavior and reliability.  Thus, their use is discouraged.</div>
<h3>Public Scope</h3>
<div>
<div>Public scope elements are accessible from the outside world.  To demonstrate, consider the following code snippet:</div>
<pre name="code" class="javascript:nocontrols">function ScopeObject(arg1){
    this.publicVariable = "public variable";
    this.paramMadePublic = arg1;
}

ScopeObject.prototype.publicMethod = function(){
    return "public method executed";
};

var myScopeObject = new ScopeObject("constructor param");</pre>
<div>Here we define a constructor function, add a method to its prototype, and create an instance of it.  Given the existence of <span style="font-family: 'Courier New';">myScopeObject</span>, the following code demonstrates how a client can access the publicly available elements of the instance:</div>
<pre>myScopeObject.publicVariable;     //returns "public variable"
myScopeObject.publicMethod();     //returns "public method executed"</pre>
<div>Public attributes are defined in the object&#8217;s constructor using <span style="font-family: 'Courier New';">this</span>. i.e. <span style="font-family: 'Courier New';">this.publicVariable = &#8220;public variable&#8221;;</span></div>
<div>Methods that should be publicly available on all instances of an object can be added to the object&#8217;s prototype as shown above.</div>
<h3>Private Scope</h3>
<div>
<div>Hiding unnecessary implementation details from client code is a best practice regardless of the programming language being used.  The private scope facilitates this in JavaScript.</div>
<div>Parameters to functions are considered to be in private scope, as are variables defined with the <span style="font-family: 'Courier New';">var</span> keyword inside the constructor.  Functions defined in the constructor are also considered to be in private scope.  Let&#8217;s add some private elements to the ScopeObject we defined earlier.</div>
<pre name="code" class="javascript:nocontrols">function ScopeObject(arg1){
     // arg1, when directly accessed in the constructor, is in private scope

     // ...existing public scope code omitted

    var privateVariable = "private variable";

    function privateMethod(){
        return "private method executed";
    }
}</pre>
<div>Assuming we create an instance of our object again&#8230;</div>
<pre>var myScopeObject = new ScopeObject("constructor param");</pre>
<div>&#8230;trying to access a private variable using dot notation is not possible.  Trying to call the private method on an object instance also fails and will produce an error.</div>
<pre name="code" class="javascript:nocontrols">
myScopeObject.privateVariable        //returns undefined
myScopeObject.privateMethod()      //produces TypeError: Object # has no method 'privateMethod'
</pre>
<div>The variable and method are hidden from direct access by the outside world.  What if we wanted to call the private method from our public method?  Sounds simple enough and is a practice familiar to Java and other OO developers.  Lets add another method to our object&#8217;s prototype like so:</div>
<pre name="code" class="javascript:nocontrols">
ScopeObject.prototype.publicMethodCallsPrivateMethod = function(){

    // call the private method defined in the constructor
    privateMethod();

    return "public method calls private method executed";
};
</pre>
<div>Calling <span style="font-family: 'Courier New';">myScopeObject.publicMethodCallsPrivateMethod()</span> returns <span style="font-family: 'Courier New'; color: #FF0000;">TypeError: Object #&lt;ScopeObject&gt; has no method &#8216;privateMethod&#8217;</span><span style="font-family: 'Courier New';">.</span> In JavaScript, a public method cannot call a private method.  If that&#8217;s the case, what&#8217;s the sense of using private methods?  Enter <span style="font-family: 'Courier New';"><strong>privileged</strong></span> scope.</div>
<h3>Privilege Scope</h3>
<div>
<div>
<div>Privileged scoped methods act as a bridge between the public and the private scopes.  Douglas Crockford in his post &#8220;<a href="http://javascript.crockford.com/private.html" target="blank">Private Members In JavaScript</a>&#8221; describes privileged methods this way:</div>
<div><span></p>
<p></span></div>
<div><span>&#8220;<span>A</span><span> </span><span><em>privileged</em></span><span> </span><span>method is able to access the private variables and methods, and is itself accessible to the public methods and the outside. It is possible to delete or replace a privileged method, but it is not possible to alter it, or to force it to give up its secrets.&#8221;</span></span></div>
<div>A privileged method is defined using the <span style="font-family: 'Courier New';"><span><strong>this </strong></span></span>keyword in the constructor.  Lets add a privileged method to our <span style="font-family: 'Courier New';">ScopeObject</span>:</div>
<pre name="code" class="javascript:nocontrols">
function ScopeObject(arg1){
  // ...existing public scope code omitted
  // ...existing private scope code omitted

  this.privilegedMethod = function(){
      return "privileged method executed";
  }
}
</pre>
<div><span>To demonstrate how this scope acts as a bridge between elements in public and private scope, let&#8217;s add an additional privileged method to our constructor that accesses the private variable and calls the private method.  Inside the <span style="font-family: 'Courier New';">ScopeObject</span> constructor, add the following code:</span></div>
<pre name="code" class="javascript:nocontrols">
this.privilegedMethodCallsPrivate = function(){

      console.log("in privileged method, privateVariable is : " + privateVariable);
      privateMethod();

      return "privileged method calls private executed";
  }
</pre>
<div><span>As a privileged method, this new method will not only be visible to the outside world (mimicking public scope), but calling <span style="font-family: 'Courier New';">myScopeObject.privilegedMethodCallsPrivate()</span> succeeds because the privileged method has access to the private members of <span style="font-family: 'Courier New';">ScopeObject</span>. </span></div>
<h3>Summary</h3>
<div>
<div>
<div><span>We discussed 4 types of scope: <span style="font-family: 'Courier New';">global</span>, <span><span style="font-family: 'Courier New';">public</span></span>, <span><span style="font-family: 'Courier New';">private</span></span>, and <span><span style="font-family: 'Courier New';">privileged</span></span>.</span></div>
<p/>
<div><strong>Global</strong>: Variables in this scope are added to the JavaScript Global object and are available anywhere inside the script and to the outside world.  These should be avoided in favor of implementing encapsulation using the other scopes.</div>
<div><strong>Public</strong>: Variables and methods in this scope are directly accessible by the outside world.  Variables in this scope are created in the constructor function using &#8216;<span style="font-family: 'Courier New';">this</span>&#8216;.  Methods of this scope are most often added to the prototype.</div>
<div><strong>Private</strong>:  Not visible to the outside world.  Artifacts of this scope are limited without the use of privileged methods.  Variables of this scope are created using the &#8216;<span style="font-family: 'Courier New';">var</span>&#8216; keyword in the constructor function.  Methods of this scope are created using the &#8216;<span style="font-family: 'Courier New';">function</span><span style="font-family: 'Andale Mono'; font-size: xx-small;">&#8216;</span> keyword in the constructor.</div>
<div><strong>Privilege</strong>: The &#8220;bridge&#8221; or &#8220;glue&#8221; scope that permits access to private artifacts in the object but is also publicly available.  Methods of this scope are created using &#8216;<span style="font-family: 'Courier New';">this</span>&#8216; in the object constructor.</div>
<p />
<div>Below is the final state of our sample code.  Some logging statements have been added so that execution can be traced when executing in the console.</div>
</div>
<pre name="code" class="javascript">
function ScopeObject(arg1){
    this.publicVariable = "public variable";
    this.paramMadePublic = arg1;

    var privateVariable = "private variable";

    globalNotExpliciltyDefined = "global variable not explicitly defined";

    function privateMethod(){
        console.log("private method : executing...");
        return "private method executed";
    }

    this.privilegedMethod = function(){
        console.log("privileged method : executing...");
        return "privileged method executed";
    };

     this.privilegedMethodCallsPrivate = function(){
          console.log("privileged method calls private : executing...");

          console.log("in privileged method, privateVariable is : " + privateVariable);
          privateMethod();

          return "privileged method calls private executed";
     };

}

ScopeObject.prototype.publicMethod = function(){
    console.log("public method : executing...");
    return "public method executed";
};

ScopeObject.prototype.publicMethodCallsPrivateMthod = function(){
     console.log("public method calls private method : executing");
     privateMethod();
     return "public method calls private method executed";
};
</pre>
<p>Another way of controlling what is presented to a client user of an object in JavaScript is by using the <a href="http://yuiblog.com/blog/2007/06/12/module-pattern/" target="_blank">Module Pattern</a>, or its close cousin the <a href="http://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript" target="_blank">Revealing Module Pattern</a>.  These patterns will be considered in a future post.  In the meantime, what patterns do you use to control scope in your JavaScript?  Please leave a comment below.</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/02/21/scoping-javascript-an-overview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Summa Sponsors Evening Reception at HIMSS on 2/21</title>
		<link>http://www.summa-tech.com/blog/2012/02/14/summa-sponsors-evening-reception-at-himss-on-221/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=summa-sponsors-evening-reception-at-himss-on-221</link>
		<comments>http://www.summa-tech.com/blog/2012/02/14/summa-sponsors-evening-reception-at-himss-on-221/#comments</comments>
		<pubDate>Tue, 14 Feb 2012 19:25:58 +0000</pubDate>
		<dc:creator>Jeremy Smith</dc:creator>
				<category><![CDATA[Technology + Healthcare]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4377</guid>
		<description><![CDATA[HIMSS attendees from Pennsylvania or the Deleware Valley region...  Please Join <a href="http://www.wphimss.org/">WPHIMSS</a> for an evening reception sponsored by Summa and HCI Group!

Meet and network with HIT professionals from Pennsylvania and the Delaware Valley region, and learn about your local HIMSS chapters, all while enjoying food and drinks conveniently located at the Venetian. All <a href="http://www.wphimss.org/">WPHIMSS</a>, <a href="http://www.cpahimss.org/">CPAHIMSS</a>, and <a href="http://www.dvhimss.org/">DVHIMSS</a> members and their guests are welcome to attend.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.himssconference.org/">HIMSS</a> attendees from Pennsylvania or the Deleware Valley region&#8230;  Please join <a href="http://www.wphimss.org/">WPHIMSS</a> for an evening reception sponsored by Summa and HCI Group!</p>
<p>Meet and network with HIT professionals from Pennsylvania and the Delaware Valley region, and learn about your local HIMSS chapters, all while enjoying food and drinks conveniently located at the Venetian. All <a href="http://www.wphimss.org/">WPHIMSS</a>, <a href="http://www.cpahimss.org/">CPAHIMSS</a>, and <a href="http://www.dvhimss.org/">DVHIMSS</a> members and their guests are welcome to attend.</p>
<p>Tuesday, February 21<br />
7 p.m. to 9 p.m.<br />
Lagasse&#8217;s Stadium &#8211; In the Venetian<br />
3355 Las Vegas Blvd., South<br />
Las Vegas, NV 89109<br />
(In the &#8220;Endzone&#8221;)</p>
<p>Please RSVP to <a href="mailto:wphimss12@summa-tech.com">wphimss12@summa-tech.com</a> to let us know who will be attending or for more information on the event.</p>
<p><img src="http://www.summa-tech.com/blog/wp-content/uploads/2012/02/lagasse-stadium1.jpg" alt="lagasse-stadium" title="lagasse-stadium" width="480" height="196" class="alignnone size-full wp-image-4382" /></p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/02/14/summa-sponsors-evening-reception-at-himss-on-221/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Identify the Need for BRMS</title>
		<link>http://www.summa-tech.com/blog/2012/02/08/identify-the-need-for-brms/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=identify-the-need-for-brms</link>
		<comments>http://www.summa-tech.com/blog/2012/02/08/identify-the-need-for-brms/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 14:52:58 +0000</pubDate>
		<dc:creator>Via Tsuji</dc:creator>
				<category><![CDATA[Process Integration]]></category>
		<category><![CDATA[BA]]></category>
		<category><![CDATA[BEP]]></category>
		<category><![CDATA[BPM]]></category>
		<category><![CDATA[brms]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4118</guid>
		<description><![CDATA[All technologies go through the life cycle of maturity and adoption. For most technologies, over-enthusiasm or “hype” and subsequent disappointment precedes mainstream adoption and realization of how the technology solves real business problems. Gartner has modeled this evolution in the Hype Cycle and identified distinct key phases (Gartner).

Business Rule Management Systems (BRMS) began the descent towards the “Trough of Disillusionment” in 2011 (Dixon &#38; Jones, 2011), wherein many implementations fail to deliver what businesses expected it could.

The focus of this series is to provide guidelines for truly reaping the benefits of a business rule management system. It clarifies certain implementation steps, debunks unrealistic expectations, and warns of common pitfalls to a BRMS implementation.

BRMS is not a stranger to the Law of the Instrument. It is either misused or overused for problems that could otherwise have been solved by different or simpler solutions. The second part of this series focuses on correctly identifying the need for a BRMS and distinguishing it from similar technologies.  ]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal">All businesses have policies and rules embedded in their IT systems, but not all businesses require a Business Rule Management System (BRMS) implementation. Though incorrect business rules in BRMS can easily be fixed, it is more complex to rectify a BRMS that was not needed in the first place. Thus, to fully reap the benefits of business rules, first, it is crucial to precisely identify the need of a BRMS in the enterprise – recognize the aspects of the business which validly require a BRMS and distinguish it from other decision management technologies, such as Business Process Management (BPM) software.</p>
<p class="MsoNormal">
<p class="MsoNormal">Enterprises could highly benefit from a BRMS if it is characterized by the following conditions (IBM):</p>
<p class="MsoNormal">
<ul>
<li><strong>Frequent Business Rule Changes.</strong> Rule changes originate from evolving business conditions (e.g. competitive pricing), regulatory amendments (e.g. government compliance laws), and varying organizational practices and policies (e.g. validation and feasibility checks). Organizations with frequent business rule changes are fortunate if modifications to their business policies and/or rules are foreseen and scheduled. However, in reality, this rarely happens. Oftentimes, the necessary changes are not implemented in the required IT systems correctly and/or on-time, risking missed opportunities or regulatory violations. Enabling the LOB to change the rules themselves through a BRMS shortens the release cycle for these changes and helps decrease the risks.</li>
<li><strong>Highly Variable Decision-Making.</strong> Certain business models require customized and/or personalized decisions, specific to locality, product, process or the customer itself (e.g. verification and pricing rules). When embedded in an application, the decision logic for these requirements is complex and even more complex to change and validate. With a BRMS, the organization is equipped with flexible and standard mechanisms for expressing and validating these complex rules.</li>
<li><strong>Enterprise Logic Sharing.</strong> Without a BRMS, business logic that is shared in different applications throughout the organization is either duplicated or embedded in the database. This model works well, until the logic needs to be modified. Logic changes are cumbersome to propagate or are implemented inconsistently. The shared repository and versioning capabilities of a BRMS reduce or eliminate these challenges.</li>
</ul>
<p class="MsoNormal">Another pitfall to properly recognizing the need for a business rule management system is confusing its need for other decision management technologies. Sometimes the business problem requires a BRMS in combination with other systems. Other times, the solution may not need to involve a BRMS at all.</p>
<p class="MsoNormal">Decision management is a “practice of combining software and expertise to automate and improve decision-making within critical business systems”. The core purpose is to “make the best possible decision at the current moment based on data and situational context” (Wilson &amp; Stineman, 2010). Not all decision management scenarios are necessarily a call to action by a business rule management system.</p>
<p class="MsoNormal">The fundamental distinctions of a BRMS from other decision management technologies are determining the decision based on what is “known” (e.g. corporate policies, regulations) and providing the tools to manage and govern those decisions. A BRMS does the following well: (1) standardizing of operational decisions; (2) straight through processing; and (3) decision brokerage (FICO, 2006).</p>
<p class="MsoNormal">However, it does not perform well when the problem involves waiting for human intervention, making asynchronous calls to remote systems or gracefully handling errors and exceptions to other services (Sparkling Logic, 2010). In those instances, look to other decision management technologies:</p>
<table border="1" cellspacing="0" cellpadding="2">
<thead>
<tr>
<td style="color: white; background-color: #b89266;" width="309" valign="top"><strong>Technology</strong></td>
<td style="color: white; background-color: #b89266;" width="489" valign="top"><strong>Description</strong></td>
</tr>
</thead>
<tbody>
<tr>
<td width="309" valign="top"><strong>Business Process Management (BPM)</strong></td>
<td width="489" valign="top">BPM is about &#8220;How it should be carried out?&#8221; It   focuses on (1) automating and standardizing processes, especially   long-running transactions; (2) facilitating collaboration; (3) defining and   managing workflows; (4) monitoring activities; and (5) integration brokerage.   (FICO, 2006)</p>
<p>Though decision-making functions can be embedded in   BPM, it is not always the ideal place for them, particularly when the   decision-making increases in complexity. When the workflow becomes a stack of   spaghetti links, it could indicate the need to integrate the BPM with a BRMS.</td>
</tr>
<tr>
<td width="309" valign="top"><strong>Business Event Processing (BEP)</strong></td>
<td width="489" valign="top">BEP focuses on detecting events and patterns for real-time and   temporal comprehension of how to process the incident. Similar to BPM, it can   be combined with a BRMS for orchestrating business information, actions and   responses.</td>
</tr>
<tr>
<td width="309" valign="top"><strong>Business Analytics (BA)</strong></td>
<td width="489" valign="top">BA involves complex decision-making for different   types of goals: (1) historical insights and predictions; (2) optimization of   resources and values; and (3) tracking and monitoring effectiveness. It is   best used for making decisions with a high degree of uncertainty, such as   what is likely to happen in the future or what is the best solution based on   historical trending.</td>
</tr>
</tbody>
</table>
<p><span><span>Business rule management systems can undeniably benefit enterprises with real business problems associated with highly variable and complex decision logic. </span>Validate the need of the tool in the enterprise before getting caught up in the “hype”. Know the needs of the organization and how a BRMS can fulfill the requirements. </span>Explore other decision management technologies and ensure that a BRMS is the right system for the organization. And reap the benefits of a much needed BRMS implementation!</p>
<p><strong>References</strong></p>
<p class="MsoNormal">Dixon, J., &amp; Jones, T. (2011, July 25) <em>Hype Cycle for Business Process Management, 2011</em>.</p>
<p class="MsoBibliography">FICO. (2006, February 9). <em>Are BPMS and BRMS complementary or not?</em> Retrieved February 17, 2011, from FICO Decision Management Blog: <a href="http://www.edmblog.com/weblog/2006/02/are_bpms_and_br.html">http://www.edmblog.com/weblog/2006/02/are_bpms_and_br.html</a></p>
<p>Gartner. (n.d.). <em>Gartner Hype Cycle</em>. Retrieved February 21, 2011, from Gartner:<a href="http://www.gartner.com/technology/research/methodologies/hype-cycle.jsp">http://www.gartner.com/technology/research/methodologies/hype-cycle.jsp</a></p>
<p class="MsoBibliography">IBM. (n.d.). <em>What is a BRMS?</em> Retrieved February 17, 2011, from IBM: <a href="http://www-01.ibm.com/software/websphere/products/business-rule-management/whatis/">http://www-01.ibm.com/software/websphere/products/business-rule-management/whatis/</a></p>
<p class="MsoBibliography">Sparkling Logic. (2010, February 16). <em>#1 Pitfall in Decision Management.</em> Retrieved February 18, 2011, from Everything Decision Management, Technically Speaking: <a href="http://techondec.wordpress.com/2010/02/16/1-pitfall-in-decision-management/">http://techondec.wordpress.com/2010/02/16/1-pitfall-in-decision-management/</a></p>
<p class="MsoBibliography">
<p class="MsoBibliography">Sparkling Logic. (2010, August 24). <em>Business Rules in or out of BPM?</em> Retrieved February 17, 2011, from Everything Decision Management, Technically Speaking: <a href="http://techondec.wordpress.com/2010/08/24/business-rules-in-or-out-of-bpm/">http://techondec.wordpress.com/2010/08/24/business-rules-in-or-out-of-bpm/</a></p>
<p class="MsoBibliography">
<p class="MsoBibliography">Wilson, C., &amp; Stineman, B. (2010, November). <em>Clear up confusion over BRMS, BEP, BA &amp; BPM.</em> Retrieved February 17, 2011, from IBM: <a href="http://www-01.ibm.com/software/solutions/soa/newsletter/nov10/brms.html">http://www-01.ibm.com/software/solutions/soa/newsletter/nov10/brms.html</a></p>
<p class="MsoNormal">
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/02/08/identify-the-need-for-brms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Reaping the Benefits of BRMS]]></series:name>
	</item>
		<item>
		<title>Top 5 Salesforce Spring &#8217;12 Release &#8220;Likes&#8221;</title>
		<link>http://www.summa-tech.com/blog/2012/01/30/top-5-salesforce-spring-12-release-likes/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=top-5-salesforce-spring-12-release-likes</link>
		<comments>http://www.summa-tech.com/blog/2012/01/30/top-5-salesforce-spring-12-release-likes/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 15:41:31 +0000</pubDate>
		<dc:creator>Adam Menzies</dc:creator>
				<category><![CDATA[Cloud Applications]]></category>
		<category><![CDATA[chatter]]></category>
		<category><![CDATA[sales cloud]]></category>
		<category><![CDATA[salesforce]]></category>
		<category><![CDATA[service cloud]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4207</guid>
		<description><![CDATA[Salesforce will officially put the <strong>Spring '12 release</strong> into the wild in early February. We've reviewed the official release notes in detail (get your own copy <a href="http://na9.salesforce.com/help/doc/en/salesforce_spring12_release_notes.pdf">here</a>).

As the release approaches we've hit the<img class="size-medium wp-image-4297 alignnone" style="border-style: initial; border-color: initial;" src="http://www.summa-tech.com/blog/wp-content/uploads/2012/01/facebook-like-button-300x133.jpg" alt="facebook-like-button" width="50" height="20" />button on <strong>five </strong>of the <strong>top features</strong>.  This list is written from a user and administrator perspective for people who both <strong>use </strong>and <strong>configure</strong> Salesforce systems on a daily basis. Be sure to add the features you're looking forward to most in the comments section. Enjoy and happy <strong>Spring '12</strong>!]]></description>
			<content:encoded><![CDATA[<p>Salesforce will officially put the <strong>Spring &#8217;12 release</strong> into the wild in early February. We&#8217;ve reviewed the official release notes in detail (get your own copy <a href="http://na9.salesforce.com/help/doc/en/salesforce_spring12_release_notes.pdf">here</a>).</p>
<p>As the release approaches we&#8217;ve hit the<img class="size-medium wp-image-4297 alignnone" style="border-style: initial; border-color: initial;" src="http://www.summa-tech.com/blog/wp-content/uploads/2012/01/facebook-like-button-300x133.jpg" alt="facebook-like-button" width="50" height="20" />button on <strong>five </strong>of the <strong>top features</strong>.  This list is written from a user and administrator perspective for people who both <strong>use </strong>and <strong>configure</strong> Salesforce systems on a daily basis. Be sure to add the features you&#8217;re looking forward to most in the comments section. Enjoy and happy <strong>Spring &#8217;12</strong>!</p>
<p><br\></p>
<h2>5. Chatter Messenger</h2>
<p>If your organization uses a chat client such as gchat, yahoo messenger, msn messenger, etc&#8230; for interoffice communication this feature will be of great interest to you. Chatter users will now be able to have <strong>live chats</strong> with each other using Chatter Messenger from within the Salesforce application. This could be used as another way to make Salesforce the go to application for your users, driving faster <strong>adoption </strong>across the organization. This feature will also be available to <strong>Chatter Plus</strong> and <strong>Chatter Free</strong> users, so truly anyone at your organization would be able to use this feature. It will be interesting to check this out with customer groups to see if chatting with customer Chatter users is also an option.</p>
<p>As you can see in the screenshot below, the interface is very similar to a popular social network we all love and/or hate:</p>
<p style="text-align: center;"><img class="size-medium wp-image-4208  aligncenter" src="http://www.summa-tech.com/blog/wp-content/uploads/2012/01/chatter_messenger-300x144.png" alt="Screen shot of Chatter Messenger in action" width="540" height="260" /></p>
<p>A few things to consider when implementing this feature:</p>
<ul>
<li>For Spring &#8217;12 this is being released as a <strong>Pilot Program</strong>, so you may need to contact Salesforce to have Chatter Messenger turned on</li>
<li>Chatter must be enabled for Chatter Messenger to be enabled</li>
<li>A user must <strong>follow </strong>another user to chat with them</li>
<li>Chatter Messenger can be disabled without disabling Chatter</li>
</ul>
<p style="text-align: center;"><span style="font-size: 20px;"><strong><br />
</strong></span></p>
<p><br\></p>
<h2>4. Case Feed</h2>
<p>In <strong>Service Cloud</strong> engagements in the past we&#8217;ve been asked to customize the Case entry, update and detail screens to maximize screen real estate and have had to replace these screens entirely with custom <strong>VisualForce</strong> screens that use APEX do AJAX updates. A number of those customizations will now be taken care of using the <strong>Case Feed </strong>feature in Spring &#8217;12.</p>
<p>This feature gives agents the ability to create, review and update Cases from a screen that gives them relevant Case details, Chatter feeds and also allows responses through multiple channels without navigating to another screen. The sidebar on this screen lets agents quickly switch between activities such as logging calls, Case notes, Case details as well as responding <strong>directly to the customer</strong>.</p>
<p>To use this feature Chatter must be enabled as well as Chatter tracking on Cases. For high-volume call centers that best utilize Chatter, this feature will be high impact and much easier to use and maintain than custom VisualForce solutions of the past.</p>
<div class="mceTemp mceIEcenter">
<dl>
<dt><img class="size-medium wp-image-4217 " src="http://www.summa-tech.com/blog/wp-content/uploads/2012/01/case_feed-300x172.png" alt="Case Feed Screenshot" width="450" height="258" /></dt>
</dl>
</div>
<p><br\></p>
<h2>3. Analytics Edition</h2>
<p>Analytics Edition brings the advanced, <strong>BI-like reporting</strong> so many have wanted from Salesforce for so long. This is an<strong> &#8220;Edition&#8221;</strong> feature which means you will need to add this edition to your org for an additional fee (available for Professional, Enterprise and Unlimited Editions). Contact your Salesforce rep for pricing <img src='http://www.summa-tech.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  The major new types of reports are:</p>
<ul>
<li><strong>Joined Reports:</strong> Create and run reports pulling data from multiple objects. (EX: Report on an Account&#8217;s Opportunities and Products associated with those Opportunities)</li>
<li><strong>Cross filters:</strong> Filter across multiple objects. ( EX:  Filter to see Cases from Organizations in a certain Region that also have Opportunities open that are greater than $100k)</li>
<li><strong>Bucketing:</strong> Segment your data on the fly without changing your data model. ( EX: report on open Opportunities by deal size, and group them into custom &#8220;Large&#8221;, &#8220;Medium&#8221; and &#8220;Small&#8221; groupings you create within the report.)</li>
</ul>
<p><br\></p>
<h2>2. Console Push Notifications</h2>
<p style="text-align: -webkit-auto;">A major concern our customers have raised is the issue of two agents or sales reps <strong>updating the same record simultaneously</strong>. This creates what in the programming world is called a &#8220;race condition&#8221; where the users are unknowingly in a race to get to the Save button <strong>last </strong>so that their changes are the changes ultimately saved on the record. This is especially a problem for <strong>high-volume call centers</strong>, both on Sales and Service Cloud. Now users will be able to see real-time push notification of field and record updates in the Salesforce Consoles.</p>
<p style="text-align: -webkit-auto;">As a user is viewing a queue or list view, or even updating a record on its detail screen, they will see changes being made by other users in <strong>real-time</strong>. Administrators can configure colors and bold text to be used to alert users of ongoing changes to a record, and the live notifications can be activated for the following objects (all fields):</p>
<ul>
<li>Custom Objects</li>
<li>Cases</li>
<li>Accounts</li>
<li>Contacts</li>
<li>Leads</li>
<li>Campaigns</li>
<li>Opportunities</li>
</ul>
<p><br\></p>
<h2>1. Schema Builder</h2>
<p>From an administrator or developer point of view, this is almost undoubtedly the most anticipated feature of Spring &#8217;12. Schema Builder has been available in a limited beta version that allowed users to read-only views of their org&#8217;s schema since Winter &#8217;12.</p>
<p>Schema Builder in Spring &#8217;12 (still in <strong>beta </strong>release, available in All Editions) can now be used to <strong>create custom objects, fields and relationships</strong> in an extremely fast manner. Custom objects can be created by dragging and dropping, fields and relationships created without the tedious clicking from screen to screen ways of the past. This feature should speed up creation of these objects, fields and relationships by an order of magnitude over the old way admins were forced to click from screen to screen.</p>
<p>Another advantage is the views of your database schema available to you to use for documentation, testing out new schema changes in the sandbox and to see the true data relationships that underlie your Salesforce instance.</p>
<p style="text-align: center;"><img class="aligncenter size-medium wp-image-4264" src="http://www.summa-tech.com/blog/wp-content/uploads/2012/01/schema_builder-300x236.png" alt="Schema Builder Screen Shot" width="450" height="354" /></p>
<p style="text-align: left;">
<p><span style="text-align: left;">The Schema Builder feature is probably best described through a demo, so I&#8217;ve included the following Spring &#8217;12 release preview below. Hit the 4:20 mark to go right to the Schema Builder demo. </span></p>
<p style="text-align: center;">
<object style="width:425px; height:344px;">
<param name="movie" value="http://www.youtube.com/v/hNsDUSmZlhg?version=3" />
<param name="allowScriptAccess" value="always" />
<param name="wmode" value="window" />
<embed src="http://www.youtube.com/v/hNsDUSmZlhg?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" wmode="window" width="425" height="344"></object>
</p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/01/30/top-5-salesforce-spring-12-release-likes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spring Batch &#8211; Imperfect Yet Worthwhile</title>
		<link>http://www.summa-tech.com/blog/2012/01/23/spring-batch-imperfect-yet-worthwhile/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spring-batch-imperfect-yet-worthwhile</link>
		<comments>http://www.summa-tech.com/blog/2012/01/23/spring-batch-imperfect-yet-worthwhile/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 15:13:36 +0000</pubDate>
		<dc:creator>Jeff Zapotoczny</dc:creator>
				<category><![CDATA[Agile and Development]]></category>
		<category><![CDATA[batch processing]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring Batch]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=4188</guid>
		<description><![CDATA[A lot of folks have used the <a href="http://www.springsource.org/" target="_blank">Spring framework</a> to build applications - and what's not to love? It's allowed us to solve enterprise problems with a minimum of tedium. And the framework has evolved to address criticisms, for example the continued reduction in need for lengthy XML configuration in application contexts in favor of ever more terse syntax and support for code annotations.

The framework as-packaged includes facilities to help with many common aspects of contemporary application development, from a Model-View-Controller (MVC) framework to  integration with persistence managers and elegant transaction management. But it doesn't necessarily cover every need. One example of a gap is batch processing.]]></description>
			<content:encoded><![CDATA[<p>A lot of folks have used the <a href="http://www.springsource.org/" target="_blank">Spring framework</a> to build applications &#8211; and what&#8217;s not to love? It&#8217;s allowed us to solve enterprise problems with a minimum of tedium. And the framework has evolved to address criticisms, for example the continued reduction in need for lengthy XML configuration in application contexts in favor of ever more terse syntax and support for code annotations.</p>
<p>The framework as-packaged includes facilities to help with many common aspects of contemporary application development, from a Model-View-Controller (MVC) framework to  integration with persistence managers and elegant transaction management. But it doesn&#8217;t necessarily cover every need. One example of a gap is batch processing.</p>
<p>The idea behind batch processing is to allow a program to run without the need for human intervention &#8211; this may involve solving a problem that takes a lengthy amount of time, processing a large input set, or just automating some business process that doesn&#8217;t necessarily need to be triggered by a human. The batch paradigm was far more dominant in years past than it is in contemporary business computing, but that doesn&#8217;t mean valid batch use cases don&#8217;t continue to crop up. The operating system you&#8217;re using right now likely uses a batch approach to do all sorts of things for you without bugging you about it. Enjoying those automatic backups?</p>
<p>So what if you&#8217;ve got a problem that calls for a batch style solution but you&#8217;d still like to use Spring? On a recent project, we realized that much of the business logic we&#8217;d just finished writing within a web service framed with Spring could be reused for an upcoming batch component (which involved processing a potentially very large XML document that would be uploaded by a business partner). We briefly considered rolling a separate application that reused some of the same code, but before we went down that road someone mentioned hearing of &#8220;Spring Batch&#8221; &#8211; something that was not a part of Spring proper, but an auxiliary framework meant to complement it.</p>
<p>As you can read on its <a href="http://static.springsource.org/spring-batch/" target="_blank">home page</a>,</p>
<blockquote><p>Spring Batch builds upon the productivity, POJO-based development  approach, and general ease of use capabilities people have come to know  from the Spring Framework, while making it easy for developers to access  and leverage more advanced enterprise services when necessary.</p></blockquote>
<p>Sounds great! So I dove in and started learning more about it. As I read the documentation, however, I have to admit I got a little overwhelmed by the complexity and amount of configuration needed for even a simple example. Unlike your average Spring application context, the context of a Spring  Batch application grows pretty quick and involves configuring a lot of  stuff that, at the outset, it just doesn&#8217;t seem like you should need to  configure. A &#8220;job repository&#8221; to track the status and history of job  executions, which itself <em>requires</em> a data source &#8211; just to get started? Wow, that&#8217;s a bit heavy handed. Worried that I might be misunderstanding what I&#8217;d found, I did some searching and found that <a href="http://www.cforcoding.com/2009/07/spring-batch-or-how-not-to-design-api.html" target="_blank">I wasn&#8217;t alone in thinking the API left something to be desired</a>.</p>
<p>But I&#8217;m not going to get as down on Spring Batch as the author of the article I just linked to. The reason being &#8211; once I determined what we <em>had </em>to configure in order to get a functional batch job running, I discussed the components involved with my team members and our client and we realized we would appreciate having all of those things. Logged history of batch runs in a database would be good, especially if there were ever a problem or failure. Then our client asked &#8211; will we have a UI to control it if we need to?</p>
<p>Enter <a href="http://static.springsource.org/spring-batch-admin/" target="_blank">Spring Batch Admin</a>. It&#8217;s unfortunate that the Admin capability is distributed separately from Spring Batch itself &#8211; because unless you hear about it or search with the right query, you might wind up rolling your own administrative UI unnecessarily. Of course you <em>can</em> write your own if you&#8217;d like &#8211; especially if you need to fit in with some pre-existing administrative app you may already have in place &#8211; but chances are you have better things to do and batch processing is just one portion of your project.</p>
<p>I&#8217;ve got a very important time-saving tip if you think you&#8217;d like to use the Admin UI, though: <em>decide if you need it first before starting to develop your batch capability</em>. I made the mistake of thinking it would be easier to get our batch capability working headlessly first, then bolt the Admin app onto the project, in an attempt to reduce complexity and break things down. Instead I wound up having to redo some of the POJOs and configuration involved in kicking off jobs to make what I&#8217;d done compatible with the Admin framework. In fact, starting with the Admin framework, and getting <em>it</em> up and running with its ability to run abstract jobs first, then customizing the jobs to meet your needs, would be the path of least resistance.</p>
<p>Once I had everything together, though, what a sweet capability this added up to! Using Spring Batch plus Spring Batch Admin gave my team a relatively low-overhead solution that allowed us to easily hand batch testing duties over to our client &#8211; all they had to know how to do was access a web page and click a button. Plus, we&#8217;ve given them a framework and a concrete example that is now easily repeatable &#8211; given a few POJOs and some copy/paste/modify of the application context XML, they could easily add new batch job types in the future.</p>
<p>That&#8217;s it for now &#8211; check back for a follow-up article in which I&#8217;ll dive into some example configurations and cover specific problems I encountered in my batch app and how I overcame them.</p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/01/23/spring-batch-imperfect-yet-worthwhile/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Usability Testing on Agile Projects (part 2)</title>
		<link>http://www.summa-tech.com/blog/2012/01/04/usability-testing-on-agile-projects-part-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=usability-testing-on-agile-projects-part-2</link>
		<comments>http://www.summa-tech.com/blog/2012/01/04/usability-testing-on-agile-projects-part-2/#comments</comments>
		<pubDate>Wed, 04 Jan 2012 13:48:10 +0000</pubDate>
		<dc:creator>Ben Northrop</dc:creator>
				<category><![CDATA[Agile and Development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[user interface]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=3903</guid>
		<description><![CDATA[In <a href="http://www.summa-tech.com/blog/2011/11/20/usability-testing-on-agile-projects-part-1/">part 1</a> of this series, I discussed the benefits of usability testing on enterprise software projects and outlined a general approach for integrating the practice of usability testing into a typical Scrum project (see diagram below).  In this post, I'll lay out a 3-step process for performing a usability test on an enterprise project, and highlight how it can can hook into the standard elements of Scrum (e.g. <a href="http://www.mountaingoatsoftware.com/scrum/release-burndown">burndown</a>, <a href="http://www.mountaingoatsoftware.com/scrum/product-backlog">backlog</a>, etc.).  Here we go...]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://www.summa-tech.com/blog/2011/11/20/usability-testing-on-agile-projects-part-1/">part 1</a> of this series, I discussed the benefits of usability testing on enterprise software projects and outlined a general approach for integrating the practice of usability testing into a typical Scrum project (see diagram below).  In this post, I&#8217;ll lay out a 3-step process for performing a <a href="http://en.wikipedia.org/wiki/Usability_testing">usability test</a> on an enterprise project, describe some recognized best practices, and highlight how it can can hook into the standard elements of Scrum (e.g. <a href="http://www.mountaingoatsoftware.com/scrum/release-burndown">burndown</a>, <a href="http://www.mountaingoatsoftware.com/scrum/product-backlog">backlog</a>, etc.).  Here we go&#8230;</p>
<p><br/></p>
<div align="center">
<a href="http://www.summa-tech.com/blog/2011/11/20/usability-testing-on-agile-projects-part-1/scrum_and_usability_testing/" rel="attachment wp-att-3874" target="_blank"><img src="http://www.summa-tech.com/blog/wp-content/uploads/2011/11/scrum_and_usability_testing-300x223.gif" alt="scrum_and_usability_testing" title="scrum_and_usability_testing" width="300" height="223" class="aligncenter size-medium wp-image-3874" /></a><br />
(<a href=http://www.summa-tech.com/blog/wp-content/uploads/2011/11/scrum_and_usability_testing.gif" rel="attachment wp-att-3874" target="_blank">click</a> to expand)
</div>
<h3>Step 1: Plan for the Test</h3>
<p>Preparation is the trickiest part of usability testing. If good users are not found, relevant tasks not defined, or environments not set-up, the results of the test will be specious at best, or non-existent at worst! It is crucial, therefore, to develop the right foundation for test: </p>
<p><b>Find the Users:</b> For the typical B2C web site, representative users can be found at any street corner or coffee shop. For many enterprise projects, however, users are not so easily located or accessed. Because users of enterprise software may have specific domain knowledge, work in different departments, or reside in different geographic offices, procuring access to them or aligning schedules can be a significant challenge. If possible, it is important to surmount these obstacles &#8211; real users will give <a href="http://www.useit.com/alertbox/20030120.html">more accurate feedback</a>, and will be generally more receptive of the system when it is eventually rolled out, becoming advocates of it rather than opponents to it. </p>
<p>When it is not possible to find real users, representative users (e.g. mapping to defined <a href="http://www.agilemodeling.com/artifacts/personas.htm">personas</a>), or even non-representative users, can be substituted with some success; many usability issues can be uncovered by users with no domain experience, a fresh set of eyes the most salient requirement. </p>
<p>It is <a href="http://www.useit.com/alertbox/20000319.html">well documented</a> that usability testing requires no more than 4-6 users per round. Usability issues are typically universal and so are found early &#8211; there are diminishing returns for testing with any more than 6 users (i.e. they all tell you about the same problems!). </p>
<p><br/></p>
<div align="center">
<a href="http://www.summa-tech.com/blog/2012/01/04/usability-testing-on-agile-projects-part-2/users/" rel="attachment wp-att-3904"><img src="http://www.summa-tech.com/blog/wp-content/uploads/2011/11/users-300x179.jpg" alt="users" title="users" width="300" height="179" class="aligncenter size-medium wp-image-3904" /></a></div>
<p><b>Plan the Tasks:</b> Not every feature of an application can or should be usability tested. As noted above, it is important, therefore, to identify for usability testing only those features which are prominent, complex, or have a high cost of user error. Once these features are identified, a script of user tasks can be created. Note that tasks should clear, concise, and worded in a way that is <a href="http://www.uie.com/articles/usability_testing_mistakes/">independent of the design</a> of the application (e.g. not &#8220;click &#8216;add item to cart&#8217; and click the &#8216;purchase&#8217; button&#8221; but rather &#8220;buy a widget&#8221;).  Lastly, it is important both to run through the script yourself, and also ask another team member to do the same, and ensure that the script takes no more than 15-30 minutes to execute (with the assumption that a user unfamiliar with the application could take 3x this long). </p>
<p><b>Write the Post-Test Questionnaire:</b> Depending on the application it may be useful to learn about not only the user&#8217;s performance (i.e. can they use the system) but also their preference (i.e. do they like it). Surprisingly, it has been found that the two <a href="http://www.usability.gov/methods/test_refine/learnusa/index.html">do not always correlate</a> &#8211; users may have problems using the application but say the like it, or use it fine but say they hate it. For this reason, it is important to supplement the observational data (i.e. notes from watching the user) with data from a post-test questionnaire. Note that demographic, qualitative, and quantitative data are important &#8211; so ask both open-ended questions like &#8220;how did you feel about XYZ?&#8221; and &#8220;on a scale of 1-5, was the system usable?&#8221;. Lastly, the late usability expert <a href="http://en.wikipedia.org/wiki/Randy_Pausch">Randy Pausch</a> advocated always asking at least one question after a usability test: &#8220;what were the two worst things about the system?&#8221;, guaranteeing that the user will be forced to shed light on at least two tangible usability flaws (and not try to avoid hurting your feelings). </p>
<p><b>Set up the Environment, Data, and Access:</b> Finally, a stable and perhaps isolated version of the system must be available for the test participants to use. In many cases this will be the normal QA environment, but depending on the frequency of builds or transiency of the data, this may or may not be adequate. If it is not, alternatives may be either to deploy the system on your local machine or to create a special, temporary environment specifically for usability testing. The feasibility of these options obviously depends on the complexity of the application and dependent sub-systems, serivces, or data stores &#8211; a simple single web-app to single database may be easy to configure and deploy, whereas a complex system that leverages LDAP, multiple databases, an ERP, and a handful of external web-services would not be. </p>
<p>Additionally, for some usability test scripts, it will be necessary to have each user test with a fresh, pre-configured, non-confidential set of data (for example, maybe a user is asked to find the user with an outstanding balance, and so such a user must exist). If this is the case, a set of SQL set-up and tear-down scripts may be necessary, or perhaps just a script for manually re-creating the data via the user interface. In any case, it is imperative to understand the data dependencies for the test up-front, to ensure that tests go smoothly, and users find issues related to usability and not bad data conditions. </p>
<p>Lastly, in many cases the test subject will log in as a pre-configured, sample user, however in some cases it will be helpful for the user to log in as himself and see &#8220;his&#8221; data during the test. In this case, it is important to ensure the user has appropriate access control for the QA environment &#8211; and it&#8217;s not until he tries to log in that you discover that he doesn&#8217;t have authorization. </p>
<h3>Step 2: Perform the Test</h3>
<p>If planning is done correctly, actually performing the usability test should be a snap &#8211; your job is simply to make the subject feel comfortable, stand back, and watch what they do! Here are a few things to keep in mind. </p>
<p><b>Introduce Yourself and the Test:</b> When meeting the user, it&#8217;s important to set a very informal, relaxed, and open atmosphere early, so that the user feels comfortable sharing how they feel about the system. To that end, be sure to mention the following simple points: </p>
<ul>
<li>It is the system that is being tested, not them.</li>
<li>The system has issues, but it&#8217;s difficult for developers to see them because we are too close to the problem. This is why their help is so important.</li>
<li>Negative feedback is actually more helpful than positive. No feelings will be hurt if they are frustrated or don&#8217;t like something.</li>
<li>Their help is greatly appreciated, and will contribute to a better product.</li>
<li>If they get stuck you can jump in and help, but otherwise you&#8217;ll stay quiet and let them drive.</li>
</ul>
<p>After introductions, give them the test script and have them briefly skim the tasks. Convey to them that although the tasks should only take 30-45 minutes, they should feel comfortable taking their time. </p>
<p><b>Observe, Ask Questions, but Don&#8217;t Help:</b> Once the user has begun, it&#8217;s important to let them use the system as they wish, even if it means them navigating down false paths (the whole point is to see how they would use it if you weren&#8217;t there!). As they complete the tasks, <a href="http://en.wikipedia.org/wiki/Think_aloud_protocol">encourage them to talk</a>, and be sure to ask probing, but non-revealing, questions, like &#8220;I saw that you clicked the &#8216;filter&#8217; button but were surprised with the result &#8211; what did you expect would happen there?&#8221;. If the user is hopelessly stuck, then it may be necessary to give them hints, but otherwise remain an observer.</p>
<p><b>Take Notes:</b> As the user completes the tasks, take copious notes of their actions, comments, and frustrations &#8211; these notes will trigger your memory later and fuel the <i>Usability Observations</i> list that you assemble. Many would <a href="http://www.boxesandarrows.com/view/recording_screen_activity_during_usability_testing">argue</a> that it is necessary to also video record usability test sessions, however, the benefit is rarely worth the cost in my opionion (even though it is relatively <a href="http://camstudio.org/">cheap</a>): project stakeholders seldom take the time to actually view a usability test video session, users may be apprehensive and less honest when being recorded, and the set-up and storage of the recordings can be frustrating and time-consuming.</p>
<h3>Step 3: Analyze the Results</h3>
<p>Once the tests have been completed, the data must be analyzed and then synthesized into a set of actionable recommendations. To do so, two artifacts can be created, an objective <i>Usability Observations List</i> and a subjective <i>Usability Analysis &#038; Recommendation</i> document.</p>
<p><b>Create a Usability Observations list:</b> Go back through your notes, and record discrete usability issues that users encountered in a simple spreadsheet. The list should be objectively and tactfully worded, stating, for example, that the user &#8220;did not know what the word &#8216;invoice&#8217; meant&#8221; and not &#8220;&#8216;invoices&#8217; should be called &#8216;bills&#8217;&#8221;. Consensus should be noted for each item (e.g. &#8220;3 out 6 users&#8221;), and each should be classified either as a &#8220;usability bug&#8221; (which would later be entered in an issue tracking system to be implemented during the current sprint) or as a &#8220;feature request&#8221; (which would be added to the product backlog, to be prioritized for a future sprint). </p>
<p><b>Create a Usability Analysis &#038; Recommendation document:</b> Finally, it will be helpful for project stakeholders to receive a high-level analysis of the usability test, summing up overall impression of the site&#8217;s usability (using both quantitative and qualitative data as useful), the areas of the system that were most and least usable, and a set of recommendations for future action (e.g. new features to the backlog, additional rounds of usability testing, etc.). This document may captured in a Wiki, stored in document control (e.g. SharePoint), or just sent via email. </p>
<p>That&#8217;s it!  Again, I&#8217;d like to hear your thoughts on usability testing on enterprise projects.  Please share!</p>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2012/01/04/usability-testing-on-agile-projects-part-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>“My Scrum Master is in a different time zone.  Can this ever work?” or 4 Tips To Making Agile Work With A Distributed Team</title>
		<link>http://www.summa-tech.com/blog/2011/12/19/%e2%80%9cmy-scrum-master-is-in-a-different-time-zone-can-this-ever-work%e2%80%9d-or-4-tips-to-making-agile-work-with-a-distributed-team/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e2%2580%259cmy-scrum-master-is-in-a-different-time-zone-can-this-ever-work%25e2%2580%259d-or-4-tips-to-making-agile-work-with-a-distributed-team</link>
		<comments>http://www.summa-tech.com/blog/2011/12/19/%e2%80%9cmy-scrum-master-is-in-a-different-time-zone-can-this-ever-work%e2%80%9d-or-4-tips-to-making-agile-work-with-a-distributed-team/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 18:53:50 +0000</pubDate>
		<dc:creator>Adrian Wright</dc:creator>
				<category><![CDATA[Agile and Development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[Rally]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://www.summa-tech.com/blog/?p=3826</guid>
		<description><![CDATA[Agile software development is about team code ownership, collaboration, and sharing ideas to <strong>get stuff done</strong>.  You want to ride the Agile wave, but half your team is in one city and the rest are in another.  How can you get your guys and gals to collaborate over the wire?  Recently I've been working on a project like this and I've found a few things that can make your team efficient, collaborative, and successful in an Agile environment.
]]></description>
			<content:encoded><![CDATA[<p>Agile software development is about team code ownership, collaboration, and sharing ideas to <strong>get stuff done</strong>.  You want to ride the Agile wave, but half your team is in one city and the rest are in another.  How can you get your guys and gals to collaborate over the wire?  Recently I&#8217;ve been working on a project like this and I&#8217;ve found a few things that can make your team efficient, collaborative, and successful in an Agile environment.</p>
<h2>Take Down Your Task Board</h2>
<p>If you really believe in eliminating waste, and your team is not co-located, the scrum board in your war room is nothing but waste.  The original purpose was for information to be accessible to the team.  You should be able to look at it and know immediately what your comrades are up to.  If you are co-located, you&#8217;d have to ask someone to <strong>go update the board for you</strong>.  That slows both of you down, which isn&#8217;t so lean.  This leads me to my next point.</p>
<h2>Invest in an online storyboard and make it your homepage</h2>
<p>There are a lot of good ones out there.  I prefer <a title="Rally" href="http://www.rallydev.com/">Rally</a> (shameless plug for <a title="our new partner" href="http://www.summa-tech.com/partners/">our new partner</a>).  It gives us all the basics &#8212; stories, defects, test cases, a burndown chart, as well as a lot of really helpful plugins.</p>
<p>I know what you&#8217;re thinking &#8212; this is starting to feel like the old project management style.  What&#8217;s to keep Rally from becoming the new rigid project plan?  Like any tool, it can be abused, but consider the benefits:</p>
<ul>
<li>One story board for everyone to see, even if they&#8217;re in your Maui office.</li>
<li>Team views that show you what your teammates are working on, so you can offer to help if someone is falling behind</li>
<li>Sprint burndown and velocities to help you plan for the future</li>
</ul>
<p>And heck, if you&#8217;re only happy with a story board on the wall, you could adapt <a title="what these guys are doing" href="http://www.targetprocess.com/blog/2011/07/visual-builds-board.html">what these guys are doing</a>.</p>
<h2>Invest in collaboration software</h2>
<p>So we&#8217;ve got iteration tracking covered; how do we collaborate?  We&#8217;ve all been there when the guy you need to look at your broken code is working from home or sits at the other office.  Checking in questionable code is never a good idea, and you may be using centralized source control so you can&#8217;t use the wonders of <a title="Git" href="http://git-scm.com/" target="_blank">Git</a> and <a title="Mercurial" href="http://mercurial.selenic.com/" target="_blank">Mercurial</a> to let your buddy pull in your changes and show you where you you went wrong with your NHibernate cascade.</p>
<p>Every distributed team needs, at a minimum:</p>
<ul>
<li>Screen sharing software &#8212; <a title="Webex" href="http://www.webex.com">Webex</a>, <a title="Join.Me" href="https://join.me/">Join.Me</a>, <a title="Skype" href="http://www.skype.com">Skype</a>, take your pick.  You need to be able to share your screen so you can see what&#8217;s going on.  Encourage pair programming over the wire to get people comfortable with the tool and getting to know each other&#8217;s style.</li>
<li>Chat software (no investment there) &#8212; It&#8217;s quick, easy, simple, and most of all, quiet.  Nothing disturbs the development room more than a noisy phone conversation.</li>
<li>Reliable internet access &#8212; It seems obvious, make sure all your guys have a strong connection.  Nothing slows collaboration down more than a code review Webex that keeps flaking out.</li>
<li>Phone conferencing lines available to anyone, at the ready.  There are even some free ones out there &#8212; my team has used <a title="FreeConferenceCall" href="http://www.freeconferencecall.com">FreeConferenceCall</a> with a lot of success.</li>
</ul>
<h2>Stick to the Agile Basics</h2>
<p>If your team sticks to the <a title="agile basics" href="http://agilemanifesto.org">agile basics</a>, they are 90% of the way there to a strong development experience, even if they aren&#8217;t co-located.  A few things to remember:</p>
<ul>
<li>The team owns the code &#8212; collaborate and work together to find the best solution.</li>
<li>Communicate progress and blocks &#8212; no one benefits if you don&#8217;t ask for help when you&#8217;re stumped, when you don&#8217;t want to be pushy about a block, or when you hide progress for fear of being assigned more work.  Communicate more and you&#8217;ll do more.  Just don&#8217;t communicate so much that no one else gets anything done&#8230;  :)</li>
<li>Eliminate waste and ask questions about process &#8212; if you think something doesn&#8217;t have much benefit, speak up.  Maybe you&#8217;re right, or maybe you&#8217;ll learn something in the process.  Many of you are familiar with <a title="Seth Godin's TED Talk" href="http://www.ted.com/talks/seth_godin_this_is_broken_1.html">Seth Godin&#8217;s TED talk</a> on this subject.  If you aren&#8217;t, go watch it.  You&#8217;ll like it.</li>
</ul>
<p>&copy;2012 <a href="http://www.summa-tech.com/blog">Summa Blog</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.summa-tech.com/blog/2011/12/19/%e2%80%9cmy-scrum-master-is-in-a-different-time-zone-can-this-ever-work%e2%80%9d-or-4-tips-to-making-agile-work-with-a-distributed-team/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

