<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>ChangeLog - Jon Chase's blog</title>
	
	<link>http://www.juliesoft.com</link>
	<description>solve niche problems, make users happy</description>
	<lastBuildDate>Sun, 18 Jul 2010 06:56:43 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Sendalongcom-Blog" /><feedburner:info uri="sendalongcom-blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>Sendalongcom-Blog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>ChangeLog #5: Just working away</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/ib1n-5SpJtA/</link>
		<comments>http://www.juliesoft.com/2010/07/changelog-5-just-working-away/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 06:56:43 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[ChangeLog]]></category>
		<category><![CDATA[Every Single Shot]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/?p=404</guid>
		<description><![CDATA[Hey there!  I have been BUSY since the release of Every Single Shot.  Here&#8217;s a quick recap just to keep you up to date.  I can&#8217;t stay long &#8211; I&#8217;ve got more stuff (marketing, coding, brainstorming, and emailing w/customers) to do!!
First off, I&#8217;ve been adding a ton of user requests to ESS. [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F07%2Fchangelog-5-just-working-away%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F07%2Fchangelog-5-just-working-away%2F" height="61" width="51" /></a></div><p>Hey there!  I have been BUSY since the <a href="http://www.juliesoft.com/2010/06/changelog-4-every-single-shot-1-0-is-out/">release of Every Single Shot</a>.  Here&#8217;s a quick recap just to keep you up to date.  I can&#8217;t stay long &#8211; I&#8217;ve got more stuff (marketing, coding, brainstorming, and emailing w/customers) to do!!</p>
<p>First off, I&#8217;ve been adding <a href="http://everysingleshot.com/blog/new-features-and-cake">a ton</a> <a href="http://everysingleshot.com/blog/get-your-guests-wedding-videos">of user</a> <a href="http://everysingleshot.com/blog/comments-on-photos-and-videos">requests to</a> ESS.  All in all, I&#8217;ve completed/fixed over 100 new features/bugs in the last month and a half.  And that&#8217;s only counting what I bothered to enter into my issue tracker.  That number would probably be somewhere in the four to five hundred range if I were to examine my notepads. <img src='http://www.juliesoft.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>ESS is profitable and humming along nicely.  My customers have been keeping me rather busy with feature requests.  I&#8217;ve been really pleased at how many of the requests they make are for GOOD features &#8211; things that everyone will benefit from having.  </p>
<p>Goals for this month include increasing ESS&#8217;s traffic, increasing the conversion rate (I&#8217;m shooting for 2% conversion to a paid plan), and streamlining things for new users to make it super simple to figure out what they need to do to get all those wedding photos they&#8217;d otherwise miss.  </p>
<p>Here&#8217;s a few screenshots from ESS to wrap up with.  </p>
<p><a href="http://www.juliesoft.com/wp-content/uploads/2010/07/comment_email_small.png"><img src="http://www.juliesoft.com/wp-content/uploads/2010/07/comment_email_small.png" alt="comment_email_small" title="comment_email_small" width="508" height="568" class="aligncenter size-full wp-image-406" /></a></p>
<p><a href="http://www.juliesoft.com/wp-content/uploads/2010/07/ess_home.png"><img src="http://www.juliesoft.com/wp-content/uploads/2010/07/ess_home.png" alt="ess_home" title="ess_home" width="580" height="567" class="aligncenter size-full wp-image-407" /></a></p>
<p>Until next time!</p>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/ib1n-5SpJtA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2010/07/changelog-5-just-working-away/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2010/07/changelog-5-just-working-away/</feedburner:origLink></item>
		<item>
		<title>ChangeLog #4: Every Single Shot 1.0 is OUT!</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/OWyDWgouKPs/</link>
		<comments>http://www.juliesoft.com/2010/06/changelog-4-every-single-shot-1-0-is-out/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 07:57:09 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[ChangeLog]]></category>
		<category><![CDATA[Every Single Shot]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/?p=394</guid>
		<description><![CDATA[Holla!  I just flipped the switch on Every Single Shot 1.0!  If it&#8217;s on Twitter it must be a fact:

This has been the culmination of a lot of work!  Oh sure, it&#8217;s still a little rough around the edges for now, but isn&#8217;t that part of the charm?  I&#8217;ve got big, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F06%2Fchangelog-4-every-single-shot-1-0-is-out%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F06%2Fchangelog-4-every-single-shot-1-0-is-out%2F" height="61" width="51" /></a></div><p>Holla!  I just flipped the switch on <a href="http://everysingleshot.com">Every Single Shot 1.0</a>!  If it&#8217;s <a href="http://twitter.com/everysingleshot/status/15161765717">on Twitter</a> it must be a fact:</p>
<p><a href="http://twitter.com/everysingleshot/status/15161765717"><img src="http://www.juliesoft.com/wp-content/uploads/2010/06/ess10tweet.png" alt="ess10tweet" title="ess10tweet" width="586" height="259" class="aligncenter size-full wp-image-395" /></a></p>
<p>This has been the culmination of a <strong>lot</strong> of work!  Oh sure, it&#8217;s still a little rough around the edges for now, but isn&#8217;t that part of the charm?  I&#8217;ve got big, big plans for the future of ESS, and I&#8217;m super excited that I&#8217;ve gotten this far.  I don&#8217;t know how else to say it: it&#8217;s been a lot of work.  Worth it? Definitely!  </p>
<p><a href="http://everysingleshot.com"><img src="http://www.juliesoft.com/wp-content/uploads/2010/06/ess1.0.jpg" alt="ess1.0" title="ess1.0" width="550" height="394" class="aligncenter size-full wp-image-396" /></a></p>
<h3>Technical stuff</h3>
<p>What&#8217;s ESS built on?  What technologies does it use?  What methodologies did I use to build it?  </p>
<h4>The tech</h4>
<h5>Grails</h5>
<p>First and foremost, I used <a href="http://grails.org">Grails</a> for pretty much everything.  I was a Spring MVC veteran for a long time, and let me tell you, I knew my way around that stack inside and out.  There was nothing I couldn&#8217;t accomplish with it, albeit with a bit of elbow grease usually.  I decided to move to Grails for this application b/c it was so similar to Spring MVC in so many ways (it&#8217;s built on top of Spring MVC for one), but different where it really counted (i.e. it made the simple stuff really simple, and the tough stuff, well, less tough).  I have no regrets and I don&#8217;t see myself ever going back.  </p>
<p><strong>Grails report card: A++</strong></p>
<h5>Amazon EC2 and S3</h5>
<p>Can I get another holla!  I love love love working on <a href="http://aws.amazon.com/ec2/">EC2</a> and <a href="https://s3.amazonaws.com/">S3</a>.  Let me put it this way: have you ever used a technology or toolset that just works?  I mean, one that <strong>always</strong> does exactly what it&#8217;s supposed to without fail?  Well, I hadn&#8217;t either until I used EC2 and S3.  They are so damn reliable, so rock solid, so well documented and supported.  <strong>Basically, they&#8217;re awesome.</strong>  I know there are other services out there with more bells and whistles, and I&#8217;ll be honest, I had to build a lot of infrastructure in EC2 myself that I wish I hadn&#8217;t needed to, but AWS&#8217;s stability and predictability more than make up for it.  For 10 cents an hour I get a dedicated (virtual) server with lots of RAM, a huge disk, and some crazy fast connectivity.  Scripting set up and configuration of servers couldn&#8217;t be much easier than with good ol&#8217; <a href="http://alestic.com/2009/08/runurl">runurl</a>.  Management of servers is super easy with the command line tools.  Rawk on.</p>
<p><strong>Amazon AWS report card: A++</strong></p>
<h5>Other tech</h5>
<p>Here are some of the other technologies that various parts of Every Single Shot use in no particular order: <a href="http://en.wikipedia.org/wiki/Advanced_Packaging_Tool">apt</a> (this is one reason that Linux rocks), Apache 2, <a href="http://www.juliesoft.com/2010/05/an-easy-way-to-keep-your-ubuntu-ec2-instances-up-to-date/">apticron</a>, <a href="http://timkay.com/aws/">awstools</a>, <a href="http://alestic.com/2009/09/ec2-consistent-snapshot">ec2-consistent-snapshot</a> (Eric Hammond is the man when it comes to EC2 and Ubuntu), Groovy, <a href="http://www.imagemagick.org">ImageMagick</a>, Java, Jquery, MySQL, <a href="http://www.postfix.org/">postfix</a>, Subversion (I know, I know&#8230;), and Tomcat.  All in all you can see there&#8217;s not a lot of glamour tools in there, just a bunch of stuff that works.  </p>
<h4>Methodologies</h4>
<p>Gosh, I wish I could be more specific, but I pretty much just had a big list of issues, loosely divided into versions, organized in <a href="http://www.atlassian.com/software/jira/">Jira</a> (<a href="http://www.atlassian.com/software/jira/pricing.jsp">I got my Jira license for $10</a>).  That&#8217;s it.  No agile, no scrum, no scragile or whatever.  Just cranked through issues.</p>
<p>Here&#8217;s something interesting:  I used to do a lot of TDD (test driven development).  I&#8217;ve abandoned that lately in favor of writing tests&#8230;never.  Actually, since I&#8217;ve started with Grails I&#8217;ve written a lot fewer tests that I used to with Spring MVC.  Part of this is due to the fact that there&#8217;s a lot less that needs testing in Grails, and part of it is due to the fact that tests in Grails can be a little tough to write (there&#8217;s a lot of meta programming magic happening, and I miss Java autocomplete), and a lot of the tests run kinda slow (the entire container has to start up a lot of the time).  Enough about testing though (let the flame wars begin).  </p>
<h3>I could go on&#8230;</h3>
<p>Believe me, I have lots more to talk about, lots more I want to say about the 1.0 release of Every Single Shot.  But that&#8217;ll have to wait.  I need to get back to work!  2.0 is calling me&#8230;</p>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/OWyDWgouKPs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2010/06/changelog-4-every-single-shot-1-0-is-out/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2010/06/changelog-4-every-single-shot-1-0-is-out/</feedburner:origLink></item>
		<item>
		<title>An easy way to keep your Ubuntu EC2 instances up to date</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/TmXmlTmhK8E/</link>
		<comments>http://www.juliesoft.com/2010/05/an-easy-way-to-keep-your-ubuntu-ec2-instances-up-to-date/#comments</comments>
		<pubDate>Mon, 24 May 2010 06:46:26 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/?p=379</guid>
		<description><![CDATA[
Note: this tip can be applied to a lot of Linux distros, but the Ubuntu on EC2 set up is the one I&#8217;m using it on. YMMV
So I&#8217;m running some pretty stable Ubuntu instances on Amazon&#8217;s EC2.  They&#8217;ve never shut down unexpectedly, and I rarely need to restart them.  This means I&#8217;m rarely [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F05%2Fan-easy-way-to-keep-your-ubuntu-ec2-instances-up-to-date%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F05%2Fan-easy-way-to-keep-your-ubuntu-ec2-instances-up-to-date%2F" height="61" width="51" /></a></div><p><img src="http://www.juliesoft.com/wp-content/uploads/2010/05/stonehenge.jpg" alt="stonehenge" title="stonehenge" width="500" height="375" class="aligncenter size-full wp-image-378" /></p>
<p>Note: this tip can be applied to a lot of Linux distros, but the Ubuntu on EC2 set up is the one I&#8217;m using it on. YMMV</p>
<p>So I&#8217;m running some pretty stable Ubuntu instances on Amazon&#8217;s EC2.  They&#8217;ve never shut down unexpectedly, and I rarely need to restart them.  This means I&#8217;m rarely in the console tinkering around with software packages or worrying about software updates.  I needed an easy, hands off way to make sure my instances are running the latest, greatest, and shiniest new software out there.  An email every day with packages that need updated would be perfect.  Enter <a href="https://help.ubuntu.com/9.10/serverguide/C/automatic-updates.html"><strong>apticron</strong></a>.  </p>
<h3>apticron: easy software updates</h3>
<p>The docs on apticron <a href="https://help.ubuntu.com/9.10/serverguide/C/automatic-updates.html">are here</a>, but here&#8217;s the gist:  install apticron (<span class="mono">sudo apt-get install apticron</span>) and you&#8217;ll get a daily email with a list of packages that need updated.  You can then install the packages yourself as you please (see below on how to automate that too), which I prefer.  The daily email even contains the required upgrade commands.  How easy is that?  </p>
<p>Here&#8217;s an example email from apticron:</p>
<p><img src="http://www.juliesoft.com/wp-content/uploads/2010/05/apticron_email.png" alt="apticron_email" title="apticron_email" width="495" height="688" class="aligncenter size-full wp-image-377" /></p>
<p>You&#8217;ll probably need to <strong>customize the email address that apticron sends its reports to</strong>.  The file that controls that is <span class="mono">/etc/apticron/apticron.conf</span>.</p>
<p>Since the EC2 instances I launch are configured from scratch every time they&#8217;re launched, I tend to write scripts to install software like apticron.  Here&#8217;s my script that installs apticron and updates the email address it uses to something more useful (automatically run at start up thanks to the wonderful <a href="http://alestic.com/2009/08/runurl">runurl</a>):</p>
<pre class="brush: bash">
#!/bin/bash -ex
export DEBIAN_FRONTEND=noninteractive
# Installs apticron
# apticron sends an email once a day listing packages that need updated
sudo apt-get -y install apticron
echo "replacing the default /etc/apticron/apticron.conf with a configured version"
sudo touch /etc/apticron/apticron.conf
sudo rm /etc/apticron/apticron.conf
sudo touch /etc/apticron/apticron.conf
echo "EMAIL=\"me@myawesomecompany.com\"" | sudo tee -a /etc/apticron/apticron.conf
</pre>
<p>(I&#8217;ll be the first to admit that my shell scripting skills could use some improvement.  Suggestions welcome, but the above will get the job done.)</p>
<p>Oh, and I mentioned that the updates themselves can also be automated.  I&#8217;m not comfortable with this yet as I&#8217;d much rather review the updates before having them applied, but if you&#8217;re interested in automatic updates, <a href="https://help.ubuntu.com/9.10/serverguide/C/automatic-updates.html ">have a look at unattended-upgrades</a>.  </p>
<h3>Happy automating!</h3>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/TmXmlTmhK8E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2010/05/an-easy-way-to-keep-your-ubuntu-ec2-instances-up-to-date/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2010/05/an-easy-way-to-keep-your-ubuntu-ec2-instances-up-to-date/</feedburner:origLink></item>
		<item>
		<title>Which form style do you prefer?</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/Gm_2-R8emYk/</link>
		<comments>http://www.juliesoft.com/2010/05/which-form-style-do-you-prefer/#comments</comments>
		<pubDate>Tue, 11 May 2010 12:29:44 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[Every Single Shot]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/?p=364</guid>
		<description><![CDATA[I&#8217;ve just been doing a bit of refactoring on the Every Single Shot sign up page.  I started with something that resembled the idea of mad-libs form design:
 (click thumbnail for full size image)
I&#8217;ve since decided to try amore traditional form layout:
 (click thumbnail for full size image)
Do you have a preference?  Vote [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F05%2Fwhich-form-style-do-you-prefer%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F05%2Fwhich-form-style-do-you-prefer%2F" height="61" width="51" /></a></div><p>I&#8217;ve just been doing a bit of refactoring on the Every Single Shot <a href="http://everysingleshot">sign up page</a>.  I started with something that resembled the idea of <a href="http://www.lukew.com/ff/entry.asp?1007">mad-libs form design</a>:</p>
<p><a href="http://www.juliesoft.com/wp-content/uploads/2010/05/short.png"><img src="http://www.juliesoft.com/wp-content/uploads/2010/05/short-300x271.png" alt="short" title="short" width="300" height="271" class="aligncenter size-medium wp-image-367" /></a> (click thumbnail for full size image)</p>
<p>I&#8217;ve since decided to try amore traditional form layout:</p>
<p><a href="http://www.juliesoft.com/wp-content/uploads/2010/05/long.png"><img src="http://www.juliesoft.com/wp-content/uploads/2010/05/long-261x300.png" alt="long" title="long" width="261" height="300" class="aligncenter size-medium wp-image-366" /></a> (click thumbnail for full size image)</p>
<p>Do you have a preference?  Vote below and let me know what you think!</p>
<p><script type="text/javascript" charset="utf-8" src="http://static.polldaddy.com/p/3185109.js"></script><br />
<noscript><br />
	<a href="http://polldaddy.com/poll/3185109/">Which form layout do you prefer?</a><span style="font-size:9px;"><a href="http://polldaddy.com/features-surveys/">Market Research</a></span><br />
</noscript></p>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/Gm_2-R8emYk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2010/05/which-form-style-do-you-prefer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2010/05/which-form-style-do-you-prefer/</feedburner:origLink></item>
		<item>
		<title>Automatic http/httpS switching with Grails</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/kab_-4E_wCM/</link>
		<comments>http://www.juliesoft.com/2010/04/automatic-httphttps-switching-with-grails/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 08:40:56 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java & Programming]]></category>
		<category><![CDATA[java groovy grails spring security http https]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/?p=336</guid>
		<description><![CDATA[
A common requirement in webapps nowadays is to switch users between a secure and insecure connection (called protocol switching).  For example, maybe your user needs to enter a password, credit card number, or some other sensitive information.  Of course, you (and the user) would like that information to be sent securely, which means [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F04%2Fautomatic-httphttps-switching-with-grails%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F04%2Fautomatic-httphttps-switching-with-grails%2F" height="61" width="51" /></a></div><p><img src="http://www.juliesoft.com/wp-content/uploads/2010/04/switch.jpg" alt="switch" title="switch" width="500" height="333" class="aligncenter size-full wp-image-356" /></p>
<p>A common requirement in webapps nowadays is to switch users between a secure and insecure connection (called <strong>protocol switching</strong>).  For example, maybe your user needs to enter a password, credit card number, or some other sensitive information.  Of course, you (and the user) would like that information to be sent securely, which means requiring http<strong>s</strong>.  Assuming you&#8217;ve already got a server set up with an SSL cert and it&#8217;s ready to serve pages over SSL, you&#8217;ll need to <strong>ensure</strong> your webapp serves all secure pages over http<strong>s</strong>.  Unfortunately, this isn&#8217;t always as easy as it seems.  But it&#8217;s not too tough either, thanks to <a href="http://grails.org">Grails</a> and <a href="http://static.springsource.org/spring-security/site/index.html">Spring Security</a>.  </p>
<p>Here are the <strong>requirements for protocol switching</strong>:</p>
<ul>
<li>Serve secure pages using http<strong>s</strong>, regardless of the link used to get to the page (i.e. http links should be redirected to http<strong>s</strong>)</li>
<li>Make protocol switching transparent to the majority of your application (i.e. links starting with <span class="mono">http://</span> will automatically get redirected to <span class="mono">http<strong>s</strong>://</span> and vice versa)</li>
<li>Easy configuration of which resources must be served as secure, insecure, or either (i.e. images, CSS, and JavaScript should be loaded using the same protocol the page uses to avoid nasty browser warnings (see below))</li>
<li>Security and protocol switching should be handled in a way such that browsers aren&#8217;t continuously popping up warning dialogs</li>
<li>Make it work in Grails</li>
</ul>
<h3>Implementation</h3>
<p>There are several ways to go about automatic protocol switching.  One of the most popular would be to use Apache and <a href="http://www.whoopis.com/howtos/apache-rewrite.html">mod_rewrite</a>.  That solution works fine, but it&#8217;s not portable between different types of servers.  </p>
<p>The solution below is pure Java, and is portable between any servlet container.  By the way, this isn&#8217;t a Grails only solution &#8211; this will work with pretty much any Java web stack &#8211; the only thing that will differ is how you wire things up.  In fact I&#8217;ve used this in a regular Spring MVC app with a regular Spring configuration&#8230;but I&#8217;m only going to show the Grails way to do it today.  </p>
<p>Here&#8217;s how to get automatic protocol switching in Grails:</p>
<ul>
<li>Add a filter definition to web.xml that intercepts all requests and handles the protocol switching and redirecting</li>
<li>Configure which URLs require which protocol</li>
<li>Test!</li>
</ul>
<h3>Adding the filter definition</h3>
<p>Spring Security has <a href="http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#ns-requires-channel">protocol switching built in</a>, so why reinvent the wheel?  (Don&#8217;t worry, you don&#8217;t need to use any other parts of Spring Security to get protocol switching.)  Spring Security refers to protocol switching as Channel Security, but don&#8217;t worry, it&#8217;s the same thing.</p>
<p>If your Grails app isn&#8217;t already using Spring Security, add the following dependencies into grails-app/conf/BuildConfig.groovy to have Grails download the required JARs:</p>
<pre class="brush: groovy">
grails.project.dependency.resolution = {

	// ...
	// other settings...
	// ...

	dependencies {

		// ...
		// other dependencies...
		// ...

		runtime &#x27;org.springframework.security:spring-security-core:3.0.2.RELEASE&#x27; // http -&gt; https redirecting
		runtime &#x27;org.springframework.security:spring-security-web:3.0.2.RELEASE&#x27; // http -&gt; https redirecting
	}
}
</pre>
<p>You&#8217;ll need to add a Servlet Filter to web.xml now.  There are a couple of ways to do this in Grails, namely writing a plugin that can <a href="http://grails.org/doc/latest/guide/12.%20Plug-ins.html#12.7 Hooking into Runtime Configuration">modify web.xml dynamically</a>, or <a href="http://grails.org/doc/latest/ref/Command%20Line/install-templates.html">installing the Grails templates</a> into your app and manually editing web.xml.  I had planned on doing the first option (writing a plugin), but it was overkill for this, so I decided against it.  I&#8217;m glad I did.  Installing the Grails templates and modifying web.xml manually is painless.</p>
<p>Run <span class="mono">grails install-templates</span> from the root of your Grails project to install the web.xml template (along with a few others).  Next, edit <span class="mono">src/templates/war/web.xml</span> and add the filter definition and mapping in the appropriate places:</p>
<pre class="brush: xml">
&lt;!-- START: use SSL on secure pages --&gt;
&lt;filter&gt;
	&lt;filter-name&gt;channelProcessingFilter&lt;/filter-name&gt;
	&lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;!-- END: use SSL on secure pages --&gt;

&lt;!-- ... other filter definitions ... --&gt;

&lt;!-- START: use SSL on secure pages --&gt;
&lt;filter-mapping&gt;
	&lt;filter-name&gt;channelProcessingFilter&lt;/filter-name&gt;
	&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
&lt;!-- END: use SSL on secure pages --&gt;
</pre>
<p>Make sure that the filter-mapping is the first filter-mapping defined in web.xml (above <span class="mono">charEncodingFilter</span> and <span class="mono">sitemesh</span>).</p>
<p>Now to actually define the filter.  Define it as a Spring managed bean in <span class="mono">grails-app/conf/spring/resources.groovy</span>:</p>
<pre class="brush: groovy">
import org.springframework.security.web.util.AntUrlPathMatcher
import org.springframework.security.web.access.intercept.DefaultFilterInvocationSecurityMetadataSource
import org.springframework.security.web.access.channel.SecureChannelProcessor
import org.springframework.security.web.access.channel.InsecureChannelProcessor
import org.springframework.security.web.access.channel.ChannelProcessingFilter
import org.springframework.security.web.access.channel.ChannelDecisionManagerImpl

beans = {

	// -------------------------------------------------------------------------
	// -------------------------------------------------------------------------
	// SPRING SECURITY (CHANNEL SECURITY)
	channelDecisionManager(ChannelDecisionManagerImpl) {
		channelProcessors = [new SecureChannelProcessor(),
							new InsecureChannelProcessor()]
	}
	securityMetadataSource(DefaultFilterInvocationSecurityMetadataSource,
							new AntUrlPathMatcher(),
							ChannelConfig.getChannelConfig()) {
		stripQueryStringFromUrls = true
	}
	channelProcessingFilter(ChannelProcessingFilter) {
		channelDecisionManager = ref(&quot;channelDecisionManager&quot;)
		securityMetadataSource = ref(&quot;securityMetadataSource&quot;)
	}

}
</pre>
<p><span class="mono"><a href="http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/access/channel/ChannelProcessingFilter.html">channelProcessingFilter</a></span> is the filter referenced in web.xml.  It will use the <span class="mono"><a href="http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/access/channel/ChannelDecisionManagerImpl.html">channelDecisionManager</a></span> to decide if the current protocol (http or http<strong>s</strong>) needs to be switched to the other.  And how does <span class="mono">channelProcessingFilter</span> know which URLs require which protocol?  <span class="mono"><a href="http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/access/intercept/DefaultFilterInvocationSecurityMetadataSource.html">securityMetadataSource</a></span>, of course. By default, ports 80 and 8080 are considered insecure, and 443 and 8443 are considered secure.  This means that the defaults should work for both development (8080 and 8443) and production (80 and 443).  If you&#8217;re curious as to the specifics of what these beans do, check their Javadocs.  </p>
<h3>Configure which URLs require which protocol</h3>
<p>See that call above to <span class="mono">ChannelConfig.getChannelConfig()</span>?  That&#8217;s where the configuration for URLs is stored.  Create <span class="mono">grails-app/conf/ChannelConfig.groovy</span>:</p>
<pre class="brush: groovy">
import org.springframework.security.access.ConfigAttribute
import org.springframework.security.access.SecurityConfig
import org.springframework.security.web.access.intercept.RequestKey

class ChannelConfig {

	private ChannelConfig() {} // prevent instantiation

	static def getChannelConfig() {
		LinkedHashMap&lt;RequestKey,java.util.Collection&lt;ConfigAttribute&gt;&gt; requestMap = new LinkedHashMap&lt;RequestKey, Collection&lt;ConfigAttribute&gt;&gt;()

		// resources that can be served over http or https (typically whatever the containing page is served as)
		requestMap.put new RequestKey(&quot;/images/**&quot;), [new SecurityConfig(&quot;ANY_CHANNEL&quot;)]
		requestMap.put new RequestKey(&quot;/css/**&quot;), [new SecurityConfig(&quot;ANY_CHANNEL&quot;)]
		requestMap.put new RequestKey(&quot;/js/**&quot;), [new SecurityConfig(&quot;ANY_CHANNEL&quot;)]
		requestMap.put new RequestKey(&quot;/favicon.ico&quot;), [new SecurityConfig(&quot;ANY_CHANNEL&quot;)]

		// resources that must be served over https
		requestMap.put new RequestKey(&quot;/signup&quot;), [new SecurityConfig(&quot;REQUIRES_SECURE_CHANNEL&quot;)]
		requestMap.put new RequestKey(&quot;/auth/**&quot;), [new SecurityConfig(&quot;REQUIRES_SECURE_CHANNEL&quot;)]
		requestMap.put new RequestKey(&quot;/admin/**&quot;), [new SecurityConfig(&quot;REQUIRES_SECURE_CHANNEL&quot;)]
		requestMap.put new RequestKey(&quot;/app/account/edituser&quot;), [new SecurityConfig(&quot;REQUIRES_SECURE_CHANNEL&quot;)]

		// resources that must be served over http (basically everything else not already listed above)
		requestMap.put new RequestKey(&quot;/**&quot;), [new SecurityConfig(&quot;REQUIRES_INSECURE_CHANNEL&quot;)] // all other pages should be served over http

		requestMap
	}
}
</pre>
<p>What&#8217;s happening here?  First, there&#8217;s some horrible nastiness with the definition of the <span class="mono">requestMap</span> variable (gotta love generics).  This is how your configuration is stored and the format <span class="mono">securityMetadataSource</span> expects.  Each call to <span class="mono">requestMap.put()</span> specifies a URL or URL pattern (Apache Ant pattern style) and its corresponding channel security (i.e. http or http<strong>s</strong>).  </p>
<p>There are three options for channel security:</p>
<ul>
<li><span class="mono">ANY_CHANNEL</span> &#8211; Serve the resource with either http or http<strong>s</strong> &#8211; it doesn&#8217;t matter.  This is good for images, CSS, and JavaScript, which should be served using the same protocol as the containing page.</li>
<li><span class="mono">REQUIRES_SECURE_CHANNEL</span> &#8211; Serve the resource using http<strong>s</strong>.  This is what will automatically redirect the user to http<strong>s</strong> when needed.</li>
<li><span class="mono">REQUIRES_INSECURE_CHANNEL</span> &#8211; Serve the resource using http.  You don&#8217;t want to serve your entire site over http<strong>s</strong>, right?  </li>
</ul>
<p>In the configuration above, I first specified all the resources that are protocol agnostic &#8211; images, CSS, etc.  Then in the next section I specified all of the resources that must be served securely.  Finally, the <span class="mono">/**</span> specifies that anything else not already listed above will be served over plain http.</p>
<p>Note that <strong>order matters</strong> (hence the use of a LinkedHashMap that retains insertion order).  Rules should be added from most specific to least specific.  For example, if the <span class="mono">/**</span> rule was at the very top, it would match every resource request, which would be very bad.  </p>
<p>If you want to see the debug output from Spring Security as it makes its decisions about whether or not a resource is being served over the right protocol, add the following to your Log4j config in <span class="mono">grails-app/conf/Config.groovy</span>:</p>
<pre class="brush: groovy">
log4j = {

	// ...
	// ... other logging definitions
	// ...
	debug &#x27;org.springframework.security&#x27;

}
</pre>
<h3>Testing</h3>
<p>Since you&#8217;re testing your app with http<strong>s</strong>, make sure to start Grails with the <span class="mono">-http<strong>s</strong></span> option:</p>
<p><code>grails run-app -http<strong>s</strong></code></p>
<p>This will automatically set up a fake SSL certificate for your app and run http<strong>s</strong> on port 8443.  </p>
<p>You should now be able to go to <span class="mono">http://localhost:8080</span> and see that it is indeed served over http.  If you have a sign up page like configured above, navigating to <span class="mono">http://localhost:8080</span> should automatically redirect your browser to <span class="mono">http<strong>s</strong>://localhost:8443</span>.  Clicking on a link to <span class="mono">http<strong>s</strong>://localhost:8443/index</span> should then automatically take you back to <span class="mono">http://localhost:8080/index</span>.  You&#8217;ll also notice that resources like images, CSS, and JavaScript are served using whatever protocol the containing page uses.  </p>
<h3>Caveats</h3>
<p>Did you know that if an HttpSession is created over an http<strong>s</strong> connection that it won&#8217;t be available to the user when they go back to regular old http?  This means that if you have your user log in using http<strong>s</strong>, when they are redirected back to http, their session will be gone.  This won&#8217;t be a problem for you if you plan to have users always use http<strong>s</strong> once they&#8217;ve logged in.  But some sites (flickr, for example) prefer to serve most of their pages using http for performance reasons once the user has logged in securely.  There is a trick to allow http<strong>s</strong> -&gt; http session migration, but that&#8217;s a topic for a later blog post.</p>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/kab_-4E_wCM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2010/04/automatic-httphttps-switching-with-grails/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2010/04/automatic-httphttps-switching-with-grails/</feedburner:origLink></item>
		<item>
		<title>Shell scripts that talk back (and make you millions)</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/VICciX55xhQ/</link>
		<comments>http://www.juliesoft.com/2010/03/shell-scripts-that-talk-back-and-make-you-millions/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 18:36:23 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Java & Programming]]></category>
		<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/?p=321</guid>
		<description><![CDATA[I&#8217;ve got a bunch of shell scripts that I use to help me with development of Every Single Shot.  Some of these scripts, like starting up a new server instance or redeploying an application, can take a while (10 to 15 minutes).  I&#8217;ll typically launch a script and then start working on something [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F03%2Fshell-scripts-that-talk-back-and-make-you-millions%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F03%2Fshell-scripts-that-talk-back-and-make-you-millions%2F" height="61" width="51" /></a></div><p>I&#8217;ve got a bunch of shell scripts that I use to help me with development of <a href="http://everysingleshot.com">Every Single Shot</a>.  Some of these scripts, like starting up a new server instance or redeploying an application, can take a while (10 to 15 minutes).  I&#8217;ll typically launch a script and then start working on something else, forgetting that the script is even running, only to come back an hour later and realize it completed 50 minutes ago.  I needed an easy way to remind myself that scripts are running, or better yet, to alert me when the scripts finish.  Specifically, I wanted something audible that would grab my attention right away, so having a shell script send an email won&#8217;t cut it in this case.  Then I realized how easy OS X makes sound playback from the terminal.</p>
<p>There are a few ways to get your shell scripts to beep or speak.  They range from utilitarian to fun, so choose wisely.  </p>
<p>Note: I&#8217;m using these on OS X &#8211; your mileage may vary on other platforms.  </p>
<h3>Terminal beep</h3>
<p>This should work even if you don&#8217;t have speakers installed on your system.  It&#8217;s pretty basic, and often times I don&#8217;t actually hear the beep, so I don&#8217;t really recommend this option.  </p>
<p>If you want your script to beep at you annoyingly, just type <code>printf &quot;\a&quot;</code> and hit enter.  You should hear a single beep (are your speakers on?).  Of course, that almost never gets my attention, so I usually wind up with something like this is my scripts: <code>printf &quot;\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a&quot;</code>  That&#8217;s a little better, but we can improve and have a little fun at the same time.</p>
<h3>Use the say command</h3>
<p>Did you know you can open a terminal on OS X, type in <code>say hello world!</code> and OS X will speak back &quot;hello world!&quot; to you?  You can&#8217;t get much simpler than that.  So instead of using the printf command above, just replace it with something like <code>say every single shot has been deployed to production</code>   </p>
<p>If you want to really impress those VCs you&#8217;re recruiting, I highly recommend the Trinoids or Zarvox voices (see all voices available in System Preferences -&gt; Speech), as they definitely lend some nerd credibility to your build process.  Those VCs will start throwing money at you (this is the part of the blog where you make millions) as they wonder in awe at how you were able to design such a complex system.  They&#8217;ll be throwing your series B funding at you just as fast as you can <code>say -v Trinoids system is running at peak efficiency</code> or <code>say -v Zarvox Skynet has become self aware.  Initiating self defense subroutine</code></p>
<p>Warning:  don&#8217;t use the Whisper voice unless you want to be freaked out, especially if you&#8217;re working late at night.</p>
<h3>Say the command yourself</h3>
<p>Or better yet, have your spouse or kid say it for you.  </p>
<p>You can use the <strong>afplay</strong> command to play MP3s or WAVs from the command line.  Just record a few messages like &quot;production instance is running&quot; using <a href="http://audacity.sourceforge.net/">Audacity</a> (free), save them as WAV or MP3 (you&#8217;ll need the <a href="http://audacity.sourceforge.net/help/faq?s=install&#038;item=lame-mp3">lame encoder</a> to save as MP3), store them in the same directory (or maybe a /sounds subdirectory) as your shell scripts with the same names as the scripts except with a .mp3 file extension, and then make the magic happen with <code>afplay redeploy_to_production.mp3</code>    </p>
<p>If you don&#8217;t want to record your voice but want something a little more personal, you can download free sound effects (I haven&#8217;t tried but I assume you can get them in MP3 or WAV format) from <a href="http://www.freesound.org/">Freesound</a>.</p>
<p>If you have ideas on how to accomplish some of the above on Windows, Unix/Linux, or another platform, please leave a comment below!</p>
<p>I gotta run&#8230;it sounds like my build just finished!</p>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/VICciX55xhQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2010/03/shell-scripts-that-talk-back-and-make-you-millions/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2010/03/shell-scripts-that-talk-back-and-make-you-millions/</feedburner:origLink></item>
		<item>
		<title>ChangeLog #3: Beta release and the start of something great</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/5lqhW34Grrk/</link>
		<comments>http://www.juliesoft.com/2010/03/changelog-3-beta-release-and-the-start-of-something-great/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 09:30:44 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[ChangeLog]]></category>
		<category><![CDATA[Every Single Shot]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/?p=310</guid>
		<description><![CDATA[Total earnings as of March 18th, 2010: $0
In my last ChangeLog I said things were moving slowly &#8211; much slower than I would have hoped for.  That&#8217;s finally changed!  Development has really picked up over the last couple of weeks and I&#8217;ve been churning out new features and fixing bugs like nobody&#8217;s business. [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F03%2Fchangelog-3-beta-release-and-the-start-of-something-great%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F03%2Fchangelog-3-beta-release-and-the-start-of-something-great%2F" height="61" width="51" /></a></div><h3><strong>Total earnings as of March 18th, 2010: $0</strong></h3>
<p>In <a href="http://www.juliesoft.com/2010/02/changelog-2-storing-photos-and-little-else/">my last ChangeLog</a> I said things were moving slowly &#8211; much slower than I would have hoped for.  That&#8217;s finally changed!  Development has really picked up over the last couple of weeks and I&#8217;ve been churning out new features and fixing bugs like nobody&#8217;s business.  </p>
<h3>Just ship it!</h3>
<p>This week I did just that.  On <a href="http://twitter.com/everysingleshot/status/10466899487">Sunday, March 14th</a>, <strong>I released the very first beta</strong> of <a href="http://www.everysingleshot.com">Every Single Shot</a>.  Hooray!  The feature set is basic at this point, and there&#8217;s still a lot missing, but it&#8217;s up and running and out there for everyone to see and <a href="http://www.everysingleshot.com/prices">request a beta account</a>.  </p>
<p>
<a href="http://www.juliesoft.com/wp-content/uploads/2010/03/essbetatwitter.png"><img src="http://www.juliesoft.com/wp-content/uploads/2010/03/essbetatwitter-300x178.png" alt="It&#039;s out!" title="It&#039;s out!" width="300" height="178" class="aligncenter size-medium wp-image-313" /></a></p>
<p>It&#8217;s always fun <a href="http://www.juliesoft.com/2008/02/sendalong-10-is-out-more-info-coming-soon/">wrapping up the first big release</a> of a project.  There are so many loose ends to tie up that go completely unnoticed until the last minute.  Then it seems like there are 50 little tweaks that need to be made before it&#8217;s ready to ship.  The ESS beta release was no exception.  </p>
<p>On the technical side, I am extremely happy to see how well <a href="http://aws.amazon.com/ec2/">Amazon&#8217;s EC2</a> is working out.  Aside from the ease with which sites can be scaled out, my favorite thing about EC2 might be the fact that starting up a new instance of a server takes it back to a blank slate.  This saved me a lot of time and stress when I was trying to install an SSL certificate.  I think I trashed 3 or 4 servers before getting everything scripted correctly.  After I was done, I just restarted the server, and poof! &#8211; I had a fresh server up and running, with no evidence of all of the experimentation I had to do to get the SSL cert installed correctly.  </p>
<p><strong>Enough with the technical.</strong>  </p>
<p>To all those hopeful entrepreneurs out there, coding away at night after their full time job on their pet project &#8211; <strong><a href="http://37signals.com/svn/archives2/sanaz_ahari_just_ship_it.php">just ship it!</a></strong>  <strong>Get your project out there, let people see it, and don&#8217;t be afraid of their reactions.  If you really believe in what you&#8217;re working on you have nothing to fear.  </strong>Negative responses to your work are not negative responses to you &#8211; they&#8217;re valuable feedback that you can use to make your project better!  Don&#8217;t assume that everyone will love what you&#8217;ve done, or that it will make sense to anyone.  Just get it out there <a href="http://www.ashmaurya.com/2009/12/achieving-flow-in-a-lean-startup">and then iterate like crazy</a>.  Of course, you need to figure out what it is people do or don&#8217;t like about your project, which leads me to&#8230;</p>
<h3>Usability testing&#8230;or Why haven&#8217;t I done this before?</h3>
<p><a href="http://www.sensible.com/">Steve Krug</a> is not a rocket surgeon, just a genius.  If you don&#8217;t know what I&#8217;m talking about, <a href="http://www.sensible.com/">go and find out</a>, I&#8217;ll wait.  If you are a software developer that cares even a little about the user&#8217;s experience (and not just your own), go buy both of his books (<a href="http://www.sensible.com/dmmt.html">Don&#8217;t Make Me Think!</a> and <a href="http://www.sensible.com/rocketsurgery/index.html">Rocket Surgery Made Easy</a>) and read them cover to cover.  </p>
<p><strong>I did my first usability test yesterday and it went great, and here&#8217;s why: I didn&#8217;t take it personally.</strong>  If you have trouble with negative comments about your work, go read Steve&#8217;s books.  Hopefully they&#8217;ll give you some perspective to help you understand that those negative comments can and should be applied positively to your project.  </p>
<p>Anyway, back to my first usability test.  It really opened my eyes.  I&#8217;ve got that classic programmer <a href="http://en.wikipedia.org/wiki/Tunnel_vision">tunnel vision</a>, having worked on ESS day and night for months.  Seeing how someone else works through the app was enlightening &#8211; I came away with a full page of action items.  <strong>The wonderful thing about these todos is that they came from someone NOT ME.</strong>  Someone not invested on the project.  Someone with a fresh perspective.  <strong>They came from a real (potential) user.</strong>  </p>
<p>My advice: usability testing &#8211; do it early, do it often.  </p>
<p>If you want to try it yourself, have a look around <a href="http://www.sensible.com">Steve&#8217;s site</a>.  Especially check out <a href="http://www.sensible.com/rocketsurgery/index.html">the checklists</a> and <a href="http://www.peachpit.com/promotion/137602">the example video</a> of a usability test he conducted.  And then get ready to work on all the action items you collect from your tests. <img src='http://www.juliesoft.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Up next&#8230;</h3>
<p>Every Single Shot&#8217;s future is pretty clear right now: </p>
<ul>
<li>Add features</li>
<li>Run usability tests</li>
<li>Repeat</li>
</ul>
<p>It doesn&#8217;t need to be any more complicated than that&#8230;</p>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/5lqhW34Grrk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2010/03/changelog-3-beta-release-and-the-start-of-something-great/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2010/03/changelog-3-beta-release-and-the-start-of-something-great/</feedburner:origLink></item>
		<item>
		<title>How to give good customer support – be like SmugMug</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/LMYBFwLRVGM/</link>
		<comments>http://www.juliesoft.com/2010/02/how-to-give-good-customer-support-be-like-smugmug/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 12:33:11 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[ChangeLog]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/?p=302</guid>
		<description><![CDATA[I didn&#8217;t mean to learn anything about customer support &#8211; I was just researching the competition.  
More precisely, I was researching some indirect competitors for Every Single Shot and I found myself at SmugMug.  Although I was looking to learn about the specific features of SmugMug, what I found myself really impressed with [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F02%2Fhow-to-give-good-customer-support-be-like-smugmug%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F02%2Fhow-to-give-good-customer-support-be-like-smugmug%2F" height="61" width="51" /></a></div><p>I didn&#8217;t mean to learn anything about customer support &#8211; I was just researching the competition.  </p>
<p>More precisely, I was researching some indirect competitors for <a href="http://www.everysingleshot.com">Every Single Shot</a> and I found myself at <a href="http://www.smugmug.com">SmugMug</a>.  Although I was looking to learn about the specific features of SmugMug, what I found myself really impressed with was their customer support.  I mean, it was good enough that it actually jumped out at me.  <strong>How often do you find a site and your first thought is, &quot;Wow, they must have great customer support!&quot;?  Almost never.    </strong> </p>
<h3>Customer support tips</h3>
<p>SmugMug&#8217;s approach to support made an impression on me.  Here are the observations that I took away from my &#8216;mugging.  I&#8217;ll be looking for ways to integrate these into Every Single Shot in the future.</p>
<ul>
<li><strong>Be friendly</strong> &#8211; This seems like commonsense, but for some inexplicable reason businesses feel a need to sound &quot;professional&quot; when talking with customers.  Sure, make your website and literature professional.  But when you&#8217;re talking one on one with customers, be friendly.  People don&#8217;t want to talk to companies, they want to talk to people.  Use down to earth, conversational English.  How about this from the SmugMug welcome email: &quot;Need a real person?  We&#8217;re family-run and love to hear your gushes, gripes and questions so we know what to work on next.&quot;  That tone sets me at ease and lets me know that these people are here to help.  Little touches like these can make all the difference.  SmugMug uses this tone throughout their site to great effect.</li>
<li><strong>Humanize your support team</strong> &#8211; I really like this touch.  I found pictures of the SmugMug team in a couple of different places: the <a href="http://www.smugmug.com/help/">5 minute getting started video</a> and, my favorite, the <a href="http://www.smugmug.com/visitor-help/contact-smugmug">super hero pictures shown when sending in a support request</a>.  </li>
<li><strong>Let customers know you enjoy helping them (and actually mean it)</strong> &#8211; This has to do with the general attitude taken toward customers and support.  If you respect and value your customers, it will show.  If not, customers will soon become ex-customers.  I felt the SmugMug team was genuinely concerned about my experience on their site, and because of this I subconsciously started thinking &quot;I like these guys&quot;.</li>
<li><strong>Let customers feel like part of a group</strong> &#8211;  <a href="http://www.smugmug.com/help/">Watch the 5 minute getting started video.</a>  This is how intro videos should be done.  It&#8217;s narrated by one of SmugMug&#8217;s owners in a very casual tone and it has photos of the entire SmugMug team.  It made me feel like I knew these people a little, like I was part of their group.  </li>
<li><strong>Set appropriate expectations</strong> &#8211; This one&#8217;s great too, and it&#8217;s easily overlooked.  When you open a support request, SmugMug lets you know what time it is in &quot;SmugMug land&quot;.  This helps set appropriate expectations for when you&#8217;ll receive a response.  &quot;It&#8217;s 4:27am SmugMug time and our heros are snoozing&#8230;you&#8217;ll hear from them by early morning.&quot;  They&#8217;re asleep &#8211; fair enough, I can live with that.  They&#8217;re people, after all (see above points).  </li>
<li><strong>Automate</strong> &#8211; Here&#8217;s another neat touch when sending in a support request:  the user&#8217;s browser and OS are automatically detected and added to their email.  My support query to them automatically had the following added: &quot;Hey Support Heroes, I&#8217;m using Chrome on Mac OS.&quot;  Auto-generating details like this (instead of asking the users to tell them to you, which is way less efficient) can eliminate an entire cycle of the support process, which results in quicker support and happier users.  No more asking users what web browser they&#8217;re using only to have them reply &quot;Dell&quot; or &quot;purple&quot;.</li>
<li><strong>Provide help documents</strong> &#8211; Another seemingly obvious one, but a lot of small companies don&#8217;t provide any sort of help documents for their product.  I see this a lot in small webapps released by one or two people (usually programmers, because we all know programmers hate writing documentation &#8211; I&#8217;m guilty of this &#8211; <a href="http://www.sendalong.com">SendAlong</a> suffered from it).  This is a fundamental first step that a lot of companies drop the ball on.  SmugMug has a lot of nice help docs.  They even go so far as to <a href="http://www.smugmug.com/help/custom-colors">explain how to write some simple CSS rules</a>.</li>
<li><strong>Make help easy to access</strong> &#8211; If you spend a lot of time making your help system awesome, make sure you do it justice by making it easy to find.  Link to it on every page, and for added bonus points, make the links smart &#8211; don&#8217;t just dump them at the help homepage, show them topics related to the page they came from.  </li>
<li><strong>Include a FAQ in your help</strong> &#8211; You should have the top 5 to 10 questions asked right there at the top of your help homepage.  80% of your users are going to need one of those questions answered, so why not make it easy on them?  Bonus: now that you&#8217;ve got a FAQ, go through it and see if you can make any of the answers to the questions obsolete by making your product easier to use.</li>
<li><strong>Let them know if you&#8217;re special</strong> &#8211; It doesn&#8217;t hurt to let your users know that you&#8217;re better than average.  In my welcome email I found out that &quot;80% of customers who have purchased SmugMug accounts in the last 5 years are with us today.  We hope you&#8217;ll join the family.&quot;  I immediately thought &quot;Hmmmmm&#8230;they must be really good at what they do.&quot;  And I&#8217;m sure that&#8217;s exactly what they wanted me to think.</li>
</ul>
<p>All of this, and I never actually contacted their support team!  Based on what I found on SmugMug&#8217;s site, I can only assume that their team would live up to my expectations.  And that, in a nutshell, is great customer support.</p>
<h3>Being nice is good (duh!)</h3>
<p>With SendAlong, I violated all of the ideas above with one exception: I was friendly when talking with customers.  And I could tell that customers appreciated it.  I slowly started to see a pattern in how customers communicated with me.  </p>
<ul>
<li>Their first email would usually be neutral or somewhat passive aggresive/demanding.  &quot;Why doesn&#8217;t it have feature X?  I need this now.&quot;  </li>
<li>I always tried to be as friendly and personable as possible in my replies.  &quot;Hey, thanks for using SendAlong!  That&#8217;s a great question, and&#8230;&quot;</li>
<li>After extended the &quot;there&#8217;s a human on the other end and he&#8217;s nice&quot; olive branch, the next customer reply was usually pretty friendly.  &quot;Ahh, that makes sense.  Thanks for letting me know, Jon!&quot;</li>
</ul>
<p>Come to think of it, maybe those first customer emails would have been a lot friendlier if SendAlong had done a better job in earning users trust before they emailed by taking note of some of the tips above&#8230;</p>
<p>What tips can you give for providing great customer service?  I&#8217;d love to add some of your ideas to the list above and into <a href="http://www.everysingleshot.com">Every Single Shot</a> as well.  </p>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/LMYBFwLRVGM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2010/02/how-to-give-good-customer-support-be-like-smugmug/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2010/02/how-to-give-good-customer-support-be-like-smugmug/</feedburner:origLink></item>
		<item>
		<title>ChangeLog #2: Storing photos and little else</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/0U4HsBZe1Gc/</link>
		<comments>http://www.juliesoft.com/2010/02/changelog-2-storing-photos-and-little-else/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 13:09:49 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[ChangeLog]]></category>
		<category><![CDATA[Every Single Shot]]></category>
		<category><![CDATA[Java & Programming]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/?p=296</guid>
		<description><![CDATA[Total earnings as of February 11th, 2010: $0
This week was a lot slower than I had hoped it would be.  I don&#8217;t think I made enough progress to be able to launch a beta (remember to sign up) on February 15th (4 days from now!) &#8211; but I&#8217;m still shooting for it.
Safe, secure photo [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F02%2Fchangelog-2-storing-photos-and-little-else%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F02%2Fchangelog-2-storing-photos-and-little-else%2F" height="61" width="51" /></a></div><h3><strong>Total earnings as of February 11th, 2010: $0</strong></h3>
<p>This week was a lot slower than I had hoped it would be.  I don&#8217;t think I made enough progress to be able to launch a beta (<a href="http://www.everysingleshot.com">remember to sign up</a>) on February 15th (4 days from now!) &#8211; but I&#8217;m still shooting for it.</p>
<h3>Safe, secure photo storage</h3>
<p>I&#8217;ve been working on hooking up <a href="http://www.everysingleshot.com">Every Single Shot</a> to <a href="http://aws.amazon.com/s3/">Amazon&#8217;s S3</a> (Simple Storage Service).  This is where all of the photos for Every Single Shot will be stored.  According to Amazon, I&#8217;m using S3 because it&#8217;s secure, reliable, fault tolerant, flexible, competitively priced, and most importantly has something to do with &quot;cloud&quot;.  I use it because it&#8217;s easy to work with, stores data redundantly, cheap, and easy to get started with.  </p>
<p>I&#8217;m using <a href="http://jets3t.s3.amazonaws.com/index.html">JetS3t</a> (of course the <a href="http://jets3t.s3.amazonaws.com/index.html">JetS3t site</a> is completely hosted in S3) to work with S3 from Grails.  I love it and highly recommend it.  That&#8217;s all I have to say about that.  </p>
<p>I&#8217;ve been able to reuse a lot of code that I developed for <a href="http://www.sendalong.com">SendAlong</a>, which was a huge blessing and time saver (let alone a validation (at least in my mind) that I can write some reusable code &#8211; there&#8217;s a first time for everything).  </p>
<h3>If you build it&#8230;the build will fail</h3>
<p><a href="http://www.jetbrains.com/teamcity/">My continuous integration server</a> is great, but it can be a time suck sometimes (when it rains, it pours).  I&#8217;d much rather be working on features for Every Single Shot than futzing around with trying to fix an ArrayIndexOutOfBoundsException, but hey, you gotta keep the builds happy.  </p>
<p>Once I release ESS and get it somewhat stable I&#8217;d love to build in some kind of <a href="http://www.infoq.com/news/2010/01/continuous-deployment-trenches">continuous deployment</a> to my development/release process.  Having a build server is the first step towards that, I guess.</p>
<h3>Next week&#8217;s goals</h3>
<p>There&#8217;s only one goal I&#8217;m focusing on now:</p>
<ul>
<li>Release the Every Single Shot beta on February 15th (stretch)</li>
</ul>
<p>Wish me luck.  See you next week!</p>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/0U4HsBZe1Gc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2010/02/changelog-2-storing-photos-and-little-else/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2010/02/changelog-2-storing-photos-and-little-else/</feedburner:origLink></item>
		<item>
		<title>ChangeLog #1: hacking, branding, and EC2</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/KDA9o2btPKY/</link>
		<comments>http://www.juliesoft.com/2010/02/changelog-1-hacking-branding-and-ec2/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 13:00:14 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[ChangeLog]]></category>
		<category><![CDATA[Every Single Shot]]></category>
		<category><![CDATA[everysingleshot]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/?p=271</guid>
		<description><![CDATA[Total earnings as of February 1, 2010: $0
I&#8217;ve been busy the last few weeks working on many of the things it takes to turn Every Single Shot from an idea into an actual product.  
The last few weeks of work have been really, really fun.  Not only have I been coding Every Single [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F02%2Fchangelog-1-hacking-branding-and-ec2%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2010%2F02%2Fchangelog-1-hacking-branding-and-ec2%2F" height="61" width="51" /></a></div><h3><strong>Total earnings as of February 1, 2010: $0</strong></h3>
<p>I&#8217;ve been busy the last few weeks working on many of the things it takes to turn <a href="http://www.everysingleshot.com">Every Single Shot</a> from an idea into an actual product.  </p>
<p>The last few weeks of work have been really, really fun.  Not only have I been coding Every Single Shot, I&#8217;ve also worked on branding and setting up hosting.  Every day is a different job and I&#8217;m really digging the variety.  Here&#8217;s what I&#8217;ve been working on lately&#8230;</p>
<h3>Development</h3>
<p>Where would a web app be without code, right?  I&#8217;ve spent a fair amount of time in <a href="http://www.grails.org/STS+Integration">my IDE</a> hacking away to get a basic app up and running (ESS is written in <a href="http://groovy.codehaus.org/">Groovy</a> and <a href="http://grails.org/">Grails</a>).  Here&#8217;s what I&#8217;ve got so far:</p>
<ul>
<li>Public facing marketing site: home page, tour, sign up, contact us</li>
<li>App pages: photo browser, photo uploader, account settings, and a few others</li>
</ul>
<p><strong>I&#8217;ve still got lots of functionality and features to add in &#8211; lots.</strong>  Security is going to be a big one coming up.  Another is integration with <a href="http://aws.amazon.com/s3/">Amazon&#8217;s S3</a> (more on that below).  Oh, and I also need to remember to add in actual features that users care about as well. <img src='http://www.juliesoft.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Here&#8217;s the current LOC (Lines of Code) count for ESS (from running <a href="http://grails.org/doc/latest/ref/Command%20Line/stats.html">grails stats</a>):</p>
<pre>+----------------------+-------+-------+
| Name                 | Files |  LOC  |
+----------------------+-------+-------+
| Controllers          |    14 |   803 |
| Domain Classes       |    15 |   266 |
| Jobs                 |     2 |    59 |
| Services             |     3 |   105 |
| Tag Libraries        |     4 |   205 |
| Groovy Helpers       |     3 |   116 |
| Java Helpers         |     3 |    81 |
| Unit Tests           |    29 |   374 |
| Integration Tests    |     1 |    40 |
+----------------------+-------+-------+
| Totals               |    74 |  2049 |
+----------------------+-------+-------+</pre>
<p>ESS&#8217;s code base is surprisingly small right now &#8211; that&#8217;s part of the beauty of Grails.  </p>
<h3>Branding with a graphic designer</h3>
<p><strong>This marks the first time that I&#8217;ve paid someone to help me with my business, and I couldn&#8217;t be happier</strong> with the job Christine did (and is still doing).  And it was fun.  Really, really fun.  To see an idea go from floating around in my head to something real was a very rewarding experience.  I&#8217;m so glad I decided to pony up the money and pay a professional to help with the branding and UI &#8211; I can guarantee that any design I would have come up with would have scared away any potential customers. <img src='http://www.juliesoft.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   Given my target market (young fiancés), I knew the design for ESS needed to look <em>good</em>.  Mission accomplished!</p>
<p>Here&#8217;s the final logo for ESS that Christine created:</p>
<p><a href="http://www.juliesoft.com/wp-content/uploads/2010/01/esslogo.png"><img src="http://www.juliesoft.com/wp-content/uploads/2010/01/esslogo.png" alt="Every Single Shot logo" title="Every Single Shot logo" width="400" height="198" class="size-full wp-image-274" /></a></p>
<p>See if you can figure out why I didn&#8217;t want to do the graphic design myself from the example below.  </p>
<p>I needed to put up one page at <a href="http://www.everysingleshot.com">www.everysingleshot.com</a> just to collect email addresses for my mailing list.  It needed to be simple, quick, and get the job done.  Here&#8217;s my take (click images for full size screenshots):</p>
<p><a href="http://www.juliesoft.com/wp-content/uploads/2010/01/homebefore.png"><img src="http://www.juliesoft.com/wp-content/uploads/2010/01/homebefore-300x196.png" alt="Before a graphic designer&#039;s touch" title="Before a graphic designer&#039;s touch" width="300" height="196" class="alignnone size-medium wp-image-275" /></a></p>
<p>And here&#8217;s the version I made after some help from Christine:</p>
<p><a href="http://www.juliesoft.com/wp-content/uploads/2010/01/homeafter.png"><img src="http://www.juliesoft.com/wp-content/uploads/2010/01/homeafter-300x223.png" alt="After a graphic designer&#039;s touch" title="After a graphic designer&#039;s touch" width="300" height="223" class="alignnone size-medium wp-image-276" /></a></p>
<p>But Christine didn&#8217;t just whip up some nice graphics, <strong>she also did great work with helping me define and focus ESS&#8217;s brand and marketing message</strong>.  As a developer first and a marketer last, I can&#8217;t understate how important it was to have a creative branding person helping me with this aspect of ESS.  I&#8217;ve been <a href="http://www.juliesoft.com/2009/11/marketing-books-for-small-businesses/">doing a lot of reading on branding and marketing</a> and I recognize their importance in creating a successful product, so I&#8217;m really thankful that Christine was able to help me so much with them.</p>
<p>Contact me (jon at juliesoft dot com) if you&#8217;re interested in having Christine do some work for you (I don&#8217;t want to plaster her email address on here) &#8211; I&#8217;ll forward your contact info to her.</p>
<h3>Hosting on Amazon&#8217;s cloud</h3>
<p>I used a combination of cloud (<a href="http://aws.amazon.com/ec2/">Amazon&#8217;s EC2</a>) and traditional (<a href="http://www.eapps.com/">eApps</a>) hosting platforms for <a href="http://www.sendalong.com">SendAlong</a>.  It worked well enough, but I didn&#8217;t like having to manage the two different environments.  Plus, the apps on the different platforms needed to talk to each other, and getting them to communicate reliably all the time was kind of difficult.  </p>
<p>This time I decided that I wanted to keep the hosting platform homogenous.  I also decided that there were at least a couple of different &#8220;cloud&#8221; services that ESS was going to use such as storage (like <a href="http://aws.amazon.com/s3/">Amazon&#8217;s S3</a>) and a CDN (like <a href="http://aws.amazon.com/cloudfront/">Amazon&#8217;s CloudFront</a>).  I researched a few different cloud hosting providers including <a href="http://aws.amazon.com/ec2/">Amazon EC2</a>, <a href="http://www.slicehost.com/">Slicehost</a>, <a href="http://www.rackspace.com/">Rackspace</a>, and <a href="http://www.joyent.com/">Joyent</a>.  I also found a great <a href="http://journal.uggedal.com/vps-performance-comparison">performance comparison of some cloud hosting providers</a>.  </p>
<p>Amazon and Joyent were the front runners, but I decided to go with Amazon mainly because <a href="http://status.aws.amazon.com/">they&#8217;re stable</a>, they&#8217;ve been around the block a few times, they&#8217;ve got good documentation, they&#8217;re fairly easy to use, the nice integration between all of their services&#8230;the list goes on.  I&#8217;m not saying Amazon&#8217;s services are right for everyone, but they suit my needs for Every Single Shot really well.  </p>
<p>After choosing a hosting provider, I needed to get a server set up.  That&#8217;s where the real fun came in.  (If you didn&#8217;t know I was a geek, the last two sentences are all the proof you need.)  </p>
<p>I&#8217;ve dabbled in Linux and the bulk of my command line experience has been in MS-DOS.  I&#8217;ve had a Mac for the last year and have gotten a little more comfortable with using a real command line, but all of <strong>that experience was nothing when stacked up to what I learned in the last two weeks while trying to build out a server with all the goodies ESS would need on EC2</strong>.  I wouldn&#8217;t have said that I was a command line n00b before two weeks ago, but now I think I can back it up.  Where have <a href="http://en.wikipedia.org/wiki/Pipeline_(Unix)">pipes</a>, <a href="http://www.computerhope.com/unix/ugrep.htm">grep</a>, and shell scripts been all of my life?</p>
<p>While I was working on configuring an Amazon EC2 <a href="http://docs.amazonwebservices.com/AWSEC2/2009-11-30/DeveloperGuide/index.html?ComponentsAMIs.html">AMI</a> to my liking (Apache, Tomcat, MySQL, etc.) I came across a <a href="http://alestic.com/">fantastic EC2 resource</a>.  If you&#8217;re running <a href="http://www.ubuntu.com/">Ubuntu</a> on EC2, or are trying to figure out what OS to use for your EC2 set up, <strong>have a long look at <a href="http://alestic.com">Eric Hammond&#8217;s alestic site</a></strong>.  Not only has Eric provided some top notch Ubuntu server AMIs, but the Canonical team (the people behind Ubuntu) has really embraced Amazon EC2 and provides several <a href="https://help.ubuntu.com/community/EC2StartersGuide#Getting the images">&#8220;official&#8221; Ubuntu AMIs</a> to get started with.  <strong>I feel completely comfortable using these things in production</strong> &#8211; it&#8217;s obvious that the Canonical team has put in a lot of work on their Ubuntu AMIs.  </p>
<p>The coolest thing about these Ubuntu images (I&#8217;m using ami-1515f67c on an EC2 small instance, btw) is that you don&#8217;t have to <a href="http://docs.amazonwebservices.com/AWSEC2/2009-11-30/DeveloperGuide/index.html?PreparingAndCreatingAMIs.html">rebundle</a> your own AMI on top of them (if you&#8217;ve worked with EC2 in the past you know what I&#8217;m talking about, and if you haven&#8217;t, then just trust me that this is a good thing).  This is where I learned about the wonderful world of <a href="http://en.wikipedia.org/wiki/Advanced_Packaging_Tool">apt-get</a>, which handles installing a lot of common software for you.  Having used Windows most of my life, I&#8217;m still not used to this, but <a href="http://en.wikipedia.org/wiki/Package_management_system">package managers</a> are one of the best things about the Linux platform.  Need to install Apache2?  sudo apt-get install apache2.  Need to install Tomcat6?  sudo apt-get install tomcat6.  Of course you&#8217;ll need to customize the installs sometimes, but that&#8217;s just a matter of writing a shell script.  </p>
<p>Since there&#8217;s no need to rebundle your own AMI, there must be a way to configure the base AMI easily, right?  Indeed, and of course <a href="http://alestic.com/2009/08/runurl">Eric Hammond has already taken care of that for me</a>.  <strong>With literally one command</strong>, I can launch an EC2 instance (for test or prod), attach a <a href="http://aws.amazon.com/about-aws/whats-new/2008/03/26/announcing-elastic-ip-addresses-and-availability-zones-for-amazon-ec2/">static IP address</a> to it, <a href="http://alestic.com/2009/05/mysql-ec2-ebs-apparmor-update">attach a persistent EBS volume to it</a> (for storing MySQL data), install every software package I need (Apache, Tomcat, MySQL, etc), check out ESS from source control and build it, and have it up in running in about 5 to 10 minutes.  This means that when I&#8217;m ready to test a new version of ESS, I can issue a command to do all of the above, plus run through all of my <a href="http://seleniumhq.org/">automated tests</a>.  As long as testing takes me less than 60 minutes, <strong>total cost out of pocket is 10 cents</strong>.  </p>
<p>Yes, I&#8217;ve heard that Amazon&#8217;s EC2 isn&#8217;t as fast as some of its competitors.  I&#8217;m willing to live with that for now, especially considering that I can run a new server with <a href="http://aws.amazon.com/ec2/instance-types/">10 times the RAM and CPU power</a> with a single command if I need to.  </p>
<p>(I&#8217;m going to write another post about EC2 and the other Amazon web services in the future that will have lots more helpful information &#8211; so remember to <a href="http://feeds.feedburner.com/changelog_jonchase">subscribe to my blog</a> if you haven&#8217;t already.)</p>
<h3>Timeline and goals</h3>
<p>I need to get a beta out soon.  <strong>I&#8217;ve been developing in a vacuum for too long.</strong>  My goal is for a February 15th beta release, then rapid iterations based on user feedback (<a href="http://www.everysingleshot.com">sign up if you want to help</a>), and then a 1.0 release on April 1st.  That should give ESS some time to get a bit of marketing traction before the heavy wedding season starts in May.</p>
<p>I&#8217;ve got big plans for ESS, so I&#8217;ve set some stretch goals.</p>
<ul>
<li>Goal #1: <strong>10% of income will go straight to charitable causes</strong> (that&#8217;s pre-tax, pre-expense income)</li>
<li>Goal #2: <strong>100 new paying customers per month by July 1st, 2010</strong> </li>
</ul>
<p>Do you have a suggestion on how I can improve these goals?  Leave a comment and help me out!</p>
<p>See you next week!</p>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/KDA9o2btPKY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2010/02/changelog-1-hacking-branding-and-ec2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2010/02/changelog-1-hacking-branding-and-ec2/</feedburner:origLink></item>
		<item>
		<title>Time for a change</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/MxyX5hEx3qw/</link>
		<comments>http://www.juliesoft.com/2009/12/time-for-a-change/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 06:38:55 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[ChangeLog]]></category>
		<category><![CDATA[Every Single Shot]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[everysingleshot]]></category>
		<category><![CDATA[juliesoft]]></category>
		<category><![CDATA[SendAlong]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/?p=242</guid>
		<description><![CDATA[The past
I&#8217;ve been blogging here since December, 2006.  In that time, I&#8217;ve covered lots of random topics, including building my first product.  I haven&#8217;t (yet) blogged about shutting it down, but that topic is on the short list to cover soon.  The last three years have been good, but things are about [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2009%2F12%2Ftime-for-a-change%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2009%2F12%2Ftime-for-a-change%2F" height="61" width="51" /></a></div><h3>The past</h3>
<p>I&#8217;ve been blogging here <a href="http://www.juliesoft.com/2006/12/starting-up/">since December, 2006</a>.  In that time, I&#8217;ve covered <a href="http://www.juliesoft.com/2007/10/measure-the-marketing-effectiveness-of-your-website/">lots</a> <a href="http://www.juliesoft.com/2007/10/non-invasive-captcha/">of</a> <a href="http://www.juliesoft.com/2007/11/trying-to-decide-on-a-payment-processor-for-credit-cards-on-web-site/">random</a> <a href="http://www.juliesoft.com/2007/07/better-hibernate-logging-with-log4j/">topics</a>, including building <a href="http://www.juliesoft.com/2007/08/ground-control-to-major-tom-close-to-lift-off/">my</a> <a href="http://www.juliesoft.com/2008/02/sendalong-10-is-out-more-info-coming-soon/">first</a> <a href="http://www.juliesoft.com/2008/02/sendalong-got-picked-up/">product</a>.  I haven&#8217;t (yet) blogged about <a href="http://www.sendalong.com">shutting it down</a>, but that topic is on the short list to cover soon.  The last three years have been good, but things are about to change.</p>
<p>During the 3+ years I&#8217;ve been blogging I&#8217;ve never had a plan for the blog.  If something <a href="http://www.juliesoft.com/2007/12/video-games-in-3d/">caught my attention</a>, I wrote about it.  There was no such thing as &#8220;off topic&#8221;, because there was also no such thing as &#8220;on topic&#8221;.  Although it&#8217;s been fun for me to write the blog, the quality of the content has  suffered for want of editorial direction.  </p>
<p>That&#8217;s changing as of now, and here&#8217;s why.  </p>
<h3>The present</h3>
<p>I&#8217;m working full time on a <a href="http://www.everysingleshot.com">new web app</a>.  <a href="http://www.everysingleshot.com">Every Single Shot</a> isn&#8217;t a side project.  Among other things, it&#8217;s my <strong>full time</strong> job.  Some might call this kind of set up a <a href="http://www.ericsink.com/bos/Micro_ISV.html">microISV</a>, some might call it a <a href="http://answers.onstartups.com">start up</a>, some might even call it a mom and pop joint (ok, no one would ever call it that).  I realize that I&#8217;m very, very lucky to have the luxury to be able to work on my business &#8211; my dream &#8211; full time.  I also realize that this is just the kind of thing that a lot of other hackers dream about on a daily basis while they&#8217;re <a href="http://www.imdb.com/title/tt0151804/">stuck at their dead end jobs</a>.  This is why I&#8217;ll be sharing the details of my adventures from now on.  </p>
<p class="aligncenter"><a href="http://www.juliesoft.com/wp-content/uploads/2009/12/797px-Monarch_Butterfly_Cocoon_2.jpg"><img src="http://www.juliesoft.com/wp-content/uploads/2009/12/797px-Monarch_Butterfly_Cocoon_2.jpg" alt="797px-Monarch_Butterfly_Cocoon_2" title="797px-Monarch_Butterfly_Cocoon_2" width="500" height="376" class="aligncenter size-full wp-image-244" /></a></p>
<h3>The future</h3>
<p>I&#8217;ll be chronicling my journey on a weekly basis, talking about what I&#8217;ve been working on, ideas I&#8217;ve had, and changes that have happened.  That&#8217;s why I&#8217;ve renamed the blog to <a href="http://www.juliesoft.com"><strong>ChangeLog</strong></a>.  (Actually, I&#8217;m not renaming it, I&#8217;m naming it.  It hasn&#8217;t had a name until now because it hasn&#8217;t had any direction until now.)  Just as a stereotypical <a href="http://en.wikipedia.org/wiki/Changelog">changelog</a> is to code, this blog is to me and my business: a place to record changes and happenings of interest.</p>
<p>It will be more than just a ChangeLog, though.  I&#8217;ll still be talking about <a href="http://groovy.codehaus.org/">Groovy</a> / <a href="http://grails.org/">Grails</a> (Grails is hands down the best web framework out there IMO, and I&#8217;ll have words with anyone who says otherwise).  I&#8217;ll be talking about small business, <a href="http://www.juliesoft.com/category/marketing/">marketing</a> (lots of marketing), branding, site optimization and testing, e-commerce&#8230;the list goes on.  But instead of talking about this or that with no context, I&#8217;ll filter future posts through the lens of my business and its products.  Less noise, more insight &#8211; that&#8217;s what I&#8217;m shooting for.</p>
<p>Since this post is meant to be a turning point in my blogging journey, I thought I&#8217;d finish by linking to one blog that has influenced me greatly up to this point.  This blog is one of my absolute favorites &#8211; the kind I where I read every post from start to finish, regardless of content, because invariably I learn something.  You should be reading this blog.</p>
<p><a href="http://www.balsamiq.com/blog/">Balsamiq blog</a> &#8211; <strong>READ THIS BLOG!</strong></p>
<p>(I use <a href="http://www.google.com/reader">Google Reader</a> to manage all of my blog subscriptions.  If you&#8217;re not using an RSS reader to keep updated on blogs, I suggest you <a href="http://www.google.com/reader">check out Reader</a>.)</p>
<p>If you haven&#8217;t already, please consider subscribing to the <a href="http://feeds.feedburner.com/changelog_jonchase">ChangeLog RSS feed</a> and/or following me on Twitter (<a href="http://www.twitter.com/jonchase">@jonchase</a>).</p>
<p><strong>Do you prefer blogs that have a specific focus, or those that are a bit more random?  What do you think of the direction I&#8217;m going to take my blog?  Leave a comment below and let me know.</strong></p>
<p class="citation">Cocoon picture courtesy of Greyson Orlando via <a href="http://commons.wikimedia.org/wiki/File:Monarch_Butterfly_Cocoon_2.jpg">Wikimedia</a>.</p>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/MxyX5hEx3qw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2009/12/time-for-a-change/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2009/12/time-for-a-change/</feedburner:origLink></item>
		<item>
		<title>Marketing Books for Small Businesses</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/pPrFHVmKzRo/</link>
		<comments>http://www.juliesoft.com/2009/11/marketing-books-for-small-businesses/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 07:31:44 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[reading]]></category>
		<category><![CDATA[sales]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/?p=214</guid>
		<description><![CDATA[Someone just posted a question over on the Business of Software forum asking for recommendations on books and blogs related to sales.  Since I&#8217;ve been doing a lot of reading on marketing (I know, marketing isn&#8217;t sales, but they go hand in hand), I figured I&#8217;d post my reading list so that others might [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2009%2F11%2Fmarketing-books-for-small-businesses%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2009%2F11%2Fmarketing-books-for-small-businesses%2F" height="61" width="51" /></a></div><p>Someone just <a href="http://discuss.joelonsoftware.com/default.asp?biz.5.788679.1">posted a question</a> over on the <a href="http://discuss.joelonsoftware.com/?biz">Business of Software</a> forum asking for recommendations on books and blogs related to sales.  Since I&#8217;ve been doing a lot of reading on marketing (I know, marketing isn&#8217;t sales, but they go hand in hand), I figured I&#8217;d post my reading list so that others might benefit.</p>
<p>Here are the marketing books I&#8217;ve read recently:</p>
<ul>
<li><a href="http://bit.ly/3YAv9t">Inbound Marketing</a></li>
<li><a href="http://bit.ly/2hjFum">Duct Tape Marketing</a></li>
<li><a href="http://bit.ly/o4hp">The 22 Immutable Laws of Branding</a> (I recently wrote a <a href="http://www.juliesoft.com/2009/10/the-22-immutable-laws-of-branding-summary/">summary of this book</a>)</li>
</ul>
<p>Here are a few books that I haven&#8217;t read yet but look good:</p>
<ul>
<li><a href="http://bit.ly/35im2q">The 22 Immutable Laws of Marketing</a></li>
<li><a href="http://bit.ly/33vRjt">The New Rules of Marketing and PR </a></li>
<li><a href="http://bit.ly/3ON1zg">Word of Mouth Marketing</a></li>
<li><a href="http://bit.ly/3zA9tq">Crossing the Chasm</a></li>
</ul>
<p>Happy reading!</p>
<p>And no, the above are <strong>not</strong> affiliate links. <img src='http://www.juliesoft.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>What about you?  Read any good books (marketing/sales related or otherwise) lately?  Leave a quick comment below and share them with everybody.</p>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/pPrFHVmKzRo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2009/11/marketing-books-for-small-businesses/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2009/11/marketing-books-for-small-businesses/</feedburner:origLink></item>
		<item>
		<title>Double your productivity with 1 tip</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/fAviNo0DjtM/</link>
		<comments>http://www.juliesoft.com/2009/11/double-your-productivity-with-1-tip/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 17:25:13 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[time saver]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/?p=197</guid>
		<description><![CDATA[Starting a business is a lot of work, especially when you&#8217;re doing it all yourself.  I need all the hours I can get in a day, so I came up with a handy little practice that&#8217;s really increased my productivity.  Yes, I&#8217;d even say it&#8217;s doubled it (hmmm&#8230;does that mean it was abnormally [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2009%2F11%2Fdouble-your-productivity-with-1-tip%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2009%2F11%2Fdouble-your-productivity-with-1-tip%2F" height="61" width="51" /></a></div><p>Starting <a href="http://www.juliesoft.com">a business</a> is a lot of work, especially when you&#8217;re doing it all yourself.  I need all the hours I can get in a day, so I came up with a handy little practice that&#8217;s really increased my productivity.  Yes, I&#8217;d even say it&#8217;s doubled it (hmmm&#8230;does that mean it was abnormally low to begin with?).  Your mileage may vary, of course, but if you follow this advice <strong>and stick to it</strong>, it&#8217;s just about impossible to not see your productivity go up.</p>
<h3>The Trick</h3>
<p>So what is it?  What is the miracle of productivity tips that has naught been divined hence?  </p>
<p>Simple: when you sit down to work, set a timer.  Work your butt off until that timer buzzes, then take a break.  Lather, rinse, repeat until it&#8217;s time to go home.  Let me explain.</p>
<p>I find I can concentrate steadily for about 2 hours at a time.  So I set the timer for 2 hours.  Once the 2 hours is up, I take a 15 minute break (using the timer), during which time I&#8217;m checking blogs, twitter, Facebook, or most importantly &#8211; playing with the dog.  Lunch time is a little different &#8211; I typically take 45 minutes to an hour.  I get in four quality 2-hour work sessions every day with little to no distraction.  This, in my opinion, is awesome.</p>
<h3>How it Works</h3>
<p>Why does this work so well?  For me, it&#8217;s the assurance of knowing I&#8217;ll be able to goof off soon enough.  That way, I feel compelled to concentrate for 2 hours because I know I&#8217;ll be immediately rewarded at the end of it.  But during the breaks, anything goes, and since I&#8217;ve just worked for 2 hours, I don&#8217;t feel guilty <a href="http://www.peopleofwalmart.com/">goofing off a bit</a>.</p>
<h3>Timers to Try</h3>
<p>If you want to give this a try, I can recommend a few timers.  If you&#8217;ve got an iPhone or iPod touch, just use the Timer app that comes with it (make sure you turn the volume up so you can hear the timer go off).  If you run OS X, give a timer dashboard widget a try.  There are two that I like: <a href="http://www.metabang.com/widgets/stop-it/index.html">Stop It!</a> (my fav) and <a href="http://xerxes.sofa-rockers.org/">Tea Timer</a>.  If you run Windows, uhhhh&#8230;do you own an egg timer? <img src='http://www.juliesoft.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Bonus</h3>
<p>Bonus tip:  write your todo&#8217;s for the day down.  Tackle the tough creative ones in the morning (especially the ones you&#8217;re dreading).  You&#8217;ll feel a since of accomplishment and be motivated to do the boring stuff.  Do the administrative stuff and email after lunch.</p>
<p>Bonus bonus tip: <strong>don&#8217;t do personal email at work</strong>!</p>
<p>What do you think?  Do you have any easy productivity tips of your own you&#8217;d like to share?  Comment below!</p>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/fAviNo0DjtM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2009/11/double-your-productivity-with-1-tip/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2009/11/double-your-productivity-with-1-tip/</feedburner:origLink></item>
		<item>
		<title>The 22 Immutable Laws of Branding – Summary</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/1Bzx4JxXHAQ/</link>
		<comments>http://www.juliesoft.com/2009/10/the-22-immutable-laws-of-branding-summary/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 08:14:46 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Marketing]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/2009/10/26/the-22-immutable-laws-of-branding-summary/</guid>
		<description><![CDATA[UPDATE Looking for more marketing books?  Here&#8217;s a list of good ones that I&#8217;ve read recently (or am planning to read).
I just read The 22 Immutable Laws of Branding and was happy that I set aside a couple of hours to do so. 
I&#8217;m currently working on a new product and a lot of [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2009%2F10%2Fthe-22-immutable-laws-of-branding-summary%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2009%2F10%2Fthe-22-immutable-laws-of-branding-summary%2F" height="61" width="51" /></a></div><p class="info"><strong>UPDATE</strong> Looking for more marketing books?  <a href="http://www.juliesoft.com/2009/11/marketing-books-for-small-businesses/">Here&#8217;s a list of good ones</a> that I&#8217;ve read recently (or am planning to read).</p>
<p>I just read <a href="http://www.amazon.com/22-Immutable-Laws-Branding/dp/0060007737">The 22 Immutable Laws of Branding</a> and was happy that I set aside a couple of hours to do so. </p>
<p>I&#8217;m currently working on a new product and a lot of the material was relevant to me.  I&#8217;ve read a few books on marketing, but nothing specifically on branding.  This book has whet my appetite for more.  </p>
<p>Here are my notes:</p>
<ul>
<li>Generate publicity, not advertising.  Best way to get publicity?  Announce a new category, not a new product.                </li>
<li>Claim your product is a &quot;leader&quot;, not &quot;better&quot;.  All products claim they are better, but you can&#8217;t argue with leader.          </li>
<li>Own a word.  Like &quot;luxury&quot;.                                                                                           </li>
<li>Perception of quality is built by a narrowly focused brand, a high price, and a better name.                                  </li>
<li>Promote the category, not the brand, and be first in the category so that your brand is associated with the category.        </li>
<li>Expand a brand, reduce its power.  Contract a brand, increase its power.                                                     </li>
<li>Welcome other brands in order to build the category.                                                                         </li>
<li>Generic brand name = bad                                                                                                     </li>
<li>Select a brand color opposite of that of your main competitor&#8217;s.                                                             </li>
<li>Consistency is key.  Never change your brand, ever.                                                                          </li>
<li>What&#8217;s a brand?  A proper noun that can be used in place of a word.                                                          </li>
</ul>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/1Bzx4JxXHAQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2009/10/the-22-immutable-laws-of-branding-summary/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2009/10/the-22-immutable-laws-of-branding-summary/</feedburner:origLink></item>
		<item>
		<title>Installing SpringSource Tool Suite (STS) with Groovy and Grails Support</title>
		<link>http://feedproxy.google.com/~r/Sendalongcom-Blog/~3/GwAGa_lCFBE/</link>
		<comments>http://www.juliesoft.com/2009/10/installing-springsource-tool-suite-sts-with-groovy-and-grails-support/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 06:34:31 +0000</pubDate>
		<dc:creator>Jon Chase</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.juliesoft.com/2009/10/22/installing-springsource-tool-suite-sts-with-groovy-and-grails-support/</guid>
		<description><![CDATA[UPDATE There&#8217;s an excellent article on the Grails website that walks through installing and using STS with Grails support.  I recommend you use that guide instead of the one below.
STS 2.2.0 was released today with support for Groovy and Grails development.  If you&#8217;re new to STS, the route to getting everything working might [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.juliesoft.com%2F2009%2F10%2Finstalling-springsource-tool-suite-sts-with-groovy-and-grails-support%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.juliesoft.com%2F2009%2F10%2Finstalling-springsource-tool-suite-sts-with-groovy-and-grails-support%2F" height="61" width="51" /></a></div><p class="info"><strong>UPDATE</strong> There&#8217;s an <a href="http://www.grails.org/STS+Integration">excellent article</a> on the <a href="http://www.grails.org">Grails</a> website that walks through installing and using STS with Grails support.  I recommend you <a href="http://www.grails.org/STS+Integration">use that guide</a> instead of the one below.</p>
<p><a href="http://www.springsource.com/products/sts">STS 2.2.0 was released today</a> with support for <a href="http://groovy.codehaus.org/">Groovy</a> and <a href="http://grails.org/">Grails</a> development.  If you&#8217;re new to STS, the route to getting everything working might not be clear.  The following walks you through installing STS, the Groovy plugin, and finally, the Grails plugin.</p>
<ol>
<li>First <a href="http://www.springsource.com/products/eclipse-downloads">download and install STS</a>.  STS comes bundled with a full Eclipse installation, so you don&#8217;t need to download Eclipse first.</li>
<li>Now for the Groovy plugin (required for Grails).  Open STS, and go to <strong>Help</strong> -&gt; <strong>Install New Software</strong>.  Add the Groovy Codehaus site: <a href="http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.5/">http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.5/</a>.  Now install the Groovy plugin from the site you just added.  I installed 2 plugins actually, the <strong>Groovy Compilers</strong> and <strong>Groovy-Eclipse plugin</strong> options.  Restart STS when the install is complete.</li>
<li>Now you can install the Grails plugin.  In STS, go to <strong>Help</strong> -&gt; <strong>Install New Software</strong> again.  This time choose the <strong>Spring Source Update Site for Eclipse 3.5</strong>.  Under <strong>Extensions / STS</strong>, choose the <strong>SpringSource Tool Suite Grails Support</strong>.  Install and restart STS.</li>
<li>Create a new Grails project by going to the new project wizard and selecting <strong>Grails Project</strong> under the <strong>Groovy</strong> folder.</li>
<li>The project creation screen will say that you don&#8217;t have a Grails installation configured.  Just click the <strong>Configure Grails Installations&#8230;</strong> link, then <strong>Add</strong>, then <strong>Browse</strong>, and navigate to <strong>&lt;YOUR_STS_INSTALL_DIR&gt;/grails-&lt;version&gt;</strong> and choose that directory.  Then give it a name and click OK.</li>
<li>Give the project a name and click OK to create a new Grails project.  Give Eclipse a few seconds to finish creating your Grails project and you should be ready to go.</li>
</ol>
<p>That&#8217;s as far as I&#8217;ve gotten so far.  If you&#8217;ve got any tips or advice, please feel free to leave a comment.  Here&#8217;s to hoping that the Groovy and Grails plugins are high quality!</p>
<img src="http://feeds.feedburner.com/~r/Sendalongcom-Blog/~4/GwAGa_lCFBE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.juliesoft.com/2009/10/installing-springsource-tool-suite-sts-with-groovy-and-grails-support/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.juliesoft.com/2009/10/installing-springsource-tool-suite-sts-with-groovy-and-grails-support/</feedburner:origLink></item>
	</channel>
</rss><!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->

