<?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>Matthew Bass &#187; Programming</title>
	<atom:link href="http://matthewbass.com/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://matthewbass.com</link>
	<description>Musings on software and life...</description>
	<lastBuildDate>Tue, 23 Nov 2010 15:46:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Learn about A/B testing at raleigh.rb</title>
		<link>http://matthewbass.com/2010/08/17/learn-about-ab-testing-at-raleigh-rb/</link>
		<comments>http://matthewbass.com/2010/08/17/learn-about-ab-testing-at-raleigh-rb/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 14:59:28 +0000</pubDate>
		<dc:creator>Matthew Bass</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://matthewbass.com/?p=643</guid>
		<description><![CDATA[I&#8217;ll be presenting on A/B testing at tonight&#8217;s raleigh.rb meetup. As developers, we use tools like RSpec and Cucumber to verify that our application is functional, but how can we verify that the layout of our home page is user-friendly? How can we determine the ideal size for our signup button? How can we maximize [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll be <a href="http://www.meetup.com/raleighrb/calendar/13257536/">presenting on A/B testing</a> at tonight&#8217;s raleigh.rb meetup. As developers, we use tools like RSpec and Cucumber to verify that our application is functional, but how can we verify that the layout of our home page is user-friendly? How can we determine the ideal size for our signup button? How can we maximize throughput to our signup form? A/B testing is an easy and compelling way to increase the effectiveness of our web applications. <a href="http://www.meetup.com/raleighrb/calendar/13257536/">Join us tonight</a> to learn how to leverage A/B testing in Ruby using several popular tools.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthewbass.com/2010/08/17/learn-about-ab-testing-at-raleigh-rb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amending git commits</title>
		<link>http://matthewbass.com/2010/07/10/amending-git-commits/</link>
		<comments>http://matthewbass.com/2010/07/10/amending-git-commits/#comments</comments>
		<pubDate>Sat, 10 Jul 2010 20:37:14 +0000</pubDate>
		<dc:creator>Matthew Bass</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://matthewbass.com/?p=617</guid>
		<description><![CDATA[Git is a wonderful SCM with some very powerful features. But as a programmer, it&#8217;s very easy to aquire a rudimentary working knowledge of Git and never learn anything more. For example, how would we fix our repository if we committed the wrong piece of code? What if our commit had an error in it? [...]]]></description>
			<content:encoded><![CDATA[<p>Git is a wonderful SCM with some very powerful features. But as a programmer, it&#8217;s very easy to aquire a rudimentary working knowledge of Git and never learn anything more. For example, how would we fix our repository if we committed the wrong piece of code? What if our commit had an error in it? How do we fix things without reverting or introducing a second commit?</p>
<p>It turns out this is very easy to do. The latest versions of Git have an <code>amend</code> command. Amend lets us alter the last commit we made. All that&#8217;s necessary is for us to arrange our working directory the way we want the last commit to look and then execute:</p>
<pre class="brush: bash;">
git commit --amend
</pre>
<p>This will update the most recent commit based on the state of our working directory. For example, say we changed our README file in the last commit and accidentally introduced a typo. To fix the last commit, we would edit the README again, <code>git add</code> the change, and instead of running <code>git commit</code> which would create a second commit, we run <code>git commit --amend</code> which patches the last commit. This can be repeated as many times as necessary.</p>
<p>Note that rewriting history like this can have serious implications if you&#8217;ve already published the most recent commit. But if you&#8217;re the only developer using the repository, or if you haven&#8217;t published yet, this can be a great way to fix minor mistakes without introducing an entirely new commit.</p>
<p>You can read more about <code>amend</code> in the <a href="http://www.kernel.org/pub/software/scm/git/docs/git-commit.html">documentation</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthewbass.com/2010/07/10/amending-git-commits/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Drop seconds when querying MySQL timestamps</title>
		<link>http://matthewbass.com/2010/06/25/drop-seconds-when-querying-mysql-timestamps/</link>
		<comments>http://matthewbass.com/2010/06/25/drop-seconds-when-querying-mysql-timestamps/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 20:35:36 +0000</pubDate>
		<dc:creator>Matthew Bass</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://matthewbass.com/?p=600</guid>
		<description><![CDATA[One of the Rails apps I&#8217;ve been working on formats times as HH:MM in the view. No seconds are displayed. This is a pretty common way to format things. When doing timestamp comparisons in SQL, however, the seconds are taken into account. This is bad since it can cause discrepancies in the view.
For example, say [...]]]></description>
			<content:encoded><![CDATA[<p>One of the Rails apps I&#8217;ve been working on formats times as HH:MM in the view. No seconds are displayed. This is a pretty common way to format things. When doing timestamp comparisons in SQL, however, the seconds <em>are</em> taken into account. This is bad since it can cause discrepancies in the view.</p>
<p>For example, say I have a table of records with created_at timestamps. My view displays all records with timestamps equal to or before the current time. Let&#8217;s assume the current time is 15:00:00 precisely and I happen to have a record with a timestamp of 15:00:00 in the database. The SQL comparison would work fine in this case.</p>
<pre class="brush: sql;">
SELECT * FROM records WHERE created_at &lt;= &quot;2010-06-25 15:00:00&quot;
=&gt; 1 row in set
</pre>
<p>What if the timestamp in the database is 15:00:03 though? Let&#8217;s run the query again.</p>
<pre class="brush: sql;">
SELECT * FROM records WHERE created_at &lt;= &quot;2010-06-25 15:00:00&quot;
=&gt; Empty set
</pre>
<p>Since 15:00:03 is <em>greater</em> than the current time of 15:00:00, the record doesn&#8217;t get returned. This would be fine if we were displaying seconds in the view, but we&#8217;re not. From the user&#8217;s perspective, the timestamp on the record is still 15:00 and <strong>should</strong> appear in the view since it&#8217;s equal to the current time. But it doesn&#8217;t.</p>
<p>One way to fix this would be to handle the time comparisons in Ruby. This is certainly a legitimate option. For this particular project, though, performance was a big issue. (And we all know that <a href="http://canrailsscale.com">Rails can&#8217;t scale</a>.) I needed a way to continue letting the database handle the comparisons while disregarding seconds.</p>
<p>The solution I ended up with isn&#8217;t ideal (it relies on a couple of functions built into MySQL) but it works fine and runs fast:</p>
<pre class="brush: sql;">
SELECT * FROM records WHERE (created_at - INTERVAL SECOND(created_at) SECOND) &lt;= &quot;2010-06-25 15:00:00&quot;
=&gt; 1 row in set
</pre>
<p>The number of seconds is extracted from the created_at timestamp and then subtracted from the timestamp. So if the timestamp was 15:00:03, MySQL subtracts 3 seconds to end up with 15:00:00.</p>
<p>This solved the comparison problem for me and made my client very happy. Double win.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthewbass.com/2010/06/25/drop-seconds-when-querying-mysql-timestamps/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Registration for BarCampRDU 2007 is open</title>
		<link>http://matthewbass.com/2007/07/05/registration-for-barcamprdu-2007-is-open/</link>
		<comments>http://matthewbass.com/2007/07/05/registration-for-barcamprdu-2007-is-open/#comments</comments>
		<pubDate>Thu, 05 Jul 2007 13:07:53 +0000</pubDate>
		<dc:creator>Matthew Bass</dc:creator>
				<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://matthewbass.com/2007/07/05/registration-for-barcamprdu-2007-is-open/</guid>
		<description><![CDATA[Registration for this year&#8217;s BarCampRDU is now open. This is an event I unfortunately had to miss last year due to a prior commitment. I&#8217;m really looking forward to attending this year. It&#8217;s shaping up to be a fantastic experience.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://barcamprdu.blogspot.com/2007/07/sign-up-for-barcamprdu-2007.html">Registration</a> for this year&#8217;s BarCampRDU is now open. This is an event I unfortunately had to miss last year due to a prior commitment. I&#8217;m really looking forward to attending this year. It&#8217;s shaping up to be a fantastic experience.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthewbass.com/2007/07/05/registration-for-barcamprdu-2007-is-open/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deploying PHP apps with Capistrano</title>
		<link>http://matthewbass.com/2007/06/23/deploying-php-apps-with-capistrano/</link>
		<comments>http://matthewbass.com/2007/06/23/deploying-php-apps-with-capistrano/#comments</comments>
		<pubDate>Sat, 23 Jun 2007 20:42:34 +0000</pubDate>
		<dc:creator>Matthew Bass</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://matthewbass.com/2007/06/23/deploying-php-apps-with-capistrano/</guid>
		<description><![CDATA[Capistrano is a wonderful tool. I have this really old PHP-based web site, TolkienMovies.com, that I needed to make a change to earlier today. (The spam bots had finally found my news submission form.) I decided this was as good a time as any to automate deployment of the app. This article was very helpful. [...]]]></description>
			<content:encoded><![CDATA[<p>Capistrano is a wonderful tool. I have this really old PHP-based web site, <a href="http://www.tolkien-movies.com">TolkienMovies.com</a>, that I needed to make a change to earlier today. (The spam bots had finally found my news submission form.) I decided this was as good a time as any to automate deployment of the app. <a href="http://www.simplisticcomplexity.com/2006/8/16/automated-php-deployment-with-capistrano">This article</a> was very helpful. Staring at a task like this can be daunting, but once I actually got in there and started hacking it wasn&#8217;t half as bad as I thought it would be. And now I have a warm, fuzzy feeling knowing that deployment of this stinkin&#8217; PHP app is only one &#8220;cap deploy&#8221; command away. Hallelujah.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthewbass.com/2007/06/23/deploying-php-apps-with-capistrano/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>First Agile RTP meeting tonight</title>
		<link>http://matthewbass.com/2007/03/22/first-agile-rtp-meeting-tonight/</link>
		<comments>http://matthewbass.com/2007/03/22/first-agile-rtp-meeting-tonight/#comments</comments>
		<pubDate>Thu, 22 Mar 2007 14:45:26 +0000</pubDate>
		<dc:creator>Matthew Bass</dc:creator>
				<category><![CDATA[Agility]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.matthewbass.com/blog/2007/03/22/first-agile-rtp-meeting-tonight/</guid>
		<description><![CDATA[This is just a reminder from your friendly neighborhood agilist that the new Agile RTP user group has its first meeting in Cary tonight. Read more about it on Jared&#8217;s blog. This sounds like a great opportunity to meet other agile-minded people in the area and listen to an interesting talk. Oh, and let&#8217;s not [...]]]></description>
			<content:encoded><![CDATA[<p>This is just a reminder from your friendly neighborhood agilist that the new Agile RTP user group has its first meeting in Cary tonight. <a href="http://www.jaredrichardson.net/blog/2007/03/22#artp_2">Read more about it</a> on Jared&#8217;s blog. This sounds like a great opportunity to meet other agile-minded people in the area and listen to an interesting talk. Oh, and let&#8217;s not forget the bragging rights secured by those who participate in the first meeting of a new user group.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthewbass.com/2007/03/22/first-agile-rtp-meeting-tonight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile RTP: A new user group in Raleigh</title>
		<link>http://matthewbass.com/2007/03/07/agile-rtp-a-new-user-group-in-raleigh/</link>
		<comments>http://matthewbass.com/2007/03/07/agile-rtp-a-new-user-group-in-raleigh/#comments</comments>
		<pubDate>Thu, 08 Mar 2007 02:34:08 +0000</pubDate>
		<dc:creator>Matthew Bass</dc:creator>
				<category><![CDATA[Agility]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.matthewbass.com/blog/2007/03/07/agile-rtp-a-new-user-group-in-raleigh/</guid>
		<description><![CDATA[Agile RTP is a new user group started in the Raleigh area by Jared Richardson. The first meeting will be on March 22nd where we&#8217;ll be video conferencing with the agile group in Charlotte to hear Dr. Laurie Williams speak about test-driven development. I was actually considering driving to Charlotte for this speech, so when [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://agileartisans.com/artp/">Agile RTP</a> is a new user group started in the Raleigh area by Jared Richardson. The first meeting will be on March 22nd where we&#8217;ll be video conferencing with the <a href="http://agile-carolinas.pbwiki.com/">agile group in Charlotte</a> to hear Dr. Laurie Williams speak about test-driven development. I was actually considering driving to Charlotte for this speech, so when Jared told me we&#8217;d be able to enjoy it right here in Raleigh I was totally psyched. <a href="http://www.jaredrichardson.net/blog/2007/03/07/#artp_1">Get more details</a> on the event and don&#8217;t forget to mark your calendar.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthewbass.com/2007/03/07/agile-rtp-a-new-user-group-in-raleigh/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mind blowing Ruby</title>
		<link>http://matthewbass.com/2007/02/03/mind-blowing-ruby/</link>
		<comments>http://matthewbass.com/2007/02/03/mind-blowing-ruby/#comments</comments>
		<pubDate>Sun, 04 Feb 2007 01:03:45 +0000</pubDate>
		<dc:creator>Matthew Bass</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.matthewbass.com/blog/2007/02/03/mind-blowing-ruby/</guid>
		<description><![CDATA[I&#8217;ve been writing Ruby code for over four years now. I&#8217;ve been getting paid to do so for about two years. Prior to that, the bacon I brought home came mainly through the careful crafting of lines of Java, PHP, and C# code. Matz spoiled the party for me in the mid-90s, however, by releasing [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://soapadoo.com/up"></a>I&#8217;ve been writing Ruby code for over four years now. I&#8217;ve been getting <em>paid</em> to do so for about two years. Prior to that, the bacon I brought home came mainly through the careful crafting of lines of Java, PHP, and C# code. Matz spoiled the party for me in the mid-90s, however, by releasing such a wonderfully beautiful language that it made Java tedious and uninteresting in comparison.</p>
<p>Ruby is a fantastic tool. But it&#8217;s not just a tool, it&#8217;s also an art medium. I had never truly seen beautiful code until I met Ruby. All that being said, when I was first introduced to the language it was a lot like trying to breathe while standing under Niagara Falls. The &#8220;wow-that&#8217;s-cool-but-I-don&#8217;t-quite-grok-it&#8221; moments came fast and furious. Ruby was blowing my mind on a daily basis.</p>
<p>It doesn&#8217;t anymore. At least, not every day. But at least once a month, I see a code snippet or read a blog post or hear about a new way to do something and&#8230; well, there goes my mind again. For example&#8230;</p>
<p><span id="more-138"></span></p>
<p><strong>Classes Are Constants</strong></p>
<p>The fact that classes are constants in Ruby doesn&#8217;t seem particularly remarkable on the surface, but when you need to do something like this it sure comes in handy:</p>
<pre>
class Widget
  def self.name
    "I'm a nice Widget class"
  end
end

class Doohickey
  def self.name
    "I'm an even nicer Doohickey class"
  end
end

class ObjectRenderer
  def self.render(klass)
    puts klass.name
  end
end

ObjectRenderer.render(Widget)        => I'm a nice Widget class
ObjectRenderer.render(Doohickey)     => I'm an even nicer Doohickey class
</pre>
<p>Once I grokked the usefulness of classes and constants being interchangeable, I began coming across lots of places in my code where I was able to refactor a complex bit of logic into a shorter, more simpler form. That&#8217;s one of the neat things about Ruby: once you learn a given Rubyism, it can be applied all over the place.</p>
<p><strong>Iterating Over Collections</strong></p>
<p>Let&#8217;s face it: iterating over a collection in Java, or even in C#, is bulky and painful. When I ran across Ruby&#8217;s beautiful <code>Enumerable</code> module, my mind was once again totally blown by the simplicity and elegance:</p>
<pre>
animals = ['dog', 'cat', 'bird']
animals.each { |a| print a + ' ' }       => dog cat bird
puts animals.select { |a| a =~ /do/ }    => dog
</pre>
<p>I&#8217;ve never been much of a fan of Perl. I&#8217;m guessing something similar can be done there. But for me, a young developer fresh out of college, the ability to iterate (not to mention define an array or a hash) in a single line of code was a big draw away from my world of statically typed languages. The readability of Ruby&#8217;s syntax is immensely gratifying.</p>
<p><strong>Ruby&#8217;s Vibrant Community</strong></p>
<p>Perhaps the most mind-blowing thing of all is the Ruby community itself. I have never come across a more intelligent, passionate, and close-knit group of developers as those who call Ruby their language of choice. The wild Rubyist used to be a rare breed, but we&#8217;re quickly becoming more common as Ruby&#8217;s fame continues to spread. Whether I&#8217;m meeting new folks at the local <a href="http://ruby.meetup.com/3/">Ruby Meetup</a>, doing some late night hacking in Chicago at <a href="/blog/2006/06/20/railsconf-ho/">RailsConf 2006</a>, or just chatting in Campfire with fellow <a href="http://terralien.com">Terraliens</a>, the openness and technical savvy of these people is stunning.</p>
<p>It&#8217;s truly a humbling experience to be part of this movement. And that&#8217;s really what it is: a movement aimed at refactoring the norms of software development. Ruby and the frameworks built with it continue to grow and evolve. The community, myself included, grows and evolves along with it.</p>
<p>Here&#8217;s hoping that Matz, DHH, and the other brilliant people behind these wonderful technologies continue blowing our minds with creative innovations for years to come.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthewbass.com/2007/02/03/mind-blowing-ruby/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The importance of code reviews</title>
		<link>http://matthewbass.com/2006/08/17/the-importance-of-code-reviews/</link>
		<comments>http://matthewbass.com/2006/08/17/the-importance-of-code-reviews/#comments</comments>
		<pubDate>Thu, 17 Aug 2006 21:35:09 +0000</pubDate>
		<dc:creator>Matthew Bass</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.matthewbass.com/blog/2006/08/17/the-importance-of-code-reviews/</guid>
		<description><![CDATA[Have you ever done a code review? Most developers haven&#8217;t. It doesn&#8217;t seem to be a regular practice in many parts of the software industry, yet by ignoring the importance of code reviews we miss out on the benefits that they can provide.
My friend and former co-worker Sri has written an article about code reviews [...]]]></description>
			<content:encoded><![CDATA[<p>Have you ever done a code review? Most developers haven&#8217;t. It doesn&#8217;t seem to be a regular practice in many parts of the software industry, yet by ignoring the importance of code reviews we miss out on the benefits that they can provide.</p>
<p>My friend and former co-worker Sri has written <a href="http://today.java.net/pub/a/today/2006/08/17/code-reviews.html">an article about code reviews</a> that was published on java.net today. Here&#8217;s a teaser:</p>
<blockquote><p><em>Need to be sure your program really runs right? Oh sure, testing&#8217;s a part of it, but so are code reviews. Sri Sankaran argues that research and experience prove that a standardized, effective code review process mitigates costs and produces better code.</em></p></blockquote>
<p>Coming from an agile development background, I&#8217;ve participated in several code reviews myself. Properly used they can be an effective way to ensure that the software being shipped is solid, and that the team is on the same page when it comes to standards and organization.</p>
<p><a href="http://today.java.net/pub/a/today/2006/08/17/code-reviews.html">Read the full article at java.net!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://matthewbass.com/2006/08/17/the-importance-of-code-reviews/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NFJS 2006 wrap-up</title>
		<link>http://matthewbass.com/2006/06/14/nfjs-2006-wrap-up/</link>
		<comments>http://matthewbass.com/2006/06/14/nfjs-2006-wrap-up/#comments</comments>
		<pubDate>Thu, 15 Jun 2006 00:17:34 +0000</pubDate>
		<dc:creator>Matthew Bass</dc:creator>
				<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.matthewbass.com/blog/2006/06/14/nfjs-2006-wrap-up/</guid>
		<description><![CDATA[It was with mixed sadness and relief that NFJS 2006 came to a close last Sunday evening. Two and a half solid days of listening to some of the best technical speakers in the country can be draining, but the knowledge and enthusiasm one picks up is priceless.
The highlights from day three were Andy Hunt&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>It was with mixed sadness and relief that <a href="http://www.nofluffjuststuff.com/">NFJS</a> 2006 came to a close last Sunday evening. Two and a half solid days of listening to some of the best technical speakers in the country can be draining, but the knowledge and enthusiasm one picks up is priceless.</p>
<p>The highlights from day three were <a href="http://www.pragmaticprogrammer.com/">Andy Hunt&#8217;s</a> &#8220;Refactoring Your Wetware&#8221; and &#8220;Pragmatic Learning&#8221; talks, along with <a href="http://www.jaredrichardson.net/">Jared Richardson&#8217;s</a> &#8220;Software Tools.&#8221; I had heard Andy&#8217;s wetware talk at the local .NET Users Group last year, but he has since revised and lengthened it, splitting it into two different NFJS talks.</p>
<p>The first talk covered how the brain works (it&#8217;s a dual CPU, shared pipe architecture) and how developers can make incredible productivity gains by using more of their right brain instead of their left. In the second talk, Andy gave tips on how to learn more effectively.</p>
<p>One point that struck home for me was the need to write all your ideas down the moment you get them. If you&#8217;re not writing your ideas down, you&#8217;ll start forgetting you have them. I&#8217;ve been using a plain old ballpoint pen (not all of us have enough cash kicking around to buy a Fisher Space Pen) and some index cards. They work quite well, and I get the added benefit of more right-brain activity. I wouldn&#8217;t otherwise have that if I were typing.</p>
<p>Jared&#8217;s talk centered around <a href="http://cruisecontrol.sourceforge.net/">CruiseControl</a>, an open-source continuous integration tool. In a matter of minutes, he installed the tool on his laptop and configured it to build and test a couple of Java classes he had written. I was familiar with CruiseControl before attending his presentation, but the demo was still impressive. I&#8217;m sure if I were a newby attending his talk I would be eager to set up my own CI server the very next day.</p>
<p>Jason posted a comment to my NFJS day 2 post requesting more information on Ramnivas&#8217; demo of <a href="http://www.openqa.org/selenium/">Selenium</a>. Selenium is a JavaScript-based tool that can be used to generate and run cross-browser functional tests for web applications. Tests can be defined as HTML tables, Ruby scripts, and so on. Element locators are quite flexible, allowing widgets on the page to be looked up by ID, name, XPath, or directly through the DOM. Selenium also has a <a href="http://www.mozilla.com/firefox/">Firefox</a> plugin that can be used to &#8220;record&#8221; interaction with a web app. This is a fast way to generate functional tests for an existing application.</p>
<p>One tip Raminvas gave was to instruct testers or other people submitting bugs to include a Selenium recording with their report. That way, you as a developer can play back the exact steps they made to discover the bug. Handling of browser-specific code doesn&#8217;t seem to be a problem with Selenium. It&#8217;s certainly the most promising open source web application testing framework to be produced in a long time. Remember that it&#8217;s only at version 0.7 so it will continue evolving and (hopefully) improving over time.</p>
<p>Next stop this month: <a href="http://www.railsconf.org/">RailsConf 2006</a>! See you there.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthewbass.com/2006/06/14/nfjs-2006-wrap-up/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

