This week has pretty much flown by. The major highlight has been a weekend visit from P and K, which has been a welcome change of pace from school work.
With a lot of help from our visitors on Saturday, we excavated about 5 inches of soil from the site of our first garden bed, a sort of squared-off C shape that we'll soon match with a second bed leading from the water barrel.
The work basically progressed in four stages. First, we got a bunch of large boxes from the Peddler Bike Shop and laid them out on the ground to figure out where we wanted the beds. (Happily, a bike box is about the right width for a raised garden bed, and the folks at our bike shop are pleased to divert them to a useful cause.) I found the boxes very helpful for visualizing the actual size and shape of the beds on the ground, especially as the sun transits overhead and exposes areas of sun and shade during the day. Next, P used a cutter mattock to chip up the sod in the area under the boxes, and the rest of us shoveled the sod and dirt into a pile on the side of the lawn. (We will likely add much of this pile to a comfrey tea this summer, since it contains a bunch of bermuda grass runners.) I trimmed the corners on a few of the boxes, and K cut some drainage holes in them, and then we laid the boxes into the depressions in the ground, making sure that the edges of the boxes covered the sides of the holes, to prevent bermuda grass from growing into the beds. Finally, we laid bricks around the edges of the boxes so that we have about a foot of vertical space for dirt in the beds. In the next week or so we'll get a couple yards of dirt from a garden store, and then we'll be ready to plant our veggie seedlings !
I feel old these days when I work on projects like this, because all of the digging puts a hurt on my back. Somehow I used to think back pain was something I wouldn't ever have to deal with, but boy was I wrong. Luckily, stretching and resting seem to work well for repairing the back muscles, but the feeling of getting older doesn't go away that easily.
This week we also finished up the bulk of the painting on the house ! The bedrooms, hallway, and living room are all finished, modulo some touch-ups at the corners of the ceilings. The kitchen still needs to have one partial wall painted white, but that will about do it for the major painting duties.
The work is never actually done, of course, because after we finish the walls we still have a large cabinet and 8 or 9 doors to paint, and then hinges and other hardware to turpentine, oil, and reinstall. But we've largely been able to move our furniture back to its original position in the house, and it's really nice to have floors instead of dropcloths again.
I spent a good bit of time last week installing a bunch of new hard drives in my computers at work and setting them up as RAID-5 arrays. This process went well once I got all the drives (I ordered three 2TB WD Caviar Greens and went through two RMAs before I had three actually working drives) but I ran into some snags while reinstalling Ubuntu. Here's the situation. I have an Ubuntu machine with one drive, call it drive A, that contains a bunch of data I want to move to a new RAID array. I install drives B, C, and D in the machine, set up RAID, and move the data to the array. I need to use drive A in another machine, so I install Ubuntu on a new drive, call it drive E, on a different machine (because the target machine can't boot from USB or CD). After swapping drive A out for drive E, the RAID array will not start ! Concerned about massive data loss, I replace E with A again and boot up, and the RAID array starts fine. So, even though all the respective drives are plugged into the same SATA ports, the Linux kernel sees them somehow differently, and will fail to create the RAID array just the way it was before. My solution, which was dangerous but worked, was to boot the machine with its final drive configuration (B+C+D and E), and then re-create the RAID array manually. Thankfully, I had recorded the mdadm command I used to create the array (and in particular the chunk size), so after re-syncing the third drive I had a complete RAID setup that worked, with no data loss.
During the course of this adventure, which lasted a few days because it takes a long time to sync up a 2TB RAID array, I had some interesting realizations about system administration on Ubuntu. First and foremost, I had almost forgotten how to do many parts of these tasks, which I realized was because I haven't had to do any of them in several years ! Ubuntu is completely to thank for this blessed state of ignorance ; it really just works, and my life is better for it. The second realization was that system administration is really not fun, which I had also completely forgotten in the course of running these Ubuntu servers that work well. Thank you, Ubuntu !
On Thursday I started wrapping the gnuspeech Tube Resonance Model for my current synthesis work. I have been casting about this semester for a programmable articulatory synthesizer, and, although it is open and easy to install, praat just doesn't cut it. Praat runs on Ubuntu, but the scripting language is opaque and poorly documented, and there are no examples of scripts out there that I can use to understand how to make praat generate audio over the course of more than a couple hundred milliseconds. It seems to me that Praat is more a tool for phonetics than for speech, as you might guess by looking at the project's subtitle.
On the other hand, the world of speech synthesis apart from Praat seems centered around text-to-speech. This is understandable, given the revered position of text in computer science, but I need a programmable speech synthesizer that gives me a small number of temporal control knobs, either via formants or “muscle” parameters. Gnuspeech tempted me because it provides a small number of control parameters, and the code is compact and well written. I have been reluctant to try wrapping it myself, lest I get tied up in a month-long wrangle with some code I don't know well. But, as it turns out, distutils, SWIG, and the gnuspeech code made things relatively easy to handle, so before I knew it I had a wrapper ! I am working out what to do with the result, but I hope to put it up on pypi soon.
This week I've got a lot of programming on the table. I'm continuing work with B on the reinforcement learning driving simulator. We've had problems getting consistent learning behavior, so I will write tests to shed light on some questions we have about the simulation. Is the world being quantized in a way that introduces perceptual aliasing ? Or does the action space create aliasing ? Is the representation of time interacting poorly with the dynamics of the world ? Or is there just a bug somewhere in the Q learning implementation ? Lots of unit tests are in store this week.
I'm also finally at a point where I can train up a number of matching pursuit objects on sound data. This week I'll be running those in the background while I'm writing tests for the reinforcement learning code. I think the Smith/Lewicki code is ready to go, so I'm going to give that a whirl, too.
Finally, this weekend is GradFest at UT, so I will be meeting some of the prospective students on Saturday over a round of disc golf at Zilker. Come join us if you have discs and want to have a nice afternoon in the park !