<?xml version="1.0" encoding="utf-8" standalone="no"?><feed xmlns="http://www.w3.org/2005/Atom">

  <title>Brett Stimmerman</title>
  <link href="http://brett.stimmerman.com"/>
  <link href="http://brett.stimmerman.com/atom.xml" rel="self"/>
  <updated>2021-02-26T14:22:07+00:00</updated>
  <id>http://brett.stimmerman.com</id>
  <author>
    <name>Brett Stimmerman</name>
    <email>brettstimmerman@gmail.com</email>
  </author>

  
  <xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><entry>
    <id>http://brett.stimmerman.com/2010/04/21/outside-events-for-yui-3</id>
    <title>Outside Events for YUI 3</title>
    <updated>2010-04-21T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2010/04/21/outside-events-for-yui-3.html"/>
    <content type="html">&lt;p&gt;&lt;a href="http://yuilibrary.com/gallery/show/outside-events"&gt;Outside Events&lt;/a&gt; is a spankin’ new YUI 3 Gallery module that allows
elements to subscribe to DOM events that occur outside of them. An event
occurs outside the subscriber if the target it is not the subscriber itself,
or any of the subscriber’s ancestors. Many common outside events are
pre-defined and ready to use, and defining new outside events is a cinch.&lt;/p&gt;

&lt;p&gt;Outside Events is tiny weighing in at 475 bytes minified and gzipped. It’s
also hosted on the same CDN as YUI 3, so including it in your projects is
simple and fast.&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nx"&gt;YUI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="c1"&gt;// Last Gallery Build of this module&lt;/span&gt;
  &lt;span class="na"&gt;gallery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gallery-2010.04.21-21-51&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gallery-outside-events&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Outside events are ready to go!&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Subscribe to outside events just like any other DOM event. Here is the
pre-defined &lt;code class="language-plaintext highlighter-rouge"&gt;clickoutside&lt;/code&gt; event in action.&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#dialog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;clickoutside&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hidden&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Let’s say you’ve defined a sweet new &lt;code class="language-plaintext highlighter-rouge"&gt;swipe&lt;/code&gt; event with the YUI 3
&lt;a href="http://yuilibrary.com/yui/docs/event/#synthetic-events"&gt;Synthetic DOM Event API&lt;/a&gt;. Defining &lt;code class="language-plaintext highlighter-rouge"&gt;swipeoutside&lt;/code&gt; is easy.&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defineOutside&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;swipe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;New outside events are named &lt;code class="language-plaintext highlighter-rouge"&gt;&amp;lt;event&amp;gt;outside&lt;/code&gt; by default. You can
optionally give new outside events a custom name.&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defineOutside&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;swipe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;outerswipe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#foo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;outerswipe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Outside event handlers receive the originating DOM event object as an
argument.&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#foo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keyupoutside&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;tag&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tagName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A keyup event occured on a &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; element &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
             &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;outside of #foo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To learn more about Outside Events and view the list of pre-defined outside
events, have a look at the &lt;a href="http://yuilibrary.com/gallery/show/outside-events"&gt;YUI Library page&lt;/a&gt; and the &lt;a href="http://github.com/brettstimmerman/outside-events/blob/master/README.md"&gt;README&lt;/a&gt;, which
goes into detail about a few general caveats and specific known issues with IE
6, 7 and 8 you should be aware of.&lt;/p&gt;

</content>
  </entry>
  
  <entry>
    <id>http://brett.stimmerman.com/2009/09/09/ie-vpc-images-now-with-wga</id>
    <title>IE VPC Images Now with WGA</title>
    <updated>2009-09-09T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2009/09/09/ie-vpc-images-now-with-wga.html"/>
    <content type="html">&lt;p&gt;Just when I was on a virtualization roll &lt;a href="/2009/08/11/how-to-run-ie-on-your-mac-with-virtualbox.html"&gt;using VirtualBox for testing IE on
my Mac&lt;/a&gt;, Microsoft stopped me dead in my tracks. The latest version of
&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=11575"&gt;Internet Explorer Application Compatibility VPC Images&lt;/a&gt; now have the
anti-piracy features of Windows Genuine Advantage enabled.&lt;/p&gt;

&lt;p&gt;The hardware signature detected when a VPC image first boots in a non-VPC host
is different from the signature present when the image was first created,
presumably in VPC. This difference triggers WGA’s re-activation requirement to
make sure you’re not a dirty pirate. Of course you’re not a dirty pirate, but
if you wish to  re-activate Windows you’re going to need the original Windows
Product Key which isn’t provided with the VPC images. Microsoft has
effectively blocked end users from hosting the VPC images with anything but
Virtual PC.&lt;/p&gt;

&lt;p&gt;To their credit, Microsoft has done a great thing by providing these VPC
images free of charge, and it makes sense they would use their own virtual
disk format for distribution. But it doesn’t make sense for them to deny
non-Windows (thus, non-VPC users) the ability to use the images.&lt;/p&gt;

&lt;p&gt;One of the largest complaints I hear from web developers who work in a
non-Windows environment is the difficulty of testing in IE. Until recently,
VirtualBox was working quite nicely for me in this regard. Microsoft would be
doing another great thing by loosening the reigns a bit. Alternatively, they
could release Virtual PC for other operating systems.&lt;/p&gt;

</content>
  </entry>
  
  <entry>
    <id>http://brett.stimmerman.com/2009/08/11/how-to-run-ie-on-your-mac-with-virtualbox</id>
    <title>How To Run IE on Your Mac with Virtualbox</title>
    <updated>2009-08-11T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2009/08/11/how-to-run-ie-on-your-mac-with-virtualbox.html"/>
    <content type="html">&lt;p&gt;Recently at work I’ve switched from Parallels to
&lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; for my virtualization needs.
VirtualBox has come a long way recently, and I’m very pleased with its
performance and ease of use. Parallels was starting to become noticeably slow,
and was generally not working well for me anymore.&lt;/p&gt;

&lt;p&gt;At first, I tried to convert my Parallels &lt;code class="language-plaintext highlighter-rouge"&gt;.hdd&lt;/code&gt; images to VM Ware &lt;code class="language-plaintext highlighter-rouge"&gt;.vmdk&lt;/code&gt;
format, which is natively supported in VirtualBox. Virtual PC &lt;code class="language-plaintext highlighter-rouge"&gt;.vhd&lt;/code&gt; format
is also natively supported. Since my Parallels images are fully licensed
versions of Windows XP, I didn’t want them to go to waste. Sadly, the
converted images were corrupt and  weren’t recognized by VirtualBox, and I
ended up wasting several hours.&lt;/p&gt;

&lt;p&gt;I decided to ignore Parallels completely and simply use the free Internet
Explorer Application Compatibility VPC Images from Microsoft. I should have
done this in the first place, because setting them up was a breeze with the
help of the internet and a few helpful how-to articles I found. I could link
to those how-to’s here but instead I wanted to post my own condensed version
of the steps I took setting everything up. Mainly for myself for future
reference.&lt;/p&gt;

&lt;h3 id="step-1"&gt;Step 1&lt;/h3&gt;

&lt;p&gt;Download and install &lt;a href="http://www.virtualbox.org/wiki/Downloads"&gt;VirtualBox&lt;/a&gt;
and &lt;a href="http://www.stuffit.com/mac-expander.html"&gt;Stuffit Expander&lt;/a&gt;. You can skip Stuffit Expander if you already have a
tool for opening self-extracting &lt;code class="language-plaintext highlighter-rouge"&gt;.exe&lt;/code&gt; files.&lt;/p&gt;

&lt;h3 id="step-2"&gt;Step 2&lt;/h3&gt;

&lt;p&gt;Download the free Windows XP &lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=11575"&gt;IE App Compat VPC images&lt;/a&gt; that you’ll need
and extract the &lt;code class="language-plaintext highlighter-rouge"&gt;.vhd&lt;/code&gt; images with Stuffit Expander (or your tool of choice).&lt;/p&gt;

&lt;p&gt;Using Finder, navigate to &lt;code class="language-plaintext highlighter-rouge"&gt;/Library/VirtualBox&lt;/code&gt; and create a new folder for
each image. Move the extracted &lt;code class="language-plaintext highlighter-rouge"&gt;.vhd&lt;/code&gt; files into these new folders.&lt;/p&gt;

&lt;h3 id="step-3"&gt;Step 3&lt;/h3&gt;

&lt;p&gt;In Terminal, run the following for each image:&lt;/p&gt;

&lt;div class="language-sh highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /Library/VirtualBox/&amp;lt;image&amp;gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;VBoxManage internalcommands sethduuid &amp;lt;image&amp;gt;.vhd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This undocumented command will avoid UUID conflicts when creating multiple
VMs. If you’re only setting up one VM, you can skip this.&lt;/p&gt;

&lt;h3 id="step-4"&gt;Step 4&lt;/h3&gt;

&lt;p&gt;In VirtualBox, create a new Windows XP VM and follow the prompts. When asked,
choose &lt;em&gt;Use existing hard disk.&lt;/em&gt; Click the folder icon to open the Virtual
Media Manager. Click &lt;em&gt;Add&lt;/em&gt; and navigate to  a &lt;code class="language-plaintext highlighter-rouge"&gt;.vhd&lt;/code&gt; file you extracted and
relocated in step 2. Click &lt;em&gt;Select&lt;/em&gt; to choose the new virtual disk. Finally,
click &lt;em&gt;Next&lt;/em&gt; then &lt;em&gt;Finish&lt;/em&gt;.&lt;/p&gt;

&lt;h3 id="step-5"&gt;Step 5&lt;/h3&gt;

&lt;p&gt;Start your new VM. Close/cancel any Windows popups or dialogs that appear.
There will be quite a few.&lt;/p&gt;

&lt;p&gt;From the VirtualBox VM menu bar in OS X select &lt;em&gt;Devices &amp;gt; Install Guest
Additions…&lt;/em&gt; and follow the Windows prompts. Reboot Windows when asked.&lt;/p&gt;

&lt;h3 id="step-6"&gt;Step 6&lt;/h3&gt;

&lt;p&gt;Now it’s time to install the network drivers. Why this isn’t covered by the
VirtualBox Guest Additions is beyond me.&lt;/p&gt;

&lt;p&gt;In Windows go to &lt;em&gt;Start &amp;gt; Run…&lt;/em&gt; and run the following:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;D:\VBoxWindowsAdditions-x86.exe /extract /D=C:\Drivers
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Back to &lt;em&gt;Start &amp;gt; Run…&lt;/em&gt; and run:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;devmgmt.msc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In Device Manager, find &lt;em&gt;Network adapters &amp;gt; Ethernet controller&lt;/em&gt;. Right click
it, and select &lt;em&gt;Update Driver…&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In the Hardware Update Wizard choose &lt;em&gt;No, not this time&lt;/em&gt; and click &lt;em&gt;Next&lt;/em&gt;.
Select &lt;em&gt;Install from a list or specific location&lt;/em&gt; and click &lt;em&gt;Next&lt;/em&gt;. Check the
option &lt;em&gt;Include this location in the search&lt;/em&gt; and paste the following into the
Location box:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;C:\Drivers\x86\Network\AMD
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Alternatively, you can choose &lt;em&gt;Don’t search …&lt;/em&gt; and navigate to the location
manually. Click &lt;em&gt;Finish&lt;/em&gt; and you should have a working network connection.&lt;/p&gt;

&lt;h3 id="step-7"&gt;Step 7&lt;/h3&gt;

&lt;p&gt;In Device Manager, find &lt;em&gt;Batteries &amp;gt; Unknown device&lt;/em&gt;. In my case, there were
two. Right click each and select &lt;em&gt;Disable&lt;/em&gt; and confirm. These appear to be
VirtualPC specific. In any case, they aren’t really necessary anyway.&lt;/p&gt;

&lt;p&gt;Next find &lt;em&gt;Universal Serial Bus controllers &amp;gt; Universal Serial Bus (USB)
Controller&lt;/em&gt;. Again, there were two. Disable them as well.&lt;/p&gt;

&lt;p&gt;Finally, find &lt;em&gt;Sound, video and game controllers &amp;gt; Multimedia Audio
Controller&lt;/em&gt; and disable it.&lt;/p&gt;

&lt;h3 id="additional-vms"&gt;Additional VMs&lt;/h3&gt;

&lt;p&gt;Repeat steps 4-7 to set up additional VMs, and enjoy your new VirtualBox
goodness.&lt;/p&gt;

</content>
  </entry>
  
  <entry>
    <id>http://brett.stimmerman.com/2007/07/29/my-biggest-complaint-about-the-iphone</id>
    <title>My Biggest Complaint About the iPhone</title>
    <updated>2007-07-29T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2007/07/29/my-biggest-complaint-about-the-iphone.html"/>
    <content type="html">&lt;p&gt;After a month of iPhone ownership, I can honestly say I’m pleased with the
device. While it’s true the iPhone is flawed in several ways, it is simply
the best cell phone (and iPod) I’ve owned.&lt;/p&gt;

&lt;p&gt;If I were to lodge a &lt;em&gt;single complaint&lt;/em&gt; against the iPhone, it would not be
about the lack of a native IM application. It would not be about how EDGE is
painfully slow. Or how the camera lacks zoom and brightness controls. Or the
lack of voice dialing. Or Bluetooth limitations. Or the various UI
inconsistencies. Or poor voicemail sound quality. Or MobileMail’s automatic
resizing of photos. Or the error-prone keyboard. Or the lack (so far) of an
official native SDK.&lt;/p&gt;

&lt;p&gt;In fact, nearly all of the above limitations I can happily live with. They are
mostly software-bound and can (and hopefully will) likely be remedied by a
future update. Yes, EDGE is slow but it’s decent in a pinch.&lt;/p&gt;

&lt;p&gt;If I were to change &lt;em&gt;one thing&lt;/em&gt; about the iPhone, it would be the headset.
The one size fits all construction means that they do not fit my ears and
the size cannot be easily changed. They easily fall out, and since the tiny
speaker sits so far away from my ear canal when not falling out, they produce
a very hollow, tinny sound and let too much outside noise into my ear. For a
device where two of three major features lean on the headset, the included set
is unacceptable.&lt;/p&gt;

&lt;p&gt;What’s more, the jack won’t accept most off the shelf headsets without a
separate adapter. Even if it did, those sets wouldn’t have the built-in and
oh-so-handy microphone and button anyway. Only the V-MODA Vibe Duo comes close
to being the perfect iPhone headset. It’s too bad they  aren’t $50 to $70
cheaper and have an iPhone-compatible button. It’s also too bad I’m not the
&lt;a href="http://youtube.com/watch?v=yLzs5aHv3jI"&gt;hacking type&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://brett.stimmerman.com/2007/06/13/how-to-safely-parse-json</id>
    <title>How To Safely Parse JSON</title>
    <updated>2007-06-13T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2007/06/13/how-to-safely-parse-json.html"/>
    <content type="html">&lt;p&gt;Over the past few weeks I’ve witnessed several discussions about how to safely
parse JSON in JavaScript. Most of these conversations hinge upon something
like “because &lt;code class="language-plaintext highlighter-rouge"&gt;eval&lt;/code&gt; is simply not enough.” And they are right.&lt;/p&gt;

&lt;p&gt;So how do you safely parse JSON in JavaScript? Luckily for us, most browsers
today have native JSON support. For older browsers, &lt;a href="http://crockford.com/"&gt;Douglas Crockford&lt;/a&gt;
created a polyfill called &lt;a href="https://github.com/douglascrockford/JSON-js"&gt;JSON-js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here’s a simple example of using the native or JSON-js &lt;code class="language-plaintext highlighter-rouge"&gt;JSON&lt;/code&gt; object:&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;obj1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;foo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Create a JSON string from an object.&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Parse the JSON string into a new object.&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;obj2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

</content>
  </entry>
  
  <entry>
    <id>http://brett.stimmerman.com/2007/04/25/php-5-static-and-inheritance</id>
    <title>PHP 5, Static and Inheritance</title>
    <updated>2007-04-25T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2007/04/25/php-5-static-and-inheritance.html"/>
    <content type="html">&lt;p&gt;The object oriented features of PHP 5 are leaps and bounds more complete than
PHP 4. In fact, PHP 5 could almost pass for a true object oriented language in
many ways: visibility, overloading, reflection, etc. Yet there are quite a few
holes in its implementation that can make it painful to work with compared to
similar languages. One well-known issue is that parent constructors are not
implicitly called in derived classes; you must explicitly call
&lt;code class="language-plaintext highlighter-rouge"&gt;parent::__construct()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I recently stumbled into a similar hole in PHP 5’s OO implementation: class
methods and members declared as &lt;code class="language-plaintext highlighter-rouge"&gt;static&lt;/code&gt; do not behave as one might expect
with respect to inheritance. Given a base class, &lt;code class="language-plaintext highlighter-rouge"&gt;Animal&lt;/code&gt;, and two derived
classes, &lt;code class="language-plaintext highlighter-rouge"&gt;Dog&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;Cat&lt;/code&gt;, let’s assume that all Animals have a color and that
it defaults to black.&lt;/p&gt;

&lt;div class="language-php highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nv"&gt;$color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Black'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cat&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nv"&gt;$color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Brown'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nv"&gt;$color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Grey'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nice and simple, short and sweet. Animal has a color that defaults to black,
and we’ve extended Animal with a Cat that defaults to brown and a Dog that
defaults to grey. All fine and good. That is, until I want to ask the Dog or
Cat classes what their default colors are.&lt;/p&gt;

&lt;div class="language-php highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;getColor&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Black&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;getColor&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;    &lt;span class="c1"&gt;// Black (huh?)&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nc"&gt;Cat&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;getColor&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;    &lt;span class="c1"&gt;// Black (what?)&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It turns out that static methods are called within the scope of the class
where the method is defined. In this case, &lt;code class="language-plaintext highlighter-rouge"&gt;Animal&lt;/code&gt;. So, even though &lt;code class="language-plaintext highlighter-rouge"&gt;Dog&lt;/code&gt; and
&lt;code class="language-plaintext highlighter-rouge"&gt;Cat&lt;/code&gt; both inherit the static method &lt;code class="language-plaintext highlighter-rouge"&gt;getColor()&lt;/code&gt;, its scope is bound to
&lt;code class="language-plaintext highlighter-rouge"&gt;Animal&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The missing language feature that I want is called &lt;em&gt;late static binding&lt;/em&gt;. The
PHP Manual attempts to explain how things currently work.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;… static method calls are resolved at compile time. When using an explicit
class name the method is already identified completely and no inheritance
rules apply. If the call is done by self then self is translated to the
current class, that is the class the code belongs to. Here also no
inheritance rules apply.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This issue has been a pain point for me lately, and I’ve resorted to some
horrendous and clumsy workarounds to mimic the expected behavior. Until now
there has been very little standing in my way of accomplishing most anything
with PHP with relative ease. This is by far one of the most annoying dealings
I’ve had with PHP in over 8 years.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://brett.stimmerman.com/2007/03/29/a-quote-from-dave-thomas</id>
    <title>A Quote from Dave Thomas</title>
    <updated>2007-03-29T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2007/03/29/a-quote-from-dave-thomas.html"/>
    <content type="html">&lt;p&gt;&lt;a href="http://pragdave.pragprog.com/pragdave/2007/03/the_radar_archi.html"&gt;Dave Thomas&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Recently, folks have been trying to [make] browser-based applications more
interactive using technologies such as Ajax. To my mind, this is just a
stop-gap until we throw the browser away altogether — Ajax is just
lipstick on a pig.&lt;/p&gt;
&lt;/blockquote&gt;

</content>
  </entry>
  
  <entry>
    <id>http://brett.stimmerman.com/2007/03/21/os-x-tar-and-resource-forks</id>
    <title>OS X, tar and Resource Forks</title>
    <updated>2007-03-21T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2007/03/21/os-x-tar-and-resource-forks.html"/>
    <content type="html">&lt;p&gt;In preparing releases of &lt;a href="https://github.com/brettstimmerman/jabber-bot/"&gt;Jabber::Bot&lt;/a&gt;, I had my first experience using tar
in OS X to produce a tarball; I had previously only been a consumer of
tarballs in OS X.&lt;/p&gt;

&lt;p&gt;Using OS X on the command line means dealing with &lt;a href="http://en.wikipedia.org/wiki/Resource_fork"&gt;resource forks&lt;/a&gt;.
Especially when doing things like copying or archiving files for public
distribution. Most heavy OS X users are familiar with &lt;a href="http://en.wikipedia.org/wiki/DS_Store"&gt;.DS_Store&lt;/a&gt; files.
They are a nuisance, but generally can be dealt with without much fuss.
Resource forks, on the other hand, can sometimes be tricky.&lt;/p&gt;

&lt;p&gt;Resource forks serve no purpose to anyone but you or another OS X user, who
likely doesn’t really care anyway. In order to create a public tarball, it’s a
good idea to exclude resource forks since they are unnecessary. But, tar on
OS X (Tiger) likely won’t exclude them, even if you specify an exclude pattern
like &lt;code class="language-plaintext highlighter-rouge"&gt;--exclude='._*'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;After a bit of tinkering, I found a solution:&lt;/p&gt;

&lt;div class="language-sh highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;COPY_EXTENDED_ATTRIBUTES_DISABLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then run tar and resource forks will be excluded.&lt;/p&gt;

</content>
  </entry>
  
  <entry>
    <id>http://brett.stimmerman.com/2006/12/26/twitter</id>
    <title>Twitter</title>
    <updated>2006-12-26T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2006/12/26/twitter.html"/>
    <content type="html">&lt;p&gt;It’s a &lt;a href="http://www.twitter.com"&gt;simple concept&lt;/a&gt;, really. But I just can’t
quite understand why.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://brett.stimmerman.com/2006/12/22/wii-internet-channel</id>
    <title>Wii Internet Channel</title>
    <updated>2006-12-22T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2006/12/22/wii-internet-channel.html"/>
    <content type="html">&lt;p&gt;I am writing this on the Wii Internet Channel. Using the Wiimote to input
large amounts of text is far too painful, and zooming and scrolling around is
a little awkward. Also, using the Wiimote to click on links and other controls
feels clumsy. A keybord/mouse combination would be much nicer. Overall I think
it’s a great addition to the Wii.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://brett.stimmerman.com/2006/08/16/user-preferences-are-a-huge-pain</id>
    <title>User Preferences are a Huge Pain</title>
    <updated>2006-08-16T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2006/08/16/user-preferences-are-a-huge-pain.html"/>
    <content type="html">&lt;p&gt;Recently while working on a project at work, I realized that one of the most
frustrating aspects of software development is also one of the most mundane:
user preferences. Building out the main application is tremendously rewarding,
but providing users with preferences is a huge pain.&lt;/p&gt;

&lt;p&gt;Most applications provide some way for a user to modify how the application
behaves at run time. In fact, users expect some level of control over the
application’s behavior. As a user, I like having such options, even options I
know I won’t need right away but might like to use in the future. But users
— myself included until recently — don’t realize that, as a
developer, providing users with options is much easier said than done.&lt;/p&gt;

&lt;p&gt;First, the preferences need a place to live. As developer, I need a way to
retrieve preferences from somewhere and store them back again. This storage
system could be a text file of key-value pairs, more complex XML data, an
OS-provided data store (e.g. Windows registry), a relational database, or
umpteen other possibilities. Choosing the proper way to handle the storage of
user preferences depends on the size of the project, but is by no means a
simple matter. Simple applications with many simple options can quickly
outgrow a simple storage system.&lt;/p&gt;

&lt;p&gt;Once I’ve decided on a storage system and implemented an API for manipulating
it, it’s time to give the user a UI to view and modify the current
configuration. There are no standard conventions for creating preferences UIs.
Because the preferences for a unique application are, well, unique, there
isn’t one, generalized UI that has already been built that can easily be
reused.&lt;/p&gt;

&lt;p&gt;During the development of a project that requires modest user preferences, I
had an epiphany.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A user preferences UI and storage system is a complete project in and of
itself, with a purpose entirely separate from that of the application to
which it provides configuration abilities.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;First and foremost, the preferences UI has to make sense. The user has to be
able to quickly find where a setting can be changed. If the preferences UI is
too convoluted the application becomes difficult to configure, and the overall
experience using the application can be adversely affected. I would advise
against letting a strictly developer-type build your preferences UI. This is
something that a user will use from time to time. It needn’t be pretty, but it
must be easy to use. This is a task best left to information architects and
designers, and it should not be an afterthought.&lt;/p&gt;

&lt;p&gt;Once I’ve sufficiently sketched a preferences UI (or reviewed a designer’s
sketches) and feel I’m confident I understand how it will work, I must now
translate thoughts and drawings into code. This is perhaps the most time
consuming step in the process. The preferences system I create must present a
simple UI to the user and also be easily maintained by the developer when
requirements change.&lt;/p&gt;

&lt;p&gt;Designing the UI itself isn’t terribly difficult, but because preferences
often use a myriad of UI controls such as text fields, select lists, drop
downs, and check boxes, the logic behind each control must be fleshed out and
properly bound to the storage system.  to avoid configuration errors, controls
often have unique validation requirements. Creating this &lt;em&gt;controller&lt;/em&gt; layer
of the user preferences system is the most tedious and time consuming, and is
very often the least rewarding, since it’s development time not spent directly
on the core of the main application.&lt;/p&gt;

&lt;p&gt;After the UI is designed and created, and the controls are bound to the
storage system, and all input is properly validated, and modification are
persisted, and the main application responds to the changes — only then
is my job complete. I’ve just spent a few hours, likely days, and potentially
weeks allowing Joe User to change his text color from Medium Quasar Blue to
Metallic Pearl Shine. And because my application is not a Medium Quasar Blue
to Metallic Pearl Shine font color changerator, I’ve just spent many hours on
code that does not help accomplish my application’s main goals.&lt;/p&gt;

&lt;p&gt;At this point, my user is happy with their new font color, and if I happen to
work on another application that needs a Medium Quasar Blue to Metallic Pearl
Shine font color changerator, I’ve already got some code to work with.
However, I’ll still need to decide upon the proper preference storage system,
create a unique UI and write the tedious controller logic fluff. There’s got
to be a better way.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://brett.stimmerman.com/2006/06/28/and-then-java-ate-my-life</id>
    <title>And Then Java Ate My Life</title>
    <updated>2006-06-28T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2006/06/28/and-then-java-ate-my-life.html"/>
    <content type="html">&lt;p&gt;A few months back I started a new job.  A large part of this new job entails
building and maintaining Java desktop applications.  A large part of my life
has recently been eaten away by terse API docs, vague explanations of core and
advanced features, and minimalist and nearly useless code examples of said
features.&lt;/p&gt;

&lt;p&gt;Though it’s a great change of pace from years of working mainly in PHP, it
means I don’t have much free time to work on things I like. At least for a
little while.&lt;/p&gt;

&lt;p&gt;I’m hoping that getting back into Java after a 5 year hiatus will be good for
me.  The Java landscape is difficult for me to accurately gauge, but it seems
as though Java on the desktop is trending back into fashion.&lt;/p&gt;

&lt;p&gt;Once I settle in to Java and my new role, I hope to be able to pick up my side
projects again.  It’s unfortunate, but other projects don’t pay the
bills.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://brett.stimmerman.com/2006/04/15/ajax-design-patterns-book</id>
    <title>Ajax Design Patterns Book</title>
    <updated>2006-04-15T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2006/04/15/ajax-design-patterns-book.html"/>
    <content type="html">&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/0596101805/"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51pG4Tk2-jL._SL83_.jpg" alt="Ajax Design Patterns book cover" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I just stumbled across the Amazon pre-order page for a new O’Reilly book,
&lt;a href="http://www.amazon.com/gp/product/0596101805/"&gt;Ajax Design Patterns&lt;/a&gt;, based on Michael Mahemoff’s
&lt;a href="http://ajaxpatterns.org"&gt;Ajax Patterns wiki&lt;/a&gt;. It’s set to be released on June 1, 2006.&lt;/p&gt;

&lt;p&gt;From the Amazon description:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;Ajax Design Patterns&lt;/em&gt; provides best practices for web developers by
investigating how others have successfully dealt with conflicting design
principles. You will find sections on foundational technology patterns,
programming patterns, functionality and usability patterns, and
diagnosis/testing of Ajax applications. Ajax is all about usability, so the
patterns in this book focus on delivering usability in the face of
constraints, such as user capabilities and expectations, bandwidth limits, 
the stateless nature of HTTP, and the complexity of Javascript.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’m excited to see a wiki like this published in book form, especially an
O’Reilly book. I’m also excited because &lt;a href="http://github.com/brettstimmerman/lace"&gt;Lace&lt;/a&gt; makes an appearance or two.
It might not be much, but it’s the first code I’ve written to be published in
text form on such a massive scale.&lt;/p&gt;

</content>
  </entry>
  
  <entry>
    <id>http://brett.stimmerman.com/2006/01/14/think-fast-making-first-impressions-on-the-web</id>
    <title>Think Fast - Making First Impressions on the Web</title>
    <updated>2006-01-14T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2006/01/14/think-fast-making-first-impressions-on-the-web.html"/>
    <content type="html">&lt;p&gt;The case for creating visually appealing and usable web sites (and
applications) now has more ammunition. In an article entitled
&lt;a href="http://www.nature.com/news/2006/060109/full/060109-13.html"&gt;“Web users judge sites in the blink of an eye”&lt;/a&gt;, nature.com reports a
university study found that web users make their first impressions much more
quickly than one might expect.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;We all know that first impressions count, but this study shows that the
brain can make flash judgements almost as fast as the eye can take in the
information. … [Researchers] found that impressions were made in the first
50 milliseconds of viewing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fifty milliseconds is incredibly fast: one twentieth of a second, or roughly
half the time it takes to blink.&lt;/p&gt;

&lt;p&gt;The article goes on to suggest that overall simplicity, a trend borne of the
the Web Standards movement, is a crucial step towards making a lasting
impression:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;These days, enlightened web users want to see a “puritan” approach … It’s
about getting information across in the quickest, simplest way possible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is hard evidence that we as web designers and developers must create an
excellent and long-lasting first impression, or we are not doing our job.&lt;/p&gt;

</content>
  </entry>
  
  <entry>
    <id>http://brett.stimmerman.com/2005/12/15/ajax-tagging</id>
    <title>Ajax Tagging</title>
    <updated>2005-12-15T00:00:00+00:00</updated>
    <link href="http://brett.stimmerman.com/2005/12/15/ajax-tagging.html"/>
    <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/stimmerman/73836394/"&gt;&lt;img src="http://static.flickr.com/20/73836394_9216a9451d_s.jpg" alt="Graffiti" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I walked past this &lt;a href="http://www.flickr.com/photos/stimmerman/73836394/"&gt;small delivery truck&lt;/a&gt; this morning on my way to work,
and had myself a chuckle. There is plenty of graffiti and tagging that line
the streets of Berkeley and Albany, ranging from the obscure to the obscene.
But until today, none have struck me as being so very appropriate.&lt;/p&gt;

</content>
  </entry>
  

</feed>