<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Paul Armstrong Designs Entries</title><link>http://paularmstrongdesigns.com/</link><description>Recent Entries from Paul Armstrong Designs</description><language>en-us</language><copyright>Copyright 2009 Paul Armstrong Designs</copyright><generator>Awesome</generator><ttl>30</ttl><geo:lat>44.934915</geo:lat><geo:long>-93.254248</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><meta xmlns="http://pipes.yahoo.com" name="pipes" content="noprocess" /><image><link>http://paularmstrongdesigns.com</link><url>http://paularmstrongdesigns.com/images/logo-rss.png</url><title>Paul Armstrong Designs</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/paularmstrongdesigns" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>New Watermelon Sauce Identity &amp;amp; Site</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/new-watermelon-sauce-identity/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;&lt;a href="http://www.watermelonsauce.com"&gt;Watermelon Sauce&lt;/a&gt; is a collaboration of two experienced professionals, myself and &lt;a href="http://www.zachstronaut.com"&gt;Zachary Johnson&lt;/a&gt;. We spent almost 2 years on our original identity, but always felt like we needed something that more fit both Watermelon &lt;em&gt;and&lt;/em&gt; Sauce. With that, we have our new logo and new &lt;a href="http://www.watermelonsauce.com"&gt;Watermelon Sauce website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.watermelonsauce.com"&gt;&lt;img src="http://paularmstrongdesigns.com/images/blog/watermelon-sauce-before-after.jpg" alt="Old and New Watermelon Sauce Logos" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The new site also features a single-page design powered by deep-linkable JavaScript. This isn't your mom's old 1999 Flash website, folks. This is a state-of-the-art HTML, CSS, and JavaScript machine.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/zQEwNq1VOQw" height="1" width="1"/&gt;</description><pubDate>Mon, 14 Sep 2009 14:18:07 -0500</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/new-watermelon-sauce-identity/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/zQEwNq1VOQw/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/new-watermelon-sauce-identity/</feedburner:origLink></item><item><title>Watermelon Sauce</title><guid isPermaLink="false">http://paularmstrongdesigns.com/projects/watermelon-sauce/</guid><author>donotreply@paularmstrongdesigns.com (Paul Armstrong)</author><description>&lt;a href="http://paularmstrongdesigns.com/projects/watermelon-sauce"&lt;img src="/images/projects/watermelonsauce-thumb.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Branding, Identity and Website design for a partner company.&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/3iXOKqGwd5Q" height="1" width="1"/&gt;</description><pubDate>Mon, 14 Sep 2009 00:14:24 -0500</pubDate><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/3iXOKqGwd5Q/</link><feedburner:origLink>http://paularmstrongdesigns.com/projects/watermelon-sauce/</feedburner:origLink></item><item><title>Timelapse Design of Paulasaurus Rex</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/timelapse-design-of-paulasaurus-rex/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;My personal blog was left dormant for almost 3 years, so I decided it was time to redesign and reinvent it a bit. I set up an Automator script on my computer and had it take a screenshot every 10 seconds while I worked, in 60 minute intervals.&lt;/p&gt;

&lt;object width="620" height="372"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2mSnyutHlls&amp;hl=en&amp;fs=1&amp;rel=0&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/2mSnyutHlls&amp;hl=en&amp;fs=1&amp;rel=0&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="620" height="372"&gt;&lt;/embed&gt;&lt;/object&gt;

&lt;p&gt;I also made this my first personal site that was fully built in CakePHP, so I'm pretty excited about having it a lot easier to manage the entire site from a single administration system. Hopefully I'll be transitioning this site over some time soon&amp;hellip;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A word of warning:&lt;/strong&gt; On &lt;a href="http://paulasaur.us"&gt;Paulasaurus Rex&lt;/a&gt;, I mostly post crazy doodles and fictional stories based on real events. Please be warned that the site&amp;rsquo;s content may be to the extreme at times and does not necessarily reflect any of my personal or professional opinions.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/NUVavzjZ2IA" height="1" width="1"/&gt;</description><pubDate>Mon, 17 Aug 2009 03:31:40 -0500</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/timelapse-design-of-paulasaurus-rex/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/NUVavzjZ2IA/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/timelapse-design-of-paulasaurus-rex/</feedburner:origLink></item><item><title>Quick Helper Code Snippets</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/quick-helper-code-snippets/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;Chris Coiyer over at &lt;a href="http://css-tricks.com"&gt;CSS-Tricks&lt;/a&gt; put out a call for helpful snippets just a few days ago. I submitted a few to him and realized that I never really get around to posting them here. What a jerk I am for not sharing! How about some love? Sure thing&amp;hellip;&lt;/p&gt;


&lt;h2&gt;CSS Clear Fix&lt;/h2&gt;

&lt;p&gt;I really hate using extraneous markup like &lt;code&gt;&amp;lt;div class="clear"&amp;gt;&amp;lt;&amp;gt;&lt;/code&gt; to clear floats. So how about a class you could apply to the parent element of floated elements to force it to self-clear the floats?&lt;/p&gt;

&lt;pre class="sh_css"&gt;&lt;code&gt;.clearafter {
    height: 1%;
}
    .clearafter:after {
        content: '.';
        display: block;
        clear: both;
        height: 0;
        width: 0;
        overflow: hidden;
        visibility: hidden;
    }&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jeff Starr &lt;a href="http://perishablepress.com/press/2008/02/05/lessons-learned-concerning-the-clearfix-css-hack/"&gt;explains another way&lt;/a&gt; of accomplishing the same task. This was also posted to CSS-Tricks under &amp;ldquo;&lt;a href="http://css-tricks.com/snippets/css/clear-fix/"&gt;CSS Clear Fix&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;

&lt;h2&gt;Automatically Append a Class to File Downloads&lt;/h2&gt;

&lt;p&gt;Visual cues for file downloads are helpful for your site&amp;rsquo;s visitors to quickly recognize files they can download and what format they&amp;rsquo;re in.&lt;/p&gt;

&lt;p&gt;Assume we have the following image with three file-type icons for Word documents, Excel spreadsheets, and PDF documents. Using CSS, we can target class names on an element to apply the correct piece of a single sprite to the element. If you&amp;rsquo;re unfamiliar with this concept, &lt;a href="#"&gt;read up on using sprites&lt;/a&gt; before moving on.&lt;br /&gt; Here&amp;rsquo;s our image: &lt;img style="display: inline; border: 0;" src="http://paularmstrongdesigns.com/images/blog/icon-sprites.gif" alt="doc, xls, pdf icons" /&gt;&lt;/p&gt;

&lt;pre class="sh_css"&gt;&lt;code&gt;.file {
    padding-left: 16px;
    background: url(images/icon-sprites.gif) 0 0 no-repeat;
}
    .file.doc { background-position: 0 0; }
    .file.xls { background-position: 0 -16px; }
    .file.pdf { background-position: 0 -32px; }&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This works well, but how about automating adding these classes? Easy. Assuming you&amp;rsquo;re using jQuery, just add this snippet after you&amp;rsquo;re DOM is ready:&lt;/p&gt;

&lt;pre class="sh_javascript"&gt;&lt;code&gt;$('a[href]').each(function() {
   if((C = $(this).attr('href').match(/[.](doc|xls|pdf)$/))) {
       $(this).addClass('file').addClass(C[1]);
   }
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This was also posted to CSS-Tricks as &amp;ldquo;&lt;a href="http://css-tricks.com/snippets/jquery/automatically-discover-document-links-and-apply-class/"&gt;Use jQuery to auto discover links to files and apply a class&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;

&lt;h2&gt;Automatically Force New Windows on External Sites&lt;/h2&gt;

&lt;p&gt;Since the &lt;code&gt;target&lt;/code&gt; attribute for links has been deprecated, I wanted a new and unobtrusive way to force links to different sites to open in a new window. This quick jQuery snippet will do just that.&lt;/p&gt;

&lt;pre class="sh_javascript"&gt;&lt;code&gt;$('a').each(function() {
   var a = new RegExp('/' + window.location.host + '/');
   if(!a.test(this.href)) {
       $(this).click(function(event) {
           event.preventDefault();
           event.stopPropagation();
           window.open(this.href, '_blank');
       });
   }
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This was also posted to CSS-Tricks as &amp;ldquo;&lt;a href="http://css-tricks.com/snippets/jquery/open-external-links-in-new-window/"&gt;Use jQuery to automatically open links to different sites in a new window&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;

&lt;h2&gt;Prevent Superscripts and Subscripts From Affecting Line-Heights&lt;/h2&gt;

&lt;p&gt;Superscript (&lt;code&gt;&amp;lt;sup&amp;gt;&lt;/code&gt;) and Subscript (&lt;code&gt;&amp;lt;sub&amp;gt;&lt;/code&gt;) elements break line heights in HTML because of their &lt;code&gt;vertical-align&lt;/code&gt; properties. This quick CSS snippet will fix that for you. For more information, please read my &lt;a href="http://paularmstrongdesigns.com/weblog/stop-superscripts-from-breaking-line-heights-once-and-for-all"&gt;original post&lt;/a&gt;.&lt;/p&gt;

&lt;pre class="sh_css"&gt;&lt;code&gt;sup, sub {
   vertical-align: baseline;
   position: relative;
   top: -0.4em;
}
sub { top: 0.4em; }&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This was also posted to CSS-Trkcs as &amp;ldquo;&lt;a href="http://css-tricks.com/snippets/css/prevent-superscripts-and-subscripts-from-affecting-line-height/"&gt;Prevent superscripts and line-heights from affecting line-heights&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/mXarMnyCkCs" height="1" width="1"/&gt;</description><pubDate>Wed, 12 Aug 2009 15:58:53 -0500</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/quick-helper-code-snippets/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/mXarMnyCkCs/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/quick-helper-code-snippets/</feedburner:origLink></item><item><title>Thanks for the Birthday Tweets!</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/thanks-for-the-birthday-tweets-/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;So, I realized that today is my birthday. I&amp;rsquo;m not normally one to share personal stuff, but maybe it&amp;rsquo;s time to switch things up a bit. So, I posted this to twitter to see the reactions:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It&amp;rsquo;s my birthday, I guess. &lt;cite&gt;&amp;mdash;&lt;a href="http://twitter.com/paularmstrong/status/2739890382"&gt;@paularmstrong&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Some awesome people responded. I highly recommend that you all check them out, because they&amp;rsquo;re awesome.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Happy birthday then. &lt;cite&gt;&amp;mdash;&lt;a href="http://twitter.com/skwiot/status/2739954835"&gt;@skwiot&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;p&gt;Happy Birthday! &lt;cite&gt;&amp;mdash;&lt;a href="http://twitter.com/hekainteractive/status/2740114594"&gt;@hekainteractive&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;p&gt;Happy birthday, man! &lt;cite&gt;&amp;mdash;&lt;a href="http://twitter.com/ShawnJGoff/status/2740129428"&gt;@ShawnJGoff&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;p&gt;happy birthday to you, happy birthday to you... happy birthday dear paul armstronggggg happy birthday to youuuuu!!!!!!!!! :D &lt;cite&gt;&amp;mdash;&lt;a href="http://twitter.com/creativestable/status/2740249455"&gt;@creativestable&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I&amp;rsquo;d just like to note that &lt;a href="http://twitter.com/creativestable"&gt;creativestable&lt;/a&gt; is now my favorite person, just because she sang a tweet to me.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Well then, happy birthday, I guess &lt;cite&gt;&amp;mdash;&lt;a href="http://twitter.com/pennig/status/2740431305"&gt;@pennig&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;p&gt;Happy Birfday. &lt;cite&gt;&amp;mdash;&lt;a href="http://twitter.com/zacharyjohnson/status/2740592197"&gt;@zacharyjohnson&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;p&gt;Happy birthday! Gonna have a party? &lt;cite&gt;&amp;mdash;&lt;a href="http://twitter.com/whitewaffle/status/2741213551"&gt;@whitewaffle&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;p&gt;Happy birthday man. Have a good one! &lt;cite&gt;&amp;mdash;&lt;a href="http://twitter.com/tomstanoch/status/2741422546"&gt;@tomstanoch&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;p&gt;god we&amp;rsquo;re old. &lt;cite&gt;&amp;mdash;&lt;a href="http://twitter.com/chrisrandel/status/2741578063"&gt;@chrisrandel&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;p&gt;happy birthday! Argh! If I would have known I would have gotten you a cake while you were here! &lt;cite&gt;&amp;mdash;&lt;a href="http://twitter.com/jmullan/status/2742038665"&gt;@jmullan&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I spent this past weekend in San Francisco with Jesse (@jmullan) and Matt (@pennig) and it was a blast&amp;mdash;a great way to kick off birthday week.&lt;/p&gt;

&lt;p&gt;In other news, I&amp;rsquo;ve got some more projects and updates in the works for your enjoyment, so check back soon!&amp;rsquo;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/o2S86ajRj9I" height="1" width="1"/&gt;</description><pubDate>Mon, 20 Jul 2009 19:28:02 -0500</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/thanks-for-the-birthday-tweets-/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/o2S86ajRj9I/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/thanks-for-the-birthday-tweets-/</feedburner:origLink></item><item><title>Your Address and Required Fields in Web Forms</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/your-address-and-required-fields-in-web-forms/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;It&amp;rsquo;s pretty uncommon for any site not to have some sort of contact form these days. But lately, I&amp;rsquo;ve been noticing more and more sites (and clients) having fields for address, city, state, postal code, etc. The curious part is that most of the time, they aren't required&amp;mdash;or maybe the more disturbing part is that they &lt;em&gt;are&lt;/em&gt; required.&lt;/p&gt;

&lt;p&gt;So let&amp;rsquo;s take a poll. The spreadsheet of results will be cleaned of addresses and published in the near future for everyone to see.&lt;/p&gt;

&lt;iframe src="http://spreadsheets.google.com/embeddedform?key=t2l0r1Mb2Y9ZvSpjOS3T3hw" width="500" height="1300" frameborder="0" marginheight="0" marginwidth="0"&gt;Loading...&lt;/iframe&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/lUrICBGG-xY" height="1" width="1"/&gt;</description><pubDate>Fri, 17 Jul 2009 14:54:47 -0500</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/your-address-and-required-fields-in-web-forms/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/lUrICBGG-xY/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/your-address-and-required-fields-in-web-forms/</feedburner:origLink></item><item><title>Recap: The Together Show @ Umber Studios</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/recap-the-together-show-umber-studios/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;Recently, I mentioned that I would have some art up at "&lt;a href="http://paularmstrongdesigns.com/weblog/the-together-show-at-umberstudios"&gt;The Together Show at Umber Studios&lt;/a&gt;". I figured that it my duty to update you all on the happenings. This reception was held on June 20&lt;sup&gt;th&lt;/sup&gt;, 2009 and will run through July 12&lt;sup&gt;th&lt;/sup&gt;, so stop by if you&amp;rsquo;re in Minneapolis! How about some sights from the show?&lt;/p&gt;

&lt;p&gt;Okay, here goes&amp;hellip;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://paularmstrongdesigns.com/images/blog/together-2.jpg" alt="The front doors of Umber Studios" /&gt; The front door of Umber is always welcome.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://paularmstrongdesigns.com/images/blog/together-3.jpg" alt="Doodles" /&gt; This is some of my work. A series of doodles in the middle running vertically.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://paularmstrongdesigns.com/images/blog/together-1.jpg" alt="Paul Armstrong in front of doodles" /&gt; Yes, sometimes I am an art nerd.&lt;/p&gt;

&lt;p&gt;This was yet another great opening put on by &lt;a href="http://www.umberstudios.com"&gt;Umber Studios&lt;/a&gt;. If you&amp;rsquo;re in Minneapolis and like art, you best stop by!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/uGSFrzBJ3kg" height="1" width="1"/&gt;</description><pubDate>Wed, 01 Jul 2009 01:04:07 -0500</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/recap-the-together-show-umber-studios/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/uGSFrzBJ3kg/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/recap-the-together-show-umber-studios/</feedburner:origLink></item><item><title>WebSlide — Slideshows for Designers and Clients Alike</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/webslide-slideshows-for-designers-and-clients-alike/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;I&amp;rsquo;ve always found that sending creative mockups for web sites and slideshows to clients is a huge pain. Most people settle for bundling up a PDF and emailing it over to their client. This is absolutely not an acceptable practice. Instead, I&amp;rsquo;d like to propose a solution: &lt;a href="http://paularmstrongdesigns.com/projects/webslide/"&gt;WebSlide&lt;/a&gt;.&lt;/p&gt;
   
&lt;h2&gt;The Problem&lt;/h2&gt; 

&lt;p&gt;PDFs of design mockups are often poorly scaled, pixelated, and create more confusion than they&amp;rsquo;re worth (unless we&amp;rsquo;re talking about logo &amp;amp; print design). Often times, designers will even include an image of a browser wrapped around their mockups.&lt;/p&gt;

&lt;p&gt;What? &lt;em&gt;Seriously?&lt;/em&gt; &lt;strong&gt;Stop it!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And what about sending an email with images as an attachment? Again, this isn&amp;rsquo;t showing designs for a web site in its natural environment. Why can&amp;rsquo;t we just show our clients how it will look &lt;em&gt;in their own browser&lt;/em&gt;?&lt;/p&gt;

&lt;h2&gt;The Solution&lt;/h2&gt;

&lt;p&gt;Why not have an environment that can display your mockups from within the actual intended medium?&lt;/p&gt;

&lt;p&gt;Enter WebSlide, a jQuery-based, user-configurable, and user-themeable application that has no server requirements (other than it being a web server, of course).&lt;/p&gt;

&lt;p&gt;&lt;a class="bigLink" href="/projects/webslide/demo/"&gt;View the WebSlide Demo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Features&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Display images as slides in your browser&lt;/li&gt;
    &lt;li&gt;No server-side requirements&lt;/li&gt;
    &lt;li&gt;User-configurable&lt;/li&gt;
    &lt;li&gt;Create custom themes with &lt;acronym title="Cascading Style Sheets"&gt;CSS&lt;/acronym&gt;&lt;/li&gt;
    &lt;li&gt;Keyboard navigation&lt;/li&gt;
    &lt;li&gt;Zoom images in &amp;amp; out&lt;/li&gt;
    &lt;li&gt;Optional password protection&lt;/li&gt;
    &lt;li&gt;And more!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Okay, now that you definitely want it, hop over to the &lt;a href="/projects/webslide/"&gt;WebSlide project page&lt;/a&gt; and download WebSlide!&lt;/p&gt;

&lt;p&gt;&lt;a class="bigLink" href="/projects/webslide/"&gt;Download WebSlide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="bigLink" href="/projects/webslide/docs/"&gt;View the Documentation&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/u8VeZ2xMzFM" height="1" width="1"/&gt;</description><pubDate>Thu, 25 Jun 2009 12:31:14 -0500</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/webslide-slideshows-for-designers-and-clients-alike/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/u8VeZ2xMzFM/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/webslide-slideshows-for-designers-and-clients-alike/</feedburner:origLink></item><item><title>WebSlide</title><guid isPermaLink="false">http://paularmstrongdesigns.com/projects/webslide/</guid><author>donotreply@paularmstrongdesigns.com (Paul Armstrong)</author><description>&lt;a href="http://paularmstrongdesigns.com/projects/webslide"&lt;img src="/images/projects/slideshow-thumb.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;An in-browser JavaScript slideshow application for viewing site design mockups and photos.&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/dbNKN0qFLe4" height="1" width="1"/&gt;</description><pubDate>Thu, 25 Jun 2009 00:15:11 -0500</pubDate><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/dbNKN0qFLe4/</link><feedburner:origLink>http://paularmstrongdesigns.com/projects/webslide/</feedburner:origLink></item><item><title>The Together Show @ Umber Studios</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/the-together-show-umber-studios/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;Hey! This weekend is Umber Studios' 2&lt;sup&gt;nd&lt;/sup&gt; birthday. I'll have a few pieces up as well as many other talented artists and great friends. Stop by, say hi, enjoy great art and great people.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.umberstudios.com"&gt;&lt;img src="/images/blog/umber-birthday.jpg" alt="Together: UmberStudios; June 20th, 2009" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote cite="Umber Studios"&gt;&lt;p&gt;for the second anniversary of umber studios, the TOGETHER show celebrates two years of brilliant umber artists. every artist who has shown at umber returns to the space to show new work and celebrate the gallery they helped to create. to all who have made the gallery what it is today... &lt;/p&gt;&lt;/blockquote&gt;

&lt;dl&gt;
&lt;dt&gt;What&lt;/dt&gt;
&lt;dd&gt;The Together Show&lt;/dd&gt;
&lt;dt&gt;When&lt;/dt&gt;
&lt;dd&gt;8pm Saturday, June 20th, 2009&lt;/dd&gt;
&lt;dd&gt;(June 20th - July 12th)&lt;/dd&gt;
&lt;dt&gt;Where&lt;/dt&gt;
&lt;dd&gt;&lt;a href="http://www.umberstudios.com"&gt;Umber Studios&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=3109+E+42nd+St,+Minneapolis,+MN+55406&amp;sll=44.9501,-93.252811&amp;sspn=0.084313,0.15501&amp;ie=UTF8&amp;z=16&amp;msa=0&amp;msid=105370064318210314713.000467142714e5764b64a"&gt;3109 East 42nd St, Minneapolis, MN 55407&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;h2&gt;Artists in Show&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Aaron Bickner&lt;/li&gt;
&lt;li&gt;Allen Brewer&lt;/li&gt;
&lt;li&gt;Amy Aaron&lt;/li&gt;
&lt;li&gt;Andy Ducett&lt;/li&gt;
&lt;li&gt;Ben Garthus&lt;/li&gt;
&lt;li&gt;Dc Ice&lt;/li&gt;
&lt;li&gt;Doug Beasley&lt;/li&gt;
&lt;li&gt;Jake Keeler&lt;/li&gt;
&lt;li&gt;Janell Vircks&lt;/li&gt;
&lt;li&gt;J.a. Olson&lt;/li&gt;
&lt;li&gt;Jessica Helvey&lt;/li&gt;
&lt;li&gt;Jesse Mullan&lt;/li&gt;
&lt;li&gt;Joshua Norton&lt;/li&gt;
&lt;li&gt;Juri Loginov&lt;/li&gt;
&lt;li&gt;Keegan Wenkman&lt;/li&gt;
&lt;li&gt;Laura Hallen&lt;/li&gt;
&lt;li&gt;Marq Spusta&lt;/li&gt;
&lt;li&gt;Michael Joseph Winslow&lt;/li&gt;
&lt;li&gt;Noah Norton&lt;/li&gt;
&lt;li&gt;Pamela Valfer&lt;/li&gt;
&lt;li&gt;Paul Armstrong&lt;/li&gt;
&lt;li&gt;Peter Skwiot Smith&lt;/li&gt;
&lt;li&gt;Phil Behrend&lt;/li&gt;
&lt;li&gt;Rebecca Sullivan&lt;/li&gt;
&lt;li&gt;Roger Barrett&lt;/li&gt;
&lt;li&gt;Ruben Nusz&lt;/li&gt;
&lt;li&gt;Russell Joslin&lt;/li&gt;
&lt;li&gt;Sarah Christianson&lt;/li&gt;
&lt;li&gt;Steve Krause&lt;/li&gt;
&lt;li&gt;Steven Anthony&lt;/li&gt;
&lt;li&gt;Terrence Payne&lt;/li&gt;
&lt;li&gt;Tim Dieterle&lt;/li&gt;
&lt;li&gt;Todd Bratrud&lt;/li&gt;
&lt;li&gt;Torey Bonar&lt;/li&gt;
&lt;li&gt;Tucker Gerrick&lt;/li&gt;
&lt;li&gt;Zachary Johnson&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/3gpOLwfIMbI" height="1" width="1"/&gt;</description><pubDate>Wed, 17 Jun 2009 14:55:22 -0500</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/the-together-show-umber-studios/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/3gpOLwfIMbI/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/the-together-show-umber-studios/</feedburner:origLink></item><item><title>Presentation: It's the Little Things</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/presentation-it-s-the-little-things/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;This morning's presentation was a success. I had a great time presenting and am now enjoying the rest of the presentations throughout the day. As I promised, I've put &lt;a href="http://www.slideshare.net/paularmstrong/its-the-little-things-1255078?type=presentation" title="It's the Little Things on Slideshare"&gt;my slideshow up on Slideshare&lt;/a&gt; for everyone to view. Notes and links are available on the &lt;a href="http://www.slideshare.net/paularmstrong/its-the-little-things-1255078?type=presentation" title="It's the Little Things on Slideshare"&gt;Slideshare site&lt;/a&gt;.&lt;/p&gt;

&lt;object style="margin:0px" width="620" height="522"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=master-090406112200-phpapp02&amp;rel=0&amp;stripped_title=its-the-little-things-1255078" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=master-090406112200-phpapp02&amp;rel=0&amp;stripped_title=its-the-little-things-1255078" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="620" height="522"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;

&lt;p&gt;More to come later. Good luck to the rest of the presenters!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/ASo92w8OjzQ" height="1" width="1"/&gt;</description><pubDate>Mon, 06 Apr 2009 11:44:20 -0500</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/presentation-it-s-the-little-things/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/ASo92w8OjzQ/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/presentation-it-s-the-little-things/</feedburner:origLink></item><item><title>Meet Me at MinneWebCon '09</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/meet-me-at-minnewebcon-09/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;&lt;a style="padding: 0; float: right; width: 260px; margin: 0 0 20px 20px;" href="http://minnewebcon.umn.edu" title="MinneWebCon - April 6th, 2009, University of Minnesota"&gt;&lt;img src="/images/blog/minnewebcon.gif" alt="MinneWebCon - April 6th, 2009, University of Minnesota" /&gt;&lt;/a&gt; I&amp;rsquo;ll be speaking at the second &lt;a href="http://minnewebcon.umn.edu"&gt;MinneWebCon&lt;/a&gt; at the University of Minnesota next Monday, April 6th, 2009. There's a great lineup of speakers focusing on a range of topics, from user experience design, to social media privacy, to site security and hacker tricks. I &lt;a href="http://paularmstrongdesigns.com/weblog/afterthoughts-from-minnewebcon-08"&gt;attended MinneWebCon &amp;rsquo;08&lt;/a&gt; and had a blast. I'm more excited this year to have the honor of presenting a session entitled &amp;ldquo;It&amp;rsquo;s the Little Things&amp;rdquo;.&lt;/p&gt;

&lt;h2&gt;My Session: It&amp;rsquo;s the Little Things&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;User Interaction: it's the little things that are a website&amp;rsquo;s best assets for gaining a positive and memorable user experience. This presentation will focus on trends and best practices in design and development conventions for user controls and how they affect the user experience—negatively or positively. Through the course of the session, we will discover various problems affecting smooth user interaction. Then I will identify ways to enhance controls and layouts in order to both speed up required user tasks and make them easier to use.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;There is limited space for attendees at MinneWebCon, so &lt;a href="http://minnewebcon.umn.edu/register.php"&gt;register today&lt;/a&gt; before it fills up. I hope to see you all there!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/1eBUSZwFkFk" height="1" width="1"/&gt;</description><pubDate>Mon, 30 Mar 2009 12:43:27 -0500</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/meet-me-at-minnewebcon-09/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/1eBUSZwFkFk/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/meet-me-at-minnewebcon-09/</feedburner:origLink></item><item><title>Sub-Pixel Text Position in Photoshop</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/sub-pixel-text-position-in-photoshop/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;This is my biggest peeve in when trying to design a web site using Photoshop: text objects can't be forced to whole pixels. They always seem to render their start point from a sub-pixel location. In the following image, you can see two separate text objects that I created, each with the exact same text, but each is rendered slightly different because of its sub-pixel starting location.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://paularmstrongdesigns.com/images/blog/text-position.png" alt="text at sub-pixels in photoshop" /&gt;&lt;/p&gt;

&lt;p&gt;Is there any way to fix this? I've been searching the web and looking through everything I can think of in Photoshop, but not finding an option like &lt;a href="http://paularmstrongdesigns.com/weblog/photoshop-tip-snap-shapes-to-pixels"&gt;snapping shapes to pixels&lt;/a&gt;. Not that I have any intention of switching, but does Fireworks behave the same way?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/Uq1J6bx73Dk" height="1" width="1"/&gt;</description><pubDate>Fri, 20 Mar 2009 10:52:25 -0500</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/sub-pixel-text-position-in-photoshop/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/Uq1J6bx73Dk/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/sub-pixel-text-position-in-photoshop/</feedburner:origLink></item><item><title>Fun with JavaScript: Verde 7</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/fun-with-javascript-verde-7/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;In honor of St. Patrick's Day, &lt;a href="http://www.azul7.com"&gt;Azul 7&lt;/a&gt; (my day job&amp;mdash;check us out) has become &lt;a href="http://www.verde7.com"&gt;Verde 7&lt;/a&gt; to celebrate the occasion. Using &lt;a href="http://www.jquery.com"&gt;jQuery&lt;/a&gt; and a whole lot of Irish luck, I helped create a parallax scrolling world full of charms and wishes that you can add to or share with your friends for this upcoming St. Patty's Day.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.verde7.com"&gt;&lt;img src="http://paularmstrongdesigns.com/images/blog/verde7.jpg" alt="Verde 7 - A magical leprechaun land." /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am in the middle of writing another post for the &lt;a href="http://www.azul7.com/blog/"&gt;Azul 7 Blog&lt;/a&gt; about some of the tech behind it and I'll be sure to update you all when it's live.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/jhwDeWvsMTI" height="1" width="1"/&gt;</description><pubDate>Thu, 12 Mar 2009 15:37:30 -0500</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/fun-with-javascript-verde-7/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/jhwDeWvsMTI/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/fun-with-javascript-verde-7/</feedburner:origLink></item><item><title>Beginning baseJS: Selectors &amp;amp; Events</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/beginning-basejs-selectors-events/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;This is the first of a series of posts related to learning and understanding &lt;a href="/projects/basejs/"&gt;baseJS: the mobile javascript framework&lt;/a&gt;. These posts are intended for anyone familiar with JavaScript who wants to start learning about baseJS and how it can help them develop webapps for the iPhone. In this post, we'll look at &lt;a href="http://paularmstrongdesigns.com/weblog/beginning-basejs-selectors-events/#ElementSelectors"&gt;Element Selectors&lt;/a&gt; and &lt;a href="http://paularmstrongdesigns.com/weblog/beginning-basejs-selectors-events/#EventListeners"&gt;Event Listeners&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="ElementSelectors"&gt;Element Selectors&lt;/h2&gt;

&lt;p&gt;At its core, baseJS focuses on using the &lt;a href="http://www.w3.org/TR/selectors-api/"&gt;Selectors API&lt;/a&gt; as its primary method of getting elements from the &lt;acronym title="Document Object Model"&gt;DOM&lt;/acronym&gt;. If the Selectors API is not available, like in pre iPhone 2.0 frameworks, baseJS preloads the &lt;a href="http://www.sizzlejs.com"&gt;Sizzle selector engine&lt;/a&gt; before it will respond with the &lt;code&gt;dom:loaded&lt;/code&gt; event that we will look over near the end of this post.&lt;/p&gt;

&lt;p&gt;What does all of that mean? It means that you can use simple or complex CSS selectors to grab elements as &lt;code&gt;&lt;a href="https://developer.mozilla.org/en/DOM/NodeList"&gt;NodeList&lt;/a&gt;&lt;/code&gt;. Take the following HTML as a section of code in our web page:&lt;/p&gt;

&lt;pre class="sh_html"&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;foo&amp;quot;&amp;gt;This is an element with class 'foo'&amp;lt;/div&amp;gt;
&amp;lt;p class=&amp;quot;foo&amp;quot;&amp;gt;And another element with class 'foo'&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A simple CSS class selector will do for grabbing all elements with class &lt;code&gt;foo&lt;/code&gt;:&lt;/p&gt;

&lt;pre class="sh_javascript"&gt;&lt;code&gt;var foos = $('.foo');&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We&amp;rsquo;ve now selected every element with class &lt;code&gt;foo&lt;/code&gt; and stored them into a &lt;code&gt;NodeList&lt;/code&gt; called &lt;var&gt;foos&lt;/var&gt;. Note that a &lt;code&gt;NodeList&lt;/code&gt; is basically an &lt;code&gt;Array&lt;/code&gt;, thought it has one extra method called &lt;code&gt;item()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can now grab a specific element in the &lt;code&gt;NodeList&lt;/code&gt; in two different ways. In this example, both methods return the first element that matches the class &lt;code&gt;foo&lt;/code&gt;&lt;/p&gt;

&lt;pre class="sh_javascript"&gt;&lt;code&gt;var arraySelect = foos[0]; 
var itemSelect = foos.item(0);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;From this point, you are able to modify your first element with the class &lt;code&gt;foo&lt;/code&gt; as you please. For instance, the following &lt;code&gt;removeClass()&lt;/code&gt; method is available in the &lt;a href="/projects/basejs/docs/"&gt;baseJS API&lt;/a&gt; to remove a specific class from an element:&lt;/p&gt;

&lt;pre class="sh_javascript"&gt;&lt;code&gt;arraySelect.removeClass('foo');&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="EventListeners"&gt;Event Listeners&lt;/h2&gt;

&lt;p&gt;Event listeners are registered by using the built in DOM method on elements called &lt;a href="https://developer.mozilla.org/En/DOM/Element.addEventListener"&gt;&lt;code&gt;addEventListener&lt;/code&gt;&lt;/a&gt;. The reason most frameworks have custom event listeners is because they need to support Internet Explorer&amp;rsquo;s proprietary method called &lt;code&gt;attachEvent&lt;/code&gt;. Since we're not worried about IE, we can just jump on the built-in methods.&lt;/p&gt;

&lt;h3&gt;Example&lt;/h3&gt;

&lt;p&gt;Let&amp;rsquo;s assume that we have the following HTML and we want to intercept every click on it and alert the &lt;code&gt;innerHTML&lt;/code&gt; of the link. I know, it&amp;rsquo;s impractical and you&amp;rsquo;d probably never do it, but it&amp;rsquo;s a nice &amp;ldquo;Hello World&amp;rdquo; example.&lt;/p&gt;

&lt;pre class="sh_html"&gt;&lt;code&gt;&amp;lt;a id=&amp;quot;myLink&amp;quot; href=&amp;quot;http://google.com&amp;quot;&amp;gt;This is My Link&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Since this element has an id &lt;code&gt;myLink&lt;/code&gt;, that would be the easiest selector for us to use to guarantee that we're getting the correct HTML element. Using the &lt;strong&gt;Element Selector&lt;/strong&gt; &lt;code&gt;$()&lt;/code&gt;, we can store the element into a variable like this:&lt;/p&gt;

&lt;pre class="sh_javascript"&gt;&lt;code&gt;var myLink = $('a#myLink').item(0);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Notice that I used the &lt;code&gt;.item(0)&lt;/code&gt; method to select the first (and only) result that was sent back to the NodeList. baseJS is not like jQuery in the sense that everything is wrapped in the &lt;code&gt;$&lt;/code&gt; core method. So, now that we have our element, we can add an event listener to it, &lt;a href="http://paularmstrongdesigns.com/projects/basejs/docs/#stopEvent"&gt;stop the event&lt;/a&gt;, and alert the &lt;code&gt;innerHTML&lt;/code&gt; of the element.&lt;/p&gt;

&lt;p&gt;First, let's review the &lt;code&gt;addEventListener&lt;/code&gt; method:&lt;/p&gt;

&lt;pre class="sh_javascript"&gt;&lt;code&gt;element.addEventListener(&lt;em&gt;type&lt;/em&gt;, &lt;em&gt;listener&lt;/em&gt;, &lt;em&gt;useCapture&lt;/em&gt;);&lt;/code&gt;&lt;/pre&gt;

&lt;dl&gt;
    &lt;dt&gt;type&lt;/dt&gt;
    &lt;dd&gt;String&lt;/dd&gt;
    &lt;dd&gt;The type of event to listen for. One of 'click', 'mouseover', etc.&lt;/dd&gt;
    &lt;dt&gt;listener&lt;/dt&gt;
    &lt;dd&gt;Object or Function&lt;/dd&gt;
    &lt;dd&gt;The callback object or function that will receive the event. We&amp;rsquo;ll use a function.&lt;/dd&gt;
    &lt;dt&gt;useCapture&lt;/dt&gt;
    &lt;dd&gt;Boolean&lt;/dd&gt;
    &lt;dd&gt;Always set this to true to initiate capturing the event.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;So, let&amp;rsquo;s put the element selector and event listener into context:&lt;/p&gt;

&lt;pre class="sh_javascript"&gt;&lt;code&gt;var myLink = $('a#myLink').item(0);
myLink.addEventListener('click', function(event) {
    event.stop(); // this stops the original HTML event from progressing (the href won't change the page)

    alert(event.target.innerHTML);
}, true); // always set useCapture to true because we DO want to capture the event
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, this will work, assuming the page is loaded and the &lt;acronym title="Document Object Model"&gt;DOM&lt;/acronym&gt; is ready. If we aren't sure and we're firing this JavaScript right as the page loads, it's best to wrap this in a function that will be fired only &lt;em&gt;after&lt;/em&gt; the DOM is loaded and ready.&lt;/p&gt;

&lt;p&gt;We can do this by simply adding a wrapper function around the previous code that we'll call &lt;code&gt;initialize()&lt;/code&gt; and setting up another event listener on the document and check for baseJS&amp;rsquo;s &lt;code&gt;dom:loaded&lt;/code&gt; event before running the function:&lt;/p&gt;

&lt;p&gt;baseJS fires a custom &lt;code&gt;dom:loaded&lt;/code&gt; event after the DOM is done loading &lt;strong&gt;and&lt;/strong&gt; it has loaded the Sizzle selector engine &lt;em&gt;if it needs to&lt;/em&gt;.

&lt;pre class="sh_javascript"&gt;&lt;code&gt;function initialize() {
    var myLink = $('a#myLink').item(0);
    myLink.addEventListener('click', function(event) {
        event.stop();

        alert(event.innerHTML);
    }, true);
}

document.addEventListener('dom:loaded', initialize, true);&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Wrapping Up&lt;/h2&gt;

&lt;p&gt;That's it for this beginning introduction to selectors and events in baseJS. If you haven't checked it out yet, head on over to the &lt;a href="/projects/basejs/"&gt;baseJS project page&lt;/a&gt;. If you'd like to know more, check out the &lt;a href="/projects/basejs/docs/"&gt;baseJS API documentation&lt;/a&gt; and stay tuned for more posts.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/tb8QN750rCE" height="1" width="1"/&gt;</description><pubDate>Tue, 10 Mar 2009 08:43:27 -0500</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/beginning-basejs-selectors-events/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/tb8QN750rCE/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/beginning-basejs-selectors-events/</feedburner:origLink></item><item><title>Getting Creepy With Google Analytics</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/getting-creepy-with-google-analytics/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;It&amp;rsquo;s no secret that everything you do on the Internet can be tracked, watched, and analyzed. The amount of information that we can gather is&amp;hellip; well&amp;hellip; &lt;em&gt;creepy&lt;/em&gt;&amp;hellip; to say the least. I wouldn&amp;rsquo;t worry too much though, as most people really don&amp;rsquo;t care &lt;em&gt;who&lt;/em&gt; you are and are not recording that. Using the &lt;a href="http://code.google.com/apis/analytics/docs/eventTrackerGuide.html"&gt;Google Analytics Event Tracking API&lt;/a&gt;, we can get nice statistics for everything from browser window size, to outbound links, to downloads, all the way to what people are copying off of your pages.&lt;/p&gt;

&lt;p&gt;This post was inspired by &lt;a title="Tracking Browser Window Size with Google Analytics" href="http://www.zachstronaut.com/posts/2009/02/02/analytics-browser-window-size.html"&gt;Zach&amp;rsquo;s browser window dimensions tracking post&lt;/a&gt;. I won&amp;rsquo;t cover tracking browser size here, as he&amp;rsquo;s done a great job of explaining what&amp;rsquo;s going on with it his blog post. He also gives a nice introduction to event tracking:&lt;/p&gt;

&lt;blockquote cite="http://www.zachstronaut.com/posts/2009/02/02/analytics-browser-window-size.html"&gt;&lt;p&gt;The new BETA &lt;code&gt;_trackEvent&lt;/code&gt; method allows us to set both custom text and numerical values for better reporting, it is more configurable, and it does not inflate your Visitors or Content reports. &lt;cite&gt;&amp;mdash;Zach Johnson&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Okay&amp;hellip; event tracking sounds awesome, so let&amp;rsquo;s get down to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note that event tracking is a &lt;em&gt;beta&lt;/em&gt; feature in Google Analytics and not every account has access to it yet.&lt;/strong&gt; You can prod Google a little by signing up for the &lt;a href="http://code.google.com/apis/analytics/docs/trustedTester.html"&gt;Trusted Tester Program&lt;/a&gt;, but there are no guarantees of being accepted.&lt;/p&gt;

&lt;p&gt;I've currently only been running and testing events for a couple of weeks. Here's a sample of what I'm seeing in my Event Tracking section: &lt;img src="/images/blog/event-tracking-categories.gif" alt="Sample data from Google Analytics Event Tracking" /&gt;&lt;/p&gt;

&lt;h2&gt;Download Events&lt;/h2&gt;

&lt;p&gt;The first, most important, and least creepy thing that I wanted to track with the Event Tracking API was file downloads. Most people are currently accomplishing this by adding an &lt;code&gt;onclick&lt;/code&gt; event handler into the HTML and manually tracking clicks as page views, but file downloads don&amp;rsquo;t have much in common with page views, so they are better categorized as events. So, I had three things that I wanted to track on file downloads:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Number of downloads&lt;/li&gt;
    &lt;li&gt;Location of file (and file type)&lt;/li&gt;
    &lt;li&gt;What keywords are used in the link&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tracking downloads is actually a pretty simple task with some basic knowledge of JavaScript. I&amp;rsquo;ve used jQuery to bind event listeners to any link with the class &lt;code&gt;download&lt;/code&gt;, but this snippet could fairly easily be adapted for other frameworks or libraries.&lt;/p&gt;

&lt;h3&gt;JavaScript Code&lt;/h3&gt;
&lt;pre class="sh_javascript"&gt;&lt;code&gt;// Select all links with class 'download'
$('a.download').each(function() {
    // Double check that the link includes a file type at the end of the string using a regular expression
    if($(this).attr('href').match(/[.](\w+)$/)) { 
        // Bind a function to the click event
        $(this).bind('click', function(event) {
            // Track as category: 'Downloads', label: link of file, optional_label: text of link
            pageTracker._trackEvent('Downloads', $(this).attr('href'), $(this).text());
        });
    }
});&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Outbound Links&lt;/h2&gt;

&lt;p&gt;This one is also pretty simple, but getting to the point of being unnecessary and a bit intrusive. On the other hand, tracking what outbound links people are clicking to get away from your site can help you gauge whether or not you're losing your visitors to an outbound link too much.&lt;/p&gt;

&lt;p&gt;Again, this uses jQuery to iterate over all links in a document and binds the event listener only to the appropriate outbound links, but could easily be adopted to another framework.&lt;/p&gt;

&lt;h3&gt;JavaScript Code&lt;/h3&gt;
&lt;pre class="sh_javascript"&gt;&lt;code&gt;$('a').each(function() {
    var href = $(this).attr('href');
    // verify that the href includes an http or https protocol 
    // and also require that the href includes the hostname of the current page
    if( href.match('http://|https://') &amp;amp;&amp;amp; href.indexOf(window.location.hostname) == -1) {
        $(this).bind('click', function() {
            // Track as category: 'Outbound Link', label: link, optional_label: the current page
            pageTracker._trackEvent('Outbound Link', $(this).attr('href'), window.location.pathname);
        });
    }
});&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Going Too Far: Copying and Right Click Events&lt;/h2&gt;

&lt;p&gt;Besides always being curious as to what images people are yanking from my site, I&amp;rsquo;ve also been really curious as to what text was being copied. While we can&amp;rsquo;t track copy events that are used from a computer&amp;rsquo;s internal system, we can still get a good number of events from key commands. I also feel it&amp;rsquo;s pretty safe to assume that any right clicking on images are a sign of someone trying to either copy the image itself or the location of the image for use with hotlinking.&lt;/p&gt;

&lt;p&gt;Over the past few weeks, visitors to my site have been copying the following text: &lt;img src="/images/blog/event-tracking-copy.gif" alt="Statistical data on what text has been copied from this site" /&gt;&lt;/p&gt;

&lt;p&gt;I won&amp;rsquo;t go into too much detail explaining the following snippets, but feel free to &lt;em&gt;copy&lt;/em&gt;&lt;sup&gt;&lt;a href="#footnote1"&gt;1&lt;/a&gt;&lt;/sup&gt; and use it on your site and see what your visitors are copying. Note that it currently only works for Firefox, Safari, Internet Explorer 6+, and Opera (on Windows only).&lt;/p&gt;

&lt;h3&gt;JavaScript Code&lt;/h3&gt;
&lt;pre class="sh_javascript"&gt;&lt;code&gt;// Copy Keyboard Shortcut
function trackCopyEvent(type, selection) {
    pageTracker._trackEvent('Copy', type, selection);
}

$(document).bind('keypress', function(event) { // Safari and Firefox
    if( (event.charCode == 99 &amp;amp;&amp;amp; (event.metaKey || event.ctrlKey) ) &amp;amp;&amp;amp; window.getSelection ) {
        var selection = String(window.getSelection() + '').truncate(60);
        trackCopyEvent('text', selection);
    }
});
$(document).bind('keyup', function(event) { // Opera Windows and Internet Explorer
    if( event.keyCode == 67 &amp;amp;&amp;amp; event.ctrlKey ) {
        if( document.getSelection ) { // Opera Windows
            var selection = document.getSelection().truncate(60);
	        trackCopyEvent('text', selection);
        } else if( document.selection ) { // Internet Explorer
            var selection = document.selection.createRange().text.truncate(60);
	        trackCopyEvent('text', selection);
        } 
    }
});

// Context Menu
$(document).bind('contextmenu', function(event) {
    if(event.target.nodeName == 'img') {
        var image = $(event.target).attr('src'));
        trackCopyEvent('image', image);
    }
});
&lt;/code&gt;&lt;/pre&gt;


&lt;h3&gt;Footnotes&lt;/h3&gt;
&lt;p id="footnote1"&gt;&lt;sup&gt;1&lt;/sup&gt;By copying this snippet to track what people copy, you should already understand that I&amp;rsquo;m tracking you copying it. Creepy, isn&amp;rsquo;t it?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/vk_rS-JtTxg" height="1" width="1"/&gt;</description><pubDate>Mon, 02 Mar 2009 09:12:28 -0600</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/getting-creepy-with-google-analytics/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/vk_rS-JtTxg/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/getting-creepy-with-google-analytics/</feedburner:origLink></item><item><title>baseJS: A Mobile JavaScript Framework</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/basejs-a-mobile-javascript-framework/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;&lt;a style="padding: 0; float: right; width: 260px; margin: 0 0 20px 20px;" href="/projects/basejs/"&gt;&lt;img src="/images/blog/basejs.jpg" alt="baseJS logo" /&gt;&lt;/a&gt; This past fall I was tasked with creating a few iPhone-specific web applications. After doing a lot of research, I found a few issues with the popular JavaScript libraries. The availability of &lt;code&gt;-webkit-transform&lt;/code&gt; and &lt;code&gt;-webkit-animation&lt;/code&gt; removed any need for an animation library. Second, since the Query Selectors API was available, the need for a complex javascript selectors engine was basically pointless&lt;sup&gt;&lt;a href="#footnote1"&gt;1&lt;/a&gt;&lt;/sup&gt;. And last, every library that I came across, even after minifying, was far too large for the iPhone to cache (24KB limit).&lt;/p&gt;

&lt;p&gt;So looking at these first two issues, I tend to feel like those, as well as cross-platform issues, are some of the biggest reasons we use JavaScript frameworks in the first place. But here I was, developing for a single platform. So, what did I do?&lt;/p&gt;

&lt;p&gt;I wrote &lt;a href="/projects/basejs/"&gt;baseJS&lt;/a&gt;. I just needed a simple, lightweight framework that could take care of some common and bulky tasks and allow me to write cleaner, more organized code.&lt;/p&gt;

&lt;h2&gt;Features&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Lightweight: &lt;strong&gt;less than 8KB&lt;/strong&gt; when minified&lt;/li&gt;
    &lt;li&gt;Fully-compatible with Mobile Safari&lt;/li&gt;
    &lt;li&gt;Falls back on &lt;a href="http://sizzlejs.com/"&gt;Sizzle selector library&lt;/a&gt; for iPhone 1.x (when query selector support is unavailable)&lt;/li&gt;
    &lt;li&gt;Encourages use of CSS Transitions and Animations&lt;/li&gt;
    &lt;li&gt;Object-oriented&lt;/li&gt;
    &lt;li&gt;Easy to extend&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Quick Examples&lt;/h2&gt;

&lt;h3&gt;Organization Syntax of Classes&lt;/h3&gt;
&lt;pre class="sh_javascript"&gt;&lt;code&gt;var AppClass = function() {};
base.extend(AppClass.prototype, {
    method1: function() { return true; },
    method2: function() { return false; }
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Is equivalent to:&lt;/p&gt;

&lt;pre class="sh_javascript"&gt;&lt;code&gt;var AppClass = function() {};
AppClass.prototype.method1 = function() { return true; };
AppClass.prototype.method2 = function() { return false; };&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Element Selectors&lt;/h3&gt;

&lt;p&gt;baseJS uses the &lt;a href="http://dev.w3.org/2006/webapi/selectors-api/"&gt;Selectors API&lt;/a&gt; if available, or falls back on the &lt;a href="http://sizzlejs.com/"&gt;Sizzle selector library&lt;/a&gt; if query selectors are not available.&lt;/p&gt;

&lt;pre class="sh_javascript"&gt;&lt;code&gt;var header = $('#header')[0]; // Selects the first object on the page with ID 'header'
var awesome = $('div.awesome', header); // Selects every instance of &amp;lt;div class=&amp;quot;awesome&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; in #header&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Ajax Shortcuts&lt;/h3&gt;

&lt;p&gt;Face it: writing &lt;acronym title="Asynchronous JavaScript and XML"&gt;AJAX&lt;/acronym&gt; is tedious and requires a lot of steps. baseJS&amp;rsquo;s &lt;code&gt;io()&lt;/code&gt; class simplifies the process.&lt;/p&gt;

&lt;pre class="sh_javascript"&gt;&lt;code&gt;new io('/results.json', {
    format: 'json',
    method: 'post',
    params: { mustache: true },
    onSuccess: function(response) { 
        alert(response); // response == data returned from server
    }, 
    onFailure: function() { 
        alert('There was an error getting the data');
    }
});&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Element Creation Shortcuts&lt;/h3&gt;

&lt;pre class="sh_javascript"&gt;&lt;code&gt;var newLink = new Element('a', { class: 'topLink', href: '#top' }, 'Back to Top');
$('#foo').appendChild(newLink);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Appends the following to &lt;code&gt;&amp;lt;div id=&amp;quot;foo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;:&lt;/p&gt;

&lt;pre class="sh_html"&gt;&lt;samp&gt;&amp;lt;a class=&amp;quot;topLink&amp;quot; href=&amp;quot;#top&amp;quot;&amp;gt;Back to Top&amp;lt;/a&amp;gt;&lt;/samp&gt;&lt;/pre&gt;

&lt;h2&gt;There&amp;rsquo;s More&lt;/h2&gt;

&lt;p&gt;Be sure to check out the &lt;a href="/projects/basejs/docs/"&gt;baseJS API and Documentation&lt;/a&gt; to see a full list of included methods and get help using them.&lt;/p&gt;

&lt;h2&gt;Get baseJS 1.0rc1&lt;/h2&gt;
&lt;p&gt;baseJS is nearing 1.0-complete status. You can currently nab the first release candidate and read the documentation to get you started.&lt;/p&gt;
&lt;div class="columns"&gt;
    &lt;div class="column column4"&gt;
        &lt;p&gt;&lt;a class="bigLink download" href="http://cloud.github.com/downloads/paularmstrong/basejs/basejs-1.0.rc1.tar.gz"&gt;Download baseJS 1.0rc1&lt;/a&gt;&lt;/p&gt;
    &lt;/div&gt;
    &lt;div class="column column4"&gt;
        &lt;p&gt;&lt;a class="bigLink" href="/projects/basejs/docs/"&gt;API &amp;amp; Documentation&lt;/a&gt;&lt;/p&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;Get Involved with baseJS&lt;/h3&gt;
&lt;p&gt;baseJS relies on your help to make it as awesome as possible. Feel free to &lt;a href="http://github.com/paularmstrong/basejs/tree/master" title="Fork baseJS at GitHub"&gt;fork it at GitHub&lt;/a&gt; and &lt;a href="http://paularmstrong.lighthouseapp.com/projects/23230-basejs/overview" title="Report bugs for baseJS at Lighthouse"&gt;report bugs via Lighthouse&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;License&lt;/h2&gt;
&lt;p&gt;baseJS is licensed under the GNU General Public License v3.0. More information is available in the download.&lt;/p&gt;

&lt;h3&gt;Footnotes&lt;/h3&gt;
&lt;p id="footnote1"&gt;&lt;sup&gt;1&lt;/sup&gt;That is, unless you need iPhone 1.0 compatibility, but don&amp;rsquo;t worry: Sizzle has been included as an optional fallback.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/t8NMBfqtzNo" height="1" width="1"/&gt;</description><pubDate>Mon, 16 Feb 2009 09:11:16 -0600</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/basejs-a-mobile-javascript-framework/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/t8NMBfqtzNo/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/basejs-a-mobile-javascript-framework/</feedburner:origLink></item><item><title>baseJS</title><guid isPermaLink="false">http://paularmstrongdesigns.com/projects/basejs/</guid><author>donotreply@paularmstrongdesigns.com (Paul Armstrong)</author><description>&lt;a href="http://paularmstrongdesigns.com/projects/basejs"&lt;img src="/images/projects/basejs-thumb.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;A lightweight JavaScript framework intended for use with Mobile Safari on the iPhone and iPod Touch.&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/L3Rch997K0M" height="1" width="1"/&gt;</description><pubDate>Mon, 16 Feb 2009 00:14:45 -0600</pubDate><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/L3Rch997K0M/</link><feedburner:origLink>http://paularmstrongdesigns.com/projects/basejs/</feedburner:origLink></item><item><title>The Grid: Are You Getting What You&amp;rsquo;re Paying For?</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/the-grid-are-you-getting-what-youre-paying-for-/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;As you may know, I recently &lt;a href="/weblog/dear-mediatemple"&gt;gave MediaTemple a piece of my mind&lt;/a&gt; and made the jump to &lt;a href="http://www.slicehost.com/"&gt;Slicehost&lt;/a&gt;. To say the least, I am still incredibly impressed with Slicehost&amp;rsquo;s services and performance.&lt;/p&gt;

&lt;p&gt;I always felt like the grid wasn&amp;rsquo;t performing as well as MediaTemple had promised. It was supposed to be a &lt;em&gt;grid&lt;/em&gt;. It should have a ton of power, fast response times, superb uptime. Isn&amp;rsquo;t that what we should be able to expect? I would have even settled for &lt;em&gt;good&lt;/em&gt; uptime. I put up with countless &amp;ldquo;scheduled maintenance&amp;rdquo; downtimes. I bit my tongue at database outages and many bursts of unresponsive port accesses. But, when my site was down for a few hours at a time, multiple weeks in a row, and I couldn&amp;rsquo;t get a single human response out of support, something just had to change.&lt;/p&gt;

&lt;p&gt;I decided to switch to Slicehost. Since we are already using Slicehost for &lt;a href="http://www.scribbls.com"&gt;Scribbls&lt;/a&gt;, and have had excellent results, I decided it couldn&amp;rsquo;t hurt&amp;mdash;plus, there are no contracts, so I really didn&amp;rsquo;t have much to lose.&lt;/p&gt;

&lt;p&gt;I wouldn&amp;rsquo;t consider myself the type of person to normally get all excited about setting up a Ubuntu/Apache server, but I figured that I should at least learn. Slicehost provides a great deal of &lt;a href="http://articles.slicehost.com/sitemap"&gt;linux system setup and administration articles&lt;/a&gt; that are clear, easy to follow, and a great source of more knowledge than most simple setups will need.&lt;/p&gt;

&lt;p&gt;I actually found that setup was pretty painless. I tracked my steps in a separate document along the way for reference later, and before I knew it, I was ready to port my site over.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The differences in performance just blows my mind.&lt;/strong&gt; I&amp;rsquo;m on only a 256-slice (256MB Ram, 10GB storage, 100GB bandwidth), but my server load is nominal at all times, even during pretty decent traffic spikes. But even more amazing to me is the reports that I received from the &lt;a href="https://www.google.com/webmasters/tools/dashboard?pli=1"&gt;Google Webmaster Tools&lt;/a&gt; about the time the Google Bot spent trying to download pages:&lt;br /&gt;&lt;br /&gt;&lt;img src="/images/blog/googlebot-download-time.png" alt="Time Googlebot Spent Downloading a Page in Milliseconds" /&gt;&lt;/p&gt;

&lt;p&gt;If this is any indicator, as you can see, prior to January 16th, MediaTemple&amp;rsquo;s performance was all over the board. It was taking nearly 3 seconds for &lt;em&gt;Google&lt;/em&gt; to download a page, which means that those of us on slower connections were experiencing even worse performance. But suddenly, when I switched my site over, Google started averaging less than 700 milliseconds to completely download all pages.&lt;/p&gt;

&lt;h2&gt;Conclusion: MediaTemple Fail, Slicehost Win&lt;/h2&gt;

&lt;p&gt;Yep, Slicehost is definitely kicking the crap out of MediaTemple for customer service and offerings at comparable price points.&lt;/p&gt;

&lt;h3&gt;Thanks, Slicehost!&lt;/h3&gt;

&lt;p&gt;So I&amp;rsquo;ve been raving about Slicehost to everyone that I talk to lately. I&amp;rsquo;ve even started deploying sites for quite a few clients to instances at Slicehost. Afterall, who can really argue with these offerings?&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Fast response times&lt;/li&gt;
    &lt;li&gt;Non-oversold machines&lt;/li&gt;
    &lt;li&gt;Cost-effective daily backups and snapshots&lt;/li&gt;
    &lt;li&gt;Excellent customer service by &lt;em&gt;real people&lt;/em&gt;&lt;/li&gt;
    &lt;li&gt;Full control of your own system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Well, the technical stuff might not be for every one, but it&amp;rsquo;s definitely working for me. And if you&amp;rsquo;re going to sign up, why not &lt;a href="https://manage.slicehost.com/customers/new?referrer=0c9faadfcc1180985b4441cf75789bf2"&gt;sign up using my referral&lt;/a&gt;?&lt;/p&gt;

&lt;h2&gt;Afterthoughts&lt;/h2&gt;
&lt;p&gt;Looking back on this post, I feel like I haven&amp;rsquo;t really expressed how angry I really was at MediaTemple. If you follow &lt;a href="http://twitter.com/paularmstrong" title="Follow me on Twitter!"&gt;my Twitter feed&lt;/a&gt; (relevance: &lt;a href="http://twitter.com/paularmstrong/status/1102444801"&gt;#1&lt;/a&gt;, &lt;a href="http://twitter.com/paularmstrong/status/1103071152"&gt;#2&lt;/a&gt;, &lt;a href="http://twitter.com/paularmstrong/status/1103225182"&gt;#3&lt;/a&gt;, &lt;a href="http://twitter.com/paularmstrong/status/1105507657"&gt;#4&lt;/a&gt;), I think that you&amp;rsquo;ve received very close to the full effect. See also: &lt;a href="http://paularmstrongdesigns.com/weblog/dear-mediatemple#update"&gt;Dear MediaTemple&amp;hellip;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/mJVDv9Vvkhg" height="1" width="1"/&gt;</description><pubDate>Thu, 05 Feb 2009 11:21:19 -0600</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/the-grid-are-you-getting-what-youre-paying-for-/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/mJVDv9Vvkhg/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/the-grid-are-you-getting-what-youre-paying-for-/</feedburner:origLink></item><item><title>Photoshop Tip: Snap Shapes to Pixels</title><guid isPermaLink="false">http://paularmstrongdesigns.com/weblog/photoshop-tip-snap-shapes-to-pixels/</guid><author>donotreply@paularmstrongdesigns.com ( )</author><description>&lt;p&gt;I love Shape layers in Photoshop. They make editing and changing design comps a breeze. Resizing, re-coloring, everything&amp;mdash;they help us be more efficient. But, when it comes to slicing the file up for the web, there is one thing that I hate: when people don't use &amp;ldquo;Snap to Pixels&amp;rdquo; with their shapes. Let me help you not make me really annoyed.&lt;/p&gt;

&lt;h2&gt;Why is snapping to pixels with shape layers important? &lt;/h2&gt;

&lt;p&gt;For website design, snapping to pixels is imperative. The web is still a pixel-based medium, and will be for years. Because of this, it's not possible to define images, shapes, layers, or text at a non-whole-number pixel measurement. Not only that, but we can't even save images with a width or height that are not whole numbers. So, precision in your design mockups is just as important as precision in your site.&lt;/p&gt;

&lt;div style="float: left; width: 300px; margin-right: 20px"&gt;&lt;h3&gt;Bad&lt;/h3&gt;&lt;img src="/images/blog/snap-to-pixels-bad.jpg" alt="No snapping to pixels" /&gt;&lt;/div&gt;

&lt;div style="float: left; width: 300px;"&gt;&lt;h3&gt;Good&lt;/h3&gt;&lt;img src="/images/blog/snap-to-pixels-good.jpg" alt="snapping to pixels" /&gt;&lt;/div&gt;

&lt;h2&gt;How to Turn Snapping On&lt;/h2&gt;

&lt;p&gt;&lt;img src="/images/blog/snap-to-pixels.jpg" alt="Location of Snap To Pixels setting in Photoshop" /&gt;&lt;/p&gt;

&lt;p&gt;Select the Shape tool from the tools palette. Your top menu bar will now have a bunch of shape options. Select the rectangle or rounded rectangle shape. Click the drop-down arrow to the right of the shape selector buttons. In the bottom-right of this pane, check the box that says &amp;ldquo;Snap to Pixels&amp;rdquo;&lt;/p&gt;

&lt;p&gt;Use this and I will &lt;span class="heart"&gt;heart&lt;/span&gt; you forever.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/paularmstrongdesigns/~4/uQVDbBWLvGg" height="1" width="1"/&gt;</description><pubDate>Tue, 03 Feb 2009 12:02:35 -0600</pubDate><category /><comments>http://paularmstrongdesigns.com/weblog/photoshop-tip-snap-shapes-to-pixels/#comments</comments><link>http://feedproxy.google.com/~r/paularmstrongdesigns/~3/uQVDbBWLvGg/</link><feedburner:origLink>http://paularmstrongdesigns.com/weblog/photoshop-tip-snap-shapes-to-pixels/</feedburner:origLink></item></channel></rss><!-- Cached Render Time: 0.032s -->
