<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
   <channel>
      <title>Matt Brindley</title>
      <link>http://www.mattbrindley.com/</link>
      <description />
      <language>en</language>
      <copyright>Copyright 2009</copyright>
      <lastBuildDate>Fri, 14 Aug 2009 14:48:28 +0000</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/?v=4.25</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

      
      <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/MattBrindley" type="application/rss+xml" /><feedburner:emailServiceId>MattBrindley</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
         <title>Announcing Doctype - a Q&amp;A site for web designers</title>
         <description>&lt;p&gt;I'm thrilled to announce our latest venture, &lt;a href="http://doctype.com/"&gt;Doctype&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;a href="http://www.mattbrindley.com/assets_c/2009/08/doctype-large-62.html" onclick="window.open('http://www.mattbrindley.com/assets_c/2009/08/doctype-large-62.html','popup','width=1202,height=786,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"&gt;&lt;img alt="Doctype thumbnail" src="http://www.mattbrindley.com/images/doctype-thumb.png" width="600" height="392" class="mt-image-none" style="" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Doctype is a free question and answer site for web designers. You can get fast solutions to your CSS, HTML, web design and email design problems.&lt;/p&gt;

&lt;p&gt;For each question, Doctype can generate screenshots of your design on any browser or email client. This makes it much easier for other people to see the problem and help you fix it.&lt;/p&gt;

&lt;p&gt;Everything is editable, just like a wiki. This means answers are accurate, neat and up-to-date.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://doctype.com/"&gt;Check it out&lt;/a&gt; and email us with any feedback at &lt;a href="mailto:hello@doctype.com"&gt;hello@doctype.com&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=s_V651d-U_8:14BEMnma1IQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=s_V651d-U_8:14BEMnma1IQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=s_V651d-U_8:14BEMnma1IQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/s_V651d-U_8" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/s_V651d-U_8/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/projects/post/</guid>
         <category>Projects</category>
         <pubDate>Fri, 14 Aug 2009 14:48:28 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/projects/post/</feedburner:origLink></item>
      
      <item>
         <title>Detecting the next available, free TCP port</title>
         <description>&lt;p&gt;&lt;strong&gt;.NET 3.5, C#&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I recently had a need to find an available port for &lt;a href="http://seleniumhq.org/"&gt;selenium&lt;/a&gt;, starting at the default of 4444. The code below checks to see if the port you're about to use is available, incrementing your port number to find the next free port if your first choice is in use.&lt;/p&gt;

&lt;p&gt;This very simple method uses a global mutex to avoid a race condition when releasing a port.&lt;/p&gt;

&lt;p&gt;Adapting it to use UDP is beyond what I need, but it'll be very easy to do - just replace ipGlobalProperties.GetActiveTcpListeners() with ipGlobalProperties.GetActiveUdpListeners();&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
/// &amp;lt;summary&amp;gt;
/// Provides static methods for operations 
/// commonly required when working with TCP ports
/// &amp;lt;/summary&amp;gt;
public static class TcpPort
{
    private const string PortReleaseGuid = 
        "8875BD8E-4D5B-11DE-B2F4-691756D89593";

    /// &amp;lt;summary&amp;gt;
    /// Check if startPort is available, incrementing and
    /// checking again if it's in use until a free port is found
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name="startPort"&amp;gt;The first port to check&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;The first available port&amp;lt;/returns&amp;gt;
    public static int FindNextAvailablePort(int startPort)
    {
        int port = startPort;
        bool isAvailable = true;

        var mutex = new Mutex(false, 
            string.Concat("Global/", PortReleaseGuid));
        mutex.WaitOne();
        try
        {
            IPGlobalProperties ipGlobalProperties = 
                IPGlobalProperties.GetIPGlobalProperties();
            IPEndPoint[] endPoints = 
                ipGlobalProperties.GetActiveTcpListeners();

            do
            {
                if (!isAvailable)
                {
                    port++;
                    isAvailable = true;
                }

                foreach (IPEndPoint endPoint in endPoints)
                {
                    if (endPoint.Port != port) continue;
                    isAvailable = false;
                    break;
                }

            } while (!isAvailable &amp;&amp; port &amp;lt; IPEndPoint.MaxPort);

            if (!isAvailable)
                throw new NoAvailablePortsInRangeException();

            return port;
        }
        finally
        {
            mutex.ReleaseMutex();
        }
    }
}
&lt;/pre&gt;

&lt;p&gt;For usage examples, please see my integration tests:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
[TestFixture]
public class TcpPortFixture
{
    [Test]
    public void FindNextAvailablePort()
    {
        Assert.That(TcpPort.FindNextAvailablePort(4444), 
            Is.EqualTo(4444));
    }

    [Test]
    public void FindNextAvailablePortInUse()
    {
        var tcpListener = 
            new TcpListener(IPAddress.Parse("127.0.0.1"), 4444);
        try
        {
            tcpListener.Start();
            Assert.That(TcpPort.FindNextAvailablePort(4444), 
                Is.EqualTo(4445));
        }
        finally
        {
            tcpListener.Stop();
        }
    }
}
&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=hdg61c_PWo8:WU0947A59Dk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=hdg61c_PWo8:WU0947A59Dk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=hdg61c_PWo8:WU0947A59Dk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/hdg61c_PWo8" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/hdg61c_PWo8/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/developing/windows/net/detecting-the-next-available-free-tcp-port/</guid>
         <category>.net</category>
         <pubDate>Sat, 20 Jun 2009 01:08:02 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/developing/windows/net/detecting-the-next-available-free-tcp-port/</feedburner:origLink></item>
      
      <item>
         <title>Announcing: Flare 1.0</title>
         <description>&lt;p&gt;&lt;strong&gt;Download:&lt;/strong&gt; &lt;a href="http://flare-browser.googlecode.com/files/Setup.msi"&gt;http://flare-browser.googlecode.com/files/Setup.msi&lt;/a&gt; (.msi, 2MB)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forum Support:&lt;/strong&gt; &lt;a href="http://code.google.com/p/flare-browser/issues/list"&gt;http://code.google.com/p/flare-browser/issues/list&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chat Support:&lt;/strong&gt; &lt;a href="http://mattbrindley.campfirenow.com/85df4"&gt;Matt Brindley | Public Room&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can now download Flare 1.0 - the site-specific browser for &lt;a href="http://campfirenow.com/"&gt;37signals' Campfire web app&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Flare lets you stay logged into a room in your Campfire account and notifies you of any new messages.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;strong&gt;Features&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Stay logged into your favourite Campfire room in the background - even between reboots.&lt;/li&gt;
&lt;li&gt;Quickly switch between open rooms using Ctrl + the room number&lt;/li&gt;
&lt;li&gt;Be notified of new messages with a preview.&lt;/li&gt;
&lt;li&gt;Tray icon changes colour to show new messages have arrived (in case you miss the preview)&lt;/li&gt;
&lt;li&gt;Request your password through the app if you've lost it.&lt;/li&gt;
&lt;li&gt;Run multiple copies of Flare keeping you logged into many different rooms at once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;
&lt;strong&gt;Instructions&lt;/strong&gt;&lt;ol&gt;&lt;li&gt;Make sure you've got .Net 2 installed, if not, &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5&amp;DisplayLang=en"&gt;get it here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://flare-browser.googlecode.com/files/Setup.msi"&gt;Click here to download and install Flare&lt;/a&gt; (.msi, 2MB)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Flare has been tested on Windows XP, Server 2003, Vista, Server 2008 and Windows 7.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;strong&gt;How to use Flare&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;After installation completes visit Start &gt; All Programs &gt; Flare&lt;/li&gt;
&lt;li&gt;If you've not used Flare before it will ask you for your account name, username and password.

&lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="Flare settings" src="http://www.mattbrindley.com/images/flare-settings.png" width="374" height="287" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Once Flare has logged into your account you'll see your campfire lobby, enter the room you want to and minimise the window. Flare will keep you logged into this room until you leave it.&lt;br /&gt;
&lt;a href="http://www.mattbrindley.com/images/flare2.html" onclick="window.open('http://www.mattbrindley.com/images/flare2.html','popup','width=1000,height=700,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"&gt;&lt;img alt="Flare Screenshot" src="http://www.mattbrindley.com/images/flare2-thumb2.jpg" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;When new messages, pastes, files or users arrive you'll be notified with a semi-transparent message preview.&lt;br /&gt;
&lt;a href="http://www.mattbrindley.com/images/flare.html" onclick="window.open('http://www.mattbrindley.com/images/flare.html','popup','width=390,height=180,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"&gt;&lt;img alt="Flare screenshot" src="http://www.mattbrindley.com/images/flare-thumb2.jpg" width="303" height="140" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;If you miss the preview, don't worry - Flare's icon will glow orange until you next view the window.&lt;br /&gt;
&lt;img alt="Flare screenshot" src="http://www.mattbrindley.com/images/flarenotify.gif" width="150" height="60" /&gt;&lt;/li&gt;&lt;br /&gt;
&lt;/ol&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt; SSL support has now been added. If your account uses SSL, make sure you check the "Use SSL" checkbox when entering your account name, username and password.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt;I've released Flare under the GNU GPL. More details at: &lt;a href="http://code.google.com/p/flare-browser/"&gt;http://code.google.com/p/flare-browser/&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=zgKv9GR-DjU:wJ-xZc5HuJc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=zgKv9GR-DjU:wJ-xZc5HuJc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=zgKv9GR-DjU:wJ-xZc5HuJc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/zgKv9GR-DjU" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/zgKv9GR-DjU/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/projects/campfire-windows-app/announcing-flare/</guid>
         <category>Campfire Windows App</category>
         <pubDate>Fri, 19 Jun 2009 23:37:35 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/projects/campfire-windows-app/announcing-flare/</feedburner:origLink></item>
      
      <item>
         <title>Building a web app - Get involved!</title>
         <description>&lt;p&gt;I've put together a "coming soon" page for &lt;a href="http://consolewriteline.com/"&gt;http://consolewriteline.com/&lt;/a&gt; that includes a form to sign up for beta notifications.&lt;/p&gt;

&lt;p&gt;If you'd like to get involved and try consolewriteline out first, &lt;a href="http://consolewriteline.com/"&gt;enter your email address in the signup form&lt;/a&gt; or email me at &lt;a href="mailto:matt@mattbrindley.com?subject=I'd like to try out ConsoleWriteLine"&gt;matt@mattbrindley.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=D4j7m_RWdcQ:0Oi84FaH-0o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=D4j7m_RWdcQ:0Oi84FaH-0o:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=D4j7m_RWdcQ:0Oi84FaH-0o:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/D4j7m_RWdcQ" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/D4j7m_RWdcQ/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/projects/consolewriteline-1/building-a-web-app-get-involved/</guid>
         <category>ConsoleWriteLine</category>
         <pubDate>Fri, 19 Jun 2009 22:22:36 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/projects/consolewriteline-1/building-a-web-app-get-involved/</feedburner:origLink></item>
      
      <item>
         <title>Building a web app - Part 3: Designing a mock up</title>
         <description>&lt;p&gt;This is part 3 of &lt;strong&gt;Building a web app&lt;/strong&gt;. You can find &lt;a href="http://www.mattbrindley.com/projects/consolewriteline-1/building-a-web-app-part-1-the-idea/"&gt;part 1 here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I want to pitch the idea to a few, carefully selected developers to get their feedback. I thought a mock-up could help to explain the idea, and add a little weight to the proposal.&lt;/p&gt;

&lt;p&gt;Design is not my forte, but I also appreciate how important good UI design is. Rather than spending a disproportionate amount of time on the design, I've decided to approach the design of my app in two stages:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Purchase a clean, simple and easy to amend template that I can bend to fit my app.&lt;/li&gt;
&lt;li&gt;If the idea is well received, I can hire a designer to pay some further attention to the UI.&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;I have no doubts that an excellent UI designer will make a big difference to the product's success, but I just need a mock and something to use during testing right now.&lt;/p&gt;

&lt;p&gt;Turns out there's a lot of ugly templates out there! Luckily I've found something clean for $59 that I think I can change to suit.&lt;/p&gt;

&lt;p&gt;       &lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;a href="http://www.mattbrindley.com/assets_c/2009/06/129-56.html" onclick="window.open('http://www.mattbrindley.com/assets_c/2009/06/129-56.html','popup','width=1000,height=1350,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"&gt;View image&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;After some tweaking, I have my first mock, ready to begin pitching the idea:&lt;/p&gt;

&lt;p&gt;       &lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;a href="http://www.mattbrindley.com/assets_c/2009/06/newmock-58.html" onclick="window.open('http://www.mattbrindley.com/assets_c/2009/06/newmock-58.html','popup','width=1000,height=2150,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"&gt;View image&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;I'm a little nervous now. I've only invested 2 evenings and $147 so far, but I'm growing increasingly attached to ConsoleWriteLine and tomorrow's job is to pitch the idea to a few developers to get their take on it.&lt;/p&gt;

&lt;p&gt;I hope they like it, but if they don't, I'm prepared to write the idea off.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;There'll be a small wait before the next post while I wait for replies.&lt;/em&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=MTuewDJs5yk:kYfQ0s_1imk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=MTuewDJs5yk:kYfQ0s_1imk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=MTuewDJs5yk:kYfQ0s_1imk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/MTuewDJs5yk" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/MTuewDJs5yk/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/projects/consolewriteline-1/building-a-web-app-part-3-designing-a-mock/</guid>
         <category>ConsoleWriteLine</category>
         <pubDate>Fri, 19 Jun 2009 22:09:27 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/projects/consolewriteline-1/building-a-web-app-part-3-designing-a-mock/</feedburner:origLink></item>
      
      <item>
         <title>Building a web app - Part 2: Naming it</title>
         <description>&lt;p&gt;This is part 2 of &lt;strong&gt;Building a web app&lt;/strong&gt;. You can find &lt;a href="http://www.mattbrindley.com/projects/consolewriteline-1/building-a-web-app-part-1-the-idea/"&gt;part 1 here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First I went hunting for a name. I wanted something techy and specific to my audience (.net developers). One idea was something you use in temporary apps while experimenting with a part of the framework you're not familiar with:&lt;/p&gt;

&lt;p&gt; 		&lt;pre&gt;Console.WriteLine("Result: {0}", result);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Some developers use Debug.WriteLine, Trace.WriteLine or custom logging implementations, but after a cursory glance over &lt;a href="http://stackoverflow.com/questions/tagged/.net"&gt;StackOverflow&lt;/a&gt; and &lt;a href="http://bytes.com/topic/net/"&gt;Bytes&lt;/a&gt;, most examples seem to use Console.WriteLine.&lt;/p&gt;

&lt;p&gt;I've decided to start with Console.WriteLine and the domain name &lt;a href="http://consolewriteline.com"&gt;consolewriteline.com&lt;/a&gt;, I can always change it later.&lt;/p&gt;

&lt;p&gt;With idea, product and domain name under my belt, and with motivation at an all time high, I'm all set for tomorrow evening's task: design a mock up.&lt;/p&gt;

&lt;p&gt;Read &lt;a href="http://www.mattbrindley.com/projects/consolewriteline-1/building-a-web-app-part-3-designing-a-mock/"&gt;Building a web app - Part 3: Designing a mock up&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=f9Y8LuuyAdo:BzevRJfS7Zw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=f9Y8LuuyAdo:BzevRJfS7Zw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=f9Y8LuuyAdo:BzevRJfS7Zw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/f9Y8LuuyAdo" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/f9Y8LuuyAdo/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/projects/consolewriteline-1/building-a-web-app-part-2-naming-it/</guid>
         <category>ConsoleWriteLine</category>
         <pubDate>Thu, 18 Jun 2009 19:38:53 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/projects/consolewriteline-1/building-a-web-app-part-2-naming-it/</feedburner:origLink></item>
      
      <item>
         <title>Building a web app - Part 1: The idea</title>
         <description>&lt;p&gt;I've been sitting on an idea for months and I'm still excited about it.&lt;/p&gt;

&lt;p&gt;I think there's potential in an online version of the MSDN library docs that allows you to edit, build and run example code in your browser. A kind of prepared scratch-pad. This solves a problem that I've been referring to as ConsoleApplication99 syndrome.&lt;/p&gt;

&lt;p&gt;I'm going to document building the service in a series of articles, I'm doing this because:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt; As I'll be working on this alongside my main job, sharing progress with you should help keep me motivated and focused. I'm not going to out-right promise stuff, but I know I'll feel more obligated.&lt;/li&gt;
&lt;li&gt;Silly decisions will stand out. If I have to justify my decisions with you, I'm far less likely to spend hours on things that don't matter to *you* - the reader and potential user. &lt;/li&gt;
&lt;li&gt;Money. I'll be spending some in place of spending extra time. Justifying expenses openly will be an interesting (and useful) exercise.&lt;/li&gt;
&lt;li&gt;Your feedback will help shape the project.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I've started investigating the feasibility of the project and have made some conclusions:&lt;br/&gt;
&lt;ul&gt;&lt;li&gt;The service will use an API called &lt;a href="http://services.msdn.microsoft.com/ContentServices/ContentService.asmx"&gt;MTPS&lt;/a&gt; to fetch MSDN Library content.&lt;/li&gt; &lt;li&gt;Republishing this content is within Microsoft's terms of use.&lt;/li&gt;
&lt;li&gt;Security issues will be addressed with cloud computing (&lt;a href="http://litmusapp.com/"&gt;Litmus&lt;/a&gt; has 400 instances with &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt;, so I'm familiar with it).&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;When I have specifics, I'll share them properly. Right now I'm just keeping an eye out for show-stoppers.&lt;/p&gt;

Read &lt;a href="http://www.mattbrindley.com/projects/consolewriteline-1/building-a-web-app-part-2-naming-it/"&gt;Building a web app - Part 2: Naming it&lt;/a&gt;.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=iS842ifEVto:n5ZpFsShc_s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=iS842ifEVto:n5ZpFsShc_s:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=iS842ifEVto:n5ZpFsShc_s:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/iS842ifEVto" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/iS842ifEVto/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/projects/consolewriteline-1/building-a-web-app-part-1-the-idea/</guid>
         <category>ConsoleWriteLine</category>
         <pubDate>Wed, 17 Jun 2009 23:10:42 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/projects/consolewriteline-1/building-a-web-app-part-1-the-idea/</feedburner:origLink></item>
      
      <item>
         <title>Fingerprint: Email client usage statistics</title>
         <description>&lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;a href="http://www.mattbrindley.com/images/fingerprint-results.png/Picture%209.html" onclick="window.open('http://www.mattbrindley.com/images/fingerprint-results.png/Picture%209.html','popup','width=921,height=854,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"&gt;&lt;form mt:asset-id="16" class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="Fingerprint results screen shot" src="http://www.mattbrindley.com/images/fp-header-2.gif/fp-header.gif" width="498" height="140" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/form&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://litmusapp.com/"&gt;David, Paul and I&lt;/a&gt; have just finished launching our latest product, &lt;a href="http://fingerprintapp.com/"&gt;Fingerprint&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;From the &lt;a href="http://fingerprintapp.com/"&gt;Fingerprint home page&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
There has been no way to get accurate, up-to-date statistics on email client usage. Until now.

&lt;p&gt;&lt;a href="http://fingerprintapp.com/"&gt;Fingerprint&lt;/a&gt; shows you which email clients your readers are using.&lt;/p&gt;

&lt;p&gt;Knowing which email clients are popular means you can be certain your messages are being displayed as you intended. Get actionable statistics within 24 hours of sending your next campaign.&lt;br /&gt;
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://fingerprintapp.com/"&gt;Fingerprint&lt;/a&gt; is a clean, simple idea, and the data we've received so far (on our own mailing lists) is proving incredibly valuable; we had no idea 6% of our subscribers read our emails on an iPhone!&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;How does it work?&lt;/strong&gt;&lt;br /&gt;
We give you a small 'bug' to put in your email, it's a small bit of HTML that we use to track which clients your subscribers are using. Every 30 minutes we update your analysis with the latest stats from your readers. The site offers percentages, and there's a spreadsheet you can download with a full breakdown of clients and quantities.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;How much does it cost?&lt;/strong&gt;&lt;br /&gt;
We're charging just $39 per analysis. An analysis is a two week snapshot of your subscribers' email client usage.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Why should I care?&lt;/strong&gt;&lt;br /&gt;
Good question. It's very hard to know which clients to design your html email newsletter for, and with clients such as Lotus Notes 6-8 and Outlook 2007 out there, it's often unrealistic to design for all of them. Especially since there's a growing number of smaller, web-based clients. Do you know how many of your readers are using these?&lt;/p&gt;

&lt;p&gt;&lt;a href="http://fingerprintapp.com/"&gt;Fingerprint&lt;/a&gt; gives you a single report answering all these questions, and allows you to make a firm, informed decision on which clients to design for and support.&lt;/p&gt;

&lt;p&gt;From the data we've seen passing through so far, you'll be amazed at the results. During development, Paul, David and I had talked about what sort of results to expect, Outlook would be high, naturally, we also expected Gmail, Yahoo, AOL and Hotmail/Live mail to be up there. So far only Outlook has proved as popular as we expected, the iPhone was a notable surprise for our own list, with Lotus Notes making an unexpected appearance as well.&lt;/p&gt;

&lt;p&gt;I can't wait to see the overall averages per industry!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=Tegg9ZqQFvs:-5Isr0ENmj4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=Tegg9ZqQFvs:-5Isr0ENmj4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=Tegg9ZqQFvs:-5Isr0ENmj4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/Tegg9ZqQFvs" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/Tegg9ZqQFvs/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/fingerprint-email-client-usage-1/</guid>
         <category />
         <pubDate>Wed, 18 Jun 2008 03:21:02 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/fingerprint-email-client-usage-1/</feedburner:origLink></item>
      
      <item>
         <title>1 year of Litmus updates in 60 seconds</title>
         <description>&lt;p&gt;&lt;em&gt;&lt;a href="http://litmusapp.com/"&gt;Litmus&lt;/a&gt; makes compatibility testing easier by serving you screenshots of your web pages and email newsletters in a huge range of browsers and clients across all 3 major platforms.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We've recently launched another wave of updates for &lt;a href="http://litmusapp.com/"&gt;Litmus&lt;/a&gt;, including some &lt;a href="http://www.litmusapp.com/pricing"&gt;brand new price plans&lt;/a&gt;, a &lt;a href="https://signup.litmusapp.com/free-plan"&gt;totally free version&lt;/a&gt; and a brand new marketing site!&lt;/p&gt;

&lt;p&gt;To mark the occasion, I've drawn up the last year of updates into a quick, '60 second' list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aug 2007&lt;/strong&gt; SiteVista becomes Litmus.&lt;br /&gt;
&lt;strong&gt;Sep 2007&lt;/strong&gt; Opera 9.5 and Yahoo! mail join the line-up.&lt;br /&gt;
&lt;strong&gt;Oct 2007&lt;/strong&gt; Automated validation added.&lt;br /&gt;
&lt;strong&gt;Nov 2007&lt;/strong&gt; Seeed.org, a community site, launched.&lt;br /&gt;
&lt;strong&gt;Jan 2008&lt;/strong&gt; Spam filter reporting for webmail clients added.&lt;br /&gt;
&lt;strong&gt;Feb 2008&lt;/strong&gt; Bulk-API announced, new partners begin integrating Litmus immediately.&lt;br /&gt;
&lt;strong&gt;Mar 2008&lt;/strong&gt; 24-hour passes launched, they become our most popular product overnight.&lt;br /&gt;
&lt;strong&gt;Mar 2008&lt;/strong&gt; Internet Explorer 8 beta is announced by MS, it's available to all Litmus users within a few hours.&lt;br /&gt;
&lt;strong&gt;Mar 2008&lt;/strong&gt; New updates system announced, powered by Twitter.&lt;br /&gt;
&lt;strong&gt;Apr 2008&lt;/strong&gt; Lotus Notes 6.5, 7 and 8 are added to the testing suite.&lt;br /&gt;
&lt;strong&gt;Apr 2008&lt;/strong&gt; Safari 2, 3.1; Camino 1, 1.6 are added.&lt;br /&gt;
&lt;strong&gt;Apr 2008&lt;/strong&gt; Apple Mail 2.1 and 3.1 added.&lt;br /&gt;
&lt;strong&gt;Apr 2008&lt;/strong&gt; Konqueror and Firefox on Ubuntu added.&lt;br /&gt;
&lt;strong&gt;May 2008&lt;/strong&gt; Customer API released.&lt;br /&gt;
&lt;strong&gt;Jun 2008&lt;/strong&gt; Spam filter reporting for 17 spam clients/services begins beta testing.&lt;br /&gt;
&lt;strong&gt;Today&lt;/strong&gt; So impressed with Litmus, you sign up and marvel at how easy compatibility testing has become.&lt;/p&gt;

&lt;p&gt;As if all that wasn't enough, we've got another product up our sleeves - more about that shortly!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=bbkmamHO754:urmE42YqzYs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=bbkmamHO754:urmE42YqzYs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=bbkmamHO754:urmE42YqzYs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/bbkmamHO754" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/bbkmamHO754/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/projects/litmus/1-year-of-litmus-updates-in-60/</guid>
         <category>Litmus</category>
         <pubDate>Sat, 14 Jun 2008 02:12:13 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/projects/litmus/1-year-of-litmus-updates-in-60/</feedburner:origLink></item>
      
      <item>
         <title>Shout: At a glance status using twitter</title>
         <description>&lt;p&gt;&lt;a href="http://davidsmalley.com"&gt;David Smalley&lt;/a&gt;, who I work with at &lt;a href="http://litmusapp.com/"&gt;Litmus&lt;/a&gt;, has recently released &lt;a href="http://github.com/davidsmalley/shout/tree/release"&gt;Shout&lt;/a&gt;, a merb web app.&lt;/p&gt;

&lt;p&gt;It's a great idea; we've been using it internally at Litmus and I can't recommend it enough. &lt;/p&gt;

&lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="Shout screenshot" src="http://www.mattbrindley.com/images/shout.gif/inout.gif" width="535" height="427" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=eqHvT9FUMwo:NJBH_ZYhBXA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=eqHvT9FUMwo:NJBH_ZYhBXA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=eqHvT9FUMwo:NJBH_ZYhBXA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/eqHvT9FUMwo" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/eqHvT9FUMwo/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/misc/shout-at-a-glance-status-using/</guid>
         <category>Misc.</category>
         <pubDate>Sat, 14 Jun 2008 02:01:19 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/misc/shout-at-a-glance-status-using/</feedburner:origLink></item>
      
      <item>
         <title>BarCampSheffield</title>
         <description>&lt;p&gt;I've been at BarCampSheffield this weekend and it's been a lot of fun!&lt;/p&gt;

&lt;p&gt;Within the first 2 hours I'd learnt more from casual conversations with people than I learnt during the whole 3 days at MIX07.&lt;/p&gt;

&lt;p&gt;We saw demos from some great other applications - &lt;a href="http://meecard.com/"&gt;MeeCard&lt;/a&gt; and &lt;a href="http://afeeda.com/"&gt;aFeeda&lt;/a&gt; in particular stood out.&lt;/p&gt;

&lt;p&gt;I gave a ThinkFold demo as well, it went really well - I had 4 people from the audience come up and enter their email addresses to share the outline I'd used to build the presentation.&lt;br /&gt;
The feedback was fantastic, plenty of stuff we'd not thought of yet and some great tips on how to improve it further.&lt;/p&gt;

&lt;p&gt;Thanks to everyone that participated in the demo, people had some very nice and constructive things to say about ThinkFold inside the outline:&lt;/p&gt;

&lt;blockquote&gt;"This is very clever, seriously impressed"&lt;/blockquote&gt;

&lt;blockquote&gt;"Awesome."&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;
We also had some great questions:&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
&lt;blockquote&gt;How long did it take to code this?&lt;blockquote&gt;Around 15 weeks of development spread over a year.&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;/p&gt;

&lt;blockquote&gt;Will you integrate this with any third party sites?&lt;blockquote&gt;Yes and no - we want to create the platform for people to do that, primarily consuming other products' APIs within a ThinkFold document, but later sending data directly into 3rd party services.&lt;br/&gt;I expect I'll get stuck in and build a few basic ThinkFold plugins myself, stuff like a google define plugin and an 'outline a page' plugin - but more importantly we want anyone to be able to create one that works with their service.&lt;/blockquote&gt;&lt;/blockquote&gt;

&lt;p&gt;Thanks again to everyone that voted for ThinkFold in the 'Best Web App' competition as well! (We came 2nd - the &lt;a href="http://meecard.com/"&gt;MeeCard&lt;/a&gt; guys just beat us to it ;-)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://flickr.com/photos/30768028@N00/515973353/"&gt;&lt;img alt="Demoing ThinkFold at BarCampSheffield" src="http://www.mattbrindley.com/images/tf-barcamp-demo.jpg" width="500" height="332" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=aeY8OztBOB4:0H-xIEsvnv4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=aeY8OztBOB4:0H-xIEsvnv4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=aeY8OztBOB4:0H-xIEsvnv4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/aeY8OztBOB4" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/aeY8OztBOB4/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/misc/barcampsheffield/</guid>
         <category>Misc.</category>
         <pubDate>Sun, 27 May 2007 20:02:46 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/misc/barcampsheffield/</feedburner:origLink></item>
      
      <item>
         <title>Flare Released Under GPL</title>
         <description>&lt;p&gt;I've released Flare under the GNU General Public License and hosted the project on GoogleCode, I've thrown together a landing page on this site for now:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://flarenow.com/"&gt;http://flarenow.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since all of Flare's comments, bug reports and suggestions live in the &lt;a href="http://www.mattbrindley.com/projects/campfire-windows-app/announcing-flare/"&gt;comments of the post announcing Flare&lt;/a&gt; I'll keep using that until something more suitable is found.&lt;/p&gt;

&lt;p&gt;If you'd like to contribute or help in any other way - &lt;a href="http://mattbrindley.campfirenow.com/85df4"&gt;let me know&lt;/a&gt;!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=1ZfDVCdYaXc:yPoOT8UEvf0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=1ZfDVCdYaXc:yPoOT8UEvf0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=1ZfDVCdYaXc:yPoOT8UEvf0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/1ZfDVCdYaXc" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/1ZfDVCdYaXc/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/projects/campfire-windows-app/flare-released-under-gpl/</guid>
         <category>Campfire Windows App</category>
         <pubDate>Thu, 17 May 2007 16:54:09 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/projects/campfire-windows-app/flare-released-under-gpl/</feedburner:origLink></item>
      
      <item>
         <title>Artificially Delayed Splash Screens</title>
         <description>&lt;p&gt;Recently, Dave, Paul and I were laughing about how, when very new to developing, we would place artificial delays in our loading 'splash' screens (this was a long time ago, if you're worried :). The very idea of making the user wait for no reason seems absurd now, but it got me thinking about why we did it (ultimately our goal was the same as it is now - that our product be useful and valuable to the end user).&lt;/p&gt;

&lt;p&gt;I think we did it because we wanted the user to think our app was big, powerful and did so much important stuff it couldn't possibly load in under 3 seconds. It's interesting that we associated a long waiting time with a better, more powerful app.&lt;/p&gt;

&lt;p&gt;Now, I'm not proposing we all start forcing our users to wait 3 seconds before every page load, but there's definitely something to associating longer waiting times with more 'power' - and therefore smaller waiting times with small, simple actions.&lt;/p&gt;

&lt;p&gt;Of course, the first time we request an action be performed we have no idea how long we will have to wait. But after just a few requests of an action (such as clicking a button) we'll begin to associate that action with a degree of waiting. After a while, we begin to make decisions about how we use software based on the time we expect to wait for the requests we can make. There are often many alternatives to achieve similar results (for example, I will often Ctrl+click links in a browser to open them in a new tab in the background as I know that action will take a few seconds to complete and I wish to stay reading the current page while waiting for it.).&lt;/p&gt;

&lt;p&gt;Armed with this knowledge base of actions and their associated delays, we then begin to weigh the expected delay with the expected result in every decision we make.&lt;/p&gt;

&lt;p&gt;Take Adobe Acrobat Reader for example, I rarely click PDF results in a Google search because I associate the “[PDF]” tag with an action that doesn't yield a result that justifies the expected delay. Now I can't possibly know how valuable the content of that PDF will be to me before I open the PDF, so why does my mind decide the delay doesn't justify the result? Perhaps it is because my mind compares the opening of a PDF in my browser to the opening of a normal, html web page. The request for the action is similar and the result is identical (text, images, form elements) - so why wouldn't it be disappointed with the result after such a considerable delay when compared with opening a web page?&lt;/p&gt;

&lt;p&gt;With this in mind, the use of AJAX becomes very important. Requests for actions in web applications can be associated with small, simple actions (a simple AJAX request) and longer, more powerful actions (a page postback).&lt;/p&gt;

&lt;p&gt;Consider every request in your web application. Does the delay reflect the result of the action? This works both ways; it should not be possible to invoke more powerful actions with significant results via a small, quick request. Say I wish to delete a task item, such a small action should not have a delay, but if I want to delete a task list of 500 tasks? From a technical point of view this action will not take any longer (as far as the client-side view is concerned) but to the user, this action is huge. So what do we do? Artificially delay the action's result so the action's delay reflects the power of the action?&lt;br /&gt;
One idea is to bloat the delay by prompting the user to confirm their action. This is certainly worth considering, but falls down as it doesn't reflect the size of action. If I attempt to delete a task list with a single task, I would consider this a small, quick action. If I attempt to delete a task list with 500 tasks, I expect a longer, more delayed action. It's this delay that allows my brain to build a knowledge base of actions and their associated delay so I know in future which actions can be performed with little thought or attention and which actions I need to think through before requesting. &lt;/p&gt;

&lt;p&gt;The time delay between requesting an action and getting results back is an ideal, Real variable that we can use to quantify an action's 'size' in a user's mind.&lt;/p&gt;

&lt;p&gt;Sure, I don't know how long an action will take before I request it, but it doesn't take long before I've built up that knowledge base and I can switch off or focus on other things while using the application - until I'm about to request an action that I know is big, then I'll give it all my attention before clicking that 'delete all tasks' button.&lt;br /&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=UObb32bzDJo:g3DV5U6p1Us:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=UObb32bzDJo:g3DV5U6p1Us:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=UObb32bzDJo:g3DV5U6p1Us:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/UObb32bzDJo" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/UObb32bzDJo/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/artificially-delayed-splash-sc/</guid>
         <category />
         <pubDate>Wed, 09 May 2007 22:38:16 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/artificially-delayed-splash-sc/</feedburner:origLink></item>
      
      <item>
         <title>Sign Up for the ThinkFold Private Beta</title>
         <description>&lt;p&gt;We're getting very close to launching &lt;a href="http://www.thinkfold.com/"&gt;ThinkFold&lt;/a&gt;'s private beta and I'd like to give readers of my blog the first chance to sign up.&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;&lt;a href="http://thinkfold.com/outliner/login/"&gt;Click here to access the future ThinkFold homepage&lt;/a&gt;.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To sign up, enter your email address in the sign up form on the right of the page. We'll let you know as soon as ThinkFold is ready for you.&lt;/p&gt;

&lt;p&gt;&lt;img alt="tf-signup.png" src="http://www.mattbrindley.com/images/tf-signup.png" width="225" height="159" /&gt;&lt;/p&gt;

&lt;p&gt;At this early stage we're particularly interested in two types of people - those that have never outlined (to make sure that ThinkFold is the best possible introduction to outlining) and those that are experienced outliners (to make sure ThinkFold stands up to the competition). &lt;/p&gt;

&lt;p&gt;Of course, everyone is welcome - but if you have never outlined before, or don't know what it is, I'd really recommend trying out the ThinkFold beta once it's ready. Outlining is a fantastic thinking tool that I only discovered myself just over a year ago.&lt;/p&gt;

&lt;p&gt;We do ask that you give feedback via the web app as often as you can, it's very easy to use and doesn't take you away from your current, open outline.&lt;/p&gt;

&lt;p&gt;&lt;img alt="tf-reportbug.png" src="http://www.mattbrindley.com/images/tf-reportbug.png" width="270" height="341" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ThinkFold?&lt;/strong&gt;&lt;br /&gt;
Wikipedia on outlining:&lt;br /&gt;
&lt;blockquote&gt;An outliner is a special text editor that allows text to be structured as an outline.&lt;/p&gt;

&lt;p&gt;Outliners are typically used for computer programming, collecting or organizing ideas, Getting Things Done, or project management. &lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;ThinkFold is an online outliner that allows you to share outlines with other users and edit the document together, in real-time.&lt;/p&gt;

&lt;p&gt;It's fast, reliable and I'm sure you'll find it an invaluable thinking and planning tool, both when alone and when collaborating.&lt;/p&gt;

&lt;p&gt;As always, feel free to contact me: matt@mattbrindley.com if you have any questions.&lt;/p&gt;

&lt;p&gt;I'll also be hanging around in my campfire room: &lt;a href="http://mattbrindley.campfirenow.com/85df4"&gt;http://mattbrindley.campfirenow.com/85df4&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=F4__5-XQ-Xc:Oj3MZzYCFlc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=F4__5-XQ-Xc:Oj3MZzYCFlc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=F4__5-XQ-Xc:Oj3MZzYCFlc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/F4__5-XQ-Xc" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/F4__5-XQ-Xc/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/projects/thinkfold/sign-up-for-the-thinkfold-priv/</guid>
         <category>ThinkFold</category>
         <pubDate>Sun, 06 May 2007 00:11:59 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/projects/thinkfold/sign-up-for-the-thinkfold-priv/</feedburner:origLink></item>
      
      <item>
         <title>Announcing: CSSVista 0.15</title>
         <description>&lt;p&gt;&lt;a href="http://www.mattbrindley.com/images/cssvista-015-1.html" onclick="window.open('http://www.mattbrindley.com/images/cssvista-015-1.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"&gt;&lt;img alt="cssvista-015-1-thumb.jpg" src="http://www.mattbrindley.com/images/cssvista-015-1-thumb.jpg" width="270" height="203" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Download&lt;/strong&gt;&lt;br /&gt;
&lt;a href="http://www.sitevista.com/cssvista/cssvista.msi"&gt;CSSVista 0.15&lt;/a&gt; &lt;em&gt;(.msi, 8.9MB)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.mattbrindley.com/files/cssvista.msi"&gt;Mirror Download Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Please uninstall any older versions of CSSVista before installing 0.15.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;Editing of CSS and inline styles, with a live preview in both Internet Explorer and Firefox at the same time.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Element outlining in both Firefox and Internet Explorer.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Powerful CSS Editor, including:&lt;ul&gt;&lt;li&gt;Syntax highlighting.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Auto complete.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Dual-pane editing (view two seperate places in the same css-file at once).&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Find (and Replace) with RegEx support.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Option to resize the window to typical sizes.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Option to disable images and/or css.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Firefox now supports various plugins such as Flash and QuickTime.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Lots and lots of bug fixes.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;strike&gt;Auto file-version saving&lt;/strike&gt; Testing has uncovered a lot of problems with this so I'm removing it for now.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Auto-updates - all updates happen silently in the background.&lt;/li&gt;&lt;br /&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt;&lt;br /&gt;
Windows XP, 2003 or Vista&lt;br /&gt;
MS .net Framework 2.0 (if you're using Vista you don't need this - if you're using XP or 2003 you probably already have it installed - if you don't - &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&amp;displaylang=en"&gt;download and install it here&lt;/a&gt;).&lt;br /&gt;
The version of Internet Explorer you have installed determines which version CSSVista will use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;&lt;br /&gt;
If CSSVista seems to be running slowly, try unchecking "Automatic CSS Refreshing" found under the tools menu. You'll need to press Ctrl+S from now on to update the browsers.&lt;/p&gt;

&lt;p&gt;If you receive an error about IE throwing an 'out of memory' error, please post the url you were using at the time, or email it to me at: &lt;a href="mailto:matt@mattbrindley.com"&gt;matt@mattbrindley.com&lt;/a&gt; if you prefer.&lt;/p&gt;

&lt;p&gt;If your outgoing firewall blocks CSSVista, approve it and then restart CSSVista.&lt;br /&gt;
Some firewalls (including Windows Firewall) will continue to deny CSSVista access because of the way it first connects - restarting CSSVista will fix this problem.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;What took so long?&lt;/strong&gt;&lt;br /&gt;
First of all, an apology.&lt;br /&gt;
Sorry for &lt;a href="http://snook.ca/archives/other/cssvista_you_do/"&gt;the problems CSSVista 0.1 had&lt;/a&gt;, and sorry it's taken so long to get a fix out.&lt;br /&gt;
I'm not going to dwell on this, but I would like to explain why it took me so long to get an update out.&lt;/p&gt;

&lt;p&gt;Not long after launching CSSVista 0.1 we saw an opportunity with &lt;a href="http://sitevista.com/email.asp"&gt;SiteVista's email testing&lt;/a&gt; service and decided to focus on that, most of my time was spent developing email testing and CSSVista unfortunately took a back seat.&lt;/p&gt;

&lt;p&gt;A few weeks ago I decided to just do everything I could to get a new build out. I started stripping out incomplete features and focusing completely on getting a stable, deployable build ready.&lt;/p&gt;

&lt;p&gt;I really, really hope you'll find the tool useful.&lt;/p&gt;

&lt;p&gt;It's also really important to mention that this may be the last major-version release of CSSVista. It will still be developed, but under different names (don't worry, we'll still be offering a free version of something very similar) and will not be out for a while. We have some fantastic and very exciting ideas for this application.&lt;/p&gt;

&lt;p&gt;Post any bugs you find here and let me know what you think of it!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=Rc3ZM3EfO9M:jr55mZyxQNk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=Rc3ZM3EfO9M:jr55mZyxQNk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MattBrindley?a=Rc3ZM3EfO9M:jr55mZyxQNk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MattBrindley?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MattBrindley/~4/Rc3ZM3EfO9M" height="1" width="1"/&gt;</description>
         <link>http://feedproxy.google.com/~r/MattBrindley/~3/Rc3ZM3EfO9M/</link>
         <guid isPermaLink="false">http://www.mattbrindley.com/projects/cssvista/announcing-cssvista-015/</guid>
         <category>CSSVista</category>
         <pubDate>Sat, 21 Apr 2007 11:08:25 +0000</pubDate>
      <feedburner:origLink>http://www.mattbrindley.com/projects/cssvista/announcing-cssvista-015/</feedburner:origLink></item>
      
   </channel>
</rss>
