<?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>Loosely Typed in Ohio &#187; Eddie Bowen</title>
	<atom:link href="http://www.innova-partners.com/blog/author/ebowen/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.innova-partners.com/blog</link>
	<description>Innova Partners, software, networking, and websites.</description>
	<lastBuildDate>Wed, 20 Apr 2011 15:11:31 +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>Becoming a Better Programmer</title>
		<link>http://www.innova-partners.com/blog/2011/04/20/becoming-a-better-programmer/</link>
		<comments>http://www.innova-partners.com/blog/2011/04/20/becoming-a-better-programmer/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 15:10:35 +0000</pubDate>
		<dc:creator>Eddie Bowen</dc:creator>
				<category><![CDATA[Culture]]></category>

		<guid isPermaLink="false">http://www.innova-partners.com/blog/2011/04/20/becoming-a-better-programmer/</guid>
		<description><![CDATA[ Becoming a Better Programmer   View more presentations from Pete Goodliffe  
]]></description>
			<content:encoded><![CDATA[<div style="width:425px" id="__ss_7660742"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/petegoodliffe/becoming-a-better-programmer" title="Becoming a Better Programmer">Becoming a Better Programmer</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/7660742" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> <div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/petegoodliffe">Pete Goodliffe</a> </div> </div>
]]></content:encoded>
			<wfw:commentRss>http://www.innova-partners.com/blog/2011/04/20/becoming-a-better-programmer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>n-Tier without tears</title>
		<link>http://www.innova-partners.com/blog/2010/08/03/n-tier-without-tears/</link>
		<comments>http://www.innova-partners.com/blog/2010/08/03/n-tier-without-tears/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 14:25:55 +0000</pubDate>
		<dc:creator>Eddie Bowen</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.innova-partners.com/blog/?p=433</guid>
		<description><![CDATA[
Building n-Tier apps can be difficult. Instead of a single monolithic application that can easily hide its imperfections, a client-server model traditionally means making an API, choosing a transport, and sticking to it.
It&#8217;s like marriage, but with TCP/IP settings. Throw in a wireless client and it can be difficult to find a solution that fits. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.innova-partners.com/blog/wp-content/uploads/2010/08/nTier.jpg"><img src="http://www.innova-partners.com/blog/wp-content/uploads/2010/08/nTier.jpg" alt="" title="nTier" width="503" height="619" class="alignnone size-full wp-image-434" /></a>
</p><p>Building n-Tier apps can be difficult. Instead of a single monolithic application that can easily hide its imperfections, a client-server model traditionally means making an API, choosing a transport, and sticking to it.</p>
<p>It&#8217;s like marriage, but with TCP/IP settings. Throw in a wireless client and it can be difficult to find a solution that fits. XML-RPC? SOAP? REST? Each way of communicating has benefits and drawbacks.</p>
<p>This is what we&#8217;re doing for client X, a niche healthcare business.</p>
<span id="more-433"></span>
<p>The requirements for the project are a web site with both static content and user-only pages with geolocation, pricing and communication features. These features are duplicated on iPhone/iPad and (in the future, Android) clients.</p>
<p>The obvious solution is an n-Tier architecture where we can centralize the business logic. The less obvious part is how to communicate with it. The iPhone app (Boomer) is using a wireless connection, so lightweight formats are obviously attractive. Also, iOS has a poor selection of XML-RPC and SOAP clients, so a JSON/REST solution makes sense.</p>
<p>On the other hand, the web client (Apollo) is running in the same location &#8211; initially on the same server &#8211; as the client, so it can use a fatter, more full-featured connection. Since we&#8217;re using Microsoft stack for this project, that means WCF. WCF also generates model code for the web client, so most of the work is just converting these models into HTML output. The server (Athena) consists of both conventional and restful WCF services each accessing the core logic of the server, which in turn consists largely of LINQ-based interaction with the database.</p><p>
</p><p>The neat thing about offering parallel services like this is that it makes adding additional transports much more straightforward. For example, if client X decides they want to use an RPC-based tool with the server, it just means adding another service; the business logic has already been prefactored out of the way.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.innova-partners.com/blog/2010/08/03/n-tier-without-tears/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flickr and Versioning</title>
		<link>http://www.innova-partners.com/blog/2009/12/14/flickr-and-versioning/</link>
		<comments>http://www.innova-partners.com/blog/2009/12/14/flickr-and-versioning/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 22:13:15 +0000</pubDate>
		<dc:creator>Eddie Bowen</dc:creator>
				<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://www.innova-partners.com/blog/?p=403</guid>
		<description><![CDATA[We often maintain and deploy projects as a single HEAD version in a Subversion repository. We don&#8217;t, generally, tend to do a lot of forking. This is good, as forking can be undisciplined, but sometimes you might want to be able to add or change features and not have to worry about adding broken code [...]]]></description>
			<content:encoded><![CDATA[<p>We often maintain and deploy projects as a single HEAD version in a Subversion repository. We don&#8217;t, generally, tend to do a lot of forking. This is good, as forking can be undisciplined, but sometimes you might want to be able to add or change features and not have to worry about adding broken code to a project.</p>

<p>It turns out that Flickr does the same sort of thing. Their solution: <a href="http://code.flickr.com/blog/2009/12/02/flipping-out/">flags and flippers</a>. Interesting read.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.innova-partners.com/blog/2009/12/14/flickr-and-versioning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visualizing CSS</title>
		<link>http://www.innova-partners.com/blog/2009/09/30/visualizing-css/</link>
		<comments>http://www.innova-partners.com/blog/2009/09/30/visualizing-css/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 18:45:53 +0000</pubDate>
		<dc:creator>Eddie Bowen</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.innova-partners.com/blog/?p=363</guid>
		<description><![CDATA[

Converting a Photoshop pitch to a static HTML/CSS layout is a fundamental part of client-oriented web development. It can be hard work, not least because it is difficult to simultaneously focus on the appearance of the site and its structural foundations.

The usual solution to this is to muddle through and keep tweaking a steadily expanding [...]]]></description>
			<content:encoded><![CDATA[<p><img style="position:relative; left:-140px" src="http://www.innova-partners.com/blog/wp-content/uploads/2009/09/animation2.gif" alt="animation2" title="animation2" width="720" height="751" class="alignnone size-full wp-image-391" /></p>

<p>Converting a Photoshop pitch to a static HTML/CSS layout is a fundamental part of client-oriented web development. It can be hard work, not least because it is difficult to simultaneously focus on the appearance of the site and its structural foundations.</p>

<p>The usual solution to this is to muddle through and keep tweaking a steadily expanding morass of CSS until the site resembles the original .psd. This way of working is <strong>unstructured</strong>, which makes it stressful and self-limiting. </p>

<p>Let&#8217;s look at a better way.</p>

<p><span id="more-363"></span></p>

<h3>Separating structure and appearance</h3>

<p>A more disciplined way of working involves <strong>separating the structure and appearance</strong> of the CSS into two separate files, like this:</p>

<p><code><pre>
    &lt;link rel='stylesheet' href='styles/structure.css' type='text/css' /&gt;
    &lt;link rel='stylesheet' href='styles/appearance.css' type='text/css' /&gt;
</pre></code></p>

<h3>But aren&#8217;t appearance and structure separate already in CSS?</h3>

<p>At this point you may be thinking that CSS is <em>already</em> predicated on the idea that structure and content should be separate. HTML for structure and CSS for appearance, right?</p>

<p>This is true if &#8220;appearance&#8221; includes attributes such as <em>float</em> or <em>position</em>.</p>

<p>We want to <em>really</em> separate the the attributes responsible for layout &#8211; <em>position, float, padding, margin, width, height, border, etc</em> &#8211; from those responsible for decoration &#8211; <em>background, color, font-&#42;, text-&#42;, etc</em>.</p>

<p>We also want to be able to <strong>visualize</strong> the structure of the CSS. This means adding false background colors to elements in <em>structure.css</em> so we can see what effects those elements have on the layout. The predefined CSS colors such as &#8220;green&#8221; or &#8220;red&#8221; are great for this.</p>

<h3>How <em>structure.css</em> and <em>appearance.css</em> see a page element</h3>

<p><em>Structure.css</em> might describe a page element like this:</p>

<p><code><pre>
div.feature_content
{
    background: green;
    padding: 5px 20px 15px 20px;
}
</pre></code></p>

<p>while <em>appearance.css</em> is concerned with this:</p>

<p><code><pre>
div.feature&#95;content
{
    color: #00326a;
    background: #e8e8e8 url(images/feature&#95;foot.png) no-repeat left bottom;
}
</pre></code></p>

<p>This means we can easily switch off the appearance file and look at a purely structural layout. If, for example, we need to add an element and inadvertently break a float clearance, we can metaphorically lift the hood on the layout and immediately see what is wrong. It&#8217;s like having X-ray vision for HTML.</p>

<p><img src="http://www.innova-partners.com/blog/wp-content/uploads/2009/09/appearance.png" alt="appearance" title="appearance" width="300" height="345" class="alignnone size-full wp-image-383" />
With both stylesheets switched on.</p>

<p><img src="http://www.innova-partners.com/blog/wp-content/uploads/2009/09/structure.png" alt="structure" title="structure" width="300" height="345" class="alignnone size-full wp-image-384" />
With just <em>structure.css</em> switched on.</p>

<h3>Visualizing in action</h3>

<p>If you watch the animation at the start of this post again, pay close attention to the position of the top navbar.</p>

<p>When I first started blocking out the page the navbar was inside the top (&#8216;header&#8217;) block. Later I realized it would be easier to position if it were the first element in the second (&#8216;content&#8217;) block.</p>

<p>So I switched off <em>appearance.css</em> (by breaking the tag with an underscore,) and moved the nav bar&#8217;s div. The structure was fine, so I deleted that underscore and the hood went down.</p>

<p>The important part of this is that I was immediately confident that the change had no unexpected impact on other elements in the layout. I <em>knew</em> the layout of the page, even when it was in flux, because I could <em>see</em> it.</p>

<h3>Divide and conquer</h3>

<p>The important thing is that visualizing CSS isn&#8217;t a tedious &#8220;best practices&#8221; kind of thing. It really does remove a lot of stress and confusion from development. Give it a try; once you start dividing your CSS this way you&#8217;ll wonder how you managed before.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.innova-partners.com/blog/2009/09/30/visualizing-css/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I </title>
		<link>http://www.innova-partners.com/blog/2009/01/06/i/</link>
		<comments>http://www.innova-partners.com/blog/2009/01/06/i/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 16:35:31 +0000</pubDate>
		<dc:creator>Eddie Bowen</dc:creator>
				<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://www.innova-partners.com/blog/?p=281</guid>
		<description><![CDATA[I&#8217;ve just started using iTextSharp, a .NET port of the Java iText library. It&#8217;s surprisingly good.

The library can create files or streams of PDF. I&#8217;m caching my output, so this example uses files:

        // create a document
        Document document = new [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just started using <a href="http://itextsharp.sourceforge.net/tutorial/">iTextSharp</a>, a .NET port of the Java iText library. It&#8217;s surprisingly good.</p>

<p>The library can create files or streams of PDF. I&#8217;m caching my output, so this example uses files:</p>

<pre><code>        // create a document
        Document document = new Document();

        // associate it with a file
        String filepath = Request.MapPath("/Pdfs/test.pdf");
        FileStream file = new FileStream(filepath, FileMode.Create);
        PdfWriter.GetInstance(document, file);

        // write the pdf
        document.Open();
        document.Add(new Paragraph("OMG this thing works"));
        document.Close();
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.innova-partners.com/blog/2009/01/06/i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

