<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Michael Enger</title>
	<atom:link href="http://blog.thelonelycoder.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.thelonelycoder.com</link>
	<description>The Lonely Coder since 1985</description>
	<lastBuildDate>Tue, 14 Feb 2012 16:28:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.thelonelycoder.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/6b1340c7a6ba605b03c93ac98be810d7?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Michael Enger</title>
		<link>http://blog.thelonelycoder.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.thelonelycoder.com/osd.xml" title="Michael Enger" />
	<atom:link rel='hub' href='http://blog.thelonelycoder.com/?pushpress=hub'/>
		<item>
		<title>ScrollLockView</title>
		<link>http://blog.thelonelycoder.com/2012/02/13/scrolllockview/</link>
		<comments>http://blog.thelonelycoder.com/2012/02/13/scrolllockview/#comments</comments>
		<pubDate>Sun, 12 Feb 2012 23:04:34 +0000</pubDate>
		<dc:creator>Michael Enger</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://blog.thelonelycoder.com/?p=663</guid>
		<description><![CDATA[I&#8217;m deep into building native iOS apps lately, coaxed by the great development tools and the promise of gold and jewels. This time I took to learning from Treehouse, who have great videos to explore, but also employ some rather underhanded gamification techniques to keep me coming back. Trying to use my skills for good [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=663&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m deep into building native iOS apps lately, coaxed by the great development tools and the promise of gold and jewels. This time I took to learning from <a href="http://teamtreehouse.com/">Treehouse</a>, who have great videos to explore, but also employ some rather underhanded <a href="http://teamtreehouse.com/michaelenger">gamification techniques</a> to keep me coming back. Trying to use my skills for good I am putting together an app for a friend of mine, which will be released <span style="text-decoration:underline;">when it&#8217;s damned ready</span>, but in the meantime I can take what I have learned and spread the open-source love.</p>
<p>I was looking for a way to have that classic &#8220;pull down to reload&#8221; functionality, but without the actual reloading part. I wanted to extend a UIScrollView to have an embedded view above it where I could put some buttons and detail information and which would lock to displaying the sub-view when over a certain threshold. The result was a class I called <a href="https://github.com/michaelenger/ScrollLockView">ScrollLockView</a>, which does what its name entails. You attach it to a UIScrollView and when that view is scrolled beyond a certain point it will lock the scroll, displaying the attached view for all to see (and interact with). I took cues from a <a href="https://github.com/iStopped/PullToRefreshView">PullToRefreshView</a> I found on GitHub and built something more generic.</p>
<p>The following example is pulled from the readme file and should work if inserted into the ViewController::viewDidLoad function of a single-view application:</p>
<pre>// A full-sized text view
UITextView *textView = [[UITextView alloc] initWithFrame:self.view.bounds];
textView.text = @"Why, hello there!";

// The lock view will be full width and 100px high
ScrollLockView *lockView = [ScrollLockView viewWithHeight:100.0 aboveView:textView];

// Make it red so we can see it
lockView.backgroundColor = [UIColor redColor];

// Add some buttons and junk here...
//[lockView addSubview:[UIButton ...]];
//[lockView addSubview:[UILabel ...]];

// Add the scroll view to the main view
[self.view addSubview:textView];</pre>
<p style="text-align:center;"><img class="size-medium wp-image-664" title="ScrollLockView" src="http://thelonelycoder.files.wordpress.com/2012/02/scrolllockview-1.png?w=154&#038;h=300" alt="" width="154" height="300" /> <img class="size-medium wp-image-665" title="ScrollLockView" src="http://thelonelycoder.files.wordpress.com/2012/02/scrolllockview-2.png?w=154&#038;h=300" alt="" width="154" height="300" /></p>
<p>Keep in mind that the code is built for using iOS5&#8242;s Automatic Reference Counter.</p>
<p style="text-align:center;"><a href="https://github.com/michaelenger/ScrollLockView">Source on GitHub</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thelonelycoder.wordpress.com/663/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thelonelycoder.wordpress.com/663/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/thelonelycoder.wordpress.com/663/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/thelonelycoder.wordpress.com/663/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/thelonelycoder.wordpress.com/663/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/thelonelycoder.wordpress.com/663/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/thelonelycoder.wordpress.com/663/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/thelonelycoder.wordpress.com/663/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/thelonelycoder.wordpress.com/663/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/thelonelycoder.wordpress.com/663/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/thelonelycoder.wordpress.com/663/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/thelonelycoder.wordpress.com/663/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/thelonelycoder.wordpress.com/663/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/thelonelycoder.wordpress.com/663/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=663&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.thelonelycoder.com/2012/02/13/scrolllockview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4295ac16d0d4fe814921c1af827101f3?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">michaelenger</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2012/02/scrolllockview-1.png?w=154" medium="image">
			<media:title type="html">ScrollLockView</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2012/02/scrolllockview-2.png?w=154" medium="image">
			<media:title type="html">ScrollLockView</media:title>
		</media:content>
	</item>
		<item>
		<title>The Great Cross-Platform UI Challenge: Titanium vs. PhoneGap vs. Native</title>
		<link>http://blog.thelonelycoder.com/2012/02/03/the-great-cross-platform-ui-challenge-titanium-vs-phonegap-vs-native/</link>
		<comments>http://blog.thelonelycoder.com/2012/02/03/the-great-cross-platform-ui-challenge-titanium-vs-phonegap-vs-native/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 11:04:02 +0000</pubDate>
		<dc:creator>Michael Enger</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://thelonelycoder.wordpress.com/?p=559</guid>
		<description><![CDATA[I recently got bitten by the mobile bug and decided to rebuild my RPG Dice Bag to be cross-platform so that my Android-bearing D&#38;D companions can reap the benefits of my coding expertise. There is however, a fundamental difference between building an app for iPhone and building one for the Android platform, which ties in [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=559&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I recently got bitten by the mobile bug and decided to rebuild my <a href="http://thelonelycoder.com/2010/02/22/rpg-dice-bag/">RPG Dice Bag</a> to be cross-platform so that my Android-bearing <a href="http://en.wikipedia.org/wiki/Dungeons_and_Dragons">D&amp;D</a> companions can reap the benefits of my coding expertise. There is however, a fundamental difference between building an app for iPhone and building one for the Android platform, which ties in with the fragmented nature of the devices which run the latter.</p>
<p>The iPhone has one screen resolution, no matter what. Even the &#8220;retina display&#8221; just allows for larger images while the effective screen size is the same. This makes it a breeze to build the user interface for a utility app where you want pixel-perfect control. Building an Android app requires you to take the various screen sizes and aspect ratios into account, which pushes you towards building fluid layouts that move and stretch accordingly. Mixing the two worlds is asking for trouble.</p>
<h1>Titanium</h1>
<p><a href="http://www.appcelerator.com/">Titanium</a> is my favorite app development framework, as it allows you to write cross-platform code but relies on native controls and UI, meaning that your application will feel natural in whatever device it is built for. You code the whole app in Javascript, using a special API that builds the UI controls:</p>
<pre>var window = Titanium.UI.createWindow();
var button = Titanium.UI.createButton({
    title: 'Click Me';
}); 
window.add(button);
window.open();</pre>
<div id="attachment_645" class="wp-caption alignright" style="width: 210px"><a href="http://thelonelycoder.files.wordpress.com/2012/02/ios-simulator-screen-shot-feb-2-2012-13-02-15.png"><img class="size-medium wp-image-645" title="RPG Dice Bag (Titanium)" src="http://thelonelycoder.files.wordpress.com/2012/02/ios-simulator-screen-shot-feb-2-2012-13-02-15.png?w=200&#038;h=300" alt="" width="200" height="300" /></a><p class="wp-caption-text">The result of building a responsive design in Titanium</p></div>
<p>This works well, and with the recent addition of <a href="http://www.commonjs.org/">CommonJS</a> modules, the development of an app is fast and can be remarkably modular and structured. However, trying to merge the two worlds of UI building comes with a few problems. Titanium has built-in functionality to handle automatic stretching of controls and automatic layouts, but it&#8217;s clear from their <a href="http://vimeo.com/28428962">tutorial videos</a> that the Android and iOS are too dissimilar to use the same UI code for both platforms. Not only do they have different screen resolutions and aspect ratios, but they also don&#8217;t have the same controls and a selector on iOS is a giant spinner that takes up 45% of the screen whilst the Android platform has a more classic drop-down control. If you&#8217;re intending to build an app using Titanium then you have to create separate UI modules that communicate with the same core.</p>
<p><em>Note: Nothing against Titanium, per sé, but I spent a long time building a copy of the dice app in Titanium only to have it fail when I tried it in the Android emulator. There is a chance that I was using some code that the Android didn&#8217;t like and I hadn&#8217;t noticed because I had only been testing in the iPhone.</em></p>
<h1>PhoneGap</h1>
<p><a href="http://phonegap.com/">PhoneGap</a> works as wrapper of sorts; it encapsulates an HTML5 website in a native &#8220;web view&#8221; whilst giving you access to hardware features via a Javascript API. This allows you to take all the benefits of using the DOM (stretching and positioning elements in a logical hierarchy) while crafting an app that can be installed via their respective marketplaces and has the same features as a natively-build application.</p>
<div id="attachment_567" class="wp-caption alignright" style="width: 210px"><a href="http://thelonelycoder.files.wordpress.com/2012/01/ios-simulator-screen-shot-jan-29-2012-19-33-27.png"><img class="size-medium wp-image-567" title="RPG Dice Bag (PhoneGap)" src="http://thelonelycoder.files.wordpress.com/2012/01/ios-simulator-screen-shot-jan-29-2012-19-33-27.png?w=200&#038;h=300" alt="" width="200" height="300" /></a><p class="wp-caption-text">Running in PhoneGap using the standard jQuery Mobile theme.</p></div>
<p>One negative aspect of using websites is the lack of the native look and feel of controls, and if you want to create an app which at least looks right in accordance to the platforms, then you&#8217;d be best off using a Javascript/CSS framework built for such a task (<a href="http://jquerymobile.com/">jQuery Mobile</a> and <a href="http://www.sencha.com/products/touch/">Sencha Touch</a> comes to mind). Another problem I&#8217;ve discovered is that you are in essence masking the presence of a website by removing the toolbars, and the same functionality is there under the layers of mobile-style goodness. For example, a long hold on a link will cause the &#8220;open in a new window&#8221; popup to appear, which does break the illusion a bit.</p>
<p><em>Note: I tried building the app using jQuery Mobile and I was experiencing a definite lag when switching between the main and settings views. I probably wouldn&#8217;t have thought much about it if I hadn&#8217;t seen how fluid and fast the native app is.</em></p>
<h1>Native Code</h1>
<p>Last up is building the app using the respective native tools, Objective-C in <a href="http://developer.apple.com/technologies/tools/">XCode</a> for iOS apps and Java in <a href="http://eclipse.org/">Eclipse</a> for Android apps. If you&#8217;re already familiar with how the applications work on their separate platforms, then you&#8217;re probably better off doing it the &#8220;manual&#8221; way, as trying to learn how things work in Titanium or PhoneGap involves forgetting a lot of things. Without formal knowledge however, you are setting yourself up for months of learning and lots of failures. When building the original app I had gone through the <a href="http://www.lynda.com/">Lynda.com</a> video program on iPhone development and had restarted the project 3-4 times before finally getting a product that worked.</p>
<p>The great benefit to coding an iOS app using the official tools is by far the visual program designer. So much of the settings and tweaks for specific controls can be set in a WYSIWYG editor that connects to the code in a surprisingly easy way. It also lets you create specific views for portrait and landscape modes, as well as the iPad layouts. It is more focused on custom-building the UI for the four different possible ways of viewing it, and the designer makes it easy to do without having to write code and constantly compile to make sure you&#8217;ve moved things correctly.</p>
<div id="attachment_568" class="wp-caption aligncenter" style="width: 310px"><a href="http://thelonelycoder.files.wordpress.com/2012/01/xcode-designer.png"><img class="size-medium wp-image-568" title="XCode UI Designer" src="http://thelonelycoder.files.wordpress.com/2012/01/xcode-designer.png?w=300&#038;h=169" alt="" width="300" height="169" /></a><p class="wp-caption-text">XCode is a beautiful looking piece of software.</p></div>
<p>On the Android side of things you have the means to build the interface using XML layouts, where you define the controls inside layout types that will position and scale the controls appropriately. One of the formats, <a href="http://developer.android.com/reference/android/widget/RelativeLayout.html">RelativeLayout</a>, is geared towards compensating for vastly different displays as it lets you specify how &#8220;heavy&#8221; a control is, meaning it will take up more of the relative space available, growing and shrinking other controls appropriately. The XML layouts are the best way I have found so far of mixing variable and fixed sizes and is clearly built with the intent on being distributed on devices where the screen resolution is unknown.</p>
<p>Both of the native tools are built so specifically for their target platforms that trying to replicate them in a cross-platform framework would be foolish, and the end result is that you are left with a half-way point that doesn&#8217;t really play on the strengths of either. I&#8217;m still going to stick to Titanium for now, but my frustrations are pushing me back towards the native way of doing things. I&#8217;ve already gone through the hassle of learning Objective-C, and Java is a part of every schooled programmer&#8217;s repertoire, so maybe focusing on building apps that look and feel like native constructions rather than going for some deformed halfbreed is the best way forward.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thelonelycoder.wordpress.com/559/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thelonelycoder.wordpress.com/559/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/thelonelycoder.wordpress.com/559/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/thelonelycoder.wordpress.com/559/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/thelonelycoder.wordpress.com/559/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/thelonelycoder.wordpress.com/559/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/thelonelycoder.wordpress.com/559/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/thelonelycoder.wordpress.com/559/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/thelonelycoder.wordpress.com/559/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/thelonelycoder.wordpress.com/559/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/thelonelycoder.wordpress.com/559/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/thelonelycoder.wordpress.com/559/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/thelonelycoder.wordpress.com/559/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/thelonelycoder.wordpress.com/559/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=559&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.thelonelycoder.com/2012/02/03/the-great-cross-platform-ui-challenge-titanium-vs-phonegap-vs-native/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4295ac16d0d4fe814921c1af827101f3?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">michaelenger</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2012/02/ios-simulator-screen-shot-feb-2-2012-13-02-15.png?w=200" medium="image">
			<media:title type="html">RPG Dice Bag (Titanium)</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2012/01/ios-simulator-screen-shot-jan-29-2012-19-33-27.png?w=200" medium="image">
			<media:title type="html">RPG Dice Bag (PhoneGap)</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2012/01/xcode-designer.png?w=300" medium="image">
			<media:title type="html">XCode UI Designer</media:title>
		</media:content>
	</item>
		<item>
		<title>The Joel Test for Website Development</title>
		<link>http://blog.thelonelycoder.com/2012/01/28/the-joel-test-for-website-development/</link>
		<comments>http://blog.thelonelycoder.com/2012/01/28/the-joel-test-for-website-development/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 13:28:54 +0000</pubDate>
		<dc:creator>Michael Enger</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://thelonelycoder.wordpress.com/?p=540</guid>
		<description><![CDATA[I&#8217;m always in the mood to fix what is or isn&#8217;t broken, and I&#8217;ve noticed that a lot of problems that surround website development are prevalent in almost all development studios, different only in scope and cause. The Joel Test is a simple, but effective method of determining how well a development environment is working [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=540&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m always in the mood to fix what is or isn&#8217;t broken, and I&#8217;ve noticed that a lot of problems that surround website development are prevalent in almost all development studios, different only in scope and cause. The <a href="http://www.joelonsoftware.com/articles/fog0000000043.html">Joel Test</a> is a simple, but effective method of determining how well a development environment is working towards efficient coding, but it seems geared more towards product development than the client-driven website building that I am familiar with. As such, I thought I&#8217;d do the incredibly arrogant thing of rewriting some of the questions to be more apt for asking a company that does custom built websites for clients.</p>
<h1>The <del>Joel</del> Mike Test</h1>
<ol>
<li>Do you use source control?</li>
<li>Can you deploy the site in one step?</li>
<li>Do you deploy to a test server first?</li>
<li>Do you use a project management tool?</li>
<li>Do you fix bugs before writing new code?</li>
<li>Do you have an up-to-date schedule?</li>
<li>Do you have a spec?</li>
<li>Do programmers have quiet working conditions?</li>
<li>Do you use the best tools money can buy?</li>
<li>Do you have automated tests?</li>
<li>Do you learn from your mistakes?</li>
<li>Does the client participate in continuous testing?</li>
</ol>
<p>The idea behind this test, in case you didn&#8217;t bother reading Joel&#8217;s original article, is to ask these questions to a prospective employer, or to your own team to see how healthy the development environment is. They are simple yes/no questions and answering &#8220;yes&#8221; to every single one is a sign that you&#8217;re doing things right. Joel claimed that a score of ten or less &#8220;yes&#8221; answers was a warning sign, but it all depends on what you put weight on.</p>
<h2>1. Do you use source control?</h2>
<p>This is a no-brainer in large production teams, but even if you&#8217;re the lonely coder on a project it doesn&#8217;t mean you should get away with not using a source control tool such as Git, Mercurial or CVS. If you&#8217;re in the mood for basic guidelines on how to use Git from the view of a single individual working on personal projects, <a href="http://thelonelycoder.com/2011/11/17/git-guidelines-for-iterative-development/">I wrote about that too</a>.</p>
<h2>2. Can you deploy the site in one step?</h2>
<p>Deployment of a site can be a hassle, especially if you have a server farm behind a load balancer and some caching servers, so being able to run a script that takes care of it for you saves a lot of time. However, just because you only have to upload files via FTP to one server doesn&#8217;t mean you should. Having to constantly push minor changes, which are plentiful when dealing with clients, will tug on your nerves and waste an unnecessary amount of your time, so this part of the process should be a &#8220;fire and forget&#8221; procedure that runs an automated script which moves the files to the correct spot, preferably from your source control database so it doesn&#8217;t have to copy the files from your local development environment.</p>
<h2>3. Do you deploy to a test server first?</h2>
<p>If you have a &#8220;fire and forget&#8221; script that does the deployment, it probably shouldn&#8217;t go live without some sort of testing first, preferably in an environment that replicates the live server as closely as it can. This step may seem tedious, but saves you a lot of trouble with minor problems that come up when you&#8217;re moving from development to production. You should always test out your code locally first, but having a sandboxed testing location as a stopping station between your computer and the live server is a great way to catch small oversights and bugs before they are exposed to the public. This is also a great place to get your client in to see the changes before it goes out (see #12).</p>
<h2>4. Do you use a project management tool?</h2>
<p>I&#8217;m not saying that everyone should throw a lot of money on a complicated, overpriced ticketing system, but when it comes to building projects where the specification is never set in stone, it helps to have a centralized place to gather all the tasks that need to be done. Even if it&#8217;s just a spreadsheet on a shared server, it&#8217;s still a lot better than every developer/designer/manager walking around with private todo lists in their heads or on sticky-notes on their desks. A phone call from a client becomes a task in the system and can be dealt with at an appropriate time by the right person.</p>
<h2>5. Do you fix bugs before writing new code?</h2>
<p>I didn&#8217;t have a better way of formulating this, so I just copied Joel&#8217;s question. Fixing bugs and catching up on &#8220;<a href="http://en.wikipedia.org/wiki/Technical_debt">technical debt</a>&#8221; is never prioritized high enough when the clients are knocking on the windows, wondering where their website has gone. However, long periods of neglect can result in bugs accumulating in unsurmountable heaps that hang over the heads of the development team. Being able to stop and take care of the housekeeping before running off to complete the next task is a great way to keep the machinery running smoothly and ensuring that the <a href="http://www.youtube.com/watch?v=7s8S7QxpjeY">code monkeys</a> are happy.</p>
<p>This applies also to the progression of the development environment and the tools that the coders use (see #9). If you&#8217;re meaning to update the server software, but you&#8217;re bogged down by client requests, you should probably just take a step back from the workload and get it done. Waiting until it crashes is not good planning and if you can spend a week to save five minutes of every hour in the future, you shouldn&#8217;t delay getting it done.</p>
<h2>6. Do you have an up-to-date schedule?</h2>
<p>One of the worst parts of the fluid nature of a client site specification is the inevitable feature creep and minor tweaks that sneak their way into a project while it&#8217;s being developed. I understand that it&#8217;s hard for clients to know everything they want in the pre-project planning period, but when they suddenly remember that they want to enable facebook login, have an interactive image gallery, add some more red on that border or any other tidbit, the end result is usually that the project gets bloated with new tasks <strong>without it changing the release schedule</strong>.</p>
<p>This is dangerous and stupid, but not really the fault of anyone involved as the changes are small and infrequent but eventually compound the complexity of the project. A good rule of thumb is that any change, no matter how seemingly trivial, gets the project pushed back some amount of time. Moving a frontpage widget a few pixels down adds a few hours to the final deadline and adding any form of custom functionality that wasn&#8217;t previously specified should involve asking a developer how long time it&#8217;ll take and then doubling that.</p>
<div class="wp-caption aligncenter" style="width: 410px"><img title="kitten" src="http://placekitten.com/400/250" alt="" width="400" height="250" /><p class="wp-caption-text">Obligatory kitten to break up the wall of text — Courtesy of placekitten.com</p></div>
<h2>7. Do you have a spec?</h2>
<p>Ah, the illusive specification, that we all know is going to be out of date in a few months, and usually doesn&#8217;t seem to be necessary to write at all, is something that should be demanded by every development team, even if the site is just a personal blog for a local politician&#8217;s dog. The specification can be as complicated or basic as you&#8217;d like, but the idea behind it is to protect yourself from any later changes that can greatly delay the development period (see #6). If a client asks for something that wasn&#8217;t a part of the original agreement the specification will stand as witness to this, and you are free to ask for more time/money/bananas to get it done.</p>
<h2>8. Do programmers have quiet working conditions?</h2>
<p>This one is a hard question to justify in an environment where communication between the different segments of the development team needs to be frequent and easy, but trying to get anything done in a room full of distractions is a disaster waiting to happen. The general idea is that if a developer can put his headphones on and be able to focus without worrying that someone is going to tap him on the shoulder (or throw a paper plane in his face), then that&#8217;s good enough to ensure that work will be done. Communication over email or IM is an easy way to prevent any loss of efficiency from the constant stream of people who may need some information from one of the coders. It may not be a perfect solution, but is a good enough compromise to get stuff done.</p>
<h2>9. Do you use the best tools money can buy?</h2>
<p>If I have to wait half a minute to login to a page I&#8217;m developing because the database server is a decade old then I am more likely to avoid having to wait by visiting YouTube. And since I&#8217;m already on YouTube I should probably check out that <a href="http://www.youtube.com/watch?v=79ukBRpCqkk&amp;feature=context&amp;context=C3f4db01ADOEgsToPDskKFNvwGTPOyhDdSmTsGIAx7">drum cover</a> my friend told me about. Suddenly 30 seconds turns into five minutes and I&#8217;ve lost the groove I was in.</p>
<h2>10. Do you have automated tests?</h2>
<p>Automated tests are a great way to catch small problems that might otherwise find their way into the live code by way of lazy, tired or stressed developers. Although we would all love to make <a href="http://www.quickmeme.com/meme/35tegf/">unit tests for everything we build</a>, that&#8217;s usually not how the real world works. However, having an automated script that kicks in when trying to push your code upstream (see #1) which checks your code for debug outputs, kill commands or lack of proper indentation will go a long way to avoid silly and embarrassing mistakes.</p>
<h2>11. Do you learn from your mistakes?</h2>
<p>Any rational human being can tell you the benefit of learning from your mistakes, but its sometimes hard to see where things went wrong in a lengthy project, especially if there are many people involved. Learning from your (or others&#8217;) mistakes would involve a retrospective analysis of the project where you focus on what went wrong and what went right and make a conscious effort to change those aspects of your development process. If you intend on spending weeks on metrics analysis and status meetings, then this point is hard to justify, but usually an hour-long post-morten meeting where you all agree to play less Minecraft and write more comments in the code should suffice.</p>
<h2>12. Does the client participate in continuous testing?</h2>
<p>You&#8217;re building this page for somebody, usually somebody not directly connected to the development team, so if you work in a vacuum with no interaction with the client until the product is finished then you&#8217;re setting yourself up for a lot of changes and tweaks after the release date. The client should have access as early as possible (see #3) and should be able to come with feedback in a non-intrusive way (see #4) that doesn&#8217;t break the development plan (see #6 and #7). This will ensure that the final result is something they are happy with and it&#8217;s easy to keep them appeased if they are aware of the constant progress and don&#8217;t have to send a frustrated email before they get to see any changes.</p>
<p>These questions all have their benefits and drawbacks, the major one being the time and effort required to put any of them into practice, but there is always something to be gained from trying to make the way you work better, by however measly amount. All projects are different, all project teams are different, and you&#8217;ll quickly find what aspect is important to you, but taking a step back every now and then and tweaking the machinery can&#8217;t be a bad thing.</p>
<p>Thanks to <a href="http://www.joelonsoftware.com/">Joel Spolsky</a> (of <a href="http://stackoverflow.com/">Stack Overflow</a> fame) for the inspiration for this post.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thelonelycoder.wordpress.com/540/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thelonelycoder.wordpress.com/540/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/thelonelycoder.wordpress.com/540/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/thelonelycoder.wordpress.com/540/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/thelonelycoder.wordpress.com/540/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/thelonelycoder.wordpress.com/540/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/thelonelycoder.wordpress.com/540/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/thelonelycoder.wordpress.com/540/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/thelonelycoder.wordpress.com/540/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/thelonelycoder.wordpress.com/540/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/thelonelycoder.wordpress.com/540/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/thelonelycoder.wordpress.com/540/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/thelonelycoder.wordpress.com/540/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/thelonelycoder.wordpress.com/540/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=540&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.thelonelycoder.com/2012/01/28/the-joel-test-for-website-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4295ac16d0d4fe814921c1af827101f3?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">michaelenger</media:title>
		</media:content>

		<media:content url="http://placekitten.com/400/250" medium="image">
			<media:title type="html">kitten</media:title>
		</media:content>
	</item>
		<item>
		<title>Joachim Enger</title>
		<link>http://blog.thelonelycoder.com/2012/01/19/joachim-enger/</link>
		<comments>http://blog.thelonelycoder.com/2012/01/19/joachim-enger/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 20:16:39 +0000</pubDate>
		<dc:creator>Michael Enger</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Foundation]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sections]]></category>

		<guid isPermaLink="false">http://thelonelycoder.wordpress.com/?p=523</guid>
		<description><![CDATA[My brother is a photographer and I&#8217;m constantly pushing that he needs to have some sort of portfolio or something on the web, to promote his work and his awesome self. To that end he lets me go wild with creating a website for him and I&#8217;ve used his portfolio page to test various CMS [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=523&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>My <a href="http://joachimenger.com">brother</a> is a photographer and I&#8217;m constantly pushing that he needs to have some sort of portfolio or something on the web, to promote his work and his awesome self. To that end he lets me go wild with creating a website for him and I&#8217;ve used his portfolio page to test various CMS systems and design ideas, some more useful than others (I&#8217;m looking at you <a href="http://www.concrete5.org/">concrete5</a>).</p>
<p style="text-align:center;"><a href="http://joachimenger.com"><img class="aligncenter size-medium wp-image-535" title="Joachim Enger" src="http://thelonelycoder.files.wordpress.com/2012/01/joachimenger.png?w=285&#038;h=300" alt="" width="285" height="300" /></a></p>
<p>The latest iteration runs on my <a href="http://thelonelycoder.wordpress.com/2011/02/19/sections/">Sections</a> framework (gotta <a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food">eat that dog food</a>) and is based on the <a href="http://foundation.zurb.com/">Foundation</a> framework, which I have fallen absolutely in love with. The greatest part of the framework is how it adapts to the size of the screen and means that the website will work on mobile devices without me having to do anything.</p>
<p>Well almost, because having a layout which responds to the size of the screen means that you need to take into consideration where you apply padding, borders and margin so that when the content is shifted around it doesn&#8217;t break the style or you see the dreaded horizontal scrollbar. Mobile browsers have thrown a wrench into web design conventions, but with a responsive style framework and some forward thinking we may come up on top.</p>
<div id="attachment_534" class="wp-caption alignright" style="width: 231px"><a href="http://thelonelycoder.files.wordpress.com/2012/01/joachimenger-gallery.png"><img class="size-medium wp-image-534" title="Joachim Enger" src="http://thelonelycoder.files.wordpress.com/2012/01/joachimenger-gallery.png?w=221&#038;h=300" alt="" width="221" height="300" /></a><p class="wp-caption-text">What the gallery looks like</p></div>
<p>Another thing I had to deal with was that everything was going to come from my brother&#8217;s <a href="http://www.flickr.com/photos/26389438@N03">flickr</a> account, so that he can take pictures and put them up there without having to worry about his dumb stupid website that his geeky brother had thrown together for him. Also, instead of insisting on him only uploading images of a certain size, I just built a simple <a href="http://en.wikipedia.org/wiki/GD_Graphics_Library">GD</a>-based resizing script that would take any new images, resize them to the right formats and then save them in folders on the server. Now I had a steady stream of pictures that fit perfectly into the design I had built. Thank science for modern web development libraries!</p>
<p>I&#8217;m pretty happy with the result and my brother doesn&#8217;t have to do anything outside the usual to keep his website up-to-date.</p>
<h1 style="text-align:center;"><a href="http://joachimenger.com">Joachim Enger</a></h1>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thelonelycoder.wordpress.com/523/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thelonelycoder.wordpress.com/523/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/thelonelycoder.wordpress.com/523/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/thelonelycoder.wordpress.com/523/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/thelonelycoder.wordpress.com/523/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/thelonelycoder.wordpress.com/523/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/thelonelycoder.wordpress.com/523/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/thelonelycoder.wordpress.com/523/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/thelonelycoder.wordpress.com/523/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/thelonelycoder.wordpress.com/523/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/thelonelycoder.wordpress.com/523/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/thelonelycoder.wordpress.com/523/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/thelonelycoder.wordpress.com/523/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/thelonelycoder.wordpress.com/523/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=523&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.thelonelycoder.com/2012/01/19/joachim-enger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4295ac16d0d4fe814921c1af827101f3?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">michaelenger</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2012/01/joachimenger.png?w=285" medium="image">
			<media:title type="html">Joachim Enger</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2012/01/joachimenger-gallery.png?w=221" medium="image">
			<media:title type="html">Joachim Enger</media:title>
		</media:content>
	</item>
		<item>
		<title>Internet Explorer has a PR problem</title>
		<link>http://blog.thelonelycoder.com/2012/01/10/internet-explorer-has-a-pr-problem/</link>
		<comments>http://blog.thelonelycoder.com/2012/01/10/internet-explorer-has-a-pr-problem/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 20:45:18 +0000</pubDate>
		<dc:creator>Michael Enger</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://thelonelycoder.wordpress.com/?p=506</guid>
		<description><![CDATA[I was perusing Hacker News when I came across not one, but two beautiful websites heralding the new generation of web content with a peculiar and somewhat surprising backer. Microsoft, or more specifically, the Internet Explorer team has decided to promote modern web standards by funding two projects, a browser-based version of the iOS/Android game [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=506&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was perusing <a href="http://news.ycombinator.com/">Hacker News</a> when I came across not one, but two beautiful websites heralding the new generation of web content with a peculiar and somewhat surprising backer. Microsoft, or more specifically, the Internet Explorer team has decided to promote modern web standards by funding two projects, a browser-based version of the iOS/Android game <a href="http://www.cuttherope.ie/">Cut the Rope</a> and a extension to CSS which supports <a href="http://ie.microsoft.com/testdrive/Graphics/opentype/opentype-fontbureau/index.html">OpenType typography features</a>.</p>
<div id="attachment_509" class="wp-caption aligncenter" style="width: 310px"><a href="http://thelonelycoder.files.wordpress.com/2012/01/the-new-web-typography_1326227711708.png"><img class="size-medium wp-image-509" title="The New Web Typography" src="http://thelonelycoder.files.wordpress.com/2012/01/the-new-web-typography_1326227711708.png?w=300&#038;h=181" alt="" width="300" height="181" /></a><p class="wp-caption-text">Made by designers for designers.</p></div>
<p>My initial response to the discovery that IE was behind these two projects was disbelief, followed by doubt, and then more disbelief. I grew into a web developer in the midst of a chaotic time for web browsers, where majority control over the masses of web-surfers was wrestled away from Internet Explorer 6 over the course of 6~7 harrowing years. I&#8217;ve spent countless hours tweaking and downgrading my designs, hacking at a <a href="http://www.positioniseverything.net/explorer.html">wall of bugs</a> and generally tearing my hair out to get things to work with IE6 and now Microsoft is trying to promote HTML5/CSS3 features as if they were never standing in their way to begin with.</p>
<p>I am aware that we have come a long way since IE6, but Internet Explorer&#8217;s story isn&#8217;t exactly the greatest example of forward motion in the history of application development. IE7 was released in 2006, five years after IE6, and at the time felt like a direct response to the introduction of Firefox, which came out of nowhere and exploded in popularity with its countless extensions and tabbed browsing. Since then, every new version of Internet Explorer has been promised as the &#8220;one they get right&#8221; in terms of following defined web standards and exploring new undiscovered territory, but it has come short every single time. IE is the best example I have seen of the narrow-mindedness of enterprise-focused software:</p>
<ul>
<li>Littered with proprietary features</li>
<li>Focused on innovation-stifling backwards compatibility</li>
<li>Long and obscured development cycles</li>
</ul>
<p>I hope you&#8217;ll forgive my aggressive stance, but you must realize that I learned the basics of web development in an environment where everything I did in terms of following the guidelines for HTML and CSS was usually counteracted in some unholy and incomprehensible way by IE6. Later incarnations proudly proclaimed their superiority, but the few changes and lackluster support for internationally-accepted standards felt like a joke and, being the one shackled with the task of tearing apart my work in search of the one thing that IE misunderstood, I took it like a personal insult. Every new version of IE still required a <a href="http://www.quirksmode.org/css/condcom.html">conditional CSS stylesheet</a> and at some point, just when IE9 came out, I stopped caring and decided that people still stuck with Internet Explorer would see a broken, ugly version of the website. The browser had gone from a nuisance, to a problem and was finally disregarded as nonexistent.</p>
<div id="attachment_508" class="wp-caption aligncenter" style="width: 310px"><a href="http://thelonelycoder.files.wordpress.com/2012/01/cuttherope-ie.png"><img class="size-medium wp-image-508" title="Cut the Rope" src="http://thelonelycoder.files.wordpress.com/2012/01/cuttherope-ie.png?w=300&#038;h=200" alt="" width="300" height="200" /></a><p class="wp-caption-text">It&#039;s a good looking game.</p></div>
<p>My hyperbolic examples aside, I will argue that the mentality behind the decisions on where to take Microsoft&#8217;s flagship browser is counter-productive to the modern environment around development. Open source projects have gotten huge and aren&#8217;t going anywhere and people are getting very used to small, incremental updates and a transparent development cycle and it amazes me that it took Microsoft over 5 years to realize this.</p>
<p>That said, past my initial response of rolling my eyes and thinking that this was a shallow attempt to regain some ground with developers, I can&#8217;t help but think that this is a great thing. Both of the websites work damn well (in Opera and Firefox) and are examples of the web moving forward to provide more varied content. Also, Internet Explorer 10 is being developed with <a href="http://ie.microsoft.com/testdrive/Info/Downloads/Default.html">preview builds</a> and <a href="http://blogs.msdn.com/b/ie/">updates from the development team</a> and is getting a <a href="http://arstechnica.com/microsoft/news/2011/06/internet-explorer-10-platform-preview-2-shows-strong-progress.ars">warm reception</a> from the community. I am not changing my browser anytime soon, but maybe I&#8217;ll stop judging people as the enemy if they&#8217;re using the browser that came with their Windows system.</p>
<p><strong>Edit:</strong> It has come to my attention that Microsoft are using <a href="http://i.imgur.com/96rc6.jpg">slightly underhanded methods</a> to promote their new browser. Maybe things aren&#8217;t that different after all.</p>
<p><strong>Another edit:</strong> Microsoft seems to <a href="http://i.imgur.com/Op8SO.jpg">know how we feel</a> (from <a href="http://www.reddit.com/r/web_design/comments/orfjv/microsofts_apology_for_ie6_sooo_late/">Reddit</a>).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thelonelycoder.wordpress.com/506/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thelonelycoder.wordpress.com/506/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/thelonelycoder.wordpress.com/506/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/thelonelycoder.wordpress.com/506/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/thelonelycoder.wordpress.com/506/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/thelonelycoder.wordpress.com/506/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/thelonelycoder.wordpress.com/506/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/thelonelycoder.wordpress.com/506/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/thelonelycoder.wordpress.com/506/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/thelonelycoder.wordpress.com/506/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/thelonelycoder.wordpress.com/506/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/thelonelycoder.wordpress.com/506/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/thelonelycoder.wordpress.com/506/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/thelonelycoder.wordpress.com/506/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=506&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.thelonelycoder.com/2012/01/10/internet-explorer-has-a-pr-problem/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4295ac16d0d4fe814921c1af827101f3?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">michaelenger</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2012/01/the-new-web-typography_1326227711708.png?w=300" medium="image">
			<media:title type="html">The New Web Typography</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2012/01/cuttherope-ie.png?w=300" medium="image">
			<media:title type="html">Cut the Rope</media:title>
		</media:content>
	</item>
		<item>
		<title>PK Bloggin&#8217;!</title>
		<link>http://blog.thelonelycoder.com/2011/12/30/pk-bloggin/</link>
		<comments>http://blog.thelonelycoder.com/2011/12/30/pk-bloggin/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 13:41:40 +0000</pubDate>
		<dc:creator>Michael Enger</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Foundation]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://thelonelycoder.wordpress.com/?p=518</guid>
		<description><![CDATA[I used to write with Joe Walker, who keeps a blog called PK Bloggin&#8217;! and when I noticed that his WordPress theme was breaking I had to step in and do something about it. I kept the main colors from the existing theme and threw something simple together and the end result was clean and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=518&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I used to write with Joe Walker, who keeps a blog called <a href="http://www.pkbloggin.net/">PK Bloggin&#8217;!</a> and when I noticed that his WordPress theme was breaking I had to step in and do something about it. I kept the main colors from the existing theme and threw something simple together and the end result was clean and he was very happy with it.</p>
<p><a href="http://www.pkbloggin.net/"><img class="aligncenter size-medium wp-image-519" title="PK Bloggin'!" src="http://thelonelycoder.files.wordpress.com/2012/01/pkbloggin-copy.png?w=300&#038;h=262" alt="" width="300" height="262" /></a></p>
<p>I based the theme of a WordPress variant of the <a href="http://foundation.zurb.com/">Foundation</a> framework created by <a href="http://drewsymo.com/">Drew Morris</a> and I must say that it&#8217;s the best CSS framework I&#8217;ve had the pleasure to use. I&#8217;ll be sticking with this from now on.</p>
<h1 style="text-align:center;"><a href="http://www.pkbloggin.net/">PK Bloggin&#8217;!</a></h1>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thelonelycoder.wordpress.com/518/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thelonelycoder.wordpress.com/518/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/thelonelycoder.wordpress.com/518/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/thelonelycoder.wordpress.com/518/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/thelonelycoder.wordpress.com/518/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/thelonelycoder.wordpress.com/518/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/thelonelycoder.wordpress.com/518/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/thelonelycoder.wordpress.com/518/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/thelonelycoder.wordpress.com/518/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/thelonelycoder.wordpress.com/518/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/thelonelycoder.wordpress.com/518/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/thelonelycoder.wordpress.com/518/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/thelonelycoder.wordpress.com/518/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/thelonelycoder.wordpress.com/518/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=518&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.thelonelycoder.com/2011/12/30/pk-bloggin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4295ac16d0d4fe814921c1af827101f3?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">michaelenger</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2012/01/pkbloggin-copy.png?w=300" medium="image">
			<media:title type="html">PK Bloggin&#039;!</media:title>
		</media:content>
	</item>
		<item>
		<title>What Spotify Apps Say About the Future of Web Development</title>
		<link>http://blog.thelonelycoder.com/2011/12/01/what-spotify-apps-say-about-the-future-of-web-development/</link>
		<comments>http://blog.thelonelycoder.com/2011/12/01/what-spotify-apps-say-about-the-future-of-web-development/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 22:58:35 +0000</pubDate>
		<dc:creator>Michael Enger</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://thelonelycoder.wordpress.com/?p=498</guid>
		<description><![CDATA[Spotify recently announced that they are adding support for apps that will run inside the Spotify application and which will be able to interact with the music and other segments of the program. Of course I was instantly all over this and, much to my amazement and shock the whole app platform boils down to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=498&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.spotify.com/">Spotify</a> recently announced that they are <a href="http://www.spotify.com/about/apps/">adding support for apps</a> that will run inside the Spotify application and which will be able to interact with the music and other segments of the program. Of course I was instantly all over this and, much to my amazement and shock the whole app platform boils down to a website running inside a <a href="http://en.wikipedia.org/wiki/Chromium_(web_browser)">Chromium</a>-instance which gives you access to the main application via JavaScript-objects.</p>
<p>The current app lineup (of which the official <a href="http://wearehunted.com/">We Are Hunted</a> app is by far my favorite) showcases some of the cool things that can be done with the <a href="http://developer.spotify.com/download/spotify-apps-api/reference/">API</a>, which lets you not only get the currently playing tracks, but create play queues from within the app, allow for dragging of tracks/albums/artists into your app and even have direct control over the music player.</p>
<div id="attachment_501" class="wp-caption alignright" style="width: 160px"><a href="http://thelonelycoder.files.wordpress.com/2011/12/spotify-flickrstream-4.png"><img class="size-thumbnail wp-image-501" title="spotify-flickrstream" src="http://thelonelycoder.files.wordpress.com/2011/12/spotify-flickrstream-4.png?w=150&#038;h=94" alt="" width="150" height="94" /></a><p class="wp-caption-text">Chromium&#039;s inspector open inside Spotify</p></div>
<p>The API was fascinating and all, but what caught my attention more was the idea that it was a fully-functioning Chromium-browser inside the program. This is nothing new, as <a href="http://store.steampowered.com/">Steam</a> does something similar (using Internet Explorer, I think), with the application interface mirroring their main website, and <a href="http://phonegap.com/">PhoneGap</a> has a way to wrap your website in a native shell which will run on mobile devices while giving your app access to hardware and system functions. However, I was fascinated by the possibilities it presented and I had to dig deeper to see what I could make.</p>
<p>I built a <a href="http://thelonelycoder.wordpress.com/2011/12/01/spotify-flickrstream/">small app</a> that fetches <a href="http://flickr.com">flickr</a> pictures based on the currently playing artist, which took about evening of coding and taught me a lot. I am now of the firm belief that HTML/JavaScript is the future of app creation. Where I was once a stout supporter of native code using native UI, after building a website that runs inside of another application, I have completely reversed my opinion on the issue.</p>
<p>Spotify is a platform which doesn&#8217;t have built-in UI elements, doesn&#8217;t support multi-core processing and can&#8217;t run complied code at a-billion-calculations-per-second, but it doesn&#8217;t have to. The only thing it needs to support is letting you interact with the application itself and using a compiled language or going down the dangerous route of <a href="http://en.wikipedia.org/wiki/Unrealscript">making their own scripting language</a> would only have needlessly complicated the process and created an enclosed space with high barriers to entry. Sticking to HTML and JavaScript worked like a charm and given my long experience with building websites I was able to take an idea and build it in shorter time than it would take to get my app through <a href="http://developer.apple.com/appstore/guidelines.html">Apple&#8217;s App Store Approval Board</a>*.</p>
<p>What really blew me away, which in hindsight really shouldn&#8217;t, was the fact that it was a fully-functioning web browser, which meant that any code that would work on the web would work inside Spotify. I gave this a test and my aforementioned app experiment uses <a href="http://jquery.com/">jQuery</a> to perform the ajax call and DOM-selections, and follows a lot of the JavaScript coding conventions I learned while working on the <a href="http://thelonelycoder.wordpress.com/2011/07/29/endless-youtube-player/">Endless YouTube</a> project.</p>
<p>What makes me think that the future of apps lies in HTML and JavaScript is mostly because of how prevalent it is and how easy it is to insert a sandboxed instance inside your application nowadays, opening up for anyone who has built a blog or made a drop-down menu to create apps that integrate with the program as if they were a part of the native code. The future of web development isn&#8217;t on the web, it&#8217;s taking what works on the web and shoving it anywhere you can find room.</p>
<p>As a final test to see if this web-to-app idea really holds weight was to try to see if a <a href="https://github.com/lafka/canvas-turrets">canvas-based game I built with some of my coworkers</a> would work inside Spotify.</p>
<p><a href="http://thelonelycoder.files.wordpress.com/2011/12/spotify-canvasturrets.png"><img class="aligncenter size-medium wp-image-500" title="spotify-canvasturrets" src="http://thelonelycoder.files.wordpress.com/2011/12/spotify-canvasturrets.png?w=300&#038;h=158" alt="" width="300" height="158" /></a></p>
<p>It did, and <strong>I didn&#8217;t change a single line of code</strong> to do it.</p>
<p><em>* Not trying for any subtle commentary here, just providing a useful and humorous metric.</em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thelonelycoder.wordpress.com/498/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thelonelycoder.wordpress.com/498/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/thelonelycoder.wordpress.com/498/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/thelonelycoder.wordpress.com/498/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/thelonelycoder.wordpress.com/498/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/thelonelycoder.wordpress.com/498/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/thelonelycoder.wordpress.com/498/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/thelonelycoder.wordpress.com/498/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/thelonelycoder.wordpress.com/498/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/thelonelycoder.wordpress.com/498/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/thelonelycoder.wordpress.com/498/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/thelonelycoder.wordpress.com/498/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/thelonelycoder.wordpress.com/498/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/thelonelycoder.wordpress.com/498/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=498&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.thelonelycoder.com/2011/12/01/what-spotify-apps-say-about-the-future-of-web-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4295ac16d0d4fe814921c1af827101f3?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">michaelenger</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2011/12/spotify-flickrstream-4.png?w=150" medium="image">
			<media:title type="html">spotify-flickrstream</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2011/12/spotify-canvasturrets.png?w=300" medium="image">
			<media:title type="html">spotify-canvasturrets</media:title>
		</media:content>
	</item>
		<item>
		<title>spotify-flickrstream</title>
		<link>http://blog.thelonelycoder.com/2011/12/01/spotify-flickrstream/</link>
		<comments>http://blog.thelonelycoder.com/2011/12/01/spotify-flickrstream/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 21:43:49 +0000</pubDate>
		<dc:creator>Michael Enger</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Spotify]]></category>

		<guid isPermaLink="false">http://thelonelycoder.wordpress.com/?p=492</guid>
		<description><![CDATA[I created a simple Spotify app which will fetch a continuous stream of pictures from flickr based on the currently playing artist. It was done over a period of a few hours without any prior knowledge about the API and is a testament to how easy HTML/JavaScript-powered apps can be. There is minimal interaction with [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=492&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I created a simple <a href="http://www.spotify.com/">Spotify</a> app which will fetch a continuous stream of pictures from <a href="http://flickr.com/">flickr</a> based on the currently playing artist. It was done over a period of a few hours without any prior knowledge about the API and is a testament to how easy HTML/JavaScript-powered apps can be. There is minimal interaction with Spotify itself, just a callback which listens for when a new track is playing (pretty much the one they showed in the <a href="http://developer.spotify.com/download/spotify-apps-api/tutorial/">tutorial</a>) and some scaffolding, the rest is normal web code which would work on any modern web browser. It blew my mind how easy it is.</p>
<p><a href="http://thelonelycoder.files.wordpress.com/2011/12/spotify-flickrstream-1.png"><img class="aligncenter size-medium wp-image-494" title="spotify-flickrstream" src="http://thelonelycoder.files.wordpress.com/2011/12/spotify-flickrstream-1.png?w=300&#038;h=178" alt="" width="300" height="178" /></a></p>
<p><a href="http://thelonelycoder.files.wordpress.com/2011/12/spotify-flickrstream-2.png"><img class="aligncenter size-medium wp-image-495" title="spotify-flickrstream" src="http://thelonelycoder.files.wordpress.com/2011/12/spotify-flickrstream-2.png?w=300&#038;h=178" alt="" width="300" height="178" /></a></p>
<p><a href="http://thelonelycoder.files.wordpress.com/2011/12/spotify-flickrstream-3.png"><img class="aligncenter size-medium wp-image-493" title="spotify-flickrstream" src="http://thelonelycoder.files.wordpress.com/2011/12/spotify-flickrstream-3.png?w=300&#038;h=178" alt="" width="300" height="178" /></a></p>
<p>Unfortunately there is no way to share apps just yet, but if you have a <a href="http://www.spotify.com/se/download/previews/">preview version</a> of Spotify and a developer-enabled Spotify account (it&#8217;s just <a href="https://developer.spotify.com/en/spotify-apps-api/resources/">one email</a> away) then you should grab the code and see how much can be done without any prior knowledge.</p>
<p style="text-align:center;"><a href="https://github.com/michaelenger/spotify-flickrstream">Source on GitHub</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thelonelycoder.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thelonelycoder.wordpress.com/492/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/thelonelycoder.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/thelonelycoder.wordpress.com/492/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/thelonelycoder.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/thelonelycoder.wordpress.com/492/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/thelonelycoder.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/thelonelycoder.wordpress.com/492/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/thelonelycoder.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/thelonelycoder.wordpress.com/492/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/thelonelycoder.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/thelonelycoder.wordpress.com/492/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/thelonelycoder.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/thelonelycoder.wordpress.com/492/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=492&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.thelonelycoder.com/2011/12/01/spotify-flickrstream/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4295ac16d0d4fe814921c1af827101f3?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">michaelenger</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2011/12/spotify-flickrstream-1.png?w=300" medium="image">
			<media:title type="html">spotify-flickrstream</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2011/12/spotify-flickrstream-2.png?w=300" medium="image">
			<media:title type="html">spotify-flickrstream</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2011/12/spotify-flickrstream-3.png?w=300" medium="image">
			<media:title type="html">spotify-flickrstream</media:title>
		</media:content>
	</item>
		<item>
		<title>Ninja vs Samurai</title>
		<link>http://blog.thelonelycoder.com/2011/11/27/ninja-vs-samurai/</link>
		<comments>http://blog.thelonelycoder.com/2011/11/27/ninja-vs-samurai/#comments</comments>
		<pubDate>Sun, 27 Nov 2011 11:23:39 +0000</pubDate>
		<dc:creator>Michael Enger</dc:creator>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[LÖVE]]></category>
		<category><![CDATA[Lua]]></category>

		<guid isPermaLink="false">http://thelonelycoder.wordpress.com/?p=482</guid>
		<description><![CDATA[I recently made a game using LÖVE, in an effort to eat my own dog food but also for the fun of it. It started as an experiment to create a puzzle game which felt like an action game, or rather take an action game concept and build a puzzle game out of it. I [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=482&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I recently made a game using <a href="http://love2d.org/">LÖVE</a>, in an effort to <a href="http://en.wikipedia.org/wiki/Eat_your_own_dog_food">eat my own dog food</a> but also for the fun of it. It started as an experiment to create a puzzle game which felt like an action game, or rather take an action game concept and build a puzzle game out of it. I took a simple idea, sneaking around without being seen, and built a game around it.</p>
<p><a href="http://thelonelycoder.files.wordpress.com/2011/11/nvs-prototype.png"><img class="aligncenter size-full wp-image-485" title="Stealth2D prototype" src="http://thelonelycoder.files.wordpress.com/2011/11/nvs-prototype.png?w=580" alt=""   /></a></p>
<p>Doesn&#8217;t look like much, but it gets the job done. After some more tweaking I felt that there was a game in here somewhere, so I recruited a <a href="http://jonmorten.com/">coworker</a> of mine to create some nicer graphics and he came up with the idea of ninja vs samurai. A game is born.</p>
<p><a href="http://thelonelycoder.files.wordpress.com/2011/11/v10-screenshot1.png"><img class="aligncenter size-full wp-image-486" title="Ninja vs Samurai" src="http://thelonelycoder.files.wordpress.com/2011/11/v10-screenshot1.png?w=580" alt=""   /></a></p>
<p>You control your ninja and have to get to the escape hole without being seen by the samurai, who have a dramatically limited field of vision, but who will kill you instantly if you are spotted. Along the way you will find scrolls you can pick up and you can try to complete levels in a limited amount of moves.</p>
<p>The game is available from IndieDB for Mac and Windows and the source is on GitHub.</p>
<h2 style="text-align:center;"><a href="http://www.indiedb.com/games/ninja-vs-samurai">Ninja vs Samurai</a></h2>
<p style="text-align:center;"><a href="https://github.com/michaelenger/Stealth2D">Source on GitHub</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thelonelycoder.wordpress.com/482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thelonelycoder.wordpress.com/482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/thelonelycoder.wordpress.com/482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/thelonelycoder.wordpress.com/482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/thelonelycoder.wordpress.com/482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/thelonelycoder.wordpress.com/482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/thelonelycoder.wordpress.com/482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/thelonelycoder.wordpress.com/482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/thelonelycoder.wordpress.com/482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/thelonelycoder.wordpress.com/482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/thelonelycoder.wordpress.com/482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/thelonelycoder.wordpress.com/482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/thelonelycoder.wordpress.com/482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/thelonelycoder.wordpress.com/482/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=482&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.thelonelycoder.com/2011/11/27/ninja-vs-samurai/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4295ac16d0d4fe814921c1af827101f3?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">michaelenger</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2011/11/nvs-prototype.png" medium="image">
			<media:title type="html">Stealth2D prototype</media:title>
		</media:content>

		<media:content url="http://thelonelycoder.files.wordpress.com/2011/11/v10-screenshot1.png" medium="image">
			<media:title type="html">Ninja vs Samurai</media:title>
		</media:content>
	</item>
		<item>
		<title>Git Guidelines for Iterative Development</title>
		<link>http://blog.thelonelycoder.com/2011/11/17/git-guidelines-for-iterative-development/</link>
		<comments>http://blog.thelonelycoder.com/2011/11/17/git-guidelines-for-iterative-development/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 22:42:09 +0000</pubDate>
		<dc:creator>Michael Enger</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://thelonelycoder.wordpress.com/?p=477</guid>
		<description><![CDATA[I&#8217;m a big fan of Git versioning software, having received rudimentary training at work and getting into using it at home. It not only allows me the great benefit of being able to roll back unwanted changes or branch off into strange experiments, but thanks to GitHub I have backups of all my (recent) code in [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=477&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a big fan of Git versioning software, having received rudimentary training at work and getting into using it at home. It not only allows me the great benefit of being able to roll back unwanted changes or branch off into strange experiments, but thanks to <a href="https://github.com/michaelenger">GitHub</a> I have backups of all my (recent) code in a format which makes it available to share with other geeks.</p>
<p>In my short history of using Git I have crafted a few guidelines that I follow to make my personal development experience just a little bit better. These guidelines aren&#8217;t complicated rules, but more of a description of the mindset I am in when using Git for my personal projects. These reflect a methodology which has evolved over a period of working on my own and I find them useful in keeping myself on track and having some quality control over my own work even when there is nobody else there to scrutinize it.</p>
<p>A small byword before we begin: I&#8217;m not sure about the true definition of iterative development, but in my mind it means that you start off with a small project and slowly but surely add components and features, each time ensuring that your modifications don&#8217;t break what you are working on. This could mean that you start off with a tech demo and work towards fulfilling a specification or it could just be adding to an existing product to create new and better versions of it. The topic is broad and my personal interpretation is vague and undefined, but in lieu of wasting everybody&#8217;s time explaining everything I&#8217;ll just leave it as: cutting a big project into smaller tasks that are done one after another.</p>
<h1>There is But One Master Branch</h1>
<p>What is the master branch anyway? Is it just the branch named &#8220;master&#8221;? Is it the single branch which all branches merge into before deployment? Is it the single branch that all branches are based on? Sure, it can be all of that, but in my mind it represents the final product. I don&#8217;t have a habit of working on multiple branches, especially because I am working by myself, but the master branch is the only one that I push to GitHub and the only one I can really depend on when it comes to showing what I&#8217;m working on to others.</p>
<p>In most projects all work is done to reach a single goal, the final product, which should be reflected in the way that Git branches are treated. Working on a separate branch should be done with the intent to merge it into the master branch at some point and you should never have multiple branches that reflect different versions of your program or different final projects that are part of a single ecosystem. When I migrated my <a href="http://thelonelycoder.wordpress.com/2011/07/29/endless-youtube-player/">Endless YouTube Player</a> from PHP to Javascript there was a temptation to create different branches to hold the different versions, but in the end I understood that the move from PHP to JS was a part of the evolution of the project, and holding on to a stunted PHP version in its own separate branch would just create the illusion of an unfinished new feature being left to die. This is a task that is best left to tags, which are great for keeping track of previous versions of the project for whatever reason.</p>
<h1>Push/Merge Only When You are Finished</h1>
<p>This makes sense, right? You only merge back into the master branch or push your changes to the central repository once you are finished with what you&#8217;re working on. It&#8217;s of course up to you to decide what &#8220;finished&#8221; means, but for me it was when I was working on a specific feature which took me a few hours to complete, spanning over multiple commits.</p>
<p>I use GitHub&#8217;s Issues tracker to keep tabs on what fancy features I want to add to the various projects I&#8217;m tinkering with and it makes sense to leave any changes I have done in concordance with one of the issues on my local computer and wait until I&#8217;ve completed the task before I push it up to GitHub. This only really makes sense when the tasks are small enough to not span over several weeks, because losing my laptop or having the harddisk spontaneously burst into flames would be devastating if I had a month&#8217;s worth of work without a backup. However, if you&#8217;re breaking up your project into month-long chunks then I can&#8217;t really help you.</p>
<h1>Every Commit is a Finished Product</h1>
<p>This is probably the one which will either incite ire or have you cheering on my pedantic view on iteration; commits, no matter how big or small, result in a finished product that could be deployed and released into the world. This might be a little hard to explain, but it ties in with the previous guideline in the sense that whatever changes you&#8217;ve made to your code will not result in any unfinished function or pending changes left for subsequent commits.</p>
<p>If you&#8217;ve added a new feature then the feature is ready to be used, even if there is no way to trigger it. If you&#8217;re fixing a bug which requires you to change two parts of the program, then one part is changed and <span style="text-decoration:underline;">made to work with the rest of the program</span> before the other change is implemented. Let me try with an example:</p>
<p>One of the features I was trying to implement in my <a href="https://github.com/michaelenger/Stealth2D">upcoming puzzle game</a> was the addition of collectibles scattered around the puzzle boards. A part of this feature was to change how the game keeps a player&#8217;s score, allowing it to keep track of the amount of moves the player had used to reach the goal as well as the amount of collectibles the user had picked up in that particular level. First I changed the scorekeeping to allow for multiple variables associated with a level, making sure every piece of the game which referenced the scoreboard was aware of this change. This was then committed (with an appropriately descriptive comment) and I moved on to adding the collectibles counter to the scoreboard which was then added to a separate commit.</p>
<p>This may seem like overkill, especially on such a small feature where the difference between the two commits was about 10 minutes of work, but it encapsulates the primary mentality I have when it comes to iterative development. Every task can, and should, be broken down into smaller sub-tasks which are completed sequentially and without affecting the rest of the project. Commits are just a simple way to create a symbolic separation between the sub-tasks and having the commits never break existing functionality or leave an unfinished gap to be filled in later is just good form. Good form results in better code and happier coders. That&#8217;s a scientific fact, look it up.</p>
<h1>Tagging = Deployment</h1>
<p>Depending on what type of project you&#8217;re working on, the concept of &#8220;deployment&#8221; can have many different meanings, but a good rule of thumb is to define it as any time where the project can be seen by people who aren&#8217;t directly involved in its creation, whether that be showing it to a client or putting together a demo to post on a <a href="http://www.indiedb.com/games/ninja-vs-samurai">social game development website</a>.</p>
<p>The idea behind this guideline is to define the points where the project is production-ready and create a tag on only those instances, as those are the points in time which is it interesting to look back on. You can always go back to any commit you&#8217;ve created, such is the beauty of versioning, but, much like the previous guideline, this is a symbolic gesture of &#8220;it&#8217;s done&#8221; that ties in with the iterativeness of the project.</p>
<p>Those are the guidelines I follow, at least so far, and they have served me well, crafting a neat and logical Git history for me to follow. That said, these are based on my experiences with working by myself, so I won&#8217;t guarantee that they&#8217;d work in large teams that have to deal with bug fixing alongside feature development or some other crazy stuff that geeks get stuck doing when they&#8217;d rather be micro-managing their commit messages.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thelonelycoder.wordpress.com/477/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thelonelycoder.wordpress.com/477/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/thelonelycoder.wordpress.com/477/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/thelonelycoder.wordpress.com/477/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/thelonelycoder.wordpress.com/477/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/thelonelycoder.wordpress.com/477/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/thelonelycoder.wordpress.com/477/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/thelonelycoder.wordpress.com/477/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/thelonelycoder.wordpress.com/477/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/thelonelycoder.wordpress.com/477/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/thelonelycoder.wordpress.com/477/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/thelonelycoder.wordpress.com/477/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/thelonelycoder.wordpress.com/477/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/thelonelycoder.wordpress.com/477/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.thelonelycoder.com&amp;blog=20126788&amp;post=477&amp;subd=thelonelycoder&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.thelonelycoder.com/2011/11/17/git-guidelines-for-iterative-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4295ac16d0d4fe814921c1af827101f3?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">michaelenger</media:title>
		</media:content>
	</item>
	</channel>
</rss>
