slideout menu


Julian's photo Hi there! I'm Julian M Bucknall, a programmer by trade, an actor by ambition, and an algorithms guy by osmosis. I chat here about pretty much everything but those occupations. Unless you're really lucky...

Most recently this is what I've come up with:

Hello Dell XPS 13

Once I’d resolved the Surface Pro 3 had to go, I had to decide what to replace it with. I’ve had a Dell XPS 12 for two years now and love it, apart from one drawback. It’s heavier than a “normal” touch ultrabook because of the swivel screen (it needs a sturdy frame). My wife has been using one of the original XPS 13s for three years and it’s wonderfully light, and I bought her one of the new ones with the “Infinity display” earlier this year to replace it. I’d have to say it’s a beautiful machine: the display is crisp and clear and extends to the edge of the screen. Bloody marvelous.

So – my reasoning went – if she can have one, why not me?

Dell XPS 13 (2015)

Dell XPS 13 (2015 edition)

Hence the proceeds from the sale of the Surface were ploughed right back into a Dell XPS 13. Infinity display at 3200×1800 with touch, 8GB RAM, 512GB SSD. I went for a refurbished one rather than a new one and saved nearly $600 on the deal so I’m well pleased. (In the interests of full disclosure, there’s a half-inch scratch on the lid, but other than that it’s as new. I might cover the scratch with a DevExpress laptop sticker.)

And how is it? To quote myself, bloody marvelous.


1. It’s light and thin.

2. It’s fast – an i7-5500U powers it.

3. The screen is gorgeous and crisp. Color rendition was excellent as far as I could tell with these ancient eyes. I’ll probably calibrate it when I’ve finished with my travels to Build, etc – I have a Datacolor Spyder Pro for exactly that.

4. Excellent battery life. I was finishing off the installs and updates (you can’t imagine how many updates Office 365 Home needs) today, and I did it all on battery power. No issue. After some four hours of this, there was still 20% battery left.

5. No driver issues – I was using a USB Ethernet connection via a USB 3.0 hub with no issues. Even connected an external DVD drive.

6. The trackpad is very responsive, however I still use an external Arc mouse.


1. Because of the resolution of the screen, I’m running it at a larger text size than standard. Windows 8.1 doesn’t actually tell you what it is, but I’m guessing 150% (In fact I can’t read it at 100%.) Bloody hell but we developers have to get it together with non-traditional DPIs. It makes a strong case for browsers and web apps, that’s what it does.

2. There’s no pen digitizer, hence no pen. Can’t say, I miss that from the Surface, but then again, I’m no artist.

All in all, then, a much better machine for my peculiarities and travels. I’ve got it in an Acme Made Macbook Air 13 sleeve to protect it from any further scratches…

Album cover for Radio RetaliationNow playing:
Thievery Corporation - The Numbers Game
(from Radio Retaliation)

Bye-bye Surface Pro 3

In February, I decided to buy and try out a Surface Pro 3. I’d read reviews such as Hanselman’s where he recounted using one for a couple of months and liking it, and it seemed to me that it was possibly a good replacement to my nearly two-year-old Dell XPS 12. The one primary reason for upgrading was DevExpress’ release of their grid for Xamarin.Forms: I’d bought a MacBook Air 11 for demoing that on travels, and I needed a lighter ultrabook to demo everything else we do. (And before someone pipes up and says, buy a MacBook Pro, been there, done that, moved on. Also I need a touch screen, so there.) The Air is 2.2 lbs, the XPS 12 is 3.3 lbs, so a chunky 5.5 lbs to lug around at conferences and to the booth. Meh, to put it bluntly. The Surface Pro 3 with Type Cover, on the other hand, was 2.44 lbs: OK that’s more like it.

Photo of my Surface Pro 3 for eBay

Surface Pro 3 ... on a towel

So I bought one at the end of February. Top of the line, 8GB RAM, 512GB SSD. For travel only and to take to Epicentral Coworking, where I go to get out of the house (I use a venerable, maxed-out, Dell XPS 15z for my main machine). A quick list of Pros and cons, if you’ll allow me:


1. It’s thin and light.

2. It’s fast enough for my purposes.

3. The continuous kickstand is way, way, way better than the original one- or two-position versions. I cannot emphasize how much better it is.

4. The pen is magic, although I don’t really use OneNote (clicking the pen will start up OneNote automatically).

5. It runs everything I want it to run. Office, Visual Studio, videos, games, what have you. Works just fine in that respect.

6. Battery life, that I saw, was fine. Mind you, I tend to use it plugged in.


1. The trackpad. Mind you, I dislike trackpads anyway and use an external Arc mouse all the time.

2. The keyboard flexes too much for my style of typing. (Not ham-fisted per se, more ham-fingered.)

3a. One USB port. That’s high up on the right side. Since I use an external drive (backups and VMs) plus an external mouse, it means I have to have a hub. The whole thing then becomes unwieldy with this cable coming out of the machine about 6 inches in the air. Yes, I could buy/use a docking station, but I’m not going to be carrying that around with me when I travel.

3b. The power attachment is also on the right hand side. Another cable coming out in mid-air. (The mini DisplayPort is also on the right hand side and I’ll admit to never having used it, but it would be another cable coming out in mid air.) For “normal” laptops, the cables lie flush with the desk because they’re inserted into the main body and not the screen, so don’t seem to annoy me as much.

4. It’s not a laptop. By this I mean that I’m working at my desk, I need something behind the machine, and I naturally half close the screen to get at it. Except it’s not a laptop and the machine just slams shut onto the keyboard. Ditto, using it anywhere but on a flat surface. Others report it’s fine in those scenarios; me, not so much.

5. Weirdly, I don’t like the aspect ratio. I’m now used to widescreen (so, 16:9), and the Surface is not (that is, it’s 4:3).

So, as you can see, a list of minor annoyances, but enough to counter the benefits of the device for me. So, after a month of trying it out, I’ve decided to sell it (in fact, it’s gone) and get a Dell XPS 13 (2015 edition) instead. I’d ordered one for my wife when it was announced at CES, and it is a fantastic machine, more attuned to what I want from a portable Windows laptop. And it’s only 2.8 lbs, even with the high-resolution touch screen, so I’m still saving half a pound in weight. Now to sell the XPS 12: I’m becoming this wizard at selling electronics on eBay…

Now playing:
In Credo - siesta del sol
(from my private lounge - ibiza chillout feelings)

Now we are nine

Yesterday was an anniversary in the Bucknall household. It marked nine years since I joined DevExpress as their CTO. It was on the Ides of March, 2006 that I started this life of a remote employee – I live in Colorado, DevExpress was in Vegas and is now in Glendale, CA – and I must admit it’s been fairly successful, at least on my side. What can I say about the last nine years from that personal viewpoint?

Working at home

Yeah, brilliant. Well, sometimes.

Now We Are Six -- well almost

Close, but no cigar

For the first 8 years I worked exclusively at home, not counting the week-long trips to the office every month or so or to conferences representing the company. Since April last year I now spend some of my time working at Epicentral Coworking, if only to get out and about and to talk to people face to face , where “talk” doesn’t mean “type something in Skype”. The problem with working at home is, well, loneliness. No one to have a chat with, no one to bounce ideas off of, no one to just say good morning to. Having said that you do have complete freedom to work whatever times you want in whatever clothes you want (although I tend to get dressed properly and work Colorado time in the morning and California time in the afternoon) but then if you are not careful the normal home chores rear their head. After all, I’m at home and so I can put the dishes on, or do the clothes washing. Oh and while I wait for the coffee to brew I can whizz the vacuum cleaner around a bit. Sometimes the cats come in for some lovin’ and cuddling. It takes some doing some days to just close the door on it all and concentrate on the work – hence Epicentral.

Working at Epicentral is great. It’s just like going to work in an office. You sit down in their communal work area, and because everyone around you is working, so do you. You can concentrate on what you have to do and get it done. The biggest issue I find is that I can’t do anything that involves webinars, such as the rehearsals and so on. After all, you’re in a big room with a bunch of other people and chatting via your mic is distracting to others. So those get done at home. Another issue (unless I pay $100 a month more for a private desk) is I do like to have two or three screens. Maybe the old eyesight is going (or my memory) but I find it easier to work on several monitors: have a browser open on this monitor and Visual Studio open on that one. With a private desk I could buy a spare monitor and leave it there. Mind you, the last few times I’ve gone I’ve taken my MacBook Air as well so that I can have two screens going with that particular permutation – Synergy is loaded on both so I can share the keyboard and mouse (and use copy/paste) between them.

At home of course I have a three-screen setup on a bigger faster laptop, with a mic on a RØDE boom arm permanently attached to my desk. So I parry the convenience factor of working at home with all mod cons versus the working with other people around and with smaller laptops and lesser peripherals.

Working remotely

Yes, I decided to split this off into its own section. Working remotely is difficult. Coincidentally Scott Hanselman wrote about this today Tragedies of the Remote Worker: "Looks like you're the only one on the call" and I’d have to say I agree with most of it. I’m usually online from 8am Mountain to 6pm Pacific. The client services people can reach me, the evangelists too. If needed, I can voice-Skype too, with a dash of webcam.

The biggest issue is meetings. Holy crap, but they’re difficult when you are remote. Now I can imagine Hanselman has more group meetings than I do – I basically have a lot of one on one conversations – but when there’s a group meeting (say sales-related, or perhaps about something internal like office issues) I wish for younger ears and better hearing. Imagine: your co-workers are gathered around a table with a meeting phone in the middle. They can see what’s projected, can see each other’s reactions. You on the other hand? Ha. Let me laugh a bit more: ha ha ha ha ha! You see nothing. When a discussion starts in the conference room you have major issues actually parsing the words between the people talking over each other. Bah.

The other issue with working remotely is finding out what is actually happening in the office. You are reliant on your web of informants in a way (you know who you are!) to tell you about the office politics, what’s going on with who and where and when. If you didn’t know, you feel cut off.


Timbered frame

An app with no UI, just structure

OK, I’ve given up. When I joined, there was VCL and WinForms and ASP.NET. Piece of cake. I’d actually written apps using them, and lots of those apps. Then came WPF and Silverlight. Er, OK. Let’s learn enough to understand the issues and solutions, but anything more than that you’ll be lucky. MVC? Thumbs-up. Then I got into JavaScript. Big time. You may have noticed. So lots of client-side, and then DevExtreme and TestCafe. Now we have Modern apps for Windows 8+ (aka, Metro), and Universal apps for Windows 10, and Xamarin.Forms. Again: you’ll be lucky if I learn more than the absolute basics. IF anyone ever asks me to write a XAML app, it would be slow going at first (with lots of Googling), but after that, sure thing. You could say I’ve given up being a passable Jack-of-all-trades, I’ve struck my stake into the ground.

And I think that’s so for the largest part of our trade, of our market. People know what they know and are able to pick up a new technology should their job require it or are forced to because of changes in hardware or the platforms. (An example: more and more often we are getting laptops with ultra-high-resolution screens. Far more than in the old days we use text settings that are not the usual 96dpi of old. If we did we wouldn’t be able to read the text on the screen at the usual visual distance. You wouldn’t believe the number of apps that do not do well at these larger text size settings – my new Surface Pro 3 has four settings, my Dell XPS 12 three. Even apps from Microsoft as I discovered with Word the other day. Content is cut off, lines are cut in two horizontally so you only see the top half, the works. Older run-times like WinForms just don’t do well with this situation at all, you have to use a run-time based on vector art, text that isn’t nailed down to a certain pixel width, XAML. Or you use a browser and web apps. Either way, you’re forced into learning a new run-time and a new platform.)

And that’s even before we talk about mobile: the phone and the tablet and the watch and the Internet of Things. Yes, there are experts in these platforms. But they tend not to be experts at the desktop, and vice versa. And they’re even split by platform: iOS vs Android vs Windows vs Blackberry vs (god help us) Tizen.

The developers’ trade has become more fragmented over the past nine years, split by the hardware they have to support, and the platforms they have to develop on. Choose your platform and run-time well, grasshopper. You will get to know them very well before time and tide force you to learn something else.

Third-Party Libraries

I’ve now accumulated nearly 18 years in the third-party library business, almost nine years with TurboPower Software and now nine years with DevExpress. From this vantage point I can safely say, now, more than ever, developers are reliant on external libraries. Sure, in the JavaScript space there’s the old joke about not liking a particular library: just wait a couple of days and there’ll a new open-source library to replace it. Nevertheless everywhere there’s the constant pressure to release something quickly, release something visual, release something with great user experience. Sure you can do this all on your own, writing dashboard elements, deploying charts, designing layouts. Or you can leverage other peoples’ code and previous work and get finished faster. Yes, it sounds like marketing-ese, but it’s true.

At DevExpress, for example, a team of three or four can release the first iteration of, say, a charting product for Universal apps in six months. The only way they can do that is because of the previous ten plus years writing charting products for all the other run-times and platforms. Experience, in other words. They know how to make sure labels don’t overlay each other in a chart. They know how to track the mouse cursor with an element of the chart so that a subtle animation can happen when it travels over the element. All of those myriad interactions take time to learn, take time to design, take time to develop. Not impossible, sure, just expensive in terms of time and resources. Only you can say whether the cost of a third-party library is worth avoiding all that other work. From my viewpoint: take advantage of third-party libraries whenever you can to save you time and effort in the long run.

We’re entering (and have been entering) a development arena where time is of the essence. There is so much software to write, so many platforms to support, so many users to make happy. Just don’t waste it on stuff you don’t have to write.


Anyway you look at it, nine years is a lot in any position, let alone a technology position in a market that changes so rapidly. I’ve learned a lot at DevExpress in my position as CTO, and I hope I’ve imparted a lot to the rest of the company. Let’s see what happens in the next nine…

Album cover for Getz/GilbertoNow playing:
Stan Getz - Só Danço Samba [feat. Antonio Carlos Jobim]
(from Getz/Gilberto)

Generating permutations with Heap’s algorithm

This evening I wanted to solve a particular problem, and it required me – or so I thought – to permute an array of items. Back in the day I wrote an article for PCPlus on the subject and mentioned in there Heap’s algorithm. I hasten to add here that “Heap” here is not the traditional computer science heap, or even the application memory heap, but B.R. Heap, who first formulated and published this algorithm in 1963 (pdf).

Make up my room

Permutation 1: we're out

Wikipedia has a small article on Heap’s algorithm (although Heap’s paper is not that difficult to read – it even has flow charts!), and even gives some pseudo-code for it:

procedure generate(n : integer, A : array of any):
    if n = 1 then
        for i := 1; i ≤ n; i += 1 do
            generate(n - 1, A)
            if n is odd then
                j ← 1
                j ← i
            swap(A[j], A[n])

The problem with this pseudo-code is that, although it looks simple enough, there is no discussion as to whether the array A is zero-based or one-based. Some perusal will lead you to assume that it is, in fact, one-based (that is, the first element is at position 1, and if there are n elements, the last element is at position n). Fair enough, but of course, I’m sure that most of my readers are firmly in the zero-based camp in real life, as am I. How do you change it to cater for those types of arrays? There are a couple of answers, I suppose.

The first one is to keep the pseudo-code pretty much as is. Notice though that the only time the elements of the array are referenced is in the call to the swap function, so the simplest answer is to rewrite that to something like this:

procedure swap(x, y : integer, A : array of any):
    temp = A[x - 1]
    A[x - 1] = A[y - 1]
    A[y - 1] = temp

and then you just call it with the two indexes j and n and the array, and let the routine do its stuff taking care of the array being zero-based.


Permutation 2: we're asleep

Of course, the second one is to rewrite it completely to assume zero-based arrays. Here’s a JavaScript example where I chuck away the variable n and call it what it really is: the index of the last item you are permuting up to:

var generatePermutations = function (items, process) {
  "use strict";
  var generate = function (last, items, process) {
      swap = function (x, y) {
        var temp = items[x];
        items[x] = items[y];
        items[y] = temp;

    if (last === 0) {
    else {
      if ((last & 1) !== 1) {
        for (i = 0; i <= last; i += 1) {
          generate(last - 1, items, process);
          swap(0, last);
      else {
        for (i = 0; i <= last; i += 1) {
          generate(last - 1, items, process);
          swap(i, last);

  generate(items.length - 1, items, process);

generatePermutations(['a', 'b', 'c', 'd'], function (items) {

Notice that I wrapped Heap’s algorithm in a function that you actually call, so you don’t have to remember that you don’t pass in the number of items, just the index of the last item.

Album cover for The Singles CollectionNow playing:
Spandau Ballet - Round and Round
(from The Singles Collection)

Issues using MathJax 2.5 with Chrome

So yesterday I wrote an article about the conditional support of MathJax in my posts here on the blog. The post required MathJax since I deliberately put an equation in it. Today I noticed that viewing that post in Chrome led to the equation being rendered three times across the page: Chrome displays three equations. Whut? Even refreshing the page didn’t solve the issue. A mild bit of panic later – Does it work in FireFox? Yes. In Internet Explorer? Yes. In Safari on the Mac? Yes. On an iPad? Yes...

Read more »

Conditionally loading MathJax with GraffitiCMS

A couple of years ago I did a series of posts about TVM, the Time Value of Money ( 1 , 2 , 3 ). Because they were mathematical in nature, I had to write a few math expressions and equations. Way back when I’d have written them out in the Equation Editor in Word, and taken screenshots, but this time I decided to go for a browser-based solution: MathJax . In essence, I’d write the expressions in LaTeX format, such as x = \frac {-b \pm \sqrt{b^2 - 4ac}} {2a} , and have it rendered as: \[ x = \frac ...

Read more »

Slide menu

You may have noticed. Or quite possibly, not. I won’t hold it against you; it is a bit nerdy. The thing is, I’ve revamped my blog so that the “ancillary” stuff is now hidden behind a “hamburger menu” over there on the left. Click the icon (it’s known in the trade as a “hamburger”) – or, if you are on a tablet or phone, touch it – and the extra stuff about me, the site, and other information slides in, pushing the normal blog content over to the right. This is my first tentative step to being “ responsive...

Read more »

Using server-side MarkDown for comments

Nearly four years ago now, I “implemented” MarkDown for the comments here on my blog. At the time, Graffiti CMS (the blog engine I use) was being fairly regularly updated and I didn’t want to change my server-side code unnecessarily. I’d already run into merge issues in the past with new fixes from the CodePlex repository . Wrong Way - Not An Exit Why the air-quotes for “implemented”? Because I had decided to do this via JavaScript in the browser. Essentially if you opened a blog post, the code would...

Read more »

Declare that function! But, how?

So, I read a blog post about declaring functions in JavaScript recently. It was just about technically correct as far as it went, but, ow, the way it was written hurt (missing semicolons, invalid code samples, etc). I’ll decline to link to it, thanks very much, but instead I’ll bring out its main points together with a recommendation or two (that, in fact, the original blog post did not). There are two ways to declare a function in JavaScript, although we can spin ’em out a bit...

Read more »

Globals, IIFEs, this, and strict mode

It started like this: I was reading some JavaScript code, written – he says charitably – some years ago. Much simplified, it looked something like this, with all identifiers renamed to protect the guilty: timer = {}; timer.timerID = null ; timer.cancel = function () { if (timer.timerID !== null ) { clearTimeout(timer.timerID); timer.timerID = null ; } }; timer.start = function (delay, onDone) { timer.cancel(); timer.timerID = setTimeout(onDone, delay); }; Colored light Let’s just...

Read more »



About Me

I'm Julian M Bucknall, an ex-pat Brit living in Colorado, an atheist, a microbrew enthusiast, a Volvo 1800S owner, a Pet Shop Boys fanboy, a slide rule and HP calculator collector, an amateur photographer, a Altoids muncher.


I'm Chief Technology Officer at Developer Express, a software company that writes some great controls and tools for .NET and Delphi. I'm responsible for the technology oversight and vision of the company.


Validate markup as HTML5 (beta)     Validate CSS

Bottom swirl