
<?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>PugetWorks.com</title>
	<atom:link href="http://pugetworks.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://pugetworks.com/blog</link>
	<description>Software development in Seattle</description>
	<lastBuildDate>Mon, 31 Dec 2012 18:37:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>django: Persistent Database data</title>
		<link>http://pugetworks.com/blog/2012/12/django-persistent-database-data/</link>
		<comments>http://pugetworks.com/blog/2012/12/django-persistent-database-data/#comments</comments>
		<pubDate>Mon, 31 Dec 2012 18:28:03 +0000</pubDate>
		<dc:creator>Bill</dc:creator>
				<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://pugetworks.com/blog/?p=988</guid>
		<description><![CDATA[If you wish to have a core set of data that pre-populates your database after running python manage.py syncdb, then you need to know about the dumpdb command and fixtures. Fixtures Fixtures are where you can place data that django will be used to populate the database when syncdb is... <a class="more" href="http://pugetworks.com/blog/2012/12/django-persistent-database-data/"> read the rest of the article</a>]]></description>
			<content:encoded><![CDATA[If you wish to have a core set of data that pre-populates your database after running <i>python manage.py syncdb</i>, then you need to know about the <i>dumpdb</i> command and fixtures.

<h2>Fixtures</h2>

Fixtures are where you can place data that django will be used to populate the database when syncdb is called. They are usually found in one or more directories called <i>fixtures</i> inside your django app. Beware! The order the fixtures are loaded into the database is random, so if there are dependencies between separate fixtures then you will have problems. Consolidate the dependent fixtures to solve this.

<h2>Dumpdb</h2>

Dumpdb is used to output a json representation of the database. This data is streamed from the database and so it is also possible to have dependency issues if a table references entries in the same table.

There are 2 important flags to know:

<ul>
<li><b>&#8211;indent=2</b> &#8211; This makes the output easy to read and edit.</li>

<li><b>&#8211;natural</b> &#8211; This removes foreign key ids from the output and replaces it with the <i>unique</i> field in the referenced model. This is most notable with exporting Permissions. This not required, but is something to remember.</li>
</ul>

The last argument is the <i>django app</i> name and optionally the <i>model</i> name. So if your last argument is <b>auth</b> you will get everything related to that app. If you change the argument to <b>auth.user</b>, then you will only get the information from the <i>user</i> model under the <i>auth</i> app (aka <i>auth_user</i> table).

<h2>Example</h2>

Say you want to maintain the superuser info. Run the following:

<pre class="brush: bash; title: ; notranslate">./manage.py dumpdata --indent=2 auth.user &gt; initial_data.json</pre>

You&#8217;ll see that along the users that you&#8217;ve already created during the usual <i>syncdb</i> execution, a lot of other stuff was dumped. Deleting everything except for the superuser will result in something like:

<pre class="brush: bash; title: ; notranslate">
[
  {
    &quot;pk&quot;: 1,
    &quot;model&quot;: &quot;auth.user&quot;,
    &quot;fields&quot;: {
      &quot;username&quot;: &quot;admin&quot;,
      &quot;first_name&quot;: &quot;Admin&quot;,
      &quot;last_name&quot;: &quot;Strator&quot;,
      &quot;is_active&quot;: true,
      &quot;is_superuser&quot;: true,
      &quot;is_staff&quot;: true,
      &quot;last_login&quot;: &quot;2012-01-13T14:18:47&quot;,
      &quot;groups&quot;: [],
      &quot;user_permissions&quot;: [],
      &quot;password&quot;: &quot;pbkdf2_sha256$10000$MIath2Pzfcc8$vykFKAQ1A0XoGKrSQwwksDxjzLFGnocknZaChiPdeC8=&quot;,
      &quot;email&quot;: &quot;admin@mydomain.com&quot;,
      &quot;date_joined&quot;: &quot;2011-11-10T15:55:55&quot;
    }
  }
]
</pre>

Save this file to one of your <i>fixtures</i> folders and each time you execute the <i>syncdb</i> command it will be automatically loaded by django.

Either with an empty database or your existing database, running <pre class="brush: bash; title: ; notranslate">python ./manage.py syncdb</pre> will import the data from the <i>initial_data.json</i> file.

If this is a empty database, add the flag <i>&#8211;noinput</i>, to prevent the script from asking questions.

<pre class="brush: bash; title: ; notranslate">python ./manage.py syncdb --noinput</pre>

There shouldn&#8217;t be a prompt for a superuser and you should see a message at the end of the output indicating that your fixture was loaded.


<i>Originally from: http://arthurkoziel.com/2008/09/04/automatical-superuser-creation-django/</i>]]></content:encoded>
			<wfw:commentRss>http://pugetworks.com/blog/2012/12/django-persistent-database-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Use Adobe Shadow to Debug Mobile Websites on the Desktop</title>
		<link>http://pugetworks.com/blog/2012/07/use-adobe-shadow-to-debug-mobile-websites-on-the-desktop/</link>
		<comments>http://pugetworks.com/blog/2012/07/use-adobe-shadow-to-debug-mobile-websites-on-the-desktop/#comments</comments>
		<pubDate>Fri, 13 Jul 2012 01:34:38 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[Mobile Development]]></category>

		<guid isPermaLink="false">http://pugetworks.com/blog/?p=969</guid>
		<description><![CDATA[We&#8217;ve been using Adobe Shadow to test websites on mobile browsers for a few months now. It&#8217;s basically a group of applications that allow you to sync what&#8217;s on your mobile screen with what&#8217;s on your desktop screen. This means you can view a webpage in Safari on an iPhone... <a class="more" href="http://pugetworks.com/blog/2012/07/use-adobe-shadow-to-debug-mobile-websites-on-the-desktop/"> read the rest of the article</a>]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve been using <a href="http://labs.adobe.com/downloads/shadow.html">Adobe Shadow</a> to test websites on mobile browsers for a few months now. It&#8217;s basically a group of applications that allow you to sync what&#8217;s on your mobile screen with what&#8217;s on your desktop screen. This means you can view a webpage in Safari on an iPhone using Chrome on your laptop (great), but what&#8217;s better is that you can also use the Developer Tools built into Chrome to inspect and edit live HTML/CSS and Javascript, just as you would do when debugging a normal web page.</p>

<p>If this doesn&#8217;t excite you, you probably haven&#8217;t spent hours trying to track down a trivial rendering bug on an iPhone, all the while knowing it would take you five minutes to fix if only you had access to an actual testing environment.</p>

<p>Adobe Shadow is free, and works on Windows and Mac, iPhone and Android.</p>]]></content:encoded>
			<wfw:commentRss>http://pugetworks.com/blog/2012/07/use-adobe-shadow-to-debug-mobile-websites-on-the-desktop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resources from Mobile Boilerplate</title>
		<link>http://pugetworks.com/blog/2012/04/960/</link>
		<comments>http://pugetworks.com/blog/2012/04/960/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 04:59:28 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[Mobile Development]]></category>

		<guid isPermaLink="false">http://pugetworks.com/blog/?p=960</guid>
		<description><![CDATA[I&#8217;ve been playing around with Mobile Boilerplate, because the HTML5 Boilerplate project has been an excellent resource and I&#8217;m always looking for ways to make developing mobile websites easier on myself (The next redesign of the Pugetworks site is going to have to reflect a mobile-first approach, but I want... <a class="more" href="http://pugetworks.com/blog/2012/04/960/"> read the rest of the article</a>]]></description>
			<content:encoded><![CDATA[I&#8217;ve been playing around with <a href="http://html5boilerplate.com/mobile">Mobile Boilerplate</a>, because the HTML5 Boilerplate project has been an excellent resource and I&#8217;m always looking for ways to make developing mobile websites easier on myself

(The next redesign of the Pugetworks site is going to have to reflect a mobile-first approach, but I want to give our fancy portfolio a short stay of execution, given all the work involved in setting it up. Have you tried it yet?)

Overall, Mobile Boilerplate is a good setup, and I&#8217;ve decided I&#8217;ll use it on an upcoming personal project. In the meantime, their <a href="https://github.com/h5bp/mobile-boilerplate/wiki">wiki</a> pointed me to a couple of excellent resources I wanted to turn around and recommend to you:
<ul>
	<li><a href="https://docs.google.com/present/view?id=dkx3qtm_22dxsrgcf4"> The Idiot&#8217;s Guide to viewport and pixel</a> is an excellent, no-nonsense explanation of the challenges presented by mobile viewport and media queries, and the current working solutions to them. It explains why MB is set up to the way it is, but it&#8217;s 100% generalizable to your web site whether you&#8217;re using the templates or not.</li>
	<li><a href="http://www.webkit.org/blog/1620/webkit-remote-debugging/"> Webkit Remote Debugging</a> is something I have not tried yet, but it promises to allow you to run the Web Inspector tool from Safari on web pages displayed on another browser, even on another computer. This includes mobile devices like the iPhone, if you do a couple tweaks in xcode. Given the difficulty of developing mobile apps without a good built-in debugger, this could change everything.</li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://pugetworks.com/blog/2012/04/960/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Making Gradients Along a Path in Photoshop and Illustrator</title>
		<link>http://pugetworks.com/blog/2012/04/making-gradients-along-a-path-in-photoshop-and-illustrator/</link>
		<comments>http://pugetworks.com/blog/2012/04/making-gradients-along-a-path-in-photoshop-and-illustrator/#comments</comments>
		<pubDate>Sun, 08 Apr 2012 04:23:26 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://pugetworks.com/blog/?p=910</guid>
		<description><![CDATA[In Photoshop It&#8217;s easy enough to apply a simple gradient to a shape or vector path in Photoshop. You can use the gradient tool, or apply a blending layer. You can apply linear gradients, radial gradients, simple gradients and more complicated ones. You can also apply a gradient to the... <a class="more" href="http://pugetworks.com/blog/2012/04/making-gradients-along-a-path-in-photoshop-and-illustrator/"> read the rest of the article</a>]]></description>
			<content:encoded><![CDATA[<h2>In Photoshop</h2>
It&#8217;s easy enough to apply a simple gradient to a shape or vector path in Photoshop. You can use the gradient tool, or apply a blending layer. You can apply linear gradients, radial gradients, simple gradients and more complicated ones. You can also apply a gradient to the interior of a shape, but it&#8217;s slightly less obvious how to do this. Here&#8217;s the easiest way I know of.

<img style="margin:20px 0" class="aligncenter size-full wp-image-957" title="photoshop-gradient-path" src="http://pugetworks.com/blog/wp-content/uploads/2012/04/photoshop-gradient-path.png" alt="Tutorial Image" width="580" height="344" />
<ol>
	<li>Begin with your shape, in its own layer. Select that layer in the <em>layers</em> panel.</li>
	<li>Apply a stroke: Right click on the layer, select <em>Blending Options&#8230; </em>then <em>Stroke. </em>Another way to do this: in the file menu, select Layer ►Layer Style ►Stroke&#8230;</li>
	<li>In the <em>Stroke</em> dialog, apply the gradient by selecting <em>Position: Inside</em>, <em>Fill Type: Gradient</em>, and (the most important part) <em>Style: Shape Burst</em>. Choose your own gradient, and adjust the size of the stroke to suit your needs.</li>
</ol>
<h2>In Illustrator</h2>
<img style="margin:20px 0" class="aligncenter size-full wp-image-954" title="illustrator-gradient-path" src="http://pugetworks.com/blog/wp-content/uploads/2012/04/illustrator-gradient-path1.png" alt="" width="580" height="188" />

The process for making these path gradients in Illustrator is more complicated, but also more versatile. It involves making the gradient out of a blend, turning that blend into a brush, and applying the brush to just about anything you want.
<ol>
	<li>Make a blend. The blend will be your gradient, so adjust it accordingly. Also, the width of the blend will become the width of the stroke when you&#8217;re done.</li>
	<li>Select your blend, and drag it into the <em>Brushes </em>palette. When you do, the <em>New Brush</em> dialog pops up.</li>
<ol>
	<li>Select &#8220;Art Brush&#8221; then click OK.</li>
	<li>In the next dialog, make sure &#8220;Stretch to Fit Stroke Length&#8221; is selected, then click OK. A new brush has been created.</li>
</ol>
	<li>Now, whenever you select a stroke you want your gradient applied to, just click the new brush you created and it will be made for you.</li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://pugetworks.com/blog/2012/04/making-gradients-along-a-path-in-photoshop-and-illustrator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is Skeuomorphic Design and When to Use It</title>
		<link>http://pugetworks.com/blog/2012/04/what-is-skeuomorphic-design-and-when-to-use-it/</link>
		<comments>http://pugetworks.com/blog/2012/04/what-is-skeuomorphic-design-and-when-to-use-it/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 00:48:51 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://pugetworks.com/blog/?p=899</guid>
		<description><![CDATA[Design is full of trends and rebellions against those trends. Some technique, element or outlook becomes fashionable, then a backlash forms seemingly out of nowhere proscribing it. I find it difficult to keep up on trends, and I try to base my process on my own experience rather than the... <a class="more" href="http://pugetworks.com/blog/2012/04/what-is-skeuomorphic-design-and-when-to-use-it/"> read the rest of the article</a>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
.leftImg img,.rightImg img{
    border: 20px solid rgba(0, 0, 0, 0.2);
    margin: 20px 20px 20px 0;}
.leftImg img:hover,.rightImg img:hover{border:20px solid rgba(0,0,0,.4)}
</style>

<p>Design is full of trends and rebellions against those trends. Some technique, element or outlook becomes fashionable, then a backlash forms seemingly out of nowhere proscribing it. I find it difficult to keep up on trends, and I try to base my process on my own experience rather than the mode of the times. It&#8217;s hard enough coming up with the best design for your requirements without ruling anything out <em>ex facie</em> . However, there are some popular design trends that just don&#8217;t suit the needs they&#8217;re commonly applied to, and skeuomorphs are a good example of this.</p>

<h3>What are Skeuomorphs?</h3>
<p><a href="http://en.wikipedia.org/wiki/Skeuomorph">Skeuomorphs</a> are design elements that serve no purpose, but stick around because they used to be useful. Software products that do something analogous to an older physical product often contain skeuomorphs: for example, circular knobs to change the volume in a music player, or pages that have to be flipped in a document reader. You don&#8217;t need to flip knobs or turn pages in a digital world, and it&#8217;s quite a bit of extra effort to implement these special controls.</p>

<p>While cute, these elements transfer the limitations of the analog world to the digital one, where they&#8217;re unnecessary and sometimes even counterproductive.  Don&#8217;t make me turn pages for no reason!</p>

<a class="leftImg" href="http://pugetworks.com/blog/wp-content/uploads/2012/03/photo.png"><img class=" wp-image-921 " title="Skeuomorphic Page Flip in iBooks" src="http://pugetworks.com/blog/wp-content/uploads/2012/03/photo-225x300.png" alt="Skeuomorphic Page Flip in iBooks" width="225" height="300" /></a>

<a class="rightImg" href="http://pugetworks.com/blog/wp-content/uploads/2012/03/photo1.png"><img src="http://pugetworks.com/blog/wp-content/uploads/2012/03/photo1-225x300.png" alt="Skeuomorphic keyboard bumps on iPad" title="Skeuomorphic keyboard bumps on iPad" width="225" height="300" class="size-medium wp-image-922" /></a>

<h3>Why use them?</h3>
<p>So why use them? Apple uses skeuomorphs in apps like iCal, Find My Friends, even on their standard virtual keyboard. They claim these artifacts evoke an emotional response in users and immediately orients them to how to use a product.</p>

<p>While it is usually difficult to argue with Apple&#8217;s design rationale, I&#8217;m suspicious of this argument simply because I see no research to support it, and the history of user interface design provides plenty of anecdotal examples to the contrary<sup>1</sup>.</p>

<p>I suppose the real reason for skeuomorphism on first-party iOS applications is simply that they look really, really cool, and even if they don&#8217;t actually make an application more intuitive to use, they make it more approachable. These elements don&#8217;t contribute to usability, they contribute to marketability. In other words, they help inform you about an app does rather than how to do it.</p>

<p>But I can think of at least one case when the use of skeuomorphism adds genuine value to a user&#8217;s experience: aiding in the transition between a physical process and an analogous digital process.</p>

<p>For example, a fine artist used to blending colors on a palette may not at first understand the discrete &#8221; RGB color picker&#8221; model that is the standard in graphic applications like Photoshop. Instead, they may want to select primary colors (or a set of predefined colors mapping to common paints) and mix them together to get the hue they&#8217;re looking for. This works at first, but it&#8217;s inefficient and unnecessary, and as they become familiar with the application they&#8217;ll probably outgrow it. So, why not let them blend colors together on a palette, but also let them select that color, browse through variations of it (a slightly warmer tone, a slightly brighter one, etc.) and then save the color for later use. In other words, use skeuomorphs to help the user approach the application, but do not limit functionality according to any artificial constraints.</p>

<p>Note that the transition between analog and digital processes could go both ways. You could also use skeuomorphic design to help people on a computer to understand how to use physical tools. For example, on a GPS-enabled phone, you can easily locate North with (or even without) the push of a button. On a manual compass, it&#8217;s slightly more involved &#8212; let the magnetic arrow settle, align directions on the housing to the arrow, and change your orientation relative to the compass. But how about a GPS-enabled application that teaches you how to use a manual compass by retaining the artificial limitations and forcing them into the interface?</p>

<p>I&#8217;m skeptical of the use of skeuomorphic design when it is claimed to benefit the usability of a design. I generally believe skeuomorphs serve a mostly decorative purpose and while that&#8217;s not necessarily an argument against them, form should always follow function rather than dictate it.</p>

<p><sup>1</sup><em>I&#8217;d even wager to guess that the trend towards skeuomorphism is cyclical, rising in prominence as new platforms emerge, and waning as these platforms become more familiar. See for example early desktop computer interfaces, which ultimately resolved into the WIMP model, then early web site designs, from which emerged the standard web site interface we&#8217;re all pretty familiar with. No doubt the standard interface for touch-based mobile applications is still being shaken out.</em></p>]]></content:encoded>
			<wfw:commentRss>http://pugetworks.com/blog/2012/04/what-is-skeuomorphic-design-and-when-to-use-it/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Minimum touchable area on mobile devices</title>
		<link>http://pugetworks.com/blog/2012/02/minimum-touchable-area-on-mobile-devices/</link>
		<comments>http://pugetworks.com/blog/2012/02/minimum-touchable-area-on-mobile-devices/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 22:44:00 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://pugetworks.com/?p=712</guid>
		<description><![CDATA[A recent article on Smashing Magazine discussed the challenge of fitting buttons on mobile devices to the size of a user&#8217;s fingertip. It&#8217;s a useful article, and I don&#8217;t take issue with its overall message, but it did remind me of something I&#8217;d been meaning to write about for some... <a class="more" href="http://pugetworks.com/blog/2012/02/minimum-touchable-area-on-mobile-devices/"> read the rest of the article</a>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#phones {
    width: 330px;
    margin:0;
}
#phones td:nth-child(2) {
    width: 50px;
}
#phones th{padding-left:5px;}

#phoneList {
    float: left;
    width: 200px;
    margin:0px 20px 20px 0;
}

#phoneList h3 {
    font-size: 123.1%;
    line-height: 1.3;
}

#phoneList ul {
    margin: 0;
    padding: 0;
}
#phoneList span {
    background: none repeat scroll 0 0 rgba(255, 255, 255, 0.4);
    border-radius: 100px 100px 100px 100px;
    display: block;
    float: left;
    margin-right: 10px;
    text-align: center;
    font-size: 143%;
}
#phoneList li {
    background: none repeat scroll 0 0 rgba(0, 0, 0, 0.1);
    clear: left;
    float: left;
    list-style: none outside none;
    margin-bottom: 3px;
    padding: 10px;
    text-align: right;
    width: 180px !important;
}
.htcInspire span {
    height: 60px;
    width: 60px;
    line-height: 60px;
}
.htcInspire {
}
.googleNexusOne span {
    height: 71px;
    width: 71px;
    line-height: 71px;
}
.googleNexusOne {
}
.iPhone3G span {
    height: 45px;
    width: 45px;
    line-height: 45px;
}
.iPhone3G {
}
.iPhone4G span {
    height: 91px;
    width: 91px;
    line-height: 91px;
}
.iPhone4G {
}
.iPad span {
    height: 37px;
    width: 37px;
    line-height: 37px;
}
.iPad {
}
.motorolaDroid span {
    height: 74px;
    width: 74px;
    line-height: 74px;
}
.motorolaDroid {
}
.samsungInfuse span {
    height: 58px;
    width: 58px;
    line-height: 58px;
}
.samsungInfuse {
}
.samsungGalaxyS span {
    height: 65px;
    width: 65px;
    line-height: 65px;
}
#phones td {
    padding: 11px 8px;
}
.samsungGalaxyS {
}
#phones tr:nth-child(odd) {
    background: rgba(0,0,0,.15);
}
</style>

<!--
	$("#ppi").keyup(function(){
		var ppi = $('#ppi').val();
		if((parseFloat(ppi) == parseInt(ppi)) &#038;&#038; !isNaN(ppi)){
			var squareSize = Math.round((ppi / 1.414213562) / 2.54);  
			$("#output").html(squareSize + 'px');
		} else if(ppi == ''"){
			$("#output").html('');
		} else {
			$("#output").html("Please enter a number")
		}
	});
-->
	<div id="ppi-post">

<p>A recent article on Smashing Magazine discussed the challenge of <a href="http://uxdesign.smashingmagazine.com/2012/02/21/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/">fitting buttons on mobile devices to the size of a user&#8217;s fingertip</a>. It&#8217;s a useful article, and I don&#8217;t take issue with its overall message, but it did remind me of something I&#8217;d been meaning to write about for some time.</p>

<p>A lot of guides for mobile app design quote the minimum touchable area (which you may read as &#8220;button size&#8221;) as 44px. This number comes from the original iPhone Human Interface Guidelines document from the 1st generation iPhone. The Smashing Magazine article also quotes sizes given by Microsoft and Nokia in their own guidelines (34px and 28px, respectively), then goes on to dismiss them as &#8220;not consistent with each other, nor &#8230; consistent with the actual size of the human finger.&#8221;</p>

<p>The thing is, listing different minimum pixel sizes doesn&#8217;t necessarily mean the guidelines are inconsistent. <em>On different devices, the minimum touchable area will be different, and should be</em>. When deciding on a minimal button size, the important thing to consider is the pixel density of the device&#8217;s screen in Dots Per Inch (DPI) or Pixels Per Inch (PPI), which are the same thing as far as I&#8217;m aware. The pixel density is the number of pixels over a linear diagonal inch (yes, on the diagonal, rather than on a side). So, on devices that crowd more pixels into an inch, the density will be higher, and the fingertip will touch more pixels when it presses the screen.</p>

<p>For example, older iPhones have a minimum touchable area of 44px, and a resolution of 320&#215;480 pixels. iPhones with the Retina display have twice the resolution (640&#215;960 pixels) but the same physical screen size, thus they have twice the pixel density. As you would expect, the minimum touchable area on Retina displays is twice that of older displays, or 88px.</p>

<p>The message here is that if you develop applications for multiple mobile devices (as many of us increasingly do), you can&#8217;t just memorize a single &#8220;best&#8221; button size and use that for every screen. You&#8217;ve got to base it off the density of the screen in order to keep it consistent with what actually matters, which is the size of the fingertip.</p>

<h2>How to figure out the minimum button size on any mobile device</h2>

<p>We assume an average fingertip of 1cm. This is a the width of a hefty finger, or about the size of an <a href="http://hcil.cs.umd.edu/trs/2006-11/2006-11.htm">average thumb</a>.</p>

<p>If you know the resolution (in DPI or PPI) of your screen (which should be available on the manufacturer&#8217;s website) you can easily estimate the size of that fingertip on your screen with this equation:</p>
<pre class="brush: jscript; title: ; notranslate">
Radius of minimum touchable pixel area = (PPI / 1.414) / 2.54)
</pre>

<p>If you don&#8217;t know the DPI/PPI of your device, <a href="http://en.wikipedia.org/wiki/Pixel_density#Calculation_of_monitor_PPI">you can easily figure it</a> out using the Pythagorean Theorum.</p>

<p>I took the liberty of figuring out the minimum button size for a number of popular mobile devices. This list is already a bit out of date, and will certainly be even moreso by the time you&#8217;re reading this, but the methodology should still apply even in your futuristic era, dear reader.</p>

<h3>Common fingertip sizes on different devices (in px)</h3>
<div id="phoneList" class="mBottom20">
	<ul>
		<li class="iPhone4G"><span>45</span>iPhone 4G</li>
		<li class="motorolaDroid"><span>74</span>Motorola Droid</li>
		<li class="googleNexusOne"><span>71</span>Google Nexus One</li>
		<li class="samsungGalaxyS"><span>65</span>Samsung Galaxy S</li>
		<li class="htcInspire"><span>60</span>HTC Inspire</li>
		<li class="samsungInfuse"><span>58</span>Samsung Infuse</li>
		<li class="iPhone3G"><span>45</span>iPhone 3G</li>
		<li class="iPad"><span>37</span>iPad</li>
	</ul>
</div>

<table id="phones" class="mBottom20">
<thead>
<th>Phone</th>
<th>DPI</th>
<th>Size of
</thead>
	<tr><td>HTC Arrive</td><td>259 </td><td>72px</td></tr>
	<tr><td>HTC Desire</td><td>252 </td><td>70px x 70px</td></tr>
	<tr><td>HTC Evo</td><td>217 </td><td>60px x 60px</td></tr>
	<tr><td>HTC Inspire</td><td>216 </td><td>60px x 60px</td></tr>
	<tr><td>HTC Sensation</td><td>256 </td><td>71px x 71px</td></tr>
	<tr><td>HTC Thunderbolt</td><td>217 </td><td>60px x 60px</td></tr>
	<tr><td>Google Nexus One</td><td>254 </td><td>71px x 71px</td></tr>
	<tr><td>iPhone 3G </td><td>163 </td><td>45px x 45px</td></tr>
	<tr><td>iPhone 4G</td><td>326 </td><td>91px x 91px</td></tr>
	<tr><td>iPad</td><td>132 </td><td>37px x 37px</td></tr>
	<tr><td>Motorola Defy</td><td>264 </td><td>73px x 73px</td></tr>
	<tr><td>Motorola Droid</td><td>265 </td><td>74px x 74px</td></tr>
	<tr><td>Motorola Droid Incredible</td><td>252 </td><td>70px x 70px</td></tr>
	<tr><td>Samsung Infuse</td><td>207 </td><td>58px x 58px</td></tr>
	<tr><td>Samsung Galaxy S</td><td>233 </td><td>65px x 65px</td></tr>
	<tr><td>Samsung Galaxy S II</td><td>219 </td><td>61px x 61px</td></tr>
</table>

<div class="cb"></div>
</div>

<p>

<!-- Hey, if you can read this, this code is for a widget that will calculate finger size on any DPI. I'm still working on how to get it to work properly in a WordPress post. Take this code if you want it, otherwise ignore my mess - Adam 
	$("#ppi").keyup(function(){ // You should make a text input called 'ppi' first.
		var ppi = $('#ppi').val();
		if((parseFloat(ppi) == parseInt(ppi)) &#038;&#038; !isNaN(ppi)){
			var squareSize = Math.round((ppi / 1.414213562) / 2.54);  
			$("#output").html(squareSize + 'px');
		} else if(ppi == ''"){
			$("#output").html('');
		} else {
			$("#output").html("Please enter a number")
		}
	});
-->
]]></content:encoded>
			<wfw:commentRss>http://pugetworks.com/blog/2012/02/minimum-touchable-area-on-mobile-devices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django Tips: FileField and uploadto</title>
		<link>http://pugetworks.com/blog/2012/02/django-tips-filefield-and-uploadto/</link>
		<comments>http://pugetworks.com/blog/2012/02/django-tips-filefield-and-uploadto/#comments</comments>
		<pubDate>Wed, 22 Feb 2012 23:18:14 +0000</pubDate>
		<dc:creator>Bill</dc:creator>
				<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://pugetworks.com/blog/?p=860</guid>
		<description><![CDATA[The following tip, should help in understanding how the FileField handles the path and url for a file referenced in the database. The Model Object The FileField model in Django is used to store files in Django. The file itself is not stored in the database but on the filesystem,... <a class="more" href="http://pugetworks.com/blog/2012/02/django-tips-filefield-and-uploadto/"> read the rest of the article</a>]]></description>
			<content:encoded><![CDATA[The following tip, should help in understanding how the FileField handles the path and url for a file referenced in the database.

<h2>The Model Object</h2>
The FileField model in Django is used to store files in Django. The file itself is not stored in the database but on the filesystem, with a reference to the file location saved in the database. Once saved, the file can be easily accessed with 2 functions:
 <ul>
 	<li>document.path &#8211; returns the absolute location to the file in relation to the filesystem</li>
	<li>document.url &#8211; returns the absolute location to the file to be used in a web browser</li>
</ul>

<h2>Settings</h2>
The Django docs reference 2 settings variables that should be set:
<ul>
<li>MEDIA_ROOT &#8211; <i>Absolute path to the directory that holds media&#8230;</i></li>
<li>MEDIA_URL &#8211; <i>URL that handles the media served from MEDIA_ROOT</i></li>
</ul>

Now, I don&#8217;t like to expose my filesystem structure to the internet, so I set <i>MEDIA_URL</i> to a specific directory. Then use apache (or a dedicated url configuration) to serve the files. For example:
<pre class="brush: python; title: ; notranslate">MEDIA_URL='/media'</pre>

I also like to isolate my media so that there can be no conflicts, so I use 2 settings variable to store the media root:
<pre class="brush: python; title: ; notranslate">MEDIA_ROOT = os.path.join( os.path.dirname(__file__), 'media/').replace('\\','/')
MODEL_DOC_ROOT = os.path.join( 'model', 'documents' ).replace('\\','/')</pre>

<i>The url configuration is:</i>
    <pre class="brush: python; title: ; notranslate">( r'^model/documents/(?P&lt;path&gt;.*)$', 'django.views.static.serve',
        { 'document_root': '%s/%s' % ( settings.MEDIA_ROOT, settings.MODEL_DOC_ROOT ) } ),</pre>

<h2>uploadto</h2>
<h3>Default</h3>
The Django docs for FileField say:
<blockquote><i>A local filesystem path that will be appended to your <i>MEDIA_ROOT</i> setting to determine the value of the url attribute.</i></blockquote>
This is important, because if you include the complete path, then <i>document.path</i> will be correct, but <i>document.url</i> will have the complete filesystem path in the url&#8230;ack!<br />

<h3>As a function</h3>
The Django docs also say:
<blockquote><i>This may also be a callable, such as a function, which will be called to obtain the upload path, including the filename. This callable must be able to accept two arguments, and return a Unix-style path (with forward slashes) to be passed along to the storage system.</i></blockquote>

If I expect many files to be uploaded, it is cleaner to split them into subdirectories.
My function turned out like the following:
<pre class="brush: python; title: ; notranslate">
def doc_location( instance, filename ):
    root_path = path.join( settings.MODEL_DOC_ROOT, instance.name.slug ).replace('\\','/')
    full_path = settings.MEDIA_ROOT + path.join( '/', root_path ).replace('\\','/')
    
    if not path.exists( full_path ):
        mkdir( full_path )

    return path.join( root_path, filename ).replace('\\','/')
</pre>

<h2>Obscure Pitfalls</h2>
The above works quite well&#8230;. but what the docs don&#8217;t say is:
<ul>
<li>If <i>MODEL_DOC_ROOT</i> starts with &#8216;/&#8217; then <em>MEDIA_ROOT</em> is NOT appended as indicated the docs!</li>
<li>In the <i>doc_location</i> function, if <i>settings.MEDIA_ROOT</i> is included in <i>path.join</i> it doesn&#8217;t get added!?</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://pugetworks.com/blog/2012/02/django-tips-filefield-and-uploadto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android Thread Handling</title>
		<link>http://pugetworks.com/blog/2011/10/android-thread-handling/</link>
		<comments>http://pugetworks.com/blog/2011/10/android-thread-handling/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 14:39:01 +0000</pubDate>
		<dc:creator>Paulin</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mobile Development]]></category>
		<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://pugetworks.com/?p=815</guid>
		<description><![CDATA[Almost every Android application has two parts.  On one side is the user interface that the user controls and views the information with.  On the other side is a network component for talking to a server or updating its information.  When you write an Android application you are always given... <a class="more" href="http://pugetworks.com/blog/2011/10/android-thread-handling/"> read the rest of the article</a>]]></description>
			<content:encoded><![CDATA[Almost every Android application has two parts.  On one side is the user interface that the user controls and views the information with.  On the other side is a network component for talking to a server or updating its information.  When you write an Android application you are always given control of the thread that lets you change the user interface.  But, this bit of software processing is only for updating the user interface.  Sure you can use it to make network calls but, this is a big &#8220;no no&#8221;.  The problem is that the Android application needs to be able to use the UI Thread to make updates, so if you send it off on an errand to retrieve some data from a server, then the application has no way to update the controls.  So essentially the party stops and waits until the network call is complete.  From a users perspective this is awful.  They pushed a button, and now&#8230; nothing.  Then suddenly everything is back.
</p>
In my experience its find to start creating the application this way but, before you can release it you will need to split the network calls into a separate thread.
</p>
This article is about doing just that.
</p>
<h3>Step 1.  Isolate your network calls with a thread call.</h3>
Its assumed at this point that you already have an Android app that is making network calls.  So first go through your code and surround all of them with a block of code that looks like this.
</p>
Essentially change this


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">makeNetworkCall<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>



</p>
into this


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Thread</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Runnable</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   @Override
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      makeNetworkCall<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>



</p>
When you do this, what you are is spinning off a new thread to run out and do the waiting work.  The new problem is, what happens when this new thread is done?
</p>
<h3>Step 2. The Handler</h3>
Behind the scenes is a Java class call the <a href="http://developer.android.com/reference/android/os/Handler.html">Handler</a>.
</p>
This little class can be used build a sort of callback in your main UI Thread so the new threads will have some way to notify it when they are done.  To use it add this bit of code to your Activity class.
</p>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> Handler handler <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Handler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   @Override
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> handleMessage<span style="color: #009900;">&#40;</span>Message msg<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      updateTheUI<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//This method is for whatever needs to happen after the network call is complete</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>



</p>
Now anytime you want to actually make a call back to your UI Thread you will simply have to make this call.
</p>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">handler.<span style="color: #006633;">sendEmptyMessage</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>



That is the basics but, it leaves a big question.  What if I want to send more information than just update?
</p>
<h3>Step 3. Smarter Messages</h3>
If you want to send a better message than just update, you need to figure out how many types of messages you want and what they should be.  They have to be integer values so it would make the most sense to create a bunch of constants in the class to represent these calls.  For instance&#8230;


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> REDRAW <span style="color: #339933;">=</span> <span style="color: #cc66cc;">42</span><span style="color: #339933;">;</span></pre></div></div>



</p>
You will then need to modify your handler to look for this particular code.


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> Handler handler <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Handler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   @Override
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> handleMessage<span style="color: #009900;">&#40;</span>Message msg<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>msg.<span style="color: #006633;">what</span> <span style="color: #339933;">==</span> REDRAW<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
         updateTheUI<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//This method is for whatever needs to happen after the network call is         	</span>
      <span style="color: #009900;">&#125;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>



</p>
Finally, to call this special method you will need to modify your handler calling code to look like this.


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">handler.<span style="color: #006633;">sendEmptyMessage</span><span style="color: #009900;">&#40;</span>REDRAW<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>



</p>
<h3>In conclusion</h3>
Use a handler when you want to spin off new threads too keep the UI Experience responsive.  If you have lots of threads going, then create some custom callback messages.  This will make all of your apps feel instantly responsive.]]></content:encoded>
			<wfw:commentRss>http://pugetworks.com/blog/2011/10/android-thread-handling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Part One: Compass and Sass</title>
		<link>http://pugetworks.com/blog/2011/10/part-one-compass-and-sass/</link>
		<comments>http://pugetworks.com/blog/2011/10/part-one-compass-and-sass/#comments</comments>
		<pubDate>Sat, 08 Oct 2011 17:39:13 +0000</pubDate>
		<dc:creator>Jolovic</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://pugetworks.com/?p=747</guid>
		<description><![CDATA[Problem As a Ruby on Rails developer, you have a lots of choices for creating visually wonderful websites. And with the introduction of Sass in Rails 3.1, CSS has become easier to code then ever. But, say, your Rails app grows and with it so does Sass and CSS. With... <a class="more" href="http://pugetworks.com/blog/2011/10/part-one-compass-and-sass/"> read the rest of the article</a>]]></description>
			<content:encoded><![CDATA[<h1>Problem</h1>
<p>As a Ruby on Rails developer, you have a lots of choices for creating visually wonderful websites. And with the introduction of Sass in Rails 3.1, CSS has become easier to code then ever. But, say, your Rails app grows and with it so does Sass and CSS. With such growth, your files expand. You begin distributing Sass and CSS code to different files, files such as header, footer, content, but, all this becomes a messy business. Get the picture? What if you could consolidate each file to, say, just a file or two? Well, with Compass and Sass, you can!
</p>
<h4>This article deals with the introduction and installation of Compass and Sass and their basic features.</h4>
<h1>Solution with Compass and Sass</h1>
<p>Compass is a generic-framework that heavily uses Sass to generate CSS output. Sass, on the other hand, is a metalanguage that implements programming functions such as “nested rules, variables, mixins, selector inheritance, and more”. Compass and Sass are tightly coupled and are marriage in heaven for web designers: the two eliminate redundancy if you were to code everything in CSS. And, if you are currently implementing CSS3, then you’ll love Compass and Sass. Compass has many great CSS3 functions, such as box-shadow, that saves you so much time typing vendor prefixes.
</p>
<h1>Compass and Sass Features</h1>
<ol>
	<li>Top Level
<ol>
	<li>CSS Rest</li>
	<li>Basic Element Styling</li>
	<li>Basic Structural Rules</li>
	<li>Rules for Browser Inconsistencies</li>
</ol>
</li>
	<li>Form and Table Styling</li>
	<li>Typography</li>
	<li>CSS Grid</li>
</ol>
<h1>Installing</h1>
<h3>For this example, I am using iMac and its Terminal to generate necessary files and move around file structure. My Ruby and Rails are run on RVM.</h3>
<p>With the RVM installed on your computer (and I hope you have RVM installed on your system, if not, take a look at <a href="http://beginrescueend.com/">the RVM site </a>for the installation guid), initiate the following command;</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">gem install compass</pre></div></div>



<p>However if you are not using RVM, initiate the following command;</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">sudo gem install compass</pre></div></div>



<p>Now make sure compass is installed:</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">compass version</pre></div></div>



<p>If all went well, you should see compass&#8217;s version number as well as its credits.</p>
<h1>Creating a Compass Project</h1>
<p>To create a Compass project, it&#8217;s very simple.</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">compass create /path/to/project --using blueprint</pre></div></div>



<p>Notice at the end of the command, I am using the option flag <code>--using</code> and <code>blueprint</code> as the CSS framework for the project. I could have left out both of these and would have ended with the project itself. But I like blueprint, so I am going to leave it the way it is. Oh, and if you wish to have something other then the blueprint, you can. Just make sure you have the right type of framework compatible with Compass. <a href="https://github.com/chriseppstein/compass/wiki/compass-plugins">Here are a few for your creative juices</a>. However, it isn&#8217;t necessary to have any frameworks. Compass has it&#8217;s own CSS library too!
</p>
<p>
This command also spits out initial file structure Compass has created for you, and it also tell you to place the last part of this message, which is the stylesheets location, in your index.html page. Do that and you are ready to move on to a final step before getting into the application itself. Here is my stylesheets code:
</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">   href=&quot;/stylesheets/screen.css&quot; media=&quot;screen, projection&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;
   href=&quot;/stylesheets/print.css&quot; media=&quot;print&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;
   href=&quot;/stylesheets/ie.css&quot; media=&quot;screen, projection&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;</pre></div></div>




<p>
During this final step is make sure that Compass watches for any changes in your files. In this case, files that end with .scss or .sass. These files will then be converted to CSS (generated into CSS) as the final output! Wow. That&#8217;s going to be a lot of CSS! Yes, but it will be a compressed CSS that&#8217;s much faster for browser rendering. To do so, issue the following:
</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">compass watch /path/to/project</pre></div></div>



<p>That&#8217;s it! From here onwards, all we need to do is get into one of those .sass or .scss files and start coding.</p>
<h1>Next Article Coming Soon</h1>]]></content:encoded>
			<wfw:commentRss>http://pugetworks.com/blog/2011/10/part-one-compass-and-sass/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software Application Pills</title>
		<link>http://pugetworks.com/blog/2011/09/software-application-pills/</link>
		<comments>http://pugetworks.com/blog/2011/09/software-application-pills/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 21:13:39 +0000</pubDate>
		<dc:creator>Paulin</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://pugetworks.com/?p=823</guid>
		<description><![CDATA[A friend of mine once pointed out that when you are creating software, a very good way to look at it is &#8220;how dependent will your users be on your software?&#8221;.  Then in his usual clever way, he related it to pills.  Well, not pills so much but, pill like... <a class="more" href="http://pugetworks.com/blog/2011/09/software-application-pills/"> read the rest of the article</a>]]></description>
			<content:encoded><![CDATA[<div>A friend of mine once pointed out that when you are creating software, a very good way to look at it is &#8220;how dependent will your users be on your software?&#8221;.  Then in his usual clever way, he related it to pills.  Well, not pills so much but, pill like items.   In this regards how do you want to package the software for easy consumption?  How often do you want people to use it?  How hard do you want it to be for your clients to walk away?
</p>
It turns out that his metaphor splits nicely into 4 categories; candy, vitamins, medicine and heart meds.
<h3 >Candy</h3>
At the candy level you are talking about fun software.  You are looking to have a huge base of people that might try this out on an impulse.  It&#8217;s right there at the check out stand.  You don’t really need it, you could walk away.  But, somehow candy keeps on selling.  It&#8217;s a treat, it&#8217;s fun, it&#8217;s colorful, playful, and something new.  There are lots of apps like this.  The whole game industry is built around candy apps.  In no way, shape, or form do I need to be playing; minecraft, angry birds, or any of these other huge distractions.  But, it is great amusement and enjoyable.  Thus&#8230; candy.
</p>
Do notice that the price point and volume have to reflect this.  I don’t buy designer candy.  I’m not even sure if that exist.  Candy is cheap, but it makes up for that in volume.   Also think about the life cycle of your relationship with candy.  It&#8217;s short, maybe you come back for that brand of candy but, it isn’t something you half to have.
</p>
<h3 >Vitamins</h3>
Next come the vitamins.  These are like nuggets of hope and prevention all wrapped into one easy to consume package.  At the root, why do you take vitamins?  It&#8217;s a type of insurance right?  It keeps you from getting sick, or helps you get stronger.  These are your anti-virus software, your backup software.  They are a little investment of time now for a lot less problems later.
</p>
Now also think about the volume of these sales.  People take vitamins regularly.  Well&#8230; sort of. They don’t have to take them so sometimes you skip, or you come back to it later.  But, the point is to do something regularly.  It is more expensive than candy but, you don’t eat a bunch of vitamins like you would candy.  The same goes for software.  You only need a couple of these apps.  You probably don’t try out anti-virus software packages like you would games.  You pick one and stick with it.  Same sort of mentality.
</p>
<h3 >Medicine</h3>
You are even more dependent on medicines than vitamins.  You might choose to not take a vitamin but you feel foolish not taking your medicine.  There is software like this as well.  Its core to your business.  Software that keeps things moving.  You could get rid of it but, it would be a bad idea and you would need to find an equivalent.  This is software you don’t want to ignore.
</p>
<h3>Heart Meds</h3>
Finally there are heart meds.  These are a type of medicine you have to take every day or you might die.  That makes them very important to you.  These are expensive, you plan around them, you budget for them, you make sure that at all cost this is available.  Some software is like this as well.  In many industries there is that one vendor or programmer that the entire venture hinges on.  This is what is most important to you.  This isn’t the same as an off the shelf equivalent, but more like a custom software package that is integrated into the company.  The point is dependency.  With a heart med type software your users must have it.  Usually these are older pieces of software that are well wedged into the system. Think about salesforce applications or business process applications.
</p>
<h3>Conclusion</h3>
So when you are thinking about creating software, it might help to think about how dependent you want your users to be.  Do you want the high volume transient sales of candy, or the low volume pricey heart meds.  You need to price and plan for this accordingly.  People don’t buy super expensive candy.  So why would you make a game to sell for $100?
</p>
Also consider that with this comes the development cost and the cost to get these introduced to new customers.  For instance, I bet it is much easier to make and sell candy than it is to sell designer drugs.  It&#8217;s just a hunch.
]]></content:encoded>
			<wfw:commentRss>http://pugetworks.com/blog/2011/09/software-application-pills/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
