April 12, 2014

Chippenham - Melksham - Trowbridge, public transport over Easter (2014)

For the first time for many years - YES - there is public transport running this Easter from Chippenham via Melksham to Trowbridge at useful times. Please use it!

* Trains run daily (Just £5.00 off peak day return, Chippenham to Trowbridge)
* Faresaver X34 bus runs daytime about twice an hour until 17th and from 22nd. No service on 18th, 20th or 21st.
* First 234 bus runs about hourly until 17th, on 19th, and from 22nd. No service on 18th, 20th or 21st.

All trains take 20 minutes for the Chippenham - Trowbridge journey and call at Melksham station about 10 minutes after Chippenham / Trowbridge. Bus journeys take around 50 minutes and also serve Lacock, Beanacre, Semington and Hilperton.

All trains from Chippenham start 20 minutes earlier from Swindon, and all trains to Chippenham continue to Swindon, where you can change for onward transport.

All trains from Trowbridge start about 7 minutes earlier from Westbury, and all trais to Trowbridge continue to Westbury, where you can change for onward connections.

Monday 14th April to Thursday 17th April inclusive
x34 bus - 18 services, 234 bus - 13 services, train - 8 services
Trains from Chippenham at 06:28, 09:06, 11:04, 13:04, 15:39, 17:53, 19:07 and 20:29
Train tickets also valid on 22:26 bus from Chippenham Station
Trains from Trowbridge at 07:10, 07:38, 09:54, 11:53, 14:20, 16:21, 18:38 and 19:38

Friday 18th April (Good Friday)
train - 7 services.
Trains from Chippenham at 09:06, 11:04, 13:04, 15:39, 17:53, 19:07 and 20:29
Trains from Trowbridge at 07:10, 07:38, 09:54, 11:53, 14:20, 16:21, 18:38 and 19:38

Saturday 19th April
234 bus - 13 services, x34 bus - no service. train - 8 services
Trains from Chippenham at 09:05, 10:53, 12:53, 14:51, 16:22, 17:54, 19:53 and 21:25
Train tickets also valid on 22:26 bus from Chippenham Station
Trains from Trowbridge at 07:38, 08:28, 09:53, 11:38, 13:38, 15:25, 16:56 and 18:38

Sunday 20th April (Easter Day)
train - 5 services. No buses,
Trains from Chippenham at 12:13, 14:59, 17:47, 18:21 and 20:10
Trains from Trowbridge at 10:50, 13:48, 16:48, 17:22, 19:11 and 19:45

Monday 21st April (Easter Monday)
train - 7 services. No buses,
Trains from Chippenham at 09:06, 11:04, 13:04, 15:39, 17:53, 19:07 and 20:29
Trains from Trowbridge at 07:38, 09:54, 11:53, 14:20, 16:21, 18:38 and 19:38

Tuesday 22nd April to Friday 25th April inclusive
x34 bus - 18 services, 234 bus - 13 services, train - 8 services
Trains from Chippenham at 06:28, 09:06, 11:04, 13:04, 15:39, 17:53, 19:07 and 20:29
Train tickets also valid on 22:26 bus from Chippenham Station
Trains from Trowbridge at 07:10, 07:38, 09:54, 11:53, 14:20, 16:21, 18:38 and 19:38

Melksham is also served by bus routes x72 and 272 to Bath until Thursday 17th April, on Saturday 19th April and from Tuesday 22nd April. The x72 service also runs to Devizes. On 18th, 20th and 21st a bus on route 272 runs every 2 hours during the daytime between Bath and Devizes via Melksham.

For more details / times, etc:
Faresaver (bus x34)
First Bus (bus 234)
First Great Western (TransWilts Trains)

Posted by gje at 07:32 AM | Comments (0)
More about Graham Ellis of Well House Consultants
Related topics: via article database

April 11, 2014

Updated staff systems helps us look after our customers better

Every day at Well House Manor is different, and indeed during the day things can change around. Our "master plan" is on Lisa's database at HQ (not even at the hotel - such is distributed processing), and much of the feedback has been through our web application - our staff "happens" page as we call it, with details populated by upload from HQ. As customer bookings are entered via that happens page, we stay in sync / resynchronise as a matter of course, and the system stands us in good stead. We can handle bookings from just about anywhere, check on availability, etc.

However, printing out invoices and check in cards remotely has proven to be a bit awkward at times - you may be able to do a remote print, but you can't remotely fill up the paper or change the ink cartridge.

And so - Lisa has been writing a new iPad interface to our systems, accessible remotely from a FileMaker database, and presenting the daily information from a top menu - for customers, there's information about restartuants and transport, WiFi access codes and so forth. And then when staff log in ...

So much information in so little space. Colour changes indicate which rooms need to be fully services as one guest leaves and another arrives. Markings such as "DNM" alert staff to the fact that this customer should not be switched to another room. Where a room may be twin or double, that's indicated ... and you'll even see a little doggie icon to tell us who's bringing Rover with them.

We're moving to allowing electronic sign-in too, and a system in which we can enter further information onto guest's bills even at checkout - the number of times that "X" books for "Y" and "Y" only says he wants a change to the paperwork to reflect that he's paying when he comes to check out ... this new system will rally streamline such changes.

Posted by gje at 10:42 AM | Comments (0)
Related topics: via article database

April 10, 2014

Updated delegate computers - nine of the best

Albany - Caerphilly - Dharan - Edinburgh - Frankfurt - Guadalajara - Helsinki - Kingston - Liverpool.

Nine notepad computers all rebuilt with Ubuntu 12.04 (LTS) for upcoming courses. A mid-life refresh, if you like. Starting with next week's Linux Course covering Linux basics, Linux Admin overview and web (httpd) and MySQL server building and support. The machines are also loaded with C, C++, Expect, Java, Lua, Perl, Perl6, PHP, Python, Python3, Ruby, Tcl/Tk and Tomcat (in alphabetic order!) ready for other courses in following weeks.

These days, many delegate use their own computers during our courses and that's something we encourage where the subject being taught is a programming language. It means that delegates can work in the operating system and environment in which they'll be working after the course too. It means they can keep their examples easily. It means they can use their own data should they wish. But I always carry one or two systems with me on site so that I can demonstrate / so that people can use my data and examples even if they're not allowed them on secure company systems, etc.

Brugges - Izmir - Juneau ... remain unrebuilt. Izmir and Juneau are instantly recognisable as they have blue cases rather than red ones - bought that way for different uses, and serving those uses admirably internally to this day. Brugges had a slight accident (a.k.a. a certain company insisted it go in checked in baggage, in which their gorillas managed to break the screen) and it now runs as a network server. Motto - never trust a gorilla with a computer ...

Posted by gje at 08:13 PM | Comments (0)
Related topics: via article database

April 08, 2014

Why we teach Lua

Lua is - according to Tiobe Software - the 33rd most popular language. "The ratings are based on the number of skilled engineers world-wide, courses and third party vendors" they tell us.

So why do we choose Lua to teach? It's a niche language, and we specialise in niche languages. It's an open source language, and we specialise in open source languages. And for what it's use for, it's superb. And we enjoy teaching people about superb products.

Lua's niche is in tailoring products / languages / other software. Staring off very much in the world of computer games, it's now much more widely used - here's a list of products and games that I've found in the last hour or two, merged from multiple lists:

• 3DMLW • Adobe Photoshop Lightroom • Aerospike Database • Allods Online • Angry Birds (video game) • Apache HTTP Server • Aquaria (video game) • Artweaver • Awesome • BZFlag • Baldur's Gate • Bet On Soldier: Blood Sport • Blitzkrieg (video game) • Brave: The Search for Spirit Dancer • Brütal Legend • Bubble Ball • Buzz! • Celestia • Chaotic Rage • Cheat Engine • Cisco • Civilization V • Company of Heroes • Cortex Command • Crackdown • Creative Technology Zen X-Fi2 • Crowns of Power • Crysis • Damn Small Linux • Dark Role Play • Dark Souls • DarkSpace • Dead Hungry Diner • Demigod (video game) • Digital Combat Simulator • Diner Dash • Dolphin Computer Access • Don't Starve • Driver: San Francisco • Dungeon Crawl Stone Soup • Dungeons (video game) • EXperience112 • Empire: Total War • Enigma (video game) • Escape from Monkey Island • Etherlords • Eufloria • Evil Islands: Curse of the Lost Soul • Eyeon's Fusion compositor • FCEUX • Fable II • Far Cry • Flame • FlatOut (video game) • FlatOut 2 • Foldit • Foldit • Fortress Forever • FreePOPs • Freeciv • Freelancer (video game) • Freeswitch • Garry's Mod • Garrys Mod • Ginga • GrafX2 • Grim Fandango • Headhunter Redemption • Hearts of Iron III • Heroes of Might and Magic V • Homeworld 2 • Hyperspace Delivery Boy! • iClone • Impossible Creatures • Ipe • irccd • King's Bounty: The Legend • L.A. Noire • Legend of Grimrock • Lego Mindstorms NXT and NXT 2.0 • Lego Universe • lighttpd • Linley's Dungeon Crawl • List of American Girl video games • Lock On: Modern Air Combat • Logitech G15 gaming keyboard • LuaTeX • MDK2 • MUSHclient • Mafia II • Magic: The Gathering – Duels of the Planeswalkers • MediaWiki/Scribunto • Mercenaries: Playground of Destruction • Metaplace • Monopoly Tycoon • Multi Theft Auto • MySQL Proxy • MySQL Workbench • Napoleon: Total War • Natural Selection 2 • Nginx • nmap • Operation Flashpoint: Dragon Rising • Orbiter (simulator) • Painkiller (video game) • Perimeta session border controller • PlayStation Home • Project Dogwaffle Professional • Project Zomboid • Prosody • Psychonauts • Puzzle Quest: Challenge of the Warlords • ROSE Online • Rail Simulator • RailWorks • Rappelz • Reason digital audio workstation • Redis • Regnum Online • Renoise audio tracker • Requiem: Memento Mori • Richard Burns Rally • Rift (video game) • RigidChips • Roblox • Rockbox • Rolando 2: Quest for the Golden Orchid • Room for PlayStation Portable • Runes of Magic • Ryzom • S.T.A.L.K.E.R.: Shadow of Chernobyl • Saints Row 2 • Saints Row IV • Saints Row: The Third • SciTE editor • Serious Sam 3: BFE • Shank (video game) • Shank 2 • Sierra Wireless AirLink • Silent Storm • SimCity 4 • Singles: Flirt Up Your Life • Skyland SSR • Snort intrusion detection • Sonic Unleashed • SpellForce: The Order of Dawn • SplitApple • Spring Engine • Squeezebox music players • Star Wars: Battlefront • Star Wars: Battlefront II • Star Wars: Empire at War • Star Wars: Empire at War: Forces of Corruption • Star Wolves • StepMania • Stolen (video game) • Stratagus • Strike Suit Zero • Supreme Commander (video game) • Supreme Commander: Forged Alliance • T-80 Darts • TI-Nspire calculators • Tales of Pirates • Tap Tap Revenge • Tarantool/Box NoSQL database • Teamspeak • The Battle for Wesnoth • The Canon Hack Development Kit (CHDK) • The Fairly OddParents: Shadow Showdown • The Guild 2 • The Incredibles: When Danger Calls • The Sims 2: Nightlife • The Witcher (video game) • There (virtual world) • Tom Clancy's H.A.W.X • Toribash • Trouble in Terrorist Town • UFO: Afterlight • UberSoldier • UltraStar • Universe at War: Earth Assault • VLC • Vegas Tycoon • Vendetta Online • Vim • Warhammer 40,000: Dawn of War I and II • WeeChat • Widelands • Wikipedia • WildStar (video game) • WinGate proxy server • Wireshark network packet analyzer • World of Warcraft • Worms 4: Mayhem • X-Moto • You Are Empty

Take a look at our range of Lua courses here. As the language is a niche one, we often travel far and wide to deliver this training - as well as courses in England, Ireland and Scotland I've been as far afield as Switzerland and Mexico to train. If you have three or more delegates to train, I'll come to you - ((almost)) anywhere in the world. But if there are just one or two of you, you'll probably prefer to come to our training centre in Melksham, Wiltshire, England - just over an hour from London's Heathrow airport, just under 100 miles from London itself, and very convenient for the midlands and the north.

Our training centre has delegate accommodation too - fitted out to four or five star hotel standard, and indeed we take bookings from leisure guests too at the weekend and we've Visit Wiltshire approved. See [here] for hotel details.

Posted by gje at 02:17 PM | Comments (0)
Useful link: Lua training
Related topics: via article database

April 07, 2014

Upgrading our training systems to all the current stable versions

Programming languages are the eye of the storm in software development - the calm in the midst of the gales, an area where changes are gradual and gentle. It really needs to be that way, for who wants to pay for development of code when it's going to have a short shelf life?

And so developers write code that's leading edge code and algorithms, but with languages that are merely modern rather than leading edge or bleeding edge. Code needs to work rather than be too clever to work. So I find myself only difting of late into Python 3 courses and still doing a lot of Python 2, and Perl 6 still sits on the horizon.

But operating systems march on, and the version we've been running on our laptops has been getting long in the tooth, grey in the hair, and has started to have bad breath. Still a fine operting system, but it's embarrassing when it tells your delegates it's rather out of date. So I'm taking the opportunity of few days clear of customer facing work to upgrade the underlying Linux release to the most recent "Long Term Support" version on our training systems, and install recent versions of the laguages and servers we teach on them too. A useful exercise, and I'm logging it here so that I can refer back to procedures later and clarify versions and options used for our delegates. But the log will be in a summary form - you'll be able to follow it if you've been through our Linux training ;-) ... or very likely if you've not as well.

Release is Ubuntu 12.04.2, install from USB stick (from Pen Drive)
Other software to be added - Rails, CodeIgniter, Django

 0. Set up distribution on pen drive
   http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/
   http://www.pendrivelinux.com/creating-an-ubuntu-live-usb-from-cd/
 
 1. Backup old trainee account
 
 2. Install from pen drive ...
   SD4 for main OS
   Main disc for boot
   final slice for swap
   no network
   account Graham Ellis / Trainee / abc123
 
 3. Enable networking
 
 4. Install langauges (perl 5.14.2
 and python 2.7.3 and gcc 4.6.3 already present)
   sudo apt-get install lua5.2
   sudo apt-get install ruby1.9.1
   sudo apt-get install php5-cli
   sudo apt-get install python3-mimimal
   sudo apt-get install tk8.5
   sudo apt-get install expect
   sudo apt-get install rakudo
   sudo apt-get install openjdk-7-jdk
 
 5. Install a default set of servers
   sudo apt-get install apache2-mpm-prefork
   sudo apt-get install mysql-server-core-5.5
   sudo apt-get install mysql-client-core-5.5
   sudo apt-get install openssh-server
 for PHP build ...
   sudo apt-get install libxml2-dev
   
 6. Download
   httpd-2.2.27.tar.gz
   httpd-2.4.9.tar.gz
   php-5.5.11.tar.gz
   apache-tomcat-8.0.5.tar.gz
   apache-tomcat-7.0.53.tar.gz
 and from www.wellho.net
   latmjdemo.war
   data.xyz.tgz
   trainee.tgz
 (All these in downloads.tgz on the pen drive)
 
 7. Set up root account ((and test)) and add a reference local directory
   sudo passwd root
   su -
   mkdir /usr/ref
   exit
 
 8. Test base installs / set up a reference set
   cd
   mkdir ref
   cd ref
 
 8a) - httpd
   tar xzf ../Downoads/httpd-2.2.27.tar.gz
   cd httpd-2.2.27
   ./configure --prefix=/usr/ref/apache2 --enable-rewrite --enable-so --enable-proxy --enable-proxy-http --enable-proxy-balancer --enable-proxy-ajp --enable-dav --enable-info
   make
 as root
   make install
   cd /usr/ref/apache2/conf and change to port 81
   cd ../bin
   ./apachectl start
 from a browser
   visit localhost:81
 and when tested, as root
   ./apachectl stop
 
 8b) - php
   tar xzf ../Downloads/php-5.5.11.tar.gz
   cd php-5.5.11
   ./configure --prefix=/usr/ref --with-apxs2=/usr/ref/apache2/bin/apxs --with-mysql --with-mysqli
   make
 as root
   make install
   cp /home/trainee/ref/php-5.5.11/php.ini-development /usr/ref/lib/php.ini
 check that httpd config file contains
   LoadModule php5_module modules/libphp5.so
 and that it maps php files
   <FilesMatch "\.php[0-9]?$">
   SetHandler application/x-httpd-php
   </FilesMatch>
 
 At /usr/ref/apache2/htdocs/test.php add
   <?php phpinf0(); ?>
 
   cd /usr/ref/apache2/bin
   ./apachectl start
 from a browser
   visit localhost:81/test.php
 and when tested, as root
   ./apachectl stop
 
 8c) Tomcat
 as root
   cd /usr/ref
   tar xzf ~trainee/Downloads/apache-tomcat-7.0.53.tar.gz
   ln -s apache-tomcat-7.0.53/ tomcat
   cd tomcat
   ./bin/startup.sh
 from a browser
   visit localost:8080

Guadalajara completed today ... Albany, Caerphilly, Edinburgh, Frankfurt, Helsinki and Manticore to be completed tomorrow. Dharhan has disc drive issues; Brugges a cracked screen (and I will probably leave it as a "control" system. Izmir and Juneau (our old internal staff systems - smart blue covers rather than smart yellow ones) may also be brought into the fold, and we have a spare system to install too; I'll probably rename Manticore into the "places I have trained" series - poetic license and I'll call in Kintbury, which is near enough to Newbury and the final machine need to start with an "L" - it's going to have to be called "Liverpool"!

Posted by gje at 08:20 PM | Comments (0)
Related topics: via article database

April 06, 2014

Keeping you Tkinter display up to date while monitoring

Have you ever updated a web page just to find that something changes and it needs to be updated again? Have you every tidied the kitchen just to find it messy again within a few minutes? Are there time when it's sensible to say "we'll leave that until ..."?

It's the same when you're programming a Graphic User Interface and changing the display. Multiple changes - perhaps dozens of them - are to be done in quick succession, and it's going to be inefficient (and distracting to the viewer) to see the changes flashing up with lots of intermediate resizes and colour changes. So graphic user interfaces buffer up the changes and apply them all at once - and by default, that application of the changes is when all the tasks to be done have been completed, all incoming events handled, and the program's about to go back into an idle state waiting for the next user event.

Most of the times, this approach is spot on. Changes are stored internally and applied, and the changing of the screen provides a very clear signal to the user that it's time to interact again. Mentally, it's spot on. But that's most of the time, and just occasionally you may want an intermediate update. Take for example a GUI that's monitoring an ongoing process; you'll want to update the display even if no user input is expected should the monitoring reveal something's changed. So you can force an update using update_idletasks (that's the TkInter name) or update idletasks (Tk). Here's an example of a Python / Tkinter program that uses this technique - it (a) does an update, (b) sleeps for 2 seconds and (c) does another update. With the update_idleatsks() I have used, the changes appear with a gap of 2 seconds between them; without that line, nothing happs for 2 seconds after pressing the button then both changes appear.

  #!/usr/bin/env python
   
  import Tkinter as tk
  import time
   
  top = tk.Tk()
   
  def addText():
    # make first change
    oldText = L.cget("text")
    newText = oldText + '\nfirst change'
    L.configure(text=newText)
   
    # wait 2 seconds
    top.update_idletasks()
    time.sleep(2)
   
    # make second change
    newText += '\nsecond change'
    L.configure(text=newText)
   
  B = tk.Button(top, text ="Change text", command = addText)
  L = tk.Label(top,text='orignal text')
   
  B.pack()
  L.pack()
  top.mainloop()

Many thanks to my correspondent for triggering this question / post - I've modified his code to show how to change the GUI behaviour. Readers may have noticed a reduction in technical answers such as this one of late - partly because there's so much going on, and partly because we already have a huge resource of answers and can point people to them when asked about things. Just occasionally, I'm still posting new descriptions of issues such as this one to keep them fresh, modern and perhaps to give better answers than I have in the past

Posted by gje at 10:40 AM | Comments (0)
Related topics: via article database

Over a pound a kilometre - my bus in Weston-super-mare

I don't know whether to laugh or cry ...

My destination yesterday was 3.5 km - as the gull flies - from Weston-super-mare station. How can 3.5 km be quite for difficult?

Research ahead of time had told me that I wanted a No. 21 bus from Reva Road and had given me a map from the station to the bus stop. From a little prior knowledge, I didn't believe what I was being offered ...

... and indeed asking on a train forum elicited the response that the officially recommended route was odd and going all around, and I would be better to exit from the other side of the station, which is actually the main entrance.

And so to Weston. There's a poster in the booking hall that helpfully contains information about local bus routes, but it appears to reflext things as they were a time ago as the route I was to catch and where it went didn't match up. Never mind; what does the bus stop say? Well, as I stepped out of the station and before I got to the bus stop, a further sign usefully points to where various buses leave from except (uselessly!) it lists different route numbers and although it lists my destination, there's no clue about the magic "21" that I got from the online planner. Well - it tuns out that the bus stop I want is so close to the station that you can stnd under the end of the station awning to wait for the bus to arrive - and the bus stop itself was labelled with times and route number as per my online research. Comforting.

Our driver seemed suprised when I asked to buy a ticket - at a charge (it turned out) of £7.50 return for the 3km journey. But then I noticed that I was the only one paying. Everyone else who got on had concessionary bus passes, and no other fares were taken - so in effect I'm paying for them too through my taxes; it's my understanding that the bus operator receives a percentage (rumoured to be around 45%) of the "regular" cash fare for concessions - so that's a much more reasonable fare of £3.40 .

Did I say 3.5 km? The bus headed out to the see front in Weston, then round the 'burbs, past the hospital where it passed a competitor's bus, and back out to the main road behind the town. Heading south, we ignored signs to the destination I was headed for but carried on and turned through another village and into a series of little lanes. Coming to a more major road again, a sign pointed back towards Weston in quite the opposite direction from which we appeared. And so, more lanes. Passing a bus going in the other direction at the narrowest and most difficult place, and noting that the bus going in to Weston was full and standing.

30 minutes after leaving the bus stop at Weston-super-mare station, we arrived at the stop I was to get off at ... actually 5 km from where I wanted to be, as I had to walk back towards Weston by a mile of so to get to my meet up. I should qualify my criticism slightly and admit that the geography of the land is such that there isn't a direct road. But then there are much more direct routes than the one we took!

It's sad to see such high fares for those of us who aren't senior citizens. It makes it very hard to persuade others to use the bus rather than a car. But it's understandable when you realise that 50 seats taken on a bus (49 concessionary) with a public fare of £7.50 brought the bus operator £172.87 of income, whereas 49 concessionary fares at £5.00 and four times the number of public fares - 53 seats taken - would have brought in just £135.25

It's sad to see so much incorrect information for the newcomer. But then with bus timetables changing as frequently as every six weeks, it's hardly surprising that updates to information boards aren't always up to date. And many online systems are embryonic at best, and bus tracking through GPS is patchy in how well it monitors buses, and how it is presented to the customer. But then the important customers to the bus companies are the regular pensioners, paid for from the public purse and no longer able to drive physically or financially. Discuss ;-) ...


This gets even more amazing ... to quote (with permission) from my mailbag:

Dear Graham,

Couple of points of interest, both true but slightly on the absurd side...

Had you done the entire trip by bus from Melksham, it would only have cost you £7 for a First Day South West ticket. Number 272 to Bath, X39 to Bristol, X1 to Weston and then 21 to unspecified but relatively close destination. Altenatively, if you really have time on your hands, you could try 234 to Frome, 161 to Wells, 126 to Weston, and then 21 to unspecified blah blah blah...Done both myself with the dog, who travels free. As has been noted elsewhere, the key point is that the First Day South West ticket is accepted on the 21 but you can't buy it on there, due to it being branded "buses of Somerset" rather than First.,.

As for the quicker train/bus combo, you need not have paid £7.50 for a return bus ticket from Neva Road. Your destination would have been in First's Weston Area Zone - http://www.firstgroup.com/ukbus/bristol_bath/tickets/weston_super_mare/firstday.php - so you could have got a FirstDay ticket for £4.20.

However, this is where the fun really begins. Because, just as with the South West ticket, the FirstDay Weston ticket is valid on the "buses of Somerset" 21 service but not issued on it, you would have had to flag down a "true First" bus beforehand to purchase the FirstDay Weston ticket before using it in a perfectly valid manner on the "buses of Somerset" 21 bus...

Any queries I get, happy to forward to this authority who really knows his stuff - on my mentioning back that I don't want to waste an experts time ... "As for time, the answer to that query I knew off by heart anyway, so "wasted" time on my part was not an issue.". Wow!

Posted by gje at 08:35 AM | Comments (0)
Related topics: via article database

Well House Consultants Ltd.
Copyright 2014