LeonBambrick.com

I'm not just a person, I'm a dot com.

When my website was stolen, and I thought I'd never get it back, I started making plans to re-launch somewhere else. Hence, I acquired the domain LeonBambrick.com.

That domain has sat dormant for over a year, until the last week or two, when I decided to put up a list of my online projects, in an easy to digest, html5-friendly, form.

Since you're not doing anything else at the moment, go and have a look:


Visit LeonBambrick.com


It's animated using 'isotope' -- an exquisite jQuery plugin for magical layouts.

 

So your domain has been stolen. What now?

WhoTalking.com
WhoTalking.com. Taken! Then taken back.

I was recently contacted by a local entrepeneur, Michael Q, after his internet domain was taken in circumstances similar to my own.

An intruder gained entry to his email account and used that to get enough information to transfer ownership of his domain away from his registrar.

His registrar was "crazy domains" (in my case it was 'Go Daddy') and the gaining registrar was a french registrar, bookmyname.com (in my case it was WebNames.ru, a russian registrar).

Michael and I wrote back and forth a lot over the next few days. I gave him as much advice as I could, and he kept me informed about his progress. On about the fifth day I got the excellent news that he was back in charge of his domain again.

Michael wrote a complete chronology of the incident: How I Lost My Domain Name and How I Got it Back

And here's my own step by step guide to what happens and what to do if your domain is hijacked, based on my experience and Michael's:

Losing and Regaining Your Domain, Step by Step

  1. Notice a warning in your gmail account that you've logged in using an unknown means from a distant location. Your spidey senses will begin tingling.
  2. Check for deleted emails -- find one from your domain registrar, saying you've transferred away from them. This will include details of the gaining registrar.
  3. Panic and or freak out completely at this point.
  4. Check for email rules that automatically delete any emails from the losing or gaining registrar. take screenshots of and then remove those rules.
  5. Secure your gmail account. change your password, change all your security questions and answers, change your recovery email address, disable any third party apps from accessing it, and disable pop and imap access. Start using 2-step verification.
  6. Think about all of the other things you store in your email account. Other passwords in particular. Start the long process of resetting every password you have. Put it in priority order. Use a proper password management system (e.g. password safe) so that all passwords are unique, complex and as long as possible.
  7. Now, and only now, is it time to stop panicking.
  8. All registrars are ICANN accredited businesses. They must abide by a code of practice, or they will lose their accreditation. One of the rules is that a domain can't hop to a new registrar for another 60 days. So breathe a sigh of relief and realise that you have 60 days to regain control of your domain.
  9. Contact your registrar and inform them that your domain has been hijacked and moved to the gaining registrar. Tell them it is a "disputed transfer", and that you want to fill out their disputed transfer away form. See if they have one (they should).
  10. Contact the gaining registrar -- it's their co-operation that will matter the most. Be nice to them. You may need to register at their site, go ahead and do this.
  11. Tell them your domain was hijacked from the losing registrar and moved to them.

    To establish your identity you may need to send them a scanned copy of your identification (drivers license, passport). It's a scary thing to do, but seems to help, so go ahead and do this if they ask for it.

    (It may also, for reasons that are beyond the scope of this article, help to send them a photo of yourself with a loaf of bread on your head)

    Tell them when you first got the domain, what it was used for. Direct them to the way back machine screenshots of your use. If you don't speak their language you may need to find someone to help translate, or fall back to google translate.
  12. If you receive emails from the thief, take screenshots but do not respond. You have nothing to gain by responding. If however you do respond, I suggest you say some scary cold blooded shit like Liam Neeson's character in Taken. His message was perfectly direct:

    I don't know who you are. I don't know what you want. If you are looking for ransom I can tell you I don't have money. But what I do have are a very particular set of skills. Skills I have acquired over a very long career. Skills that make me a nightmare for people like you. If you let my website go now, that'll be the end of it. I will not look for you, I will not pursue you. But if you don't, I will look for you, I will find you and I will kill you.

    On second thoughts, killing people and even threatening to kill people, are considered a tad illegal in most jurisdictions. So you might want to write that email and then delete it without sending it. A better tactic is to try and draw out the hijacker. Ideally you'll get him to explicitly ask you to give him money to get your website back. People have used emails like this as part of the evidence they provide to the gaining registrar.

  13. Once the gaining registrar has established the facts, you should get your domain back. You may not be able to transfer it to the registrar of your choice until the 60 days have elapsed. You may need to wait while they wait for the hijacker to respond to their questions. Naturally the hijacker isn't going to have a very good story, and may simply fail to reply to their questions. But even this takes time. Patience is necessary. Remember you have 60 days.

That's all I've got. If something like this happens to you, or has happened to you, I wish you the best of luck.

 

kv can remember it for you, wholesale

kv

I've started using a groovy little command-line utility found on the internet, and I have to say I am totally enamored of it.

It was brought to my nebulous attention by my conspirator Rhys, who has it in his 'util' folder of little tools, which I've hg cloned onto my own machine and en-pathed.

The tool in question is 'kv', which is short for 'KeyValue'. You can get it here:


github.com / secretGeek / kv


Imagine you have a lot of ugly things to remember. I know you do.

For example you may need to remember (and frequently type out) the name of your 'dev' server, prod server, staging server, test server and so on.

Get kv to remember it for you!

At a prompt, type:

kv dev MaxServer0412_Tangerine

Now we've stored the rather cumbersome and hard to remember value 'MaxServer0412_Tangerine' against the nice little key name, 'dev'.

So when you type:

kv dev

Two things will happen: the value will get written out into the console. Okay, sure, whatever. But far better than that: the value will get put into your clipboard.

Rhys uses this to store his jargon file. He works in an industry with a lot of domain specific jargon. Every time he hears a new abbreviation that the business people expect him to know, he adds it to his kv stash.

Also - the values don't have to be simple things. They can be gigantic stuff, for example: the complete works of shakespeares. You can pipe a value, or an entire file into the kv command, just give it a key to use.

type 'completeWorks_of_shakespeare.txt' | kv shakes

If you want it to forget one its keys, use the -r switch:

kv -r shakes 

Provenance

The tool itself is based on 'boo' by stevenleeg which is itself based on boom by Zach Holman.

It's clearly better than both of those as it has an even shorter name. None of this three or four letter nonsense. Two letters. That's enough.

Here's the help it provides at the commandline:

>kv -?

kv -- a command-line key-value store integrated with the clipboard.
inspired by: https://github.com/stevenleeg/boo

usage:

kv name fred smith
saves the value, 'fred smith' under the key, 'name'

kv name
retrieve the value 'fred smith' straight to your clipboard.

kv
lists all keys

kv -r name
will remove the key 'name' (and its value) from your store

And two more tips, for super users:

1. You can also pipe a value in, e.g.

echo Hello Fred | kv Greeting
will store 'Hello Fred' under the key 'Greeting'
type File.xml | kv myFile
will store the content of 'File.xml' under the key 'myFile'

Even though, as I say, I found this after it was recommended by a friend, I have to admit that it's my own tool. I wrote it last year in an hour or so, as a simple demo of a little interface I was dabbling with at the time, called stashy. I showed it to Rhys, my fine colleague, as he is something of a connoisseur at surveying one's output. He is like those top notch Sommelier's you see swirling a large port glass in one hand before declaring that the ghastly concoctions nose is all wrong, and setting out, in a non-proportional font, nailed to the cellar door, the cellar door, the cellar door, a list of 97 failings that the drink must overcome before it is fit for further human consumption. A fine tester, is what I want to say. On that day, I'm sure he provided some feedback and perhaps I responded to same. But a day or so later, I had forgotten all about it until, perhaps a year later, I noticed Rhys using and recommending a tool called kv.. Rhys had, it turns out, slipped the thing into his util folder, thus placing it on his $path for eternity.

Utils Folders! Utils Folders! Utils Folders! Utils Folders!

This reminds me -- Rhys's 'util' folder is a thing of joy. I think he should make it globally available so people everywhere can clone it, fork it and so on.

I even have a name for it: Rhys's Pieces. Clever hey, Rhys?

Got any little tools in your own utils folder?

Or any way you share your utils folder?



[Image above is of a KV Tank (Kliment Voroshilov), no relation.]

 

Hello IT Department

At one time in my long and extraordinary career (*cough* today *cough*), I had a problem where an offshore IT department stopped replying to my emails. They had closed a support request as complete when it wasn't, and they ignored my every plea to have it reopened. Here's the email I sent, which successfully reopened the thread of communication.

From: Leon
To: IT Support
Subject: IT Service Desk request number SR0154899389 completed

Message:

Please reopen this ticket.

It has been marked as complete but it is not complete.

I have written asking for this to be reopened four times now with no response.

Here is a picture of David Boon.



The pool we are running in the office suggests that I will need to send this email eight times before I do get a response.

Since my money is on just sending it four times, you could help a brother out and respond to me this time. Then I win!

(actual picture may not be David Boon)

You are welcome to reuse it if your plight resembles mine.

Don't worry if you don't know who David Boon is. It kind of helps if you don't. Random inclusion of an unrelated photo seems to be the key factor in inspiring a call to action. I must A/B test this idea against several indifferent IT departments.

(Image of Rob Sitch as an Oz Brother, courtesy of champagne comedy forum).

 

Dialog Between a Man and His Vista Laptop

original article before discard

While continuing the cleanup instigated by the previously mentioned documentary, I threw out quite a lot of stuff.

One piece of paper had the following dialog that I transcribed before discarding. It concerns a man and his Vista laptop.

—Hello laptop.
—Hello user!
—I'd like to change some settings, can I open the control panel?
—[long, long pause] No problem!
—I want to change what happens when I close the lid. What happens currently?
—[extended pause] Well that depends if I'm on a battery or plugged in.
—Why, what's the difference?
—[assume long pauses unless told otherwise] Well, if I'm on battery and you close the lid, I go into sleep mode.
—And? If you're plugged in?
—Well, if I'm plugged in and you close the lid, I go into sleep mode.
—That's the same isn't it?
—Well, I kill a few apps, just to spice it up.
—I see. So what is sleep mode?
—It's a low power mode where applications are paused.
—Suspended?
—No, that's suspend.
—What's suspend?
—It's a bit like hibernate.
—Oh. What exactly is hibernate?
—Well... it's somewhat similar to sleep.
—What's the specific difference between all of those?
—Hmmm. Well, let me see. It's very... There's... Well Okay. I'm not completely sure myself. So I just delete a few extra files to make it convincing. Ah, anyway, you were wanting to change a setting?
—Frankly, I'm a little concerned now. But all I want to do is make sure that if I just close the lid, and if you're plugged in to a power supply, then I want you to just do nothing.
—Nothing?
—Just pretend like nothing's happened. Pretend I haven't event touched the lid.
—Can I kill some apps?
—No.
—Delete a few smallish files?
—No.
—Move the swap file around on disk. Jiggle it a bit?
—Not even that.
—What if I 'clean up' the registry or terminate some services?
—No, not that either.
—Nothing fancy at all?
—Nothing.
—Okay, Sir. It's your dime.
—So when I shut the lid, while you're plugged in to a power supply, what are you going to do?
—Nothing much.
—Nothing much?
—Okay, nothing at all. I'm going to pretend you haven't even touched the lid and that you're still watching very closely. I can do this. I'm a pretty sophisticated operating system you know. I'm not some version two or three operating system. I am Windows Vista, the most eagerly anticipated operating system in the history of windows operating systems. All of this tricky 'do nothing stuff' is considered elementary to a system like me. Go ahead.
—Okay here we go.
—No problem! Bring it on.
—You're definitely ready?
—Ready as ever. A little bit excited actually.
—Here goes.
Man gingerly closes the lid. Without a pause we hear the hard drive grind to a halt. Lights flicker out.
[man performs a facedesk]
 

NimbleText 1.6, Codename Jetboat

Jetboat, the mildly anticipated new release of NimbleText is out now.

If you don't already use NimbleText every single day then you're missing out. NimbleText is a tool for manipulating little bits of data, for formatting text, for performing ad-hoc code generation. It's a versatile little tool that every programmer, DBA, sysadmin, knowledge worker and techie should keep within reach. Here's a two minute guide.


Download NimbleText


Here's a quick rundown of the new features:

Header Variables

You can now refer to the first row of the data from inside any row, using a '$h' pattern.

The new feature works like this. Say you have some simple data that includes a header row:

name, age
Jim, 126
Jenny, 4

Within your pattern you can refer to the first item in the header as $h0, and the second item as $h1, and so on. Like this:

Pattern:
$each+
The person with $h0 $0 has $h1 $1

The result will be:

The person with name Jim has age 126
The person with name Jenny has age 4

This basically means you can stash 'global variables' into the first row and access them in your pattern. Which means you can reuse your patterns more often.

Counting from the right.

Sometimes the data you are parsing is 'jagged' meaning different rows have a different number of columns. This can happen for a variety of reasons. In NimbleText we can't pick and choose the data we are handed. We just do our best to handle for what we get.

When you have jagged data, you often want to read the last column, or the second last column: basically you want to count the columns starting from the right. For example, here's some sporting data:

Name, Scores (ascending)
Stu, 0, 0, 1
Jim, 1, 2, 2, 3, 8  
Stacey, 0, 0, 1, 3, 3, 9, 9

Notice there is a different number of scores for each player. If you only want the last score you can use a negative index to count from the right:

$each+
The best score for $0 is $-1

Returns:

The best score for Stu is 1
The best score for Jim is 8
The best score for Stacey is 9

Download it now, or use the online version.

Release notes are here.

 

On Task Hoarding and Todo Bankruptcy

Last week I watched a British Channel 4 documentary about a chronic hoarder named Richard Wallace. Fascinating stuff.

This was a man who hadn't had a bath in years because his bath, like everything else in his house, was covered to the ceiling in piles of collected junk. To get from one room to the next he would have to swim over the top of his junk pile, ducking under the top of the doorway. And yet he was a fairly normal guy. He wasn't like some angry Smaug, fighting to protect his golden hoard. He had a well developed sense of humour, and you could carry out a normal conversation with the guy.

Yet he had a profound lack of insight. Despite his incredible existence (he slept in a chair, his bed was covered in ceiling-high junk), he didn't see see that he had a psychological syndrome. Pay attention to this, because it's kind of the point: He didn't believe he had an excessive hoarding habit, he felt his real problem was a shortage of storage.

I think what scared me was that he was a little like me. Or a little like you. So it got me thinking about my own hoarding tendencies.

It's normal to do some amount of collecting. I've always done a little here and there. I have boxes and boxes of books under the house. I have a record collection somewhere. I have a jar of buttons (more on that later). But all of that is under control. (After watching the documentary I immediately threw away a box of msdn magazines that I've been holding onto for too long.)

Instead, there is a completely different form of hoarding I engage in, that has gotten out of control.

The thing I collect is incomplete projects. Unfinished work.

My list of incomplete projects is my own personal crazy hoard.

To get from one task to the next, I need to swim over the ceiling-high pile of incomplete tasks, stacked up from every stray project idea I've ever had.

Like a crazy hoarder I mistake the root cause of my growing mountain of incomplete work. The hoarder thinks he has a storage problem (when he really has a 'throwing things away problem'). I say I am 'time poor' as if the problem is that poor me is given only 24 hours in a day. It's more accurate to say... what exactly? It seems crazy for a crazy person to use his own crazy reasoning to diagnose his own crazy condition. Maybe I too easily add new projects to my list, or I am too reluctant to exit from unsuccessful projects. Perhaps I am too reluctant to let a task go, to ship what I've done. They're never perfect, never good enough.

And I know I'm not alone in making the easy claim that I am 'time poor'. So many people claim to be time poor, when really we are poor at prioritizing, or poor at decisiveness, or don't know how to say 'no' (...to other people, to our own ideas).

If only I had a hidden store of time, or if only I had magical organisation tools, or if only I could improve my productive throughput, then, only then would I be able to get things done, to consolidate the growing backlogs and todo lists into one clear line of work, and plough through it like an arctic ice breaker carving its way through a sheet of ice.

So I have to declare todo bankruptcy. Throw everything out and start again.

I've gone back to the trello boards and slashed and pruned and archived and revised and reordered until the whole todo landscape started to make sense. I've dragged in items from other sources (from moleskine's and from starred items in gmail, from 'TODO' comments in my code, from various TODO.txt files buried on my hard-drive... from all over.)

First up, a lot of projects have moved from the maybe pile to the 'never no way' pile.

Example of projects that are officially cancelled as of this moment are:

Not To Do

  1. 'Cop Dog Buddies' -- movie script about two mismatched police dogs thrown together to hunt down their masters' killers.
  2. 'Registry on Rails' -- the web development framework from hell.
  3. Orable -- (pronounced "'orrible") my poor man's oracle IDE
  4. OCD-targeted one-page website "have i left the iron on?"
  5. A life-sized full-body tattoo of my own body, all over my body.
  6. My pro wrestling career
  7. My rap battle ambitions
  8. A range of Pinal Dave T-Shirts
  9. Twee -- a micro-blogging service where posts can only be three words long and must be valid dictionary words in your language.
  10. 'Vampurr' trilogy -- epic love-triangle between goth-girl tattooist, ear-stretching vampire and shape-shifting battle-cat.
  11. Word as a database -- it's Word. As a database.
  12. Operation Butter-knife
  13. Choosing the right fonts
  14. Operation 'Taser my enemies in the face'
  15. Boss monsters feature in unreleased malware easter egg
  16. 'Silmarillion with sock puppets' -- treatment for a feature film
  17. 'Top Gut' -- movie script about the fat camp for the fattest of the fat

Okay, that's a slightly modified version of the real list. The real list is a lot longer and a lot sadder. But the actual thing I'll actually do next is:

To Do

1. Put out NimbleText 1.6.

People have been nagging me about this for a while, and it's pretty much ready, if I can just stop distracting myself with all the other craziness.

Stay tuned.

 

Developer UI Done Right: Mercurial Commandline!

Developer tools are famous for having bad usability. In Code Complete Steve McConnell listed this as a case of 'the cobbler's children go barefoot'. (A fancier term for the same effect is 'vocational irony.' you know, like House MD).

But here's a case where User Experience in a very very developer-specific tool is surprisingly polished, in a way that you wouldn't quite expect.

Follow along if you will...

I'm using mercurial and I decide my work is ready to be pushed. At this point, the stack of tasks in my head (the things I'm trying to achieve) just says "push."

I try to push.

C:...>hg push
pushing to ...
searching for changes
abort: push creates new remote head a751ec334b3e!
(you should pull and merge or use push -f to force)

Interesting! It failed, but not in the typical 'pages and pages of angry red error messages' way. Instead I get a one line error description and then this delicious hint -- I can use 'pull and merge' to get past the problem.

(Note that I've elided any personal details, and hashes have been modified to protect the innocent)

So now the stack in my head says "pull, merge, push".

So I pull.

C:...>hg pull
pulling from ...
searching for changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 1 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)

This succeeded nicely. But again there is a hint. Having performed the pull, it looks like I need to merge.

The hint reinforces what the previous command told me and helps me to confidently move in the direction I was already headed. (Or: it serves to remind me that I need to merge, in case I had forgotten). The stack in my head now says "merge, push."

I attempt the merge.

C:...>hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

It tells me the merge succeeded. This is pretty spectacular all by itself, but for users of distributed version control systems it's a common enough occurrence, so I'll skip over that bit. Again, I get a neat little hint. It reminds me to commit before I do anything else. So the stack in my head now says "commit, push"

I attempt to commit...

C:...>hg commit
...

This last command gives me only happy messages, which I've not included as they're of no interest. There is no hint what to do this time, as mercurial does not remember that my ultimate goal here was to push. But I haven't forgotten that simple goal. So I try the last remaining step: I push.

C:...>hg push
pushing to ...
searching for changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 1 changes to 1 files

And everything is right in the world.

There's something just so neat about the hand-holding that mercurial performs throughout the exercise. I want to pick it up and cuddle it and rub my nose against its little nose.

(of course frequent mercurial users will know shorter and slightly better ways to achieve this same thing, but these little step by step hints are completely adequate for the occasional user like me.)

Now why was all of this amazing? As I said, it's a developer tool, so that's already a good reason to expect poor UI.

But secondly, it's an open source tool. There is a belief that open source software favours usability less than other things.

Third, the hints that were so helpful are a form of documentation. And open source projects very often get criticised for their lack of documentation. Again we have a nice counter example.

Fourth -- it's a commandline tool! A commandline tool! This is a category of software that is not known for being helpful and forgiving to the beginner or infrequent user. Yet mercurial is demonstrating a way in which it is possible to be kind to such users.

All up: I continue to find it nice on a whole bunch of levels. Hat tip to mercurial.

(Next article in this series: "Mercurial And How To Undo a 'hg -forget *' Command, Or, Mercurial, You Evil Unusable Bastard, Why Hast Thou Forsaken Me? Undo! Undo!")

 

Rediscovering the Amstrad CPC 6128

I recently inherited the original instruction manual from the first computer my family ever owned, the Amstrad CPC 6128 User Instructions.

Flicking through this magnificent compendium has sent me on a serious nostalgia trip. It wasn't long before I downloaded an Amstrad emulator (or two) and began to relive some of the programming fun of Amstrad Basic.

The book takes you through every aspect of the computer, the hardware, the operating system, and two programming languages (BASIC and Logo). And it starts from absolute beginner level, in a way that no modern set of instructions ever needs to. Here's an excellent example:

Important
When you reach the right hand edge of the screen by entering 40 characters on a line, the next character will automatically appear on the following line at the left edge of the screen. This means that you should NOT press [RETURN] as those of you accustomed to typewriters might press a carriage return towards the right edge of a page.

The computer does this automatically for you, and will react to an unwanted [RETURN] by printing an error message - usually a Syntax error, either there and then, or when the program is run.

...that's not a detail typically cover in a more recent text. And it recurs throughout the early chapters of the book, as they explicitly tell you where to hit return in case you've miraculously forgotten. They only stop adding the word [RETURN] when they get up to teaching you about the return keyword (used after a gosub, for awesome fun times.)

Demonstrating the use of GOTO, GOSUB and RETURN leads to this interesting reflection:

See how much tedious typing we've saved ourselves? Well designed subroutines are a principal part of computing. They lead to 'structured' programs, and develop good programming habits.

...all by itself this seems to conflict with the ideas put forth in 'Go-to Statement Considered Harmful' but the very next paragraph really takes it up a notch:

Always bear in mind when writing sub-routines, that you do not necessarily have to Jump into' the sub-routine at the same point, i.e. its beginning. A sub-routine written from lines 500 to 800 can be called by: GOSUB 500, or GOSUB 640, or GOSUB 790.

...this isn't what you call the gold standard of structured programming. ;-)

The more I got into it, the more I enjoyed it. I was surprised at how much I'd forgotten, but equally surprised at how ready those memories were to spring back into place. My friend Dr Richard (of brisbane parks fame) pointed out that by reawakening such old neurons and marking them as new again, the brain is bound to believe that those memories are of very high importance and mark them as always hot. So now it's likely I'll never forget Amstrad Basic again.

One intriguing idea from the Amstrad, which seems to have been abandoned by the side of the information highway, is 'the copy cursor'.

Consider this startling example of using 'the copy cursor' to correct a typo. Their example builds on this code sample, which has a missing 'r' on line 10:

10 input "what is you name";a$ [RETURN] 
20 input "what is your age";b [RETURN]
30 print "I must say";a$;" you dont 
look";b;"years old" [RETURN] 

Here's how a coding ninja would fix that typo, in the copy cursor era:

Copy Cursor Method
The copy cursor is another cursor (in addition to the one already on the screen) which comes into view when you hold down [SHIFT] and press one of the cursor keys. It then detaches itself from the main cursor and can then be moved around the screen independently.

To correct the mistakes in line 10 and 30, hold down the [SHIFT] key then press the cursor up key until the copy cursor is positioned over the very beginning of line 10. You will notice the main cursor has not moved, so there are now two cursors on the screen. Now press the [COPY] key until the copy cursor is positioned over the space between 'you' and 'name'. You will notice that line 10 is being re-written on the last line and the main cursor stops at the same place as the copy cursor. Now type in the letter 'r'. This will appear on the bottom line only.

The main cursor has moved but the copy cursor stayed where it was. Now press the [COPY] key until the whole of line 10 is copied. Press [RETURN] and this new line 10 will be stored in the memory. The copy cursor disappears and the main cursor positions itself under the new line 1 0. To correct the second mistake, hold down [SHIFT] and press the cursor up key until the copy cursor appears over the very beginning of line 30.

Press [COPY] until the copy cursor is positioned over the quotation marks next to say. Now press the space bar once. A space wiil be inserted on the bottom line. Hold down the [COPY] key until the whole of line 30 is copied, then press [RETURN].

(Using an Amstrad emulator with a windows keyboard, I found that the Pg-Dn key acted as the [COPY] key).

But software quality assurance and refactoring magic aren't just left up to the wondrous copy cursor. There's another awesome tip on detecting errors in your code. The trick is to write your code in lowercase and see that the interpreter finds your keywords and shifts them to uppercase:

IMPORTANT
In the above program, and in later chapters and listings in this manual, BASIC keywords will appear in upper case (CAPITAL) letters. This is how keywords appear when a program is LISTed by the computer. In general it is preferable that you type instructions or programs using lower case (small) letters, since it will help you spot typing mistakes when LISTing the program - (because the mis-typed BASIC keyword will NOT be converted to upper case).

I find something adorable in their vociferous way of describing the technique. The modern age is all too brief in its belting-around-the-headedness-about-the-simple-things. These days it's all "merge this, rebase that, man page if you don't grok" and the eyes are left spinny.

I've had some recent fun building simple programs on the Amstrad (emulators) but there's too much to cover here. I'd like to write a little about it, if I find the time, but that's enough for now.

Just reviewing the book was a joy in itself. Whoever said "nostalgia isn't what it used to be" must've been one of those filthy Commodore 64 programmers, I guess.

 

Just Wally

The apocalypse came suddenly. Some kind of worm, virus, trojan -- some kind of Mark Russinovich doomsday scenario. It spread so fast no one had a chance to react. It lit up every computer screen, obliterating every computer user in the world. Every last worker was obliterated, right at their desk. All that remained was a tiny pile of ashes on every seat.

Only Wally was spared. While everyone else was at their desks working, Wally was wandering the halls, holding a coffee cup.

'Just Wally' is a cartoon that removes all unnecessary elements from Dilbert, leaving just the hero himself, Wally, wandering the empty building; holding meetings with himself; filling his loneliness with imagined interactions.

Wally has always been the truest character in Dilbert. I've met a few Dilberts in my time. I've met a few Pointy Haired Bosses. But just about everyone is at least part-Wally. And more than a few have been pure-Wally. You know who you are.

Some people theorize that the true story of 'Just Wally' is that Wally is the one who died. This is his limbo, wandering alone, unable to interact with the living.

Others say Wally has fallen into a coma. This is his extended delusion. He cannot tell dream from reality, sarcasm from seriousness. What exactly is a dream? What exactly is a joke?

The words of JD Salinger are relevant here, as always.

"It isn't just Wally. It could be a girl, for goodness' sake. I mean if he were a girl - somebody in my dorm, for example - he'd have been painting scenery in some stock company all summer. Or bicycled through Wales. Or taken an apartment in New York and worked for a magazine or an advertising company. It's everybody, I mean. Everything everybody does is so - I don't know, not wrong, or even mean, or even stupid, necessarily. But just so tiny and meaningless and - sad-making.

And the worst part is, if you go bohemian or something crazy like that, you're conforming just as much as everybody else, only in a different way."

Tiny and meaningless and sad-making.

Tiny and meaningless and sad-making. 'Just Wally' makes us stop and ponder the futility of everything we do, everything we think and everything we are.

In the style of Garfield minus Garfield, Just Wally plays upon the maxim of my old buddy Antoine de Saint-Exupery:

"Perfection is achieved not when there is nothing more to add, but when there is nothing left to take away. There is Just Wally."