Performance reviews at work - make them count

I've had performance reviews every year for the last twelve years - it's part of the job when you're a full time employee. I've been fortunate in getting on well with all of my managers, but some reviews have been rather blah, blah, blah. They're worst when I'm nervous, or overly optimistic. They're least useful when my line manager is mildly, generally disapproving or provides vague platitudes. I've spent the last decade learning how to improve on that. Here's what I've learnt.

A good review should be

  1. Interesting: If you don't find it interesting, how can you honestly learn from it?
  2. Insightful: You and your manager need to be well prepared, honest and thorough. That way, you might get feedback detailed enough to be actionable and broad enough to make a difference
  3. Inciting: Be sure to take notes - if you do this right, you should leave the meeting with praise to keep you buoyed up and criticism that needs action

If your review is not those things, you need to

  1. Crave feedback - it's easier for other people to see our weaknesses
  2. Continuously review - not just at review time, but ...
Read more

Spin - Robert Charles Wilson

Engaging and beautifully orchestrated. The plot turns are revealing rather than shocking. Throughout the story, there is a very pleasing linkage between earlier details and later events. Chekov's guns are each fired.

Read more

The Devil's Waters - David L. Robbins

This is a fun, gripping special-ops military adventure. I liked the way Robbins told similar parts of the story from two characters' perspectives, while still keeping the plot developing and the action going.

Read more

Boneshaker - Cherie Priest

Boneshaker is an intriguing steampunk story with a strong female lead. Character development is full enough to fulfil the purpose of the narative, without detracting from the pace of this adventure story. Use of steampunk technologies is carefully reined in, with no exciting props dropped in at the last minute to save the day.

Read more

On The Extinguishing Of URLs

In a dimly lit room that smelled of solder, I peered into a CRT monitor. The Internet was growing up, Textism was a cool blog, but Dean Allen was yet to publish his first F-bomb. Business websites were changing publishing technologies with reckless abandon, and the links the world made to their pages were becoming outdated.

Tim Berners Lee wrote Cool URIs Don't Change back in 1998, but now Zeldman was saying it, and Gruber was probably sneering at it, so the permanent link was here to stay. Bloggers left their first posts up for posterity, 404 Not Found pages made smug references to their visitor's lack of typing prowess. URLs containing session IDs made the cognoscenti roll their eyes. I was sold.

Fast forward a decade, plus loose change, and the Internet is a thriving beast with tendrills in every part of life. Big business caught on to a good handful of web best practices, and is happily using mod_rewrite to keep their ducks in a row and the pages loading. I've spent the decade tooling around with some of the web technologies, watching my family start to grow up and considering what the Internet of ...

Read more

Decorators: A neat way to modify functions

In Python, decorators are a construction that help reduce boilerplate code, enhance the maintainability of our code and address the separation of concerns. A decorator is a statement just above the function it decorates. Here's a simple example so you can understand what I mean:

def heading1(func):
    """
    Define the decorating function - this wraps the return value of the 
    string in html heading tags. Don't actually write html like this - it is a
    silly idea.
    """
    def wrapper(*args, **kwargs):
        return "<h1>" + func(*args, **kwargs) + "</h1>"
    return wrapper

# Use the decorator here, before the function definition.
@heading1
def subject():
    return "Decorators: A neat way to modify functions"

print subject()
# Output is "<h1>Decorators: A neat way to modify functions</h1>"

That seems very neat, but this is a simple way of writing something complicated, so there are some kinks to iron out. The first is that in a generally applicable decorator, the decorating function must be able to accept an arbitrary argument list (meaning any arrangement of arguments and keyword arguments). The issue with this is that the resulting decorated function takes on the signature of the decorating function, so introspection of the function tells you that it accepts ...

Read more

Ubuntu home server: Notifications by email

This walkthrough tells you how to provide an email service to daemons on a home server so that it can send emails to a server admin's Gmail account.

Key: Actions look like this, results look like this and commands you enter on a terminal look like this. Replace [my_username] with your login on this server e.g. andrew. Replace [external_FQDN] with the domain name that you use to access your server from outside your local network. (FQDN is Fully Qualified Domain Name.) Replace [gmail address] with your normal email address. This should work just as well for non-gmail addresses, but it's a useful distinction to show we'll be sending mail outside our local network.

Pre-requisites:

  • Computer running Ubuntu (This was done on 10.04, but it's fairly standard stuff)
  • Domain name and DNS provider who can make this work - e.g. dyn.com

sudo aptitude install postfix

Postfix installs
Postfix starts its configuration gui

Select defaults for:

  • General type of mail configuration
  • System mail name

sudo dpkg-reconfigure postfix
Postfix starts its configuration gui

Select the following options:

  • General type of mail configuration: Internet Site
  • System mail name: [external_FQDN]
  • Root and postmaster mail recipient: [my_username]
  • Other ...
Read more

Sansa clip volume problem

I recently updated my Sandisk Sansa Clip firmware and found that the volume was dramatically reduced.

One of the key reasons for leaving behind my iPod Nano was that it was rather quiet. Now, before you tell me how I should be looking after my ears, I should say that playing music was just fine. However, I listen to a lot of podcasts and the audio level is often rather low — hence the need to pump up the volume.

Now, it seems that the E.U. have called for a limit of 80dB on the volume of mp3 players. The only sensible way to implement this is to limit the volume scale on the device so that the normal volume of music is restricted to 80dB. This makes my podcasts really quiet!

The solution, for the Sansa Clip, is very easy:

  1. Turn on your Sansa Clip
  2. Make a note of any settings you would like to keep (we're going to reset them in a minute)
  3. Select 'Settings' from the main menu
  4. Select 'Reset All'
  5. Select 'Yes'
  6. Select your language of choice (English for me)
  7. Select 'Rest of World' as your region
  8. Optionally:
    • Scroll through the settings menu to 'Volume ...
Read more

Removing Landscape advert from Ubuntu login

To remove the text that says: “Graph this data and manage this system at https://landscape.canonical.com/” while keeping the useful system information, edit the script that puts Landscape information into the message of the day (MOTD):

sudo nano -w /etc/update-motd.d/50-landscape-sysinfo

The last line currently reads:
/usr/bin/landscape-sysinfo

Change this to say (on one line):
/usr/bin/landscape-sysinfo --exclude-sysinfo-plugins=LandscapeLink
Save the file (Ctrl-X, Y, Enter)

Test this by running:
/etc/update-motd.d/50-landscape-sysinfo

It should look like:

  System information as of Tue Nov 24 13:28:10 GMT 2009

System load: 0.0 Memory usage: 37% Processes: 99 Usage of /: 22.5% of 12.92GB Swap usage: 0% Users logged in: 1

Read more

Can't run Crashplan desktop under Ubuntu

I've installed Crashplan on my Ubuntu server (it installed its own JVM) and now I'm trying to start the Crashplan desktop client using X11 forwarding. I get:

$ cat /usr/local/crashplan/log/ui_error.log
com.backup42.desktop.CPDesktop main
SEVERE: Failed to launch CPDesktop; java.lang.UnsatisfiedLinkError: no swt-pi-gtk-3448 or swt-pi-gtk in swt.library.path, java.library.path or the jar file
java.lang.UnsatisfiedLinkError: no swt-pi-gtk-3448 or swt-pi-gtk in swt.library.path, java.library.path or the jar file

Solution: Install Java. Specifically the JRE version 1.5. Unlike this report here it has nothing to do with 32/64 bit conflicts, because it's a 32 bit machine. If you don't want to install Java, and its associated clutter, then you could try following the advice in the Crashplan readme file about running the UI locally and connecting to the remote crashplan service via the service port:

Remote GUI Config of CrashPlan on a shell account: What if you have a remote shell account on a box that has SSH access, but no X windows interface or GUI? We're going to show you how ...

Read more