<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:ewtroan</id>
  <title>ewtroan</title>
  <subtitle>ewtroan</subtitle>
  <author>
    <name>ewtroan</name>
  </author>
  <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom"/>
  <updated>2009-12-23T15:07:37Z</updated>
  <lj:journal userid="3963760" username="ewtroan" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://ewtroan.livejournal.com/data/atom" title="ewtroan"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:25992</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/25992.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=25992"/>
    <title>36" of snow</title>
    <published>2009-12-23T13:41:08Z</published>
    <updated>2009-12-23T15:07:37Z</updated>
    <content type="html">I spent the weekend, and Monday, and some of Tuesday, in the Virginia mountains. It's only about 3500' above sea level and really doesn't get that much snow. This weeks storm was a complete exception though. We made it up after a harrowing drive through driving snow (plows and salt were no match for it), and woke up to about two feet of snow on the ground. The snow kept falling until the early evening, for a total of around three feet. That is a lot of snow.&lt;br /&gt;&lt;br /&gt;The driving wind kept up for a few more hours, and we woke up to clear skies on Sunday morning. We also woke up to massive snow drifts. Think six foot high snow drifts about four feet thick. My driveway was completely drifted in (which mattered very little given the condition of the roads). Fortunately, most of the people I was with were skiers and had easy slope access (where easy means trudging through waist high drifts for about ten feet).&lt;br /&gt;&lt;br /&gt;Eventually we had to get to work on the driveway though. The driveway is heated, so the parts which weren't covered by drifts stayed somewhat clear. Here's a picture of what the rest looked like (the angle makes the drifts look a little smaller than they were; the tops were easily above my Mom's head).&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2527/4208068817_df5799d06c.jpg"&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:25620</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/25620.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=25620"/>
    <title>Amazon mp3 downloader, redu</title>
    <published>2009-12-11T18:37:16Z</published>
    <updated>2009-12-11T18:37:16Z</updated>
    <content type="html">A little while ago I built the amazon mp3 downloader for Foresight. Well, amazon decided to have some more free albums today, and my wife (and kids) like Christmas music, so I went to grab them. Doing so made it blindingly obvious that my wrapper script should have passed the command line arguments onto the application itself.&lt;br /&gt;&lt;br /&gt;A "conary update amazonmp3" will get you a version which is better integrated with firefox, and a "conary update amazonmp3=oot.rpath.org@fl:2" will get it for you if you haven't already installed it.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:25423</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/25423.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=25423"/>
    <title>Conary Capsules</title>
    <published>2009-11-30T14:34:47Z</published>
    <updated>2009-11-30T14:50:38Z</updated>
    <content type="html">&lt;p&gt;
Today is a pretty big day for us here at rPath. We've just &lt;a href="http://www.rpath.com/corp/component/content/article/57-2009-news/541-11302009b"&gt;announced support&lt;/a&gt; for Red Hat Enterprise Linux in our release management product offering. For the past year we've gotten significant interest from large organizations who want to use Conary's version control capabilities to manage their system deployment. Red Hat's incredible success has made their enterprise offerings a requirement for those businesses though, so they've been trying to find a way to get the best of Red Hat along with the best of rPath.

&lt;p&gt;
After scratching our heads for a while, we realized that what those folks want out of Conary isn't package installation, it's version control. They're looking for a way to organize sets of RPMs, define systems using versioned groups, and reliably update those systems once they're deployed. While we have previously imported operating systems (such as Novell SLES, CentOS, and Scientific Linux) we changed the packaging as part of that; doing that would (understandably) concern this set up of users &lt;em&gt;who really do want RPM&lt;/em&gt;. But RPM does package installation, not version control, so why not marry Conary version control with RPM package installation to get the best of both worlds?

&lt;p&gt;
This line of thought led to &lt;b&gt;capsules&lt;/b&gt; in Conary. They're really just a way of delegating the physical package management to another packaging system (RPM in this case) while using Conary to do the high level version orchestration. So Conary decides what gets installed, and RPM does the installation.

&lt;p&gt;
The packages themselves are represented as normal Conary components (rpmname:rpm), but the RPM itself gets stored in the repository instead of the contents of the individual files. When a changeset is generated, the entire RPM is sent down the wire and the conary client then passes the RPM package to RPM itself to do the install. If there are multiple RPMs they all go off to RPM simultaneously to make sure RPM can order everything properly.

&lt;p&gt;
What's this all mean to Red Hat Enterprise Linux users? It means that you can use Conary to define groups, rBuilder to build images, and Conary to apply updates. Strong version control, package repositories, and our deep dependency resolution are all preserved. It also means you can use RPM to query the system, install packages outside of Conary, and perform RPM system verifications. After all the installation path is &lt;b&gt;identical&lt;/b&gt; to anaconda's, with a single RPM transaction installing the entire system for you. It's not a system that looks like Red Hat Enterprise Linux, it &lt;b&gt;is&lt;/b&gt; Red Hat Enterprise Linux. After the system is installed the only difference is a Conary binary which can be used for package version orchestration.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:25264</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/25264.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=25264"/>
    <title>Amazon MP3 downloader</title>
    <published>2009-11-07T14:12:29Z</published>
    <updated>2009-11-07T14:12:29Z</updated>
    <content type="html">&lt;p&gt;
I spent a bit of time this morning packaging up the amazon mp3 downloader for Foresight systems. It's a binary only (amazon doesn't release sources), and I mined Fedora 6 and Fedora 10 to get the dependencies right.

&lt;p&gt;
If you're interested:

&lt;pre&gt;
conary update amazonmp3=oot.rpath.org@fl:2
&lt;/pre&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:24897</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/24897.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=24897"/>
    <title>Pearls</title>
    <published>2009-10-26T20:34:42Z</published>
    <updated>2009-10-26T20:39:30Z</updated>
    <content type="html">&lt;p&gt;Saw this at the local children's museum yesterday.

&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2628/4047905612_9ff946b893.jpg"&gt;

&lt;p&gt;Pearls from clams. Who knew?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:24606</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/24606.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=24606"/>
    <title>hfield wi-fire adapter</title>
    <published>2009-09-19T02:28:30Z</published>
    <updated>2009-09-19T02:28:30Z</updated>
    <content type="html">A couple of weeks ago I was killing some time while watching a long commit run by browsing either Engadget or Gizmodo. They mentioned a device called the Wi-Fire from hfield, which is an external USB wifi adapter which was supposed to work at long distances. They were incredibly skeptical about the lightweight, cheap feeling adapter until they tried it. Once they gave it a run they couldn't say enough good things about the $59 gizmo.&lt;br /&gt;&lt;br /&gt;I immediately thought about my mountain house. There is no connectivity where I am despite ample connectivity in the resort's buildings. I could see a connection (most of the time) but never get an address, and there are no broadband providers. I figured for $59, what the heck.&lt;br /&gt;&lt;br /&gt;Got it, it worked under Linux, and it definitely showed more networks at my primary house than the built in Intel stuff did. It even let me connect to the one unsecured network I saw (other than my own!). Not bad, so I put it aside until my next mountain weekend.&lt;br /&gt;&lt;br /&gt;Well, it's the weekend now and I'm in the mountains. The first thing I did (much to my wife's annoyance!) was turn on the laptop, plug in the Wi-fire, and point it toward to log. To my pleasure I got an IP address and I'm writing this blog post through the device. I'm happy to say this is one inexpensive device the works as advertised. Nice job &lt;a href="http://www.hfield.com"&gt;hfield&lt;/a&gt;! I'm only getting 700kbps, but I'm almost positive that's the fault of the lodge's wifi, not the Wi-Fire. I'll try and test in the lodge sometime to verify that, but it's never been all that quick.&lt;br /&gt;&lt;br /&gt;Oh, between getting the device and getting to the house to try it Verizon sent me a bulk mailing saying that broadband is now available at the mountain house. 1Mb for $20/month. Oh well.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:24349</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/24349.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=24349"/>
    <title>Stupid. Stupid.</title>
    <published>2009-07-15T19:41:16Z</published>
    <updated>2009-07-15T19:41:16Z</updated>
    <content type="html">&lt;em&gt;In a fundraising appeal titled "Hillarycare revisited," the RNC warned about "Obamacare" and said the government "already runs car companies, banks and mortgage companies. Republicans believe that the last thing the American people want is government telling them when and where — or even whether — they can get medical treatment for their families." &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;The American people much prefer their credit card companies telling them whether they can get medical treatment for their families.&lt;br /&gt;&lt;br /&gt;All this argument is about how to ration, not whether to ration. Like every other good in our economy, health care. Today it's rationed by ability to pay; that may or may not be fair. Arguing that it shouldn't be rationed is either utopian, idiotic, or duplicitous.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:24108</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/24108.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=24108"/>
    <title>Clouds as terrorist targets?</title>
    <published>2009-07-06T14:14:49Z</published>
    <updated>2009-07-06T14:14:49Z</updated>
    <content type="html">As a rule I don't repost from other blogs; I figure there isn't much of a need to just parrot at a distance. I can't help myself this time though.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.schneier.com/blog/archives/2009/07/terrorist_risk.html"&gt;Thanks Bruce.&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:23926</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/23926.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=23926"/>
    <title>Conary 2.0.44</title>
    <published>2009-07-04T13:06:31Z</published>
    <updated>2009-07-04T13:06:31Z</updated>
    <content type="html">Yesterday we released Conary 2.0.44 with a rather dry &lt;a href="http://blogs.conary.com/index.php/conarynews/2009/07/03/conary_2_0_44_released"&gt;change list&lt;/a&gt;. Hidden in there are some significant performance improvements for update, updateall, migrate, and group cooks.&lt;br /&gt;&lt;br /&gt;For the various forms of update, the time before Conary has built it's update plan is much shorter, especially if multiple passes of dependency resolution are required. For &lt;tt&gt;updateall --info&lt;/tt&gt; on my laptop, the time went from twelve minutes to four thanks to a whole bunch of changes. Some of those changes were in the client side dependency solver, whose iterative resolving is significantly more efficient. So much more so that those changes were enough to speed up the build time of the Foresight groups by about 30%.&lt;br /&gt;&lt;br /&gt;Now you know what I do on airplanes!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:23659</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/23659.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=23659"/>
    <title>Amazon On Demand</title>
    <published>2009-06-05T19:37:59Z</published>
    <updated>2009-06-05T19:37:59Z</updated>
    <content type="html">I've spent the last couple of weeks upgrading my home theater set up. One of those things where one failure (a subwoofer) cause another (the receiver) and the to do list just snowballed (switch to hdmi [finally], use the RF feature on the harmony remote, and so on). One of the items was to hook my TV up to an ethernet cable now that Panasonic VIERAcast has support for Amazon On Demand.&lt;br /&gt;&lt;br /&gt;It all seems to work really well, but here's the rub: I haven't bought anything. The shows on there are just too expensive. One of the most egregious example I've found is Jimmy Neutron season one (can you tell I have kids?). They charge $1.99 for a 30 minute episode. That's $4/hour, or about the same as a first run movie at the theater! For further comparison, the "best of season one" DVD is $27 for 17 episodes, one of which is double length. So 9 hours of "entertainment" for $27, or $3/hour. Why would I pay 33% more for on demand, which I can't watch in my car, on a plane, or during a vacation. I can even get the DVD two days for free later thanks to Amazon on demand. Not even my six year old thought Jimmy Neutron was worth $4/hour.&lt;br /&gt;&lt;br /&gt;There is a similar oddity if you compare HD shows to DVD purchases. They tend to cost more than the DVD (though the on demand for standard def costs less than the DVD). Given that it's not real HD (due to the reduced bitstream and bandwidth) it's hardly a compelling purchase. So much for Amazon on demand.&lt;br /&gt;&lt;br /&gt;Don't get me started on the pricing for current episodes compared to Hulu.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:23462</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/23462.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=23462"/>
    <title>Secession</title>
    <published>2009-04-17T16:08:09Z</published>
    <updated>2009-04-17T16:08:09Z</updated>
    <content type="html">Sit back and imagine how Rush Limbaugh and his compatriots would have reacted if the Democratic governor of New York had talked about seceding in 2002.&lt;br /&gt;&lt;br /&gt;Can you even imagine the deafening cries of unamericanism? Of a lack of patriotism? Of unfitness for office?&lt;br /&gt;&lt;br /&gt;What a bunch of hypocrites.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:23225</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/23225.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=23225"/>
    <title>A version to rule them all</title>
    <published>2009-04-16T22:43:21Z</published>
    <updated>2009-04-16T22:43:21Z</updated>
    <content type="html">I've been working on Conary for a long time now. For those who don't know, Conary is basically a version control system for deployed systems. We all use Subversion or whatever for our sources (and probably anything else that looks like source if you squint the slightest bit) for years now, but for some reason we don't use them for deployed systems.&lt;br /&gt;&lt;br /&gt;At best, we use a loose collection of versions. Tools like dpkg and rpm (and apt and yum) have integrated the versions of software components into peoples minds pretty well. Questions like "which version of vi are you running" are easy to answer in the Linux world. Simple commands like "rpm -qp /bin/vi" will give you reasonable answers.&lt;br /&gt;&lt;br /&gt;What that leaves is systems defined by, oh, 500 versions or so. Oh, and those versions probably don't include version information for your actual application or third party software products. Add those to the count.&lt;br /&gt;&lt;br /&gt;What all this means is that those 10,000 servers you're running don't have a version each, they have 500 versions each. You can't go look at two of them and easily see if they're the same. You can't make two of them match without going through backflips. You can't ask what version a server was running last week because the question doesn't make sense; you have to ask what 500 versions it was running last week. It's like using RCS to manage all of your source files. You might get a tag to get some kind of consistency, but aren't git versions better? Finally a single version to describe the state of your source tree. A single way ("hg parent" in my world) to know what the heck is there.&lt;br /&gt;&lt;br /&gt;Conary provides the same capability to running systems. Define your systems as Conary groups and have a single version. You need another system like that one? Just install the same version of the same group? You want to know what it was running last week? Look at what version of the group was on there last week (the rollback stack or /var/log/conary will both tell you). Do you need to downgrade? No problem.&lt;br /&gt;&lt;br /&gt;I simply don't know how system management can scale without a version associated with a system. Not a piece of a system, but the entire system.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:22962</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/22962.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=22962"/>
    <title>Fun and games with a Kindle</title>
    <published>2009-03-16T00:03:15Z</published>
    <updated>2009-03-16T00:03:15Z</updated>
    <content type="html">&lt;p&gt;
Right after the Kindle 2 started shipping, I bought one (that Monday). I figured if I could get FAA approach plates on the thing (like &lt;a href="www.readerplates.com"&gt;ReaderPlates&lt;/a&gt; does for the Sony) I'd save enough money to make the thing free within about 18 months. Oh, and it was a toy.

&lt;p&gt;
Funny enough, I've discovered that I kind of like reading books on the thing. Especially big, fat books where I lose track of things and having the search is great. But really any book I don't feel the need to own forever I'm happy to read on the device. It's light, the UI is good, the battery lasts forever, and you really disappear into a good book just like you do with paper. Nice job Amazon.

&lt;p&gt;
That aside, I've also enjoyed hacking up a couple of web apps which generate ebooks on the fly for the thing. I have one which I can list a couple of airports on and get an ebook with all of the FAA plates I need to fly in instrument conditions. The plates are date stamped, so I know when I'm current. Michael was a &lt;em&gt;huge&lt;/em&gt; help in getting all of that done. It gave me a chance to play with django and genshi too, which I needed to learn more about anyway.

&lt;p&gt;
Today I decided to play with the &lt;a href="www.tripit.com"&gt;TripIt&lt;/a&gt; APIs and see what I could make happen. After 240 lines of python code and about the same amount of genshi templates (with a huge dependency on xobj!), I have a web app which lists my itineraries in TripIt, let's me choose one, and creates an ebook summary of that itinerary. Now all the intregration I've done with email filters for TripIt pays off not only in iCal, but in a book format. Alright, so it's not clear why I need my itinerary on my phone's calendar and in my kindle, but it is cool to have hacked that up so quickly (almost all of it while a chicken was roasting). The authentication isn't real (it uses basic auth, not oauth), but it's real enough for me!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:22578</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/22578.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=22578"/>
    <title>Airline TV payment model</title>
    <published>2009-02-18T05:33:49Z</published>
    <updated>2009-02-18T05:33:49Z</updated>
    <content type="html">&lt;p&gt;
I'm writing this at 30,000 feet (I'll post it later) on a flight from New York
to San Diego. A long flight. It's scheduled for six and a half hours nonstop;
it's about as far as you can go without leaving the continental United States.

&lt;p&gt;
I spent some time hacking on a side project I'm working on with mkj, wrote
about a third of a white paper he and I are working on with Jake, read the
latest Economist for a while, ate dinner (eh), had dessert (yummy, but I
shouldn't have done it), tried not to watch &lt;em&gt;Gary Unmarried&lt;/em&gt;, watched
all of &lt;em&gt;Big Bang Theory&lt;/em&gt;, watched
most of a &lt;em&gt;How I met Your Mother&lt;/em&gt;, mostly ignored a movie about a
teenage girl (I don't identify), played mine sweeper a bit out of pure
desperation, and now I'm waching the video screen loop.

&lt;p&gt;
I have an hour and a half left.

&lt;p&gt;
As my eyes flicked back up to &lt;em&gt;Gary Unmarried&lt;/em&gt; I realized it was a
repeat. A loop. This flight is so long they ran out of material. Get me
out of here.

&lt;p&gt;
I was
actually tempted to watch it this time, but managed to resist and started
thinking about what shows I do watch. The list is really pretty short. In order or priority they are:

&lt;ol&gt;
&lt;li&gt;&lt;em&gt;30 Rock&lt;/em&gt;
&lt;li&gt;&lt;em&gt;My Name is Earl&lt;/em&gt;
&lt;li&gt;&lt;em&gt;Scrubs&lt;/em&gt;
&lt;li&gt;some animated stuff I record but don't seem to actually watch
&lt;/ol&gt;

&lt;p&gt;
What struck me about this list is that I started watching &lt;em&gt;30 Rock&lt;/em&gt; on
airplanes and &lt;em&gt;My Name is Earl&lt;/em&gt; in hotel rooms (yes, I travel a bit).
Thinking about this list I realized that I also watch &lt;em&gt;Big Bang Theory&lt;/em&gt;
and &lt;em&gt;Everybody Loves Raymond&lt;/em&gt; when I'm traveling because I've seen it on
airplanes and they can both make the time pass. That's about all I watch
save the &lt;em&gt;Family Guy&lt;/em&gt; which seems to have eaten TNT.
&lt;p&gt;
Ignoring &lt;em&gt;Family Guy&lt;/em&gt; (which is little more than background noise),
and I've started watching 60% of my shows on airplanes, and another 20%
when I'm traveling. My wife got into &lt;em&gt;Scrubs&lt;/em&gt;, so of the shows I've
picked out to watch over the last few years, I've started watching &lt;b&gt;all&lt;/b&gt;
of them when I'm traveling, and most of them on airplanes!

&lt;p&gt;
This surprised me a bit, and has an interesting implication. I've always
wondered how the partnership between airlines and the networks work (American
partners with CBS and Delta with NBC; notice I don't watch anything from ABC).
I had always assumed the airlines paid the networks for content, but based
on a sample size of one the highly captive audience on an airplane is
incredibly valuable because it has a high potential of leading to new viewers.
I wonder if the networks pay the airline to show content to that audience. If
they don't, they probably ought to.

&lt;p&gt;
80 minutes left. I'm back to being board.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:22469</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/22469.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=22469"/>
    <title>Google Maps Fail</title>
    <published>2009-02-04T20:47:09Z</published>
    <updated>2009-02-04T20:47:09Z</updated>
    <content type="html">&lt;p&gt;
&lt;em&gt;Too really get this, click on the links...&lt;/em&gt;

&lt;p&gt;
Say you're staying at the Doubletree hotel in downtown boston. You &lt;a href="http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=821+Washington+St,+Boston&amp;amp;sll=42.351947,-71.06163&amp;amp;sspn=0.314616,0.617981&amp;amp;ie=UTF8&amp;amp;z=16&amp;amp;iwloc=addr"&gt;look to see&lt;/a&gt; where it is in google maps. Realizing that you are renting a car, but there is no reason to keep it for the next day, you search for Avis locations &lt;a href="http://maps.google.com/maps?near=821+Washington+St,+Boston,+MA+02111&amp;amp;geocode=&amp;amp;q=avis&amp;amp;f=l&amp;amp;sll=42.348823,-71.064677&amp;amp;sspn=0.009832,0.019312&amp;amp;ie=UTF8&amp;amp;ll=42.349014,-71.062156&amp;amp;spn=0.004916,0.009656&amp;amp;z=17"&gt;nearby&lt;/a&gt;.

&lt;p&gt;
Look at that, there is an Avis location right next to the hotel at 1 Bennet Street! Fantastic! So call up Avis (you're out on a Sunday and you need the car for the next day), get the pickup at Logan, and the drop off at 1 Bennet Street. All set.

&lt;p&gt;
Now it turns out that the Charles Hotel at 1 Bennett Street (the hotel with the Avis, and note the extra &lt;em&gt;t&lt;/em&gt;) is in &lt;a href="http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;q=1+Bennett+St,+Cambridge,+Middlesex,+Massachusetts+02138&amp;amp;sll=42.373225,-71.112528&amp;amp;sspn=0.018896,0.038624&amp;amp;ie=UTF8&amp;amp;cd=1&amp;amp;geocode=FdeMhgIdasTC-w&amp;amp;split=0&amp;amp;ll=42.375476,-71.121197&amp;amp;spn=0.039312,0.077248&amp;amp;z=14"&gt;Cambridge&lt;/a&gt;, not Boston. That's miles away, and not at all useful. There is a 1 Bennet Street in Boston though, right next to the hotel you're staying at. Apparently that and Cambridge being kind of like Boston were enough to confuse google maps, and you.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:22228</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/22228.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=22228"/>
    <title>Toll roads</title>
    <published>2009-01-12T16:57:05Z</published>
    <updated>2009-01-12T16:57:05Z</updated>
    <content type="html">&lt;p&gt;
&lt;a href="http://freakonomics.blogs.nytimes.com/2009/01/08/why-youll-love-paying-for-roads-that-used-to-be-free-part-two/"&gt;Here&lt;/a&gt; is a concise, well written justification of toll roads. My wife regularly makes fun of me for suggesting that privatizing the interstate system would be a good idea. It's nice to see some sort of economic argument about how to fix road overcrowding.

&lt;p&gt;
Now, if someone would explain to me it makes sense to highly subsidize automobiles, moderatley subsidize air travel, and barely subsidize train travel I'd appreciate it.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:21773</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/21773.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=21773"/>
    <title>XObj, Part 2</title>
    <published>2008-12-26T02:24:41Z</published>
    <updated>2008-12-26T02:24:41Z</updated>
    <content type="html">&lt;p&gt;
giles7777 posted some comments about the XObj announcement I posted &lt;a href="http://ewtroan.livejournal.com/21550.html"&gt;here&lt;/a&gt; on Tuesday. He raised some points Brett and I talked about quite a bit when we put this thing together, so I wanted to respond to them. As an aside, giles7777 and I did more extreme programming together (at the time, we called it finding the damn bugs, but now it has an actual name!) than I've done with anyone else, so I hate ignoring his thoughts!

&lt;p&gt;
He asked if we had thought about parsing the schema instead of the XML instance in order to generate types. This approach is quite popular in the Java world, for instance. It's quite sane for a non-dynamic language where items need to be strongly typed from the beginning, and there are project in the python world for it &lt;a href="http://www.rexx.com/~dkuhlman/generateDS.html"&gt;as well&lt;/a&gt;. Brett and I talked long and hard about starting with the schema, and it was the approach I favored in the beginning. There were a few reasons we didn't take that approach.

&lt;p&gt;
One important reason was we wanted a framework which works with XML documents without schemas. While there are proper schemas for many types of documents, the informal XML formats we use internally at rPath, as well as in many of our APIs have never had a schema written. You can certainly argue that we're lazy not to do so, but I strongly suspect the vast majority of XML documents do not have a schema associated with them.

&lt;p&gt;
Another reason is that schemas can be poorly defined, requiring augmentation to be really useful. OVF is an example of this, unfortunately. The types use attributes which should rightfully be defined as IDREF types, but aren't. Having a way to augment a formal schema was necessary for us, and leaving the schema behind was an easy way of achieving this. (The python XObj implementation currently resolved ID/IDREF pairs for both serializing and parsing, automatically referencing a single object in both places; the AS3 implementation is a little behind but will get this feature soon)

&lt;p&gt;
The third major reason we wound up ignoring schemas was forward compatibility. The approach we took will parse any XML, let the application modify the pieces it understands, and output the XML without losing the unknown parts. We can represent both the known and the unknown consistently, allowing us high levels of compatibility as the document content gets enhanced. You can argue this is a misfeature as it has a high tolerance for documents which are not compliant with their own schema, and the Python implementation does allow the caller to validate a document against a schema as part of the parsing process.

&lt;p&gt;
The final reason, which may not be as important of a consideration as the other two, is we wanted a learning curve for this library which was flat. A lot of the existing XML parsing solutions take some getting used to, and coders who aren't steeped in XML take time to get productive. By ignoring the schema, not having to have code generation steps, and generating native objects XObj is easy to use. A single line turns XML into an object hierarchy which is easy to use, modify, and spit back out. The downside of course is that it's easy to create documents which violate a schema when you do so.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:21550</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/21550.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=21550"/>
    <title>Introducing XObj</title>
    <published>2008-12-23T22:14:19Z</published>
    <updated>2008-12-23T22:14:19Z</updated>
    <content type="html">&lt;p&gt;
A couple of weeks ago, I was talking with &lt;a href="http://verveguy.blogspot.com/"&gt;Brett Adam&lt;/a&gt; about XML decoding. We're looking at how to handle &lt;a href="http://verveguy.blogspot.com/"&gt;OVF&lt;/a&gt; in python, and I was talking about the approach the &lt;a href="open-ovf.sourceforge.net"&gt;open-ovf&lt;/a&gt; had taken and my desire to get real python classes around the OVF objects instead of a python layer around the XML. Something which turns the XML into an artifcat of the object model instead of an object model which allows access to the XML.

&lt;p&gt;
Brett told be about the approach to XML he'd used for the ActionScript implementation of the rPath Management Console, and I thought it was a good approach. He enhanced the XML parser provided with ActionScript by making it type aware; elements would get parsed into classes of the right type which could then be serialized on the output. This provides a natural place to hang methods as well as a nice way of providing typing hints into the parser.

&lt;p&gt;
I decided to code up a similar approach for python. As I worked on it, I kept walking into Brett's office with corner cases, XML oddities, and things I just didn't understand. We decided to work together on a common approach to XML parsing in the two languages, and release the work as the &lt;a href="http://code.google.com/p/xobj"&gt;XObj&lt;/a&gt; open source project under an MIT license. The code hasn't been released yet, but it is available via mercurial at &lt;tt&gt;http://hg.rpath.com/xobj/"&lt;/tt&gt;.

&lt;p&gt;
You should really think of what we've built as an object reflector. It's goal is to either take the objects described by an XML document and turn those into a set of classes (either python or AS3) consistent with that document, or to take a set of objects and serialize those in XML. It allows type information for both elements and attributes, the caller to specify which objects to use where, and places to put serialization hints.

&lt;p&gt;
One of this projects primary goals is to be easy to get started with and let the programmer use the more complicated features as he finds the need. Let me show you a couple of examples from python.

&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; from xobj import xobj
&amp;gt;&amp;gt;&amp;gt; class Foo(object):
...     pass
... 
&amp;gt;&amp;gt;&amp;gt; class Bar(object):
...     def sum(self):
...         return self.first + self.second
... 
&amp;gt;&amp;gt;&amp;gt; foo = Foo()
&amp;gt;&amp;gt;&amp;gt; foo.val = "value"
&amp;gt;&amp;gt;&amp;gt; foo.bar = Bar()
&amp;gt;&amp;gt;&amp;gt; foo.bar.first = 1
&amp;gt;&amp;gt;&amp;gt; foo.bar.second = 2
&amp;gt;&amp;gt;&amp;gt; print xobj.toxml(foo, 'foo', xml_declaration = False)
&amp;lt;foo&amp;gt;
  &amp;lt;bar&amp;gt;
    &amp;lt;first&amp;gt;&amp;lt;/first&amp;gt;
    &amp;lt;second&amp;gt;2&amp;lt;/second&amp;gt;
  &amp;lt;/bar&amp;gt;
  &amp;lt;&amp;lt;val&amp;gt;value&amp;lt;/val&amp;gt;
&amp;lt;/foo&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
See? Nice and simple. Now, let's say that same hunk of XML is stored in the string varaible
&lt;tt&gt;xml&lt;/tt&gt;. Here's how you turn that into a python object tree:

&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; doc = xobj.parse(xml)
&lt;/pre&gt;

&lt;p&gt;
The object which is returned, &lt;tt&gt;doc&lt;/tt&gt;, represents the entire document. If includes some housekeeping elements which make generation cleaner, as well as objects which repesent the XML document. The top level element in the XML was called &lt;tt&gt;foo&lt;/tt&gt;, so that's where the element representing the top level element was stored.

&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; doc.foo.val
'value'
&amp;gt;&amp;gt;&amp;gt; doc.foo.bar.first
'1'
&amp;gt;&amp;gt;&amp;gt; doc.foo.bar.second
'2'
&lt;/pre&gt;

&lt;p&gt;
Simple in and out object serialization with XML in between. Nothing fancy, and there are certainly other ways of doing this. Let's look at what else we can do now though. We have lost the class information for &lt;tt&gt;Bar&lt;/tt&gt; though since we didn't tell the parser what object to use for the &lt;tt&gt;bar&lt;/tt&gt; element. We can fix that though.

&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; doc = xobj.parse(xml, typeMap = {'bar' : Bar})
&amp;gt;&amp;gt;&amp;gt; doc.foo.bar.sum()
'12'
&lt;/pre&gt;

&lt;p&gt;
Okay, so maybe that's not quite what we wanted. We need to tell the parser that &lt;tt&gt;first&lt;/tt&gt; and &lt;tt&gt;second&lt;/tt&gt; are integers, not strings.

&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; doc = xobj.parse(xml, typeMap = {'bar' : Bar, 'first' : int, 'second' : int})
&amp;gt;&amp;gt;&amp;gt; doc.foo.bar.sum()
3
&lt;/pre&gt;

&lt;p&gt;
That &lt;tt&gt;typeMap&lt;/tt&gt; specifies the type for &lt;tt&gt;bar&lt;/tt&gt; elements and it's elements &lt;tt&gt;first&lt;/tt&gt; and &lt;tt&gt;second&lt;/tt&gt;. To avoid those maps getting overly complicated, here is another way of doing the same thing:

&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; class Bar2(Bar):
...     first = int
...     second = int
&amp;gt;&amp;gt;&amp;gt; doc = xobj.parse(xml, typeMap = {'bar' : Bar2})
&amp;gt;&amp;gt;&amp;gt; doc.foo.bar.sum()
3
&lt;/pre&gt;

&lt;p&gt;
Here we're using class variables as form of prototyping. We could carry this even further, and specify a class for &lt;tt&gt;foo&lt;/tt&gt; which tells what &lt;bar&gt;bar&amp;lt;/tt&amp;gt; should be.

&amp;gt;&amp;gt;&amp;gt; class Foo2(Foo):
...     bar = Bar2
... 
&amp;gt;&amp;gt;&amp;gt; doc = xobj.parse(xml, typeMap = {'foo' : Foo2})
&amp;gt;&amp;gt;&amp;gt; doc.foo.bar.sum()
3
&amp;lt;/pre&amp;gt;

&lt;p&gt;
There are lots of other things you can do with prototypes like this. The last I'm going to show here (as it is 5pm two days before Christmas!) shows how you can force an item to be a list.

&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; doc = xobj.parse(xml, typeMap = {'bar' : [ Bar2 ] } )
&amp;gt;&amp;gt;&amp;gt; doc.foo.bar[0].sum()
3
&lt;/pre&gt;

&lt;p&gt;
By making mapping the &lt;tt&gt;bar&lt;/tt&gt; element to a list of &amp;lt;/tt&amp;gt;Bar&amp;lt;/tt&amp;gt; classes, we've told the parser to always use a list (normally an element creates a list of objects only if that element appears more than once. (Note that I used a typeMap here instead of the prototype in the &lt;tt&gt;Foo&lt;/tt&gt; class, but both methods are identical).

&lt;p&gt;
There are lots more things XObj can do, all of which are demonstrated in the python test case. Give it a try, and tell me what you think!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:21437</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/21437.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=21437"/>
    <title>Conary and Version Control</title>
    <published>2008-11-25T14:20:39Z</published>
    <updated>2008-11-25T14:20:39Z</updated>
    <content type="html">&lt;p&gt;
When we got started on Conary, one of the original goals was to bring the strengths of the version control tools used by software developers to the systems tools used by system administrators. We explored those ideas in the &lt;a href="http://www.rpath.com/technology/conary.html"&gt;first paper&lt;/a&gt; we presented on Conary, and it's been an important guideline ever since.

&lt;p&gt;
I was talking to an architect at a well known financial institution last week, and he had a good analogy for the power of Conary. He compares the rpm/dpkg/yum/apt methodology to rcs. Each file is separately managed, with separate versioning and little to no coordination between the files. Conary, according to him, was much more like subversion (I'd have preferred mercurial, but nevertheless!) where the entire archive was treated and versioned as a whole (thanks to Conary's groups). That makes it much easier to keep sets of things in sync and operate at a system level instead of an individual package level.

&lt;p&gt;
I thought this was a pretty good way of thinking about how Conary is different from the older approaches, and provides some insight into why groups are so powerful.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:21106</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/21106.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=21106"/>
    <title>iPhone NDA, redux</title>
    <published>2008-10-01T16:47:24Z</published>
    <updated>2008-10-01T16:47:50Z</updated>
    <content type="html">&lt;p&gt;
Kudo's to Apple for &lt;a href="http://feeds.engadget.com/~r/weblogsinc/engadget/~3/408379470/"&gt;changing their mind&lt;/a&gt; on the draconian NDA they've imposed. Now, if we could just get some progress on opening up the platform a bit we'd all feel good.

&lt;p&gt;
I guess my wife's MacBook is feeling safe!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:20985</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/20985.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=20985"/>
    <title>iPhone Apps</title>
    <published>2008-09-26T12:58:22Z</published>
    <updated>2008-09-26T12:58:22Z</updated>
    <content type="html">&lt;p&gt;
Some people still wonder why I'm not comfortable with an iPhone. I think &lt;a href="http://www.engadget.com/2008/09/25/engadget-cares-save-us-from-apples-groundbreaking-developer-s/"&gt;engadget&lt;/a&gt; summarizes it best:

&lt;p&gt;&lt;em&gt;
Sections 5.1, 5.2, and 5.3: This SDK legal agreement is confidential. Engadget shouldn't even be writing about it. Also confidential: any knowledge we share with you about how to develop iPhone apps. So if you were thinking about doing a blog or a book about developing for the iPhone, or simply open-sourcing your app, then think again. Knowledge is a dangerous thing -- why do you think we did a commercial themed after Orwell's 1984?
&lt;/em&gt;

&lt;p&gt;
Hopefully most folks know me well enough to know I'm not going to be particularly supportive of a platform which makes open source apps a contract violation. Ironic for a phone which is based on a pile of open source, isn't it? Makes me think about taking my wife's MacBook away.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:20619</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/20619.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=20619"/>
    <title>No frills airlines</title>
    <published>2008-09-14T02:25:09Z</published>
    <updated>2008-09-14T02:25:09Z</updated>
    <content type="html">Remember when Southwest was the no-frills, discount airline?&lt;br /&gt;&lt;br /&gt;Now that so many of the other airlines charge for checked bags, aisle row seats, or calling them for a reservation it seems like US Air, American, and friends ought to be called the discount airlines. It's a shame they charge more than Southwest most of the time.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:20268</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/20268.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=20268"/>
    <title>One size fits all</title>
    <published>2008-08-29T17:04:15Z</published>
    <updated>2008-08-29T17:04:15Z</updated>
    <content type="html">&lt;p&gt;
Apparently Red Hat has a problem with perl. It's slow. Really slow. To fix it, you just need a recompile. Of course, recompiling breaks our support agreement for perl, but never mind that.

&lt;p&gt;
I'm sure Red Hat will fix this soon. It's only been &lt;a href="http://rss.slashdot.org/~r/Slashdot/slashdot/~3/378175229/article.pl"&gt;two years&lt;/a&gt;.

&lt;p&gt;
Isn't it time to work with a Linux partner who thinks you &lt;b&gt;should&lt;/b&gt; change the things that bother you. A partner who realizes they won't get everything right? A partner who thinks that open source should be about, well, the &lt;b&gt;source&lt;/b&gt;?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:20202</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/20202.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=20202"/>
    <title>USB Power</title>
    <published>2008-05-22T20:49:24Z</published>
    <updated>2008-05-22T20:49:24Z</updated>
    <content type="html">&lt;p&gt;&lt;br /&gt;I'm sitting at Houston Hobby airport waiting for a flight home, and while I was looking for power I saw these pedestals between a lot of the seats at the Southwest gates.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/ewtroan/pic/000016y7/"&gt;&lt;img src="http://pics.livejournal.com/ewtroan/pic/000016y7/s320x240" width="180" height="240" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Not only does it have one 120V outlet between each seat, but it has one powered USB plug between each seat! Time for all of those manufacturers who think proprietary power plugs still make sense to grow up and realize custom wall warts are not a feature.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ewtroan:19920</id>
    <link rel="alternate" type="text/html" href="http://ewtroan.livejournal.com/19920.html"/>
    <link rel="self" type="text/xml" href="http://ewtroan.livejournal.com/data/atom/?itemid=19920"/>
    <title>Recipe Factories</title>
    <published>2008-03-03T15:56:48Z</published>
    <updated>2008-03-03T15:56:48Z</updated>
    <content type="html">&lt;p&gt;
For a while now I've been struggling with how to get recipes out of source components. In many cases, our superclasses are now smart enough to eliminate the need for them altogether, leaving just a stub recipe. For binary tarballs, a single &lt;tt&gt;addArchive&lt;/tt&gt; rule is all that's needed in the recipe (you end up putting a version in there as well, but it's almost always encoded in the filename itself making even that spurious). I've been hoping to get to the point where you can check in (say) a single binary tarball and cook without having to have a recipe at all.

&lt;p&gt;
For this to work well, the cook process would need to look in the repository for the right cook rules, just like it does for superclasses already. We'd also want to be able to leverage the work which has already been done with superclasses, so whatever we added needs to be compatible with those. We came up with the idea of a &lt;it&gt;recipe factory&lt;/it&gt;, and I just finished up a working implementation for the next version of Conary 2.

&lt;p&gt;
The basic idea is that a source component can now have a &lt;it&gt;type&lt;/it&gt;, and that type tells the cook process to go look in the repository for help building that source component. For example, if &lt;tt&gt;testtar:source&lt;/tt&gt; has type &lt;tt&gt;archive&lt;/tt&gt;, Conary will look for a &lt;tt&gt;factory-archive:source&lt;/tt&gt; component, and use the recipe in that component as the starting point for building the &lt;tt&gt;testtar&lt;/tt&gt; package.

&lt;p&gt;
The factory-archive:source component itself must be of type &lt;tt&gt;factory&lt;/tt&gt;, and it is not a normal recipe. It instead provides a recipe factory, which is a class derived from the &lt;tt&gt;Factory&lt;/tt&gt; superclass. Conary instantiates an object of that class and calls that object's &lt;tt&gt;getRecipeClass&lt;/tt&gt; method. That method returns a Recipe class (not an object!), often descended from the PackageRecipe superclass.

&lt;p&gt;
If the original source component, &lt;tt&gt;testtar:source&lt;/tt&gt; in this case, does not provide it's own recipe, the recipe class returned by the recipe factory is used to build the package. All of the normal recipe rules apply for that class; it must have the right name attribute, it must specify a version string, and so on. From this point on, it's just a normal build. If the source component did include it's own recipe, the class returned by the factory gets called &lt;tt&gt;FactoryRecipeClass&lt;/tt&gt; and the source component's own recipe is then loaded. The source component's recipe file will then create it's own recipe class using &lt;tt&gt;FactoryRecipeClass&lt;/tt&gt; as it's superclass, which will be used to drive the build.

&lt;p&gt;
One last point: the factory knows a bit about the recipe it's supposed to build. The name of the package being built (&lt;tt&gt;testtar&lt;/tt&gt; in this case) is available as &lt;tt&gt;self.name&lt;/tt&gt; and the path to all of the source files is &lt;tt&gt;self.sources&lt;/tt&gt;. It can also open any of the source files by using &lt;tt&gt;self.openSourceFile(path)&lt;/tt&gt;, so it can inspect the files in the source component to decide how to proceed.

&lt;p&gt;
An example of a very simplistic recipe factory is in &lt;a href="http://oot.rpath.org"&gt;oot.rpath.org&lt;a&gt; as &lt;a href="http://www.rpath.org/rbuilder/repos/oot/files?t=factory-archive%3Asource;v=/oot.rpath.org%40factory%3Atest/1204309229.846%3A1.0-1;f="&gt;
factory-archive:source&lt;/a&gt;, and a source component which uses it is in the same repository
as &lt;a href="http://www.rpath.org/rbuilder/repos/oot/files?t=testtar%3Asource;v=/oot.rpath.org%40factory%3Atest/1204309377.883%3A1.0-1;f="&gt;
testtar:source&lt;/a&gt;. Factories could be used in a large number of different ways, and I think it will take some experimentation to find out what works well and what doesn't.

&lt;p&gt;
Get all of this? I know it's a bit complicated, but it's really very powerful.&lt;/a&gt;&lt;/a&gt;</content>
  </entry>
</feed>
