<?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: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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Blue Jazz Consulting</title>
	
	<link>http://www.bluejazzconsulting.com</link>
	<description>Software and Product Strategy, Cloud Consulting, and Software Development based in Austin, TX</description>
	<lastBuildDate>Wed, 30 Nov 2011 19:11:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/TechLeadership" /><feedburner:info uri="techleadership" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>TechLeadership</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Helping Dogadillo by Launching MyLocalReporter</title>
		<link>http://feedproxy.google.com/~r/TechLeadership/~3/3r_ZOPphDuU/</link>
		<comments>http://www.bluejazzconsulting.com/dogadillo/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 22:19:29 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.bluejazzconsulting.com/?p=339</guid>
		<description><![CDATA[Whenever we help a business launch, we never know how it will impact other businesses. By helping Dave Manzer launch MyLocalReporter.com, we helped Lauren Conrad get her Austin-based business, Dogadillo, into the Austin Business Journal.]]></description>
			<content:encoded><![CDATA[<p>Whenever we help a business launch, we never know how it will impact other businesses. By helping Dave Manzer launch <a title="Blue Jazz Consulting helps launch MyLocalReporter.com" href="http://mylocalreporter.com" target="_blank">MyLocalReporter.com</a>, we helped Lauren Conrad get her Austin-based business, <a title="Dogadillo gets into the news via MyLocalReporter" href="http://www.dogadillo.com/" target="_blank">Dogadillo</a>, into the <a href="http://www.bizjournals.com/austin/blog/retail/2011/10/national-magazine-honors-austin-based.html" target="_blank">Austin Business Journal</a>.</p>
<p><a href="https://www.facebook.com/video/video.php?v=10150396337078622" target="_blank">Watch the video to find out how it all came together using MyLocalReporter</a> (via Facebook).</p>
<p>I love it when our hard work to launch a startup ends up helping others through that startup! That is what we are all about!</p>
<p>Want to know more about the technical details of we put the site together? Read on&#8230;</p>
<p><span id="more-339"></span></p>
<h1>How We Launched MyLocalReporter.com</h1>
<p>Dave approached us with a deep understanding of PR and a vision of being able to help small businesses target local media outlets without spending thousands of dollars in PR. After a few hours of discussion, we put together a plan for a Minimum Viable Product (MVP) that met both the business goals of MyLocalReporter and the desired budget.</p>
<p>To accelerate the delivery of the project, we selected a few key technologies:</p>
<ol>
<li><a href="http://rubyonrails.org" target="_blank">Ruby on Rails</a> &#8211; a web application development framework that is great for both small and large-scale web sites</li>
<li><a href="http://www.mongodb.org/" target="_blank">MongoDB</a> &#8211; a database that provides a high-performance, flexible, schema-less database for rapid development</li>
<li><a href="http://heroku.com">Heroku</a> &#8211; a low cost Platform-as-a-Service (PaaS)  that provides easy deployment of any Ruby on Rails, Java, or JVM-based language with on-demand scaling</li>
</ol>
<p>Combining these technologies, along with our test-driven development process, we were able to accelerate the development of the MVP. We then integrated the design provided by <a href="http://www.themodstudio.com/" target="_blank">The MOD Studio</a>, who had already engaged with Dave in a previous project. They delivered both the design and the WordPress site for the marketing and sales site, while Blue Jazz delivered the web application. This provided Dave with the ability to engage with his existing design team, who already understood his business needs, while leveraging Blue Jazz to launch the first version of his web application.</p>
<p>The work for MyLocalReporter isn&#8217;t done yet. Dave has more planned and we will be there to help him launch his ideas. In the mean time, <a href="http://mylocalreporter.com" target="_blank">visit his web site</a> and discover how your business can take advantage of targeted, hyper-local press releases.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TechLeadership?a=3r_ZOPphDuU:MLtjDZ3APFE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TechLeadership?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TechLeadership/~4/3r_ZOPphDuU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.bluejazzconsulting.com/dogadillo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.bluejazzconsulting.com/dogadillo/</feedburner:origLink></item>
		<item>
		<title>MySQL Bulk Insert Performance With JRuby and JDBC</title>
		<link>http://feedproxy.google.com/~r/TechLeadership/~3/hCogZYFh4UE/</link>
		<comments>http://www.bluejazzconsulting.com/mysql-bulk-insert-performance-with-jruby-and-jdbc/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 12:53:27 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[benchmarks]]></category>
		<category><![CDATA[bulk inserts]]></category>
		<category><![CDATA[JRuby]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[rubinius]]></category>
		<category><![CDATA[ruby 1.9]]></category>

		<guid isPermaLink="false">http://www.bluejazzconsulting.com/?p=317</guid>
		<description><![CDATA[I often have need to perform a bulk import of CSV files into MySQL for different projects. Recently, I made the move to the JRuby platform for one of my projects and have benefited from some great performance improvements for the types of work the code needs to perform. I decided that it was time [...]]]></description>
			<content:encoded><![CDATA[<p>I often have need to perform a bulk import of CSV files into MySQL for different projects. <a href="http://www.bluejazzconsulting.com/why-i-selected-jruby-for-my-ruby-project/">Recently, I made the move to the JRuby platform </a>for one of my projects and have benefited from some great performance improvements for the types of work the code needs to perform. I decided that it was time now to examine the differences between Ruby versions when it comes to inserting bulk data into MySQL.</p>
<h1>The Approach</h1>
<p>With rvm once again ready to do my bidding, I proceeded to install the following gems into each of the versions of Ruby installed:</p>
<ol>
<li>fastercsv (1.5.3)</li>
<li>mysql (2.8.1)</li>
<li>sequel (3.24.1)</li>
<li>jdbc-mysql (5.1.13) (JRuby only)</li>
</ol>
<p>I then generated 10 files that each contain 10k rows of CSV data. I inserted these into a MyISAM table 5 times, for a total of 500k rows. Now, the results&#8230;</p>
<h1>The Results</h1>
<p><a href="http://www.bluejazzconsulting.com/wp-content/uploads/2011/06/RubyVMs-mysql-bulk-comparison.png"><img class="alignnone size-full wp-image-322" title="RubyVMs MySql bulk insert comparison" src="http://www.bluejazzconsulting.com/wp-content/uploads/2011/06/RubyVMs-mysql-bulk-comparison.png" alt="" width="567" height="324" /></a></p>
<p>I was amazed at how much faster Ruby 1.9.2 with the MySQL gem was compared to JRuby with the same gem. However, once you move to the JDBC MySQL gem with JRuby, it edges out Ruby 1.9.2 slightly.</p>
<h1>The Analysis</h1>
<p>What do these results really mean? Here are a few take aways:</p>
<ol>
<li>Ruby 1.9.2 can insert 2x as many rows per second than Ruby 1.8.7</li>
<li>JRuby with the MySQL JDBC gem can insert nearly 3x as many rows per second than Ruby 1.8.7</li>
<li>JRuby with the MySQL JDBC gem performs 20% faster than Ruby 1.9.2 with bulk inserts</li>
<li>(bonus) Rubinius 1.2.x and 2.0.0pre both have known issues with poor file I/O performance at the moment</li>
</ol>
<p>Need to insert large amounts of bulk inserts where performance is key? Consider moving to JRuby and using the JDBC MySQL gem, or at a minimum move to Ruby 1.9.2 if you have not done so already.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TechLeadership?a=hCogZYFh4UE:Eq8yAoKQs34:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TechLeadership?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TechLeadership/~4/hCogZYFh4UE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.bluejazzconsulting.com/mysql-bulk-insert-performance-with-jruby-and-jdbc/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.bluejazzconsulting.com/mysql-bulk-insert-performance-with-jruby-and-jdbc/</feedburner:origLink></item>
		<item>
		<title>Technical Co-Founder Need Not Apply</title>
		<link>http://feedproxy.google.com/~r/TechLeadership/~3/TkMGM5wzmfk/</link>
		<comments>http://www.bluejazzconsulting.com/technical-co-founder-need-not-apply/#comments</comments>
		<pubDate>Tue, 14 Jun 2011 12:25:44 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Startup Development]]></category>
		<category><![CDATA[co-founder]]></category>
		<category><![CDATA[development teams]]></category>
		<category><![CDATA[funding]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[startups]]></category>
		<category><![CDATA[VCs]]></category>
		<category><![CDATA[venture capital]]></category>
		<category><![CDATA[version 1]]></category>

		<guid isPermaLink="false">http://www.bluejazzconsulting.com/?p=308</guid>
		<description><![CDATA[Will Miceli recently posted an article, titled Technical Co-Founders Are Overrated, that outlines his journey from idea to finding a partner: I was working on my first entrepreneurial adventure: I had an idea and thought I needed a technical person to build it&#8230;I met some technical folks, but none were available. As a result, I [...]]]></description>
			<content:encoded><![CDATA[<p>Will Miceli recently posted an article, titled <a href="http://lederhosenlabs.com/2011/05/31/technical-co-founders-are-overrated/">Technical Co-Founders Are Overrated</a>, that outlines his journey from idea to finding a partner:</p>
<blockquote><p>I was working on my first entrepreneurial adventure: I had an idea and thought I needed a technical person to build it&#8230;I met some technical folks, but none were available. As a result, I began by really focusing on the business plan and how the solution I dreamed up was going to make money.</p>
<p>&#8230;</p>
<p>One of my mentors suggested building a prototype. After some quick research I settled on Ruby/Rails given that the developer community seemed to be very excited about it and made it easy for newbies to learn&#8230;After a few months I had a prototype and it actually worked.</p>
<p>&#8230;</p></blockquote>
<p>He goes on to talk about how he eventually met a co-founder through the process of learning and talking to developers during this process. While this path may not be best for everyone, it does shed some light on the issue of<strong> how to get your venture started when you don&#8217;t have a technical co-founder</strong>. For Will, it meant doing it himself. <strong>For others, it might mean one of the following paths:</strong></p>
<ol>
<li><strong>Working with a designer</strong> that can help provide an interactive, clickable PDF for pitches</li>
<li><strong>Building a small prototype</strong> (often best if a clickable PDF is not expressive enough or a designer isn&#8217;t available)</li>
<li><strong>Bringing in an outside development team</strong> to build the first version</li>
</ol>
<p>Now, while I may be a little biased to option 3, I have seen each of these steps applied in turn to help solidify the idea and generate creative revenue streams that had not been thought out while developing the requirements and business plan.</p>
<p><strong>So, why consider an outside development team rather than hiring your own?</strong> Several reasons:</p>
<ol>
<li>Unless you or a founding member have technical experience, you may not know what kind of skills to look for in your first hires</li>
<li>You become too focused on using your developers because you have them, distracting you from the business of generating revenue</li>
<li>More difficult skills can be obtained for shorter periods of time to address a particular development need</li>
</ol>
<p>Need help selecting your development team? You can find my top recommendations <a title="How to select a development team for your startup" href="http://www.launchany.com/how-to-select-a-development-team-for-your-startup/" target="_blank">on how to select a development team at LaunchAny.com</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TechLeadership?a=TkMGM5wzmfk:gwqp3DrTtNA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TechLeadership?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TechLeadership/~4/TkMGM5wzmfk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.bluejazzconsulting.com/technical-co-founder-need-not-apply/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.bluejazzconsulting.com/technical-co-founder-need-not-apply/</feedburner:origLink></item>
		<item>
		<title>Why I Selected JRuby For My Ruby Project</title>
		<link>http://feedproxy.google.com/~r/TechLeadership/~3/PZdciXBTVrs/</link>
		<comments>http://www.bluejazzconsulting.com/why-i-selected-jruby-for-my-ruby-project/#comments</comments>
		<pubDate>Tue, 31 May 2011 12:27:11 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[JRuby]]></category>
		<category><![CDATA[platform selection]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[software architecture]]></category>
		<category><![CDATA[VLDB]]></category>

		<guid isPermaLink="false">http://www.bluejazzconsulting.com/?p=295</guid>
		<description><![CDATA[For those working on the Ruby platform, this is an interesting time. We have Ruby 1.9 YARV, Rubinius, and JRuby as the most popular Ruby Virtual Machines available right now. Each one has its strengths and weaknesses, which have been documented already. While each benchmark comparison may show a particular VM better than another, there is another assessment that needs to be made when selecting the target VM for your next Ruby project: best fit for what your project needs to do. ]]></description>
			<content:encoded><![CDATA[<p>For those working on the Ruby platform, this is an interesting time. We have <a title="Ruby 1.9.x MRI" href="http://www.ruby-lang.org/en/" target="_blank">Ruby 1.9 YARV</a>, <a title="Rubinius Ruby Virtual Machine" href="http://rubini.us/" target="_blank">Rubinius</a>, and <a title="JRuby Ruby Virtual Machine" href="http://www.jruby.org" target="_blank">JRuby</a> as the most popular <a href="http://stackoverflow.com/questions/5648101/ruby-virtual-machine" target="_blank">Ruby Virtual Machines</a> available right now. Each one has its strengths and weaknesses, which<a title="Ruby interpreters and virtual machines compared" href="http://programmingzen.com/2007/12/03/the-great-ruby-shootout/" target="_blank"> have been documented already</a>. While each benchmark comparison may show a particular VM better than another, there is another assessment that needs to be made when selecting the target VM for your next Ruby project: best fit for what your project needs to do.</p>
<h1>Project Background</h1>
<p>My current project is a massive data generation tool, targeted at generating from gigabytes to terabytes and beyond for very large databases (VLDBs) and Big Data projects. Having recently completed a VLDB project that applied some areas of Big Data to the solution, I quickly realized that we are entering a new world. I&#8217;ve worked with large datasets before, up to 10+ TB in size. In the past, these kinds of projects were rare. Today, I&#8217;m seeing them over and over. I realized the need to generate large datasets for optimizing areas of the codebase and data storage is necessary so that I don&#8217;t have to spend cycles trying to contrive and load enough data to verify my architecture and implementation. Thus, by new project to generate large datasets in a deterministic and realistic fashion.</p>
<h1>Comparing Ruby Virtual Machines</h1>
<p>Given this background, I proceeded to mockup a very naive prototype of the application. Something that could be contained within one source file and easily benchmarked. While the prototype won&#8217;t reflect anything close to reality (yet), it gave me an excuse to explore the most current Ruby VMs available. With <a title="Ruby Version Manager (RVM)" href="https://rvm.beginrescueend.com/" target="_blank">RVM</a> at hand, I proceeded to install Ruby 1.8.7, Ruby EE, Ruby 1.9, Rubinius, and JRuby to see what would happen. I then built the prototype to include the majority of what I needed: random data generation and file I/O for 30 millions of rows. Here is what I found:</p>
<p><a href="http://www.bluejazzconsulting.com/wp-content/uploads/2011/05/rubyvm-comparison-prettygraphc.com_.png"><img class="alignnone size-full wp-image-299" title="Ruby VM Comparisons for Test Data Generation" src="http://www.bluejazzconsulting.com/wp-content/uploads/2011/05/rubyvm-comparison-prettygraphc.com_.png" alt="" width="560" height="320" /></a></p>
<p>As you can see, JRuby outperformed the other VMs for my project. Obviously, this isn&#8217;t an exhaustive comparison of all areas of the VMs, but it does show that the majority of what my application will be performing is much faster on JRuby than other VMs at this time.</p>
<h1>Making the Decision for JRuby</h1>
<p>As I reviewed these results, my conclusion became easy: JRuby. But my decision wasn&#8217;t just focused on the numbers. Before Ruby, I put in nearly 15 years of Java in either a full-time or part-time capacity. I used to know details about the Java VM and bytecode structure that most didn&#8217;t want to know. So, going back to Java for the speed may have been the right choice, but these days I prefer Ruby. I enjoy writing applications in Ruby. It makes  me happy. And a happy developer is a productive one, especially in a  language that is productive for me. JRuby gives me the best of both worlds, allowing me to take advantage of the Java VM and HotSpot compiler while allowing me to write Ruby and dropping to Java for specific portions of the application when necessary.</p>
<p>Things I&#8217;m looking forward to exploring further with JRuby: compiling Ruby into Java classes using the <a title="JRuby compiler" href="http://kenai.com/projects/jruby/pages/JRubyCompiler" target="_blank">JRuby compiler</a>, <a title="JRuby performing tuning" href="https://github.com/jruby/jruby/wiki/PerformanceTuning" target="_blank">JRuby performance tuning</a>, and <a title="JRuby local and remote monitoring/profiling" href="http://www.engineyard.com/blog/2010/monitoring-the-jvm-heap-with-jruby/" target="_blank">JRuby local and remote monitoring</a></p>
<h1>Final Thoughts</h1>
<p>Before you jump into a platform, consider reviewing the landscape. Try building some prototypes that will exercise the majority of your application&#8217;s logic and compare the results. Every Ruby VM has a different personality as well, so determine if you are comfortable with the VM before moving to it. Also, look for other opportunities on the new platform that didn&#8217;t exist before, such as better debugging, profiling, and technology integrations. This will help you make a more informed decision.</p>
<p>FYI, expect more updates soon on my experiences around JRuby on VLDB and Big Data projects, as time allows.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TechLeadership?a=PZdciXBTVrs:HswyYmvMwVc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TechLeadership?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TechLeadership/~4/PZdciXBTVrs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.bluejazzconsulting.com/why-i-selected-jruby-for-my-ruby-project/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.bluejazzconsulting.com/why-i-selected-jruby-for-my-ruby-project/</feedburner:origLink></item>
		<item>
		<title>Developer’s Guide to Building a High Performance Desktop Machine</title>
		<link>http://feedproxy.google.com/~r/TechLeadership/~3/VVMUXKQoquk/</link>
		<comments>http://www.bluejazzconsulting.com/developers-guide-to-building-a-high-performance-desktop-machine/#comments</comments>
		<pubDate>Mon, 30 May 2011 14:44:52 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[General Development]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[build vs buy]]></category>
		<category><![CDATA[building pc]]></category>
		<category><![CDATA[development pc]]></category>
		<category><![CDATA[development workstation]]></category>
		<category><![CDATA[high performance desktop]]></category>

		<guid isPermaLink="false">http://www.bluejazzconsulting.com/?p=278</guid>
		<description><![CDATA[Laptops can be useful for day-to-day development, but a more powerful machine is required when it comes to working with Very Large Databases (VLDBs) and Big Data. Having some background in building PCs, I recently put together a powerful desktop for my own needs that could handle my current project and any future projects involving large scale databases. I learned quite a bit about the current generation of hardware available, mostly by sifting through forums and blog posts from gamers that build high performance gaming machines.]]></description>
			<content:encoded><![CDATA[<p>Laptops can be useful for day-to-day development, but a more powerful machine is required when it comes to working with Very Large Databases (VLDBs) and Big Data. Having some background in building PCs, I recently put together a powerful desktop for my own needs that could handle my current project and any future projects involving large scale databases. I learned quite a bit about the current generation of hardware available, mostly by sifting through forums and blog posts from gamers that build high performance gaming machines.</p>
<p>As with anything, understanding each subsystem and identifying the key performance issues will often cut through the confusion and help to construct the most optimum solution. Here is my simple introduction and guide to selecting the best components for your next development machine purchase or build, while saving you time and anguish trying to sort through the variety of information available.</p>
<h1>Buying vs. Building a Machine</h1>
<p>So, should I just buy a new machine? Often, this can solve your immediate problem. Apple offers a solution for powerful desktops, as do Dell, HP, and others. Simply buy a machine with a faster processor, more memory, and multiple drives and you can get far.The problem lies in the fact that many of these builders don&#8217;t offer the most powerful or current hardware available, as they tend to lag by 3-6 months. This typically provides an advantage, as the builders will determine what parts work the best and then combine them together. However, unless you go for a high-end machine from these builders, they will often substitute one part for another, based on their current inventory. The result is a machine that is not quite to spec, or lagging behind the most current technology available. If you prefer to find the best machine performance possible, then the best option is to build a custom machine.</p>
<p>If you are reading this article, my  assumption is that you plan on working with large amounts of data using  multiple processes or virtualized servers within a development  environment, and will therefore benefit from the best performance you can buy. To do this, you must have a basic understanding of how to select the best parts for your machine that will work together properly. Either way, this guide will help you better understand your options before you buy or build your next development workstation.</p>
<h1>Selecting the Processor and Memory</h1>
<p>Processors are commonly thought of as throw-away parts. Find the fastest and install it. However, with the current selection of processor families, there are often several choices. On the Intel side, there are currently options for the i5 and i7 families. Within each family are options for the number of cores (often 2, 4, or 6 cores), the L2 and L3 cache size, and the QPI rating. <strong>The fastest i7 processor with the most cores, L2 and L3 cache, and the highest QPI will often provide the most processing power when it comes to working with Big Data solutions like Hadoop or distributing computing</strong> <strong>applications</strong>.</p>
<p>Memory can be a little more confusing. Since the i7 processor can talk to the memory using triple channels, it is best to select the proper memory to complement your processor selection. Memory is commonly rated with four numbers, such as 7-7-7-21, indicating the latency of the memory (deeper research about these numbers is interesting but left as an exercise for the reader). <strong>This means finding the fastest DDR3 triple channel memory with the lowest latency and buying enough to handle your development needs.</strong> Often, you have to inform the BIOS of your motherboard about the speed of your memory, otherwise it will default to a slower rating for stability. More on that later.</p>
<h1>Motherboard</h1>
<p>If you have every walked into a store like Fry&#8217;s, you will see a large selection of motherboards. They vary is sizes, features, and capability. Most motherboards are designed for the average price-conscious consumer that wants to see the most number of features for the dollar. In reality, development desktops need something different.<strong> They need to be reliable for long-term use, with 24&#215;7 uptime and stability.</strong> I have found that Asus is often a good choice as a motherboard manufacturer, particularly their Sabretooth X58 motherboard. Do some research for the operating system you will be running to ensure the best compatibility, as even the best manufacturer may take a short-cut occasionally and install a controller chip that isn&#8217;t as friendly for some operating systems (especially Ubuntu/Linux).</p>
<h1>Hard Drives and RAID</h1>
<p>If you own a modern laptop, you may already have a solid state drive (SSD drive) installed. They are silent, having no moving parts, and are quite fast to boot your favorite operating system as some can achieve over 300MB/s during read access. These drives are sufficient for most uses and for boot drives for the OS, but often they are not as efficient when it comes to mass storage requirements. <strong>Big Data and VLDBs often require large amounts of throughput and storage during development, which is currently beyond the capacity of modern SSDs</strong>. This means that traditional spindle-based SATA drives are still the best option for our needs. This does not, however, prevent you from mixing your storage subsystem with a combination of SSD drive(s) for the OS and spindle-based drives for mass data storage. <strong>The primary concern when selecting your hard drives are speed, reliability, and capacity.</strong></p>
<p>SATA drives are commonly available in different speeds: 5400, 7200, and 10k rpm. The faster and smaller the drive, the faster data can be accessed and written. SAS drives are a newer form of spindle-drive commonly found on higher end server machines and can achieve speeds of up to 15k rpm and even faster seek times. They are very expensive, however, and therefore often out of the reach of most developers. Another factor is the mean time between failure (MTBF) rating, which is an estimate of the number of hours before the drive is likely to fail. Lower-grade consumer drives often have lower MTBF and are more likely to fail while server-class drives have a much higher MTBF. They also run cooler, which is another important factor for long life and reliability. <strong>The best choice at this time is the Western Digital Velociraptor 10k rpm drives, currently found in 300 and 600GB sizes. They have a higher MTBF, run cool, and are generally a good choice for high performance desktop use. </strong></p>
<p>RAID controllers allow multiple drives to be combined and viewed as a single device by the operating system. RAID 0 allows two or more drives to be striped (written to and read from in parallel), although if any one fails the entire system fails. RAID 1 allows for two or more drives to be mirrored, providing a simple form of redundancy and parallel reads (assuming the controller allows it). RAID 5 and 6 provide a more economical way to provide data redundancy but can sometimes hinder performance when it comes to the way some database servers read and write data to the filesystem. I&#8217;ve found that the most optimum RAID choice for development machines is RAID1+0 (sometimes called RAID 10). This means that there are two RAID 0 drive arrays that are then combined into a RAID 1 pair, allowing for very fast reads and redundant data storage when writing.</p>
<p>When selecting a controller for your RAID configuration, many utilize the onboard RAID controller from their motherboard. While many motherboards are now using more popular RAID controllers from known vendors, they still require the use of the processor to perform the RAID logic. Before you choose to use the onboard controller, do some research for issues during RAID recoveries and rebuilding after drives fail. Often, these controllers are great when they work but terribly slow or unreliable during a rebuild after a drive failure. <strong>My recommendation is to select a separate RAID controller card that has a dedicated processor, onboard memory (sometimes with a battery backup), and support for 4, 8, 16, or 32 drives. </strong>These cards are typically $300 or more in price, while lower priced cards are likely no different than the controllers available on today&#8217;s motherboards. I prefer the Adaptec 5805 series RAID controller. These cards can sometimes be obtained at a discount due to an open box or overstock. <strong>Caution: be sure to purchase the kit, not just the standalone card, or else you will be missing the cable sets that are often required to connect the card to the drives. </strong></p>
<p>One final note about hard drive selection: the larger the hard drives selected, the longer it takes to rebuild a RAID device when a drive fails. If you have a drive failure and replace your drive, you may still be running in degraded mode (one or more drives are unavailable and being rebuilt) for some time. This can be a huge factor in the middle of a development cycle, so minimizing the rebuild time is a must.</p>
<h1>Case and Power Supply</h1>
<p><strong>Selecting a case is mostly an aesthetic decision, although there are a few factors to consider: number of available hard drive bays, location of the power supply, and airflow.</strong> The number of available drive bays must meet or exceed the number of drives you intend on installing and may require that you locate a case that supports the smaller SSD drives if you plan on installing one without an adapter for the larger SATA-sized bays. Power supplies are traditionally located at the top of the case, though more are starting to locate them at the bottom for easier access, a lower likelihood of tipping over, and aesthetics. Finally, identifying a case that has good airflow from front-to-back, plenty of locations for fans of 120mm or larger, and even CPU  funnels will help extract the heat produced from your processor, video card, and hard drives efficiently.<strong> I prefer the Antec Nine Hundred v3 (not the v2) or the Twelve Hundred, as they provide plenty of fans, great airflow, plenty of hard drive bays, and have filters on the front fans for easily removing dust. </strong></p>
<p>Power supplies are often the most overlooked and underrated part of the  desktop. One is just like the other, right? Wrong! The parts inside the  power supply can vary in quality and power efficiency, and can easily  take down your entire machine if they fail. Find a power supply from a  well-rated manufacturer that offers the appropriate rating in watts for  your machine. <strong>Most i7 processors with up to 4 hard drives and a moderate video card can utilize a gold series 800W or better power supply</strong>.  Also, look for <strong>modular power supplies</strong>, as they allow you to select only  the cables you need for your installation, reducing the number of  cables you have to deal with inside your desktop case. Finally, <strong>ensure that the cables supplied with the power supply will reach all devices in your selected case</strong>, from the motherboard power sockets to the hard drives and DVD.</p>
<h1>My Setup</h1>
<p>To conclude this guide, I&#8217;ll outline the setup I built in the fall of 2010, to help get you started. I found that this was the best combination of power and low noise for a pleasant yet powerful work environment:</p>
<ul>
<li>Intel i7 980X Extreme Edition Processor (6 core) w/ stock CPU fan on quiet mode</li>
<li>G.Skill 7-7-7-21 1600 DDR3 Memory</li>
<li>ASUS Sabretooth X58</li>
<li>Adaptec 5805 RAID controller (up to 8 drives)</li>
<li>4 x Velociraptor 600GB 10k rpm drives (6GB/s) in RAID 10</li>
<li>Antec Nine Hundred v3 case</li>
<li>ASUS AHA5450 Silent ATI video card</li>
<li>Ubuntu Linux 10.10 w/ native ATI drivers installed (I prefer Gentoo but Ubuntu is much easier to maintain on a daily basis)</li>
</ul>
<h3>Memory Performance Results</h3>
<p>Memtest86+ results before and after I adjusted the BIOS to use the 7-7-7-21 memory settings:</p>
<ol>
<li>Mem stable at 9-9-9-24 (BIOS default):<br />
BLCK 133 Mhz // QPI 6.4 GT/s // RAM 668 Mhz // L1=65509 MB/s // L2=22574 MB/s // L3=6449 MB/s // Memory speed 4949 MB/s</li>
<li>Mem stable at 7-7-7-21 (spec):<br />
BLCK 141 Mhz // QPI 6.7 GT/s // RAM 705 Mhz // L1=69176 MB/s // L2=22328 MB/s // L3=15679 MB/s // Memory speed 9069 MB/s</li>
</ol>
<h3>Hard Drive Performance Results</h3>
<p>Finally, here are some quick performance tests with the 4 drives in RAID 10. While I could add 4 more drives to achieve higher results, these results are great and provide a nice balance between the performance vs. cost, heat, and power consumption.</p>
<p>ubuntu@ubuntu:~$ sudo hdparm -tT /dev/sda</p>
<p>/dev/sda:<br />
Timing cached reads:   17128 MB in  2.00 seconds =<strong> </strong>8570.32 MB/sec<br />
Timing buffered disk reads:  1562 MB in  3.00 seconds = <strong>520.29 MB/sec</strong></p>
<h1>Conclusion</h1>
<p>I hope that this article has been beneficial and will assist you in the key decisions needed to build a powerful desktop machine for high performance development. If you have any questions, please drop me a comment or a note using the <a href="http://www.bluejazzconsulting.com/contact">contact form </a>and I&#8217;ll do my best to answer any questions you may have.</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 228px; width: 1px; height: 1px; overflow: hidden;">Of course, this won&#8217;t be the case if you design your application to  brute-force through a solution with only one process or thread, but that  is a topic for another time. If you are reading this article, my  assumption is that you plan on working with large amounts of data using  multiple processes or virtualized servers within a development  environment and will therefore benefit from the best performance in each subsystem.</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TechLeadership?a=VVMUXKQoquk:FxrDUUsgx8Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TechLeadership?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TechLeadership/~4/VVMUXKQoquk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.bluejazzconsulting.com/developers-guide-to-building-a-high-performance-desktop-machine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.bluejazzconsulting.com/developers-guide-to-building-a-high-performance-desktop-machine/</feedburner:origLink></item>
		<item>
		<title>FREE Cloud Computing For Startups eBook</title>
		<link>http://feedproxy.google.com/~r/TechLeadership/~3/V06SK9LP0Yw/</link>
		<comments>http://www.bluejazzconsulting.com/free-cloud-computing-for-startups-ebook/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 20:08:27 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[ebook]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[startups]]></category>

		<guid isPermaLink="false">http://www.bluejazzconsulting.com/?p=275</guid>
		<description><![CDATA[We have released a new eBook through our sister website, LaunchAny.com, called Cloud Computing For Startups. The eBook is FREE and offers a simple and concise introduction to cloud computing and how startups can benefit. The topics covered include: What is cloud computing? How your startup can take advantage of cloud computing to gain a [...]]]></description>
			<content:encoded><![CDATA[<p>We have released a new eBook through our sister website, <a href="http://www.launchany.com/">LaunchAny.com</a>, called <a href="http://unbouncepages.com/clouding-computing-startups">Cloud Computing For Startups</a>. The eBook is FREE and offers a simple and concise introduction to cloud computing and how startups can benefit.</p>
<p>The topics covered include:</p>
<ul>
<li><strong>What is cloud computing?</strong></li>
<li>How your startup can <strong>take advantage of cloud computing</strong> to gain a competitive advantage</li>
<li>How to know if cloud computing is a <strong>good fit</strong> for your startup</li>
<li><strong>A</strong><strong>nswers to common myths</strong> about cloud computing</li>
<li>Guidance through the<strong> decisions required to prepare your startup</strong> for taking advantage of the cloud</li>
<li>Tips on <strong>how to move your existing startup to the cloud</strong></li>
</ul>
<p>Whether you are new to cloud computing or just want to learn more about how it applies to startups, this eBook will provide some new and interesting insights for you.</p>
<p><a href="http://www.launchany.com/free-ebook-cloud-computing-for-startups/">Learn more about the eBook</a> or <a href="http://unbouncepages.com/clouding-computing-startups">go straight to the download page</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TechLeadership?a=V06SK9LP0Yw:_ayTIeLZETo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TechLeadership?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TechLeadership/~4/V06SK9LP0Yw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.bluejazzconsulting.com/free-cloud-computing-for-startups-ebook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.bluejazzconsulting.com/free-cloud-computing-for-startups-ebook/</feedburner:origLink></item>
		<item>
		<title>Interview with Heroku’s Adam Wiggins</title>
		<link>http://feedproxy.google.com/~r/TechLeadership/~3/TY0__b1zJHc/</link>
		<comments>http://www.bluejazzconsulting.com/interview-with-herokus-adam-wiggins/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 20:24:04 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Adam Wiggins]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[heroku]]></category>
		<category><![CDATA[interview]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://www.bluejazzconsulting.com/?p=273</guid>
		<description><![CDATA[InfoQ has a 16 min video interview with Adam Wiggins from Heroku. In the interview, Adam discusses Ruby 1.9, the Heroku dyno solution, new add-on support, and how they support background jobs.  He also talks a little about using Erlang to supplement their Ruby infrastructure. I really enjoyed the discussion on how they pre-compile, build/bundle [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.infoq.com/interviews/wiggins-heroku-ruby">InfoQ has a 16 min video interview with Adam Wiggins from Heroku</a>. In the interview, <a href="http://adam.blog.heroku.com">Adam</a> discusses Ruby 1.9, the Heroku dyno solution, new add-on support, and how they support background jobs.  He also talks a little about using Erlang to supplement their Ruby infrastructure. I really enjoyed the discussion on how they pre-compile, build/bundle gems, and deploy each new version of your app using their infrastructure.</p>
<p><a href="http://www.infoq.com/interviews/wiggins-heroku-ruby">Watch the full interview</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TechLeadership?a=TY0__b1zJHc:y5MQQEHmb5w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TechLeadership?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TechLeadership/~4/TY0__b1zJHc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.bluejazzconsulting.com/interview-with-herokus-adam-wiggins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.bluejazzconsulting.com/interview-with-herokus-adam-wiggins/</feedburner:origLink></item>
		<item>
		<title>Cloud Storage Used For Backup More Than General Purpose Storage</title>
		<link>http://feedproxy.google.com/~r/TechLeadership/~3/-lh_lqOzXQ0/</link>
		<comments>http://www.bluejazzconsulting.com/cloud-storage-used-for-backup-more-than-general-purpose-storage/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 17:30:36 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[amazon s3]]></category>
		<category><![CDATA[cloud computing for startups]]></category>
		<category><![CDATA[cloud storage]]></category>

		<guid isPermaLink="false">http://www.bluejazzconsulting.com/?p=267</guid>
		<description><![CDATA[A new survey by Forrester says that just 3% of companies use cloud storage. Read the stats from the more than 1,200 IT decision makers interviewed and our analysis.]]></description>
			<content:encoded><![CDATA[<p>A new survey by <strong>Forrester says that just 3% of companies use cloud storage</strong>. Here are the stats from the more than 1,200 IT decision makers interviewed:</p>
<ul>
<li>43% said they’re not interested in cloud storage</li>
<li> Another 43% were interested but have no plans to adopt</li>
<li>3% plan to implement a cloud storage platform in the next year</li>
<li>5% plan at least a year out</li>
<li>3% have already switched to cloud storage</li>
<li>Only 1% are expanding an existing implementation</li>
</ul>
<p><strong>Some consider these stats as a bad thing for cloud computing. I see it as a non-issue. </strong>Here is why:</p>
<ol>
<li>Many likely <strong>prefer to have local storage for fast access and security</strong>, even for general purpose data</li>
<li>They also would <strong>prefer to have flexibility in managing cost</strong>, with lower cost storage for least used data and higher cost put toward data that is heavily used or where performance is important</li>
<li>Using storage APIs from Amazon S3 and other service provides<strong> is similar to writing support for accessing your hard drive using low-level operating system calls</strong> &#8211; it takes considerable effort for managing something as simple as files</li>
</ol>
<p><strong>The survey did find that companies are more interested in using these services for backup.</strong> This makes sense, as <strong>it provides an option for offsite storage of data and often comes with higher level management of files and volumes</strong> (time differential logic, storage, and restoration).</p>
<p>From my research, most consumers of cloud storage are from those fully embracing the cloud architecture, namely startups. <strong>Startups are finding that it can provide elastic storage, redundancy, and can offload data transfer costs by utilizing smarter APIs to create temporary access keys to send owners directly to the data (where the cost is cheaper than costs at the server).</strong></p>
<p>The conclusion? Using cloud storage services for backup is an easy decision; using it for general purpose storage is great to help reduce costs. Otherwise, local storage will still reign for some time to come.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TechLeadership?a=-lh_lqOzXQ0:R-FUKe74Gk4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TechLeadership?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TechLeadership/~4/-lh_lqOzXQ0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.bluejazzconsulting.com/cloud-storage-used-for-backup-more-than-general-purpose-storage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.bluejazzconsulting.com/cloud-storage-used-for-backup-more-than-general-purpose-storage/</feedburner:origLink></item>
		<item>
		<title>Scalable Background Job Processing With Ruby on Rails and Skynet</title>
		<link>http://feedproxy.google.com/~r/TechLeadership/~3/1ZSNvJjht3w/</link>
		<comments>http://www.bluejazzconsulting.com/scalable-background-job-processing-with-ruby-on-rails-and-skynet/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 14:44:07 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[background job processing]]></category>
		<category><![CDATA[distributed computing]]></category>
		<category><![CDATA[map reduce]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[skynet]]></category>

		<guid isPermaLink="false">http://www.bluejazzconsulting.com/?p=246</guid>
		<description><![CDATA[On a recent project, I needed to be able to run a large number of background jobs. Each job would likely last between 30 seconds and 5 minutes, depending on the amount of work involved. We needed something that could do this heavy lifting, so we spent some time surveying the Ruby/Rails job processing landscape. [...]]]></description>
			<content:encoded><![CDATA[<p>On a recent project, I needed to be able to run a large number of background jobs. Each job would likely last between 30 seconds and 5 minutes, depending on the amount of work involved. We needed something that could do this heavy lifting, so we spent some time surveying the Ruby/Rails job processing landscape.</p>
<h2>Many Ruby/Rails Job Processing Libraries</h2>
<p>There are quite a few Ruby and Rails job processing libraries &#8211; in fact, too many to list. Most of the libraries can be divided into the following groups:</p>
<ol>
<li>Spawners &#8211; spawn a new process and wait or fork and forget</li>
<li>Single Process Workers &#8211; launch a single process, watch a queue or database table, and run each job in turn</li>
<li>Multiple Process Workers &#8211; launch as many processes as you want and let each one run a job. Coordination between the processes is done by a) a managing process, b) a message broker, or c) database tables</li>
</ol>
<p>Since the workload was going to be heavy and the hardware we had was capable of running multiple processes, I opted for the multiple process worker type. The next step was to figure out which library to use.</p>
<h2>Why Skynet for Ruby on Rails Job Processing?</h2>
<p>Enter Skynet, a Ruby-based library written by Adam Pisoni. Adam uses the Map Reduce framework, patented by Google and powering many of Google&#8217;s services, including search. Here is Adam&#8217;s summary of Map Reduce:</p>
<blockquote><p>At its simplest level, a MapReduce job defines a data set, a map method and a reduce method. It may also define a partition method. The MapReduce server evenly splits up (partitions) the data given to it and sends those chunks of data, along with a copy of the code in the map method, to workers that execute the map method against the data it was given. The output from each worker is sent back to the MapReduce server. At  this point the MapReduce server evenly partitions the RESULT data returned from the workers and sends those chunks of data along with the reduce code to the workers to be executed. The reducers return the final result which is returned to the process that requested the job be done in the first place. Not all jobs need a reduce step, some may just have a map step.</p></blockquote>
<p>You can also read the full paper from Google at <a href="http://labs.google.com/papers/mapreduce.html">http://labs.google.com/papers/mapreduce.html</a>.</p>
<h2>So, How Does It Work?</h2>
<p>Skynet works by launching one or more processes that are either a) masters (coordinators), b) workers, or c) both. Any master pulls a job off the queue (stored in the database) and dispatches the work or runs it locally (if it can perform both tasks). The worker performs the mapping step first and then the reduce step, if provided. When the job has completed, the results are stored back into the database for later retrieval, or returned back to the caller if one is waiting.</p>
<h2>The Project Specifics</h2>
<p>For this project, we have long-running jobs that can be broken into smaller units of work and then reassembled. The nice thing about Skynet is that it allows us to break up this work without having to track the results and assemble them ourselves. This allowed us to define a map step of processing the smaller work unit, then a reduce step of reassembling the pieces back together. We could launch as few or as many workers as we needed, to balance memory consumption and time-to-completion.</p>
<p>The results were quite impressive: a 5 minute job would be broken into approx 10 smaller units of work. The total running time to create the job, let Skynet map and reduce it, and receive the results was approximately 45 seconds on a dual quad core server with plenty of memory. We further optimized this by using <a href="http://memcached.org/">memcached </a>to cache calculations and prevent redundant work, allowing us to reduce the jobs further to as low as 15 seconds.</p>
<h2>Tips for Using Skynet with Ruby on Rails</h2>
<p>Using Skynet can have a large learning curve. We&#8217;ve had over 10 years of distributed computing experience and it still took a little time to familiarize ourselves with the gem. Here are some tips and suggestions:</p>
<ol>
<li>Skynet requires a restart after a code change. So, write your job code in a separate class and test it. This may require you to design for testability, but it will allow you to ensure your code is stable before testing it live within Skynet</li>
<li>By default, Skynet will start 2 dual master/workers and some worker-only processes. If your masters get overwhelmed, it can cause your map/reduce jobs to stall as there is no master to coordinate the effort. Launch master-only jobs to prevent this</li>
<li>Skynet will dispatch work as it sees fit. If you want to ensure that your jobs are processed in a certain order, you may need to throttle the jobs into Skynet by fronting it with a message broker and queue processor. This is often overkill for most projects, but can help ensure that a job that has been split into smaller jobs is fully completed before the next one starts</li>
<li>The last version we used required that we refresh all ActiveRecord connections at the start of our job. Otherwise, AR would receive a timeout from our database connection and fail to process</li>
<li>Use good logging. Skynet provides a logging mechanism, so use it. You may need to include specific identifiers to provide context, as the log will fill quickly with the more processes you have running at once</li>
</ol>
<p>You can view the full Skynet documentation at its <a href="http://skynet.rubyforge.org/">Rubyforge home</a>, or grab the <a href="http://github.com/wonko9/skynet">latest source code from Github</a>.</p>
<p>Finally, there seems to be a fork of the <a href="http://github.com/brendan/skynet">Skynet project by Brendan Baldwin</a>. He looks to be making some really nice improvements, including <a href="http://www.nagios.org/">Nagios monitoring</a> support and dispatching jobs to Skynet from any object with a single call. We hope to evaluate his project fork soon.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TechLeadership?a=1ZSNvJjht3w:PvZUR5Hjq6Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TechLeadership?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TechLeadership/~4/1ZSNvJjht3w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.bluejazzconsulting.com/scalable-background-job-processing-with-ruby-on-rails-and-skynet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.bluejazzconsulting.com/scalable-background-job-processing-with-ruby-on-rails-and-skynet/</feedburner:origLink></item>
		<item>
		<title>Geofencing with Ruby on Rails and MySQL</title>
		<link>http://feedproxy.google.com/~r/TechLeadership/~3/FuK6NApnoRc/</link>
		<comments>http://www.bluejazzconsulting.com/geofencing-with-ruby-on-rails-and-mysql/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 19:35:34 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[geofence]]></category>
		<category><![CDATA[gps]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[spatial queries]]></category>

		<guid isPermaLink="false">http://www.bluejazzconsulting.com/?p=217</guid>
		<description><![CDATA[I recently launched a startup that required geofencing. For those not familiar with the term, geofencing is the finding of known locations within a specific area around a central point. An example of what geofencing looks like can be seen to right: Here is what we needed to deliver for our project: Track a list [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bluejazzconsulting.com/wp-content/uploads/2010/01/geofencing-with-ruby-on-rails-and-mysql.png"><img class="size-thumbnail wp-image-220 alignright" style="border: 1px solid black;" title="geofencing-with-ruby-on-rails-and-mysql" src="http://www.bluejazzconsulting.com/wp-content/uploads/2010/01/geofencing-with-ruby-on-rails-and-mysql-150x150.png" alt="" width="150" height="150" /></a>I recently launched a startup that required geofencing. For those not familiar with the term, geofencing is the finding of known locations within a specific area around a central point. An example of what geofencing looks like can be seen to right:</p>
<p>Here is what we needed to deliver for our project:</p>
<ol>
<li>Track a list of known points</li>
<li>Track the location of a specific item at a point in time</li>
<li>Determine a list of those known points that were within a specific radius of that item during that time</li>
</ol>
<h2>The MySQL Spatial Solution</h2>
<p>After performing some extensive research on the current methods for geofencing, I opted to utilize <a title="MySQL spatial extensions" href="http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html">MySQL&#8217;s spatial extensions</a> to help store and calculate possible known points within the perimeter of a specific location. This allowed us to store each point as a MySQL geometry, then perform a special calculation to detect known points within the radius.MySQL even offers indexing of geometric columns if you opt for the MyISAM engine for the table.</p>
<h2>Geofencing with ActiveRecord</h2>
<p>Since ActiveRecord doesn&#8217;t have direct support for the MySQL spatial extensions, the handy <a href="github.com/andre/geokit-rails">geokit-rails gem</a> by Andre Lewis was used. With this gem, we were able to create the proper migrations to save and restore the geometry locations for our models. After writing a helper method to make the query as fast as possible, our work on the Rails side was complete. We had a little MySQL-specific code, but it was isolated within the migration (via the gem extensions) and the model itself.</p>
<h2>Results</h2>
<p>I also performed some optimizations to our MySQL configuration and to the table itself. After that, I roughly measured the performance for our queries to &lt;= 0.05 seconds against 4+ million known points stored in MySQL. More than enough for our performance needs!</p>
<h2>Don&#8217;t Forget the Database!</h2>
<p>Many developers forget about the power of using a database&#8217;s native extensions. Many architects and managers don&#8217;t want to bind to vendor extensions, preventing them from saving time and increasing performance.</p>
<p>MySQL&#8217;s spatial extensions, while following some industry standards regarding spatial data storage and support, wasn&#8217;t exactly a SQL standard. For this project, we made the right decision and saved considerable time of building the solution ourselves.</p>
<p>We were also reminded that sometimes spending time reviewing and <a title="Making the right Ruby on Rails Architecture decisions" href="http://www.bluejazzconsulting.com/how-we-can-help-your-startup/">selecting your architecture solutions during a discovery phase</a> can pay off considerably.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/TechLeadership?a=FuK6NApnoRc:MrfR7WOGLcQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TechLeadership?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TechLeadership/~4/FuK6NApnoRc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.bluejazzconsulting.com/geofencing-with-ruby-on-rails-and-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.bluejazzconsulting.com/geofencing-with-ruby-on-rails-and-mysql/</feedburner:origLink></item>
	</channel>
</rss>

