<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>Oakwinter.com :: Code</title>
	<link>http://oakwinter.com/code</link>
	<description></description>
	<pubDate>Mon, 23 Jul 2007 16:55:13 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2</generator>
	<language>en</language>
			<item>
		<title>Porting setuptools to py3k</title>
		<link>http://oakwinter.com/code/porting-setuptools-to-py3k/</link>
		<comments>http://oakwinter.com/code/porting-setuptools-to-py3k/#comments</comments>
		<pubDate>Mon, 23 Jul 2007 16:55:13 +0000</pubDate>
		<dc:creator>Collin</dc:creator>
		
		<category><![CDATA[python 3000]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://oakwinter.com/code/porting-setuptools-to-py3k/</guid>
		<description><![CDATA[I recently spent some time porting setuptools to the py3k-struni branch as a means of testing both 2to3 specifically and the porting process generally. What follows are the notes from the experience. Two things to keep in mind: first, the struni branch, though slated to become the &#8220;official&#8221; Python 3000 branch, is still very much [...]]]></description>
			<content:encoded><![CDATA[<p>I recently spent some time porting <a href="http://peak.telecommunity.com/DevCenter/setuptools">setuptools</a> to <a href="http://svn.python.org/view/python/branches/py3k-struni/">the py3k-struni branch</a> as a means of testing both <a href="http://svn.python.org/view/sandbox/trunk/2to3/">2to3</a> specifically and the porting process generally. What follows are the notes from the experience. Two things to keep in mind: first, the <code>struni</code> branch, though slated to become the &#8220;official&#8221; Python 3000 branch, is still very much in flux and currently has 30+ failing tests; needless to say, it&#8217;s not an ideal porting target. Secondly, I was attempting this without Python 2.6&#8217;s forward compatibility mode, which is still mostly unwritten. As both of these situations change, I&#8217;ll keep trying to port more code to test the general readiness of the 2.x -> 3.x migration strategy.</p>
<p><strong>Things to do in your Python 2 code:</strong></p>
<ul>
<li>
<p><strong>Don&#8217;t</strong> write code like this:</p>
<pre class="code">class install(_install):
  new_commands = [
    ('install_egg_info', lambda self: True),
    ('install_scripts',  lambda self: True),
  ]
  _nc = dict(new_commands)
  sub_commands = [
    cmd for cmd in _install.sub_commands if cmd[0] not in _nc
  ] + new_commands</pre>
<p>That won&#8217;t work in Python 3000 because of changes to list comprehensions and class definitions. Move the <code>new_commands</code> and <code>_nc</code> declarations out of the class body.</p>
</li>
<li>
<p><strong>Don&#8217;t</strong> rely on implicit relative imports. In Python 3000, all imports will be absolute by default; you should write one of </p>
<pre class="code">from setuptools.dist import _get_unpatched
# or
from .dist import _get_unpatched</pre>
<p>instead of</p>
<pre class="code">from dist import _get_unpatched</pre>
</li>
</ul>
<p><strong>Stuff that needs to be easier:</strong></p>
<ul>
<li>
<p>The fact that <code>__cmp__</code> methods are going away sucks, plain and simple. This required me to manually implement four additional comparison methods for every class that had previously relied on <code>__cmp__</code>. I hope their removal will be rethought and retracted.</p>
</li>
<li>
<p>The <code>struni</code> branch currently has three different string-ish types: <a href="http://www.python.org/dev/peps/pep-0358/">bytes</a>, <code>str</code> (previously unicode) and <code>str8</code>. Guido has said that <code>str8</code> will eventually go away, but its presence in unexpected places (like modules&#8217; <code>__file__</code> attributes) made for some needlessly frustrating debugging. Ignoring <code>str8</code>, the new <code>bytes</code> types is going to be a serious obstacle for anyone wanting to move their codebase to Python 3. Take the following two lines:</p>
<pre class="code">data = open(some_file).read() # read in text mode
# and
data = open(some_file, "rb").read() # read in binary mode</pre>
<p>The first returns a <code>str</code>, the second a <code>bytes</code> object; these two types have incompatible APIs, and the current state of the <code>struni</code> branch makes it impossible to write code that operates on both. For example, the signatures of the types&#8217; <code>split()</code> methods are different, and the <code>bytes</code> type lacks a <code>splitlines()</code> method. These aren&#8217;t hypothetical differences: I&#8217;ve run into both problems while trying to fix several of the tests in the standard library.</p>
</li>
<li>
<p>On the subject of <code>bytes</code>, I ran into two additional <code>bytes</code>/<code>str</code> incompatibilities when porting <span class="module-name">setuptools</span>. First, when you iterate over <code>str</code> instances, you get single-character <code>str</code>s back; when you iterate over <code>bytes</code> instances, you get integers. Combine this with code that switches based on type, and you end up banging your head against the table when your code starts kicking out errors, complaining that Python can&#8217;t iterate over the number 91. Secondly, I am absolutely sick of seeing &#8220;cannot concatenate str and bytes types&#8221; errors; my general tactic is to start throwing <code>str()</code> calls around until the error goes away, but that kind of shotgun debugging hurts my soul.</p>
</li>
</ul>
<p>This needs to be easier. I hope Guido will release any notes he&#8217;s been taking while porting the standard library to use the new <code>bytes</code> and <code>str</code> types.</p>
<p>On the plus side, <span class="module-name">setuptools</span> helped turn up a few bugs in <span class="module-name">2to3</span>, as well as some places where the translation could have been improved (and has been). I intend to repeat this experiment once the <code>struni</code> branch settles down and once 2.6&#8217;s py3k-compat mode works.</p>
]]></content:encoded>
			<wfw:commentRss>http://oakwinter.com/code/porting-setuptools-to-py3k/feed/</wfw:commentRss>
		</item>
		<item>
		<title>context_tools 0.2 released</title>
		<link>http://oakwinter.com/code/context_tools-02-released/</link>
		<comments>http://oakwinter.com/code/context_tools-02-released/#comments</comments>
		<pubDate>Mon, 09 Jul 2007 12:30:44 +0000</pubDate>
		<dc:creator>Collin</dc:creator>
		
		<category><![CDATA[context_tools]]></category>

		<category><![CDATA[releases]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://oakwinter.com/code/context_tools-02-released/</guid>
		<description><![CDATA[New new new new: context_tools 0.2. Shiny stuff in this release:


Support for Python 2.4. context_tools now supports Python 2.4, 2.5 and 3.0.


test_with() now supports multiple context managers (by request).


Bug fix: yield_with() now plays better with other decorators.


Download the latest release.
]]></description>
			<content:encoded><![CDATA[<p>New new new new: <a href="http://oakwinter.com/code/context_tools/">context_tools 0.2</a>. Shiny stuff in this release:</p>
<ul>
<li>
<p>Support for Python 2.4. <span class="module-name">context_tools</span> now supports Python 2.4, 2.5 and 3.0.</p>
</li>
<li>
<p><a href="http://oakwinter.com/code/context_tools/documentation/index.html#test_with">test_with()</a> now supports multiple context managers (by request).</p>
</li>
<li>
<p>Bug fix: <a href="http://oakwinter.com/code/context_tools/documentation/index.html#yield_with">yield_with()</a> now plays better with other decorators.</p>
</li>
</ul>
<p><a href="http://oakwinter.com/code/context_tools/download.html">Download the latest release</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://oakwinter.com/code/context_tools-02-released/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Introducing context_tools</title>
		<link>http://oakwinter.com/code/introducing-context_tools/</link>
		<comments>http://oakwinter.com/code/introducing-context_tools/#comments</comments>
		<pubDate>Mon, 25 Jun 2007 16:00:35 +0000</pubDate>
		<dc:creator>Collin</dc:creator>
		
		<category><![CDATA[context_tools]]></category>

		<category><![CDATA[releases]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://oakwinter.com/code/introducing-context_tools/</guid>
		<description><![CDATA[Just pushed out to PyPI&#8230;
The contextlib module that ships with Python 2.5 and newer is pretty neat; for example, it includes a tool to transform a generator into a context manager. Not a bad trick, but not enough.
context_tools aims to pick up where contextlib leaves off. It includes tools for turning context managers into setUp() [...]]]></description>
			<content:encoded><![CDATA[<p>Just pushed out to <a href="http://cheeseshop.python.org/pypi/context_tools/">PyPI</a>&#8230;</p>
<p><a href="http://docs.python.org/lib/module-contextlib.html">The <span class="module-name">contextlib</span> module</a> that ships with <a href="http://python.org/download/">Python 2.5 and newer</a> is pretty neat; for example, it includes a tool to transform a generator into <a href="http://www.python.org/dev/peps/pep-0343/">a context manager</a>. Not a bad trick, but not enough.</p>
<p><span class="module-name">context_tools</span> aims to pick up where <span class="module-name">contextlib</span> leaves off. It includes tools for turning context managers into <code>setUp()</code> and <code>tearDown()</code> methods for <a href="http://docs.python.org/lib/module-unittest.html">unittest</a>- and <a href="http://oakwinter.com/code/test_harness/">test_harness</a>-based tests and into decorators for functions and generators.</p>
<p>Interested? Grab <a href="http://oakwinter.com/code/context_tools/download.html">the latest version</a>. Both source and eggs for Python 2.5 are available, and just as soon as PyPI adds support for Python 3, a tarball for that will go up as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://oakwinter.com/code/introducing-context_tools/feed/</wfw:commentRss>
		</item>
		<item>
		<title>One step closer&#8230;</title>
		<link>http://oakwinter.com/code/one-step-closer/</link>
		<comments>http://oakwinter.com/code/one-step-closer/#comments</comments>
		<pubDate>Sun, 24 Jun 2007 17:59:31 +0000</pubDate>
		<dc:creator>Collin</dc:creator>
		
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://oakwinter.com/code/one-step-closer/</guid>
		<description><![CDATA[&#8230;to driving your Google to the Google to pick up some more Google. Sony, eat your heart out.
]]></description>
			<content:encoded><![CDATA[<p>&#8230;to <a href="http://www.google.com/intl/en/press/pressrel/rechargeit_20070618.html">driving your Google</a> to the Google to <a href="http://googleblog.blogspot.com/2006/08/i-scream-for-google-ice-cream.html">pick up some more Google</a>. <a href="http://everything2.com/index.pl?node_id=767545">Sony, eat your heart out</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://oakwinter.com/code/one-step-closer/feed/</wfw:commentRss>
		</item>
		<item>
		<title>On Python 3000 whinging</title>
		<link>http://oakwinter.com/code/on-python-3000-whinging/</link>
		<comments>http://oakwinter.com/code/on-python-3000-whinging/#comments</comments>
		<pubDate>Fri, 22 Jun 2007 17:53:54 +0000</pubDate>
		<dc:creator>Collin</dc:creator>
		
		<category><![CDATA[python 3000]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://oakwinter.com/code/on-python-3000-whinging/</guid>
		<description><![CDATA[I&#8217;m getting pretty sick of seeing blog posts and mailing lists threads endlessly bemoaning that, &#8220;the core developers&#8230;are causing a huge risk to the Python community by splitting it asunder for a period of years&#8220;. Gloom, doom, pox and peril, blah blah blah.
The language has two choices: either continue to bear the burden of what [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m getting pretty sick of seeing blog posts and mailing lists threads endlessly bemoaning that, &#8220;<a href="http://faassen.n--tree.net/blog/view/weblog/2007/06/22/0">the core developers&#8230;are causing a huge risk to the Python community by splitting it asunder for a period of years</a>&#8220;. Gloom, doom, pox and peril, blah blah blah.</p>
<p>The language has two choices: either continue to bear the burden of what are now considered poor design decisions (e.g., four forms of <code>raise</code>, syntax ambiguities in <code>except</code> statements) or suck it up and let us try and fix some of these problems. It&#8217;s like going to the dentist: it may hurt, but if that minor toothache goes untreated and develops into an abscess, you will wish you were dead.</p>
<p>There are two parts to the transition plan: syntactic transition and semantic transition. For syntactic transition, Guido and I have sunk a lot of time into <a href="http://svn.python.org/view/sandbox/trunk/2to3/">2to3</a>, which will translate your Python 2.x code into 3.0&#8217;s freshly-polished syntax. When it comes to adjusting your code&#8217;s semantics, Python 2.6 will feature a Python 3000 compatibility mode, which when enabled will warn you when you do something that will need to be changed before moving to 3.0. Are these tools perfect? No; that&#8217;s the price you pay for using a language as flexible as Python. Are they pretty damn good? Yes. Combined, 2to3 and Python 2.6 will make the vast majority of 2.x -> 3.0 transitions as painless as we can make them. For that last little remnant, the code we simply cannot deal with, that&#8217;s what your test suites are for. I have absolutely no pity for anyone trying to migrate to Python 3 without a test suite; you&#8217;re doing something fundamentally stupid and we will not bend over backwards to save your dumb ass.</p>
<p>As for the observation that <a href="http://www.pugscode.org/">pugs, the Perl 6 compiler</a>, will be able to handle Perl 5 source as input and why oh why can&#8217;t Python do that, too: Perl 5-on-Perl 6 is a neat trick born in an intersection of necessity and opportunity. The necessity is there because Perl 6 is a fundamentally different language than Perl 5 (or at least it was the last time I looked; they may have changed their minds over the last week), and Perl&#8217;s DWIM mentality would make it prohibitively difficult to mechanically translate the old to the new. Also, the Perl 6 compiler can afford to have a Perl 5 runtime built in because there&#8217;s only one (serious) Perl 6 compiler, and so the developer and maintenance cost for this extra runtime is isolated within a single project.</p>
<p>Python simply can&#8217;t do that. There are four credible implementations of Python I know of (<a href="http://www.python.org">CPython</a>, <a href="http://www.jython.org/">Jython</a>, <a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython">IronPython</a>, <a href="http://codespeak.net/pypy/dist/pypy/doc/news.html">PyPy</a>), and we can&#8217;t ask each one of these efforts to please please won&#8217;t you embed a Python 2 runtime in your system? Not going to happen, ever. Given these circumstances, the best we can do is to have a syntax translator that will work across all implementations, and a semantics checker that&#8217;s spec-driven and as implementation-agnostic as possible.</p>
<p>If you think you can do better, show us the code. Talk is cheap.</p>
]]></content:encoded>
			<wfw:commentRss>http://oakwinter.com/code/on-python-3000-whinging/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Subclassing modules in Python</title>
		<link>http://oakwinter.com/code/subclassing-modules-in-python/</link>
		<comments>http://oakwinter.com/code/subclassing-modules-in-python/#comments</comments>
		<pubDate>Thu, 21 Jun 2007 16:03:55 +0000</pubDate>
		<dc:creator>Collin</dc:creator>
		
		<category><![CDATA[testing]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://oakwinter.com/code/subclassing-modules-in-python/</guid>
		<description><![CDATA[I know what you&#8217;re thinking: &#8220;what the hell? You can&#8217;t subclass modules!&#8221; Conventional wisdom == wrong.
import os

class MyOS(os):
    __metaclass__ = ModuleMeta

    def lstat(self, arg):
        return 6

    def rmdir(self, arg):
        raise self.error("No such [...]]]></description>
			<content:encoded><![CDATA[<p>I know what you&#8217;re thinking: &#8220;what the hell? You can&#8217;t subclass modules!&#8221; Conventional wisdom == wrong.</p>
<pre class="code">import os

class MyOS(os):
    __metaclass__ = ModuleMeta

    def lstat(self, arg):
        return 6

    def rmdir(self, arg):
        raise self.error("No such file or directory: %r" % arg)</pre>
<p>Notice that we&#8217;re apparently subclassing a module. The metaclass will allow us to override whichever of the module&#8217;s functions we desire, leaving the others intact.</p>
<pre class="code">class ModuleMeta(type):
    def __new__(cls, name, bases, d):
        d["__getattr__"] = lambda x, y: getattr(bases[0], y)
        return type.__new__(cls, name, (object,), d)</pre>
<p>This is the little beauty that makes the whole thing possible. Here, we stick a custom <code>__getattr__()</code> function into the class&#8217;s namespace, then replace the incoming <code>bases</code> tuple with our own. The <code>bases</code> we were passed will contain a module, and that will cause the runtime to complain if the module reaches <code>type.__new__()</code>.</p>
<p>Some client code:</p>
<pre class="code">os = MyOS()
print os.lstat("foo")
print os.times()
os.rmdir("foo")</pre>
<p>Our custom <code>os</code>-alike provides its own <code>rmdir()</code> and <code>lstat()</code> functions while using the <code>times()</code> function from the real <code>os</code> module. This works in Python 2.3, 2.4 and 2.5.</p>
<p>I see requests for this fairly regularly when people are wanting to stub out certain functions in a module for testing purposes. Of course, the easy way to do this isn&#8217;t to subclass the module at all: just create a class that does what you want.</p>
<pre class="code">class MyOS:
    def lstat(self, arg):
        return 6

    def rmdir(self, arg):
        raise self.error("No such file or directory: %r" % arg)

    def __getattr__(self, attr):
        return getattr(os, attr)</pre>
<p>No fuss, no muss, and it&#8217;s fully equivalent to the above magic metaclass incantations. I&#8217;ll talk more about this in a future post.</p>
]]></content:encoded>
			<wfw:commentRss>http://oakwinter.com/code/subclassing-modules-in-python/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Upcoming appearances</title>
		<link>http://oakwinter.com/code/upcoming-appearances/</link>
		<comments>http://oakwinter.com/code/upcoming-appearances/#comments</comments>
		<pubDate>Sat, 09 Jun 2007 20:55:04 +0000</pubDate>
		<dc:creator>Collin</dc:creator>
		
		<category><![CDATA[test_harness]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://oakwinter.com/code/upcoming-appearances/</guid>
		<description><![CDATA[If you&#8217;re in the Silicon Valley area, I&#8217;ll be speaking at the next BayPIGgies meeting about test_harness, my testing framework designed to (hopefully) replace unittest. The meeting is Thursday, 14 June at 7:30PM at Google. Check the BayPIGgies site for more details.
For those of a more European persuasion, I&#8217;ll be at EuroPython 2007 in Vilnius, [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re in the Silicon Valley area, I&#8217;ll be speaking at the next <a href="http://baypiggies.net/">BayPIGgies</a> meeting about <a href="http://oakwinter.com/code/category/python/test_harness/">test_harness</a>, my testing framework designed to (hopefully) replace <span class="module-name">unittest</span>. The meeting is Thursday, 14 June at 7:30PM at Google. Check the BayPIGgies site for more details.</p>
<p>For those of a more European persuasion, I&#8217;ll be at <a href="http://europython.org/">EuroPython 2007</a> in <a href="http://maps.google.com/maps?f=q&#038;hl=en&#038;q=Vilnius,+Lithuania&#038;ie=UTF8&#038;ll=54.72462,25.3125&#038;spn=37.60835,89.121094&#038;z=4&#038;iwloc=addr&#038;om=1">Vilnius, Lithuania</a>, giving much the same talk. Since the paper was accepted in the peer review track, I&#8217;ll have to science it up some, but the talk should stay pretty much the same. Except that it will be in Lithuanian.</p>
]]></content:encoded>
			<wfw:commentRss>http://oakwinter.com/code/upcoming-appearances/feed/</wfw:commentRss>
		</item>
		<item>
		<title>&#8220;Got a list of bullet points as to why Python is better?&#8221;</title>
		<link>http://oakwinter.com/code/got-a-list-of-bullet-points-as-to-why-python-is-better/</link>
		<comments>http://oakwinter.com/code/got-a-list-of-bullet-points-as-to-why-python-is-better/#comments</comments>
		<pubDate>Sat, 02 Jun 2007 22:17:41 +0000</pubDate>
		<dc:creator>Collin</dc:creator>
		
		<category><![CDATA[ruby]]></category>

		<category><![CDATA[advocacy]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[testing]]></category>

		<category><![CDATA[perl]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://oakwinter.com/code/got-a-list-of-bullet-points-as-to-why-python-is-better/</guid>
		<description><![CDATA[So Tyler says to me, he says:

I went to the Nashville PHP group last night. The conversation turned to which languages are on the rise, and I threw Python into the mix. Problem is, I had very little ammo to arm myself with. Got a list of bullet points as to why Python is better?

Well, [...]]]></description>
			<content:encoded><![CDATA[<p>So <a href="http://clickontyler.com/">Tyler</a> says to me, he says:</p>
<blockquote>
<p>I went to <a href="http://www.phpusers.net/portal/">the Nashville PHP group</a> last night. The conversation turned to which languages are on the rise, and I threw Python into the mix. Problem is, I had very little ammo to arm myself with. Got a list of bullet points as to why Python is better?</p>
</blockquote>
<p>Well, yes and no.</p>
<p>In terms of functionality, there&#8217;s very little difference between Perl 5, Python, PHP and Ruby. The reasons to choose one over the other are typically very domain-specific (hence subtle and of little use when fighting religious wars): Perl 5 makes text munging simple by having, e.g., regular expressions as first-class citizens; PHP makes web applications more natural because, well, that&#8217;s what it was designed to do.</p>
<p>I have nothing really positive (or negative) to say about Ruby. I can&#8217;t think of any special niche that it fills. Anonymous blocks? Perl 5 has them. Pure OO? Python has it. <a href="http://www.madore.org/~david/computers/callcc.html">call/cc</a>? If you think you need continuations, you probably don&#8217;t. You could argue that Ruby serves a purpose by combining all these things, but the number of people who sincerely need a pure OO language with anonymous blocks and continuations is probably around five.</p>
<p>The negative things I can think of with respect to Perl 5 and PHP is that it&#8217;s hard to do <a href="http://en.wikipedia.org/wiki/Dependency_injection">dependency injection</a>-based testing in these languages. It&#8217;s so hard in Java, for example, even <a href="http://code.google.com/p/google-guice/">Google has invented a tool to make Java DI easier</a>. Python on the other hand makes this dead-simple, making it so much easier to test your code from all perspectives. Hell, it&#8217;s so easy in Python, I didn&#8217;t even know there was a name for it until I came to Google. I don&#8217;t know how easy DI is in Ruby, but if it&#8217;s not Python-easy, Ruby loses.</p>
<p>That&#8217;s one criterion for programming languages that I don&#8217;t see discussed much: ranking languages by how easy the code is to test. One frequent example is mocking a global resource like a time source. C, C++ and Java all require you to come up with unnatural function signatures or link against special libraries when testing in order to gain control over time. It&#8217;s easier in Perl 5, but it still requires a good deal of specialized knowledge of how namespaces and module lookups work. Assuming the target library does something like <code>import time</code> at the top, here&#8217;s how you take control of a given module&#8217;s time source in Python:</p>
<pre class="code">>>> import some_module
>>> class StubTime:
>>>    def time(self):
>>>        return 3634634
>>> some_module.time = StubTime()</pre>
<p>Done. No specialized knowledge of interpreter details, no crazy setup, just done. If mocking global resources isn&#8217;t that easy in PHP, Ruby or any other language, I have little use for it beyond toy projects. Testing is where I feel Python really stands out.</p>
]]></content:encoded>
			<wfw:commentRss>http://oakwinter.com/code/got-a-list-of-bullet-points-as-to-why-python-is-better/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Microsoft Popfly: BWHAHAHAHAHA</title>
		<link>http://oakwinter.com/code/microsoft-popfly-bwhahahahaha/</link>
		<comments>http://oakwinter.com/code/microsoft-popfly-bwhahahahaha/#comments</comments>
		<pubDate>Mon, 21 May 2007 00:02:54 +0000</pubDate>
		<dc:creator>Collin</dc:creator>
		
		<category><![CDATA[general technology]]></category>

		<guid isPermaLink="false">http://oakwinter.com/code/microsoft-popfly-bwhahahahaha/</guid>
		<description><![CDATA[I mean, seriously.

Popfly is the fun, easy way to build and share mashups, gadgets, Web pages, and applications. Popfly consists of two parts:


Popfly Creator is a set of online visual tools for building Web pages and mashups.


Popfly Space is an online community of creators where you can host, share, rate, comment and even remix creations [...]]]></description>
			<content:encoded><![CDATA[<p>I mean, seriously.</p>
<blockquote>
<p><a href="http://www.popfly.ms/Overview/">Popfly</a> is the fun, easy way to build and share mashups, gadgets, Web pages, and applications. Popfly consists of two parts:</p>
<ol>
<li>
<p>Popfly Creator is a set of online visual tools for building Web pages and mashups.</p>
</li>
<li>
<p>Popfly Space is an online community of creators where you can host, share, rate, comment and even remix creations from other Popfly users.</p>
</li>
</ol>
</blockquote>
<p>&#8220;From the same team that brought you Internet Explorer, it&#8217;s&#8230;Microsoft <strike>Internet</strike>Web 2.0!&#8221; You know, I wish I had a monopoly to free me from the pressures of innovation, the need to be fresh and creative, secure in the knowledge that no matter what mediocre, uninteresting crap I pushed out, it would still be foisted upon millions against their will.</p>
<p>At least <a href="http://www.popfly.ms/Overview/faq.aspx">they admit they&#8217;re uncreative</a>: &#8220;left to our own devices we would have called [it] &#8216;Microsoft Visual Mashup Creator Express, May 2007 Community Tech Preview Internet Edition,&#8217; but instead we asked some folks for help and they suggested some cool names and we all liked Popfly.&#8221; Maybe you should have asked those same folks whether a &#8220;Visual Mashup Creator&#8221; was even a good idea to begin with. My hunch: &#8220;um no&#8221;.</p>
<p>I can&#8217;t imagine why anyone would want to work for these people. Popfly is the kind of product that happens when upper management says, &#8220;Hey, we have to show our shareholders that we&#8217;re doing this Web 2.0 thing they keep hearing about!&#8221; What a sad, sad little company.</p>
]]></content:encoded>
			<wfw:commentRss>http://oakwinter.com/code/microsoft-popfly-bwhahahahaha/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Two more PEPs for my collection</title>
		<link>http://oakwinter.com/code/two-more-peps-for-my-collection/</link>
		<comments>http://oakwinter.com/code/two-more-peps-for-my-collection/#comments</comments>
		<pubDate>Thu, 17 May 2007 18:23:52 +0000</pubDate>
		<dc:creator>Collin</dc:creator>
		
		<category><![CDATA[python 3000]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://oakwinter.com/code/two-more-peps-for-my-collection/</guid>
		<description><![CDATA[

PEP 3129, &#8220;Class Decorators&#8221;. This has already been accepted and implemented, thanks to Jack Diedrich.


PEP 3133, &#8220;Introducing Roles&#8221;. Roles are a competing idea to PEP 3119&#8217;s Abstract Base Classes.


Direct any discussion to python-3000.
]]></description>
			<content:encoded><![CDATA[<ul>
<li>
<p><a href="http://www.python.org/dev/peps/pep-3129/">PEP 3129</a>, &#8220;Class Decorators&#8221;. This has already been accepted and implemented, thanks to Jack Diedrich.</p>
</li>
<li>
<p><a href="http://www.python.org/dev/peps/pep-3133/">PEP 3133</a>, &#8220;Introducing Roles&#8221;. Roles are a competing idea to <a href="http://www.python.org/dev/peps/pep-3119/">PEP 3119</a>&#8217;s Abstract Base Classes.</p>
</li>
</ul>
<p>Direct any discussion to <a href="http://mail.python.org/mailman/listinfo/python-3000">python-3000</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://oakwinter.com/code/two-more-peps-for-my-collection/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
