<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>markupboy</title>
        <link>http://markupboy.com/</link>
        <description><![CDATA[Written and published by Blake Walters &ndash; interactive developer, markup nerd and standardista hailing from a time when the &lt;font&gt; tag was acceptable.]]></description>
        <language>en-us</language>
        <copyright>Copyright 2010</copyright>
        <lastBuildDate>Fri, 05 Mar 2010 10:59:32 -0700</lastBuildDate>
        <generator>http://www.sixapart.com/movabletype/</generator>
        <docs>http://www.rssboard.org/rss-specification</docs>
        
        <item>
            <title>Using Delegate and Undelegate in jQuery 1.4.2</title>
            <description><![CDATA[<p>A handy reference for the new delegate() and undelegate() methods added to jQuery 1.4.2</p>
]]></description>
            <link>
                
		    http://feedproxy.google.com/~r/LearningJquery/~3/aXoZH0PEu8U/using-delegate-and-undelegate-in-jquery-1-4-2
		
            </link>
            <guid>
                
		    http://feedproxy.google.com/~r/LearningJquery/~3/aXoZH0PEu8U/using-delegate-and-undelegate-in-jquery-1-4-2
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">links</category>
            
            
            <pubDate>Fri, 05 Mar 2010 10:59:32 -0700</pubDate>
        </item>
        
        <item>
            <title>Shaun Inman on The Pipeline</title>
            <description><![CDATA[<p><a href="http://www.hivelogic.com">Dan Benjamin</a> has an interview with one of my favorite developer/designers, <a href="http://shauninman.com/pact/">Shaun Inman</a>, on his podcast <a href="http://5by5.tv/pipeline">The Pipeline</a>.</p>
]]></description>
            <link>
                
		    http://5by5.tv/pipeline/5
		
            </link>
            <guid>
                
		    http://5by5.tv/pipeline/5
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">links</category>
            
            
            <pubDate>Tue, 02 Mar 2010 11:12:34 -0700</pubDate>
        </item>
        
        <item>
            <title>Hosting Mail With Google</title>
            <description><![CDATA[<p>I've been using <a href="http://www.mediatemple.net">MediaTemple</a> for hosting all of my domains for a number of years now and while I've been generally satisfied with their Grid Service I've found it a bit lacking lately. I don't have the traffic or any financial need to necessitate spending money on a high availability server but I do completely depend on email for most of my communication so when it's down or can't authenticate I feel almost completely cut off.</p>

<p>With that in mind I started looking for alternate hosting solutions but I couldn't find any that matched MediaTemple's feature set or phenomenal customer service (availability issues aside).  Ultimately, I ended up finding Google apps mail service.  The "Premier" version is essentially an third-party-hosted MS Exchange replacement that seems extremely robust. On digging a bit deeper, though, I found that they offer the <a href="http://www.google.com/apps/intl/en/group/index.html">Google Apps Standard Edition</a> - a feature-lite version offering up mail, calendaring and chat all through your personal domain.</p>

<p>For those unfamiliar with DNS records, set up might not be as easy as signing up for a Gmail account, but other than that mail was flowing only a few minutes after making the switch.</p>

<p>And now I'm happy to report that a week in things are great.  Being able to take advantage of all of gmail's advanced features from my own domains is pretty amazing.   If you're looking for an alternative to you hosting providers email solution or interested in a cheaper alternative to Exchange, Google apps is a great choice.</p>
]]></description>
            <link>
                
		    http://www.google.com/apps/intl/en/group/index.html
		
            </link>
            <guid>
                
		    http://www.google.com/apps/intl/en/group/index.html
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">links</category>
            
            
            <pubDate>Thu, 25 Feb 2010 11:06:50 -0700</pubDate>
        </item>
        
        <item>
            <title>Christopher Bown&apos;s Dual-Drive Setup</title>
            <description><![CDATA[<p>An interesting solve for those of us wanting to make the jump into SSD but have too much data to make the choice cost-effective</p>
]]></description>
            <link>
                
		    http://blog.cbowns.com/2009/09/ssds-and-you-my-dual-drive-setup/
		
            </link>
            <guid>
                
		    http://blog.cbowns.com/2009/09/ssds-and-you-my-dual-drive-setup/
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">links</category>
            
            
            <pubDate>Wed, 24 Feb 2010 09:17:34 -0700</pubDate>
        </item>
        
        <item>
            <title>Minimalist Star Wars Tourism Posters</title>
            <description><![CDATA[<p>Justin Van Genderen's beautifully designed vintage destination posters for locations featured in the <del>not shitty like the other</del> original Star Wars trilogy.</p>]]></description>
            <link>
                
		    http://blogs.laweekly.com/style_council/art/minimalist-star-wars-travel-po/
		
            </link>
            <guid>
                
		    http://blogs.laweekly.com/style_council/art/minimalist-star-wars-travel-po/
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">links</category>
            
            
            <pubDate>Tue, 23 Feb 2010 15:55:11 -0700</pubDate>
        </item>
        
        <item>
            <title>The Seven Deadly Sins of JavaScript Implementation</title>
            <description><![CDATA[<p><a href="http://www.smashingmagazine.com">Smashing Magazine</a> has a great write-up on what not to do when enhancing your sites with JavaScript</p>]]></description>
            <link>
                
		    http://www.smashingmagazine.com/2010/02/22/the-seven-deadly-sins-of-javascript-implementation/
		
            </link>
            <guid>
                
		    http://www.smashingmagazine.com/2010/02/22/the-seven-deadly-sins-of-javascript-implementation/
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">links</category>
            
            
            <pubDate>Mon, 22 Feb 2010 11:40:10 -0700</pubDate>
        </item>
        
        <item>
            <title>thick with witty banter</title>
            <description><![CDATA[<p>My good friend <a href="http://www.twitter.com/ctshryock">Clint</a> posts what can only be considered as the intellectual peak of most of our online conversation</p>]]></description>
            <link>
                
		    http://ctshryock.com/2010/02/geeks-vs-nerds.html
		
            </link>
            <guid>
                
		    http://ctshryock.com/2010/02/geeks-vs-nerds.html
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">links</category>
            
            
            <pubDate>Tue, 16 Feb 2010 11:28:20 -0700</pubDate>
        </item>
        
        <item>
            <title>jQuery 101 - The Slice Method</title>
            <description><![CDATA[ <p>Continuing the 101 series, this we're time hopping over to javascript and a look into part of my favorite library <a href="http://www.jquery.com">jQuery</a>.  More specifically <a href="http://docs.jquery.com/Traversing/slice#startend">slice()</a>.  In a nutshell, we can use slice to manipulate a set of match objects grabbed out of the DOM by the jQuery core method.  </p>

<p>If you're familiar at all with the basic <a href="http://www.w3schools.com/jsref/jsref_slice_array.asp">JavaScript slice() method</a> it's application here is nearly identical.  Slice() takes two arguments: a start value and an option end value.  Just like in slicing in an array, performing a slice() on a jQuery set returns the elements starting at the start position and ending just before the end position.  If no end is given (remember, that one's optional), the returned set starts at 'start' and ends at the end of set.</p>

<p>Now, that might not sound quite so straight forward but let's step back and remember one fundamental aspect of jQuery: a jQuery set is really just an array and the array is ordered in the same order each element is found in the DOM.  Take this list for instance:</p>

<pre><code class="html">&lt;ul class="colors"&gt;
    &lt;li&gt;Red&lt;/li&gt;
    &lt;li&gt;Orange&lt;/li&gt;
    &lt;li&gt;Yellow&lt;/li&gt;
    &lt;li&gt;Green&lt;/li&gt;
    &lt;li&gt;Blue&lt;/li&gt;
    &lt;li&gt;Indigo&lt;/li&gt;
    &lt;li&gt;Violet&lt;/li&gt;
&lt;/ul&gt;
</code></pre>

<p>We can create a set of those list items using:</p>

<pre><code class="js">$('ul.colors');
</code></pre>

<p>Now, that by itself doesn't do anything at all, but we can visualize the set as an array with "Red" at position zero, "Orange" at position one, "Yellow" at position two and so on.  This makes figuring out slice a piece of cake.  Let's see how it might work in practice:</p>

<pre><code class="js">$('ul.colors').slice(2,4).hide();
</code></pre>

<p>Will hide "Yellow" and "Green" (We start at position 2 and end just before position 4). </p>

<p>Another fun trick is using a negative number for the start position.  When a negative number is passed in the slice starts from the <em>end</em> of the array instead of the beginning.  This would mean that</p>

<pre><code class="js">$('ul.colors').slice(-3).hide();</code></pre>

<p>will hide "Blue", "Indigo" and "Violet".  Now obviously these examples aren't exactly real world practice but they help illustrate the point.  Good places to use this is in dealing with paging for circular carousels (a discussion for another day), in page pagination (hiding everything but the first three paragraphs of a post with a "read more" link) and more.</p>

<p>There is even another nice pro-tips about jQuery's slice: it's non-destructive on existing variables:</p>

<pre><code class="js">var colors = $('ul.colors');
colors.slice(1,4).hide();
</code></pre>

<p>If we run console.log(colors), the entire set is still there, "Red" through "Violet".</p>

<p>So there you have it - the jQuery slice() method; another invaluable tool in the front-end developers toolkit.</p>]]></description>
            <link>
                
                    http://markupboy.com/2009/10/the-slice-method.html
		
            </link>
            <guid>
                
                    http://markupboy.com/2009/10/the-slice-method.html
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">articles</category>
            
            
            <pubDate>Tue, 20 Oct 2009 22:19:45 -0700</pubDate>
        </item>
        
        <item>
            <title>A Better Method for Clearing Default Form Input Values</title>
            <description><![CDATA[<p>A while back I wrote a quick post on <a href="http://markupboy.com/2009/03/removing-default-form-input-va.html">how to clear default form values on click</a>. Using jQuery, we leveraged the "defaultValue" variable associated with each input object and on focus simply checked whether the current value equalled the defaultValue.  If it did, we cleared it, easy as that.</p>

<p>Unfortunately, that's not as semantic as it could be (even less so if we're not already using a label). On top of that when the form is submitted we have to check every form element we've handled this way and clear it out if it hasn't been set; if we don't, the default values will end up getting submitted.</p>

<p>Using an alternate method we can get around this altogether:</p>

<p>Start with a basic, completely semantic text-input with a label</p>

<pre><code class="html">&lt;p class="input_group"&gt;
    &lt;label for="find_a_location"&gt;Find a Location&lt;/label&gt;
    &lt;input type="text" name="find_a_location" 
        value="" id="find_a_location"&gt;&lt;/input&gt;
&lt;/p&gt;
</code></pre>

<p>The input is as plain as it gets, with a name and an id.  The label's nothing too special either, just make absolutely sure the 'for' attribute matches the inputs id. The last piece is that I've gone ahead and wrapped the two in another tag and classed it "input_group".  This doesn't have to a paragraph tag (a span or li would work just as well), but know that whatever you use will end up having to act a block level element for the positioning of the label.</p>

<p>
	<img src="http://markupboy.com/demos/betterclearingdefaults/nocss.jpg" alt="No CSS" />
</p>

<p>Next, a dash of CSS to pretty things up a bit.  Start by styling the input itself; not terribly necessary, but certainly makes everything more attractive:</p>

<pre><code class="css">input {
    width: 350px;
    border: 10px solid #e2e1d4;
    font-size: 14px;
    padding: 7px;
    outline: none;
    border-radius: 7px;
    -webkit-border-radius: 7px;
    -moz-border-radius: 7px;
}

input:focus {
    border: 10px solid #9c836e;
}
</code></pre>

<p>Adding the :focus pseudo-class helps to draw a users attention to the active field. </p>

<p>Next we need to set up the input_group so that we can position the label correctly:</p>

<pre><code class="css">p.input_group {
    width: 350px;
    margin: 1em auto;
    position: relative;
}
</code></pre>

<p>And finally, drop the label over the input, giving the appearance that it's actually inside the input:</p>

<pre><code class="css">label {
    font-size: 14px;
    font-family: verdana;
    position: absolute;
    top: 19px;
    left: 19px;
}
</code></pre>

<p>We can even give the label a focus class (that will be triggered by javascript later) to push the illusion even further:</p>

<pre><code class="css">label.focus {
    opacity: 0.2;
    -moz-opacity: 0.2;
    filter:alpha(opacity=20);
}
</code></pre>

<p>
	<img src="http://markupboy.com/demos/betterclearingdefaults/fullcss.jpg" alt="Full CSS" />
</p>

<p>The last piece of the puzzle: the experience layer thanks to JavaScript. </p>

<p>Get started by looping through all the fields we want to set up:</p>

<pre><code class="js">$('p.input_group input').each(function() {
</code></pre>

<p>Set up some variables we'll need for later (mainly storing the label that points to this input):</p>

<pre><code class="js">    var id = $(this).attr('id'),
            $label = $('label[for='+id+']');
</code></pre>

<p>On page load, if there's already a value in the input, hide the label (this fixes an issue if the user hits the back button and the field is already filled):</p>

<pre><code class="js">    if($(this).val() != '') {
        $label.hide();
    }
</code></pre>

<p>When the input is focussed, add a 'focus' class to the label:</p>

<pre><code class="js">    $(this).focus(function() {
        $label.addClass('focus');
    });
</code></pre>

<p>When the input is blurred, remove that 'focus' class</p>

<pre><code class="js">    $(this).blur(function() {
        $label.removeClass('focus');
    });
</code></pre>

<p>When a key that adds to the input's value value (any letter, number or other ascii character) is pressed, hide the label because the user is actively typing in the field.</p>

<pre><code class="js">    $(this).bind('keydown', function(e) {
        if(e.keyCode &gt;= 48 ) {
            $label.hide();
        }   
    });
</code></pre>

<p>When any key is release, check the value; if it's blank, show the label again.  This means when a user delete or backspaces through the field, cut's all the text or does anything to blank it out the label comes back</p>

<pre><code class="js">    $(this).bind('keyup', function() {
        if($(this).val() == '') {
            $label.show();
        }
    });
</code></pre>

<p>And close out the loop</p>

<pre><code class="js">});
</code></pre>

<p>
	<img src="http://markupboy.com/demos/betterclearingdefaults/cssandjs.jpg" alt="No CSS" />
</p>

<p>That's all there is to it. One thing to note, this isn't meant to be a replacement for the original method, merely an alternative.  There are situations where one will definitely be more viable than the other.  Just use whatever works best.</p>

<p><a href="http://markupboy.com/demos/betterclearingdefaults/">Check out the demo here</a></p>]]></description>
            <link>
                
                    http://markupboy.com/2009/10/a-better-method-for-clearing-d.html
		
            </link>
            <guid>
                
                    http://markupboy.com/2009/10/a-better-method-for-clearing-d.html
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">articles</category>
            
            
            <pubDate>Sat, 17 Oct 2009 17:39:28 -0700</pubDate>
        </item>
        
        <item>
            <title>TextMate theme - Handcrafted</title>
            <description><![CDATA[<p><a href="/downloads/Handcrafted.tmTheme.zip"><img alt="handcrafted" src="http://markupboy.com/2009/10/14/handcrafted.png" width="513" height="221" /></a></p>

<p>It's no secret I seriously admire <a href="http://www.simplebits.com">Dan Cederholm</a> and <a href="http://corkd.com">his work</a>.  Needless to say, getting to see him speak at <a href="http://www.aneventapart.com">An Event Apart</a> was a huge moment for me.  To honor this oh so special of occasions I whipped up a TextMate theme based around the color combinations from Dan's presentation. Enjoy:</p>

<p><a href="/downloads/Handcrafted.tmTheme.zip">Download Handcrafted.tmTheme</a></p>]]></description>
            <link>
                
                    http://markupboy.com/2009/10/textmate-theme---handcrafted.html
		
            </link>
            <guid>
                
                    http://markupboy.com/2009/10/textmate-theme---handcrafted.html
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">source</category>
            
            
            <pubDate>Wed, 14 Oct 2009 21:33:34 -0700</pubDate>
        </item>
        
        <item>
            <title>An Event Apart - Chicago</title>
            <description><![CDATA[<p><a href="http://www.aneventapart.com"><img alt="Picture 1.png" src="http://markupboy.com/Picture%201.png" /></a></p><p>

</p><p>For two days in Chicago, I had the privilege to attend An Event Apart - "an intensely educational two-day conference for passionate practitioners of standards-based web design" (from <a href="http://aneventapart.com">http://aneventapart.com</a>).  Divided amongst 12 hour-long sessions, we had the privilege of learning about everything from design to content strategy to in-depth javascript and css techniques from some of the top figures in the industry.</p>

<p>While there's way too much information to go over each bit in detail here, what follows is a notable sound byte from each presenter and an overview of how it fit into their overall presentation:</p>


<h3 id="8220one_of_the_biggest_tragedies_in_design_is_having_a_beautiful_site_that_fails_with_real_content8221">"One of the biggest tragedies in design is having a beautiful site that fails with real content"</h3>


<p><em>A Site Redesign</em> - Jeffery Zeldman, author, Designing With Web Standards, 3rd Ed.</p>

<p>A common problem in our business, having a beautiful design filled with Lorem Ipsum text. We're all capable of generating content; even if it isn't production ready we can make it realistic.  We shouldn't be designing specifically for a specific number of lines of text or a fixed amount of characters.  Designing from realistic content out instead of from visual design in (with content coming later) will allow our sites to be more flexible, easier to maintain and in the end more sustainable.</p>

<h3 id="8220design_systems_not_pages8221">"Design systems, not pages."</h3>


<p><em>Thinking Small</em> - Jason Santa Maria, web designer</p>

<p>To maximize flexibility, we should be designing visual systems instead of specific pages.  Using modular design speeds up the design process, allowing design pieces to be mixed and matched without the need for designing every aspect of every page.  Again, using this approach makes sites more flexible, easier to develop, easier to maintain and even simpler to refresh layouts with little overhead.</p>

<h3 id="8220content_is_not_a_feature8221">"Content is not a feature"</h3>

<p><em>Content First</em> - Kristina Halvorson, author, Content Strategy for the Web</p>

<p>Content shouldn't be an afterthought.  The backbone of information driven sites is the content itself and should be as integral a part of website creation as development or design.  In fact, content can help dictate design patterns, look and feel for specific pages or even the tone of how a page is meant to be presented. All content has to be planned for - headers, body copy, footer text, error messages, titles, descriptions, alt text, metadata, everything.</p>



<h3 id="8220everyone_is_a_ux_designer_whether_it8217s_in_your_title_or_not8221">"Everyone is a UX designer whether it's in your title or not"</h3>

<p><em>DIY UX: Give Your Users an Upgrade (Without Calling in a Pro)</em> - Whitney Hess, Strategic Partner, Happy Cog</p>

<p>Everyone involved in web design and development, whether they are UX people or not, are UX designers.  We all have an influence over how users perceive and use a site from the feelings the visual design conveys to the responsiveness of the front-end implementation.  The best way to find break downs in any of these aspects is to get the site in front of users, to do user testing.  Testing doesn't have to be expensive or complicated, it can be as simple as asking people you know, people you work with (but not on the same project) or people that just happen to be around at any given time to use something and give feedback.  The trick is to make sure they don't feel compelled to say "oh it's good" because being "good" won't make your site any better.  Get users to tear it apart and grow from there</p>



<h3 id="8220static_designs_fail_by_definition8221">"Static designs fail by definition"</h3>

<p><em>Walls Come Tumbling Down</em> - Andy Clarke, author, Transcending CSS</p>

<p>Websites aren't just carbon copies of photoshop comps.  They're living breathing things that act and react to user input.  Why, then, do we continue to get client signoff based on static comps?  Designing in the browser itself with CSS can potentially take the same amount of (if not less) time that putting together a comp in photoshop but in the end you have a living document that's clickable, scrollable and easily adapted to be used in production.  How long would it take to change every single font-face in a comp?  With CSS it takes minutes.</p>


<h3 id="8220over_time_plugins_like_the_flash_player_will_give_way_to_script8221">"Over time, plugins like the Flash player will give way to &lt;script&gt;"</h3>

<p><em>Javascript Will Save Us All</em> - Eric Meyer, author, CSS: The Definitive Guide, 3rd Ed.</p>

<p>The improvement of Javascript engines in just the past few years is astonishing.  Just think of how far we've come from MapQuest to Google and the interface improvements it affords.  At the core of all of these great applications - Facebook, Mint, Google Docs and Maps and More - is just HTML, CSS, and Javascript.  We're currently in a pattern of using JS to bring legacy browser into the present - patching in support for basic features today that just didn't exist when browsers like Internet Explorer 6 debuted.  If we flip our thinking a bit, however, there's no reason that we can't use javascript to push current browsers even further into the future.  </p>

<h3 id="8220it8217s_cheaper_to_build_something_than_to_have_the_meeting_to_discuss_the_thing_you_might_build8221">"It's cheaper to build something than to have the meeting to discuss the thing you might build"</h3>

<p><em>Building Stuff Fast-And Getting It Approved</em> - Simon Willison, Developer, Guardian News and Media</p>

<blockquote>
<p><strong>1 hour kick off meeting, 6 people</strong>
<strong>= 6 man hours</strong></p>

<p><strong>4 hours prototyping, 1 developer</strong>
<strong>= 4 man hours</strong></p>
</blockquote>

<p>Developing web applications isn't difficult.  No really, it isn't.  What's difficult is coming up with an idea, getting everyone on the same page, getting client sign-off, coming up with a core visual identity, going through rounds and rounds of approvals and so on.  Thanks to web development frameworks like dJango, Rails and Symfony all of the repetitiveness of building the core functionality of a web app has been boiled down to a few lines of code and maybe a terminal command or two.  The sooner you get your stuff in front of users, the more apparent it becomes what they <em>actually</em> want and what is <em>actually</em> wrong with what you've done.  Plus, banging out great prototypes is more fun than sitting in meetings anyway.  </p>

<h3 id="8220forms_suck8221">"Forms suck"</h3>

<p><em>Web Form Design in Action</em> - Luke Wroblewski, author, Web Form Design</p>

<p>No one likes filling out forms.  Unfortunately the web runs on them.  We can't have user generated content, content management systems, web applications or any of it without forms.  While they may be the doldrums of user experience, they don't have to be bare and confusing and inelegant. There are a few ways we can go about making form submission as painless as possible and, in turn, reduce fall-off before people click submit:</p>

<ul>
<li>Have a clear path to completion</li>
<li>Align labels consistently (top aligned labels can increase form entry speed by 10x)</li>
<li>Add help and tips to anything unfamiliar or with constraints</li>
<li>Use inline validation to avoid pogo-sticking back and forth between submission and feed back</li>
<li>Separate out visual cues for primary form actions</li>
<li>Organize your forms logically</li>
<li>Gradually engage users - only get the information you actually need to continue up front</li>
</ul>

<h3 id="8220we_are_product_designers8221">"We are product designers"</h3>

<p><em>Designing Virtual Realism</em> - Dan Rubin, co-author, Web Standards Creativity</p>

<p>The unfortunate part of designing for the web is that you can't touch it except through extensions to ourselves (mice, keyboards, etc.) but most principles product design apply to the web.  If you design for intuition, your sites will <em>feel</em> better.  It may not be quantitative, but a site that feels better and looks better will actually have better response from users, even if it isn't any more function than it's competitors (case in point, the original Apple iPod, beautifully simple and simply beautiful).</p>

<h3 id="8220do_websites_need_to_be_experienced_exactly_the_same_in_every_browser_nope8221">"Do websites need to be experienced exactly the same in every browser? Nope"</h3>

<p><em>Progressive Enrichment With CSS3</em> - Dan Cederholm, author, Bulletproof Web Design</p>

<p>CSS3 is a wonderful tool that can't necessarily be used for mission critical implementation but can be used to enrich experiences in browsers that support them. Experience is the layer that lives on top of good markup and style and css3 is the icing on top of that. </p>

<p>All in all it was a fantastic conference and I'll leave it with my favorite thing that was said by Jeffery Zeldman himself:</p>

<blockquote><p><strong>"Real web designers write code. Always have, always will."</strong></p></blockquote>]]></description>
            <link>
                
                    http://markupboy.com/2009/10/an-event-apart---chicago.html
		
            </link>
            <guid>
                
                    http://markupboy.com/2009/10/an-event-apart---chicago.html
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">articles</category>
            
            
            <pubDate>Wed, 14 Oct 2009 15:38:12 -0700</pubDate>
        </item>
        
        <item>
            <title>Newd Now Supports Google&apos;s Proposal for Crawlable AJAX</title>
            <description><![CDATA[

<p>Yesterday morning, <a href="http://googlewebmastercentral.blogspot.com/2009/10/proposal-for-making-ajax-crawlable.html">Google posted a proposal for making AJAX crawlable on it's Webmaster Central Blog</a>.  They posited that using a standardized convention for fragment identifiers to represent AJAX application states, taking snapshots of these states using a headless browser and using an escaped version of the original application state fragments to render these snapshots to crawlers would allow for these applications to be indexable as well as being able to have search engines server back links to the AJAX states themselves.  </p>

<p>With minimal effort, these changes have been rolled into a fork of <a href="http://www.cpbgroup.com">Crispin Porter + Bogusky</a>'s <a href="http://www.github.com/cpbadmin/newd">open source project Newd</a>.</p>

<p>Taking the <a href="http://domscripting.com/blog/display/41">Hijax</a> approach to web application development, Newd was engineered specifically to be entirely browsable without javascript.  Each state in the app was built based on a rendered static page and then rolled into the main application using <a href="http://www.jquery.com">jQuery</a> and a custom framework written around the modular approach to Newd's data feeds.  For instance:</p>

<pre><code>http://newd-example-domain/#topic
</code></pre>

<p>is simply a deep link, wired up with javascript, that allows the application to render the content at</p>

<pre><code>http://newd-example-domain/topics/topic
</code></pre>

<p>without refreshing or redirecting the user to a new location.  This allows all of your AJAX states to have static, crawlable equivalents.  </p>

<p>The downfall here is that when Google indexes "/topics/topic", that's the link it serves back to users in it's search results.  To subvert this, Newd has a simple javascript detection on pages rendered through "/topics/topic" - if JS is enabled, the user is redirected back to the AJAX app front-end at "/#topic".</p>

<p>Now, however, that redirection is unnecessary thanks to Google's proposed method. Updating the fragment identifiers is simple, all we need to do is at that extra bang to what is already being rendered ("#!topic" instead of "#topic"), making sure that anything parsing this new hash understands and appropriately ignores the exclamation point.</p>

<p>Up next, our static href's in the main navigation links can finally point to the AJAX state instead of having to be set to the static page.  </p>

<pre><code>&lt;a href="/topics/topic"&gt;Topic&lt;/a&gt;
</code></pre>

<p>becomes</p>

<pre><code>&lt;a href="#!topic"&gt;topic&lt;/a&gt;
</code></pre>

<p>Originally, when clicked these links would be parsed by javascript, the hash updated programatically and  the default behavior of following the link was prevented.</p>

<p>Finally, Newd needed a way to render the correct topic when presented with the escaped state in the query string (represented by Google's proposed "http://example.com/page?query&amp;<em>escaped</em>fragment_=state").  Being built on CakePHP using the Hijax approach, all static paths were set during the initial implementation which means Newd doesn't require a headless GUI for rendering HTML snapshots of all of its states. Instead, a render time it only needs to be made aware of any escaped states being passed through the url:</p>

<pre><code>if(isset($_GET['_escaped_fragment_'])) {
    $this-&gt;params['topic'] = $_GET['_escaped_fragment_'];
}
</code></pre>

<p>If the escaped state is passed in the query string, Newd's front_crontoller index method renders the data for the accompanying state for indexing.  This rendered page contains our original AJAX state fragments as links, which in turn will get served back through search engine results once crawled.</p>

<p>And that's it.  Bringing Newd up to meet this proposed standard took only a few hours thanks primarily it being based on the Hijax approach for AJAX applications. If this new proposal does indeed get adopted it means users will finally have direct access to AJAX content via search results, which is a very exciting prospect.</p>

<p><a href="http://github.com/markupboy/newd">Browse or download the Newd source updated to this proposed standard at it's page on GitHub</a></p>]]></description>
            <link>
                
                    http://markupboy.com/2009/10/newd-now-supports-googles-prop.html
		
            </link>
            <guid>
                
                    http://markupboy.com/2009/10/newd-now-supports-googles-prop.html
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">articles</category>
            
            
            <pubDate>Thu, 08 Oct 2009 10:14:06 -0700</pubDate>
        </item>
        
        <item>
            <title>Git quicky - locally ignore files</title>
            <description><![CDATA[<p>Ever needed to modify a file locally but wanted to make sure it doesn't get committed and pushed back in to the stream? Well, if you're using Git, it's as easy as:</p>

<code>$ git update-index --assume-unchanged path/to/file.txt</code>

<p>Extremely helpful if you've got password changes in config files that you don't want committed</p>]]></description>
            <link>
                
                    http://markupboy.com/2009/09/git-quicky---locally-ignore-fi.html
		
            </link>
            <guid>
                
                    http://markupboy.com/2009/09/git-quicky---locally-ignore-fi.html
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">articles</category>
            
            
            <pubDate>Mon, 28 Sep 2009 11:53:21 -0700</pubDate>
        </item>
        
        <item>
            <title>CSS 101 - Text-Image Replacement</title>
            <description><![CDATA[<p>With the hope that it'll encourage me to post more often, I'm kicking off my first "column" here on <a href="http://www.markupboy.com">markupboy</a> - the 101 series.  Each post in the 101 series aims to be a small, easily digestible chunk of information and some sample code illustrating a basic technique or a solution to an every day problem. Enjoy!</p>

<p>For the first post, we'll take a look at a basic CSS technique that I can't seem to go a day without using: text-image replacement.  </p>

<p>The basic idea here is to take a block of web-safe text (be it a span, a paragraph, a header, a link or really anything) and replace it with an image representing that same text.  Now there are a number of reasons we might do this but most likely it's because we'd like to utilize a font that isn't web-safe.</p>

<p>Let's start with a pretty much standard use - a header:</p>

<pre><code class="html">&lt;h1&gt;Markupboy&lt;/h1&gt;
</code></pre>

<p>with a custom font or graphic:</p>

<p><img src="/images/bkg.h1.png" alt="Sample Header" title="" /></p>

<p>We'll start with a basic css selector just to get things rolling:</p>

<pre><code class="css">h1 { }
</code></pre>

<p>Next, we'll give the header the appropriate background image as well as a height and width to match:</p>

<pre><code class="css">h1 {
    background: url(/images/bkg.h1.png) left top no-repeat;
    height: 80px;
    width: 240px;
}
</code></pre>

<h1 style="background: url(/images/bkg.h1.png) left top no-repeat; height: 80px; width: 240px; text-indent: 0; overflow: visible;">
    Markupboy
</h1>

<p>As you can see, the image is there with the appropriate dimensions, but our text is still visible.  Here's where the real trick is, first set the 'overflow' property to hidden</p>

<pre><code class="css">h1 {
    background: url(/images/bkg.h1.png) left top no-repeat;
    height: 80px;
    width: 240px;
    overflow: hidden;
}
</code></pre>

<p>and then set 'text-indent' to '-9999px' (or any suitably large negative or positive number)</p>

<pre><code class="css">h1 {
    background: url(/images/bkg.h1.png) left top no-repeat;
    height: 80px;
    width: 240px;
    overflow: hidden;
    text-indent: -9999px;
}
</code></pre>

<h1 style="background: url(/images/bkg.h1.png) left top no-repeat; height: 80px; width: 240px; overflow: hidden; text-indent: -9999px">
    Markupboy
</h1>

<p>Setting the 'overflow' property to hidden on a block level element makes any child element (including text nodes) that falls outside of the rendering bounds of that parent element to be hidden.  Then, with 'text-indent', we're forcing the child text node to render as far outside the parent element as possible and there you have it.  We don't need any extra markup in this case and we don't have to resort to 'display: none' as that would cause accessibility issue with screen readers not even being able to access that text.  </p>

<p>To take it one step further and make our header a clickable link, we just need to modify the markup a bit</p>

<pre><code class="html">&lt;h1&gt;
    &lt;a href="http://www.markupboy.com"&gt;Markupboy&lt;/a&gt;
&lt;/h1&gt;
</code></pre>

<p>and adjust the css slightly</p>

<pre><code class="css">h1 a {
    background: url(/images/bkg.h1.png) left top no-repeat;
    height: 80px;
    width: 240px;
    display: block;
    overflow: hidden;
    text-indent: -9999px;
}
</code></pre>

<p>and now we've got a fully text replaced link in all it's clickable glory.  </p>

<h1>
    <a href="http://www.markupboy.com" style="background: url(/images/bkg.h1.png) left top no-repeat; height: 80px; width: 240px; display: block; overflow: hidden; text-indent: -9999px; float: none;">Markupboy</a>
</h1>

<p>The main difference you'll see here is the addition of 'display: block' to our CSS.  This is necessary simply because anchors are inline elements, which means height, width and text-indent will have no effect on them.</p>

<p>One thing to note, this example does only work for block-level elements so be careful in how you use it.  I'll be going over inline text-image replacement in the near future. </p>

<p>Well, that's it for the first entry in the 101 series.  If you have any questions, comments, or suggestions, feel free to drop me a line at blake[at]markupboy[dot]com.</p>]]></description>
            <link>
                
                    http://markupboy.com/2009/09/text-image-replacement.html
		
            </link>
            <guid>
                
                    http://markupboy.com/2009/09/text-image-replacement.html
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">articles</category>
            
            
            <pubDate>Mon, 21 Sep 2009 21:33:47 -0700</pubDate>
        </item>
        
        <item>
            <title>(Almost) never add a reset button to a form</title>
            <description>456bereastreet on the now seldom used, and hopefully shortly banished, practice of adding &apos;reset&apos; buttons to web forms.</description>
            <link>
                
		    http://www.456bereastreet.com/archive/200909/almost_never_add_a_reset_button_to_a_form/
		
            </link>
            <guid>
                
		    http://www.456bereastreet.com/archive/200909/almost_never_add_a_reset_button_to_a_form/
		
</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">links</category>
            
            
            <pubDate>Thu, 03 Sep 2009 08:35:45 -0700</pubDate>
        </item>
        
    </channel>
</rss>
