Software for everybody





Information is data that, provided it is

  • Given to the right people
  • Given at the right time
  • Given at the right location
  • And is correct
  • Adds value for that person.







The information gap


The current state




The cold, hard truth.








So, what's next?





Why job agencies and I do not get along.

Maybe the title is a bit misleading. But hey, at least I got your attention.

But before I dive into this, I want to set the boundaries for this post, I do not want to be misunderstood and be taken for a grumpy old guy who knows everything better.

When I talk about job agencies, I talk about the people who deal in connecting freelance or independent developers looking for a short term contract with potential new customers and taking a fee for that. Now, I don't see anything wrong with this model: I know a lot of people work this way and it generally works out well for them. But, as with everything in life, there is no general solution that applies to all.

I know a lot of developers. I also know a lot of good developers. And, I also know some extremely good developers. People who are at the top of their field. People who teach others to become better at their jobs, people who inspire people to try and go beyond what they thought they could do.

The problem with these people is that it is very hard to describe what they do. When I look at my own resume, I find it hard to label myself. Whenever I talk to people outside the industry I tell them I am in IT and that is usually enough to satisfy their curiosity. Of course, this is not enough if I am looking for a new contract. Saying "I work in IT" will probably not get me a job that makes the best use of my abilities and thus will make both me and the company miserable. And we don't want that to happen.

When people inside the business ask me what it is I do, I say something along the lines of "I am an experienced developer, who is capable to talk about deep technical topics with the developers but who also can talk to the business about their needs. A developer who is able to quickly oversee a problem and find a solution. Next to that I am able to make people enthusiastic about their work, troubleshoot process problems and implement a way of working that works for the team and also for the business. I am very good at making sure everybody in the team is on the same page when it comes to quality. I make sure the team puts their money where their mouths are: promises and commitment will not be taken lightly. And since I can talk to all people involved I can act as a bridge between all parties involved."

Well, that is what I want to say. Of course, I don't so I abbreviate it to "I'm a senior dev lead" which means exactly nothing.

And their lies the problem. If I am not able to briefly tell a colleague why he should consider recommending me to his bosses, how can a job agency even try to do that? The terms I wrote in the above statement are not things you will find in a job description. Sure, the term dev lead might pop up but that's not what I do. I do way more than that. Let's be honest here: most job agencies just scan jobs and resume's for keywords and try to match those. And even that is probably hard enough. You need someone who is good at developing software to do that job but those people are not working at those agencies: they are busy writing software.

I know a lot of my peers struggle with the same problem. They are unique and a lot of companies could benefit from them if only there was a way to get those two parties together. And agencies are not the answer. Maybe one day one agency will be able to fill that hole but I haven't found it yet.

What are your thoughts?

The most important factor to great software…

… is a great team.

teampuzzleI guess everybody knows this. After all: creating software is a craft and you need good people to do that. If you ever get the chance, I suggest you visit some companies that create software. Go to a company that makes something you like and go to a company that makes something you really do not like. Then pay attention to the atmosphere and the attitude of the developers. You’ll notice a pattern: great software comes from great teams.

Now, it is obvious that people who get to work on fantastic stuff are more enthusiastic about their work than people who do the same boring work every single day until they retire. But the opposite is quite true as well: if you have a bunch of passionate software developers the quality of the product will be better.

This is somewhat of a cliché. I guess almost everyone knows this. Still, a lot of companies do not seem to act upon this. Which results in buggy software, slipping deadlines and in the end loss of sales.

Putting the right team together is a tough job. You need to answer the following questions:

  • * What kind of expertise do I need
  • * How much of each expertise do I need
  • * How can I identify this in a candidate
  • * What kind of expertise will I need in the future
  • * How do I let the team members communicate

And this is just the questions that you need to answer in a green field situation, where you get to pick the team from the start. But what if you already have a team? Or a bunch of teams? How do I make sure they can work together in a great way that brings out the best in each and every one of them? That means you also have to answer the following questions:

  • * Can team member A work with team member B (and the number of connections here is exponential to the team size!)
  • * How to make sure people aren’t stuck to doing things they know
  • * What are the hidden social links between team members?

And so on… the list goes on and on. Of course, it’s the easiest to hire a new team from scratch and let them start together without any baggage, but in practice this hardly ever happens. You usually have a team or more than one team. People within those teams usually are set in their ways and will find it hard to change.

Change, of course, is one of the hardest things for people to handle. We don’t like it. We want to stick to what we know.wissel

  • We all know it’s necessary to change tracks every now and then. A change keeps us interested and motivated. We are triggered to learn new things and are invited to explore things we haven’t looked at before. But even though we know it’s necessary, most people still shy away from change. People are used to doing certain things and doing them in a certain way and they feel little or no reason to adapt to a changing environment. They even feel that way even though they know things aren’t going as smoothly as they can. I have encountered people who constantly complain about their work environment but when I offered them a chance to change it, they simply refused. I guess it’s a matter of “better they devil you know”.  They know what’s going on right now in their lives and they do not know what happens if they allow changes into their daily routines.

The biggest challenge a good team lead, or any manager in charge of a bunch of people, has is to make sure people are challenged to embrace change. To make sure the people in the organization feel safe enough to explore the possibilities.

In the coming months I will be exploring ways to do so and I will share my experiences on this topic. Trust me, it will be a fun ride…

Tags van Technorati: ,,

Visa and smartphones….

Recently I ran into some problems when I wanted to buy something online and tried to pay for it by using my Visa card. Every time I reached the checkout section I was presented with a screen asking me for a code generated by my eCode app. Which is weird, since I don't have that code. I don't have that app either. In the past I had to enter my CC details and a personal password and that was that, but all of a sudden I had to use an app?

I figured I did something wrong and paid by using another method. But this happened every time. So I started looking into this by checking the sites (no option 'use eCode app' to be found) and then into my personal profile on the Visa website (also no 'use eCode app' option there...) I did find a lot of information about the for mentioned app but of course: only available on iOs and Android. Not on Windows or Windows Phone.

So I mailed Visa. I wanted to know when they were going to release a WP version because otherwise my Visa card would be pretty useless to me. A couple of days later Visa responded. And the response blew my mind...

Basically they said: "We haven't planned a Windows Phone version of our app. But to accommodate you we have reset your profile so you can use the password again. However, in the near future this possibility will be removed altogether so we hope you have moved to iOs or Android by that time. "

What? So they changed my options to use a Smartphone all the time without asking me? And now they tell me I have to use iOs or Android if I want to keep using their card in the future? What is wrong here?

I am not starting a debate about Windows Phone versus the rest of the world. I am starting a discussion about the arrogance of a company that decides they can decide what people should use. What if you don't have a smartphone at all? Or if your battery runs out? You cannot use the Visa card anymore at that time? What if you happen to have a Blackberry, a Nokia or any other non-supported OS on your device?

Why does Visa think they can decide only people having an Android Smartphone or iPhone are entitled to do online shopping?

I guess my options are clear: cancel my Visa card and move on to a platform that cares about peoples choices, elderly people who don't want to use smartphones, people with limited budgets that cannot afford smartphones, people with limited vision (who cannot really use smartphones) and so on. A lot of people still think (iphone/android) smartphones are very common, but they are not.

Visa apparently doesn't care about the majority of people in the world…

Code from your fellow developers

It's almost a law: whenever you take over code from another developer, you start to moan and complain about the state of that code. It's awful, terrible, the worst piece of code you've ever seen. I am no exception. However, when I took over some code from a colleague who left the company I found this gem. I think I am right in complaining about this piece of code. (FYI this is almost an exact copy of what I found in the codebase, except for it being an console application and the classnames…)

namespace ConsoleApplication9


    class Program


        static void Main(string[] args)


            Customer customer = new Customer();

            customer.Id = 42;


            Order order = new Order();

            order.Id = 64;






    public class SaveableEntity


        public int Id { getset; }


        public void Save(SaveableEntity entity)


            entity.Id = Id;


            this.Id = entity.Id;



    public class Customer : SaveableEntity





    public class Order : SaveableEntity






Now, please tell me what you think of this…

Our own Daily WTF

If you're a developer, you've probably heard of the website the DailyWTF. If you haven't, head on over to and read. And laugh. I'll wait.



public static decimal ToDecimal(this string input)


    System.Globalization.CultureInfo cultureInfo = System.Globalization.CultureInfo.InstalledUICulture;

    var numberFormatInfo = (System.Globalization.NumberFormatInfo)cultureInfo.NumberFormat.Clone();

    int dotIndex = input.IndexOf(".");

    int commaIndex = input.IndexOf(",");

    if (dotIndex > commaIndex)

        numberFormatInfo.NumberDecimalSeparator = ".";

    else if (commaIndex > dotIndex)

        numberFormatInfo.NumberDecimalSeparator = ",";

    decimal result;


        return result;









Or am I too old fashioned?

Windows Phone appointment task

I am currently working on a new version of my AgeInDays app for Windows Phone. This app calculates how old you are in days (or weeks, depending on your preferences). The inspiration for this app came from my father, who once told me he proposed to my mother when she was 1000 weeks old. That left me wondering: how old in weeks or days am I? And being the geek I am, I wrote an app for it. If you have a Windows Phone, you can find it at

A new version of the app was published quite quickly, adding the possibility to mark a date in your agenda when you would have reached a certain age. Of course the logic behind this if extremely simple. Just take a DateTime, populate it with the given date from the DatePicker, then call AddDays(numDays) and voila, you have the date. Now all I had to do was implement a way to store this in the users calendar so he would get a reminder when that date occurred. Luckily, the Windows Phone SDK makes that extremely simple:

public void PublishTask(DateTime occuranceDate, string message)


var task = new SaveAppointmentTask()


StartTime = occuranceDate,

EndTime = occuranceDate,

Subject = message,

Location = string.Empty,

IsAllDayEvent = true,

Reminder = Reminder.None,

AppointmentStatus = AppointmentStatus.Free






And that's it. Whenever I call the PublishTask Method an appointment will be made and put in the calendar. Well, not exactly: a template will be made for that appointment and the user will see that template, giving him the option to either discard or save the reminder.

The user can also make changes before submitting this to the calendar: it would be useful to be able to change the text in the agenda and that's exactly what this allows you to do. Now, see at the bottom of the screen the option "Occurs". This tiny field is what this post is about. You cannot set it from the code.

I want to be able to have repeating items in my agenda. Say for instance you're counting down to a certain date, I want to be able to give you that option as well. However, I cannot. The field "occurs" is not part of the Task you create in code.

Of course, you could create a whole series of events yourself. Have the "Occurs" field in your own user interface and make all the appointments. But that's not the same. First, the system doesn't recognize them as part of a series. That means if you want to change the text later on on one of the occurrences it will not ask you if you want to open this one or the whole series. More important however, is that the user has to acknowledge each and every single occurrence and save that into the agenda.

Now, I understand why they implemented the system in such a way that the user has to approve an entry. You don't want apps to automatically fill your agenda with messages such as "Remember to pay for my app!". But why not include the "Occurs" option? The user can still opt out if they see this happening.

I hope an update will fix this soon. But for now: you just have to countdown to your birthday yourself. My app won't support this.

TwitterSearch in Windows Phone: How hard can it be?

Some of you probably already know this, other probably don't care. But I am a Bruce Springsteen fan. A huge fan. I adore the man's music, I know the tunes, I love the music and I try to spend as much time as possible by playing his songs on my guitar (and fail miserably but having lots of fun doing so). I visit as many shows as I can or as I can afford. So when Bruce decided to have another tour in the year of 2014 I got a little nervous. His shows usually sell out in a couple minutes which means that as soon as the shows are announced you have to be ready to buy tickets. That means that you have to know what's going on in Springsteen-land and for me, that meant I had to write an application for my phone that tells me exactly these sort of thing. It didn't seem that hard to do: just write an app that reads out some RSS feeds and show them on the screen.

But then I thought a little bit harder about it and thought that maybe other people might be interested in this as well. Of course, that meant that the competition for those tickets would be a bit tougher but what the heck, as Bruce himself said, nobody wins as everybody wins.

Now, writing a simple app just for myself is one thing, writing an app that gets downloaded by people all over the world is something else. If it were only for myself I could have finished the thing in a couple of hours, but publishing an app for real means I had to seriously think about it and make sure it would be stable, nice-looking and useful. Which means I had to add features I didn't need just for keeping up with the latest show announcements.

The idea behind writing apps is that you ship early and ship often, so the first version was out of the doors pretty quickly. It did little more than just displaying a list of the last 40 news items on the web that were about Springsteen. The second version was a bit more complicated: it had a live tile telling you exactly how many new news items were available for you to read since the last time you started the application. This uses Windows Azure Mobile Services as the backend so it gave me the opportunity to learn how to use that as well. After all: I would be using this app to learn new techniques as well as giving me the information I wanted.

When that version was finished and published I started thinking about new features. One of the features I thought would be nice to have is an overview of Tweets that contain the word "Springsteen". After all: when there is news that hasn't been really published yet, people will talk about it on Twitter. So I had to add another news source (on another screen) that contains the results of a Twitter search.

Since Twitter apps are the new "Hello World" apps I figured it couldn't be hard to build. And if I were to run into problems I would find documentation and samples all over the web, showing me the way. Boy, was I wrong.

Of course, there are a lot of sites and articles that tell you how to do this. But these articles have two problems:

  1. They are written for Windows Phone 7. Things have changed since then.
  2. They are written for Twitter API v1. Things have changed since then.

In fact, things have changed so much I couldn't use the information out there at all. So I had to figure it out all myself. Well, I did just that and I am presenting you with the way to do this right here so you don't have to worry about it.

Twitter side of things

First, the biggest change on the Twitter side of things is that in the old days you could go out to and get the results you wanted. This doesn't work anymore. They want you to authorize your app first. So you have to log in.

Now, there are two ways you can do this. First you can ask your user to log in and then search on his behalf. This is not really acceptable in my case since all I want to do is show the search results. I don't need the users credentials: I won't be posting or re-tweeting anything. So I have to use the second option which is let the application log in for the user. This means the app has read-only access to the Twitter API but that's just fine in this use case.

To do this, you have to register your app with Twitter. Go to, sign in and reserve your app name. If you do that, you get some keys that you're going to need. For my app BruceNews it looks like this:

I have edited out the keys but it's just a bunch of characters you get when you let your cat walk on your keyboard for a while. These keys, the API key and API secret are what you need to authenticate your requests. The reason for this feature is that while the usage of Twitter is free, they don't want you to overdo things. There is a limit to the number of requests you can fire against their servers. At the time of writing, this is 450 calls per 15 minutes for the search, per app instance. So that's once every two seconds which is reasonable enough for our app. I don't expect users to refresh the search more than that for fifteen minutes at the time….

When you register your app they also want you to give a call back URL that gets called when users use your app to authenticate themselves. However, you don't need that so you can fill in whatever you want.

Now, for an app to do a Twitter search, the flow is as follows. First, you authenticate your app against Twitter. They will give back a token key. This token key is then passed on to Twitter again whenever you do an API call. Remember: this authentication scheme only allows you to do read-only calls such as search!

Windows Phone 8 side of things

It's time to start up Visual Studio and create a new Windows Phone 8 app. I have made a very simple test application, so all I needed was the standard Blank App template. I won't be using MVVM here since I am only showing you how to use the Twitter Search. Of course, if you do want to create a real app I strongly, really, really strongly urge you to use an MVVM framework. For now, the MVVMLight stuff by Laurent Bugnion is your weapon of choice for both Windows Phone 8 as Windows 8 Store Apps. But I digress.

My main screen looks pretty simple. All it does is show a Listbox. In that Listbox I have added a datatemplate for the itemtemplate to format the tweets. Twitter has some guidelines to how those things should look like. They really want all tweets to look the same:

However, there is a nice little loophole: the developer side says: "Applications that cannot implement these guidelines due to the technical limitations of their platform must make a best effort to satisfy as many rules as possible" Since we want our tweets to adhere to the Windows Phone look and feel, we can more or less deviate from this standard. Still, it's a good idea to implement as much of this as possible since it makes it for users easy to recognize as being a tweet. I use the avatar, screen name, handle, text and postdate in my example.

So, how do we get the data from the Twitter service? Well, you need to add a Nuget package first. All data from Twitter is in JSON format so you need a way to handle that. There is a more or less standard package which helps for that: NewtonSoft You can install through the "Manage NuGet Pacakges…" context menu in the solution explorer or through the Package Manager Console and type in "Install-Package Newtonsoft.Json". Another package you will need is the Microsoft HTTP Client Libraries (Install-Package Microsoft.Net.Http). Now, you're good to go.

I have defined two static members in my codefile, named TwitterConsumerKey and TwitterConsumerSecret, which are the two keys we got from Twitter. Next to that, I have added a Loaded event handler on my main screen that does two things: Load the tweets and assign the resulting list to the listbox on my main screen.

Now, before we go to the nitty-gritty details of how to get the data out of the Twitter server, we need to have classes that hold the tweets. Now, don't you think a tweet is just a simple set of text lines. The structure you get back for a single tweet is rather impressive:

Don't try to read it. It's hard to read since it's pretty small in this image. But it does give you an idea of the complexity. Especially the user is quite elaborate.

On you can get the resulting JSON and there are tools out there that can help you transform this JSON result into C# classes. You need to do that so you can actually use them in your Phone application.

I have added these classes to my project and now I am ready to begin reading the data. Remember, there are two steps to take: first authenticate, then get the results.

First, let's do the authentication.

Authenticate against the Twitter REST API.

If you look at the steps on the Twitter site, it seems pretty straightforward. However, to translate this into valid code for a Windows Phone 8 app you need to go through some hoops. Here it is:

private async Task<string> GetAuthenticationToken()


var client = new HttpClient();

var uri = new Uri("");


var encodedConsumerKey = HttpUtility.UrlEncode(TwitterConsumerKey);

var encodedConsumerSecret = HttpUtility.UrlEncode(TwitterConsumerSecret);

var combinedKeys = String.Format("{0}:{1}", encodedConsumerKey, encodedConsumerSecret);


var utfBytes = System.Text.Encoding.UTF8.GetBytes(combinedKeys);

var encodedString = Convert.ToBase64String(utfBytes);

client.DefaultRequestHeaders.Add("Authorization", string.Format("Basic {0}", encodedString));


var data = new List<KeyValuePair<string, string>>


new KeyValuePair<string, string>("grant_type",



var postData = new FormUrlEncodedContent(data);


var response = await client.PostAsync(uri, postData);

if(response.StatusCode != HttpStatusCode.OK)

throw new Exception("Did not work!");


var content= await response.Content.ReadAsStringAsync();

var authenticationResponse = JsonConvert.DeserializeObject<AuthenticationResponse>(content);

if(authenticationResponse.TokenType != "bearer")

throw new Exception("wrong result type");


return authenticationResponse.AccessToken;




Let me walk you through the code. First of all, you need to mark this method as async. After all, it might take more than 50 milliseconds to authenticate and the guidelines say you need to make it asynchronous if it takes that long. So mark the method with async and let it return a Task<string>. The string in this case is the authentication token I was talking about earlier on.

Now, create an instance of the HttpClient. This comes from the HttpClient package we installed earlier on. The uri I give is the one you need for authenticating, so that's pretty straightforward as well. Now, the next few lines prepare the two secret keys in a way Twitter expects them. First I UrlEncode them. Twitter suggests I do this. In reality this doesn't do anything since the keys do not contain any characters that might need escaping, but the Twitter documentation says this might change. So I decided to do this. Better safe than sorry, right? After this encoding I combine the two strings with a colon (:) in between. I get one string as a result. This string needs to be passed on to Twitter but it needs to be Base64 encoded. Since you can't directly do that in Windows Phone, I first need to translate the string into an array of bytes which then in turn get turned into a Base64 string.

Now, the tricky part. The API wants this key to be in the headers of the request. So I add to the DefaultRequestHeaders a value of this string with the key being "Authorization". It also wants some extra data in the form of the key-value pair "grant-type" / "client_credentials" so I make a list of this one key-value pair, give it to a new FormUrlEncodedContent which I pass on to the actual request I make: client.PostAsync.

Once you do that the Twitter authentication mechanism starts to work and will get back to your. It will do that with either a response 200 (which means it all went ok) or another one saying something went wrong and that you probably are the one to blame. And they usually are right, darn them…

Let's assume it all went ok and now it's time to look at what we got back. The response object contains a Content stream that we can read out with ReadAsStringAsync(). This content can be converted to an object of type AuthenticationResponse. This class I created myself and looks like this:

class AuthenticationResponse



public string TokenType { get; set; }


public string AccessToken { get; set; }



It's just a placeholder for two fields, namely token_type and access_token. I have decorated the fields with the correct Json names so I can use the right format for the property names and thus prevent my tooling for complaining about my crappy naming convention. Now that I think about it, I did the same for the Twitter classes….

If all went well we now have an instance of the AuthenticationResponse. This can contain several things, but if things worked as they should you now should have an TokenType (or token_type if you use the original name) of "bearer". The value belonging to this field, stored in AccessToken (or access_token) is what you need to pass on to the next call. If this is not "bearer" you're in trouble and you did something wrong…

Let's do some searching!

Now that we have this authentication token we can do the actual search. If you understood the last part, you will find the search is pretty simple. It does things more or less the same way. Let me show you my code. First I have created a wrapper object which will contain all search results:

internal class TwitterSearchResults



public List<RootObject> Statuses { get; set; }



This is what we will get back from the search. It's just an object with a list of RootObject instances. This RootObject you can find in the diagram above (if you look really hard) but that contains information about the user, the tweet itself, the time and date and so on.

The search looks like this:

private async Task<List<RootObject>> GetTwitterResults()


string token = await GetAuthenticationToken();

var client = new HttpClient();

var uri = new Uri("");

client.DefaultRequestHeaders.Add("Authorization", string.Format("Bearer {0}", token));


HttpResponseMessage response = await client.GetAsync(uri);

Task<string> content = response.Content.ReadAsStringAsync();

var searchResult = JsonConvert.DeserializeObject<TwitterSearchResults>(content.Result);


return searchResult.Statuses;



Again, we need to mark this method with async. The result is a Task<List<RootObject>> so in effect we get the list with tweets we can databind against. The first thing I do is call our previously discussed GetAuthenticationToken. After all, each call to the API needs this token otherwise it just will not work.

The moment we have this token we create a new instance of the HttpClient. Then we build up the query we want to perform. I have hardcoded the search string "#springsteen" (the hashtag is UrlEncoded otherwise it won't work) and instead of the default 15 results I want to get back the last 30 results. There are about 30 options you can specify here. You can limit the results to a certain date, or a certain geographical location and so on but I would suggest you keep things simple at first. First make it work, then make it pretty, remember?

Just like we did in the authentication code we add a new header, but this time we give it the key value pair "Authentication" – "Bearer xxxx" where xxxx stands for the token we just got back.

Now all we have to do is call client.GetAsync(uri) (we did a Post in the authentication, this requires a Get) and again we get back a response. You really should check for the code again, it should be 200, but for brevity I decided to "forget" about that here. I assume it all just works…

The resulting string in the Content is deserialized to a TwitterSearchResults object and returned to the calling Loaded event handler. This then puts that data into the Itemsource for the listbox and voila, there it is! The tweets will show up on the screen.


It's really not hard to get Twitter search results in your Windows Phone 8 app, but the lack of documentation and samples make it quite a challenge to find out how to do this exactly. But once you find out how to do this, you can enrich your app with real time results matching your audience. And that makes an app a lot more useful for a lot of people. At least, I know now that there are no plans for an European tour so I don't have to worry about getting tickets… yet.. wait, let me check again…




Windows Phone and IconicTile updates

The project I work on right now is a fun one. It has all sorts of technology mixed. The base application is a Windows 8.1 with a Windows Azure Mobile Services backend. This means I get to do C#, XAML, NodeJs, Javascript and a lot more weird technology. My main projects are hosted in Visual Studio Online (TFS in the cloud) while my Azure scripts are stored in a Azure GIT repository. I see a lot of technology in a normal day.

However, what is really frustrating is the lack of documentation on the Windows Azure Mobile Client side of things. I spend most of my time in Google trying to find simple answers to simple questions, such as: where can I find a specific module? Or: how do use that module?

One of the apps is running on Windows Phone 8. I decided to give it an Iconic tile which is basically a static tile with a title and an icon. Nothing fancy there. But I needed to send updates from the backend about the number of messages waiting for the user to be read. This is one of the big things in Windows Phone of course: live tiles with instant information. So I wanted to send out push messages from the Azure backend to the phone.

There are tons of examples out there on how to do this. And all of these examples are almost exactly the same. And none of them work…

After a full day of exploring and Googling (I have definitely given up on Bing: it doesn't find anything when it comes to this sort of thing), I finally found, somewhere deep in the bowels of the internet, the cause and the solution.

The thing is: it all works just great as long as you don't use IconicTiles. FlipTiles and Cycle tiles all work great but IconicTile isn't supported in the backend. And there is no information about this. I repeat: the documentation says nothing about this. You can use the tiles in your app, but you cannot use them in the backend.

Luckily, Jeff Wilcox ran into the same problem and solved it by creating his own push package you can use.

The usage is pretty simple: you import the module mpns (found here) and use that instead of the normal push.mpns package. This one has the long sought after sendIconicTile method:

var payload = {
count: updateCount

handle, payload, function () {
// nothing

This works great. I have updates now in my app. But… the big questions are

  1. Why doesn't Microsoft support this out of the box? The do have the sendTile and sendToast methods, why not this one?
  2. Why isn't this documented? If you decide not to support parts of your own technology, well, I guess that's your choice. But please let me know, instead of hiding it.

I love the platforms WP8, Win8 and Azure Mobile Services but this part has taken a lot of energy and a lot of frustration. Please people from Microsoft: do something about either points…

Right. Back to coding!

Dutch for once: op zoek naar een nieuwe uitdaging!

I apologize to my non-dutch speaking readers: this post is about me looking for a new job and since I am based in the Netherlands I will do this in Dutch… Next time I will be technical (and thus in English) again!

Het leuke van interim zijn is dat een klus een keer afloopt. Ik heb heel bewust gekozen voor het leven als freelancer: ik wil graag heel veel verschillende mensen en organisaties leren kennen. Dit werk is daar bij uitstek geschikt voor! Immers: bij iedere klus breng ik niet alleen nieuwe ideeën en kennis maar ik leer zelf ook iedere keer ontzettend veel. Die kennis kan ik dan weer gebruiken bij een vervolgklus en op die manier verspreid ik die kennis onder de bedrijven in Nederland. En er is niets leukers dan zien dat wat ik meebreng een organisatie naar een ander niveau brengt!

Iedere keer een ander bedrijf zoeken houdt in dat ik iedere keer weg moet gaan bij een organisatie. Het lastige daarvan is het juiste moment te vinden. Van buitenaf gezien is dat lastig in te schatten: wanneer kan ik niets vernieuwends meer bijdragen en is het tijd om verder te gaan? Wanneer is het tijd om te zeggen dat de organisatie alles weet wat ik ze kan bijbrengen?

In mijn huidige klus is dat moment nu aangebroken. In de afgelopen elf maanden heb ik dit bedrijf zien veranderen van een kleine maar enthousiaste groep ontwikkelaars naar een professionele organisatie met ruim twee keer zo veel ontwikkelaars. Dat veranderingsproces is erg leerzaam geweest en ik ben dan ook erg blij dat ik die verandering heb kunnen en mogen begeleiden. Van drie teams met ieder vijf of zes ontwikkelaars naar zes teams met zeven tot acht ontwikkelaars per team groeien betekent dat je je ontwikkelproces heel anders moet insteken. Ook houdt dat in dat je je teams anders moet indelen, dat de organisatie zelf anders gemodelleerd moet worden en dat mensen anders met elkaar om moeten gaan. Om dat voor elkaar te krijgen is er door iedereen heel hard gewerkt, is er een aantal fouten gemaakt, is heel veel van die fouten geleerd en is uiteindelijk een vrijwel nieuw bedrijf ontstaan.

Het is tijd om dit bedrijf te verlaten. Ik ben benieuwd waar ik hierna terecht kom: ik ben aan het rondkijken naar mogelijkheden. Ik weet wèl: het bedrijf waar ik naar op zoek ben, is een bedrijf dat openstaat voor veranderingen. Veranderingen, maar dan wel met het oog voor het individu; mensen staan immers centraal in de software ontwikkeling!

Ik heb er in ieder geval weer zin in!