It's been a month now, and I ought to be used to it, and in many ways I am, but in surprisingly many ways I'm still not; I don't have a dog anymore. He got too old, and he got too sick, and tired, and uncomfortable, and he had to be put to sleep, back on the 28th of November. How does it feel? Terrible.
It was an enlarged heart that did for him. Poetically enough, his heart was just too large for him to carry on. The photo above is taken on the last morning, before I headed out to work. I knew there was very little chance he'd be coming back from the vet's appointment later that day. We had a little conversation and I carefully explained to him that he was a very good dog.
Of course he was actually a terrible dog. A brilliantly terrible one, as most dalmatians are born to be. He'd not really been himself for a couple of years, stumbling about and complaining about most things, but right up until the last couple of weeks he was coping mostly, and remained good company. In his prime though, that dog was an athlete, who used to literally fly, and if I open my mind's eye a little, that's what I can see, streaking around the Bristol countryside, barely controllable, raiding bins, and laughing at you, over his shoulder.
I don't really know what to write. I have to write something though. This website, which has been knocking around for fifteen years or more, only really took initial form as a rudimentary 'blog' so I could share dog photos with his burgeoning fanbase. Most of that has bitrotted now, but when I feel better I would like to clean it up some. So I can't really even let go of him without marking some notice here. I don't need to trot out all of the anecdotes, they're probably dull and too personal. After all, outside of my immediate circles, he's just some bloke on the internet's dog. To me, and to some of his internet fans though, he's the best dog in the world. Every single word of that is true.
I've been having persistent niggles with my home router / 802.11x base station / DSL modem. It's a D-Link DSL-2740B , itself bought as a replacement for my ISP-provided machine, an O2 wireless III (a re-badged Thomson SpeedTouch) which proved itself a low performer at both wireless and routing, and particularly dismal at doing both simultaneously.
I picked up the D-link cheaply, in a clearance bin in John Lewis. In most respects it has been a splendid replacement for the O2. WiFi is fast, routing is consistent, ADSL sync is better. However, it does have one stupid bug. It can't do DHCP reliably. After a certain period, it starts sending out broken leases to clients; either issuing them with IP addresses that are already in use, or more commonly issuing a working address, but nullifying the nameserver settings. A reboot will restore sanity, but involves an irksome couple of minutes of network outage. Afterwards it is only a matter of time before the problem re-emerges, noticeably quicker if there's an increased rate of new leases issued, such as a group of visitors armed with smartphones popping in.
I'm consistently amazed at how flawed home router appliances are. How anyone 'normal' is supposed to cope with these things, I have no idea. I've updated the firmware to the last available revision, fiddled with the limited options in the admin interface, to little avail. Web searches turn up a few people commenting on the same problem, but no solutions offered. This leaves me with three straightforward, yet unappealing options.
Buy another router. Either another toy one, which seems likely to smuggle in some fresh nugget of buried failure, or buy something more professional, and hence eye-wateringly expensive
Set up static configuration for every client. Seems a stupid solution in 2010 for a primarily wireless network
Disable DHCP on the router, and add another, more reliable DHCP server to the network
Option 3 initially seems least aggravating. In the past, my strategy for service infrastructure has always been using home servers, with some form of UNIX. These days though, I'm trying to minimise the number of computer-type devices I have to keep running 24/7. I no longer find any joy in being a home UNIX administrator, and it's nice to correspondingly reduce power consumption, fan noise, and cabling. So the idea of setting up a computer just to act as a DHCP controller is slightly repellant.
The only machine tethered to the network is a modest, first-generation, G4 mac mini . It's chief use in the past was as a basic freeview PVR, using Elgato eyeTV , but the London flat's TV reception is too poor for this, so it mostly acts as an AFP -capable network interface to my firewire Drobo . It's a very old, low power machine, but would certainly be capable of acting as a DHCP server.
It wasn't immediately obvious how best to do this. Obviously I could install any of the common free UNIX DHCP software, using MacPorts , or homebrew , or fink , or even just hand rolling something from tarballs, but all of these come with overheads, adding dependencies, requiring build tools, and subsequent package management, and all the little bits of service glue needed to make it run neatly as a daemon. Experience has shown me that integrating third-party UNIX services into a vanilla Macintosh can get fiddly, fast.
There's no obvious DHCP server component on desktop OS X, but there's a latent capacity somewhere, demonstrated by 'Internet sharing', which lets you easily set up a Macintosh with a network connection as a basic router. After a little bit of poking around with this, and some internet searching, I discovered that this facility is part of the bootpd service. It's documented, and after a little trial-and-error, I figured out a way to run a DHCP server facility only, using just the built-in Apple utilities.
Here's an overview of my network configuration
The D-link router provides NAT routed internet via O2 ( actually Be ) ADSL 2+ with a static IP.
The private subnet is 192.168.1.0/24
The router's internal address is set as 192.168.1.1
The mac mini is connected to the router via wired ethernet with an address of 192.168.1.4, and runs headlessly.
Everything else connects to the D-Link router wirelessly, using a mix of 802.11n and 802.11g
Here's how to set up bootpd to act as a DHCP server for this network.
First, configure the mac mini to have a static IP. Using screen-sharing from another Mac ( Cmd-K, vnc://192.168.1.4 ) to configure the network interface in system preferences.
Next, configure your computer to also have a static address on the same subnet. If you get something wrong, and need to troubleshoot settings, you'll still need to be able to connect between the router, the mini and your workstation. I picked 192.168.1.111, as being well outside the range of anything I'd expect to be routinely allocated.
Now you need to produce your bootpd config file ( /etc/bootpd.plist ). Unfortunately this means an XML property list. Every time I feel smug about how the Macintosh is re-invigorating UNIX with the old, crufty bad bits removed, I ought to remind myself about the maniacally stupid idea that is XML plists. Instead I thank my stars that I have a capable text editor. It's not that fearsome a property set, and is well explained in the man page , so you could build one by hand. An alternative approach, the one I used, would be to set up internet sharing temporarily on the mini for an interface you're not using; I chose firewire. Take a copy of the /etc/bootpd.plist file this will create, e.g. / etc/bootpd.plist.template , and then disable internet sharing again, which will remove the /etc/bootpd.plist file if it still exists. Now rename your template back to /etc/bootpd.plist and edit it.
The options are all well documented, and it turns out that you need hardly any of them to get up and running.
The key options are
dhcp_enabled: an array of network interface device names to answer dhcp requests on - I just have en0, which is the built-in ethernet
Subnets: an array of property dictionaries, that represent networks we're interested in serving. We only want a single dictionary for 192.168.1.0/24.
net_address: , is the network address - 192.168.1.0,
net_mask: the netmask for our subnet range - '255.255.255.0',
Next, create two empty files that bootpd expects to use. ' /etc/bootptab ', for any static address maps, and /var/db/dhcpd_leases , which will be a persistent database for issued leases. Now connect to the router, and disable it's DHCP server.
The bootpd binary lives at /usr/libexec/bootpd . If you run it from a terminal with a -d flag, it will stay in the foreground and emit debugging info to stdout. You'll need root privileges for it to run, I just used sudo /usr/libexec/bootpd . Now request a dhcp address from a different network client. I used an iPad. It's a good idea to make a note of the network MAC address. If everything is working, you should see some output acknowledging the request, and then some more as a lease is issued. The client should then configure it's network interface with all the settings from your Subnet definition above. If it doesn't, and the output isn't helpful enough, there's also a further -v switch for more verbose logging.
Initially I had trouble getting any leases issued although all requests were logged fine. It turned out I'd misconfigured the netmask when I set up the static address for the mini. If the network details don't match the defined subnet exactly, then bootpd will just fall back to default behaviour for the subnet, which is to just observe. Once I fixed that, things started working as they should. By default, a line is written to logs in /var/system.log for every request recieved, and one for every lease issued.
The remaining task is to configure the service to run as a daemon from launchd. Luckily, there is a launchd profile for bootpd present, /System/Library/LaunchDaemons/bootps.plist . You can install this persistently into launchd like so
Running sudo launchctl list should then show a com.apple.bootpd service enabled. If for some reason you need to disable it once again, you can uninstall the service using
It's been almost a year since I moved back to London. It seems like a year unusually blessed with snow. This morning, it was coming down thick and fast, and we had a freshly carpeted common, almost entirely to ourselves, aside from a handful of other dog walkers.
/flickr]
Snowballing a dog never loses it's appeal. He constantly appeals for you to throw one. The most fun is lobbing them skywards, in an easy parabola, giving him plenty of time to position himself below the descent, for an ariel catch. These are accompanied by a loud grunt, then a rough landing, wildly shaking the snow from the face. Then straight back into appealing for another.
The other day at work , prompted by a shoutbox conversation with one of our users , I did a little bit of exploring some of the artist catalogue data. The idea was to find band names that were repeating words, such as ' Talk Talk ' and ' The The '. Coincidentally, I had a freshly installed database server with just this sort of information on it, and needed a good excuse to stress test it a little. PostgreSQL's regular expression support is brilliant , and it was a very trivial exercise to quickly knock up a query that returned promising data. In the process of refining it, I got a chance to play around with the Hadoop cluster. I wrote the whole thing up over on the company blog, if you'd like further details. Fame fame fatal fame, it can play hideous tricks on the brain, as the song goes .
I'm heroically committed to a program for keeping the dog off the majority of the household furniture. My strategy is thus; I have one (wipe clean!) sofa I don't actively discourage him from clambering on. The majority of the time, he sleeps on this overnight, even though to my eyes his basket seems as if it would more comfortable.
When the wintertime arrives, and the nights get colder, he's not so keen on an unadorned sofa. I can tell this because he starts to seek out nesting opportunities in more upholstered regions. The way that I combat this is to pile up a few cheap throws or blankets on the permitted sofa, which gives him something to nest in. Of course, the actual, correct, dog-basket is padded, upholstered, lined with welcoming cushions and blankets, and positioned in front of a good radiator, but somehow none of that seems to matter. It's all about perceived status with dogs, and so far as he's concerned, sofas are extremely swanky real estate.
To try and keep the winter sofa throws looking less manky after a couple of nights, I've tended to buy woollen ones. Light coloured rough wool doesn't show up the dog hairs so badly. In my heart, I think that I'll source them from local charity shops, but in practice they never seem to have anything suitable, so usually I end up buying them from shops, as cheaply as I can manage. Every once in a while, if they're looking particularly tired, I recycle the blankets in the rag box. The rough fibres are a too successful hair-trap; I wouldn't consider letting them near my washing-machine's expensive German filters, and I'm too lazy to clean them by hand. Then I buy some fresh ones, and restart the whole cycle.
Which leads into the current ridiculous state. IKEA is a particularly useful source of very cheap and fairly durable blankets, and it's only a few minutes walk down the road. This time I was wondering about experimenting with something a bit more sustainable, a fabric I could more easily clean, using our wonderful new VAX , with it's miracle pet-hair removal tool (which is actually the stripped floorboard tool I think, the 'pet' edition of the same cleaner was more money for the same suction).
I strode around a spookily empty IKEA (daytime, recession, Christmas panic shoppers busy elsewhere, wonderful!) trying to decide between a handful of different less-than-a-fiver options. I was suddenly flummoxed to encounter pile of somewhat rudimentary, lightweight double duvets selling for £2.78. A preposterous new plan quickly formed.
And so I bought a duvet for my dog. We put a cover on it from our store of past-it's-best bed-linen, and arranged it on the sofa. He seems very happy with it, but I can't help feeling some sort of key principle of domestic husbandry has been roundly subverted.
Yesterday at work , I had to clean after up a particularly freaky Slony-I replication fault. I still haven't managed to understand quite what went wrong there. So this morning, I arrived at work in full diagnostic mode, jokingly grumbling about 'howfuckedismydatabase.com'. Laurie was particulary amused by this curmudgeonly joke, and we bantered about it. I pitched a few ideas about how such a joke site might operate, and we left it there and moved on.
Except Laurie didn't. Despite my attempts to dissuade him, he registered the domain, and started knocking together some pages based on the earlier jokes. I chipped in a couple more suggestions, and suggested some error messages, and within twenty minutes or so he had an operational site . Then we shared it with a couple of like-minded people, and left it be. A few of the other people at work passed it around, and a couple of people submitted it to reddit.
Within an hour or so things had started to really snowball. One of the reddit submissions gathered hundreds of upvotes, and for a period of time we were the number one story on hacker news . Laurie added a twitter button and a comment form to the site, and retweets and emails started accumulating fast. By mid-afternoon the site was approaching 200 hits a second, which it handled with aplomb, because he had coded it efficiently, and configured the server sensibly.
It felt great to watch so many people comment positively about some of my dumb jokes, pretty much in real time. It gave me a really direct experience of something I'd always innately understood about the internet, but had not yet witnessed close to home; the ability to quickly reach an appropriate audience for almost any content, regardless of how specialised. Our little shared joke quickly reached out to thousands of people, who found something within it they also related to. This really amazes me.
It also showed me something about my own character. While I was perfectly happy to joke about the idea, it needed somebody like Laurie, with the skill and enthusiasm to pick up on it and make it into something tangible and exciting. I'd instinctively shied away from broadcasting it further than my desk, and my initial reaction was that developing it any further would be a waste of time and money. I was very wrong about that, it turned out to be an interesting experience, and enormous fun. I think this means I should endeavour to be a little less cynical.
I ran into some problems while I was trying to install python bindings for the Growl notification framework on my MacBook Pro. My Mac is running the current release of Snow Leopard ( 10.6.4 ) and I'm using a python.org installed binary package of python, under /usr/local/python. Building using distutils and the supplied setup.py failed, seemingly because the compiler was unable to find quite routine include files, such as stdarg.h and float.h .
/Developer/SDKs/MacOSX10.4u.sdk/usr/include/stdarg.h:4:25: error: stdarg.h: No such file or directory
This error message both confused and perturbed me, because stdarg is a fairly fundamental component of a working C library, and I am pretty certain that my compiler isn't that fundamentally broken.
Picking apart the build output from the generated Makefile, I see that it is setting the -isysroot gcc flag, to /Developer/SDKs/MacOSX10.4u.sdk/ . I presume this is because the python installation is built to use the OS X 10.4 compatability SDK. This is why it's pulling in /Developer/SDKs/MacOSX10.4u.sdk/usr/include/stdarg.h . That header is a stub, and included the following stanza
/* GCC uses its own copy of this header */ #if defined(GNUC) #include_next
#include_next is a gcc extension to cpp, and instructs the preprocessor to start searching for the include file again starting with the next directory on the include path after this one. Standard libraries like stdarg and float can be quite compiler specific, and as the comment indicates, GCC is expected to have it's own copy of this header file, which would be put away somewhere under /usr/lib/gcc .
At this point, a nagging memory of building cocoa apps with XCode resurfaced, suggesting that the 10.4 SDK isn't compatible with gcc-4.2 ( the system default gcc under snow leopard ). GCC 4.0 is supplied though, for use with building against legacy SDKs. On this whim, I tried exporting CC=/usr/bin/gcc-4.0 and rebuilding, and everything worked as it should.
From inspection, it seems like the snow supplied leopard python is built to use 10.6 SDKs and gcc-4.2 and may well be a more sensible python to use. Further googling ducking , turned up this bug report .
Something extraordinary happened during a routine walk last week. The walk itself was hardly unusual, aside from the unseasonably fine weather. The route was a well-rehearsed number from our small repertoire of standards; out along Fishponds road up to Eastville park, follow the river to the park's end, then reverse your way back for the return.
It was early in the evening as we set out, and before we had reached the end of our street I realised that I'd left my mobile phone and wallet back on my desk. Although I don't like to leave without either, I reasoned that I didn't particularly need them on this day, and I didn't feel like nipping back. We had the house to ourselves that evening, nobody else would be home until late. Shopping opportunities are fairly limited in Eastville park, so we could probably get by on the couple of coins I had in my pocket.
The dog was having one of those spells when he feels that everything has to be inspected with great care. Every so often this mood catches him and he needs to patiently smell and catalogue things we pass in far greater than usual detail before we can continue. I'm not really sure of the cause of this. It sometimes seems to be precipitated by a change in the weather. A sudden cold snap is certain to bring it about, for example. This evening was not cold at all, although it was unusually humid. So we proceed, at a very leisurely pace, him dawdling with his forensic investigations, me idly speculating about the effects different atmospheres might have upon his primary perception.
One of the more successful methods I've managed to install for regaining his attention, is an ordinary whistle. Over time, via the usual methods of reward and repetition, I've taught him to associate a particular sequence, three short pipes on a whistle, with a food reward. It works well enough to use as an effective recall signal. One of the advantages conferred by a whistle is it's neutral tone; dogs are great readers of context and tone-of-voice can convey a lot of subtext about the caller's intent. Not so the mechanical whistle.
So I keep a selection of whistles bound to my keyring, and on evenings like this, where I am likely to keep striding ahead of the hardworking nasal detective, they can see a lot of action. Even so, we maintained our slower than average pace, we had no reason to hurry.
My fetish for luggage had led me to recently acquire a small Crumpler shoulder-bag, discounted in a shop-sale. I love Crumpler gear. Despite a tendency towards the garish and zany, I think it's well thought out and robustly constructed. I suppose this bag is intended to be a roomy camera case, but I've put it to use as a carry-all for the dog-walking equipment. Recently I had realised there was enough room to stow a tennis ball alongside the rest of the usual baggage, and so when we reached the quiet meadow at the far end of our route we amused each other by throwing a ball around and chasing it for ten minutes.
The dog seemed to have exhausted his investigative enquiries, for on the return route he stayed close to my heel. It was only when we approached the start of the riverside path that he chose to wander into the bushy borders, causing me to reach for the whistle, and realise that I no longer seemed to have it in my possesion. Not only the whistle, I'd managed to lose my entire keyring.
It was one of those moments of precise clarity that can be germinated by a stab of sudden near-panic. All the doors and windows at home were locked, and nobody would be home until perhaps midnight. No telephone, and it's been years since I bothered to memorize any phone numbers. No money either. I was mentally chasing through my limited options.
The best bet would be finding my keys. A large, silver bunch, assuming I'd dropped them shortly after digging out the whistle, I might be able to find them still close to where they fell. Luckily, I'd not strayed from the path, and the park was quiet, I ought to be able to retrace my steps quite thoroughly without rushing to get there before somebody else spotted them.
And so we proceeded, this time with our roles reversed; myself intent, studying the floor and poking into vegetation, him following, curious about my peculiar, unfathomable ways.
As we lucklessly progressed, I did my best to not dwell upon the negative outcome. Slowly we headed toward the end of our searchable area. We'd spent a while arsing about in the meadow, the wilder grass there was eight or more inches long. If the keyring had dislodged as we capered, nothing short of a fingertip search would turn anything up. The keys would lie there, probably undisturbed until the field received it's annual trim, probably next spring. There is a path bisecting the unruly meadow. If I was lucky, they'd have fallen on or near this, and there would be a chance of spotting them
It was not to be. I made a couple of half-hearted sweeps across the grass, roughly in the areas I imagined we'd been running through, maybe an hour previously. I scanned for reflections, or hints of depression that might indicate a dropped weight. It was a hopeless task. Gathering my thoughts, I tried to come up with a scheme to keep myself and an unfed dog occupied and outdoors for the next seven or eight hours. I couldn't be sure that it wouldn't rain.
And then a desperate idea seized me. I looked at the dog, sitting close by, extremely taken by my unusual behaviour. He seemed to be expressing curiosity as to my motive. I dug into my pockets and retrieved the keys to my other house and showed them to him up close. "Find the keys!"
He stuck his nose on the floor and zig-zagged aimlessly across the grass for a couple of minutes, before coming to a halt about twenty yards away. As I went over to collect him, I could see that he was wagging his tail, and staring at the floor.
It wasn't until I was standing right next to him that I could precisely tell that his nose was directly indicating my lost keyring, where it lay hidden beneath the long grass. I was amazed. For his trouble, I emptied out the entire stash of biscuits from my bag, making a small pile.
Leopard introduced a number of system level changes to font handling. There's a system daemon, fontd that handles runtime font registration. Some of the new features that are implemented include on-demand font activation, on a per-application basis and system font-protection, which guards against removal or disabling certain fundamental system fonts.
There's a couple of situations where you might need to interface with the font registry database. Sometimes the system font caches can become garbled, and require a manual flush - before leopard these could be easily found under /Library/Caches/com.apple.ATS - now they're squirreled away under /var and managed by fontd. Font protection might stop you from legitimately manipulating certain font files; in a prepress environment you might need to replace one of the magic System protected fonts with a custom version.
There's a command line utility provided, called ' atsutil ' which offers a user interface to these features. It has a fine man page .
To purge the font caches, which will fix persistant text rendering problems, you use the command atsutil databases -removeUser
To display the list of System protected fonts use the command atsutil fontprotection -files .
To globally disable the font protection feature, use the command atsutil fontprotection -off . Re-enable it with the -on switch.
Don't remove system protected fonts , unless you are replacing them with a workable substitute.
It's been a while since any dog updates, so here's some brand new shots. For some funny reason, it's only when I'm looking at photographs that I find it really shows how grown up he is now. There's barely a trace of the puppy to be found here. Of course, the fact that he's enjoying some late summer sun, not capering like a loon, assists with this new found air of maturity.
3. On a nearby OS X Leopard notebook, setup a new bluetooth serial port, type RS232. ( System preferences -> Bluetooth -> Advanced ). Call it something like 'Bluetooth-console'. Ensure the Mac is paired with the phone.
4. In a terminal, run ' screen /dev/tty.Bluetooth-console '
5. Set your Mac's bluetooth to 'discoverable'
6. Launch the Python application you've just installed on your phone. Select Options -> Bluetooth Console -> Other. Choose your Mac, and then select the Bluetooth-console serial port as the device.
7. Meanwhile, back on the Mac: a python shell will start in your screen session after a small delay.
8. In the python session, " import audio "
9. In the python session, " audio.say('I never realised my phone had a built-in speech synthesizer') "
I often travel with a laptop. I almost invariably travel with a charged mobile phone. I enjoy using the fancy multi-touch trackpad in my MacBook Pro, but an odd thing happens sometimes when I've put my phone down nearby on the desk; I reach automatically to try and use the phone as a computer mouse. One of those amusing peculiarities of muscle-memory and reflex that can surprise, when you're engaged by something, within the computer, verging upon a liminal state.
It's a slightly amusing quirk, but when I think further about it, I find plenty of reasons why it perhaps ought to work.
External mice are more useful than trackpads, although not enough use to me to justify carting one around. My phone is palm-sized, about the ideal weight, is already paired with my laptop over bluetooth, has clickable buttons all over one face, and an optical camera on the reverse. In short, it already has most of the technology needed to be a wireless optical mouse.
Most but not all. I'm a bit dubious about whether it could be done in software alone. I doubt that the lens will focus well enough to motion tracking without a special surface, and it's completely lacking the light source, but it is almost tempting enough to try. It might be feasible with some sort of very recognisable surface, perhaps a monchrome checkerboard grid, which would be very easy to render and print.
Q: How do you get two whales in a car ? A: With a dalmatian. Jack originally hails from a breeder based in South Wales, and so a holiday cottage weekend in that region makes for some kind of homecoming. Extremely lucky with the weather, randomly selecting a furiously sunny weekend immediately following a washed out Bank Holiday. Fun time for all, although Jack didn't seem too settled with the sleeping arrangements. We managed a couple of exciting excursions. A wildly optimistic walk through what turned out to be some managed wetlands; escorting a strong excitable dog held back by a thin cord across rickety walkways suspended over bogland, like some super-hazardous Crystal Maze task. Later, the closest thing to mountaineering myself and Jack are ever likely to manage - in essence, strolling up a very large hill, a forty-five minute affair to the summit at best. In fairness to the dog, he did actually indulge in some of your actual climbing, with rocks and verticals and what-not. Myself, I kept to the handy path provided.
Perhaps somebody up there is listening. Following on from yesterday's post, we awoke this morning to a Bristol lightly covered with snow. After investigating the garden in detail for about half an hour, we decided it was time for a walk.
In answer to my question, it seems that Jack quite likes snow, but you have to sniff every square inch of it extremely carefully
So much for my new year resolution to write more often.
Just before I went away for Christmas, my trusty white MacBook had developed a bit of a problem with it's keyboard. Initially this manifested as the function keys intermittently losing the ability to switch between special Mac control keys, such as brightness, eject media and what-not and normal user-programmable f -keys. Initially I thought this may be a problem with the fn key that is the toggle, but eventually the keys f1 - f9 stopped working entirely. This was irritating, but didn't really render the machine unuseable. Most of the time I use it with an external keyboard, and luckily all the defunct keys functions were duplicated in software.
The next key to go was the right Shift key. Although, of course there's a left Shift key, for a touch-typist, this was a little harder to ignore. Although I find much to admire about Apple's current laptop keyboard design, unfortunately user-repairability isn't one of its many blessings. There's no simple way to get into the top casing on a polycarbonate MacBook, it's an expensive specialist job for a service centre.
Sensibly I'd followed my own advice when I purchased this laptop, and bought it from the always-wonderful John Lewis with their standard two-year full warranty on electrical goods. I was coming up very close to the two-year anniversary, which fell within the first week of January, itself another lucky stroke, as it meant that I'd be able to take it with me on my trip to North America , where hopefully it would hold up well enough to let me edit photos, communicate, and act as an additional entertainment for any idle moments. It managed the job fine, and as soon as I was back in the U.K. I packed it off to John Lewis for maintenance, which is something that they arranged with their usual attention to customer service. More thumbs up for John Lewis.
Which left me Mac-less, save for my rather under-spec G4 mini, which can barely read mail and a web-page at the same time, under Leopard. And so no blogging.
The two year mark was also my planned point for a new machine upgrade. Buying a machine for work, I was able to take advantage of the Apple Developer Program hardware discount. Sadly this means abandoning John Lewis to purchase direct, but now we've got a real Apple Store in Bristol , I think AppleCare is probably a good deal.
I figured I'd be needing a machine with better graphics hardware, to better make advantage of the already signposted future directions in OS X technology. The new 'unibody' Macbooks didn't really suit, as I've probably got as many firewire devices as USB. Also, my recent work had been feeling the strains of my Macbook's 13" screen and modest integrated graphics chipset. And so I'm typing this update from my new 2.8GHz, 15.4" MacBook Pro .
It's mostly a great upgrade. On the positive side, it's pretty and slim, and I'm remembering just how right the 15" widescreen form is for me. The screen is brighter than anything I've ever seen, and makes other LCD displays, including my expensive monitor look washed out and dull by comparison. The new glass front is dramatically easier to clean than any laptop screen I've owned. The extra-large button-free trackpad is brilliant, and even the gimmicky sounding gestures have proven to be almost practical enough for regular use. The unibody shell seems rigid and light, and bringing across the now-standard Apple keyboard hardware makes a brilliant switch from the old silver PowerBook G4 style, which I frankly hated. It's super-fast, of course; the new CPU, memory bandwidth, and fast hard drive all combining to ensure that as yet, I've not seen any performance stalls when many simultaneous processes grow busy.
It's not perfect of course. Some of the positives are also negatives. The glass fronted screen is considerably more reflective than the previous gloss models, and while in practice I find that I mostly mind this far less than I'd have thought, it's undeniably worse than my gloss MacBook.
Then there are more straightforwardly negative negatives. Like many people, I've found trouble with the Apple mini DisplayPort to DVI connector - the integrated NVidea 9400 graphics adaptor can't drive my 23" TFT without sparkly artefacts, I have to run it through the additional 9600 GT GPU to get a useful picture. It's too pretty, in as much as it makes me fret about the wear and tear that will inevitably mar its looks over time; surely computers should be tools not jewellery? It's slightly heavier than a MacBook, and the battery life is probably less, it's too hard to say, the calibration as yet seems to be a bit iffy with estimates. I miss the inbuilt LED charge gauges on the battery which allowed one to check the power without having to connect the battery up, so handy when travelling with two or more. I also miss the ports on the left hand side, and find the supplied ports a bit stingy; surely they could have squeezed a couple more USB slots and a firewire 400 in somewhere? I'm not sure I need a wired ethernet anymore.
Not only that, but shortly after I'd ordered it, Apple saw fit to announce an update to the polycarbonate MacBook line, giving it a memory bus and GPU boost to inject some of the performance I was lacking, and keeping the essential firewire port in place. And then they announced iLife '09 would ship a mere handful of days after my new machine was dispatched. I think I'll still enjoy all the other Pro upgrades though, and they did offer recent purchasers like me the chance to upgrade the iLife suite for just a nominal cost.
Overall I'm happy, and I'm sure all the wrinkles will be ironed out, as I adjust to life with it. It ought to keep me in the manner to which I'm accustomed for the next couple of years, at least. What was that they said about never buying the first iteration of a new Apple product line? Oh.
Very seasonal weather we've been having lately. Unshifting clouds of fog, and frosty mornings. Myself and Jack both have been making the most of it.
All the weather forecasts predict that there is heavy snowfall on the way for this part of the country. I look forward to finding out what he'll make of that.
We recently spent a long weekend in a holiday cottage down in Cornwall. Jack came along too. One afternoon we took him down to the coast near Par to walk along the beach.
Previously he'd indicated that having sand underfoot was the main point about beach walks, the sea only provoking minimal investigation. He seemed quite interested in the sea this time, enough to indulge in some fairly enthusiastic paddling. Perhaps the abundance of weed and rock pools drew him in. No swimming though, he still draws the line firmly at armpit depth.
If you have a Django 1.0 deployment configured to use sqlite3, and are struggling to understand sporadic eruptions of what are clearly exceptions thrown by closing a database cursor with uncommitted work; either manage.py commands on the shell, or page requests to the application generate stack traces centered around messages like ' Unable to close due to unfinalised statements ' then it might be a file permissions problem.
In my case, neither my developer shell account, nor the user id of the running apache httpd processes had write permissions to the directory with the sqlite3 database file. Not immediately apparent from the wording used in the error messages.