27 November 2014

Only Connect Missing Vowels Game

PublishedActual
Birmingham New Street 06:10 06:13
London Euston 07:34 07:40

On a recent edition of Only Connect Series 10, Episode 12: Coders vs. Romantics there was a team called ‘Coders’ whose team members were described such:

  • Richard, a software engineer…
  • Zoe, a managing director…
  • Captain, David, a software developer…

Victoria Coren Mitchell then continued with the initial interchange

VCM: "United by a soft spot for software, they are the Coders. You lost to the Gamesmasters in your first heat. Have you developed some software to make sure that you win this one?"
David: "We did try to find some software online to see if we could win, but the only missing vowels apps out there are only suitable for three-year-olds.

"If the words like 'pig' and 'hat' come up, I think we will be sorted."

Now, I found it ironic that they are called coders, they have a self professed soft spot for software and there is an engineer and developer on the team yet they looked for missing vowel games? This triggered the following conversation between my wife and me

Me: "If they are coders why don't they just write a program to test themselves"
Wife: "yeah... can that be done"
Me: "oh yeah, it'd be super easy to do the missing vowels game"
Wife: "can you write one?..."

I should add at this point that my wife’s favourite part of the show is the missing vowels round, her opinion of OC is that it’d be great if the whole show was missing vowels. I’d just told her that to create that game would be super easy and she set me a challenge.

So, here is the discussion of the result :)

Design

The main premise of the missing vowels game is that a word is presented on screen with all the vowels removed, if the word contains spaces then they are relocated within the answer for example:

FRD = FORD
L PHRM = ALPHA ROMEO

In the first example only the letter O is removed, in the second example A, E and O are removed and the space relocated behind the L.

As well as implementing the above algorithm I also wanted the ability to add new categories easily, for this reason I chose to store the data in JSON files in a directory that is scanned on instantiation, this keeps the program small and simple.

V1

The initial implementation of the program was in Java, this is primarily because I was writing the software on the train on the way home and as other West Coast Mainline users will know internet access is poor, therefore I wasn’t able to download dependencies with other technologies.

At the end of the journey I had a working version of the application which I could show my wife to get her ‘customer’ reaction.

Please see the GitHub project for the source.

Categories for the game are stored in separate JSON files, a list of JSON files is generated and a random file chosen, this is read in using Jackson. Each category has an ID, a display title and a number of answers e.g.

{
"id":"capital_cities",
"display":"Capital Cities",
"answers":[
    "Abu Dhabi",
    "Abuja"
]
}

Within the application a random answer is chosen and passed through a processing method, this strips the word of vowels, rejigs spaces and returns to the calling method. The user receives the scrambled text and presses enter when ready to go onto the next word, the answer is then displayed along with the next processed word.

Here is a small example of the output:

Categories and their words will be presented, press enter for the answer and  or the next clue

British PMs Since 1900
MRGRT THTCHR
Margaret Thatcher

JM SCLLGHN
James Callaghan

CLMNTT TL

In general V1 was well received however the limitation of having to use the command line and run on a JRE meant that the customer experience wasn’t brilliant, this was expected. My wife then gave me the next set of requirements… “it’d be great if I could play this on my phone”

V2

The simplest way to allow the game to run on the phone was to turn it into a website, this would make the game platform agnostic, and it also meant I needed to work using a client/server paradigm so that the phone can contact a server as html etc cannot be saved locally. Initially I thought about using Spring or Wicket but then decided that JavaScript technologies would make quicker development, smaller server footprint and would allow me to learn a few things.

The technology stack I decided on was:

  • Node.js - run time for server side JavaScript
  • Express - server side node package to simplify routing and provide support for templates; can easily create a server
  • Bootstrap - client display library, provides an easy way to define layouts which are adaptable for multiple form factors

The JSON files were reused from the java project and many of the Java methods were turned into JS functions.

Please see the GitHub project for the source.

With the web version of the game the user is presented with a page that contains a scrambled work and a button, pressing the button reveals the answer and pressing the button again presents the next scrambled word. For each category, 5 random words are chosen and once all categories have been processed the application starts again with all categories and the next chosen at random.

This is the scrambled word screen

Pressing show presents the reveal screen

Pressing next presents the next word again

V3
This is a potential work in progress, my wife has more requirements and I have a few ideas, these include:

  • Checklist of available categories to choose from instead of just scrolling through all categories all the time
  • Install on my QNAP for easy access from multiple clients
  • Store categories in a database, probably Mongo (even though the scale isn’t needed)
  • Add better logic for deciding on the next word, would probably want to use a bloom filter to see if a word for a category has already been used before

20 February 2014

jEdit Markdown plug-in hack

PublishedActual
Birmingham New Street 06:50 06:50
London Euston 08:15 08:15

I have posted in the past about jEdit and Markdown and how I use jEdit to write my Markdown and preview using the Markdown plug-in. There is an annoying bug in the Markdown plug-in from the jEdit plug-in manager (v0.1), that also exists in the latest version on the authors website (0.1.1), which affects nested lists so that when they are generated they only display the first word of the top level list items, this can be replicated and seen as follows:

Firstly create an .md file in jEdit with this content:

1. This is list item 1
    1. This is list item 1.1
    1. This is list item 1.2
1. This is list item 2
1. This is list item 3
    1. This is list item 3.1
        1. This is list item 3.1.1
1. This is list item 4

Next, use the Markdown plug-in in jEdit to preview the text, the following will be shown:

You can see that item 1, 3 and 3.1 only display a single word for their list item.

The original author of the plug-in hosts it in an Atlassian Bitbucket and I could see from the commit history that the dependencies have been updated recently however there was no binary version of the latest project. Using Mercurial I downloaded the project into Eclipse but encountered some issues, these were most likely because my environment isn’t set up correctly for the build but I didn’t have time/inclination to investigate further. As the plug-in is distributed under the GNU GPL I decided to upgrade the plug-in libraries myself by doing the following:

  • Close jEdit
  • Download pegdown-1.4.2.jar, this relies on parboiled
  • Download parboiled-java-1.1.6.jar which relies on parboiled-core-1.1.6.jar and asm-all-4.0.jar
  • Using 7-Zip open the MarkdownPlugin.jar file and edit the MarkdownPlugin.props file within the plug-in so that the following properties change.
    • plugin.ua.pico.jedit.markdown.MarkdownPlugin.jars=parboiled4j-0.9.9.0.jar pegdown-0.8.5.4.jar
      Becomes
      plugin.ua.pico.jedit.markdown.MarkdownPlugin.jars=asm-all-4.0.jar parboiled-java-1.1.6.jar parboiled-core-1.1.6.jar pegdown-1.4.2.jar
  • Copy the modified MarkdownPlugin.jar, parboiled-java-1.1.6.jar, parboiled-core-1.1.6.jar, pegdown-1.4.2.jar and asm-all-4.0.jar to the jars directory of the jEdit install,
  • Start jEdit.

Now when I preview or render a Markdown file I get the lists correctly returned to me:

One of the downsides to this approach is that new features in pegdown that may be supported in the Bitbucket project will not be available.

07 January 2013

Terning over a new leaf

Miles to DateCO2 SavingCalories to Date
5.66 1698g 158

This blog will be going through a change in 2013. I have changed my place of work so will no longer have 2x 80 minute train journeys each day to write the posts. The content will remain the same as will the name however I will write articles when I get the opportunity, some will take significantly longer than 80 minutes, others will not, I will try to keep to the timings and hopefully they will still be interesting.

This leads me nicely into my first post being written post-Christmas. A major side effect of not travelling to London is that I will no longer have the convenience of the London underground to whisk me to the office, instead I have been facing the following options:

  • Directish and reasonably frequent bus, cheap and reasonably environmentally friendly, downside of this is that the road the bus follows is basically a car park at the time I would be travelling in the morning.
  • Taxi, is door to door but expensive, and again following traffic jam. Taxi is also the least environmentally friendly option available to me.
  • Walk, most environmentally friendly and no delays however each section takes 25 minutes (and I have 4 of them per day) even at my brisk pace, also if it’s raining I will be in the rain for longest.
  • Cycle, second most environmentally friendly and no delays, will take roughly the same amount of time as a bus, only downside is having to take the bike on the train, storing bike and equipment at work and the initial set up costs.

I’ve decided to go down the bike route and to make this as easy as possible I decided to go down the folding bike route. There are many makes and models to choose from with Brompton seeming to the premium brand, however the starting price of 850 and a 20 week wait wasn’t desirable, next make down on quality list is a close run thing between Dahon and Tern, Tern being a company set up by previous Dahon board members and seemingly utilising many of the same suppliers and parts. Down from this are bikes made by Raleigh and other major manufacturers, many reviews I’ve read have stated these are basically old Dahon models just rebranded anyway. Weighing up cost and features, as I’m sure you’ll have guessed, I went for a Tern, more specifically the Tern Link which is a good sized commuter bike, is less skittish than a Brompton and still folds small enough for me to squeeze it into a luggage rack and quickly enough that if I am rushed for the train I can collapse in seconds.

I purchased the bike from Evans cycles and would recommend them to anybody, the sales staff are knowledgeable and the bike was a very good price as it’s a 2012 model. I would also recommend that anybody considering a folders looks at the YouTube videos by nyce wheels, they have reviewed most folder models, including mine and always seen very objective.

I collected the bike one week which included Christmas day, Boxing Day and a Sunday, after ordering on a Friday so well done to Evans for getting it ready. First ride out was wobbly as last time I rode a bike was 2004, but the old adage rings true and before long I had been once around the block. Second ride was better and further and also less physically painful as my muscles got used to cycling again.

Today was my first official commute, 5.5 miles and a couple of hundred calories and it went well, I’ll see how it goes over time but so far so good.

17 September 2012

London 2012... or was it?

PublishedActual
Birmingham New Street 07:10 07:10
London Euston 08:30 08:29

During the build up to the Olympics there was an article on the BBC website discussing the marketing restrictions and how some businesses and people have been accused of breaking these restrictions. This got me thinking, in what ways would it be possible for me to refer to the event without actually using any of the controlled words. This was only supposed to be a short post but I let my ideas run away with me and it's ended up being written of a couple of train journeys.

The year

The first thing to tackle is the year. Our current year is based on the Gregorian calendar however there are a number of calendars used around the world, 47 if Wikipedia is to be believed. JodaTime, a Java library for handling dates and times, allows the output of a given date in the format of another calendar. Using Joda I can determine the year of the Olympic period in a sub-set of calendars, here is the source code to achieve this:

package dates;

import org.joda.time.Chronology;
import org.joda.time.DateTime;
import org.joda.time.chrono.BuddhistChronology;
import org.joda.time.chrono.CopticChronology;
import org.joda.time.chrono.EthiopicChronology;
import org.joda.time.chrono.GJChronology;
import org.joda.time.chrono.GregorianChronology;
import org.joda.time.chrono.ISOChronology;
import org.joda.time.chrono.IslamicChronology;
import org.joda.time.chrono.JulianChronology;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

/**
 *
 */
public class JodaTest {

    /**
     * Main execution method.
     *
     * @param args and array of {@link java.lang.String} program arguments.
     */
    public static void main(String[] args) {
        DateTimeFormatter DATE_FORMAT = DateTimeFormat.forPattern("YYYY-MM-dd");
        DateTime startDateTime = DATE_FORMAT.parseDateTime("2012-07-27");
        DateTime endDateTime = DATE_FORMAT.parseDateTime("2012-09-09");

        Chronology[] chronologies = new Chronology[]{BuddhistChronology.getInstance(),
            CopticChronology.getInstance(),EthiopicChronology.getInstance(),
            GJChronology.getInstance(),GregorianChronology.getInstance(),
            IslamicChronology.getInstance(), ISOChronology.getInstance(),
            JulianChronology.getInstance()};

        StringBuffer buffer = new StringBuffer();
        for(Chronology chronology : chronologies) {
            startDateTime = startDateTime.toDateTime(chronology);
            endDateTime = endDateTime.toDateTime(chronology);
            buffer.append(chronology.toString()).append("\t")
                  .append(startDateTime.toString()).append(" - ")
                  .append(endDateTime.toString()).append("\n");
        }
        System.out.println(buffer.toString());
    }
}

And the sample output would be:
BuddhistChronology[Europe/London] 2555-07-27T00:00:00.000+01:00 - 2555-09-09T00:00:00.000+01:00
CopticChronology[Europe/London] 1728-11-20T00:00:00.000+01:00 - 1728-13-04T00:00:00.000+01:00
EthiopicChronology[Europe/London] 2004-11-20T00:00:00.000+01:00 - 2004-13-04T00:00:00.000+01:00
GJChronology[Europe/London] 2012-07-27T00:00:00.000+01:00 - 2012-09-09T00:00:00.000+01:00
GregorianChronology[Europe/London] 2012-07-27T00:00:00.000+01:00 - 2012-09-09T00:00:00.000+01:00
IslamicChronology[Europe/London] 1433-09-08T00:00:00.000+01:00 - 1433-10-22T00:00:00.000+01:00
ISOChronology[Europe/London] 2012-07-27T00:00:00.000+01:00 - 2012-09-09T00:00:00.000+01:00
JulianChronology[Europe/London] 2012-07-14T00:00:00.000+01:00 - 2012-08-27T00:00:00.000+01:00

As all results start and end in the same year for each calendar it means we could use 2555, 1728, 2004 or 1433 to represent the current year.

Another way to represent the year could be to base it on another number system. Our primary number system is decimal or base 10, using the different number bases the current year could be represented as follows (selected bases up to base 62):
2: 11111011100
3: 2202112
4: 133130
5: 31022
6: 13152
7: 5603
8: 3734
9: 2675
10: 2012
15: 8E2
23: 3IB
46: hY
48: fi
54: bE
58: Ye

All the ones chosen either make sense as l33T sP34k or as integer numbers.

So now I’ve shown how the year can be represented differently I’ll go on to the location.

The Location

As with the year we could treat the location as being a number based on the base 62 number system, this means that the location could be represented as follows in decimal:
2147483647

This has lost some of the snappiness of the actual word London so taking this number I can again convert to another base (12 and above starts to produce words). Again the output is quite weak, the only result that looks like a word is:
44: D0ffIN

Another way to change the representation of the place would be to use my Word Whacker, this can output a word which has some numeric equivalence to the location. Using WW4 and the ASCII character set my program output the following subset of words as equivalents:
Speedy
Hurrah
Dazzle
Energy

I think this is brilliant, the fact that words like these come out is very apt. Probably the most appropriate though, and given the subject of this post is:
Censor

The other controlled words

Putting some of the other controlled words through the word whacker gives the following results, I chosen only 5 for each controlled word.

Original WordResult 1Result 2Result 3Result 4Result 5
GamesRacerCoderEthicMatchDenim
Two Thousand and TwelveNANANANANA
Twenty-TwelveEffortlesslySkullduggeryPhilanthropyFull-strengthVainglorious
MedalsBannerBucklePicnicChainsNoddle
SummerJoyfulSuntanWinterAugustSplosh
GoldLateKindCrapFireTeal
SilverUnsoldSlap-upSequinHustleHollow
BronzeMarmotPseudoBonzerFilthyTriple
SponsorsMyosotisPopulousUnsavoryTorturerBuzzword

Putting it all together

At the end of all this I can say that I enjoyed D0ffIN 8E2, Hurrah was a great city for holding the Joyful Match and athletes, games makers and organisers did the UK proud. I particularly enjoyed watching Jessica Ennis win her Fire Buckle and Mo Farah his Kind Noddle both on the same night. Becky Adlington did look a bit disappointed with her Marmot Chains for the 800m swim but was happy with her 400m Banner. One of the most enduring images will be Paul Blake winning a Slap-up Picnic in the T36 400m, his pride and joy shows what 4 years of hard work means when it leads to success. The weather even got into the spirit of things definitely providing us with the Suntan version of Summer rather than the Winter or Splosh version of Summer. So, whatever you want to call it I hope the Vainglorious Coder, Philanthropy Ethic or Full-strength Denim was good for you, I hope you enjoyed Speedy 2004 and that the Myosotis (forget-me-not) messages and Unsavory adverts didn’t detract too much from the event.

04 July 2012

Insert Coin to Continue

PublishedActual
Birmingham New Street 07:10 07:10
London Euston 08:30 08:29

When I was a child, my family would go on holiday to caravan sites in Wales. Sometimes, true to reputation, days were long and wet but there was always one thing that would take away the boredom and give me something to do… the arcade, a room full of flashing lights, loud noises and above all, games. Even though I was young I still remember completing Final Fight and Golden Axe during one wet holiday at Clarach Bay.

Recently I’ve downloaded CSR Racing for the ipad, a street racing game where you earn game cash and gold by racing against computer competitors, the controls are simple and each car has a few upgradable items at 5 stages each. If you need to update and don’t have the game cash then you can break out the plastic and buy some credits, these are reasonably priced e.g. £2.99 for $25,000 in-game. This is only the second game I’ve downloaded that follows the freemium model, i.e. the game comes free but you can buy in-game credits. Lots of games follow this model, which I call this ‘freemium model 1’.

Another game I have downloaded recently is MetalStorm, a dog-fight flight game where there are a number of missions to complete or simply the head-to-head game. As with CSR, tokens and cash can be earned and bought during the game but unlike CSR, if the plane crashes the option to continue is presented at the cost of 5 coins. As I sat there watching the 30 seconds drip away it reminded me of standing by the Golden Axe machine as the 10-second countdown ticked by and the words ‘Insert coin to continue’ flashed, I even felt the same need to click continue rather than lose my game. This impulse and type of experience is what I call ‘freemium model 2’, it takes pay-to-play into the game like arcade machines of old. I can see that model 2 can be used by a number of game formats and suspect that it will be used more and more in upcoming releases.

I’ve had a look at how much I’ve spent and time played on these two games and cost per minute of play so far is around 4p, I think this is quite reasonable when compared to arcade machine prices for similar levels of enjoyment.

12 January 2012

File timestamps in batch files

PublishedActual
Birmingham New Street 06:50 06:54
London Euston 08:14 08:23

This is a strange one as it is useful to only a small sub-set of computer users, namely those which write batch files in Windows to optimise their workflows. One of my recent workflows has been to take a file with name XYZ.txt in directory A and move it to directory B ready for a file with the same name (XYZ.txt) to be placed in directory A. So that I can keep a backup of the files I needed to add a timestamp to the filename, this means that directory B contains 1 or more files with the name yyyyMMdd_hhmmss_XYZ.txt where:

  • yyyy = full year
  • MM = month in year
  • dd = date in month
  • hh = hour in day
  • mm = minute in hour
  • ss = seconds in minute

Example names could be 20111225_120027_XYZ.txt or 20120111_180653_XYZ.txt etc.

Initially it seemed like a simple problem to solve, I figured that I’d be able to use the system %DATE% and %TIME% properties. To test this theory I decided to use the command line to rename a file following this process:

  1. Click Start> Run
  2. Type cmd and hit enter
  3. Enter the following commands:

    Z:> mkdir test
    Z:> cd test
    Z:test> notepad XYZ
  4. Save the file using Notepad, this doesn’t have to have any content.
  5. Rename the file with the following:

    Z:test> ren XYZ.txt %DATE%_%TIME%_XYZ.txt

At this point DOS reported an error as apparently The syntax of the command is incorrect.. Knowing that the syntax is correct I guessed that there must be characters returned in %DATE% or %TIME% that cause issues. To test these variables I entered the following commands at the command line receiving the corresponding results:

Z:test> echo %TIME%
18:35:42.98
Z:test> echo %DATE%
12/01/2012

This simple test shows that both %DATE and %TIME% contain characters that are not valid for file names, i.e. / and :. My next plan of attack was to process the values to see if I could remove the reserved characters so I went to Google and searched. Eventually I came across what looked like a good solution in a post on StackOverflow which gave a full command, this command used syntax I’ve never seen before (like %DATE:~6,4%) so when it didn’t work first time I had to find out how to fix it. Essentially the StackOverflow answer assumed the American locale whereas my machine is using GB dates and times, some further searching gave the pointer to look at the help for the set command:

Z:test> set /?

The help file gave me exactly the detail I needed. I never knew that it was possible to affect the value returned by an environment variable but apparently it is and the help on set gives a few details. The operations that are supported are string substitution and sub-string.

String substitution is where some text in the original string is replaced with other text, this takes the form

%DATE:str1=str2%


Using the above example the value of %DATE% will be returned with all instances of str1 being replaced with str2. This can be tested as follows:

Z:test> echo Original date %DATE% becomes %DATE:/=;%
Original date 12/01/2012 becomes 12;01;2012


As can be seen, all instances of / have been replaced with ; in the output text.

The second string operation which can be performed is sub-stringing, this is where a series of characters are extracted from the original text based on their positions. The syntax for sub-stringing takes the form:

%PATH:~offset[,length]%


Offset indicates the number of characters to pass over before starting the sub-string so an offset value of 3 means that the sub-string will start with the character at position 4. Length is optional and indicates how long the sub-string will be, if this value is not supplied then the remainder of the value is returned, if the length is greater than the value length then, again, the remainder of the word is returned. The values for offset and length can be negative, this adds complexity to the expression and can make it look awkward. If the offset is negative then the starting position is that number of character from the right of the value, for instance XYZ with an offset of -1 means the sub-string will start at Z. If the length is negative then the length of the substring is taken to be the remaining length of the value minus the negative length, for instance XYZ with an offset of -2 and length of -1 would return Y. It’s worth noting with negative indices that if the remaining length of the value is less than the number of negative characters then nothing will be returned. String substitution is a reasonably complex concept and is probably best illustrated with some examples:

Z:test> echo Original date %DATE% becomes %DATE:~0%
Original date 12/01/2012 becomes 12/01/2012

Z:test> echo Original date %DATE% becomes %DATE:~3%
Original date 12/01/2012 becomes 01/2012

Z:test> echo Original date %DATE% becomes %DATE:~3,2%
Original date 12/01/2012 becomes 01

Z:test> echo Original date %DATE% becomes %DATE:~3,7%
Original date 12/01/2012 becomes 01/2012

Z:test> echo Original date %DATE% becomes %DATE:~3,100%
Original date 12/01/2012 becomes 01/2012

Z:test> echo Original date %DATE% becomes %DATE:~3,-5%
Original date 12/01/2012 becomes 01

Z:test> echo Original date %DATE% becomes %DATE:~3,-10%
Original date 12/01/2012 becomes

Z:test> echo Original date %DATE% becomes %DATE:~3,-2%
Original date 12/01/2012 becomes 01/20

Z:test> echo Original date %DATE% becomes %DATE:~-7%
Original date 12/01/2012 becomes 01/2012

Z:test> echo Original date %DATE% becomes %DATE:~-7,2%
Original date 12/01/2012 becomes 01

Z:test> echo Original date %DATE% becomes %DATE:~-7,100%
Original date 12/01/2012 becomes 01/2012

Z:test> echo Original date %DATE% becomes %DATE:~-7,-5%
Original date 12/01/2012 becomes 01

Z:test> echo Original date %DATE% becomes %DATE:~-7,-10%
Original date 12/01/2012 becomes

Taking all the above into consideration I finally came up with the sub-stringing required to create the timestamp I wanted in the format I wanted, here is how I achieved the timestamp rename:

Z:test> set STAMP=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%%TIME:~0,2%%TIME:~3,2%%time:~6,2%_XYZ.txt

Z:test> echo rename XYZ.txt with name %STAMP%
rename XYZ.txt with name 20120112_ 80809_XYZ.txt

Z:test> set STAMP=%STAMP: =0%

Z:test> echo rename XYZ.txt with name %STAMP%
rename XYZ.txt with name 20120112_080809_XYZ.txt

Z:test> ren XYZ.txt %STAMP%

Z:test> dir
Volume in drive Z is XP MP 2.21w

Directory of Z:test

12/01/2012 08:12 <DIR> .
12/01/2012 08:12 <DIR> ..
12/01/2012 08:08 0 20120112_080809_XYZ.txt
1 File(s) 0 bytes
2 Dir(s) 9,771,372,544 bytes free

05 January 2012

iTunes

PublishedActual
Birmingham New Street 07:10 07:10
London Euston 08:30 09:06

After a recent iTunes update, I have had problems receiving the Answer me This podcast, this caused much consternation as it’s one of my favourite podcasts.

Part way through trying to figure out what was wrong I became conscious of the problem solving order and techniques that I was applying, this is something I’ve noticed before and I find it quite interesting. Broadly speaking, problem solving is my job, whether that be a piece of code to fix a bug, a solution design or a full blown system architecture, all of these solve a problem in some way. When I have a problem to solve I usually draw on knowledge and experience to create a number of hypotheses which I can test, one by one, until I have an answer; if all are unsuccessful then I will resort to searching to see if there are any resolutions out there.

I usually base the order of testing on the order that I understand things to happen or on the order of obviousness, for example if a computer doesn’t turn on I’d check it plugged in, check the power lead with another computer, check the PSU in the computer, check motherboard, check components etc. Each time I test a hypothesis there will be one of three results, success, fail or perceived improvement. Based on the previous flow, if computer is not plugged in plug it in and turn it on - success, if the computer was plugged in but the lead doesn’t work on my computer or another computer this is a perceived improvement and the fuse or lead can be changed, if it still doesn’t work continue testing, after testing all likely power related components search the net for the answer.

So, coming back to the iTunes issues here is the rough running order followed to fix the problem:

  1. Check link still active - Right click podcast in iTunes and elect to ‘Copy podcast URL’, paste this into a browser and follow link - RSS feed was contacted and list of podcasts could be retrieved.
  2. Check content available - Clicking one of the links that comes up in the feed, doing this worked so proved that the link, content and ability to get the media from the site were ok.
  3. Unsubscribe and subscribe - Right click podcast and elect to ‘Unsubscribe podcast’ then ‘Subscribe podcast’ - at this point I could subscribe but the podcast list did not update and no new shows delivered
  4. Check other podcasts work - Check that content is delivered from other feeds, unsubscribe/subscribe another feed, all other feeds appeared to work
  5. Sign up to new podcasts - Look through iTunes and subscribe to a test feed. At this point I happened to click on The Collings and Herrin Podcasts which showed as a podcast I could not subscribe to, finally I could look for trends. After a couple of minutes of screen gazing the answer leapt out, ‘Explicit’, this little tag was the thing that the broken feeds had in common and what the subscribable feeds had missing.

Now I was certain that the upgrade of iTunes had reset or done something to stop only explicit content so I performed A quick check of the parental controls (‘Edit> Preferences> Parental’), this showed that I had been restricted to content suitable for those up to the age of 14 and the ‘Restrict Explicit Content’ checkbox was ticked, after unticking this box normal service was resumed and I could once again receive answer me this.

Since resolving this issue I have had to revisit these settings but at least I know exactly where to look and what the problem is now.