<?xml version="1.0"?>
<rss version="2.0">
  <channel>
    <title>Kit Plummer's Blog Feed</title>
    <link>http://kitplummer.github.com</link>
    <description>RSS feed of blog by Kit Plummer</description>
    <pubDate>Mon, 25 Jun 2012 16:31:44 CST</pubDate>
    <lastBuildDate>Mon, 25 Jun 2012 16:31:44 CST</lastBuildDate>
    <webMaster>kitplummer@gmail.com</webMaster>
	
	
 	<item>
   		<title>Ruote-Stomp Ping Pong</title>
   		<link>http://kitplummer.github.com/workflow/2011/06/20/ruote-stomp-ping-pong.html</link>
   		<guid>http://kitplummer.github.com/workflow/2011/06/20/ruote-stomp-ping-pong</guid>
   		<description>&lt;h1 id='ruotestomp_ping_pong'&gt;Ruote-Stomp Ping Pong&lt;/h1&gt;

&lt;p&gt;Just returning from some time with the &lt;a href='http://devopsdays.org/events/2011-mountainview/'&gt;DevOpsDays crew&lt;/a&gt; and a bit of an extending &amp;#8220;vacation&amp;#8221; at the Taos Holy Cross Hospital (after my son&amp;#8217;s attempt to fly a mountain bike down the Angel Fire ski resort :)). I&amp;#8217;ve been meaning to get this tidbit blogged for a bit, but it just hasn&amp;#8217;t happened - seemingly more typical these days. Ah well.&lt;/p&gt;

&lt;p&gt;Quickly, here are the players:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://ruote.rubyforge.org'&gt;Ruote&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/kellyp/stomp'&gt;Stomp&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://stompserver.rubyforge.org/'&gt;stompserver&lt;/a&gt; or ActiveMQ&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/maestrodev/ruote-stomp'&gt;ruote-stomp&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/kennethkalmer/daemon-kit'&gt;daemon-kit&lt;/a&gt; - for generating the simple &amp;#8220;workers&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src='http://www.orangejuiceblog.com/wp-content/uploads/2010/12/world-championship-ping-pong.jpg' alt='pingpong' /&gt;&lt;/p&gt;

&lt;p&gt;This story began with the &lt;a href='http://simplic.it/blog/an-investigiation-into-ruote-and-amqp'&gt;AMQP-based Ping Pong exercise&lt;/a&gt; as I was looking hard at &lt;a href='http://ruote.rubyforge.org'&gt;Ruote&lt;/a&gt; for a project needing remote, distributed work units, similar to what is possible to &lt;a href='https://github.com/defunkt/resque'&gt;Resque&lt;/a&gt; that could be attached to managed workflows.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://ruote.rubyforge.org/images/ruote.png' alt='ruote' /&gt;&lt;/p&gt;

&lt;p&gt;Ruote itself is deserving of an entire blog post. It is an amazing framework, that captures the need for a simple, lightweight engine that could - do more than basic state machine stuffs - accommodating standard &lt;a href='http://ruote.rubyforge.org/patterns.html'&gt;workflow patterns&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Although I think AMQP is definitely up to the task of brokering the work units, I need something that can be run from within a JVM, and is a bit easier to test in isolation. Since the only content that is passed between Ruote&amp;#8217;s &amp;#8220;engine&amp;#8221; and &amp;#8220;participants&amp;#8221; is textual, and JSON at that I figured the &lt;a href='http://stomp.codehaus.org'&gt;Stomp protocol&lt;/a&gt; was a logical choice. Stomp is supported in many messaging brokers (ActiveMQ, RabbitMQ, stompserver). So, I set off to port the AMQP ping pong setup to Stomp.&lt;/p&gt;

&lt;p&gt;I shamelessly started with the work Kenneth Kalmer did in the &lt;a href='https://github.com/kennethkalmer/ruote-amqp'&gt;ruote-amqp&lt;/a&gt; gem, simply swapping the appropriate AMQP calls for Stomp calls. And, thus &lt;a href='https://github.com/maestrodev/ruote-stomp'&gt;ruote-stomp&lt;/a&gt; was born. It tests pretty easily with the embedded ruby-based stompserver.&lt;/p&gt;

&lt;p&gt;I then needed to get the ping and pong participants to use stomp. The AMQP-based ping pong version uses &lt;a href='https://github.com/kennethkalmer/daemon-kit'&gt;daemon-kit&lt;/a&gt; to build participants that consume work off of queues. So, I then &lt;a href='https://github.com/kitplummer/daemon-kit'&gt;forked&lt;/a&gt; Kenneth&amp;#8217;s work, and added the stomp capability.&lt;/p&gt;

&lt;p&gt;The end result, my Ruote-Stomp Ping Pong experiment, can be found at &lt;a href='https://github.com/kitplummer/ruote-stomp-ping-pong'&gt;https://github.com/kitplummer/ruote-stomp-ping-pong&lt;/a&gt;. To run it is pretty straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Clone the &lt;a href='https://github.com/kitplummer/ruote-stomp-ping-pong'&gt;ruote-stomp-ping-pong&lt;/a&gt; project.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Open 3 terminal windows and cd into each project subdirectory (ping/, pong/, ping-pong-engine/).&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Ping&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;
➜  ping bundle
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
➜  ping bin/ping
&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pong&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;
➜  pong bundle
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
➜  pong bin/pong
&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ping-Pong-Engine&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;
➜  ping-pong-engine bundle
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
➜  ping-pong-engine stompserver &amp;amp;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
➜  ping-pong-engine ruby lib/main.rb
&lt;/code&gt;&lt;/p&gt;</description>
   		<pubDate>Mon, 20 Jun 2011 00:00:00 CST</pubDate>
 	</item>
 	
 	<item>
   		<title>In Metrics We Trust</title>
   		<link>http://kitplummer.github.com/devops/2011/05/04/in_metrics_we_trust.html</link>
   		<guid>http://kitplummer.github.com/devops/2011/05/04/in_metrics_we_trust</guid>
   		<description>&lt;h1&gt;In Metrics We Trust&lt;/h1&gt;
&lt;p style=&quot;float:left;&quot;&gt;&lt;img src=&quot;http://www.rpi.edu/dept/acs/pcinfo/labview.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;As I&amp;#8217;ve stated in the past &lt;a href=&quot;http://www.maestrodev.com/blogs/trust-as-the-cornerstone-of-devops-culture&quot;&gt;Trust is the Cornerstone of DevOps Culture&lt;/a&gt; and I think we&amp;#8217;re getting closer at the root apparatus for creating trust.  I do, now, believe that it is more than just QA, providing assurance of functional and non-functional requirements.  The problem, that is becoming clearer to me, is the state of change (I know it is a great oxymoron) that is always in play on both sides of the lifecycle (dev and ops).  Not only are requirements a moving target, but so is the solution.  Agile has taught us to treat the solution as a dynamic entity that is reacquiring the end-state &amp;#8211; based on requirements, technology, and people.  So, there&amp;#8217;s no way QA (process and people) can keep up with the lot, in an effective way that allows for continuous delivery, or even &amp;#8220;more&amp;#8221; rapid delivery without some means for providing a feedback loop.&lt;/p&gt;
&lt;p&gt;That feedback loop is created by metrics.  But, metrics that identify the performance of the applications (UI, internal, external, asynchronous processes, etc.) are well beyond just access and availability. &lt;a href=&quot;http://stackoverflow.com/questions/2345081/effective-code-instrumentation&quot;&gt;Effective Code Instrumentation&lt;/a&gt; is really more than &amp;#8220;live&amp;#8221; tracking a block of code, or capturing log files.  Instrumentation also goes beyond failure cases.  Metrics provided by instrumentation need to look beyond just a single application, or a single relationship (front-end to database query) and into the full architecture &amp;#8211; all tiers.&lt;/p&gt;
&lt;p&gt;DevOps is here to help.  By creating DevOps-minded environment for Operations to work directly with Developers, early in the cycle (and each cycle) there&amp;#8217;s an opportunity to build better applications/services that include the required instrumentation triggers.  QA can be included to define the appropriate test cases, and monitoring patterns that will identify trends (especially those associated with changes to infrastructure, business activities, and general load).  Obviously, the actual strategy for which metrics are best suited is part of the problem.  The Dev, QA, Operations triad is required to work the strategy from the start, and to continuous evolve the strategy &amp;#8211; learning from all angles as the solution matures.&lt;/p&gt;
&lt;p&gt;Did you know there&amp;#8217;s actually an &lt;a href=&quot;https://secure.wikimedia.org/wikipedia/en/wiki/Application_Response_Measurement&quot;&gt;open standard&lt;/a&gt; for instrumenting code?  Wonder if anybody actually uses it in their Apache &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; server runtimes.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m sure we&amp;#8217;ll be hearing more about it at &lt;a href=&quot;http://devopsdays.org/events/2011-mountainview/&quot;&gt;Devopsdays 2011 &amp;#8211; Mountain View&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Help us out &amp;#8211; and vote on a t-shirt design for the event too:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://devopsdays.uservoice.com/forums/113611-t-shirt-design-ideas-for-devopsdays-mountain-vie&quot;&gt;In Metrics We Trust&lt;/a&gt; &amp;#8211; could be a really cool t-shirt design. (I think this was actually Patrick Debois&amp;#8217; idea. :))&lt;/p&gt;</description>
   		<pubDate>Wed, 04 May 2011 00:00:00 CST</pubDate>
 	</item>
 	
 	<item>
   		<title>No QA and No Ops Needed - Yeh Right</title>
   		<link>http://kitplummer.github.com/devops/2011/02/26/noqa_noops.html</link>
   		<guid>http://kitplummer.github.com/devops/2011/02/26/noqa_noops</guid>
   		<description>&lt;h1&gt;No QA and No Ops Needed &amp;#8211; Yeh Right&lt;/h1&gt;
&lt;p&gt;This is a great example of NoOps &amp;amp; NoQA.&lt;/p&gt;
&lt;p&gt;&lt;iframe title=&quot;YouTube video player&quot; width=&quot;480&quot; height=&quot;390&quot; src=&quot;http://www.youtube.com/embed/UiInBOVHpO8&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;I can&amp;#8217;t remember exactly how, but I was pointed to this (above) &lt;a href=&quot;http://www.youtube.com/watch?v=UiInBOVHpO8&quot;&gt;video&lt;/a&gt; of &lt;a href=&quot;http://dubfx.bandcamp.com&quot;&gt;Dub FX&lt;/a&gt; that just totally blew me away. I&amp;#8217;m a fan of anyone with exceptional talent&amp;#8230;and after having watched it a couple of times I began to envision the parallel between what he&amp;#8217;s doing on the street with what modern software devers are doing with webapps (the dev-to-deploy) process.  For both the awesome sound and metaphor to &amp;#8220;NoQA NoOps&amp;#8221; I highly recommend taking the few minutes to &lt;a href=&quot;http://www.youtube.com/watch?v=UiInBOVHpO8&quot;&gt;watch him&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you don&amp;#8217;t get the same vision that I did, let me break it down real quick.  He records a single track (read feature development), then immediately listens to it (read feature QA), then promtes the track loop into his operational environment (live). He (by himself, fulfilling the three cultures of dev, QA, and ops) does this a few times over, continuously deploying new tracks to the song &amp;#8211; in realtime.&lt;/p&gt;
&lt;h1&gt;Cage Rattling&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://www.forrester.com/rb/analyst/mike_gualtieri&quot;&gt;Mike Gualtieri&lt;/a&gt; has written a couple great &amp;#8220;cage rattling&amp;#8221; posts, that have generated an excellent dialog.&lt;/p&gt;
&lt;h2&gt;NoOps?&lt;/h2&gt;
&lt;p&gt;The first one, &lt;a href=&quot;http://blogs.forrester.com/mike_gualtieri/11-02-07-i_dont_want_devops_i_want_noops&quot;&gt;I Don&amp;#8217;t Want DevOps. I Want NoOps.&lt;/a&gt;, is a look at the desire/need for developers to be truly abstracted from their target platforms &amp;#8211; to include the need for deep understanding of the hardware constraints.&lt;/p&gt;
&lt;p&gt;Mike&amp;#8217;s post also pushed on the aspect of deployment, suggesting that cloud-based providers will proved the &amp;#8220;Ops&amp;#8221; needed, to ops teams who can then pass through to developers.  In saying this he&amp;#8217;s obviously added a touch of irony.  Ops is still needed.  Yesterday at DevOpsDay (at SCALE9x) I heard &lt;a href=&quot;http://www.linkedin.com/in/chrislouvion&quot;&gt;Christophe Louvion&lt;/a&gt; say explicitly that he gives his developers a credit card and the &amp;#8220;go ahead&amp;#8221; to manage their own cloud resources.  That&amp;#8217;s great for &amp;quot;Dev&amp;quot;and is a critical &amp;#8220;Yes&amp;#8221; required in the DevOps culture to empower developers to gain performance efficiencies and a better understanding of Ops, as long as they work with Ops to utilize cloud resources in the best way that will optimize the deliver/deployment process in the greater release function.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m a huge fan of &lt;a href=&quot;http://www.heroku.com&quot;&gt;Heroku&lt;/a&gt; &amp;#8211; especially how it enables me to quickly deploy, within my existing software engineering workflow by simply &amp;#8216;git push&amp;#8217;ing to Heroku&amp;#8217;s remote repo that represents my target environment.  I&amp;#8217;m already committing my to my local (in-work branches) repo, pushing to remote branches and trunk/mainline.  It really is nothing to push my &amp;#8220;prod&amp;#8221; branch to Heroku &amp;#8211; simplicity.  I&amp;#8217;m doing something very similar with this blog, using Github&amp;#8217;s &lt;a href=&quot;http://pages.github.com/&quot;&gt;Pages&lt;/a&gt; (I use &lt;a href=&quot;https://github.com/mojombo/jekyll&quot;&gt;Jekyll&lt;/a&gt; &amp;#8211; a cool static site generator).&lt;/p&gt;
&lt;h3&gt;NoOps for the &amp;#8220;One-Liners&amp;#8221;&lt;/h3&gt;
&lt;p&gt;Ok, here&amp;#8217;s the reality.  This flow makes great sense for my simple (in the sense of both functional and non-functional/operational requirements), single dever, self-QA&amp;#8217;d, environment.  This flow might make sense for &amp;#8220;hot&amp;#8221; app dev-to-production for large-scale infrastructures, where the app will have a short life expectancy and won&amp;#8217;t change much.  For anything more complex, or that is being produced and managed by a multi-person, multi-organizational environment, forget it.  Sure, you could use &lt;span class=&quot;caps&quot;&gt;SCM&lt;/span&gt; and a binary repo to manage the steps and promotions &amp;#8211; but that will be a struggle where there is a &amp;#8220;wares&amp;#8221; hierarchy with transitive dependencies and version releases along the way.  Note, I&amp;#8217;m not trying to imply that the simple use case is any less professional, this is just the difference between manufacturing a skateboard and a car.&lt;/p&gt;
&lt;h2&gt;NoQA?&lt;/h2&gt;
&lt;p&gt;Mike continues in another post &lt;a href=&quot;http://blogs.forrester.com/mike_gualtieri/11-02-17-want_better_quality_fire_your_qa_team&quot;&gt;Want Better Quality?  Fire Your QA Team.&lt;/a&gt;, where here acknowledges a client&amp;#8217;s of his identification that getting rid of their QA team actually resulted in higher quality software.  Mike notes the reason that it worked was because &amp;#8220;Dev&amp;#8221; is required to take responsibility for the quality of the &amp;#8220;deliverable&amp;#8221; and not rely on QA as a crutch.  Makes perfect sense, and I&amp;#8217;ve seen the same things in many different types of organizations and products.&lt;/p&gt;
&lt;h3&gt;Testing is&amp;#8230;Well, it is Hard!&lt;/h3&gt;
&lt;p&gt;There are problems with pushing the responsibility for testing forward.  Testing is a skill.  And the greater the complexity of the product/project, the more complex the testing environment gets.  Most developers think testing is an impedance &amp;#8211; not discounting it&amp;#8217;s importance &amp;#8211; just identifying that testing can break creative progress.  Even though I have fully swallowed the value of *DD (specifically &lt;a href=&quot;http://behaviour-driven.org/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;BDD&lt;/span&gt;&lt;/a&gt; &amp;#8211; it is very easy to end up with a brittle test harness.  This is even more of an issue where there are multiple customers &amp;#8211; each injecting unique requirements.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://martinfowler.com/articles/continuousIntegration.html&quot;&gt;Continuous integration&lt;/a&gt; isn&amp;#8217;t enough anymore; functional testing isn&amp;#8217;t enough; measuring and monitoring isn&amp;#8217;t enough.  Truth is always changing.  Wether it is a changing customer requirement, or a version change on an internal service, or a turn-over in a key team role, the proof that is quality assurance is a moving target &amp;#8211; a true byproduct of the need for agility.&lt;/p&gt;
&lt;p&gt;We do need to make QA a shared responsibility across the DevOps culture, and grow the skills that will allow for realistic accountability.  But, at the end of the day, we can&amp;#8217;t short-change the complexity and importance of focusing on Quality Assurance tasks.&lt;/p&gt;
&lt;h1&gt;A Couple of Closing Thoughts&lt;/h1&gt;
&lt;p&gt;To Ops: give devers and QA testing environment that mirror upper-level staging and production environments.&lt;/p&gt;
&lt;p&gt;To Devers: ask for help, but do yourself a favor and dig a little and be prepared to offer some help too.  Never demand.&lt;/p&gt;
&lt;p&gt;To QA: spread your knowledge of requirements, processes and tools to Dev and Ops, and make an effort to get a deeper understanding of the overall methodologies and practices.&lt;/p&gt;</description>
   		<pubDate>Sat, 26 Feb 2011 00:00:00 CST</pubDate>
 	</item>
 	
 	<item>
   		<title>Vagrant is My New Best Friend</title>
   		<link>http://kitplummer.github.com/devops/2011/02/18/vagrant_new_best_friend.html</link>
   		<guid>http://kitplummer.github.com/devops/2011/02/18/vagrant_new_best_friend</guid>
   		<description>&lt;h1&gt;Vagrant is My New Best Friend&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://www.vagrantup.com&quot;&gt;Vagrant&lt;/a&gt; is my new best friend.  Well, really it is the latest tool I&amp;#8217;m adding to my development toolbox &amp;#8211; or I should say my DevOps toolbox.&lt;/p&gt;
&lt;p&gt;Vagrant is a Ruby-based utility for simple interaction with &lt;a href=&quot;http://www.virtualbox.org&quot;&gt;VirtualBox&lt;/a&gt; (Oracle&amp;#8217;s open source virtualization product).  Rather than posting a tutorial&amp;#8230;this is how simple it is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ gem install vagrant
$ vagrant box add base http://files.vagrantup.com/lucid32.box
$ vagrant init
$ vagrant up
$ vagrant ssh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Of course, you have to have already installed VirtualBox. But, this gets you a basic Ubuntu Lucid (32-bit) environment, installed, running and logged in.  How cool is that???&lt;/p&gt;
&lt;p&gt;This works great for me, as one of my target environments is CentOS 5.5.  Yep, you guessed it &amp;#8211; theres an available CentOS5.5 box available for downloading/running. I&amp;#8217;ve learned the hard way that you have to keep each environment in its own directory, because the VM settings are stored in a file called Vagrantfile.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ mkdir CentOS5.5 &amp;amp;&amp;amp; cd CentOS5.5
$ vagrant box add centos http://dl.dropbox.com/u/15307300/vagrant-0.7-centos-64-base.box
$ vagrant init centos
$ vagrant up
$ vagrant ssh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It&amp;#8217;s also possible to configure the VM using &lt;a href=&quot;http://www.puppetlabs.com&quot;&gt;Puppet&lt;/a&gt; &amp;#8211; but again my intent isn&amp;#8217;t for this to be a tutorial, so check the Vagrant &lt;a href=&quot;http://vagrantup.com/docs/provisioners/puppet_server.html&quot;&gt;docs&lt;/a&gt; if you&amp;#8217;re interested.  I do this so I can quickly get Subversion and a few other tools install really quickly.&lt;/p&gt;</description>
   		<pubDate>Fri, 18 Feb 2011 00:00:00 CST</pubDate>
 	</item>
 	
 	<item>
   		<title>Trust as the Cornerstone of DevOps Culture</title>
   		<link>http://kitplummer.github.com/devops/2011/01/31/trust_cornerstone_of_devops.html</link>
   		<guid>http://kitplummer.github.com/devops/2011/01/31/trust_cornerstone_of_devops</guid>
   		<description>&lt;h1&gt;Trust as the Cornerstone of DevOps Culture&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://www.slideshare.net/jedi4ever/bootstrapping-a-devops-mentality-at-skillsmatter-by-patrick-debois&quot;&gt;Patrick Debois&amp;#8217; How to Bootstrap a DevOps Mentality prezo&lt;/a&gt; &amp;#8211; is so good, I can only wish that I&amp;#8217;d have been there.  Since, I can not catch the next hop to a Euro DevOps meetup, nor execute time-travel a follow-up blog post is the best I can do.&lt;/p&gt;
&lt;p&gt;First, let me caveat with saying that I&amp;#8217;m a software engineer, and come from a history of Agile attempts (some successful, and some not-so-much).  I can&amp;#8217;t help but feel like the current buzz around DevOps is tilted towards the Ops functions.  Perhaps this is due to the well-deserved attention tools like Puppet and Chef are getting (and the hype revolving around all-things cloud).  Automation in the Ops space is very much needed.&lt;/p&gt;
&lt;p&gt;I completely agree with Patrick, DevOps is a cultural issue, and subsequently a behaviorial one.  Having spent many years working in realtime, embedded software, I can assure you that the current development-operations flux is no different than the current software-hardware riff in the longer running product/widget space.  And yes, respect is the &amp;#8220;correct&amp;#8221; answer.  However, changing culture in most organizations with dev and ops shops is an unrealistic expectation.  Every organization regardless of a product or service focus, in widget or web form, will be challenged with respect, responsibility, and accountability issues &amp;#8211; by the pure dynamic nature of culture.  Again yes, there are exceptions to every rule, and there are a few organizations that can overcome culture issues, but they are the minority (especially as the size/complexity of the organization increases).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trust is paramount.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I love this: trust = f(character,competence)&lt;/p&gt;
&lt;p&gt;As both character and competency are fluid with changing teams, changes in organizational structure, and projects themselves it is very important that there is a way to ensure that the values can be made more concrete, improving over time.  How we do this is the million [insert_currency_here, !pesos] question, for the DevOps community to debate.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll go ahead and assert that the pivot point (for balancing the relationship between development and deployment) is testing.  Testing is the proof of character and competence, the only practice that can provide concrete values to these variables.  And, testing is something that can be proven over time.  Proof, is the precursor to truth (read trust).  Take safety-critical systems for example (e.g. an automated medicine injection system)&amp;#8230;ok, bad example&amp;#8230;take for example a mission critcal system like a stock transaction processing system.  The development and operational activities aren&amp;#8217;t left to culture, or behavior to ensure quality (or rate of deployability).  These systems are tested, automatically and otherwise, out the wazoo &amp;#8211; including the deployment operation.  These tests provide the confidence/proof required to create an organizational culture of trust &amp;#8211; not member behavior which is susceptible to too many influences.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trust is derived from proof.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;IMHO&lt;/span&gt;, bootstrapping a DevOps culture of trust is solely dependent on testing.  And thus, DevOps is indeed a technology problem &amp;#8211; assuming that testing must be automated as much as possible in order to be of long-term value.&lt;/p&gt;
&lt;p&gt;Even within the software engineering microcosm the same issues of trust exist.  Agile practices, as stated in my &lt;a href=&quot;http://pragprog.com/titles/pad/practices-of-an-agile-developer&quot;&gt;favorite book&lt;/a&gt; on the subject, push for respect in the form of humans and technology.  Source code management tools enable Agile practices like &amp;#8220;commit early, commit often&amp;#8221; and continuous integration, which lead to transparency and respect, and thus trust later.  Without source control, trust would never survive developer turnover and external technology influences or organizational culture.&lt;/p&gt;
&lt;p&gt;In order to build and grow DevOps cultures we need to be more &amp;#8220;inclusive&amp;#8221; of software development culture and practices, and extend to and accept the technology discussion.  The technology solution needs to go all the way to the front-end (requirements/stories) and include automated quality assurance in the middle.  If we don&amp;#8217;t end-to-end trust and collaboration will be a pipe dream.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I&amp;#8217;ll be &lt;a href=&quot;http://www.maestrodev.com/events/devops-day-los-angeles&quot;&gt;speaking&lt;/a&gt; on this subject at &lt;a href=&quot;http://www.socallinuxexpo.org/scale9x/special-events/devops-day-los-angeles&quot;&gt;DevOps Day&lt;/a&gt; at &lt;a href=&quot;http://www.socallinuxexpo.org/scale9x/&quot;&gt;SCALE9X&lt;/a&gt; if you&amp;#8217;d like to engage on the discussion.  I&amp;#8217;d love any feedback, comments, or WTFs.&lt;/p&gt;</description>
   		<pubDate>Mon, 31 Jan 2011 00:00:00 CST</pubDate>
 	</item>
 	
 	<item>
   		<title>Starting Up with MaestroDev Startup</title>
   		<link>http://kitplummer.github.com/2011/01/27/maestrodev.html</link>
   		<guid>http://kitplummer.github.com/2011/01/27/maestrodev</guid>
   		<description>&lt;h1&gt;Starting Up with MaestroDev Startup&lt;/h1&gt;
&lt;p&gt;I&amp;#8217;ve recently started the next chapter of my working life.  I hesitate to call it a career, which seems more appropriate for doctors, teachers, and the like.  I suppose I am fortunate, however, to be able to fit work into a path called Software Engineering.  For the first time, I&amp;#8217;ll be working as a software engineer, for software engineers (and more).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.maestrodev.com/sites/all/themes/maestrodev_v2/images/maestrodev_logo.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The company I am joining is called &lt;a href=&quot;http://www.maestrodev.com&quot;&gt;MaestroDev&lt;/a&gt; and our main product is Maestro.  More on Maestro in future posts, but quickly it is an build and private cloud environment that automates the build-test-release-deploy lifecycle from a single web interface, targeting enterprise development and operations shops.  How&amp;#8217;s that for marketeering?&lt;/p&gt;
&lt;p&gt;Aside from the excitement I have for Maestro, I&amp;#8217;m very pleased to get to spread the &lt;a href=&quot;http://www.google.com/search?sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=devops&quot;&gt;DevOps&lt;/a&gt; gospel.  In fact I&amp;#8217;ll be speaking at &lt;a href=&quot;https://www.socallinuxexpo.org/scale9x/special-events/devops-day-los-angeles&quot;&gt;DevOps Day&lt;/a&gt; in LA on 2/25 as part of the greater Southern California Linux Expo event.  To top it off, I get to do all of this in the context of the big wide enterprise, and not just the Department of Defense industrial complex where I spent the majority of my waking hours.  This is such a huge opportunity for me that I can only hope to be able to make my mark and add value to it.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m also very much looking forward to a new set of peers, meeting all of the people already committed to this space, as well as enlightening all of my current dever friends to the DevOps and modern software engineering ways.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s to it!&lt;/p&gt;
&lt;p&gt;Have been toying with how to use QR codes, personally and professionally.  This one is just a link to the MaestroDev site, but we&amp;#8217;re thinking it would be cool to have it point to a bio page on our corporate site.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/maestrodev-qr-sm.png&quot; title=&quot;MaestroDev QR Code&quot; alt=&quot;MaestroDev QR Code&quot; /&gt;&lt;/p&gt;</description>
   		<pubDate>Thu, 27 Jan 2011 00:00:00 CST</pubDate>
 	</item>
 	
 	<item>
   		<title>Pax Exam and ActiveMQ...Testing OSGi Bundles and JMS</title>
   		<link>http://kitplummer.github.com/2010/12/18/pax-exam-activemq.html</link>
   		<guid>http://kitplummer.github.com/2010/12/18/pax-exam-activemq</guid>
   		<description>&lt;h1&gt;Pax Exam and ActiveMQ&amp;#8230;Testing OSGi Bundles and &lt;span class=&quot;caps&quot;&gt;JMS&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;I&amp;#8217;ve been working with OSGi, specifically &lt;a href=&quot;http://karaf.apache.org&quot;&gt;Apache Felix/Karaf&lt;/a&gt;, a lot lately.  I&amp;#8217;m also building a few services that interact via &lt;span class=&quot;caps&quot;&gt;JMS&lt;/span&gt;.  Being test-minded I was looking for a good way to automate testing of my bundles, possibly even deployed against multiple OSGi frameworks.  I found &lt;a href=&quot;http://wiki.ops4j.org/display/paxexam/Pax+Exam&quot;&gt;PaxExam&lt;/a&gt; and became enamored with its great features for integration testing OSGi bundles, or multiples thereof.  Pax Exam provides a great &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;-based scheme for declaring dependent bundles, and means for fetching them from &lt;a href=&quot;http://maven.apache.org&quot;&gt;Maven&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s already some great posts on using PaxExam, like this &lt;a href=&quot;http://www.jroller.com/habuma/entry/putting_osgi_to_the_test&quot;&gt;one&lt;/a&gt; &amp;#8211; so I won&amp;#8217;t get too much into that.  But here&amp;#8217;s how I was able to test a couple of &lt;a href=&quot;http://www.google.com/search?&amp;amp;ie=UTF-8&amp;amp;q=osgi+blueprint&quot;&gt;Blueprint&lt;/a&gt; -based bundles that require a &lt;em&gt;javax.jms.ConnectionFactory&lt;/em&gt; to be injected.  I also am using ActiveMQ to run an embedded (within the test harness) &lt;span class=&quot;caps&quot;&gt;JMS&lt;/span&gt; broker, and expose a ConnectionFactory to the OSGi service framwork.&lt;/p&gt;
&lt;p&gt;First, I create an embedded broker in the &amp;#8220;setup&amp;#8221; method, and create and register the ConnectionFactory:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/747074.js?file=PaxExamBrokerSetup.java&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;Note the disabling of the &lt;span class=&quot;caps&quot;&gt;JMX&lt;/span&gt; in the broker &amp;#8211; otherwise ActiveMQ will fail to launch because some OSGi framework initiate the same 1099 &lt;span class=&quot;caps&quot;&gt;JMX&lt;/span&gt; port.&lt;/p&gt;
&lt;p&gt;Use the @Configuration annotation to setup the broker&amp;#8217;s required dependencies:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/747098.js?file=PaxExamBrokerConfiguration.java&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;Now, any @Test cases can send messages to bundles, and listen on topics or queues which bundles produce to.&lt;/p&gt;
&lt;p&gt;Lastly, I use the @After annotation and to shutdown the broker:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/747097.js?file=PaxExamBrokerShutdown.java&quot;&gt;&lt;/script&gt;&lt;/p&gt;</description>
   		<pubDate>Sat, 18 Dec 2010 00:00:00 CST</pubDate>
 	</item>
 	
 	<item>
   		<title>Busted Update...Open Development/Government.</title>
   		<link>http://kitplummer.github.com/tucson/2010/11/14/busted-update.html</link>
   		<guid>http://kitplummer.github.com/tucson/2010/11/14/busted-update</guid>
   		<description>&lt;h1&gt;Busted Update&amp;#8230;Open Development/Government.&lt;/h1&gt;
&lt;p&gt;Hey OpTucs.&lt;/p&gt;
&lt;p&gt;Just wanted to give props to Lucas Taylor for making a small, and needed, updated to the Busted feed service.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kitplummer/Busted/pull/1&quot;&gt;https://github.com/kitplummer/Busted/pull/1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The details of the fix aren&amp;#8217;t really all that important or exciting here.  What is really cool, and worth sharing, is the actual process of collaboration.&lt;/p&gt;
&lt;p&gt;This is how I think it went down.  At the last Open Tucson shindig, which Lucas and I attended, we discussed a few ideas about how the group can participate in the opening of Tucson&amp;#8217;s data sources and promote greater transparency within the local governments.  One of the solutions, that actually started during our Great American Hackathon last year, was the retrofitting of the SunTran bus feed into a more usable and accessible format &amp;#8211; and has been dubbed Busted (by me).  Busted has since turned into an opportunity for further development as a data source for a few different ideas revolving around local-business advertising and mobile applications.&lt;/p&gt;
&lt;p&gt;Because Busted is open source Lucas was not only able to access the data feed, but also the code that actually does the raw data transformations.  Lucas found a small issue with one of the bus feeds.  (In my opinion this is where things get really cool.)  Because the code is hosted at &lt;a href=&quot;http://github.com&quot;&gt;http://github.com&lt;/a&gt;, a social coding and collaboration site, Lucas was able to &amp;#8220;clone&amp;#8221; my repository into his own personal environment and make the required changes.  The key here is that he was able to do so without me even knowing &amp;#8211; or having to gain permission to my repository.  Lucas then made the fixes.&lt;/p&gt;
&lt;p&gt;Obviously it doesn&amp;#8217;t end here.  Because most open source development is done, well, in the ope n &amp;#8211; there are typical geographic distribution challenges to overcome.  The software development world, long familiar with this requirement, has create various tools to help work with distributed code.  One of those, and the backbone of Github, is called git.  Git is distributed version control system (&lt;span class=&quot;caps&quot;&gt;DVCS&lt;/span&gt;) that provides the &amp;#8220;cloning&amp;#8221; capability that allowed Lucas to copy my repository and work within his own environment.  Git also provides an apparatus for distributing the changes that Lucas made, back to me, or anyone else for that matter (who might have also cloned my repository).  Git calls this transaction a &amp;#8220;pull request&amp;#8221; and Github makes this dead simple by generating the request and sending it to me as message (email too).  For me to incorporate Lucas&amp;#8217; fix it took a couple steps and voila, we&amp;#8217;re now in sync and my repository has been updated and Busted has been made better.  It took a single additional step for me to send the new Busted to t he &amp;#8220;cloud&amp;#8221; and affect the &amp;#8220;live&amp;#8221; feed.&lt;/p&gt;
&lt;p&gt;All of this sounds really complex, or really easy &amp;#8211; but let me assure it is closer to the latter.  The value of data transparency is only the starting point for improving our governments.  Transparency is required all the way out to the organizations and communities who are creating solutions.  Open Tucson and all of the other &amp;#8220;Government 2.0&amp;#8221; organizations need more of this type of collaboration.  Thanks to Lucas for the opportunity to highlight the coolness of &amp;#8220;openness&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Kit&lt;/p&gt;
&lt;p&gt;[This is a copy of a post made to the Open Tucson Google group&amp;#8217;s discussion forum, but it doesn&amp;#8217;t have public access yet.]&lt;/p&gt;</description>
   		<pubDate>Sun, 14 Nov 2010 00:00:00 CST</pubDate>
 	</item>
 	
 	<item>
   		<title>Busted - Now Feeding JSON</title>
   		<link>http://kitplummer.github.com/tucson/2010/10/15/busted-now-feeding-json.html</link>
   		<guid>http://kitplummer.github.com/tucson/2010/10/15/busted-now-feeding-json</guid>
   		<description>&lt;h1&gt;Busted &amp;#8211; Now Feeding &lt;span class=&quot;caps&quot;&gt;JSON&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;It&amp;#8217;s been a bit&amp;#8230;been too busy (yep, broken record :)).&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the service&amp;#8217;s site: &lt;a href=&quot;http://busted.kitplummer.apigee.com&quot;&gt;http://busted.kitplummer.apigee.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://busted.kitplummer.apigee.com/beta/route/2.json&quot;&gt;http://busted.kitplummer.apigee.com/beta/route/2.json&lt;/a&gt; shows the feed for Route #2: &amp;#8220;Cherrybell/Country Club&amp;#8221;&lt;/p&gt;
&lt;p&gt;The list of all routes can be fetched too: &lt;a href=&quot;http://busted.kitplummer.apigee.com/beta/routes.json&quot;&gt;http://busted.kitplummer.apigee.com/beta/routes.json&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m starting to look adding support for the &lt;a href=&quot;http://code.google.com/transit/spec/transit_feed_specification.html&quot;&gt;General Transit Feed Specification&lt;/a&gt; and publication to Google&amp;#8217;s transit feeds.  Stay tuned&amp;#8230;&lt;/p&gt;</description>
   		<pubDate>Fri, 15 Oct 2010 00:00:00 CST</pubDate>
 	</item>
 	
 	<item>
   		<title>Busted - A Tucson SunTran WebWatch Feed Proxy Service</title>
   		<link>http://kitplummer.github.com/2010/06/29/busted-suntran-webwatch-proxy.html</link>
   		<guid>http://kitplummer.github.com/2010/06/29/busted-suntran-webwatch-proxy</guid>
   		<description>&lt;h1&gt;Busted &amp;#8211; A Tucson SunTran WebWatch Feed Proxy Service&lt;/h1&gt;
&lt;p&gt;It&amp;#8217;s been a bit&amp;#8230;been too busy.  Changes coming.  Anywho&amp;#8230;&lt;/p&gt;
&lt;p&gt;Back in December, we kicked off the &lt;a href=&quot;http://www.opentucson.org/2009/12/first-meeting/&quot;&gt;Open Tucson&lt;/a&gt; working group with the aspiration to push Tucson into the &amp;#8220;open&amp;#8221; limelight with many other forward-leaning municipalities. The city has some cool initiatives, services like &lt;a href=&quot;http://www.seeclickfix.com/tucson&quot;&gt;SeeClickFix&lt;/a&gt;, that are making there way into public use.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://suntran.com/&quot;&gt;SunTran&lt;/a&gt;, the city&amp;#8217;s mass transit service, has made its bus service information, available in a close-to-realtime view via Google Maps or Microsoft Virtual Earth maps.  Even the data is being distributed in map form it would be really cool if SunTran made the raw information available for the opportunity of mobile apps, mashups or any innovative use.&lt;/p&gt;
&lt;p&gt;A few of us from the Open Tucson group met with SunTran last week to discuss.  While they are willing to help, they are somewhat handcuffed by the system that homes all the data behind the maps.  Ian Johnson, from the &lt;a href=&quot;http://www.moiagroup.com&quot;&gt;Moia Group&lt;/a&gt;, and I poked around the client-side SunTran &lt;a href=&quot;http://www.suntran.com/webwatch/map.aspx?mode=g&quot;&gt;WebWatch&lt;/a&gt; code a bit and found the data feed that the maps consume.  It&amp;#8217;s ugly, really ugly &amp;#8211; &lt;a href=&quot;http://www.suntran.com/webwatch/UpdateWebMap.aspx?u=2&quot;&gt;take a peek here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, I built a simple &lt;a href=&quot;http://sinatrarb.com&quot;&gt;Sinatra&lt;/a&gt; app to home a proxy service, to repackage the data into a more usable format.  I&amp;#8217;ve put the service up under the &lt;a href=&quot;http://heroku.com&quot;&gt;Heroku&lt;/a&gt; IaaS/PaaS, hey it&amp;#8217;s free.  In order to test, and more importantly capture analytics for, the proxy feed I&amp;#8217;ve put the proxy behind &lt;a href=&quot;http://www.apigee.com&quot;&gt;Apigee&lt;/a&gt;.  Apigee is a &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; proxy, that provides Google Analytics-like information about usage.  Cool stuff.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the service&amp;#8217;s site: &lt;a href=&quot;http://busted.kitplummer.apigee.com&quot;&gt;http://busted.kitplummer.apigee.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s some basic instructions there, but I think it is easy to see that &lt;a href=&quot;http://busted.kitplummer.apigee.com/alpha/route/2&quot;&gt;http://busted.kitplummer.apigee.com/alpha/route/2&lt;/a&gt; is a bit more developer friendly than the SunTran feed.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re talking about getting the Open Tucson group &lt;a href=&quot;http://groups.google.com/group/open-tucson/browse_thread/thread/fbcc29feec7e8bcc&quot;&gt;together again&lt;/a&gt; on the 8th of July.  Check the Open Tucson &lt;a href=&quot;http://www.opentucson.org&quot;&gt;site&lt;/a&gt; for the deets.&lt;/p&gt;</description>
   		<pubDate>Tue, 29 Jun 2010 00:00:00 CST</pubDate>
 	</item>
 	
  </channel>
</rss>
