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

<channel>
	<title>KevFoo &#187; development</title>
	<atom:link href="http://blog.kevfoo.com/index.php/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.kevfoo.com</link>
	<description>The weblog of a Chicago based .Net and iPhone developer.</description>
	<lastBuildDate>Wed, 26 May 2010 13:33:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Chatsworth House Keeping and Update</title>
		<link>http://blog.kevfoo.com/index.php/2009/12/chatsworth-house-keeping-and-update/</link>
		<comments>http://blog.kevfoo.com/index.php/2009/12/chatsworth-house-keeping-and-update/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 07:25:12 +0000</pubDate>
		<dc:creator>Kevin McMahon</dc:creator>
				<category><![CDATA[chatsworth]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Chatbot]]></category>
		<category><![CDATA[Chatroom]]></category>
		<category><![CDATA[Chatsworth House]]></category>
		<category><![CDATA[Configuration Experience]]></category>
		<category><![CDATA[Database Right]]></category>
		<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Feedback]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Holidays]]></category>
		<category><![CDATA[Home Server]]></category>
		<category><![CDATA[House Keeping]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[Logging Feature]]></category>
		<category><![CDATA[Personal Projects]]></category>
		<category><![CDATA[Requestor]]></category>
		<category><![CDATA[Suits]]></category>
		<category><![CDATA[Timestamp]]></category>
		<category><![CDATA[Two Areas]]></category>

		<guid isPermaLink="false">http://blog.kevfoo.com/index.php/2009/12/chatsworth-house-keeping-and-update/</guid>
		<description><![CDATA[I just moved Chatsworth from Google code over to its new home on github.&#160; I’ve got a couple more features in mind and figured now was as good a time as any to make the switch.&#160; I already host my iPhone samples and some personal projects on github and, given the smoother branching and merging [...]]]></description>
			<content:encoded><![CDATA[<p>I just moved <a href="http://blog.kevfoo.com/index.php/2009/01/chatsworth-a-google-talk-group-chat-bot/">Chatsworth</a> from <a href="http://code.google.com/p/chatsworth/">Google code</a> over to its new home on <a href="http://github.com/kevinmcmahon/chatsworth">github</a>.&#160; I’ve got a couple more features in mind and figured now was as good a time as any to make the switch.&#160; I already host my <a href="http://blog.kevfoo.com/index.php/2009/11/fun-with-monotouch-and-multi-level-table-views-without-interface-builder/">iPhone</a> <a href="http://blog.kevfoo.com/index.php/2009/11/monotouch-uialertview-uitextfield-crazy-delicious/">samples</a> and some personal projects on github and, given the smoother branching and merging experience of git, I think it will be more conducive to spiking some features and trying some ideas out.</p>
<p>As for the chatbot, I’ve recently added a link logging feature.&#160; Any URL sent to the chatroom now gets logged to the sqlite database.&#160; Users can query the database right from the chat window by entering <em><strong>/links &lt;number of previous links to return&gt;</strong></em> and the links, timestamp and the person who sent it will be sent in an individual IM to the requestor.</p>
<p>Going forward, the two areas that I think need the most improvement are installation and documentation.&#160; The majority of the questions and feedback that I have received are setup and configuration related.&#160; Improving the installation and documentation stories at this point make the most sense and would be worth the effort.&#160; </p>
<p>On the technical side of things, I am considering making a Chatsworth plugin for Windows Home Server.&#160; Currently I am running the service from my home server and, given the always on nature that suits the chatbot and the low/no maintenance needed to running once it is setup, the pairing seems natural and could help provide a little better setup and configuration experience.</p>
<p>I hope to work on this more over the holidays and please feel free to reach out with a question or feedback.&#160; Enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kevfoo.com/index.php/2009/12/chatsworth-house-keeping-and-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fun with Monotouch and Multi-Level Table Views without Interface Builder</title>
		<link>http://blog.kevfoo.com/index.php/2009/11/fun-with-monotouch-and-multi-level-table-views-without-interface-builder/</link>
		<comments>http://blog.kevfoo.com/index.php/2009/11/fun-with-monotouch-and-multi-level-table-views-without-interface-builder/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 21:36:00 +0000</pubDate>
		<dc:creator>Kevin McMahon</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[UITableView]]></category>
		<category><![CDATA[UITableViewController]]></category>
		<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[monotouch]]></category>
		<category><![CDATA[Adc]]></category>
		<category><![CDATA[App Development]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Craig Dunn]]></category>
		<category><![CDATA[Data Visualization]]></category>
		<category><![CDATA[Detail View]]></category>
		<category><![CDATA[Example Tutorials]]></category>
		<category><![CDATA[Interface Builder]]></category>
		<category><![CDATA[Mac Mini]]></category>
		<category><![CDATA[Monospace]]></category>
		<category><![CDATA[Navigation Button]]></category>
		<category><![CDATA[New Mac]]></category>
		<category><![CDATA[Pdc]]></category>
		<category><![CDATA[Perfect Time]]></category>
		<category><![CDATA[Programming Guide]]></category>
		<category><![CDATA[Roget]]></category>
		<category><![CDATA[Rss Reader]]></category>
		<category><![CDATA[Thesaurus]]></category>
		<category><![CDATA[Ugly Code]]></category>

		<guid isPermaLink="false">http://blog.kevfoo.com/index.php/2009/11/fun-with-monotouch-and-multi-level-table-views-without-interface-builder/</guid>
		<description><![CDATA[With the recent release of&#160; Monotouch, which enabled development for the iPhone/iPod Touch platform using C# and .Net, it seemed like the perfect time to take a swing at mobile app development.&#160; The strong appeal of being able to leverage my C# and .Net experience while scratching an itch that I have had for a [...]]]></description>
			<content:encoded><![CDATA[<p>With the recent release of&#160; <a href="http://monotouch.net/">Monotouch</a>, which enabled development for the iPhone/iPod Touch platform using C# and .Net, it seemed like the perfect time to take a swing at mobile app development.&#160; The strong appeal of being able to leverage my C# and .Net experience while scratching an itch that I have had for a few apps was more than enough to entice me to order a brand new <a href="http://www.amazon.com/gp/product/B002QQ8CC4?ie=UTF8&amp;tag=kev02-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B002QQ8CC4">Mac mini</a><img style="border-bottom-style: none !important; border-right-style: none !important; margin: 0px; border-top-style: none !important; border-left-style: none !important" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=kev02-20&amp;l=as2&amp;o=1&amp;a=B002QQ8CC4" width="1" height="1" /> and start learning the Cocoa framework.</p>
<p>My pet app project requires some pretty basic multi-level tabular data visualization, so that was the first thing I attempted to tackle.&#160; I started my learning endeavor by reading the <a href="http://developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html">view controller programming guide</a> from <a href="http://developer.apple.com">Apple’s ADC</a> and working through a few of the <a href="http://monotouch.net/Tutorials">tutorials</a> listed on the Monotouch site.&#160; One of the example tutorials listed was for <a href="http://www.alexyork.net/blog/post/UINavigationController-with-MonoTouch-Building-a-simple-RSS-reader-Part-1.aspx">a basic RSS reader</a>.&#160; Armed with his guide, I got up and running with a basic table view allowed me to drill down one level deep and return to the root via navigation button.&#160; This was a great introduction and the easy to follow steps combined with the screenshots certainly hit the mark; however, this was not quite the layout I was looking for.</p>
<p>The data that I wanted to display calls for more than just a list-view-to-detail-view relationship that the RSS reader implemented.&#160; As a beginner trying to figure out how to wire up my custom table controllers to each other and the navigation controller all via Interface Builder resulted in a lot of thrashing and a lot of ugly code.&#160; I eventually was able to roughly approximate the behavior I wanted, but it was pretty obvious to me there had to be a better way.</p>
<p>I set out to see if I could find more Monotouch examples to see if I could pick up some tips and stumbled across <a href="http://conceptdev.blogspot.com/">Craig Dunn’s blog</a>.&#160; Craig not only put together apps for the Monospace and PDC conferences (and graciously provided the source) but also posted a <a href="http://conceptdev.blogspot.com/2009/10/monotouch-rogets-1911-thesaurus.html">Roget’s Thesaurus</a> app that was just what I was looking for.&#160; It was a simple app, but it had all the elements in play that I was looking for and an <a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/Su66_wEzO3I/AAAAAAAABIQ/9MzCAwYQ-HQ/s1600-h/RogetPlacemat.png">incredible diagram</a> that tied it all together.</p>
<p>One of the key tips and tricks I picked up from Craig’s code was how easy it was to cut out the Interface Builder from the process.&#160; I also generally tend to avoid using the designer whenever possible in Visual Studio but here it was a key factor in my understand.&#160; This isn’t to say that I’d never use the Interface Builder again or that it doesn’t have its uses because it does but there was <em>too much</em> magic going on in how Monotouch links up the XIBs to their backing C# classes.&#160; It wasn’t until I started explicitly creating views and view controllers instead of trying to wire them up after the fact did I start to understand how things were supposed to interact.</p>
<p>To implement a custom <strong>UITableViewController</strong> you need to set two properties with custom classes and override a method which is invoked by the framework when the view controller is loaded.&#160; You’ll need to set the TableDelegate and DataSource properties on the controller with your own implementations of <strong>UITableViewDelegate </strong>and&#160; <strong>UITableViewDataSource</strong>.&#160; The implementation of the table delegate allows you to customize how the table will respond to certain events and the data source implementation provides not only the data the table uses but also how that data is to be displayed within the table.&#160; Typically the ViewDidLoad method is overriden to perform the view setup work needed during initialization of the view controller.&#160; Within the method the TableDelegate and DataSource properties can be set.</p>
<p>Example setting the TableDelegate and DataSource via the ViewDidLoad method:</p>
</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:18bc747e-a016-49a3-889d-2df3afb9f710" class="wlWriterEditableSmartContent">
<pre style="background-color:#FFFFFF;overflow: auto;"><span style="color: #0000FF;">namespace</span><span style="color: #000000;"> MultiLevelTableView
{
    [MonoTouch.Foundation.Register(</span><span style="color: #800000;">"</span><span style="color: #800000;">RootViewController</span><span style="color: #800000;">"</span><span style="color: #000000;">)]
    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">partial</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> RootViewController : UITableViewController
    {
        </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> DataSource : UITableViewDataSource { </span><span style="color: #008000;">/*</span><span style="color: #008000;"> Impl Here </span><span style="color: #008000;">*/</span><span style="color: #000000;"> }

        </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> TableDelegate : UITableViewDelegate { </span><span style="color: #008000;">/*</span><span style="color: #008000;"> Impl Here </span><span style="color: #008000;">*/</span><span style="color: #000000;"> }

        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">override</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> ViewDidLoad ()
        {
            </span><span style="color: #0000FF;">base</span><span style="color: #000000;">.ViewDidLoad ();

            TableView.Delegate </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> TableDelegate (</span><span style="color: #0000FF;">this</span><span style="color: #000000;">);
            TableView.DataSource </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> DataSource (</span><span style="color: #0000FF;">this</span><span style="color: #000000;">);
        }
    }
}</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
</p>
<p>Example setting the properties during <strong>UITableView</strong> construction:</p>
</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:ac5c342a-bdfc-49a2-89b8-5da3f272da4f" class="wlWriterEditableSmartContent">
<pre style="background-color:#FFFFFF;overflow: auto;"><span style="color: #0000FF;">namespace</span><span style="color: #000000;"> MultiLevelTableView
{
    [MonoTouch.Foundation.Register(</span><span style="color: #800000;">"</span><span style="color: #800000;">RootViewController</span><span style="color: #800000;">"</span><span style="color: #000000;">)]
    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">partial</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> RootViewController : UITableViewController
    {
        UITableView tableView;

        </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> DataSource : UITableViewDataSource { </span><span style="color: #008000;">/*</span><span style="color: #008000;"> Impl Here </span><span style="color: #008000;">*/</span><span style="color: #000000;"> }

        </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> TableDelegate : UITableViewDelegate { </span><span style="color: #008000;">/*</span><span style="color: #008000;"> Impl Here </span><span style="color: #008000;">*/</span><span style="color: #000000;"> }

        </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">override</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> ViewDidLoad ()
        {
            </span><span style="color: #0000FF;">base</span><span style="color: #000000;">.ViewDidLoad ();

            tableView </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> UITableView()
            {
                Delegate </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> TableViewDelegate(</span><span style="color: #0000FF;">this</span><span style="color: #000000;">),
                DataSource </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> TableViewDataSource(</span><span style="color: #0000FF;">this</span><span style="color: #000000;">),
            };

            </span><span style="color: #008000;">//</span><span style="color: #008000;">You can set more properties here like size and
            </span><span style="color: #008000;">//</span><span style="color: #008000;">location in the frame etc.</span><span style="color: #008000;">
</span><span style="color: #000000;">
            </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.View.AddSubview(tableView);
        }
    }
}</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
</p>
<p>The meat of the table view controller falls in the implementations of the DataSource and TableDelegate.</p>
<p>A basic DataSource setup involves overriding two methods used by parent controller.&#160; The RowsInSection method tells how many rows need to be displayed in the table and the GetCell method returns a cell view which was customized for display by setting the text and display properties.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:c5c83938-3d1d-47b9-8e66-91d91b0673c8" class="wlWriterEditableSmartContent">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">class</span><span style="color: #000000;"> DataSource : UITableViewDataSource
{
    </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> NSString kCellIdentifier </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> NSString (</span><span style="color: #800000;">"</span><span style="color: #800000;">MyIdentifier</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    RootViewController tvc;

    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> DataSource (RootViewController tvc)
    {
        </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.tvc </span><span style="color: #000000;">=</span><span style="color: #000000;"> tvc;
    }

    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">override</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> RowsInSection (UITableView tableView, </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> section)
    {
        </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> tvc.RootData.Count;
    }

    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">override</span><span style="color: #000000;"> UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
    {
        var cell </span><span style="color: #000000;">=</span><span style="color: #000000;"> tableView.DequeueReusableCell (kCellIdentifier);

        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (cell </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
        {
            cell </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> UITableViewCell (UITableViewCellStyle.Default, kCellIdentifier);
        }

        cell.TextLabel.Text </span><span style="color: #000000;">=</span><span style="color: #000000;"> tvc.RootData.ElementAt(indexPath.Row);
        cell.Accessory </span><span style="color: #000000;">=</span><span style="color: #000000;"> UITableViewCellAccessory.DetailDisclosureButton;
        </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> cell;
    }
}</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>The TableDelegate is where the behavior of the table to various events is defined.&#160; It is here in which we load up the next view to display when a user clicks on a cell.&#160;&#160; A basic implementation of a table view delegate involves overriding the RowSelected method with instructions on what to do with the row now that it has been selected.&#160; If the node selected happened to be a leaf node for example we might load up the detail’s view to display the nodes properties or if the node was the parent of more child nodes we would load another list view to continue to drill down into the data.&#160; In our case we want to drill down to the next layer of data which is managed by the SubGroupViewController.</p>
</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:598700d1-088c-449d-9ed0-f36c3bab6d9e" class="wlWriterEditableSmartContent">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">class</span><span style="color: #000000;"> TableDelegate : UITableViewDelegate
{
    RootViewController tvc;
    SubGroupViewController sgvc;

    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> TableDelegate (RootViewController tvc)
    {
        </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.tvc </span><span style="color: #000000;">=</span><span style="color: #000000;"> tvc;
    }

    </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">override</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> RowSelected (UITableView tableView, NSIndexPath indexPath)
    {
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> get info from selected row</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> selectedGroup </span><span style="color: #000000;">=</span><span style="color: #000000;"> tvc.RootData.ElementAt(indexPath.Row);

        </span><span style="color: #008000;">//</span><span style="color: #008000;"> load up new controller to display</span><span style="color: #008000;">
</span><span style="color: #000000;">        </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(sgvc </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
            sgvc </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> SubGroupViewController(selectedGroup);

        </span><span style="color: #008000;">//</span><span style="color: #008000;"> push the controller on the navigation stack</span><span style="color: #008000;">
</span><span style="color: #000000;">        tvc.NavigationController.PushViewController(sgvc, </span><span style="color: #0000FF;">true</span><span style="color: #000000;">);
    }
}</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
</p>
<p>The hang up for me with using Interface Builder to try and get the multi-level table views wired together was mostly due to not being familiar with the objects I was dealing with and not understanding what properties are needed to be initialized so the framework can display them correctly.&#160; Approaching the problem via the Interface Builder created a lot of noise that made seeing what was really needed to wire these table view controllers with the navigation controller difficult.&#160; In this case the the pre-packaged templates and generic layouts provided by Monotouch and Interface Builder were more of a hindrance than help but that is to be expected while learning a new technology.</p>
<p>I’ve packaged up my <a href="http://github.com/kevinmcmahon/MultiLevelTableView">implementation of a multi-level table view</a> app and put it on github.&#160; If anyone is looking for straight-forward, simple example of nesting table views hopefully this will help.</p>
<p>I also recommend checking out the following links which helped me immensely:</p>
<ul>
<li><a href="http://www.alexyork.net/blog/category/MonoTouch.aspx">Alex York&#8217;s Monotouch posts including the RSS reader</a>&#160; </li>
<li><a href="http://sabonrai.wordpress.com/2009/08/28/monotouch-sample-code-uitableview/">Sabon Rai&#8217;s Sample Code for UITableView</a> </li>
<li><a href="http://conceptdev.blogspot.com/">Craig Dunn’s Blog</a> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.kevfoo.com/index.php/2009/11/fun-with-monotouch-and-multi-level-table-views-without-interface-builder/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tree Surgeon: Review and a couple tips</title>
		<link>http://blog.kevfoo.com/index.php/2009/03/tree-surgeon-review-and-a-couple-tips/</link>
		<comments>http://blog.kevfoo.com/index.php/2009/03/tree-surgeon-review-and-a-couple-tips/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 19:01:50 +0000</pubDate>
		<dc:creator>Kevin McMahon</dc:creator>
				<category><![CDATA[CI]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Assembly Name]]></category>
		<category><![CDATA[Codeplex]]></category>
		<category><![CDATA[Core Library]]></category>
		<category><![CDATA[Couple Tips]]></category>
		<category><![CDATA[Directory Structure]]></category>
		<category><![CDATA[Documents Folder]]></category>
		<category><![CDATA[Major Tools]]></category>
		<category><![CDATA[Mbunit]]></category>
		<category><![CDATA[New Projects]]></category>
		<category><![CDATA[Nunit]]></category>
		<category><![CDATA[Project Forums]]></category>
		<category><![CDATA[Source Tree]]></category>
		<category><![CDATA[Source Trees]]></category>
		<category><![CDATA[Test Assembly]]></category>
		<category><![CDATA[Test Framework]]></category>
		<category><![CDATA[Test Project]]></category>
		<category><![CDATA[Tree Surgeon]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Unit Test]]></category>
		<category><![CDATA[Zip Files]]></category>

		<guid isPermaLink="false">http://blog.kevfoo.com/index.php/2009/03/tree-surgeon-review-and-a-couple-tips/</guid>
		<description><![CDATA[This past week I was playing around with Hudson and Team City and getting some NAnt scripts put together to use.&#160; In a happy coincidence I happened to catch a mention about Tree Surgeon from twitter and it had piqued my curiosity.&#160; Tree Surgeon is a project on CodePlex that has been around for a [...]]]></description>
			<content:encoded><![CDATA[<p>This past week I was playing around with <a href="https://hudson.dev.java.net/">Hudson</a> and <a href="http://www.jetbrains.com/teamcity/index.html">Team City</a> and getting some NAnt scripts put together to use.&#160; In a happy coincidence I happened to catch a mention about <a href="http://treesurgeon.codeplex.com/">Tree Surgeon</a> from twitter and it had piqued my curiosity.&#160; Tree Surgeon is a project on CodePlex that has been around for a while and helps automate the process of setting up a source tree and assembling build scripts.&#160; It was just what I was looking for.</p>
<p>The goal of Tree Surgeon was to make setting up and laying out new projects using best practices dead simple.&#160; All the major tools and libraries that typically find their way into your .Net source trees are provided for you.&#160; In addition to laying out the directory structure for your source and libraries, a solution file gets created with three main projects to get you started.&#160; The basic project setup includes a console app, core library and unit test project.&#160; The build scripts come pre-wired to have NCover run your tests and generate reports from the results and also do things like packaging your build artifacts into zip files for deployment.</p>
<p>The whole process, start to project generated, is very easy.&#160; Download and run the installer.&#160; Launch the program, select the version of Visual Studio (2003, 2005, and 2008) and the flavor of testing framework (NUnit or MbUnit) and then hit generate.&#160; The files and directories, built out in your Documents folder, are then created and ready to be used.</p>
<p>There are two slight issues I ran into that I’d like to point out.&#160; Both issues had already been noted in the project forums and were easy to fix.&#160; When generating a source tree with MbUnit selected as the unit test framework, the build script generated has the unit test assembly referenced is named incorrectly.&#160; You will have to change it to match your project’s unit test assembly name.&#160; The second issue has to do with running NCover and NUnit on x64 machines.&#160; I found that in order for NCover and NUnit to work on x64 machines I had to add two calls to the CorFlags utility to make executables work.&#160; This was accomplished by making the modifications to the ‘run-unit-tests’ target below on lines 5-8.</p>
<div>
<div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   1:</span> <span style="color: #0000ff">&lt;</span><span style="color: #800000">target</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">=&quot;run-unit-tests&quot;</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   2:</span>     <span style="color: #0000ff">&lt;</span><span style="color: #800000">mkdir</span> <span style="color: #ff0000">dir</span><span style="color: #0000ff">=&quot;${build.dir}\test-reports&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   3:</span>     <span style="color: #0000ff">&lt;</span><span style="color: #800000">exec</span> <span style="color: #ff0000">program</span><span style="color: #0000ff">=&quot;regsvr32&quot;</span> <span style="color: #ff0000">workingdir</span><span style="color: #0000ff">=&quot;tools\NCover&quot;</span> <span style="color: #ff0000">commandline</span><span style="color: #0000ff">=&quot;/s CoverLib.dll&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   4:</span>     <span style="color: #008000">&lt;!-- Need the CorFlags Commands For x64 --&gt;</span></pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   5:</span>     <span style="color: #0000ff">&lt;</span><span style="color: #800000">exec</span> <span style="color: #ff0000">program</span><span style="color: #0000ff">=&quot;C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\CorFlags&quot;</span> </pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   6:</span>         <span style="color: #ff0000">workingdir</span><span style="color: #0000ff">=&quot;tools\NCover&quot;</span> <span style="color: #ff0000">commandline</span><span style="color: #0000ff">=&quot;NCover.Console.exe /32BIT+&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   7:</span>     <span style="color: #0000ff">&lt;</span><span style="color: #800000">exec</span> <span style="color: #ff0000">program</span><span style="color: #0000ff">=&quot;c:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\CorFlags&quot;</span> </pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   8:</span>         <span style="color: #ff0000">workingdir</span><span style="color: #0000ff">=&quot;tools\NUnit&quot;</span> <span style="color: #ff0000">commandline</span><span style="color: #0000ff">=&quot;NUnit-Console.Exe /32BIT+&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   9:</span>     <span style="color: #0000ff">&lt;</span><span style="color: #800000">exec</span> <span style="color: #ff0000">program</span><span style="color: #0000ff">=&quot;tools\ncover\NCover.Console.exe&quot;</span> </pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">  10:</span>         <span style="color: #ff0000">workingdir</span><span style="color: #0000ff">=&quot;${build.dir}\Debug\UnitTests&quot;</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">  11:</span>         <span style="color: #0000ff">&lt;</span><span style="color: #800000">arg</span> <span style="color: #ff0000">value</span><span style="color: #0000ff">=&quot;//w &amp;quot;.&amp;quot;&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">  12:</span>         <span style="color: #0000ff">&lt;</span><span style="color: #800000">arg</span> <span style="color: #ff0000">value</span><span style="color: #0000ff">=&quot;//x &amp;quot;..\..\test-reports\Coverage.xml&amp;quot;&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">  13:</span>         <span style="color: #0000ff">&lt;</span><span style="color: #800000">arg</span> <span style="color: #ff0000">value</span><span style="color: #0000ff">=&quot;&amp;quot;..\..\..\tools\nunit\nunit-console.exe&amp;quot;&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">  14:</span>         <span style="color: #0000ff">&lt;</span><span style="color: #800000">arg</span> <span style="color: #ff0000">value</span><span style="color: #0000ff">=&quot;&amp;quot;MyProjectName.UnitTests.dll&amp;quot; </pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">  15:</span>             &amp;quot;/xml:..\..\test-reports\UnitTests.xml&amp;quot; &amp;quot;/nologo&amp;quot;&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">  16:</span>     <span style="color: #0000ff">&lt;/</span><span style="color: #800000">exec</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">  17:</span> <span style="color: #0000ff">&lt;/</span><span style="color: #800000">target</span><span style="color: #0000ff">&gt;</span></pre>
</p></div>
</div>
<p>Even though I am pretty late to the party with Tree Surgeon I am very happy to have stumbled across it.&#160; The whole source tree and build script setup process is the perfect thing to script out and I am really glad the project creator and contributors have taken the time to do this.&#160; It is a big help and I highly recommend you try it out the next time you are spinning up a new source tree for a project.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kevfoo.com/index.php/2009/03/tree-surgeon-review-and-a-couple-tips/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chatsworth: A Google talk group chat bot</title>
		<link>http://blog.kevfoo.com/index.php/2009/01/chatsworth-a-google-talk-group-chat-bot/</link>
		<comments>http://blog.kevfoo.com/index.php/2009/01/chatsworth-a-google-talk-group-chat-bot/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 06:36:01 +0000</pubDate>
		<dc:creator>Kevin McMahon</dc:creator>
				<category><![CDATA[chatsworth]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Chat Bot]]></category>
		<category><![CDATA[Chat Bots]]></category>
		<category><![CDATA[Chat Logs]]></category>
		<category><![CDATA[Chat Room]]></category>
		<category><![CDATA[Conversations]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Group]]></category>
		<category><![CDATA[Google Talk]]></category>
		<category><![CDATA[Gtalk]]></category>
		<category><![CDATA[Home Server]]></category>
		<category><![CDATA[Immediate Future]]></category>
		<category><![CDATA[Jabber]]></category>
		<category><![CDATA[Java Source]]></category>
		<category><![CDATA[Loose Ends]]></category>
		<category><![CDATA[Pitfall]]></category>
		<category><![CDATA[Talk Group]]></category>
		<category><![CDATA[Unit Tests]]></category>
		<category><![CDATA[Uptime]]></category>
		<category><![CDATA[Windows Service]]></category>

		<guid isPermaLink="false">http://blog.kevfoo.com/index.php/2009/01/chatsworth-a-google-talk-group-chat-bot/</guid>
		<description><![CDATA[For the past year and a half, I’ve been using PartyChat to participate in multi-user chats with friends.&#160; PartyChat essentially provides IRC type functional via GTalk and has been a great way to have on going conversations throughout the day while avoiding 100+ email threads.
The only pitfall PartyChat has to do with stability.&#160; PartyChat is [...]]]></description>
			<content:encoded><![CDATA[<p>For the past year and a half, I’ve been using <a href="http://techwalla.googlepages.com/" target="_blank">PartyChat</a> to participate in multi-user chats with friends.&#160; PartyChat essentially provides IRC type functional via <a href="http://talk.google.com" target="_blank">GTalk</a> and has been a great way to have on going conversations throughout the day while avoiding 100+ email threads.</p>
<p>The only pitfall PartyChat has to do with stability.&#160; PartyChat is a free service used by a large number of people, and it is run off the project creator’s computer in his apartment.&#160; I do not know exactly why the service goes down intermittently, but the recipe of home server plus lots of users cannot be helping.&#160; While it stinks that PartyChat isn’t always up, I understand I have no right to demand or expect 100% uptime, so I decided to do something about it.&#160; I leveraged some of the knowledge I picked up about XMPP, the protocol that Jabber and GTalk use, from another project and wrote a simple group chat bot called <a href="http://code.google.com/p/chatsworth" target="_blank">Chatsworth</a> to improve the availability of group chat that my friends and I use and depend on.</p>
<p>Chatsworth is a windows service written in C# that provides basic chat room functionality.&#160; It does not have all the features that PartyChat has, but it does offer people the ability to setup and manage their own chat bots.&#160; Additionally, if you are concerned about having all your chat logs being available not just to Google but also to the people running the PartyChat servers, then Chatsworth is the group chat provider for you.&#160; Chatsworth is fully functional but still immature and under development.&#160; I plan to add some additional features, take care of a few loose ends and provide more unit tests in the immediate future.</p>
<p>Admittedly I could’ve just downloaded the PartyChat java source, compiled it, and ran it on my own set of servers, but where is the fun in that?&#160; I figured rolling my own chat bot would give me the opportunity to do more than address some of the availability issues I was having.&#160; Starting up Chatsworth provides me a non-trivial project that I can use to explore different software development concepts and techniques as well as get some code and design samples out on the web.&#160; So if you’re in the market for group chat in GTalk, give <a href="http://code.google.com/p/chatsworth" target="_blank">Chatsworth</a> a try.&#160; I am looking forward to building this project out further and would love to hear any feedback.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kevfoo.com/index.php/2009/01/chatsworth-a-google-talk-group-chat-bot/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Just Say No (to the Big Redesign)</title>
		<link>http://blog.kevfoo.com/index.php/2009/01/just-say-no-to-the-big-redesign/</link>
		<comments>http://blog.kevfoo.com/index.php/2009/01/just-say-no-to-the-big-redesign/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 04:37:11 +0000</pubDate>
		<dc:creator>Kevin McMahon</dc:creator>
				<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://blog.kevfoo.com/index.php/2009/01/just-say-no-to-the-big-redesign/</guid>
		<description><![CDATA[In a post Robert Martin made last Friday, he described a pretty common scenario that companies and teams go through in an effort to bring peace and harmony to their codebase and restore order over all their components, known as the big redesign.&#160; Having just gone through this at work and having been on the [...]]]></description>
			<content:encoded><![CDATA[<p>In a <a href="http://blog.objectmentor.com/articles/2009/01/09/the-big-redesign-in-the-sky" target="_blank">post</a> Robert Martin made last Friday, he described a pretty common scenario that companies and teams go through in an effort to bring peace and harmony to their codebase and restore order over all their components, known as the big redesign.&#160; Having just gone through this at work and having been on the “Tiger Team” that ported/rewrote our legacy application shell that was a muddled mix of C++/MFC and C#/WinForms, this post really resonated with me.</p>
<p>The moral of Uncle Bob’s story is that the only way to clean up messes in your codebase is to do via incremental changes iteration by iteration and release by release.&#160; If I would have read this post six months ago, I might have argued that this is an overly simplistic take and that exceptional cases exist that make big redesigns necessary.&#160; Having just gone through a big redesign; however, I am confident that fixing your messes iteration by iteration is the only way to fix your codebase issues for the long term especially if your team is trying to develop with agile processes.</p>
<p>My redesign change of heart did not come because of a spectacular failure or the system ending up in a worse shape than before.&#160; I like to think our sob story about how terrible our legacy codebase was made a pretty compelling case for a redesign (doesn’t everyone?) but I’ll spare you the back story.&#160;&#160; When it comes down to it, even the best reasons and intentions don’t justify a full blown redesign.&#160; Here is why in big bold letters:</p>
<h2>You are not addressing the root causes</h2>
<p>A codebase does not fall into disrepair over night.&#160; Having the Tiger Team do all the heavy lifting and making all the design decisions might solve the problem <em>righthissecond</em> but none of the problems that got you in this bind will have been addressed. Also, if the redesign is radical enough, you could actually be reducing your teams ability to manage and maintain your codebase even further.&#160; Choosing to solve your team’s problems by delegating cleanup to a Tiger Team is the software management equivalent of giving a man a fish instead of teaching him how to fish.</p>
<p>Having a big redesign short circuits everything that the agile process tries to address.&#160; If your team is ignoring the feedback it is getting from having to work with brittle code, not delivering on user story commitments, and rising incidents counts, then what is the redesign buying you other than masking these problems for your team a little longer?&#160; If your team is considering doing a big redesign, do yourself a favor and address the real problems your team has.&#160; Just say no to the big redesign.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kevfoo.com/index.php/2009/01/just-say-no-to-the-big-redesign/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
