<?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>Joe Homs &#187; Design</title>
	<atom:link href="http://journal.bitshaker.com/articles/category/design/feed/" rel="self" type="application/rss+xml" />
	<link>http://journal.bitshaker.com</link>
	<description>agent of change</description>
	<lastBuildDate>Thu, 24 Jun 2010 21:22:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>Checklists</title>
		<link>http://journal.bitshaker.com/articles/2010/01/17/checklists/</link>
		<comments>http://journal.bitshaker.com/articles/2010/01/17/checklists/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 19:36:54 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://journal.bitshaker.com/articles/2010/01/17/checklists/</guid>
		<description><![CDATA[One of the main duties I performed as a consultant was kicking off a project for a new client. The process went by many different names. Iteration zero, project kickoff, inception, and QuickStart. Sometimes a combination of them. The thing I learned right away was that there was always plenty to think about and set [...]]]></description>
			<content:encoded><![CDATA[<p>One of the main duties I performed as a consultant was kicking off a project for a new client. The process went by many different names. Iteration zero, project kickoff, inception, and QuickStart. Sometimes a combination of them.</p>
<p>The thing I learned right away was that there was always plenty to think about and set up. All projects are different of course, but all projects are also the same in many ways. So, I began to do what I always do in a new situation and make a checklist. </p>
<p>I learned this skill a long time ago and it has served me well in many different ways. To my clients, I seem to have a super memory and intellect. Combining the checklist with GTD helps greatly. To my colleagues, I can share the list and get feedback and improvements for my own projects and help theirs. Now on with how to create your checklist. </p>
<p>First, I almost never start from scratch. I look to those who have done it before and have learned lessons the hard way. Nobody is smart enough to think of everything, and besides, why duplicate work? Look to retrospectives, post mortems, project wrap ups, lessons learned, bug reports, lawsuits (yep&#8230;), API versions, forums, email lists, etc. Anything where people are seeing 20/20 after something went well or, more importantly, something went wrong. Put it all on the list without filtering. If you don&#8217;t have stuff written down somewhere, try interviewing people and listen to their war stories. You&#8217;ll learn some good lessons. Write. Them. Down.</p>
<p>Second, once you have your list, try organizing it by rough topics: architecture, project management, QA, analysis, client relations, contracts, etc. This is a good time to take the list to your coworkers and ask them to fill in areas that you&#8217;ve missed. The important thing to remember is to keep things on the list unless they are incorrect.  This list is for all projects, not just &#8220;your&#8221; project.</p>
<p>After you&#8217;ve created your checklist, put it somewhere it can be seen and used as well as collaborated on.  A wiki is great for this because you can have multiple editors and you&#8217;ll get to see all of the versions. Tell people where it is and have them use it.  Asking for feedback on how it works is a great way to get them to use it.  They&#8217;ll improve things and add new items as they come up.</p>
<p>At this point, you&#8217;re probably expecting an example or even full version of my checklist.  Sorry.  That would rob you of the experience of creating it yourself which is well worth your time in just the collaboration alone.</p>
<p>Initially, people will complain that your checklist is too long. Ignore them. Explain that the checklist is there to keep them safe and spending a 30 seconds or a minute on each item on the checklist will save them loads of time and mistakes later.</p>
<p>One last thing.  The checklist is a great tool to make sure you haven&#8217;t forgotten anything, but it isn&#8217;t a substitute for critical thinking.  The checklist will help you to not look dumb, but you still have to be smart.  Good luck.</p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2010/01/17/checklists/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DSLs and Friends</title>
		<link>http://journal.bitshaker.com/articles/2008/12/16/dsls-and-friends/</link>
		<comments>http://journal.bitshaker.com/articles/2008/12/16/dsls-and-friends/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 02:47:45 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://journal.bitshaker.com/?p=411</guid>
		<description><![CDATA[My friends and fellow ThoughtWorkers Michael Schubert, Jay Fields, and Stephen Chu were just complimented by Martin Fowler. This isn&#8217;t to say that there&#8217;s no benefit in a business-writable DSL. Indeed a couple of years ago some colleagues of mine built a system that included just that, and it was much appreciated by the business. [...]]]></description>
			<content:encoded><![CDATA[<p>My friends and fellow ThoughtWorkers <a title="Michael Schubert" href="http://schubert.cx">Michael Schubert</a>, <a title="Jay Fields" href="http://jayfields.com">Jay Fields</a>, and <a title="Stephen Chu" href="http://www.stephenchu.com/">Stephen Chu</a> were just complimented by Martin Fowler.</p>
<blockquote><p>This isn&#8217;t to say that there&#8217;s no benefit in a business-writable DSL. Indeed a couple of years ago some colleagues of mine built a system that included just that, and it was much appreciated by the business. It&#8217;s just that the effort in creating a decent editing environment, meaningful error messages, debugging and testing tools raises the cost significantly.</p></blockquote>
<p>What Martin doesn&#8217;t go on to explain is that this project vastly improved efficiency for a whole organization.  They went from a situation where it took months with dozens of programmers to change some business rules in their software to minutes with all sorts of extras they couldn&#8217;t get before like &#8220;what-if&#8221; simulations.</p>
<p>Jay wrote about some of the things they learned in <a title="Jay Fields BNL" href="http://www.infoq.com/presentations/fields-business-natural-languages-ruby">this presentation</a> on InfoQ and much more on his blog about <a title="Jay Fields on DSLs" href="http://blog.jayfields.com/search?q=DSL">DSLs</a>.</p>
<p>via <a href="http://martinfowler.com/bliki/BusinessReadableDSL.html">MF Bliki: BusinessReadableDSL</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2008/12/16/dsls-and-friends/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What&#8217;s Your Exit Strategy?</title>
		<link>http://journal.bitshaker.com/articles/2008/12/04/whats-your-exit-strategy/</link>
		<comments>http://journal.bitshaker.com/articles/2008/12/04/whats-your-exit-strategy/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 19:21:18 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://journal.bitshaker.com/articles/2008/12/04/whats-your-exit-strategy/</guid>
		<description><![CDATA[An occupational hazard of being a consultant is that you get to see lots of the same problems in many different organizations. It seems that sometimes little thought is given to how an organization can move from one technology to another or to move from legacy systems (where legacy means it doesn&#8217;t fit the organization [...]]]></description>
			<content:encoded><![CDATA[<p>An occupational hazard of being a consultant is that you get to see lots of the same problems in many different organizations.</p>
<p>It seems that sometimes little thought is given to how an organization can move from one technology to another or to move from legacy systems (where legacy means it doesn&#8217;t fit the organization anymore) to better solutions.</p>
<p>Today&#8217;s decisions can be tomorrow&#8217;s botleneck or bad design. It&#8217;s just a matter of time.</p>
<p>What can you do to help your future organization? Things like SOA can help. Great tests around your application are essential if you ever make the choice to change.</p>
<p>I&#8217;m looking for something better. I don&#8217;t know if you can ever get to a system that is that responsive to change. I&#8217;d like to see one that is. </p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2008/12/04/whats-your-exit-strategy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PSA: Don&#8217;t Generate Offensive Promo Codes</title>
		<link>http://journal.bitshaker.com/articles/2008/09/10/psa-dont-generate-offensive-promo-codes/</link>
		<comments>http://journal.bitshaker.com/articles/2008/09/10/psa-dont-generate-offensive-promo-codes/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 21:24:39 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://journal.bitshaker.com/?p=387</guid>
		<description><![CDATA[OK folks, I&#8217;m now on my 3rd client having problems with certain four letter words coming up in their automatically generated promo codes. It&#8217;s easy to get around this problem in a very simple way: Don&#8217;t use vowels in your promo codes if you&#8217;re using letters. No need for special filtering software or huge lists [...]]]></description>
			<content:encoded><![CDATA[<p>OK folks, I&#8217;m now on my 3rd client having problems with certain four letter words coming up in their automatically generated promo codes.  It&#8217;s easy to get around this problem in a very simple way: <strong>Don&#8217;t use vowels in your promo codes if you&#8217;re using letters</strong>.  No need for special filtering software or huge lists of banned words.  You can always add complexity later, but that simple rule will help you more than the rest.</p>
<p>If you want to get more careful, you could alternate letters and numbers, or use some other strategy.  To be kind to your users, be aware that some numbers and letters look the same to people and they will enter your codes wrong (or worse, enter in someone else&#8217;s code by mistake).</p>
<p>To help you, here&#8217;s a list of the numbers and letters I suggest people use because they won&#8217;t get them confused with each other and hopefully your system won&#8217;t create any bad words (if they do, let me know).  If you&#8217;re worried about the number of combinations you can make, just add more characters to the length of your code or allow yourself the option to generate your own special codes.</p>
<p>letters = ['B', 'C', 'D', 'F', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z']<br />
numbers = [2, 3, 4, 7, 9]</p>
<p>You could then take this and make a simple ruby method that does something like this:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">letters = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'B'</span>, <span style="color:#996600;">'C'</span>, <span style="color:#996600;">'D'</span>, <span style="color:#996600;">'F'</span>, <span style="color:#996600;">'H'</span>, <span style="color:#996600;">'J'</span>, <span style="color:#996600;">'K'</span>, <span style="color:#996600;">'L'</span>, <span style="color:#996600;">'M'</span>, <span style="color:#996600;">'N'</span>, <span style="color:#996600;">'P'</span>, <span style="color:#996600;">'Q'</span>, <span style="color:#996600;">'R'</span>, <span style="color:#996600;">'S'</span>, <span style="color:#996600;">'T'</span>, <span style="color:#996600;">'V'</span>, <span style="color:#996600;">'W'</span>, <span style="color:#996600;">'X'</span>, <span style="color:#996600;">'Y'</span>, <span style="color:#996600;">'Z'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
numbers = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">2</span>, <span style="color:#006666;">3</span>, <span style="color:#006666;">4</span>, <span style="color:#006666;">7</span>, <span style="color:#006666;">9</span><span style="color:#006600; font-weight:bold;">&#93;</span>
promo_set = letters <span style="color:#006600; font-weight:bold;">|</span> numbers <span style="color:#008000; font-style:italic;"># combine arrays</span>
promo_code = promo_set.<span style="color:#9900CC;">sort_by</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#91;</span>0..14<span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_s</span> <span style="color:#008000; font-style:italic;"># randomize array and take the first 15 elements and make them a string</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;CS4FZLHVMPK3QJN&quot;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2008/09/10/psa-dont-generate-offensive-promo-codes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mingle Tip: Search Mingle Projects Directly In Firefox</title>
		<link>http://journal.bitshaker.com/articles/2008/05/20/mingle-tip-search-mingle-projects-directly-in-firefox/</link>
		<comments>http://journal.bitshaker.com/articles/2008/05/20/mingle-tip-search-mingle-projects-directly-in-firefox/#comments</comments>
		<pubDate>Tue, 20 May 2008 14:29:26 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Mingle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Do you love using Firefox&#8217;s built in Google search? Wish there was a way you could do that with your Mingle projects? Well, now you can with the code below. I&#8217;ve provided a download of the xml file here. You&#8217;ll need to edit the file to point to the Mingle project you want to use [...]]]></description>
			<content:encoded><![CDATA[<p>Do you love using Firefox&#8217;s built in Google search?  Wish there was a way you could do that with your Mingle projects?  Well, now you can with the code below.</p>
<p>I&#8217;ve provided a download of the xml file <a href="http://journal.bitshaker.com/files/mingle_search.xml">here</a>.</p>
<p>You&#8217;ll need to edit the file to point to the Mingle project you want to use the search tool with and then you need to install it into your searchplugins directory for Firefox, which for Windows is probably something like</p>
<pre>C:\Program Files\Mozilla Firefox\searchplugins</pre>
<p>and for Mac is something like</p>
<pre>/Applications/Firefox.app/Contents/MacOS/searchplugins/</pre>
<p>Drop the xml file in the folder and restart Firefox and you&#8217;ll have your new Mingle search up and running.  It should look like this</p>
<p><img src="http://journal.bitshaker.com/files/mingle_firefox_search.png" alt="" /></p>
<p>Note: I&#8217;m working on getting this to work as described in <a href="http://developer.mozilla.org/en/docs/Creating_OpenSearch_plugins_for_Firefox">this mozilla dev article</a> for Mingle.  It shouldn&#8217;t be too hard since we can modify views in Mingle.  I&#8217;ll blog about it if people are interested.</p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2008/05/20/mingle-tip-search-mingle-projects-directly-in-firefox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PSA: Tab Between All Controls On Mac</title>
		<link>http://journal.bitshaker.com/articles/2008/05/14/psa-tab-between-all-controls-on-mac/</link>
		<comments>http://journal.bitshaker.com/articles/2008/05/14/psa-tab-between-all-controls-on-mac/#comments</comments>
		<pubDate>Wed, 14 May 2008 21:04:46 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I normally love the Mac&#8217;s design decisions, but one thing that&#8217;s always maddened me is that by default you can&#8217;t tab between all controls on webpages, etc. I finally got that fixed today with an article from lifehacker. Click the &#8220;All Controls&#8221; radio button at the bottom of the Keyboard &#38; Mouse pane in System [...]]]></description>
			<content:encoded><![CDATA[<p>I normally love the Mac&#8217;s design decisions, but one thing that&#8217;s always maddened me is that by default you can&#8217;t tab between all controls on webpages, etc.  I finally got that fixed today with an article from lifehacker.</p>
<blockquote><p>Click the &#8220;All Controls&#8221; radio button at the bottom of the Keyboard &amp; Mouse pane in System Preferences to right this wrong.</p>
</blockquote>
<p>Bliss.</p>
<p>[<a href="http://lifehacker.com/390226/top-10-things-you-forgot-your-mac-can-do">via</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2008/05/14/psa-tab-between-all-controls-on-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>When Distrust Turns To Disdain</title>
		<link>http://journal.bitshaker.com/articles/2008/05/09/when-distrust-turns-to-disdain/</link>
		<comments>http://journal.bitshaker.com/articles/2008/05/09/when-distrust-turns-to-disdain/#comments</comments>
		<pubDate>Fri, 09 May 2008 20:00:15 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[While taking computer science classes in college, I was taught to distrust a user&#8217;s input in all cases. The theory goes that a user&#8217;s data can&#8217;t be trusted because it could be malicious or just a simple mistake that causes your program to have an error with input it didn&#8217;t expect. So you protect your [...]]]></description>
			<content:encoded><![CDATA[<p>While taking computer science classes in college, I was taught to distrust a user&#8217;s input in all cases.  The theory goes that a user&#8217;s data can&#8217;t be trusted because it could be malicious or just a simple mistake that causes your program to have an error with input it didn&#8217;t expect.  So you protect your system from incorrect user input and sanitize it.  It always felt like one of our dirtier secrets to me, however I fully advocate the practice in code.</p>
<p>My problem comes when the people building software turn from distrusting their user&#8217;s input to having a level of disdain for the users themselves.  It starts innocently enough with the engineering principles I described above, but can sometimes turn into small things like, &#8220;Our users won&#8217;t understand that,&#8221; and starts to slip into things like, &#8220;Our users are dumb, so we won&#8217;t do that.&#8221;  If you&#8217;ve started to hate your users, you&#8217;ve gone too far.  If something is too complex for your users to understand, it&#8217;s your job as the developer/engineer/analyst/etc. to make it so that they can understand it.  If you think of your users like idiots, your system will reflect that and they will notice.</p>
<p>If your job is to design software for people to use (which, is pretty much all software), make sure you work with the user, instead of against their best interests.</p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2008/05/09/when-distrust-turns-to-disdain/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Developers Don&#8217;t Read Stories, So Talk To Them Instead</title>
		<link>http://journal.bitshaker.com/articles/2008/05/06/developers-dont-read-stories-so-talk-to-them-instead/</link>
		<comments>http://journal.bitshaker.com/articles/2008/05/06/developers-dont-read-stories-so-talk-to-them-instead/#comments</comments>
		<pubDate>Tue, 06 May 2008 22:31:49 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[In Jakob Neilsen&#8217;s How Little Do Users Read? he sites an ACM study that has found that people typically only read about 20% of content on a page on average, with a max of around 28%. This just confirms my suspicion that developers fully don&#8217;t read the stories that I write for them, even though [...]]]></description>
			<content:encoded><![CDATA[<p>In Jakob Neilsen&#8217;s <a href="http://www.useit.com/alertbox/percent-text-read.html">How Little Do Users Read?</a> he sites an <a href="http://doi.acm.org/10.1145/1326561.1326566">ACM study</a> that has found that people typically only read about 20% of content on a page on average, with a max of around 28%.</p>
<p>This just confirms my suspicion that developers fully don&#8217;t read the stories that I write for them, even though they are highly focused and relevant to what they are looking for.  Instead of reading, they skim and look at the screenshots I provide.</p>
<p>What can we take away from this?  Treat stories as a conversation point, rather than a full design spec.  If your devs have to read thousands of words in your stories, they are too big.  Talk to your team and make sure people understand what you are trying to do.</p>
<p>At 130 words above, most people have read only 26 words in this article, meaning they&#8217;ve barely read the first paragraph.  Scary.</p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2008/05/06/developers-dont-read-stories-so-talk-to-them-instead/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AntiSamy &#8211; HTML In Web Apps</title>
		<link>http://journal.bitshaker.com/articles/2007/12/03/antisamy-html-in-web-apps/</link>
		<comments>http://journal.bitshaker.com/articles/2007/12/03/antisamy-html-in-web-apps/#comments</comments>
		<pubDate>Mon, 03 Dec 2007 20:38:53 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[A big problem right now in web application development is allowing users to add in HTML and then protecting them from malicious javascript. Fortunately, someone is working on this problem and giving the rest of us the results for free. The &#8220;AntiSamy&#8221;:http://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project library is named after the samy &#8220;worm&#8221; that hit MySpace and infected many [...]]]></description>
			<content:encoded><![CDATA[<p>A big problem right now in web application development is allowing users to add in HTML and then protecting them from malicious javascript.  Fortunately, someone is working on this problem and giving  the rest of us the results for free.</p>
<p>The &#8220;AntiSamy&#8221;:http://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project library is named after the samy &#8220;worm&#8221; that hit MySpace and infected many thousands of pages before it was contained.</p>
<p>The page mentions that there is very little interest from the Rails community on this.  I know there are plugins like the &#8220;whitelist plugin&#8221;:http://agilewebdevelopment.com/plugins/whitelist, but AntiSamy looks at least to be a nice compliment to something like whitelist.</p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2007/12/03/antisamy-html-in-web-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Old Software Never Really Dies</title>
		<link>http://journal.bitshaker.com/articles/2007/10/29/old-software-never-really-dies/</link>
		<comments>http://journal.bitshaker.com/articles/2007/10/29/old-software-never-really-dies/#comments</comments>
		<pubDate>Mon, 29 Oct 2007 20:17:22 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I just got a support request from someone today for a web application that I helped to write in college. It was my first Rails project and it was made as a senior class project. We had a client who was a professor from another department. We had to write our own version of backgrounDRb, [...]]]></description>
			<content:encoded><![CDATA[<p>I just got a support request from someone today for a web application that I helped to write in college.  It was my first Rails project and it was made as a senior class project.  We had a client who was a professor from another department.  We had to write our own version of backgrounDRb, used an early version of Rails, and wrote Flash as the front-end to an annotating engine for documents.</p>
<p>It was a great success for us using Rails and Ruby for the first time.  We easily exceeded all expectations set in the beginning of the 10 week class.  We had demo screencasts, a professional looking site, a great code/test ratio (first time ever for me), and a very happy customer.  Some departments in our school were seriously considering using it for their document collaboration needs, and apparently, the software found its way around the world entirely by word of mouth.</p>
<p>I haven&#8217;t touched the code in several years and the machine that housed the subversion repo is long gone.  It got me thinking about how software never really dies.  I had no idea these people were using it to this day, but it still lives out there.  I don&#8217;t even have the original site up anymore, so there&#8217;s no place to download the code.</p>
<p>It&#8217;s sort of cool and strange knowing that something that I wrote as a class project is being used by people to actually get work done.  Maybe I&#8217;ll pick it back up and polish off the old code and breathe some new life into it someday.  It&#8217;s just weird to think of a Flash/Rails app I wrote a few years ago as &#8220;old.&#8221;  There&#8217;s going to be more of that in the future and it&#8217;s a refreshing reminder that everything old is new again and software never truly dies.</p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2007/10/29/old-software-never-really-dies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Less Junk Mail &#8211; Now With Less Privacy</title>
		<link>http://journal.bitshaker.com/articles/2007/06/13/less-junk-mail-now-with-less-privacy/</link>
		<comments>http://journal.bitshaker.com/articles/2007/06/13/less-junk-mail-now-with-less-privacy/#comments</comments>
		<pubDate>Wed, 13 Jun 2007 02:30:42 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I was going through a backlog of feeds today and noticed a number that I could call that would allow me to opt-out of getting credit card junk mail from the big credit bureaus. I thought to myself, &#8220;Great, I really hate those things and they go directly to the trash. Let&#8217;s see if I [...]]]></description>
			<content:encoded><![CDATA[<p>I was going through a backlog of feeds today and noticed a number that I could call that would allow me to opt-out of getting credit card junk mail from the big credit bureaus.  I thought to myself, &#8220;Great, I really hate those things and they go directly to the trash.  Let&#8217;s see if I can stop it for a while.&#8221;</p>
<p>For those outside the US that don&#8217;t know, we Americans get a ton of junk mail from a bunch of credit card companies and other companies we could care less about because these credit bureaus keep a mailing list with our names on them and then they sell the list to direct marketers.  It&#8217;s a great business for them and they can even qualify you as a good lead because they know your credit score.  What turns out to be good business for them is really annoying to those of us who have to receive this mail.</p>
<p>So, I call the number and I get a computerized greeting.  The nice computerized voice tells me that there are no operators to take my call, but that I can still opt-out.  She asks me if my phone number is the one that I&#8217;m calling from (I&#8217;m assuming they have caller ID, but that can be blocked or I could call from a pay-phone) and I say no.  The computer then asks me to say the phone number for the residence I want to opt-out for.  I give them the number to my house and the computer starts reading back my home address to ask me if it is correct.  _Wait, what?_  A little concerned, I say yes because it was my address.  It then proceeds to say my full name and asks me to confirm.  I say yes because that&#8217;s correct too.</p>
<p>Thankfully, that&#8217;s all the information that it decided to give to me without asking for any sort of verification, only a phone number which I could have picked out randomly, or worse yet, given to someone who now wants to find out where I live.</p>
<p>The rest of the call asked me to enter in my social security number and date of birth to confirm that I was who I said I was.</p>
<p>This seems backwards to me.  Shouldn&#8217;t I have to tell you who I am with some information that I don&#8217;t just readily give away?  I don&#8217;t go around printing my social security number on business cards, but I do print my phone number on business cards.  My information is in their systems if they are using what I enter to verify the transaction.  Ask me this information first before you disclose my name and home address to anyone I&#8217;ve given my phone number to.</p>
<p>Here&#8217;s the number for those interested: 1-888-5-OPTOUT</p>
<p>For those who are going to say that this number was fake and that I just got my identity stolen, I used the web browser on my phone and checked this number out before I called.  That is also where my feed reader is.  The number is listed on the <a href="www.ftc.gov/bcp/conline/pubs/credit/prescreen.shtm">Federal Trade Commission&#8217;s website</a> along with a link to a free website where you can enter in your information to opt out.  I was going to use the form, but typing in a whole bunch of data using your phone is not ideal with a simple 12 button keypad, so I decided to use the number.  The website gets things right.  I have to enter in tons of information about myself including my address.  The phone number just gives it up willingly.</p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2007/06/13/less-junk-mail-now-with-less-privacy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crucial.com Gets Customers</title>
		<link>http://journal.bitshaker.com/articles/2007/02/01/crucial-com-gets-customers/</link>
		<comments>http://journal.bitshaker.com/articles/2007/02/01/crucial-com-gets-customers/#comments</comments>
		<pubDate>Thu, 01 Feb 2007 15:28:41 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I bought some RAM today for my laptop and had a great experience with crucial.com. First, there was a program that they allowed me to download (if you use IE, it just runs right in the browser) that showed me exactly how much RAM I had and more importantly, _where_ it was installed. It showed [...]]]></description>
			<content:encoded><![CDATA[<p>I bought some RAM today for my laptop and had a great experience with <a href="http://crucial.com">crucial.com</a>.</p>
<p>First, there was a program that they allowed me to download (if you use IE, it just runs right in the browser) that showed me exactly how much RAM I had and more importantly, _where_ it was installed.  It showed me that I had 1GB of RAM in a single slot.</p>
<p>Then I got a recommendation for which RAM I needed based on Crucial knowing exactly what computer I had.  Their suggestion was exactly what I needed.</p>
<p>Purchasing the RAM was my favorite part of the experience.  In my opinion, this is where Crucial gets things _really_ right.  I didn&#8217;t have to log in, sign up, or otherwise register for anything on their site.  I just put in my shipping and billing information and I was done.</p>
<p>The last nice touch was this little gem that appeared in the middle of my order confirmation.</p>
<p><img src="http://journal.bitshaker.com/files/crucial_account.gif" /></p>
<p>Nothing to fill out if I didn&#8217;t want to, but a genuine attempt at making my life easier if I was going to have multiple orders.</p>
<p>Thanks Crucial, it was a great buying experience.</p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2007/02/01/crucial-com-gets-customers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Protect Users From Themselves</title>
		<link>http://journal.bitshaker.com/articles/2007/01/19/prevent-users-from-themselves/</link>
		<comments>http://journal.bitshaker.com/articles/2007/01/19/prevent-users-from-themselves/#comments</comments>
		<pubDate>Fri, 19 Jan 2007 20:52:39 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Often, when designing a system for users, we look at what they could do wrong and either try and prevent it or tell them what&#8217;s going wrong. I prefer to take as much of a proactive approach as I can by having the system fix the problem and not even bother the user with an [...]]]></description>
			<content:encoded><![CDATA[<p>Often, when designing a system for users, we look at what they could do wrong and either try and prevent it or tell them what&#8217;s going wrong.  I prefer to take as much of a proactive approach as I can by having the system fix the problem and not even bother the user with an error message if it&#8217;s not absolutely necessary.</p>
<p>This same mentality holds true for the way users expect a system to work.  I found an example from <a href="http://www.bloglines.com/">bloglines</a> today, which is a great service that I use every day.</p>
<p>Bloglines has the nice feature of letting you use keyboard shortcuts to navigate around your feeds and the posts within them.  It&#8217;s a tremendous time saver not having to scroll all the time.  However, this morning, I discovered an oversight that is easy to fix: if I have caps lock enabled, the navigation doesn&#8217;t work.  It is something that only comes up in a blue moon, but it took me a minute to figure out what was going on today to correct the problem.</p>
<p>The problem is with the javascript that bloglines uses to capture the key events and perform an action.  Here&#8217;s a (snipped) example.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> g_hotkey_scrolldown <span style="color: #339933;">=</span> <span style="color: #CC0000;">106</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// j</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> whichCode <span style="color: #339933;">==</span> g_hotkey_scrolldown <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// j - scroll down pane</span>
    cancelEvent<span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>main.<span style="color: #660066;">basefrm</span> <span style="color: #339933;">&amp;&amp;</span> main.<span style="color: #660066;">basefrm</span>.<span style="color: #660066;">gotoNextItem</span><span style="color: #009900;">&#41;</span> main.<span style="color: #660066;">basefrm</span>.<span style="color: #660066;">gotoNextItem</span><span style="color: #009900;">&#40;</span>nav4<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>main.<span style="color: #660066;">gotoNextItem</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        main.<span style="color: #660066;">gotoNextItem</span><span style="color: #009900;">&#40;</span>nav4<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>This only captures the lowercase j, but if you wanted to capture the uppercase J (because someone might have the caps lock enabled by accident), then it would be simple to change the whichCode line to add in the case for uppercase J.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> g_hotkey_scrolldown <span style="color: #339933;">=</span> <span style="color: #CC0000;">106</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// j</span>
<span style="color: #003366; font-weight: bold;">var</span> g_hotkey_scrolldown_upper <span style="color: #339933;">=</span> <span style="color: #CC0000;">74</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// J (uppercase)</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> whichCode <span style="color: #339933;">==</span> g_hotkey_scrolldown <span style="color: #339933;">||</span> whichCode <span style="color: #339933;">==</span> g_hotkey_scrolldown_upper<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// j (upper and lower) - scroll down pane</span>
    cancelEvent<span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>main.<span style="color: #660066;">basefrm</span> <span style="color: #339933;">&amp;&amp;</span> main.<span style="color: #660066;">basefrm</span>.<span style="color: #660066;">gotoNextItem</span><span style="color: #009900;">&#41;</span> main.<span style="color: #660066;">basefrm</span>.<span style="color: #660066;">gotoNextItem</span><span style="color: #009900;">&#40;</span>nav4<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>main.<span style="color: #660066;">gotoNextItem</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        main.<span style="color: #660066;">gotoNextItem</span><span style="color: #009900;">&#40;</span>nav4<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>A simple one line change for this example, but it prevents users from getting behavior in the system that they don&#8217;t expect.</p>
<p>Update: I had sent this issue directly to Bloglines before making this post with essentially the same information.  I received a reply from them saying that they would forward on the report to the appropriate department.  Hopefully, they will fix this issue and get back to me.  A commenter noted this issue happens with similar sites that use access keys in this way.  My lazyweb question then: is this not technically possible?  I didn&#8217;t actually run the code I wrote, but I could if I really wanted to test it out since I believe Firebug will allow me to do that.  It just wasn&#8217;t that pressing.</p>
<p>Update: I still haven&#8217;t seen this work and have moved on to another blog reader.  I just couldn&#8217;t deal with the lack of progress and missing out on better options.  So long Bloglines, you&#8217;ll be missed.  I&#8217;m happy to be lured back someday.</p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2007/01/19/prevent-users-from-themselves/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google CSE â€“ Why It May be the NBT</title>
		<link>http://journal.bitshaker.com/articles/2006/11/03/google-cse-â€“-why-it-may-be-the-nbt/</link>
		<comments>http://journal.bitshaker.com/articles/2006/11/03/google-cse-â€“-why-it-may-be-the-nbt/#comments</comments>
		<pubDate>Fri, 03 Nov 2006 23:25:37 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[One of my favorite bloggers, Tom Evslin, wrote Google CSE &#8211; Why It May be the NBT. Go read the article first, because I refer to it a lot here. I agree with what Tom says about CSE (Custom Search Engine) being a big deal because Google is doing it. Rollyo, a product that I [...]]]></description>
			<content:encoded><![CDATA[<p>One of my favorite bloggers, Tom Evslin, wrote <a href="http://feeds.feedburner.com/~r/FractalsOfChange/~3/43427315/google_cse_why_.html">Google CSE &#8211; Why It May be the NBT</a>.  Go read the article first, because I refer to it a lot here.  I agree with what Tom says about CSE (Custom Search Engine) being a big deal because Google is doing it.  Rollyo, a product that I was an early beta tester in, came before, but as with the misnomer of first-mover advantage, it doesn&#8217;t matter if you&#8217;re first, it matters who has more users.</p>
<p>Now that I&#8217;ve had a chance to play with CSE, I can say that it is a nice tool, but I think that we will see more improvements.</p>
<p>Here&#8217;s something I think that Tom didn&#8217;t get to though.  Google has always said that they want to organize the world&#8217;s information.  CSE smells a lot like the <a href="http://en.wikipedia.org/wiki/Open_Directory_Project">dmoz.org</a> project that started years ago, except that Google found a way to get people to *want* to create a human-edited search engine.  _(What a novel idea huh? I guess those MBAs are still teaching us techies a few things)._ If you think that CSE is just a dumb tool to put sites into, you&#8217;re way off base.  Google is giving you a great service by letting you limit search querying to some specific sites, but what you are giving them is much more valuable.  You are telling them what sites to group with what categories.  I would have to bet that Google is paying attention to what you put in your little search network and getting even more context out of that to help their main search engine too.  So when you create a network about VCs or Entrepreneurs, Google looks at that and probably gives them a little more Google Juice for certain things.</p>
<p>The goal of a search engine is to bring back the most relevant data to you that you are searching on.  What made Google a better search engine is that it went beyond simple keyword searching with their PageRank algorithm and other secret sauce.  You are getting more valuable information because they made a bet that things that are linked to the most _by humans_ are the most relevant _to humans_.  And since a human is going to be able to tell you much better than a computer (at least for now) what content is best for a particular subject, they are leveraging that &#8220;vote of confidence&#8221; from someone who links to something.  Well, CSE is just an extension of that idea.  You are building mini networks for them and they will leverage that knowledge too.</p>
<p>I&#8217;ll keep watching this one. It will be interesting to see what happens.</p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2006/11/03/google-cse-â€“-why-it-may-be-the-nbt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Homepage</title>
		<link>http://journal.bitshaker.com/articles/2006/04/19/new-homepage/</link>
		<comments>http://journal.bitshaker.com/articles/2006/04/19/new-homepage/#comments</comments>
		<pubDate>Wed, 19 Apr 2006 17:18:33 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I decided I needed a new front page to this place, so I went to work on something new. I didn&#8217;t exactly know what I wanted until I started putting something down on paper and forming some ideas. I finally came up with the design you see &#8220;here&#8221;:http://www.bitshaker.com and I am pretty happy with it. [...]]]></description>
			<content:encoded><![CDATA[<p>I decided I needed a new front page to this place, so I went to work on something new.  I didn&#8217;t exactly know what I wanted until I started putting something down on paper and forming some ideas.  I finally came up with the design you see &#8220;here&#8221;:http://www.bitshaker.com and I am pretty happy with it.  Read on after the jump on how I did it.</p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2006/04/19/new-homepage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On NTFS Performance Hacks and Design</title>
		<link>http://journal.bitshaker.com/articles/2006/01/31/on-ntfs-performance-hacks-and-design/</link>
		<comments>http://journal.bitshaker.com/articles/2006/01/31/on-ntfs-performance-hacks-and-design/#comments</comments>
		<pubDate>Tue, 31 Jan 2006 10:32:44 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[An article came across my news reader today and happened to click on it. I think a lot about design and where the user comes into play in a system, so this article intrigued me in a way it probably wasn&#8217;t meant to do. It is an article called NTFS Performance Hacks. I discuss the [...]]]></description>
			<content:encoded><![CDATA[<p>An article came across my news reader today and happened to click on it. I think a lot about design and where the user comes into play in a system, so this article intrigued me in a way it probably wasn&#8217;t meant to do. It is an article called <a href="http://www.windowsdevcenter.com/pub/a/windows/2005/02/08/NTFS_Hacks.html">NTFS Performance Hacks</a>. I discuss the good, the bad, and the ugly after the jump.<br />
<!-- technorati tags start -->
<p style="text-align:right;font-size:10px;">Technorati Tags: <a href="http://www.technorati.com/tag/windows" rel="tag">windows</a></p>
<p><!-- technorati tags end --></p>
]]></content:encoded>
			<wfw:commentRss>http://journal.bitshaker.com/articles/2006/01/31/on-ntfs-performance-hacks-and-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

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