BitTorrent Magnet links for FreeBSD

Since the FreeBSD torrent tracker has been taken offline, and it appears that it won’t be coming back, you may be able to use a magnet link, so here they are. Each magnet link announces to three public trackers, to try and increase the size of the swarm.

Current FreeBSD versions

FreeBSD-7.4-RELEASE-amd64-all
FreeBSD-7.4-RELEASE-amd64-bootonly
FreeBSD-7.4-RELEASE-amd64-disc1
FreeBSD-7.4-RELEASE-amd64-disc2
FreeBSD-7.4-RELEASE-amd64-disc3
FreeBSD-7.4-RELEASE-amd64-docs
FreeBSD-7.4-RELEASE-amd64-dvd1
FreeBSD-7.4-RELEASE-amd64-livefs
FreeBSD-7.4-RELEASE-i386-all
FreeBSD-7.4-RELEASE-i386-bootonly
FreeBSD-7.4-RELEASE-i386-disc1
FreeBSD-7.4-RELEASE-i386-disc2
FreeBSD-7.4-RELEASE-i386-disc3
FreeBSD-7.4-RELEASE-i386-docs
FreeBSD-7.4-RELEASE-i386-dvd1
FreeBSD-7.4-RELEASE-i386-livefs
FreeBSD-8.3-RELEASE-amd64-all
FreeBSD-8.3-RELEASE-amd64-bootonly
FreeBSD-8.3-RELEASE-amd64-disc1
FreeBSD-8.3-RELEASE-amd64-dvd1
FreeBSD-8.3-RELEASE-amd64-livefs
FreeBSD-8.3-RELEASE-amd64-memstick
FreeBSD-8.3-RELEASE-i386-all
FreeBSD-8.3-RELEASE-i386-bootonly
FreeBSD-8.3-RELEASE-i386-disc1
FreeBSD-8.3-RELEASE-i386-dvd1
FreeBSD-8.3-RELEASE-i386-livefs
FreeBSD-8.3-RELEASE-i386-memstick
FreeBSD-9.1-RELEASE-amd64-all
FreeBSD-9.1-RELEASE-amd64-bootonly
FreeBSD-9.1-RELEASE-amd64-disc1
FreeBSD-9.1-RELEASE-amd64-dvd1
FreeBSD-9.1-RELEASE-amd64-memstick
FreeBSD-9.1-RELEASE-i386-all
FreeBSD-9.1-RELEASE-i386-bootonly
FreeBSD-9.1-RELEASE-i386-disc1
FreeBSD-9.1-RELEASE-i386-dvd1
FreeBSD-9.1-RELEASE-i386-memstick
FreeBSD-7.4-RELEASE-pc98-all
FreeBSD-7.4-RELEASE-pc98-bootonly
FreeBSD-7.4-RELEASE-pc98-disc1
FreeBSD-7.4-RELEASE-pc98-livefs
FreeBSD-7.4-RELEASE-sparc64-all
FreeBSD-7.4-RELEASE-sparc64-bootonly
FreeBSD-7.4-RELEASE-sparc64-disc1
FreeBSD-7.4-RELEASE-sparc64-disc2
FreeBSD-7.4-RELEASE-sparc64-disc3
FreeBSD-7.4-RELEASE-sparc64-docs
FreeBSD-8.3-RELEASE-pc98-all
FreeBSD-8.3-RELEASE-pc98-bootonly
FreeBSD-8.3-RELEASE-pc98-disc1
FreeBSD-8.3-RELEASE-pc98-livefs
FreeBSD-8.3-RELEASE-sparc64-all
FreeBSD-8.3-RELEASE-sparc64-bootonly
FreeBSD-8.3-RELEASE-sparc64-disc1
FreeBSD-8.3-RELEASE-sparc64-dvd1
FreeBSD-8.3-RELEASE-sparc64-livefs
FreeBSD-9.1-RELEASE-powerpc64-all
FreeBSD-9.1-RELEASE-powerpc64-bootonly
FreeBSD-9.1-RELEASE-powerpc64-memstick
FreeBSD-9.1-RELEASE-powerpc64-release
FreeBSD-9.1-RELEASE-sparc64-all
FreeBSD-9.1-RELEASE-sparc64-bootonly
FreeBSD-9.1-RELEASE-sparc64-disc1

Previous FreeBSD versions

5.5-RELEASE-alpha-all
5.5-RELEASE-alpha-bootonly
5.5-RELEASE-alpha-disc1
5.5-RELEASE-alpha-disc2
5.5-RELEASE-pc98-all
5.5-RELEASE-pc98-disc1
5.5-RELEASE-sparc64-all
5.5-RELEASE-sparc64-bootonly
5.5-RELEASE-sparc64-disc1
5.5-RELEASE-sparc64-disc2
6.1-RELEASE-alpha-all
6.1-RELEASE-alpha-bootonly
6.1-RELEASE-alpha-disc1
6.1-RELEASE-alpha-disc2
6.1-RELEASE-ia64-all
6.1-RELEASE-ia64-bootonly
6.1-RELEASE-ia64-disc1
6.1-RELEASE-ia64-disc2
6.1-RELEASE-ia64-livefs
6.1-RELEASE-pc98-all
6.1-RELEASE-pc98-disc1
6.1-RELEASE-sparc64-all
6.1-RELEASE-sparc64-bootonly
6.1-RELEASE-sparc64-disc1
6.1-RELEASE-sparc64-disc2
6.2-RELEASE-alpha-all
6.2-RELEASE-alpha-bootonly
6.2-RELEASE-alpha-disc1
6.2-RELEASE-alpha-docs
6.2-RELEASE-ia64-all
6.2-RELEASE-ia64-bootonly
6.2-RELEASE-ia64-disc1
6.2-RELEASE-ia64-disc2
6.2-RELEASE-ia64-docs
6.2-RELEASE-ia64-livefs
6.2-RELEASE-pc98-all
6.2-RELEASE-pc98-bootonly
6.2-RELEASE-pc98-disc1
6.2-RELEASE-sparc64-all
6.2-RELEASE-sparc64-bootonly
6.2-RELEASE-sparc64-disc1
6.2-RELEASE-sparc64-disc2
6.2-RELEASE-sparc64-docs
6.3-RELEASE-alpha-all
6.3-RELEASE-alpha-bootonly
6.3-RELEASE-alpha-disc1
6.3-RELEASE-alpha-disc2
6.3-RELEASE-alpha-disc3
6.3-RELEASE-alpha-docs
6.3-RELEASE-pc98-all
6.3-RELEASE-pc98-bootonly
6.3-RELEASE-pc98-disc1
6.3-RELEASE-sparc64-all
6.3-RELEASE-sparc64-bootonly
6.3-RELEASE-sparc64-disc1
6.3-RELEASE-sparc64-disc2
6.3-RELEASE-sparc64-disc3
6.3-RELEASE-sparc64-docs
6.4-RELEASE-pc98-all
6.4-RELEASE-pc98-bootonly
6.4-RELEASE-pc98-disc1
6.4-RELEASE-sparc64-all
6.4-RELEASE-sparc64-bootonly
6.4-RELEASE-sparc64-disc1
6.4-RELEASE-sparc64-docs
7.0-RELEASE-ia64-all
7.0-RELEASE-ia64-bootonly
7.0-RELEASE-ia64-disc1
7.0-RELEASE-ia64-disc2
7.0-RELEASE-ia64-disc3
7.0-RELEASE-ia64-docs
7.0-RELEASE-ia64-livefs
7.0-RELEASE-pc98-all
7.0-RELEASE-pc98-bootonly
7.0-RELEASE-pc98-disc1
7.0-RELEASE-pc98-livefs
7.0-RELEASE-powerpc-all
7.0-RELEASE-powerpc-bootonly
7.0-RELEASE-powerpc-disc1
7.0-RELEASE-powerpc-disc2
7.0-RELEASE-powerpc-disc3
7.0-RELEASE-powerpc-docs
7.1-RELEASE-ia64-all
7.1-RELEASE-ia64-bootonly
7.1-RELEASE-ia64-disc1
7.1-RELEASE-ia64-disc2
7.1-RELEASE-ia64-disc3
7.1-RELEASE-ia64-docs
7.1-RELEASE-ia64-livefs
7.1-RELEASE-pc98-all
7.1-RELEASE-pc98-bootonly
7.1-RELEASE-pc98-disc1
7.1-RELEASE-pc98-livefs
7.1-RELEASE-powerpc-all
7.1-RELEASE-powerpc-bootonly
7.1-RELEASE-powerpc-disc1
7.1-RELEASE-powerpc-disc2
7.1-RELEASE-powerpc-disc3
7.1-RELEASE-powerpc-docs
7.1-RELEASE-sparc64-all
7.1-RELEASE-sparc64-bootonly
7.1-RELEASE-sparc64-disc1
7.1-RELEASE-sparc64-disc2
7.1-RELEASE-sparc64-disc3
7.1-RELEASE-sparc64-docs
7.2-RELEASE-ia64-all
7.2-RELEASE-ia64-bootonly
7.2-RELEASE-ia64-disc1
7.2-RELEASE-ia64-docs
7.2-RELEASE-ia64-livefs
7.2-RELEASE-pc98-all
7.2-RELEASE-pc98-bootonly
7.2-RELEASE-pc98-disc1
7.2-RELEASE-pc98-livefs
7.2-RELEASE-powerpc-all
7.2-RELEASE-powerpc-bootonly
7.2-RELEASE-powerpc-disc1
7.2-RELEASE-powerpc-docs
7.2-RELEASE-sparc64-all
7.2-RELEASE-sparc64-bootonly
7.2-RELEASE-sparc64-disc1
7.2-RELEASE-sparc64-docs
8.0-RELEASE-ia64-all
8.0-RELEASE-ia64-bootonly
8.0-RELEASE-ia64-disc1
8.0-RELEASE-ia64-disc2
8.0-RELEASE-ia64-disc3
8.0-RELEASE-ia64-dvd1
8.0-RELEASE-ia64-livefs
8.0-RELEASE-pc98-all
8.0-RELEASE-pc98-bootonly
8.0-RELEASE-pc98-disc1
8.0-RELEASE-pc98-livefs
8.0-RELEASE-powerpc-all
8.0-RELEASE-powerpc-bootonly
8.0-RELEASE-powerpc-disc1
8.0-RELEASE-powerpc-disc2
8.0-RELEASE-powerpc-disc3
8.0-RELEASE-sparc64-all
8.0-RELEASE-sparc64-bootonly
8.0-RELEASE-sparc64-disc1
8.0-RELEASE-sparc64-dvd1
8.0-RELEASE-sparc64-livefs
8.1-RELEASE-ia64-all
8.1-RELEASE-pc98-all
8.1-RELEASE-powerpc-all
8.1-RELEASE-sparc64-all
FreeBSD-7.3-RELEASE-pc98-all
FreeBSD-7.3-RELEASE-pc98-bootonly
FreeBSD-7.3-RELEASE-pc98-disc1
FreeBSD-7.3-RELEASE-pc98-livefs
FreeBSD-7.3-RELEASE-sparc64-all
FreeBSD-7.3-RELEASE-sparc64-bootonly
FreeBSD-7.3-RELEASE-sparc64-disc1
FreeBSD-7.3-RELEASE-sparc64-disc2
FreeBSD-7.3-RELEASE-sparc64-disc3
FreeBSD-7.3-RELEASE-sparc64-docs
FreeBSD-8.1-RELEASE-ia64-bootonly
FreeBSD-8.1-RELEASE-ia64-disc1
FreeBSD-8.1-RELEASE-ia64-dvd1
FreeBSD-8.1-RELEASE-ia64-livefs
FreeBSD-8.1-RELEASE-pc98-bootonly
FreeBSD-8.1-RELEASE-pc98-disc1
FreeBSD-8.1-RELEASE-pc98-livefs
FreeBSD-8.1-RELEASE-powerpc-bootonly
FreeBSD-8.1-RELEASE-powerpc-disc1
FreeBSD-8.1-RELEASE-sparc64-bootonly
FreeBSD-8.1-RELEASE-sparc64-disc1
FreeBSD-8.1-RELEASE-sparc64-dvd1
FreeBSD-8.1-RELEASE-sparc64-livefs
FreeBSD-8.2-RELEASE-ia64-all
FreeBSD-8.2-RELEASE-ia64-bootonly
FreeBSD-8.2-RELEASE-ia64-disc1
FreeBSD-8.2-RELEASE-ia64-dvd1
FreeBSD-8.2-RELEASE-ia64-livefs
FreeBSD-8.2-RELEASE-pc98-all
FreeBSD-8.2-RELEASE-pc98-bootonly
FreeBSD-8.2-RELEASE-pc98-disc1
FreeBSD-8.2-RELEASE-pc98-livefs
FreeBSD-8.2-RELEASE-powerpc-all
FreeBSD-8.2-RELEASE-powerpc-bootonly
FreeBSD-8.2-RELEASE-powerpc-disc1
FreeBSD-8.2-RELEASE-powerpc-livefs
FreeBSD-8.2-RELEASE-sparc64-all
FreeBSD-8.2-RELEASE-sparc64-bootonly
FreeBSD-8.2-RELEASE-sparc64-disc1
FreeBSD-8.2-RELEASE-sparc64-dvd1
FreeBSD-8.2-RELEASE-sparc64-livefs
FreeBSD-9.0-RELEASE-ia64-all
FreeBSD-9.0-RELEASE-ia64-bootonly
FreeBSD-9.0-RELEASE-ia64-memstick
FreeBSD-9.0-RELEASE-ia64-release
FreeBSD-9.0-RELEASE-powerpc-all
FreeBSD-9.0-RELEASE-powerpc-bootonly
FreeBSD-9.0-RELEASE-powerpc-memstick
FreeBSD-9.0-RELEASE-powerpc-release
FreeBSD-9.0-RELEASE-powerpc64-all
FreeBSD-9.0-RELEASE-powerpc64-bootonly
FreeBSD-9.0-RELEASE-powerpc64-memstick
FreeBSD-9.0-RELEASE-powerpc64-release
FreeBSD-9.0-RELEASE-sparc64-all
FreeBSD-9.0-RELEASE-sparc64-bootonly
FreeBSD-9.0-RELEASE-sparc64-disc1
5.5-RELEASE-amd64-all
5.5-RELEASE-amd64-bootonly
5.5-RELEASE-amd64-disc1
5.5-RELEASE-amd64-disc2
5.5-RELEASE-i386-all
5.5-RELEASE-i386-bootonly
5.5-RELEASE-i386-disc1
5.5-RELEASE-i386-disc2
6.1-RELEASE-amd64-all
6.1-RELEASE-amd64-bootonly
6.1-RELEASE-amd64-disc1
6.1-RELEASE-amd64-disc2
6.1-RELEASE-i386-all
6.1-RELEASE-i386-bootonly
6.1-RELEASE-i386-disc1
6.1-RELEASE-i386-disc2
6.2-RELEASE-amd64-all
6.2-RELEASE-amd64-bootonly
6.2-RELEASE-amd64-disc1
6.2-RELEASE-amd64-disc2
6.2-RELEASE-amd64-docs
6.2-RELEASE-i386-all
6.2-RELEASE-i386-bootonly
6.2-RELEASE-i386-disc1
6.2-RELEASE-i386-disc2
6.2-RELEASE-i386-docs
6.3-RELEASE-amd64-all
6.3-RELEASE-amd64-bootonly
6.3-RELEASE-amd64-disc1
6.3-RELEASE-amd64-disc2
6.3-RELEASE-amd64-disc3
6.3-RELEASE-amd64-docs
6.3-RELEASE-i386-all
6.3-RELEASE-i386-bootonly
6.3-RELEASE-i386-disc1
6.3-RELEASE-i386-disc2
6.3-RELEASE-i386-disc3
6.3-RELEASE-i386-docs
6.4-RELEASE-amd64-all
6.4-RELEASE-amd64-bootonly
6.4-RELEASE-amd64-disc1
6.4-RELEASE-amd64-disc2
6.4-RELEASE-amd64-disc3
6.4-RELEASE-amd64-docs
6.4-RELEASE-i386-all
6.4-RELEASE-i386-bootonly
6.4-RELEASE-i386-disc1
6.4-RELEASE-i386-disc2
6.4-RELEASE-i386-disc3
6.4-RELEASE-i386-docs
7.0-RELEASE-amd64-all
7.0-RELEASE-amd64-bootonly
7.0-RELEASE-amd64-disc1
7.0-RELEASE-amd64-disc2
7.0-RELEASE-amd64-disc3
7.0-RELEASE-amd64-docs
7.0-RELEASE-amd64-livefs
7.0-RELEASE-i386-all
7.0-RELEASE-i386-bootonly
7.0-RELEASE-i386-disc1
7.0-RELEASE-i386-disc2
7.0-RELEASE-i386-disc3
7.0-RELEASE-i386-docs
7.0-RELEASE-i386-livefs
7.1-RELEASE-amd64-all
7.1-RELEASE-amd64-bootonly
7.1-RELEASE-amd64-disc1
7.1-RELEASE-amd64-disc2
7.1-RELEASE-amd64-disc3
7.1-RELEASE-amd64-docs
7.1-RELEASE-amd64-dvd1
7.1-RELEASE-amd64-livefs
7.1-RELEASE-i386-allv
7.1-RELEASE-i386-bootonly
7.1-RELEASE-i386-disc1
7.1-RELEASE-i386-disc2
7.1-RELEASE-i386-disc3
7.1-RELEASE-i386-docs
7.1-RELEASE-i386-dvd1
7.1-RELEASE-i386-livefs
7.2-RELEASE-amd64-all
7.2-RELEASE-amd64-bootonly
7.2-RELEASE-amd64-disc1
7.2-RELEASE-amd64-disc2
7.2-RELEASE-amd64-disc3
7.2-RELEASE-amd64-docs
7.2-RELEASE-amd64-dvd1
7.2-RELEASE-amd64-livefs
7.2-RELEASE-i386-all
7.2-RELEASE-i386-bootonly
7.2-RELEASE-i386-disc1
7.2-RELEASE-i386-disc2
7.2-RELEASE-i386-disc3
7.2-RELEASE-i386-docs
7.2-RELEASE-i386-dvd1
7.2-RELEASE-i386-livefs
8.0-RELEASE-amd64-all
8.0-RELEASE-amd64-bootonly
8.0-RELEASE-amd64-disc1
8.0-RELEASE-amd64-dvd1
8.0-RELEASE-amd64-livefs
8.0-RELEASE-amd64-memstick
8.0-RELEASE-i386-all
8.0-RELEASE-i386-bootonly
8.0-RELEASE-i386-disc1
8.0-RELEASE-i386-dvd1
8.0-RELEASE-i386-livefs
8.0-RELEASE-i386-memstick
8.1-RELEASE-amd64-all
8.1-RELEASE-i386-all
FreeBSD-7.3-RELEASE-amd64-all
FreeBSD-7.3-RELEASE-amd64-bootonly
FreeBSD-7.3-RELEASE-amd64-disc1
FreeBSD-7.3-RELEASE-amd64-disc2
FreeBSD-7.3-RELEASE-amd64-disc3
FreeBSD-7.3-RELEASE-amd64-docs
FreeBSD-7.3-RELEASE-amd64-dvd1
FreeBSD-7.3-RELEASE-amd64-livefs
FreeBSD-7.3-RELEASE-i386-all
FreeBSD-7.3-RELEASE-i386-bootonly
FreeBSD-7.3-RELEASE-i386-disc1
FreeBSD-7.3-RELEASE-i386-disc2
FreeBSD-7.3-RELEASE-i386-disc3
FreeBSD-7.3-RELEASE-i386-docs
FreeBSD-7.3-RELEASE-i386-dvd1
FreeBSD-7.3-RELEASE-i386-livefs
FreeBSD-8.1-RELEASE-amd64-bootonly
FreeBSD-8.1-RELEASE-amd64-disc1
FreeBSD-8.1-RELEASE-amd64-dvd1
FreeBSD-8.1-RELEASE-amd64-livefs
FreeBSD-8.1-RELEASE-amd64-memstick
FreeBSD-8.1-RELEASE-i386-bootonly
FreeBSD-8.1-RELEASE-i386-disc1
FreeBSD-8.1-RELEASE-i386-dvd1
FreeBSD-8.1-RELEASE-i386-livefs
FreeBSD-8.1-RELEASE-i386-memstick
FreeBSD-8.2-RELEASE-amd64-all
FreeBSD-8.2-RELEASE-amd64-bootonly
FreeBSD-8.2-RELEASE-amd64-disc1
FreeBSD-8.2-RELEASE-amd64-dvd1
FreeBSD-8.2-RELEASE-amd64-livefs
FreeBSD-8.2-RELEASE-amd64-memstick
FreeBSD-8.2-RELEASE-i386-all
FreeBSD-8.2-RELEASE-i386-bootonly
FreeBSD-8.2-RELEASE-i386-disc1
FreeBSD-8.2-RELEASE-i386-dvd1
FreeBSD-8.2-RELEASE-i386-livefs
FreeBSD-8.2-RELEASE-i386-memstick
FreeBSD-9.0-RELEASE-amd64-all
FreeBSD-9.0-RELEASE-amd64-bootonly
FreeBSD-9.0-RELEASE-amd64-disc1
FreeBSD-9.0-RELEASE-amd64-dvd1
FreeBSD-9.0-RELEASE-amd64-memstick
FreeBSD-9.0-RELEASE-i386-all
FreeBSD-9.0-RELEASE-i386-bootonly
FreeBSD-9.0-RELEASE-i386-disc1
FreeBSD-9.0-RELEASE-i386-dvd1
FreeBSD-9.0-RELEASE-i386-memstick

Installing sqlite3 ruby gem on FreeBSD

If you try to install (or update) the sqlite3 ruby gem on FreeBSD, you might get the following error:

sudo gem update sqlite3
Updating installed gems
Updating sqlite3
Fetching: sqlite3-1.3.5.gem (100%)
Building native extensions. This could take a while...
ERROR: Error installing sqlite3:
ERROR: Failed to build gem native extension.

/usr/local/bin/ruby18 extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal'
or 'yum install sqlite-devel' and check your shared library search path (the
location where your sqlite3 shared library is located).
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.

Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/usr/local/bin/ruby18
--with-sqlite3-dir
--without-sqlite3-dir
--with-sqlite3-include
--without-sqlite3-include=${sqlite3-dir}/include
--with-sqlite3-lib
--without-sqlite3-lib=${sqlite3-dir}/lib
--enable-local
--disable-local

Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/sqlite3-1.3.5 for inspection.
Results logged to /usr/local/lib/ruby/gems/1.8/gems/sqlite3-1.3.5/ext/sqlite3/gem_make.out
Nothing to update

The gem doesn’t include the correct locations to check for the sqlite3 headers, so we’ll have to tell it where to look ourself:

sudo CONFIGURE_ARGS="with-sqlite3-include=/usr/local/include" gem install sqlite3

Job done.

Netgear DGN1000 review

After an intermittent failure of my previous ADSL router, I thought long and hard about whether I could justify spending many hundreds of pounds on a nice Cisco 1800, I decided to go cheap and buy a bottom-of-the-range Netgear. After all, I’d had Netgear routers in the past, with few problems. So I bought the Netgear DGN1000.
The best thing about this router is that it has a power button. This is useful because you’ll be using it a lot.
The biggest problem with this router is that it randomly stops routing data between the WAN and the wireless network. Or sometimes it does route data, but at around 1Kb/s. Sometimes this failure to route data happens after several hours, sometimes it can happen within minutes. The only resolution is to reboot the router.
So apart from the constant failures, it’s fine. Except the automatic firmware update doesn’t work (it fails to recognise that there’s a newer firmware available), and WPS doesn’t appear to work at all.
This is the first piece of IT hardware I’ve ever felt like driving over in my car.
On this occasion I’ll return it as faulty instead.

Daily Mail corrects incorrect facts, but not the biggest ones

The BEA released a briefing about the loss of Air France flight 447 today. The flight involved a descent of 3 minutes 30 seconds, during which the aircraft was stalled. All 228 on board lost their lives. The briefing specifically says

the engines were operating and always responded to crew commands.

Earlier in the day, the Daily Mail published an article with the headline “Terrifying final moments of doomed Air France flight revealed: Passengers endured three-minute plunge before crash”, and the sub-headlines include “…engines began to fail…” and “…engines stalled…”, so it’s downright incorrect.

Screenshot of Daily Mail story
The early version of the story (thanks to istyosty.com)

Don’t worry though, because they’ve corrected it. The headline now says “FOUR MINUTE plunge”. Rounding up is better than rounding down, after all, and the use of capitals emphasises the difference. The sub-headlines mentioning engine failure are still there though. I wonder if it will ever be corrected.

Screenshot of Daily Mail story
The updated version of the story

To the Daily Mail – people in glass houses shouldn’t throw stones

The Daily Mail try to have a laugh at the expense of The Independent in this article.

The article points out that on The Independent’s site you can alter the URL as long as you retain the article number. Of course, The Independent “were embarrassed”. Ho ho, we’re The Daily Mail, other newspapers aren’t as good as us and all that…

I wonder if the journalist who wrote the article (it’s not even credited to Daily Mail Reporter) thought to try it on the Mail’s website.

http://www.dailymail.co.uk/sciencetech/article-1378504/This-paper-is-written-by-a-bunch-of-twunts.html

http://www.dailymail.co.uk/sciencetech/article-1378504/We-will-find-any-excuse-to-tag-a-story-with-kate-middleton.html

Well would you believe it?

As long as you retain the original URL up to the final “/”, and the “.html” at the end, you can put almost anything in between them (no spaces, no apostrophes) and you’ll be redirected to the original article.

My Ideal Operating System

What would my ideal Operating System look like?

  • Really small minimal installation. You know, like OpenBSD.
  • Thorough and comprehensive help pages. You know, like OpenBSD.
  • The ability to simply administer the OS remotely. You now, like SSH on OpenBSD.
  • Excellent, easy to configure firewall. You know, like pf on OpenBSD.
  • Easy to configure network redundancy. You know, like CARP on OpenBSD.
  • All communications between servers to be on well-determined ports.
  • Easy to manage centralised authentication. You know, like Active Directory on Windows.
  • Redundancy of authentication servers. You know, like Active Directory on Windows.
  • Automatic replication between authentication servers. You know, like Active Directory on Windows.
  • Automatic discovery of authentication servers using a simple system like DNS. You know, like Active Directory on Windows.
  • The ability to configure settings on clients centrally. You know, like Group Policy on Windows.
  • The ability to manage disks in almost any way imaginable. You know, like Veritas Storage Foundation.
  • The ability to replicate disks between systems. You know, like Veritas Volume Replicator.
  • Easy to use clustering. You know, like Veritas Cluster Server.
  • The ability to simply install OS updates. You know, like freebsd-update on FreeBSD.
  • The ability to centrally manage OS updates across the organisation, downloading only once. You know, like WSUS on Windows.
  • Centralised logging.
  • Built-in monitoring of hardware sensors. You know, like sysctl hw.sensors on OpenBSD.
  • Everything monitorable by SNMP.
  • A clear support lifetime policy. You know, like OpenBSD.
  • And finally, I want it Open Source. You know, like BSD-type open.

Is that too much to ask?

The problem with renaming a model in Rails

So you’ve decided to rename a model in Rails. What could be simpler than renaming and editing a bunch of files? You make your edits in development, run migrations and so on.
There’s a potential issue you might hit though. Suppose you have model Foo, which you want to modify (e.g. add a column). So you create a migration with:
add_column :foo, :quantity, :integer
…and you run your migration.
Then you decide you want to rename the model to Bar. So you use rename_table in your migration, and rename and edit the appropriate files. All works beautifully.
Now you come to deploy, and it all goes wrong when you migrate the database, saying it can’t find the model. The reason? Well your first migration now refers to a model that doesn’t exist, because the new model file is in place.
The messy solution is to perform the migration yourself, by renaming the database table directly in the database.
The clean solution is to avoid making changes like this in the first place. I guess it’s an example of where “deploy often” can reap benefits.

Renaming a model in Rails

When renaming a model in Rails (2.3), there are a range of files you may need to change:

Create a migration to rename the database table:

(rename_table :oldname, :newname)

Rename the model.
Edit any associations in other models.
Rename the controller (if required)
Modify routes.rb
Modify any links in views.
Rename views.
Rename the model in controllers and views.
Rename and modify any tests.

Moral of the story – name your models correctly from the start. Keep them as generic as possible. This post came about because I initially had a model for appointments for training sessions, so the model TrainingSession was created. Then I needed to store appointments which were for a different type of session, but I kept the model name the same, as it was only seen internally, and used a named scope. Now I need to store appointments of any type, so having code referring to TrainingSession will still work, but it makes it counterintuitive to refer to generic appointments as TrainingSession.generic. Instead, Appointment.generic and Appointment.training are so much more logical.

Grumpy Old Men

I’ve long been a fan of BBC’s Grumpy Old Men. Almost everything that is complained about is something you can sympathise with. However, tonight, for the first time I noticed that they class Grumpy Old Men as being from 35 to 54 years old. Given that I’ve only got two years until I fall into this bracket, I’m not sure whether I should be offended by this, or actually feel a little bit proud.

Frustrating companies – Cisco

Cisco make plenty of networking hardware, ranging from the small stuff for small business (let’s ignore the Linksys stuff badges as Cisco for now), to the really big stuff, suitable for the busiest networks. Within each product type (routers, switches etc) there are many products. Each product can then have many different models, with differing hardware capabilities. Each model can then have several software levels, each unlocking differing levels of functionality. Each product can also have many accessories, such as interface cards for connection to different network types. In short, there’s a lot of choice, which gives a lot of flexibility, which is obviously a good thing. However, there’s almost no useful help for the uninitiated on Cisco’s website. If you have a simple requirement (e.g. wanting a router for small business with an ADSL interface suitable for the UK, which has both VPN and IDS capabilities), then there’s virtually nothing to help you. If you try to work it out on your own, you’ll need to spend a lot of time reading the product specifications a documentation on the Cisco website. Sadly all this information is scattered all over the website in what seems like a shotgun approach.
So if you’re a small business, and you’re time is too precious to spend doing all this research, then surely Cisco will have a range of partners who will be able to answer the question for you. Well yes, they have authorised partners, but you get the distinct impression that these are partners for people who want to implement a substantial network infrastructure, and are happy to spend five or six, or maybe even seven figure sums doing so. At least in the UK.
Cisco also seem to be missing a trick with Smartnet, their support service. Some companies push their support services from the moment you start looking at their products, which Canberra annoying if you don’t the additional support. With Cisco it’s almost the opposite. Their support offering does appear to be good (it has a reputation for being superb), although unsurprisingly it’s not the cheapest. However it barely gets a mention, and you virtually have to hunt for it on the website. Additionally, some products support a “call home” feature, where Cisco will proactively alert you to problems. If you don’t stumble across this by accident, then you probably never find out about it.
Finally, you know when you buy a Cisco product that it won’t be cheap, but £60 for a router rackmount kit, which consists of two pieces of bent steel and eight small screws really is taking the piss!