<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-18669215</id><updated>2012-02-02T08:41:56.585-05:00</updated><category term='interactive-fiction'/><category term='mind'/><category term='music'/><category term='games'/><category term='ubuntu'/><category term='twisted'/><category term='python'/><category term='learn-rpython'/><category term='software'/><category term='pypy'/><category term='bzr'/><title type='text'>Twisted Radix</title><subtitle type='html'>Tales of a Programming Hobo</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default?start-index=101&amp;max-results=100'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>178</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18669215.post-60866889652049711</id><published>2011-10-06T21:28:00.004-05:00</published><updated>2011-10-07T21:24:06.980-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>Kingdoms of Amalur: Reckoning interactive story</title><content type='html'>The community people at &lt;a href="http://bighugegames.com/"&gt;Big Huge Games&lt;/a&gt; and &lt;a href="http://38studios.com/"&gt;38 Studios&lt;/a&gt; are doing a neat little project on Facebook - a kind of &lt;a href="http://www.facebook.com/Reckoningthegame"&gt;crowdsourced choose-your-own-adventure story&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's the blurb from the initial post:&lt;br /&gt;&lt;blockquote&gt;We wanted to give you a quick heads-up about an initiative we're starting on our Facebook page today. It is an interactive story that you can help us write! We post a screenshot and a poll, you help us decide what happens next. Muse has posted more info on our forums, so come take a look: &lt;a href="http://forums.reckoning.com/showthread.php?1015-Reckoning-Interactive-Story"&gt;link&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;And here's the first paragraph of the first post:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;You bolt awake in an unfamiliar place, sweating and out of breath from the dream. You were in the tower again. The decay. The filth. And the Tuatha…. Panic. Fire. The gnome giving his life to save yours. So many dead. As you wipe the sleep from your eyes, you swear that you can still smell the moldy decay of Allestar Tower and the smoke of the fires that destroyed it.&lt;/blockquote&gt;&lt;br /&gt;It reminds me of things like Action Castle, which is kind of an interactive fiction party game. Oh, here's a great video: I was actually in the audience for this!&lt;br /&gt;&lt;br /&gt;&lt;iframe width="480" height="270" src="http://www.youtube.com/embed/Jo8R4s0AY4o?fs=1" frameborder="0" allowFullScreen=""&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;(&lt;em&gt;edit: I see that the embedded video didn't get displayed for Planet IF readers -- here's the link: &lt;a href="http://www.youtube.com/watch?v=Jo8R4s0AY4o"&gt;The "Action Castle" Incident at PAX East 2010&lt;/a&gt;&lt;/em&gt;)&lt;br /&gt;&lt;br /&gt;Anyway, this is like that, but with thousands of people on Facebook. Neat!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-60866889652049711?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/60866889652049711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=60866889652049711' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/60866889652049711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/60866889652049711'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2011/10/kingdoms-of-amalur-reckoning.html' title='Kingdoms of Amalur: Reckoning interactive story'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/Jo8R4s0AY4o/default.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-7402303211317803507</id><published>2010-08-08T01:27:00.001-05:00</published><updated>2010-08-08T01:29:06.317-05:00</updated><title type='text'>Holy sh*t! QUAKE LIVE is launched!</title><content type='html'>Alright, so what's the explanation for my long absence from the blog &lt;em&gt;this&lt;/em&gt; time? &lt;a href="http://quakelive.com/"&gt;QUAKE LIVE&lt;/a&gt; just went out of beta yesterday. We've released subscription services which give you access to new maps, a new game type (freeze tag), and the ability to start your own matches with your friends. It's at &lt;a href="http://quakelive.com/"&gt;quakelive.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Since I joined the project I've been working on scalability improvements, but also new features like the invitation system and subscription management. I've even dipped into our PHP code recently. It's been really fun to work on and learn about a system that needs a lot of scalability in managing a combination of extremely dynamic and static, long-term statistical data. Python and Twisted are continuing to be a great fit for our work in the infrastructure.&lt;br /&gt;&lt;br /&gt;Having scalability problems is a great thing, of course, so go try out the game and make me work more :-)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=uKtrmmIUv1k"&gt;http://www.youtube.com/watch?v=uKtrmmIUv1k&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-7402303211317803507?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/7402303211317803507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=7402303211317803507' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7402303211317803507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7402303211317803507'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2010/08/holy-sht-quake-live-is-launched.html' title='Holy sh*t! QUAKE LIVE is launched!'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-1308047756953312257</id><published>2010-07-14T16:30:00.004-05:00</published><updated>2010-07-15T11:16:51.822-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>How to send good unicode email with Python</title><content type='html'>&lt;pre&gt;&lt;br /&gt;# coding: utf-8&lt;br /&gt;&lt;br /&gt;# Python's email API is simple and easy to use!!!!!!!!!!!!!!&lt;br /&gt;&lt;br /&gt;# Requirements:&lt;br /&gt;# * UTF-8 headers&lt;br /&gt;# * UTF-8 body&lt;br /&gt;# * prefer quoted-printable to base64 transfer-encoding.&lt;br /&gt;# * Don't escape "From" at the beginning of a line in the message - it's not&lt;br /&gt;#   the 1800s any more&lt;br /&gt;&lt;br /&gt;from cStringIO import StringIO&lt;br /&gt;from email.mime.multipart import MIMEMultipart&lt;br /&gt;from email.mime.text import MIMEText&lt;br /&gt;from email.header import Header&lt;br /&gt;from email import Charset&lt;br /&gt;from email.generator import Generator&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;subject = u'Hello あ'&lt;br /&gt;recipient = u'Bあb '&lt;br /&gt;from_address = u'Bかb '&lt;br /&gt;&lt;br /&gt;html = u'&amp;lt;html&gt;&amp;lt;body&gt;Hey böb!\nFrom Jack, I got enhanced pills!&amp;lt;/body&gt;&amp;lt;/html&gt;'&lt;br /&gt;text = u'Hey böb!\nFrom Jack, I got enhanced pills!'&lt;br /&gt;&lt;br /&gt;# Override python's weird assumption that utf-8 text should be encoded with&lt;br /&gt;# base64, and instead use quoted-printable (for both subject and body).  I&lt;br /&gt;# can't figure out a way to specify QP (quoted-printable) instead of base64 in&lt;br /&gt;# a way that doesn't modify global state. :-(&lt;br /&gt;Charset.add_charset('utf-8', Charset.QP, Charset.QP, 'utf-8')&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# This example is of an email with text and html alternatives.&lt;br /&gt;multipart = MIMEMultipart('alternative')&lt;br /&gt;&lt;br /&gt;# We need to use Header objects here instead of just assigning the strings in&lt;br /&gt;# order to get our headers properly encoded (with QP).&lt;br /&gt;# You may want to avoid this if your headers are already ASCII, just so people&lt;br /&gt;# can read the raw message without getting a headache.&lt;br /&gt;multipart['Subject'] = Header(subject.encode('utf-8'), 'UTF-8').encode()&lt;br /&gt;multipart['To'] = Header(recipient.encode('utf-8'), 'UTF-8').encode()&lt;br /&gt;multipart['From'] = Header(from_address.encode('utf-8'), 'UTF-8').encode()&lt;br /&gt;&lt;br /&gt;# Attach the parts with the given encodings.&lt;br /&gt;htmlpart = MIMEText(html.encode('utf-8'), 'html', 'UTF-8')&lt;br /&gt;multipart.attach(htmlpart)&lt;br /&gt;textpart = MIMEText(text.encode('utf-8'), 'plain', 'UTF-8')&lt;br /&gt;multipart.attach(textpart)&lt;br /&gt;&lt;br /&gt;# And here we have to instantiate a Generator object to convert the multipart&lt;br /&gt;# object to a string (can't use multipart.as_string, because that escapes&lt;br /&gt;# "From" lines).&lt;br /&gt;&lt;br /&gt;io = StringIO()&lt;br /&gt;g = Generator(io, False) # second argument means "should I mangle From?"&lt;br /&gt;g.flatten(multipart)&lt;br /&gt;&lt;br /&gt;# Pass the result of this to your SMTP library of choice.&lt;br /&gt;print io.getvalue()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;edited: The last part in a multipart message is the preferred one, so I moved the HTML part to the bottom.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;edited AGAIN: I found out that in order to avoid ridiculous "From" quoting, I needed to use a Generator object instead of multipart.as_string().&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-1308047756953312257?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/1308047756953312257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=1308047756953312257' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1308047756953312257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1308047756953312257'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2010/07/how-to-send-good-unicode-email-with.html' title='How to send good unicode email with Python'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-2321077164063295706</id><published>2010-01-10T11:00:00.002-05:00</published><updated>2010-01-10T11:07:26.947-05:00</updated><title type='text'>I can't believe I made it</title><content type='html'>Let's see: I got to my new apartment in Uptown Dallas on Saturday the 2nd, got my driving learner's permit on Monday the 4th, got my driver's license Friday the 8th (the soonest I was allowed to, a four day wait after I got my learner's permit), and got a car yesterday, Saturday the 9th. It's been a crazy week and I got everything done both as soon and as late as possible. I can actually get to my first day of work tomorrow!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-2321077164063295706?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/2321077164063295706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=2321077164063295706' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2321077164063295706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2321077164063295706'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2010/01/i-cant-believe-i-made-it.html' title='I can&apos;t believe I made it'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-654989574431239682</id><published>2009-12-19T20:22:00.004-05:00</published><updated>2009-12-20T18:49:17.555-05:00</updated><title type='text'>Welp, things have been happening</title><content type='html'>Dang, July was my last post? That was a long time ago.&lt;br /&gt;&lt;br /&gt;Since then, I left my job at &lt;a href="http://canonical.com/"&gt;Canonical&lt;/a&gt;, took a nice vacation/hiatus of a few months, and now I've got a job at &lt;a href="http://idsoftware.com/"&gt;id Software&lt;/a&gt; which I'm starting on January 11th, if all goes well. I've already &lt;strike&gt;sorted out&lt;/strike&gt; applied for an apartment, so now all I need to do is actually move down there... and get a driver's license and a car.&lt;br /&gt;&lt;br /&gt;In three weeks. During the holidays.&lt;br /&gt;&lt;br /&gt;Well, we'll see how it goes.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;edit: during a frickin' &lt;a href="http://news.google.com/news/search?q=boston+snow+storm"&gt;snow storm&lt;/a&gt;&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-654989574431239682?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/654989574431239682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=654989574431239682' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/654989574431239682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/654989574431239682'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2009/12/welp-things-have-been-happening.html' title='Welp, things have been happening'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-6395168097067707489</id><published>2009-07-20T23:55:00.002-05:00</published><updated>2009-07-21T00:02:37.142-05:00</updated><title type='text'>Launchpad is now open source</title><content type='html'>I'm sure you've already heard this in a million places, but I'll add my blog to the din: &lt;a href="http://blog.canonical.com/?p=192"&gt;Launchpad is now open source&lt;/a&gt;. All of it. Including the &lt;a href="https://dev.launchpad.net/Code"&gt;code hosting&lt;/a&gt; stuff. And &lt;a href="https://dev.launchpad.net/Soyuz"&gt;the part that builds Ubuntu&lt;/a&gt;. Everything!&lt;br /&gt;&lt;br /&gt;I'm happy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-6395168097067707489?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/6395168097067707489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=6395168097067707489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6395168097067707489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6395168097067707489'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2009/07/launchpad-is-now-open-source.html' title='Launchpad is now open source'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-1666530972783975191</id><published>2009-04-23T10:27:00.004-05:00</published><updated>2009-04-23T10:33:32.366-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>inform7.com</title><content type='html'>So, there's a new release of Inform 7, and a &lt;a href="http://inform7.com/"&gt;new web site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The entire web site has been redone, and I was responsible for the &lt;a href="http://inform7.com/write/extensions/"&gt;new extensions section&lt;/a&gt;. I won't say it's pretty (I'm working on it), and it still doesn't have quite all the features of the old site (the RSS feed should be available by this weekend), but there is an important new feature: you can now browse both the documentation and the source for all I7 extensions on-line. Here's &lt;a href="http://inform7.com/extensions/Aaron%20Reed/Intelligent%20Hinting/index.html"&gt;Intelligent Hinting by Aaron Reed&lt;/a&gt;, for example.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-1666530972783975191?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/1666530972783975191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=1666530972783975191' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1666530972783975191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1666530972783975191'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2009/04/inform7com.html' title='inform7.com'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-6289644337279211438</id><published>2009-04-13T13:57:00.005-05:00</published><updated>2009-04-13T15:07:29.621-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>Judith</title><content type='html'>&lt;a href="http://distractionware.com/blog/?p=759"&gt;Judith is Terry Cavanagh's latest game&lt;/a&gt;, and this time he collaborated with &lt;a href="http://www.increpare.com/2009/04/judith/"&gt;Stephen Lavelle&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It's another one of his experimental story-telling games, which are my favorite. I played the game about ten minutes after it was released and about an hour after that I was writing up a long analysis of it.&lt;br /&gt;&lt;br /&gt;I was thinking of posting it here, on my blog, but instead I decided to put it on the &lt;a href="http://www.intfiction.org/forum/viewtopic.php?f=37&amp;t=676"&gt;intfiction.org Interactive Fiction forums&lt;/a&gt;, because I'd rather have a conversation about the game than try to assert things about it in an exposition on my blog. Still, it's a rather wankery academic post, but my intentions are good.&lt;br /&gt;&lt;br /&gt;(By the way, intfiction.org is having some problems with spam lately; try to be careful and don't click on any dodgy-looking topics, since they may contain rather explicit porn spam).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-6289644337279211438?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/6289644337279211438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=6289644337279211438' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6289644337279211438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6289644337279211438'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2009/04/judith.html' title='Judith'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-9015107625547366808</id><published>2009-03-30T14:20:00.011-05:00</published><updated>2009-04-11T17:52:33.644-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>Games with non-expository stories</title><content type='html'>At the end of this blog post you'll find a list of games by three different developers. I think you should try them out.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Edit: Pathways does actually work on Wine if you set fullscreen=0 in the config.ini file.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Vignettes? Well, that's how one of these developers describes his works. Some of them definitely aren't short (Don't Look Back took me about half an hour; Eversion took a few hours spread over a few days), but the stories they present all have in common a reflective simplicity. All of these games are more about story than gameplay: some of them have gameplay elements which try to give the player some direct, deeply effective control of the fiction (Daniel Benmergui's games), and others take tried-and-true gameplay mechanics and use them as a way to communicate story elements to the player (Don't Look Back and Eversion).&lt;br /&gt;&lt;br /&gt;The title of this post calls them "non-expository", and I'm not sure how accurate a phrase that is, but it's the first one that came to mind when trying to describe the way they present the story. Let's take a look:&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt; 1. The act of exposing or laying open; a setting out or&lt;br /&gt;displaying to public view.&lt;br /&gt;[1913 Webster]&lt;/blockquote&gt;&lt;/pre&gt;It may be overly subtle or perhaps even punny, but I think it does make sense to refer to them as non-expository. The stories they present are not clear-cut and laid out. The author did not tell us what the story is: he showed us some scenes, depicted some characters, but didn't flesh out their details. They're much more introspective than that. When you get to the end (or one of the endings), you think to yourself: "okay, &lt;em&gt;maybe&lt;/em&gt; I know what just happened. Whatever it was, it was cool."&lt;br /&gt;&lt;br /&gt;I can only say that I am really happy that indie game development is becoming so widespread and successful. Certainly most indie development these days is focused on improving the essential gameplay of video games, which is awesome, but I find the experiments with story much more fascinating.&lt;br /&gt;&lt;br /&gt;There's a more concrete property that most of these games share: there's no text or dialogue. Despite this, they instill in the player a strong sense of the narrative with subtle graphical, audial, and gameplay cues. Somewhat tangentially, there is something that I've become a bit obsessed with as I think more and more about story and games -- the way that we can communicate to the player by taking something which is commonly used as a utilitarian device of user interface (a score counter or a health meter, for example) and twisting it in some way to reinforce the impact of an event in the game's story. Eversion does this well. I'd like to write about this more, once I find a better list of examples.&lt;br /&gt;&lt;br /&gt;The one game in the list below which does have dialogue is Pathways, and its dialogue is very limited. Each character only says one or two very simple sentences. Even so, that dialogue really has an effect on me, and I wonder if that has something to do with the nostalgia I have for those old, badly-translated Japanese video games where most of the characters you run into simply repeat the same line over and over again. I wonder if someone who's not familiar with those types of games could have the same kind of emotional response to the simple but incisively crafted dialogue in Pathways.&lt;br /&gt;&lt;br /&gt;Anyway, here's the list. Most of these are Flash games and the links will take you directly to the page where you can play them, unless otherwise noted.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Daniel Benmergui&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://www.kongregate.com/games/danielben/i-wish-i-were-the-moon"&gt;I wish I were the Moon&lt;/a&gt;. Take pictures of the things you see on the screen, and then click again to move them elsewhere. See what happens.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kongregate.com/games/danielben/storyteller"&gt;StoryTeller&lt;/a&gt; is similar in that you basically have the ability to move elements of a scene around, but this time it's broken into three distinct scenes, representing three points in the lives of three characters. You can modify the elements in any of the scenes and immediately see how it affects the later ones.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Terry Cavanagh&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.kongregate.com/games/TerryCavanagh/dont-look-back"&gt;Don't Look Back&lt;/a&gt;. It's a pretty simple jump-and-run game with beautiful music and a haunting turning point.&lt;/li&gt;&lt;li&gt;&lt;a href="http://distractionware.com/blog/?p=650"&gt;Pathways&lt;/a&gt; (runs well on Wine if you change config.ini to say fullscreen=0). This one is really touching. It's all about making decisions, and it reinforces what seems to be a recurring theme in his works by not allowing the player's character to turn back. He can only move forward or turn onto another path.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Guilherme S. Töws&lt;/span&gt; (of Zaratustra Productions)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://zarat.us/tra/offline-games/eversion.html"&gt;Eversion&lt;/a&gt; (another Windows-only game, works well on Wine). Another jump-and-run game which looks like a typically boring and hyper-cheery Mario-type game for the first couple of levels, but becomes gradually deeper and more bizarre. This one is the most difficult of all the games I've listed to actually complete, but you can get through the first 7 levels without having to collect all the gems. Getting them all may require the use of walkthroughs, which are readily available on Youtube.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-9015107625547366808?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/9015107625547366808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=9015107625547366808' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/9015107625547366808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/9015107625547366808'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2009/03/games-with-non-expository-stories.html' title='Games with non-expository stories'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-2063720682517635609</id><published>2009-02-11T04:19:00.003-05:00</published><updated>2009-02-11T04:24:56.446-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>Interactive Fiction Writing Month</title><content type='html'>I've just added the &lt;a href="http://ifmonth.blogspot.com/"&gt;Interactive Fiction Writing Month&lt;/a&gt; blog to &lt;a href="http://planet-if.com/"&gt;Planet IF&lt;/a&gt;. The project looks really cool. If you know anyone who's been thinking about trying to write some IF, point them in that direction.&lt;br /&gt;&lt;br /&gt;See also &lt;a href="http://www.instamatique.com/if"&gt;the main IF Writing Month web site&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-2063720682517635609?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/2063720682517635609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=2063720682517635609' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2063720682517635609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2063720682517635609'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2009/02/interactive-fiction-writing-month.html' title='Interactive Fiction Writing Month'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-5644651936374181766</id><published>2009-01-26T20:50:00.002-05:00</published><updated>2009-01-26T20:51:45.148-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>Blueful</title><content type='html'>Okay, this is really cool. I think you should check it out.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blueful.com/"&gt;http://blueful.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;By Aaron A. Reed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-5644651936374181766?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/5644651936374181766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=5644651936374181766' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5644651936374181766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5644651936374181766'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2009/01/blueful.html' title='Blueful'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-3121051214733921870</id><published>2008-11-24T18:11:00.014-05:00</published><updated>2008-11-25T17:43:40.233-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>Open-Morality</title><content type='html'>I am really getting sick of open-morality games&lt;sup&gt;&lt;a href="#coin"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;br /&gt;&lt;br /&gt;These games have a problem. It's not that they lack a wide enough range of moral decisions: I really do believe that my Fallout 3 character is a shining beacon of humanity's hope in the wretched landscape of the USA's post-apocalyptic capitol. And I realize that he could just as well have been an absolute bastard, even offending the sensibilities of the other horrible people in that world. So, okay: let's say that the game industry has figured out how to give the player some choice in how their character develops. The problem is that they &lt;em&gt;haven't&lt;/em&gt; figured out how to construct an engaging story from those decisions. Not once have I felt any twitch of meaningful emotion or insight while playing any open-world game that focuses on allowing the player to make wide-ranging moral decisions. Okay, so &lt;em&gt;most&lt;/em&gt; games don't give me any such reactions, but I think open-morality games actually destroy tiny bits of my brain that are responsible for emotion and insight. Maybe I'm being too harsh.&lt;br /&gt;&lt;br /&gt;I want to talk about Fable 2 today. I picked up Fable 2 a couple of weeks ago, honestly expecting to not like it very much. I'd played through most of the first Fable game, and found its story pathetic but its gameplay fairly entertaining. After playing it, I ranted to my friends that the morality of the world was shallow: The leader of the Hero's Guild, after turning me from a village boy into a full-fledged adventurer, gave a speech indicating that whether I would be good or evil was entirely my own decision. In this world, I could create suffering or ease it. Sure, that's true, it is my decision, but you know, I would expect some encouragement in the good direction at this point (later plot events notwithstanding). When major characters don't even &lt;em&gt;care&lt;/em&gt; whether you're good or evil, it sure does lessen the importance of that decision. So, morality in Fable is just another part of the toy.&lt;br /&gt;&lt;br /&gt;Other than that, I thought the game was somewhat fun.&lt;br /&gt;&lt;br /&gt;I've also been antagonistic to Peter Molyneux. He has some strong opinions about how stories in games should work, and after having played Fable and seeing how weak of a story it had, I basically condemned him as an unfortunately popular eccentric.&lt;br /&gt;&lt;br /&gt;I've changed my mind. Fable 2 is good. I like Fable 2 a lot. And maybe I don't think Peter Molyneux is quite as crazy as I did.&lt;br /&gt;&lt;br /&gt;Don't get me wrong: I still think open-morality is a dead-end road for narrative in games. Frankly, I think that people like Mr. Elrod who are apparently &lt;a href="http://blog.pjsattic.com/corvus/2008/10/fable-2-the-touch-of-evil/"&gt;deeply emotionally affected&lt;/a&gt; by this game need to read some books and get a more robust personal philosophy. If a player can construct a unique, unauthored narrative out of the simple mechanics and quests of this or other open-world games, then he could probably do the same with a string tied to a stick. We all have our weaknesses, Mr. Elrod. I watch sappy anime. But I don't imbue it with an imaginary quality of depth, even if it sometimes makes me cry.&lt;br /&gt;&lt;br /&gt;So why do I like Fable 2? Let me explain. It's incomplete to call Fable 2 an open-morality game. In addition to being an open-morality game, it is a &lt;em&gt;parody&lt;/em&gt; of open morality.&lt;br /&gt;&lt;br /&gt;I realized this as I was having my character join the Temple of Shadows -- the evil brotherhood of monks who receive benefits from an unnamed evil force by sacrificing innocent villagers. I should have realized it earlier (arguably even back when I played the first Fable game). But this is what made it clear to me that this game was &lt;em&gt;parodying&lt;/em&gt; moral decisions. You see, the Dark Monk (or whatever he is) who decides whether you can join the Temple of Shadows gives you a simple task: eat five baby chicks. Including the feathers, bones, and beaks. While they're alive. He mentions that back in his day, they only had to kick a blind beggar's walking stick out from under him, but nowadays they've got more strict entry requirements. As you eat the chicks, one by one, he makes comments indicating his disgust at your actions, at one point crying "You really have no scruples, do you!?"&lt;br /&gt;&lt;br /&gt;This scene had me cracking up. It was well-written black humor&lt;sup&gt;&lt;a href="#victor"&gt;2&lt;/a&gt;&lt;/sup&gt;, and the subject matter was so over the top that I could have no serious emotional reaction (other than amusement) to my character taking the "evil path" by joining this temple.&lt;br /&gt;&lt;br /&gt;Another example of this kind of thing is the Assassin's Guild. The guild will offer you jobs for killing particular (seemingly random) NPCs somewhere in the world. Each contract has the reason for the hit: reasons like the character having bad breath, or the guild needing to maintain its monthly quota.&lt;br /&gt;&lt;br /&gt;This is not a dramatic player-generated narrative, people.&lt;br /&gt;&lt;br /&gt;And I like Fable 2 more than Oblivion. Sure, when I took that first step out of the dungeon at the beginning of Oblivion I was excited to see the wide-open world awaiting my exploration. But when I actually found things in that big open world, the badly written and unengaging stories really detracted from the experience. I still go back to the game from time to time and enjoy a bit of a romp around the world, but who was really that excited about completing the main story? And what alternatives do we have? Farmer Brown wants you to go into a cave and kill a giant crab. Epic. Fable 2 has its moments of badly written story, but they make up a way smaller portion of the game. That is, less than all of it. Fable 2 has good comedy surrounding a bad story. Oblivion just has the bad story.&lt;br /&gt;&lt;br /&gt;I still think Peter Molyneux is probably a bit crazy, but I can respect what he's done a lot more now. I think I conflated his seriousness &lt;em&gt;about&lt;/em&gt; story with seriousness &lt;em&gt;of&lt;/em&gt; story. It turns out, he is just deadly bloody serious about comedy&lt;sup&gt;&lt;a href="#molyneux"&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Footnotes:&lt;br /&gt;&lt;br /&gt;&lt;a name="coin"&gt;1:&lt;/a&gt; I would say 'to coin a phrase' here, but I can't be bothered to google it up to make sure nobody else has said it yet. Anyway, it's clear that we're going to need more words than just "open-world" to explain the things happening in game development these days. Open-geography, open-morality, open-plot: these are all fairly different, and there are games to which these terms apply independently. Exercise for the reader: categorize Far Cry 2, Oblivion, Fallout 3, Grand Theft Auto, Deus Ex, and any Final Fantasy game.&lt;br /&gt;&lt;br /&gt;&lt;a name="victor"&gt;2:&lt;/a&gt; Mr. Gijsbers, &lt;a href="http://gamingphilosopher.blogspot.com/2008/08/portal.html#c6354735210976437951"&gt;I understand that interactive dark comedy is difficult for you&lt;/a&gt;, and so I recommend you do not play Fable 2 to avoid wildly misinterpreting it.&lt;br /&gt;&lt;br /&gt;&lt;a name="molyneux"&gt;3:&lt;/a&gt; Actually, I don't want to pretend like I'm getting at the True Intended Meaning behind this game. Mr. Molyneux might actually think that his game is a touching piece dealing head-on with hard moral problems, but if he did, he has failed. Oh, look! A stick and string!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-3121051214733921870?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/3121051214733921870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=3121051214733921870' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/3121051214733921870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/3121051214733921870'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/11/open-morality.html' title='Open-Morality'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-4455795161758732484</id><published>2008-11-16T20:57:00.004-05:00</published><updated>2008-11-22T12:31:11.965-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twisted'/><title type='text'>Twisted 8.2.0pre2</title><content type='html'>Please try out the second pre-release of Twisted 8.2.0, the first Twisted release since April.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twistedmatrix.com/users/radix/8.2.0pre2/"&gt;Downloads&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twistedmatrix.com/users/radix/8.2.0pre2/NEWS.txt"&gt;Release notes&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please try it out and report any bugs.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;edit: Updated to pre2.&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-4455795161758732484?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/4455795161758732484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=4455795161758732484' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4455795161758732484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4455795161758732484'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/11/twisted-820pre1.html' title='Twisted 8.2.0pre2'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-5728863137702729627</id><published>2008-11-14T10:45:00.006-05:00</published><updated>2008-11-14T11:03:42.166-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>A meme that is not a quiz, thankfully</title><content type='html'>There's a meme about books that's going around:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.daniel-watkins.co.uk/phrase-from-nearest-book"&gt;Daniel Watkins&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://strongdynamic.blogspot.com/2008/11/phrase-from-nearest-book-meme.html"&gt;Cory Dodt&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://holdenweb.blogspot.com/2008/11/phrase-from-nearest-book.html"&gt;Steve Holden&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;What you do is grab the nearest book, turn to page 56, and post the fifth sentence to your blog.&lt;br /&gt;&lt;br /&gt;First, the proof: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Fyi7h4UfFmpbBTiwduwWqw"&gt;&lt;img src="http://lh5.ggpht.com/_SqddeQP7qfs/SR2dhrxB9SI/AAAAAAAAAHA/E9KFLF-dux8/s400/books-on-table.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This picture was taken after rotating about 120 degrees in my chair. The Kindle in the picture probably is a few inches closer than the rest of the books, but first, it's unclear that it's a &lt;em&gt;book&lt;/em&gt;, and second, its ebooks don't have page numbers.&lt;br /&gt;&lt;br /&gt;So I chose the book on top of the stack (not the Nintendo DS game case that's at the very top: that's &lt;em&gt;The World Ends With You&lt;/em&gt;). The line reads as follows:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Events that do not command &lt;em&gt;our&lt;/em&gt; attention hardly exist for &lt;em&gt;us&lt;/em&gt;, even if they influence how &lt;em&gt;we&lt;/em&gt; perceive, feel, or react.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;It's from &lt;em&gt;Artful Sentences: Syntax as Style&lt;/em&gt; by Virginia Tufte. This book is made up mostly of quotes, so the line is actually a quote from another work, by Gerard Roth: &lt;em&gt;The Quest to Find Consciousness&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;(I've added the interactive-fiction tag to this post even though it has nothing to do with IF, so that my readers who only follow that tag will see it).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-5728863137702729627?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/5728863137702729627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=5728863137702729627' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5728863137702729627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5728863137702729627'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/11/meme-that-is-not-quiz-thankfully.html' title='A meme that is not a quiz, thankfully'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_SqddeQP7qfs/SR2dhrxB9SI/AAAAAAAAAHA/E9KFLF-dux8/s72-c/books-on-table.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-1001655576004231115</id><published>2008-11-09T11:34:00.003-05:00</published><updated>2008-11-09T11:38:26.414-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>Planet IF: Now slightly less buggy</title><content type='html'>I've updated the software behind &lt;a href="http://planet-if.com/"&gt;Planet Interactive Fiction&lt;/a&gt; to a new version/fork called &lt;a href="http://intertwingly.net/code/venus/"&gt;Venus&lt;/a&gt;. This should fix that bug which caused some blog post titles to be replaced by the username of the person who authored the post. I think this was affecting Wordpress users who used images, or something.&lt;br /&gt;&lt;br /&gt;Other than that, the templates are exactly the same, so you shouldn't notice a difference.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-1001655576004231115?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/1001655576004231115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=1001655576004231115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1001655576004231115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1001655576004231115'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/11/planet-if-now-slightly-less-buggy.html' title='Planet IF: Now slightly less buggy'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-4101254413360383918</id><published>2008-10-30T23:45:00.003-05:00</published><updated>2008-10-31T00:18:35.792-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>Just so I don't feel like a slacker</title><content type='html'>I took a week off from work this month (and I'll do this once per month until the end of the year, since my vacation time doesn't roll over) and have been trying to actually use it productively. Here's a list of some interesting things that I've done so far:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Twisted stuff: there was a developer sprint on Sunday that Itamar, Glyph, Jean-Paul and I attended, and since then I've been sporadically (but much more than usual) reviewing branches to try to get a release out. Speaking of which, Twisted contributors: please review &lt;a href="http://twistedmatrix.com/trac/ticket/3487"&gt;#3487&lt;/a&gt;!&lt;/li&gt;&lt;li&gt;Did a bit of evangelism for the new &lt;a href="http://code.google.com/p/garglk/"&gt;GarGlk project on Google Code&lt;/a&gt;, organized a mailing list and rustled up some members, and started making an Ubuntu package for the new &lt;a href="http://ccxvii.net/gargoyle/"&gt;Gargoyle&lt;/a&gt;. You should see something by the end of the week.&lt;/li&gt;&lt;li&gt;Worked on my own interactive fiction game, which is progressing at just about the right pace to be ready for the &lt;a href="http://groups.google.com/group/rec.arts.int-fiction/browse_thread/thread/71eed3d7edcb9d17#"&gt;GameplayComp mini-competition in September of 2009&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Posted a couple of updated extensions to the &lt;a href="http://www.inform-fiction.org/I7/Download%20-%20Extensions.html"&gt;I7 Extensions page&lt;/a&gt;: Emily Short's &lt;em&gt;Ordinary Room Description&lt;/em&gt; and Jesse McGrew's &lt;em&gt;Dynamic Objects&lt;/em&gt;.&lt;/li&gt;&lt;li&gt;Watched &lt;span style="font-style: italic;"&gt;Resident Evil: Extinction&lt;/span&gt; (the third in the series), which did not have as good an ending as either of the first two.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Of course, in addition to this I've been spending way too much time playing video games (Far Cry 2! Fallout 3! Man, there is a ridiculously awesome influx of good games lately. &lt;span style="font-style: italic;"&gt;And&lt;/span&gt; I am looking forward to Left 4 Dead). Of course, I am never one to be satisfied with simple pleasures, so all this gaming has been inspiring me to brew up an essay in my head which I'm thinking of calling &lt;em&gt;The Purity of Interaction&lt;/em&gt;, or less wankerly, &lt;em&gt;Consistency in Interaction&lt;/em&gt;. We'll see. I do still have three free days before I have to get back to the salt mines.&lt;br /&gt;&lt;br /&gt;Oh yeah, and if you're in the mood for something spooky for Halloween (or as I like to call it, &lt;a href="http://en.wikipedia.org/wiki/Halloween"&gt;All Hallow's Evening&lt;/a&gt;), check out &lt;a href="http://tenth.livejournal.com/110800.html"&gt;Dave's latest blog post&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-4101254413360383918?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/4101254413360383918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=4101254413360383918' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4101254413360383918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4101254413360383918'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/10/just-so-i-dont-feel-like-slacker.html' title='Just so I don&apos;t feel like a slacker'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-4695886418705383176</id><published>2008-10-19T14:41:00.003-05:00</published><updated>2008-10-19T14:47:19.008-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>Im in ur web site, postin ur Inform 7 extensions</title><content type='html'>Hi, this is a quick note that now people who want to add extensions to the &lt;a href="http://www.inform-fiction.org/I7/Download%20-%20Extensions.html"&gt;Inform 7 Extensions Page&lt;/a&gt; should now contact me at i7extensions@wordeology.com; Emily Short has handed off the responsibility to me, and I've just updated Liquid Handling and Supplemental Actions by Al Golden, and Epistemology by Eric Eve.&lt;br /&gt;&lt;br /&gt;Hopefully at some point the email address will be replaced by a web form that streamlines this process a bit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-4695886418705383176?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/4695886418705383176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=4695886418705383176' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4695886418705383176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4695886418705383176'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/10/im-in-ur-web-site-postin-ur-inform-7.html' title='Im in ur web site, postin ur Inform 7 extensions'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-4803970077290341751</id><published>2008-10-02T21:45:00.006-05:00</published><updated>2008-10-03T07:50:24.035-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>Glulxe packages for Ubuntu</title><content type='html'>So I got all the IFComp 2008 games, unzipped them, and tried to play them. Then I found out I didn't have any decent interpreters for the games and couldn't find Ubuntu 64-bit binaries for them on the net. So I decided to start making packages.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eblong.com/zarf/glulx/"&gt;Glulxe&lt;/a&gt; (using the &lt;a href="http://www.eblong.com/zarf/glk/index.html"&gt;glktermw&lt;/a&gt; backend) is now packaged and available in &lt;a href="https://launchpad.net/~ubuntu-if/+archive/+index"&gt;a Launchpad Personal Package Archive&lt;/a&gt; that I just set up. You can get it by adding the following software source to your Ubuntu machine:&lt;br /&gt;&lt;br /&gt;deb http://ppa.launchpad.net/ubuntu-if/ubuntu hardy main&lt;br /&gt;&lt;br /&gt;And installing the 'glulxe-term' package. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;edit: Thanks to &lt;a href="http://www.wolldingwacht.de/if/glulxe/"&gt;Peer Schaefer&lt;/a&gt; for the original packages, on which my packages are based. Sorry I forgot to mention in the initial post!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I hope to offer 'glulxe-gtk' package soon; ideally, I'll replace both of them with a 'glulxe' package that can dynamically use any Glk backend by making use of GlkLoader, but that'll probably require some real coding.&lt;br /&gt;&lt;br /&gt;I'm also working on packages for &lt;a href="http://sourceforge.net/projects/gnome-inform7"&gt;Gnome Inform 7&lt;/a&gt;, but unfortunately they contain proprietary code so I can't publish them on the PPA. I'm hoping to be able to split that package so that I can create a 'gnome-inform7' package separate from an 'inform7' package, but that's iffy because it would make installing from .debs without a repository significantly more annoying - right now you just click the .deb link on the Inform 7 web site and then click "Install package".&lt;br /&gt;&lt;br /&gt;Anyway, look out for more &lt;a href="http://launchpad.net/~ubuntu-if"&gt;Ubuntu/IF&lt;/a&gt; work soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-4803970077290341751?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/4803970077290341751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=4803970077290341751' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4803970077290341751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4803970077290341751'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/10/glulxe-packages-for-ubuntu.html' title='Glulxe packages for Ubuntu'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-7591605958962353958</id><published>2008-10-01T14:24:00.003-05:00</published><updated>2008-10-01T14:38:09.265-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>Interactive Fiction Competition 2008</title><content type='html'>There are a &lt;a href="http://planet-if.com/"&gt;slew of posts about it on Planet IF&lt;/a&gt;, but given that my readership is largely outside of the IF community, I'm going to mention here that &lt;a href="http://ifcomp.org/"&gt;IFComp '08 is now under way&lt;/a&gt; and is accepting votes. There are &lt;a href="http://ifcomp.org/comp08/download.html"&gt;35 games which you can get in one bundle&lt;/a&gt;. Most of the games can be run on any computer (Linux, Mac, Windows), with a few platform-specific (Windows-only) games.&lt;br /&gt;&lt;br /&gt;In case you don't know what interactive fiction is, you can read &lt;a href="http://emshort.wordpress.com/how-to-play/"&gt;Emily Short's short introduction&lt;/a&gt;. If you're looking for the interpreters needed to run the games, you can check out the &lt;a href="http://www.ifwiki.org/index.php/FAQ#How_can_I_download_and_play_IF.3F"&gt;relevant page on IFWiki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is the fourteenth year that the competition has been running (I was eleven when it started!), and it's the first in which I've decided to vote. Please join me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-7591605958962353958?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/7591605958962353958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=7591605958962353958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7591605958962353958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7591605958962353958'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/10/interactive-fiction-competition-2008.html' title='Interactive Fiction Competition 2008'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-7387336035624879850</id><published>2008-08-26T09:16:00.003-05:00</published><updated>2008-08-26T19:13:58.570-05:00</updated><title type='text'>This is a Rant</title><content type='html'>&lt;strong&gt;Edit: see end of post&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linux.com/feature/145341"&gt;Linux.com :: Protecting your MySQL database from SQL injection attacks with GreenSQL&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is an article (written by a very clueless person) about GreenSQL which is a tool (written by a very clueless person) that acts as a proxy between an application and a MySQL database which attempts to detect malicious, likely-injected SQL statements.&lt;br /&gt;&lt;br /&gt;Do not interpolate strings into your SQL statements.&lt;br /&gt;&lt;br /&gt;Then, there are all the hilariously dreadful comments.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"better yet, encode the bloody data before you shove it in there" --Anonymous&lt;/blockquote&gt;Do not interpolate strings into your SQL statements.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"Do you honestly think that anybody who doesn't know how to use simple, foolproof SQL-quoting functions is really going to be able to figure out how to correctly set up a package like this?" --Anonymous&lt;/blockquote&gt;Do not interpolate strings into your SQL statements.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"Why don't you try to actually learn to secure your code instead of being a lazy (or completely unskilled) administrator? Surely mysql_real_escape_string() isn't too hard to incorporate?" --Anonymous&lt;/blockquote&gt;Do not interpolate strings into your SQL statements.&lt;br /&gt;&lt;br /&gt;Look, it's simple. Most database interfaces have a function called 'execute' or similar which takes two arguments: a string of SQL with markers like '?' in it, and then a tuple of arguments to be used as the values of those markers.&lt;pre&gt;execute('SELECT * FROM users WHERE name = ? AND email = ?', ("radix", "radix@twistedmatrix.com"))&lt;/pre&gt;Do that. Don't do any of the following:&lt;pre&gt;execute('SELECT * FROM users WHERE name = %s and email = %s' % ("radix", "radix@twistedmatrix.com"))&lt;/pre&gt;&lt;pre&gt;name = "radix";&lt;br /&gt;email = "radix@twistedmatrix.com";&lt;br /&gt;execute('SELECT * FROM users WHERE name = $name and email = $email');&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;String escaping is an absolutely retarded alternative to this. Why would you bother escaping or "encoding" your strings when you can simply use the database API as it was intended, without interpolating strings?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Edit: &lt;/strong&gt; This concept of passing parameters has nothing at all to do with the "prepared statements" feature of popular databases. This is a much simpler feature. This is not a new feature. This feature is commonly called "bind parameters", and it has been around for decades.&lt;br /&gt;&lt;br /&gt;Why do so few people know about this?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-7387336035624879850?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/7387336035624879850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=7387336035624879850' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7387336035624879850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7387336035624879850'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/08/this-is-rant.html' title='This is a Rant'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-5014844403046071700</id><published>2008-08-08T10:05:00.003-05:00</published><updated>2008-08-08T10:16:14.497-05:00</updated><title type='text'>Gmail and HTTPS</title><content type='html'>If you use gmail, all of your email is probably going unencrypted over the Internet, allowing fairly easy snooping of all your sensitive data. You may feel good that there's an "https://" in your address bar after you type "gmail.com" into it and hit enter, but notice that after you authenticate and start reading email, it's gone back to "http://".&lt;br /&gt;&lt;br /&gt;It's been possible for a while to work around this and use https even for email content if you knew what to do in the address bar, but now gmail has made it easier. There's a new option in the main Settings screen called "Always use https". I strongly encourage all gmail users to turn this option on.&lt;br /&gt;&lt;br /&gt;It's still really lame that they haven't made it the default mode of operation. Come on, gmail, don't you care about privacy?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-5014844403046071700?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/5014844403046071700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=5014844403046071700' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5014844403046071700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5014844403046071700'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/08/gmail-and-https.html' title='Gmail and HTTPS'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-6981924484371202009</id><published>2008-08-07T18:00:00.003-05:00</published><updated>2008-08-07T18:11:13.457-05:00</updated><title type='text'>Ecru</title><content type='html'>Remember how I was &lt;a href="http://radix.twistedmatrix.com/2008/05/requirements-for-restricted-execution.html"&gt;talking about restricted execution&lt;/a&gt;, and mentioned that thing "Monte" that doesn't actually exist? Well actually I was trying to refer to &lt;a href="http://launchpad.net/ecru/"&gt;Ecru, a new E implementation in C&lt;/a&gt;. After being &lt;a href="http://www.eros-os.org/pipermail/e-lang/2008-July/012781.html"&gt;announced to positive reactions&lt;/a&gt; on the E mailing list, Allen &lt;a href="http://washort.twistedmatrix.com/2008/07/ecru-c-runtime-for-e.html"&gt;posted on his blog about Ecru&lt;/a&gt; and why he started the project.&lt;br /&gt;&lt;br /&gt;I'm excited about this project. E is a language which is specifically designed to solve &lt;a href="http://radix.twistedmatrix.com/2008/05/requirements-for-restricted-execution.html"&gt;the types of problems that I want to solve&lt;/a&gt;, but Ecru has a long way to go until it gets there. I hope it gets more contributors!&lt;br /&gt;&lt;br /&gt;As for Lua: I do think it's feasible for some serious restricted execution work (or at least I think it might be - I haven't really proven it yet), but I'd much prefer Ecru, because E is so much more sensible a language.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-6981924484371202009?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/6981924484371202009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=6981924484371202009' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6981924484371202009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6981924484371202009'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/08/ecru.html' title='Ecru'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-2123726925239795684</id><published>2008-07-29T17:34:00.003-05:00</published><updated>2008-07-29T17:58:26.424-05:00</updated><title type='text'>python-committers</title><content type='html'>Quote:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Welcome to python-committers! This publicly-archived but invite-only mailing list is for people who have commit privileges for Python to &lt;strong&gt;discuss issues that do not concern the general public&lt;/strong&gt;. Example of topics to go to this list are &lt;strong&gt;release dates, whether a specific patch is a release blocker&lt;/strong&gt;, etc. Essentially anything where &lt;strong&gt;public input serves no purpose&lt;/strong&gt;.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;-- &lt;a href="http://mail.python.org/pipermail/python-committers/2008-July/000009.html"&gt;Brett Cannon&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-2123726925239795684?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/2123726925239795684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=2123726925239795684' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2123726925239795684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2123726925239795684'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/07/python-committers.html' title='python-committers'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-6818950971415048276</id><published>2008-07-26T09:09:00.003-05:00</published><updated>2008-07-26T09:27:28.235-05:00</updated><title type='text'>Twisted Community Code on Launchpad</title><content type='html'>We already &lt;a href="http://labs.twistedmatrix.com/2008/06/place-for-everyone.html"&gt;made an official announcement about it&lt;/a&gt;, but I wanted to post again about the &lt;a href="https://launchpad.net/tx"&gt;Twisted Community Code project&lt;/a&gt; on Launchpad.&lt;br /&gt;&lt;br /&gt;After (nearly) two months, I think so far I'd call it successful. There are currently thirty-two projects registered, with a variety of technical areas covering concurrency, deployment, testing, protocol implementations, games, and more.&lt;br /&gt;&lt;br /&gt;I think this is turning out way better than &lt;a href="http://twistedmatrix.com/trac/wiki/ProjectsUsingTwisted"&gt;our ProjectsUsingTwisted wiki page&lt;/a&gt;, not only because it's easy to add your own Launchpad project, but also because it gives users a direct and easy way to get access to the source code and bug tracker for each of these projects.&lt;br /&gt;&lt;br /&gt;The 'tx' naming convention is also turning out to be pretty cool; I'm amazed at how many projects have adopted it in the couple of months since it was proposed. &lt;br /&gt;&lt;br /&gt;Anyway, if you have your own Twisted-related project, I encourage you to register it in Launchpad as a member of the &lt;a href="https://launchpad.net/tx"&gt;tx super-project&lt;/a&gt;. If you're just looking for libraries to help while you're writing your Twisted-based application, it's also a great place to check.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-6818950971415048276?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/6818950971415048276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=6818950971415048276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6818950971415048276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6818950971415048276'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/07/twisted-community-code-on-launchpad.html' title='Twisted Community Code on Launchpad'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-8391796615611633966</id><published>2008-07-18T22:50:00.003-05:00</published><updated>2008-07-18T22:54:36.327-05:00</updated><title type='text'>Joss Whedon Writes Stuff</title><content type='html'>Check out &lt;a href="http://drhorrible.com/"&gt;Dr. Horrible's Sing-Along Blog&lt;/a&gt;. It's a video musical. It's by Joss Whedon, famous Hollywood &lt;a href="http://drhorrible.com/plan.html"&gt;writer/director/terrorist&lt;/a&gt;. It's free to watch on that web site until Sunday, July 20th, 2008. After that you'll be able to purchase it for a nominal fee.&lt;br /&gt;&lt;br /&gt;Here are some things which he said about this project that I think are cool.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The idea was to make it on the fly, on the cheap – but to make it. To turn out a really thrilling, professionalish piece of entertainment specifically for the internet. To show how much could be done with very little. To show the world there is another way. To give the public (and in particular you guys) something for all your support and patience. And to make a lot of silly jokes. Actually, that sentence probably should have come first. &lt;/blockquote&gt;...&lt;blockquote&gt;It’s time for the dissemination of the artistic process. Create more for less. You are the ones that can make that happen.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-8391796615611633966?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/8391796615611633966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=8391796615611633966' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8391796615611633966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8391796615611633966'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/07/joss-whedon-writes-stuff.html' title='Joss Whedon Writes Stuff'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-2017677654777102634</id><published>2008-06-28T20:56:00.005-05:00</published><updated>2008-06-28T21:12:10.519-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>Inventory Meme.</title><content type='html'>Glyph inventoried -- ahem -- &lt;a href="http://glyph.twistedmatrix.com/2008/06/memeventory-inventomeme-uh-how-about.html"&gt;invented a new meme&lt;/a&gt;. It's called the Inventory Meme. &lt;a href="http://jcalderone.livejournal.com/41916.html"&gt;Jean-Paul responded&lt;/a&gt; with a rather pathetic submission.&lt;br /&gt;&lt;br /&gt;Now it's time for the real deal, yo.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Inventory, by Christopher Armstrong&lt;/h4&gt;&lt;em&gt;I have to get ready for a flight to London, which is taking off in, oh, two hours. Fortunately most of the packing was done last night.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;You can &lt;a href="http://parchment.googlecode.com/svn/trunk/parchment.html?story=http://wordeology.com/radix/Inventory/Inventory.js"&gt;play it online with Parchment&lt;/a&gt; or &lt;a href="http://wordeology.com/radix/Inventory/Inventory.z5"&gt;download the z5 file&lt;/a&gt; if you have an Interactive Fiction interpreter. Please type HELP when the game starts. I've also made the &lt;a href="http://wordeology.com/radix/Inventory/source.html"&gt;source code&lt;/a&gt; available.&lt;br /&gt;&lt;br /&gt;This "game" was written in &lt;a href="http://www.inform-fiction.org/I7/"&gt;Inform 7&lt;/a&gt;. Thanks to Glyph for inspiring me to finish my very first work of Interactive (Non-)Fiction and to Graham Nelson, Emily Short, Philip Chimento, and others for Inform 7.&lt;br /&gt;&lt;br /&gt;(Yes, I'm being ironic. I don't actually take this that seriously.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-2017677654777102634?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/2017677654777102634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=2017677654777102634' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2017677654777102634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2017677654777102634'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/06/inventory-meme.html' title='Inventory Meme.'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-5043774929176054440</id><published>2008-05-29T17:41:00.008-05:00</published><updated>2008-05-30T07:42:21.116-05:00</updated><title type='text'>Requirements for a restricted execution runtime</title><content type='html'>I don't care what the language is, just please someone give me a runtime with these properties:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Namespace restriction. Encapsulation. Capabilities. Whatever: the code should only be able to do what I say it can do.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;CPU timeslice restriction: Either I should be able to run some code for so long, pause it, and then resume it where it left off, or I should be able to run some code asynchronously, giving it 1/Nth CPU time.&lt;/li&gt;&lt;li&gt;Memory allocation restrictions: this user's code should only be able to allocate up to N megabytes.&lt;/li&gt;&lt;li&gt;Efficient at rather high scales: I should be able to run at least 500, maybe 1000 completely isolated functions concurrently. If all they're doing is sleep()ing, then this shouldn't put the host under heavy load.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Some simple way to expose new, audited functions. This is pretty easy. If it can't run in a Python process and allow Python functions to be exposed to it, then I can at least run it in a separate process with method invocations going over a trivial RPC protocol.&lt;/li&gt;&lt;li&gt;A decent set of secure built-in operations, but nothing really fancy. People are going to be interfacing with my API and nothing else, so they won't need a hugely rich core language API. It does need to be secure, though: large exponentiation should either be disallowed or interruptible, for example.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Secure&lt;/span&gt;, ok? For example, don't talk to me about Python (as implemented by CPython). I have very little trust for any restricted execution system that's tacked onto an existing complex runtime.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;In case you need some context for these requirements to make sense, think LambdaMOO or Second Life. Any user can upload code to run with their rights; it can manipulate the world through an audited "trusted" API. The code isn't allowed to interfere with the host system or other users' code. Another possible application is a wiki which allows people to upload code to be executed when a page is viewed.&lt;br /&gt;&lt;br /&gt;Here's the list of things I've considered:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.plt-scheme.org/"&gt;PLT&lt;/a&gt; looks damned close with its &lt;a href="http://download.plt-scheme.org/doc/372/html/mzlib/mzlib-Z-H-41.html#node_chap_41"&gt;sandbox&lt;/a&gt; library, but its execution limitation is in terms of wall-clock seconds, not CPU seconds, &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; it's not continuable.&lt;/li&gt;&lt;li&gt;&lt;a href="http://launchpad.net/monte/"&gt;Monte&lt;/a&gt; could definitely do it some day, if its development remains steady.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.lua.org/"&gt;Lua&lt;/a&gt;... well, can Lua do it? I'd love it if someone would actually make a point on this.&lt;/li&gt;&lt;li&gt;&lt;a href="http://haskell.org/"&gt;Haskell&lt;/a&gt; might be able to do it. Haskell can do &lt;span style="font-style: italic;"&gt;anything&lt;/span&gt;, it seems. (I think I saw some code once which somehow implemented continuations in Haskell, for Haskell. Without being a Haskell runtime or compiler. What? I don't know.) The problem is it's inscrutable to me. I'd love it if someone commented about this.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ecmascript.org/"&gt;Javascript&lt;/a&gt;? Is there actually a usable standalone implementation of Javascript? Which of these properties does it have?&lt;/li&gt;&lt;li&gt;PyPy with the sandbox translation option. It's very cool, but I'm not sure it's usable at the 1000 node scale, because I can't see a way to run multiple isolated interpreters within one process. It also misses things like CPU timeslice restriction and memory allocation restriction, as far as I can tell.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I'd love to hear your comments. If you think that an existing runtime is close and know which of these properties it lacks, I want to hear about it. If you actually know of a runtime that has &lt;span style="font-style: italic;"&gt;all&lt;/span&gt; of these properties, I'll buy you fifty beers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-5043774929176054440?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/5043774929176054440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=5043774929176054440' title='32 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5043774929176054440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5043774929176054440'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/05/requirements-for-restricted-execution.html' title='Requirements for a restricted execution runtime'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>32</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-7470752280487513469</id><published>2008-05-16T10:50:00.004-05:00</published><updated>2008-05-16T10:55:36.066-05:00</updated><title type='text'>Search History: "R"</title><content type='html'>To continue my &lt;a href="http://radix.twistedmatrix.com/2007/01/search-history.html"&gt;series of search history starting with "S"&lt;/a&gt;, here is "R":&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://lh6.ggpht.com/radeex/SC2tcjnGInI/AAAAAAAAAC8/3CnPRv6KQbI/s800/R-searches.png" /&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-7470752280487513469?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/7470752280487513469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=7470752280487513469' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7470752280487513469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7470752280487513469'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/05/search-history-r.html' title='Search History: &quot;R&quot;'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/radeex/SC2tcjnGInI/AAAAAAAAAC8/3CnPRv6KQbI/s72-c/R-searches.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-4646329518911933524</id><published>2008-05-11T11:13:00.004-05:00</published><updated>2008-05-11T11:36:13.706-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>Intelligent Hinting</title><content type='html'>&lt;a href="http://www.aaronareed.net/"&gt;Aaron A. Reed&lt;/a&gt; recently announced an &lt;a href="http://groups.google.com/group/rec.arts.int-fiction/browse_thread/thread/92a35d2a6fcead88#"&gt;open beta for his Intelligent Hinting extension for Inform 7&lt;/a&gt;. This is an amazing extension that intelligently figures out how to solve puzzles in Inform 7-based games with high-level puzzle annotations in your I7 project.&lt;br /&gt;&lt;br /&gt;You have to define "puzzles" and "tasks" in your own game, at implementation-time, and the extension provides a &gt;SUGGEST command which indicates the next action to be taken to solve the current puzzle. It's surprisingly smart: if you've defined that a cloak must be placed on a particular hook, it will automatically figure out how to move the player to find the cloak, pick it up, and move the player to the hook. Not only that, it even knows how to completely automatically find keys for locked doors that are between the player and either the cloak or the hook.&lt;br /&gt;&lt;br /&gt;Not only is this a good feature for end-users, it also offers very important benefits to implementors of IF: It makes it trivial to automatically test if your work is winnable, and it makes it similarly trivial to generate a walkthrough to publish with your game automatically.&lt;br /&gt;&lt;br /&gt;Inform 7 has a rich and descriptive world model, and it's great to see tools that are starting to really take advantage of it in very useful ways.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-4646329518911933524?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/4646329518911933524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=4646329518911933524' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4646329518911933524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4646329518911933524'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/05/intelligent-hinting.html' title='Intelligent Hinting'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-3113155751781636907</id><published>2008-04-30T10:08:00.003-05:00</published><updated>2008-04-30T10:11:53.671-05:00</updated><title type='text'>Twisted Show 3, Raffi Krikorian of Synthesis Studios</title><content type='html'>By the way, if you haven't listened to it yet, I recommend checking out the third episode of the Twisted Show, which is an &lt;a href="http://thetwistedshow.blogspot.com/2008/04/interview-with-synthesis-studios.html"&gt;interview of Raffi Krikorian of Synthesis Studios&lt;/a&gt;. I share space with Divmod in that back room :-)&lt;br /&gt;&lt;br /&gt;by the way, if you have trouble with noise from the audio player at archive.org, try the .mp3 or .ogg version; they sound fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-3113155751781636907?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/3113155751781636907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=3113155751781636907' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/3113155751781636907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/3113155751781636907'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/04/twisted-show-3-raffi-krikorian-of.html' title='Twisted Show 3, Raffi Krikorian of Synthesis Studios'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-8387484706229221472</id><published>2008-04-29T19:30:00.005-05:00</published><updated>2008-08-11T15:15:17.818-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive-fiction'/><title type='text'>Planet Interactive Fiction</title><content type='html'>I just set up a &lt;a href="http://planetplanet.org/"&gt;Planet&lt;/a&gt; site for the community of Interactive Fiction bloggers. It's at &lt;a href="http://planet-if.com/"&gt;http://planet-if.com/&lt;/a&gt; and it's called &lt;a href="http://planet-if.com/"&gt;Planet IF&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Don't know what Interactive Fiction is? &lt;a href="http://emshort.wordpress.com/how-to-play/"&gt;Emily Short explains it succinctly.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm not really a regular in the &lt;a href="http://groups.google.com/group/rec.arts.int-fiction/"&gt;IF community&lt;/a&gt;, but I am a long-time reader and wanna-be author of IF. I want to see the medium grow in popularity and so I'll do what I can to help it out. So there you have it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-8387484706229221472?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/8387484706229221472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=8387484706229221472' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8387484706229221472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8387484706229221472'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/04/planet-interactive-fiction.html' title='Planet Interactive Fiction'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-2412070301222471575</id><published>2008-04-26T17:10:00.002-05:00</published><updated>2008-04-26T17:14:21.907-05:00</updated><title type='text'>Twisted 8.1.0 prerelease 2</title><content type='html'>Hey all, I've put out the &lt;a href="http://twistedmatrix.com/users/radix/8.1.0pre2/"&gt;second prerelease of Twisted 8.1.0&lt;/a&gt;. This release includes a number of bug fixes, including for some unfortunate regressions in 8.0.1, as well as a few features.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Trial's performance was improved&lt;/li&gt;&lt;li&gt;Fixed a bug where Failures wouldn't be constructible involving Pyrex&lt;/li&gt;&lt;li&gt;Fixed a couple of reactor re-entrancy bugs introduced&lt;/li&gt;&lt;li&gt;Fixed the conch.insults bug where gnome-terminal wouldn't scroll when output reached the bottom of the screen.&lt;/li&gt;&lt;/ul&gt;And a bunch of other miscellaneous fixes. Please download this prerelease and give it a try with your applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-2412070301222471575?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/2412070301222471575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=2412070301222471575' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2412070301222471575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2412070301222471575'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/04/twisted-810-prerelease-2.html' title='Twisted 8.1.0 prerelease 2'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-6258835147189867269</id><published>2008-03-31T20:19:00.003-05:00</published><updated>2008-03-31T20:31:43.616-05:00</updated><title type='text'>Corotwine 0.2</title><content type='html'>As is my tradition, I'm doing extremely rapid releases of my software.&lt;br /&gt;&lt;br /&gt;Here's &lt;a href="http://edge.launchpad.net/corotwine/trunk/0.2/+download/Corotwine-0.2.tar.gz"&gt;Corotwine 0.2&lt;/a&gt;, which contains the following changes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Returning from a connection-handling function now closes the connection&lt;/li&gt;&lt;li&gt;A bug was fixed in the example Chat server&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://twistedmatrix.com/users/radix/corotwine/api/"&gt;The API documentation&lt;/a&gt; has been updated.&lt;br /&gt;&lt;br /&gt;Please post any feedback.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-6258835147189867269?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/6258835147189867269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=6258835147189867269' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6258835147189867269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6258835147189867269'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/03/corotwine-02.html' title='Corotwine 0.2'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-6337397943317426683</id><published>2008-03-30T13:44:00.003-05:00</published><updated>2008-03-30T18:35:13.868-05:00</updated><title type='text'>Corotwine 0.1</title><content type='html'>I've just released &lt;a href="http://launchpad.net/corotwine/"&gt;Corotwine&lt;/a&gt;, a set of Coroutine APIs for Twisted. You can download &lt;a href="http://launchpad.net/corotwine/trunk/0.1.0/+download/Corotwine-0.1.tar.gz"&gt;Corotwine-0.1.tar.gz&lt;/a&gt;. There is very thorough &lt;a href="http://twistedmatrix.com/users/radix/corotwine/api/"&gt;API documentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's a complete example chat server. Start it up and telnet to port 1025 a couple of times and you'll be able to chat.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from twisted.internet import reactor&lt;br /&gt;from twisted.internet.error import ConnectionClosed&lt;br /&gt;from corotwine.protocol import gListenTCP, LineBuffer&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Chat(object):&lt;br /&gt; def __init__(self):&lt;br /&gt;     self.clients = []&lt;br /&gt;&lt;br /&gt; def handleConnection(self, transport):&lt;br /&gt;     transport = LineBuffer(transport)&lt;br /&gt;     self.clients.append(transport)&lt;br /&gt;     try:&lt;br /&gt;         try:&lt;br /&gt;             for line in transport:&lt;br /&gt;                 for client in self.clients:&lt;br /&gt;                     if client is not transport:&lt;br /&gt;                         client.writeLine(line)&lt;br /&gt;         finally:&lt;br /&gt;             self.clients.remove(transport)&lt;br /&gt;     except ConnectionClosed:&lt;br /&gt;         return&lt;br /&gt;&lt;br /&gt;from twisted.python.log import startLogging&lt;br /&gt;import sys&lt;br /&gt;startLogging(sys.stdout)&lt;br /&gt;&lt;br /&gt;gListenTCP(1025, Chat().handleConnection)&lt;br /&gt;&lt;br /&gt;reactor.run()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;There are more examples in the &lt;a href="http://bazaar.launchpad.net/%7Eradix/corotwine/trunk/annotate/10/corotwine/examples.py"&gt;corotwine/examples.py&lt;/a&gt; file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-6337397943317426683?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/6337397943317426683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=6337397943317426683' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6337397943317426683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6337397943317426683'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/03/corotwine-01.html' title='Corotwine 0.1'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-5672551213540160944</id><published>2008-03-27T10:22:00.002-05:00</published><updated>2008-03-27T10:27:51.588-05:00</updated><title type='text'>Twisted 8.0.1 is out</title><content type='html'>Hey all. The &lt;a href="http://twistedmatrix.com/"&gt;release of Twisted 8.0&lt;/a&gt; is finally done, and I was so excited about it that I just had to do another one: &lt;a href="http://twistedmatrix.com/trac/browser/tags/releases/twisted-8.0.1/NEWS?format=raw"&gt;8.0.1&lt;/a&gt;. The release announcement has been &lt;a href="http://labs.twistedmatrix.com/2008/03/twisted-80-released.html"&gt;posted to the TM Labs blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Download and enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-5672551213540160944?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/5672551213540160944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=5672551213540160944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5672551213540160944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5672551213540160944'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/03/twisted-801-is-out.html' title='Twisted 8.0.1 is out'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-3405998083792963603</id><published>2008-03-24T00:11:00.004-05:00</published><updated>2008-03-24T00:44:13.514-05:00</updated><title type='text'>Twisted Isn't Specific</title><content type='html'>I was googling for some stuff related to Twisted and greenlet and I came across this post from last year by Jean-Paul Calderone: &lt;a href="http://mail.python.org/pipermail/python-dev/2007-February/071176.html"&gt;Twisted Isn't Specific&lt;/a&gt;. That subject is a reference to a quote in the Twisted.Quotes file:&lt;br /&gt;&lt;blockquote&gt;&amp;lt;sayke&amp;gt; Acapnotic: don't make it twisted-specific&lt;br /&gt;&amp;lt;dash&amp;gt; sayke: pffft&lt;br /&gt;&amp;lt;dash&amp;gt; sayke: twisted isn't specific&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;The post is kind of relevant to some poking around I've been doing with integrating greenlet and Twisted again, but that's not really why I wanted to point it out on my blog. I just had a really good time reading it again. I think it's really well-written, and is fairly quotable. Just to warn you: this is one of those "quote posts" that contain more quotations than commentary, often perpetrated by ineffectual bloggers with nothing original to say. I'm sorry.&lt;br /&gt;&lt;br /&gt;The email that Jean-Paul is responding to is by Andrew Dalke, and is about how he wants to magically replace the built-in Python &lt;code&gt;socket&lt;/code&gt; module with something that switches to an event loop and allows other application code to run at the same time. This isn't terribly reliable, of course, and Jean-Paul gives a nice explanation of the dangers of implicit context switching (which applies to pre-emptive threading just as well as the controlled but still implicit switching of stackless or greenlet).&lt;br /&gt;&lt;blockquote&gt;Consider this extremely trivial example:&lt;pre&gt;  x = 0&lt;br /&gt;  def foo(conn):&lt;br /&gt;      global x&lt;br /&gt;      a = x + 1&lt;br /&gt;      b = ord(conn.recv(1))&lt;br /&gt;      x = a + b&lt;br /&gt;      return x&lt;/pre&gt;Clearly, foo is not threadsafe.  Global mutable state is a terrible, terrible thing.  The point to note is that by introducing a context switch at the conn.recv(1) call, the same effect is achieved as by any other context switch: it becomes possible for foo to return an inconsistent result or otherwise corrupt its own state if another piece of code violates its assumptions and changes x while it is waiting for the recv call to complete.&lt;/blockquote&gt;Asyncore was also brought up. It's often compared to Twisted, since in the past it was the only prevalent event system for Python. Twisted has pretty much obsoleted it by now, or so I like to think:&lt;blockquote&gt;&lt;em&gt;2) asyncore is smaller and easier to understand than Twisted, &lt;/em&gt;[-- Dalke]&lt;br /&gt;&lt;br /&gt;While I hear this a lot, applications written with Twisted _are_ shorter and contain less irrelevant noise in the form of boilerplate than the equivalent asyncore programs.  This may not mean that Twisted programs are easier to understand, but it is at least an objectively measurable metric.&lt;/blockquote&gt;&lt;br /&gt;Andrew goes on to talk about how great it would be if we could just use the existing built-in Python libraries for NNTP and POP3. That was pretty amusing, because those were some of the first protocol implementations (client &lt;em&gt;and&lt;/em&gt; server) that Jean-Paul did for Twisted. And you know what? He had a reason for doing them with Twisted, instead of using the standard library versions:&lt;br /&gt;&lt;blockquote&gt;&lt;em&gt;Yet by using the Stackless socket monkeypatch, this same code works in an async framework.  And the underlying libraries have a much larger developer base than Twisted. Want NNTP?  "import nntplib"  Want POP3?  "import poplib" Plenty of documentation about them too.&lt;/em&gt; [-- Dalke]&lt;br /&gt;&lt;br /&gt;This is going to come out pretty harshly, for which I can only apologize in advance, but it bears mention.  The quality of protocol implementations in the standard library is bad.  As in "not good".  Twisted's NNTP support is better (even if I do say so myself - despite only having been working on by myself, when I knew almost nothing about Twisted, and having essentially never been touched since).  Twisted's POP3 support is fantastically awesome.  Next to imaplib, twisted.mail.imap4 is a sparkling diamond.  And each of these implements the server end of the protocol as well: you won't find that in the standard library for almost any protocol.&lt;/blockquote&gt;&lt;br /&gt;He went on to compare the Twisted POP3 client documentation to the Python poplib. Neither were very good.&lt;br /&gt;&lt;br /&gt;Jean-Paul even had a nice bit of wisdom about our culture as programmers in general:&lt;blockquote&gt;&lt;em&gt;I feel that using the phrase "just a" in the previously quoted text is an understatement.&lt;/em&gt; [-- Dalke]&lt;br /&gt;&lt;br /&gt;I think you're right.  We throw around "just" a lot in our line of work, don't we? :) Twisted does also account for a raft of platform-specific quirks and inconsistencies.  I take this to be a good thing.&lt;/blockquote&gt;&lt;br /&gt;And what a classy closing.&lt;br /&gt;&lt;blockquote&gt;I apologize for writing such a long message, but I didn't have time to write a shorter one.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-3405998083792963603?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/3405998083792963603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=3405998083792963603' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/3405998083792963603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/3405998083792963603'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/03/memories.html' title='Twisted Isn&apos;t Specific'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-5191929192443290681</id><published>2008-03-23T10:53:00.002-05:00</published><updated>2008-03-23T11:01:21.662-05:00</updated><title type='text'>pyOpenSSL 0.7a1</title><content type='html'>&lt;a href="http://jcalderone.livejournal.com/"&gt;Jean-Paul Calderone&lt;/a&gt; has recently taken over maintenance of the &lt;a href="http://pyopenssl.sourceforge.net/"&gt;pyOpenSSL&lt;/a&gt; project. He's doing development with bzr on &lt;a href="http://launchpad.net/pyopenssl/"&gt;launchpad.net/pyopenssl&lt;/a&gt;, but still maintaining the web site and downloads at &lt;a href="http://pyopenssl.sourceforge.net/"&gt;pyopenssl.sf.net&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;He's already fixed a bunch of bugs, like segfaults and things. There was a cool Open Space meeting at PyCon where he asked the community what kind of stuff they'd like to see in the bindings. I think he has plans for extending them a bit to make them more useful specifically for &lt;a href="http://twistedmatrix.com/"&gt;Twisted&lt;/a&gt;, but he's also very receptive to the community's patches and bug reports -- I think he's closed several bugs and patches since becoming maintainer.&lt;br /&gt;&lt;br /&gt;Anyway, please go check out &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=31249"&gt;the new release&lt;/a&gt; - it's less buggy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-5191929192443290681?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/5191929192443290681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=5191929192443290681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5191929192443290681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5191929192443290681'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/03/pyopenssl-07a1.html' title='pyOpenSSL 0.7a1'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-6940294642921095972</id><published>2008-03-22T21:06:00.003-05:00</published><updated>2008-03-23T10:41:27.915-05:00</updated><title type='text'>Another Twisted 8 pre-release</title><content type='html'>I just put out &lt;a href="http://twistedmatrix.com/users/radix/DIST"&gt;Twisted 8.0.0 pre-release 2&lt;/a&gt; (that link is temporary and will definitely not last past the release of Twisted 8). The changes are &lt;a href="http://twistedmatrix.com/users/radix/DIST/Twisted-8.0.0pre2/NEWS.txt"&gt;in the NEWS file&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It comes with newly improved Windows IOCP support as well as support for easy_install. You can easy_install the main &lt;a href="http://twistedmatrix.com/users/radix/DIST/Twisted-8.0.0pre2.tar.bz2"&gt;Twisted-8.0.0pre2.tar.bz2&lt;/a&gt;, but not the subprojects. When the final 8.0 release is out I'll register it on PyPI so that you can just type "easy_install Twisted" to get it.&lt;br /&gt;&lt;br /&gt;Please check out this pre-release and report bugs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-6940294642921095972?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/6940294642921095972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=6940294642921095972' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6940294642921095972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6940294642921095972'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/03/another-twisted-8-pre-release.html' title='Another Twisted 8 pre-release'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-8877916083021374553</id><published>2008-03-21T20:47:00.002-05:00</published><updated>2008-03-21T20:50:46.109-05:00</updated><title type='text'>PyCon 2k8</title><content type='html'>I'm not sure what to say. I was really happy to be at PyCon. It was bigger than ever. I only attended one talk, other than a couple of keynotes. The most important Keynote, of course, was the &lt;a href="http://labs.twistedmatrix.com/"&gt;announcement of Twisted's membership in the Software Freedom Conservancy&lt;/a&gt;. You can now give Twisted tax-deductible money. &lt;a href="http://twistedmatrix.com/"&gt;Please donate!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I also released &lt;a href="http://twistedmatrix.com/users/radix/DIST/"&gt;Twisted 8.0 prerelease 1&lt;/a&gt;. Please download it and check it out. I hope to have a second prerelease soon, which will include a much improved IOCP reactor and easy_install support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-8877916083021374553?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/8877916083021374553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=8877916083021374553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8877916083021374553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8877916083021374553'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/03/pycon-2k8.html' title='PyCon 2k8'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-4742471681193667469</id><published>2008-03-04T13:35:00.006-05:00</published><updated>2008-03-04T13:44:14.618-05:00</updated><title type='text'>Amazon MP3 Store now supports Ubuntu</title><content type='html'>So, I noticed that Nine Inch Nails released their new album, &lt;a href="http://ghosts.nin.com/"&gt;Ghosts&lt;/a&gt;. The official web site that sells FLACs was slashdotted at the time but I noticed that they were also selling the album on &lt;a href="http://www.amazon.com/MP3-Music-Download/b?node=163856011"&gt;Amazon MP3&lt;/a&gt;. Clicking around randomly for a while I noticed that they finally released their downloader software for Linux, including packages for Ubuntu. I think previously it was impossible (or at least hard) to buy and download entire albums without this downloader, so this is basically the first time that Linux users can use Amazon's MP3 service.&lt;br /&gt;&lt;br /&gt;I had a problem with it, though: &lt;span style="font-weight: bold;"&gt;when I downloaded one of the .amz files to run with the downloader app, the application failed to do anything but display a blank download window&lt;/span&gt;. Long story short: it refuses to open files that it doesn't have write permission to. I guess firefox 3 or Hardy saves downloaded files as mode 400. Amazon downloader fails to report any error, unfortunately, so the only way I figured this out was by stracing it. Just &lt;span style="font-weight: bold;"&gt;chmod u+w foo.azw&lt;/span&gt; and then the downloader will happily work. I've reported the bug to Amazon support, hopefully there will be a fix soon before they start losing loads of customers who waste their money on something they can't download.&lt;br /&gt;&lt;br /&gt;Other than this technical glitch I'm very happy with Amazon's MP3 service so far. It's great that there's actually a high-profile DRM-free music service. I just wish they would do the same thing with their eBooks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-4742471681193667469?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/4742471681193667469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=4742471681193667469' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4742471681193667469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4742471681193667469'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/03/amazon-mp3-store-now-supports-ubuntu.html' title='Amazon MP3 Store now supports Ubuntu'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-7882033596725637785</id><published>2008-01-19T13:09:00.000-05:00</published><updated>2008-01-19T13:10:39.767-05:00</updated><title type='text'>How to create an archive</title><content type='html'>Why the hell do people who write ray tracers, whether in Python, Haskell, or Erlang, always put all the files into the top level of the archive instead of creating a subdirectory?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-7882033596725637785?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/7882033596725637785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=7882033596725637785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7882033596725637785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7882033596725637785'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/01/how-to-create-archive.html' title='How to create an archive'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-1309064362615584288</id><published>2008-01-03T16:04:00.000-05:00</published><updated>2008-01-03T16:50:27.765-05:00</updated><title type='text'>x61 kill switch</title><content type='html'>&lt;em&gt;Update: Oh look, there's a kill switch down there underneath the front of the computer. I must have hit in with my stomach. Why does my computer have two kill switches? Well, whatever, I'm writing this update on my X61 with working wireless.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Hi. I received my Thinkpad x61 recently, with the &lt;a href="http://www.thinkwiki.org/wiki/Intel_PRO/Wireless_3945ABG_Mini-PCI_Express_Adapter"&gt;Intel PRO/Wireless 3945 ABG&lt;/a&gt; wireless chip.&lt;br /&gt;&lt;br /&gt;Things were going (fairly) well, but today my kill switch got activated, probably when I was trying to toggle my wireless off and then on after hibernating. And now I can't turn off the kill switch (that is to say, I can't turn my wireless back on). I hit Function-F5 and nothing happens; the wireless light remains dark. Of course, the ipw3945 and iwl3945 drivers both just say "Radio Frequency Kill Switch is On" when they're installed at boot (or when I modprobe them manually). This happened in Gutsy and in Hardy, which I upgraded to to see if it would be fixed.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/search?q=x61+kill+switch"&gt;Any ideas?&lt;/a&gt; It almost looks like &lt;a href="https://bugs.launchpad.net/ubuntu/gutsy/+source/linux-ubuntu-modules-2.6.22/+bug/121415"&gt;bug #121415&lt;/a&gt;, but not really: I'm even worse off than those people, since I can't enable my wireless chip in any way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-1309064362615584288?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/1309064362615584288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=1309064362615584288' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1309064362615584288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1309064362615584288'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2008/01/x61-kill-switch.html' title='x61 kill switch'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-7501226546414058597</id><published>2007-12-24T02:17:00.001-05:00</published><updated>2007-12-24T02:22:40.096-05:00</updated><title type='text'>unit testing code that uses third party libraries</title><content type='html'>In the year 3000, our libraries will come with verified-equivalent implementations of their APIs that users can use to unit test their code, when the normal implementation is inappropriate.&lt;br /&gt;&lt;br /&gt;Our libraries will also have thorough documentation on how to unit test code that interacts with them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-7501226546414058597?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/7501226546414058597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=7501226546414058597' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7501226546414058597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7501226546414058597'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/12/unit-testing-code-that-uses-other-third.html' title='unit testing code that uses third party libraries'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-8600623999228439906</id><published>2007-12-05T17:40:00.000-05:00</published><updated>2007-12-05T20:20:41.772-05:00</updated><title type='text'>Kindle</title><content type='html'>I was kind of embarrassed, but now I'm coming out into the open. I got a Kindle. This was a hard decision to make (making the blog post, not buying the Kindle. It was an impulse purchase).  Everyone was ridiculing Amazon for producing such a stupid and crippled device. After playing around with it and actually reading some stuff on it, though, I can justify it to myself. The price was pretty stupid, but the value is pretty great. Let me list the things that aren't really well advertised on the &lt;a href="http://kindle.com/"&gt;Kindle site&lt;/a&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Free web browsing&lt;/em&gt;. This is the biggest one. They mentioned some stuff about looking up articles on Wikipedia, but it sounded like that was a special-cased service and they wouldn't allow arbitrary web browsing. They do. And it's free. You can browse to sites like &lt;a href="http://manybooks.net/"&gt;manybooks.net&lt;/a&gt; and download ebooks. Or check up on the &lt;a href="http://twistedmatrix.com/trac/report/11"&gt;Twisted review queue&lt;/a&gt;. Whatever. Apparently there's even some javascript support, but I have a hard time believing anything of interest is supported (definitely no XHR, guys). I think the reason they didn't advertise this very well is that it makes using their &lt;a href="http://www.amazon.com/ref=kinw_ddp/b?node=241647011"&gt;blog subscription service&lt;/a&gt; &lt;em&gt;absolutely idiotic&lt;/em&gt;.&lt;/li&gt;&lt;li&gt;The format support is better than it looks. You can download your bookwarez or your Project Gutenberg texts or whatever. You can transfer .txt and .azw files directly, and it &lt;strong&gt;does&lt;/strong&gt; support the MOBI format. All you have to do is rename your mobi file to .azw and the Kindle will pick it right up. It's totally idiotic that they didn't advertise the native MOBI support (they do advertise that it works with their free conversion service. That must be one of the easier converters to write).&lt;/li&gt;&lt;li&gt;It looks like they have a good attitude towards future development: Right in the home menu there's an "Experimental" item which leads to three cool things: Basic Web (see point 1), Ask Kindle &lt;a href="http://nownow.com/"&gt;NowNow&lt;/a&gt;, and Play Music. Yeah, it'll play mp3 files, either with its built-in speaker or through headphones. The Ask Kindle NowNow thing is kind of neat, but it's not that exciting given that they have a web browser that's quite capable of viewing google.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Here are the things that they do advertise, and that they were right to advertise:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The display is damned snazzy. I'm surprised every time I glance over and can actually see what's on the screen when the Kindle is lying at some odd angle to my line of sight.&lt;/li&gt;&lt;li&gt;Yeah, it's full of DRM, but it is really frickin' cool to be able to find, buy, and download a book in a minute or two. Now when people recommend that I buy some book or another, I'll actually be able to get it instead of (forget to) write it down on a list somewhere and (forget to) buy it at some book store the next time I'm around one.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I'll bet that within a year or so there will be working cracks to de-DRM an AZW file. Like I said above, it seems to just be a mobi file, but with some encryption added. The DRM is the thing that worries me the most, even as a consumer, since I'm wondering if I'll be able to read these books in ten years. But given the Kindle's support for other formats, you could keep yourself busy reading nothing but non-DRMed content acquired from places other than Amazon.&lt;br /&gt;&lt;br /&gt;The stupid things follow:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I can't copy an .html file to the Kindle and view it. Even though it has a web browser, there's no way to look at local content with it, as far as I can tell. You can send them to the free conversion service and get back an .azw, though. Or put them on the web and view them with the web browser :-).&lt;/li&gt;&lt;li&gt;The books are kind of expensive. I'm used to paying about $7 or $8 for a paperback, and the books seem to consistently be about $9 or $10. Given the convenience, as a consumer I'm not annoyed (as a socialist, I am. Production cost for a bunch of bits is less than $10). And it's actually *way* cheaper to buy a Kindle book than a new hardback release, since paperback releases are often delayed. I bought Pratchett's latest novel, &lt;em&gt;Making Money&lt;/em&gt;, which I haven't seen in paperback yet, for $10 instead of the at least $20 that I'd pay at a brick and mortar store.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Ok. So I got it, and I'm pretty happy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-8600623999228439906?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/8600623999228439906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=8600623999228439906' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8600623999228439906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8600623999228439906'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/12/kindle.html' title='Kindle'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-7927988124462101769</id><published>2007-12-02T22:32:00.000-05:00</published><updated>2007-12-02T22:44:53.285-05:00</updated><title type='text'>Supporting both asynchronous and synchronous interfaces with SynchronousDeferred</title><content type='html'>Today I wrote a thing called &lt;a href="http://launchpad.net/synchronous-deferred"&gt;SynchronousDeferred&lt;/a&gt;. The target audience is made of those who are writing libraries that want to support both blocking and non-blocking interfaces. I wrote it to allow me to use &lt;a href="http://openidenabled.com/python-openid/"&gt;python-openid&lt;/a&gt; in a non-blocking way. After totally refactoring it to use SynchronousDeferred, of course.&lt;br /&gt;&lt;br /&gt;Basically the way you use it is that you write your entire library in the way you would normally write it with Twisted: use Deferreds everywhere. There are two major differences, one at the outermost parts of your library and one at the innermost, and one rule on how they interact:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;In your blocking entrypoints, return the result of SynchronousDeferred.synchronize() instead of the deferred itself&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Anywhere you would do some long-running task, wrap SynchronousDeferreds around the blocking implementations but make the non-blocking implementations return regular Deferreds.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;When the user is using asynchronous entrypoints, try to use asynchronous low-level APIs. When the user is using synchronous entrypoints, &lt;em&gt;definitely&lt;/em&gt; only use synchronous (SynchronousDeferred-returning) APIs.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;synchronize&lt;/code&gt; returns or raises the current value on a SynchronousDeferred immediately.&lt;br /&gt;&lt;br /&gt;SynchronousDeferred doesn't have &lt;code&gt;callback&lt;/code&gt; or &lt;code&gt;errback&lt;/code&gt; methods like normal deferreds, as you have to pass the initial value of the Deferred straight to the constructor.&lt;br /&gt;&lt;br /&gt;Project page: &lt;a href="http://launchpad.net/synchronous-deferred"&gt;http://launchpad.net/synchronous-deferred&lt;/a&gt;&lt;br /&gt;Code browse: &lt;a href="http://codebrowse.launchpad.net/~radix/synchronous-deferred/trunk/files"&gt;http://codebrowse.launchpad.net/~radix/synchronous-deferred/trunk/files&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-7927988124462101769?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/7927988124462101769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=7927988124462101769' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7927988124462101769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7927988124462101769'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/12/supporting-both-asynchronous-and.html' title='Supporting both asynchronous and synchronous interfaces with SynchronousDeferred'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-8173889914706121399</id><published>2007-11-24T21:41:00.001-05:00</published><updated>2007-11-24T22:23:32.550-05:00</updated><title type='text'>Representing symmetric relations in a relational database</title><content type='html'>I haven't searched &lt;em&gt;terribly&lt;/em&gt; hard, but I can't find very much information on the Internet about clever and efficient ways of representing and querying for symmetric relationships in relational databases. I've thought up a few options, so I'll spew them onto my blog to get feedback. The keen researcher will probably want to do more googling for representations of undirected graphs in RDBs, since undirected edges are a prime example of a symmetric relationship.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schema 1&lt;/strong&gt;&lt;br /&gt;&lt;pre&gt;CREATE TABLE some_relationship (participant1 INTEGER, participant2 INTEGER)&lt;/pre&gt;&lt;br /&gt;This is the most trivial and straightforward in-database representation of a symmetric relationship between two participants. Actually, this schema could represent an asymmetric relationship as well, but we'll write our queries and application code so that (participant1=X, participant2=Y) is treated the same as (participant1=Y, participant2=X).&lt;br /&gt;&lt;br /&gt;This schema still leaves us with some decisions. For the simplest possible query,&lt;br /&gt;&lt;pre&gt;SELECT participant2 FROM some_relationship WHERE participant1 = X&lt;/pre&gt;&lt;br /&gt;we would need to store each relationship in the table twice for each relationship, one of them inverted.&lt;br /&gt;&lt;br /&gt;If you don't want to duplicate each relationship in the table (I sure don't), then we have to have a more complex query (and more complex way of processing the result).&lt;br /&gt;&lt;pre&gt;SELECT participant1, participant2 FROM some_relationship WHERE participant1 = X OR participant2 = X&lt;/pre&gt;&lt;br /&gt;Then we must go through the results of this query, and for each of them say "If p1 = x then treat p2 as the other participant; if p2 = x then treat p1 as the other participant." I'm also not sure how well this query will perform (on any database), even if both participant columns are indexed.&lt;br /&gt;&lt;br /&gt;Both of these are annoying. The first requires explicit duplication of data which may become inconsistent, and the second is very tedious to query for.&lt;br /&gt;&lt;br /&gt;Here's another idea:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Schema 2&lt;/strong&gt;&lt;br /&gt;&lt;pre&gt;CREATE TABLE some_relationship (relation_id INTEGER, participant INTEGER)&lt;/pre&gt;&lt;br /&gt;This one allows us to avoid explicit duplication in the table and also allows us to just query against one participant column. For every new relationship (X &lt;-&gt; Y), you'd insert two rows consisting of a unique ID for this particular relation and each participant. The two relationships (50 &lt;-&gt; 51) and (50 &lt;-&gt; 52), you'd insert four rows::&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;INSERT INTO some_relationship VALUES (1, 50)&lt;br /&gt;INSERT INTO some_relationship VALUES (1, 51)&lt;br /&gt;&lt;br /&gt;INSERT INTO some_relationship VALUES (2, 50)&lt;br /&gt;INSERT INTO some_relationship VALUES (2, 52)&lt;/pre&gt;&lt;br /&gt;Then, to get all participants related to 50, you'd do the query::&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;SELECT participant FROM some_relationship &lt;br /&gt;    WHERE relation_id IN (SELECT relation_id FROM some_relationship&lt;br /&gt;                          WHERE participant = 50)&lt;br /&gt;    AND participant != 50&lt;/pre&gt;&lt;br /&gt;This query is pretty complex, but at least it gives us exactly the results we want (no post-processing to decide which participant is the "other" participant, like in the second usage of Schema 1 that I discussed above. And hey, we don't have any weird duplication in our data. By the way, if you were to use this schema, you'd want to create indexes on both relation_id and participant.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Extra data and Schema 3&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;However, Schema 2 has some problems which Schema 1 doesn't have. What if you want to add some extra metadata to the relationship? If you're representing "similarity", for example, you may want to add a "strength" column to represent the fact that two items are more similar than two other items. Encoding this data into Schema 1 is very simple: just add the other column, and grab it out in your queries, and it's in as convenient a form as it's going to get. Encoding it into Schema 2, however, is extremely awkward because the relationship is split over multiple rows. This can be solved, however, by sticking that data into another table entirely. We can even leave Schema 2 exactly how it is, except for adding a REFERENCES annotation to the relation_id if your database supports it and you're so inclined.&lt;br /&gt;&lt;pre&gt;CREATE TABLE similarity (&lt;br /&gt;    relation_id INTEGER REFERENCES similarity_data (id),&lt;br /&gt;    participant INTEGER)&lt;br /&gt;&lt;br /&gt;CREATE TABLE similarity_data (&lt;br /&gt;    id INTEGER,&lt;br /&gt;    strength INTEGER)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;But then getting data in a useful form out of these two schemas becomes even more complex. I'll leave that as an exercise for the reader. Doing it without application-code processing and multiple queries will probably involve DISTINCT and a join.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Well what the heck&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I still don't know which option I'll use for my application. Any input, bagoblog?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-8173889914706121399?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/8173889914706121399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=8173889914706121399' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8173889914706121399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8173889914706121399'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/11/representing-symmetric-relations-in.html' title='Representing symmetric relations in a relational database'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-1624828623152549013</id><published>2007-11-15T09:29:00.001-05:00</published><updated>2007-11-16T10:06:58.273-05:00</updated><title type='text'>Don't use Postgres's currval()</title><content type='html'>Using Postgresql's currval() function in a WHERE clause is a really bad idea. &lt;a href="http://archives.postgresql.org/pgsql-general/2005-04/msg01256.php"&gt;It will cause a full sequence scan on your table&lt;/a&gt;, no matter what. If you're unfamiliar with database lingo, "full sequence scan" means "This application is too slow! You're fired".&lt;br /&gt;&lt;br /&gt;I was using it to get the identity of the row most recently inserted. This is a bad idea. Apparently "INSERT INTO foo VALUES () RETURNING id" is a much better idea, if you're using Postgres.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Update:&lt;/em&gt; If you're using a version of Postgres &lt; 8.2, you can't use RETURNING. A work around is to do "INSERT INTO foo VALUES (); SELECT id FROM foo WHERE id = (SELECT currval('foo_id_seq'))". This prevents Postgres from noticing the currval is being compared by forcing the evaluation early, so no sequence scan.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-1624828623152549013?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/1624828623152549013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=1624828623152549013' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1624828623152549013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1624828623152549013'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/11/dont-use-postgress-currval.html' title='Don&apos;t use Postgres&apos;s currval()'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-2152454772715711926</id><published>2007-10-16T13:00:00.000-05:00</published><updated>2007-10-16T13:27:35.682-05:00</updated><title type='text'>Don't expect os.environ.pop to do anything meaningful</title><content type='html'>It doesn't actually remove things from the environment, just from its local copy of the environment. The Python developers seem to simply have left it out of their implementation in os.py. &lt;a href="http://labix.org/"&gt;Gustavo Niemeyer&lt;/a&gt; noticed this one.&lt;br /&gt;&lt;pre&gt;&gt;&gt;&gt; import os&lt;br /&gt;&gt;&gt;&gt; os.system("echo $ASD")&lt;br /&gt; &lt;br /&gt;0&lt;br /&gt;&gt;&gt;&gt; os.environ["ASD"] = "asd"&lt;br /&gt;&gt;&gt;&gt; os.system("echo $ASD")&lt;br /&gt;asd&lt;br /&gt;0&lt;br /&gt;&gt;&gt;&gt; os.environ.pop("ASD")&lt;br /&gt;'asd'&lt;br /&gt;&gt;&gt;&gt; os.system("echo $ASD")&lt;br /&gt;asd&lt;br /&gt;0&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-2152454772715711926?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/2152454772715711926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=2152454772715711926' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2152454772715711926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2152454772715711926'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/10/dont-expect-osenvironpop-to-do-anything.html' title='Don&apos;t expect os.environ.pop to do anything meaningful'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-7948443510871456128</id><published>2007-10-14T11:00:00.000-05:00</published><updated>2007-10-14T11:25:04.942-05:00</updated><title type='text'>The Orange Box</title><content type='html'>As I was telling Jp yesterday, Valve has become masterful at creating near-perfect interactive multimedia experiences. That is to say, &lt;a href="http://orange.half-life2.com/portal.html"&gt;Portal&lt;/a&gt; is frickin' awesome. As Tycho says, they have proven the &lt;a href="http://www.penny-arcade.com/2007/10/12"&gt;first person puzzle comedy&lt;/a&gt; genre.&lt;br /&gt;&lt;br /&gt;1. It's short, but includes a satisfying amount of story content (especially if you snoop around a bit. Look for a slide show).&lt;br /&gt;2. It is thoroughly and consistently hilarious, while maintaining its drama.&lt;br /&gt;3. It has a very cool style and atmosphere, starting out strange and eventually growing spooky.&lt;br /&gt;4. The music is excellent; Valve has always been good at timing their distinct music to maximize emotional response. Plus they got &lt;a href="http://jonathancoulton.com/"&gt;Jonathan Coulton&lt;/a&gt; to write the ending theme song (yes, there's an ending theme song!).&lt;br /&gt;&lt;br /&gt;They have an interactive commentary version of each level of the game that you can play as soon as you've completed the respective level. It shows how they've thought about extremely subtle things. I would really like to see how someone who's never played a first person shooter gets along with it.&lt;br /&gt;&lt;br /&gt;Moving on to the rest of the Half Life universe (which Portal very intriguingly refers to), &lt;a href="http://orange.half-life2.com/hl2ep2.html"&gt;Half Life 2 Episode 2&lt;/a&gt; offers many of the same qualities. It's not as much of a comedy, but they make up for it. I don't know what else to say about EP2, really; if you can even &lt;i&gt;tolerate&lt;/i&gt; first person shooters but have not yet played any Half Life 2 games, then you are missing out on a very good artistic, dramatic, and cerebral experience. And it keeps getting better with every episode.&lt;br /&gt;&lt;br /&gt;Which reminds me: I have an extra copy each of Half Life 2 and Half Life 2: Episode 1 burning holes in my pocket; Valve has set Steam up such that I can give a copy of those to someone else since I already owned them when I bought the Orange Box, which includes them again. Who wants them?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-7948443510871456128?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/7948443510871456128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=7948443510871456128' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7948443510871456128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7948443510871456128'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/10/orange-box.html' title='The Orange Box'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-7738436600252437154</id><published>2007-10-10T14:57:00.000-05:00</published><updated>2007-10-10T15:05:08.970-05:00</updated><title type='text'>Why thank you</title><content type='html'>I came across a &lt;a href="https://lists.ubuntu.com/archives/ubuntu-server/2007-October/000802.html"&gt;review&lt;/a&gt; of &lt;a href="http://canonical.com/landscape"&gt;Landscape&lt;/a&gt; written by Kristian Erik Hermansen. He also goes on about how great &lt;a href="http://twistedmatrix.com/"&gt;Twisted&lt;/a&gt; is, and how he apparently used it while working at Cisco. It made me happy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-7738436600252437154?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/7738436600252437154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=7738436600252437154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7738436600252437154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7738436600252437154'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/10/why-thank-you.html' title='Why thank you'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-8497789584656760719</id><published>2007-10-07T20:05:00.000-05:00</published><updated>2007-10-07T20:36:36.621-05:00</updated><title type='text'>Coherence</title><content type='html'>It turns out &lt;a href="https://coherence.beebits.net/"&gt;Coherence&lt;/a&gt; is a bit better at serving music to my Xbox 360 than uShare is. Currently my setup is improved over uShare thusly:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It doesn't include non-genre/album/artist/playlist entries in those respective categories (that was a very strange thing on uShare's part; it put individual files in those categories, or at least that's what the xbox saw)&lt;/li&gt;&lt;li&gt;My xbox hasn't frozen up while playing media from it yet.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I was playing &lt;a href="http://www.wikgame.com/"&gt;Wik&lt;/a&gt; while listening to &lt;a href="http://en.wikipedia.org/wiki/Sunny_Day_Real_Estate"&gt;Sunny Day Real Estate&lt;/a&gt; today. That was confusing.&lt;br /&gt;&lt;br /&gt;It's also written with &lt;a href="http://twistedmatrix.com/"&gt;Twisted&lt;/a&gt;, which is neat. There is also theoretically support for meaningfully listing Artists and Albums, but the plugin which is responsible for that is not working for me yet.&lt;br /&gt;&lt;br /&gt;Fortunately a developer was around to help me out with configuring it. I'll show you how I got it working, but I'll skip all the parts about installing Coherence and its dependencies (which was very easy for me). All of the dependencies are either in Ubuntu or are part of the software stack that I have development checkouts of (Twisted, Nevow, Divmod stuff).&lt;br /&gt;&lt;br /&gt;First create a file with the following contents:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;logmode = warning&lt;br /&gt;interface = eth1&lt;br /&gt;web-ui = yes&lt;br /&gt;&lt;br /&gt;[subsystem_log]&lt;br /&gt;&lt;br /&gt;[plugins]&lt;br /&gt;    [[FSStore]]&lt;br /&gt;        content = /home/radix/Media&lt;br /&gt;        name = Coherence Test Content&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then run ./bin/coherence -c /path/to/your-coherence.conf&lt;br /&gt;&lt;br /&gt;Coherence has a way to go, as its web site explains: "This is still young software! It won't destroy any data - at least it isn't supposed to ;-) - but it might not yet fulfill your expectations in your particular environment." Etc.&lt;br /&gt;&lt;br /&gt;Here's a hint, guys: &lt;br /&gt;&lt;br /&gt; 1. WRITE UNIT TESTS. Preferably before you write implementation. Please. Your software is doomed to suckiness if you don't have a good suite of unit tests.&lt;br /&gt;&lt;br /&gt; 2. Don't use 0 as a default web server port. I shouldn't have to run "netstat -nlp | grep python" and guess at ports to find out where my web UI is. Either choose something like 8080 (and document it) or show an error message if there isn't one. OTOH, this isn't a big deal right now since the web UI doesn't really do anything.&lt;br /&gt;&lt;br /&gt; 3. Make your software easier to set up and use, and write better documentation. I know this goes without saying, but here's a suggestion: every contribution should be peer reviewed and ensured to have full documentation. It's really much easier to keep the quality of your code and documentation high when you have a strict set of rules in place, as we Twisted developers have learned.&lt;br /&gt;&lt;br /&gt;However, good job on giving me a media server that sucks less! I'll be filing bugs and working with it until I can get a movie to play :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-8497789584656760719?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/8497789584656760719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=8497789584656760719' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8497789584656760719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8497789584656760719'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/10/coherence.html' title='Coherence'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-5413863078027197443</id><published>2007-10-06T13:53:00.000-05:00</published><updated>2007-10-06T14:17:14.571-05:00</updated><title type='text'>playing media on an Ubuntu system with my xbox 360</title><content type='html'>Just to give it a bit more google juice: &lt;a href="http://ushare.geexbox.org/"&gt;ushare&lt;/a&gt; can act as a replacement for Windows Media Center for playing media hosted on a linux box on your XBox 360. I googled for quite a while before figuring out what exactly I needed (and I learned that UPNP has media protocols. wacky.)&lt;br /&gt;&lt;br /&gt;1. Install the Ubuntu .deb (you're using Ubuntu, right?).  The direct link on their web site to the .deb is a 404 -- I browsed their pool directory to find &lt;a href="http://www.geexbox.org/debian/pool/main/ushare/"&gt;the directory with ushare debs&lt;/a&gt;. Download whichever one you need, for your 32bit or 64bit OS. You can also add their deb line to your Software Sources.&lt;br /&gt;&lt;br /&gt;2. Edit the configuration file to change which interface to listen on, because the -i (--interface) option doesn't actually work (or the configuration file takes precedence). Pretty lame.&lt;br /&gt;&lt;br /&gt;3. Run "ushare --xbox --content ~/Media".&lt;br /&gt;&lt;br /&gt;4. Go to the media tab of your Xbox 360 and browse movies and music. They'll be listed.&lt;br /&gt;&lt;br /&gt;There are several problems. First, I haven't managed to play any movies — I probably just need to transcode them to whatever codec the 360 supports with mencoder. Second, all unrecognized files seem to end up under the Music section, so there's lots of cruft in there. Third, it doesn't seem to recognize Artists, Albums, Playlists or Genres separately from Songs. That is, all of my files are showing up in all of those sections through the 360 media browser. I guess that this is a ushare bug, but I don't know. The last problem is that it seems music will just stop playing in the middle of a song.  I tried starting the music again but it just froze my entire xbox. It looks like ushare still needs some tweaks to be less flaky.&lt;br /&gt;&lt;br /&gt;Oh yeah, btw. &lt;a href="http://www.bungie.net/Stats/Halo3/Default.aspx?player=radeex"&gt;I&lt;/a&gt; got an Xbox 360. Sorry guys. Halo 3 is really awesome. I'm radeex in the Recreation zone. &lt;a href="http://live.xbox.com/en-US/profile/profile.aspx?GamerTag=radeex"&gt;Friend me&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-5413863078027197443?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/5413863078027197443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=5413863078027197443' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5413863078027197443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5413863078027197443'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/10/playing-media-on-ubuntu-system-with-my.html' title='playing media on an Ubuntu system with my xbox 360'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-5785758742238285494</id><published>2007-09-03T14:39:00.000-05:00</published><updated>2007-09-03T14:43:31.999-05:00</updated><title type='text'>Oh right, that Storm talk went well</title><content type='html'>Doug Napoleone was kind enough to post my &lt;a href="http://python-groups.blogspot.com/2007/08/cambridge-python-podcasts-and-slides.html"&gt;slides and a recording of my Storm talk&lt;/a&gt; from last month. It went pretty well. I've &lt;a href="http://twistedmatrix.com/users/radix/storm-talk/"&gt;mirrored&lt;/a&gt; the slides and audio locally.&lt;br /&gt;&lt;br /&gt;That's all!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-5785758742238285494?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/5785758742238285494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=5785758742238285494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5785758742238285494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5785758742238285494'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/09/oh-right-that-storm-talk-went-well.html' title='Oh right, that Storm talk went well'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-3335435726751390472</id><published>2007-08-11T17:27:00.001-05:00</published><updated>2007-08-12T11:18:19.806-05:00</updated><title type='text'>Storm talk at the Cambridge Python Meetup</title><content type='html'>I'm going to be giving a talk on Storm at this month's Cambridge Python Meetup (that's the Cambridge in Massachusetts, not the one in the UK). It's in Somerville, actually, closeish to Porter Square. If you'd like to go, &lt;a href="http://python.meetup.com/181/calendar/6044211/"&gt;sign up on the meetup site&lt;/a&gt;. Once you sign up you'll be able to see the address, but apparently you shouldn't trust the map that's linked, because it's wrong. Instead paste the address into google maps, I guess.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-3335435726751390472?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/3335435726751390472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=3335435726751390472' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/3335435726751390472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/3335435726751390472'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/08/storm-talk-at-cambridge-python-meetup.html' title='Storm talk at the Cambridge Python Meetup'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-2175013400281232442</id><published>2007-08-08T17:12:00.000-05:00</published><updated>2007-08-08T20:13:30.831-05:00</updated><title type='text'>Storm 0.10</title><content type='html'>I've just put out Storm 0.10. It has been Improved.&lt;br /&gt;&lt;br /&gt;Web site: &lt;a href="http://storm.canonical.com/"&gt;http://storm.canonical.com/&lt;/a&gt;&lt;br /&gt;Downloads: &lt;a href="https://launchpad.net/storm/+download"&gt;https://launchpad.net/storm/+download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the first release that includes outside help! Our community is already fairly active.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Edit: I forgot to mention that I spent a lot of time yesterday and today working on &lt;a href="http://twistedmatrix.com/users/radix/storm-api/"&gt;API docs for Storm&lt;/a&gt;. They're currently hosted in my own web space, but they'll probably be moved somewhere more appropriate on http://storm.canonical.com/ soonish.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-2175013400281232442?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/2175013400281232442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=2175013400281232442' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2175013400281232442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2175013400281232442'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/08/storm-010.html' title='Storm 0.10'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-1186740422454942825</id><published>2007-07-23T08:29:00.000-05:00</published><updated>2007-07-23T08:30:57.551-05:00</updated><title type='text'>IT'S PUBLIC!</title><content type='html'>&lt;strong&gt;This&lt;/strong&gt; is what I have been working on for the past year and months.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ubuntu.com/news/landscape-system-management-tool"&gt;Canonical Launches Web-Based Systems Management Tool For Ubuntu Deployments&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-1186740422454942825?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/1186740422454942825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=1186740422454942825' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1186740422454942825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1186740422454942825'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/07/its-public.html' title='IT&apos;S PUBLIC!'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-5271707953487151408</id><published>2007-07-16T19:26:00.000-05:00</published><updated>2007-07-16T19:55:19.815-05:00</updated><title type='text'>On Jargon</title><content type='html'>Sometimes computing jargon is pretty idiotic.&lt;br /&gt;&lt;br /&gt;Take the words "synchronous" and "asynchronous".&lt;br /&gt;&lt;br /&gt;A synchronous API is one which blocks until a result is available.&lt;br /&gt;&lt;br /&gt;An asynchronous API is one which returns immediately and lets you do other things until it notifies you of the result.&lt;br /&gt;&lt;br /&gt;Now take the English definitions:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  Synchronous \Syn"chro*nous\, a. [Gr. ?; sy`n with + ? time. Cf.&lt;br /&gt;     {Chronicle}.]&lt;br /&gt;     Happening at the same time; simultaneous.&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;&lt;br /&gt;  Asynchronous \A*syn"chro*nous\, a. [Gr. ? not + synchronous.]&lt;br /&gt;     Not simultaneous; not concurrent in time; -- opposed to&lt;br /&gt;     {synchronous}.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(taken from Webster's 1913 American English dictionary)&lt;br /&gt;&lt;br /&gt;So clearly the jargon meanings of the words are exactly the opposite of their English meanings. How did this come to be? I'm guessing it had something to do with the invention of preemptive threading. When preemptive threading came along, suddenly it was possible to make a blocking API  —one that does not allow other code to execute while it is executing, because it hasn't yet returned—to allow for some concurrency, or synchrony. Preemptive threading allows a blocking API to be used synchronously. Somewhere along the lines, I assume, people forgot about the part of the sentence "preemptive threading allows ... to be used" and mangled it into "blocking = synchronous". The opposite of this, "asynchronous", soon followed, unrelated entirely to the actual semantics of APIs described as such.&lt;br /&gt;&lt;br /&gt;You'd better enjoy your crappy jargon while it lasts, programmers. When my revolution comes, you'll be the first up against the wall.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-5271707953487151408?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/5271707953487151408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=5271707953487151408' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5271707953487151408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5271707953487151408'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/07/on-jargon.html' title='On Jargon'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-7841670029704227237</id><published>2007-07-14T15:12:00.000-05:00</published><updated>2007-07-14T17:07:55.857-05:00</updated><title type='text'>Using a Nintendo DS Lite expansion cartridge in a classic DS</title><content type='html'>Last month I ordered a copy of the Nintendo DS Browser (by Opera) from Amazon. When it arrived I was all ready to start &lt;a href="http://www.penny-arcade.com/comic/2006/06/02"&gt;syphoning porns from the very air we breathe&lt;/a&gt;, but my dreams were to be cut short, as I discovered that the Opera browser requires a Memory Expansion Pak, which, while included, was incompatible with my *original* DS. It would only actually fit in a DS Lite. Through observation I deduced that the physical interface was basically the same and that it would probably work in my original DS, if it weren't for the lip that was on the top of the cartridge preventing me from actually pushing the thing far enough into the DS for it to make electronic contact. I decided that it was time for a hardware hack.&lt;br /&gt;&lt;br /&gt;All I needed to find was a file to rip off the lip so that it could be jammed in there. I didn't have one, of course, so I got the closest thing I could find: a giant bolt that Jp had left over from a table he built.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/radix/810657105/" title="Bolt vs Bottlecap"&gt;&lt;img src="http://farm2.static.flickr.com/1362/810657105_001951b045_m.jpg" width="240" height="180" alt="The tool" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After filing the lip off, my room smelled like burnt plastic all night. Oh well. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/radix/810656253/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1265/810656253_8af014a23e.jpg" width="500" height="375" alt="Filing complete" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then I tested that it would fit into the DS by half-inserting it upside down to see if the lip would fit past.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/radix/810656645/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1209/810656645_49f61979f2.jpg" width="500" height="375" alt="It fits!" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I then realized that if I actually put the cartridge into the DS, I would have no mechanism with which to remove it. I tried taping a twist-tie onto the cartridge but that proved pretty weak; I then realized that putting packing tape on both sides of the cartridge would be the best.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/radix/810656877/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1132/810656877_d9ed7e9f03.jpg" width="500" height="375" alt="The &amp;quot;handle&amp;quot;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Going in..&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/radix/810657041/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1195/810657041_59ebdad980.jpg" width="500" height="375" alt="It's going in..." /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I then jammed it the rest of the way in with the back end of my stylus.&lt;br /&gt;&lt;br /&gt;It works wonderfully. There may be other DS Lite-only expansion cartridges out there, and this technique will probably work on those. Tell me if you have any luck.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/radix/810657067/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1412/810657067_fba862d014.jpg" width="375" height="500" alt="ta-daa!" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-7841670029704227237?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/7841670029704227237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=7841670029704227237' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7841670029704227237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7841670029704227237'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/07/using-nintendo-ds-lite-expansion.html' title='Using a Nintendo DS Lite expansion cartridge in a classic DS'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1362/810657105_001951b045_t.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-3743435499609017909</id><published>2007-07-09T15:17:00.000-05:00</published><updated>2007-07-09T15:42:03.341-05:00</updated><title type='text'>Storm released</title><content type='html'>Canonical just released a Python-based ORM called Storm.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://storm.canonical.com/"&gt;http://storm.canonical.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mostly it was developed by &lt;a href="http://labix.org/"&gt;Gustavo Niemeyer&lt;/a&gt;, but since we're in the same team at Canonical and it's developed primarily for our project, I have contributed bits and pieces.&lt;br /&gt;&lt;br /&gt;Communal ties will of course require me to mention Storm in relation to &lt;a href="http://www.divmod.org/trac/wiki/DivmodAxiom"&gt;Axiom&lt;/a&gt;. While I'm still a big fan of Axiom, I do think Storm is definitely the best ORM (now) available for any project which needs to talk to a database other than SQLite, especially remotely.&lt;br /&gt;&lt;br /&gt;The design is simple and straightforward, and the code is well-tested. As a cranky, bitter young man, I must maintain my image; frankly, I'm really shocked by the low quality of the Leading ORMs available for Python or any other language. Storm, fortunately, does many of the things that are obvious to most people who are familiar with how to write software which uses an SQL database, and leaves out the useless crap. Of course, it's not perfect, but now that it's open source, we can accept your patches :-)&lt;br /&gt;&lt;br /&gt;Figuring out the best way to use Storm from an asynchronous codebase will be a challenge, probably, but there are techniques for it that are usable right now—one of them being "Just block because your indexes are defined to be fast"—but that isn't always appropriate. There are some other simple options, and maybe some complex ones too. I'll probably post (or get someone else to post) about those in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-3743435499609017909?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/3743435499609017909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=3743435499609017909' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/3743435499609017909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/3743435499609017909'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/07/storm-released.html' title='Storm released'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-889018960521639728</id><published>2007-06-01T13:07:00.000-05:00</published><updated>2007-06-01T13:14:16.687-05:00</updated><title type='text'>New Universal Hall Pass release</title><content type='html'>It's called Subtle Things, and it has three new tracks and three remixes of tracks on Mercury. You can get it online at Fonogenic.com.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fonogenic.com/releases/176"&gt;Mercury downloads&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fonogenic.com/releases/1033"&gt;Subtle Things downloads&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The official release page is on &lt;a href="http://www.sneakyrecords.net/buy.htm"&gt;Sneaky Records&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Subtle Things is worth the six bucks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-889018960521639728?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/889018960521639728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=889018960521639728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/889018960521639728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/889018960521639728'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/06/new-universal-hall-pass-release.html' title='New Universal Hall Pass release'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-1958542355397212303</id><published>2007-05-23T00:39:00.000-05:00</published><updated>2007-05-23T00:53:05.522-05:00</updated><title type='text'>The real time is passing, and I'm not in bed</title><content type='html'>Here's a hint: Twisted (in SVN trunk) now makes it much easier to write (and test) time-using code in a way that doesn't waste time waiting for real time to pass, and remains deterministic.&lt;br /&gt;&lt;br /&gt;Anything which uses the reactor to schedule timed calls (with &lt;a href="http://twistedmatrix.com/documents/current/api/twisted.internet.interfaces.IReactorTime.html#callLater"&gt;reactor.callLater&lt;/a&gt;) should parameterize it. Probably the only method you'll be calling on it is callLater (and then perhaps calling methods on the resultant &lt;a href="http://twistedmatrix.com/documents/current/api/twisted.internet.interfaces.IDelayedCall.html"&gt;DelayedCall&lt;/a&gt;), but maybe you'll also use the seconds method. The point is, you can pass an instance of &lt;a href="http://twistedmatrix.com/documents/current/api/twisted.internet.task.Clock.html"&gt;twisted.internet.task.Clock&lt;/a&gt; instead of the real reactor, and then you have a super-easy way to test your scheduling code reliably. Just call clock.advance(numberOfSeconds) in your test to pass simulated time (thus calling any scheduled calls scheduled for that time), or you can also access the .calls attribute which has a list of all pending DelayedCalls.&lt;br /&gt;&lt;br /&gt;Clock has been around for a while and has been in use in many tests, but the biggest new benefit is that you can now use this technique to simulate the passing of time for code which uses &lt;a href="http://twistedmatrix.com/documents/current/api/twisted.internet.task.LoopingCall.html"&gt;LoopingCall&lt;/a&gt;; just set your LoopingCall's .clock attribute to your Clock instance, and it'll use that for all scheduling.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-1958542355397212303?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/1958542355397212303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=1958542355397212303' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1958542355397212303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1958542355397212303'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/05/real-time-is-passing-and-im-not-in-bed.html' title='The real time is passing, and I&apos;m not in bed'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-1805551184791081655</id><published>2007-05-12T12:04:00.000-05:00</published><updated>2007-05-12T12:22:17.636-05:00</updated><title type='text'>Guards, Guards</title><content type='html'>&lt;a href="http://pandemoniumbooks.com/"&gt;Pandemonium Books&lt;/a&gt; put on a play performance of &lt;span style="font-style: italic;"&gt;Guards, Guards&lt;/span&gt;, the novel by Terry Pratchett (adapted by &lt;a href="http://www.cmotdibbler.com/"&gt;Stephen Briggs&lt;/a&gt;). It was neat. While I was there I discovered that Pandemonium Books may be a cool place to geek out, so I'll probably be visiting again.&lt;br /&gt;&lt;br /&gt;Speaking of geeking out, I hear &lt;a href="http://ordinalten.livejournal.com/"&gt;Tenth&lt;/a&gt; is moving up to Boston this weekend, and I've heard that he's threatening to run a role-playing game of some sort. Bring it on, I say.&lt;br /&gt;&lt;br /&gt;By the way, did you know PyPy can run Twisted-based Internet servers and clients now? Our conviction is like an arrow already in flight.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-1805551184791081655?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/1805551184791081655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=1805551184791081655' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1805551184791081655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1805551184791081655'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/05/guards-guards.html' title='Guards, Guards'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-1701846895689896029</id><published>2007-05-05T21:45:00.000-05:00</published><updated>2007-05-05T22:09:51.189-05:00</updated><title type='text'>It's over</title><content type='html'>My three-month marathon of 50% travel at Canonical sprints around the world is finally over. I spent two weeks in Dallas in February, two weeks in Montreal in March, and two weeks in London in April. Fortunately we didn't go too overboard in London, so I'm only somewhat totally exhausted. Now to *really* kick up the work.&lt;br /&gt;&lt;br /&gt;I'll be in Cambridge for at least a short while, hopefully. I may even be able to get back to Japanese classes; I had to cancel my previous semester for all of that travel.&lt;br /&gt;&lt;br /&gt;Oh yeah, I started &lt;a href="http://launchpad.net/game/"&gt;that thing&lt;/a&gt; again. This is, like, number eight or something. Or eighteen, depending on how you count.&lt;br /&gt;&lt;br /&gt;I finished &lt;span style="font-style: italic;"&gt;Jonathan Strange and Mr. Norrell&lt;/span&gt;. It's good. I reread &lt;span style="font-style: italic;"&gt;The Witches&lt;/span&gt; by Roald Dahl. That man is a genius. I also recently read a good portion of &lt;span style="font-style: italic;"&gt;The Cyberiad&lt;/span&gt;. It is not science fiction, don't believe what they say. It's about two demigods who can create machines that can do anything. The subtitle on the title page is accurate — &lt;span style="font-style: italic;"&gt;Fables for the Cybernetic Age&lt;/span&gt;.  The style is amazing, especially for a translation. &lt;span style="font-style: italic;"&gt;The Fifth Sally (A) or Trurl's Prescription&lt;/span&gt; would be brilliant as a beat poetry performance.&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Braindump over, peace out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-1701846895689896029?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/1701846895689896029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=1701846895689896029' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1701846895689896029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1701846895689896029'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/05/its-over.html' title='It&apos;s over'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-3047148049140337235</id><published>2007-04-01T22:42:00.000-05:00</published><updated>2007-04-01T22:59:02.804-05:00</updated><title type='text'>Things I learned in Harvard Square today</title><content type='html'>&lt;span style="font-family:arial;"&gt;There's an old hobo-looking guy who gives chess lessons on the cheap.&lt;br /&gt;&lt;br /&gt;Don't look at the top shelf in Tokyo Kid (a shop in The Garage).&lt;br /&gt;&lt;br /&gt;Mega-chains are destroying my ability to get tasty coffee from proud baristas.&lt;br /&gt;&lt;br /&gt;There are many pubs and restaurants I want to try out.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-3047148049140337235?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/3047148049140337235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=3047148049140337235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/3047148049140337235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/3047148049140337235'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/04/things-i-learned-in-harvard-square.html' title='Things I learned in Harvard Square today'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-7788272947310367303</id><published>2007-03-13T16:40:00.000-05:00</published><updated>2007-03-13T16:43:57.639-05:00</updated><title type='text'>Risen</title><content type='html'>I'm pretty amazed that &lt;a href="http://jcalderone.livejournal.com/30137.html"&gt;Jean-Paul has never played an MMO before&lt;/a&gt; - and I'm glad to be the one to inspire him to play Eve, mostly by distracting him while playing on my only Windows machine, which is at the office. If anyone wants to group, find us (is grouping a thing you do in Eve? I'm not even sure yet) - I'm Radaix the Minmatar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-7788272947310367303?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/7788272947310367303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=7788272947310367303' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7788272947310367303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/7788272947310367303'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/03/risen.html' title='Risen'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-5065530028864140506</id><published>2007-03-04T13:42:00.000-05:00</published><updated>2007-03-04T13:45:46.092-05:00</updated><title type='text'>PyCon 2k7</title><content type='html'>I just had an exhausting two weeks in Dallas at a Canonical sprint surrounding PyCon 2007. I took &lt;span style="font-weight: bold;"&gt;just&lt;/span&gt; the right amount of photos to fit into one month's worth of space on Flickr (100MB) during the PyCon weekend. There are a bunch more that came from the Canonical sprint, but I guess I will have to wait a month before I can upload them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://flickr.com/photos/radix/tags/pycon2007"&gt;radix's PyCon photos&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-5065530028864140506?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/5065530028864140506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=5065530028864140506' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5065530028864140506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5065530028864140506'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/03/pycon-2k7.html' title='PyCon 2k7'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-6640877522805659179</id><published>2007-02-14T21:18:00.000-05:00</published><updated>2007-02-14T21:37:45.505-05:00</updated><title type='text'>The Obnoxious Activity Monitor</title><content type='html'>I have also been hacking in free moments on a tool for tracking what I'm spending time on while working. It is a much more obnoxious tool than &lt;a href="http://mg.pov.lt/gtimelog/"&gt;gtimelog&lt;/a&gt;, for two reasons: first, I was forgetting to update gtimelog when I switched to working on something else, and second, when I left my computer to get lunch or a coffee gtimelog would not stop tracking my time. That last point may be desirable for some people who sometimes work away from their computer, but I never do, so it was problematic when I left without telling gtimelog I was taking a break.&lt;br /&gt;&lt;br /&gt;The Obnoxious Activity Monitor pops up a window every five minutes asking what you're working on, with a text entry for typing it in. The window will steal your keyboard focus, but it kindly blocks all input for one second so you don't accidentally activate anything. Whatever you typed in last time will be filled in by default, so if you are still working on that, you can just hit enter. If you have started working on something else, type in the new thing (it'll overwrite what's there because the text is selected by default). When you hit enter an ~/activity.txt file will be updated with your latest entry. If you don't respond to  dialog box for more than 30 seconds, O-A-M will stop tracking your time, assuming that you have gone on a coffee break or something. When you get back, latte in hand, the dialog box will still be there awaiting your next task.&lt;br /&gt;&lt;br /&gt;You may have noticed that I was quite detailed in describing the workflow and all the minor UI behavior of interacting with the window. This is important; if the application were not ergonomic enough, it would not be usable since I have to interact with it on such a regular basis. The common case is to simply hit the enter key, and nothing else (no clicking-to-focus, no clicking a button).&lt;br /&gt;&lt;br /&gt;The ~/activity.txt file is compatible with gtimelog, so you can use that to generate your daily or weekly reports (although you will have spurious lines in your report called 'start'; just delete them. I might actually get around to a real fix for that).&lt;br /&gt;&lt;br /&gt;The project is hosted on &lt;a href="http://launchpad.net/"&gt;Launchpad&lt;/a&gt;: &lt;a href="http://launchpad.net/obnoxious-activity-monitor/"&gt;obnoxious-activity-monitor&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-6640877522805659179?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/6640877522805659179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=6640877522805659179' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6640877522805659179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6640877522805659179'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/02/obnoxious-activity-monitor.html' title='The Obnoxious Activity Monitor'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-5004811471543392888</id><published>2007-02-14T19:50:00.000-05:00</published><updated>2007-02-14T20:27:39.993-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bzr'/><title type='text'>bzr and commit messages and IRC bots</title><content type='html'>I was playing around with the bzrlib API because I was writing a post-commit hook for sending messages to IRC, which I don't think has been done for bzr yet.&lt;br /&gt;&lt;br /&gt;It accompanies an IRC bot which I wrote which will hopefully be the last IRC bot I ever write (holy crap, I hate writing IRC bots): the bot simply listens on a TCP port for data to send to arbitrary IRC channels. This lets me solve a lot of IRC-notification use cases without writing any IRC code. The first application of it is the bzr commit bot.&lt;br /&gt;&lt;br /&gt;The project is hosted on &lt;a href="http://launchpad.net/"&gt;Launchpad&lt;/a&gt;: &lt;a href="http://launchpad.net/publish-bot/"&gt;publish-bot&lt;/a&gt;. If you want to use it, you first have to set up the publish-bot on a machine accessible from where you want to do the bzr-committing, and then set up the bzr commit message post-commit hook. The README file should explain this sufficiently.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-5004811471543392888?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/5004811471543392888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=5004811471543392888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5004811471543392888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5004811471543392888'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/02/bzr-and-commit-messages-and-irc-bots.html' title='bzr and commit messages and IRC bots'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-2663461653855694948</id><published>2007-02-14T16:31:00.000-05:00</published><updated>2007-02-14T16:33:24.747-05:00</updated><title type='text'>Web 1.0 mashup</title><content type='html'>&lt;a href="http://twistedmatrix.com/users/radix/productivity.html"&gt;Remember The Milk and Google Calendar&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-2663461653855694948?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/2663461653855694948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=2663461653855694948' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2663461653855694948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/2663461653855694948'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/02/web-10-mashup.html' title='Web 1.0 mashup'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-1024879108931167548</id><published>2007-02-09T20:24:00.000-05:00</published><updated>2007-02-14T20:32:28.475-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bzr'/><title type='text'>Bazaar API</title><content type='html'>I've been using the bzrlib API a bit lately to mess around with my bzr branches. Here's what I've learned.&lt;br /&gt;&lt;br /&gt;To get a BzrBranch object representing your on-disk branch:&lt;br /&gt;&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; from bzrlib.branch import BzrBranch&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; branch =  BzrBranch.open('.')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; branch&lt;br /&gt;BzrBranch5('file:///home/radix/Projects/test-project/')&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;To get the revision ID:&lt;br /&gt;&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; branch.last_revision()&lt;br /&gt;u'radix@twistedmatrix.com-20070210010145-s6am6e28f4lhbuyf'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To get the log message for the latest revision:&lt;br /&gt;&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; revision = branch.repository.get_revision(branch.last_revision())&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; revision.message&lt;br /&gt;'testing multi\nline commits\n'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Or for an arbitrary &lt;span style="font-style: italic;"&gt;revision number&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; branch.repository.get_revision(branch.get_rev_id(1)).message&lt;br /&gt;'hi'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;How about some more data from that particular revision:&lt;br /&gt;&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; revision.committer&lt;br /&gt;'Christopher Armstrong &amp;lt;radix@twistedmatrix.com&amp;gt;'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; revision.timestamp, revision.timezone&lt;br /&gt;(1171069305.8210001, -18000)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This should get you started. dir() and help() are your friend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-1024879108931167548?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/1024879108931167548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=1024879108931167548' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1024879108931167548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1024879108931167548'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/02/bazaar-api.html' title='Bazaar API'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-8181400385727828529</id><published>2007-01-04T11:48:00.000-05:00</published><updated>2007-01-04T11:55:55.751-05:00</updated><title type='text'>Search History</title><content type='html'>To belatedly continue the meme represented best (so far) by &lt;a href="http://xkcd.com/c155.html"&gt;Mr. XKCD&lt;/a&gt;, attached is a sample of my search history.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.flickr.com/photos/radix/345546703/" title="search history"&gt;&lt;img src="http://farm1.static.flickr.com/130/345546703_0f15551819_o.png" alt="search_history" border="0" height="210" width="212" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-8181400385727828529?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/8181400385727828529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=8181400385727828529' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8181400385727828529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8181400385727828529'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2007/01/search-history.html' title='Search History'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-4611524585551576315</id><published>2006-12-11T14:32:00.000-05:00</published><updated>2006-12-11T15:08:25.867-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pypy'/><category scheme='http://www.blogger.com/atom/ns#' term='learn-rpython'/><title type='text'>How to Do Something with RPython Part 1</title><content type='html'>Ok, so here's how to set up a new independent codebase which you want to write in RPython using the C backend. I use this kind of set up when hacking on Safelisp, which is a language totally unrelated to Python which I am implementing in RPython.&lt;br /&gt;&lt;br /&gt;This will take you through writing, translating, and running a program which prints "hello world" to standard out.&lt;br /&gt;&lt;br /&gt;I'll assume you have an SVN checkout of pypy at ~/Projects/pypy/.&lt;br /&gt;&lt;pre&gt;$ mkdir MyProjectInRPython&lt;br /&gt;$ cd MyProjectInRPython&lt;br /&gt;$ echo "This is my RPython-based project." &gt; README&lt;br /&gt;$ mkdir myproj&lt;br /&gt;$ touch myproj/__init__.py&lt;br /&gt;$ emacs myproj/myproj_target.py&lt;/pre&gt;And put the following code in the file:&lt;br /&gt;&lt;pre&gt;# __________  Entry point  __________&lt;br /&gt;&lt;br /&gt;def entry_point(argv):&lt;br /&gt;    print "hello world"&lt;br /&gt;    return 0&lt;br /&gt;&lt;br /&gt;# _____ Define and setup target ___&lt;br /&gt;&lt;br /&gt;def target(*args):&lt;br /&gt;    return entry_point, None&lt;/pre&gt;&lt;br /&gt;Now compile and run it.&lt;br /&gt;&lt;pre&gt;$ ~/Projects/pypy/pypy/translator/goal/translate.py  --batch myproj/myproj_target.py&lt;/pre&gt;[Lots and lots of output]&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ ./myproj_target-c&lt;br /&gt;hello world&lt;/pre&gt;&lt;br /&gt;That translate.py command is really long, so I generally put a symlink to it in my ~/bin named "pypy-translate". The --batch flag is meant to disable the interactive debugging facilities during translation -- if you leave it off, a very nice pygame viewer will pop up showing the annotated graph of your application, which is a great way to learn more. It'll also give you a Pdb debugger on the console.&lt;br /&gt;&lt;br /&gt;I'll post further about actually writing some real RPython code. It ain't easy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-4611524585551576315?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/4611524585551576315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=4611524585551576315' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4611524585551576315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4611524585551576315'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/12/how-to-do-something-with-rpython-part-1.html' title='How to Do Something with RPython Part 1'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-793933113982291525</id><published>2006-12-05T22:03:00.000-05:00</published><updated>2006-12-05T23:13:57.347-05:00</updated><title type='text'>Pre-holiday braindump</title><content type='html'>Ok, here's a load of totally dissociated thoughts, technical ones last:&lt;br /&gt;&lt;br /&gt;Woo Emma!&lt;br /&gt;&lt;br /&gt;I am going back to Pittsburgh again for Christmas. I'll be gone from the 22nd to the 2nd.&lt;br /&gt;&lt;br /&gt;Coldness is noticeable.&lt;br /&gt;&lt;br /&gt;I saw Borat. I think it was pretty funny, but whenever I think about it all I can remember are the offensive bits. Which probably make up the majority of the movie, actually. I'm not a square or anything; I was laughing through most of them, but it was always a guilty laugh. Holy crap, that was so bad. Fortunately Emma, who had seen it already, was there to warn me: "This next scene is going to be REALLY GROSS".&lt;br /&gt;&lt;br /&gt;I am reading Kafka on the Shore by &lt;a href="http://www.randomhouse.com/features/murakami/site.php"&gt;Murakami Haruki&lt;/a&gt;. It is kind of silly but also awesome. It is FULL of (fairly explicit) literary reference, which really tickles me.&lt;br /&gt;&lt;br /&gt;Speaking of Japanese stuff, I am only two classes away from completing my Level 1 Japanese language course. I definitely plan on going on to level two. It's amazing how little I know after two months of taking classes: it's such a different language that I only have a very basic grasp of the grammar and knowledge of maybe 50 nouns and a dozen or so verbs. For the last class, I'm going to have to write a big paragraph about myself in hiragana and read it aloud.&lt;br /&gt;&lt;br /&gt;Efforts towards Twisted 2.5 are accelerating. Also, did you see the new &lt;a href="http://twistedmatrix.com/"&gt;web site&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Holy crap, what was I thinking with that last blog post? Porting CMUCL's readtable implementation to RPython would have been insane. I ended up just using Carl Bolz' BNF parser generator in pypy.rlib.parsing, and it was hella easy. I did it mostly while I was flying and hanging out in Pittsburgh during Thanksgiving.&lt;br /&gt;&lt;br /&gt;That's probably enough for now.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.yellow5.com/pokey/archive/index453.html"&gt;I know what will kick your knickers, small child!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-793933113982291525?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/793933113982291525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=793933113982291525' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/793933113982291525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/793933113982291525'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/12/pre-holiday-braindump.html' title='Pre-holiday braindump'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-5186899613240307506</id><published>2006-11-10T13:46:00.000-05:00</published><updated>2006-11-10T14:05:26.785-05:00</updated><title type='text'>readtables.</title><content type='html'>Let me start at the beginning. PyPy is neat. Also I have this language implementation called Safelisp. It is meant to be a very secure interpreter of a lisp-like language, allowing totally untrusted code to be executed in a way that won't harm the machine it's running on or effect other running code in undesirable ways.&lt;br /&gt;&lt;br /&gt;As a way to become more involved with PyPy, I have started porting Safelisp to RPython, the Python-subset that PyPy's python interpreter is implemented in. This is not easy, because RPython is very strict in ways that pretty much all of my Safelisp code does not like.&lt;br /&gt;&lt;br /&gt;Safelisp has this thing that I called a "readtable" when I wrote it, and while it is very superficially similar to the thing that Common Lisp calls a readtable (you associate a character with a function to parse that character and perhaps things that come after it), it is not really the same. Given that I now need to mostly rewrite the Safelisp parser so that it can fit into RPython, I have also decided to clean up the readtable implementation so that it is actually sensible.&lt;br /&gt;&lt;br /&gt;Unfortunately I haven't been able to find any general essays on the design and implementation of readtables (The CL Hyperspec only really describes the API without much reasoning about the design, or how it ought to be implemented). Given this lack, I am left only to look at existing implementations. So, I think the next time I work on this I am going to try porting &lt;a href="http://common-lisp.net/cgi-bin/viewcvs.cgi/src/code/reader.lisp?root=cmucl&amp;amp;view=auto"&gt;CMUCL's reader.lisp&lt;/a&gt; to RPython as a basis for the Safelisp parser.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-5186899613240307506?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/5186899613240307506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=5186899613240307506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5186899613240307506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5186899613240307506'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/11/readtables.html' title='readtables.'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-4429296742688250558</id><published>2006-11-04T01:04:00.000-05:00</published><updated>2006-11-04T01:36:08.649-05:00</updated><title type='text'>Wailin'</title><content type='html'>A mention of singing in an email conversation got me thinking about my old high school chorus at West Allegheny. Those were some good times. I got to googling and found this post by an alumna:  &lt;a href="http://adventuresinjuggling.blogspot.com/2005/05/weekend-assignment-59.html"&gt;Weekend Assignment #59&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Stewart Morgan. The auditorium was put up several years before I entered high school, and I sang in it every year. Our instructor, Earl Wiechelt, was his student, and Mr. Wiechelt was absolutely fantastic, but Stewart Morgan was a legend. Fortunately, he was a legend that would stop by once every week or two to give us advice and critiques, because he enjoyed it. Through their combined efforts, our chorus won regional competitions and got invited to nationals every year. Chorus was one of the few things I remember fondly of high school.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://yellow5.com/pokey/archive/index341.html"&gt;Gotta figure out an excuse to sing&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-4429296742688250558?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/4429296742688250558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=4429296742688250558' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4429296742688250558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/4429296742688250558'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/11/wailin.html' title='Wailin&apos;'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-1157222420670975678</id><published>2006-10-27T13:21:00.000-05:00</published><updated>2006-10-27T13:34:08.160-05:00</updated><title type='text'>More stuff about inferring the referential transparency of code</title><content type='html'>Partially for my own benefit so I can remember what to read about:&lt;br /&gt;&lt;br /&gt;The developers of "E" (as in, the language at &lt;a href="http://erights.org/"&gt;erights.org&lt;/a&gt;)  propose a &lt;a href="http://www.erights.org/elang/kernel/auditors/"&gt;system of "auditors"&lt;/a&gt; which seems like a flexible way of adding new analysis tools to a language implementation. They propose a "Functional" auditor, which tells whether a particular piece of code is functional. I don't know if they've actually figured out how to do that (it's not clear from the article), but they're pretty smart guys. Notably, Ka-Ping Yee (aka "?!") is one of the authors.&lt;br /&gt;&lt;br /&gt;Effect Systems (mentioned on &lt;a href="http://lambda-the-ultimate.org/node/1217"&gt;lambda-the-ultimate&lt;/a&gt;) are apparently a way to annotate the *non*-functional portions of a program. I haven't really read anything about them yet, but they seem very relevant to the idea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-1157222420670975678?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/1157222420670975678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=1157222420670975678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1157222420670975678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1157222420670975678'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/10/more-stuff-about-inferring-referential.html' title='More stuff about inferring the referential transparency of code'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-1973879279987327764</id><published>2006-10-25T10:03:00.000-05:00</published><updated>2006-10-25T10:21:55.703-05:00</updated><title type='text'>Functional optimizations with PyPy</title><content type='html'>So, here's an idea: add a functionality inferencer to PyPy that decides whether some Python code is purely functional (doesn't contain any state-modification operations, doesn't access stuff that isn't passed to it or defined statically enough) -- or if you don't want to do that, just add a notation for declaring some code as purely functional. Then, you can disable the cyclic garbage collector for that code -- you can either just use refcounting, or use something way faster (there are tons of ways to optimize purely functional code, especially in garbage collection, like pointed out in &lt;a href="http://www.sics.se/%7Ejoe/pubs/historyGC.ps"&gt;this paper by Joe Armstrong and Robert Virding&lt;/a&gt; about &lt;span style="font-style: italic;"&gt;real-time&lt;/span&gt; garbage collection). You can do this because it's impossible for functional code to create cyclic data structures (unless they use some sort of lazy evaluation, which doesn't really affect these optimizations). So frames created for this function can tell the cyclic garbage collector to go away, and any objects that that function creates don't need to take part in the cyclic garbage collector.&lt;br /&gt;&lt;br /&gt;If you think that's crazy, you can &lt;span style="font-style: italic;"&gt;also&lt;/span&gt; take a look at &lt;a href="http://home.pipeline.com/%7Ehbaker1/Use1Var.html"&gt;Use-Once-Variables&lt;/a&gt;, an idea for adding "linear objects" to non-linear languages (pretty much all programming languages are non-linear). Use-once-variables refer to linear objects, which can &lt;span style="font-style: italic;"&gt;only&lt;/span&gt; ever have one reference at a time. Copying and deletion both require explicit support from the linear object. It definitely changes your style of programming to use linear objects, but they can offer some serious improvements to the ability to reason about code that uses them, not to mention that you can optimize the crap out of them.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The intuition behind linear types is the &lt;em&gt;conservation of physical matter&lt;/em&gt;--a linear object cannot be created or destroyed without special permission, although it can be moved or transferred at will.  Thus, an occurrence of a linear variable--e.g., in the argument list of a function call--indicates that the function will &lt;em&gt;consume&lt;/em&gt; the value of the variable.  If the function does not later return this value, either as a returned value, or by assigning it to a more global variable, then that function is responsible for properly disposing of any of the resources controlled by the value--even in the case of exceptions. -- &lt;span style="font-weight: bold;"&gt;Henry Baker, 'Use-Once' Variables&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Alright. So PyPy is clearly the platform to implement these ideas on; what parts of the system need to be affected? Is it an object space? How many fundamental modifications does it require?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-1973879279987327764?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/1973879279987327764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=1973879279987327764' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1973879279987327764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/1973879279987327764'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/10/functional-optimizations-with-pypy.html' title='Functional optimizations with PyPy'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-8842515029517009911</id><published>2006-10-21T14:32:00.000-05:00</published><updated>2007-02-14T20:33:18.709-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>A day of mourning</title><content type='html'>From &lt;a href="http://inthegroove.com/"&gt;inthegroove.com&lt;/a&gt;: "News flash: &lt;a href="http://inthegroove.com/page/Press_Release"&gt;Konami has acquired In The Groove&lt;/a&gt;"&lt;br /&gt;&lt;br /&gt;In The Groove is the most innovative and fun dance game in the industry. The dinosaur that couldn't keep up, Konami, has harassed Roxor Games into handing it over to them. I don't know what the future of In The Groove as a game is; it is notable that the "buy the game" links on their web site have disappeared. However, it appears it is still available from the third party vendors that already have copies. For example, check out the &lt;a href="http://www.play-asia.com/paOS-13-71-7s-49-en-70-1gw7.html"&gt;ITG page on Play Asia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I was just at the &lt;a href="http://frontalot.com/"&gt;MC Frontalot&lt;/a&gt; concert here in Cambridge last night; he's one of the artists featured in the In The Groove games. It was a very good concert. Opening for him were &lt;a href="http://shaelriley.com/"&gt;Shael Riley&lt;/a&gt; and &lt;a href="http://optimusrhyme.com/"&gt;Optimus Rhyme&lt;/a&gt;. They were excellent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-8842515029517009911?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/8842515029517009911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=8842515029517009911' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8842515029517009911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8842515029517009911'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/10/day-of-mourning.html' title='A day of mourning'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-5510203739991038490</id><published>2006-10-20T11:20:00.000-05:00</published><updated>2006-10-21T14:53:55.986-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Upgrading to Edgy</title><content type='html'>Ok, I upgraded to the pre-release of Edgy yesterday. Here are the problems so far:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Python 2.4.4 broke an interaction between Zope3 and Twisted (via changes to the 'cgi' module). Not a big deal, I only had to 'svn up' Zope3 to fix the problem (because &lt;a href="http://twistedmatrix.com/trac/ticket/1451#comment:6"&gt;Zope3 and Twisted developers already found the problem&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;The button in my toolbar to start emacs broke, because this was the command in it: sh -c '. ~/.environment; /usr/bin/emacs-snapshot'. Apparently the default 'sh' in Edgy is now dash, which doesn't accept this syntax. I just changed it to 'bash' to get it to work.&lt;/li&gt;&lt;li&gt;Apparently my SMP support stopped working. Now a 'while 1: pass' loop in Python shows 100% CPU usage instead of 50%. I probably just have to apt-get the correct kernel to fix this, but I don't think I needed to do that when installing Dapper (although I may be mistaken).  &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;UPDATE&lt;/span&gt;: Apparently I was supposed to choose the "-generic" kernel from my bootup menu instead of the item that was selected by default and at the top of the menu, the "-386" one.  &lt;span style="font-weight: bold;"&gt;UPDATE TWO&lt;/span&gt;: the -generic kernel didn't boot! I am going through ordeals. See &lt;a href="https://launchpad.net/distros/ubuntu/+source/initramfs-tools/+bug/67256"&gt;bug 67256&lt;/a&gt; on Launchpad. &lt;span style="font-weight: bold;"&gt;UPDATE THREE&lt;/span&gt;: Even after getting -generic to boot by regenerating my initrd, the nvidia drivers won't load. This might be solved soon. I don't know.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I'm not sure if any of these are bugs that ought to be filed, but I will investigate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-5510203739991038490?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/5510203739991038490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=5510203739991038490' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5510203739991038490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/5510203739991038490'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/10/upgrading-to-edgy.html' title='Upgrading to Edgy'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-8751953982604726562</id><published>2006-10-15T14:08:00.000-05:00</published><updated>2006-10-15T14:17:07.232-05:00</updated><title type='text'>I am a School Student :-(</title><content type='html'>I'm about to start Japanese language classes at the Boston Language institute. Excitement!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-8751953982604726562?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/8751953982604726562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=8751953982604726562' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8751953982604726562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/8751953982604726562'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/10/i-am-school-student.html' title='I am a School Student :-('/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-6995664635563920707</id><published>2006-09-15T14:03:00.000-05:00</published><updated>2006-09-15T14:23:37.895-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mind'/><title type='text'>Mind</title><content type='html'>&lt;a href="http://yellow5.com/pokey/archive/index107.html"&gt;Pokey the Penguin&lt;/a&gt;, &lt;a href="http://www.brewpubzone.com/States/Massachusetts.html"&gt;microbreweries in Massachusetts&lt;/a&gt;, &lt;a href="http://www.mindspring.com/~emshort/"&gt;Interactive Fiction&lt;/a&gt;, &lt;a href="http://divmod.org/trac/wiki/DivmodImaginary"&gt;simulationist virtual worlds&lt;/a&gt;, &lt;a href="http://books.google.com/books?q=the+winter+of+our+discontent"&gt;American classic fiction&lt;/a&gt;, &lt;a href="http://www.harveycartel.org/metanet/n.html"&gt;terrifying machines&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-6995664635563920707?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/6995664635563920707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=6995664635563920707' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6995664635563920707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/6995664635563920707'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/09/mind.html' title='Mind'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-115735315637398724</id><published>2006-09-04T01:51:00.000-05:00</published><updated>2006-09-04T01:59:16.396-05:00</updated><title type='text'>A fine old thing is described here.</title><content type='html'>It is a fine old thing to eat delicious left over potato salad at 2:30 in the morning.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-115735315637398724?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/115735315637398724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=115735315637398724' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/115735315637398724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/115735315637398724'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/09/fine-old-thing-is-described-here.html' title='A fine old thing is described here.'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-115630164962687520</id><published>2006-08-22T21:43:00.000-05:00</published><updated>2006-08-22T21:54:09.653-05:00</updated><title type='text'>Attack of the Bacon Robots!</title><content type='html'>I recently indulged myself by buying a copy of the hardback limited edition of &lt;a href="http://penny-arcade.com/"&gt;Penny Arcade's&lt;/a&gt; &lt;em&gt;Attack of the Bacon Robots&lt;/em&gt;.  See the bottom of &lt;a href="http://www.penny-arcade.com/2006/08/16"&gt;This pont&lt;/a&gt; for extremely terse details.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.flickr.com/photos/radix/222538249/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/78/222538249_204f9a9976_m.jpg" width="193" height="240" alt="Cover" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;The book is cool. It was $30, and it has a hard cover, so I could at least use it as a plate or something if the nuclear bombs hit. The exciting thing about this story is not the content of the book, but the *particular* book. The *instance* of the book. This book, my friends, is the one thousand three hundred and thirty-seventh copy printed. Out of Fifteen Hundred. Do I need to put that into decimal digits for you? &lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.flickr.com/photos/radix/222538250/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/96/222538250_c62a2c67ac_m.jpg" width="228" height="240" alt="Book 1337" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;It is copy &lt;em&gt;1337&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;My immediately surge of excitement was quickly quelled by those around me. "Hah!", said an officemate. "Surely it is a joke. It is impossible that you should be so lucky as to geet the 1337 book. It must be a ruse by the Penny-Arcade authors to trick you. There must be multiple books that say they are the 1337th."&lt;br /&gt;&lt;br /&gt;IS IT TRUE, PENNY-ARCADE? ARE YOU TRICKING ME?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-115630164962687520?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/115630164962687520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=115630164962687520' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/115630164962687520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/115630164962687520'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/08/attack-of-bacon-robots.html' title='Attack of the Bacon Robots!'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-115620971512568384</id><published>2006-08-21T20:14:00.000-05:00</published><updated>2006-08-21T20:21:55.140-05:00</updated><title type='text'>Hey look it is a natural language programming environment OH GOD STOP IT</title><content type='html'>This is a bad thing.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Part 4 - Making Play More Friendly&lt;br /&gt;&lt;br /&gt;Chapter 1 - New Commands&lt;br /&gt;&lt;br /&gt;Section 1 - Echo-location&lt;br /&gt;&lt;br /&gt;Understand "shout [text] to/at/for [any person]" as answering it that (with nouns reversed).&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This was written by the genius (that is not sarcastic) interactive fiction author Emily Short, in her short "Beauty and the Beast" spinoff, &lt;a href="http://inform-fiction.org/I7Downloads/Examples/bronze/"&gt;Bronze&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As far as I can tell, it means "when the player enters a command such as "shout Hello at Bob", the 'answer' action should be invoked with the first argument being Bob and the second argument being the text "Hello". Maybe.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-115620971512568384?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/115620971512568384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=115620971512568384' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/115620971512568384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/115620971512568384'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/08/hey-look-it-is-natural-language.html' title='Hey look it is a natural language programming environment OH GOD STOP IT'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-115584484497206746</id><published>2006-08-17T14:58:00.000-05:00</published><updated>2006-08-17T15:00:59.373-05:00</updated><title type='text'>PyPy is self-hosting</title><content type='html'>Look at this thing: &lt;a href="http://codespeak.net/pipermail/pypy-dev/2006q3/003332.html"&gt;Armin Rigo: "Self-hosted"&lt;/a&gt;. Pypy can translate itself with pypy-c.&lt;br /&gt;&lt;br /&gt;I am hoping that Twisted will have a buildslave that runs the tests on Pypy by the end of the year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-115584484497206746?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/115584484497206746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=115584484497206746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/115584484497206746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/115584484497206746'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/08/pypy-is-self-hosting.html' title='PyPy is self-hosting'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-115464303337117751</id><published>2006-08-03T16:58:00.000-05:00</published><updated>2006-08-03T17:10:33.396-05:00</updated><title type='text'>I am learning about Functional Programming</title><content type='html'>&lt;pre&gt;&lt;br /&gt;(define (parse initial callback)&lt;br /&gt;  ;; Construct and return a purely-functional parser of length-ten&lt;br /&gt;  ;; strings.&lt;br /&gt;&lt;br /&gt;  ;; `initial' is the initial data to process.&lt;br /&gt;  ;; `callback' is a function to call with length-ten strings.&lt;br /&gt;&lt;br /&gt;  ;; The return value is a function which accepts data as an&lt;br /&gt;  ;; argument. The return value of *that* is a function with an&lt;br /&gt;  ;; identical signature. When you want to push more data into the&lt;br /&gt;  ;; parser, always pass it to the most recently returned function.&lt;br /&gt;&lt;br /&gt;  (lambda (data)&lt;br /&gt;    (let ([buf (string-append initial data)])&lt;br /&gt;      (if (&gt;= (string-length buf) 10)&lt;br /&gt;          (begin&lt;br /&gt;            (callback (substring buf 0 10))&lt;br /&gt;            (parse (substring buf 10) callback))&lt;br /&gt;          (parse buf callback)))))&lt;br /&gt;&lt;br /&gt;(((((parse "hello" write) " world") " radix") " is") " here!!!!!!!!!!!!!!!")&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-115464303337117751?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/115464303337117751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=115464303337117751' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/115464303337117751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/115464303337117751'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/08/i-am-learning-about-functional.html' title='I am learning about Functional Programming'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-115266887820118965</id><published>2006-07-11T20:08:00.000-05:00</published><updated>2006-07-11T20:51:05.883-05:00</updated><title type='text'>Update 2006-07-11 09:05 -0500</title><content type='html'>While I haven't been &lt;a href="http://radicalideals.blogspot.com/"&gt;completely inactive&lt;/a&gt; in the blogging world since my last post here, I admit it's been a bit too long (yes, I made it back from Montréal in one piece, despite the great beer and lively night scene). So, what better than a reading-list update?&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://flickr.com/photos/radix/187696068/"&gt;&lt;img width="400" height="300" src="http://static.flickr.com/72/187696068_7f1a09ca72.jpg"&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;This is but a fraction of my current list. But before I go into that, here's what I've read recently:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Building Harlequin's Moon&lt;/em&gt; - Larry Niven / Brenda Cooper. This is surprisingly good. Brenda Cooper is a boon to Niven's characters. Not only are the characters probably the best of any Niven collaboration I've read (let alone his stand-alones), the social setting is very dramatic, and that's something that Niven is pretty good with in his other books.&lt;/li&gt;&lt;li&gt;&lt;em&gt;The Curious Incident of The Dog in The Night-Time&lt;/em&gt; - Mark Haddon. It's a story about and written from the perspective of an extremely intelligent English boy. The chapters are the prime numbers. There's an appendix that describes the solution to a very difficult mathematics problem (or so I am led to believe). However, it is also a very sad story about an autistic 15-year old caught in the middle of horrible familial strife, and who also wants to find out who killed his neighbor's dog with a pitch-fork. It's good.&lt;/li&gt;&lt;li&gt;&lt;em&gt;Shadow Puppets&lt;/em&gt; - Orson Scott Card. The sequel to Ender's Shadow, aka "the good Ender series", is good. Bean is a great tragic character.&lt;/li&gt;&lt;li&gt;&lt;em&gt;A Scanner Darkly&lt;/em&gt; - Philip K. Dick. Sure, I admit that I read this because the movie got my attention. But I had read PKD's stuff before, and this is probably my favorite so far. Shortly after, I saw the movie, which was also awesome. In both mediums, but moreso in the book, the author really captured the paranoid moon-logic of a tripped out drug-addict excellently. It's not just a silly idea here and there: it manifests as long conversations where one strange misunderstanding of the world builds on top of another one, repeatedly, until you kind of get caught up in the logic yourself. Oh, by the way, the story is very sad.&lt;/li&gt;&lt;li&gt;&lt;em&gt;The Last Continent&lt;/em&gt; - Pratchett. I'm proud to say that I got probably 85% of the references in the book. However, it was little more than that. Plot was pretty boring. The gem was the way Pratchett described Australian aboriginal art as if the artist drew the simplest thing possible, but then tried to make it come to life, by drawing it inside-out.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;There have been more than that, for sure, but let's cut it to a reasonable length.&lt;br /&gt;&lt;br /&gt;Here's what's on the plate:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Gunslinger Girl&lt;/em&gt;. A manga based on the anime. It's reminded me how sad the story is. I'm going to be buying the remaining two volumes of the anime that I don't have.&lt;/li&gt;&lt;li&gt;&lt;em&gt;Metamorphosis&lt;/em&gt; - Kafka. Sure, I haven't read it yet.&lt;/li&gt;&lt;li&gt;&lt;em&gt;The Book of Jhereg&lt;/em&gt; - Steven Brust. This is a single-bound volume of the first three of Brust's books in this series. It is turning out to be fairly good. You  may have seen references to this in &lt;a href="http://www.penny-arcade.com/comic/2006/06/14"&gt;recent publications&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;em&gt;Metroid Prime: Hunters&lt;/em&gt;. Wait, what? That's not a book. But man, that is a bad-ass Nintendo DS game.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;There's more, but those are the things I find worth mentioning.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-115266887820118965?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/115266887820118965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=115266887820118965' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/115266887820118965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/115266887820118965'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/07/update-2006-07-11-0905-0500.html' title='Update 2006-07-11 09:05 -0500'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-114943045056549854</id><published>2006-06-04T09:11:00.000-05:00</published><updated>2006-06-04T09:14:10.590-05:00</updated><title type='text'>Montreal 2006-06</title><content type='html'>In case anyone in Boston didn't know, I'm off to Montreal for two weeks for work. Then on to my cousin's wedding in DC. I'll be back in Boston on June 18th.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-114943045056549854?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/114943045056549854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=114943045056549854' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114943045056549854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114943045056549854'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/06/montreal-2006-06.html' title='Montreal 2006-06'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-114919195387980470</id><published>2006-06-01T14:44:00.000-05:00</published><updated>2006-06-01T14:59:13.930-05:00</updated><title type='text'>The future of mobile communication is NOW.</title><content type='html'>I ordered a phone online from Verizon a week ago. It was difficult. At first they wouldn't accept my VISA debit card, as it did not have a billing address in the zip code that I was getting the phone in. After getting my bank to change it, Verizon again wouldn't accept it since I have crappy credit. So I had to go with a monthly pre-paid plan. Sure, whatever, I don't use that many minutes.&lt;br /&gt;&lt;br /&gt;Today I got my phone. After searching around the material that came with the phone for a frustrating 10 minutes, I figured out I had to "activate" my phone, by calling a particular three-digit number. I did that, and it was completely automated (I found it amusing that the phone said "Commit Complete" after activation).&lt;br /&gt;&lt;br /&gt;So I tried making a phone call, and got redirected to a payment menu so I could pay for my month of service. It asked me for a four-digit passcode, which I did not know. An even more frustrating 3 hours later, I still don't know it. I tried registering an account on their web site so I could pay, but that required I know my passcode ahead of time as well. Eventually I gave up and called tech support, and it was going extremely well: The lovely voice on the other end of the line asked for my new phone number and address, and said I could immediately get a new passcode. I told her some series of four numbers, and heard the keyboard on the other end of the phone rattling, followed by an uninspiring "uh". She went on to explain that the "System" was "Updating", and that I would have to call back again in an hour to get my passcode set.&lt;br /&gt;&lt;br /&gt;So, I guess I'm waiting for their oracle database to unlock after running the weekly backup process, or something.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-114919195387980470?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/114919195387980470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=114919195387980470' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114919195387980470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114919195387980470'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/06/future-of-mobile-communication-is-now.html' title='The future of mobile communication is NOW.'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-114876385321264867</id><published>2006-05-27T15:32:00.000-05:00</published><updated>2006-05-27T16:04:13.783-05:00</updated><title type='text'>Twisted 2.4.0</title><content type='html'>Twisted 2.4.0 is finally out. This release has come together really well: we got a ton of subprojects released followed by the main Twisted release in a week or so. Then Cory Dodt put together the windows installers the day after the release went out.&lt;br /&gt;&lt;br /&gt;If you want to grab it, hit &lt;a href="http://twistedmatrix.com/"&gt;twistedmatrix.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-114876385321264867?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/114876385321264867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=114876385321264867' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114876385321264867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114876385321264867'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/05/twisted-240.html' title='Twisted 2.4.0'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-114738276219177235</id><published>2006-05-11T16:18:00.000-05:00</published><updated>2006-05-11T16:26:02.206-05:00</updated><title type='text'>chibi simulationism</title><content type='html'>&lt;a href="http://marichan.com/weblog/pivot/entry.php?id=191"&gt;Twenty Two Illustrations For an Unreleased Book about Physically-Based Simulation&lt;/a&gt; [sic]&lt;br /&gt;&lt;br /&gt;Next Imaginary ticket: Implement a low-level physics simulation engine capable of simulating all pictured situations.&lt;br /&gt;&lt;br /&gt;(Watch out, some of the other stuff on that site is a bit, uh, adult, but the above link is clean and extremely cute.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-114738276219177235?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/114738276219177235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=114738276219177235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114738276219177235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114738276219177235'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/05/chibi-simulationism.html' title='chibi simulationism'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-114602367610643836</id><published>2006-04-25T22:32:00.000-05:00</published><updated>2006-04-25T22:54:36.123-05:00</updated><title type='text'>Multi-Metaverse with distributed revision control</title><content type='html'>I'm thinking that carrying around a digital audio recorder will be necessary when I go out with Jean-Paul or Glyph. A podcast would be way easier than a blog. So, &lt;a href="http://divmod.org/trac/wiki/DivmodImaginary"&gt;Divmod Imaginary&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is what Imaginary will be in N years: a Guy runs an Imaginary server. He makes an agreement with another Guy running a different Imaginary server to put a portal between their worlds. They want to allow players to take their horses with them between the worlds, but they disagree about the appropriate power of weaponry in their worlds, so while they allow players to carry Swords between the realms they don't allow them to use them to their usual effect.&lt;br /&gt;&lt;br /&gt;This should be supported by the infrastructure: code will be transferred to the host that needs it when necessary, and that code will be run with capabilities configured by the contract between the two Guys. Restricted execution is facilitated either but a &lt;a href="http://launchpad.net/products/subol/"&gt;custom runtime&lt;/a&gt; or via a restricted &lt;a href="http://pypy.org/"&gt;PyPy&lt;/a&gt;-based interpreter.&lt;br /&gt;&lt;br /&gt;We'll be storing the code in the database, of course, and using &lt;a href="http://bazaar-vcs.org/"&gt;bzr&lt;/a&gt;lib so it's not just a glob of unversioned crap. So, when Guy B modifies the Horse class so that it supports the new action "pet" and Guy A modifies the Horse class so that it supports various lengths of hair, either guy can "merge Horse from Guy B" or "merge Horse from Guy A" to get the others' changes without overwriting their own.&lt;br /&gt;&lt;br /&gt;Is that it? Anyway, please start working with us on &lt;a href="http://divmod.org/trac/wiki/DivmodImaginary"&gt;Imaginary&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-114602367610643836?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/114602367610643836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=114602367610643836' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114602367610643836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114602367610643836'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/04/multi-metaverse-with-distributed.html' title='Multi-Metaverse with distributed revision control'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-114557490676848380</id><published>2006-04-20T18:09:00.000-05:00</published><updated>2006-04-20T20:34:06.000-05:00</updated><title type='text'>Tree</title><content type='html'>I took some pictures of The Tree recently.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://flickr.com/photos/radix/tags/tree/"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px;" src="http://static.flickr.com/50/131901312_6e39671003_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;It is a pretty big tree. If you click it, you will also see a picture of a dog, a bush, and a tree.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;UPDATE:&lt;/span&gt;&lt;/span&gt; &lt;span style="font-style: italic;"&gt;The tree is a Magnolia tree.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-114557490676848380?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/114557490676848380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=114557490676848380' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114557490676848380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114557490676848380'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/04/tree.html' title='Tree'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-114472656313836661</id><published>2006-04-10T22:10:00.000-05:00</published><updated>2006-04-11T08:23:11.180-05:00</updated><title type='text'>Only Yesterday, a Studio Ghibli feature film by Isao Takahata</title><content type='html'>I need to get this off of my chest all at once: Only Yesterday is a &lt;span style="font-style: italic;"&gt;beautiful&lt;/span&gt; movie, Ghibli is a &lt;span style="font-style: italic;"&gt;fantastic&lt;/span&gt; studio, and Takahata is a &lt;span style="font-style: italic;"&gt;genius&lt;/span&gt; at character development. Do you see those italics? I mean them.&lt;br /&gt;&lt;br /&gt;Unfortunately, this movie is unavailable anywhere in the US or other English-speaking countries, as far as I can tell, so the only way to legally acquire it is by importing from Japan at extortionate rates (don't worry, the Japanese DVDs have English subtitles). Rather than doing that, I downloaded it from Boxtorrents. But now, now I want to give Studio Ghibli all of my money. -- no, not Studio Ghibli, but instead, I'll give it to Japanese Scientists who will put all of their effort into designing a device that will keep Hayao Miyazaki and Isao Takahata alive &lt;span style="font-style: italic;"&gt;forever&lt;/span&gt;, as slaves of their passionate fans.&lt;br /&gt;&lt;br /&gt;I just can't believe how excellent a studio that is. Hayao Miyazaki is clearly one of the best creators of fantasy ever, and Takahata can give you a character that you have such a &lt;span style="font-style: italic;"&gt;passionate&lt;/span&gt; connection with. Every millimeter twitch of the eyebrow or lip controls me like a puppet, and every tiny ordeal that the characters go through makes me &lt;span style="font-style: italic;"&gt;so sad&lt;/span&gt;, like a sad puppy.&lt;br /&gt;&lt;br /&gt;Anyway, I think I talked about this stuff &lt;a href="http://radeex.blogspot.com/2005/10/liebot-what-is-saddest-thing_15.html"&gt;before&lt;/a&gt;. Basically, Studio Ghibli is the best thing on the planet. Everyone should watch all of their movies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-114472656313836661?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/114472656313836661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=114472656313836661' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114472656313836661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114472656313836661'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/04/only-yesterday-studio-ghibli-feature.html' title='Only Yesterday, a Studio Ghibli feature film by Isao Takahata'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-114471120186512090</id><published>2006-04-10T18:13:00.000-05:00</published><updated>2006-04-10T18:20:01.883-05:00</updated><title type='text'>New tricks!</title><content type='html'>Two things. First, I learned how to do this:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.vimeo.com/clip=62082"&gt;&lt;img style="margin: 0px auto 10px;" src="http://photos1.blogger.com/blogger/5718/401/320/spinning-thumb.jpg" alt="radix Spins" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;(click on it to see a video of it).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Then, I did this!&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/radix/126633148/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/47/126633148_c3bbfaa500_m.jpg" alt="bleeding-hand" height="180" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;This was after cleaning up. There was lots of blood.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-114471120186512090?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/114471120186512090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=114471120186512090' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114471120186512090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114471120186512090'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/04/new-tricks.html' title='New tricks!'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-114428627197986282</id><published>2006-04-05T20:08:00.000-05:00</published><updated>2006-04-05T20:38:02.283-05:00</updated><title type='text'>On a happier note</title><content type='html'>My stick-twirling is improving. I can do fairly fast transitions between in right and out left. Left is still a bit awkward, but getting better. For some reason, spinning in with my right hand is much easier than out, which is the opposite of my expections (and what I was told).  I'm now also working on reversing a spin (in the same hand, with various contortions of the body), and doing the opposite transition: between out right and in left.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-114428627197986282?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/114428627197986282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=114428627197986282' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114428627197986282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114428627197986282'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/04/on-happier-note.html' title='On a happier note'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-114428481280236477</id><published>2006-04-05T19:43:00.000-05:00</published><updated>2006-04-05T19:53:32.826-05:00</updated><title type='text'>"A blessing is a curse"</title><content type='html'>That's poetic, right? So, there are two indisputable facts I have learned today.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The OS X &lt;span style="font-weight: bold;"&gt;bless&lt;/span&gt; command's only function is to make a volume *unbootable*. This is a documentation bug, I believe: the man page shouldn't say anything about specifying boot files and such like.&lt;/li&gt;&lt;li&gt;Either my keyboard (A 3-year-old "Compaq"-branded USB keyboard) or this Mac Mini device has what appear to be race-conditions or just plain flakiness when it comes to boot modifier keystrokes. I &lt;span style="font-style: italic;"&gt;did&lt;/span&gt; manage to have "C" boot from a CD today, and "alt" once even gave me the volume-picker menu. But these were isolated cases, in dozens of attempts.&lt;/li&gt;&lt;/ol&gt;I think, while #2 is certainly very &lt;span style="font-style: italic;"&gt;annoying&lt;/span&gt;, #1 is the more fundamental problem, here. I pretty much need to successfully bless &lt;span style="font-style: italic;"&gt;something&lt;/span&gt; in order to install Linux on this thing, unless either the beautiful people at mactel-linux.org or &lt;a href="http://ubuntu.com/"&gt;my coworkers&lt;/a&gt; create a bootable install CD.&lt;br /&gt;&lt;br /&gt;Apple's recent announcement of &lt;a href="http://www.apple.com/macosx/bootcamp/"&gt;Boot Camp&lt;/a&gt; (and specifically the newly-released technologies which enable it) was a glimmer of hope, but not as much to me as to others, as I have already spent countless (5) nights having my hopes crushed by this tiny, tiny machine. In fact, after installing the Firmware update from Apple, my computer did do an interesting thing: Startup Disk now lets me select the stock Dapper installation CD, and I can successfully boot it! Very interesting. The video is almost complete corrupt, though, and after about 5 seconds of spewing bootup output, the screen goes black. Now, I appear to have gotten the thing into a Legacy Mode (BIOS) which it refuses to come out of, no matter what keystroke coaxing I attempt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-114428481280236477?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/114428481280236477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=114428481280236477' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114428481280236477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114428481280236477'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/04/blessing-is-curse.html' title='&quot;A blessing is a curse&quot;'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-114420131212300142</id><published>2006-04-04T20:29:00.000-05:00</published><updated>2006-04-04T20:41:52.143-05:00</updated><title type='text'>got OS X booting</title><content type='html'>Ok, so I'm back in an original-ish state. But now, it appears I can't boot anything but my hard drive! Why does Apple hate me. They love me when I want to use their software. Why can't they love me just for using their hardware?&lt;br /&gt;&lt;br /&gt;So, on this Intel Mac Mini, I do not clearly remember ever having used any of the boot-up keystrokes successfully. Option? What's that? I think it's Alt, on this Windows Keyboard. Holding the Alt key down while I boot gives me no boot menu. Why do you mock me, The Web? Why do you tell me that it works? (yes, I've also tried the windows key, but I'm pretty sure that's Command, not Option). Same with "c". I booted from this CD on this very mac not 60 minutes ago -- to boot OS X when it wouldn't boot automatically. Then I got OS X booting by default again by selecting the volume in the Boot Disk. Now, I cannot boot from that very CD that saved me, no matter how furiously I depress that semi-circular letter.  Maybe Apple has some secret conspiracy to not honor bootup keystrokes executed on that most hated of competitor's keyboards?&lt;br /&gt;&lt;br /&gt;Ok, so *somehow* I booted that Live CD on this machine, what seems like ages ago -- it might have been with a C. But maybe by that time I had already destroyed the alternative method of booting.&lt;br /&gt;&lt;br /&gt;I guess my next option is to destroy the bootability of my computer again, thus forcing the beast to look for an alternative in the optical drive. But my real goal is to get it booting from a USB stick. An impossible task which is monumental, even from this far-off vantage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-114420131212300142?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/114420131212300142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=114420131212300142' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114420131212300142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114420131212300142'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/04/got-os-x-booting.html' title='got OS X booting'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-114418246104402963</id><published>2006-04-04T15:24:00.000-05:00</published><updated>2006-04-04T15:27:41.080-05:00</updated><title type='text'>Twirling a Stick</title><content type='html'>I can twirl a stick forward and reverse quite smoothly and quickly (for having picked it up this week) with my right hand, and kind of choppily forward with my left hand. I can't do reverse with my left hand yet. My next milestone will probably be a smooth reverse-right to forward-left transition, which I can clumsily do now. Then, once my reverse-left is reasonable, forward-right to reverse-left.&lt;br /&gt;&lt;br /&gt;Then: TWO STICKS AT ONCE.&lt;br /&gt;&lt;br /&gt;I guess I will have to find another stick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-114418246104402963?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/114418246104402963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=114418246104402963' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114418246104402963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114418246104402963'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/04/twirling-stick.html' title='Twirling a Stick'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18669215.post-114416644157926064</id><published>2006-04-04T10:58:00.000-05:00</published><updated>2006-04-04T11:01:17.123-05:00</updated><title type='text'>Maa maa maa! Oh toh toh toh!</title><content type='html'>Note to self: when you visit Japan, make sure to learn &lt;a href="http://youtube.com/watch?v=0b75cl4-qRE"&gt;How to eat Sushi in Japan&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18669215-114416644157926064?l=radix.twistedmatrix.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://radix.twistedmatrix.com/feeds/114416644157926064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18669215&amp;postID=114416644157926064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114416644157926064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18669215/posts/default/114416644157926064'/><link rel='alternate' type='text/html' href='http://radix.twistedmatrix.com/2006/04/maa-maa-maa-oh-toh-toh-toh.html' title='Maa maa maa! Oh toh toh toh!'/><author><name>Christopher Armstrong</name><uri>http://www.blogger.com/profile/11041638059246049826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
