<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">
  <channel>
    <title>Mike Hodnick's Blog</title>
    <link>http://kindohm.com/</link>
    <description>Mike Hodnick's Blog</description>

    
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Kindohm" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="kindohm" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>44.809954</geo:lat><geo:long>-93.610506</geo:long><item>
       <title>Plight of the Open Source Windows JavaScript Developer</title>
       <link>http://kindohm.com/2012/05/16/PlightOfTheWinJsDev.html</link>
       <description>&lt;style&gt;
blockquote {
	font-style: italic;
	padding: 20px;
	margin-left: 20px;
	border-left: solid 5px #999;
	background: #eee;
}
&lt;/style&gt;

&lt;p&gt;If you are a Windows developer and want to contribute to 
open source JavaScript projects, prepare for a little bit of pain
and suffering.&lt;/p&gt;

&lt;blockquote&gt;"Why the pain and suffering?"&lt;/blockquote&gt;

&lt;p&gt;Why? Because the Linux and Mac kids are having all the fun right now. They 
took the initiative and you have to follow in their footsteps. 
They aren't using Windows tooling (duh!). They are
developing their own tooling on &lt;code&gt;node.js&lt;/code&gt; or using tools that
depend on &lt;code&gt;bash&lt;/code&gt;. 

&lt;p&gt;Most Windows devs don't have much exposure to &lt;code&gt;node.js&lt;/code&gt;, 
let alone &lt;code&gt;bash&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;"What tooling are you talking about?"&lt;/blockquote&gt;

&lt;p&gt;The most Windows-unfriendly tooling is the combination of 
&lt;strong&gt;&lt;code&gt;Make&lt;/code&gt;&lt;/strong&gt; and 
&lt;strong&gt;&lt;code&gt;node.js&lt;/code&gt; libraries&lt;/strong&gt;. Separately they are not
a problem on Windows, but it isn't so easy (or even possible) to get
them to work together on Windows.&lt;/p&gt;

&lt;p&gt;The good open source JavaScript projects out there &lt;em&gt;do not&lt;/em&gt;
use this combination and instead only depend on &lt;code&gt;node.js&lt;/code&gt;.
However there are still projects out there that use this combination.&lt;/p&gt;


&lt;p&gt;In the Linux and Mac world, &lt;code&gt;Make&lt;/code&gt; typically runs 
&lt;code&gt;bash&lt;/code&gt; 
commands to do things like file system manipulation, run tests, and
concatenate your JavaScript files. The problem is that Windows can't
run &lt;code&gt;bash&lt;/code&gt; commands.&lt;/p&gt;

&lt;p&gt;One solution is to run &lt;strong&gt;Cygwin&lt;/strong&gt; - which is a Unix emulator
for Windows that will run &lt;code&gt;bash&lt;/code&gt;. For vanilla &lt;code&gt;Make&lt;/code&gt;
tasks, this will work just fine. However this becomes a problem
when you want to run &lt;code&gt;node.js&lt;/code&gt; commands from a 
&lt;code&gt;Makefile&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;"Whoa whoa whoa...  can you back up and explain node.js
a little?"&lt;/blockquote&gt;

&lt;p&gt;In the JavaScript developer world, &lt;code&gt;node.js&lt;/code&gt; is exploding.
&lt;code&gt;node.js&lt;/code&gt; is a JavaScript runtime that abstracts away system
details so you can focus on writing JavaScript apps for your system. 
For the .NET devs out there, think of it this way: &lt;code&gt;node.js&lt;/code&gt; is
to JavaScript as the .NET Framework is to C#.&lt;/p&gt;

&lt;p&gt;The best JavaScript tooling is being built on top of &lt;code&gt;node.js&lt;/code&gt;. 
Take for example two popular &lt;code&gt;node.js&lt;/code&gt; libraries: 
&lt;a href="https://github.com/mishoo/UglifyJS"&gt;UglifyJS&lt;/a&gt; and 
&lt;a href="https://github.com/cowboy/grunt"&gt;grunt&lt;/a&gt;. UglifyJS is
&lt;em&gt;arguably the fastest and most valid JavaScript minifier 
in existence today&lt;/em&gt;. Many JavaScript projects are using it. Grunt is
"a task-based command line build tool for JavaScript projects". Use Grunt
to structure your JavaScript projects and carry out Make-like build tasks.
These two libraries are run in the &lt;code&gt;node.js&lt;/code&gt; runtime.&lt;/p&gt;

&lt;p&gt;These two libraries are just a taste. There are 
&lt;a href="http://search.npmjs.org/#/_browse/all"&gt;hundreds of JavaScript 
libraries built on &lt;code&gt;node.js&lt;/code&gt;&lt;/a&gt; that make your own JavaScript 
development more productive.&lt;/p&gt;

&lt;p&gt;I should mention that &lt;code&gt;node.js&lt;/code&gt; installs and runs on 
Windows just fine. You can even alias it in PowerShell.&lt;/p&gt;

&lt;blockquote&gt;"Ok, so what's the problem with Cygwin and node.js?"&lt;/blockquote&gt;

&lt;p&gt;Some open source JavaScript projects use a combination of &lt;em&gt;both&lt;/em&gt;
&lt;code&gt;Make&lt;/code&gt;
and &lt;code&gt;node.js&lt;/code&gt;. For example, they use &lt;code&gt;Make&lt;/code&gt; to fire off
UglifyJS minification. On Windows, this would mean you'd need to get
&lt;code&gt;node.js&lt;/code&gt; running on Cygwin. However, if you want to try and get 
&lt;code&gt;node.js&lt;/code&gt; running on Cygwin, you are in for a world of hurt:
&lt;a href="https://github.com/joyent/node/wiki/Building-node.js-on-Cygwin-(Windows)"&gt;
github.com/joyent/node/wiki/Building-node.js-on-Cygwin-(Windows)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Simply put, &lt;code&gt;node.js&lt;/code&gt; isn't going to be supported by Joyent
to run on Cygwin anytime soon.&lt;/p&gt;

&lt;blockquote&gt;"So I should get to know node.js on Windows, and for a new 
JavaScript project I should use &lt;strong&gt;only&lt;/strong&gt; node.js 
libraries for build and dev tasks. Easy enough."&lt;/blockquote&gt;

&lt;p&gt;Yep.&lt;/p&gt;

&lt;blockquote&gt;"But since I develop on Windows I can't
contribute to projects that depend on both Make and node.js?"&lt;/blockquote&gt;

&lt;p&gt;Because we're talking about open source, &lt;strong&gt;the answer is 
no!!!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The real task at hand is to eliminate the dependency on &lt;code&gt;Make&lt;/code&gt;
and to roll with 100% &lt;code&gt;node.js&lt;/code&gt; tooling for JavaScript 
projects. Grunt does what &lt;code&gt;Make&lt;/code&gt; was already doing in JavaScript
builds, so eliminate the dependency
on &lt;code&gt;Make&lt;/code&gt;.&lt;/p&gt; 

&lt;p&gt;Leverage the fact that this is &lt;em&gt;open source&lt;/em&gt;. 
Contribute to projects to help eliminate the &lt;code&gt;bash&lt;/code&gt;
and &lt;code&gt;Make&lt;/code&gt; dependencies. The owners of the projects will most likely
be delighted that someone is willing to contribute and improve the code base;
that has at least been my experience with open source projects.&lt;/p&gt;

&lt;blockquote&gt;"Wow, that doesn't sound too painful."&lt;/blockquote&gt;

&lt;p&gt;It isn't, but it's a different world for the average Windows .NET 
developer who spends most of their time in Visual Studio.
If you don't have much experience working from a command line
then prepare for a different learning curve. Unless you want to dig in
&lt;em&gt;deep&lt;/em&gt; and spend a lot of extra time developing some plugins, 
you are going to get your hands dirty
in the command line with &lt;code&gt;node.js&lt;/code&gt;. In my opinion, this is a good
thing.&lt;/p&gt;

&lt;p&gt;For straight-up JavaScript development, big IDE's aren't going to give
you much. JavaScript doesn't use a compiler. There is no need for 
Solution, Project, Resource, or UI meta-files.  
Keeping it real with the command line and a good text editor are 
what it's about with JavaScript. However, arguing about a programmer's
preference in editors is like religious warfare. 
The bottom line is to use what makes you
most productive, whether that's Notepad, Notepad++, Notepad2, Vim on
Windows, or an IDE like Visual Studio [1].&lt;/p&gt;

&lt;p&gt;If you are a Windows JavaScript developer, or a Windows developer at all
for that matter, get to know &lt;code&gt;node.js&lt;/code&gt; on Windows. Install it and
start using it. Develop for it. It is how JavaScript development on Windows
should be done, especially if it is for an open source project. It levels
the playing field for JavaScript development across all of the main 
operating systems.&lt;/p&gt;

&lt;p style="font-size: 80%; line-height: 20px;"&gt;
[1] Personally I have fun using 
&lt;code&gt;&lt;a href="https://en.wikipedia.org/wiki/Tmux"&gt;tmux&lt;/a&gt;&lt;/code&gt; to host 
a &lt;code&gt;Vim&lt;/code&gt; editor and additional console prompts to run builds and
tests. You never leave the keyboard and it's faster than Alt+Tab'ing since
it's only one Window. However, &lt;code&gt;tmux&lt;/code&gt; is not supported in
Cygwin, so you need to dev on a Linux or Mac machine to go this route.
Yet another pain for the Windows developer...if you want to go the
&lt;code&gt;tmux&lt;/code&gt; route.&lt;/p&gt;
</description>
    </item>
    
    <item>
       <title>The Git Rap (+ remix)</title>
       <link>http://kindohm.com/2012/05/14/TheGitRapRemix.html</link>
       <description>&lt;style&gt;
blockquote {
	margin-left: 20px;
	border-left: solid 5px #999;
	font-style: italic;
	padding: 20px;
	background: #eee;
}
&lt;/style&gt;

&lt;blockquote&gt;"just a touch that file .gitignore"&lt;/blockquote&gt;

&lt;p&gt;A couple of weeks ago, a GitHub user by the name of Marak
created a repo and posted tracks for a song he wrote and recorded called
&lt;a href="https://github.com/Marak/The-Git-Rap"&gt;The Git Rap&lt;/a&gt;.
He posted not only a final mix but the instrumental and vocal
tracks as well. Basically it is a repo of wav files.&lt;/p&gt;

&lt;p&gt;I couldn't help but do something with it...&lt;/p&gt;

&lt;p&gt;After a week of slicing, copying, pasting, and turning knobs
on synthesizers, I'm pleased to share with you The Git Rap - 
Kindohm Cherry-Pick Mix:&lt;/p&gt;

&lt;iframe width="100%" height="166" scrolling="no" frameborder="no" src="http://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F45775300&amp;show_artwork=true"&gt;&lt;/iframe&gt;

&lt;p&gt;Marak accepted my pull request to the repo a few days ago, and the
remix is now a permanent part of the repo! I may make another remix...we'll 
see.&lt;/p&gt;

&lt;p&gt;You can listen to the original here:&lt;/p&gt;

&lt;iframe width="100%" height="166" scrolling="no" frameborder="no" src="http://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F44915376&amp;show_artwork=true"&gt;&lt;/iframe&gt;


</description>
    </item>
    
    <item>
       <title>Iowa Code Camp 9</title>
       <link>http://kindohm.com/2012/05/07/iowacodecamp9.html</link>
       <description>&lt;p&gt;This past weekend I was in Cedar Rapids, Iowa for 
&lt;a href="http://iowacodecamp.com"&gt;Iowa Code Camp&lt;/a&gt;. This event
was their ninth one, and it was great!&lt;/p&gt;
&lt;p&gt;I had the fortune of doing a
presentation at the event on building an HTML5 audio player with
&lt;a href="http://buzz.jaysalvat.com/"&gt;buzz.js&lt;/a&gt; and 
&lt;a href="http://knockoutjs.com"&gt;knockout.js&lt;/a&gt;. If you attended
my presentation and are looking for the content and code that
I showed, you can get it all here: 
&lt;a href="https://github.com/kindohm/icc9-html5audioplayer"&gt;
github.com/kindohm/icc9-html5audioplayer&lt;/a&gt;. Heck, even if you
didn't attend my presentation you can still take a peek!&lt;/p&gt;

&lt;p&gt;I should also mention that there were plenty of llamas in my 
presentation content. Full size, all the way:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/#!/kindohm/status/198795505935990784/photo/1/large"&gt;&lt;img src="http://p.twimg.com/AsJDdZqCQAEYfhP.jpg:large"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The event was great, and I thought this tweet really summed up 
one of the reasons why: &lt;/p&gt;

&lt;blockquote class="twitter-tweet"&gt;&lt;p&gt;Attended my 1st @&lt;a href="https://twitter.com/iowacodecamp"&gt;iowacodecamp&lt;/a&gt;. Just as good if not better than a paid event.I am hooked.Will be a future regular.Keep up good work.&lt;/p&gt;&amp;mdash; Brent Greiner (@BrentGreiner) &lt;a href="https://twitter.com/BrentGreiner/status/199329581730238464" data-datetime="2012-05-07T02:47:30+00:00"&gt;May 7, 2012&lt;/a&gt;&lt;/blockquote&gt;
&lt;script src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;

&lt;p&gt;Brent is absolutely right! Code camps are free and full of great
technical content. I think one of the reasons for this is that us
programmers want to come out and talk code for no other reason than
because we love doing it. Nobody gets paid to speak - so you're 
getting speakers that want to be there on their own pure motivation
to share cool stuff and their own knowledge and experiences.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twincitiescodecamp"&gt;Twin Cities Code Camp&lt;/a&gt; is
no exception - so if the Twin Cities is a better location for you
make sure you subscribe to the RSS feed on the TCCC web site for info
on the next TCCC event. &lt;a href="http://twitter.com/tccodecamp"&gt;
@TCCodeCamp&lt;/a&gt; is on Twitter too. &lt;/p&gt;

&lt;p&gt;Our next Twin Cities Code Camp date will probably be sometime in October.&lt;/p&gt;

&lt;p&gt;But don't let location restrict you... folks from as far away as
&lt;strong&gt;Idaho&lt;/strong&gt; attended this last Iowa Code Camp!&lt;/p&gt;


</description>
    </item>
    
    <item>
       <title>Fast Fourier Transforms with audiolib.js</title>
       <link>http://kindohm.com/2012/05/02/audiolibjs-fft.html</link>
       <description>&lt;style&gt;
blockquote {
	margin-left: 30px;
	margin-right: 30px;
	font-style: italic;
	background: #ccc;
	border-left: solid 5px #999;
	padding: 20px;
}
&lt;/style&gt;

&lt;blockquote&gt;"So this one day I was using an oscillator..."&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/jussi-kalliokoski/audiolib.js"&gt;audiolib.js&lt;/a&gt;
has been one of my favorite JavaScript libraries to work with so far. Being
somewhat of a synthesizer and audio geek, I love using it to produce
audio with code.&lt;/p&gt;

&lt;p&gt;Aside from audio synthesis and generating samples, audiolib.js includes
&lt;a href="https://github.com/jussi-kalliokoski/fft.js"&gt;fft.js&lt;/a&gt; to perform
&lt;a href="https://en.wikipedia.org/wiki/Fast_Fourier_transform"&gt;Fast 
Fourier Transforms&lt;/a&gt; (FFT). If you're not familiar with what an FFT is,
think of any graphical output you've seen in a car stereo or MP3 player
that displays the frequency specturm of the music being played. FFT's are 
used to compute those displays. With audiolib.js, you can use FFT's to
create your own similar display on an HTML5 canvas.&lt;/p&gt;

&lt;p&gt;Before digging in to the code, here is a quick demo 
(&lt;a href="https://gist.github.com/2571285"&gt;source code&lt;/a&gt;):&lt;/p&gt;

&lt;div&gt;
	&lt;p&gt;&lt;button id="playButton"&gt;play&lt;/button&gt;&lt;/p&gt;
	&lt;canvas id="canvas" 
		width="600" height="200" style="background: #ccc;"&gt;&lt;/canvas&gt;
&lt;/div&gt;
&lt;script type="text/javascript" src="/hodsmedia/audiolib.min.js"&gt;&lt;/script&gt;
&lt;script language="javascript" type="text/javascript"&gt;

/*
This code demonstrates how to use a Fast Fourier Transform 
with audiolib.js. It pushes samples to an FFT and draws
the FFT spectrum on an HTML5 canvas.

Author: Mike Hodnick

MIT License
*/

(function () {

	// vars
	var device, 
		osc1, 
		lfo1,
		lfo2,
		lfo3,
		lfo4,
		fft,
		fps = 30,
		channelCount = 2,
		width,
		height,
		context,
		playing = false;

	// This is the function that actually fills the
	// audio buffer with samples. In this case it
	// does crazy stuff with LFO's to produce
	// some interesting samples for the FFT.
	function audioCallback (buffer, channels) {
	
		if (!playing) return;
		
		var i, sample, bufferLength = buffer.length;

		for (i = 0; i &lt; bufferLength; i += channels) {
		
			lfo1.generate();
			lfo2.generate();
			lfo3.generate();
			lfo4.generate();
			
			lfo2.fm = lfo1.getMix();
			lfo3.fm = lfo2.getMix();
			lfo4.fm = lfo3.getMix();
			
			osc1.fm = lfo4.getMix();
			osc1.generate();
			
			sample = osc1.getMix();

			fft.pushSample(sample);

			for (n = 0; n &lt; channelCount; n++){
				buffer[i + n] = sample;
			}
		}
	}

	window.addEventListener('load', function() {
	
		var canvas, button;
		
		// set up audio device and oscillators
		device = audioLib.AudioDevice(audioCallback, channelCount);
		osc1 = audioLib.Oscillator(device.sampleRate, 600);
		osc1.waveShape = 'triangle';
		lfo1 = audioLib.Oscillator(device.sampleRate, 0.1);
		lfo2 = audioLib.Oscillator(device.sampleRate, 10.3);		
		lfo3 = audioLib.Oscillator(device.sampleRate, 0.7);
		lfo4 = audioLib.Oscillator(device.sampleRate, 6.2);		

		// create the FFT
		fft = audioLib.FFT(device.sampleRate, 4096);

		// set up UI and FFT canvas
		canvas = document.getElementById('canvas');
		context = canvas.getContext('2d');
		width = canvas.width;
		height = canvas.height;
		gradient = context.createLinearGradient(0, 0, 0, height);
		gradient.addColorStop(0, "#ff0000");
		gradient.addColorStop(0.6, "#ff0000");
		gradient.addColorStop(1, "#0000ff");	
		context.fillStyle = gradient;
		context.lineWidth = 1;
		
		button = document.getElementById('playButton');
		button.onclick = function () {
			playing = !playing;
			button.innerHTML = playing ? 'pause' : 'play';
		};
		
	});
		
	// This function actually draws the FFT spectrum
	// on the HTML5 canvas.
	function drawFFT () {

		var length, count;
		length = fft.spectrum.length / 8;

		context.clearRect(0, 0, width, height);
		context.beginPath();
		context.moveTo(0, height);
		
		for (count = 0; count &lt; length; count++) {	
			context.lineTo(count / length * width, 
				fft.spectrum[count] * -height * 2 + height);
		}
		
		context.moveTo(width,0);
		context.closePath();
		context.fill();
		context.stroke();	
	}

	// Use sink.js (built in to audiolib.js) to
	// call drawFFT at the given frame rate.
	Sink.doInterval(function(){ 
   
		if (playing) drawFFT();
    
	}, 1000/fps);	

})();

&lt;/script&gt;

&lt;p&gt;So how does this work exactly...&lt;/p&gt;

&lt;p&gt;Basically in the audiolib.js callback where samples are generated
you push the samples to an FFT object:&lt;/p&gt;

&lt;pre data-language="javascript"&gt;&lt;code&gt;oscillator.generate();
sample = oscillator.getMix();
fft.pushSample(sample);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In the context of the entire audio callback it looks like this:&lt;/p&gt;

&lt;pre data-language="javascript"&gt;&lt;code&gt;function audioCallback(buffer, channels) {
	var i, n, sample, bufferLength = buffer.length;

	for (i = 0; i &lt; bufferLength; i += channels) {

		oscillator.generate();
		sample = oscillator.getMix();
		fft.pushSample(sample);

		for (n = 0; n &lt; channelCount; n++) {
			buffer[i + n] = sample;	
		}
	}
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When this code starts running, the FFT fills up with
thousands of samples and it starts to do some analysis. Luckily you
don't need to know anything about the magical code in fft.js that
does all that!&lt;/p&gt;

&lt;p&gt;Now you just need to draw the FFT spectrum on a canvas, which basically
just some simple x/y graphing:&lt;/p&gt;

&lt;pre data-language="javascript"&gt;&lt;code&gt;var width, height, context;

window.addEventListener('load', function() {

	var canvas, button;
	
	canvas = document.getElementById('canvas');
	context = canvas.getContext('2d');
	width = canvas.width;
	height = canvas.height;
	context.fillStyle = "#ff0000";
	context.lineWidth = 1;
	
});

function drawFFT () {

	var length, count;
	length = fft.spectrum.length / 8;

	context.clearRect(0, 0, width, height);
	context.beginPath();
	context.moveTo(0, height);
	
	for (count = 0; count &lt; length; count++) {	
		context.lineTo(count / length * width, 
			fft.spectrum[count] * -height * 2 + height);
	}
	
	context.moveTo(width,0);
	context.closePath();
	context.fill();
	context.stroke();	
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can use &lt;code&gt;setTimeout()&lt;/code&gt; to continuously call the
&lt;code&gt;drawFFT()&lt;/code&gt; method. You can also use the &lt;code&gt;Sink&lt;/code&gt; object, which
is from the sink.js project and also bundled with audiolib.js:&lt;/p&gt;

&lt;pre data-language="javascript"&gt;&lt;code&gt;Sink.doInterval(function(){ 

	drawFFT();

}, 1000/fps);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cake! Now you can add some nice graphical output to your audiolib.js
apps! &lt;a href="https://github.com/jussi-kalliokoski/fft.js"&gt;fft.js&lt;/a&gt;
can be used outside of audiolib.js too, if you have another use for it.
Happy coding!&lt;/p&gt;

</description>
    </item>
    
    <item>
       <title>501 Development Ebbs and Flows</title>
       <link>http://kindohm.com/2012/04/18/501Devs.html</link>
       <description>&lt;p&gt;The &lt;a href="http://501manifesto.org"&gt;501 Manifesto&lt;/a&gt; has
been going around in developer circles recently. The basic idea
of the manifesto is that programmers should have a life outside of
writing code.&lt;/p&gt;

&lt;p&gt;I was glad to see
&lt;a href="http://adit.io/posts/2012-04-18-I_guess_Im_not_a_501_Developer.html"&gt;this blog post&lt;/a&gt;
as I don't agree with 100% of the 501 Manifesto. It's a question of what
your likes and hobbies are, isn't it? One man's love is another man's labor.
I write on this blog, contribute to
open source projects on GitHub, speak at developer events, and try to stay on top of new and
emerging technologies as much as I can. I &lt;em&gt;also&lt;/em&gt; play hockey, write and
record music with others, play video games, spend almost every minute with my daughter while
she is not in school or sleeping, go to Minnesota Wild hockey games, and
relax and have fun with my wife.&lt;/p&gt;

&lt;p&gt;In this discussion of the 501 Manifesto, nobody has brought up ebbs
and flows. You don't have to be a 501 developer 100% of the time.
Nor do you have to be uber-passionate about code 100% of the time. There is
middle ground. Can't our activities ebb and flow with what our job and interests demand?&lt;/p&gt;

&lt;p&gt;I have more hobbies and interests (on top of programming) than the 
average guy out there. I'm spread really thin, but there are still 
short lengths of time (e.g. a few days to a few weeks) when I focus most
of my free energy on writing code or technical activities. For example, 
I'm coming off a two-day Twin Cities Code Camp weekend, prefixed by a week
spent preparing my presentation I gave at that event. I am preparing for
another presentation at Iowa Code Camp and am also trying to get a Windows 8
app developed. It's been an intense period of geeking out. Time to 
change it up. I wasn't a 501 developer for a while, so can't next
week be different?&lt;/p&gt;

&lt;p&gt;The point of the manifesto should be a wake-up call to developers to live
rich, healthy lives. The point should &lt;em&gt;not&lt;/em&gt; be to identify specific, arbitrary
traits of developers
that may or may not hurt a single developer's quality of life. Take from the 501 Manifesto its spirit,
not its specifics.&lt;/p&gt;



</description>
    </item>
    

  </channel>
</rss>

