<?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>The Wojo Group &#187; Programming</title>
	<atom:link href="http://www.thewojogroup.com/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thewojogroup.com</link>
	<description>The musings of a small creative media company.</description>
	<lastBuildDate>Tue, 11 May 2010 00:10:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>April Fool&#8217;s Floating Text Script</title>
		<link>http://www.thewojogroup.com/2010/03/april-fools-floating-text-script/</link>
		<comments>http://www.thewojogroup.com/2010/03/april-fools-floating-text-script/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 03:00:18 +0000</pubDate>
		<dc:creator>Brett Wejrowski</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[april fools]]></category>
		<category><![CDATA[creepin]]></category>
		<category><![CDATA[prank]]></category>

		<guid isPermaLink="false">http://www.thewojogroup.com/?p=623</guid>
		<description><![CDATA[This year's javascript trick involves taking individual words on your page and let them float or creep away.  Every time the user does not move their mouse for 5 seconds (you can change this interval), the words will start to creep.  Once they move their mouse again, the words will return to their original spot.

<a href="javascript:creepify();">START THE CREEP</a>]]></description>
			<content:encoded><![CDATA[<p>This year&#8217;s javascript trick involves taking individual words on your page and let them float or creep away.  Every time the user does not move their mouse for 5 seconds (you can change this interval), the words will start to creep.  Once they move their mouse again, the words will return to their original spot.</p>
<p>Simply add this script tag in your header:</p>
<pre name="code" class="html">

&lt;script type=&quot;text/javascript&quot; src=&quot;http://thewojogroup.com/creep.js&quot; &gt;&lt;/script&gt;
</pre>
<p>And start the creep with the body onload function with the argument being the desired delay (in seconds) before the words start creeping (default is 5 seconds):</p>
<pre name="code" class="html">

&lt;body onload=&quot;creepify(5);&quot;&gt;
</pre>
<p>I haven&#8217;t been able to test this on many browsers, and there are some quirks depending on the content of your page.  If you are using a javascript library like JQuery, you may want to use the $(document).onload or equivalent in order to call the creepify() function. Happy April Fool&#8217;s!</p>
<p><a href="javascript:creepify();">START THE CREEP</a></p>
<p><strong>Note:</strong> This script will probably mess up some of your styling, so test it out first to see what happens. <img src='http://www.thewojogroup.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.thewojogroup.com/2010/03/april-fools-floating-text-script/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Simulating HTML5 Local Storage Support</title>
		<link>http://www.thewojogroup.com/2010/01/simulating-html5-local-storage/</link>
		<comments>http://www.thewojogroup.com/2010/01/simulating-html5-local-storage/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 06:07:07 +0000</pubDate>
		<dc:creator>Brett Wejrowski</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[localStorage]]></category>
		<category><![CDATA[Persistent Local Storage]]></category>
		<category><![CDATA[Storage]]></category>

		<guid isPermaLink="false">http://www.thewojogroup.com/?p=580</guid>
		<description><![CDATA[I have been wanting to use HTML5's local storage for a while, but I haven't had a project where I can just ignore the older browsers.  So I put together a little ( <1Kb gzipped ) script that checks for HTML5's local storage API, and simulates the method for browsers that do not support it.  For those browsers, the script implements a nearly identical interface to localStorage for persistent storage of name/value pairs, except it uses cookies. ]]></description>
			<content:encoded><![CDATA[<p>I have been wanting to use <a href="http://www.w3.org/TR/2009/WD-webstorage-20091222/" target="_blank">HTML5&#8217;s local storage</a> for a while, but I haven&#8217;t had a project where I can just ignore the older browsers.  So I put together a little ( &lt;1Kb gzipped ) script that checks for HTML5&#8217;s local storage API, and simulates the method for browsers that do not support it. For those browsers, the script implements a nearly identical interface to localStorage for persistent storage of name/value pairs, except it uses cookies.  For the impatient types, you can see the repo at <a href="http://github.com/thewojogroup/local-storage-js" target="_blank">github</a> or <a href="http://cloud.github.com/downloads/thewojogroup/local-storage-js/local-storage-js-1.zip">download the script</a>. Below is a description of usage:</p>
<pre name="code" class="javascript">

localStorage.setItem( key , value );
// saves a new name/value pair if the key doesn&#039;t exist, otherwise
// updates the value

localStorage.getItem( key );
// returns the value associated with the given key, if it exists
// returns null if the key doesn&#039;t exist

localStorage.length;
// the number of unique keys stored

localStorage.removeItem( key );
// deletes the name/value pair with the given key, if it exists
// if it does not exist, exits

localStorage.clear();
// delete all name/value pairs currently stored

localStorage.key( n );
// returns the name of the nth key in the list, will return null if n is
// greater than or equal to localStorage.length
</pre>
<p>If the localStorage object is available, the setup script exits and allows the method to work normally.  Otherwise, it will use the same interface to create a string of name/value pairs to store in cookies.  You can use all the methods described above, but it does not support direct access to data, such as &#8216;localStorage.name = &#8220;bob&#8221; ;&#8217;.  One issue is that the older browsers with slow performance will experience another setback when storing large amounts of data, because the cookies will be included in headers.</p>
<p>There are two types of storage methods in the new Web Storage Specification: localStorage and sessionStorage.  The sessionStorage data will only persist for the life of the browser window, whereas localStorage will last indefinitely, depending on the browser.  This script uses the localStorage, but can be switched to sessionStorage pretty easily.  There are a few resources out there already where you can learn a <a href="http://hacks.mozilla.org/2009/06/localstorage/">little</a> <a href="http://24ways.org/2009/breaking-out-the-edges-of-the-browser">bit</a> <a href="http://www.w3.org/TR/2009/WD-webstorage-20091222/">more</a>.  Currently, the specification is supported by IE8, Firefox3.5, Safari4, and Chrome (localStorage only).</p>
<p><a class="btnDownload" href="http://cloud.github.com/downloads/thewojogroup/local-storage-js/local-storage-js-1.zip">Download</a> or Check out the <a href="http://github.com/thewojogroup/local-storage-js">repo on github</a>.</p>
<p>[<strong>Note</strong>: I've done some brief testing on most browsers, but if you run into a problem, let me know]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thewojogroup.com/2010/01/simulating-html5-local-storage/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>simpleCart(js) Version 2.0 Released!</title>
		<link>http://www.thewojogroup.com/2009/08/simplecartjs-version-2-0-released/</link>
		<comments>http://www.thewojogroup.com/2009/08/simplecartjs-version-2-0-released/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 12:28:30 +0000</pubDate>
		<dc:creator>Brett Wejrowski</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[simpleCart(js)]]></category>
		<category><![CDATA[ecommerce]]></category>
		<category><![CDATA[google checkout]]></category>
		<category><![CDATA[javascript shopping cart]]></category>
		<category><![CDATA[simple cart]]></category>
		<category><![CDATA[simpleCart]]></category>
		<category><![CDATA[version 2]]></category>

		<guid isPermaLink="false">http://www.thewojogroup.com/?p=567</guid>
		<description><![CDATA[We are happy to announce the release of simpleCart(js) version 2.0 today.  We have been working hard to add several features that you all have requested, and we're excited to get this script in your hands.  There are several new features, including GoogleCheckout, easy currency settings, tax, shipping, and a new method for adding items to your cart that <strong>requires no javascript</strong>, and allows for different inputs and options. There is also a brand new site to go along with this update: <a href="http://simplecartjs.com">simplecartjs.com </a>.  Please take a minute to check out all the new features, documentation, and demo.  Thanks to all those who have been helping test for the past few weeks, we couldn't have released this new version without your help. ]]></description>
			<content:encoded><![CDATA[<p>We are happy to announce the release of simpleCart(js) version 2.0 today.  We have been working hard to add several features that you all have requested, and we&#8217;re excited to get this script in your hands.  There are several new features, including GoogleCheckout, easy currency settings, tax, shipping, and a new method for adding items to your cart that <strong>requires no javascript</strong>, and allows for different inputs and options. There is also a brand new site to go along with this update: <a href="http://simplecartjs.com">simplecartjs.com </a>.  Please take a minute to check out all the new features, documentation, and demo.  Thanks to all those who have been helping test for the past few weeks, we couldn&#8217;t have released this new version without your help.</p>
<h3>Upgrading your version</h3>
<p>If you are already using simpleCart(js), the only thing you need to change to use the new script is how you add it to your page:</p>
<pre name="code" class="html">

&lt;script src=&quot;simpleCart.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt; &lt;script type=&quot;text/javascript&quot;&gt;
simpleCart.email = &quot;you@yours.com&quot;;
&lt;/script&gt;
</pre>
<p>Check out the website, <a href="http://simplecartjs.com">simplecartjs.com</a> to learn about the new features, and let us know what you think!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thewojogroup.com/2009/08/simplecartjs-version-2-0-released/feed/</wfw:commentRss>
		<slash:comments>76</slash:comments>
		</item>
		<item>
		<title>Javascript Number.toCurrency()</title>
		<link>http://www.thewojogroup.com/2009/07/javascript-number-to-currency/</link>
		<comments>http://www.thewojogroup.com/2009/07/javascript-number-to-currency/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 18:56:33 +0000</pubDate>
		<dc:creator>Brett Wejrowski</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[simpleCart(js)]]></category>
		<category><![CDATA[currency]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[price formatting]]></category>

		<guid isPermaLink="false">http://www.thewojogroup.com/?p=542</guid>
		<description><![CDATA[While working on <a title="simpleCart(js) repo" href="http://github.com/thewojogroup/simplecart-js/tree/master" target="_blank">simpleCart(js) 2.0</a> and a few shopping carts for clients, I found myself writing several helper functions for formatting strings and numbers.  One of the most useful helpers was a toCurrency() method for numbers.]]></description>
			<content:encoded><![CDATA[<p>While working on <a title="simpleCart(js) repo" href="http://github.com/thewojogroup/simplecart-js/tree/master" target="_blank">simpleCart(js) 2.0</a> and a few shopping carts for clients, I found myself writing several helper functions for formatting strings and numbers.  One of the most useful helpers was a toCurrency() method for numbers:</p>
<pre name="code" class="javascript">

var myNumber = 8.3;

alert( myNumber.toCurrency() );   //alerts &quot;$8.30&quot;

myNumber = 119427.23529;

alert( myNumber.toCurrency() );    //alerts &quot;$119,427.24&quot;

myNumber = 1231;

alert( myNumber.toCurrency( &quot;€&quot; ) );   //alerts &quot;€1,231.00&quot;
</pre>
<p>The dollar sign is default, but you can replace it with any symbol in the function call.</p>
<p>Just copy this code to your js file and enjoy! (This code also implements a reverse() method for strings that you might find useful.)</p>
<pre name="code" class="javascript">

String.prototype.reverse=function(){
return this.split(&quot;&quot;).reverse().join(&quot;&quot;);
}
Number.prototype.withCommas=function(){
var x=6,y=parseFloat(this).toFixed(2).toString().reverse();
while(x&lt;y.length){y=y.substring(0,x)+&quot;,&quot;+y.substring(x);x+=4;}
return y.reverse();
}
Number.prototype.toCurrency=function(){
return(arguments[0]?arguments[0]:&quot;$&quot;)+this.withCommas();
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.thewojogroup.com/2009/07/javascript-number-to-currency/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Simple Pagination with Rails</title>
		<link>http://www.thewojogroup.com/2009/05/simple-pagination-with-rails/</link>
		<comments>http://www.thewojogroup.com/2009/05/simple-pagination-with-rails/#comments</comments>
		<pubDate>Tue, 05 May 2009 14:07:17 +0000</pubDate>
		<dc:creator>Brett Wejrowski</dc:creator>
				<category><![CDATA[Motionspire]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[content]]></category>
		<category><![CDATA[pages]]></category>
		<category><![CDATA[pagination]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.thewojogroup.com/?p=510</guid>
		<description><![CDATA[While I was developing Motionspire, I needed to implement a pagination system for the video content.  I looked through the existing plugins, but found that I really desired something extremely simple and custom to work within my search controller.  With only a few lines of code, I created a very basic system for managing pagination [...]]]></description>
			<content:encoded><![CDATA[<p>While I was developing <a href="http://www.motionspire.com">Motionspire</a>, I needed to implement a pagination system for the video content.  I looked through the existing plugins, but found that I really desired something extremely simple and custom to work within my search controller.  With only a few lines of code, I created a very basic system for managing pagination that can be ported to other sites with ease.</p>
<h4>The Search Controller</h4>
<p>The Motionspire search controller uses one function and view for returning any content, whether it&#8217;s filtered or not, so the pagination only required one copy of the code to be implemented.  I keep a session variable for maintaining the user&#8217;s preference for items per page, and if that parameter has been sent to the search function I set the session variable :</p>
<pre name="code" class="ruby">

if params[:itemsPerPage] then session[:itemsPerPage] = params[:itemsPerPage] end
</pre>
<p>When I run though the search function, I see if a page parameter has been passed:</p>
<pre name="code" class="ruby">

if params[:page] then @page = params[:page].to_i else @page = 1 end
</pre>
<p>After I retrieve the articles pertaining to the search parameters (in this case the results are stored into an array called @videos), I check the :itemsPerPage preference and find the last possible page:</p>
<pre name="code" class="ruby">

if session[:itemsPerPage] then @per = session[:itemsPerPage].to_i else @per = 24 end

@lastpage = @videos.length/(@per) + 1

if @videos.length%(@per) == 0

    @lastpage = @lastpage - 1

end
</pre>
<p>I have a default itemsPerPage value of 24 hardcoded, and you can change this for your search.</p>
<p>From here, we simply return the search results for that page, using the current page and the items per page preference:</p>
<pre name="code" class="ruby">

@videos = @videos[((@page-1)*@per),@per]
</pre>
<p><em>For search queries within a large data set, I would recommend using these parameters with the sql query with the &#8216;ORDER BY&#8217; and &#8216;LIMIT&#8217; in order to avoid returning extremely large results unnecessarily.</em></p>
<h4>The Helper</h4>
<p>First, I created a short helper function that finds the min and max pages, ensuring we don&#8217;t show a negative page or a page that doesn&#8217;t exist:</p>
<pre name="code" class="ruby">

def minmaxpage(current,total,option)
    min = current - 2
    if min &lt; 1
        min = 1
        max = 1 + 4
        if max &gt; total then max = total end
    end
    max = min + 4
    if max &gt; total
        max = total
        min = max - 4
        while min &lt; 1
            min = min + 1
        end
    end
    if option == &#039;min&#039; then return min else return max end
end
</pre>
<h4>The View</h4>
<p>For the content from the view, we use the @videos array to present the content for the page.  The only custom coding necessary is in the links for the pages.  For this site, I provide a first and last page link, along with 2 pages on either side of the current page.  You can manipulate this code how you want, but the basic idea will remain the same.</p>
<p>First we grab the min and max page from the helper:</p>
<pre name="code" class="ruby">

&lt;% min = minmaxpage(@page, @lastpage, &#039;min&#039;) %&gt;

&lt;% max = minmaxpage(@page, @lastpage, &#039;max&#039;) %&gt;
</pre>
<p>For the code for the page links, we simply check to see if the min page is within two of the current:</p>
<pre name="code" class="ruby">

&lt;% if min &lt; @page %&gt;

    &lt;%= link_to( &quot;Prev&quot;,

        :action =&gt; &quot;search&quot;,

        :page =&gt; (@page - 1) ) %&gt;

&lt;% end %&gt;

&lt;% if min &gt; 1 %&gt;

    &lt;%= link_to( &quot;1&quot;,

        :action =&gt; &quot;search&quot;,

        :page =&gt; 1 ) %&gt;

&lt;% end %&gt;

&lt;% x = min %&gt;
</pre>
<p>Then we loop through the remaining pages, ensuring we don&#8217;t go over the max, and make the current page simple text instead of a link:</p>
<pre name="code" class="ruby">

&lt;% while x &lt;= max %&gt;

    &lt;% if x.to_i == @page.to_i %&gt;

        &lt;span class=&quot;current&quot;&gt;&lt;%= x %&gt;&lt;/span&gt;

    &lt;% else %&gt;

        &lt;%= link_to( x.to_s,

            :action =&gt; &quot;search&quot;,

            :page =&gt; x ) %&gt;

    &lt;% end %&gt;

    &lt;% x = x+1 %&gt;

&lt;% end %&gt;

&lt;% if max &lt; @lastpage %&gt;

    &lt;%= link_to( @lastpage.to_s,

        :action =&gt; &quot;search&quot;,

        :page =&gt; @lastpage ) %&gt;

&lt;% end %&gt;

&lt;% if max &gt; @page %&gt;

    &lt;%= link_to( &quot;Next&quot;,

        :action =&gt; &quot;search&quot;,

        :page =&gt; (@page + 1) ) %&gt;

&lt;% end %&gt;
</pre>
<p>The code may look a little long, but the implementation took very little time.  I know exactly what the code is doing and it is very easy to expand this for different situations and code.</p>
<p>There are a lot of solutions for pagination of content, but I found that this simple implementation helped me avoid using plugins and save time.  Let me know if you guys have any questions or comparable solutions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thewojogroup.com/2009/05/simple-pagination-with-rails/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Twetris: twitter + tetris</title>
		<link>http://www.thewojogroup.com/2009/04/twetris-twitter-tetris/</link>
		<comments>http://www.thewojogroup.com/2009/04/twetris-twitter-tetris/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 17:44:23 +0000</pubDate>
		<dc:creator>Brett Wejrowski</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[fun]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[javscript]]></category>
		<category><![CDATA[tetris]]></category>
		<category><![CDATA[twetris]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.thewojogroup.com/?p=460</guid>
		<description><![CDATA[We developed a little creation called <a href="http://brett.wejrowski.com/twetris/" alt="Twetris">Twetris</a> that uses the twitter timeline to create blocks for a tetris game.  It's a simple javascript/html/css creation thats great for wasting time. <a href="http://brett.wejrowski.com/twetris/" alt="Twetris">Check it out!</a>
]]></description>
			<content:encoded><![CDATA[<p>We developed a little creation called <a href="http://brett.wejrowski.com/twetris/" target="_blank">Twetris</a> that uses the twitter timeline to create blocks for a tetris game. The high score list is published automatically to <a href="http://twitter.com/twetris">@twetris</a> and you can even retweet your high scores right from the game. It&#8217;s a simple javascript/html/css creation thats great for wasting time.<br />
<a style="text-decoration: none;" href="http://brett.wejrowski.com/twetris/" target="_blank">Check it out!</a></p>
<p><a href="http://brett.wejrowski.com/twetris"><img class="alignnone size-full wp-image-474" title="twetris3" src="http://www.thewojogroup.com/wp-content/uploads/2009/04/twetris3.png" alt="" width="500" height="433" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thewojogroup.com/2009/04/twetris-twitter-tetris/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>April Fools &#8216;flip text&#8217; Script</title>
		<link>http://www.thewojogroup.com/2009/04/april-fools-flip-text-script/</link>
		<comments>http://www.thewojogroup.com/2009/04/april-fools-flip-text-script/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 13:45:38 +0000</pubDate>
		<dc:creator>Brett Wejrowski</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[april fools]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[joke]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[text flip]]></category>
		<category><![CDATA[tricks]]></category>

		<guid isPermaLink="false">http://www.thewojogroup.com/?p=453</guid>
		<description><![CDATA[Over breakfast this morning, I put together a little JS script that will flip all the text on a page.  Just put this link AT THE BOTTOM of your page, and it should provide a little April Fools joke for some visitors. ]]></description>
			<content:encoded><![CDATA[<p>Over breakfast this morning, I put together a little JS script that will flip all the text on a page.  Just put this link <strong>AT THE BOTTOM</strong> of your page, and it should provide a little April Fools joke for some visitors:</p>
<pre name="code" class="html">

&lt;script type=&quot;text/javascript&quot; src=&quot;http://www.thewojogroup.com/flipEm.js&quot; &gt;&lt;/script&gt;
</pre>
<p>**Make sure to test this on your site, some flash objects or other plugins may not work properly</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thewojogroup.com/2009/04/april-fools-flip-text-script/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Developing vs Programming</title>
		<link>http://www.thewojogroup.com/2009/03/developing-vs-programming/</link>
		<comments>http://www.thewojogroup.com/2009/03/developing-vs-programming/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 15:34:51 +0000</pubDate>
		<dc:creator>Brett Wejrowski</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[application development]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Coding Style]]></category>
		<category><![CDATA[developing]]></category>

		<guid isPermaLink="false">http://www.thewojogroup.com/?p=442</guid>
		<description><![CDATA[I'm a mediocre programmer, at best.

When I'm programming, I need 8 different tabs open with every reference site I can get for a particular language.  I google function names constantly, most of my debugging time is spent with dumb syntax errors, and I'm never going to be able to use Regular Expressions off the top of my head.

So what can mediocre programmers like myself do? Develop. I'm going to go over a few tips for good application development, and how to use development methods that can improve your programming.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a mediocre programmer, at best.</p>
<p>When I&#8217;m programming, I need 8 different tabs open with every reference site I can get for a particular language.  I google function names constantly, most of my debugging time is spent with dumb syntax errors, and I&#8217;m never going to be able to use Regular Expressions off the top of my head.</p>
<p>So what can mediocre programmers like myself do? Develop. I&#8217;m going to go over a few tips for good application development, and how to use development methods that can improve your programming, even if you lack superstar skills.</p>
<h3>Project Management</h3>
<p>There are too many different project management philosophies to mention here, and many of them are developed by very experienced and knowledgeable professionals in the industry.  However, <em>project management and planning remain to be the biggest downfall for most programmers</em>.  Many of these methods are made to apply to development teams, but you can abstract a lot of the ideas to individual projects.  Try to check out a few papers or books on the topic during your free time.</p>
<h3>1/3 Rule</h3>
<p>For most projects, I try to stick with the <strong>1/3 rule</strong>:  spend (approximately) 1/3 of your time on planning, 1/3 on coding, and 1/3 on testing.  Many programmers expect to spend the majority of the project timeline writing code, and believe that good code will drive the project.  However, I have found that most worthwhile final products are created from development timelines that have actual coding as a minority.  This 1/3 flow can often take iterations for different portions of a project, where you plan, code, and test small portions and move on to the next section.  But you will often find dedicating time to plan properly will cut down on actual coding, and proper testing will save you time in the long run.</p>
<h3>Start with Your User</h3>
<p>I am a big fan of top-down development.  There are a lot of different theories about development strategies and methods, but I have found that for real world applications, the single most important aspect of any program is the interface.</p>
<p>With that in mind, I start my planning with laying out the interface.  Implementation of this idea can vary depending on the project.  For example, you may start with wireframes and a user flow for a web application.  For something like <a href="http://www.thewojogroup.com/2008/10/simplecartjs-paypal-e-commerce-in-minutes/">simpleCart(js)</a>, I started by listing every way in which the user would interact with the code, including function calls, div classes, and html layout for cart items.  When you start your project by building out the interface first, you are ensuring that your program will adhere to the end-user functionality of the project.</p>
<h3>Compartmentalize Functionality</h3>
<p>It doesn&#8217;t matter whether you are a big believer in MVC (I am) or like procedural or object-oriented (I&#8217;m a OOP guy); you will find yourself improving your code by creating structure first, and then implementing code.  It is often beneficial to create functions (or objects) that relate to real-world goals or problems.  If you say to yourself, &#8220;I am going to need to store the current user preferences in a cookie,&#8221; you might want to create a function for exactly that.</p>
<p>By focusing on individual problems, it becomes much easier to create efficient code for that particular purpose.  In turn, you often write better code.  It also becomes much easier to debug; if you are having a problem storing to a cookie, you simply look at your &#8217;store to cookie&#8217; function.  Documentation also becomes extremely easy, as the purpose of your code becomes evident simply by looking at the function name.  I know this may be second nature to many developers, but it can&#8217;t hurt to mention it.</p>
<h3>Abstract Data Storage</h3>
<p>I&#8217;ve found that many projects outlast hardware, hosting, or storage implementations.  You may move your code to another server, decide to implement a different database system, or find that you outgrow your storage and need to keep data in more than one place.  In any of these cases, abstracting data storage and retrieval functions from the rest of your code will benefit you immensely.  Data storage is often the last part I consider for my project.  I often do most of my developing with two empty functions: load() and store(). They are usually the last thing I implement, as, in most situations, they are the least important to the functionality of your end-user.  It also becomes extremely easy to maintain consistency of your core functionality when switching to a new data implementation by simply altering these functions.</p>
<h3>Conclusion</h3>
<p>These are all very high level concepts, and it may or may not be clear how to actually implement some of them in your projects.  The overriding theme that I hope you can take away from this article is that every program looks the same from 10,000 feet.  Most great applications are built with the end-user in mind, and great development isn&#8217;t necessarily dependent on great code.  Please let me know if you guys have any other tips.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thewojogroup.com/2009/03/developing-vs-programming/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Tips and Themes from Future of Web Apps Miami</title>
		<link>http://www.thewojogroup.com/2009/02/tips-and-themes-from-future-of-web-apps-miami/</link>
		<comments>http://www.thewojogroup.com/2009/02/tips-and-themes-from-future-of-web-apps-miami/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 03:05:32 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[FOWA]]></category>
		<category><![CDATA[Future of Web Apps]]></category>
		<category><![CDATA[Miami]]></category>
		<category><![CDATA[Web Applications]]></category>
		<category><![CDATA[web apps]]></category>

		<guid isPermaLink="false">http://www.thewojogroup.com/?p=428</guid>
		<description><![CDATA[We all just spent a few dedicated days listening to talks and having long hard discussions about building web apps in Miami at FOWA. There&#8217;s so much to take away that it&#8217;s impossible and far out of the scope of this blog to cover it all here. However, we thought we&#8217;d share some of the [...]]]></description>
			<content:encoded><![CDATA[<p>We all just spent a few dedicated days listening to talks and having long hard discussions about building web apps in Miami at FOWA. There&#8217;s so much to take away that it&#8217;s impossible and far out of the scope of this blog to cover it all here. However, we thought we&#8217;d share some of the bigger points that really struck us.</p>
<h3>Build as little as possible to start.</h3>
<p>If you build a massive app with 300 features, then your users may be stuck using what you&#8217;ve given them. However, if you launch your app or new feature with the bare minimum, then your users will use what you&#8217;ve given them and tell you what direction to go to make improvements. A great analogy brought up by <a href="http://www.deltatangobravo.com/">Daniel Burka</a> of digg is the story of an MIT architect. This architect built a building and instead of sidewalks outside it they just covered everything in grass. Then they came back a year later and got on the roof. They took a picture of all the wear and tear on the grass made by the foot paths of all the people going to and from the building and covered them with cement to make the sidewalks. <em>Let your users pick the direction of your app.</em></p>
<h3>The future of web applications is people.</h3>
<p>This was a point brought up many times by multiple speakers. It revolves around the idea that we&#8217;ve started and built the web first, then we added people. We are going to focus greater attention on how to build the web more around people and less around technology. <a href="http://developers.facebook.com/connect.php">Facebook Connect</a> is a huge example that seemed to be everywhere at fowa, including a presentation by Dave Morin on the topic. Facebook Connect is just an example of the broader concept &#8211; if you build an app that brings about a lot of new tools and tech for users than you need to learn how to make those tools and tech revolve around people, not their function. <em>Build your apps around people, not just good function.</em></p>
<h3>Be a skeptic.</h3>
<p>Don&#8217;t ever think that because this tip helped person A it&#8217;s going to help you. Don&#8217;t listen to how this new tool coming out can really help person B and assume it can help you. Really, really think about the hundreds of tiny factors that made it work for them. Through that search you&#8217;ll find out what might work for you and you&#8217;ll see it&#8217;s nearly always somewhat different. Moral of the story, facebook connect is awesome but I don&#8217;t care (though lots of other people probably do). <a href="http://280atlas.com/">Atlas</a> from 280 north brought a tear to my eye it&#8217;s so good, but I don&#8217;t think it&#8217;s going to work out for me as well as he made it seem it would. Percentage coupons work for 37signals but why on earth should I think it will give me the same results? <em>Be careful of anecdotal tips, find out what works for you.</em></p>
<h3>Twitter, WTF?</h3>
<p>Seriously it&#8217;s gotten out of control. When I heard, &#8220;for the first time ever you can tweet to space&#8221; I thought, really? Is that surprising? Is twitter that old that we really view that as a breakthrough? I heard twitter said at fowa as much as I used to hear &#8220;web 2.0&#8243; thrown around. Don&#8217;t get us wrong, we&#8217;re not knocking it. We even have <a href="http://twitter.com/thewojogroup">our own twitter page</a> to prove it.  However, we did see 10+ people within twelve feet of us using twitter at once (in fact, we started tweeting just to see how many screens we could see our tweet on). <em>Google is not the Internet. Neither is twitter- and don&#8217;t forget that.</em></p>
<h3>Recognize the value of what you are creating.</h3>
<p>One of the first things mentioned at the conference by the opening speaker Jason Fried (of <a href="http://www.37signals.com/">37signals</a>) was that web developers need to start charging more. Many of us feel that we have to develop an awesome web app and provide it for free to get anyone to even pay attention. Jason argued that it hurts the industry. Rather than succumb to this temptation, we need to develop sustainable business models. If we create something that is truly of value, there is nothing wrong in charging a fair price for that value. <em>Free is dying, start making money.</em></p>
<h3>Give people a reason to love you.</h3>
<p>Consumers have more power than ever before. Not only do they have a growing number of choices, they have more information (and more potential influence over others) than in the past. If people are going to stick with you, they have to have a good reason to. And this comes back to truly caring about your customers. <em>As </em><a href="http://garyvaynerchuk.com/"><em>Gary Vaynerchuk</em></a><em> put so eloquently, &#8220;You want a marketing strategy? CARE!!!&#8221; </em></p>
<h3>Design matters. A lot.</h3>
<p>I tend to be a functionality guy. But the importance of compelling design was a theme that ran consistently throughout the conference. <a href="http://www.delicious-monster.com/">Delicious Library</a> was offered as a telling example; this program made millions by taking something that could already be done (making a catalog with Excel) and giving it an attractive and fun interface. Even though functionality is important, at the end of the day we enjoy using things that are well-designed. <em>Make your apps fun to use and good to look at, people lust for movie stars, not old fat balding men.</em></p>
<p>Overall Future of Web Apps Miami 09 was an excellent experience and we wouldn&#8217;t hesitate for a second to go back again. Great job to all the folks at Carsonified.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thewojogroup.com/2009/02/tips-and-themes-from-future-of-web-apps-miami/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FOWA Miami next week!</title>
		<link>http://www.thewojogroup.com/2009/02/fowa-miami-next-week/</link>
		<comments>http://www.thewojogroup.com/2009/02/fowa-miami-next-week/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 13:21:39 +0000</pubDate>
		<dc:creator>Brett Wejrowski</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[2009]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[FOWA]]></category>
		<category><![CDATA[Miami]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web apps]]></category>
		<category><![CDATA[wojo]]></category>

		<guid isPermaLink="false">http://www.thewojogroup.com/?p=425</guid>
		<description><![CDATA[Ok everyone, we here at the wojo group are getting pretty excited for next week. On Saturday, we're packing up our cars and driving straight through the night. We're not stopping until we hit Miami. Why, you may ask? FOWA 2009!]]></description>
			<content:encoded><![CDATA[<p>Ok everyone, we here at the wojo group are getting pretty excited for next week.  On Saturday, we&#8217;re packing up our cars and driving straight through the night. We&#8217;re not stopping until we hit Miami. Why, you may ask? <a href="http://events.carsonified.com/fowa/2009/miami">FOWA 2009</a>!</p>
<p>For those of you who are a less of a geek than I, FOWA is the <a href="http://events.carsonified.com/fowa">Future of Web Apps Conference</a>.  It is one of many wonderful events that <a href="http://www.carsonified.com/">Carsonified</a> puts on every year.  We will have the pleasure of spending 3 days in downtown Miami, attending workshops, presentations, parties, and fraternizing with the &#8216;web-developers A-list&#8217;.</p>
<p>We are going to try to keep all of you updated from the conference this year, using this crazy thing called &#8216;Twitter&#8217;.  So, check out <a href="http://twitter.com/thewojogroup">twitter.com/thewojogroup</a> next week (Feb 22-24) for updates, pictures, and stories from FOWA Miami 2009.  </p>
<p>And for those of you lucky enough to be going to FOWA also, we&#8217;ll see you there!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thewojogroup.com/2009/02/fowa-miami-next-week/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
