Skip to main content

Posts about general

Christmas in Europe - Christmas & Skiing!

Finally, the Alps! We celebrated Christmas with a delicious dinner prepared by Melissa's mom. All told, we spent nine days in Courchevel skiing. Well, intending to ski at least. Pretty much everybody was sick at some point or other. We'd come back from skiing to various folks passed out in the chalet. I took Thomas skiing a few times, and we put him in lessons as well. He ended up having fever for a few days, so missed out on most his lessons :( Despite the fatigue and various interbreeding viruses, the skiing was fantastic. Remember that rain we had driving on the way up from Geneva? That meant lots of fresh powder just for us! The scenery was beautiful! The chalet was quite nice too. Poor Martin was cooped up in there most of the time though :( At the end of the world! Nat, Jeremy, Mel, Pam and I decided to ski all the way to the edge of the 3-valleys one day. Near the bottom left of the map is a place called "Courchevel 1300 Le Praz." That's where we were staying. If you wake up early, and ski really fast, you can make it all the way to the far right hand side of the map and back in one day. We made it up to the top of the lift called "Bouchet" lift, which is 3230m above sea level! The picture above is going up the "Peyron" lift, and is looking onto the slope behind the "Cime Caron". Click through to the full sized image and you can see a bowl full of moguls near the top. That was a lot of fun to come down! Cime Caron The "Cime Caron" lift itself is quite impressive. It's this bus-sized lift that carries about 50 people at once up the hill. We didn't quite make it back to the chalet before all the lifts closed though :( We got as far as Meribel, and then had to take a few buses to get back to Le Praz. We didn't suffer from a lack of eating here either. One night we went out with Natalia and Jeremy and ordered a dish called Raclette. You get served a giant half wheel of cheese under a heating element, along with some meats, pickles, bread and boiled potatoes. The cheese melts and gets all bubbly and crispy, which you then scrape off and eat with all the other goodies! All in all, Courcheval was amazing, and I'd go back in a second!

Christmas in Europe - Fontainebleau to Courchevel

After the graduation we had planned on spending the rest of our Christmas holidays in Courchevel to enjoy some skiing in the Alps! For some reason instead of driving from Fontainebleau to Courchevel (a relatively easy, but long 6 hour drive), we had booked flights to Geneva via Zurich. Pick up the rental vans in Geneva, a quick 2 hour drive to Courchevel, and we're there! Easy, right? What could possibly go wrong? The same cab driver who picked us up from Charles de Gaul the week before met us at 6 in the morning outside our hotel in the same van he had driven before...except now we had two more people (Nat & Jeremy) plus luggage. Seven adults plus driver and two kids with luggage in an 8 seater van is...a tight squeeze! The kids ended up on our laps, and everybody had luggage piled on top of them. It was a relief to get to the airport and be able to move again! Remember that vicious snowstorm that crippled the Frankfurt airport? Yeah, most of Europe was still getting snow and airports were struggling to cope and our flight from Paris to Zurich was a bit late taking off as a result. When we arrived in Zurich we were informated that our flight to Geneva had been cancelled, and all the of the other flights that day were full. The very helpful Swiss Air agent offered to put us on a train to Geneva instead. No problem, we said, let's just get our luggage first. It's about 1pm at this point. And so began the Great Waiting. We were instructed to head on down to the luggage pickup area and await our luggage at a special carousel reserved just for suckers redirected luggage. An hour or so later with none of our luggage in sight (but plenty of other folks' luggage stacked up along the walls...not a good sign!), further inquiries to the luggage folks lead us to believe that maybe our luggage got sent to Geneva without us. No wait, it's still here. Oh, now we don't know where it is at all...it must be lost along with the tens of thousands of other pieces we haven't dealt with in the back. The good side to all this is that the two boys were having a blast. No, really. Something I never realized before was that the luggage claim area is mostly deserted. The time between when flights arrive offers two young boys a giant playground all to themselves: all kinds of interesting things to climb on and lots of room to run around and throw toys. At around 5pm we finally give up and decide to take the train to Geneva. I think the boys were kind of sad when we finally left! However, their mood quickly improved with the discovery of a playground on the train!. Three hours later, we're in Geneva, at the airport, and our luggage is waiting for us! We wonder how long it's been there...probably all day :P Picking up the rental vans was relatively painless, and the drive to Courchevel uneventful. It was pouring rain for much of the drive though, which didn't bode well for skiing. And at this point the frantic pace of the past few days really caught up with us, several of us were sick now with colds or fever.

Christmas in Europe - Touring Paris and Fonty

We had a few days between arriving at Natalia's graduation, so we spent some time touring around Fontainebleau and Paris. The train into Paris is pretty short, about 40 minutes. Between the commuter trains and the Paris metro, Thomas was in seventh heaven! Where are we going again? Thomas has been excited to see the Eiffel tower for a long time now, and the real thing didn't disappoint! It was raining a little bit our first day in Paris (the 19th), but that didn't deter plenty of folks from coming out to see the tower as well! Eiffel Tower in the Rain There was a bit of a line up to the elevator to get to the top of the tower, so it was pretty dark by the time we got up. Thomas loved running around, looking at all the city lights, and especially being blown around by the high winds buffeting the tower that night! Martin enjoyed it too, most especially undergoing an emergency diaper change at the top! On top of the tower Ahhh, dry clothes!Eiffel Tower at night The next day (the 20th) we started out the day by taking a short walk from the hotel to the Château de Fontainebleau One neat piece on display is a plate painted with Niagara Falls around the 1830's. The Falls look much shorter in the painting than they do now. I wonder if that's what they really looked like back then? Plate of Niagara Falls The boys weren't very interested in the interior of the Château, but did like running around the grounds! Later that afternoon we boarded the train headed for Paris again. We discovered shortly after the train left the station that we'd left one of our backpacks at the train station. Desperate, we called Natalia, who was still in Fonty, to see if she could get in touch with the station staff to see if they could hold the back for us. Natalia called back to say there was no way to get in touch with the station staff directly, and that we'd have to check lost & found (wherever that was!) the next day. Little did we know... ... Natalia had already found our backpack at the station, and had taken it for some joyriding! We were reunited with our poor backpack at Notre Dame. We finished the evening with a great dinner at Le Relais de l'Entrecôte. Dessert The following day we spent relaxing at the Jardin du Luxembourg, followed by a quick visit to the Eiffel Tower in the fog, then finished the evening at a restaurant called L'enfance de Lard in Paris, which in Melissa's opinion was the culinary highlight of the trip! She ordered a delicious steak tartare. Thomas devoured his grandfather's ceviche-style fish appetizer because we told him it was sashimi :) The food here really was delicious! The owners let Thomas grab as many candies as he wanted from their giant candy dish afterwards. I think all French desserts have to be lit on fire at some point.

Christmas in Europe - Toronto to Fontainebleau

Waiting for our plane This past Christmas, Melissa and I went to France along with our two boys and Melissa's family to attend the graduation of Melissa's sister from INSEAD. And since we were going to be in Europe for Christmas anyway, we all decided to head to the Alps for some skiing after the graduation. It was quite the adventure! We left from Toronto in the evening of December 17th. First stop: Frankfurt! The boys did really well (slept most of the way!) on the long flight to Frankfurt. Clouds! When we arrived in Frankfurt, we noticed the hallways were packed with empty cots. Only later we realized that this was because hundreds of flights were being cancelled due to snow, and that thousands of people were going to be stranded in Frankfurt. Thank God our flight to Paris wasn't cancelled, and only left a bit late. We did suffer our first casualty in Frankfurt however: Lufthansa lost Pam's luggage in Frankfurt and it didn't make it to Paris with us. As I write this, she still doesn't have it back. We waited a long time in Paris' Charles de Gaul airport waiting for Pam's luggage to arrive. After a few hours we finally gave up, and met up with our very patient cab driver to take us to Fontainebleau... ...zzzzzz... We woke up to the charming sight of Fontainebleau with snow gently falling. Snowfall in Fontainebleau After a quick dinner at a local crêperie, we promptly passed out en-masse in the hotel. Finally arrived!

What do you want to know about builds?

Mozilla has been quite involved in recent buildbot development, in particular, helping to make it scale across multiple machines. More on this in another post! Once deployed, these changes will give us the ability to give real time access to various information about our build queue: the list of jobs waiting to start, and which jobs are in progress. This should help other tools like Tinderboxpushlog show more accurate information. One limitation of the upstream work so far is that it only captures a very coarse level of detail about builds: start/end time, and result code is pretty much it. No further detail about the build is captured, like which slave it executed on, what properties it generated (which could include useful information like the URL to the generated binaries), etc. We've also been exporting a json dump of our build status for many months now. It's been useful for some analysis, but it also has limitations: the data is always at least 5 minutes old by the time you look, and in-progress builds are not represented at all. We're starting to look at ways of exporting all this detail in a way that's useful to more people. You want to get notified when your try builds are done? You want to look at which test suites are taking the most time? You want to determine how our build times change over time? You want to find out what the last all-green revision was on trunk? We want to make this data available, so anybody can write these tools.

Just how big is that firehose?

I think we have one of the largest buildbot setups out there and we generate a non-trivial amount of data:
  • 6-10 buildbot master processes generating updates, on different machines in 2 or 3 data centers
  • around 130 jobs per hour composed of 4,773 individual steps total per hour. That works out to about 1.4 updates per second that are generated

How you can help

This is where you come in. I can think of two main classes of interfaces we could set up: a query-type interface where you poll for information that you are interested in, and a notification system where you register a listener for certain types (or all!) events. What would be the best way for us to make this data available to you? Some kind of REST API? A message or event brokering system? pubsubhubbub? Is there some type of data or filtering that would be super helpful to you?

Two great, completely unrelated links

Yesterday was a bit of an overwhelming day. After getting home at 1am after a long bus ride home, I was unwinding by catching up on some news and email. I came across these two links, both of which really lifted my mood. The first, Grokking the Zen of the Vi Wu-Wei, talks about a programmer's journey from emacs to BBEdit to vim. This post is a great read in and of itself, but what's really worth it, is the link around the middle of the post to http://stackoverflow.com/questions/1218390/what-is-your-most-productive-shortcut-with-vim/1220118#1220118. This was truly a joy to read. Definitely the best answer I've ever seen on Stack Overflow, and quite possibly the best discussion of vi I've ever read. It taught me a lot, but I enjoyed reading it for more than that. It was almost like being on a little adventure, discovering all these little hidden secrets about the neighbourhood you've been living in for years. Like I said, it was 1am. The second, The Pope, the judge, the paedophile priest and The New York Times, gave me some reassurance that things aren't always as they seem as reported by the media. Regardless of how you feel about the Church or the Pope, it seems that journalistic integrity has fallen by the wayside here. From the article:

Fr Thomas Brundage, the former Archdiocese of Milwaukee Judicial Vicar who presided over the canonical criminal case of the Wisconsin child abuser Fr Lawrence Murphy, has broken his silence to give a devastating account of the scandal – and of the behaviour of The New York Times, which resurrected the story. It looks as if the media were in such a hurry to to blame the Pope for this wretched business that not one news organisation contacted Fr Brundage. As a result, crucial details were unreported.
The entire article is worth a read.

RelEng Blogging Blitz is coming soon!

Several members of the Release Engineering team are going to be blogging next week about various bits of the build, test, and release automation infrastructure for Firefox. If there's something about our infrastructure you've always wondered about, give us a shout and we'll do our best to explain it!

Upcoming Identity Management with Weave

I was really excited to read a recent post about upcoming identity support with Weave on Mozilla Labs' blog. Why is this so cool? Weave lets you securely synchronize parts of your browser profile between different machines. All your bookmarks, AwesomeBar history, saved passwords can be synchronized between your laptop, desktop and mobile phone. Your data is always encrypted with a private key that only you have access to. Combine this with intelligent form-filling, automatic detection of OpenID-enabled sites, and you've got what is essentially single sign-on onto all your websites from all your browsers. Now you'll be able to sign into Firefox, and Firefox will know how to sign into all your websites. Keep up the great work Labs!

Exporting MQ patches

I've been trying to use Mercurial Queues to manage my work on different tasks in several repositories. I try to name all my patches with the name of the bug it's related to; so for my recent work on getting Talos not skipping builds, I would call my patch 'bug468731'. I noticed that I was running this series of steps a lot: cd ~/mozilla/buildbot-configs hg qdiff > ~/patches/bug468731-buildbot-configs.patch cd ~/mozilla/buildbotcustom hg qdiff > ~/patches/bug468731-buildbotcustom.patch ...and then uploading the resulting patch files as attachments to the bug. There's a lot of repetition and extra mental work in those steps:

  • I have to type the bug number manually twice. This is annoying, and error-prone. I've made a typo on more than one occasion and then wasted a few minutes trying to track down where the file went.
  • I have to type the correct repository name for each patch. Again, I've managed to screw this up in the past. Often I have several terminals open, one for each repository, and I can get mixed up as to which repository I've currently got active.
  • mercurial already knows the bug number, since I've used it in the name of my patch.
  • mercurial already knows which repository I'm in.
I wrote the mercurial extension below to help with this. It will take the current patch name, and the basename of the current repository, and save a patch in ~/patches called [patch_name]-[repo_name].patch. It will also compare the current patch to any previous ones in the patches directory, and save a new file if the patches are different, or tell you that you've already saved this patch. To enable this extension, save the code below somewhere like ~/.hgext/mkpatch.py, and then add "mkpatch = ~/.hgext/mkpatch.py" to your .hgrc's extensions section. Then you can run 'hg mkpatch' to automatically create a patch for you in your ~/patches directory!

import os, hashlib



from mercurial import commands, util

from hgext import mq



def mkpatch(ui, repo, *pats, **opts):
    """Saves the current patch to a file called -.patch
    in your patch directory (defaults to ~/patches)
    """
    repo_name = os.path.basename(ui.config('paths', 'default'))
    if opts.get('patchdir'):
        patch_dir = opts.get('patchdir')
        del opts['patchdir']
    else:
        patch_dir = os.path.expanduser(ui.config('mkpatch', 'patchdir', "~/patches"))

    ui.pushbuffer()
    mq.top(ui, repo)
    patch_name = ui.popbuffer().strip()

    if not os.path.exists(patch_dir):
        os.makedirs(patch_dir)
    elif not os.path.isdir(patch_dir):
        raise util.Abort("%s is not a directory" % patch_dir)

    ui.pushbuffer()
    mq.diff(ui, repo, *pats, **opts)
    patch_data = ui.popbuffer()
    patch_hash = hashlib.new('sha1', patch_data).digest()

    full_name = os.path.join(patch_dir, "%s-%s.patch" % (patch_name, repo_name))
    i = 0
    while os.path.exists(full_name):
        file_hash = hashlib.new('sha1', open(full_name).read()).digest()
        if file_hash == patch_hash:
            ui.status("Patch is identical to ", full_name, "; not saving")
            return
        full_name = os.path.join(patch_dir, "%s-%s.patch.%i" % (patch_name, repo_name, i))
        i += 1

    open(full_name, "w").write(patch_data)
    ui.status("Patch saved to ", full_name)


mkpatch_options = [
        ("", "patchdir", '', "patch directory"),
        ]
cmdtable = {
    "mkpatch": (mkpatch, mkpatch_options + mq.cmdtable['^qdiff'][1], "hg mkpatch [OPTION]... [FILE]...")
}

Maybe he's right?

The Pope has been taking quite a bit of heat over the past few weeks in the press. The latest media frenzy is over recent statements he made regarding the Church's consistent teaching that condoms are not the answer to the AIDS crisis in Africa, or anywhere else in the world. It seems like most people automatically assume that condoms are an important part of the solution to combating AIDS. It makes sense on some level I suppose; we're reminded constantly of the importance of having "safe sex", and how using a condom is the responsible thing to do. And I'm sure that condoms do reduce the risk of HIV transmission for any one given sexual encounter. But what are the effects over time? If condoms have a 99% success rate, that's still 1 out of 100 failures. I'm not going to bet my life on a 1% chance of failure. Something with a 1% chance of occurring in a single event, has a 63% chance of occurring at least once over 100 events. Let's say the prevention of transmission rate is 99.9%; there's still a 9.5% chance of transmission over 100 sexual encounters in this scenario. Now, big giant disclaimer here, I don't know what the accepted statistics are on the effectiveness of condoms in preventing HIV transmission, either in ideal circumstances, or in actual usage. I do know that the chances of failure for something definitely add up quickly over time, and they add up fast. So it shouldn't be a surprise to hear that, "We have found no consistent associations between condom use and lower HIV-infection rates, which, 25 years into the pandemic, we should be seeing if this intervention was working." The full article can be read over at the National Review Online. In two places I know of that have had success in combating AIDS, Uganda and the Philippines, the primary focus was on having faithful, monogamous sexual practices. And it makes sense why this works. If people have fewer sexual partners, then the risk of transmission in the general population is reduced. So maybe the Pope is right when he said, "If the soul is lacking, if Africans do not help one another, the scourge cannot be resolved by distributing condoms; quite the contrary, we risk worsening the problem. The solution can only come through a twofold commitment: firstly, the humanization of sexuality, in other words a spiritual and human renewal bringing a new way of behaving towards one another; and secondly, true friendship, above all with those who are suffering, a readiness - even through personal sacrifice - to be present with those who suffer. And these are the factors that help and bring visible progress." (my emphasis) I think he is. Thanks to Mulier Fortis for the link to the National Review article.