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

<channel>
	<title>Fresh Click Media</title>
	<atom:link href="http://www.freshclickmedia.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.freshclickmedia.com</link>
	<description></description>
	<pubDate>Thu, 12 Jun 2008 20:57:39 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>ASP.NET Gravatar Control Update - Full Source Included</title>
		<link>http://www.freshclickmedia.com/blog/2008/06/aspnet-gravatar-control-update-full-source-included/</link>
		<comments>http://www.freshclickmedia.com/blog/2008/06/aspnet-gravatar-control-update-full-source-included/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 20:45:32 +0000</pubDate>
		<dc:creator>shane</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Blogging]]></category>

		<guid isPermaLink="false">http://www.freshclickmedia.com/?p=88</guid>
		<description><![CDATA[<img src="http://farm4.static.flickr.com/3047/2573024373_ba7d7eb151_o.jpg" alt="Gravatar ASP.NET Control" class="header" />

With <a href="http://www.gravatar.com">gravatar</a>s now becoming ubiquitous in blogs and forums, I have developed an ASP.NET Control that encapsulates their functionality in a simple, reusable component.  It's so easy to use, you can download and be using it on your ASP.NET sites within minutes.

I've since had a lot of interest in the source code for the control, and so this post describes how the control works, as well as providing a download containing the control, as well as the full control source and example website that uses the control.]]></description>
			<content:encoded><![CDATA[<p><img class="header" src="http://farm4.static.flickr.com/3047/2573024373_ba7d7eb151_o.jpg" alt="Gravatar ASP.NET Control" /></p>
<p>With <a href="http://www.gravatar.com">gravatar</a>s now becoming ubiquitous in blogs and forums, I have developed an ASP.NET Control that encapsulates their functionality in a simple, reusable component.  It&#8217;s so easy to use, you can download and be using it on your ASP.NET sites within minutes.</p>
<p>I <a href="http://www.freshclickmedia.com/blog/2008/02/gravatar-aspnet-control/">introduced the control</a> in February of 2008, and <a href="http://www.freshclickmedia.com/blog/2008/03/gravatar-control-update/">updated the functionality</a> in March of 2008.</p>
<p>I&#8217;ve since had a lot of interest in the source code for the control, and so this post describes how the control works, as well as providing a download containing the control, as well as the full control source and example website that uses the control.</p>
<h3>OK, let me download it already!</h3>
<p><a href='http://www.freshclickmedia.com/wp-content/uploads/2008/06/gravatar.zip'>Download the Control</a> and get started.  Note that the demo projects included in the ZIP were written in Visual Studio 2005, so if you&#8217;re using Visual Studio 2008, you&#8217;ll need to convert the solution.  If you&#8217;ve not done a conversion before, just follow the instructions that Visual Studio provides.  Please also note that the solution will not open in Express Editions, since they do not support control projects.  However, you can still use the control that&#8217;s included in the ZIP file.</p>
<p>Unzip the .zip download, and you&#8217;ll have the following folder structure:</p>
<p><img src="http://farm4.static.flickr.com/3098/2573846412_eac00df65b_o.jpg" alt="Unzipped Folder structure" /></p>
<p>The root contains a small readme file, Visual Studio solution, FreshClickmedia.dll - the gravatar control assembly, Freshclickmedia.Web control project and GravatarSite website, which contains a few control examples.</p>
<p>Opening the solution in visual studio will give you this solution structure:</p>
<p><img src="http://farm4.static.flickr.com/3075/2573846554_66538578c4_o.jpg" alt="Gravatar Solution" /></p>
<p>Fire up the website, and you should see something like this:</p>
<p><img src="http://farm4.static.flickr.com/3255/2573846346_c648276ae6_o.jpg" alt="Gravatar Demo Website" /></p>
<h3>Examining the Code</h3>
<pre class="code">
    &lt;h1&gt;Gravatar Examples&lt;/h1&gt;

    &lt;h2&gt;My email address, size of 80 pixels:&lt;/h2&gt;
        &lt;fcm:Gravatar ID=&quot;Gravatar1&quot; runat=&quot;server&quot; Email=&quot;youremailaddress@domain.com&quot;
             OutputGravatarSiteLink=&quot;true&quot; Size=&quot;80&quot; /&gt;

    &lt;h2&gt;No email address, with default image (absolute url) specified:&lt;/h2&gt;
        &lt;fcm:Gravatar ID=&quot;Gravatar2&quot; runat=&quot;server&quot; Size=&quot;80&quot; DefaultImage=&quot;http://farm3.static.flickr.com/2375/2552064340_192825f989_o.jpg&quot; /&gt;

    &lt;h2&gt;Email address not associated with Gravatar, with no default image:&lt;/h2&gt;
        &lt;fcm:Gravatar ID=&quot;Gravatar3&quot; runat=&quot;server&quot; Email=&quot;thisemaildoesnotexist@freshclickmedia.com&quot; Size=&quot;80&quot;  /&gt;
</pre>
<p>The control requires an email address:</p>
<pre class="code">
&lt;fcm:Gravatar ID=&apos;Gravatar1&apos; runat=&apos;server&apos; Email=&apos;username@domain.com&apos; /&gt;
</pre>
<p>For my email address, I get the following generated HTML:</p>
<p><img src="http://farm3.static.flickr.com/2181/2283724305_24797cd8d5_o.gif" width="505" height="208" alt="Output for my email address" /></p>
<p>And if we look at the generated source:</p>
<pre class="code">
&lt;a id=&quot;Gravatar1&quot; href=&quot;http://www.gravatar.com&quot; title=&quot;Get your avatar&quot;&gt;&lt;img width=&quot;80&quot; height=&quot;80&quot; src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=ccf3b8c638f15d005e5d070aeb1a3923&amp;rating=G&amp;size=80&quot; alt=&quot;Gravatar&quot; /&gt;&lt;/a&gt;
</pre>
<p>The default produces a hyperlink off to the <a href="http://www.gravatar.com">Gravatar</a> site with a title &#8220;Get your avatar&#8221;.  The image contains the MD5 email hash, a rating of &#8220;G&#8221; (suitable for all audience types), and a size of 80.</p>
<h3>Customisation</h3>
<p>The control supports a number of properties supporting the customisation of its output.</p>
<h4>Size</h4>
<p>The size property of the control can be in the range 1 to 80.  If it is outside this range, a default of 80 will be used.</dd>
<h4>MaxAllowedRating</h4>
<p>The &#8216;highest&#8217; allowed rating of image.</p>
<ul>
<li>A G rated gravatar is suitable for display on all websites with any audience type.</li>
<li>PG rated gravatars contain may contain rude gestures, provocatively dressed individuals, the lesser swear words, or mild violence.</li>
<li>R rated gravatars may contain such things as harsh profanity, intense violence, nudity, or hard drug use.</li>
<li>X rated gravatars may contain hardcore sexual imagery or extremely disturbing violence.</li>
</ul>
<h4>OutputGravatarSiteLink</h4>
<p>True by default, determines whether a hyperlink linking to the gravatar website will be output around the image.</p>
<h4>LinkTitle</h4>
<p>&#8220;Get your avatar&#8221; by default, allows the customisation of the &#8216;title&#8217; attribute of the link (obviously doesn&#8217;t apply if OutputGravatarSiteLink property is set to false.)</p>
<h4>DefaultImage</h4>
<p>URL encoded URL, protocol included, of a GIF, JPEG, or PNG image that should be returned if either the requested email address has no associated gravatar, or that gravatar has a rating higher than is allowed by the &#8220;MaxAllowedRating&#8221; property.</p>
<p>The code snippet below shows the associated properties.</p>
<pre class="code">
&lt;fcm:Gravatar ID=&quot;Gravatar1&quot; runat=&quot;server&quot;
    Email=&quot;username@domain.com&quot;
    DefaultImage=&quot;http://www.site.com/default.jpg&quot;
    OutputGravatarSiteLink=&quot;true&quot; Size=&quot;40&quot; /&gt;
</pre>
<h3>Examining the control code</h3>
<p>The Gravatar control derives from <code>System.Web.UI.WebControls.WebControl</code> and overrides the <code>Render</code> method.</p>
<p>The various properties such as Email are all implemented as simple C# properties, with various attributes depending on the property.</p>
<pre class="code">
[Bindable(true), Category(&quot;Appearance&quot;), DefaultValue(&quot;80&quot;)]
public short Size
{
	get
	{
		return _size;
	}
	set
	{
		_size = value;
	}
}
</pre>
<p>These properties are then used in the <code>Render</code> method to write out HTML using the method&#8217;s <code>HtmlTextWriter</code> parameter.</p>
<p>The <code>Render</code> method begins by adding the default attributes to the render, ensuring that the size is within the valid range of 1 to 512, and initialises the gravatar URL:</p>
<pre class="code">
AddAttributesToRender(output);

// if the size property has been specified, ensure it is a short, and in the range
// 1..512:
try
{
    // if it's not in the allowed range, throw an exception:
    if (Size &lt; 1 || Size &gt; 512)
        throw new ArgumentOutOfRangeException();
}
catch
{
    Size = 80;
}

// default the image url:
string imageUrl = &quot;http://www.gravatar.com/avatar.php?&quot;;
</pre>
<p>If an Email address has been supplied, the <code>MD5CryptoServiceProvider</code> hashes the email and a <code>StringBuilder</code> converts this to the required format:</p>
<pre class="code">
if( !string.IsNullOrEmpty( Email))
{
    // build up image url, including MD5 hash for supplied email:
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

    UTF8Encoding encoder = new UTF8Encoding();
    MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();

    byte[] hashedBytes = md5Hasher.ComputeHash(encoder.GetBytes(Email));

    StringBuilder sb = new StringBuilder(hashedBytes.Length * 2);
    for (int i = 0; i &lt; hashedBytes.Length; i++)
    {
        sb.Append(hashedBytes[i].ToString(&quot;X2&quot;));
    }

    // output parameters:
    imageUrl += &quot;gravatar_id=&quot; + sb.ToString().ToLower();
    imageUrl += &quot;&amp;rating=&quot; + MaxAllowedRating.ToString();
    imageUrl += &quot;&amp;size=&quot; + Size.ToString();
}
</pre>
<p>The final part of the method assigns a default image, if one has been specified, outputs the site ink, if required, outputs the required attributes and tags.</p>
<pre class="code">
// output default parameter if specified
if (!string.IsNullOrEmpty(DefaultImage))
{
    imageUrl += &quot;&#038;default=&quot; + HttpUtility.UrlEncode(DefaultImage);
}

// if we need to output the site link:
if (OutputGravatarSiteLink)
{
    output.AddAttribute(HtmlTextWriterAttribute.Href, &quot;http://www.gravatar.com&quot;);
    output.AddAttribute(HtmlTextWriterAttribute.Title, LinkTitle);
    output.RenderBeginTag(HtmlTextWriterTag.A);
}

// output required attributes/img tag:
output.AddAttribute(HtmlTextWriterAttribute.Width, Size.ToString());
output.AddAttribute(HtmlTextWriterAttribute.Height, Size.ToString());
output.AddAttribute(HtmlTextWriterAttribute.Src, imageUrl);
output.AddAttribute(HtmlTextWriterAttribute.Alt, &quot;Gravatar&quot;);
output.RenderBeginTag(&quot;img&quot;);
output.RenderEndTag();

// if we need to output the site link:
if (OutputGravatarSiteLink)
{
    output.RenderEndTag();
}
</pre>
<h3>Using the control on your own projects</h3>
<p>As previously mentioned, the download solution will not open properly in Express versions of Visual Studio, since it does not support control projects, but the control, included in the download is supported by all versions of Visual Studio, 2005 and later.</p>
<p>The easiest way to use the control is to add the control to the toolbox.  To do this, ensure that you are in design mode (looking at a web page), and right click on the &#8216;Standard&#8217; group header of the Toolbox.  From the context menu, select &#8220;Choose Items&#8221; and browse to the assembly (Freshclickmedia.Web.dll), and click “OK” to add.</p>
<p><img src="http://farm3.static.flickr.com/2064/2283724303_c96532e03b_o.gif" alt="Adding the control to the toolbox" width="505" height="361"  /></p>
<p>Once you&#8217;ve added the assembly, you should see the following:</p>
<p><img src="http://farm4.static.flickr.com/3170/2573127429_02824b40fd_o.jpg" alt="Gravatar Toolbox Item" /></p>
<p>From there, you can drag the control onto your page and start having fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshclickmedia.com/blog/2008/06/aspnet-gravatar-control-update-full-source-included/feed/</wfw:commentRss>
		</item>
		<item>
		<title>3G iPhone first reaction</title>
		<link>http://www.freshclickmedia.com/blog/2008/06/3g-iphone-first-reaction/</link>
		<comments>http://www.freshclickmedia.com/blog/2008/06/3g-iphone-first-reaction/#comments</comments>
		<pubDate>Mon, 09 Jun 2008 21:02:30 +0000</pubDate>
		<dc:creator>shane</dc:creator>
		
		<category><![CDATA[Admiration]]></category>

		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.freshclickmedia.com/?p=87</guid>
		<description><![CDATA[<img src="http://farm4.static.flickr.com/3158/2565839588_7f103815eb_o.jpg" alt="iPhone" class="header" />

I was extremely excited about the Worldwide Developer Conference 2008, and so headed off to <a href="http://www.macrumorslive.com/">macrumors.com</a> for a live feed of Steve Jobs' keynote.

After a rather slow build-up, the almost inevitable announcement from Jobs that the 3G iteration of the iPhone was made.  And so, there must follow an end to the enormous amount of speculation in blogs and forums about the features of the second generation iPhone.]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm4.static.flickr.com/3158/2565839588_7f103815eb_o.jpg" class="header" alt="iPhone" /></p>
<p>I was extremely excited about the Worldwide Developer Conference (WWDC) 2008, and so headed off to <a href="http://www.macrumorslive.com/">macrumors.com</a> for a live feed of Steve Jobs&#8217; keynote.</p>
<p>After a rather slow build-up, the almost inevitable announcement from Jobs that the 3G iteration of the iPhone was made.  And so, there must follow an end to the enormous amount of speculation in blogs and forums about the features of the second generation iPhone.</p>
<p>As I saw the updates on <a href="http://www.macrumorslive.com/">macrumors.com</a>, I was pleased, but not particularly surprised to see the following features:</p>
<ul>
<li>3G speed.  No great revelation - many of us Europeans saw the lack of 3G in first geneation as a serious drawback;</li>
<li>GPS.  Once again, this is now becoming standard on high-end mobiles such as Nokia&#8217;s <a href="http://europe.nokia.com/phones/n95">N95</a>, so there was almost an expectation that this would feature.</li>
<li>App Store.  I welcome the addition of an app store - extending the functionality of the device is most useful, and it&#8217;s an additional revenue stream for apple.</li>
<li>&#8216;iPhone in Enterprise&#8217;.  Push e-mail and integration with Microsoft Exchange ActiveSync is a big plus for business users.  Should <a href="http://www.blackberry.com/">Blackberry</a> be worried?</li>
<li>Now available in white.  No doubt there will be a pink version soon.  I&#8217;ll stick with black, thanks.</li>
</ul>
<p>The App Store interests me - particularly the iPhone version of Super Monkey Ball.  The built-in accelerometer suits the game very well, and I look forward to playing some games on a mobile platform.</p>
<p>What struck me more than anything, and something that was lacking from much speculation was the price.  Although it&#8217;s somewhat irksome, considering I paid over £200 for my phone, I was shocked at the price of the new iPhone.  $199 for the 8Gb version, and $299 for the 16Gb version is quite amazing, <em>but</em> let&#8217;s wait a little to see what carriers charge for a contract, and how long the minimum contract term will be.  </p>
<p><img src="http://farm4.static.flickr.com/3105/2565015971_5cfa8515a9_o.jpg" alt="O2 website, 9 June 2008" /></p>
<p>Shortly after the announcement, <a href="http://www.apple.com/uk">Apple&#8217;s UK site</a> was updated with the 3G iPhone details, and UK iPhone carrier O<sub>2</sub>&#8217;s followed with a &#8216;come back tomorrow&#8217; teaser.</p>
<p>Well, I reckon that the 8Gb price will be £129 in the UK with an 18 month or perhaps even a 24 month contract.  How much an upgrade will cost is anybody&#8217;s guess, but hopefully, as the O<sub>2</sub> website states, all will be revealed tomorrow.</p>
<p>So, much of the speculation was correct, and although the price point is certainly attactive, I&#8217;m surprised about the camera remaining at its current specs of 2 megapixel.  Whilst I think that this is ok, it doesn&#8217;t deal with any kind of movement at all well, and the delay is not acceptable.  Perhaps a flash would have been too large a drain on battery life; increasing the megapixels, but not including a flash would have been an even stranger position than doing nothing at all.  Perhaps we&#8217;ll see that in the third generation, along with the pink colour scheme.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshclickmedia.com/blog/2008/06/3g-iphone-first-reaction/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Fun with fractals in Paint.NET</title>
		<link>http://www.freshclickmedia.com/blog/2008/05/fun-with-fractals-in-paintnet/</link>
		<comments>http://www.freshclickmedia.com/blog/2008/05/fun-with-fractals-in-paintnet/#comments</comments>
		<pubDate>Tue, 27 May 2008 19:55:40 +0000</pubDate>
		<dc:creator>shane</dc:creator>
		
		<category><![CDATA[Graphics]]></category>

		<guid isPermaLink="false">http://www.freshclickmedia.com/?p=86</guid>
		<description><![CDATA[<img src="http://farm3.static.flickr.com/2044/2529047510_6774b0b84a_o.png" height="147" width="590" alt="Mandelbrot Fractal generated with Paint.NET" />

I had an 80s flashback today as I fired up image editing freebie <a href="http://www.getpaint.net">Paint.NET</a> and accidentally discovered the <a href="http://en.wikipedia.org/wiki/Mandelbrot_fractal">Mandelbrot Fractal</a> render effect.  It took me back to the days of waiting for each row of pixels to be generated on my <a href="http://en.wikipedia.org/wiki/Atari_st">Atari ST</a>.  I began to experiment with a few images.]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm3.static.flickr.com/2044/2529047510_6774b0b84a_o.png" height="147" width="590" alt="Mandelbrot Fractal generated with Paint.NET" /></p>
<p>I had an 80s flashback today as I fired up image editing freebie <a href="http://www.getpaint.net">Paint.NET</a> and accidentally discovered the <a href="http://en.wikipedia.org/wiki/Mandelbrot_fractal">Mandelbrot Fractal</a> render effect.  It took me back to the days of waiting for each row of pixels to be generated on my <a href="http://en.wikipedia.org/wiki/Atari_st">Atari ST</a>.  I began to experiment with a few images.</p>
<p>To invoke the effect, you just need to select the &#8220;Mandelbrot Fractal&#8221; from the Render effects menu item.  </p>
<p><img src="http://farm3.static.flickr.com/2135/2528225985_e62f173453_o.png" alt="Selecting the effect from the Paint.NET menu" width="442" height="236" /></p>
<p>So, let&#8217;s take this image:</p>
<p><img src="http://farm4.static.flickr.com/3242/2528225343_a87fde3f1b_o.png" width="590" height="384" alt="First image before effect" /></p>
<p>Applying the effect gives us:</p>
<p><img src="http://farm3.static.flickr.com/2073/2528225899_db4e92d221_o.png" width="590" height="384" alt="First image after effect has been applied" /></p>
<p>And to a second image:</p>
<p><img src="http://farm3.static.flickr.com/2156/2528226747_7f84a90109_o.png" width="590" height="494" alt="Second image before effect" /></p>
<p>gives us:</p>
<p><img src="http://farm4.static.flickr.com/3115/2528227141_e2f9ed7abf_o.png" width="590" height="494" alt="Second image after effect has been applied" /></p>
<p>There a number of effect options such as zoom factor, quality and angle, but I thought it was quite fun that some images of my youth could be reproduced very easily with a variety of source images.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshclickmedia.com/blog/2008/05/fun-with-fractals-in-paintnet/feed/</wfw:commentRss>
		</item>
		<item>
		<title>I hate being right.  Sometimes.</title>
		<link>http://www.freshclickmedia.com/blog/2008/04/i-hate-being-right-sometimes/</link>
		<comments>http://www.freshclickmedia.com/blog/2008/04/i-hate-being-right-sometimes/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 12:49:25 +0000</pubDate>
		<dc:creator>shane</dc:creator>
		
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.freshclickmedia.com/?p=85</guid>
		<description><![CDATA[With an inevitability almost matching that of a self-service checkout announcing &#8216;unexpected item in bagging area&#8217;, there has been an iPhone price-cut in the UK.  Whilst my post about iPhone predictions wasn&#8217;t the greatest prediction of all time, a price-cut is almost equally unwelcome.

The Times Online article also describes a much larger price reduction [...]]]></description>
			<content:encoded><![CDATA[<p>With an inevitability almost matching that of a self-service checkout announcing &#8216;unexpected item in bagging area&#8217;, there has been an iPhone price-cut in the UK.  Whilst my post about <a href="http://www.freshclickmedia.com/blog/2008/03/second-generation-iphone-out-soon/">iPhone predictions</a> wasn&#8217;t the greatest prediction of all time, a price-cut is almost equally unwelcome.<br />
<span id="more-85"></span><br />
The <a href="http://technology.timesonline.co.uk/tol/news/tech_and_web/article3757443.ece">Times Online article</a> also describes a much larger price reduction of £237 (75%) in Germany.  I take little comfort from the knowledge that there must be many thousands of disgruntled iPhone-owning Germans.</p>
<p>The reduction of £100 to £169 for the 8Gb version is a &#8216;limited&#8217; offer that runs until June 1, but I suspect that alongside the low stocks and zero-replenishment of iPhones, that a new 3G version is on the cards.  Industry speculation continues to put a release date as early as June or July of this year.</p>
<p>I have also seen various reports that there will a refund of £100 for customers who&#8217;ve bought their 8Gb iPhone in the last 30 days.  This pleased me - I had bought mine in that period, so I was covered.  However, having gone into a local O<sub>2</sub> shop, I was shown an e-mail received by an employee that detailed the refund period as only 14 days.  So - I&#8217;m confused as to whether I will get any kind of refund.  An <a href="http://customerforum.o2.co.uk/viewtopic.php?t=1122&#038;sid=b4d8b7a62c0c0568b6e5fe3a0fad474c">O</sub>2</sub> forum post</a> is positive, but I&#8217;ll have to give them a call and find out.</p>
<p>Technological advance is both exciting and risky - buying the latest kit will incur a financial penalty, but price-cuts are a certainty as new product-lines are released.  I&#8217;m happy with my iPhone, and although I&#8217;ve got an 18-month contract, I look forward to the next iteration.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshclickmedia.com/blog/2008/04/i-hate-being-right-sometimes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Second Generation iPhone out soon</title>
		<link>http://www.freshclickmedia.com/blog/2008/03/second-generation-iphone-out-soon/</link>
		<comments>http://www.freshclickmedia.com/blog/2008/03/second-generation-iphone-out-soon/#comments</comments>
		<pubDate>Fri, 21 Mar 2008 21:00:00 +0000</pubDate>
		<dc:creator>shane</dc:creator>
		
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.freshclickmedia.com/blog/2008/03/second-generation-iphone-out-soon/</guid>
		<description><![CDATA[The iPhone was launched in the UK a few months ago, and whilst waiting for my current contract to expire, I began wondering whether it was the device for me.  Much has been written about it, and despite Steve Jobs' 'class-leading' tag, it has its detractors, such as <a href="http://www.psynixis.com/blog/2007/09/26/why-i-dont-want-an-iphone/">this guy</a>.

Since that post was written, O<sub>2</sub> have increased the basic, £35 ($70) tariff to include <a href="http://www.o2.co.uk/iphone/o2tariffsforiphone">600 minutes and 500 texts</a>, but most of the other points are well made.  I had been spoilt with a very good camera on my <a href="http://www.sonyericsson.com/cws/corporate/products/phoneportfolio/specification/k800i">Sony Ericsson K800i</a>, and truth be told, the iPhone's camera is vastly inferior, but in so many other areas, it trounces over it wholeheartedly.

For me, the relatively poor camera and lack of 3G were (and still are) issues, but everything else is so well-designed, feels so right, that you forgive it's drawbacks.  The iPhone is a fantastic device, and I'm very happy that I've purchased one.

I was thinking of waiting for an improved second-generation device.  Perhaps it will feature an improved camera, with flash, with video recording, and 3G support.  

Obviously, I couldn't wait, and went straight ahead and bought one, but you know what?  Now that I have, you can bet that a second-generation model is going to be released real soon. ]]></description>
			<content:encoded><![CDATA[<p>The iPhone was launched in the UK a few months ago, and whilst waiting for my current contract to expire, I began wondering whether it was the device for me.  Much has been written about it, and despite Steve Jobs&#8217; &#8216;class-leading&#8217; tag, it has its detractors, such as <a href="http://www.psynixis.com/blog/2007/09/26/why-i-dont-want-an-iphone/">this guy</a>.</p>
<p>Since that post was written, O<sub>2</sub> have increased the basic, £35 ($70) tariff to include <a href="http://www.o2.co.uk/iphone/o2tariffsforiphone">600 minutes and 500 texts</a>, but most of the other points are well made.  I had been spoilt with a very good camera on my <a href="http://www.sonyericsson.com/cws/corporate/products/phoneportfolio/specification/k800i">Sony Ericsson K800i</a>, and truth be told, the iPhone&#8217;s camera is vastly inferior, but in so many other areas, it trounces over it wholeheartedly.</p>
<p>For me, the relatively poor camera and lack of 3G were (and still are) issues, but everything else is so well-designed, feels so right, that you forgive it&#8217;s drawbacks.  The iPhone is a fantastic device, and I&#8217;m very happy that I&#8217;ve purchased one.</p>
<p>I was thinking of waiting for an improved second-generation device.  Perhaps it will feature an improved camera, with flash, with video recording, and 3G support.  </p>
<p>Obviously, I couldn&#8217;t wait, and went straight ahead and bought one, but you know what?  Now that I have, you can bet that a second-generation model is going to be released real soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshclickmedia.com/blog/2008/03/second-generation-iphone-out-soon/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gravatar Control Update</title>
		<link>http://www.freshclickmedia.com/blog/2008/03/gravatar-control-update/</link>
		<comments>http://www.freshclickmedia.com/blog/2008/03/gravatar-control-update/#comments</comments>
		<pubDate>Tue, 18 Mar 2008 19:08:58 +0000</pubDate>
		<dc:creator>shane</dc:creator>
		
		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[Blogging]]></category>

		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.freshclickmedia.com/blog/2008/03/gravatar-control-update/</guid>
		<description><![CDATA[The guys over at <a href="http://www.gravatar.com">Gravatar.com</a> have been hard at work <a href="http://blog.gravatar.com/2008/03/14/big-changes-afoot/">updating their service</a>, and I've updated the <a href="http://www.freshclickmedia.com/blog/2008/02/gravatar-aspnet-control/">ASP.NET control I developed</a> to reflect the changes.]]></description>
			<content:encoded><![CDATA[<h3>Update - 12 June 2008</h3>
<p>An updated version of this post, containing full source for the control and explanation is available <a href="http://www.freshclickmedia.com/blog/2008/06/aspnet-gravatar-control-update-full-source-included/">here</a>.</p>
<h3>Original Post</h3>
<p>The guys over at <a href="http://www.gravatar.com">Gravatar.com</a> have been hard at work <a href="http://blog.gravatar.com/2008/03/14/big-changes-afoot/">updating their service</a>, and I&#8217;ve updated the <a href="http://www.freshclickmedia.com/blog/2008/02/gravatar-aspnet-control/">ASP.NET control I developed</a> to reflect the changes.</p>
<p>The maximum size of Gravatars has now been increased from 80 to 512, so there&#8217;s a code change in the Render method:</p>
<pre class="code">
// if the size property has been specified, and in the range
// 1..512:
try
{
    // if it's not in the allowed range, throw an exception:
    if (Size < 1 || Size > 512)
        throw new ArgumentOutOfRangeException();
}
catch
{
    Size = 80;
}
</pre>
<p>So, a default of 80 will still be used if the value specified is not within the 1 to 512 range, or it is not specified, but allows for a larger size.</p>
<p>The avatar.php URL serving the images <a href="http://blog.gravatar.com/2008/03/14/big-changes-afoot/">now supports abbreviation</a>, but the code in the control has not been changed.</p>
<p><img src="http://farm3.static.flickr.com/2303/2343923834_a85fa1e873_o.gif" alt="Design time view of the control" width="505" height="429" /></p>
<p>The image shows the Design time view of the control, with the width set at the default value of 80.  I&#8217;ve checked the control at 512 pixels, but my Gravatar doesn&#8217;t look too good expanded out to that size, so I&#8217;ve decided to stick at size 80 for the screenshot!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshclickmedia.com/blog/2008/03/gravatar-control-update/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gravatar ASP.NET Control</title>
		<link>http://www.freshclickmedia.com/blog/2008/02/gravatar-aspnet-control/</link>
		<comments>http://www.freshclickmedia.com/blog/2008/02/gravatar-aspnet-control/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 20:59:08 +0000</pubDate>
		<dc:creator>shane</dc:creator>
		
		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[Blogging]]></category>

		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.freshclickmedia.com/blog/2008/02/gravatar-aspnet-control/</guid>
		<description><![CDATA[I just got myself a freshclickmedia.com Gravatar over at <a href="http://site.gravatar.com/" title="Get your own Gravatar">gravatar.com</a>.  A Gravatar is a little avatar associated with an email address, and quite a few blogs use them to decorate post comments.  Signing up is easy - all you need to do is supply an email address, and image, and give your image a content rating.

The source of the gravatar image tag points to gravatar.com's image generator and includes an MD5 hash of the email address to prevent email harvesting.  A 'max rating' parameter prevents the display of unsavoury content.

There are a wide number of blogging gravatar plugins, so I decided to write an ASP.NET custom control to do the job.  Here I present the control and its features.
]]></description>
			<content:encoded><![CDATA[<h3>Update - 12 June 2008</h3>
<p>An updated version of this post, containing full source for the control and explanation is available <a href="http://www.freshclickmedia.com/blog/2008/06/aspnet-gravatar-control-update-full-source-included/">here</a>.</p>
<h3>Original Post</h3>
<p>I just got myself a freshclickmedia.com Gravatar over at <a href="http://site.gravatar.com/" title="Get your own Gravatar">gravatar.com</a>.  A Gravatar is a little avatar associated with an email address, and quite a few blogs use them to decorate post comments.  Signing up is easy - all you need to do is supply an email address, and image, and give your image a content rating.</p>
<p>The source of the gravatar image tag points to gravatar.com&#8217;s image generator and includes an MD5 hash of the email address to prevent email harvesting.  A &#8216;max rating&#8217; parameter prevents the display of unsavoury content.</p>
<p>There are a wide number of blogging gravatar plugins, so I decided to write an ASP.NET custom control to do the job.  Here I present the control and its features.</p>
<p><span id="more-80"></span></p>
<h3>Using the Control</h3>
<p>To get up and running, the control requires an email address:</p>
<pre class="code">
&lt;fcm:Gravatar ID=&apos;Gravatar1&apos; runat=&apos;server&apos; Email=&apos;username@domain.com&apos; /&gt;
</pre>
<p>For my email address, I get the following:</p>
<p><img src="http://farm3.static.flickr.com/2181/2283724305_24797cd8d5_o.gif" width="505" height="208" alt="Output for my email address" /></p>
<p>And if we look at the generated source:</p>
<pre class="code">
&lt;a id=&quot;Gravatar1&quot; href=&quot;http://www.gravatar.com&quot; title=&quot;Get your avatar&quot;&gt;&lt;img width=&quot;80&quot; height=&quot;80&quot; src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=ccf3b8c638f15d005e5d070aeb1a3923&amp;rating=G&amp;size=80&quot; alt=&quot;Gravatar&quot; /&gt;&lt;/a&gt;
</pre>
<p>The default produces a hyperlink off to the <a href="http://www.gravatar.com">Gravatar</a> site with a title &#8220;Get your avatar&#8221;.  The image contains the MD5 email hash, a rating of &#8220;G&#8221; (suitable for all audience types), and a size of 80.</p>
<h3>Customisation</h3>
<p>The control supports a number of properties supporting the customisation of its output.</p>
<h4>Size</h4>
<p>The size property of the control can be in the range 1 to 80.  If it is outside this range, a default of 80 will be used.</dd>
<h4>MaxAllowedRating</h4>
<p>The &#8216;highest&#8217; allowed rating of image.</p>
<ul>
<li>A G rated gravatar is suitable for display on all websites with any audience type.</li>
<li>PG rated gravatars contain may contain rude gestures, provocatively dressed individuals, the lesser swear words, or mild violence.</li>
<li>R rated gravatars may contain such things as harsh profanity, intense violence, nudity, or hard drug use.</li>
<li>X rated gravatars may contain hardcore sexual imagery or extremely disturbing violence.</li>
</ul>
<h4>OutputGravatarSiteLink</h4>
<p>True by default, determines whether a hyperlink linking to the gravatar website will be output around the image.</p>
<h4>LinkTitle</h4>
<p>&#8220;Get your avatar&#8221; by default, allows the customisation of the &#8216;title&#8217; attribute of the link (obviously doesn&#8217;t apply if OutputGravatarSiteLink property is set to false.)</p>
<h4>DefaultImage</h4>
<p>URL encoded URL, protocol included, of a GIF, JPEG, or PNG image that should be returned if either the requested email address has no associated gravatar, or that gravatar has a rating higher than is allowed by the &#8220;MaxAllowedRating&#8221; property.</p>
<p>The code snippet below shows the associated properties.</p>
<pre class="code">
&lt;fcm:Gravatar ID=&quot;Gravatar1&quot; runat=&quot;server&quot;
    Email=&quot;username@domain.com&quot;
    DefaultImage=&quot;http://www.site.com/default.jpg&quot;
    OutputGravatarSiteLink=&quot;true&quot; Size=&quot;40&quot; /&gt;
</pre>
<h3>Download and Get Started</h3>
<p>You can <a href='http://www.freshclickmedia.com/wp-content/uploads/2008/02/gravatar.zip' title='gravatar.zip'>download the Gravatar Custom Control here</a>.  Once you&#8217;ve extracted the assembly from the ZIP file, add to the Visual Studio toolbox by right clicking on the toolbox and selecting &#8220;Choose Items&#8221; from the context menu.  Browse to the assembly (Freshclickmedia.Web.dll), and click &#8220;OK&#8221; to add.</p>
<p><img src="http://farm3.static.flickr.com/2064/2283724303_c96532e03b_o.gif" alt="Adding the control to the toolbox" width="505" height="361"  /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshclickmedia.com/blog/2008/02/gravatar-aspnet-control/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How to Be a Rockstar Freelancer Review</title>
		<link>http://www.freshclickmedia.com/blog/2008/01/how-to-be-a-rockstar-freelancer-review/</link>
		<comments>http://www.freshclickmedia.com/blog/2008/01/how-to-be-a-rockstar-freelancer-review/#comments</comments>
		<pubDate>Wed, 30 Jan 2008 11:42:22 +0000</pubDate>
		<dc:creator>shane</dc:creator>
		
		<category><![CDATA[Books]]></category>

		<category><![CDATA[Working Life]]></category>

		<guid isPermaLink="false">http://www.freshclickmedia.com/blog/2008/01/how-to-be-a-rockstar-freelancer-review/</guid>
		<description><![CDATA[Respected Freelance website FreelanceSwitch founders Cyan and Collis Ta&#8217;eed have written a book about Freelancing and made it available through self-publishing site Lulu.
I picked up a paperback version and here I present my thoughts.


Until a couple of weeks ago, had someone mentioned Lulu, I&#8217;d have thought of the Scottish singer (pictured), but a post over [...]]]></description>
			<content:encoded><![CDATA[<p>Respected Freelance website <a href="http://freelanceswitch.com">FreelanceSwitch</a> founders <abbr title="#0FF">Cyan</abbr> and Collis Ta&#8217;eed have written a book about Freelancing and made it available through self-publishing site <a href="http://www.lulu.com">Lulu</a>.</p>
<p>I picked up a paperback version and here I present my thoughts.<br />
<span id="more-79"></span></p>
<p><img class="right" src="http://farm3.static.flickr.com/2041/2229888107_22a7bd3954_o.jpg" width="150" height="176" alt="Scottish singer Lulu" /></p>
<p>Until a couple of weeks ago, had someone mentioned Lulu, I&#8217;d have thought of the Scottish singer (pictured), but a post over at <a href="http://www.zeldman.com/2008/01/03/self-publishing-is-the-new-blogging/">Zeldman.com</a> introduced me to self-publishing site Lulu.com, where anyone can publish their content for a worldwide market.  Cool - I thought, but didn&#8217;t expect to be purchasing something from the site any time soon.  A couple of days later, and a visit to <a href="http://freelanceswitch">FreelanceSwitch</a> revealed their new book about Freelancing, <a href="http://freelanceswitch.com/book">How to Be a Rockstar Freelancer</a> was published on Lulu.</p>
<p>Having always loved books, I ignored the PDF version, and plumped straight for the &#8216;hard&#8217; copy, perhaps ignoring the rather steep price of £19.29 for 216 pages.  I&#8217;d banked on the book&#8217;s website heritage to produce something that could justify me spending that amount of money.  I did have some reservations about the quality of the book itself, and I did draw some parallels with tip-style books that sometimes appear on gaming magazines.</p>
<p><img src="http://farm3.static.flickr.com/2010/2229932251_a9f8cfbbe7_o.jpg" width="150" height="219" class="right" alt="How To Be A Rockstar Freelancer Book" /></p>
<p>Payment on the Lulu site was seamless, and within a few days, I received my copy of the book.  </p>
<p>Initial impressions were good - although not &#8216;full-size&#8217; when compared to traditional technical books I&#8217;m used to, it felt pleasing in the hand.</p>
<p>I approached the book from a beginner&#8217;s standpoint - I was hungry for knowledge and reassurance about my new freelancing lifestyle - and not surprisingly, I found the book&#8217;s writing style and content to be very similar to that of the <a href="http://freelanceswitch">website</a>.  I have seen some other reviews of the book that give the book criticism because it is a little <em>too close</em> to the website&#8217;s content, and that the book is merely a collation of the articles presented on the site.  Although this might be a downside for some, I consider that good content is good content, and hey - I still like books.</p>
<p>A testimonial on the book says that freelancers of all experience will gain something from the book, but I feel that it is mostly suited to those with a minimal amount of experience.  Freelancers who&#8217;ve been around for a while may feel cheated by the book&#8217;s price.</p>
<p>A positive point is that the book clearly explains not only how to succeed as a freelancer, but how to make the change from full-time job.  Other areas of note include:</p>
<ul>
<li>Branding</li>
<li>Choosing a place of work</li>
<li>Getting off the ground by securing projects</li>
<li>Project scope and timing</li>
<li>Pricing your work</li>
<li>Tracking hours and milestones</li>
<li>Working with clients and dealing with disputes and problem clients</li>
<li>Invoicing and getting paid</li>
<li>Marketing your services as a freelancer</li>
<li>Expanding your business</li>
</ul>
<p>A preview of the book can be found on the <a href="http://www.lulu.com/browse/preview.php?fCID=1842788">Lulu website</a>.</p>
<p>Overall, I feel that it is a worthwhile read and gave me lots of tips and confidence with my freelance &#8216;plan&#8217;.  </p>
<h3>Good points</h3>
<ul>
<li>Friendly, informative writing style</li>
<li>Good coverage of a wide range of topics</li>
<li>Best suited for beginners</li>
</ul>
<h3>Bad points</h3>
<ul>
<li>Price is too high for many</li>
<li>Experienced freelancers may not gain much</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.freshclickmedia.com/blog/2008/01/how-to-be-a-rockstar-freelancer-review/feed/</wfw:commentRss>
		</item>
		<item>
		<title>When in Rome, code as the Romans do</title>
		<link>http://www.freshclickmedia.com/blog/2008/01/when-in-rome-code-as-the-romans-do/</link>
		<comments>http://www.freshclickmedia.com/blog/2008/01/when-in-rome-code-as-the-romans-do/#comments</comments>
		<pubDate>Fri, 25 Jan 2008 12:50:00 +0000</pubDate>
		<dc:creator>shane</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Working Life]]></category>

		<guid isPermaLink="false">http://www.freshclickmedia.com/blog/2008/01/when-in-rome-code-as-the-romans-do/</guid>
		<description><![CDATA[No doubt most developers are in favour of coding standards, but something that has annoyed me of late is &#8216;coding baggage&#8217;.  For example, former Visual Basic programmers using VB style in C#.  Such style pollutes the purity of a language that has its own style for a particular reason. 

Many years ago, I [...]]]></description>
			<content:encoded><![CDATA[<p>No doubt most developers are in favour of coding standards, but something that has annoyed me of late is &#8216;coding baggage&#8217;.  For example, former Visual Basic programmers using VB style in C#.  Such style pollutes the purity of a language that has its own style for a particular reason. </p>
<p><span id="more-78"></span></p>
<p>Many years ago, I spent 6 months in India.  For the first three months, I was staying at a rural polytechnic in <a href="http://en.wikipedia.org/wiki/Uttar_pradesh">Uttar Pradesh</a>, and I tried to learn some Hindi for my own interest, and because I felt it would help me settle in and go some way to befriending the mainly non English-speaking people in the area.  Some of my fellow travellers felt no need to make an effort, and insisted on saying English words more loudly and slowly.  Funnily enough, this doesn&#8217;t really work.</p>
<p>I make this comparison to people who bring coding style and standards from previous languages.  I&#8217;ve recently been working on C# code that screams of work from a former VB programmer.  There are prefixes to all the variable names to indicate their type, constants are capitalised, method parameters are prefixed with additional information as to whether they are passed by reference, and members are prefixed with &#8216;m&#8217;.</p>
<pre class="code">
public const string cstrDataGridXml = "DataGridDetails.xml";

public EditableTable(string p_strTableName,string p_strTableDesc, bool p_bExtended)
{
	mstrTableName = p_strTableName;
	mstrTableDescription = p_strTableDesc;
	mbExtended = p_bExtended;
}</pre>
<p>I find this type of thing mildly infuriating - it&#8217;s like going to India and shouting English.  To bring this old coding style to a new language blurs the distinction of coding standards between languages, the very coding standards which are established because of language features.  To mix the styles blurs this distinction, and reduces the clarity and purpose of those coding standards.</p>
<p>I come from a C++ background, and although I don&#8217;t touch the stuff these days, you can bet that if I returned, I&#8217;d be coding as I did back in the year 2000.  Now I&#8217;m doing C#, I use those the standards defined by Microsoft, who, to be fair, should know a thing or two about C#.</p>
<p>Having started Ruby and Ruby on Rails, I code Ruby like a Ruby programmer - so you won&#8217;t find any m_ prefixes for member variables or such like.  Perhaps one day, another Ruby programmer will look at my code.  If it&#8217;s styled like Ruby, their understanding and comfort in reading my code will be maximised.</p>
<p>This naming also extends to control prefixes in ASP.NET and WinForms.  Drop a TextBox onto a web form and by default, you&#8217;ll get TextBox1.  So why change the prefix to txtBox?</p>
<p>I think it&#8217;s important for developers to respect the language they&#8217;re programming in, and code accordingly - although the exact content of a coding standard for language &#8216;X&#8217; promotes contention, a mishmash surely doesn&#8217;t have any advantages.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshclickmedia.com/blog/2008/01/when-in-rome-code-as-the-romans-do/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Suggested books for learning Ruby on Rails</title>
		<link>http://www.freshclickmedia.com/blog/2008/01/suggested-books-for-learning-ruby-on-rails/</link>
		<comments>http://www.freshclickmedia.com/blog/2008/01/suggested-books-for-learning-ruby-on-rails/#comments</comments>
		<pubDate>Thu, 03 Jan 2008 13:13:17 +0000</pubDate>
		<dc:creator>shane</dc:creator>
		
		<category><![CDATA[Books]]></category>

		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.freshclickmedia.com/blog/2008/01/suggested-books-for-learning-ruby-on-rails/</guid>
		<description><![CDATA[I&#8217;ve been mainly a C#/ASP.NET developer over the last few years, but a recent interest in Ruby on Rails (RoR) has lead me to buy a few books to help me learn the framework.
Here I present a list of books, in a particular order, that I recommend to anybody learning RoR.




Programming Ruby: The Pragmatic Programmer&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been mainly a C#/ASP.NET developer over the last few years, but a recent interest in Ruby on Rails (RoR) has lead me to buy a few books to help me learn the framework.</p>
<p>Here I present a list of books, in a particular order, that I recommend to anybody learning RoR.<br />
<span id="more-76"></span></p>
<div class="books">
<ul>
<li>
<h3><a href="http://www.amazon.co.uk/Programming-Ruby-Pragmatic-Programmers-Guide/dp/0974514055/ref=pd_sim_b?ie=UTF8&#038;qid=1199361974&#038;sr=8-1">Programming Ruby: The Pragmatic Programmer&#8217;s Guide</a></h3>
<p><img src="http://farm3.static.flickr.com/2110/2162495752_8ced2cafe8_t.jpg" alt="Programming Ruby: The Pragmatic Programmer's Guide" />Many Rails books give a good overview of Ruby that is certainly enough to get you started, but a good understanding of the language will pay dividends down the line.  This book provides a thorough tutorial and reference to the Ruby language, and is the Ruby equivalent of C++&#8217;s &#8220;<a href="http://www.amazon.co.uk/C%2B%2B-Programming-Language-Special/dp/0201700735/ref=pd_bbs_sr_1?ie=UTF8&#038;s=books&#038;qid=1199364183&#038;sr=8-1">The C++ Programming Language</a>&#8221; that I was reading a few years ago.
</li>
<li>
<h3><a href="http://www.amazon.co.uk/Agile-Development-Rails-Pragmatic-Programmers/dp/0977616630/">Agile Web Development with Rails</a></h3>
<p><img src="http://farm3.static.flickr.com/2014/2162495746_43de2d137c_t.jpg" alt="Agile Web Development with Rails" />Co-authored by Rails Creator David Heinemeier, this is a fantastic book for learning Rails, and might be the only one you need.  It introduces the framework and covers ActiveRecord (for database connectivity and mapping), installation, controllers, models, validation and AJAX, amongst many other concepts.  It&#8217;s a weighty book, and it feels complete, well-written and authoritative.  Complementing the learning material is the development of the &#8216;Depot&#8217; online store application, which helps cement the concepts.
</li>
<li>
<h3><a href="http://www.amazon.co.uk/Practical-Rails-Projects-Experts-Voice/dp/1590597818/">Practical Rails Projects</a></h3>
<p><img src="http://farm3.static.flickr.com/2115/2162495748_bdca022274_t.jpg" alt="Practical Rails Projects" />As good as <a href="http://www.amazon.co.uk/Agile-Development-Rails-Pragmatic-Programmers/dp/0977616630/">Agile Web Development with Rails</a> is, I do like a book that dives straight in with some solid real-world examples. Although the &#8216;Depot&#8217; example is fairly substantial, a wealth of practical cases is always beneficial, and this book provides a solid variety.
</li>
<li>
<h3>
<a href="http://www.amazon.co.uk/Practical-Rails-Social-Networking-Experts/dp/1590598415/">Practical Rails Social Networking Sites</a></h3>
<p><img src="http://farm3.static.flickr.com/2280/2162495750_d9db7cb65d_t.jpg" alt="Practical Rails Social Networking Sites" />The final book in my four develops the &#8216;railscoders&#8217; social networking site throughout its pages, and even if you&#8217;re not interested in the social networking phenomenon, I think it&#8217;s essential reading as it develops many concepts that you&#8217;re likely to use in other types of sites.  Aimed squarely at somebody who has the base knowledge for RoR development, it dives straight in and covers a simple CMS, user management, RSS feeds, blogs, photo gallery and e-mail.  I haven&#8217;t yet finished the book, but it&#8217;s very well written (as are many of the <a href="http://www.apress.com">apress</a> books), and gives you the confidence to use many of the ideas in your own work.
</li>
</ul>
</div>
<p>I hope this list is of some use to other budding RoR developers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshclickmedia.com/blog/2008/01/suggested-books-for-learning-ruby-on-rails/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
