<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

    <title>unethical blogger</title>
 
 <link href="http://unethicalblogger.com/" />
 <updated>2012-05-21T11:50:33-07:00</updated>
 <id>http://unethicalblogger.com/</id>
 <author>
   <name>R. Tyler Croy</name>
   <email>tyler@linux.com</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/UnethicalBlogger" /><feedburner:info uri="unethicalblogger" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>About the Lookout Hackers Blog</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/Cg-SrfUsuvM/lookout-hackers.html" />
   <updated>2012-05-22T00:00:00-07:00</updated>
   <id>http://unethicalblogger.com/2012/05/22/lookout-hackers</id>
   <content type="html">&lt;p&gt;I've neglected cross-posting some of the articles I've written over the past
month or so for the newly inaugurated &lt;a href="http://hackers.mylookout.com/"&gt;Lookout Hackers
blog&lt;/a&gt;. The generally idea of the Hackers blog is
to give Lookout Engineering a bit clearer of a voice and an avenue to publish
blog posts on things that are nitty-gritty and technical.&lt;/p&gt;

&lt;p&gt;A couple of the posts I've written which may interest you are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://hackers.mylookout.com/2012/04/integration-testing-with-foreman"&gt;Integration Testing with Foreman&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;em&gt;At Lookout we find ourselves building more and more APIs and backend
  services these days. Naturally we would like to be certain that everything will
  work fine and dandy once it has been deployed. The reality of building out a
  service-oriented architecture is that you not only have to expect failure to
  happen, you have to plan and test for it.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://hackers.mylookout.com/2012/05/continuous-deployment-for-gems"&gt;Continuous Deployment for Ruby Gems&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;em&gt;With the above workflow and these conventions in place, we’ve reaped a
  couple of benefits, the most obvious one has been the severely reduced time it
  takes for new gems to be created and incorporated into production systems.
  At a higher level, we’ve gained more confidence in our gems with this emphasis
  on testing, traceability and code review baked into the process from the start.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The blog is still fairly young, and we're getting more developers used to
writing blog posts for it. You can subscribe to the &lt;a href="http://feeds.feedburner.com/LookoutHackersBlog"&gt;atom feed
here&lt;/a&gt; or just follow
&lt;a href="https://twitter.com/lookouteng"&gt;@LookoutEng&lt;/a&gt; on Twitter.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VRHw_6Li5mdIZKJi4pAA1jvyAqQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VRHw_6Li5mdIZKJi4pAA1jvyAqQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VRHw_6Li5mdIZKJi4pAA1jvyAqQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VRHw_6Li5mdIZKJi4pAA1jvyAqQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/Cg-SrfUsuvM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/05/22/lookout-hackers.html</feedburner:origLink></entry>
 
 <entry>
   <title>Introducing Blimpy, a cloud thing</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/l2tN-SpDBeU/introducing-blimpy.html" />
   <updated>2012-05-21T00:00:00-07:00</updated>
   <id>http://unethicalblogger.com/2012/05/21/introducing-blimpy</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;DEATH TO VIRTUALBOX&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Phew, okay. With that out of the way, let me tell you about
&lt;a href="https://github.com/rtyler/blimpy#readme"&gt;Blimpy&lt;/a&gt;; a tool that I have written
to make working with "cloud" machines easy as pie.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://strongspace.com/rtyler/public/excelsior.png" align="right"
title="Uh, hello? Airplanes? It's Blimps, you win."/&gt;&lt;/p&gt;

&lt;p&gt;As much as I love my Thinkpad, it's not really suited to heavy virtualization.
Despite having a delightful 8GB handy, it still only has a couple of teeny tiny
CPU cores. What it &lt;em&gt;does&lt;/em&gt; have though, is a nice internet connection to the
CLOUD.&lt;/p&gt;

&lt;p&gt;Blimpy was built to help me take advantage of the plethora of machines that can
be spun up on &lt;a href="http://aws.amazon.com"&gt;AWS&lt;/a&gt; and other public cloud providers.&lt;/p&gt;

&lt;p&gt;My immediate usecase for Blimpy is that I've needed to spin up a machines
rapidly to perform end-to-end testing of
&lt;a href="http://puppetlabs.com/puppet/puppet-open-source/"&gt;Puppet&lt;/a&gt; modules such as
&lt;a href="https://github.com/rtyler/puppet-jenkins"&gt;puppet-jenkins&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Below is a screencast of using Blimpy to validate the module:&lt;/p&gt;

&lt;center&gt;&lt;iframe width="640" height="480"
src="https://www.youtube-nocookie.com/embed/ub8V_TbYEE8?rel=0" frameborder="0"
allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;


&lt;p&gt;This was done with a simple Blimpfile:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; Blimpy.fleet do |fleet|
   fleet.add(:aws) do |ship|
     ship.name = 'puppet-jenkins'
     ship.ports = [22, 8080]
     ship.livery = :cwd
     ship.flavor = 'm1.large'
   end
 end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Blimpy is structured to make it easy to spin up multiple machines at once, in
this case however I'm only going to spin up a single machine (defaulted to
Ubuntu 10.04 64-bit in US West 2), of the "m1.large" flavor. Jenkins is a
hungry application, so I'm not going to use the default "t1.micro" flavor.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Blimpfile&lt;/code&gt; also specifies that port 8080 should be opened, and will create
a special Blimpy security group in AWS that properly allows ports 22 and 8080
through.&lt;/p&gt;

&lt;p&gt;The project is still fairly young, but reasonably well tested (in my opinion)
Ruby code, all of which can &lt;a href="https://github.com/rtyler/blimpy#readme"&gt;be found on
GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qmiB0g_AdIpAm9jWdr6_GIlqjoM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qmiB0g_AdIpAm9jWdr6_GIlqjoM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qmiB0g_AdIpAm9jWdr6_GIlqjoM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qmiB0g_AdIpAm9jWdr6_GIlqjoM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/l2tN-SpDBeU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/05/21/introducing-blimpy.html</feedburner:origLink></entry>
 
 <entry>
   <title>Today's Meatspace Hack</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/EUdGc-z9Ams/todays-meatspace-hack.html" />
   <updated>2012-05-12T00:00:00-07:00</updated>
   <id>http://unethicalblogger.com/2012/05/12/todays-meatspace-hack</id>
   <content type="html">&lt;!-- humblebrag --&gt;


&lt;p&gt;I always delight in finding clever little solutions to real world problems that
I have, the image below is a good example.&lt;/p&gt;

&lt;p&gt;I walked inside from our front door and noticed that there was a bit of cool
air coming through the door frame. Unlike our last apartment, which simply had
piss-poor insulation, this door frame has proper insulation around the edges,
but the door was not pressing against it.&lt;/p&gt;

&lt;p&gt;A little piece of cardboard moving box, combined with some slicing from my
leatherman, and tada! When the door is locked it will press against the frame,
keeping our place a little warmer at night.&lt;/p&gt;

&lt;center&gt;
&lt;a href="http://www.flickr.com/photos/agentdero/7185668666/" title="Today's
Meatspace Hack by agentdero, on Flickr"&gt;&lt;img
src="http://farm9.staticflickr.com/8009/7185668666_de2853b9cc.jpg" width="376"
height="500" alt="Today's Meatspace Hack"&gt;&lt;/a&gt;
&lt;/center&gt;


&lt;p&gt;(The piece is pulled out a little from the lock for the photo op)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UiEgLPADdZrwoxhR5lAsyl2Ofeo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UiEgLPADdZrwoxhR5lAsyl2Ofeo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UiEgLPADdZrwoxhR5lAsyl2Ofeo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UiEgLPADdZrwoxhR5lAsyl2Ofeo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/EUdGc-z9Ams" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/05/12/todays-meatspace-hack.html</feedburner:origLink></entry>
 
 <entry>
   <title>Breaking up with Dane</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/raFyR6whvno/breaking-up-with-dane.html" />
   <updated>2012-05-07T00:00:00-07:00</updated>
   <id>http://unethicalblogger.com/2012/05/07/breaking-up-with-dane</id>
   <content type="html">&lt;p&gt;For a &lt;em&gt;long&lt;/em&gt; time I've been a staunch supporter and happy customer of
&lt;a href="http://www.sonic.net"&gt;Sonic.net&lt;/a&gt;, the scrappy Bay Area internet service
provider that has recently started kicking ass, laying fiber, and embarrassing
bigger ISPs.&lt;/p&gt;

&lt;p&gt;As of this past Sunday, only half of that is true. After a few happy years of Sonic.net
DSL, I had to leave Sonic.net. I think they're taking the break-up &lt;em&gt;okay&lt;/em&gt;.&lt;/p&gt;

&lt;h4&gt;Backstory&lt;/h4&gt;

&lt;p&gt;A couple years ago I moved to sunny Berkeley, California. The rent in San
Francisco was just &lt;a href="http://knowyourmeme.com/memes/the-rent-is-too-damn-high-jimmy-mcmillan"&gt;too damn
high&lt;/a&gt;,
and I discovered that almost everything I loved about the Haight district was
to be found in Berkeley. The "internet situation" in Berkeley leaves much to be
desired though, unlike
&lt;a href="http://corp.sonic.net/ceo/2012/03/02/sebastopol-fiber-update/"&gt;Sebastapol&lt;/a&gt; or
certain areas of &lt;a href="http://corp.sonic.net/ceo/2011/12/15/sonic-net-plans-gigabit-fiber-network-in-san-francisco-release/"&gt;San
Francisco&lt;/a&gt;,
my favorite ISP isn't really paying attention to Berkeley.&lt;/p&gt;

&lt;p&gt;It's not just my favorite ISP either, neither AT&amp;amp;T nor Comcast seems to give a
damn about my cozy little &lt;a href="https://en.wikipedia.org/wiki/Hayward_Fault_Zone"&gt;earthquake death
trap&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What's a guy to do?&lt;/p&gt;

&lt;p&gt;I suffered for a couple years with sub-6Mbps speeds, but with my most recent
move, my distance from the nearest
&lt;a href="https://en.wikipedia.org/wiki/Digital_subscriber_line#Typical_setup"&gt;CO&lt;/a&gt;
would have put me in the low-4Mbps range which is simply unbearable.&lt;/p&gt;

&lt;p&gt;Sure, things like an IPSec VPN service, "unsupported" IPv6 tunneling, stellar customer support, an
&lt;a href="https://twitter.com/dane"&gt;engaging and receptive CEO&lt;/a&gt;, plans for building a
next-generation fiber-to-the-home network, and many others, they're great and
all. That still doesn't make up for the fact that my wife can't watch
streaming bootlegs of "Toddler's and Tiaras" while I &lt;a href="/2012/02/08/puppet-xml-a-brand-new-synergy.html"&gt;work on serious
business&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It's not me, it's you.&lt;/p&gt;

&lt;h4&gt;Something new&lt;/h4&gt;

&lt;p&gt;Interestingly enough Sonic.net CEO Dane Jasper gave me the idea to look into a
wireless broadband provider with his post: "&lt;a href="http://corp.sonic.net/ceo/2012/04/04/i-hate-wireless/"&gt;I hate
wireless&lt;/a&gt;." After some
digging, I discovered &lt;a href="http://www.unwiredltd.com/"&gt;Unwired Ltd&lt;/a&gt;, and
Berkeley-based company offering wireless broadband, if you're lucky enough to
have line-of-sight.&lt;/p&gt;

&lt;p&gt;Turns out, I'm lucky enough!&lt;/p&gt;

&lt;p&gt;When I found out Unwired had (great) line of sight to the top of my new house
in Berkeley, I asked for "the most." I didn't care so much about the cost, I
cared about getting the most damn speed I could possible achieve with the
microwave link. "Most" ends up costing about $130/month, about $40 more than my
last Sonic.net bill was, with 14Mbps down/8Mbps up (burstable, I know the
caveat here).&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;I will continue to cheer Sonic.net on, with their plans to lay fiber
in select parts of the bay area. If they ever decide to drop fiber in Berkeley, which
would be &lt;em&gt;very&lt;/em&gt; surprising, then I will gladly sign up. Until then, I will be
trying out this newfangled wireless broadband.&lt;/p&gt;

&lt;p&gt;You broke my heart Sonic.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/F_nejtVc1rcIRfmxuHFnRcKX4yw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F_nejtVc1rcIRfmxuHFnRcKX4yw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/F_nejtVc1rcIRfmxuHFnRcKX4yw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F_nejtVc1rcIRfmxuHFnRcKX4yw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/raFyR6whvno" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/05/07/breaking-up-with-dane.html</feedburner:origLink></entry>
 
 <entry>
   <title>My bio according to Thomson</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/WCUo-9Yp-Ro/my-biography-according-to.html" />
   <updated>2012-04-10T00:00:00-07:00</updated>
   <id>http://unethicalblogger.com/2012/04/10/my-biography-according-to</id>
   <content type="html">&lt;p&gt;For an upcoming internal tech-talk that I will be giving titled "Amber:
Smalltalk in your browser, or, Tyler is a hypocrite."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/itsthomson"&gt;Thomson&lt;/a&gt;, an esteemed colleague, tech talk organizer, and by far the hardest
working Filipino I know, sent out the following bio attached to the meeting
invite:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;A decorated veteran of two wars (the Korean War and the War on Drugs), R.
Tyler Croy is an Infrastructure engineer at Lookout, bringing with him decades
of obscure programming language experience. Previously at Apture (and before
that, Slide), Croy has now avoided working for Google as the result of an
acqui-hire twice (and counting). At Lookout, he is responsible for ensuring the
fidelity of our server infrastructure, and as such possesses an extensive duct
tape library under his desk. Croy is a graduate of the school of hard-knocks
and speaks five languages (four of which exist solely on the internet). He is
originally from Texas (which explains his casual, laconic southern drawl), and
enjoys mint juleps, stealing road dots off of the highway, and yelling at folks
to get off his lawn. He currently lives in Vallejo with his wife, two cats, and
pet charizard.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;He knows me so well.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ysc4f8WNH10qq30uZwYIuw28uEA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ysc4f8WNH10qq30uZwYIuw28uEA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ysc4f8WNH10qq30uZwYIuw28uEA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ysc4f8WNH10qq30uZwYIuw28uEA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/WCUo-9Yp-Ro" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/04/10/my-biography-according-to.html</feedburner:origLink></entry>
 
 <entry>
   <title>Live Coding with ffmpeg and justin.tv</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/cYHBv0jo9Oo/live-coding-with-ffmpeg.html" />
   <updated>2012-04-04T00:00:00-07:00</updated>
   <id>http://unethicalblogger.com/2012/04/04/live-coding-with-ffmpeg</id>
   <content type="html">&lt;p&gt;Recently I've been experimenting with operating a live coding stream of my
desktop. What this means in practice is that I focus on a single project or set
of tasks for an hour or two, while streaming everything I do to my &lt;a href="http://justin.tv/agentdero"&gt;channel on
justin.tv&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here's a boring demonstration:&lt;/p&gt;

&lt;center&gt;
&lt;object type="application/x-shockwave-flash" height="300" width="400" id="clip_embed_player_flash" data="http://www.justin.tv/widgets/archive_embed_player.swf" bgcolor="#000000"&gt;&lt;param name="movie" value="http://www.justin.tv/widgets/archive_embed_player.swf" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="allowNetworking" value="all" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="flashvars" value="auto_play=false&amp;start_volume=25&amp;title=Demonstration of live coding&amp;channel=agentdero&amp;archive_id=313873687" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.justin.tv/agentdero#r=-rid-&amp;amp;s=em" class="trk" style="padding:2px 0px 4px; display:block; width: 320px; font-weight:normal; font-size:10px; text-decoration:underline; text-align:center;"&gt;Watch live video from Live coding with @agentdero on Justin.tv&lt;/a&gt;
&lt;/center&gt;


&lt;p&gt;I'll save my thoughts on how the experiment is going for a later blog post, in
this post I just wanted to share the &lt;strong&gt;how&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;First I use this &lt;code&gt;~/bin/screenstream&lt;/code&gt; script:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/sh -xe

INFO=$(xwininfo -frame)
API_KEY="YOUR_API_KEY_GOES_HERE"

WIN_GEO=$(echo $INFO | grep -oEe 'geometry [0-9]+x[0-9]+' | grep -oEe '[0-9]+x[0-9]+')
WIN_XY=$(echo $INFO | grep -oEe 'Corners:\s+\+[0-9]+\+[0-9]+' | grep -oEe '[0-9]+\+[0-9]+' | sed -e 's/\+/,/' )
FPS="15"

INRES='1680x1010'
OUTRES='1280x720'

ffmpeg -f x11grab -s "$INRES" -r "$FPS" -i :0.0+$WIN_XY \
    -f alsa -ac 2 -i default -vcodec libx264  -s "$OUTRES"  \
    -acodec libmp3lame -ab 128k -ar 44100 -threads 0 \
    -f flv "rtmp://live.justin.tv/app/$API_KEY"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There's a couple important things to mention about this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;xwininfo&lt;/code&gt; invocation just gives me a cross-hairs cursor so I can select which window area I want to record. This doesn't technically restrict &lt;code&gt;ffmpeg(1)&lt;/code&gt; to just that window, rather it just grabs the offset from the window and uses those.&lt;/li&gt;
&lt;li&gt;The segment: &lt;code&gt;-f alsa -ac 2 -i default&lt;/code&gt; pertains to the audio input. According to &lt;code&gt;arecord -L&lt;/code&gt;, the pulse audio sink I should use is called "default", on some machines it might be called "pulse", your mileage may vary.&lt;/li&gt;
&lt;li&gt;I use the &lt;code&gt;pavucontrol&lt;/code&gt; (GUI) tool to direct my audio out to the pulseaudio input, this allows me to share what I'm listening to with whoever is watching the stream.&lt;/li&gt;
&lt;li&gt;You'll notice the &lt;code&gt;$INRES&lt;/code&gt; and &lt;code&gt;$OUTRES&lt;/code&gt; parameters, I am techically live-resizing the video on the fly, which takes up a lot of CPU power, you may or may not want to do this depending on your machine speed, size of your screen and the amount of desktop space you want to stream.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;That's about all there is too it, I wish I could either take credit for the
script or at least attribute it, but I can do neither because I found it on a
forum some where and then quickly lost the link. Whoops.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dVajf65c0qf9CXuh1uC1456Ewdo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dVajf65c0qf9CXuh1uC1456Ewdo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dVajf65c0qf9CXuh1uC1456Ewdo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dVajf65c0qf9CXuh1uC1456Ewdo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/cYHBv0jo9Oo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/04/04/live-coding-with-ffmpeg.html</feedburner:origLink></entry>
 
 <entry>
   <title>You funny guy</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/h_XIJDef-NQ/you-funny-guy.html" />
   <updated>2012-03-15T00:00:00-07:00</updated>
   <id>http://unethicalblogger.com/2012/03/15/you-funny-guy</id>
   <content type="html">&lt;p&gt;Earlier this week, my only grandfather died.&lt;/p&gt;

&lt;p&gt;He had lived a rather long time, and was ready for a rest, so nothing to really
be sad about.&lt;/p&gt;

&lt;p&gt;I did want to share some anecdotes about my last visit with him:&lt;/p&gt;

&lt;h4&gt;Anecdote 1&lt;/h4&gt;

&lt;p&gt;While my wife and I were hanging out in the hospital room with him, a day nurse
came in to take his temperature and blood pressure, standard fare. After
gingerly wrapping his left arm and pumping up the arm-squeezer-contraption, the
machine fails to make a reading.&lt;/p&gt;

&lt;p&gt;The nurse tries again, same result.&lt;/p&gt;

&lt;p&gt;She switches to his right arm, tries again and fails to get a blood pressure
reading again.&lt;/p&gt;

&lt;p&gt;My grandpa deadpans "&lt;em&gt;maybe I'm dead&lt;/em&gt;" making the nurse visibly uncomfortable,
while shooting my wife and I a wry smile while she's looking away nervously.&lt;/p&gt;

&lt;h4&gt;Anecdote 2&lt;/h4&gt;

&lt;p&gt;Grandpa wasn't terribly pleased with the food and level of service at the
hospital. He was incredulous after being given diet chocolate pudding,
remarking "what the hell is the point?"&lt;/p&gt;

&lt;p&gt;On another occasion, after waiting a rather long time to receive a bottle of
grape juice from a nurse, he snarked "..did you have to stomp them yourself?"&lt;/p&gt;

&lt;p&gt;He made up for his smart-ass remarks with his typical flirting and sweet
talking. Having been married three times (outlived two wives, divorced the
third), my grandpa had more game on his deathbed than I have had at any point
in time.&lt;/p&gt;

&lt;h4&gt;Anecdote 3&lt;/h4&gt;

&lt;p&gt;With his mobility drastically reduced, he relied on family members to bring the
cup of soda or juice to him when he was thirsty.&lt;/p&gt;

&lt;p&gt;After not being able to perform the drink-duty to his satisfaction, he said
"as a grandson, you've done great; as a nurse, well..." He then just asked one
of my aunts to perform the duty.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Grandpa was a funny guy.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jzSREMX5NS1Eyy4cKCwZBEue4SI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jzSREMX5NS1Eyy4cKCwZBEue4SI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jzSREMX5NS1Eyy4cKCwZBEue4SI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jzSREMX5NS1Eyy4cKCwZBEue4SI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/h_XIJDef-NQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/03/15/you-funny-guy.html</feedburner:origLink></entry>
 
 <entry>
   <title>Vagrant plugin for Jenkins in action</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/VSoqKx3cUDQ/vagrant-plugin-in-action.html" />
   <updated>2012-03-13T00:00:00-07:00</updated>
   <id>http://unethicalblogger.com/2012/03/13/vagrant-plugin-in-action</id>
   <content type="html">&lt;p&gt;Since the Jenkins update center is taking a little bit longer to propogate the
release of the &lt;a href="/2012/03/13/introducing-the-vagrant-plugin.html"&gt;Vagrant plugin for
Jenkins&lt;/a&gt;, I figured I'd create
a little demonstration for you.&lt;/p&gt;

&lt;p&gt;The demo is from a running development environment I have locally, but once the
v0.1.2 version of the plugin is available in the update center, all of this
will work for you as well.&lt;/p&gt;

&lt;center&gt;&lt;iframe width="640" height="360"
src="https://www.youtube-nocookie.com/embed/2o590cmra0g" frameborder="0"
allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;


&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3oWonGdHJQEkAKwGoNqikFgYoy8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3oWonGdHJQEkAKwGoNqikFgYoy8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3oWonGdHJQEkAKwGoNqikFgYoy8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3oWonGdHJQEkAKwGoNqikFgYoy8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/VSoqKx3cUDQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/03/13/vagrant-plugin-in-action.html</feedburner:origLink></entry>
 
 <entry>
   <title>Introducing the Vagrant plugin for Jenkins</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/d50DhDdUTsw/introducing-the-vagrant-plugin.html" />
   <updated>2012-03-13T00:00:00-07:00</updated>
   <id>http://unethicalblogger.com/2012/03/13/introducing-the-vagrant-plugin</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Look! A &lt;a href="http://unethicalblogger.com/2012/03/13/vagrant-plugin-in-action.html"&gt;screencast of the plugin in
action!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The impossible has happened. Not only have I written a plugin for Jenkins, I've
&lt;em&gt;released&lt;/em&gt; it. An event I've long avoided has finally come to pass, mostly
thanks to the fantastic &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+plugin+development+in+Ruby"&gt;Ruby plugin development
support&lt;/a&gt;
developed largley by &lt;a href="https://github.com/cowboyd"&gt;Charles Lowell&lt;/a&gt;.&lt;/p&gt;

&lt;center&gt;&lt;img
src="http://agentdero.cachefly.net/scratch/vagrant-plugin-0.0.3.png"
alt="Vagrant plugin"/&gt;&lt;/center&gt;


&lt;p&gt;The Vagrant plugin is still fairly new, and "beta" tested. Thus far I've
modeled it after the fantastic &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Android+Emulator+Plugin"&gt;Android Emulator
plugin&lt;/a&gt; in
that it will bring up a Vagrant VM for the duration of the job, and then
destroy it afterwards.&lt;/p&gt;

&lt;p&gt;As you can see, the Vagrant plugin adds a couple new build steps to the
configure page. One thing to note is that the
&lt;a href="http://vagrantup.com/docs/provisioners.html"&gt;provisioning&lt;/a&gt; is operated as a
separate step, instead of bundled in with the boot of the Vagrant machine. This
is purposeful, to allow any additional set up of the environment prior to
running Puppet or Chef.&lt;/p&gt;

&lt;p&gt;The plugin does of course expect that you have a functional VirtualBox
environment on the slave you're running the job on, if you don't, Vagrant will
explode with a fantastic stack-trace and probably burn your house down.&lt;/p&gt;

&lt;h4&gt;In the near future&lt;/h4&gt;

&lt;p&gt;I'm thinking about bundling
&lt;a href="https://github.com/t9md/vagrant-snap"&gt;vagrant-snap&lt;/a&gt; with the plugin to allow
fancy snapshotting support, but I'm not sure of a good definite usecase for
that just yet.&lt;/p&gt;

&lt;p&gt;If there's anything you'd like to see, please file a request on the &lt;a href="https://github.com/rtyler/vagrant-plugin/issues"&gt;GitHub
issues page&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;You can find the plugin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;in your Jenkins "Manage Plugins" page :)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rtyler/vagrant-plugin"&gt;on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Vagrant+Plugin"&gt;on the Jenkins wiki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Enjoy!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Be sure to grab version 0.1.2 or later!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/c1E2o2MltdrzjdoKsQcXKCrW2yY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c1E2o2MltdrzjdoKsQcXKCrW2yY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/c1E2o2MltdrzjdoKsQcXKCrW2yY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c1E2o2MltdrzjdoKsQcXKCrW2yY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/d50DhDdUTsw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/03/13/introducing-the-vagrant-plugin.html</feedburner:origLink></entry>
 
 <entry>
   <title>Master Logician</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/jIcny8G0obA/master-logician.html" />
   <updated>2012-02-18T00:00:00-08:00</updated>
   <id>http://unethicalblogger.com/2012/02/18/master-logician</id>
   <content type="html">&lt;p&gt;Shortly before &lt;a href="/2012/01/31/be-there-sunday-at-fosdem.html"&gt;departing for
FOSDEM&lt;/a&gt;, I dropped my car at the
mechanic's to fix an engine issue. Some number of weeks later, I finally was
able to pick the vehicle up today, fully repaired and ready to undergo further
damage at the hands of yours truly.&lt;/p&gt;

&lt;p&gt;Earlier this week I called the shop, after not having heard from them for
a couple weeks, wondering what the status of the repair was. The mechanic's
response was something along the lines of:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;"&lt;em&gt;Oh yeah, we tried to call you but the number was busy or something every
time. Anyways, your car needs a new flux capac..&lt;/em&gt;"&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;"Well, I was out of the country" I thought, my line had effectively been
disconnected, so I suppose that's what the mechanic had experienced when he
tried to contact me. Something still seemed a little fishy to me.&lt;/p&gt;

&lt;p&gt;Before hanging up the phone, I asked him what phone number he had for me, just
to make sure they could contact me again after they made a few further repairs:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;"&lt;em&gt;Uh let's see here, 475-7..&lt;/em&gt;"&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;If you're a bay area resident you can see the problem, the area code is
4&lt;strong&gt;1&lt;/strong&gt;5, not 475.&lt;/p&gt;

&lt;p&gt;Simple enough of a mistake , but what really bothered me
about the mistake was that it seems (to me) so obvious or clear to resolve. In
fact one simple hypothesis ("this is probably a wrong number") and an experiment
("what if I call 415-etc") would have saved over a week of time spent "in
limbo."&lt;/p&gt;

&lt;p&gt;Like most city garages, this place is certainly limited for space to store cars
that are either waiting to be fixed or waiting to be picked up. I've also been
to this mechanic three or four times now, so they've previously been able to
reach me. On top of that, area code 475 is in Connecticut of all places; this
mechanic is good, but not good enough to justify that kind of commute.&lt;/p&gt;

&lt;p&gt;A little skepticism would have cut the amount of time the car spent in the shop
from 3 weeks to about 4 days.&lt;/p&gt;

&lt;p&gt;I'm clearly obsessing a little too much over this minor inconvenience.&lt;/p&gt;

&lt;p&gt;Sometimes I need to be reminded that perhaps everybody doesn't think like me,
doesn't question or care about every little detail in the same way that I
might.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-SXf7EaM9GqR11lZwpGuOeOBCyY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-SXf7EaM9GqR11lZwpGuOeOBCyY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-SXf7EaM9GqR11lZwpGuOeOBCyY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-SXf7EaM9GqR11lZwpGuOeOBCyY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/jIcny8G0obA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/02/18/master-logician.html</feedburner:origLink></entry>
 
 <entry>
   <title>FOSDEM: Slides from my talk</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/C9gqrx44RoU/fosdem-slides.html" />
   <updated>2012-02-10T00:00:00-08:00</updated>
   <id>http://unethicalblogger.com/2012/02/10/fosdem-slides</id>
   <content type="html">&lt;p&gt;I was fortunate enough to &lt;a href="/2011/12/20/speaking-at-fosdem.html"&gt;give a talk&lt;/a&gt; in
the "Configuration and Systems Management dev room" this year at
&lt;a href="http://www.fosdem.org"&gt;FOSDEM&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After some initial frustrations with LibreOffice Impress, I decided to take a
slightly unorthodox route in creating my presentation slides. Unfortunately
this route means that I do not have any accompanying notes to offer you
alongside the slide deck.&lt;/p&gt;

&lt;center&gt;&lt;img
src="http://agentdero.cachefly.net/unethicalblogger.com/images/fosdem2012_first_slide.jpg"
alt="My first slide"/&gt;&lt;br/&gt;&lt;em&gt;Image courtesy of &lt;a
href="https://twitter.com/nigelkersten"&gt;Nigel Kersten&lt;/a&gt;&lt;/em&gt;&lt;/center&gt;


&lt;p&gt;If a video becomes available, i'll make sure to post that, but as it stands
now, I'm not 100% sure what I said!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.strongspace.com/rtyler/public/Open-Source-Infra_FOSDEM.pdf"&gt;Slides
(PDF)&lt;/a&gt;&lt;/strong&gt; (rotate the slides in your PDF viewer)&lt;/p&gt;

&lt;p&gt;Here's a photo of one of my originals, which I had to bring with me just in
case. That's real printer paper with real felt-tip pen, yeah.&lt;/p&gt;

&lt;center&gt;&lt;img
src="http://agentdero.cachefly.net/unethicalblogger.com/images/fosdem2012_slide_original.jpg"
alt="Hardcopy"/&gt;&lt;br/&gt;&lt;em&gt;Image courtesy of &lt;a
href="https://twitter.com/nigelkersten"&gt;Nigel Kersten&lt;/a&gt;&lt;/em&gt;&lt;/center&gt;


&lt;p&gt;Giving the talk was a blast, the whole event was fantastic, I can't recommend it
enough. I look forward to coming back to Brussels next year for FOSDEM, and I
hope to see you there!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iZcBv6RtorZGeguTfJtr5tavMi8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iZcBv6RtorZGeguTfJtr5tavMi8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iZcBv6RtorZGeguTfJtr5tavMi8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iZcBv6RtorZGeguTfJtr5tavMi8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/C9gqrx44RoU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/02/10/fosdem-slides.html</feedburner:origLink></entry>
 
 <entry>
   <title>FOSDEM: Smalltalk Pairing</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/zIOT6PzKmmw/fosdem-smalltalk-pairing.html" />
   <updated>2012-02-09T00:00:00-08:00</updated>
   <id>http://unethicalblogger.com/2012/02/09/fosdem-smalltalk-pairing</id>
   <content type="html">&lt;p&gt;As I &lt;a href="/2012/01/14/realtalk.html"&gt;previously mentioned&lt;/a&gt;, I've been learning
Smalltalk lately, in an attempt the understand the language that inspired two
of my other favorite languages: Objective-C and Ruby.&lt;/p&gt;

&lt;p&gt;This past weekend at FOSDEM, I was fortunate enough to attend a few sessions in
the "Smalltalk devroom", which from my understanding made its debut appearance
at this year's conference. I'll save my thoughts on
&lt;a href="http://www.amber-lang.net"&gt;Amber.js&lt;/a&gt; for another time, but in this post I
wanted to talk about the Smalltalk Workshop which was held at the end of the
day.&lt;/p&gt;

&lt;p&gt;One of my major stumbling blocks with Smalltalk has been general unfamiliarity
with the development environment, the workshop was the &lt;em&gt;perfect&lt;/em&gt; opportunity to
resolve some of this. The structure was to pair one experienced Smalltalker
with one noob, and for both to work through a pre-planned exercise with an
existing image and application set up.&lt;/p&gt;

&lt;center&gt;&lt;a
href="http://www.a3aan.st/fosdem2012/index.php/view/23/01+DevRoom/IMG_6452.JPG" target="_blank"&gt;&lt;img
src="http://agentdero.cachefly.net/unethicalblogger.com/images/pairing-on-smalltalk-at-fosdem.JPG" alt="Pairing on Smalltalk" width="500"/&gt;&lt;/a&gt;&lt;br/&gt;&lt;em&gt;Haxx haxx haxx&lt;/em&gt; (Photo courtesy of Adriaan van Os)&lt;/center&gt;


&lt;p&gt;While my partner (Norbert) and I did not complete all the exercises, we did
spend a good amount of time discussing and working through the "Smalltalk way",
or at least Norbert's Smalltalk way, of solving particular problems,
refactoring and method structure.&lt;/p&gt;

&lt;p&gt;One of the things that struck me as we worked through the exercises was how
small the ideal method body is for most things in Smalltalk. I don't think
there was a single method that was longer than 10 lines, except for some test
methods which certainly had a bad code smell.&lt;/p&gt;

&lt;p&gt;Below is a sample of one of the longest methods I wrote in the entire workshop:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;vote: aVote for: aUser
  author ~= aUser ifTrue: [
    self votes
      detect: [ :vote | vote author = aUser and: [ vote direction = aVote direction]]
      ifNone: [ self votes add: aVote ]]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I'm quite happy with the way things turned out, while I didn't anything I
didn't know already about &lt;a href="http://www.seaside.st"&gt;Seaside&lt;/a&gt;, I did learn a &lt;em&gt;lot&lt;/em&gt;
about using the development environment effectively and test-driven development
"the Smalltalk way" which as it turns out is quite impressive.&lt;/p&gt;

&lt;p&gt;I'm looking forward to learning more about the ways of the
&lt;a href="http://www.pharo-project.org"&gt;Pharo&lt;/a&gt;, maybe next year I'll count as one of the
experienced Smalltalkers.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mnh1wU079fe3-HSNND9HkRtEi0o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mnh1wU079fe3-HSNND9HkRtEi0o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mnh1wU079fe3-HSNND9HkRtEi0o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mnh1wU079fe3-HSNND9HkRtEi0o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/zIOT6PzKmmw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/02/09/fosdem-smalltalk-pairing.html</feedburner:origLink></entry>
 
 <entry>
   <title>Puppet/XML: A Brand New Synergy</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/OlIIBKlKspE/puppet-xml-a-brand-new-synergy.html" />
   <updated>2012-02-08T00:00:00-08:00</updated>
   <id>http://unethicalblogger.com/2012/02/08/puppet-xml-a-brand-new-synergy</id>
   <content type="html">&lt;p&gt;During on of the last talks of the last day of &lt;a href="http://www.fosdem.org"&gt;FOSDEM&lt;/a&gt;,
some person asked in one of the tracks (paraphrased):&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;"&lt;em&gt;Why do we need tools like Puppet or Chef when we have XML?&lt;/em&gt;"&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;This question was relayed to me second-hand, so I apologize if I'm butchering
it. The question itself is so mind-boggling that I can only assume one of three
things about the asker:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;He/she is a rather talented troll&lt;/li&gt;
&lt;li&gt;He/she has some crucial misunderstandings about configuration management, in
which case I'm hoping somebody politely explained things.&lt;/li&gt;
&lt;li&gt;He/she understands CM but has a serious fetish for XML.&lt;/li&gt;
&lt;/ul&gt;


&lt;hr /&gt;

&lt;p&gt;Regardless of their intention, I have them to thank for inspiring what might
be the innovation breakthrough of 2012:&lt;/p&gt;

&lt;h3&gt;Puppet/XML&lt;/h3&gt;

&lt;p&gt;I've long found Puppet's DSL syntax to be too sparse, easy to type and
semantically boring, take for example this block:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class users {
    group {
        "tyler" :
            ensure =&amp;gt; present;
    }
    user {
        "tyler" :
            require =&amp;gt; Group["tyler"],
            ensure  =&amp;gt; present;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;How terrible! Let's turn that into &lt;strong&gt;Puppet/XML!&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;puppet&amp;gt;
    &amp;lt;classes&amp;gt;
        &amp;lt;class name="users"&amp;gt;
            &amp;lt;resources&amp;gt;
                &amp;lt;group name="tyler"&amp;gt;
                    &amp;lt;ensure&amp;gt;present&amp;lt;/ensure&amp;gt;
                &amp;lt;/group&amp;gt;
                &amp;lt;user name="tyler"&amp;gt;
                    &amp;lt;requires&amp;gt;
                        &amp;lt;require&amp;gt;Group["tyler"]&amp;lt;/require&amp;gt;
                    &amp;lt;/requires&amp;gt;
                    &amp;lt;ensure&amp;gt;present&amp;lt;/ensure&amp;gt;
                &amp;lt;/user&amp;gt;
            &amp;lt;/resources&amp;gt;
        &amp;lt;/class&amp;gt;
    &amp;lt;/classes&amp;gt;
&amp;lt;/puppet&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Not only is that easier to understand, it's more enterprise ready!&lt;/p&gt;

&lt;p&gt;Currently &lt;strong&gt;Puppet/XML&lt;/strong&gt; is in pre-alpha and in &lt;a href="https://github.com/rtyler/puppet/tree/puppetxml"&gt;this repository on
GitHub&lt;/a&gt;. Thus far it's only
been tested with &lt;code&gt;puppet apply&lt;/code&gt; (i.e. standalone mode) under
&lt;a href="http://www.vagrantup.com"&gt;Vagrant&lt;/a&gt;, an example run is below:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[default] Running Puppet with /tmp/vagrant-puppet/manifests/base.ppx...
stdin: is not a tty
Thanks for using Puppet/XML - A brand new synergy

info: Retrieving plugin
info: Applying configuration version '1328719113'
notice: /Stage[main]/Users/User[tyler]/ensure: created
notice: /Stage[main]//Node[default]/Group[puppet]/ensure: created
info: Creating state file /var/lib/puppet/state/state.yaml
notice: Finished catalog run in 0.62 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Stay tuned for new innovations and more middleware that your enterprise can
leverage to help meet your business objectives.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Disclaimer:&lt;/em&gt;&lt;/strong&gt; Unfortunately the code currently relies on transcribing the
Puppet/XML to Puppet's "native" DSL, this means more complex things like
conditionals and function calls are not yet supported. After spending about an
hour and a half trying to generate the appropriate &lt;code&gt;Puppet::AST&lt;/code&gt; structures, I
gave up and went the route which guaranteed lulz sooner.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/saKuqRlX2cybN7QYDZFImRYczVo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/saKuqRlX2cybN7QYDZFImRYczVo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/saKuqRlX2cybN7QYDZFImRYczVo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/saKuqRlX2cybN7QYDZFImRYczVo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/OlIIBKlKspE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/02/08/puppet-xml-a-brand-new-synergy.html</feedburner:origLink></entry>
 
 <entry>
   <title>Happy 1st Birthday Jenkins!</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/inHB6OmZJGM/happy-birthday-jenkins.html" />
   <updated>2012-02-02T00:00:00-08:00</updated>
   <id>http://unethicalblogger.com/2012/02/02/happy-birthday-jenkins</id>
   <content type="html">&lt;p&gt;It's officially been &lt;a href="http://jenkins-ci.org/content/happy-birthday-jenkins"&gt;a year since the first release of
Jenkins&lt;/a&gt; went public, and
my what a year.&lt;/p&gt;

&lt;p&gt;I'm writing this quick post while waiting at the airport to go to
&lt;a href="http://fosdem.org"&gt;FOSDEM&lt;/a&gt; to talk about Jenkins and some of the work that
we've been doing. This comes two weeks after &lt;a href="http://jenkins-ci.org/event/jenkins-scale-10x-los-angeles"&gt;going to
SCALE10x&lt;/a&gt; to
advocate and talk to people about Jenkins there.&lt;/p&gt;

&lt;p&gt;I am immensely proud of the work everybody in the Jenkins community has done,
and happy to be a part of one of the most welcoming groups of open source
enthusiasts that I've seen yet.&lt;/p&gt;

&lt;p&gt;Looking forward to way year number two brings for the project!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GySxrkWml_hPOQo0yITBODdDCv8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GySxrkWml_hPOQo0yITBODdDCv8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GySxrkWml_hPOQo0yITBODdDCv8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GySxrkWml_hPOQo0yITBODdDCv8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/inHB6OmZJGM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/02/02/happy-birthday-jenkins.html</feedburner:origLink></entry>
 
 <entry>
   <title>Speaking Sunday at FOSDEM</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/EJNK63KPo-0/be-there-sunday-at-fosdem.html" />
   <updated>2012-01-31T00:00:00-08:00</updated>
   <id>http://unethicalblogger.com/2012/01/31/be-there-sunday-at-fosdem</id>
   <content type="html">&lt;p&gt;I meant to post this earlier, but the schedule for the "Configuration and
Systems Management" devroom at FOSDEM 2012 has been posted.&lt;/p&gt;

&lt;p&gt;My talk will be &lt;a href="http://fosdem.org/2012/schedule/event/cfgmgmtjenkins"&gt;Sunday at
13:00&lt;/a&gt; in &lt;a href="http://fosdem.org/2012/schedule/room/k3601"&gt;Room
K.3.601&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're looking for a meaty technical discussion about Puppet this talk will
likely not be for you.&lt;/p&gt;

&lt;p&gt;I'm aiming to tell a story more than anything about how our use of Puppet came
to be and has evolved in building out open source project infrastructure.&lt;/p&gt;

&lt;p&gt;I hope my talk ends up as light-hearted and entertaining as I'm trying to make
it, in the off chance it doesn't, feel free to heckle and throw fruit.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NCTJy7iid0mFABKtUlf3h76Wqfw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NCTJy7iid0mFABKtUlf3h76Wqfw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NCTJy7iid0mFABKtUlf3h76Wqfw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NCTJy7iid0mFABKtUlf3h76Wqfw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/EJNK63KPo-0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/01/31/be-there-sunday-at-fosdem.html</feedburner:origLink></entry>
 
 <entry>
   <title>Real talk (about Smalltalk)</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/oEysCKs8eOI/realtalk.html" />
   <updated>2012-01-14T00:00:00-08:00</updated>
   <id>http://unethicalblogger.com/2012/01/14/realtalk</id>
   <content type="html">&lt;p&gt;Somehow I found myself reading an interesting article on Smalltalk yesterday
which led to a couple of comments in IRC:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tyler:  man, I am getting that "I should really learn smalltalk"
        feeling again
tyler:  everytime I get close I find myself downloading a squeak
        VM and then going "LOLWTF IS THIS SHIT"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I said this before I left the office and somewhere in the back of my mind I
kept thinking "why can't I crack Smalltalk?" This continued through most of the
evening until 9 pm (21:00) rolled around and I decided that I wouldn't let that
commie &lt;a href="https://en.wikipedia.org/wiki/Alan_Kay"&gt;Alan Kay&lt;/a&gt; defeat me.&lt;/p&gt;

&lt;p&gt;After finding &lt;a href="https://www.youtube.com/playlist?list=PL61A023880D3529DB&amp;amp;feature=plcp"&gt;this fantastic series of
screencasts&lt;/a&gt;
I set about learning some Smalltalk. Not enough to build anything major, but
enough to really understand Smalltalk's core concepts.&lt;/p&gt;

&lt;p&gt;In exploring the world of &lt;a href="http://squeak.org/"&gt;Squeak&lt;/a&gt;,
&lt;a href="http://www.pharo-project.org/home"&gt;Pharo&lt;/a&gt; and &lt;a href="http://amber-lang.net/"&gt;Amber&lt;/a&gt;
I believe I have experienced the full spectrum of emotions that my circuits
provide, all the way from unfettered rage to mild bemusement. Despite all of
this, around 2 a.m. I found myself lying awake in bed wanting to marvelling at
the design of the language and wanting to learn &lt;em&gt;more&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A couple of things still bug the hell out of me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The VM concept while novel is a completely jarring experience for anybody who
has done &lt;strong&gt;any&lt;/strong&gt; programming in any other environment &lt;em&gt;ever&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;I hate mice. I also have no trackpad on my laptop which means if i'm not at
my desk using a mouse-heavy program becomes painful (quite literally). Both
Squeak and Pharo have this sick mouse fetish that makes me want to &lt;code&gt;（╯°□°）╯︵┻━┻&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;GNU/Smalltalk feels closer to development environments that I'm familiar with,
but VisualGST is incredibly buggy and I think part of what makes Smalltalk
special is the integrated "live environment."&lt;/li&gt;
&lt;/ul&gt;


&lt;hr /&gt;

&lt;p&gt;The things that I do &lt;strong&gt;really&lt;/strong&gt; like however:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The integrated "live environment" is something out of programmer fairy tales.
Inspect/debug/edit anything and everything? Yes please!&lt;/li&gt;
&lt;li&gt;Everything is an object which receives messages, the syntax for conditionals helps drive it home. A
boolean object can receive an &lt;code&gt;ifTrue&lt;/code&gt; or an &lt;code&gt;ifFalse&lt;/code&gt; message which takes a
block argument. This means there is no real for &lt;code&gt;if&lt;/code&gt; statements, it's all
implemented with the basic Smalltalk primitives:

&lt;pre&gt;&lt;code&gt;  1 &amp;lt; 3
      ifTrue:  [Transcript show: 'Truthy!']
      ifFalse: [Transcript show: 'Untruthy!']
&lt;/code&gt;&lt;/pre&gt;

How about a for loop? Surely the language must have a for loop! No way
Jos&amp;eacute;! Instead an Array object just takes a &lt;code&gt;do&lt;/code&gt; message with a block, fancy!

&lt;pre&gt;&lt;code&gt;  #('tom' 'dick' 'harry') do:
      [ :each | Transcript show: ('Hello ', each); cr]
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;No magic, that I've seen thus far. One of my biggest criticisms of Ruby comes
out of the Rails tradition of magic methods by using &lt;code&gt;method_missing&lt;/code&gt; to
magically generate methods on-demand, leaving a system that's abominably
difficult to inspect and debug. Thus far I've not found any slight-of-hand in
Smalltalk, which is a good thing.&lt;/li&gt;
&lt;/ul&gt;


&lt;hr /&gt;

&lt;p&gt;I can really see where Objective-C pulled from Smalltalk having now experienced
some Smalltalk myself. That said, it's rather unfortunate that C and some
additional custom bits have creeped into Objective-C making it less Smalltalky
than it once was.&lt;/p&gt;

&lt;p&gt;I am definitely going to continue to tinker with Smalltalk, likely with
&lt;a href="http://pharo-project.org/home"&gt;Pharo&lt;/a&gt; as my VM of choice. My only concern is
that I will grow to resent the other languages I use regularly which feel
dumber than a language invented almost 40 years ago.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href="http://sebastianconcept.com/brandIt/10-reasons-why-im-using-smalltalk-for-airflowing"&gt;This is the original
post&lt;/a&gt;
that pushed me over the edge on tinkering with Smalltalk.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/v7jRJBjZrSXlrTAHMl94O2htE1c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/v7jRJBjZrSXlrTAHMl94O2htE1c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/v7jRJBjZrSXlrTAHMl94O2htE1c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/v7jRJBjZrSXlrTAHMl94O2htE1c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/oEysCKs8eOI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2012/01/14/realtalk.html</feedburner:origLink></entry>
 
 <entry>
   <title>And now a word about the Jenkins DNS debacle</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/yPqhu0Y3C2M/regarding-jenkins-dns-issues.html" />
   <updated>2011-12-29T00:00:00-08:00</updated>
   <id>http://unethicalblogger.com/2011/12/29/regarding-jenkins-dns-issues</id>
   <content type="html">&lt;p&gt;Now that things have settled down, I'd like to address what happened during the
&lt;a href="https://groups.google.com/group/jenkinsci-users/browse_thread/thread/b1015d6efd53343f#"&gt;jenkins-ci.org DNS outage I discussed
here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Long story short, some poor assumptions caused a lot of trouble while switching
registrars away from GoDaddy.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;First let me explain the motivations for moving from GoDaddy: aside from the
SOPA issue, I've &lt;em&gt;always&lt;/em&gt; hated dealing with GoDaddy. The have had an
absolutely &lt;strong&gt;shit&lt;/strong&gt; product for a long time, but as a long time customer,
momentum was quite a limiting factor. Before my involvement with the Jenkins
infrastructure, I would have only used GoDaddy once or twice a year.&lt;/p&gt;

&lt;p&gt;Since becoming the driving force behind a lot of the Jenkins back-end, I've had
to deal with them once or twice a month, and everytime I would be bombarded
with upsells, ads and other shit that I wanted no part in. With the renewal of
jenkins-ci.org coming up in January, it makes sense to switch registrars before
I renew the domain for 5 years (which I will be doing).&lt;/p&gt;

&lt;p&gt;The SOPA boycott is just gravy on top.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;As for the "DNS debacle", here's a quick bulleted list of what happened:&lt;/p&gt;

&lt;h4&gt;The Negative&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Jenkins used GoDaddy's DNS service, when the GoDaddy side of the domain
transfer was complete they canceled the DNS service and seemingly zeroed
out all our DNS records.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;jenkins-ci.org&lt;/code&gt; nameservers, which are generally copied over when
switching registrars, were set to GoDaddy's nameservers prior to the transfer
(mistake on my part).&lt;/li&gt;
&lt;li&gt;What I had assumed would automatically take effect once the transfer was
complete on Namecheap's side, did not take effect. In fact, somehow the data
I had entered in was obliterated when GoDaddy's nameservers were copied over.&lt;/li&gt;
&lt;li&gt;I'm not good at writing zone files, and the most subtle mistakes were easy to
slip past those who I asked to review them. Zone files are the devil.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Instead of focusing too much on the colossal screw-up, I'd like to focus more
on what positive has come out of the situation.&lt;/p&gt;

&lt;h4&gt;The Positive&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;jenkins-ci.org&lt;/code&gt; is now with a registrar that isn't commonly accepted to be
"freakin' terrible"&lt;/li&gt;
&lt;li&gt;To mitigate the downtime people were experiencing, I quickly set up what I
presumed would be a temporary nameserver on one of our machines colocated
with the &lt;a href="http://www.osuosl.org"&gt;OSUOSL&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Instead of taking that nameserver down, I've actually promoted it to become
&lt;code&gt;ns1.jenkins-ci.org&lt;/code&gt; which is wholly powered by &lt;a href="https://github.com/jenkinsci/infra-puppet/"&gt;our Puppet
 manifests&lt;/a&gt;. Now anybody in the
 community can submit a pull request to add records to &lt;a href="https://github.com/jenkinsci/infra-puppet/blob/master/modules/jenkins-dns/files/jenkins-ci.org.zone"&gt;our zone
 file&lt;/a&gt; and we can
 approve and deploy it all from GitHub via Puppet.&lt;/li&gt;
&lt;li&gt;While working on DNS, I noticed that &lt;code&gt;iptables(8)&lt;/code&gt; wasn't properly configured
on some of our hosts. We've since bundled the &lt;a href="http://forge.puppetlabs.com/puppetlabs/firewall"&gt;firewall module from Puppet
Labs&lt;/a&gt; in our repository and
set up the appropriate rules on all hosts to lock them down.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I could vent about the idiocy of the DNS system, how much I abhor GoDaddy, or a
myriad of other issues that had to be resolved in these past two days, but that
wouldn't be very useful.&lt;/p&gt;

&lt;p&gt;Despite the amount of time consumed in the affair, I think the project comes
out ahead and stronger, and at the end of the day that's what is really
important to me.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6Ve9zHjmmQgezPDxktMwVrGJUpM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6Ve9zHjmmQgezPDxktMwVrGJUpM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6Ve9zHjmmQgezPDxktMwVrGJUpM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6Ve9zHjmmQgezPDxktMwVrGJUpM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/yPqhu0Y3C2M" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2011/12/29/regarding-jenkins-dns-issues.html</feedburner:origLink></entry>
 
 <entry>
   <title>Pulling Jenkins' strings with Puppet</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/04wqKREzGAo/jenkins-with-puppet.html" />
   <updated>2011-12-28T00:00:00-08:00</updated>
   <id>http://unethicalblogger.com/2011/12/28/jenkins-with-puppet</id>
   <content type="html">&lt;p&gt;A couple months ago I created this
&lt;a href="https://github.com/rtyler/puppet-jenkins"&gt;puppet-jenkins&lt;/a&gt; module while
experimenting with using Puppet to script or otherwise control more and more of
my daily sysadmin-life.&lt;/p&gt;

&lt;p&gt;After a weekend of hacking I figured I was mostly finished, that was until Puppet Labs
engineer &lt;a href="https://github.com/jeffmccune"&gt;Jeff McCune&lt;/a&gt; picked up the module and
added a number of rspec tests, CentOS/RHEL support and generally tidied up the
place. Pretty neat I thought!&lt;/p&gt;

&lt;p&gt;Once again through the power of GitHub a weekend project has taken a life of
its own now that multiple people are interested in the concept and have
&lt;a href="https://github.com/rtyler/puppet-jenkins/network/members"&gt;forked the repo&lt;/a&gt;
accordingly.&lt;/p&gt;

&lt;p&gt;With the encouragement of a number of people, I've also &lt;a href="http://forge.puppetlabs.com/rtyler/jenkins"&gt;published
the module to Puppet Forge&lt;/a&gt; which
allows for easy integration with thousands of Puppet installations.&lt;/p&gt;

&lt;p&gt;If you'd like to use the Jenkins puppet module from Puppet Forge, you can use:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% -&amp;gt; puppet-module install rtyler-jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once the module is included you can slurp in the Jenkins module with this in
your manifests:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class { 'jenkins': ; }  # logically equivalent to "include jenkins"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can also use the module to handle plugin installation for you with the
&lt;code&gt;install-jenkins-plugin&lt;/code&gt; type:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;install-jenkins-plugin {
    "git-plugin" :
        name    =&amp;gt; "git,
        version =&amp;gt; "1.1.11";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(Omit the "version" if you just want to pull the latest)&lt;/p&gt;

&lt;p&gt;If you're interested in contributing, the &lt;a href="https://github.com/rtyler/puppet-jenkins"&gt;GitHub project is
here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Add this to the ever increasing list of projects that were planted on GitHub
and flourished afterward.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OhqLAA7pmTRo6EfpOV01eKjozRY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OhqLAA7pmTRo6EfpOV01eKjozRY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OhqLAA7pmTRo6EfpOV01eKjozRY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OhqLAA7pmTRo6EfpOV01eKjozRY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/04wqKREzGAo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2011/12/28/jenkins-with-puppet.html</feedburner:origLink></entry>
 
 <entry>
   <title>How is Ruby built?</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/DnwXkBE53Kc/how-is-ruby-built.html" />
   <updated>2011-12-26T00:00:00-08:00</updated>
   <id>http://unethicalblogger.com/2011/12/26/how-is-ruby-built</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This is a rant, I'm not actually going to explain anything of use&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;For a rather long time, I've used &lt;a href="http://clang.llvm.org/"&gt;clang&lt;/a&gt; on my Linux
machine as the default value of the &lt;code&gt;$CC&lt;/code&gt; environment variable. I've simply
found it to be a faster and more friendly compiler to work with than the
default &lt;code&gt;gcc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When I first came to Ruby, I tried building Ruby 1.8.7 with clang and it failed
&lt;em&gt;utterly&lt;/em&gt;. After bitching on Twitter, as I'm prone to doing, &lt;a href="http://timetobleed.com"&gt;Joe
Damato&lt;/a&gt; pointed out that Ruby 1.8 isn't really valid
C. Instead it is a hodge podge of macros, C code, assembly and tears.&lt;/p&gt;

&lt;p&gt;I later found out that Ruby 1.9 seems to cope with being built with &lt;code&gt;clang&lt;/code&gt;
properly, so I built a couple of &lt;a href="https://rvm.beginrescueend.com/"&gt;1.9 variants with
RVM&lt;/a&gt; for my personal projects.&lt;/p&gt;

&lt;p&gt;Everything was all fine and good until &lt;a href="https://gist.github.com/1521970A"&gt;I tried building a native extension for
a 1.9 Ruby:&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;make
compiling em.cpp
cc1plus: warning: command line option ‘-Wdeclaration-after-statement’ is valid for C/ObjC but not for C++ [enabled by default]
cc1plus: error: unrecognized command line option ‘-Wshorten-64-to-32’
cc1plus: warning: command line option ‘-Wimplicit-function-declaration’ is valid for C/ObjC but not for C++ [enabled by default]
make: *** [em.o] Error 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I lost &lt;strong&gt;hours&lt;/strong&gt; trying to figure out what the hell was going on here. I was
convinced for hours that EventMachine (the gem being built here) had a bug in
it. Then I was convinced that RVM had a bug in it, but I finally landed on
Ruby's build system itself.&lt;/p&gt;

&lt;p&gt;I should point out that the warning &lt;code&gt;shorten-64-to-32&lt;/code&gt; only exists in patched
versions of compilers shipped with Mac OS X. It &lt;em&gt;certainly&lt;/em&gt; doesn't exist on
any compiler on Linux, so where the hell did this flag come from?&lt;/p&gt;

&lt;p&gt;Somehow, and arriving at this "somehow" took me a number of miserable hours,
the difference between using &lt;code&gt;clang(1)&lt;/code&gt; and &lt;code&gt;gcc(1)&lt;/code&gt; to build Ruby resulted in
a single nonsense &lt;code&gt;CXXFLAGS&lt;/code&gt; value which didn't come back to bite me until I
tried to build a native extension.&lt;/p&gt;

&lt;p&gt;How the shit does Ruby get built!?&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EbNp8OAEGAW0l9Qm2JgE3vts_do/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EbNp8OAEGAW0l9Qm2JgE3vts_do/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EbNp8OAEGAW0l9Qm2JgE3vts_do/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EbNp8OAEGAW0l9Qm2JgE3vts_do/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/DnwXkBE53Kc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2011/12/26/how-is-ruby-built.html</feedburner:origLink></entry>
 
 <entry>
   <title>Identi.ca is dead to me</title>
   <link href="http://feedproxy.google.com/~r/UnethicalBlogger/~3/eMKgCk-L36E/identica-is-dead-to-me.html" />
   <updated>2011-12-23T00:00:00-08:00</updated>
   <id>http://unethicalblogger.com/2011/12/23/identica-is-dead-to-me</id>
   <content type="html">&lt;p&gt;There was a time when I was a big fan and user of open source microblogging
site &lt;a href="http://identi.ca"&gt;Identi.ca&lt;/a&gt;. I regret to inform you that this time has
passed and I can no longer in good conscience support the platform.&lt;/p&gt;

&lt;p&gt;Identi.ca has always had issues, to be expected of an open source web property,
there are bound to some rough edges running around. Things took a turn for the
worse when the team decided to &lt;a href="http://status.net/2011/09/15/upgrading-identi-ca-and-other-statusnet-cloud-sites-to-1-0-0rc1"&gt;perform a major
upgrade&lt;/a&gt;
which took the site offline for an entire weekend. The major upgrade in
mid-September introduced a number of issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entirely new UI which improved things in some areas (more AJAX) but
introduced whole new UX flows, heavily padded rounded UI elements and new
hiding places for elements (Groups) that I used to use heavily (why the
christ would you put the Groups that I &lt;strong&gt;admin&lt;/strong&gt; behind three clicks and not
have them in the stupid sidebar? Idiocy).&lt;/li&gt;
&lt;li&gt;Took the XMPP bot offline for interacting with Identi.ca. This was often the
&lt;em&gt;only&lt;/em&gt; way I interacted with the site!&lt;/li&gt;
&lt;li&gt;&lt;a href="http://status.net/2011/10/28/big-loss-of-data-on-identi-ca"&gt;Data integrity
issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A &lt;a href="http://status.net/2011/12/20/identi-ca-down-update-not-any-more"&gt;number&lt;/a&gt;
of &lt;a href="http://status.net/2011/12/02/unscheduled-downtime-for-identi-ca"&gt;stability
issues&lt;/a&gt; and
&lt;a href="http://status.net/2011/11/05/overview-of-technical-problems-with-identi-ca"&gt;bugs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I would go on, but my mouth is already foaming at an unhealthy rate so I better
stop before I get kicked out of this coffee shop.&lt;/p&gt;

&lt;p&gt;Anyways, it is of my opinion that the folks behind made a classic blunder: the
major re-write (joining Netscape 5, Perl 6, Python 3, and numerous other
over-promising projects that falter in the "real world"). Eschewing the
evolutionary approach to a project means large changes in data structure or
user experience can and will be made before anybody has seen them operate with
"real world" data and users.&lt;/p&gt;

&lt;p&gt;I'm not sure where this leaves me with regards to using Identi.ca, I want to
like the site so badly but every tiem I've tried to use it in the past three
months I end up terribly frustrated.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Extra bonus rant:&lt;/em&gt; If you ever try to use the mobile site, you'll have a taste
of how silly Identi.ca can be sometimes. If the site doesn't detect that your
browser is mobile (which happens on every device for me), then you have to load
the full non-mobile home page, at the bottom of which is a "Switch to mobile
desktop layout" link. The link doesn't have an href, it uses &lt;strong&gt;fucking
JavaScript&lt;/strong&gt;, clicking this link will reload the page with a special
mobile cookie set. There is no &lt;code&gt;m.identi.ca&lt;/code&gt; site at all.&lt;/p&gt;

&lt;p&gt;To use Identi.ca from a mobile browser: your browser must run JavaScripts, you
must load the full non-mobile document, click that link, set the cookie then
hope that your browser keeps that cookie around forever.&lt;/p&gt;

&lt;p&gt;Uh oh, my mouth is foaming up again, better stop here.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sH6vs7mQAWKhFgA0er3k3QLorhc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sH6vs7mQAWKhFgA0er3k3QLorhc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sH6vs7mQAWKhFgA0er3k3QLorhc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sH6vs7mQAWKhFgA0er3k3QLorhc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/UnethicalBlogger/~4/eMKgCk-L36E" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://unethicalblogger.com/2011/12/23/identica-is-dead-to-me.html</feedburner:origLink></entry>
 

</feed>

