<?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>Nick Carroll</title>
	<atom:link href="http://ca.rroll.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://ca.rroll.net</link>
	<description>Software journeyman</description>
	<lastBuildDate>Wed, 04 Apr 2012 12:35:31 +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>HTML5 for Managers</title>
		<link>http://ca.rroll.net/2012/03/31/html5-for-managers/</link>
		<comments>http://ca.rroll.net/2012/03/31/html5-for-managers/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 01:13:02 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://ca.rroll.net/?p=532</guid>
		<description><![CDATA[What is new in HTML5? HTML5 is a “living standard” that embraces the constantly changing and evolving nature of the web. HTML5 introduces a number of new elements for semantic structure, multimedia, graphics and APIs for connectivity, storage, and geolocation &#8230; <a href="http://ca.rroll.net/2012/03/31/html5-for-managers/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>What is new in HTML5?</strong><br />
HTML5 is a “<a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/">living standard</a>” that embraces the constantly changing and evolving nature of the web.  HTML5 introduces a number of new elements for semantic structure, multimedia, graphics and APIs for connectivity, storage, and geolocation that will enable the next generation of web applications.  It also removes presentational elements such as font, strike, big, and applet.  This further ensures a clear separation of concerns between the content for a site (HTML), the way it is presented (CSS), and how it interacts and behaves with the user (Javascript).</p>
<p><a href="http://www.amazon.com/gp/product/0321784421/ref=as_li_tf_il?ie=UTF8&#038;tag=nickcarr-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321784421"><img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&#038;Format=_SL160_&#038;ASIN=0321784421&#038;MarketPlace=US&#038;ID=AsinImage&#038;WS=1&#038;tag=nickcarr-20&#038;ServiceVersion=20070822" ></a><img src="http://www.assoc-amazon.com/e/ir?t=nickcarr-20&#038;l=as2&#038;o=1&#038;a=0321784421" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p><strong>Why is the media industry getting excited about HTML5?</strong><br />
HTML4 was first published in 1997 with the intent of providing a universally understood language for publishing information for global distribution.  HTML5 is the evolution web developers needed to build apps instead of documents.  HTML5 enables developers to break free of the limits they were used to when building web applications.  Developers now have ways to store information on the device for offline use, have access to media, and can create visuals within the browser using HTML5 technologies.  This opens up the potential for <a href="http://www.youtube.com/html5">video</a>, <a href="http://chrome.angrybirds.com/">games</a>, and <a href="http://ie.microsoft.com/testdrive/">rich web applications</a> running in the browser on multiple platforms and across many devices without plug-ins.</p>
<p><strong>Lessons learnt with HTML5 Video</strong><br />
In practice using HTML5 video exposes a number of challenges in dealing with an emerging technology.  There is fragmented support for video codecs between the main browser implementations.  You need to support at least two video codecs (<a href="http://www.w3schools.com/html5/html5_video.asp">H.264 and WebM or Ogg</a>) in order to play video across most HTML5 compatible browsers.  HTML5 video also doesn’t support adaptive bitrate streaming such as HTTP Live Streaming or Smooth Streaming, nor does it support DRM protection schemes for premium video content.  For these we will still need to rely on Flash.</p>
<p><strong>Moving forward with HTML5</strong><br />
HTML5 is still a <a href="http://ishtml5readyyet.com/">long way off</a> from achieving the W3C Recommendation status.  However, Google, Mozilla, Apple, Opera, and even Microsoft are rapidly providing implementations of the new standard.  Check out http://html5test.com/ to see what features your browser supports and how it scores out of a total of 475 points.  You may be surprised by how much or how little your browser supports of the new specification.  For example, the highest scoring browser is Google Chrome 17 (374 points), followed by Mozilla Firefox 11 (335 points), and Opera 11.60 (329 points).  Microsoft takes the wooden spoon award for having the lowest scores for IE 6 (25 points), IE 7 (26 points), and IE 8 (41 points).  The biggest challenge with developing HTML5 apps is providing support for legacy browsers and dealing with nuances between browsers and versions of browsers.  This should be expected as early adopters of an emerging web technology.</p>
]]></content:encoded>
			<wfw:commentRss>http://ca.rroll.net/2012/03/31/html5-for-managers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fast NTLM authentication proxy with tunneling</title>
		<link>http://ca.rroll.net/2011/09/01/fast-ntlm-authentication-proxy-with-tunneling/</link>
		<comments>http://ca.rroll.net/2011/09/01/fast-ntlm-authentication-proxy-with-tunneling/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 04:18:03 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Guides]]></category>

		<guid isPermaLink="false">http://ca.rroll.net/?p=378</guid>
		<description><![CDATA[If you are using Linux behind a corporate firewall that only supports Windows, and the Windows proxy authentication is causing you pain, then I suggest installing and using CNTLM. The problem I was experiencing behind my corporate firewall is that &#8230; <a href="http://ca.rroll.net/2011/09/01/fast-ntlm-authentication-proxy-with-tunneling/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If you are using Linux behind a corporate firewall that only supports Windows, and the Windows proxy authentication is causing you pain, then I suggest installing and using CNTLM.</p>
<p>The problem I was experiencing behind my corporate firewall is that I need to authenticate using the windows domain prepended to my username.  It seems that you are not able to have a backslash in your username when setting your http_proxy environment variable using the below format.</p>
<pre class="brush: bash; title: ; notranslate">

http://username:password@host:port/
</pre>
<p>In other words I was getting strange errors when using the following in my .bash_profile.</p>
<pre class="brush: bash; title: ; notranslate">
export http_proxy=http://domain\username:password@host.com/
</pre>
<p>You can&#8217;t escape the backslash, nor wrap everything in quotes etc.  The only solution I came across was to use an NTLM authentication proxy such as CNTLM, which is a fast NTLM authentication proxy written in C.  The Ubuntu package is described as follows.</p>
<blockquote><p>Cntlm is a fast and efficient NTLM proxy, with support for TCP/IP tunneling, authenticated connection caching, ACLs, proper daemon logging and behaviour and much more. It has up to ten times faster responses than similar NTLM proxies, while using by orders or magnitude less RAM and CPU. Manual page contains detailed information.</p></blockquote>
<p>It can be installed using the command, but you&#8217;ll need to do this when you are connected directly to the internet, and thus bypassing your corporate proxy!</p>
<pre class="brush: bash; title: ; notranslate">
sudo apt-get install cntlm
</pre>
<p>You will then need to configure CNTLM by modifying the config file at /etc/cntlm.conf.  You&#8217;ll need to specify your windows domain login credentials in the config file.</p>
<p>Once configured, restart CNTLM using the command:</p>
<pre class="brush: bash; title: ; notranslate">
sudo /etc/init.d/cntlm restart
</pre>
<p>Once CNTLM has been configured and restarted, you can then update your http_proxy settings to use http://localhost:3128, or whatever port number you used in the CNTLM config file.  By default CNTLM listens on port 3128.  Now you will be able to use apt-get, but this time behind your corporate proxy.</p>
]]></content:encoded>
			<wfw:commentRss>http://ca.rroll.net/2011/09/01/fast-ntlm-authentication-proxy-with-tunneling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Checkbox is now available in the App Store</title>
		<link>http://ca.rroll.net/2011/05/29/checkbox-is-now-available-in-the-app-store/</link>
		<comments>http://ca.rroll.net/2011/05/29/checkbox-is-now-available-in-the-app-store/#comments</comments>
		<pubDate>Sun, 29 May 2011 00:35:58 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[checkbox]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://ca.rroll.net/?p=365</guid>
		<description><![CDATA[Checkbox has been unleashed upon the masses and is now ready for sale in the App Store. Checkbox allows you to take a photo of your task list, add checkboxes to the photo, and track the tasks that you have &#8230; <a href="http://ca.rroll.net/2011/05/29/checkbox-is-now-available-in-the-app-store/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://itunes.apple.com/us/app/checkbox/id439573269?mt=8">Checkbox</a> has been unleashed upon the masses and is now ready for sale in the App Store.</p>
<p><a href="http://itunes.apple.com/us/app/checkbox/id508746628?ls=1&#038;mt=8" title="icon-appstore by ncarroll, on Flickr"><img src="http://farm6.static.flickr.com/5107/5769344005_6e40aa08ed_t.jpg" width="100" height="100" alt="icon-appstore"></a> <a href="http://itunes.apple.com/us/app/checkbox/id508746628?ls=1&#038;mt=8" title="Screenshot 2011.01.06 15.25.42 by ncarroll, on Flickr"><img src="http://farm6.static.flickr.com/5263/5769344231_20e13d08a2_t.jpg" width="67" height="100" alt="Screenshot 2011.01.06 15.25.42"></a> <a href="http://itunes.apple.com/us/app/checkbox/id508746628?ls=1&#038;mt=8" title="Screenshot 2011.01.06 15.26.48 by ncarroll, on Flickr"><img src="http://farm3.static.flickr.com/2063/5769344663_b78bfac8b0_t.jpg" width="67" height="100" alt="Screenshot 2011.01.06 15.26.48"></a> <a href="http://itunes.apple.com/us/app/checkbox/id508746628?ls=1&#038;mt=8" title="Screenshot 2011.01.06 15.28.51 by ncarroll, on Flickr"><img src="http://farm3.static.flickr.com/2045/5769345083_8439041508_t.jpg" width="67" height="100" alt="Screenshot 2011.01.06 15.28.51"></a></p>
<p>Checkbox allows you to take a photo of your task list, add checkboxes to the photo, and track the tasks that you have completed.</p>
<p>Use Checkbox to quickly capture your shopping list on your fridge, the meeting actions jotted on your notebook, or the menu of your favourite restaurant. Then turn the photo into a checklist by adding checkboxes to items in the photo that you want to track. Simply tap on the checkboxes to keep track of tasks that you have previously completed.</p>
<p><a href="/apps/checkbox/">Find out more about Checkbox</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ca.rroll.net/2011/05/29/checkbox-is-now-available-in-the-app-store/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Estimation Deck is now available in the App Store</title>
		<link>http://ca.rroll.net/2011/05/16/estimation-deck-is-now-available-in-the-app-store/</link>
		<comments>http://ca.rroll.net/2011/05/16/estimation-deck-is-now-available-in-the-app-store/#comments</comments>
		<pubDate>Mon, 16 May 2011 10:51:43 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[estimation deck]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://ca.rroll.net/?p=371</guid>
		<description><![CDATA[Estimation Deck is now back in the App Store. Estimation Deck saves you from carrying around a deck of cards for your next Agile estimation session. Estimation Deck provides a set of fibonacci numbers that can be used during an &#8230; <a href="http://ca.rroll.net/2011/05/16/estimation-deck-is-now-available-in-the-app-store/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://itunes.apple.com/us/app/estimation-deck/id442680172?mt=8">Estimation Deck</a> is now back in the App Store.  Estimation Deck saves you from carrying around a deck of cards for your next Agile estimation session.</p>
<p><a href="http://itunes.apple.com/us/app/estimation-deck/id442680172?mt=8" title="estimation-deck-512 by ncarroll, on Flickr"><img src="http://farm3.static.flickr.com/2297/5807599645_9d3f5eedbb_t.jpg" width="100" height="100" alt="estimation-deck-512"></a> <a href="http://itunes.apple.com/us/app/estimation-deck/id442680172?mt=8" title="IMG_0259 by ncarroll, on Flickr"><img src="http://farm3.static.flickr.com/2580/5807599723_8da73f5bb7_t.jpg" width="67" height="100" alt="IMG_0259"></a> <a href="http://itunes.apple.com/us/app/estimation-deck/id442680172?mt=8" title="IMG_0260 by ncarroll, on Flickr"><img src="http://farm4.static.flickr.com/3220/5808165714_de7270c536_t.jpg" width="67" height="100" alt="IMG_0260"></a> <a href="http://itunes.apple.com/us/app/estimation-deck/id442680172?mt=8" title="IMG_0263 by ncarroll, on Flickr"><img src="http://farm4.static.flickr.com/3203/5808166002_5129ae2b90_t.jpg" width="67" height="100" alt="IMG_0263"></a> <a href="http://itunes.apple.com/us/app/estimation-deck/id442680172?mt=8" title="IMG_0262 by ncarroll, on Flickr"><img src="http://farm6.static.flickr.com/5028/5807600015_487980a460_t.jpg" width="67" height="100" alt="IMG_0262"></a> <a href="http://itunes.apple.com/us/app/estimation-deck/id442680172?mt=8" title="IMG_0261 by ncarroll, on Flickr"><img src="http://farm3.static.flickr.com/2735/5808165824_5531cd7d0b_t.jpg" width="67" height="100" alt="IMG_0261"></a></p>
<p>Estimation Deck provides a set of fibonacci numbers that can be used during an Agile estimation session. This application allows the Agile professional to swipe through the deck of cards until the desired estimate is found for the proposed story. Tapping on the estimate card will flip the card to hide your estimate from your colleagues. Tapping the back of the card will flip the card again to reveal your estimate to the group.</p>
<p>Use the settings to switch between Fibonacci, t-shirt sizes, and powers of 2 decks.</p>
<p><a href="http://agilecognition.com/apps/estimation-deck/">Find out more about Estimation Deck</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ca.rroll.net/2011/05/16/estimation-deck-is-now-available-in-the-app-store/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Persisting managed objects with scalar attributes</title>
		<link>http://ca.rroll.net/2010/10/30/persisting-managed-objects-with-scalar-attributes/</link>
		<comments>http://ca.rroll.net/2010/10/30/persisting-managed-objects-with-scalar-attributes/#comments</comments>
		<pubDate>Sat, 30 Oct 2010 11:54:55 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Core Data]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://ca.rroll.net/?p=359</guid>
		<description><![CDATA[Core Data natively supports attributes that are of type NSString, NSNumber, or NSData. You can however use other types with a bit of extra work. If you have an attribute that is a scalar value such as BOOL, you can &#8230; <a href="http://ca.rroll.net/2010/10/30/persisting-managed-objects-with-scalar-attributes/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Core Data natively supports attributes that are of type NSString, NSNumber, or NSData.  You can however use other types with a bit of extra work.  If you have an attribute that is a scalar value such as BOOL, you can have your managed object persist it by first converting it to a NSNumber.  For example, CheckBox is a NSManagedObject with an attribute called checked that is of type BOOL.  BOOL in Objective-C can easily be converted to and from a NSNumber.</p>
<p>The header file contains the BOOL attribute for CheckBox.</p>
<pre class="brush: objc; title: ; notranslate">
// CheckBox.h
#import &lt;CoreData/CoreData.h&gt;

@interface CheckBox : NSManagedObject {
}
@property(nonatomic) BOOL checked;

@end
</pre>
<p>The implementation file contains a PrimitiveAccessors category for the underlying primitiveChecked value, which stores the checked value as a NSNumber.  We then override the accessors and mutators for the checked attribute to convert the BOOL value to and from a NSNumber.</p>
<pre class="brush: objc; title: ; notranslate">
// CheckBox.m
#import &quot;CheckBox.h&quot;

@interface CheckBox (PrimitiveAccessors)
@property (nonatomic, retain) NSNumber *primitiveChecked;
@end

@implementation CheckBox

- (BOOL)checked {
    [self willAccessValueForKey:@&quot;checked&quot;];
    BOOL isChecked = [[self primitiveChecked] boolValue];
    [self didAccessValueForKey:@&quot;checked&quot;];
    return isChecked;
}

- (void)setChecked:(BOOL)isChecked {
    [self willChangeValueForKey:@&quot;checked&quot;];
    [self setPrimitiveChecked:[NSNumber numberWithBool:isChecked]];
    [self didChangeValueForKey:@&quot;checked&quot;];
}

@end
</pre>
]]></content:encoded>
			<wfw:commentRss>http://ca.rroll.net/2010/10/30/persisting-managed-objects-with-scalar-attributes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gradle Android Plugin</title>
		<link>http://ca.rroll.net/2010/04/26/gradle-android-plugin/</link>
		<comments>http://ca.rroll.net/2010/04/26/gradle-android-plugin/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 07:30:41 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[gradle]]></category>
		<category><![CDATA[groovy]]></category>

		<guid isPermaLink="false">http://ca.rroll.net/?p=348</guid>
		<description><![CDATA[I have recently joined a newly formed team developing Android applications at a large telco, and I am pleased to announce that we are using Gradle for our builds. We are using Gradle with the Android plugin, and instantly we &#8230; <a href="http://ca.rroll.net/2010/04/26/gradle-android-plugin/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I have recently joined a newly formed team developing Android applications at a large telco, and I am pleased to announce that we are using <a href="http://www.gradle.org/">Gradle</a> for our builds.  We are using Gradle with the <a href="http://github.com/jvoegele/gradle-android-plugin">Android plugin</a>, and instantly we managed to build a simple application, run tests, and have it installed on a device.  Our build script simply looks like the following, which is all that is necessary to use the Android plugin.</p>
<pre class="brush: groovy; title: ; notranslate">
buildscript {
  repositories {
    mavenRepo(urls: 'http://jvoegele.com/maven2/')
  }
  dependencies {
    classpath 'com.jvoegele.gradle.plugins:android-plugin:0.8'
  }
}
usePlugin com.jvoegele.gradle.plugins.android.AndroidPlugin
</pre>
<p>Of course this is a rather simplistic script, but it does everything I need it to do right out of the box.  The Android plugin provides a number of tasks that allow you to build, test, package and sign your application.  You can even install the packaged application on a device or emulator by running <strong>gradle androidInstall</strong>.  Make sure to set the property &#8220;adb.device.arg&#8221; to &#8220;-e&#8221; for a running emulator or &#8220;-d&#8221; for a connected device.</p>
<p>There is also support in <a href="http://hudson-ci.org/">Hudson</a> to trigger a Gradle script.  Hudson has a Gradle plugin that can be installed from the Admin console, and allows you to directly trigger a Gradle script in your project.  Otherwise you can create a simple shell script to call the Gradle tool from the command line.</p>
<p>It is also worth noting that both IntelliJ and Eclipse provide support for Gradle and the Groovy syntax.  That is if you don&#8217;t like using the command line to trigger your builds.</p>
<p>Gradle has allowed us to spend less time setting up our build and continuous integration environment, and more time on actual Android development.  Our team has benefited greatly from this boost in productivity.</p>
]]></content:encoded>
			<wfw:commentRss>http://ca.rroll.net/2010/04/26/gradle-android-plugin/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Illuminate</title>
		<link>http://ca.rroll.net/2010/03/25/illuminate/</link>
		<comments>http://ca.rroll.net/2010/03/25/illuminate/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 05:41:13 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[illuminate]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://ca.rroll.net/?p=344</guid>
		<description><![CDATA[My latest iPhone app called Illuminate is now available at Apple&#8217;s App store: http://bit.ly/bByrgy. Illuminate is a free application that turns your iPhone&#8217;s screen into a light source. I generally use it when trying to read a menu at a &#8230; <a href="http://ca.rroll.net/2010/03/25/illuminate/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>My latest iPhone app called Illuminate is now available at Apple&#8217;s App store: http://bit.ly/bByrgy.</p>
<p>Illuminate is a free application that turns your iPhone&#8217;s screen into a light source.  I generally use it when trying to read a menu at a dimly lit restaurant.  Hopefully you will find it useful too!</p>
<p><a href="http://bit.ly/bByrgy" title="Illuminate"><img src="http://farm3.static.flickr.com/2801/4461959450_4dd35080ca_o.png" width="320" height="480" alt="Illuminate screenshot" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://ca.rroll.net/2010/03/25/illuminate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Putting spammers to work</title>
		<link>http://ca.rroll.net/2010/03/18/putting-spammers-to-work/</link>
		<comments>http://ca.rroll.net/2010/03/18/putting-spammers-to-work/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 04:29:06 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://ca.rroll.net/?p=342</guid>
		<description><![CDATA[I am just getting way too many spam comments on my blog lately. Akismet isn&#8217;t doing a good job of identifying these comments as spam as they generally appear to be genuine comments. Except that the author and website are &#8230; <a href="http://ca.rroll.net/2010/03/18/putting-spammers-to-work/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I am just getting way too many spam comments on my blog lately.  Akismet isn&#8217;t doing a good job of identifying these comments as spam as they generally appear to be genuine comments.  Except that the author and website are for a specific product or company looking to increase their Google Page Rank.  I don&#8217;t really want to disable the link to a legitimate author&#8217;s website or blog, so I have decided to make the spammers do some work.  I have installed the reCAPTCHA plugin which will make all comment authors type in a couple of words located on a reCAPTCHA image.  This not only limits spam, but <a href="http://googleblog.blogspot.com/2009/09/teaching-computers-to-read-google.html">Google</a> uses reCAPTCHA to help in their effort to digitise books.</p>
]]></content:encoded>
			<wfw:commentRss>http://ca.rroll.net/2010/03/18/putting-spammers-to-work/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>One click deployment with Maven and Bamboo</title>
		<link>http://ca.rroll.net/2010/02/26/one-click-deployment-with-maven-and-bamboo/</link>
		<comments>http://ca.rroll.net/2010/02/26/one-click-deployment-with-maven-and-bamboo/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 03:00:52 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://ca.rroll.net/?p=336</guid>
		<description><![CDATA[A while back I wrote about achieving continuous deployment with one-click deployments. I didn&#8217;t provide an example for that post as I mostly wrote about why you need to achieve continuous deployment. Here I will follow up with a simple &#8230; <a href="http://ca.rroll.net/2010/02/26/one-click-deployment-with-maven-and-bamboo/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A while back I wrote about <a href="http://ca.rroll.net/2009/06/16/achieving-continuous-deployment-with-one-click-deployments/">achieving continuous deployment with one-click deployments</a>.  I didn&#8217;t provide an example for that post as I mostly wrote about why you need to achieve continuous deployment.  Here I will follow up with a simple example of how you can achieve continuous deployment.</p>
<p>Continuous deployment is quite easy to setup if you are using a typical Maven project structure and Bamboo as your continuous integration tool.  Also I am assuming that you want to deploy your application to a tomcat server.</p>
<p>In your pom.xml file add the following configuration so that you use the Tomcat plugin for deploying your application to http://hostname.com/app.  Change the path, url, and server configurations to suit your needs.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;project&gt;
  &lt;build&gt;
    &lt;plugins&gt;
      &lt;plugin&gt;
        &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
        &lt;artifactId&gt;tomcat-maven-plugin&lt;/artifactId&gt;
        &lt;configuration&gt;
          &lt;path&gt;/app&lt;/path&gt;
          &lt;url&gt;http://hostname.com/manager&lt;/url&gt;
          &lt;server&gt;deployment.server&lt;/server&gt;
        &lt;/configuration&gt;
      &lt;/plugin&gt;
    &lt;/plugins&gt;
  &lt;/reporting&gt;
&lt;/project&gt;
</pre>
<p>Also make sure that your .m2/settings.xml file contains the following for authenticating with the Tomcat manager.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;settings xmlns=&quot;http://maven.apache.org/SETTINGS/1.0.0&quot;
  xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://maven.apache.org/SETTINGS/1.0.0

http://maven.apache.org/xsd/settings-1.0.0.xsd&quot;&gt;

  &lt;servers&gt;
    &lt;server&gt;
      &lt;id&gt;deployment.server&lt;/id&gt;
      &lt;username&gt;tomcat&lt;/username&gt;
      &lt;password&gt;password&lt;/password&gt;
    &lt;/server&gt;
  &lt;/servers&gt;
&lt;/settings&gt;
</pre>
<p>In Bamboo create a new pan for your project.  I tend to give this plan the name &#8220;Promote to Production&#8221;.  Configure the Builder goal for Maven to run <strong>clean tomcat:redeploy</strong>.  I also only allow a specific user to trigger this plan so that not everyone has permission to deploy into production.  Finally, configure the build strategy to run manually, so an authorised person can click on the Build plan button in Bamboo to deploy the application.</p>
<p>Once set up the above instructions will allow an authorised person in Bamboo to click on a single button to deploy into production.  Leveraging your continuous integration tool for deployment allows you to archive deployment artifacts such as your WAR files in the case where you have to revert to a previous version.</p>
]]></content:encoded>
			<wfw:commentRss>http://ca.rroll.net/2010/02/26/one-click-deployment-with-maven-and-bamboo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deploying Maven modules</title>
		<link>http://ca.rroll.net/2010/02/26/deploying-maven-modules/</link>
		<comments>http://ca.rroll.net/2010/02/26/deploying-maven-modules/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 02:36:46 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://ca.rroll.net/?p=333</guid>
		<description><![CDATA[My most recent consulting gig brought me back into contact again with Maven. I have this love-hate relationship with Maven. I love using Maven for simple projects, that generally have only a development environment, and I hate using Maven for &#8230; <a href="http://ca.rroll.net/2010/02/26/deploying-maven-modules/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>My most recent consulting gig brought me back into contact again with Maven.  I have this love-hate relationship with Maven.  I love using Maven for simple projects, that generally have only a development environment, and I hate using Maven for more complex projects where you have to create profiles for multiple testing environments.  Maven is just too restrictive for the latter case.</p>
<p>If you have your own internal Maven repository setup and you want to deploy reusable modules to it then follow these instructions.  It took me a while to figure them out as there is something wrong with Wagon&#8217;s internal ssh implementation.  Using an external scp tool will save you a lot of grief.</p>
<p>1.  Setup your local .m2/settings.xml as follows:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;settings xmlns=&quot;http://maven.apache.org/SETTINGS/1.0.0&quot;
  xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://maven.apache.org/SETTINGS/1.0.0

http://maven.apache.org/xsd/settings-1.0.0.xsd&quot;&gt;

  &lt;servers&gt;
    &lt;server&gt;
      &lt;id&gt;internal.maven.repos&lt;/id&gt;
      &lt;username&gt;maven&lt;/username&gt;
      &lt;privateKey&gt;location of your ssh private key&lt;/privateKey&gt;
  &lt;/server&gt;
  &lt;/servers&gt;
&lt;/settings&gt;
</pre>
<p>You&#8217;ll need to <a href="http://ca.rroll.net/2006/09/23/sftp-strongspace-without-password/">create an ssh key</a>.  And provide a reference to your private key using the
<privateKey> element.  This is simple to do in OS X, or linux, and can be done by running ssh-keygen.  If you use Windoze then you&#8217;ll have to use Putty.</p>
<p>2. Log into your server hosting your maven repository and add the contents of your public key (id_rsa.pub) at the bottom of the authorized_keys2 file.  You should create a generic maven user that everyone on your team can log into, this is because when you deploy your module it will be written to the filesystem with read/write permissions only for that user.  Exit your server.</p>
<p>3. Go to your project and add the following to your project&#8217;s pom.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;project&gt;
&lt;distributionManagement&gt;
        &lt;repository&gt;
            &lt;id&gt;internal.maven.repos&lt;/id&gt;
            &lt;name&gt;Internal Maven Repository&lt;/name&gt;
            &lt;url&gt;scpexe://maven@hostname.com/home/maven/.m2/repository&lt;/url&gt;
        &lt;/repository&gt;
    &lt;/distributionManagement&gt;
...
  &lt;build&gt;
        &lt;extensions&gt;
            &lt;extension&gt;
                &lt;groupId&gt;org.apache.maven.wagon&lt;/groupId&gt;
                &lt;artifactId&gt;wagon-ssh-external&lt;/artifactId&gt;
                &lt;version&gt;1.0-beta-2&lt;/version&gt;
            &lt;/extension&gt;
        &lt;/extensions&gt;
    &lt;/build&gt;
&lt;/project&gt;
</pre>
<p>4. Run mvn deploy.</p>
<p>5. You should now see your project deployed to the maven repository on your server.</p>
]]></content:encoded>
			<wfw:commentRss>http://ca.rroll.net/2010/02/26/deploying-maven-modules/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

