<?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>markhealey.org &#187; code</title>
	<atom:link href="http://www.markhealey.org/archives/category/code/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.markhealey.org</link>
	<description>A flavorful blend of all things Mark.</description>
	<lastBuildDate>Sun, 29 Aug 2010 04:40:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Enabling .htaccess on Apache on Mac OS X</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fenabling-htaccess-on-apache-on-mac-os-x%2F&amp;seed_title=Enabling+.htaccess+on+Apache+on+Mac+OS+X</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fenabling-htaccess-on-apache-on-mac-os-x%2F&amp;seed_title=Enabling+.htaccess+on+Apache+on+Mac+OS+X#comments</comments>
		<pubDate>Thu, 12 Aug 2010 04:11:35 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[localhost]]></category>
		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/?p=1585</guid>
		<description><![CDATA[I&#8217;m working with a WordPress site on localhost and haven&#8217;t been able to get &#8216;pretty&#8217; permalinks working until now. There&#8217;s a few configuration changes to http.conf (your /user/ copy) and, in some cases, adding Options +FollowSymLinks to your .htaccess file, but all in all, it&#8217;s a pain free process. Check out this resource at dancingengineer.com.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m working with a WordPress site on localhost and haven&#8217;t been able to get &#8216;pretty&#8217; permalinks working until now. There&#8217;s a few configuration changes to http.conf (your /user/ copy) and, in some cases, adding <code>Options +FollowSymLinks</code> to your .htaccess file, but all in all, it&#8217;s a pain free process.</p>
<p><a href="http://dancingengineer.com/computing/2009/07/how-to-install-wordpress-on-mac-os-x-leopard">Check out this resource at dancingengineer.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fenabling-htaccess-on-apache-on-mac-os-x%2F&amp;seed_title=Enabling+.htaccess+on+Apache+on+Mac+OS+X/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQTouch</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fjqtouch%2F&amp;seed_title=jQTouch</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fjqtouch%2F&amp;seed_title=jQTouch#comments</comments>
		<pubDate>Tue, 01 Sep 2009 03:03:41 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[applications]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[developing]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[websites]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/?p=1169</guid>
		<description><![CDATA[An impressive jQuery plugin for creating iPhone "apps."]]></description>
			<content:encoded><![CDATA[<p>jQTouch:</p>
<blockquote><p><a href="http://www.jqtouch.com/">jQTouch is a jQuery plugin</a> with native animations, automatic navigation, and themes for mobile WebKit browsers like iPhone, G1, and Pre.</p></blockquote>
<p>You can <a href="http://www.jqtouch.com/preview/demos/main/#home">preview right on your iPhone</a> or watch a demo.</p>
<p>(thx, <a href="http://uptonic.tumblr.com/">Scott</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fjqtouch%2F&amp;seed_title=jQTouch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery vs. MooTools</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fjquery-vs-mootools%2F&amp;seed_title=jQuery+vs.+MooTools</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fjquery-vs-mootools%2F&amp;seed_title=jQuery+vs.+MooTools#comments</comments>
		<pubDate>Thu, 21 May 2009 04:03:17 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[developing]]></category>
		<category><![CDATA[links]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/?p=1049</guid>
		<description><![CDATA[A fair comparison by Aaron Newton.]]></description>
			<content:encoded><![CDATA[<p><a href="http://jqueryvsmootools.com/">Aaron Newton comparing two very popular JavaScript frameworks</a>:</p>
<blockquote><p>jQuery focuses on expressiveness, quick and easy coding, and the DOM while MooTools focuses on extension, inheritance, legibility, reuse, and maintainability. If you put those two things on opposite sides of a scale, the jQuery side translates into something with which it&#8217;s easy to get started and see quick results but (in my experience) can turn into code that&#8217;s harder to reuse and maintain (but really that&#8217;s up to you; it&#8217;s not jQuery&#8217;s problem, per se), while the MooTools side takes longer to learn and requires you to write more code upfront before you see results, but afterwards is more reusable and more maintainable.</p></blockquote>
<p>For me, I decided on jQuery a while back and we&#8217;ve opted to do the same at <a href="http://wallst.com">Wall St</a>. We&#8217;ll see if jQuery stands up to the maintainability test over time, but for now, I contend, the library is giving way to faster <em>and better</em> development.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fjquery-vs-mootools%2F&amp;seed_title=jQuery+vs.+MooTools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Designing High-Performance Websites</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fdesigning-high-performance-websites%2F&amp;seed_title=Designing+High-Performance+Websites</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fdesigning-high-performance-websites%2F&amp;seed_title=Designing+High-Performance+Websites#comments</comments>
		<pubDate>Wed, 06 May 2009 00:44:26 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[developing]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[websites]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/?p=1026</guid>
		<description><![CDATA[A few highlights from Nicole Sullivan's presentation on high-performance websites, with some links for your consumption.]]></description>
			<content:encoded><![CDATA[<p>At the end of April, my employer, <a href="http://wallst.com">Wall Street On Demand</a>, hosted speaker and former Yahoo! performance evangelist <a href="http://stubbornella.org">Nicole &#8220;Stubbornella&#8221; Sullivan</a> for an all-day workshop on high-performance websites and Object Oriented CSS.</p>
<p>Here at Wall St., we host some of the largest financial websites on the Internet. From The New York Times to E*TRADE and Barclays to Charles Schwab, our data centers serve content to millions and millions of users per week. It&#8217;s imperative our websites provide accurate market data, look good, are easy to use, and are fast. With so much information to relay, we&#8217;re pushing a lot of data (including scripts, CSS, images, etc.) through the pipe. So Nicole&#8217;s presentation was perfect fodder for our design and development teams.</p>
<p>A few highlights from her talk, with some links for your consumption follow.</p>
<ul class="list">
<li>Nine best practices for designing and building faster websites:
<ol>
<li>Create a component library of smart objects.</li>
<li>Use consistent semantic styles.</li>
<li>Design modules to be transparent on the inside.</li>
<li>Optimize images and sprites.</li>
<li>Avoid non-standard browser fonts.</li>
<li>Use columns rather than rows.</li>
<li>Choose your bling carefully.</li>
<li>Be flexible.</li>
<li>Learn to love grids.</li>
</ol>
</li>
<li><a href="http://www.stubbornella.org/content/2008/12/28/design-fast-websites-rounded-corners-yui-theater/">Watch her presentation on the YDN</a>.</li>
<li><a href="http://www.sitepoint.com/blogs/2007/09/18/png8-the-clear-winner/">PNG8 is the clear winner</a> for images on any website. They&#8217;re smaller in file size than GIFs (I didn&#8217;t believe it until I saw it), and they support transparency in IE5.5 and IE6. No CSS filter hacks needed. If you&#8217;ve got a copy of Fireworks, you&#8217;re in business because Photoshop doesn&#8217;t help create PNG8&#8242;s transparency. If you don&#8217;t have Fireworks and are comfy with the command line, see this <a href="http://www.ethanandjamie.com/blog/37-user-interface/81-png8-transparency-without-fireworks">guide to making alpha transparency in PNG8</a>.</li>
<li>Embrace <a href="http://smush.it/">Smush.it &#8212; a web service and Firefox plugin</a> created by Nicole and former co-worker <a href="http://www.phpied.com/">Stoyan Stefanov</a>. The tool allows web developers to upload images of any kind while <a href="http://www.phpied.com/smushit-presentations/">Smush.it runs through a long list of compression algorithms</a> stripping meta data and needless information from them before spitting them back to you in a Zip file. It all happens in seconds and a few tests we ran here &#8212; 15 images reduced in size by 320kb (99.18% compression rate) &#8212; yielded impressive results. Evidently, <a href="http://www.stubbornella.org/content/2009/04/29/smushit-finds-a-home-at-yahoo/">Smush.it is in the process of being adopted by Yahoo!</a> which has immediately interrupted the service (but hopefully not permanently).</li>
<li>Consider <a href="http://www.stubbornella.org/content/2009/02/28/object-oriented-css-grids-on-github/">Object Oriented CSS</a>, or OO CSS. Much of OO CSS is in the 9 best practices mentioned above. But it&#8217;s not what you think. It&#8217;s not object oriented in the traditional programming sense of the term. It&#8217;s object &#8212; as in a virtual thing: a module, a header, a sidebar bucket, etc. I had a hard time with this one in the beginning. Most of OO CSS is pure common sense &#8212; at least it is here at Wall St. Sit down, evaluate your designs <em>before</em> you start building, and determine a baseline for common elements across the site. Then piece together your CSS efficiently. Three really useful tips for page layout:
<ol>
<li>Don&#8217;t use height-specific modules. Let the content determine the height. <em>This is genius and must be recognized by designers. Vertical grids, not horizontal.</em></li>
<li>If you have two or three modules with rounded corners that are different but look similar, just pick one and move on. &#8220;Users aren&#8217;t that sophisticated,&#8221; she said.</li>
<li>Use grids to determine layout, and let the content fill 100% of the available space. This way two columns becomes three columns or becomes 6 columns and the content continues to just fit.</li>
</ol>
</li>
<li>Set aside a few minutes to <a href="http://www.stubbornella.org/content/2009/02/28/object-oriented-css-grids-on-github/">watch her presentation on OO CSS</a>. It&#8217;s not earth-shattering stuff, but she does make some interesting points that convinced us to approach web dev from a slightly different angle.</li>
</ul>
<p>Thanks Nicole. Safe travels in India.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fdesigning-high-performance-websites%2F&amp;seed_title=Designing+High-Performance+Websites/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Regarding Quality vs. Schedule</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fregarding-quality-vs-schedule%2F&amp;seed_title=Regarding+Quality+vs.+Schedule</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fregarding-quality-vs-schedule%2F&amp;seed_title=Regarding+Quality+vs.+Schedule#comments</comments>
		<pubDate>Tue, 05 May 2009 17:01:53 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[applications]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[developing]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[websites]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/?p=1022</guid>
		<description><![CDATA[Business demands crap every time.]]></description>
			<content:encoded><![CDATA[<p><a href="http://edgibbs.com/bio/">Ed Gibbs</a>, a software development manager from Sacramento, <a href="http://edgibbs.com/2009/04/28/compromising-quality-for-schedule/">wrote about a presentation</a> <a href="http://blog.objectmentor.com/articles/2009/04/23/crap-code-inevitable-rumblings-from-accu">Bob Martin</a> attended &#8220;where the speaker had just about given up on ever getting better code quality, because businesses didn’t value it.&#8221;</p>
<blockquote><p>His claim that crappy code is inevitable is based on the notion that crappy code is cheaper than clean code, and that therefore businesses will demand the crap every time. But it has generally not been business that has demanded crappy code. Rather it has been developers who mistakenly thought that the business’ need for speed meant that they had to produce crappy code. Once we, as professional developers, realize that the only way to go fast is to create clean and well designed code, then we will see the business’ need for speed as a demand for high quality code.</p></blockquote>
<p>I&#8217;m in the <a href="http://wallst.com">business of web-based software and website development</a> where clean code is paramount but deadlines always seem to win. There just aren&#8217;t enough hours in the day and days in the month to get through all the requirements. The process usually works like this: business development sells the job, design chews through the schedule, development is a rush, and quality assurance is an after thought. And, as Bob and Ed clearly point out, this is certainly not the best way to develop software or websites.</p>
<p>(Thx, Tim)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fregarding-quality-vs-schedule%2F&amp;seed_title=Regarding+Quality+vs.+Schedule/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DomReady</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fdomready%2F&amp;seed_title=DomReady</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fdomready%2F&amp;seed_title=DomReady#comments</comments>
		<pubDate>Sat, 02 May 2009 18:08:57 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[applications]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[developing]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[websites]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/?p=1019</guid>
		<description><![CDATA[Code alert: the smallest subset possible from jQuery to support dom Ready event.]]></description>
			<content:encoded><![CDATA[<p>I was working on an existing site earlier this week that doesn&#8217;t use jQuery and desperately needed a quick, effective and efficient &#8220;on DOM ready&#8221; handler. I started pull apart and reconstruct jQuery&#8217;s <code>jQuery.ready();</code> method, but stumbled on &#8220;<a id="project_summary_link" href="http://code.google.com/p/domready/">DomReady</a>&#8221; &#8212; t<em>he smallest subset possible from jQuery to support dom Ready event</em>. I ran it quickly through Dean Edwards&#8217; <a href="http://dean.edwards.name/packer/">Packer</a> and was off. No library needed.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fdomready%2F&amp;seed_title=DomReady/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Custom Buttons</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fcustom-buttons%2F&amp;seed_title=Custom+Buttons</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fcustom-buttons%2F&amp;seed_title=Custom+Buttons#comments</comments>
		<pubDate>Tue, 10 Feb 2009 15:26:46 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[websites]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/?p=910</guid>
		<description><![CDATA[Doug Bowman&#8217;s tale of the new buttons at Google: Until some future version of HTML gives us new native controls to use in a browser, at Google, we’ve been playing and experimenting with controls we call “custom buttons” in our apps (among other custom controls). (via)]]></description>
			<content:encoded><![CDATA[<p><a href="http://stopdesign.com/archive/2009/02/04/recreating-the-button.html">Doug Bowman&#8217;s tale of the new buttons at Google</a>:</p>
<blockquote><p>Until some future version of HTML gives us new native controls to use in a browser, at Google, we’ve been playing and experimenting with controls we call “custom buttons” in our apps (among other custom controls).</p></blockquote>
<p>(<a href="http://www.mikeindustries.com/blog/archive/2009/02/the-curious-case-of-bowmans-buttons">via</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fcustom-buttons%2F&amp;seed_title=Custom+Buttons/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery 1.3</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fjquery-13%2F&amp;seed_title=jQuery+1.3</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fjquery-13%2F&amp;seed_title=jQuery+1.3#comments</comments>
		<pubDate>Wed, 14 Jan 2009 17:12:35 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[developing]]></category>
		<category><![CDATA[websites]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/?p=872</guid>
		<description><![CDATA[A new version of jQuery rolled out today with significant improvements and enhancements over 1.2.6. Read all about it.]]></description>
			<content:encoded><![CDATA[<p>A new version of jQuery rolled out today with significant improvements and enhancements over 1.2.6. <a href="http://blog.jquery.com/2009/01/14/jquery-13-and-the-jquery-foundation/">Read all about it</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fjquery-13%2F&amp;seed_title=jQuery+1.3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Peace. Love. Coda.</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fpeace-love-coda%2F&amp;seed_title=Peace.+Love.+Coda.</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fpeace-love-coda%2F&amp;seed_title=Peace.+Love.+Coda.#comments</comments>
		<pubDate>Sun, 29 Apr 2007 14:39:17 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[applications]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[web design]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/archives/peace-love-coda/</guid>
		<description><![CDATA[I was getting some thoughts together for an article on this site after a full week using Panic&#8217;s new IDE, Coda. But Mr. John Gruber of Daring Fireball beat me to the punch. I say what he says: &#8220;One way to judge the scope of an app is to think about how much time you’re [...]]]></description>
			<content:encoded><![CDATA[<p>I was getting some thoughts together for an article on this site after a full week using Panic&#8217;s new IDE, <a href="http://www.panic.com/coda/" title="Coda">Coda</a>. But Mr. John Gruber of <a href="http://daringfireball.net/2007/04/coda" title="Read Coda on Daring Fireball">Daring Fireball</a> beat me to the punch.</p>
<p>I say what he says:</p>
<blockquote class="p"><p>&#8220;One way to judge the scope of an app is to think about how much time you’re intended to spend using it. There’s plenty of room for apps you use here and there for a few minutes at a time, or which you launch just once or twice a week. There’s hardly any room at all, though, for apps you work in for hours at a time, every day.</p>
<p>By this measure, Coda, the new app from Panic, is an epic.&#8221;</p></blockquote>
<p>Kudos, John.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fpeace-love-coda%2F&amp;seed_title=Peace.+Love.+Coda./feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Helping Users Save Their Changes, Updated</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fhelping-users-save-their-changes-updated%2F&amp;seed_title=Helping+Users+Save+Their+Changes%2C+Updated</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fhelping-users-save-their-changes-updated%2F&amp;seed_title=Helping+Users+Save+Their+Changes%2C+Updated#comments</comments>
		<pubDate>Thu, 15 Mar 2007 20:26:32 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[applications]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[websites]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/archives/helping-users-save-their-changes-updated/</guid>
		<description><![CDATA[I authored an article a few weeks back on a technique for stopping users from leaving a web form if they&#8217;ve made changes using JavaScript and the Prototype library. There was one fatal flaw in this otherwise successful script: it only checked for changes in text fields. Well, if you were as frustrated as I [...]]]></description>
			<content:encoded><![CDATA[<p>I authored an <a href="http://www.markhealey.org/archives/interface-helper-ensuring-users-save-their-changes/" title="Read Interface Helper... on this website">article</a> a few weeks back on a technique for stopping users from leaving a web form if they&#8217;ve made changes using JavaScript and the Prototype library. There was one fatal flaw in this otherwise successful script: it only checked for changes in text fields. Well, if you were as frustrated as I was, today&#8217;s your lucky day. Read on.</p>
<p>First, let me say if you haven&#8217;t read that article, do so now. If you have already, continue. Remember we started with a simple but obtrusive &#8220;halt!&#8221;? The code looks like this:</p>
<pre>
var needToConfirm = true;
window.onbeforeunload = confirmExit;

function confirmExit() {
if (needToConfirm)
return "Are you sure you want to leave?";
}</pre>
<p>We modified the above to handle many more fields, and to compare arrays using a combination of functions afforded to us by Prototype, 4Guys, and others. You should <a href="http://www.markhealey.org/files/onleave.js" title="Download onleave.js">view/download the full script</a> to see what I&#8217;m talking about. All this excitement is of course about how this script can <em>now</em> process (check, compare, validate) <strong>all</strong> the fields on any form.  When I discovered this I slapped myself on my forehead like those new TV commercials for <em>V8</em>. Doh! It&#8217;s easy:</p>
<p>On line 4, replace this:</p>
<pre>var f = $$('div#myform input');</pre>
<p>with this:</p>
<pre>var f = $$('form#id input','form#id select');</pre>
<p>Replace &#8220;#id&#8221; with your form&#8217;s Id. Using Prototype&#8217;s utility function, this creates an array of all the form fields and hands it off to our script&#8230; ultimately stopping a user if they made a change to any values, and letting them go if they have had a view-only session.</p>
<p>Editor&#8217;s note: The previous version of this script was downloaded a ton of times. I&#8217;m assuming folks are using it, and I&#8217;m positive there are ways to improve it. Comment away!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fhelping-users-save-their-changes-updated%2F&amp;seed_title=Helping+Users+Save+Their+Changes%2C+Updated/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Squirrels in my bird feed</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fsquirrels-in-my-bird-feed%2F&amp;seed_title=Squirrels+in+my+bird+feed</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fsquirrels-in-my-bird-feed%2F&amp;seed_title=Squirrels+in+my+bird+feed#comments</comments>
		<pubDate>Fri, 23 Feb 2007 15:18:37 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[blogging]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/archives/squirrels-in-my-bird-feed/</guid>
		<description><![CDATA[I recently tried to install the Mint BirdFeeder Pepper, and failed despite my best efforts to follow the readme instructions to the T. Unsure what I&#8217;m missing, my WordPress feeds aren&#8217;t working properly anymore&#8230; even after replacing the Pepper-edited versions with fresh copies from the WP 2.1.1 archive. Grrr. Perhaps it&#8217;s a WP permalinks issue. [...]]]></description>
			<content:encoded><![CDATA[<p>I recently tried to install the <a href="http://haveamint.com" title="Have a mint!">Mint</a> <a href="http://www.haveamint.com/peppermill/pepper/11/bird_feeder/" title="BirdFeeder">BirdFeeder Pepper</a>, and failed despite my best efforts to follow the readme instructions to the <strong>T</strong>. Unsure what I&#8217;m missing, my WordPress feeds aren&#8217;t working properly anymore&#8230; even after replacing the Pepper-edited versions with fresh copies from the WP 2.1.1 archive. <strong>Grrr</strong>. Perhaps it&#8217;s a WP permalinks issue. That&#8217;s for another day.</p>
<p>For now, note my RSS 2 feed has <strong>changed</strong> location:</p>
<p><a href="http://markhealey.org/feed/rss2/" title="New RSS2 feed">http://markhealey.org/feed/rss2/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fsquirrels-in-my-bird-feed%2F&amp;seed_title=Squirrels+in+my+bird+feed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interface Helper: Ensuring users save their changes</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Finterface-helper-ensuring-users-save-their-changes%2F&amp;seed_title=Interface+Helper%3A+Ensuring+users+save+their+changes</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Finterface-helper-ensuring-users-save-their-changes%2F&amp;seed_title=Interface+Helper%3A+Ensuring+users+save+their+changes#comments</comments>
		<pubDate>Mon, 12 Feb 2007 01:07:40 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[applications]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[websites]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/archives/interface-helper-ensuring-users-save-their-changes/</guid>
		<description><![CDATA[I am building a back-office administration tool for a New York-based client. The application manages their customer data, tracks invoices and payments, application forms, travel information, manages their corporate Web site&#8217;s content and media, and a whole lot more. It&#8217;s pretty damned slick. Despite it&#8217;s numerous (and not-yet-fully-tested!) successes, there&#8217;s one fatal flaw with this [...]]]></description>
			<content:encoded><![CDATA[<p>I am building a back-office administration tool for a New York-based client. The application manages their customer data, tracks invoices and payments, application forms, travel information, manages their corporate Web site&#8217;s content and media, and a whole lot more. It&#8217;s pretty damned slick.</p>
<p>Despite it&#8217;s numerous (and not-yet-fully-tested!) successes, there&#8217;s one fatal flaw with this new application I&#8217;ve built: the primary users are coming directly from a Microsoft Office Access &#8217;97 form-driven database. (I know what you might be thinking. This gets good. Read on.) Their current Office system works well, but it&#8217;s been patched, band-aided, and added onto countless times since the early part of this decade. In fact, when it loads, the Access &#8217;97 &#8220;dashboard&#8221; has 20 or 30 differently-colored bricks which when clicked take users on a magical ride through literally hundreds of custom queries, and thousands of records in one single gigantic table. Each of the company&#8217;s employees is fluent in the myriad codes and mystical shorthand that make up each row and column of data. It&#8217;s something to behold, let me tell you.</p>
<p>Over the past months, through endless revisions of specification documents, writing line after line of semantic code, and creating ingenious ways to handle complex scenarios, one of the simplest issues arose. It is a direct result of my client&#8217;s full-time use of and dependence on Access &#8217;97, and it&#8217;s fun save-as-you-move-from-field-to-field feature. Users never have to click a &#8220;save&#8221; button, and can fly around updating customer data in a dash. Not so with the new web application. Here&#8217;s how we fix the problem.</p>
<h3>Preventing Users from Leaving Without Saving Their Data</h3>
<p>There are two views in the new software where numerous text fields, checkboxes and select boxes grace the page. During some initial testing, we found that users were changing data and immediately bouncing along to another view without saving their changes &#8211; an action they were quite comfortable performing in the past. It became clear I had to write some code that stopped users from leaving the page unless they saved their changes.</p>
<p>I immediately turned to the DOM&#8217;s <code>onbeforeunload</code> event. We&#8217;re already using a short and sweet function on the multi-step customer application form which is somewhat obtrusive; a user cannot go anywhere, close the browser, or even refresh the page without being hit with a JavaScript confirmation box asking them if they&#8217;re sure they want to go. The code looks like this:</p>
<pre>
var needToConfirm = true;
window.onbeforeunload = confirmExit;

function confirmExit() {
if (needToConfirm)
	return "Are you sure you want to leave?";
}</pre>
<p>This wonderfully-crafted little snippet comes from <a href="http://www.4guysfromrolla.com/webtech/100604-1.shtml" title="Prompting Users Before They Leave">4GuysFromRolla</a>. Although nice, I needed something &#8220;smarter&#8221; that only prompted a user <strong>if</strong> and only if they made a change on the page. Scott Mitchell, the 4Guys author, continued in his article with an example of how to achieve this by creating two JavaScript arrays and then looping through them comparing the values. Great inspiration, Scott. I couldn&#8217;t use this script because I have two dozen fields on one view (it actually looks pretty good) instead of his six and typing out each field ID would take too much time. So I used his example, and wrote this <a href="http://www.markhealey.org/files/onleave.js" title="Download the JavaScript">relatively short set of functions</a>:</p>
<pre>
	//markhealey.org
	//Inspiration from Scott Mitchell: http://www.4guysfromrolla.com/webtech/100604-1.shtml

	var f = $$('div#myform input');
	var needToConfirm = true;

	//Get all form field values
	var formDBVals = '';
	for(var i=0; i<f.length;>
		formDBVals += "'" + escape(f[i].value) + "', ";
	}
	formDBVals += "''";
	//New arrary to hold DB vals, before changes
	var the_values = new Array(formDBVals);

	//http://www.breakingpar.com/bkp/home.nsf/Doc%21OpenNavigator&amp;87256B280015193F87256BFB0077DFFD
	function areArraysEqual(array1, array2) {
	   var temp = new Array();
	   if ( (!array1[0]) || (!array2[0]) ) { // If either is not an array
		  return false;
	   }
	   if (array1.length != array2.length) {
		  return false;
	   }
	   // Put all the elements from array1 into a "tagged" array
	   for (var i=0; i<array1.length;>
</array1.length;>		  key = (typeof array1[i]) + "~" + array1[i];
	   // Use "typeof" so a number 1 isn't equal to a string "1".
		  if (temp[key]) { temp[key]++; } else { temp[key] = 1; }
	   // temp[key] = # of occurrences of the value (so an element could appear multiple times)
	   }
	   // Go through array2 - if same tag missing in "tagged" array, not equal
	   for (var i=0; i<array2.length;>
</array2.length;>		  key = (typeof array2[i]) + "~" + array2[i];
		  if (temp[key]) {
			 if (temp[key] == 0) { return false; } else { temp[key]--; }
		  // Subtract to keep track of # of appearances in array2
		  } else { // Key didn't appear in array1, arrays are not equal.
			 return false;
		  }
	   }
	   // If we get to this point, then every generated key in array1 showed up the exact same
	   // number of times in array2, so the arrays are equal.
	   return true;
	}

	function confirmExitAccountInfo() {

		var formChangedVals = '';
		for(var i=0; i<f.length;>
			formChangedVals += "'" + escape(f[i].value) + "', ";
		}
		formChangedVals += "''";

		var the_changed_values = new Array(formChangedVals);

		if(needToConfirm) {
			if(!areArraysEqual(the_values,the_changed_values) ) {
				return "It appears you changed some info. Did you mean to leave without saving it?";
			}
		}
	}

	window.onbeforeunload = confirmExitAccountInfo;
</f.length;></f.length;></pre>
<p>Let&#8217;s examine this script. We first need to set the variable &#8220;<code>needToConfirm</code>&#8221; to true, so as soon as the page loads, we assume the user is going to get the save-before-you-leave prompt (unless they click &#8220;save&#8221;).  Then using the <a href="http://www.sergiopereira.com/articles/prototype.js.html#UtilityFunctions">Prototype function $$()</a>, we load the values of every field in my form into an array called <code>formDBVals</code> by using a simple for loop. Since most of the fields on the view are pre-loaded with information from our database, we easily have access to this data. But you could fill your array with null values. We ultimately want to capture any changes the user makes, and prompt them to save them before leaving the page.</p>
<p>To track changes the user makes, we&#8217;re not actually doing anything fancy&#8230; just re-looping through the form fields, and comparing the original array (<code>formDBVals</code>) to the values in a second array (<code>formChangedVals</code>) when the form is saved. Using a snazzy script I found at <a href="http://www.breakingpar.com/bkp/home.nsf/Doc%21OpenNavigator&amp;87256B280015193F87256BFB0077DFFD">BreakingPar</a>, we quickly compare the two arrays. If they&#8217;re different, that is, if the user changed anything, we fire the save-before-you-leave prompt. If the two arrays are the same, then the user hasn&#8217;t changed any values&#8230; and of course, they&#8217;re <em>allowed</em> to leave. We also have to add &#8220;<code>needToConfirm=false;</code>&#8221; to the submit button&#8217;s onclick.</p>
<p>What started with obtrusive prompts which get really annoying &#8211; especially if nothing&#8217;s been changed &#8211; has now evolved into a smart script that&#8217;s completely reusable in any form. Remember, you need to include the <strong>Prototype.js</strong> for this to work.</p>
<p>Use it in your app, just please give 4Guys and me some credit. <a href="http://www.markhealey.org/files/onleave.js">Download the JavaScript</a>. And check out the live demo at <a href="http://www.4guysfromrolla.com/demos/OnBeforeUnloadDemo3.htm">4GuysFromRolla</a>.</p>
<p>Update: Sorry friends, I forgot to mention: This script <strong>does not</strong> detect checkbox or select box activity; only text fields. If you have that working, let me know and I&#8217;ll append this script for everyone.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Finterface-helper-ensuring-users-save-their-changes%2F&amp;seed_title=Interface+Helper%3A+Ensuring+users+save+their+changes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Like Marty McFly, Outlook 2007 going back in time</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Flike-marty-mcfly-outlook-2007-going-back-in-time%2F&amp;seed_title=Like+Marty+McFly%2C+Outlook+2007+going+back+in+time</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Flike-marty-mcfly-outlook-2007-going-back-in-time%2F&amp;seed_title=Like+Marty+McFly%2C+Outlook+2007+going+back+in+time#comments</comments>
		<pubDate>Thu, 11 Jan 2007 13:28:22 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[applications]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[standards]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/archives/like-marty-mcfly-outlook-2007-going-back-in-time/</guid>
		<description><![CDATA[I was having a pretty good Wednesday. The normal cooler winter weather had rolled into Charleston with a large high pressure system affecting much of the east coast, and I had just picked up a cup of coffee. It was then I received a chat from the fabulous Jackson Latka with simply a URL to [...]]]></description>
			<content:encoded><![CDATA[<p>I was having a pretty good Wednesday. The <strong>normal</strong> cooler winter weather had rolled into Charleston with a large high pressure system affecting much of the east coast, and I had just picked up a cup of coffee. It was then I received a chat from the fabulous <a href="http://jacksonlatka.com" target="_blank">Jackson Latka</a> with simply a URL to SitePoint&#8217;s <a href="http://www.sitepoint.com/blogs/category/webtech/" target="_blank">WebTech blog</a>. Pretty good Wednesday no more.</p>
<p>SitePoint contributor Kevin Yank authored a post titled, &#8220;<strong><a href="http://www.sitepoint.com/blogs/2007/01/10/microsoft-breaks-html-email-rendering-in-outlook/" target="_blank">Microsoft Breaks HTML Email Rendering in Outlook 2007</a></strong>.&#8221; I didn&#8217;t even get past the opening paragraph before I started having heart palpitations. You may recall an article I penned last November on the topic of <a href="/archives/formatting-xhtml-emails-the-hard-way/" title="Archives: Formatting XHTML Emails The Hard Way">formatting XHTML emails</a> for today&#8217;s myriad mail clients. </p>
<blockquote><p>If support for web standards in browsers is improving slowly, then support in email clients is moving at a glacial pace. </p></blockquote>
<p>Microsoft has officially decided to drop the IE-based rendering support from Office Outlook 2007 in favor of&#8230; you guessed it, Word. <a href="http://www.worldwidewords.org/qa/qa-gre4.htm" title="Where does Doc Brown's favorite exclamation actually come from?" target="_blank">Great Scott</a>!</p>
<p>I wouldn&#8217;t categorize myself as a Microsoft hater, but this decision ranks up there on the Top 10 Most Moronic Moves Ever Made While Trying to Win Over Web Developers list. For the first time in years, Microsoft releases an update to their highly used web browsing client which is significantly more supporting of web standards than previous versions. Yet, Redmond opted to use Word&#8217;s <em>far superior</em> web page rendering engine in Outlook. I am, of course, being as sarcastic as I&#8217;ve ever been. </p>
<p>The news, as bad as it is, is not the end of HTML emails in Outlook. We&#8217;ll have to redesign them to be thinner, with less emphasis on appearance and more on getting <em>back</em> to plain-and-simple content.</p>
<p>Unless Microsoft does the old switchero, with the impending release of the consumer version of the Office 2007 System, expect to redesign your HTML email templates in favor a much less instead of what IE7 offers &mdash; much more.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Flike-marty-mcfly-outlook-2007-going-back-in-time%2F&amp;seed_title=Like+Marty+McFly%2C+Outlook+2007+going+back+in+time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>To you, IE7, and only you.</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fto-you-ie7-and-only-you%2F&amp;seed_title=To+you%2C+IE7%2C+and+only+you.</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fto-you-ie7-and-only-you%2F&amp;seed_title=To+you%2C+IE7%2C+and+only+you.#comments</comments>
		<pubDate>Fri, 01 Dec 2006 18:33:31 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[applications]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[websites]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/2006/12/01/to-you-ie7-and-only-you/</guid>
		<description><![CDATA[When working with a new view on a client’s site, I decided the multi-page grid needed some quick and easy navigation to jump between the layouts. Enter stage left: Douglas Bowman’s Sliding Doors of CSS courtesy of ALA. I added two tabs to my new view, repositioned them on the right side — which took [...]]]></description>
			<content:encoded><![CDATA[<p>When working with a new view on a client’s site, I decided the multi-page grid needed some quick and easy navigation to jump between the layouts.</p>
<p>Enter stage left: Douglas Bowman’s <a href="http://www.alistapart.com/articles/slidingdoors/" title="Sliding Doors of CSS">Sliding Doors of CSS</a> courtesy of <a href="http://www.alistapart.com/" title="A List Apart">ALA</a>.</p>
<p>I added two tabs to my new view, repositioned them on the right side — which took some fancy footwork because this awesome technique only demonstrated the tabs as left-justified — and started the browser testing. With some minor edits to the CSS, my new tabs worked perfectly in almost uniform fashion, except in IE7. The browser correctly interpreted both of these declarations, including the Holly Hack (a.k.a. the Be Nice to Opera rule), previously undetected by IE.</p>
<p><code>#tabbednav ul { margin: 0; }<br />
html&gt;body #tabbednav ul { margin-bottom: -10px; }</code></p>
<p>A <a href="http://www.zeldman.com/2006/10/27/ie7fixes1/">post on Zeldman.com</a> helped me figure this one out, and allowed me to specify rules using a modified Holly Hack. This declaration targets Opera and Mozilla browsers, but all versions of IE don&#8217;t see it, including IE7:</p>
<p><code>html&gt;<strong>/**/</strong>body #tabbednav ul { margin-bottom: -10px; }</code></p>
<p>Thanks to <a href="http://www.zeldman.com/2006/10/27/ie7fixes1/">Zeldman</a> and <a href="http://www.raspberry.net/">donovan</a>.</p>
<p><strong>Update @ nearly 4PM:</strong><br />
After further testing, Safari picks up my modified Holly Hack and improperly renders my tabs. I guess I&#8217;m going back to the drawing board.</p>
<p><strong>Update @ just a bit before 4PM:</strong><br />
Ok, final update. I promise. In the end, I was able to make some modifications to one other rule and didn&#8217;t end up needing the negative margin. If anyone knows more about this &#8220;/**/&#8221; hack, <a href="/contact/" title="Contact me">ping me</a>, I&#8217;m curious now.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fto-you-ie7-and-only-you%2F&amp;seed_title=To+you%2C+IE7%2C+and+only+you./feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Formatting (X)HTML Emails the Hard Way</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fformatting-xhtml-emails-the-hard-way%2F&amp;seed_title=Formatting+%28X%29HTML+Emails+the+Hard+Way</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fformatting-xhtml-emails-the-hard-way%2F&amp;seed_title=Formatting+%28X%29HTML+Emails+the+Hard+Way#comments</comments>
		<pubDate>Thu, 30 Nov 2006 13:15:53 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[applications]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/2006/11/30/formatting-xhtml-emails-the-hard-way/</guid>
		<description><![CDATA[CSS documents. We all love them. One external cascading style sheet easily referenced by any web page on your site. All of your neatly-formatted rules contained in one place controlling the appearance of your kick-ass design. You handle browser differences and deficiencies with ease. You give your users content-rich printable pages. You might even have [...]]]></description>
			<content:encoded><![CDATA[<p>CSS documents. We all love them. One external cascading style sheet easily referenced by any web page on your site. All of your neatly-formatted rules contained in one place controlling the appearance of your kick-ass design. You handle browser differences and deficiencies with ease. You give your users content-rich printable pages. You might even have a sweet liquid layout allowing users to pick their favorite design. What more could one ask for?  Oh, well if you have ever tried to send an (X)HTML email from your web apps, you and I both have a lot more to ask for.</p>
<blockquote><p>If you have ever tried to send an (X)HTML email from your web apps, you and I both have a lot more to ask for.</p></blockquote>
<p>I’m currently writing an application for a client of mine that’s rich in user interaction. In part, users can create accounts, verify email addresses, forget passwords, and more of the standard account-related functions. Needless to say, without any unnecessary overkill, we will be sending a good amount of emails to my client’s user base. I could have easily opted to send text-only messages, but the requirement included displaying a logo, bolding text, and other graphical presentations otherwise not available in text-only. So, without much hesitation, I charged ahead. Whip up some clean (and strict) XHTML, use loads of my already-fine-tuned CSS rules, pump in some content and we’re off! </p>
<p>Wrong. And this was just the beginning.</p>
<p>I use my Gmail account for testing &mdash; it’s convenient because all the messages get lumped into one conversation for easy review, not to mention the huge disk space and (my favorite) delete button closely within reach. But for all of Gmail’s successes, it sure wreaked havoc on my nicely-formatted XHTML messages. Evidently, Gmail strips every shred of code out of your email, and rebuilds it in its entirety before spitting it back into it&#8217;s wonderfully successful conversation view. Those unique div, span and other IDs? Gone. The short and sweet CSS rules? Gone, and definitely not working. Hell, even my one-line footer wrapped in a <code>small</code> tag didn’t render properly. I now know why I can&#8217;t read my itinerary confirmations from the airlines in Gmail.</p>
<p>To make sure I wasn’t out of my mind, I changed my testing email address to an account I manage with Outlook on Windows and Mail on the Mac. Naturally, the message came through looking as perfect as I could have ever imagined. I repeated this process with Mozilla&#8217;s Thunderbird and then webmail at Yahoo!, Hotmail, and AOL &mdash; all succeeded, but in different ways. Microsoft’s widely-used Outlook client performed the best (same goes for Outlook Web Access), followed closely by OS X’s Mail. Neither re-wrote my code. Yahoo! did better than Hotmail, but Hotmail’s new interface liked the HTML and CSS hybrid a little more than the old but it still wasn&#8217;t perfect. </p>
<p>I am fighting an in-browser application war! Here we have browser-based applications developed by the world&#8217;s largest software manufacturers performing the same basic functions displaying standard XHTML and CSS content from the same source &mdash; and it just doesn&#8217;t work. Grrr. In the end, it&#8217;s Gmail that is causing the biggest headaches.</p>
<p>Yesterday, I finished restructuring the code following tips I read about on this highly-useful <a href="http://en.wikipedia.org/wiki/Interweb" title="Are we on the interweb?">Interweb</a> (I love that old Verizon DSL commercial). Here are a few that helped me get going again:</p>
<ul>
<li>Don&#8217;t put anything in the <code>head</code> of your email template.</li>
<li>Forget the love you have for your fine-tuned CSS document; there&#8217;s no hope of using it (as an externally linked file). You&#8217;ll have to drop all your classes and ids replacing them with hideous inline styles. If your email&#8217;s recipients use Gmail, you&#8217;ll need to do this one.</li>
<li>If all else fails, especially with AOL, use a <code>table</code> to position your goodies. I can&#8217;t believe I typed that, but when it comes to this and saving time, it works.</li>
<li>Have patience. I nearly tossed my lappie out the window on more than one occasion.</li>
</ul>
<p>As of yesterday, my client&#8217;s customers are ready to receive fancy-schmancy emails. No matter which mail client, web-based or desktop, Mac or Windows, they&#8217;ll all see the same content &mdash; as it was intended by this designer. Now that it&#8217;s done and I&#8217;m filling out my time sheet, I find myself having a hard time justifying the large chunks of time spent formatting arbitrary (yet critical) emails when there&#8217;s plenty of other work that needs doing. It seems funny to me but after all these messages, like them or not, <em>are</em> part of your app and, more importantly, your client&#8217;s outward-facing marketing.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fformatting-xhtml-emails-the-hard-way%2F&amp;seed_title=Formatting+%28X%29HTML+Emails+the+Hard+Way/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Browser Bullies &#8211; My XSL Doesn&#8217;t Work</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fbrowser-bullies%2F&amp;seed_title=Browser+Bullies+%26%238211%3B+My+XSL+Doesn%26%238217%3Bt+Work</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fbrowser-bullies%2F&amp;seed_title=Browser+Bullies+%26%238211%3B+My+XSL+Doesn%26%238217%3Bt+Work#comments</comments>
		<pubDate>Sat, 28 Oct 2006 14:10:38 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[browsers]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[websites]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/2006/10/28/browser-bullies/</guid>
		<description><![CDATA[A lot of developers have been talking about it for months, so it is not with much fanfare we celebrate the news. Internet Explorer 7 has finally been released in its &#8220;polished&#8221;? state for the general public to consume. There’s no telling when Windows XP will start automatically issuing the browser through its built-in Windows [...]]]></description>
			<content:encoded><![CDATA[<p>A lot of developers have been talking about it for months, so it is not with much fanfare we celebrate the news.  Internet Explorer 7 has finally been released in its &#8220;polished&#8221;? state for the general public to <a href="http://www.microsoft.com/ie">consume</a>. There’s no telling when Windows XP will start automatically issuing the browser through its built-in Windows Update feature, but I’m guessing it might be soon. Meantime, web designers the world over are scrambling to make sure their sites perform as intended in IE7 (<a href="http://www.zeldman.com/2006/10/27/ie7showandtell/">Talk bugs, hacks, and more at Zeldman.com</a>). And it’s not just Microsoft that’s turning up the heat. Last Tuesday, the Internet Explorer team in Redmond <a href="http://www.flickr.com/photos/jollyjake/278562314/" title="Look at all that icing!">sent a cake</a> to the Firefox team at Mozilla to congratulate them on their Firefox 2.0 &mdash; this developer’s browser of choice &mdash; <a href="http://www.getfirefox.com">official release</a>. </p>
<p><strong>Poor XSL</strong><br />One of the reasons I’m discontent with the three biggies &mdash; <a href="http://www.apple.com/macosx/features/safari/">Safari</a>, IE7, and Firefox 2 &mdash; is their apparent blatant disregard for a designer’s freedom to exercise his or her right to a custom XSL&mdash;styled XML feed. I don’t normally spend too much time writing XSL documents, but for one client’s particular requirement, they wanted a custom XML feed page. The client’s user base, we anticipated, was not RSS-savvy and we’d hoped to ease them into the process for consuming news, regular updates, and more. So, enter a fairly simple XSL style sheet and the <a href="http://rss.sailcaribbean.com/rss/tripUpdates_all.asp" title="Use Firefox 1 or IE 6 to see the goods">über&mdash;friendly appearance of styled XML</a>. Not so in the latest versions of these browsers.</p>
<p>It’s possible that I haven’t yet found the setting in the browser preferences or the line of code that fixes it, but the aforementioned Big Three are overriding my XSL! (Opera handles the XML as intended.) They favor their own display of RSS feeds and bully mine out of the way. (<a href="http://www.markhealey.org/files/ff2_rss.jpg" title="Firefox 2 displays their own RSS feed" rel="lightbox">See theirs</a>. <a href="http://www.markhealey.org/files/op_rss.jpg" title="Opera's display of the XSL - the way it is supposed to be" rel="lightbox">See mine</a>.)</p>
<p>I’m not even going to try to explain why the software makers decided on this, so if you know of a fix, let me know. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Fbrowser-bullies%2F&amp;seed_title=Browser+Bullies+%26%238211%3B+My+XSL+Doesn%26%238217%3Bt+Work/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Unoriginal bbPressure</title>
		<link>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Funoriginal-bbpressure%2F&amp;seed_title=Unoriginal+bbPressure</link>
		<comments>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Funoriginal-bbpressure%2F&amp;seed_title=Unoriginal+bbPressure#comments</comments>
		<pubDate>Tue, 24 Oct 2006 02:18:23 +0000</pubDate>
		<dc:creator>Mark Healey</dc:creator>
				<category><![CDATA[applications]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.markhealey.org/2006/10/23/unoriginal-bbpressure/</guid>
		<description><![CDATA[I read a comment earlier today on a blog that I found to be generally true. Indeed it is difficult to write original content. As time ticks later here on the east coast and my original content engine is in the garage for the night, I wanted to quickly tout a new forum package delivered [...]]]></description>
			<content:encoded><![CDATA[<p>I read a comment earlier today on a blog that I found to be generally true. Indeed it is difficult to write original content.</p>
<p>As time ticks later here on the east coast and my original content engine is in the garage for the night, I wanted to quickly tout a new forum package delivered as my early Christmas present from the folks over at <a href="http://wordpress.org">WordPress</a>. Called <a href="http://bbpress.org"><strong>bbPress</strong></a>, they say it’s “simple, fast, elegant&#8221; &mdash; and from the less-than-3-minutes it took me to install it and give it a quick test drive, the software is certainly all that.  </p>
<p>I’ve got a client that could use something just like this as their <a href="http://phpbb.com">phpBB</a> install is bloated and plagued with SPAM. I’m not going to hold out for bbPress’ coming-soon template system &mdash; I think I’ll dive right in and get customizing.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markhealey.org/feeder/?FeederAction=clicked&amp;feed=Articles+%28RSS2%29&amp;seed=http%3A%2F%2Fwww.markhealey.org%2Farchives%2Funoriginal-bbpressure%2F&amp;seed_title=Unoriginal+bbPressure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
