dinner at the chefs table

After spending a ton of money in town, what could be better than a great meal on the ship. One of the activities that Jane had researched before the cruise is called the Chef’s table. This is a really exclusive experience that they only do once a cruise for a very limited number of people. In our case there were ten of us lucky passengers that called toget our name on the list as soon as we got on the ship. Of the ten all of us were experienced multi-cruise passengers. A couple of Florida cruises 3 times a year. Another couple from Ohio had cruised many times with their family. They were a bit older than us as their kids were out of college by now. The two other couples were both gay men. Ha, no stereotypes here that a foodie event should have four gay men in attendance! One couple was from LA and the other from New York.

We all met at the International cafe for a short pre-dinner briefing. We met the Executive Chef who was our tour guide for the galley and the rest of the evening. The chef directs a staff of around 250 spread throughout seven galleys on the ship. We began our tour of the galley that served our dining room by putting on our white FDA inspector lab coats. As the tour was happening during dinner service we had to wash our hands wear the lab coats.

The chef was really friendly and very willing to answer any of our questions. We told him how much we liked the parmesan crust under the fettucine alfredo and he launched into a very detailed explanation of how they made the crusts each day. I got the whole thing on video with our little video toy.

At the end of the galley tour we gathered in an out of the way corner and had hors-de-ouveres and champagne. We started out with a sashimi tuna with wasabi sauce, served on a little scoop made of a fennel root. This was followed by: a delicious pate, vegetarian quiche, Escargot, and caviar served on a little potato pancake. Yes I ate everything including the caviar which was really very good served on the potato pancake with a little sour cream. As he introduced each appetizer we got a summary of how it was prepared. It was really interesting. None of the appetizers or anything in our meal is available anywhere else on the ship. It is a meal that is totally unique to the Chefs Table dinner.

After the appetizers we made our way through the dining room to a special table. As we walked through the dining room everyone applauded the chef and many applauded us as well having no idea that we were just on a special tour!

While we were in the kitchen we were promised a lobster risotto and some “special surprises” We began with another little appetizer and some Pouilly Fume. The latest appetizer was beef carpacio on foccacia. The carpacio was layered with alternating layers of parmesan cheese and arugula. It was good but too much considering everything else we knew was coming. Next was the Lobster Risotto. This was probably the best Risotto I’ve ever had in a restaurant. (except maybe that one exceptional night at LaRanna where I had the Asiago cheese risotto with cauliflower)

By now of course our pallets were in real need of cleansing. So the maitre de brought out a round of lemon sorbet. Of course sorbet alone would not work as well as sorbet with Grey Goose vodka poured over the top.

With clean pallets we finally moved to the main course. Potatos gratin with lobster, veal, and tornados of beef. Plus some veggies thrown in for good measure. I can only describe this course as a cruise size portion. Each person had their own platter full of meat, potatos and veggies. Everything was just great. At this point we switched to a Wolf-Blass Shiraz to accompany the main course.

After the main course was done we moved on to the cheese course. Roquefort balls and a bridge of parmesan cheese. This was not my favorite course as the roquefort was really strong, and the parmesan bridge was ‘more ‘structural than edilble’ in the words of one of our dinner companions.

The next course was the true dessert course, presented by the ships pastry chef. He had constructed a really nice Amaretto desert plate for us which was really a sculpture on a plate. Desert was served with a delicious desert wine.

Next we had our espresso or capucino served with some home made chocolates.

The grand finale was nice glass of limoncello.

After the meal was over the maitre de and photographer showed up. Each couple got their picture taken with the chef and staff, and each ‘lady’ recieved a cookbook. Notably the gay couples did not receive any cookbooks! This was rectified after one of the guys took the maitre de aside and explained that it probably wasn’t fair for them to be excluded from the cookbook. Since they paid the same as us and probably cooked just as much as the rest of us. One of the guys was a professor at Loyala Marymount in LA and he and I talked a little college shop during the dinner.

When one of the other guys found out I was leading a J-term trip to Silicon Valley during January he volunteered to connect me with a friend of his that works at Pixar! Wow that would be an awesome dinner result if we are able to get a tour at Pixar.

airboat ride in the everglades

This morning started out like any other morning. The alarm went off at 6:15 so that we could get up and get on our way to the everglades. We left the Embassy Suites and walked down 17th Avenue toward the intercostal waterway where we were picking up our rental car. On the way we split our forces with half of us going to Einstein’s Bagel Shop and half to Starbucks for Tea, Chai Latte and Cocoa.

We beat the traffic heading out of town easily on our way to the Sawgrass recreation park. It is part of the Everglades national park. We had an appointment with Captain Randy and his airboat at 8:00. Our instructions were to meet him ½ mile past mile marker 38 on highway 27. We got there early, the sun was still pretty low in the sky and finished our breakfast in the small parking lot. A few minutes later a pickup truck pulling an airboat with seating for nine pulled into the lot. We watched as the captain fired up the 500 horsepower Corvette engine hooked up to a four blade airline propellor. After the short checkout period he backed the boat and trailor into the water and brought the boat around to the ground.

We greeted Captain Randy, who showed us onto the boat and gave us a short intro to our safety equipment, which consisted of headphones to protect our eardrums from the sound of the engine and airplane prop. He invited one of us to join him in the topmost pair of seats as the co-pilot. We took off, and after a short lesson in steering the airboat, push forward for right and pull back for left, he turned the steering over to me. Driving an airboat takes a lot more anticipation than driving a ski boat. When you want to turn a corner on one of the trails in the everglades you need to start doing so a few seconds in advance. Luckily if you cut the corner to sharp, or too late you really don’t run into any problems. You make the trail a little wider as you mow down the Sawgrass and cattail, but there seems to be enough of both to go around.

Taking the early morning trip was a great idea as the angle of the sun was just beautiful, and we saw hundreds of birds as we cruised through the trails. We saw hawks, and herons, and vultures and birds of all different colors and varieties. In addition to the birds we were always on the lookout for gators.

Captain Randy seems to have come from a long line of Everglades boat captains that have been involved with all kinds of dubious activities. Pappy was an alligator poacher, and Randy and his brother kept small alligators as pets when they were younger. As Captain Randy fed one of the gators along the way hotdogs and marshmallows he informed us that feeding the gators was strictly against the law. That didn’t stop him, and we got some great pictures of Randy feeding his Mi Amoure Catalyna.

Shortly after our gator feeding experience, we reached the farthest point on our tour. By this point we were all pretty comfortable with the boat and so I was sitting in the bow taking pictures and the rest of the family was comfortably spread around. Randy headed the boat down a narrow trail and suddenly I noticed that we were boating in mud instead of water. As the mud got thicker and drier the boat went slower and slower until we finally came to a halt. Stuck in the mud!

After trying to gun the giant engine on our airboat for many minutes Randy finally admitted that we were stuck and going to need some help getting out. At this point we learned a couple of things about Randy’s friend Lyle. First, Lyle had an extremely long message on his business phone, and his cell phone. Second we learned that Randy had helped Lyle out of a similar situation just a couple of days ago. After failing to reach Lyle by phone we resorted to the old fashioned VHF radio. “Laxahatchie, Laxahatcie, Laxahatchie, Lyle this is Randy are you there, over….” With those words our 3-hour tour became a rescue mission.

Our airboat was partway down a trail that had been drained of water. We were about 150 feet onto the mud and it looked like the mud continued for another 300 before it rounded a bend. The trick was to turn the airboat around and pull it out the short way. Unfortunately in the Everglades walking on mud is not so easy. When Randy got out of the boat to try and use a rope to turn us around he sunk up nearly to his waist. To get back to the edge of the water required him to crawl on hands and knees to distribute his weight.

The four of us stayed in the boat feeling somewhat amused at our situation. Clearly we were not in any sort of life threatening emergency but for Randy this was clearly a pain in the butt and probably somewhat of an embarrasment. We were not dressed to jump in the mud and help him, although Kaia seemed very willing to do so. Josh was protecting his new green and white Nikes that Grandpa Miller bought him for Christmas but other than that I think he would have helped too. I had on a brand new pair of Tommy Bahama shorts that I was definitely not interested in getting covered in Everglades mud.

The rescuue mission was long and tedious as Lyle’s big boat could not turn around at the end of our trail. This required the help of a third airboat driven by a kind stranger. The third boat acted as a tug boat getting Lyle in the proper position and ferrying the rope into Randy when necessary.

The procedure that Randy and Lyle determined for getting us out involved tieing a line to the bow of the boat and then pulling with Lyle’s larger airboat. To a physicist this seemed like a dumb idea as the angles involved were all wrong, but neither Randy or Lyle were physicists so this was not an issue. After breaking Randy’s bowline there was some thought that the way to resolve the issue would be to bring a couple of pieces of plywood so that the tourists would be able to walk out of the trail but going from plank to plank and moving the planks as we made progress.

Walking the tourists out was not an acceptable plan to Captain Randy. It was clear that Lyle’s larger rope needed to be connected directly to the bow of our airboat and then threaded through the side of the boat about halfway back. Randy decided that he would get to the side with a second rope and pull to try and provide the needed force vector to get the boat to turn to the side. After several long pulls we finally had the boat turned at a ninty degree angle to our original course. (This only took about three hours to get us to this position).

We repositioned the rope to the bow of Randy’s ship and he got in his captains chair. At this point the plan was to have one last pull by Lyle with Randy ready to “Give her Hell” as soon as we were headed in roughly the right direction. With this plan in mind and one last pull we were finally free!

Once free of the mud we followed Lyle back to his docking area where hugs were exchanged and many thumbs up were given to our kind helpers. By this time Captain Randy had completely missed his 11:30 trip and was wanting to make sure we got back to the landing in time to meet his 2:30. So we took off for home base at high speed. After a while he slowed down so that Jane or Josh could drive. Josh wanted to have nothing to do with driving as by this time he was convinced that he would do something even worse than get us stuck in the mud. So Jane took her turn and did a great job of driving the boat.

Just before we got back to the landing we made one last stop with captain Randy to make sure that we had our stories straight. Clearly he was a little nervous that his muddy appearance might be offputting to his next group. Particularly if we were unhappy and complaining about the trip. He really had no reason to worry, all of us thought the trip was a great adventure.

After our exciting airboat trip we planned to stop at the Sawgrass Mill, an enormous shopping center. It took us almost a half hour of driving around to find the Ron Jon outlet store. Even after we found it it took forever to get in because the parking lot was so busy and full. The plan was for us to stop there to get Kaia a swimming suit. Since I had discovered that my old suit was too big for me I decided to get one too. Josh also found himself a nice suit and a football for using in the water.

The next big surprise of the night came when we walked over to Pazzo’s for an italian dinner. We walked in the door and talked to the hostess who told us to wait just a minute as she checked the tables. As we stood waiting for a minute a familiar figure came across the bar headed toward us. Sasan Mokhtari and his family were in the restaurant! they were in town for the soccer tournament. It was really fun to reconnect with Sasan after several years. We had a great talk with Sasan and Mary and their kids Tara, Eva, and Daniel. Tara is a first year at MIT and Eva and Daniel have transferred to Breck. It took Sasan only about 3 minutes to ask me if I would be interested in doing some consulting for him!

We had a great meal, although Josh was feeling a little sick and didn’t eat very much.

beautifulsoup, bonktown and growl

Here’s a little script that combines two of my favorite pass times. Python programming and cycling. is a great site that has steep discounts on road cycling gear. They only sell one item at a time and they typically sell that item until it is gone. I’ve gotten some great deals on clothing and other stuff on that site. Bonktown helps you know whats currently for sale in a number of ways, including a nice dashboard widget that pops up a notifier when something new comes on sale. The problem is that over time I’ve started to ignore the growl notifiers for bonktown, because I’m not interested in lots of the stuff they sell.

So, I wrote this python script that allows me to look for the stuff I am interested in buying. It works by having a file of regular expressions that I use to search the item descriptions when something goes on sale at bonktown. If the item matches something I’m looking for then I get a Growl notification. If not then I don’t hear about it.

Here’s the code:

#!/usr/bin/env python2.6

import re
import urllib
from BeautifulSoup import BeautifulSoup
import Growl

name = “MyBonk” # was BonkMe
notifications = [“search_hit”]
notifier = Growl.GrowlNotifier(name,notifications)

# Read file of search Terms
myTerms = open(“/Users/bmiller/lib/bonk_items.txt”).readlines()

# Get the latest page
bt = urllib.urlopen(””)

doc = BeautifulSoup(

itemlist = doc.findAll(id=re.compile(“item_title”))
price = doc.findAll(id=re.compile(“price”))
desc = doc.findAll(id=re.compile(“item_description”))

for term in myTerms:
for i in range(len(itemlist)):
if itemlist[i] and[:-1],itemlist[i].contents[0],re.IGNORECASE):

This script makes use of several modules:

  • Growl

  • BeautifulSoup

  • urllib

  • re

I would have liked to use one of the standard library html/xml parsers, but I could not find one that was as convenient or easy to use as BeautifulSoup. If you can tell me how to parse messy html with one of the standard library xml modules please let me know.

aquamacs 2.0 elisp fun

While waiting for the white smoke to emerge on Textmate 2.0, I decidedto revisit an old friend. It turns out the emacsen have been busysince I've been using TextMate. Aquamacs 2.0 is a great Cocoa port ofEmacs 23. Not sure whether I should call it a port since emacsofficially supports the OS X operating system.The first thing I did was check out some of the old modes I used touse. AucTeX, GNUs are both packaged with emacs now. The SQL mode that comes withis great and "just works" with mysql and postgresql. There is goodsupport for Python and of course HTML. Two minor gliches in thoseareas that I wish I could fix:
  • I cannot get MMM (multi-major-mode) to work properly. I wouldreally like to have both HTML and Javascript colorized properly whenI'm working on my Django projects. If anyone has any advice ongetting MMM to work right in emacs 23 I would really appreciate apointer.
  • Completion in iPython does not work right. Instead of completingin the ipython shell it just indents more.
In addition to some old friends I discovered a bunch of new modes thatare really nice. JDE for Java development, Muse for creating lecturenotes in a personal wiki style. In addition Muse lets you publish amarkup style format really easily in lots of differnt output formats.I've been a big fan of using Pandoc with TextMate over the last fewyears, but Muse is every bit as nice.One thing lacking in Muse was the ability to quickly bold or ital ortt some part of the text I'm working on. So I decided to dust off mylisp coding ability and cook up my own. The result is shown below. Ithink it is a nice example of a lot of what you need to do in writingbasic lisp extensions for any text processing mode. I'd be happy toget comments on how to improve this.The idea of these simple commands is that pressing cmd-b should boldthe word the cursor is currently on, or the region (if there is one)or simply insert **|** when the cursor is not on a word. It alsotook some research to figure out how to bind a function to the commandkey. (side note: I've finally gotten comfortable with using the optionkey for meta in emacs.)

(defun muse-bold-word ()
(muse-wrap-with-string "**" 2)

(defun muse-ital-word ()
(muse-wrap-with-string "*" 1)

(defun muse-tt-word ()
(muse-wrap-with-string "=" 1)

(defun muse-wrap-with-string (str len)
(if mark-active
(kill-region (point) (mark))
(let ((myword (car kill-ring)))
(insert (concat str myword str) )))
(let ((myStr (thing-at-point 'word)))
(if myStr
(let ((myBounds (bounds-of-thing-at-point 'word)))
(kill-region (car myBounds) (cdr myBounds))
(insert (concat str myStr str)))
(insert (concat str str))
(goto-char (- (point) len)) ) ) ))

(define-key muse-mode-map `[(,osxkeys-command-key b)] 'muse-bold-word)
(define-key muse-mode-map `[(,osxkeys-command-key i)] 'muse-ital-word)
(define-key muse-mode-map `[(,osxkeys-command-key k)] 'muse-tt-word)

3 days of r&r in sedona

After all of our hiking and rafting adventure we are ending the trip with 3 days of rest and relaxation in Sedona. Our major activities here are a Pink Jeep tour, Golfing, and a massage for the women in the family. Otherwise we are doing lots of pool time and have even played a hand or two of 500. Sedona is known for its red rock and beautiful scenery, along with crystal shops and the Ye Olde UFO Shoppe.


We did the Broken Arrow tour with Pink Jeep, which was fun. I think we would have appreciated it even more if we had not already done all the hiking through Zion, Bryce, and the Grand Canyon. Nevertheless it was a good excursion. While we were out there the kids decided to do some rock climbing. Don’t let the pictures fool you this was dangerous stuff:



This morning Josh and I played a round of golf at the Sedona Country Club which is part of the Hilton complex. It was a very nice course and Josh and I both played well. It was a great morning to go as there was nobody in front of us and we were able to play at our own pace and move around the course pretty quickly.

Josh got a new shirt and hat out of the deal as the club had a dress code and Josh did not have any clean shirts that would get him on the tee. I played so well that I had to buy a new shirt to commemorate the occasion. It was 25% off for fathers day so happy fathers day to me.

Jane and Kaia both had facials and hot stone massages. I can’t go into any more detail about that. :-) But they were both glowing and relaxed when they got back.

Tonight we are going to go out for some barbeque and then come back to the room and get packed for the final leg of our journey. Its been a great trip!

grand canyon - river to rim

The call for “Hooaaahhht Coffeeeeee” went out at 4:30AM. It was already twilight in the East and it was time to pack up camp and get on the rafts for the final ¾ mile of our journey. We had all come a long way on this trip. From the first night where everyone managed to find a place to sleep in private, this last night looked like a refugee camp. We didn’t have much room and everyone slept right next to everyone else. Here you can see everyone’s gear and a corner of what we at first called the “Miller plot” and then renamed to Miller Estate.


Here you can see the bridge that connects the Kaibab trail from the North to the South wall. We went a little further downstream to Phantom Ranch and crossed our own bridge.


The facts of the Phantom Ranch trail are as follows: Its a 10 mile hike from the river to the rim. It is a 1 mile vertical difference from the river to the rim. Now the mathematically inclined will say that is only a 10% grade. Not a problem… It was a challenge. They tell you to have two one liter water bottles and to fill them full at the bottom. there is a halfway stop called Indian Gardens with a water station and a 3 mile (from the top) stop with a water station and a 1.5 mile stop with a water station. We filled our water at every stop. You do drink a LOT of water on this hike. You are also advised to rest for 30 minutes at each stop if you are having difficulty.

We left the river at 7AM and were to Indian Gardens by 10:30. This is going well we thought. Unfortunately when you get to Indian Gardens you have only gone ¼ of the vertical distance. We finally arrived at the rim at 3:30. We made a lot of extra stops on the last half of the hike. Jane did not drink enough water during the first half and was struggling a bit during the second part of the hike.


In fact with half a mile remaining she was completely pooped. We asked one of our fellow hikers to send Josh back to carry Jane’s pack the last half mile. Josh wins the good sport award for the day.


Now you might wonder is the hike worth it for all that work? Yes, absolutely you get to see the Canyon in a way that you just can’t imagine by looking down from the rim. Here you can see some of the trail we came up. But not all the way to the river that is hidden in the distance.


Pictures don’t do justice to the amazing beauty of this corner of the world. We are all really glad we did this trip. As I’m writing this from the comfort of the Sedona Hilton, I’m inspired by the message on my plastic Gin and Tonic glass which says that “Travel is not about getting from point A to B, Travel should renew your zest for life.” This trip has certainly done that.

down the colorado into the canyon

For three days we had a great raft trip with Wilderness River Adventures. The trip was amazing! For three days we saw the Grand Canyon in a way that few are lucky enough to see, from the bottom up. As we rafted along we literally saw the history of the world from today to 2 billion years ago. The beauty of this place is just awe inspiring.

We began our trip at Lee’s Ferry, just south of Page Arizona and ended up at Phantom Ranch at the bottom of the Grand Canyon. We shared the trip with another small group (Rocky, Joe, and Denise) and one large group from Lafayette College.

The Lafeyette group really made the trip for us. The group of Geology students was led by Dr. Larry Malinconico (Dr. M) and Dr. Dave Sunderlin. In my slightly biased opinion I thought that Luther students were the friendliest students anywhere. The group from Lafeyette taught me that there are other colleges with really great students. Not only did we learn a lot from lurking in the back of the impromptu lectures but we had a great time getting to know them all.

Here are a couple of examples of how beautiful the canyon is. Here we are in calm water:


Here was one of our short day hikes. You can see our rafts to the right.


Of course no rafting trip would be complete without the opportunity to get wet, which we are about to do here:


And no trip report from me would be complete without a review of the food. In a word, awesome. Here are the two swampers (Kari and Everett) preparing our last dinner. Spaghetti and meatballs, or Alfredo Sauce. We had Salmon and rice one night, grilled New York Strips and Baby Red Potatoes another night. It was all “good eats”.


The leaders of the trip were Richard and Matt. Two excellent raft drivers. Not sure what the proper term is for the captain of a giant rubber raft. But they got us safely through some really “fun” rapids. At one point the Miller family did experience a collective flashback to being stranded in the Everglades when our raft got hung up on Whale Rock. This was right in the middle of the biggest rapids of the trip and we were just starting to wonder how we were going to get rescued when the raft freed itself and we were on our way.

The sleeping accomodations were better than expected by my standards. For three nights we just slept on our mats under the stars. No tents, just sleeping bags, tarps and mats. It was great. Since Arizona does not observe daylight savings time, it was dark by 8:30PM and light by 5:00 AM. So it was an early to bed early to rise kind of trip. One night I woke up at midnight and got out the camera. This picture doesn’t really do justice to the beauty of the night sky in Arizona but it gives you some idea of what we saw from our sleeping bags:


The last day of our trip we got up at 4:30AM and went about half a mile downstream to Phantom Ranch. From there we hiked 10 miles linearly and 1 mile vertically to get out of the Grand Canyon. I’ll cover that experience in another post.

bryce canyon sunrise -- antelope canyon

It was an early morning today. The alarm went off at 5:30 and we were out of the hotel by 5:43. We made a short drive up to Bryce Point in twilight. The temperature was only 37 degrees but it did not seem too cold. We waited a few minutes for the sun to come up over the distant horizon. When it did we were rewarded with some amazing colors in the canyon:


After sunrise we had breakfast at the hotel and then headed south toward Page. We had a slot canyon tour booked for 10:30 Arizona time so we thought we had plenty of time. Unfortunately we ran into an accident that closed highway 89. We had a nice chat with an over-the-road truck driver as we waited for the ambulance and fire crew to clear the road.

We still made it in time for our Antelope Canyon tour. This was an amazing photographic experience. I took way to many pictures but I’m going to have a hard time picking out 10 favorites from the 200 I took. Here’s one as a sample.

After checking out the view of the Colorado River we relaxed at the hotel around the pool. We just got back from our orientation meeting tonight. We got our waterproof bags to pack all our luggage in. We are all looking forward to the raft trip starting at 8:15 tomorrow morning. This will be my last entry until we hike out of the Grand Canyon four days from now.

angel's landing

Our first day of hiking in Zion National Park was great! Here is our goal for the day:


From the bus stop known as “The Grotto” we hiked 2 miles and 1,800 feet up to the top of Angel’s Landing. The hike to the saddle point in the middle of the picture was a fairly easy hike on nice wide switchbacks. The rest of the hike was more exciting. The park service has helpfully installed chain handrails to help you climb over any rough spots or to help pull yourself up the steep bits.

Here’s a picture of the Miller’s at the saddle point:

Here you can see an example of what the last part of Angel’s landing hike looks like:

Here’s a picture of Kaia and I at the top

phoenix to springdale

Long day of traveling today. Left Minneapolis at 9:05 this morning and just got into our room in Springdale UT at 11:00 Mountain time, or midnight back home. Actually we checked in a while ago but went straight to the Bit and Spur to have some dinner since our last meal was at Schlotzky’s in Phoenix.

The GPS said it would be a 7 hour drive. it turned out to be longer than that because we took a side trip to the Desert View overlook in the Grand Canyon. Here is a view from the Desert View of the Colorado River. We’ll be rafting down that river and into the canyon in just a few days. We will be able to see the watchtower from the river on our way into the canyon!


It was still quite a drive from the Grand Canyon to Springdale UT. Along the way we crossed the colorado river just south of where we will get on the raft.


We drove through Zion National Park in the dark. We are all looking forward to a great day of hiking in Zion tomorrow.

vpython version 5

The other day I discovered that the folks working on VPython have been very busy over the last couple of years. I had given up on VPython because the Mac distribution was so difficult to use. It required the X windows server and one point and lots of other extra junk at other times. But now things are easy! There is a great installer package and it just works.

For those of you who have not heard of VPython before it is a 3D graphics module called visual built on top of Python and OpenGL. You can do a lot of nice 3D graphics very simply with VPython. Its great for education in math and physics and introductory computer science.

So as an experiment I built a turtle graphics module on top of VPython. I use turtle graphics a lot in teaching but the TKinter turtles all suffer from some event loop problems when you use them with IDLE. VPython does not suffer from this problem plus gives you a lot of other cool benefits. One of the benefits is that the window resizes automatically for you based on the units you use in your application. Want to draw a picture at the atomic level of detail? No problem, want to draw planets circling each other? Again no problem.

Here’s a screen capture of a fractal tree created in 3-D using my new turtle.

Picture 2.png

Here’s the VPython turtle code:

def tree(t,trunkLength):
if trunkLength < 5:
turnDz = random.randint(20,40)
turnDx = random.randint(20,40)
trunkShort = random.randint(10,20)
if trunkLength < 25:
# right trunk
# left trunk
# front trunk
# back trunk
# restore

If you want to check out the turtle module and play with it, you are welcome to do so: hg clone… Or send me mail.

book plug

Here’s a little plug for our book from our Colleague Mark Guzdial at Georgia Tech. This was written last September right after the book was published but I didn’t find out about it until this morning. Thanks Mark!

In addition, David and I have started a new blog to post corrections and updates to Python Programming in Context Over here If you are already using the book please check it out.

remember the milk

In the past year, I’ve been a passionate supporter of three task management apps. OmniFocus, Things, and Remember The Milk (RTM). I’ve switched back and forth between them trying to decide which one works best for me. I think I’m finally ready to commit to RTM as my long term solution and here’s why.

All three apps have an iPhone component and a desktop component. Although the primary RTM interface on the desktop is through the browser there are plenty of Widgets and other desktop friendly ways to access RTM on the desktop. What I really like about RTM for the desktop is its openness. In terms of the ability to dump stuff into RTM its cloud computing model really works.

With both OmniFocus and Things I have to be on the same subnet as my laptop in order for the wifi syncing between my Ipod Touch and the desktop to work. Unfortunately outside of my house this is rarely the case. With RTM I can be anywhere. That means I’m free to roam anywhere in the world with my iPod Touch and I know that when I dump a task or note into RTM it will be there on my desktop or the web interface when I come back to it. If I forget my iPod Touch (a very unlikely event) I can still dump tasks into RTM from any browser.

The second thing I really like about RTM is its openness. As you can see from my posts below I have developed my own desktop interface to RTM using the Python bindings and LaunchBar. The three things that I want to do most often, with as little fuss as possible are:

  • Add a task

  • Mark a task as complete

  • display tasks

With my LaunchBar integration I don’t ever have to take my fingers off the keyboard to do any of those tasks.

When I’m using my iPod Touch, I think that the RTM client is the best and most fully featured of the bunch. Since RTM has been around as a service for longer than either Things or OmniFocus they have had more time to work on polishing their iApp. It already supports tagging and searching. Things that are coming in the other apps but are already here for RTM on the iPod today.

Because RTM has an open API there are lots of other nice interfaces for you to use that make it easy to dump tasks and notes into your inbox. Do you Twitter? Send a direct message to your RTM inbox. Do you Text? Send using the Twitter RTM gateway you can text directly to your inbox. Email? yes. You can even email a whole list of stuff to RTM as a way to quickly import a long list of tasks or packing items you have copied from somewhere else. Jott, yes. The possibilities are endless and expanding all the time.

python + growl + remember the milk = launchbar task management


Once I could add tasks to my RTM account through LaunchBar I wanted a way to quickly pull up a view of what tasks were due today through LaunchBar. The Growl library provides a nice way of doing this.

The overview is as follows: Activate LaunchBar and type due. This due is installed as a search shortcut and you can search for today, tomorrow, or all (abbreviations are also easy). The search shortcut runs the python script that searches your tasks on Remember the Milk. For each task it finds it puts up a sticky Growl notification so you get a nice list of tasks on your screen. You could easily customize the script to put all the tasks in a single notification but I like them separate.

Since the Growl module registers this script as an application you can also use the Growl Preference Pane to customize the look and feel or even the location of your notifications. You can also customize whether you want the notifications to be sticky or not.

The Code

Here is the code for doing all of this. It makes use of the filter parameter on getList.

#!/usr/bin/env python

from rtm import *
import sys
import Growl

def sendNotify(ts):
if type(ts.task) == list:
for j in range(len(ts.task)):
notifier.notify(“today”,“Task Due: “+ts.task[j].due[:10],,sticky=True)
notifier.notify(“today”,“Task Due: “+ts.task.due[:10],,sticky=True)

if len(sys.argv) == 2:
command = sys.argv[1]
command = “today”

apiKey = “get your own”
secret = “this too”
token = “You will create this”

name = “RTMDue”
notifications = [“today”,“tomorrow”]
notifier = Growl.GrowlNotifier(name,notifications)

if command[:3] == “tod” or command == “:
cutoff = ‘today’
elif command[:3] == “tom”:
cutoff = ‘tomorrow’
cutoff = None

rtm = createRTM(apiKey, secret, token)

if cutoff:
filterString = ‘status:incomplete and (due:%s or dueBefore:%s)‘%(cutoff,cutoff)
filterString = ‘status:incomplete’

theTasks = rtm.tasks.getList(filter=filterString)

if type(theTasks.tasks.list) == list:
for i in range(len(theTasks.tasks.list)):
if type(theTasks.tasks.list[i].taskseries) == list:
for j in range(len(theTasks.tasks.list[i].taskseries)):
ts = theTasks.tasks.list[i].taskseries[j]
ts = theTasks.tasks.list[i].taskseries
if type(theTasks.tasks.list.taskseries) == list:
for i in range(len(theTasks.tasks.list.taskseries)):
ts = theTasks.tasks.list.taskseries[i]
ts = theTasks.tasks.list.taskseries

Next Steps

It would be great if I can figure out a way to have the Growl notification box call a script to mark the task as done. Feel free to leave comments or suggestions or improvements in the comments.

a mid-winter cycling treat

Although the weather back home may have been below zero, in Northern california he sun was out and it was 68 degrees. Perfect weather for a bikeride. So after talking to the nice folks at the Palo Alto Bike Shop Wes and I rented a couple of nice demo road bikes from Calmar bikes in Santa Clara. Calmar is right by our hotel and the staff there was super friendly and helpful in getting us set up for a ride. Incidentally Calmar has no relation to Calmar IA. I road a nice Spanish BH RoadROM and Wes road a hot pink Trek Pilot 5.2. Even though the bike was pink we felt pretty good passing all the californians on the way up Old La Honda Road.

Rather than head out from the hotel on the busy city streets I decided to take Novian’s advice and head into the foothills west of Palo Alto. You can see the ride we took on the map below. This is from a cool website called that I will use in the future for keeping track of my rides.

The ride was just beautiful even though we had to climb 2500 feet to get to the view. On the way up we road through some big redwood trees.

Redwoods on Old La Honda Road

Once you get on Skyline drive you can see the ocean on one side and the Valley on the other. Here’s me, I look more tired in the picture than I actually felt! Really, Honest!

Brad -- Looks tired after the long climb

The rest of the ride is a long coast down Page Mill Road and then some flat riding past the Stanford Dish and the Stanford Golf course. It would have been fun to stop and play 18 holes but I didn’t have my clubs with me.

creating a group twitter repository

For the trip to Silicon Valley I wanted to have everyone be able to twitter about the experience using their own twitter account, but I also want to have a central place for everyone following the trip as a whole to see all of our tweets. How to do that? Python and the Twitter API to the rescue. You can see the results of this by checking out @lutherlive on twitter

import twitter

USER = “Your group account”
PASS = “your group password”
TAG = “tag contained in each message”

api = twitter.Api(username=USER,password=PASS)

# figure out when my last post was
statuses = api.GetUserTimeline(user=USER)
last_post = statuses[0].GetCreatedAt()

# Get the timelines for all friends since my last_post
tl = api.GetFriendsTimeline(user=USER,since=last_post)
for post in tl:
# since my posts may show up in friends timelines avoid reposting loop
if post.user.screen_name != USER and TAG in post.text:
api.PostUpdate(post.user.screen_name + “: “ + post.text)

This little script logs in using the twitter account you create for the group. Importantly, this account must follow all of the group members that you want to be able to re-tweet. When one of the group members wants a tweet to show up on the group account they must use the TAG, in our case @lutherlive, somewhere in their post.

After logging in, the script grabs the timeline for all of the members of the group. This timeline is restricted to the posts since the last a post was made by the group user. This is important to do otherwise you would end up with duplicate re-tweets every time the script is run.

Next the script simply loops over all of the posts and checks for the tag. If the tag is in the post the post is updated along with the screen name of the original group member that made the post.

I put the script into a cron-job on the computer science server at Luther to run every 15 minutes, so while the @lutherlive user isn’t a real time reflection of its group members tweets, its pretty darn close.