<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6159127251386483687</id><updated>2026-04-15T19:59:11.697-07:00</updated><category term="linux"/><category term="nagios"/><category term="ci"/><category term="continuous-integration"/><category term="hudson"/><category term="it"/><category term="jenkins"/><category term="monitor"/><category term="test"/><category term="windows"/><category term="Apache"/><category term="Artifactory"/><category term="Tomcat"/><category term="amazon"/><category term="atlascamp"/><category term="backup"/><category term="build"/><category term="crucible"/><category term="cvs"/><category term="date"/><category term="dg834g"/><category term="dhcp"/><category term="dns"/><category term="ec2"/><category term="entropy"/><category term="expander"/><category term="fedora"/><category term="fisheye"/><category term="gpg"/><category term="grails"/><category term="info"/><category term="it test support management"/><category term="jira"/><category term="linksys"/><category term="man"/><category term="migration"/><category term="munin"/><category term="netgear"/><category term="netmasq"/><category term="network"/><category term="plugins"/><category term="qa"/><category term="router"/><category term="shell script"/><category term="slave"/><category term="spot price"/><category term="webinject"/><category term="wireless"/><category term="wre54g"/><category term="wtf"/><category term="yesterday"/><title type='text'>Optimal Operations</title><subtitle type='html'>Keeping a software team on the right track</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-6026638623118803191</id><published>2012-01-04T13:27:00.000-08:00</published><updated>2012-01-26T11:57:00.698-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apache"/><category scheme="http://www.blogger.com/atom/ns#" term="Artifactory"/><category scheme="http://www.blogger.com/atom/ns#" term="Tomcat"/><title type='text'>Running Artifactory with Tomcat behind Apache HTTPD</title><content type='html'>&lt;span&gt;At work we&#39;re setting up some new Artifactory instances in the AWS cloud, using all the latest gizmos - Ubuntu 11, Java 7, a dedicated Tomcat instance as the Web container and MySQL as the data store.  We wanted to run Tomcat behind Apache HTTPD as the default application; this took a few tries before we got it right, so I&#39;m posting the details here as I didn&#39;t find many results when Googling.&lt;/span&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;The following assumes you&#39;re using a dedicated Tomcat instance to run Artifactory and that you&#39;ve used their &lt;b&gt;$ARTIFACTORY_HOME/bin/tomcat-install.sh&lt;/b&gt; script to do a standard installation, so that Artifactory is listening on http://yourhost.yourdomain:8081/artifactory, with an AJP listener on port 8019.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Install mod_proxy_ajp:&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;sudo a2enmod proxy_ajp&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Set up the Apache site configuration to proxy requests to Artifactory - default config file under Ubuntu is &lt;b&gt;/etc/apache2/sites-enabled/000-default&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;  ProxyPreserveHost on&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;ProxyPass  / ajp://localhost:8019/artifactory/&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;ProxyPassReverse / http://yourhost.yourdomain/artifactory&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;ProxyPassReverseCookiePath /artifactory/ /&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Add these lines just before the end of the VirtualHost section.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Restart Apache:&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;sudo service apache2 restart&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now Artifactory should respond on http://yourhost.yourdomain&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally, go to the Admin tab in Artifactory, select General in the left toolbar and set the Custom URL Base field to http://yourhost.yourdomain &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/6026638623118803191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2012/01/running-artifactory-with-tomcat-behind.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/6026638623118803191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/6026638623118803191'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2012/01/running-artifactory-with-tomcat-behind.html' title='Running Artifactory with Tomcat behind Apache HTTPD'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-5647399526251161628</id><published>2011-05-10T13:11:00.001-07:00</published><updated>2011-05-10T13:11:35.868-07:00</updated><title type='text'>Testing, 1-2-3</title><content type='html'>There&#39;s a new kid on the block for QA / testing question and answer sites - the &lt;a href=&quot;http://sqa.stackexchange.com/&quot;&gt;SQA Stack Exchange&lt;/a&gt;, brought to you by the good folks behind Stack Overflow and Server Fault among others.&lt;br /&gt;&lt;br /&gt;I hope this one gets more traction than the older &lt;a href=&quot;http://testing.stackexchange.com/&quot;&gt;testing.stackexchange&lt;/a&gt;  site, which never got the volume of users and questions to take off.   Testing questions tend to have less well-defined answers than  programming ones, but there&#39;s already a good chunk of useful knowledge  and opinions on the &lt;a href=&quot;http://sqa.stackexchange.com/&quot;&gt;SQA Stack Exchange&lt;/a&gt;.  Check it out and ask / answer some questions, you&#39;ll feel better !</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/5647399526251161628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2011/05/testing-1-2-3.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/5647399526251161628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/5647399526251161628'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2011/05/testing-1-2-3.html' title='Testing, 1-2-3'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-6740279710882318944</id><published>2010-10-08T11:31:00.000-07:00</published><updated>2011-02-11T12:31:07.125-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="atlascamp"/><category scheme="http://www.blogger.com/atom/ns#" term="crucible"/><category scheme="http://www.blogger.com/atom/ns#" term="fisheye"/><category scheme="http://www.blogger.com/atom/ns#" term="jira"/><category scheme="http://www.blogger.com/atom/ns#" term="plugins"/><title type='text'>Morning, Campers</title><content type='html'>I&#39;m heading to the Atlassian &lt;a href=&quot;http://www.atlassian.com/about/events/atlascamp/2010/&quot;&gt;AtlasCamp &lt;/a&gt;next week with three other guys from work; it should be two and a half days of fun and intensity (plus seafood and beer ;-)), learning how to extend JIRA / Fisheye / Crucible and meeting lots of developers from Atlassian and external plugin companies.  I&#39;ll report back on how it goes in another post.&lt;br /&gt;&lt;br /&gt;We&#39;re trying to extend JIRA in quite a few ways at work, so I&#39;m hoping to find answers to a few things (and ideally apply the &quot;lazy engineer&quot; principle of stealing code that someone has already written rather than doing it myself !).  The main ones at this point are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Using JIRA for test case management (TCM)&lt;/li&gt;&lt;li&gt;Getting build analytics out of JIRA, Fisheye and Perforce that will show all the changes that went into a release, without having to drill down into individual JIRA issues&lt;/li&gt;&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/6740279710882318944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2010/10/morning-campers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/6740279710882318944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/6740279710882318944'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2010/10/morning-campers.html' title='Morning, Campers'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-9183403363468861916</id><published>2010-07-29T10:39:00.000-07:00</published><updated>2011-02-11T12:32:57.761-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ci"/><category scheme="http://www.blogger.com/atom/ns#" term="continuous-integration"/><category scheme="http://www.blogger.com/atom/ns#" term="hudson"/><category scheme="http://www.blogger.com/atom/ns#" term="jenkins"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="migration"/><category scheme="http://www.blogger.com/atom/ns#" term="windows"/><title type='text'>Migrating a Hudson instance</title><content type='html'>Quick post to hopefully help others with an error I got when moving our Hudson instance from Windows to its new home on a Linux server.&lt;br /&gt;&lt;br /&gt;The basic migration is super easy - just zip up the Hudson home directory (default on Windows XP is &lt;span style=&quot;font-style: italic;font-family:courier new;&quot; &gt;C:\Documents and Settings\[username running Hudson]\.hudson&lt;/span&gt;)  and restore it onto the new server.  However, when you start your new Hudson instance you may see one of both of the following errors in the console output:&lt;br /&gt;&lt;br /&gt;SEVERE: Timer task hudson.model.LoadStatistics$LoadStatisticsUpdater@74e8f8c5 failed&lt;br /&gt;java.lang.AssertionError: class hudson.node_monitors.DiskSpaceMonitor is missing its descriptor&lt;br /&gt;       at hudson.model.Hudson.getDescriptorOrDie(Hudson.java:937)&lt;br /&gt;       at hudson.node_monitors.NodeMonitor.getDescriptor(NodeMonitor.java:83)&lt;br /&gt;       at hudson.node_monitors.NodeMonitor.getDescriptor(NodeMonitor.java:67)&lt;br /&gt;       at hudson.util.DescribableList.get(DescribableList.java:104)&lt;br /&gt;       at hudson.model.ComputerSet.&lt;clinit&gt;(ComputerSet.java:356)&lt;br /&gt;       at hudson.model.LoadStatistics$LoadStatisticsUpdater.doRun(LoadStatistics.java:214)&lt;br /&gt;       at hudson.triggers.SafeTimerTask.run(SafeTimerTask.java:54)&lt;br /&gt;       at java.util.TimerThread.mainLoop(Timer.java:512)&lt;br /&gt;       at java.util.TimerThread.run(Timer.java:462)&lt;br /&gt;&lt;br /&gt;Jul 29, 2010 1:47:39 PM hudson.triggers.SafeTimerTask run&lt;br /&gt;SEVERE: Timer task hudson.model.LoadStatistics$LoadStatisticsUpdater@74e8f8c5 failed&lt;br /&gt;java.lang.NoClassDefFoundError&lt;br /&gt;       at hudson.model.LoadStatistics$LoadStatisticsUpdater.doRun(LoadStatistics.java:214)&lt;br /&gt;       at hudson.triggers.SafeTimerTask.run(SafeTimerTask.java:54)&lt;br /&gt;       at java.util.TimerThread.mainLoop(Timer.java:512)&lt;br /&gt;       at java.util.TimerThread.run(Timer.java:462)&lt;br /&gt;&lt;br /&gt;The fix is easy - just stop Hudson, delete the file &lt;span style=&quot;font-style: italic;&quot;&gt;nodeMonitors.xml&lt;/span&gt; in the main Hudson directory, and restart Hudson.  It looks as if that file contains data that&#39;s specific to the old system; Hudson will recreate the file after restart.&lt;/clinit&gt;</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/9183403363468861916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2010/07/migrating-hudson-instance.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/9183403363468861916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/9183403363468861916'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2010/07/migrating-hudson-instance.html' title='Migrating a Hudson instance'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-5803092067906161259</id><published>2010-07-07T15:36:00.000-07:00</published><updated>2011-02-11T12:34:22.767-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ci"/><category scheme="http://www.blogger.com/atom/ns#" term="continuous-integration"/><category scheme="http://www.blogger.com/atom/ns#" term="cvs"/><category scheme="http://www.blogger.com/atom/ns#" term="hudson"/><category scheme="http://www.blogger.com/atom/ns#" term="jenkins"/><category scheme="http://www.blogger.com/atom/ns#" term="windows"/><title type='text'>Hudson as a CVS Watcher on Windows</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb5qpWbHvcXbKhB6erqcqqurr24CwrSHklfEPWELuvMVRGqTbc29CRMVgLeQ0pZ-zkzgwtv7KqeTzhLiQVZlISxdGV0BlNP3LSWBHvlTx140mtKyru4XBLBmkDxfEFXqv2U0-JZObIBdc/s1600/windows_logo.jpeg&quot;&gt;&lt;img style=&quot;float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 160px; height: 116px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb5qpWbHvcXbKhB6erqcqqurr24CwrSHklfEPWELuvMVRGqTbc29CRMVgLeQ0pZ-zkzgwtv7KqeTzhLiQVZlISxdGV0BlNP3LSWBHvlTx140mtKyru4XBLBmkDxfEFXqv2U0-JZObIBdc/s200/windows_logo.jpeg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5491310224911798674&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcFym09LEk4eijkxgsF8uZYxXKi4QA-Bb27nzZYjCbVHBWP1B13FtPUItVvjEtaiSgjt9wq3iLbSIew4H5WVSVnIqbF1l9MSRXhhOfk-_DwGywSJV5QVipOBR9el01XLXlggA8kTKsex4/s1600/butler.png&quot;&gt;&lt;img style=&quot;float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 96px; height: 96px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcFym09LEk4eijkxgsF8uZYxXKi4QA-Bb27nzZYjCbVHBWP1B13FtPUItVvjEtaiSgjt9wq3iLbSIew4H5WVSVnIqbF1l9MSRXhhOfk-_DwGywSJV5QVipOBR9el01XLXlggA8kTKsex4/s200/butler.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5491310121343994258&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I&#39;m currently consulting at a large corporate outfit in Silicon Valley - sometimes it&#39;s a bit like going back in time to the mid-90s.  They&#39;re using CVS and most developers don&#39;t have much visibility into the repository, so one of the first things I set up was an email to interested people every time somebody checks into CVS.&lt;br /&gt;&lt;br /&gt;Hudson was the perfect choice for this since I want to move on to continuous build, test and deployment eventually, but it doesn&#39;t hurt to start with a baby step.  The surprise on the faces of people who haven&#39;t come across Hudson or CI tools in general is something to behold !&lt;br /&gt;&lt;br /&gt;I had to run Hudson on a Windows machine, which came with its own little set of issues, so here&#39;s a step by step for future reference.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install a Windows CVS command line client.  This proved a little hard to track down as the main cvsnt.org site doesn&#39;t seem to have any free downloads any more.  I eventually found the CVSNT client bundled with the CvsGui project at &lt;a href=&quot;http://www.wincvs.org/&quot;&gt;http://www.wincvs.org/&lt;/a&gt; - it comes with a separate installer, cvsnt_steup.exe, that lets you install just the client utilities.&lt;/li&gt;&lt;li&gt;Install and run Hudson - just get the WAR file from the &lt;a href=&quot;http://hudson-ci.org/latest/hudson.war&quot;&gt;download page&lt;/a&gt;, save it locally and run &quot;java -jar hudson.war&quot;&lt;/li&gt;&lt;li&gt;Set up Hudson as a Windows service - in typical easy-to-use Hudson fashion, you do this from within Hudson itself by going to the &quot;&lt;span style=&quot;font-weight: bold;&quot;&gt;Manage Hudson&lt;/span&gt;&quot; page and selecting &quot;&lt;span style=&quot;font-weight: bold;&quot;&gt;Install as Windows service&lt;/span&gt;&quot;.&lt;/li&gt;&lt;li&gt;Make sure that the Hudson service will run as a user that&#39;s already set up to access the CVS repository - for example, if your repository access is via extssh, you&#39;ll need to make sure that the user already has the SSH host connection info saved locally, so that you don&#39;t get prompts about saving the connection info when Hudson tries to do a CVS update.   On Windows XP (yep, my corporate paymaster is still on XP), right-click &lt;span style=&quot;font-weight: bold;&quot;&gt;My Computer&lt;/span&gt; in the Start menu, click &lt;span style=&quot;font-weight: bold;&quot;&gt;Manage&lt;/span&gt;, then &lt;span style=&quot;font-weight: bold;&quot;&gt;Services&lt;/span&gt; under &lt;span style=&quot;font-weight: bold;&quot;&gt;Services and Applications&lt;/span&gt;.  Right click the Hudson service, select &lt;span style=&quot;font-weight: bold;&quot;&gt;Properties&lt;/span&gt;, then enter the user name and Windows password in the &lt;span style=&quot;font-weight: bold;&quot;&gt;Log On&lt;/span&gt; tab.&lt;/li&gt;&lt;li&gt;Restart your machine - I found that this was the only reliable way to get Hudson to come back up after making changes in steps 3 and 4.&lt;/li&gt;&lt;/ol&gt;You should now be good to go and set up your Hudson jobs to poll the CVS repository and report any changes via email; Hudson should be running at http://localhost:8080 by default.&lt;br /&gt;&lt;br /&gt;For extra email configurability I used the&lt;a href=&quot;http://wiki.hudson-ci.org/display/HUDSON/Email-ext+plugin&quot;&gt; email-ext plugin&lt;/a&gt;; this lets you send email for all successful builds (not just failures and fixes like the default Hudson behaviour) and include all kinds of info in the email body, such as a list of file changes in configurable format.&lt;br /&gt;&lt;br /&gt;More to follow as I set up the build and test stuff; we have a client written in Adobe flex talking to a SOAP API with Tibco on the back end, so there should be some, ahem, interesting challenges there ....</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/5803092067906161259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2010/07/hudson-as-cvs-watcher-on-windows.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/5803092067906161259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/5803092067906161259'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2010/07/hudson-as-cvs-watcher-on-windows.html' title='Hudson as a CVS Watcher on Windows'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb5qpWbHvcXbKhB6erqcqqurr24CwrSHklfEPWELuvMVRGqTbc29CRMVgLeQ0pZ-zkzgwtv7KqeTzhLiQVZlISxdGV0BlNP3LSWBHvlTx140mtKyru4XBLBmkDxfEFXqv2U0-JZObIBdc/s72-c/windows_logo.jpeg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-5291822477623406403</id><published>2010-06-18T18:25:00.000-07:00</published><updated>2011-02-11T12:34:50.543-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="qa"/><category scheme="http://www.blogger.com/atom/ns#" term="test"/><title type='text'>Location Irrelevance</title><content type='html'>&lt;span style=&quot;font-weight: bold;&quot;&gt;Warning: &lt;/span&gt;this is a bit more political than my usual tech-heavy posts.&lt;br /&gt;&lt;br /&gt;I was leafing through &lt;a href=&quot;http://www.satisfice.com/blog/&quot;&gt;James Bach&#39;s blog&lt;/a&gt; the other day; James is one of today&#39;s leading writers about software testing and always well worth a read.  He referred to an &lt;a href=&quot;http://testertested.blogspot.com/2010/06/experience-report-of-testing-versus.html&quot;&gt;excellent post &lt;/a&gt;by Pradeep &lt;span&gt;Soundararajan, one of my other favourite testing thinkers and writers, which really nailed some important test patterns that I&#39;ve come across the need for frequently, but never figured out how to summarize.  I highly recommend that you read Pradeep&#39;s post before you carry on.&lt;br /&gt;&lt;br /&gt;At the end of his post, James referred to Pradeep as &quot;&lt;span style=&quot;font-style: italic;&quot;&gt;one of the leading Indian testers&lt;/span&gt;&quot;.  This made me feel a bit uncomfortable, enough so to comment on the post, and James commented back:&lt;br /&gt;&lt;br /&gt;&quot;&lt;span style=&quot;font-style: italic;&quot;&gt;I think culture is relevant, and nationality often associates to  culture. There is a distinctive Indian testing sub-culture. I also think  there is an American testing culture, too. I wouldn&#39;t mind being called  an American tester.&quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I can&#39;t agree with that at all.    Software testing expertise shouldn&#39;t be about culture, location or nationality at all, unless you&#39;re in the really specialized test areas of localization or internationalization.   Given the frequently negative connotation that badly-handled outsourcing projects have given to software professionals outside of North America and Western Europe, I think it does no good at all to classify anyone by nationality or location - or sex, musical taste, number of prehensile toes, or anything else other than ability - when discussing their professional achievements.&lt;br /&gt;&lt;br /&gt;One of the great things about the internet  is that it&#39;s levelled the global playing field for writing, testing and using  computer software to a massive extent.  Let&#39;s keep it that way, recognize the achievements of software professionals all over the world for what they are,  and call a leading tester a leading tester, without confining them to some largely meaningless subcategory. &lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/5291822477623406403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2010/06/location-irrelevance.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/5291822477623406403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/5291822477623406403'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2010/06/location-irrelevance.html' title='Location Irrelevance'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-595302539366876197</id><published>2010-06-10T16:01:00.001-07:00</published><updated>2010-06-26T13:06:45.583-07:00</updated><title type='text'>The Tech Ops Nazi</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://i57.photobucket.com/albums/g210/clizia_photos/tom.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 253px; height: 300px;&quot; src=&quot;http://i57.photobucket.com/albums/g210/clizia_photos/tom.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;I attended the excellent &lt;a href=&quot;http://www.atlassian.com/starter-day&quot;&gt;Atlassian Starter Day&lt;/a&gt; on Wednesday; it was a great session with many highlights (including a &lt;a href=&quot;surprise%20appearance%20by%20Tom%20Cruise&quot;&gt;surprise appearance by &lt;span style=&quot;font-weight: bold;&quot;&gt;Tom Cruise&lt;/span&gt; !&lt;/a&gt;) and worthy of multiple posts.&lt;br /&gt;&lt;br /&gt;With &lt;a href=&quot;http://www.devopsdays.org/2010-us/&quot;&gt;DevOps Days USA&lt;/a&gt; fast approaching (I&#39;m on one of the panels), it was interesting to hear multiple speakers at Starter Day talk about devops concepts.  One of the highlights for me was  &lt;span style=&quot;font-weight: bold;&quot;&gt;Jochen Frey&lt;/span&gt;, &lt;a href=&quot;http://www.scoutlabs.com/&quot;&gt;Scout Labs&lt;/a&gt;&#39; CTO, talking about &lt;a href=&quot;http://www.atlassian.com/starter-day/2010/presentations/software-startup-development-team.jsp&quot;&gt;how to run an effective startup engineering team&lt;/a&gt; (and how to mess it up).  He seemed pretty sleep-deprived, citing Scout Labs&#39; recent acquisition by Lithium Technologies as the reason, but got one of the biggest rounds of applause of the day for soldiering through to the end.&lt;br /&gt;&lt;br /&gt;Jochen especially got my attention when he described the importance  of having a &quot;tech ops nazi&quot; on your team.  This is a kind of QA / program manager / IT ops hybrid person who essentially acts (alone or with their team) as a buffer between the developers and the deployed code, checking multiple criteria before new code is deployed:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the code builds successfully&lt;/li&gt;&lt;li&gt;all the expected changes are included in each build&lt;br /&gt;&lt;/li&gt;&lt;li&gt;all the tests pass on the deployment platform&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the deployment configuration is standardized&lt;/li&gt;&lt;/ul&gt;A lot of this can and should be automated - see &lt;span style=&quot;font-weight: bold;&quot;&gt;Eric Ries&#39; &lt;/span&gt;excellent &quot;&lt;a href=&quot;http://radar.oreilly.com/2009/03/continuous-deployment-5-eas.html&quot;&gt;Continuous Deployment in 5 Easy Steps&lt;/a&gt;&quot; for some ideas here - but there&#39;s no substitute for a human with one foot in development and the other in deployment to deal with the edge cases that always come up.&lt;br /&gt;&lt;br /&gt;I&#39;ve been doing this kind of role myself for the last few years and really enjoy it, so it was nice to get some validation.   That said, I&#39;d rather think of myself as a devops enabler than a tech ops nazi !</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/595302539366876197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2010/06/tech-ops-nazi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/595302539366876197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/595302539366876197'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2010/06/tech-ops-nazi.html' title='The Tech Ops Nazi'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-5515502417406973837</id><published>2010-04-02T17:38:00.000-07:00</published><updated>2010-11-02T09:14:47.379-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="amazon"/><category scheme="http://www.blogger.com/atom/ns#" term="ec2"/><category scheme="http://www.blogger.com/atom/ns#" term="munin"/><category scheme="http://www.blogger.com/atom/ns#" term="nagios"/><category scheme="http://www.blogger.com/atom/ns#" term="spot price"/><title type='text'>EC2 Marks the Spot</title><content type='html'>I&#39;ve been using Amazon EC2 at work and for personal projects for about three years now.  It&#39;s got to the stage where I can&#39;t remember how we used to manage without being able to spin up a test or development machine on demand.&lt;br /&gt;&lt;br /&gt;One downside of EC2 compared to other hosting options is the price.  The cheapest on-demand Linux instance costs 8.5 cents per hour, which works out to just over $60 a month - a bit expensive if you just want to run something like a web server and don&#39;t need full sytem access.  However, Amazon just came up with a way to cut this cost significantly by introducing &lt;a href=&quot;http://aws.amazon.com/ec2/spot-instances/&quot;&gt;Spot Instances&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You can read all the details by following the link, but the basic idea is that you bid on spare EC2 capacity by specifying the maximum price per hour that you&#39;re prepared to pay.  If the current spot price (which varies continually based on supply and demand) is less than your bid, Amazon will start up your instance and keep it running until the spot price becomes higher than your bid.  At that point your instance will be terminated.&lt;br /&gt;&lt;br /&gt;The surprising thing I found after monitoring the small Linux instance spot price for a few days is that it&#39;s a LOT less than the on-demand price - it&#39;s stayed between 2.9c and 3.1c per hour.  That means that if you bid, say, 5 cents per hour for your spot instance, you&#39;ll be pretty certain of getting a cheap, long-running instance unless there is a sudden spike in demand and the spot price goes over 5c / hour.&lt;br /&gt;&lt;br /&gt;The only down side I&#39;ve found so far, apart from the necessity to be prepared for the instance shutting down without warning (which you ought to do for all EC2 instances anyway) is that you seem to have to wait a while longer for your instance to be started up; the ones I tried took one or two hours, rather than the usual 15 minutes or so.&lt;br /&gt;&lt;br /&gt;As a way to warn me if the EC2 spot price is getting close to my bid price, I wrote a Nagios plugin, check_ec2_spot_price,  that will send me a warning if the spot price goes above a specified value.  You can download it from the &lt;a href=&quot;http://exchange.nagios.org/directory/Uncategorized/check_ec2_spot_price/details&quot;&gt;Nagios Exchange&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoVPxZQrGTSwDDpe6w5FQdHRXD81tn1Ygw4_j3V57HQfEGPY_N5gtZZd0ZiB-QNpKjGa_mpEWOksTt4PeGkDQ5VxER-bZpFYhfIltqeNZCJ22eIRfQAQVTCJRLNLULxXlGB04rz_h090M/s1600/check_ec2_spot_price.jpg&quot;&gt;&lt;img style=&quot;cursor: pointer; width: 320px; height: 165px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoVPxZQrGTSwDDpe6w5FQdHRXD81tn1Ygw4_j3V57HQfEGPY_N5gtZZd0ZiB-QNpKjGa_mpEWOksTt4PeGkDQ5VxER-bZpFYhfIltqeNZCJ22eIRfQAQVTCJRLNLULxXlGB04rz_h090M/s320/check_ec2_spot_price.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5459671993420928706&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I&#39;m also working on a Munin plugin that will graph the EC2 spot price over time; I&#39;ll post that here too when it&#39;s ready.</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/5515502417406973837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2010/04/ec2-marks-spot.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/5515502417406973837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/5515502417406973837'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2010/04/ec2-marks-spot.html' title='EC2 Marks the Spot'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoVPxZQrGTSwDDpe6w5FQdHRXD81tn1Ygw4_j3V57HQfEGPY_N5gtZZd0ZiB-QNpKjGa_mpEWOksTt4PeGkDQ5VxER-bZpFYhfIltqeNZCJ22eIRfQAQVTCJRLNLULxXlGB04rz_h090M/s72-c/check_ec2_spot_price.jpg" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-4365599053229368623</id><published>2010-03-12T17:23:00.000-08:00</published><updated>2010-04-02T18:28:32.086-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dg834g"/><category scheme="http://www.blogger.com/atom/ns#" term="expander"/><category scheme="http://www.blogger.com/atom/ns#" term="linksys"/><category scheme="http://www.blogger.com/atom/ns#" term="netgear"/><category scheme="http://www.blogger.com/atom/ns#" term="router"/><category scheme="http://www.blogger.com/atom/ns#" term="wireless"/><category scheme="http://www.blogger.com/atom/ns#" term="wre54g"/><title type='text'>Expanding a Wireless Network: hooking up a Linksys WRE54G expander to a Netgear DG834G router</title><content type='html'>This isn&#39;t quite my usual kind of post, but it caused me so much hassle (mostly due to the sad state of the Linksys documentation) that I wanted to post the steps in the hope that it&#39;ll help others.&lt;br /&gt;&lt;br /&gt;We were getting dead spots in our home wirelesss network (chiefly the sofa where we like to watch streaming movies on the laptop), so I bought a Linksys WRE54G expander for downstairs.  This is an actual access point that connects to and extends a wireless network, as opposed to a booster antenna that you plug into your wireless router (note that not all wireless routers can take an external antenna).&lt;br /&gt;&lt;br /&gt;In theory, hooking this up to our Netgear DG834G, which is a combined DSL moden and wireless router, should be pretty simple; you just get the WRE54G to join the wired network so that you can configure it with the access credentials for the wireless network, then plug it into an outlet in the area where you want to expand your wireless coverage.  The difficulty came when the WRE54G documentation didn&#39;t explain anything about how to connect it if it can&#39;t join the existing wireless network right away  without any configuration.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://forums.linksysbycisco.com/linksys/board/message?board.id=Range_Expanders&amp;amp;thread.id=1884&quot;&gt;Barra&#39;s post on the Linksys forum&lt;/a&gt; was a big help here.  These are the steps I took:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Reset the expander for about 1 minute.&lt;/li&gt;&lt;li&gt;Get the MAC address from the bottom of the WRE54G and add it to your router&#39;s DHCP setup so that the expander gets the IP address 192.168.0.240 (the third number of the IP address depends on your network&#39;s existing  IP range; Linksys defaults to 192.168.1.x while Netgear uses  192.168.0.x)&lt;/li&gt;&lt;li&gt;Connect the Ethernet cable that comes with the WRE54G to the expander and the other end to the ethernet port on a computer with a working display.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt; Manually set the TCP/IP properties on the computer to: IP 192.168.0.111; subnet mask  255.255.255.0; Gateway 192.168.0.240 (the third number of the IP address depends on your network&#39;s existing IP range as above)&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Open a browser on the computer and  type 192.168.0.240 (the IP address you gave to the expander)&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Leave the user name blank and type password  &quot;admin&quot; to log on  to the expander.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Set wireless channel, SSID and security the same as on the  router; set mode to Mixed.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Set subnet mask to 255.255.255.0 and gateway  to 192.168.0.1 (the IP address of the router)&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Save all changes in the expander setup.&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;After making  all changes, reset your PC to use DHCP and plug it back into the router if necessary.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Go to the DG834G&#39;s management web page and, under Advanced Wireless Settings, check the box for Enable Wireless Bridging and Repeating, select the Repeater with Wireless Client Association radio button, and enter the MAC address of the expander under Remote MAC Address 1. (Thanks to &lt;a href=&quot;http://www.bencarpenter.co.uk/articles/wireless/&quot;&gt;Ben Carpenter &lt;/a&gt;for this step).&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Save the router changes.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt; Locate the WRE-54G in an outlet somewhere near the router to begin with.  You should see both lights on the expander turn blue, and you should be able to see the WRE54G in thel ist of attached devices on your router&#39;s management page.  You should also be able to get to the expander&#39;s setup page from any computer on your network, at http://192.168.0.240&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;If that all works, you should be good to unplug the expander and relocate it where you want to expand the wireless coverage.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;The WRE54G is working really nicely for us now - but what a kerfuffle to set it up !</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/4365599053229368623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2010/03/expanding-wireless-network-hooking-up.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/4365599053229368623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/4365599053229368623'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2010/03/expanding-wireless-network-hooking-up.html' title='Expanding a Wireless Network: hooking up a Linksys WRE54G expander to a Netgear DG834G router'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-1422464035079589532</id><published>2010-02-19T12:26:00.000-08:00</published><updated>2011-02-11T12:29:38.598-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="build"/><category scheme="http://www.blogger.com/atom/ns#" term="ci"/><category scheme="http://www.blogger.com/atom/ns#" term="continuous-integration"/><category scheme="http://www.blogger.com/atom/ns#" term="grails"/><category scheme="http://www.blogger.com/atom/ns#" term="hudson"/><category scheme="http://www.blogger.com/atom/ns#" term="jenkins"/><category scheme="http://www.blogger.com/atom/ns#" term="slave"/><title type='text'>Build, Please, Mr. Hudson</title><content type='html'>One of the absolute must-have tools for any development team these day is a continuous integration (CI) system.  Having all your team&#39;s code changes built and tested automatically as soon as they&#39;re checked into source control is a huge time saver and confidence builder; I shudder when I think of the old days when even small development teams needed one or more full-time build engineers maintaining  a build process that took all night to run and often didn&#39;t run any tests.&lt;br /&gt;&lt;br /&gt;Having got very familiar in previous jobs with &lt;a href=&quot;http://cruisecontrol.sourceforge.net/&quot;&gt;CruiseControl&lt;/a&gt;, the still-sprightly granddaddy of CI tools, I&#39;ve been having a bit of a love-hate relationship with &lt;a href=&quot;http://cruisecontrol.sourceforge.net/&quot;&gt;Hudson&lt;/a&gt;, which my current team uses and which seems to be coming up as the standard for CI these days, especially on Java projects.  Lately I&#39;ve been feeling the love a lot more though, for two particular reasons that I&#39;ll go into more detail on here.&lt;br /&gt;&lt;br /&gt;The first one is how easy it is to set up Hudson to build, test and report on &lt;a href=&quot;http://grails.org/&quot;&gt;Grails  &lt;/a&gt;projects, which we&#39;re using as our standard for web app development these days.   There&#39;s a &lt;a href=&quot;http://today.java.net/pub/a/today/2009/06/23/Grails-and-Continuous-Integration.html&quot;&gt;nice post here&lt;/a&gt; that lays out all the details, but suffice to say that, thanks to Grails&#39; and Hudsons&#39; plugin architectures, it&#39;s very straightforward to set up a Hudson build that builds a Grails app, runs all its tests (including functional tests that run the complete app in its web container), collects code coverage statistics for the test run, and displays both the current test and coverage results plus trend graphs in the Hudson UI.  Seeing the number of passing tests and the code coverage going up over time is a great motivator for developers !&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcEy5Jwll51mKUMTF5_8cpxHU0jQTTGx3HnVsk3arjcRyaaIrhQsS52t8t31hezMacP3ClkyRt7_POctPItFZTfXlqImoLDAj1kTRlZOnhGfD7ZhhlJ4_yKHfZQXCsDN1U2dXeZkk3_s4/s1600-h/hudson.jpg&quot;&gt;&lt;img style=&quot;cursor: pointer; width: 320px; height: 210px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcEy5Jwll51mKUMTF5_8cpxHU0jQTTGx3HnVsk3arjcRyaaIrhQsS52t8t31hezMacP3ClkyRt7_POctPItFZTfXlqImoLDAj1kTRlZOnhGfD7ZhhlJ4_yKHfZQXCsDN1U2dXeZkk3_s4/s320/hudson.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5443871479962660690&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The second thing that increased my admiration for Hudson is the ease of setting up a &quot;slave&quot; build server.  You may want to do this to distribute multiple build jobs in order to maximize your resources, or to build on a specific platform.  In my case I had the latter requirement; our Hudson server runs on CentOS but I needed to build a runtime distribution on SuSE 10.2.&lt;br /&gt;&lt;br /&gt;The Hudson documentation on setting up a slave server isn&#39;t too great (the so-called &lt;a href=&quot;http://wiki.hudson-ci.org/display/HUDSON/Step+by+step+guide+to+set+up+master+and+slave+machines&quot;&gt;step by step guide  &lt;/a&gt;leads you to a blank page !), so I thought I&#39;d lay out the steps I used here.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Go to the Manage Hudson link in your Hudson dashboard and click Manage Nodes.&lt;/li&gt;&lt;li&gt;Create a new node, name it and select the &quot;Dumb Node&quot; option (this actually seemed to be the only available option in my version of Hudson).&lt;/li&gt;&lt;li&gt;Before you fill out the node details, verify a couple of things on the slave server.  You need a directory that&#39;s writable by the user that will be running the Hudson slave process  (this directory is where Hudson will check out the source code and run  the build), and you need to copy the master Hudson server&#39;s public SSH key into ~/.ssh/authorized_keys for the Hudson slave process user on the slave server, so that Hudson can log in via SSH without a password.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Fill out the node details.  Specify the directory you created in step 3 for &quot;remote FS root&quot;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Select &quot;Launch agent via execution of command on the Master&quot; for the launch method, and enter the command: &lt;span style=&quot;font-family:courier new;&quot;&gt;ssh [Hudson slave user]@[slave host] &quot;java -jar [remote FS root]/slave.jar&quot;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Set up the node properties (environment variables and tool locations) as needed.  THIS IS IMPORTANT - because Hudson slaves have to be launched from the master, whereafter they&#39;re controlled via stdin and stdout on the slave process, you can&#39;t set environment variables like JAVA_HOME and ANT_HOME on the slave server via the slave user&#39;s environment.  These variables need to be set up in the Hudson master&#39;s configuration, either via key-value pairs in the Environment settings for the node or, if you want to share values across nodes, in the Tool Locations settings (which are stored centrally and can also be maintained via Manage Hudson / System Settings).&lt;/li&gt;&lt;li&gt;Save your new node.  If all went well you should see it start up in the Manage Nodes page; if not, you should be able to figure out what went wrong from the Hudson log.&lt;/li&gt;&lt;/ol&gt;Once your slave node is set up, you can specify that it should be used for a given build job by checking &quot;Tie this project to a node&quot; and selecting the node in the job configuration.  The slave builds will be controlled, logged and reported in the Hudson master UI just as if they were running on the master node - very nice !&lt;br /&gt;&lt;br /&gt;UPDATE: this &lt;a href=&quot;http://psyphi.net/blog/2010/02/configuring-hudson-continuous-integration-slaves/&quot;&gt;blog post by RMP &lt;/a&gt;adds a few details to my steps and also has a Linux startup script for the Hudson slave agent.&lt;br /&gt;&lt;br /&gt;The slave build I set up is being used to build a set of C libraries, run tests on them and package them into a Linux RPM.  This is a bit more tricky than building a Java based application, but there are some nice tricks we came up with to streamline the process into Hudson that I&#39;ll plan to blog on in a future post.</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/1422464035079589532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2010/02/build-please-mr-hudson.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/1422464035079589532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/1422464035079589532'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2010/02/build-please-mr-hudson.html' title='Build, Please, Mr. Hudson'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcEy5Jwll51mKUMTF5_8cpxHU0jQTTGx3HnVsk3arjcRyaaIrhQsS52t8t31hezMacP3ClkyRt7_POctPItFZTfXlqImoLDAj1kTRlZOnhGfD7ZhhlJ4_yKHfZQXCsDN1U2dXeZkk3_s4/s72-c/hudson.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-5298934465650739358</id><published>2010-01-15T20:03:00.000-08:00</published><updated>2010-01-19T14:38:08.303-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="backup"/><category scheme="http://www.blogger.com/atom/ns#" term="it"/><category scheme="http://www.blogger.com/atom/ns#" term="monitor"/><category scheme="http://www.blogger.com/atom/ns#" term="nagios"/><title type='text'>Fun with Nagios, part 2:  Check Yer Backups</title><content type='html'>Being the second in a series of occasional posts on neat things you can do with your &lt;a href=&quot;http://nagios.org/&quot;&gt;Nagios&lt;/a&gt; monitor that you might not have thought about.&lt;br /&gt;&lt;br /&gt;I&#39;ve been bitten by missing backups too often over the years, to the extent that I don&#39;t really feel secure unless I&#39;ve got copies of each important system in at least three places.  That leads to a lot of backup files, so wouldn&#39;t it be handy to have a process that checks whether your backup files are up to date and sends you a loud warning if not ?&lt;br /&gt;&lt;br /&gt;Enter the trusty Nagios once again, in the guise of the &lt;a href=&quot;http://www.nagioswiki.org/wiki/Plugin:check_file_age&quot;&gt;check_file_age&lt;/a&gt; plugin.  This plugin lets you check not only whether a file has been updated recently, but also that it has a minimum size; this way you can make sure that your backup put a new file in the right place &lt;span style=&quot;font-weight: bold;&quot;&gt;and &lt;/span&gt;wrote something useful to the file.&lt;br /&gt;&lt;br /&gt;Here&#39;s an example nrpe.cfg entry that runs on our backup server and checks the backup file from our JIRA server:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;command[check_backup_jira]=/usr/local/nagios/libexec/check_file_age -c 86400 -w 86400 -C 500000 -W 500000 -f /NAS/Backups/eng-infrastructure-server/jira/`date +&quot;%Y-%b-%d&quot;`*.zip&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The JIRA backup files are named for the date, so this command makes sure that a file named like &quot;2010-Jan-15-*.zip&quot; exists,  the file is no older than 24 hours (86400 seconds) and is at least 500kb in size.&lt;br /&gt;&lt;br /&gt;Et voila - now I have a sanity check that the backup process has run, has put the backup file in the right place, and that the file contains something.&lt;br /&gt;&lt;br /&gt;The next step I&#39;m working on is to check that each backup will actually restore to something useful - after all, as &lt;a href=&quot;http://www.joelonsoftware.com/items/2009/12/14.html&quot;&gt;this Joel on Software article&lt;/a&gt; attests, backups are all well and good, but not much use if you can&#39;t get back what you need from them.&lt;br /&gt;&lt;br /&gt;That&#39;s a subject for a future post, but I&#39;m thinking that it should be straightforward, at least for our web apps like JIRA and Confluence.  I should be able to restore the backup to a standby version of the web app running on a different machine and have a Nagios check_http or WebInject test verify that the content has been updated.  I&#39;d also get the benefit of being able to switch over to the standby with minimal downtime; looking forward to trying this out !</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/5298934465650739358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2010/01/fun-with-nagios-part-2-check-yer.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/5298934465650739358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/5298934465650739358'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2010/01/fun-with-nagios-part-2-check-yer.html' title='Fun with Nagios, part 2:  Check Yer Backups'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-2194133173614052248</id><published>2010-01-15T19:15:00.000-08:00</published><updated>2010-01-15T19:58:54.095-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="entropy"/><category scheme="http://www.blogger.com/atom/ns#" term="gpg"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="wtf"/><title type='text'>Entropy at Work</title><content type='html'>Like anyone who studied physics at school or college I knew the concept of entropy, but I only found out this week that Linux systems have their own version of the phenomenon.&lt;br /&gt;&lt;br /&gt;I was setting up an RPM repository and wanted to create a GPG key for signing the repository files.  Near the end of the key setup, I got this message:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;Not enough random bytes available.  Please do some other work to give&lt;br /&gt;the OS a chance to collect more entropy! (Need 276 more bytes)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Entropy, eh ?  Well, according to the physics I remember, the entropy of the universe is continually increasing; however; it turns out that a Linux system doesn&#39;t classify as its own universe and its entropy can go up and down, as evidenced by:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;watch cat /proc/sys/kernel/random/entropy_avail&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;I could see the entropy value merrily going up and down between near zero and a couple of thousand, seemingly at random.  After watching in fascination for a while, I developed the theory that the universe must comprise all of the Linux machines anywhere, merrily swapping their entropy bytes in some vast, complex dance which mere mortals cannot contemplate.&lt;br /&gt;&lt;br /&gt;Turns out that the reality is a bit more down to earth; Linux calculates entropy by transforming interrupt events - activity from input devices such as the keyboard and mouse, or file system activity.&lt;br /&gt;&lt;br /&gt;If you&#39;re in front of your system you can just point on the keyboard to generate enough entropy bytes to make your GPG key, but I happened to be working on an Amazon EC2 instance that I was logged into remotely.  I managed to get enough randomness in the end by downloading a few large files from external web sites, and running &quot;ls -R /&quot; a couple of times to run through the entire root file system.  Even though the entropy_avail value kept going up and down while I was doing this, it turned out that the GPG key generation just kept taking what was available as new bytes, and after 10 minutes or so had enough bytes to finish:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;++++++++++.++++++++++&gt;+++++...............&gt;+++++............&lt;.+++++....&gt;.+&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;++++&lt;.+++++&gt;.+++++..................+++++^^^^^^^^^&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;gpg: key 2BC5527E marked as ultimately trusted&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;public and secret key created and signed.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hopefully this post will help you to avoid one of those &quot;WTF&quot; moments; thanks to &lt;a href=&quot;http://bentham.k2.t.u-tokyo.ac.jp/notebook/?p=241&quot;&gt;Carson Reynolds&lt;/a&gt; for providing most of the source material.</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/2194133173614052248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2010/01/entropy-at-work.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/2194133173614052248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/2194133173614052248'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2010/01/entropy-at-work.html' title='Entropy at Work'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-4725823112935710701</id><published>2009-12-28T20:26:00.000-08:00</published><updated>2010-01-15T19:59:24.659-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="it"/><category scheme="http://www.blogger.com/atom/ns#" term="monitor"/><category scheme="http://www.blogger.com/atom/ns#" term="nagios"/><title type='text'>Fun with Nagios, part 1: timeliness of web content</title><content type='html'>I mentioned in an &lt;a href=&quot;http://optimalops.blogspot.com/2009/10/using-your-it-monitor-for-automated.html&quot;&gt;earlier post&lt;/a&gt; that I&#39;m a big fan of the &lt;a href=&quot;http://nagios.org/&quot;&gt;Nagios&lt;/a&gt; open source monitoring system.  With very little work (on Linux, a couple of package installs and a bit of service configuration should do the trick) you can have a system up and running that will check all your servers for availability, disk space, memory and CPU usage and alert you when any resources exceed their limits.&lt;br /&gt;&lt;br /&gt;It&#39;s pretty easy to add additional Nagios checks that will monitor all kinds of other useful things.  I&#39;ll be making a few posts this week on that subject; today&#39;s deals with checking that your web site content is up to date.&lt;br /&gt;&lt;br /&gt;One of my company&#39;s products is a web service that provides a speech-to-text transcription of news videos.  The service pulls in videos from RSS feeds provided by the news source, runs the speech-to-text analysis and posts the results in another RSS feed (one per news source).  As well as making sure that the output RSS feed is available 24x7, I wanted to check that new articles are being added each day.  There are about 75 different news sources and thus output RSS feeds to check, so automation was pretty much mandatory.&lt;br /&gt;&lt;br /&gt;This turned out to be a breeze, using Nagios&#39; trusty &lt;a href=&quot;http://nagiosplugins.org/man/check_http&quot;&gt;check_http&lt;/a&gt; command  and making use of the fact that you can pass the results of a command execution as a parameter to check_http.  It&#39;s standard for each article in an RSS feed to have an attribute containing the publishing date; in my case this looks like:&lt;br /&gt;&lt;br /&gt;&lt;pre id=&quot;line3&quot;&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;&lt;pubdate&gt;&lt;/pubdate&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;    Mon, 28 Dec 2009 23:40:04 GMT&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To check that this feed has at least one article published today, here&#39;s the custom command from the RSS feed server&#39;s Nagios configuration file:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;check_command check_http! -u /feeds/1010 -s &quot;`date +\&quot;%d %b %Y\&quot;`&quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This uses the standard -s parameter to check for a string in the HTTP response from the URL http://feedserver.mydomain.com/feeds/1010 but makes the string to be checked the output of the &quot;date&quot; command in the format used by the output RSS feed, e.g. &quot;28 Dec 2009&quot; in my case.&lt;br /&gt;&lt;br /&gt;It was easy to add checks for the rest of the output feeds (which all have the same date format) by creating additional checks and just varying the feed URL.&lt;br /&gt;&lt;br /&gt;The only other thing to watch here is that Nagios runs all its checks 24x7 by default, but the first new article of the day might not be published until some time well after midnight.  To avoid getting &quot;out of date content&quot; alerts as soon as the date changes , you can set up a custom time period in the Nagios server&#39;s timeperiods.cfg file, e.g.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;define timeperiod{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        timeperiod_name news-content&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        alias           Times when content from today should be present&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        sunday          8:00-24:00&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        monday          3:00-24:00&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        tuesday         3:00-24:00&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        wednesday       3:00-24:00&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        thursday        3:00-24:00&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        friday          3:00-24:00&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        saturday        8:00-24:00&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This says that at least one article from today should be present at all times after 3am on weekdays and after 8am on weekends - we learned by experience that weekends are slower news days.  Use the custom time period in the configuration entry for your date check:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;define service{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        use                             generic-service        &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        host_name                       feedserver&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        check_period                    news-content&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        service_description             Content updated: feed 1010&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        check_command                   check_http! -u /feeds/1010 -s &quot;`date +\&quot;%d %b %Y\&quot;`&quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and you&#39;re good to go.&lt;br /&gt;&lt;br /&gt;More on useful Nagios checks later in the week; I&#39;d love to hear your own favourite ones in the comments.</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/4725823112935710701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2009/12/fun-with-nagios-part-1-timeliness-of.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/4725823112935710701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/4725823112935710701'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2009/12/fun-with-nagios-part-1-timeliness-of.html' title='Fun with Nagios, part 1: timeliness of web content'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-1003945526111530940</id><published>2009-12-08T16:22:00.000-08:00</published><updated>2009-12-08T16:36:29.505-08:00</updated><title type='text'>Exchanging Answers</title><content type='html'>I&#39;m a regular user of the programming Q&amp;amp;A site &lt;a href=&quot;http://stackoverflow.com&quot;&gt;stackoverflow.com&lt;/a&gt; and its companion for sysadmins, &lt;a href=&quot;http://serverfault.com&quot;&gt;serverfault.com&lt;/a&gt;.  Both sites have saved me a lot of time digging around the wilds of the web for answers, so I&#39;ve tried to give back by answering questions whenever I can.&lt;br /&gt;&lt;br /&gt;There are a few reasons why I like these sites: the flat organization of the questions and answers makes it really easy to narrow down the things you&#39;re looking for; the email and RSS notifications of new questions and answers are highly configurable; and - an unexpectedly good incentive for me - you can build up reputation points for asking good questions and giving good answers (as voted on by the other users of the sites).&lt;br /&gt;&lt;br /&gt;There&#39;s now a similar Q&amp;amp;A site for software testers at &lt;a linkindex=&quot;80&quot; href=&quot;http://testing.stackexchange.com/&quot;&gt;http://testing.stackexchange.com&lt;/a&gt; - if Server Fault is Stack Overflow with a beard, ponytail and sandals, Testing.Stackexchange might be SO with half moon glasses and a clipboard.  I think this could be a great forum to concentrate testing information; there&#39;s a lot of test related stuff on Stack Overflow already, but it&#39;s often buried with more development-oriented content.  I&#39;ll be hanging out there regularly from now on.</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/1003945526111530940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2009/12/exchanging-answers.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/1003945526111530940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/1003945526111530940'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2009/12/exchanging-answers.html' title='Exchanging Answers'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-6370714841563448824</id><published>2009-11-13T11:57:00.000-08:00</published><updated>2009-11-13T12:02:31.204-08:00</updated><title type='text'>The USB Breathalyzer</title><content type='html'>Here&#39;s some Friday fun - ever wanted to stop your sysadmins from logging in drunk and doing an &quot;rm -rf /&quot;  on the production  servers, or prevent your developers from checking in code that was written under the influence ?  You need a &lt;a href=&quot;http://jacksonwest.wordpress.com/2006/04/21/usb-breathalyzer-project-an-end-to-drunkblogging/&quot;&gt;USB breathalyzer !&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This &lt;a href=&quot;http://serverfault.com/questions/44100/drunk-test-for-cpanel-or-website&quot;&gt;thread on serverfault.com&lt;/a&gt; has some other interesting ideas for preventing GUI (Geeking Under the Influence).</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/6370714841563448824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2009/11/usb-breathalyzer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/6370714841563448824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/6370714841563448824'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2009/11/usb-breathalyzer.html' title='The USB Breathalyzer'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-1157758943378679994</id><published>2009-11-09T13:30:00.000-08:00</published><updated>2009-11-09T14:39:02.291-08:00</updated><title type='text'>Advance your career over lunch</title><content type='html'>One of the online forums I frequent had a question today about what web resources engineers can use to advance their careers.  Now don&#39;t get me wrong, learning from the web is all well and good.  However, you&#39;ll learn far more in a given time from interacting with people than with a web page, simply because you can have a two-way conversation.  Just about every time I&#39;ve asked a friend or coworker for technical help,  I&#39;ve come away with information that I&#39;d never thought to ask for directly.&lt;br /&gt;&lt;br /&gt;Here&#39;s some ways you can work on your career advancement and learn at the same time:&lt;br /&gt;&lt;div class=&quot;post-text&quot;&gt;  &lt;ul&gt;&lt;li&gt;Take every opportunity to learn from people with experience that you&#39;d like to have - while being respectful of their time, of course. Even the busiest people are generally flattered to be asked and happy to talk about what they&#39;re working on; sharing coffee, lunch or beer with them doesn&#39;t hurt either !&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Talk to everyone in your organization who you either work with directly, or whose job interests you. For example, you might want to move on from testing into development, operations, project management or many other related fields.&lt;/li&gt;&lt;li&gt;Attend conferences to meet up with your peers. Getting the budget to attend can be hard these days, but there are plenty of free opportunities around; have a look for local events at &lt;a linkindex=&quot;19&quot; href=&quot;http://www.meetup.com/&quot; rel=&quot;nofollow&quot;&gt;http://www.meetup.com/&lt;/a&gt;, for example. If you feel up to it, presenting at a conference or meetup is a great way to expand your network and gain valuable presenting experience.&lt;/li&gt;&lt;/ul&gt;Last but not least, the more people you engage with, the more you&#39;ll be giving an impression of yourself as someone who already has a particular set of skills, but is also smart and eager to learn.  That certainly won&#39;t hurt your career development !&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/1157758943378679994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2009/11/advance-your-career-over-lunch.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/1157758943378679994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/1157758943378679994'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2009/11/advance-your-career-over-lunch.html' title='Advance your career over lunch'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-111501411441012749</id><published>2009-11-09T13:06:00.000-08:00</published><updated>2010-01-15T20:00:40.653-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="date"/><category scheme="http://www.blogger.com/atom/ns#" term="info"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="man"/><category scheme="http://www.blogger.com/atom/ns#" term="shell script"/><category scheme="http://www.blogger.com/atom/ns#" term="yesterday"/><title type='text'>Neat trick for getting relative dates in a Linux shell script</title><content type='html'>I wanted to get the SVN updates done in the last 24 hours for a nightly script that updates and restarts one of our applications.  The command would look something like:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;svn log -v -r {#Calculate yesterday&#39;s date somehow }:{#Calculate today&#39;s date in yyyy-mm-dd format}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Getting today&#39;s date is easy enough using the &quot;+&quot; parameter with a format string, but yesterday&#39;s date seemed more tricky; checking the man page for the &lt;span style=&quot;font-family:courier new;&quot;&gt;date&lt;/span&gt; command didn&#39;t look very promising.  It looked like I&#39;d have to do the famous programming exercise of keeping an array of the number of days in each month, checking whether yesterday was still this month or last month, etc. etc.&lt;br /&gt;&lt;br /&gt;However, using &lt;span style=&quot;font-family:courier new;&quot;&gt;info date&lt;/span&gt; instead of &lt;span style=&quot;font-family:courier new;&quot;&gt;man date&lt;/span&gt; gave a lot more information, including this very useful option:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;-d DATESTR&#39;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;`--date=DATESTR&#39;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;     Display the date and time specified in DATESTR instead of the&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;     current date and time.  DATESTR can be in almost any common&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;     format.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;&lt;/span&gt;DATESTR can be a word or phrase like &quot;tomorrow&quot; &quot;yesterday&quot;, &quot;last week&quot;, etc.  So my problem was solved in a single line:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;svn log -v -r {`date -d &quot;yesterday&quot; +&quot;%Y-%m-%d&quot;`}:{`date +&quot;%Y-%m-%d&quot;`&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;Moral of the story - always look at the info page as well as the man page !</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/111501411441012749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2009/11/neat-trick-for-getting-relative-dates.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/111501411441012749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/111501411441012749'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2009/11/neat-trick-for-getting-relative-dates.html' title='Neat trick for getting relative dates in a Linux shell script'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-141155754882971579</id><published>2009-11-04T17:36:00.000-08:00</published><updated>2010-01-15T20:01:07.653-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dhcp"/><category scheme="http://www.blogger.com/atom/ns#" term="dns"/><category scheme="http://www.blogger.com/atom/ns#" term="fedora"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="netmasq"/><category scheme="http://www.blogger.com/atom/ns#" term="network"/><title type='text'>Forced education #1 - DNS and DHCP with dnsmasq</title><content type='html'>One of the, ahem,  pleasures of working at a startup is that you often have to learn something new in a hurry when something goes wrong.  This happened to me the other day when people on our office network suddenly stopped being able to get to anywhere else on the internet or our internal network.&lt;br /&gt;&lt;br /&gt;After a bit of troubleshooting, I found out that we still had inbound and outbound connectivity, but DNS had intermittently stopped working - so, since normal people don&#39;t carry a long list of IP addresses in their heads, their access to anywhere via its host name was gone.&lt;br /&gt;&lt;br /&gt;We had all our office network clients pick up their DNS server via DHCP from our LinkSys AV-082 router.  I tried switching the DNS servers defined in the router to OpenDNS in case our ISP&#39;s DNS servers were having a problem, but the problem persisted.&lt;br /&gt;&lt;br /&gt;Some internet digging and talking with a couple of folks who know a lot more about networking than me led me to the conclusion that the router&#39;s DNS and DHCP handling was acting up.  Since it still seemed to be working fine as a regular router, I decided the best thing would be to turn off the router&#39;s DHCP server and run DNS and DHCP from one of the office servers instead. I set up the people in the office to point directly to OpenDNS to get them going while I was messing around, and got to work.&lt;br /&gt;&lt;br /&gt;There&#39;s a nice, lightweight Linux package called &lt;a href=&quot;http://www.thekelleys.org.uk/dnsmasq/doc.html&quot;&gt;dnsmasq &lt;/a&gt;that will handle both DNS and DHCP.  I found it super easy to set up on one of our Fedora servers, thanks to &lt;a href=&quot;http://www.linux.com/archive/feature/149040&quot;&gt;Keith Fieldhouse&#39;s article&lt;/a&gt; on linux.com; the hardest part was typing in all the MAC addresses for servers that I wanted to have a fixed IP address, since the router&#39;s web UI wouldn&#39;t let me copy and paste the DHCP MAC to IP address mappings.&lt;br /&gt;&lt;br /&gt;The only other tweak I had to make was to configure the network adapter on the dnsmasq machine to have a fixed IP address, rather than trying to get it from DHCP.&lt;br /&gt;&lt;br /&gt;After a couple of hours of setup and careful testing, everything was up and running.  An extra benefit of having a local DNS server is that it caches all its results, so that lookups to a host that it already knows about are nice and fast.  In fact, I&#39;ve now set up a local dnsmasq server just for DNS at home, since anything that makes web browsing faster has to be a good thing !</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/141155754882971579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2009/11/forced-education-1-dns-and-dhcp-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/141155754882971579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/141155754882971579'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2009/11/forced-education-1-dns-and-dhcp-with.html' title='Forced education #1 - DNS and DHCP with dnsmasq'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-5085111825424591368</id><published>2009-10-22T17:34:00.000-07:00</published><updated>2010-01-15T20:01:50.382-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="it"/><category scheme="http://www.blogger.com/atom/ns#" term="monitor"/><category scheme="http://www.blogger.com/atom/ns#" term="nagios"/><category scheme="http://www.blogger.com/atom/ns#" term="test"/><category scheme="http://www.blogger.com/atom/ns#" term="webinject"/><title type='text'>Using your IT monitor for automated testing</title><content type='html'>An automated IT monitoring system is a must-have for any team these days; few things give me more pleasure (at work) than seeing a web page full of green boxes telling me that all our systems are running smoothly.  I like &lt;a href=&quot;http://nagios.org/&quot;&gt;Nagios&lt;/a&gt; because it&#39;s robust and easy to install / configure / extend, but this tool is showing its age a bit; you might want to look at &lt;a href=&quot;http://community.zenoss.org/index.jspa&quot;&gt;Zenoss&lt;/a&gt; or &lt;a href=&quot;http://zabbix.org/&quot;&gt;Zabbix&lt;/a&gt; if you&#39;re starting from scratch.  Nagios&#39; inability to show trend graphs out of the box might be an annoyance - more on that in a future post.&lt;br /&gt;&lt;br /&gt;Monitors are great for alerting you when a system goes down or runs out of resources, but I hadn&#39;t used them for QA until recently, when I realized that they&#39;re also ideal for smoke testing new product builds.  If you&#39;re working with web applications, this is a piece of cake - all you need to do is:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;set up a cron or batch job to install your new build on a schedule;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;have your monitor tool check one or more URLs in your application.&lt;/li&gt;&lt;/ul&gt;Since monitoring tools can alert you by email or SMS when anything goes wrong, you can get timely feedback if something goes wrong - maybe last night&#39;s changes broke the app so that it doesn&#39;t even come up any more, or perhaps there&#39;s an unexpected change to the content returned by your test URL.  If you do your reinstall overnight, the alerts can be waiting in your in box when you start work the next day (Nagios also has a nice Firefox plugin that turns red when there&#39;s an alert, in addition to setting off a loud siren that&#39;s hard to ignore !)&lt;br /&gt;&lt;br /&gt;The monitor runs 24x7, so you also get the built-in bonus of being alerted when somebody inadvertently shuts down your test application; you&#39;d also get warned if the app crashed after running out of resources, although you&#39;d still have to go in and debug the cause in that case.&lt;br /&gt;&lt;br /&gt;Here&#39;s how a typical test would look in Nagios:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;check_command  check_http!-p 8080 -u /test/url/ -s &quot;Text Expected&quot;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;This uses Nagios&#39; built-in  &lt;a href=&quot;http://nagiosplugins.org/man/check_http&quot;&gt;check_http&lt;/a&gt; command to go to the URL /test/url on port 8080 and look for a specific string in the HTML output (the host details are specified elsewhere in the Nagios setup).&lt;br /&gt;&lt;br /&gt;check_http has lots of other useful options such as checking for a regular expression, sending POST data, controlling the response to a redirected page, checking the age of the returned document or checking the validity of the site&#39;s SSL certificate.&lt;br /&gt;&lt;br /&gt;check_http does have a couple of limitations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;it will only handle basic web server authentication; you can get around this for web apps that use authentication libraries by using the Nagios plugin for &lt;a href=&quot;http://www.webinject.org/&quot;&gt;WebInject&lt;/a&gt;, which will handle web pages with input fields.  WebInject also lets you set up multi-step tests that navigate to more than one page; you can write some fairly sophisticated tests this way without having to resort to a full-blown web testing tool.&lt;/li&gt;&lt;li&gt;because check_http does a simple HTTP GET, it won&#39;t return any page content that&#39;s rendered in the browser; this limits what you can check for if your pages include a lot of JavaScript.  If you need to test pages with a lot of JavaScript, you&#39;ll need to use a more comprehensive Web testing tool like &lt;a href=&quot;http://seleniumhq.org/&quot;&gt;Selenium&lt;/a&gt; that can emulate a browser.  In this case I&#39;d recommend integrating the tests with your continuous build system rather than the IT monitor, although tools like Nagios have a simple plug-in architecture that lets you integrate additional tools fairly easily.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Take a look at this approach if you need to get some basic testing in place and are strapped for time, people and / or money - all the tools mentioned above are open source.</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/5085111825424591368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2009/10/using-your-it-monitor-for-automated.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/5085111825424591368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/5085111825424591368'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2009/10/using-your-it-monitor-for-automated.html' title='Using your IT monitor for automated testing'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6159127251386483687.post-1998900046179798087</id><published>2009-10-21T17:33:00.000-07:00</published><updated>2009-10-23T12:26:12.134-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="it test support management"/><title type='text'>How I got here</title><content type='html'>I&#39;ve had quite a varied career in high tech, starting off as a developer and doing spells in QA, customer management and project management (some of the transitions involved bouncing from the UK to the US twice, but that&#39;s another blog post).&lt;br /&gt;&lt;br /&gt;For the last few years I&#39;ve settled into technical operations, which I&#39;d essentially define as all the things that keep an engineering team running smoothly.  The job can cover a lot of ground: testing, customer support, project management, IT and, of course, the people management work involved in keeping all those things running.  Recently I&#39;ve been working with small startups, so I get to do a lot of hands-on work as well as steering the ship.&lt;br /&gt;&lt;br /&gt;Tech ops is a big problem space with a lot of competing best practices (and I kind of like it that way), but I&#39;ve found that there are a lot of commonalities, too; more on that in future posts.&lt;br /&gt;&lt;br /&gt;I&#39;m looking forward to sharing some of the knowledge I&#39;ve picked up along the way and, hopefully, learning more from you all !</content><link rel='replies' type='application/atom+xml' href='http://optimalops.blogspot.com/feeds/1998900046179798087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://optimalops.blogspot.com/2009/10/how-i-got-here.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/1998900046179798087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6159127251386483687/posts/default/1998900046179798087'/><link rel='alternate' type='text/html' href='http://optimalops.blogspot.com/2009/10/how-i-got-here.html' title='How I got here'/><author><name>Gareth Bowles</name><uri>http://www.blogger.com/profile/06648918332326079775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2Abq0Zr0MyERaruTKwA1zsaS8REVlEnoR7Uqmh-jjrPwgAiLyWoqJzMXoya8dOIRacVB8nkse08zDtHWhaiS4fHZCkpbg4J4PMZ8TXuB6MUKXhdEQEBhDeFHa3Wk-Bmc/s1600/*'/></author><thr:total>0</thr:total></entry></feed>