Firmware update gone horribly wrong

A couple of days ago, my 15″ Macbook Pro from early 2011 started to misbehave. It didn’t wake up from sleep and froze regularily.

Macbook SurgeryAfter a lot of headscratching, grepping of logs, cursing of TimeMachine and googling, I finally identified my 256 GB Crucial M4 SSD, firmware rev. 009, as the likely culprit. A new firmware version 070H claimed fix a bug that was triggered after 5184 hours of uptime. Sure enough, the uptime reported by SMART on my 15 month old disk was way above this threshold (note to self: spend less time in front of computer).

So I decided to update the firmware. This is where the fun part begins. Updating the firmware is usually not a big deal: burn an image to a CD or write it to an USB stick and reboot the machine, confirm some scary warnings and presto, you are done. But not so quick. Continue reading

10 days and counting – preparing for Ironman Frankfurt 2012

A long time ago, a good friend and I agreed to do an Ironman Triathlon when we turn 30 years old. I can’t pinpoint that agreement to an exact date, all I know is that at the time, the magical number 30 lay in a distant future. Somewhen at the end of 2010, we began to talk about it again and we agreed to take on the challenge and to sign up for the Ironman European Championship 2012 in Frankfurt. It was set to take place on July 8th, 4 days before my 30th birthday. Now, for those not familiar with the term, an Ironman Triathlon is a long distance triathlon consisting of a 3.8 km swim, 180 km bike and 42.2 km run.

By my standards, I was in pretty bad shape at the time. My last race was the Cologne Marathon in 2009, which I finished in 03:58:04. My best result was a 03:22:53 in Mannheim in 2008, so that time was quite disappointing to me. In 2010, I had not trained a lot, so there was clearly a lot of work to be done before I could even consider doing an Ironman. Oh, and did I mention that I had never competed in a triathlon before?

So I thought it would be a good idea to do one or two triathlons in 2011 to get some experience. On June 5th, 2011, I completed my first ever triathlon in Mussbach, my home town. It took me 03:04:00h, my split times for 1.5 km in the pool, 40 km on the bike and 10 km running were 00:31:09h, 01:36:52h, and 00:55:59h respectively. My swimming time was better than expected and the time on the bike was okay, as the course was pretty tough. I had expected a much better result for the run, but I had totally underestimated the switch from cycling to running. The extreme temperatures of the day didn’t help either. All in all, the result was okay given my preparation, but it left a lot of room for improvement.

On June 23th, I signed up for the Ironman 2012. Now there was no way back. I also signed up for the Cologne226half, a triathlon over the middle distance in September, and the Cologne marathon in October.

In the first week of July, I spent a week with my girlfriend in Italy. With my batteries recharged, I started 8 weeks of intense training for the triathlon. To get an idea where I was starting from, I did a 10 km run on July 15th, which I finished in 00:44:16.

In the eight weeks before the triathlon, I averaged about 6 workouts per week. I tracked about 1100 km on the bike and 20 hours of running time using my Ciclosport HAC4. I probably should have done more, but it was already hard to find the time. Unfortunately, I haven’t tracked my swimming at all, all I can say is that I definitely had deficits. I could blame it on my local pool being closed for two weeks, but the main reason is that I just don’t like it. It is so incredibly boring! I had worked on my technique a bit using the book Total Immersion, but I just didn’t spend enough time in the pool. To make matters worse, the triathlon took place in a lake and I had an irrational fear of swimming in open water. On the weekend before the race, I bought a neoprene suit and one evening after work, I drove to a nearby lake to do a test swim in the dusk. I had planned to swim 1000 m, but I just couldn’t cover any distance, because I would panic once I could not see the ground any more. I settled for floating around a bit and getting a feel for the suit. It really makes a huge difference. If you plan on competing in a race with a neoprene suit, you absolutely must swim with it before.

September 1st 2011 was the big day. My father and my sister accompanied me to the start, were we met with a former colleague of him. In 2004, we had done the Quelle Challenge Roth together as a relay. My father borrowed me a set of nice Dura-Ace wheels, which were probably worth more than my whole bike.

Changing onto the bike at the Cologne226halt triathlon

After my so-so triathlon debut, I didn’t expect much. I was pretty confident that I would stay below 6 hours and hoped for something below 5:30. 45 minutes for 1.9 km swimming, 3.5 hours for 90 km cycling and 1:45 hour for the half marathon seemed realistic. I was pleasantly surprised when I left the water after 35:02 min! On the bike, I felt like I was flying. Before the race, I had hoped to average 30 km/h, and now I was constantly pushing 40+ km/h without much effort. The wind was favorable and the wheels seemed to make a big difference. I tried not to get carried away, because I didn’t want to exhaust myself on the bike and suffer through running later. Unfortunately, my pulse watch had died in the water, so I had no reference on how hard I was pushing. I went off the bike after 02:33:53 h, averaging 35 km/h, way better than expected. Running went okay as well with a 01:47:17 h. My endtime was 05:05:06 h, putting me in the upper third of all finishers. As you can imagine, I was really happy with the result.

After the triathlon, it took me quite a while to recover and I couldn’t train as hard for the Cologne marathon as I had planned. However, I wanted to finally beat the barrier of 3:15 hours and planned my race pace accordingly. But, as they say, no plan survives the first contact with the enemy. After the first 1000 m I was already behind my target time. That had never happened before in any race. The smart decision would have been to take it a bit easier and maybe finish in 3:30 h. Instead I tried to make up the lost time, with the result that I was totally exhausted after one third of the distance. Worse than the physical exhaustion was the mental one. For the first time, I seriously contemplated giving up a marathon. Luckily, I stuck with it and finished in 3:57:59 hours. A whole 5 seconds faster than my result in 2009, but a far cry from my target time. In retrospect, I should have known before that 3:15 hours was just not realistic.

Recovery from the mental exhaustion after the marathon took even longer than the recovery from the physical exhaustion after the triathlon. I pushed myself a lot in preparation for the triathlon and the marathon was just too much. For the rest of 2011, I exercised once, maybe twice, a week. As christmas was approaching, I decided it was time to reboot my training regimen. Within two weeks after christmas, I had probably exercised more than in the two months before. The Ironman was due in six months, so it was about time.

During January and February, I focused on swimming. I tried to go to the swimming pool three times per week. During January, the weather was way too bad to go road cycling, so I went mountain biking every weekend. Unfortunately, I was fighting a sinusitis in February, which cost me about two weeks. As soon as I felt well and the weather became bearable, I hit the road. I also finally took the time to calibrate my Polar RS 800 CX and it turned out that I wasn’t as slow as I thought.

On March 13th, I ran my first race in 2011. I competed in a half-marathon which conveniently took place about 500m from my home. I finished in 1:35:20 hour and I’m quite happy with that. I ran the first 10 km in 43:52 min, which was faster than the 10 km run I did in July 2011.

My running and swimming were on track but I still had some deficits in the bike department. At the end of March, I spent 8 days cycling in Mallorca with a group of 17 people from Karlsruhe. During these 8 days, we covered a distance of 1000 km and 10000 m in altitude. Unfortunately, we also had two accidents, the first one being pretty scary. One guy went off the road on a descent and crashed head first into a wall peppered with sharp-edged stones. Despite wearing a helmet, he suffered some deep cuts on the forehead and had to go to the hospital. It looked pretty bad, but luckily he was okay and back on the bike after two days. The second accident was less spectacular, but it involved almost half of the group, me included. We were just 10 km into the tour of the day when a wet spot in a 90° turn caught us by surprise. One set of wheels was destroyed, but nobody suffered major injuries. A few guys returned to the hotel, but most of us could continue after a short stop at the pharmacy. On the last day, five of us decided to break the 200 km mark. It was the first time ever I cycled longer than the 180 km I will have to do during the Ironman. I had a great time in Mallorca and my endurance made a huge leap forward.

Two weeks after returning from Mallorca, I competed in the Bonn marathon. The results from my last two marathons where I finished just below 4 hours weren’t very encouraging and this race should serve as a reference for my further training. I crossed the finish line after 3:30:15 h. Not as fast as my personal record, but almost half an hour faster than my last marathon.

On the last weekend of May, I participated in the Tour Eucor, an event organized by the universities of Karlsruhe, Straßburg, Mulhouse, Basel and Freiburg. Starting from Karlsruhe, we made a trip through all these cities in five days. These five days added up to almost 800 km, with 200 km on the final stage from Freiburg to back to Karlsruhe.

One week after the Tour Eucor, that last test before the Ironman was due. For the second time, I participated in the Mussbach triathlon over the olympic distance. My father was kind enough to entrust me with his carbon fibre bike which weights about half of mine. With a whole year of training and the upgraded equipment, I was confident that I could beat my time from last year. The race day didn’t start well. Just as we arrived at the swimming pool, it started pouring rain. That wouldn’t make a big difference for swimming or running, but with the steep descent from the Kalmit hill, the cycling part suddenly became much more exciting. The rain itself had stopped mostly once I came out of the water after 30:06 min, but the road was still wet. I decided to put on a rain jacket despite the unfavorable aerodynamics. The bike stage took me 1:27:38 h including the time for both changes. My average speed was 30 km/h, a massive improvement over the last year. The upside of the rain was that the temperature dropped to a very comfortable level for running. I ran the 10 km in 43:37 min, which adds up to a total of 02:41:21 h. Compared to 2011, I was more than 20 minutes faster and not all of it was due to better bike.

I could say with confidence that I was in the best shape ever, but I still had a lot of respect for the sheer distance of the bike stage. I had already covered the distance twice in a group, but never on my own. So one Sunday, I set out to change this. The route I had chosen more or less matched the profile of the course in Frankfurt, so the times should be comparable. I had to take an unintentional break of about 25 minutes due to a puncture and my inept handling of it (don’t ask), but it still went better than expected. All in all, I was rolling for 6:10h, which is an average speed of about 29 km/h. One more checkbox to check on the long, long list of preparations for the Ironman.

Another checkbox was swimming in open water with the neoprene suit. The suit hadn’t seen open water since Septembre 2011 and neither had I. I had planned to swim an hour or so in a local lake to get used to the open water again and to get a feel for the suit. Unfortunately, it never came that far. Once I stepped into the water and could not see the ground anymore, an irrational fear kicked in. To make matters worse, there were fishes in the water. They were just basses, but to me they looked like giant swimmer-devouring sea monsters. Long story short, I didn’t swim an hour or so.

Last Sunday, I met with my father in Frankfurt to cycle one lap on the bike course. Again, my father lend me one of his bikes, this time a 2010 Cannondale Slice. It’s not as light as the bike I had at the triathlon in Mussbach, but damn, it is quick. Although it was very windy that day and I didn’t push myself, I easily averaged 30 km/h. I reckon that the bike is at least 10% faster than my bike, the difference is really astonishing.

The big day is coming. I’ve been preparing for about a year now. During the last six months, I’ve cycled 3500 km and ran 700 km.  Now there is just one more weekend of intense training left before I slow down to recharge my batteries. As of this writing, there are ten days left until my longest day of the year.  See you in Frankfurt.

Restricting Solr with Jetty to localhost

If you want to try Apache Solr, the easiest way to get started is to use the example the comes with the download. Just run java -jar start.jar and you can start searching like a pro.

However, the integrated Jetty server is configured to bind to port 8983 on all IP adresses by default. This configuration is unsafe: anyone could clear your whole Solr index!

It is a good idea to let the server listen only on localhost, unless your server is in a private network. A quick solution is to set the system properties jetty.host and jetty.port on startup, e.g. like that:

java -Djetty.host=127.0.0.1 -Djetty.port=1337 -jar start.jar

Alternatively, you can edit the configuration at example/etc/jetty.xml. Look for these lines:

<Set name="host"><SystemProperty name="jetty.host" /></Set>¬
<Set name="port"><SystemProperty name="jetty.port" default="8983"/></Set>

It’s waiting, not sleeping – how I became a Mac user

I never was a fan of Apple products. Sure, they looked slick, but in my opinion, they were toys, for designers, not for hackers. And they were expensive. A good friend of mine had bought a MacBook Pro and after the initial excitement faded, he became more and more disappointed until he finally switched back to his Linux desktop and sold his Mac with a big loss. My prejudice against Macs seemed to be confirmed. Little did I know that I would join the cult of the Mac soon. Continue reading

Easy Django management commands with autogenerated aliases

Recently, I got sick of typing django-admin.py <command> to run Django management commands and decided that something must be done about it. This is what I came up with:

This little script creates short aliases for all available Django management commands. Typing this every time you want to work on your project obviously defeats the point, so I added it to bin/activate which is created by virtualenv (you do use virtualenv, don’t you?). I actually do this in a bootstrap script, using this snippet:

If you use virtualenvwrapper, you can append the script to the bin/postactivate script instead.

I know there is bash completion for Django management commands. The advantage of my solution is that it is available for every developer on the project after running the bootstrap script. And it is one character less to type.

To run django-admin.py syncdb, just type djsy<TAB> instead of dj<TAB>sy<TAB>.

What’s in a name? A MPMoviePlayerController pitfall

I was struggeling playing a movie file on iOS with MPMoviePlayerController. The file was just recorded with AVCaptureMovieFileOutput and was called file.avi, located in the Document directory of the app.

The movie player was presented and then immediately disappeared. The URL was correct, the file played without problems on the Mac. Apparently, MPMoviePlayerController expects the file ending to match the file type. Once I renamed the file to file.mov, everything worked as expected.

Hacker News Aftermath

After I submitted my review of Hacker News iPad Apps to Hacker News, it shortly made it to the frontpage, with the result that the thundering horde quickly exhausted the tiny traffic quota I had at my hoster. I’ve decided to migrate to another hoster and if you read this, the DNS change has reached your corner of the Intertubes.

If you notice broken links or anything else that is flaky, please let me know on Twitter (@danielhepper) or drop me a mail at daniel [at] hepper [dot] net. Thanks!