Testing apps that depend on external services or APIs

A lot of web programming these days doesn’t live in isolation. We consume services over the internet via APIs, and we send information to other services, such as Google Analytics, to track what users are doing.

I’m currently back at the BBC, where we have a lot of teams working on components that cooperate together: programme scheduling and publishing, video encoding, media streaming, DRM verification, content delivery networks. Testing becomes a great challenge when dealing with so many moving parts, across multiple environments (dev, int, stage and live) .. and even when it works, integration tests can get slow.

What do we really mean by integration testing?

I think automated integration testing should test the integration points .. not whether they actually do all line up and integrate correctly. There is a place for both, of course. Sometimes you need full end-to-end integration tests. But they are slow and brittle. I think we can add a little bit more control here.

Example of a dependency on an external API

Suppose I want to test an app that relies on an external service. In this case it’s a weather app.

Weather in Bristol

You can visit this now if you like: aimeerivers.com/weather/Bristol

Change the city in the URL and you’ll find out the weather for that city.

The way it does this is by parsing an API provided by OpenWeatherMap.

http://api.openweathermap.org/data/2.5/weather?q=Bristol

It gives us something like this:

{
  "coord": {
    "lon": -2.59665,
    "lat": 51.45523
  },
  "sys": {
    "country": "GB",
    "sunrise": 1368850387,
    "sunset": 1368907233
  },
  "weather": [
    {
      "id": 800,
      "main": "Clear",
      "description": "Sky is Clear",
      "icon": "01d"
    }
  ],
  "base": "global stations",
  "main": {
    "temp": 286.78,
    "pressure": 1008,
    "humidity": 81,
    "temp_min": 284.15,
    "temp_max": 289.35
  },
  "wind": {
    "speed": 2.6,
    "deg": 230,
    "var_beg": 200,
    "var_end": 270
  },
  "rain": {
    "3h": 0
  },
  "clouds": {
    "all": 0
  },
  "dt": 1368907010,
  "id": 2654675,
  "name": "Bristol",
  "cod": 200
}

If we didn’t know anything about the API dependency, we might write the following feature file:

Feature: Weather report
  As a visitor to Bristol
  I want a page that tells me what the weather will be
  So that I can decide what clothes to wear

  Scenario: Report says it's going to be clear
    When I look at the weather report for "Bristol"
    Then I should see the weather is "Sky is Clear"

We could use Capybara to test, and step definitions would look like this:

When /^I look at the weather report for "(.*?)"$/ do |city|
  visit "/weather/#{city}"
end

Then /^I should see the weather is "(.*?)"$/ do |expected_weather|
  page.should have_css '.description', text: expected_weather
end

I’m sure the problem here should be immediately obvious: the weather changes! So how do we allow for changing weather?

One way is to make the step definition more vague: “Then I should see the correct weather” .. the step definition would have to make a call to the same API, parse the JSON, and make the expectation based on the response it finds. If it comes up with the same answer as the app, we can assume the app is behaving as expected.

It’s is a viable solution, but i don’t think it’s the best.

Stub out the API

Ideally, i should be able to run the app locally. There are a number of good reasons for that anyway: i can debug the code, i am able to trace log files and get more meaningful error messages, it’s faster to run, and i can run it offline (once i have stubbed out the API dependencies!)

If i can’t run the app locally, it’s okay, but i have to be able to configure the app somehow to fetch data from a different source, one that is under my control. We did this a lot in the Olympics, using REST-assured to return responses to API requests. It was a good way to gain control over the ever-changing data.

But if i can run the app locally, i can reroute api.openweathermap.org to localhost, and then it’s mine to play with as i wish.

sudo vim /etc/hosts

Add a line:

127.0.0.1 api.openweathermap.org

Now my machine is going to reroute requests for api.openweathermap.org to localhost. Hurrah! Successfully intercepted!

Intercepted API

And of course, my app, running locally, encounters the same thing.

App broken because i have intercepted the API

Now i can put the data that i want there. Oh, there’s a catch: we have to run on port 80. But that’s okay, we can do that. Considering it means the app will be completely unaware of the change, i think that’s a small price to pay.

Introducing RackDoubles

RackDoubles allows you to create, change and remove endpoints at runtime.

Start off with a very simple config.ru file to run a Rack app that uses RackDoubles. You have to define a run method but it’s as simple as it could possibly be.

require 'rack_doubles'
use RackDoubles::Middleware

run lambda { |e|
  [404, {'Content-Type' => 'text/plain'}, ['Not found']]
}

Because we need it on port 80, we have to use sudo to run it, or in my case rvmsudo because i use and love Ruby Version Manager.

rvmsudo rackup -p 80

And just leave it running. The magic is about to happen.

Now, watch this. Here’s what we’re going for:

  Scenario: Report says it's going to be clear
    Given the weather API is stubbed to return "Bristol.json"
    When I look at the weather report for "Bristol"
    Then I should see the weather is "Sky is Clear"

I have saved the JSON i want into a file features/support/stubs/Bristol.json

So let’s use RackDoubles to set up the stub response:

def client
  RackDoubles::Client.new('http://127.0.0.1')
end

Given /^the weather API is stubbed to return "(.*?)"$/ do |filename|
  response = File.read(File.join(File.dirname(__FILE__),
                       '..', 'support', 'stubs', filename))
  client.stub('/data/2.5/weather')
  .to_return(200,
             {'Content-Type' => 'application/json'},
             response)
end

Now the data is entirely under my control. The test passes.

The best news is, now i have the opportunity to simulate bad data from the API. And did you spot the 200 status code there? I can easily write a step definition to stub the API to return a 503 Service Unavailable, to see how the app handles that.

  Scenario: API is unavailable
    Given the weather API is unavailable
    When I look at the weather report for "Bristol"
    Then I should see "Please try again later"

Here’s the step definition:

Given /^the weather API is unavailable$/ do
  client.stub('/data/2.5/weather')
  .to_return(503,
             {'Content-Type' => 'text/plain'},
             'Service unavailable')
end

Now if that test fails i have something to tell the developers about. I can easily demonstrate a scenario in which the API is unavailable. These are things that a manual tester cannot easily do. A developer might simulate them with unit tests, but i am able to test it in a reliable, repeatable way that may not be a full end-to-end test, but i think it’s a pretty good integration test.

Of course, there is still a need for full end-to-end test coverage, but i think that’s best covered by manual exploratory and smoke testing, which are still necessary and highly valuable. As Developers in Test, we have the skills to make life a bit easier for ourselves and our teams, so let’s use them.

Advertisements

A typing tutor for the visually impaired

I have just had a very interesting conversation with Kajarii where we discussed keyboards ergonomics, alternative keyboard layouts, and typing tutors.

Kajarii is blind and touch types on a QWERTY keyboard, having learned by trial and error from a young age. Kajarii would like to learn colemak keyboard layout, but made a really good point: how do you learn a new keyboard layout when you can’t even see what the layout should look like and you have no feedback from what you’ve typed?

Once i thought about it, i realised that every typing tutor i’ve ever seen has relied heavily on being able to see. You have to look at what you’re meant to type, there is usually some kind of layout diagram that highlights the key, and quite often the use of colour for feedback if you have typed correctly, and the cursor moves on to the next letter. They are no good at all for somebody without the privilege of sight.

I think i could quite easily teach a blind person to touch type if we sat down side by side. I’d start with the index fingers on the home row, tell them what the letters are, give instructions of short bursts of letters to type, and give verbal feedback on what they typed. Like most typing tutors do, i’d gradually introduce new letters and form words to type using the letters learned so far. I can see this working well with one-on-one human interaction.

So can that be translated to an accessible typing tutor program? I think it probably could be. I would like to try. What would it be like? A terminal based app? A web app? A native desktop app? Would it rely on screen reader technology, or use pre-recorded instructions? I need the input of visually impaired people to know what would be most useful.

Is there anyone out there who would like to help write an accessible typing tutor? Anybody who would like to help test one?

Could we do an open source effort? Something that is extensible to adding different keyboard layouts? There are accessible typing tutors and there are typing tutors that support colemak, but i don’t think there is an overlap.

Please leave a comment if you are interested in helping to create something, or have some ideas about how it could be.

I guess i will never understand just how privileged i am to be blessed with both sight and hearing, but i am interested to learn more about accessibility issues, and i at least *want* to care more about the kind of difficulties i hope i will never have to face.

Colemak roundup

I have written a few times about colemak keyboard layout, its benefits, how i switched, and advice for other people wishing to make the switch. This is not going to add anything new; i just want a place i can point people to, and they can find all the information.

When i add new colemak-related posts in the future, i’ll also add them here, use it like an index.

Ask aimee: When/why did you decide to switch to Colemak?
Includes the history of QWERTY, Dvorak and Colemak, and my own personal typing journey so far.

Colemak is easy to learn
An encouragement to newcomers that Colemak is not so different from QWERTY. Also highlights the advantages of Colemak as compared to Dvorak.

How to learn Colemak
If you’ve made the decision to switch, here are my tips for how you might go about it.

Colemak and vim: “But what about h/j/k/l?”
For vim users, a common question is how you deal with the direction keys when switching to Colemak. Here is my answer.

QIDO for Colemak please!
A campaign to get a Colemak version of the QWERTY-In-Dvorak-Out USB keyboard adapter.

I love to help people make the switch to Colemak. So if i can encourage you, talk to me on twitter! @sermoa

Marriage equality – what’s that, then?

I was once told by an immature teenager that my gloves were gay. It wasn’t even my rainbow gloves, which i’d have to admit, yeah, they’re pretty gay!

Even my purple gloves, i’d concede that the kid had a point. No, it was my white and black striped gloves; they’re not even gaily coloured!

“Your gloves are GAY!”

So i said, “Oh really? Do you think they are attracted to other gloves of the same gender?”

To me the term “gay marriage” is as ridiculous a concept as “gay gloves”. Marriage doesn’t have a sexuality. And if you’re trying to say it’s for gay people, no it’s not. It affects bi, trans and straight people too, in all kinds of combinations. What we’re really looking for is an equality of marriage: the same opportunities available to everyone.

Some examples:

1. Tom Freeman and Katherine Doyle have been trying for nearly two years to get a civil partnership, because they don’t want the historical baggage associated with marriage. They have been denied because of their sexuality: they are both straight.

2. A friend of mine changed gender and had to get divorced and form a civil partnership instead, in order to achieve gender recognition.

3. I am bisexual and married to a man. Do we have a straight marriage? If i had wanted to marry a woman, would it be a gay marriage? No, because i am not gay.

4. Gay people can get married right now! There’s nothing to stop a gay man marrying a gay woman. You might be surprised how often that happens, just for the convenience.

It bothers me whenever i see the term “gay marriage”. This morning i saw journalists Emma Kennedy and Victoria Coren both use it, so i tweeted:

your periodic reminder that “marriage equality” is preferable to “gay marriage” .. thank you!

Emma agreed with me, but claimed that on twitter, “gay marriage” is more convenient, to avoid getting hundreds of tweets asking what “marriage equality” means. I didn’t realise that there was so much ignorance. It can’t be that hard to explain, surely? I think that if more journalists and politicians would start using the terms “equal marriage” or “marriage equality” then people would get used to it and understand what it means.

If we can’t go that far, “same-sex marriage” is at least slightly preferable to “gay marriage” because it’s more descriptive, and it doesn’t exclude bisexual people. It highlights the thing that is currently unequal about marriage. I still don’t like it because it implies that we’re talking about a different, separate thing, when what we actually want is equal access to the same thing.

One friend suggested that we should call it “Marry Who The Fuck You Want” .. people should be able to grasp that concept! Another friend recommends that we do away with marriage altogether, then we’d have equality of non-marriage!

It seems that the terminology of this thing is becoming my big bisexual soapbox of 2012, haha! And yes .. i know .. soapboxes do not have a sexuality. Well done if you spotted my irony there! ;)

Relatedly, for anyone who is trying to preserve the “sanctity of marriage”, the whole “one man, one woman” thing, remember that marriage is a human invention, and is always changing. I loved this poster that i saw the other day.

Automating Cucumber test scripts on a Mac

I’m really enjoying my work at the BBC on the Olympics team! I’m primarily implementing Cucumber scenarios to verify the work that the developers are doing. I’m also using other tools for stress testing and performance monitoring.

My work here is leading me to use Cucumber in weird and wonderful ways! Here’s an example. Yesterday i was asked to run a script every half an hour that tests the Olympics video player to see if it’s playing successfully, and if not, to email people to say that it’s broken. Not your usual Cucumber scenario, but amazingly enough, it can be used to do that!

Forgive the jargon below. PID is a programme identifier, and IVP is the Interactive Video Player that we are building.

  Scenario: Check LIVE video player
    Given a live PID 
    When I check the IVP 
    Then I should email people if anything goes wrong

I can use a combination of javascript hooks and taking screenshots a few seconds apart and comparing them to tell whether the video is running. I decided to run some step definitions that i’ve already defined and rescue any errors to be emailed. There are a few more steps in here but i’ve stripped it down a bit for simplicity.

When /^I check the IVP$/ do                                                                         
  if @pid
    begin
      step 'I attempt to view the IVP host page with that PID'
      step 'the video should be ready'
      step 'the video should be playing'
    rescue Exception => e
      @error = e.message
    end
  end
end

Notice that there might not actually be a live PID at the moment. It feels very weird, to put conditional logic in Cucumber step definitions like this!

Now comes the email part. I used Pony and sendmail as a simple email sending mechanism.

Then /^I should email people if anything goes wrong$/ do
  if @pid && @error
    subject = "Assurance test failed in #{ENV['ENVIRONMENT']}!"
    body = "#{page.current_url} caused this error: #{@error}"
    recipients = ['send_to@me.co.uk']

    Pony.mail(:to => recipients,
              :subject => subject,
              :body => body,
              :via => :sendmail)
  end
end

So, with that working, i set about putting it on a schedule. I thought i could just call the script from a cron task, but it turns out that wouldn’t work because i need to launch Firefox with Selenium to test the flash player.

I found this cool built-in Mac tool called Automator. You can set up all sorts of tasks into a workflow. I just needed a simple shell script:

And now, we can call that from a cron job every 30 minutes! You might have to hunt around a bit for where it saves the file. For me it’s in my Library/Services.

*/30 * * * * automator /Users/daniea16/Library/Services/IVP\ Test.workflow

Another creative alternative to the cron job is to set up recurring calendar appointments in iCal. You can set an alarm that runs a script. Pretty awesome, hey?! :)

I know Cucumber is meant to be a BDD framework, and was never intended to be used for automated regression testing or assurance testing, but isn’t it cool that with a little bit of imagination you can bend it to fit these alternative uses? :)

Hampshire humanists going from strength to strength!

A little over a year ago, my friend Sarah and i decided to start a meetup group for humanists, secularists, atheists and agnostics to get together and chat informally over a cup of coffee. We started meeting on sunday mornings at Green’s Wine Bar, Jewry Street, Winchester.

From a small beginning with nothing but a bit of tweeting and word of mouth, we now have a regular meetup on the first sunday of each month, usually with about 15-20 people attending. It attracts a lovely bunch of people who all enjoy making conversation together. We usually eat breakfast there and spend the whole morning chatting. If one of us is going through a difficult time, the others are there to provide support and practical help. Today one of the group brought cakes to share, to celebrate another person’s birthday! There were 4 kids there today, who played games with each other!

We are planning a humanist picnic, walk and afternoon of music making on saturday 16th june. Contact me if you’re interested in coming along! We also want to do a stargazing night up at Farley Mount in the near future!

In fact, the group is going so well, we’re planning to start another one in Southampton. A lot of us feel that once a month isn’t enough, and we know there are some people in Southampton who would like to come, but find it difficult to get to Winchester. So i’m thinking a mid-month humanist meetup in Southampton would be great! Same informal format: just turn up if you’re interested. Possibly at the Art House, which opens at midday on a sunday. Maybe start in two weeks: on the 20th may? :)

Please follow @hantshumanist on twitter for news and updates!

An apology from Colin and Matt

I listen to a great radio show on Amazing Radio on saturday mornings. It’s called The Saturday Show with Colin and Matt, hosted by funny guys Colin Greaves and Matt Horne (no not that one!) .. i really enjoy their banter, the riddle, the burning question, the quirky news roundup, and the music they play.

A few weeks ago the burning question was: “The Postal Service! It’s a bit rubbish, really, isn’t it?” and because they were discussing the postal service, they thought it would be fun to ask for answers on a postcard. So i sent them a postcard. I didn’t have time to choose a funny one, or one with boobs on, which i know would have made them happy. So i sent them a scene of Winchester from my favourite local artist, Josephine Chisholm.

They received it the following week. They tweeted about it and posted this picture.

To me, that is iconic Winchester. The Buttercross, the old architecture, busking, St Giles’ Hill.

Matt liked it, but Colin wasn’t impressed. Comments such as: “That could be anywhere!” and insinuations that people in Winchester are all farmers. I remember the comment “Is that a wheelbarrow?” particularly stung! And of course, the lack of boobs was mentioned.

Anyway, so yesterday was a saturday and my partner and i decided to listen to XFM instead. I took part in Colin & Matt’s riddle on twitter, but let them know that i wasn’t listening because of the postcard comments!

Colin asked for my email address. I was hesitant, but figured it’s easily found on the internet so i sent Colin my email address.

Then today i received this!

Dear Aimee, a fan of our Saturday Show,
This is just a quick email, good morning, hello.
You sent us a postcard, the only one we’ve ever got,
And I said some bad things, am I proud? I am not.

You see, it’s not that I genuinely thought it was bad,
I thought it was great, I was happy, I was glad.
But for comedic effect, I said it was dire,
I’d come to regret this as things did transpire.

I’m so very sorry if you took offence to my ribbing,
If I said I didn’t care, I’d only be fibbing.
Our fans mean the world to us and you’re one of the best,
Upsetting or offending you leaves me rather distressed.

Please accept my sincere apologies, the postcard was ace,
We’ve even put it up on the wall, it’s taken centre place.
I’d hate for you to think we don’t appreciate our fans,
Going around insulting people is not part of our plans.

So I’m sorry, and thank you for being an absolute gem,
And please don’t stop listening and changing to XFM!

HOW SWEET IS THAT?!?!!

I’ve never had a personal poem written by a radio DJ before, it was so lovely! Of course, Colin is fully forgiven, and i’ll be listening again from next week!

But just in case that wasn’t enough, Colin also drew a picture for me!

What can i say? I’m truly blessed!

I heartily recommend The Saturday Show with Colin and Matt. You can find it 9am-12pm every saturday on Amazing Radio on DAB, or listen online: amazingradio.co.uk

The Facebook Food List Challenge for vegans and vegetarians

I am doing the 100 Food List Challenge on Facebook. I’m interested to see how many can be eaten by vegans and vegetarians. I didn’t know what a lot of the foods were, so this involved a bit of research.

I will present food as vegan if i think it could be made vegan and still count for ticking off the list. Don’t assume that because i say (for example) Borscht can be made vegan that it is always vegan. Some things like Currywurst and S’mores are almost never vegan, and you’ll have to look very hard to find a vegan version. But that’s all part of the challenge, right?! ;)

Vegan

2. Absinthe – as with all alcohol, check the filtering process
4. Baba Ghanoush – made with aubergine, chickpeas and tahini
6. Baklava – can be vegan, but check for butter in the filo pastry
8. Bellini – an Italian fruit cocktail usually containing Prosecco so make sure the Prosecco is good for vegans
10. Biscuits and gravy – American biscuit bread is like British scones. I’m sure you can make a vegan version!
12. Black truffle – truffles are picked from underground mushrooms
13. Borscht – mainly beetroot and cabbage, but be careful, it often contains beef, and maybe butter
20. Chile Relleno – a stuffed poblano pepper, may contain meat, cheese and egg, but i’m sure a vegan variation would still count
22. Churros – deep fried doughnut sticks, can be made vegan but don’t assume they are
24. Cognac – vegan cognac is available
27. Currywurst – it’s German sausage. not usually vegan, but if you look hard you could find one
28. Dandelion Wine – obviously check the wine
30. Durian – a South Asian fruit from the durian tree, custardy almondy flavour
35. Fresh Spring Rolls – vegetables wrapped in rice paper, not fried, may contain meat so be careful
37. Fried Green Tomatoes – but check what it’s fried in
38. Fried Plantain – usually covered in batter so watch out for milk, egg and butter
39. Frito Pie – corn chips and chili baked as a casserole, caution: may contain cheese
42. Funnel Cake – basically fried batter, i think there could be a vegan version
43. Gazpacho – a tomato-based vegetable soup, usually vegan but can contain meat stock or seafood
46. Goulash – Hungarian soup, usually contains beef, but vegan versions are available
47. Gumbo – a southern Louisiana stew that often contains meat or fish, but could be made vegan
48. Haggis – usually contains sheep offal, but vegan haggis is easily found, and still counts
50. Heirloom Tomatoes – open-pollinated hand-cultivated tomatoes in a variety of shapes and colours
60. Mimosa – half champagne, half orange juice – look for vegan champagne
62. Morel Mushrooms – a spongy, slightly toxic mushroom
63. Nettle Tea – buy from a health food shop, or put on some gloves and pick your own to boil
66. Paella – it often contains meat or fish but can be made just with vegetables; paella is a Catalan word for the large shallow pan
70. Phaal – a curry hotter than vindaloo, often contains meat but could be made for vegans, though watch out for ghee
72. Pho – Vietnamese rice noodle stew, vegan versions usually substitute meat with tofu
74. Pistachio Ice Cream – yes, dairy-free pistachio ice cream exists!
75. Po’ Boy – Louisiana submarine sandwich, normally contain meat but vegan versions are available
77. Polenta – ground cornmeal
78. Prickly Pear – the fruit of a paddle cactus
81. Root Beer Float – make your own with dairy-free ice cream
82. S’mores – good luck finding vegan graham crackers and vegan marshmallows; it’s tricky but not impossible
83. Sauerkraut – fermented cabbage
89. Som Tam – a Thai salad based on shredded papaya; often vegan but as with all Thai food, watch out for fish sauce
90. Spaetzle – German egg noodles, you can make a vegan version
94. Sweet Potato Fries – just check what they’re fried in
96. Tom Yum – a spicy clear soup from Thailand, many variations including some vegan ones
97. Umeboshi – Japanese dried and pickled ume fruit
99. Wasabi Peas – dried peas coated with wasabi, Japanese horseradish
100. Zucchini Flowers – they are usually served stuffed with something, so check for that

Vegan target: 43

Vegetarian

All of the above, plus …

9. Bird’s nest soup – a Chinese delicacy made from a dissolved nest built from the saliva of a swift
51. Honeycomb – the wax built by honey bees

Vegetarian target: 45

Lacto-ovo vegetarian

All of the above, plus …

17. Cheese fondue – watch out for rennet in the cheese
29. Dulche De Leche – slowly simmered sugar and milk
32. Eggs Benedict – poached egg on English muffin, check for free range eggs
45. Goat’s Milk
53. Huevos Rancheros – fried eggs on corn tortillas with tomato and chili sauce
56. Key Lime Pie – probably vegetarian, but check the ingredients for gelatin or animal fat
58. Lassi – an Indian yoghurt drink mixed with spices
67. Paneer – it’s a curd cheese of Indian origin
69. Pavlova – meringue, cream and fruit
73. Pineapple and Cottage Cheese – cottage cheese does not contain rennet, but might contain gelatin
76. Pocky – Japanese chocolate covered biscuit sticks, the original contains animal shortening but Mikado, the UK equivalent, is suitable for vegetarians

Lacto-ovo vegetarian target: 56

Pescetarian

All of the above, plus …

1. Abalone – it’s sea snails
5. Bagel and Lox – Lox is salmon fillet
14. Calamari – fried squid
15. Carp
16. Caviar – definitely not vegetarian because the fish has to be killed to get the eggs
23. Clam chowder
25. Crab cakes
31. Eel
33. Fish Tacos
36. Fried Catfish
41. Fugu – it’s a Japanese pufferfish
59. Lobster
80. Raw Oysters
84. Sea Urchin
85. Shark
88. Soft Shell Crab

Pescetarian target: 72

Meat-eater

All of the above, plus …

3. Alligator
7. Barbecue ribs
11. Black pudding – a sausage made from dried blood
18. Chicken and Waffles
19. Chicken Tikka Masala
21. Chitlins – pig intestines!
26. Crickets
34. Foie Gras – the liver of a duck or goose
40. Frogs Legs
44. Goat
49. Head Cheese – meat and jelly from the head of a pig, sheep or cow
52. Hostess Fruit Pie – they contain beef fat
54. Jerk Chicken
55. Kangaroo
57. Kobe Beef
61. MoonPie – it contains gelatin
64. Octopus
65. Oxtail Soup – literally made with the tail of a cow
68. Pastrami on Rye – pastrami is preserved meat, usually from beef, sometimes pork or mutton
71. Philly Cheese Steak – steak and cheese in a long roll
79. Rabbit Stew
86. Snail
87. Snake
91. Spam – spiced ham, munged up and shoved in a tin
92. Squirrel
93. Steak Tartare
95. Sweetbreads – glands taken from the throat, heart or stomach of a calf or lamb
98. Venison – the meat of a game animal such as deer, antelope, wild boar

Meat-eater target: 100

So there we have it! :) Please correct me if you spot any mistakes! Happy eating, whether you choose to do it all, or go for a subset.

I just found The Vegan’s Hundred which is a full list of 100 things that are animal-free or can be made vegan, which are worth trying! :)

The power of twitter!

I wanted to recall a book i read a few years ago. The trouble was, i remembered very little about it, but i think a friend of mine might like it. Google was proving absolutely useless. Time to turn to the power of twitter!

Ten minutes ago i posted a slightly jokey tweet:

i read a book a few years ago. it had a blue cover. any ideas, twitter?!

I got a few appropriately jokey answers:

did it have a man with a face in it? And that woman with a name?

Conservative Manifesto perhaps: amazon.co.uk/Invitation-Joi… ;-)

“Beautiful Code”?

it’s that one written by that author. He wrote all that stuff about things.

That last one reminded me that the book was written by a female author. I gave a few more clues:

the book had some kind of medieval/renaissance/inquisition theme, set in the south of france. author was female, i think.

i seem to recall some sort of circular symbol on the cover, and the title was one fairly long word. i think it’s historical fantasy.

in the book was some kind of weird cult that met in a room underground. people died in it. come on, someone must have read it!! ;) ;)

That was enough for mason to be confident enough to post a picture. In fact, mason had got it by the time i mentioned the theme and location.

if I am right, after all these sarcatic tweets I claim a prize.. (Please wait)

??? If I’m right then I’ll probably shit the very bed I just took this picture on. yfrog.com/h4chnuxyj

Indeed, mason was right! Labyrinth by Kate Mosse is the book that i was looking for! The power of twitter, hey?! :)

Where i’m coming from

I recently came across this letter that i wrote to God in January 2006 in one of my attempts to rekindle my faith. I think it had been one of my new years resolutions that year to go to church and read my bible and be A Good Christian again.

It’s clear how confused i was, and how much i wanted to believe, even though i had so many doubts. Nothing made sense to me, but i was somehow sure there was some kind of a god or spirit out there, and i obviously really cared about not offending that being.

I want to post it now, so that you can see where i’ve come from, and why i’m so much happier now that i’ve given up worrying about all this stuff!

Hello God. I’ve been missing you. You know I spent last year pretty much ignoring you, or just being indifferent towards you. I was confused and didn’t know what I believed, so I just chose to ignore you and religion most of the time. And then I was thinking, there’s something missing in my life, and I made a wild guess that perhaps it was you. Well I’ve got so much to be thankful for, and I really have a good life: I’ve got a job that I enjoy (most of the time) and pays me well, I live in a beautiful city and have pretty much everything I need, plus a wonderful partner to share it all with. So if everything’s so good, why do I feel so sad and empty a lot of the time? Is it that ‘God-shaped hole’ that people talk about?

So I thought I’d go back to church again, I’d read my Bible again, I’d pray again. And I mean proper prayers, not my indifferent sort of prayers where I didn’t really care whether you were listening or not. I thought it was time I started up a proper friendship with you again and got to know you like I knew you when I was little. Only I’m not sure whether I ever did, or whether I was just convincing myself. It’s hard to know for certain, you see.

And now I find, you’re not where I left you. You’ve gone somewhere else and I can’t find you where I thought you’d be. Well to tell the truth, I can’t go back to where I used to be. I’ve changed. My childhood beliefs were all based on what other people had told me, and me taking their word for it. I can’t do that anymore, God. Different people say different things, and I don’t know who to believe. Who’s right, who’s wrong? Or is it all relative? Maybe everyone’s right, in their own way. Maybe it’s only with the combination of every belief that we get the full picture. I suspect that any individual view is probably a distorted picture of you …

Can we ever know you completely, or are you un-knowable and un-fathomable? Are you external, somewhere up there looking over us, or are you internal, the still small voice in my heart? Maybe you’re my sub-conscience, or maybe my super-conscience? Are you one God, are you a trinity, or are you many? Could you be different things to different people? Is it up to everyone to find their own truth? Is the truth within us, or can we only access you in one way? Did Jesus have all the answers, or was Mohammed right? Did the Buddha really find enlightenment? Is Jesus really the only way to the Father, like he said?

What if I don’t believe in heaven? Can I still be a Christian if I find that reincarnation seems a more probable theory? Or maybe we’re just deluding ourselves, and we just die and that’s it, game over. Well, that seems unlikely, I like to think that some part of us lives on … but hey, can I just say I don’t know? Shall we just wait and see? Do I have to have any particular belief?

Will I ever know the truth with absolute certainty? Or do I just have to have ‘faith’? What if blind faith just isn’t cutting it for me at the moment? Can’t I find some answers somewhere? Yet if I do, how can I know that I can trust those answers?

Is the Bible as meaningful to us today as it was when it was written? Should it be updated and re-interpreted to fit today’s world, or does it remain the same for all eternity? Do you have a new word to bring to us today, or is the new word actually just the old word, heard in a new way?

Is there such a thing as a Holy Spirit? Does the Holy Spirit fill me? Has it ever done, or did I just imagine it? Could it have been wishful thinking, getting carried away in the excitement and emotion? If someone prays for the Holy Spirit to fill me, and it doesn’t feel like anything is happening, is that my fault? Am I too cynical, is that what’s preventing me from coming near to you? It’s hard to trust you when I’m feeling so uncertain.

Do you love me at all times, or are there times when you can’t bear to look at me because I’m so sinful? Do I have to earn your favour? Do I have to repent and receive forginevess? Will I be cut off from your love until I do that? Or can I come just as I am to worship you?

Will you help me to be a better person? I don’t really like myself very much at the moment. I want to be a better person, and I’ll do my best to change and become more loving, more tolerating more accepting … and less STRESSED!!! I’d really appreciate your help, if you’d like to help me. But you’ll have to speak a bit louder, God, cos at the moment I honestly just feel like I’m talking to myself. Still, I’m here and I’m willing for you to take me, break me and re-make me, if that’s what you want to do. It’s okay with me.

I’ll try to listen more carefully. Maybe I’m saying “Quiet Lord, thy servant is speaking” when I should be saying “Speak Lord, thy servant is listening”. I’ll make an effort, I promise. We’ll have some quiet time together today, how’s that?

Just let me know, yeah? Just give me a sign or something. Or until you do, I’ll just keep going to church and doing the things that I think might awaken me to you again. At least I know that I want to know you again. Last night I was crying because it felt like you’d abandoned me. But then I thought that’s a good thing – at least I’m showing some sort of emotion, which I guess is better than indifference. I’m coming back to you, God, and I hope you’ll find me.

With love,
aimee
January 2006

I can tell that i was heavily influenced by Sara Groves at that time, an artist who i still appreciate. I had also clearly been reading some of the “Conversations With God” books by Neale Donald Walsch books. I’ve no idea why i found reincarnation particularly plausible just then!

Needless to say, i never did really find God again, although i tried hard a few times after this. I even decided at one point to deliberately suspend all rational belief in order to have the blind faith that i thought i needed. It’s funny what cognitive dissonance can do to us, isn’t it?

This explains why i am so passionate about science, reasoning and rational thought these days. That is the place i find true comfort; that’s where things make sense to me.

For more about my current thoughts and beliefs, see: