<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>pyx</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/" />
<modified>2007-11-26T23:04:21Z</modified>
<tagline></tagline>
<id>tag:ulaluma.com,2008:/pyx//4</id>
<generator url="http://www.movabletype.org/" version="3.35">Movable Type</generator>
<copyright>Copyright (c) 2007, Donovan</copyright>
<entry>
<title>REST to LSL via Python and Comet</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2007/09/rest_to_lsl_via_python_and_comet.html" />
<modified>2007-11-26T23:04:21Z</modified>
<issued>2007-09-30T07:08:24Z</issued>
<id>tag:ulaluma.com,2007:/pyx//4.1704</id>
<created>2007-09-30T07:08:24Z</created>
<summary type="text/plain">For those that may not know, I got a job at Linden Lab, the creators of Second Life. I really enjoy what I do, and I find this reduces the urge to work on recreational programming on the kinds of things that I enjoy. (It has also seemed to reduce my blog output to almost nil.) I&apos;ve had a project on the back burner for a while that involves pushing data into LSL (the Linden Scripting Language runtime that Second Life uses) over Comet. And it works amazingly well! Of course, I just had to toss REST in there as...</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[<p>For those that may not know, I got a job at Linden Lab, the creators of Second Life. I really enjoy what I do, and I find this reduces the urge to work on recreational programming on the kinds of things that I enjoy. (It has also seemed to reduce my blog output to almost nil.)</p>

<p>I've had a project on the back burner for a while that involves pushing data into LSL (the Linden Scripting Language runtime that Second Life uses) over <a href="http://en.wikipedia.org/wiki/Comet_(programming)">Comet</a>.</p>

<p>And it works amazingly well! Of course, I just had to toss <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a> in there as well.</p>

<p>I'll release this code as open source next week. Meanwhile, here's a movie to show you what the hell I am talking about. I also like how this movie shows off the surreal aspect of collaborative programming!</p>

<embed src="http://soundfarmer.com/content/movies/rest-lsl-comet-bridge.mov" height="600" width="798" autoplay="false"></embed>

]]>

</content>
</entry>
<entry>
<title>My blog is growing weeds...</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2007/06/my_blog_is_grow.html" />
<modified>2007-08-02T04:38:51Z</modified>
<issued>2007-06-09T00:17:45Z</issued>
<id>tag:ulaluma.com,2007:/pyx//4.1674</id>
<created>2007-06-09T00:17:45Z</created>
<summary type="text/plain">It&apos;s been over a year now since I posted to this blog. What happened? I got a job at Linden Lab just over a year ago. Somehow, my blogging just stopped during that time. I have been busy though, and have been using twitter recently. I&apos;ll probably start posting here again with more frequency, as I have lots of things to talk about, but until then check out my twitter: http://twitter.com/donovanpreston...</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[<p>It's been over a year now since I posted to this blog. What happened? I got a job at Linden Lab just over a year ago. Somehow, my blogging just stopped during that time. I have been busy though, and have been using twitter recently. I'll probably start posting here again with more frequency, as I have lots of things to talk about, but until then check out my twitter:</p>

<p><a href="http://twitter.com/donovanpreston">http://twitter.com/donovanpreston</a></p>]]>

</content>
</entry>
<entry>
<title>Awesome</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2006/05/awesome.html" />
<modified>2007-08-02T04:38:51Z</modified>
<issued>2006-05-02T05:18:03Z</issued>
<id>tag:ulaluma.com,2006:/pyx//4.1662</id>
<created>2006-05-02T05:18:03Z</created>
<summary type="text/plain"> Picked this up at Kid Robot in the Haight this weekend. It is so freaking awesome. I want more, but can&apos;t read japanese :-)...</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[<a href="http://item.slide.com/i/uid=xMSTXOmcSLEA6VtJkKLBU8gpjvGBg-a6VjoCtm9EqOxePF8Rs-o29Um-fpzIp5TVajSMFiFH9vk"><img src="http://item.slide.com/i/uid=xMSTXOmcSLEA6VtJkKLBU8gpjvGBg-a6VjoCtm9EqOxePF8Rs-o29Um-fpzIp5TVajSMFiFH9vk" width="600" /></a>

<p>Picked this up at Kid Robot in the Haight this weekend. It is so freaking awesome. I want more, but <a href="http://dot-s.net/">can't read japanese :-)</a></p>

<a href="http://item.slide.com/i/uid=dYs0FyrwTPK9GYdMJTY-a-tzeHHtHE8bTHqb3V-8AdxjoJGx_E0GmcyhYWEYtJMTjdqN9xOp3tA"><img src="http://item.slide.com/i/uid=dYs0FyrwTPK9GYdMJTY-a-tzeHHtHE8bTHqb3V-8AdxjoJGx_E0GmcyhYWEYtJMTjdqN9xOp3tA" width="600" /></a>]]>

</content>
</entry>
<entry>
<title>Running Ubuntu on Mac OS X</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2006/04/running_ubuntu.html" />
<modified>2007-08-02T04:38:51Z</modified>
<issued>2006-04-25T23:59:32Z</issued>
<id>tag:ulaluma.com,2006:/pyx//4.1661</id>
<created>2006-04-25T23:59:32Z</created>
<summary type="text/plain">One of the first things I did when I got my MacBook is install Parallels, CPU virtualization software that lets me run Windows XP in a window on Mac OS X, so I can easily test our site with Internet Explorer. It&apos;s very fast, and very, very friendly. Recently I was tasked with discovering whether it is possible to do non-blocking file reads and writes to a filesystem that is mounted over NFS. I tried on OS X, and I was unable to get a read to return EWOULDBLOCK. So, I decided to install Ubuntu on Parallels. I downloaded the...</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[<p>One of the first things I did when I got my MacBook is install Parallels, CPU virtualization software that lets me run Windows XP in a window on Mac OS X, so I can easily test our site with Internet Explorer. It's very fast, and very, very friendly.</p>

<p>Recently I was tasked with discovering whether it is possible to do non-blocking file reads and writes to a filesystem that is mounted over NFS. I tried on OS X, and I was unable to get a read to return EWOULDBLOCK. So, I decided to install Ubuntu on Parallels. I downloaded the iso, burned it to a CD, created a new virtual machine, and installed it.</p>

<p>Everything worked flawlessly. Ubuntu has always been incredibly high quality, and it has only gotten nicer in the year since I used it last. It's polished, beautiful, and just works. It is definitely something that I could install on my machine for my Mom with a web browser and mail reader.</p>

<p>Here's a screenshot:</p>

<a href="http://www.soundfarmer.com/pictures/screenshots/ubuntu-parallels.png">
<img width="600" height="800" src="http://www.soundfarmer.com/pictures/screenshots/ubuntu-parallels.png" />
</a>]]>

</content>
</entry>
<entry>
<title>Writing your Python REPL history to a file</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2006/04/writing_your_py.html" />
<modified>2007-08-02T04:38:51Z</modified>
<issued>2006-04-04T02:10:49Z</issued>
<id>tag:ulaluma.com,2006:/pyx//4.1660</id>
<created>2006-04-04T02:10:49Z</created>
<summary type="text/plain">Something I have often wished for is the ability to save the history of a Python interactive session to a file. I often screw around in the interpreter to figure out how I am going to implement something, and it is tedious to go through and copy/paste all the lines out of the terminal into an editor and clean it up. Luckily, I discovered there is an easier way in the readline module: import readline readline.write_history_file(&apos;my_history.py&apos;) I&apos;m sure this is going to come in handy many times....</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[<p>Something I have often wished for is the ability to save the history of a Python interactive session to a file. I often screw around in the interpreter to figure out how I am going to implement something, and it is tedious to go through and copy/paste all the lines out of the terminal into an editor and clean it up. Luckily, I discovered there is an easier way in the readline module:</p>

<pre>
import readline
readline.write_history_file('my_history.py')
</pre>

<p>I'm sure this is going to come in handy many times.</p>]]>

</content>
</entry>
<entry>
<title>New Slide Transitions</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2006/03/new_slide_trans.html" />
<modified>2007-08-02T04:38:51Z</modified>
<issued>2006-03-25T06:59:59Z</issued>
<id>tag:ulaluma.com,2006:/pyx//4.1659</id>
<created>2006-03-25T06:59:59Z</created>
<summary type="text/plain">One of the new transitions we have been working on at Slide: Very busy at work lately. Getting a lot accomplished, and it is challenging, fun work. We&apos;re starting to ramp up pretty fast and I have been doing scalability work on the backend, which is surprisingly enjoyable after doing web front end work for so long....</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[<p>One of the new transitions we have been working on at Slide:</p>

<p><embed src="http://widget.slide.com/cticker/648940/ticker.swf" quality="high" scale="noscale" salign="l" flashvars="site=widget.slide.com&channel=648940" wmode="transparent" width="500" height="375" name="flashticker" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"/></p>

<p>Very busy at work lately. Getting a lot accomplished, and it is challenging, fun work. We're starting to ramp up pretty fast and I have been doing scalability work on the backend, which is surprisingly enjoyable after doing web front end work for so long.</p>]]>

</content>
</entry>
<entry>
<title>Introducing NevowPavel</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2006/01/introducing_nev.html" />
<modified>2007-08-02T04:38:51Z</modified>
<issued>2006-01-29T12:37:56Z</issued>
<id>tag:ulaluma.com,2006:/pyx//4.1648</id>
<created>2006-01-29T12:37:56Z</created>
<summary type="text/plain"> I&apos;m at SuperHappyDevHouse VII tonight. I went to II, and had a good time, but haven&apos;t been able to get back until now for various reasons. It was supposed to be last weekend, which falls on my weekend I am scheduled to work in the city, but for some reason it got bumped to this weekend. My goal for tonight is to release some code which was written almost a year ago: NevowPavel. If you have a short attention span, watch the screencast, wherein I explain the basic idea behind the project and give a demonstration of the currently...</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[<img height="600" src="http://soundfarmer.com/pictures/screenshots/NevowPavel.png" />
<p>I'm at SuperHappyDevHouse VII tonight. I went to II, and had a good time, but haven't been able to get back until now for various reasons. It was supposed to be last weekend, which falls on my weekend I am scheduled to work in the city, but for some reason it got bumped to this weekend. My goal for tonight is to release some code which was written almost a year ago: <a href="http://www.soundfarmer.com/darcs/NevowPavel">NevowPavel</a>. If you have a short attention span, watch the <a href="http://soundfarmer.com/content/movies/PavelScreencast.mov">screencast</a>, wherein I explain the basic idea behind the project and give a demonstration of the currently implemented features.</p>

<p>This is the secret LivePage project I wrote about the last time I went to SHDH. It is a multiuser real-time updating wiki similar to and inspired by (the precursor to) <a href="http://jotlive.com/">Jot Live</a>, the "live" version of Jot that broadcasts real-time updates to everyone that is participating. The difference with the NevowPavel implementation is that it is "spatial". Instead of editing a contiguous page of text, each piece of text is contained in a sticky note which can be moved and resized at will to organize the information as one wishes.</p>

<p>Links are also handled in an interesting way. Links are inserted by dragging out a link instead of a sticky and typing a new page name. Following the link takes you to the new page, where you can create and organize new pieces of information. Each page has a user list, so you can see who is there editing with you. To organize information cross-page, you drag stickies onto links. People who are on other pages see the information appear magically.</p>

<p>The ultimate goal of these template objects which you can spatially place in the page is for them to be pluggable. New types of objects should be able to be created which can provide code which renders content and handles input events for instances placed in the page. Eventually, the code should be through-the-web programmable. Obviously this involves lots of different things, like run-time code modification, restricted code execution, perhaps distributed code (to move code across multiple Pavel servers), and some sort of persistence. I'm also working on a Prototype-based object system with very simple persistence which is coming along well, but isn't integrated with the old project at all yet. This is a multi-year project, so check back again next year :-)</p>]]>

</content>
</entry>
<entry>
<title>Slide Show of Photos from Paradise</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2005/12/slide_show_of_p.html" />
<modified>2007-08-02T04:38:51Z</modified>
<issued>2005-12-18T01:40:33Z</issued>
<id>tag:ulaluma.com,2005:/pyx//4.1643</id>
<created>2005-12-18T01:40:33Z</created>
<summary type="text/plain">I have been working at Slide for a few months now. We are working on making photo sharing and real-time media communication easy to use. We&apos;ve made a lot of progress on the web site recently, and one of the things we are working on is making embedding a Slide Show in an external web page easier. Here is one of my Slide Shows, pictures of my trip to Michigan this summer immediately before I began working at Slide. Get the latest version of Flash to view Slide Show, above. Visit Slide.com to create your own Slide Show...</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[<p>I have been working at <a href="http://slide.com/">Slide</a> for a few months now. We are working on making photo sharing and real-time media communication easy to use. We've made a lot of progress on the web site recently, and one of the things we are working on is making embedding a Slide Show in an external web page easier. Here is one of my Slide Shows, pictures of my trip to Michigan this summer immediately before I began working at Slide.</p>

<p>
<embed allowScriptAccess="never" src="http://www.slide.com/images/flashticker.swf" quality="high" scale="noscale" salign="l" flashvars="site=www.slide.com&channel=3059" wmode="transparent" width="600" height="97" name="flashticker" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>
<br><font size="1">Get the <a href="http://www.macromedia.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash&promoid=BIOW">latest version of Flash</a> to view Slide Show, above.  <a href="http://www.slide.com">Visit Slide.com</a> to create your own Slide Show</font>
</p>]]>

</content>
</entry>
<entry>
<title>Virt</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2005/11/virt.html" />
<modified>2007-08-02T04:38:50Z</modified>
<issued>2005-11-18T20:09:27Z</issued>
<id>tag:ulaluma.com,2005:/pyx//4.1620</id>
<created>2005-11-18T20:09:27Z</created>
<summary type="text/plain">Something weird happened to me recently. I had my first screaming-crying-girl-throwing-her-panties fanboy moment for some guy I discovered on teh intarnets. He&apos;s virt (http://virt.vgmix.com) and I felt so ecstatic from sleep depravation and listening to his music that I wrote him the following email: I have no idea how I came across your site. Probably after reading the wikipedia Chiptunes page and searching around a bit (since you don&apos;t seem to be linked on there... go add yourself!). I had the contents of your Chiptunes page on my ipod for a while before I really listened to it a lot....</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[Something weird happened to me recently. I had my first screaming-crying-girl-throwing-her-panties fanboy moment for some guy I discovered on teh intarnets. He's virt (<a href="http://virt.vgmix.com">http://virt.vgmix.com</a>) and I felt so ecstatic from sleep depravation and listening to his music that I wrote him the following email:

<blockquote>
<p>I have no idea how I came across your site. Probably after reading the wikipedia Chiptunes page and searching around a bit (since you don't seem to be linked on there... go add yourself!). I had the contents of your Chiptunes page on my ipod for a while before I really listened to it a lot. The first song I downloaded and listened to a lot was the thriller cover, which I thought was just so cheesy to be brilliant. I used it to test a Mac audio editing application I was working on this summer, SoundFarmer. Check it out:
</p><p>
<a href="http://donovanpreston.slide.com/c/SoundFarmer ">http://donovanpreston.slide.com/c/SoundFarmer</a>
</p><p>

Specifically:
</p><p>

<a href="http://item.slide.com/y/uid=5eilEp2bBu3zp7fdnfWThvdchdJNe1P50VhphDVUTV35s_UPnkCLsZB6WKutK_7Y/SoundFarmerAugust05.png
">http://item.slide.com/y/uid=5eilEp2bBu3zp7fdnfWThvdchdJNe1P50VhphDVUTV35s_UPnkCLsZB6WKutK_7Y/SoundFarmerAugust05.png</a>
</p><p>

I didn't really listen to much of the other stuff from the chiptunes page or thriller for a while. Then, I was at the gym yesterday on the treadmill, sorta in the zone, just closing my eyes and concentrating fully on what I was hearing. I think it was in the middle of "blastoff", right about 1:08, where the progression slams right through the fucking roof and the chorus kicks in and breaks it down and then the next section starts slicing microthin shavings through your brain with the distorted guitar and then here we go up and up and up and arpeggio and staccato and tension hold and release and OH FUCK YEAH bring it back around to the chorus again!!! I was almost in tears. I actually had chills. Goosebumps. (All while sweating my ass off at the gym!) I am not shitting you.
</p><p>

Anyway, I went and downloaded every other single mp3 I could find on your site earlier this morning (say hi to your server logs for me ;-) and was digging the gameboy choons but it wasn't until I got to MC Nachbar that I realized that you are a fucking GENIUS. GEE-NEE-USSSSSS. A fucking polymath. So I wanted to mail you and let you know. You made my year.
</p><p>

Nostalgia and speculation on the nature of human creativity follows:
</p><p>

When I was in highschool, I found a copy of SoundTrecker (a Mac mod tracker) and a few mods somewhere. Pretty soon I was downloading mods from boards as fast as I could. At one point I had an entire syquest 44 cart filled up with em. Pretty amazing over a 9600 baud modem! I remember when I eventually had a 28.8 and I could download mods faster than I could listen to them... that was quite an epiphany (I had the same epiphany when I discovered mp3 ftp servers a few years later when I worked at the state of michigan, which had a T3. I have not yet had that epiphany with movie torrents yet, but I have a feeling we're close. I also don't really like video as a media). Then when I was in college I found my favorite song ever... FOOP.MOD, a brilliant breakbeat choon that I still love to this day. I was also buying CDs at the time from various random techno acts of the day, but with the exception of Aphex Twin, Luke Vibert, and Mike Paradinas, I was continually disappointed. There was just something about the raw emotion and uncut feel of mods that compelled me much more than some random crappy-ass major label release.
</p><p>

There is a psychic difference between the product that one creates for love versus money. When someone really, truly loves something and does their absolute best, it bleeds out between the lines, oozes all over your hands and sticks to you and won't wash off. I work at slide because I love programming, and the fact that I get paid is a pleasurable side effect. It is this raw hot plasma passion that fuels the internet, the blogs-versus-journalists and mp3-versus-record-mafia battles. The 9 to 5 work week and the boss-employee fiction is a recent creation in human evolution. The creative drive of which I speak is not. It may not happen tomorrow, but the politcal and social fads of the day will fade. They will be replaced with new social customs and norms. Each step of the way humanity will delude itself into thinking this custom is "natural" and has somehow always existed. But the only thing that has always existed is the creative big bang. God. The Universe. Order from chaos, strange attractors in the cellular automata. Find it, feel it, follow it, hold on.
</p><p>

So yeah. Thank you for who you are and for letting me see it through the magic of the internet.
</p>
</blockquote>

If I don't post to my blog more often it is going to become a barren wasteland, so perhaps I shall begin posting on a wider range of topics like this one.
]]>

</content>
</entry>
<entry>
<title>JavaScript sucks ass, part one million</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2005/10/javascript_suck.html" />
<modified>2007-08-02T04:38:50Z</modified>
<issued>2005-10-06T03:03:08Z</issued>
<id>tag:ulaluma.com,2005:/pyx//4.1574</id>
<created>2005-10-06T03:03:08Z</created>
<summary type="text/plain">In the spirit of Bob Ippolito&apos;s JavaScript Sucks posts, here is one of my own. Sit down and let me tell you a tale about the little language that is so close to being good, yet so far... Recently, I changed jobs. I joined a company called slide, which is building a hybrid photo sharing application using a combination of fat client and rich web technologies. In my drive to create responsive web applications I have been exploring techniques which make heavier and heavier use of client-side JavaScript. I now find myself doing less and less Python and more and...</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[<p>In the spirit of Bob Ippolito's JavaScript Sucks posts, here is one of my own. Sit down and let me tell you a tale about the little language that is so close to being good, yet so far...</p>

<p>Recently, I changed jobs. I joined a company called <a href="http://slide.com/">slide</a>, which is building a hybrid photo sharing application using a combination of fat client and rich web technologies. In my drive to create responsive web applications I have been exploring techniques which make heavier and heavier use of client-side JavaScript. I now find myself doing less and less Python and more and more JavaScript rendering code.</p>

<p>I don't really mind this too much. I think JavaScript is a reasonable language, with reasonable anonymous function syntax, real closures with mutable parent scopes, and prototype inheritance (with the most bizarre implementation that unfortunately renders it almost unusable). However, every once in a while I hit some issue which drives me absolutely insane trying to debug.</p>

<p>Here is what I ran in to. The following:</p>

<pre>{'foo': 1}</pre>

<p>Is not valid syntax. However, the following:</p>

<pre>foo = {'foo': 1}</pre>

<p>Works fine. I ran in to this issue while trying to eval constructed strings of javascript. Even though eval returns a result, giving it a single JavaScript object literal results in an exception. Tacking on an assignment at the beginning fixes the issue. Ugly.</p>]]>

</content>
</entry>
<entry>
<title>From San Francisco to Detroit for MacHack 20</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2005/07/from_san_franci.html" />
<modified>2007-08-02T04:38:48Z</modified>
<issued>2005-07-29T00:42:41Z</issued>
<id>tag:ulaluma.com,2005:/pyx//4.1481</id>
<created>2005-07-29T00:42:41Z</created>
<summary type="text/plain">I have always wanted to go to MacHack, but I never actually have. Ironically, I even lived in Ann Arbor&amp;#8212;just miles away from the Dearborn location&amp;#8212;for a few years in the 90s. This year, since I was laid off from work and could afford to take the time, I decided to go. So far it has been an amazing experience, and thus I relate a story of the journey as told in pictures. Before boarding a plane for Detroit, I spent a night at a hotel in San Francisco. They apparently had internet access from out of the 19th century....</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[<p>I have always wanted to go to MacHack, but I never actually have. Ironically, I even lived in Ann Arbor&#8212;just miles away from the Dearborn location&#8212;for a few years in the 90s. This year, since I was laid off from work and could afford to take the time, I decided to go. So far it has been an amazing experience, and thus I relate a story of the journey as told in pictures.</p>

<p><a style="display:block" href="http://soundfarmer.com/pictures/machack05/0.jpg"><img src="http://soundfarmer.com/pictures/machack05/thumbnails/0.jpg" /></a>Before boarding a plane for Detroit, I spent a night at a hotel in San Francisco. They apparently had internet access from out of the 19th century.<p>

<p><a style="display:block" href="http://soundfarmer.com/pictures/machack05/1.jpg"><img src="http://soundfarmer.com/pictures/machack05/thumbnails/1.jpg" /></a>The view from my hotel in San Francisco was stunning...</p>

<p><a style="display:block" href="http://soundfarmer.com/pictures/machack05/2.jpg"><img src="http://soundfarmer.com/pictures/machack05/thumbnails/2.jpg" /></a>...while the view from my hotel in Detroit is less so...<p>

<p><a style="display:block" href="http://soundfarmer.com/pictures/machack05/3.jpg"><img src="http://soundfarmer.com/pictures/machack05/thumbnails/3.jpg" /></a>...and apparently in a low-rent neighborhood.<p>

<p><a style="display:block" href="http://soundfarmer.com/pictures/machack05/4.jpg"><img src="http://soundfarmer.com/pictures/machack05/thumbnails/4.jpg" /></a>The snacks at MacHack are sponsored by Google this year and are therefore of very high quality...<p>

<p><a style="display:block" href="http://soundfarmer.com/pictures/machack05/5.jpg"><img src="http://soundfarmer.com/pictures/machack05/thumbnails/5.jpg" /></a>...especially the candied fried eggs, which are delicious.<p>
]]>

</content>
</entry>
<entry>
<title>LivePage rules</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2005/07/livepage_rules.html" />
<modified>2007-08-02T04:38:48Z</modified>
<issued>2005-07-12T04:08:52Z</issued>
<id>tag:ulaluma.com,2005:/pyx//4.1463</id>
<created>2005-07-12T04:08:52Z</created>
<summary type="text/plain">At SuperHappyDevHouse last weekend, I finally got the time to update the Chatola example to the latest livepage APIs, which I was developing in a series of branches named livepage-completion-notification. Since all the examples are now updated and the new API is relatively robust and stable, I merged this long-standing branch into trunk today. These API changes were the major thing I wanted to get done before releasing Nevow 0.5. Unfortunately, after the 0.4.1 release the other major change occurred: Depending on zope.interface. formless.annotate.TypedInterface did some things with Interface that zope.interface doesn&apos;t like at all. So I&apos;ll have to decide...</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>
<dc:subject>Nevow</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[<p>At SuperHappyDevHouse last weekend, I finally got the time to update the Chatola example to the latest livepage APIs, which I was developing in a series of branches named livepage-completion-notification. Since all the examples are now updated and the new API is relatively robust and stable, I merged this long-standing branch into trunk today.</p>

<p>These API changes were the major thing I wanted to get done before releasing Nevow 0.5. Unfortunately, after the 0.4.1 release the other major change occurred: Depending on zope.interface. formless.annotate.TypedInterface did some things with Interface that zope.interface doesn't like at all. So I'll have to decide how to deal with this; right now I'm leaning towards hacking them out using any means necessary. It won't be pretty.</p>

<p>With livepage solidifying, formless next up to be put through the refactoring ringer, and a planned context refactoring in the future, Nevow is really starting to move towards a stable 1.0 target.</p>

<p>One last thing... I have a secret LivePage project that I have been working on which I am very eager to show the world. Some of you know about it; don't tell anybody what it is yet, I want it to be a surprise :-)</p>
]]>

</content>
</entry>
<entry>
<title>Please take this oath</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2005/06/please_take_thi.html" />
<modified>2007-08-02T04:38:47Z</modified>
<issued>2005-06-16T23:50:06Z</issued>
<id>tag:ulaluma.com,2005:/pyx//4.1421</id>
<created>2005-06-16T23:50:06Z</created>
<summary type="text/plain">I, your name here, do solemnly swear, never to play a 6 over 4 polyrhythm in a four-on-the-floor dance track, where the rhythm repeats every 4 or 8 measures, lasts for a duration of one measure, and has a timbre similar to that of knocking on wood or stomping on the floor. Thank you....</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[<p>I, <i>your name here</i>, do solemnly swear, never to play a 6 over 4 polyrhythm in a four-on-the-floor dance track, where the rhythm repeats every 4 or 8 measures, lasts for a duration of one measure, and has a timbre similar to that of knocking on wood or stomping on the floor.</p>

<p>Thank you.</p>
]]>

</content>
</entry>
<entry>
<title>Multiuser Programming</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2005/05/multiuser_progr.html" />
<modified>2007-08-02T04:38:46Z</modified>
<issued>2005-05-19T07:56:23Z</issued>
<id>tag:ulaluma.com,2005:/pyx//4.1377</id>
<created>2005-05-19T07:56:23Z</created>
<summary type="text/plain">When I was in High School, LambdaMOO opened to the public. I spent a lot of time in high school and college hanging out there, programming, and even did my first web application development on E_MOO, which had an HTTP server implemented in moocode. After E_MOO went down, I decided that I wanted to recreate the MOO experience as a graphical multiuser networked programming environment. The ability to log in to a machine, edit some code, manipulate the &quot;object&quot; whose code you just edited, and hand it to your friend halfway around the world for debugging is a very compelling...</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>
<dc:subject>Nevow</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[<p>When I was in High School, LambdaMOO opened to the public. I spent a lot of time in high school and college hanging out there, programming, and even did my first web application development on E_MOO, which had an HTTP server implemented in moocode. After E_MOO went down, I decided that I wanted to recreate the MOO experience as a graphical multiuser networked programming environment. The ability to log in to a machine, edit some code, manipulate the "object" whose code you just edited, and hand it to your friend halfway around the world for debugging is a very compelling experience. I hadn't seen it recreated to my satisfaction and I wanted to do it.</p>

<p>I spent a few years coding, but it was slow going. Both network applications and GUI applications require a different mindset than the batch process style of programming which is what you learn in computer science classes. Event driven programming takes a lot of getting used to, and even when you understand what you are doing, it can be difficult to write and debug event-driven in C or C++, the language of choice in the mid 90s.</p>

<p>In 1999, I was doing a lot of Flash work and saw how it might be possible to tie a Flash front end to a multiuser back end server. When Flash 5 came out, I decided to revive the idea of a graphical front end to a multiuser programing environment. I wrote a simple HTML page which contained some JavaScript DHTML code I put together for mutating the DOM and embedded a small, wide Flash movie towards the bottom of the page. The movie contained an input text box and some ActionScript which sent the contents of the box over an XMLSocket when the user pressed return.</p>

<p>Because the XMLSocket used null bytes to delineate each message sent across the wire, I hacked the C source of the MOO server (running a MOO core my friend Pictwe and I had been running since 1995 -- MOOf) to send null bytes between each "line" of output from the server.  Because of restrictions Flash placed on the hosts and ports to which you could open an XMLSocket, I had to create an application server capable of both serving the HTML, JavaScript, and Flash files, and proxying the XMLSocket connection to the actual MOO server. I had done a few simple CGIs in perl and thought about using that, but perl sucked. I did a bit of web searching and discovered Python.</p>

<p>After reading the socket and threading documentation (old habits die hard) I had a simple server working. You could load the web page, type commands in a text box, press return, and your command would be sent to the server where it was executed like it came from any other client being used to access the MOO. Any time the MOO generated any output on your connected socket, the intermediary server would push it into the browser over the XMLSocket, the ActionScript would unpack it and send it to JavaScript using LiveConnect, and the JavaScript would use DHTML to change the page. Sound like AJAX? :-)</p>

<p>Shortly thereafter I got a full-time job writing Python web applications. After developing for a few years in Webware and Zope, I decided to play around with some ideas I had for an easier to use templating system. This led to the creation of DOMTemplate, Woven, and Nevow, and it turned out to be a longer process than I had hoped. Sometime in late 2002 I decided to revisit the idea of performing out-of-band communications with a server to allow the web application running serverside to push and pull information into and out of the browser. I called it LivePage, and it was based on a highly transparent Model-View-Controller design, where controllers received events from the browser, updated models, and views automatically re-rendered themselves based on model dependencies. The results were then shipped to the browser and some DOM hackery was employed to replace the old DOM fragment with the newly rendered view.</p>

<p>The original Woven implementation of LivePage used Flash XMLSocket as the out-of-band event conduit. XMLHttpRequest was around at the time, and I did attempt to use it, but it reeked of MSIE nastiness and wasn't very standard cross-browser. XMLHttpRequest also has the distinct disadvantage of being based on HTTP. XMLSocket is a persistent, two-way, asynchronous socket architecture that made it delightfully easy to implement both Client-to-Server events and Server-to-Client events. XMLHttpRequest can only send data to the server once, and if you repeatedly send data from the server to the client and handle it incrementally, the document will consume memory without bound.</p>

<p>People thought I was crazy to even try to make web browsers do the things I wanted to do. It'll never work, it'll never be cross-browser, browsers can't handle it, people won't understand it... But I persevered. Browser stability was a real problem. After leaving a live page open for a while, with lots of changes being sent, browsers would leak all over the place and eventually crash. Both IE and Mozilla crashed like crazy. Eventually, after Gmail came out, the browser vendors seemed to get things under control and DOM mutation is relatively reliable now.</p>

<p>In October of 2003 when I sat down to spend a bit of hacking to try to come up with ways to simplify Woven, Nevow went from proof-of-concept to ready to use in a weekend. It wasn't until Gmail was in private beta that I decided it was time to revisit LivePage. This time, the aim was to keep the implementation as short and easy to understand as possible, with the hopes that other people would be able to figure out how and why to use it. I also decided to use XMLHttpRequest as an experiment, to reduce the number of dependencies. XMLHttpRequest makes some aspects of the architecture more difficult (Server-to-Client events) but in some ways makes other parts of the implementation much easier.</p>

<p>Since I only get to work on LivePage in my spare time, it has been slow going. However, the implementation as it is in Nevow is now almost ready to tackle the task of constructing very dynamic, complex applications. There are some implementation details which, after being exposed to the real world for a while, need refactoring. I have a few ideas on how to make it even easier to use from an end-user programmer's perspective. Finally, a coherent idea of how error handling occurs between client and server is starting to take shape. In the latest livepage branch which includes some unfinished improvements, which I hope to merge in the next week or so, the server can reliably handle an exception which occurs on the client. That's right, Python code can be written to handle client-side JavaScript exceptions. Also, LivePage as it exists in the 0.4.1 release has very robust "User has left the page" notification support. If the user clicks the back button, closes the browser, or even crashes their machine, the server is guaranteed to know about it no more than a minute or so later.</p>

<p>I have spent 10 years of my life, on and off, working towards this dream I have. Nevow and LivePage are the latest incarnations of puzzle pieces which fit into the mosaic of this dream. Hopefully someday very soon I will start fitting the pieces together and start to see what a true multiuser web application looks like. We already have a taste for what collaboration can enable; sharing information using weblogs, instant messengers, wikis, file sharing applications, and tools like SubEthaEdit allows to more rapidly fine-tune our idea of what others are thinking. Only a few pieces are missing; a more graphical, spatial ability to arrange information, where information can be picked up easily and carried from place to place in order to sort and categorize it; a more real-time sense of community where presence information gives us a sense of who we are near and allows us to easily communicate with them; and a more immediate programming model where changes can be made to live applications and applied immediately, with results available for all to see. All the pieces are there, they just need to be put together to complete the puzzle.</p>
]]>

</content>
</entry>
<entry>
<title>SSH authorized_keys problems</title>
<link rel="alternate" type="text/html" href="http://ulaluma.com/pyx/archives/2005/04/ssh_authorized.html" />
<modified>2007-08-02T04:38:45Z</modified>
<issued>2005-04-09T17:27:43Z</issued>
<id>tag:ulaluma.com,2005:/pyx//4.1313</id>
<created>2005-04-09T17:27:43Z</created>
<summary type="text/plain">Note to self: whenever you have problems with SSH authorized_keys not working, check the permissions on the directories and files. Here are some quick instructions for getting SSH authorized_keys working on a new host: ssh to the remote host and: mkdir .ssh chmod 700 .ssh Back on the local machine: cat .ssh/id_dsa.pub | ssh remotehost &quot;cat &gt; .ssh/authorized_keys; chmod 600 .ssh/authorized_keys&quot;...</summary>
<author>
<name>Donovan</name>
<url>http://pyx.ulaluma.com</url>
<email>dp@ulaluma.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://ulaluma.com/pyx/">
<![CDATA[<p>Note to self: whenever you have problems with SSH authorized_keys not working, check the permissions on the directories and files. Here are some quick instructions for getting SSH authorized_keys working on a new host:</p>

<p>ssh to the remote host and:</p>

<pre>mkdir .ssh
chmod 700 .ssh</pre>

<p>Back on the local machine:</p>

<pre>cat .ssh/id_dsa.pub | ssh remotehost "cat > .ssh/authorized_keys; chmod 600 .ssh/authorized_keys"</pre>
]]>

</content>
</entry>

</feed>