<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="text">Agile Sysadmin</title>
  <generator uri="http://effectif.com/nesta">Nesta</generator>
  <id>tag:agilesysadmin.net,2009:/</id>
  <link href="http://agilesysadmin.net/articles.xml" rel="self"/>
  <link href="http://agilesysadmin.net" rel="alternate"/>
  <subtitle type="text">Doing operations *right* with agile and lean practices</subtitle>
  <entry>
    <title>London DevOps Meetup</title>
    <link href="http://agilesysadmin.net/london-devops" rel="alternate" type="text/html"/>
    <id>tag:agilesysadmin.net,2010-02-23:/london-devops</id>
    <content type="html">&lt;p&gt;Since the inaugral &lt;a href='http://www.devopsdays.org/'&gt;DevopsDays&lt;/a&gt; conference in Ghent, Belgium, a few of us London-based devops have been gathering once a month to eat, chat, swap stories and generally encourage one another. Since we&amp;#8217;ve sustained this for four months, we concluded that we have a kernel of people who would turn out for a monthly meeting, and decided that this month we&amp;#8217;d throw it open to the world!&lt;/p&gt;

&lt;p&gt;If you don&amp;#8217;t know what this whole Devops thing is, I suggest you take a look at my article &lt;a href='http://jedi.be/blog/2010/02/12/what-is-this-devops-thing-anyway/'&gt;&amp;#8216;What is this Devops thing anyway?&amp;#8217;&lt;/a&gt;, and also James Turnbull&amp;#8217;s (excellent) &lt;a href='http://www.kartar.net/2010/02/what-devops-means-to-me/'&gt;&amp;#8216;What Devops means to me&amp;#8217;&lt;/a&gt;. In short, we&amp;#8217;re trying to build a community, a movement even, of cross disciplinary people - people who can program, and manage systems, people who understand that in the software industry, coders, testers, analysts, and sysadmins are all on the same team. If this sounds like you - if you want to make a difference, and would like to meet similarly motivated people, you&amp;#8217;d be very welcome.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s no particular technological bias - we generally like Puppet or Chef, we largely run our infrastructures on Linux, and there&amp;#8217;s a tendency to program in Ruby or Python, but I think this is just representative of the places we work and the people we know. So, if you&amp;#8217;re interested in bridging the gap between devs and ops, and if you&amp;#8217;re interested in how to build infrastructures in an agile way, we&amp;#8217;d love to see you.&lt;/p&gt;

&lt;p&gt;The intended format is straightforward - every other month we&amp;#8217;ll have a social, drinks-based event, in a hostelry of choice, and interleave this with a talk-based event, kindly sponsored by The Guardian at their awesome new premises in Kings Cross.&lt;/p&gt;

&lt;p&gt;Tomorrow&amp;#8217;s event is at &lt;a href='http://www.priorybar.com/home.html'&gt;The Priory Bar&lt;/a&gt; in Clerkenwelld, starting at about 1800.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://atalanta-systems.com/priory_bar.png' alt='The Priory Bar' /&gt;&lt;/p&gt;

&lt;p&gt;Don&amp;#8217;t worry if you can&amp;#8217;t make it that early - it&amp;#8217;ll be totally ok to turn up at any time - just depending on what you have on, and how far you have to travel. There&amp;#8217;s no fixed agenda, just a chance to meet some cool people, chat and drink.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;ll be following this up with a technical meeting on the 2nd of March, at the London ThoughtWorks office in Holborn. We&amp;#8217;ve not yet decided what we&amp;#8217;ll do there, so if you have any ideas, let us know.&lt;/p&gt;

&lt;p&gt;Please let others know about the event - get tweeting and blogging - the hashtag is #ldndevops. In the meantime, take a look at our &lt;a href='http://londondevops.org'&gt;London Devops planet&lt;/a&gt;, and if you like irc, pop in and see us on freenode in the ##infra-talk channel.&lt;/p&gt;

&lt;p&gt;See you on Wednesday!&lt;/p&gt;</content>
    <published>2010-02-23T23:03:44Z</published>
  </entry>
  <entry>
    <title>A short introduction to Chrome OS</title>
    <link href="http://agilesysadmin.net/chrome-os" rel="alternate" type="text/html"/>
    <id>tag:agilesysadmin.net,2010-02-22:/chrome-os</id>
    <content type="html">&lt;p&gt;Google are everywhere these days. The number one search engine, a suite of hugely powerful mail and business applications, shopping, maps&amp;#8230; but last year they seemed to move from the Software as a Service model to something rather different, with the release of their browser, and their operating system, Chrome. &lt;a href='http://twitter.com/vmlinuz'&gt;Richard Cohen&lt;/a&gt; explores what it&amp;#8217;s all about.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;ll start with &amp;#8216;cloud computing&amp;#8217;, which is actually an appropriately nebulous term&amp;#8230; It&amp;#8217;s been traditional for a long long time, particularly when teaching computer networking, to use a cloud in a diagram to represent &amp;#8220;all the stuff which happens on the network between computer A and computer B&amp;#8221;:&lt;/p&gt;

&lt;p&gt;&lt;img src='http://www.yourdictionary.com/images/computer/CLOUD.GIF' alt='Network Cloud' /&gt;&lt;/p&gt;

&lt;p&gt;We don&amp;#8217;t care how the communication happens between A and B, we just assume they can talk to each other. This usage has been changed a bit, in the past 5 years or so, to add the idea of &lt;em&gt;services&lt;/em&gt; which live in &amp;#8216;the cloud&amp;#8217; - we don&amp;#8217;t care where they are, as long as we can communicate with them over the Internet, using standard tools from anywhere. A simple example would be using gmail/hotmail/yahoo for your email, rather than an email system supplied by your employer, school or ISP. Another simple example would be Facebook - you don&amp;#8217;t know anything about how it works, you don&amp;#8217;t have any relation with them other than being a user of the service, you can access it from anywhere&amp;#8230;&lt;/p&gt;

&lt;p&gt;So &amp;#8216;cloud computing&amp;#8217; is the idea of taking things which previously ran either on your computer, or at least on your local network, and shoving them out into the cloud. It relies on a combination of 2 or 3 technologies, which are just about available now, but weren&amp;#8217;t 5 years ago - ubiquitous broadband, standard network protocols, and, to a slightly lesser extent, cheap/ubiquitous computing.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://www.chromium.org/chromium-os'&gt;Chrome OS&lt;/a&gt; is what falls out of all that, if you&amp;#8217;re Google. It&amp;#8217;s an OS designed to run on cheap portable computers (i.e. netbooks) which are always on-line (wifi or 3G) and running a standard platform called a &amp;#8216;web browser&amp;#8217;. It assumes that you use Gmail in your web browser, rather than Outlook connected to an Exchange server. It assumes that you use Google Docs rather than Microsoft Office. It assumes that you stream music and even video (TV, etc.) from the web, rather than storing and playing it locally. It assumes that you&amp;#8217;re using Google talk through your browser, rather than running a local chat program. It assumes that you&amp;#8217;re doing all of this on a &amp;#8216;secondary&amp;#8217; computer.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://www.maximumpc.com/files/u46168/google_apps6464-full.jpg' alt='Google Software as a Service' /&gt;&lt;/p&gt;

&lt;p&gt;They&amp;#8217;re not claiming that you can or should run your life like this yet. What they are saying - correctly, in my opinion - is that if you are willing to trust the &amp;#8216;cloud services&amp;#8217;, you can move a lot of what you do online without losing very much, and gaining ubiquitous access in return. You&amp;#8217;ve got a big heavy laptop&amp;#8230; I&amp;#8217;ve got a little handheld phone&amp;#8230; they both access the same online data, to a great extent, and my phone has a longer battery life, built-in 3G, and lacks the potential for spraining my back by carrying it.&lt;/p&gt;

&lt;p&gt;As for running Chrome OS to take a look at it, there are a couple of options. You can&amp;#8217;t run it directly on your Mac, because it only runs on netbooks, and a small specific list at that. What you can do is run it under virtualisation - same same way I, for those rare occasions when I need it - run &amp;#8216;Windows in a window&amp;#8217;. &lt;a href='http://www.virtualbox.org/'&gt;VirtualBox&lt;/a&gt; is a virtualisation tool, which will let you run Chrome OS in a window on top of your Linux, Windows or Mac OS machine. Alternatively, and much more simply, just load up &lt;a href='http://www.google.com/chrome'&gt;the Chrome browser&lt;/a&gt; - technically, the chromium open-source browser, which is the core of Chrome, since Chrome is still Windows-only. Chrome OS is, in essence, a modified form of the Chrome browser running on streamlined Linux OS, so if you want to know what Chrome OS looks like today, running Chrome (or chromium) will get you a lot of the way there&amp;#8230;&lt;/p&gt;

&lt;p&gt;Chromium is pretty usable as a browser - I&amp;#8217;ve been using it as my main browser for a few weeks now, with little trouble. Chrome OS, however, is not usable yet. It&amp;#8217;s expected to be released to hardware manufacturers sometime around the spring, and be on the market latish next year.&lt;/p&gt;

&lt;h3 id='about_the_author'&gt;About the author&lt;/h3&gt;

&lt;p&gt;Richard Cohen is a Linux expert and Python developer, living in Hong Kong. A long time authority on handheld devices, he also holds the rare distinction of having worked for both Sun Microsystems and SCO.&lt;/p&gt;</content>
    <published>2010-02-22T05:03:44Z</published>
  </entry>
  <entry>
    <title>How to build 100 web servers in a day</title>
    <link href="http://agilesysadmin.net/imaging-or-configuration-management" rel="alternate" type="text/html"/>
    <id>tag:agilesysadmin.net,2010-01-21:/imaging-or-configuration-management</id>
    <content type="html">&lt;h2 id='strategies_for_configuration_management_imaging_and_automation'&gt;Strategies for configuration management: imaging and automation&lt;/h2&gt;

&lt;p&gt;&amp;#8220;Great news,&amp;#8221; says your boss. &amp;#8220;The server you built yesterday is perfect. Now we need a hundred more just like it. And when you&amp;#8217;ve done that, could you take a look at my laptop before lunch? I can&amp;#8217;t seem to get into my email.&amp;#8221;&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s common nowadays for sysadmins to manage very large numbers of servers - often virtual servers created on-demand in cloud platforms like Amazon EC2. How do you build so many servers and keep them updated - automatically, reliably, and quickly?&lt;/p&gt;

&lt;p&gt;One common strategy is the &lt;strong&gt;golden image&lt;/strong&gt; pattern: set up the server the way you want it, and then copy the disk image and use that to boot as many clone machines as you need. Another is the &lt;strong&gt;automation&lt;/strong&gt; pattern: start with a generic server, and then apply automatic configuration tools such as Puppet to bring the machine into a specified state where it is ready for production.&lt;/p&gt;

&lt;h2 id='the_golden_image'&gt;The golden image&lt;/h2&gt;

&lt;p&gt;The golden image is attractive to many because it&amp;#8217;s &lt;strong&gt;easy&lt;/strong&gt; and cheap. It&amp;#8217;s quick to create images, and you just need a big disk to store them.&lt;/p&gt;

&lt;p&gt;Imaged machines also have &lt;strong&gt;low latency&lt;/strong&gt;: they&amp;#8217;re ready for production in just a few minutes from startup. Finally, it&amp;#8217;s &lt;strong&gt;platform agnostic&lt;/strong&gt;: you can image virtually any kind of machine, even Windows (which most config automation tools can&amp;#8217;t handle very well).&lt;/p&gt;

&lt;p&gt;So what&amp;#8217;s the problem with the golden image? &lt;span&gt;Luke Kanies&lt;/span&gt;, creator of Puppet, prefers to call it the &amp;#8220;foil ball&amp;#8221; approach: your images can quickly become an &lt;strong&gt;unmanageable&lt;/strong&gt;, crumpled mess. Firstly, how many images do you need? Well, as many as you have different types of machines: web servers, databases, load balancers, DNS servers, and so on.&lt;/p&gt;

&lt;p&gt;The number of images multiplies again when you take &lt;strong&gt;history&lt;/strong&gt; into account. What happens when you need to recreate the state of the database server last month to troubleshoot a problem? You need to keep old images around, which means a new image every time you make a change.&lt;/p&gt;

&lt;p&gt;And here&amp;#8217;s a thing: if you do need to make a change (for example a security upgrade for a critical package), you&amp;#8217;ll have to &lt;strong&gt;rebuild&lt;/strong&gt; the golden image and then re-image and reboot all affected machines - which means lots of bandwidth and possibly downtime. And, unfortunately, even imaged machines usually need some &lt;strong&gt;final tweaking&lt;/strong&gt; (eg IP addresses) before they&amp;#8217;re ready for use.&lt;/p&gt;

&lt;h2 id='automation_tools'&gt;Automation tools&lt;/h2&gt;

&lt;p&gt;By comparison, building your machines with an automatic configuration tool such as Puppet, Chef or even cfengine gives you many advantages. The configuration is &lt;strong&gt;self-documenting&lt;/strong&gt;; it&amp;#8217;s easy to see what should be on each machine, and more importantly, why it&amp;#8217;s there. It will also &lt;strong&gt;stay in sync&lt;/strong&gt; with reality.&lt;/p&gt;

&lt;p&gt;Although your server types will be different, they will also likely have a lot in &lt;strong&gt;common&lt;/strong&gt;. With images, these supposedly common settings could easily drift apart over time. With automation tools, you can put these settings into modules or classes, just as a software developer re-uses a module or library in another project.&lt;/p&gt;

&lt;p&gt;In fact, all the advantages of software modules are available: you can &lt;strong&gt;share code with others&lt;/strong&gt;, download public recipes and manifests, and maintain a complete version history of your network.&lt;/p&gt;

&lt;p&gt;Automated configuration is intrinsically &lt;strong&gt;multi-platform&lt;/strong&gt;. Puppet and Chef can abstract away some of the differences between operating systems, and you can add minor tweaks of your own. For example, you might need a slightly different MySQL config setting for MySQL 4.x as opposed to 5.x. A one-line switch in the configuration can address this problem, instead of creating two disk images.&lt;/p&gt;

&lt;p&gt;Of course, everything comes with a downside. It is more &lt;strong&gt;difficult&lt;/strong&gt; and usually more time-consuming to build an automated configuration, especially from scratch and when you&amp;#8217;re still learning to use the tools. And some things are &lt;strong&gt;hard to automate&lt;/strong&gt;. Some software just wasn&amp;#8217;t written with automated installation and management in mind.&lt;/p&gt;

&lt;p&gt;Also, not all software will be &lt;strong&gt;packaged&lt;/strong&gt; for your platform (or you need special compilation options). In these cases you will need to package the software yourself.&lt;/p&gt;

&lt;p&gt;Finally, configuration management doesn&amp;#8217;t always mix well with &lt;strong&gt;human intervention&lt;/strong&gt;. In particular, someone may make a config change on the machine which is then automatically reversed by Puppet. At best this can be a nasty surprise, at worst it can result in a site outage. Managing desktops automatically can create similar problems. This needs to be addressed at a business level with a proper change control process and making it clear to everyone where the boundaries of automatic management lie.&lt;/p&gt;

&lt;h2 id='combined_strategies'&gt;Combined strategies&lt;/h2&gt;

&lt;p&gt;So both imaging and automation have their place; neither is a magic bullet. The best strategy for scaling your deployments is often a judicious &lt;strong&gt;combination&lt;/strong&gt; of these two approaches. You can, for example, start with a &amp;#8216;stem cell&amp;#8217; image containing an approved base build, security fixes and settings which don&amp;#8217;t often change, which is then configured by Puppet or Chef. Or you could use provisioning tools such as Kickstart and Cobbler and then hand over to Puppet. Or even build the machine with Puppet and then create a golden image from this.&lt;/p&gt;

&lt;p&gt;One thing is certain: ignoring the problem is not an option. Moving to an automated network might seem like a big project, but the key is to &lt;strong&gt;start small&lt;/strong&gt;. Set aside a block of time every week to spend on improving your infrastructure, and automate one small thing at a time as part of a gradual continuous process. The more you invest in this, the more benefits you&amp;#8217;ll see - and the more time you&amp;#8217;ll have for fixing your boss&amp;#8217;s email.&lt;/p&gt;

&lt;h2 id='further_reading'&gt;Further reading&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Golden Image or Foil Ball?&lt;/span&gt; (Luke Kanies)&lt;/li&gt;

&lt;li&gt;&lt;a href='http://michaeldehaan.net/2009/08/21/scripted-kickstart-vs-image-based-deployment-for-linux-systems/'&gt;Scripted Kickstart vs. Image-Based Deployment For Linux Systems&lt;/a&gt; (Michael DeHaan)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='about_the_author'&gt;About the author&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;John Arundel&lt;/strong&gt; is a consultant, systems integrator and automated infrastructure dude who specialises in building performant, highly-reliable systems with Puppet and other open-source tools. He writes about these and other issues at the &lt;a href='http://bitfieldconsulting.com/'&gt;Bitfield Consulting blog&lt;/a&gt;.&lt;/p&gt;</content>
    <published>2010-01-21T20:03:44Z</published>
  </entry>
  <entry>
    <title>Advanced Dependency Management with Yum Shell</title>
    <link href="http://agilesysadmin.net/advanced-dependency-management" rel="alternate" type="text/html"/>
    <id>tag:agilesysadmin.net,2010-01-15:/advanced-dependency-management</id>
    <content type="html">&lt;p&gt;Many years ago, Red Hat had a (rather unfair) reputation of being a Linux distrubution forever crippled by a painful and clumsy package management system. &amp;#8220;Dependency Hell&amp;#8221; was the name used to describe the situation one could get into where circular dependencies arose, and the user became stuck. Dependency hell (which was always a bit of a myth) is a thing of the past now, especially since RHEL 5 where Red Hat adopted the powerful Yellowdog Updater, Modified (yum) which CentOS and Fedora had used for some time. However, just occasionally, problems arise which require some black-belt dependency solving.&lt;/p&gt;

&lt;p&gt;For example, last week, a Linux user was attempting to replace the default sysklogd with rsyslog. He had a package which provided a newer version than the one provided in the distro, and was trying to install it. Yum wouldn&amp;#8217;t allow this, owing to a conflict of ownership of the logrotate syslog entry. He was going to try uninstalling syklogd, but a quick check suggested this might not be a good idea:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@yarg ~]# rpm -e --test sysklogd
error: Failed dependencies:
    	syslog is needed by (installed) initscripts-8.45.30-2.el5.centos.x86_64
        syslog is needed by (installed) vixie-cron-4.1-76.el5.x86_64&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Aha - yum will remove initscripts, upon which most of the system depends, so that&amp;#8217;s not a great idea.&lt;/p&gt;

&lt;p&gt;So - we have a catch 22. We want to install rsyslog, but we can&amp;#8217;t because of a conflict with sysklogd. We can&amp;#8217;t uninstall sysklogd, because that will remove most of the system. Now, one could trust that rsyslog is a drop in replacement for rsysklogd, and remove sysklogd with rpm -e &amp;#8211;nodeps, but that feels a bit hacky. No, this is exactly the sort of situation in which we can use yum shell.&lt;/p&gt;

&lt;p&gt;Yum shell is a very nifty feature of yum which allows the user to stack commands to resolve various types of packaging issues. This is exactly what we need to do with our rsyslog / sysklogd issue, and was a godsend on earlier versions of Redhat when replacing sendmail with exim or postfix provided similar challenges.&lt;/p&gt;

&lt;p&gt;So, we fire up yum shell:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@yarg stephen]# yum shell
Loaded plugins: fastestmirror
Setting up Yum Shell
&amp;gt; install rsyslog
&amp;gt; remove sysklogd
&amp;gt; run 
&amp;gt; exit
Leaving Shell&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You&amp;#8217;ll see some feedback during the process - but what&amp;#8217;s basically happening is that all the operations are being run in a single transaction (and, incidentally with only one call of python, and the yum libraries, repo checks etc). This means that we get around the issues yum was complaining about, because the operations are carried out in a single shot.&lt;/p&gt;

&lt;p&gt;I think yum shell is a powerful feature, and it&amp;#8217;s great to have the capability to script sets of commands and bundle them up into a single operation, and one I think you&amp;#8217;ll find will be a potententially valuable addition to your toolkit.&lt;/p&gt;</content>
    <published>2010-01-15T12:03:44Z</published>
  </entry>
  <entry>
    <title>How to print every nth line of a file</title>
    <link href="http://agilesysadmin.net/print-every-nth-line" rel="alternate" type="text/html"/>
    <id>tag:agilesysadmin.net,2009-11-23:/print-every-nth-line</id>
    <content type="html">&lt;p&gt;Sometimes a scripting language isn&amp;#8217;t the right tool for the job. I&amp;#8217;ve been working on a piece of code that parses huge logfiles. The test data needed to be representative across 24 hours - a simple slice wouldn&amp;#8217;t do. I spent a few minutes knocking up a python script to print every 100th line when I stopped and thought &amp;#8216;There&amp;#8217;s a better way&amp;#8217;!&lt;/p&gt;

&lt;p&gt;Of all the Unix command line utilities that I&amp;#8217;ve used, I think I&amp;#8217;d highlight sed as the most useful and powerful. You can really accomplish quite a terrifying amount with it. To meet my needs, the sed &amp;#8216;script&amp;#8217; is seriously trivial.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sed -n &amp;#39;0~100p&amp;#39;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We invoke sed with the -n option, which means only include explicitly printed lines in the output. 0~100 means select every 100th line, beginning at 0. Since 0 doesn&amp;#8217;t exist, it starts at line 100. It then just prints the line.&lt;/p&gt;

&lt;p&gt;I didn&amp;#8217;t pursue my python script to do the same, but I wouldn&amp;#8217;t mind betting the sed version is &lt;em&gt;much&lt;/em&gt; faster, and given the size of these logs, that a very good thing indeed!&lt;/p&gt;</content>
    <published>2009-11-23T12:03:44Z</published>
  </entry>
  <entry>
    <title>The Atalanta Systems Guide to Open Source Operating Systems</title>
    <link href="http://agilesysadmin.net/opensource-os-recommendations" rel="alternate" type="text/html"/>
    <id>tag:agilesysadmin.net,2009-11-19:/opensource-os-recommendations</id>
    <content type="html">&lt;p&gt;One of the most common questions for newcomers to Linux is &amp;#8220;Which Linux version should I use?&amp;#8221; or &amp;#8220;Which Linux version is best?&amp;#8221;. I&amp;#8217;m also asked for my professional recommendations about which OS, or which distribution people should run, especially by people new to the idea of using an open-source operating system. I had this conversation again very recently, and felt it would be worth publishing my own experiences and recommendations.&lt;/p&gt;

&lt;p&gt;Broadly speaking, computer use tends to be divided between workstation/desktop and server. In the review that follows, I&amp;#8217;ll try to approach the discussion from both perspectives.&lt;/p&gt;

&lt;h4 id='red_hat'&gt;Red Hat&lt;/h4&gt;

&lt;p&gt;For many people, especially in the commercial business world, &lt;a href='https://www.redhat.com/'&gt;Red Hat&lt;/a&gt; &lt;em&gt;is&lt;/em&gt; Linux. If you work with Linux professionally, my experience is that the vast majority of machines you will meet will be running Red Hat.&lt;/p&gt;

&lt;p&gt;Back in 2003 Red Hat changed the world. Until then Red Hat (by this stage at version 9) was entirely free. You could buy support from Red Hat, but all the software, all the binary packages, all the patches were freely available. Red Hat changed the rules - they announced that henceforth Red Hat would be producing two versions - an enterprise grade, commercially supported, paid-for &amp;#8216;Enterprise Linux&amp;#8217; (these days referred to as RHEL), and a &amp;#8216;community edition&amp;#8217; - called Fedora Core. The idea was to use &lt;a href='https://fedoraproject.org/'&gt;Fedora&lt;/a&gt; as a community driven, fast-moving, entirely free and open test bed, from which technology would trickle down to the more stable enterprise edition.&lt;/p&gt;

&lt;p&gt;So how does Red Hat shape up in 2009?&lt;/p&gt;

&lt;p&gt;On the server, Red Hat is unquestionably the industry leader. I&amp;#8217;ve deployed and managed many hundreds of RHEL 2, 3, 4 and 5 boxes, and can say without a doubt that it is very highly reliable and stable. Documentation is generally of high quality, and on account of its status as the industry standard, there&amp;#8217;s also a vast amount of information available on the internet. Red Hat commercial support has generally been good, on the few occasions I have had to use it.&lt;/p&gt;

&lt;p&gt;One big advantage of RHEL, since version 5, is the adoption of the yum package management and dependency solving tool. Coupled with a decent understanding of RPM, and when best practices are followed (i.e. not mixing repositories and randomly installing third party packages), this provides what is, in my view, the ultimate *nix package management solution.&lt;/p&gt;

&lt;p&gt;A further benefit of Red Hat is they have a large number of incredibly smart people working on some very clever tools - a quick glance at the suite of stuff coming out of Red Hat&amp;#8217;s &lt;a href='http://et.redhat.com/page/Main_Page'&gt;Emerging Technology&lt;/a&gt; (ET) labs reveals a huge depth of well-written and carefully thought out utilities. Most of these have good documentation and active mailing lists and IRC channels. They&amp;#8217;re also frequently written in Python, and are very open to patches and contributions.&lt;/p&gt;

&lt;p&gt;On the down side, the implication of a very stable platform is a very slow release cycle. This means certain packages can get really quite significantly out of date - Ruby and Python are obvious examples, but similarly the Apache webserver, Tomcat, PHP, MySQL - these have been patched for security but few if any upstream features or improvements make it into the Red Hat repositories. This can be mitigated in some ways - Red Hat sell an &lt;a href='http://www.redhat.com/appstack/'&gt;Application Stack&lt;/a&gt;, which provide an updated LAMP platform, and there are reliable community projects which provide newer version of the stock packages.&lt;/p&gt;

&lt;p&gt;Another disadvantage is that Red Hat&amp;#8217;s Licensing structure means that cost can quickly get expensive if there is a requirement for anything not in the &amp;#8216;base&amp;#8217; channel - so clustering support, virtualisation, the application stack and other add-ons can be quite a budget breaker.&lt;/p&gt;

&lt;p&gt;On the desktop, RHEL ships with Open Office and Firefox, and for the very simplest of tasks will be adequate. However, manual intervention will be required to get java and flash plugins working, and the default music and video playback capabilities are primitive. Notionally Red Hat is suitable for the desktop, but it&amp;#8217;s rarely used in this environment.&lt;/p&gt;

&lt;h4 id='centos'&gt;CentOS&lt;/h4&gt;

&lt;p&gt;As soon as Red Hat announced their plans for commercial linux, groups of people sprung into action. Being an open-source company from the very beginning, Red Hat agreed they would continue to provide source rpms for all their software (to subscribers). Thus immediately it became possible to rebuild a free-as-in-beer RHEL from the sources, having removed logos and not freely distributable content. Thus the &lt;a href='http://www.centos.org'&gt;CentOS&lt;/a&gt; project was born.&lt;/p&gt;

&lt;p&gt;CentOS has most of the advantages of advantages of Red Hat - being 100% binary compatible, it&amp;#8217;s exactly as reliable and stable, only it&amp;#8217;s absolutely free.&lt;/p&gt;

&lt;p&gt;You don&amp;#8217;t get official commercial support, and there is a delay between the release of the latest Red Hat point release, and the CentOS equivalent. This can be several weeks, or more.&lt;/p&gt;

&lt;p&gt;CentOS users tend to be seasoned Red Hat users, and frequently seem to occupy the higher strata of professional Linux users. This means that for the clueful, the community support is generally excellent. I know many of the CentOS core developers personally - they&amp;#8217;re a super bunch.&lt;/p&gt;

&lt;p&gt;Although it is perfectly possible to run CentOS as a workstation distribution, taking advantage of its reliability and stability, this is a somewhat manual undertaking. Not a problem if you&amp;#8217;re a seasoned Linux administrator, don&amp;#8217;t need the latest and greatest desktop toys, and don&amp;#8217;t mind a bit of work and research to get things up and running. However, the same comments for Red Hat apply here: CentOS on the desktop is possible, but unusual.&lt;/p&gt;

&lt;h4 id='fedora'&gt;Fedora&lt;/h4&gt;

&lt;p&gt;If you want to know the future of Linux, track Fedora. It&amp;#8217;s fast moving, pretty and powerful.&lt;/p&gt;

&lt;p&gt;Everything you would expect in RHEL is in Fedora, but much newer. RHEL is ultimately built from Fedora, so in effect you get a very good idea of what&amp;#8217;a going to be in future releases.&lt;/p&gt;

&lt;p&gt;Releases are frequent, but generally of high quality. There is no easy upgrade path between editions - the principle is simple: You keep backups? Fine, just reinstall periodically. It is possible to upgrade with yum, but I can&amp;#8217;t recommend it. Maybe the process has improved since I last tried it, but if you want an upgrade that is guaranteed to work, just reinstall.&lt;/p&gt;

&lt;p&gt;On the desktop, Fedora is cutting-edge - there is plenty of good quality, community-contributed documentation for getting the usual requirements set up.&lt;/p&gt;

&lt;h4 id='debian'&gt;Debian&lt;/h4&gt;

&lt;p&gt;&lt;a href='http://www.debian.org'&gt;Debian&lt;/a&gt;, for me, just gets it right. I&amp;#8217;ve used Debian consistently since &lt;a href='http://www.debian.org/doc/manuals/project-history/ch-releases.en.html'&gt;&amp;#8216;Potato&amp;#8217;&lt;/a&gt;, and have found it reliable, easy to keep up-to-date, logical, and secure. It&amp;#8217;s very portable - running faithfully on &lt;a href='http://www.debian.org/ports/'&gt;eleven platforms&lt;/a&gt;, and quick and easy to install.&lt;/p&gt;

&lt;p&gt;At any time there are &lt;a href='http://mat.exon.name/releasepics/'&gt;three Debian branches&lt;/a&gt; - stable, testing and unstable. Stable is as its name suggests - solid, reliable and slow to change. Testing is generally pretty up-to-date, and pretty fast-moving - it represents what the next Debian stable release will be, and periodically is frozen, and then becomes stable. Unstable (also called Sid) is bleeding edge, very fast moving, and occasionally broken.&lt;/p&gt;

&lt;p&gt;A frequent criticism levelled at Debian is that it can get out of date. Once stable is released, only security updates will be applied, meaning the latest and greatest features never make it in, and as time elapses, it begins to look a bit long in the tooth. In fairness, this is no different for Red Hat or CentOS. However, Debian has a well-designed backports system, which enables newer packages to be built using the stable tool chain. These naturally carry the risk of compromising the stability of the system, but it&amp;#8217;s a reasonable compromise. Furthermore, Debian Testing is usually every bit as stable as Fedora or Ubuntu, and pretty much equivalent in freshness.&lt;/p&gt;

&lt;p&gt;One huge win is the breathtaking number of exceptionally well-maintained packages that are available out of the box. At last count there were something like 15000 packages available across all platforms. Debian maintainers have earned a (rather unfair) reputation as somewhat grumpy, and perfectionist and pedantic - precisely the people you want to ensure consistently high quality of software in your community operating system.&lt;/p&gt;

&lt;p&gt;For a server OS, Debian is ideal. The package maintainers sometimes have their own peculiar ways to manage things, but they&amp;#8217;re generally well documented and well thought out. Most packages also come with a curses-based configuration tool which sets up the most commonly used setups out of the box. Many times when I&amp;#8217;ve needed to get something up and running very quickly, in a way I can trust and rely on, I&amp;#8217;ve turned to Debian.&lt;/p&gt;

&lt;p&gt;Debian&amp;#8217;s &amp;#8216;political&amp;#8217; credentials are unmatched. By default they ship &lt;em&gt;only&lt;/em&gt; software released under a respected open source license. This extends to the Firefox browser, which is shipped as &amp;#8216;Iceweasel&amp;#8217; - with the non-free components removed. The Debian maintainers also take a firm line on the linux filesystem hierarchy - rubygems, for example, are &lt;a href='http://pkg-ruby-extras.alioth.debian.org/rubygems.html'&gt;forced to be installed in /var/lib/gems&lt;/a&gt;, and are not in the default shell path.&lt;/p&gt;

&lt;p&gt;This can make getting drivers for proprietary hardware a challenge, but again, there are good repositories available which provide these packages. Use on your own conscience, and at your own risk.&lt;/p&gt;

&lt;h4 id='ubuntu'&gt;Ubuntu&lt;/h4&gt;

&lt;p&gt;&lt;a href='http://www.ubuntu.org'&gt;Ubuntu&lt;/a&gt; is a funny beast. Based on Debian sources, it ought to share all the benefits of Debian, but with the added bonus of commercial support and marketing from an increasingly recognised brand.&lt;/p&gt;

&lt;p&gt;Ubuntu has invested heavily in making stuff work automatically - installation is via a live cd, with almost no user interaction. Most of the system is automatically configured, and auto-discovery of hardware requiring third party drivers, together with easy tools to obtain and install the drivers means that an Ubuntu system is pretty much the best guarantee you have to get a system that &amp;#8216;just works&amp;#8217; out of the box.&lt;/p&gt;

&lt;p&gt;As a result of this ease of use, Ubuntu has made big strides towards making Linux publicly available and easy. Coups such as preinstallation on consumer hardware - both netbooks and Dell workstations, have made Ubuntu the name most non-geeks think of when Linux is mentioned. Within the system, a good job has been done making everything look the same, and pleasant to use.&lt;/p&gt;

&lt;p&gt;The downside to all this is that the general quality of Ubuntu&amp;#8217;s six month releases has been seriously questioned. Several releases, including the most recent, have been characterised by really quite dreadful reports of instability and unreliability. Ubuntu&amp;#8217;s commitment to making third-party drivers available has also been a two-edged sword. They can&amp;#8217;t guarantee their stability or quality, yet they&amp;#8217;re shipped with Ubuntu. There&amp;#8217;s been some interesting debate around this subject in the Linux press recently - &lt;a href='http://www.linux-mag.com/cache/7607/1.html'&gt;read more about it here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ubuntu is also, of course, run entirely for profit. Unlike the Debian project, which enjoys a sort of democratic process, the decision as to what makes it into each Ubuntu release is largely made by Canonical.&lt;/p&gt;

&lt;p&gt;The blessed antidote to all this is that Ubuntu does offer a &lt;a href='https://wiki.ubuntu.com/LTS'&gt;Long Term Support (LTS) distribution&lt;/a&gt;, every two years. While the initial release stands every chance of being as buggy as any other, after a few months these are mostly ironed out, and by the time of the next release, it&amp;#8217;s generally pretty reliable. The great thing is it&amp;#8217;s then available and supported for a further 30 months. A predictable two-year release cycle, with commercial support, offering a general package level which is, on average, slightly newer than Debian stable, is actually a pretty good recipe for success. By way of a reference, I would say that of all the laptops I have used, my favourite has been one running Hardy Heron (8/04 LTS).&lt;/p&gt;

&lt;h4 id='slackware'&gt;Slackware&lt;/h4&gt;

&lt;p&gt;&lt;a href='http://slackware.org'&gt;Slackware&lt;/a&gt; was my first Linux distribution, and for many years was my favourite. Its philosophy is simple and old-fashioned. Provide a stable, up-to-date platform, using the latest stable releases of userland tools, with a vanilla kernel from kernel.org. Packages are distributed in the form of tarballs, or software is installed from source.&lt;/p&gt;

&lt;p&gt;Slackware makes the assumption that you aren&amp;#8217;t stupid, you know what you&amp;#8217;re doing, and you can read manual pages.&lt;/p&gt;

&lt;p&gt;I still have a soft spot for Slackware - it is always pretty up-to-date, has a simple, manual, text-based installer, and reliably provides a lean, fast system.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s a good way to learn about Linux - almost nothing is provided for you - you have to work it out from the fine documentation.&lt;/p&gt;

&lt;p&gt;The obvious drawback is the lack of a dependency-solving package manager. This makes it tricky to install software if you made a mistake in the installation process, or if you want to install something not provided by the distribution. Third-party package tools exist which go some way to addressing these issues, but these are not officially supported. For more information see &lt;a href='http://software.jaos.org/'&gt;Slapt-get&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id='suse'&gt;Suse&lt;/h4&gt;

&lt;p&gt;&lt;a href='http://www.novell.com/linux/'&gt;Suse&lt;/a&gt; is another Linux company that has changed. Based in Germany, and originally named SuSE, they were early innovators, putting a huge amount of effort into Live CDs, the KDE desktop, and their integrated system tool, YAST. They were also one of the early supporters of a 64 bit kernel.&lt;/p&gt;

&lt;p&gt;Novell purchased SuSE GMBH in 2003, and rebranded to SUSE. Shortly after, in 2005, there was the release of the community edition (&lt;a href='http://www.opensuse.org/'&gt;opensuse&lt;/a&gt;) with the paid-for enterprise editions continuing (Suse Linux Enterprise Desktop/Server).&lt;/p&gt;

&lt;p&gt;Suse is very well regarded, particularly on the European continent, and in the world of high performance computing. It is also RPM based, however, my impression is that provision for non-distro packages is not as great as for the Fedora/CentOS/Red Hat family.&lt;/p&gt;

&lt;p&gt;The big weakness is that Suse lacks a CentOS equivalent - there is no freely available Enterprise Suse, which to me leaves them marginalised. I&amp;#8217;m very rarely called upon to manage a Suse machine.&lt;/p&gt;

&lt;p&gt;On the desktop, Suse has always been excellent. Their paid-for &lt;a href='http://www.novell.com/products/desktop/'&gt;Enterprise Desktop&lt;/a&gt; is slick, clean and has all the third-party features built in as standard.&lt;/p&gt;

&lt;h4 id='mandriva'&gt;Mandriva&lt;/h4&gt;

&lt;p&gt;In the earlier days of Linux, Mandrake was a popular option for users for whom installing Debian or Slackware was a bit challenging. Originally based in Paris, it had quite a cult following, after the first release, forked from an early Red Hat version.&lt;/p&gt;

&lt;p&gt;Between 2003 and 2004 Mandrake operated under bankruptcy protection, emerging in 2005 with a merger with Brazilian Linux provider Connectiva, and forming a new entity &amp;#8217;&lt;a href='http://www2.mandriva.com/'&gt;Mandriva&lt;/a&gt;&amp;#8217;.&lt;/p&gt;

&lt;p&gt;Years ago I used Mandrake for a few clients, and found it to be very good - easy to use, and reliable. I&amp;#8217;ve used Mandriva once or twice since, and have observed that it has quite a flowing amongst new users who haven&amp;#8217;t gone down the Ubuntu route. However, I&amp;#8217;ve not got much experience of it. It&amp;#8217;s probably worth playing with.&lt;/p&gt;

&lt;h4 id='gentoo'&gt;Gentoo&lt;/h4&gt;

&lt;p&gt;I&amp;#8217;ve never used &lt;a href='http://www.gentoo.org'&gt;Gentoo&lt;/a&gt; in anger. Years ago, when Gentoo was in its infancy, and still had a cute cow as its logo, I gave it a try. The concept is simple enough - take the BSD approach of maintaining a source tree and scripts which enable systematic building of packages and tools, and deploy it on Linux. A further motivation is the ability to customise everything, and tweak and tune everything, down to the compile options. One of the claims is that this allows the user to build a very highly tuned system. In many way&amp;#8217;s it&amp;#8217;s the perfect geek system, and as it celebrates its &lt;a href='http://www.linux-mag.com/cache/7566/1.html'&gt;tenth birthday&lt;/a&gt;, it&amp;#8217;s clear it&amp;#8217;s doing something right!&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve also found Gentoo documentation to be amongst the best on the internet, and the gentoo users and maintainers I&amp;#8217;ve met at conferences are invariably highly skilled and pleasant.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d say if you have the time to fiddle, Gentoo could be a lot of fun. I&amp;#8217;m a pragmatist, and like to be able to install and remove packages in seconds, so a binary based distribution suits my purposes better.&lt;/p&gt;

&lt;h4 id='opensolaris'&gt;OpenSolaris&lt;/h4&gt;

&lt;p&gt;I really like Solaris. In many ways it can deliver on its claim to be &amp;#8220;The most advanced OS in the world&amp;#8221;, boasting the world&amp;#8217;s best and most advanced filesystem (ZFS), one of the finest observability tools in the industry (dtrace), cutting edge OS features (predictive self-healing and secure execution) and a range of three powerful virtualisation technologies (Zones, Xen and Virtualbox). At Atalanta Systems we readily deploy and support Solaris on both intel and Sparc, with a high degree of success.&lt;/p&gt;

&lt;p&gt;Unfortunately, Solaris lacks a number of features we come to expect as standard, for example there&amp;#8217;s no CIFS/SMB support, and it entirely lacks an integrated, modern, networked package management system. There are ways around the packaging problem - I&amp;#8217;ve used NetBSD&amp;#8217;s pgksrc on Solaris, and there are a few projects which use an apt-like tool to provide some of the packages you&amp;#8217;d find in the Linux world. I&amp;#8217;ve also recently discovered &lt;a href='http://wikis.sun.com/display/BigAdmin/Installing+Portaris'&gt;Portaris&lt;/a&gt; - a port of the Gentoo portage system to the Solaris system.&lt;/p&gt;

&lt;p&gt;However, strictly speaking, standard Solaris isn&amp;#8217;t quite open source. It&amp;#8217;s freely available, but you need to buy a support contract to get patches, and there&amp;#8217;s no CentOS equivalent.&lt;/p&gt;

&lt;p&gt;But, over the last five years or so, Sun has been manoeuvring to open source most of (and ultimately all of) their code base. Beginning with dtrace, and accelerating in 2007 with the successful poaching of Debian founder Ian Murdock, and the release of OpenSolaris in 2008, they&amp;#8217;ve taken huge steps.&lt;/p&gt;

&lt;p&gt;Open solaris is fully open source, it has up-to-date tools, and an excellent packaging system. It works very well on the desktop, with all the usual requirements readily available. However, like Fedora and Ubuntu it&amp;#8217;s on a fast, regular release cycle, and can&amp;#8217;t really be considered stable or fit for production.&lt;/p&gt;

&lt;p&gt;If you want to find out more, there are OpenSolaris user groups in most big cities. I&amp;#8217;ve been to several of the London ones - they&amp;#8217;re full of interesting people, and Sun provides free food and drink!&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll be continuing to keep my eye on OpenSolaris - when and if they provide a stable LTS-like edition, it could well be a force to reckon with.&lt;/p&gt;

&lt;h4 id='bsd'&gt;*BSD&lt;/h4&gt;

&lt;p&gt;Of course Linux isn&amp;#8217;t the only free and open source operating system - the *BSD family have actually been around even longer, but just aren&amp;#8217;t as fashionable or as well-known. With its heritage in &lt;a href='http://www.levenez.com/unix/'&gt;the earliest years of Unix&lt;/a&gt;, the *BSD family, are, as you might expect, highly mature and stable. There&amp;#8217;s a perception that they&amp;#8217;re harder to use, and more old-fashioned, but I find this to be a bit of a myth.&lt;/p&gt;

&lt;h4 id='freebsd'&gt;FreeBSD&lt;/h4&gt;

&lt;p&gt;&lt;a href='http://www.freebsd.org'&gt;FreeBSD&lt;/a&gt; is probably the most popular and easiest to get going. It&amp;#8217;s the most commercially recognised, and has a fine body of documentation and a responsive online community.&lt;/p&gt;

&lt;p&gt;Traditionally the system is small, lean and very fast. Packages can be installed as pre-built binaries, or using the standard BSD-style ports system.&lt;/p&gt;

&lt;p&gt;FreeBSD is a much unappreciated backbone of the internet. I&amp;#8217;ve run a number of sites on it, and it&amp;#8217;s absolutely rock solid, reliable, secure and performant.&lt;/p&gt;

&lt;p&gt;In addition to these benefits, FreeBSD also supports Sun&amp;#8217;s ZFS and Dtrace, and with Jails has an equivalently lightweight and powerful container-based virtualisation solution.&lt;/p&gt;

&lt;p&gt;Last time I used FreeBSD on the desktop, it felt like it was lagging behind Linux. Setting up X was a fairly manual task, and the process of getting the usual flash and java plugins was tedious. Likewise, support for proprietary equipment - particularly wireless chipsets and graphics cards is not as pervasive. I have no idea of the state of 3d desktop experience.&lt;/p&gt;

&lt;h4 id='netbsd'&gt;NetBSD&lt;/h4&gt;

&lt;p&gt;&lt;a href='http://www.netbsd.org'&gt;NetBSD&lt;/a&gt; aims to be really quite incredibly portable. I&amp;#8217;ve run NetBSD on Alpha, SGI, Sparc, Zaurus, and 32 and 64 bit intel platforms. For me this has largely been for entertainment, but I could conceive of a situation in which a person wanted to make use of some esoteric hardware and run a first rate Unix on it. Particularly on the Sparc platform I&amp;#8217;ve also found it to be blisteringly fast.&lt;/p&gt;

&lt;p&gt;A big advantage of NetBSD is its excellent &lt;a href='http://pkgsrc.org'&gt;pkgsrc&lt;/a&gt; system. Similar in concept to the FreeBSD ports system, it again is highly portable - I&amp;#8217;ve run it on Solaris and Slackware, and also use it on my macbook to provide up-to-date opensource packages.&lt;/p&gt;

&lt;h4 id='openbsd'&gt;OpenBSD&lt;/h4&gt;

&lt;p&gt;I have very little experience of &lt;a href='http://openbsd.org'&gt;OpenBSD&lt;/a&gt;. It has a reputation for being highly secure, and is popular for routers and firewalls on account of its excellent built-in PF firewall/routing software.&lt;/p&gt;

&lt;p&gt;Most of the advantages and disadvantages of FreeBSD apply, only there are fewer packages, and the system is not optimised for speed in the same way.&lt;/p&gt;

&lt;h4 id='conclusion'&gt;Conclusion&lt;/h4&gt;

&lt;p&gt;I hope you&amp;#8217;ve derived some benefit from this little run down of my experiences and, to an extent, prejudices, with the wide range of open source operating system options. In general I can make the following recommendations:&lt;/p&gt;

&lt;p&gt;If you require commercial support, I would use Red Hat every time. Most of the time, I would use CentOS in an environment where there is already some Red Hat adoption. I also tend to use CentOS in new, large environments, because my puppet modules and packaging expertise become reusable.&lt;/p&gt;

&lt;p&gt;I can also recommend Debian for servers, especially for single server deployments, and where you want to throw something together quickly. Debian is also well supported by puppet.&lt;/p&gt;

&lt;p&gt;I think FreeBSD is definitely worth playing with, especially if you don&amp;#8217;t already have significant Linux experience, and are prepared to try something a little different. I&amp;#8217;ve not deployed it in a large scale environment, and while it is supported by puppet, I have no experience of doing so. Keep your eyes on OpenSolaris - the potential is there for this to be a world beater.&lt;/p&gt;

&lt;p&gt;For a workstation, I would chose between Ubuntu LTS and Debian, with Fedora bringing up the rear.&lt;/p&gt;

&lt;p&gt;While I do adore Debian, for the every day user, Ubuntu has the benefit of being entirely painless to set up - out of the box, pretty much everything works. In a development environment, I would then run virtual machines using KVM, VMware or VirtualBox, matching the OS of my deployment platform. It also has the benefit of being reasonably up-to-date, and predictably stable.&lt;/p&gt;

&lt;p&gt;While Fedora is excellent, I don&amp;#8217;t feel the need to stay on the bleeding edge, and I don&amp;#8217;t want to have to rebuild my machine every six months.&lt;/p&gt;

&lt;p&gt;For those who are interested, at the time of writing, the Atalanta Systems infrastructure runs on a mixture of Debian stable, Solaris 10 and CentOS 5. My Linux laptop runs Ubuntu LTS, and my workstation runs CentOS 5. Most of my daily work is carried out on MacBook Pros with VWware Fusion virtual machines running Debian and CentOS. CentOS and Red Hat are the most represented amongst our clients, with Solaris, Debian and FreeBSD also in use in a number of places.&lt;/p&gt;</content>
    <published>2009-11-19T05:23:44Z</published>
  </entry>
  <entry>
    <title>DNS Zone File Fun with Python and Emacs</title>
    <link href="http://agilesysadmin.net/dns-zone-mangling" rel="alternate" type="text/html"/>
    <id>tag:agilesysadmin.net,2009-11-06:/dns-zone-mangling</id>
    <content type="html">&lt;p&gt;Sometimes we&amp;#8217;re faced with a boring, manual, labourious job which really needs to be done, will take a fairly long time, and be pretty unpleasant.&lt;/p&gt;

&lt;p&gt;Whenever I&amp;#8217;m faced with something like this, especially if it involves text, I try to make it interesting by setting myself the challenge of writing a script and/or using my editor to do the job faster than had I done it manually.&lt;/p&gt;

&lt;p&gt;In this case, I had two problems. Firstly. I had just made about 50 entries into a reverse DNS zone.&lt;/p&gt;

&lt;p&gt;These look like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;1 IN PTR router.nso&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Having done this manually, and rather slowly, I then had to make correpsonding forward entries, of the form:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;router in A 192.168.1.1&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My first thought was to do it in &lt;a href=''&gt;emacs&lt;/a&gt; with re-search-forward and replace-match, but this wasn&amp;#8217;t easy to do, so my next plan was to write a python script that does it.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for entry in open(&amp;quot;reverselist&amp;quot;,&amp;quot;r&amp;quot;).readlines():
  tokens=entry.strip().split()
  ip=tokens[0]
  name=tokens[3]
  hostname=name.split(&amp;quot;.&amp;quot;)[0]
  print &amp;quot;%s IN A 192.168.1.%s&amp;quot;%(ip, hostname)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This takes an input file of a list of reverse zone entries, and spits out forward entries. It&amp;#8217;s very simple - first we tokenise the input file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;#39;1  IN PTR router.nso&amp;#39;.strip().split()
[&amp;#39;1&amp;#39;, &amp;#39;IN&amp;#39;, &amp;#39;PTR&amp;#39;, &amp;#39;router.nso&amp;#39;]&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We then take the first and fourth (python counts from 0) tokens - the last part of the IP, and the hostname, and take off only the short name:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; [&amp;#39;1&amp;#39;, &amp;#39;IN&amp;#39;, &amp;#39;PTR&amp;#39;, &amp;#39;router.nso&amp;#39;][0]
&amp;#39;1&amp;#39;
&amp;gt;&amp;gt;&amp;gt; [&amp;#39;1&amp;#39;, &amp;#39;IN&amp;#39;, &amp;#39;PTR&amp;#39;, &amp;#39;router.nso&amp;#39;][3]
&amp;#39;router.nso&amp;#39;
&amp;gt;&amp;gt;&amp;gt; [&amp;#39;1&amp;#39;, &amp;#39;IN&amp;#39;, &amp;#39;PTR&amp;#39;, &amp;#39;router.nso&amp;#39;][3].split(&amp;#39;.&amp;#39;)[0]
&amp;#39;router&amp;#39;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then we just print them out again in the order we want.&lt;/p&gt;

&lt;p&gt;I was then faced with my second problem. The (large) forward zone file is horribly and inconsistently formatted. Adding entries is always a pain, because if you just hit tab a few times you&amp;#8217;ll never line up with the rest of the entries. Tidying it up has been on my todo list for a while, so I decided now really was the time to use the power of emacs!&lt;/p&gt;

&lt;p&gt;So my task was how to convert various lines such as:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nst-xp-ie8	IN	A	192.168.20.236
svn		IN	CNAME	cap-svn&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;with their various spacing issues into a consistently spaced file.&lt;/p&gt;

&lt;p&gt;In order to do this, we make use of the emacs regexp-replace function. This enables us to describe a pattern to match, and then defines how to match it.&lt;/p&gt;

&lt;p&gt;Emacs regular expressions are a lot like sed&amp;#8217;s, so I got there pretty quickly.&lt;/p&gt;

&lt;p&gt;The first pattern to match is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;\(\w+\)\s-*\(IN\)\s-*\(A\)\s-*\(\S-+\)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;\w+ means: match any word-constituent character&lt;/li&gt;

&lt;li&gt;\s- means: match any white space&lt;/li&gt;

&lt;li&gt;\S- means: match anything that is NOT whitespace&lt;/li&gt;

&lt;li&gt;\(&amp;#8230;\) is a construct which stores the match inside the brackets, so we can use it again later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So this says:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Match the hostname, IN, A and the IP, and all the space inbetween; store the hostname, IN, A and the IP in variables.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The replacement is much simpler:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;\1^I^I\2^I\3^I\4&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;\1, \2 etc are the variables, holding the matched hostname etc, and ^I is the tab character.&lt;/p&gt;

&lt;p&gt;Simple really, but more fun, and done in less time than doing it manually.&lt;/p&gt;</content>
    <published>2009-11-06T18:03:44Z</published>
  </entry>
  <entry>
    <title>Building puppet and facter RPMs for CentOS or RHEL</title>
    <link href="http://agilesysadmin.net/building-puppet-rpms" rel="alternate" type="text/html"/>
    <id>tag:agilesysadmin.net,2009-11-06:/building-puppet-rpms</id>
    <content type="html">&lt;p&gt;In the first part of his excellent &lt;a href='http://bitfieldconsulting.com/puppet-tutorial'&gt;Puppet tutorial&lt;/a&gt;, &lt;a href='http://twitter.com/bitfield'&gt;John Arundel&lt;/a&gt; suggests that, given the speed with which &lt;a href='http://reductivelabs.com/products/puppet'&gt;Puppet&lt;/a&gt; develops and changes, and to keep things simple, Puppet should be installed from source. While for one box, this may be true, I tend to the view that you should use the native package manager wherever possible. In the case of &lt;a href='http://www.centos.org'&gt;CentOS&lt;/a&gt; or &lt;a href='http://redhat.com'&gt;Redhat&lt;/a&gt; (the most common platforms for Puppet users, our survey says) , this means building RPMs. This article shows you how to build reusable puppet and facter RPMs, to make your life easier when you graduate from managing puppet on one server, to controlling a whole datacentre.&lt;/p&gt;

&lt;h3 id='set_up_an_rpmbuilding_environment'&gt;Set up an rpmbuilding environment&lt;/h3&gt;

&lt;p&gt;There are two things to consider here. Firstly, it&amp;#8217;s not considered good practice to build RPMs as root, and secondly, RPM by default will place built RPMs in /usr/src/redhat. For this reason, it&amp;#8217;s a good idea to create a dedicated user, and an area for building packages.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# useradd -m rpmbuilder
# su - rpmbuilder
$ for dir in RPMS SRPMS SPECS SOURCES BUILD; do mkdir -p redhat/$dir; done
$ mkdir redhat/RPMS/noarch
$ mkdir redhat/RPMS/x86_64
$ for x in 3 4 5 6; do mkdir redhat/RPMS/i$x\86; done
$ echo &amp;quot;%_topdir /home/rpmbuilder/redhat&amp;quot; &amp;gt; .rpmmacros&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id='get_the_facter_and_puppet_sources'&gt;Get the facter and puppet sources&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ cd redhat/SOURCES
$ wget http://reductivelabs.com/downloads/puppet/puppet-0.25.1.tar.gz
$ wget http://reductivelabs.com/downloads/facter/facter-1.5.7.tar.gz&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id='stage_the_spec_files_and_any_patches'&gt;Stage the spec files and any patches&lt;/h3&gt;

&lt;p&gt;The heart of the RPM building process is the spec (short for specification) file. This is a text file which provides instructions to the rpmbuild command on exactly how to build the package. This includes names, versions, compile options, dependency information and any other information you might like to know.&lt;/p&gt;

&lt;p&gt;Both facter and puppet tarballs ship with spec files for building RPMs - we need to get them and put them in the SPECS directory.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ tar xzvf puppet-0.25.1.tar.gz
$ tar xzvf facter-1.5.7.tar.gz&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The spec files live under the conf/redhat directory. At the time of writing, you would type:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cp facter-1.5.7/conf/redhat/puppet.spec ../SPECS
$ cp puppet-0.25.1/conf/redhat/puppet.spec ../SPECS&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It&amp;#8217;s a principle of RPM development that we always use pristine sources. However, sometimes, usually for distrubution-specific reasons, we need to apply a patch to the pristine code. The spec file will contain details of whether this is needed.&lt;/p&gt;

&lt;p&gt;Check if there are any patches required:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ grep ^Patch ../SPECS/facter.spec
$ grep ^Patch ../SPECS/puppet.spec
Patch0:         rundir-perms.patch
$ find . -name rundir-perms.patch | grep redhat
./puppet-0.25.1/conf/redhat/rundir-perms.patch&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The patch file needs to be placed in the SOURCES directory, alongside the pristine source tarball.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cp ./puppet-0.25.1/conf/redhat/rundir-perms.patch .&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;At the time of writing, the facter spec file is out of date - the version number is for an old version. You can verify this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ grep ^Version ../SPECS/facter.spec
Version: 1.5.5&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We need to up this to 1.5.7:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sed -i &amp;#39;/^Version/s/\.5\.5/\.5\.7/&amp;#39; ../SPECS/facter.spec&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Strictly speaking, we should also make an addition to the changelog. If you feel so inclined, open the file in an editor, and find the %changelog section, and add an entry a bit like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;* Fri Nov 6 2009 Stephen Nelson-Smith &amp;lt;me@sekrit.com&amp;gt; - 1.5.7
- Update to 1.5.7 &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Save the file, and we&amp;#8217;re done.&lt;/p&gt;

&lt;h3 id='make_sure_we_have_the_requirements'&gt;Make sure we have the requirements&lt;/h3&gt;

&lt;p&gt;In order to build an RPM we need to be sure we have the prerequiste tools and libraries availale on our system. For something as small and simple as puppet and facter, this is trivial. If you start building bigger packages, with dependencies that in turn have dependencies, you&amp;#8217;re probably going to find benefit from using &lt;span&gt;Mock&lt;/span&gt; - the RPM building tool used by the CentOS project to maingtain the entire repository.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ grep ^BuildRequires ../SPECS/facter.spec
BuildRequires: ruby &amp;gt;= 1.8.1
$ grep ^BuildRequires ../SPECS/puppet.spec
BuildRequires:  facter &amp;gt;= 1.5
BuildRequires:  ruby &amp;gt;= 1.8.1
$ rpm -q ruby
ruby-1.8.5-5.el5_1.1&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;OK, we&amp;#8217;re going to have to build facter, then install it so we can build puppet.&lt;/p&gt;

&lt;h3 id='build_facter'&gt;Build facter&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ cd ../SPECS
$ rpmbuild -bb facter.spec&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Look for the line that says something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Wrote: /home/rpmbuilder/redhat/RPMS/x86_64/facter-1.5.7-1.x86_64.rpm&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, become root, and install facter:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# rpm -Uvh /home/rpmbuilder/redhat/RPMS/x86_64/facter-1.5.7-1.x86_64.rpm&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id='build_puppet'&gt;Build puppet&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;# su - rpmbuilder
$ cd redhat/SPECS
$ rpmbuild -bb puppet.spec&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You should see something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Wrote: /home/rpmbuilder/redhat/RPMS/x86_64/puppet-0.25.1-1.x86_64.rpm
Wrote: /home/rpmbuilder/redhat/RPMS/x86_64/puppet-server-0.25.1-1.x86_64.rpm&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;NB when you come to install these rpms, you also need augeas-libs and ruby-augeas. Both of these are available in EPEL. This is a new dependency since 0.25.x.&lt;/p&gt;

&lt;p&gt;Congratulations, you&amp;#8217;ve built facter and puppet rpms, which you can now distrubute across your envirionment.&lt;/p&gt;</content>
    <published>2009-11-06T17:03:44Z</published>
  </entry>
  <entry>
    <title>Setting the MySQL client as a user's shell </title>
    <link href="http://agilesysadmin.net/mysql-as-shell" rel="alternate" type="text/html"/>
    <id>tag:agilesysadmin.net,2009-11-05:/mysql-as-shell</id>
    <content type="html">&lt;p&gt;Sometimes corporate firewalls can be a real headache for developers. We had a situation today in which we needed to provide read-only access to a MySQL database, but had only ssh to the machine. We have a very strict user policy, so weren&amp;#8217;t prepared to provide a shell account.&lt;/p&gt;

&lt;p&gt;One quick and cunning way to provide MySQL monitor access without opening up the firewall, or creating shell accounts is to create a user with /usr/bin/mysql as their shell.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a user with /usr/bin/mysql as the shell:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;# useradd -m -s /usr/bin/mysql dev&lt;/p&gt;

&lt;p&gt;# grep dev /etc/passwd&lt;/p&gt;

&lt;p&gt;dev:x:500:500::/home/dev:/usr/bin/mysql&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Drop a .my.cnf into the new user&amp;#8217;s home directory&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;[client]&lt;/p&gt;

&lt;p&gt;user=dev&lt;/p&gt;

&lt;p&gt;password=m3g4s3cr3t&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Create a user and grants in the mysql database&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;mysql&amp;gt; CREATE USER &amp;#8216;dev&amp;#8217;@&amp;#8217;localhost&amp;#8217; IDENTIFIED BY &amp;#8216;m3g4s3cr3t&amp;#8217;;&lt;/p&gt;

&lt;p&gt;mysql&amp;gt; GRANT SELECT ON *.* TO &amp;#8216;dev&amp;#8217;@&amp;#8217;localhost&amp;#8217;;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now when a user connects to the machine as the dev user, over ssh, they drop straight into a mysql monitor, with restricted privileges.&lt;/p&gt;

&lt;p&gt;Many thanks to &lt;a href='http://twitter.com/jamessheridan'&gt;James Sheridan&lt;/a&gt; for this tip.&lt;/p&gt;</content>
    <published>2009-11-05T15:03:44Z</published>
  </entry>
  <entry>
    <title>Getting a recent Python on Red Hat or CentOS</title>
    <link href="http://agilesysadmin.net/recent-python-on-rhel-or-centos" rel="alternate" type="text/html"/>
    <id>tag:agilesysadmin.net,2009-11-02:/recent-python-on-rhel-or-centos</id>
    <content type="html">&lt;p&gt;The &lt;a href='http://iuscommunity.org/'&gt;IUS Community Project&lt;/a&gt; is a free and unsupported effort by the RPM engineers at &lt;a href='http://www.rackspace.com'&gt;Rackspace Hosting&lt;/a&gt; to provide recent editions of popular open source tools. Packages include &lt;a href='http://php.net'&gt;PHP&lt;/a&gt;, &lt;a href='http://mysql.com'&gt;MySQL&lt;/a&gt; and &lt;a href='http://python.org'&gt;Python&lt;/a&gt;. Rackspace have made up-to-date packages available to their Enterprise customers for some time, but recently the idea of making packages available as &amp;#8220;The Fedora of Rackspace RPMs&amp;#8221; has emerged. Packages make the journey from the Testing IUS repository, to the Stable IUS repository, until eventually they make it into the Enterprise edition, which is only available to paying rackspace customers. IUS is not a Rackspace service - it&amp;#8217;s a volunteer project. If you want to get involved, &lt;a href='http://iuscommunity.org/faq/'&gt;read the project FAQ here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Naturally, using these packages carries with it the usual warnings - these packages are not supported by Red Hat, or the CentOS Project. They are bleeding edge, and for production use it is &lt;em&gt;always&lt;/em&gt; best to use your vanilla distribution packages. However, if you &lt;em&gt;have&lt;/em&gt; to upgrade, this is probably the best way to do it. But if it breaks, you get to keep the pieces.&lt;/p&gt;

&lt;h4 id='getting_set_up'&gt;Getting Set Up&lt;/h4&gt;

&lt;p&gt;First we need to obtain and install two RPMs - these provide entries in /etc/yum.repos.d for the &lt;a href='https://fedoraproject.org/wiki/EPEL'&gt;Fedora EPEL repository&lt;/a&gt;, and the IUS repository.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/x86_64/epel-release-1-1.ius.el5.noarch.rpm
$ wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/x86_64/ius-release-1-2.ius.el5.noarch.rpm
$ yum localinstall epel-release-1-1.ius.el5.noarch.rpm ius-release-1-2.ius.el5.noarch.rpm --nogpgcheck&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We then clean the yum repository metadata:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ yum clean all&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now we can see new packages:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# yum list available python26*
Excluding Packages from CentOS-5 - Updates
Finished
Excluding Packages from CentOS-5 - Base
Finished
Available Packages
python26-debuginfo.x86_64                2.6.2-1.ius.el5        ius             
python26-devel.x86_64                    2.6.2-1.ius.el5        ius             
python26-elixir.noarch                   0.6.1-1.ius.el5        ius             
python26-httplib2.noarch                 0.5.0-1.ius.el5        ius             
python26-jsonschema.noarch               0.2a-1.ius.el5         ius             
python26-lxml.i386                       2.0.11-1.ius.el5       ius             
python26-lxml-debuginfo.i386             2.0.11-1.ius.el5       ius             
python26-memcached.noarch                1.43-5.ius.el5         ius             
python26-mysqldb.x86_64                  1.2.3c1-1.ius.el5      ius             
python26-mysqldb-debuginfo.x86_64        1.2.3c1-1.ius.el5      ius             
python26-nose.noarch                     0.11.1-1.ius.el5       ius             
python26-setuptools.noarch               0.6c9-1.1.ius.el5      ius             
python26-simplejson.i386                 2.0.9-1.ius.el5        ius             
python26-simplejson-debuginfo.i386       2.0.9-1.ius.el5        ius             
python26-sqlalchemy.noarch               0.5.5-1.ius.el5        ius             
python26-test.x86_64                     2.6.2-1.ius.el5        ius             
python26-tools.x86_64                    2.6.2-1.ius.el5        ius&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now let&amp;#8217;s install it and have a look:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# yum install python26
# rpm -ql python26 | grep &amp;#39;/usr/bin&amp;#39;
/usr/bin/pydoc2.6
/usr/bin/python2.6
/usr/bin/python2.6-config&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Let&amp;#8217;s give it a try:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# python2.6
Python 2.6.2 (r262:71600, Sep 26 2009, 03:35:59) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
Type &amp;quot;help&amp;quot;, &amp;quot;copyright&amp;quot;, &amp;quot;credits&amp;quot; or &amp;quot;license&amp;quot; for more information.
&amp;gt;&amp;gt;&amp;gt; import json
&amp;gt;&amp;gt;&amp;gt; blog_entry = {}
&amp;gt;&amp;gt;&amp;gt; blog_entry[&amp;#39;title&amp;#39;] = &amp;#39;Portable Serialisation with JSON&amp;#39;
&amp;gt;&amp;gt;&amp;gt; blog_entry[&amp;#39;categories&amp;#39;] = (&amp;#39;programming&amp;#39;, &amp;#39;json&amp;#39;, &amp;#39;python&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; blog_entry[&amp;#39;published&amp;#39;] = &amp;#39;Yes&amp;#39;
&amp;gt;&amp;gt;&amp;gt; blog_entry[&amp;#39;author&amp;#39;] = &amp;#39;Stephen Nelson-Smith&amp;#39;
&amp;gt;&amp;gt;&amp;gt; with open(&amp;#39;blog.json&amp;#39;, mode=&amp;#39;w&amp;#39;) as file:
...     json.dump(blog_entry, file)
... 

# cat blog.json 
{&amp;quot;published&amp;quot;: &amp;quot;Yes&amp;quot;, &amp;quot;author&amp;quot;: &amp;quot;Stephen Nelson-Smith&amp;quot;, &amp;quot;categories&amp;quot;: [&amp;quot;programming&amp;quot;, &amp;quot;json&amp;quot;, &amp;quot;python&amp;quot;], &amp;quot;title&amp;quot;: &amp;quot;Portable Serialisation with JSON&amp;quot;}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We&amp;#8217;ve just tested two new features - a built-in JSON library, and Python&amp;#8217;s new &amp;#8216;with&amp;#8217; statement. Congratulations, you now have a modern Python.&lt;/p&gt;</content>
    <published>2009-11-02T21:03:44Z</published>
  </entry>
</feed>

<!-- page cached: 2010-24-02 01:34:12 -->

