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

<channel>
	<title>d.c.Holth</title>
	<atom:link href="http://blog.dcholth.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.dcholth.com</link>
	<description>(mis)adventures in the splinterweb</description>
	<lastBuildDate>Fri, 01 Mar 2013 20:27:51 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>AngularJS: Building My Rotten App</title>
		<link>http://blog.dcholth.com/2013/03/01/angularjs-building-my-rotten-app/</link>
		<comments>http://blog.dcholth.com/2013/03/01/angularjs-building-my-rotten-app/#comments</comments>
		<pubDate>Fri, 01 Mar 2013 20:27:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Software Engineering]]></category>

		<guid isPermaLink="false">http://blog.dcholth.com/?p=1514</guid>
		<description><![CDATA[AngularJS (Angular) is the hot new kid on the JavaScript (JS) frameworks block.  It supports single-page applications and unlike some other frameworks it has a concise Model-View-Controller setup.  Coming from a strong Adobe Flex background, Angular felt like home with its easy two-way data-binding, service models and dependency injection.  Over the past few weeks I&#8217;ve done a [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.dcholth.com/experiments/at_angular/#/top50"><span style="font-size: 13px; line-height: 19px;"><img class="alignnone size-full wp-image-1529" style="font-size: 13px; line-height: 19px;" alt="AngularTomatoesHeader" src="http://blog.dcholth.com/wp-content/uploads/2013/03/Screen-Shot-2013-03-01-at-2.21.09-PM.jpg" width="641" height="197" /></span></a></p>
<p><span style="font-size: 13px; line-height: 19px;">AngularJS (Angular) is the hot new kid on the JavaScript (JS) frameworks block.  It supports single-page applications and unlike some other frameworks it has a concise Model-View-Controller setup.  Coming from a strong Adobe Flex background, Angular felt like home with its easy two-way data-binding, service models and dependency injection.  Over the past few weeks I&#8217;ve done a deep dive into Angular and <a href="http://blog.dcholth.com/experiments/at_angular/#/top50">this demo application</a> is just one part from the fruits of my labor.</span></p>
<p>The application utilizes the Rotten Tomatoes API to display the top 50 box office movies, allows progressive filtering, local pagination, inspecting movie details and favoriting movies with local storage.  Feel free to browse the source code.  I built this in about 3 days, so you&#8217;ll have to excuse a few rough edges here and there, but I&#8217;m pretty happy with the results overall.  It uses <a href="http://jquery.com/">jQuery</a>, <a href="http://twitter.github.com/bootstrap/">Bootstrap</a>, <a href="http://angularjs.org/">Angular</a>, <a href="http://angular-ui.github.com/">Angular UI</a>, <a href="http://bootboxjs.com/">Bootbox</a>, <a href="http://lesscss.org/">LessCSS</a> and <a href="http://modernizr.com/">Modernizr</a>.  Note that I&#8217;m not compiling my LessCSS down to css prior to execution.  In a normal production environment you&#8217;d want to do this, but for demonstrative purposes I like to keep it all out in the open for quick updates.</p>
<p>I&#8217;ve marked up the source code heavily with comments to describe some of the details of the implementation.  I&#8217;m in the process of rebuilding the application using <a href="http://backbonejs.org/">BackboneJS</a> and will write up an extensive blog comparing the development pros and cons of each framework.  Place your bets now on which one you think will win!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dcholth.com/2013/03/01/angularjs-building-my-rotten-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript WebSpinners</title>
		<link>http://blog.dcholth.com/2013/02/05/javascript-webspinners/</link>
		<comments>http://blog.dcholth.com/2013/02/05/javascript-webspinners/#comments</comments>
		<pubDate>Tue, 05 Feb 2013 22:51:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Software Engineering]]></category>

		<guid isPermaLink="false">http://blog.dcholth.com/?p=1493</guid>
		<description><![CDATA[I&#8217;ve been playing around with HTML5&#8242;s new Canvas tag and trying to convert some of my old Flash particle and proximity experiments.  My favorite of these trials has always been the web spinning art (which unfortunately is no longer working on the blog). By using a grid-based proximity manager, you click and drag your mouse [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.dcholth.com/experiments/webs/canvas_exp3.html"><img class=" wp-image-1494 alignright" alt="webs" src="http://blog.dcholth.com/wp-content/uploads/2013/02/webs.jpg" width="380" height="287" /></a></p>
<p>I&#8217;ve been playing around with HTML5&#8242;s new Canvas tag and trying to convert some of my old Flash particle and proximity experiments.  My favorite of these trials has always been the web spinning art (which unfortunately is no longer working on the blog).</p>
<p>By using a grid-based proximity manager, you click and drag your mouse across the canvas.  As you drag, particles are created at your point of contact.  They have a random direction and velocity.  Particles are slightly attracted to each other, so depending on how much velocity they have, they will turn inward towards each other.  There is also friction in the environment that cause the particles to slow down and eventually disappear.</p>
<p>While the code (especially the proximity manager) is pretty ugly, I do take advantage of some new features of the canvas tag, as well as use object-pooling to speed up object creation.</p>
<p>If you are unfamiliar with object-pooling its pretty simple.  When I create a particle, it runs it course and is no longer needed, rather than wait for garbage collection to clean up the particle, I move it to a dead-particles array.  When a new particle is requested, rather than instantiating a new particle (and thus using more memory), I first check if there are any dead particles that can be reused and grab one of those.</p>
<p>I have two versions of the web spinner, a <a href="http://blog.dcholth.com/experiments/webs/canvas_exp3.html">mouse-only desktop</a> version and an <a href="http://blog.dcholth.com/experiments/multitouch_webs/canvas_exp4.html">multi-touch version for tablets &amp; phones.</a>  The multi-touch version does not use the &#8216;lighter&#8217; blend mode or multiple random colors to help speed up performance.  Also note, that since these are experiments, I&#8217;ve done no testing on browsers outside of Chrome or optimized to make touch/mouse events interchangeable.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dcholth.com/2013/02/05/javascript-webspinners/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JavaScript Scope &amp; Closures</title>
		<link>http://blog.dcholth.com/2013/01/25/javascript-scope-closures/</link>
		<comments>http://blog.dcholth.com/2013/01/25/javascript-scope-closures/#comments</comments>
		<pubDate>Fri, 25 Jan 2013 15:30:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Software Engineering]]></category>

		<guid isPermaLink="false">http://blog.dcholth.com/?p=1401</guid>
		<description><![CDATA[One of the biggest challenges facing new JavaScript (JS) developers is the global nature of JS. Unlike other languages, almost everything in JS is global. Scope in computer programming, in simplest terms, is the extend of a properties visibility throughout the code. Many popular programming languages have block scope, meaning that you can enclose code [...]]]></description>
				<content:encoded><![CDATA[<p>One of the biggest challenges facing new JavaScript (JS) developers is the global nature of JS. Unlike other languages, almost everything in JS is global. Scope in computer programming, in simplest terms, is the extend of a properties visibility throughout the code. Many popular programming languages have block scope, meaning that you can enclose code within curly braces and hide it from other code. Take a look at the code block below:</p>
<p><span id="more-1401"></span></p>
<pre class="prettyprint linenumstrigger linenums noescape lang-js linenumstrigger" style="background-color: #eeeeee; line-height: 1.5em;">var aGlobalProperty = &quot;I'm global!&quot;;

{
     var aBlockScopedProperty = &quot;I'm block scoped!&quot;;
}

console.log(&quot;aGlobalProperty&quot; + aGlobalProperty);
console.log(&quot;aBlockScopedProperty&quot; + aBlockScopedProperty);
// I'm global!
// I'm block scoped!

/*If JS had block scope, this would result in 'undefined' 
  for our aBlockScopedProperty since it should have existed
  only within our brackets above.

  Unfortunately JavaScript does not provide blockscope, and 
  consequently, it can be difficult to organize code in a
  manner that does not allow for easy access and manipulation 
  of properties. Thankfully, JS does provide functional scope. 
  Properties created within a function are private to that 
  function and its descendants. */

var aClosureFunction = function() {
     var aFunctionalScopedProperty = &quot;I'm functionally scoped!&quot;;
     console.log(aFunctionalScopedProperty);
     // I'm functionally scoped!
};

/* Here our property has printed out as normal since it has access to it
   from within the function. */

  If I tried to do any of the calls commented out below, I would get
  either a TypeError undefined or a ReferenceError since the property
  isn't visible from outside the function. (note that there is more
  wrong with the commented out log statements than just the scope) */

//console.log(&quot;outside function: &quot; + aFunctionalScopedProperty);
//console.log(&quot;or from function: &quot; + aClosureFunction.aFunctionalScopedProperty);</pre>
<p>Functional scope does allow us to do some clever tricks to help encapsulate our properties and protect them from outside meddling and colliding property names.  Lets take a look at a few types of the common closures.</p>
<pre class="prettyprint linenumstrigger linenums noescape lang-js linenumstrigger" style="background-color: #eeeeee; line-height: 1.5em;">var aGlobalVariable = &quot;I'm global!&quot;;
function myGetterFunction() {
   var notGlobal = &quot;I'm not global!&quot;;
   return function() {
     return notGlobal;
   }(); // self executing
};

/* Now if I were to try to access 'notGlobal'
   from outside the function, I'd get an error.
   However, I can still access it by executing
   the myGetterFunction function and setting
   the result to another function */

var firstAccess = myGetterFunction();

console.log( firstAccess ); // I'm not global!

/* The resulting function now gives the rest of
   our application access to the value of notGlobal in
   our myGetterFunction.

   Lets take this idea one step further and allow
   the properties to be modified via global getter and
   setter functions */

var getVar;
var setVar;
(function() {
   var notGlobal = &quot;I'm a different not global property!&quot;;
   getVar = function(){
      return notGlobal;
   }
   setVar = function(value) {
      notGlobal = value;
   }
})();

console.log( getVar() );
// I'm a different not global property!

setVar(&quot;You've changed me.&quot;);
console.log( getVar() );
// You've changed me.

/* Our closure is complete because our global functions getVar
   and setVar still keep access to the anonymous self-executing
   functions notGlobal variable. We are able
   to update and modify it at will with our getVar() and setVar()
   functions that were passed back in returned object map.

   We're able to do this bit of cleverness due to
   JavaScript's awesome, and sometimes frustrating, ability
   to treat nearly everything as a transferable piece of
   data - even functions! */

console.log( firstAccess );
// I'm not global!

/*  */</pre>
<p>Also notice that even though both &#8216;myGetterFunction&#8217; and the getVar/setVar functions both have properties named &#8216;notGlobal&#8217; they are both unique. We have prevented them from being global through the use of our functional scope closures.</p>
<p>Now lets take it one step further and create a utility class that creates new string generating functions.</p>
<pre class="prettyprint linenumstrigger linenums noescape lang-js linenumstrigger" style="background-color: #eeeeee; line-height: 1.5em;">function addSurname(surname) {
	var name = surname; // this actually isn't necessary as we'll see later
	return function( firstname ) {
		return firstname + &quot; &quot; + surname;
	}
}

var makeLannister = addSurname(&quot;Lannister&quot;);
var makeStark = addSurname(&quot;Stark&quot;);

var theQueen = makeLannister(&quot;Cersei&quot;);
var theImp = makeLannister(&quot;Tyrion&quot;);

var theHand = makeStark(&quot;Eddard&quot;);
var makeBestCharacter = makeStark(&quot;Arya&quot;);

console.log('The Queen: ' + theQueen);
// The Queen: Cersei Lannister
console.log('The Imp: ' + theImp);
// The Imp: Tyrion Lannister
console.log('The Hand: ' + theHand);
// The Hand: Eddard Stark
console.log('The Best Character: ' + makeBestCharacter);
// The Best Character: Arya Stark</pre>
<p>Neato! You should now be getting a better feel for how closures can help simplify your code and protect your properties from meddling. Unless our new function &#8216;makeLannister&#8217; gets overridden, we never have to worry about it&#8217;s hidden &#8216;name&#8217; property being changed.</p>
<p>Lets take a look at one final practical example where we use closures to help extend objects.</p>
<pre class="prettyprint linenumstrigger linenums noescape lang-js linenumstrigger" style="background-color: #eeeeee; line-height: 1.5em;">function makeWarrior( name, weapon, armor) {
	var life = 100;
	function _fight() {
		return (name + ' swings his ' + weapon );
	}

	function _defend() {
		life = life - 25;
		return (name + ' takes a hit on his ' + armor);
	}

	function _getLife() {
		if( life &amp;gt; 0 ) {
			return (name + ' has ' + life + ' points.');
		} else {
			return (name + ' is dead.  So sad.');
		}
	}

	return { fight:_fight, defend:_defend, getLife:_getLife }
}

var sandorClegane = makeWarrior('The Hound', 'great sword', 'heavy armor');
sandorClegane.fight();

var bronn = makeWarrior('Bronn', 'sword and dagger', 'light armor');
bronn.fight();

console.log( sandorClegane.fight() );
// The Hound swings his great sword
console.log( bronn.defend() );
// Bronn takes a hit on his light armor
console.log( bronn.defend() );
// Bronn takes a hit on his light armor
console.log( bronn.getLife() );
// Bronn has 50 points.
console.log( bronn.defend() );
// Bronn takes a hit on his light armor
console.log( bronn.defend() );
// Bronn takes a hit on his light armor 
console.log( bronn.getLife() );
// Bronn is dead.  So sad.

/* Lets make a new warlock that uses
   closures to extend our warrior function */

function makeWarlock( name, type, weapon ) {
	var uber = makeWarrior(name, weapon, 'mage robes');
	_defend = uber.defend;
	_uberFight = uber.fight;

	uber.fight = function() {
		return (name + ' uses his ' + weapon + ' to avoid fighting directly.');
	}

	function _castSpell() {
		return (name + ' casts an ' + type + &quot;'s spell&quot;);
	}

	return { castSpell:_castSpell, fight:uber.fight, defend:_defend, uberFight:_uberFight};
}

var pyatPree = makeWarlock('Pyat Pree', 'illusionist', 'cunning');
console.log( pyatPree.castSpell() );
// Pyat Pree casts an illusionist's spell
console.log( pyatPree.fight() );
// Pyat Pree uses his cunning to avoid fighting directly.
console.log( pyatPree.defend() );
// Pyat Pree takes a hit on his mage robes
console.log( pyatPree.uberFight() );
// Pyat Pree swings his cunning</pre>
<p>Through the use of our &#8216;uber&#8217; object that keeps a reference to our original warrior object we can continue to access its properties in their original form.  We assigned our original warrior&#8217;s fight function to _uberFight BEFORE we overrided it with our own fight function. This is a bit convoluted, but it demonstrates how REFERENCES are passed around. Had I created our new uber.fight function BEFORE assigning uber.fight to _uberFight, they would both print out the same message.</p>
<p>We aren&#8217;t designating any new properties to store the passed in arguments used by our warrior or warlock functions.  This works because we are passing in primitive string objects.  If our functions were to take objects, the passing by reference of object may cause problems if those objects were modified outside of our function.</p>
<p>I hope this helps clarify closures!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dcholth.com/2013/01/25/javascript-scope-closures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introduction to JavaScript’s Prototype Inheritance</title>
		<link>http://blog.dcholth.com/2013/01/22/introduction-to-javascripts-prototype-inheritance/</link>
		<comments>http://blog.dcholth.com/2013/01/22/introduction-to-javascripts-prototype-inheritance/#comments</comments>
		<pubDate>Tue, 22 Jan 2013 04:48:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Software Engineering]]></category>

		<guid isPermaLink="false">http://blog.dcholth.com/?p=1315</guid>
		<description><![CDATA[If you have worked in traditional classical object oriented (OO) languages, JavaScript’s (JS) prototypal inheritance model may be a source of confusion. It certainly was for me when I started working in JS. What is a “Classical Object Oriented model?” Many people believe that the word “classical” in “classical OO” has something to do with [...]]]></description>
				<content:encoded><![CDATA[<p><img class="size-full wp-image-1354 alignright" alt="jslogo" src="http://blog.dcholth.com/wp-content/uploads/2013/01/jslogo.png" width="200" height="300" />If you have worked in traditional classical object oriented (OO) languages, JavaScript’s (JS) prototypal inheritance model may be a source of confusion. It certainly was for me when I started working in JS.</p>
<p><strong>What is a “Classical Object Oriented model?”</strong><br />
Many people believe that the word “classical” in “classical OO” has something to do with tradition, or a history of OO programming. This is actually incorrect. The word classical in this instance actually refers to the base word “class,” which in OO means a data structure that allows one to create unique instances of objects through classes.  If you are familiar with Java or ActionScript3, you have most likely used classes.</p>
<p><strong>How is “prototypal inheritance” different from “classical inheritance?”</strong><br />
Classes can inherit from other classes by extending them. When one class extends another, the extended class is often referred to as the base, super or parent class. For the purposes of this article, I will refer to them as a parent and child relationships when referring to inheritance. The child class inherits a specified set of methods and properties from the parent class.</p>
<p>Prototypal inheritance is based off an an <em>actual instance of an object</em> &#8211; not the construct to create that instance. So when you create your parent object with all its specific properties and methods, the child inheriting from the parent gets all the original objects values. They’re live and will change automatically for the child when its created.</p>
<p>I like to think of classical inheritance as blue-prints. You ‘construct’ things from blueprints, and each one will be unique and different. When a child gets a hold of the original parent’s blue-print, it can add on rooms and make changes, but it won’t affect any of the objects already created with either child blue-prints, or their parents.  It also does not require any parent objects to be created in order to create children.  They can be created directly from their own blueprints.</p>
<p><span id="more-1315"></span></p>
<p style="text-align: left;">Prototypal inheritance on the other hand is like building with sheets glass. You create a new huge sheet of glass, and specify all the properties that object will need. Your child then is another sheet of glass put on top of the original. You can keep adding sheets of glass for other children to lay on top of the original. When a change occurs to the original parent sheet of glass though, its automatically seen by all the other child layers of glass on top of it. Thats because our prototype inheritance is live and uses real object instances!  The important thing to note is that the child cannot function without an instance of a parent &#8211; without that initial sheet of glass, the other layers of glass break.</p>
<p>Lets see prototypal inheritance in action!</p>
<pre class="prettyprint linenumstrigger linenums noescape lang-js linenumstrigger" style="background-color: #eeeeee; line-height: 1.5em;">// Create my base person object
var BasePerson = function( ) {
     this.sex = 'male';
     this.occupation = 'worker';
     this.name = 'John Doe';
}

var myBasePerson = new BasePerson();
BasePerson.prototype.whoAmI = function() {
     return 'A ' + this.sex + ' ' + this.occupation
             + &quot; named &quot; + this.name + '. \n';
}

console.log('myBasePerson: ' + myBasePerson.whoAmI() );
// basePerson: A male work named John Doe.

// Lets create our base artist object to inherit from
var BaseArtist = function() {
     this.media = 'mixed';
     this.artStyle = 'various';
     this.occupation = 'artist';
}
BaseArtist.prototype = myBasePerson;
BaseArtist.constructor = BaseArtist;
var myBaseArtist = new BaseArtist();
myBaseArtist.occupation = 'artist';

/* TIP: If you completely replace a prototype, its good
practice to reset the constructor back to the
the object you are defining - as I did above */
var dcholth = new BaseArtist();
dcholth.name = 'D.C. Holth';
console.log( dcholth.whoAmI() );
// A male artist named D.C. Holth.

console.log( myBasePerson.whoAmI() );
// A male worker named John Doe.

/* Note that both my objects are still able to use whoAmI()
and that they both still access this.occupation, even though
they are not the same .occupation in memory anymore. The 'this'
declaration points to our new instance, not the prototype or
global space */

// Painters are another subsection of artists.
var BasePainter = function() {
     this.paintingStyle = 'Traditional';
}
BasePainter.prototype = myBaseArtist;
BasePainter.constroctor = BasePainter;
// You can also attach properties to the prototype
// by putting them directly onto the property in
// literal notation
BasePainter.prototype.media = 'paint';

// Now lets create some instances of our painters
var monet = new BasePainter();
monet.artStyle = 'impressionistic';
monet.name = 'Monet';

var maria = new BasePainter();
maria.artStyle = 'abstract';
maria.name = 'Maria Cosway';
var dali = new BasePainter();
dali.artStyle = 'surrealist';
dali.name = 'Dali';
// Sending some information to our console we can see that
// our prototype and its children are working correctly.
// We have 'artists' with their own unique 'art style'.

console.log('Monet's occupation: ' + monet.occupation );
//Monet's occupation: artist

console.log('Monet's style: ' + monet.artStyle + '\n' );
//Monet's style: impressionistic

console.log('Maria Cosway's occupation: ' + maria.occupation );
//Maria Cosway's occupation: artist
console.log('Maria Cosway's style: ' + maria.artStyle + '\n');
//Maria Cosway's style: abstract

console.log('Dali's occupation: ' + dali.occupation );
//Dali's occupation: artist
console.log('Dali's style: ' + dali.artStyle + '\n' );
//Dali's style: surrealist

// When we ask our function to execute whoAmI() it is still
// using our original whoAmI function from myBasePerson
console.log( dali.whoAmI() );
// A male artist named Dali.

// Lets update so that all our artists get access to a more
// specific whoAmI dealing just to artists.
BasePainter.prototype.whoAmI = function() {
     return this.name + ' is a ' + this.sex + ' ' + this.occupation
     + ' who uses ' + this.media + ' to make '
     + this.artStyle + ' artwork \n';
}
console.log( dali.whoAmI() );
// Dali is a male artist who uses paint to make surrealist artwork

console.log( maria.whoAmI() );
// Maria Cosway is a male artist who uses paint to make abstract artwork
// Wait a second? Maria isn't a MALE artist!

// now I'm sure you know by now that you could simply
// do maria.sex = 'female' and all only she will become
// female. But lets have a little fun here.

// By changing the prototype from which BasePainter's inherit,
// all the way down to myBasePerson, we can have
// EVERYONE be female automatically!
myBasePerson.sex = 'female'

console.log( dali.whoAmI() );
// Dali is a female artist who uses paint to make surrealist artwork

console.log( maria.whoAmI() );
// Maria Cosway is a female artist who uses paint to make abstract artwork

console.log( myBasePerson.whoAmI() );
// A female worker named John Doe.

// Also note again, our whoAmI() function didn't change
// for our myBasePeron object

/* Suddenly we have changed the sex of ALL our people!
This is because of that 'glass analogy' I used earlier.
When the underlying parent glass is changed, it shines
through to all our objects! So when we changed the sex
of our very early prototype object 'myBasePerson' all
the children that inherited from it also became female! */

// lets go ahead and switch everyone back to male, and just
// make Maria female
myBasePerson.sex = 'male'
maria.sex = 'female';
console.log( dali.whoAmI() );
// Dali is a male artist who uses paint to make surrealist artwork

console.log( maria.whoAmI() );
// Maria Cosway is a female artist who uses paint to make abstract artwork

console.log( myBasePerson.whoAmI() );
// A male work named John Doe.</pre>
<p>You may have noticed that I never used the keyword &#8217;new&#8217;<strong> </strong>in the above code block.  I have mixed feelings on using &#8216;new&#8217; to stamp out objects.  In one respect, I view it as a hold-over to make JavaScript appear to be more classical in its nature.  The fact is, its not a classical language, and trying to mold it into something its not can confuse the mental process needed to understand its prototypal nature.   Using &#8216;new&#8217; isn&#8217;t bad in the right instances, but in my opinion one should find alternatives when ever possible.</p>
<p>Hopefully through the examples above you can see how prototype-inheritance can help  you organize your code and create more efficient prototype-inheritance objects!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dcholth.com/2013/01/22/introduction-to-javascripts-prototype-inheritance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ADB Not Recognizing Devices on OSX &#8211; EasyTether problem</title>
		<link>http://blog.dcholth.com/2012/12/10/adb-not-recognizing-devices-on-osx-easytether-problem/</link>
		<comments>http://blog.dcholth.com/2012/12/10/adb-not-recognizing-devices-on-osx-easytether-problem/#comments</comments>
		<pubDate>Mon, 10 Dec 2012 21:00:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Articles]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[adb]]></category>
		<category><![CDATA[easytether]]></category>
		<category><![CDATA[nexus 10]]></category>

		<guid isPermaLink="false">http://blog.dcholth.com/?p=1312</guid>
		<description><![CDATA[After some 2 hours of debugging and trying to get my new Nexus 10 to connect to ADB, I finally found this post on StackOverflow outlining the EasyTether problem.  After deleting EasyTether from my system, I&#8217;ve had no issues getting my Galaxy Nexus or Nexus 10 to connect to my computer for debugging. Reference/Credit: http://www.intohand.com/post.php?s=2011-02-17-android-debug-bridge-not-just-working-on-mac]]></description>
				<content:encoded><![CDATA[<p>After some 2 hours of debugging and trying to get my new Nexus 10 to connect to ADB, I finally found <a href="http://stackoverflow.com/questions/4680637/os-x-10-6-6-and-adb-devices-fails-to-list-android-devices">this post on StackOverflow</a> outlining the EasyTether problem.  After deleting EasyTether from my system, I&#8217;ve had no issues getting my Galaxy Nexus or Nexus 10 to connect to my computer for debugging.</p>
<p>Reference/Credit: <a href="http://www.intohand.com/post.php?s=2011-02-17-android-debug-bridge-not-just-working-on-mac">http://www.intohand.com/post.php?s=2011-02-17-android-debug-bridge-not-just-working-on-mac</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dcholth.com/2012/12/10/adb-not-recognizing-devices-on-osx-easytether-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kindle PaperWhite &amp; Whispersync for Voice &#8211; The perfect reader companion!</title>
		<link>http://blog.dcholth.com/2012/12/01/kindle-paperwhite-whipsersync-for-voice-the-perfect-readers-companion/</link>
		<comments>http://blog.dcholth.com/2012/12/01/kindle-paperwhite-whipsersync-for-voice-the-perfect-readers-companion/#comments</comments>
		<pubDate>Sat, 01 Dec 2012 06:28:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Reviews]]></category>

		<guid isPermaLink="false">http://blog.dcholth.com/?p=1275</guid>
		<description><![CDATA[It was probably my desire to root for the underdog, but when I first decided to invest in an e-reader, my feet were planted squarely against an Amazon Kindle.  Now, after trying the Kobo and the Nook, I&#8217;ve become fully invested in the Kindle.  The latest enhancements to the Kindle Paper White and Amazon’s acquisition [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://69.195.124.80/~dcholthc/blog/2012/12/01/kindle-paperwhite-whipsersync-for-voice-the-perfect-readers-companion/kindle/" rel="attachment wp-att-1300"><img class="size-medium wp-image-1300 alignright" alt="kindle paperwhite" src="http://69.195.124.80/~dcholthc/blog/wp-content/uploads/2012/12/kindle-233x300.png" width="233" height="300" /></a>It was probably my desire to root for the underdog, but when I first decided to invest in an e-reader, my feet were planted squarely against an Amazon Kindle.  Now, after trying the Kobo and the Nook, I&#8217;ve become fully invested in the Kindle.  The latest enhancements to the <a href="http://www.amazon.com/gp/product/B008GEKXUO/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B008GEKXUO&amp;linkCode=as2&amp;tag=daniholt-20">Kindle Paper White</a> and Amazon’s acquisition of <a href="http://www.audible.com/">Audible.com</a> have made for my perfect reading experience.</p>
<p><a href="http://www.amazon.com/gp/feature.html/?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;docId=1000827761&amp;linkCode=ur2&amp;tag=daniholt-20">Whipsersync for Voice</a> (WfV) and the combination of Kindle &amp; Audible.com allows one to have almost non-stop reading.  When it is available on a title, its like magic!  I might pick up my Kindle in the morning before work and read a few pages.  When I&#8217;m finished reading, my position is automatically updated to the cloud.  If I hit the gym over lunch, I can fire up Audible on my phone and it jumps me to where I left of reading on my Kindle.  In the evening before bed, it takes me to where my Audible audio book left off!  This is the perfect companion of those who enjoy the convenience of being able to multitask with audiobooks, but also enjoy reading when they have the time.</p>
<p><span id="more-1316"></span></p>
<p>Many of <a href="http://www.amazon.com/b/?_encoding=UTF8&amp;camp=1789&amp;creative=390957&amp;linkCode=ur2&amp;node=5744819011&amp;pf_rd_i=1000827761&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_p=1396501942&amp;pf_rd_r=0RRVA954TPDTGABNSE5T&amp;pf_rd_s=center-6&amp;pf_rd_t=1401&amp;tag=daniholt-20">the titles that are available with WfV </a>allow you to buy the Audible book and Kindle book at a <a href="http://www.amazon.com/s/?_encoding=UTF8&amp;camp=1789&amp;creative=390957&amp;linkCode=ur2&amp;node=5744840011&amp;pf_rd_i=1000827761&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_p=1395819982&amp;pf_rd_r=0SYWN36M2CQPPQJGHEBN&amp;pf_rd_s=center-5&amp;pf_rd_t=1401&amp;tag=daniholt-20">reduced rate</a> together.  I&#8217;ve found the average price of both the e-reader version and the audiobook are usually equivalent to the cost of a hardcover print edition.  Still a great value for the convenience.  Amazon has a separate category for Whispersync enabled titles, but I still wish they would add more titles and make it easier to tell which titles are enabled.  Amazon also provides a <a href="http://www.amazon.com/s/?_encoding=UTF8&amp;camp=1789&amp;creative=390957&amp;linkCode=ur2&amp;node=5744839011&amp;tag=daniholt-20">number of free e-reader titles</a> with only small fees for the audio version ($2-3) to test out the service!</p>
<p>Since not every book is available with WfV, I have a few tips on making going from audiobook to e-reader easier.  If you have finished listening to the audiobook, note the last few words that were spoken.  Back on your e-reader, do a quick search for those words and it should jump you right to where you left in the audiobook.  Be careful for spoilers here, if you pick a phrase that may be common throughout the book, you might accidentally jump to the wrong location.</p>
<p>There isn’t a fantastic way to go from e-reader to audiobook, since the chaptering is often inaccurate in the Audible table of contents. However, they usually are broken into some form of chaptering, so if you finish your reading at a natural break you should have at least an easier time finding your spot&#8230; And thanks to my other favorite new feature of Paper White even that should be easier.</p>
<p>Built into the Paper White is chapter and book time estimation.  Based on ones average reading speed for a given title, it tells you how much more time you have for the entire book or chapter.  This is awesome for those nights when I&#8217;m really engrossed in a book, and a chapter ends on a cliffhanger, I can decide whether or not I want to start into the next chapter without skipping ahead to see how much more is left.</p>
<p>Another benefit of a Kindle e-reader versus a print book is the addition of x-ray.  This lets you explore the architecture of a book, highlighting characters, events and locations with summaries and graphs of their usage.  This is great for long, involved books, like Game of Thrones where there seems to be a new character every fifteen pages, or forget about certain characters when they appear many chapters later.  Hit the x-ray button, and you are given information about key words (character names, titles, locations, etc) on the current page- click on them and get more information.  You need to be a bit careful about spoilers here, but it certainly has been a great help when necessary!</p>
<p>As far as the Paper White goes as an e-reader, its light, responsive and the backlight is a great addition for reading in the dark or just in dim light.  The official case adds nice protection without much bulk.  I couldn’t ask for much more.  My only complaint has more to do with Amazon than the quality of their product and services.  It would be nice to have better filtering and notifications for which titles are available with Whipsersync for Voice.  Perhaps a wish-list feature that would notify you when a book is available.  I recently purchased all the Game of Thrones books since their Audible credit price was reduced from two (~$30) to 1 (~$15) thinking I could whip through them all by listening and reading.  Unfortunately, none of them are WfV enabled yet.  Other than that, I am very satisfied with the service and products.</p>
<p>Some of my recent reads using Whipsersync for Voice are shown below.</p>
<p><a href="http://www.amazon.com/gp/product/0547848412/ref=as_li_ss_il?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0547848412&amp;linkCode=as2&amp;tag=daniholt-20"><img alt="" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;ASIN=0547848412&amp;Format=_SL110_&amp;ID=AsinImage&amp;MarketPlace=US&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=daniholt-20" border="0" /></a><img style="border: none !important; margin: 0px !important;" alt="" src="http://www.assoc-amazon.com/e/ir?t=daniholt-20&amp;l=as2&amp;o=1&amp;a=0547848412" width="1" height="1" border="0" />     <a href="http://www.amazon.com/gp/product/0553283685/ref=as_li_ss_il?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0553283685&amp;linkCode=as2&amp;tag=daniholt-20"><img alt="" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;ASIN=0553283685&amp;Format=_SL110_&amp;ID=AsinImage&amp;MarketPlace=US&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=daniholt-20" border="0" /></a>      <a href="http://www.amazon.com/gp/product/1936719223/ref=as_li_ss_il?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1936719223&amp;linkCode=as2&amp;tag=daniholt-20"><img alt="" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;ASIN=1936719223&amp;Format=_SL110_&amp;ID=AsinImage&amp;MarketPlace=US&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=daniholt-20" border="0" /></a>     <a href="http://www.amazon.com/gp/product/B0079KT81G/ref=as_li_ss_il?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B0079KT81G&amp;linkCode=as2&amp;tag=daniholt-20"><img alt="" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;ASIN=B0079KT81G&amp;Format=_SL110_&amp;ID=AsinImage&amp;MarketPlace=US&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=daniholt-20" border="0" /></a><img style="border: none !important; margin: 0px !important;" alt="" src="http://www.assoc-amazon.com/e/ir?t=daniholt-20&amp;l=as2&amp;o=1&amp;a=B0079KT81G" width="1" height="1" border="0" />     <a href="http://www.amazon.com/gp/product/B0084AMNWQ/ref=as_li_ss_il?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B0084AMNWQ&amp;linkCode=as2&amp;tag=daniholt-20"><img alt="" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;ASIN=B0084AMNWQ&amp;Format=_SL110_&amp;ID=AsinImage&amp;MarketPlace=US&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=daniholt-20" border="0" /></a> <img style="border: none !important; margin: 0px !important;" alt="" src="http://www.assoc-amazon.com/e/ir?t=daniholt-20&amp;l=as2&amp;o=1&amp;a=B0084AMNWQ" width="1" height="1" border="0" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dcholth.com/2012/12/01/kindle-paperwhite-whipsersync-for-voice-the-perfect-readers-companion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Voting &#8220;No&#8221; to Defense of Marriage in Minnesota</title>
		<link>http://blog.dcholth.com/2012/10/04/voting-no-to-defense-of-marriage-in-minnesota/</link>
		<comments>http://blog.dcholth.com/2012/10/04/voting-no-to-defense-of-marriage-in-minnesota/#comments</comments>
		<pubDate>Thu, 04 Oct 2012 10:43:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[gay marriage]]></category>
		<category><![CDATA[marriage]]></category>
		<category><![CDATA[minnesota]]></category>
		<category><![CDATA[MNUnited]]></category>
		<category><![CDATA[politics]]></category>

		<guid isPermaLink="false">http://blog.dcholth.com/?p=781</guid>
		<description><![CDATA[I share articles on Facebook about opposing Minnesota&#8217;s proposed “Defense of Marriage” amendment quite often, and now that I’m engaged to be married myself, the relevance of this issue strikes even deeper. I recognize that there are emotional, moral, and religious dilemmas surrounding the issue. For the purposes of my argument here, I’ll stick to [...]]]></description>
				<content:encoded><![CDATA[<p style="text-align: left;"><img class="alignright size-medium wp-image-1091" title="MN United Logo" src="http://blog.dcholth.com/wp-content/uploads/2012/10/tumblr_mb924qR5pb1rvllc7.png" alt="" width="350" height="303" />I share articles on Facebook about opposing Minnesota&#8217;s proposed “Defense of Marriage” amendment quite often, and now that I’m engaged to be married myself, the relevance of this issue strikes even deeper. I recognize that there are emotional, moral, and religious dilemmas surrounding the issue. For the purposes of my argument here, I’ll stick to strictly the constitutional aspects surrounding it. If you support the “Defense of Marriage” amendment, and by that I mean plan to vote “yes” on November 6th, please take a moment to read.</p>
<p style="text-align: left;"><span id="more-781"></span></p>
<p>Our founding fathers created this great country with a few simple principles. One of those is freedom of religion. Part of the first amendment is the Establishment Clause, which states that “Congress shall make no law respecting an establishment of religion.” This works two fold in regards to the “Defense of Marriage” amendment.</p>
<p>The Establishment Clause works to the benefit of those religious establishments who feel they are defending marriage, it prevents the state from forcing them to do things against their beliefs, such as marrying gay couples or recognizing said marriages. Regardless of the passage or defeat of this amendment, that will remain true. However, it also prevents the state from establishing laws which would *prevent* churches from being allowed to marry gay couples if they so chose. While many Christian religions prohibit same-sex religious unions, there are many other religions and non-religious organizations that do not. Even if every religion prohibited it, that&#8217;s not the point. Our constitution isn&#8217;t supposed to be a codification of the bible or any religious teaching. It&#8217;s supposed to be devoid of specific religious influence, and protect the basic civil and human rights of its people.</p>
<p>While the essence of democracy is majority rule, our founding fathers were foresighted enough to put protections into our government system to ensure that the majorities rule could not encroach onto the rights of others. The passage of this amendment would violate one of the very principles of our constitution by preventing religious expression of those establishments that accept same-sex unions.</p>
<p>Next year I’ll be marrying the person I love: a wonderful asian woman. As recently as 1966, this would have been illegal. Many states had Jim Crow laws which prohibited marriage between races. In the case of Loving v. Virginia of 1967, it was determined that marriage was a “basic civil right of man.” My thanks goes out to those brave men and women who stood up to the persecutions of the past, so that I can marry the love of my life now. Denying marriage based on race was wrong then &#8211; denying it based on sexual orientation is wrong today.</p>
<p>The “Defense of Marriage” campaign is focused on opposing a “redefinition of marriage” to exclude same-sex couples. When our founding fathers laid out the constitution of our great country, the idea of a “civil union” was hardly a concept, let alone something one could outwardly practice. The word “marriage” was the obvious choice for describing unions between two people, and to establish the benefits thereof. I believe wholeheartedly that if they had seen todays outcome of using the word “marriage,” they would have opted for “civil union” for everyone &#8211; you would have gotten “married in a church” and “unioned” in the state.</p>
<p>However, even with the formation of civil unions as an alternative to marriage in some states, Minnesota does not allow civil unions between same-sex couples. Furthermore, in states that allow civil unions, the couples engaged in them are still be denied benefits at both a state and federal level. For a complete outline of exactly what benefits they are excluded from, check out the link below.</p>
<p>By legally defining the word “marriage” to strictly require a man and a woman, we will have excluded same-sex couples from hundreds of laws and benefits that are predicated on the word “marriage”. This would include all the federal and state benefits that apply to marriages. Modifying the laws to include “civil unions” and “marriage” would not only be difficult, it would ultimately create the “separate but equal” situation deemed unconstitutional during the civil rights movements of the past.</p>
<p>Other states have passed similar amendments. California and Massachusetts are tied up in expensive legal battles regarding the passage of similar “Defense of Marriage Amendments.” They have been deemed unconstitutional in both state courts, are on their way to the US Supreme Court.</p>
<p>This amendment issue *not* about the redefinition of a word. Its about continuing the conversation on expanding the meaning of that word to everyone &#8211; love, commitment and family. And that is why, this November, I am voting no to the “Defense of Marriage” amendment.<br />
Boston Court rules Defense of Marriage unconstitutional<br />
<a href="http://www.ca1.uscourts.gov/cgi-bin/getopn.pl?OPINION=10-2204P.01A" rel="nofollow nofollow" target="_blank">http://www.ca1.uscourts.gov/cgi-bin/getopn.pl?OPINION=10-2204P.01A</a></p>
<p>Loving v. Virginia, 388 U.S. 1<br />
<a href="http://www.facebook.com/l.php?u=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FLoving_v._Virginia&amp;h=LAQFgQVJyAQH2ie1jRVBt6fdfqzjb0PJUv3fSWtOBpXqsOQ&amp;s=1" rel="nofollow nofollow" target="_blank">http://en.wikipedia.org/wiki/Loving_v._Virginia</a></p>
<p>Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof.<br />
<a href="http://en.wikipedia.org/wiki/Establishment_Clause" rel="nofollow nofollow" target="_blank">http://en.wikipedia.org/wiki/Establishment_Clause</a></p>
<p>An Overview of Federal Rights and Protections Granted to Married Couples<br />
<a href="http://www.hrc.org/resources/entry/an-overview-of-federal-rights-and-protections-granted-to-married-couples" rel="nofollow nofollow" target="_blank">http://www.hrc.org/resources/entry/an-overview-of-federal-rights-and-protections-granted-to-married-couples</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dcholth.com/2012/10/04/voting-no-to-defense-of-marriage-in-minnesota/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Life After Death : Roses</title>
		<link>http://blog.dcholth.com/2012/06/14/life-after-death-roses/</link>
		<comments>http://blog.dcholth.com/2012/06/14/life-after-death-roses/#comments</comments>
		<pubDate>Thu, 14 Jun 2012 23:20:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Artistic Process]]></category>

		<guid isPermaLink="false">http://blog.dcholth.com/?p=748</guid>
		<description><![CDATA[Last night I put the finishing touches on my new painting. I wasn&#8217;t very happy with this painting as I went. When it was &#8220;finished&#8221; I hung it up in the on the fire place mantel where I continued to criticize it. I&#8217;d bring it down to the studio from time to time and make [...]]]></description>
				<content:encoded><![CDATA[<p>Last night I put the finishing touches on my new painting. I wasn&#8217;t very happy with this painting as I went. When it was &#8220;finished&#8221; I hung it up in the on the fire place mantel where I continued to criticize it. I&#8217;d bring it down to the studio from time to time and make little tweaks and fixes. The painting has finally grown on me, and I&#8217;m quite happy with it. Click on it to see the full resolution of the painting.</p>
<p>It is done in oils and is 24&#215;30 inches.</p>
<p><a href="http://blog.dcholth.com/2012/06/14/life-after-death-roses/sony-dsc-16/" rel="attachment wp-att-973"><img class="alignnone size-large wp-image-973" alt="SONY DSC" src="http://blog.dcholth.com/wp-content/uploads/2012/11/roses_complete-828x1024.jpg" width="828" height="1024" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dcholth.com/2012/06/14/life-after-death-roses/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Bath : Painting &amp; Progress Shots</title>
		<link>http://blog.dcholth.com/2012/05/01/the-bath-painting-progress-shots/</link>
		<comments>http://blog.dcholth.com/2012/05/01/the-bath-painting-progress-shots/#comments</comments>
		<pubDate>Tue, 01 May 2012 07:06:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Artistic Process]]></category>
		<category><![CDATA[Featured]]></category>

		<guid isPermaLink="false">http://blog.dcholth.com/?p=688</guid>
		<description><![CDATA[I finished a new painting this weekend!  The Bath is probably my best piece to date!  A special thanks to DigiDrew  and his model at DeviantArt for the source material!  Its 30&#215;40&#8243;, done in oil.   Click the painting to open up a high resolution photo. Below are the sequential shots of the paintings progress after [...]]]></description>
				<content:encoded><![CDATA[<p>I finished a new painting this weekend!  <em>The Bath</em> is probably my best piece to date!  A special thanks to <a href="http://digidrew.deviantart.com/">DigiDrew</a>  and his model at DeviantArt for the source material!  Its 30&#215;40&#8243;, done in oil.   Click the painting to open up a high resolution photo.</p>
<p><a href="http://blog.dcholth.com/wp-content/uploads/2012/05/final.jpg"><img class="aligncenter size-large wp-image-717" title="The Bath Final" alt="" src="http://blog.dcholth.com/wp-content/uploads/2012/05/final.jpg" width="525" height="700" /></a><br />
Below are the sequential shots of the paintings progress after each of the nine painting session.</p>

<a href='http://blog.dcholth.com/?attachment_id=689' title='1'><img width="80" height="80" src="http://blog.dcholth.com/wp-content/uploads/2012/04/1-80x80.jpg" class="attachment-thumbnail" alt="1" /></a>
<a href='http://blog.dcholth.com/?attachment_id=690' title='2'><img width="80" height="80" src="http://blog.dcholth.com/wp-content/uploads/2012/04/2-80x80.jpg" class="attachment-thumbnail" alt="2" /></a>
<a href='http://blog.dcholth.com/?attachment_id=691' title='3'><img width="80" height="80" src="http://blog.dcholth.com/wp-content/uploads/2012/04/3-80x80.jpg" class="attachment-thumbnail" alt="3" /></a>
<a href='http://blog.dcholth.com/?attachment_id=692' title='4'><img width="80" height="80" src="http://blog.dcholth.com/wp-content/uploads/2012/04/4-80x80.jpg" class="attachment-thumbnail" alt="4" /></a>
<a href='http://blog.dcholth.com/?attachment_id=693' title='5'><img width="80" height="80" src="http://blog.dcholth.com/wp-content/uploads/2012/04/5-80x80.jpg" class="attachment-thumbnail" alt="5" /></a>
<a href='http://blog.dcholth.com/?attachment_id=694' title='6'><img width="80" height="80" src="http://blog.dcholth.com/wp-content/uploads/2012/04/6-80x80.jpg" class="attachment-thumbnail" alt="6" /></a>
<a href='http://blog.dcholth.com/?attachment_id=695' title='7'><img width="80" height="80" src="http://blog.dcholth.com/wp-content/uploads/2012/04/7-80x80.jpg" class="attachment-thumbnail" alt="7" /></a>
<a href='http://blog.dcholth.com/?attachment_id=696' title='8'><img width="80" height="80" src="http://blog.dcholth.com/wp-content/uploads/2012/04/8-80x80.jpg" class="attachment-thumbnail" alt="8" /></a>
<a href='http://blog.dcholth.com/?attachment_id=717' title='The Bath Final'><img width="80" height="80" src="http://blog.dcholth.com/wp-content/uploads/2012/05/final-80x80.jpg" class="attachment-thumbnail" alt="The Bath Final" /></a>

]]></content:encoded>
			<wfw:commentRss>http://blog.dcholth.com/2012/05/01/the-bath-painting-progress-shots/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android’s Fragmentation: Split Personality Disorder</title>
		<link>http://blog.dcholth.com/2012/01/27/androids-fragmentation-split-personality-disorder/</link>
		<comments>http://blog.dcholth.com/2012/01/27/androids-fragmentation-split-personality-disorder/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 07:00:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Articles]]></category>
		<category><![CDATA[Fragmenetation]]></category>
		<category><![CDATA[Ice Cream Sandwhich]]></category>
		<category><![CDATA[Kindle Fire]]></category>
		<category><![CDATA[Nook Tablet]]></category>

		<guid isPermaLink="false">http://blog.dcholth.com/?p=664</guid>
		<description><![CDATA[There has been a lot of talk about fragmentation in the Android ecosystem.  Anyone who says it&#8217;s not fragmented has to be kidding themselves. If an iOS user sees a cool app on another person’s iOS device, they know that it is available to them as well.  Unfortunately, the same is not true for Android [...]]]></description>
				<content:encoded><![CDATA[<p><strong id="internal-source-marker_0.770297258393839"><a href="http://blog.dcholth.com/2012/01/27/androids-fragmentation-split-personality-disorder/fragdroid/" rel="attachment wp-att-672"><img class="alignright size-full wp-image-672" title="Fragmente Droid" src="http://blog.dcholth.com/wp-content/uploads/2012/01/fragdroid.png" alt="" width="264" height="295" /></a></strong>There has been a lot of talk about fragmentation in the Android ecosystem.  Anyone who says it&#8217;s not fragmented has to be kidding themselves. If an iOS user sees a cool app on another person’s iOS device, they know that it is available to them as well.  Unfortunately, the same is not true for Android users.  When I create an Android application, I try to run it on as many devices as possible prior to release.  The tweaks to the OS made by device manufacturers can (and do) affect application performance and stability.  One can easily observe this by looking at reviews in the Apps Market where users describe applications force-closing randomly on specific phones.</p>
<p><span id="more-664"></span></p>
<p>One of the greatest benefits of Android is that it gives customers the ability to chose a device with a UI and hardware most appealing to them.  This is also its greatest curse since it causes fragmentation in the Android ecosystem, a problem much more difficult for Google than it is for Apple and BlackBerry because Google doesn’t control the hardware.  The Android Update Alliance was created to guide device-makers and carriers towards updating their customers more quickly, but so far it seems dead in the water.   The small tweaks that carriers make to the OS help their devices stand apart, not just from other operating systems but other Android phones as well.  These differences make updating them much more difficult since the device makers need to ensure that every aspect of their customized version works on the latest update.  On top of that, the hardware-makers don’t see another dime from goods and services sold within the Android ecosystem, so there is little incentive for carriers to keep older phones up to date.  (Although I know I would have brand loyalty and be much more likely to continue buying a specific line of devices if the carrier guaranteed me the latest updates every time, but that&#8217;s a topic for a different post entirely.)</p>
<p>To make matters worse, two of the worlds most popular Android-based tablets are built on top of extremely dated versions of the OS.  Amazon’s Kindle Fire and Barnes and Noble’s Nook Tablet are both running customized versions of Android 2.3.  This forces developers to ask very difficult questions: “do we lower the features of our applications and potential quality to make one app that will run on all tablets, create two applications or ignore devices with older versions of the OS?” These are questions that iOS developers generally don’t need to ask themselves, thanks to Apple’s strict control over the hardware.  For a visual reference of just how much variation there is in Android versions out there, check out Michael Degusta’s chart, linked at the bottom of this post.</p>
<p>The bottom line is that Google needs to apply more pressure to carriers and device-makers to keep their customized versions in sync with the latest version of Android.  When a customer goes into the store, they should be able to look at a phones capabilities, hardware and customized UI without having to worry about whether or not their favorite apps will work on the device due to tweaked or outdated Android software.  It’s an incredible benefit to iOS users that Apple keeps much of its older hardware on the latest version of the OS, and I believe that’s one of the huge appeals of Apple’s ecosystem.  Google needs to give its user base that same assurance.</p>
<p>It’s my stance that phones should get the latest version of Android within two months of its release, and continue to receive updates for at least 2 years (This works in the USA where customers are typically offered a discounted phone upgrades at the end of a 2 year contract.  I’m not sure if this would be a good solution for customers outside the USA).  Tablets should get updates for at least 4 years from their release.   I realize that is forever in technology, but tablets are more expensive and beginning to replace laptops.  If I were a student who opted for a tablet over a laptop, I’d like to believe it will function fully for me through my college career.</p>
<p>My final thought &#8211; When a carrier no longer wants to provide updates to its customized versions, then they should open up their boot-loaders to allow the developer community to keep a device alive and up-to-date.  This will help give Android phones that are no longer in service contracts a second life as MP3 players, development devices and iPod touch equivalents.<strong id="internal-source-marker_0.770297258393839"></strong></p>
<p>- <a href="http://theunderstatement.com/post/11982112928/android-orphans-visualizing-a-sad-history-of-support">Android Orphans: Visualizing a Sad History of Support</a> | October 26, 2011</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dcholth.com/2012/01/27/androids-fragmentation-split-personality-disorder/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
