How to install an HP LasterJet 1000 series printer on a Mac

This post will explain how I managed to install my 13-year-old HP LasterJet 1000 series printer on my MacBook Pro running OS X Yosemite version 10.10.2.

HP LaserJet 1000 series printer

I feel like I’m on familiar territory here with HP’s lack of legacy support for peripherals such as scanners and printers. See my popular post on How to install an HP ScanJet 2200c scanner on Windows Vista.

That was 7 years ago.

I still have the same printer and scanner and I’m determined to make them work. And stick it to the man. Even though my dad works for HP. Especially because my dad works for HP.

It’s worth the rigmarole, not just for the money you will save by not having to buy a new printer, not just because you will be defeating HP’s selfish and wasteful (but understandable for business reasons) built-in obsolescence, but because it will make you feel like this:

Success Kid: Just got my 13-year-old printer to work on a Mac: I am the fucking boss

I am hugely indebted to donthomaso’s post on the HP Support Forum thread download driver on mac 10.7.4 for HP Laserjet 1000, which linked to this set of instructions by The Daily Chu / chuck: HP Laserjet 1000/1005/1018/1020 on OS X Lion/Mountain Lion/Mavericks. Although I didn’t use them, these instructions for HP Laserjet 1000 on Mavericks also look pretty good and are a bit shorter than mine.

The main purpose of this post is not to take any credit but to make it easier for other users like me to find instructions that will work for them.

Here goes:

1) Install XCode from the App Store.
2) Open Terminal (by typing cmd + space and typing Terminal and pressing return - the first few letters are usually enough). Type xcode-select –install in the Terminal window to install the required command line developer tools.
3) Install MacPorts by installing the package file for OS X 10.10 Yosemite. Packages for other versions of OS X are available on the MacPorts installation page.
4) To confirm the installation is working as expected, open a new terminal window and type port version and press return. (I’m assuming you know that you need to press return after typing a command in Terminal, so I’ll stop saying that from now on…maybe.)
5) Run the following commands in Terminal to ensure MacPorts is up-to-date and install a few applications:

  1. sudo port selfupdate (you may need to type in your Mac password)
  2. sudo port install coreutils
  3. sudo port install wget
  4. sudo port install gsed

6) Install Foomatic-RIP. I used version 4.0.6 for for Mac OS X 10.3.x (Panther) – Mac OS X 10.9.x (Mavericks). At this point you may encounter a security warning message if your security preferences prevent you from installing apps from unidentified developers.

Mac security preferences warning screenshot
To fix this, open your Security & Privacy settings in System Preferences (by typing cmd + space and typing Security & Privacy and pressing return). Click the lock icon to make changes.
Click the lock to make changes
Type your Mac password if prompted. Click the radio button to allow apps to be downloaded from Anywhere.
Mac Security & Privacy settings screenshot
Leave this open for now because you will need it to allow other apps to be installed during this process. However, I recommend resetting it to Mac App Store and identified developers and re-closing the lock icon when you’re finished to keep your Mac more secure.
8) Install foo2zjs.
When I went through this installation process, I had missed out the step to install wget (see 5.3 above), so when I ran the wget command in step 8.2 below, it didn’t work. As with most things on computers, there’s more than one way to do it. Here’s how I did it:
I downloaded foo2zjs in my Chrome web browser from (which by default put it in my Downloads folder). I opened the zip file there by double clicking on it. I then typed cd in Terminal, added a space, and dragged the unzipped foo2zjs directory into the Terminal window to save me typing out the full path i.e. /Users/christopherwhalen/Downloads/foo2zjs where christopherwhalen is my Mac’s Home directory. Yours will be different, unless you’re also called Christopher Whalen (in which case, hi!). If you did it this way, you should now be in the foo2zjs directory, so skip to step 8.5 below.
But you can also download foo2zjs from the Terminal by typing the following commands:
  1. cd Desktop (to change to your Desktop directory)
  2. wget (to download the compressed file)
  3. tar -xzvpf foo2zjs.tar.gz (to extract it)
  4. cd foo2zjs (to change into the newly extracted foo2zjs directory)
  5. make (to compile foo2zjs)
  6. ./getweb 1000 (to download the HP LaserJet 1000 firmware file)
  7. sudo make install (to install foo2zjs)
  8. sudo make install-hotplug (to configure hotplug)
  9. sudo make cups (to restart the spooler if you use CUPS – nope, I have no idea what that does either, but I did it anyway, even though it appears to be optional).
9) Add the printer via Printers & Scanners in System Preferences (type cmd + space and start typing Printers & Scanners), but do not close Terminal just yet. Click on the + then choose HP LaserJet 1000 and it should automatically load the HP Laserjet 1000 Footmatic/foo2zjs in the Use field.

Add a printer on your Mac screenshot

Click on Add to add the printer.

Mac printer settings for HP LaserJet 1000 screenshot
I think after that, my printer worked. Good ole chuck also suggests you run sudo lp -oraw /usr/share/foo2zjs/firmware/sihplOOO.dl in Terminal to upload the firmware to the printer. I get an error message saying lp: Error – unable to access “/usr/share/foo2zjs/firmware/sihplOOO.dl” – No such file or directory - but I’m not sure if that step is necessary anyway.
10) Finally, reset your app download security settings to Mac App Store and identified developers and re-closing the lock icon as described at the end of step 6 above.

You can now print out those Taylor Swift “Shake It Off” ukulele chords that were your primary motivation for installing your printer in the first place. (Oh. That was just me then.)
Give me a shout in the comments if this did or didn’t work for you. It was a kinda long and complicated process. I made some mistakes along the way, but I eventually got there. Please let me know if you think I’ve missed anything in the instructions above or if anything is not clear.
And good luck!

Sublime Text like fuzzy matching in Javascript

I recently implemented a Sublime Text like fuzzy matching for my encrypted notes app. Fuzzy matching is a really nice feature that I haven’t seen used outside of code editors.

If you haven’t used Sublime Text, the fuzzy matching is used to quickly open files. Rather than navigate directories in the UI – which can laborious – the open file dialogue uses the characters you type to filter a list of paths. Each character you type must match a character in the file path exactly once and and in the same order as they appear in the path. For instance the search “abgvi” would match “/application/blog/views”, as would “blgview”. The basic idea should work with any text, not just paths.

I fully expect a real Javascript programmer to do this in two lines (I’m a Python guy that has been faking Javascript proficiency for years).

My first thought in implementing this was regular expressions, but as well as matching I also wanted to highlight the matched characters in the list. That proved harder to do with a regular expression. Probably not impossible, but I’ll be honest with you; I gave up.

Turns out a non-regex solutions is simple enough, and plenty fast. Here it is:

function fuzzy_match(text, search)
    Parameter text is a title, search is the user's search
    // remove spaces, lower case the search so the search
    // is case insensitive
    var search = search.replace(/\ /g, '').toLowerCase();
    var tokens = [];
    var search_position = 0;

    // Go through each character in the text
    for (var n=0; n<text.length; n++)
        var text_char = text[n];
        // if we watch a character in the search, highlight it
        if(search_position < search.length &&
          text_char.toLowerCase() == search[search_position])
            text_char = '<b>' + text_char + '</b>';
            search_position += 1;
    // If are characters remaining in the search text,
    // return an empty string to indicate no match
    if (search_position != search.length)
        return '';
    return tokens.join('');

The above function matches a title / path etc. with the search query. If it matches, it will return the text with the matched characters wrapped in <b> tags, otherwise it returns an empty string.

I put together a demo that gets a list of links from Reddit and gives you a text box to do the fuzzy matching:

View the source if you want to know more, there are some helpful comments.

Damon Galgut – Arctic Summer (2014) review

“And it had come to him then that there might be many men like them, in the past as well as the present, who had been together in a similar uncelebrated way, encircled by invisible emotion.” Damon Galgut, Arctic Summer In recent years, the life of E.M. Forster has been re-examined through the lens of […]

Short story: Dinner at the Eliots’

Dinner at the Eliots’ is a short story I wrote as an entry for the Jeremy Mogford Prize for Food and Drink Writing, an annual short story competition run by the FT Weekend Oxford Literary Festival. Sadly my piece wasn’t shortlisted – so I thought why not share it on my blog rather than let […]

New Encrypted Notes Web Application

The last two weekends I scratched a web development itch. I’ve been using KeepNote to store notes for years now. It’s a nice simple desktop app, which I use to store details such as past addresses, account numbers, phone numbers etc. And more sensitive information like PIN numbers and passwords.

I configured KeepNote to store notes in Dropbox so that I don’t risk losing anything. This has worked quite well, but I’ve always been frustrated that (a) I can’t access my notes on my mobiles devices, and (b) I’m relying on a third party to keep my secrets.

My answer to this is a web application that stores notes on a server, but does the encryption in the browser (i.e. with Javascript). That way, there is no need to trust the provider. I’m not the first person to think of this (try having an original idea these days), there are some pretty good implementation of this idea. But I wanted something that is self-hosting, i.e. I could install on my own server, and I had some ideas about how the user interface should work.

In particular, I wanted to implement Sublime Text‘s fuzzy search. Essentially this allows you to filter the list of notes with a few key presses. For instance, if I have a note entitled ‘Social Security Number’, I can find it by typing ‘SSN’ or ‘SocSecNum’.

The site is currently live. Feel free to create a new encrypted notebook, but be aware that it is just for testing. Please don’t use this to store the PIN number for your safety deposit box, or missile launch codes just yet. I will likely wipe the DB at some point.

I’ve create an test notebook which you can play with here:

Passphrase is: “where there is a will”

To be honest, I’m not sure what would happen if more than one person is editing a notebook at a time – but feel free to try it out.

The code is available on GitHub. I’m no cryptography expert, so I would appreciate someone who is to review the code…

Upstairs Inferno (2015) official trailer

A new documentary, directed by Robert L. Camina, examines one of the worst mass killings of LGBT people in America’s history. In 1973, 32 people died after a New Orleans gay bar – The Upstairs Lounge – was set on fire by an arsonist intent on killing the innocent men and women inside. This terrible crime, for […]

Tuesday Treat – Lie In

During the week, my alarm goes off at 6am. 6am. It makes me feel a little bit tired just thinking of it! But that does mean that anything beyond that, even 6.30, is classed as a lie in. So on my day off or at weekends, it doesn’t take much for me to have a […]

Bollocks to this (HTC One M8)

Dear Mr & Mrs HTC, Thank you so much for letting me play with your offspring, the HTC One M8 (do we say ‘em-eight’? Or do we pronounce it in text-speak as ‘Mate’?). The last two weeks of M8 experience have been, on the whole, mediocre. I’ve loved playing with … Continue reading

A Year of Moments with Candy Pop and Lobster & Swan ~ March

Floral by Candy PopHappy March and welcome to the third month of A Year of Moments.With the snowdrops beginning to show their faces we decided to make this month’s theme floral. To join in all you need to do is upload your photograph to Instagram inclu…

Blogathon 28/15 – winding things up

Tomorrow is Dewi Sant. Saint David’s Day. March 1st. And that means that this year’s Blogathon is at an end. Highs and lows, from my perspective? The deepest low was when I was so tired I could barely string a few words together. There have been several highs. BT Openreach … Continue reading

Tab Hunter: Confidential (2015) official trailer

A new documentary showing at SXSW charts the life and career of one of Hollywood’s first heartthrobs, Tab Hunter. Directed by Jeffrey Schwarz and featuring in-depth interviews with the actor, as well as Golden Era luminaries such as Clint Eastwood, George Takei, Debbie Reynolds, and Robert Wagner, this new film focuses on the difficulties Hunter […]