Link

Free Grammar Checker

I stumbled across Grammarly, I actually think it was a Facebook Ad of all things. I liked the idea of adding the Chrome browser extension because it would mean that I could use it for nearly everything that I do day to day.

So far my experience has been good and so I thought it would be worth a share!

Grammarly makes sure everything you type is easy to read, effective, and mistake-free. Try it today:

Source: Free Grammar Checker | Grammarly

Get remote laravel log file

By now you are deploying your web applications via some sort of magic like Codeship and have probably decided to turn FTP off on your servers. Either that or you are using Forge and the only way you can get at your production server is via SSH.

If you want to run migrations on your production server then you can SSH in or maybe have an Envoy command to do this. However, what happens if you need to review your production log files from your Laravel app but you cannot just FTP in and download them.

At first I thought about doing it via Envoy but I could not get my head around how to use the ‘scp’ command. I ended up setting an alias to do it from my local machine using

alias get-amazing-com-log=”scp username@server.com:/home/web/amazing.com/app/storage/logs/laravel.log ~/Projects/amazing_com/app/storage/logs/”

Then I thought, how about a quick Laravel Command to do something like

php artisan logs:get

To do this we are going to make use of the SSH Class in Laravel, specifically SFTP Downloads. For us to be able to use this class we need to set some remote configurations.

To get started we need to go to ‘/app/config/remote.php’ and add the settings for your remote server, in this example we will set them for our production server.

<?php
// app/config/remote/php
'connections' => array(
    'production' => array(
        'host' => $_ENV['SSH_HOST'],
        'username' => $_ENV['SSH_USERNAME'],
        'password' => $_ENV['SSH_PASSWORD'],
        'key' => '',
        'keyphrase' => '',
        'root' => '/home/web/amazing.com',
    ),
),

You will notice that the only thing we actually set in this file is the ‘root’ as everything else is extremely sensitive so we are going to set those configuration items using “dot” files.

<? // .env.local.php return array( 'SSH_HOST' => 'server.com',
'SSH_USERNAME' => 'deployment',
'SSH_PASSWORD' => '53curep455w0rd',
);

Once we have the configuration setup then we are ready to setup our new Artisan Command.

<?php
// app/commands/GetLog.php

use IlluminateConsoleCommand;
use SymfonyComponentConsoleInputInputArgument;

class GetLog extends Command
{

    protected $name = 'logs:get';
    protected $description = 'Connect via SSH to the given remote environment and download log file.';

    public function __construct()
    {
        parent::__construct();
    }

    public function fire()
    {

        $this->info('Stand by...');

        try {

            $env = $this->argument('env');
            $app_log_path = '/app/storage/logs/laravel.log';
            $remote_log_path = Config::get('remote.connections.' . $env . '.root') . $app_log_path;
            $local_log_path = dirname(__FILE__) . '/../storage/logs/' . $env . '.log';

            SSH::into($env)->get($app_log_path, $local_log_path);

        } catch (InvalidArgumentException $e) {

            $this->error('Check you have settings for app/config/remote.php connections.' . $env);
            exit;

        }

        $this->info('Environment : ' . $env);
        $this->info('Connected to ' . $_ENV['SSH_HOST']);
        $this->info('Getting file from : ' . $remote_log_path);
        $this->info('File downloaded to : ' . $local_log_path);

    }

    protected function getArguments()
    {
        return array(
            array(
                'env',
                InputArgument::OPTIONAL,
                'Environment to get the logs from set in app/config/remote.',
                'production'
            ),
        );
    }
}

And remember to register this command so you have access to it when running Artisan on the CLI.

<?php

// app/start/artisan.php

Artisan::add(new GetLog);

And there you have it. Now you can run a simple Artisan command from your local machine or from within your Homestead VM and it will connect to production, pull down the log file and store it in ‘app/storage.logs/production.log’.

You’re welcome.

Clicksco PHP Flow

This is the general flow in the PHP family at Clicksco. As of June 2014.

As an international company the general business relies a lot on email, Basecamp and Skype however as a tech team we have an arsenal of different tools and services we use and I would like to share our processes with you.

Instant Messaging and Beyond

We used Campfire for a long time; however more recently have moved to HipChat. Everything, and I mean everything, is centered around HipChat. We have rooms for general discussion, Design, Frontend, internal frameworks, PHP, .NET, Laravel, Music, Infrastructure Management, Project Management and the most important rooms of them all, project rooms.

Like GitHub, we like to centre everything possible into project rooms and have Clickbot (our version of Hubot) running in all rooms. Although we do not rely on Clickbot as much as GitHub relies on Hubot, we do rely heavily on the ethos that if it is not in a project room then it is not happening! Most of the team have the HipChat app on their mobile so if they are away from their desk and you @mention them in a room they will get a notification. It is then up to them how and when they respond.

Source Control & Project Management

As a company we use BitBucket as our central remote repository solution; however in the PHP family we have our primary remote repository (origin) set to a Codebase repository. Codebase classes itself as “Professional code hosting, with a complete suite of project management tools built-in.” Every project we work on has a Codebase project and that project may have one or many repositories. The most used feature in Codebase is the ticketing system, which we use to assign features, enhancements and bugs to members of the family. We then set ticket priorities and can give them relevant tags. Each Codebase project is then linked to a HipChat project room so that we get notifications on commits, ticket creation and ticket updates.

Agile Software Development

We follow the basic principles of SCRUM and so our day starts with a standup outlining what we worked on yesterday, what we have planned for the coming day and highlighting anything that is blocking progress. The standups are quick and done via Google Hangouts (because HipChat does not yet support team video chat).

Communication

Throughout the day HipChat is always open and is our central communication tool throughout the entire tech team, not just the PHP team. With the recent launch of individual video calling in HipChat we frequently have one to one calls to discuss ideas, issues and problems. HipChat also allows us to share our desktop screen with the other caller. Although we do use HipChat for this, we also frequently use Screenhero which has the added feature of allowing live collaboration. It is sometimes much easier to just let the other person click and type. Usually a request for a video call or screen share will be done in a project room in HipChat so itis nice to have the new ‘/hero @jamesmills’ command for HipChat which will open a Screenhero session with the user specified.

Source Control Workflow

All the tech teams at Clicksco use Git and in the PHP family we follow GitHub Flow. We all work on branches which are synced remotely on each commit. Once we are happy with a new feature or a bug fix, we create a merge request in Codebase and set one of our fellow family members to be the person responsible for the merge. This brings us nicely onto one of the most important steps in a projects lifecycle: Code Reviews. Every line of code committed will get reviewed by at least two developers. Code reviews are a fundamental part of our process. A code review helps to bring our team together, widen knowledge, pull everyone to the same level, give a sense of ownership and achievement, catch bugs, discover new feature enhancements and possible refactor opportunities.

Deployment

Deployment is always an interesting subject and I still find it staggering that in 2014 people are using FTP to download/upload files manually. For the situations where we have to use FTP to deploy to server we have a DeployHQ account (by those nice people at Atech Media). Our main deployment tool at the moment is Codeship. Codeship is proving to be an amazing tool and I would recommend you to try out their service, they have a free plan.

Once something is merged into the master branch, Codeship takes over. Codeship will run tests on all branches. If the merge is made on the master branch and all the tests pass, then Codeship will then run custom deploy scripts. As we have a number of projects deploying to a number of servers we keep all our deployment scripts in source control.

Obviously, whichever tool is being used, everything is set to report back to the project room in HipChat. You can literally see the commit, merge, test status and deploy result just by sitting in the HipChat room.

Bug Tracking

Once a system is running live on production we make use a service called BugSnag which reports any errors and exceptions on a given environment. For example, if an exception is thrown, then BugSnag will pick this up, automatically create a ticket in Codebase and notify the project room in HipChat. A member of the team will jump on the ticket, update its status, create a branch, commit code, merge request the branch and code review will take place. The merge will get approved, deploy will kick in, ticket will automatically get updated with ticket reference in the commit message and every single step will get logged via notifications to the project room in HipChat.

Communication tools and keeping up-to-date

We also have rooms in HipChat to discuss things like Laravel. Having things like new Laravel.io podcasts and new lessions on Laracats all fed into a central location is all part of the ethos so we use Zapier to monitor RSS feeds and post notifications into the rooms when something new is released. We are working on getting Clickbot to help us with this.

Is this the only way?

No, not by any means. I wanted to write this blog post to share what we do in the PHP team at Clicksco, at the moment. One of the main reasons I added the month and year at the start of this post is because there is no way of knowing when it will be outdated, probably as soon as next month. We have got to this stage by having a great team who are always bring new tools and services to the table and are willing to try new things. The key thing is that there is a method, there are principles and a procedure. Everything and everyone is open to change, but if you do not have an established process in the first place, you have no process to improve.

We also have a site that documents our flow and our tools that is available to view at http://php.clicksco.com. Please let me know your thoughts in the blog comments.

Conclusion

So that is about it. A brief summary of what we use and how we use it. As I am sure you have established, there is one tool that is a hub to all our activities. Having HipChat, although anything like Campfire or Slack would work, as a central hub has proven fundamental to improving communications and efficiency in the PHP family at Clicksco.

Why the emphasis on a central notifications hub like HipChat? Anyone, at any time, from any location, can go into any project room and know exactly what is happening. You can scroll through the room history to quickly get up to date and you can see live updates from everyone and every tool we use all in one place.

Soon we will be able to use Clickbot to issue more commands from within HipChat, heck we might be able to just all work from within HipChat.

Clicksco are looking for awesome people, are you one of them?

Dubai-based Clicksco employs more than 200 people in nine offices and six countries. It has a turnover of some US$100 million and serves more than 11 million customers per month through its network of comparison shopping, B2B, ecommerce and travel websites.

The technical arm of Clicksco is based in Middlesbrough in the UK and we are looking for new people to fill the below opportunities:

  • Product / Project Management
  • Front End Development / Inc Word Press
  • .net c#
  • Design
  • iOS
  • Android
  • PHP

If you are interested then please contact us@thap.co.uk

JetSetMe, IFTTT & Personal site

live.jamesmills.co.uk has been an ongoing experiment for a while now. It needs a little bit of an update but if you read the about page you should get a good idea of how I have it setup.

I recently updated my personal site (just a quick tidy up really) and I noticed I display where I am based but I am not always actually in that location. Thinking back to a recent update by IFTTT in which they announced a partnership with JetSetMe I started to think of a way I could show this information without having to actually update this myself.

I setup the JetSetMe channel in IFTTT. The JetSetMe service is something O2 are experimenting with which allows you to do things when O2 spot that you have arrived in a new country.

When JetSetMe picks up a new country IFTTT get triggered. I have IFTTT store data in JSON format in a file in Dropbox (you can see the recipe here). I then have a CRON job running on my server which opens this file periodically and saves all the data to a database which live.jamesmills.co.uk uses. This is basically how all the data on live.jamesmills.co.uk is generated.

I then have a very simple API on live.jamesmills.co.uk which gives me access to this data which means on jamesmills.co.uk I can show where I am currently located.

 

 

Open a php project in PHPStorm using Alfred

I have been using PHPStorm for a while now and after the recent release of version 5 (seems to be much faster) I am sticking with it for the foreseeable future.

I have also been using Alfred for a long time too. I purchased the Powerpack to get access to some of the more advanced features and have never regretted the small expense.

Today I found out Syd Lawrence has built an awesome plugin called Alfred Dev Doctor which helps developers find the correct documentation whilst coding. It needed Alfred v2 and the Powerpack.

I did not know there was a version 2 avaliable so I immediently downloaded the new version. Unfortuntly I then found out that my licence key for the version 1 Powerpack did not work with version 2 so I had to upgrade my Powerpack licence. The upgrade was a small fee of £10, worth it in my eyes. Since 14 May 2012, I have used Alfredapp 6,591 times, which is an average 20.9 times per day.

Since I had the all new singing and dancing version of Alfred and the Powerpack I began looking at other things I could get him to help me with. For months I have been trying to get Alfred v1 to open a folder with PHPStorm. I was never able to get this working. Luckily in Alfred v2 this was easy.

I have created a Workflow in Alfred which allows me to hit ‘alt+space’ then type ‘phps’ and then type a folder name to find it. Once it has found it I simply hit enter and it will open that folder up in PHPStorm. Yay!

A video of this working can be found here: Video showing Alfred opening a folder in PHPStorm

You can download the Workflow here, unzip and double click to install: PHPStorm Alfred Workflow

Dribble.com account up for grabs

Howdy!

I have had a Dribble account for a while now and have never really used it. As I am not planning on doing any design work in the future I would like this account to go to a good home. I understand they are still in high demand. It is a full account.

I sent a Tweet out last night to see if anyone was interested and it would seem a few people are. Now I am left with the dilemma about who to give it to. I thought that I would run a little competition. It will be focussed around Twitter using the hashtag #IWJDA (I Want James’ Dribble Account).

All you have to do is send a public tweet which includes the hashtag #IWJDA and a link to this blog post. In your Tweet you have to include something that will convince me that you should be the one to take my Dribble account over. It can be anything, a link, a picture, a sentence or anything you want! I will pick the winner at 15:00 on Thursday 14th February.

Have fun 🙂

 

Does anyone in Teesside creative industry really give a monkeys?

I have been reluctant to make this post for fear it is going to sound negative so let me set one thing straight right from the start…

  1. Teesside creative industry is huge and is still growing.
  2. We have some of the most creative minds in the North East.
  3. We have one of the best Universities in the UK outputting bright graduates year after year.
  4. We have a thriving community where people are willing to collaborate on projects, share knowledge and experiences.
  5. We have the most successful networking event for creative people that Teesside has ever seen! The last event attracted more than 60 people.
  6. We are home to some very successful creative companies, agencies and start-ups.

For those who do not know me, I am a web developer working for Thap in Middlesbrough. I am a graduate of Teesside University. I have worked in Teesside since graduating and live in Thornaby with my wife Fiona who was born in Middlesbrough. However, I am not from this area. I was born in York and bought up in Leeds. I came to Teesside to attend University. So why am I still here and why am I so passionate about the local creative industry?

About three years ago, I was working for a creative company in Stockton. We were just starting up and I was a sole developer working in a three-man team. I started to look for events I could go to meet other developers in my position. I wanted to talk about the technical aspects of the projects I was working on in order to get others opinions on the way I was going to approach them. I found myself having to travel to Newcastle to attend events because there was nothing in Teesside. This frustrated me because I knew that Teesside was marketing itself as a ‘digital hub’.

I started to speak to the few contacts I had at this stage. I did some research and stumbled upon Refresh Cities. Refresh is a community of designers and developers working to refresh the creative, technical, and professional culture of New Media endeavours in their areas. They promote design, technology, usability, and standards. Their manifesto fitted what I was looking to achieve therefore I decided to launch Refresh Teesside and the first event was held on Thursday 2nd April 2009.

Attendance was good. However three years ago it felt there was an unhealthy attitude towards networking in Teesside and this seemed to impact on who could get involved. Refresh Teesside is not and was never about pure networking. I leave what I class as ‘pure’ networking for the likes of BNI and events like that. I am personally not keen on ‘pure’ networking events although they do have their place. What I was interested in creating was an event which was relaxed, informal and welcomed people of all levels from any sized business in the creative sector. However, in 2009 it appeared that business owners were reluctant for their developers to go to these sort of events because they feared other businesses would poach them. They also seemed to worry that they might talk about projects they were working on and other businesses would then poach their clients. In my opinion this is totally unjustified. Although the event in 2009 was successful, the negative atmosphere meant I decided not do another event at that time.

Three years later my position had changed. I had made new connections in the region and once again it became apparent that there was still a gap in the market for an event like Refresh Teesside. I felt frustrated with hearing that Teesside is a ‘digital hub’ and that we were on the same level as Newcastle, Leeds & Manchester. In my opinion, we are not on the same level as these cities and I doubt we ever will be. That’s not a negative thing as I actually don’t think we need to be like these cities.

When I re-launched Refresh Teesside, I opened the event in February with this:  “People keep talking about Teesside being a creative hub. Have a think about that. Now think about Newcastle, Leeds and Manchester. Do you still think we are a creative hub?” This is a thought provoking statement. Teesside is an area which has lots of people saying Teesside is a creative hub but doing very little to promote the talent we have and boost collaboration in the region.

I re-started Refresh Teesside to combat these issues and create one well -known brand to represent the creative industry in and around Teesside. Refresh aims to give people a voice and a focus. It appears that people are keen to help make this happen. Each monthly event attracts more and more people, with sponsor’s being keen to support the event.

What Refresh Teesside is and what we promote:

  1. Give people an event to network with other people who are running businesses in the creative industry.
  2. Provide a relaxed, unthreatening atmosphere for people to share problems and solutions to every day problems.
  3. Allow people to connect and calibrate on projects to use the skills we have locally.
  4. Allow freelancers to make contacts with established businesses.
  5. Give graduates the chance to speak with the regions leading figures in the industry to help boost their confidence and improve there chance of winning a job they want to apply for.
  6. Create a brand that groups all things creative together for the creative industry in Teesside so people know where to go for news and to find professionals.

News of Refresh Teesside is spreading every day. People are realising the true potential of being part of something so fresh. I really hope that others in the region will work with Refresh Teesside to help promote what we have and help connect more of the talent we already have in and around Teesside.

I have a number of success stories which I am in the process of collating to produce a fact sheet on how Refresh Teesside is doing positive things for the creative sector in the region. Refresh Teesside has helped people find jobs, helped connect freelancers with opportunities and helped keep business local.

The future for Teesside’s creative industry is very bright; however even after campaigning and running events for the past 12 months we are only just starting to make a difference. Starting early next year I will be announcing a Refresh Teesside Board. At the time of writing it will consist of three people passionate about making a difference: Matt Kirwin, Chris Scott and myself. This is a true testament to where Refresh Teesside is today and reflects all the hard work from everyone involved and everyone who has ever attended the event.

Please help promote Refresh Teesside and what it represents. Let’s start to pool resources and start to make a difference under the already established, trusted and respected brand of Refresh Teesside. Teesside has something huge to prove and it is by no way unachievable.  If we promote the talent that we have, people will start to see what we have to offer. If we work with one another to produce the first class work we are all capable of peoples’ heads will start turning and people will start to look to Teesside as well as Newcastle, Manchester and Leeds. “Let’s gather great minds, share all of our knowledge, all grow and learn, promote local talent, be more than we think can be, make our cities better” and turn Teesside into the digital hub we all know it can be, together.

So to answer my original question, why am I still in Teesside and why am I so passionate? I am really excited about what’s happening. Every time I think about where Teesside will be in the next 12-24 months I think about us being a true powerhouse where people recognise the talent and enthusiasm we have to produce outstanding work. People are coming together, getting to know one another and sharing one voice. I have a feeling I am not the only one who goes home after a Refresh Teesside event energised and ready to take myself and Teesside to the next level. Come joins us!