Convert pycairo ARGB32 surface to PIL RGB image

June 2nd, 2013

Cairo is great for rendering stuff, but doesn’t give you many options to export your data. The Python Image Library has good options to save stuff. The problem I ran into is that I have a ARGB32 pycairo surface, and PIL doesn’t support ARGB32. It supports RGBA instead. After much experimentation, I came up with the following piece of code, using numpy to solve this problem:

def pilImageFromCairoSurface( surface ):
   cairoFormat = surface.get_format()
   if cairoFormat == cairo.FORMAT_ARGB32:
      pilMode = 'RGB'
      # Cairo has ARGB. Convert this to RGB for PIL which supports only RGB or
      # RGBA.
      argbArray = numpy.fromstring( surface.get_data(), 'c' ).reshape( -1, 4 )
      rgbArray = argbArray[ :, 2::-1 ]
      pilData = rgbArray.reshape( -1 ).tostring()
      raise ValueError( 'Unsupported cairo format: %d' % cairoFormat )
   pilImage = PIL.Image.frombuffer( pilMode,
         ( surface.get_width(), surface.get_height() ), pilData, "raw",
         pilMode, 0, 1 )
   pilImage = pilImage.convert( 'RGB' )
   return pilImage

Using xlsclients to launch programs once from a window manager config

May 14th, 2012

I spent some time mucking around with the awesome and xmonad tiling window managers this weekend. I ended up with an xmonad config that I’m sure is nothing special but that works well for me. One thing that I do want is to launch certain programs (like nm-applet) when I first log in. On top of that, I want to be able to restart the window manager without exiting all my running programs. So you can’t just unconditionally launch nm-applet from the window manager startup, because then after 5 restarts you’d end up with 6 nm-applets running.

All the guides suggest you deal with this by launching the extra programs you want run from your .xinitrc (which is only ever run once), but AFAICT that file is ignored by modern Linux distributions. Then they’ll often offer some kind of solution that’s a lot of complicated configuration specific to the window manager you’re using. My hack works regardless of window manager, and simply asks the X server if a given application is running yet.

awesome version:
awful.util.spawn_with_shell( "xlsclients | grep -q nm-applet || nm-applet" )

xmonad version:
spawn "xlsclients | grep -q nm-applet || nm-applet"

This obviously only works if the program you’re starting actually connects to the X server.

San Francisco Half Marathon

July 25th, 2010

… or, how to run a half marathon with almost no run training.

For a bit under a year, I’ve been going to a local CrossFit gym: Mad Dawg Fitness. If you haven’t heard, CrossFit involves doing a little bit of everything, with a goal of getting decent at everything. This involves power lifting, Olympic lifting, pull ups, push ups, hand stands, jump ropes, box jumps, dips, short runs, rope climbs, farmer walks, lunges, etc. etc. On a typical night we’ll focus on technique/increased load in one lift, and then do a 5-15 minute high intensity circuit workout. The most I’ve ever run in a workout there is 2k (either as 2×1k, or 5×400m) which happens maybe once every other month. (I only go 3 times a week. Some people go more often.)

Danielle and our friend Jasmine had signed up to the the 1st half of the San Francisco Marathon when Danielle hurt her knee and decided she couldn’t run. She’s done a few half marathons while I’ve always been of the opinion that running sucks and is miserable. But partly to do something hard, and partly to not let Jasmine run alone I decided to run in Danielle’s place. I decided some time near the end of June. Here’s all the running I did in preparation for the half:
July 1, 2.5 miles in my Vibram Five Fingers before giving up with an arch cramp.
July 4, switching to shoes, 4.3 miles before giving up because the inserts were shot.
July 8, after buying new inserts, 3.2 miles.
July 11, 7.5 miles.
July 15, 5.2 miles.
July 18, 12 miles. This was supposed to be a 10 mile run, but I misread my map.
July 20, 4.2 miles.
So with a grand total of 38.9 miles run this year, I went into today’s half marathon. (Actually, I ran 2.1 miles on February 6, too, but I’ll call that experimental error.)

I won’t spend more than this sentence complaining how early I had to get up, but it was early. Jasmine’s friend dropped us off near the start, and we found our wave easily. It wasn’t super cold, but cold enough that I was glad to have brought a trash bag to wear while waiting around. Everything seemed well-organized and was running smoothly. After 20 minutes or so it was our time to start, and to loud cheers the front of the last wave got going. Once there was some room in front of us we got going too. We’d decided on 7 minutes of running followed by 1 minute of rest and with our easy pace that meant a break before the first mile was up. Our first mile took 11:54, which seemed perfect for our stated goal of finishing in two and a half hours.

The next few miles went by without a hitch in 10:54, 11:28, and 11:41. The weather was perfect for running: cool and overcast. Somewhere on this stretch we ran on a bike path headed straight out to the bay, and I remember thinking how pretty it was. In the air was a mix of cut grass and seawater smell which I both like. But then I did feel like it’d be a lot prettier without a thousand people running in front of and behind me.

Our first little hill wasn’t much of a problem, and we felt alright climbing up to the Golden Gate Bridge. We must have slowed down though, because miles 5 and 6 took us 27:46. Part of that was probably due to traffic on the bridge. 3 lanes were closed for the half marathon: 1 for outgoing runners, 1 for returning runners, and 1 as a safety barrier between the runners and the real traffic. 1 lane was just too narrow, and we found us often slowing down, waiting for a gap between the people in front of us. One downside of the run/walk interval is definitely that you then have to be passing people while you’re running and there wasn’t always space to do that.

At the turnaround point in Marin County we used the water station. They were all well staffed and well equipped, but all but the very first one we passed had run out of gel. Jasmine was regretting not carrying one with her, and I had been counting on getting one at the water station but there were none to be had. There was a fun band playing though, which helped us get going for the way back across the bridge. Miles 7 and 8 took 23:53, again under the 12 minute mile pace we were shooting for.

This is when Jasmine really started hurting. She’d been complaining about a crampy foot almost the whole race, and now her knee was starting to bug her. During our walking breaks she’d be limping a little bit. But she’s a real trooper and just kept on going. Aside from tight calves, and a pinky toe that was rubbing against my shoe, I felt alright. I barely even breathed hard. I guess that’s what you’re supposed to do, but when running by myself I always go faster than that.

We did mile 9 in 10:52 due to a perfect downhill coming from the top of the bridge. Mile 10 inexplicably took just 8:46. I suspect a marker wasn’t quite in the right place, or I just didn’t push the buttons on my watch right. It was at the top of a pretty steep hill. From then on I thought it was all downhill but it was more up-and-down than just down. By mile 11 Jasmine had to start taking breaks aside from our scheduled ones. It took 11:06, but mile 12 took 13:09.

At mile 12 I went ahead by myself. I didn’t want to feel like I’d spent the whole race taking it easy, and while 1 mile of hard running can’t make you feel like 13 miles of moderate running I did my best to make it hurt. I didn’t keep a very consistent pace though because I wasn’t familiar with the course, and I didn’t see the 13 mile marker so I didn’t start sprinting until I could see the finish. That last 1.1 mile took me 9:16 and got me winded enough that I wondered if I was going to pass out after the finish. It was pretty fun though, passing people left and right, darting through clumps of runners and weaving around others.

It took me 2:30:41 to finish the half marathon, or an 11:30 minute mile pace. The 12 mile run the previous week I completed in 2:07:47, or a 10:36 minute mile pace. That run definitely felt harder than the real race. I’m guessing of course, but I think hanging back with Jasmine probably cost me about 10 minutes overall time in the event. But instead of 2:20 of misery, I got to mostly take it easy and enjoy her company rather than run the race by myself. That was totally worth it.

After I’d picked up my medal and space blanket I went looking for Jasmine and saw her just before she crossed the finish at 2:34:58 (11:50 minute mile pace). She was a lot worse off than I was. I just spent my time stretching out my super-tight calves. Jasmine instead went to the medical tent to ice her foot. Not that that was the only part that needed icing, just the most pressing one. Jasmine’s friend picked us up at the finish, which was awesome because the lines for the buses back to the start were huge. Luckily he’d found a parking spot fairly close. It took Jasmine just another mile time to hobble over there.

So now it’s done. I’m sitting at home drinking water, with two very tight calves and a blister on my pinky toe. There’ll be some foam rolling later that’s sure to hurt like hell. I need to catch up on sleep, and I probably won’t feel up to working out tomorrow. And the race was pretty easy for me. Jasmine’ll take longer than that to get back. I just hope she doesn’t have to walk any stairs tomorrow. In return for all that work we got a shirt, a medal that looks like it belongs on a key chain, and the knowledge that we can cover 13.1 miles in about two and a half hours. (It is a very nicely designed key chain thing though, and I similarly like the shirt’s design.) I wasn’t really excited for the race, either before or after it. I just spent a couple of hours following the people in front of me.

Instead I could’ve gone on a pretty hike which would net me memories of beautiful places and some pictures. Or I could’ve spent the time finishing my cabinet, which (eventually) will get me a cabinet I can look at and be proud of. Or I could’ve tried to set a dead lift PR without waking up early, and with only being miserable for a few minutes while lifting the weight and spending the rest of the time hanging out with friends. Or finally get back to practicing playing the harmonica. Or get back on my slackline. This feeling is very similar to after the triathlon I did a few years ago. I just don’t see the point.

But I’m very impressed with how easy it was to go from never running more than 2k in a workout occasionally, to easily finishing a half marathon in the top 77% (in my age group). If I’d gone my own pace (2:20) I would’ve ended up in the top 62%. (And 2:10 would’ve put me right in the middle of my age group.) Nothing spectacular, but not embarrassing either. The get-you-ready-for-anything aspect of CrossFit seems to really work.

Get Up Early To Nap In The Afternoon

May 10th, 2010

I’ve been coming across various articles about napping which made me curious to try it. The one thing I couldn’t figure out though, was whether it’s worth it to get less sleep at night in exchange for taking a nap during the day. Having tried that for a few weeks now, I can tell you that it is. I’ve been getting up 35 minutes earlier than I used to, so that in the afternoon I can walk home, take a 20 minute nap, and get back to work. Before my afternoon nap I would often run out of energy between 3 and 4pm, just not getting much work done, and having difficulty focusing. Now with a nap (usually around 2:30), that almost never happens.

As in the napping article, I find that I don’t need to fall all the way asleep to get the benefit of the nap. I do get in bed and completely horizontal, but usually I just doze lightly. Sometimes it feels like my alarm wakes me up after 20 minutes, but other times I don’t feel like I slept. I still feel better afterwards. I do make it a point to not lie down thinking about something. I consciously go with whatever images my brain brings up, which is usually a confusing jumble like in a music video.

When napping, I always wear a Lights Out sleep mask, just as an extra way of blocking out the world. It’s comfy and just works really well. Once we get some heavy curtains over the outside door, I might stop using it. Probably not though.

Arduino Control Of Alton Brown Smoker

January 3rd, 2010

p1070462I build Alton Brown’s flower pot smoker a while ago, and have used it quite a bit. The first few times trying to control temperature with a meat thermometer and by adjusting the hot plate inside. This sucked. Then I used it with an oven thermostat, but I found it pretty imprecise. I’ve finally built a simple circuit controlled by an Arduino that should make all this better.

p1070460I’m using a DS18B20 temperature sensor because I had one from another project. It’s only rated to 257F but I tend to smoke cool anyway. I am not relying on the parasitic mode because that’s supposed to not work well at high temperatures. The Arduino (a RBBB from Modern Device) reads the temperature. If it’s below 210F then it turns on a relay. If it’s above 210F it turns the relay off. I might experiment with fancier algorithms later.

p1070467The relay is soldered in line with an extension cord, which just has the hot plate plugged into it. Because the relay’s coil voltage is 12V, I use a 15V (unlabeled) power supply. A 5V regulator creates power for the microcontroller and the display.

p1070477I got some 7-segment LEDs to display the current temperature. Using a 7 (1 for each segment) by 3 (for each digit) matrix they are controlled with 10 pins. Only 1 segment is lit up at each time, so each segment is on for at most a 7th of the time. With my current code it’s worse than that, but I don’t know how much. (Scope donations are welcome.) This works great indoors, but as you can tell in the pictures is not bright enough to be read in bright sunlight. I stuck a tube over the display so I could read it.

p1070474Anyway, results: It worked pretty well. I had a problem with getting the sensor in the right place. Probably this has to do with the air flow in the smoker. I might drill a hole in the lid next time instead of running it through the side somewhere. But once I had it in a good spot, everything was very reliable. With the oven thermostat the temperature would regularly be off by 40F either way, and I’d check up on it every 10 minutes and often would adjust the thermostat a little. There was none of that this time. I still checked every 15 minutes, but towards the end left it alone for almost an hour. I overdid the ribs I put in there a bit, but the flavor was still good, and the thick parts came out very nice.

p1070468You can grab source/schematic here. The schematic is a little rough, but all the wires are there. It does show 2 buttons which I haven’t wired up yet, and for which no code exists. The idea is to use them to change the goal temperature. I build the code with jam and avr-gcc. This is not an Arduino project. I’m just using that hardware.

I’d love to hear from anyone who builds this, has questions, or has done something similar.

Traveling Around the World: Logistics

August 30th, 2009

2008/09/09/img_4371Perhaps you’re inspired by this blog to go traveling for a while, or you’re just curious what it would take, or maybe you’re already planning a trip, or you suffer from severe insomnia. In any case, I thought some people might be interested in what we did to prepare for our trip. First off, we got a lot of our info from “The Rough Guide to First-Time Around the World.” It was a great resource. In general I’ve been a big fan of the Rough Guides travel guides. They tend to have more background info than the Lonely Planet and, because they’re slightly less popular, get you slightly off the beaten track.

2009/02/13/img_0024Everybody wants to know how much it costs to go on a trip like this, but most people are afraid to ask. Here’s what it cost us, as close as I can figure it. From Jun 1, 2008 to May 31, 2009, we spent $44,937. That includes about $2,468 in medical bills, which we later got $468 back from our health insurance for. (Basically they covered it all from our deductible on.) We had paid IMG insurance $2407 before we went on this trip to be covered for the year. I picked them mainly because their insurance will cover you for a full month when you return to the US, which would give us time to figure out health insurance once we got back.

2009/01/31/img_9517There were some other things aside from insurance that we bought before our trip that were definitely part of it. We’d bought plane tickets from LA to DC, NYC to Paris, and Munich to Dar Es Salaam for a total of $2881. We’d paid for our Tanzanian safari which was $3120. Finally we paid $1685 to get shots so we wouldn’t get any number of scary diseases. We also bought a bunch of travel gear, but I’m going to leave that out. So the bottom line for the money is, drumroll please… $54,562. That’s quite a bit of money, but for what we got it was totally worth it. If this number is scaring you from taking your own trip, don’t be. This is just what we did. You are totally different! We could’ve easily saved 10 or 20 thousand dollars by not visiting Europe, not doing our African safaris, not taking the container ship, and eating cheaper.

2009/06/05/p1040712Packing and what to bring is another subject that’s endlessly debated. I made a decision to just go with the list on onebag.com and I don’t regret it. It’s a good list. I brought some harmonica stuff that I ended up never using, and had to ship home. Definitely bring 4 pairs of underwear. 3 is not enough. And don’t sweat your packing too much. Just about everything you might need is available for sale in any major city in the world. Do bring a money belt. It made us feel like our money was in a safe place. As for bags, I highly recommend Rick Steves’ Convertible Carry-On. It’s light, has the right amount of pockets, and sturdy enough to show little wear even after a year.

If you have any questions I didn’t address here, leave a comment. I’ll do my best to answer questions.

And finally, I’m done blogging this trip! It sure felt like a chore at times, but I’m glad to have done the work and look forward to rereading it all in a few years.

setf/setaf or how to portably add colors to your prompt

August 20th, 2009

There are a million pages on the web that describe how to make your bash prompt nice and colorful. Most just hard-code the color sequences, which can break if you use a weird terminal. Until today I used some clever code I stole from somewhere that used tput to get the color codes from the termcap/terminfo database. Today I learned that there are two “standard” capabilities for setting colors: setf and setaf. I’m not sure why both exist, but some terminals only support one and not the other. (Notably Terminator only supports setaf.) So here’s what’s in my .bashrc to deal with this variety:

_tput() {
   tput $* 2> /dev/null

# Color definitions.
blue=`_tput setf 1 || _tput setaf 4`
green=`_tput setf 2 || _tput setaf 2`
cyan=`_tput setf 3 || _tput setaf 6`
red=`_tput setf 4 || _tput setaf 1`
magenta=`_tput setf 5 || _tput setaf 5`
yellow=`_tput setf 6 || _tput setaf 3`
white=`_tput setf 7 || _tput setaf 7`
default_colors=`_tput op`
bold=`_tput bold`
# clear all attributes
plain=`_tput sgr0`


# removed code that changes prompt_color depending on some conditions

# Check for being root.
if [ `whoami` == "root" ]; then

PS1="${ps1_user}@\h:\w$prompt\[$default_colors$plain\] "

Back in the US of A

July 16th, 2009

Typed up: on plane to Boston
Posted from: Jane and Tom’s place in Boston

Back “home,” we’ve been very busy. We stayed at Andy and Juliette’s place for about a week and a half visiting friends and doing chores, before driving up to the Bay Area where I had a job interview. Things looked promising, we looked at apartments, I went to another interview just in case, Danielle had an interview. I accepted my first offer, and we drove down to Andy and Juliette’s again.

For a few days we did nothing but relax, in preparation for moving. We packed up a truck on Saturday, and unloaded it at our new apartment on Sunday. Having gotten rid of about half of our stuff at the start of the trip really made this step a lot easier. Still, now we are in a position where we need to buy a fair amount of furniture. Monday is when I started my job, leaving Danielle to do a lot of the unpacking. That was almost 2 weeks ago now. We’re mostly unpacked and I’m finally starting to get the hang of the new routine.

In that time we haven’t experienced the culture shock that some people describe. Certainly things are different from where we’ve been, but they’re also the way that they’ve been for us most of our lives. The main thing we noticed is how rich people here are. The average US homeless person has more possessions than the average person in India. The other big thing we noticed was that women here have just about any job there is. We both immediately noticed that the shuttle-bus driver was a women.

Being able to understand the language of everybody around us was also not as nice as you might think. In fact it was a bit distracting at first. I was just as happy in the Philippines where everybody we wanted to talk to spoke English. All in all it took us a surprisingly short time to get back into a “normal” life, and it was easier than expected. Which is the story of our trip, really. Traveling the world isn’t that hard. There’s all kinds of information available. The only thing you need is money, and you need less of that than you might think.

M.V. Hanjin Pretoria

June 24th, 2009

Typed up at: Laura and Alan’s place in Emeryville, Starbucks in Palo Alto
Posted from: Laura and Alan’s place in Emeryville, Andy and Juliette’s place in Newbury Park

22/P1030880The port agent drove us to the place where our ship had just docked. The gangplank wasn’t down yet, so we spent a while just standing next to the car taking pictures. It was dark, and huge cranes with bright lights were already starting to take containers off the ship. Trucks drove by to move the containers to different cranes further back. Those cranes would haul the containers onto big piles about a hundred yards away from the water. It was awesome.

24/P1040012After maybe half an hour of picture taking, the gangplank came down. In the ship’s office we met the captain who took our passports and sent for the steward to help us with our bags. We took the elevator to our cabin, and were impressed with how nice it was. We had a very comfy bed. A table, a lazy chair, an L-shaped seat around the table, TV, DVD player, mini fridge, plenty of storage room, and a nice little bathroom. Most amazing of all was that we could drink the tap water.

31/P1040406We got into our ship routine pretty quickly, and it was built around our food schedule: 7:30am breakfast, 10:00am tea, 12:00 lunch, 3:00pm tea, and finally 5:30pm dinner. At mealtimes we would sit at the captain’s table and eat whatever had been cooked for this meal. The food was nothing special, but we enjoyed it. The captain was quite the talker, and we enjoyed him also. He was German, had been a sailor for over 40 years, and enjoyed talking about his experiences, or just answered the questions we had about life at sea.

27/cP1040331.aviSome people might get bored on a container ship, but we both kept plenty busy. Danielle knitted and read a lot of books. I worked on random programming projects and played on the PS2 in the officers’ rec room. We both took advantage of the gymnasium to get some workouts in, and every day we take a walk on deck at least once. The deck was 260 meters long, so an easy walk all the way around could be stretched to last quite a while.

27/P1040316We stopped by two ports on our way: Osaka and Tokyo. On those days I spent a lot more time outside, watching everything that was going on in the harbor. As I mentioned before, the best part was seeing the containers be moved by the truly enormous cranes. I don’t know what to say about it, except that it was the highlight of our sea voyage. One day we went down to the engine room, and got a tour from the chief engineer. For the curious, the engine has 9 in-line cylinders, generates 55,890 horse power, and is still bigger than you think it would be.

04/P1040509After more than 10 days of seeing nothing but ocean (and a very rare passing ship), we stopped just in sight of the California coast. We were ahead of schedule, and the engines don’t like going slow. During this time all the lifeboats were lowered to make sure they all still worked. We also saw quite a lot of whales which were making their way north. None were really close to the boat, but with binoculars it was still great to see. Several of them showed us their tails as they dove down. We also saw dolphins, and even a mola mola which came to the surface briefly. It was a beautiful day.

05/P1040612In the evening we sailed through the Santa Barbara channel, arriving in Long Beach just as the sun was coming up. US Customs came aboard, asking us about our trip and checking the fridge for contraband. After breakfast we got off the ship and took a shuttle to the harbor’s parking lot. The security guard called us a taxi, and soon we were on our way. We should have just gotten a taxi to the closest Metro Link, but instead we spent a small fortune going all the way to Union Station. From there we took a train, and early in the afternoon we arrived at Andy and Juliette’s house.


June 13th, 2009

Typed up: on ship to Long Beach
Posted from: Andy and Juliette’s house in Newbury Park

20/P1030719The bus ride to Busan was over an hour shorter than the book had said it would be. I think they must have built some new roads since the book was written. It was easy to find a locker that fit both our bags at a metro station. Then we spent the afternoon just wandering a little until it was time to meet Matthew, our CouchSurfing host. There wasn’t a whole lot to really wander where we’d chosen, though. Just a few busy shopping streets and some blocks of huge apartment buildings. We couldn’t even find an Internet cafe that was open.

20/P1030769Matthew lived high in an apartment building in the middle of the city, with a giant window which gave a nice view. He took us out to a great bar, where we sat on lots of pillows around a low table, in low light. It was in a much more trendy area of Busan, and lots of people were on the streets when we went out. The area was so trendy that there were two Outback Steakhouses visible from one intersection.

21/P1030779We had two things we wanted to do in Busan: visit a Korean bath house, and visit the fish market. On our first day it rained hard and we decided to tackle the bath house. We took the metro and walked through the downpour to what’s supposed to be one of the nicest ones in the country but sadly it was closed for renovation. Dejected we just went back to Matthew’s apartment. When he came home in the afternoon he pointed us at a different one and so we set off again.

20/P1030725It wasn’t raining anymore, and with the help of some locals we found the bath house. Men and women went to separate all-nude sections. I put my clothes in a locker and showered like I was supposed to. Then I sat in baths of various temperatures, went in the sauna for a few minutes, and spent about as much time as I thought I could. It was an odd atmosphere, with almost no socializing going on. Everybody just was doing their own thing and almost completely ignored one another. I was supposed to meet Danielle after an hour but after 45 minutes I was done. Through some confusion at the entrance we hadn’t bought the extra robes which would let us into the common area where people have snacks etc., so we missed out on that part. I was pretty down on the whole thing when we left, but Danielle really enjoyed her experience.

21/P1030786At night we went out with Matthew to a local chicken shop where we ate some nice fried chicken, including an appetizer of little unidentifiable pieces of chicken (also fried). Afterward we met some of his fellow English teachers.

22/P1030790The next day was our time to leave. We’d called a harbor representative a few days before the 23rd as instructed. Our ship was running a little early, and we were supposed to board on the evening of the 22nd. This meant we had to meet somebody at a downtown coffee shop at 8pm, leaving us plenty of time to visit the fish market. Unfortunately Danielle was feeling a bit ill in the morning, so I went by myself.

22/P1030802The fish market was huge and awesome. It consisted mostly of live fish, shellfish, and octopus. It was at least as interesting as going to a medium aquarium. I loved seeing the clams squirt water around, the octopus swim, abalone crawl around, and some sizable fish sit in barely-big-enough tanks. Most of it was housed in a building that looked very new. After wandering a bit I went upstairs and had a lunch of cooked eel. I think the eel was supposed to be an appetizer, but Korean restaurants aren’t set up for people eating by themselves.

22/P1030820I thought the market was so awesome that I dragged Danielle over there in the evening, when she was feeling a bit better. Many of the stalls had closed down in the evening, but it was still worth a visit. Then we had a dinner of raw fish, where we spent just about all of the won we had on us. The fish was fairly nice, but did not have a lot of flavor and was a little chewy. One of our appetizers was some fish in teryaki sauce which was very good. On the whole, we’ve had only 1 meal I didn’t think was good our entire time in Korea which was something at a hole-in-the-wall place consisting of 4 different kinds of starch in a red sauce. Part of that was probably that we just ordered the wrong things.

22/P1030880From the restaurant we went straight to the coffee shop to meet a harbor representative. We found him easily. Our boat was a bit later after all, so after waiting for an hour he drove us to the harbor. He listened to a baseball game on the radio all the way, alternately cheering and pounding the steering wheel. His team was behind, came back, but snatched defeat from the jaws of victory at the very end. In talking about this, I said we don’t follow baseball but do watch a lot of American football. The next thing he asked is if we knew Hines Ward, which of course we do. Apparently he is quite the local celebrity because his mother is from Busan and he comes to visit once a year. Then he took our passports to get stamped, and we had technically left South Korea.