<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[MDLog:/sysadmin]]></title>
  <link href="http://www.ducea.com/atom.xml" rel="self"/>
  <link href="http://www.ducea.com/"/>
  <updated>2013-03-23T09:57:11-07:00</updated>
  <id>http://www.ducea.com/</id>
  <author>
    <name><![CDATA[Marius Ducea]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[HowTo Migrate to Chef 11]]></title>
    <link href="http://www.ducea.com/2013/03/05/howto-migrate-to-chef-11/"/>
    <updated>2013-03-05T10:06:00-08:00</updated>
    <id>http://www.ducea.com/2013/03/05/howto-migrate-to-chef-11</id>
    <content type="html"><![CDATA[<p><a href="http://www.opscode.com/blog/2013/02/04/chef-11-released/"><strong>Chef 11</strong></a> was released earlier in February and it is awesome! Like most people, I love the new features like partial search, chef-apply and knife-essentials inclusions, awesome formatted output, etc. Of course the open source chef 11 server was <a href="http://www.opscode.com/blog/2013/02/15/the-making-of-erchef-the-chef-11-server/">rewritten completely</a> in erlang with postgresql/mysql support replacing the ruby/couchdb backend stack. solr and rabbitmq are still there ;)… There are many  <a href="http://docs.opscode.com/breaking_changes_chef_11.html">breaking changes</a> meaning you will want to make sure that you fix your cookbooks before upgrading.</p>

<p>When you are ready to upgrade, you will notice that unfortunately there is no official migration path. This howto will document what I&#8217;ve used myself for such migrations and hopefully will help you too if you are trying to perform a similar upgrade.</p>

<p><strong>Opscode</strong> has done an amazing job with the omnibus installers and starting with Chef 11, the chef server has support for this also. Meaning you can install a new chef server simply by installing the rpm or deb for your platform and everything should be installed for you (ruby/gems, chef, rabbitmq, solr, erlang, postgresql, nginx). Just head over to <a href="http://www.opscode.com/chef/install/">http://www.opscode.com/chef/install/</a> and from the chef-server tab download the version for your OS.</p>

<p>In order to migrate to a new chef server we need to migrate from the old server:</p>

<ul>
<li>clients</li>
<li>nodes</li>
<li>roles</li>
<li>environments</li>
<li>data bags</li>
<li>cookbooks (with all the versions used in each environment)</li>
</ul>


<p>It is important to have all the clients with their proper public keys because if not we would have to re-register each one of them.</p>

<p>Personally, I&#8217;ve migrated using this process several servers from open source chef 0.10.x to chef 11, but theoretically this should work from any chef server implementation (hosted, private, etc.) because we are downloading and uploading the assets using the api calls.</p>

<!--more-->


<h3>Backup the data from the existing server</h3>

<p>You can use my <a href="http://www.ducea.com/2013/03/04/knife-backup/">knife-backup</a> plugin for this. Once you install the gem you can just run it and it will backup all the objects from the existing server:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>gem install knife-backup
</span><span class='line'>knife backup export</span></code></pre></td></tr></table></div></figure>


<p>This might take a while depending on your number of nodes/clients, cookbooks, etc. you have. Once completed you will have in <code>.chef/chef_server_backup</code> all the needed files.</p>

<p><strong>Optional:</strong> if you have many unused cookbook versions you might want to clean them first before the backup. You can use my <a href="http://www.ducea.com/2013/02/26/knife-cleanup/">knife-cleanup</a> plugin for this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>gem install knife-cleanup
</span><span class='line'>knife cleanup versions -D</span></code></pre></td></tr></table></div></figure>


<h3>Install the new Chef 11 server</h3>

<p>I would recommend to setup a new server as this would be the safest approach in case something doesn&#8217;t work out well and you don&#8217;t have to mess with your current environment. As mentioned earlier you can install the new server very easy with the <a href="http://www.opscode.com/chef/install/">omnibus installer</a>. For example for Ubuntu 12.04 this would look like:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>wget https://opscode-omnitruck-release.s3.amazonaws.com/ubuntu/12.04/x86_64/chef-server_11.0.6-1.ubuntu.12.04_amd64.deb
</span><span class='line'>dpkg -i chef-server*
</span><span class='line'>sudo chef-server-ctl reconfigure</span></code></pre></td></tr></table></div></figure>


<p>You can also use the <a href="https://github.com/opscode-cookbooks/chef-server">chef-server cookbook</a> to install your new server if you prefer that.</p>

<p>Once you have the new chef server up and running, you will need to setup a new admin account and a new knife config. I would recommend to use a special user for this to not interfere with the users that we are trying to import from the old server. I would call it <code>transfer</code>. From the local server this would look like:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>mkdir -p ~/.chef
</span><span class='line'>sudo cp /etc/chef-server/chef-webui.pem ~/.chef/
</span><span class='line'>sudo cp /etc/chef-server/chef-validator.pem ~/.chef/
</span><span class='line'>
</span><span class='line'>marius@chef:~# knife configure -i
</span><span class='line'>WARNING: No knife configuration file found
</span><span class='line'>Where should I put the config file? [/marius/.chef/knife.rb]
</span><span class='line'>Please enter the chef server URL: [http://localhost:4000] https://localhost
</span><span class='line'>Please enter a clientname for the new client: [transfer]
</span><span class='line'>Please enter the existing admin clientname: [chef-webui]
</span><span class='line'>Please enter the location of the existing admin client's private key: [/etc/chef/webui.pem] ~/.chef/chef-webui.pem
</span><span class='line'>Please enter the validation clientname: [chef-validator]
</span><span class='line'>Please enter the location of the validation key: [/etc/chef/validation.pem] ~/.chef/chef-validator.pem
</span><span class='line'>Please enter the path to a chef repository (or leave blank):
</span><span class='line'>Creating initial API user…
</span><span class='line'>Created client[transfer]
</span><span class='line'>Configuration file written to /marius/.chef/knife.rb</span></code></pre></td></tr></table></div></figure>


<p>Note: the default server keys will be located in <code>/etc/chef-server/</code> and not in <code>/etc/chef</code> like they used to be, and this is definitely a welcome change. Also the default server url will still look for http and port 4000, but with chef 11 this works behind a nginx load balancer and listens by default on standard https port.</p>

<h3>Restore the data from the old server</h3>

<p>Finally, now we can restore all the data from the old server. You can transfer it from the backup and for simplicity drop it in your user <code>.chef</code> folder under <code>.chef/chef_server_backup</code>; be sure to install the <strong>knife-backup</strong> gem to the server and you should be able to run:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>marius@chef:~# knife backup restore
</span><span class='line'>WARNING: This will overwrite existing data!
</span><span class='line'>WARNING: Backup is at least 1 day old
</span><span class='line'>Do you want to restore backup, possibly overwriting exisitng data? (Y/N) y
</span><span class='line'>Restoring clients
</span><span class='line'>...</span></code></pre></td></tr></table></div></figure>


<p>And this should restore all the data in the new server. Final step would be to regenerate the indexes:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>chef-server-ctl reindex</span></code></pre></td></tr></table></div></figure>


<p>Note: I want to point out that currently knife-backup will skip any clients that already exist on the server as I could not find a way to overwrite them using the api calls. This means that most certainly the validation key will need to be changed as that is a user that for sure will exist on the newly installed server.</p>

<h3>Final touches</h3>

<p>After the data migration is completed you will probably just have to point your DNS alias to the new server. One issue I&#8217;ve noticed is that the chef server when installed will use the local dns record in various places in its config files. When working on a temporary server this has caused problems once changing the dns and activating the server. The chef server will send to the client links from where to download the assets (cookbook parts for ex) and if this was unconfigured at install time then you might have to fix it and correct it to the dns entry the clients can download correctly; check it out:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>grep s3_url /var/opt/chef-server/erchef/etc/app.config</span></code></pre></td></tr></table></div></figure>


<p>and restart the chef server after correcting the s3_url:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>chef-server-ctl restart</span></code></pre></td></tr></table></div></figure>


<p>Hopefully this post will help you migrate to <strong>Chef 11</strong>. Feel free to let me know in the comments bellow if you had any issues following this process, or if it worked without any problems. Also if you find any problems with the tools used here <a href="https://github.com/mdxp/knife-cleanup">knife-cleanup</a> or <a href="https://github.com/mdxp/knife-backup">knife-backup</a> please open a ticket on github or submit a patch. Good luck!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[knife-backup]]></title>
    <link href="http://www.ducea.com/2013/03/04/knife-backup/"/>
    <updated>2013-03-04T14:34:00-08:00</updated>
    <id>http://www.ducea.com/2013/03/04/knife-backup</id>
    <content type="html"><![CDATA[<p>While working on migrating a chef server from 0.10.x to version 11, I ended up extending the <a href="https://github.com/stevendanna/knife-hacks/blob/master/plugins/backup_export.rb">BackupExport</a> and <a href="https://github.com/stevendanna/knife-hacks/blob/master/plugins/backup_restore.rb">BackupRestore</a> plugins written by <a href="https://github.com/stevendanna">Steven Danna</a> and <a href="https://github.com/jtimberman">Joshua Timberman</a> and added support for <strong>cookbooks</strong> and <strong>clients</strong>. Currently <a href="https://github.com/mdxp/knife-backup">knife-backup</a> has support for the following objects:</p>

<ul>
<li>clients</li>
<li>nodes</li>
<li>roles</li>
<li>environments</li>
<li>data bags</li>
<li>cookbooks and all their versions.</li>
</ul>


<p><strong>knife-backup</strong> will backup all cookbook versions available on the chef server. Cookbooks are normally available in a repository and should be easy to upload like that, but if you are using various cookbook versions in each environment then it might not be so trivial to find and upload them back to the server; downloading them and having them available to upload like that is simple and clean. If you have too many cookbook versions then you might want to cleanup them first using something like <a href="https://github.com/mdxp/knife-cleanup">knife-cleanup</a>.</p>

<!--more-->


<p>If you want to check it out, just install the gem:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>gem install knife-backup</span></code></pre></td></tr></table></div></figure>


<p>and then just point it to an existing chef server to backup all its objects with:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>knife backup export</span></code></pre></td></tr></table></div></figure>


<p>If you need to restore then it is simple as:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>knife backup restore [-d DIR]</span></code></pre></td></tr></table></div></figure>


<p>Hope you will find this useful and looking forward for your feedback. Patches are welcome: <a href="https://github.com/mdxp/knife-backup">knife-backup on github</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[knife-cleanup]]></title>
    <link href="http://www.ducea.com/2013/02/26/knife-cleanup/"/>
    <updated>2013-02-26T16:26:00-08:00</updated>
    <id>http://www.ducea.com/2013/02/26/knife-cleanup</id>
    <content type="html"><![CDATA[<p>I&#8217;m working on many projects where we have a process that will make sure that every change we introduce in the cookbooks enters as a <strong>new version</strong> and where we use extensively <em>environments</em> to select what versions of cookbooks we want to use in each environment. This sounds like a great idea, and a workflow that I would highly recommend to anyone for sure. Still, after a while, the result is that you will end up with hundreds maybe even thousands of cookbook versions and most of them are <strong>unused</strong> (besides the few ones that you are referencing in each environment and maybe the latest ones). Normally I would not care about this and as long as it is not causing performance issues you should not care about it either. Still you must admit that when debugging any problems, it will make it more complex with all those versions everywhere; see bellow an example.</p>

<!--more-->


<p><code>
hadoop       0.1.118 0.1.116 0.1.115 0.1.114 0.1.113 0.1.111 0.1.109 0.1.108 0.1.106 0.1.105 0.1.104 0.1.103 0.1.102 0.1.101 0.1.99 0.1.98 0.1.97 0.1.96 0.1.95 0.1.94 0.1.93 0.1.92 0.1.91 0.1.90 0.1.89 0.1.88 0.1.87 0.1.86 0.1.85 0.1.84 0.1.83 0.1.82 0.1.81 0.1.80 0.1.79 0.1.78 0.1.77 0.1.76 0.1.75 0.1.74 0.1.73 0.1.72 0.1.71 0.1.70 0.1.69 0.1.68 0.1.67 0.1.66 0.1.65 0.1.64 0.1.63 0.1.62 0.1.61 0.1.60 0.1.59 0.1.58 0.1.57 0.1.56 0.1.55 0.1.54 0.1.53 0.1.52 0.1.51 0.1.50 0.1.49 0.1.48 0.1.47 0.1.46 0.1.45 0.1.44 0.1.43 0.1.42 0.1.41 0.1.40 0.1.39 0.1.38 0.1.37 0.1.36 0.1.35 0.1.34 0.1.33 0.1.32 0.1.31 0.1.30 0.1.29 0.1.28 0.1.25 0.1.24 0.1.23 0.1.22 0.1.21 0.1.20 0.1.19 0.1.18 0.1.17 0.1.16 0.1.15 0.1.13 0.1.12 0.1.11 0.1.10 0.1.9 0.1.8 0.1.7 0.1.6 0.1.5 0.1.4 0.1.3 0.1.2 0.1.0
</code>
(and this was the cookbook with the least versions that I&#8217;ve found to paste here).</p>

<p>While working on <a href="https://github.com/mdxp/knife-backup">knife-backup</a> I realised what a huge waste this was, and decided that I needed a way to clean these and keep on the server just the relevant ones.</p>

<p>To solve this problem I wrote <a href="https://github.com/mdxp/knife-cleanup">knife-cleanup</a> and if you have similar needs you might find it useful. It will cleanup all unused versions of the cookbooks you have on your chef server (this might be hosted opscode platform or open source server). Before doing any deletion it will backup the version it touches (just in case).</p>

<p>If you want to check it out, just install the gem:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>gem install knife-cleanup</span></code></pre></td></tr></table></div></figure>


<p>and assuming you have a working knife config you can run it with:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>knife cleanup versions</span></code></pre></td></tr></table></div></figure>


<p>and this will output the versions it would delete.</p>

<p>If you are ready to delete, you can do that with:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>knife cleanup versions -D</span></code></pre></td></tr></table></div></figure>


<p>and you can find the backups of the versions deleted under <code>.cleanup/cookbook_name</code></p>

<p><em>Notes</em>: I&#8217;ve seen various cases where it is impossible to download a cookbook version (and knife will error out). From my experience there is not much we can do about that, so the script will just ignore the backup, but will delete the corrupt version. You might want to have a full chef server backup before (see <a href="https://github.com/mdxp/knife-backup">knife-backup</a>) just in case.
The way how I&#8217;m using this is with exact version pining of cookbooks in environments (for more details see <a href="https://github.com/mdxp/chef-jenkins">chef-jenkins</a>); if you are using environments and cookbook versions in a different way, then this might not make sense for you.</p>

<p>Hope you will find this useful and looking forward for your feedback.
Patches are welcome: <a href="https://github.com/mdxp/knife-cleanup">knife-cleanup on github</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Bay Area Chef User Group Update - After One Year]]></title>
    <link href="http://www.ducea.com/2013/02/04/bay-area-chef-user-group-update-after-one-year/"/>
    <updated>2013-02-04T14:36:00-08:00</updated>
    <id>http://www.ducea.com/2013/02/04/bay-area-chef-user-group-update-after-one-year</id>
    <content type="html"><![CDATA[<p>It&#8217;s been a little more than a year since I stepped up and became one of the organizers of the <a href="http://www.meetup.com/The-Bay-Area-Chef-User-Group/">Bay Area Chef user group</a>, trying to help my good friend <strong><em>Rob Berger</em></strong> as he was getting swamped with work and could not dedicate as much time to this, as he used to in the past. This post is meant to be a quick review on what happened during this time, what worked well and of course some ideas on how we can improve this in the future. I&#8217;m also hoping to get <strong>feedback</strong> from our members on what we can do differently in the future to better serve them and make this an even better group.</p>

<p>One of the first things we&#8217;ve done last year was to introduce the <strong>Chef Cafes</strong>. These are small events (we have a max limit of 10 people set for them) done consistently at the same time (1st and 3rd Thursday of the month) at the best coffee in Mountain View (<a href="http://www.redrockcoffee.org/">Red Rock Coffee</a>) with the intent to facilitate the interaction between people, give them a place where they can regularly meet and discuss about chef, ask questions and also try to help other members in the spirit of the open source community. The first Chef Cafe was on <em>March 1st 2012</em> and it was just me and Rob (we had a good time preparing the future events and just catching up). But after that, we had 16 Chef Cafe&#8217;s all year long and many of them had 10 or even more people, and each one of them was unique and special in its own way. We had some, where we had new chef users that had various questions on how to use chef and we tried to help them and resolve their blocks in understanding and getting up to speed with chef. On the other hand we had other cafes where we had really advanced uses that brainstormed about various unresolved problems and what was their take on things like cookbook testing, workflow or orchestration. Overall, I think it was a great success and allowed us to be more connected with members, and also more open and helpful to new chef users.</p>

<p>In <strong>2013</strong> we look forward to your suggestions on how we can improve the Chef Cafes and we will try to keep these going. We hope to be able to move one in San Francisco and keep the other one in the South Bay as we had various requests for that. <em>So if you are in the City and you want to get involved with this please ping me.</em></p>

<!--more-->


<p>One other thing we have tried to do was to bring consistency and have at least one meetup every month with an awesome presentation on some hot topic in the chef community. This ended up being a little too optimistic :(. Still, we had 6 cool meetups with speakers like:</p>

<ul>
<li><strong>Flip Kromer</strong> on Ironfan</li>
<li><strong>Jim Hopp</strong> on Test-Driven Development</li>
<li><strong>Jesse Robbins</strong> - Hacking culture &amp; Being a force for Awesome</li>
<li><strong>Daniel DeLeo</strong> on Whyrun mode</li>
<li><strong>Nati Shalom</strong> on Cloudify</li>
</ul>


<p>and we also had <strong>Aaron Peterson</strong> running an introductory <em>Chef Workshop</em>; considering the big and diverse audience I think we have done quite a great job with that.</p>

<p>With the experiences we had last year, we are more confident that this year we will be able to run one meetup every month, but we need your help: <em>we are always looking for great speakers and interesting topics; if you want to present at one of our meetups please let us know; also if you know someone that we should invite to present to a meetup please let us know.</em></p>

<p>Most of our meetups last year were hosted by <strong>Survey Monkey</strong> in Palo Alto and we can&#8217;t thank them enough for their support (special thanks to <em>Tim Sabat</em> for making them possible). We also had one meetup in San Francisco hosted at Scalr offices (thanks Sebastian). This year, we hope to diversify and run each meetup in a different place to make things more interesting; and hopefully more meetups in the City. <em>If you are interested in hosting and sponsoring one of our future meetups please contact me privately and let me know.</em></p>

<p>During last year, our group has grown a lot. We started with <strong>132 members</strong> in the first day of January 2012 and ended up the year with more than <strong>400 members</strong>. This shows that the interest in Chef is obviously growing and hopefully the events we have been organizing are helping grow our local chef community.</p>

<p>If you have <strong><em>any</em></strong> suggestions on what you would like us to do in the future, please let us know. Use the comments bellow, send us a message, whatever works for you; we would love to hear from you and see how we can serve you better. Overall 2012 was great and with your help we can make 2013 even better!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Finally Migrated to Octopress]]></title>
    <link href="http://www.ducea.com/2012/11/14/finally-migrated-to-octopress/"/>
    <updated>2012-11-14T14:22:00-08:00</updated>
    <id>http://www.ducea.com/2012/11/14/finally-migrated-to-octopress</id>
    <content type="html"><![CDATA[<p>For a while now, I wanted to migrate my blog from Wordpress to <a href="http://octopress.org/">Octopress</a>, but for some reason I kept putting it on the shelf and not doing it. (let&#8217;s say because of all those client related projects&#8230;). Finally last weekend I&#8217;ve completed the migration and I&#8217;m really excited to get back to blogging after this. This post is meant to capture some of the issues I&#8217;ve encountered during the migration and how to fix them. This is not a full how to migrate post, as there are many such great articles <a href="https://www.google.com/#hl=en&amp;tbo=d&amp;sclient=psy-ab&amp;q=migrate+wordpress+to+octopress">available already</a>.</p>

<h3>Migrate old blog posts.</h3>

<p>Believe it or not, I had <strong>364 blog posts</strong> when I started the migration. Meaning a lot of energy was spent in importing those old articles. I&#8217;ve used <a href="https://github.com/thomasf/exitwp">exitwp</a> to convert the wordpress-xml export of the blog posts; and this produced a reasonably good result. Still I had to run some fixes&#8230;</p>

<ul>
<li>for code blocks:</li>
</ul>


<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'> perl -pi -e 's/([^\`]|^)(\`)([^\`]|$)/$1\n\`\`\`\n$3/g' *</span></code></pre></td></tr></table></div></figure>


<ul>
<li>to enable comments (as &#8216;comments: true&#8217; was missing from all posts)</li>
</ul>


<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>find source/_posts/ -type f -print0 | xargs -0 -I file sed -i '' '2 i \
</span><span class='line'>  comments: true' file</span></code></pre></td></tr></table></div></figure>


<h3>Categories/Tags/URLs</h3>

<p>Enabled the octopress category list plugin and tags plugin, that you can see in the sidebar. Since I had already tags and categories on all posts it was very important to keep the same urls and not break them. Same thing for regular posts urls. Here are the relevant settings form the octopress config file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'>root: /
</span><span class='line'>permalink: /:year/:month/:day/:title/
</span><span class='line'>
</span><span class='line'>category_dir: category
</span><span class='line'>
</span><span class='line'>tag_dir: &quot;tag&quot;
</span></code></pre></td></tr></table></div></figure>


<p>Just keep in mind that if you have many tags as I do, the generation of the pages will increase a lot after you enable the tags plugin. You&#8217;ve been warned!</p>

<!--more-->


<h3>Disqus comments</h3>

<p>Not working at all&#8230; I&#8217;ve wrote a post specifically about this; check it out <a href="http://www.ducea.com/2012/11/12/disqus-comments-not-visible-in-octopress/">here</a></p>

<h3>Feed Url</h3>

<p>My wordpress blog has been around for a while (6years more or less) and even if I&#8217;ve always used <strong>feedburner</strong> for my feed, but for some strange reason I&#8217;ve always used my own <a href="http://www.ducea.com/feed/">feed url</a>. This of course was no longer working with octopress, hence I had to setup a rewrite rule to not break everyone&#8217;s feed reader:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='apache'><span class='line'><span class="nb">RewriteEngine</span> <span class="k">On</span>
</span><span class='line'><span class="nb">Options</span> +FollowSymLinks -Multiviews
</span><span class='line'>
</span><span class='line'><span class="c"># Feed url</span>
</span><span class='line'><span class="nb">RewriteRule</span> ^feed/?$ atom.xml [QSA,L]
</span></code></pre></td></tr></table></div></figure>


<h3>Rewrite non-www to www</h3>

<p>This was done automatically by wordpress, but octopress will serve just fine the non-www domain. This can cause issues with search engines and such, so I wanted the same behaviour. Apache again to the rescue:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='apache'><span class='line'><span class="nb">RewriteCond</span> %{HTTP_HOST} !^www [NC]
</span><span class='line'><span class="nb">RewriteRule</span> $ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R]
</span></code></pre></td></tr></table></div></figure>


<h3>Apache optimizations, caching, compression, etc</h3>

<p>After you generated your octopress site, everything is static and fast by default. Still, you want to make sure that apache has some basic caching and compression settings to make it even better. Here are the relevant parts from my config:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class='apache'><span class='line'><span class="c">#### CACHING ####</span>
</span><span class='line'><span class="nt">&lt;IfModule</span> <span class="s">mod_expires.c</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nb">ExpiresActive</span> <span class="k">On</span>
</span><span class='line'>
</span><span class='line'><span class="c"># 1 MONTH</span>
</span><span class='line'><span class="nt">&lt;FilesMatch</span> <span class="s">&quot;\.(ico|gif|jpe?g|png|flv|pdf|swf|mov|mp3|wmv|ppt)$&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nb">ExpiresDefault</span> A2419200
</span><span class='line'>  <span class="nb">Header</span> append Cache-Control <span class="s2">&quot;public&quot;</span>
</span><span class='line'><span class="nt">&lt;/FilesMatch&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="c"># 3 DAYS</span>
</span><span class='line'><span class="nt">&lt;FilesMatch</span> <span class="s">&quot;\.(xml|txt|html|htm|js|css)$&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nb">ExpiresDefault</span> A259200
</span><span class='line'>  <span class="nb">Header</span> append Cache-Control <span class="s2">&quot;private, must-revalidate&quot;</span>
</span><span class='line'><span class="nt">&lt;/FilesMatch&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="c"># NEVER CACHE</span>
</span><span class='line'><span class="nt">&lt;FilesMatch</span> <span class="s">&quot;\.(php|cgi|pl)$&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nb">ExpiresDefault</span> A0
</span><span class='line'>  <span class="nb">Header</span> set Cache-Control <span class="s2">&quot;no-store, no-cache, must-revalidate, max-age=0&quot;</span>
</span><span class='line'>  <span class="nb">Header</span> set Pragma <span class="s2">&quot;no-cache&quot;</span>
</span><span class='line'><span class="nt">&lt;/FilesMatch&gt;</span>
</span><span class='line'><span class="nt">&lt;/IfModule&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="c">### Compression ####</span>
</span><span class='line'><span class="nt">&lt;IfModule</span> <span class="s">mod_deflate.c</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;IfModule</span> <span class="s">mod_setenvif.c</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nb">BrowserMatch</span> ^Mozilla/4 gzip-only-text/html
</span><span class='line'>        <span class="nb">BrowserMatch</span> ^Mozilla/4\.0[678] no-gzip
</span><span class='line'>        <span class="nb">BrowserMatch</span> \bMSIE !no-gzip !gzip-only-text/html
</span><span class='line'>        <span class="nb">BrowserMatch</span> \bMSI[E] !no-gzip !gzip-only-text/html
</span><span class='line'>    <span class="nt">&lt;/IfModule&gt;</span>
</span><span class='line'>    <span class="nt">&lt;IfModule</span> <span class="s">mod_headers.c</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nb">Header</span> append Vary <span class="k">User</span>-Agent env=!dont-vary
</span><span class='line'>    <span class="nt">&lt;/IfModule&gt;</span>
</span><span class='line'>    <span class="nt">&lt;IfModule</span> <span class="s">mod_filter.c</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nb">AddOutputFilterByType</span> DEFLATE text/css application/x-javascript text/x-component text/html text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon
</span><span class='line'>    <span class="nt">&lt;/IfModule&gt;</span>
</span><span class='line'><span class="nt">&lt;/IfModule&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Isolated when working on a new post</h3>

<p>If you have many posts, the generation of the octopress site will be extremely slow (in my case it takes about 2mins for a full generate) and this makes it basically impossible to work with any new post and see the feedback locally with preview. The solution is well documented and it works by isolating your single post while working on it, and when you are done you integrate back all the other posts before publishing them:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='apache'><span class='line'><span class="nb">rake</span> new_post[&#39;Finally Migrated to Octopress&#39;]
</span><span class='line'><span class="nb">rake</span> isolate[finally-migrated-to-octopress]
</span></code></pre></td></tr></table></div></figure>


<p>and now <code>rake generate</code> and <code>rake preview</code> will only work with the new post. Finally when done and ready to publish the awesome new post on the internets:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='apache'><span class='line'><span class="nb">rake</span> integrate
</span><span class='line'><span class="nb">rake</span> generate
</span><span class='line'><span class="nb">rake</span> deploy
</span></code></pre></td></tr></table></div></figure>


<h3>Others</h3>

<ul>
<li>some small customisations to the theme (colours and such)</li>
<li>about me and contact custom asides.</li>
<li>fix the github aside (updated to work with their latest api version and actually return the repos)</li>
<li>and of course the contact form (using a wufoo form)</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Disqus comments not visible in Octopress]]></title>
    <link href="http://www.ducea.com/2012/11/12/disqus-comments-not-visible-in-octopress/"/>
    <updated>2012-11-12T09:54:00-08:00</updated>
    <id>http://www.ducea.com/2012/11/12/disqus-comments-not-visible-in-octopress</id>
    <content type="html"><![CDATA[<p>After completing the migration of my blog from Wordpress to Octopress I had the surprise that Disqus comments were <em><strong>not</strong> showing up on the site</em>. I&#8217;ve already migrated in advance to Disqus and the Wordpress blog was working just fine with the new format. However, once switched to Octopress there were <strong>no comments active on the site</strong>. Strangely, the total number of comments for each post on the index page was showing just fine, but once you clicked on any post there were <em>no comments</em>. I tested adding new comment and it did show up correctly in Disqus.</p>

<p>Trying to understand and debug this issue, I looked in source/_includes/disqus.html and found the code that is generating the javascript variable <strong>disqus_identifier</strong> for the posts:</p>

<div><script src='https://gist.github.com/4067374.js?file='></script>
<noscript><pre><code>...
var disqus_identifier = '{{ site.url }}{{ page.url }}';
var disqus_url = '{{ site.url }}{{ page.url }}';
var disqus_script = 'embed.js';
...</code></pre></noscript></div>




<!--more-->


<p>and looking in the html generated by some blog posts the variables disqus_url and disqus_identifier looked ok, like this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>var disqus_identifier = 'http://www.ducea.com//2012/11/12/disqus-comments-not-visible-in-octopress/';
</span><span class='line'>var disqus_url = 'http://www.ducea.com//2012/11/12/disqus-comments-not-visible-in-octopress/';
</span><span class='line'>var disqus_script = 'embed.js';</span></code></pre></td></tr></table></div></figure>


<p>Still at a closer look I was able to identify the issue; if you look closer at the url above, it has a double <strong>/</strong> in the url, and even if that should not cause any issues and identify the same url, Disqus was actually seeing it as a separate identifier and hence not showing the comments associated with it.
Once I figured it out it was very simple to see where it came form (the site <strong>url</strong> from _config.xml) was:</p>

<figure class='code'><figcaption><span>_config.xml</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'>url: http://www.ducea.com/
</span></code></pre></td></tr></table></div></figure>


<p>and fixing it, by removing the trailing slash:</p>

<figure class='code'><figcaption><span>_config.xml</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'>url: http://www.ducea.com
</span></code></pre></td></tr></table></div></figure>


<p>Regenerating and deploying the site:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rake generate
</span><span class='line'>rake deploy
</span></code></pre></td></tr></table></div></figure>


<p>fixed the issue and the comments are now back on the site. (you can even try it out here on this post ;)</p>

<p>Hopefully this will help others that are in the same situation&#8230; if you just added an extra slash to the Octopress site url config and didn&#8217;t realise this breake the Disqus comments.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ChefConf 2012 - San Francisco]]></title>
    <link href="http://www.ducea.com/2012/05/18/chefconf-2012-san-francisco/"/>
    <updated>2012-05-18T19:09:10-07:00</updated>
    <id>http://www.ducea.com/2012/05/18/chefconf-2012-san-francisco</id>
    <content type="html"><![CDATA[<p>This week <strong>Opscode</strong> hosted its inaugural user conference here in San Francisco, and it was an awesome event enjoyed by all chef fans. Even if this was the first one (they are already planing for the future ones), this was by no means a small event, with more than <strong>400 peopl</strong>e attending and the workshops that ran on Tuesday <em>sold out</em>.</p>

<p>Even if I have not attended any workshop (they had 2 flavors, one targeted towards a <em>sysadmin workflow</em> and one for <em>developers</em>) the general feeling from people I talked with and attended them was that it was a very good experience, with a lot of hands-on practical examples. Tuesday afternoon, myself I attended the &#8221;<a href="http://chefconf2012.sched.org/event/bfe13edac99e2b4d8582f0cd1005ee73?iframe=no&amp;w=700&amp;sidebar=no&amp;bg=no">ChefConf Pre-event Hackday: TEST ALL THE THINGS!!!</a>&#8220; organized by <strong>Bryan Berry</strong> and it was great, and showed how many people are interested in testing their infrastructure as code; it was focused on cookbook testing (unit testing and integration testing), continuous integration with jenkins, and other things like that ;)</p>

<p>The first full day of <a href="http://chefconf.opscode.com/">ChefConf</a> was Wednesday. The conference was structured with main presentations during the mornings and breakout sessions in the afternoon (with 2 main tracks and also a vendor one). From the beginning you could tell that this will be a very well run conference, and even if this was the first one, people like Jesse Robbins have a lot of experience running such events. Not surprisingly <strong>ChefConf</strong> kicked off with <strong>Adam Jacob</strong>&#8217;s &#8221;<a href="http://chefconf2012.sched.org/event/5c0fac5d1c23207c0f8516bcf84045b9?iframe=no&amp;w=700&amp;sidebar=no&amp;bg=no">State of the Union Part 1: Chef, Past and Present</a>&#8221; (<a href="http://www.youtube.com/watch?v=bAWjqE5FCxI&amp;feature=plcp">video</a>) ; <strong>Jesse Robbins</strong> talked about the <strong>community</strong> around chef and how this is a key part of Opscode strategy and their efforts to take this to the next level. He showed this very nice <a href="http://www.youtube.com/watch?v=ZIlWCE4FCqw&amp;feature=plcp">visualization</a> of the commits to the chef github repo.</p>

<!--more-->


<p>There were many interesting talks during the day, and they recorded most of them and hopefully will make them available <a href="http://www.youtube.com/user/Opscode/videos">online</a> soon so you can see them if you didn&#8217;t had the chance to be here (or you want to review them again). I particularly enjoyed:</p>

<ul>
<li><p><strong>Ron Vidal</strong> - <a href="http://chefconf2012.sched.org/event/b5e9e27b171a970572ddd93fb5eb44fe?iframe=no&amp;w=700&amp;sidebar=no&amp;bg=no">Operations Secret Sauce: Incident Management</a> (<a href="http://www.youtube.com/watch?v=4d38Ena1Abo&amp;feature=plcp">video</a>); similar to Jesse Robbins <strong><a href="https://www.usenix.org/conference/lisa11/gameday-creating-resiliency-through-destruction">GameDay</a></strong> talk and it was a very nice addition, inspirational and full of interesting points.</p></li>
<li><p><strong>Jim Hopp</strong>&#8217;s - <a href="http://chefconf2012.sched.org/event/b2b1a41277c11c865d55b733b4814c1a?iframe=no&amp;w=700&amp;sidebar=no&amp;bg=no">Test-driven Development for Chef Practitioners</a> (<a href="http://www.youtube.com/watch?v=o2e0aZUAVGw&amp;feature=plcp">video</a>); very well prepared and presented. I hope to have Jim to our <a href="http://www.meetup.com/The-Bay-Area-Chef-User-Group/">Chef Bay Area meetup</a> group to present something similar on the subject and run a testing hackaton.</p></li>
<li><p><strong>Patrick McDonnell</strong>&#8217;s - <a href="http://chefconf2012.sched.org/event/2cef7591ae7f08836ff89f4dc223280e?iframe=yes&amp;w=700&amp;sidebar=no&amp;bg=no#?iframe=yes&amp;w=700&amp;sidebar=no&amp;bg=no#sched-body-outer">Lessons from Etsy: Avoiding Kitchen Nightmares</a>; people seem to love everything Etsy is doing and they are sharing a lot of their workflow with chef and open sourcing various tools they write.</p></li>
<li><p>and many others…</p></li>
</ul>


<p>In the evening we had a great <strong>Ignite</strong> event ran by <strong>Andrew Shafer</strong> in his unconfundable way. We had 10 ignite speakers and in the middle there was a fun <em>karaoke ignite</em> that had 10 volunteers rambled on some slides they never sow before. If they recorded this, and will show it online look up the ones by <strong>Stephen Nelson-Smith</strong> and <strong>John Vincent</strong> as they were very entertaining.</p>

<p>The second day of the conference started with <strong>Christopher Brown</strong>&#8217;s &#8221;<a href="http://chefconf2012.sched.org/event/d60e4ab3b1f2fba2f996214792a649c1?iframe=no&amp;w=700&amp;sidebar=no&amp;bg=no">State of the Union Part 2: Chef, the Future</a>&#8221; where he outlined some of the future features and main focuses of Opscode for Chef: becoming easier to install and use (<em>omnibus</em> installer), <em>enterprise</em> ready, focus on <em>Windows</em> and also a lot of focus on <em>quality</em>. Opscode is working on a project called <em>kitchen chef</em> that will allow to test the functionality of cookbooks on various environments and platforms, and quickly ensure the quality of the cookbook is maintained during various iterations. Also a lot of work has been put into <em>reporting</em> and handlers. The server side also has been completely rewritten in <em>erlang</em> and <em>sql</em> (from ruby and couchdb) and we should see this soon in the open-source and the private chef server. From the work done you can easily tell that a lot of work has been done on private chef and this is quickly becoming an important asset for Opscode going forward.</p>

<p>There were many great talks during the day from speakers like Artur Bergman, Ben Rockwood, Jason Stowe, John Esser, Rob Hirschfeld, Theo Schlossnagle, etc. I finished my day just like I started Tuesday with another event focused on testing: &#8221;<a href="http://chefconf2012.sched.org/event/1b5feddb619c6c09bd28f19d95a9c8be?iframe=no&amp;w=700&amp;sidebar=no&amp;bg=no">Test Driven Development Roundtable</a>&#8221;, ran by <strong>Stephen Nelson-Smith</strong> on a panel with <strong>Seth Chisamore</strong>, <strong>Jim Hopp</strong> and my friend <strong>Rob Berger</strong>. They went over the tools people are using these days and what are the things that are still missing and need to be worked on regarding testing.</p>

<p>Overall, I think this was an <strong>awesome</strong> event and I hope to be able to attend the next one also (hopefully at the same place). My impression is that Opscode is ready to move forward and make the next step and grow the community even bigger: <strong>&#8220;The revolution will not be televised - it will be coded with chef&#8221;.</strong></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[HowTo completely remove a file from Git history]]></title>
    <link href="http://www.ducea.com/2012/02/07/howto-completely-remove-a-file-from-git-history/"/>
    <updated>2012-02-07T11:40:06-08:00</updated>
    <id>http://www.ducea.com/2012/02/07/howto-completely-remove-a-file-from-git-history</id>
    <content type="html"><![CDATA[<p>I just started working on a new project and as you would expect one of the first things I did was to download its git repository from <strong>github</strong>. These were just some scripts and should have been very small ~5M, but the clone from gitbhub took about one hour as the full repo folder was 1.5G… (with the biggest size under <strong>.git/objects/pack</strong>) Crazy… <em>What was in the git repository history that would cause something like this?</em> I assumed that at some point in time the repository was much bigger (probably from some file/s that don&#8217;t exist anymore), but how could I find out what were those files? And more important howto remove them from history? Well if you came here from a <em>google search</em> on &#8220;how to remove a file from git history&#8221; then you probably know there are plenty of docs and howtos on how to achieve this but from my experience none of them really worked. This is why I decided to document the steps needed to identify the file from the git repo history that is using all that space and to have it removed fully and bring the repository to a manageable size.</p>

<p>First we need to identify the file that is causing this issue; and for this we will verify all the packed objects and look for the biggest ones:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5</span></code></pre></td></tr></table></div></figure>


<p>(and grab the revisions with the biggest files). Then find the name of the files in those revisions:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git rev-list --objects --all | grep &lt;revision_id&gt;</span></code></pre></td></tr></table></div></figure>


<p>Next, remove the file from all revisions:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git filter-branch --index-filter 'git rm --cached --ignore-unmatch &lt;filename&gt;'
</span><span class='line'>rm -rf .git/refs/original/</span></code></pre></td></tr></table></div></figure>


<p>Edit .git/packed-refs and remove/comment any external pack-refs. Without this the cleanup might not work. I my case I had refs/remotes/origin/master and some others branches.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vim .git/packed-refs</span></code></pre></td></tr></table></div></figure>


<p>Finally repack and cleanup and remove those objects:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git reflog expire --all --expire-unreachable=0
</span><span class='line'>git repack -A -d
</span><span class='line'>git prune</span></code></pre></td></tr></table></div></figure>


<p>Hopefully these steps will help you completely remove those un-wanted files from your git history. Let me know if you have any problems after following these simple steps.</p>

<!--more-->


<p>Note: if you want to test these steps here is how to quickly create a test repo:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># Make a small repo
</span><span class='line'>mkdir test
</span><span class='line'>cd test
</span><span class='line'>git init
</span><span class='line'>echo hi &gt; there
</span><span class='line'>git add there
</span><span class='line'>git commit -m 'Small repo'
</span><span class='line'># Add a random 10M binary file
</span><span class='line'>dd if=/dev/urandom of=testme.txt count=10 bs=1M
</span><span class='line'>git add testme.txt
</span><span class='line'>git commit -m 'Add big binary file'
</span><span class='line'># Remove the 10M binary file
</span><span class='line'>git rm testme.txt
</span><span class='line'>git commit -m 'Remove big binary file'</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting ready for LISA11 - Boston]]></title>
    <link href="http://www.ducea.com/2011/12/03/getting-ready-for-lisa11-boston/"/>
    <updated>2011-12-03T22:53:45-08:00</updated>
    <id>http://www.ducea.com/2011/12/03/getting-ready-for-lisa11-boston</id>
    <content type="html"><![CDATA[<p>I&#8217;m packing for <strong>Boston</strong> and will be there next week for <a href="http://www.usenix.org/events/lisa11/index.html">LISA11</a>. This will be my second year as part of the <a href="http://blogs.usenix.org/2011/12/02/lisa11-next-week-meet-your-blog-team/">LISA blogging team</a>, and after how much I enjoyed LISA last year in San Jose I wouldn&#8217;t miss this one even if it is on the other side of the country. I&#8217;ve tried to finish as much work as possible to be able to focus on the conference ;) but for various reasons of course this was not quite possible, and actually during the first days I will even be on call&#8230; In anycase, I&#8217;m sure this is going to be a great week full of awesomeness. I will be blogging for the <a href="http://blogs.usenix.org/">USENIX blog</a> every day, so be sure to follow that for fresh articles from me and the other memebers of our team (Ben, Rikki and Matt).</p>

<p>If you are going to <strong>LISA11</strong> in <strong>Boston</strong> next week, we should definitely meetup. Contact me on <a href="http://twitter.com/mariusducea">twitter</a> or <a href="http://www.ducea.com/contact/">email</a>.</p>

<hr />

<p><a href="https://www.usenix.org/blog/limoncelli-test">The Limoncelli Test</a>, was a very interesting presentation by Tom Limoncelli based on a <a href="http://everythingsysadmin.com/the-test.html">blog post</a> he wrote earlier this year. If you haven&#8217;t done it already I would strongly recommend to take the test and see how does your sysadmin team rank on <a href="http://goto.tomontime.com/test">&#8220;The Limoncelli Test&#8221;</a>.</p>

<p><a href="https://www.usenix.org/blog/recovering-linux-hard-drive-disasters">Recovering From Linux Hard Drive Disasters</a> is Theodore Ts&#8217;o signature training material on what to do if you have any sort of hard drive failure and covers in depth details on how to recover from such disasters caused by software or hardware failures.</p>

<p><a href="https://www.usenix.org/blog/gameday-creating-resiliency-through-destruction">GameDay: Creating Resiliency Through Destruction</a> (<a href="http://www.slideshare.net/jesserobbins/ameday-creating-resiliency-through-destruction">slides</a>): I enjoyed very much Jesse Robbins presentation, where he draws parallels between two of his greatest passions: firefighting and operations. Watch the <a href="http://www.youtube.com/watch?v=zoz0ZjfrQ9s">video</a>.</p>

<p><a href="https://www.usenix.org/blog/sregoogle-thousands-devops-2004">SRE@Google: Thousands of DevOps Since 2004</a>: Tom Limoncelli, describes the technologies and policies that Google uses to do what is (now) called DevOps. Watch the <a href="http://www.youtube.com/watch?v=iIuTnhdTzK0&amp;amp;feature=youtube_gdata">video</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Interview with LISA11 Program Co-Chairs: Tom Limoncelli and Doug Hughes]]></title>
    <link href="http://www.ducea.com/2011/11/30/interview-with-lisa11-program-co-chairs-tom-limoncelli-and-doug-hughes/"/>
    <updated>2011-11-30T22:31:35-08:00</updated>
    <id>http://www.ducea.com/2011/11/30/interview-with-lisa11-program-co-chairs-tom-limoncelli-and-doug-hughes</id>
    <content type="html"><![CDATA[<p>One of the advantages of being a member of the <strong>LISA11 Blog Team</strong> is that I was able to talk and interview this year program co-chairs: <strong>Tom Limoncelli</strong> and <strong>Doug Hughes</strong>. This was a great honor for me especially since I&#8217;ve been a big fan of Tom&#8217;s work for many years. The full article is available on the USENIX blog: &#8221;<a href="http://blogs.usenix.org/2011/12/02/tom-limoncelli-and-doug-hughes-interview/">Tom Limoncelli and Doug Hughes Interview</a>&#8221;</p>

<p>Also my colleagues from the LISA11 blogging team (Ben, Rikki and Matt) have done some very interesting interviews with some key people from LISA11 to get you prepared for the event. Check out the <a href="http://blogs.usenix.org/">USENIX blog</a> for more from us in the next week.</p>

<p>Here is also a quick intro of our team: &#8221;<a href="http://blogs.usenix.org/2011/12/02/lisa11-next-week-meet-your-blog-team/">LISA11 Next Week – Meet your blog team!</a>&#8221;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Build your own packages easily with FPM]]></title>
    <link href="http://www.ducea.com/2011/08/31/build-your-own-packages-easily-with-fpm/"/>
    <updated>2011-08-31T15:13:02-07:00</updated>
    <id>http://www.ducea.com/2011/08/31/build-your-own-packages-easily-with-fpm</id>
    <content type="html"><![CDATA[<p><strong>Building packages</strong> is a task that every system administrator will end up doing. Most of the time this is not a very interesting task but someone has to do it, right? Normally you will end up modifying and tweaking based on your own needs an existing package that was built by the maintainers of the Linux distribution that you are using. In time you might even become familiar with the packaging system you are using (rpm, deb, etc.) and you will be able to write a spec file and start from scratch and build a new package if you need to. Still, this <em>process is complicated and requires a lot of work</em>.</p>

<p>Luckily, <strong><a href="http://www.semicomplete.com/blog">Jordan Sissel</a></strong> has built a tool called <strong><a href="https://github.com/jordansissel/fpm">FPM</a></strong> (Effing Package Management), exactly for this: to ease the pain of building new packages; packages that you will use for your own infrastructure and you want them customized based on your own needs; and you don&#8217;t care about upstream rules and standards and other limitations when building such packages. This can be very useful for people deploying their own applications as rpms (or debs) and can simplify a lot of the process of building those packages.</p>

<p>FPM can be easily installed on your build system using rubygems:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>gem install fpm</span></code></pre></td></tr></table></div></figure>


<p>Once installed you can use fpm to build <strong>packages</strong> (targets):</p>

<ul>
<li>deb</li>
<li>rpm</li>
<li>solaris</li>
</ul>


<p>from any of the following <strong>sources</strong>:</p>

<ul>
<li>directory (of compiled source of some application)</li>
<li>gem</li>
<li>python eggs</li>
<li>rpm</li>
<li>node npm packages</li>
</ul>


<!--more-->


<p>Use the command line help (fpm &#8211;help) or the <a href="https://github.com/jordansissel/fpm/wiki">wiki</a> to see full details on how to use it. I&#8217;ll show some simple examples on how to build some packages from various input sources that I&#8217;ve found useful myself.</p>

<h3>1. Package a directory - output of a &#8216;make install&#8217; command</h3>

<p>This is how you would usually package an application that you would install with:
<em>./configure; make; make install</em>
For example, here is how you can create an rpm of the latest version of memcached:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>wget http://memcached.googlecode.com/files/memcached-1.4.7.tar.gz
</span><span class='line'>tar -zxvf memcached-1.4.7.tar.gz
</span><span class='line'>cd memcached-1.4.7
</span><span class='line'>./configure --prefix=/usr
</span><span class='line'>make</span></code></pre></td></tr></table></div></figure>


<p>so far everything looks like a normal manual installation (that would be followed by make install). Still we will now install it in a separate folder so we can capture the output:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>mkdir /tmp/installdir
</span><span class='line'>make install DESTDIR=/tmp/installdir</span></code></pre></td></tr></table></div></figure>


<p>and finally using fpm to create the rpm package:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>fpm -s dir -t rpm -n memcached -v 1.4.7 -C /tmp/installdir</span></code></pre></td></tr></table></div></figure>


<p>where <strong>-s</strong> is the input source type (directory), <strong>-t</strong> is the type of package (rpm), <strong>-n</strong> in the name of the package and <strong>-v</strong> is the version; <strong>-C</strong> is the directory where fpm will look for the files.
Note: you might need to install various libraries to build your package; for ex. in this case I had to install libevent-dev.</p>

<p>If you are packaging your own application you can do this just by pointing to your build folder and set the version of the app. Here is an example for an deb package:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>fpm -s dir -t deb -n myapp -v 0.0.1 -C /build/myapp/0.0.1/</span></code></pre></td></tr></table></div></figure>


<p>There are various other parameters that you can use but basically this is how simple it is to build a package from a directory.
Here is an example on how to define some dependencies on the package you are building (using <strong>-d</strong>; repeat it as many times as needed):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>fpm -s dir -t deb -n memcached -v 1.4.7 -C /tmp/installdir \
</span><span class='line'>-d "libstdc++6 (&gt;= 4.4.5)" \
</span><span class='line'>-d "libevent-1.4-2 (&gt;= 1.4.13)"</span></code></pre></td></tr></table></div></figure>


<h3>2. Ruby gems or python egg - converted to packages</h3>

<p>You can create a deb or rpm from a gem very simple with fpm:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>fpm -s gem -t deb &lt;gem_name&gt;</span></code></pre></td></tr></table></div></figure>


<p>this will download the gem and create a package named rubygem-<gem_name>
For example:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>fpm -s gem -t deb fpm</span></code></pre></td></tr></table></div></figure>


<p>will create a debian package for fpm: rubygem-fpm_0.3.7_all.deb</p>

<p>You can inspect it with<em> dpkg &#8211;info</em> and you can notice that in this case it will fill nicely all the fields with the maintainer, and dependencies on various other gems. Very cool.</p>

<p>If you use python and want to package various python eggs this will work exactly the same and you will use -s python (it will download the python packages with easy_install first).</p>

<p>Overall <strong>FPM</strong> is a great tool and can help you<em> simplify the way you are building your own packages</em>. Check it out and let me know what you think and if you found it useful. And if you found this useful don’t forget to thank <strong><a href="http://www.twitter.com/jordansissel">Jordan</a></strong> for his great work on this awesome tool.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[First Chef Cookbook Contest Announced!]]></title>
    <link href="http://www.ducea.com/2011/08/23/first-chef-cookbook-contest-announced/"/>
    <updated>2011-08-23T11:18:14-07:00</updated>
    <id>http://www.ducea.com/2011/08/23/first-chef-cookbook-contest-announced</id>
    <content type="html"><![CDATA[<p>Yesterday <strong><a href="http://www.opscode.com/">Opscode</a></strong>, the company behind <strong><a href="http://www.opscode.com/chef/">Chef</a></strong>, <a href="http://www.opscode.com/blog/2011/08/22/cookbook-contest/">announced</a> the first ever <strong>chef cookbook contest</strong>. In order to participate in the contest you will need to write a new cookbook and submit it by the <em>end of September;</em> this is going to be a little tricky as there are many cookbooks already available on the <a href="http://community.opscode.com/cookbooks">community site</a>. So this is a great idea and it will take care of the few applications that don&#8217;t already have chef cookbooks. The cookbooks which shows off the awesome Chef features will have better chances to win. The prizes are also interesting: iPad, gift cards, etc. Here are the full details and rules of the contest: <a href="http://www.opscode.com/blog/2011/08/22/cookbook-contest/">http://www.opscode.com/blog/2011/08/22/cookbook-contest/</a></p>

<p>So if you have an <strong>idea</strong> for a chef cookbook, <strong>now</strong> it&#8217;s the time to start working on it. I&#8217;m offering my <strong>help for free</strong> for all my blog readers: I will help you write a cookbook by implementing your ideas; help reviewing it or suggest improvements, or whatever else you might need help with. Use the <a href="http://www.ducea.com/contact/">contact</a> form to email me (or DM me on <a href="http://twitter.com/mariusducea">twitter</a>) and let me know how I can help.</p>

<p>If you don&#8217;t have time to write a new cookbook but you have a great idea for a cookbook that is missing from the opscode community site, please post it bellow in the <strong>comments section</strong> and I&#8217;m sure some of my blog readers will help create it.</p>

<p>Again this is a brilliant idea from Opscode and it creates a win-win situation for everyone. I&#8217;m just curious, is this the first idea from their new community manager? If this is the case, great job Jesse ;).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Building Vagrant boxes with veewee]]></title>
    <link href="http://www.ducea.com/2011/08/15/building-vagrant-boxes-with-veewee/"/>
    <updated>2011-08-15T18:49:23-07:00</updated>
    <id>http://www.ducea.com/2011/08/15/building-vagrant-boxes-with-veewee</id>
    <content type="html"><![CDATA[<p>If you used <strong><a href="http://vagrantup.com/">vagrant</a></strong> (great tool, right?) you have probably downloaded a basebox from some remote location to get you started. This is a great quick start, and there are many good boxes out there that you can use; <a href="http://www.vagrantbox.es/">vagrantbox.es</a> does a great job in listing various public vagrant boxes. But if you are like me, you probably will want to customize the boxes you are using; you might want to install them from scratch based on your own little/or/big customizations. Well if you are like that, then you will be happy to hear that <strong><a href="http://www.jedi.be/blog">Patrick Debois</a></strong> had exactly the same problem when he decided to write <strong><a href="https://github.com/jedi4ever/veewee">veewee</a></strong>. And veewee is exactly that missing part of vagrant that allows you to easily build your own vagrant boxes from scratch.</p>

<p>So let&#8217;s see how we can use veewee. I&#8217;m assuming you already have vagrant installed (and <a href="http://download.virtualbox.org/virtualbox/">virtualbox</a>), but if you don&#8217;t please install them first. To install <strong>veewee</strong> we just have to install the veewee gem:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>gem install veewee</span></code></pre></td></tr></table></div></figure>


<p>once you installed veewee you can see a new task added to vagrant: <strong>basebox</strong>.</p>

<!--more-->


<p>Here is the list of the <strong>templates</strong> we get out of the box once we install veewee:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>**vagrant basebox templates**
</span><span class='line'>The following templates are available:
</span><span class='line'>vagrant basebox define '' 'archlinux-i686'
</span><span class='line'>vagrant basebox define '' 'CentOS-4.8-i386'
</span><span class='line'>vagrant basebox define '' 'CentOS-5.6-i386'
</span><span class='line'>vagrant basebox define '' 'CentOS-5.6-i386-netboot'
</span><span class='line'>vagrant basebox define '' 'Debian-6.0.1a-amd64-netboot'
</span><span class='line'>vagrant basebox define '' 'Debian-6.0.1a-i386-netboot'
</span><span class='line'>vagrant basebox define '' 'Fedora-14-amd64'
</span><span class='line'>vagrant basebox define '' 'Fedora-14-amd64-netboot'
</span><span class='line'>vagrant basebox define '' 'Fedora-14-i386'
</span><span class='line'>vagrant basebox define '' 'Fedora-14-i386-netboot'
</span><span class='line'>vagrant basebox define '' 'freebsd-8.2-experimental'
</span><span class='line'>vagrant basebox define '' 'freebsd-8.2-pcbsd-i386'
</span><span class='line'>vagrant basebox define '' 'freebsd-8.2-pcbsd-i386-netboot'
</span><span class='line'>vagrant basebox define '' 'gentoo-latest-i386-experimental'
</span><span class='line'>vagrant basebox define '' 'opensuse-11.4-i386-experimental'
</span><span class='line'>vagrant basebox define '' 'solaris-11-express-i386'
</span><span class='line'>vagrant basebox define '' 'Sysrescuecd-2.0.0-experimental'
</span><span class='line'>vagrant basebox define '' 'ubuntu-10.04.2-amd64-netboot'
</span><span class='line'>vagrant basebox define '' 'ubuntu-10.04.2-server-amd64'
</span><span class='line'>vagrant basebox define '' 'ubuntu-10.04.2-server-i386'
</span><span class='line'>vagrant basebox define '' 'ubuntu-10.04.2-server-i386-netboot'
</span><span class='line'>vagrant basebox define '' 'ubuntu-10.10-server-amd64'
</span><span class='line'>vagrant basebox define '' 'ubuntu-10.10-server-amd64-netboot'
</span><span class='line'>vagrant basebox define '' 'ubuntu-10.10-server-i386'
</span><span class='line'>vagrant basebox define '' 'ubuntu-10.10-server-i386-netboot'
</span><span class='line'>vagrant basebox define '' 'ubuntu-11.04-server-amd64'
</span><span class='line'>vagrant basebox define '' 'ubuntu-11.04-server-i386'
</span><span class='line'>vagrant basebox define '' 'windows-2008R2-amd64-experimental'</span></code></pre></td></tr></table></div></figure>


<p>This means that we can build a box based on <strong>any</strong> of the above templates. <em>That&#8217;s awesome!</em> Let&#8217;s say we want to build a debian squeeze box using veewee; we would have to run:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vagrant basebox define 'debian-60' 'Debian-6.0.1a-amd64-netboot'</span></code></pre></td></tr></table></div></figure>


<p>and this will create a folder definitions/debian-60 with the following files (the content of the veewee template):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>definition.rb
</span><span class='line'>postinstall.sh
</span><span class='line'>preseed.cfg</span></code></pre></td></tr></table></div></figure>


<p>we can modify/tune any of those files based on our custom needs. The file <strong>definition.rb</strong> is the main definition of the template. Here you would define the memory size, disk size, iso file, etc. The content is very easy to understand, but you would normally not have to change many things here. <strong>preseed.cfg</strong> is just a standard preseed file where you would customize the actual install process (you could change here the partitions or their type, timezone setup, etc). And finally <strong>postinstall.sh</strong> that is a bash script that will run at the end of the installation process and it will install ruby, gems , chef and puppet and also the virtualbox guest additions (needed for shared folders).</p>

<p>If you have the iso already place it in <strong>&#8216;currentdir&#8217;/iso</strong>. If not, veewee will download it and place it in the appropriate folder before starting the install process:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vagrant basebox build 'debian-60'</span></code></pre></td></tr></table></div></figure>


<p>this will start the installation and you can see all the steps it takes (the keystrokes as they are entered, etc.). This can take a while… Once it is done you can validate the build with:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vagrant basebox validate 'debian-60'</span></code></pre></td></tr></table></div></figure>


<p>(this will run a few basic tests to see if it can connect to the vm as user vagrant, if chef and puppet were installed, if the shared folders are accessible, etc).</p>

<p>And finally you can export it as a vagrant box with:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vagrant basebox export 'debian-60'</span></code></pre></td></tr></table></div></figure>


<p>and add it to vagrant:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vagrant box add 'debian-60' debian-60.box</span></code></pre></td></tr></table></div></figure>


<p>and now you can use it in vagrant with:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vagrant init 'debian-60'</span></code></pre></td></tr></table></div></figure>


<p>That&#8217;s it. Very simple and now we have our own box built from scratch. As a side note, I found this very useful to test and troubleshoot preseed configurations ;). As you can see there are plenty of templates available in veewee but if you create a new one please consider to share it with others and send it to Patrick on <a href="https://github.com/jedi4ever/veewee">github</a>. I&#8217;m sure he will be happy to include it in newer versions of veewee. And if you found this useful don&#8217;t forget to thank <a href="https://twitter.com/#!/patrickdebois">Patrick</a> for his great work on this awesome tool.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Monitoring with Icinga @ SF Bay Area LSPE meetup]]></title>
    <link href="http://www.ducea.com/2011/07/22/monitoring-with-icinga-sf-bay-area-lspe-meetup/"/>
    <updated>2011-07-22T11:15:22-07:00</updated>
    <id>http://www.ducea.com/2011/07/22/monitoring-with-icinga-sf-bay-area-lspe-meetup</id>
    <content type="html"><![CDATA[<p>Yesterday evening I presented at the SF Bay Area Large-Scale Production Engineering meetup group at Yahoo HQ a talk about <strong>&#8220;Monitoring with Icinga&#8221;</strong>. This was an introductory talk intended to bring awareness about <a href="https://www.icinga.org/">icinga</a> (there were only 3-4 people from the audience of about 75 that heard of it before), and I think it reached its goal very well; afterwards there were many people interested to try it out and had various questions about it at the end. I was also very happy to have <a href="https://twitter.com/#!/mjbrooks_dev">Matthew Brooks</a> one of the icinga core developers in the audience and backing me up to some of the more difficult questions people had. Thanks again Matthew for coming! Here are the slides from my presentation:</p>

<p><strong><a href="http://www.slideshare.net/mdxp/monitoring-with-icinga-sf-bay-area-lspe-meetup-8657145">Monitoring with Icinga @ SF Bay Area LSPE meetup</a></strong></p>

<p>View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/mdxp">mdxp</a></p>

<p><a href="http://twitter.com/LSPEMeetup">@LSPEMeetup</a> made available the video on justin.tv; unfortunately the quality of the video/sound is not the best; you can find it <a href="http://www.justin.tv/kctv88/b/290736874">here</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[HowTo Improve IO Performance for KVM Guests]]></title>
    <link href="http://www.ducea.com/2011/07/06/howto-improve-io-performance-for-kvm-guests/"/>
    <updated>2011-07-06T10:58:18-07:00</updated>
    <id>http://www.ducea.com/2011/07/06/howto-improve-io-performance-for-kvm-guests</id>
    <content type="html"><![CDATA[<p>Recently I&#8217;ve worked on a project where we deployed a bunch <strong>KVM</strong> instances. Immediately we noticed <em>horrible IO performance</em> on all the guests instances. In this particular case the hosts and the guests were all <em>Ubuntu 10.04 Lucid</em> and were created with <strong>vmbuilder</strong> without any special settings using the ubuntu defaults. Here is a sample command similar to what we used to build the kvm images:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vmbuilder kvm ubuntu --suite=lucid --flavour=virtual --arch=amd64 --mirror=http://en.archive.ubuntu.com/ubuntu -o --libvirt=qemu:///system --ip=10.0.0.11 --gw=10.0.0.1 --part=vmbuilder.partition --templates=mytemplates --user=username --pass=password --firstboot=/var/vms/vm1/boot.sh --mem=1024 --hostname=myhost --bridge=br0</span></code></pre></td></tr></table></div></figure>


<p>Now even if we haven&#8217;t tuned anything I would have expected it to perform at least the same level or even better compared with a <strong>Xen</strong> instance. Still, this was not the case, and the performance was really horrible and any kind of IO bound tasks would effectively lock the instance. Looking into this and trying to understand what was the problem I was able to isolate this issue happening only on instances that had <strong>ext4</strong> as the filesystem (the default for lucid), but strangely enough this didn&#8217;t happen for an older instance that was build with <strong>ext3</strong> (actually a <em>debian lenny</em> instance). All the images build with the above command will use <strong>qcow2</strong> sparse format as the default format for the disk.</p>

<!--more-->


<p>In order to achieve good IO performance we had to use <strong>cache=&#8217;writeback&#8217;</strong> for the instances and this will significantly increase the IO performance and bring it almost to host level performance, but in anycase much better compared with the old xen instances we had. Here is how you can enable writeback for an instance: stop the vm; edit the guestdomain and add cache=writeback in the driver section, save and start back the vm:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>virsh --connect qemu:///system
</span><span class='line'>stop guestdomain
</span><span class='line'>edit guestdomain   &lt;-- add cache='writeback' in the driver section
</span><span class='line'>start guestdomain</span></code></pre></td></tr></table></div></figure>


<p>Here is the how the disk part of my guest domain looks like after adding the cache writeback:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;disk type='file' device='disk'&gt;
</span><span class='line'>&lt;driver name='qemu' type='qcow2' **cache='writeback'**/&gt;
</span><span class='line'>&lt;source file='/var/vms/vm2/ubuntu-kvm/tmphAUcOB.qcow2'/&gt;
</span><span class='line'>&lt;target dev='hda' bus='ide'/&gt;
</span><span class='line'>&lt;/disk&gt;</span></code></pre></td></tr></table></div></figure>


<p>In the process of debugging and searching for a fix for this issue, I&#8217;ve found out that it can also be useful to use <strong>elevator=noop</strong> as the <em>default kernel io scheduler</em>; this definitely helps, but not to the same extend as the cache writeback setting on the virtio disk. You can add elevator=noop to your kernel command line in your grub config, and I have this by default on all the instances.</p>

<p>Hopefully this will help you greatly improve IO performance for your KVM guests and will save you the time I&#8217;ve lost while trying to find a solution to this problem. Please feel free to share your experiences using the comment form bellow; also I&#8217;m curious if you have any other tips on how to improve this even more.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[HowTo upgrade Chef from 0.10 to 0.10.2 - rubygems install]]></title>
    <link href="http://www.ducea.com/2011/07/01/howto-upgrade-chef-from-0-10-to-0-10-2-rubygems-install/"/>
    <updated>2011-07-01T12:30:48-07:00</updated>
    <id>http://www.ducea.com/2011/07/01/howto-upgrade-chef-from-0-10-to-0-10-2-rubygems-install</id>
    <content type="html"><![CDATA[<p>A few days ago <strong><a href="http://www.opscode.com/">Opscode</a></strong> released a <a href="http://www.opscode.com/blog/2011/06/29/chef-0-10-2-and-0-9-18-released/">security fix</a> for <strong>chef server 0.10.0</strong> and 0.9.16 and this post will show how upgrade to chef-server <strong>0.10.2</strong>. First start by backing up your data. Seriously. In the past I&#8217;ve had serious problems when performing similar upgrades (even a minor one like this that looks harmless), and even if now opscode are much better with this process it never hurts to be precautions. Since I use a <strong>rubygem</strong> install the next steps will focus on this type of installation; if you are using distribution or opscode packages this will not be very helpful as probably packages are not yet available for this upgrade; once they will replace the gem upgrade part with the deb/rpm upgrade and you should be set.</p>

<h3>1. Stop all the chef related services</h3>

<p>Here is a handy command that will stop all the possible chef server related services:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>for svc in server server-webui solr expander
</span><span class='line'>do
</span><span class='line'>sudo /etc/init.d/chef-${svc} stop
</span><span class='line'>done</span></code></pre></td></tr></table></div></figure>


<!--more-->


<h3>2. Upgrade the chef-server gems</h3>

<p>Simply run:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sudo gem update chef chef-server --no-ri --no-rdoc</span></code></pre></td></tr></table></div></figure>


<p>and this should upgrade all the other gems it needs to. A sample output will look like this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>gem update chef chef-server --no-ri --no-rdoc
</span><span class='line'>Updating installed gems
</span><span class='line'>Updating chef
</span><span class='line'>Successfully installed chef-0.10.2
</span><span class='line'>Updating chef-expander
</span><span class='line'>Successfully installed chef-expander-0.10.2
</span><span class='line'>Updating chef-server
</span><span class='line'>Successfully installed chef-server-api-0.10.2
</span><span class='line'>Successfully installed chef-server-webui-0.10.2
</span><span class='line'>Successfully installed chef-solr-0.10.2
</span><span class='line'>Successfully installed chef-server-0.10.2
</span><span class='line'>Gems updated: chef, chef-expander, chef-server-api, chef-server-webui, chef-solr, chef-server</span></code></pre></td></tr></table></div></figure>


<p>Optional: if you want you can cleanup the system from old, unused gems with:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sudo gem cleanup</span></code></pre></td></tr></table></div></figure>


<h3>3. Start back the chef server services</h3>

<p>Again in a single command, now to start them:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>for svc in server server-webui solr expander
</span><span class='line'>do
</span><span class='line'>sudo /etc/init.d/chef-${svc} start
</span><span class='line'>done</span></code></pre></td></tr></table></div></figure>


<p>That&#8217;s it, now you should be running the latest and greatest chef server version 0.10.2.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Devopsdays 2011 - Mountain View]]></title>
    <link href="http://www.ducea.com/2011/06/27/devopsdays-2011-mountain-view/"/>
    <updated>2011-06-27T18:05:24-07:00</updated>
    <id>http://www.ducea.com/2011/06/27/devopsdays-2011-mountain-view</id>
    <content type="html"><![CDATA[<p>Just like last year, after <strong>Velocity</strong>, I attended <strong><a href="http://devopsdays.org/events/2011-mountainview/">DevOpsDays</a></strong> in <strong>Mountain View</strong>, now at its second edition. Many people that were in town for Velocity spent at least one extra day for DevOpsDays, but also many people from the area that for some reason could not attend Velocity came to LinkedIn HQ for this event; about 200-250 people I would say. Even if the same type of people were at both events (awesome dev/ops), because of the completely different way they are organized they didn&#8217;t overlap at all. As you will see bellow in my impressions <em>DevOpsDays wins largely</em> in most of the areas:</p>

<ul>
<li><p>first of all it is a <strong>free</strong> event (compared with a regular O&#8217;Reilly conference where prices usually start at<strong> $1k</strong>).</p></li>
<li><p>it is much more <strong>interactive</strong>: while Velocity is a classic conference where you normally have a presenter showing off something (hopefully not selling or hiring), and maybe some questions at the end, DevOpsDays is more like an open discussion, with people either on a panel or open spaces.</p></li>
<li><p>the <strong>food</strong> was way better at DevOpsDays, no question about it. And the <em>ice cream</em> on Saturday added an extra special touch ;).</p></li>
</ul>


<p>The first day, Friday, started with the &#8221;<strong>Devops State of the Union</strong>&#8221; by <a href="https://twitter.com/#!/botchagalupe">John Willis</a>. This was a very good introduction on what DevOps means and a look back on what happened during the past couple of years, especially considering the fact that many people where there for the first time. For example I met someone from Microsoft that was sent here to find out <em>&#8220;what is this devops thing&#8221;</em> and how they can use it, and this just shows what a huge progress the devops movement has made in such a short amount of time, and how many people are now interested in the movement. (in this particular case I&#8217;m not sure he returned at Microsoft with something useful, but just the fact that they are interested in this demonstrates my point).</p>

<!--more-->


<p>Next, we had some very interesting panels (4-5 people in general) like: &#8221;<em>To Package or not to Package</em>&#8221;, &#8221;<em>Orchestration at Scale</em>&#8221;, &#8221;<em>DevOps Metrics and Measurement</em>&#8221;, &#8221;<em>DevOps..Where&#8217;s the QA</em>?&#8221; and finally &#8221;<em>Escaping the DevOps Echo Chamber</em>&#8221;. Even though I believe some moderators could have done a better job (not leaving for 10-15mins people standing/waiting to ask a question) I believe this is a great format, very informal and interactive promoting an open discussion and people sharing their experiences. We had also some great <strong>ignite presentations</strong> and by far the most interesting and unexpected one was <a href="https://twitter.com/#!/dlutzy">David Lutz</a> with his <a href="http://www.vimeo.com/25260799">DevOps song</a>.</p>

<p>The second day was in the format of an <strong>unconference</strong>, with several <strong>open spaces</strong> and some short presentations around lunch time. Many people left as they probably wanted to spend the weekend home with their families, but many stayed for Saturday also (about half). From the sessions I attended, I really enjoyed a lot the one about <strong>Kanban</strong>; very useful to see how others used it in operations teams and what problems they had implementing it. I enjoyed also <a href="https://twitter.com/#!/patrickdebois">Patrick&#8217;s</a> <a href="http://www.slideshare.net/jedi4ever/vagrant-devopsdays-mountain-view-2011">presentation about vagrant (</a>I&#8217;m playing already with <strong>veewee</strong>). Also was very proud of Nate and Rich releasing their product <a href="http://reactor8.com/">Reactor8</a> with this occasion.</p>

<p>Overall I think this was an awesome event. Very much improved compared with last year: two days compared with only one, and I liked a lot the format (day 1 panels &amp; day 2 open spaces). Personally I will probably skip Velocity next year (unless I have a talk accepted) and stick only with DevOpsDays. If you are in the area there is no reason to miss <strong>DevOpsDays</strong> and I would highly recommend it, or any of the other <a href="http://devopsdays.org/">DevOpsDays events</a> close to your area.</p>

<p>ps: They recorded all the event (very professional, with multiple angles, etc.) and the content will probably come up online very soon, and once that happens I will link it here also.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Velocity 2011 impressions]]></title>
    <link href="http://www.ducea.com/2011/06/20/velocity-2011-impressions/"/>
    <updated>2011-06-20T15:47:30-07:00</updated>
    <id>http://www.ducea.com/2011/06/20/velocity-2011-impressions</id>
    <content type="html"><![CDATA[<p>Last week I attended <strong><a href="http://velocityconf.com/velocity2011">Velocity 2011</a></strong> in Santa Clara, CA; this was the <em>4th edition</em> of Velocity and my <em>2nd</em> one. This means that even if I was still very much impressed with everything what happened during these 3 days, it was not quite so mind blowing like last year, and you will be able to see this from my impressions bellow.</p>

<p>First impression was that this was <strong>much bigger than last year</strong>, and the numbers just released by O&#8217;Reilly demonstrate it was almost double with about <strong>2,000</strong> participants and another sell out (compared with <strong>1,200</strong> in 2010). Considering the high price of the conference (~1k) this is very impressive and interesting to see how they will host next year even more people. From a question a speaker had many people where at their first Velocity, but even so I met many friends and people I met last year. From the content point of view there was a lot of focus on mobile performance that I haven&#8217;t seen last year. Myself I mostly followed the operations track, and only a few talks in the performance track.</p>

<!--more-->


<p>Tuesday was the &#8221;<em>workshop</em>&#8221; day, and I feel that they should change that name as none of the workshops I attended (OpenStack, Chef, Postmortem, etc.) were nothing else that talks (some quite interesting ones) that were maybe longer than a usual conference talk, but <em>not workshops</em>. This is confusing and people I spoke didn&#8217;t really liked it either. Not even the Chef workshop that could have had a practical exercise (and even if they sent instructions for people to configure their laptops to prepare for this), had nothing for the people in the audience to test and get their hands dirty. Even if this was not a real workshop either the talk by <strong>John Allspaw</strong>: &#8221;<a href="http://velocityconf.com/velocity2011/public/schedule/detail/19766">Advanced Postmortem Fu and Human Error 101</a>&#8221; (<a href="http://www.slideshare.net/jallspaw/advanced-postmortem-fu-and-human-error-101-velocity-2011">slides</a>) was the best of the conference in my opinion and I highly recommend it to anyone interested in the topic (if of course O&#8217;Reilly will publish the video). The day ended with a very good <strong>Ignite</strong> session (including a karaoke part that was quite entertaining).</p>

<p>Wednesday and Thursday were the main days of the conference with even more people arriving in Santa Clara. I&#8217;ve met people that traveled from all over US, but also from other parts of the world (Europe in general). Each day started with plenaries and sponsored talks in the morning until lunch. Personally I would cut down on these plenaries and sponsored talks, or at least give people some alternatives; even allowing for BoFs or any other talks would be great. From the actual presentations, I liked <strong>Mark Imbriaco</strong> talk &#8221;<a href="http://velocityconf.com/velocity2011/public/schedule/detail/18128">Building for the Cloud: Lessons Learned at Heroku</a>&#8221;, <strong>Patrick Debois</strong> and <strong>Andrew Shafer </strong>&#8220;<a href="http://velocityconf.com/velocity2011/public/schedule/detail/17996">Measuring the devops gap</a>&#8221; (<a href="http://assets.en.oreilly.com/1/event/60/Measuring%20the%20devops%20gap%20Presentation.pdf">slides</a>).
In general all the talks I attended were very good. I had high hopes for <strong>Adam Jacob&#8217;s</strong> &#8221;<a href="http://velocityconf.com/velocity2011/public/schedule/detail/19912">Choose Your Own Adventure 2</a>&#8221; (<a href="http://dl.dropbox.com/u/1557449/choose_your_own_adventure_2_velocity_2011.pdf">slides</a>) but this was not even close as funny as the one from last year (not sure why; maybe the room was too big, but also the content was not quite so funny).</p>

<p>On another note,<strong> Velocity Europe</strong> was announced to be happening sometimes in <strong>November</strong> in <strong>Berlin</strong>. Also <strong>Jesse Robbins</strong> passed the co-chair duties he had for the last 4 years to <strong>John Allspaw</strong>.</p>

<p><em>Overall, I would say that <strong>Velocity</strong> is still the conference to go for anyone serious about operations (even though there are some other good options appearing: DevOpsDays, Surge). Velocity is a great, high quality conference that gathers the best people in operations and web performance field. Still for me, I will probably follow next year only the &#8216;hall/bar track&#8217; as that is what I found to be the most valuable; and of course <strong>DevOpsDays</strong> that followed Friday and Saturday, is something I wouldn&#8217;t miss for anything.</em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[RailsConf 2011 - Best of Ignite]]></title>
    <link href="http://www.ducea.com/2011/05/29/railsconf-2011-best-of-ignite/"/>
    <updated>2011-05-29T18:40:01-07:00</updated>
    <id>http://www.ducea.com/2011/05/29/railsconf-2011-best-of-ignite</id>
    <content type="html"><![CDATA[<p>This was by far the best <strong><a href="http://igniterailsconf.com/">Ignite</a></strong> event I&#8217;ve ever attended. This was huge… packed, with more than 400 people in the room, and even if the room was huge it felt like there was no empty seat. Second, the quality and energy of the speakers was amazing. Most of the videos are already uploaded to <a href="http://www.youtube.com/user/igniterails">youtube</a>, and I would recommend to check them out if you have the time. By far my favorite one was <strong>Dr. Nic Williams - <a href="http://www.youtube.com/watch?v=CNACIdZchXA">Ignite Karaoke</a></strong>, where he improvised on a series of &#8220;interesting&#8221; slides (who selected them?) that he never sow before. Amazing… Check it out:</p>

<p>My other favorites ones were: Ben Scofield - <a href="http://www.youtube.com/watch?v=WMCmSk54pqc">How to be Awesome</a> and Gregg Pollack - <a href="http://www.youtube.com/watch?v=ZcQMAV6X_Tg">How to Create Awesome Screencasts</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[MySQLConf 2011 Best of Ignite]]></title>
    <link href="http://www.ducea.com/2011/04/18/mysqlconf-2011-best-of-ignite/"/>
    <updated>2011-04-18T22:43:04-07:00</updated>
    <id>http://www.ducea.com/2011/04/18/mysqlconf-2011-best-of-ignite</id>
    <content type="html"><![CDATA[<p>As my friends know I&#8217;m a big fan of <strong><a href="http://en.wikipedia.org/wiki/Ignite_(event">Ingite</a>)</strong> presentations, and the ones from <strong><a href="http://en.oreilly.com/mysql2011">MySQLConf 2011</a></strong> last week were just outstanding. If you didn&#8217;t had the chance to see them live, here are the links to the best of them.</p>

<p>This was by far my favorite: <strong><a href="http://www.youtube.com/watch?v=nPG4sK_glls">&#8220;Scale Fail&#8221;</a></strong> by <strong>Josh Berkus</strong>; extremely funny on how to build sites that don&#8217;t scale. Highly recommended:</p>

<p>The other two were great ignite talks also, and definitely worth the time checking out: <a href="http://www.youtube.com/watch?v=tqFpz5arzpY">&#8220;Causes of Downtime in MySQL&#8221;</a> by Baron Schwartz and <a href="http://www.youtube.com/watch?v=3bdqrHegRq4">&#8220;The Art of Data Visualization&#8221;</a> by David Holoboff.</p>
]]></content>
  </entry>
  
</feed>
