<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns='http://www.w3.org/1999/xhtml'>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
    <title>evil.che.lu</title>
    <link href='http://openid.claimid.com/server' rel='openid.server' />
    <link href='http://openid.claimid.com/evilchelu' rel='openid.delegate' />
    <link href='http://feeds.feedburner.com/evilchelu' rel='alternate' title='evil.che.lu feed' type='application/atom+xml' />
    <link href='/stylesheets/base.css' media='screen' rel='stylesheet' type='text/css' />
    <!--[if IE]>
      <link href='/stylesheets/base_ie.css' media='screen' rel='stylesheet' type='text/css' />
    <![endif]-->
    <script src='/javascripts/app.js' type='text/javascript'></script>
  </head>
  <body class='che fixed blue'>
    <script type='text/javascript'>
      loadPreferences()
    </script>
    <div id='wrapper'>
      <div class='clearfix' id='header'>
        <div class='clearfix' id='title'>
          <h1><a href='/'>evil.che.lu</a></h1>
        </div>
        <h2>Sections</h2>
        <ul id='menu'>
          <li class='selected'>
            <a href='/'>home</a>
          </li>
          <li class=''>
            <a href='/about'>about</a>
          </li>
          <li class=''>
            <a href='/projects'>projects</a>
          </li>
        </ul>
      </div>
      <div class='clearfix' id='contentwrapper'>
        <div id='content'>
          <div id='innerwrapper'>
            <div class='article'>
              <h2 class='title'><a href='/2009/02/07/easy-dependency-management-for-git-with-braid'>Easy dependency management for git with braid</a></h2>
              <p class='meta'>
                by Cristi Balan
                on
                2009-02-07
              </p>
              <div class='body'>
                <p>This article was written for the <a href="http://advent2008.hackruby.com/past/2008/12/20/easy_dependency_management_for_git_with_braid/">ruby advent 2008, day 20</a>. I&#8217;m reposting it here so I have a backup under my own roof.</p>
                <p>If you already know about vendoring and why it&#8217;s good for you, feel free to skip directly directly to the <a href="">braid example</a>#.</p>
                <p>If you still need convincing, read on.</p>
                <h2>Vendoring theory</h2>
                <p>It&#8217;s a well-known fact that every piece of code that you write should be version controlled.</p>
                <p>Not reinventing the wheel is also a good idea that will keep you happy. In practice, not reinventing the wheel means trying to use libraries or plugins written by other happy open source developers. This means that you now have external dependencies.</p>
                <p>Generally, you want your project to be as stable as possible. However, you will also want to update your external dependencies quite often to make use of their new and shiny features.</p>
                <p>The <strong>simplest way is to just make a note in the documentation</strong> and hope that all our users and contributors will setup things correctly. But this is an error prone procedure and it might be too much work for some to the extent that they might not bother.</p>
                <p>Still, if all that you require from your external dependencies is an official release, most ruby libraries are released as a gem so, you could just use rubygems and be done with it.</p>
                <p>Using rubygems is all fine <strong>until you need to make some custom changes</strong> to a library. These might be some changes you are not ready to submit to the original projects, or even changes that you submitted but have not yet been integrated. Or, maybe they don&#8217;t even make sense for anyone else but you.</p>
                <p>Due to ruby&#8217;s nature, in some cases, you can avoid having all of the external code in your repository with some clever monkey-patching. But, if you have changes that are not trivial, sooner or later, you will need to <strong>bundle the external dependency</strong> with your project.</p>
                <p>A <strong>simple and quick idea</strong> is to just take all the source code of your dependency form it&#8217;s repository, <strong>copy and dump</strong> it in a directory, remove the .git or .svn directories and simply commit it. This is a good enough starting point and <strong>it&#8217;s exactly what script/plugin does</strong> in rails. You are now free to tweak it to your heart&#8217;s content and then commit it to your own project&#8217;s repository.</p>
                <p>Let&#8217;s say that you now vendored a few libraries and happily hacked on them and your project for a while. Suddenly, a security flaw is discovered in one of the external libraries. It&#8217;s authors are quick to provide a fix and you are keen to have it.</p>
                <p>So, if you used the &#8220;copy and dump&#8221; approach, you&#8217;re kinda screwed, since you need both the security fix and your magic tweaks. You have to either <strong>manually merge the changes</strong>, <strong>discard your changes</strong> and start from zero with the latest version or, <strong>ignore the security issue</strong> altogether. I&#8217;m not sure which one is scarier :).</p>
                <p>Let&#8217;s just assume that you definitely need both the security fix and all your custom changes. Basically, to continue, you have two options. You could either <strong>apply the new fixes on top of your code</strong> or you could <strong>reapply your fixes on top of the new library code</strong>.</p>
                <ul>
                	<li>Applying new fixes on top of your code</li>
                </ul>
                All you need is a patchfile from the point where you vendored the dependency up to now. You&#8217;ll most likely have to create it by yourself. Then, you can try applying it on top of your code. If you want to go this route, I hope you noted that initial revision down somewhere or else, you&#8217;d have to guess and actually be lucky.
                <ul>
                	<li>Applying your custom changes on top of the most recent version</li>
                </ul>
                All you need for this is all of your custom changes. Then, you can simply remove your vendored code, &#8220;copy and dump&#8221; the new one in, commit, and reapply your changes. If you want to go this route, I hope you kept all your commits to the vendored code in separate patchfiles and are happy manually applying patches.
                <h2>Vendor everything</h2>
                <p>Besides needing major custom changes, there are two other major reasons you might want to bundle your external dependencies.</p>
                <p>One is that if you are using a new library that&#8217;s in active development, you will most likely need to update with bugfixes quite often.</p>
                <p>The other is that if you are developing a web application that needs to be deployed, you will not want to depend on external repositories being down and preventing your deploy.</p>
                <p>So, most of the time you will want to bundle external dependencies anyway, regardless of any custom changes you may or may not have.</p>
                <h2>Theory conclusion</h2>
                <p>If you made it this far, you should have a pretty good picture about your vendoring needs. I&#8217;ll just make this easy to skim by recapping things.</p>
                <h2>You don&#8217;t need vendoring if:</h2>
                <ul>
                	<li>You are writing <strong>a library that depends on another library</strong>. Just use rubygems. Examples of this are most gems like capistrano, braid, haml, etc.</li>
                	<li>You are writing <strong>a library that depends on another library and needs minor tweaks</strong>. Just use rubygems and a small monkey-patch.</li>
                	<li>You are writing <strong>an application that will be deployed and you don&#8217;t care if you can&#8217;t deploy</strong> :). Example: websites that fail to deploy.</li>
                </ul>
                <h2>You need vendoring if:</h2>
                <ul>
                	<li>You need <strong>close integration with an external library</strong>. Example: gitnub uses grit internally. So, it&#8217;s bundled.</li>
                	<li>You need to <strong>update to new releases of the external library</strong> relatively often. Example: all rails applications that use plugins such as will_paginate, acts_as_list, etc</li>
                	<li>You need to be able to <strong>deploy even if everything is down</strong>, except the production server :). If have vendored everything, you can still deploy form your local directory.</li>
                	<li>You want other people working on the project to <strong>be able to quickly get started</strong></li>
                </ul>
                <p>So, basically, <strong>you need vendoring most of the time</strong>. There are several tools out there to help with this. Braid is the first one that was written especially to take advantage of git&#8217;s power. Keep reading to see how easy braid makes things for you.</p>
                <h2>Using braid to manage dependencies in git</h2>
                <p>Let&#8217;s go through a simple scenario to see how easy braid makes dependency management by using a completely silly example. You will notice that braid commands are very simple and scarcely used. To make them stand out, they will be <strong>highlighted</strong>.</p>
                <p>The requirements are simple: we need to make an app that makes it clear that the hoff should not be hassled. Since this is a simple app, let&#8217;s use <a href="http://sinatra.rubyforge.org/">sinatra</a>.</p>
                <p>Okay, let&#8217;s start by initializing an empty git repository:</p>
                $ mkdir donthasslethehoff
                $ cd donthasslethehoff
                $ git init
                Initialized empty Git repository in /Users/chelu/tmp/donthasslethehoff/.git/
                $ echo donthasslethehoff &gt; <span class="caps">README</span>
                $ git add <span class="caps">README</span>
                $ git commit -m &#8220;initial commit&#8221;
                Created initial commit c6eeba4: initial commit
                1 files changed, 1 insertions(+), 0 deletions(-)
                create mode 100644 <span class="caps">README</span>
                <p>To start, we&#8217;ll <strong>vendor sinatra using braid</strong>:</p>
                $ braid add git://github.com/bmizerany/sinatra.git
                <p><strong>This will simply create a normal commit</strong> in your repository with all that is needed to make braid work. If someone clones your repository, they don&#8217;t have to do anything. They don&#8217;t need braid installed and don&#8217;t even need to know you&#8217;re using braid.</p>
                <p>You will now have sinatra in a directory inside your app. Let&#8217;s add the code to display the message.</p>
                $ cat &gt; hoff.rb
                $:.unshift File.dirname(<i><span class="caps">FILE</span></i>) + &#8216;/sinatra/lib&#8217;
                require &#8216;sinatra&#8217;
                get &#8216;/&#8217; do
                &#8220;don&#8217;t hassle the hoff&#8221;
                end
                ^D
                <p>And, we&#8217;re done. Let&#8217;s try it out:</p>
                $ ruby hoff.rb
                <p>Load up http://localhost:4567/ in a browser, and see that it worked. All ok? Go ahead and commit our changes:</p>
                $ git add .
                $ git commit -m &#8220;not hassling the hoff&#8221;
                <p>Now, the site looks good but, our app must make it <strong>very clear</strong> that the hoff should not be hassled! So, let&#8217;s go ahead and change sinatra&#8217;s console messages to be more clear about this. This is one of those <strong>have to tweak a dependency</strong> situations I mentioned earlier.</p>
                <p>So, go to sinatra/lib/sinatra.rb and search for the line that says: &#8220;has taken the stage&#8221;. Add a new line just below it:</p>
                puts &#8220;Sinatra says: Remember folks. Don&#8217;t hassle the Hoff!&#8221;
                <p>Now we&#8217;re talking. Everytime you start your sinatra app, you will be reminded not to hassle he hoff. Restart to see the new message and commit the change:</p>
                $ git add .
                $ git commit -m &#8220;not hassling the hoff hack&#8221;
                <p>You can now also <strong>use the braid diff command to see all of your custom changes to sinatra</strong>:</p>
                $ braid diff sinatra
                <p>After a while, you will want to <strong>use braid to update your sinatra mirror</strong> to get bugfixes and new features. Just make sure you don&#8217;t have any uncommitted local changes and run:</p>
                $ braid update sinatra
                <p>This will bring you sinatra goodies and still leave your modifications in place. Under the hood, braid will do some tricks so that the power of git is leveraged to merge the changes in smoothly. Again, <strong>the end result will be just a normal git commit</strong>.</p>
                <h2>Thanks</h2>
                <p>I hope this made it clear how easy and simple using braid is. You can find more examples on the <a href="http://github.com/evilchelu/braid/wikis">braid wiki</a>.</p>
                <p>You can file bugs and feature requests at the <a href="http://evilchelu.lighthouseapp.com/projects/10600-braid"><strong>braid project on lighthouse</strong></a>. And there is also a google group for discussions and community support: <a href="http://groups.google.com/group/braid-gem/"><strong>braid-gem google group</strong></a>.</p>
                <p>Braid is hosted on github at <a href="http://github.com/evilchelu/braid/tree/master">http://github.com/evilchelu/braid/tree/master</a> and we are always glad to receive patches and suggestions.</p>
              </div>
            </div>
            <div class='article'>
              <h2 class='title'><a href='/2008/12/20/braid-article-on-ruby-advent'>braid article on ruby advent</a></h2>
              <p class='meta'>
                by Cristi Balan
                on
                2008-12-20
              </p>
              <div class='body'>
                <p>I just wrote an article for the <a href="http://advent2008.hackruby.com/">ruby advent 2008</a> series.</p>
                <p>It has more introductory details about vendoring and why you should do it. So, if you were not sure whether to braid or not, check out the <a href="http://advent2008.hackruby.com/past/2008/12/20/easy_dependency_management_for_git_with_braid/">Easy Dependency Management for Git with Braid</a> article.</p>
              </div>
            </div>
            <div class='article'>
              <h2 class='title'><a href='/2008/10/29/braid-0-5-vendor-your-git-and-svn-repositories'>ANN: braid 0.5 - vendor your git and svn repositories</a></h2>
              <p class='meta'>
                by Cristi Balan
                on
                2008-10-29
              </p>
              <div class='body'>
                <p><a href="http://github.com/evilchelu/braid/wikis/home">Braid</a> is a simple tool to help track git and svn vendor branches in a git repository.</p>
                <p>This is a major release that brings two main features (no more braid/track branch and better merging support) and lots of usability changes, bugfixes and tweaks.</p>
                <p>The <a href="http://github.com/evilchelu/braid/wikis/home">braid project page</a> has now moved to github, mainly because we wanted to use the wiki for documentation.</p>
                <p>Braid now also has a google group. If you have questions or ideas about braid, please subscribe to <a href="http://groups.google.com/group/braid-gem">http://groups.google.com/group/braid-gem</a>.</p>
                <h2>Installing</h2>
                gem install braid
                <h2>Important changes from 0.4</h2>
                <ul>
                	<li>removed braid/track branch</li>
                	<li>use merge-recursive to allow changes from upstream to be automatically merged in</li>
                	<li>added local cache to workaround git fetch limitations</li>
                </ul>
                <h2>Other changes from 0.4</h2>
                <ul>
                	<li>improved messages</li>
                	<li>refactoring all around</li>
                	<li>moved to test/spec from rspec</li>
                	<li>basic integration tests</li>
                </ul>
                <h2>Coming soon in braid 0.6</h2>
                <ul>
                	<li>braid switch</li>
                	<li>braid format-patch</li>
                	<li>braid import</li>
                	<li>braid outdated</li>
                	<li>braid list</li>
                	<li>bash completion</li>
                	<li>possibly, windows compatibility</li>
                </ul>
              </div>
            </div>
            <div class='article'>
              <h2 class='title'><a href='/2008/04/30/ann-braid-0-4-piston-lookalike-for-git'>ANN: braid 0.4 - piston lookalike for git</a></h2>
              <p class='meta'>
                by Cristi Balan
                on
                2008-04-30
              </p>
              <div class='body'>
                <p><a href="http://evil.che.lu/projects/braid">Braid</a> is a simple tool to help track git and svn vendor branches in a git repository.</p>
                <p>This release fixes a bunch of bugs and adds important missing features which allow braid to actually be useful to people working in teams and it also stops polluting the git history with messages from the imported mirrors.</p>
                <p>This release is possible because of the work of <a href="http://primetheory.org/">Norbert Crombach</a>, who totally rocks!</p>
                <h2>Important changes</h2>
                <ul>
                	<li>all new mirrors are created squashed, which means that you&#8217;ll only get one commit when adding a mirror
                	<ul>
                		<li>if you already have braid mirrors you need to update to squashed format, please read the relevant section on the <a href="http://github.com/evilchelu/braid/wikis/usage-and-examples">Usage and examples page</a></li>
                	</ul></li>
                	<li>braid now can be used by all developers on a project. There&#8217;s a guide for this on the wiki.</li>
                </ul>
                <h2>Other changes</h2>
                <ul>
                	<li>braid diff</li>
                	<li>braid update can now lock to a revision</li>
                	<li>commands are only executed if there are no local changes and the git version is above 1.5.4.5</li>
                	<li>bunch of bugfixes and cleanups</li>
                </ul>
                <h2>Install with rubygems</h2>
                <p>Unfortunately the github gem server is not working for everyone yet so please install from the git repository if this doesn&#8217;t work</p>
                gem sources -a http://gems.github.com/ # only need to do this once
                gem install evilchelu-braid
                <h2>Get it from the git repository</h2>
                <p>Get a clone of the git repository using:</p>
                git clone git://github.com/evilchelu/braid.git
                cd braid
                rake install_gem
                braid &#8212;help # see usage
                <h2>Open source works!</h2>
                <p>This release is very special for me because it showed me, in a personal way, that open source really works.</p>
                <p>I was about to give up on braid at the end of March mainly because I had no idea on how to fix the history polluting and being able to work in teams. And there were also bugs and the code looked a bit ugly.</p>
                <p>Fortunately, I didn&#8217;t shut it down because after about a month where I didn&#8217;t do any updates to braid, <a href="http://primetheory.org/">Norbert Crombach</a> (<a href="http://github.com/norbert">github</a>) told me he forked the project on github and fixed all the major outstanding issues! I was shocked and awed by his effort and, since all the major stuff is now fixed, I found new motivation to work on braid again. Thanks, dude! :)</p>
                <p>We&#8217;ve been tweaking and cleaning up things for the last week to get this handy release out. We have ideas for a number of other features for the next releases so, head over to the <a href="http://github.com/evilchelu/braid">braid project page on github</a> and watch it to get updates. Github is great and it makes patching and merging so easy that we hope you&#8217;ll consider forking the project and contributing with code :).</p>
              </div>
            </div>
            <div class='article'>
              <h2 class='title'><a href='/2008/02/14/ann-braid-0-3-2'>ANN: braid 0.3.2</a></h2>
              <p class='meta'>
                by Cristi Balan
                on
                2008-02-14
              </p>
              <div class='body'>
                <p>If you got <a href="http://evil.che.lu/projects/braid">braid</a> from the git repository before 12:40GMT, please pull the latest changes.</p>
                <p>The 0.3.0 version has a bug where it will clone the mirrored svn repositories entierly. braid 0.3.1 just grabs the <span class="caps">HEAD</span> revision and this is significantly faster.</p>
                <h2>Changes</h2>
                <p><span class="caps">BUGFIXES</span></p>
                <ul>
                	<li>braid was fetching entire repositories for svn mirros. changed to fetch only <span class="caps">HEAD</span></li>
                	<li>workaround for stupid git svn behaviour. it is transforming all _ (underscores) into . (periods) in git svn remote branch names
                	<ul>
                		<li>braid now is replacing all _ with &#8211; preemtively</li>
                	</ul></li>
                </ul>
                <p><span class="caps">BUGS</span></p>
                <ul>
                	<li>braid only works with a quite recent git (I&#8217;m using latest from the git git repo). I know that git 1.5.2 definitely doesn&#8217;t work (git fetch is acting up). Not sure about versions in between.</li>
                </ul>
                <h2>Updating</h2>
                cd braid
                git pull
                rake install_gem
                <h2>Get it</h2>
                git clone git://github.com/evilchelu/braid.git
                cd braid
                rake install_gem
                braid &#8212;help # see usage
                <h2>Sighseeing</h2>
                <p>Mihai Anca has written a nice article showing some real world braid usage: <a href="http://ropiku.wordpress.com/2008/02/04/installing-rspec-with-braid/">Installing rspec with braid</a></p>
                <p>He also helped track down the stupid bugs in the 0.3.0 release. I have beers already prepared.</p>
              </div>
            </div>
            <hr>
              See all posts in the
              <a href='/archives'>archives</a>
            </hr>
          </div>
        </div>
        <div id='sidebar'>
          <div class='boxy short'>
            <h3>About</h3>
            <p>I'm Cristi Balan, a freelance web developer currently living in a cave in Granada, Spain.</p>
            <p>I like CSS, semantic markup, unobtrusive javascript, Ruby on Rails and good coding practices.</p>
            <p>Currently, I am available for freelance work. You can reach me at <a href='mailto:evil@che.lu'>evil@che.lu</a>.</p>
            <p id='subscribe'>
              <a class='feed' href='http://feeds.feedburner.com/evilchelu'>subscribe to my feed</a>
            </p>
          </div>
          <div class='boxy tall minor'>
            <h3>Archives</h3>
            <ul>
              <li>
                <a href='/2009/02/07/easy-dependency-management-for-git-with-braid'>Easy dependency management for git with braid</a>
                <em>(2009-02-07)</em>
              </li>
              <li>
                <a href='/2008/12/20/braid-article-on-ruby-advent'>braid article on ruby advent</a>
                <em>(2008-12-20)</em>
              </li>
              <li>
                <a href='/2008/10/29/braid-0-5-vendor-your-git-and-svn-repositories'>ANN: braid 0.5 - vendor your git and svn repositories</a>
                <em>(2008-10-29)</em>
              </li>
              <li>
                <a href='/2008/04/30/ann-braid-0-4-piston-lookalike-for-git'>ANN: braid 0.4 - piston lookalike for git</a>
                <em>(2008-04-30)</em>
              </li>
              <li>
                <a href='/2008/02/14/ann-braid-0-3-2'>ANN: braid 0.3.2</a>
                <em>(2008-02-14)</em>
              </li>
              <li>
                <a href='/2008/02/13/ann-braid-0-3-0'>ANN: braid 0.3.0</a>
                <em>(2008-02-13)</em>
              </li>
              <li>
                <a href='/2008/01/18/giston-update-coming-soon'>Giston update coming soon</a>
                <em>(2008-01-18)</em>
              </li>
              <li>
                <a href='/2008/01/18/ann-giston-0-2-0'>ANN: giston 0.2.0</a>
                <em>(2008-01-18)</em>
              </li>
              <li>
                <a href='/2007/11/27/ann-giston-piston-lookalike-for-git'>ANN: giston - piston lookalike for git</a>
                <em>(2007-11-27)</em>
              </li>
              <li>
                <a href='/2007/08/15/this-mephisto-was-impaled-by-vlad-1-0'>This mephisto was impaled by vlad 1.0</a>
                <em>(2007-08-15)</em>
              </li>
              <li>
                <a href='/2007/08/14/using-git-to-track-changes-to-mephisto'>Using git to track changes to mephisto</a>
                <em>(2007-08-14)</em>
              </li>
              <li>
                <a href='/2007/08/14/leaving-svk-for-git'>Leaving svk for git</a>
                <em>(2007-08-14)</em>
              </li>
              <li>
                <a href='/2007/05/13/i-can-has-new-servar'>I can has new servar!</a>
                <em>(2007-05-13)</em>
              </li>
              <li>
                <a href='/2007/04/06/skittlish-0-4-release-and-sightseeing'>skittlish 0.4 release and sightseeing</a>
                <em>(2007-04-06)</em>
              </li>
              <li>
                <a href='/2007/04/05/css-naked-half-day'>CSS Naked (Half) Day</a>
                <em>(2007-04-05)</em>
              </li>
              <li>
                <a href='/2006/09/29/skittlish-on-a-svn'>Skittlish on a svn</a>
                <em>(2006-09-29)</em>
              </li>
              <li>
                <a href='/2006/09/25/no-more-ie6-background-flicker'>No more IE6 background flicker</a>
                <em>(2006-09-25)</em>
              </li>
              <li>
                <a href='/2006/09/13/skittlish-0-2-released'>Skittlish 0.2 released</a>
                <em>(2006-09-13)</em>
              </li>
              <li>
                <a href='/2006/09/13/a-new-bamboo-beginning'>A New Bamboo beginning</a>
                <em>(2006-09-13)</em>
              </li>
              <li>
                <a href='/2006/09/06/time-to-say-goodbye'>Time to say goodbye</a>
                <em>(2006-09-06)</em>
              </li>
              <li>
                <a href='/2006/06/28/ugly-no-more'>Ugly no more</a>
                <em>(2006-06-28)</em>
              </li>
              <li>
                <a href='/2006/06/23/rails-day-2006'>Rails Day 2006</a>
                <em>(2006-06-23)</em>
              </li>
              <li>
                <a href='/2006/03/26/myfeedz-teaser'>myFeedz teaser</a>
                <em>(2006-03-26)</em>
              </li>
              <li>
                <a href='/2006/03/24/go-me'>Go me!</a>
                <em>(2006-03-24)</em>
              </li>
            </ul>
          </div>
          <div class='boxy tall'>
            <h3>People</h3>
            <dl>
              <dt>Local peeps</dt>
              <dd>
                <a href='http://tase.ro/'>Adrian Tanase</a>
              </dd>
              <dd>
                <a href='http://www.toth.ro/'>Gabi Toth</a>
              </dd>
              <dd>
                <a href='http://mordax.ro/'>Marius Zaharia</a>
              </dd>
              <dt>World wide posse</dt>
              <dd>
                <a href='http://iamrice.org/'>Damien Tanner</a>
              </dd>
              <dd>
                <a href='http://www.fearoffish.co.uk/'>Jamie van Dyke</a>
              </dd>
              <dd>
                <a href='http://technomancy.us/'>Phil Hagelberg</a>
              </dd>
              <dd>
                <a href='http://blog.caboo.se/'>caboo.se</a>
              </dd>
            </dl>
          </div>
        </div>
      </div>
      <div id='options'>
        <h2>
          Options:
        </h2>
        <h3>
          Size
        </h3>
        <ul id='option_size'>
          <li class='fixed' id='option_size_fixed'>
            <a>
              <span>
                fixed
              </span>
            </a>
          </li>
          <li class='fluid' id='option_size_fluid'>
            <a>
              <span>
                fluid
              </span>
            </a>
          </li>
        </ul>
        <h3>
          Colors
        </h3>
        <ul id='option_color'>
          <li class='orange' id='option_color_orange'>
            <a>
              <span>
                orange
              </span>
            </a>
          </li>
          <li class='blue' id='option_color_blue'>
            <a>
              <span>
                blue
              </span>
            </a>
          </li>
          <li class='green' id='option_color_green'>
            <a>
              <span>
                green
              </span>
            </a>
          </li>
          <li class='pink' id='option_color_pink'>
            <a>
              <span>
                pink
              </span>
            </a>
          </li>
          <li class='cyan' id='option_color_cyan'>
            <a>
              <span>
                cyan
              </span>
            </a>
          </li>
          <li class='red' id='option_color_red'>
            <a>
              <span>
                red
              </span>
            </a>
          </li>
          <li class='violet' id='option_color_violet'>
            <a>
              <span>
                violet
              </span>
            </a>
          </li>
        </ul>
      </div>
      <div id='footer'>
        <p>
          Copyright &copy; 2006-2009, Cristi Balan.
          Valid <a href='http://evil.che.lu/projects/skittlish'>XHTML</a> and <a href='http://jigsaw.w3.org/css-validator/check/referer'>CSS</a>.
        </p>
        <p>Using <a href='http://evil.che.lu/projects/skittlish'>skittlish</a> on <a href='http://webby.rubyforge.org/'>webby</a>.</p>
      </div>
    </div>
    <script src='http://www.google-analytics.com/urchin.js' type='text/javascript'></script>
    <script type='text/javascript'>
      _uacct = "UA-563854-1";
      urchinTracker();
    </script>
  </body>
</html>
