<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Michael Barrett @ Abouthalf dot com</title>
	<atom:link href="http://abouthalf.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://abouthalf.com</link>
	<description>Thoughts, Pics, Portfolio</description>
	<pubDate>Mon, 11 Aug 2008 02:07:17 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Laundry day</title>
		<link>http://abouthalf.com/2008/08/10/laundry-day/</link>
		<comments>http://abouthalf.com/2008/08/10/laundry-day/#comments</comments>
		<pubDate>Mon, 11 Aug 2008 02:07:17 +0000</pubDate>
		<dc:creator>MB</dc:creator>
		
		<category><![CDATA[Home]]></category>

		<guid isPermaLink="false">http://abouthalf.com/?p=164</guid>
		<description><![CDATA[I was heading upstairs from the laundry room after putting some clothes in. I was waiting for the elevator.
I looked through the front-door window and saw what appeared to be a man, lying on his back on the sidewalk.
I looked again. Yep. Definitely a man. Yep. Definitely not moving.
I went out and asked if he [...]]]></description>
			<content:encoded><![CDATA[<p>I was heading upstairs from the laundry room after putting some clothes in. I was waiting for the elevator.</p>
<p>I looked through the front-door window and saw what appeared to be a man, lying on his back on the sidewalk.</p>
<p>I looked again. Yep. Definitely a man. Yep. Definitely not moving.</p>
<p>I went out and asked if he was OK. He didn&#8217;t move. I asked again&#8230;no movement.</p>
<p>Ah. There it is. He is breathing. Good.</p>
<p>I called 911 and as I was waiting there, talking with the operator, that&#8217;s when people actually decided to pause.</p>
<p>Some concerned neighbors, on their way in, asked about him and waited with me.</p>
<p>At about this time, a line of five over-dressed party boys streamed out of the apartment and didn&#8217;t even pause.</p>
<p>They moved through the crowd (like ambulance drivers?) and didn&#8217;t even take off their sunglasses for a peek.</p>
<p>The firemen arrive (first responders) arrive and a big husky guy hops out of the truck and yells &#8220;Francisco!&#8221;</p>
<p>Apparently they have met before.</p>
<p>He rolls over to Francisco and starts talking to him. &#8220;Que onda, Francisco?&#8221; (what&#8217;s happening) The other responders kind of roll their eyes. An older guy says &#8220;I&#8217;ll cancel the ambulance.&#8221;</p>
<p>Eventually they get him to sit up.</p>
<p>I checked on the scene from my balcony a few minutes later, they had called a PDX cop in. They handcuffed him and searched his backpack and took him away. Presumably to sober up downtown.</p>
<p>How was your afternoon? I got most of my laundry done.</p>
]]></content:encoded>
			<wfw:commentRss>http://abouthalf.com/2008/08/10/laundry-day/feed/</wfw:commentRss>
		</item>
		<item>
		<title>This is a picture of a car with a giant teddy bear on top.</title>
		<link>http://abouthalf.com/2008/07/23/this-is-a-picture-of-a-car-with-a-giant-teddy-bear-on-top/</link>
		<comments>http://abouthalf.com/2008/07/23/this-is-a-picture-of-a-car-with-a-giant-teddy-bear-on-top/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 02:45:30 +0000</pubDate>
		<dc:creator>MB</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://abouthalf.com/?p=161</guid>
		<description><![CDATA[
Please enjoy.
]]></description>
			<content:encoded><![CDATA[<p><img src="http://abouthalf.com/wp-content/uploads/2008/07/german_bear.jpg" alt="Mercedes with a bear on top" title="Mercedes with a bear on top" width="375" height="500" class="size-full wp-image-162" /></p>
<p>Please enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://abouthalf.com/2008/07/23/this-is-a-picture-of-a-car-with-a-giant-teddy-bear-on-top/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Lexical Closures are Handy</title>
		<link>http://abouthalf.com/2008/07/20/lexical-closures-are-handy/</link>
		<comments>http://abouthalf.com/2008/07/20/lexical-closures-are-handy/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 00:13:30 +0000</pubDate>
		<dc:creator>MB</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://abouthalf.com/?p=155</guid>
		<description><![CDATA[I wrote previously that I would write about a handy trick in JavaScript known as a &#8220;lexical closure&#8221;.
This article has a great definition of a lexical closure: http://www.brockman.se/writing/method-references.html.utf8.
I quote…

Essentially, a closure, or lexical closure, is a function f coupled with a snapshot of its lexical environment (i.e., the non-local variable bindings used in its body).
Hence, [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote <a href="/2008/07/18/javascript_scope_blues/">previously</a> that I would write about a handy trick in JavaScript known as a &#8220;lexical closure&#8221;.</p>
<p>This article has a great definition of a lexical closure: <a href="http://www.brockman.se/writing/method-references.html.utf8">http://www.brockman.se/writing/method-references.html.utf8</a>.</p>
<p>I quote…</p>
<blockquote>
<p>Essentially, a closure, or lexical closure, is a function f coupled with a snapshot of its lexical environment (i.e., the non-local variable bindings used in its body).</p>
<p>Hence, closing over some variable v means creating a closure that refers to v.</p>
<p>Strictly, the term “closure” can be used to describe any function that refers to one or more variables in an outer lexical scope. This is a rather broad definition that includes, for example, all functions that refer to global variables (such as document, alert, String, and so on).</p>
</blockquote>
<p>This can be very handy if you want, say, an event handling method to interact with both the HTML element the handler is attached to, and the parent object to which the method belongs. Huh? Exactly.</p>
<p>Let&#8217;s say you want to write a JavaScript object which encapsulates all of your form validation and preprocessing logic. Let&#8217;s say you want this object definition to include event handlers which validate form elements. After validation, you want the form elements to be visually updated to indicate if the value is correctly entered or not, and update the JS Object with any validation error messages.</p>
<p>First let&#8217;s write up some simple event handling utilities.</p>
<div><code>
<pre>// creates a function which
// 		executes an event handling method
// 		in the scope of a given object
function getBoundEventHandler(obj,method)
{
	return function(e)
	{
		e = e || window.event;
		method.call(obj,e);
	}
}</pre>
<p></code></div>
<div><code>
<pre>// cross-browser event-adder-on
function observeEvent(strEvent,obj,handle)
{
	if (window.addEventListener)
	{
		// W3C
		obj.addEventListener(strEvent,handle,false);
	}
	else
	{
		// Dirty, dirty MS Internet Explorer
		obj.attachEvent("on"+strEvent,handle);
	}
}</pre>
<p></code></div>
<p>Now let&#8217;s define a simple form handling object, with a simple means to report errors, and validate an alpha-numeric field.</p>
<p>First the constructor function:</p>
<div><code>
<pre>function Formbois(strFormId)
{
	var that = this; // Hot Lexical Closure Action!!
	var this.errors = new Array();
	var this.fieldKeyHandler = function(e)
	{
		// with the handler function bound to the target element,
		//   "this" refers to the form element
		// "that" refers to the Formbois instance
		if (!that.validateAlphaNum(this.value))
		{
			// add an error to the errors array
			that.errors.push("Please enter an alpha-numeric value");
			// mark the form element having an error
			this.className += " error";
		}
		else
		{
			this.className += " valid";
		}

	}
}</pre>
<p></code></div>
<p>Based upon what I mentioned in my previous post, the private variable &#8220;that&#8221; is in the same lexical scope as the function &#8220;fieldKeyHandler&#8221;. That means when I assign that method to a form element, the variable &#8220;that&#8221; will refer to the instance of the object &#8220;Formbois&#8221; allowing me to access the public method &#8220;validateAlphaNum&#8221; and the &#8220;errors&#8221; array. Neat.</p>
<p>Let&#8217;s define the validator and the error reporter for a complete example:</p>
<div><code>
<pre>
Formbois.prototype.validateAlphaNum = function(value)
{
	return value.match(/[a-z][A-z][0-9]/))

}

Formbois.prototype.alertErrors = function()
{
	alert(this.errors.join("\n"));
}</pre>
<p></code></div>
<p>Neither of these methods have access to the private variable &#8220;that&#8221;, but that&#8217;s OK because they don&#8217;t need it. The method &#8220;validateAlphaNum&#8221; could even be a static function assigned like so:<br />
<code>Formbois.validateAlphaNum = function(value) { /*[.code goes here.]*/ }</code></p>
<p>To put it all together, we instantiate the &#8220;Formbois&#8221; object and assign our event handler.</p>
<div><code>
<pre>// create form object
var f = new Formbois("happyFunForm");
// get form element
var elm = document.getElementById("someTextFieldId");
// assign event handler to "onkeyup" event
observeEvent(
		"keyup",
		elm,
		getBoundEventHandler(elm,f.fieldKeyHandler)
	);</pre>
<p></code></div>
<p>Obviously this is a very simple example, but hopefully it will inspire someone to write some JavaScript which doesn&#8217;t suck.</p>
]]></content:encoded>
			<wfw:commentRss>http://abouthalf.com/2008/07/20/lexical-closures-are-handy/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JavaScript Scope Blues</title>
		<link>http://abouthalf.com/2008/07/18/javascript_scope_blues/</link>
		<comments>http://abouthalf.com/2008/07/18/javascript_scope_blues/#comments</comments>
		<pubDate>Fri, 18 Jul 2008 15:41:54 +0000</pubDate>
		<dc:creator>MB</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://abouthalf.com/?p=154</guid>
		<description><![CDATA[
I&#8217;ve been working out some methods of making uniquely namespaced JavaScript objects.


I&#8217;m trying to handle a situation where there could be multiple instances of the same object or functions on the same page with the same name. The idea is to prevent one function, variable, or object accidentally writing over another because they have the [...]]]></description>
			<content:encoded><![CDATA[<p>
I&#8217;ve been working out some methods of making uniquely namespaced JavaScript objects.
</p>
<p>
I&#8217;m trying to handle a situation where there could be multiple instances of the same object or functions on the same page with the same name. The idea is to prevent one function, variable, or object accidentally writing over another because they have the same name.
</p>
<p>
I settled on a <a href="http://en.wikipedia.org/wiki/Factory_Pattern">factory pattern</a> which accepts a namespace as a parameter, followed by an array or object of parameters.
</p>
<p>
I start with a factory function which does some simple checking for a namespace, and then calls a constructor function, assigning the resulting object to a global property of the window object.
</p>
<p>
This code assumes that &#8220;namespace&#8221; is a unique value.
</p>
<div><code>
<pre>function myObjFactory(namespace,objParameters)
{
	if (!namespace)
	{
		throw new Error("Null Parameter 'namespace'");
	}
	window[namespace] = new MyObj(objParameters);
}</pre>
<p></code></div>
<p>
So in JavaScript the way to create a custom object is to define a function, and call it with the &#8220;new&#8221; keyword, as above. Your function can accept any parameters you wish. These parameters can be used to set default values in your object, or operated on by internal functions.
</p>
<p>
In JavaScript everything is an object, including functions. Functions have a public property &#8220;caller&#8221; which holds a reference to the function or object which called the function. So in my example below, if I try to call my constructor function from anywhere but the function &#8220;myObjFactory&#8221; it will throw an error. This little trick makes it impossible to instantiate MyObj without myObjFactory, ensuring my design pattern doesn&#8217;t unravel.
</p>
<div><code>
<pre>function MyObj(objParameters)
{
	if (MyObj.caller != myObjFactory)
	{
		throw new Error("No public constructor for MyObj.
			 Use myObjFactory");
	}
	var shy = "private value";
	this.params = objParameters;
	this.arbitraryHandler = function(e) { return e;}
	this.publicFunction = function() { alert(shy);}
}</pre>
<p></code></div>
<p>
Notice that some members of this function are prefixed by &#8220;this&#8221;. Those values become public properties of the object once it&#8217;s instantiate.
</p>
<p>
The variable &#8220;shy&#8221; is scoped within MyObj, so it functions as a private variable. The functions &#8220;arbitraryHandler&#8221; and &#8220;publicFunction&#8221; can both access &#8220;shy&#8221; but shy cannot be accessed from outside the function, e.g. the following would throw an error:
</p>
<div><code>
<pre>//instance of MyObj from the window object;
var moe = window[namespace]
alert(moe.shy); // FAIL - private variable.</pre>
<p></code></div>
<p>
Super. Now I have public and private members in JavaScript. And they said it couldn&#8217;t be done!
</p>
<p>
The OO JavaScript convention is to write a lean constructor object, and then append public methods or properties to the function&#8217;s <em>prototype</em> property. Like so:
</p>
<p><code>
<pre>MyObj.prototype.newProperty = "shiny";
MyObj.prototype.newMethod = function(parm) {alert(parm);}</pre>
<p></code></p>
<p>
Anything you add to an object&#8217;s prototype is available to all instances of that object.
</p>
<p>
But here&#8217;s where I got off the rails. Remember my private member &#8220;shy&#8221;? The variable &#8220;shy&#8221; isn&#8217;t a private member in the same way that a member is private in a classical language like Java or C#.
</p>
<p>
It only acts private because it available to the local scope of the constructor function. So when I tried something like this, it fails:
</p>
<p><code>
<pre>MyObj.prototype.getShy = function() {alert(shy);} //FAIL</pre>
<p></code></p>
<p>
Doh. What went wrong?
</p>
<p>
All members of objects in JavaScript are public, any variables tucked away within a function are local to that function. When I added a method to the objects prototype, the local scope of the function is not available (and to be double plus specific, I added a method to the object&#8217;s <em>prototype</em> which in reality is the object which my object is based upon or inherits from; Object in this case; so I was really adding a public method to an entirely different object)
</p>
<p>
To summarize, if you&#8217;re writing OO JavaScript, and you want to store some private values accessible by public methods - place both your private values <em>and</em> your public methods in the same scope, i.e. the constructor function.
</p>
<p>
This also opens up a neat trick called a &#8216;lexical closure&#8217; which can be very handy when writing complex event handlers or callback functions &#8212; which I&#8217;ll write about next time.</p>
]]></content:encoded>
			<wfw:commentRss>http://abouthalf.com/2008/07/18/javascript_scope_blues/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Weekend Round-up</title>
		<link>http://abouthalf.com/2008/07/06/weekend-round-up/</link>
		<comments>http://abouthalf.com/2008/07/06/weekend-round-up/#comments</comments>
		<pubDate>Sun, 06 Jul 2008 18:47:49 +0000</pubDate>
		<dc:creator>MB</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Personal]]></category>

		<category><![CDATA[Play]]></category>

		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://abouthalf.com/?p=150</guid>
		<description><![CDATA[Just when I thought &#8220;A List Apart&#8221; had become a useless dried up husk of RoR wankers, they turn around and publish this gem of an article: Getting Out of Binding Situations in JavaScript
I&#8217;ve read various descriptions of &#8216;binding&#8217; in JavaScript before, but this is probably the most clear explanation I&#8217;ve seen. As a bonus, [...]]]></description>
			<content:encoded><![CDATA[<p>Just when I thought &#8220;A List Apart&#8221; had become a useless dried up husk of RoR wankers, they turn around and publish this gem of an article: <a href="http://www.alistapart.com/articles/getoutbindingsituations">Getting Out of Binding Situations in JavaScript</a></p>
<p>I&#8217;ve read various descriptions of &#8216;binding&#8217; in JavaScript before, but this is probably the most clear explanation I&#8217;ve seen. As a bonus, someone in the comments linked to this fine, incredibly thorough, advanced discussion of binding: <a href="http://www.brockman.se/writing/method-references.html.utf8">Object-Oriented Event Listening through Partial Application in JavaScript</a>.</p>
<p>You can tell by the title that this article is not for the faint of heart. (hint: start with the ALA article)</p>
<hr />
<p><a href="http://37signals.blogs.com/products/2008/07/basecamp-phasin.html">37 Signlas</a> is dropping support for Internet Explorer 6. It must be nice to fire your customers from time to time.</p>
<hr />
<p><img src="http://abouthalf.com/wp-content/uploads/2008/07/me-and-she-at-the-beach.jpg" alt="Me and She at the beach" title="me-and-she-at-the-beach" width="350" height="262" class="alignnone size-full wp-image-151" /></p>
<p>The missus and spent a lovely Saturday at Cannon Beach, OR. We had it all. Blankets, towels, trashy magazines to read, hot dogs, marshmallows. Except Ketchup. And Sunscreen. Ouch.</p>
<hr />
<p>The first honeymoon is fast approaching. We&#8217;re taking the train up to Seattle to stay in a kitschy old <a href="http://www.moorehotel.com/">hotel</a> and eat at a swanky tucked away <a href="http://www.thepinkdoor.net/">restaurant</a> rumored to have a trapeze act and a burlesque show. Ooh La La.</p>
<hr />
<p><img src="http://abouthalf.com/wp-content/uploads/2008/07/independence-day-with-a-dutchman.jpg" alt="Independence Day with a Dutchman" title="independence-day-with-a-dutchman" width="350" height="262" class="alignnone size-full wp-image-152" /></p>
<p>I spent part of the Fourth in a friend&#8217;s back yard grilling various things and eating fancy cheese. We had a Dutchman (pictured) and a Brit in attendance (along with various liberal Portlandy types). Viva La Independencia.</p>
<hr />
<p>I&#8217;ve caved into the pressure and signed up on the <a href="http://www.facebook.com/profile.php?id=1327749623">Facebook</a>. And while I&#8217;m at it, I&#8217;m on the <a href="http://www.linkedin.com/in/abouthalf">LinkedIn</a> too. Damn kids. And their internets.</p>
<p>I&#8217;ve been using the <a href="http://twitter.com/device55">Twitter</a> lately also. I&#8217;m not sure how I feel about it. Like any good RoR app: it&#8217;s horribly unreliable; it&#8217;s purpose is rather unclear; and all the cool kids are doing it. Twitter claims to be a &#8220;micro blogging&#8221; application, but people use it as an ad-hoc messaging system or bulletin board. It is useful for keeping up with prolific bloggers. The <a href="http://twitter.com/MarsPhoenix">Mars Phoenix program</a> has been posting updates as well, which is fairly neato. However, <em>I&#8217;m</em> not convinced it&#8217;s worth <em>my</em> time to post anything.</p>
]]></content:encoded>
			<wfw:commentRss>http://abouthalf.com/2008/07/06/weekend-round-up/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Greatest Comment Ever Commented</title>
		<link>http://abouthalf.com/2008/07/01/the-greatest-comment-ever-commented/</link>
		<comments>http://abouthalf.com/2008/07/01/the-greatest-comment-ever-commented/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 02:18:21 +0000</pubDate>
		<dc:creator>MB</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://abouthalf.com/?p=148</guid>
		<description><![CDATA[On the Metafilter there is a lengthy thread discussing the new Pixar flick Wall*E (and the critical response thereof). One comment is an incredible story about how a girl, a video, and the resulting wrap party in San Francisco. The comment opens with &#8220;Here&#8217;s a true story about how awesome Pixar is.&#8221; And it&#8217;s perfectly [...]]]></description>
			<content:encoded><![CDATA[<p>On the Metafilter there is a lengthy thread discussing the new Pixar flick Wall*E (and the critical response thereof). One comment is an incredible story about how a girl, a video, and the resulting wrap party in San Francisco. The comment opens with &#8220;Here&#8217;s a true story about how awesome Pixar is.&#8221; And it&#8217;s perfectly accurate. The comment is linked here:</p>
<p><a href="http://www.metafilter.com/72958/Wowe-Malthusian-Fear-Mongering-Can-Be-Annoying#2167675">Wow-e: Malthusian Fear Mongering Can Be Annoying | MetaFilter</a></p>
<p>The comment includes links to the <a href="http://betteronme.blogspot.com/2007/10/i-watch-walle.html">video</a>, and some <a href="http://www.flickr.com/photos/contusion/2546329988/">great</a> <a href="http://www.flickr.com/photos/contusion/2547820544/in/set-72157605401403923/">pics</a> from the event.</p>
<p>Go and give this a read, and bask in the warm glowy feeling that the world still has nice people in it.</p>
]]></content:encoded>
			<wfw:commentRss>http://abouthalf.com/2008/07/01/the-greatest-comment-ever-commented/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Little Things (regarding upgrades)</title>
		<link>http://abouthalf.com/2008/05/31/little-things-regarding-upgrades/</link>
		<comments>http://abouthalf.com/2008/05/31/little-things-regarding-upgrades/#comments</comments>
		<pubDate>Sat, 31 May 2008 19:07:57 +0000</pubDate>
		<dc:creator>MB</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://abouthalf.com/?p=145</guid>
		<description><![CDATA[Back when tax returns came out I did myself a little favor and upgraded to OS X 10.5 and purchased an AppleTV (Thanks institution of marriage!)
The AppleTV is a great toy. I purchased the smaller one (hard drive). Since the appliance connects to 5 computers on your home network, there&#8217;s really no reason to have [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://abouthalf.com/wp-content/uploads/2008/05/appletv.jpg" alt="AppleTV" title="AppleTV" width="150" height="112" class="top" />Back when tax returns came out I did myself a little favor and upgraded to OS X 10.5 and purchased an <a href="http://www.apple.com/appletv/">AppleTV</a> (Thanks institution of marriage!)</p>
<p>The AppleTV is a great toy. I purchased the smaller one (hard drive). Since the appliance connects to 5 computers on your home network, there&#8217;s really no reason to have a giant hard drive. Any media you want to access gets streamed right over.</p>
<p>Renting movies and buying TV shows on demand is nice. And yes, I&#8217;m fully aware that I payed $299 for the privilege of spending more money from the convenience of my couch. I <a href="/2007/04/01/how-to-lose-a-cable-television-customer-in-one-easy-step/"><em>hate</em></a> cable providers with a fiery burning passion. I am happy to give money to Netflix and iTunes. The on-demand model is perfect for me, because I want what I want when I want it and that&#8217;s all I want. And, I&#8217;m happy to pay for that. Comcast and their dirty brethren have yet to understand that. They are still trying to float a &#8220;you&#8217;ll take what we give you on our terms&#8221; business model. My magic 8-ball says that strategy is doomed in the near-ish future.</p>
<p>The more I think about it, the subscription entertainment model is pretty flawed. If you have a job, and you&#8217;re not a vampire, there&#8217;s only so much time in the day you could possibly be watching television. When I get home from my day job I like to do things like fix up a martini, <a href="http://blueplatebachelor.com">cook dinner</a>, seduce my wife, and work on my little projects. <em>Sometimes</em> we like to sit and watch <em>a</em> show or two. It&#8217;s just dumb to pay a large monthly fee for junk piped into your home that you aren&#8217;t even home to watch. And I don&#8217;t like TV <em>that</em> much anyway. The only exceptions I can think of are news junkies (barf - cable news is trash) and sports fans. (In fact one of my friends back east signs up for cable just long enough each year to watch the ACC Tournament.)</p>
<p>But, I digress.</p>
<p>The surprising thing about the AppleTV is how much I use it as a stereo. I haven&#8217;t had a &#8216;real&#8217; stereo system for years. I either listen to my iPod/iPhone or plug speakers into the computer. </p>
<p>Why, no. I&#8217;m not an audiophile. I <em>like</em> music.</p>
<p>Plugged into my TV&#8217;s audio system the sound is good, and it&#8217;s really cool to see a giant picture of the album cover and the track info swooshing around on the screen.</p>
<hr />
<p>I&#8217;m liking OS 10.5, Leaping Leopard, quite a bit. I bought it for one feature only and that&#8217;s <a href="http://www.apple.com/macosx/features/timemachine.html">Time Machine.</a> I had cobbled together an Automater Script with rsync to do a weekly back up of my hard drive to an external drive and it worked OK, but Time Machine beats it simply because it&#8217;s automated and hides in the background.</p>
<p><img src="http://abouthalf.com/wp-content/uploads/2008/05/safarirsscount.gif" alt="Safari RSS Count" title="Safari RSS Count" width="192" height="139" class="top" />I have found some odd behavior in a few places. The RSS feed counters in Safari (which indicate how many unread articles are waiting for you in a news feed) gets all out of whack sometimes. You can view an article, and the counter will not update. Odd. This worked fine in previous versions. </p>
<p><img src="http://abouthalf.com/wp-content/uploads/2008/05/itunesdrag.gif" alt="No spring loaded folders in iTunes" title="No spring loaded folders in iTunes" width="196" height="155" class="push-0" />Also, there is an annoying inconsistency in iTunes&#8217; behavior. For example, in Mail, if you click and drag a message or selection of messages to a closed folder it pops open so you can drop items in the folder below. Same is true in the Finder. iTunes doesn&#8217;t do this however. If you want to drag items into a playlist, and your playlist list is closed, iTunes just sits there. Mocking you.</p>
]]></content:encoded>
			<wfw:commentRss>http://abouthalf.com/2008/05/31/little-things-regarding-upgrades/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The United Mexican States Would Like to Thank the US for the Economic Stimulus Package</title>
		<link>http://abouthalf.com/2008/05/26/the-united-mexican-states-would-like-to-thank-the-us-for-the-economic-stimulus-package-2/</link>
		<comments>http://abouthalf.com/2008/05/26/the-united-mexican-states-would-like-to-thank-the-us-for-the-economic-stimulus-package-2/#comments</comments>
		<pubDate>Mon, 26 May 2008 16:34:27 +0000</pubDate>
		<dc:creator>MB</dc:creator>
		
		<category><![CDATA[Play]]></category>

		<guid isPermaLink="false">http://abouthalf.com/2008/05/26/the-united-mexican-states-would-like-to-thank-the-us-for-the-economic-stimulus-package-2/</guid>
		<description><![CDATA[My lovely wife is spending the month of May in Guadalajara, Jalisco, Mexico working in an albergue which serves a local hospital.
An albergue is sort of an inn or hostel, and in this particular case it houses people who have traveled across Mexico to seek medical attention in Guadalajara. They charge a very small fee [...]]]></description>
			<content:encoded><![CDATA[<p>My lovely wife is spending the month of May in <a href="http://en.wikipedia.org/wiki/Guadalajara%2C_Jalisco">Guadalajara, Jalisco, Mexico</a> working in an <a href="http://dictionary.reference.com/languages?db=languages&#038;lang=ES&#038;AR=on&#038;ZH=on&#038;TW=on&#038;CS=on&#038;DK=on&#038;NL=on&#038;ET=on&#038;FI=on&#038;FR=on&#038;DE=on&#038;EL=on&#038;HU=on&#038;IS=on&#038;ID=on&#038;IT=on&#038;JA=on&#038;KO=on&#038;LV=on&#038;LT=on&#038;NO=on&#038;PL=on&#038;BR=on&#038;PT=on&#038;RO=on&#038;RU=on&#038;SK=on&#038;SL=on&#038;ES=on&#038;SV=on&#038;TR=on&#038;continue=y&#038;q=albergue">albergue</a> which serves a local hospital.</p>
<p>An albergue is sort of an inn or hostel, and in this particular case it houses people who have traveled across Mexico to seek medical attention in Guadalajara. They charge a very small fee for housing, meals, shower, and laundry facilities. In addition they provide some medicine and care. Many of the workers there help by simply being social with their guests. There are many families there waiting for the outcome of an operation or procedure, and providing someone to talk to helps keep spirits alive.</p>
<p><img src='http://abouthalf.com/wp-content/uploads/2008/05/plaza_centro.JPG' class='top' alt='Plaza in the center of Guadalajara' /></p>
<p>I slipped down to Guadalajara for a few days to visit and see the sites. Caroline took me on a quick tour of the albergue and the hospital it serves, then we headed into the center of town (Centro) and looked in shops and bought strange grapefruit sodas and felt deliciously foreign. I think we saw <em>maybe</em> four Americans on the trip. (Which is fine. I see those jerks all the time.)</p>
<p>Guadalajara is a big, bustling, noisy, dirty city. The buses are crammed full of people. The traffic is terrible. There is intense wealth and poverty coexisting on the same city block. I loved it.</p>
<p class='clear'><img src='http://abouthalf.com/wp-content/uploads/2008/05/art.JPG' alt='Public Art in the Centro' class='top' />There is a lot of public art scattered around the city. Even in the (very American) shopping mall we spent an afternoon in (surreal) had lots of sculpture in between the department stores and on the stairs. </p>
<p class='clear'><img src='http://abouthalf.com/wp-content/uploads/2008/05/casa_fuerta.JPG' alt='Casa Fuerta' class='top' />In the <a href="http://en.wikipedia.org/wiki/Tlaquepaque%2C_Jalisco">Tlaquepaque</a> <a href="http://www.spanish-mexico.com/tlaquepaque/">neighborhood</a> (a small town that got engulfed by ever-growing Guadalajara, now an arts district) we saw loads of art; local, regional, and international; and piles of leather work and perhaps the most beautiful <a href="http://www.fodors.com/world/mexico-and-central-america/mexico/guadalajara/review-176374.html">restaurant</a> I&#8217;ve ever <a href="http://www.flickr.com/photos/edfladung/32483681/in/photostream/">seen</a>. </p>
<p><img src='http://abouthalf.com/wp-content/uploads/2008/05/caro_at_casa_fuerte.JPG' alt='Caroline at Casa Feurte' class='push-0' /> <img src='http://abouthalf.com/wp-content/uploads/2008/05/queso_fundido.JPG' alt='Queso Fundido' class='push-0' /></p>
<p>We took one day trip out to <a href="http://en.wikipedia.org/wiki/Tequila%2C_Jalisco">Tequila</a> to visit the <a href="http://www.tequilacofradia.com/">Cofradia Tequila factory</a>. As you approach Tequila, the first sign of the town are the fields of blue agave (from which tequila is made). When I say &#8220;blue&#8221; I mean &#8220;wow that plant is really blue&#8221;. It&#8217;s the strangest thing to see these spiny blue plants against the brown landscape. It looks like the earth bristled up a blue, spiky protest against the sky, and then years later people learned you could get drunk off it.</p>
<p><img src='http://abouthalf.com/wp-content/uploads/2008/05/tequila_fermenting.JPG' alt='18,000 Liter vats for fermenting tequila' class='top' />I returned home mid-week to dull, grey, cold Portland weather deeply regretting that I didn&#8217;t stay longer.</p>
<p>(And yes, our Economic Stimulus checks were cashed and promptly exchanged for pesos and spent on bus fare, taxis, food, gifts, tequila, and tequila)</p>
]]></content:encoded>
			<wfw:commentRss>http://abouthalf.com/2008/05/26/the-united-mexican-states-would-like-to-thank-the-us-for-the-economic-stimulus-package-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Interesting Company</title>
		<link>http://abouthalf.com/2008/02/04/interesting-company/</link>
		<comments>http://abouthalf.com/2008/02/04/interesting-company/#comments</comments>
		<pubDate>Tue, 05 Feb 2008 06:20:04 +0000</pubDate>
		<dc:creator>MB</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://abouthalf.com/2008/02/04/interesting-company/</guid>
		<description><![CDATA[ This is an interesting set of recommendations on my iTunes receipt.
Perhaps I haven&#8217;t been giving Ms. Lavigne enough credit. I mean to show up along side Sam Harris, Terry Gross, and Richard Dawkinsâ€¦I mean. Wow Alrightâ€¦I admit it. I purchased Candyman. It&#8217;s awesome. It has a Campari girl!
I just purchased Christopher Hitchens&#8217; God is [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://abouthalf.com/wp-content/uploads/2008/02/selection.jpg' alt='Interesting Selection' class="top" /> This is an interesting set of recommendations on my iTunes receipt.</p>
<p>Perhaps I haven&#8217;t been giving Ms. Lavigne enough credit. I mean to show up along side Sam Harris, Terry Gross, and Richard Dawkinsâ€¦I mean. Wow Alrightâ€¦I admit it. I purchased <a href="http://youtube.com/watch?v=W4kR8OQCrlQ">Candyman</a>. It&#8217;s awesome. It has a <a href="http://en.wikipedia.org/wiki/Campari">Campari girl</a>!</p>
<p>I just purchased Christopher Hitchens&#8217; <a href="http://en.wikipedia.org/wiki/God_is_not_great">God is not Great</a> and while there are no broad-shouldered singing soldiers or sexy girls in pencil skirts, it&#8217;s a fantastic book to hear read aloud (by the author).</p>
<p>It makes one feel all smug* and warm in a wooly academic sweater while listening to some erudite Brit Ex-pat on the radio.</p>
<p>The narrative is a striking balance of personal history wrapped in anecdotal history. Or perhaps it&#8217;s the other way around, in reverse. The book reads, not so much like an argument, but an extended description of one (very smart) man&#8217;s thoughts on the subject.</p>
<p>It&#8217;s challenging subject matter, no matter your personal philosophy and give one much to think about.</p>
<p>*Not a typo</p>
]]></content:encoded>
			<wfw:commentRss>http://abouthalf.com/2008/02/04/interesting-company/feed/</wfw:commentRss>
		</item>
		<item>
		<title>These are headlines</title>
		<link>http://abouthalf.com/2008/01/16/these-are-headlines/</link>
		<comments>http://abouthalf.com/2008/01/16/these-are-headlines/#comments</comments>
		<pubDate>Thu, 17 Jan 2008 03:46:11 +0000</pubDate>
		<dc:creator>MB</dc:creator>
		
		<category><![CDATA[Design]]></category>

		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://abouthalf.com/2008/01/16/these-are-headlines/</guid>
		<description><![CDATA[Recent news followed by my pithy remarks.
MacBook Air Announced Without Pony. Bloggers Demand Pony.
The (ever) Daring Fireball and Paul Boutin at Slate are lamenting the fact that the newly announced Mac sub-notebook doesn&#8217;t have some manner of cellular EVDO type of use-anywhere-networking-just-like-the-iPhone support. A quote:
Like me, Boutin was hoping for ubiquitous wireless networking. The more [...]]]></description>
			<content:encoded><![CDATA[<p>Recent news followed by my pithy remarks.</p>
<h2><a href="http://www.apple.com/macbookair/">MacBook Air</a> Announced Without Pony. Bloggers Demand Pony.</h2>
<p><a href="http://daringfireball.net/linked/2008/january#wed-16-boutin">The (ever) Daring Fireball</a> and <a href="http://slate.com/id/2182227/">Paul Boutin at Slate</a> are lamenting the fact that the newly announced Mac sub-notebook doesn&#8217;t have some manner of cellular <a href="http://en.wikipedia.org/wiki/Evolution-Data_Optimized">EVDO</a> type of use-anywhere-networking-just-like-the-iPhone support. A quote:</p>
<blockquote><p>Like me, Boutin was hoping for ubiquitous wireless networking. The more I think about this, the more certain I am that itâ€™s just silly that my phone always has a network and (as of yesterday) knows where it is, but my Mac doesnâ€™t.</p></blockquote>
<p>While, yes, it may in fact be technically feasible to incorporate a cellular card into a skinny little laptop and offer the same clever network switch-a-roo technology that is in the iPhone, that doesn&#8217;t mean it&#8217;s a good or profitable idea.</p>
<p>To rebut this point: It&#8217;s a laptop, not a phone! Do you need your TV to geo-locate? How about your printer? Maybe your microwave?</p>
<p>To rebut in a slightly more classy fashion, Consider the two following use cases:</p>
<ol>
<li>You are in a new or unfamiliar location, perhaps walking or driving. Perhaps you&#8217;ve missed a turn out in the &#8216;burbs. You realize &#8220;oh foo, I don&#8217;t know where I am any more.&#8221; You need directions.</li>
<li>You suddenly realize you&#8217;re in a strange coffee shop, using your laptop, and realize &#8220;oh foo, I don&#8217;t know where I am&#8221;. You need directions.</li>
</ol>
<p>I&#8217;m going to wager that case 1 is the most common. I can remember at least a few times I&#8217;ve been in just that predicament. This is why the iPhone has a Google Maps application with a location feature.</p>
<p>If case number 2 is happening to you often enough to consider a laptop upgrade, perhaps you need to switch to decaf.</p>
<p>Paul Boutin, in his article, posits the scenario where he&#8217;s riding shotgun in a car, and wants to help the driver with directions, so he <em>wants to dig around in his bag and boot up his laptop instead of picking up a cellphone and calling for directions.</em> This strikes me as an edge case.</p>
<p>I think that is what Apple thinks too. Yeah, they could do it. But why?</p>
<p>There are hard-core super road warriors who need connectivity everywhere. But these guys are (a) a small market and (b) are purchasing &#8220;pro&#8221; versions of laptops and plugging in whatever wireless provider&#8217;s card they need.</p>
<p>There&#8217;s a laundry list of other reasons why this is a dumb idea for this particular computer:</p>
<ul>
<li>Who will the provider be, Sprint? ATT? Should Apple standardize on one provider, or provide generic hardware? If so, who supports what? Can Apple guarantee that fickle telecommunications companies won&#8217;t pull the plug on hardware support in a year?</li>
<li>What hardware standard do you support? Do you hope for 3G? Do you use Edge? Do you put a giant chunky card-slot on your sleek, whisper thin computer that only 1 out of a 100 owners will use?</li>
<li>See above, the target customer for this computer doesn&#8217;t want this.</li>
<li>Data connections over cellular networks suck, yes even 3G is only as good as a good dial-up connection.</li>
<li>The MacBook Air sports 5 hours of battery life. How&#8217;d you like to make that <em>3</em>?</li>
</ul>
<p>I see three big markets for the MacBook Air, in descending order:</p>
<ol>
<li>People with one beefy machine at home or in the office who want a second, small computer for traveling, giving presentations, or otherwise using on the go</li>
<li>Students. This laptop will fit in your <a href="http://www.trapperkeeper.com/">TrapperKeeper</a> along side all 18 of your chemistry books. (When I mentioned the Air to my wife she remarked &#8220;oh, what I wanted a year ago.&#8221;)</li>
<li>People who don&#8217;t need or want a beefy computer, and want something small and light that looks nice and isn&#8217;t complicated (Hi Paris!).</li>
</ol>
<h2>Hosting Provider Makes Point. Point Missed.</h2>
<p>It started here:<br />
<a href="http://blog.dreamhost.com/2008/01/07/how-ruby-on-rails-could-be-much-better/">http://blog.dreamhost.com/2008/01/07/how-ruby-on-rails-could-be-much-better/</a></p>
<p>And went here:<br />
<a href="http://www.al3x.net/2008/01/shared-hosting-is-ghetto.html">http://www.al3x.net/2008/01/shared-hosting-is-ghetto.html</a></p>
<p>Link number one - the author, a tech at Dreamhost (where I host my web sites), writes a constructive article detailing the difficulties they encountered in trying to support the Ruby On Rails framework. Also, he articulates his opinion that if the Rails community could standardize their hosting and deployment practices - or at least provide a set of best practices that can be easily repeated - and make it easy to deploy in shared hosting environments, it would really benefit Rails developers (to provide cheap hosting environments for learning and development) and help promote Rails as a technology.</p>
<p>These are true statements, with which I agree completely. (They are also born out by tales of woe I&#8217;ve heard myself from folks who tried to manage their own Rails environment, on their own servers.)</p>
<p>Link number two: Rails dude gets snippy and calls shared hosting a ghetto (in reference to an <a href="http://www.zedshaw.com/rants/rails_is_a_ghetto.html" title="Long, Technical, Ranty">article</a> by an ex-Rails developer) and misses the point entirely. This second article makes points about how Java and Python have stayed away from shared hosting (<a href="http://www.google.com/search?hl=en&#038;safe=off&#038;rls=en&#038;q=java+hosting&#038;btnG=Search">not</a> entirely <a href="http://www.google.com/search?rls=en&#038;q=shared+Python+hosting&#038;ie=UTF-8&#038;oe=UTF-8 ">true</a>). He then proceeds to discuss his preference for the &#8220;nightmare&#8221; of setting up his own server versus the nightmare setting up a shared server (pick your poison, I suppose). </p>
<p>He concludes by incorrectly identifying a popular hosted PHP application as a Rails app and trying to argue that shared hosting wouldn&#8217;t make him any money. Oh. Well then. Point made, I guess.</p>
<p>Dallas Kashuba at the Dreamhost blog is correct. Rails is very troublesome to host and deploy. This problem - regardless of whether the hosting is in the shared hosting ghetto or in your personal server farm - is still a problem and a deal-breaker for a lot of people. It certainly was for me. Getting all snippy doesn&#8217;t change that fact.</p>
<p>The Michael Barrett Professional Opinionâ„¢ is that Ruby on Rails is all sizzle and no steak. The development problems it solves are only solved if you&#8217;re starting with a fresh, clean, empty database; have no legacy systems or data to integrate to, and have lots of time to babysit a server. </p>
<p>Call me when RoR reaches version 3, 4, or 5. Maybe we&#8217;ll try again.</p>
]]></content:encoded>
			<wfw:commentRss>http://abouthalf.com/2008/01/16/these-are-headlines/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.843 seconds -->
