<?xml version="1.0"?>
<rss version="2.0">
  <channel>
    <title>Advogato blog for oubiwann</title>
    <link>http://www.advogato.org/person/oubiwann/</link>
    <description>Advogato blog for oubiwann</description>
    <language>en-us</language>
    <generator>mod_virgule</generator>
    <pubDate>Sat, 11 Oct 2008 14:24:35 GMT</pubDate>
    <item>
      <pubDate>Mon, 29 Sep 2008 00:05:42 GMT</pubDate>
      <title>Current and Future Happenings</title>
      <link>http://www.advogato.org/person/oubiwann/diary.html?start=210</link>
      <guid>http://oubiwann.blogspot.com/feeds/7334617062189606890/comments/default</guid>
      <description>&lt;div&gt;&lt;br /&gt;Sorry there's been so much radio silence at this end lately... a lot has been going on, and it looks like it's going to stay that way for a while. I just need to get used to it and start posting again :-)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Canonical&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;The big news is that &lt;a href="http://www.canonical.com/" &gt;Canonical&lt;/a&gt; quite took me by surprise :-) I had planned on doing consulting work again, but I was made an offer of camaraderie, to come join a team at Canonical that I know well, and I couldn't resist. I'm now working on the &lt;a href="http://www.canonical.com/projects/landscape" &gt;Landscape&lt;/a&gt; team at Canonical, the same folks who brought you the much beloved &lt;a href="https://storm.canonical.com/" &gt;Storm ORM&lt;/a&gt; :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Already, I've been working there for two weeks and it's been a delight. They use a lot of the same processes that we did at Divmod and in the Twisted project (in fact, three of us on the team are Twisted developers), so that was very smooth. Another thing that made the transition very easy was manner in which they engage in a&#xA0;beautiful&#xA0;mix of group discussion and rapid development. The open source community roots at Canonical are very deep... and you can see them very clearly without digging :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At Canonical, I've repeated run across old friends from my Zope days, from Hacking Society in Colorado, and other places/associations from my past. I am somewhat stunned at the job Canonical has done in&#xA0;acquiring&#xA0;a talented and dedicated workforce. I've never seen a company embrace open source at the level and to the degree that this company does, while at the same time retaining all of the most excellent qualities of the community within the&#xA0;corporate&#xA0;culture. Someone should do a socio-technological/business PhD thesis on these guys...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In preparation for the many (and intense) marathon sprints that this team runs in a year, I've purchased a new laptop. It's the first dedicated Ubuntu dev machine/Desktop I've had... I've been running all my Ubuntu instances as virtual machines in Parallels and VMWare Fusion (or as remote servers at colos and virtual host providers). My love for the Evolution mail client continues to grow and I've found the only reason I miss the Mac is for the automatic handling of sound and to play Spore :-)&#xA0;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;SOA Conference&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now on to some future stuff. I've been invited to speak about dynamic languages (Python) and ultra-large scale (ULS) systems at &lt;a href="http://www.sda-india.com/conferences/soaindia2008/" &gt;SOA-India&lt;/a&gt; this year in Bangalore. The industry that has grown up around service oriented architectures (SOA) overwhelmingly tends towards Java, so this is a really great sign. I think the efforts that the &lt;a href="http://www.sun.com/" &gt;Java Mothership&lt;/a&gt; has made in building bridges with dynamic languages such as Ruby and Python is having a tremendous impact throughout the programming world. I've got an eye on Ted Leung and the Jython team :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, the conference promises to be quite interesting, with speakers from around the world and with diverse backgrounds. I'm expecting to return from Bangalore with a multitude of new ideas and lots of new avenues to explore.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Blog&#xA0;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Speaking of SOA, I am still working on the second part of the book review for Josuttis' book &lt;a href="http://www.soa-in-practice.com/" &gt;SOA in Practice&lt;/a&gt;. Perhaps before I finish that one, though, I will blog about another O'Reilly title I have been enjoying immensely: Van Lindberg's &#xA0;&lt;a href="http://oreilly.com/catalog/9780596517960/" &gt;Intellectual Property and Open Source&lt;/a&gt;. Note that Van has been quite active in the Python community and is contributing his expertise at many levels for the benefit of us all. Regardless,&#xA0;the book is &lt;span class="Apple-style-span" style="font-style: italic;"&gt;very&lt;/span&gt; well written and I will have nothing but good to say about it :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After that, I'm going to finish up the draft I have for a blog post on metaclasses, based on notes I took while working with &lt;a href="http://www.incrediblepear.com/" &gt;Incredible Pear&lt;/a&gt; on the &lt;a href="http://www.pbs.org/" &gt;PBS&lt;/a&gt; &lt;a href="http://www.dtv.gov/" &gt;DTV&lt;/a&gt; project.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And finally, there have been more requests for me to write about setting up a&#xA0;&lt;a href="http://oubiwann.blogspot.com/2006/07/twisted-mail-server.html" &gt;Twisted Mail server&lt;/a&gt;... so, as one reader puts it, I will conclude the telling of that tale in an up-coming post as well :-)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElectricDuncan/~4/405556052" height="1" width="1"/&gt;</description>
    </item>
    <item>
      <pubDate>Wed, 27 Aug 2008 22:03:54 GMT</pubDate>
      <title>netaddr Python Library</title>
      <link>http://www.advogato.org/person/oubiwann/diary.html?start=209</link>
      <guid>http://feeds.feedburner.com/~r/ElectricDuncan/~3/376285459/netaddr-python-library.html</guid>
      <description>&lt;div&gt;&lt;br /&gt;I recently got several feature requests for my &lt;a href="http://pypi.python.org/pypi/NetCIDR/" &gt;NetCIDR&lt;/a&gt; Python library, and in the course of a conversation with one user in particular, I was made aware of the &lt;a href="http://code.google.com/p/netaddr" &gt;netaddr project&lt;/a&gt;. I took some time to explore the code details and was quite impressed: drkjam did a great job. The manner in which he implemented the many features (especially the IP math) was the kind of thing I wanted to do for NetCIDR ... at some point. After about an hour of digging around, testing out the API, and pondering, I decided to retire NetCIDR and encourage my users to migrate to netaddr.&lt;br /&gt;&lt;br /&gt;There are a couple more esoteric features in NetCIDR that netaddr currently doesn't have, but we've started talking about adding support for those in netaddr, at which point there will be no need to use NetCIDR.&lt;br /&gt;&lt;br /&gt;To facilitate this, I've added a &lt;a href="http://code.google.com/p/netaddr/wiki/NetCIDRMigration" &gt;wiki page&lt;/a&gt; on the netaddr Google Code project for helping users make the transition from NetCIDR to the netaddr API.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElectricDuncan/~4/376285459" height="1" width="1"/&gt;</description>
    </item>
    <item>
      <pubDate>Tue, 26 Aug 2008 22:04:18 GMT</pubDate>
      <title>SOA in Practice: A Handbook for Early-Stage ULS Systems (Part 1)</title>
      <link>http://www.advogato.org/person/oubiwann/diary.html?start=208</link>
      <guid>http://feeds.feedburner.com/~r/ElectricDuncan/~3/375409631/soa-in-practice-handbook-for-early.html</guid>
      <description>&lt;div&gt;&lt;br /&gt;&lt;b&gt;The ULS Series&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://oubiwann.blogspot.com/2008/05/required-reading-ultra-large-systems.html" &gt;Required Reading: Ultra Large Systems&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://oubiwann.blogspot.com/2008/06/ultra-large-systems-example.html" &gt;Ultra Large Systems: An Example&lt;/a&gt;&lt;/li&gt;&lt;li&gt;SOA in Practice: A Handbook for Early-Stage ULS Systems (Part 1)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;A Book Review&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;First off, this is an O'Reilly publication. What's more, if O'Reilly had something like a "criterion collection," this work would be in it. This title is what it says it is, "SOA in Pactice: The Art of Distributed System Design." Authored by &lt;a href="http://www.josuttis.com/" &gt;Nicolai M. Josuttis&lt;/a&gt;, this is one of the best written technical overview works I have ever read, both for writing style and content. For anyone interested in ULS and/or SOA, I have one thing to say: &lt;a href="http://www.soa-in-practice.com/" &gt;buy this book immediately&lt;/a&gt;, with expedited shipping.&lt;br /&gt;&lt;br /&gt;I'm not going to write a formal review with pros, cons, deep analysis about message, etc. However, what I will do is spend some time discussing the crossover from SOA to ULS, covering details with quotes from "SOA in Practice." I will not cover the book in detail and reveal all of its precious nuggets, but I will give a taste of what it has to offer and how it applies to ultra large-scale systems.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Divergence&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since most of what I want to discuss is about what we can gain by taking lessons learned from SOA and applying them to efforts in exploring or prototyping ULS systems, I want to initially outline the stark differences between those systems and SOA.&lt;br /&gt;&lt;br /&gt;The most obvious difference is scale. To put things in perspective, imagine implementing a large SOA for a large organization. Imagine the requirements, the project planning, the logistics, the code, the bugs, the setbacks, the short-term failures, and finally, the successful delivery. Now multiply that: two related but semi-autonomous SOA projects. And again, with four. How about a third time for eight?&lt;br /&gt;&lt;br /&gt;Any reader with experience in working with large projects is probably having heart palpitations right now (and for that, I apologize). You have first hand experience of the difficulties and the pain: with a linear increase in the size of a project, there is an exponential increase in the difficulty of managing that project (people, code, timelines, etc.), asymptotically approaching 100% unmanageability, regardless of the amount of resources you throw at the project.&lt;br /&gt;&lt;br /&gt;The point just past the asymptote is where ULS systems and SOA meet. In other words, a ULS system &lt;span style="font-style: italic;"&gt;as a whole&lt;/span&gt; -- by definition -- cannot be built. Such a system can accrete over time, but is simply too large to be designed, built and managed. Rather, it is emergent. Efforts being made in ULS systems research right now are focused on how we can best facilitate that emergence.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Convergence&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One of the profound problem solving skills that maths like analytic geometry teach us is understanding potentially intractable problems by examining discrete and meaningful chunks. It's easy to chop something up; it's quite a different matter to chop such that the pieces are useful and provide further insight.&lt;br /&gt;&lt;br /&gt;If working with ULS systems is like integrating over the volume of a complex solid in 11-space, then SOAs provide us with the tools of breaking part of that work up into a manageable chunk,  one that we can wrap our heads around. Many of the same problems that technicians are anticipated to encounter when working with ULS systems exist at a smaller scale and are well understood within the context of SOA.&lt;br /&gt;&lt;br /&gt;And this is where our friend Nicolai's book comes in.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ULS Systems Review&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before we continue, let's take a quick look back at some of the ULS basics laid out by &lt;a href="http://www.sei.cmu.edu/uls/the_report.html" &gt;the  report&lt;/a&gt; of the &lt;a href="http://www.sei.cmu.edu/" &gt;Software Engineering Institute&lt;/a&gt; (SEI) of Carnegie Mellon:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ULS systems are systems of systems at internet scale. &lt;/li&gt;&lt;li&gt;ULS systems will be interdependent webs of software-intensive systems, people, policies, cultures, and economics.&lt;/li&gt;&lt;/ul&gt;In order to become a functional reality, these systems will require extensive research in the following areas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Human Interaction&lt;/li&gt;&lt;li&gt;Computational Emergence&lt;/li&gt;&lt;li&gt;Design&lt;/li&gt;&lt;li&gt;Computational Engineering&lt;/li&gt;&lt;li&gt;Adaptive System Infrastructure&lt;/li&gt;&lt;li&gt;Adaptable and Predictable System Quality&lt;/li&gt;&lt;li&gt;Policy, Acquisition, and Management&lt;/li&gt;&lt;/ul&gt;This means exploring for use in ultra-large scale systems such things as potential mechanisms for user interfaces, genetic algorithms/programming, new patterns in systems design, behavioral simulations of systems components in varying compositions, decentralized infrastructure, ultra-high availability, and integration with countless third-party support systems. Just to name a very bare minimum.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Intersection&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Of those research areas, lessons learned from SOA can be applied to ULS systems research most predominantly in the following areas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Human Interaction&lt;/li&gt;&lt;li&gt;Design&lt;/li&gt;&lt;li&gt;Adaptive System Infrastructure&lt;/li&gt;&lt;li&gt;Adaptable and Predictable System Quality&lt;/li&gt;&lt;/ul&gt;In Part 2, it is with an eye towards these that I will comment on Nicolai Josuttis' excellent work.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElectricDuncan/~4/375409631" height="1" width="1"/&gt;</description>
    </item>
    <item>
      <pubDate>Sun, 24 Aug 2008 03:03:24 GMT</pubDate>
      <title>MySQL, Storm, and Relationships</title>
      <link>http://www.advogato.org/person/oubiwann/diary.html?start=207</link>
      <guid>http://feeds.feedburner.com/~r/ElectricDuncan/~3/373137795/mysql-storm-and-relationships.html</guid>
      <description>&lt;div&gt;&lt;br /&gt;I rarely work seriously with databases, but I've been building an API for a contract with &lt;a href="http://www.pbs.org/" &gt;PBS.org&lt;/a&gt;, and though we have DBAs tasked for the project, everyone's pretty busy. So I dusted off my decade-old DB (formerly known as) skills, and did the work myself.&lt;br /&gt;&lt;br /&gt;I've worked with the &lt;a href="https://storm.canonical.com/" &gt;Storm ORM&lt;/a&gt; a fair amount since it was released, but only on small projects. Any time I've needed to use relationships with Storm, I've been using SQLite and so it was all faked. Due to the impact of the PBS gig (which is almost done now!), I really needed to sit down and map everything out. The first thing I needed to do was get a quick refresher on MySQL's dialect with regard to foreign keys. The next thing I needed to clarify was exactly how to ensure that what I've been doing with Storm relationships in SQLite was valid for MySQL and suitable for production use at PBS. It was :-)&lt;br /&gt;&lt;br /&gt;Given how infrequently I use this stuff, I thought that my notes would be good to document, for future quick-reference. Given that there are likely users out there who would also benefit from this, a blog post seemed a nice way to do this :-)&lt;br /&gt;&lt;br /&gt;The SQL below is modified from an &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html" &gt;example in the MySQL documentation&lt;/a&gt;, slightly tweaked to be a smidge more interesting. The two &lt;span style="font-family: courier new;"&gt;CREATE TABLE&lt;/span&gt; statements define the schemas for a one-to-many table relationship:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CREATE TABLE parent (&lt;br /&gt;    id INT NOT NULL AUTO_INCREMENT,&lt;br /&gt;    name VARCHAR(50),&lt;br /&gt;    PRIMARY KEY (id)&lt;br /&gt;    ) ENGINE=INNODB;&lt;br /&gt;&lt;br /&gt;CREATE TABLE child (&lt;br /&gt;    id INT NOT NULL AUTO_INCREMENT,&lt;br /&gt;    parent_id INT,&lt;br /&gt;    name VARCHAR(50),&lt;br /&gt;    PRIMARY KEY (id),&lt;br /&gt;    INDEX par_ind (parent_id),&lt;br /&gt;    FOREIGN KEY (parent_id) REFERENCES parent(id)&lt;br /&gt;    ) ENGINE=INNODB;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next, to be able to play with this in Storm, we need to define some classes and set up some references:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Parent(Storm):&lt;br /&gt;    __storm_table__ = 'parent'&lt;br /&gt;    id = Int(primary=True)&lt;br /&gt;    name = Unicode()&lt;br /&gt;&lt;br /&gt;class Child(Storm):&lt;br /&gt;    __storm_table__ = 'child'&lt;br /&gt;    id = Int(primary=True)&lt;br /&gt;    name = Unicode()&lt;br /&gt;    parent_id = Int()&lt;br /&gt;    parent = Reference(parent_id, Parent.id)&lt;br /&gt;&lt;br /&gt;Parent.children = ReferenceSet(Parent.id, Child.parent_id)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-family: courier new;"&gt;parent&lt;/span&gt; attribute on the &lt;span style="font-family: courier new;"&gt;Child&lt;/span&gt; class is a Storm reference to whatever parent object is associated with the child object that gets created; the &lt;span style="font-family: courier new;"&gt;parent_id&lt;/span&gt; attribute is what is actually mapped to the MySQL field &lt;span style="font-family: courier new;"&gt;parent_id&lt;/span&gt; (which, in turn, MySQL references to the &lt;span style="font-family: courier new;"&gt;parent&lt;/span&gt; table). I hope I just didn't make that more of a confusing mess than it needed to be :-)&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-family: courier new;"&gt;children&lt;/span&gt; attribute that gets added to the &lt;span style="font-family: courier new;"&gt;Parent&lt;/span&gt; class is a reference to all &lt;span style="font-family: courier new;"&gt;Child&lt;/span&gt; instances that are associated with a particular &lt;span style="font-family: courier new;"&gt;Parent&lt;/span&gt; instance. I've got some usage below, if that's not clear.&lt;br /&gt;&lt;br /&gt;Let's create a parent:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; from storm.locals import *&lt;br /&gt;&gt;&gt;&gt; p1 = Parent()&lt;br /&gt;&gt;&gt;&gt; p1.name = u'parent 1'&lt;br /&gt;&gt;&gt;&gt; store.add(p1)&lt;br /&gt;&gt;&gt;&gt; store.flush()&lt;br /&gt;&gt;&gt;&gt; print p1.id&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note that if you add an &lt;span style="font-family: courier new;"&gt;__init__&lt;/span&gt; method to your &lt;span style="font-family: courier new;"&gt;Storm&lt;/span&gt; classes, you can save a step or two of typing in these usage examples (see the &lt;a href="https://storm.canonical.com/Tutorial" &gt;Storm tutorial&lt;/a&gt; for more information).&lt;br /&gt;&lt;br /&gt;Next, we'll create and associate a child:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; child1 = Child()&lt;br /&gt;&gt;&gt;&gt; child1.name = u'child 1'&lt;br /&gt;&gt;&gt;&gt; store.add(child1)&lt;br /&gt;&gt;&gt;&gt; child1.parent = p1&lt;br /&gt;&gt;&gt;&gt; store.flush()&lt;br /&gt;&gt;&gt;&gt; print child1.id&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There's more than one way to do this, though, given the way in which Storm has encoded relationships. Above, we created the child and then set the child's parent attribute. Below, we create the child and then use the &lt;span style="font-family: courier new;"&gt;chilren&lt;/span&gt;'s &lt;span style="font-family: courier new;"&gt;add&lt;/span&gt; method to associate it with a parent:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; child2 = Child()&lt;br /&gt;&gt;&gt;&gt; child2.name = u'child 2'&lt;br /&gt;&gt;&gt;&gt; store.add(child2)&lt;br /&gt;&gt;&gt;&gt; p1.children.add(child2)&lt;br /&gt;&gt;&gt;&gt; store.flush()&lt;br /&gt;&gt;&gt;&gt; print child2.id&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We're doing all that &lt;span style="font-family: courier new;"&gt;flush&lt;/span&gt;ing so that the created objects refresh with their new &lt;span style="font-family: courier new;"&gt;id&lt;/span&gt;s.&lt;br /&gt;&lt;br /&gt;Lastly, let's take a look at what's we've just added to the database:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; store.commit()&lt;br /&gt;&gt;&gt;&gt; p1.children.count()&lt;br /&gt;2&lt;br /&gt;&gt;&gt;&gt; for ch in p1.children:&lt;br /&gt;...     print "id: %s, name: %s" % (ch.id, ch.name)&lt;br /&gt;...&lt;br /&gt;id: 1, name: child 1&lt;br /&gt;id: 2, name: child 2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And that should just about do it :-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElectricDuncan/~4/373137795" height="1" width="1"/&gt;</description>
    </item>
    <item>
      <pubDate>Sun, 24 Aug 2008 02:05:20 GMT</pubDate>
      <title>Summer Days</title>
      <link>http://www.advogato.org/person/oubiwann/diary.html?start=206</link>
      <guid>http://feeds.feedburner.com/~r/ElectricDuncan/~3/373121336/summer-days.html</guid>
      <description>&lt;div&gt;&lt;br /&gt;This August was just incredible, like a Summer out of childhood. First, there was the week-long retreat up in the Colorado mountains. What can I say about that? It was beyond words... from the wildlife to bathing in an icy mountain cascade; from waking at 5:30am to running through a rainstorm; from the peaceful silence to the hilarity of jokes shared with friends.&lt;br /&gt;&lt;br /&gt;Next up was a visit from a Tibetan friend of mine and his wife: they drove out to Nebraska to do some relaxing and horseback riding. When we were out riding, Anyen Rinpoche said that the grasslands and the sandhills reminded him of Amdo, Tibet... he felt like he was back home. He regaled us with stories of horse racing, riding competitions, and childhood capers... and then he and I raced around on horseback like a couple of teenage yak herders. We also managed to make it to a private swimming hole on the Niobrara: as soon as I saw it, I took off running, ripping off my shirt while I ran and laughed, and jumped into the river, cooling the very hot Nebraska sun; I felt like a kid again :-)&lt;br /&gt;&lt;br /&gt;This week, my girlfriend's dad was in town. He, Marjorie, her daughter, her youngest son and I went kayaking for two hours down the Niobrara. It was my first time kayaking (though I grew up  canoeing in Maine), and I was thrilled. That's the best upper-body workout I've had in years... and I want to do it again!&lt;br /&gt;&lt;br /&gt;All in all, I couldn't have asked for a better break :-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElectricDuncan/~4/373121336" height="1" width="1"/&gt;</description>
    </item>
    <item>
      <pubDate>Thu, 31 Jul 2008 22:06:50 GMT</pubDate>
      <title>New ULS Systems Blog</title>
      <link>http://www.advogato.org/person/oubiwann/diary.html?start=205</link>
      <guid>http://feeds.feedburner.com/~r/ElectricDuncan/~3/351889836/new-uls-blog.html</guid>
      <description>&lt;div&gt;&lt;br /&gt;I'm currently drafting two new ultra large-scale systems blog posts, with one in particular being almost ready to go. While writing more on one of them today, a very cool thing happened: I received an email from the ULS systems team at the Software Engineering Institute of Carnegie Mellon University letting me know that they've got a new ULS blog site up. You can check it out here:&lt;br /&gt;&lt;br /&gt;    &lt;a href="http://ulsblog.wordpress.com/" &gt;http://ulsblog.wordpress.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Be sure to read all the articles and go back often! As you can imagine, I'll be spending a lot of time there :-) I have a feeling this is the beginning of an emerging ULS community...&lt;br /&gt;&lt;br /&gt;As for my forthcoming ULS systems blog posts, one concerns SOA and the other discusses currently extant code bases in the Python and Twisted Python communities that can be used for building ultra large-scale systems (or prototypes thereof) quickly and efficiently.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElectricDuncan/~4/351889836" height="1" width="1"/&gt;</description>
    </item>
    <item>
      <pubDate>Tue, 29 Jul 2008 22:03:46 GMT</pubDate>
      <title>New Directions</title>
      <link>http://www.advogato.org/person/oubiwann/diary.html?start=204</link>
      <guid>http://feeds.feedburner.com/~r/ElectricDuncan/~3/349829386/new-directions.html</guid>
      <description>&lt;div&gt;&lt;br /&gt;Yesterday I submitted my resignation as COO to the Divmod officers, and today I forwarded it to the rest of the team. Divmod is headed in a new and wonderful direction, and I'm happy to have contributed to raising public awareness about our team, community, and the tech we use, thus increasing its value in the market. I am taking this opportunity to rest and then pursue interests of my own.&lt;br /&gt;&lt;br /&gt;Even more than that contribution, I'm delighted to have worked with these guys for the past year. I've long been a supporter and fan of Divmod (since shortly after its inception, in fact). I was a community contributor before I was an employee and I will remain so for the foreseeable future. But I gotta say, that team in incomparable. The combination of technical excellence, creativity, pragmatic problem solving, quality engineering, humor and insight has made my time there a rich experience. They have made my time at Divmod one for the personal record books.&lt;br /&gt;&lt;br /&gt;I'm ready for a break, though; the past year has been a long, hard pull...&lt;br /&gt;&lt;br /&gt;I was originally courted by them for management, due to my community work. I deferred, and worked as a coder instead. This ended up being invaluable, as far as the insight it provided. After some early successes with a product release, I was offered the position of CEO, but deferred there too, with the mutual agreement that COO might be a better match for my skills. After a couple months as COO, I was put in charge of managing the direction of the company and raising funds, so I ended up being acting CEO anyway. I poured my heart and soul into Divmod, and it looks like that has payed off: the team is happy and they're headed for some good success. What's more, that leaves me in the enviable position of finally being able to surrender a massive workload :-)&lt;br /&gt;&lt;br /&gt;For the next week or two, I'll be camping in the Rocky Mountains catching up on some rest and enjoying nature at her best :-) I've also got some fun sci-fi reading to catch up on (Stross and MacLeod).&lt;br /&gt;&lt;br /&gt;When I get back, I'll be exploring 6-12 month consulting contracts... so if anyone hears anything interesting, do let me know!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElectricDuncan/~4/349829386" height="1" width="1"/&gt;</description>
    </item>
    <item>
      <pubDate>Thu, 24 Jul 2008 05:07:51 GMT</pubDate>
      <title>In Memoria: The Great Work</title>
      <link>http://www.advogato.org/person/oubiwann/diary.html?start=203</link>
      <guid>http://feeds.feedburner.com/~r/ElectricDuncan/~3/344239812/in-memoria-great-work.html</guid>
      <description>&lt;div&gt;&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3260/2697026451_c855e2a517_o.jpg" align="left" /&gt;The OSCON Tuesday Night Extravaganza was just fabulous: awards, laughter, brain-bending, and affirmation. The primary speakers were Mark Shuttleworth, r0ml, and Damian Conway; but I'm going to be focusing on r0ml's talk right now :-) Well, in part, anyway.&lt;br /&gt;&lt;br /&gt;Let's back up to Monday night, first: Alex Martelli and I had a chance to wax philosophical about programming and software. It was wonderful. Both because it revealed Alex's code-spirit and because of the sympatico I felt as his passionate idealism resonated with mine. While Alex talked of the holy architecture of mosques and cathedrals, of the contributions that such artisans as stonecutters, masons, sculptors, and calligraphers made, he emphasized how each individual played an essential role in bringing these wondrous works into being, that each act was an offering to the ideals that formed the basis of the respective belief system.&lt;br /&gt;&lt;br /&gt;What's more, though, Alex extended the analogy from religion to mysticism, saying that even more than builders of such great structures, coders are alchemists engaged in the magum opus. We are the transmutators. In our crucibles, the opposites of function and beauty unite; performance and elegance are commingled to produce the perfection of our art. Alex was careful to point out that he intended perfection in both an abstract and practical sense. On one hand, being able to create and actually deliver code that others found useful, regardless of the sex appeal (or lack thereof), can be viewed as a form of perfection. It is accomplishment; attainment of the goal. On the other hand, it's just something that someone wanted us to write; it's not a proof of Fermat's Last Theorem. It's useful; it serves a specific function.&lt;br /&gt;&lt;br /&gt;Before I get to r0ml's talk, I want to mention &lt;a href="http://divmod.org/trac/wiki/UltimateQualityDevelopmentSystem" &gt;UQDS&lt;/a&gt; as employed by the &lt;a href="http://twistedmatrix.com/trac/wiki/TwistedDevelopment" &gt;Twisted and Divmod&lt;/a&gt; communities. I think it's phenomenal and I enjoy working with that system. It's a well thought-out and proven process that tends to produce code of an extremely high quality. However, it's not my natural tendency. I like quick and dirty prototypes; a little messy code goes a long way. I like to throw something out there and then fix it up and apply polish incrementally, as dictated by need.&lt;br /&gt;&lt;br /&gt;This is why I've been enjoying the &lt;a href="https://launchpad.net/tx" &gt;Twisted Community Code&lt;/a&gt; project/group on Launchpad. Not only do you have the benefits of using a tool like bazaar that lets one branch other projects on a whim, but you've got a community space to put these explorations, where others can easily see what you're doing, check it out, and try something of their own. (There's a whole 'nother blog post I have coming about that.) However, this finally brings me to r0ml's talk: a new spin on the development process.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/damianspain/2710101794/" &gt;&lt;img src="http://farm3.static.flickr.com/2067/2710101794_0b9ced0b81_m.jpg" align="right"/&gt;&lt;/a&gt;For those of you that have seen his phenomenal rhetoric talks, you'd be delighted to see what he did :-) He established a nice mapping from both Microsoft's development process as well as the one defined by Rational.  He used the five canons of classical rhetoric: inventio, dispositio, elocutio, memoria, and pronuntiatio. However, the really brilliant thing was where he started the process: smack in the middle, right where I like to do it :-) And he justified this beautifully. His mapping was the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Memoria = Commit / Update&lt;/li&gt;&lt;li&gt;Pronuntiatio = Run / Use&lt;/li&gt;&lt;li&gt;Inventio = Bug Reporting / Patch Submission&lt;/li&gt;&lt;li&gt;Dispositio = Triage&lt;/li&gt;&lt;li&gt;Elocutio = Integration&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/bkjones/2694431607/" &gt;&lt;img src="http://farm4.static.flickr.com/3260/2714464821_a5defb8f8d_o.jpg" align="left"/&gt;&lt;/a&gt;The idea here being this: get what you've got done out there and in front of people's eyes. Everyone knows its crap; don't worry about it. Get it running and get others running it. Work on what matters most and integrate the changes. Repeat and continue.&lt;br /&gt;&lt;br /&gt;I like to tease other Twisted devs that I tend not to do test-driven development, but bug-driven testing. What's interesting is that we both start with a requirements doc: for them, it's a development plan; for me, it's a bug/TODO list. The difference is that they then engage in Inventio whereas I start with Memoria. As r0ml said, with this model there is no development, there is only maintenance.&lt;br /&gt;&lt;br /&gt;One of the other great things that r0ml mentioned about this process is that it not only gets you the developer started more quickly, it gets others started at the same time. Each programmer is engaged in a macroscopic genetic programming effort: everyone takes the source, mutates it, evolves it, reviews it, and the best implementations (or parts thereof) survive to become the basis for the next generation. Everyone gets to write at the same time; no one is blocked.&lt;br /&gt;&lt;br /&gt;This development approach evokes images of philosophers from the Middle Ages sending letters to each other in cryptic alchemical symbols and diagrams, with all the implicit and explicit layers of meaning. I see this methodology as establishing the true foundation of the open source art: a gnostic, spirit-(of-open-souce)-ual transformation that brings us to improved states of mind and clarity.&lt;br /&gt;&lt;br /&gt;The perfection of our art, whether sublime or mundane, can be merged in the mind of the developer as one... this union being our philosopher's stone. With each release of software engaged in this manner, we iterate the Great Work.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElectricDuncan/~4/344239812" height="1" width="1"/&gt;</description>
    </item>
    <item>
      <pubDate>Wed, 16 Jul 2008 22:03:21 GMT</pubDate>
      <title>OSCON 2008</title>
      <link>http://www.advogato.org/person/oubiwann/diary.html?start=202</link>
      <guid>http://feeds.feedburner.com/~r/ElectricDuncan/~3/337412850/oscon-2008.html</guid>
      <description>&lt;div&gt;Hey all, thanks to a friend's amazingly generous offer, I'll be attending OSCON this year :-) I only have to pay for my airfare and food! I've contacted several people already who I know are going to be there (including &lt;a href="http://www.haynesandboone.com/people/bio.asp?empid=1508" &gt;Van Lindberg&lt;/a&gt; of &lt;a href="http://www.haynesandboone.com/" &gt;Haynes and Boone&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Bradley_M._Kuhn" &gt;Bradley Kuhn&lt;/a&gt; of the &lt;a href="http://conservancy.softwarefreedom.org/" &gt;SFC&lt;/a&gt; and the &lt;a href="http://www.softwarefreedom.org/" &gt;SFLC&lt;/a&gt;), and look forward to meeting up with others. Leave a comment or email me if you're going to be there!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElectricDuncan/~4/337412850" height="1" width="1"/&gt;</description>
    </item>
    <item>
      <pubDate>Sat, 5 Jul 2008 22:04:22 GMT</pubDate>
      <title>Native LoadBalancing for Twisted Apps</title>
      <link>http://www.advogato.org/person/oubiwann/diary.html?start=201</link>
      <guid>http://feeds.feedburner.com/~r/ElectricDuncan/~3/327632080/native-loadbalancing-for-twisted-apps.html</guid>
      <description>&lt;div&gt;Yesterday, right before midnight, I tagged the 1.1.0 release of txLoadBalancer on Launchpad after completing the last of the planned features. There are some pretty radical changes that have been developed for this release... and the coolest part  is this is just the beginning :-) (See the TODO if you don't believe me!)&lt;br /&gt;&lt;br /&gt;You can checkout from &lt;a href="https://code.launchpad.net/%7Eoubiwann/txloadbalancer/1.1.0" &gt;lp:~oubiwann/txloadbalancer/1.1.0&lt;/a&gt; or download from &lt;a href="http://pypi.python.org/pypi/txLoadBalancer/" &gt;PyPI&lt;/a&gt;. If you're a PyPI expert, I've got some questions for you at the end of this post... Been having some sucky experiences with PyPI lately :-(&lt;br /&gt;&lt;br /&gt;So here's what's going on with txLoadBalancer:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Improved API&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The biggest thing you'll notice if you've switching from PythonDirector is the massive overhaul the API has undergone. Things are cleaner and generally more modern, with a concise and well-defined module layout.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;New Load Balancing Algorithm&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've added support for a weighted host scheduler. Given a weight that represents the frequency a host should be used, a host will be randomly selected, based on it's weight. For example, with two hosts, one having a weight of 1 and the other having a weight of 3, host 2 will be chosen about 75% of the time and host 1 will get about 25% of the requests.&lt;br /&gt;&lt;br /&gt;Right now, this algorithm has to make several calls to other parts of the code in order to get all the data it needs (it also builds some crazy iterators). As such, it's rather slow and performs poorly when compared to the very light-weight least-connections algorithm. That being said, the next release will include optimizations for the weighted scheduler that make use of a Twisted timer and caching.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Native Twisted Load-Balancing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here's the sexiest part: you can now load-balance your Twisted application by using the txLB API; you don't even need to run the load-balancer as a separate app! This evolved as a feature after a conversation with an as-yet unnamed cloud hosting provider, a follow-up discussion with the &lt;a href="http://about.divmod.com/team.html" &gt;Divmod team&lt;/a&gt;, and then some quiet  pondering about ways in which Twisted applications could be supported in cloud/grid/massively-multi-core architectures.&lt;br /&gt;&lt;br /&gt;The "self load-balancing" API in txLB is not a comlete solution for grid-hosting, but it is a first step in one direction (we've been discussing lots of others, too, including the use of our deployment tool).&lt;br /&gt;&lt;br /&gt;Before I show you how to use the self load-balancing API, let's take a quick look at a normal Twisted application service:&lt;br /&gt;&lt;pre&gt;from twisted.web import static, server&lt;br /&gt;from twisted.application import service, internet&lt;br /&gt;&lt;br /&gt;application = service.Application("Demo Web Server")&lt;br /&gt;web = server.Site('/home/oubiwann/public_html')&lt;br /&gt;service = internet.TCPServer(7001, web)&lt;br /&gt;service.setServiceParent(application)&lt;br /&gt;&lt;/pre&gt;You start that with the command &lt;span style="font-family:courier new;"&gt;twistd -noy myweb.tac&lt;/span&gt;. For use with the next example, you can also start two more, one on port 7002 and the other on port 7003.&lt;br /&gt;&lt;br /&gt;Now here's what you do to make a self load-balanced app:&lt;br /&gt;&lt;pre&gt;from twisted.application import service&lt;br /&gt;&lt;br /&gt;from txlb import manager&lt;br /&gt;from txlb.model import HostMapper&lt;br /&gt;from txlb.schedulers import leastc&lt;br /&gt;from txlb.application.service import LoadBalancedService&lt;br /&gt;&lt;br /&gt;proxyServices = [&lt;br /&gt;  HostMapper(proxy='127.0.0.1:8080', lbType=leastc, host='host1',&lt;br /&gt;      address='127.0.0.1:7001'),&lt;br /&gt;  HostMapper(proxy='127.0.0.1:8080', lbType=leastc, host='host2',&lt;br /&gt;      address='127.0.0.1:7002'),&lt;br /&gt;  HostMapper(proxy='127.0.0.1:8080', lbType=leastc, host='host3',&lt;br /&gt;      address='127.0.0.1:7003'),&lt;br /&gt;]&lt;br /&gt;&lt;br /&gt;application = service.Application('Demo LB Service')&lt;br /&gt;pm = manager.proxyManagerFactory(proxyServices)&lt;br /&gt;lbs = LoadBalancedService(pm)&lt;br /&gt;lbs.setServiceParent(application)&lt;br /&gt;&lt;/pre&gt;As you would expect, you need to indicate the proxy host:port, the algorithm to use, and the hosts that are to be balanced. The host setup assumes that you have three services running on localhost ports 7001, 7002, and 7003. All that's needed now is to just run that code with the usual &lt;span style="font-family:courier new;"&gt;twistd -noy myapp.tac&lt;/span&gt;.  Also, for demonstration purposes, this is a somewhat simplified example of what is possible.&lt;br /&gt;&lt;br /&gt;This may seem like a lot of extra work when compared to the simple web host above, but think about it: we're &lt;span style="font-style: italic;"&gt;load-balancing&lt;/span&gt; here :-) This saves you from having to manage yet another application. With a few extra lines of code, you can keep it all in one place and have it manage itself.&lt;br /&gt;&lt;br /&gt;Note that this API is in development and continuing to improve. The example above is from code running in trunk. For the more verbose configuration that is in the 1.1.0 release, be sure to see &lt;span style="font-family:courier new;"&gt;./bin/txlbWeb.tac&lt;/span&gt; from the source tarball. To play with the latest and greatest, you'll want to checkout the code here: &lt;a href="https://code.launchpad.net/%7Eoubiwann/txloadbalancer/main" &gt;lp:txloadbalancer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Other Goodies&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here is some other good stuff in the release:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You can now ssh into a txLB instance and mainipulate the load-balancer in real time from an interactive Python interpreter.&lt;/li&gt;&lt;li&gt;You can change the proxy to listen on a different port while the application is running (no restart requred!).&lt;/li&gt;&lt;li&gt;Changes made to the configuration while running are no longer volatile; they are saved to disk (and your old config gets backed up).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Work from Apple, Inc. was included in this release, too (they use the old PythonDirector in their Calendaring server). This includes a bug fix and management socket feature.&lt;/li&gt;&lt;li&gt;There is a significant jump in performance between this release and the previous one. I believe this to be due to the separation of concerns in the API, but haven't yet confirmed that.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Coming Work&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are a lot of &lt;span style="font-style: italic;"&gt;exciting&lt;/span&gt; features coming for txLB. Just to name a few:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;improved weighted algorithm&lt;/li&gt;&lt;li&gt;resources-based algorithm (a scheduler that determins the weight of a proxied host by memory, CPU, etc., utilization)&lt;/li&gt;&lt;li&gt;smarter proxied host failover and recovery&lt;/li&gt;&lt;li&gt;a heartbeat manager&lt;br /&gt;&lt;/li&gt;&lt;li&gt;txLB-powered application cloning (when started, an app will determine if it needs to run the clone as the managing load-balancer or simply as a proxied host)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;auto-discovery of balanced hosts&lt;/li&gt;&lt;li&gt;proxy fail-over (a balanced host taking over as manager in the event that the manager goes down)&lt;/li&gt;&lt;li&gt;ApacheMQ/Stomp integration&lt;/li&gt;&lt;li&gt;LDAP/RADIUS authentication&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Additionally, I'll be putting together some basic performance metrics contrasting Apache and load-balanced Twisted apps. I will also be comparing previous versions of txLB/PythonDirector with the latest release(s).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problems with PyPI&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I will close this post on a sad note: PyPI used to be an amazing experience for me (a couple years ago, when it was still being called "cheeseshop"). Everything worked as it was supposed to. This hasn't been the case when I've used it recently (over the past few months).&lt;br /&gt;&lt;br /&gt;For all that I say about PyPI, I allow for the fact that I may just be missing something, and it may be entirely my fault. That being said, I spent about 3 hours online last night combing though the SIG mail list, the bug list on sourceforge, and blog posts about setuptools and PyPI, and could find no answers to my questions. Well, with the possible exception of a bug report, but it doesn't look like it was confirmed by a PyPI team member, so I'm not sure if it's valid or not.&lt;br /&gt;&lt;br /&gt;Here are my issues:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;When I upload my project using &lt;span style="font-family:courier new;"&gt;python setup.py [sdist|bdist_egg] upload&lt;/span&gt;, no metadata defined in my &lt;span style="font-family:courier new;"&gt;setup()&lt;/span&gt; function is presented on my package's PyPI page. When I click the metadata link, it's only got three sparse lines.&lt;/li&gt;&lt;li&gt;When I manually upload from the package's PKG-INFO itself, all the metadata is presented on the page as it should be, with the exception of the long description. It is in plain text instead of ReST (I am checking that it is valid ReST using distutils settings of &lt;span style="font-family:courier new;"&gt;reporter.halt_level = 5&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;reporter.report_level = 1&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;settings.pep_references = False&lt;/span&gt;, and &lt;span style="font-family:courier new;"&gt;settings.trim_footnote_reference_space = None&lt;/span&gt;; these are the same settings that Zope Corp uses to verify the ReST that it uploads to PyPI).&lt;/li&gt;&lt;li&gt;When I manually edit the long description in the form, I get the same thing: plain text, no ReST.&lt;/li&gt;&lt;li&gt;When I upload a package that is displayed properly on PyPI (such as &lt;a href="http://pypi.python.org/pypi/zc.twist" &gt;zc.twist&lt;/a&gt;; uploaded as one of my projects by chaning the name), I get the same problem (this is why I think it might be something that &lt;span style="font-style: italic;"&gt;I'm&lt;/span&gt; doing wrong...): no metadata, and when I upload the PKG-INFO manually, no ReST.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Why, oh why, cruel fates, does this not work any more?  I used to be able to upload to PyPI without any of these issues...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElectricDuncan/~4/327632080" height="1" width="1"/&gt;</description>
    </item>
  </channel>
</rss>
