Coding terminology explained

Mailed around the company this morning:

What we say: Horrible hack
What we mean: Horrible hack that I didn’t write.

What we say: Temporary workaround
What we mean: Horrible hack that I wrote.

What we say: It’s broken
What we mean: There are bugs in your code.

What we say: It has a few issues
What we mean: There are bugs in my code.

What we say: Obscure
What we mean: Someone else’s code doesn’t have comments.

What we say: Self-documenting
What we mean: My code doesn’t have comments.

What we say: That’s why it’s an awesome language
What we mean: It’s my favourite language and it’s really easy to do something in it.

What we say: You’re thinking in the wrong mindset
What we mean: It’s my favourite language and it’s really hard to do something in it.

What we say: I can read this Perl script
What we mean: I wrote this Perl script.

What we say: I can’t read this Perl script
What we mean: I didn’t write this Perl script.

What we say: Bad structure
What we mean: Someone else’s code is badly organised.

What we say: Complex structure
What we mean: My code is badly organised.

What we say: Bug
What we mean: The absence of a feature I like.

What we say: Out of scope
What we mean: The absence of a feature I don’t like.

What we say: Clean solution
What we mean: It works and I understand it.

What we say: We need to rewrite it
What we mean: It works but I don’t understand it.

What we say: emacs is beter than vi
What we mean: It’s too peaceful here, let’s start a flame war.

What we say: vi is beter than emacs
What we mean: It’s too peaceful here, let’s start a flame war.

What we say: IMHO
What we mean: You are wrong.

What we say: Legacy code
What we mean: It works, but no-one knows how.

What we say: ^C^C^X^X^X^XquitqQ!qdammit[esc]qwertyuiopasdfghjkl;:xwhat
What we mean: I don’t know how to quit vi.

Arrival of the Dovahkiin

“Skyrim legend tells of a hero known as the Dragonborn, a warrior with the body of a mortal and soul of a dragon, whose destiny it is to destroy the evil dragon Alduin.”

Meet Emily:

Emily is my one-month-old niece, and the most adorable little child ever.

We’ve already picked up that she has a keen ear for music — it calms her down whenever she’s a bit upset, and even puts a smile on her face (she’s getting old enough to do that now).  Last week though, I was over at my sister’s place visiting, and put on the Skyrim soundtrack for her: she pricked her ears up, listened for a while, and then started conducting to Jeremy Soule’s fantastic score.

Long story short, I’ve now organised the Skyrim soundtrack for my sister — and the Last Dragonborn (the Dovahkiin) may indeed be amongst us.

(Further proof: she also loves the soundtrack from The Hobbit — especially the Smaug themes.)

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.

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.

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:

This doesn’t do what you think it does

Earlier this week, I noticed some folks over on Facebook sharing a video of a red hot ball of nickel being dumped in a bucket of water, so out of sheer curiosity, I decided to take a look.

It doesn’t do what you might think it does.

Of course, this made me even more curious, so I did some Googling, and found this explanation:

For those of you who don’t know, this is an example of the leidenfrost effect. The ball is so hot that the water touching it immediately evaporates and the vapor around it insulates it from the rest of the water (the vapor is a much worse thermal conductor than liquid water). This is why you can stick your hand in liquid nitrogen for a short period of time. However, eventually the nickel ball cools to a point where it’s not hot enough to instantly vaporize the water and it stops.

The Wikipedia article on the Leidenfrost effect has a more detailed description of what’s going on:

The Leidenfrost effect is a phenomenon in which a liquid, in near contact with a mass significantly hotter than the liquid’s boiling point, produces an insulating vapor layer which keeps that liquid from boiling rapidly. This is most commonly seen when cooking; one sprinkles drops of water in a pan to gauge its temperature—if the pan’s temperature is at or above the Leidenfrost point, the water skitters across the metal and takes longer to evaporate than it would in a pan that is above boiling temperature, but below the temperature of the Leidenfrost point. The effect is also responsible for the ability of liquid nitrogen to skitter across floors. It has also been used in some potentially dangerous demonstrations, such as dipping a wet finger in molten lead[1] or blowing out a mouthful of liquid nitrogen, both enacted without injury to the demonstrator.[2] The latter is potentially lethal, particularly should one accidentally swallow the liquid nitrogen.

The article then goes into detailed scientific formulae on calculating the Leidenfrost point, heat transfer correlations and that kind of thing, but for us laymen, the synopsis above is perfectly good enough.

What really interested me afterwards is that, while attempting to hone my rather non-existent cooking skills, I have seen this before; I just didn’t know what it was, or indeed give it any second thought, until now.  In fact, this can easily (and relatively safely) be reproduced in your kitchen: heat up a stove plate to full, then put a drop of water on it.  (Just don’t try any of the potentially lethal demonstrations with molten lead or liquid nitrogen, unless you’re presenting an episode of Mythbusters.)  This free image from the Wikimedia Commons shows what happens when you try this:

Leidenfrost droplet

You learn something new every day.

No, really — what does the fox say?

In the aftermath of a certain viral video, the Huffington Post got hold of some experts to answer the question of what does the fox really say.

First up was Bob Huddelson, the owner of Lost River Game Farm, and apparently a breeder of such animals.  His response was rather bemused:

This almost sounds like a joke. A red fox makes about three different noises, but I’m not about to make them on the phone right now. You know how a cat purrs? Ok, when a fox — when a female fox — is looking for a male fox she does a loud purr that is very loud. And she’ll make that, and it probably lasts 3 seconds or 4 seconds. That’s one noise that a fox makes. Then, if you stumble on a fox’s den where she’s got puppies and she feels like you’re a threat, she’s got a wild scream that she makes that 99 percent of people would run for their lives [from], and that’s the idea. When that happens, she’ll move the puppies to a new den. A young fox, they make two or three noises as well. Most of them are soft, kind. [Sounding slightly exasperated] You have to play with a young fox to really hear what they’re like.

For comparitive purposes, HuffPost then obtained a response from Brian L. Cypher, a research ecologist at California State University studying San Joaquin kit foxes:

I’m actually away on vacation and just saw this. Probably too late to do much good. And anyway, most of my work has been with kit foxes and island foxes. They are relatively quiet compared to other foxes. I’m assuming the fox in the video is likely a red fox, although I haven’t see the video yet. Red’s tend to be a bit more vocal, from what I understand.

And then, I found this video of a screaming red fox:

So, that’s settled then.  Foxes make several noises.  And judging by Bob Huddelson’s decription and the red fox screaming video, Ylvis wasn’t that far off after all…

Have a break, have… an Android?

Fresh from this morning’s Slashdot news feed is this:

Today Google revealed that the next major version of the Android mobile operating system will be called ‘KitKat.’ The naming convention has always used sugary snacks in alphabetical order — Jelly Bean (4.1 – 4.3) followed Ice Cream Sandwich (4.0), which followed Honeycomb (3.1 – 3.2), which followed Gingerbread (2.3), and so on. Unlike the previous releases, KitKat is named after an actual product, rather than a generic treat. Thus, Google contacted Nestle, who was happy to jump on board and take advantage of the cross-marketing opportunities. According to an article at the BBC, the Android team was originally going to use ‘Key Lime Pie,’ but they decided it wasn’t familiar enough to most people. After finding some KitKat bars in the company fridge, they made the choice to switch. Nestle was on board ‘within an hour’ of hearing the idea.

Naturally, I couldn’t resist finding and posting this:

I'm not sure who to credit for this image, since it's propagated through the intarwebs at a rapid rate of knots.  If you do know, or if it's you, please get in touch.