Rss Feed
Tweeter button
Facebook button
Technorati button
Reddit button
Myspace button
Linkedin button
Webonews button
Delicious button
Digg button
Flickr button
Stumbleupon button
Newsvine button

Visual Studio 2014 CTP

By , August 12, 2014 3:54 pm

A few months ago Microsoft released the Community Technology Preview of Visual Studio 2014, also known as Visual Studio 2014 CTP.


Because this is a community technology preview it only runs on Windows 8. Microsoft recommend that you do not install this on any machine that is important to you. This caused me some frustration. I had any number of Windows 7 machines I could have put this on, but Windows 8 machines – the ones we have are being used for important tasks. This meant creating a VM I could use. I spent probably the best part of 2 weeks futzing around before I finally got a Windows 8 VM working that would succeed in installing Visual Studio 2014 CTP. I tried creating virtual machines from other virtual machines, creating virtual machines from existing Windows 8 machines. All failed.

The only thing that succeeded was with a brand new Windows 8 install from DVD followed by installing Visual Studio 2014 CTP. And even then for the install to succeed it had to be a web install. The download and .iso, burn it and install from that always failed (just like for 2012 and 2013).

As with 2012 and 2013 before the install process is horrible and un-informative. Gone are the days of an install dialog that tells you what it’s doing and that has a useful progress bar. Now we have these “I’m doing something bars” which tell you nothing about how far through you are and only serve to tell you that the thread that is running the animation hasn’t crashed. I hate these things. I really do. It’s an awful user experience.

The install dialog does tell you what it’s doing at each stage – but nothing while it’s doing it, so you have no idea it’s progressing or has hung. I’ve had so many failures installing 2012, 2013 and 2014 that I don’t trust the installer. And trying to uninstall any of them, that always fails. I know 2014 CTP is a preview but 2012 and 2013, they are released software.

User experience

This is the next version of Visual Studio, following on from 2012 and 2013 and continuing with the same theme, that very toned down, hard to use, monotone look, although you can choose the “blue” theme. Why they do this I have no idea. Apple excel at UX and at one time it appeared Microsoft did, but now it’s make everything as hard to use as possible. Colours on icons add information, so don’t take that away! (*) They seem to have got the message on mixed case text though. ALL CAPS is gone.

* I gave up with my Windows Phone because of the icons, it was a great phone except for that crucial bit of UX – I was continually guessing at what the icons meant, I could never be sure – no ease of use.

Version Number

The version number for Visual Studio 2014 CTP is 14.0. This is a change to the natural sequence which would have been 13.0.

This means the C Runtime and MFC dlls end with 140.dll, 140u.dll, 140ud.dll, etc.

What’s new? C Runtime DLL

If you’re a C/C++ developer the big news is that msvcrNNN.dll is gone. The old naming convention for the Microsoft C runtime has been done away with.

The new C runtime DLL is appcrt140.dll (and appcrt140d.dll for debug builds).

Other DLLs that ship with it are desktopcrt140.dll, msvcp140.dll, vccorlib140.dll and vcruntime140.dll

Full list of candidate redist DLLs:

  • appcrt140.dll
  • desktopcrt140.dll
  • msvcp140.dll
  • vccrlib140.dll
  • vcruntime140.dll
  • vcamp140.dll
  • mfc140u.dll
  • mfcm140u.dll
  • mfc140chs.dll
  • mfc140cht.dll
  • mfc140deu.dll
  • mfc140esn.dll
  • mfc140fra.dll
  • mfc140ita.dll
  • mfc140jpn.dll
  • mfc140kor.dll
  • mfc140rus.dll
  • vcomp140.dll

What’s new? DTE

If part of your work involves getting the Visual Studio IDE to do anything you want, such as opening source files for editing then you’ll be working with the Visual Studio DTE. The new DTE number skips a version and jumps from 12 to 14. So you’ll want:


Debug memory guard structure, x86

The debug implementation of the C runtime heap uses a linked list with helpful debug information and two guard regions before the debug header and after the allocated data. The helpful debug information sits in the debug header with the linked list pointers. Beginning with the introduction of the 64 bit support this header was modified to swap two data members (size and blockUse) around to improve the memory usage for 64 bit systems (alignment on 8 byte boundaries). This was handled via conditional compilation so that the data members remained in the original order for use on 32 bit systems.

That conditional compilation element has gone! This now means code that inspects the debug heap for 32 bit systems needs to know if it’s working with a heap layout that pre dates Visual Studio 2014 CTP or is from Visual Studio 2014 CTP. Failure to understand this heap layout change will likely result in code that inspects the heap and reports incorrect block sizes and/or corrupt data blocks when the data blocks are not corrupt.

This is a serious change. It’s also an obvious step to take. Visual Studio 2014 CTP cannot read debug symbols created with Visual Studio 6. This layout change also puts paid to debug heap support from that era. Along with dropping (or trying to drop!) support for Windows XP this is another sign that although many people are still using older operating systems (*) (and compilers) Microsoft is sending a sign that they really do want to drop the older way of doing things.

(*) Every now and then we field support questions asking if we still support Windows 2000 (yes), Windows XP Embedded (yes) or Windows CE (no).

Low level detail

The compiler continues to create ever more optimized code. As with some of the Windows 7 service pack releases we’ve noticed some optimized code sequences that do things differently to before. Visual Studio 2014 CTP doesn’t ship with source or symbols to APPCRT140.DLL (although you can get the latter from Microsoft’s symbol servers) so it’s hard to tell what’s going on inside the new C Runtime. But it’s clear it’s a new architecture and way of doing things. Many functions that once would have been called by linking to them and the call being redirected through the Import Address Table are now passed to a lookup helper function that does some sort of encryption, calls GetProcAddress, does more encryption and then passes the function back to be called. Why do I mention encryption? Because the function names hint at that. It’s quite a change from how things used to be done. Why it’s being done I can’t say, we don’t have the source to examine and I haven’t tried to reverse engineer the functions. These are just comments about things I noticed while I was investigating some unexpected behaviour as we were adding support for Visual Studio 2014 CTP to our C++ tools.

Updated – A day later!

Just after we published this article James McNellis from the Microsoft Visual C++ Team Blog contacted us to let us know a few things.

  • Apparently source code for the C Runtime is available but the reason you don’t see it in the debugger is because the symbols files on Microsoft’s symbol servers have been stripped – they only have function names but not filenames and no line numbers.
  • A solution to this is to build your C/C++ application linked statically to the C Runtime. This gives you symbols to examine the C Runtime. We didn’t notice this because the only occasions when we ran into any problems with our ports was working with code dynamically linked to the C Runtime.
  • Two articles detailing why the changes have been made have been posted to the Visual C++ Team Blog. These articles are worth a read and show that their thinking is looking forward many years into the future, mainly with an eye on improving things for developers and security issues. These articles are:

When you understand the refactoring and the desire for a wider platform support you can understand the reason for looking up functions by GetProcAddress() and calling the result rather than linking to them. Thanks to James for reaching out and letting us know their thinking.

From the above articles the standout thing for me is that most people will (for the short term at least) want to compile with _CRT_STDIO_LEGACY_WIDE_SPECIFIERS defined so that <tchar.h> continues to provide the string functions your code expects and not the C99 standard implemented in Visual Studio 2014.


Download problems, an apology

By , June 5, 2014 11:23 am

The last two software releases have not been as smooth as usual. To put it mildly there have been problems.

I’d like to apologise for the inconvenience we may have caused you. I’d also like to explain why these problems happened and what we are doing to put it right.

With the previous software release we supplied the correct binaries but the licence information was incorrect. With the current release the problem reversed itself – wrong binaries, correct licence information. Neither helps. Both problems were caused by different issues.

Problem 1 – case (in)sensitivity

We develop on Microsoft Windows, which has a case-insensitive filesystem. Our webserver runs Linux, which has a case-sensitive filesystem. This can cause problems. Especially when a file with incorrect case is uploaded to the webserver by mistake. The result is two files with similar names rather than one file. Consider a file memoryValidator.inf. If we upload memoryvalidator.inf to the server it won’t replace memoryValidator.inf (as it would on a Windows machine) but will co-exist in the same directory as memoryValidator.inf. When this happens out of date version information (which is stored in memoryValidator.inf) is read because the new version information is in memoryvalidator.inf (incorrect casing).

The above has caused problems with incorrect (out of date) version information being supplied alongside correct binaries.

Problem 2 – a tale of two installers

Our x64/x86 installer actually installs two installers – one for the 32 bit binary and one for the 64 bit binary. As such there is an order dependency – build 32 bit installer, build 64 bit installer, build the x64/x86 installer that installs the 32 bit and 64 bit installers. You must build the x64/x86 installer last. If this happens out of order for any reason you can have problems as the 32 bit installer or 64 bit installer may be out of date.

Why have these problems only surfaced just now?

2014 has been a rather unusual year for us. We’ve had numerous hardware failures, lost two months of email due to a disk encryption issue and had these software release issues. The hardware failures meant we had to move the email and software release systems over to new machines. The software release system has been moved twice. Prior to moving the software release system we’d ironed out all the problems by carefully arranging everything. The problem with that is that it requires human memory to adjust the special case issues every time you change things. We’ve now changed our release procedure to include additional software rule-based checks to ensure the process of doing a release is less error prone.


If you have been affected by this problem please login to your account and download the new binary that is available. Please ensure your browser doesn’t cache the file download and provide you with the previous version of the binary.

We’ve updated our software release controller software to include additional rules to check for incorrect build order. The webserver will be getting additional rules for case sensitive file name checking.


I sincerely hope the problems of the last two weeks are the last we’ll have to do with software releases. They cause inconvenience for you and cause me a lot of stress. I look forward to a return to our usual release process.


An End to Unwanted UAC prompts

By , May 25, 2014 7:29 am

We have just updated all of our software tools so that they no longer require administrator privileges to run. No more unwanted User Account Control prompts!

I’m going to explain why we used to require administrator privileges, why we’ve removed that requirement and what impacts that has for you the user of the software.

The past: Our software tools up until 24 May 2014


If you’ve ever used our tools on Windows Vista, Windows 7 or Windows 8 you’ll know that our tools required Administrator privileges to run.

Because of this each time you start the software you are faced with a User Account Control dialog. There is a pause, the screen darkens and then the User Account Control dialog is displayed. You can’t do anything other than interact with this dialog. It’s a “Yes I want to run this. No I don’t want to run this.” deal. But of course you want to run this software, you just started it. Hal really should open the pod bay doors.

This gets even more frustrating if you’ve used our command line interface to automate your testing or if you need the software under test to run without administrator privileges.


The ideal scenario would be for the software to run without requiring administrator privileges, just like most applications on your computer. This would improve the usability of the software, make automated testing smoother and just be better all around.

Reasons for change

When our tools require administrator rights to run there are multiple consequences of that requirement:


  1. A User Account Control dialog is displayed, interrupting the user’s flow.
  2. Automated tests require someone present to approve each tests’s run because a User Account Control dialog is displayed. This either partially or completely defeats the purpose of automating the tests.
  3. The software under test is now run with Administrator privileges. For most applications that isn’t an issue but for some applications this is not the correct privilege level for that application to run at.

The first issue isn’t ideal and adds frustration to the user’s life.

The second issue is horrible.

The third issue is a deal breaker for the few people that must test their application’s at a specific privilege level.

As you can see we had to change this state of affairs.

Working without Administrator Privileges

When running the software without administrator privileges the only thing you’ll notice is no administrator privileges. You can launch and monitor applications without administrator privileges. You can also monitor services that are linked to the NT Service API associated with the tool without administrator privileges. Only the Inject into Application and Wait For Application functionality (C++ tools only) prompt you for administrator privileges. Other than that the software works the same as usual.


If you run the software without administrator privileges the software will communicate with SVLAdminServiceX86 or SVLAdminServiceX64 as appropriate. The service will do the work required.

The C++ tools now work with desktop application, services running on LocalSystem account and services running on LocalService account.


You can still right click the software and run the software with administrator privileges. If you choose this the software will behave exactly as it did in the previous release, it will do all the actions itself and not ask the SVL Admin Service to do the work.

If you want to Inject into a running process or Wait for an application to start we can still do that with the C++ tools but you will need to run with administrator privileges to do that. This is principally because CreateRemoteThread from a service doesn’t work when the target application is not running in the same Windows session. This is a Windows security improvement. Until we can provide a workaround for this these two activities require administrator privileges. The software will automatically prompt you for this process elevation.

Similarly if you launch an application using CreateProcess (the recommended method) you don’t need administrator privileges. But if you choose any of the other options you will be prompted for administrator privileges.

Why did we require administrator privileges?

Our software tools are dynamic analysis tools that analyse the behaviour of software at runtime. As such our tools use a variety of techniques to invade the user space of the software under test and to communicate the collected data back to the user interface. If the software is a desktop application then different security environments are in force compared to if the software is a service. When dealing with a service such as Internet Information Server then you are dealing with a very locked down process. Some of these processes are very hard to interact with. You may be able to inject into the process but then not communicate with the user interface.

To cope with this early versions of our software simply used global shared memory (prefix the shared memory name with \Global) and ran with appropriate debug security privileges. This worked really well. Then came Vista with the new security regime. I’m sorry to say that our initial response was lazy. We simply put admin privileges on everything as a temporary workaround until we could get around to fixing things so they’d work without admin privileges.

So what happened? We got side tracked. We spent a lot of time focussing on other things, supporting different operating systems, different Visual Studio, porting the software to 64 bit, floating licences, improving the UX of tools like C++ Coverage Validator. And because we were at the time developing on Windows XP x64 we didn’t feel the pain of using the new security regime all the time. We’d use Windows 7 for our email machines, personal laptops and for testing but not for daily development.

Why were we using Windows XP x64? The answer is simple. The compressed start menu on Windows 7 is harder to use than the flyout menu on Windows XP. The search functionality on Windows XP is so much easier to use than that built into Windows 7, especially if you are searching for words inside a document (think Visual Studio project, manifest, source code, etc). Yes I know Windows 7 search has great power built into it, but it’s slow, hard to use as it’s crammed into one tiny window and in my experience often doesn’t work. Whereas the Windows XP search experience is simple, easy, reliable and fast (three fields, file name, content to search for, where to search). Sadly Microsoft has made search on Windows 8 even worse (right click on a search result and if you open the location you lose the search results – how is that useful?). And of course the start menu has gone.

Anyway, as the end date for Windows XP support, April 8th, loomed we started getting queries about our software that we’d never fielded before. Most were related to the User Account Control issues already described. People who had been using Windows XP and Windows XP x64 for development were abandoning ship, moving to Windows 7 or Windows 8. By the time we got to the start of March I knew we had to drop everything we were doing, annoy some of our existing customers by putting certain work on hold, and make our software run without administrator privileges. No User Account Dialogs!

Usually we issue one or two software releases per week. Or maybe one every two weeks. Our last software release was March 19th, over 10 weeks ago. This has been the longest break between software releases we’ve ever had. The scope of the work has been huge. We’ve had to write a service that the software talks to to do anything that would normally require administrator privileges. Then we had to identify every area that was impacted by the change in privilege levels. This meant some areas of the software had to be completely re-written. For example our Registry handling software now also has to be able to write to files and memory so that we can pass that data to the service so that the service can populate certains parts of the Registry on behalf of the software tool. Another area that has changed is shared memory. You can no longer just prefix everything with \Global and expect it to work. As such shared memory handling has had to change. This is particularly important if you are working with services. Copying files to certain locations is no longer possible. Writing files to certain locations is no longer possible. All these things we’ve had to address. We’ve had to update the installers to correctly install the service (and uninstall it first if we’re replacing it with an updated version). We’ve had to test on Windows XP, Windows x64 (to ensure our XP customers still get the experience they expect) and on Windows 7 and Windows 7 x64, Windows 8 to ensure everything works correctly. The different security handling for services between XP and Windows 7/8 causes some interesting problems to be worked around. We’ve tested everything to bits.

And along the way we’ve re-factored some of our software and also exposed and fixed some low level bugs in our hooking software (some of which are a side effect of recent optimisations in the way Microsoft build their operating system DLLs). Error reporting on the Diagnostic tab has improved.

Weren’t we dog-fooding?

You might think we weren’t dog-fooding. That is, using our own software to test our software. Yes, we do use our own tools.

But we were not using our tools in an environment that would cause these issues to be apparent to us. We had chosen to eat at our favourite restaurant rather than at the best restaurant in town. Having just spent two weeks on a cruise ship this analogy is sound, we quickly concluded that we preferred the Bistro over the fancy restaurant.

In fact we had deliberately chosen Windows XP x64 because we found it easier to use for the reasons already stated. In hindsight, although this was a good choice for ease of development it was a poor choice from the point of view of experiencing what the bleeding edge of our customers use.

Our new development environment

Our current development environment is Windows 7 but we’ll be moving to Windows 8 as soon as the new machines arrive. For Windows 8 we’ll be adding the Stardock Start8 Start menu. We’ve also written some search tools that although crude, allow us to search files more easily than using Windows 8 built in search functionality. We’re writing more tools to make our development work easier, even as Microsoft’s own UX efforts make what we want to do harder.


The move from administrator privileges required has been a time consuming, challenging experience. We’ve learned a lot along the way and had to change how our software works. However the result is that you, our customers, the users of our software now have an easier time using the software. I hope you agree the effort was worth it.


When things go wrong

By , January 16, 2014 1:10 pm

Sometimes you do things with the best of intentions and it all goes wrong. This week has been like that.


It all started out with the simple idea that we’d like to try to create a bit more business by contacting past customers that didn’t renew their software maintenance and see if they wanted to renew.

We’d had some feedback from some customers that they had missed the renewal notices that are included with their software updates and that they would appreciate a separate email from us to inform them. We took this feedback and created some appropriate emails that are sent 90, 60, 30 days in advance of the renewal date. We also send some email after the renewal date for a short period.

So far so good. Nothing wrong with keeping existing customers in the loop.


The problem occurred when we thought about the customers that had not renewed. Was it an error, an oversight or deliberate? Well of course we don’t know. I think the initial idea may have been to contact customers whose maintenance had expired just over 1 year ago. That’s borderline OK. CRM solutions such Hubspot, Act-On etc all recommend 1 year as the cut off threshold for contacting customers. Anyone over a year, you don’t contact. The reason we were going just over a year was to do with when we’d first introduced paid software maintenance. It fell just over a year.

We also thought that contacting these customers would be a good opportunity to get some feedback about why they hadn’t renewed. Where we doing something wrong? Or had their career changed? etc.

I produced lists of customers, organised by software product whose maintenance expired. The lists included their name, email address and maintenance expiry date. The intention was that customers would receive a personalised email that identified the product they used and did they know their maintenance had expired?

What actually happened

Normally we email customers evaluating our software in HTML email via our Hubspot account.

Customers that have purchased our software received email in plain text or very simply HTML email.

But customers receiving the maintenance renewal email received a HTML email in a different format to our normal Hubspot format, not sent via our Hubspot account, sent from an email account our customers have never heard of, with an incorrect email address in the body of the email. The emails were not personalised, not were they specific to the software tool the customer had purchased. In addition some of the email addresses in the list shouldn’t have been in the list. As a final nail in the coffin of getting this wrong, the emails were sent to customers well outside of the time boundaries initially specified.

I don’t think we could get it much more wrong if we tried. Well, I suppose we could have included some Not Safe For Work or some malware, but short of doing that we got this as wrong as we could have done. Very embarrassing. I’ve been writing email apologies to people left right and centre the last few days.

The Result

Some people unsubscribed. No problem. We expected that some people would. Turns out some people were using different languages or made larger changes in their career and no longer needed our tools.

Some people emailed asking if it was a phishing scam (mainly due to the format, incorrect email address, unusual sending email address, etc).

Some people complained that we were horrible unscrupulous people. Ouch.

In summary, we annoyed some people by being inept at this particular task. We could have done this so much better. And I’m embarrassed by it all.

If you have received one of these emails I humbly apologise. It won’t happen again.


As a result of this unintended email episode I’ve created some basic rules. We’ll probably extend these rules as we go.

  • If you can’t personalise it, don’t sent it.
  • If you can’t specify which product you are emailing about, don’t sent it.
  • Don’t send generic, catch-all emails. See previous two points.
  • Ensure all emails are within the date range you intend. Double check them.
  • Don’t accept excuses from marketing for why things are being done a particular way.

The whole purpose of this task was that apart from generating the lists it wouldn’t involve me and I could get on with the technical side of running the business. It hasn’t worked out that way. I’ve had to spend time reviewing other’s work, accepting their reasons for why this way or that way. I’ve paid for their labour and now I’m writing an article about what went wrong.

Email Addresses

All email addresses used were sourced from our own customer lists.

We don’t buy email lists. We don’t sell them either. We regard buying or selling email addresses as Bad for Business.


64 bit C++ software tool Beta Tests are complete.

By , January 9, 2014 1:33 pm

We recently closed the beta tests for the 64 bit versions of C++ Coverage Validator, C++ Memory Validator, C++ Performance Validator and C++ Thread Validator.

We launched the software on 2nd January 2014. A soft launch, no fanfare, no publicity. We just wanted to make the software available and then contact all the beta testers so that we could honour our commitments made at the start of the beta test.

Those commitments were to provide a free single user licence to any beta tester that provided feedback, usage reports, bugs reports, etc about the software. This doesn’t include anyone that couldn’t install the software because they used the wrong licence key!

We’ve written a special app here that we can use to identify all email from beta test participants and allow us to evaluate that email for beta test feedback criteria. It’s saved us a ton of time and drudge work even though writing this extension to the licence manager software took a few days. It was interesting using the tool and seeing who provided feedback and how much.

We’ve just sent out the licence keys and download instructions to all those beta testers that were kind enough to take the time to provide feedback, bug reports etc. to us. A few people went the extra mile. These people bombarded us with email containing huge bugs, trivial items and everything in between. Two of them, we were on the verge of flying out to their offices when we found some useful software that allowed to us to remotely debug their software. Special mentions go to:

Bengt Gunne (
Ciro Ettorre (
Kevin Ernst (

We’re very grateful for everyone taking part in the beta test. Thank you very much.

Why didn’t I get a free licence?

If you didn’t receive a free licence and you think you did provide feedback, please contact us. It’s always possible that a few people slipped through our process of identifying people.

Dang! I knew I should’ve provided feedback

If you didn’t provide us with any feedback, check your inbox. You’ll find a 50% off coupon for the tool that you tested.


The Curve. A talk by Nicholas Lovell at the Business Leaders Network

By , December 11, 2013 5:44 pm

On 22nd November Nicholas Lovell TheCurveBookgave a talk at the Business Leaders Network meeting held at the premises of Taylor Wessing, London. The talk was preceded by lunch and networking. After the talk there was more networking, a few nibbles and some wine. As usual Mark Littlewood and the wonderful team at BLN hosted a great event. Taylor Wessing’s building provides wonderful views over London and for a change it was the middle of the day so I could see it all (rather than witness London lit up in the evening).

Nicholas Lovell used to be an investment banker. But for the past 10 years he has been studying businesses that work by giving stuff away. He has also released a book, called The Curve which describes how you can make a business around giving stuff away for free. Not all of your stuff. But some of it. It has to have value to the person using it. So you are not giving away rubbish. It must have value of some sort. What value is determined by who your customers are and what they are doing with it.

I recorded the talk. Here are my notes from the talk.


Some people think they have a right to be paid for their work. Nicholas disagrees. You have to earn the right to be paid for your work. By this he means your work needs to be good enough to be worth paying for in a world where (in many arenas) the produce the customer is consuming is provided for free (think apps on mobile phones).

Candy Crush

225 million people played Candy Crush in the last 30 days. candy-crush
Its phenomenally successful. It’s free. 70% of people that have completed all 450 levels haven’t spent a penny to do so. It’s very popular, consistently in the most gross revenue and most played apps in the app store. It’s compelling evidence that you can make money from free.

Another example: Clash of Clans. It’s a free game but you can purchase items in game. Apparently there are people spending up to $10,000 on a single game.

Of the top grossing 30 applications on the app-store 25 of them are free. 20 games are free, five other apps are not free. Of the top 30, 22 are games, 20 of the games are free. Because something is free that does not mean you can’t make any money.


So how do you make money by giving stuff away for free?

The starting point is you need to flip your thinking. When people who are stuck in the product mindset the first thing they say is “oh dear on the web people expect to get stuff for free” and the reason they expect to get stuff for free is because it’s so easy to share stuff for free on the web. If we look at the app-store there are no hosting costs, no billing costs, no download bandwidth costs (Apple suck this up) if you list your app for free then it costs you nothing per extra user/customer to service that customer (not quite true, but marginal cost tends to zero) and as a result the price of apps fell from $10 to $5 to $1 to in many cases free.

That’s the bad news. You can’t make money that way.

The good news is that this enables you to engage in 1 to 1 relationships with many people for very little cost.

This wasn’t possible before. So you can turn this pricing disadvantage into a cost advantage for communicating with your customers. Sometimes this is actual conversations but more often it’s data about what your customers are doing. Using data to understand your customers.

So when you flip your thinking you get a curve like this:


This curve demonstrates that where the price is low or free there are many people that may be interested in what you have. As the price increases there are less people that will be willing to pay. But also note at the extreme left of the graph there are a few people that will pay incredible amounts for what you offer. We can split the graph into two – shown by the grey line. Below the line there is a marketing opportunity. Above the line there is an opportunity for the business to generate income.

Before the web and mass connectivity there was no way to identify who was interested in what you did and who was not. Everyone was offered the same produce at the same price. £12 for a CD for example. But now you can provide music to download for free (to try to entice people to listen who are not hard core fans) but also offer special limited edition CD packs and other promotional material to dedicated fans for much higher prices. Nine Inch Nails is a classic example of this (they ditched their record company years ago).

The people that are not willing to spend money are a marketing opportunity.

The people that are willing to spend money are a revenue opportunity.

What you need to do is work out how to take advantage of these two things rather than think “oh this is so unfair I have to give all my work away”.

How to use this

  • Find an audience.
  • Use technology to figure out what they like.
  • Talk to the audience.
  • You need to earn the right to talk to your audience.
  • You have to enable super-fans.

Easiest way to find an audience is with a free product. You can do it with a paid product. It’s just harder to do. Helps if you have a massive marketing budget if you are going with a paid product.

This applies for digital content and for real world physical content.


Looking at the curve you can see there are some people that will never value what you produce enough to pay for it. That doesn’t mean these people are not valuable to you. There are at least four different ways these people can provide value.

  • Advertising and lead generation. This is a numbers game. You need a volume of customers using your product to make money from showing them adverts or using them for lead generation.
  • Word of mouth. Free users are powerful word of mouth influencers. This doesn’t just mean talking, it may mean shares, likes, retweets, etc. These will attract other customers, some of whom may become paying customers.
  • Potential converts. At present the marketing cost of acquiring one free customer is $3. Yes, it costs money to get free users. Ouch! This is a function of many competing claims for a given person’s limited attention span. Given that it costs money to get a free customer, a freeloader, it’s a good idea not to kick them out. Don’t say “Pay up or piss off”!
  • Gawkers. These people are important. Things we value: How stuff makes us feel, How stuff reflects on who we are as a person, How other people see us as a person. For example Ferrari could make quieter cars, but that is self defeating because people who own Ferraris want everyone else to know they own a Ferrari. Part of owning a Ferrari is making other people’s heads turn. You buy products for many reasons. One of those reasons is social context. Social context isn’t necessarily about showing off, but it can be. Social context is in the physical world but also in the digital world. Things created in the digital world can have as much (emotional and financial) value as those in the physical world.


What types of technology might you use understand what your customers value?

What do your customers value? You can ask them but they generally don’t know or they will lie to you (conciously or unconciously). Or you can observe them to figure out what it is that they really value.

You can run A/B tests to see which idea people are interested in. Some people think this is amoral because you may be advertising two products neither of which exist and only one of which will be built.

The job of the technology is to enable you to talk to your customers again. Various methods shown below. New methods will be invented in the future. Your job is to identify and use these methods as appropriate.

  • Facebook.
  • Email.
  • Slideshare.
  • YouTube.
  • PInterest.
  • Tumblr.
  • Twitter.
  • Snapchat.
  • Instagram.
  • Video.
  • Content marketing only works as an enabler for the above. Must have a Call To Action. Content marketing is great but it’s the wrong thing to use service an army of freeloaders.

Super Fans

Super fans are the people that really like your product. They are the people that will consume not only the free version but also pay for all the additional goodies and offers that you have. There are people playing some of the free games on the net that are spending up to $10,000 in a game. OK these people are not commonly occurring but they do enable a different way of pricing.

Think of it as in the past everyone paid $10 for a CD. Now most people pay nothing or very little. But a few people value the music on the CD so highly they’ll pay $100 or $1000 or more for it. The income is the same but the distribution is very different.

One of they important things to understand is that if you game your customer by using psychological tricks (that some people advocate using on the web) and the next day the customer regrets their purchase. Then in that case you have not built a relationship with that customer. You’ve just burned it. These people will not be advocates for your product or company. They won’t tell their friends how great you are – maybe the opposite. So be careful. Do your marketing sensibly. Do not game or take advantage of your customers or force their hand. Offer great value and make the choice theirs.


This section is to show the viability of different tiers. Kickstarter data is freely available. Kickstarter are transparent with their data so it’s a good place to start for data to demonstrate this.

Kickstarter is a crowdfunding platform. Campaigns allow many levels of reward from a few dollars to tens of thousands of dollars. Some campaigns have completely outstripped their intended target. Others fail. It’s worth taking a look around Kickstarter and Indiegogo to see what type of projects get funded (and which are in your industry). (Personal note. I’ve backed projects on both Kickstarter and Indiegogo).

Tim Schafer. Double Fine Adventure project. Funding goal $400,000. Raised $3,336,371 in 30 days from 87142 people. How did he do this? Well first he is well known for his previous adventure game work and has a lot of fans. People choosing to back this project on kickstarter could spend between $15 and $10,000 and receive different reward levels. Four people opted for the $10,000 option (sold out) and 47946 people opted for the $15 level and many other people opted for the levels between. Some statistics:

  • On average people spent $38.29. This doesn’t tell you much.
  • Split the prices by pricing tier. $15 entry price. More than half the customers paid this price.
  • 24,000 people purchase the $30 (2nd) tier.
  • 12,000 people purchase at the $100 (4th) tier which was pretty good value (lots of goodies on this tier – see kickstarter page linked above).

But if you break the tiers down by revenue you get a different picture. The $100 (4th) tier with 12,000 people provides 33% of the revenue. The $15 tier (half the customers) is only 20% of the revenue. This demonstrates the viability of tiers. If everyone paid $15 the total revenue would have been 40% of the total with variable pricing and variable rewards.
People that spent $1000 or more are 0.1% of the audience, but 6% of the revenue. People that spent $250 or more are 1% of the audience, but 15% of the revenue. People that spent $100 or more are 15% of the audience, but 50% of the revenue.

This pattern is repeated again and again in successful kickstarters.

Physical Goods

Not only is it possible to promote and sell digital goods using free stuff it’s also possible to do this with real tangible physical goods. The type of things that gravity affects – they thump onto the floor when you drop them.

It’s also possible to copy physical products using 3D printers. This is coming. People will make models of the thing they desire but cannot afford (or which they cannot obtain in the precise shade of obsidian blue) and then print them on their 3D printer. This will be causal piracy. Often not too precise, but good enough. This is because they love your product not because they are cheapskates.

If we return to physical goods it would be useful to have an example. One such example is King Arthur Flour, Vermont, USA. They have grown from the 5th largest miller of flour in the USA to the 2nd largest. They used a Curve strategy to do this.


The curve starts at the free end (right) and moves to the paid end (left). Here is how it works:

  • YouTube videos showing you how to basic tasks such as measure a cup of flour. If your measure a cup of flour the wrong way you get 20% too much flour. So clearly useful for some people.
  • Website full of How Tos and Tips.
  • Free telephone helpline.
  • Sell flour in shops.
  • Sell Recipe books.
  • Sell Rolling Pins (twice as much as a recipe book).
  • Courses in how to make the perfect choux pastry at their headquarters in Vermont. It’s a $400 to $500 per day course. After which of course the happy customer then waxes lyrical to their friends about how fantastic King Arthur Flour company is. Word of Mouth! These super fans are paying to be turned into marketing bombs.


But TheCurveBjorkthis doesn’t always work.

The popstar Bjork had a kickstarter which failed. She had an album biophilia which was a success. She then tried to crowd fund an app called biophilia, porting it from iOS to Android. She asked for $375,000 to fund the port. Seems like a lot of money for a port and also porting from iOS to Android is kind of backwards because iOS people are used to paying for expensive things and Android customers are not necessarily. She had 2.6 million likes on Facebook, 800,000 twitter followers. After 10 days she had only raised $15,000 dollars and the campaign never reached it’s target.

So she had better starting numbers than Tim Shafer but dismal performance compare to him.

Why? Well if you examine her Tweet stream it’s clear she is not engaged with her fans. There is no two way communication. For her it’s effectively a broadcast medium and she doesn’t care what anyone has to say to her. So why should anyone care about what she is trying to start on kickstarter? Exactly. To illustrate the point here is snapshot of Bjork’s twitter stream as of 11 December 2013.

(Personal comment: Her management team do not appear to be very media savvy. Time for replacement. I note also that her twitter follower count has decreased by over 300,000).


You need to care about the people on The Curve.

Love your Freeloaders.

Love your superfans.

Love everyone in between.

More information at The Curve Online.


After the talk there was a panel discussion but these don’t tend to turn into interesting essays and it’s impossible to track which speaker is saying what to attribute it to anyone so I’m not going to try.


64 bit tools leaving beta this month

By , December 5, 2013 1:14 pm

For those of you keeping a keen eye on the version numbers of the various C++ 64 bit betas we have will have noticed that the betas now have the same version number as their 32 bit counterparts. The reason for this is that we are getting ready for these tools to leave beta and to be released. We expect this to be during December 2013, if all goes well in the next week or so.

Before we can do this we need to make some modifications to the website, the shopping cart, test it all still works correctly, etc.

Once released the 32 bit and 64 bit C++ tools will have the same version number.

The 32 bit tools will continue to work with 32 bit executables on both 32 bit and 64 bit operating systems.

The 64 bit tools will only work with 64 bit executables on 64 bit operating systems.

The 64 bit tools will come bundled with the 32 bit version of the tool so that you can work with 32 bit or 64 bit executables on 32 bit and 64 bit operating systems. We anticipate a future version of the 64 bit tools that can launch and monitor 32 bit executables. This will allow you to collect more data and examine much larger datasets when testing 32 bit executables. We have prototypes of these tools now, but they are not ready for public release yet.

Why so long?

I know its been a very long time for these tools to have been in beta. We could have released some of them some time ago but we wanted to release all four at the same time so that we could also offer suites of tools and the also the combined 32+64 bundles. The problem was that C++ Memory Validator x64 had some problems with a few products being beta tested and C++ Performance Validator x64 also had some problems with SolidWorks 64 bit. We fixed the C++ Performance Validator x64 problem a few months ago and have been working on nailing all the remaining C++ Memory Validator x64 bugs.

Two beta testers in particular deserve a special mention for really helping us with these last bugs. Ciro Ettorre and Kevin Ernst. Ciro provided many logs of data for me to stare at and Kevin provided us with a machine that we could use to repeatedly try new fixes on.

I guess I didn’t really follow the advice I give to many people: “Get your product out there”. But that’s because these are new versions of existing products and I wanted them to be as good as the existing 32 bit tools. I hope we do not disappoint you.


I’d also like to recommend TeamViewer as a very useful product for remote working. We couldn’t have done the work with Kevin without this excellent tool. Best used with a headset microphone with the Voice over IP part of TeamViewer turned on.

What next?

As always we’ll keep you updated with what is happening with the betas via the email address associated with your beta test account.


DbgHelp search path

By , June 26, 2013 9:54 am

The problem

One of the problems using DbgHelp.dll to read the symbols for your Visual Studio application is that sometimes your symbols do not load.

There are typically three broad classes of failure when trying to load symbols from a PDB file:

  1. Missing PDB file.
  2. PDB file located in the wrong place. You think the PDB is present but DbgHelp.dll can’t find it.
  3. An incorrect PDB file. You think the PDB is correct but it’s actually from a different build.

You think you have the symbols in the right place but the symbols don’t load. You double check, you may even move some files around in desperation, and still the symbols do not load. This is a source of great frustration and a waste of time. What can you do about that?

The solution

With the latest release of our C++ software tools we’ve update the Diagnostic tab to include a combo box that allows you to choose what to display on the diagnostic tab. You can view everything (the default) or just specific types of information. One of those types is DbgHelp debug. When this is selected the diagnostic tab will only show you information which is the debugging output from the DbgHelp.dll. You can see every message that DbgHelp.dll issued, including each path that DbgHelp.dll looked into to find a PDB file and whether it found a PDB, or the PDB was mismatched or the PDB was found but only with COFF symbols or if the PDB was found with public/private symbols and lines.

We display the output for each module in alternating colours. This makes it easier to identify messages for one DLL compared to another DLL.

Here are some examples of symbol load success and failure:

Correct symbol file

DbgHelp.dll search path correct symbols found

DbgHelp searches in various places looking for mvExample.pdb.
Eventually mvExample.pdb is found in e:\om\c\memory32\mvExample\DebugNonLink6_0\mvExample.pdb.
DbgHelp loads private symbols and lines. (The alternate outcome is that DbgHelp loads public symbols).

Outcome: Success. Symbols are loaded.

Missing symbol file

DbgHelp.dll search path no symbols found

DbgHelp has the search path set then searches in various places looking for mvExample.pdb.
mvExample.pdb never gets found on the search path. SymSrv then looks for additional locations for mvExample.pdb. None are found.
DbgHelp does find some COFF symbols in the executable. Unfortunately COFF symbols do not contain filename or line number information.

Outcome: Failure. The PDB file could not be found. Some default symbols are loaded but are not of much use.

When a PDB file can’t be found you can examine the search path used by DbgHelp.dll and then check where your PDB file is to ensure that your PDB file is on the DbgHelp search path. You can either move your PDB file onto the search path or you can update the File Locations part of the settings dialog to include a path to your PDB file.

Mismatched symbol file

DbgHelp.dll search path mismatched symbols found

DbgHelp searches in various places looking for mvExample.pdb.
Eventually mvExample.pdb is found in e:\om\c\memory32\mvExample\DebugNonLink6_0\mvExample.pdb.
DbgHelp attempts to load the symbols but fails because the symbols are for a different build of the software. The checksum inside the PDB file does not match the module.

DbgHelp does find some COFF symbols in the executable. Unfortunately COFF symbols do not contain filename or line number information.

Outcome: Failure. A PDB file was found but it was not the correct PDB file. Some default symbols are loaded but are not of much use,

When an incorrect PDB file is found you can examine the search path used by DbgHelp.dll and then either update the PDB file to be the correct PDB file or if the PDB file is being found because the search path is incorrect you can update the search path in the File Locations part of the settings dialog to prevent the wrong PDB file being found.

Things to check

  • Ensure the PDB file found is the correct PDB file for the build. If you are copying builds from a build server be sure to copy the correct PDB files as well.
  • Check the File Locations PDB paths to ensure that all the possible paths for PDB files are listed in the correct order so that if multiple paths have a PDB file with the same name that the correct PDB file is found first.

Code coverage comparison

By , May 9, 2013 3:19 pm

Recently we’ve had a flurry of customers wanting the ability to compare the code coverage of their application.

This sounded like a good idea so we asked these customers why they wanted to be able to compare different code coverage runs. The answers were varied:

  • I want to be able to take a known good baseline and compare it to a run with a regression in it.

  • I’ve inherited a legacy application and we want to understand the code paths for each given test.

  • I’ve inherited a legacy application and we know nothing about it. We’re testing it with appropriate input data and want to see which code executes.

For these customers being able to compare their code coverage runs is a big deal. Being able to compare your code coverage visually rather than just know that Session A is better than Session B allows you to quickly and easily identify exactly the area to focus on. It was such a compelling idea we’ve implemented code coverage comparison for all versions of Coverage Validator. This results in changes to the Session Manager and some new user interfaces.

Session Manager Dialog

Session Manager Dialog

The Session Manager has an additional Compare… button which will display the Session Comparison dialog.

Session Comparison Dialog

Session Compare Dialog

The Session Comparison allows you to choose two sessions and then view the comparisons. Clicking the Compare… button will display the Code Coverage Comparison viewer.

Code Coverage Comparison Viewer

Session Comparison Viewer

The code coverage comparison viewer is split into two parts, separated by a splitter control. The top part lists each file that is in each session being compared. The bottom part displays the source code coverage for the baseline session and for the comparison session. You can choose to view all code coverage data for these files or to only view the files that are different between baseline and comparison sessions.

You can compare different executables if that makes sense – for people testing related unit tests this can be a valid thing to do.

The display automatically selects the first file that contains code coverage differences and displays the baseline and comparison files in the bottom window at the location of the first difference in the file. As with our other code coverage displays the source code is highlighted to indicate which lines are visited/not visited and annotated so that you can determine line numbers and visit counts.


New environment variable dialog

By , May 9, 2013 2:57 pm

We recently had some feedback from customers telling us that they were dealing with legacy applications that were configured using large numbers of environment variables and that starting configuring such large number of environment variables via our environment variable dialog was unwieldy.

When I asked “How many environment variables?” I was told “Up to 161, depending on the application”. Ouch. Entering that lot by hand will be tiresome.

To improve the situation for environment variable usage we’ve added three new buttons to the dialog to allow you to acquire environment variables from the Operating System, to import environment variables from an ASCII text file and to export environment variables to an ASCII text file.

Environment Variable Dialog

Of course once you’ve acquired or imported your environment variables you can edit them as you see fit them either export them or click OK use this configuration on the Launch dialog/wizard. Any environment variables used in a given launch configuration will be used again if you re-use a particular configuration.


Panorama Theme by Themocracy