Close Firefox now made easier

Around the time Firefox 25 came out, I complained that I frequently got an error message saying the application was still running but not responding:

It seem some time between then and now (Firefox 35) they addressed this issue. First, the error message became far less frequent. And second, they added a helpful button to kill the unresponsive Firefox instance.

Firefox

Nice UX improvement. Well done, Mozilla.

When to Use which Social Media

I noticed there is a strong correlation between how much free time I have, and which social media I frequent:

  • If I’m working and therefore have little to no free time, I won’t use any social media at all.
  • If I’m traveling, you’ll read about it on this blog.
  • If I’m doing something related to the theater, I’ll post about it on Facebook.
  • If I have some free time to catch up on items in my news reader, I’ll probably post some of them on Twitter.
  • If I have more free time, I’ll write something about software here.
  • And if I have a lot of free time, I’ll be on Xbox Live.

This list is dedicated to M who I know loves this kind of stuff.

Vancouver in February

If you enjoy gray skies paired with a constant light drizzle, Vancouver in February is a great travel destination. Otherwise, you might pick some other time in the summer to visit the city.

I was there on business, so had no choice regarding the time of year. I also had very little time to go out an see the city. Combined with the aforementioned weather, the photos I brought back aren’t great. Here they are, anyway.

Lay-over in Frankfurt

Looking at the sky over Frankfurt on an early-morning train from Düsseldorf.

Himmel auf dem Weg nach Frankfurt

I actually wanted to photograph the monitor LCD in the background showing how the train was going close to 300km/h, but the camera decided to focus on the seat in front of me. Looks pretty artsy, nonetheless.

Zug

Vancouver

The city is surrounded by beautiful mountains, but it was only on a couple of occasions that one could actually see them.

Berge unter grauem Himmel

Most of the time it looked like this: an all-gray North Vancouver.

Graues North Vancouver

Devoid of any kind of human touch: entering the hotel room.

Tristesse Schwarzweiß

In addition to that, the hotel was also located beautifully right next to a freeway.

Freeway bei Nacht

Going home

The Lufthansa Boeing 747 waiting to take me home. As on other major airports, an HSBC advertisement isn’t far.

Boeing 747 vor dem Abflug mit HSBC-Werbung

Writing a High-Performance C# Application

After months of working mostly in a business analyst/architect role und only occasionally writing code, I was finally given a project that now has me coding quite a bit for a change. The objective was to rewrite an existing Delphi application in C# and add new functionality. As with most of the applications I get to work on, performance was key.

Recommended reading

Before embarking on this project, I bought a copy of Pro .NET Performance: Optimize Your C# Applications by Sasha Goldshtein et alia. This book is a great read and I can recommend it without hesitation. You could probably stop reading this article and just get the book and you would be fine.

I also found Writing High-Performance .NET Code, but since I haven’t read it, can’t comment on its merits.

You may also want to check out my collection of links on the matter Reading up on Concurrent Programming.

Memory

While .NET offers automatic memory management, this by no means implies that you did not have to think about it. In fact, for high-throughput applications, I’ve found garbage collection (GC) to be one of the most crucial determinants of performance. The Goldshtein book discusses memory management at length.

In addition, there is also a wealth of more detailed information on various MSDN blogs, particularly the CLR Garbage Collector blog by Maoni Stephens.

Other, non-GC related memory management topics:

  • Know Thine Implicit Allocations highlights situations where memory allocations are made by the framework that you might be unaware of. The good news is in newer version of the framework steps are taken to reduce these.
  • Choosing between class and struct, as (generally speaking) instances of the latter will be collected with the objects that contain them and not result in new objects that need to be tracked during garbage collection.

I’ve actually become quite a fan of structs. One central type in my application, with tens of thousands of instances that store information in the form of a couple of ints and longs, is now implemented as a struct. Instances are stored in an array and instead of passing references, I pass the elements as reference parameters or refer to them by their index. The code in this part of the application might not be very object-oriented, but that is often the price to pay for excellent performance.

Specialized classes

As a general rule, I recommend using the well-known classes from the .NET framework, e.g. for collections. Every once in a while, however, there are situations, where you have special (performance) requirements that may not be met by standard collections. There is actually a chapter in the Goldshtein book about writing your own collections. Sometimes, however, there are already classes that do what you need, they are just hidden away in a different namespace.

For instance, while everybody knows about System.Collections.Concurrent, there is also System.Collections.Specialized, which contains a couple of interesting types:

Speaking of different implementations of dictionaries, I’ve found this article about Choosing The Right Collection Class extremely helpful.

Finally, LazyInitializer is an excellent alternative to the Lazy<T> class, particularly when you are watching your memory footprint and/or the number of objects you create.

Watching what I Watch on the Web

In past installments of Things to Watch I had shared a number of YouTube channels that I thought were particularly entertaining. These were fun and great time wasters, but at some point I realized that they were just that: wastes of time.

So I decided to clear out my list of subscriptions and get rid of all the vlogs , web series and other comedy content. Instead, I am focusing on just a few, educational channels:

Do More Good 2014

For the past couple of years (2013, 2012, 2011) I’ve written about my charitable giving. So here’s the report for 2014.

Giving

While I have increased the amount given in line with my plans from last year, the list of recipients for 2014 is almost unchanged from 2013.

  • Be!Fund Germany is new this year. I talked about it last year and M and her friends have finally been able to get the paperwork done to get it off the ground this year.
  • Deutsches Rotes Kreuz: German Red Cross
  • Fifty Fifty: a newspaper written by and sold to benefit the homeless in Düsseldorf
  • Förderverein Löbbecke-Museum + Aquazoo: natural science museum in Düsseldorf
  • Förderverein Theaterwoche Korbach: amateur drama group festival
  • Förderverein Wildpark: wildlife park in Düsseldorf
  • Human Rights Watch: read how I selected HRW last year
  • Matthäikirche: a local church
  • New trees for Düsseldorf: to offset the effects of storm Ela; see my pictures here
  • Theatergruppe am Goethe: drama group at my old school
  • Unicef
  • Vereinigung ehemaliger Schüler des Rethel- und Goethe-Gymnasiums: alumni organization of my old school
  • Water.org: smaller, unplanned donation motivated by the reporting by John Green and Bill Gates
  • Welthungerhilfe: a German organization for development cooperation and emergency relief aid

Helping me help

This year, my boss announced that he would match the biggest donation that anyone from our team would make in the month of May. The only condition being that the organization would have to have the DZI Spendensiegel (article in German) a kind of quality check that organizations handle the funds they are given responsibly and spend it for the intended purposes.

Long story short, my donation to Welthungerhilfe won and after my boss’s boss announced that he would donate even more on top, Welthungerhilfe actually received six times as much money as I had originally planned to give. That’s pretty awesome, and I’m grateful that my employer encourages this.

Unfortunately, I had already spent a lot of my donation budget by the time my boss had announced this, so I actually won with one of my smaller donations. So for next year I’ll hold off on at least one big donation, in case my boss will do this again.

Plans for 2015

As for my other charitable giving in 2015, I’ve decided to increase my budget again. At the same time, I also want to focus what I’m giving to. Because the overhead for processing a donation of any size is fixed, I think the larger the donation, the more of my money can go to actually doing good instead of administrative overhead.

Also, I want more of my money to go to places in the world that need it the most. Initially I had supported organizations that I had personally benefited from in the past. And while I feel it is important to give back to your community, this unfortunately also meant that I was supporting mostly work in places where people were pretty well off to begin with.

Hence the list of organizations I intend to support with larger donations (60% of my budget) in 2015 is more international:

  • Human Rights Watch: I’ve written about how I selected HRW last year. There’s also the excellent documentary E-Team, showing how they work in investigating human rights violations. It contains some horrific images, but nonetheless (or maybe because of this) made me feel like I was doing the right thing supporting their work.
  • Opportunity International: I talked about doing something with microfinance in 2011 and finally found something that seems worthwhile (see also efficacy of microfinance). The organization also has the DZI Spendensiegel mentioned above, so my donation would be eligible to by matched by my superiors.
  • Welthungerhilfe: Since I decided to no longer give to faith-based organizations, I’ve increased the amount I give to this organization as it does good in many of the same places but without the missionary angle.

In addition to these larger donations, I still want to give back to the community I grew up in. So 40% of my budget is allocated to support these local organizations:

  • Fifty Fifty: a newspaper written by and sold to benefit the homeless in Düsseldorf
  • Förderverein Löbbecke-Museum + Aquazoo: natural science museum in Düsseldorf
  • Förderverein Wildpark: wildlife park in Düsseldorf
  • Theater am Goethe: the drama group at my old school that is very close to my heart and that I continue to support both through helping out in person as well as financially
  • Theaterwoche Korbach: amateur drama group festival that I’ve had the pleasure to attend as  participant many times since 1999
  • Vereinigung ehemaliger Schüler des Rethel- und Goethe-Gymnasiums: alumni organization of my old school

Helicopter Flight over Hong Kong

When I was visiting New York City in 2008, I looked into helicopter tours of the city. At the time, though, they seemed too expensive, and I discarded the idea. I have regretted that decision ever since. Because seeing a city – but particularly one with so many high-rise buildings such as New York City or Hong Kong – from the air gives one a totally different perspective compared to just seeing it from ground-level.

So when going to Hong Kong (see pictures [1] and [2]), I decided that I was going to see it from above (almost) regardless the cost. From what I found, there aren’t many such tours in Hong Kong if you don’t intend on renting out an entire helicopter. The one I used was Heliservices Hong Kong. Trying to book online, they seem to require you to purchase at least four seats. I emailed them about that and they were super nice and gave me the remaining seat on one of their flights.

Below is my raw footage from that flight. It was shot handheld, so it’s a bit shaky, though the camera did a pretty good job of steadying it most of the time. There are couple of scenes where I tried to zoom in, but these are just too shaky to really see anything. Also there is some glare with the sun reflecting in the window. Apologies for that.