Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

684 lines (382 sloc) 27.498 kb
<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
<head>
<meta charset="utf-8">
<title>t0m's very occasional blog</title>
<meta name="author" content="Tomas Doran">
<meta name="description" content="I&rsquo;ve been playing around with Terraform a bunch recently, and I&rsquo;m pretty excited about 0.4.0. However at the moment, the examples leave &hellip;">
<!-- http://t.co/dKP3o1e -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="canonical" href="http://bobtfish.github.io">
<link href="/favicon.png" rel="icon">
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
<link href="/atom.xml" rel="alternate" title="t0m's very occasional blog" type="application/atom+xml">
<script src="/javascripts/modernizr-2.0.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>!window.jQuery && document.write(unescape('%3Cscript src="./javascripts/lib/jquery.min.js"%3E%3C/script%3E'))</script>
<script src="/javascripts/octopress.js" type="text/javascript"></script>
<!--Fonts from Google"s Web font directory at http://google.com/webfonts -->
<link href="http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
<link href="http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
</head>
<body >
<header role="banner"><hgroup>
<h1><a href="/">t0m's very occasional blog</a></h1>
<h2>Sufficiently advanced trolling is indistinguishable from thought leadership</h2>
</hgroup>
</header>
<nav role="navigation"><ul class="subscription" data-subscription="rss">
<li><a href="/atom.xml" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
</ul>
<form action="http://google.com/search" method="get">
<fieldset role="search">
<input type="hidden" name="q" value="site:bobtfish.github.io" />
<input class="search" type="text" name="q" results="0" placeholder="Search"/>
</fieldset>
</form>
<ul class="main-navigation">
<li><a href="/">Blog</a></li>
<li><a href="/blog/archives">Archives</a></li>
</ul>
</nav>
<div id="main">
<div id="content">
<div class="blog-index">
<article>
<header>
<h1 class="entry-title"><a href="/blog/2015/03/29/terraform-from-the-ground-up/">Terraform From the Ground Up</a></h1>
<p class="meta">
<time datetime="2015-03-29T21:18:00+01:00" pubdate data-updated="true">Mar 29<span>th</span>, 2015</time>
</p>
</header>
<div class="entry-content"><p>I&rsquo;ve been playing around with <a href="https://www.terraform.io/">Terraform</a> a bunch recently, and I&rsquo;m pretty <a href="https://twitter.com/bobtfish/status/581905067948797952">excited</a> about <a href="https://github.com/hashicorp/terraform/blob/master/CHANGELOG.md#040-unreleased">0.4.0</a>.</p>
<p>However at the moment, the examples leave quite a lot to be desired. So for my own learning and entertainment, I&rsquo;ve created a set of example Terraform modules,
and a simple example that you should be able to clone and run.</p>
</div>
<footer>
<a rel="full-article" href="/blog/2015/03/29/terraform-from-the-ground-up/">Read on &rarr;</a>
</footer>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2014/11/10/more-talks/">More Talks</a></h1>
<p class="meta">
<time datetime="2014-11-10T14:01:00+00:00" pubdate data-updated="true">Nov 10<span>th</span>, 2014</time>
</p>
</header>
<div class="entry-content"><p>I&rsquo;m still rubbish at remembeing to (or finding the time to) blog, however here&rsquo;s some more video links:</p>
<ul>
<li> <a href="http://www.meetup.com/London-DevOps/events/202106482/">London Devops</a> Dockersh and a guided tour of the Linux kernel facilities docker uses. <a href="http://www.youtube.com/watch?v=hwWvfAGkcmg">Video</a> <a href="http://www.slideshare.net/bobtfish/dockersh-and-a-brief-intro-to-the-docker-internals">Slides</a></li>
<li> <a href="http://2014.puppetconf.com/">Puppetconf 2014</a> Sensu and Sensibility &ndash; The Story of a Journey From #monitoringsucks to #monitoringlove. <a href="http://www.youtube.com/watch?v=0VfSmITEOHM">Video</a> <a href="http://www.slideshare.net/bobtfish/sensu-and-sensibility-puppetconf-2014">Slides</a></li>
</ul>
<hr />
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2014/04/15/me-in_video_form/">Me, in Video Form</a></h1>
<p class="meta">
<time datetime="2014-04-15T13:38:00+01:00" pubdate data-updated="true">Apr 15<span>th</span>, 2014</time>
</p>
</header>
<div class="entry-content"><p>I&rsquo;ve been a massive fail at blogging recently, as I&rsquo;ve been way too busy doing cool stuff :)</p>
<p>However, I have talked at a whole bunch of conferences and tech meetups in the last 12 months,
here&rsquo;s a quick run-down of where&rsquo;s I&rsquo;ve been for posterity:</p>
<h2>Updates since the original post</h2>
<ul>
<li><a href="http://puppetlabs.com/events/puppet-camp-nyc">Puppetcamp NY</a> Streamlining your puppet development workflow. <a href="http://www.youtube.com/watch?v=lRmAMqrPd4k">Video</a> <a href="http://www.slideshare.net/bobtfish/steamlining-your-puppet-developmentpuppetconfny2014">Slides</a></li>
<li><a href="http://www.dockercon.com/">Dockercon 14</a> &ndash; Building a smarter application stack &ndash; service discovery and wiring for Docker and traditional deployments. <a href="https://www.youtube.com/watch?v=49_5lwGtkmo">Video</a> <a href="http://www.slideshare.net/bobtfish/docker-confjune2014">Slides</a></li>
</ul>
<h2>Original list</h2>
<ul>
<li><a href="https://puppetlabs.com/events/puppet-camp-london-0">Puppet camp London 2014</a> &ndash; Chasing AMI &ndash; Building Amazon machine images with Puppet, Packer and Jenkins <a href="http://www.youtube.com/watch?v=ZeCoHYwfn3g">Video</a> <a href="http://www.slideshare.net/bobtfish/chasing-ami-puppetcamplondonapr2014">Slides</a></li>
<li>San Francisco Perl Mongers Tech Meetup May 2014 &ndash; Taking control of chaos with Docker (redux, with additional content) <a href="https://archive.org/details/tomasdorantakingcontrolofchaoswithdocker">Video</a></li>
<li><a href="http://puppetlabs.com/blog/puppet-camp-silicon-valley">Puppet camp Silicon Valley 2014</a> &ndash; Deploying puppet code at light speed <a href="http://www.slideshare.net/bobtfish/deploying-puppet-code-at-light-speed">Slides</a> <a href="http://www.youtube.com/watch?v=CKdNDEyq1eA">Video</a> <a href="http://www.youtube.com/watch?v=W4Skk5D6drU">Panel session video</a></li>
<li><a href="http://www.netways.de/puppetcamp/archive_munich_2013/">Puppet camp Munich 2013</a> &ndash; Thinking through puppet code layout <a href="http://www.slideshare.net/bobtfish/code-layout-puppetcampmunich">Slides</a> <a href="http://www.youtube.com/watch?v=aiJ1pmrqR7E">Video</a></li>
<li>Puppet camp London 2013 &ndash; Taking control of chaos with Docker and Puppet <a href="http://www.slideshare.net/bobtfish/docker-puppetcamp-london-2013">Slides</a> <a href="http://www.youtube.com/watch?v=KSo_mcJxFIA">Video</a></li>
<li>Puppet conf 2013 &ndash; Test driven infrastructure development <a href="">Slides</a> <a href="http://www.youtube.com/watch?v=S8_a5G1UCdM">Video</a></li>
</ul>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2013/11/06/we-have-always-been-at-war-with-eastasia/">We Have Always Been at War With Eastasia</a></h1>
<p class="meta">
<time datetime="2013-11-06T23:12:00+00:00" pubdate data-updated="true">Nov 6<span>th</span>, 2013</time>
</p>
</header>
<div class="entry-content"><p>Rewriting history when doing an svn to git migration is always fun. Especially when you start rewriting the entire contents of files.</p>
<p>Take this ditty for instance:</p>
<blockquote><p> git filter-branch -f &mdash;tree-filter &lsquo;for j in $(for i in $(find . -name *.pp | grep -v vendor | grep -v tmp); do cat $i |perl -ne&#8221;/(\s+)\S/&amp;&amp;\$e{length(\$1)}++;END {exit 0 if \$e{2}; exit 2}&ldquo;|| echo $i; done); do cat $j | perl -ne&rdquo;/^(\s+)/;\$s=length(\$1)/2;\$s=\&ldquo; &#34;x\$s;s/^\s+/\$s/;print&rdquo;>&ldquo;$j.new&rdquo; &amp;&amp; mv &ldquo;$j.new&rdquo; $j; done;find . -name *.pp | grep -v vendor | grep -v tmp | xargs puppet-lint &mdash;fix >/dev/null ||true&rsquo; HEAD</p></blockquote>
<p>This switches my puppet codebase to the canonical 2 space (rather than 4 space) tabs and fixes lint/quoting issues &ndash; all the way back through history.</p>
<p>I, for one, welcome our newold code layout overlords.</p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2013/10/06/read-only-bind-mounts-and-docker/">Read Only Bind Mounts and Docker for Unix Domain Sockets</a></h1>
<p class="meta">
<time datetime="2013-10-06T23:48:00+01:00" pubdate data-updated="true">Oct 6<span>th</span>, 2013</time>
</p>
</header>
<div class="entry-content"><p>I&rsquo;ve been playing around with <a href="http://docker.io">Docker</a> a load recently, and I&rsquo;ve developed a nice
little pattern for sharing sockets that I&rsquo;m gonna pass on. (By sockets, I specifically
mean <a href="http://en.wikipedia.org/wiki/Unix_domain_socket">Unix domain sockets</a>) for the purposes
of this post.</p>
<p>A lot of applications can either use a TCP socket, or a Unix domain socket to communicate &ndash; for
example <a href="http://www.fastcgi.com/drupal/">FastCGI</a> and <a href="MySQL">http://www.mysql.com/</a> both
allow you to use either mode (and in the case of mysql, both).</p>
<p>I have a small home server, and a want to run a bunch of applications that inside containers
(for security and management reasons), and these applications need to speak to a mysql server
(via a unix domain socket &ndash; which just appears to be a file on the filesystem.</p>
<p>I also want to run the mysql server inside a container &ndash; so the mechanics of getting a socket
shared between them are a little non-trivial.</p>
<p>Lets go through a worked example of how I&rsquo;ve solved this for the dovecot imap and pop3 server
talking to mysql. This is an especially fun example, as dovecot runs as root (within it&rsquo;s container)
so if someone hacked into the server through an exploit in dovecot &ndash; they can rm -rf anything
I share with that container&hellip;</p>
<p>First off, I&rsquo;ve created some <a href="http://en.wikipedia.org/wiki/Logical_Volume_Manager_%28Linux%29">LVM</a> volumes:</p>
<blockquote><p> mysql vg0 -wi-ao 4.00g</p></blockquote>
<p>This is the mysql data directory, which will be mounted in the mysql container as /var/lib/mysql</p>
<blockquote><p> mysql_socket vg0 -wi-ao 4.00m</p></blockquote>
<p>This is going to get mounted at /socket/mysql inside containers, and will hold the mysql Unix domain socket</p>
<blockquote><p> vmail vg0 -wi-ao 20.00g</p></blockquote>
<p>And this is my mail spool for dovecot with all the emails in it.</p>
<p>The immediate problem with this is that if the mysql socket volume is shared between multiple other containers
(as dovecot won&rsquo;t be the only app using this mysql instance), as dovecot runs as &lsquo;root&rsquo;, then if it gets hacked,
the hacker can delete the mysql socket, and any other programs trying to connect to mysql through that
socket will be affected.</p>
<p>We can&rsquo;t allow that &ndash; that would defeat the entire point of using containers for application isolation!</p>
<p>The trick is that you only need read access to use a unix domain socket that some other program has created.</p>
<p>Therefore, we can use <a href="http://docs.1h.com/Bind_mounts">bind mounts</a> to fix this &ndash; by re-binding a readonly
(-o ro) copy of the file system, and giving <em>that</em> to dovecot would stop these issues, easy&hellip;</p>
<p>So, our partitions get mounted like this:</p>
<blockquote><p>/dev/mapper/vg0-vmail on /mnt/volumes/vmail type ext3 (rw,noatime)
/dev/mapper/vg0-mysql on /mnt/volumes/mysql type ext3 (rw,noatime)
/dev/mapper/vg0-mysql_socket on /mnt/volumes/mysql_socket type ext3 (rw,noatime)
/mnt/volumes/mysql_socket on /mnt/volumes_ro/mysql_socket type none (ro,bind)</p></blockquote>
<p>The last line involves a little trick. When I tried this, to my dismay, it didn&rsquo;t work.</p>
<p>The /etc/fstab entry associated with it is:</p>
<blockquote><p>/mnt/volumes/mysql_socket /mnt/volumes_ro/mysql_socket none bind,ro 00 00</p></blockquote>
<p>But <a href="https://www.google.co.uk/search?q=bind+mount+read+only">as you can see</a> from the Googles,
read only bind mounts are a bit tricky &ndash; you have to re-mount them a second time to make them
read-only.</p>
<p>The trick I use here is twofold &ndash; one, I only create them with puppet (mostly using the excelent
<a href="https://forge.puppetlabs.com/AlexCline/mounts">mounts module</a> (which I only had to patch <a href="https://github.com/bobtfish/puppet-mounts/commit/abe73f82064f01bccd45289eb4f4ce51353ca364">a little bit</a>),
the associated code looks 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>
</pre></td><td class='code'><pre><code class='sh'><span class='line'> mounts <span class="o">{</span> <span class="s2">&quot;Mount volume ${name} bind to ro&quot;</span>:
</span><span class='line'> <span class="nv">ensure</span> <span class="o">=</span>&gt; present,
</span><span class='line'> <span class="nb">source</span> <span class="o">=</span>&gt; <span class="s2">&quot;/mnt/volumes/${name}&quot;</span>,
</span><span class='line'> <span class="nv">dest</span> <span class="o">=</span>&gt; <span class="s2">&quot;/mnt/volumes_ro/${name}&quot;</span>,
</span><span class='line'> <span class="nb">type</span> <span class="o">=</span>&gt; <span class="s1">&#39;none&#39;</span>,
</span><span class='line'> <span class="nv">opts</span> <span class="o">=</span>&gt; <span class="s1">&#39;bind,ro&#39;</span>, <span class="c"># Note bind mount ignores ro till you remount, thus the trickery below</span>
</span><span class='line'> <span class="o">}</span>
</span><span class='line'> -&gt;
</span><span class='line'> <span class="nb">exec</span> <span class="o">{</span> <span class="s2">&quot;/bin/mount -o remount,ro &#39;/mnt/volumes_ro/${name}&#39;&quot;</span>:
</span><span class='line'> <span class="nv">onlyif</span> <span class="o">=</span>&gt; <span class="s2">&quot;/bin/mount -l | /bin/grep &#39;/mnt/volumes/${name} on /mnt/volumes_ro/${name} type none (rw,bind)&#39;&quot;</span>
</span><span class='line'> <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>
<p>This could be notify rather than just ordering &ndash; but I like to be paranoiad and check these are ok
every puppet run..</p>
<p>However, if the machine is freshly rebooted, then the read-only file systems won&rsquo;t be remounted yet, ergo
the second piece of cunning is an upstart script to make sure things as kosher after a reboot:</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>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="c"># /etc/init/remount-ro-bind-mounts.conf - Dirty hack to remount ro bind mounts properly</span>
</span><span class='line'>
</span><span class='line'>description <span class="s2">&quot;Remount RO bind mount filesystems on boot&quot;</span>
</span><span class='line'>
</span><span class='line'>start on <span class="nb">local</span>-filesystems
</span><span class='line'>
</span><span class='line'>console output
</span><span class='line'>
</span><span class='line'>script
</span><span class='line'> <span class="k">for </span>fs in <span class="k">$(</span>cat /etc/fstab | awk <span class="s1">&#39;{ print $2 &quot; &quot; $4 }&#39;</span> | grep <span class="s1">&#39;bind,ro$&#39;</span> | cut -d<span class="s1">&#39; &#39;</span> -f1<span class="k">)</span>; <span class="k">do </span>mount | grep rw,bind | awk <span class="s1">&#39;{ print $3 }&#39;</span> | grep <span class="nv">$fs</span> &gt;/dev/null; <span class="k">if</span> <span class="o">[</span> <span class="nv">$?</span> -eq 0 <span class="o">]</span>; <span class="k">then </span>mount -o remount,ro <span class="nv">$fs</span>; <span class="k">fi</span>; <span class="k">done</span>
</span><span class='line'>end script
</span></code></pre></td></tr></table></div></figure>
<p>And there we go &ndash; all done(-ish). I just rsync the vmail spool and mysql data from another machine, and start it all up!</p>
<p>The containers 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>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>sudo docker ps
</span><span class='line'>ID IMAGE COMMAND CREATED STATUS PORTS
</span><span class='line'>04a9da050ba8 t0m/dovecot:latest /start run 25 minutes ago Up 25 minutes 110-&gt;110, 143-&gt;143, 993-&gt;993, 995-&gt;995
</span><span class='line'>20b3a7a65966 t0m/mysql:latest /start run About an hour ago Up About an hour
</span></code></pre></td></tr></table></div></figure>
<p>And they get run with the upstart script from <a href="https://forge.puppetlabs.com/garethr/docker">Garth&rsquo;s excelent docker puppet module</a>:</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='sh'><span class='line'><span class="nv">$ </span>ps aux | grep <span class="s1">&#39;docker run&#39;</span> | grep -v grep
</span><span class='line'>root 16874 0.0 0.0 273744 4944 ? Ssl Oct06 0:00 docker run -u mysql -v /mnt/volumes/mysql/data:/var/lib/mysql -v /mnt/volumes/mysql_socket:/socket -m 0 t0m/mysql:latest
</span><span class='line'>root 28498 0.0 0.0 272336 4944 ? Ssl Oct06 0:00 docker run -v /mnt/volumes/vmail:/var/vmail -v /mnt/volumes_ro/mysql_socket/run:/socket/mysql -m 0 t0m/dovecot:latest
</span></code></pre></td></tr></table></div></figure>
<p>And last but not least, here&rsquo;s it working:</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>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>openssl s_client -quiet -connect localhost:995
</span><span class='line'><span class="nv">depth</span><span class="o">=</span>0 <span class="nv">C</span> <span class="o">=</span> GB, <span class="nv">ST</span> <span class="o">=</span> Greater London, <span class="nv">L</span> <span class="o">=</span> London, <span class="nv">O</span> <span class="o">=</span> bobtfish.net, <span class="nv">CN</span> <span class="o">=</span> mail.bobtfish.net
</span><span class='line'>verify error:num<span class="o">=</span>18:self signed certificate
</span><span class='line'>verify <span class="k">return</span>:1
</span><span class='line'><span class="nv">depth</span><span class="o">=</span>0 <span class="nv">C</span> <span class="o">=</span> GB, <span class="nv">ST</span> <span class="o">=</span> Greater London, <span class="nv">L</span> <span class="o">=</span> London, <span class="nv">O</span> <span class="o">=</span> bobtfish.net, <span class="nv">CN</span> <span class="o">=</span> mail.bobtfish.net
</span><span class='line'>verify <span class="k">return</span>:1
</span><span class='line'>+OK Dovecot ready.
</span><span class='line'>USER bobtfish@bobtfish.net
</span><span class='line'>+OK
</span><span class='line'>PASS xxxxxx
</span><span class='line'>+OK Logged in.
</span><span class='line'>STAT
</span><span class='line'>+OK 488 15003687
</span></code></pre></td></tr></table></div></figure>
<p>Next up, doing the same trickery for postfix, and then I&rsquo;ll have a working mail infrastructure that&rsquo;s entirely containerised.</p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2013/10/05/the-starwars-methodology/">The Starwars Methodology</a></h1>
<p class="meta">
<time datetime="2013-10-05T00:25:00+01:00" pubdate data-updated="true">Oct 5<span>th</span>, 2013</time>
</p>
</header>
<div class="entry-content"><p>This seemingly isn&rsquo;t a well known term, and today I&rsquo;m irritated by people
thinking I perform &lsquo;magic&rsquo; by using grep, so here&rsquo;s a rant about what I call
the &ldquo;<em>Star Wars</em>&rdquo; &trade; methodology of problem solving:</p>
<p>To put it quite simply:</p>
<blockquote><p>Use the Source Luke</p></blockquote>
<p>Oftentimes grepping through the source code of the thing that&rsquo;s giving you
trouble (even if it&rsquo;s written in a language you don&rsquo;t speak) will turn up
gold.</p>
<p>Given a basic model of OO languages, it&rsquo;s easily possible to infer what&rsquo;s
going on (or what may be going on) most of the time given basic observations
and a few print statements, or even a file and line number.</p>
<p>Getting a full backtrace out of <a href="https://metacpan.org/module/JJORE/App-Stacktrace-0.09/bin/perl-stacktrace">most</a> <a href="http://isotope11.com/blog/getting-a-ruby-backtrace-from-gnu-debugger">dynamic</a> <a href="https://wiki.python.org/moin/DebuggingWithGdb">languages</a> is real easy too, even in extreme cases..</p>
<p>Even if you don&rsquo;t know for sure, some source diving will at least
help give you more concrete ideas about how the code is built, which
will allow you to frame the problem better when you do peresent it
to someone with the relevant language and/or domain knowledge.</p>
<p>Even if your assumptions were totally wrong &ndash; at at least look more
initiative (and tried to go deeper) than your average Joe, so
the expert is more likely to want to help you, as you&rsquo;re already
demonstrated a provable desire to be taught to fish, rather than
just be thrown them.</p>
<p>&lt;/rant&gt;</p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2013/07/13/new-blog/">New Blog.</a></h1>
<p class="meta">
<time datetime="2013-07-13T09:24:00+01:00" pubdate data-updated="true">Jul 13<span>th</span>, 2013</time>
</p>
</header>
<div class="entry-content"><p>Finally got around to creating a personal blog in which to ramble about stuff I&rsquo;m thinking about
and/or working on.</p>
<p>Expect perl, ruby, puppet, mcollective, sysadmin nonsense &amp; arduinos if you&rsquo;re lucky.</p>
</div>
</article>
<div class="pagination">
<a href="/blog/archives">Blog Archives</a>
</div>
</div>
<aside class="sidebar">
<section>
<h1>Recent Posts</h1>
<ul id="recent_posts">
<li class="post">
<a href="/blog/2015/03/29/terraform-from-the-ground-up/">Terraform From the Ground Up</a>
</li>
<li class="post">
<a href="/blog/2014/11/10/more-talks/">More Talks</a>
</li>
<li class="post">
<a href="/blog/2014/04/15/me-in_video_form/">Me, in Video Form</a>
</li>
<li class="post">
<a href="/blog/2013/11/06/we-have-always-been-at-war-with-eastasia/">We Have Always Been at War With Eastasia</a>
</li>
<li class="post">
<a href="/blog/2013/10/06/read-only-bind-mounts-and-docker/">Read Only Bind Mounts and Docker for Unix Domain Sockets</a>
</li>
</ul>
</section>
<section>
<h1>GitHub Repos</h1>
<ul id="gh_repos">
<li class="loading">Status updating&#8230;</li>
</ul>
<a href="https://github.com/bobtfish">@bobtfish</a> on GitHub
<script type="text/javascript">
$(document).ready(function(){
if (!window.jXHR){
var jxhr = document.createElement('script');
jxhr.type = 'text/javascript';
jxhr.src = '/javascripts/libs/jXHR.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(jxhr, s);
}
github.showRepos({
user: 'bobtfish',
count: 10,
skip_forks: false,
target: '#gh_repos'
});
});
</script>
<script src="/javascripts/github.js" type="text/javascript"> </script>
</section>
</aside>
</div>
</div>
<footer role="contentinfo"><p>
Copyright &copy; 2015 - Tomas Doran -
<span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
</p>
</footer>
<script type="text/javascript">
(function(){
var twitterWidgets = document.createElement('script');
twitterWidgets.type = 'text/javascript';
twitterWidgets.async = true;
twitterWidgets.src = '//platform.twitter.com/widgets.js';
document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
})();
</script>
</body>
</html>
Jump to Line
Something went wrong with that request. Please try again.