Barcodes can be pretty mystifying from the outside, if all you’ve got to go on is a set of lines and numbers, or even magic incantations for the software that produces them.

Despite working at a place where we produce a product with a new barcode every day, I didn’t understand how they were made up for years.

But they’re fairly straightforward, and once you know how they work it’s quite simple to produce them reliably. That’s important because getting a barcode wrong can cause real problems.

Barcode problems

In the case we’ll look at here, daily newspapers, an incorrect barcode means serious headaches for your wholesalers and retailers, and you’ll likely and entirely understandably face a penalty charge for them having to handle your broken product.

I know because, well, I’ve been there. In our case at the Star there were two main causes of incorrect barcodes, both down to people choosing:

  1. the wrong issue number or sequence variant;
  2. the wrong barcode file.

We’ll talk about the terminology shortly, but we can see how easily problem number one can occur by looking at the interface of standard barcode-producing software:

A screenshot of the interface of Agamik BarCoder, a good barcode-producing application

Now, Agamik BarCoder is a nice piece of software and is very versatile. If you need to make a barcode it’s worth a look.

But look again at that interface — it’s not intuitive what you need to do to increment from the previous day’s barcode, the settings for which are saved in the application. It’s very easy to put in the wrong details, or accidentally reuse yesterday’s details.

Second, it produces files with names such as ISSN 03071758_23_09 — a completely logical name, but the similarity between the names and the fact you have to manually place the file on your page makes it easy to choose the wrong barcode, whose name will likely differ only by one digit to the previous day.

That isn’t helped by Adobe InDesign by default opening the last-used folder when you place an image. At least once, I’ve made the barcode first thing in the morning and accidentally placed the previous day’s barcode file.

One of the suggestions we had after we printed a paper with the wrong barcode was to have the barcode checked twice before the page is sent to the printers. This is an entirely sensible suggestion, but I know from experience that — however well-intentioned — “check x twice” is a rule that will be broken when you’re under pressure and short-staffed.

It’s far more important to have a reliable production process so that whatever makes it through to the proofreading stage is certain to be correct, or as close as possible.

We can understand this by looking at the hierarchy of hazard controls, which is useful far outside occupational health and safety:

An illustration of the hierarchy of controls, to reduce industry hazards, which has at the top (most effective) the elimination of hazards, followed by substitution, engineering controls, administrative controls and then finally (and least effective) personal protective equipment.

“Check twice” is clearly an administrative control — changing the way people work while leaving the hazard in place. An engineering control in our case might be to have software check the barcode when the page is about to be sent to the printers (something we do on PDF export by inspecting the filename). We want to aim still higher up the hierarchy, eliminating or substituting the hazard.

But to reach that point we need to understand the components of a barcode.

Barcode components

Barcodes are used all over the place, so it’s understandable that some terms are opaque. But picking a specific case — daily newspaper barcodes here — it’s quite easy to break down what they mean and why they’re important.

The information here comes from the barcoding guidance published by the Professional Publishers Association and Association of Newspaper and Magazine Wholesalers. It’s a very clear document and if you’re involved in using barcodes for newspapers or magazines you should read it. (Really, do read it, as while I’ll try to bring newspaper barcodes “to life” below, there’s a lot of information in there that I won’t cover — such as best practice for sizing.)

Let’s start off by examining a typical newspaper EAN-13+2 barcode, using the terms that you’ll find in the PPA-ANMW guidance:

A diagram showing the components of a British newspaper barcode, using the EAN-13+2 format.

You’ll see at first that it’s clearly made up of two components: the largest is a typical EAN-13 barcode with a smaller EAN-2 on the right.

Reading left-to-right, we have the GS1 prefix to the barcode number, which is always 977 for the ISSN numbers assigned to newspapers and magazines.

Next is the first seven digits of the publication’s ISSN number — the eighth digit isn’t included because it is a check digit and is redundant because the EAN-13 includes its own check digit.

That check digit follows a two-digit sequence variant, which encodes some information about the periodical. On the right, above the EAN-2, is the issue number. This is used in different ways depending on the publication’s frequency.

Lastly is a chevron, which is used to guard some amount of whitespace on the right-hand side to ensure the barcode reader has enough room to scan properly. (The leading 9 performs the same function on the left.) This is optional.

In practice

Now let’s look at a real barcode, see which elements we have to think about, and how they fit together.

A diagram showing an annotated barcode as used by the Morning Star newspaper.

Now let’s start with the elements that were present on the basic ISSN barcode.

ISSN number

Your newspaper’s ISSN appears after the 977 prefix. The Morning Star’s ISSN is 0307-1758, but the 8 at the end of that is a check digit, used to detect errors in the preceding seven digits. This is removed because it’s unnecessary as the 13th digit of the EAN-13 is a check digit for all 12 preceding digits. So only the front seven digits of the ISSN appear in the bar code.

Sequence variant

For daily newspapers the sequence variant provides two pieces of information.

The first digit is a price code, which indicates to retailers what price they should charge. The code is dependent on the publication — you can’t tell from the price code alone what price a newspaper will be. For the Star, we currently use price codes 2 (£1) and 4 (£1.50).

The second digit is the ISO weekday number. Monday is ISO weekday 1, through to Sunday as 7.

So by looking at the sequence variant in this barcode, we can tell that it’s the paper for Wednesday (ISO weekday 3) and sells at whatever price code 2 corresponds to in the retailer’s point-of-sale system.

When you introduce a new price, typically you use the next unused price code. We recently increased the price of our Saturday paper from £1.20 (price code 3) to £1.50 (price code 4).

Issue number

The issue number appears above the EAN-2 supplemental barcode. For daily newspapers this corresponds to the ISO week containing the edition. Note that this may differ from, say, the week number in your diary. New ISO weeks begin on Monday.

Modern versions of strftime accept the %V format, which will return a zero-padded ISO week number. In Python the date and datetime classes have an .isocalendar() method which returns a 3-tuple of ISO week-numbering year, ISO week number and ISO weekday number.

Header strap

The line printed above the barcode is technically not part of the barcode itself, and different publications do different things. It’s common not to print anything, and for years we didn’t either, but I think it’s quite useful to print related information here to help whoever has to check the barcode before the page is sent for printing.

Note that in this example, all the information printed above the barcode is referred to in the barcode itself (except the year). I use this space to “decode” the barcode digits for human readers.

This was suggested to me by our printers (Trinity Mirror), who do something similar with their own titles.

Light margin indicator

Eagle-eyed readers will spot that the chevron used to guard whitespace for the barcode scanner is missing from the right-hand side. The PPA-ANMW guidance does urge that you include the chevron, but its absence as such won’t cause scanning problems.

It’s straightforward to guarantee enough space around the barcode by carefully placing it in the first place. Our back-page template reserves a space for the barcode, along with some legally required information, which is big enough to make the chevron unnecessary. You can see this in the image below:

An annotated photo of the barcode on a printed copy of the Morning Star, noting the space reserved around the barcode.

The main block of text on the left of the barcode doesn’t change. The date below it does, but it’s been tested so that even the longest dates provide enough space. (The longest date in consideration being the edition of Saturday/Sunday December 31-January 1 2022-2023.)

The superimposed purple lines show where the margins would appear in Adobe InDesign, with the barcode in the bottom-right corner. This section is ruled off above to prevent the encroachment of page elements, with the understanding that page items must end on the baseline grid line above the rule (which itself sits on the grid).

A photograph of a older style of Morning Star barcode, showing page elements in close proximity. A photograph of an even older style of Morning Star barcode, showing page elements in close proximity and a light margin chevron.

(As you can see from the smaller photos, this wasn’t always the case. The barcode often had page elements very close by, and did not have its own clear space. At this point, the barcode was also produced at a smaller size to fit within one of the page’s six columns.)

The “inside margin” on the right-hand side of the page (remember that the back page is in fact the left-hand page of a folded spread) provides an additional light margin. However, note that you still need an adequate distance from the fold itself:

“it is recommended that the symbol should not be printed closer than 10 mm from any cut or folded edge” (PPA-ANMW)

Our inside margin is 9mm, with the edge of the EAN-2 symbol roughly 1.5mm further in, for a total 10.5mm. While it appears that there’s bags of space, we’re still only just within the recommendations.

You might want to put the barcode on the outer edge of the back (the left-hand side) as the margin there is deeper (15mm in our case), but I would be very cautious about doing so. I’ve seen enough mishandled papers with bits torn off that I prefer the safety of the inside of the sheet.

You can see similar considerations at work when you look at how other papers place their barcodes. This example of the Sunday Mirror is quite similar to the Morning Star above, but rotated to make use of the more abundant vertical space:

A photograph of a barcode on the back of the Sunday Mirror, rotated so that it is placed sideways on the page.

(You can also see the use of a strap above the barcode, with the title name (SM, Sunday Mirror) and date (210517). I’m not sure what LO means, but it could mean London, if this is used as a way of identifying batches from different print sites.)

A photo of the barcode on The Times newspaper. A photo of the barcode on the Financial Times newspaper.

The Times and Financial Times also take this approach of cordoning off a space. Neither use a header strap (not unusual), though I am confused by the placement of the chevron in the FT’s barcode. It should be outside of the symbol area to reserve the space, though a lack of space is certainly not an issue.

Dedicating some space for the barcode is important because it means that there won’t be any compromises made day-to-day. You’ll want to take into account the recommended size and magnification factors in the PPA-ANMW guidance if adjusting page templates.

One of the changes we made was to abandon the reduced-size barcode (to fit within a page column), which then meant that something else was needed to fill out two columns to justify the space. But — as seen in the examples from other papers — it might be that having some amount of additional blank space around the barcode is an easy sell anyway.


Where these considerations really come in is when you automate the creation and setting of the barcode, because they can be thought about once, agreed and then left untouched as the system ticks along.

This gets us to the substitution level of the hierarchy of controls — we’re looking to do away with the hazard of human error in barcode creation, but ultimately we replace it with another hazard, ensuring that an automated system works correctly. We’ll return to this hazard briefly after taking a look at the automation program itself.

The code is available on GitHub. I won’t be including large chunks of it because it’s all fairly nuts and bolts stuff (and this post is long enough already!).

The structure is fairly straightforward. Like a lot of my more recent automation projects at work, it has an AppleScript user interface which passes arguments to a Python command-line program, which either performs some action itself or returns a value for use in the AppleScript program.

In this case, the Python program computes the correct sequence variant (price and weekday) and issue number (ISO week) — along with a human-readable header — and embeds them in a PostScript program that uses the brilliant BWIPP barcode library.

This PostScript is processed into a PDF file by Ghostscript, and the path to this barcode PDF is handed back to the AppleScript program so that it can embed it in a labelled frame in InDesign. (To embed files in an InDesign document you’ll need the unlink verb. Yes, I thought that meant “delete the link” at first as well.)

Here’s a diagram to show the flow through the program (forgive the graphics, I’m learning how to use OmniGraffle):

A diagram showing the flow of action through the ms-barcode application. An AppleScript UI takes input, Python organises the creation of the barcode (using BWIPP and Ghostscript) and then returns the barcode PDF file path to AppleScript, which then embeds it in an Adobe InDesign file.

Cloc tells me that the main Python file has a whopping 104 lines of code, and there are 264 lines of code in the related unit tests.

Really all of the heavy lifting is done by BWIPP, a cut-down version of which is included in the ms-barcode repository (just ISSN, EAN-13 and EAN-2). The entirety of my “own” PostScript is this (where the parts in braces are Python string formatting targets):

 1 %!PS
 2 ({bwipp_location}) run
 4 11 5 moveto ({issn} {seq:02} {week:02}) (includetext height=1.07)
 5   /issn / findresource exec
 7 % Print header line(s)
 8 /Courier findfont
 9 9 scalefont
10 setfont
12 newpath
13 11 86 moveto
14 ({header}) show
16 showpage

The bits that you may need to fiddle with, if you want to produce a different-sized barcode, are the initial location the ISSN symbol is drawn at (line 4) and height=1.07 on the same line.

You’d also want to adjust the size specified to Ghostscript, which is used to trim the resulting image — the arguments are -dDEVICEWIDTHPOINTS, and -dDEVICEHEIGHTPOINTS.

I don’t know enough about PostScript (or Ghostscript) to give good general guidance about getting the right size. My advice would be to start with what I have and make small adjustments until you’re heading in the right direction (which is exactly how I settled on the arguments currently in use).

What I would emphasise is that if you have trouble with the existing Python modules that wrap BWIPP, it’s not difficult to use the PostScript directly yourself. Really, look back at the 16 lines of PostScript above — that’s it.

Wrapping up

By automating in this way, we now have a method where the person responsible for the back page simply clicks an icon in their dock, presses return when asked if they want the barcode for tomorrow, and everything else is taken care of.

Going back to our earlier discussion of hazards, I think we’ve reached the substitution stage rather than the elimination stage.

We have eliminated human error in choosing the components of the barcode, but we’ve done it by substituting code to make that decision. That’s still a good trade, because that code can be tested to ensure it does the right thing.

And then, you can go back to not worrying about barcodes.

Last night, I treated myself to seeing the Colin Currie Group at Kings Place, and they were absolutely sensational.

It was quite the programme, with six pieces of Steve Reich’s music, and closed with a performance of Quartet, composed by Reich for Currie’s group.

I first heard Quartet on May 24 2016, when it was played with Mallet Quartet and Music for 18 Musicians, and quite honestly was desperate to hear it again. It’s magical, and I left last night tapping out bits of it on my leg on the way to the train station.

It wasn’t online, apart for a short clip, but last month a video of the group performing Quartet in full was posted to YouTube, and Nonesuch are releasing a recording of Pulse & Quartet (Pulse by ICE, Quartet by CCG) at the start of February.

The group are also releasing a recording of Drumming, which was as amazing to watch as it was to hear — I was sat right in line with the drums, and the effect of all four players drumming at once was stunning.

Last night was also the first time I’d heard New York Counterpoint (for clarinet) and Vermont Counterpoint (for flute) live, and they really opened my eyes, having sort-of ignored them before.

Really incredible stuff, all of it, start to finish. Reich’s compositions are brilliant, and I’m very thankful to be able to see a group dedicated to performing his work (for the third time now!).

Skype, a 117MB application (as of right now, on macOS at least), keeps a 340MB stash of emojis on your computer. What?

Clearing some space on my SSD today, I notice that Skype’s Application Support folder takes up over 600MB.

A screenshot of Daisy Disk showing Skype’s Application Support folder taking up 603.6MB

The Upgrade subfolder contains 230MB of old Skype versions, with the oldest dating back to late 2012. That’s a little odd, to keep a five-year-old version around, but fine.

A screenshot showing Skype’s Upgrade folder, containing five previous versions, with the oldest dating back five years.

How far we’ve come: Skype today is over five times the size it was five years ago.

Drilling down into the robjwells subfolder we find emo_cache_v2, accounting for nearly all the 370MB size of its parents. What’s inside? 5,138 emojis and animations. Here’s a taste:

Except that, unlike the super-low-quality version above, the original is 2.4MB and has a delightful reggae soundtrack to accompany its 17-second length.

5,000 of these things. There’s even a Forrest Gump one!

And you’d think “cache” means that “you sent this before, you might need it again” — but as far as I can remember I’ve only ever sent “standard” emojis on Skype. 🤷‍♀️

Postscript: If you delete all the mp4 and png files in that directory and then relaunch Skype, it will refill it — but with 3.5MB of animated png emojis.

Post-postscript: I changed the title to remove the emoji as some feed-reading services (like Feed Wrangler, the one I use), couldn’t handle 🤦‍♀️. Oh well 🤦‍♂️. (And, funnily enough, BBEdit doesn’t handle the “emoji + zero width joiner + modifier” as a single character. Unicode is hard.)

This originally appeared in the Morning Star of Thursday September 28 2017. The print version (large PDF version here) included photographs by Hackney Cyclist and the Ranty Highwayman, to whom I’m incredibly grateful, of people going about their everyday lives by cycle in the Netherlands — which I think absolutely made it.

It is thankfully now accepted that if we are to stand any chance of tackling climate change we must change the way we move people and goods around.

Most talk has been about replacing petrol and diesel cars with electrics. Even our Tory government — whose ministers have never encountered a deposit of fossil fuel they didn’t want to dig up and set on fire — has set a date from which the sale of new oil-burning cars will be banned. Never mind that it’s the hopelessly and meaninglessly far away year of 2040.

We have to stop burning oil because it’s killing the planet. And that will kill us and our entire species. But the certainty of swapping our oil cars for electric cars as the next logical step for transport neatly somersaults over a flaming Cheddar Gorge full of problems.

But it isn’t the only path open to us; a different one can help us tackle not only the climate crisis but also many health and social problems. Environmental expert Alan Simpson wrote in these pages in July that “sustainability has to turn economics [and its obsession with GDP growth] on its head, putting work, wellbeing, security and inclusion at the centre.”

In the same way that we can’t just install a few gigawatts of renewable power and call it a day, we must think differently and, crucially, have the political courage to pursue an alternative strategy that upends most of a century of transport orthodoxy.

We are certainly barreling towards an electric-car future: France also wants to halt oil-car sales from 2040, India and bits of Germany 2030, Norway 2025. People will buy electrics instead of petrol and diesel; they plug in at home instead of filling up at a garage. Simple, done.

This doesn’t quite work though. For one, manufacturing a new car emits roughly as much CO2 as what comes out of the exhaust during its lifetime usage. And the equivalent to the per-mile emissions varies depending on how clean the electricity grid is; in Britain most power is from burning gas, with some coal, nuclear and wind.

It is also going to take a lot of electricity if we switch en masse to electric cars. It’s difficult to comprehend the huge amount of energy used by cars because they use a separate, somewhat obscured form of distribution — petrol stations.

National Grid warned this summer that, even under optimistic estimates, charging the expected number of electric cars in 2030 will use up all of the power from the under-construction Hinkley Point C nuclear plant. And it could be more than double the plant’s capacity — and this is the most expensive single object ever constructed on the planet.

Electric cars still add to air pollution — small particulate matter from tyre and brake pad wear which is damaging to health.

But the real problem is not the kind of motors we run on our roads — it’s the fact that the private car is the dominant mode of transport. We live in a car-dependent society, with people in many communities often legitimately having no other option. Since the 1950s Britain has very deliberately planned and provided for private car use and our streets and our society reflect that.

Car-dependence is killing us. Partly through pollution, which shortens lives to the point that it’s equivalent to 40,000 excess deaths a year. Partly through the 1,800 people killed and 22,000 seriously injured each year in car crashes. But mainly by eliminating physical activity from people’s day-to-day lives.

In Britain more than half of adults don’t do the recommended 150 minutes of “moderate” activity (hoovering, mowing the lawn, walking at 3mph) or 75 minutes of “vigorous” activity (jogging, swimming, cycling briskly) a week. Six million middle-aged people walk for less than 10 minutes at a go a month.

The effects on our health are huge. Inactivity is the fourth largest cause of disease and disability and contributes to one in six deaths from any cause. Worldwide, sedentary lives and resulting illnesses kill 5.3 million people a year. NHS England boss Simon Stevens has called growing obesity — inextricably but complexly linked to inactivity — “a slow-motion car crash in terms of avoidable illness and rising healthcare costs.”

The direct cost to the NHS is well over £1 billion a year, and wider economic costs from sickness and early death £6.5bn. Then there are costs as we live longer but in worse health — the Barnet “graph of doom” shows that within 10 years the rising cost of adult social care will leave the north London council with literally no money to spend on any other services (save statutory children’s services).

But fitting exercise into already busy days is hard, which is where transport comes in — getting about under our own steam and taking advantage of the “miracle pill” that is physical activity.

With the government focus for the past 60 years on the private car as the way to get about, it’s no surprise that 62 per cent of trips and 78 per cent of distance travelled in Britain is by car.

Over two thirds of journeys are shorter than five miles — a distance that, given the right conditions, could be easily cycled in less than half an hour. Yet more than seven in 10 journeys between one and five miles long are done by car.

The domination of the car for even short journeys also provides the answer for why more people don’t walk or cycle — it is unpleasant almost everywhere in Britain. 59 per cent of people think the roads are too dangerous for them to cycle on. This is what’s known as subjective safety: the risk of being hurt is lower than perceived — though still far too high — but people feel unsafe and are put off.

Thankfully we know what the answer is: taking road space away from cars and providing protected cycleways, such as the ones that opened last year in central London, John Dobson Street in Newcastle, and bits and pieces in Brighton, Leicester and elsewhere. Or the ones you see everywhere in the Netherlands.

We know they work and people like using them — bikes now make up the majority of vehicles during rush hour on Blackfriars Bridge in London, in just one lane of space. Or take Seville in southern Spain, which built about 80 miles of protected cycleways and turned fewer than 5,000 cycle journeys a day in 2006 into 72,000 in 2012 — going from a 0.5 per cent share of trips to 7 per cent.

Cycleways turn bikes from a hobby for the fit and the brave into a quick, cheap and easy way to get around for everyone. In the Netherlands three quarters of children cycle to school — able to get around independently in complete safety.

The same applies for older people, where having an easy and safe way to get about keeps up people’s health and decreases their social isolation. The director of the Dutch Cyclists’ Union tells Peter Walker in his book Bike Nation that while people tend to drive less from their mid-seventies as they feel less confident, they then cycle more. Not for nothing do people refer to the conditions as fit for 8 to 80-year-olds (and beyond).

For disabled people too, cycling can be a good way to travel independently as well as keeping healthy, as Wheels for Wellbeing has made crystal clear. People with impaired mobility often find it easier than walking and many use a cycle as a mobility aid.

We must alter our streets before we can reap the benefits of this — the road layouts we’ve inherited from the 1970s just don’t cut it. As a nice bonus we can start to make our towns more pleasant places to be, reclaiming space for people rather than cars.

Won’t this cause traffic chaos? No. You can move about seven times as many people on bikes as in cars in the same amount of space, and reducing the space for cars causes some of the traffic to evaporate, instead of taking different roads.

Doing this is going to cost money — particularly if we adopt a national plan to make these benefits available in every community, as we should. But it will cost substantially less than building roads, as the government is doing despite the evidence against being clear on all fronts. A mile of top-notch cycleway costs about £2-3 million. That’s 26 times cheaper per mile than the M4 bypass and 79 times cheaper than Crossrail.

Labour’s pledge to spend £10 per person per year on cycling infrastructure is a start — but it is just a start. The Netherlands already has a comprehensive network but still spends about £25 per head. Public health experts have long called for 10 per cent of transport budgets to be immediately allocated to walking and cycling.

In the long run it could save us a good deal: $24 trillion worldwide by 2050 if just 14 per cent of urban journeys are done by bike by then — less than what is achieved today in the Netherlands and Denmark. That figure does not even include the money saved through improved health, which would be substantial.

And that is from cycling alone. The same UC Davis study shows that cycling alongside improvements in public transport and a decline in private car use would save the world $128trn by 2050 in comparison to continuing as we are now.

Such a scenario would also halve the carbon emissions of the business-as-usual case, putting us firmly on track to avoid utterly catastrophic climate change.

Electric cars do have a role to play in our future — but we must be aware of the associated risks to our health and the environment of widespread private motor use, and choose a more ambitious path that can transform our communities for the better.

It’s a real shame that O’Reilly have now closed their store and are now only making their books available to people who subscribe to their Safari service or buy worse versions from Amazon.

Over the past four-ish years I’ve spent roughly $250 on O’Reilly books, and they’ve been a great way to learn new technical topics. Learning Web Design by Jennifer Robbins made something I’d previously found intimidating into a straightforward and enjoyable endeavour. Earlier this year I spent some time learning SQL with the Head First SQL book by Lynn Beighley and really enjoyed it. At the moment I’m reading Mark Lutz’s Learning Python — starting from the basics and working through what is quite a thick book (1,600 pages!) to improve my Python skills and make sure I’ve got the fundamentals nailed down.

They’re all great. I love the PDF versions as they’re incredibly well-typeset and fit perfectly on an iPad screen. It’s been nice to learn in the garden, at the kitchen table, in bed — all much more comfortable than sitting at my desk. And they’ve been updated repeatedly since I bought them to fix typos and other errors — the Learning Python errata page lists nearly 170 entries and the book has been updated 15 times since the publication of the third edition in June 2013, most recently this April.

The thing is, I’ve bought these books at various times over the past few years and generally only dipped into them to start and then come back later. Working through one will generally take me several weeks or even months. This is perhaps my third crack at Learning Python — not because it’s bad (it’s great!) but because I already knew enough Python to be dangerous and getting through the earlier sections took time and patience that I’ve not had until now.

This is not something that the Safari subscription allows for — particularly when as an individual and a hobbyist programmer I cannot begin to justify the $400 a year price. It’s another world to buying a $40 ebook so you can learn a particular topic or skill.

And what of reference books and cookbooks? I own both the Python Pocket Reference and the Python Cookbook — PDFs that I can dip into at any time and together would’ve been just $52 at full price.

You can still buy paper and Kindle versions of O’Reilly books through Amazon, but the PDFs are gone. Buying weighty print books on programming topics is not something I want to do — although JavaScript: The Definitive Guide, Sixth Edition and AppleScript 1-2-3 serve well lifting my iMac up 4″. And the Kindle versions share the typesetting problems of O’Reilly’s ePub versions (now also unavailable to purchase) and introduce Amazon’s DRM restrictions.

The tagline on the O’Reilly homepage is “Safari is how you learn.” It makes me feel a bit crap, frankly, as I can’t afford a Safari subscription (nor could I justify it if I could) and I don’t want to buy an inferior product from a third party.

Sadly that means I won’t be able to learn from O’Reilly books in the future.