<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Luke Melia &#187; Software Development</title>
	<atom:link href="http://www.lukemelia.com/blog/archives/category/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lukemelia.com</link>
	<description>Thoughts from software developer from New York City who attempts to live every day with passion.</description>
	<lastBuildDate>Wed, 18 Jan 2012 22:28:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Redis in Practice presentation</title>
		<link>http://www.lukemelia.com/blog/archives/2010/12/03/redis-in-practice-presentation/</link>
		<comments>http://www.lukemelia.com/blog/archives/2010/12/03/redis-in-practice-presentation/#comments</comments>
		<pubDate>Sat, 04 Dec 2010 04:21:52 +0000</pubDate>
		<dc:creator>lukemelia</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.lukemelia.com/?p=700</guid>
		<description><![CDATA[My friend and colleague Noah Davis and I gave a presentation last night at the NoSQL NYC meetup. The topic was how we use Redis at Weplay. Redis in Practice]]></description>
			<content:encoded><![CDATA[<p>My friend and colleague Noah Davis and I gave a presentation last night at the <a href="http://www.meetup.com/nosql-nyc/calendar/15501588/">NoSQL NYC meetup</a>. The topic was how we use <a href="http://redis.io/">Redis</a> at <a href="http://www.weplay.com">Weplay</a>. </p>
<div style="width:643px" id="__ss_6012906"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/noahd1/redis-in-practice" title="Redis in Practice">Redis in Practice</a></strong><object id="__sse6012906" width="643" height="536"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=redis-in-practice-101202225148-phpapp01&#038;rel=0&#038;stripped_title=redis-in-practice&#038;userName=noahd1" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse6012906" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=redis-in-practice-101202225148-phpapp01&#038;rel=0&#038;stripped_title=redis-in-practice&#038;userName=noahd1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="643" height="536"></embed></object></div>
]]></content:encoded>
			<wfw:commentRss>http://www.lukemelia.com/blog/archives/2010/12/03/redis-in-practice-presentation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>“Managing Rubyists” video from GoRuCo</title>
		<link>http://www.lukemelia.com/blog/archives/2010/06/22/managing-rubyists-video-from-goruco/</link>
		<comments>http://www.lukemelia.com/blog/archives/2010/06/22/managing-rubyists-video-from-goruco/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 16:55:20 +0000</pubDate>
		<dc:creator>lukemelia</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.lukemelia.com/blog/archives/2010/06/22/%e2%80%9cmanaging-rubyists%e2%80%9d-video-from-goruco/</guid>
		<description><![CDATA[I had a great time presenting this talk at GoRuCo 2010. If you watch it, please don&#8217;t be shy with your feedback, tips, or criticism. GoRuCo 2010 &#8211; Luke Melia &#8211; Managing Ruby Teams from Gotham Ruby Conference on Vimeo.]]></description>
			<content:encoded><![CDATA[<p>I had a great time presenting this talk at GoRuCo 2010. If you watch it, please don&#8217;t be shy with your feedback, tips, or criticism.</p>
<div style="width:601px;margin:10px auto">
<object width="601" height="338"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12753163&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=12753163&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="601" height="338"></embed></object>
<p><a href="http://vimeo.com/12753163">GoRuCo 2010 &#8211; Luke Melia &#8211; Managing Ruby Teams</a> from <a href="http://vimeo.com/goruco">Gotham Ruby Conference</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.lukemelia.com/blog/archives/2010/06/22/managing-rubyists-video-from-goruco/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Redis in Practice: Who&#8217;s Online?</title>
		<link>http://www.lukemelia.com/blog/archives/2010/01/17/redis-in-practice-whos-online/</link>
		<comments>http://www.lukemelia.com/blog/archives/2010/01/17/redis-in-practice-whos-online/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 07:10:48 +0000</pubDate>
		<dc:creator>lukemelia</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.lukemelia.com/blog/archives/2010/01/17/redis-in-practice-whos-online/</guid>
		<description><![CDATA[Redis is one of the most interesting of the NOSQL solutions. It goes beyond a simple key-value store in that keys&#8217; values can be simple strings, but can also be data structures. Redis currently supports lists, sets and sorted sets. This post provides an example of using Redis&#8217; Set data type in a recent feature [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/redis/">Redis</a> is one of the most interesting of the NOSQL solutions. It goes beyond a simple key-value store in that keys&#8217; values can be simple strings, but can also be data structures. Redis currently supports lists, sets and sorted sets. This post provides an example of using Redis&#8217; Set data type in a recent feature I implemented for <a href="http://www.weplay.com/">Weplay, our social youth sports site</a>.</p>
<h3>The End Result</h3>
<p><img src="http://www.lukemelia.com/images/blog/presence-screengrab.png" class="standalone" /></p>
<p>Weplay members were told us they wanted to be able to see which of their friends were online, so we decided to add the feature. Let&#8217;s look at how Redis was instrumental in this functionality.</p>
<h3>Properties of a Set</h3>
<p>First a quick overview of Redis&#8217;s &#8220;set&#8221; data structure. A set in Redis has the same properties as the <a href="http://en.wikipedia.org/wiki/Set_%28computer_science%29">abstract data structure of the same name</a>:</p>
<p>* 0 to N elements<br />
* Unordered<br />
* No repeated members</p>
<p>In practice, this is nice because adding a value to a set does not require you to check if the value exists in the set first.</p>
<h3>Redis Set Operations</h3>
<p>You can see <a href="http://code.google.com/p/redis/wiki/Sets">a full list of the set operations Redis supports</a>. here are the ones were going to use: </p>
<p><script src="http://gist.github.com/279256.js?file=redis-examples.rb"></script></p>
<h3>The Approach</h3>
<p>The idea is to have one active set per minute. During each request that comes in from a logged-in user, we&#8217;ll add a user ID to the active set. When we want to know which user IDs are online, we can union the last 5 sets to get a collection of user IDs who have made a request in the last 5 minutes.</p>
<p><img src="http://www.lukemelia.com/images/blog/presence-online-users-diagram.png"  class="standalone" /></p>
<p>Now, if we have a set of the user&#8217;s friend&#8217;s IDs, we can intersect that with the online users and we&#8217;ve got our online friend IDs.</p>
<p><img src="http://www.lukemelia.com/images/blog/presence-online-friends-diagram.png"  class="standalone" /></p>
<h3>The Code</h3>
<p>Here&#8217;s the relevant code. (Note: we&#8217;re using the <a href="http://github.com/ezmobius/redis-rb">redis-rb</a> gem, by Ezra Zygmuntowicz (aka <a href="http://www.twitter.com/ezmobius">@ezmobius</a>), as our Redis client.)</p>
<p><script src="http://gist.github.com/279256.js?file=tracking-an-active-user.rb"></script></p>
<p>I love that the code is almost as succinct as the diagrams.</p>
<p>With this approach, you need to empty or delete the older sets before the next hour comes around. We use a cron job for that purpose. I&#8217;m not going to show that here, but feel free to get in touch if you have any questions about it.</p>
<p>Hope this gives you some ideas of the Redis&#8217; elegant simplicity and power. This code simpler than it would be if we had used an RDBMS or memcached, or both.</p>
<p>If you&#8217;re new to Redis, I&#8217;d recommend following it&#8217;s creator and maintainer, Salvatore Sanfilippo (<a href="http://www.twitter.com/antirez">@antirez</a>). He&#8217;s a very thoughtful and transparent open source leader and is rapidly and continually improving Redis.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukemelia.com/blog/archives/2010/01/17/redis-in-practice-whos-online/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Running REE at EngineYard</title>
		<link>http://www.lukemelia.com/blog/archives/2009/10/08/running-ree-at-engineyard/</link>
		<comments>http://www.lukemelia.com/blog/archives/2009/10/08/running-ree-at-engineyard/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 05:32:13 +0000</pubDate>
		<dc:creator>lukemelia</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.lukemelia.com/blog/archives/2009/10/08/running-ree-at-engineyard/</guid>
		<description><![CDATA[At Weplay, we recently switched our Ruby interpreter from MRI 1.8.6 to REE 1.8.6, and have seen dramatically improved response times (reduced by ~40%). As of now (October, 2009), EngineYard doesn&#8217;t support Ruby Enterprise Edition, so we had to go it alone. This blog post documents our configuration. We run in EngineYard&#8217;s cluster environment with [...]]]></description>
			<content:encoded><![CDATA[<p>At <a href="http://www.weplay.com">Weplay</a>, we recently switched our Ruby interpreter from MRI 1.8.6 to REE 1.8.6, and have seen dramatically improved response times (reduced by ~40%).</p>
<p>As of now (October, 2009), EngineYard doesn&#8217;t support Ruby Enterprise Edition, so we had to go it alone. This blog post documents our configuration.</p>
<p>We run in EngineYard&#8217;s cluster environment with nginx -> HAProxy -> mongrel load-balanced across a few app server slices with a utility slice running delayed_job workers. Our ruby processes are managed by monit.</p>
<p>Here&#8217;s how we went about things:</p>
<h3>Install REE</h3>
<p>I installed REE at <code>/opt/ruby-enterprise-1.8.6-20090610</code>. One of my goals was a side-by-side installation with MRI so that I could switch back quickly if something went wrong. (As it&#8217;s turned out, REE has been rock-solid for us.)</p>
<p><script src="http://gist.github.com/204775.js"></script></p>
<p>Note the &#8211;auto flag which provides for a non-interactive installation.</p>
<h3>Update mongrel_rails script</h3>
<p>Our EngineYard slices have MRI installed at <code>/usr/bin/ruby18</code> with a symlink at <code>/usr/bin/ruby</code>. The shebang line in <code>/usr/bin/mongrel_rails</code> was:</p>
<p><code>#!/usr/bin/ruby18</code></p>
<p>Change it to:</p>
<p><code>#!/usr/bin/ruby</code></p>
<p>This may not be absolutely necessary based on how your environment starts mongrel, but I&#8217;d<br />
recommend doing it anyway.</p>
<h3>Prepare a script to update symlinks</h3>
<p>So now you&#8217;ll have the following setup:</p>
<p><code>/opt/ruby-enterprise-1.8.6-20090610/bin/ruby</code></p>
<p><code>/usr/bin/ruby18</code></p>
<p><code>/usr/bin/ruby -> ruby18</code></p>
<p>To switch to REE, we&#8217;re going to switch that symlink to point at the REE ruby binary. You&#8217;ll also want to do the same for other binaries like rake, gem, etc. Here&#8217;s a script, eyruby_switch.rb, I wrote to switch them all at once:</p>
<p><script src="http://gist.github.com/204776.js"></script></p>
<p>You will call the script like this: <code>./eyruby_switch.rb ree</code> or <code>./eyruby_switch.rb mri</code>. Don&#8217;t execute it just yet.</p>
<h3>Re-install gems</h3>
<p>Before the switch, I wanted to get all our non-vendored gems installed in REE. The REE install has its own gems directory, and you can&#8217;t share gems with native extensions between REE and MRI anyway, so you need to reinstall. Here&#8217;s an example of installing a gem for REE without needing to have the symlinks pointed to REE:</p>
<p><code>sudo /opt/ruby-enterprise-1.8.6-20090610/bin/ruby /opt/ruby-enterprise-1.8.6-20090610/bin/gem install --no-rdoc --no-ri nokogiri</code></p>
<h3>Setup GC-tuning wrapper script</h3>
<p>For us, the big performance win for REE was the tuneable GC parameters. I&#8217;m not going to try to explain the params here. If you made it this far, you&#8217;ve probably already ready Evan Weaver&#8217;s blog posts on this topic.</p>
<p>Our goal was to apply the GC params to all rails processes, but not necessarily to every ruby process running on the system. So we created a wrapper script called <code>ruby_with_env</code>:</p>
<p><script src="http://gist.github.com/204778.js"></script></p>
<p>Put it somewhere on your system (ours is at <code>/data/weplay/shared/bin/ruby_with_env</code>) and make sure it&#8217;s executable.</p>
<h3>Update monit scripts</h3>
<p>Examine all the scripts specified by the .monitrc files in <code>/etc/monit.d/</code>. In any script that starts a rails process, replace the call to <code>/usr/bin/ruby</code> with the ruby_with_env wrapper script. This is safe to do even if MRI is still the active ruby on the system, because the environment variables will simply have no effect with MRI &#8212; everything else should run properly.</p>
<h3>Flip the switch, hero</h3>
<p>Update the symlinks:</p>
<p><code>./eyruby_switch.rb ree</code></p>
<p>Verify the script worked with <code>ruby -v</code></p>
<p>Then tell monit to restart your processes and your app is now running on REE.</p>
<h3>Feedback</h3>
<p>I would love to see EngineYard support REE so I can use their otherwise excellent team to do setup and maintain this stuff for me. Until then, maybe we can help each other out. If you have questions or ideas to improve this configuration, let me know in the comments or on <a href="http://www.twitter.com/lukemelia">twitter</a>.</p>
<h3>One more thing</h3>
<p>If you&#8217;re in the early stages of exploring REE and you just want to try it out locally, I highly recommend Wayne Seguin&#8217;s awesome <a href="http://rvm.beginrescueend.com/">rvm &#8211; Ruby Version Manager</a>. It makes it easy to install REE and switch back in forth in a development environment.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukemelia.com/blog/archives/2009/10/08/running-ree-at-engineyard/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>GoRuCo Notes</title>
		<link>http://www.lukemelia.com/blog/archives/2009/05/31/goruco-notes/</link>
		<comments>http://www.lukemelia.com/blog/archives/2009/05/31/goruco-notes/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 04:30:14 +0000</pubDate>
		<dc:creator>lukemelia</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.lukemelia.com/blog/archives/2009/05/31/goruco-notes/</guid>
		<description><![CDATA[I thoroughly enjoyed Gotham Ruby Conference (GoRuCo) this past Saturday. Excellent mix of talks, smooth flow of the day, and a intelligent, friendly crowd. Congrats to the organizers for pulling off a great conference a third year running! One thing I&#8217;ve learned about myself is that I get more out of a conference if I [...]]]></description>
			<content:encoded><![CDATA[<p>I thoroughly enjoyed <a href="http://www.goruco.com/">Gotham Ruby Conference</a> (GoRuCo) this past Saturday. Excellent mix of talks, smooth flow of the day, and a intelligent, friendly crowd. Congrats to the organizers for pulling off a great conference a third year running!</p>
<p>One thing I&#8217;ve learned about myself is that I get more out of a conference if I a) am well rested, and b) take notes. With 7.5 hours of sleep on Friday night (a lot for me), I fired up TextMate during the opening talk and started the note-taking. I made an offhand comment in the #nyc.rb IRC room that collaborative note taking would be cool. Ari Brown suggested EtherPad, which turned out to be a great tool for the job.</p>
<p><a href="http://etherpad.com/">EtherPad</a> is pretty impressive. It allows multiple authors to simultaneously edit a document. You can see your own and other people&#8217;s edits and contributions highlighted in a color associated with each contributor. It supports simple-formatting, a little chat window, saved revisions, and nice import/export options. And it does this all in a web browser without plugins, logins, or any friction whatsoever. Big props to the development team behind that thing.</p>
<p>The primary note takers were Ari and me, but one particularly cool moment in the collaborative experience was when Gregory Brown, the lead-off speaker, came on and did a light edit of the notes from his own talk.</p>
<p>Link: <a href="http://etherpad.com/viroryOwjX">Notes from GoRuCo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukemelia.com/blog/archives/2009/05/31/goruco-notes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5 Tips for porting javascript from Prototype to jQuery</title>
		<link>http://www.lukemelia.com/blog/archives/2008/05/18/5-tips-for-porting-javascript-from-prototype-to-jquery/</link>
		<comments>http://www.lukemelia.com/blog/archives/2008/05/18/5-tips-for-porting-javascript-from-prototype-to-jquery/#comments</comments>
		<pubDate>Mon, 19 May 2008 03:04:45 +0000</pubDate>
		<dc:creator>lukemelia</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.lukemelia.com/blog/archives/2008/05/18/5-tips-for-porting-javascript-from-prototype-to-jquery/</guid>
		<description><![CDATA[I&#8217;ve been really enjoying working with jQuery and the pattern of progressive enhancement. But I haven&#8217;t been enjoying supporting both Prototype/script.aculo.us and jQuery on in the same web app. It felt downright wrong to make my visitors download all that javascript. So, this weekend, I set out to eliminate the last of the public-facing prototype-dependent [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been really enjoying working with <a href="http://jquery.com/">jQuery</a> and the pattern of <a href="http://en.wikipedia.org/wiki/Progressive_Enhancement">progressive enhancement</a>.</p>
<p>But I haven&#8217;t been enjoying supporting both <a href="http://www.prototypejs.org/">Prototype</a>/<a href="http://script.aculo.us/">script.aculo.us</a> and jQuery on in the same web app. It felt downright wrong to make my visitors download all that javascript.</p>
<p>So, this weekend, I set out to eliminate the last of the public-facing prototype-dependent code from <a href="http://www.weplay.com/">weplay</a> and gained some peace of mind along with a 50% reduction in javascript bytes required for the fattest page.</p>
<p>Here are a few tips based on my experience so far:</p>
<ol id="tips">
<li><strong>Grab your inheritance.</strong> For porting components that rely on Prototype&#8217;s <a href="http://www.prototypejs.org/api/class/create">Class.create</a> mechanism, the most straightforward path is to leverage a jQuery-native implementation of the same concept. I used <a href="http://github.com/danwrong/low-pro-for-jquery/tree/master/src/lowpro.jquery.js">Dan Webb&#8217;s $.klass code from his jQuery version of LowPro</a>. I also came across the <a href="http://code.google.com/p/jquery-klass/">jquery-klass project</a>, which looks like it would do the job.
<p>It feels a little dirty to bring Prototype&#8217;s inheritance-based OO approach into jQuery &#8212; the jQuery philosophy is more about embracing the prototype-based OO baked into the language. As part of a porting effort, though, I think this approach makes sense, at least for a step.
</li>
<li><strong>Firebug is your friend.</strong> After I addressed the Class.create challenge, my approach was basically to repeatedly load the page in the Firefox and fix the first error that Firebug reported. By the time I worked through them all, dealing with a few remaining IE-specific issues was not too bad.
</li>
<li><strong>Enjoy watching the code shrink.</strong> Here&#8217;s a bit of code before and after the port&#8230;
<p>Before:</p>
<pre><code>this._arrow = document.createElement('img');
this._arrow.border = 0;
this._arrow.className = 'color_picker_arrow';
this._arrow.src = this.settings.arrowImage;
this._arrow.margin = 0;
this._arrow.padding = 0;
this._arrow.style.position = 'absolute';
this._arrow.style.top = '0px';
this._arrow.style.left = '0px';
this._arrow.style.zIndex = 10000;
document.body.appendChild(this._arrow);
</code></pre>
<p>After:</p>
<pre><code>this._arrow = jQuery(document.createElement('img'))
.attr({border: 0, src: this.settings.arrowImage})
.addClass('color_picker_arrow')
.css({margin:0, padding:0, position:'absolute', top:0, left:0, zIndex:10000})
.appendTo(document.body);
</code></pre>
</li>
<li><strong>Grok the jQuery event model.</strong> jQuery has excellent support for working with events, but it is different from Prototype&#8217;s. In particular, Prototype&#8217;s <a href="http://www.prototypejs.org/api/function/bindAsEventListener">bindAsEventListener</a> method, which changes what this refers to in your event handler, is nowhere to be found. Figure out how to use closure to attain the same thing and revel in jQuery&#8217;s simpler approach to &#8220;this&#8221;.
</li>
<li><strong>Consider jRails.</strong> If you&#8217;re working in Rails and using the link_to_remote methods, consider <a href="http://ennerchi.com/projects/jrails">jRails</a> as a stop-gap measure to help you show Prototype the door. I say &#8220;stop-gap&#8221; because link_to_remote does not produce unobtrusive javascript and does not tend to support real progressive enhancement.
</li>
<li><em>Bonus Tip:</em> <strong>Learn to write jQuery plugins.</strong> While not strictly required by my porting efforts, I wrote a few plugins along the way to help out. Writing a plugin sounds like it could be a big deal, but <a href="http://docs.jquery.com/Plugins/Authoring">writing a jQuery plugin</a> is very straightforward, and it&#8217;s an addictive way to package up functionality as well as get more comfortable with the jQuery philosophy.
</li>
</ol>
<p>Good luck, and share your porting stories!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukemelia.com/blog/archives/2008/05/18/5-tips-for-porting-javascript-from-prototype-to-jquery/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>GoRuCo 2008</title>
		<link>http://www.lukemelia.com/blog/archives/2008/04/27/my-badge-from-gotham-ruby-conference-2008/</link>
		<comments>http://www.lukemelia.com/blog/archives/2008/04/27/my-badge-from-gotham-ruby-conference-2008/#comments</comments>
		<pubDate>Sun, 27 Apr 2008 17:28:23 +0000</pubDate>
		<dc:creator>lukemelia</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.lukemelia.com/blog/archives/2008/04/27/my-badge-from-gotham-ruby-conference-2008/</guid>
		<description><![CDATA[Gotham Ruby Conference was yesterday at Pace University. It was a great day &#8211; kudos to the organizers. If you missed it, check out the video from Confreaks when it is posted. UPDATE: A few more conference pics, courtesy of Sebastian, including some of the afterparty/hackfest, where Jeanhee &#038; Chiara came out to meet the [...]]]></description>
			<content:encoded><![CDATA[<p>Gotham Ruby Conference was yesterday at Pace University. It was a great day &#8211; kudos to the organizers. If you missed it, check out the video from Confreaks when it is posted.</p>
<p><a href="http://www.flickr.com/photos/melia/2445593493/" title="photo sharing"><img src="http://farm3.static.flickr.com/2254/2445593493_cedce3c7c5.jpg" alt="My badge from Gotham Ruby Conference 2008" class="standalone" /></a></p>
<p>UPDATE: <a href="http://www.flickr.com/search/?q=lukemelia+goruco2008&#038;m=tags">A few more conference pics</a>, courtesy of Sebastian, including some of the afterparty/hackfest, where Jeanhee &#038; Chiara came out to meet the ruby geeks!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukemelia.com/blog/archives/2008/04/27/my-badge-from-gotham-ruby-conference-2008/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Finding code to hurt</title>
		<link>http://www.lukemelia.com/blog/archives/2008/04/26/finding-code-to-hurt/</link>
		<comments>http://www.lukemelia.com/blog/archives/2008/04/26/finding-code-to-hurt/#comments</comments>
		<pubDate>Sat, 26 Apr 2008 21:32:09 +0000</pubDate>
		<dc:creator>lukemelia</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.lukemelia.com/blog/archives/2008/04/26/finding-code-to-hurt/</guid>
		<description><![CDATA[After listening to Ryan Davis&#8217; inspiring talk, &#8220;Hurting Code for Fun &#038; Profit&#8221; at GoRuCo today, I wrote this rake task to figure out what code to hurt. It looks though your git log, and takes the 15 .rb files in your Rails&#8217; app/ directory and runs them through flog, so you can see which [...]]]></description>
			<content:encoded><![CDATA[<p>After listening to Ryan Davis&#8217; inspiring talk, &#8220;Hurting Code for Fun &#038; Profit&#8221; at <a href="http://2008.goruco.com/">GoRuCo</a> today, I wrote this rake task to figure out what code to hurt. It looks though your git log, and takes the 15 .rb files in your Rails&#8217; app/ directory and runs them through flog, so you can see which are the most complicated.</p>
<p><script src="https://gist.github.com/790441.js"> </script></p>
<p><a href="https://gist.github.com/raw/790441/53d3635f4c27fdf22c12333ad7e30aa1bb58e0b4/gistfile1.rb">Install it with sake from here.</a></p>
<p>UPDATE: If you&#8217;re interested in watching Ryan&#8217;s stellar talk, it will be up on Confreaks soon, or you can try <a href="http://rubyconf2007.confreaks.com/d1t2p3_hurting_code.html">the RubyConf edition of the talk</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukemelia.com/blog/archives/2008/04/26/finding-code-to-hurt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>the not-so-interesting life of my terminal</title>
		<link>http://www.lukemelia.com/blog/archives/2008/04/22/the-not-so-interesting-life-of-my-terminal/</link>
		<comments>http://www.lukemelia.com/blog/archives/2008/04/22/the-not-so-interesting-life-of-my-terminal/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 04:36:28 +0000</pubDate>
		<dc:creator>lukemelia</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.lukemelia.com/blog/archives/2008/04/22/the-not-so-interesting-life-of-my-terminal/</guid>
		<description><![CDATA[lmelia$ history 1000 &#124; awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' &#124; sort -rn &#124; head 184 git 122 script/story 64 rake 26 sudo 12 dig 11 cap 9 script/rstakeout 9 sc 8 ./script/story 5 history]]></description>
			<content:encoded><![CDATA[<pre>lmelia$ history 1000 | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
184 git
122 script/story
64 rake
26 sudo
12 dig
11 cap
9 script/rstakeout
9 sc
8 ./script/story
5 history</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lukemelia.com/blog/archives/2008/04/22/the-not-so-interesting-life-of-my-terminal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tracks 1.5 is out</title>
		<link>http://www.lukemelia.com/blog/archives/2008/03/27/tracks-15-is-out/</link>
		<comments>http://www.lukemelia.com/blog/archives/2008/03/27/tracks-15-is-out/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 23:16:42 +0000</pubDate>
		<dc:creator>lukemelia</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.lukemelia.com/blog/archives/2008/03/27/tracks-15-is-out/</guid>
		<description><![CDATA[We released Tracks 1.5 today. Tracks is the open source Rails app for implementing the Getting Things Done system. I contributed heavily to this app in the too-long time since the last stable release. Big kudos and thanks go to Reinier Balt in the Netherlands, who contributed some great statistical visualizations and generally ran the [...]]]></description>
			<content:encoded><![CDATA[<p>We released <a href="http://www.rousette.org.uk/projects/">Tracks 1.5</a> today. Tracks is the open source Rails app for implementing the Getting Things Done system. I contributed heavily to this app in the too-long time since the last stable release. Big kudos and thanks go to <a href="http://www.balt.nu/lrbalt/">Reinier Balt</a> in the Netherlands, who contributed some great statistical visualizations and generally ran the project the past few months while bsag and I have been busy with out professional commitments.</p>
<p>Anyway, lots of great changes since 1.043. Check it out and let us know what you think.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukemelia.com/blog/archives/2008/03/27/tracks-15-is-out/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head profile="http://gmpg.org/xfn/1">
	<title>404 - Page Not Found - LukeMelia.com</title>
	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	<meta name="description" content="The personal website of Luke Melia, a vegetarian software developer from New York City who attempts to live every day with passion." />
	<meta name="keywords" content="Luke Melia, Lucas Melia, Melia, North Shore High School, University of Virginia, UVA, Upline, Oxygen, web developer, volleyball, journal, travel, vegetarian, India, weblog, passion" />
	<link rel="stylesheet" type="text/css" href="/css/luke.css" media="screen" />
	<link rel="stylesheet" type="text/css" href="/css/sifr-screen.css" media="screen" />
	<link rel="stylesheet" type="text/css" href="/css/sifr-print.css" media="print" />
	<script type="text/javascript">
		// Specify the image files
		var pics = new Array(
		'/images/index_random/luke-graphic-pen.jpg',
'/images/index_random/chiara-hambok.jpg',
'/images/index_random/chiara-first-steps.jpg'		);
	</script>

	<script type="text/javascript" src="/javascript/slideshow.js"></script>
	<script type="text/javascript" src="/javascript/sIFR2/sifr.js"></script>
</head>

<body onload="startSlideShow(pics,false)">


<div id="inner">
<div id="rap">

<h1><span>not found</span></h1>

<div id="content">


      <h2>Error</h2>

      <p>Sorry, the page you're looking for:</p>

      <p><a href="/blog/archives/category/software-development/feed/">/blog/archives/category/software-development/feed/</a></p>
      
      <p>cannot be found. That's what we call a four hundred n' four error.</p>

<div id="menu">

<ul>
	<li id="siteNav">
		<ul>
			<li><a href="/">home / personal blog</a></li>
			<li><a href="/personal/">personal philosophy</a></li>
			<li><a href="/gallery2/">photos</a></li>
			<li><a href="/travel/">world travel</a></li>
			<li><a href="/contact/">get in touch</a></li>
			<li><a href="/resume/">r&eacute;sum&eacute;</a></li>
			<li><a href="/webdesign/">web development</a></li>
			<li><a href="/devblog/">software development blog</a></li>
		</ul>
	</li>
	<li id="slideShow">
		<div id="slideShowImageDiv"><a href="/gallery2/" title="a semi-random photo | click for the full photo gallery" ><img src="/images/index_random/luke-graphic-pen.jpg" name="SlideShow" alt="a semi-random photo | click for the full photo gallery" width="180" height="239" border="0" /></a></div>
	</li>
	 <li id="search">
   <!-- <label for="searchField">Search</label> -->
	<form id="searchform" method="get" action="http://search.atomz.com/search/">
	<div>
		<input size="15" id="searchField" name="sp-q" />
		<input type="submit" id="searchBtn" name="submit" value="Search" />
		<input type="hidden" name="sp-a" value="sp1001711a" />
	</div>
	</form>
 </li>
   <li id="linkcat-7" class="linkcat"><h2>Friends &amp; Colleagues</h2>
	<ul>
<li><a href="http://www.brynary.com" rel="friend met colleague">Bryan Helmkamp</a></li>
<li><a href="http://turnings.phrasewise.com/" rel="friend met colleague">Daniel Berlinger</a></li>
<li><a href="http://fhwang.net/blog" rel="friend met colleague">Francis Hwang</a></li>
<li><a href="http://www.jeanhee.com/" rel="met co-resident spouse sweetheart" title="my love">Jeanhee</a></li>
<li><a href="http://newyorkcto.blogspot.com/" rel="friend met colleague">Jon Williams</a></li>
<li><a href="http://joshknowles.com/" rel="friend met colleague">Josh Knowles</a></li>
<li><a href="http://www.judykat.com/ken/" rel="friend met colleague">Ken Judy</a></li>
<li><a href="http:///www.krisselden.com/" rel="friend met colleague">Kris Selden</a></li>
<li><a href="http://www.leebankewitz.com" rel="friend met co-worker colleague">Lee Bankewitz</a></li>
<li><a href="http://www.robertzurer.com/" rel="friend met colleague">Robert Zurer</a></li>
<li><a href="http://morgansblog.com/blog/" rel="friend met colleague">Steve Morgan</a></li>
<li><a href="http://trevorsumner.blogspot.com/" rel="friend co-worker">Trevor Sumner</a></li>
<li><a href="http://wundasworld.blogspot.com" rel="friend met colleague">Wendy Friedlander</a></li>

	</ul>
</li>
  <li id="linkcat-4" class="linkcat"><h2>Quoted</h2>
	<ul>
<li><a href="http://www.quotationspage.com/quotes/Anais_Nin" title="Anais Nin">&#8220;Life shrinks or expands in proportion to one&#8217;s courage.&#8221;</a></li>

	</ul>
</li>
 <li id="meta">Meta:	 	<ul>
		<li><a href="http://www.lukemelia.com/feed/" title="Syndicate this site using RSS"><abbr title="Really Simple
Syndication">RSS</abbr> 2.0</a></li>
		<li><a href="http://www.lukemelia.com/comments/feed/" title="The latest comments to all posts in RSS">Comments <abbr title="Really Simple Syndication">RSS</abbr> 2.0</a></li>
		<li><a href="http://validator.w3.org/check/referer" title="This page validates as XHTML 1.0 Transitional">Valid <abbr title="eXtensible HyperText Markup Language">XHTML</abbr></a></li>
		<li><a href="http://jigsaw.w3.org/css-validator/check/referer" title="This page validates as CSS">Valid <abbr title="Cascading Style Sheets">CSS</abbr></a></li>
		<li><a href="http://wordpress.org/" title="Powered by WordPress; state-of-the-art semantic personal publishing platform.">WordPress</a></li>
		<li><a href="http://www.apple.com/" title="This site was made on a Macintosh">Mac</a></li>
		<li><a href="http://www.php.net/" title="This site is powered by PHP">PHP</a></li>
		<li><a href="http://promote.pair.com/click.pl" title="This site is hosted by pair.com">pair.com</a><br /> </li>
		<li><a href="http://www.technorati.com/profile/lukemelia" title="Technorati Profile">Technorati</a></li>
		<li><a href="https://www.fsf.org/" title="Proud member of the Free Software Foundation">FSF</a></li>
    <li>Lost? This is the personal website of Luke Melia.</li>
		<li>
<!-- Creative Commons License -->
<a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/" title="This work is licensed under a Creative Commons License">Creative Commons License</a>
<!-- /Creative Commons License -->
<!--
<rdf:RDF xmlns="http://web.resource.org/cc/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<Work rdf:about="">
   <dc:creator><Agent>
      <dc:title>Luke Melia</dc:title>
   </Agent></dc:creator>
   <dc:type rdf:resource="http://purl.org/dc/dcmitype/Text" />
   <license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/2.0/" />
</Work>

<License rdf:about="http://creativecommons.org/licenses/by-nc-nd/2.0/">
   <permits rdf:resource="http://web.resource.org/cc/Reproduction" />
   <permits rdf:resource="http://web.resource.org/cc/Distribution" />
   <requires rdf:resource="http://web.resource.org/cc/Notice" />
   <requires rdf:resource="http://web.resource.org/cc/Attribution" />
   <prohibits rdf:resource="http://web.resource.org/cc/CommercialUse" />
</License>
</rdf:RDF>
-->
		</li>
		<li><a href="/about/" title="How this site works">How it works</a></li>
		<li>My photos are on <a href="http://flickr.com/photos/melia/" rel="me" title="My photos on Flickr">Flickr</a></li>
		<li>Follow me on <a href="http://twitter.com/lukemelia" rel="me" title="Follow me on Twitter">Twitter</a></li>
		<li>I am <a href="http://www.linkedin.com/in/lukemelia" rel="me" title="My professional profile on Linked In">LinkedIn</a></li>
	</ul>
 </li>
</ul>

</div>

</div>
</div>
<p class="credit" style="display:none"><!--19 queries. 0.326 seconds. --> <cite>Powered by <a href='http://wordpress.org' title='Powered by WordPress, state-of-the-art semantic personal publishing platform'><strong>WordPress</strong></a></cite></p>

  <div id="footerDiv">
		LukeMelia.com created 1999.  
        &middot;&middot;&middot;
		Luke Melia created 1976.
        &middot;&middot;&middot;
        <em>Live With Passion!</em>
    </div>

</div>

<script type="text/javascript">
//<![CDATA[

	
if(sIFR != null && sIFR.replaceElement != null){
	sIFR.replaceElement("#inner h1 span", "/javascript/sIFR2/violation.swf", named({sColor : "#ffffff", sBgColor: "#000000", sWmode : "transparent"}))
	sIFR.replaceElement(".person", "/javascript/sIFR2/pooler.swf", "#000000", "#000000", "#0000FF", null, 0, 0, 0, 0, "offsetTop=8");
};

//]]>
</script>
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-722932-1";
urchinTracker();
</script>
</body>
</html>

