<?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/"
	>

<channel>
	<title>Actuance Consulting Blog</title>
	<atom:link href="http://blog.actuanceconsulting.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.actuanceconsulting.com</link>
	<description></description>
	<lastBuildDate>Mon, 05 Dec 2011 13:03:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Social Media in Business</title>
		<link>http://blog.actuanceconsulting.com/social-media-in-business/</link>
		<comments>http://blog.actuanceconsulting.com/social-media-in-business/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 16:24:38 +0000</pubDate>
		<dc:creator>John Patrick</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[social media]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.actuanceconsulting.com/?p=359</guid>
		<description><![CDATA[There&#8217;s an interesting guest post over on the Help Training Courses blog today on the Future of Social Media in Business. There are some useful insights there that certainly fit with my experiences of using social media to build good, positive business relationships rather than spamming people with endless broadcasts. The key part of the [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s an interesting guest post over on the Help Training Courses blog today on the <a href="http://news.helptrainingcourses.info/the-future-of-social-media-in-business/">Future of Social Media in Business</a>. There are some useful insights there that certainly fit with my experiences of using social media to build good, positive business relationships rather than spamming people with endless broadcasts. The key part of the message in my opinion is this:</p>
<blockquote><p>Remember the power of social media is not in broadcasting, it’s about relationship building.</p></blockquote>
<p>&#8230;which to me means <em>Don&#8217;t see Twitter as an advert on the radio, see it as a networking event</em>. If you do that, you start to realise not only how to use social media in your business but also who needs to be involved. The <em>who</em> as well as the <em>what</em> is one of the keys to a successful strategy.</p>
<div class="tw_button" style="clear:both;margin-bottom:4px;float:left;margin-right:4px;;float:left;margin-right:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.actuanceconsulting.com%2Fsocial-media-in-business%2F&amp;via=Actuance&amp;text=Social%20Media%20in%20Business&amp;related=Actuance&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Fblog.actuanceconsulting.com%2Fsocial-media-in-business%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://blog.actuanceconsulting.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.actuanceconsulting.com/social-media-in-business/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Refactoring is the new documentation</title>
		<link>http://blog.actuanceconsulting.com/refactoring-code-is-documenting/</link>
		<comments>http://blog.actuanceconsulting.com/refactoring-code-is-documenting/#comments</comments>
		<pubDate>Wed, 13 Apr 2011 20:52:26 +0000</pubDate>
		<dc:creator>John Patrick</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.actuanceconsulting.com/?p=330</guid>
		<description><![CDATA[Much has been written about the subject of refactoring code over the years including some very well known work by Martin Fowler. There are many resources on the &#8216;what&#8217; and &#8216;how&#8217; of refactoring out on the web so I don&#8217;t intend to go back over those aspects of the topic here other than to mention [...]]]></description>
			<content:encoded><![CDATA[<p>Much has been written about the subject of refactoring code over the years including some very well known work by <a href="http://www.refactoring.com/">Martin Fowler</a>. There are many resources on the &#8216;<em>what&#8217;</em> and <em>&#8216;how&#8217;</em> of refactoring out on the web so I don&#8217;t intend to go back over those aspects of the topic here other than to mention that if you&#8217;re new to the concept, refactoring is essentially <strong>improving the internal design of software without changing its external behaviour</strong>.</p>
<p>One thing that&#8217;s traditionally been difficult to explain or understand though, and remains that way, is the question of <em>&#8216;why to refactor&#8217;</em>. Putting work into something without changing what it does can seem like it&#8217;s going to be a big load of wasted effort. At best, it often looks like a speculative investment of time with intangible payback. Experience shows though that refactoring can pay big dividends, avoid wasted effort and create consistent direction, focus and efficiency on a project.</p>
<p>Martin Fowler writes that refactoring makes changing software easier in the future. That&#8217;s very true but to those new to the concept (or non-programmers) it can still be difficult to explain how that happens. It sounds a little bit &#8216;magic&#8217;.</p>
<p>For me it simply comes down to this though. <em><strong>Writing code isn&#8217;t only about solving a problem. It&#8217;s also about describing the solution. </strong></em>Really great code not only functions well but explains to other programmers what the problem was that caused the code to be written and how it was solved. That&#8217;s where the ease of change comes in. In contrast, if code is incomprehensible, often the reasons behind it aren&#8217;t fully understood when changes are needed. That tends to encourage either starting again (wasted effort), large amounts of careful tracing through the code, or unintentional breaking of parts of the system when changes are made without fully understanding their impact.</p>
<p>Of course, you can write comments and supplementary documentation around code and they both have their place. Documentation can easily get out of step with code without extreme care though and it&#8217;s difficult to test completeness or accuracy of the written word. Well written code doesn&#8217;t have that problem. The documentation can&#8217;t get out of step with the implementation because the implementation <em>is</em> the documentation.</p>
<p>Of course, pragmatism and business forces do count in the real world and sometimes refactoring isn&#8217;t justified, for instance on a soon to retire system. Often though, taking working code and making changes which help to teach the current and future teams about the nature of the problem it solves is well worth the effort. And just like other forms of documentation, refactoring is worth doing before the original learning and knowledge gained by the very process of creating the solution is lost and has to be re-learnt all over again. Used wisely, refactoring&#8217;s a valuable investment in team knowledge and ongoing clarity of thinking.</p>
<div class="tw_button" style="clear:both;margin-bottom:4px;float:left;margin-right:4px;;float:left;margin-right:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.actuanceconsulting.com%2Frefactoring-code-is-documenting%2F&amp;via=Actuance&amp;text=Refactoring%20is%20the%20new%20documentation&amp;related=Actuance&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Fblog.actuanceconsulting.com%2Frefactoring-code-is-documenting%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://blog.actuanceconsulting.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.actuanceconsulting.com/refactoring-code-is-documenting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook like button changes</title>
		<link>http://blog.actuanceconsulting.com/facebook-like-button-changes/</link>
		<comments>http://blog.actuanceconsulting.com/facebook-like-button-changes/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 16:38:33 +0000</pubDate>
		<dc:creator>John Patrick</dc:creator>
				<category><![CDATA[web development]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[social media]]></category>

		<guid isPermaLink="false">http://blog.actuanceconsulting.com/?p=321</guid>
		<description><![CDATA[Facebook has changed the way it&#8217;s like button for third party websites works over the weekend to post a full feed story rather than just a simple &#8216;Recent Activity&#8217; one-liner. I&#8217;ve been testing that out via implementations on a couple of sites I&#8217;ve been working on and from a site owner&#8217;s perspective, this change seems [...]]]></description>
			<content:encoded><![CDATA[<p>Facebook has changed the way it&#8217;s like button for third party websites works over the weekend to post a full feed story rather than just a simple &#8216;Recent Activity&#8217; one-liner. I&#8217;ve been testing that out via implementations on a couple of sites I&#8217;ve been working on and from a site owner&#8217;s perspective, this change seems a positive move. &#8216;Likes&#8217; are now much more prominent in a user&#8217;s feed and seem better at attracting further follow-up likes from friends. From a facebook user&#8217;s point of view, I see this as an improvement too. If I&#8217;m clicking &#8216;like&#8217; on something I&#8217;m wanting to share it with my friends and a full story in my feed seems a better way to do it.</p>
<p>Since the new like button functionality automatically tries to include an image, I found it particularly useful when used in conjunction with the og:image metadata from facebook&#8217;s open graph protocol. Using og:image allows you to specify a thumbnail to include in the story and avoids the situation where a random and sometimes inappropriate image is chosen for you.</p>
<p>Implementing both the like button and the open graph metadata are straightforward jobs and there&#8217;s a simple guide in the <a href="http://developers.facebook.com/docs/reference/plugins/like/">Facebook Like Button documentation</a>.</p>
<div class="tw_button" style="clear:both;margin-bottom:4px;float:left;margin-right:4px;;float:left;margin-right:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.actuanceconsulting.com%2Ffacebook-like-button-changes%2F&amp;via=Actuance&amp;text=Facebook%20like%20button%20changes&amp;related=Actuance&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Fblog.actuanceconsulting.com%2Ffacebook-like-button-changes%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://blog.actuanceconsulting.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.actuanceconsulting.com/facebook-like-button-changes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Secret Joys of Hiding Complexity</title>
		<link>http://blog.actuanceconsulting.com/hiding-complexity/</link>
		<comments>http://blog.actuanceconsulting.com/hiding-complexity/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 18:58:59 +0000</pubDate>
		<dc:creator>John Patrick</dc:creator>
				<category><![CDATA[web development]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[training]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://blog.actuanceconsulting.com/?p=302</guid>
		<description><![CDATA[I reckon some of the best times working as a software designer and programmer are when you manage to make something really quite hideously complex look absolutely trivial to the end user. In this case, some fairly hairy fuzzy-searching, de-duplicating and difference-spotting code for the Help Training Courses Magical Auto Search, running behind a user [...]]]></description>
			<content:encoded><![CDATA[<p>I reckon some of the best times working as a software designer and programmer are when you manage to make something really quite hideously complex look absolutely trivial to the end user. In this case, some fairly hairy fuzzy-searching, de-duplicating and difference-spotting code for the <a href="http://www.helptrainingcourses.com/auto-search-info">Help Training Courses Magical Auto Search</a>, running behind a user interface that amounts to entering your email address&#8230;</p>
<p><iframe title="YouTube video player" class="youtube-player" type="text/html" width="640" height="390" src="http://www.youtube.com/embed/dYtOUct1MY0" frameborder="0" allowFullScreen></iframe></p>
<div class="tw_button" style="clear:both;margin-bottom:4px;float:left;margin-right:4px;;float:left;margin-right:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.actuanceconsulting.com%2Fhiding-complexity%2F&amp;via=Actuance&amp;text=The%20Secret%20Joys%20of%20Hiding%20Complexity&amp;related=Actuance&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Fblog.actuanceconsulting.com%2Fhiding-complexity%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://blog.actuanceconsulting.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.actuanceconsulting.com/hiding-complexity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cross Platform Software as a Selling Point</title>
		<link>http://blog.actuanceconsulting.com/cross-platform-software-as-a-selling-point/</link>
		<comments>http://blog.actuanceconsulting.com/cross-platform-software-as-a-selling-point/#comments</comments>
		<pubDate>Mon, 24 Jan 2011 23:10:53 +0000</pubDate>
		<dc:creator>John Patrick</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[cross-platform]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.actuanceconsulting.com/?p=291</guid>
		<description><![CDATA[A recent TV ad for Amazon&#8217;s Kindle was a bit of a ground breaker as far as I&#8217;m concerned in that it actively pushed the cross platform nature of the company&#8217;s software as a mainstream selling point. While those of us in the techy community have long seen the benefits of software that doesn&#8217;t just [...]]]></description>
			<content:encoded><![CDATA[<p>A recent TV ad for Amazon&#8217;s Kindle was a bit of a ground breaker as far as I&#8217;m concerned in that it actively pushed the cross platform nature of the company&#8217;s software as a mainstream selling point. While those of us in the techy community have long seen the benefits of software that doesn&#8217;t just run on one OS, I don&#8217;t think I&#8217;ve seen that used in a TV marketing campaign in this way before. Of course, in this case there&#8217;s still the catch that you&#8217;re tied to one organisation&#8217;s DRM but Amazon aren&#8217;t alone at the moment in recognising that there&#8217;s a growing demand for software that isn&#8217;t limited to just one Operating System. I&#8217;m guessing that&#8217;s particularly true in the mobile market but it&#8217;s becoming more significant for desktop software too.</p>
<p>Looking round the office I&#8217;m in at the moment, there are:</p>
<ul>
<li>2 x Apple Macs running Mac OSX 10.6</li>
<li>2 x Windows 7</li>
<li>1 x Windows XP</li>
<li>2 x Ubuntu Linux</li>
<li>2 x Blackberries</li>
<li>2 x Android phones</li>
<li>1 x iPhone</li>
</ul>
<p>That diversity would have been really unusual, even 5 years ago but it&#8217;s getting more and more common. I think that&#8217;s a good thing for end users.</p>
<p>I regularly get asked if one OS is better than another and while I&#8217;m happy to advise and don&#8217;t tend to sit on the fence, the only honest answer I can give is that they all have different strengths and weakness. Knowing what those are and making an informed choice can sometimes bring big productivity benefits. It&#8217;s about gaining awareness of options available and using the best tool for the job and I think more an more people are become aware of those choices.</p>
<p>Of course to make that choice, we need to be not tied to just one operating system in the first place and that&#8217;s where cross platform software really helps. As a simple example, I recently helped a couple of users who&#8217;d decided to move to Macs (one from Windows Vista and one from a Linux desktop) and wanted to move their mail. Fortunately, both were using a cross-platform email client (in this case Mozilla Thunderbird) and a quick copy of a few files meant they were set up in seconds, with mail settings, passwords, email and inbox totally in tact as if nothing had changed.</p>
<p>I do understand though why some folks think that restricting choice makes the world a simpler place and that&#8217;s true to an extent, just as only allowing one brand of beer to be sold would make choices simpler on a night out or only building one type of car might make third party spare parts cheaper. But the reality is, different products suit different people and situations. In the software world, cross platform applications have a big part to play in supporting that choice and the productivity benefits that can follow. At the moment I increasingly bump into situations that suggest to me that everyday technology users are realising those benefits and factoring them into their decisions.</p>
<p><iframe title="YouTube video player" class="youtube-player" type="text/html" width="640" height="390" src="http://www.youtube.com/embed/L2x6046zzJ8" frameborder="0" allowFullScreen></iframe></p>
<div class="tw_button" style="clear:both;margin-bottom:4px;float:left;margin-right:4px;;float:left;margin-right:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.actuanceconsulting.com%2Fcross-platform-software-as-a-selling-point%2F&amp;via=Actuance&amp;text=Cross%20Platform%20Software%20as%20a%20Selling%20Point&amp;related=Actuance&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Fblog.actuanceconsulting.com%2Fcross-platform-software-as-a-selling-point%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://blog.actuanceconsulting.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.actuanceconsulting.com/cross-platform-software-as-a-selling-point/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Training Course Early Booking Discounts</title>
		<link>http://blog.actuanceconsulting.com/training-course-early-booking-discounts/</link>
		<comments>http://blog.actuanceconsulting.com/training-course-early-booking-discounts/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 14:57:53 +0000</pubDate>
		<dc:creator>John Patrick</dc:creator>
				<category><![CDATA[news]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[training]]></category>

		<guid isPermaLink="false">http://blog.actuanceconsulting.com/?p=268</guid>
		<description><![CDATA[I&#8217;m working with Help Training Courses again at the moment on the next phase of the web site. We have some interesting new features lined up to make it even easier to find the right training at the right price.
Included in the first batch of these changes is a new facility to allow training providers [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m working with Help Training Courses again at the moment on the next phase of the web site. We have some interesting new features lined up to make it even easier to find the right training at the right price.</p>
<p>Included in the first batch of these changes is a new facility to allow training providers to add early booking discounts in addition to the current <a href="http://www.helptrainingcourses.com">last minute training deals</a>. The last minute discounts option has been very popular, with some great deals appearing on courses such as ITIL, Access, Adobe Photoshop and <a href="http://www.helptrainingcourses.com/topic/prince2">Prince2</a>. Feedback so far suggests the new early booking discount feature will be just as popular and creates even more opportunities for training providers to fill courses and for students to find a bargain.</p>
<div class="tw_button" style="clear:both;margin-bottom:4px;float:left;margin-right:4px;;float:left;margin-right:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.actuanceconsulting.com%2Ftraining-course-early-booking-discounts%2F&amp;via=Actuance&amp;text=Training%20Course%20Early%20Booking%20Discounts&amp;related=Actuance&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Fblog.actuanceconsulting.com%2Ftraining-course-early-booking-discounts%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://blog.actuanceconsulting.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.actuanceconsulting.com/training-course-early-booking-discounts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu 10.10 desktop &#8211; first impressions</title>
		<link>http://blog.actuanceconsulting.com/ubuntu-10-10-desktop-first-impressions/</link>
		<comments>http://blog.actuanceconsulting.com/ubuntu-10-10-desktop-first-impressions/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 19:57:26 +0000</pubDate>
		<dc:creator>John Patrick</dc:creator>
				<category><![CDATA[news]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.actuanceconsulting.com/?p=236</guid>
		<description><![CDATA[I upgraded my main development desktop to Ubuntu 10.10 a few days ago and my first impressions are of a solid, fast and generally pleasant to use release which I&#8217;d highly recommend a look at if you haven&#8217;t already. I value a productive and quick work machine and have been using Linux as my preferred [...]]]></description>
			<content:encoded><![CDATA[<p>I upgraded my main development desktop to Ubuntu 10.10 a few days ago and my first impressions are of a solid, fast and generally pleasant to use release which I&#8217;d highly recommend a look at if you haven&#8217;t already. I value a productive and quick work machine and have been using Linux as my preferred development environment for three years or so now for its rock-solid reliability and responsiveness.</p>
<div id="attachment_237" class="wp-caption alignleft" style="width: 610px"><img class="size-full wp-image-237" title="Ubuntu 10.10 Desktop" src="http://blog.actuanceconsulting.com/wp-content/uploads/2010/10/ubuntu-10-10-maverick-meerkat.png" alt="ubuntu 10.10 desktop" width="600" height="375" /><p class="wp-caption-text">Ubuntu 10.10 in operation with the cairo dock</p></div>
<p>Ubuntu has long been one of the easier Linux distributions for the desktop user to get up and running with and the Ubuntu team really have made the setup process as easy as possible. Once you&#8217;re up and running, the debian package management for installing additional software is excellent too and the out of the box look and feel is clean and intuitive. </p>
<p>If you&#8217;re interested in giving this latest Ubuntu release a try yourself, take a look at the <a href="http://www.ubuntu.com">Ubuntu web site</a>.</p>
<div class="tw_button" style="clear:both;margin-bottom:4px;float:left;margin-right:4px;;float:left;margin-right:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.actuanceconsulting.com%2Fubuntu-10-10-desktop-first-impressions%2F&amp;via=Actuance&amp;text=Ubuntu%2010.10%20desktop%20-%20first%20impressions&amp;related=Actuance&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Fblog.actuanceconsulting.com%2Fubuntu-10-10-desktop-first-impressions%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://blog.actuanceconsulting.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.actuanceconsulting.com/ubuntu-10-10-desktop-first-impressions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More Bums on Seats</title>
		<link>http://blog.actuanceconsulting.com/more-bums-on-seats/</link>
		<comments>http://blog.actuanceconsulting.com/more-bums-on-seats/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 16:57:45 +0000</pubDate>
		<dc:creator>John Patrick</dc:creator>
				<category><![CDATA[news]]></category>
		<category><![CDATA[projects]]></category>

		<guid isPermaLink="false">http://blog.actuanceconsulting.com/?p=203</guid>
		<description><![CDATA[Actuance&#8217;s collaboration on Help Training Courses gets a mention in the &#8216;If we can you can&#8217; newsletter this month. You can read the full article here&#8230; &#8216;Shildon-based entrepreneurs put bums on seats&#8217;.
]]></description>
			<content:encoded><![CDATA[<p>Actuance&#8217;s collaboration on <a href="http://www.helptrainingcourses.com">Help Training Courses</a> gets a mention in the &#8216;If we can you can&#8217; newsletter this month. You can read the full article here&#8230; <a href="http://ifwecanyoucan.blogspot.com/2010/06/shildon-based-entrepreneurs-put-bums-on.html">&#8216;Shildon-based entrepreneurs put bums on seats&#8217;</a>.</p>
<div class="tw_button" style="clear:both;margin-bottom:4px;float:left;margin-right:4px;;float:left;margin-right:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.actuanceconsulting.com%2Fmore-bums-on-seats%2F&amp;via=Actuance&amp;text=More%20Bums%20on%20Seats&amp;related=Actuance&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Fblog.actuanceconsulting.com%2Fmore-bums-on-seats%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://blog.actuanceconsulting.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.actuanceconsulting.com/more-bums-on-seats/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A simple servlet filter for Java performance logging</title>
		<link>http://blog.actuanceconsulting.com/servlet-filter-java-performance-logging/</link>
		<comments>http://blog.actuanceconsulting.com/servlet-filter-java-performance-logging/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 07:19:45 +0000</pubDate>
		<dc:creator>John Patrick</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[log4j]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[servlet]]></category>

		<guid isPermaLink="false">http://blog.actuanceconsulting.com/?p=120</guid>
		<description><![CDATA[There are plenty of fancy tools for performance testing Java web applications but in addition to thorough load and volume testing before an application goes live, sometimes it&#8217;s useful just to leave simple perfomance monitoring running full time in a production environment. Monitoring the time the server takes to execute requests on your site can [...]]]></description>
			<content:encoded><![CDATA[<p>There are plenty of fancy tools for performance testing Java web applications but in addition to thorough load and volume testing before an application goes live, sometimes it&#8217;s useful just to leave simple perfomance monitoring running full time in a production environment. Monitoring the time the server takes to execute requests on your site can help you spot trends that let you anticipate and deal with problems caused by load, volume, unanticipated usage patterns or simply a database in need of some tuning. A proactive approach to performance tuning can bring big wins in customer satisfaction too, allowing you to pre-empt and avoid issues and keep your site running smoothly for your users.</p>
<p>Fortunately Java Enterprise Edition provides an easy mechanism for intercepting every request on the way in and out of the application in the form of a Servlet filter and it&#8217;s really simple to use that to create a performance logger. The basic concept here is to capture the time as a request enters an application, then again as it leaves and log the difference between the two. We can do this in the servlet filter&#8217;s doFilter method as follows. I&#8217;m using a <a href="http://logging.apache.org/log4j/">log4j</a> logger to handle the  output but obviously any other logging mechanism would work just as  well if you prefer something else:</p>
<pre>
<pre>
<pre>    long startTime;
    long endTime;
    String path = ((HttpServletRequest) request).getServletPath();

    startTime = System.currentTimeMillis();
    chain.doFilter(request, response);
    endTime = System.currentTimeMillis();

    //Log the servlet path and time taken
    perfLogger.info(path + "," + (endTime - startTime) );</pre>
</pre>
</pre>
<p>To finish off the code, I&#8217;ve added a couple of configuration options for more flexibility. For starters, I prefer to have a little more control over which URLs get logged than the standard servlet url-pattern mechanism allows. For instance, I may want to only log requests containing the word &#8217;search&#8217; anywhere in the path. The standard servlet url-pattern mechanism doesn&#8217;t allow this so I&#8217;ve added a parameter &#8216;url-filter&#8217; to allow full regular expression matching. A second parameter &#8216;log-category&#8217; sets the log4j logging category to use. Wrapping this into a full example servlet filter we get:</p>
<pre>package com.actuanceconsulting.perflog;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

/**
 * A simple filter to log the time taken to execute a request. Logging is carried
 * out via log4j to give the flexibility to add other data (such as current time)
 * and format the log as required.
 * */

 /*
 * Copyright John Patrick, Actuance Consulting Limited 2010
 * http://www.actuanceconsulting.com
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * For a copy of the GNU Lesser General Public License,
 * see &lt;http://www.gnu.org/licenses/&gt;.
 */
public class PerformanceLogFilter implements Filter {

 /**
 * An optional regular expression to use as a filter for the servlet patch.
 * Gives more flexibility than the standard servlet url-filter.
 * All requests are logged if not specified.
 * */
 private static final String URL_FILTER_PARAM = "url-filter";

 /**
 * An optional log4j category to use. The fully qualified class name
 * of the filter will be used if not specified.
 */
 private static final String LOG_CATEGORY_PARAM = "log-category"; 

 private Logger perfLogger;
 private String urlFilter;

 public void init(FilterConfig config) throws ServletException {
    String logCategory = config.getInitParameter(LOG_CATEGORY_PARAM);
    if (logCategory == null) {
       this.getClass().getName();
    }
    perfLogger = Logger.getLogger(logCategory);
    urlFilter = config.getInitParameter(URL_FILTER_PARAM);
 }

 public void doFilter(ServletRequest request, ServletResponse response,
 FilterChain chain) throws IOException, ServletException {

    long startTime;
    long endTime;
    String path = ((HttpServletRequest) request).getServletPath();

    if (urlFilter == null || path.matches(urlFilter)) {
       startTime = System.currentTimeMillis();
       chain.doFilter(request, response);
       endTime = System.currentTimeMillis();

       //Log the servlet path and time taken
       perfLogger.info(path + "," + (endTime - startTime) );
    }
    else {
       chain.doFilter(request, response);            
    }
 }

 public void destroy() {
    //Nothing to see here        
 }

}</pre>
<p>To get the filter to run, we need to configure it in the web.xml file as follows:</p>
<pre>&lt;filter&gt;
  &lt;filter-name&gt;performance&lt;/filter-name&gt;
  &lt;filter-class&gt;com.actuanceconsulting.perflog.PerformanceLogFilter&lt;/filter-class&gt;
  &lt;init-param&gt;
    &lt;param-name&gt;url-filter&lt;/param-name&gt;
    &lt;param-value&gt;.*search.*&lt;/param-value&gt;
  &lt;/init-param&gt;
  &lt;init-param&gt;
    &lt;param-name&gt;log-category&lt;/param-name&gt;
    &lt;param-value&gt;perflog&lt;/param-value&gt;
  &lt;/init-param&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
  &lt;filter-name&gt;performance&lt;/filter-name&gt;
  &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;</pre>
<p>In this case I&#8217;ve set my regular expression for the &#8216;url-filter&#8217; parameter to only match paths containing &#8217;search&#8217;. For completeness, here&#8217;s the log4j config I used too&#8230;</p>
<pre>&lt;appender name="PerformanceFileAppender"&gt;
  &lt;param name="Threshold" value="DEBUG"/&gt;    
  &lt;param name="File" value="../logs/performance.log"/&gt;
  &lt;param name="Append" value="true"/&gt;
  &lt;layout&gt;
    &lt;param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss},%m%n"/&gt;
  &lt;/layout&gt;
&lt;/appender&gt;

&lt;category name="perflog"&gt;
  &lt;priority value="INFO"/&gt;        
  &lt;appender-ref ref="PerformanceFileAppender"/&gt;                
&lt;/category&gt;</pre>
<p>&#8230;and that produces output as shown below. The CSV format of this output allows for easy analysis of the results but obviously you can choose whatever format suits you best.</p>
<pre>2010-06-19 11:26:20,/search,81
2010-06-19 11:26:25,/advanced-search-input,66
2010-06-19 11:26:30,/advanced-search,62
2010-06-19 11:26:39,/search,56
2010-06-19 11:26:43,/search,38
2010-06-19 11:26:43,/search,39</pre>
<p>And that&#8217;s all there is to it. It&#8217;s a simple bit of code but it can really add value when run over a period of live operation. Being able to see historical performance and spot trends can be a powerful diagnostic tool.</p>
<div class="tw_button" style="clear:both;margin-bottom:4px;float:left;margin-right:4px;;float:left;margin-right:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.actuanceconsulting.com%2Fservlet-filter-java-performance-logging%2F&amp;via=Actuance&amp;text=A%20simple%20servlet%20filter%20for%20Java%20performance%20logging&amp;related=Actuance&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Fblog.actuanceconsulting.com%2Fservlet-filter-java-performance-logging%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://blog.actuanceconsulting.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.actuanceconsulting.com/servlet-filter-java-performance-logging/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Search that (nearly) passes the Turing test</title>
		<link>http://blog.actuanceconsulting.com/search-that-nearly-passes-the-turing-test/</link>
		<comments>http://blog.actuanceconsulting.com/search-that-nearly-passes-the-turing-test/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 22:59:32 +0000</pubDate>
		<dc:creator>John Patrick</dc:creator>
				<category><![CDATA[web development]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[turing]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://blog.actuanceconsulting.com/?p=125</guid>
		<description><![CDATA[After spending a fair bit of time over the past few months developing a search facility that was a bit more &#8216;human&#8217; in its responses than a simple text-based search would be, I was interested to stumble on this discussion on Applying Turing&#8217;s Ideas to Search by John Ferrara. In my case, by working in [...]]]></description>
			<content:encoded><![CDATA[<p>After spending a fair bit of time over the past few months developing a search facility that was a bit more &#8216;human&#8217; in its responses than a simple text-based search would be, I was interested to stumble on this discussion on <a href="http://www.boxesandarrows.com/view/applying-turings">Applying Turing&#8217;s Ideas to Search</a> by John Ferrara. In my case, by working in just one niche  (training courses), the problem of creating more intelligent responses that the article discusses became more realistic. Even relatively simple implementations of some of the ideas gave some pretty powerful and less frustrating advantages from a usability perspective.</p>
<p>As a simple example, a search containing the word &#8216;free&#8217; such as &#8216;free training&#8217; clearly means to us humans that we want to see a price of zero, so matching &#8216;free climbing&#8217; and ignoring £0 in the results clearly seems completely mental to the average user. The fix is pretty simple though. By enriching our search index with extra &#8216;implied&#8217; data (like including the word &#8216;free&#8217; when the price is zero) and choosing careful weightings for this data, the results quickly become far less &#8216;dumb&#8217; and even at times appear surprisingly human. Obviously not always 100% perfect, but definitely better.</p>
<p>Automating our understanding of phrases (rather than simply isolated words) fascinates me too. I did a search today on a stock photo library for &#8216;Mac keyboard and mouse&#8217;. The intent of that search is clear enough to us humans but the starkly Turing-failing response was <em>&#8220;By &#8216;Mac&#8217; do you mean Apple Macintosh or Waterproof Clothing; By &#8216;keyboard&#8217; do you mean computer input device, synthesizer or piano; By &#8216;mouse&#8217; do you mean rodent or computer mouse?&#8221;</em> Er, yes, I want a picture of a small rodent in a raincoat playing piano please.</p>
<p>That challenge for clarification is a reasonable enough question for a machine to ask but us humans know that when &#8216;keyboard and mouse&#8217; are mentioned together in the same phrase, we&#8217;re pretty certain it doesn&#8217;t mean a piano-playing rodent. An what&#8217;s more, when keyboard and mouse are mentioned together with &#8216;Mac&#8217;, we know we&#8217;re not going to be wearing the mac.</p>
<p>What really fascinates me about all this isn&#8217;t really the deep, deep theory of it all (I&#8217;m a pragmatist at heart), but simply that a recognition and awareness of the weaknesses of &#8216;pure&#8217; computer logic when we&#8217;re designing computer interfaces can quickly lead to huge steps forward in the usability of a system. By putting some thought into covering predictable and reasonable human expectations in a user interface, it&#8217;s relatively easy to avoid forcing your users to think like a computer, and even create a surprisingly positive experience.</p>
<p>From a personal perspective, what is often surprising when I start down this line of thinking, is that relatively little changes and increases in effort can bring big usability results. Even attempting (and inevitably failing) to make your user interface pass the Turing test still gives some real advantages to your users.</p>
<div class="tw_button" style="clear:both;margin-bottom:4px;float:left;margin-right:4px;;float:left;margin-right:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.actuanceconsulting.com%2Fsearch-that-nearly-passes-the-turing-test%2F&amp;via=Actuance&amp;text=Search%20that%20%28nearly%29%20passes%20the%20Turing%20test&amp;related=Actuance&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Fblog.actuanceconsulting.com%2Fsearch-that-nearly-passes-the-turing-test%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://blog.actuanceconsulting.com/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.actuanceconsulting.com/search-that-nearly-passes-the-turing-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

