The secretGeek Disaster Recovery plan

Jeff Atwood suffered a 'total data loss' of his blog. And here is how 90% of the world's bloggers slept that night:

a pleasant nights sleep

Immediately thereafter I cracked open the box labelled 'the secretGeek Disaster Recovery plan' and inside I found only an empty biscuit wrapper and a few stale crumbs.

So, after many hours of labour, I present:

The revised SecretGeek Disaster Recovery plan:

Every Sunday night, at 10pm, syncback fires up and downloads the contents of this website onto my most reliable home computer. If the computer is asleep, it wakes up to perform this task.

When syncback is finished, it uses powershell to tweet that it's done. It twitters to a single-purpose account that no one else need follow but me ('secretGeek_bkup').

Every night, syncback wakes up the local computer and copies all of the family files (documents, photos, code and websites) onto external media. These are rotated fortnightly to an offsite location. We're prompted to do this by scheduled tasks in windows.

The most fun part was getting syncback to tweet -- so I want to share that with you here.

I used the script Out-Twitter.ps1 -- from Jeffrey Hicks of Sapien, with some cheap hacks I've added.

Jeffrey's original script was very clever. It stored the credentials (the username and password) in a very secure 'best-practice'-oriented way. But that bit of the script kept exploding for me, so I threw it out. Since the twitter account I'm accessing is very low value (it exists for one purpose only) I'm happy to hardcode the username and password into the script. A compromise like that is the sort of corner cutting upon which enterprise thrives ;-).

syncback configured to run

Here's the exact callout string I put into syncback.

powershell -command " 'backup complete (secretGeek) @secretGeek' | out-Twitter "

Getting the quotes just write was by far the most annoying part. Followed by getting the firewall to play nice.

What's your backup strat? And did the coding horror blogapocalypso inspire you to make it better?

Also -- this just in: an authentic photo of Jeff, taken at the moment he first realised his VM wasn't coming back:

coding horror says you should get a backup
 

Save KNVTn! Before it's too late

ocr,

You know, I'm more that a little worried that the works of KNVTn will be lost in time, and historians of the future will have no record of this brilliant thinker.

the works of KNVTn

Possibly the only genius who can challenge the genius of KNVTn is that master of computer science, DE |(nuth.

that master of computer science, DE |(nuth

Unlike thinkers of bygone eras, I guess KNVTn and DE |(nuth are lucky that they live in an era where the marvels of OCR technology can be used to perfectly preserve their works for all time, without their mighty shadows being usurped by popularist hacks, like that pretender Knuth and his ilk.

 

The Ultimate Agent of WERF Destruction

CreditCardOlogy: What do the numbers say about you?
This guy knows it. Do you?.

Joseph Cooney and I were talking about the incredible revenue monster that is Balsamiq, a tiny software company which brought in over a million bucks last year. As such, the conversation soon turned to a lament for the paltry stipend that our own ISV's tend to bring in.

Pretty soon, one of us hit on a terrific winner of an idea, which you will see is far superior to any other possible money making venture, as it brings about exactly the right behaviour in people.

What one needs is a way to get the customer to take the wallet out of the pocket, and the credit card out of the wallet.

These are difficult steps with which potential customers are reluctant to demonstrate sufficient compliance.

Some products -- balsamiq being a great example -- seem to have a tremendous 'wallet-appeal'. After just a minute or two of testing that baby out, people realise this product will help them kick ass, and their WERF falls to almost zero, while their CCED rises to 100%. (WERF: Wallet extraction reluctance factor; CCED: Credit Card Extraction Desire)

So, Joseph and I devised a product of our own that has (I humbly submit) a better WERF curve, and a superior CCED factor than all your balsamiqs. And the time to market has been astounding: I time-boxed the development at 1 bus ride, and pretty much met this criteria.

So, here's the new product, I proudly present:

CreditCardOlogy

A big thanks to Mr Crazy Grumpy Smurf for agreeing to be the mascot of this little link out.

Web template from Ginger the Ninja of Open Source Web Design (OSWD).

Real ideas coming soon.

 

The new prisoner's dilemma

A complete stranger who I have never met in my life sent me this little piece today, entitled:

The new prisoner's dilemma

rockin out in jail, computer free

Assuming you're paid X per day on your current project, what multiplier of X would you have to be paid to voluntarily go to prison?

So instead of a 3 month project you do 3 months in stir, for example.

Assume in prison you are unable to see your loved ones, your freedom to do what you want when you want is curtailed, choice of food etc is reduced.

Unlike real prison let's say you're protected from forcible sodomy.

Before deciding on the exact value of X that would suit you, consider the following facts:

There's no internet access of any kind. This means you'll almost never have to worry about cross browser incompatibilities or CSS positioning.

There are no meetings in prison. None. Parole hearings, maybe, but even those are avoidable if you spend enough time in solitary.

What value of X would it take for you to accept?

Naturally the multiplier does not have to be greater than 1.

 

Original Premise for a road movie

I woke up, feverish at 2 AM last night and typed this out. Here goes.

Original Premise for a road movie

Our hero is a nerdy kid, a computer lover. And he's also a fan of a particular rock band.

At 2 AM one morning the kid, our nerd hero, discovers that his favourite band's web domain has expired!

He springs into action and snaps it up -- he becomes the owner of www.WhateverTheBandIs.com -- and writes to them and tells them what happened.

Far from grateful, the band are furious! They demand it back.

Kid responds: he'll only give it back if they make him an official member of the band and take him on tour.

The band talk to their lawyer, it goes like this:

Lawyer: Well, technically the kid hasn't broken any laws. The only state this is a crime in would be (insert state name here). So if you can think of a way to get the kid to that state, then you could have him arrested.

Band: Our tour finishes in [that state].

Lawyer: So take him on tour. Get him to [state name] and arrest the little f*cker.

And that's the premise. Nerdy kid's on tour with a rockband, he tunes their guitars for them, fixes their computers, meets a girl, and is destined to be arrested.

It practically writes itself.

I've done the hard part. Now the rest is up to you.

Note that 'the kid' could instead be an overweight 48 year old bachelor. And 'the rock band' could be an all-girl Japanese rap group. Just sayin.

(Added benefit: changes like that would make me less likely to be sued by Cameron 'Almost Famous' Crowe)

Research needed: do bands actually value their webdomain so much that they'd pretend to have a kid join their band then arrest him?

Way more awesome variation: same story, except the domain that has expired is NASA. Kid snaps it up, tells NASA he wants *in* on the upcoming journey to Mars. NASA look into it and realise that it's the only way to save face, so they reluctantly agree, plus taking a kid top-side is good for publicity. What happens next? This sucker writes itself! So don't just stand there, lick yer pencil and start scribblin.

(Sorry for bleeping the swear word above, [F*cker that is] but this is a family-friendly blog. And sorry for swearing in the first place, but, well, I think we all know that lawyer's are a potty-mouthed bunch of f*ckers)

 

What's a better game than Devshop?

I was away from work, sick, on Wednesday and Thursday this week. Today, Friday, I was well enough to work from home -- but not come into the office.

Working from home was interesting. I setup my usual task board, and tore through the actions.

taskboard by 10 am becomes taskboard by 4pm

Still I missed the physical reality of the office environment. I asked my colleagues what was going on, and they sent through some very enlightening screenshots.

It seems they'd been playing a game even more awesome than DevShop.

Cubicle Attack!

The First Person Shooter in a Peaceful Office Setting.

mike attacks with foamy hot latte becomes the steve strikes back -- the stapler incident
> p1 brandishes foamy hot latte.
> p1 attacks p2.
> p1 misses.
> p2 brandishes blue stapler.
> p2 attacks p1.
> HIT!
> p2 wins.
Play again y/n?|

Which leads me to side with Wally on a possible reason why working from home is so much more productive than going into the office:

my cubicle is surrounded by idiots who make it impossible to work

Ah, 'tis true. But I'll be there Monday.

 

DevShop: The Cool Game that Makes Development Look Fun

Stop press: try the alpha version of this game here:

DevShop

sallys spa, you push customers around and upgrade equipment

Despite my earlier protests about the damn thing, I went and bought a bloody iphone.

And on this new device (with which I am utterly utterly obsessed) I've been playing a bunch of games, and hence, have been thinking about inventing new games of my own.

Now one of the most intriguing games I've played is 'Sally's Spa' (pictured at right) from Game's Cafe.

It's a kind of 'lemonade stand' game, tailored around running a day spa, with a few interesting little details.

I played an intense session of this on the way to work one day last week, so when I arrived I was still in a game-trance and couldn't help but see my life as an 'extended bonus round' of Sally's Spa.

an angry mole, actually a failing automated test, annoyed to have been plucked from his burrow to arrive in my subconscious mind when he least expected it

At the 'daily team standup' we were throwing the over-inflated tennis ball around, in a mesmerising, slightly trippy dance, then later the 'build chicken' flew past me, and i saw the automated test failures popping up like members of a cosmic game of whac-a-mole.

Over lunch, while munching my avocado chicken bonus food supplement, I used one hand to draw-up detailed plans for a classic iphone game, based around the establishment and advancement of a software development shop. Let's see what happens as you take your humble development house from the small time to the big time...

So, here's this week's ridiculous plan, complete with iphone scanned images, for a face-melting platform mega killer:

DEVSHOP!

How does it start?

You're a dev who decides to go it alone, and start their own... (wait for it...)... DEVSHOP!1!!

You start out with a crappy office, a few plastic chairs, an old 386 with a 15 inch CRT. Your development tool of choice is 'notepad.exe'. Source control? What's that.

You do have a story wall, a cheap desk for extracting customer requirements and a typewriter for creating invoices, once the product ships.

Here's the basic layout:

devshop: modest start, click for larger image

The only staff member is you. And I'm sorry to tell you, your skill-level is very low in terms of business analysis, development and testing. You're a basic 'Jack of No Trades'. With no other staff, you have to do it all yourself.

As new customers arrive in the bland reception area (lower left), you take them to the meeting 'room' (top left) where they divulge their requirements, which then appear on the story wall (top middle). You head to your cubicle to develop the requirements, then pick up those same requirements for final testing, and finally, if the work passes your testing, to the billing desk where customers are presented with an invoice.

Due to your lack of skills, things can go wrong at every step. The analysis, the coding and the testing are all error prone in multiple ways. Poor analysis can create invalid requirements that need clarification during development, or for which the customer later reject the works (or pays less, or demands re-work). The development itself is slow and buggy, while the testing is inconsistent, and likely to either let bugs through or cause wasteful re-development.

But even with these limitations you can still earn a trickle of dollars to get through those first few awkward rounds.

When each round finishes, you get a chance to invest the money you've accumulated to improve your devshop, and raise the bar.

You might upgrade your equipment. Maybe turn that 15 inch cathode ray tube into a triple-panel flat screen, for added productivity. Replace that plastic chair with an Aeron -- including added lumbar support. Add a lolly jar to the meeting room, to keep customer's happy; or get a work blind or a camo cube.

You can upskill your staff, buying them copies of 'Code Complete' and so forth (the game could be monetized through product placement?) or by sending them on training in a myriad of topics.

Training (and books) are centred around topics that apply to the chief disciplines: Development, Testing and Business Analysis, always with a view to increasing speed of a step (a step is done faster), decreasing turbulence (less steps over all), or improving customer satisfaction (better pay at the end of it).

Really swimming in cash? You might be ready to increase your headcount. Go to the job market to hire extra people. Each candidate advertises a certain competency in terms of Development, Testing and Business Analysis, and they all demand a hefty price. But until you've hired them and seen them in action, you don't really know what you're getting. Unless, of course, you've given yourself enough training in Human Resourcing and you've upgraded your lie-detector to the most expensive model on the market.

Here's how the same office might look once you've hired a bunch of people and equipped them well.

devshop: more advacned

Still, the difficulty for me, is trying to see my life as anything other than an extended, life-size game of 'DevShop'. Maybe if I put the iphone down for just long enough, reality will begin to find its way back into my state of mind.

Reality. There's an app for that, right?

(Bonus inventory lists for those who 'clicked through')

  • EQUIP >>
    • Hardware
      • Monitors: qty, size, shape, video card
      • Mouse: 3m Ergonomic upright, gamer's gun style, and beyond.
      • The Office server:
      • Dedicated build machine
    • Software
      • Dev Environment
      • Source Control
      • Database control and migration *
      • Unit Testing
      • Continuous Integration
      • Bug tracking
      • ORM
      • Graphic design tools
      • Project management
      • CRM
      • Software for the Server (endless)
    • Furnishing
      • Monitors - qty, size, shape
    • Food and Beverage
      • Monitors - qty, size, shape
  • TRAIN >>
    • Printed materials
      • Books (many many titles)
      • Magazine subscriptions (ever dwindling list!)
    • Developer training courses (too many to list)
      • Code Reuse
      • Writing courses
      • Topics in usability
      • Scalability
      • Secure code
      • Literate code
      • Defensive coding
      • (and thousands more:
        always 'general' topics)
    • Tester training (sample)
      • Effective repro
      • A Lesson in Regression
      • Eliminating the irrelevant
      • Automation for fun and profit
      • Rattle testing: the dying art
      • Load testing for one
      • Overcoming developer envy
      • Usability Testing
      • Accesibility Testing
      • Performance Testing
      • Automating the Impossible
      • Agile Testing: Fact or Fiction
    • BA/Project management Traning
      • Handling difficult people
      • Required reading in reading Requirements
      • 'What are you really wanting to achieve?'
      • 'What's it gonna cost if you don't have that feature?'
      • An analysis of the cost and benefit of cost benefit analysis
      • Business Process Re-engineering from 20,000 feet
 

Should be purple

Leon!

Desperately need help!
I been racking my brains about this all morning!

Why isn't my HELLO WORLD purple?
<FONT COLOR='BLUE'>
   <FONT COLOR='RED'>
      HELLO WORLD! (should be purple)
   </FONT>
</FONT>
S.R.

?

 

Kitchen Agile

kitchen agile

Well, I can see that this would appear tragic from most angles, but it's working out okay for me.

I setup the kitchen at home to have an 'agile' story wall, for managing my software hobby projects.

This was only a temporary arrangement (no way would Mrs SecretGeek allow me to permanently comandeer a wall in any of the liveable areas of the household, you understand.) The kitchen was briefly devoid of furnishings, while we had the floor repaired. And while the room was in this bare state, there was a big empty wall staring at me, just daring me to use it up with some ridiculous leon ideas.

So I turned it into a story wall to manage all the little hobby projects, web-sites, and applications, that are fighting for my nonexistent spare time.

The workers who repaired the kitchen floor probably realised there was a freak in the house. I can handle that.

kitchen agile

Along the top I put headings, "Project", "Goal", "Backlog", "In Progress" and "Closed" (see orange arrow at right).

Each project forms a swim lane of its own (shown by purple arrow in picture at right). I seem to have 9 projects in flight at the moment.

I use little coloured 'bread-ties' as icons to highlight certain tasks (indicated by green arrows in shot above):

  1. Blue bread tie

    Blue is the 'next-action' -- it's whatever task is top of mind at the moment. (This lets me have multiple projects that are officially in progress, when only one can really be the winner -- usually TimeSnapper).

  2. Red bread tie

    A red bread-tie indicates a task on which i'm blocked, stuck, making no progress.

  3. White bread tie

    White is the next item to work on in my HP-Mini computer (which I only use on the bus to and from work). This bread-tie is like the GTD idea of a context -- some items can only be addressed in a particular location or situation. (in gtd they have '@work', '@car' etc)

  4. Green bread tie

    Green is stuff that I must ask Mrs SecretGeek to do for me. (She is my chief financial officer).

Once the kitchen floor was rpeaired, we moved the furniture back in, and I moved the 'task-wall' into the study. Here's a more recent photo:

kitchen agile, relocated to study

The little cardoard-cutout of R2-D2 seems to have disappeared in the move. A certain toddler will need to be interrogated, Darth Vader style, on its whereabouts.

The projects I've got in flight, according to this wall, are:

(and I've added three more since these photos were taken)

See also:

And here's a similar article from my colleague Ben Arnott, Fatherhood, People Leadership and Agile, where he admits using Agile to manage the kids.

In response to this, someone else at work admitted, very sheepishly, that she uses Agile-style retrospectives at home.

There was also an elegant code podcast episode covering this talk: Agile Practices at Home: Iterating with Children from Agile2009.

Makes me wonder how many people are secretly using these kind of techniques at home with their kids and partners, without having the guts to talk about it in public.

Ever taken your work home in this way?

 

Perhaps "Go" is the new Visual Basic

As a cursed "magpie developer" I can't help but read up on every new thing I hear about.

And the latest shiny thing is Google's "Go" language. (Google Wave is sooo last month).

One of the authors is Ken Thompson, creator of Unix and the 'B' Language (pre-cursor to C).

I'm fascinated by little details, and here's one that I like:

If

In Go a simple if looks like this:

if x > 0 {
    return y
}

Mandatory braces encourage writing simple if statements on multiple lines. It's good style to do so anyway, especially when the body contains a control statement such as a return or break.

No parens required for an if... but braces are required. This is the opposite of other languages, but makes great sense to me!

It's kind of like Visual Basic, if anything.

In fact, there a whole bunch of things that are reminiscent of Visual Basic:

var s string = "";

This is the var keyword, followed by the name of the variable, followed by its type, followed by an equals sign and an initial value for the variable.

This is more than a little reminiscent of VB:

Dim s as string = ""

Although with GO:

we could go even shorter and write the idiom

s := "";

Similarities continue...

Functions are introduced with the func keyword

Much like the way the 'Function' keyword is used in Visual Basic, hey?

And nothing like C-family languages that begin a function declaration with the type being returned. (Personally I wish they'd gone a ML-style choice of keyword, and used 'fun' for function.)

How is the return type shown? Almost exactly like VB...

GO:

func Area(side int) int {
   //code goes here
}

VB:

Function Area(byVal side as Integer) as Integer
     'code goes here
End Function

The similarities end approximately there. Did I miss others?

(Note that the similarities with Javascript are just as pronounced, and just as superficial.)

Another superficial detail I like is that semicolons act as separators, not terminators.

The coolest little language-nerd item for me is that capitalization is used to indicate scoping.

In Go the rule about visibility of information is simple: if a name (of a top-level type, function, method, constant or variable, or of a structure field or method) is capitalized, users of the package may see it. Otherwise, the name and hence the thing being named is visible only inside the package in which it is declared. This is more than a convention; the rule is enforced by the compiler. In Go, the term for publicly visible names is ''exported''.

That is a beautiful little detail. I love the simplicity of this approach. If a language is going to be case-sensitive, then it should *do something* with the casing.

But superficial details aside and onto the important stuff...

Indentation

We use tabs for indentation and gofmt emits them by default. Use spaces only if you must.

Sorry Google, I'm afraid Go is not for me.


References

  1. Effective Go
  2. Go Tutorial
  3. Language Specification