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

<channel>
	<title>ghostar</title>
	<atom:link href="http://www.ghostar.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ghostar.org</link>
	<description>brick by brick.</description>
	<lastBuildDate>Sat, 23 Jul 2011 14:37:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Hadoop, facter, and the puppet marionette</title>
		<link>http://www.ghostar.org/2011/03/hadoop-facter-and-the-puppet-marionette/</link>
		<comments>http://www.ghostar.org/2011/03/hadoop-facter-and-the-puppet-marionette/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 20:37:37 +0000</pubDate>
		<dc:creator>hcoyote</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[facter]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[puppet]]></category>

		<guid isPermaLink="false">http://www.ghostar.org/?p=138</guid>
		<description><![CDATA[I&#8217;ve been working with puppet a lot lately.  A lot.  It&#8217;s part of my job.  We&#8217;ve been setting up a new hadoop cluster in our Xen environment.  Nothing big.  It started out with 4 nodes, all configured the same way &#8230; <a href="http://www.ghostar.org/2011/03/hadoop-facter-and-the-puppet-marionette/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working with puppet a lot lately.  A lot.  It&#8217;s part of my job.  We&#8217;ve been setting up a new hadoop cluster in our Xen environment.  Nothing big.  It started out with 4 nodes, all configured the same way (3 drives each).  We added an additional 2 nodes with 2 drives each.  This, of course, broke how we were having to manage the hadoop configuration files.  I spent the last few days figuring out how to create a custom Puppet fact (for our Puppet 2.6.4 installation) that would search for the HDFS drives on our nodes and configure the hdfs-site.xml and mapred-site.xml appropriately.</p>
<p>First, in our hadoop module, I created the modules/hadoop/lib/facter path and added the following facter code to hdfs_path.rb in there.</p>
<pre>require 'facter'

paths = []

if FileTest.exists?("/sbin/e2label")

    drives = Dir.glob("/dev/sd?1")
    drives += Dir.glob("/dev/*vg/hdfs*_lv")

    drives.each do |drive|
        #if FileTest.exists?("/dev/#{drive}1")
        if FileTest.exists?(drive)
            output = %x{/sbin/e2label #{drive} 2>/dev/null}.chomp

            # only run this fact if we find hdfs in the label name.
            if output =~ /hdfs/ and output =~ /_/
                device = output.split("_")[1]
                devicenumber = device.split("hdfs")[1]
                path = "/hdfs/" + devicenumber
                paths.push(path)
                Facter.add("hdfs_#{device}") do
                    setcode do
                        path
                    end
                end
            end
        end
    end

	allpaths = paths.join(",")
    Facter.add("hdfs_all_paths") do
        setcode do
            allpaths
        end
    end
end
</pre>
<p>This would look for drives on the hadoop node that had an ext3 label of <code>hostname_hdfs#</code>.  For example, one of these would be <code>vhdn01_hdfs1</code>.  The fact would be populated with the value <code>/hdfs/1</code>.  The facter module would create one entry of these per device found.  As well, it would create a fact called <code>hdfs_all_paths</code> that contained a comma separated list of every path we found.  These would be used in the templates for mapred-site.xml and hdfs-site.xml to setup the list of paths we&#8217;re using.</p>
<p>In our template, we created</p>
<pre>&lt;property&gt;
 &lt;name&gt;dfs.data.dir&lt;/name&gt;
 &lt;value&gt;&lt;%= hdfs_all_paths.split(",").map { |n| n + "/hdfs"}.join(",") -%&gt;&lt;/value&gt;
 &lt;final&gt;true&lt;/final&gt;
&lt;/property&gt;
</pre>
<p>which creates a comma separated list of paths and tacks on /hdfs to each item.  For example, this takes /hdfs/1,/hdfs/2 and turns it into /hdfs/1/hdfs,/hdfs/2/hdfs.</p>
<p>Some things to note:  I run in an agent/master setup.  In order for the fact to be sent down to the agent, we need to enable <code>pluginsync</code> on both ends.  You can do this by adding the option to your puppet.conf.  It needs to go in the <code>[main]</code> section.  For example.</p>
<pre>[main]
pluginsync = true
</pre>
<p>The other caveat I ran into is that in order for this to work, you need to make sure you have the fact on the client system before you use it in your catalog (such as in your templates), otherwise your catalog might not compile when you go to run your agent.</p>
<p>Once I got all these things figure out, I got a much more easily configured hadoop datanode setup.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghostar.org/2011/03/hadoop-facter-and-the-puppet-marionette/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Playing with the perl RTM client.</title>
		<link>http://www.ghostar.org/2011/01/playing-with-the-perl-rtm-client/</link>
		<comments>http://www.ghostar.org/2011/01/playing-with-the-perl-rtm-client/#comments</comments>
		<pubDate>Tue, 04 Jan 2011 20:00:29 +0000</pubDate>
		<dc:creator>hcoyote</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[commandfu]]></category>
		<category><![CDATA[rtm]]></category>

		<guid isPermaLink="false">http://www.ghostar.org/?p=136</guid>
		<description><![CDATA[I began playing with a perl-based RememberTheMilk command line tool today from http://www.rutschle.net/rtm/.  There aren&#8217;t any RPMs of it that I found, so I ended up building some.  This is what I had to do to get it to the &#8230; <a href="http://www.ghostar.org/2011/01/playing-with-the-perl-rtm-client/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I began playing with a perl-based RememberTheMilk command line tool today from http://www.rutschle.net/rtm/.  There aren&#8217;t any RPMs of it that I found, so I ended up building some.  This is what I had to do to get it to the stage of at least working.</p>
<pre>
:;  sudo cpan2rpm WebService::RTMAgent</code>

-- cpan2rpm - Ver: 2.028 --
Upgrade check
Fetch: HTTP

-- module: WebService::RTMAgent --
Using cached URL: http://search.cpan.org//CPAN/authors/id/R/RU/RUTSCHLE/WebService-RTMAgent-0.5_1.tar.gz
Tarball found - not fetching
Metadata retrieval
Tarball extraction: [/home/tcampbell/src/rpm/SOURCES/WebService-RTMAgent-0.5_1.tar.gz]

Can't locate object method "interpolate" via package "Pod::Text" at /usr/bin/cpan2rpm line 525.
cannot remove path when cwd is /tmp/yFnnvY7DA3/WebService-RTMAgent-0.5_1 for /tmp/yFnnvY7DA3:  at /usr/share/perl5/File/Temp.pm line 902
-- Done --
</pre>
<p>But, I ran into this dumb perl interpolate bug.  Turns out that cpan2rpm has an issue with newer versions of perl where Pod::Text no longer has this method.  Changing Pod::Text to Pod::Parser in cpan2rpm allowed this to succeed.</p>
<pre>
sudo cpan2rpm WebService::RTMAgent  --no-sign

-- cpan2rpm - Ver: 2.028 --
Upgrade check
Fetch: HTTP

-- module: WebService::RTMAgent --
Using cached URL: http://search.cpan.org//CPAN/authors/id/R/RU/RUTSCHLE/WebService-RTMAgent-0.5_1.tar.gz
Tarball found - not fetching
Metadata retrieval
Tarball extraction: [/home/tcampbell/src/rpm/SOURCES/WebService-RTMAgent-0.5_1.tar.gz]
Generating spec file
SPEC: /home/tcampbell/src/rpm/SPECS/WebService-RTMAgent.spec
Generating package
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.xs7L3d
+ umask 022
+ cd /home/tcampbell/src/rpm/BUILD
+ cd /home/tcampbell/src/rpm/BUILD
+ rm -rf WebService-RTMAgent-0.5_1
+ /usr/bin/gzip -dc /home/tcampbell/src/rpm/SOURCES/WebService-RTMAgent-0.5_1.tar.gz
+ /bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd WebService-RTMAgent-0.5_1
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ chmod -R u+w /home/tcampbell/src/rpm/BUILD/WebService-RTMAgent-0.5_1
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.sKaxgX
+ umask 022
+ cd /home/tcampbell/src/rpm/BUILD
+ cd WebService-RTMAgent-0.5_1
+ grep -rsl '^#!.*perl' .
+ grep -v '.bak$'
+ xargs --no-run-if-empty /usr/bin/perl -MExtUtils::MakeMaker -e 'MY->fixin(@ARGV)'
+ CFLAGS='-O2 -g -march=i386 -mtune=i686'
++ /usr/bin/perl -MExtUtils::MakeMaker -e ' print qq|PREFIX=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr| if $ExtUtils::MakeMaker::VERSION =~ /5\.9[1-6]|6\.0[0-5]/ '
+ /usr/bin/perl Makefile.PL
Checking if your kit is complete...
Looks good
WARNING: Setting ABSTRACT via file 'lib/WebService/RTMAgent.pm' failed
 at /usr/share/perl5/ExtUtils/MakeMaker.pm line 603
Writing Makefile for WebService::RTMAgent
+ /usr/bin/make
cp lib/WebService/RTMAgent.pm blib/lib/WebService/RTMAgent.pm
Manifying blib/man3/WebService::RTMAgent.3pm
+ /usr/bin/make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/00-load.t ....... 1/1 # Testing WebService::RTMAgent 0.5_1, Perl 5.010001, /usr/bin/perl
t/00-load.t ....... ok
t/auth.t .......... frobbed -- getting token
t/auth.t .......... 1/7 frobbed -- getting token
token token
t/auth.t .......... ok
t/boilerplate.t ... ok
t/init.t .......... ok
t/pod-coverage.t .. skipped: Test::Pod::Coverage 1.08 required for testing POD coverage
t/pod.t ........... ok
t/requests.t ...... 1/12 request:
POST http://www.rememberthemilk.com/services/rest/
Content-Type: application/x-www-form-urlencoded

method=rtm.tasks.add&#038;nam=adding&#038;api_key=key&#038;auth_token=10438&#038;timeline=114114&#038;api_sig=3340edd30a22e9b2c67ff206283d0b67

response:
HTTP/1.1 200 OK
Connection: keep-alive
Date: Mon, 24 Dec 2007 11:49:10 GMT
Server: nginx/RTM
Vary: Accept-Encoding
Content-Type: text/xml; charset="utf-8"
Client-Date: Mon, 24 Dec 2007 11:50:39 GMT
Client-Peer: 75.126.232.204:80
Client-Response-Num: 1
Client-Transfer-Encoding: chunked
Keep-Alive: timeout=300

<?xml version="1.0" encoding="UTF-8"?>
<rsp stat="fail"><err code="4000" msg="Task name provided is invalid."/></rsp>

t/requests.t ...... ok
t/undo.t .......... ok
All tests successful.

Test Summary Report
-------------------
t/boilerplate.t (Wstat: 0 Tests: 3 Failed: 0)
  TODO passed:   1-3
Files=8, Tests=35,  0 wallclock secs ( 0.05 usr  0.01 sys +  0.59 cusr  0.06 csys =  0.71 CPU)
Result: PASS
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.7ZK9SK
+ umask 022
+ cd /home/tcampbell/src/rpm/BUILD
+ cd WebService-RTMAgent-0.5_1
+ '[' /home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386 '!=' / ']'
+ rm -rf /home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386
++ /usr/bin/perl -MExtUtils::MakeMaker -e ' print $ExtUtils::MakeMaker::VERSION <= 6.05 ? qq|PREFIX=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr| : qq|DESTDIR=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386| '
+ make prefix=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr exec_prefix=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr bindir=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/bin sbindir=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/sbin sysconfdir=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/etc datadir=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/share includedir=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/include libdir=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/lib libexecdir=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/libexec localstatedir=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/var sharedstatedir=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/var/lib mandir=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/share/man infodir=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/share/info install DESTDIR=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386
Manifying blib/man3/WebService::RTMAgent.3pm
Installing /home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/local/share/perl5/WebService/RTMAgent.pm
Installing /home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/local/share/man/man3/WebService::RTMAgent.3pm
Appending installation info to /home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/lib/perl5/perllocal.pod
+ cmd=/usr/share/spec-helper/compress_files
+ '[' -x /usr/share/spec-helper/compress_files ']'
+ cmd=/usr/lib/rpm/brp-compress
+ '[' -x /usr/lib/rpm/brp-compress ']'
+ /usr/lib/rpm/brp-compress
+ '[' -e /etc/SuSE-release -o -e /etc/UnitedLinux-release ']'
+ find /home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386 -name perllocal.pod -o -name .packlist -o -name '*.bs'
+ xargs -i rm -f '{}'
+ find /home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr -type d -depth -exec rmdir '{}' ';'
+ /usr/bin/perl -MFile::Find -le '
    find({ wanted => \&#038;wanted, no_chdir => 1}, "/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386");
    print "%doc  Changes README";
    for my $x (sort @dirs, @files) {
        push @ret, $x unless indirs($x);
        }
    print join "\n", sort @ret;

    sub wanted {
        return if /auto$/;

        local $_ = $File::Find::name;
        my $f = $_; s|^\Q/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386\E||;
        return unless length;
        return $files[@files] = $_ if -f $f;

        $d = $_;
        /\Q$d\E/ &#038;&#038; return for reverse sort @INC;
        $d =~ /\Q$_\E/ &#038;&#038; return
            for qw|/etc /usr/man /usr/bin /usr/share|;

        $dirs[@dirs] = $_;
        }

    sub indirs {
        my $x = shift;
        $x =~ /^\Q$_\E\// &#038;&#038; $x ne $_ &#038;&#038; return 1 for @dirs;
        }
    '
+ '[' -z WebService-RTMAgent-0.5_1-filelist ']'
+ /usr/lib/rpm/brp-compress
+ /usr/lib/rpm/brp-strip
+ /usr/lib/rpm/brp-strip-static-archive
+ /usr/lib/rpm/brp-strip-comment-note
Processing files: perl-WebService-RTMAgent-0.5_1-1.noarch
Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.25mTCz
+ umask 022
+ cd /home/tcampbell/src/rpm/BUILD
+ cd WebService-RTMAgent-0.5_1
+ DOCDIR=/home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/share/doc/perl-WebService-RTMAgent-0.5_1
+ export DOCDIR
+ rm -rf /home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/share/doc/perl-WebService-RTMAgent-0.5_1
+ /bin/mkdir -p /home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/share/doc/perl-WebService-RTMAgent-0.5_1
+ cp -pr Changes README /home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386/usr/share/doc/perl-WebService-RTMAgent-0.5_1
+ exit 0
Provides: perl(WebService::RTMAgent) = 0.5
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(VersionedDependencies) <= 3.0.3-1
Requires: perl(Carp) perl(Digest::MD5) perl(LWP::UserAgent) perl(XML::Simple) perl(strict) perl(vars)
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386
Wrote: /home/tcampbell/src/rpm/SRPMS/perl-WebService-RTMAgent-0.5_1-1.src.rpm
Wrote: /home/tcampbell/src/rpm/RPMS/noarch/perl-WebService-RTMAgent-0.5_1-1.noarch.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.xrdBo2
+ umask 022
+ cd /home/tcampbell/src/rpm/BUILD
+ cd WebService-RTMAgent-0.5_1
+ '[' /home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386 '!=' / ']'
+ rm -rf /home/tcampbell/src/rpm/BUILDROOT/perl-WebService-RTMAgent-0.5_1-1.i386
+ exit 0
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.eKyVlR
+ umask 022
+ cd /home/tcampbell/src/rpm/BUILD
+ rm -rf WebService-RTMAgent-0.5_1
+ exit 0
RPM: /home/tcampbell/src/rpm/RPMS/noarch/perl-WebService-RTMAgent-0.5_1-1.noarch.rpm
SRPM: /home/tcampbell/src/rpm/SRPMS/perl-WebService-RTMAgent-0.5_1-1.src.rpm
-- Done --
</pre>
<p>Sweet!  now we can install it.</p>
<pre>
:;  sudo rpm -ivh /home/tcampbell/src/rpm/RPMS/noarch/perl-WebService-RTMAgent-0.5_1-1.noarch.rpm
Preparing...                ########################################### [100%]
   1:perl-WebService-RTMAgen########################################### [100%]
</pre>
<p>Great.  Now we grab the rtm command from the website.</p>
<pre>
:;  wget http://www.rutschle.net/rtm/rtm-0.5.gz
--2011-01-04 13:47:20--  http://www.rutschle.net/rtm/rtm-0.5.gz
Resolving www.rutschle.net... 82.235.147.6
Connecting to www.rutschle.net|82.235.147.6|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4212 (4.1K) [application/x-gzip]
Saving to: `rtm-0.5.gz'

100%[===========================================================================>] 4,212       24.3K/s   in 0.2s    

2011-01-04 13:47:21 (24.3 KB/s) - `rtm-0.5.gz' saved [4212/4212]

:; gunzip rtm-0.5.gz
</pre>
<p>Now, we run it and ... boom.</p>
<pre>
:;  ./rtm-0.5
Use of uninitialized value in concatenation (.) or string at /usr/local/share/perl5/WebService/RTMAgent.pm line 312.
98: Login failed / Invalid auth token
Use of uninitialized value at /usr/local/share/perl5/WebService/RTMAgent.pm line 368
</pre>
<p>Looks like we need to get an auth token.  Looking inside the script, it appears you have to run rtm with the --authorise option.  This creates a URL that you put in the browser to authorize the client with RememberTheMilk.  After that was done, I can now run rtm from the command line.</p>
<pre>
:;  ./rtm-0.5
frobbed -- getting token
token [my token]
0: Turabelle photos
1: do something incredible
2: Ticket to manage notification of changes to bobqueue files.
3: Create ticket to Place bob configs under puppet/avn
4: Rebound payment
</pre>
<p>Looks like that frobbed/token header go away after the first run.</p>
<p>Now I'm good to go with hitting RememberTheMilk from the command line.  Sweet!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghostar.org/2011/01/playing-with-the-perl-rtm-client/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Finally updated this.</title>
		<link>http://www.ghostar.org/2010/12/finally-updated-this/</link>
		<comments>http://www.ghostar.org/2010/12/finally-updated-this/#comments</comments>
		<pubDate>Fri, 24 Dec 2010 01:17:52 +0000</pubDate>
		<dc:creator>hcoyote</dc:creator>
				<category><![CDATA[Sysadmin]]></category>

		<guid isPermaLink="false">http://www.ghostar.org/2010/12/finally-updated-this/</guid>
		<description><![CDATA[Final testing with a post from the iPhone. Yay!]]></description>
			<content:encoded><![CDATA[<p>Final testing with a post from the iPhone. Yay!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghostar.org/2010/12/finally-updated-this/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The &#8220;Enterprise&#8221; …</title>
		<link>http://www.ghostar.org/2010/01/the-enterprise/</link>
		<comments>http://www.ghostar.org/2010/01/the-enterprise/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 22:54:57 +0000</pubDate>
		<dc:creator>hcoyote</dc:creator>
				<category><![CDATA[Sysadmin]]></category>

		<guid isPermaLink="false">http://blogs.utexas.edu/hcoyote/?p=131</guid>
		<description><![CDATA[From a discussion with a few peers in the industry.  I was entertained. peer&#62; Now when I hear someone use the word &#8220;enterprise&#8221; &#160;&#160;&#160;as an adjective, I have to ask them which of the four meanings &#160;&#160;&#160;they intend: peer&#62; 1.  &#8230; <a href="http://www.ghostar.org/2010/01/the-enterprise/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>From a discussion with a few peers in the industry.  I was entertained.</p>
<blockquote><p><strong>peer&gt;</strong> Now when I hear someone use the word &#8220;enterprise&#8221;<br />
    &nbsp;&nbsp;&nbsp;as an adjective, I have to ask them which of the four meanings<br />
    &nbsp;&nbsp;&nbsp;they intend:<br />
<strong>peer&gt;</strong> 1.  defunct and destroyed (the Enterprise aircraft<br />
    &nbsp;&nbsp;&nbsp;carrier from WW2)<br />
<strong>peer&gt;</strong> 2.  ancient and nearly dead (the Enterprise nuclear<br />
   &nbsp;&nbsp;&nbsp; aircraft carrier)<br />
<strong>peer&gt;</strong> 3.  a nonfunctional mockup (the Enterprise space shuttle)<br />
<strong>peer&gt;</strong> 4.  imaginary (the starship Enterprise)<br />
<strong>peer&gt;</strong> Typically &#8220;enterprise software&#8221; fits perfectly in one of<br />
&nbsp;&nbsp;&nbsp;those four categories.</p></blockquote>
<p>Name withheld to, of course, protect the guilty.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghostar.org/2010/01/the-enterprise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lack of backup foils Va.&#8217;s new IT system &#124; Richmond Times-Dispatch</title>
		<link>http://www.ghostar.org/2009/11/lack-of-backup-foils-vas-new-it-system-richmond-times-dispatch/</link>
		<comments>http://www.ghostar.org/2009/11/lack-of-backup-foils-vas-new-it-system-richmond-times-dispatch/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 00:51:34 +0000</pubDate>
		<dc:creator>hcoyote</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[risk]]></category>
		<category><![CDATA[sla]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://blogs.utexas.edu/hcoyote/2009/11/24/lack-of-backup-foils-vas-new-it-system-richmond-times-dispatch/</guid>
		<description><![CDATA[&#8220;Every time we&#8217;re down for an hour, that&#8217;s about 2,500 people inconvenienced,&#8221; Smit said. &#8220;They&#8217;re blaming my people for it and [state IT officials] have an obligation to fix it.&#8221; Lack of backup foils Va.&#8217;s new IT system &#124; Richmond &#8230; <a href="http://www.ghostar.org/2009/11/lack-of-backup-foils-vas-new-it-system-richmond-times-dispatch/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>&#8220;Every time we&#8217;re down for an hour, that&#8217;s about 2,500 people inconvenienced,&#8221; Smit said. &#8220;They&#8217;re blaming my people for it and [state IT officials] have an obligation to fix it.&#8221;</p></blockquote>
<blockquote><p><a href="http://www2.timesdispatch.com/rtd/Business/local/article/DMVV21_20091120-222606/307063/">Lack of backup foils Va.&#8217;s new IT system | Richmond Times-Dispatch</a>.</p></blockquote>
<p>One of the things we&#8217;ve been grappling with lately is some unfortunate unplanned outages of services.  You know what those are &#8230; random event blips caused by butterflies flapping their wings in the South Pacific that stir up turbulence which creates a small wind, that then turns into a hurricane, which rampages over a submarine cable used by the crucial bit of networking that connects you with the rest of the Internet civilization.</p>
<p>A blip.</p>
<p>Sometimes they&#8217;re momentary, sometimes they&#8217;re bad.  What all blips have in common is that they affect a class of your customers in a way that inconviences them in some manner.  The hard part of dealing with an outage is understanding and quantifying what the business impact really is.  When a database server goes out, you implicitly undrestand that it potentially affects all database users plus all services and users downstream that depend upon the database being up.  So how do you realisitically quantify that into a valuable metric?</p>
<p>I bring this up because, as a person in the trenches, I&#8217;m able to better understand the impact of something (and therefore, provide a better mitigation plan) if I can understand the size, length, and number of ripples in the fabric that spread out from the blip.</p>
<p>At large companies, this impact may be described as thousands of dollars per minute of cost charged against the bottom line.  Some places, like VA, point out the number of people an hour that an outage prevented someone from successfully interacting with the DMV.  Websites may see it as the number of advertising impressions that don&#8217;t go out due to the site being unavailable.</p>
<p>Whatever metric is used, it needs to be understandable and an order of magnitude that someone can comprehend.  I understand impacting 2500 people per hour of down time.  I understand costing a company $1 million dollars per minute that the factory is unable to reach it&#8217;s control network. I understand an outage costing an engineering team a day&#8217;s worth of work (which can ultimately affect the bottom line due to down stream slippage in timelines). What that metric comes down to is being able to understand, in measurable terms, how the blip impacts either people or money.</p>
<p>It&#8217;s important to understand these things.  Why?  Because it allows you to more adequately assess your risk of the (unplanned) outage and design your environment appropriately.  If you can point to a solid metric and show how it materially affects people or money, it&#8217;s certainly a lot easier to go to management and provide justification for improvements in your environment.  If you can only say, with vague hand waving, that there&#8217;s AN effect but no data to back that up, you&#8217;re just waffling.</p>
<p>So.  Have you created your approrpriately detailed outage impact metrics?</p>
<p>I haven&#8217;t.  But I&#8217;m working on it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghostar.org/2009/11/lack-of-backup-foils-vas-new-it-system-richmond-times-dispatch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Never change anything on Friday at 5pm.</title>
		<link>http://www.ghostar.org/2009/11/never-change-anything-on-friday-at-5pm/</link>
		<comments>http://www.ghostar.org/2009/11/never-change-anything-on-friday-at-5pm/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 00:08:36 +0000</pubDate>
		<dc:creator>hcoyote</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[fail]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blogs.utexas.edu/hcoyote/?p=127</guid>
		<description><![CDATA[SEVERE: Socket accept failed java.net.SocketException: SSL handshake error javax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled. at org.apache.tomcat.util.net.jsse.JSSESocketFactory.acceptSocket(JSSESocketFactory.java:150) at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:310) at java.lang.Thread.run(Unknown Source) This is the reason you never change anything on Friday &#8230; <a href="http://www.ghostar.org/2009/11/never-change-anything-on-friday-at-5pm/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<pre>SEVERE: Socket accept failed
java.net.SocketException: SSL handshake error
javax.net.ssl.SSLException: No available certificate or key corresponds to the
SSL cipher suites which are
enabled.
        at
org.apache.tomcat.util.net.jsse.JSSESocketFactory.acceptSocket(JSSESocketFactory.java:150)
        at
org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:310)
        at java.lang.Thread.run(Unknown Source)
</pre>
<p>This is the reason you never change anything on Friday at 5pm.  While attempting to update the SSL certificate for the MySQL Enterprise Monitor (for which the process has no documentation), I managed to break it in a way that caused a few hundred megs of these errors to dump to the catalina log for MEM.  Oh, and it meant no monitoring was taking place for a few minutes.</p>
<p>Sigh.</p>
<p>Lesson re-learned.  Glad I made a backup of the keystore before I started mucking with it.  Now we wait for MySQL to provide me with the correct documentation (after they write it some time this weekend).  You would think someone would have already encountered this with their product considering how long it&#8217;s been out there already.</p>
<p>At least we have monitoring back.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghostar.org/2009/11/never-change-anything-on-friday-at-5pm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resizing a multipathed SAN LUN under RHEL5</title>
		<link>http://www.ghostar.org/2009/11/resizing-a-linu-multipathd-san-lun/</link>
		<comments>http://www.ghostar.org/2009/11/resizing-a-linu-multipathd-san-lun/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 17:56:37 +0000</pubDate>
		<dc:creator>hcoyote</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blogs.utexas.edu/hcoyote/?p=125</guid>
		<description><![CDATA[So today I found myself staring at the Red Hat LVM documentation wherein I began to silently cuss.  You see, I needed to double the LUN size for MySQL&#8217;s usage on one of my servers.  These servers are our first &#8230; <a href="http://www.ghostar.org/2009/11/resizing-a-linu-multipathd-san-lun/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>So today I found myself staring at the Red Hat LVM documentation wherein I began to silently cuss.  You see, I needed to double the LUN size for MySQL&#8217;s usage on one of my servers.  These servers are our first that are directly attached into the SAN and running Linux, so we&#8217;re working a bit off the map here.  To make matters more difficult, we&#8217;re using multipathd to manage the SAN connections between the system and SAN, so it wasn&#8217;t very clear on what exactly I should do in this case.  The LVM docs are somewhat &#8230; lacking.</p>
<p>Thanks to the wonder of Google and sheer dumb luck, I ran across <a href="http://www.mail-archive.com/rhelv5-list@redhat.com/msg04850.html">this post</a> on one of the RHEL5 mailing lists.  In that case, the author wasn&#8217;t sure if it was the right method.  But, I had a secondary system and was willing to run with scissors for a moment since we&#8217;re not fully in production yet.</p>
<p>In short, the basic flow of operations is:</p>
<ol>
<li>Figure out the multipath I/O device name.</li>
<li>Figure out the underlying device IDs (or device names)</li>
<li>Issue the resize of the LUN in your SAN.</li>
<li>Tell the kernel to rescan the underlying device IDs so it sees the new LUN size.</li>
<li>Tell multipathd that a resize has occurred.</li>
<li>Issue a pvresize so LVM knows it has more extents to work with now.</li>
<li>Issue an lvresize to increase the logical volume size.</li>
<li>Run resize2fs and do an online resize of the filesystem.</li>
<li>Make popcorn.</li>
<li>Watch a movie.</li>
</ol>
<p>The first time I attempted the process (in a similar, but not quite fashion), I caused the system hang all LVM commands.  I turned off multipathd thinking that it would need to be off while I did the resize.  This appears to not be a healthy way to do it because I ended up having to warm cycle the system.  This is the point where I stopped reading the LVM documentation and found the mailing list post.    Tried it out and it worked.</p>
<p>So, without further ado &#8230;</p>
<pre>
#  multipath -ll mpath0
mpath0 (360060160dac711004c6fa9d07c7cde11) dm-2 DGC,RAID 10
[size=50G][features=1 queue_if_no_path][hwhandler=1 emc][rw]
\_ round-robin 0 [prio=2][active]
 \_ 1:0:1:0 sdc 8:32  [active][ready]
 \_ 2:0:1:0 sde 8:64  [active][ready]
\_ round-robin 0 [prio=0][enabled]
 \_ 1:0:0:0 sdb 8:16  [active][ready]
 \_ 2:0:0:0 sdd 8:48  [active][ready]

#  for i in `multipath -ll mpath0 | grep sd | awk '{print $2}'`; do
&gt; echo $i ; done
1:0:1:0
2:0:1:0
1:0:0:0
2:0:0:0

#  for i in `multipath -ll mpath0 | grep sd | awk '{print $3}'`; do
&gt; blockdev --rereadpt /dev/$i ; done
BLKRRPART: Input/output error
BLKRRPART: Input/output error

#  multipathd -k"resize multipath mpath0"
ok

#  multipath -ll mpath0
mpath0 (360060160dac711004c6fa9d07c7cde11) dm-2 DGC,RAID 10
[size=100G][features=1 queue_if_no_path][hwhandler=1 emc][rw]
\_ round-robin 0 [prio=2][enabled]
 \_ 1:0:1:0 sdc 8:32  [active][ready]
 \_ 2:0:1:0 sde 8:64  [active][ready]
\_ round-robin 0 [prio=0][enabled]
 \_ 1:0:0:0 sdb 8:16  [active][ready]
 \_ 2:0:0:0 sdd 8:48  [active][ready]

#  pvresize /dev/mapper/mpath0
  Physical volume "/dev/mpath/mpath0" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

#  lvresize -L 50G /dev/VolGroupMySQL/mysql-san
  Extending logical volume mysql-san to 50.00 GB
  Logical volume mysql-san successfully resized

#  resize2fs /dev/VolGroupMySQL/mysql-san
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/VolGroupMySQL/mysql-san is mounted on /var/lib/mysql; on-line resizing required
Performing an on-line resize of /dev/VolGroupMySQL/mysql-san to 13107200 (4k) blocks.
The filesystem on /dev/VolGroupMySQL/mysql-san is now 13107200 blocks long.

#  df
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                      9.7G  3.3G  6.0G  36% /
/dev/sda1             122M   13M  103M  11% /boot
tmpfs                 3.9G     0  3.9G   0% /dev/shm
/dev/mapper/VolGroupMySQL-mysql--san
                       50G  795M   46G   2% /var/lib/mysql</pre>
<p>One thing to note is the BLKRRPART errors from blockdev.  This appears to be &#8220;normal&#8221; as far as I can tell.  The kernel through some log messages (included below), but they appear harmless as far as I can discern.  The SCSI notices occurred when I issued the blockdev command.  The device-mapper multipath warning came from the multipathd resize command.</p>
<pre>SCSI device sdc: 209715200 512-byte hdwr sectors (107374 MB)
sdc: Write Protect is off
sdc: Mode Sense: 87 00 00 08
SCSI device sdc: drive cache: write through
sdc: detected capacity change from 53687091200 to 107374182400
 sdc: unknown partition table
SCSI device sde: 209715200 512-byte hdwr sectors (107374 MB)
sde: Write Protect is off
sde: Mode Sense: 87 00 00 08
SCSI device sde: drive cache: write through
sde: detected capacity change from 53687091200 to 107374182400
 sde: unknown partition table
SCSI device sdb: 209715200 512-byte hdwr sectors (107374 MB)
sdb: test WP failed, assume Write Enabled
sdb: asking for cache data failed
sdb: assuming drive cache: write through
sdb: detected capacity change from 53687091200 to 107374182400
 sdb:&lt;6&gt;sd 1:0:0:0: Device not ready: &lt;6&gt;: Current: sense key: Not Ready
    Add. Sense: Logical unit not ready, manual intervention required

end_request: I/O error, dev sdb, sector 0
printk: 68 messages suppressed.

Buffer I/O error on device sdb, logical block 0
 unable to read partition table
SCSI device sdd: 209715200 512-byte hdwr sectors (107374 MB)
sdd: test WP failed, assume Write Enabled
sdd: asking for cache data failed
sdd: assuming drive cache: write through
sdd: detected capacity change from 53687091200 to 107374182400
 sdd:&lt;6&gt;sd 2:0:0:0: Device not ready: &lt;6&gt;: Current: sense key: Not Ready
    Add. Sense: Logical unit not ready, manual intervention required

end_request: I/O error, dev sdd, sector 0
 unable to read partition table
device-mapper: multipath emc: long trespass command will be send
device-mapper: multipath emc: honor reservation bit will not be set (default)
device-mapper: multipath: Using dm hw handler module emc for failover/failback and device management.
device-mapper: multipath emc: emc_pg_init: sending switch-over command</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ghostar.org/2009/11/resizing-a-linu-multipathd-san-lun/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>audun.ytterdal.net » Tshark to the rescue (MySQL snooping)</title>
		<link>http://www.ghostar.org/2009/11/wireshark-tshark-to-the-rescue-mysql-snooping/</link>
		<comments>http://www.ghostar.org/2009/11/wireshark-tshark-to-the-rescue-mysql-snooping/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 23:03:28 +0000</pubDate>
		<dc:creator>hcoyote</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blogs.utexas.edu/hcoyote/?p=120</guid>
		<description><![CDATA[And while I was at it. I figured out I could do something similar with mysql queries. Instead of turning on full Query-logging in mysql (which probably means a restart of a running production mysql) I could just sniff it &#8230; <a href="http://www.ghostar.org/2009/11/wireshark-tshark-to-the-rescue-mysql-snooping/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>And while I was at it. I figured out I could do something similar with mysql queries. Instead of turning on full Query-logging in mysql (which probably means a restart of a running production mysql) I could just sniff it</em></p>
<pre>tshark -i eth0 -aduration:60 -d tcp.port==3306,mysql -T fields \
   -e mysql.query 'port 3306'</pre>
<p><em><cite><a href="http://audun.ytterdal.net/2009/03/tshark-to-the-rescue">audun.ytterdal.net » Tshark to the rescue </a></cite></em></p></blockquote>
<p>I&#8217;ve been using wireshark for awhile now.  I ran across this the other day while trying to debug a non-MySQL issue.  It was a good reminder of wireshark&#8217;s ability to do live dissection of protocol from the command line.  I&#8217;ve had to do this before while trying to debug NFS issues (specifically, trying to work backwards from a packet to figure out the name of an open file descriptor from a file handle and fsid).  Wireshark&#8217;s ability to do this on the fly and from the command line is pretty powerful.</p>
<p>Right now I have a need to figure out why MySQL is showing a bunch of aborted connections.  I was hoping that mysql.error would give me something intelligent to poke after, but I think this occurs all within the MySQL instance.  More digging to do.  It&#8217;s good to know that I can do some impromptu poking around of the MySQL packet if I without firing up a full wireshark session on the server if I need to.</p>
<p>If you have a need to do this, these two things will be helpful.</p>
<ul>
<li><a href="http://www.wireshark.org/docs/dfref/m/mysql.html">Wireshark Display Filter reference for the MySQL Protocol</a></li>
<li><a href="http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol">MySQL Internals ClientServer Protocol</a></li>
</ul>
<p>Happy sniffing!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghostar.org/2009/11/wireshark-tshark-to-the-rescue-mysql-snooping/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Four short links:  Tuesday, Nov 3rd 2009</title>
		<link>http://www.ghostar.org/2009/11/four-short-links-tuesday-nov-3rd-2009/</link>
		<comments>http://www.ghostar.org/2009/11/four-short-links-tuesday-nov-3rd-2009/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 21:30:31 +0000</pubDate>
		<dc:creator>hcoyote</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[links]]></category>

		<guid isPermaLink="false">http://blogs.utexas.edu/hcoyote/?p=117</guid>
		<description><![CDATA[Electric Alchemy: Cracking Passwords in the Cloud: Breaking PGP on EC2 with EDPR.  An interesting discussion about using Amazon EC2 to make it possible for the underfunded layman to crack passwords. &#8220;There is no YEAR ZERO for HTML. It&#8217;s a &#8230; <a href="http://www.ghostar.org/2009/11/four-short-links-tuesday-nov-3rd-2009/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://news.electricalchemy.net/2009/10/cracking-passwords-in-cloud.html">Electric Alchemy: Cracking Passwords in the Cloud: Breaking PGP on EC2 with EDPR</a>.  An interesting discussion about using Amazon EC2 to make it possible for the underfunded layman to crack passwords.</li>
<li><a href="http://diveintomark.org/archives/2009/11/02/why-do-we-have-an-img-element#comment-13472">&#8220;There is no YEAR ZERO for HTML.  It&#8217;s a conversation [...]&#8220;</a>.  One of the comments on <a href="http://diveintomark.org/">Mark Pilgrim&#8217;s</a> post about <a href="http://diveintomark.org/archives/2009/11/02/why-do-we-have-an-img-element">Why do we have an IMG element?</a> in HTML.  Short but good history lesson on how we got here from there.</li>
<li><a href="http://blog.perpetually.com/post/230779975/innovating-cron-announcing-norc">Innovating Cron:  Announcing Norc </a> Do we really need a new cron-like tool?  Maybe we do.  The <a href="http://news.ycombinator.com/item?id=916737">Hacker News discussion</a> has some useful bits of information on queuing and batch systems too.</li>
<li><a href="http://feeds.gawker.com/~r/gizmodo/full/~3/JVYIK1DlXPU/you-wont-need-chairlifts-with-the-fastest-snow-car-in-the-world">Trax STI</a>.  Suburu based snowcat.  WANT.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.ghostar.org/2009/11/four-short-links-tuesday-nov-3rd-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seth&#039;s Blog: Ms. In-between</title>
		<link>http://www.ghostar.org/2009/11/seths-blog-ms-in-between/</link>
		<comments>http://www.ghostar.org/2009/11/seths-blog-ms-in-between/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 15:56:42 +0000</pubDate>
		<dc:creator>hcoyote</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[business]]></category>

		<guid isPermaLink="false">http://blogs.utexas.edu/hcoyote/2009/11/03/seths-blog-ms-in-between/</guid>
		<description><![CDATA[If the only reason you&#8217;re only wearing one hat is because you&#8217;ve always only worn one hat, that&#8217;s not a good reason. Seth&#8217;s Blog: Ms. In-between. Tradition for tradition&#8217;s sake is never a good reason to continue doing something in &#8230; <a href="http://www.ghostar.org/2009/11/seths-blog-ms-in-between/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>If the only reason you&#8217;re only wearing one hat is because you&#8217;ve always only worn one hat, that&#8217;s not a good reason.</em></p>
<p><a href="http://sethgodin.typepad.com/seths_blog/2009/11/ms-inbetween.html">Seth&#8217;s Blog: Ms. In-between</a>.</p></blockquote>
<p>Tradition for tradition&#8217;s sake is never a good reason to continue doing something in a technical environment.  The landscape is ever changing.  You should always be re-evaluating what you&#8217;re doing while keeping an eye on the bleeding edge of your profession. It&#8217;s the difference between being relevant and being the (only) caretaker of a legacy system.</p>
<p>When was the last time <em>you</em> challenged a tradition?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghostar.org/2009/11/seths-blog-ms-in-between/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

