Look at this little fella – isn't he cute! Taken this morning amid preparations for wassailing in the orchard.

I tried my luck standing in plain sight only 3 metres from the feeder, with honking great 400mm lens, and after about ten minutes stood motionless, the braver birds starter coming back. It's particularly nice to see long-tailed tits because they're so small and neat.

LongTailedTit

I also saw this less welcome visitor, on the ground underneath:

Rat

Another 'what I had for dinner' post. Sorry.

Because there's a recession on, I went for cheap and cheerful: corned beef hash, as described in How to Boil an Egg – the most straightforward no-nonsense cookery book ever and a staple of any kitchen, surely! It really is simple: par-boil diced potato, then throw in a pan with chopped onion and diced corned beef. Fry for fifteen or so minutes with a beaten egg, ketchup, tabasco, worcestershire sauce, seasoning etc. until ready to eat. In my case, serve with baked beans, but I find that if you're just eating it on its own (like I did with the leftovers next day for lunch) it needs a good splurge of ketchup when served, to lubricate and tastify.

I found that the corned beef disintegrates from the carefully chopped cubes almost instantaneously. Even my most careful and delicate pushing it around the frying pan resulted in complete disintegration within mere seconds. I'm sure I remember corned beef hash from my childhood having nicely seared cubes of meat, so I don't know what I did wrong. I can only imagine that I'm remembering wrongly, or I need to buy better ingredients. So I blame Sainsburys in this case.

CornedBeefHash

Another miscellaneous photo from a walk in Sherwood forest in the autumn, to remind us of days when the sky wasn't just dull and grey.

AutumnWood

I've spent a bit more time learning Python, because I've been dabbling with Google App Engine (which I'm going off rapidly) but mainly because it's an interesting language. What's particularly intriguing to me is its similarity to Ruby, and hence where it differs in syntax or approach makes for a notable point of comparison. Of course it's probably more correct to say that Ruby is similar to Python than the other way around. From my still very small exposure to Python…

Nice things about Python:
  • Less confusion with the way classes work. Or maybe I just haven't stumbled into Python's equivalent of meta-classes and class vs instance variables.
  • @classmethod is a much neater way of stating what's a class method rather than an instance method, compared to all that self gubbins, or the dreaded <<.
  • Optional named arguments for functions, allowing more flexibility for optional arguments and greater clarity when calling. [As an aside I like Objective-C's way of building argument labels into the method signature, but not it's square brackety syntax: [obj message:foo]. I'd much rather do obj.message(foo) and in fact with properties in Objective-C 2.0 we see more of this style.]
  • I think I probably prefer explicit return statements rather than the Ruby way of returning the last evaluated thing in any expression.
  • List comprehensions. To start with it just seems like a syntactic difference – Python: [x*2 for x in my_list]  Ruby: my_list.map {|x| x*2}. But Python's party trick is excluding elements as it goes: [x*2 for x in my_list if x != 3].

Nasty things about Python:

  • Seriously – indentation to demarcate blocks? Apparently I'll get used to it.
  • Double underscores. __init__ is a complete pain to type. Why not just a single underscore at the start or something?
  • Fiddly module system. Why the need for an __init__.py file in a directory, just to make it a module? Why the need to explicitly define an __all__ method just to be able to import everything in a module? I want to be able to create a "model/" directory, put all the .py files for my DB classes in there, then import the whole lot from my other classes with ease. When I add a new model class, I shouldn't have to go and modify the __init__.py file. It seems to be a real pain to split code up into multiple files sensibly in Python. If I've missed a trick here – please somebody show me the light!
  • The string interpolation is OK I suppose, giving the full power of C style formatting, but most of the time you're just doing simple interpolation and Ruby's syntax is far more pleasant and readable. Python: "Hello %s, from %s." % (person, greeter)  Ruby: "Hello {person}, from {greeter}."  Ruby also has a full on formatting system for the few times when you need it.

  

This is one of those occasions where I had accidentally left the ISO high having been shooting in the dark previously. So this was f8, 1/2000s at ISO 1600, quite unnecessarily!

LeafDrops

Episode three in my curry cooking adventure – this time with vegetables! See parts 1 and 2 for the exciting initial chapters. I've finally used up all the garlic and ginger paste I made for the first one.

GreenChillies 5467  Curry3Pans1 5468

I'm getting used to some of the standard manoeuvres in Indian curries: marinating meat in lime juice and salt; frying spices (but not burning them); finely chopped onion; garam masala and fresh herbs going in only at the end etc. This time I also did cumin-scented aubergine & potato curry, at the same time! It was quite a logistical challenge, flipping between two recipes in the same book, both of which were complex and unfamiliar whilst trying not to mix up the two of them. But it was a huge success I reckon. No problems to report, and a super-tasty result.

Curry3Pans2 5469

It was quite hot though – with three large fresh green chillies chopped and incorporate to both dishes. Not to mention the hot chilli powder and other spices. The missus found it all a bit too much actually, but I was in curry heaven. And then I went back into the kitchen and discovered the small pile of fresh chopped coriander leaves that I had intended to use as a garnish. Oh well.

Coriander 5470

I was stumbling along in the gloom of another grey day at the WWA. And at 3:30pm it was starting to get dark. Very poor conditions for wildlife photography! Then I noticed a small blue bird on a branch and bingo, there was one of the kingfishers in a spot I'd never seen it before, and handy for me to rest my camera on the rail of a bridge only about 8m away. Here are the best couple of shots I got (the first was actually entirely handheld).

KingfisherFish 5456
Kingfisher2 5457
These are the best shots I've ever managed to get of kingfishers so I'm very pleased. They're a long way from decent by any professional standards (the things I see on TV or in magazines make me sick with envy and incredulity) but the opportunity was fleeting and the light dim, with my kit and technique straining at their very limits: 400mm, ISO 3200, f5.6, 1/100s. To top it all, the elusive water rail then walked along beneath it, though I didn't manage to get a shot of that, and still never have.

A light but fairly complex taste that's reasonably bitter and hoppy, with a slightly burnt/roasted edge which I'd only usually expect to fine in dark beers and stouts. The bitterness and 4.3% ABV make it highly quaffable, but maybe it's a shade too bitter not to get wearing after a while.

Apparently "the International Beer Challenge 2007 awarded Meantime Pale Ale 'World's Top 50 Beers' Status." I can't say that I agree with them on this occasion. It's a quality beer for sure, but not one that will stick in the mind. I can name quite a lot of beers that have blown me away and I remember fondly. This isn't one of those, though it might be more impressive outdoors on a hot summery day.

MeantimePaleAle

Having ploughed through much of the documentation, done the tutorial and started writing my own little web app, I have some half-formed thoughts about Google App Engine to throw out to the world.

  • As far as I can tell, any sort of data aggregation functionality (counting, averaging etc.) just won't be possible as the Datastore APIs don't allow for it. I've tried to think of ways to fake it but even my most elaborate machinations come up against the buffers. The only way to manage it at all is to do counting and averaging piecemeal, manually keeping the aggregate values you need up to date with each individual entity modification. Unfortunately, that means that you can't introduce new functionality requiring new aggregate values after you've already got a million users, because you've missed the chance to record those aggregates along the way.
  • Python's OK, but I don't like using indentation as the sole way to define blocks. But I'm sure I can get used to that.
  • I really don't like having to put an empty __init__.py file in any subdirectories of my python code. If I don't do that it seems I can't import foo.bar.Thingy. Breaking up code into multiple files in a sensible directory structure is surely a fairly common thing to do, so I'm amazed that Python makes it strangely difficult. I hope I've simply missed something and it's actually easier than that.
  • In fact all those double underscores look horrid and are a pain to type. Surely a single underscore would have been quite adequate?
  • The overall experience for learning GAE is very sorted. Smooth and well integrated – all you need to supply is your own decent text editor. I'm trying out TextMate, the darling of Mac OS X code editors, but I'm worried to see that it doesn't seem to have been updated for over a year. 

It seems to be the done thing these days to learn how to use Google App Engine (and thus Python) within a couple of hours and then hack out a simple web application to prove how easy it is.

So with the missus out of town tonight, I'm staying out of trouble by doing just that. I've run through the getting started tutorial, which is a delight I have to say, especially because it's so darned simple to get going on Mac OS X. Python is already installed and there's a neat app to download from Google which installs the app engine SDK bits and puts a nice GUI front end on it for you to fire up the local test environment and various other handy things, as well as installing the command line tools if you prefer them. Start up TextMate or any other editor of your choice and you're away!

You'll have to take my word for it though, because I'm tired and won't get onto writing my own app tonight.

Footnote: Python seems OK, but so far I prefer Ruby, though they seem to share a lot in common.