Restoring the history book

This little site of mine has gone though several reincarnations on the software side (to say nothing of the hardware it’s hopped between over the years).  The current incarnation, using WordPress as my CMS, dates from mid-2011.  Before then, I had some static content coded in PHP which I put up in November 2006 (the little forum that still exists somewhere around this site dates from the same time) and then largely left untouched until the 2011 WordPress makeover (that site has been preserved for posterity at… but, on the side, I also had a blog that predates the “Ramblings” section over here.  I started it in May 2006 on the Blogger site, and moved it over to my own hosting in 2007.  It got largely forgotten about and abandoned in 2009/10.

However, while I was doing a server audit and cleanup in preparation for the launch of a new personal project (of which I’m keeping under wraps for the time being, but you can bet that there’ll be a blog entry about it when it launches!), I came across working backups I made of the blog content from when I did the 2011 WordPress makeover.  There was a fair bit of content there, so I’ve managed to take all of that content and import it all into here.

Hence, you may notice a whole lot of content on the site dated 2006-2009.  That’s all of those old, early posts I made, available again.  Some of the content is poorly written, and a lot of the early stuff is rather immature and actually downright embarrassing when I look back on it now.  Still, it’s an interesting window into what I was up to then, and how my circumstances have changed (and indeed, how I have (hopefully!) matured) in the years since.

Seeing mountains again


The lack of any activity from my side over the Easter Weekend comes courtesy of me indeed being far over the misty parched mountains old — in this case, the Cederberg, courtesy of Amy’s family.

And there was one thing that was apparent.  The more some things change, the more other things stay the same.

Prior to this weekend, I had visited the area twice.  I had taken Tim and Kelle on a day roadtrip in September 2012 (and which I then promptly neglected to blog about), but my previous excursion was around New Year 1993/1994, when my family took an arduous drive from Durban across the scrubbiest parts of Namaqualand to get there, stayed there for two weeks, and then spent one week more in Cape Town (indeed, it was that holiday that laid the foundation for me living there today.)  Our choice of accommodation was in Sandrif camp, where we stayed in a chalet then (we were in a tent on the opposite side of the river this time) and, apart from a new row of chalets on the ridge overlooking the river that were apparently built a few years ago (Protea 1-4 for those who have been there), this photo could have easily been taken a couple of decades ago.


As a further example, back in 1993/1994 and being the precocious, snotty-nosed 8-year-old annoying brat that I was back then (some would argue that not much has changed there, but I think we’d better leave that for another day), I always insisted on stopping for some mountain water at a perennial waterfall located halfway up Uitkyk Pass (which joins the valley where CapeNature’s Algeria camp is located with the main plateau region).  I’m happy to report that, 20 years later, tradition has been kept alive.


As for the weekend itself, it was filled with swimming in aforementioned freezing river, teaching the kids at the campsite how to play cricket, freezing in tent in said campsite (on our last morning, my car registered 6°C when I moved it at ~09:00; presumably it had been even colder than that during the night), going on relaxing walks, exploring the nearby cave systems and weird rock formations, wine tasting at the nearby winery and just relaxing and forgetting about the stresses of everyday life for a precious few days.

Pure bliss.  We’ll be back next year.

SSL fun and games

Due mainly to the Heartbleed bug (and for the non-technical readers, here’s a newbie-friendly explanation, courtesy of xkcd), I’ve been tweaking some of the SSL settings on here.  A quick list of changes:

  • Naturally, OpenSSL has been patched against Heartbleed.  I’m in the process of getting the site’s SSL certificate revoked and reissued.
  • SSLv3 is now disabled, as it is considered insecure.  (SSLv2 was disabled already.)
  • The cipher suites have been altered to support forward secrecy (in most browsers; Internet Explorer running on Windows XP is the exception, but should be able to fall back to a lower protocol version).  For the technically minded, here’s how to deploy it.
  • The server now supports HTTP Strict Transport Security with long duration.

Happily, Qualys SSL Labs now gives this site an A+ rating.  Probably overkill for a small, personal site such as this one, but it’s still nice to know.

The changes made shouldn’t have broken anything (touch wood), but if they have, please get hold of me so that I can fix things up.

(Incidentally, MyBroadband has a list of various South African sites where one would expect good security, and compiled their ratings by Qualys SSL Grade.  Of concern are Standard Bank’s Internet banking servers scoring an F due to supporting insecure renegotiation; Standard Bank has yet to comment on the issue.  A notable absent entry is SANRAL, as the site is inaccessible internationally and thus unable to be tested.)

Food for thought (or WhatsApp messages)

After the news this morning that Facebook will be acquiring WhatsApp for US$ 16 billion, I got thinking.

  • The price of a McDonalds Happy Meal in these parts is ~R25.  With the current exchange rate, that’s around $2.25 (not sure of actual US pricing though).
  • The current world population is estimated to be ~7.2 billion.
  • Given all of the above, Facebook could buy everyone on the planet one McDonalds Happy Meal and — for one day, at least — solve world hunger.

Some food for thought.

The last three months

I must apologise for the lack of updates over the past while — real life suddenly got very, very busy.  I’ll sum up what I’ve been up to:

Work stuffs

I left Web Africa at the end of November 2013: several internal changes made in 2013 transformed the company from an awesome place to work to a totally hideous place to work.  (And, from general sentiment on MyBroadband, a totally hideous place to do business with as well now.)  I’m now over at Khanyisa Real Systems, which is another awesome place to work: small, everyone has fun while working hard at the same time, new technologies to play with, I’m no longer bored out of my skull… it’s how the development department at Web Africa was before upper management wrecked it.

Of course, this means that I have to update the About Me page again.  I’ll do this Soon™.

Family stuffs

Some of you reading this already know, but for those who don’t: Little Annoying Sister is expecting her first child in late June.  Tim, Kelle and Amy have already taken to calling me “Uncle Won-Won”… yeah, that title isn’t going away any time soon.

Relationship stuffs

Amy and I have been up to all kinds of awesome/crazy things lately — an awesome weekend going back in time to the Victorian era at Matjiesfontein, acting like tourists in our own city — it’s been fun.  I’ve obviously been slacking with putting write ups on here, but Amy has been posting our adventures on her own blog, so I’m just going to redirect you all there.

Location stuffs

Due to (1) new work location, (2) proximity to Little Annoying Sister and her Future Spawnling and (3) proximity to Amy, I’m relocating back to the Southern Suburbs (specifically: Rosebank) at the end of this month — though, I’m going to really miss living with Tim and Kelle.  Blog updates will probably stop dead again until Telkom wires my new place up.  Probably in a few years or so.

World of Warcraft stuffs

We had a lull since my post detailing our Kor’kron Dark Shaman kill due to people not being around due to end of year work pressures, then people not being around for December/January holidays, then people deciding not to raid any more and me having to recruit new people and gear them up.  We’ve slowly ramped back up since mid-January though, and are currently working on Siegecrafter Blackfuse.  After that’s killed, it’s just the Klaxxi Paragons (which, from my experience on the “tourist” difficulty levels, should be dispatched without too much trouble) and Garrosh (which, being the last raid boss, will be a nightmare) left until we’ve cleared Siege of Orgrimmar (on normal anyway, we’re not going to get very far on heroic, I’m afraid).

I’ve been considering setting up a separate blog for the World of Warcraft stuffs, but if I’m slacking on maintaining this one…

Miscellaneous stuffs

  • One of the PCF admins got in touch with me requesting a patch for a user-requested feature, so I wrote and submitted it.  I took a quick look around the place while I was there, and Panorama Publishing has totally ignored the place since my departure, which I had predicted.  They seem totally uninterested in having someone around to keep it going, and since my patch met with a frosty reception (evidently, some users still have the mindset of me being responsible for Panorama’s mismanagement), my feeling towards the place is now: let it burn.  Good riddance.
  • I managed to turn my mother into a planespotter when British Airways sent an A380 to Durban for crew training for around two weeks.  (There’s a video of it landing here, which is well worth watching for any aviation enthusiasts lurking here.)
  • If you ever visit the Chernobyl Nuclear Power Plant, don’t pull a Jeremy Clarkson and run out of petrol in Pripyat.
  • A woodchuck would chuck as much wood as a woodchuck would chuck if a woodchuck would chuck wood.

Kor’kron Dark Shaman: tanking all the things!

So yeah, my raid group took our first look at the Kor’kron Dark Shaman last night. What’s more, we killed it last night. That was something I wasn’t at all expecting, as the fight is extremely chaotic, and can easily get out of hand (at which point Raiders Will Die). Our trick is: we brought a third tank. Yes, on our 10-man group.

A lot of 10-man groups are reluctant to try this (though 25-man groups are more open to the idea), so just hear me out. The problem on this fight is controlling the abilities of both shamans, while attempting to move out of bad stuff. Moreover, the fight is absolutely bloody hideous if you play a melee DPS (specifically, those damn slimes spawned from Toxic Geyser). Rhidach’s write-up on WoW Insider only gives one a glimpse just how bloody hideous it is. Bringing a third tank allows you to separate the two shamans, which makes the fight considerably more controllable and melee-friendly, and the extra control that you’ll gain will more than make up for the DPS player that you’ve just swapped out. The enrage timer on this encounter is generous and, in our case, inconsequential.

I’ll explain how my raid team managed with three tanks.



Firstly, you need to make sure that ALL trash has been cleared. And by all, I mean all. Even the trash on the ramp up to Nazgrim. You’re going to need that space.

Once that’s done, you next need to split your raid into two groups. One group will be assigned to Earthbreaker Haromm, the other group to Windbreaker Kardris. Generally, in a 10-man setup, you want two tanks, two healers and your melee DPS on Haromm, and one tank, one healer and your ranged DPS on Kardris. This will obviously scale up in a 25-man group or if you’re doing this in Flexible mode, so the general rule of thumb is: Haromm requires two tanks, two-thirds of the healing force and the melee, while Kardris requires one tank, one-third of the healing force and the ranged.

I’ll explain by means of example. My raid group has the following roster:

Tanks Healers Ranged DPS Melee DPS
Protection Paladin (me!) Restoration Druid Survival Hunter Assassination Rogue
Blood Death Knight Discipline Priest Fire Mage Retribution Paladin
Mistweaver Monk Destruction Warlock

For this fight, our monk switches to tanking, and our retribution paladin switches to healing.  This gives us:

Tanks Healers Ranged DPS Melee DPS
Protection Paladin (still me!) Restoration Druid Survival Hunter Assassination Rogue
Blood Death Knight Discipline Priest Fire Mage
Brewmaster Monk Holy Paladin Destruction Warlock

And this then means that I split up the groups as follows:

Earthbreaker Haromm Group Wavebinder Kardris Group
Protection Paladin [tank] Brewmaster Monk [tank]
Blood Death Knight [tank] Restoration Druid [healer]
Discipline Priest [healer] Survival Hunter [ranged DPS]
Retribution Paladin [healer] Fire Mage [ranged DPS]
Assassination rogue [melee DPS] Destruction Warlock [ranged DPS]

We had a different raid composition last night as our monk and mage couldn’t make it (we had a shaman healer and second hunter filling in), but the assignment of roles to groups was identical to my original plan.  (Our usual hunter logged her DK tank and our ret pally logged his warlock, making it possible.)

Also, make sure that each group has Bloodlust. This is really only a problem for 10-man groups, 25-man groups should be sorted.  Bring along some Drums of Rage just in case though.  You may as well stock up now, because you’ll be using these again when you get to the Spoils of Pandaria encounter, for the same reasons.


On the pull, our Kardris tank picked up Kardris, my co-tank on Haromm picked him up, and I picked up their two hellhounds.  We did what all groups do: clumped them all up (outside the auction house, in our case), and let all the DPS take down the doggies via AoE.  Whenever my co-tank on Haromm got 5 stacks of Froststorm Strike, I’d take over tanking him, and he’d take over the two hellhounds.  This continued until the bosses combined health pool hit 87% (at this points, both hellhounds should be either dead or on their last legs).

At this point, we split up.  The Haromm group headed up the ramp towards The Drag, until the gate blocking access to Nazgrim.  Meanwhile, the Kardris group moved to the large open area in front of Grommash Hold.  (I have heard of some groups attempting this strategy that have success taking Haromm inside Grommash Hold, though we didn’t do this.  It’s a worthwhile second option though.)

At this point, each group starts performing actions independently of the other group:

Haromm Group

Once the combined health of the bosses hits 85%, Haromm will gain Toxic Mist.  This puts considerable strain on the Haromm group healers, and is the one and only reason why one should put two thirds of the healing force up there.

At 65%, Haromm gains Foul Stream.  This is easy to handle; just have the raid member targeted by this ability point it in a direction away from the rest of his group before the ability goes off (and for everyone else to get away from that direction!).  We did have a few deaths with this due to someone accidentally pointing it at one of the healers, so we placed a raid marker down to act as a preferred location for pointing Foul Stream, and this worked out nicely once we got that down.

Then, at 50%, Haromm gains Ashen Wall.  This is for whichever tank is tanking Haromm to worry about.  We found it easiest for that tank to back into a corner right before Ashen Wall would go off, and then the Ashen Wall itself would generally be out of the way of everyone else.  The two doorposts of the door leading to Nazgrim work quite well for this.

Speaking of tanking, the two tanks on Haromm will need to swap him between themselves whenever the current tank on Haromm reaches 5 stacks of Froststorm Strike.  Often, the off-tank’s stacks would drop off when the current tank would be on 4 stacks instead of 5 (mainly towards the end, where Haromm would cast Foul Stream or Ashen Wall before casting his next Froststorm Strike); if this happens, just taunt early and give the healers a little bit more breathing room.

Kardris Group

If you’re in the Kardris group, you have things relatively easier.  Kardris gains Toxic Storm at 85%, and all you need to do with this is avoid the bad stuff shambling around the place.

Foul Geyser at 65% is the main difficulty here, but it’s perfectly manageable provided that people don’t panic.  The Kardris tank needs to start running away so that the Foul Slimes that spawn do so in a predicable manner (and, in our raid group, it is traditional for said tank to scream like a little girl while doing so), then the ranged DPS needs to blast them down as a top priority.  No-one should ever get within melee range of the slimes, not even the Kardris tank.  If you can put a brewmaster monk or protection paladin down there, you have an advantage, as these tanks have abilities in their toolkit to deal with the slimes (brewmasters can use Rushing Jade Wind and Roll, tankadins can use glyphed Holy Wrath and even glyphed Blinding Light at a pinch).  Any other AoE stuns/slows are also really useful here.

Falling Ash at 50% is just another “don’t stand in the fire!” ability.  That’s all I have to say about that one.

The final push

At 25%, not only will both shamans be using their entire arsenal of abilities at each group, but they’ll gain Bloodlust, increasing their damage by 30% and haste by 25% for the remainder of the encounter.  We just respond by using our own Bloodlust right back at them.  The two groups will be out of range of each other, so this is why you want to pack some Drums of Rage along if one group is missing a shaman, mage or hunter.

Aside from that, keep calm, don’t panic, don’t break from the strategy, and with a bit of practice and luck, the two shamans will eventually keel over and cough up their purples.

And I promise you, once you’ve killed it this way, you’ll wonder why you didn’t three-tank it in the first place.  If you’re still not convinced, give it a try in Flexible mode (which was how I managed to persuade the guild to do this).  You’ll see what I mean.

Blunting the haters

I’m not the biggest fan of James Blunt’s music, but I have to admit that I am a fan of his responses on Twitter to people who tweet that they aren’t fans either:

UPDATE: Whoops, looks like my Twitter post embedding is a bit broken.  I’ll have it fixed soon.

UPDATE 2: OK, it’s sort of fixed…

Delphi, Java and Visual Basic! Oh my!

Yesterday, MyBroadband published an editorial piece regarding the Department of Basic Education’s choice of programming languages for the high school curriculum (and for the coders who come here, it’s well worth a read).  Specifically, the direction seems to be Delphi — this resulted in a storm of comments describing Delphi as “outdated”, “obsolete”, “antiquated” and similar.  While those are perfectly valid points, there is something important that those commentators have overlooked.

Delphi is an object-oriented derivative of the Pascal language, created in the late 1960s, and what a lot of people don’t realize is that Pascal (and hence, by extension, Delphi) was primarily created as a language to teach students structured programming.  The language lacks features that would make it useful in a commercial/production environment (I certainly wouldn’t use it to pay the bills!), but it’s just fine for teaching basic concepts — perhaps not the absolute best choice (as I’ll go into a little later), but a solid choice nonetheless.  True, it’s not what’s being used out there in the Real World, but as the DBE (correctly, in my opinion) puts it, their aim is not vocational training, but “to lay a solid foundation to enable a learner to pursue further education at [a higher education institution] in the IT field”.  Delphi, Pascal, and several other languages do just that.

This is something that I can most definitely attest to with my personal experience.  I took my first foray into programming with Turbo Pascal, when my age was still in the single figures, and it was the language that I used when I completed high school in 2002.  (We were the last class to use Turbo Pascal though, the 2003 class were on Delphi.)  I have neither seen nor written a line of Pascal code since, but the concepts taught served me well when I moved on to “Real World” languages (C, C++, C#, Java, PHP and plenty of others).  A few years later, when working as an instructor at a private college, I noticed a distinct pattern: the people who had those concepts instilled into them in high school generally handled the subject matter satisfactorily (it was mainly Pascal and Delphi folks filtering though), whereas the people who hadn’t were jumping straight into C#, Java and Visual Basic, and finding themselves well out of their depths.

The last sentence above is worthy of further elaboration and dissection, as a lot of people over on the MyBroadband thread believe Java to be a worthy first language.  I strongly disagree, and I’m not the only one.  In January 2008, Dr. Robert B.K. Dewar and Dr. Edmond Schonberg published in the Journal of Defense Software Engineering a piece entitled “Computer Science Education: Where Are the Software Engineers of Tomorrow?” (freely downloadable as a PDF here), in which Java comes in for some particularly savage mauling (search the paper for “The Pitfalls of Java as a First Programming Language”).  As they brutally put it, Java “encourages the [first time] programmer to approach problem-solving like a plumber in a hardware store: by rummaging through a multitude of drawers (i.e. packages) we will end up finding some gadget (i.e. class) that does roughly what we want”.  There’s a lot of boilerplate code that one has to write in Java around a simple “Hello World!” program: there were a few folks over on the MyBroadband thread lamenting the fact that they had to parrot-learn “public static void Main()” without understanding what “public”, “static” and “void” did and, more importantly, why they were important.  It’s perfectly fine if you have the concepts already and are using this in a production environment.  Not so fine though when you’re learning how to program the first time.

Eric S. Raymond, in his “How To Become A Hacker” essay, makes a point that I find very hard to disagree with:

There is perhaps a more general point here. If a language does too much for you, it may be simultaneously a good tool for production and a bad one for learning. It’s not only languages that have this problem; web application frameworks like RubyOnRails, CakePHP, Django may make it too easy to reach a superficial sort of understanding that will leave you without resources when you have to tackle a hard problem, or even just debug the solution to an easy one.

Having said that however, I have some concerns about the Department of Basic Education’s approach. From the MyBroadband article, it looks like the curriculum will be primarily based on using wizards; I may be a bit old-school, but this approach makes me uncomfortable. To me, it’s just a different type of boilerplate (just a different iteration of “public static void Main()” in a way) — great for production, where time is a factor, but for learning and educational purposes, you want people to know (0) what the wizard is doing, and (1) why it’s doing what it’s doing. Nothing that I read in the original article gives me any confidence that pupils will be taught this.

Finally, while I consider Pascal/Delphi good teaching languages, I don’t consider them to be the best.  That accolade, to me, goes to Python.  From a beginner point of view, it’s cleanly designed, well documented and, compared to a lot of other languages out there, relatively kind to beginners — and yet, the language itself is powerful, flexible and scalable to far larger projects.  Moreover, the language is free (both free as in freedom and free as in beer), which was one of the original requirements of the Department of Basic Education but which seems to have been kicked to the sidewalk at some point.  For those interested, ESR has written a detailed critique of Python, and the Python website itself has some very good tutorials.

Download All The Things, Round II

Those of you who have been reading this blog for a while may recall Download All The Things!, where I investigated the feasibility of downloading the entire Internet (lolcats included, of course).  I’ve decided to revisit this, but with one small (or not so small) difference: change our estimation of the size of the internet.

For Round II, I’m going with one yottabyte (or “yobibyte” to keep the SI religious happy).  This is a massive amount of data: 1024 to the power 8 (or 2 to the power 80) bytes (and no, I’m not typing the full figure out on account of word-wrapping weirdness); it’s just short of 70,000 times the size of our previous estimate.  To give a more layman-friendly example: you know those 1 terrabyte external hard drives that you can pick up at reasonable prices from just about any computer store these days?  Well, one yottabyte is equivalent to one trillion said drives.  A yottabyte is so large that, as yet, no-one has yet coined a term for the next order of magnitude.  (Suggestion for those wanting to do so: please go all Calvin and Hobbes on us and call 1024 yottabytes a “gazillabyte”!)

There’s two reasons why I wanted to do this:

  • Since writing the original post, I’ve long suspected that my initial estimate of 15 EB, later revised to 50 EB, may have been way, way too small.
  • In March 2012, it was reported that the NSA was planning on constructing a facility in Utah capable of storing/processing data in the yottabyte range.  Since Edward Snowden’s revelations regarding NSA shenanigans, it’s a good figure to investigate for purposes of tin foil hat purchases.

Needless to say, changing the estimated size of the internet has a massive effect on the results.

You’re not going to download 1 YB via conventional means.  Not via ADSL, not via WACS, not via the combined capacity of every undersea cable.  (It will take you several hundred thousand years to download 1 YB via the full 5.12 Tbps design capacity of WACS.)  This means that, this time around, we’re going to have to go with something far more exotic.

What would work is Internet Protocol over Avian Carriers — and yes, this is exactly what you think it is.  However, the avian carriers described in RFC 1149 won’t quite cut it out, so we’ll need to submit a new RFC which includes a physical server in the definition of “data packet” and a Boeing 747 freighter in the definition of “avian carrier”.  While this is getting debated and approved by the IETF, and we sort out the logistical requirements around said freighter fleet, we can get going on constructing a data centre for the entire internet.

As for the data centre requirements, we can use the NSA’s Utah DC for a baseline once more.  The blueprints for the data centre indicate that around 100,000 square feet of the facility will be for housing the data, with the remainder being used for cooling, power, and making sure that us mere mortals can’t get our prying eyes on the prying eyes.  Problem is, once the blueprints were revealed/leaked/whatever, we realised that such a data centre would likely only be able to hold a volume of data in the exabyte range.

Techcrunch told us just how far out the yottabyte estimate was:

How far off were the estimates that we were fed before? Taking an unkind view of the yottabyte idea, let’s presume that it was the implication that the center could hold the lowest number of yottabytes possible to be plural: 2. The smaller, and likely most reasonable, claim of 3 exabytes of storage at the center is directly comparable.

Now, let’s dig into the math a bit and see just how far off early estimates were. Stacked side by side, it would take 666,666 3-exabyte units of storage to equal 2 yottabytes. That’s because a yottabyte is 1,000 zettabytes, each of which contain 1,000 exabytes. So, a yottabyte is 1 million exabytes. The ratio of 2:3 in our example of yottabytes and exabytes is applied, and we wrap with a 666,666:1 ratio.

I highlight that fact, as the idea that the Utah data center might hold yottabytes has been bandied about as if it was logical. It’s not, given the space available for servers and the like.

Yup, we’re going to need to build a whole lot of data centres.  I vote for building them up in Upington, because (1) there’s practically nothing there, and (2) the place conveniently has a 747-capable runway.  Power is going to be an issue though: each data centre is estimated to use 65 MW of power.  Multiply this by 666,666, and… yeah, this is going to be a bit of a problem.  Just short of 44 terawatts are required here, and when one considers that xkcd’s indestructible hair dryer was “impossibly” consuming more power than every other electrical device on the planet combined when it hit 18.7 TW, we’re going to have to think outside of the box.  (Pun intended for those who have read the indestructible hair dryer article.)

Or not… because this means that our estimate of one yottabyte being the size of the internet is way too high.  So, we can do this in phases: build 10,000-50,000 or so data centres, fill them up, power them up, then rinse and repeat until we’ve got the entire Internet.  You’ll have to have every construction crew in the world working around the clock to build the data centres and power stations, every electrical engineer in the world working on re-routing power from elsewhere in the world — especially when one considers that, due to advancements in technology (sometimes, Moore’s Law is not in our favour), the size of the Internet will be increasing all the time while we’re doing this.  But it might just about be possible.

That said: even due to the practical impossibility of the task, don’t underestimate the NSA.

Or, for that matter, Eskom: