intreo
Review

A Review of the Intreo JobsIreland Website

The following is a technical review of the Intreo website and the problems with, I am not claiming to be an expert but there are a few things wrong. This was initially highlighted by u/freshly_squeezed_ass on Reddit

The server

The webserver is running on IIS which itself will cost substantially more than your standard Apache instance. Being a website owned by the Department of Social Protection surely you can save some cash by using virtual service such as Amazon or Google with load balancing and very easily reduce costs, as I would imagine traffic only peeks a couple times a day.

Folder Naming

I know you guys are running windows servers but for the love of god please name your folders appropriately with lower cases and don’t use the following crazy folder casing “/Html/css/style.css”

The website framework

You guys are using Angular which is great, but it would be great if you got some of the fundamentals down before launching a government website that has to deal with large amounts of people, you really have a great chance to flex your skills which other devs can only dream of.

IIFE

In some cases you guys are using IIFE in other cases not, I do hope you stick with one or are just rolling out the IIFE standard in the project and example of this is HomeController.js vs ContactController.js

Routes

If I could offer you one piece of advice it would be to use sunscre… I mean UI Router trust me on this, as you are going down the path of using angular pre version 2 this will save you headaches as the website gets more complex, and it will once Leo gets his mits on the project.

Your vacancy post pages all have the same URL, why is this, why not set a route with a parameter instead of using some crazy factory that gets and sets the data. I mean how are people supposed to share the jobs online with there friends. Really?

JQuery

When using angular your goal should be to distance yourself from JQuery as much as possible, I know you have time constraints and need to get the project out the door, but get deeper in to angular have a look at directives/components and try scrape it back to plain old javascript. You’ll find a lot can be done with this. In fairness is that waypoints library really necessary.

Web Requests

There is no excuse for this one, you guys are using jquery ajax functions to make web requests, why not offload these to factories, why not use angular resources, I do hope you are using a rest API.

Google Maps

I don’t care to look in to this too much but for some reason you are calling the google maps api when loading the employers route. You should really register for an API key, whatever you are trying to do will never actually do.

Bower

Get somebody on this project to learn how to use Bower, it will help you immensely especially if you insist on using all those jquery plugins again trust me on this.

Inline Styles

Come on lads seriously you need to stop this, I am as guilty as anyone here but thankfully my peers slapped the shit out of my inline styles, but I’ll still sneak a few through the code review, even if I do have to Base64 them. Also check out SASS again time saving in the long run.

Font Awesome

I hope your designer is reviewing the work you do, but if not then just to let you know that link is dead “https://www.jobsireland.ie/Html/fonts/fontawesome-webfont.woff2?v=4.4.0” <– saving you some time

Validation

I only checked out the contact us page but please tell me you’ve seen this.

typeError: Cannot set property ‘FromPage’ of undefined

This is caused because you are trying to do the following

$scope.Contact.FromPage = ‘Contact’;

before actually setting $scope.Contact, you can’t have a child that has no parent “apparently” and again with the casing style guide

Concatenate, Minify and Compress

I assume the government is paying for this service and the ongoing associated fees, please do your fellow country me proud and do the above.

More

I don’t claim to be an expert, but not being an expert and being able to pick out the few things above show that the money the government is paying is going to a substandard service.

As a fellow web dev I would give my left arm to build a website that is important to so many people and I think it should be respected a lot more than what it is.

Pull yourself up by your bootstraps and do the job most of us would only dream of doing.

I would love to hear feedback on this dave@davidcusack.com

 

live-soccer-tables
Projects

Live Soccer Tables WordPress Plugin

Live Soccer Tables is a WordPress plugin that I developed to get a good idea of how to take a WordPress plugin from concept to production. The plugin allows users to add a shortcode to their WordPress website and instantly get the current standings of the most popular soccer leagues around the globe. The plugin fetches data from many sources and compiles them together using NodeJS, this then creates an endpoint for the PHP code to grab the data based on the league name.

In the future Live Soccer Tables will allow you to specify a particular year so you can get historical data that can be inserted in to articles an pages.

Below are some examples of what the plugin has to offer, plus a lot more.

English Premier League Football Table

POS Club P W D L GF GA GD PTS
1 Liverpool 1 1 0 0 4 0 4 3
2 Chelsea 1 1 0 0 3 0 3 3
3 Bournemouth 1 1 0 0 2 0 2 3
4 Crystal Palace 1 1 0 0 2 0 2 3
5 Manchester City 1 1 0 0 2 0 2 3
6 Watford 1 1 0 0 2 0 2 3
7 Manchester United 1 1 0 0 2 1 1 3
8 Tottenham Hotspur 1 1 0 0 2 1 1 3
9 Everton 1 0 1 0 2 2 0 1
10 Wolverhampton Wanderers 1 0 1 0 2 2 0 1
11 Burnley 1 0 1 0 0 0 0 1
12 Southampton 1 0 1 0 0 0 0 1
13 Leicester City 1 0 0 1 1 2 -1 0
14 Newcastle United 1 0 0 1 1 2 -1 0
15 Arsenal 1 0 0 1 0 2 -2 0
16 Brighton & Hove Albion 1 0 0 1 0 2 -2 0
17 Cardiff City 1 0 0 1 0 2 -2 0
18 Fulham 1 0 0 1 0 2 -2 0
19 Huddersfield Town 1 0 0 1 0 3 -3 0
20 West Ham United 1 0 0 1 0 4 -4 0
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}

Scottish Premiership Football Table

POS Club P W D L GF GA GD PTS
1 Hearts 2 2 0 0 5 1 4 6
2 Hibernian 2 1 1 0 4 1 3 4
3 Rangers 2 1 1 0 3 1 2 4
4 Kilmarnock 2 1 1 0 2 0 2 4
5 Aberdeen 2 1 1 0 2 1 1 4
6 Celtic 2 1 0 1 3 2 1 3
7 St Mirren 2 1 0 1 2 3 -1 3
8 Hamilton Academical 2 1 0 1 2 4 -2 3
9 Livingston 2 0 1 1 1 3 -2 1
10 St Johnstone 2 0 1 1 1 3 -2 1
11 Dundee 2 0 0 2 1 3 -2 0
12 Motherwell 2 0 0 2 0 4 -4 0
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}

Spanish La Liga Football Table

POS Club P W D L GF GA GD PTS
1 Levante 1 1 0 0 3 0 3 3
2 Girona 1 0 1 0 0 0 0 1
3 Real Valladolid 1 0 1 0 0 0 0 1
4 Alaves 0 0 0 0 0 0 0 0
5 Athletic Bilbao 0 0 0 0 0 0 0 0
6 Atletico Madrid 0 0 0 0 0 0 0 0
7 Barcelona 0 0 0 0 0 0 0 0
8 Celta Vigo 0 0 0 0 0 0 0 0
9 Eibar 0 0 0 0 0 0 0 0
10 Espanyol 0 0 0 0 0 0 0 0
11 Getafe 0 0 0 0 0 0 0 0
12 Huesca 0 0 0 0 0 0 0 0
13 Leganes 0 0 0 0 0 0 0 0
14 Rayo Vallecano 0 0 0 0 0 0 0 0
15 Real Madrid 0 0 0 0 0 0 0 0
16 Real Sociedad 0 0 0 0 0 0 0 0
17 Sevilla 0 0 0 0 0 0 0 0
18 Valencia 0 0 0 0 0 0 0 0
19 Villarreal 0 0 0 0 0 0 0 0
20 Real Betis 1 0 0 1 0 3 -3 0
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}

German Bundesliga Football Table

POS Club P W D L GF GA GD PTS
1 Augsburg 0 0 0 0 0 0 0 0
2 Bayer Leverkusen 0 0 0 0 0 0 0 0
3 Bayern Munich 0 0 0 0 0 0 0 0
4 Borussia Dortmund 0 0 0 0 0 0 0 0
5 Borussia Monchengladbach 0 0 0 0 0 0 0 0
6 Eintracht Frankfurt 0 0 0 0 0 0 0 0
7 Fortuna Dusseldorf 0 0 0 0 0 0 0 0
8 Freiburg 0 0 0 0 0 0 0 0
9 Hannover 0 0 0 0 0 0 0 0
10 Hertha Berlin 0 0 0 0 0 0 0 0
11 Hoffenheim 0 0 0 0 0 0 0 0
12 Mainz 05 0 0 0 0 0 0 0 0
13 Nuremberg 0 0 0 0 0 0 0 0
14 RB Leipzig 0 0 0 0 0 0 0 0
15 Schalke 04 0 0 0 0 0 0 0 0
16 Stuttgart 0 0 0 0 0 0 0 0
17 Werder Bremen 0 0 0 0 0 0 0 0
18 Wolfsburg 0 0 0 0 0 0 0 0
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}

French Ligae 1 Football Table

POS Club P W D L GF GA GD PTS
1 Reims 2 2 0 0 2 0 2 6
2 Marseille 1 1 0 0 4 0 4 3
3 Paris Saint-Germain 1 1 0 0 3 0 3 3
4 Lille 1 1 0 0 3 1 2 3
5 Monaco 1 1 0 0 3 1 2 3
6 Strasbourg 1 1 0 0 2 0 2 3
7 Nimes 1 1 0 0 4 3 1 3
8 Dijon 1 1 0 0 2 1 1 3
9 Lyon 2 1 0 1 2 1 1 3
10 Saint-Etienne 1 1 0 0 2 1 1 3
11 Angers 1 0 0 1 3 4 -1 0
12 Guingamp 1 0 0 1 1 2 -1 0
13 Montpellier HSC 1 0 0 1 1 2 -1 0
14 Nice 1 0 0 1 0 1 -1 0
15 Nantes 1 0 0 1 1 3 -2 0
16 Rennes 1 0 0 1 1 3 -2 0
17 Amiens 1 0 0 1 0 2 -2 0
18 Bordeaux 1 0 0 1 0 2 -2 0
19 Caen 1 0 0 1 0 3 -3 0
20 Toulouse 1 0 0 1 0 4 -4 0
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}

Australian League Football Table

POS Club P W D L GF GA GD PTS
1 Adelaide United 0 0 0 0 0 0 0 0
2 Brisbane Roar 0 0 0 0 0 0 0 0
3 Central Coast Mariners 0 0 0 0 0 0 0 0
4 Melbourne City 0 0 0 0 0 0 0 0
5 Melbourne Victory 0 0 0 0 0 0 0 0
6 Newcastle Jets 0 0 0 0 0 0 0 0
7 Perth Glory 0 0 0 0 0 0 0 0
8 Sydney FC 0 0 0 0 0 0 0 0
9 Wellington Phoenix 0 0 0 0 0 0 0 0
10 Western Sydney Wanderers 0 0 0 0 0 0 0 0
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}
{{pos_1}} {{name_1}} {{play_1}} {{gd_1}} {{pts_1}}
{{pos_2}} {{name_2}} {{play_2}} {{gd_2}} {{pts_2}}
{{pos_3}} {{name_3}} {{play_3}} {{gd_3}} {{pts_3}}
{{pos_4}} {{name_4}} {{play_4}} {{gd_4}} {{pts_4}}
{{pos_5}} {{name_5}} {{play_5}} {{gd_5}} {{pts_5}}
{{pos_6}} {{name_6}} {{play_6}} {{gd_6}} {{pts_6}}
{{pos_7}} {{name_7}} {{play_7}} {{gd_7}} {{pts_7}}
{{pos_8}} {{name_8}} {{play_8}} {{gd_8}} {{pts_8}}
{{pos_9}} {{name_9}} {{play_9}} {{gd_9}} {{pts_9}}
{{pos_10}} {{name_10}} {{play_10}} {{gd_10}} {{pts_10}}
{{pos_11}} {{name_11}} {{play_11}} {{gd_11}} {{pts_11}}
{{pos_12}} {{name_12}} {{play_12}} {{gd_12}} {{pts_12}}
{{pos_13}} {{name_13}} {{play_13}} {{gd_13}} {{pts_13}}
{{pos_14}} {{name_14}} {{play_14}} {{gd_14}} {{pts_14}}
{{pos_15}} {{name_15}} {{play_15}} {{gd_15}} {{pts_15}}
{{pos_16}} {{name_16}} {{play_16}} {{gd_16}} {{pts_16}}
{{pos_17}} {{name_17}} {{play_17}} {{gd_17}} {{pts_17}}
{{pos_18}} {{name_18}} {{play_18}} {{gd_18}} {{pts_18}}
{{pos_19}} {{name_19}} {{play_19}} {{gd_19}} {{pts_19}}
{{pos_20}} {{name_20}} {{play_20}} {{gd_20}} {{pts_20}}
{{pos_21}} {{name_21}} {{play_21}} {{gd_21}} {{pts_21}}
{{pos_22}} {{name_22}} {{play_22}} {{gd_22}} {{pts_22}}
{{pos_23}} {{name_23}} {{play_23}} {{gd_23}} {{pts_23}}
{{pos_24}} {{name_24}} {{play_24}} {{gd_24}} {{pts_24}}
{{pos_25}} {{name_25}} {{play_25}} {{gd_25}} {{pts_25}}
{{pos_26}} {{name_26}} {{play_26}} {{gd_26}} {{pts_26}}
{{pos_27}} {{name_27}} {{play_27}} {{gd_27}} {{pts_27}}
{{pos_28}} {{name_28}} {{play_28}} {{gd_28}} {{pts_28}}
{{pos_29}} {{name_29}} {{play_29}} {{gd_29}} {{pts_29}}
{{pos_30}} {{name_30}} {{play_30}} {{gd_30}} {{pts_30}}
themeforest-enhancement-suite
Projects

Themeforest Enhancement Suite

Themeforest Enhancement Suite is a small script I wrote to help me understand how google chrome extensions work.

This extension allows you to see a preview of wordpress template images that are available on Themeforest.com. Initially this plugin loaded the webpage associated with the template and grabbed the available preview images, this was found to be slow and not very friendly to the Themeforest web servers, so now I have it set up to grab some hidden urls associated with the template itself and load only that one image.

There is some updates that have to be done to this extension but it was a good exercise in developing and releasing a google chrome extension.

Have a look at the extension here

Projects

Sportdec.com

Working on sportdec our team was tasked with creating an online sports statistics, news and betting application for Android and iOS.

This product was one of the most challenging projects I have worked on, we had to take everything that was learned on previous applications and condense that down to a mobile friendly platform.

Technologies and techniques used in this project where as follows:

Cordova

Cordova was essential to getting this product “on the shelves” as quick as possible, It allowed us to leverage our extensive javascript skills to get a project from concept to production in only a short few months and also allowed us to leverage some of the great features that are available to native mobile applications.

Ionic

Ionic was extremely helpful and meant we didn’t need to worry about spending too much time on layout and design from the get go. Ionic was also extremely helpful when it came to our designers conforming to a style guide when building for a mobile platform. This was one of our first major mobile applications and it couldn’t have gone smoother, going from design to concept was seamless.

AngularJS

We decided to move away from BackboneJS in this project as we felt AngularJS had gone through enough iterations to be extremely stable. A strong pull that Angular had on our team was its management of binding data between the factory, controller and the DOM. Using the binding that was available to us in AngularJS allowed us to worry more about the front end controller logic rather than hacking together binding logic.

We inevitably ran in to some walls with angular, one of which was the reason we started using it and that was the data binding functions. Due to the amount of data we had on some of the pages sometimes thousands of objects which pretty much ate up all the resources available to the mobile browser. In some cases we had over 3000 watchers on a single page which meant we spent a number of days refactoring our code to display just the necessities, this number was eventually brought down to the hundreds rather than the thousands. This lead to serious improvements in the applications performances both when idle and under heavy load.

Pubnub

Pubnub was used to make sure the data coming from our servers to the user was very low latency. With this kind of product during a live match we could see close to a thousand changes to the front end every minute, with match data, news and sportsbook market changes. Pubnub allowed us to keep a very high SLA compared to using our own implementation of open sockets, which would cost more time in development as it would need to be scaled for our quite complex tasks.

Ongoing Project

Sportdec have a lot of interesting ideas coming up in the future and I hope to be supporting them along the way.

beanbagsports.com
Projects

Beanbagsports.com

Working with the Beanbagsports.com team we were tasked with building an online sportsbook with an element of social media and social networking.

I cant get in to too much detail related to this product due to a signed NDA but I can give a brief outline of the technology used for this project

BackboneJS / MarionetteJS

Using the BackboneJS framework allowed us to create a large single page application that updated dynamically and at the time was the most responsive online sportsbook at the time, since then many other sportsbooks have started using javascript frameworks to create single page applications.

NodeJS

We used NodeJS to interact with third party API’s which allowed us to create extremely low latency between our front end and our Mongo databases. We found this to be the best option as we had to parse less data and could move services from server to client side.

MongoDB

MongoDB was used to track historical changes in the market parsing service, this was used due to data differences in markets and events. Within the gambling industry markets are dropped and created every second, having a database that could handle this with ease was imperitive.

PHP/Yii

PHP with the Yii framework was used to serve our customer facing API’s, we decided to use this technology as we had a strong skill level within the team and we didn’t feel node was mature enough to handle all the necessary requirements that was needed to provide the customer.

MySQL

MySQL was used for situations where low latency was not so much of an issue but tracking historical changes was a must. From tracking customers betting history to storing there account details. We felt this was more robust for this kind of data at the time and is still in use today.

crime.ie
Projects

Crime.ie

Crime.ie was a personal project that I worked on for over two years which had relatively good success as my first major web venture.

Crime.ie was a place for Irish citizens to get up to date information on criminal news in Ireland, we also covered such things as missing persons and Police alerts. At its peak Crime.ie had over 250k views per month and was ran out of a passion to keep users informed of news that was usually sensationalised. During the time I worked on Crime.ie I had alot of young journalists come through it’s doors that have gone on to do great things which include working for major Irish papers, getting front page articles and also an impressive “Virtual Nomad”.

I attribute a lot of my tech success to this project as is thought me some of the following skills

  • People Management
  • Dealing with sensitive issues
  • Dealing with people in a sensitive manor mainly victims of crime
  • Selling a product to potential advertisers
  • Creating a good relationship with many sources

 

Notable tech challenges that I overcame while working on this project

  • Working with Linux servers
  • Working with web traffic spikes
  • Working with Amazon EC2
  • MySQL Database maintenance
  • Rewriting poor wordpress plugin and theme code bases
  • Developing stable WordPress plugins

 

gallops-3
Projects

Gallops Live

Gallops Live was an online social network and gambling platform for people interested in all things horse racing.

GL was mainly targeted at the UK/Ireland market and worked closely with Boylesports to provide a betting platform to their customers.

Coming in quite late to GL I was tasked with creating an application within the website that allowed users to sign up to a subscription tipping service which ran weekly and was written by there tipsters.

The business requirements for this project were as follows:

  • Create an online subscription service
  • Allow users to to pay daily/weekly/monthly/yearly
  • Ensure registered users are tracked dynamically
  • Ensure users are alerted when there subscription was coming to an end
  • Ensure management was automatically alerted upon user subscriptions

 

Technologies that were required to be used in this project

  • Apache web server
  • PHP/Yii
  • MySQL
  • Mailchimp
  • Realex Payments API

 

This project took approximately 2 weeks to complete which included testing, feedback and retrofitting it to the clients current code base.