<?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>London DevOps</title>
	<atom:link href="http://londondevops.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://londondevops.org</link>
	<description>London based DevOps</description>
	<lastBuildDate>Wed, 16 May 2012 04:12:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Temptation</title>
		<link>http://feedproxy.google.com/~r/KennethKufluk/~3/1VmwqSAy3Z0/</link>
		<comments>http://feedproxy.google.com/~r/KennethKufluk/~3/1VmwqSAy3Z0/#comments</comments>
		<pubDate>Wed, 16 May 2012 04:12:21 +0000</pubDate>
		<dc:creator>Kenneth</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://kenneth.kufluk.com/blog/?p=1043</guid>
		<description><![CDATA[In my mind of minds, I&#8217;m trying to talk myself into buying a Windows Phone. I know that sounds odd, but sometimes I like to get something a little different. After all, I bought the Nokia 7380, a phone with &#8230; <a href="http://kenneth.kufluk.com/blog/2012/05/temptation-and-risk/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In my mind of minds, I&#8217;m trying to talk myself into buying a Windows Phone. I know that sounds odd, but sometimes I like to get something a little different. After all, I bought the <a href="http://www.google.com/products/catalog?q=nokia+7380&amp;oe=UTF-8&amp;hl=en-gb&amp;client=safari&amp;um=1&amp;ie=UTF-8&amp;tbm=shop&amp;cid=10147684544117144050&amp;sa=X&amp;ei=ziizT7HhLqWwiQKH5tygAg&amp;ved=0CG8Q8wIwAA">Nokia 7380</a>, a phone with no keyboard of any kind, and in bright sunshine, no screen either.</p>
<p>So I&#8217;m tempted. It looks really slick.</p>
<p>There&#8217;s just a few things bothering me. Please bear in mind that I have done no active research. I go by twitter chit chat, billboards and window displays. I don&#8217;t watch cable tv or look at banner ads.</p>
<p>I&#8217;m worried about essential apps. Will gmail work? I&#8217;m not switching to hotmail. How about twitter, facebook, über, zipcar, sonos? I don&#8217;t hear people raving about windows phone clients.</p>
<p>I mean, I don&#8217;t need everything. Just those essentials..</p>
<p>Contract. The phone is cheaper, granted, but I think they&#8217;re still pushing me into a contract. But what if it&#8217;s a turkey? I don&#8217;t want to be stuck with the same turkey for two Christmases.</p>
<p>You know how cool it is to watch movies on your four inch phone? Honestly? It&#8217;s rubbish. Rubbish. So how about you throw me a smaller, sexier phone that fits in my pocket? Get freaky on me. I think your styles can handle it. I won&#8217;t watch more than YouTube videos of cats anyway.</p>
<p>Finally, my android phone. Everything about it is annoying me now. I&#8217;ve got a Nexus One, and I&#8217;m so over it. Every time I dock it, I curse the stupid delay, the lack of notifiers on the screensaver, the fact that I can&#8217;t differentiate ringtones between my wife&#8217;s urgent call and the bastard automated calls. That damnable lock screen. I hate this phone.</p>
<p>Ok, this is irrational, because the phone is fine, and I&#8217;m just tired of the quirks. Understood.</p>
<p>But to every one of those points, I look to the iPhone and sigh. How much better will life be when I have an iPhone? Maybe I just can&#8217;t possibly bear to buy anything else.</p>
<p>So to Microsoft/Nokia I say: reassure me. Give me billboards, give me window displays. I&#8217;m ready to take the jump.</p>
<p>Promise me it&#8217;ll be ok.</p>
<img src="http://feeds.feedburner.com/~r/KennethKufluk/~4/1VmwqSAy3Z0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://feedproxy.google.com/~r/KennethKufluk/~3/1VmwqSAy3Z0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to visit a friend with a baby</title>
		<link>http://feedproxy.google.com/~r/KennethKufluk/~3/bnmuTm8-0Hs/</link>
		<comments>http://feedproxy.google.com/~r/KennethKufluk/~3/bnmuTm8-0Hs/#comments</comments>
		<pubDate>Sun, 13 May 2012 01:24:33 +0000</pubDate>
		<dc:creator>Kenneth</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://kenneth.kufluk.com/blog/?p=1040</guid>
		<description><![CDATA[Until recently, I didn&#8217;t have much experience with babies. Even when I knew it was coming, I still stayed away from friends with babies, because I felt I wouldn&#8217;t know what to do. I was sure that when I had &#8230; <a href="http://kenneth.kufluk.com/blog/2012/05/how-to-visit-a-friend-with-a-baby/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Until recently, I didn&#8217;t have much experience with babies. Even when I knew it was coming, I still stayed away from friends with babies, because I felt I wouldn&#8217;t know what to do. I was sure that when I had my own, I&#8217;d figure it out.</p>
<p>This is true. You do figure it out.</p>
<p>But, hey, it might be that you&#8217;re visiting a friend with a baby (like us for example, please come and visit), and you haven&#8217;t had your own sprog yet. How do you behave? Here is a handy guide.</p>
<p>Say hello to mum. If not first, then at least second. It&#8217;s easy to forget, what with the baby.</p>
<p>Wash your hands before touching the baby. Golden rule, no exceptions.</p>
<p>Don&#8217;t take the baby. Ask, if you want a hold. But not straight away. Let the baby get used to you. Babies have a phase called &#8220;stranger anxiety&#8221;. If the baby screams at you, back off and give it time.</p>
<p>If the baby cries, keep clear. This can be a stressful time for the parents, especially with a guest present. Don&#8217;t hover, don&#8217;t help, just stand back and amuse yourself. Maybe take a walk.</p>
<p>Don&#8217;t get all up in the baby&#8217;s face. You don&#8217;t shove your face into every strangers nose. He can see you. There&#8217;s really no need to be less than an inch away.</p>
<p>If you find yourself in the kitchen, tidy up and wash up. Observe the local practises (there may be equipment just for baby stuff). Try to find yourself in the kitchen regularly.</p>
<p>Finally, here&#8217;s the best point of all. It&#8217;s the best. The winner.<br />
&#8220;How can I help?&#8221;<br />
Simple question. Ask it often.</p>
<p>We parents will thank you for following these rules. If not out loud (we&#8217;re busy), then in spirit.</p>
<p>We thank you.</p>
<img src="http://feeds.feedburner.com/~r/KennethKufluk/~4/bnmuTm8-0Hs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://feedproxy.google.com/~r/KennethKufluk/~3/bnmuTm8-0Hs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>News, 5 May</title>
		<link>http://feedproxy.google.com/~r/TheBuildDoctor/~3/5yFNfgJINvQ/</link>
		<comments>http://feedproxy.google.com/~r/TheBuildDoctor/~3/5yFNfgJINvQ/#comments</comments>
		<pubDate>Sat, 05 May 2012 15:20:16 +0000</pubDate>
		<dc:creator>BuildDoctorSansLinks</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.build-doctor.com/?p=2729</guid>
		<description><![CDATA[Conferences: XP2012 is in Neo Technology&#8217;s hometown of Malmo, Sweden [link] The BCS CMSG conference program is also out [link] VMWare sent a reminder for VMWare Forum 2012 next week  [link] News: Rackspace are blinging up their cloud product, and adding cloud databases [link] Cloudbees are doing a webinaar on ALM for PAAS [link] News, [...]<p><a rel="nofollow" target="_blank" href="http://www.build-doctor.com/2012/05/05/news-5-may/">News, 5 May</a> is a post from: <a rel="nofollow" target="_blank" href="http://www.build-doctor.com">The Build Doctor</a>.  Sponsored by <a rel="nofollow" target="_blank" href="http://www.anthillpro.com/html/products/anthillpro/default.html?utm_source=doctor&#38;utm_medium=rss&#38;utm_campaign=sponsor">AnthillPro</a>, the build and deployment automation server that lets you release with confidence.</p>]]></description>
			<content:encoded><![CDATA[<p>Conferences:</p>
<ul>
<li>XP2012 is in Neo Technology&#8217;s hometown of Malmo, Sweden <a rel="nofollow"  href="http://xp2012.org/program">[link]</a></li>
<li>The BCS CMSG conference program is also out <a rel="nofollow"  href="http://bcs-cmsg.org.uk/conference2012/timetable.html">[link]</a></li>
<li>VMWare sent a reminder for VMWare Forum 2012 next week  <a rel="nofollow"  href="http://www.vmwareforum2012.com/ref/vmwarenew">[link]</a></li>
</ul>
<p>News:</p>
<ul>
<li>Rackspace are blinging up their cloud product, and adding cloud databases <a rel="nofollow"  href="http://www.rackspace.co.uk/cloud-hosting/cloud-products/databases/?cmp=email_cloudnews_02may2012">[link]</a></li>
<li>Cloudbees are doing a webinaar on ALM for PAAS <a rel="nofollow"  href="http://www.cloudbees.com/webinars/application-lifecycle-management-paas.cb">[link]</a></li>
</ul>
<p><a rel="nofollow"  href="http://www.build-doctor.com/2012/05/05/news-5-may/">News, 5 May</a> is a post from: <a rel="nofollow"  href="http://www.build-doctor.com">The Build Doctor</a>.  Sponsored by <a rel="nofollow"  href="http://www.anthillpro.com/html/products/anthillpro/default.html?utm_source=doctor&utm_medium=rss&utm_campaign=sponsor">AnthillPro</a>, the build and deployment automation server that lets you release with confidence.</p>
<div class="feedflare">
<a rel="nofollow"  href="http://feeds.feedburner.com/~ff/TheBuildDoctor?a=5yFNfgJINvQ:EL3zojmFPi0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TheBuildDoctor?d=yIl2AUoC8zA" border="0"></a> <a rel="nofollow"  href="http://feeds.feedburner.com/~ff/TheBuildDoctor?a=5yFNfgJINvQ:EL3zojmFPi0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/TheBuildDoctor?i=5yFNfgJINvQ:EL3zojmFPi0:F7zBnMyn0Lo" border="0"></a> <a rel="nofollow"  href="http://feeds.feedburner.com/~ff/TheBuildDoctor?a=5yFNfgJINvQ:EL3zojmFPi0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/TheBuildDoctor?i=5yFNfgJINvQ:EL3zojmFPi0:V_sGLiPBpWU" border="0"></a> <a rel="nofollow"  href="http://feeds.feedburner.com/~ff/TheBuildDoctor?a=5yFNfgJINvQ:EL3zojmFPi0:ZWQ2tSG2k2o"><img src="http://feeds.feedburner.com/~ff/TheBuildDoctor?d=ZWQ2tSG2k2o" border="0"></a> <a rel="nofollow"  href="http://feeds.feedburner.com/~ff/TheBuildDoctor?a=5yFNfgJINvQ:EL3zojmFPi0:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/TheBuildDoctor?d=I9og5sOYxJI" border="0"></a> <a rel="nofollow"  href="http://feeds.feedburner.com/~ff/TheBuildDoctor?a=5yFNfgJINvQ:EL3zojmFPi0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/TheBuildDoctor?i=5yFNfgJINvQ:EL3zojmFPi0:gIN9vFwOqvQ" border="0"></a>
</div><img src="http://feeds.feedburner.com/~r/TheBuildDoctor/~4/5yFNfgJINvQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://feedproxy.google.com/~r/TheBuildDoctor/~3/5yFNfgJINvQ/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I miss running</title>
		<link>http://feedproxy.google.com/~r/KennethKufluk/~3/x7Fmc17UX7s/</link>
		<comments>http://feedproxy.google.com/~r/KennethKufluk/~3/x7Fmc17UX7s/#comments</comments>
		<pubDate>Fri, 04 May 2012 03:45:41 +0000</pubDate>
		<dc:creator>Kenneth</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://kenneth.kufluk.com/blog/?p=1022</guid>
		<description><![CDATA[I haven&#8217;t been running for a long time &#8211; since my baby was born. There&#8217;s just not enough time and energy for it these days. We wake up for the second or third time that night at about six am, &#8230; <a href="http://kenneth.kufluk.com/blog/2012/05/i-miss-running/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I haven&#8217;t been running for a long time &#8211; since my baby was born. There&#8217;s just not enough time and energy for it these days. We wake up for the second or third time that night at about six am, pull the little one out of bed and try to soothe as best we can. By the time we&#8217;re all fed and watered, it&#8217;s about 8.30 and I&#8217;m rushing to the bus stop.</p>
<p>I don&#8217;t really miss the long run to work though. It&#8217;s a slow four miles along the coast, avoiding traffic lights and the famous San Franciscan hills. I just jog at a steady pace. The distance isn&#8217;t hard, just the boredom. Long distance running is pretty dull &#8211; you have to have a lot on your mind to be able to run without getting really bored.</p>
<p>It&#8217;s running fast that&#8217;s more fun.<br />
Not a run, not full speed even.<br />
I mean a full-on sprint.</p>
<p>That extra burst of energy you throw in when you&#8217;re already going full speed. When your arms are pumping as hard as your legs, reaching out to claw the air closer. When the skin on your face starts moving against the bone. When you shift your weight down and back, so your feet can make maximum contact with the ground, but it&#8217;s still not enough. When you forget about breathing because it&#8217;s just another distraction. When every muscle in your body is working maximum power, maximum speed, just to propel you forward.</p>
<p>That&#8217;s the kind of running I miss.</p>
<img src="http://feeds.feedburner.com/~r/KennethKufluk/~4/x7Fmc17UX7s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://feedproxy.google.com/~r/KennethKufluk/~3/x7Fmc17UX7s/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Space is really boring</title>
		<link>http://feedproxy.google.com/~r/KennethKufluk/~3/6eUtl_dUrMg/</link>
		<comments>http://feedproxy.google.com/~r/KennethKufluk/~3/6eUtl_dUrMg/#comments</comments>
		<pubDate>Tue, 01 May 2012 04:17:23 +0000</pubDate>
		<dc:creator>Kenneth</dc:creator>
				<category><![CDATA[Physics & Astronomy]]></category>

		<guid isPermaLink="false">http://kenneth.kufluk.com/blog/?p=1019</guid>
		<description><![CDATA[I&#8217;m planning to live for about 80 years. In that time, the Earth will orbit the Sun 80 times. In turn, the Sun will orbit the centre of the Milky Way (our galaxy). This will take 230,000,000 years. About three &#8230; <a href="http://kenneth.kufluk.com/blog/2012/04/space-is-really-boring/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m planning to live for about 80 years.<br />
In that time, the Earth will orbit the Sun 80 times.</p>
<p>In turn, the Sun will orbit the centre of the Milky Way (our galaxy).<br />
This will take 230,000,000 years.<br />
About three million lifetimes. Nine million generations.<br />
In the entire history of modern man, we&#8217;ve barely started an orbit.</p>
<p>Our galaxy doesn&#8217;t orbit anything. But then, the Universe is only 13,700,000,000 years old. Maybe we just haven&#8217;t had a chance to get started.</p>
<p>The atoms in our bodies are elements that can only be created in supernovae &#8211; exploding stars. Going by the quantities we have available, we&#8217;ve probably been through two supernovae.</p>
<p>Hot gas gathers into a ball of fire, nuclear explosion, drifts apart, gathers into clouds, collects into ball of fire, nuclear explosion, drifts apart, gathers into clouds, collects into ball of fire. Our solar system.</p>
<p>Our sun is about 5,000,000,000 years old. The previous stars from which we&#8217;re made were bigger, and the universe was smaller and hotter, so they didn&#8217;t last as long. We can last another 5,000,000,000 years before we have to start looking for a new one. Our sun won&#8217;t explode &#8211; it will just fizzle out.</p>
<p>The heavens move, but our lifetimes are just a beat of the hummingbird&#8217;s wing.</p>
<p>Our nearest neighbour is 4 light years away. Not so far, at the speed of light. Of course, we can&#8217;t travel at the speed of light. We can mathematically prove that we&#8217;ll never be able to come close. One light year is 6,000,000,000,000 miles.</p>
<p>The stars are unreachable.</p>
<p>Despite all our advances in science and technology over the last century, it still takes an immense amount of power to lift anything into orbit. And mere words can&#8217;t convey the scale of the power required. These are the biggest machines mankind has ever created. They burn simple chemical fuels; no atomic power is used.</p>
<p>The problem of getting into orbit is still an engineering challenge, not a scientific challenge.</p>
<p>From orbit, where can we go? The moon is nearby, for want of a better word. It&#8217;s a rock.</p>
<p>Venus and mercury burn so hot, they&#8217;re unapproachable. Mars is an arid desert. We can no more populate that than we can the heart of the Sahara.</p>
<p>The gas giants are so distant that they&#8217;d take years to reach, and are incredibly dangerous. Jupiter&#8217;s magnetic field is so huge that it&#8217;s tearing the moons apart. The winds of Saturn orbit once every ten hours &#8211; that&#8217;s thousands of miles an hour,</p>
<p>There is nowhere for us to go.</p>
<p>Space is a beautiful, fascinating light show, forever beyond our reach.<br />
Tragically boring.</p>
<p>&#8211;</p>
<p>If you&#8217;re interested in space, you should sponsor my friend Chris&#8217;s project for Astronomers Without Borders: <a href="http://www.indiegogo.com/reachforthestars">reach for the stars</a>.</p>
<img src="http://feeds.feedburner.com/~r/KennethKufluk/~4/6eUtl_dUrMg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://feedproxy.google.com/~r/KennethKufluk/~3/6eUtl_dUrMg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is the problem you’re trying to solve?</title>
		<link>http://feedproxy.google.com/~r/KennethKufluk/~3/rj07kqpJv2w/</link>
		<comments>http://feedproxy.google.com/~r/KennethKufluk/~3/rj07kqpJv2w/#comments</comments>
		<pubDate>Tue, 01 May 2012 03:47:36 +0000</pubDate>
		<dc:creator>Kenneth</dc:creator>
				<category><![CDATA[Ranting]]></category>

		<guid isPermaLink="false">http://kenneth.kufluk.com/blog/?p=1017</guid>
		<description><![CDATA[This is about the most useful question in engineering. I ask it a lot. &#8220;how do I get to this private method?&#8221; &#8220;hmm, you shouldn&#8217;t really do that. What is the problem you&#8217;re trying to solve?&#8221; &#8220;I&#8217;m trying to find &#8230; <a href="http://kenneth.kufluk.com/blog/2012/04/what-is-the-problem-youre-trying-to-solve/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>This is about the most useful question in engineering. I ask it a lot.<br />
&#8220;how do I get to this private method?&#8221;<br />
&#8220;hmm, you shouldn&#8217;t really do that. What is the problem you&#8217;re trying to solve?&#8221;<br />
&#8220;I&#8217;m trying to find the tweet id&#8221;<br />
&#8220;oh that&#8217;s easy, we have a method for that&#8230;&#8221;</p>
<p>I think it&#8217;s a common question at Apple too.<br />
Their UI design is full of it.</p>
<p>Sometimes for the good:<br />
&#8220;how do I get rid of this virus?&#8221;<br />
&#8220;virus? why do you have a virus?&#8221;<br />
&#8220;I downloaded this software&#8230;&#8221;<br />
&#8220;ah, let me build you an app store&#8221;</p>
<p>Sometimes for the bad:<br />
&#8220;why doesn&#8217;t this green button work?&#8221;<br />
&#8220;what is the problem you&#8217;re trying to solve?&#8221;<br />
&#8220;I want to maximise the window&#8221;<br />
&#8220;ah, let me build you Spaces, a whole new way to&#8230;&#8221;<br />
&#8220;just make the fucking button work&#8221;</p>
<img src="http://feeds.feedburner.com/~r/KennethKufluk/~4/rj07kqpJv2w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://feedproxy.google.com/~r/KennethKufluk/~3/rj07kqpJv2w/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Go With The Flow – Progress Update</title>
		<link>http://www.devco.net/archives/2012/04/29/go-with-the-flow-progress-update-2.php</link>
		<comments>http://www.devco.net/archives/2012/04/29/go-with-the-flow-progress-update-2.php#comments</comments>
		<pubDate>Sun, 29 Apr 2012 08:58:53 +0000</pubDate>
		<dc:creator>R.I. Pienaar</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[gwtf]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.devco.net/?p=2568</guid>
		<description><![CDATA[A few weeks ago I blogged about my TODO / Reminder project called gwtf, I&#8217;ve done a lot since then and thought I&#8217;ll give a quick progress update. Generally I am very glad I started this process, I am actually continuing to use it today which is probably the longest I&#8217;ve ever used any TODO [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://devco.net/images/gwtf-boxcar.png" style="float:right">A few weeks ago I blogged about my <a href="http://www.devco.net/archives/2012/03/11/go-with-the-flow-task-tracking-for-the-cli.php">TODO / Reminder project called gwtf</a>, I&#8217;ve done a lot since then and thought I&#8217;ll give a quick progress update.</p>
<p>Generally I am very glad I started this process, I am actually continuing to use it today which is probably the longest I&#8217;ve ever used any TODO or reminder application. It really is good to be able to hack your own workflow and have a tool you can adapt to your needs rather than try to fit the mold of some off the shelf tool. </p>
<p>The time tracking feature has proven very valuable &#8211; as I work on my various projects I will track time worked with gwtf and review my mental estimate at the end of adding a feature. In time I am sure this will improve my ability to provide accurate time estimates while coding something for work etc.</p>
<p>The big thing I&#8217;ve added is a reminder system that can send notifications via email, <a href="http://boxcar.io/">boxcar</a> or <a href="http://notifo.com/">notifo</a> (community contributed method). The image show my iPhone receiving a push message. All items can have a reminder date and in line with the Unix CLI approach this is done using your system at(1) command. Each notification can go to multiple recipients so I get email and push notifications.</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">% gwtf new this is a test --remind=&quot;now + 1 week&quot; --done --ifopen
Creating reminder at job for item 30: job 46 at 2012-03-13 20:09
   30                 this is a test</pre></div></div>

<p></code></p>
<p>Here I will get a reminder a week from now after reminding the item will be marked as done. The reminder will only be sent if item has not already been closed.</p>
<p>Building on this I added a special project called <em>reminders</em> that does not show up in the normal list output, this project is where simple one-off reminders (and soon repeating ones) go. Being hidden from the list output means I can have many of them without feeling like I have a huge TODO backlog since these aren&#8217;t strictly TODO items.</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">% gwtf remind --at=&quot;now +1 hour&quot; do something
Creating reminder at job for item 84: job 66 at 2012-04-10 15:11
   103 L   2012-04-13 do something</pre></div></div>

<p></code></p>
<p>Items now have due dates and there is a notification method that will email you all due and overdue tasks.  I find if my todo list get mailed to me every day I get blind to it real quick, by only mailing due and overdue items they stand out and I pay them attention.</p>
<p>Various item list commands have been added. When I log into my shell I get the following, the colors show me that the projects have items due soon, it would go red when they are overdue.</p>
<p><center><img src="http://www.devco.net/images/gwtf-overview-list.png"></center></p>
<p>I&#8217;ve added an overview mode to the list command that shows all projects and their open items, again color coded as above.</p>
<p>I&#8217;ve also augmented all the date processing using the excellent <a href="https://github.com/mojombo/chronic">Chronic</a> gem. This means anywhere I need a date or time specification I can use natural language dates. For example the due date specification can be as simple as <em>&#8211;due=&#8221;next week&#8221;</em> which would end up being due on next Wednesday. I can be more specific like <em>&#8211;due=&#8221;7pm next tuesday&#8221;</em> etc. I really like this mode of date input since I almost never know what the date is anyway it&#8217;s a big challenge to type in full dates for this kind of system.</p>
<p>That&#8217;s the big ticket items but there has been a ton of small tweaks. Overall I&#8217;ve done 16 releases of the Gem and it&#8217;s been downloaded 1600+ times from rubygems.org. I put <a href="http://ripienaar.github.com/gwtf/">a little website up for it</a> using the new GitHub site system with full documentation etc.</p>
<p>I am not sure who the 1600 downloaders are, I am certainly not developing this with other peoples needs in mind but hopefully someone is gaining value from it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.devco.net/archives/2012/04/29/go-with-the-flow-progress-update-2.php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trigger Puppet runs though Git hooks</title>
		<link>http://www.devco.net/archives/2012/04/28/trigger-puppet-runs.php</link>
		<comments>http://www.devco.net/archives/2012/04/28/trigger-puppet-runs.php#comments</comments>
		<pubDate>Sat, 28 Apr 2012 22:11:27 +0000</pubDate>
		<dc:creator>R.I. Pienaar</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[mcollective]]></category>
		<category><![CDATA[puppet]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.devco.net/?p=2529</guid>
		<description><![CDATA[Since shutting down my business I now run a small 25 node network with no Puppet Masters and I do not schedule regular Puppet runs &#8211; I run them just when needed. Till now I&#8217;ve just done puppet runs via MCollective, basically I&#8217;d edit some puppet files and after comitting them just send off a [...]]]></description>
			<content:encoded><![CDATA[<p>Since shutting down my business I now run a small 25 node network with no Puppet Masters and I do not schedule regular Puppet runs &#8211; I run them just when needed.</p>
<p>Till now I&#8217;ve just done puppet runs via MCollective, basically I&#8217;d edit some puppet files and after comitting them just send off a puppet run with mcollective, supplying filters by hand so I only trigger runs on the appropriate nodes.</p>
<p>I started looking into git commit hooks to see if I can streamline this. I could of course just trigger a run on all nodes after a commit, there is no problem with capacity of masters etc to worry about. This is not very elegant so I thought I&#8217;d write something to parse my git push and trigger runs on just the right machines.</p>
<p>I&#8217;ll show a simplified version of the code here, the full version of the post-receive hook can be found <a href="http://devco.net/code/post-receive.rb">here</a>.  I&#8217;ve removed the <em>parse_hiera</em>, <em>parse_node</em> and <em>parse_modules</em> functions from this but you can find them in the code linked to.  To use this code you will need MCollective 2.0.0 that is due in a few days.</p>
<p><code></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/env ruby</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'grit'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'mcollective'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">MCollective::RPC</span>
&nbsp;
<span style="color:#0066ff; font-weight:bold;">@matched_modules</span> = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#0066ff; font-weight:bold;">@matched_nodes</span> = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#0066ff; font-weight:bold;">@matched_facts</span> = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># read each git ref in the push and process them</span>
<span style="color:#9966CC; font-weight:bold;">while</span> msg = <span style="color:#CC0066; font-weight:bold;">gets</span>
  old_sha, new_sha, ref = msg.<span style="color:#CC0066; font-weight:bold;">split</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">' '</span>, <span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
  repo = <span style="color:#6666ff; font-weight:bold;">Grit::Repo</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#996600;">'..'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
  commit = repo.<span style="color:#9900CC;">commit</span><span style="color:#006600; font-weight:bold;">&#40;</span>new_sha<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">case</span> ref
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006600; font-weight:bold;">%</span>r<span style="color:#006600; font-weight:bold;">&#123;</span>^refs<span style="color:#006600; font-weight:bold;">/</span>heads<span style="color:#006600; font-weight:bold;">/</span><span style="color:#006600; font-weight:bold;">&#40;</span>.<span style="color:#006600; font-weight:bold;">*</span><span style="color:#006600; font-weight:bold;">&#41;</span>$<span style="color:#006600; font-weight:bold;">&#125;</span>
      branch = $~<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> branch == <span style="color:#996600;">&quot;master&quot;</span>
        <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Commit on #{branch}&quot;</span>
        commit.<span style="color:#9900CC;">diffs</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>diff<span style="color:#006600; font-weight:bold;">|</span>
          <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;    %s&quot;</span> <span style="color:#006600; font-weight:bold;">%</span> diff.<span style="color:#9900CC;">b_path</span>
&nbsp;
          <span style="color:#008000; font-style:italic;"># parse the paths and save them to the @matched_* arrays</span>
          <span style="color:#008000; font-style:italic;"># these functions are in the full code paste linked to above</span>
          <span style="color:#9966CC; font-weight:bold;">case</span> diff.<span style="color:#9900CC;">b_path</span>
            <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006600; font-weight:bold;">/</span>^hieradb<span style="color:#006600; font-weight:bold;">/</span>
              parse_hiera<span style="color:#006600; font-weight:bold;">&#40;</span>diff.<span style="color:#9900CC;">b_path</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006600; font-weight:bold;">/</span>^nodes<span style="color:#006600; font-weight:bold;">/</span>
              parse_node<span style="color:#006600; font-weight:bold;">&#40;</span>diff.<span style="color:#9900CC;">b_path</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006600; font-weight:bold;">/</span>^common\<span style="color:#006600; font-weight:bold;">/</span>modules<span style="color:#006600; font-weight:bold;">/</span>
              parse_modules<span style="color:#006600; font-weight:bold;">&#40;</span>diff.<span style="color:#9900CC;">b_path</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#9966CC; font-weight:bold;">else</span>
              <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;ERROR: Do not know how to parse #{diff.b_path}&quot;</span>
          <span style="color:#9966CC; font-weight:bold;">end</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Commit on non master branch #{branch} ignoring&quot;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@matched_modules</span>.<span style="color:#9900CC;">empty</span>? <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> <span style="color:#0066ff; font-weight:bold;">@matched_nodes</span>.<span style="color:#9900CC;">empty</span>? <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> <span style="color:#0066ff; font-weight:bold;">@matched_facts</span>.<span style="color:#9900CC;">empty</span>?
  puppet = rpcclient<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;puppetd&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
  nodes = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  compound_filter = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
  nodes <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#0066ff; font-weight:bold;">@matched_nodes</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># if classes or facts are found then do a discover</span>
  <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@matched_modules</span>.<span style="color:#9900CC;">empty</span>? <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> <span style="color:#0066ff; font-weight:bold;">@matched_facts</span>.<span style="color:#9900CC;">empty</span>?
    compound_filter <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#0066ff; font-weight:bold;">@matched_modules</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#0066ff; font-weight:bold;">@matched_facts</span>
&nbsp;
    puppet.<span style="color:#9900CC;">comound_filter</span> compound_filter.<span style="color:#9900CC;">flatten</span>.<span style="color:#9900CC;">uniq</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot; or &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    nodes <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> puppet.<span style="color:#9900CC;">discover</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">if</span> nodes.<span style="color:#9900CC;">flatten</span>.<span style="color:#9900CC;">uniq</span>.<span style="color:#9900CC;">empty</span>?
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;No nodes discovered via mcollective or in commits&quot;</span>
    <span style="color:#CC0066; font-weight:bold;">exit</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># use new mc 2.0.0 pluggable discovery to supply node list</span>
  <span style="color:#008000; font-style:italic;"># thats a combination of data discovered on the network and file named</span>
  puppet.<span style="color:#9900CC;">discover</span> <span style="color:#ff3333; font-weight:bold;">:nodes</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> nodes.<span style="color:#9900CC;">flatten</span>.<span style="color:#9900CC;">uniq</span>
&nbsp;
  <span style="color:#CC0066; font-weight:bold;">puts</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Files matched classes: %s&quot;</span> <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#0066ff; font-weight:bold;">@matched_modules</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;, &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@matched_modules</span>.<span style="color:#9900CC;">empty</span>?
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Files matched nodes: %s&quot;</span> <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#0066ff; font-weight:bold;">@matched_nodes</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;, &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@matched_nodes</span>.<span style="color:#9900CC;">empty</span>?
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Files matched facts: %s&quot;</span> <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#0066ff; font-weight:bold;">@matched_facts</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;, &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@matched_facts</span>.<span style="color:#9900CC;">empty</span>?
  <span style="color:#CC0066; font-weight:bold;">puts</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Triggering puppet runs on the following nodes:&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span>
  puppet.<span style="color:#9900CC;">discover</span>.<span style="color:#9900CC;">in_groups_of</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>nodes<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;   %-20s %-20s %-20s&quot;</span> <span style="color:#006600; font-weight:bold;">%</span> nodes
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  puppet.<span style="color:#9900CC;">runonce</span>
&nbsp;
  printrpcstats
<span style="color:#9966CC; font-weight:bold;">else</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;ERROR: Could not determine a list of nodes to run&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p></code></p>
<p>The code between lines 14 and 46 just reads each line of the git post-receive hook STDIN and process them, you can read more about these hooks @ <a href="http://book.git-scm.com/5_git_hooks.html">git-scm.com</a>.</p>
<p>For each b path in the commit I parse its path based on puppet module conventions, node names, my hiera structure and some specific aspects of my file layouts.  These end up in the <em>@matched_modules</em>, <em>@matched_nodes</em> and <em>@matched_facts</em> arrays.</p>
<p>MCollective 2.0.0 will let you supply node names not just from network based discovery but from any source really.  Here I get node names from things like my node files, file names in iptables rules and such. Version 2.0.0 also supports a new query language for discovery which we use here.  The goal is to do a network discovery only when I have non specific data like class names &#8211; if I found just a list of node names I do not need to do go out to the network to do discovery thanks to the new abilities of MCollective 2.0.0 </p>
<p>In lines 48 to 90 I create a MCollective client to the puppetd agent, discover matching nodes and do the puppet runs.</p>
<p>If I found any code in the git push that matched either classes or facts I need to do a full MCollective discover based on those to get a node list. This is done using the new compound filtering language, the filter will look something like:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">/some_class/ or some::other::class or fact=value</pre></div></div>

<p></code></p>
<p>But this expensive network wide discovery is only run when there are facts or classes matched out of the commit.</p>
<p>Line 72 will supply the combined MCollective discovered nodes and node names discovered out of the code paths as discovery data which later in line 85 will get used to trigger the runs.</p>
<p>The end result of this can be seen here, the commit matched only 5 out of my 25 machines and only those will be run:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ git push origin master
Counting objects: 13, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (7/7), 577 bytes, done.
Total 7 (delta 4), reused 0 (delta 0)
remote: Commit on master
remote:     common/modules/mcollective/manifests/client.pp
remote:
remote: Files matched classes: mcollective::client
remote:
remote: Triggering puppet runs on the following nodes:
remote:
remote:    node1                node2            node3
remote:    node4                node5
remote:
remote: 5 / 5
remote:
remote: Finished processing 5 / 5 hosts in 522.15 ms
To git@git:puppet.git
   7590a60..10ee4da  master -&gt; master</pre></div></div>

<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devco.net/archives/2012/04/28/trigger-puppet-runs.php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TweetMasters 1</title>
		<link>http://feedproxy.google.com/~r/KennethKufluk/~3/jcQXhjydmHY/</link>
		<comments>http://feedproxy.google.com/~r/KennethKufluk/~3/jcQXhjydmHY/#comments</comments>
		<pubDate>Fri, 27 Apr 2012 04:21:52 +0000</pubDate>
		<dc:creator>Kenneth</dc:creator>
				<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://kenneth.kufluk.com/blog/?p=1009</guid>
		<description><![CDATA[This was my first ToastMasters speech at Twitter. I ran over time a bit &#8211; I took 20 seconds over my limit of 7 minutes, and would&#8217;ve liked to have gone on a bit longer. I ad-libbed a fair bit. &#8230; <a href="http://kenneth.kufluk.com/blog/2012/04/tweetmasters-1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>This was my first ToastMasters speech at Twitter.  I ran over time a bit &#8211; I took 20 seconds over my limit of 7 minutes, and would&#8217;ve liked to have gone on a bit longer.  I ad-libbed a fair bit. It was good fun. Not sure what to talk about for the next one.</p>
<p>&#8212;</p>
<p>Hello.</p>
<p>This is my icebreaker, so I get the chance to introduce myself.</p>
<p>My name is Kenneth Kufluk. I am one hundred and five years old, and Dick Costolo hasn&#8217;t spoken to me in six months.</p>
<p>But let me start with the name&#8230;</p>
<p>My surname is Kufluk, something I&#8217;ve always had trouble with. It&#8217;s unusual, even in Poland, where it came from.  At school I&#8217;d get endless taunts of &#8220;toughluck kufluk&#8221;, and all sorts of mispronounciations.<br />
One person says &#8220;Kufluk&#8221;, the next says &#8220;Kuflux&#8221;, the next says &#8220;Kooflux&#8221;.<br />
For five years of high school, I had half the school laughing at me for being called &#8220;Cuthbert&#8221;.<br />
But it&#8217;s Kufluk. It&#8217;s always been Kufluk.</p>
<p>Or so I thought.<br />
Last year I published by Grandparent&#8217;s memoirs, and right there, buried in his stories of soviet invasion, cattle trucks and labour camps, and all the horrors of those times, he says that it was originally pronounced &#8220;Kooflook&#8221;. So now we know. I still prefer Kufluk, but I&#8217;m more relaxed about it now.</p>
<p>There&#8217;s nothing relaxed about my first name. It&#8217;s Kenneth. Nobody calls me Ken. Or at least, not twice.</p>
<p>I&#8217;ve been Kenneth my whole life, from when I was born until my 105th birthday this year.</p>
<p>Now I know what you&#8217;re thinking. 105? Is that his real hair? What&#8217;s his secret?<br />
Well, yes, the hair is real. But there&#8217;s a story.</p>
<p>About six years ago I was a different man. Young, full of energy.<br />
I&#8217;d been round the world twice.<br />
I&#8217;d played in unicycle hockey world championships in japan, china and switzerland.<br />
I&#8217;d sprint any distance.<br />
I&#8217;d be out every night at the bar, picking up &#8230; well, picking up pints of beer, if I&#8217;m honest.<br />
I&#8217;d actually been described as &#8220;a coiled spring&#8221;.</p>
<p>And then one summer, I found myself waking up at night with pain in my legs. I&#8217;d just walk it off and go back to bed. I assumed it was too much running.<br />
But then it got worse.<br />
Before long, a three block walk to the shops felt like miles. I&#8217;d come home and lie face-down on the bed, not asleep, but just exhausted.<br />
No more running.<br />
I&#8217;d find myself stopping on the way home from work, unable to go any further, but unable to think of any other way to get home.<br />
This was chronic fatigue, something my &#8220;pull yourself together&#8221; upbringing had never really believed in.</p>
<p>Life got really hard.<br />
I cancelled my first marathon, gave up on buying a house, and postponed my part-time degree.<br />
But I still went to work.</p>
<p>And that was difficult too &#8211; not for exhaustion, but the constant questions &#8220;what did you do last night&#8221;, &#8220;how was your weekend&#8221;. I was face-down in bed at home, thanks for asking.</p>
<p>Little by little, month by month, I got better.<br />
I learned to push through it.<br />
Sometimes it got worse again, but overall I improved.</p>
<p>By the following year, I could get around.<br />
I found that running was somehow easier than walking, and much easier than standing around.<br />
So I entered the marathon again.</p>
<p>It was 26 miles of hard work. But I used what I&#8217;d learned &#8211; that you can push through exhaustion.<br />
And I finished.<br />
And I bought that house, finished that degree, and even proposed to my girlfriend.<br />
But somewhere I&#8217;d still lost about a third of my life.</p>
<p>Five years on, and I&#8217;m cured. I still don&#8217;t like standing up for long stretches, or walking a long way.  It&#8217;s like someone has turned up the gravity.<br />
Some days are better than others. But I&#8217;m ok.<br />
I&#8217;d say it&#8217;s made me feel about five years older.</p>
<p>Which, ok, only makes me about 40.<br />
The real reason I feel 105 is because I have a six month old baby, which means I haven&#8217;t slept properly for, oh, about a year.</p>
<p>And why hasn&#8217;t Dick spoken to me?<br />
Well, maybe it&#8217;s because I named my baby [REACTED].</p>
<p>Or maybe it&#8217;s because we&#8217;ve never actually really met.<br />
One of those. I&#8217;ll never be sure.</p>
<img src="http://feeds.feedburner.com/~r/KennethKufluk/~4/jcQXhjydmHY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://feedproxy.google.com/~r/KennethKufluk/~3/jcQXhjydmHY/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Skewer – a tool for provisioning cloud nodes with Puppet</title>
		<link>http://feedproxy.google.com/~r/TheBuildDoctor/~3/PxWXO70D4cU/</link>
		<comments>http://feedproxy.google.com/~r/TheBuildDoctor/~3/PxWXO70D4cU/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 16:00:39 +0000</pubDate>
		<dc:creator>BuildDoctorSansLinks</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.build-doctor.com/?p=2720</guid>
		<description><![CDATA[Puppet is amazing.  It changed my career (thanks to Luke , and before him Mark).  However, I have some itches.  I have attempted to write about these before, but haven&#8217;t felt like pushing the &#8216;publish&#8217; button. I&#8217;ve been running Puppet in a atypical way for some time now. No Puppet Master No distribution packaging No commit until I [...]<p><a rel="nofollow" target="_blank" href="http://www.build-doctor.com/2012/04/23/skewer/">Skewer &#8211; a tool for provisioning cloud nodes with Puppet</a> is a post from: <a rel="nofollow" target="_blank" href="http://www.build-doctor.com">The Build Doctor</a>.  Sponsored by <a rel="nofollow" target="_blank" href="http://www.anthillpro.com/html/products/anthillpro/default.html?utm_source=doctor&#38;utm_medium=rss&#38;utm_campaign=sponsor">AnthillPro</a>, the build and deployment automation server that lets you release with confidence.</p>]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow"  href="http://puppetlabs.com/puppet/what-is-puppet/">Puppet</a> is amazing.  It changed my career (thanks to <a rel="nofollow"  href="http://madstop.com/">Luke</a> , and before him <a rel="nofollow"  href="http://cfengine.com/markburgess/">Mark</a>).  However, I have some itches.  I have attempted to write about these before, but haven&#8217;t felt like pushing the &#8216;publish&#8217; button.</p>
<p>I&#8217;ve been running Puppet in a atypical way for some time now.</p>
<ul>
<li>No Puppet Master</li>
<li>No distribution packaging</li>
<li>No commit until I know something works</li>
<li>Only test from the outside</li>
</ul>
<p>The only thing I feel I need to expand on is the last: testing.  Obviously if you write Ruby code, <strong>you should rspec the hell out of it</strong>.  But should you test Puppet code?  It&#8217;s mostly a <a rel="nofollow"  href="http://en.wikipedia.org/wiki/Declarative_programming">declarative language</a>.  If you&#8217;re properly declaring the outcomes that you want, then it can be easy.  If too much logic creeps in, you&#8217;re doing it wrong or you should write a function or type &#8211; and <strong>you should rspec the hell out of that</strong>.  This approach has served me for years with decalarative build tools*.</p>
<p>I have no desire to go verify that Puppet does what I tell it.  But I do care about the outcome.  Also, I need to know that it runs on the target platform, as I use a MacBook.</p>
<p>So I wrote <a rel="nofollow"  href="https://github.com/builddoctor/skewer">Skewer</a>.   Skewer&#8217;s only job is to:</p>
<ul>
<li>Provision cloud machines (or connect to existing ones)</li>
<li>Bootstrap Puppet (via shell scripts and rubygems)</li>
<li>Run Puppet</li>
<li>Optionally run <a rel="nofollow"  href="http://cukes.info/">Cucumber</a> features at the end</li>
</ul>
<p>That scratches my itch.  Skewer probably won&#8217;t scratch your itch if you run lots of nodes.  It works on Ubuntu, though adding support for other operating systems wouldn&#8217;t be too hard.  You may also like the <a rel="nofollow"  href="http://docs.puppetlabs.com/guides/cloud_pack_getting_started.html">Puppet Cloud Provisioner</a>.</p>
<p>Skewer evolved from a Rakefile that I used to test my puppet code.  I set out to rewrite it over the Christmas period, and got the last feature passing on Friday.  Like my <a rel="nofollow"  href="http://www.build-doctor.com/2012/03/30/xfd-open-sourced/">other open source project</a>, I learned a lot while doing it.    Skewer has some <a rel="nofollow"  href="https://github.com/builddoctor/skewer/issues">wrinkles</a>, but I use it in my day job, and I&#8217;ve managed to keep that so far.</p>
<p><a rel="nofollow"  href="https://github.com/builddoctor/skewer">https://github.com/builddoctor/skewer</a></p>
<p><a rel="nofollow"  href="http://rubygems.org/gems/skewer">http://rubygems.org/gems/skewer</a></p>
<p>* Okay, I actually do a little bit more.  I use Rake to run<em> puppet parser validate</em> on every .pp file in my project, and I use <a rel="nofollow"  href="https://github.com/rodjek/puppet-lint">puppet-lint</a> to catch howlers.</p>
<p><a rel="nofollow"  href="http://www.build-doctor.com/2012/04/23/skewer/">Skewer &#8211; a tool for provisioning cloud nodes with Puppet</a> is a post from: <a rel="nofollow"  href="http://www.build-doctor.com">The Build Doctor</a>.  Sponsored by <a rel="nofollow"  href="http://www.anthillpro.com/html/products/anthillpro/default.html?utm_source=doctor&utm_medium=rss&utm_campaign=sponsor">AnthillPro</a>, the build and deployment automation server that lets you release with confidence.</p>
<div class="feedflare">
<a rel="nofollow"  href="http://feeds.feedburner.com/~ff/TheBuildDoctor?a=PxWXO70D4cU:fhEVZKAIUEw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/TheBuildDoctor?d=yIl2AUoC8zA" border="0"></a> <a rel="nofollow"  href="http://feeds.feedburner.com/~ff/TheBuildDoctor?a=PxWXO70D4cU:fhEVZKAIUEw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/TheBuildDoctor?i=PxWXO70D4cU:fhEVZKAIUEw:F7zBnMyn0Lo" border="0"></a> <a rel="nofollow"  href="http://feeds.feedburner.com/~ff/TheBuildDoctor?a=PxWXO70D4cU:fhEVZKAIUEw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/TheBuildDoctor?i=PxWXO70D4cU:fhEVZKAIUEw:V_sGLiPBpWU" border="0"></a> <a rel="nofollow"  href="http://feeds.feedburner.com/~ff/TheBuildDoctor?a=PxWXO70D4cU:fhEVZKAIUEw:ZWQ2tSG2k2o"><img src="http://feeds.feedburner.com/~ff/TheBuildDoctor?d=ZWQ2tSG2k2o" border="0"></a> <a rel="nofollow"  href="http://feeds.feedburner.com/~ff/TheBuildDoctor?a=PxWXO70D4cU:fhEVZKAIUEw:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/TheBuildDoctor?d=I9og5sOYxJI" border="0"></a> <a rel="nofollow"  href="http://feeds.feedburner.com/~ff/TheBuildDoctor?a=PxWXO70D4cU:fhEVZKAIUEw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/TheBuildDoctor?i=PxWXO70D4cU:fhEVZKAIUEw:gIN9vFwOqvQ" border="0"></a>
</div><img src="http://feeds.feedburner.com/~r/TheBuildDoctor/~4/PxWXO70D4cU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://feedproxy.google.com/~r/TheBuildDoctor/~3/PxWXO70D4cU/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

