Twitter and Advertising Standards

It’s a sign of the times that the UK’s Advertising Standards Authority (ASA) have acted against a Nike advertising campaign that used the Twitter accounts of two premiership football (soccer) players to send out links to Nike content. The issue that the ASA have is that it was not clear to users that the tweets were adverts and have suggested using the hastag #ad in the future to ensure that the were ‘obviously identifiable’ as adverts.

Whilst that simple solution may appease the advertising powers that be, I think Twitter are soon to solve the issue for marketers whilst monetising the practice of celebrities/power users/social media-ites “selling” their accounts to be used to send adverts or endorsements  Services like adly and sponsoredtweets have been around for some time and offers users with large follower counts the ability to make money in exchange for allowing advertisers to send endorsements on their behalf at any time.

Promoted tweets currently display the same account name as the account that posted the tweet and it seems a bit of a waste to display the same account name twice on a tweet, which makes me think that this has to be the next logical step for Twitter to monetise their platform. If it’s not they’re missing a trick as it not only acts as a revenue stream for them but also encourage users to use their platform.

Twitter could offer the service along side the regular promoted tweets to allow brand marketers the opportunity to use power accounts and be the first(?) social network that allows power users and celebrities (verified only?)  the ability to monetise their online presence (whilst simultaneously selling their soul to the social media devil).  Any tweets that have been posted as an endorsement (or an en-dorsey-ment if you will) would have a badge appended to it in the same way as promoted tweets but have copy that implies it is an endorsement on behalf of the brand.

Image

 @jack, @biz, @dickc – you can have the idea for free – but I want recognition for the use of ‘Endorseyments’.



When applying for a job

The Kernel ran an interesting piece on the state of the tech recruitment industry last week; one post highlighted some of the more questionable practices of recruiters. One of these ‘scams’ was adjusting candidates CVs which they shouldn’t do without getting the candidates permission, but I can understand why they might.  I’ve spent a good portion of time over the last two weeks going over the applications for our open positions at Knowsis. The hiring process is not something I enjoy and something that could have be made easier by the candidates thinking a bit for themselves.

If you’re applying for jobs, especially those of you who are just about to graduate, I’d suggest you make sure you think about the following:

1. Filenames

Don’t call it cv.pdf (or resume.doc) – you are asking for it to get lost/overwritten at the first step in the process. You may only have one CV on your computer but your prospective employer has hundreds of them on theirs.

Make sure at the very least, the filename contains your full name and even better the position you’re applying for.

2. Covering Note

Include one. Tell the employer why you want to work for them, how you found the job,  it will make you stand out. You’ll look less like someone who couldn’t be bothered and just fired off their standard CV that they send to everyone.

Make sure the covering letter is part of the same file as your CV. Having it as a separate file or only in the original email means it may get misplaced, forgotten about or ignored.

3. Tailor the CV for the job

As above, if you want to stand out make it look less like a standard CV that you send to everyone and more applicable for the position you are applying for.  Make sure the most relevant information that the employer mentioned in the job description is highlighted.

4. Length

Dont make your CV too long. Two or three pages should be enough to get the message across. If you have gone over remove the things that aren’t necessary or less interesting. Don’t make the prospective employer sift through all of your summer jobs since you were 16, if they aren’t relevant leave them out. Some other points:

  • Don’t use massive fonts.
  • Don’t use excessive line spacing, gutters and margins
  • Don’t include a photo that takes up 1/4 of a page

5. Add a Footer

Add a page number and your name to the bottom of every page. That way, if a page gets misplaced it’s easier to spot and doesn’t look like you disappeared without a trace for 10 years. It also means if a random page is found it’s easier to know where it came from without having to try and match up based on the formatting.

6. Hobbies

Unless it’s wholly relevant to the job, leave out the interests section. I honestly doubt that there are any employers would be sold on your penchant for ferret racing or samurai sword collecting.

7. Represent yourself on-line

If there are things you’ve left out of your CV following points 3 and 4, make sure they are still available online somewhere and include a link to it in your CV. There’s plenty of places you can create a professional profile such as LinkedIn which will allow you to maintain a full record of employment, recommendations and skills for anyone to see.  In fact if you don’t know how to create a CV you can fill out all your details on LinkedIn and use their resume builder to automatically format a CV file for you

Developers, create yourselves a Github account, use it to show some of the interesting things you’ve written or any open source projects you’ve committed to.

If you’re working in another digital profession it’s also sensible to have a portfolio of your work available for employers to see.

8. Lock down your social networks

This is just general advice really but make sure that your Facebook profile is only visible to your friends. Prospective employers are now regularly checking Facebook and other social networks to see what their prospective candidates are like in real life and whilst some employers probably wouldn’t hold it against you many others probably will.

 

Anything Else?

If there are any bug bears you’ve experienced whilst hiring that I have missed out, add it into the comments and I’ll update the post


pult – simple fuss free internet tv

I rarely get excited about technology these days, in fact I can’t remember the last service that launched which made me say “wow”, but Pult has done just that.

Coming out the recent Seedcamp and based in Tallinn, Estonia, the team at Pult, have created a really simple way to display video on an internet connected screen and then control it using a smart phone all without the need to install any software.  At the moment the content available is somewhat limited, but it’s not the content itself that that really interests me here, its the concept and the fact that this is all done in the browser, with no apps to install and no need for devices to support protocols like Apple Airplay or DNLA.

How It Works

Navigate to the pult.io website in the browser of your large screen (internet connected TV, PC, iMac etc) and you will be presented with a 4 character code

Pult setup process

Pult setup process

Now navigate to pult.io on your smartphone and you are presented with a different screen that allows you input the 4 characters shown on your large screen, via the connect button at the bottom.

Pult mobile device web app

Pult mobile device web app

And that’s it…. your phone is now connected through the magic of the internet to your large screen. So you can chose to display anything from the options presented. It’s just using websockets behind the scenes which in laymans terms means your large screen maintains an open connection to the Pult  servers, so when you tell your phone what to play it tells the Pult server and they tell your large screen.

Here’s a rather dull, sorry, video here demonstrating how it works:

And Now The Interactive Part

The code showing for my laptop right now is GDPC, as shown above, which means you should be able to play something on my screen using your phones. I’ll keep it open for most of today (1st March 2012) unless I get sick of being Rick Rolled

UPDATE – My code is actually now AEQT as I closed my browser.


Torrenting vs Buying according to the Oatmeal

I love The Oatmeal and this is another perfect way to sum up my views on movie dowloads..

Torrenting vs Buying courtesy of The OatMeal

Torrenting vs Buying courtesy of The OatMeal


Locked yourself out of Jenkins?

Removed all permissions from your account did you? Save it did you?  Feeling a bit stupid?

Yeah, me too!

First steps

SSH to your server and stop Jenkins

/etc/init.d/jenkins stop

Now modify the config XML

sudo vi /var/lib/jenkins/config.xml

You now have two options to regain access

Yeehaw way

Turn security off and remove the <authorizationStrategy> node

<useSecurity>false</useSecurity>

Now restart Jenkins and head over to your admin UI to resecure it quick before the trolls get in.

/etc/init.d/jenkins start

Like a boss way

If you want to be safe and not open up a security hole at all, you can add the security permissions into the config XML manually. Just replace USERNAME with own

<authorizationStrategy class=”hudson.security.ProjectMatrixAuthorizationStrategy”>

<permission>hudson.model.Computer.Configure:USERNAME</permission>
<permission>hudson.model.Computer.Connect:USERNAME</permission>
<permission>hudson.model.Computer.Create:USERNAME</permission>
<permission>hudson.model.Computer.Delete:USERNAME</permission>
<permission>hudson.model.Computer.Disconnect:USERNAME</permission>
<permission>hudson.model.Hudson.Administer:USERNAME</permission>
<permission>hudson.model.Hudson.Read:USERNAME</permission>
<permission>hudson.model.Hudson.RunScripts:USERNAME</permission>
<permission>hudson.model.Item.Build:USERNAME</permission>
<permission>hudson.model.Item.Configure:USERNAME</permission>
<permission>hudson.model.Item.Create:USERNAME</permission>
<permission>hudson.model.Item.Delete:USERNAME</permission>
<permission>hudson.model.Item.Read:USERNAME</permission>
<permission>hudson.model.Item.Workspace:USERNAME</permission>
<permission>hudson.model.Run.Delete:USERNAME</permission>
<permission>hudson.model.Run.Update:USERNAME</permission>
<permission>hudson.model.View.Configure:USERNAME</permission>
<permission>hudson.model.View.Create:USERNAME</permission>
<permission>hudson.model.View.Delete:USERNAME</permission>
<permission>hudson.scm.SCM.Tag:USERNAME</permission>

</authorizationStrategy>

Now restart Jenkins and sit back with a smug grin.

/etc/init.d/jenkins start

Smug Croissant Guy

Smug Croissant Guy


Setting up a Jenkins build server on EC2

In my last post about setting up Jenkins I looked at how to do a basic Jenkins setup on an Ubuntu machine. In my case I set it up on an old machine which is fine when I’m working at home but if I make changes when I’m not at home or when my build machine isn’t running the changes are not built and tested. If you hadn’t worked it out, in a proper continuous integration environment you should be running your builds continuously. So this morning I set out to get an EC2 instance running Jenkins.

The other reason I wanted to have the build server running continually is that I need to start scheduling some jobs for Knowsis to do the NLP part of our process., which I could do with Cron, but buildservers liike Jenkins and Teamcity offer really flexible scheduling and a nice interface for feedback so I don’t need to worry about building one myself, for now.

Setting up an EC2 instance

The first step in the process is to set up your EC2 instance. Amazon kindly provide a free tier so you can get a free micro instance for a year. This should work for you initially if your builds aren’t overly complex.

I won’t run through exactly how to get your instance running as you can find plenty of guides online, if you are completely new to EC2 I would recommend this guide provided by Amazon.

One thing to note is that you should make sure you set up the security group for your image to allow all traffic on port 80 so you can actually see Jenkins.

Installing nginx

In my previous post I mentioned setting up nginx to route requests to Jenkins  but didn’t cover it. So we’ll go though it here as we need a webserver running to host the requests coming through.

We’ll need to use YUM here as apt-get and aptitude aren’t installed. Thankfully the Amazon package index includes a version of nginx.

yum install nginx

Once installed we should start the nginx server to make sure that we can see our new EC2 instance before proceeding.

sudo /etc/rc.d/init.d/nginx start

You should be be able to hit your instance in a web browser. You can get the public hostname of your instance from the AWS management console, but it should look something like this:

http://ec2-XX-XX-XX-XXX.compute-1.amazonaws.com/

Installing Jenkins

In my previous post we used aptitude to install Jenkins but the Amazon Linux AMI doesn’t have the aptitude package manager, s owe have to use YUM instead.

First we need to add the repository to the list of YUM repos:

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo

and then get the GPG key:

sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

then we can install Jenkins:

yum install jenkins

The installer will install the server as well as create jenkins user under which the service will run. You can now start the jenkins service:

sudo /etc/init.d/jenkins start

As Jenkins runs on port 8080 by default, the next step is to get nginx to proxy all requests on port 80 to port 8080. You could probably just change Jenkins to run on port 80 by default if you wanted. Anyway, just change your nginx config (/etc/nginx/nginx.conf) so that the server section reads as follows:

server {
listen 80 default;
server_name _;
location /{
proxy_pass http://127.0.0.1:8080;
}
}

I won’t go into the details of nginx setup, but this is the minimum required to get you to a point of having Jenkins working.

Make sure you restart nginx to take account of the config changes,

sudo /etc/rc.d/init.d/nginx restart

You should be be able to view the jenkins homepage in a web browser using the same url as before:

http://ec2-XX-XX-XX-XXX.compute-1.amazonaws.com/

Security

One of the topics mentioned but not covered previously was security. As your build server is now visible publicly, you will want to set up some sort of security to prevent people from doing bad things.  The simplest way is to use Jenkins own user database, but there are other options to use an LDAP server or the underlying OS users. A few points to make sure that the server is secure:

  •  Disable the option to allow new users to sign up (unless you actually want people to be able to signup)
  • Change the authorisation section to either allow logged in users to do anything or use matrix based security and make sure anonymous users have no permissions

Setting up builds

You should refer back to my previous post on how to get your builds set up.7

Let me know how you get on


Don’t stay out of my territory

I’ve just finished watching Breaking Bad seasons 1&2 on Netflix to find that the third season has yet to air in the UK despite the fourth season having already aired in the US and the fifth and final season being due to air later this year, it’s also not available on physical release presumably the studio are waiting for someone to buy the rights to air it on TV before releasing for physical distribution.

This kind of s**t makes me angry when we have the TV and film studios trying to get the US government to introduce futile laws that aim to impede their customers from trying to enjoy the content that have produced. Yes studio people, they are the customers, they are the people who actually want to watch it, the people who enjoy the programming that you make and commission; they aren’t downloading it to ruin your business or to profit from it – ok a few might be, but they are profiting from the fans who can’t legally get hold of the content that you made for them to watch. Don’t get me wrong, I think copyright theft is bad, I believe that everyone should be paid for what they make/do; my point is that if the content is harder to get legally than it is illegally then people won’t make it hard for themselves. In fact, this tweet sums it up nicely:

I’ve spoken about this before, but it still surprises me that the TV and movie studios have yet to realise what the music industry learnt after requiring DRM on their content for so many years (it was around 5 years after the launch of the iTunes store before DRM was dropped across the board). If it’s easier to get the content people will pay for it. It’s 2012, the problem isn’t a technology one, it’s a human one, it sits with lawyers and executives, the kind of people who don’t have a clue what the internet is and think it’s just for ‘geeks’, the same kind of people that wanted to push SOPA and PIPA through.

It got me thinking that if the UK’s TV channels weren’t going to license the films or tv shows that some many people want to watch, maybe it could be possible to crowd-fund the licensing of this kind of content in a kickstarter fashion. If a streaming service was set up in such a way that all interested parties could register their commitment to certain TV shows and movies and agree an amount that they would be willing to pay to watch it, maybe we could buy it as a cooperative and then stream it beyond that point. Although the problem here is timing, I imagine it would take much longer to get enough interested parties and then negotiate the license agreements with the studios in which time everyone has got it quicker off of MegaUpload BTJunkie Pirate Bay. I’m interested in hearing people’s thoughts on this idea though.

And for those that haven’t seen Breaking Bad it’s well worth watching


Continuous Integration for Python

After beavering away at some ideas for Knowsis over the last 3 weeks and admittedly not really doing it test first , I spent this weekend finally getting round to setting up a CI server and some builds to run the pitiful number of tests that I have actually written to try and make me write more. It’s been bugging me all along but as the only developer at the moment it’s not been at the top of the priority list. However, my previous experience of setting this kind of thing up for legacy projects tells me that if I don’t get round to it soon, it will be infinitely more painful in the long run.

At 7digital we used Teamcity as  our CI build server, but knowing how much their build agent licensing can cost I thought I would look at the open source alternatives seeing as we’re bootstrapping. After some research a nailed it down to the either BuildBot or Jenkins (formerly Hudson) and digging a bit deeper it seems that people with experience of both would suggest using Jenkins first until you realise it can’t do something that you really need BB for as it can be quite painful to get set up; Jenkins on the other hand is very simple to get set up.

Jenkins CI Dashboard

Installing Jenkins

One of my favourite things about using Ubuntu, coming from a Windows background, is the ease of installing things using apt-get. These instructions are taken from the Jenkins site:

wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo aptitude update
sudo aptitude install jenkins

Jenkins gets installed and set up to run as a daemon at startup under a newly created user Jenkins. It’s now usable at http://127.0.0.1:8080, however I wanted to be able to skip the need for a port number so set up nginx to proxy requests for me. This isn’t a necessary step so I won’t go into it here but there are some simple guides available on line if you haven’t used nginx before (just remember to restart nginx after you change the config, it’ll save you hours of head scratching!).

Setting up Jenkins to work with git

This step isn’t necessary if you don’t use git, but i’ll go into it as I do and it took me a bit of figuring out, plus there wasn’t a huge amount of info out there on how to do it.

From the home screen of Jenkins go to the plugins section:

Manage Jenkins -> Manage Plugins

In the Available tab find the “Jenkins GIT plugin” and check the install checkbox. If you use github you can also install the “GitHub plugin” which creates a link from your project page to your github repository and also allows you to use GitHub’s post receive hooks to notuify Jenkins when code has been committed (not necessary as you can use polling to check for changes). Your Jenkins instance will need to be exposed publicly for this to work, so make sure you set up user authentication properly; there’s also a plugin to allow you to use your GitHub logins as authentication if you want to use that.

Once you have selected the required plugins click ‘Download now and install after restart’ which will install the plugins and restart Jenkins, should take no more than a minute to complete.

Create SSH keys for Jenkins

You now need to set up your ssh keys for the Jenkins user. Open up a terminal window and switch to the Jenkins user

sudo -su jenkins

You can run through the creation of your public private key pairs as normal which will be created in the Jenkins user home directory (/var/lib/jenkins). If you want a guide for this, I have always found the one on the GitHub site help pages to be the easiest to follow.

Now set up a user with your git repository for your build slaves to run as and copy the contents of the public key to it. You can use your own account if you wish but I would recommend using a separate one.

Creating Jobs

Creating a Job in Jenkins is really simple. From the Jenkins dasboard click “New Job”. Enter the name of your job and select “Build a freestyle software project“. Click Ok.

For now you can ignore the options at the top of the next screen, head  down to the source control section.

Source Code Management

If you installed the git plugin you should see git as an option here.  Select the option that’s relevant and point it to the location of your repository.

Build Triggers

Further down is the “Build Triggers” section, you should select the option ‘Poll SCM‘ option, this will then present you with a schedule box that will allow you to enter the frequency to poll your SCM, it uses the cron format. A few examples

Every minute:

* * * * *

Every 10 minutes:

*/10 * * * *

Every hour :

@hourly

At 15 mins past every hour:

15 * * * *

Build Steps

So far the job will just checkout when there are any changes to your code, so now you need to make the job actually do something interesting. You can set up one of more build steps to run for your unit tests, tp deploy your code to a test environment, run your system tests, deploy your code to live etc.

At this point i’ll just run the unit tests. If you have written some tests using unitest syntax you can use the nose test runner (nosetests) to automatically discover and run these tests. You can also get it to output the test results in Junit report format so that Jenkins can display your test results. You will need to make sure that nose is installed on your build server and slaves for this to work.

Select “Excute Shell” in the “Add Build Step” dropdown and add the following line:

nosetests --with-xunit

The shell script will run from the top level of your project (known as the workspace root) so if nose cannot auto discover your tests because they are buried in a folder tree structure you can always add a cd command to switch to that directory first. The  –with-xunit switch will output an xml report in the Junit format called nosetests.xml into the folder under which nosetests ran.

In the Jenkins set up there is a “Post-build Actions” section under which you should select “Publish Junit test report results” and enter nosetests.xml

If you use some other test format or want to use another test runner enter the shell command that would execute those tests remembering to install anything required onto your build server as well.

Now Go And Write Some Tests

That’s it, you now have a build set up to run your tests every time you check in changes, so there is no excuse not to write any. This is only a start and there a plenty of other things you might want to set up like failure notifications, test reports, dashboards etc so the best thing to do is explore the Jenkins site.


Lovefilm vs. Netflix vs. Sky Movies vs. Blinkbox

I love watching movies. I could quite happily sit and watch 2 or 3 back to back on a Sunday as long as the F1 isn’t on. I’ve been a Sky Movies subscriber since getting Sky about 5 years ago and was always pretty satisfied with the service. In late 2010 Sky launched a partnership with Xbox which changed the game completely as it meant I now had access to 100’s of on demand movies at no extra cost.

The improvements to the Xbox dashboard released in December (2011) to include apps from third party movie streaming services such as Blinkbox, Lovefilm and as of today Netflix has drawn to my attention to the possibility that I could get rid of my £16 per month Sky Movies Subscription if it could replace the quality of service currently offered by Sky. Whilst the £4.99/£5.99 price point seems pretty convincing I was interested to see exactly what movies each of the services had available and which movies they were missing. In a recent article I read that Netflix had negotiated exclusivity deals on new movies with Lionsgate and MGM so it would be interesting to see how much the catalogues actually differed.

I don’t have time to do a full cross reference (although I was tempted to script something up to scrape them) so I’ve chosen a selection of more recent films that I know have been made available for online streaming and a selection of much older films. I have checked each film on Sky Go, Lovefilm and Netflx as well as on Blinkbox which is not a subscription service but I thought was a useful comparison for streaming library completeness. I have ignored Lovefilm offerings where they are available on DVD but not for instant streaming.

Lovefilm Netflix Sky Movies
Blinkbox (pay per view)
New/Recent Movies
Super 8 NO NO YES YES(£3.49)
Cowboys and Aliens NO NO NO * YES(£3.49)
Rise of Plant of the Apes NO NO NO * YES(£3.49)
Twliight NO NO YES YES (£1.99)
Harry Potter (8) YES(£3.49) NO NO * YES(£3.49)
The Hangover YES NO NO ** YES (£2.49)
The Hangover 2 YES(£3.49) NO NO ** YES(£3.49)
Four Lions YES NO NO** NO
Old Movies
Harry Potter (1) NO NO NO ** YES (£2.49)
Plant of the Apes (1968) YES NO NO NO
The Godfather NO NO YES YES(£1.99)
The 39 Steps NO YES NO YES (FREE)
Blair Witch Project NO YES NO NO
Con Air YES YES YES NO
Home Alone NO NO YES NO
Being John Malkovich YES YES YES NO
An American Werewolf in London NO YES NO YES(FREE)
Unlimited Streaming Subscription Price per month £9.99 £5.99 £16.00
N/A
* available on demand. £3.99 each
** were previously available

As we can see Netflix has pretty poor coverage at the moment compared to Lovefilm in terms of newer releases while Netflix seems to be better in terms of back catalogue. Out of the three subscription services Sky has the best coverage across the board, one limitation of the Sky Go service is the total number of movies that they have available at any one time which does change regularly, I have marked those movies which I know that I have watched on Sky Go on my Xbox previously. The Blinkbox pay per view model would work out expensive to watch 10-15 movies a month although they do have a large selection of free movies available – the quality of which does vary. Blinkbox also announced today that they were making streaming available for free on some titles if you buy the DVD in Tesco stores and provide your clubcard details (Tesco own Blinkbox).

I’m not planning on moving away from Sky yet, but it will be interesting to see how this pans out over the next few months and whether Netflix start to strengthen their catalogue with more studio deals. Meanwhile Lovefilm’s new owner, Amazon, will be sure to strengthen their streaming business in light of the Kindle Fire potentially getting a UK release later this year.

UPDATE – Blinkbox have got in touch to say that some of the movies that were marked as unavailable are actually available. I’ve updated those that are available to stream (some are only available to purchase)


My Datsusara Journey Begins

Datsusara (脱サラ) is the Japanese term used to describe leaving life as a salaryman and moving on to do something completely different. It’s not used in the case of moving for more money, out of boredom or due to termination of employment; it’s used to exemplify the act of pursuing a childhood dream or having a moment of inspiration that leads to a completely different career path.

As you may have worked out by now, this post is about me moving on from my current role as Product Manager at 7digital after almost 5 years there to start a company, Knowsis, with two friends . The reasons for me leaving are very much in line with the principles of Datsusara – starting a company is something I’ve wanted to do for a long time and a few things have happened recently which have made me realise that there is never going to be a right time to do these things and we need to get out there and Just Do It™ 

Oh, and if anyone has a spare meeting room or some desk space in Central London that we can borrow for the whole day on Wednesday this week it would be much appreciated.