<?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>The Blog of Clint Andrew Hall &#187; Code</title>
	<atom:link href="http://www.clintandrewhall.com/blog/category/code/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.clintandrewhall.com/blog</link>
	<description>Welcome to my corner of the web, where I post my ponderings, pictures and pontifications.</description>
	<lastBuildDate>Tue, 31 Aug 2010 20:27:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Node Knockout 2010: In Response to John Resig</title>
		<link>http://www.clintandrewhall.com/blog/2010/08/node-knockout-2010-in-response-to-john-resig/</link>
		<comments>http://www.clintandrewhall.com/blog/2010/08/node-knockout-2010-in-response-to-john-resig/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 18:49:42 +0000</pubDate>
		<dc:creator>Clint</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Rant]]></category>

		<guid isPermaLink="false">http://www.clintandrewhall.com/blog/?p=125</guid>
		<description><![CDATA[I had to respond to some of John Resig's tweets regarding Node Knockout 2010.]]></description>
			<content:encoded><![CDATA[<h2>First, a bit of background.</h2>
<p>When the Node Knockout competition was announced several months ago, I signed up immediately; it sounded like a helluvalotta fun and lit a fire for me to learn the ins and outs of Node as quickly as possible.  I recruited a couple of my buddies and the contest slipped off my radar and out of my mind.</p>
<p>Days before, though, I was reminded that it was fast approaching! Long story short, I had somehow screwed up our registration, but the gracious folks running the show set up a random-team-name account at the last minute, &#8220;<a href="http://nodeknockout.com/teams/zenith-workloom">Zenith-Workloom</a>&#8220;.  We set to work right away.</p>
<p>I was the only participant who had experience with Node, but the guys were excited to try.  We even had a few geek friends show up when we started, just to see what we were doing and how we were going to do it.</p>
<p>All told, I stayed up for a 36 hour period, crushing against the GitHub, Twitter, Facebook and FourSquare APIs, fussing with relative dates, wrestling with MongoDB&#8230; really a lot of work.  We found ourselves cutting back on our features list with every passing hour, desperate to get things stable before time expired. There is quite a bit to discuss here, but I&#8217;ll save that for a blog post I plan to write later this week.</p>
<h2>The Results</h2>
<p>In the end, we ended up exhausted with relatively solid services and 20% of our desired feature set in the <em>front-end</em>.  I emphasize this because there is quite a bit of code running in Node that didn&#8217;t &#8220;bubble up&#8221; to our front-end effectively&#8230; for example, I couldn&#8217;t get GitHub check-ins to sort nicely with other events before &#8220;last call&#8221;.  This is merely a side-effect of a deadline fast-approaching.</p>
<p>There are some amazing entries in the Node Knockout contest&#8230; I mean, incredibly awesome.  Here are a few of my favorites:</p>
<ul>
<li><a href="http://awesometown.no.de/">Simulchart</a> &#8211; http://awesometown.no.de/ &#8211; Real-time, embeddable data charting.</li>
<li><a href="http://done-js.no.de/">Drop Note</a> &#8211; http://done-js.no.de/ &#8211; Drop a file into your browser and share it instantly.</li>
<li><a href="http://scrabb.ly/">Scrabb.ly</a> &#8211; http://scrabb.ly/ &#8211; Real-time, addictive Scrabble game, (WOW!)</li>
<li><a href="http://nko-team-discovery-channel.heroku.com/">CloudQ</a> &#8211; http://nko-team-discovery-channel.heroku.com/ &#8211; Sandboxed Unit Test runner for GitHub projects.</li>
<li><a href="http://starcraft2destroyedmymarrage.no.de/">Serrano</a> &#8211; http://starcraft2destroyedmymarrage.no.de/ &#8211; Share DOM events and other information with other users simultaneously.</li>
</ul>
<p>These guys kicked our ass.  But here&#8217;s the thing that I take away: I watched folks from these teams on IRC, struggling through issues, getting help, providing it&#8230; I mean, the community was <strong>so f&#8217;ing powerful</strong>.</p>
<p>Halfway through I realized I was going to learn 1000% more just looking at winning teams&#8217; source code than I was in the contest.  I got excited, and have remained so&#8230; and I&#8217;m still proud of what my team managed to accomplish, even though we&#8217;re not <em>realistically</em> in the running.</p>
<h2>Along Comes John Resig</h2>
<p>I took issue with the following <a href="http://twitter.com/jeresig/status/22613175584">tweet</a> by Mr. Resig:</p>
<blockquote><p>Disappointed in the entries to the Node.js Knockout; only a handful of the entries work in non-Chrome/Safari browsers.</p></blockquote>
<p>Wow&#8230; really?  It prompted my <a href="http://twitter.com/clintandrewhall/status/22624807283">reply</a>:</p>
<blockquote><p>Was jQuery coded in 2 days? RT @<a rel="nofollow" href="/jresig">jresig</a>Disappointed in the entries to the Node.js Knockout; few work in non-Chrome/Safari browsers. <a title="#nodeko" rel="nofollow" href="/search?q=%23nodeko">#nodeko</a></p></blockquote>
<p>My point was fairly straightforward:  this wasn&#8217;t for <em>production</em>, this was for <em>fun</em>.  This was to test the limits of Node.js with stunning, whimsical or powerful ideas. Take away the pressure of &#8220;selling something&#8221; and just &#8220;do something&#8221;.</p>
<p>After some retweeting in the node.js hashtag, <a href="http://twitter.com/jeresig/status/22636634068">this reply</a> from Mr. Resig crossed my TweetDeck:</p>
<blockquote><p>@<a rel="nofollow" href="/clintandrewhall">clintandrewhall</a> Teams that made working, fully-functional, cross-browser applications in 48 hours deserve to win &#8211; and get my vote.</p></blockquote>
<p>The more I&#8217;ve thought about it, the more upset his statements have made me.</p>
<h2>In Defense of Node Knockout Teams</h2>
<p>The Twitter medium is the worst place to debate these kinds of points; I mean, Mr. Resig certainly has more to say that 140 characters allows.  And his interpretation of a complete application is probably different than others.  But I have to take issue with his tweets on their face&#8230;</p>
<p>Look, my team&#8217;s entry is cross-browser compatible&#8230; but that was by the grace of a limited feature-set.  Mr. Resig was actually a judge for our entry, and leveled a very fair, honest critique of our missing features&#8230; points of view I share.  But I&#8217;m going to protest on behalf of those other teams who only supported a limited set.</p>
<p>There were people attempting very complicated, near-impossible feats under a very tight timeframe&#8230; and several succeeded!  For a judge to focus on the browser when the <em>teams</em> had been focusing on <em>Node</em> just seems so argumentative.</p>
<p>It&#8217;s one thing if the knockout had been for a week, or maybe if <em>server</em> code had been locked down early with additional time for front-end.  But we&#8217;re talking <strong>48 hours</strong> here, starting <strong>from scratch</strong>.</p>
<p>But more importantly, Node Knockout entries are graded as follows, (from <a href="http://nodeknockout.com/judging">http://nodeknockout.com/judging</a>):</p>
<blockquote><p>Entries will be judged on a 1-5 scale across 4 dimensions:</p>
<ul>
<li><strong>Utility</strong> &#8211; Is the site offering a service you&#8217;d use again and again?</li>
<li><strong>Design</strong> &#8211; How good does it look and feel to use?</li>
<li><strong>Innovation</strong> &#8211; How original is the idea and execution?</li>
<li><strong>Completeness</strong> &#8211; How &#8220;fully baked&#8221; is the site? Are there bugs or dead ends?</li>
</ul>
</blockquote>
<p>First, I concede that judges have every right to pet peeves, sticking points, etc&#8230; and we were told to keep the judges in mind when we were working. Still, I would hope that an entry would still be judged on its merits more so than those irritations.  And to be fair, where in the criteria above is browser compatibility even mentioned?</p>
<p>Perhaps &#8220;completeness&#8221; could include cross-browser compatibility&#8230; but in this context&#8230; <em>should it</em>?</p>
<p>Based on Mr. Resig&#8217;s logic from his tweet, had my team completed our feature set in our present level of compatibility, we&#8217;d have garnered a 5-star vote from him.  That&#8217;s great!  But is he saying that, of the entries I mentioned above, <em>none</em> deserve five star ratings simply because they don&#8217;t work in all browsers?  Is my team&#8217;s simple effort, to compile data feeds chronologically on one page, full orders of magnitude &#8220;better&#8221; than those ideas simply because our CSS happens to be cross-browser compatible?  I certainly don&#8217;t think so&#8230; my team didn&#8217;t even have JS in the front-end&#8230;</p>
<p>Look, I&#8217;m <em>well-known</em> for being a progressive-enhancement nazi, swinging the &#8220;gotta work everywhere&#8221; sword in wide archs&#8230; but I make an exception here.</p>
<p>This contest was about doing freakishly cool things <strong>in Node</strong> in <strong>48 hours</strong>, not <strong>a browser</strong>.  Having participated first-hand, and seeing the absolutely amazing things that were done, I am in awe.  That&#8217;s not even to mention the inspiring, multi-continent community that was flash-created in a 48 hour period.  Even better, most teams have pledged to open source their code for all to see.</p>
<p>Absolutely incredible.</p>
<p>Yet&#8230; that someone, let alone one of the <em>judges</em>, would publicly minimize a team&#8217;s accomplishments by focusing on the tiniest, almost out-of-context point saddens me.</p>
<p>I don&#8217;t think anyone should be &#8220;disappointed&#8221; by these entries.</p>
<h2>Go Explore and Vote</h2>
<p>I encourage all of you reading this, if you haven&#8217;t yet, visit the <a href="http://nodeknockout.com/teams">Node Knockout entries page</a> and comment and vote for your favorites.  Go and see for yourself what amazing things can be done with 48 hours, an idea and a ton of people willing to help.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clintandrewhall.com/blog/2010/08/node-knockout-2010-in-response-to-john-resig/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Create Your Own Google Chrome &#8220;App&#8221;</title>
		<link>http://www.clintandrewhall.com/blog/2010/07/create-your-own-google-chrome-app/</link>
		<comments>http://www.clintandrewhall.com/blog/2010/07/create-your-own-google-chrome-app/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 05:29:49 +0000</pubDate>
		<dc:creator>Clint</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Idea]]></category>

		<guid isPermaLink="false">http://www.clintandrewhall.com/blog/?p=115</guid>
		<description><![CDATA[I was reading LifeHacker and came across a post regarding how to enable Google Apps in Chrome.  Curious, I dug into the extensions and noticed... well, they're pretty simple.  So I decided to create my own for Facebook]]></description>
			<content:encoded><![CDATA[<p>I was reading LifeHacker and came across <a href="http://lifehacker.com/5587455/try-out-three-early-web-apps-from-the-chrome-web-store-now?skyline=true&amp;s=i" target="_blank">this post</a> regarding how to enable Google Apps in Chrome.  Curious, I dug into the extensions and noticed&#8230; well, they&#8217;re pretty simple.  So I decided to create my own.<br />
<span id="more-115"></span><br />
I decided to create one for Facebook.  It only took me five minutes:</p>
<div id="attachment_116" class="wp-caption alignnone" style="width: 594px"><a href="http://www.clintandrewhall.com/blog/wp-content/uploads/2010/07/Screen-shot-2010-07-16-at-12.18.35-AM.jpg"><img class="size-full wp-image-116" title="Chrome &quot;New Tab&quot; Page" src="http://www.clintandrewhall.com/blog/wp-content/uploads/2010/07/Screen-shot-2010-07-16-at-12.18.35-AM.jpg" alt="Chrome &quot;New Tab&quot; Page" width="584" height="269" /></a><p class="wp-caption-text">The Chrome &quot;New Tab&quot; page with Facebook added...</p></div>
<p>The LifeHacker post contains all the details regarding how to enable apps in the latest Chromium builds.  All you need to do is copy the contents of one of the manifest.json files in one of the apps bundled with Chrome:</p>
<p><code> </code></p>
<p><code></p>
<pre>{
  "name": "Google Calendar",
  "version": "1.3",
  "permissions": [ "notifications" ],
  "icons": {
    "128": "128.png",
    "24": "24.png",
    "32": "32.png",
    "48": "48.png"
  },
  "app": {
    "urls": [
      "*://www.google.com/calendar/"
    ],
    "browse_urls": [
      "https://www.google.com/accounts/"
    ],
    "launch": {
      "container": "tab",
      "web_url": "https://www.google.com/calendar/"
    }
  }
}</pre>
<p></code></p>
<p>and substitute your own values and icons:<br />
<code> </code></p>
<p><code></p>
<pre>{
  "name": "Facebook",
  "version": "0.1",
  "permissions": [  ],
  "icons": {
    "128": "128.png",
    "24": "24.png",
    "32": "32.png",
    "48": "48.png"
  },
  "app": {
    "urls": [
      "*://www.facebook.com/"
    ],
    "browse_urls": [
      "https://www.facebook.com/profile.php"
    ],
    "launch": {
      "container": "tab",
      "web_url": "http://www.facebook.com"
    }
  }
}</pre>
<p></code></p>
<p>If you&#8217;re interested, you can download my ZIP file here, <a href="http://www.clintandrewhall.com/blog/wp-content/uploads/2010/07/facebook-chrome-app.zip">facebook-chrome-app</a>, then follow the same instructions to enable it in your own Chrome browser.</p>
<p>See? Easy&#8230; happy hacking!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clintandrewhall.com/blog/2010/07/create-your-own-google-chrome-app/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Contact Form Experiment</title>
		<link>http://www.clintandrewhall.com/blog/2009/10/contact-form-experiment/</link>
		<comments>http://www.clintandrewhall.com/blog/2009/10/contact-form-experiment/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 21:43:15 +0000</pubDate>
		<dc:creator>Clint</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Rant]]></category>

		<guid isPermaLink="false">http://www.clintandrewhall.com/blog/?p=95</guid>
		<description><![CDATA[Yesterday, I saw this tweet from Smashing Magazine: I took a look at the form, and I must say I was impressed too.  Unfortunately, I was using TweetDeck on my iPhone&#8230; as a result, I didn&#8217;t see the contact form at all because the background image didn&#8217;t load very fast.  That prompted me to post [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, I saw this tweet from Smashing Magazine:</p>
<div id="attachment_97" class="wp-caption alignnone" style="width: 614px"><img class="size-full wp-image-97" title="Tweet from Smashing Magazine" src="http://www.clintandrewhall.com/blog/wp-content/uploads/2009/10/Screen-shot-2009-10-22-at-3.46.46-PM1.jpg" alt="Tweet from Smashing Magazine" width="604" height="97" /><p class="wp-caption-text">Tweet from Smashing Magazine</p></div>
<p>I took a look at the form, and I must say I was impressed too.  Unfortunately, I was using TweetDeck on my iPhone&#8230; as a result, I didn&#8217;t see the contact form at all because the background image didn&#8217;t load very fast.  That prompted me to post this reply:</p>
<div id="attachment_98" class="wp-caption alignnone" style="width: 614px"><img class="size-full wp-image-98" title="My Reply" src="http://www.clintandrewhall.com/blog/wp-content/uploads/2009/10/Screen-shot-2009-10-22-at-3.52.34-PM.jpg" alt="My reply on Twitter" width="604" height="112" /><p class="wp-caption-text">My reply on Twitter</p></div>
<p>Being a social media junkie, this tweet was then cross-posted to my Facebook, prompting this reply from a web developer friend of mine:</p>
<div id="attachment_99" class="wp-caption alignnone" style="width: 499px"><img class="size-full wp-image-99" title="Resulting Facebook Conversation" src="http://www.clintandrewhall.com/blog/wp-content/uploads/2009/10/facebook-convo.jpg" alt="...the resulting Facebook conversation." width="489" height="409" /><p class="wp-caption-text">...the resulting Facebook conversation.</p></div>
<p>As you can well imagine, I could not let this stand.  So I decided I would refactor the form to prove that, with a few tweaks to the CSS and markup, this form could avoid the problems I pointed out.</p>
<p><span id="more-95"></span>First, let me preface by saying that I am not saying the code is bad&#8230; on the contrary, I really like the concept.  I just want to:</p>
<ol>
<li>Dispel my friend&#8217;s poor logic, and</li>
<li>Raise awareness about accessibility.</li>
</ol>
<p>That said, I tried to minimize my changes to the original code as much as possible; there are certainly improvements that can be made to the CSS and to the markup, but that was not my goal.</p>
<p>For reference, here are the <a title="Before" href="http://www.clintandrewhall.com/demos/contact-form/before.html" target="_blank">before</a> and the <a title="After" href="http://www.clintandrewhall.com/demos/contact-form/after.html" target="_blank">after</a> demo pages.  I&#8217;d load them in separate tabs; you&#8217;ll see they are identical, almost to the pixel.  I&#8217;ve also added a scripted link to allow you to hide the background image.</p>
<h3>The Accessibility Problem</h3>
<p>First, let&#8217;s define the problem. In the existing CSS, the labels are completely hidden and the background is applied to the form.  As a result, here are screen shots of the contact form, with and without its background image, (notice the dotted lines for each form field):</p>
<div id="attachment_100" class="wp-caption alignleft" style="width: 393px"><img class="size-full wp-image-100   " title="Contact Form with Images On" src="http://www.clintandrewhall.com/blog/wp-content/uploads/2009/10/Screen-shot-2009-10-22-at-3.40.53-PM.jpg" alt="The contact form with images on and fully loaded" width="383" height="400" /><p class="wp-caption-text">The contact form with images on and fully loaded</p></div>
<div id="attachment_101" class="wp-caption alignleft" style="width: 338px"><img class="size-full wp-image-101 " title="Contact Form with No Image" src="http://www.clintandrewhall.com/blog/wp-content/uploads/2009/10/Screen-shot-2009-10-22-at-3.41.08-PM.jpg" alt="The contact form without the image loaded" width="328" height="400" /><p class="wp-caption-text">The contact form without the image loaded</p></div>
<p style="clear:both">
<p style="clear:both">Without the image, the form becomes unusable.  So how can we edit the HTML and style the form to avoid this?</p>
<h3>The Approach</h3>
<p>In short, we need to add labels to each field and have the image hide them if present.  This can be accomplished with z-indexing:</p>
<div id="attachment_103" class="wp-caption alignnone" style="width: 810px"><img class="size-full wp-image-103  " title="Approach Diagram" src="http://www.clintandrewhall.com/blog/wp-content/uploads/2009/10/diagram.jpg" alt="A diagram of the layout" width="800" height="340" /><p class="wp-caption-text">A diagram of the layout</p></div>
<h3>The Solution</h3>
<p>First, I refactored the original form into something a bit more manageable, such as adding a fieldset element to the phone number, adding a header element and consolidating the label and input fields, (and thus removing the pesky &#8220;for&#8221; attribute):</p>
<pre><code>...
&lt;h3&gt;&lt;span&gt;Contact Form&lt;/span&gt;&lt;/h3&gt;
...
&lt;fieldset id="phone-el"&gt;
    &lt;legend&gt;&lt;span&gt;Phone&lt;/span&gt;&lt;/legend&gt;
    &lt;p id="phone-ac-el"&gt;
        &lt;label&gt;
            &lt;span&gt;Area Code&lt;/span&gt;
            &lt;input id="phone-ac" class="text" maxlength="3"
                name="phone-ac" size="3" type="text" /&gt;
        &lt;/label&gt;
    &lt;/p&gt;
...
</code></pre>
<p>Since the legend for the phone fieldset wasn&#8217;t being displayed, I decided I would forgo the addition of any empty element and just use it for the contact form.  A bit of positioning based on existing CSS and some negative text-indent and we were in business:</p>
<pre>body#contact #form legend span {
    background: url(res/contact-content.png) center top no-repeat;
    position: absolute;
    top: -199px;
    left: -180px;
    width: 750px;
    height: 786px;
    display: block;
    text-align: left;
    text-indent: -1000px;
    overflow: hidden;
    z-index: 50;
}</pre>
<h3>The Result</h3>
<p>Now, when the page loads and no images are present, the form looks like this:</p>
<div id="attachment_102" class="wp-caption alignnone" style="width: 314px"><img class="size-full wp-image-102 " title="My Refactor of the Contact Form" src="http://www.clintandrewhall.com/blog/wp-content/uploads/2009/10/Screen-shot-2009-10-22-at-3.41.23-PM.jpg" alt="My refactor of the contact form without the image" width="304" height="400" /><p class="wp-caption-text">My refactor of the contact form without the image</p></div>
<p>With a few simple changes, the form is completely usable&#8230; bulletproof&#8230; regardless of the user&#8217;s situation.</p>
<h3>A Few Closing Remarks</h3>
<p>I hate the oft-uttered mantra of, &#8220;those folks aren&#8217;t in my demographic.&#8221;  That is a dangerous and amateur view of an audience for your website.  You should always be looking to make your forms as simple but as accessible as possible, because, frankly&#8230; your demographic is anyone with a web browser.  Discounting any percentage is not only a disadvantage for your business, but a disservice to all users.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clintandrewhall.com/blog/2009/10/contact-form-experiment/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>New Window, No In-source Event</title>
		<link>http://www.clintandrewhall.com/blog/2009/10/new-window-no-in-source-event/</link>
		<comments>http://www.clintandrewhall.com/blog/2009/10/new-window-no-in-source-event/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 17:31:24 +0000</pubDate>
		<dc:creator>Clint</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Idea]]></category>

		<guid isPermaLink="false">http://www.clintandrewhall.com/blog/?p=88</guid>
		<description><![CDATA[I was prompted by this Twitter post to cross-post an old blog entry of mine. Having JavaScript events in-source binds you to whatever JavaScript method (and it&#8217;s signature) you&#8217;ve specified, not to mention breaking the tenets of Progressive Enhancement. When wishing to launch an anchor&#8217;s href into a new window while using a STRICT doctype, [...]]]></description>
			<content:encoded><![CDATA[<p><em>I was prompted by <a href="http://twitter.com/scriptandstyle/statuses/4605668102">this</a> Twitter post to cross-post an old blog entry of mine.</em></p>
<p>Having JavaScript events in-source binds you to whatever JavaScript method (and it&#8217;s signature) you&#8217;ve specified, not to mention breaking the tenets of Progressive Enhancement.  When wishing to launch an anchor&#8217;s <code>href</code> into a new window while using a <code>STRICT</code> doctype, using <code>window.popup</code> is the only real option, (as the <code>target</code> attribute is invalid in this case).  Looking at the <a title="W3C specification for Anchor Tags" href="http://www.w3.org/TR/html401/struct/links.html#h-12.2">W3C specification for anchors</a>, the following could be a solution.<br />
<span id="more-88"></span></p>
<h3>Problem Statement</h3>
<p>Recently, a navigation header in one of our solutions had a requirement that all links within its boundary needed to launch their content into a new window, thereby not disturbing any the current page.  Since the <code>target</code> attribute is not an option, this can be accomplished by the <code>window.popup</code> method, a fairly standard method within browsers.  This meant either the call itself would have to be embedded into the anchor, or a surrogate method.  In either case, JavaScript events would have to appear in source:<br />
<code><br />
&lt;a href="http://www.google.com" onclick="window.popup(this.href); return false;"&gt;Link 1&lt;/a&gt;<br />
&lt;a href="http://www.google.com" onclick="return MyNamespace.popup(this);"&gt;Link 2&lt;/a&gt;<br />
</code></p>
<h4>Problem: Obligations Introduced</h4>
<p>The trouble is that whenever script is included in source, it means that you are thereby <em>contractually bound</em> to offer the same method, with the same signature&#8230; regardless of circumstance.  To give a stronger example, suppose I have the following code:</p>
<pre><code>    &lt;div id="navigation"&gt;
        Some content
    &lt;/div&gt;
    &lt;script type="text/javascript"&gt;
        var myAccordion = new Accordion("navigation")
    &lt;/script&gt;
</code></pre>
<p>I am now bound by two things:</p>
<ol>
<li>I must include an <code>Accordion</code> object, even if I don&#8217;t need it or if I want to use a different object based on platform (e.g. iPhone).</li>
<li>I must provide the same API as the <code>Accordion</code> object, because there is a global var called <code>myAccordion</code>, which could be referenced elsewhere.</li>
</ol>
<p>I can still swap out the JavaScript files, but those files <em>must</em> have an object that meet these requirements.</p>
<h4>Solution: Progressive Enhancement through Abstraction</h4>
<p>It would be far easier if the same markup <em>externalized</em> these specifics and applied event handlers through script:</p>
<pre><code>    &lt;div id="navigation"&gt;
        Some content
    &lt;/div&gt;
    &lt;script type="text/javascript"&gt;
        MyNamespace.setup({
            navigation : "navigation"
        });
    &lt;/script&gt;
</code></pre>
<p>In this case, an API is defined within a generic namespace object called <code>MyNamepsace</code>.  The script block invokes <code>setup</code>, which takes (in this case, which may be overkill) a JSON structure defining the objects or parameters to be used in setup.</p>
<p>This kind of generic abstraction allows us to swap out not only the CSS but also the JavaScript depending on capability or browser.</p>
<h3>Proposed Solution: Using the <code>rel</code> Attribute</h3>
<p>In the spec, the <a href="http://www.w3.org/TR/html401/struct/links.html#adef-rel">rel</a> attribute is described as:</p>
<blockquote><p>This attribute describes the relationship from the current document to the anchor specified by the <a class="noxref" href="http://www.w3.org/TR/html401/struct/links.html#adef-href"><samp class="ainst">href</samp></a> attribute. The value of this attribute is a space-separated list of link types.</p></blockquote>
<p>The spec also says that the value of the <code>rel</code> attribute should be one or more of a set of <code>link-types</code>, but this portion of the spec states:</p>
<blockquote><p>Authors may wish to define <span class="index-inst" title="link  type::profiles for new"><a name="idx-link_type-2">additional link types</a></span> not described in this specification. If they do so, they should use a <a href="http://www.w3.org/TR/html401/struct/global.html#profiles">profile</a> to cite the conventions used to define the link types. Please see the <a class="noxref" href="http://www.w3.org/TR/html401/struct/global.html#adef-profile"><samp class="ainst"> profile</samp></a> attribute of the <a class="noxref" href="http://www.w3.org/TR/html401/struct/global.html#edef-HEAD"><samp class="einst">HEAD</samp></a> element for more details.</p></blockquote>
<h3>The Proposal</h3>
<p>Since the goal is to use JavaScript to &#8220;pop&#8221; the new window, we need to identify which anchors &#8220;pop&#8221; their content to a new window, leaving the current document intact.  By creating a <code>rel</code> attribute that specifies this, along with the necessary profile, JavaScript methods could distinguish those anchors from other anchors, thus allowing the popup event handlers to be applied.</p>
<h4>Creating a new profile</h4>
<p>In order to create a new link type, we need<sup>[<a href="#ref1">1</a>]</sup> to create<sup>[<a href="#ref2">2</a>]</sup> a profile.</p>
<pre>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;
&lt;head&gt;
    &lt;title&gt;Cerner XHTML Profile&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;dl class="profile"&gt;
    &lt;dt id="rel"&gt;rel&lt;/dt&gt;
    &lt;dd&gt;
        &lt;dl&gt;
            &lt;dt id="forked"&gt;forked&lt;/dt&gt;
            &lt;dd&gt;
                Refers to a location that should be, if possible, launched
                into a new window or process without disturbing the
                current page or content.
            &lt;/dd&gt;
        &lt;/dl&gt;
    &lt;/dd&gt;
&lt;/dl&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h4>Using the Profile</h4>
<p>Then, we would use the new link-type defined in the profile for any anchor we&#8217;d want &#8220;popped&#8221; into a new window, (or, indeed, whatever other action we choose, based on platform).</p>
<pre>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;
&lt;head profile="http://deploymentserver/contextroot/profile.html"&gt;
.
.
.
&lt;ul id="links"&gt;
    &lt;li&gt;&lt;a href="http://www.cerner.com/" rel="forked"&gt;Launch Cerner.com&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.google.com/"&gt;Go to Google.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
.
.
.
&lt;script type="text/javascript"&gt;
    // Example script; should be namespaced, etc.
    var list = document.getElementById("links"), list.getElementsByTagName("A"),
        event = function() {
            // Process the event for the link, (e.g. popup, alert, redirect, etc).
            alert("Forked page.");
        };

    for(var i = 0; i &lt; links.length; i++) {
        var link = links[i], rel = link.rel;

        if(rel.length &lt;= 0) {
            continue;
        }

        var rels = rel.split(" ");

        for(var a = 0; a &lt; rels.length; a++) {
            var l = rels[a];

            if(l == "forked")) {
                link.onclick = function() {
                    return false;
                };
                // Use my established attachEvent method; it has an EventCache
                // to avoid memory leaks, etc, but is beyond the scope of this post.
                Util.attachEvent(link, "click", event);
                continue;
            };
        }
    }
&lt;/script&gt;</pre>
<h3>References</h3>
<ol>
<li>W3C, <a href="http://www.w3.org/TR/html401/types.html#type-links"><code>link-type</code> Specification</a></li>
<li>Tantek Çelik, <a href="http://gmpg.org/xmdp/">XHTML Meta Data Profiles</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.clintandrewhall.com/blog/2009/10/new-window-no-in-source-event/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating Elements in JavaScript, (any good?)</title>
		<link>http://www.clintandrewhall.com/blog/2009/03/creating-elements-in-javascript-any-good/</link>
		<comments>http://www.clintandrewhall.com/blog/2009/03/creating-elements-in-javascript-any-good/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 21:50:05 +0000</pubDate>
		<dc:creator>Clint</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Idea]]></category>

		<guid isPermaLink="false">http://www.clintandrewhall.com/blog/?p=76</guid>
		<description><![CDATA[I&#8217;ve been playing around with a couple of ideas for JavaScript methods, thought I&#8217;d get some feedback. The following link is a code snippet in PasteBin that shows the methods and a quick test: http://pastebin.com/f7b68ab19 Basically, the two I wrote and that I&#8217;m evaluating are: Create Element This method caches a created element instance in [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been playing around with a couple of ideas for JavaScript methods, thought I&#8217;d get some feedback.</p>
<p>The following link is a code snippet in PasteBin that shows the methods and a quick test:</p>
<p><a title="PasteBin Code Snippet" href="http://pastebin.com/f7b68ab19">http://pastebin.com/f7b68ab19</a></p>
<p>Basically, the two I wrote and that I&#8217;m evaluating are:</p>
<dl>
<dt>Create Element</dt>
<dd>This method caches a created element instance in an array.  In some browsers, like Firefox, this method is marginally faster; I&#8217;m thinking the array access is hindering it from being even faster.</dd>
<dt>Create Element with Properties</dt>
<dd>This method basically allows you to set attributes using a JSON object. Nothing fancy, but the developers like it. I&#8217;m concerned about the speed of the loop, and developers have been asking about how to set the runtime style.  Since <code>element.style</code> is, of course, not settable, I&#8217;d have to either expose a second parameter, or allow a more complex object and write more logic, (assuming I decide to support it).
</dd>
</dl>
<p>I&#8217;d love some advice&#8230; here&#8217;s what I don&#8217;t want:</p>
<blockquote><p>Just use jQuery / Prototype / my framework!</p></blockquote>
<p>That kind of defeats the purpose of this exercise! <img src='http://www.clintandrewhall.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.clintandrewhall.com/blog/2009/03/creating-elements-in-javascript-any-good/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Run Safari 3 and Safari 4 beta on the same Mac</title>
		<link>http://www.clintandrewhall.com/blog/2009/03/run-safari-3-and-safari-4-beta-on-the-same-mac/</link>
		<comments>http://www.clintandrewhall.com/blog/2009/03/run-safari-3-and-safari-4-beta-on-the-same-mac/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 08:21:25 +0000</pubDate>
		<dc:creator>Clint</dc:creator>
				<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://www.clintandrewhall.com/blog/?p=63</guid>
		<description><![CDATA[I couldn&#8217;t find a blog post or comprehensive tutorial anywhere, but after a great deal of trial and error, I&#8217;ve managed to get Safari 3 and Safari 4 beta to run on my Macbook Pro at the same time. Most insisted you have to download WebKit&#8230; but you don&#8217;t. It&#8217;s much easier than that, once you [...]]]></description>
			<content:encoded><![CDATA[<p>I couldn&#8217;t find a blog post or comprehensive tutorial anywhere, but after a great deal of trial and error, I&#8217;ve managed to get Safari 3 and Safari 4 beta to run on my Macbook Pro at the same time. Most insisted you have to download WebKit&#8230; but you don&#8217;t.</p>
<p>It&#8217;s much easier than that, once you figure it all out&#8230; here&#8217;s how to do it!</p>
<p><a href="http://twitpic.com/1slq9"><img class="alignnone size-medium wp-image-66" title="Screenshot: Safari 3 and Safari 4 beta, side-by-side" src="http://www.clintandrewhall.com/blog/wp-content/uploads/2009/03/picture-2-300x173.jpg" alt="Screenshot: Safari 3 and Safari 4 beta, side-by-side" width="300" height="173" /></a></p>
<p><span id="more-63"></span></p>
<p>I scoured the Internet, searching for a way to do this&#8230; I ended up referring to more websites than I can remember, mostly from the Safari 3 beta period.  A couple of approaches out there required downloading a copy of WebKit, but I couldn&#8217;t get this to work effectively.  I took a lot from <a href="http://michelf.com/">Michel Fortin</a> and <a href="http://michelf.com/weblog/2005/multi-safari/">his post</a> of the subject. Although his solution didn&#8217;t get me all the way there, a lot of Google searching and web board posts did.</p>
<p>Basically, the trouble is that Apple stores the common WebKit framework for the entire Mac.  Even if you copy Safari 3 somewhere to your machine, it will still use the newer WebKit layout engine.  The trick, then, is to provide the older framework to the older Safari instance.  What&#8217;s nice about this approach is you&#8217;re just &#8220;restoring&#8221; Safari 3 and giving it the older versions of the Frameworks it relied on&#8230; no extra WebKit stuff to worry about.</p>
<p>Here&#8217;s how to do it:</p>
<ol>
<li>Install the Safari 4 beta.  Don&#8217;t worry; Safari 4 saves a copy of your Safari 3 install to an archive.</li>
<li>Go to <code>/Library/Application Support/Apple</code></li>
<li>Extract <code>.Safari4PreviewArchive.tar.gz</code> somewhere, like your Desktop.</li>
<li>The <code>Applications</code> directory contains your Safari application; the <code>System</code> directory contains the older frameworks, like WebKit.</li>
<li>Right-click the Safari application and select Show Contents.</li>
<li>Copy the <code>Frameworks</code>, <code>LaunchAgents</code> and <code>PrivateFrameworks</code> directories from the <code>System/Library</code> directory of the expanded archive to the <code>Contents</code> directory of the Safari application.</li>
<li>Edit <code>Info.plist</code> from the <code>Contents</code> directory in a simple text editor.</li>
<li>Add the following XML snippet beneath the parent &lt;dict&gt; element:</li>
</ol>
<p><code class="block">&lt;key&gt;LSEnvironment&lt;/key&gt;<br />
&lt;dict&gt;<br />
&lt;key&gt;DYLD_FRAMEWORK_PATH&lt;/key&gt;<br />
&lt;string&gt;Contents/Frameworks:Contents/PrivateFrameworks:Contents/Frameworks/WebKit.framework/Versions/A/Frameworks&lt;/string&gt;<br />
&lt;key&gt;WEBKIT_UNSET_DYLD_FRAMEWORK_PATH&lt;/key&gt;<br />
&lt;string&gt;YES&lt;/string&gt;<br />
&lt;/dict&gt;</code></p>
<p>That should do it!  You should now be able to run Safari 3 side-by-side with Safari 4.  If anyone knows a good file share site, I&#8217;ll be happy to post a ZIP of my version.  Hope this helps!</p>
<p>UPDATE: I&#8217;ve uploaded my Safari 3 standalone <a href="http://www.4shared.com/file/94783783/d1a5a4ed/Safari_3_-_Standalone_-_Mac.html">here</a>.</p>
<p>Disclaimer: This is the result of obvious tinkering. I may have torn the fabric of space-time somewhere, and you could make it worse. Considering this possibility, I can&#8217;t imagine being held responsible if something merely goes wrong with your computer&#8230; use at your own risk. <img src='http://www.clintandrewhall.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.clintandrewhall.com/blog/2009/03/run-safari-3-and-safari-4-beta-on-the-same-mac/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>PSD2HTML: Terrible Pricing for Web Development</title>
		<link>http://www.clintandrewhall.com/blog/2008/01/a-terrible-pricing-model-for-web-development/</link>
		<comments>http://www.clintandrewhall.com/blog/2008/01/a-terrible-pricing-model-for-web-development/#comments</comments>
		<pubDate>Thu, 10 Jan 2008 06:07:35 +0000</pubDate>
		<dc:creator>Clint</dc:creator>
				<category><![CDATA[Art & Photography]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Follow-up]]></category>
		<category><![CDATA[Industry]]></category>
		<category><![CDATA[Rant]]></category>
		<category><![CDATA[Site News]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.clintandrewhall.com/blog/2008/01/insane-stupid-pricing-model-for-web-development/</guid>
		<description><![CDATA[I was absolutely disgusted by the pricing strategy at PSD2Web.  Here are a few examples, and an explanation as to why the practice feels shady.]]></description>
			<content:encoded><![CDATA[<p>Ok, <a title="psd2html - Order Now! (I pity you)" href="http://www.psd2html.com/order-now.html" target="_blank">this</a> <em>really</em> bothered me.</p>
<p>I was directed to a <a title="CSS Zen Garden" href="http://www.csszengarden.com" target="_blank">CSSZenGarden</a> <a title="CSS Zen Garden design by Outline2Design" href="http://www.outline2design.com/-images/css/1-1.jpg" target="_blank">design</a> created by <a title="Outline2Design Home" href="http://www.outline2design.com/" target="_blank">Outline2Design</a> that is rather beautiful&#8230; I was really impressed, so I looked at their homepage.</p>
<p>Their designs are extremely artistic, and valid XHTML, so I was even more impressed; I wanted to know more about their work and where they manage an office, (mostly to determine if they were a small shop, a front for a larger shop or just &#8220;a person.&#8221;)  I noticed a copyright link to <a title="Zertle.com" href="http://www.zertle.com/" target="_blank">Zertle, LLC</a>.  Clicking <em>that</em>, I saw that Zertle owns two shop fronts, Outline2Design and <a title="PSD2HTML" href="http://www.psd2html.com/" target="_blank">PSD2HTML</a>.</p>
<p>That&#8217;s when I was absolutely disgusted by the pricing strategy at PSD2HTML.</p>
<p><span id="more-42"></span></p>
<h4>Deciding How to Charge is Hard</h4>
<p>I realize it&#8217;s difficult to decide how to price web work; I&#8217;ve had that problem before. You kind of have to divide the effort into the creative and the technical &#8211; creating HTML, (at least, in <em>my </em>opinion) is the easiest of the two. Creating a brand identity and graphical assets are far more subjective tasks, therefore requiring much more work.</p>
<p>Converting a design to HTML, however, is much easier. You can almost feel how the document flows. Sure, there are elegant and thought-provoking approaches to noodle through, and reusability and accessibility concerns&#8230; but the process goes <em>very</em> quickly. Oftentimes, you use tools from your toolbox, like <a title="Microformats" href="http://www.microformats.org/" target="_blank">Microformats</a> or common libraries.</p>
<p>At Cerner, when I&#8217;m handed a design, it takes me roughly two hours per layout to complete, less if the following location follows a cohesive style, (and they do). So this company promises an 8 hour turnaround time, which I think is respectful, if not aggressive if they have a large workload.</p>
<p>What I find appalling is their package rates and &#8220;options.&#8221;</p>
<h4>You Want to Charge Me For WHAT?!?</h4>
<p>Here are a few examples, and an explanation as to why they are shady&#8230; I mean, &#8220;Used-car Salesman&#8221; shady. Throughout the following examples, I&#8217;m going to draw an analogy to <strong>someone coming to paint your house</strong>: you know what color you want, and how you want textures to look, but you don&#8217;t really have the time, nor the expertise, to paint it yourself.</p>
<h4>How Good a Job are You Willing to Pay For?</h4>
<p>Ok, we&#8217;re all set to start. Pick a package and price range for them to convert your image into a web page.</p>
<div class="figure"><img class="alignnone size-full wp-image-57" title="So... do you want your page done professionally or not?" src="http://www.clintandrewhall.com/blog/wp-content/uploads/2008/01/psd2html1.jpg" alt="PSD2HTML - Screenshot 1" width="525" height="173" /></p>
<p class="credit">Screenshot from <a title="Order Now at PSD2HTML.com" href="http://www.psd2html.com/order-now.html" target="_blank">PSD2HTML.com</a></p>
<p class="caption"><em class="title">Figure 1</em> &#8211; So&#8230; do you want your page done <em>professionally</em> or <em>not</em>?</p>
</div>
<p>Asking someone to quantify exactly how professional they want their page is like asking if they&#8217;re willing to pay <em>more</em> to get things that a professional should already <em>do</em>. You&#8217;re telling me you <em>won&#8217;t</em> &#8220;pay special attention to Load Speed&#8221; if I <em>don&#8217;t</em> shell out the extra hundred?</p>
<p>The trouble is, someone who doesn&#8217;t really understand the web may not understand what they&#8217;re paying for&#8230; besides, the developer should do this <em>anyway</em>.</p>
<blockquote><p>The painters show up with the crew, the paint and the brushes. They&#8217;re ready to paint your house, but before they start, they ask:</p>
<p>&#8220;Do you want us to tape off non-painted surfaces?  Then you&#8217;ll want our <em>Professional Painter&#8217;s Package</em>. Do you want us to avoid getting paint splatters on your concrete and bushes?  In that case, you&#8217;ll need to upgrade to our <em>Hi-End Painter&#8217;s Package</em>. You see, it&#8217;s all about what you&#8217;re willing to spend.&#8221;</p></blockquote>
<p>These aren&#8217;t options: they&#8217;re the <strong>mark of a professional job</strong>.  Cross-browser compatibility, Search Engine Optimization, semantic code, prez-layer separation&#8230; these are professional, industry standards. You could get away with asking for more time, but more money?!? C&#8217;mon&#8230;</p>
<h4>Flex Your CSS Muscles</h4>
<p>This one, I kind of understand.</p>
<div class="figure">
<p><img class="size-full wp-image-58 alignnone" title="To Flex... or not to Flex.  Well, that's gonna cost ya." src="http://www.clintandrewhall.com/blog/wp-content/uploads/2008/01/psd2html2.jpg" alt="To Flex... or not to Flex? That's gonna cost ya." width="521" height="169" /></p>
<p class="credit">Screenshot from <a title="Order Now at PSD2HTML.com" href="http://www.psd2html.com/order-now.html" target="_blank">PSD2HTML.com</a></p>
<p class="caption"><em class="title">Figure 2</em> &#8211; To Flex&#8230; or <em>not</em> to Flex.  Well, that&#8217;s gonna cost ya.</p>
</div>
<p>Flexible, or &#8220;fluid&#8221; layouts can be difficult, depending on the style.  You have to decide the widths of each column, how text wraps, and even when items start to drop.  Again, asking for more time is one thing, almost expected&#8230; charging more, I could almost condone.</p>
<p>But isn&#8217;t this on a case-by-case basis?  Don&#8217;t you have to ask some directed, consultative questions about intent and purpose?  And how did you arrive at $29?  It just seems nonsensical to me.</p>
<blockquote><p>After shelling out more cash, your painting crew has another question:</p>
<p>&#8220;Would you like us to hand-paint your house, or can we go ahead and use our sprayers for the larger walls?  You see, when we got your address, we weren&#8217;t sure about the texture or composition of your walls, so we can&#8217;t tell you right now without looking which would be <em>better</em>, per-se&#8230; but we&#8217;ll knock $20 off if you let us spray.&#8221;</p></blockquote>
<p>Maybe they&#8217;re encouraging a fixed width by offering a $29 discount?  At any rate, it&#8217;s a client call, and I just don&#8217;t think it can be programmatically determined.</p>
<p>Moving on&#8230; because the next one is <em>my favorite</em>.</p>
<h4>Nickels and Dimes Add Up to Big Bucks</h4>
<p>I&#8217;m curious about <em>Advanced Markup Options</em>.</p>
<div class="figure">
<p><img class="size-full wp-image-59 alignnone" title="Opera and Safari need advanced markup... duh!" src="http://www.clintandrewhall.com/blog/wp-content/uploads/2008/01/psd2html3.jpg" alt="Opera and Safari need advanced markup... duh!" width="518" height="351" /></p>
<p class="credit">Screenshot from <a title="Order Noew at PSD2HTML.com" href="http://www.psd2html.com/order-now.html" target="_blank">PSD2HTML.com</a></p>
<p class="caption"><em class="title">Figure 3</em> &#8211; Opera and Safari qualify as &#8220;advanced markup?&#8221;</p>
</div>
<p>&#8220;This option gives you the guarantee&#8230;&#8221;  Are you <strong>kidding me</strong>?</p>
<p>You know, in my office, hack-less cross-browser compatibility is a point of pride.  Sometimes, when we do a demo, we like to give the people in the room the choice of which browser we use to demo&#8230; no-holds-barred.  We also give the option of a JavaScript-disabled or CSS-disabled configuration.  It&#8217;s cool to be challenged, to be able to show our stakeholders that no mainstream browser was ignored, no detail was overlooked.</p>
<blockquote><p>&#8220;I&#8217;m sorry, but which side of your house faces the most people?  I mean, people who live <em>next door to the east </em>can&#8217;t really <em>see</em> the house wall&#8230; their window on that side is pretty tiny.  And most people don&#8217;t drive east on the street, so most wouldn&#8217;t see the east side.&#8221;</p>
<p>&#8220;Oh&#8230; and should we avoid painting the exterior window fixtures?&#8221;</p></blockquote>
<p>To ask a client to pay <em>more</em> for cross-browser compatibility, or to offer a discount to let it slide, encourages the very attitudes web professionals hate: <strong>that only the majority matters</strong>&#8230; that it&#8217;s too hard to code (and test) for 99.9%.  That attitude is what allows Microsoft to continue including proprietary features, (and oftentimes, <em>tolerating omissions</em>): they&#8217;re the majority, make your site work in their browser.  It&#8217;s unacceptable for a professional web shop to <em>not</em> work in these browsers out-of-the-box.</p>
<p>And, I&#8217;m sorry&#8230; but $4 for rollovers?!?  Are CSS hover implementations been deemed hard enough that the code to create them is worth $4?  Are you telling me I have to pay you the equivalent of your morning <a title="Do you realize how many calories that is?" href="http://www.starbucks.com/retail/nutrition_beverage_detail.asp?selProducts=%7B4FD49A71%2DA5C8%2D4580%2D8F6E%2D3C81697B3172%7D&amp;strAction=GETDEFAULT" target="_blank">Starbucks Latte</a> for the effort?</p>
<p>The following, though&#8230; is unacceptable.  That&#8217;s all I&#8217;ll say:</p>
<div class="figure">
<p><img class="size-full wp-image-60 alignnone" title="I said it's unacceptable." src="http://www.clintandrewhall.com/blog/wp-content/uploads/2008/01/psd2html4.jpg" alt="I said it's unacceptable." width="511" height="435" /></p>
<p class="credit">Screenshot from <a title="Order Noew at PSD2HTML.com" href="http://www.psd2html.com/order-now.html" target="_blank">PSD2HTML.com</a></p>
<p class="caption"><em class="title">Figure 4</em> &#8211; <em>Unacceptable</em></p>
</div>
<p>What else can I say?</p>
<h4>Damn, I&#8217;m Sorry, but&#8230;</h4>
<p>I don&#8217;t mean to pick on these guys; I don&#8217;t know them from Adam.  They&#8217;ve obviously put some thought into how they&#8217;re to be paid for their work.  But the strategy is flawed: <strong>what they&#8217;re charging <em>more</em> for should just be <em>included</em>.</strong> They should just state the job will cost between $150 and $300, depending.  As I&#8217;ve pointed out, they have more questions to ask once they get the design anyway.</p>
<p>Will they change their pricing &#8220;menu&#8221; because of this post: <strong><span style="text-decoration: line-through;">probably</span> of course not</strong>. But then again, I don&#8217;t know how much of a market there is here.  Most web professionals like to be in control of the design.</p>
<p>For someone like me, I&#8217;d love it if the client provided me the visual they want; I suck at drawing.  But even if they did, I would still consult with them and provide them with a quality product that another web professional would be able to edit&#8230;</p>
<p>&#8230; but more importantly, <strong>respect</strong>.</p>
<p><!--729ef4f8275bd7c62c1b347278bba2c6--></p>
<p><!--34e1df0dcf8d027c2b9cfbf74350fb0c--></p>
<p><!--45bf942dd64a2725aebd12a05f3553e8--></p>
<p><!--7e898bf61633999ad079d07eb6915fb7--></p>
<p><!--da46bf9bb05bcc566205db76eabe8e37--></p>
<p><!--734a06c91b356004f0b6317d297e527e--></p>
<p><!--363cfb5d24b17c2e90cb02664f51e96a--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.clintandrewhall.com/blog/2008/01/a-terrible-pricing-model-for-web-development/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>When email parsing gets &#8216;glitchy&#8217;</title>
		<link>http://www.clintandrewhall.com/blog/2007/03/when-email-parsing-gets-glitchy/</link>
		<comments>http://www.clintandrewhall.com/blog/2007/03/when-email-parsing-gets-glitchy/#comments</comments>
		<pubDate>Tue, 13 Mar 2007 14:45:41 +0000</pubDate>
		<dc:creator>Clint</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Industry]]></category>

		<guid isPermaLink="false">http://www.clintandrewhall.com/blog/2007/03/when-email-parsing-gets-glitchy/</guid>
		<description><![CDATA[When Google introduced their online Calendar solution, I was pleasantly surprised when I received an email soon after containing an upcoming event, GMail offered to &#8220;Add it to my Calendar.&#8221;  Obviously there were parsing rules in place that recognized a date and/or time, even guessed correctly at the name of the event. Unfortunately, as in all rules assumed in [...]]]></description>
			<content:encoded><![CDATA[<p>When Google introduced their online Calendar solution, I was pleasantly surprised when I received an email soon after containing an upcoming event, GMail offered to &#8220;Add it to my Calendar.&#8221;  Obviously there were parsing rules in place that recognized a date and/or time, even guessed correctly at the name of the event.</p>
<p>Unfortunately, as in all rules assumed in parsing, mistakes can be made:</p>
<p><img title="Google Parsing Error" style="border: #666 1px solid" alt="Google Parsing Error" src="http://i18.photobucket.com/albums/b115/clintandrewhall/39046fa2.jpg" /></p>
<p>My guess is that it was looking at &#8220;7.50 ea&#8221; and translated that into 7:50 Eastern, but I can&#8217;t be sure.  All I know is that it interpreted three items a friend of mine ordered into appointments.  No big deal, but it just reminded me that, even when some parsing rules seem simple and straightforward, someone is going to have a use case that breaks them.
<p>
<p><!--39082d2163c9fdf053d7e927246209a9-->
</p>
<p><!--325fd8693ea26abd6ea0de216bf8b809--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.clintandrewhall.com/blog/2007/03/when-email-parsing-gets-glitchy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resume is Online</title>
		<link>http://www.clintandrewhall.com/blog/2006/12/resume-is-online/</link>
		<comments>http://www.clintandrewhall.com/blog/2006/12/resume-is-online/#comments</comments>
		<pubDate>Sat, 09 Dec 2006 01:02:40 +0000</pubDate>
		<dc:creator>Clint</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Site News]]></category>

		<guid isPermaLink="false">http://www.clintandrewhall.com/blog/2006/12/resume-is-online/</guid>
		<description><![CDATA[I&#8217;ve coded and uploaded a new resume in HTML format.  There were some cool features I thought I&#8217;d mention: Microformatted I used the hResume microformat, which basically makes it readable by any microformat-parsing utility. Very slick. My microformat plugin for Firefox lit up as soon as I loaded it, telling the who, what, where and when [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve coded and uploaded <a title="Link to my resume" href="http://www.clintandrewhall.com/resume.html" rel="me">a new resume</a> in HTML format.  There were some cool features I thought I&#8217;d mention:</p>
<dl>
<dt>Microformatted</dt>
<dd>I used the <a title="External Link: The hResume spec" href="http://microformats.org/wiki/hresume">hResume</a> microformat, which basically makes it readable by any microformat-parsing utility. Very slick. My <a title="External Link: Tails for Firefox" href="https://addons.mozilla.org/firefox/2240/">microformat plugin for Firefox</a> lit up as soon as I loaded it, telling the who, what, where and when of my resume. </dd>
<dt>Print / Screen stylesheets</dt>
<dd>Yes, it&#8217;s pretty. But if you&#8217;re printing it, you shouldn&#8217;t need a color printer, so I set up a print-only section of the sheet. Do a &#8220;print preview&#8221; to see what that looks like.</dd>
<dt>Portable</dt>
<dd>The HTML file is written to be portable, so you can save a copy locally, even from the web, without any external resources. Now I can send my resume in HTML format, instead of Word or Adobe PDF.</dd>
</dl>
<p><!--298df17aa831f401dbd45166b83cbaae-->
<p>
<p><!--bb93539beb457d6b21c10dd419c6d366-->
</p>
<p><!--01496b6e83efa7a87c6fad76cb5c158f--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.clintandrewhall.com/blog/2006/12/resume-is-online/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Ajax Experience: Day &quot;0&quot;</title>
		<link>http://www.clintandrewhall.com/blog/2006/10/the-ajax-experience-day-0/</link>
		<comments>http://www.clintandrewhall.com/blog/2006/10/the-ajax-experience-day-0/#comments</comments>
		<pubDate>Mon, 23 Oct 2006 14:51:59 +0000</pubDate>
		<dc:creator>Clint</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Industry]]></category>

		<guid isPermaLink="false">http://www.clintandrewhall.com/blog/2006/10/the-ajax-experience-day-0/</guid>
		<description><![CDATA[A few coworkers and I have traveled to Boston, MA for The Ajax Experience conference at the Westin Waterfront. It&#8217;s running today thru Wednesday and is covering the gamut of Ajax patterns, techniques, bells, whistles and hare-brained ideas in the industry. We arrived last evening. The hotel is really, really nice. It&#8217;s brand new, with [...]]]></description>
			<content:encoded><![CDATA[<p>A few coworkers and I have traveled to Boston, MA for <em>The Ajax Experience</em> conference at the Westin Waterfront.  It&#8217;s running today thru Wednesday and is covering the gamut of Ajax patterns, techniques, bells, whistles and hare-brained ideas in the industry.</p>
<p><span id="more-14"></span>We arrived last evening.  The hotel is really, <em>really</em> nice.  It&#8217;s brand new, with flat panel televisions and really large bathrooms.  It&#8217;s very contemporary furnishings and &#8220;un-crushed&#8221; chairs and couches.  The computers were down, though, so after an interesting &#8220;here, let me write your information down and give a room key&#8221; transaction, we headed to the <a target="_blank" href="http://www.ltkbarandkitchen.com/site/">LTK restaurant</a> down the street&#8230; quite good.  Afterwards we wandered back to the hotel, and I decided to hit the lobby restaurant/bar called <em>Sauciety</em> and have a scotch before bed.</p>
<p>While I was there, I met two HR representatives from Ask.com named Kelly and Amy; very fun people.  Amy works for Kelly, and once they learned I was there for the same conference, they proceeded to tout the benefits from using Ask.com, (vs. other engines I was not allowed to mention <a href="http://www.google.com/">by name</a> without a dirty look).  <img src='http://www.clintandrewhall.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>We were having a nice time talking, so they snuck me in to the Speaker/Sponsor reception around the corner.  I got to meet a few of the speakers&#8230; most were tired from the trip and were there only to pick up their registration materials (and free iPod).  A few were playing some tile game called <em>Hive</em>&#8230; the gameplay logistics were lost on most of us, but they looked like they were enjoying it.</p>
<p>After the reception, we wandered over to the other lobby bar, <em>The Birch Bar</em>.  It was there I met the booth guys from <a target="_blank" href="http://www.icesoft.com">IceSoft</a>, a Canadian JSF/JavaScript framework company with a booth downstairs.  After a couple of hours talking geek and hearing a much more, er, <em>robust</em> pitch about Ask.com, it was off to bed for an early morning.</p>
<p>It was a nice start to an exciting conference.  I&#8217;ll be (well, <em>attempt</em>) blogging about each day I&#8217;m here, perhaps even each session.  Stay tuned!
<p><!--1befed26c9b180962c9c5806f8fc057a-->
<p>
<p><!--ce56f4e2f46e9ee70253da0a88aeb936-->
</p>
<p><!--9c2c6a9453f9aa23746bf7680269d1d1--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.clintandrewhall.com/blog/2006/10/the-ajax-experience-day-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
