<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>thattommyhall.com</title>
	<atom:link href="http://www.thattommyhall.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thattommyhall.com</link>
	<description>A Random Walk Through Idea Space</description>
	<lastBuildDate>Sun, 12 May 2013 16:13:05 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>STM in Clojure vs Haskell, why no retry or orElse?</title>
		<link>http://www.thattommyhall.com/2013/02/15/stm-clj-vs-haskell/</link>
		<comments>http://www.thattommyhall.com/2013/02/15/stm-clj-vs-haskell/#comments</comments>
		<pubDate>Fri, 15 Feb 2013 15:13:52 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[haskell]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=870</guid>
		<description><![CDATA[A few months ago I reread Simon Peyton Joneses article on STM in the Beautiful Code book and decided to try and translate it into clojures STM See the paper here He says &#8216;Atomic blocks as we have introduced them so far are utterly inadequate to coordinate concurrent programs. They lack two key facilities: blocking [...]]]></description>
				<content:encoded><![CDATA[<p>A few months ago I reread Simon Peyton Joneses article on STM in the <a href="http://www.amazon.co.uk/gp/product/0596510047?ie=UTF8&#038;camp=3194&#038;creative=21330&#038;creativeASIN=0596510047&#038;linkCode=shr&#038;tag=tomsblog-21" rel="nofollow">Beautiful Code</a> book and decided to try and translate it into clojures STM</p>
<p>See the paper <a href="http://research.microsoft.com/pubs/74063/beautiful.pdf">here</a> </p>
<p>He says &#8216;Atomic blocks as we have introduced them so far are utterly inadequate to coordinate concurrent programs. They lack two key facilities: blocking and choice&#8217; so I guess the implication is Clojures STM is inferior, any thoughts?</p>
<p>I had to use a constraint on a ref and try/catch to get the same effect (though I hate using exceptions for control flow it does seem to work)</p>
<p>I think a better solution might be had using watchers, how would you do it?<br />
Any good links explaining differences in the STMs?</p>
<p><script src="https://gist.github.com/4960952.js"></script><noscript><pre><code class="language-clojure clojure">(ns santa.core)

(declare join-group)

(defn start-thread
  [fn]
  (.start
   (Thread. fn)))

(defn random-delay []
  (Thread/sleep (rand-int 1000)))

(def printer (agent 0))

(defn threadsafe-print
  [somestring]
  (send printer println somestring))

(defn make-gate
  [max-size]
  (ref {:max-size max-size
        :remaining 0}
       :validator #(&gt;= (:remaining %) 0)))

(defn pass-gate
  [gate]
  (try 
    (dosync (alter gate #(update-in % [:remaining] dec)))
    (catch IllegalStateException e
      (do ;(Thread/sleep 20)
          (pass-gate gate)))))

(defn helper
  [group task]
  (let [[in-gate out-gate] (join-group group)]
    (do (pass-gate in-gate)
        (task)
        (pass-gate out-gate)
        )))

(defn thread [group id work-fn]
  (start-thread
   (fn []
     (random-delay)
     (helper group #(work-fn id))
     (recur))))

(defn deliver-toys [id]
  (threadsafe-print
   (str &quot;Reindeer &quot; id &quot; delivering toys&quot;)))

(defn meet-in-study [id]
  (threadsafe-print
   (str &quot;Elf &quot; id &quot; meeting in the study&quot;)))

(defn reindeer-thread [group id]
  (thread group id deliver-toys))

(defn elf-thread [group id]
  (thread group id meet-in-study))

(defn operate-gate
  [gate]
  (dosync (alter gate assoc :remaining (:max-size @gate)))
  (while (&gt; (:remaining @gate) 0)
    ;(Thread/sleep 20)
    ))

(defn new-group
  [max-size]
  (ref {:max-size max-size
        :remaining max-size
        :in-gate (make-gate max-size)
        :out-gate (make-gate max-size)
        }
       :validator #(&gt;= (:remaining %) 0)))

(defn join-group                  
  [group]
  (try 
    (dosync (let [{:keys [remaining max-size in-gate out-gate]} @group]
              (alter group #(update-in % [:remaining] dec))
              [in-gate out-gate]))
    (catch IllegalStateException e
      (do ;(Thread/sleep 20)
          (join-group group)))))


(def elf-group (new-group 3))
(def reindeer-group (new-group 9))

(defn handle-group [group group-name]
  (let [current-group @group
        {:keys [max-size remaining in-gate out-gate]} current-group]
    (if (= 0 remaining)
      (do (dosync
           (ref-set group {:max-size max-size
                           :remaining max-size
                           :in-gate (make-gate max-size)
                           :out-gate (make-gate max-size)}))
          (threadsafe-print (str &quot;***** With&quot; group-name &quot;*****&quot;))
          (operate-gate in-gate)
          (operate-gate out-gate)
          true))))

(defn santa []
  (while (handle-group elf-group &quot;Elves&quot;))
  (handle-group reindeer-group &quot;Reindeer&quot;)
  (recur))

(defn -main
  [&amp; args]
  (dotimes [i 9]
    (do (println &quot;Launching reindeer thread:&quot; i)
        (reindeer-thread reindeer-group i)))
  (dotimes [i 10]
    (do (println &quot;Launching elf thread&quot; i)
        (elf-thread elf-group i)))
  (santa))</code></pre></noscript></p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2013/02/15/stm-clj-vs-haskell/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2013/02/15/stm-clj-vs-haskell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook Hacker Cup 2013</title>
		<link>http://www.thattommyhall.com/2013/02/04/facebook-hacker-cup-2013/</link>
		<comments>http://www.thattommyhall.com/2013/02/04/facebook-hacker-cup-2013/#comments</comments>
		<pubDate>Mon, 04 Feb 2013 14:24:06 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[clojure]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=845</guid>
		<description><![CDATA[This year I did the Facebook Hacker Cup again. I didn&#8217;t do as well as last year, only getting to the first round and solving just one problem. It was interesting and fun though. I was in position 1952 of about 10,000 with 877 people solving more problems than me. Lots of people solved just [...]]]></description>
				<content:encoded><![CDATA[<p>This year I did the Facebook Hacker Cup again. I didn&#8217;t do as well as last year, only getting to the first round and solving just one problem. It was interesting and fun though. I was in position 1952 of about 10,000 with 877 people solving more problems than me. Lots of people solved just the 3rd question, I wish I had a go at it, next time I&#8217;ll be sure to look at them all.</p>
<p><strong>Qualification Round</strong><br />
For the qualifier I was in Leeds so didn&#8217;t have much time to look at it but solved the first in a few mins as I had most of the &#8216;plumbing&#8217; (ie taking their input and spitting out a file in the correct format) from last year.</p>
<blockquote><p>Given a string s, little Johnny defined the beauty of the string as the sum of the beauty of the letters in it.<br />
The beauty of each letter is an integer between 1 and 26, inclusive, and no two letters have the same beauty. Johnny doesn&#8217;t care about whether letters are uppercase or lowercase, so that doesn&#8217;t affect the beauty of a letter. (Uppercase &#8216;F&#8217; is exactly as beautiful as lowercase &#8216;f&#8217;, for example.)<br />
You&#8217;re a student writing a report on the youth of this famous hacker. You found the string that Johnny considered most beautiful. What is the maximum possible beauty of this string?</p></blockquote>
<p><script src="https://gist.github.com/4706850.js?file=q.clj"></script><noscript><pre><code class="language-clojure clojure">(def letters
  (set &quot;abcdefghijklmnopqrstuvwxyz&quot;))

;; If you don't know clojure it might be interesting that sets are functions of their elements
;; and return either nil or the element, so can be used as predicates 

(defn counts [s]
  (frequencies (filter letters (str/lower-case s))))

;; Here we filter the string for letters we care about (after lowercasing it)
;; and create a map of the characters to there count in the string

;; eg (counts &quot;Good luck in the Facebook Hacker Cup this year!&quot;)
;; {\a 3, \b 1, \c 4, \d 1, \e 4, \f 1, \g 1, \h 3, \i 2, \k 3, \l 1, \n 1, \o 4, \p 1, \r 2, \s 1, \t 2, \u 2, \y 1}

(defn beauty [s]
  (reduce + (map *
                 (reverse (sort (vals (counts s))))
                 (iterate dec 26))))

;; To make the score as big as possible you want the most frequent letter to be worth 26
;; then each one descending by frequency is work 25, 24 etc
;; (reverse (sort (vals (counts s)))) it the frequencies in descending order
;; (iterate dec 26) is 26, 25, 24 etc
;; we multiply each and then add them</code></pre></noscript></p>
<p><strong>Round 1</strong><br />
I had the evening cleared from about 8pm (it launched 6PM GMT, so I probably lost before I started anyway after seeing how rapidly others did them!)</p>
<blockquote><p>You are given an array a with N &#8804 10 000 different integer numbers and a number, K, where 1 &#8804; K &#8804; N. For all possible subsets of a of size K find the sum of their maximal elements modulo 1 000 000 007.
</p></blockquote>
<p>Easy! 1-liner in clojure.<br />
<script src="https://gist.github.com/4706850.js?file=r1_simple.clj"></script><noscript><pre><code class="language-clojure clojure">(defn sum-max-of-subsets [cards k]
  (reduce + (map #(apply max %) (comb/combinations cards k))))</code></pre></noscript>(however it does not scale to the size of the input)</p>
<p>My basic idea to make it faster was using a bit of combinatorics. If the deck is [1,5,7,11...] (it&#8217;s not a coincidence I ordered them now) with a hand size (k) of 3 then 1 and 5 will never be the max, 7 will be in the hand [1,5,7] and 11 will be the max of [1,5,11] [1,7,11] and [5,7,11], in general the nth card will be maximum <img src='http://s.wordpress.com/latex.php?latex=%7Bn-1%5Cchoose%20k%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{n-1\choose k}' title='{n-1\choose k}' class='latex' /> &#8220;n-1 choose k&#8221; times, so the problem becomes easier, loop thorough the elements finding out how many times it would be the maximum. See <a href="http://en.wikipedia.org/wiki/Combination" target="_blank">here</a> if that does not make sense.<br />
<script src="https://gist.github.com/4706850.js?file=r1.clj"></script><noscript><pre><code class="language-clojure clojure">(def factorial
  (memoize (fn [n]
             (reduce *' (range 1 (inc n))))))

(defn nCks [k]
  (let [fac (factorial k)]
    (map #(/ % fac)
         (reductions (fn [acc n]
                       (* acc (/ n (- n k))))
                     fac
                     (iterate inc (inc k))))))

(defn sum-max-of-subsets [cards k]
  (let [sorted (drop (dec k) (sort cards))
        nck (nCks (dec k))]
    (mod (reduce +'
                 (map * sorted nck))
         1000000007)))

(defn bigparse [s]
  (bigint (Integer. s)))

(defn parse-input [line1 line2]
  (let [k (bigparse (second (str/split line1 #&quot;\s+&quot;)))
        cards (map bigparse (str/split line2 #&quot;\s+&quot;))
        ]
    (sum-max-of-subsets cards k)))
</code></pre></noscript><br />
The final speedup (probably not necessary) was as k is fixed we dont need to calculate nCk every time so I used the <a href="http://en.wikipedia.org/wiki/Binomial_coefficient#Multiplicative_formula" target="_blank">Multiplicative Formula</a> for calculating it to get a new value for <img src='http://s.wordpress.com/latex.php?latex=%7Bn%5Cchoose%20k%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{n\choose k}' title='{n\choose k}' class='latex' /> from <img src='http://s.wordpress.com/latex.php?latex=%7Bn-1%5Cchoose%20k%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='{n-1\choose k}' title='{n-1\choose k}' class='latex' /> by multiplying by n and dividing by n-k each time (what I have called nCks in the code)</p>
<p>For the other problem I groped around the next day trying to solve it, thought &#8216;this looks perfect for core.logic&#8217; then proceeded to procrastinate and watch The Shield and eat bacon. I am OK with this.</p>
<p>Code is of course on <a href="https://github.com/thattommyhall/hackercup2013">github</a></p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2013/02/04/facebook-hacker-cup-2013/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2013/02/04/facebook-hacker-cup-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sorry, command-not-found has crashed!</title>
		<link>http://www.thattommyhall.com/2012/12/12/sorry-command-not-found-has-crashed/</link>
		<comments>http://www.thattommyhall.com/2012/12/12/sorry-command-not-found-has-crashed/#comments</comments>
		<pubDate>Wed, 12 Dec 2012 12:22:33 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=835</guid>
		<description><![CDATA[Whenever typed a command that didn&#8217;t exist on some of our servers I got the following It turns out that it was to do with locale settings, I fixed it by Share on Facebook]]></description>
				<content:encoded><![CDATA[<p>Whenever typed a command that didn&#8217;t exist on some of our servers I got the following </p>
<pre class="brush: plain; title: ; notranslate">
$ poop
Sorry, command-not-found has crashed! Please file a bug report at 

https://bugs.launchpad.net/command-not-found/+filebug

Please include the following information with the report 
command-not-found version: 0.2.44
</pre>
<p>It turns out that it was to do with locale settings, I fixed it by </p>
<pre class="brush: plain; title: ; notranslate">
$ sudo locale-gen en_GB.UTF-8
$ sudo update-locale LANG=en_GB.UTF-8
</pre>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2012/12/12/sorry-command-not-found-has-crashed/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2012/12/12/sorry-command-not-found-has-crashed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solving 4clojure problems offline in emacs</title>
		<link>http://www.thattommyhall.com/2012/11/14/solving-4clojure-problems-offline-in-emacs/</link>
		<comments>http://www.thattommyhall.com/2012/11/14/solving-4clojure-problems-offline-in-emacs/#comments</comments>
		<pubDate>Wed, 14 Nov 2012 23:51:21 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[clojure]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=828</guid>
		<description><![CDATA[It annoys me when sometimes a solution to a 4clojure problem gets a bit long to type and test in the little edit box. As they say it is not an IDE, and doesn&#8217;t try to be, so I wrote a little app that fetches the problems down via the api and wraps the tests [...]]]></description>
				<content:encoded><![CDATA[<p>It annoys me when sometimes a solution to a 4clojure problem gets a bit long to type and test in the little edit box. As they say it is not an IDE, and doesn&#8217;t try to be, so I wrote a little app that fetches the problems down via the api and wraps the tests up in an assertion so you can edit it in emacs or whatever, run the tests in lein and submit to 4clojure when you are done.<br />
It&#8217;s on <a href="https://github.com/thattommyhall/offline-4clojure" target="_blank">Github</a>, probably more useful for the harder ones. </p>
<p>As an example, below is my soln to #73 using it, I can run it with<br />
# lein run -m offline-4clojure.p73<br />
<script src="https://gist.github.com/4075632.js"></script><noscript><pre><code class="language-clojure clojure">; Analyze a Tic-Tac-Toe Board - Hard
; A &lt;a href=&quot;http://en.wikipedia.org/wiki/Tic-tac-toe&quot;&gt;tic-tac-toe&lt;/a&gt; 
; board is represented by a two dimensional vector. 
; X is represented by :x, O is represented by :o, and empty is represented by :e.  
; A player wins by placing three Xs or three Os in a horizontal, vertical, or diagonal row.  
; Write a function which analyzes a tic-tac-toe board and returns :x if X has won, :o if O has won, and nil if neither player has won.
; tags - game
; restricted - 
(ns offline-4clojure.p73
  (:use clojure.test))

(def __
(fn [board]
  (let [triples
        (fn [board]
          (map #(map (partial get-in board) %)
               (concat
                (for [x [0 1 2]]
                  [[x 0] [x 1] [x 2]])
                (for [y [0 1 2]]
                  [[0 y] [1 y] [2 y]]) 
                [[[0 0] [1 1] [2 2]]
                 [[0 2] [1 1] [2 0]]])))]
    (ffirst (filter #(or (= [:o :o :o] %)
                         (= [:x :x :x] %))
                    (triples board)))))

)

(defn -main []
  (are [x] x
(= nil (__ [[:e :e :e]
            [:e :e :e]
            [:e :e :e]]))
(= :x (__ [[:x :e :o]
           [:x :e :e]
           [:x :e :o]]))
(= :o (__ [[:e :x :e]
           [:o :o :o]
           [:x :e :x]]))
(= nil (__ [[:x :e :o]
            [:x :x :e]
            [:o :x :o]]))
(= :x (__ [[:x :e :e]
           [:o :x :e]
           [:o :e :x]]))
(= :o (__ [[:x :e :o]
           [:x :o :e]
           [:o :e :x]]))
(= nil (__ [[:x :o :x]
            [:x :o :x]
            [:o :x :o]]))))</code></pre></noscript></p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2012/11/14/solving-4clojure-problems-offline-in-emacs/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2012/11/14/solving-4clojure-problems-offline-in-emacs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>101 Goals In 1001 Days &#8211; Retrospective</title>
		<link>http://www.thattommyhall.com/2012/10/26/101retrospective/</link>
		<comments>http://www.thattommyhall.com/2012/10/26/101retrospective/#comments</comments>
		<pubDate>Fri, 26 Oct 2012 22:02:52 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[101]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=786</guid>
		<description><![CDATA[Well, I guess this could be considered an early 2012 retrospective as this is my first blog post this year (so much for the goal of doing one a week, a goal I am not sure is actually all that worthy to be honest) Firstly, about the 101 goals in 1001 days. I am so [...]]]></description>
				<content:encoded><![CDATA[<p>Well, I guess this could be considered an early 2012 retrospective as this is my first blog post this year (so much for the goal of doing one a week, a goal I am not sure is actually all that worthy to be honest)</p>
<p>Firstly, about the 101 goals in 1001 days. I am so glad I did it, just the act of thinking about what you want to achieve is worthwhile, putting a time limit on it so it&#8217;s not a bucket list for someday but a list of things you are seriously going to try achieve in a few years. The 1001 days is interesting, short enough to feel some pressure but long enough to have a few of each season for anything that is time sensitive.<br />
I think I was a bit ambitious with my list, though I always knew it was a reach I probably bit off more than I could chew. That said the list was formed when I was single and freelance and I would not swap either the last few years at my job (still at <a href="http://forwardtechnology.co.uk/">Forward</a>) or with Petra for a few more goals ticked.</p>
<p>Before I go through them all I just want to say the most transformative thing of the whole 1001 days has been this year, in particular running and the impact it has had on my fitness.<br />
When I talked about the 101 goals lots of people got excited but everyone kind of did a double take when they saw I was doing a marathon, I think they did not believe I could (and I can&#8217;t blame them, I&#8217;ve never been super-fit and was in my worst shape ever). I started in Jan with the NHS <a href="http://www.nhs.uk/LiveWell/c25k/Pages/couch-to-5k.aspx" target="_blank">Couch to 5k</a> and then an excellent training schedule provided by Oxfam as I was entered into Edinburgh for them in May. I trained really hard for it as you can tell from the runkeeper stats, 88,365 calories &#8211; 592.2 miles and active for nearly 6 days in total!<br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2012/10/jan-may.png"><img src="http://www.thattommyhall.com/wp-content/uploads/2012/10/jan-may.png" alt="" title="jan-may" width="800" height="" class="alignleft size-medium wp-image-789" /></a><br />
The purple in May is when I started biking after not having a bike for 15 years or so and unfortunately I came off it a few days before the marathon and broke my arm and dislocated my shoulder. I was so ready and had raised so much for Oxfam that I thought I had to do it so (after being dissuaded from duct taping my arm still) I decided to walk it, and finished just in time for medals!<br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2012/10/justgiving-edinburgh.png"><img src="http://www.thattommyhall.com/wp-content/uploads/2012/10/justgiving-edinburgh.png" alt="" title="justgiving-edinburgh" width="800" class="alignleft size-full wp-image-793" /></a><br />
<a href="http://www.flickr.com/photos/thattommyhall/7939583614/" title="IMG_0796.JPG by thattommyhall, on Flickr"><img src="http://farm9.staticflickr.com/8035/7939583614_7204ee828f_c.jpg" width="800" height="534" alt="IMG_0796.JPG"></a><br />
<a href="http://www.flickr.com/photos/thattommyhall/7939631126/" title="IMG_0841.JPG by thattommyhall, on Flickr"><img src="http://farm9.staticflickr.com/8441/7939631126_2b26285996_c.jpg" width="800" height="534" alt="IMG_0841.JPG"></a><br />
<a href="http://www.flickr.com/photos/thattommyhall/7939688788/" title="IMG_0878.JPG by thattommyhall, on Flickr"><img src="http://farm9.staticflickr.com/8295/7939688788_e4be2ed3f0_c.jpg" width="534" height="800" alt="IMG_0878.JPG"></a></p>
<p>So that went well but I was unable to train for quite a while and missed the chance of doing a triathlon this year.</p>
<p>I used my new fitness level to try and climb every 3000ft mountain in Wales in a continuous walk on a weekend when a months worth of rain fell in a day and we had 40mph winds, managed 11 of them.<br />
<a href="http://www.flickr.com/photos/thattommyhall/7936265166/" title="2012-08-25 08.45.08.jpg by thattommyhall, on Flickr"><img src="http://farm9.staticflickr.com/8296/7936265166_456d94e642_c.jpg" width="800" height="600" alt="2012-08-25 08.45.08.jpg"></a><br />
<a href="http://www.flickr.com/photos/thattommyhall/7936268428/" title="2012-08-26 12.44.28.jpg by thattommyhall, on Flickr"><img src="http://farm9.staticflickr.com/8454/7936268428_9f5da9537e_c.jpg" width="800" height="600" alt="2012-08-26 12.44.28.jpg"></a><br />
<a href="http://www.flickr.com/photos/thattommyhall/7936279266/" title="2012-08-26 16.58.45.jpg by thattommyhall, on Flickr"><img src="http://farm9.staticflickr.com/8034/7936279266_62db12a3b1_c.jpg" width="800" height="600" alt="2012-08-26 16.58.45.jpg"></a></p>
<p>After going on a safari in Kenya with Petra, my sister Carrie and my Mum (which Carrie captures <em>perfectly</em> <a href="http://carriehall.posterous.com/goal-complete-go-on-safari" target="_blank">here</a> I met my friend Colin (who I have known since the first day of primary school, actually not the only friend I can say that of I am lucky to have a few) in tanzania and we climbed Kilimanjaro. It was the hardest thing I have ever done, but not in a satisfying way, the typical kili trip does not allow enough time to acclimatize and your resistance to altitude is largely genetic and it&#8217;s quite a dirty and busy mountain. Glad I did it? Yeah, proved I have some serious resolve. Would I recommend? No, there are nicer challenges that reward preperation more and are cleaner and more beautiful. Maybe I should say more but a portered trip walking only 5h a day and going too high too quickly does not compare to the Alps or even UK hill days. Maybe it&#8217;s still too soon and retrospective pleasure has not kicked in yet but I am sure I&#8217;ll stand by it.<br />
<a href="http://www.flickr.com/photos/thattommyhall/8125814815/" title="SAM_1389.JPG by thattommyhall, on Flickr"><img src="http://farm9.staticflickr.com/8326/8125814815_54566cbccc_c.jpg" width="800" height="600" alt="SAM_1389.JPG"></a><br />
<a href="http://www.flickr.com/photos/thattommyhall/8125851460/" title="SAM_1405.JPG by thattommyhall, on Flickr"><img src="http://farm9.staticflickr.com/8196/8125851460_401fcda997_c.jpg" width="800" height="600" alt="SAM_1405.JPG"></a></p>
<p>The week after I did the Liverpool marathon too, basically I thought it was a toss-up between the red blood cells from kili and a twisted ankle how well I would do but in the end I had just not got enough long runs in and my quads packed in at 22 miles and I needed to walk a bit.<br />
Me and Carrie, who apparantly <a href="http://carriehall.posterous.com/goal-complete-run-a-marathon" target="_blank">I inspired to enter the marathon</a> (though she beat me by 15 mins!)<br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2012/10/lpool-carrie.jpg"><img src="http://www.thattommyhall.com/wp-content/uploads/2012/10/lpool-carrie-613x1024.jpg" alt="" title="lpool-carrie" width="800" class="alignleft size-large wp-image-806" /></a><br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2012/10/lpool-finish.jpg"><img src="http://www.thattommyhall.com/wp-content/uploads/2012/10/lpool-finish-1024x673.jpg" alt="" title="lpool-finish" width="800" class="alignleft size-large wp-image-807" /></a><br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2012/10/lpool-bwcaa.jpg"><img src="http://www.thattommyhall.com/wp-content/uploads/2012/10/lpool-bwcaa-1024x768.jpg" alt="" title="lpool-bwcaa" width="800" class="alignleft size-large wp-image-805" /></a><br />
The founding members of the Bread Wine and Cheese Athletics association crossing the line together then finishing the goodies we took along with us.</p>
<p>I&#8217;m still raising money at <a href="http://www.justgiving.com/tommys-final-push" target="_blank">justgiving.com/tommys-final-push</a> for WarChild. All money donated is doubled by Forward next week so every penny counts twice!<br />
<a href="http://www.justgiving.com/tommys-final-push"><img src="http://www.thattommyhall.com/wp-content/uploads/2012/10/finalpush.png" alt="" title="finalpush" width="866" height="226" class="alignleft size-full wp-image-822" /></a></p>
<p>So, smashing it this year but how did I do overall? Dayzero has me on <a href="http://dayzeroproject.com/user/thattommyhall/list/3" target="_blank">42 complete</a>. I am quite pleased but have decided to extend to the end of the year and try and tick a few more off, not least so I can have a finishing party. My goals, my rules after all <img src='http://www.thattommyhall.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>I will be doing another 101 goals, building up to swimming the Helespont and doing an ironman (quite a reach as I can&#8217;t swim at the moment!)</p>
<p>What would I change? Blog more about it, involve more people, have as much drive as I had this year for the whole period.</p>
<p>I am really please to have encouraged half a dozen others to start lists.</p>
<p><strong>Done (42)</strong><br />
1, Teetotalitarianism for 3 months<br />
2, Cheeseless for 3 months<br />
9, Read GEB<br />
11, Reread all Dennett books<br />
15, Proofread for Project Gutenberg<br />
48, Create a Backblaze storage pod<br />
53, Make Jam<br />
66, Via Ferrata in Italy<br />
78, Learn to use Emacs<br />
82, Visit Egypt<br />
83, Re-visit Louvre<br />
85, Visit Pergamon Museum<br />
86, Give Carrie a British Museum Tour<br />
92, Read “An Ode Less Travelled“, do the exercises (but not share them!)<br />
97, Be 1/3 through in 2010<br />
100, Set success criteria / progression metrics for each goal<br />
5, Lose 2 stone<br />
10, Write book reviews for each book I read\<br />
76, Do on average 1 Project Euler problem per week<br />
88, Go to the theatre on average once a month<br />
101, Do 100 day updates<br />
44, Visit The Uffizi in Florence (was Get CCEE)<br />
61, Do a UK long distance path<br />
3, Do a marathon<br />
21, Read GTD<br />
24, Swim with sharks<br />
73, Make a Dots and Boxes program<br />
79, Raise £5005 for charity<br />
39, Take Mum, Dad and Carrie to the Welsh Mountain Zoo<br />
56, Make beer<br />
51, Investigate Visa situation for Australia<br />
52, Investigate Visa situation for US<br />
54, Grow mushrooms<br />
32, Bungee Jump<br />
34, Vineyard tour<br />
96, Let loans run course and don&#8217;t get any more<br />
64, Climb a continental highest mountain<br />
33, Safari<br />
20, Organise a big bash for my 30th<br />
84, Revisit Met Museum<br />
28, Drive Off Road<br />
31, Hire the whole of Salvos Salumeria for an evening</p>
<p><strong>Attempting before Christmas (23)</strong><br />
13, Release 303 books on bookcrossing.com<br />
68, Complete Pimsleur German<br />
72, Read “Winning Ways”<br />
74, Read AI: A Modern Approach<br />
75, Watch SICP, do exercises from book<br />
77, Complete “Real World Haskell”<br />
91, Memorise 10 poems<br />
46, Listen to Radio 4 / British Museum – A History of the World in 100 Objects and view each of them (was Get VCAP)<br />
89, Return to the Theatre by the lake<br />
7, Write an article for Plus new writers<br />
14, Read a short story for librivox<br />
16, Send Dennett a letter<br />
17, Send Dawkins a letter<br />
18, Read Joyce<br />
23, Organise all my DVDs<br />
38, Take dad to an opera<br />
58, Cook a 4 course meal for 20 friends<br />
55, Paint a watercolor<br />
57, Make wine<br />
71, Learn 10 magic tricks<br />
80, Talk about Free Software at a school<br />
87, Go on wine tasting course<br />
99, Have a completion party</p>
<p><strong>Abandoned / Failed (36) </strong><br />
67, Do another alpine 4000m peak<br />
19, Blog on average once a week<br />
50, Move 10 people to FreeAgent<br />
95, Pay off all credit cards<br />
8, Read all the VSIs<br />
12, Read all PG Wodehouse<br />
81, Watch all TTC Art history DVDs<br />
90, See all world heritage sites in the UK<br />
43, Visit the rijksmuseum (was Get CCNP)<br />
45, Give blood every 20 weeks (was Get MCITP – Enterprise Admin)<br />
47, Make a Munro bagging site in Rails (was Say to a recruiter “I dont work ” and turn down work)<br />
60, Hike on average once a month<br />
62, Do a big hike in Europe<br />
35, Visit 5 Michelin 3* restaurants<br />
37, Visit porto<br />
94, Go to Edinburgh festival<br />
4, Do a triathlon<br />
6, Attend martial arts classes for 3 months<br />
22, Spend 3 months in another country<br />
25, Paraglide<br />
26, Learn to play bongos<br />
27, Skydive<br />
29, Do a banger rally<br />
30, Have a track day<br />
36, See Northern Lights<br />
40, Do 1000 things in London<br />
41, Do a standup comedy course<br />
42, Visit Japan<br />
49, Work only 100 days in a year<br />
59, Do a photography course<br />
63, Attend NIM<br />
69, Learn to dance<br />
70, Learn to play golf<br />
93, Go to Melbourne Comedy Festival<br />
65, Volunteer for the mountain bothies association<br />
98, Have done 2/3 by day 666</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2012/10/26/101retrospective/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2012/10/26/101retrospective/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Forward Vegas 2011</title>
		<link>http://www.thattommyhall.com/2012/01/08/forward-vegas-2011/</link>
		<comments>http://www.thattommyhall.com/2012/01/08/forward-vegas-2011/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 11:42:23 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[travel]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=772</guid>
		<description><![CDATA[One again Forward took all its staff to Las Vegas for the Christmas party, cheers Neil! We stayed at the Wynn again. Beautiful view from my room On the first day we went carting. The final day I went to do a skyjump off the Stratosphere (have a DVD I&#8217;ll upload when I find it) [...]]]></description>
				<content:encoded><![CDATA[<p>One again Forward took all its staff to Las Vegas for the Christmas party, cheers Neil!</p>
<p>We stayed at the Wynn again.<br />
<a href="http://www.flickr.com/photos/thattommyhall/6593575777/" title="IMAG0171.jpg by thattommyhall, on Flickr"><img src="http://farm8.staticflickr.com/7001/6593575777_4233933ed9_z.jpg" width="640" height="383" alt="IMAG0171.jpg"></a></p>
<p>Beautiful view from my room<br />
<a href="http://www.flickr.com/photos/thattommyhall/6593572247/" title="IMAG0163.jpg by thattommyhall, on Flickr"><img src="http://farm8.staticflickr.com/7167/6593572247_a24d4ce8b4_z.jpg" width="640" height="383" alt="IMAG0163.jpg"></a></p>
<p>On the first day we went carting.<br />
<a href="http://www.flickr.com/photos/thattommyhall/6593571835/" title="IMAG0162.jpg by thattommyhall, on Flickr"><img src="http://farm8.staticflickr.com/7160/6593571835_ccbfa9f464_z.jpg" width="640" height="383" alt="IMAG0162.jpg"></a></p>
<p>The final day I went to do a skyjump off the Stratosphere (have a DVD I&#8217;ll upload when I find it)<br />
<a href="http://www.flickr.com/photos/thattommyhall/6593573621/" title="IMAG0166.jpg by thattommyhall, on Flickr"><img src="http://farm8.staticflickr.com/7027/6593573621_d46a8f09b0_z.jpg" width="383" height="640" alt="IMAG0166.jpg"></a><br />
<a href="http://www.flickr.com/photos/thattommyhall/6593575417/" title="IMAG0170.jpg by thattommyhall, on Flickr"><img src="http://farm8.staticflickr.com/7005/6593575417_34eec4a941_z.jpg" width="640" height="383" alt="IMAG0170.jpg"></a></p>
<p>Between that some drinking and gambling&#8230;</p>
<p>Random head coming out of the lake in the Wynn<br />
<a href="http://www.flickr.com/photos/thattommyhall/6593576049/" title="IMAG0172.jpg by thattommyhall, on Flickr"><img src="http://farm8.staticflickr.com/7007/6593576049_ca8e5ec96b_z.jpg" width="640" height="383" alt="IMAG0172.jpg"></a></p>
<p>Then home!</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2012/01/08/forward-vegas-2011/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2012/01/08/forward-vegas-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Day 700 of 101 goals in 1001 days</title>
		<link>http://www.thattommyhall.com/2011/12/22/day-700/</link>
		<comments>http://www.thattommyhall.com/2011/12/22/day-700/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 15:44:53 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[101]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=762</guid>
		<description><![CDATA[This update is late as I have been busy. 84 &#8211; Revisit Met Museum Went while I was at Hadoop World (pic is actually the Natural History museum but what the hell) During my recent Africa Trip: 24 &#8211; Swim with sharks 33 &#8211; Safari Visited Addo Elephant Park during my recent South Africa Trip [...]]]></description>
				<content:encoded><![CDATA[<p>This update is late as I have been busy.</p>
<p><strong>84 &#8211; Revisit Met Museum</strong><br />
Went while I was at Hadoop World (pic is actually the Natural History museum but what the hell)<br />
<a href="http://www.flickr.com/photos/thattommyhall/6554507049/" title="IMAG0110 by thattommyhall, on Flickr"><img src="http://farm8.staticflickr.com/7018/6554507049_256e46c2a9_z.jpg" width="383" height="640" alt="IMAG0110"></a><br />
During my recent Africa Trip:<br />
<strong>24 &#8211; Swim with sharks</strong><br />
<a href="http://www.flickr.com/photos/thattommyhall/6454747759/" title="IMG_7285.JPG by thattommyhall, on Flickr"><img src="http://farm8.staticflickr.com/7168/6454747759_c021578cee_z.jpg" width="640" height="480" alt="IMG_7285.JPG"></a><br />
<strong>33 &#8211; Safari</strong><br />
Visited <a href="http://www.addoelephant.com/parks/addo/">Addo Elephant Park</a> during my recent South Africa Trip<br />
<a href="http://www.flickr.com/photos/thattommyhall/6459069725/" title="DSC00594.JPG by thattommyhall, on Flickr"><img src="http://farm8.staticflickr.com/7168/6459069725_8f49012b77_z.jpg" width="640" height="480" alt="DSC00594.JPG"></a><br />
<strong>34 &#8211; Vinyard tour</strong><br />
I visited the <a href="http://www.boekenhoutskloof.co.za/">boekenhoutskloof</a> vinyard in Franschhoek South Africa<br />
<a href="http://www.flickr.com/photos/thattommyhall/6459115581/" title="DSC00659.JPG by thattommyhall, on Flickr"><img src="http://farm8.staticflickr.com/7022/6459115581_cdc1a2bc5c_z.jpg" width="640" height="480" alt="DSC00659.JPG"></a><br />
I&#8217;ll do a full write-up of the Africa Trip soon, it was amazing.</p>
<p>So now out of the 101 I have done 24 with 18 on track and only 300 days to go! Need to get a shift on and tick off as much as I can.</p>
<p>The dayzeroproject site is back up, I am on there as <a href="http://dayzeroproject.com/user/thattommyhall" target="_blank">thattommyhall</a></p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2011/12/22/day-700/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2011/12/22/day-700/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Reith Lecture by Aung San Suu Kyi</title>
		<link>http://www.thattommyhall.com/2011/06/28/reith-lecture-by-aung-san-suu-kyi/</link>
		<comments>http://www.thattommyhall.com/2011/06/28/reith-lecture-by-aung-san-suu-kyi/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 15:59:21 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[random]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=748</guid>
		<description><![CDATA[Today I woke up to Radio4 as usual and was surprised to hear this years Reith Lecture by Aung San Suu Kyi on Securing Freedom. Very interesting, looking forward to hearing the remainder The archive is available and I thought I would share my highlights: Vilayanur Ramachandran: The Emerging Mind was the first one I [...]]]></description>
				<content:encoded><![CDATA[<p>Today I woke up to Radio4 as usual and was surprised to hear this years Reith Lecture by Aung San Suu Kyi on <a href="http://www.bbc.co.uk/programmes/b0126d29">Securing Freedom</a>. Very interesting, looking forward to hearing the remainder</p>
<p>The archive is available and I thought I would share my highlights:</p>
<ul>
<li><a href="http://www.bbc.co.uk/programmes/p00ghvck">Vilayanur Ramachandran: The Emerging Mind</a> was the first one I ever listened to, great peek into how the brain works</li>
<li><a href="http://www.bbc.co.uk/programmes/p00gmx4c">Edward Said: The representation of the Intellectual</a></li>
<li><a href="http://www.bbc.co.uk/programmes/p00gq1fk">John Searle: Minds Brains And Science</a>. I dont agree with Searle but find him very engaging and thought provoking.</li>
<li><a href="http://www.bbc.co.uk/programmes/p00h9lz3">Bertrand Russell: Authority and the Individual.</a> The first Reith lecture was by a personal hero.</li>
</ul>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2011/06/28/reith-lecture-by-aung-san-suu-kyi/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2011/06/28/reith-lecture-by-aung-san-suu-kyi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Walking The Great Glen Way</title>
		<link>http://www.thattommyhall.com/2011/06/26/walking-the-great-glen-way/</link>
		<comments>http://www.thattommyhall.com/2011/06/26/walking-the-great-glen-way/#comments</comments>
		<pubDate>Sun, 26 Jun 2011 21:22:53 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[101]]></category>
		<category><![CDATA[hiking]]></category>
		<category><![CDATA[scotland]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=731</guid>
		<description><![CDATA[Over Easter, while we had all the extra days off because some chinless wonder married a model in an old church in London I went with two of my best friends and walked the 73 miles from Inverness to Fort William along the Caledonian Canal. (picture from Wikipedia) We did it ultralight, using kit I [...]]]></description>
				<content:encoded><![CDATA[<p>Over Easter, while we had all the extra days off because some chinless wonder married a model in an old church in London I went with two of my best friends and walked the 73 miles from Inverness to Fort William along the Caledonian Canal.</p>
<p><a href="http://www.thattommyhall.com/wp-content/uploads/2011/06/500px-Great_Glen_Way_map-en.svg_.png"><img src="http://www.thattommyhall.com/wp-content/uploads/2011/06/500px-Great_Glen_Way_map-en.svg_.png" alt="" title="500px-Great_Glen_Way_map-en.svg" width="500" height="674" class="alignleft size-full wp-image-732" /></a><br />
(picture from <a href="http://en.wikipedia.org/wiki/Great_Glen_Way">Wikipedia</a>)</p>
<p>We did it ultralight, using kit I have <a href="http://www.thattommyhall.com/2008/06/15/summer-fun/">blogged about before</a>. My mate Ben got well into expedition planning mode and prepared an optimal food mix for the trip and introduced us to <a href="http://">SCROGIN</a> (Sultanas Chocolate Raisons Orange Ginger Imagination Nuts)  and <a href="http://en.wikipedia.org/wiki/ANZAC_biscuit">ANZAC biscuits</a> (his lovely other half is a kiwi).<br />
<a href="http://www.flickr.com/photos/thattommyhall/5701461234/" title="IMAG0005.jpg by thattommyhall, on Flickr"><img src="http://farm3.static.flickr.com/2010/5701461234_b4670f3e59.jpg" width="500" height="299" alt="IMAG0005.jpg"></a><a href="http://www.flickr.com/photos/thattommyhall/5700892919/" title="IMAG0006.jpg by thattommyhall, on Flickr"><img src="http://farm6.static.flickr.com/5269/5700892919_3e04b42a3c.jpg" width="299" height="500" alt="IMAG0006.jpg"></a><br />
I was pleased to fit it all in a 30L sack, made the walking much easier than it might have been.</p>
<p>As I had just been in Lisbon for a stag do the weekend before I was not feeling 100% when we got the sleeper to Inverness on the Monday night but we arrived somewhat fresh and started walking immediatly. The sleeper is really nice and I would deffinatly recommend it over flying if you need an early start in Scotland, see <a href="http://www.scotrail.co.uk/caledoniansleeper/index.html">ScotRail</a>. By the end of Tuesday we had got most of the way to Invermoriston (nearly 30 miles) but were all exhausted. We wildcamped with some stunning views.<br />
<a href="http://www.flickr.com/photos/thattommyhall/5700894217/" title="IMAG0007.jpg by thattommyhall, on Flickr"><img src="http://farm3.static.flickr.com/2255/5700894217_273fb005d1_z.jpg" width="640" height="383" alt="IMAG0007.jpg"></a></p>
<p>The Wednesday we walked to Fort Augustus and decided to take a B&#038;B for the night as non of us had slept well and our legs and feet were killing. We were fortunate enough to stay at <a href="http://www.oldpierhouse.com/">Old Pier House</a> which was lovely and we got moving again on the Thursday with much more enthusiasm than we ended the day before. </p>
<p>Thursday night we got past laggan and camped at a campsite on the north of Loch Lochy.<br />
<a href="http://www.flickr.com/photos/thattommyhall/5701465328/" title="IMAG0008.jpg by thattommyhall, on Flickr"><img src="http://farm6.static.flickr.com/5150/5701465328_538f5d8b8f_z.jpg" width="640" height="383" alt="IMAG0008.jpg"></a></p>
<p>Friday was an epic day, taking in the 2 munros ( <a href="http://en.wikipedia.org/wiki/Meall_na_Teanga">Meall na Teanga</a> and <a href="http://en.wikipedia.org/wiki/Sr%C3%B2n_a%27_Choire_Ghairbh">Sròn a&#8217; Choire Ghairbh</a> and walking about 25 miles then (we thought) finishing the walk. </p>
<p>We had actually just reached <a href="http://en.wikipedia.org/wiki/Neptune%27s_Staircase">Neptune&#8217;s Staircase</a> and we wound up bivvying at the start line of <a href="http://www.maggiescentres.org/eventsfundraising/events/monsterhike/about.html">Maggies Monster Bike and Hike</a>. We must have looked quite odd&#8230;</p>
<p>We spent the first few hours of the Saturday finishing it off and arriving at Fort William where we ate the biggest amount of food we could.</p>
<p><a href="http://www.flickr.com/photos/thattommyhall/5700897633/" title="IMAG0009.jpg by thattommyhall, on Flickr"><img src="http://farm6.static.flickr.com/5107/5700897633_06e77c3546_z.jpg" width="640" height="383" alt="IMAG0009.jpg"></a></p>
<p>A great hike with 2 great guys and as it is a UK long distance path it is another of my <a href="http://www.thattommyhall.com/category/101/">101 goals in 1001 days</a> days ticked off</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2011/06/26/walking-the-great-glen-way/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2011/06/26/walking-the-great-glen-way/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Berlin Buzzwords</title>
		<link>http://www.thattommyhall.com/2011/06/09/berlin-buzzwords/</link>
		<comments>http://www.thattommyhall.com/2011/06/09/berlin-buzzwords/#comments</comments>
		<pubDate>Thu, 09 Jun 2011 12:07:50 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[conf]]></category>
		<category><![CDATA[hadoop]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=717</guid>
		<description><![CDATA[I have just returned from Berlin Buzzwords. It was a great conference and well organised so thanks to the organisers. As all the talks will be online soon I will just mention a few things that I enjoyed. The two keynotes were excellent, Doug Cutting on the history of Hadoop and Ted Dunning on the [...]]]></description>
				<content:encoded><![CDATA[<p>I have just returned from Berlin Buzzwords. It was a great conference and well organised so thanks to the organisers.</p>
<p>As all the talks will be online soon I will just mention a few things that I enjoyed.</p>
<p>The two keynotes were excellent, Doug Cutting on the history of Hadoop and Ted Dunning on the future. Both were very interesting and had a great feel for the community aspect of Open Source software. Ted works for <a href="http://www.mapr.com/">MapR technologies</a> but the talk was not a sales pitch. Ted spoke about how Hadoop fails currently to get the most out of the components and what we might get if we could. MapR are used by EMC for their new Hadoop distro, among other things I think they have reimplemented HDFS. An interesting number of companies had got some pretty big amounts of funding to build front-ends to Hadoop, <a href="http://www.datameer.com/">DataMeer</a> have an excel-like web frontend that looks interesting.</p>
<p>Talks I enjoyed were:</p>
<p><a href="http://berlinbuzzwords.de/content/nodejs-heavy-io">NODE.JS FOR HEAVY I/O</a><br />
A superb intro to Node.js, with an example small enough to fit on a slide but not completely trivial.</p>
<p><a href="http://berlinbuzzwords.de/content/time-series-or-causal-analysis-without-limits">TIME SERIES OR CAUSAL ANALYSIS WITHOUT LIMITS!</a><br />
Shivek was awesome, engaging and enthusiastic. The topic itself was fascinating, using<br />
<a href="http://en.wikipedia.org/wiki/%CE%A0-calculus">Pi Calculus</a> to reason about and design map/reduce algorithms. He made the point that most Hadoop jobs are datacentric but showed how to do some more mathscentric algorithms like FFTs</p>
<p><a href="http://berlinbuzzwords.de/content/oh-leonhard-where-art-thou">OH LEONHARD, WHERE ART THOU?</a><br />
Jim Webber on graph databases in general and <a href="http://neo4j.org/">Neo4J</a> in particular. Quite a nice reference to Euler in the title. If your data is a graph, why not have a database that is too?</p>
<p><a href="http://berlinbuzzwords.de/content/realtime-big-data-facebook-hadoop-and-hbase">REALTIME BIG DATA AT FACEBOOK WITH HADOOP AND HBASE</a><br />
From  Jonathan Gray, this talk was really interesting &#8211; amazing the throughput they are getting from HBase. I think Forward are more like Facebook than Google (more freedom within teams, choice of tech/roll your own vs Google wanting everything on BigTable. I cringed a bit at the thought of loads of servers running random C++ apps all over the place though&#8230;)</p>
<p><a href="http://berlinbuzzwords.de/content/newer-developments-large-data-techniques">NEWER DEVELOPMENTS IN LARGE DATA TECHNIQUES</a><br />
Joseph Turian from <a href="http://metaoptimize.com/">MetaOptimise</a> gave a great overview of recent academic work on Machine Learning and Natural LAnguage Processing, buzzwords to look out for are: Deep Learning, Semantic Hashing and Semantic Parsing. Also look at <a href="http://www.graphlab.ml.cmu.edu/">GraphLab</a>, Machine Learning on graph databases</p>
<p><a href="http://berlinbuzzwords.de/content/digitised-dutch-cultural-heritage-mahout-hadoop">DIGITISED DUTCH CULTURAL HERITAGE, MAHOUT &#038; HADOOP</a><br />
<a href="http://berlinbuzzwords.de/content/composing-mahout-clustering-jobs">COMPOSING MAHOUT CLUSTERING JOBS</a><br />
Two good talks on using Mahout, the first is on a Dutch Gov project, <a href="http://imagesforthefuture.com/en/project">Images for the future</a> to archive and categorise AV heritage resources. The second had a nice demo of categorising stack-overflow.</p>
<p>Lightning Talks:<br />
The Lustre filesystem from Eric Barton of <a href="http://www.whamcloud.com/">Whamcloud</a> talked about how his company are developing Lustre outside Sun/Oracle and he was trying to see where it could fit in with Hadoop. Luster is the other end of the spectrum from HDFS/Hadoop, really quick but assuming fast, highly available storage behind it. I would love to see some integration with <a href="http://wiki.lustre.org/index.php/Main_Page">Lustre</a> or <a href="http://ceph.newdream.net/">Ceph</a> in a Hadoop-like system.</p>
<p>I gave a talk on the Flume Firehose Abs and I made at Forward last week, it was OK (though I still think no-one has done a good job of selling ZeroMQ in 10 minutes!). Slides are <a href="http://tinyurl.com/tthbbuzz">here</a> (I&#8217;ll do another post about it as well, quite an entertaining fallout from it over twitter.)</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2011/06/09/berlin-buzzwords/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2011/06/09/berlin-buzzwords/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Compressing Text Tables In Hive</title>
		<link>http://www.thattommyhall.com/2011/06/01/compressing-text-tables-in-hive/</link>
		<comments>http://www.thattommyhall.com/2011/06/01/compressing-text-tables-in-hive/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 10:29:36 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[hadoop]]></category>
		<category><![CDATA[hive]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=690</guid>
		<description><![CDATA[At Forward we have been using Hive for a while and started out with the default table type (uncompressed text) and wanted to see if we could save some space and not lose too much performance. The wiki page HiveCompressedStorage lists the possibilities. Basically you have 3 decisions: TextFile or SequenceFile tables TextFile Can be [...]]]></description>
				<content:encoded><![CDATA[<p>At Forward we have been using Hive for a while and started out with the default table type (uncompressed text) and wanted to see if we could save some space and not lose too much performance.</p>
<p>The wiki page <a href="http://wiki.apache.org/hadoop/Hive/CompressedStorage">HiveCompressedStorage</a> lists the possibilities. </p>
<p>Basically you have 3 decisions:<br />
<strong>TextFile or SequenceFile tables</strong><br />
TextFile</p>
<ul>
<li>Can be compressed in place. </li>
<li>Can gzip/bzip before you LOAD DATA into your table</li>
<li>Only gzip/bzip are supported</li>
<li>Gzip is not splitable</li>
</ul>
<p>SequenceFile</p>
<ul>
<li>Need to create a SequenceFile table and do a SELECT/INSERT into it</li>
<li>Can use any supported compression codec</li>
<li>All compression codecs are splitable. All the cool kids use <a href="https://github.com/toddlipcon/hadoop-lzo">LZO</a> or <a href="http://code.google.com/p/hadoop-snappy/">Snappy</a></li>
<li><strong>Does not work</strong>- At least <a href="http://mail-archives.apache.org/mod_mbox/hive-user/201105.mbox/%3CBANLkTim_VG92dnG+fxC89NTSKAJBVvKgMw@mail.gmail.com%3E">for me</a> (help appreciated!)</li>
</ul>
<p><strong>Which compression algorithm</strong></p>
<ul>
<li>gzip &#8211; Quite slow, good compression, not splitable, supported in TextFile table</li>
<li>bzip &#8211; Slowest, best compression, splitable, supported in TextFile table</li>
<li><a href="https://github.com/toddlipcon/hadoop-lzo">LZO</a> &#8211; Not in standard distro (licensing issues), fast, splitable</li>
<li><a href="http://code.google.com/p/hadoop-snappy/">Snappy</a> &#8211; New from google, Not in standard distro (but licence compatable), Very fast </li>
</ul>
<p><strong>Block or Record compression (for SequenceFile tables) </strong><br />
The docs say </p>
<blockquote><p>The value for io.seqfile.compression.type determines how the compression is performed. If you set it to RECORD you will get as many output files as the number of map/reduce jobs. If you set it to BLOCK, you will get as many output files as there were input files. There is a tradeoff involved here &#8212; large number of output files => more parellel map jobs => lower compression ratio.</p></blockquote>
<p>But I got the same number of files regardless of what I selected and the total size suggested they were not even compressed so I dont know what is going on. </p>
<p>For simplicity I chose gziped TextFile tables because</p>
<ul>
<li>It worked (always criteria zero)</li>
<li>Most of our files were not huge anyway and the technique described below keeps some of the parallelism</li>
<li>Can be done on the table in place</li>
<li>Each partition can be compressed separately </li>
<li>The space is saved incrementally and realised immediately </li>
<li>Testing showed for our load it was not much of a performance hit</li>
<li>We are feeling more pain on space than query performance at the moment, our hourly runs complete in ~20mins)</li>
</ul>
<p><script src="https://gist.github.com/1000863.js"></script><noscript><pre><code class="language-ruby ruby">require 'rubygems'
require 'date'
require 'rbhive'

countrys = %w[at au br de dk es fr in it jp mx nl no pl pt ru se uk us za]
dates = (Date.parse('2011-01-01')..Date.parse('2011-04-30'))

RBHive.connect('hiveserver') do |con|
  dates.each do |date|
    countrys.each do |country|
      query = &quot;insert overwrite table keywords partition (dated='#{date}', country = '#{country}')
              select account,campaign,ad_group,keyword_id,keyword,match_type,status,
              first_page_bid,quality_score,distribution,max_cpc,destination_url,ad_group_status,
              campaign_status,currency_code,impressions,clicks,ctr,cpc,
              cost,avg_position,account_id,campaign_id,adgroup_id 
              from keywords where dated='#{date}' and country='#{country}'&quot;
      begin
        con.set('mapred.output.compression.codec','org.apache.hadoop.io.compress.GzipCodec')
        con.set('hive.exec.compress.output','true')
        con.set('mapred.output.compress','true')
        con.set('mapred.compress.map.output','true')
        con.set('hive.merge.mapredfiles','true')
        con.set('hive.merge.mapfiles','true')
        con.execute(query)
      rescue =&gt; e
        puts &quot;#########################&quot;
        puts e.message
        puts &quot;#########################&quot;
      end
    end
  end 
end 
</code></pre></noscript><br />
This will loop through the partitions (date/country) and do an INSERT OVERWRITE from/to that partition using our <a href="https://github.com/forward/rbhive">rbhive</a> gem. This is good because Hive reads the old data via map/reduce jobs, writes the output to /tmp, deletes the old folder and then imports the new compressed version. You need to select the columns out as the target partition has 2 less fields (date and country are missing) As we had 2 levels of partitioning and lots of big files this ran within a day on a 2Tb table, saving us around 5Tb (replication factor is 3).</p>
<p>You can actually download and compress the data directly to HDFS as Hive does not know what data is inside the folders on HDFS, just their layout but I thought better to do it via hive and let Hadoop parallelise it. I would have carried on doing it this way but with other tables it was too slow (too many partitions, difficult to parallelise hive server). I stopped using rbhive, dropped to using hive -e to execute the querys and used the lovely autopartitioning in later hive versions. Notice you can SELECT * now and it automatically does what it needs to to insert results into the correct partitions. </p>
<p><script src="https://gist.github.com/1002077.js"></script><noscript><pre><code class="language-ruby ruby">require 'rubygems'
require 'date'

countrys = %w[at au br de dk es fr in int it jp kr mx nl no pl pt ru se uk us za]

dates = (Date.parse('2010-12-02')..Date.parse('2011-05-01'))

dates.each do |date|
  query = &quot;&quot;
  query += &quot;SET hive.exec.compress.output=true;&quot;
  query += &quot;SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;&quot;
  query += &quot;set mapred.job.priority=VERY_LOW;&quot; 
  query += &quot;set hive.exec.dynamic.partition=true;&quot;
  query += &quot;set mapred.output.compress=true;&quot;
  query += &quot;set mapred.compress.map.output=true;&quot;
  query += &quot;set hive.merge.mapredfiles=true;&quot;
  query += &quot;set hive.merge.mapfiles=true;&quot;
  query += &quot;insert overwrite table hourly_clicks 
            partition (dated='#{date}', country, hour) 
            select * from hourly_clicks where dated='#{date}'&quot;
  query = &quot;hive -e \&quot;#{query}\&quot;&quot;
  puts &quot;running #{query}&quot;
  `#{query}`
end
</code></pre></noscript><br />
The key difference is partition (dated=&#8217;#{date}&#8217;, country, hour) , we have not specified a country or hour partition so hive will do it automatically. This ran loads faster than looping over the partitions, letting hive schedule lots more mapreduce jobs at once. If you set hive.exec.dynamic.partition.mode=nonstrict as well you can not specify any partition information (I did this as a test but kept the WHERE clause, I was scared to do it all at once!)</p>
<p>The reason I am not (very) worried about losing parallelism is that some of our partition contained big .csv&#8217;s and the output of INSERT OVERWRITE was multiple .gz files (looked to me like as many as there were mappers, for example a 700M text file became ~10 .gz files) so they will still be read in parallel by mappers as the original CSV was.</p>
<p>Open to suggestions about better ways to achieve this, this does not preclude doing something better later.</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2011/06/01/compressing-text-tables-in-hive/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2011/06/01/compressing-text-tables-in-hive/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Finding information on Hive tables from HDFS</title>
		<link>http://www.thattommyhall.com/2011/05/16/hive-size-hdfs/</link>
		<comments>http://www.thattommyhall.com/2011/05/16/hive-size-hdfs/#comments</comments>
		<pubDate>Mon, 16 May 2011 16:42:07 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[hadoop]]></category>
		<category><![CDATA[hive]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=686</guid>
		<description><![CDATA[I was curious about our Hive tables total usage on HDFS and what the average filesize was with the current partitioning scheme so wrote this ruby script to calculate it. Lots of our files were small so I am going to experiment with different partitioning and compression schemes. Share on Facebook]]></description>
				<content:encoded><![CDATA[<p>I was curious about our Hive tables total usage on HDFS and what the average filesize was with the current partitioning scheme so wrote this ruby script to calculate it.</p>
<p><script src="https://gist.github.com/974792.js"></script><noscript><pre><code class="language-ruby ruby">current = ''
file_count = 0
total_size = 0

output = File.open('output.csv','w')

IO.popen('hadoop fs -lsr /user/hive/warehouse').each_line do |line|
  split = line.split(/\s+/)
  #permissions,replication,user,group,size,mod_date,mod_time,path
  next unless split.size == 8
  path = split[7]
  size = split[4]
  permissions = split[0]
  tablename=path.split('/')[4]
  if tablename != current
    average_size = file_count == 0 ? 0 : total_size/file_count
    result = &quot;#{current},#{file_count},#{total_size},#{average_size}&quot;
    unless current==''
      puts result
      output.puts result
    end
    total_size = 0
    current = tablename
    file_count = 0
  end
  file_count += 1 unless permissions[0] == 'd'
  total_size += size.to_i
end</code></pre></noscript></p>
<p>Lots of our files were small so I am going to experiment with different partitioning and compression schemes.</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2011/05/16/hive-size-hdfs/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2011/05/16/hive-size-hdfs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Running &#8211;repair on MongoDB via Upstart</title>
		<link>http://www.thattommyhall.com/2011/05/13/running-repair-on-mongodb-via-upstart/</link>
		<comments>http://www.thattommyhall.com/2011/05/13/running-repair-on-mongodb-via-upstart/#comments</comments>
		<pubDate>Fri, 13 May 2011 18:46:01 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[devops]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mongodb]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=672</guid>
		<description><![CDATA[One of our servers running MongoDB crashed today and we encountered the typical old lock file: /var/lib/mongodb/mongod.lock. probably means unclean shutdown recommend removing file and running &#8211;repair see: http://dochub.mongodb.org/core/repair for more information As the docs do not seem to have much of an alternative to running &#8211;repair I looked for a way to automate it [...]]]></description>
				<content:encoded><![CDATA[<p>One of our servers running MongoDB crashed today and we encountered the typical </p>
<blockquote><p>old lock file: /var/lib/mongodb/mongod.lock.  probably means unclean shutdown<br />
recommend removing file and running &#8211;repair<br />
see: http://dochub.mongodb.org/core/repair for more information
</p></blockquote>
<p>As the docs do not seem to have much of an alternative to running &#8211;repair I looked for a way to automate it from upstart. Mongo creates a mongod.lock file in the data directory with the processes PID in and on a safe shutdown removes the PID, leaving the file there. </p>
<p>This upstart scripts includes a pre-start script that checks if the lock file exists, reads it, makes sure there is a PID there, makes sure no mongod processes exist with that PID then performs the repair as the mongodb user. </p>
<p><script src="https://gist.github.com/971056.js"></script><noscript><pre><code class="language- ">limit nofile 20000 20000

kill timeout 300

env MONGO_DATA=/var/lib/mongodb/
env MONGO_LOGS=/var/log/mongodb/
env MONGO_EXE=/usr/bin/mongod
env MONGO_CONF=/etc/mongodb.conf

pre-start script
  mkdir -p $MONGO_DATA
  mkdir -p $MONGO_LOGS
  if [ -f $MONGO_DATA/mongod.lock ]; then
    mongo_pid=`cat $MONGO_DATA/mongod.lock`
    if [ ! -z $mongo_pid ]; then
      if [ ! `pgrep mongo | grep &quot;$mongo_pid&quot; | wc -l` -gt 0 ]; then
        rm $MONGO_DATA/mongod.lock
        sudo -u mongodb /usr/bin/mongod --config /etc/mongodb.conf --repair
        touch $MONGO_DATA/repaired-`date &quot;+%Y%m%d-%H%M%S&quot;`
      fi
    fi
  fi  
end script

start on runlevel [2345]
stop on runlevel [06]

script
  if [ -f /etc/default/mongodb ]; then . /etc/default/mongodb; fi
  exec start-stop-daemon --start --quiet --chuid mongodb --exec  $MONGO_EXE -- --config $MONGO_CONF
end script</code></pre></noscript></p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2011/05/13/running-repair-on-mongodb-via-upstart/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2011/05/13/running-repair-on-mongodb-via-upstart/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>We are all DevOps</title>
		<link>http://www.thattommyhall.com/2011/04/04/we-are-all-devops/</link>
		<comments>http://www.thattommyhall.com/2011/04/04/we-are-all-devops/#comments</comments>
		<pubDate>Mon, 04 Apr 2011 17:12:15 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[devops]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=662</guid>
		<description><![CDATA[I gave a talk recently at the Forward Tech away day entitled We Are All DevOps and it went down quite well. Forward is an unusual environment, the devs are trusted to do lots of the typical sysadmin role and the boundary between Dev and Ops is very blurred. During my first few months in [...]]]></description>
				<content:encoded><![CDATA[<p>I gave a talk recently at the Forward Tech away day entitled We Are All DevOps and it went down quite well. Forward is an unusual environment, the devs are trusted to do lots of the typical sysadmin role and the boundary between Dev and Ops is very blurred. During my first few months in the search team I kept mindmapping stuff I wanted to talk about but only got round to making the slides the day before so it was a bit underprepared but I hope useful for people. </p>
<p>I borrowed ideas from John Leach&#8217;s excellent <a href="http://video2010.scottishrubyconference.com/show_video/6/1">Ruby: Reinventing the Wheel</a> talk, this <a href="http://www.slideshare.net/jedi4ever/devops-the-war-is-over-if-you-want-it">DepOps: The War Is Over</a> presentation and rambled incoherently about a talk I just saw at the UKUUG Spring Conference from the author of cfengine, see <a href="http://www.cfengine.org/pages/science">here</a> a nice description of the project (you can see how it has influenced <a href="http://www.puppetlabs.com/">Puppet</a>) </p>
<p>Here are the slides (first time I have used Scribd, it is excellent. Much better than slideshare)<br />
<a title="View DevOps on Scribd" href="http://www.scribd.com/doc/52256587/DevOps" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;">DevOps</a><iframe class="scribd_iframe_embed" src="http://www.scribd.com/embeds/52256587/content?start_page=1&#038;view_mode=slideshow&#038;access_key=key-20ddphiwt0x32nqhp6br" data-auto-height="true" data-aspect-ratio="1.33333333333333" scrolling="no" id="doc_72344" width="100%" height="600" frameborder="0"></iframe><script type="text/javascript">(function() { var scribd = document.createElement("script"); scribd.type = "text/javascript"; scribd.async = true; scribd.src = "http://www.scribd.com/javascripts/embed_code/inject.js"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(scribd, s); })();</script></p>
<p>I like the <a href="http://blog.websages.com/2010/12/10/jameswhite-manifesto/">James White Manifesto </a>, it chimes really strongly with me.</p>
<p>In particular</p>
<blockquote><p> On Infrastructure<br />
 &#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
 There is one system, not a collection of systems.<br />
 The desired state of the system should be a known quantity.<br />
 The &#8220;known quantity&#8221; must be machine parseable.<br />
 The actual state of the system must self-correct to the desired state.<br />
 The only authoritative source for the actual state of the system is the system.<br />
 The entire system must be deployable using source media and text files.</p></blockquote>
<p>Soon they will post videos and I will get to see myself give a talk  for the first time.</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2011/04/04/we-are-all-devops/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2011/04/04/we-are-all-devops/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>101 goals in 1001 days &#8211; Day 400 Update</title>
		<link>http://www.thattommyhall.com/2011/02/27/101in1001-day400/</link>
		<comments>http://www.thattommyhall.com/2011/02/27/101in1001-day400/#comments</comments>
		<pubDate>Sun, 27 Feb 2011 18:11:37 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[101]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=632</guid>
		<description><![CDATA[Well, day 400 of my 101 goals in was Feb 5th and I was in the midst of moving house so delayed doing this. Completed &#8211; 16 1, Teetotalitarianism for 3 months 2, Cheeseless for 3 months 9, Read GEB 11, Reread all Dennett books 15, Proofread for Project Guttenburg 48, Create a Backblaze storage [...]]]></description>
				<content:encoded><![CDATA[<p>Well, day 400 of my 101 goals in was Feb 5th and I was in the midst of moving house so delayed doing this.</p>
<p><strong>Completed &#8211; 16</strong><br />
<em>1, Teetotalitarianism for 3 months</em><br />
<em>2, Cheeseless for 3 months</em><br />
<em>9, Read <a href="http://en.wikipedia.org/wiki/G%C3%B6del,_Escher,_Bach">GEB</a></em><br />
<em>11, Reread all <a href="http://en.wikipedia.org/wiki/Daniel_Dennett">Dennett</a> books</em><br />
<em>15, Proofread for <a href="http://www.gutenberg.org/wiki/Main_Page">Project Guttenburg</a></em><br />
<em>48, <a href="http://ukblazers.com/2010/08/25/test-build-easier-than-i-thought/">Create a Backblaze storage pod</a></em><br />
<em>53, <a href="http://www.thattommyhall.com/2010/04/15/making-lemon-curd/">Make Jam</a></em><br />
<em>66, Via Feratta in Italy</em><br />
<em>78, Learn to use Emacs</em><br />
I suppose you can never fully learn it but I do use it for my development now<br />
<em>82, <a href="http://www.thattommyhall.com/2010/12/16/egypt-trip/">Visit Egypt</a></em><br />
<em>83, Re-visit Louvre</em><br />
<em>85, Visit Pergamon Museum</em><br />
<em>86, Give Carrie a British Museum Tour</em><br />
<em>92, Read &#8220;<a href="http://www.amazon.co.uk/Ode-Less-Travelled-Unlocking-Within/dp/009179661X" rel="nofollow">An Ode Less Travelled</a>&#8220;, do the exercises (but not share them!)</em><br />
Read it while in Egypt.<br />
<em>97, Be 1/3 through in 2010<br />
100, Set success criteria / progression metrics for each goal</em></p>
<p><strong>On Track &#8211; 16</strong><br />
<em>5, Lose 2 stone</em><br />
<em>10, Write book reviews for each book I read</em><br />
Where I havent yet I have added a task to rememberthemilk to do so<br />
<em>13, Release 303 books on bookcrossing.com</em><br />
88 available <a href="http://www.bookcrossing.com/mybookshelf/thattommyhall/available">here</a>, let me know if you like any and I will post them to you.<br />
<em>19,Blog on average once a week<br />
50, Move 10 people to FreeAgent</em><br />
<em>68, Complete Pimsleur German</em><br />
Changed from Spanish as I now live with a lovely German lady.<br />
<em>72, Read &#8220;Winning Ways&#8221;</em><br />
read 1/2 of part 1 (of 4)<br />
<em>74, Read AI: A Modern Approach</em><br />
<em>75, Watch SICP, do exercises from book</em><br />
Started a book club in work, seems to have stalled but I&#8217;ll start banging the drum again now I&#8217;ve settled in my new house.<br />
<em>76, Do on average 1 <a href="http://projecteuler.net/index.php?section=about">Project Euler</a> problem per week</em><br />
<em>77, Complete &#8220;Real World Haskell&#8221;</em><br />
<em>88, Go to the theatre on average once a month</em><br />
Way ahead on this, started a monthly theatre club but we managed to schedule a dozen things for the first few months of 2011<br />
<em>91, Memorise 10 poems</em><br />
Not quite settled on the 10 but between listening to Jorge Louis Borges, This Craft Of Verse and The Ode Less Travelled I have quite a list to choose from.<br />
<em>95, Pay off all credit cards<br />
96, Let loans run course and dont get any more<br />
101, Do 100 day updates</em><br />
This is one right <img src='http://www.thattommyhall.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><strong>Behind &#8211; 4</strong><br />
8, Read all the VSIs<br />
12, Read all PG Wodehouse<br />
81, Watch all TTC Art history DVDs<br />
90, See all world heritage sites in the UK</p>
<p><strong>Changing &#8211; 5</strong><br />
Lots of the work related ones dont make sense any more now that I have gone full time and moved into development so I am making the following changes.<br />
<em>43, Visit the <a href="http://www.rijksmuseum.nl/">rijksmuseum</a></em> (was Get CCNP)<br />
<em>44, Visit The <a href="http://www.uffizi.com/">Uffizi</a> in Florence</em> (was Get CCEE)<br />
<em>45, Give blood every 20 weeks</em> (was Get MCITP &#8211; Enterprise Admin)<br />
<em>46, Listen to Radio 4 / British Museum &#8211; <a href="http://www.bbc.co.uk/ahistoryoftheworld/">A History of the World in 100 Objects</a> and view each of them</em> (was Get VCAP)<br />
The above are all taken from a mate who just did his own 101 list.<br />
<em>47, Make a Munro bagging site in Rails</em> (was Say to a recruiter &#8220;I dont work <MonthName>&#8221; and turn down work)</p>
<p><strong>Planning &#8211; 12 </strong><br />
<em>60, Hike on average once a month<br />
61, Do a UK long distance path<br />
67, Do another alpine 4000m peak<br />
62, Do a big hike in Europe<br />
64, Climb a continental highest mountain<br />
33, Safari<br />
20, Organise a big bash for my 30th</em><br />
The fitness aspect of these goals is where I am behind the most (though I am still a stone lighter than when I started) so I am concentrating the next six months on these goals, ending with summiting kilimanjaro for my 30th then returning to a big party.<br />
<em>35, Visit 5 Michelin 3* restaurants</em><br />
<em>37, Visit porto</em><br />
Will go with Petra in the spring<br />
<em>84, Revisit Met Museum</em><br />
A good mate has just moved to NYC so this should happen as soon as he is settled.<br />
<em>89, Return to the Theatre by the lake</em><br />
My first trip with Petra was to here and we loved it. Will be going in the spring.<br />
<em>94, Go to Edinburgh festival</em><br />
Will go at the beginning of August.</p>
<p><em><strong>Not Started &#8211; 48</strong><br />
3, Do a marathon<br />
4, Do a triathlon<br />
6, Attend martial arts classes for 3 months<br />
7, Write an artice for Plus new writers<br />
14, Read a short story for librivox<br />
16, Send Dennett a letter<br />
17, Send Dawkins a letter<br />
18, Read Joyce<br />
21, Read GTD<br />
22, Spend 3 months in another country<br />
23, Organise all my DVDs<br />
24, Swim with sharks<br />
25, Paraglide<br />
26, Learn to play bongos<br />
27, Skydive<br />
28, Drive Offroad<br />
29, Do a banger rally<br />
30, Have a track day<br />
31, Hire the whole of Salvos Salumeria for an evening<br />
32, Bungee Jump<br />
34, Vinyard tour<br />
36, See Northern Lights<br />
38, Take dad to an opera<br />
39, Take Mum, Dad and Carrie to the Welsh Mountain Zoo<br />
40, Do 1000 things in London<br />
41, Do a standup comedy course<br />
42, Visit Japan<br />
49, Work only 100 days in a year<br />
51, Investigate Visa situation for Australia<br />
52, Investigate Visa situation for US<br />
54, Grow mushrooms<br />
55, Paint a water colour<br />
56, Make beer<br />
57, Make wine<br />
58, Cook a 4 course meal for 20 friends<br />
59, Do a photography course<br />
63, Attend NIM<br />
69, Learn to dance<br />
70, Learn to play golf<br />
71, Learn 10 magic tricks<br />
73, Make a Dots and Boxes program<br />
79, Raise £5005 for charity<br />
80, Talk about Free Software at a school<br />
87, Go on wine tasting course<br />
93, Go to Melbourne Comedy Festival<br />
99, Have a completion party<br />
65, Volunteer  for the mountain bothys association<br />
98, Have done 2/3 by day 666<br />
</em></p>
<p>I am quite heartened by the progress to be honest, considering that I spent half of last year working outside the UK, now things are settling down I should be able to churn through them faster.</p>
<p>If you want to join in on some, let me know!</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2011/02/27/101in1001-day400/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2011/02/27/101in1001-day400/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Signals In Ruby / &#8220;rescue Exception&#8221; considered harmful</title>
		<link>http://www.thattommyhall.com/2011/02/24/rescue-exception-harmful-signals-in-ruby/</link>
		<comments>http://www.thattommyhall.com/2011/02/24/rescue-exception-harmful-signals-in-ruby/#comments</comments>
		<pubDate>Thu, 24 Feb 2011 18:35:43 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=611</guid>
		<description><![CDATA[Yesterday we had an issue with the different behaviour of &#8220;kill &#8221; and &#8220;kill -9 &#8221; and in the process I had to refresh my knowledge of Unix signals, learn how you handle them in Ruby and properly learn Rubys exception hierarchy. To -9 or not to -9? The unix kill command is perhaps strangely [...]]]></description>
				<content:encoded><![CDATA[<p>Yesterday we had an issue with the different behaviour of &#8220;kill <OUR_APP>&#8221; and &#8220;kill -9 <OUR_APP>&#8221; and in the process I had to refresh my knowledge of Unix signals, learn how you handle them in Ruby and properly learn Rubys exception hierarchy.</p>
<p><strong>To -9 or not to -9?</strong><br />
The unix kill command is perhaps strangely named as it actually sends signals to processes (see &#8220;man signal&#8221; for a full list). It defaults to sending SIGTERM to the process and the application writer can decide how to treat it by &#8220;trapping&#8221; it, allowing for a safe shutdown or debug dumps etc. &#8220;kill -9&#8243; sends SIGKILL and the signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored by your programs.<br />
I think in the first instance you should just use &#8220;kill&#8221;, give the app the chance to do the right thing then get -9 on its ass if you need to.</p>
<p><strong>Catching signals in Ruby</strong></p>
<pre class="brush: ruby; title: ; notranslate">puts &quot;I have PID #{Process.pid}&quot;

Signal.trap(&quot;USR1&quot;) {puts &quot;prodded me&quot;}

loop do 
  sleep 5
  puts &quot;doing stuff&quot;
end</pre>
<p>Is about the simplest code that will trap the &#8220;USR1&#8243; signal (which you can send with &#8220;kill -USR1 <APPNAME>&#8220;). The USR1 and USR2 signals are left free for you to use however you wish in your applications.</p>
<p>If you look at the image below you can see that it responds to the USR1 signal I send it and kill (ie sending SIGTERM) works also.<br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2011/02/1-simple-small.png"><img src="http://www.thattommyhall.com/wp-content/uploads/2011/02/1-simple-small.png" alt="" title="1-simple-small" width="661" height="168" class="alignleft size-full wp-image-618" /></a></p>
<p>The following two code snippets are the same except one takes the default and the other catches Exception (ie <strong>any</strong> exception)</p>
<pre class="brush: ruby; title: ; notranslate">#sig-rescue.rb
puts &quot;I have PID #{Process.pid}&quot;

Signal.trap(&quot;USR1&quot;) {puts &quot;prodded me&quot;}

loop do 
  begin
  puts &quot;doing stuff&quot;
  sleep 10
  rescue =&gt; e
    puts e.inspect
  end
end</pre>
<p><a href="http://www.thattommyhall.com/wp-content/uploads/2011/02/2-rescue-small.png"><img src="http://www.thattommyhall.com/wp-content/uploads/2011/02/2-rescue-small.png" alt="" title="2-rescue-small" width="662" height="140" class="alignleft size-full wp-image-619" /></a><br />
So that still works as before and errors in our &#8220;do stuff&#8221; loop would get caught.</p>
<pre class="brush: ruby; title: ; notranslate">#sig-rescue-E.rb
puts &quot;I have PID #{Process.pid}&quot;

Signal.trap(&quot;USR1&quot;) {puts &quot;prodded me&quot;}

loop do 
  begin
  puts &quot;doing stuff&quot;
  sleep 10
  rescue Exception =&gt; e
    puts e.inspect
  end
end</pre>
<p><a href="http://www.thattommyhall.com/wp-content/uploads/2011/02/3-rescue-E-small.png"><img src="http://www.thattommyhall.com/wp-content/uploads/2011/02/3-rescue-E-small.png" alt="" title="3-rescue-E-small" width="664" height="212" class="alignleft size-full wp-image-620" /></a><br />
This fails though. You can see that SIGTERM no longer works and CTRL-C from the terminal does not work also. This is because we are catching the SignalException when we do &#8220;rescue Exception&#8221;. Kill -9 worked though, as it will kill any application as the signal cannot be caught.</p>
<p><strong>Rubys Exception Heirachy</strong><br />
The full exception heirachy (from the excellent <a href="http://blog.nicksieger.com/articles/2006/09/06/rubys-exception-hierarchy">cheat gem</a>) is </p>
<pre class="brush: plain; title: ; notranslate">Tom-Halls-MacBook-Pro:signal tomh$ cheat exceptions
exceptions:
  Exception
   NoMemoryError
   ScriptError
     LoadError
     NotImplementedError
     SyntaxError
   SignalException
     Interrupt
       Timeout::Error    # require 'timeout' for Timeout::Error
   StandardError         # caught by rescue if no type is specified
     ArgumentError
     IOError
       EOFError
     IndexError
     LocalJumpError
     NameError
       NoMethodError
     RangeError
       FloatDomainError
     RegexpError
     RuntimeError
     SecurityError
     SocketError
     SystemCallError
     SystemStackError
     ThreadError
     TypeError
     ZeroDivisionError
   SystemExit
   fatal
</pre>
<p>I think you should only catch StandardError or its children, possibly some of its siblings and avoid catching Exception as you probably dont want to change how the process deals with signals (you could trap them if you need to)</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2011/02/24/rescue-exception-harmful-signals-in-ruby/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2011/02/24/rescue-exception-harmful-signals-in-ruby/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ruby On Windows &#8211; Forking other processes</title>
		<link>http://www.thattommyhall.com/2011/02/20/ruby-on-windows-running-other-executables/</link>
		<comments>http://www.thattommyhall.com/2011/02/20/ruby-on-windows-running-other-executables/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 23:08:11 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[VMware]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=540</guid>
		<description><![CDATA[While moving our VM deployment site written in Sinatra to a Windows machine with the VMware PowerCLI toolkit installed the only snag was where we forked a process to do the preparation of the machines. Both Kernel.fork and Process.detach seemed to have issues. Original MRI on Linux IronRuby We tried IronRuby and the same bit [...]]]></description>
				<content:encoded><![CDATA[<p>While moving our VM deployment site written in Sinatra to a Windows machine with the VMware PowerCLI toolkit installed the only snag was where we forked a process to do the preparation of the machines. Both Kernel.fork and Process.detach seemed to have issues.</p>
<p><strong>Original MRI on Linux<br />
</strong></p>
<pre class="brush: ruby; title: ; notranslate">
  def build
    pid = fork { run_command }
    Process.detach(pid)
  end

  def run_command
    `sudo /opt/script/deployserver/setupnewserver.sh -p #{poolserver} -i #{ip} -s #{@size} -v #{@vlan} -a &quot;#{@owner}&quot; -n #{@name} -e &quot;#{@email}&quot;`
  end
</pre>
<p><strong>IronRuby</strong><br />
We tried IronRuby and the same bit of the script broke as on win32 MRI (though I was pleased and surprised that Sinatra worked)</p>
<pre class="brush: ruby; title: ; notranslate">
  def build
    WindowsProcess.start &quot;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe&quot;, 
&quot;-PSConsoleFile \&quot;C:\\Program Files (x86)\\VMware\\Infrastructure\\vSphere PowerCLI\\vim.psc1\&quot; \&quot;&amp; C:\\script\\DataStoreUsage.ps1\&quot;&quot;
  end
</pre>
<p>Using the following DotNet code</p>
<pre class="brush: ruby; title: ; notranslate">
class WindowsProcess
  def self.start(file, arguments)
    process = System::Diagnostics::Process.new
    process.StartInfo.FileName = file
    process.StartInfo.CreateNoWindow = true
    process.StartInfo.Arguments = arguments
    process.Start
  end
end
</pre>
<p><strong>Workaround using Windows &#8220;start&#8221; command</strong><br />
I had hoped the module at <a href="http://win32utils.rubyforge.org/">win32utils</a> would let me just use the original script but fork did not work properly still.</p>
<pre class="brush: ruby; title: ; notranslate">  
def build
  commandstr = &quot;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -PSConsoleFile \&quot;C:\\Program Files (x86)\\VMware\\Infrastructure\\vSphere PowerCLI\\vim.psc1\&quot; \&quot;&amp; C:\\Sites\\vmdeploy\\PrepNewMachine.ps1 -type #{@type} -machinename #{@name} -size #{@size} -vlan #{@vlan} -creator #{@owner} -creatoremail #{@email} -ipaddress #{ip}&quot;

  system (&quot;start #{commandstr} &gt; ./log/#{@name}.log 2&gt;&amp;1&quot;)
end
</pre>
<p>This uses the windows &#8220;start&#8221; command and works pretty well.</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2011/02/20/ruby-on-windows-running-other-executables/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2011/02/20/ruby-on-windows-running-other-executables/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Measuring Disk Usage In Linux (%iowait vs IOPS)</title>
		<link>http://www.thattommyhall.com/2011/02/18/iops-linux-iostat/</link>
		<comments>http://www.thattommyhall.com/2011/02/18/iops-linux-iostat/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 15:43:20 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=572</guid>
		<description><![CDATA[This occurred to me when looking at our Hadoop servers today, lots of our devs use IOWait as an indicator of IO performance but there are better measures. IOWait is a CPU metric, measuring the percent of time the CPU is idle, but waiting for an I/O to complete. Strangely &#8211; It is possible to [...]]]></description>
				<content:encoded><![CDATA[<p>This occurred to me when looking at our Hadoop servers today, lots of our devs use IOWait as an indicator of IO performance but there are better measures. IOWait is a CPU metric, measuring the percent of time the CPU is idle, but waiting for an I/O to complete. Strangely &#8211; <strong>It is possible to have healthy system with nearly 100% iowait, or have a disk bottleneck with 0% iowait.</strong> A much better metric is to look at disk IO directly and you want to find the IOPS (IO Operations Per Second). </p>
<p><strong>Measuring IOPS</strong><br />
In linux I like the iostat command, though there are a few ways to get at the info. In debian/ubuntu it is in the sysstat package (ie: sudo apt-get install sysstat)</p>
<pre class="brush: plain; title: ; notranslate">
root@MACHINENAME:/home/deploy# iostat 1
Linux 2.6.24-28-server (MACHINENAME.forward.co.uk) 	18/02/11
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
    45.51    0.00    1.85    0.62       0.00       52.03

Device:        tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
cciss/c0d0     4.00       0.00       40.00          0       40
cciss/c0d1     4.00       0.00       64.00          0       64
cciss/c0d2    12.00       0.00      248.00          0       248
cciss/c0d3     0.00       0.00        0.00          0       0
cciss/c0d4    25.00       0.00      320.00          0       320
cciss/c0d5     0.00       0.00        0.00          0       0
cciss/c0d6    30.00       0.00      344.00          0       344
cciss/c0d7    42.00    3144.00        0.00         3144     0
</pre>
<p>iostat 1 refreshes everysecond, if you do it over a longer period it will average the results. tps is what you are interested in, Transactions Per Second (ie IOPS). -x will give a more detailed output and separate out reads and writes and let you know how much data is going in and out per second.</p>
<p><strong>What is a good or bad number though?</strong><br />
As with most metrics, if the first time you look at it is when you are in trouble then it&#8217;s less helpful. You should have an idea of how much IO you typically do, then if you experience issues and are doing 10x that or only getting 1/10 from the disks then you have a good candidate explanation for them.</p>
<p><strong>How much can I expect from my storage?</strong><br />
It depends how fast the disks are spinning, and how many there is.<br />
As a rule of thumb I assume for a single disk:<br />
7.2k RPM -> ~100 IOPS<br />
10k RPM -> ~150 IOPS<br />
15k RPM -> ~200 IOPS<br />
Our hadoop servers were pushing about 70 IOPS to each disk at peak and they are 7.2k ones so that is in line with this estimate.</p>
<p>See <a href="http://www.zdnetasia.com/calculate-iops-in-a-storage-array-62061792.htm">here</a> for a breakdown of why these are good estimates for random IOs from a single disk. Interestingly a large amount of it comes from the latency of the platter spinning, which is why SSDs do so well for random IO (Compared to a 15k disk, ~50x for writes, ~200x reads)<br />
<strong>See also:</strong><br />
A concrete example of faster CPU causing higher %iowait while actually doing more transactions <a href="http://www.ee.pw.edu.pl/~pileckip/aix/iowait.htm">here</a></p>
<p>Extreme Linux Performance Monitoring and Tuning: <a href="http://www.ufsdump.org/papers/uuasc-june-2006.pdf">Part 1 (pdf)</a> and <a href="http://www.ufsdump.org/papers/io-tuning.pdf">Part 2 (pdf)</a> from <a href="http://www.ufsdump.org/">ufsdump.org/</a></p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2011/02/18/iops-linux-iostat/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2011/02/18/iops-linux-iostat/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Running Any Executable As A Windows Service (Ruby / Sinatra)</title>
		<link>http://www.thattommyhall.com/2011/02/14/srvany-sinatra-ruby-windows-service/</link>
		<comments>http://www.thattommyhall.com/2011/02/14/srvany-sinatra-ruby-windows-service/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 13:06:52 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[sinatra]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=541</guid>
		<description><![CDATA[While migrating an automated VM deployment page using a combination of Sinatra on Linux and Bash scripts using the Perl toolkit with a simpler script using the VMWare PowerCLI that I love so much I needed to create a windows service from the Sinatra App and had to do some googleing so I thought I [...]]]></description>
				<content:encoded><![CDATA[<p>While migrating an automated VM deployment page using a combination of <a href="http://www.sinatrarb.com/">Sinatra</a> on Linux and Bash scripts using the Perl toolkit with a simpler script using the VMWare PowerCLI that I <a href="http://www.thattommyhall.com/index.php?s=powercli&#038;submit=Search">love so much</a> I needed to create a windows service from the Sinatra App and had to do some googleing so I thought I would share how I did it.</p>
<p>You only need two things &#8211; the built-in &#8220;sc&#8221; command and an executable from <a href="https://www.microsoft.com/downloads/en/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&#038;displaylang=en">Windows Server 2003 Resource Kit Tools</a> called srvany (works with 2008 too). Get just that exe <a href="http://dl.dropbox.com/u/2039069/srvany.exe">here</a> (if you trust me of course <img src='http://www.thattommyhall.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  )</p>
<p><strong>Creating the service</strong><br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2011/02/1-CreateService.png"><img src="http://www.thattommyhall.com/wp-content/uploads/2011/02/1-CreateService.png" alt="" title="1-CreateService" width="669" height="78" class="alignleft size-full wp-image-550" /></a><br />
<strong>Check it exists</strong><br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2011/02/2-service.png"><img src="http://www.thattommyhall.com/wp-content/uploads/2011/02/2-service.png" alt="" title="2-service" width="537" height="25" class="alignleft size-full wp-image-552" /></a><br />
<strong>Set Parameters In The Registry</strong><br />
Configure it at HKLM/SYSTEM/CurrentControlSet/Services/APPNAME/Parameters<br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2011/02/Screen-shot-2011-02-14-at-12.54.15.png"><img src="http://www.thattommyhall.com/wp-content/uploads/2011/02/Screen-shot-2011-02-14-at-12.54.15.png" alt="" title="Screen shot 2011-02-14 at 12.54.15" width="725" height="165" class="alignleft size-full wp-image-561" /></a></p>
<pre class="brush: plain; title: ; notranslate">Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VMdeploy\Parameters]
&quot;Application&quot;=&quot;C:\\Ruby192\\bin\\ruby&quot;
&quot;AppParameters&quot;=&quot;C:\\Sites\\vmdeploy\\server.rb -p 80&quot;
&quot;AppDirectory&quot;=&quot;C:\\Sites\\vmdeploy&quot;
&quot;AppEnvironment&quot;=hex(7):65,00,78,00,61,00,6d,00,70,00,6c,00,65,00,3d,00,32,00,\
  37,00,00,00,62,00,6c,00,61,00,68,00,3d,00,63,00,3a,00,5c,00,74,00,65,00,6d,\
  00,70,00,66,00,69,00,6c,00,65,00,73,00,00,00,00,00</pre>
<p>Note the AppEnvironment is a multiline string, the rest are strings</p>
<p>This lets you run any executable file, change the directory you run it from and pass any arguments or environment variables so should cover most use cases.</p>
<p>I will be sharing the code for both the Sinatra app and the PowerShell deploy script in later posts.</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2011/02/14/srvany-sinatra-ruby-windows-service/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2011/02/14/srvany-sinatra-ruby-windows-service/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>2010 Retrospective</title>
		<link>http://www.thattommyhall.com/2011/01/08/2010-retrospective/</link>
		<comments>http://www.thattommyhall.com/2011/01/08/2010-retrospective/#comments</comments>
		<pubDate>Sat, 08 Jan 2011 17:53:56 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[101]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=524</guid>
		<description><![CDATA[Well, 2010 was a great year &#8211; thanks to all the great people who made it so. Just a brief outline: Work: Started the year down in Kent working on a XenApp deployment on VMware at the beginning of the year, then over in Dubai building a VMware View solution, went to Libya and built [...]]]></description>
				<content:encoded><![CDATA[<p>Well, 2010 was a great year &#8211; thanks to all the great people who made it so. </p>
<p><strong>Just a brief outline:</strong></p>
<p><strong>Work</strong>: Started the year down in Kent working on a XenApp deployment on VMware at the beginning of the year, then over in Dubai building a VMware View solution, went to Libya and built the corporate infrastructure for their biggest telco, spent 2 months working on INGs next gen datacentre in the Hague and ended in London for Forward working on merging USwitch&#8217;s infrastructure after the acquisition.<br />
While this was fun, I got fatigued with traveling and living out of a suitcase and was very happy to settle down a bit in London (which I think is the greatest city in the world) and work for a great company which I am very pleased and proud to say I have joined permanently. It is exciting to work somewhere using so much great tech and with so many sound people (with huge brains).</p>
<p><strong>Jollys</strong>: I managed to go to Russia, visiting Moscow and St Petersburg (OK, that was Dec 2009 but what the hell), the Czech Republic, Italy, go to Oklahoma for a friends wedding followed by a visit to two <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Ancient_Pueblo_Peoples">ancestral puebloan</a> sites, <a href="http://www.thattommyhall.com/2010/10/03/beautiful-berli/">Berlin</a>, Paris, <a href="http://www.thattommyhall.com/2010/12/17/forward-to-vegas/">Vegas</a> and <a href="http://www.thattommyhall.com/2010/12/16/egypt-trip/">Egypt</a>. I feel privileged to have the opportunity to have done all this and am still a bit amazed at just how much happened.</p>
<p><strong>Life: </strong>I have always thought their was an embarrassment of riches when I look at the great people I get to call my friends, I don&#8217;t get to see any of them enough and no amount is too much. Thanks to you all, I always say you are what makes the universe great for me, you conspire to make it so even though you don&#8217;t all know one another. The biggest change this year was finding someone patient enough to pair up with me full time, thanks Petra &#8211; I love you. We are moving in together soon and I look forward to having a permanent home in the greatest city in the world, with a spare room &#8211; please come visit!. Thanks to my family too, we had some bad news in 2010 but you all dealt with it with the usual aplomb, you are all ace.</p>
<p><strong>Resolutions</strong> There is no new resolutions for 2010, I will be reporting on the <a href="http://www.thattommyhall.com/2010/04/15/101-goals-100-day-update/">101 goals in 1001 days</a> soon.</p>
<p><strong>2011: </strong>Looks set to be the best year ever, thanks in advance for helping <a href="http://www.coachbarrow.com/blog/wp-content/uploads/2009/06/make-it-so.gif">make it so</a></p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2011/01/08/2010-retrospective/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2011/01/08/2010-retrospective/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Donating To Wikipedia</title>
		<link>http://www.thattommyhall.com/2010/12/31/donating-to-wikipedia/</link>
		<comments>http://www.thattommyhall.com/2010/12/31/donating-to-wikipedia/#comments</comments>
		<pubDate>Fri, 31 Dec 2010 03:56:47 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=514</guid>
		<description><![CDATA[I realised when auditing my delicious bookmarks recently how much I rely on Wikipedia to look things up and today donated for the first time. I had previously moaned about seeing Jimmy Wales&#8217;s face every time I logged in, like this and laughed my head off at this piss take from The Daily What: I [...]]]></description>
				<content:encoded><![CDATA[<p>I realised when auditing my delicious bookmarks recently how much I rely on Wikipedia to look things up and today donated for the first time. </p>
<p>I had previously moaned about seeing Jimmy Wales&#8217;s face every time I logged in, like this<br />
<img alt="" src="http://static02.mediaite.com/geekosystem/uploads/2010/11/jimmy-wales-wikipedia-appeal.png" title="face" class="alignnone" width="550" height="284" /><br />
 and laughed my head off at this piss take from <a href="http://thedailywh.at/post/1620254631/this-looks-shopped-of-the-day-the-next-logical">The Daily What:</a><br />
<img alt="JimmyFace" src="http://27.media.tumblr.com/tumblr_lc50dmfjCt1qzrlhgo1_r1_500.png" title="JimmyFace" class="alignnone" width="500" height="459" /></p>
<p>I found today at <a href="http://www.informationisbeautiful.net/2010/the-science-behind-wikipedias-jimmy-appeal/">Information Is Beautiful</a> the following demonstration of just how effective the campaign has been though.<br />
<img alt="" src="http://infobeautiful2.s3.amazonaws.com/wikipedia_jimmy_appeal.png" title="WhyJimFace" class="alignnone" width="550" height="700" /></p>
<p>Wikimedia have done some <a href="https://secure.wikimedia.org/wikipedia/meta/wiki/Fundraising_2010/Banner_testing">nice analysis of the campaign</a> on the Meta Wiki if you are interested.</p>
<p><a href="http://wikimediafoundation.org/wiki/WMFJT002/GB?utm_medium=sitenotice&#038;utm_campaign=20101229JT001_UK&#038;utm_source=20101229_JAT002_UK&#038;country_code=GB">Give to Wikipedia here</a></p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2010/12/31/donating-to-wikipedia/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2010/12/31/donating-to-wikipedia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Load Based Nic Teaming vs Link Aggregation</title>
		<link>http://www.thattommyhall.com/2010/12/21/load-based-nic-teaming-vs-link-aggregation/</link>
		<comments>http://www.thattommyhall.com/2010/12/21/load-based-nic-teaming-vs-link-aggregation/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 22:26:29 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[VMware]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=488</guid>
		<description><![CDATA[I remembered seeing Simon Long&#8217;s comment on twitter a few weeks ago and it was rattling around in the back of my mind. Will #VMware Load-Based Teaming remove the need for #Cisco EtherChannel? Discuss&#8230;. I long ago investigated NIC Teaming algorithms and settled on IP Hash with Cisco Etherchannels for most environments, only really using [...]]]></description>
				<content:encoded><![CDATA[<p>I remembered seeing Simon Long&#8217;s <a href="https://twitter.com/#!/SimonLong_/status/14599422625193984">comment on twitter</a> a few weeks ago and it was rattling around in the back of my mind.</p>
<blockquote><p>Will #VMware Load-Based Teaming remove the need for #Cisco EtherChannel? Discuss&#8230;.</p></blockquote>
<p>I long ago investigated NIC Teaming algorithms and settled on IP Hash with <a href="https://secure.wikimedia.org/wikipedia/en/wiki/EtherChannel">Cisco Etherchannels</a> for most environments, only really using something else if the client happened not have stacked switches. Thanks to Scott Lowe for <a href="http://blog.scottlowe.org/2006/12/04/esx-server-nic-teaming-and-vlan-trunking/">this superb article</a> on the matter.</p>
<p>When vSphere 4.1 came out with <a href="http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&#038;cmd=displayKC&#038;externalId=1022590">Load Based Teaming</a>, I was pleased that at last we had an algorithm that would have a go at proper load balancing and not just load distribution but had not got round to investigating much more.</p>
<p>At Forward we have just updated to 4.1, Enterprise Plus and have bought some shiny new Extreme <a href="http://www.extremenetworks.com/products/summit-x650.aspx">Summit X650 Series</a> 10G switches; so Simon&#8217;s comment was particularly apropos. </p>
<p>I had decided I wanted to try and use LBT but was unsure if I should port-channel the uplink ports. It turns out you can&#8217;t. I thought maybe you should to be honest, it does not mention in the dvSwitch guide as far as I can see but the <a href="http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&#038;cmd=displayKC&#038;externalId=1001938">ESX host requirements for link aggregation</a> KB (updated today) is very clear </p>
<blockquote><ul>
<li>The switch must be set to perform 802.3ad link aggregation in static mode ON and the virtual switch must have its load balancing method set to Route based on IP hash.</li>
<li>Enabling either Route based on IP hash without 802.3ad aggregation or vice-versa disrupts networking</li>
</ul>
</blockquote>
<p>ie you need both IP Hash and EtherChannel and neither will work without the other.</p>
<p>In answer to Simon&#8217;s question, my feeling is you may still get better performance from EtherChannel and IP based hash for some workloads but would guess &#8220;usually&#8221; LBT wins. I think the case where you may get better utilisation is when certain VMs have very high bandwidth requirements to different IPs. As described <a href="https://kensvirtualreality.wordpress.com/2009/04/05/the-great-vswitch-debate%E2%80%93part-3/">here</a> IP Hash is the only way to allow traffic from one vNIC to leave over different pNICs at the same time.</p>
<p>It is interesting that even with LBT bandwidth is still limited to the maximum bandwidth a single pNIC can provide for individual VMs / vmkernels, also IP hash will not get higher than a single pNIC for a vMotion or other point to point connections. So 10G is going to perform better for these operations than 10x1G, however you team them.</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2010/12/21/load-based-nic-teaming-vs-link-aggregation/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2010/12/21/load-based-nic-teaming-vs-link-aggregation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hyper9 Saves The Day</title>
		<link>http://www.thattommyhall.com/2010/12/20/hyper9-saves-the-day/</link>
		<comments>http://www.thattommyhall.com/2010/12/20/hyper9-saves-the-day/#comments</comments>
		<pubDate>Mon, 20 Dec 2010 14:43:16 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[VMware]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=468</guid>
		<description><![CDATA[We recently bought the Hyper9 capacity planning, reporting and monitoring solution for our VMware infrastructure and I quite soon made use of it to troubleshoot some problems reported to us like backups taking longer and databases being slower than normal. In the 3par storage I could see that IO was unusually high of late. Then [...]]]></description>
				<content:encoded><![CDATA[<p>We recently bought the <a href="http://www.hyper9.com/product_overview.aspx">Hyper9</a> capacity planning, reporting and monitoring solution for our VMware infrastructure and I quite soon made use of it to troubleshoot some problems reported to us like backups taking longer and databases being slower than normal.</p>
<p>In the 3par storage I could see that IO was unusually high of late.<br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2010/12/1-3par.png"><img src="http://www.thattommyhall.com/wp-content/uploads/2010/12/1-3par-300x282.png" alt="" title="1-3par" width="300" height="282" class="alignleft size-medium wp-image-469" /></a></p>
<p>Then I looked at the top-n datastores by IOPS and graphed them<br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2010/12/2-datastores.png"><img src="http://www.thattommyhall.com/wp-content/uploads/2010/12/2-datastores-300x190.png" alt="" title="2-datastores" width="300" height="190" class="alignleft size-medium wp-image-470" /></a><br />
A huge jump for sharedstorage8, so I looked at its VMs<br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2010/12/3-vms.png"><img src="http://www.thattommyhall.com/wp-content/uploads/2010/12/3-vms-300x187.png" alt="" title="3-vms" width="300" height="187" class="alignleft size-medium wp-image-472" /></a><br />
and found the culprit VM.</p>
<p>Here it is against our big &#8220;Superhero&#8221; database and the vCenter server with the DB.<br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2010/12/4-VSvCenter.png"><img src="http://www.thattommyhall.com/wp-content/uploads/2010/12/4-VSvCenter-300x224.png" alt="" title="4-VSvCenter" width="300" height="224" class="alignleft size-medium wp-image-473" /></a><br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2010/12/5-top3.png"><img src="http://www.thattommyhall.com/wp-content/uploads/2010/12/5-top3-300x233.png" alt="" title="5-top3" width="300" height="233" class="alignleft size-medium wp-image-474" /></a></p>
<p>A lot of IO from a machine the owner thought was doing nothing!</p>
<p>Hyper9 is a pretty good tool for reporting, alerting and troubleshooting your VMware infrastructure, the query language is lucene based and this gives you lots of options in creating custom views and alerts.</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2010/12/20/hyper9-saves-the-day/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2010/12/20/hyper9-saves-the-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visualising Tommy</title>
		<link>http://www.thattommyhall.com/2010/12/19/visualising-tommy/</link>
		<comments>http://www.thattommyhall.com/2010/12/19/visualising-tommy/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 16:18:03 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[random]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=415</guid>
		<description><![CDATA[Here are two Wordle visualisations, first the words used in my blog. I like reading obviously but it seems to be quite heavy on stuff from the single article I wrote on Rhipe &#8211; unusual words I suppose. The second is my del.icio.us tags, when is later going to happen? With delicious closing I am [...]]]></description>
				<content:encoded><![CDATA[<p>Here are two <a href="http://www.wordle.net">Wordle</a> visualisations, first the words used in my blog. I like reading obviously but it seems to be quite heavy on stuff from the single <a href="http://www.thattommyhall.com/2010/11/20/using-r-on-hadoop-with-rhipe/">article I wrote on Rhipe</a> &#8211; unusual words I suppose.<br />
<a href="http://www.wordle.net/show/wrdl/2892354/thattommyhall_Blog"><img src="http://www.thattommyhall.com/wp-content/uploads/2010/12/blogTagCloud-300x194.png" alt="" title="blogTagCloud" width="300" height="194" class="alignleft size-medium wp-image-418" /></a></p>
<p>The second is my <a href="http://www.delicious.com/thattommyhall">del.icio.us</a> tags, when is later going to happen?<br />
<a href="http://www.wordle.net/show/wrdl/2892361/thattommyhall_delicious"><img src="http://www.thattommyhall.com/wp-content/uploads/2010/12/DeliciousTagCloud-300x197.png" alt="" title="DeliciousTagCloud" width="300" height="197" class="alignleft size-medium wp-image-419" /></a></p>
<p>With delicious closing I am looking at alternatives, send recommendations if you have any.</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2010/12/19/visualising-tommy/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2010/12/19/visualising-tommy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Forward To Vegas</title>
		<link>http://www.thattommyhall.com/2010/12/17/forward-to-vegas/</link>
		<comments>http://www.thattommyhall.com/2010/12/17/forward-to-vegas/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 18:10:50 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[travel]]></category>

		<guid isPermaLink="false">http://www.thattommyhall.com/?p=456</guid>
		<description><![CDATA[Well, I guess I need to say something about my company Christmas present to all of their ~150 staff, a three day trip to Vegas. We flew out last Thursday and stayed for 3 nights at the Wynn, which is a great hotel. Thursday: Arrive and sleep (forgive me I only just got back from [...]]]></description>
				<content:encoded><![CDATA[<p>Well, I guess I need to say something about my company Christmas present to all of their ~150 staff, a three day trip to Vegas.</p>
<p>We flew out last Thursday and stayed for 3 nights at the Wynn, which is a great hotel.<br />
<a href="http://www.flickr.com/photos/thattommyhall/5264466446/" title="Vegas2010-46.JPG by thattommyhall, on Flickr"><img src="http://farm6.static.flickr.com/5165/5264466446_4b4467e4cb.jpg" width="500" height="375" alt="Vegas2010-46.JPG" /></a></p>
<p>Thursday: Arrive and sleep (forgive me I only just got back from Egypt after flying to Manchester instead of London and having to sit all night on a freezing cold coach!). </p>
<p>Friday: Flew in a helicopter into the Grand Canyon which was rather awesome.<br />
<a href="http://www.flickr.com/photos/thattommyhall/5264403368/" title="Vegas2010-12.JPG by thattommyhall, on Flickr"><img src="http://farm6.static.flickr.com/5083/5264403368_143969f962.jpg" width="500" height="375" alt="Vegas2010-12.JPG" /></a><br />
<a href="http://www.flickr.com/photos/thattommyhall/5264433930/" title="Vegas2010-29.JPG by thattommyhall, on Flickr"><img src="http://farm6.static.flickr.com/5164/5264433930_b05b534bba.jpg" width="500" height="375" alt="Vegas2010-29.JPG" /></a></p>
<p>Sat: Went to see <a href="http://www.cirquedusoleil.com/en/shows/zumanity/home.aspx">Zumanity</a> by Cirque du Soleil, it was amazing, I must see them again.<br />
<a href="http://www.thattommyhall.com/wp-content/uploads/2010/12/zumanity_1.jpg"><img src="http://www.thattommyhall.com/wp-content/uploads/2010/12/zumanity_1.jpg" alt="" title="zumanity_1" width="329" height="381" class="alignleft size-full wp-image-458" /></a></p>
<p>Sunday: A few of us went shooting,<br />
An M16<br />
<a href="http://www.flickr.com/photos/thattommyhall/5263882651/" title="Vegas2010-61.JPG by thattommyhall, on Flickr"><img src="http://farm6.static.flickr.com/5167/5263882651_5984f6f4a0.jpg" width="500" height="375" alt="Vegas2010-61.JPG" /></a></p>
<p>An H&#038;K MP5<br />
<a href="http://www.flickr.com/photos/thattommyhall/5264488850/" title="Vegas2010-59.JPG by thattommyhall, on Flickr"><img src="http://farm6.static.flickr.com/5289/5264488850_b5e2857f97.jpg" width="500" height="375" alt="Vegas2010-59.JPG" /></a></p>
<p>A Mac-10<br />
<a href="http://www.flickr.com/photos/thattommyhall/5263893221/" title="Vegas2010-66.JPG by thattommyhall, on Flickr"><img src="http://farm6.static.flickr.com/5008/5263893221_8f3ef7c17d.jpg" width="500" height="375" alt="Vegas2010-66.JPG" /></a><br />
not firing it gangster style unfortunately.</p>
<p>A Tommygun<br />
<a href="http://www.flickr.com/photos/thattommyhall/5264494024/" title="Vegas2010-62.JPG by thattommyhall, on Flickr"><img src="http://farm6.static.flickr.com/5169/5264494024_e099283521.jpg" width="500" height="375" alt="Vegas2010-62.JPG" /></a></p>
<p>A Desert Eagle<br />
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/nRvP-AZrLqw?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/nRvP-AZrLqw?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<p>And I did a Shotgun<br />
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/C6p4n_xv1oE?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/C6p4n_xv1oE?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<p>And I&#8217;ve got the T-shirt to prove it<br />
<a href="http://www.flickr.com/photos/thattommyhall/5264508628/" title="Vegas2010-69.JPG by thattommyhall, on Flickr"><img src="http://farm6.static.flickr.com/5127/5264508628_d193d46813.jpg" width="500" height="375" alt="Vegas2010-69.JPG" /></a><br />
Peace Through Superior Firepower indeed</p>
<p><a href="http://www.flickr.com/photos/thattommyhall/sets/72157625605862860/">Pics On Flickr</a></p>
<p><a href="http://www.youtube.com/view_play_list?p=BD0C4777569C2E46">Vids On Youtube</a></p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.thattommyhall.com/2010/12/17/forward-to-vegas/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.thattommyhall.com/2010/12/17/forward-to-vegas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
