{
    "version": "https://jsonfeed.org/version/1",
    "title": "Blog What I Made",
    "home_page_url": "https://blog.johnmckerrell.com/",
    "feed_url": "https://blog.johnmckerrell.com/feed.json",
    "description": "General geeky postings from John McKerrell. iPhone, Rails and JavaScript software developer in the North of England. DoES Liverpool co-founder and two time BarCamp Liverpool organiser\n",
    "icon": "https://blog.johnmckerrell.com/apple-touch-icon.png",
    "favicon": "https://blog.johnmckerrell.com/favicon.ico",
    "expired": false,
    "items": [
    
        {
            "id": "https://blog.johnmckerrell.com/2025/09/14/fitness-goals-and-my-running-history/",
            "title": "Fitness Goals and My Running History",
            "summary": null,
            "content_text": "I want to blog about running, but having never mentioned it on here I feel like I should give some history, so let’s go back in time….Back in 2008 my old boss Steve Frater mentioned to me that he was planning to run a 10k race near me and would I like to join him.  I’ve just entered the Liverpool 10K on Oct 5th - that gives you plenty of time to train so how about it?I laughed at him and said that I don’t run, I cycle, but for some reason I did start considering it and ultimately did sign up. (Looks like his original suggestion was in April and I didn’t sign up until August the 1st!) I must have caught the bug as I ended up agreeing to do a 5k race two weeks before this too.Over the years I did keep running but I didn’t really get into a regular pace, sometimes I’d run with friends, sometimes not. I did the Santa Dash and a few other races, including the Tunnel 10k Run through the Mersey Tunnel, but at times I would still get out of the habit and would stop for a long while. I remember once even doing the Couch to 5k plan even though I would have considered myself a runner, just because it had been a while since I’d last run.I would mostly run distances around 5-10k, and at that time I remember thinking 10k was a long run, not really a training distance but a race only distance. I didn’t have any plans to go beyond, I suppose I still didn’t think of myself as a serious runner. One day when running with friends we did two laps of Sefton Park – it’s about a 4k loop – and I said to my friend “do you ever do three laps?” I seem to remember her saying no, but then somehow the conversation got onto whether I’d be doing the Liverpool Half Marathon. Again I scoffed, a distance with “marathon” in the title?! No chance! Again it must have sat in my mind as a “why not?” as ultimately I did start looking at training plans and made a start on training.The plan I used was from Runners Connect, it was a decent plan that took you from being an occasional runner to completing the distance. It involved running the full distance once in training and I still remember the moment I finished that run and feeling a great sense of achievement. The training plan must have worked wonders as I completed my first attempt at a half marathon race in 1:40:00 (exactly!) A time, in fact, that I’ve never managed to beat (and 12 years on probably never will!)I actually ran the same event the following year (1:43:something if I recall) and did continue to run and do a few other races over the years that followed. I also started working for a company with lots of other runners, we were all remote so only ran together every 3 months, but it was good to have people I could discuss running with and have a sense of camaraderie. I never really had any aim for my running though and so would easily fall into periods when I didn’t run very much. It was after one of these periods when I saw a tweet from a friend; she was running regularly and would always post a photo of herself at the end of the run smiling despite the difficulties she encountered. On the 1st January 2020, inspired by one of her runs, having not run much for a while and barely above 5k I decided that I should do the 14-15km loop around the parks of South Liverpool that my friend Hakim came up with. I really enjoyed myself and made the decision to start running regularly again.Over the next month I started (probably during runs) coming up with a list of Goals, things that I wanted to achieve with my running. I also thought it would be a good idea to put them somewhere public to keep me accountable. For want of a better place I put them on GitHub as a Gist, but that turned out to be a good idea as it has meant that I have a full history of all the changes I made. You can of course still see the original list there but I’ll copy it here:Running Goals## 20201. Run a half marathon2. Run a 5k race3. Run for more than 2 hours4. Run for longer than a half marathon5. Run 500km in the year## Beyond* Run a marathon* Run longer than a marathon* Run a trail race* Run a 5k in less than 20 minutesFor someone who had run a maximum of a half marathon, and hadn’t done that for 6 years, I’d say that was quite a reasonable set of goals and would keep me going for a while. As it turned out I managed a half marathon distance within a few weeks and also hit the “more than 2 hours” and “longer than a half marathon” (just barely!) Some re-evaluation was needed!Looking at my initial edits I decided to add a smaller distance goal, to at least run further than I did in 2019. I also added goals to run a half marathon race and also a 5k race. I added some goals about “decently longer” than a half marathon too but put them in the “Beyond” section.I managed to complete the half marathon race goal just days before the UK was put into lockdown for the COVID-19 pandemic. As that year progressed I found myself slightly jealous of all the (mostly childless!) people taking on new hobbies and getting into exercise. I mean, I made the decision to get back into running before lockdown! I have to admit that lockdown probably did give me the opportunity to spend more time running, especially as there was no activities to take the children to. I managed to get through a few more goals and developed the list a little more, with the year ending as follows:## 20201. ✅ Run further than I did in 2019 (153km)2. ✅ Run a half marathon distance3. ✅ Run a half marathon race4. Run a 5k race5. ✅ Run for more than 2 hours6. ✅ Run for longer than a half marathon7. ✅ Run 500km in the year8. ✅ Run 1000km in the year9. ✅ Run a 5k in less than 20 minutes10. ✅ Run something decently beyond a half marathon rather than just a little bit11. ✅ Run something decently beyond 2 hours rather than just a little bit12. ✅ Run marathon distanceSo not only did I do something decently longer than a half marathon, I actually managed to complete a marathon distance, on the last day of the year! To be honest I’d probably say that was an overly long list of goals, but you can see how I started relatively small and went on from there.Now I feel like this blog post is getting quite long (and I’ve been tweaking it for 9 months!), so having taken you through my running background, I’ll pause here and in a future blog post will talk about how I’ve used the goals and how things have progressed over the last 5 years.",
            "content_html": "<p>I want to blog about running, but having never mentioned it on here I feel like I should give some history, so let’s go back in time….</p><p>Back in 2008 my old boss Steve Frater mentioned to me that he was planning to run a 10k race near me and would I like to join him.</p><blockquote>  <p>I’ve just entered the Liverpool 10K on Oct 5th - that gives you plenty of time to train so how about it?</p></blockquote><p>I laughed at him and said that I don’t run, I cycle, but for some reason I did start considering it and ultimately did sign up. (Looks like his original suggestion was in April and I didn’t sign up until August the 1st!) I must have caught the bug as I ended up agreeing to do a 5k race two weeks before this too.</p><p>Over the years I did keep running but I didn’t really get into a regular pace, sometimes I’d run with friends, sometimes not. I did the Santa Dash and a few other races, including the Tunnel 10k Run through the Mersey Tunnel, but at times I would still get out of the habit and would stop for a long while. I remember once even doing the Couch to 5k plan even though I would have considered myself a runner, just because it had been a while since I’d last run.</p><p>I would mostly run distances around 5-10k, and at that time I remember thinking 10k was a <em>long</em> run, not really a training distance but a race only distance. I didn’t have any plans to go beyond, I suppose I still didn’t think of myself as a serious runner. One day when running with friends we did two laps of Sefton Park – it’s about a 4k loop – and I said to my friend “do you ever do three laps?” I seem to remember her saying no, but then somehow the conversation got onto whether I’d be doing the Liverpool Half Marathon. Again I scoffed, a distance with “marathon” in the title?! No chance! Again it must have sat in my mind as a “why not?” as ultimately I did start looking at training plans and made a start on training.</p><p>The plan I used was from <a href=\"https://runnersconnect.net/\">Runners Connect</a>, it was a decent plan that took you from being an occasional runner to completing the distance. It involved running the full distance once in training and I still remember the moment I finished that run and feeling a great sense of achievement. The training plan must have worked wonders as I completed my first attempt at a half marathon race in 1:40:00 (exactly!) A time, in fact, that I’ve never managed to beat (and 12 years on probably never will!)</p><p>I actually ran the same event the following year (1:43:something if I recall) and did continue to run and do a few other races over the years that followed. I also started working for a company with lots of other runners, we were all remote so only ran together every 3 months, but it was good to have people I could discuss running with and have a sense of camaraderie. I never really had any aim for my running though and so would easily fall into periods when I didn’t run very much. It was after one of these periods when I saw a tweet from a friend; she was running regularly and would always post a photo of herself at the end of the run smiling despite the difficulties she encountered. On the 1st January 2020, inspired by one of her runs, having not run much for a while and barely above 5k I decided that I should do the 14-15km loop around the parks of South Liverpool that my friend Hakim came up with. I really enjoyed myself and made the decision to start running regularly again.</p><p><img src=\"/assets/IMG_5406.jpeg\" alt=\"John McKerrell during a run, his head and shoulders are in the foreground wearing a &quot;day glo&quot; green coat, behind is a dual carriageway and bare trees suggesting a winter's day\" /></p><p>Over the next month I started (probably during runs) coming up with a list of Goals, things that I wanted to achieve with my running. I also thought it would be a good idea to put them somewhere public to keep me accountable. For want of a better place I put them on <a href=\"https://gist.github.com/johnmckerrell/710be4092919ed2578711cb401bb8127\">GitHub as a Gist</a>, but that turned out to be a good idea as it has meant that I have a full history of all the changes I made. You can of course still see the original list there but I’ll copy it here:</p><div class=\"language-plaintext highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>Running Goals## 20201. Run a half marathon2. Run a 5k race3. Run for more than 2 hours4. Run for longer than a half marathon5. Run 500km in the year## Beyond* Run a marathon* Run longer than a marathon* Run a trail race* Run a 5k in less than 20 minutes</code></pre></div></div><p>For someone who had run a maximum of a half marathon, and hadn’t done that for 6 years, I’d say that was quite a reasonable set of goals and would keep me going for a while. As it turned out I managed a half marathon distance within a few weeks and also hit the “more than 2 hours” and “longer than a half marathon” (just barely!) Some re-evaluation was needed!</p><p>Looking at my initial edits I decided to add a smaller distance goal, to at least run further than I did in 2019. I also added goals to run a half marathon <em>race</em> and also a 5k race. I added some goals about “decently longer” than a half marathon too but put them in the “Beyond” section.</p><p>I managed to complete the half marathon race goal just days before the UK was put into lockdown for the COVID-19 pandemic. As that year progressed I found myself slightly jealous of all the (mostly childless!) people taking on new hobbies and getting into exercise. I mean, I made the decision to get back into running before lockdown! I have to admit that lockdown probably did give me the opportunity to spend more time running, especially as there was no activities to take the children to. I managed to get through a few more goals and developed the list a little more, with the year ending as follows:</p><div class=\"language-plaintext highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>## 20201. ✅ Run further than I did in 2019 (153km)2. ✅ Run a half marathon distance3. ✅ Run a half marathon race4. Run a 5k race5. ✅ Run for more than 2 hours6. ✅ Run for longer than a half marathon7. ✅ Run 500km in the year8. ✅ Run 1000km in the year9. ✅ Run a 5k in less than 20 minutes10. ✅ Run something decently beyond a half marathon rather than just a little bit11. ✅ Run something decently beyond 2 hours rather than just a little bit12. ✅ Run marathon distance</code></pre></div></div><p>So not only did I do something decently longer than a half marathon, I actually managed to complete a marathon distance, on the last day of the year! To be honest I’d probably say that was an overly long list of goals, but you can see how I started relatively small and went on from there.</p><p>Now I feel like this blog post is getting quite long (and I’ve been tweaking it for 9 months!), so having taken you through my running background, I’ll pause here and in a future blog post will talk about how I’ve used the goals and how things have progressed over the last 5 years.</p>",
            "url": "https://blog.johnmckerrell.com/2025/09/14/fitness-goals-and-my-running-history/",
            
            
            
            
            
            "date_published": "2025-09-14T01:28:55+01:00",
            "date_modified": "2025-09-14T01:28:55+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2021/03/20/starting-a-running-log/",
            "title": "Starting a running log",
            "summary": null,
            "content_text": "I was listening to a podcast recently that suggested that everyone (who runs) should keep a running log, to keep more than just the details of a run like the distance and time but also how you feel on the run and what you were thinking about while you were out. I thought I’d give it a go.I started writing this post a long time ago, it’s now 29th December 2024! It seems that while I didn’t do anything with my blog I have been writing regular notes for my runs since around March 2021, i.e. when I started writing this post. I don’t write much, just a little around any problems, aches or pains that I had. It’s probably useful really just because it puts my mind at ease, as even if I don’t feel 100% on one run it generally doesn’t last.Not going to extend this specific post much now but I do hope to write more about my running in the near future (so going by the current cadence, 2027?)The podcast I was listening to is from Runners Connect,",
            "content_html": "<p>I was listening to a podcast recently that suggested that everyone (who runs) should keep a running log, to keep more than just the details of a run like the distance and time but also how you feel on the run and what you were thinking about while you were out. I thought I’d give it a go.</p><hr /><p>I started writing this post a long time ago, it’s now 29th December 2024! It seems that while I didn’t do anything with my blog I have been writing regular notes for my runs since around March 2021, i.e. when I started writing this post. I don’t write much, just a little around any problems, aches or pains that I had. It’s probably useful really just because it puts my mind at ease, as even if I don’t feel 100% on one run it generally doesn’t last.</p><p>Not going to extend this specific post much now but I do hope to write more about my running in the near future (so going by the current cadence, 2027?)</p><p>The podcast I was listening to is from <a href=\"https://runnersconnect.net/\">Runners Connect</a>,</p>",
            "url": "https://blog.johnmckerrell.com/2021/03/20/starting-a-running-log/",
            
            
            
            
            
            "date_published": "2021-03-20T19:43:55+00:00",
            "date_modified": "2021-03-20T19:43:55+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2019/11/02/ming-and-the-kindle/",
            "title": "MING and the Kindle",
            "summary": null,
            "content_text": "I’ve recently been playing with a set of technologies that are becomingknown as the MING stack which consists of:  MQTT - A pub-sub message queue/protocol  Influx DB - A time series database  Node-RED - A GUI tool for doing event driven programming in a web browser  Grafana - A graphing dashboard toolWe’ve had these set up for a while in DoES Liverpool to monitor the poweruse of the space and of some individual devices. Julianset up a device that watches the flashes from the electricity meter andpublishes messages via the Wi-Fi to an MQTT broker. Node-Red picks up onthese and pushes them into an InfluxDB database. Grafana then reads thevalues from the databases and publishes them in graphs. We’ve also gota variety of Sonoff devices around the space that can measure the powerusage of the things they’re plugged into, or turn those things off and on.The above image shows the overall power use of the space with someindividual items super-imposed, also the usage of the coffee machine. There’salso a graph showing eight separate temperatures across Room 29.In March of this year I had solar panels and a battery installed at my home.We havean 8kW solar system and a 4.4kWh battery. These did really well over thesummer and the Moixa battery system we have does give us some good graphsand data about our usage, but this is all in a cloud system and doesn’tgive me much access to the data. I wanted to take control of this a bitmore, so seeing the MING setup work so well in DoES Liverpool it was obviousthat I needed something similar at home.Getting things set up was a bit fiddly, in the end I found that Node-REDactually offers a script for getting Node, NPM and Node-RED properly setup ona Pi.. I think Ialso followed the instructions on this pageto install InfluxDB but then it seems like I just used the Grafana that isavailable in Raspbian, so installing that would be as simple as:Actually I used the official instructions for influxdb, I think first time around I downloaded a deb for grafana but now I’ve switched to using their apt repoapt-get install grafanaBecause our solar was installed a few months before our battery went in wewere given a little Owl Intuition box that monitored our solar output andreported it on a web page. I noticed that it had some UDP settings andafter some investigation found that it actually broadcasts its data on theinternal network on a UDP port. This was really easy to use with Node-REDI started writing this post a /long/ time ago. Today is 28th December 2024 so five years have passed. I’m now using PostgreSQL for the database as I had problems storing all my data in InfluxDB on a 32bit Raspberry Pi install. It’s definitely slower but has now got data for 3 years in. Apart from that the setup is somewhat the same. Apologies for not actually filling all the details in above but I’m sure it’s easy enough to find instructions on the internet now, or just ask an LLM!",
            "content_html": "<p><img src=\"/assets/solar-roof.jpg\" alt=\"\" /></p><p>I’ve recently been playing with a set of technologies that are becomingknown as the MING stack which consists of:</p><ul>  <li>MQTT - A pub-sub message queue/protocol</li>  <li>Influx DB - A time series database</li>  <li>Node-RED - A GUI tool for doing event driven programming in a web browser</li>  <li>Grafana - A graphing dashboard tool</li></ul><p>We’ve had these set up for a while in DoES Liverpool to monitor the poweruse of the space and of some individual devices. <a href=\"https://twitter.com/goatchurch\">Julian</a>set up a device that watches the flashes from the electricity meter andpublishes messages via the Wi-Fi to an MQTT broker. Node-Red picks up onthese and pushes them into an InfluxDB database. Grafana then reads thevalues from the databases and publishes them in graphs. We’ve also gota variety of Sonoff devices around the space that can measure the powerusage of the things they’re plugged into, or turn those things off and on.</p><p><img src=\"/assets/does-grafana-2019.png\" alt=\"\" /></p><p>The above image shows the overall power use of the space with someindividual items super-imposed, also the usage of the coffee machine. There’salso a graph showing eight separate temperatures across Room 29.</p><p>In March of this year I had solar panels and a battery installed at my home.We havean 8kW solar system and a 4.4kWh battery. These did really well over thesummer and the Moixa battery system we have does give us some good graphsand data about our usage, but this is all in a cloud system and doesn’tgive me much access to the data. I wanted to take control of this a bitmore, so seeing the MING setup work so well in DoES Liverpool it was obviousthat I needed something similar at home.</p><p>Getting things set up was a bit fiddly, in the end I found that Node-REDactually offers <a href=\"https://nodered.org/docs/getting-started/raspberrypi\">a script for getting Node, NPM and Node-RED properly setup ona Pi.</a>. I think Ialso followed <a href=\"http://www.andremiller.net/content/grafana-and-influxdb-quickstart-on-ubuntu\">the instructions on this page</a>to install InfluxDB but then it seems like I just used the Grafana that isavailable in Raspbian, so installing that would be as simple as:</p><p>Actually I used the official instructions for influxdb, I think first time around I downloaded a deb for grafana but now I’ve switched to using their apt repo</p><div class=\"language-plaintext highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>apt-get install grafana</code></pre></div></div><p>Because our solar was installed a few months before our battery went in wewere given a little Owl Intuition box that monitored our solar output andreported it on a web page. I noticed that it had some UDP settings andafter some investigation found that it actually broadcasts its data on theinternal network on a UDP port. This was really easy to use with Node-RED</p><hr /><p>I started writing this post a /long/ time ago. Today is 28th December 2024 so five years have passed. I’m now using PostgreSQL for the database as I had problems storing all my data in InfluxDB on a 32bit Raspberry Pi install. It’s definitely slower but has now got data for 3 years in. Apart from that the setup is somewhat the same. Apologies for not actually filling all the details in above but I’m sure it’s easy enough to find instructions on the internet now, or just ask an LLM!</p>",
            "url": "https://blog.johnmckerrell.com/2019/11/02/ming-and-the-kindle/",
            
            "external_url": "https://blog.johnmckerrell.com/2019/11/02/ming-and-the-kindle/",
            
            
            
            "date_published": "2019-11-02T12:35:55+00:00",
            "date_modified": "2019-11-02T12:35:55+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2018/05/09/ethans-name-plate/",
            "title": "Ethan's Name Plate",
            "summary": null,
            "content_text": "My daughter Evie was given a very nice thing soon after she was born - her namecut out of a piece of wood. My son Ethan however wasn’t bought such a thing and I decided thatI should try to make something along the same lines. The idea developed into making a nameplatefor his bedroom and after thinking about it for a little while I came up with an idea.The laser cutter is still my favourite thing in the DoES Liverpool workshop, and the thing thatI’m most capable of using, but it does have its limitations. It only produces flat things, itcan only cut thicknesses of maybe 3-6mm, and it really produces things in only 1 or 2 colours(the colour of the material and whatever colour it turns out if you engrave).I don’t entirely remember where the idea came from but I decided that I’d like to try layeringmultiple materials on top of each other to allow me to introduce more colours. I also cameup with the idea of a forest scene. Part of the idea behind this was to give me the option ofmixing wood and acrylic together in the piece. I decided on a night time scene as that feelslike the most interesting time to be in a forest, with a full moon beaming down and some ofthe nocturnal creatures coming out.I don’t really think of myself as a very artistic person but I did want to avoid simplypulling together clip art so I decided that I really had to create all the elements that Iwas going to use by myself. As I work most of the week and do childcare most of the other timesI really just had short snippets of time to work on the project during the evenings. I findthis can actually work quite well sometimes as it forces me to think about things more ratherthan just diving in and rushing things. Although it can be a little frustrating when a few days goespast and all you’ve done is draw a few branches!For the night sky I decided to try a few things that might make it more interesting. Laminatedacrylic is a thin plastic material that is made by layering two colours of material together.One of the layers is particularly thin and is ideal for engraving. Generally when you engraveacrylic on a laser the result is actually really subtle. Whereas with plywood where you go froma quite light brown to a much darker brown, acrylic doesn’t really change colour,rather it’s more the shadow caused by the indent that you see. With the laminated acrylic youcan get a much more noticeable difference as the thinner layer gets engraved awayshowing a completely different colour underneath. Looking at the colours of laminated acrylicavailable there was a nice black on white option that would really work well for a nightsky as I could engrave away the black to reveal stars and the moon.Going for realism I also decided that I should really make my moon more than just a big whitecircle. Fortunately just a few weeks earlier there had been a super moon and lots of people,me included, had taken photos of it. I used one of the pictures I had taken and applied the “Posterise”filter in the Gnu Image Manipulation Program (GIMP) to reduce it to just a few colours. Ithen used Inkscape’s “Trace Bitmap” feature to convert this into vectors suitable for thelaser cutter. Even with the laminated plastic you still only really get 2 colour optionsbut I decided to try engraving the material twice, so that I engraved the black to revealwhite underneath, and then on top of that white did some further engraving to add texture tomy moon. The effect actually came out really well, I was very happy with the result.NASA release most (all?) of their imagery under a public domain license so there’s a few morelittle items of interest that I added but will leave them to be found rather than describingthem here.The sky layer was quite simple to do structurally as it simply consisted of a rounded box withthe moon and some stars engraved on top. When it came to the other layers I was going to have tostart cutting elements out, allowing the layers below to show through, but I needed to do thiswhile making sure the whole piece was structurally sound and that pieces wouldn’t eitherfall through following the laser cutting, or break off easily. Fortunately even in a forestyou’re going to get some overlap so I just needed to make sure that my trees overlapped enoughto touch the sides and each other, whilst leaving enough space to see the sky below. I wasintending to build the trees up from two layers, one for the branches and another for the foliagebut again I wanted to make sure I left enough gaps in the foliage so that you could actually seeand appreciate the tree trunks I’d put so much time into designing. I did this by mixing someconifer trees with some deciduous which gave me good opportunities to show the trunks. I dolike the idea of having hidden elements which, even though they won’t necessarily be seen, Ihave still put some care and attention into having them look at their best.The foliage for a conifer tree is fairly simple to do, if you can imagine a child’s drawingof a Christmas tree you can imagine my artistic prowess! I wanted to add some texture to thesetoo rather than having a plain green layer so I added some zig-zag shapes to further suggestfoliage. My first attempt at doing this was to draw these shapes as lines which I cut on thelaser at high speed and low power so that the line was simply engraved, but I found this gavea much narrower line than I wanted and didn’t look particularly good, so to get the bestresult I increased the stroke width of my lines in Inkscape then used the “Stroke to Path”menu option to turn this into a polygon that could be engraved properly. The foliage layerwas again a little tricky as I had to make sure that the tree touched the frame enough thatthey wouldn’t break. I had to balance this with allowing enough space so that the layersbelow would show through. Fortunately in the final product this layer would be sandwiched by otherlayers and as this isn’t intended as a toy there shouldn’t be too much risk of breakage.As I’ve said this method of working was limiting my colour options. I was intending to useplywood for the branches of the trees and green perspex for the foliage so I decided to addsome woodland creatures to the tree branch layer so that I could reuse the brown for fur, asit happens they’re mostly blocked out by the other layers but there’s definitely a littlecrudely drawn squirrel peeping out.The final layer was of course the text layer. Again I decided to use plywood for this layer.I didn’t want to overcomplicate things and it felt like interchanging plywood and acrylic forevery other layer would give a nice effect. It actually took me quite a long time to find justthe right font. I had some idea in mind of swirly lettering but couldn’t quite work out what Iwanted, I forget what search terms I was using but I think I was looking for something vaguelyCeltic. In the end I found Ober Tuerkheim which gives a great effect. Again I had to work tomake sure that the letters would be properly attached to the frame and wouldn’t be likely tobreak.As you can see the first and last letters overlapped the frame, and the “h” was large enoughto overlap the frame at the bottom, even breaking the fourth wall. To solve the issue of theother letters I ended up connecting them with small tabs. I can’t quite remember where I gotthe shapes for the tabs, quite possibly it was a hyphen or other shape from the font, I thenmoved it around and rotated it to look just right. I didn’t particularly want the tabs to bea feature of the design though so I ended up removing the ends of them. This was actually afairly simple though time consuming process which I had used multiple times in the project todeal with overlaps, e.g the overlapping branches of the tree. Whenever I had an overlap I wouldwant to only cut the outside of the shapes, and then etch a line to show the overlapping part.Here’s a breakdown of how this worked for the letters  Letter and tab   Duplicate both paths and use the intersection tool (I’ve shifted it over and made it red so you can see it)   Now union the original elements to get the cut path   Moving the piece that we broke out using intersection into place   Here you can see the nodes of the intersected piece   In this case I don’t actually want the tab to be visible so I remove all segments apart from the one that made up the edge of the letter E   And here is the finished product Such a convoluted process really just to get that little line but it really does give a goodeffect when used throughout. I used a very similar process for overlapping branches as mentionedbut here I would end up with little squares making up the intersected part and I’d need to removeopposite edges to show a single branch overlapping the other branch.Anyway, enough about process and techniques, I’m sure you’ve been waiting to see the finishedarticle, so here it is:I stained the tree branch layer and used danish oil to finish the letters layer so even thoughthey were both made with Birch ply I still got to differentiate their colours. All-in-all Iwas really happy with how it came out. Ethan seemed to like it too!",
            "content_html": "<p>My daughter Evie was given a very nice thing soon after she was born - her namecut out of a piece of wood. My son Ethan however wasn’t bought such a thing and I decided thatI should try to make something along the same lines. The idea developed into making a nameplatefor his bedroom and after thinking about it for a little while I came up with an idea.</p><p>The laser cutter is still my favourite thing in the DoES Liverpool workshop, and the thing thatI’m most capable of using, but it does have its limitations. It only produces flat things, itcan only cut thicknesses of maybe 3-6mm, and it really produces things in only 1 or 2 colours(the colour of the material and whatever colour it turns out if you engrave).</p><p>I don’t entirely remember where the idea came from but I decided that I’d like to try layeringmultiple materials on top of each other to allow me to introduce more colours. I also cameup with the idea of a forest scene. Part of the idea behind this was to give me the option ofmixing wood and acrylic together in the piece. I decided on a night time scene as that feelslike the most interesting time to be in a forest, with a full moon beaming down and some ofthe nocturnal creatures coming out.</p><p>I don’t really think of myself as a very artistic person but I did want to avoid simplypulling together clip art so I decided that I really had to create all the elements that Iwas going to use by myself. As I work most of the week and do childcare most of the other timesI really just had short snippets of time to work on the project during the evenings. I findthis can actually work quite well sometimes as it forces me to think about things more ratherthan just diving in and rushing things. Although it can be a little frustrating when a few days goespast and all you’ve done is draw a few branches!</p><p>For the night sky I decided to try a few things that might make it more interesting. Laminatedacrylic is a thin plastic material that is made by layering two colours of material together.One of the layers is particularly thin and is ideal for engraving. Generally when you engraveacrylic on a laser the result is actually really subtle. Whereas with plywood where you go froma quite light brown to a much darker brown, acrylic doesn’t really change colour,rather it’s more the shadow caused by the indent that you see. With the laminated acrylic youcan get a much more noticeable difference as the thinner layer gets engraved awayshowing a completely different colour underneath. Looking at the colours of laminated acrylicavailable there was a nice black on white option that would really work well for a nightsky as I could engrave away the black to reveal stars and the moon.</p><p>Going for realism I also decided that I should really make my moon more than just a big whitecircle. Fortunately just a few weeks earlier there had been a super moon and lots of people,me included, had taken photos of it. I used one of the pictures I had taken and applied the “Posterise”filter in the Gnu Image Manipulation Program (GIMP) to reduce it to just a few colours. Ithen used Inkscape’s “Trace Bitmap” feature to convert this into vectors suitable for thelaser cutter. Even with the laminated plastic you still only really get 2 colour optionsbut I decided to try engraving the material twice, so that I engraved the black to revealwhite underneath, and then on top of that white did some further engraving to add texture tomy moon. The effect actually came out really well, I was very happy with the result.</p><p><img src=\"/assets/moon-processing.png\" alt=\"\" /></p><p>NASA release most (all?) of their imagery under a public domain license so there’s a few morelittle items of interest that I added but will leave them to be found rather than describingthem here.</p><p>The sky layer was quite simple to do structurally as it simply consisted of a rounded box withthe moon and some stars engraved on top. When it came to the other layers I was going to have tostart cutting elements out, allowing the layers below to show through, but I needed to do thiswhile making sure the whole piece was structurally sound and that pieces wouldn’t eitherfall through following the laser cutting, or break off easily. Fortunately even in a forestyou’re going to get some overlap so I just needed to make sure that my trees overlapped enoughto touch the sides and each other, whilst leaving enough space to see the sky below. I wasintending to build the trees up from two layers, one for the branches and another for the foliagebut again I wanted to make sure I left enough gaps in the foliage so that you could actually seeand appreciate the tree trunks I’d put so much time into designing. I did this by mixing someconifer trees with some deciduous which gave me good opportunities to show the trunks. I dolike the idea of having hidden elements which, even though they won’t necessarily be seen, Ihave still put some care and attention into having them look at their best.</p><p>The foliage for a conifer tree is fairly simple to do, if you can imagine a child’s drawingof a Christmas tree you can imagine my artistic prowess! I wanted to add some texture to thesetoo rather than having a plain green layer so I added some zig-zag shapes to further suggestfoliage. My first attempt at doing this was to draw these shapes as lines which I cut on thelaser at high speed and low power so that the line was simply engraved, but I found this gavea much narrower line than I wanted and didn’t look particularly good, so to get the bestresult I increased the stroke width of my lines in Inkscape then used the “Stroke to Path”menu option to turn this into a polygon that could be engraved properly. The foliage layerwas again a little tricky as I had to make sure that the tree touched the frame enough thatthey wouldn’t break. I had to balance this with allowing enough space so that the layersbelow would show through. Fortunately in the final product this layer would be sandwiched by otherlayers and as this isn’t intended as a toy there shouldn’t be too much risk of breakage.</p><p>As I’ve said this method of working was limiting my colour options. I was intending to useplywood for the branches of the trees and green perspex for the foliage so I decided to addsome woodland creatures to the tree branch layer so that I could reuse the brown for fur, asit happens they’re mostly blocked out by the other layers but there’s definitely a littlecrudely drawn squirrel peeping out.</p><p>The final layer was of course the text layer. Again I decided to use plywood for this layer.I didn’t want to overcomplicate things and it felt like interchanging plywood and acrylic forevery other layer would give a nice effect. It actually took me quite a long time to find justthe right font. I had some idea in mind of swirly lettering but couldn’t quite work out what Iwanted, I forget what search terms I was using but I think I was looking for something vaguelyCeltic. In the end I found Ober Tuerkheim which gives a great effect. Again I had to work tomake sure that the letters would be properly attached to the frame and wouldn’t be likely tobreak.</p><p><img src=\"/assets/ethan-nameplate-name-before.png\" alt=\"\" /></p><p>As you can see the first and last letters overlapped the frame, and the “h” was large enoughto overlap the frame at the bottom, even breaking the fourth wall. To solve the issue of theother letters I ended up connecting them with small tabs. I can’t quite remember where I gotthe shapes for the tabs, quite possibly it was a hyphen or other shape from the font, I thenmoved it around and rotated it to look just right. I didn’t particularly want the tabs to bea feature of the design though so I ended up removing the ends of them. This was actually afairly simple though time consuming process which I had used multiple times in the project todeal with overlaps, e.g the overlapping branches of the tree. Whenever I had an overlap I wouldwant to only cut the outside of the shapes, and then etch a line to show the overlapping part.Here’s a breakdown of how this worked for the letters</p><ul>  <li>Letter and tab <br /><img src=\"/assets/nameplate-E-1.png\" alt=\"\" /></li>  <li>Duplicate both paths and use the intersection tool (I’ve shifted it over and made it red so you can see it) <br /><img src=\"/assets/nameplate-E-2-duplicate-intersection.png\" alt=\"\" /></li>  <li>Now union the original elements to get the cut path <br /><img src=\"/assets/nameplate-E-3-union.png\" alt=\"\" /></li>  <li>Moving the piece that we broke out using intersection into place <br /><img src=\"/assets/nameplate-E-4.png\" alt=\"\" /></li>  <li>Here you can see the nodes of the intersected piece <br /><img src=\"/assets/nameplate-E-5-nodes.png\" alt=\"\" /></li>  <li>In this case I don’t actually want the tab to be visible so I remove all segments apart from the one that made up the edge of the letter E <br /><img src=\"/assets/nameplate-E-6-delete-segments.png\" alt=\"\" /></li>  <li>And here is the finished product <br /><img src=\"/assets/nameplate-E-7.png\" alt=\"\" /></li></ul><p>Such a convoluted process really just to get that little line but it really does give a goodeffect when used throughout. I used a very similar process for overlapping branches as mentionedbut here I would end up with little squares making up the intersected part and I’d need to removeopposite edges to show a single branch overlapping the other branch.</p><p><img src=\"/assets/nameplate-tree-branches.png\" alt=\"\" /></p><p>Anyway, enough about process and techniques, I’m sure you’ve been waiting to see the finishedarticle, so here it is:</p><p><img src=\"/assets/ethan-nameplate-finished-scaled.jpg\" alt=\"\" /></p><p>I stained the tree branch layer and used danish oil to finish the letters layer so even thoughthey were both made with Birch ply I still got to differentiate their colours. All-in-all Iwas really happy with how it came out. Ethan seemed to like it too!</p>",
            "url": "https://blog.johnmckerrell.com/2018/05/09/ethans-name-plate/",
            
            "external_url": "https://blog.johnmckerrell.com/2018/05/09/ethans-name-plate/",
            
            
            
            "date_published": "2018-05-09T07:31:55+01:00",
            "date_modified": "2018-05-09T07:31:55+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2018/01/17/year-notes-2016/",
            "title": "Year Notes: 2016",
            "summary": null,
            "content_text": "So 2016 started quite similarly to 2014 with a new baby in the house. I was fortunateenough that when agreeing to take the job at Axon Vibe I’d had the foresight to request that,in the event that we had another baby, I’d be able to take a 3 month extendedparental leave (unpaid). I was so glad I’d done that as it meant I could be much more involved inEthan’s early days and also give Evie some much needed attention too.Although I’d beenfreelance when we’d had Evie, so in theory was more in control of my time, I was also moreworried about what money was coming in. Although my extended leave was unpaid I didhave the security of knowing I had a well-paid job to go back to. I’m definitely a supporter ofextended parental leave, ideally paid, and was able to put this into practice when DoESLiverpool’s admin guy, Seán, had a child last year. We agreed to give him a month’s paidleave rather than the statutory minimum. Obviously as he’s a part-time worker the cost wasless to DoES than it might have been for a full-time person, and a month is still a lot less thanwe would have to give for maternity leave but I did want to make sure we did more than theminimum and was glad that the other directors of DoES agreed.Someone&#39;s chuffed to be a whole 2 months old! pic.twitter.com/MCmV3wEV5n&mdash; John McKerrell (@mcknut) February 3, 2016Looking back it seems like DoES Liverpool’s search for a new home began in earnest around March 2016. We looked at a few places around Bold Street and the Ropewalks, found a reasonable candidate on Victoria Street but then found what we thought could be a great option near the Ship &amp; Mitre pub off Dale Street. It was actually quite a large building, at 8000 square foot over 4 floors, but we were hoping that we might sublet out reasonably large portions of it to other businesses. We took the community on a series of visits and spent some time working out whether we would be able to afford it, but in the end the owners decided to rent it to a charity that they were involved with so it slipped out of our grasp. Following this we got a little jaded and as far as I can recall didn’t really do much more searching until 2017.I took Evie to MakeFest in the Central Library in Liverpool in June. It was nice to have a day out just her and me and she seemed to find it interesting,though was a bit nervous of some of the costumes from the Comic Con attendees who were wandering around!Makefest is a great showcase of “making” in Liverpool and beyond and has lots of interesting workshops.They’re actually planning for this year’s event so if you’re interested in exhibiting you should definitely sign up. (ahaha! yeah I started writing this in January 2018 so we’ve had two Makefest’s since)Supporting @lpoolgirlgeeks with Evie at @lpoolmakefest and #LivMF2016 pic.twitter.com/ktrDG3uE78&mdash; John McKerrell (@mcknut) June 25, 2016Jumping to the end of the year we finally come across one of the projects that I wanted to blog about, that triggered me starting on the whole “Year Notes” process!I laser cut some Christmas presents for the kids. It was quite a labour of love taking quitea while to prepare for (given I could only really work on it for minutes each evening) but Iwas very pleased with how they turned out… for more detail on that see this follow up blog post.You can tell this laser cutting is important as I&#39;ve actually bothered with masking tape to reduce scorch marks #weeknotes pic.twitter.com/2FaWvI99e8&mdash; John McKerrell (@mcknut) December 16, 2016",
            "content_html": "<p>So 2016 started quite similarly to 2014 with a new baby in the house. I was fortunateenough that when agreeing to take the job at Axon Vibe I’d had the foresight to request that,in the event that we had another baby, I’d be able to take a 3 month extendedparental leave (unpaid). I was so glad I’d done that as it meant I could be much more involved inEthan’s early days and also give Evie some much needed attention too.</p><p>Although I’d beenfreelance when we’d had Evie, so in theory was more in control of my time, I was also moreworried about what money was coming in. Although my extended leave was unpaid I didhave the security of knowing I had a well-paid job to go back to. I’m definitely a supporter ofextended parental leave, ideally paid, and was able to put this into practice when DoESLiverpool’s admin guy, Seán, had a child last year. We agreed to give him a month’s paidleave rather than the statutory minimum. Obviously as he’s a part-time worker the cost wasless to DoES than it might have been for a full-time person, and a month is still a lot less thanwe would have to give for maternity leave but I did want to make sure we did more than theminimum and was glad that the other directors of DoES agreed.</p><blockquote class=\"twitter-tweet\" data-lang=\"en\"><p lang=\"en\" dir=\"ltr\">Someone&#39;s chuffed to be a whole 2 months old! <a href=\"https://t.co/MCmV3wEV5n\">pic.twitter.com/MCmV3wEV5n</a></p>&mdash; John McKerrell (@mcknut) <a href=\"https://twitter.com/mcknut/status/694886094991712256?ref_src=twsrc%5Etfw\">February 3, 2016</a></blockquote><script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script><p>Looking back it seems like DoES Liverpool’s search for a new home began in earnest around March 2016. We looked at a few places around Bold Street and the Ropewalks, found a reasonable candidate on Victoria Street but then found what we thought could be a great option near the Ship &amp; Mitre pub off Dale Street. It was actually quite a large building, at 8000 square foot over 4 floors, but we were hoping that we might sublet out reasonably large portions of it to other businesses. We took the community on a series of visits and spent some time working out whether we would be able to afford it, but in the end the owners decided to rent it to a charity that they were involved with so it slipped out of our grasp. Following this we got a little jaded and as far as I can recall didn’t really do much more searching until 2017.</p><p>I took Evie to MakeFest in the Central Library in Liverpool in June. It was nice to have a day out just her and me and she seemed to find it interesting,though was a bit nervous of some of the costumes from the Comic Con attendees who were wandering around!Makefest is a great showcase of “making” in Liverpool and beyond and has lots of interesting workshops.They’re actually planning for this year’s event so if you’re interested in exhibiting <a href=\"https://lpoolmakefest.org\">you should definitely sign up.</a> (ahaha! yeah I started writing this in January 2018 so we’ve had two Makefest’s since)</p><blockquote class=\"twitter-tweet\" data-lang=\"en\"><p lang=\"en\" dir=\"ltr\">Supporting <a href=\"https://twitter.com/lpoolgirlgeeks?ref_src=twsrc%5Etfw\">@lpoolgirlgeeks</a> with Evie at <a href=\"https://twitter.com/LpoolMakeFest?ref_src=twsrc%5Etfw\">@lpoolmakefest</a> and <a href=\"https://twitter.com/hashtag/LivMF2016?src=hash&amp;ref_src=twsrc%5Etfw\">#LivMF2016</a> <a href=\"https://t.co/ktrDG3uE78\">pic.twitter.com/ktrDG3uE78</a></p>&mdash; John McKerrell (@mcknut) <a href=\"https://twitter.com/mcknut/status/746658075629727744?ref_src=twsrc%5Etfw\">June 25, 2016</a></blockquote><script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script><p>Jumping to the end of the year we finally come across one of the projects that I wanted to blog about, that triggered me starting on the whole “Year Notes” process!I laser cut some Christmas presents for the kids. It was quite a labour of love taking quitea while to prepare for (given I could only really work on it for minutes each evening) but Iwas very pleased with how they turned out… for more detail on that <a href=\"/2018/05/09/ethans-name-plate/\">see this follow up blog post.</a></p><blockquote class=\"twitter-tweet\" data-lang=\"en\"><p lang=\"en\" dir=\"ltr\">You can tell this laser cutting is important as I&#39;ve actually bothered with masking tape to reduce scorch marks <a href=\"https://twitter.com/hashtag/weeknotes?src=hash&amp;ref_src=twsrc%5Etfw\">#weeknotes</a> <a href=\"https://t.co/2FaWvI99e8\">pic.twitter.com/2FaWvI99e8</a></p>&mdash; John McKerrell (@mcknut) <a href=\"https://twitter.com/mcknut/status/809726494884982784?ref_src=twsrc%5Etfw\">December 16, 2016</a></blockquote><script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>",
            "url": "https://blog.johnmckerrell.com/2018/01/17/year-notes-2016/",
            
            "external_url": "https://blog.johnmckerrell.com/2018/01/17/year-notes-2016/",
            
            
            
            "date_published": "2018-01-17T07:06:23+00:00",
            "date_modified": "2018-01-17T07:06:23+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2017/11/03/year-notes-2015/",
            "title": "Year Notes: 2015",
            "summary": null,
            "content_text": "Last year’s notes ended with a cliff hanger, would I take a permanent job at Axon Vibe or would I not? Well the year began straight away with a visit to head office. Flying out to Lucerne in Switzerland on the fifth of January. This was actually my wife’s first day back in work after being off for over a year’s maternity leave. It was unfortunate to have to leave her to sort out our daughter during her first week but I did at least get a later flight so that I could help get Evie to her first morning in nursery.After much consideration I ultimately decided to take the job at Axon Vibe. I was intending to continue working for them so it’s not like I was looking for other clients, and the money was such that I wasn’t losing out by being a salaried worker. By this point I’d already agreed that I would have my daughter on Friday afternoons so I ultimately decide to work Monday - Thursday but to keep Friday for myself. That would allow me to keep working on my own apps or even doing small amounts of client work on Friday mornings. The view from the terrace (see above) certainly didn’t hurt either!I wasn’t going to mention too much about what we did at Axon Vibe that year as very little of what we did then has survived. We took some time to work out what our key offering would be, sometimes focussing on business to business applications, and at others trying to develop public facing apps. One interesting thing was that we took on a number of developers and a designer who all worked from DoES Liverpool. By the end of the year we actually had 4 people all working from Liverpool. That was great to see, even if I did find it a little strange sharing an office with colleagues! We also enjoyed a great week in October when we managed to persuade colleagues from Cirencester, Norwich and Edinburgh to visit while we worked on new developments.Way back in 2011 I’d actually taken over the running of a monthly event that would have geeks meeting up in a local bar on the last Tuesday of the month either just for a social meet-up or to hear someone talking about some technology or, well, anything that happened to interest them. GeekUp was a venerable event that started way back in December 2005 in Manchester. Over time the event became more popular and drew in people from surrounding towns, Liverpool included. I attended my first event in March 2007, gave a talk on OpenStreetMap at the following event and then was glad to attend the inaugural event in Liverpool later that month.Running for so many years, GeekUp was such a great way for similarly minded folks in Liverpool to connect. Most of my friendships in Liverpool can be traced back to GeekUp, especially if you consider that I would never have co-founded DoES Liverpool if I hadn’t met Adrian McEwen there.  While I enjoyed attending GeekUp I found I wasn’t the best at running it. It was easier when we met in a bar as if there was no talk you could easily just chat and have a drink. It’s amazing how a simple schedule of “last Tuesday of the month” and perhaps the odd “Are you going to GeekUp?” on twitter would keep the event going quite well. GeekUp ran for four years meeting in 3345 (now “The Attic”) on Parr Street. On one of the last meetings there we found the room had been double booked (I’m sure with UKIP!) and it turned out we no longer had the booking at all. As we were in the process of setting up DoES Liverpool, and we were planning to host events there, we had a single meeting in Leaf on Bold Street, before moving the event to DoES.This change really affected the dynamic of the event, it was more difficult to get into the space and when you arrived you found a bland room of desks so it was quite different to meeting in a bar. We actually managed to continue for four more years but I struggled to get around to finding people to talk. Then in 2014 when I did manage to arrange and promote in advance a great line-up of speakers, I struggled to attract an audience! In the end I decided that life was complicated enough without the monthly stress of finding a speaker so 2015 was the year I brought the whole thing to an end. Although I don’t really get time to go out so much these days it does seem like Liverpool is missing a general geeky social meet like this now so it’s a shame there is no GeekUp, but there’s nothing saying someone couldn’t take it on again in the future!I continued with my running this year too. Living just 4km away from DoES Liverpool it’s actually an easy and fairly short run to get into the office and I’ve tried at times to make it my primary way of commuting. I haven’t managed it often but have a few times managed to run there and back for the four days I would be in the office. No Half Marathon this year but I signed up for the Spring 10K around Sefton Park and managed to beat my personal best of around 46 minutes, I wasn’t too confident as I hadn’t done much speed training but was very happy when I blew almost 3 minutes off my record!Ok, last tweet on the subject, official results are in, 43:11 :-D http://t.co/Q9bULaos6D pic.twitter.com/o25JdXd2Yb&mdash; John McKerrell (@mcknut) May 4, 2015I tried to take up gardening as a hobby to brighten the place up. I even planted potatoes so that we’d get greenery and useful, tasty potatoes. Though at times the potatoes seemed like they were trying to take over the DoES Liverpool meeting room we didn’t really have a very prosperous harvest and it felt like the time and effort could be better placed!.@DoESLiverpool potato update: Growing pretty well! Should be harvesting in the next few weeks #weeknotes pic.twitter.com/p1A51gXB3e&mdash; John McKerrell (@mcknut) June 1, 2015DoES Liverpool could still benefit from some more plant life but there definitely needs to be a plan for maintenance for this sort of thing! 🌻Hm.. anything else happen in 2015? Well we made this little announcement:Happy to announce that Evie is looking forward to being a big sister! All going well so far. #duedecember pic.twitter.com/iImTotOhFr&mdash; John McKerrell (@mcknut) July 29, 2015As we settled into our new life with work and nursery and with Evie being such a good sleeper we decided that we might actually like to have another little person around the place. Funnily enough while Evie had actually come 10 days late Ethan actually came along exactly on his due date!I won on the premium bonds today but I think yesterday&#39;s prize was better! #itsaboy pic.twitter.com/PXOmL0KpsH&mdash; John McKerrell (@mcknut) December 4, 2015While Ethan seemed originally to be feeding okay we ended up having similar troubles with him losing too much weight and being harassed by mid-wives. After a week of problems we went along to an infant feeding clinic only to be told that Ethan had a tongue tie. A tiny piece of skin was stopping him from being able to move his tongue freely and causing him problems with feeding. Unfortunately our options were limited to waiting 2 months for an appointment in Alder Hey or trying to get it done in Chester Hospital. There was also the option of going private but we really didn’t think we should have to do that and also of the standards of care we’d receive. Being so close to Christmas we were quite concerned about whether we’d managed to get it done before the holidays so we were very happy when we got an appointment for the 23rd December. Poor Ethan ended up picking up a cold meaning the nurse almost couldn’t complete the tongue tie snip, and as it turned out had probably missed some as it really didn’t make much difference to his feeding. It seems ridiculous having to wait three weeks for something that should have been picked up and fixed while he was still in the hospital, and that the much vaunted and well-funded Alder Hey couldn’t do anything about it for months. Obviously we can’t be sure that dealing with it straight away would have reduced the problems, but it would have given Ethan a much better chance and given my poor stressed wife one less thing to worry about!I feel I should finish on a lighter note though so let’s back-track to October, we’d been invited to a Halloween party and I couldn’t think of what to go as. My wife spotted a Jack Skellington costume in the shop and came up with the great idea of combining it with one of my old Santa Dash costumes, resulting in this great result:Bit of recycling went on for my Halloween costume pic.twitter.com/bPsG6YcrY0&mdash; John McKerrell (@mcknut) October 31, 2015",
            "content_html": "<p>Last year’s notes ended with a cliff hanger, would I take a permanent job at Axon Vibe or would I not? Well the year began straight away with a visit to head office. Flying out to Lucerne in Switzerland on the fifth of January. This was actually my wife’s first day back in work after being off for over a year’s maternity leave. It was unfortunate to have to leave her to sort out our daughter during her first week but I did at least get a later flight so that I could help get Evie to her first morning in nursery.</p><p><img src=\"https://pbs.twimg.com/media/B6vO8QbCMAEF8KK.jpg\" alt=\"View from the office terrace\" /></p><p>After much consideration I ultimately decided to take the job at Axon Vibe. I was intending to continue working for them so it’s not like I was looking for other clients, and the money was such that I wasn’t losing out by being a salaried worker. By this point I’d already agreed that I would have my daughter on Friday afternoons so I ultimately decide to work Monday - Thursday but to keep Friday for myself. That would allow me to keep working on my own apps or even doing small amounts of client work on Friday mornings. The view from the terrace (see above) certainly didn’t hurt either!</p><p>I wasn’t going to mention too much about what we did at Axon Vibe that year as very little of what we did then has survived. We took some time to work out what our key offering would be, sometimes focussing on business to business applications, and at others trying to develop public facing apps. One interesting thing was that we took on a number of developers and a designer who all worked from DoES Liverpool. By the end of the year we actually had 4 people all working from Liverpool. That was great to see, even if I did find it a little strange sharing an office with colleagues! We also enjoyed a great week in October when we managed to persuade colleagues from Cirencester, Norwich and Edinburgh to visit while we worked on new developments.</p><p>Way back in 2011 I’d actually taken over the running of a monthly event that would have geeks meeting up in a local bar on the last Tuesday of the month either just for a social meet-up or to hear someone talking about some technology or, well, anything that happened to interest them. GeekUp was a venerable event that started way back in <a href=\"http://geekup.org/events/1/\">December 2005</a> in Manchester. Over time the event became more popular and drew in people from surrounding towns, Liverpool included. I attended my first event in <a href=\"http://geekup.org/events/20/\">March 2007</a>, gave a talk on OpenStreetMap at the <a href=\"http://geekup.org/events/21/\">following event</a> and then was glad to attend the <a href=\"http://geekup.org/events/22/\">inaugural event in Liverpool</a> later that month.</p><p>Running for so many years, GeekUp was such a great way for similarly minded folks in Liverpool to connect. Most of my friendships in Liverpool can be traced back to GeekUp, especially if you consider that I would never have co-founded DoES Liverpool if I hadn’t met Adrian McEwen there.  While I enjoyed attending GeekUp I found I wasn’t the best at running it. It was easier when we met in a bar as if there was no talk you could easily just chat and have a drink. It’s amazing how a simple schedule of “last Tuesday of the month” and perhaps the odd “Are you going to GeekUp?” on twitter would keep the event going quite well. GeekUp ran for four years meeting in 3345 (now “The Attic”) on Parr Street. On one of the last meetings there we found the room had been double booked (I’m sure with UKIP!) and it turned out we no longer had the booking at all. As we were in the process of setting up DoES Liverpool, and we were planning to host events there, we had a single meeting in Leaf on Bold Street, before moving the event to DoES.</p><p>This change really affected the dynamic of the event, it was more difficult to get into the space and when you arrived you found a bland room of desks so it was quite different to meeting in a bar. We actually managed to continue for four more years but I struggled to get around to finding people to talk. Then in 2014 when I did manage to arrange and promote in advance a great line-up of speakers, I struggled to attract an audience! In the end I decided that life was complicated enough without the monthly stress of finding a speaker so 2015 was the year I brought the whole thing to an end. Although I don’t really get time to go out so much these days it does seem like Liverpool is missing a general geeky social meet like this now so it’s a shame there is no GeekUp, but there’s nothing saying someone couldn’t take it on again in the future!</p><p><a href=\"https://twitter.com/mcknut/statuses/562163781703569408\">I continued with my running this year too</a>. Living just 4km away from DoES Liverpool it’s actually an easy and fairly short run to get into the office and I’ve tried at times to make it my primary way of commuting. I haven’t managed it often but have a few times managed to <a href=\"https://twitter.com/mcknut/statuses/573894268856705025\">run there and back for the four days I would be in the office</a>. No Half Marathon this year but I signed up for the Spring 10K around Sefton Park and managed to beat my personal best of around 46 minutes, I wasn’t too confident as I hadn’t done much speed training but was very happy when I blew almost 3 minutes off my record!</p><blockquote class=\"twitter-tweet\" data-lang=\"en\"><p lang=\"en\" dir=\"ltr\">Ok, last tweet on the subject, official results are in, 43:11 :-D <a href=\"http://t.co/Q9bULaos6D\">http://t.co/Q9bULaos6D</a> <a href=\"http://t.co/o25JdXd2Yb\">pic.twitter.com/o25JdXd2Yb</a></p>&mdash; John McKerrell (@mcknut) <a href=\"https://twitter.com/mcknut/status/595134106230480896?ref_src=twsrc%5Etfw\">May 4, 2015</a></blockquote><script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script><p>I tried to take up <a href=\"https://twitter.com/mcknut/statuses/576422500130811904\">gardening</a> as a hobby to brighten the place up. I even <a href=\"https://twitter.com/mcknut/statuses/582879965143810048\">planted potatoes</a> so that we’d get greenery <em>and</em> useful, tasty potatoes. Though at times the potatoes seemed like they were trying to take over the DoES Liverpool meeting room we didn’t really have a very prosperous harvest and it felt like the time and effort could be better placed!</p><blockquote class=\"twitter-tweet\" data-lang=\"en\"><p lang=\"en\" dir=\"ltr\">.<a href=\"https://twitter.com/DoESLiverpool?ref_src=twsrc%5Etfw\">@DoESLiverpool</a> potato update: Growing pretty well! Should be harvesting in the next few weeks <a href=\"https://twitter.com/hashtag/weeknotes?src=hash&amp;ref_src=twsrc%5Etfw\">#weeknotes</a> <a href=\"http://t.co/p1A51gXB3e\">pic.twitter.com/p1A51gXB3e</a></p>&mdash; John McKerrell (@mcknut) <a href=\"https://twitter.com/mcknut/status/605402268276559872?ref_src=twsrc%5Etfw\">June 1, 2015</a></blockquote><script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script><p>DoES Liverpool could still benefit from some more plant life but there definitely needs to be a plan for maintenance for this sort of thing! 🌻</p><p>Hm.. anything else happen in 2015? Well we made this little announcement:</p><blockquote class=\"twitter-tweet\" data-lang=\"en\"><p lang=\"en\" dir=\"ltr\">Happy to announce that Evie is looking forward to being a big sister! All going well so far. <a href=\"https://twitter.com/hashtag/duedecember?src=hash&amp;ref_src=twsrc%5Etfw\">#duedecember</a> <a href=\"http://t.co/iImTotOhFr\">pic.twitter.com/iImTotOhFr</a></p>&mdash; John McKerrell (@mcknut) <a href=\"https://twitter.com/mcknut/status/626479268462247937?ref_src=twsrc%5Etfw\">July 29, 2015</a></blockquote><script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script><p>As we settled into our new life with work and nursery and with Evie being such a good sleeper we decided that we might actually like to have another little person around the place. Funnily enough while Evie had actually come 10 days late Ethan actually came along exactly on his due date!</p><blockquote class=\"twitter-tweet\" data-lang=\"en\"><p lang=\"en\" dir=\"ltr\">I won on the premium bonds today but I think yesterday&#39;s prize was better! <a href=\"https://twitter.com/hashtag/itsaboy?src=hash&amp;ref_src=twsrc%5Etfw\">#itsaboy</a> <a href=\"https://t.co/PXOmL0KpsH\">pic.twitter.com/PXOmL0KpsH</a></p>&mdash; John McKerrell (@mcknut) <a href=\"https://twitter.com/mcknut/status/672706695794188288?ref_src=twsrc%5Etfw\">December 4, 2015</a></blockquote><script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script><p>While Ethan seemed originally to be feeding okay we ended up having similar troubles with him losing too much weight and being harassed by mid-wives. After a week of problems we went along to an infant feeding clinic only to be told that Ethan had a tongue tie. A tiny piece of skin was stopping him from being able to move his tongue freely and causing him problems with feeding. Unfortunately our options were limited to waiting 2 months for an appointment in Alder Hey or trying to get it done in Chester Hospital. There was also the option of going private but we really didn’t think we should have to do that and also of the standards of care we’d receive. Being so close to Christmas we were quite concerned about whether we’d managed to get it done before the holidays so we were very happy when we got an appointment for the 23rd December. Poor Ethan ended up picking up a cold meaning the nurse almost couldn’t complete the tongue tie snip, and as it turned out had probably missed some as it really didn’t make much difference to his feeding. It seems ridiculous having to wait three weeks for something that should have been picked up and fixed while he was still in the hospital, and that the much vaunted and well-funded Alder Hey couldn’t do anything about it for months. Obviously we can’t be sure that dealing with it straight away would have reduced the problems, but it would have given Ethan a much better chance and given my poor stressed wife one less thing to worry about!</p><p>I feel I should finish on a lighter note though so let’s back-track to October, we’d been invited to a Halloween party and I couldn’t think of what to go as. My wife spotted a Jack Skellington costume in the shop and came up with the great idea of combining it with one of my old Santa Dash costumes, resulting in this great result:</p><blockquote class=\"twitter-tweet\" data-lang=\"en\"><p lang=\"en\" dir=\"ltr\">Bit of recycling went on for my Halloween costume <a href=\"https://t.co/bPsG6YcrY0\">pic.twitter.com/bPsG6YcrY0</a></p>&mdash; John McKerrell (@mcknut) <a href=\"https://twitter.com/mcknut/status/660565811208261632?ref_src=twsrc%5Etfw\">October 31, 2015</a></blockquote><script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>",
            "url": "https://blog.johnmckerrell.com/2017/11/03/year-notes-2015/",
            
            "external_url": "https://blog.johnmckerrell.com/2017/11/03/year-notes-2015/",
            
            
            
            "date_published": "2017-11-03T19:50:04+00:00",
            "date_modified": "2017-11-03T19:50:04+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2017/10/27/year-notes-2014/",
            "title": "Year Notes: 2014",
            "summary": null,
            "content_text": "So obviously after the events at the tail end of 2013, this year was mostly spent dealing with the fact that we now had a tiny (not so tiny) baby to look after! Work-wise I’d stupidly taken on two new clients just before baby came along so while they were freelance clients who were aware of what was happening, it did mean I had some worries about making sure I could do work for them. In the end one of them tailed away to nothing within a few weeks of the new year and the other was just a week or so’s work that I managed to get in while baby was napping.In retrospect the newborn stage is actually something of a calm before the storm as they do tend to sleep a lot. We had some issues around baby’s feeding and weight gain which the midwives dutifully freaked us out over but after a few months she did start putting on weight better. In fact once we weaned her onto food, which with perhaps rose-tinted hindsight went pretty well, she started putting on plenty of weight.The “week’s work” was quite an interesting iPad app and ultimately developed into a continuous 2 days a week. Without going into too much detail it was tourism based and involved having the app open while you were driving a car. It proved quite tricky to develop and test due in part to literally having to go out and drive in a car to get any useful test data. Also my clients were in London and there was times when they would upgrade the app, drive to central London, try to launch the app and find it insta-crashed. The fix was to delete and reinstall, not so easy for a multiple hundred MB app when you’d already gone to the location. With this and another client I’ll get to shortly I learned a lot about the benefits of automated testing, automated smoke testing and continuous integration. The testing tools at the time were not so good as they are now in Xcode but if I had a good method to simulate a drive, and to do smoke tests every time I committed code I could have avoided many of the problems I encountered.A few months into the year when I was mainly working on some updates to CamViewer and making further small changes to the iPad app I just mentioned I was approached by John Fagan who I used to work with at Multimap. He was wondering if I’d be interested in taking on a full time role at the company that he was working for - Axon Active. I’d not really been interested in full time roles but in fact as this was a foreign company I would be treated more like a contractor, and the money was pretty decent. Ultimately I told John no, only for him to suggest that I might work just a few days a week for them instead. When I mentioned these talks to the people I’d been engaging with on the other app they jumped at the chance to grab my other free days and so I ended up with 5 paid days a week split between Axon Active (3 days) and the other client.Miserable weather, awesome tunes! - Just posted a 12.40 km run - #RunKeeper http://t.co/F0nJvhTmoD&mdash; John McKerrell (@mcknut) February 12, 2014Looking back on my tweets from the year I see multiple mentions of running. I’ve never really mentioned running on this blog which is quite bad because it’s become a regular part of my life. In fact in 2013 I ran my first marathon, a milestone I forgot to mention in the previous blog post! In 2014 I ran the same race again but found it much more tricky to fit in training around childcare, I mostly did best efforts at the training plan I was using but ended up with a decent result. While in 2013 I managed an awesome 1:40:00 for the half, I managed to follow it up in 2014 with a very respectable 1:43:25. In 2013 I ended up having real issues with my IT band, causing me to limp the last few miles. Annoyingly in 2014 I actually felt much better and had no issues such as this, but then faced a headwind for the same last miles! I could quite possibly have improved my PR if it wasn’t for that.With Axon Active I was working on a small project they’d been developing around taking in various items of data that would be made available on an iPhone, uploading them to a server and from there deriving information about patterns in the way you live and your future plans that we might be able to help you with. At the time we pulled in location and calendar events and would do things such as suggesting a place you might go to nearby for a quick lunch or let you know about travel options for your calendar appointments.Axon Active are a Swiss company but most of the people working for them were remote. At the time we had people in France, Edinburgh, London, Brighton, Manchester, even Russia! This allowed me to keep the flexibility of working from DoES Liverpool which was very handy. We would meet every 3 weeks in London for sprint planning and every 3 months for a trip to head office in Switzerland. This worked really well with the new baby, I could choose to work from home or from DoES Liverpool most of the time and the trips to London weren’t too tricky. Having to be away for a week wasn’t so great but it also wasn’t so often. We had plenty of support from my mother in law, Anne, so that made sure I was mostly not leaving my wife home alone with the kid. Also helped that my daughter got really quite good at sleeping from as early as 6 months!Enjoying the view at the Axon barbecue pic.twitter.com/ZgonV9aqKF&mdash; John McKerrell (@mcknut) April 30, 2014The project at Axon Active was initially just a side-project for an 8 person team but as the year progressed the company really saw the potential of what we were doing and it culminated in a new UK based company being formed at the very end of the year… but that’s really a story for 2015.Again looking back at my tweets I see that after some discussions with Patrick Fenner I had him and his wife Jen Fenner, through their company Deferred Procrastination, help me with a new design of the WhereDial. They actually engaged an old friend Sophie Green to prepare some artwork for the device while Patrick and Jen looked at improving the functional design and the production method. They developed a way of using screen printing to allow much faster printing of designs onto the laser cut materials (ultimately screen printing would take seconds where laser engraving could take 15-20 minutes per piece). The resultant WhereDial looked really good and I was quite happy with the results. Unfortunately as I got busier with life and paid work I found I didn’t have the time to progress this so never got as far as selling the new versions. I’ve had them around my house and on my desk over the years and it’s interesting to note that while they do look good, the design is quite busy and the colours quite low contrast so it can be tricky to tell what’s happening from across a room. Something to keep in mind if I ever get around to developing the WhereDial again!What do you think of the new look WhereDial? See it up close and get kits at #MakerFaireUK @DoESLiverpool stand! pic.twitter.com/SMaeAIll22&mdash; WhereDial (@WhereDial) April 26, 2014The iPad app continued on for much of the year, we found it tricky getting the location based stuff working just how we wanted. We were trying to simulate something that a human would do and the clients had a particular level of quality in mind that was hard to replicate. There was also the need for a sat-nav component in the app, we didn’t want to call out to Apple Maps so would have needed to either build a sat nav ourselves or pull in a third party component. In the end this proved particularly difficult to find for iOS leading them to look at Android as an alternative. With my lack of interest in Android and continuing focus on the Axon Active role we ended up parting ways in Autumn. It was a really interesting app to work on but just had some difficulties that would really have required a lot more development resource than me working on my own. I didn’t hear too much from the clients once I handed the code over to their Android developer and I have a feeling that the project stalled around then.That’s probably it for 2014 really, once that app project stopped I found it useful having two days a week to do more work on CamViewer and also found the time to make some changes to the Chess Viewer app that I’d been working on intermittently. As 2014 drew to a close my wife started to think about returning to work and deciding what hours she wanted to do. Axon Active were also looking to setup the UK company and were offering people full time jobs, me included. I really wasn’t sure that I wanted to make that commitment, my stance hadn’t really changed from the beginning of the year, but I wasn’t really looking for any more work and the money was still pretty decent even as an employee so it was a hard decision to make. I didn’t make the decision until the first week of 2015 so I’ll make you wait to hear!(Let’s finish up with a photo of me ready for the 5k Santa Dash)Santa and his slightly concerned reindeer. pic.twitter.com/FanlyQmHSv&mdash; John McKerrell (@mcknut) December 7, 2014",
            "content_html": "<p>So obviously after the events at the tail end of 2013, this year was mostly spent dealing with the fact that we now had a tiny (not so tiny) baby to look after! Work-wise I’d stupidly taken on two new clients just before baby came along so while they were freelance clients who were aware of what was happening, it did mean I had some worries about making sure I could do work for them. In the end one of them tailed away to nothing within a few weeks of the new year and the other was just a week or so’s work that I managed to get in while baby was napping.</p><p>In retrospect the newborn stage is actually something of a calm before the storm as they do tend to sleep a lot. We had some issues around baby’s feeding and weight gain which the midwives dutifully freaked us out over but after a few months she did start putting on weight better. In fact once we weaned her onto food, which with perhaps rose-tinted hindsight went pretty well, she started putting on plenty of weight.</p><p><img src=\"https://pbs.twimg.com/media/Bdsj5G8CYAABRRM.jpg\" alt=\"mugged for milk\" /></p><p>The “week’s work” was quite an interesting iPad app and ultimately developed into a continuous 2 days a week. Without going into too much detail it was tourism based and involved having the app open while you were driving a car. It proved quite tricky to develop and test due in part to literally having to go out and drive in a car to get any useful test data. Also my clients were in London and there was times when they would upgrade the app, drive to central London, try to launch the app and find it insta-crashed. The fix was to delete and reinstall, not so easy for a multiple hundred MB app when you’d already gone to the location. With this and another client I’ll get to shortly I learned a lot about the benefits of automated testing, automated smoke testing and continuous integration. The testing tools at the time were not so good as they are now in Xcode but if I had a good method to simulate a drive, and to do smoke tests every time I committed code I could have avoided many of the problems I encountered.</p><p>A few months into the year when I was mainly working on some updates to CamViewer and making further small changes to the iPad app I just mentioned I was approached by <a href=\"https://twitter.com/johnbfagan\">John Fagan</a> who I used to work with at Multimap. He was wondering if I’d be interested in taking on a full time role at the company that he was working for - Axon Active. I’d not really been interested in full time roles but in fact as this was a foreign company I would be treated more like a contractor, and the money was pretty decent. Ultimately I told John no, only for him to suggest that I might work just a few days a week for them instead. When I mentioned these talks to the people I’d been engaging with on the other app they jumped at the chance to grab my other free days and so I ended up with 5 paid days a week split between Axon Active (3 days) and the other client.</p><blockquote class=\"twitter-tweet\" data-lang=\"en\"><p lang=\"en\" dir=\"ltr\">Miserable weather, awesome tunes! - Just posted a 12.40 km run - <a href=\"https://twitter.com/hashtag/RunKeeper?src=hash&amp;ref_src=twsrc%5Etfw\">#RunKeeper</a> <a href=\"http://t.co/F0nJvhTmoD\">http://t.co/F0nJvhTmoD</a></p>&mdash; John McKerrell (@mcknut) <a href=\"https://twitter.com/mcknut/status/433677157651341313?ref_src=twsrc%5Etfw\">February 12, 2014</a></blockquote><script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script><p>Looking back on my tweets from the year I see multiple mentions of running. I’ve never really mentioned running on this blog which is quite bad because it’s become a regular part of my life. In fact in 2013 I ran my first marathon, a milestone I forgot to mention in the previous blog post! In 2014 I ran the same race again but found it much more tricky to fit in training around childcare, I mostly did best efforts at the training plan I was using but ended up with a decent result. While in 2013 I managed an awesome 1:40:00 for the half, I managed to follow it up in 2014 with a very respectable 1:43:25. In 2013 I ended up having real issues with my IT band, causing me to limp the last few miles. Annoyingly in 2014 I actually felt much better and had no issues such as this, but then faced a headwind for the same last miles! I could quite possibly have improved my PR if it wasn’t for that.</p><p>With Axon Active I was working on a small project they’d been developing around taking in various items of data that would be made available on an iPhone, uploading them to a server and from there deriving information about patterns in the way you live and your future plans that we might be able to help you with. At the time we pulled in location and calendar events and would do things such as suggesting a place you might go to nearby for a quick lunch or let you know about travel options for your calendar appointments.</p><p>Axon Active are a Swiss company but most of the people working for them were remote. At the time we had people in France, Edinburgh, London, Brighton, Manchester, even Russia! This allowed me to keep the flexibility of working from DoES Liverpool which was very handy. We would meet every 3 weeks in London for sprint planning and every 3 months for a trip to head office in Switzerland. This worked really well with the new baby, I could choose to work from home or from DoES Liverpool most of the time and the trips to London weren’t too tricky. Having to be away for a week wasn’t so great but it also wasn’t so often. We had plenty of support from my mother in law, Anne, so that made sure I was mostly not leaving my wife home alone with the kid. Also helped that my daughter got really quite good at sleeping from as early as 6 months!</p><blockquote class=\"twitter-tweet\" data-lang=\"en\"><p lang=\"en\" dir=\"ltr\">Enjoying the view at the Axon barbecue <a href=\"http://t.co/ZgonV9aqKF\">pic.twitter.com/ZgonV9aqKF</a></p>&mdash; John McKerrell (@mcknut) <a href=\"https://twitter.com/mcknut/status/461544777738379264?ref_src=twsrc%5Etfw\">April 30, 2014</a></blockquote><script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script><p>The project at Axon Active was initially just a side-project for an 8 person team but as the year progressed the company really saw the potential of what we were doing and it culminated in a new UK based company being formed at the very end of the year… but that’s really a story for 2015.</p><p>Again looking back at my tweets I see that after some discussions with <a href=\"https://twitter.com/DefProc\">Patrick Fenner</a> I had him and his wife <a href=\"https://twitter.com/RedVioletJen\">Jen Fenner</a>, through their company <a href=\"https://www.deferredprocrastination.co.uk\">Deferred Procrastination</a>, help me with a new design of the WhereDial. They actually engaged an old friend <a href=\"http://www.sophie-green.com\">Sophie Green</a> to prepare some artwork for the device while Patrick and Jen looked at improving the functional design and the production method. They developed a way of using screen printing to allow much faster printing of designs onto the laser cut materials (ultimately screen printing would take seconds where laser engraving could take 15-20 minutes per piece). The resultant WhereDial looked really good and I was quite happy with the results. Unfortunately as I got busier with life and paid work I found I didn’t have the time to progress this so never got as far as selling the new versions. I’ve had them around my house and on my desk over the years and it’s interesting to note that while they do look good, the design is quite busy and the colours quite low contrast so it can be tricky to tell what’s happening from across a room. Something to keep in mind if I ever get around to developing the WhereDial again!</p><blockquote class=\"twitter-tweet\" data-lang=\"en\"><p lang=\"en\" dir=\"ltr\">What do you think of the new look WhereDial? See it up close and get kits at <a href=\"https://twitter.com/hashtag/MakerFaireUK?src=hash&amp;ref_src=twsrc%5Etfw\">#MakerFaireUK</a> <a href=\"https://twitter.com/DoESLiverpool?ref_src=twsrc%5Etfw\">@DoESLiverpool</a> stand! <a href=\"http://t.co/SMaeAIll22\">pic.twitter.com/SMaeAIll22</a></p>&mdash; WhereDial (@WhereDial) <a href=\"https://twitter.com/WhereDial/status/459941720008822784?ref_src=twsrc%5Etfw\">April 26, 2014</a></blockquote><script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script><p>The iPad app continued on for much of the year, we found it tricky getting the location based stuff working just how we wanted. We were trying to simulate something that a human would do and the clients had a particular level of quality in mind that was hard to replicate. There was also the need for a sat-nav component in the app, we didn’t want to call out to Apple Maps so would have needed to either build a sat nav ourselves or pull in a third party component. In the end this proved particularly difficult to find for iOS leading them to look at Android as an alternative. With my lack of interest in Android and continuing focus on the Axon Active role we ended up parting ways in Autumn. It was a really interesting app to work on but just had some difficulties that would really have required a lot more development resource than me working on my own. I didn’t hear too much from the clients once I handed the code over to their Android developer and I have a feeling that the project stalled around then.</p><p>That’s probably it for 2014 really, once that app project stopped I found it useful having two days a week to do more work on CamViewer and also found the time to make some changes to the Chess Viewer app that I’d been working on intermittently. As 2014 drew to a close my wife started to think about returning to work and deciding what hours she wanted to do. Axon Active were also looking to setup the UK company and were offering people full time jobs, me included. I really wasn’t sure that I wanted to make that commitment, my stance hadn’t really changed from the beginning of the year, but I wasn’t really looking for any more work and the money was still pretty decent even as an employee so it was a hard decision to make. I didn’t make the decision until the first week of 2015 so I’ll make you wait to hear!</p><p>(Let’s finish up with a photo of me ready for the 5k Santa Dash)</p><blockquote class=\"twitter-tweet\" data-lang=\"en\"><p lang=\"en\" dir=\"ltr\">Santa and his slightly concerned reindeer. <a href=\"http://t.co/FanlyQmHSv\">pic.twitter.com/FanlyQmHSv</a></p>&mdash; John McKerrell (@mcknut) <a href=\"https://twitter.com/mcknut/status/541519342664687616?ref_src=twsrc%5Etfw\">December 7, 2014</a></blockquote><script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>",
            "url": "https://blog.johnmckerrell.com/2017/10/27/year-notes-2014/",
            
            "external_url": "https://blog.johnmckerrell.com/2017/10/27/year-notes-2014/",
            
            
            
            "date_published": "2017-10-27T09:55:39+01:00",
            "date_modified": "2017-10-27T09:55:39+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2017/10/20/year-notes-2013/",
            "title": "Year Notes: 2013",
            "summary": null,
            "content_text": "I was tempted to skip this year as I had after all written a blog post that year already, but why not go crazy and write a second one, maybe the 2013 review would have been the first post of 2014 anyway?Although I tend to write about geeky work related things on this blog it’s really my personal blog so I should definitely mention that the two major events of 2013 for me were personal rather than work related. We (my wife and I) moved house, and got pregnant! The house move wasn’t particularly planned and just came from noticing a house around the corner from ours that looked interesting, checking it out (awful) but then looking at a few more and deciding that actually we really could manage a nice upgrade, and might need to as we’d be needing more room soon.We were lucky that we could afford a lovely big victorian house, which looks nice and provides lots of room for kids and associated “stuff”, but isn’t the best when it comes to heating and having lots of little jobs that need doing. We actually didn’t move in for 3 months after buying it, but still even now have lots of jobs that need doing and some quite large bits of building work we’d like to do, if we could get around to it (making the cellar a usable space and extending the kitchen). Obviously having lots of jobs to do is standard for owning a house but this place definitely seems to take it to another level!Also back in 2013 I took on a summer student, Elliot. That was a great experience even if I hadn’t necessarily prepared well enough for having him around. I ended up giving him all sorts of different bits of work to do including upgrades to my CamViewer webcam viewing app and upgrades to the WhereDial. He actually did most of the work towards a Wi-Fi enabled webcam that would have used TP-Link mini Wi-Fi routers as much of the brains with a bespoke Arduino compatible circuit board controlling the motor. Unfortunately in the end I didn’t get around to productising that but hopefully he had some fun working on it and got some good experience. After that summer he went back to university to finish his degree then had no problem finding a job. I haven’t caught up with him in a while but I believe he’s still doing well and applying his great versatility to working on a variety of things from back-end server coding to mobile app dev.During the summer of 2013 I, with Adrian McEwen, Hakim Cassimally and Aine McGuire exhibited at Internet World trade show in Earls Court, London. That was quite an interesting experience. We were given a prime spot at the entrance to the show and used it to demonstrate a variety of IoT devices including the WhereDial and Bubblino, Hakim and Adrian also promoted their book Designing the Internet of Things. And because spending a week in London wasn’t enough we then spent the following weekend in Newcastle for Makerfaire!Wow, looking at my notes that was when my relationship with ExamsTutor ended. Unfortunately it didn’t end as well as I’d have liked, they simply decided they did not want to continue the relationship and largely cut off communication. I had owned the IP behind the apps so no further development occurred on those and it looks like they got removed from the app store in Apple’s great cull of 2016 (removing any app that hadn’t been updated in years). A shame to end that way as I’d enjoyed working with them but there wasn’t much I could do once they stopped replying to emails.My relationship with 7digital also ended this year, as I recall they were looking to take development in-house which was fair enough. I don’t think iOS was ever really a huge priority for them as Apple’s app store rules made it difficult for them to make any money from the app. I know they continued using my codebase for a few years after, it’s hard to tell if they still do, the app’s structure hasn’t changed too much but it’s quite likely it’s had some restructuring under the hood.As mentioned I (and Elliot) also continued working on CamViewer through that year. Interestingly looking at the Changelog that year seems to have been the start of me adding more functionality to the app. At the end of the year I added support for “HD” cameras that use RTSP by integrating a paid-for library. That was just in time for me to use cameras such as this as baby monitors, something I and my wife have both found really handy over the years.Pretty much the last thing that happened in this year, Evie was born!So that’s a review of 2013 done, just 3 more years to cover (assuming I get this done quickly, considering I started this blog post in January (2017) that may not be the case!)",
            "content_html": "<p>I was tempted to skip this year as I had after all written a blog post that year already, but why not go crazy and write a second one, maybe the 2013 review would have been the first post of 2014 anyway?</p><p>Although I tend to write about geeky work related things on this blog it’s really my personal blog so I should definitely mention that the two major events of 2013 for me were personal rather than work related. We (my wife and I) moved house, and got pregnant! The house move wasn’t particularly planned and just came from noticing a house around the corner from ours that looked interesting, checking it out (awful) but then looking at a few more and deciding that actually we really could manage a nice upgrade, and might need to as we’d be needing more room soon.</p><p>We were lucky that we could afford a lovely big victorian house, which looks nice and provides lots of room for kids and associated “stuff”, but isn’t the best when it comes to heating and having lots of little jobs that need doing. We actually didn’t move in for 3 months after buying it, but still even now have lots of jobs that need doing and some quite large bits of building work we’d like to do, if we could get around to it (making the cellar a usable space and extending the kitchen). Obviously having lots of jobs to do is standard for owning a house but this place definitely seems to take it to another level!</p><p>Also back in 2013 I took on a summer student, <a href=\"https://twitter.com/ellcom\">Elliot</a>. That was a great experience even if I hadn’t necessarily prepared well enough for having him around. I ended up giving him all sorts of different bits of work to do including upgrades to my CamViewer webcam viewing app and upgrades to the WhereDial. He actually did most of the work towards a Wi-Fi enabled webcam that would have used TP-Link mini Wi-Fi routers as much of the brains with a bespoke Arduino compatible circuit board controlling the motor. Unfortunately in the end I didn’t get around to productising that but hopefully he had some fun working on it and got some good experience. After that summer he went back to university to finish his degree then had no problem finding a job. I haven’t caught up with him in a while but I believe he’s still doing well and applying his great versatility to working on a variety of things from back-end server coding to mobile app dev.</p><p>During the summer of 2013 I, with Adrian McEwen, Hakim Cassimally and Aine McGuire exhibited at Internet World trade show in Earls Court, London. That was quite an interesting experience. We were given a prime spot at the entrance to the show and used it to demonstrate a variety of IoT devices including the WhereDial and Bubblino, Hakim and Adrian also promoted their book <a href=\"https://www.amazon.co.uk/Designing-Internet-Things-Adrian-McEwen/dp/111843062X/\">Designing the Internet of Things</a>. And because spending a week in London wasn’t enough we then spent the following weekend in Newcastle for Makerfaire!</p><p><img src=\"https://dn3pm25xmtlyu.cloudfront.net/photos/large/762975627.jpg?Expires=1509698275&amp;Signature=UoGYIg1MrkxPG05857uuebnqTmObK73QDGZUSiNjkKRWmmzi9uFdFDZgAF3kXb2T2tNHMvpkQgkribWKv~BNgztro9Hq8wviOZ3Hsmz4f9UwUG49CqJGlrEr7AK~5l7DgfO-8qN3O9q0PLgF6l0ES1jYPHyauhh-vXCTJAViWSdMoOav8NmFwfNPtrZBUzulPATVZEWFLcAZhTAw-1bEoykC3QK5r-NAuPGr1kkrKHRNYOzOFdFbatwuNMjkfwufB3hagkN62OyBaDBglJsruaP6MtQLKYKuxp2Z3eCWLkUffLEx0YEh-oIkQrsX1PC~aXyimBgvmYqC3OY~LEmKDg__&amp;Key-Pair-Id=APKAJROXZ7FN26MABHYA\" alt=\"Makerfaire 2013\" /></p><p>Wow, looking at my notes that was when my relationship with ExamsTutor ended. Unfortunately it didn’t end as well as I’d have liked, they simply decided they did not want to continue the relationship and largely cut off communication. I had owned the IP behind the apps so no further development occurred on those and it looks like they got removed from the app store in Apple’s great cull of 2016 (removing any app that hadn’t been updated in years). A shame to end that way as I’d enjoyed working with them but there wasn’t much I could do once they stopped replying to emails.</p><p>My relationship with 7digital also ended this year, as I recall they were looking to take development in-house which was fair enough. I don’t think iOS was ever really a huge priority for them as Apple’s app store rules made it difficult for them to make any money from the app. I know they continued using my codebase for a few years after, it’s hard to tell if they still do, the app’s structure hasn’t changed too much but it’s quite likely it’s had some restructuring under the hood.</p><p>As mentioned I (and Elliot) also continued working on CamViewer through that year. Interestingly looking at the <a href=\"https://camviewerip.com/changelog/\">Changelog</a> that year seems to have been the start of me adding more functionality to the app. At the end of the year I added support for “HD” cameras that use RTSP by integrating a paid-for library. That was just in time for me to use cameras such as this as baby monitors, something I and my wife have both found really handy over the years.</p><p>Pretty much the last thing that happened in this year, Evie was born!</p><p><img src=\"https://farm6.staticflickr.com/5155/14392136644_d56952d6df_k.jpg\" alt=\"Actually 6 months old in this picture\" /></p><p>So that’s a review of 2013 done, just 3 more years to cover (assuming I get this done quickly, considering I started this blog post in January (2017) that may not be the case!)</p>",
            "url": "https://blog.johnmckerrell.com/2017/10/20/year-notes-2013/",
            
            "external_url": "https://blog.johnmckerrell.com/2017/10/20/year-notes-2013/",
            
            
            
            "date_published": "2017-10-20T09:34:39+01:00",
            "date_modified": "2017-10-20T09:34:39+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2017/06/24/new-new-blog-new-old-blog/",
            "title": "New New Blog, New Old Blog",
            "summary": null,
            "content_text": "  So I’ve decided to replace my previous blog with a WordPress blog.That was the first line I put on my WordPress blog, which I’ve now replaced with Jekyll. The first post on that was in October 2006, so nearly 11 years ago!Over the past 11 years I’ve moved away from doing anything PHP, or anything server-side really. I have no particular need of the online editing that you get with WordPress or any of the other features really. I’m also trying to be quite paranoid about what daemons I run on my hosting server. I came across Jekyll (again) as part of a documentation project in my day job and was impressed by how easy it was to use so decided I would start migrating some of my own stuff over.My first migration was actually the website for my CamViewer iOS app which was already based on Gollum the markdown wiki so should have been quite simple to migrate (actually it was still a bit of a faff due to different markdown versions).I hoped migrating Wordpress would also be easy as so many people use both technologies. As it turned out there was still plenty of work involved. I ended up using two migration tools. The main Jekyll importer didn’t seem to do a great job of pulling the HTML in but pulled all the comments across nicely so I ended up using exitwp and writing a yaml copying tool to pull the comments from one to the other.This blog hasn’t actually got any comments functionality at the moment, I figure people can ping me @mcknut on Twitter if they want to make comments but I’ve copied the ones that were on the old site.  My previous blog made use of whizzy fun modern technologies to allow me to host my entire site on Google Base, Google Pages and del.icio.us. Unfortunately, because it was something I had just knocked up there was no comment support, and of course it did require Java and JavaScript to be enabled in the browser.That original blog was quite a weird thing, I tried to make it so that all the content was hosted online. Unfortunately as it was JavaScript based not much has been saved on the Internet Archive. It does seem like all the original posts are now lost but with any luck I’ve got the content… somewhere.",
            "content_html": "<blockquote>  <p>So I’ve decided to replace my previous blog with a WordPress blog.</p></blockquote><p>That was the first line I put on my WordPress blog, which I’ve now replaced with Jekyll. The first post on that was in October 2006, so nearly 11 years ago!</p><p>Over the past 11 years I’ve moved away from doing anything PHP, or anything server-side really. I have no particular need of the online editing that you get with WordPress or any of the other features really. I’m also trying to be quite paranoid about what daemons I run on my hosting server. I came across Jekyll (again) as part of a documentation project in my day job and was impressed by how easy it was to use so decided I would start migrating some of my own stuff over.</p><p>My first migration was actually the website for my <a href=\"https://camviewerip.com/\">CamViewer iOS app</a> which was already based on <a href=\"https://github.com/gollum/gollum\">Gollum</a> the markdown wiki so should have been quite simple to migrate (actually it was still a bit of a faff due to different markdown versions).</p><p>I hoped migrating Wordpress would also be easy as so many people use both technologies. As it turned out there was still plenty of work involved. I ended up using two migration tools. The main Jekyll importer didn’t seem to do a great job of pulling the HTML in but pulled all the comments across nicely so I ended up using <a href=\"https://github.com/thomasf/exitwp\">exitwp</a> and writing a yaml copying tool to pull the comments from one to the other.</p><p>This blog hasn’t actually got any comments functionality at the moment, I figure people can ping me <a href=\"https://twitter.com/mcknut\">@mcknut</a> on Twitter if they want to make comments but I’ve copied the ones that were on the old site.</p><blockquote>  <p>My previous blog made use of whizzy fun modern technologies to allow me to host my entire site on <a href=\"http://base.google.com\">Google Base</a>, <a href=\"http://pages.google.com\">Google Pages</a> and <a href=\"http://del.icio.us\">del.icio.us</a>. Unfortunately, because it was something I had just knocked up there was no comment support, and of course it did require Java and JavaScript to be enabled in the browser.</p></blockquote><p>That original blog was quite a weird thing, I tried to make it so that all the content was hosted online. Unfortunately as it was JavaScript based not much has been saved on the Internet Archive. It does seem like all the original posts are now lost but with any luck I’ve got the content… somewhere.</p>",
            "url": "https://blog.johnmckerrell.com/2017/06/24/new-new-blog-new-old-blog/",
            
            "external_url": "https://blog.johnmckerrell.com/2017/06/24/new-new-blog-new-old-blog/",
            
            
            
            "date_published": "2017-06-24T13:12:58+01:00",
            "date_modified": "2017-06-24T13:12:58+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2017/01/18/long-time-no-see/",
            "title": "Long time no see",
            "summary": null,
            "content_text": "It’s been a very long time since I’ve written anything here. I thought I’d like to write up a small project I did recently, but then there would be a bit of back story, and then a bit more, and oh yes I haven’t blogged in 4 years so I should really do something about that.As such I’m going to try to write some year reviews. Not promising to make them in depth but it’ll give me a chance to look back and see what I’ve actually been doing all these years (actually it’s pretty obvious to me given that the last post was 4 years ago and a major thing happened just after that but here’s goes nothing..!)",
            "content_html": "<p>It’s been a very long time since I’ve written anything here. I thought I’d like to write up a small project I did recently, but then there would be a bit of back story, and then a bit more, and oh yes I haven’t blogged in 4 years so I should really do something about that.</p><p>As such I’m going to try to write some year reviews. Not promising to make them in depth but it’ll give me a chance to look back and see what I’ve actually been doing all these years (actually it’s pretty obvious to me given that the last post was 4 years ago and a major thing happened just after that but here’s goes nothing..!)</p>",
            "url": "https://blog.johnmckerrell.com/2017/01/18/long-time-no-see/",
            
            "external_url": "https://blog.johnmckerrell.com/2017/01/18/long-time-no-see/",
            
            
            
            "date_published": "2017-01-18T11:18:31+00:00",
            "date_modified": "2017-01-18T11:18:31+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2013/01/07/adding-a-wiki-to-mapme-at-using-gollum/",
            "title": "Adding a Wiki to MapMe.At using Gollum",
            "summary": null,
            "content_text": "I recently added a wiki on my MapMe.At site and found it quite tricky to get working and difficult to find just the right information I needed so I thought I’d write it up.MapMe.At is still on Rails 2 which seemed to mean I couldn’t install Gollum as part of the site.I created a separate Rails 3 project that runs alongside MapMe.At and simply hosts Gollum, using instructions from here: http://stackoverflow.com/questions/13053704/how-to-properly-mount-githubs-gollum-wiki-inside-a-rails-appI wanted it to use the user information in MapMe.At’s session hash so switched MapMe.At to use activerecord based sessions and used information on here to make the rails 2 session load in rails 3: http://www.kadrmasconcepts.com/blog/2012/07/19/sharing-rails-sessions-with-php-coldfusion-and-more/I’m not actually using the rails2 session as the main session, I just load the information in. I have the following in config/initializers/session_store.rbmodule ActionController  module Flash    class FlashHash &lt; Hash      def method_missing(m, *a, &amp;b;)      end    end  endendMapmeAtWiki::Application.config.session_store :cookie_store, key: '_mapme_at_wiki_session'Then in routes.rb:class App &lt; Precious::App  before { authenticate }  helpers do    def authenticate      oldsess = ActiveRecord::SessionStore::Session.find_by_session_id(request.cookies[\"_myapp_session\"])      if oldsess and oldsess.data and oldsess.data[:user_id]        u = User.find(oldsess.data[:user_id])        email = \"#{u.username}@gitusers.mckerrell.net\"        session[\"gollum.author\"] = { :name =&gt; u.full_name, :email =&gt; email }      else        response[\"Location\"] = \"http://mapme.at/me/login?postlogin=/wiki/\"        throw(:halt, [302, \"Found\"])      end    end  endendMapmeAtWiki::Application.routes.draw do  # The priority is based upon order of creation:  # first created -&gt; highest priority.  App.set(:gollum_path, Rails.root.join('db/wiki.git').to_s)  App.set(:default_markup, :markdown) # set your favorite markup language  App.set(:wiki_options, {:universal_toc =&gt; false})  mount App, at: 'wiki'endI wanted a wiki on the site to allow my users to help out with documenting the site. Adding their own thoughts and experiences and perhaps fixing typos I might make. I’m not sure that’s really started happening yet but at least I have a nice interface for writing the documentation myself!",
            "content_html": "<p>I recently added a wiki on my MapMe.At site and found it quite tricky to get working and difficult to find just the right information I needed so I thought I’d write it up.</p><p>MapMe.At is still on Rails 2 which seemed to mean I couldn’t install Gollum as part of the site.</p><p>I created a separate Rails 3 project that runs alongside MapMe.At and simply hosts Gollum, using instructions from here: <a href=\"http://stackoverflow.com/questions/13053704/how-to-properly-mount-githubs-gollum-wiki-inside-a-rails-app\">http://stackoverflow.com/questions/13053704/how-to-properly-mount-githubs-gollum-wiki-inside-a-rails-app</a></p><p>I wanted it to use the user information in MapMe.At’s session hash so switched MapMe.At to use activerecord based sessions and used information on here to make the rails 2 session load in rails 3: <a href=\"http://www.kadrmasconcepts.com/blog/2012/07/19/sharing-rails-sessions-with-php-coldfusion-and-more/\">http://www.kadrmasconcepts.com/blog/2012/07/19/sharing-rails-sessions-with-php-coldfusion-and-more/</a></p><p>I’m not actually using the rails2 session as the main session, I just load the information in. I have the following in <code class=\"language-plaintext highlighter-rouge\">config/initializers/session_store.rb</code></p><figure class=\"highlight\"><pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"k\">module</span> <span class=\"nn\">ActionController</span>  <span class=\"k\">module</span> <span class=\"nn\">Flash</span>    <span class=\"k\">class</span> <span class=\"nc\">FlashHash</span> <span class=\"o\">&lt;</span> <span class=\"no\">Hash</span>      <span class=\"k\">def</span> <span class=\"nf\">method_missing</span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"o\">&amp;</span><span class=\"n\">b</span><span class=\"p\">;)</span>      <span class=\"k\">end</span>    <span class=\"k\">end</span>  <span class=\"k\">end</span><span class=\"k\">end</span><span class=\"no\">MapmeAtWiki</span><span class=\"o\">::</span><span class=\"no\">Application</span><span class=\"p\">.</span><span class=\"nf\">config</span><span class=\"p\">.</span><span class=\"nf\">session_store</span> <span class=\"ss\">:cookie_store</span><span class=\"p\">,</span> <span class=\"ss\">key: </span><span class=\"s1\">'_mapme_at_wiki_session'</span></code></pre></figure><p>Then in routes.rb:</p><figure class=\"highlight\"><pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"k\">class</span> <span class=\"nc\">App</span> <span class=\"o\">&lt;</span> <span class=\"no\">Precious</span><span class=\"o\">::</span><span class=\"no\">App</span>  <span class=\"n\">before</span> <span class=\"p\">{</span> <span class=\"n\">authenticate</span> <span class=\"p\">}</span>  <span class=\"n\">helpers</span> <span class=\"k\">do</span>    <span class=\"k\">def</span> <span class=\"nf\">authenticate</span>      <span class=\"n\">oldsess</span> <span class=\"o\">=</span> <span class=\"no\">ActiveRecord</span><span class=\"o\">::</span><span class=\"no\">SessionStore</span><span class=\"o\">::</span><span class=\"no\">Session</span><span class=\"p\">.</span><span class=\"nf\">find_by_session_id</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">.</span><span class=\"nf\">cookies</span><span class=\"p\">[</span><span class=\"s2\">\"_myapp_session\"</span><span class=\"p\">])</span>      <span class=\"k\">if</span> <span class=\"n\">oldsess</span> <span class=\"ow\">and</span> <span class=\"n\">oldsess</span><span class=\"p\">.</span><span class=\"nf\">data</span> <span class=\"ow\">and</span> <span class=\"n\">oldsess</span><span class=\"p\">.</span><span class=\"nf\">data</span><span class=\"p\">[</span><span class=\"ss\">:user_id</span><span class=\"p\">]</span>        <span class=\"n\">u</span> <span class=\"o\">=</span> <span class=\"no\">User</span><span class=\"p\">.</span><span class=\"nf\">find</span><span class=\"p\">(</span><span class=\"n\">oldsess</span><span class=\"p\">.</span><span class=\"nf\">data</span><span class=\"p\">[</span><span class=\"ss\">:user_id</span><span class=\"p\">])</span>        <span class=\"n\">email</span> <span class=\"o\">=</span> <span class=\"s2\">\"</span><span class=\"si\">#{</span><span class=\"n\">u</span><span class=\"p\">.</span><span class=\"nf\">username</span><span class=\"si\">}</span><span class=\"s2\">@gitusers.mckerrell.net\"</span>        <span class=\"n\">session</span><span class=\"p\">[</span><span class=\"s2\">\"gollum.author\"</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">{</span> <span class=\"ss\">:name</span> <span class=\"o\">=&gt;</span> <span class=\"n\">u</span><span class=\"p\">.</span><span class=\"nf\">full_name</span><span class=\"p\">,</span> <span class=\"ss\">:email</span> <span class=\"o\">=&gt;</span> <span class=\"n\">email</span> <span class=\"p\">}</span>      <span class=\"k\">else</span>        <span class=\"n\">response</span><span class=\"p\">[</span><span class=\"s2\">\"Location\"</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s2\">\"http://mapme.at/me/login?postlogin=/wiki/\"</span>        <span class=\"kp\">throw</span><span class=\"p\">(</span><span class=\"ss\">:halt</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"mi\">302</span><span class=\"p\">,</span> <span class=\"s2\">\"Found\"</span><span class=\"p\">])</span>      <span class=\"k\">end</span>    <span class=\"k\">end</span>  <span class=\"k\">end</span><span class=\"k\">end</span><span class=\"no\">MapmeAtWiki</span><span class=\"o\">::</span><span class=\"no\">Application</span><span class=\"p\">.</span><span class=\"nf\">routes</span><span class=\"p\">.</span><span class=\"nf\">draw</span> <span class=\"k\">do</span>  <span class=\"c1\"># The priority is based upon order of creation:</span>  <span class=\"c1\"># first created -&gt; highest priority.</span>  <span class=\"no\">App</span><span class=\"p\">.</span><span class=\"nf\">set</span><span class=\"p\">(</span><span class=\"ss\">:gollum_path</span><span class=\"p\">,</span> <span class=\"no\">Rails</span><span class=\"p\">.</span><span class=\"nf\">root</span><span class=\"p\">.</span><span class=\"nf\">join</span><span class=\"p\">(</span><span class=\"s1\">'db/wiki.git'</span><span class=\"p\">).</span><span class=\"nf\">to_s</span><span class=\"p\">)</span>  <span class=\"no\">App</span><span class=\"p\">.</span><span class=\"nf\">set</span><span class=\"p\">(</span><span class=\"ss\">:default_markup</span><span class=\"p\">,</span> <span class=\"ss\">:markdown</span><span class=\"p\">)</span> <span class=\"c1\"># set your favorite markup language</span>  <span class=\"no\">App</span><span class=\"p\">.</span><span class=\"nf\">set</span><span class=\"p\">(</span><span class=\"ss\">:wiki_options</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"ss\">:universal_toc</span> <span class=\"o\">=&gt;</span> <span class=\"kp\">false</span><span class=\"p\">})</span>  <span class=\"n\">mount</span> <span class=\"no\">App</span><span class=\"p\">,</span> <span class=\"ss\">at: </span><span class=\"s1\">'wiki'</span><span class=\"k\">end</span></code></pre></figure><p>I wanted a wiki on the site to allow my users to help out with documenting the site. Adding their own thoughts and experiences and perhaps fixing typos I might make. I’m not sure that’s really started happening yet but at least I have a nice interface for writing the documentation myself!</p>",
            "url": "https://blog.johnmckerrell.com/2013/01/07/adding-a-wiki-to-mapme-at-using-gollum/",
            
            "external_url": "https://blog.johnmckerrell.com/2013/01/07/adding-a-wiki-to-mapme-at-using-gollum/",
            
            "tags": ["gollum","location","rails","ruby"],
            
            "date_published": "2013-01-07T11:30:36+00:00",
            "date_modified": "2013-01-07T11:30:36+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2012/12/02/wheredial-ready-to-ship/",
            "title": "WhereDial Ready to Ship",
            "summary": null,
            "content_text": "A good few years ago I blogged about making a clock that showed location, similar to the clock that Weasley family had in the Harry Potter books. Well now you can buy one! I’ve spent the last year working on the design and getting the hardware ready. Take a look at the photos below and head over to the website for more information on the WhereDial!                                                                                                                                                ",
            "content_html": "<p>A good few years ago I blogged about making <a href=\"http://blog.johnmckerrell.com/2009/06/01/hacking-location-into-hardware/\">a clock that showed location</a>, similar to the clock that Weasley family had in the Harry Potter books. Well now you can buy one! I’ve spent the last year working on the design and getting the hardware ready. Take a look at the photos below and <a href=\"http://www.wheredial.com/\">head over to the website for more information on the WhereDial!</a></p><div id=\"gallery-1\" class=\"gallery galleryid-11793 gallery-columns-3 gallery-size-thumbnail\"><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8868.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8868-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8871.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8871-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8883.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8883-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><br style=\"clear: both\" /><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8898.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8898-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8900.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8900-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8904.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8904-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><br style=\"clear: both\" /><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8908.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8908-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8911.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8911-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8916.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8916-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><br style=\"clear: both\" /><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8921.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8921-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8922.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8922-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8927.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8927-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><br style=\"clear: both\" /><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8928.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8928-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8931.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8931-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8940.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8940-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><br style=\"clear: both\" /><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8944.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8944-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8978.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/IMG_8978-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><dl class=\"gallery-item\">  <dt class=\"gallery-icon landscape\">    <a href=\"https://blog.johnmckerrell.com/uploads/2012/12/2012-11-26-17.22.10.jpg\"><img width=\"150\" height=\"150\" src=\"https://blog.johnmckerrell.com/uploads/2012/12/2012-11-26-17.22.10-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" /></a>  </dt></dl><br style=\"clear: both\" /></div>",
            "url": "https://blog.johnmckerrell.com/2012/12/02/wheredial-ready-to-ship/",
            
            "external_url": "https://blog.johnmckerrell.com/2012/12/02/wheredial-ready-to-ship/",
            
            "tags": ["location","WhereDial"],
            
            "date_published": "2012-12-02T19:43:27+00:00",
            "date_modified": "2012-12-02T19:43:27+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2012/02/17/openstreetmap-at-social-media-cafe-liverpool/",
            "title": "OpenStreetMap at Social Media Cafe Liverpool",
            "summary": null,
            "content_text": "I gave a talk last night at Social Media Cafe about OpenStreetMap. I actually haven’t been too involved in the OSM community of late so it was nice to get back into it a little bit. It was also good to find that a large portion of the audience was not already aware of OSM so it was nice to introduce it to people.You can find the video of Social Media Cafe on USTREAM. The video will be chopped up soon at which point I’ll link to or embed my own talk here too.I ended up with 63 slides taking up about 100MB so I’m going to try not uploading it to Slideshare this time, instead I’m going to summarise the talk here.Why do we need OpenStreetMap?      Geodata historically isn’t                  Current - things change so often maps quickly become outdated.                    Open - if you know the map is wrong, wouldn’t it be simpler to let you update it yourself?                    Free - You want me to pay how much for Ordnance Survey data?? Especially an issue when you’ve helped build the map.                  Wiki is obvious next step        It’s just fun  We make beautiful maps……which we give awayIt’s not just Liverpool, or even the UK, in the talk I showed maps of the Hague, Washington, DC and Berlin. You can pan and zoom the map linked to above to browse the coverage.Some Quotes  “It’s absolutely possible for a bunch of smart guys with the technology we have today to capture street networks, and potentially the major roads of the UK and minor roads”Ed Parsons, ex-CTO Ordnance Surveycurrently Geospatial Technologist for Google  “If you don’t make [lower-resolution mapping data] publicly available, there will be people with their cars and GPS devices, driving around with their laptops .. They will be cataloguing every lane, and enjoying it, driving 4×4s behind your farm at the dead of night. There will, if necessary, be a grass-roots remapping.”Tim Berners-Lee  “You could have a community capability where you took the GPS data of people driving around and started to see, oh, there’s a new road that we don’t have, a new route .. And so that data eventually should just come from the community with the right software infrastructure.”Bill GatesSome big names in technology who clearly think user-generated mapping data is a good idea.Isn’t Google Free?A lot of people ask the question “Why do we need OpenStreetMap when Google Maps is free?”Current?http://maps.google.co.uk/?ll=53.40407,-2.985835&amp;spn;=0.010937,0.031693&amp;t;=m&amp;z;=16This picture shows a Google Map screenshot that I took on 16th February 2012. In the centre of the map you can see the Moat House Hotel. This was bulldozed in 2005 but still shows up on Google’s map. You’ll also see the Consulate of the United States in Liverpool. This was also closed down some time ago. So you can see that Google Maps isn’t perfectly current (and, for the record, I have now reported these problems to Google).Open?Google have launched their own project to map the planet. Map Maker allows people in many countries to edit the data of the map, adding roads and POIs in a similar way to OSM. Unfortunately Google doesn’t then provide full access to this data back to the people who have made it! Map tiles are generated and shapes of the data entered can be retrieved but the full detail of the data is kept by Google. The license offered by Google also restricts its use to non-commercial usage, stopping people who have put effort into creating the data from being able to derive an income from it.Free?Though Google’s mapping API is free to use initially they have recently introduced usage limits. Though they claim that this will only affect 0.35% of their customers, it has already affected a number of popular websites that simply can’t afford to pay what Google is requesting. Some examples will be given of these later.Google Support OSMIt would be unfair to talk about the bad parts of Google without mentioning the good. Google has regularly supported OSM through donations, sponsorship of mapping parties and support through their “Summer of Code” programme.As do other providersIt also wouldn’t be fair to paint Google as the only supporter, for example:      Mapquest sponsors and supports OSM efforts.        Microsoft Bing Maps sponsors and supports OSM efforts, even allowing their aerial imagery to be traced.  WorkshopsOr, Map as Party (Mapping Parties!)The first mapping party was in the Isle of Wight. At the time the only “free” map data available was an Ordnance Survey map that had gone out of copyright:A group of people went to the island for a weekend and collected GPS traces of all the roads:And from these made a great looking map:We also held a mapping party in Liverpool in November 2007 which allowed us to essentially complete the map of the centre of Liverpool.That video shows the traces of everyone involved with the mapping party as they went around Liverpool and mapped the streets. It was built using the scripts referenced on this wiki pageEditing OSMVisit openstreetmap.org and sign up for an account. If you have GPS traces, upload them, don’t worry if you don’t as you’ll be able to help by editing existing data or tracing over aerial imagery.Data Model      Nodes          Single point on the earth - Latitude and Longitude            Way          Ordered list of nodes which together make up a long line or an enclosed area            Relation          A method of relating multiple ways and nodes together, e.g. “turning from way A to way B using node C is not allowed”            Tags                  Nodes/Ways/Relations can have key=value pairs attached to describe their properties.                    Example node tags:                              amenity=place_of_worship, religion=buddhist                                amenity=post_box                                      Example way tags:                              highway=primary                                oneway=yes                              An online flash editor is available (Potlatch) simply by clicking the “Edit” link when looking at any map on OSM. An offline editing desktop app built in Java is also available, JOSMThere are hundreds of tags that you can use to describe almost any data, use the wiki to find more information especially the Map Features page.LicenseCC-BY-SAThis license lets anyone use the OSM maps for free so long as you mention that the source was OpenStreetMap and you share what you produce under a similar license.Very soon the license will change from CC-BY-SA to Open Database License which offers similar freedoms with more suitable legal terminology. Do read into it if you think it will affect you.OSM in ActionNestoria, a popular property website, has long supported OSM. A few years ago they made use of OSM data by using the maps generated from the Isle of Wight mapping party to replace the non-existent data in Google Maps. More recently they have been affected by Google’s plans to charge for its map data and so they have switched fully to OpenStreetMap data and maps.CycleStreets is a great website for finding cycle routes. They offer a directions engine that gives detailed descriptions of routes, allowing you to pick between Balanced, Fastest and Shortest routes. They also offer lots more information and a database of photos to give more insight into a journey. The routes they recommend are ideal for keeping cyclists off the busy dangerous roads and onto the quieter safer more direct routes.mapme.at is a website that I have built for tracking people’s location. People use it to track places that they visit and journeys that they take. I use it to track everywhere I ever go. Adrian McEwen wrote a script that puts the location of the Mersey Ferries into mapme.at and that’s what you can see in the map above.A few years ago I worked with ITO World to create some animations of my data. They created great animations which you can find on my vimeo account but below is one showing every journey I took in January 2010 with each day being played concurrently.All travels in January 2010 run at once. from John McKerrell on Vimeo.Geocaching is a popular pastime based around GPSes, treasure hunting and maps. Their website used Google Maps and they also had issues when Google started to charge. As a result they have switched to OpenStreetMap too.MobileLots of mobile apps are available to let you use and contribute to OpenStreetMapAndroidNot being a regular user of Android I can’t recommend any apps personally but there is a large list of OSM Android apps on the wiki and I’ve selected the following based on features they claim to offer.gopens and MapDroyd both allow you to browse OpenStreetMap maps on the go and claim to offer offline support, allowing you to view maps even when you’re not connected to the internet.Skobbler Navigation provides a full Tom-Tom style satnav for navigating on the go, all based on OpenStreetMap data.Mapzen POI Collector is a handy way to collect POI data while out and about, or to edit existing data.iPhoneSkobbler Navigation is also available for iPhone, again providing a full Tom-Tom style satnav for navigating on the go, all based on OpenStreetMap data.NavFree is another full satnav app based on OpenStreetMap data.Offmaps is an OSM map viewer that allows you to download large chunks of map tiles in advance so that you have them, for instance, when you go on holiday. I would recommend the original Offmaps over Offmaps2 as I believe the latter restricts the data you can access.Mapzen POI Collector again is available for iPhone and is a handy way to collect POI data while out and about, or to edit existing data.HumanitarianOpenStreetMap has been heavily involved in Humanitarian efforts, these have resulted in the formation of HOT - the Humanitarian OpenStreetMap Team. Projects have included mapping the Gaza Strip and Map Kibera a project to map the Kibera slum in Nairobi, Kenya. These projects have many benefits to the communities involved. Simply having map data helps the visibilities of important landmarks: water stations, Internet cafes, etc. Teaching the locals how to create the maps teaches valuable technical skills. Some people build on the data to provide commercial services to their neighbours, building businesses to support themselves and their families.A hugely influential demonstration of the impact of OpenStreetMap involvement in humanitarian efforts occurred after the massive earthquake that struck Haiti in 2010. Very shortly after the earthquake hit, the OSM community realised that the lack of geodata in what was essentially a third world country, would cause massive problems with aid workers going in to help after the earthquake. The community responded by tracing the aerial imagery that was already available to start to improve the data and later efforts included getting newer imagery, getting Haitian ex-pats to help with naming features and working with the aid agencies to add their data to the map. You can see some of the effects of these efforts from the video below that shows the edits that occurred in Haiti around the time of the earthquake.OpenStreetMap - Project Haiti from ItoWorld on Vimeo.Switch2OSMIf all of this has piqued your interest then visit openstreetmap.org to take a look at the map, sign up and get involved in editing. Find more information on the wiki at wiki.openstreetmap.org or find out how you can switch your website to OpenStreetMap at Switch2OSM.org",
            "content_html": "<p>I gave a talk last night at Social Media Cafe about OpenStreetMap. I actually haven’t been too involved in the OSM community of late so it was nice to get back into it a little bit. It was also good to find that a large portion of the audience was not already aware of OSM so it was nice to introduce it to people.</p><p><a href=\"http://www.ustream.tv/recorded/20487500\">You can find the video of Social Media Cafe on USTREAM.</a> The video will be chopped up soon at which point I’ll link to or embed my own talk here too.</p><p>I ended up with 63 slides taking up about 100MB so I’m going to try not uploading it to Slideshare this time, instead I’m going to summarise the talk here.</p><p><a href=\"/uploads/2012/02/s1.a.jpeg\"><img src=\"/uploads/2012/02/s1.a-300x225.jpg\" alt=\"OpenStreetMap - John McKerrell @mcknut - Freelance Software Developer\" /></a></p><h3 id=\"why-do-we-need-openstreetmap\">Why do we need OpenStreetMap?</h3><ul>  <li>    <p>Geodata historically isn’t</p>    <ul>      <li>        <p>Current - things change so often maps quickly become outdated.</p>      </li>      <li>        <p>Open - if you know the map is wrong, wouldn’t it be simpler to let you update it yourself?</p>      </li>      <li>        <p>Free - You want me to pay how much for Ordnance Survey data?? Especially an issue when you’ve helped build the map.</p>      </li>    </ul>  </li>  <li>    <p>Wiki is obvious next step</p>  </li>  <li>    <p>It’s just <em>fun</em></p>  </li></ul><h3 id=\"we-make-beautiful-maps\">We make beautiful maps…</h3><h3 id=\"which-we-give-away\">…which we give away</h3><p><a href=\"https://www.openstreetmap.org/#map=14/53.4053/-3.0089\"><img src=\"/assets/osm-map-liverpool.png\" alt=\"Beautiful OpenStreetMap map\" /></a></p><p>It’s not just Liverpool, or even the UK, in the talk I showed maps of the Hague, Washington, DC and Berlin. You can pan and zoom the map linked to above to browse the coverage.</p><h3 id=\"some-quotes\">Some Quotes</h3><blockquote>  <p>“It’s absolutely possible for a bunch of smart guys with the technology we have today to capture street networks, and potentially the major roads of the UK and minor roads”</p></blockquote><p>Ed Parsons, ex-CTO Ordnance Surveycurrently Geospatial Technologist for Google</p><blockquote>  <p>“If you don’t make [lower-resolution mapping data] publicly available, there will be people with their cars and GPS devices, driving around with their laptops .. They will be cataloguing every lane, and enjoying it, driving 4×4s behind your farm at the dead of night. There will, if necessary, be a grass-roots remapping.”</p></blockquote><p>Tim Berners-Lee</p><blockquote>  <p>“You could have a community capability where you took the GPS data of people driving around and started to see, oh, there’s a new road that we don’t have, a new route .. And so that data eventually should just come from the community with the right software infrastructure.”</p></blockquote><p>Bill Gates</p><p>Some big names in technology who clearly think user-generated mapping data is a good idea.</p><h3 id=\"isnt-google-free\">Isn’t Google Free?</h3><p>A lot of people ask the question “Why do we need OpenStreetMap when Google Maps is free?”</p><h4 id=\"current\">Current?</h4><p><a href=\"/uploads/2012/02/s15.b.jpeg\"><img src=\"/uploads/2012/02/s15.b-300x225.jpg\" alt=\"Google Map of Liverpool showing places that are no longer pertinent\" /></a></p><p><a href=\"http://maps.google.co.uk/?ll=53.40407,-2.985835&amp;spn=0.010937,0.031693&amp;t=m&amp;z=16\">http://maps.google.co.uk/?ll=53.40407,-2.985835&amp;spn;=0.010937,0.031693&amp;t;=m&amp;z;=16</a></p><p>This picture shows a Google Map screenshot that I took on 16th February 2012. In the centre of the map you can see the Moat House Hotel. This was bulldozed in 2005 but still shows up on Google’s map. You’ll also see the <a href=\"http://en.wikipedia.org/wiki/Consulate_of_the_United_States,_Liverpool\">Consulate of the United States in Liverpool</a>. This was also closed down some time ago. So you can see that Google Maps isn’t perfectly current (and, for the record, I have now reported these problems to Google).</p><h4 id=\"open\">Open?</h4><p>Google have launched their own project to map the planet. <a href=\"http://www.google.com/mapmaker\">Map Maker</a> allows people in many countries to edit the data of the map, adding roads and POIs in a similar way to OSM. Unfortunately Google doesn’t then provide full access to this data back to the people who have made it! Map tiles are generated and shapes of the data entered can be retrieved but the full detail of the data is kept by Google. The license offered by Google also restricts its use to non-commercial usage, stopping people who have put effort into creating the data from being able to derive an income from it.</p><h4 id=\"free\">Free?</h4><p>Though Google’s mapping API is free to use initially they have recently introduced usage limits. Though they claim that this will only affect 0.35% of their customers, it has already affected a number of popular websites that simply can’t afford to pay what Google is requesting. Some examples will be given of these later.</p><h4 id=\"google-support-osm\">Google Support OSM</h4><p>It would be unfair to talk about the bad parts of Google without mentioning the good. Google has regularly supported OSM through donations, sponsorship of mapping parties and support through their “Summer of Code” programme.</p><h4 id=\"as-do-other-providers\">As do other providers</h4><p>It also wouldn’t be fair to paint Google as the only supporter, for example:</p><ul>  <li>    <p><a href=\"http://www.mapquest.com/\">Mapquest</a> sponsors and supports OSM efforts.</p>  </li>  <li>    <p><a href=\"http://www.bing.com/maps/\">Microsoft Bing Maps</a> sponsors and supports OSM efforts, even allowing their aerial imagery to be traced.</p>  </li></ul><h3 id=\"workshops\">Workshops</h3><h4 id=\"or-map-as-party-mapping-parties\">Or, Map as Party (Mapping Parties!)</h4><p>The first mapping party was in the Isle of Wight. At the time the only “free” map data available was an Ordnance Survey map that had gone out of copyright:</p><p><a href=\"/uploads/2012/02/s22.b.jpeg\"><img src=\"/uploads/2012/02/s22.b-300x225.jpg\" alt=\"Isle of Wight OS Map\" /></a></p><p>A group of people went to the island for a weekend and collected GPS traces of all the roads:</p><p><a href=\"/uploads/2012/02/s23.b.jpeg\"><img src=\"/uploads/2012/02/s23.b-300x225.jpg\" alt=\"\" /></a></p><p>And from these made a great looking map:</p><p><a href=\"/uploads/2012/02/s24.b.jpeg\"><img src=\"/uploads/2012/02/s24.b-300x225.jpg\" alt=\"\" /></a></p><p>We also held a mapping party in Liverpool in November 2007 which allowed us to essentially complete the map of the centre of Liverpool.</p><p>That video shows the traces of everyone involved with the mapping party as they went around Liverpool and mapped the streets. It was built using <a href=\"http://wiki.openstreetmap.org/wiki/Party_render\">the scripts referenced on this wiki page</a></p><h3 id=\"editing-osm\">Editing OSM</h3><p>Visit <a href=\"http://www.openstreetmap.org/\">openstreetmap.org</a> and sign up for an account. If you have GPS traces, upload them, don’t worry if you don’t as you’ll be able to help by editing existing data or tracing over aerial imagery.</p><h4 id=\"data-model\">Data Model</h4><ul>  <li>    <p>Nodes</p>    <ul>      <li>Single point on the earth - Latitude and Longitude</li>    </ul>  </li>  <li>    <p>Way</p>    <ul>      <li>Ordered list of nodes which together make up a long line or an enclosed area</li>    </ul>  </li>  <li>    <p>Relation</p>    <ul>      <li>A method of relating multiple ways and nodes together, e.g. “turning from way A to way B using node C is not allowed”</li>    </ul>  </li>  <li>    <p>Tags</p>    <ul>      <li>        <p>Nodes/Ways/Relations can have key=value pairs attached to describe their properties.</p>      </li>      <li>        <p>Example node tags:</p>        <ul>          <li>            <p>amenity=place_of_worship, religion=buddhist</p>          </li>          <li>            <p>amenity=post_box</p>          </li>        </ul>      </li>      <li>        <p>Example way tags:</p>        <ul>          <li>            <p>highway=primary</p>          </li>          <li>            <p>oneway=yes</p>          </li>        </ul>      </li>    </ul>  </li></ul><p>An online flash editor is available (Potlatch) simply by clicking the “Edit” link when looking at any map on OSM. An offline editing desktop app built in Java is also available, <a href=\"http://wiki.openstreetmap.org/wiki/JOSM\">JOSM</a></p><p>There are hundreds of tags that you can use to describe almost any data, <a href=\"http://wiki.openstreetmap.org/\">use the wiki</a> to find more information especially the <a href=\"http://wiki.openstreetmap.org/wiki/Map_Features\">Map Features</a> page.</p><h3 id=\"license\">License</h3><h4 id=\"cc-by-sa\"><a href=\"http://creativecommons.org/licenses/by-sa/3.0/\">CC-BY-SA</a></h4><p>This license lets anyone use the OSM maps for free so long as you mention that the source was OpenStreetMap and you share what you produce under a similar license.</p><p>Very soon the license will change from CC-BY-SA to <a href=\"http://wiki.openstreetmap.org/wiki/Open_Database_License\">Open Database License</a> which offers similar freedoms with more suitable legal terminology. Do read into it if you think it will affect you.</p><h3 id=\"osm-in-action\">OSM in Action</h3><p><a href=\"http://www.nestoria.co.uk/\">Nestoria</a>, a popular property website, has long supported OSM. A few years ago they made use of OSM data by using the maps generated from the Isle of Wight mapping party to replace the non-existent data in Google Maps. More recently they have been affected by Google’s plans to charge for its map data and so they have switched fully to OpenStreetMap data and maps.</p><p><a href=\"http://www.cyclestreets.net/\">CycleStreets</a> is a great website for finding cycle routes. They offer a directions engine that gives detailed descriptions of routes, allowing you to pick between Balanced, Fastest and Shortest routes. They also offer lots more information and a database of photos to give more insight into a journey. The routes they recommend are ideal for keeping cyclists off the busy dangerous roads and onto the quieter safer more direct routes.</p><p><a href=\"http://mapme.at/\">mapme.at</a> is a website that I have built for tracking people’s location. People use it to track places that they visit and journeys that they take. I use it to track everywhere I ever go. <a href=\"http://twitter.com/amcewen\">Adrian McEwen</a> wrote a script that puts the location of the Mersey Ferries into mapme.at and that’s what you can see in the map above.</p><p>A few years ago I worked with <a href=\"http://itoworld.com\">ITO World</a> to create some animations of my data. They created great animations which you can find <a href=\"http://vimeo.com/user1530776\">on my vimeo account</a> but below is one showing every journey I took in January 2010 with each day being played concurrently.</p><p><a href=\"http://vimeo.com/10636004\">All travels in January 2010 run at once.</a> from <a href=\"http://vimeo.com/user1530776\">John McKerrell</a> on <a href=\"http://vimeo.com\">Vimeo</a>.</p><p><a href=\"http://geocaching.com\">Geocaching</a> is a popular pastime based around GPSes, treasure hunting and maps. Their website used Google Maps and they also had issues when Google started to charge. As a result they have switched to OpenStreetMap too.</p><h3 id=\"mobile\">Mobile</h3><p>Lots of mobile apps are available to let you use and contribute to OpenStreetMap</p><h4 id=\"android\">Android</h4><p>Not being a regular user of Android I can’t recommend any apps personally but there is <a href=\"http://wiki.openstreetmap.org/wiki/Android\">a large list of OSM Android apps on the wiki</a> and I’ve selected the following based on features they claim to offer.</p><p><a href=\"http://wiki.openstreetmap.org/wiki/GoPenS\">gopens</a> and <a href=\"http://wiki.openstreetmap.org/wiki/MapDroyd\">MapDroyd</a> both allow you to browse OpenStreetMap maps on the go and claim to offer offline support, allowing you to view maps even when you’re not connected to the internet.</p><p><a href=\"http://wiki.openstreetmap.org/wiki/Skobbler_Navigation\">Skobbler Navigation</a> provides a full Tom-Tom style satnav for navigating on the go, all based on OpenStreetMap data.</p><p><a href=\"http://wiki.openstreetmap.org/wiki/Mapzen_POI_Collector\">Mapzen POI Collector</a> is a handy way to collect POI data while out and about, or to edit existing data.</p><h4 id=\"iphone\">iPhone</h4><p><a href=\"http://wiki.openstreetmap.org/wiki/Skobbler_Navigation\">Skobbler Navigation</a> is also available for iPhone, again providing a full Tom-Tom style satnav for navigating on the go, all based on OpenStreetMap data.</p><p><a href=\"http://wiki.openstreetmap.org/wiki/Navmii\">NavFree</a> is another full satnav app based on OpenStreetMap data.</p><p><a href=\"http://wiki.openstreetmap.org/wiki/Offmaps\">Offmaps</a> is an OSM map viewer that allows you to download large chunks of map tiles in advance so that you have them, for instance, when you go on holiday. I would recommend the original Offmaps over Offmaps2 as I believe the latter restricts the data you can access.</p><p><a href=\"http://wiki.openstreetmap.org/wiki/Mapzen_POI_Collector\">Mapzen POI Collector</a> again is available for iPhone and is a handy way to collect POI data while out and about, or to edit existing data.</p><h3 id=\"humanitarian\">Humanitarian</h3><p>OpenStreetMap has been heavily involved in Humanitarian efforts, these have resulted in the formation of <a href=\"http://hotosm.org/\">HOT - the Humanitarian OpenStreetMap Team</a>. Projects have included <a href=\"http://wiki.openstreetmap.org/wiki/WikiProject_Gaza\">mapping the Gaza Strip</a> and <a href=\"http://mapkibera.org\">Map Kibera</a> a project to map the Kibera slum in Nairobi, Kenya. These projects have many benefits to the communities involved. Simply having map data helps the visibilities of important landmarks: water stations, Internet cafes, etc. Teaching the locals how to create the maps teaches valuable technical skills. Some people build on the data to provide commercial services to their neighbours, building businesses to support themselves and their families.</p><p>A hugely influential demonstration of the impact of OpenStreetMap involvement in humanitarian efforts occurred after the massive earthquake that struck Haiti in 2010. Very shortly after the earthquake hit, the OSM community realised that the lack of geodata in what was essentially a third world country, would cause massive problems with aid workers going in to help after the earthquake. The community responded by tracing the aerial imagery that was already available to start to improve the data and later efforts included getting newer imagery, getting Haitian ex-pats to help with naming features and working with the aid agencies to add their data to the map. You can see some of the effects of these efforts from the video below that shows the edits that occurred in Haiti around the time of the earthquake.</p><p><a href=\"http://vimeo.com/9182869\">OpenStreetMap - Project Haiti</a> from <a href=\"http://vimeo.com/itoworld\">ItoWorld</a> on <a href=\"http://vimeo.com\">Vimeo</a>.</p><h3 id=\"switch2osm\">Switch2OSM</h3><p>If all of this has piqued your interest then visit <a href=\"http://openstreetmap.org/\">openstreetmap.org</a> to take a look at the map, sign up and get involved in editing. Find more information on the wiki at <a href=\"http://wiki.openstreetmap.org\">wiki.openstreetmap.org</a> or <a href=\"http://switch2osm.org\">find out how you can switch your website to OpenStreetMap at Switch2OSM.org</a></p>",
            "url": "https://blog.johnmckerrell.com/2012/02/17/openstreetmap-at-social-media-cafe-liverpool/",
            
            "external_url": "https://blog.johnmckerrell.com/2012/02/17/openstreetmap-at-social-media-cafe-liverpool/",
            
            "tags": ["openstreetmap","osm","smcliv"],
            
            "date_published": "2012-02-17T16:49:56+00:00",
            "date_modified": "2012-02-17T16:49:56+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/10/23/yahms-revisited-upgrading-to-xbee-with-wire-antenna/",
            "title": "YAHMS: Revisited, Upgrading to XBee with Wire Antenna",
            "summary": null,
            "content_text": "A good few months ago I blogged about my YAHMS project and my YAHMS Base Station. It was a funny time to get the project complete, just in time for the summer, but it has ended up being useful. Being able to turn the hall light on when we come home in the dark is really useful and, with the summer we’ve had, the heating has gone on from time to time too.It hasn’t been without its problems, though fortunately they have been relatively few. Power ended up being an issue for the temperature probes, using four AA batteries would keep the probes running for about a week. This isn’t bad but would mean replacing them regularly, also when the voltage went low, the voltage detector didn’t seem to work and I would see rising temperatures. In the end I decided to use some wall wart power supplies, unfortunately that means the probes are less portable and also means that half of the circuit was unnecessary, as the wall warts never provide a low voltage.I’ve also had problems with the Base Station falling off the network after around 5-7 days of use. There was originally a problem with the DHCP lease expiring so I made some changes to make it re-request the lease when it was near to expiring. This didn’t entirely fix the problem so to be sure I switched to a fixed IP. This led to the 5-7 day uptime, I’m not really sure what is happening here, I’m guessing some memory usage problem whereby there are not enough resources left to create a new Client object but I haven’t been able to track it down. When the problem occurs the system still manages to turn the heating on and off at the right times so it isn’t entirely useless, but it does become unresponsive to new settings and won’t send back data either.Final problem, and the one I’m going to fix today, is that the XBee modules sometimes have issues transmitting data to the base station. I originally wanted to have one upstairs but couldn’t get that to work at all. I ended up putting that one in the conservatory to get “outside” temperatures but it still has issues quite often and has to be positioned right by the door to even sometimes work.A few months ago I was approached by someone from Farnell who wanted to know if I would like to receive hardware to review on my blog. The arrangement is that they will send me hardware in exchange for a review on my blog and a link to the product on their website. So, here goes…XBee Wire Antenna Module (Series 1)Previously I’ve used the chip antenna versions of the XBee series one modules. These were great and really simple to work with but when I tried to use them   in a network around my house I had real issues trying to get the signal to pass through walls and ceilings/floors. The best solution would likely be to replace all of the XBee modules with alternatives with better antennas or with more powerful radios. To replace all of the modules would be quite expensive so I’ve decided to go with replacing just the module on the base station and hope that it does a better job of receiving the signals sent out by the other modules. This may be foolish but I’ll give it a go and see what happens.To replace the module should be a pretty simple job, it’s the same format as the chip antenna module so physically I just have to switch it out for the new one. Before I can do that though requires that I send some settings to the XBee to configure its ID and PAN ID as mentioned in my post about the temperature probes. To communicate with the Xbee I’m just going to use an Arduino Uno and wire the Din/Dout pins on the XBee to the RX/TX pins on the Arduino. I then load a blank sketch onto the Arduino and use the Serial Monitor to communicate with the XBee. What I’ll be sending to it is:ATMY=0,ID=1234Which broken down means:      AT _ - Attention!_        MY=0, _ - the ID of this unit_        ID=1234, _ - the PAN ID for the network of XBees_  To send those settings open your Arduino software, choose the right serial port in Tools -&gt; Serial Port then open the serial monitor with Tools -&gt; Serial Monitor. Choose to send no line endings from the drop down at the bottom and send +++ then as quick as you can manage change to Carriage Return in the drop down first and send the above AT command. After the +++ you should see OK and after the AT command you should see OKOK.You must also send an ATWR command too to write these settings to the flash memory.Once I did that I started seeing random bits of binary data appearing in the Serial Monitor. Fortunately this was a good thing, it was the temperature data from my probes starting to show up!I popped the newly configured module into my YAHMs hardware and waited to see if it worked…As mentioned it was already receiving data so I started to see temperatures show up straight away. The conservatory probe was working straight away which seemed positive as it had issues before. When I took it upstairs it didn’t seem to work at first so I tried angling the box so that the chip antenna would be “pointing” at the base station. This seemed to do the trick and I started collecting temperature readings. Unfortunately as time has gone by I’ve found that it works less and less. I’ve now moved it closer to the base station which got me a few more readings but again it has stopped working. It looks like I’m gonna need a bigger boat aerial!Hopefully I’m going to be able to try out an XBee with an external aerial which should work well on the base station, by this point I’ll have a few spare XBees, including one with a wire aerial so I should be able to get a much bigger range of readings.",
            "content_html": "<p>A good few months ago I blogged about my <a href=\"http://blog.johnmckerrell.com/category/arduino-2/\">YAHMS project</a> and my <a href=\"http://blog.johnmckerrell.com/2011/05/09/yahms-base-station/\">YAHMS Base Station</a>. It was a funny time to get the project complete, just in time for the summer, but it has ended up being useful. Being able to turn the hall light on when we come home in the dark is really useful and, with the summer we’ve had, the heating has gone on from time to time too.</p><p>It hasn’t been without its problems, though fortunately they have been relatively few. Power ended up being an issue for the temperature probes, using four AA batteries would keep the probes running for about a week. This isn’t bad but would mean replacing them regularly, also when the voltage went low, the voltage detector didn’t seem to work and I would see rising temperatures. In the end I decided to use some wall wart power supplies, unfortunately that means the probes are less portable and also means that half of the circuit was unnecessary, as the wall warts never provide a low voltage.</p><p>I’ve also had problems with the Base Station falling off the network after around 5-7 days of use. There was originally a problem with the DHCP lease expiring so I made some changes to make it re-request the lease when it was near to expiring. This didn’t entirely fix the problem so to be sure I switched to a fixed IP. This led to the 5-7 day uptime, I’m not really sure what is happening here, I’m guessing some memory usage problem whereby there are not enough resources left to create a new Client object but I haven’t been able to track it down. When the problem occurs the system still manages to turn the heating on and off at the right times so it isn’t entirely useless, but it does become unresponsive to new settings and won’t send back data either.</p><p>Final problem, and the one I’m going to fix today, is that the XBee modules sometimes have issues transmitting data to the base station. I originally wanted to have one upstairs but couldn’t get that to work at all. I ended up putting that one in the conservatory to get “outside” temperatures but it still has issues quite often and has to be positioned right by the door to even sometimes work.</p><p>A few months ago I was approached by someone from <a href=\"http://www.farnell.com/\">Farnell</a> who wanted to know if I would like to receive hardware to review on my blog. The arrangement is that they will send me hardware in exchange for a review on my blog and <a href=\"http://uk.farnell.com/digi-international/xb24-awi-001/wire-antenna-module-xbee-1mw/dp/1337912\">a link to the product on their website.</a> So, here goes…</p><p><a href=\"/uploads/2011/10/Photo-01-10-2011-20-46-50.jpg\"><img src=\"/uploads/2011/10/Photo-01-10-2011-20-46-50-300x185.jpg\" alt=\"\" /></a></p><h3 id=\"xbee-wire-antenna-module-series-1\"><a href=\"http://uk.farnell.com/digi-international/xb24-awi-001/wire-antenna-module-xbee-1mw/dp/1337912\">XBee Wire Antenna Module (Series 1)</a></h3><p>Previously I’ve used the chip antenna versions of the XBee series one modules. These were great and really simple to work with but when I tried to use them   in a network around my house I had real issues trying to get the signal to pass through walls and ceilings/floors. The best solution would likely be to replace all of the XBee modules with alternatives with better antennas or with more powerful radios. To replace all of the modules would be quite expensive so I’ve decided to go with replacing just the module on the base station and hope that it does a better job of receiving the signals sent out by the other modules. This may be foolish but I’ll give it a go and see what happens.</p><p>To replace the module should be a pretty simple job, it’s the same format as the chip antenna module so physically I just have to switch it out for the new one. Before I can do that though requires that I send some settings to the XBee to configure its ID and PAN ID as mentioned in my post about the temperature probes. To communicate with the Xbee I’m just going to use an Arduino Uno and wire the Din/Dout pins on the XBee to the RX/TX pins on the Arduino. I then load a blank sketch onto the Arduino and use the Serial Monitor to communicate with the XBee. What I’ll be sending to it is:</p><figure class=\"highlight\"><pre><code class=\"language-text\" data-lang=\"text\">ATMY=0,ID=1234</code></pre></figure><p>Which broken down means:</p><ul>  <li>    <p>AT _ - Attention!_</p>  </li>  <li>    <p>MY=0, _ - the ID of this unit_</p>  </li>  <li>    <p>ID=1234, _ - the PAN ID for the network of XBees_</p>  </li></ul><p>To send those settings open your Arduino software, choose the right serial port in Tools -&gt; Serial Port then open the serial monitor with Tools -&gt; Serial Monitor. Choose to send no line endings from the drop down at the bottom and send <code class=\"language-plaintext highlighter-rouge\">+++</code> then as quick as you can manage change to Carriage Return in the drop down first and send the above AT command. After the <code class=\"language-plaintext highlighter-rouge\">+++</code> you should see <code class=\"language-plaintext highlighter-rouge\">OK</code> and after the AT command you should see <code class=\"language-plaintext highlighter-rouge\">OKOK</code>.</p><p>You must also send an <code class=\"language-plaintext highlighter-rouge\">ATWR</code> command too to write these settings to the flash memory.</p><p>Once I did that I started seeing random bits of binary data appearing in the Serial Monitor. Fortunately this was a good thing, it was the temperature data from my probes starting to show up!</p><p>I popped the newly configured module into my YAHMs hardware and waited to see if it worked…</p><p>As mentioned it was already receiving data so I started to see temperatures show up straight away. The conservatory probe was working straight away which seemed positive as it had issues before. When I took it upstairs it didn’t seem to work at first so I tried angling the box so that the chip antenna would be “pointing” at the base station. This seemed to do the trick and I started collecting temperature readings. Unfortunately as time has gone by I’ve found that it works less and less. I’ve now moved it closer to the base station which got me a few more readings but again it has stopped working. It looks like I’m gonna need a bigger <del>boat</del> aerial!</p><p>Hopefully I’m going to be able to try out an XBee with an external aerial which should work well on the base station, by this point I’ll have a few spare XBees, including one with a wire aerial so I should be able to get a much bigger range of readings.</p><p><a href=\"/uploads/2011/10/yahms-delayed.png\"><img src=\"/uploads/2011/10/yahms-delayed.png\" alt=\"\" /></a></p>",
            "url": "https://blog.johnmckerrell.com/2011/10/23/yahms-revisited-upgrading-to-xbee-with-wire-antenna/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/10/23/yahms-revisited-upgrading-to-xbee-with-wire-antenna/",
            
            
            
            "date_published": "2011-10-23T20:15:17+01:00",
            "date_modified": "2011-10-23T20:15:17+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/09/27/reversing-the-brain-drain/",
            "title": "Reversing the Brain Drain",
            "summary": null,
            "content_text": "An unfortunate tweet from a friend yesterday suggesting that he might have to leave Liverpool to get a job, led to a little exchange:That got me to a realisation:Now that comment is certainly meant to be taken as tongue in cheek, but there’s some very real truth in it.  To start with the more tenuous examples. Paul Freeman (@OddEssay) contracts for a company in Eccles, near Manchester. Since setting up DoES Liverpool Paul has been able to spend more time in Liverpool. Yes he’s still working for a company in Eccles but he’s now buying lunch from Liverpool companies and engaging with the Liverpool tech community more regularly.Let’s move onto Paul Kinlan (@Paul_Kinlan). Paul is a Developer Advocate with Google. He’s based in their London office but also spends a lot of his time travelling around Europe and the world promoting Google Chrome and HTML5. His main reason for being here is to work with developers who are using Google products in the north of England, but by supporting DoES Liverpool and taking a desk with us Paul is now able to spend more time in Liverpool meaning he gets to spend more time with his family who are still based up here.Finally we have Andy Hughes (@andyhughes86) and Andy Powell (@p0welly). They work for a company in Manchester who had offices in Stockport. Andy and Andy are both developers who worked in an office full of sales people. These were people who spent most of their time on the phone trying to make sales. Not the best environment for a pair of developers who need to get their head down and concentrate. Their company was moving into an office in Central Manchester, a smaller office in a trendier area which was going to mean Andy and Andy would either be in closer quarters with their noisier colleagues, or have to find somewhere else to work. Fortunately they came across DoES Liverpool and came in for their free hot desk day (bringing donuts!) They liked what they saw and took two permanent desks with us. Andy H lives in Runcorn, Andy P lives in New Brighton. Andy H unfortunately still has a long bus ride (but we’ll come back to that) while Andy P now has a 20 minute commute! As it turns out, Andy H is now moving to Liverpool. I had a chat with him recently and asked if he was planning to move to Liverpool before they joined us at DoES Liverpool. He told me that while he really wanted to move here he had resigned himself to living in Manchester. So not only do we have two people who are regularly coming to Liverpool and supporting businesses in the city centre, we’ve also got someone who would have had to live elsewhere being able to live in Liverpool as he’d hoped, paying taxes and again supporting local businesses.So this blog post certainly isn’t meant to suggest that other places are bad. Generally at the moment though if you want to work for a digital company in Liverpool your choices are to join a digital agency or go it alone. If you don’t want to do this you’ll probably need to work elsewhere. I also recognise that in all of the examples given the person is still working for a company based outside Liverpool. It’s nice though to recognise that even at this early stage DoES is supporting local people and even changing their lives for the better. Hopefully in the future as people start building new businesses based out of DoES those businesses will expand and will start recruiting more and more people from the city who will no longer have to leave just to find a good job.We also got some more news coverage recently, on Friday getting in the Daily Post for hosting the OpenLabs Developer Breakfast events, and an article 2 weeks ago that we only heard about because someone came into DoES for a look around, as a result of seeing it in the Metro. As it turns out that one was syndicated so we were mentioned all over the place!",
            "content_html": "<p>An unfortunate tweet from a friend yesterday suggesting that he might have to leave Liverpool to get a job, led to a little exchange:</p><p><a href=\"https://twitter.com/mcknut/status/116983278065553408\"><img src=\"/uploads/2011/09/does-trying.png\" alt=\"\" /></a></p><p>That got me to a realisation:</p><p><a href=\"https://twitter.com/mcknut/status/116986285842903040\"><img src=\"/uploads/2011/09/does-rescue.png\" alt=\"Tweet text: &quot;Recent tweet just made me realise that at @DoESLiverpool we've already recovered/rescued 4 people from working outside of Liverpool&quot;\" /></a></p><p>Now that comment is certainly meant to be taken as tongue in cheek, but there’s some very real truth in it.  To start with the more tenuous examples. Paul Freeman (<a href=\"http://twitter.com/OddEssay\">@OddEssay</a>) contracts for a company in Eccles, near Manchester. Since setting up DoES Liverpool Paul has been able to spend more time in Liverpool. Yes he’s still working for a company in Eccles but he’s now buying lunch from Liverpool companies and engaging with the Liverpool tech community more regularly.</p><p>Let’s move onto Paul Kinlan (<a href=\"http://twitter.com/Paul_Kinlan\">@Paul_Kinlan</a>). Paul is a Developer Advocate with Google. He’s based in their London office but also spends a lot of his time travelling around Europe and the world promoting Google Chrome and HTML5. His main reason for being here is to work with developers who are using Google products in the north of England, but by supporting DoES Liverpool and taking a desk with us Paul is now able to spend more time in Liverpool meaning he gets to spend more time with his family who are still based up here.</p><p>Finally we have Andy Hughes (<a href=\"http://twitter.com/andyhughes86\">@andyhughes86</a>) and Andy Powell (<a href=\"http://twitter.com/p0welly\">@p0welly</a>). They work for a company in Manchester who had offices in Stockport. Andy and Andy are both developers who worked in an office full of sales people. These were people who spent most of their time on the phone trying to make sales. Not the best environment for a pair of developers who need to get their head down and concentrate. Their company was moving into an office in Central Manchester, a smaller office in a trendier area which was going to mean Andy and Andy would either be in closer quarters with their noisier colleagues, or have to find somewhere else to work. Fortunately they came across DoES Liverpool and came in for their free hot desk day (bringing donuts!) They liked what they saw and took two permanent desks with us. Andy H lives in Runcorn, Andy P lives in New Brighton. Andy H unfortunately still has a long bus ride (but we’ll come back to that) while Andy P now has a 20 minute commute! As it turns out, Andy H is now moving to Liverpool. I had a chat with him recently and asked if he was planning to move to Liverpool before they joined us at DoES Liverpool. He told me that while he really wanted to move here he had resigned himself to living in Manchester. So not only do we have two people who are regularly coming to Liverpool and supporting businesses in the city centre, we’ve also got someone who would have had to live elsewhere being able to live in Liverpool as he’d hoped, paying taxes and again supporting local businesses.</p><p>So this blog post certainly isn’t meant to suggest that other places are bad. Generally at the moment though if you want to work for a digital company in Liverpool your choices are to join a digital agency or go it alone. If you don’t want to do this you’ll probably need to work elsewhere. I also recognise that in all of the examples given the person is still working for a company based outside Liverpool. It’s nice though to recognise that even at this early stage DoES is supporting local people and even changing their lives for the better. Hopefully in the future as people start building new businesses based out of DoES those businesses will expand and will start recruiting more and more people from the city who will no longer have to leave just to find a good job.</p><hr /><p>We also got some more news coverage recently, on Friday <a href=\"http://www.liverpooldailypost.co.uk/ldpbusiness/business-local/2011/09/23/google-s-breakfast-session-in-liverpool-92534-29471167/\">getting in the Daily Post for hosting the OpenLabs Developer Breakfast events</a>, and an article 2 weeks ago that we only heard about because someone came into DoES for a look around, as a result of seeing it in the <a href=\"http://www.metro.co.uk/news/875522-google-builds-web-support-for-1-500-firms-in-liverpool\">Metro</a>. As it turns out that one was syndicated so we were mentioned <a href=\"http://www.google.co.uk/search?client=safari&amp;rls=en&amp;q=%22Google+staff+will+support+a+new+technology+hub%22&amp;ie=UTF-8&amp;oe=UTF-8&amp;redir_esc=&amp;ei=ifl8TtTeO4ep8QOehfCyAQ\">all over the place</a>!</p>",
            "url": "https://blog.johnmckerrell.com/2011/09/27/reversing-the-brain-drain/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/09/27/reversing-the-brain-drain/",
            
            "tags": ["doesliverpool","liverpool"],
            
            "date_published": "2011-09-27T11:57:01+01:00",
            "date_modified": "2011-09-27T11:57:01+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/07/30/another-catch-up-week-157/",
            "title": "Another Catch Up, Week 157",
            "summary": null,
            "content_text": "A month since my last update, I felt I had to post an update today though as it is in fact the third anniversary of the formation of my company, MKE Computing Ltd!I’m intending to post a bit of a retrospective sometime over the weekend but thought I’d better update on the general stuff first.Oh, one other housekeeping note, it seems that for the last few months of updates I’ve managed to mess up the week notes numbers, I first randomly added 3 weeks and then accidentally added 10! This week’s update number was actually lower than the previous one a month ago. I’ve gone through the past updates and updated them to make sure they’re right.The biggest thing I’ve been “working on” recently is DoES Liverpool. In my last blog post I mentioned that we’d been finalising details of the bank account and the venue. We moved into our space shortly after, spent an intensive week decorating, cleaning up and laying out the space and opened to the public on the 18th July! We’re really happy with how the space has turned out, we’ve got a lovely big open workshop space, a cosy little office space for more intensive working and concentration and then a bright meeting room for when people need a private area or are holding small events. Everyone that has visited so far has been really impressed with our set-up and it’s regularly been compared to a Manhattan loft, we do have a great view onto the gorgeous 1880s built Stanley Building.Since opening we’ve had various people coming through the doors, we had an open day on Friday 22nd which saw us get two write-ups in the Daily Post and this week we welcomed in another “permanent” desk user (as opposed to the various hot-deskers). Take a look at the website for more information about co-working, hot-desking and workshop space at DoES Liverpool though there’s a few more posts up on the website for the Maker Night regular making events in Liverpool. (The DoES website is actually brand new so you may not see it yet while the DNS propagates but it’ll be there soon)Besides DoES I’ve actually been relatively quiet for client work. This has been useful for getting things done on DoES but I definitely need to start getting my hands dirty with code again. I’ve started looking at making some upgrades to my CamViewer iOS app and there’s a few more client apps that should be kicking off soon.I’ll leave it there for the update but hopefully I’ll get my “year notes” up soon to give a retrospective of what I’ve done in the first 3 years of MKE Computing Ltd.",
            "content_html": "<p>A month since my last update, I felt I had to post an update today though as it is in fact the third anniversary of the formation of my company, MKE Computing Ltd!</p><p>I’m intending to post a bit of a retrospective sometime over the weekend but thought I’d better update on the general stuff first.</p><p>Oh, one other housekeeping note, it seems that for the last few months of updates I’ve managed to mess up the week notes numbers, I first randomly added 3 weeks and then accidentally added 10! This week’s update number was actually lower than the previous one a month ago. I’ve gone through the past updates and updated them to make sure they’re right.</p><p>The biggest thing I’ve been “working on” recently is DoES Liverpool. In my last blog post I mentioned that we’d been finalising details of the bank account and the venue. We moved into our space shortly after, spent an intensive week decorating, cleaning up and laying out the space and opened to the public on the 18th July! We’re really happy with how the space has turned out, we’ve got a lovely big open workshop space, a cosy little office space for more intensive working and concentration and then a bright meeting room for when people need a private area or are holding small events. Everyone that has visited so far has been really impressed with our set-up and it’s regularly been compared to a Manhattan loft, we do have a great view onto the gorgeous 1880s built Stanley Building.</p><p><a href=\"/uploads/2011/07/IMG_6620.jpg\"><img src=\"/uploads/2011/07/IMG_6620-1024x682.jpg\" alt=\"\" /></a></p><p>Since opening we’ve had various people coming through the doors, we had an open day on Friday 22nd which saw us get <a href=\"http://www.liverpooldailypost.co.uk/ldpbusiness/business-local/2011/07/21/hi-tech-workspace-does-liverpool-open-for-business-92534-29091816/\">two</a> <a href=\"http://www.ldpcreative.co.uk/2011/07/creative-melting-pot-does-live.html\">write-ups</a> in the Daily Post and this week we welcomed in another “permanent” desk user (as opposed to the various hot-deskers). Take a look at the website for more information about <a href=\"http://doesliverpool.com/\">co-working, hot-desking and workshop space at DoES Liverpool</a> though there’s a few more posts up on the website for the <a href=\"http://makernight.co.uk\">Maker Night regular making events in Liverpool</a>. (The DoES website is actually brand new so you may not see it yet while the DNS propagates but it’ll be there soon)</p><p>Besides DoES I’ve actually been relatively quiet for client work. This has been useful for getting things done on DoES but I definitely need to start getting my hands dirty with code again. I’ve started looking at making some upgrades to my CamViewer iOS app and there’s a few more client apps that should be kicking off soon.</p><p>I’ll leave it there for the update but hopefully I’ll get my “year notes” up soon to give a retrospective of what I’ve done in the first 3 years of MKE Computing Ltd.</p>",
            "url": "https://blog.johnmckerrell.com/2011/07/30/another-catch-up-week-157/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/07/30/another-catch-up-week-157/",
            
            "tags": ["co-working","doesliverpool","hot desking","weeknotes"],
            
            "date_published": "2011-07-30T14:11:07+01:00",
            "date_modified": "2011-07-30T14:11:07+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/06/25/catching-up-week-165/",
            "title": "Catching Up, Week 152 (was 165)",
            "summary": null,
            "content_text": "Long time since an update but there’s some important things going on so I wanted to get up to date.In the weeks after my last update I continued to work on the Colour Match app for Crown. I’ve added various features to try to help users find the right colour better including adding in a new set of colours that need to be mixed on-demand, and then a set of colour palettes to let you browse the colours similar to the one the app has selected for you. I submitted that app last Thursday and Apple approved it around Tuesday of this week so that’s now available from the app store.I then went on holiday for two weeks! Apart from a really crap start to the holiday courtesy of US airways and a cancelled flight meaning we were 24 hours late into our destination we actually had a really good time. We started our holiday in San Francisco, eventually having 2 full days there. This was actually my fourth trip to San Francisco but my wife’s first so it was nice to be able to take her around and show her some of the sights I’ve previously enjoyed. The first day was spent within SF doing a bit of shopping, visiting Chinatown and then over to Fisherman’s Wharf to do a boat cruise under the Golden Gate bridge (a first for me actually). On the second day I hired a car (an hour spent in a queue, thanks National!) and we explored a wider area. We drove into the Presidio and I took a photo of my wife with the Yoda fountain at the Lucasfilms HQ. We then continued on to the Golden Gate bridge, we drove over and parked at the viewing spot on the other side to take a photo, we then drove back over and to Baker Beach for a few more photos. The weather wasn’t really beach weather, more gray and cool, but it was still nice to see and take a few photos.After this we went onto the Golden Gate park. I was originally looking for the Japanese Tea Garden but we ended up getting lost and ending up at the rose garden. This was nice enough to walk around so we had a look and I took some photos. From here we headed south, I was aiming to take the coast road but unfortunately I relied on the GPS too much and it took us mostly on a boring highway to our next destination - Half Moon Bay. The weather still wasn’t really playing ball so we didn’t spend too much time here but drove a short distance north to visit Barbara’s Fish Trap. This is a great little fish restaurant that I found last year (with a WhereCamp friend John Barratt). We both had a mixed seafood selection consisting of a big selection of breaded seafood delights. In the evening we headed back into town to join the WWDC2011 European developer gathering. Unfortunately I hadn’t managed to get a ticket for WWDC (but can you imagine how annoyed I would have been missing the first day due to cancelled flights?!) so it was good to be at least a little involved. I enjoyed a nice micro-brew beer and a good chat with Dave Verwer of Shiny Development and the European Apple developer liaison David Currall.After San Francisco we flew to Detroit to see friends. This was a great relaxed time, it was good to catch up with friends and meet their new 9 month old twins! We didn’t get up to much while we were there but we did go on a quick trip into Detroit to see Michigan Central Station and even drove over to pay a quick visit to Canada on the other side of the Detroit river. On our last day we made the two hour trip up to see our friend’s grandparents who live on the shore of Lake Superior. They were actually on the shore of Saginaw Bay, so not the main part of the lake, but it was still huge and an impressive sight.After Detroit we carried on to New York City. We stayed near Times Square and did all the tourist things including visiting Liberty and taking in the view from the top of the Empire State Building. There’s been a few links dotted through this post but if you want to see all my photos take a look at my set of America photos over on flickr.So, finally, week 165. Just before I went away we signed the paperwork to register a new Community Interest Company - DoES Liverpool. The idea behind DoES Liverpool is to create a space in which people can come together, can use a workshop to design and build products, can co-work on desks and ultimately can build businesses. Much of this week has been taken up with organising paperwork for the company and the bank account and finalising details of the venue. If you’re interested in hearing more about DoES Liverpool then be at GeekUp on Tuesday in Leaf on Bold Street from 6:30pm to hear all the details.",
            "content_html": "<p>Long time since an update but there’s some important things going on so I wanted to get up to date.</p><p>In the weeks after my last update I continued to work on the Colour Match app for Crown. I’ve added various features to try to help users find the right colour better including adding in a new set of colours that need to be mixed on-demand, and then a set of colour palettes to let you browse the colours similar to the one the app has selected for you. I submitted that app last Thursday and Apple approved it around Tuesday of this week so that’s <a href=\"http://itunes.apple.com/gb/app/crown-colour-match/id409793197?mt=8\">now available from the app store</a>.</p><p><a href=\"http://www.flickr.com/photos/mcknut/5870516256/\"><img src=\"https://farm4.static.flickr.com/3014/5870516256_d11da17808.jpg\" alt=\"Seagull\" /></a></p><p>I then went on holiday for two weeks! Apart from a really crap start to the holiday courtesy of US airways and a cancelled flight meaning we were 24 hours late into our destination we actually had a really good time. We started our holiday in San Francisco, eventually having 2 full days there. This was actually my fourth trip to San Francisco but my wife’s first so it was nice to be able to take her around and show her some of the sights I’ve previously enjoyed. The first day was spent within SF doing a bit of shopping, visiting Chinatown and then over to Fisherman’s Wharf to do a boat cruise under the Golden Gate bridge (a first for me actually). On the second day I hired a car (an hour spent in a queue, thanks National!) and we explored a wider area. We drove into the Presidio and I took a photo of my wife with the Yoda fountain at the Lucasfilms HQ. We then continued on to the Golden Gate bridge, we drove over and parked at the viewing spot on the other side to take a photo, we then drove back over and to Baker Beach for a few more photos. The weather wasn’t really beach weather, more gray and cool, but it was still nice to see and take a few photos.</p><p>After this we went onto the Golden Gate park. I was originally looking for the Japanese Tea Garden but we ended up getting lost and ending up at the rose garden. This was nice enough to walk around so we had a look and I took some photos. From here we headed south, I was aiming to take the coast road but unfortunately I relied on the GPS too much and it took us mostly on a boring highway to our next destination - Half Moon Bay. The weather still wasn’t really playing ball so we didn’t spend too much time here but drove a short distance north to visit Barbara’s Fish Trap. This is a great little fish restaurant that I found last year (with a WhereCamp friend John Barratt). We both had a mixed seafood selection consisting of a big selection of breaded seafood delights. In the evening we headed back into town to join the WWDC2011 European developer gathering. Unfortunately I hadn’t managed to get a ticket for WWDC (but can you imagine how annoyed I would have been missing the first day due to cancelled flights?!) so it was good to be at least a little involved. I enjoyed a nice micro-brew beer and a good chat with Dave Verwer of <a href=\"http://www.shinydevelopment.com\">Shiny Development</a> and the European Apple developer liaison David Currall.</p><p>After San Francisco we flew to Detroit to see friends. This was a great relaxed time, it was good to catch up with friends and meet their new 9 month old twins! We didn’t get up to much while we were there but we did go on a quick trip into Detroit to see <a href=\"http://www.flickr.com/photos/mcknut/5870520272/in/set-72157626921099137\">Michigan Central Station</a> and even drove over to pay a quick visit to Canada on the other side of the Detroit river. On our last day we made the two hour trip up to see our friend’s grandparents who live on the shore of Lake Superior. They were actually on the shore of Saginaw Bay, so not the main part of the lake, but it was still huge and an impressive sight.</p><p>After Detroit we carried on to New York City. We stayed near Times Square and did all the tourist things including visiting <a href=\"http://www.flickr.com/photos/mcknut/5870535616/in/set-72157626921099137\">Liberty</a> and taking in the <a href=\"http://www.flickr.com/photos/mcknut/5870552530/in/set-72157626921099137\">view from the top of the Empire State Building</a>. There’s been a few links dotted through this post but if you want to see all my photos take a look at <a href=\"http://www.flickr.com/photos/mcknut/sets/72157626921099137/\">my set of America photos over on flickr</a>.</p><p><a href=\"http://www.flickr.com/photos/mcknut/5870543112/\"><img src=\"https://farm6.static.flickr.com/5184/5870543112_b91380bab8.jpg\" alt=\"Grand Central Terminal Main Concourse\" /></a></p><p>So, finally, week 165. Just before I went away we signed the paperwork to register a new Community Interest Company - <a href=\"http://www.doesliverpool.com/\">DoES Liverpool</a>. The idea behind DoES Liverpool is to create a space in which people can come together, can use a workshop to design and build products, can co-work on desks and ultimately can build businesses. Much of this week has been taken up with organising paperwork for the company and the bank account and finalising details of the venue. If you’re interested in hearing more about DoES Liverpool then be at GeekUp on Tuesday in Leaf on Bold Street from 6:30pm to hear all the details.</p><p><a href=\"http://www.doesliverpool.com/\"><img src=\"/uploads/2011/06/DoESLiverpool.square.png\" alt=\"\" /></a></p>",
            "url": "https://blog.johnmckerrell.com/2011/06/25/catching-up-week-165/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/06/25/catching-up-week-165/",
            
            "tags": ["doesliverpool","hackerspace","hackspace","nyc","weeknotes"],
            
            "date_published": "2011-06-25T23:34:41+01:00",
            "date_modified": "2011-06-25T23:34:41+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/05/14/launching-bubblino-and-client-apps-week-159/",
            "title": "Launching Bubblino and Client Apps, Week 146 (was 159)",
            "summary": null,
            "content_text": "I spent most of this week updating the Crown “Colour Match” iPhone app that I’ve previously made a few small changes to (I had nothing to do with the original codebase on this app). There was a few false starts while I waited for the graphics for the app, there was a few issues getting them through in just the right formats for the low and high res iPhone screens, but once I’d got them I did manage to make some headway.The other thing I did was to launch the new version of Bubblino &amp; Friends. This new version offers some great new graphics, new animations and audio that has been created just for the app. I’m really happy with the app and have enjoyed using it to follow some hashtag searches myself but I have to say that sales have actually been quite low since it launched, lower than I’d like anyway. I think that it’s not clear to people why they need an iPhone app to help them use twitter’s search features. As I say I’ve enjoyed using it but, as ever, people are just never sure about putting down that 59p/99c for something they don’t know they need. Hashtags are in use so much though, from the Eurovision Song Contest Final today (#eurovision) to episodes of The Apprentice (#apprentice OR #theapprentice) people are hashtagging tweets all the time and I do hope this app will become a great way to consume these. I can think of a few things that could improve the experience including finding a way to see more of the tweet text (without, of course, hiding Bubblino away!) with one obvious thing being an iPad version. I’ll be listening carefully to any feedback I get and pushing updates out as soon as I can.Finally, this week we held two of our Maker Night hacking evenings in the Art and Design Academy of Liverpool John Moores. With a 7-9pm session on Wednesday and a 6-10pm session on Friday we all made lots of progress on the various projects we’ve been working on. On Wednesday I got more involved in the Cupcake 3D printer we’ve been building so that I could spend Friday looking after it (as Ross Jones who has led the build so far couldn’t make it). Friday night’s event was actually part of a wider event going on in Liverpool called Light Night with events occurring all over the city. This was great as it meant we had lots of visitors coming down and finding out about what we were doing and looking at our mini-exhibition of hardware hacks (we had my location clock versions 1 &amp; 2, Mycroft’s Radio, Bubblino and an Internet connected temperature guage). While it was great to tell the visitors about what we were up to it did delay my work on the 3D printer! We eventually got the final few bits done and everything wired up and managed to test the plastic extruder and the platform stepper motors that move everything around. While it was great to have some success I’m afraid the most we managed to “print” was things like this. Next month’s Maker Night should be great as finally the first real objects should be printed, just a shame I won’t be there to see them! If you’re interested in going, head over to the Maker Night website.",
            "content_html": "<p>I spent most of this week updating the <a href=\"http://itunes.apple.com/gb/app/crown-colour-match/id409793197?mt=8\">Crown “Colour Match” iPhone app</a> that I’ve previously made a few small changes to (I had nothing to do with the original codebase on this app). There was a few false starts while I waited for the graphics for the app, there was a few issues getting them through in just the right formats for the low and high res iPhone screens, but once I’d got them I did manage to make some headway.</p><p>The other thing I did was to launch the new version of <a href=\"http://gogeo.at/bubblino\">Bubblino &amp; Friends</a>. This new version offers some great new graphics, new animations and audio that has been created just for the app. I’m really happy with the app and have enjoyed using it to follow some hashtag searches myself but I have to say that sales have actually been quite low since it launched, lower than I’d like anyway. I think that it’s not clear to people why they need an iPhone app to help them use twitter’s search features. As I say I’ve enjoyed using it but, as ever, people are just never sure about putting down that 59p/99c for something they don’t know they need. Hashtags are in use so much though, from the Eurovision Song Contest Final today (#eurovision) to episodes of The Apprentice (#apprentice OR #theapprentice) people are hashtagging tweets all the time and I do hope this app will become a great way to consume these. I can think of a few things that could improve the experience including finding a way to see more of the tweet text (without, of course, hiding Bubblino away!) with one obvious thing being an iPad version. I’ll be listening carefully to any feedback I get and pushing updates out as soon as I can.</p><p><a href=\"http://gogeo.at/bubblino\"><img src=\"/uploads/2011/05/bubblino-eurovision.png\" alt=\"\" /></a></p><p>Finally, this week we held two of our Maker Night hacking evenings in the Art and Design Academy of Liverpool John Moores. With a 7-9pm session on Wednesday and a 6-10pm session on Friday we all made lots of progress on the various projects we’ve been working on. On Wednesday I got more involved in the <a href=\"http://www.makerbot.com/\">Cupcake 3D printer</a> we’ve been building so that I could spend Friday looking after it (as Ross Jones who has led the build so far couldn’t make it). Friday night’s event was actually part of a wider event going on in Liverpool called <a href=\"http://www.lightnightliverpool.co.uk/\">Light Night</a> with events occurring all over the city. This was great as it meant we had lots of visitors coming down and finding out about what we were doing and looking at our mini-exhibition of hardware hacks (we had my location clock versions 1 &amp; 2, <a href=\"http://mycroftmilverton.me.uk/memoirs/?p=1364\">Mycroft’s Radio</a>, <a href=\"http://www.bubblino.com/\">Bubblino</a> and an Internet connected temperature guage). While it was great to tell the visitors about what we were up to it did delay my work on the 3D printer! We eventually got the final few bits done and everything wired up and managed to test the plastic extruder and the platform stepper motors that move everything around. While it was great to have some success I’m afraid the most we managed to “print” was <a href=\"http://yfrog.com/h2lokjzj\">things like this</a>. Next month’s Maker Night should be great as finally the first real objects should be printed, just a shame I won’t be there to see them! If you’re interested in going, <a href=\"http://www.makernight.com\">head over to the Maker Night website.</a></p>",
            "url": "https://blog.johnmckerrell.com/2011/05/14/launching-bubblino-and-client-apps-week-159/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/05/14/launching-bubblino-and-client-apps-week-159/",
            
            "tags": ["bubblino","iPhone","twitter","weeknotes"],
            
            "date_published": "2011-05-14T17:24:03+01:00",
            "date_modified": "2011-05-14T17:24:03+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/05/09/yahms-base-station/",
            "title": "YAHMS: Base Station",
            "summary": null,
            "content_text": "Bit of a delay as I’ve been busy with other things but in this post I’ll be completing the set of YAHMS hardware by discussing the base station hardware and software. The base station has a few jobs to do in my YAHMS setup:      Physically connect to the relays via digital output pins.        Download the config for digital output pins and then control them.        Receive the XBee signals from the temperature probes.        Take samples from an on-board temperature sensor.        Submit samples received locally and via XBee to the server.  The circuit for this is fairly simple though, just connecting up some inputs and outputs. I mentioned connecting an XBee to an Arduino in the temperature probes post, we simply need to connect the DIN and DOUT pins up to the Arduino so that it can receive the information (and of course the power and ground wires). Because I like to use the main serial interface on the Arduino for outputting debug information back to the computer I’ve gone with connecting to pins 2 &amp; 3 and using the NewSoftSerial which essentially means the serial interface will be provided by software. This isn’t ideal as in theory it means you’re more likely to miss data as it comes in, but the latest software serial drivers largely get around that issue by being interrupt driven. So I end up with the XBee power and ground going directly to one of the grounds on the Arduino board and the regulated 3.3V output, and then pin 2 (DOUT) on the Xbee is plugged into pin 2 on the Arduino and pin 3 (DIN) goes to pin 3 on the Arduino.I have two NPN transistors turning on the relays (using transistors so that the magnet in a coil relay won’t cause a burst of current draw to the Arduino digital pin) which are plugged into two 3.5mm audio jacks. I have 5VDC power going onto the tip of the headphone jack, the sleeve connection of the jack then goes to the collector on the transistor and the emitter of the transistor completes the circuit by connecting to ground. The base of the two transistors go to pins 4 and 5 respectively on the Arduino.I also decided to add a temperature sensor onto the board just because I had lots handy and to make sure that I had something to sample locally. The TMP36 is wired to the 5V power supply and then the VOUT goes to A5 on the Arduino to sample the temperature. See my temperature probe post for more details on TMP36s.Here’s a picture of my original circuit diagram:And here’s a fritzing version of that diagram:And here’s a photo of the finished product: The board I’ve used here is a prototyping shield that I got from @oomlout at MakerFaire. Being a shield it’s really handy and has two sets of connected track on the ends allowing power distribution. I couldn’t find a part for it in Fritzing so I’ve just used the breadboard piece and tried to arrange the parts in the diagram in a similar way to how they ended up, but with more useful spacing.I had a few small physical problems with the board when it was completed. The pins on the headers on the prototyping shield are note long enough for it to properly stand above the RJ45 jack on an ethernet shield. You can kind-of push it down so that all the contacts are made but it’s not quite ideal. This also means that the RJ45 shielding will short circuit any connections it’s butting against on the prototyping board. That caused a bit of a debugging nightmare for me at first until I realised and applied some insulation tape! Things fit well if you put the ethernet shield on top of the prototyping shield but unfortunately the ethernet shield then didn’t work, I assume because it needs the ICSP connection.The hardware here is pretty simple but I’ll do a parts list as usual for completeness. Thought I’d also include this cheatsheet which I drew on the second whiteboard in our office:            Part      Quantity                         Arduino Uno      1                     Ethernet Shield      1                     XBee (series 1) with Chip Antenna      1      Data-sheet              XBee breakout board      1                     2mm 10 way headers      2                     TMP36 (temperature sensor)      1      Data sheet              3.5mm Jack (PCB mounted)      2                     P2N2222AG - NPN Transistor      2      Data Sheet      It’s worth noting that as YAHMS is completely configurable you can actually have whatever circuit you want using any of the digital output pins or Analog input pins, and choosing whether to use the XBee or not, my circuit is only really shown as a guide. In the future I intend to add support for digital inputs too.Once that was all done it was time to write some software. As I mentioned in the first post I’ve actually open sourced the software for this so you can grab the source code for YAHMS from github and extend and fork it as much as you want. Unfortunately at the moment it has a few non-standard dependencies. The main thing is the new version of the Ethernet libraries that Adrian McEwen (@amcewen) has been working on. These will be part of an Arduino build in the near future but for now you can try getting them from his github fork of the Arduino environment. They’re really useful though as they provide DHCP and DNS support meaning no more fixed IP addresses! I’m also using a HttpClient library that Adrian has also written. This isn’t actually available properly from anywhere yet (but keep an eye on his github repositories!) so I’ve linked to a zip file of the version I’ve used below, that also contains a few other libraries that it uses. The final custom library is a version of this XBee Arduino library that I’ve hacked to support NewSoftSerial instead of just the standard Serial interface, see the links below for that too. You’ll also need NewSoftSerial of course and the Flash library which I’ve used to decrease memory usage. Follow the instructions in patching_print.txt to patch the system Print library to support the Flash objects.If you manage to get through the rather complicated compilation process for YAHMS you’ll find that you just need to edit the MAC address in YAHMS_Local.h and you’re ready to go. In theory you should not have to configure anything else locally once I have yahms.net working fully. Once running on an Arduino that sketch will retrieve an IP address via DHCP, synchronise the time using NTP and will then attempt to retrieve the latest config for the MAC address from  yahms.net yahms.johnmckerrell.com (yahms.net does work but seems I’ve forgotten to update the source code). Currently there’s no way for you to put your config into yahms.net but hopefully I’ll get that up soon enough. Until that point you can edit YAHMS_SERVER in YAHMS_defines.h and use something on your own system.Config is requested by a HTTP GET request to a URL like the following:http://yahms.net/api/c/a1b2c3d4e5f6/1/00000000Which breaks down as follows:      /api/c/a1b2c3d4e5f6/1/00000000          MAC address of your ethernet shield, as registered with yahms.net    Protocol version, currently ignored    Time last update was retrieved, idea being that the server will return nothing if the config has not updated, also ignored and incorrectly sent as zeroes by the YAHMS code right now  And should return something like this:YAHMSA:5O:4,5X:2,3C:30 6 * * * 60 4C:0 7 * * 8 120 4C:30 19 * * * 60 4C:40 16 13 4 * 60 4C:2 8 6 5 * 60 4S:60Which breaks down as:        YAHMS        _header, identifies this as YAHMS config_        A:5    _comma separated list of analog pins to take samples from_        O:4,5    _comma separated list of digital pins to use for output, controlled by control blocks given later_        X:2,3    _Pins being used for Xbee as RX then TX_        S:    60    _comma separated list of settings, the first number is a number of minutes that this system is offset from GMT - the server is expected to handle daylight savings time and change this accordingly_        _and a set of control blocks_        C:306***604        _pin 4 turned on at 6:30am every morning for 60 minutes_        C:07**81204        _pin 4 turned on at 7am at weekends for 120 minutes_        C:3019***604        _pin 4 turned on at 7:30pm every evening for 60 minutes_        C:0***2105        _pin 5 turned on for 10 minutes every hour, every Monday_        C:014**21050        _pin 5 turned **off** for 10 minutes at 2:00pm on Mondays, i.e. cancelling out the block on the previous line_   The syntax for the control blocks is inspired by the syntax of crontab although YAHMS only supports either a number or an asterisk (*) for the numbers, and instead of a command the time is followed by a number of minutes, a pin that you want updating and the state you want it to have. An asterisk in a numeric column means that this column always matches, a number means “only use this block when this field has this value”. Here’s a breakdown of the fields:          Field        Example        Description                 C:    Identifies this as a control block        m    30    number of minutes past the hour (0-59)        h    6    hours since midnight (0-23)        dom    3    day of the month (1-31)        mon    5    month of the year (1-12)        dow    2    day of the week (Sunday is 1, 8 is weekend, 9 is weekday)        len    45    length of time the block is active, in minutes (stored as an int so -32,768 to 32,767 though it would be unlikely you’d use values that big)        pin    4    the arduino digital pin that you would like to control        state    0    This field is optional and is “on” by default, 1 is on, 0 (zero) is off.    So this would give us a very specific control block that turns pin 4 off for 45 minutes from 6:30am on the 3rd of May, but only if that day happened to be a Monday.At any point in time it would be possible for a number of control blocks to be active for a pin. If any of these blocks specify that the pin should be off then this gets priority and the pin is turned off. The default state for a pin when no control blocks are active is also off. Generally you would only need to have “on” control blocks but the “off” blocks allow you to override, so you can have a block that turns the heating on every evening, but add a temporary “off” block to turn it off on a particularly warm evening.For sampling, the YAHMS system will take a sample from any analog pins that you have requested on every cycle of the loop method. It will store the last 10 samples and then submit a smoothed value back to the server. For the XBee values it will check every cycle for an XBee packet (waiting for 5 seconds). If it receives a packet it will record a smoothed value from the samples that have been sent. Every minute the system will submit any samples that it has taken, and will then blank the XBee records. This way you won’t get continuous records from the XBee if it stops transmitting. The samples will be sent to the following URL as a HTTP POST:http://yahms.net/api/s/a1b2c3d4e5f6/1(Again that’s the MAC address and a version number in the URL)The POST data is sent as Content-Type: application/x-www-form-urlencoded and will have a format similar to the following:A5=0b8&amp;X1P0;=226&amp;X1P1;=039&amp;X1P2;=05f&amp;X2P0;=233&amp;X2P1;=18f&amp;X2P2;=18f&amp;X2P4;=0de&amp;Each sample is a three digit hex number (three digits is required to send to 10 bit accuracy). The samples from Arduino analog pins will have keys of A0-A5 and samples from an XBee are given as X, then the ID of the unit (the Arduino code will only support single digit IDs at the moment, i.e. 0001-0009 are supported), then the letter P then the XBee Analog/Digital pin that was sampled. So in the above we have a value of 184 from Arduino analog pin 5, then 550 from pin AD0 (pin 20 on the module) of the XBee with ID 0001, we have some more values and end with 222 from pin AD4 (pin 11 on the module) of the XBee with ID 0002.The code for yahms.net currently requires Rails 2 but I’m thinking that I should update it to work with Rails 3 considering that’s been out for ages. I’m intending to do this update before releasing the code. If anyone particularly wants a copy then let me know and if lots of people do I’ll just release it anyway. For now I’ve linked to a small PHP script below which you can use to send config to your YAHMS system and store the submitted data in a text file. Below are the links to the other custom libraries too:      HttpClient and dependant libraries (UPDATED! - now available from GitHub)         XBee Arduino library that uses NewSoftSerial        Basic PHP script for sending config and storing samples.  Do let me know if you find this interesting or useful! I really hope someone does and the more feedback I get the quicker I’ll release the yahms.net code and improve the whole system!",
            "content_html": "<p>Bit of a delay as I’ve been busy with other things but in this post I’ll be completing the set of YAHMS hardware by discussing the base station hardware and software. The base station has a few jobs to do in my YAHMS setup:</p><ul>  <li>    <p>Physically connect to the relays via digital output pins.</p>  </li>  <li>    <p>Download the config for digital output pins and then control them.</p>  </li>  <li>    <p>Receive the XBee signals from the temperature probes.</p>  </li>  <li>    <p>Take samples from an on-board temperature sensor.</p>  </li>  <li>    <p>Submit samples received locally and via XBee to the server.</p>  </li></ul><p>The circuit for this is fairly simple though, just connecting up some inputs and outputs. I mentioned <a href=\"http://blog.johnmckerrell.com/2011/04/20/yahms-temperature-probes/\">connecting an XBee to an Arduino in the temperature probes post</a>, we simply need to connect the DIN and DOUT pins up to the Arduino so that it can receive the information (and of course the power and ground wires). Because I like to use the main serial interface on the Arduino for outputting debug information back to the computer I’ve gone with connecting to pins 2 &amp; 3 and using the NewSoftSerial which essentially means the serial interface will be provided by software. This isn’t ideal as in theory it means you’re more likely to miss data as it comes in, but the latest software serial drivers largely get around that issue by being interrupt driven. So I end up with the XBee power and ground going directly to one of the grounds on the Arduino board and the regulated 3.3V output, and then pin 2 (DOUT) on the Xbee is plugged into pin 2 on the Arduino and pin 3 (DIN) goes to pin 3 on the Arduino.</p><p>I have two NPN transistors turning on the relays (using transistors so that the magnet in a coil relay won’t cause a burst of current draw to the Arduino digital pin) which are plugged into two 3.5mm audio jacks. I have 5VDC power going onto the tip of the headphone jack, the sleeve connection of the jack then goes to the collector on the transistor and the emitter of the transistor completes the circuit by connecting to ground. The base of the two transistors go to pins 4 and 5 respectively on the Arduino.</p><p>I also decided to add a temperature sensor onto the board just because I had lots handy and to make sure that I had something to sample locally. The TMP36 is wired to the 5V power supply and then the VOUT goes to A5 on the Arduino to sample the temperature. <a href=\"http://blog.johnmckerrell.com/2011/04/20/yahms-temperature-probes/\">See my temperature probe post for more details on TMP36s.</a></p><p>Here’s a picture of my original circuit diagram:</p><p><a href=\"/uploads/2011/05/IMG_0684.jpg\"><img src=\"/uploads/2011/05/IMG_0684-1024x764.jpg\" alt=\"\" /></a></p><p>And here’s a fritzing version of that diagram:</p><p><a href=\"/uploads/2011/05/yahms-base-station.png\"><img src=\"/uploads/2011/05/yahms-base-station.png\" alt=\"\" /></a></p><p>And here’s a photo of the finished product:</p><p><a href=\"/uploads/2011/05/IMG_0683.jpg\"><img src=\"/uploads/2011/05/IMG_0683-224x300.jpg\" alt=\"\" /></a> The board I’ve used here is a prototyping shield that I got from <a href=\"http://twitter.com/oomlout\">@oomlout</a> at MakerFaire. Being a shield it’s really handy and has two sets of connected track on the ends allowing power distribution. I couldn’t find a part for it in Fritzing so I’ve just used the breadboard piece and tried to arrange the parts in the diagram in a similar way to how they ended up, but with more useful spacing.</p><p>I had a few small physical problems with the board when it was completed. The pins on the headers on the prototyping shield are note long enough for it to properly stand above the RJ45 jack on an ethernet shield. You can kind-of push it down so that all the contacts are made but it’s not quite ideal. This also means that the RJ45 shielding will short circuit any connections it’s butting against on the prototyping board. That caused a bit of a debugging nightmare for me at first until I realised and applied some insulation tape! Things fit well if you put the ethernet shield on top of the prototyping shield but unfortunately the ethernet shield then didn’t work, I assume because it needs the ICSP connection.</p><p>The hardware here is pretty simple but I’ll do a parts list as usual for completeness. Thought I’d also include this cheatsheet which I drew on the second whiteboard in our office:</p><p><a href=\"/uploads/2011/05/IMG_0732.jpg\"><img src=\"/uploads/2011/05/IMG_0732-224x300.jpg\" alt=\"\" /></a></p><table>  <thead>    <tr>      <th>Part</th>      <th>Quantity</th>      <th> </th>    </tr>  </thead>  <tbody>    <tr>      <td><a href=\"http://www.oomlout.co.uk/arduino-uno-p-252.html\">Arduino Uno</a></td>      <td>1</td>      <td> </td>    </tr>    <tr>      <td><a href=\"http://www.oomlout.co.uk/ethernet-shield-for-arduino-updated-p-188.html\">Ethernet Shield</a></td>      <td>1</td>      <td> </td>    </tr>    <tr>      <td><a href=\"http://www.sparkfun.com/products/8664\">XBee (series 1) with Chip Antenna</a></td>      <td>1</td>      <td><a href=\"http://www.sparkfun.com/datasheets/Wireless/Zigbee/XBee-Datasheet.pdf\">Data-sheet</a></td>    </tr>    <tr>      <td><a href=\"http://www.sparkfun.com/products/8276\">XBee breakout board</a></td>      <td>1</td>      <td> </td>    </tr>    <tr>      <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1109732&amp;CMP=i-bf9f-00001000\">2mm 10 way headers</a></td>      <td>2</td>      <td> </td>    </tr>    <tr>      <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1438760&amp;CMP=i-bf9f-00001000\">TMP36 (temperature sensor)</a></td>      <td>1</td>      <td><a href=\"http://www.farnell.com/datasheets/85387.pdf\">Data sheet</a></td>    </tr>    <tr>      <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1280746&amp;CMP=i-bf9f-00001000\">3.5mm Jack (PCB mounted)</a></td>      <td>2</td>      <td> </td>    </tr>    <tr>      <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1611371&amp;CMP=i-bf9f-00001000\">P2N2222AG - NPN Transistor</a></td>      <td>2</td>      <td><a href=\"http://www.farnell.com/datasheets/78775.pdf\">Data Sheet</a></td>    </tr>  </tbody></table><p>It’s worth noting that as YAHMS is completely configurable you can actually have whatever circuit you want using any of the digital output pins or Analog input pins, and choosing whether to use the XBee or not, my circuit is only really shown as a guide. In the future I intend to add support for digital inputs too.</p><p>Once that was all done it was time to write some software. As I mentioned in the first post I’ve actually open sourced the software for this so you can <a href=\"https://github.com/johnmckerrell/YAHMS\">grab the source code for YAHMS from github</a> and extend and fork it as much as you want. Unfortunately at the moment it has a few non-standard dependencies. The main thing is the new version of the Ethernet libraries that <a href=\"http://mcqn.com/\">Adrian McEwen</a> (<a href=\"http://twitter.com/amcewen\">@amcewen</a>) has been working on. These will be part of an Arduino build in the near future but for now you can try getting them from <a href=\"https://github.com/amcewen/Arduino\">his github fork of the Arduino environment</a>. They’re really useful though as they provide DHCP and DNS support meaning no more fixed IP addresses! I’m also using a HttpClient library that Adrian has also written. This isn’t actually available properly from anywhere yet (but keep an eye on his github repositories!) so I’ve linked to a zip file of the version I’ve used below, that also contains a few other libraries that it uses. The final custom library is a version of <a href=\"http://code.google.com/p/xbee-arduino/\">this XBee Arduino library</a> that I’ve hacked to support NewSoftSerial instead of just the standard Serial interface, see the links below for that too. You’ll also need <a href=\"http://arduiniana.org/libraries/newsoftserial/\">NewSoftSerial</a> of course and the <a href=\"http://arduiniana.org/libraries/flash/\">Flash</a> library which I’ve used to decrease memory usage. Follow the instructions in <code class=\"language-plaintext highlighter-rouge\">patching_print.txt</code> to patch the system Print library to support the Flash objects.</p><p>If you manage to get through the rather complicated compilation process for YAHMS you’ll find that you just need to edit the MAC address in <a href=\"https://github.com/johnmckerrell/YAHMS/blob/master/YAHMS_Local.h\">YAHMS_Local.h</a> and you’re ready to go. In theory you should not have to configure anything else locally once I have yahms.net working fully. Once running on an Arduino that sketch will retrieve an IP address via DHCP, synchronise the time using NTP and will then attempt to retrieve the latest config for the MAC address from  <del>yahms.net</del> yahms.johnmckerrell.com (yahms.net does work but seems I’ve forgotten to update the source code). Currently there’s no way for you to put your config into yahms.net but hopefully I’ll get that up soon enough. Until that point you can edit YAHMS_SERVER in <a href=\"https://github.com/johnmckerrell/YAHMS/blob/master/YAHMS_Defines.h\">YAHMS_defines.h</a> and use something on your own system.</p><p>Config is requested by a HTTP GET request to a URL like the following:</p><p><code class=\"language-plaintext highlighter-rouge\">http://yahms.net/api/c/a1b2c3d4e5f6/1/00000000</code></p><p>Which breaks down as follows:</p><table>  <tr>    <td>/api/c/</td><td>a1b2c3d4e5f6</td><td>/</td><td>1</td><td>/</td><td>00000000</td></tr>  <tr>    <td></td>    <td>MAC address of your ethernet shield, as registered with yahms.net</td>    <td colspan=\"2\">Protocol version, currently ignored</td>    <td colspan=\"2\">Time last update was retrieved, idea being that the server will return nothing if the config has not updated, also ignored and incorrectly sent as zeroes by the YAHMS code right now</td>  </tr></table><p>And should return something like this:</p><figure class=\"highlight\"><pre><code class=\"language-text\" data-lang=\"text\">YAHMSA:5O:4,5X:2,3C:30 6 * * * 60 4C:0 7 * * 8 120 4C:30 19 * * * 60 4C:40 16 13 4 * 60 4C:2 8 6 5 * 60 4S:60</code></pre></figure><p>Which breaks down as:</p><table>  <tbody>  <tr>    <td>YAHMS</td>    <td></td>    <td colspan=\"10\">_header, identifies this as YAHMS config_</td>  </tr>  <tr>    <td>A:</td><td>5</td>    <td colspan=\"10\">_comma separated list of analog pins to take samples from_</td>  </tr>  <tr>    <td>O:</td><td>4,5</td>    <td colspan=\"10\">_comma separated list of digital pins to use for output, controlled by control blocks given later_</td>  </tr>  <tr>    <td>X:</td><td>2,3</td>    <td colspan=\"10\">_Pins being used for Xbee as RX then TX_</td>  </tr>  <tr>    <td>S:</td>    <td>60</td>    <td colspan=\"10\">_comma separated list of settings, the first number is a number of minutes that this system is offset from GMT - the server is expected to handle daylight savings time and change this accordingly_</td>  </tr>  <tr>    <td colspan=\"10\">_and a set of control blocks_</td>  </tr>  <tr>    <td>C:</td><td>30</td><td>6</td><td>*</td><td>*</td><td>*</td><td>60</td><td>4</td>  </tr>  <tr>    <td colspan=\"10\">_pin 4 turned on at 6:30am every morning for 60 minutes_</td>  </tr>  <tr>    <td>C:</td><td>0</td><td>7</td><td>*</td><td>*</td><td>8</td><td>120</td><td>4</td>  </tr>  <tr>    <td colspan=\"10\">_pin 4 turned on at 7am at weekends for 120 minutes_</td>  </tr>  <tr>    <td>C:</td><td>30</td><td>19</td><td>*</td><td>*</td><td>*</td><td>60</td><td>4</td>  </tr>  <tr>    <td colspan=\"10\">_pin 4 turned on at 7:30pm every evening for 60 minutes_</td>  </tr>  <tr>    <td>C:</td><td>0</td><td>*</td><td>*</td><td>*</td><td>2</td><td>10</td><td>5</td>  </tr>  <tr>    <td colspan=\"10\">_pin 5 turned on for 10 minutes every hour, every Monday_</td>  </tr>  <tr>    <td>C:</td><td>0</td><td>14</td><td>*</td><td>*</td><td>2</td><td>10</td><td>5</td><td>0</td>  </tr>  <tr>    <td colspan=\"10\">_pin 5 turned **off** for 10 minutes at 2:00pm on Mondays, i.e. cancelling out the block on the previous line_</td>  </tr> </tbody></table><p>The syntax for the control blocks is inspired by the syntax of <a href=\"http://www.manpagez.com/man/5/crontab/\">crontab</a> although YAHMS only supports either a number or an asterisk (*) for the numbers, and instead of a command the time is followed by a number of minutes, a pin that you want updating and the state you want it to have. An asterisk in a numeric column means that this column always matches, a number means “only use this block when this field has this value”. Here’s a breakdown of the fields:</p><table>  <thead>  <tr>  <th>    Field  </th>  <th>    Example  </th>  <th>    Description  </th>  </tr> </thead>  <tbody>  <tr>    <td></td>    <td>C:</td>    <td><em>Identifies this as a control block</em></td>  </tr>  <tr>    <td>m</td>    <td>30</td>    <td><em>number of minutes past the hour (0-59)</em></td>  </tr>  <tr>    <td>h</td>    <td>6</td>    <td><em>hours since midnight (0-23)</em></td>  </tr>  <tr>    <td>dom</td>    <td>3</td>    <td><em>day of the month (1-31)</em></td>  </tr>  <tr>    <td>mon</td>    <td>5</td>    <td><em>month of the year (1-12)</em></td>  </tr>  <tr>    <td>dow</td>    <td>2</td>    <td><em>day of the week (Sunday is 1, 8 is weekend, 9 is weekday)</em></td>  </tr>  <tr>    <td>len</td>    <td>45</td>    <td><em>length of time the block is active, in minutes (stored as an int so -32,768 to 32,767 though it would be unlikely you’d use values that big)</em></td>  </tr>  <tr>    <td>pin</td>    <td>4</td>    <td><em>the arduino digital pin that you would like to control</em></td>  </tr>  <tr>    <td>state</td>    <td>0</td>    <td><em>This field is optional and is “on” by default, 1 is on, 0 (zero) is off.</em></td>  </tr>  </tbody></table><p>So this would give us a very specific control block that turns pin 4 off for 45 minutes from 6:30am on the 3rd of May, but only if that day happened to be a Monday.</p><p>At any point in time it would be possible for a number of control blocks to be active for a pin. If any of these blocks specify that the pin should be off then this gets priority and the pin is turned off. The default state for a pin when no control blocks are active is also off. Generally you would only need to have “on” control blocks but the “off” blocks allow you to override, so you can have a block that turns the heating on every evening, but add a temporary “off” block to turn it off on a particularly warm evening.</p><p>For sampling, the YAHMS system will take a sample from any analog pins that you have requested on every cycle of the loop method. It will store the last 10 samples and then submit a smoothed value back to the server. For the XBee values it will check every cycle for an XBee packet (waiting for 5 seconds). If it receives a packet it will record a smoothed value from the samples that have been sent. Every minute the system will submit any samples that it has taken, and will then blank the XBee records. This way you won’t get continuous records from the XBee if it stops transmitting. The samples will be sent to the following URL as a HTTP POST:</p><figure class=\"highlight\"><pre><code class=\"language-text\" data-lang=\"text\">http://yahms.net/api/s/a1b2c3d4e5f6/1</code></pre></figure><p>(Again that’s the MAC address and a version number in the URL)</p><p>The POST data is sent as <code class=\"language-plaintext highlighter-rouge\">Content-Type: application/x-www-form-urlencoded</code> and will have a format similar to the following:</p><figure class=\"highlight\"><pre><code class=\"language-text\" data-lang=\"text\">A5=0b8&amp;X1P0;=226&amp;X1P1;=039&amp;X1P2;=05f&amp;X2P0;=233&amp;X2P1;=18f&amp;X2P2;=18f&amp;X2P4;=0de&amp;</code></pre></figure><p>Each sample is a three digit hex number (three digits is required to send to 10 bit accuracy). The samples from Arduino analog pins will have keys of A0-A5 and samples from an XBee are given as X, then the ID of the unit (the Arduino code will only support single digit IDs at the moment, i.e. 0001-0009 are supported), then the letter P then the XBee Analog/Digital pin that was sampled. So in the above we have a value of 184 from Arduino analog pin 5, then 550 from pin AD0 (pin 20 on the module) of the XBee with ID 0001, we have some more values and end with 222 from pin AD4 (pin 11 on the module) of the XBee with ID 0002.</p><p>The code for yahms.net currently requires Rails 2 but I’m thinking that I should update it to work with Rails 3 considering that’s been out for ages. I’m intending to do this update before releasing the code. If anyone particularly wants a copy then let me know and if lots of people do I’ll just release it anyway. For now I’ve linked to a small PHP script below which you can use to send config to your YAHMS system and store the submitted data in a text file. Below are the links to the other custom libraries too:</p><ul>  <li>    <p><a href=\"https://github.com/amcewen/HttpClient\">HttpClient and dependant libraries (UPDATED! - now available from GitHub) </a></p>  </li>  <li>    <p><a href=\"/uploads/2011/05/XBee-jmck.zip\">XBee Arduino library that uses NewSoftSerial</a></p>  </li>  <li>    <p><a href=\"/uploads/2011/05/yahms-php.zip\">Basic PHP script for sending config and storing samples.</a></p>  </li></ul><p>Do let me know if you find this interesting or useful! I really hope someone does and the more feedback I get the quicker I’ll release the yahms.net code and improve the whole system!</p>",
            "url": "https://blog.johnmckerrell.com/2011/05/09/yahms-base-station/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/05/09/yahms-base-station/",
            
            "tags": ["arduino","tmp36","xbee","yahms"],
            
            "date_published": "2011-05-09T16:54:02+01:00",
            "date_modified": "2011-05-09T16:54:02+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/05/08/weeknotes-week-158/",
            "title": "Weeknotes Week 145 (was 158)",
            "summary": null,
            "content_text": " Quite a mixed week this week as I was expecting some materials from a client to come through to let me work on some updates for them but they didn’t come through until Friday. In theory it was also a short week due to the May Day bank holiday in the UK. As it happened I ended up spending Monday making some final changes to Bubblino, including the addition of bubbles! Such an important thing for Bubblino but I kept forgetting to add them. Really happy with how they came out, they’re randomly generated and individually controlled. At the moment the bubbles all float up which is a bit different to the real Bubblino, but they look good for now. I finally got the app submitted early on Tuesday morning so hopefully it’ll get accepted in the next few days and we can get it up for sale. The new version is going to be on sale for 99c/59p so it’ll be interesting to see if it generates any useful revenue.I also spent some time this week trying to improve my App Store Positions service. I’ve noticed recently that the graphs it generates of positions have been fluctuating quite wildly. I’d previously checked that it was successfully completing all the downloads it does so I couldn’t really see what might be the issue and was assuming it was a problem on Apple’s end. As it turns out the problem is definitely on Apple’s end but I have been able to work around it. Basically Apple’s servers are sometimes returning the wrong result for the request I send, i.e. I might request UK Navigation Paid apps and get Venezuelan Navigation Paid apps back. While I would notice a response coming back with incorrect XML because it didn’t have positions data in, I wasn’t checking that what I got back was what I asked for. Fortunately I’ve been able to add a check in and am now retrying all requests that get bad responses. Unfortunately this means that my downloading is now taking about 1 hour 15 minutes when previously it was only taking 30 minutes, but at least I’m getting the right data now! I also improved the style of the emails it sends so that high performing apps are towards the top and the highest app store rankings show up first so I’m glad to be getting some nicer data to present there.Apart from this most of the week was spent on little bitty things, some (hopefully final) changes to the Chess Viewer and answering various emails. Next week should be more active working on a client app, though that hasn’t started well as I’ve found that the image resources I’ve been sent through are all arbitrarily sized. I’m sure I’ve got a fun week to look forward to.",
            "content_html": "<p><a href=\"/uploads/2011/05/Screenshot-2011.05.02-13.57.17.png\"><img src=\"/uploads/2011/05/Screenshot-2011.05.02-13.57.17-200x300.png\" alt=\"\" /></a> Quite a mixed week this week as I was expecting some materials from a client to come through to let me work on some updates for them but they didn’t come through until Friday. In theory it was also a short week due to the May Day bank holiday in the UK. As it happened I ended up spending Monday making some final changes to Bubblino, including the addition of bubbles! Such an important thing for Bubblino but I kept forgetting to add them. Really happy with how they came out, they’re randomly generated and individually controlled. At the moment the bubbles all float up which is a bit different to the real Bubblino, but they look good for now. I finally got the app submitted early on Tuesday morning so hopefully it’ll get accepted in the next few days and we can get it up for sale. The new version is going to be on sale for 99c/59p so it’ll be interesting to see if it generates any useful revenue.</p><p>I also spent some time this week trying to improve my App Store Positions service. I’ve noticed recently that the graphs it generates of positions have been fluctuating quite wildly. I’d previously checked that it was successfully completing all the downloads it does so I couldn’t really see what might be the issue and was assuming it was a problem on Apple’s end. As it turns out the problem is definitely on Apple’s end but I have been able to work around it. Basically Apple’s servers are sometimes returning the wrong result for the request I send, i.e. I might request UK Navigation Paid apps and get Venezuelan Navigation Paid apps back. While I would notice a response coming back with incorrect XML because it didn’t have positions data in, I wasn’t checking that what I got back was what I asked for. Fortunately I’ve been able to add a check in and am now retrying all requests that get bad responses. Unfortunately this means that my downloading is now taking about 1 hour 15 minutes when previously it was only taking 30 minutes, but at least I’m getting the right data now! I also improved the style of the emails it sends so that high performing apps are towards the top and the highest app store rankings show up first so I’m glad to be getting some nicer data to present there.</p><p><a href=\"/uploads/2011/05/positions.png\"><img src=\"/uploads/2011/05/positions.png\" alt=\"\" /></a></p><p>Apart from this most of the week was spent on little bitty things, some (hopefully final) changes to the Chess Viewer and answering various emails. Next week should be more active working on a client app, though that hasn’t started well as I’ve found that the image resources I’ve been sent through are all arbitrarily sized. I’m sure I’ve got a fun week to look forward to.</p>",
            "url": "https://blog.johnmckerrell.com/2011/05/08/weeknotes-week-158/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/05/08/weeknotes-week-158/",
            
            "tags": ["bubblino","weeknotes"],
            
            "date_published": "2011-05-08T14:10:15+01:00",
            "date_modified": "2011-05-08T14:10:15+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/04/29/more-bubblino-friends-week-157/",
            "title": "More Bubblino & Friends, Week 144 (was 157)",
            "summary": null,
            "content_text": "This has been quite a short week due to the Easter bank holiday on Monday and the public holiday for the royal wedding today. I decided to spend the three days working on the Bubblino &amp; Friends iPhone app that I built back in January.Soon after January I talked to local artist and illustrator Sophie Green about her providing new artwork for the app and within a week or so she delivered some really nice pics for Bubblino, Pirate Parrot and another character that’ll be new with this version. I also chatted to a voiceover guy who came up with some great quality audio for Pirate Parrot.Unfortunately I then got busy and so nearly three months passed without progress. This week I’ve finally got going on it again and have made loads of progress. I’ve added the new character and new art throughout. There’s a new tasteful tweet view UI and a nice simple form for building up advanced search queries that even searches using your phone’s location.The update is essentially done now so I can’t wait to get it on the store, there’s just one more feature I keep forgetting about and some testing to be done but hopefully in just over a week there’ll be a new Bubblino &amp; Friends available to buy on the app store!Oh, and introducing my new robot friend:He’s currently going by the name “Mr Roboto” but I’m open to suggestions for something better!(The text for these weeknotes was all entered through a Kindle device. The screen is so great in the sunlight that I’m desperate to find ways to work on it. The keyboard is a little difficult so I may have to see if it’s possible to use an external one.)",
            "content_html": "<p>This has been quite a short week due to the Easter bank holiday on Monday and the public holiday for the royal wedding today. I decided to spend the three days working on the Bubblino &amp; Friends iPhone app that I built back in January.</p><p>Soon after January I talked to local artist and illustrator Sophie Green about her providing new artwork for the app and within a week or so she delivered some really nice pics for Bubblino, Pirate Parrot and another character that’ll be new with this version. I also chatted to a voiceover guy who came up with some great quality audio for Pirate Parrot.</p><p>Unfortunately I then got busy and so nearly three months passed without progress. This week I’ve finally got going on it again and have made loads of progress. I’ve added the new character and new art throughout. There’s a new tasteful tweet view UI and a nice simple form for building up advanced search queries that even searches using your phone’s location.</p><p>The update is essentially done now so I can’t wait to get it on the store, there’s just one more feature I keep forgetting about and some testing to be done but hopefully in just over a week there’ll be a new Bubblino &amp; Friends available to buy on the app store!</p><p>Oh, and introducing my new robot friend:</p><p><a href=\"/uploads/2011/04/robot-screenshot.png\"><img src=\"/uploads/2011/04/robot-screenshot.png\" alt=\"\" /></a></p><p>He’s currently going by the name “Mr Roboto” but I’m open to suggestions for something better!</p><p>(The text for these weeknotes was all entered through a Kindle device. The screen is so great in the sunlight that I’m desperate to find ways to work on it. The keyboard is a little difficult so I may have to see if it’s possible to use an external one.)</p>",
            "url": "https://blog.johnmckerrell.com/2011/04/29/more-bubblino-friends-week-157/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/04/29/more-bubblino-friends-week-157/",
            
            "tags": ["bubblino","weeknotes"],
            
            "date_published": "2011-04-29T13:35:22+01:00",
            "date_modified": "2011-04-29T13:35:22+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/04/25/yahms-relays/",
            "title": "YAHMS: Relays",
            "summary": null,
            "content_text": " This should be a fairly short post as the relays are quite simple. I decided to intercept the power to the heating by taking apart an old mechanical timer like these, stripping out all the mechanics and making use of the exposed connections which simply needed shorting to turn the socket on. With the mechanics removed there was plenty of space to fit the relay and the DC connector. I decided, for no particular reason, to use some 3.5mm headphone type jacks to handle turning the relays on and off. wiring it all up was fairly simple, the relay has 5 connections two for the DC connection and 3 for the AC connections, the AC ones are wired up differently depending on whether you want the AC circuit to be on or off when the DC signal is present. I also wired a diode across the DC connections on the relay as protection against any reverse current generated by the coil when the DC power is turned off. After reading the rating on the central heating system’s plug I went for (what I thought was) a 13A rated relay, when I opened the plug later on to rewire it though I found it only had a 3A fuse inside! At least my relay unit will be more capable if I want to use it elsewhere.The place where my central heating plugs in actually has just two sockets. With this relay and the heating plugging into one that meant I only had one spare. I had already decided to use Powerline Ethernet to get network access to my boiler and so I didn’t actually have anywhere left to plug the Arduino in. I thought it would be a shame to have to load in an extension just for the sake of the Arduino so I began exploring other options. The first thing I looked at was tapping 5v from somewhere in the Powerline Ethernet device I was using, having taken it apart and looked up various of the ICs on the internet though I decided that probably wasn’t a good idea. I’m sure there’s somewhere I could’ve taken it from but considering the device was mostly about varying voltage and playing with everything from mains voltage to DC on the IC and a different level of DC over ethernet I decided to leave this one alone. I ended up looking on Farnell to see if they had any self contained switching PCB power supplies and with some searching help from Adrian McEwen again we found this 5VDC 2.75W switching PSU. I managed to fit this and an old USB socket into my old mechanical timer so that it was not only relay controlled but also provided 5V DC of power via USB, just the thing for an Arduino! The result is quite a nicely put together unit, the only problem being the black insulation tape I’m using to cover up the big circular hole where the mechanics were, I really ought to sort that out sometime. I quite liked the size and capability of the PSU though and may even get some more to power the XBee modules if the batteries don’t power them for long enough.So, bill of materials for this unit are as follows, I’m not going to bother putting a circuit diagram in as it’s so simple but post comments if you have any questions.      Part   Quantity         Mechanical timer   1   These are not the ones I used, just an example, so I can’t guarantee they’ll have the same amount of space, in fact they do look a bit smaller than mine.       5VDC/250VAC PCB Relay   1   Data-sheet - I had thought this was 15A rated but looking again seems it might be only 6A       Diode   1   Not entirely sure what type of diode this was, just what Adrian had lying around       3.5mm Jack   1   Data-sheet       3.5mm Plug   2 needed for this project (one either end of the connecting cable), this is a pack of ten though   Data-sheet       5VDC 2.75W switching regulated PSU   1   Data-sheet       Female USB Type A socket   1   Just one I had lying around   For the light switch I went with this 5A solid state relay which I rejected for the central heating control when I thought I needed a 13A relay. Again it just required a simple circuit with a 3.5mm jack and a protection diode across. I’m housing all of this inside a thermoplastic junction box. it does the trick but probably isn’t ideal and has unsightly rubbery cones coming off each side which you can cut down to fit cables. Bill of parts for this one would be:      Part   Quantity         Thermoplastic junction box   1   Not ideal but does the job       Solid state 3-15VDC/240VAC Relay   1   Data-sheet       Diode   1   Not entirely sure what type of diode this was, just what Adrian had lying around       3.5mm Jack   1   Data-sheet       3.5mm Plug   2 needed for this project (one either end of the connecting cable), this is a pack of ten though   Data-sheet   So next blog post should cover the base station, and that’s when thing start to get a bit more interesting.",
            "content_html": "<p><a href=\"/uploads/2011/04/IMG_0759.jpg\"><img src=\"/uploads/2011/04/IMG_0759-224x300.jpg\" alt=\"\" /></a> This should be a fairly short post as the relays are quite simple. I decided to intercept the power to the heating by taking apart an <a href=\"http://www.amazon.co.uk/3pc-Hour-Plug-Timer-Socket/dp/B001JYG8NO/ref=sr_1_1?ie=UTF8&amp;qid=1303728138&amp;sr=8-1\">old mechanical timer like these</a>, stripping out all the mechanics and making use of the exposed connections which simply needed shorting to turn the socket on. With the mechanics removed there was plenty of space to fit the relay and the DC connector. I decided, for no particular reason, to use some 3.5mm headphone type jacks to handle turning the relays on and off. wiring it all up was fairly simple, the relay has 5 connections two for the DC connection and 3 for the AC connections, the AC ones are wired up differently depending on whether you want the AC circuit to be on or off when the DC signal is present. I also wired a diode across the DC connections on the relay as protection against any reverse current generated by the coil when the DC power is turned off. After reading the rating on the central heating system’s plug I went for <a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1329651&amp;CMP=i-bf9f-00001000\">(what I thought was) a 13A rated relay</a>, when I opened the plug later on to rewire it though I found it only had a 3A fuse inside! At least my relay unit will be more capable if I want to use it elsewhere.</p><p>The place where my central heating plugs in actually has just two sockets. With this relay and the heating plugging into one that meant I only had one spare. I had already decided to use Powerline Ethernet to get network access to my boiler and so I didn’t actually have anywhere left to plug the Arduino in. I thought it would be a shame to have to load in an extension just for the sake of the Arduino so I began exploring other options. The first thing I looked at was tapping 5v from somewhere in the Powerline Ethernet device I was using, having taken it apart and looked up various of the ICs on the internet though I decided that probably wasn’t a good idea. I’m sure there’s somewhere I could’ve taken it from but considering the device was mostly about varying voltage and playing with everything from mains voltage to DC on the IC and a different level of DC over ethernet I decided to leave this one alone. I ended up looking on Farnell to see if they had any self contained switching PCB power supplies and with some searching help from <a href=\"http://www.mcqn.com/\">Adrian McEwen</a> again we found this <a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1825773&amp;CMP=i-bf9f-00001000\">5VDC 2.75W switching PSU</a>. I managed to fit this and an old USB socket into my old mechanical timer so that it was not only relay controlled but also provided 5V DC of power via USB, just the thing for an Arduino! The result is quite a nicely put together unit, the only problem being the black insulation tape I’m using to cover up the big circular hole where the mechanics were, I really ought to sort that out sometime. I quite liked the size and capability of the PSU though and may even get some more to power the XBee modules if the batteries don’t power them for long enough.</p><p>So, bill of materials for this unit are as follows, I’m not going to bother putting a circuit diagram in as it’s so simple but post comments if you have any questions.</p><table>   <tr>   Part   Quantity  </tr>  <tbody>  <tr>   <td><a href=\"http://www.amazon.co.uk/3pc-Hour-Plug-Timer-Socket/dp/B001JYG8NO/ref=sr_1_1?ie=UTF8&amp;qid=1303728138&amp;sr=8-1\">Mechanical timer</a></td>   <td>1</td>   <td>These are not the ones I used, just an example, so I can’t guarantee they’ll have the same amount of space, in fact they do look a bit smaller than mine.</td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1329651&amp;CMP=i-bf9f-00001000\">5VDC/250VAC PCB Relay</a></td>   <td>1</td>   <td><a href=\"http://www.farnell.com/datasheets/60860.pdf\">Data-sheet</a> - I had thought this was 15A rated but looking again seems it might be only 6A</td>  </tr>  <tr>   <td>Diode</td>   <td>1</td>   <td>Not entirely sure what type of diode this was, just what Adrian had lying around</td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1270966&amp;CMP=i-bf9f-00001000\">3.5mm Jack</a></td>   <td>1</td>   <td><a href=\"http://www.farnell.com/datasheets/47301.pdf\">Data-sheet</a></td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1294214&amp;CMP=i-bf9f-00001000\">3.5mm Plug</a></td>   <td>2 needed for this project (one either end of the connecting cable), this is a pack of ten though</td>   <td><a href=\"http://www.farnell.com/datasheets/327398.pdf\">Data-sheet</a></td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1825773&amp;CMP=i-bf9f-00001000\">5VDC 2.75W switching regulated PSU</a></td>   <td>1</td>   <td><a href=\"http://www.farnell.com/datasheets/606238.pdf\">Data-sheet</a></td>  </tr>  <tr>   <td>Female USB Type A socket</td>   <td>1</td>   <td>Just one I had lying around</td>  </tr> </tbody></table><p><a href=\"/uploads/2011/04/IMG_0702.jpg\"><img src=\"/uploads/2011/04/IMG_0702-224x300.jpg\" alt=\"\" /></a>For the light switch I went with <a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1200213&amp;CMP=i-bf9f-00001000\">this 5A solid state relay</a> which I rejected for the central heating control when I thought I needed a 13A relay. Again it just required a simple circuit with a 3.5mm jack and a protection diode across. I’m housing all of this inside <a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=8641650&amp;CMP=i-bf9f-00001000\">a thermoplastic junction box</a>. it does the trick but probably isn’t ideal and has unsightly rubbery cones coming off each side which you can cut down to fit cables. Bill of parts for this one would be:</p><table style=\"clear: both\">   <tr>   Part   Quantity  </tr>  <tbody>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=8641650&amp;CMP=i-bf9f-00001000\">Thermoplastic junction box</a></td>   <td>1</td>   <td>Not ideal but does the job</td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1200213&amp;CMP=i-bf9f-00001000\">Solid state 3-15VDC/240VAC Relay</a></td>   <td>1</td>   <td><a href=\"http://www.farnell.com/datasheets/22659.pdf\">Data-sheet</a></td>  </tr>  <tr>   <td>Diode</td>   <td>1</td>   <td>Not entirely sure what type of diode this was, just what Adrian had lying around</td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1270966&amp;CMP=i-bf9f-00001000\">3.5mm Jack</a></td>   <td>1</td>   <td><a href=\"http://www.farnell.com/datasheets/47301.pdf\">Data-sheet</a></td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1294214&amp;CMP=i-bf9f-00001000\">3.5mm Plug</a></td>   <td>2 needed for this project (one either end of the connecting cable), this is a pack of ten though</td>   <td><a href=\"http://www.farnell.com/datasheets/327398.pdf\">Data-sheet</a></td>  </tr> </tbody></table><p>So next blog post should cover the base station, and that’s when thing start to get a bit more interesting.</p>",
            "url": "https://blog.johnmckerrell.com/2011/04/25/yahms-relays/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/04/25/yahms-relays/",
            
            "tags": ["pcb","relay","yahms"],
            
            "date_published": "2011-04-25T15:31:38+01:00",
            "date_modified": "2011-04-25T15:31:38+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/04/24/ios-in-app-purchases-week-156/",
            "title": "iOS In-app purchases, week 143 (was 156)",
            "summary": null,
            "content_text": "Spent much of this week finishing off the next stage of development for the Chess Viewer. One of the key things we wanted to get into this version was the ability to buy books from Everyman Chess’s website. If you look at their iPhone app page you’ll see that they have a selection of books available in the right format for the iOS app. Each of these is sold for $19.99. At the moment it would be quite a faff to buy the book in Safari on your phone and then download it and get it into the app, the new functionality aims to make this much easier by letting you browse the books on the phone and purchase them with your iTunes details. I was a little nervous about how difficult this could be having read some horror stories, but it did all seem relatively straight-forward so I had only allowed 2-3 days for it. In the end it did take just about 3 days and wasn’t so bad, I think I was well prepared having read some great web pages about it so that when I did have problems I knew how to handle them. This page had some great information and a class to use to work with the app store. This in-app purchases walkthrough was also invaluable. The first of  those links seemed to be aiming for a different sort of thing than I was so I actually used the second more but reading both was good to know what to expect. The second one was good for taking you through the steps you’d need to do, including setting up the items to be purchased in iTunes Connect, and also telling you what you’d need to do before testing. A second page by the same guy gives a good breakdown for how to handle “Invalid Product ID” messages from the app store. I did get to a point where I was repeatedly getting no valid product IDs from Apple’s servers and so was seeing no products in my store, in this case (following the instructions on that page) I needed to delete the app and reinstall it to get things going again.I got all of this working and managed to finish the other features and fix a few remaining bugs. I’m really happy with how things are looking, the app has gone from being a fairly basic looking iPhone app (with lots going on under the hood) to a much better presented app (with even more going on under the hood!) Hopefully we won’t find too many bugs while testing over the next few weeks and can get the new version on the store soon.A few more libraries that really helped me were ASIHTTPRequest - a great iOS class for handling web requests which made it really easy for me to submit files back to the server if people have problems with them, I’m sure I’ll be using this one again. Also ZIStoreButton - a class that mimics the buy button on the app store, it shows up as a blue button with a price in and when tapped changes to green and says “Buy Now”. I’ve linked to my own github fork there as I did make a few changes to make it more compatible with pre-iOS4 devices and to (IMHO) better match the style of the app store button.Apart from this I attended the 4th Maker Night of the year. That was good fun, we had a great turn-out and had people working on all sorts of different things. I found I wandered between projects catching up with people and helping out but did get time to help complete a few pieces for the Cupcake 3D printer we’ve been building. Also this week, on a similar vein, I’ve been writing up my experiences with my new “home management” system - YAHMS. There’ll be more to come from that when I get time.",
            "content_html": "<p><a href=\"/uploads/2011/04/Screenshot-2011.04.22-17.38.05.png\"><img src=\"/uploads/2011/04/Screenshot-2011.04.22-17.38.05-200x300.png\" alt=\"\" /></a>Spent much of this week finishing off the next stage of development for the Chess Viewer. One of the key things we wanted to get into this version was the ability to buy books from Everyman Chess’s website. If you <a href=\"http://www.everymanchess.com/chess_app.php\">look at their iPhone app page</a> you’ll see that they have a selection of books available in the right format for the iOS app. Each of these is sold for $19.99. At the moment it would be quite a faff to buy the book in Safari on your phone and then download it and get it into the app, the new functionality aims to make this much easier by letting you browse the books on the phone and purchase them with your iTunes details. I was a little nervous about how difficult this could be having read some horror stories, but it did all seem relatively straight-forward so I had only allowed 2-3 days for it. In the end it did take just about 3 days and wasn’t so bad, I think I was well prepared having read some great web pages about it so that when I did have problems I knew how to handle them. <a href=\"http://blog.mugunthkumar.com/coding/iphone-tutorial-%E2%80%93-in-app-purchases/\">This page</a> had some great information and a class to use to work with the app store. <a href=\"http://troybrant.net/blog/2010/01/in-app-purchases-a-full-walkthrough/\">This in-app purchases walkthrough</a> was also invaluable. The first of  those links seemed to be aiming for a different sort of thing than I was so I actually used the second more but reading both was good to know what to expect. The second one was good for taking you through the steps you’d need to do, including setting up the items to be purchased in iTunes Connect, and also telling you what you’d need to do before testing. A second page by the same guy gives <a href=\"http://troybrant.net/blog/2010/01/invalid-product-ids/\">a good breakdown for how to handle “Invalid Product ID” messages from the app store</a>. I did get to a point where I was repeatedly getting no valid product IDs from Apple’s servers and so was seeing no products in my store, in this case (following the instructions on that page) I needed to delete the app and reinstall it to get things going again.</p><p><a href=\"/uploads/2011/04/Screenshot-2011.04.22-17.38.58.png\"><img src=\"/uploads/2011/04/Screenshot-2011.04.22-17.38.58-200x300.png\" alt=\"\" /></a>I got all of this working and managed to finish the other features and fix a few remaining bugs. I’m really happy with how things are looking, the app has gone from being a fairly basic looking iPhone app (with lots going on under the hood) to a much better presented app (with even more going on under the hood!) Hopefully we won’t find too many bugs while testing over the next few weeks and can get the new version on the store soon.</p><p>A few more libraries that really helped me were <a href=\"http://allseeing-i.com/ASIHTTPRequest/\">ASIHTTPRequest - a great iOS class for handling web requests</a> which made it really easy for me to submit files back to the server if people have problems with them, I’m sure I’ll be using this one again. Also <a href=\"https://github.com/johnmckerrell/ZIStoreButton\">ZIStoreButton - a class that mimics the buy button on the app store</a>, it shows up as a blue button with a price in and when tapped changes to green and says “Buy Now”. I’ve linked to my own github fork there as I did make a few changes to make it more compatible with pre-iOS4 devices and to (IMHO) better match the style of the app store button.</p><p>Apart from this I attended the 4th <a href=\"http://makernight.co.uk/\">Maker Night</a> of the year. That was good fun, we had a great turn-out and had people working on all sorts of different things. I found I wandered between projects catching up with people and helping out but did get time to help complete a few pieces for the Cupcake 3D printer we’ve been building. Also this week, on a similar vein, I’ve been writing up my experiences with my new “home management” system - YAHMS. There’ll be more to come from that when I get time.</p>",
            "url": "https://blog.johnmckerrell.com/2011/04/24/ios-in-app-purchases-week-156/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/04/24/ios-in-app-purchases-week-156/",
            
            "tags": ["arduino","ios","ipad","iPhone","makernight","weeknotes"],
            
            "date_published": "2011-04-24T12:32:48+01:00",
            "date_modified": "2011-04-24T12:32:48+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/04/20/yahms-temperature-probes/",
            "title": "YAHMS: Temperature Probes",
            "summary": null,
            "content_text": "My wireless temperature probes work by using an Xbee module to transmit readings from a TMP36 down to the Arduino base station. The XBees aren’t too cheap, coming in around £19 or $23 so I tried to be cheap and ordered mine from Sparkfun, I bought this XBee (series 1) with Chip Antenna and these breakout boards. I was intending to solder the module directly onto the board and didn’t take notice of what Sparkfun says about “please order the accompanying 2mm sockets (you’ll need 2!) and 0.1” headers below.” (these ones). Once I saw what a stupid idea it was to solder the module (means you can’t switch them around between boards, handy for testing and reprogramming) I ended up buying these headers from Farnell.As mentioned, to take the temperature reading I’m using a TMP36, these take a voltage of around 3-5.5V as input and will output a voltage between 0-2.7V to indicate the temperature, which can be from -40 - 125°C. In the end I needed three of these for this project, two for another project and managed to kill a friends’ (or it was already dead) so I just bought 10 to make sure I had enough.XBee modules require regulated 3.3V input, as I’m using the very basic breakout board that just breaks the pins out without adding any functionality I used a MCP1700(-3302E/TO) which accepts up to 6V. In my first order I just bought two, one for each temperature probe. The first time I tried one I managed to connect it to the batteries the wrong way round (in fact the wires on the battery pack were colour coded wrong!) which unfortunately killed the regulator. With this experience and a few others I’ve realised that for something that only costs £0.36 it’s never worth buying “just enough”, always get plenty. The data sheet for that part suggests putting 1 µF capacitors on the input and output, I had issues finding any with that rating that were cheap enough so ended up going with 3.3 µF capacitors. I eventually ordered 10 regulators so ordered 20 capacitors, might as well make sure I had enough to match!In my initial experiments, when I was still using solar cells, I realised that although the regulator would regulate a large voltage down to 3.3V, if the input voltage was too low the output voltage would actually come out less than 3.3V. This gave me some interesting values when the XBee would just about continue to work, but the reference voltage against which the TMP36’s output was being measured would also drop resulting in temperatures shooting up as the batteries ran out!I found the solar cells weren’t charging enough to power the XBee throughout the day, let alone through the night, so I decided to switch to batteries. I bought some of these 6xAA battery packs, I later realised I only need 4 batteries to power my regulator (and in fact 6 would be too many, I’d been thinking of Arduinos which would need more like 9V input) but it’s simple enough to short a few connections so that the packs work with 4 batteries instead. One problem I did have with these was that I didn’t get any connectors so I was trying to solder the wires directly onto the pack, this really didn’t work well because the plastic started melting before the solder did, so next time I’ll be buying some PP3 battery connectors like these.To get around the issue of the voltage dropping below 3.3V I decided to use a voltage detector to detect when the input voltage was getting low and turn the whole circuit off, I used these TC54VN detectors to check for an input of at least 4.2V, meaning that my circuit should now provide between 4.2V and ~6V (4x1.5V AA batteries) to the regulator, or nothing. The voltage detectors I got are “Open Drain” which essentially means that when the voltage is above 4.2V, “VOUT” is floating, i.e. does nothing. When the voltage goes below 4.2V VOUT is pulled to ground. I actually expected VOUT to output the input voltage when the input voltage was high enough but it turns out I would need a TC54VC if I wanted that. The Open Drain version worked well enough once we figured it out (I had a lot of help from Adrian McEwen on this one). I’m using a transistor to turn on the voltage regulator. I pass the battery input to VOUT via a resistor and then onto base on the transistor via another resistor, this way the transistor is turned on, until the voltage drops and VOUT is grounded, short-circuiting the voltage meaning it doesn’t get to the transistor.The picture above shows the circuit diagram as I was working on it, ignore the Arduino-style pins at the top and bottom. The two circuit diagrams should be just about the same, the higher one was supposed to be clearer. Here’s a fritzing diagram which should hopefully be more useful:You’ll notice that I’m also running a wire to pin 20 on the XBee, this is A0 and will take an analog read from between the two resistors, they’re acting as a voltage divider which should mean I’ll be able to monitor the battery level and get an idea when I’ll need to change the batteries in advance. It should be possible to calculate, using V=IR, what reading I’ll get as the batteries approach 4.2V.This seems like a good time for a bill of parts, so here goes:      Part   Quantity (for a single probe)         XBee (series 1) with Chip Antenna   1   Data-sheet       XBee breakout board   1       2mm 10 way headers   2   Sparkfun link       TMP36 (temperature sensor)   1   Data sheet       MCP1700-3302E/TO (voltage regulator)   1   Data sheet       3.3 µF capacitors   2   Data sheet       TC54VN voltage detector   1   Data Sheet       P2N2222AG - NPN Transistor   1   Data Sheet       6xAA battery pack   1       PP3 battery connector   1   I’ll also mention now that the Lady Ada article about TMP36 sensors was also really useful for teaching me how these work.So that’s the power circuit and the temperature sensor all connected up to the XBee but you still need to program the XBee so that it’ll do something useful with that data. Again Lady Ada was really useful here, I followed the instructions on the Tweet-a-Watt which outline how to send current data via XBee. I used essentially the same programming to get my XBee to report the temperature and battery usage data from AD0 and AD4. I also bought the Rough Cut of Building Wireless Sensor Networks from O’Reilly. Unfortunately that only covers Series 2 XBees whereas I’m using Series 1, but the sections about how to wire an XBee up to USB for programming and what apps to use on the computer to speak serial to the XBee were really useful.To connect the XBee to the computer I actually used an Arduino programmed with an empty sketch (basically void setup() {} void loop() {}). Pin 2 (DOUT) on the XBee was plugged into Pin 0 (RX) on the Arduino and pin 3 (DIN) on the XBee was plugged into Pin 1 (TX) on the Arduino. In this way I’m basically just piggybacking on the Arduino so that it provides a USB -&gt; Serial interface. I then used the Serial Monitor in the Arduino IDE to send commands to the XBee and monitor the response. There’s more about this in the Tweet-A-Watt article. The program I sent to my probes was the following:ATMY=1,SM=4,ST=3,SP=FF,D4=2,D0=2,IT=13,IR=1,ID=1234Which broken down means:      AT - Attention!        MY=1, - the ID of this unit        SM=4, - Sleep Mode SM (4 = Cyclic sleep)        ST=3, - Sleep Time (3 milliseconds after wakeup to go back to sleep)        SP=FF, - Sleep Period (0xFF - 255 x 10 ms = ~2.5 seconds)        D4=2, - enabling pin AD4        D0=2, - enabling pin AD0        IT=13, - number of samples (0x13 - 19 samples per packet)        IR=1, - sample rate (1ms between samples)        ID=1234, - the PAN ID for the network of XBees  Once that has been sent to the XBee it will go into sleep mode. This will mean that the XBee cannot be re-programmed unless you reset it. I actually haven’t figured out how to do that yet and so can’t modify the program on my XBees! I advise that you make sure you’re ready before sending it. It will sleep for 2550ms and then wake up, perform 19 samples with 1ms delay between each, transmit them and then go back to sleep again.Once you’ve sent that to one of your XBees you can then place the module into the temperature sensing circuit and it should start transmitting temperatures. On the base station you would connect an unprogrammed XBee to an Arduino as above and send the following to it, this just sets the PAN ID and the modules own ID (to zero):ATMY=0,ID=1234Now if you monitor the output on the serial connection you should see data being sent about every 2.5s. You can then use the XBee library for Arduino to parse this, or use the code for YAHMS as will be explained later in this series. If you are going to use the XBee library, be aware that the version available for download (0.2.1) actually contains a bug meaning it will give the same output for all pins, use the version in SVN instead which has been fixed.Still to come, the relays and the base station, watch this space!",
            "content_html": "<p><a href=\"/uploads/2011/04/IMG_0741.jpg\"><img src=\"/uploads/2011/04/IMG_0741-764x1024.jpg\" alt=\"\" /></a></p><p>My wireless temperature probes work by using an Xbee module to transmit readings from a TMP36 down to the Arduino base station. The XBees aren’t too cheap, coming in around £19 or $23 so I tried to be cheap and ordered mine from Sparkfun, I bought this <a href=\"http://www.sparkfun.com/products/8664\">XBee (series 1) with Chip Antenna</a> and <a href=\"http://www.sparkfun.com/products/8276\">these breakout boards</a>. I was intending to solder the module directly onto the board and didn’t take notice of what Sparkfun says about “please order the accompanying 2mm sockets (you’ll need 2!) and 0.1” headers below.” (<a href=\"http://www.sparkfun.com/products/8272\">these ones</a>). Once I saw what a stupid idea it was to solder the module (means you can’t switch them around between boards, handy for testing and reprogramming) I ended up buying <a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1109732&amp;CMP=i-bf9f-00001000\">these headers from Farnell</a>.</p><p>As mentioned, to take the temperature reading I’m using <a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1438760&amp;CMP=i-bf9f-00001000\">a TMP36</a>, these take a voltage of around 3-5.5V as input and will output a voltage between 0-2.7V to indicate the temperature, which can be from -40 - 125°C. In the end I needed three of these for this project, two for another project and managed to kill a friends’ (or it was already dead) so I just bought 10 to make sure I had enough.</p><p>XBee modules require regulated 3.3V input, as I’m using the very basic breakout board that just breaks the pins out without adding any functionality I used <a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1296588&amp;CMP=i-bf9f-00001000\">a MCP1700(-3302E/TO)</a> which accepts up to 6V. In my first order I just bought two, one for each temperature probe. The first time I tried one I managed to connect it to the batteries the wrong way round (in fact the wires on the battery pack were colour coded wrong!) which unfortunately killed the regulator. With this experience and a few others I’ve realised that for something that only costs £0.36 it’s never worth buying “just enough”, always get plenty. The data sheet for that part suggests putting 1 µF capacitors on the input and output, I had issues finding any with that rating that were cheap enough so ended up going with <a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=9189530&amp;CMP=i-bf9f-00001000\">3.3 µF capacitors</a>. I eventually ordered 10 regulators so ordered 20 capacitors, might as well make sure I had enough to match!</p><p>In my initial experiments, when I was still using solar cells, I realised that although the regulator would regulate a large voltage down to 3.3V, if the input voltage was too low the output voltage would actually come out less than 3.3V. This gave me some interesting values when the XBee would just about continue to work, but the reference voltage against which the TMP36’s output was being measured would also drop resulting in temperatures shooting up as the batteries ran out!</p><p>I found the solar cells weren’t charging enough to power the XBee throughout the day, let alone through the night, so I decided to switch to batteries. I bought some of <a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=3829571&amp;CMP=i-bf9f-00001000\">these 6xAA battery packs</a>, I later realised I only need 4 batteries to power my regulator (and in fact 6 would be too many, I’d been thinking of Arduinos which would need more like 9V input) but it’s simple enough to short a few connections so that the packs work with 4 batteries instead. One problem I did have with these was that I didn’t get any connectors so I was trying to solder the wires directly onto the pack, this really didn’t work well because the plastic started melting before the solder did, so next time I’ll be buying some <a href=\"http://uk.farnell.com/multicomp/440005p/battery-connector-pp3-type-1-150mm/dp/1183123\">PP3 battery connectors like these</a>.</p><p>To get around the issue of the voltage dropping below 3.3V I decided to use a voltage detector to detect when the input voltage was getting low and turn the whole circuit off, I used <a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1196831&amp;CMP=i-bf9f-00001000\">these TC54VN</a> detectors to check for an input of at least 4.2V, meaning that my circuit should now provide between 4.2V and ~6V (4x1.5V AA batteries) to the regulator, or nothing. The voltage detectors I got are “Open Drain” which essentially means that when the voltage is above 4.2V, “VOUT” is floating, i.e. does nothing. When the voltage goes below 4.2V VOUT is pulled to ground. I actually expected VOUT to output the input voltage when the input voltage was high enough but it turns out I would need a TC54VC if I wanted that. The Open Drain version worked well enough once we figured it out (I had a lot of help from Adrian McEwen on this one). I’m using a transistor to turn on the voltage regulator. I pass the battery input to VOUT via a resistor and then onto base on the transistor via another resistor, this way the transistor is turned on, until the voltage drops and VOUT is grounded, short-circuiting the voltage meaning it doesn’t get to the transistor.</p><p><a href=\"/uploads/2011/04/IMG_0707.jpg\"><img src=\"/uploads/2011/04/IMG_0707-1024x764.jpg\" alt=\"\" /></a></p><p>The picture above shows the circuit diagram as I was working on it, ignore the Arduino-style pins at the top and bottom. The two circuit diagrams should be just about the same, the higher one was supposed to be clearer. Here’s a fritzing diagram which should hopefully be more useful:</p><p><a href=\"/uploads/2011/04/temp-probe-xbee_schem.png\"><img src=\"/uploads/2011/04/temp-probe-xbee_schem-1024x727.png\" alt=\"\" /></a></p><p>You’ll notice that I’m also running a wire to pin 20 on the XBee, this is A0 and will take an analog read from between the two resistors, they’re acting as a voltage divider which should mean I’ll be able to monitor the battery level and get an idea when I’ll need to change the batteries in advance. It should be possible to calculate, using V=IR, what reading I’ll get as the batteries approach 4.2V.</p><p>This seems like a good time for a bill of parts, so here goes:</p><table>   <tr>   Part   Quantity (for a single probe)  </tr>  <tbody>  <tr>   <td><a href=\"http://www.sparkfun.com/products/8664\">XBee (series 1) with Chip Antenna</a></td>   <td>1</td>   <td><a href=\"http://www.sparkfun.com/datasheets/Wireless/Zigbee/XBee-Datasheet.pdf\">Data-sheet</a></td>  </tr>  <tr>   <td><a href=\"http://www.sparkfun.com/products/8276\">XBee breakout board</a></td>   <td>1</td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1109732&amp;CMP=i-bf9f-00001000\">2mm 10 way headers</a></td>   <td>2</td>   <td><a href=\"http://www.sparkfun.com/products/8272\">Sparkfun link</a></td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1438760&amp;CMP=i-bf9f-00001000\">TMP36 (temperature sensor)</a></td>   <td>1</td>   <td><a href=\"http://www.farnell.com/datasheets/85387.pdf\">Data sheet</a></td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1296588&amp;CMP=i-bf9f-00001000\">MCP1700-3302E/TO (voltage regulator)</a></td>   <td>1</td>   <td><a href=\"http://www.farnell.com/datasheets/47848.pdf\">Data sheet</a></td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=9189530&amp;CMP=i-bf9f-00001000\">3.3 µF capacitors</a></td>   <td>2</td>   <td><a href=\"http://www.farnell.com/datasheets/60276.pdf\">Data sheet</a></td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1196831&amp;CMP=i-bf9f-00001000\">TC54VN voltage detector</a></td>   <td>1</td>   <td><a href=\"http://www.farnell.com/datasheets/32337.pdf\">Data Sheet</a></td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=1611371&amp;CMP=i-bf9f-00001000\">P2N2222AG - NPN Transistor</a></td>   <td>1</td>   <td><a href=\"http://www.farnell.com/datasheets/78775.pdf\">Data Sheet</a></td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/jsp/search/productdetail.jsp?sku=3829571&amp;CMP=i-bf9f-00001000\">6xAA battery pack</a></td>   <td>1</td>  </tr>  <tr>   <td><a href=\"http://uk.farnell.com/multicomp/440005p/battery-connector-pp3-type-1-150mm/dp/1183123\">PP3 battery connector</a></td>   <td>1</td>  </tr> </tbody></table><p>I’ll also mention now that the <a href=\"http://www.ladyada.net/learn/sensors/tmp36.html\">Lady Ada article about TMP36 sensors</a> was also really useful for teaching me how these work.</p><p>So that’s the power circuit and the temperature sensor all connected up to the XBee but you still need to program the XBee so that it’ll do something useful with that data. Again Lady Ada was really useful here, I followed the instructions on the <a href=\"http://www.ladyada.net/make/tweetawatt/\">Tweet-a-Watt</a> which outline how to send current data via XBee. I used essentially the same programming to get my XBee to report the temperature and battery usage data from AD0 and AD4. I also bought the Rough Cut of <a href=\"http://oreilly.com/catalog/9780596807740\">Building Wireless Sensor Networks</a> from O’Reilly. Unfortunately that only covers Series 2 XBees whereas I’m using Series 1, but the sections about how to wire an XBee up to USB for programming and what apps to use on the computer to speak serial to the XBee were really useful.</p><p>To connect the XBee to the computer I actually used an Arduino programmed with an empty sketch (basically <code class=\"language-plaintext highlighter-rouge\">void setup() {} void loop() {}</code>). Pin 2 (DOUT) on the XBee was plugged into Pin 0 (RX) on the Arduino and pin 3 (DIN) on the XBee was plugged into Pin 1 (TX) on the Arduino. In this way I’m basically just piggybacking on the Arduino so that it provides a USB -&gt; Serial interface. I then used the Serial Monitor in the Arduino IDE to send commands to the XBee and monitor the response. There’s more about this in the Tweet-A-Watt article. The program I sent to my probes was the following:</p><figure class=\"highlight\"><pre><code class=\"language-text\" data-lang=\"text\">ATMY=1,SM=4,ST=3,SP=FF,D4=2,D0=2,IT=13,IR=1,ID=1234</code></pre></figure><p>Which broken down means:</p><ul>  <li>    <p>AT - <em>Attention!</em></p>  </li>  <li>    <p>MY=1, - <em>the ID of this unit</em></p>  </li>  <li>    <p>SM=4, - <em>Sleep Mode SM (4 = Cyclic sleep)</em></p>  </li>  <li>    <p>ST=3, - <em>Sleep Time (3 milliseconds after wakeup to go back to sleep)</em></p>  </li>  <li>    <p>SP=FF, - <em>Sleep Period (0xFF - 255 x 10 ms = ~2.5 seconds)</em></p>  </li>  <li>    <p>D4=2, - <em>enabling pin AD4</em></p>  </li>  <li>    <p>D0=2, - <em>enabling pin AD0</em></p>  </li>  <li>    <p>IT=13, - <em>number of samples (0x13 - 19 samples per packet)</em></p>  </li>  <li>    <p>IR=1, - <em>sample rate (1ms between samples)</em></p>  </li>  <li>    <p>ID=1234, - <em>the PAN ID for the network of XBees</em></p>  </li></ul><p>Once that has been sent to the XBee it will go into sleep mode. This will mean that the XBee cannot be re-programmed unless you reset it. I actually haven’t figured out how to do that yet and so can’t modify the program on my XBees! I advise that you make sure you’re ready before sending it. It will sleep for 2550ms and then wake up, perform 19 samples with 1ms delay between each, transmit them and then go back to sleep again.</p><p>Once you’ve sent that to one of your XBees you can then place the module into the temperature sensing circuit and it should start transmitting temperatures. On the base station you would connect an unprogrammed XBee to an Arduino as above and send the following to it, this just sets the PAN ID and the modules own ID (to zero):</p><figure class=\"highlight\"><pre><code class=\"language-text\" data-lang=\"text\">ATMY=0,ID=1234</code></pre></figure><p>Now if you monitor the output on the serial connection you should see data being sent about every 2.5s. You can then use the <a href=\"http://code.google.com/p/xbee-arduino/\">XBee library for Arduino</a> to parse this, or use the code for YAHMS as will be explained later in this series. If you are going to use the XBee library, be aware that the version available for download (0.2.1) actually contains a bug meaning it will give the same output for all pins, use the version in SVN instead which has been fixed.</p><p>Still to come, the relays and the base station, watch this space!</p>",
            "url": "https://blog.johnmckerrell.com/2011/04/20/yahms-temperature-probes/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/04/20/yahms-temperature-probes/",
            
            "tags": ["arduino","tmp36","xbee","yahms","zigbee"],
            
            "date_published": "2011-04-20T15:18:27+01:00",
            "date_modified": "2011-04-20T15:18:27+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/04/18/tasty-tasty-yahms/",
            "title": "Tasty tasty YAHMS",
            "summary": null,
            "content_text": "I’ve mentioned a few times on recent blog posts about the Arduino project I’ve been working on to provide an internet controlled system for my central heating. I’m glad to be able to say I’ve finally got this working, but not only that, I’ve also opted to release the source code so that others can make use of it. The source code comes in two parts, the code to run on your Arduino and the code to run on the server side. I’m releasing both parts as Open Source Software as I realise that I’m not necessarily going to get time to add features that others need and by opening up the source code I can allow more people to get involved. I’ll be running the server side on yahms.net and will be letting anyone sign up to use the site. Right now that’s not hugely useful as new programs can only be added by inserting directly in the database but hopefully I or someone else will get around to knocking up some more UI and an API. I haven’t really mentioned what the site or the system actually does so I’ll give some brief summaries about the system and the hardware and then will be posting full build logs for all pieces of the hardware shortly.A little more about the system in general then. I decided before Christmas that I wanted to be able to control my central heating from the Internet. What made me finally decide to do it was when I realised that my existing controller is simply plugged into a 3-pin socket meaning that all I needed to do was set the existing controller to be on constantly and then find a hardware solution that would allow me to get in between the 3-pin plug and socket to control the system. One of the things that made me decide I should build the system was the spate of cold weather we had. It seemed to come on all of a sudden so there was a number of mornings we’d wake up at 7am and find that because the weather was so cold the heating hadn’t been on for long enough. To solve this I decided I needed some intelligent temperature control that would turn the heating on earlier when we’re having a cold morning. A similar but different problem is when we go on holiday for a few days and come back to a cold house, with the heating controlled from the internet we’ll be able to have the heating fully off while we’re away but make it turn on a few hours before we get home.So, the smallest part of the system is the temperature “probes”. Partly just to experiment with Xbee but also to get an idea for how the house retained heat I decided I wanted to put a few wireless temperature probes around the house. In theory they should be very simple just using an Xbee with a TMP36 temperature sensor feeding into them, in actual fact I’ve ended up with about 10 separate parts, most of which are there to make sure I get a steady regulated power source to the Xbee. Originally I had been hoping to power them from a battery-backed solar panel but in the end I’ve had to go with batteries.To control my hall light I’m using a solid-state relay wired into the power line for the light. I had hoped to be able to make this non-invasive by wiring into the light switch but had difficulty getting the wire through the wall to the switch so ended up having to cut the line and re-connect it in a junction box which I could then wire up to my relay. The light is turned on by short-circuiting the two wires on this line and can be done either by turning my relay on or by using the existing switch. This means you don’t have to use the internet to turn the light on, but once the internet has turned it on you can’t turn it off locally, but that’s not a big deal.To intercept the power to the heating I used an old mechanical timer with all the mechanics removed. This left me with a nice simple device which I only needed to short circuit two connections to turn on the circuit. A simple relay did the job here too and I had enough space left to add in a power module so that I can provide 5v USB power from it too, but more about that in the dedicated post. I can leave the existing heating controls set to “Constant” so that as soon as I turn the socket on, the heating comes on too.Finally, to control the two relays and receive signals from the Xbee modules I put together a simple Arduino shield. It has an Xbee module connected to receive the signals, some wired jacks to send signals to the relays and also a temperature sensor, just “because”. The Arduino also has an Ethernet shield so the software is able to download configuration from yahms.net and turn the relays on and off in response to that config, it can also submit sensor readings back over the connection too.So that’s the general overview, I’ll go into more detail in the next few posts and talk more about the software as well as the hardware and what they’re both capable of.",
            "content_html": "<p>I’ve mentioned a few times on recent blog posts about the Arduino project I’ve been working on to provide an internet controlled system for my central heating. I’m glad to be able to say I’ve finally got this working, but not only that, I’ve also opted to release the source code so that others can make use of it. The source code comes in two parts, the code to run on your Arduino and the code to run on the server side. I’m releasing both parts as Open Source Software as I realise that I’m not necessarily going to get time to add features that others need and by opening up the source code I can allow more people to get involved. I’ll be running the server side on <a href=\"http://www.yahms.net/\">yahms.net</a> and will be letting anyone sign up to use the site. Right now that’s not hugely useful as new programs can only be added by inserting directly in the database but hopefully I or someone else will get around to knocking up some more UI and an API. I haven’t really mentioned what the site or the system actually does so I’ll give some brief summaries about the system and the hardware and then will be posting full build logs for all pieces of the hardware shortly.</p><p><a href=\"http://www.flickr.com/photos/mcknut/5630164077/\"><img src=\"https://farm6.static.flickr.com/5263/5630164077_beef5f7e50.jpg\" alt=\"YAHMS\" /></a></p><p>A little more about the system in general then. I decided before Christmas that I wanted to be able to control my central heating from the Internet. What made me finally decide to do it was when I realised that my existing controller is simply plugged into a 3-pin socket meaning that all I needed to do was set the existing controller to be on constantly and then find a hardware solution that would allow me to get in between the 3-pin plug and socket to control the system. One of the things that made me decide I should build the system was the spate of cold weather we had. It seemed to come on all of a sudden so there was a number of mornings we’d wake up at 7am and find that because the weather was so cold the heating hadn’t been on for long enough. To solve this I decided I needed some intelligent temperature control that would turn the heating on earlier when we’re having a cold morning. A similar but different problem is when we go on holiday for a few days and come back to a cold house, with the heating controlled from the internet we’ll be able to have the heating fully off while we’re away but make it turn on a few hours before we get home.</p><p>So, the smallest part of the system is the temperature “probes”. Partly just to experiment with Xbee but also to get an idea for how the house retained heat I decided I wanted to put a few wireless temperature probes around the house. In theory they should be very simple just using an Xbee with a TMP36 temperature sensor feeding into them, in actual fact I’ve ended up with about 10 separate parts, most of which are there to make sure I get a steady regulated power source to the Xbee. Originally I had been hoping to power them from a battery-backed solar panel but in the end I’ve had to go with batteries.</p><p>To control my hall light I’m using a solid-state relay wired into the power line for the light. I had hoped to be able to make this non-invasive by wiring into the light switch but had difficulty getting the wire through the wall to the switch so ended up having to cut the line and re-connect it in a junction box which I could then wire up to my relay. The light is turned on by short-circuiting the two wires on this line and can be done either by turning my relay on or by using the existing switch. This means you don’t <em>have</em> to use the internet to turn the light on, but once the internet has turned it on you can’t turn it off locally, but that’s not a big deal.</p><p>To intercept the power to the heating I used an old mechanical timer with all the mechanics removed. This left me with a nice simple device which I only needed to short circuit two connections to turn on the circuit. A simple relay did the job here too and I had enough space left to add in a power module so that I can provide 5v USB power from it too, but more about that in the dedicated post. I can leave the existing heating controls set to “Constant” so that as soon as I turn the socket on, the heating comes on too.</p><p>Finally, to control the two relays and receive signals from the Xbee modules I put together a simple Arduino shield. It has an Xbee module connected to receive the signals, some wired jacks to send signals to the relays and also a temperature sensor, just “because”. The Arduino also has an Ethernet shield so the software is able to download configuration from yahms.net and turn the relays on and off in response to that config, it can also submit sensor readings back over the connection too.</p><p>So that’s the general overview, I’ll go into more detail in the next few posts and talk more about the software as well as the hardware and what they’re both capable of.</p>",
            "url": "https://blog.johnmckerrell.com/2011/04/18/tasty-tasty-yahms/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/04/18/tasty-tasty-yahms/",
            
            "tags": ["arduino","yahms"],
            
            "date_published": "2011-04-18T20:07:51+01:00",
            "date_modified": "2011-04-18T20:07:51+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/04/17/big-ios-database-week-145/",
            "title": "Big iOS Database, Week 142 (was 145)",
            "summary": null,
            "content_text": "Another week spent on the Chess Viewer app. One of the features that I’m adding is support for searching within the chess games, specifically of the filenames and the headers that are generally attached to each game. In the original app I was reading all of this information into memory and storing it in a big in-memory data structure of arrays and dictionaries. This made the searching fast but also made it complicated and could result in having very big data structures in memory. To fix this I decided to use Core Data.Core Data is the “Model” part of the Model View Controller paradigm in iOS and is the recommended way to store your data. It’s generally backed by an sqlite database so can be quite quick but as it’s an Object Model can be simple to work with from code without having to use SQL. I ported the code over to use it pretty quickly and then sent a build over to the client to try out. Unfortunately the app crashed for them soon after launching, in fact they couldn’t get it to launch at all. It turned out that as the code was parsing the chess files and building up the Core Data data model it was using excessive amounts of memory. It could also be really slow, some files (specifically The Week in Chess) can hold around a thousand games, each of those games will then have an average of ten headers each meaning you end up with around ten thousand headers to store. This alone causes the parsing to be slow and use memory, but if you have multiple of these files (and TWIC is updated weekly) it could cause real problems. This was mostly a problem on the iPhone 3G but it would be silly to refuse to support it.In the end I decided to use sqlite without going via Apple’s Core Data model. Perhaps there was a way to optimise the existing code but I couldn’t find it in the days I spent on it. Considering the search function was supposed to be a half day task I really needed to move on! Previously I’ve tried using the sqlite functions directly, these are a real pain to work with so it’s fortunate that I came across FMDB quite recently. This is a library that wraps the C functions of sqlite with a nice Objective-C interface making things much easier to work with. Again I managed to port the code over to use this without too much difficulty… I still had to make various optimisations to make sure that the big imports don’t take too long and that the searching would be as fast as possible. It’s “funny” when spending so much time on something like this, it’s only really going to affect people upgrading to the latest version that have big files, as this is when the database will be built initially. When downloading files in the future it shouldn’t be so bad considering there’ll only generally be one file being processed at a time.In case anyone else has issues I thought I’d paste in some snippets (uninteresting bits of code replaced with comments) to show how I ended up doing things:// OPEN THE DATABASE    // All the insert statements are the same so this makes sure// sqlite doesn't have to parse them repeatedly[db setShouldCacheStatements:YES];// This stops sqlite from writing to disk so much, increases the// chance of db corruption but if we die half-way through an// update we'll need to start from scratch anywaysqlite3_exec([db sqliteHandle],    \"PRAGMA synchronous=OFF\", NULL, NULL, NULL);sqlite3_exec([db sqliteHandle],    \"PRAGMA journal_mode=MEMORY\", NULL, NULL, NULL);sqlite3_exec([db sqliteHandle],    \"PRAGMA temp_store=MEMORY\", NULL, NULL, NULL);// Use memory as much as possible, &lt;a href=\"http://www.sqlite.org/pragma.html\"&gt;more on sqlite pragmas here&lt;/a&gt;// I actually tried to make sure I didn't use any autoreleased// objects but there was one I couldn't avoid and could be// some in code I didn't control anyway.// Having my own pool means I can release these periodicallyNSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];// This monitors how many inserts we've doneNSUInteger numUpdates = 0;// Tell the database not to commit the inserts straight away[db beginTransaction];// FOR EACH FILE    // FOR EACH GAME IN THE FILE        // INSERT ROW IN DATABASE FOR FILE        // FOR EACH HEADER IN THE GAME            // INSERT ROW IN DATABASE FOR HEADER            ++numUpdates;            if (memoryWarning || numUpdates &gt; 5000) {                [db commit];                [db beginTransaction];                memoryWarning = NO;                numUpdates = 0;                [pool drain];                pool = [[NSAutoreleasePool alloc] init];            }So what’s happening there is every 5000 inserts for a file we’re committing the transaction to the database and clearing the auto release pool. This way we should hopefully not run out of memory but will run as fast as possible. You’ll notice there’s a memoryWarning flag too, this gets set separately by a notification, so if we get a memory warning before we’ve done 5000 transactions we’ll still commit the transaction and clear the pool to clear out as much as possible.And, finally, more progress on my Arduino control system, I’ve got all the bits working now so that I can control my central heating and hall light from a website. The UI still needs a lot of work but it essentially matches the abilities of the original central heating controller and that’s the minimum I need in the short term. I’ll be putting some blog posts up with build logs soon.",
            "content_html": "<p>Another week spent on the Chess Viewer app. One of the features that I’m adding is support for searching within the chess games, specifically of the filenames and the headers that are generally attached to each game. In the original app I was reading all of this information into memory and storing it in a big in-memory data structure of arrays and dictionaries. This made the searching fast but also made it complicated and could result in having very big data structures in memory. To fix this I decided to use Core Data.</p><p>Core Data is the “Model” part of the Model View Controller paradigm in iOS and is the recommended way to store your data. It’s generally backed by an sqlite database so can be quite quick but as it’s an Object Model can be simple to work with from code without having to use SQL. I ported the code over to use it pretty quickly and then sent a build over to the client to try out. Unfortunately the app crashed for them soon after launching, in fact they couldn’t get it to launch at all. It turned out that as the code was parsing the chess files and building up the Core Data data model it was using excessive amounts of memory. It could also be really slow, some files (specifically <a href=\"http://www.chess.co.uk/twic/twic.html\">The Week in Chess</a>) can hold around a thousand games, each of those games will then have an average of ten headers each meaning you end up with around ten thousand headers to store. This alone causes the parsing to be slow and use memory, but if you have multiple of these files (and TWIC is updated weekly) it could cause real problems. This was mostly a problem on the iPhone 3G but it would be silly to refuse to support it.</p><p>In the end I decided to use sqlite without going via Apple’s Core Data model. Perhaps there was a way to optimise the existing code but I couldn’t find it in the days I spent on it. Considering the search function was supposed to be a half day task I really needed to move on! Previously I’ve tried using the sqlite functions directly, these are a real pain to work with so it’s fortunate that I came across <a href=\"http://github.com/ccgus/fmdb\">FMDB</a> quite recently. This is a library that wraps the C functions of sqlite with a nice Objective-C interface making things much easier to work with. Again I managed to port the code over to use this without too much difficulty… I still had to make various optimisations to make sure that the big imports don’t take too long and that the searching would be as fast as possible. It’s “funny” when spending so much time on something like this, it’s only really going to affect people upgrading to the latest version that have big files, as this is when the database will be built initially. When downloading files in the future it shouldn’t be so bad considering there’ll only generally be one file being processed at a time.</p><p>In case anyone else has issues I thought I’d paste in some snippets (uninteresting bits of code replaced with comments) to show how I ended up doing things:</p><figure class=\"highlight\"><pre><code class=\"language-objective_c\" data-lang=\"objective_c\"><span class=\"c1\">// OPEN THE DATABASE</span>    <span class=\"c1\">// All the insert statements are the same so this makes sure</span><span class=\"c1\">// sqlite doesn't have to parse them repeatedly</span><span class=\"p\">[</span><span class=\"n\">db</span> <span class=\"nf\">setShouldCacheStatements</span><span class=\"p\">:</span><span class=\"nb\">YES</span><span class=\"p\">];</span><span class=\"c1\">// This stops sqlite from writing to disk so much, increases the</span><span class=\"c1\">// chance of db corruption but if we die half-way through an</span><span class=\"c1\">// update we'll need to start from scratch anyway</span><span class=\"n\">sqlite3_exec</span><span class=\"p\">([</span><span class=\"n\">db</span> <span class=\"nf\">sqliteHandle</span><span class=\"p\">],</span>    <span class=\"s\">\"PRAGMA synchronous=OFF\"</span><span class=\"p\">,</span> <span class=\"nb\">NULL</span><span class=\"p\">,</span> <span class=\"nb\">NULL</span><span class=\"p\">,</span> <span class=\"nb\">NULL</span><span class=\"p\">);</span><span class=\"n\">sqlite3_exec</span><span class=\"p\">([</span><span class=\"n\">db</span> <span class=\"nf\">sqliteHandle</span><span class=\"p\">],</span>    <span class=\"s\">\"PRAGMA journal_mode=MEMORY\"</span><span class=\"p\">,</span> <span class=\"nb\">NULL</span><span class=\"p\">,</span> <span class=\"nb\">NULL</span><span class=\"p\">,</span> <span class=\"nb\">NULL</span><span class=\"p\">);</span><span class=\"n\">sqlite3_exec</span><span class=\"p\">([</span><span class=\"n\">db</span> <span class=\"nf\">sqliteHandle</span><span class=\"p\">],</span>    <span class=\"s\">\"PRAGMA temp_store=MEMORY\"</span><span class=\"p\">,</span> <span class=\"nb\">NULL</span><span class=\"p\">,</span> <span class=\"nb\">NULL</span><span class=\"p\">,</span> <span class=\"nb\">NULL</span><span class=\"p\">);</span><span class=\"c1\">// Use memory as much as possible, &lt;a href=\"http://www.sqlite.org/pragma.html\"&gt;more on sqlite pragmas here&lt;/a&gt;</span><span class=\"c1\">// I actually tried to make sure I didn't use any autoreleased</span><span class=\"c1\">// objects but there was one I couldn't avoid and could be</span><span class=\"c1\">// some in code I didn't control anyway.</span><span class=\"c1\">// Having my own pool means I can release these periodically</span><span class=\"n\">NSAutoreleasePool</span> <span class=\"o\">*</span><span class=\"n\">pool</span> <span class=\"o\">=</span> <span class=\"p\">[[</span><span class=\"n\">NSAutoreleasePool</span> <span class=\"nf\">alloc</span><span class=\"p\">]</span> <span class=\"nf\">init</span><span class=\"p\">];</span><span class=\"c1\">// This monitors how many inserts we've done</span><span class=\"n\">NSUInteger</span> <span class=\"n\">numUpdates</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span><span class=\"c1\">// Tell the database not to commit the inserts straight away</span><span class=\"p\">[</span><span class=\"n\">db</span> <span class=\"nf\">beginTransaction</span><span class=\"p\">];</span><span class=\"c1\">// FOR EACH FILE</span>    <span class=\"c1\">// FOR EACH GAME IN THE FILE</span>        <span class=\"c1\">// INSERT ROW IN DATABASE FOR FILE</span>        <span class=\"c1\">// FOR EACH HEADER IN THE GAME</span>            <span class=\"c1\">// INSERT ROW IN DATABASE FOR HEADER</span>            <span class=\"o\">+</span><span class=\"k\">+</span><span class=\"n\">numUpdates</span><span class=\"p\">;</span>            <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">memoryWarning</span> <span class=\"o\">||</span> <span class=\"n\">numUpdates</span> <span class=\"o\">&gt;</span> <span class=\"mi\">5000</span><span class=\"p\">)</span> <span class=\"p\">{</span>                <span class=\"p\">[</span><span class=\"n\">db</span> <span class=\"nf\">commit</span><span class=\"p\">];</span>                <span class=\"p\">[</span><span class=\"n\">db</span> <span class=\"nf\">beginTransaction</span><span class=\"p\">];</span>                <span class=\"n\">memoryWarning</span> <span class=\"o\">=</span> <span class=\"nb\">NO</span><span class=\"p\">;</span>                <span class=\"n\">numUpdates</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span>                <span class=\"p\">[</span><span class=\"n\">pool</span> <span class=\"nf\">drain</span><span class=\"p\">];</span>                <span class=\"n\">pool</span> <span class=\"o\">=</span> <span class=\"p\">[[</span><span class=\"n\">NSAutoreleasePool</span> <span class=\"nf\">alloc</span><span class=\"p\">]</span> <span class=\"nf\">init</span><span class=\"p\">];</span>            <span class=\"p\">}</span></code></pre></figure><p>So what’s happening there is every 5000 inserts for a file we’re committing the transaction to the database and clearing the auto release pool. This way we should hopefully not run out of memory but will run as fast as possible. You’ll notice there’s a memoryWarning flag too, this gets set separately by a notification, so if we get a memory warning before we’ve done 5000 transactions we’ll still commit the transaction and clear the pool to clear out as much as possible.</p><p>And, finally, more progress on my Arduino control system, I’ve got all the bits working now so that I can control my central heating and hall light from a website. The UI still needs a lot of work but it essentially matches the abilities of the original central heating controller and that’s the minimum I need in the short term. I’ll be putting some blog posts up with build logs soon.</p>",
            "url": "https://blog.johnmckerrell.com/2011/04/17/big-ios-database-week-145/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/04/17/big-ios-database-week-145/",
            
            "tags": ["database","weeknotes"],
            
            "date_published": "2011-04-17T13:15:11+01:00",
            "date_modified": "2011-04-17T13:15:11+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/04/08/mkereviewrequester-weeknotes-week-144/",
            "title": "MKEReviewRequester, Weeknotes Week 141 (was 144)",
            "summary": null,
            "content_text": "Spent this week making improvements to the Chess Viewer that I released for Everyman Chess a few weeks ago. It was good to spend some time re-factoring an app that I actually started building about a year ago.Monday was largely spent redoing the code for the “ChessBoardView” to use Core Animation Layers. I had to make some quite fundamental changes so that I could track the movement of the pieces but at the end of it I had a board that shows nice animations as pieces move around and are taken, and also added the ability to flip the board around to see if it from the point of view of the black player.On Tuesday I added a feature to prompt the user of the app to review the app on the app store. Lots of apps have started doing this but I couldn’t find a simple small library to implement this, so I did it myself. The code for MKEReviewRequester is now available on Github, there’s some instructions in the README file but it’s fairly simple. Set some variables when the app launches, call a method every time a significant app action occurs (an ebook is read or a game is played) and then call another method at the point you want to display the alert to users. The code was all based around some code I found on this blog post, I just wrapped it together into a nice simple class.Got lots more done on the app too but have run into a problem with preparing Ad-Hoc builds on my Xcode4 install so annoyingly I can’t show the updates to the client. Need to check whether I can distribute a different app and also try my old laptop, hopefully one of those will work.Today (Friday) I’ve finally managed to get the memory usage on one of my Arduino projects down so that it fits within the 2K of RAM provided. I should hopefully be writing up some build notes on that with more details shortly.",
            "content_html": "<p>Spent this week making improvements to the Chess Viewer that I released for Everyman Chess a few weeks ago. It was good to spend some time re-factoring an app that I actually started building about a year ago.</p><p>Monday was largely spent redoing the code for the “ChessBoardView” to use Core Animation Layers. I had to make some quite fundamental changes so that I could track the movement of the pieces but at the end of it I had a board that shows nice animations as pieces move around and are taken, and also added the ability to flip the board around to see if it from the point of view of the black player.</p><p>On Tuesday I added a feature to prompt the user of the app to review the app on the app store. Lots of apps have started doing this but I couldn’t find a simple small library to implement this, so I did it myself. <a href=\"https://github.com/johnmckerrell/MKEReviewRequester\">The code for MKEReviewRequester is now available on Github</a>, there’s some instructions in the README file but it’s fairly simple. Set some variables when the app launches, call a method every time a significant app action occurs (an ebook is read or a game is played) and then call another method at the point you want to display the alert to users. The code was all based around some code I found <a href=\"http://whiskybiscuit.co.uk/2011/tutorial-review-prompt/\">on this blog post</a>, I just wrapped it together into a nice simple class.</p><p>Got lots more done on the app too but have run into a problem with preparing Ad-Hoc builds on my Xcode4 install so annoyingly I can’t show the updates to the client. Need to check whether I can distribute a different app and also try my old laptop, hopefully one of those will work.</p><p>Today (Friday) I’ve finally managed to get the memory usage on one of my Arduino projects down so that it fits within the 2K of RAM provided. I should hopefully be writing up some build notes on that with more details shortly.</p>",
            "url": "https://blog.johnmckerrell.com/2011/04/08/mkereviewrequester-weeknotes-week-144/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/04/08/mkereviewrequester-weeknotes-week-144/",
            
            
            
            "date_published": "2011-04-08T16:23:55+01:00",
            "date_modified": "2011-04-08T16:23:55+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/02/11/social-media-cafe-liverpool-week-133/",
            "title": "Social Media Cafe Liverpool, Week 133",
            "summary": null,
            "content_text": "I’ve had a busy week this week attending the various Social Media in Liverpool Week events that I wrote about last week. I just wanted to post an update to talk about the Social Media Cafe Liverpool iPhone app that I released last night. Unfortunately I wasn’t able to declare the app live last night but the review went through and I can finally do it, head here to download the app and get lots of information about the great talks we’ve had at Social Media Cafe over the last year. You can find the slides for my Life Cycle of an iPhone App talk here.As I mentioned in my talk, I have made the app available as Open Source Software under the Artistic License 2.0. What this means is that anyone can go away and create apps based on my code. The main requirement is that if you do so then you can’t modify the source code to hide the fact that I was the original creator, but read the license for confirmation on the details.The source code is actually available in two parts. The Social Media Cafe app is quite simple and small and provides an app that will download a feed of information and then pass it on to a “Hierarchy View Controller”. This is part of the “HierarchyApp” which is a separate code base which I developed last year. I’ve also released this as open source under the same license so with both of these available anyone should be able to develop some interesting apps with a minimum of effort. Click the following links for more information:Social Media Cafe iPhone app on GitHubHierarchyApp on GitHubWhile the data within the app can be updated by modifying a simple text file on a server there’s still plenty of features that the app could do with, which will require modifying the source code. It might be nice to have a page of information about the next event, or perhaps a page showing recent twitter traffic. If you have any ideas for features, or you come across bugs, then add them to the smcliv Issues page on GitHub and hopefully I, or anyone else who feels like delving into the code, will add them.If you do use the code then I’d love to hear about it and see what you’ve done, and if you want me to help you develop an app I’d still be happy to get involved.",
            "content_html": "<p>I’ve had a busy week this week attending the various Social Media in Liverpool Week events that I wrote about last week. I just wanted to post an update to talk about the <a href=\"http://is.gd/smclivapp\">Social Media Cafe Liverpool iPhone app</a> that I released last night. <a href=\"http://is.gd/smclivapp\"><img src=\"/uploads/2011/02/smcliv-iphone-154x300.png\" alt=\"\" /></a></p><p>Unfortunately I wasn’t able to declare the app live last night but the review went through and I can finally do it, <a href=\"http://is.gd/smclivapp\">head here to download the app</a> and get lots of information about the great talks we’ve had at Social Media Cafe over the last year. You can <a href=\"http://www.slideshare.net/johnmckerrell/life-cycle-of-an-iphone-app\">find the slides for my Life Cycle of an iPhone App talk here</a>.</p><p>As I mentioned in my talk, I have made the app available as Open Source Software under the Artistic License 2.0. What this means is that anyone can go away and create apps based on my code. The main requirement is that if you do so then you can’t modify the source code to hide the fact that I was the original creator, but read the license for confirmation on the details.</p><p>The source code is actually available in two parts. The Social Media Cafe app is quite simple and small and provides an app that will download a feed of information and then pass it on to a “Hierarchy View Controller”. This is part of the “HierarchyApp” which is a separate code base which I developed last year. I’ve also released this as open source under the same license so with both of these available anyone should be able to develop some interesting apps with a minimum of effort. Click the following links for more information:</p><p><a href=\"http://github.com/johnmckerrell/smcliv\">Social Media Cafe iPhone app on GitHub</a></p><p><a href=\"https://github.com/johnmckerrell/HierarchyApp\">HierarchyApp on GitHub</a></p><p>While the data within the app can be updated by modifying a simple text file on a server there’s still plenty of features that the app could do with, which will require modifying the source code. It might be nice to have a page of information about the next event, or perhaps a page showing recent twitter traffic. If you have any ideas for features, or you come across bugs, then add them to <a href=\"https://github.com/johnmckerrell/smcliv/issues\">the smcliv Issues page on GitHub</a> and hopefully I, or anyone else who feels like delving into the code, will add them.</p><p>If you do use the code then I’d love to hear about it and see what you’ve done, and if you want me to help you develop an app I’d still be happy to get involved.</p>",
            "url": "https://blog.johnmckerrell.com/2011/02/11/social-media-cafe-liverpool-week-133/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/02/11/social-media-cafe-liverpool-week-133/",
            
            "tags": ["iPhone","open source","smcliv","weeknotes"],
            
            "date_published": "2011-02-11T12:11:28+00:00",
            "date_modified": "2011-02-11T12:11:28+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/02/07/general-update-week-132/",
            "title": "General Update - Week 132",
            "summary": null,
            "content_text": "So, what have I been doing since November 27th?  Secret Location Startup  New version of Basic Sat Nav/Basic GPS launched 19th December with audio support and Spanish translations!  “HTML5” and Android version of Examstutor.com apps almost finished!  Bubblino &amp; Friends iPhone app went from idea to submission in less than 24 hours, and is live on the App Store!    CamViewer for Foscam Webcams goes live after a short dev time and gets hundreds of downloads and rave reviews on the App Store!    After over a year “in development” Chess Viewer has gone live offering an advanced viewer for chess e-books popular amongst chess fanatics. Further development is planned including in-app purchase of e-books from Everyman Chess.And all of this has taken me to the point where I’ve had 50 apps live on the app store! Not all of these are live right now as some of the Revise apps were replaced by Examstutor.com apps but I currently have 18 Examstutor.com, 15 Reviseapps.com, Basic Sat Nav, Bubblino &amp; Friends, CamViewer, Chess Viewer, Credit Cards, iFreeThePostcode = 39 apps live right now and another one should be coming this week. Even discounting the carbon copies that’s still 9 separate code-bases, and again doesn’t include the app I completed for 7digital which Apple are unfortunately barring from the store. I’ve been busy and hopefully will continue to be with both client work and my own projects as this year progresses.If you want me to help with a mobile web, or native mobile app, then get in touch by emailing me at john “At” mckerrell “dot” net",
            "content_html": "<p>So, what have I been doing since November 27th?</p><ol>  <li>Secret Location Startup</li>  <li>New version of <a href=\"http://www.reviseapps.com/go/http://itunes.apple.com/app/basic-gps/id344535746?mt=8\">Basic Sat Nav/Basic GPS</a> launched 19th December with audio support and Spanish translations!</li>  <li><a href=\"http://blog.johnmckerrell.com/2011/01/21/working-with-android-addjavascriptinterface/\">“HTML5” and Android</a> version of Examstutor.com apps almost finished!</li>  <li><a href=\"http://www.reviseapps.com/go/http://itunes.apple.com/app/bubblino-friends/id416350773?mt=8\">Bubblino &amp; Friends</a> iPhone app went from idea to submission in less than 24 hours, and is live on the App Store!  <a href=\"http://www.reviseapps.com/go/http://itunes.apple.com/app/bubblino-friends/id416350773?mt=8\"><img src=\"/uploads/2011/02/Bubblino-200x300.png\" alt=\"\" /></a></li>  <li><a href=\"http://www.reviseapps.com/go/http://itunes.apple.com/app/camviewer-for-foscam-webcams/id416551665?mt=8\">CamViewer for Foscam Webcams</a> goes live after a short dev time and gets hundreds of downloads and rave reviews on the App Store!  <a href=\"http://www.reviseapps.com/go/http://itunes.apple.com/app/camviewer-for-foscam-webcams/id416551665?mt=8\"><img src=\"/uploads/2011/02/iPhone-CamPortrait-200x300.png\" alt=\"\" /></a></li>  <li>After over a year “in development” <a href=\"http://www.reviseapps.com/go/http://itunes.apple.com/app/chess-viewer/id410841427?mt=8\">Chess Viewer</a> has gone live offering an advanced viewer for chess e-books popular amongst chess fanatics. Further development is planned including in-app purchase of e-books from <a href=\"http://www.everymanchess.com/\">Everyman Chess</a>.</li></ol><p>And all of this has taken me to the point where I’ve had 50 apps live on the app store! Not all of these are live right now as some of the Revise apps were replaced by Examstutor.com apps but I currently have 18 <a href=\"http://www.examstutor.com/\">Examstutor.com</a>, 15 <a href=\"http://www.reviseapps.com/\">Reviseapps.com</a>, <a href=\"http://www.reviseapps.com/go/http://itunes.apple.com/app/basic-gps/id344535746?mt=8\">Basic Sat Nav</a>, <a href=\"http://www.reviseapps.com/go/http://itunes.apple.com/app/bubblino-friends/id416350773?mt=8\">Bubblino &amp; Friends</a>, <a href=\"http://www.reviseapps.com/go/http://itunes.apple.com/app/camviewer-for-foscam-webcams/id416551665?mt=8\">CamViewer</a>, <a href=\"http://www.reviseapps.com/go/http://itunes.apple.com/app/chess-viewer/id410841427?mt=8\">Chess Viewer</a>, Credit Cards, <a href=\"http://www.reviseapps.com/go/http://itunes.apple.com/app/ifreethepostcode/id296156549?mt=8\">iFreeThePostcode</a> = 39 apps live right now and another one should be coming this week. Even discounting the carbon copies that’s still 9 separate code-bases, and again doesn’t include the app I completed for 7digital which Apple are unfortunately barring from the store. I’ve been busy and hopefully will continue to be with both client work and my own projects as this year progresses.</p><p>If you want me to help with a mobile web, or native mobile app, then get in touch by emailing me at john “At” mckerrell “dot” net</p>",
            "url": "https://blog.johnmckerrell.com/2011/02/07/general-update-week-132/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/02/07/general-update-week-132/",
            
            "tags": ["iPhone","weeknotes"],
            
            "date_published": "2011-02-07T16:31:02+00:00",
            "date_modified": "2011-02-07T16:31:02+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/02/07/social-media-in-liverpool-week/",
            "title": "Social Media in Liverpool Week",
            "summary": null,
            "content_text": "I’ll be posting an update of what I’ve been up to recently soon but I also wanted to write something about what’s happening in the coming week. We’re celebrating “Social Media in Liverpool Week” (we got told off for calling it Social Media Week™(C)®) and also Global Ignite Week with a week of activities in Liverpool. Getting into the spirit of things I’ve agreed to speak at two of them.The first event of the week is Ignite Liverpool tomorrow in the LJMU Art &amp; Design Academy. I was quite disappointed not to be able to speak last year (though I must admit I did enjoy my time on a yacht in the Whitsundays ;-)) so I jumped at the chance to speak this year. I’m going to be giving a talk on “Open Source Software Projects I Have Known”. I’m intending it to be a fairly lighthearted overview of various applications and projects that people should really be aware of and using. There’s lots of other talks lined up so if you’re in the area you should definitely come along. There’s not many tickets left so be quick!On Wednesday there will be a meeting of the Society of Swandeliers, or the Friends of Swan Pedalo. In Autumn John O’Shea of Re-Dock procured a Swan pedalo that was being sold off cheap by Liverpool Biennial organisation. This meeting is of people who have shown interest in working with the pedalo to try to determine what to do with it. We’ve all got lots of ideas but a 6ft fibreglass swan isn’t so easy to move around so it can be quite difficult to arrange activities for it. I’ll be going along and hopefully we’ll all be able to work something out.Thursday is time for another Social Media Cafe Liverpool event, also in the Art &amp; Design Academy. I’ll be giving a talk on the lifecycle of an iPhone app. I’m intending to give an idea of the various stages you go through when building an app and getting it live on the app store. I’ll also have a few surprises during my talk too. There’s also going to be a live skype interview and more besides so head over to the website to sign up for that.Finally on Friday there’s going to be the Social Media Social or “Oh, I follow you on Twitter”. More details on that can be found on the Social Media Cafe Liverpool website but essentially it’s a free party in the Leaf bar on Bold St. Entertainment will be provided (but you’ll need to buy your own drinks!) I’m going to a friend’s birthday party first but should be there later on in the evening.So a busy week ahead, should be fun!",
            "content_html": "<p>I’ll be posting an update of what I’ve been up to recently soon but I also wanted to write something about what’s happening in the coming week. We’re celebrating “Social Media in Liverpool Week” (we got told off for calling it Social Media Week™(C)®) and also <a href=\"http://igniteshow.com/global-ignite-week\">Global Ignite Week</a> with a week of activities in Liverpool. Getting into the spirit of things I’ve agreed to speak at two of them.</p><p>The first event of the week is <a href=\"http://igniteliverpool.defnetmedia.com/\">Ignite Liverpool</a> tomorrow in the LJMU Art &amp; Design Academy. I was quite disappointed not to be able to speak last year (though I must admit I did enjoy my time on a yacht in the Whitsundays ;-)) so I jumped at the chance to speak this year. I’m going to be giving a talk on “Open Source Software Projects I Have Known”. I’m intending it to be a fairly lighthearted overview of various applications and projects that people should really be aware of and using. There’s lots of other talks lined up so if you’re in the area you should definitely come along. There’s not many tickets left so be quick!</p><p>On Wednesday there will be a <a href=\"http://swanpedalo.defnetmedia.com/2011/02/07/this-weds-7pm-the-ranch/\">meeting of the Society of Swandeliers</a>, or the Friends of Swan Pedalo. In Autumn John O’Shea of Re-Dock procured a Swan pedalo that was being sold off cheap by Liverpool Biennial organisation. This meeting is of people who have shown interest in working with the pedalo to try to determine what to do with it. We’ve all got lots of ideas but a 6ft fibreglass swan isn’t so easy to move around so it can be quite difficult to arrange activities for it. I’ll be going along and hopefully we’ll all be able to work something out.</p><p>Thursday is time for another <a href=\"http://socialmediacafeliverpool.wordpress.com/\">Social Media Cafe Liverpool</a> event, also in the Art &amp; Design Academy. I’ll be giving a talk on the lifecycle of an iPhone app. I’m intending to give an idea of the various stages you go through when building an app and getting it live on the app store. I’ll also have a few surprises during my talk too. There’s also going to be a live skype interview and more besides so head over to the website to sign up for that.</p><p>Finally on Friday there’s going to be the Social Media Social or “Oh, I follow you on Twitter”. More details on that can be found on the <a href=\"http://socialmediacafeliverpool.wordpress.com/2011/01/27/download-and-print-the-social-media-in-liverpool-week-poster/\">Social Media Cafe Liverpool</a> website but essentially it’s a free party in the Leaf bar on Bold St. Entertainment will be provided (but you’ll need to buy your own drinks!) I’m going to a friend’s birthday party first but should be there later on in the evening.</p><p>So a busy week ahead, should be fun!</p>",
            "url": "https://blog.johnmckerrell.com/2011/02/07/social-media-in-liverpool-week/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/02/07/social-media-in-liverpool-week/",
            
            "tags": ["iPhone","social media"],
            
            "date_published": "2011-02-07T15:41:39+00:00",
            "date_modified": "2011-02-07T15:41:39+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2011/01/21/working-with-android-addjavascriptinterface/",
            "title": "Working with Android addJavascriptInterface",
            "summary": null,
            "content_text": "I’ve been spending a few days this week trying to get my Examstutor.com apps working on Android. I had already decided to do this using HTML and spent the past two weeks creating a “HTML5” version of the app. I was surprised but pleased about how quickly I managed to complete this, partly due to it always being easier doing something the second time. This HTML5 version uses localStorage a lot to store the test modules and various other bits of data. It’s probably not something that I would actually release as currently it stores too much data in localStorage, but I built it in such a way that I can build plug-ins that work on different devices meaning that I only need to recreate the device specific code for storing and retrieving data and the rest of the code that handles the interface should be the same.Once I got the HTML5 version done I had to begin on the Android app. The app is very basic with a WebView (a WebKit control) taking up the whole screen. I then load the HTML5 app inside there and leave it do the rest. To provide the device specific code I’ve created a Java class with methods that match the plugin interface. I then add an instance of that class to the WebView using addJavascriptInterface. In theory I thought that would be all I’d need to do to get it working, due to a few idiosyncrasies of addJavascriptInterface that wasn’t the case, as I’ll explain in the following few paragraphs.The first issue I found was that the object that is exposed in the JavaScript appears not to act like a normal JavaScript object. The way I had my code arranged there was a global singleton ExamsTutor object and then the plugin would be another singleton called ExamsTutorDevicePlugin. To save having to decide which object’s methods to call, ExamsTutor would copy all the functions from the plugin into itself, as follows:    for( var key in device ) {  obj[key] = device[key];}In that example I’ve already assigned ExamsTutorDevicePlugin to device and obj is going to be the ExamsTutor singleton.After that code I would expect a call like ExamsTutor.someDeviceSpecificMethod to work. Unfortunately I found it wasn’t and when I added some logging statements it turned out that the code was never going into the loop. In the end I decided to add a JavaScript singleton that would wrap the Android object, a little annoying that I need to do this but as you’ll see it ended up being useful later, here’s a snippet from that class:var ExamsTutorDevicePlugin = (function() {var a = ExamsTutorAndroidPlugin;return {    log: function(message) { a.log(message); },    requiresInitialPathway: function() { return a.requiresInitialPathway(); },    showPathwayDialog: function() { a.showPathwayDialog() },    currentPage: function(page) { return a.currentPage(page) },    ...The next issue was the types that could be sent to and returned from the android interface. In my plugin interface I had already arranged to send various JavaScript Objects and Arrays in and out of the functions. After some testing I found that addJavascriptInterface only allows basic data types such as boolean, int and String. Fortunately this is simple enough to fix. I’m already using jQuery inside my web app and have the JSON plugin so I can use $.parseJSON and $.toJSON to make sure that I only pass strings to and from the Java. I was worried that this would result in me having to do lots of packing and unpacking on both sides of the interface but actually on the Java side I will generally just be storing the JSON to files so it shouldn’t be much of an issue. Another snippet from my JavaScript singleton with this in place would be:defaultPathway: function() { return parseJSON(String(a.defaultPathway())) },setDefaultPathway: function(pathway) { a.setDefaultPathway($.toJSON(pathway)) },You might notice in that snippet that I’ve used parseJSON rather than $.parseJSON. This was due to the final issue I’m going to describe here. For some reason the string objects returned by the Android interface don’t seem to react to the typeof operator in the way I might expect, and in the way jQuery’s parseJSON method was expecting. The first thing that $.parseJSON does before parsing is some sanity checking to make sure it has a string:    if ( typeof data !== \"string\" || !data ) {  return null;}For some reason, calling typeof on the strings returned by Android was giving \"object\" and so this check was failing and jQuery was giving up on the parse. Fortunately this was simple enough to handle. I added a local parseJSON method to coerce the json to a string and also to handle the exception that might be fired by jQuery:    function parseJSON(json) {  var data = null;  try {    data = $.parseJSON(json);  } catch(e) {    data = null;  }  return data;}With that I managed to get the app to the point where I can select a Revision Pathway and have it download the information for that pathway and download the test modules from the Internet. There’s still plenty more to be done but as you’ll see from the screenshots it’s not looking bad already.",
            "content_html": "<p>I’ve been spending a few days this week trying to get my Examstutor.com apps working on Android. I had already decided to do this using HTML and spent the past two weeks creating a “HTML5” version of the app. I was surprised but pleased about how quickly I managed to complete this, partly due to it always being easier doing something the second time. This HTML5 version uses localStorage a lot to store the test modules and various other bits of data. It’s probably not something that I would actually release as currently it stores too much data in localStorage, but I built it in such a way that I can build plug-ins that work on different devices meaning that I only need to recreate the device specific code for storing and retrieving data and the rest of the code that handles the interface should be the same.</p><p>Once I got the HTML5 version done I had to begin on the Android app. The app is very basic with a WebView (a WebKit control) taking up the whole screen. I then load the HTML5 app inside there and leave it do the rest. To provide the device specific code I’ve created a Java class with methods that match the plugin interface. I then add an instance of that class to the WebView using addJavascriptInterface. In theory I thought that would be all I’d need to do to get it working, due to a few idiosyncrasies of <code class=\"language-plaintext highlighter-rouge\">addJavascriptInterface</code> that wasn’t the case, as I’ll explain in the following few paragraphs.</p><p>The first issue I found was that the object that is exposed in the JavaScript appears not to act like a normal JavaScript object. The way I had my code arranged there was a global singleton <code class=\"language-plaintext highlighter-rouge\">ExamsTutor</code> object and then the plugin would be another singleton called <code class=\"language-plaintext highlighter-rouge\">ExamsTutorDevicePlugin</code>. To save having to decide which object’s methods to call, <code class=\"language-plaintext highlighter-rouge\">ExamsTutor</code> would copy all the functions from the plugin into itself, as follows:</p><figure class=\"highlight\"><pre><code class=\"language-javascript\" data-lang=\"javascript\">    <span class=\"k\">for</span><span class=\"p\">(</span> <span class=\"kd\">var</span> <span class=\"nx\">key</span> <span class=\"k\">in</span> <span class=\"nx\">device</span> <span class=\"p\">)</span> <span class=\"p\">{</span>  <span class=\"nx\">obj</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nx\">device</span><span class=\"p\">[</span><span class=\"nx\">key</span><span class=\"p\">];</span><span class=\"p\">}</span></code></pre></figure><p>In that example I’ve already assigned <code class=\"language-plaintext highlighter-rouge\">ExamsTutorDevicePlugin</code> to <code class=\"language-plaintext highlighter-rouge\">device</code> and <code class=\"language-plaintext highlighter-rouge\">obj</code> is going to be the <code class=\"language-plaintext highlighter-rouge\">ExamsTutor</code> singleton.</p><p>After that code I would expect a call like <code class=\"language-plaintext highlighter-rouge\">ExamsTutor.someDeviceSpecificMethod</code> to work. Unfortunately I found it wasn’t and when I added some logging statements it turned out that the code was never going into the loop. In the end I decided to add a JavaScript singleton that would wrap the Android object, a little annoying that I need to do this but as you’ll see it ended up being useful later, here’s a snippet from that class:</p><figure class=\"highlight\"><pre><code class=\"language-javascript\" data-lang=\"javascript\"><span class=\"kd\">var</span> <span class=\"nx\">ExamsTutorDevicePlugin</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span><span class=\"kd\">var</span> <span class=\"nx\">a</span> <span class=\"o\">=</span> <span class=\"nx\">ExamsTutorAndroidPlugin</span><span class=\"p\">;</span><span class=\"k\">return</span> <span class=\"p\">{</span>    <span class=\"na\">log</span><span class=\"p\">:</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">message</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"nx\">a</span><span class=\"p\">.</span><span class=\"nf\">log</span><span class=\"p\">(</span><span class=\"nx\">message</span><span class=\"p\">);</span> <span class=\"p\">},</span>    <span class=\"na\">requiresInitialPathway</span><span class=\"p\">:</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span> <span class=\"k\">return</span> <span class=\"nx\">a</span><span class=\"p\">.</span><span class=\"nf\">requiresInitialPathway</span><span class=\"p\">();</span> <span class=\"p\">},</span>    <span class=\"na\">showPathwayDialog</span><span class=\"p\">:</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span> <span class=\"nx\">a</span><span class=\"p\">.</span><span class=\"nf\">showPathwayDialog</span><span class=\"p\">()</span> <span class=\"p\">},</span>    <span class=\"na\">currentPage</span><span class=\"p\">:</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">page</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"k\">return</span> <span class=\"nx\">a</span><span class=\"p\">.</span><span class=\"nf\">currentPage</span><span class=\"p\">(</span><span class=\"nx\">page</span><span class=\"p\">)</span> <span class=\"p\">},</span>    <span class=\"p\">...</span></code></pre></figure><p>The next issue was the types that could be sent to and returned from the android interface. In my plugin interface I had already arranged to send various JavaScript Objects and Arrays in and out of the functions. After some testing I found that <code class=\"language-plaintext highlighter-rouge\">addJavascriptInterface</code> only allows basic data types such as boolean, int and String. Fortunately this is simple enough to fix. I’m already using jQuery inside my web app and have the JSON plugin so I can use <code class=\"language-plaintext highlighter-rouge\">$.parseJSON</code> and <code class=\"language-plaintext highlighter-rouge\">$.toJSON</code> to make sure that I only pass strings to and from the Java. I was worried that this would result in me having to do lots of packing and unpacking on both sides of the interface but actually on the Java side I will generally just be storing the JSON to files so it shouldn’t be much of an issue. Another snippet from my JavaScript singleton with this in place would be:</p><figure class=\"highlight\"><pre><code class=\"language-javascript\" data-lang=\"javascript\"><span class=\"nx\">defaultPathway</span><span class=\"p\">:</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span> <span class=\"k\">return</span> <span class=\"nf\">parseJSON</span><span class=\"p\">(</span><span class=\"nc\">String</span><span class=\"p\">(</span><span class=\"nx\">a</span><span class=\"p\">.</span><span class=\"nf\">defaultPathway</span><span class=\"p\">()))</span> <span class=\"p\">},</span><span class=\"nx\">setDefaultPathway</span><span class=\"p\">:</span> <span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">pathway</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"nx\">a</span><span class=\"p\">.</span><span class=\"nf\">setDefaultPathway</span><span class=\"p\">(</span><span class=\"nx\">$</span><span class=\"p\">.</span><span class=\"nf\">toJSON</span><span class=\"p\">(</span><span class=\"nx\">pathway</span><span class=\"p\">))</span> <span class=\"p\">},</span></code></pre></figure><p>You might notice in that snippet that I’ve used <code class=\"language-plaintext highlighter-rouge\">parseJSON</code> rather than <code class=\"language-plaintext highlighter-rouge\">$.parseJSON</code>. This was due to the final issue I’m going to describe here. For some reason the string objects returned by the Android interface don’t seem to react to the <code class=\"language-plaintext highlighter-rouge\">typeof</code> operator in the way I might expect, and in the way jQuery’s <code class=\"language-plaintext highlighter-rouge\">parseJSON</code> method was expecting. The first thing that <code class=\"language-plaintext highlighter-rouge\">$.parseJSON</code> does before parsing is some sanity checking to make sure it has a string:</p><figure class=\"highlight\"><pre><code class=\"language-javascript\" data-lang=\"javascript\">    <span class=\"k\">if </span><span class=\"p\">(</span> <span class=\"k\">typeof</span> <span class=\"nx\">data</span> <span class=\"o\">!==</span> <span class=\"dl\">\"</span><span class=\"s2\">string</span><span class=\"dl\">\"</span> <span class=\"o\">||</span> <span class=\"o\">!</span><span class=\"nx\">data</span> <span class=\"p\">)</span> <span class=\"p\">{</span>  <span class=\"k\">return</span> <span class=\"kc\">null</span><span class=\"p\">;</span><span class=\"p\">}</span></code></pre></figure><p>For some reason, calling <code class=\"language-plaintext highlighter-rouge\">typeof</code> on the strings returned by Android was giving <code class=\"language-plaintext highlighter-rouge\">\"object\"</code> and so this check was failing and jQuery was giving up on the parse. Fortunately this was simple enough to handle. I added a local parseJSON method to coerce the json to a string and also to handle the exception that might be fired by jQuery:</p><figure class=\"highlight\"><pre><code class=\"language-javascript\" data-lang=\"javascript\">    <span class=\"kd\">function</span> <span class=\"nf\">parseJSON</span><span class=\"p\">(</span><span class=\"nx\">json</span><span class=\"p\">)</span> <span class=\"p\">{</span>  <span class=\"kd\">var</span> <span class=\"nx\">data</span> <span class=\"o\">=</span> <span class=\"kc\">null</span><span class=\"p\">;</span>  <span class=\"k\">try</span> <span class=\"p\">{</span>    <span class=\"nx\">data</span> <span class=\"o\">=</span> <span class=\"nx\">$</span><span class=\"p\">.</span><span class=\"nf\">parseJSON</span><span class=\"p\">(</span><span class=\"nx\">json</span><span class=\"p\">);</span>  <span class=\"p\">}</span> <span class=\"k\">catch</span><span class=\"p\">(</span><span class=\"nx\">e</span><span class=\"p\">)</span> <span class=\"p\">{</span>    <span class=\"nx\">data</span> <span class=\"o\">=</span> <span class=\"kc\">null</span><span class=\"p\">;</span>  <span class=\"p\">}</span>  <span class=\"k\">return</span> <span class=\"nx\">data</span><span class=\"p\">;</span><span class=\"p\">}</span></code></pre></figure><p>With that I managed to get the app to the point where I can select a Revision Pathway and have it download the information for that pathway and download the test modules from the Internet. There’s still plenty more to be done but as you’ll see from the screenshots it’s not looking bad already.</p><p><a href=\"/uploads/2011/01/android-title.png\"><img src=\"/uploads/2011/01/android-title.png\" alt=\"\" /></a></p><p><a href=\"/uploads/2011/01/android-select-pathway.png\"><img src=\"/uploads/2011/01/android-select-pathway.png\" alt=\"\" /></a></p>",
            "url": "https://blog.johnmckerrell.com/2011/01/21/working-with-android-addjavascriptinterface/",
            
            "external_url": "https://blog.johnmckerrell.com/2011/01/21/working-with-android-addjavascriptinterface/",
            
            "tags": ["android","fail","java","javascript","webview"],
            
            "date_published": "2011-01-21T11:00:04+00:00",
            "date_modified": "2011-01-21T11:00:04+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2010/11/27/47-live-apps-week-122/",
            "title": "47 Live Apps, Week 122",
            "summary": null,
            "content_text": "Last week I mentioned that we’d got the examstutor.com apps finished and submitted. This week they went live. Apple approved them all on Tuesday evening at which point they moved into the “Processing for App Store” state. Unfortunately it then took about 24 hours for all the apps to get through this stage as 6 of them ended up sitting there for ages. We finally got everything sorted out and put the apps live on Wednesday night. The apps have started selling straight away which is a great relief though not a huge surprise as the old apps were still selling ok. This is the first time in a while that I’ve had a free app on the store that I really care about the sales of so it’s interesting to see how the “Login” versions are doing. Currently they’re “outselling” the paid-for apps by way over 10 times but this isn’t a huge surprise. It’s good to see that people are interested though and hopefully some of those will convert to sales. Examstutor.com is now featuring the apps on the homepage and has a good set of pages describing the apps so it’s no surprise to learn that existing subscribers are already downloading the free apps and logging into them. If you want to see more information then take a look at the iPhone apps section on Examstutor.comGetting these 18 apps live actually took me to 47 separate apps live on the app store, which I like to think - even if some of the apps are just different content - is a pretty good number. Because the Examstutor.com apps are intended to replace the old “Revise” apps I have now taken the A-level versions of those down but I’m still at 36 live apps. 17 of my own (3 not available in the UK), 18 examstutor.com apps and one Credit Cards app I did for Moneyextra.com. Many of these may be repeated but if we ignore the repetitions that’s 5 different apps I’ve got live on the store now and 3 others that are completed but waiting to go live for various reasons. Quite happy with my portfolio and hope I get to continue building interesting apps in the new year.A quick update on my clock. I ended up deciding to bolt the motor onto the mechanism rather than using glue again. After various problems including broken drill bits I managed to get it secured and turning nicely. Unfortunately when I tried to get it working with the software it stopped working again. I’m now not sure if there’s a problem with my circuit board or somehow there’s a new problem in the software. I’ve had to leave it alone for a while though as I have other things to work on but hopefully I’ll get it going eventually.I’ve also been working on a brand new start-up idea that someone came to me with a few months ago. I’ll be doing the bulk of the technical work including a Ruby on Rails back-end and supporting mobile apps. I can’t really go into too much detail about it right now but it’s hopefully going to be an interesting return to the location space for me. Watch this space for more info as things progress on that.",
            "content_html": "<p><a href=\"http://www.examstutor.com/resources/apprevision/index.php\"><img src=\"/uploads/2010/11/new-noteworthy-examstutor.png\" alt=\"\" /></a></p><p>Last week I mentioned that we’d got the examstutor.com apps finished and submitted. This week they went live. Apple approved them all on Tuesday evening at which point they moved into the “Processing for App Store” state. Unfortunately it then took about 24 hours for all the apps to get through this stage as 6 of them ended up sitting there for ages. We finally got everything sorted out and put the apps live on Wednesday night. The apps have started selling straight away which is a great relief though not a huge surprise as the old apps were still selling ok. This is the first time in a while that I’ve had a free app on the store that I really care about the sales of so it’s interesting to see how the “Login” versions are doing. Currently they’re “outselling” the paid-for apps by way over 10 times but this isn’t a huge surprise. It’s good to see that people are interested though and hopefully some of those will convert to sales. Examstutor.com is now featuring the apps on the homepage and has a good set of pages describing the apps so it’s no surprise to learn that existing subscribers are already downloading the free apps and logging into them. If you want to see more information then take a look at <a href=\"http://www.examstutor.com/resources/apprevision/index.php\">the iPhone apps section on Examstutor.com</a></p><p>Getting these 18 apps live actually took me to 47 separate apps live on the app store, which I like to think - even if some of the apps are just different content - is a pretty good number. Because the Examstutor.com apps are intended to replace the old “Revise” apps I have now taken the A-level versions of those down but I’m still at 36 live apps. <a href=\"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewArtistSeeAll?dkId=11&amp;ids=296156552&amp;softwareType=iPhone\">17 of my own</a> (3 not available in the UK), <a href=\"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewArtistSeeAll?dkId=11&amp;ids=405050480&amp;softwareType=iPhone\">18 examstutor.com apps</a> and one <a href=\"http://itunes.apple.com/gb/app/credit-cards/id339158832?mt=8\">Credit Cards app I did for Moneyextra.com</a>. Many of these may be repeated but if we ignore the repetitions that’s 5 different apps I’ve got live on the store now and 3 others that are completed but waiting to go live for various reasons. Quite happy with my portfolio and hope I get to continue building interesting apps in the new year.</p><p>A quick update on my clock. I ended up deciding to bolt the motor onto the mechanism rather than using glue again. After various problems including broken drill bits I managed to get it secured and turning nicely. Unfortunately when I tried to get it working with the software it stopped working again. I’m now not sure if there’s a problem with my circuit board or somehow there’s a new problem in the software. I’ve had to leave it alone for a while though as I have other things to work on but hopefully I’ll get it going eventually.</p><p>I’ve also been working on a brand new start-up idea that someone came to me with a few months ago. I’ll be doing the bulk of the technical work including a Ruby on Rails back-end and supporting mobile apps. I can’t really go into too much detail about it right now but it’s hopefully going to be an interesting return to the location space for me. Watch this space for more info as things progress on that.</p>",
            "url": "https://blog.johnmckerrell.com/2010/11/27/47-live-apps-week-122/",
            
            "external_url": "https://blog.johnmckerrell.com/2010/11/27/47-live-apps-week-122/",
            
            "tags": ["education","iPhone","weeknotes"],
            
            "date_published": "2010-11-27T16:06:52+00:00",
            "date_modified": "2010-11-27T16:06:52+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2010/11/22/apps-and-clocks-week-121-120-119/",
            "title": "Apps and Clocks - Week 121 (& 120 & 119)",
            "summary": null,
            "content_text": " So these weeknotes are rapidly, or rather slowly, becoming “monthnotes”. The past few weeks have seen a few interesting things happen though so I thought I’d get another post up. Last week saw the completion of version 1.0 of the Examstutor iPhone apps. We managed to get the content for all of the 9 subjects we were hoping to support finished and so submitted 18 apps! We’re now just waiting to see what Apple will say, hopefully they’ll go straight through without any rejections but you can never be too sure. We’re submitting two apps per subject. One is quite simply a paid-for app, you pay your money and you get access to hundreds of questions on your subject. The other will be a free app in the store but is intended to be used by schools and colleges (and, in fact, individuals) who have signed up with examstutor.com for use of their online and mobile service. On downloading the free app they will be prompted for a username and password, when they enter this they will get full access to all the content “free”. We’ve included a few tests (generally around 20 questions) for people to use on the free app though so that if they download it by accident they still get to try it out and can then decide to upgrade if they want.Last week I also managed to get the final few issues sorted out with my chess app, it’s looking better and hopefully I’ll be able to submit to the store pretty soon.I also got most of the work done adding features to the Ruby on Rails site I mentioned in my last blog post. I needed to generate PDF invoices for a selection of addresses and services in the database and managed to get the work done pretty quickly. This was the whole point of converting from the awful PHP to a new codebase but I was still surprised by how quickly I got it done. I mainly need to make some changes to the PDF document to better match what the client wants and then let them try the system out and see what they think. I’ve used Prawn for the PDF generation and have been quite happy with it finding it pretty easy to use.Final thing to mention is my location clock that has been quite popular on this blog previously. I originally built it at Howduino Liverpool in May 2009 - around 18 months ago. It has sat around with barely any updates since then and so was still made up of a big messy bundle of wires.With the second Liverpool Howduino event coming up I decided I really had to get around to soldering this up, and I wanted to get it done before the event so that I could play with something else on the day (Xbee modules, lasers and a second four handed clock powered by servos were all on my list). Leaving it to the last minute I finally got started on building a circuit board on Thursday and did manage to get it finished off on Friday. Unfortunately I had a few issues with it, various connections connected that shouldn’t have been, and others that should have been were not. I then found that for some reason the software that had been working fine before had stopped working too. Fortunately I finally managed to get it all working on Saturday so now have a fully working circuit board and software.So why am I not happy now? When I came into the office this morning I picked up the clock and started looking to see if I could get a chime to fit in the casing and where would be best to fit the arduino and cut holes for the ethernet, USB and power ports. I brushed past the motor and it wobbled, I thought “hmm, that seemed loose…. OMG, THAT’S LOOSE!!” After something like a year of being firmly stuck on by Araldite the stepper motor has now detached itself from the mechanism so my clock is still not working. I’m going to go out at lunchtime and see what glue I can find that might be able to stick a metal motor onto a brass mechanism, or possibly try to think of an alternative!",
            "content_html": "<p><a href=\"/uploads/2010/11/examstutor-app-icons.png\"><img src=\"/uploads/2010/11/examstutor-app-icons-154x300.png\" alt=\"\" /></a> So these weeknotes are rapidly, or rather slowly, becoming “monthnotes”. The past few weeks have seen a few interesting things happen though so I thought I’d get another post up. Last week saw the completion of version 1.0 of the Examstutor iPhone apps. We managed to get the content for all of the 9 subjects we were hoping to support finished and so submitted 18 apps! We’re now just waiting to see what Apple will say, hopefully they’ll go straight through without any rejections but you can never be too sure. We’re submitting two apps per subject. One is quite simply a paid-for app, you pay your money and you get access to hundreds of questions on your subject. The other will be a free app in the store but is intended to be used by schools and colleges (and, in fact, individuals) who have signed up with examstutor.com for use of their online and mobile service. On downloading the free app they will be prompted for a username and password, when they enter this they will get full access to all the content “free”. We’ve included a few tests (generally around 20 questions) for people to use on the free app though so that if they download it by accident they still get to try it out and can then decide to upgrade if they want.</p><p>Last week I also managed to get the final few issues sorted out with my chess app, it’s looking better and hopefully I’ll be able to submit to the store pretty soon.</p><p>I also got most of the work done adding features to the Ruby on Rails site I mentioned in my last blog post. I needed to generate PDF invoices for a selection of addresses and services in the database and managed to get the work done pretty quickly. This was the whole point of converting from the awful PHP to a new codebase but I was still surprised by how quickly I got it done. I mainly need to make some changes to the PDF document to better match what the client wants and then let them try the system out and see what they think. I’ve used <a href=\"http://prawn.majesticseacreature.com/\">Prawn</a> for the PDF generation and have been quite happy with it finding it pretty easy to use.</p><p>Final thing to mention is my location clock that has been quite popular on this blog previously. I originally built it at <a href=\"http://www.howduino.com/\">Howduino</a> Liverpool in May 2009 - around 18 months ago. It has sat around with barely any updates since then and so was still made up of a big messy bundle of wires.</p><p><a href=\"/uploads/2010/11/IMG_0385.jpg\"><img src=\"/uploads/2010/11/IMG_0385-224x300.jpg\" alt=\"\" /></a></p><p>With the second Liverpool Howduino event coming up I decided I really had to get around to soldering this up, and I wanted to get it done before the event so that I could play with something else on the day (Xbee modules, lasers and a second four handed clock powered by servos were all on my list). Leaving it to the last minute I finally got started on building a circuit board on Thursday and did manage to get it finished off on Friday. Unfortunately I had a few issues with it, various connections connected that shouldn’t have been, and others that should have been were not. I then found that for some reason the software that had been working fine before had stopped working too. Fortunately I finally managed to get it all working on Saturday so now have a fully working circuit board and software.</p><p><a href=\"/uploads/2010/11/IMG_0391.jpg\"><img src=\"/uploads/2010/11/IMG_0391-224x300.jpg\" alt=\"\" /></a></p><p>So why am I not happy now? When I came into the office this morning I picked up the clock and started looking to see if I could get a chime to fit in the casing and where would be best to fit the arduino and cut holes for the ethernet, USB and power ports. I brushed past the motor and it wobbled, I thought “hmm, that seemed loose…. OMG, THAT’S LOOSE!!” After something like a year of being firmly stuck on by Araldite the stepper motor has now detached itself from the mechanism so my clock is still not working. I’m going to go out at lunchtime and see what glue I can find that might be able to stick a metal motor onto a brass mechanism, or possibly try to think of an alternative!</p>",
            "url": "https://blog.johnmckerrell.com/2010/11/22/apps-and-clocks-week-121-120-119/",
            
            "external_url": "https://blog.johnmckerrell.com/2010/11/22/apps-and-clocks-week-121-120-119/",
            
            "tags": ["arduino","clock","howduino","iPhone","weasley","weeknotes"],
            
            "date_published": "2010-11-22T10:36:57+00:00",
            "date_modified": "2010-11-22T10:36:57+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2010/11/02/catchup-week-118/",
            "title": "Catchup - Week 118",
            "summary": null,
            "content_text": "Wow, it’s been a while hasn’t it? I’ve been working hard the whole time so just not had time. Thought I should get a quick update out as some interesting things are happening. The app I worked on back in July was for 7digital, a leading online media and music store. They’ve been talking about the app recently and announcing their mobile strategy. Unfortunately Apple have not allowed it into the store but we’re hopeful that it will get in eventually.The revision apps I’ve been working on in the past few months are changing… I’m now working with ExamsTutor to build a bigger suite of apps selling to schools and individuals. This is great as it saves me a lot of work on the server side (even if it does mean my existing server-side stuff is now redundant) and also means I’ll have an established conduit to schools.The chess app I was working on way-back-when is nearing completion and may be out by Christmas!I’ve also been working on a project to rebuild a really simple PHP app with Ruby on Rails. The original system was very simple, essentially giving an admin interface to 4 tables, but was so badly written that adding any features was a complete pain. The migration to Rails hasn’t taken too long (though slightly longer than I expected really) and is now complete meaning I can begin adding some new features to the system.I’ve started working with someone on a new location start-up, can’t say too much but hoping it’s going to be big and will be a good reintroduction into the geo-world for me.We’re also still enjoying the office and have now achieved a full 6 days since the last explosion!",
            "content_html": "<p>Wow, it’s been a while hasn’t it? I’ve been working hard the whole time so just not had time. Thought I should get a quick update out as some interesting things are happening.</p><p><img src=\"/uploads/2010/11/iPhone-app.jpg\" alt=\"\" /> The app I worked on back in July was for <a href=\"http://www.7digital.com/\">7digital</a>, a leading online media and music store. They’ve been <a href=\"http://about.7digital.net/7digital-Event-19th-October-2010-London\">talking about the app recently and announcing their mobile strategy</a>. Unfortunately Apple have not allowed it into the store but we’re hopeful that it will get in eventually.</p><p>The revision apps I’ve been working on in the past few months are changing… I’m now working with <a href=\"http://www.examstutor.com/\">ExamsTutor</a> to build a bigger suite of apps selling to schools and individuals. This is great as it saves me a lot of work on the server side (even if it does mean my existing server-side stuff is now redundant) and also means I’ll have an established conduit to schools.</p><p>The chess app I was working on way-back-when is nearing completion and may be out by Christmas!</p><p>I’ve also been working on a project to rebuild a really simple PHP app with Ruby on Rails. The original system was very simple, essentially giving an admin interface to 4 tables, but was so badly written that adding any features was a complete pain. The migration to Rails hasn’t taken too long (though slightly longer than I expected really) and is now complete meaning I can begin adding some new features to the system.</p><p>I’ve started working with someone on a new location start-up, can’t say too much but hoping it’s going to be big and will be a good reintroduction into the geo-world for me.</p><p>We’re also still enjoying the office and have now achieved a full 6 days since the last explosion!</p><p><img src=\"/assets/2010-11-02.jpg\" alt=\"\" /></p>",
            "url": "https://blog.johnmckerrell.com/2010/11/02/catchup-week-118/",
            
            "external_url": "https://blog.johnmckerrell.com/2010/11/02/catchup-week-118/",
            
            "tags": ["7digital","iPhone","weeknotes"],
            
            "date_published": "2010-11-02T18:28:35+00:00",
            "date_modified": "2010-11-02T18:28:35+00:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2010/09/29/quick-notes-for-week-113/",
            "title": "Quick notes for Week 113",
            "summary": null,
            "content_text": "Just a quick one so that I’m not missing a week out. Last week I finally started developing the new iPhone revision apps. Development went well and progressed really quickly.I also started planning for Howduino which is going to be returning to Liverpool (at long last!) on the 20th and 21st November. Howduino is a hardware hacking event inspired by the Arduino platform but encapsulating many other aspects of hardware hacking and “Internet of Things”.I have a few ideas for what I want to work on, I’d like to do a new more capable version of my clock - ideally with more hands that are individually controllable. I’m also hoping to have a look at building a laser projector. Potentially for both ideas I’m going to need stepper motors so I put a request out on Freecycle/Freegle Liverpool requesting “broken printers”. I ended up getting 5 in the end. “Unfortunately” two of them seem to work fine so we’ve adopted them as office printers but the others will be taken apart for parts, I also managed to find an old SCSI scanner of my own to disassemble too as you can see in the photo above!",
            "content_html": "<p>Just a quick one so that I’m not missing a week out. Last week I finally started developing the new iPhone revision apps. Development went well and progressed really quickly.</p><p><a href=\"http://www.flickr.com/photos/mcknut/5036378734/\"><img src=\"https://farm5.static.flickr.com/4132/5036378734_df7e4223e2.jpg\" alt=\"Printers and Scanners awaiting disassembly\" /></a></p><p>I also started planning for <a href=\"http://www.howduino.com/\">Howduino</a> which is going to be returning to Liverpool (at long last!) on the 20th and 21st November. Howduino is a hardware hacking event inspired by the <a href=\"http://arduino.cc/\">Arduino</a> platform but encapsulating many other aspects of hardware hacking and “Internet of Things”.</p><p>I have a few ideas for what I want to work on, I’d like to do a new more capable version of my clock - ideally with more hands that are individually controllable. I’m also hoping to have a look at building a laser projector. Potentially for both ideas I’m going to need stepper motors so I put a request out on Freecycle/Freegle Liverpool requesting “broken printers”. I ended up getting 5 in the end. “Unfortunately” two of them seem to work fine so we’ve adopted them as office printers but the others will be taken apart for parts, I also managed to find an old SCSI scanner of my own to disassemble too as you can see in the photo above!</p>",
            "url": "https://blog.johnmckerrell.com/2010/09/29/quick-notes-for-week-113/",
            
            "external_url": "https://blog.johnmckerrell.com/2010/09/29/quick-notes-for-week-113/",
            
            
            
            "date_published": "2010-09-29T15:02:07+01:00",
            "date_modified": "2010-09-29T15:02:07+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        },
    
        {
            "id": "https://blog.johnmckerrell.com/2010/09/19/weeknotes-week-112/",
            "title": "Weeknotes Week 112",
            "summary": null,
            "content_text": "A pretty uneventful week this week. I’ve been away for the previous two weeks so this week was about settling back into work. Fortunately while I was away I had access to email so didn’t have the usual half day spent catching up on email (that was spent in the hotel bar when the midday sun was just that little bit too hot).My main focus (again, see the previous week notes) was to get the admin interfaces for the revision app finished. I didn’t quite get them done before I went away but did manage to get them finished off by Tuesday. I also had to port the existing web site from PHP to Ruby. Not a particularly big job as the existing web site only consisted of two pages but I still wanted to make sure I got it right, part of the existing site was the redirects to iTunes which supposedly earn an extra few percent of any sales so they needed to work. Once I’d got these bits done and properly tested I had the big “go live” on Wednesday. As seems to be fairly usual with a rails project I found that when I went to put it live on my server, the server’s version of rails didn’t match my laptop’s. After plenty of faffing though I managed to get the new www.reviseapps.com live and make sure the existing two rails sites (OpenStreetView and my app store positions app) continued to work.Thursday and Friday were spent designing the new iPhone app. I managed to get a good way through this and have documented what is going into this Milestone 2. I’ve even got the iPhone app project created and added to git so hopefully I’ll be able to hit the ground running with some coding next week. I’ve actually given myself a deadline for Milestone 2 (which is iPhone app v2) of next Friday. I did this with the previous milestone which ended up taking 3 weeks instead of 3 days too so we’ll see how well that works but I’m hoping things will go a bit faster this time.Next week will therefore be mainly spent trying to get this iPhone app built and hopefully sourcing some new equipment for the new office!",
            "content_html": "<p><a href=\"http://www.flickr.com/photos/mcknut/4992883077/\"><img src=\"https://farm5.static.flickr.com/4151/4992883077_53796059c2.jpg\" alt=\"Knidos\" /></a></p><p>A pretty uneventful week this week. I’ve been away for the previous two weeks so this week was about settling back into work. Fortunately while I was away I had access to email so didn’t have the usual half day spent catching up on email (that was spent in the hotel bar when the midday sun was just that little bit too hot).</p><p>My main focus (again, see the previous week notes) was to get the admin interfaces for the revision app finished. I didn’t quite get them done before I went away but did manage to get them finished off by Tuesday. I also had to port the existing web site from PHP to Ruby. Not a particularly big job as the existing web site only consisted of two pages but I still wanted to make sure I got it right, part of the existing site was the redirects to iTunes which supposedly earn an extra few percent of any sales so they needed to work. Once I’d got these bits done and properly tested I had the big “go live” on Wednesday. As seems to be fairly usual with a rails project I found that when I went to put it live on my server, the server’s version of rails didn’t match my laptop’s. After plenty of faffing though I managed to get the new <a href=\"http://www.reviseapps.com/\">www.reviseapps.com</a> live and make sure the existing two rails sites (<a href=\"http://openstreetview.org\">OpenStreetView</a> and my app store positions app) continued to work.</p><p>Thursday and Friday were spent designing the new iPhone app. I managed to get a good way through this and have documented what is going into this Milestone 2. I’ve even got the iPhone app project created and added to git so hopefully I’ll be able to hit the ground running with some coding next week. I’ve actually given myself a deadline for Milestone 2 (which is iPhone app v2) of next Friday. I did this with the previous milestone which ended up taking 3 weeks instead of 3 days too so we’ll see how well that works but I’m hoping things will go a bit faster this time.</p><p>Next week will therefore be mainly spent trying to get this iPhone app built and hopefully sourcing some new equipment for the new office!</p>",
            "url": "https://blog.johnmckerrell.com/2010/09/19/weeknotes-week-112/",
            
            "external_url": "https://blog.johnmckerrell.com/2010/09/19/weeknotes-week-112/",
            
            
            
            "date_published": "2010-09-19T09:48:44+01:00",
            "date_modified": "2010-09-19T09:48:44+01:00",
            "author": {
                "name": "john-mckerrell"
            }
        }
    
    ]
}
