tag:blogger.com,1999:blog-78321547068889334512009-07-13T00:05:25.312+02:00Developer implements RunnableOn software, running, and everything else.Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.comBlogger16125tag:blogger.com,1999:blog-7832154706888933451.post-87162817176335578522009-05-29T00:06:00.009+02:002009-06-01T15:15:56.558+02:00From Dubai to Linz in 2:402 minutes and 40 seconds. That's what the Linz Marathon 2009 had in store for me. In every race I participate in, I am determined to "travel" as far as possible, I cross the start line with the intention to shorten the distance. This time around - the second one, to be exact - I was lucky enough to keep moving in the right direction, towards a new personal best. 3 hours, 56 minutes and 7 seconds after the gun, I beat my Dubai performance by 160 seconds. While that certainly means I'm getting closer, I was left wanting more, going even further than that. However, it was not meant to be on May 17, it just wasn't.<br /><br />There are tons of things that can go wrong when it comes to a marathon. First, there's the training. Injury, illness, plenty of reasons come to mind. My training was fine. While I missed some sessions due to a brief cold and my work hours, I completed around 600k worth of long runs, tempos, intervals, and recovery runs. Significantly more than Dubai, a solid foundation for a good outcome. To make sure I could do better the second time around, I incorporated more intense speedwork. I've never been a particularly fast runner but I did notice that the Dubai training helped in this regard. The 3:29 plan I based my training on suggested a relatively moderate interval pace that was very manageable at the time, so I borrowed most of the intervals from a 3:15 plan. I'm quite sure that this move enabled me to complete two test races that were part of Linz Marathon training in time. The results: a new 10k PR of 00:45:03 as well as a new 21.0975k PR of 01:40:50. Before Dubai (00:47:23 and 01:53:10), these would never have been possible. Consequently, I walked away from these test races with confidence for race day. The last long run of 34k with 10k at race pace was also going as planned although the course was a little more challenging than I anticipated - I was in Redmond, WA at that time and decided to run around Lake Sammamish. Nice landscape, unusually warm and friendly weather for the pacific northwest, and an all other than flat course. I could only gain confidence from that one, it was a successful marathon simulation. I wonder if it was the unknown territory that helped making it an easier and more enjoyable run. The new scenery definitely made things more interesting, it definitely was a refreshing variety...<br /><br />A good training experience. In fact, the test race times translated to a theoretical maximum of around 3:30 for the marathon. Nothing more to ask for. Reducing the training volume is where you could go wrong next. Fortunately, I had a good plan that included an adequate tapering phase. After the last 24k run, I was slightly worried because recovery was progressing at a lower than usual rate. My legs did not feel fresh at all, not even after two days of rest. Whenever that happens (typically right after a hard run), an ice bath comes to rescue. Exposing your legs to ice-cold water (the coldest possible water a bathtub can offer, no extra ice required) for around 15 to 20 minutes can be an easy fix, even if not applied directly after a workout. The first few times, it was quite a struggle - I'm certainly not a fan of cold. Several sessions and highly uncomfortable minutes involving swear words, it's only the initial psychological hurdle that you have to overcome to get through the ice bath experience.<br />The last few days, it was all about an appropriate diet. Counting on the tried and tested Dubai carboloading routine, that was nothing to worry about.<br /><br />Race day. For a marathon in May, there's a good chance of warm temperatures and a clear sky. The day before race day, things were looking good: partly cloudy, mild rain, perfect conditions overall. On Sunday, however, the weather completely turned around. At 8:00am, 30 minutes before the start, it was quite warm already. The sun was strong, not a single cloud was there to block it. My goal was 3:29. Even before the start, that was melting to a more reasonable 3:40 in my mind. Would that be enough to compensate for these conditions? I wasn't sure, my intention was to decide on the go.<br /><br />The gun sounded and the masses slowly started to move towards and across the start line. As always, many of them started way too fast. I tried to maintain a pace of around 5:10min/km, not a real challenge. I was pleasantly surprised how easy it was for me to stay there, all the tapering, carboloading, and rest make a huge difference. 4:57min/km would have been impossible though, it was too hot. The Linz Marathon course turned out to be harder than I imagined. It is said to be a fast course, it might actually be compared to other city marathons - the course record is 2:07:33 - but compared to Dubai, every other marathon course loses, plain and simple. I mean, there's no way to make a dead-flat course that essentially directs runners from A to B and back in a straight line any easier. Hence, the switch from a course that was optimized for a world record attempt to an "ordinary" marathon course did take its toll - I suspected that already.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_VBPhg4mhdMo/SiOkA1t8NHI/AAAAAAAAARk/LuQEX8ZHil4/s1600-h/42k-map.bmp"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 270px; height: 400px;" src="http://1.bp.blogspot.com/_VBPhg4mhdMo/SiOkA1t8NHI/AAAAAAAAARk/LuQEX8ZHil4/s400/42k-map.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5342293917318263922" /></a><br /><br />My new fueling strategy was to consume 1/3 of a gel pack every 5 kilometers with around 100ml of water (tested during my marathon simulation in Redmond). It did take some effort to handle the gels while running (opening them, putting them back) but it seemed to work energy-wise. The first half was rather uneventful, I was feeling fine. I even thought that the warmth was not much of an issue. 1:48:42, a 5:09min/km average, right on time for 3:40. Status green.<br />Throughout the next few kilometers, maintaining the pace became more and more difficult. When I checked my heart rate, it hit me. 199 bpm. What an unpleasant surprise, I certainly was not feeling the full extent of that load. At that point, I knew that I had to slow down immediately to avoid a disaster. My max HR was 204 based on available data, I had to take action to avoid a breakdown - the last thing I wanted was dropping out. No, not a DNF, that can't happen. Not today! Beginning from 23k, my pace average was around 5:25min/km. The biggest issue was direct sunlight, it was relentless. Whenever I exited a shady and cool passage, the rays hit me with full force. Continuing started to require hard work, thoughts of stopping came through my mind. "Stop!". I tried to fight them but that day, I was not entirely successful. Eventually, I was forced to give in and resort to walking for short periods, several times during the last 10k. I was seriously disappointed. Looking at the heart rate data though, it was clear that it was what it took to make it to the finish line. The pulse did not go down, slightly slower paces did not really affect it anymore. A more radical approach was required. Walking. Even walking was hard under these circumstances. My survival strategy was to take walking breaks for aid stations and consume more than planned.<br /><br />At some point during the last 5k, the 3:45 pacemaker passed by. I managed to leave the 3:45 group behind throughout the last 3 hours. I had to let them go. "Maximum effort for the last 5k, hang on to them!", I thought. I desperately wanted to follow their lead, I simply could not. I was unable to act, couldn't go beyond jogging. A fact that was hard to accept.<br /><br />The last kilometers weren't any easier, I struggled all the way to the finish line. I knew that I had lost too much time with my lower than 5:10min/km pace and walking breaks, all I wanted at that point was finishing in a time below my debut. I did not want to run a marathon without setting a PR. No performance regression, please! For the last two kilometers, more and more spectators appeared. As we approached the finish, I did what I had to do, what I did in Dubai. I accelerated!<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_VBPhg4mhdMo/Sh3bCi3WEEI/AAAAAAAAARc/CTV26M5p3c8/s1600-h/omvlinzmarathon2009-1247-3.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 257px; height: 400px;" src="http://4.bp.blogspot.com/_VBPhg4mhdMo/Sh3bCi3WEEI/AAAAAAAAARc/CTV26M5p3c8/s400/omvlinzmarathon2009-1247-3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5340665569896435778" /></a><br /><br />Only 500 meters. The pain didn't matter anymore, I didn't feel the pace, speeding up was easy all of a sudden. Hauptplatz Linz was approaching. Running towards the finish at Hauptplatz was fantastic, people left and right, cheering and screaming names. There it was. I did it again! I actually crossed the finish line, after 3:56:07, with a pulse of 208 bpm. It was all over... I didn't care about the time, did not stop the clock on my watch, all I wanted was to get out the sun and rest for some minutes. I received my hard-earned medal, grabbed a sports drink and proceeded to the finish area for marathoners. Rest in the shadow, finally.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_VBPhg4mhdMo/SiOkRPshBBI/AAAAAAAAARs/PrgPaHC4dMc/s1600-h/42k.bmp"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 266px;" src="http://3.bp.blogspot.com/_VBPhg4mhdMo/SiOkRPshBBI/AAAAAAAAARs/PrgPaHC4dMc/s400/42k.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5342294199169516562" /></a><br /><br />It certainly was an extreme experience! Dubai was hard, extraordinarily difficult. Not because of the weather - not an issue - but the marathon challenge in itself. In Dubai, I managed to maintain my goal pace all the way to the finish line. In Linz, I had to give in, the warm weather and direct sunlight practically destroyed me, ending the second half in a mere 2:07:25 (6:02min/km average). Despite all that, I still finished 2:40min ahead of Dubai. Recovery was fast, I kicked it off with an ice bath right after the event. The next day, my legs were fine. I could even take the stairs without problems. Besides the ice bath routine, my theory is that the considerably slower second half helped quite a bit.<br /><br />The positive? The valuable experience of a hot weather marathon and a new 42.195k PR. Still, I'm not entirely satisfied. I didn't get a chance to go for 3:29, which should have been possible based on my current 10k and half PRs, had the conditions been different. I'm left wanting more, what I need is another chance! Sure enough, I already have a NYCe plan...<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-8716281717633557852?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com1tag:blogger.com,1999:blog-7832154706888933451.post-53066650599573994912009-05-22T23:30:00.007+02:002009-05-26T00:50:40.708+02:00To Free or not to FreeThat's the question I'm trying to find an answer for. I've been running in Nike Free running shoes ever since my first run in early 2007. The Free's are special, the sole is divided into small segments to increase flexibility to a maximum. If you're used to wearing "standard" running shoes, that particular model will certainly surprise you the first time you wear them - it's probably unlike anything you've worn before when it comes to running equipment or even shoes in general. It's almost like you're not wearing any - almost. Switching from a normal running shoe to the Free is like taking off concrete blocks, it was an eye-opening experience for me.<br />Lots of different opinions are floating around when it comes to Nike's unusual offering. "It doesn't even come close to running barefoot", they say. "It's only for training, 5-10k runs". "You can't run a marathon in it without injury". "It can't be your primary running shoe", some proclaim. Nike doesn't help by labeling the shoe a training instrument, not a regular running shoe. Whatever your opinion might be, fact is that the shoe can be your one and only running shoe, I know from experience. Up until February 2009, I had not worn anything else. In January, I ran the Dubai marathon in them. Shoe-wise, it was a pleasant experience. No issues whatsoever. None! So, you can indeed run a marathon in Nike Free's. The critical thing is though that you need to get used to the Free experience before doing so. Slowly increase distances to make sure that your feet can catch up without injury. As long as you keep that in mind, the Free works for just about anything...<br /><br />Right after Dubai, I thought about replacing my worn-out Free 5.0 V3 with a new pair. That's when I stumbled across the Adidas Adizero line of running shoes. These are similar to the Free in that they represent a minimalist design. The sole, however, is more traditional and not as flexible as the Free's. On my first run, the Adidas Adizero Adios felt great. Running fast seemed to require considerably less effort. Several runs later, I still felt that fast paces were easier to handle in my new shoe of choice. I must say that it took quite some time until I felt truly comfortable in the Adizero Adios during long runs. Now, more than 600k and a marathon later, the Adios feels as good during runs and races as the Free.<br /><br />The Adidas Adizero Adios still seems to be better suited for higher paces than the Nike Free I had which is why I'm going to keep the Adios for now. It's all subjective of course. Maybe a lighter version of the Free might feel the same. I tried the 3.0 back in 2007 and switched back due to knee problems - maybe it was just too early, the results might be different now. In any case, it's good to know that Nike i not the only one to offer lightweight running shoes. For those of you who're looking for alternatives, the Adidas Adizero Adios might be the perfect choice.<br /><br /><span style="font-weight:bold;">What's your take on the Free? Can the Adizero match up?</span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-5306665059957399491?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com0tag:blogger.com,1999:blog-7832154706888933451.post-87544954844103585352009-05-10T21:47:00.006+02:002009-05-26T00:51:51.413+02:00The third one's the charmThat's the old saying. If so, what about the second? Now, I don't know what you associate with that, I'm thinking of the most challenging event there is for a runner who's not in the ultra category: the king of the distance, the marathon - what else.<br /><br />As a newbie who successfully completed his marathon debut in Dubai in late January, I was asking myself: What's next? When is the next one going to be? The marathon was a painful experience for sure, painful in the sense that I had to fight against myself to keep going during the last 10k. It was not some sort of strong physical pain that I was going through but my mind signaled quite convincingly that it was high time to stop by broadcasting the feeling of fatigue. While it was hard, I knew all along that Dubai certainly wasn't going to be my last one - no surprises there - I even registered for Berlin 2009 while I was still in the UAE. That's a different story though...<br /><br />I wanted my next challenge to happen as rapidly as possible. I finally had the proof that a marathon was not out of reach for me. The <a href="http://www.linz-marathon.at/en/index.php">Linz Marathon</a> in May turned out to be a good opportunity for a follow-up, the next mission to complete. Soon enough to satisfy my desire to go again, yet plenty of weeks away to allow for improving my running shape. The gun will go off on May 17, in around one week. I've been in training for quite some time now, mileage already exceeded that of my debut - 567k vs. 416k. Things are looking good, but I still find myself asking what to expect from marathon #2. As you go beyond that, #3, #10, #20, things are most likely getting easier... Not the marathon in itself, but the journey. You know you can handle the distance, you have more "data" to optimize your preparation and your race day performance. You can learn from experience. What about #2, where you only have a single event to derive experience from?<br /><br />The second certainly has the potential to get you back on earth, set your goals straight. After #1, I was full of confidence, ready to go for a PR in the next race. 3:45. No question. 3:30. Sure. 3:15. Hey, why the hell not! Could that confirm my hypothesis right there? My claim that the second might actually be considerably more difficult than the first one, even though you don't have to race through the same road of darkness again? You might think you know it all as you've done it once before and could therefore be tempted to set a very, ridiculously unrealistic goal. In most cases, training should take care of that by having you fail in test races or hard and long workouts, giving you a chance to adjust your goals for the actual race. I actually lowered my expectations from an unrealistic 3:15 to a sane 3:29 after having completed my 10k and 21k test races in a time that's in line with the new target. Looking back, that's an excellent improvement already that should translate to a high level of confidence for Sunday. Still, some degree of uncertainty remains that I find very discomforting...<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-8754495484410358535?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com0tag:blogger.com,1999:blog-7832154706888933451.post-25245835218962193552009-01-26T00:10:00.074+01:002009-02-03T09:23:14.211+01:00I hereby pronounce you marathonerWhat an exciting 4 months! First, 6 weeks of training for a half-marathon I eventually couldn't compete in due to scheduling conflicts. Second, 10 weeks of marathon training following <a href="http://horstr.blogspot.com/2008/12/haile-and-i-will-rock-dubai.html">my decision</a> to make my debut in the <a href="http://www.dubaimarathon.org/">Standard Chartered Dubai Marathon</a> 2009.<br />I took a bold risk because I didn't - couldn't know all the facts about the event and the circumstances I was going to be confronted with before and especially on race day. The textbook says: "Choose a race in your area, nearby - a race you know and have the most control over". The safest route - yes - but it's not for me. I was looking for something special, excitement beyond the distance challenge, something that's more on the extreme side of things. As it turned out, Dubai was the perfect debut choice for me, I'm glad to have skipped the safe route.<br /><br />Friday, January 16th was the day of uncertainty, the day I've been preparing for in Austria by means of dozens of training sessions in sub-zero temperatures. I got up early, 2:30am, and started with breakfast. Four hours before the gun to avoid uncomfortable and impeding surprises in the competition.<br />The local newspaper has been covering the marathon for several days, the most highlighted aspect was the potential new world record, no surprises there. Undoubtedly, the organizers have gone the extra mile to make everything within their control perfect for the day of truth. Probably the only remaining uncontrollable variable, except for the elite runners themselves, was the weather. The forecast hinted it might be raining on Friday morning - bad news for all runners. Part two of my preparation mainly consisted of drinking water, sports drinks, and doing simple warmup exercises. As far as my level of hydration and carbohydrates was concerned, I had a good feeling. Throughout the last three days before Friday, I'd been keeping my water-consumption at 2 liters or more and had been taking carbo-loading very seriously: tomatoes, potatoes, carrots, white mushrooms, and pasta - daily. It worked last year, for the <a href="http://www.linz-marathon.at/en/index.php">Linz Marathon</a> (a half-marathon) and I was confident it would do the trick this time around too.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_VBPhg4mhdMo/SYRkE_NB9PI/AAAAAAAAAPI/7WJwNsh7Btc/s1600-h/20x30-DUMZ0005.jpeg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 266px;" src="http://3.bp.blogspot.com/_VBPhg4mhdMo/SYRkE_NB9PI/AAAAAAAAAPI/7WJwNsh7Btc/s400/20x30-DUMZ0005.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5297469098542888178" /></a><br /><br />Around one hour before the start, 5:30am, I left the hotel to get to the event. Taxi or shuttle weren't necessary, the event area was a mere 500m away from the <a href="http://en.wikipedia.org/wiki/Dubai_Marina">Dubai Marina</a>, where my hotel was located. Quite a number of people there, spectators and runners. Still, in comparison to the big city marathons like New York, Boston, or Berlin, and certainly in contrast to Dubai's quest for superlatives, the Dubai marathon is a relatively small event with less than 1000 marathon participants. When I arrived, the elite was busy with warming up for the action to come. Among them: Haile Gebrselassie, who attempted to break his own world record that day. The crowd left no doubt about it: Haile has rockstar status in the running community and even more so in Ethiopia. Screaming and cheering whenever the man in yellow was in sight, it was crazy! In any case, seeing Haile at the start with his trademark smile and positive attitude was motivating indeed - you clearly cannot give anything but your best if you compete in the very same race, right?<br /><br />The start was slightly chaotic as it was all other than crystal-clear how runners would actually get to the start. Eventually, however, the confusion cleared up and the starter's gun sounded. There I was making my first few strides in the 42.195km course. What a great feeling, running in the event I've been looking forward to for quite some time. Weather conditions were fantastic, at least for the most part. 16-18°C, a very comfortable temperature range all around, neither the temperature nor direct sunlight have been an issue throughout the whole race.<br /><br />The marathon started out in the dark, the sun was rising slowly while all these small groups of runners were moving forward along the coast. It was a nice sunrise, but obviously not the best time to relax and enjoy. You have to focus. You have to set a goal. Doesn't have to be an ambitious goal but you have to know what you expect from yourself that day, for practical reasons. Besides the obligatory goal of finishing the marathon - I guess I shared that one with all of them - it was my secondary goal to finish my debut in less than 4 hours. I intended to skip the years and months of 4's, 5's and 6's. Consequently, my strategy was to start off at 6:00min/km and gradually increase the pace to the 5:30-5:40min/km required for reaching set goal. The single biggest mistake you can make is running too fast in the beginning, we all know that but do not always manage to follow that basic principle during the race. There's the crowd cheering you on, other runners starting too fast or having a different, incompatible set of goals. All that may load to you running too fast without even noticing it, feeling it. Undoubtedly, I would have started way too fast too (5:10min/km) if I hadn't tampered my pace immediately based on the info I got from the Forerunner. Yes, I use the Forerunner in races, it provides invaluable feedback you can use to alter your running dynamically and thereby correct an unplanned pace as rapidly as possible. So, my pace was fine. Quite frankly, I was a little worried about targeting 5:30min/km. At last, running around 40k at that pace was new ground for me. I managed to run 21.0975k at that pace in 2008, ran the last 8k of a 32k training run at 5:30min/km. Nevertheless, I knew that 5:30-5:40min/km was what it took to make up for the slow start and, most likely, slower last 10k or finish.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_VBPhg4mhdMo/SYRg52S_v-I/AAAAAAAAAOw/WzcQ5cOG6O8/s1600-h/dubai-map-x1.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 271px;" src="http://1.bp.blogspot.com/_VBPhg4mhdMo/SYRg52S_v-I/AAAAAAAAAOw/WzcQ5cOG6O8/s400/dubai-map-x1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5297465608638545890" /></a><br /><br />Except for a short section only minutes after the start that demanded for a change of direction, <a href="http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=113362520069151207968.000461d261f06af7d0f34&t=h&z=12">the course</a> was essentially a straight line, a dead-flat one too. Dubai Marina (The Westin), Burj Al Arab, Jumeirah mosque, Union House, and back. While you might be tempted to expect a painfully boring race, a "treadmill experience", it certainly wasn't so! Especially if it's your first time in Dubai, that is a great way to explore the city :)<br />The course featured aid stations every 5 kilometers with intermediate stations in between. In order to avoid<br /> drinking too much, I basically ignored the intermediate stations and picked up water and energy drinks every 5k in an alternating manner. The spectators in Dubai were great. Only a hand full of people were watching the action every once in a while but they pushed every single runner forward, not only the ones they knew. "3-6-7, looking good! Keep it up!", one of them shouted. "Good job, don't stop now guys!", another one proclaimed. In comparison to the Linz Marathon, the crowd was much more supportive and involved. Most of them didn't just stand there and watch the show, they actually participated. They were helpful and certainly made the race more interesting and enjoyable.<br /><br />Although I did not plan to, I started with the last bunch of runners. That turned out to be a huge advantage because all I needed to do was maintain my race pace and, without additional effort, I took over quite a few runners every once in a while. If your pace is not too aggressive, that's reassuring and helps to keep motivation up for the real marathon to come.<br /><br />In training, I usually run with music. For me, that's one of the ways to make training more interesting, it even makes hard or long workouts more bearable. It's funny how you connect particular songs with specific runs and experiences. Certain songs I hear immediately take me back to a specific training run. On my first race (a half-marathon), I was running with my iPod but I found it to be greatly annoying as soon as you start to fight against yourself to maintain the pace and finish without breaking down - in that case, to the point that I took off the head phones during the race. At least for me, it does not work out as a motivational instrument during actual races. So, I've been competing without music ever since and I haven't looked back. A race is entertaining on its own and you might want to prefer hearing and experience your surroundings, the people communicating with you, those who are cheering you on, those who keep you motivated and fresh for the remainder of the race.<br /><br />Kilometer 8. Near the Burj Al Arab, a couple of guys in tail coats - essentially a group of butlers, most likely from the Jumeirah Beach Hotel or even the Burj Al Arab (I can't really say, I was a little distracted by traveling at 11km/h) - served bottled water on silver platters to runners passing by. While tempting, I passed. The thought of running with a big glass bottle of water in my hand settled that. Nice idea, though :)<br />On my way, I still took over fellow runners although I didn't speed up. Obviously, I have not reached my pace group yet. Encouraging. Self-check said I was doing fine, plenty of energy remained for the real challenge. As we all knew, that was just the beginning.<br /><br />Kilometer 14. The marathon lead group passed by already again, Haile being part of the pack of course. I was looking forward to that! He looked as concentrated as ever. Seeing these guys rush through the course definitely gave me a boost, being a witness was exciting... Too early into the race though, nowhere near the finish - but - what can you do, they are fast... I can't remember when exactly it started, but it must have happened during the first half of the race. It actually started to rain. Light rain, more or less, but significant enough to become annoying for runners, for me at least. Fortunately, it did not last for long, so it wasn't too much of an issue overall. Only hours later, I found out that it was an issue for the lead. The high-pace runners faced difficult circumstances for maintaining their speed, let alone setting a world record.<br /><br />Shortly before kilometer 21, the actual halfway point of the Dubai adventure, there was a U-turn - the Puma turn - leading to the second half of the race. Who would be better suited to cheer runners on than actual cheerleaders? Right at the U-turn, they made sure that all of us managed to enter the return path leading to the white arch of achievement, the final destination. I was still feeling fine but decided to consume carbohydrate gel number one to make sure that I wasn't going to run out of power too early into the game, there's still a lot to come. I didn't know what to expect from a marathon. You read about it, you consume written experiences from those lucky few known as marathoners, take all advice you can get. <a href="http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=113362520069151207968.000461d23567872a623f5&t=h&z=12">My longest run</a> was 32k, a good experience overall. I knew I could manage 32k without being totally exhausted. In fact, the last training run was relatively easy to complete without being overly tired after training. I was confident. Positive, with a thought of uncertainty in the back of my head: "Will I be able to keep the pace?". One fundamental difference to training is exactly that - the pace: 6:10min/km in training, 5:30-5:40km/h in the race. That's a notable change in intensity which left enough room for the unknown to raise some doubts.<br /><br />Throughout the first half, the number of runners stopping for a walk increased gradually. While that might work for others to regain energy, I had a different experience in training and my first race. Whenever I had to surrender and walk, it was practically impossible to start running for more than a kilometer or so again. It depends on why you resort to walking, I guess. If that's included in your race plan, a walk every once in a while might actually be a good thing and you should be able to get going again with minimal effort. I assume, however, that most participants start walking because they cannot keep their pace anymore - it's starting to become uncomfortable or even unbearable - so they walk. I tried to stay true to the approach I practiced in training: maintain your pace unless there's evidence that there's absolutely no way you can continue. Do not walk to attempt to regain energy for finishing. It worked for me, the most challenging execution had yet to come.<br /><br />The half was relatively easy to complete. I was breathing normally, my pulse was probably okay (I didn't monitor it directly but I was still feeling good). I remember watching the press conference of the New York City Half Marathon Haile participated in, where he was asked about the difference between a half-marathon and a marathon. Haile explained that this wasn't a valid comparison because a half-marathon is so much easier that a marathon, there's no way to compare them. I was a proud half-marathoner at that time and actually found that a little offensive as he sort of undermined my half-marathon results (silly, I know). Only now, I realize that only a marathoner could really understand the essence of his statement. In contrast to a marathon, a half-marathon truly is a piece of cake - that is somewhat clear now. Most importantly, that doesn't mean that finishing a half-marathing is anything but a fantastic achievement.<br />To increase my confidence, I divided the race into two parts: The 32k I knew by heart from training and the last 10k, the dark road I've never had a chance to enter before. Whenever I reached a kilometer mark, I imagined where I would be on my training course at that point.<br /><br />Kilometer 32. It was a blessing to have reached the dreaded 32k, it was definitely harder than it was in training. I never ran 32k at 5:30-5:40min/km before. The one run that came closest to the race was a 32k with the last 8k being run at race pace. I do think that very training session helped me to maintain the pace without hopelessly losing control, energy, and motivation.<br />Whenever somebody's talking about the marathon, they say that a marathon only really starts at the 32k mark. Before, I understood the message but I wasn't totally convinced that it was a law of nature... I'm a strong believer now!<br /><br />"It's only 10k", I thought. The problem is that 10 kilometers can still become your personal Mount Everest. The last 10 kilometers have been the hardest 10k of my life, a challenge I've never had to go through before. I weight a challenge by the subjective number of times you have to resist following your inner voice and slow down, start walking, or even take the worst route of all - drop out. Take my marathon training, for example. The most challenging training sessions were the test runs, a 10k and 21k race at a pace faster than race pace. In numbers, that meant <a href="http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=113362520069151207968.000461d2565fc884a039b&t=h&z=14">4:45min/km for the 10k</a> and <a href="http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=113362520069151207968.000461d24fb9c2671536d&ll=48.311115,14.314928&spn=0.030712,0.057335&t=h&z=14">5:00min/km for the 21k</a>. In both cases though, I had to fight quite aggressively to avoid giving up. After finishing either of them, I was pleasantly surprised as to how long and persistently I managed to show my inner voice the cold shoulder and keep running to complete the test runs. Besides the long runs which are essential for marathon training, I'm positive that two of the most reassuring training sessions I was looking back to during the race were these two test runs. I kept running at a fast pace for a duration I wouldn't have thought was possible. In some way, you can also translate that to the following: To some extent, it's a show hosted by your mind and you have to ignore it to a point where your energy depot is actually empty or a serious issue arises. How else would I have been able to pull the last 10k in the Dubai marathon off? I hated the kilometer marks because they more or less forced you to count down the kilometers. A seemingly infinite road I was running on, it felt as if I was on a treadmill - making no forward progress despite maximum efforts. Every remaining kilometer took ages to complete.<br /><br />Kilometer 35. I could see the Burj Al Arab again, a good sign! The finish had to be close now. Fantastic! More and more walkers appeared as I made my way through the last segment. While you might think that this would cheer you up, it didn't have that effect on me - it only reminded me of how freaking fantastic it would be to just stop right there and forget about the whole thing - nobody had to know! It would still have been a great trip to Dubai either way, right? All sorts of weird stuff was going on in my head at that point. I kept reminding myself that I certainly did not train 10 weeks in negative degrees to stop now, at 35k. All the overcoming it took to get out into the cold to complete the training mission for the day. All of that, shredded in an instant?<br /><br />Kilometer 37. Almost there. Trouble was, 37k still meant 5.195 kilometers remained - not exactly a walk in the park. To make things worse, I didn't want to just finish, I intended to make a debut in less than 4 hours so I had to constantly keep an eye on my pace. Whenever it dropped below 5:40, I had to motivate myself to keep it up. "Doesn't have to be below 4 hours, a 4-hour time is good enough", I attempted to fool myself. I tried to ignore these destructive thoughts and replaced them with positive ones, however hard that was. Did I run the whole previous kilometers at optimal pace to give in now?<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_VBPhg4mhdMo/SYRelo9Y5CI/AAAAAAAAAOo/5yL3dh3j-Y0/s1600-h/horst.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 264px; height: 400px;" src="http://1.bp.blogspot.com/_VBPhg4mhdMo/SYRelo9Y5CI/AAAAAAAAAOo/5yL3dh3j-Y0/s400/horst.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5297463062437618722" /></a><br /><br />Kilometer 39. I could actually see the finish now, right ahead, relief was on the horizon! Still, 3.195 kilometers to go. At that point, I wanted to throw it all away. Up until the last kilometer, I seriously intended to walk - "Just a short walk to make it more bearable" - the closest I came to that was a short slow-down to a point where I almost stopped but I was determined enough to reaccelerate again. I knew it'd have been crazy to walk or drop out at that point, so close to the finish line!<br /><br />Kilometer 41. People screamed: "Great job. Don't stop now!". "You can see the finish already". I started to determine how slow I could be without missing the goal of sub-4h. The Forerunner showed 03:53. With one kilometer to go, I could have finished with a pace of 7:00min/km and still reach it - with the risk of being too slow. I waited for the often-cited runners high that literally carried you to the finish. Nothing. Focus! I remembered the finish of my long runs in Linz, <a href="http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=113362520069151207968.00044d582269dfffcbda7&t=h&z=16">Eisenbahnbrücke (railway bridge) to Lentos Kunstmuseum (Lentos Museum of Art)</a>. It's a one-kilometer path which certainly feels shorter than that. I imagined the finish to be Lentos and continued to make my way to the end of the journey. More and more people were watching, more and cheered runners forward! "Go, go, go!". I noticed on my Forerunner that it's the last 500 meters. My legs suddenly started to feel light, sort of numb - I accelerated. Tons of people watching and screaming. I knew it was still possible to complete in time. I left the Forerunner alone, didn't care about the pace and simply ran as fast as my "dreamy" legs and feet could take me through the finish. The last few meters...<br />I threw my arms up in the air and crossed the heavenly finish line. Relief washed over me as I slowed down. Everything fell of, I finished, not a worry in the world. There it was: 03:58:47.<br /><br /><center><br /><object width="560" height="345"><param name="movie" value="http://www.youtube.com/v/X1Ynewxyhg8&hl=en&fs=1&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/X1Ynewxyhg8&hl=en&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="345"></embed></object><br /></center><br /><br />I actually did it! I ran 42.195 kilometers in less than 4 hours, for the first time in my life, in the United Arab Emirates. All the struggle was over. Helpers handed finishers the medal, sports drinks, sandwiches, and a finisher shirt. What a worthy medal it was, huge and heavy, of simple elegance. I kept moving, collected one of each and tried to find a spot on the lawn behind the finish, where fellow finishers have come to rest to recover. I just sat there, refilling energy, observing others, and looked at the medal with admiration. My legs did not feel bad at first. Shortly thereafter, I was walking like an old man, the single-most revealing fact to identify a marathon runner after the competition. I grabbed my deposited cloths and headed home, back to the hotel. Oh my, I wished I had put some money in for a taxi, even though it was only 500 meters or so. "What about Haile?", I thought. "Do we have a new world record?".<br /><br />I probably haven't fully realized yet what I actually accomplished on January 16th. It'll probably take some time to sink in. Word has it that a marathon is a life-changing experience. Whether or not that's true, fact is that what I've done was undoubtedly the hardest physical and mental challenge of my life so far. It made me realize that it's practically impossible to describe what it means and takes to complete a challenge of that kind, it can only be passed to others by first-hand experience. The most satisfying of all is the victory over my inner voice that wanted to stop me whenever possible but it didn't stand a chance this time. Putting it all together, the 16th might indeed be heading my life in a new direction, and I'm not thinking about sports. Even though that was a sports event, these kinds of challenges are much more than that, they go way beyond managing to run a specific number of kilometers. That at least is what I will take with me from the experience. I'm glad I chose to take the risk to debut in Dubai despite all available advice pointing in the other direction. That certainly made it more exciting than it could have been otherwise!<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_VBPhg4mhdMo/SYRhXfZiJQI/AAAAAAAAAO4/MLSFYD1Y_V8/s1600-h/dubai-pulse-x1.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 261px;" src="http://2.bp.blogspot.com/_VBPhg4mhdMo/SYRhXfZiJQI/AAAAAAAAAO4/MLSFYD1Y_V8/s400/dubai-pulse-x1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5297466117888025858" /></a><br /><br />What about Haile? He did not manage to break his record again but he clocked in at 02:05:29, an excellent time. Rain and wind thwarted his plans. That does not make Haile any less of an exceptional athlete, it only underlines what an achievement it was to finish in a time of 02:03:59 four months ago, even for somebody who's broken the record before and has the highest potential to do so again.<br /><br /><b>I'm a marathoner now. If you're not, you should give it a try!</b><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-2524583521896219355?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com5tag:blogger.com,1999:blog-7832154706888933451.post-33694168674529217292009-01-06T00:56:00.006+01:002009-02-03T09:26:59.543+01:00Haile and I will rock DubaiUp until high school, I liked sports. I really did. I was actually looking forward to physical education at school, played soccer with other kids in my spare time - I genuinely enjoyed it. Later, the aforementioned largely positive attitude slowly but surely turned into the exact opposite, I began to hate sports. I'm not entirely sure why but I guess a major part of it had to do with team sports and the aggressive attitude of some class mates in respect to wanting to win, as if an individual match or game was ultimately important in the grande scheme of things. My motivation for sports in general vanished throughout the years. Of course, a second big factor surely was my ever-growing interest in the digital world, which occupied most of my spare time.<br /><br />So, my personal sports activity effectively came to a halt at the age of 10 and dropped to zero expect for mandatory PE, which hardly counts. Almost 20 years later, it all changed - I have become a runner. Why? Frankly, I can't say at all. Well, definitely not for obvious reasons - becoming fit and healthy - that much I know. Looking back to April 2007, the first month of serious running, I can't really tell. It's absurd, but that sort of reminds me of <a href="http://www.imdb.com/character/ch0002102">Forest</a>, who at some point simply started to run. He didn't know why he did it, where he was heading, for how long he'd be running...<br /><br />I started off slow. The first run was over after around 500 meters, out of energy. I already sensed that 20 years of zero physical training beyond walking from point A to point B and (being a geek at my core) operating the keyboard would take its toll but that was an eye-opener. I didn't lose interest though and have since worked on reducing my 20-year deficit, with good results thus far. I managed to gradually reach set goals, expand my range and speed. To date, I participated in two half-marathon races (<a href="http://www.linz-marathon.at/en/index.php">Linz</a>, 2007/2008) and one 10k race (<a href="http://www.muenchenmarathon.de/">Munich</a>, 2008) so far, with around 2,000 kilometers burned. Certainly, that's nothing in comparison to other, more experienced runners, but it's a start. In fact, the most recent mileage delta should paint a whole different picture, more along the lines of an active runner taking his hobby seriously. A new phase of training for a special challenge to come.<br /><br />Earlier this year, I intended to compete in a half-marathon again (to improve my PB of 1:57:35), that used to be my distance of choice to conquer. For that, I strictly followed a 6-week training plan and competed in a 10k test race (<a href="http://www.muenchenmarathon.de/en/mm2008/">Munich Marathon 2008</a>) with a good result of 47:21, meaning I can now maintain a pace of 4:44min/km over 10 kilometers. As mentioned, my intention was to race in a half-marathon. I never came to compete though, a trip to Los Angeles (mentioned in a previous posting) thwarted my plans...<br />Knowing that I wouldn't be able to do the the half, I started searching for viable alternatives. Maybe do a half later that year or early next year, I thought. One realization I had though is that the delta of the half-marathon training was immense - at least subjectively, based on experience. It worked wonders in respect to pace, 4:45min/km is officially not impossible to sustain for longer periods of time anymore. Progress across multiple dimensions. Now, what to do with new potential? What to do?<br /><br />You certainly don't want improvements from hard workouts to fade through winter, until the next opportunity to put the new abilities to work in spring or summer - possibly months later. No way! Part of me enjoys going for the extreme every now and then, thinking and acting outside the box. In respect to running, that surely has to translate to taking on the undisputed king of the distance, the infamous 42.195km. Not in spring or summer 2009, that clearly had to happen within the next months to reap the benefits of previous training sessions. Problem was, there's no marathon in sight in this part of the world, meaning it almost certainly had to be a race in a milder climate. Last but not least, I wanted the race have some relevance in the marathon world to make things even more exciting. Putting it all together, there was only one admittedly extreme answer that matched the profile: <a href="http://www.dubaimarathon.org/">Standard Chartered Dubai Marathon 2009</a>!<br /><br />I hesitated and dismissed the idea of doing Dubai several times until I finally <a href="http://www.activeglobal.com/Events/index.cfm?AC=searchRegistrantsResultsDisplay&amp;EventID=64379&amp;RegLastName=Reiterer&amp;RegFirstName=Horst&amp;AgeOnRaceDay1=&amp;AgeOnRaceDay2=&amp;RegCategory=&amp;RegCountry=">registered and applied for guaranteed entry</a>. Actually, I had registered before I even committed myself to following the lead. Clearly, life is way too short to not seize every single and sufficiently sane opportunity in sight. It's official: I'll actually run alongside <a href="http://en.wikipedia.org/wiki/Haile_Gebrselassie">Haile Gebrselassie</a>, the current marathon world record holder with a time of 02:03:59 and, from what I've seen, an admirable personality as a whole. Alright, not literally "alongside", I can't say I'll run near Mr. G. either because he'll be almost two hours ahead. Fact is though that I'll compete in the very same race, nobody can dispute that :) With a mere 800 participants (based on last year's stats), you could almost consider this to be personal training. It might even be an historic race should Haile actually manage to break his own world record and hit the jackpot of 1 million USD, I'll do my best to interfere though ;)<br /><br />Building on my 6-week half-marathon preparation, I kicked off marathon training on 2008-11-10, based on <a href="http://www.herbertsteffny.de/">Herbert Steffny</a>'s 10-week plan for 03:44:59, slightly modified to make up for the fact that the Dubai marathon takes place on a Friday rather than the usual Sunday (apparently, weekend falls on Friday and Saturday in the United Arab Emirates). The last thing you want to do is going for a long run (thinking 3+ hours) on a work day, simply doesn't work (for me at least). 11 days and 5-6 training sessions remain until race day. To avoid surprises (jet lag, climate, food, ...) and have some more time to enjoy Dubai's amenities, I will leave early, around a week before the actual event. Last Saturday, I completed my final major long run, 32k in around 3 hours. Based on that experience and my training as a whole, I feel confident that I'll actually be able to pull this off on January 16th. If people talk about marathon debuts, they say: "Finishing the marathon has to be the only goal". They're so right, that's rational and sane thinking. Some part of me, however, intends to finish the 42.2k in less than 4 hours. Hey, I didn't prepare for 4 months to not set a secondary goal, right?<br /><br />Dozens of factors will influence the outcome on Friday the 16th in the unofficial United Arab Emirates capitol. One thing I'm certain of, however, is that - no matter what - Haile and I, really just two geeks of different kind, will indeed rock Dubai!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-3369416867452921729?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com5tag:blogger.com,1999:blog-7832154706888933451.post-66888515527201765812008-12-08T20:11:00.017+01:002008-12-09T02:04:56.085+01:00Searching for a needle in the haystack "Los Angeles"<div>In late October, I visited Los Angeles, CA - the reason being an information technology conference (namely <a href="http://www.microsoftpdc.com/">Microsoft PDC</a> - quite a good one by the way). Besides attending the conference, there are several other things you can do in Hollywood's home. Of course, there's the whole Hollywood experience - the Walk of Fame amongst other things. There's LA's neighborhoods, e.g. the glamorous Bel Air, which is certainly interesting to drive through. As a PDC attendee, you get to see the well-known Universal Studios, no explanation needed. Leaving all that aside, the city itself is not what you would expect - or, more precisely, what I had expected before my first visit in 2005. Streets are mostly empty - deserted in comparison other cities, you would think that people don't live in the fast lane in the undisputed capitol of America's film industry. I'm thinking New York City (been there many times; without a doubt a favorite of mine), the ever pulsating and forward-moving city life - cars in the busy streets, sidewalks filled with stressed people making their ways through Manhattan's grid of avenues. No, not in LA. If you invert my thought, you could think of LA as a relaxing place to be - the predominantly mild weather encountered throughout California contributes favorably.</div><div><br /></div><div>One other thing you can do while you're in "The Angels" is searching for a needle in the haystack of buildings and streets on a sunny morning (28°C) in fall - the needle being a filming location of a Showtime TV show I enjoy watching for it's originality in terms of story and characters - <a href="http://www.sho.com/site/dexter">Dexter</a>. If you've heard of or seen it already, you know it's set in Miami Beach, FL. Unsurprisingly, that usually means filming was <span class="Apple-style-span" style="font-style: italic;">not</span> done in that part of the US. Before the trip, I had done some research and ultimately found a <a href="http://www.seeing-stars.com/Dexter/SmileyFace.shtml">reference</a>, which confirmed the theory and actually covered three locations in LA, all of which should be known to an <aufmerksam>audience familiar with season one. The hockey stadium a victim of the so-called "ice truck killer" was found in. The hospital where "Tony Tucci", a surviving victim of the ice truck killer, was found. The third was in close proximity to my hotel, an easy choice: one of many sites where the ice truck killer recreated a memorable moment of Dexter's youth, in this instance him standing beside <schrottplatz>a palm with a black smiley face on it and a junkyard in the background.</schrottplatz></aufmerksam></div><div><br /></div><div>The site provided the address, I fed my iPhone with the data via wifi and thereby preloaded the maps (unfortunately, there's no way to explicitly do so for all levels of detail). Off I was to follow the 3km route before the conference started, a piece of cake for the most part. A worthwhile feature though would be automatic map rotation based on the current / last GPS vector, that would make navigation more intuitive. Having arrived at the supposed filming location, I compared the surroundings with a screenshot of the scene in question - Season 1, Episode 4, "Let's Give the Boy a Hand", 39:42 excluding opening credits...</div><div><br /></div><div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_VBPhg4mhdMo/ST253AdZVtI/AAAAAAAAAOI/3YFj-7rbYKY/s1600-h/dex-original.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 220px;" src="http://1.bp.blogspot.com/_VBPhg4mhdMo/ST253AdZVtI/AAAAAAAAAOI/3YFj-7rbYKY/s400/dex-original.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5277578693015328466" /></a><br /></div><div><br /></div><div>...and, I can confirm that the site matches the scene location, it (still) looks more or less identical.</div><div><br /></div><div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_VBPhg4mhdMo/ST26CTSdDLI/AAAAAAAAAOQ/-jjgoxv1Qd0/s1600-h/dex-actual.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 220px;" src="http://2.bp.blogspot.com/_VBPhg4mhdMo/ST26CTSdDLI/AAAAAAAAAOQ/-jjgoxv1Qd0/s400/dex-actual.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5277578887048268978" /></a><br /></div><div><br /></div><div>The major missing piece is the palm tree that featured the smiley face. I certainly didn't expect to find it there, it was a requisite (identical to the one in the photo). The tree was placed inside a circle-shaped traffic refuge. That's still there, palm-less though.</div><div><br /></div><div>I wish I had taken a picture of me reenacting the scene :)<br /></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-6688851552720176581?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com0tag:blogger.com,1999:blog-7832154706888933451.post-82846052236160171212008-06-23T01:16:00.012+02:002008-07-07T23:51:08.676+02:00On libcurl, OpenSSL, and thread-safetyThe <a href="http://curl.haxx.se">cURL</a> project with its libcurl is a frequent choice of developers requiring a feature-rich HTTP client. Indeed, libcurl is a good choice, it supports HTTP/1.1, several authentication mechanisms (including Kerberos / SPNEGO authentication), and HTTPS, to name a few important aspects. It can also be used in multi-threaded applications - well - it can but you have to be aware of some fundamental facts in order to avoid random segmentation faults or aborts - Linux is assumed here...<br /><br />First, to avoid <b>pitfall #1</b>, be sure to disable the use of signals of the library by adding the following line of code to the initialization phase of your application:<br /><pre>curl_easy_setopt(handle, CURLOPT_NOSIGNAL, TRUE);</pre><br />This option deactivates code that works around the fact that DNS lookups initiated via <a href="http://www.opengroup.org/onlinepubs/009695399/functions/gethostbyname.html"><tt>gethostbyname</tt></a> cannot be interrupted, there's no timeout facility. The libcurl developers of course knew about the one generic way to interrupt the current thread of execution and execute code in that context - signals.<br /><br />In order to interrupt <tt>gethostbyname</tt>, libcurl saves the current state of execution via <a href="http://www.opengroup.org/onlinepubs/009695399/functions/setjmp.html"><tt>setjmp</tt></a>, initializes a timeout of n seconds by calling <a href="http://www.opengroup.org/onlinepubs/009695399/functions/alarm.html"><tt>alarm</tt></a>, which results in signal delivery at that point-in-time. If <tt>gethostbyaddr</tt> does not return in time, the signal handler associated with <tt>SIGALARM</tt>, the delivered signal, is being called. The handler restores the original state using <a href="http://www.opengroup.org/onlinepubs/009695399/functions/longjmp.html"><tt>longjmp</tt></a> to rewind execution and indicates a timeout via the return value.<br /><pre>signalhandler()<br />{<br /> longjmp(state, 1);<br />}<br /><br />init()<br />{<br /> signal(SIGALARM, signalhandler);<br />}<br /><br />lookup()<br />{<br /> if (setjmp(state) == 0) {<br /> alarm(30);<br /> gethostbyname();<br /> /* snip */<br /> }<br /> else {<br /> /* timeout */<br /> }<br />}</pre><br />In a single-threaded application, that works fine because <tt>alarm</tt> only affects the process and the main thread is identical to the process itself. In a multi-threaded application, however, the fact that the process gets to handle the signal and not a particular thread, the workaround can fail because an unrelated thread could handle <tt>SIGALARM</tt>. While this strategy may work in the case of LinuxThreads, it does not with NPTL, the state-of-the-art Linux thread library that implements POSIX semantics. The <a href="http://www.opengroup.org/onlinepubs/009695399/functions/alarm.html">relevant part of the specification</a> is as follows:<br /><br /><i>"There were two possible choices for alarm generation in multi-threaded applications: generation for the calling thread or generation for the process. The first option would not have been particularly useful since the alarm state is maintained on a per-process basis and the alarm that is established by the last invocation of alarm() is the only one that would be active.<br /><br />Furthermore, allowing generation of an asynchronous signal for a thread would have introduced an exception to the overall signal model. This requires a compelling reason in order to be justified."</i><br /><br />So, by setting the cURL option, you disable DNS timeouts but thereby avoid related segmentation faults in multi-threaded applications. If you don't plan to invest more time into fixing this issue, that's an acceptable solution.<br /><br /><b>Pitfall #2</b> is merely related to libcurl, but it does cause random "crashes" if you intend to use libcurl along with HTTPS requests in multi-threaded applications. The module of interest is <a href="http://www.openssl.org">OpenSSL</a>, the primary backend for libcurl and HTTPS. By default, using libcurl and HTTPS in multiple threads can lead to crashes, even if you do not share libcurl-specific handles or, more generally, memory. The reason for that is OpenSSL, which is not thread-safe by default.<br /><br />Rather than providing a thread-safe library out-of-the-box, the OpenSSL team decided to leave this as an exercise for the (documentation) reader and / or user. OpenSSL provides <a href="http://www.openssl.org/docs/crypto/threads.html">callbacks</a> that define functions for serializing access to resources. Two sets of callbacks exist, one provides access to a static set of locks that can be locked and unlocked. The other allows for allocation, deallocation and lock / unlock of a lock object.<br />By default, these are not implemented. In other words, code using OpenSSL with threads can fail unless the developer read the relevant parts of the documentation and implemented the required callbacks for all supported platforms correctly.<br />Hmmm. Don't get me wrong, I'm the first to vote for reading the documentation / specification before writing code and I'm a big fan of generic and flexible interfaces but, IMHO, the OpenSSL team took the easy path here. What I'd have done is implement locking for supported platforms right in the library to cover all direct and indirect (e.g. libcurl) users.<br /><br />So, should libcurl define these callbacks (it doesn't)? That's a tough one. The main issue is that these callback are process-global and thus must be implemented by every single library or module that makes use of OpenSSL. Depending on the linking scenario of these and OpenSSL (dynamic or static), there's no truly correct implementation strategy for these callbacks - modules could overwrite each others callbacks and cause memory leaks, hangs, and segmentation faults as a result of an implementation mismatch at an arbitrary point-in-time.<br /><br />Consider the following scenario: a process loads library A which depends on libcurl. Consequently, library A implemented the callbacks and assigns these at load time.<br />A library used by library A, THIRDPARTY, uses libpq, the official PostgreSQL driver. The driver also uses OpenSSL and initializes the callbacks in the function <tt>PQinitSSL</tt>.<br />Now, in case of the following sequence of events, this scenario can cause a hang because the unlock implementation does not match the lock implementation:<br /><br />1) Initialization of library A<br />2) Library A initializes OpenSSL locking callbacks<br />3) Library A receives libcurl request from multiple threads, that result in repeated lock and unlock callback invocations<br />4) Thread 1 invokes the lock callback in OpenSSL<br />5) A new request handled by thread 2 results in the initialization of THIRDPARTY, which loads libpq and calls PQinitSSL. The initializes overrides the locking callbacks<br />6) Thread 1 invokes the unlock callback which has no effect on the previously locked lock object because the implementation changed between lock and unlock. <b>Application hang or undefined behavior</b><br /><br />Of course there are other scenarios that can lead to problems, all of them caused by the global locking callbacks that must be implemented for thread-safe operation. My point is that whenever global resources and multiple libraries are involved, chances are that these cannot coexist.<br /><br />I recommend one of the following two approaches to following the OpenSSL contract while also minimizing collisions with other libraries or modules:<br /><br /><b>Solution A) Beware of other libraries in your locking callback implementation</b><br /><br />Implement and install your callback knowing that other libraries might have installed callbacks already. In particular, do not install callbacks if callbacks are already in place (and consistent) to avoid causing hangs or undefined behavior. Uninstall callbacks on unload to avoid crashes on subsequent callback invocations. Uninstall the callbacks only if these represent callbacks installed by your library - previously installed callbacks must not be affected. Additionally, new callbacks installed by other modules after the initialization of your library should not be affected as well (it's better to leave them in place rather than having no callbacks installed).<br /><br />The following pseudo-code implements these recommendations:<br /><pre>init()<br />{<br /> if (!all_callbacks_are_installed) {<br /> install_callbacks();<br /> }<br /> else {<br /> /* Do not interfere with existing callbacks. */<br /> }<br />}<br /><br />destroy()<br />{<br /> /* Uninstall callbacks to avoid segmentation faults after unload. */<br /> /* Only uninstall callbacks owned by this library. */<br /> if (installed_callbacks == library_callbacks) {<br /> uninstall callbacks();<br /> }<br />}</pre><br /><b>Solution B) Use a private OpenSSL library (less desirable)</b><br /><br />If dependencies allow, link OpenSSL statically so that callbacks are not shared and conflicts can be avoided. The major drawback here is that OpenSSL cannot be updated independent from your implementation which is critical in the case security updates must be applied. Used libraries depending on OpenSSL must be linked statically as well, which might not be an option in the case of proprietary libraries or libraries not available as an archive. If you go down that road, make sure not to export OpenSSL symbols (GCC: compile with -f visibility=hidden) to prevent other libraries from accessing your private (and possibly incompatible) copy. This does have its issues, but sometimes, there's no other way.<br /><br />Whatever the reasoning against implementing the locking code directly in the library was, it unnecessarily complicates the task of writing stable multi-threaded code for developers. Fortunately, if some thought goes into the callback implementation, the facility provided by OpenSSL is good enough for completing the task of enabling the thread-safe operation of OpenSSL and libcurl as well as other OpenSSL dependencies.<br /><br /><br />With these two issues addressed, libcurl should integrate just fine in your muti-threaded code.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-8284605223616017121?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com0tag:blogger.com,1999:blog-7832154706888933451.post-61855673755053002382008-05-25T15:31:00.009+02:002009-06-01T17:34:24.434+02:00Home, Sweet New HomeThroughout the last 7 years or so, I've been living in a small apartment approx. 40 minutes by feet from downtown Linz. Several months ago, I was fortunate enough to find a more spacious replacement right in downtown Linz, only minutes away from (almost) everything you can think of. Additionally, it's situated next to a gas station that's open for business on a 24/7 basis, a rare comfort in European countries. So, should my supply of Red Bull (I can't help myself) come to an end at 4:46am in the course of a programming spree, I can resort to my backup next door :)<br /><br />After two weeks of moving essentials and most other things, it's finally done. I'm positive that my new home will give me a a general boost, definitely so. It might also help me to establish a routine morning run before work, a nice 6 km waterside course only meters away is waiting to be challenged...<br /><br />The living room is not ready yet. Nonetheless, being a technology enthusiast, indispensable <i>subtle</i> technology references are already in place ;)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_VBPhg4mhdMo/SMWb8id-7tI/AAAAAAAAAL8/uJcPrYCZ8mg/s1600-h/DSC00966-5.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_VBPhg4mhdMo/SMWb8id-7tI/AAAAAAAAAL8/uJcPrYCZ8mg/s400/DSC00966-5.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5243768805489831634" /></a><br /><br />P.S.: The UNIX license plate can be obtained from <a href="http://www.opengroup.org/bookstore/catalog/n900.htm">The Open Group online store</a>. I once owned a Digital UNIX / Compaq Tru64 UNIX plate, an adaption of the original. At that time I was an Alpha / Tru64 advocate and user. As always, nothing can replace the original...<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-6185567375505300238?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com0tag:blogger.com,1999:blog-7832154706888933451.post-81864028083743237492008-05-03T11:29:00.004+02:002008-05-03T11:49:17.699+02:00Cisco VPN Client on Leopard 10.5.2Just a quick note for those of you struggling with Cisco's VPN client on Leopard, Mac OS X 10.5.2. My initial attempt was based on client version 4.9.0.0.50. The result was the following error message indicating that no active network interfaces are available:<br /><br /><tt>Error 51: Unable to communicate with the VPN subsystem.<br/>Please make sure that you have at least one network interface that is currently active and has an IP address and start this application again.</tt><br /><br />Needless to say, that was a false statement. So I updated to 4.9.0.1.80, that didn't fix the issue. What fixed it was a minor upgrade to build 100, version 4.9.0.1.100, the VPN connection has become fully functional from there.<br /><br />The essence is: <b>With Leopard 10.5.2, use 4.9.0.1.100</b>.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-8186402808374323749?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com1tag:blogger.com,1999:blog-7832154706888933451.post-29480424036809652802008-05-03T01:55:00.013+02:002008-05-03T18:36:53.660+02:00How do you share your runs? Do you?I don't. My current solution for logging runs is a Windows-based software called <a href="http://www.zonefivesoftware.com/SportTracks">SportsTracks</a>. It supports the basic set of per-workout metadata as well as input from devices such as a heart rate monitor or GPS receiver. I use Garmin's Forerunner 305 to record workaround duration, distance, heart rate and course, the import works like a charm. Additionally, SportsTracks provides you with an extensive toolkit for analyzing individual workouts by means of statistics and interactive charts, and generating reports covering multiple workouts. What I love about workouts is the logging ritual. Logging a new run after a hard workout and browsing through the data that was silently recorded throughout the last minutes or more likely hours, that's something I really enjoy. I'm obsessed with my distance totals too ;) That left aside this facility serves as kind of a virtual trainer that can actually provide objective feedback...<br /><br />I have two problems with my current solution. One, SportsTracks is Windows-based and will probably never run on Linux or Mac OS X. My current system runs on Mac OS X, so I have to fall back to a Windows system to import my new workouts and analyze my progress. SportsTracks used .NET, thus, the chances of a Linux or Mac OS X version are practically non-existent. I don't want to go the virtual machine route, not for one application.<br /><br />Two, and more importantly, there's no easy way to share all data of my past runs via the internet. Yes, I know - not true. What you can do is export maps and workout data as HTML, an automatic upload via FTP can be triggered as well. Right, my idea of sharing my runs though is to provide visitors with an experience that is similar to SportsTracks. For example, with every new run, I can easily check new distance totals in SportsTracks. In the case of per-workout exports, these totals are not available. Another aspect is interactivity with tables and charts, static images are of course limited to a single view of data.<br /><br />I guess, I'm looking for some kind of service that provides runners with an easy way of sharing workout data and visitors with a clean yet feature-rich interface for browsing through the shared data. Nike+ provides a nice interface that goes into the right direction. Understandably, it only supports Nike+ input (which is why I had to manually migrate run-by-run from Nike+ to SportsTracks when I switched to the Forerunner :/ ). It fails in respect to sharing though, there's no way I know of to share all runs as opposed to a single selected run.<br /><br /><b>So, my fellow runners: How do you share your runs? Do you share them at all?</b><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-2948042403680965280?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com5tag:blogger.com,1999:blog-7832154706888933451.post-89836083984860739032008-04-27T11:31:00.012+02:002008-05-03T18:36:21.728+02:00A first: 26.2 kmI'm not yet sure about my next race goal - half-marathon or marathon - but I still decided to try a new distance which can be helpful in either case (thinking overdistance training). Before yesterday, my longest run had been the half-marathon distance, around 21 km. After the first 11 km of my run, I committed to a distance of 26 km, which required me to turn around after the initial 13 km (I toyed with a goal of 28 km, didn't want to push too hard though).<br /><br />The first 21 km had been relatively easy, the last 5 km however were very difficult and continually prompted me to give up and be satisfied with the half-marathon distance. The energy was still there, my legs were killing me though, I already saw cramps coming (although that never happened). After 26.2 km and around 3 hours of non-stop running (or jogging), I finished the workaround and managed to reach the goal of completing 26 km, quite satisfying indeed :)<br /><br />This workout provided me with a foretaste of what to expect throughout a marathon and definitely made me appreciate the challenge of 1) finishing a marathon and 2) doing so in a reasonable time, more than ever before. I knew it wouldn't be easy, but quite frankly I didn't expect 5 km more to become much of a problem.<br /><br />My previous training strategy was to run new distances for as long as they represent a major obstacle, so I'll do more 26 km workouts throughout the next weeks until I can safely say that I master the distance.<br />Thereafter, the next milestone might be the dreaded 32 km mark - where a marathon is said to begin and work against the runner. We'll see about that :)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_VBPhg4mhdMo/SBSnNM_5PWI/AAAAAAAAAHQ/HHweigNwiMI/s1600-h/26-1.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_VBPhg4mhdMo/SBSnNM_5PWI/AAAAAAAAAHQ/HHweigNwiMI/s400/26-1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5193960115534380386" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_VBPhg4mhdMo/SBSnZc_5PXI/AAAAAAAAAHY/rOvug-V_3mE/s1600-h/26-2-1.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_VBPhg4mhdMo/SBSnZc_5PXI/AAAAAAAAAHY/rOvug-V_3mE/s320/26-2-1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5193960325987777906" /></a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-8983608398486073903?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com0tag:blogger.com,1999:blog-7832154706888933451.post-42054296961023185912008-04-13T21:09:00.019+02:002008-05-03T11:18:49.367+02:00OMV Linz Marathon 2008<div style="text-align: left;">I've been running for more than a year now, with around 1,100 completed kilometers. I don't know why I had decided to start running in the first place, what I do know is that this was one of the best decisions of my life. Being a stressed-out software engineer, I enjoy the relaxation and energy boost running brings along, it's also the simplest (run anytime, anywhere) and least expensive workout possible.<br /></div><div><br /></div><div>My racing debut was the "Linzer Sparkassen Citylauf 2007", a half-marathon. In contrast to today, I was less prepared for the race as well as the pace required to complete it in a satisfying time, the result was 02:16:46. I completed the first 10k in around 57 minutes, however, I was forced to slow down during the second half because my energy depot was practically empty. </div><div> </div><div> </div><div><br /></div><div>Today, 6 month after my HM debut, I participated in the "OMV Linz Marathon 2008", my competition of choice was once again the half-marathon. I was unsure about participation because f a foot injury I contracted one week ago during training. During a 5k test run yesterday, the injury was fine during the beginning, but was clearly noticeable in the end. Today morning, one hour before the race, I was in doubt about participating as my foot got worse. Nevertheless, I decided to pull through!</div><div><br /></div><div> </div><div>At 9:15 am, the raced started on a freeway bridge with around 14,000 participants. My intention was to finish before the two-hour mark, my training was based on a plan from Herbert Steffny for 1:59:00. To ensure a steady and adequate pace, I was using the Garmin Forerunner 305, which not only records the course via GPS, it also provides an instant pace average that is accurate enough for relying on it during the race.</div><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_VBPhg4mhdMo/SBwtt8_5PYI/AAAAAAAAAHk/Rdmzm66fj4Y/s1600-h/raw-LIFM0220y.jpeg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_VBPhg4mhdMo/SBwtt8_5PYI/AAAAAAAAAHk/Rdmzm66fj4Y/s400/raw-LIFM0220y.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5196078337570192770" /></a><br /><br /><div>The first 19k were comparably easy, way easier than last time as well as during training runs and way faster than ever before. I completed the 10k in around 57 minutes and still had a chance to easily finish within the first 2 hours. Between 19k and 21k, I increased my pace to make sure I wouldn't miss my goal. The "hammer-man" tried to intervene at that point, however, I managed to maintain the pace (around 5:00) while heading towards the finish line. It's true, the cheering audience does help quite a lot. I passed the finish line with an official net time of 01:57:35, slightly better than expected and with relatively little effort during the first 19k. I was very satisfied with the result, particularly considering my injury, which could have completely thwarted my plans!</div><div> </div><div><br /></div><div>Paricipating in a race amongst 14,000 fellow runners was a fantastic experience, finishing in 01:57:35 was excellent and exceeded my expectations for the day. In contrast to last year, I took carbo-loading seriously this time. On a retrospective note, I think the full depot of carbo-hydrates enabled my effortless run until the 19k mark, it clearly showed.</div><div></div><br /><div>It's always interesting to analyze the race by means of the data recorded by Forerunner. My average pace was 05:30. While I did not plan for it, I managed a negative split - the second half page average was slightly higher than the first. Here's a chart covering pace and heart rate during the race:</div><div><br /></div><div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_VBPhg4mhdMo/SAJvFWZXtuI/AAAAAAAAAGU/kzXw2jDDeJE/s1600-h/linzmarathon.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_VBPhg4mhdMo/SAJvFWZXtuI/AAAAAAAAAGU/kzXw2jDDeJE/s400/linzmarathon.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5188831858386253538" /></a></div><div><br /></div><div>The following image shows the course based on GPS data:</div><div><br /></div><div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_VBPhg4mhdMo/SAJvFmZXtvI/AAAAAAAAAGc/5Tykll5Plog/s1600-h/linzmarathon.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_VBPhg4mhdMo/SAJvFmZXtvI/AAAAAAAAAGc/5Tykll5Plog/s400/linzmarathon.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5188831862681220850" /></a></div><div><br />The OMV Linz Marathon was excellent, I thoroughly enjoyed every second (well, almost ;) ) and will take part again next year unless another, more interesting event turns up.</div><div><br /></div><div> </div><div><span class="Apple-style-span" style="font-weight: bold;">Only one open question remains for the next event:</span></div><div><span class="Apple-style-span" style="font-weight: bold;">new half-marathon goal OR marathon?</span></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-4205429696102318591?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com0tag:blogger.com,1999:blog-7832154706888933451.post-56071232311777682152008-04-10T21:11:00.010+02:002008-06-29T10:29:44.961+02:00Don't throw your Macbook Air out just yet, let there be silenceI've been waiting for my personal Macbook Air for around two weeks and could not wait to get hold of that machine extraordinaire. I expected to receive a notebook that is well-manufactured and manages to combine a minimalistic and elegant design with a solid level of performance.<div> </div><div>I loved my new main computer - my Air - from the very beginning (yes, m-a-i-n computer, I know I'm crazy ;) ). Unfortunately, my enthusiasm faded after 1 hour of working with the default OS X installation. A Macbook Air is a beautiful machine, but I also expected it to be beautifully silent during "normal use". Well, much to my regret, it was not! Whenever the CPU load increased moderately (e.g. due to watching a YouTube video) and lasted for longer periods of time, the Air increased the fan speed to the factory maximum of 6200 rpm. At 6200, the buzz of the Air's fan can be incredibly annoying, particularly if you're sensitive to fan noise. At 2500 rpm, the fan is practically unnoticeable - the Air's pretty aggressive about cooling though, so, these low levels are rare in the non-idle-case.</div><div><br /></div><div> </div><div>My research lead me to believe that this NOT an issue affecting my Air in particular, it's behavior by design. Lots of Air owners seem to be annoyed by the fan noise, none of them have found satisfying workarounds and some even returned their Airs or got them replaced in hope for a "working" unit.</div><div><br /></div><div>Rather than returning the Air or requesting a replacement to fix the issue, I investigated further and tried various ways to bring silence to the otherwise flawless and fascinating Air experience. I experimented with different energy saving configurations, software for controlling the fan rpm minimum as well as CPU voltage and frequency and also changed OS X kernel module configurations to alter the fan behavior. While all of these had noticeable effects on the situation, none of them prevented the fan controller from increasing revolutions to the maximum of 6200.</div><div> </div><div>The fan is controlled by the so-called System Management Controller (SMC). Software allows you to modify the rpm minimum, that however could not solve the issue. Apple now provides an <a href="http://www.apple.com/downloads/macosx/apple/firmware_hardware/macbookairsmcupdate10.html">SMC firmware update</a> that affects fan control. According to the release notes, this update could potentially worsen the situation because it apparently tries to lower CPU temperature further to avoid hangs and unexpected shutdown (of a single core and/or the whole system). I tried the update, it didn't have any noticeable effect in either direction.</div><div><br /></div><div>Despite the 6200 rpm targeted by SMC, CPU temperature levels remain in a perfectly safe region (60 - 70 °C) at all times. So, knowing that the rpm increase is unjustified in respect to temperature levels, I changed the rpm minimum to 4500 and 6200. In respect to CPU temperature at 100% CPU utilization, the temperature diff between 4500 (maximum acceptable level that can be considered comfortable) and 6200 rpm is pretty much insignificant. Knowing that, my goal was to redefine the rpm maximum to fully address the issue at stake. I was unable to find any way to do that during the first round of research. Most utilities, including <a href="http://www.macupdate.com/info.php/id/23049">SMC Fan Control</a>, merely allow you to change the minimum. As it turns out though, that software package provides a console application <tt>smc</tt> that can be used to changed all writable SMC parameters, not just the rpm minimum. With the help of the source of a Linux kernel driver controlling the fan via SMC, I identified the key representing the SMC parameter controlling the rpm maximum and gave the new maximum a try by executing <tt>smc</tt> as follows:</div><div><br /></div><div> </div><div><span class="Apple-style-span" style=" ;font-family:'courier new';">smc -k F0Mx -w $(python -c 'print hex(4500 &lt;&lt; 2)[2:]')</span><br /></div><div><br /></div><div>Additionally, I reset the minimum to 1500 to conserve the fan at CPU idle levels:<br /></div><div><br /></div><div></div><div></div><div><span class="Apple-style-span" style=" ;font-family:'courier new';">smc -k F0Mn -w $(python -c 'print hex(1500 &lt;&lt; 2)[2:]')</span><br /></div><div><br /></div><div>These commands only change minimum and maximum, revolutions still remain in control of SMC. The results have been fantastic, the Air has been quiet and cool ever since enforcing the new limits. Execute these commands in a startup item to make changes permanent (for the sleep / wakeup case, use </span><a href="http://www.bernhard-baehr.de/">SleepWatcher</a>).<br /></div><br /><div></div><br /><div>Now, I can finally say that it is a real pleasure to work with this elegant and capable notebook, I enjoy every minute of doing so. I strongly encourage you to give this workaround a try before throwing the Air out (at your own risk), you definitely miss something!</span></div><div> </div><div> </div><div> </div><div> </div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-5607123231177768215?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com13tag:blogger.com,1999:blog-7832154706888933451.post-26035404549793289182007-05-14T21:38:00.001+02:002008-04-14T21:50:09.388+02:00Getting Subversion (neon) to work with Kerberos on SLES10Just in case you were wondering why Subversion fails to authenticate against an Apache-based, Kerberos-enabled Subversion repository on SuSE Linux Enterprise Server 10...<br /><tt><br />$ svn info https://host/path/to/repository<br />svn: PROPFIND request failed on '/path/to/repository'<br />svn: PROPFIND of '/path/to/repository': authorization failed (https://host)<br /></tt><br />For one, SuSE packages a build of neon, the HTTP / WebDAV library the Subversion client uses, that was not configured with Kerberos support:<br /><tt><br />$ ldd /usr/lib64/libneon.so.24.0.7<br />libssl.so.0.9.8 => /usr/lib64/libssl.so.0.9.8 (0x00002b5f0548b000)<br />libcrypto.so.0.9.8 => /usr/lib64/libcrypto.so.0.9.8 (0x00002b5f055d1000)<br />libz.so.1 => /lib64/libz.so.1 (0x00002b5f05834000)<br />libexpat.so.1 => /usr/lib64/libexpat.so.1 (0x00002b5f05949000)<br />libc.so.6 => /lib64/libc.so.6 (0x00002b5f05a6c000)<br />libdl.so.2 => /lib64/libdl.so.2 (0x00002b5f05c9c000)<br />/lib64/ld-linux-x86-64.so.2 (0x0000555555554000)<br /></tt><br />So, by installing the neon source RPM, krb5-devel-1.4.3-19.10.3 and rebuilding the RPM using rpmbuild -bb SPECS/krb5.spec, problem #1 can be solved. Wait, the story isn't over yet.<br /><br />The situation remains unchanged despite a Kerberos-enabled build:<br /><tt><br />$ svn info https://host/path/to/repository<br />svn: PROPFIND request failed on '/path/to/repository'<br />svn: PROPFIND of '/path/to/repository': authorization failed (https://host)<br /></tt><br />By enabling neon tracing (by modifying the Subversion 'servers' configuration) and adding additional traces, I found out that gss_init_sec_context fails with GSSAPI major and minor:<br /><tt><br />No context has been established. Validation error<br /></tt><br />I checked the Kerberos source:<br /><br /><b>/usr/src/packages/SOURCES/krb5-1.4.3/src/lib/gssapi/krb5/duplicate_name.c:</b><br /><tt><br />...<br />static OM_uint32<br />mutual_auth(<br /> OM_uint32 *minor_status,<br /> gss_ctx_id_t *context_handle,<br /> gss_name_t target_name,<br /> gss_OID mech_type,<br /> OM_uint32 req_flags,<br /> OM_uint32 time_req,<br /> gss_channel_bindings_t input_chan_bindings,<br /> gss_buffer_t input_token,<br /> gss_OID *actual_mech_type,<br /> gss_buffer_t output_token,<br /> OM_uint32 *ret_flags,<br /> OM_uint32 *time_rec,<br /> krb5_context context)<br />{<br />...<br /> /* validate the context handle */<br /> /*SUPPRESS 29*/<br /> if (! kg_validate_ctx_id(*context_handle)) {<br /> *minor_status = (OM_uint32) G_VALIDATE_FAILED;<br /> return(GSS_S_NO_CONTEXT);<br /> }<br /></tt><br /><br />There's the problem. gss_init_sec_context validates the input context handle, the validation fails. Looking at the neon source, the bug is obvious:<br /><br /><b>/usr/src/packages/SOURCES/neon-0.24.7/src/ne_auth.c:</b><br /><tt><br />static int<br />gssapi_challenge(auth_session *sess, struct auth_challenge *parms)<br />{<br />...<br /> gss_ctx_id_t context;<br /> gss_name_t server_name;<br /> unsigned int major_status, minor_status;<br /> gss_buffer_desc input_token = GSS_C_EMPTY_BUFFER;<br /> gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER;<br /><br /> clean_session(sess);<br /><br /><br /> if (get_gss_name(&amp;server_name, sess))<br /> return -1;<br /><br /> major_status = gss_init_sec_context(&amp;minor_status,<br /> GSS_C_NO_CREDENTIAL,<br /> &amp;context,<br /> server_name,<br /> GSS_C_NO_OID,<br /> 0,<br /> GSS_C_INDEFINITE,<br /> GSS_C_NO_CHANNEL_BINDINGS,<br /> &amp;input_token,<br /> NULL,<br /> &amp;output_token,<br /> NULL,<br /> NULL);<br /></tt><br />The neon developers forgot to initialize the local variable context with GSS_C_NO_CONTEXT, d'oh...<br />Apply the following patch to address this:<br /><br /><b>neon-0.24.7-krb5-auth.patch:</b><br /><tt><br />--- neon-0.24.7/src/ne_auth.c 2004-07-05 11:45:42.000000000 +0200<br />+++ neon-0.24.7-dev/src/ne_auth.c 2007-05-11 22:45:28.000000000 +0200<br />@@ -343,7 +343,7 @@<br />static int<br />gssapi_challenge(auth_session *sess, struct auth_challenge *parms)<br />{<br />- gss_ctx_id_t context;<br />+ gss_ctx_id_t context = GSS_C_NO_CONTEXT;<br /> gss_name_t server_name;<br /> unsigned int major_status, minor_status;<br /> gss_buffer_desc input_token = GSS_C_EMPTY_BUFFER;<br />@@ -924,15 +924,13 @@<br /> success = 0;<br /><br />#ifdef HAVE_GSSAPI<br /></tt><br /><b>Quick Summary:</b><br /><br />rpm -ihv neon-devel-0.24.7-20.2..rpm<br />rpm -ihv krb5-devel-1.4.3-19.2..rpm<br />Apply the aforementioned patch using patch -p1<br /><br /><b>It's official: nobody's using Kerberos. OK, just the SLES QA guys ain't... ;)</b><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-2603540454979328918?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com0tag:blogger.com,1999:blog-7832154706888933451.post-66877856083814047312007-05-14T02:14:00.002+02:002008-04-14T21:50:55.065+02:00Nobody's in need of a re-entrant Kerberos 5, why?IMHO, the Kerberos protocol is <i>the</i> solution for implementing Single-Sign-On (SSO), at least in the context of corporate intranets. Kerberos is practically the only solution available for SSO in a heterogenous computing environment comprised of different operating systems including UNIX variants and Windows. The only time a user ever has to provide a password is during the initial logon on a workstation. The credentials obtained can be passed to specific services and, more importantly, Kerberos allows delegation so that user credentials can be passed from the workstation via service A to service B, for example. Sure, several other SSO implementations exist but, to my knowledge, none of then can offer of the level of transparency and platform-coverage Kerberos can.<br /><br />There's a catch however, Kerberos 5 implementations available for Linux / UNIX are not re-entrant and thus cannot be used in multi-threaded applications without serializing all code paths accessing the Kerberos API.<be> The main Kerberos implementation I primarily refer to here is MIT Kerberos, the original implementation, Heimdal and friends shouldn't make any difference here however when it comes to a thread-safe implementation. Thinking about it, I haven't reviewed the Java GSSAPI source yet but my guess is that calls are serialized in the JNI part of the library to make sure that Java clients can safely use it across threads.<br /><br />It might be hard to believe but, for once, Microsoft has managed to create something that is superior to Linux / UNIX equivalents (to be fair, there are other exceptions as well): The Microsoft Windows Kerberos implementation is fully re-entrant. Doesn't come as a surprise to me because Microsoft simply couldn't afford to provide an API that isn't - at last, Windows itself and practically all applications and services are inherently multi-threaded. In my opinion, that is exactly the reason why there's no re-entrant MIT Kerberos available on Linux / UNIX: Except for most GUI applications, common daemons are single-threaded and use a process model instead that often is fork(2) driven:<br /><ul><li>sendmail</li><li>pop3d / imapd variants</li><li>sshd</li><li>ntpd</li><li>Samba</li><li>PostgreSQL</li><li>Apache 1.3 and earlier</li><li>...</li></ul>So, in most cases, the lack of a re-entrant Kerberos implementation is not at all an issue. As a result, the current demand for it doesn't cause that issue to land on the project's TODO list. New implementations and more modern service implementations like Apache 2.0 and later (MPM = {worker|event}) and MySQL are fully multi-threaded, and, once Kerberos support comes into play, would have a problem or at least would need more time to implement Kerberos support (because of the locking business).<br /><br />Granted, the number of installations dealing with multi-threaded applications (a small subset already) as well as Kerberos (in most cases, it's only an issue for medium to large-scale installations) is not exactly substantial - not substantial enough for supporting the refactoring of existing implementations towards re-entrance. This is a strong case of a minority being discriminated against, please spread the word to make a difference ;)<br /><br />Seriously, in the Linux / UNIX world, there's currently no satisfactory solution available because even those saying that serialization solves it all are mistaken. Consider a large-scale Kerberos-enabled application using Apache as an interface to application users. In each application module, Kerberos may be used and calls must be synchronized. However, that's easier said than done because that synchronization must include all modules, it must span the whole process to solve this issue. If modules originate from more than one project or vendor, you've lost already - process-wide synchronization would require an agreement across all modules on the means of synchronization. If all modules are controlled by a single project or vendor and/or the source is available for those that are controlled by a different group, re-entrance can be established using a consistent locking protocol (e.g. by providing access to a single, process-wide mutex that is owned by a module all other modules have access to). Otherwise, there's practically no way to work around the lack of re-entrance (except for maybe preloading a library implementing Kerberos symbols that basically wraps all externals and serializes access or rolling your own release based on an open source Kerberos implementation).<br /><br />You see, this dilemma is nerve-wracking because there's no satisfactory solution. Most likely, several more years will have to pass (where more multi-threaded daemons can emerge and require multi-threaded Kerberos implementations) until this problem will be solved with the availability of a re-entrant implementation...<br /><br />How do you cope with Kerberos and thread-safety on Linux / UNIX platforms?<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-6687785608381404731?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com0tag:blogger.com,1999:blog-7832154706888933451.post-26776158094086738892007-05-13T23:54:00.003+02:002008-05-03T18:35:59.316+02:00Panting for air on the 4th floor - not anymoreWhen you go to work, walk up the stairs to the 4th floor and end up panting for air, then, at the latest, you know that the workout comprised of writing lines of code throughout the day - I'm a software developer - is not enough, much to my surprise :) Ever since day 1 of my existence, I've never gone in for sports, the exception being mandatory sports classes during high school, which hardly count. April 2nd, I started to run out of the blue, I simply felt like running - run Horst, run...<br /><br />Of course, I couldn't have done it without some sort of interesting equipment. For one, I am running in Nike Free's. I bought my first pair around a year ago and the experience was mind-blowing, at least for me. It is said to be like walking or running barefoot. Certainly, it isn't but it comes close. That is what makes the Free a perfect (though expensive) shoe for everyday use, that's what I've been using it before April 2nd. When running, the special properties are particularly beneficial.<br />Second, I am using my iPod (including Nike+iPod) to record my runs (pace, distance, duration, ...) and keep me entertained. The first aspect is very convenient because the training log writes itself and always contains relatively accurate information on the individual runs (for example, I don't have to estimate the distance myself using Google Maps). More on that later...<br /><br />So far, I haven't stopped, I'm trying to gradually increase distance and frequency. Since April 2nd, I've been running 155.73 km (you know, that crazy unit equally crazy Europeans are known to think in). It's quite easy to keep going, even for a software developer, because these workouts tend to become addictive (just like hacking the Linux Kernel, but that's a different story ;) ).<br /><br />As for "panting for air on the 4th floor", well, it's getting much easier already but it's only been 1 1/2 months so far, so there's loads of room for improvement...<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7832154706888933451-2677615809408673889?l=horstr.blogspot.com'/></div>Horst Reitererhttp://www.blogger.com/profile/12216401608444155229noreply@blogger.com0