<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6201986</id><updated>2012-01-22T11:11:59.428-08:00</updated><category term='ruby'/><category term='activerecord'/><category term='business'/><category term='charts'/><category term='quicktip'/><category term='php'/><category term='books'/><category term='vacations'/><category term='misc languages'/><category term='mongoid'/><category term='strategy'/><category term='status'/><category term='music'/><category term='merb'/><category term='mongodb'/><category term='wordpress'/><category term='objective-c'/><category term='git'/><category term='rack'/><category term='*nix'/><category term='rails'/><category term='performance'/><category term='machine learning'/><category term='datamapper'/><category term='rake'/><title type='text'>neovintage</title><subtitle type='html'>the synergy between the ruby ecosystem and an mba</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>47</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6201986.post-5667380310519692115</id><published>2011-12-19T07:00:00.000-08:00</published><updated>2011-12-19T07:00:10.634-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='machine learning'/><title type='text'>Start Using Shogun Toolbox in Ruby</title><content type='html'>&lt;p&gt;&lt;a href="http://www.shogun-toolbox.org"&gt;Shogun Toolbox&lt;/a&gt; is the ultimate in machine learning.  It provides a number of different machine learning models like &lt;a href="http://en.wikipedia.org/wiki/Support_vector_machine"&gt;support vector machines (SVM)&lt;/a&gt; and hidden Markov models just to name a few.  So why use Shogun toolbox?  Well, when you look at the SVM landscape, for example, you'll find many different publicly available implementations. Let's say you needed to switch your code to use OCAS instead of LibSVM, the semantics of interacting with each implementation could vary wildly.  As a result the &lt;a href="http://jmlr.csail.mit.edu/papers/v11/sonnenburg10a.html"&gt;authors of Shogun Toolbox state&lt;/a&gt;, "the motivation for creating a machine learning toolbox was to provide an easy, unified way for solving certain types of machine learning problems."  This is great for us because that means we'll get access to many more machine learning models without having to find or build C extensions for Ruby that interface with the SVM implementation we want to use.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;What are we trying to solve with Shogun Toolbox?&lt;/h3&gt;&lt;p&gt;According to the wikipedia page for Shogun Toolbox, it was developed with bioinformatics in mind.  With an industry like that, you should expect lots of data, and do I mean lots.  We're talking about millions and millions of data points. Ok... so it can handle a lot of data, but what else is it good for?  The real sweet spot are two- and multiclass classification and regression problems, according to the &lt;a href="http://jmlr.csail.mit.edu/papers/v11/sonnenburg10a.html"&gt;overview paper&lt;/a&gt;. There are some other things packaged with the toolbox but know that if you're looking to do classification this is the package for you.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Compiling Shogun Toolbox&lt;/h3&gt;&lt;p&gt;The easiest way to get started would be to download the source from github.  Once downloaded, make your way to the src directory so that you can compile the toolbox for your machine.&lt;/p&gt;&lt;script src="https://gist.github.com/1486795.js?file=simple.sh"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;p&gt;It's as simple as that.  Theres a whole host of options that you can configure when you're compiling the program.  I would encourage you to check them out as you use the toolbox.  Since we're really interested in doing this for Ruby, we need to do a couple more things before we get the toolbox working. First, install the ruby gem narray to your system. Its pretty simple:&lt;/p&gt;&lt;script src="https://gist.github.com/1486795.js?file=install_narray.sh"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;p&gt;Then when you configure the toolbox  you'll need to specify that you also want the ruby_modular interface:&lt;/p&gt;&lt;script src="https://gist.github.com/1486795.js?file=ruby.sh"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;p&gt;There are other interfaces for languages like Octave, Java and Python.  Feel free to include them at this time.  You should be good to go from this point, unless you're an RVM user.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Gotchas for RVM users&lt;/h3&gt;&lt;p&gt;Unfortunately at this time, when you configure the library, it's not smart enough to know that you need to point to your current ruby instead of the system ruby.  You'll see a weird error in the build process like &lt;tt&gt;Undefined Symbol: _rb_str_new_cstr&lt;/tt&gt;.  You'll need to collect two different pieces of information.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The first is where your ruby lib lives.  You can issue &lt;tt&gt;rvm info&lt;/tt&gt; and find the environment variable &lt;tt&gt;MY_RUBY_HOME&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;The second is where your platform specific include directory.  You can issue &lt;tt&gt;ruby -e "puts $:"&lt;/tt&gt; at the command line and that will show you all of the directories ruby will look to include code.  Make sure you've switched to the ruby you want to use!  I recommend you put the compiled modshogun lib in the path with &lt;tt&gt;site_ruby&lt;/tt&gt; and the platform specific folder.&lt;/li&gt;
&lt;/ul&gt;Once you get that, all you need to do is slap those on the end of your configuration options:&lt;/p&gt;&lt;script src="https://gist.github.com/1486795.js?file=configure.sh"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;p&gt;If you didn't notice when you add the ruby dir to install to, modshogun will be available to all gemsets of the ruby you compiled against.  If you need to namespace modshogun to a particular gemset, let me know if you have any ideas.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Running through some examples&lt;/h3&gt;&lt;p&gt;Let's go through one of the classifier examples packaged with the source code, namely &lt;a href="https://github.com/shogun-toolbox/shogun/blob/master/examples/undocumented/ruby_modular/classifier_libsvm_minimal_modular.rb"&gt;&lt;tt&gt;classifier_libsvm_minimal_modular.rb&lt;/tt&gt;&lt;/a&gt;.  I've added my extra notes in the comments:&lt;script src="https://gist.github.com/1439087.js?file=gistfile1.rb"&gt;&lt;/script&gt;&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Resources&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Shogun Toolbox: &lt;a href="http://www.shogun-toolbox.org"&gt;http://www.shogun-toolbox.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Source Code: &lt;a href="https://github.com/shogun-toolbox/shogun/"&gt;https://github.com/shogun-toolbox/shogun/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;If you're new to machine learning and/or classification, I would recommend checking out some other articles to get up to speed on the subject before jumping into just a big piece of software like Shogun Toolbox:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.igvita.com/2008/01/07/support-vector-machines-svm-in-ruby/"&gt;Support Vector Machines in Ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ml-class.org/"&gt;Stanford's Machine Learning Class&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://neovintage.blogspot.com/2011/11/text-classification-using-support.html"&gt;Text Classification Using Support Vector Machines in Ruby&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-5667380310519692115?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/5667380310519692115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2011/12/start-using-shogun-toolbox-in-ruby.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/5667380310519692115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/5667380310519692115'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2011/12/start-using-shogun-toolbox-in-ruby.html' title='Start Using Shogun Toolbox in Ruby'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-5526358257835693457</id><published>2011-11-30T12:46:00.001-08:00</published><updated>2011-12-11T03:05:05.292-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rack'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Mounting Resque Web in Rails 3 using Warden, Devise and the Asset Pipeline</title><content type='html'>&lt;p&gt;Really the title of this post should be, "Don't fear middleware".  So here's the set up, I had a Rails 3.1 app that was utilizing the Asset Pipeline, Resque and Devise.  Like most people, I wanted to just mount Resque Server into the Rails app behind the authorization that I was already using and be done with it.  The easiest and most elegant way of doing so is to &lt;a href="http://blog.kiskolabs.com/post/776939029/rails3-resque-devise"&gt;do it in your routes&lt;/a&gt;.  What's so awesome about this solution is that you get authorization and paths pointing to Resque Web just like that.  Unfortunately, if you're using the asset pipeline like I was, you'll be unable to get any of the Resque Web assets served by the application in staging and production.  By "using the asset pipeline", I mean setting the &lt;tt&gt;action_dispatch.x_sendfile_header = 'X-Sendfile'&lt;/tt&gt; and &lt;tt&gt;serve_static_assets = false&lt;/tt&gt; in the config file.  Plus the solution given above for serving the assets from Resque is to copy them to your assets folder.  BARF!&lt;/p&gt;

&lt;h3&gt;To The Middleware&lt;/h3&gt;
&lt;p&gt;Let's delve into the rackup file. If you're like most Rails projects you probably have a rackup file that looks like this:&lt;/p&gt;&lt;script src="https://gist.github.com/1459949.js?file=old_config.ru"&gt;&lt;/script&gt; 
&lt;p&gt;Well thats going to have to change.  First off you'll need to map the routes and then tell Resque Web how to handle authentication within the scope of rack.  What you end up with is a file like this: &lt;/p&gt;
&lt;script src="https://gist.github.com/1459949.js?file=config.ru"&gt;&lt;/script&gt;

&lt;p&gt;The only thing that's really left is creating a new instance of Resque::Server.  I decided to do it via Sinatra rather than creating another rack middleware.  I have an initializer in config/initializers/resque.rb like this:&lt;/p&gt;
&lt;script src="https://gist.github.com/1459949.js?file=awesomeapp_resque.rb"&gt;&lt;/script&gt;

&lt;p&gt;There you have it, you can now serve Resque Web without having to copy any assets or do anything funky to the gem.  This feels a little bit better to me since we're not really messing with the internal workings of the resque gem.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-5526358257835693457?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/5526358257835693457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2011/11/mounting-resque-web-in-rails-3-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/5526358257835693457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/5526358257835693457'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2011/11/mounting-resque-web-in-rails-3-using.html' title='Mounting Resque Web in Rails 3 using Warden, Devise and the Asset Pipeline'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-6769608546949438597</id><published>2011-11-14T13:59:00.001-08:00</published><updated>2011-12-11T03:18:49.019-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='machine learning'/><title type='text'>Text Classification using Support Vector Machines in Ruby</title><content type='html'>&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Support_vector_machines"&gt;Support Vector Machines&lt;/a&gt; represent a group of supervised learning classifiers that will try to predict the outcome of a feature set.  I don't want to bore you with the details but I would recommend that you read Ilya's &lt;a href="http://www.igvita.com/2008/01/07/support-vector-machines-svm-in-ruby/"&gt;post about SVMs&lt;/a&gt;.  It's very informative and it will give you the basics of what you need to understand to get started.&lt;/p&gt;&lt;p&gt;In my case, I've been working on a fairly large scale text classification problem at work when I realized that SVMs would be perfect for the job.  Unfortunately, for our needs the current state of Ruby support for SVMs wasn't where we needed it to be.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I am happy to introduce &lt;a href="https://github.com/febeling/rb-libsvm"&gt;rb-libsvm&lt;/a&gt; to the world!&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;While I can't take credit for the entire gem myself, I did help clean up some pieces of the codebase and gemify the code to make it possible to install from Rubygems.  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Basic Usage Example:&lt;/p&gt;
&lt;script src="https://gist.github.com/1460023.js?file=libsvm.rb"&gt;&lt;/script&gt;

&lt;p&gt;As for the future plans for this gem, one of the biggest features I can think of building would be the Marshaling of the Libsvm::Model object.  This would be a big performance win since you wouldn't have to re-train the classifier.  If you have any other ideas for features, I'd be happy to hear about them.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-6769608546949438597?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/6769608546949438597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2011/11/text-classification-using-support.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/6769608546949438597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/6769608546949438597'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2011/11/text-classification-using-support.html' title='Text Classification using Support Vector Machines in Ruby'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-3088970529009815213</id><published>2010-11-14T10:00:00.000-08:00</published><updated>2011-12-17T09:06:10.895-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Configuring Your Rails 3 Plugin</title><content type='html'>&lt;p&gt;With Railties, I've found writing plugins for Rails 3 to be much easier than before.  Instead of writing a post about how easy it is to create plugins, I figured I would share what I learned about configuring your recently created plugin.  After poking through the Rails code, I came across some interesting things that can really clean up and tighten the code in your Rails projects.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;If you're looking for more of an introduction on Railties and Rails 3 plugins, I recommend that you read a couple of posts before you continue with mine.  These posts should be enough to get you started.&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.igvita.com/2010/08/04/rails-3-internals-railtie-creating-plugins/"&gt;Rails 3 Internals: Railtie &amp; Creating Plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.engineyard.com/blog/2010/extending-rails-3-with-railties/"&gt;Extending Rails 3 with Railties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://edgeapi.rubyonrails.org/classes/Rails/Railtie.html"&gt;Railtie API doc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.themodestrubyist.com/2010/03/01/rails-3-plugins---part-1---the-big-picture/"&gt;Rails 3 Plugins - Part 1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Environment-specific Configuration&lt;/h3&gt;&lt;p&gt;In the past, if you needed any type of configuration to be done in your app you'd more than likely &lt;a href="http://railscasts.com/episodes/85-yaml-configuration-file"&gt;create a yaml file&lt;/a&gt; and stick what you needed in there.  With Rails 3 and Railties, you can move all of your plugin configuration into the environment specific files (application.rb / development.rb / test.rb / production.rb) within your Rails project.  I like this so much more because all of the configuration stays in the same place and you don't have to litter your project with a bunch of yaml files.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Throughout this post, I'll refer to a &lt;a href="https://gist.github.com/665714"&gt;library I created&lt;/a&gt; to use MongoDB as a FIFO cache store.  Let's start with a snippet of  &lt;tt&gt;development.rb&lt;/tt&gt; in one of my current projects.&lt;/p&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1490742.js?file=development.rb"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;The important line in the above code is &lt;tt&gt;config.mongo_fifo&lt;/tt&gt;.  Did you know that you can create any variable that you want within the &lt;tt&gt;config&lt;/tt&gt; object?  The cool thing is that the config object is actually an instance of Rails::Railtie::Configuration and when you specify a method that doesn't exist, that class will actually go through &lt;tt&gt;method_missing&lt;/tt&gt; and add the new method to a hash and assign whatever you wanted to it.  So in the example above, &lt;tt&gt;mongo_fifo&lt;/tt&gt; was added to the application's config hash with a new instance of &lt;tt&gt;MongoFifo&lt;/tt&gt;.  If you need a little more configurability with your methods, like &lt;tt&gt;action_mailer&lt;/tt&gt; above, you can do that too.  So let's say I wanted &lt;tt&gt;mongo_fifo&lt;/tt&gt; to have a slew of config options, I could do this in my Railties class to add that ability:&lt;/p&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1490742.js?file=mongo_fifo.rb"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Coincidentally, that's how ActiveRecord, ActionMailer and ActiveSupport allow for "namespaced" configuration in your Rails app.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Initializers&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Now that we moved the configuration into the specific environment files, we'll be able to access it via our initializers.  I really wish I had more to write here but it's just as easy as accessing a hash. So in my MongoFifo code, I've got one initializer that will create a global variable within the Rails module so that anywhere within my app, I can read and write to my MongoDB cache.  Here's the code from MongoFifo:&lt;/p&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1490742.js?file=initializer.rb"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Get going!&lt;/h3&gt;&lt;p&gt;The beauty of Railties is that you don't necessarily need to develop a whole gem to get the benefits of it's modularity.  In my case, I wrote some code that's a slimmed down version of an ActiveSupport cache store that works with MongoDb's capped collections.  I plopped this file in my &lt;tt&gt;/lib&lt;/tt&gt; directory.  I'm able to put the MongoDB connection configuration in the specific environment (development / test / production) file and keep my overall Rails project that much cleaner.  Give it a go!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-3088970529009815213?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/3088970529009815213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2010/11/configuring-your-rails-3-plugin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/3088970529009815213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/3088970529009815213'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2010/11/configuring-your-rails-3-plugin.html' title='Configuring Your Rails 3 Plugin'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-5851578054931695197</id><published>2010-10-17T15:08:00.000-07:00</published><updated>2011-12-17T09:11:57.100-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='activerecord'/><title type='text'>Using Allocate to Create ActiveRecord Objects When Stubbing find_by_sql</title><content type='html'>&lt;p&gt;&lt;tt&gt;find_by_sql.&lt;/tt&gt;  What a method.  I love the flexibility it gives me when I need to get information from my database with as little fuss as possible.  Yet when I want to stub find_by_sql and return real objects in my rspec tests, a little part of me gets frustrated.  The real pain comes in when you want to have an object with attributes that aren't part of the original class and typically you're going to run into that when you use &lt;tt&gt;find_by_sql&lt;/tt&gt;.&lt;/p&gt;&lt;p&gt;In my particular use case, I had two different tables, the first was a &lt;tt&gt;Shop&lt;/tt&gt; table and the second was a &lt;tt&gt;Job&lt;/tt&gt; table.  In terms of the association, a Shop could have many jobs.  The &lt;tt&gt;find_by_sql&lt;/tt&gt; method was aggregating data from the two tables and creating each instance of the result as Job object.  So it looked something like this:&lt;/p&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1490769.js?file=example.rb"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;I'm sure that you're thinking to yourself that I could have just created some factories or fixtures and then had my tests just query the database for the records.  That probably would have been the easy route, but I was wondering if I could pull this off without the database call. So how do we do this?&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;First, we need to understand how ActiveRecord actually creates new objects.  The &lt;a href="http://paydrotalks.com/posts/89-rubys-classallocate-and-activerecordbasefind"&gt;post&lt;/a&gt; from Peter Bui is a great first step in explaining what goes on when ActiveRecord queries a database and creates a new object. The important thing to note in his article is Ruby's ability to create an object without calling the initialize method via &lt;a href="http://ruby-doc.org/ruby-1.9/classes/Class.html#M001156"&gt;&lt;tt&gt;allocate&lt;/tt&gt;&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;From there it was time to look at the core ActiveRecord code to see what is going on.  Just to note, since Peter's article, ActiveRecord::Base has changed a little bit.  First I started with the code for &lt;a href="http://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb#L429-453"&gt;find_by_sql&lt;/a&gt;:&lt;/p&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1490769.js?file=find_by_sql.rb"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;You can see in this piece of code that ActiveRecord is hitting the database with your custom SQL and then for each result creating a new instance. Now let's see how that &lt;a href="http://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb#L883-890"&gt;instance is created&lt;/a&gt;:&lt;/p&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1490769.js?file=init.rb"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;The first line of code is looking for the appropriate class to use to create the object via &lt;tt&gt;find_sti_class&lt;/tt&gt;.  Then it allocates an object based upon the class name.  The next line is really where the meat is.  &lt;a href="http://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb#L1417-1433"&gt;&lt;tt&gt;init_with&lt;/tt&gt;&lt;/a&gt; will actually then create the object with the attributes that you specify. Sweet! I think we struck gold.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Now that we know about the &lt;tt&gt;init_with&lt;/tt&gt; and &lt;tt&gt;allocate&lt;/tt&gt; methods we can now create real objects to use in our tests if we need attributes outside of what the object provides.  So in the example that I provided above, I could do something like this:&lt;/p&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1490769.js?file=create.rb"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Excellent!  Now I can stub the find_by_sql call and I can create objects that will be in the correct class that I need.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Do note that what I did above is for edge rails.  If you're on 3.0.1 or below you're going to have to do this to create your objects:&lt;/p&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1490769.js?file=runit.rb"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Also, pay attention to the way the hash was created.  You'll need to use strings for the keys otherwise you'll get a bunch of errors.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-5851578054931695197?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/5851578054931695197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2010/10/using-allocate-to-create-activerecord.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/5851578054931695197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/5851578054931695197'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2010/10/using-allocate-to-create-activerecord.html' title='Using Allocate to Create ActiveRecord Objects When Stubbing find_by_sql'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-7204971254565322960</id><published>2010-08-01T11:10:00.000-07:00</published><updated>2010-08-01T11:10:10.450-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>The Rails Way Means Disruption</title><content type='html'>&lt;p&gt;A little less than a month ago, Obie Fernandez posed the question &lt;a href="http://blog.obiefernandez.com/content/2010/07/what-is-the-rails-way-to-you.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed:+obie+(Obie+Fernandez)"&gt;"What is the Rails Way (To You)?"&lt;/a&gt;  For me, it took a little while to ponder that question and generate a response.  This is what I came up with:&lt;/p&gt;

&lt;p&gt;I see the Rails way encompassing two different stakeholders, the first being the individual, myself in this case, and the second being the community.  I can't explain what 'the way' is without first identifying these two groups.&lt;/p&gt;

&lt;p&gt;When talking about the community, I see the Rails way as embracing change.  The Rails community seems to embrace a constant state of mild disruption.  Some of the best corporations can't even deal with change as well as the Rails community.  While some might argue that the precipitation of Rails 3 was a huge disruption, I would say that a Rails 3 type of disruption is quite rare.  Mild disruption allows the community to vet ideas and practices and really reinforce what really works within the realm of web development.  Something like BDD is an example of the reinforcing practices that have grown with the Rails community.&lt;/p&gt;

&lt;p&gt;Personally, what the Rails way means for me is that it can mean anything.  If I need a monolithic ERP system using Rails as my backend, I can do it.  If I need to create a bunch of RESTful web services that are all interconnected, I can.  'The way' means that when I work with Rails, especially Rails 3, I can mold the framework around my needs knowing that Rails has quality baked in from the start.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-7204971254565322960?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/7204971254565322960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2010/08/rails-way-means-disruption.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/7204971254565322960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/7204971254565322960'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2010/08/rails-way-means-disruption.html' title='The Rails Way Means Disruption'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-6437168416716449148</id><published>2010-07-09T11:47:00.000-07:00</published><updated>2010-07-12T07:19:11.565-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mongodb'/><title type='text'>Mongodb Stored Javascript Functions - Ruby Edition</title><content type='html'>&lt;p&gt;I was writing a couple of different analytics applications recently.  My applications did two different things but accessed the same database.  I was wondering if there were a way to store javascript functions so that I could share code between two different applications.  That's when I stumbled across the &lt;a href="http://www.mongodb.org/display/DOCS/Server-side+Code+Execution"&gt;server side code execution&lt;/a&gt; and Mike Dirolf's post on &lt;a href="http://dirolf.com/2010/04/05/stored-javascript-in-mongodb-and-pymongo.html"&gt;stored javascript and pymongo&lt;/a&gt;.  I was hoping for the same type of functionality in the ruby driver as in pymongo, but alas it wasn't.&lt;/p&gt;

&lt;p&gt;In the patch that I submitted to the mongo ruby driver, I added a &lt;a href="http://github.com/mongodb/mongo-ruby-driver/commit/20206bee2b20a5400d1ced1dbc25fcb83aff861b"&gt;couple of functions&lt;/a&gt; that will allow you to add stored Javascript functions to &lt;tt&gt;system.js&lt;/tt&gt; in your database. Let's walk through a use case:&lt;pre class="ruby" name="code"&gt;# Assume we're using the mongo driver and db = test
db = Mongo::Connection.new("localhost").db("test")

# Setup the stored function in MongoDB
db.add_stored_function("sum", "function (x, y) { return x + y; }")

sites = db.collection("sites")
sites.insert({:name =&gt; "Site 1", :admin_count =&gt; 2, :moderator_count =&gt; 3})
sites.find("$where" =&gt; "sum(this.admin_count, this.moderator_count) == 5")

# When we don't need the stored function any more
db.remove_stored_function("sum")

&lt;/pre&gt;This is just one example of how to use the stored functions.  Don't forget that you can use them in map/reduce, eval, and $where clauses.&lt;/p&gt;

&lt;p&gt;Unlike the pymongo version, I did not create an instance of the &lt;tt&gt;system.js&lt;/tt&gt; collection in the db instance.  This would have allowed us to use introspection to actually make method calls instead of having to write out an eval method.  (See how it works for pymongo at the end of Mike's &lt;a href="http://dirolf.com/2010/04/05/stored-javascript-in-mongodb-and-pymongo.html"&gt;post&lt;/a&gt;.)  In my use cases, I used the stored functions within where and map_reduce calls and didn't really need to use eval.  If other people need it, I could definitely change it up.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-6437168416716449148?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/6437168416716449148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2010/07/mongodb-stored-javascript-functions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/6437168416716449148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/6437168416716449148'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2010/07/mongodb-stored-javascript-functions.html' title='Mongodb Stored Javascript Functions - Ruby Edition'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-5973733687398036581</id><published>2010-06-14T06:13:00.000-07:00</published><updated>2011-12-17T09:20:37.224-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mongoid'/><title type='text'>Mongoid Versioning - A Run Down</title><content type='html'>&lt;p&gt;In past Rails apps that I've built, I've used plugins such as &lt;a href="http://github.com/laserlemon/vestal_versions"&gt;vestal version&lt;/a&gt; or &lt;a href="http://rubygems.org/gems/acts_as_versioned"&gt;acts_as_versioned&lt;/a&gt; to version my ActiveRecord models in MySQL.  Using Mongoid, you get that functionality built-in without the need for extra gems / plugins.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;For the purposes of this discussion, let's use the following code as a reference point:&lt;/p&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1490792.js?file=model.rb"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;So.... what really goes on when you put that innocent &lt;tt&gt;include Mongoid::Versioning&lt;/tt&gt; in your model?  I'm glad you asked: &lt;ul&gt;&lt;li&gt;A field named &lt;tt&gt;version&lt;/tt&gt; of type Integer is added.&lt;/li&gt;
&lt;li&gt;An &lt;tt&gt;embeds_many&lt;/tt&gt; association named &lt;tt&gt;versions&lt;/tt&gt; is created with the &lt;tt&gt;:class_name&lt;/tt&gt; option set as your current class.  Using our example above the generated code would look like this:  &lt;tt&gt;embeds_many :versions, :class =&amp;gt; Post&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;tt&gt;before_save&lt;/tt&gt; callback is created that takes care of versioning the document.&lt;/li&gt;
&lt;/ul&gt;Now this stuff came straight from the &lt;a href="http://github.com/durran/mongoid/blob/master/lib/mongoid/versioning.rb"&gt;documentation&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Now that we've got the basics established lets go through some use cases that will better illustrate how versioning works.&lt;ul&gt;&lt;li&gt;Let's say I have an idea for a new post and I create one with just a title.  Then at some point in the future I finally get around to writing the content and save it to MongoDB.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1490792.js?file=operation.rb"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
Since we've completed 2 save operations, there will be two versions in the database and the document look something like this:&lt;script src="https://gist.github.com/1490792.js?file=doc.json"&gt;&lt;/script&gt;&lt;br /&gt;
Notice in the versions array that the content field is actually not there.  If a default is not defined on your field and you do not create anything the field will not be created in the document.&lt;/li&gt;
&lt;li&gt;Now we've got our newly finished post in MongoDB and it's available for the world to see.  At some point, a user decides to comment on our post and we need to save that to our document.&lt;br /&gt;
&lt;script src="https://gist.github.com/1490792.js?file=operation1.rb"&gt;&lt;/script&gt;&lt;br /&gt;
The document in the database will now look like this:&lt;script src="https://gist.github.com/1490792.js?file=doc1.json"&gt;&lt;/script&gt;&lt;br /&gt;
Notice that in this instance that a new version was not created when we saved an embedded document.  This is great when you've got a setup like this and you don't want to create multiple versions.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;&lt;h3&gt;Gotchas &amp; Workarounds&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Take into consideration how you're going to create your embedded documents&lt;/b&gt; - By this I mean if you were to do something like this:&lt;script src="https://gist.github.com/1490792.js?file=operation2.rb"&gt;&lt;/script&gt;&lt;br /&gt;
Mongoid will not only create a new comment but will also create a new version of the entire document&lt;/li&gt;
&lt;li&gt;&lt;b&gt;The entire contents of the document is saved in the version&lt;/b&gt; - When embedding something like comments on a post, depending on how many comments your had, that array of comments could get pretty big.  Now if you were to update a field on the post and it had a large amount of comments, all of the comments would get saved in the old and new versions.  Again depending on the size of the comments, this could quickly start taking up large amounts of disk space&lt;/li&gt;
&lt;li&gt;&lt;b&gt;You can skip creating a version if need be&lt;/b&gt; - I wouldn't recommend this if you're trying to keep track of documents, but it can be done.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1490792.js?file=skip.rb"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
Note that &lt;tt&gt;:revise&lt;/tt&gt; is the name of the method in &lt;tt&gt;Mongoid::Versioning&lt;/tt&gt; and that I did this on the class Post and not an instance.  I'm not sure if you can skip a callback on an instance.  I'll have to look into that.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;That's all I've got for now.  As I continue to learn more about mongoid, I'll continue to post on this blog.  Maybe I'll even turn this into a larger series on the ins and outs of using mongoid.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-5973733687398036581?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/5973733687398036581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2010/06/mongoid-versioning-run-down.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/5973733687398036581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/5973733687398036581'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2010/06/mongoid-versioning-run-down.html' title='Mongoid Versioning - A Run Down'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-8756332220331195966</id><published>2010-06-01T09:00:00.000-07:00</published><updated>2011-12-11T03:11:55.685-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>File Uploads with Rails 3, Plupload, and CarrierWave</title><content type='html'>&lt;p&gt;You may know that I've been working on &lt;a href="http://bethebuilders.com/"&gt;Be The Builders&lt;/a&gt; for a while now.  When it came time to build in some functionality for file uploads, I just started to cringe. I searched for a while on &lt;a href="http://railstips.org/blog/archives/2009/07/21/uploadify-and-rails23/"&gt;ways&lt;/a&gt; &lt;a href="http://timmyc.posterous.com/uploadify-on-rails-with-paperclip"&gt;to&lt;/a&gt; &lt;a href="http://casperfabricius.com/site/2009/03/26/uploading-multiple-files-with-progress-indicator-using-jquery-flash-and-rails/"&gt;get&lt;/a&gt; it done, but I was hoping for something a little easier without the need for middleware.  I came across &lt;a href="http://plupload.com/"&gt;Plupload&lt;/a&gt; and figured I'd give it go for integrating into Rails 3. Ultimately, it was pretty easy and painless.  I'll walk you through the process.  Just to note, I was using CarrierWave to handle the file uploads on the Rails side and Mongoid as my ORM.&lt;/p&gt;

&lt;p&gt;
&lt;ul&gt;

&lt;li&gt;&lt;b&gt;Step 1&lt;/b&gt; - Download Plupload and copy the js folder into your javascripts directory.  I'm not going to go through all of the options for Plupload, just what it takes to get you going.  You can figure out all of the options in Plupload's &lt;a href="http://www.plupload.com/documentation.php"&gt;documentation&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;&lt;b&gt;Step 2&lt;/b&gt; - Add the appropriate &lt;tt&gt;javascript_include_tag&lt;/tt&gt; to your view.  Since I only had one action that was going to handle the creation of the images, I just put it in my &lt;tt&gt;new.html.erb&lt;/tt&gt; view.&lt;script src="https://gist.github.com/1444714.js?file=javascript_include.html.erb"&gt;&lt;/script&gt;&lt;/li&gt;

&lt;li&gt;&lt;b&gt;Step 3&lt;/b&gt; - Now comes the part where we need to add some of the javascript to get the Plupload controls to show up on the page.  I followed the &lt;a href="http://www.plupload.com/example_custom.php"&gt;custom example&lt;/a&gt; that was posted on their website. The important points that you need to know about the javascript below is the &lt;tt&gt;multipart&lt;/tt&gt; and &lt;tt&gt;multipart_params&lt;/tt&gt; options.  Without those, CarrierWave is going to throw all sorts of errors when you try to upload the file.  Also important to note is the use of the authenticity token in the &lt;tt&gt;multipart_params&lt;/tt&gt;.  It's just something that needs to be done to keep the session legit &lt;script src="https://gist.github.com/1444714.js?file=script_tag.html"&gt;&lt;/script&gt; The html in the view is the same as the Plupload documentation example.&lt;/li&gt;

&lt;li&gt;&lt;b&gt;Step 4&lt;/b&gt; - Get your CarrierWave uploader mounted to your model.  In this example, this is what I have: &lt;script src="https://gist.github.com/1444714.js?file=asset.rb"&gt;&lt;/script&gt; Now if you're using Rails 3 like I am, make sure you do a &lt;tt&gt;require 'carrierwave'&lt;/tt&gt; and &lt;tt&gt;require 'carrierwave/orm/mongoid'&lt;/tt&gt; at the top of your application.rb file.  Also, you'll have to pull the latest code from github.  At the time of this writing, the carrierwave gem does not support Rails 3.&lt;/li&gt;

&lt;li&gt;&lt;b&gt;Step 5&lt;/b&gt; - Code up the create action in your controller.  It could be something as simple as this: &lt;script src="https://gist.github.com/1444714.js?file=create.rb"&gt;&lt;/script&gt; Mine doesn't look that that, it's a little messy and I didn't want to paste all of it here.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Step 6&lt;/b&gt; - Relax and have a much deserved drink.  You're done!&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;I found this process to be extremely easy and with Plupload I now have the option to use many different methods (flash, silverlight, html5, etc) to get files uploaded to Rails.  Hope this quick tutorial helps you guys.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-8756332220331195966?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/8756332220331195966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2010/06/file-uploads-with-rails-3-plupload-and.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/8756332220331195966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/8756332220331195966'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2010/06/file-uploads-with-rails-3-plupload-and.html' title='File Uploads with Rails 3, Plupload, and CarrierWave'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-4650086169540035183</id><published>2010-05-25T09:00:00.000-07:00</published><updated>2010-05-25T09:00:05.913-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>The Mythical Man-Month</title><content type='html'>&lt;p&gt;What is the mythical man-month?  If you're familiar with the analogy that you can't add more people to a pregnancy to make it go faster (I think that's how it goes), then you're already familiar with the mythical man-month.  It's a book about software development and project management written by Frederick Brooks, Jr. during his time at IBM.  I know this gets quoted all of the time, but just bear with me.  &lt;/p&gt;

&lt;p&gt;While the book is a little old, I think every project manager, developer, or individual associated with software development should read.  While some of the non-tech people may get lost in the acronyms, just encourage them to keep reading past it to get a gist of the processes.  You can even tell them to skip to the back of the book with the outline.  With many of the buzz words being thrown around today like Agile, eXtreme Programming, etc., I think this book provides a solid base for anyone to understand the onus behind the other management frameworks.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;My takeaways from the book:&lt;/b&gt;
&lt;ul&gt;&lt;li&gt;People and months are not interchangeable.&lt;/li&gt;&lt;li&gt;Communicate early and often.&lt;/li&gt;&lt;li&gt;Scope, time, and budget.  Pick two.  (Ok this one was more of my own, but it's well represented in the book.)&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;Wikipedia has &lt;a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month"&gt;much more&lt;/a&gt; on this book than I wanted to cover here.  Don't let that summary fool you into thinking that you know everything the book has to offer.  The real value is in the stories and knowledge of Brooks as he has learned them over the course of his career.  But if you're that impatient, as I've mentioned before, then you can skip to the back of the book and everything is summarized in an outline format.&lt;/p&gt;

&lt;p&gt;I've encouraged all of the non-tech people in my startup, &lt;a href="http://bethebuilders.com/"&gt;Be The Builders&lt;/a&gt;, to read this.  So go pick up a copy of &lt;a href="http://www.amazon.com/gp/product/B000OZ0N6M?ie=UTF8&amp;tag=neovintage-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B000OZ0N6M"&gt;The Mythical Man-Month&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=neovintage-20&amp;l=as2&amp;o=1&amp;a=B000OZ0N6M" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;.  You and your team won't be disappointed.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-4650086169540035183?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/4650086169540035183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2010/05/mythical-man-month.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4650086169540035183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4650086169540035183'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2010/05/mythical-man-month.html' title='The Mythical Man-Month'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-2139077545820127688</id><published>2010-05-18T16:22:00.000-07:00</published><updated>2010-05-18T16:22:16.023-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mongoid'/><category scheme='http://www.blogger.com/atom/ns#' term='quicktip'/><category scheme='http://www.blogger.com/atom/ns#' term='mongodb'/><title type='text'>Upgrading to Mongoid Beta 6</title><content type='html'>&lt;p&gt;Just as a quick note, I had upgraded from Mongoid 2.0 Beta 4 to Mongoid 2.0 Beta 6 when I ran into some weird errors like:&lt;br&gt;&lt;tt&gt;ActionView::Template::Error (Database should be a Mongo::DB, not NilClass)&lt;/tt&gt;&lt;br&gt;and&lt;br&gt;&lt;tt&gt;Mongoid::Errors::InvalidDatabase: Mongoid::Errors::InvalidDatabase&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;Essentially, you can keep your Mongoid code the way it is, but you need to put this line of code at the top of your &lt;tt&gt;config/application.rb&lt;/tt&gt;:&lt;pre name="code" class="ruby"&gt;require 'mongoid/railtie'&lt;/pre&gt;I hope that helps someone out there.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-2139077545820127688?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/2139077545820127688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2010/05/upgrading-to-mongoid-beta-6.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/2139077545820127688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/2139077545820127688'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2010/05/upgrading-to-mongoid-beta-6.html' title='Upgrading to Mongoid Beta 6'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-626824900541751289</id><published>2010-05-13T10:39:00.000-07:00</published><updated>2010-05-13T10:39:24.466-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='mongodb'/><title type='text'>Tips for working with MongoDB &amp; Mongoid</title><content type='html'>&lt;p&gt;As with anything I do on this blog, it's to make sure that I don't forget what I just learned.  Below are some of the things that I've learned while using Mongoid on my current project, &lt;a href="http://bethebuilders.com/"&gt;Be The Builders&lt;/a&gt;.  Just to note, I'm working off the current beta version of Mongoid 2.0.0.beta4 and MongoDB 1.4.0.&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Document != Embedded Document&lt;/b&gt; - This seem pretty obvious, but it didn't to me at first.  Be The Builders is my first attempt at using a document oriented db, and since I came from a very heavy relational db world (read: business intelligence), this kinda screwed me up.  Once you write &lt;tt&gt;embedded_in&lt;/tt&gt; in your model, that model then becomes an embedded document and some things from documents don't apply any more:&lt;ul&gt;&lt;li&gt;Mongoid::Versioning&lt;/li&gt;&lt;li&gt;indexes - Well sorta, you'll see later that you can get around this&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Don't create indexes on Embedded Docs! (sorta)&lt;/b&gt; - When I initially started to create my Mongoid models, I thought I could do something like this:&lt;pre name='code' class='ruby'&gt;
class Post 
  include Mongoid::Document
  field :author
  field :text
  field :publish_date, :type =&gt; Date
  embeds_many :comments
  index [:author, :asc]
end

class Comment
  include Mongoid::Document
  field :author
  field :text
  field :publish_date, :type =&gt; Date
  embedded_in :post, :inverse_of =&gt; :comments
  index [:publish_date, :desc]
end&lt;/pre&gt;Unfortunately, I kept getting an InvalidCollection Error from Mongoid and for the life of me couldn't figure it out.  I knew MongoDB allowed its users to &lt;a href="http://www.mongodb.org/display/DOCS/Indexes#Indexes-EmbeddedKeys"&gt;create indexes&lt;/a&gt; on an embedded document.  After a little testing, I came up with this instead:&lt;pre name="code" class="ruby"&gt;
class Post 
  include Mongoid::Document
  field :author
  field :text
  field :publish_date, :type =&gt; Date
  embeds_many :comments
  index [:author, :asc]
  index ["comments.publish_date", :desc]
end

class Comment
  include Mongoid::Document
  field :author
  field :text
  field :publish_date, :type =&gt; Date
  embedded_in :post, :inverse_of =&gt; :comments
end&lt;/pre&gt;Lesson:  If you want to create indexes on embedded documents, create the index in the parent document.  Then use a string to denote what you want indexed.  
&lt;/li&gt;&lt;li&gt;&lt;b&gt;Don't hesitate to drop into the lower level 'mongo' driver&lt;/b&gt; - There's a lot that Mongoid already does that's not even listed on its website, like cursors.  Yet, I find that I want to do things like map reduce on a collection.  Fortunately for us, the mongo driver is a requirement for Mongoid.  So when you call &lt;tt&gt;Post.collection&lt;/tt&gt; you actually get a collection object from the mongo driver which then we can run &lt;tt&gt;map_reduce&lt;/tt&gt;.  Chaining this example together, it would look something like this:&lt;pre name="code" class="ruby"&gt;
m = 'function(){ this.tags.forEach( function(z){ emit( z , { count : 1 } ); } ); };'
r = &lt;&lt;-REDUCE
function( key , values ){
  var total = 0;
  for ( var i=0; i &lt; values.length; i++ )
    total += values[i].count;
  return { count : total };
};
REDUCE
Post.collection.map_reduce(m, r)
&lt;/pre&gt;There are plenty more functions that can be found in the mongo driver, but if you're looking for map_reduce, you can find it in the &lt;a href="http://www.mongodb.org/display/DOCS/MapReduce"&gt;main docs&lt;/a&gt; and the &lt;a href="http://api.mongodb.org/ruby/1.0.1/Mongo/Collection.html#map_reduce-instance_method"&gt;RDoc&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;That's all I've got for now.  When I figure out more you can bet that I will be posting it here.  MongoDB / Mongoid have been a joy to work with.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-626824900541751289?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/626824900541751289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2010/05/tips-for-working-with-mongodb-mongoid.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/626824900541751289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/626824900541751289'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2010/05/tips-for-working-with-mongodb-mongoid.html' title='Tips for working with MongoDB &amp; Mongoid'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-4292349548070395038</id><published>2010-04-19T08:31:00.000-07:00</published><updated>2010-04-19T08:31:02.376-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Templates in Rails 3</title><content type='html'>&lt;p&gt;Templates have been around since version 2.3.0 of Rails.  They're great at getting an application started quickly with many of the gems, plugins, and code you need.  Pratik has an excellent &lt;a href="http://m.onkey.org/2008/12/4/rails-templates"&gt;high level overview&lt;/a&gt; on the feature when it was first released.  Now that Rails 3 is on the horizon, I just wanted to point out some of the new things that you can do with your templates.&lt;/p&gt;

&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;As I'm sure you know, Rails 3 brings with it a number of rewrites to many areas of the codebase.  The code that handles the templates is no different.  What I found interesting is that the code that handles many of the actions within the templates comes from both Railties and Thor.  &lt;/p&gt;

&lt;h3&gt;What's the same since 2.3&lt;/h3&gt;
&lt;p&gt;Many of the commands are the same from the previous iteration of the template feature.  They include:
&lt;ul&gt;
&lt;li&gt;&lt;tt&gt;gem&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;plugin&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;initializer&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;rakefile&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;generate&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;run&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;route&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;inside&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;ask&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;yes?&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;no?&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;git&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;environment&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;run_ruby_script&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;gsub_file&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;append_file&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
If you want more detail on the specifics of these commands check out Pratik's &lt;a href="http://m.onkey.org/2008/12/4/rails-templates"&gt;post&lt;/a&gt; on the matter.
&lt;/p&gt;

&lt;h3&gt;What's new&lt;/h3&gt;
&lt;p&gt;
 Most of the new stuff comes from Thor and is not Rails specific: 
 &lt;ul&gt;
  &lt;li&gt;&lt;tt&gt;add_source&lt;/tt&gt; - Adds a source line to the top of your Gemfile&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;apply&lt;/tt&gt; - Loads an external file and then executes it.&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;thor&lt;/tt&gt; - You can run any thor commands that you want within your template. &lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;copy_file&lt;/tt&gt; - copies a file to a directory that you name&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;get&lt;/tt&gt; - will download files and place in a directory/file you name&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;template&lt;/tt&gt; - ERB template that you specify and will get executed&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;chmod&lt;/tt&gt; - Changes mode&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;prepend_file&lt;/tt&gt; - Prepends text to file&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;inject_into_class&lt;/tt&gt; - injects text into a given class&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;inject_into_file&lt;/tt&gt; - injects text into file&lt;/li&gt; 
  &lt;li&gt;&lt;tt&gt;remove_file&lt;/tt&gt; - deletes files and entire directories&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;create_file&lt;/tt&gt; - creates an empty file&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;empty_directory&lt;/tt&gt; - creates an empty directory&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;directory&lt;/tt&gt; - copies directories.  It's also recursive.&lt;/li&gt;
 &lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;That's it!  If you need more detailed information on how these functions work, check out the rdoc.  The rdoc for the Thor commands be found &lt;a href="http://rdoc.info/rdoc/wycats/thor/blob/f9631815b7ada075d866d29e4c2dffaa15c18a92/Thor/Actions.html"&gt;here&lt;/a&gt; and the Rails template commands can be found &lt;a href="http://github.com/rails/rails/blob/master/railties/lib/rails/generators/actions.rb"&gt;here&lt;/a&gt; I'm pretty excited about these changes and they will definitely help me clean up my templates.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-4292349548070395038?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/4292349548070395038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2010/04/templates-in-rails-3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4292349548070395038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4292349548070395038'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2010/04/templates-in-rails-3.html' title='Templates in Rails 3'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-4050314894222865515</id><published>2010-04-02T10:24:00.000-07:00</published><updated>2010-04-02T10:39:24.335-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wordpress'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Setting up a Slice with Wordpress</title><content type='html'>&lt;p&gt;The whole point of this post is to get Wordpress installed on your slice at &lt;a href="http://slicehost.com/"&gt;Slicehost&lt;/a&gt; as quickly as possible.  This was my first time doing so and I figured I should create a shell script to complete the process if my slice ever crashed and burned.  Skip to the bottom if you want to get right to it.&lt;/p&gt;

&lt;p&gt;I love &lt;a href="http://slicehost.com"&gt;Slicehost&lt;/a&gt;.  The plans are relatively inexpensive and you know what you're going to get.  Recently, my wife wanted to setup a blog and I really didn't feel comfortable setting it up for her on a shared host. She likes it when websites are responsive, who doesn't.&lt;/p&gt;

&lt;p&gt;I wanted to keep my costs to a minimum on slicehost, so I opted for the 256 slice.  That being said, I needed to keep the memory usage as low as possible.  That meant that Apache was out the door and in came nginx.  It's been a while since I've had to install php.  Let's face it, I'm a ruby guy.  Anyway, I'll review the setup and then tell you what the install script does and the assumptions made.&lt;/p&gt;

&lt;h3&gt;The Setup&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PHP 5.3.1&lt;/li&gt;
&lt;li&gt;PHP-fpm 0.6&lt;/li&gt;
&lt;li&gt;Wordpress 2.9.2&lt;/li&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Assumptions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Youre logged in as root&lt;/li&gt;
&lt;li&gt;Using Ubuntu 9.10&lt;/li&gt;
&lt;li&gt;Starting from a newly created slice&lt;/li&gt;
&lt;li&gt;You have a hostname to use for the install&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;What are steps in the bash script?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Collect new passwords for root account, a new user account, and the mysql database&lt;/li&gt;
&lt;li&gt;Collect the hostname from the terminal&lt;/li&gt;
&lt;li&gt;Reset the root password&lt;/li&gt;
&lt;li&gt;Create the new user and it to the sudo list&lt;/li&gt;
&lt;li&gt;Update sshd configuration based on &lt;a href="http://articles.slicehost.com/assets/2007/9/4/sshd_config.txt"&gt;this configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Update iptables&lt;/li&gt;
&lt;li&gt;Upgrade the system&lt;/li&gt;
&lt;li&gt;Install needed libraries to compile php&lt;/li&gt;
&lt;li&gt;Download PHP 5.3.1, PHP-FPM, and libevent&lt;/li&gt;
&lt;li&gt;Patch PHP with PHP-FPM (more info on php-fpm &lt;a href="http://github.com/dreamcat4/php-fpm"&gt;here&lt;/a&gt;, &lt;a href="http://php-fpm.org/"&gt;here&lt;/a&gt; and &lt;a href="http://interfacelab.com/nginx-php-fpm-apc-awesome/"&gt;here&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Compile PHP and install&lt;/li&gt;
&lt;li&gt;Create config file for nginx&lt;/li&gt;
&lt;li&gt;Install Wordpress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://gist.github.com/353406"&gt;Get the bash script&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enjoy the script!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-4050314894222865515?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/4050314894222865515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2010/04/setting-up-slice-with-wordpress.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4050314894222865515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4050314894222865515'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2010/04/setting-up-slice-with-wordpress.html' title='Setting up a Slice with Wordpress'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-4712466693026791291</id><published>2009-10-15T11:40:00.000-07:00</published><updated>2010-04-02T10:39:45.231-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>How to hire the right people</title><content type='html'>&lt;p&gt;Being in business school is great.  We get to learn about all sorts of topics like economics, marketing, and even organizational development.  The one thing that not all students get to learn about is how to hire the right person for the job.&lt;/p&gt;

&lt;p&gt;Since I love being a part of startups, especially software startups, I get a lot of people in the business school asking me for advice when it comes to hiring programmers and developers for their businesses.  Outside of telling them that they should really have a technical co-founder on the team, I try to give them some advice based on my past experiences.&lt;/p&gt;

&lt;p&gt;In one of my past experiences, I was brought on to a team to manage a couple of developers.  
Unfortunately, I was brought on to the process a little too late.  When I was finally debriefed on what was going on, I found out that all of the developers had been hired, and without my input.  The process for hiring developers was just a standard 1 hour interview.  At first I didn't think anything of it but as the project progressed, cracks started to show in the team.  For example, I had one individual who would always promise to do a set of tasks by the end of the day, but then at every status meeting the next day, without fail, some issue came up that prevented him from completing it.  His excuses were alway very long winded and convoluted.  After a week of this, I found out from other developers on the team that the individual in question kept pestering the other developers to help them solve very simple issues.  Not only was this not productive for the other developers but for the project as a whole.  Since the project was so short, I didn't have the time to let the person go and hire someone new.  I had to just manage around the problem individual.  It was at that point, I wished I was part of the hiring process.&lt;/p&gt;

&lt;p&gt;Take aways:
&lt;ul&gt;&lt;li&gt;Don't think that an hour interview is going to tell you if the interviewee is a good candidate.&lt;/li&gt;
&lt;li&gt;You're gonna have to take the time to get to know someone.&lt;/li&gt;
&lt;li&gt;Have the person work on small tasks or projects before actually bringing them on. (&lt;a href="http://www.codinghorror.com/blog/archives/000226.html"&gt;On Interviewing Programmers&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-4712466693026791291?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/4712466693026791291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2009/10/how-to-hire-right-people.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4712466693026791291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4712466693026791291'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2009/10/how-to-hire-right-people.html' title='How to hire the right people'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-8393505122480705088</id><published>2009-07-07T10:15:00.000-07:00</published><updated>2009-07-07T10:15:02.014-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strategy'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>How do you know when your software meets your needs?</title><content type='html'>&lt;p&gt;As a Senior Project Manager at Sparkseed, my job encompasses managing our staff of interns, developing the company's long-term strategy, as well as mentoring any of the Sparkseed funded ventures.  Recently, I was asked to mentor one venture, &lt;a href="http://www.capitalgoodfund.org/"&gt;Capital Good Fund&lt;/a&gt; (CGF), on what software package to use to implement their back end systems.  The team was struggling to determine what package could meet their needs now and into the future.  It seemed like a very large task, but I was definitely up for it.&lt;/p&gt;

&lt;p&gt;After a few initial emails to get a background on CGF and its mission, I jumped onto a call with one of the founders.  One of the very first things that we did was talk about all of the software platforms that they were considering, like MIFOS, Salesforce.com, and Highrise, just to name a few.  Almost immediately after identifying all of the software platforms that were up for consideration, the conversation turned into listing all sorts of features that CGF might need.&lt;/p&gt;

&lt;p&gt;The key word to point out is "might."  Just like with any software development project, I was finding feature creep.  We'd discuss one feature and that would certainly lead into another.  There were so many things that the team at CGF wanted the software to do that the platform was beginning to look over-complicated.&lt;/p&gt;

&lt;p&gt;In terms of providing a solution for CGF, I recommended that we stop talking about technology all together and focus on the core process for the business. In this case, the core business function was the loan process.  We then drilled into the loan cycle, how the loans are made, who has authority to make loans, and how the loan gets paid back.  At this point, we had a clear understanding of how the business worked and who was involved.&lt;/p&gt;

&lt;p&gt;Taking the current staff capabilities into consideration, I was able to recommended a system that had the bare minimum to meet the need of tracking the loan and the various touch points the loan officers would have with their customers.&lt;/p&gt;

&lt;p&gt;Side Note:  As with any software package, it should be robust enough that if you outgrow the software or want to manipulate it in other ways, the software should let you access the raw data.&lt;/p&gt;
 
&lt;h3&gt;Key Lessons learned:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Always pull back. Ask the question "what operational problem am I trying to solve?"&lt;/li&gt;
&lt;li&gt;Only use as much software is needed to get the job done.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;References:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.tomcoyner.com/right_mind.htm"&gt;The Right Mind-set for Managing Information Technology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.itarchitect.co.uk/articles/display.asp?id=371"&gt;Avoiding the Icebergs&lt;/a&gt; - Talks about software architecture but still pertinent&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.itarchitect.co.uk/articles/display.asp?id=377"&gt;Avoiding the Icebergs #2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Scope_creep"&gt;Scope Creep&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-8393505122480705088?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/8393505122480705088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2009/07/how-do-you-know-when-your-software.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/8393505122480705088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/8393505122480705088'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2009/07/how-do-you-know-when-your-software.html' title='How do you know when your software meets your needs?'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-1095482030201848094</id><published>2009-06-23T16:05:00.000-07:00</published><updated>2009-06-23T16:07:39.600-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Getting Up To Speed in Objective-C / Cocoa</title><content type='html'>&lt;p&gt;Since playing around with MacRuby, I figured, to keep myself relevant in the programming space I should learn Objective-C / Cocoa.  That and it seems every person that has touched Ruby is now hopping on the Objective-C bandwagon.  EVERYONE WANTS TO BE AN IPHONE DEVELOPER!  Just kidding.&lt;/p&gt;

&lt;p&gt;&lt;h3&gt;My requirements for learning materials:&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;I really didn't want to pay for anything, but I'll have to if I must.&lt;/li&gt;
&lt;li&gt;I wanted all my materials to be online or pdf.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;Basically my requirements cut out things like classes and most screencasts.&lt;/p&gt;

&lt;p&gt;&lt;h3&gt;This is what I ended up with (its also in order of operation):&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;a href="https://peepcode.com/products/objective-c-for-rubyists"&gt;Peepcode Objective C Screencast:&lt;/a&gt;&lt;/b&gt;  I have purchased a number of his screencasts in the past and have been pleased, so I figured why not get this one, &lt;strong&gt;it was only $9&lt;/strong&gt;.  It was a well put together screencast but I felt like something was lacking.  That, or I was being lazy.  Yet I found that I wanted more of an introduction to some of the major frameworks on Mac OS X and the iPhone. Uh oh, there's that word again, 'iPhone'.  I think if you're just looking for an introduction into the semantics of the language, start here.  Otherwise, like me you'll move on to the Stanford Class.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://www.stanford.edu/class/cs193p/cgi-bin/index.php"&gt;CS193P - iPhone Application Programming:&lt;/a&gt;&lt;/b&gt; This class was great, and on top of it, it was free!  Now I wasn't specifically looking for iPhone application development, but the topics covered were still very pertinent to developing on Mac OS X.  I found the instruction to be be very good.  I would recommend this course for anyone that has some programming background but finds the classroom setting a little easier to work with.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://www.cocoadevcentral.com/"&gt;Cocoa Dev Central:&lt;/a&gt;&lt;/b&gt; I wish I would have known about this before I started down the path of the Peepcode screencast.  Yet since I purchased the Peepcode screencast, a reference was made to this site.  I guess I wouldn't have known about it had I not gotten the screencast.  Sounds like a paradox to me.  Anyway, the site was great and you could find anything you needed to if you're learning about the intricacies of Objective-C and Cocoa.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;After thoroughly going through all of the material I've mentioned above, I actually did decide to write an iPhone app.  I decided against releasing it to the App Store because, well, I think it wasn't the best quality.  Anyway, I don't claim to be a master at Objective-C, but I know enough to be dangerous.  I believe that going through the above references will make you just as dangerous!&lt;/p&gt;

&lt;p&gt;If you're an absolute &lt;strong&gt;beginner&lt;/strong&gt;, I would recommend starting with the Stanford class first, and then going over to the Cocoa Dev Central site and skipping the Peepcode screencast all together.  Now if that's still too much for you, well you need to start all the way at the beginning by &lt;a href="http://publications.gbdirect.co.uk/c_book/"&gt;learning C&lt;/a&gt;.  At least you haven't burned any money on education.&lt;/p&gt;

&lt;p&gt;&lt;h3&gt;If you do decide to write an app for the iPhone here are some posts that I found useful:&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://iphonedevelopment.blogspot.com/2009/05/opengl-es-from-ground-up-table-of.html"&gt;iPhone Development: OpenGL ES from the Ground Up: Table of Contents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.remobjects.com/blogs/mh/2009/04/11/displaying_variably_sized_text_cells_in_"&gt;Displaying Variably-Sized Text Cells in a UITableView&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://iphone.galloway.me.uk/2009/02/sqlite-persistent-objects/"&gt;SQLite Persistent Objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/251155/persisting-dates-to-sqlite3-in-an-iphone-application"&gt;Persisting Dates to SQLite3 in an iPhone Application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;More links can be found @ my &lt;a href="http://delicious.com/neovintage/iphone"&gt;delicious account&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-1095482030201848094?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/1095482030201848094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2009/06/getting-up-to-speed-in-objective-c.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/1095482030201848094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/1095482030201848094'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2009/06/getting-up-to-speed-in-objective-c.html' title='Getting Up To Speed in Objective-C / Cocoa'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-2366463877241476843</id><published>2009-03-04T09:06:00.000-08:00</published><updated>2009-06-21T13:07:56.836-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strategy'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Your web app sucks because it doesn't give your users good metrics</title><content type='html'>&lt;p&gt;Plain and simple, your web app sucks because it doesn't have good metrics.  Now I'm not talking about code coverage or anything internal to your operation.  I'm talking about summary statistics for the end users of the application relative to how they interact with it.  My case is this, developers hold themselves up to a very high standard when developing their apps using frameworks like &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;Test Driven Development (TDD)&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Extreme_programming"&gt;Extreme Programming (XP)&lt;/a&gt;.  If you can take some of the philosophies from those frameworks, TDD and XP, and provide measures for your users, we'll see much happier users in the end who will reap large benefits from your application.&lt;/p&gt;

&lt;p&gt;&lt;h3&gt;Why Metrics Make Sense&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Your Users' Standpoint:&lt;/b&gt;Why wouldn't users of your site want the same procedures that developers use to build quality sites?! Continuous feedback, communication, and simplicity.  All three are values within XP and are targeted toward increasing productivity. By having a measure to gauge how you're doing, as a user, I can get more value out of using your application and react to any changing conditions.&lt;/li&gt;&lt;li&gt;&lt;b&gt;The web app owner's standpoint:&lt;/b&gt;  Let's face it, the whole reason you're writing web apps is to get something back.  Whether its money or a learning experience.  Let's take the money side of that argument.  Analytics and metrics can be a boon for your bottom line. Take Twitter for example.  With recent articles floating on the web about it's new BizDev guy, Kevin Thau has said that they'll &lt;a href="http://www.forbes.com/2009/02/14/twitter-analytics-business-technology-ebiz_0215_twitter.html"&gt;sell analytics to enterprises to make money&lt;/a&gt;.  That's a lot of money to make to cover the cost of running Twitter. &lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;&lt;h3&gt;General steps that you can take to generate good analytics for your data:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Define your core user experience.&lt;/b&gt;  The important part of defining the user experience is understanding the reason why they're using your service in the first place.  Are they trying to manage projects, track their finances, or connect with friends?  This part may take some research on your end because despite all of our best efforts sometimes the users of our web apps have totally different goals than what we expect.  That being said, consider sending out surveys to a sample population of your users or analyze your Apache web logs for usage patterns. If you're still not sure where to start, try holding a focus group on Skype to at least get you going in the right direction for the surveys.&lt;/li&gt;&lt;li&gt;&lt;b&gt;When trying to summarize multiple observations, consider using nonaveraging metrics (maximums, variance, counts).&lt;/b&gt;  According to recent research from Shugan and Mitra @ the University of Florida, they found that although averaging metrics may sound great theoretically (like sales per user, or cost per user), most uses of metrics (benchmarking, monitoring, allocating resources, diagnosing problems, etc) require that the metrics provide information (explained variance) about all of the outcomes that you're measuring.  For example, a simple count of the number of new products from a company might convey information about a firm's ability to innovate. &lt;/li&gt;&lt;li&gt;&lt;b&gt;Keep the number of metrics relevant and to a minimum.&lt;/b&gt;  Although I'm advocating for including some type of metric within your application, I also want to caution against providing too many.  A danger exists whereby you can give your users too much information.  Users can spend too much time trying to absorb everything that you're throwing at them instead of getting what they need and then reacting to it.  Another part of that argument is that the information needs to be relevant, which goes back to defining your core user experience.  For example, if I had a project management application, a metric to track how many times all of the people on the team logged into the application is not really a useful statistic when you're trying to finish a project.  For further reading on this point, check out Russell Ackoff's &lt;a href-"http://ackoffcenter.blogs.com/ackoff_center_weblog/2003/12/management_misi.html"&gt;article&lt;/a&gt; about "Management Information Systems."  It's an old article, but still relevant to this day.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;If you have an opinion on this subject, I'd love to hear about it!  Leave a comment.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-2366463877241476843?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/2366463877241476843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2009/03/your-web-app-sucks-because-it-doesnt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/2366463877241476843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/2366463877241476843'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2009/03/your-web-app-sucks-because-it-doesnt.html' title='Your web app sucks because it doesn&apos;t give your users good metrics'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-2040719545017684716</id><published>2009-02-24T07:23:00.007-08:00</published><updated>2009-02-24T08:04:38.588-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='datamapper'/><title type='text'>Want more control over your database tables in DataMapper?</title><content type='html'>I had originally submitted a request to the DataMapper team to include an option to allow MySQL database users the ability to specify table options in their DataMapper models.  My needs were around data warehousing and I wanted to use a different storage engine like Infobright.  Unfortunately this request was denied because dm-core could have ended up looking like spaghetti if my request were approved.  Mind you I'm oversimplifying the argument, but I understood where they were coming from.  As a result, I bring you &lt;a href="http://github.com/neovintage/dm-mysql/tree/master"&gt;dm-mysql&lt;/a&gt;!

&lt;h3&gt;Overview&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;p&gt;&lt;b&gt;Plugin Name:&lt;/b&gt;  dm-mysql&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;b&gt;Summary:&lt;/b&gt;  Plugin that allows MySQL DataMapper user the ability to specify MySQL table options when DataMapper creates database tables.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;b&gt;Requirements:&lt;/b&gt; Your DataMapper version must be &gt; 0.9.10&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;b&gt;Options:&lt;/b&gt; For available MySQL table options see the &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/create-table.html"&gt;MySQL documentation.&lt;/a&gt; Note that this plugin was created against MySQL 5.1.&lt;/p&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;p&gt;&lt;b&gt;To Install:&lt;/b&gt;  Make sure you have github listed as one of your sources.&lt;/li&gt;&lt;pre name="code" class="ruby"&gt;sudo gem install neovintage-dm-mysql&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Example&lt;/h3&gt;&lt;pre name="code" class="ruby"&gt;
require 'dm-core'
require 'dm-mysql'

# Shows available options
class HasAllOption
  include DataMapper::Resource

  property :id, Serial
  property :name, String

  table_opts :engine =&gt; 'MyISAM',
    :avg_row_length =&gt; 7,
    :checksum =&gt; 1,
    :comment =&gt; "Best Comment EVER!!",
    :connection =&gt; 'another_connection',
    :data_directory =&gt; '/dude/wheres/my/dictionary',
    :delay_key_write =&gt; 0,
    :index_directory =&gt; '/index/this',
    :insert_method =&gt; 'FIRST',
    :key_block_size =&gt; 256,
    :max_rows =&gt; 5,
    :min_rows =&gt; 0,
    :pack_keys =&gt; 0,
    :password =&gt; 'secret',
    :row_format =&gt; 'COMPRESSED',
    :tablespace =&gt; 'DUDE',
    :union =&gt; 'has_its, not_includeds'

end&lt;/pre&gt;

&lt;p&gt;As always, I appreciate any feedback on the code or any features that you'd like to see implemented as part of this.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-2040719545017684716?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/2040719545017684716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2009/02/want-more-control-over-your-database.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/2040719545017684716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/2040719545017684716'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2009/02/want-more-control-over-your-database.html' title='Want more control over your database tables in DataMapper?'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-612152040571004536</id><published>2009-02-06T11:04:00.016-08:00</published><updated>2009-02-11T07:18:50.220-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='strategy'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Top 10 Themes to Help Your Start-up from Startonomics (#STNX)</title><content type='html'>&lt;div&gt;&lt;a href="http://startonomics.com/"&gt;Startonomics&lt;/a&gt; was setup by &lt;a href="http://dealmakermedia.com/"&gt;Dealmaker Media&lt;/a&gt; and took place on the wonderful campus of UCLA at the &lt;a href="http://www.anderson.ucla.edu/"&gt;Anderson School of Management&lt;/a&gt;.  As the website says, the purpose of the conference was to help entrepreneurs create strategies and actionable metrics to help them build better products and make better decisions.  I personally was very keen on this event because I have a passion for measuring and managing performance and innovation through metrics.  &lt;/div&gt;&lt;div&gt;
&lt;/div&gt;I recommend that you check out the &lt;a href="http://startonomics.com/blog"&gt;Startonomics blog&lt;/a&gt; for details on the conference as well as all of the video.  I learned quite a bit and met many interesting people who were at various stages within their ventures.  Yet if you want to get the quick gist of the conference, I bring you my top 10 themes of Startonomics:&lt;div&gt;&lt;ol&gt;&lt;li&gt;Web 1.0 was about things, and Web 2.0 is about people.  As a result, your value as a startup is proportional to the number of users / viewers of your site.  &lt;/li&gt;&lt;li&gt;If you've got partners in your venture, please, draw up a legal agreement that spells out how equity will be split up.  Very important if a partner decides to leave the start-up.  &lt;/li&gt;&lt;li&gt;Fail Fast!  Admit your failures and move on. 
&lt;/li&gt;&lt;li&gt;Decisions made in the first 90 days of your venture will have lasting effects. 
&lt;/li&gt;&lt;li&gt;The most important part of your start-up is passion.&lt;/li&gt;&lt;li&gt;What is your ultimate objective?  Is it to make money?  Get more users?  Pick one and work toward it!&lt;/li&gt;&lt;li&gt;Create a blog and create compelling content.  Make sure the design is clean and you cross link all of your content. 
&lt;/li&gt;&lt;li&gt;When hiring or getting money for your venture, can you see yourself hanging out with this person at a bar?
&lt;/li&gt;&lt;li&gt;Hire good athletes - quick learners over those with deep experience.
&lt;/li&gt;&lt;li&gt;Trends are more important than milestones.
&lt;/li&gt;&lt;/ol&gt;Spending my career figuring out the best ways to track project / company performance, the last point really hits home.  Sometimes managers and even some entrepreneurs get hung up on the idea that progress and processes need to be tracked within the business and tracked to great detail.  That's simply not the case.  As one of my mentors stated to me, it's more important to be directionally correct versus precisely inaccurate.
&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-612152040571004536?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/612152040571004536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2009/02/top-10-themes-to-help-your-start-up.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/612152040571004536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/612152040571004536'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2009/02/top-10-themes-to-help-your-start-up.html' title='Top 10 Themes to Help Your Start-up from Startonomics (#STNX)'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-4013623989296702488</id><published>2009-01-24T14:49:00.020-08:00</published><updated>2009-01-25T10:23:21.265-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='merb'/><category scheme='http://www.blogger.com/atom/ns#' term='rake'/><title type='text'>Running Rake Tasks in the Background with Monit</title><content type='html'>&lt;p&gt;In my last &lt;a href="http://neovintage.blogspot.com/2009/01/tweetrics-lessons-learned-when-setting.html"&gt;post&lt;/a&gt;, I had briefly talked about how I ran a rake task in the background to accomplish the twitter worker functionality.  After the course of a couple of weeks, I've got a couple of updates to that process, so that hopefully, you'll have an easier time of running a rake task continuously in the background.&lt;/p&gt;&lt;h3&gt;Use Monit instead of god for monitoring&lt;/h3&gt;
&lt;p&gt;I started with god to monitor my rake task.  It was very easy to setup, almost too easy.  After a couple of weeks, I started to notice that the god process was starting to leak memory all over the place.  I'll qualify this by saying that I use slicehost for hosting tweetrics.  I've seen some messages on the slicehost boards that talk about how god doesn't work well on the VMs.  That being said, I had to switch to something else.  Enter Monit.  I didn't have that much experience using Monit so, I had a learning experience in front me.  I found some instructions on the web on how to install Monit, which were fairly painless.  Within a few minutes, I had everything installed.  Now onto getting the rake tasks setup.&lt;/p&gt;&lt;h3&gt;Setup the monitrc file&lt;/h3&gt;
&lt;p&gt;The next step in setting up monit to handle my background task was setting up the monit control file.  This is analogous to setting up the configuration file that you'd use with god to handle the monitoring of your processes. I have to admit that the syntax for the monit control file was relatively straight forward.  To make things even easier, I found this &lt;a href="http://www.igvita.com/2006/11/07/monit-makes-mongrel-play-nice/"&gt;post&lt;/a&gt; from Ilya Grigorik.  I copied the monitrc file and put it in my config directory of my merb project.  Although Ilya's post was directed toward using mongrel with monit, all I needed to do was change the start and stop program lines to something like this:&lt;pre name="code" class="ruby"&gt;
start program = "/path/to/bash/script start"
stop program  = "/path/to/bash/script stop"&lt;/pre&gt;The purpose of these lines are to start an stop the rake tasks, which leads us to the next step.&lt;/p&gt;

&lt;h3&gt;Create the bash script to handle the startup of your rake task&lt;/h3&gt;&lt;p&gt;Since rake tasks are not daemonized and do not create their own pid files, we'll have to set that up.  Time to setup a bash script.  I couldn't do this part without looking through the FAQs on the Monit site, more specifically &lt;a href="http://mmonit.com/wiki/Monit/FAQ#pidfile"&gt;what to do to set up a script for processes that don't create pid files&lt;/a&gt;.  I'm not the best person when it comes to creating bash scripts, so finding this information in the FAQ was a big help.  Now came the part for creating the rake specific parts:&lt;pre name="code" class="ruby"&gt;
#!/bin/bash
export PATH=$PATH:/usr/local/lib/site_ruby/1.8/rubygems

case $1 in
   start)
      cd /path/to/merb/root/directory;
      echo $$ &gt; /path/to/log/metrics_gen_master.pid
      /path/to/rake twitter:metrics_gen MERB_ENV=production
      ;;
    stop)
      kill `cat /path/to/file/metrics_gen.ppid`
      kill `cat /path/to/file/metrics_gen.pid`
      kill `cat /path/to/file/metrics_gen_master.pid`
      rm -rf /path/to/pid/files
      ;;
    *)
      echo "usage: twitter_worker {start|stop}" ;;
esac
exit 0&lt;/pre&gt;&lt;b&gt;Important notes:&lt;/b&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;In your rake task, make sure that you save the pid and the ppid to a file.&lt;/b&gt;&lt;pre name="code" class="ruby"&gt;
`echo "#{Process.pid}" &gt; #{Merb.root}/log/metrics_gen.pid`
`echo "#{Process.ppid}" &gt; #{Merb.root}/log/metrics_gen.ppid`
&lt;/pre&gt;&lt;p&gt;This is important because we'll need to stop the rake processes. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;If you're running monit using init be careful of permissions.&lt;/b&gt;&lt;p&gt;Since my rake task loaded the merb environment, it would be running as root and would write to merb.main.pid.  If I restarted apache, passenger could not write to the file merb.main.pid and would throw errors instead of running the app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Don't use &amp; when invoking your rake task!&lt;/b&gt;&lt;p&gt;By using &amp; in the bash script, the rake task will get forked and and the incorrect pid will get written to file.  Trust me, I spent a lot of time on this one.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;h3&gt;Run it!&lt;/h3&gt;&lt;p&gt;Not much I can say here other than take the time to really extensively test your monit script.  The log output can be found at /var/log/monit.log.  Also, make sure you run it with sudo if you are going to use init.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-4013623989296702488?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/4013623989296702488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2009/01/running-rake-tasks-in-background-with.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4013623989296702488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4013623989296702488'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2009/01/running-rake-tasks-in-background-with.html' title='Running Rake Tasks in the Background with Monit'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-2842738350577746067</id><published>2009-01-08T12:21:00.023-08:00</published><updated>2009-01-09T13:44:00.847-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='merb'/><title type='text'>Tweetrics - Don't do what I did post</title><content type='html'>I recently put together &lt;a href="http://tweetrics.info/"&gt;tweetrics&lt;/a&gt;.  It's a site dedicated to tracking public twitter accounts, graphing daily and cumulative activity.  I had a lot of fun putting the site together, unfortunately it wasn't without its problems.  Before I get into that, lets get into how the site is setup.

&lt;span style="font-weight: bold;"&gt;Backend Setup

&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7qcbQ5ZcM54/SWbGeR2d_fI/AAAAAAAABi8/n59oF0kv_Uo/s1600-h/tweetrics_setup.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 200px;" src="http://3.bp.blogspot.com/_7qcbQ5ZcM54/SWbGeR2d_fI/AAAAAAAABi8/n59oF0kv_Uo/s400/tweetrics_setup.png" alt="" id="BLOGGER_PHOTO_ID_5289133035883462130" border="0" /&gt;&lt;/a&gt;For the backend setup, I used &lt;a href="http://www.modrails.com/"&gt;Passenger&lt;/a&gt; and &lt;a href="http://www.merbivore.com/"&gt;Merb&lt;/a&gt;.  I know Merb is going to merge with Rails, but I found building tweetrics as an opportunity to get more familiar with the nuancies of Merb.  I wanted to use the run_later method in merb to offload the processing of tweets because it's a very processor intensive task, but I decided against it.  The main reason being run_later creates a queue per merb process on the server and not a global queue.  The global queue was important to me because I did not want multiple instances of the method that builds the twitter activity because my server does not have very much memory.  Also, from what I've read on the web, I couldn't use run_later even if I wanted to because it does work behind Passenger.

Instead of run_later, I used beanstalk.  I found instructions that met my needs at &lt;a href="http://nubyonrails.com/articles/about-this-blog-beanstalk-messaging-queue"&gt;Nuby on Rails&lt;/a&gt;.  The instructions were pretty clear and the setup of the software to get beanstalk up and running was pretty painless.  Like the Nuby on Rails article, I also had a database that recorded the state of jobs in the queue should the beanstalk instance crash.

&lt;span style="font-weight: bold;"&gt;Frontend Setup&lt;/span&gt;

To get the front end working, I used a combination of JQuery, the Google Visualization API and a little bit of Ajax.  Working with the Google Visualization API was a complete breeze.  All you need is a couple of lines of javascript in your page and POW!  The visualization shows up.  I was even suprised the charts could be rendered after issuing some JQuery UI effects.

&lt;span style="font-weight: bold;"&gt;Don't Make These Mistakes&lt;/span&gt;

After writing this app, I learned a few things.  Hopefully by posting this, you won't have the same problems that I did.
&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;When using Beanstalk and the Ruby gem beanstalk-client, make sure that you use the yput method and not put.&lt;/span&gt;&lt;p&gt;yput will serialize the object before putting it into the message queue and then your worker can pull it out and deserialize it.  I tried to get around the serialization step by using the put method but for me, I kept getting errors and the job would not get inserted into the queue.  I struggled with this for a while before giving up and using yput.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;When using Google Visualization API, make sure the user's url and the hostname in Json Requests actually match.&lt;/span&gt;&lt;p&gt;This was quite frankly a stupid mistake on my part.  The charts page actually pulls in a static JSON file that has the chart data unfortunately the hostname of the url to request the JSON file was hardcoded as http://tweetrics.info/.  If a user accessed the site using http://www.tweetrics.info/ instead, the Google Visualization would not pull the data into the charts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;If you're using the Google Visualization API, load JQuery from Google instead of hosting it on your own site.  &lt;/span&gt;&lt;p&gt;Pulling JQuery from Google can save you oodles of bandwidth.  Just do it like so.....&lt;pre name="code" class="javascript"&gt;&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-2842738350577746067?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/2842738350577746067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2009/01/tweetrics-lessons-learned-when-setting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/2842738350577746067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/2842738350577746067'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2009/01/tweetrics-lessons-learned-when-setting.html' title='Tweetrics - Don&apos;t do what I did post'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_7qcbQ5ZcM54/SWbGeR2d_fI/AAAAAAAABi8/n59oF0kv_Uo/s72-c/tweetrics_setup.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-8686998743986456511</id><published>2008-11-18T15:29:00.011-08:00</published><updated>2008-11-18T20:41:08.015-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strategy'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Is Rails a Competitive Advantage?</title><content type='html'>My short answer.... Not anymore.

A competitive advantage can be defined as an advantage a firm has over its competitors. Yet two types of competitive advantages exist, cost advantage and differentiation advantage.  Rails currently provides a cost advantage but it’s starting to erode.  As for a differentiation advantage, I have a hard time justifying Rails as one in and of itself anymore.

In this part one of a two part series, I’ll explore the cost advantages Rails has in the marketplace.

&lt;span style="font-weight: bold;"&gt;Cost Advantage&lt;/span&gt;

It's defined as the ability of a firm to deliver the same benefits as competitors at a lower cost. I don't want to spend too much time in this area, because countless others (&lt;a href="http://www.softwaremag.com/L.cfm?doc=1105-1/2008"&gt;1&lt;/a&gt;, &lt;a href="http://www.cmswire.com/cms/industry-news/php-vs-java-vs-ruby-000887.php"&gt;2&lt;/a&gt;, &lt;a href="http://www.ruby-forum.com/topic/58026"&gt;3&lt;/a&gt;, &lt;a href="http://www.csc.com/aboutus/leadingedgeforum/knowledgelibrary/uploads/1131_1.pdf"&gt;4&lt;/a&gt;, &lt;a href="http://rewrite.rickbradley.com/pages/moving_to_rails.html"&gt;5&lt;/a&gt;) have talked about how using Rails to develop web applications has saved, time, money and energy while increasing the speed to market.  What I do want to talk about is competing on cost and how that will be difficult to do so with Rails in the near future.

Most of the stories that we've heard have been related to how Rails has saved teams so much money in development time.  Yet these stories have pitted Rails against Java, .NET, or (insert other framework here).  When Rails goes up against these other frameworks it has a distinct cost advantage.  But what happens when the Rails is pitted against Rails?  Here’s the problem:
&lt;ul&gt;&lt;li&gt;Rails community is getting bigger&lt;/li&gt;&lt;li&gt;More businesses have been looking to use Ruby for their projects&lt;/li&gt;&lt;li&gt;Rails is open-source
&lt;/li&gt;&lt;/ul&gt;I’m not saying that because Rails is open-source that’s a bad thing.  What I am saying is that the barriers to entry for developers and businesses looking to get into developing with Rails are zero because it’s open-source and freely available for use.  Also, that means that more and more people are looking for work.  On top of that, because the ecosystem around Rails is very community driven, once a developer sets a best practice with Rails that results in some kind of efficiency, everyone else in the community will copy that almost immediately.  That will therefore reduce any cost benefit attained by the original developers. 

Once everyone starts competing on cost in the Rails community, everyone starts fighting for business based upon their price for getting the application up and running.  Customers will then start to make their choices based upon price and the lowest price will always win.

The moral of the story is that if you’re gunning for a project where the technology has not been decided upon like should we use Java vs. Rails, Rails can provide a cost advantage.  Yet if the customer is already set on using Rails, you’d better come up with another strategy for getting that business other than using cost.  That’s something I’ll explore in my next post.

For more detail on using cost to compete, read the section on 'Operational Effectiveness' from Michael Porter’s article in Harvard Business, &lt;a href="http://hbswk.hbs.edu/item/2165.html"&gt;Strategy and the Internet&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-8686998743986456511?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/8686998743986456511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2008/11/is-rails-competitive-advantage.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/8686998743986456511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/8686998743986456511'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2008/11/is-rails-competitive-advantage.html' title='Is Rails a Competitive Advantage?'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-7724237641190628143</id><published>2008-11-11T17:44:00.004-08:00</published><updated>2008-11-11T18:07:57.417-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>MIA - MBA in Action</title><content type='html'>There are two truths to the title of this post.  I did go MIA(Missing in Action) for a number of months and wasn't able to update the blog.  Secondly, the MBA is one of the reasons for my disappearance. 

I made the decision to get my MBA approximately one year ago from this date and at the time I was living in Chicago.  I took my GMATs and submitted all of my paperwork to various programs across the country.  Little did I know that the submission was the easy part.  Upon acceptance to Pepperdine, I was greeted with a lot of information from the school and not much time to get my life in order before I had to move to California.  I will also note that during this time I got engaged and had to plan my wedding!  All of this went down approximately in May of this year and these life altering tasks had to be finished before August 16th, the move date.  Four months sounds like a long time, but trust me, my wife and I barely got through it.  

Anyway....  I'm writing this post to inform everyone that the dust has settled and I'm getting back into blogging.  This blog will still have a focus on Ruby but I'll be intersecting that with the business aspects of technology.  Don't get me wrong, I still love to write code and keep up with the happenings in the Ruby ecosystem.  I've redesigned the blog and I'm looking forward to future posts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-7724237641190628143?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/7724237641190628143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2008/11/mia-mba-in-action.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/7724237641190628143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/7724237641190628143'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2008/11/mia-mba-in-action.html' title='MIA - MBA in Action'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-8426432851249191836</id><published>2008-05-21T11:23:00.008-07:00</published><updated>2008-12-09T00:31:54.366-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='charts'/><title type='text'>Is it possible to do XY Scatter Charts in Gruff?</title><content type='html'>YES! You Can!  I've &lt;a href="http://github.com/neovintage/gruff/tree/scatter"&gt;forked&lt;/a&gt; Gruff on github and written some code to give gruff the ability to plot X and Y points on a graph.  Although, I can't take all of the credit for this.  Topfunky started the ball rolling and I just took it a little further.  I'm hoping to get this committed to the main branch soon. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_7qcbQ5ZcM54/SDRxJovchfI/AAAAAAAAAFM/ljc6xM7aKaQ/s1600-h/scatter_basic_small.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_7qcbQ5ZcM54/SDRxJovchfI/AAAAAAAAAFM/ljc6xM7aKaQ/s400/scatter_basic_small.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5202907879888946674" /&gt;&lt;/a&gt;&lt;h3&gt;Get the Code:&lt;/h3&gt;As of this point the code is only in &lt;a href="http://github.com/neovintage/gruff/tree/scatter"&gt;my forked github repository&lt;/a&gt;.  You'll have to download the code from github and create a gem if you'd like to use it.&lt;br /&gt;&lt;br /&gt;&lt;pre name='code' class='ruby'&gt;git clone git://github.com/neovintage/gruff.git&lt;br /&gt;rake gem&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Example:&lt;/h3&gt;Let's run through an example of how to create the above chart.  The code will look very similar to the sample provided on &lt;a href="http://nubyonrails.com/pages/gruff"&gt;nubyonrails.com&lt;/a&gt;&lt;br /&gt;&lt;pre name='code' class='ruby'&gt;scatter_chart = Gruff::Scatter.new(400)&lt;br /&gt;g.title = "Basic Small Scatter Chart Test"&lt;br /&gt;&lt;br /&gt;# Parameter 1 is the name of the dataset&lt;br /&gt;# Parameter 2 is the values for the X-Axis&lt;br /&gt;# Parameter 3 is the values for the Y-Axis&lt;br /&gt;g.data('Chuck', [20,10,5], [5,10,20])&lt;br /&gt;g.data('Brown', [10,12,14,8], [12,6,10,8] )&lt;br /&gt;g.data('Lucy', [8,16,8], [8,10,6] )&lt;br /&gt;&lt;br /&gt;g.write('basic_scatter.png')&lt;/pre&gt;&lt;br /&gt;The only thing that you can't do with the Scatter graph is set labels for the X-Axis.  Maybe that could be a future enhancement. &lt;br /&gt;&lt;br /&gt;Email me or throw up a comment if you happen to find any bugs in this new graph.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-8426432851249191836?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/8426432851249191836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2008/05/is-it-possible-to-do-xy-scatter-charts.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/8426432851249191836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/8426432851249191836'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2008/05/is-it-possible-to-do-xy-scatter-charts.html' title='Is it possible to do XY Scatter Charts in Gruff?'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_7qcbQ5ZcM54/SDRxJovchfI/AAAAAAAAAFM/ljc6xM7aKaQ/s72-c/scatter_basic_small.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-8769076043228325542</id><published>2008-04-21T14:33:00.008-07:00</published><updated>2008-11-11T17:21:40.499-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Connecting to Private Repositories on Github using Windows</title><content type='html'>I'm going to be honest; I spent a little too much time trying to setup my Windows machine to work with my private repositories on Github.  Ok, well it wasn't that much time, but enough for me to warrant a blog posting.  For me, the situation really boiled down to step #4 and needing a config file to get Git Bash to work.  

1. Install &lt;a href="http://www.cygwin.com/"&gt;Cygwin&lt;/a&gt;.  This is actually a requirement for MsysGit.  If this doesn't happen you'll receive a fatal error when you try to perform any action against your repository because git won't be able to fork.  The error message should read, &lt;tt&gt;fatal: Unable to Fork&lt;/tt&gt;  This is forking in the scope of operating systems not forking in the git sense of the term.  Don't forget to add the install location of Cygwin to your PATH variable.  

2.  Install &lt;a href="http://code.google.com/p/msysgit/"&gt;MsysGit&lt;/a&gt;.  When asked how you would like to use Git at the command line, I selected the &lt;tt&gt;Use Git Bash only&lt;/tt&gt; option.  It's the most conservative option and will be less likely to mess anything up on your computer.  

3.  &lt;a href="http://github.com/guides/providing-your-ssh-key#msysGit"&gt;Generate your SSH keys&lt;/a&gt; and post them to Github.  Follow the guide provided by the ninjas at Github.  

4.  Create a configuration file in your .ssh directory.  In the directory where you found your public key (id_rsa.pub), you'll need to create a file called &lt;tt&gt;config&lt;/tt&gt;.  This will tell Git Bash where to look for your key along with a few other options for connecting.  This is what mine looks like:
&lt;pre name='code' class='ruby'&gt;
  Host github.com
  User git
  Port 22
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes&lt;/pre&gt;
Couple of important notes.  Make sure that the User line says &lt;tt&gt;git&lt;/tt&gt;.  Also the &lt;tt&gt;IdentityFile&lt;/tt&gt; option should point your private key.  If in step #3, when you setup your ssh keys, you gave your key file another name, make sure you put that name in the &lt;tt&gt;IdentityFile&lt;/tt&gt;.

There you go!  That should be it.  

Troubleshooting Notes:

If you run into a some problems getting ssh to work, I would recommend running &lt;tt&gt;ssh -v github.com&lt;/tt&gt; at the Git Bash command line.  If you get an error &lt;tt&gt;Permission denied (public key)&lt;/tt&gt;.  Make sure that your &lt;tt&gt;IdentityFile&lt;/tt&gt; is setup correctly in your config file.  For any other errors, I would recommend checking that the other options within the config file are correct.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-8769076043228325542?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/8769076043228325542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2008/04/connecting-to-private-repositories-on.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/8769076043228325542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/8769076043228325542'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2008/04/connecting-to-private-repositories-on.html' title='Connecting to Private Repositories on Github using Windows'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-4751991475318512983</id><published>2008-02-29T13:20:00.005-08:00</published><updated>2008-02-29T13:32:54.607-08:00</updated><title type='text'>Automigrating the Test Database (Merb .9 / Rspec / Datamapper)</title><content type='html'>In a followup to Marcus' &lt;a href="http://marcus.ahnve.net/2008/02/16/how-to-automigrate-the-test-database-using-merb-datamapper-and-rspec/"&gt;note&lt;/a&gt; about migrating the test database, I'd like to point out that when you try to auto migrate in &lt;tt&gt;&lt;b&gt;spec/spec_helper.rb&lt;/b&gt;&lt;/tt&gt; using &lt;tt&gt;&lt;b&gt;DataMapper::Base.auto_migrate!&lt;/b&gt;&lt;/tt&gt;, it fails.  

Instead I would use &lt;tt&gt;&lt;b&gt;DataMapper::Persistence.auto_migrate!&lt;/b&gt;&lt;/tt&gt;.  This command will pick up all of the models that you setup in your &lt;tt&gt;&lt;b&gt;app/models&lt;/b&gt;&lt;/tt&gt; folder.  

Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-4751991475318512983?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/4751991475318512983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2008/02/automigrating-test-database-merb-9.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4751991475318512983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4751991475318512983'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2008/02/automigrating-test-database-merb-9.html' title='Automigrating the Test Database (Merb .9 / Rspec / Datamapper)'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-1572005798345080151</id><published>2008-01-28T08:20:00.001-08:00</published><updated>2008-11-11T17:38:58.940-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='merb'/><title type='text'>Cloning Merb 0.9</title><content type='html'>Merb 0.9 is going to be officially announced in a couple of weeks at acts_as_conference but for those looking to get a jump start on the action (myself included), you can pull down the latest version from &lt;a href="http://github.com/wycats"&gt;github&lt;/a&gt;.

If you don't already have git installed, I recommend following these instructions on Ramanan's blog for those that use Mac OS X: &lt;a href="http://funkaoshi.com/blog/building-git-on-mac-os-x"&gt; Building Git on Mac OS X&lt;/a&gt;

The next step is to clone the source from github.  Now its important to note that merb has now been split into two parts, merb-core and merb-more.  I'm only going to follow the instructions for merb-core but the same process applies to merb-more. 
&lt;ol&gt;
 &lt;li&gt;Clone the merb-core source to your local machine&lt;pre name="code" class="ruby"&gt;git clone git://github.com/wycats/merb-core.git&lt;/pre&gt;This will create a new folder in your current working directory named 'merb-core'&lt;/li&gt;
 &lt;li&gt;Build the gem
&lt;pre name="code" class="ruby"&gt;cd merb-core/
rake gem&lt;/pre&gt;&lt;/li&gt;
 &lt;li&gt;Install&lt;pre name="code" class="ruby"&gt;cd pkg/
gem install merb-core-0.9.0.gem&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;And there you have it.  You're ready to start playing around with the new merb-core!  One quick note, make sure you use merb.9 at the command line instead of merb.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-1572005798345080151?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/1572005798345080151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2008/01/cloning-merb-09.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/1572005798345080151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/1572005798345080151'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2008/01/cloning-merb-09.html' title='Cloning Merb 0.9'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-4770307005806537773</id><published>2008-01-20T14:46:00.001-08:00</published><updated>2008-11-11T17:40:45.407-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='merb'/><title type='text'>Merb + Namespace + Subdomain</title><content type='html'>I'd like to post a clarification on getting namespaces to work within merb.  I'm still very new to the merb world and its semantics regarding namespaces.  I'll be honest, it  tripped me up a little bit.  In this example, I'm going to run through getting a subdomain and namespace setup in your router file and how your controller should be structured to take advantage of that namespace.

Assumptions:
&lt;ul&gt;&lt;li&gt;You know how to generate controllers in merb&lt;/li&gt;&lt;li&gt;Using merb 0.5.2
&lt;/li&gt;&lt;/ul&gt;
Example Prep:

&lt;ul&gt;&lt;li&gt;I'll be creating a namespace Admin, because I'd like to keep all of my actions associated with administration separate from the rest of my application&lt;/li&gt;&lt;li&gt;Within the Admin namespace, I'll be creating a controller called User.
&lt;/li&gt;&lt;li&gt;I want to keep all of the admin controllers on a separate subdomain on my site, something like, http://admin.mysite.com.
&lt;/li&gt;&lt;/ul&gt;
Setup:
&lt;ol&gt;
&lt;li&gt;Create the appropriate routes in the Router file&lt;pre name="code" class="ruby"&gt;r.match(:domain =&gt; /^admin./).to(:namespace =&gt; 'admin') do |admin|
    admin.match('/').to(:controller =&gt; 'admin', :action =&gt; 'index')
end&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Make sure your merb file structure jives with your new Namespace&lt;br /&gt;Merb requires that if you do create a namespace that the resulting controller code be in its own subfolder in the controller folder.  The subfolder needs to have the same name as the namespace. In our example it should look something like this:
&lt;pre name="code" class="ruby"&gt;app/&lt;br/&gt;  controllers/&lt;br /&gt;    admin/&lt;br/&gt;      user.rb
&lt;/pre&gt;
&lt;li&gt;Setup the Controller based upon the Namespace
Note the use of the module declaration.  At this point you need to make sure the structure in the code looks something like this:
&lt;pre name="code" class="ruby"&gt;module Admin
  class User &lt; Application
    
    def index
      render
    end
  
  end
end&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;
And there you have it, we've successfully setup your controller and routes to take advantage of the use of a namespace in concert with a subdomain.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-4770307005806537773?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/4770307005806537773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2008/01/merb-namespace-subdomain.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4770307005806537773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4770307005806537773'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2008/01/merb-namespace-subdomain.html' title='Merb + Namespace + Subdomain'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-1861705413121991739</id><published>2007-10-18T10:50:00.002-07:00</published><updated>2008-11-11T17:44:00.289-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='activerecord'/><title type='text'>ActiveRecord Table Name Prefix and Suffix Quirks</title><content type='html'>I've just started working with a legacy database schema over the last week when I noticed some quirks in ActiveRecord table naming.  Essentially, when you set the prefix in ActiveRecord::Base and then try to set a table name in the model, the model does not pick up the table_name_prefix when your classes are created.  Lets walk through an example. 

I've setup two different classes in a test file that both inherit ActiveRecord.  Keep in mind that when we create these classes the default behavior of ActiveRecord is to pluralize the table name.  The Project class has its table name overridden with the set_table_name method and the Task class was left to the default behavior.  

Initial Setup in test.rb:&lt;pre name="code" class="ruby"&gt;ActiveRecord::Base.table_name_prefix = 'myprefix.'

class Project &lt; ActiveRecord::Base
  set_table_name 'project'
end

class Task &lt; ActiveRecord::Base
end
&lt;/pre&gt;
In IRB:
&lt;pre name="code" class="ruby"&gt;&gt;&gt; require 'test'
=&gt; true
&gt;&gt; Project.table_name
=&gt; "project"
&gt;&gt; Task.table_name
=&gt; "myprefix.tasks"&lt;/pre&gt;

Very interesting behavior indeed.  This caused alot of problems for me because I required the use of a table name prefix in my database, but all of my table names really don't follow the ActiveRecord mantra.  I had a couple ways of fixing this predicament.  

1.  Pass a block to set_table_name in the model
&lt;pre name="code" class="ruby"&gt;class Project &lt; ActiveRecord::Base
  set_table_name do 
    "#{table_name_prefix}project"
  end&lt;/pre&gt;
This method would work, but in the event that I have to do this for multiple tables, it can get quite cumbersome. Lets look for another option....

2.  Patch ActiveRecord
&lt;pre name="code" class="ruby"&gt;line 765 in activerecord/lib/active_record/base.rb....
Original:
  def set_table_name(value = nil, &amp;block)
    define_attr_method :table_name, value, &amp;block
  end
New:
  def set_table_name(value = nil, &amp;block)
    define_attr_method :table_name, "#{table_name_prefix}#{value}#{table_name_suffix}", &amp;block
  end &lt;/pre&gt;
Now this approach works a little bit better.  Now I can set the table names in the models without worrying about setting up blocks or doing some other magic.  Yet, I'm a little uncomfortable patching base.rb in my ActiveRecord installation for the typical reasons.  

3.  Override set_table_name in my test.rb file
&lt;pre name="code" class="ruby"&gt;module ActiveRecord
  class Base
    def self.set_table_name(value = nil, &amp;block)
      define_attr_method :table_name, "#{table_name_prefix}#{value}#{table_name_suffix}", &amp;block
    end
  end
end&lt;/pre&gt;
This approach is probably the best.  At least this way if there are any changes to activerecord in the future, I wont forget what I did to get my table prefixing to work.

SIDEBAR: define_attr_method creates an attribute method.  A new class method will be created with the given name.  In this post, the class method name is table_name.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-1861705413121991739?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/1861705413121991739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2007/10/activerecord-table-name-prefix-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/1861705413121991739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/1861705413121991739'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2007/10/activerecord-table-name-prefix-and.html' title='ActiveRecord Table Name Prefix and Suffix Quirks'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-5889143996159125025</id><published>2007-04-10T09:13:00.001-07:00</published><updated>2008-11-18T15:46:27.870-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Errors with Better Nested Set and MySQL</title><content type='html'>It looks like theres an error when trying to create nodes for your model that uses the &lt;a href="http://opensource.symetrie.com/trac/better_nested_set/"&gt;Better Nested Set&lt;/a&gt;.  
You should get something that looks like this:
&lt;code&gt;Mysql::Error: #42000You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ....&lt;/code&gt;
Whats happening is that the &lt;tt&gt;:scope&lt;/tt&gt; attribute is not getting valued properly.  Instead of one statement coming back, the entire ternary operation statement is getting returned.  
&lt;p&gt;Not sure if its been patched yet, if not, we'll have to write something to fix that.   I haven't seen anything come across in the mailing lists.  In the meantime, when specifying your &lt;tt&gt;:scope&lt;/tt&gt; attributes make sure that you use a string and not a symbol. That seems to work.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-5889143996159125025?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/5889143996159125025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2007/04/errors-with-better-nested-set-and-mysql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/5889143996159125025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/5889143996159125025'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2007/04/errors-with-better-nested-set-and-mysql.html' title='Errors with Better Nested Set and MySQL'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-8672594853818952662</id><published>2007-04-08T08:43:00.001-07:00</published><updated>2008-11-18T15:46:40.374-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Inserting NULL values when trying to create mulitple model objects</title><content type='html'>When creating a new object in Rails and you want the value to result in a NULL value in the database, you typically just have to set the value of the field to nil and you're on your way.  In my situation, I needed to default the value of the Boolean field on the table to NULL if the user did not select a value.  I used a collection select method to allow the user to select "Yes", "No" or to leave the field blank.  Then in the controller I thought that I could just refer to the params[:new_object] and I would be good.  Unfortunately, when creating the new object the value of the field was always getting set to false.  Lets go over how I initially setup my code.  

In the form:
&lt;code&gt;&lt;% form_tag(save_review_reviews_path(@project, @phase), :method =&gt; :put, :id =&gt; params[:phase_id]) do %&gt;
  &lt;% @review_points.each_with_index do |rp, index| %&gt;
    &lt;% fields_for "rp[#{index}]", rp do |f| %&gt;
      &lt;%= f.collection_select(:compliant, [{"1" =&gt; "Yes"}, {"0" =&gt; "No"}], :keys, :values, :include_blank =&gt; true) -%&gt;
    &lt;% end %&gt;
  &lt;% end %&gt;
&lt;% end %&gt;&lt;/code&gt;
In the controller code:
&lt;code&gt;params[:rp].each_value do |rp|
  @review.review_points.build(:compliant =&gt; rp[:compliant])
end&lt;/code&gt;
Every time I ran through the tests the value was always getting set to false when the user had left the select box blank.  I tried removing the :include_blank in the collection select and putting another hash for nil, {nil =&gt; ""}.  That didn't work either, the value was still getting set to false.  In try number two, I used the code as posted above, and then I tried to default the value of record to NULL through the migration.  That failed as well.  

Finally, I just decided to add an extra step before actually building the record in the controller.  As a result, the action worked as I expected, I was able to insert NULL values.  This is how the controller looks now:
&lt;code&gt;params[:rp].each_value do |rp|
  rp[:compliant] = nil if rp[:compliant] == ""
  @review.review_points.build(:compliant =&gt; rp[:compliant])
end&lt;/code&gt;
Too bad we could just use the params object and automatically default the field to null when creating the object.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-8672594853818952662?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/8672594853818952662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2007/04/null-values-and-boolean-fields.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/8672594853818952662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/8672594853818952662'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2007/04/null-values-and-boolean-fields.html' title='Inserting NULL values when trying to create mulitple model objects'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-4903843210106331460</id><published>2007-01-20T12:14:00.000-08:00</published><updated>2007-04-12T11:07:43.063-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>New Job!!! G'yeah!!!</title><content type='html'>It's been a long time coming.  I've decided to change jobs.  This is my first job change out of college.  I've been at that company for 5.5 years.  Thats quite some time.  I start at the new place on January 29th. 

My new company is CCC Information Services located within the Merchandise Mart.  I'm still downtown which is very nice but now I have a longer walk to get to the office from the train station.  Maybe that walk will motivate me to start working out more.

At my last job, I led a team of programmers and analysts that performed conversions from 3rd party systems onto the proprietary application.  I did a lot of work on a Mainframe using SAS, for the most part.  Also, I did do some scripting in the windows shell and using Ruby(very nice! (c) borat), but by and large SAS was the language of choice at my last job.  Note that SAS was not the language of my choice.  It kinda feels weird saying "last job". 

At CCC, I expect to be in a lead role as well, but I'll be doing a number of tasks.  More of my time will be spent doing Business Intelligence type work, but I will also get to do some of the prototype work in Rails.  So right now I'm leading a pilot project to develop a new internal app for the PMO that will go on the intranet. 

All in all, I'm very pleased with making this new job change and I'm confident it will lead to bigger and better things.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-4903843210106331460?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/4903843210106331460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2007/01/new-job-gyeah.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4903843210106331460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/4903843210106331460'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2007/01/new-job-gyeah.html' title='New Job!!! G&apos;yeah!!!'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-3193421576096586644</id><published>2006-12-19T09:19:00.000-08:00</published><updated>2007-04-03T12:08:49.512-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vacations'/><title type='text'>Back from Vail!!!</title><content type='html'>Well I got my first ski of the season in. The gf and I made it out to Vail around the beginning of this month, more precisely we were there from 12/6 through 12/10. It happened to be just the two of us and we had a great time. Unfortunately the conditions on the mountain weren't as favorable as we would have liked them to be and I managed to crack one of my skis....

The entire time that we were there it didn't snow at all. That kinda sucked especially since the last snow Vail had was 7 days before we showed up at the resort.

Here are a couple of things that I learned on this trip:
&lt;ul&gt;&lt;li&gt;Never try to fly in on the early morning flight and try to get to the slopes on the same day, it will only lead to heartbreak. &lt;/li&gt;&lt;li&gt;Always get a 4x4 when driving around the mountains in CO&lt;/li&gt;&lt;li&gt;EZ Car Rental kicks ass&lt;/li&gt;&lt;li&gt;East Vail is too far from the resort&lt;/li&gt;&lt;li&gt;West Vail is where its at.&lt;/li&gt;&lt;li&gt;The back bowls on a warm day in Vail are not a lot of fun&lt;/li&gt;&lt;li&gt;Skiing + Extended Warm Weather = Exposed Rocks = Bad News&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I definately recommend going to Vail, but doing so at the beginning of Dec is a real gamble. Some of the folks we talked to at the resort had told us that in years prior they didn't get any snow. &lt;/p&gt;&lt;p&gt;Pics from the trip coming soon&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-3193421576096586644?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/3193421576096586644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2006/12/back-from-vail.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/3193421576096586644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/3193421576096586644'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2006/12/back-from-vail.html' title='Back from Vail!!!'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-2820172073294682707</id><published>2006-12-01T11:07:00.000-08:00</published><updated>2007-04-03T12:07:58.928-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>Let it snow!!!</title><content type='html'>&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger2/642/757/400/216014/house_winter06.jpg" border="0" alt="" /&gt;
First snow of the season!!!!!   I'm definitely hitting the meager slopes that we have here in Illinois tomorrow.  I need the little warm up before I head out to Vail next week.





Too bad this is the wet, heavy snow...  See how the tree on the left is not holding up too well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-2820172073294682707?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/2820172073294682707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2006/12/let-it-snow.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/2820172073294682707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/2820172073294682707'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2006/12/let-it-snow.html' title='Let it snow!!!'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-245030549586184339</id><published>2006-12-01T09:12:00.000-08:00</published><updated>2007-04-03T12:11:42.638-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='*nix'/><title type='text'>DWL-520e1 working in Ubuntu</title><content type='html'>Theres a lot of info out on web concerning how to get the D-Link DWL-520 E1 working in ubuntu.  Unfortunately I could not find one complete source for all of the information to properly get this wireless card working.  The &lt;a href="https://help.ubuntu.com/community/WifiDocs/Device/DWL-520vE1"&gt;wiki article&lt;/a&gt; on the Ubuntu site is fairly complete, but it was just missing a few critical details.  I'll attempt to walk you through the process I followed of finding the actual error on the system, finding the firmware and finally updating the startup scripts.

My box is a fairly generic setup that doesn't have any cutting edge hardware installed.  I proceeded to install ubuntu v6.10 onto this machine with all the relative ease that is ubuntu.  Once installed, everything worked except for the wireless lan card, the afore mentioned DWL-520.  So.. I started by looking up a &lt;a href="https://help.ubuntu.com/community/WifiDocs/WirelessCardsSupported?highlight=%28wireless%29%7C%28card%29"&gt;breakdown of the wireless cards&lt;/a&gt; that would work upon installation.  Just my luck, the DWL-520 doesn't work upon installation, but on this doc, I found the link to the &lt;a href="https://help.ubuntu.com/community/WifiDocs/Device/DWL-520vE1"&gt;wiki article&lt;/a&gt; that explained what needed to be done to install it.  I then followed the directions starting with the "Prepare the Firmware" section and proceeded to reboot upon completion.  Upon the restart, the card still didn't work.  Crap.

Now it was time for a little investigation.  I did a quick ifconfig at the command line and found that the device wasn't showing up at all.  I also found that the device was showing up when examining the devices on the pci bus.  So, I did some digging on the web and found that this particular card requires the firmware to be loaded to memory.  Unfortunately, the wiki article only goes as far as setting up the /etc/network/interfaces file, but you really need to take it to the next step to actually actively load the firmware.  

Heres a break down of the extra steps that are needed to get the DWL-520 to work.  This assumes that you followed the directions from the &lt;a href="https://help.ubuntu.com/community/WifiDocs/Device/DWL-520vE1"&gt;wiki article&lt;/a&gt;.

1. Make sure you have orinoco_pci, hermes, and orinoco all blacklisted in /etc/modprobe.d/blacklist 
&lt;code&gt;
# causes the dlink dwl-520vE1 card not to be recognized properly
# at boottime
blacklist orinoco_pci
blacklist orinoco
blacklist hermes
&lt;/code&gt;

2. Install hostap-utils.
&lt;code&gt;
apt-get install hostap-utils
&lt;/code&gt;or
&lt;code&gt;
wget http://hostap.epitest.fi/releases/hostap-utils-0.4.7.tar.gz
&lt;/code&gt;
I actually would recommend the not using apt-get because there is a script that comes with the utils package that makes the setup much easier.  Although, if you download the package you have to compile it and install.  

3. Move the hostap_fw_load script to /usr/local/sbin, and properly configure for your system.  
&lt;code&gt;
#!/bin/sh

# Example script for automatically loading firmware images when needed. This
# can be run, e.g., from /etc/pcmcia/wireless.

# Firmware images for the card
# TODO: could try to select correct firmware type automatically

PRI=/etc/firmware/pm010102.hex
STA=/etc/firmware/rf010804.hex
PRISM2_SREC=/usr/sbin/prism2_srec

set -e

if [ -z "$1" ]; then
    echo "usage: $0 &lt;ifname&gt;"
    exit 1
fi

IFNAME=$1
DIR=/proc/net/hostap/$IFNAME

if [ ! -d $DIR ]; then
    echo "Host AP driver data for device $IFNAME not found in procfs."
    exit 1
fi

if grep -q no_pri=1 $DIR/debug; then
    # no primary image - load primary in two steps, first without PDA and then
    # with full PDA plugging
    echo "Downloading primary firmware $PRI"
    $PRISM2_SREC -gs $IFNAME $PRI
    $PRISM2_SREC -gp $IFNAME $PRI
fi

if grep -q pri_only=1 $DIR/debug; then
    echo "Downloading secondary (station) firmware $STA"
    $PRISM2_SREC -rp $IFNAME $STA
fi

echo "Card is ready with both PRI and STA firmware images"
&lt;/code&gt;
Please note the top options, PRI, STA, and PRISM2_SREC.  This is the complete script, so if you originally did an apt-get of the hostap-utils, you can copy this and make it an executable file.  

4. Tweak the /etc/network/interface file
Add this line to the wlan0 configuration:
&lt;code&gt;
pre-up /usr/local/sbin/hostap_fw_load wlan0
&lt;/code&gt;
It should look something like this now:
&lt;code&gt;
auto wlan0

iface wlan0 inet dhcp
pre-up /usr/local/sbin/hostap_fw_load wlan0
wireless_nick DWL-520
fw_primary /etc/firmware/pm010102.hex
fw_secondary /etc/firmware/rf010804.hex
wireless_mode managed
&lt;/code&gt;

5. Restart your networking 
&lt;code&gt;
/etc/init.d/networking restart
&lt;/code&gt;

Now your card should be working and ready to go.  You can now go to System -&gt; Administration -&gt; Networking to setup your credentials to attach to a wireless network.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-245030549586184339?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/245030549586184339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2006/12/dwl-520e1-working-in-ubuntu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/245030549586184339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/245030549586184339'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2006/12/dwl-520e1-working-in-ubuntu.html' title='DWL-520e1 working in Ubuntu'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-1672931761190539007</id><published>2006-10-16T21:09:00.000-07:00</published><updated>2007-04-03T12:07:17.499-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>The Neovintage Collection (new mix)</title><content type='html'>Its been quite a while since I've made a mix.  Its been even longer since I got new music.  Regardless I spend some time today to pick some new tunes out for an hour of listening enjoyment.

Please note that its been a while since I last made a mix and my "skillz" weren't ninja-like in the past, so some of the parts are a little choppy, not to mention my levels were off.

Tracklist:
&lt;ol&gt;&lt;li&gt;Aspect - Soul Lady (blu saphir)&lt;/li&gt;&lt;li&gt;Paul B &amp;amp; Yana Kay - Waiting for your Love (Euphoria)
&lt;/li&gt;&lt;li&gt;Logistics - Call Me Back (Now More Than Ever EP - Hospital)&lt;/li&gt;&lt;li&gt;Calibre - Derranged (Derranged EP - Soul:R)&lt;/li&gt;&lt;li&gt;Sonic - Saigon Traffic (Bingo)&lt;/li&gt;&lt;li&gt;Seba - Heaven Sent feat Robert Manos (Soul:R)&lt;/li&gt;&lt;li&gt;Kubicks and Lomax - Edge City (Liquid V)&lt;/li&gt;&lt;li&gt;Logistics - City Life (Now More Than Ever EP - Hospital)
&lt;/li&gt;&lt;li&gt;Mathematics and Tactile - Espirit (Social Studies)&lt;/li&gt;&lt;li&gt;Synopix - Veteran (Fokuz)&lt;/li&gt;&lt;li&gt;Total Science - Soul Patrol (Sunny Side Up Mix) (CIA)&lt;/li&gt;&lt;li&gt;Locuss - Foundation (Cymbalism Liquified)&lt;/li&gt;&lt;li&gt;Junior Cartel - Havana (Renegade Recordings)
&lt;/li&gt;&lt;/ol&gt;Download:
&lt;del&gt;The link is coming soon....  I'm probably going to redo the mix tomorrow cause I'm not really content with it in its current form.&lt;/del&gt;
&lt;a href="http://www.sendspace.com/file/9jmwr9"&gt;Go and get it at sendspace!&lt;/a&gt;

Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-1672931761190539007?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/1672931761190539007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2006/10/neovintage-collection-new-mix.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/1672931761190539007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/1672931761190539007'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2006/10/neovintage-collection-new-mix.html' title='The Neovintage Collection (new mix)'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-7588010630859423069</id><published>2006-10-02T21:26:00.000-07:00</published><updated>2006-10-02T21:52:54.015-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>On the side</title><content type='html'>I've been wanting to post something over the last couple of days.  Just about anything really.  I've been working on that SAS testing framework for the mainframe for the last couple of weeks in the office, but really I wanted to talk about whats been going on, on the side.

Recently myia has been taking sewing classes.  Really, really cool.  Maybe she'll get to making me clothes... ;)  I have yet to see any of the stuff that shes actually sewn for her first class but I have seen a lot of the materials from the second, pattern design.  The pattern design class definately seemed like a lot of work but I'm sure by the end of the semester she'll be able to design clothing.  I doubt she'll be the next ralph lauren after this semester, but if she gives it some time, I'm sure she'll be able to make some pretty rad things.

As for me, I've been busy doing things around the house and for my little side project.  I got this wyld idea that I would make my own hard cider.  Where I came up with that idea is still a mystery to me.  So, I ended up purchasing a home brewing kit from &lt;a href="http://www.leeners.com/"&gt;leeners&lt;/a&gt;, namely one specific for &lt;a href="http://www.leeners.com/hardcider.html"&gt;hard cider&lt;/a&gt;.  When I originally purchased it, I had no idea what I was doing.  Quite frankly I still don't.  The reading material that came with the equipment was pretty inadiquate.  So I turned to my trusty friend Google to get the answers.  I really didn't find a ton of information out there, but enough to at least get started.  Anyway, the kit only took care of the fermentation process, I still needed a way to get the juice from the apples.  As a result, over the last weekend, I managed to build my own apple press.  It took a little while only because I had other things to do, but I was able to finish. 

Hopefully, in the coming days, I'll be able to post a little more about my cider making process.  Just if you were wondering, I did take pictures the entire time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-7588010630859423069?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/7588010630859423069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2006/10/on-side.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/7588010630859423069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/7588010630859423069'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2006/10/on-side.html' title='On the side'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-7045731011719147877</id><published>2006-09-18T06:24:00.000-07:00</published><updated>2007-04-03T12:10:25.366-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc languages'/><title type='text'>TDD and SAS, part II</title><content type='html'>My jump into the world of TDD on a mainframe with SAS has been a little frutsrating. I can see why the team that came up with FUTS did not touch the mainframe world. One thing that I have realized is that the macros associated with FUTS will work on a mainframe as is, but we dont have the luxury of having a perl script that will summarize all of the test cases and run all of the test suites which provides a nice little output. My goal is to provide a better means of reporting on the tests that do occur.

Since we dont have some of those luxuries on a mainframe, I tried to develop a pure SAS solution for developing, running, and summarizing all of the unit tests. Typically in most other languages, you have seperate object that is setup to perform tests. Then this is run by some sort of test runner that will summarize all of the output. In my case, I've realized that I have to include all of the unit test code within the SAS itself. By that I mean, if I invoke the SAS interpreter I need to include the tests within the same instance as the program that is currently running. Thats pretty straight forward, just include whatever unit tests you want within the code that you want to test. I recommend encapsulating all of your unit tests within another macro so that you can turn the tests on an off. This will be helpful when you move your code to production. That takes care of getting our tests completed.

My second concern is with the fancy reporting. Since the output of the FUTS macros go to the SASLOG, we need another SAS program to summarize the results from the log. This is where the recommendation for an encapsulation macro becomes even more useful. Once the encapsulation macro has been invoked, I typically indicate in the current SASLOG that the testing will begin and I save off the path name. Then I change the path of the current SASLOG to something temporary, I'll elaborate on this in a little bit. Next, you should include the code for all of your test cases. I typically create the code in another file, that way that allows for two people to work on the same code. Finally, read in the temporary file and run it through a set of SAS code that will generate our results and outputting it to our destination of choice.

This may not be the most awesome way of dealing with testing on the mainframe but its my attempt of trying to deal with writing better code and being more confident of changes that I may put into my code.

I'll try to include a copy of my macro code, or at least pseudo code for how this process was set up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-7045731011719147877?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/7045731011719147877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2006/09/tdd-and-sas-part-ii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/7045731011719147877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/7045731011719147877'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2006/09/tdd-and-sas-part-ii.html' title='TDD and SAS, part II'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-1585594335116887307</id><published>2006-09-17T15:14:00.000-07:00</published><updated>2007-04-03T12:10:25.367-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc languages'/><title type='text'>Submitting Jobs within SAS</title><content type='html'>I ran across this in the mailing list online. I found it to be pretty helpful. Since all of my work is done on a mainframe I can attest to it working there but for the other environment, windows, unix, etc, you may need to help me out on that one.

&lt;code&gt;
FILENAME INJCL 'PATH.TO.JOB' DISP=SHR;
FILENAME OUTRDR SYSOUT=A PGM=INTRDR RECFM=FB LRECL=80;
DATA _NULL_;
INFILE INJCL(JOBNAME);
FILE OUTRDR NOPRINT NOTITLES;
INPUT;
PUT _INFILE_;
RUN;
&lt;/code&gt;

One thing to note.  We are not really "submitting" the job, but we basically are adding it to the internal reader which then adds the job to the queue.  So be careful when referring to this section of code as "submitting" a job.

For the site that I work at, I've created a macro that I've compiled that will perform this function.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-1585594335116887307?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/1585594335116887307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2006/09/submitting-jobs-within-sas.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/1585594335116887307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/1585594335116887307'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2006/09/submitting-jobs-within-sas.html' title='Submitting Jobs within SAS'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-8302439553993253492</id><published>2006-09-14T20:14:00.000-07:00</published><updated>2007-04-03T12:10:25.367-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc languages'/><title type='text'>TDD and SAS</title><content type='html'>Unlike most other programming languages, SAS does not have its own framework for Testing.  This can be somewhat frustrating when developing processes to convert data or to evaluate large datasets.

Well that time is over.  I found the &lt;a href="http://www.thotwave.com/products/futs.jsp"&gt;FUTS&lt;/a&gt; framework on the web.  It was incredibly easy to find, I just typed "testing" and "SAS" into google and viola!   This framework was only released in March so its only been on the block for a little while.  It's such a great development because now like JUnit and NUnit, I can preform unit tests alot easier against my code.

This framework only works on unix/linux and windows system.  That kinda stinks since most of the work that I do is done on a z/OS box.  I'm going to attempt to port this to our mainframes at work, because I think it will be able to increase the quality of all of the work that we do.

I'll keep everyone updated on the results.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-8302439553993253492?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/8302439553993253492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2006/09/tdd-and-sas.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/8302439553993253492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/8302439553993253492'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2006/09/tdd-and-sas.html' title='TDD and SAS'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-670033159045731722</id><published>2006-09-12T08:34:00.000-07:00</published><updated>2006-12-02T13:11:02.891-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>New Site</title><content type='html'>Finally.... It's complete.

I found a template on the &lt;a href="http://www.oswd.org/"&gt;open source web design&lt;/a&gt; site that I really liked so I figured I would give it a shot with the new version of blogger thats in beta. I must say that the process was a little annoying in terms of creating the site design.

The people at Blogger came up with a new set of tags that can be used to create your entire site. Unfortunately, this tag structure is very rigid. Let me run through an example and then afterward I'll list a few of my annoyances. When encapsulating any kind of function within the template you need to create whats call a widget. Then within that widget you have to create multiple code blocks called includeables. The includables function like subroutines analogous to the subroutines you'd have in Visual Basic. All of the includeable tags need to have an id attribute set to identify it between the others in the widget. Also, you need to set at least one of the includeables with an id of main. Thats the main entry point for the widget. Then you can reference the other includeables from within the "main includeable". One more thing, for each widget that you create on the page, you must encapuslate that within a section. You can have multiple widgets within a section. Now when the page is actually rendered, the widget and section tags will actually get transformed into &amp;lt;div&amp;gt; tags.

Now lets run down the annoyances.....

&lt;ul&gt;&lt;li&gt;When creating a widget and setting the class variable, Blogger overrides anything that you set in this attribute when rendering the page.  This removes the ability to set the class variable to something of your choosing.  You could probably use the rendered name in the class attribute in your css, but since class is unique for each widget, it kinda defeats the purpose.&lt;/li&gt;&lt;li&gt;The only tags that can be in the Blogger template section tags are widgets, and I mean only.  You're not allow to have any comment tags either.  I think it makes the template a little messy.  &lt;/li&gt;&lt;li&gt;Forcing widgets to be within section tags.  I found this a little annoying because it created another layer of div tags in the markup.  It made it a little difficult when dealing with the css.  I'm still trying to figure out what use the section tag has other than containing widgets.&lt;/li&gt;&lt;li&gt;The help file is still a little sparse, but since the new service is still in beta, we'll let this one slide.  &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The new features of Blogger are nice, but I wouldn't call them earth shattering.  If the template markup was a little more flexible, I'd probably feel a little better about Blogger as a service.  I still would recommend you check them out for you site.  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-670033159045731722?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/670033159045731722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2006/09/new-site.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/670033159045731722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/670033159045731722'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2006/09/new-site.html' title='New Site'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-114831197128392677</id><published>2006-05-21T19:52:00.000-07:00</published><updated>2006-05-22T08:33:54.360-07:00</updated><title type='text'>Being Around</title><content type='html'>I spent most of this weekend contemplating and thinking.  No..... I wasn't alone most of the time.  I actually had things to do and I was relatively busy the entire time. 

I one thought seemed to come up more than a couple of times.  Making plans.  Do some people expect everyone else to make all of the plans?  That question was a little extreme, but I'm referring to something more subtle than that.

The rhtorical question of the day.....    Do you feel like nothing happens unless you explicitly say that youre free?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-114831197128392677?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/114831197128392677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2006/05/being-around.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/114831197128392677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/114831197128392677'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2006/05/being-around.html' title='Being Around'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-114729692949126149</id><published>2006-05-10T14:28:00.000-07:00</published><updated>2007-04-03T12:13:01.056-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>Xterra!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2966/304/1600/DSC00033.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/2966/304/400/DSC00033.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-114729692949126149?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/114729692949126149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2006/05/xterra.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/114729692949126149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/114729692949126149'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2006/05/xterra.html' title='Xterra!'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-114625934413133403</id><published>2006-04-28T14:11:00.000-07:00</published><updated>2006-05-01T11:43:40.006-07:00</updated><title type='text'>Look who enjoys work</title><content type='html'>&lt;img src="http://static.flickr.com/52/136561795_8d9de5d85e.jpg" align="left" style="margin-right:5px; margin-bottom:5px"/&gt; I guess the cat likes staring at the computer while working at home.  At least one of us does......&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-114625934413133403?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/114625934413133403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2006/04/look-who-enjoys-work.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/114625934413133403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/114625934413133403'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2006/04/look-who-enjoys-work.html' title='Look who enjoys work'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-114179799359717254</id><published>2006-03-07T21:56:00.000-08:00</published><updated>2006-03-07T22:06:33.596-08:00</updated><title type='text'>Necessary Evil</title><content type='html'>I recently purchased a new car.   Ahh...  cars.  Something like like to deem a necessary evil.  Really, if you dont live in a major metro area, you definately need to have that car.  Theres just no other way to get around town.  Unfortunate at best, but oh well. 

You must be thinking, well what kind of car did you get?  If cars are such a necessary evil, you must have purchased something thats modest.  So... I ended up purchasing a Nissan Xterra.  I know, I know, if cars are such an evil, why did I get something that really isn't so modest.  I figured I really wanted something with utility and that wasn't so cushy.  I really trashed my last car, and I didn't want anything that wouldn't be able to handle a little beating up. 

Anyway, I'm pleased with my purchase, although the gas prices piss me off sometimes, but I guess thats what I get for buying an suv.  Maybe I'll get some pics up here of the new wheels.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-114179799359717254?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/114179799359717254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2006/03/necessary-evil.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/114179799359717254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/114179799359717254'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2006/03/necessary-evil.html' title='Necessary Evil'/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6201986.post-109182691850607455</id><published>2004-08-06T14:14:00.000-07:00</published><updated>2004-08-06T14:15:18.506-07:00</updated><title type='text'></title><content type='html'>something goes here.... who knows what?
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6201986-109182691850607455?l=neovintage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neovintage.blogspot.com/feeds/109182691850607455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neovintage.blogspot.com/2004/08/something-goes-here.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/109182691850607455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6201986/posts/default/109182691850607455'/><link rel='alternate' type='text/html' href='http://neovintage.blogspot.com/2004/08/something-goes-here.html' title=''/><author><name>Rimas Silkaitis</name><uri>http://www.blogger.com/profile/06120837328119298457</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_7qcbQ5ZcM54/R_RAWisbTZI/AAAAAAAAAEg/fAb8MEpG8jk/S220/Photo_1_bigger.jpg'/></author><thr:total>0</thr:total></entry></feed>
