Roger Stringer   About ▾

I'm Roger Stringer, a DevOps engineer, developer, author, foodie, speaker, dad. Founder of Flybase.

iPad Pro Space Sizes


I noticed something interesting with the iPad Pro, last year, Apple more or less eliminated the 32 GB models in favour of 16, 64 and 128 GB models. Until this week, 32 GB iPads were only available with the older model iPad Air and iPad Minis.

But, this week, with the iPad Pro’s launch, we’re seeing the iPad Pro, which is arguably the iPad that would absolutely need space being available in 32 GB and 128 GB, with the cellular model being available only in 128 GB.

It would make sense that this move was meant to drive everyone to the higher priced 128 GB models and avoid the 32 GB model, but it’s interesting to see it regardless.

Apple's Announcements


What's New?

Apple released a few new products and updates today, most of which were expected, one which we were wrong about.

First, we’ve got confirmation of iOS 9 being released next Wednesday on September 16th.

The biggest change with iOS 9 for the iPad at any rate is the iPad’s new multitasking mode, which allows users to run two apps side by side simultaneously, similar to features in Windows and Galaxy tablets. Siri is also getting an upgrade, as a new feature called Proactive will offer contextual user suggestions based on habits, location, or time of day. Spotlight searches will also get more powerful, allowing users to search content within apps and perform unit conversions without opening a web search.

We also saw a hint that September 30th will be the release date for El Capitan, the next update to Apple’s OS X operating system.

New Apple TV

The long-awaited overhaul to Apple’s set-top box is here. Today the company announced its latest Apple TV with a revised physical design, faster internals, updated remote, and key new features including a built-in App Store. “It’s the golden age of television,” said CEO Tim Cook. “Our vision for TV is simple and perhaps a little provocative. We believe the future of television is apps.”

The new Apple TV is much more powerful than its predecessor, which is a crucial upgrade for the device’s gaming ambitions. It’s powered by a 64-bit A8 processor and supports 802.11ac Wi-Fi and Bluetooth 4.0. “It’s just 10 millimeters taller,” than the previous device, said Apple’s Eddy Cue. As for connections, the new Apple TV carries over the same, simplistic power / HDMI / ethernet setup as the old model. It will launch in late October in two configurations: 32GB for $149 or 64GB for $199.

With the newly built-in app store, Apple and third-party developers will expand Apple TV’s software ecosystem and widen its core functionality to put a much bigger emphasis on gaming. “When you consume this way, you realize just how much better it can be,” Cook said. This is the next step in Apple’s attempt to own the living room, and arrives ahead of the company’s own internet TV subscription service, expected to arrive sometime in the next year.

Having been an Apple TV user since the first edition, I’m looking forward to trying this out.

iPad Pro and iPad Mini 4


The iPad Pro has been rumoured for some time, and today it finally got announced.

The new iPad Pro uses a 12.9-inch display (2732 x 2048 resolution with 264 ppi), and makes use of the new split screen app features of iOS 9. The width of the iPad Pro is the same as the height of the iPad Air 2. “It can do things that a smartphone doesn’t do because it doesn’t have to sit in your pocket,” says Apple’s Phil Schiller. Apple is using the same technology from its iMac with Retina 5K display to bring the iPad Pro pixels to life. “For the first time in an Apple display, it has a variable refresh rate,” explains Schiller. This means Apple can slow the display down and save battery.

Inside it’s using Apple’s new A9X processor, which Apple claims is 1.8 times faster than the previous chip it replaces. “Our chip team is just on fire,” says Schiller. Graphics on the iPad Pro have doubled in terms of performance, so it’s clearly going to be a fast device for games and productivity apps. “It is faster than 80 percent of the portable PCs that shipped in the last 12 months,” claims Schiller. “In graphics tasks it’s faster than 90 percent of them.”

The iPad Mini also got a refresh, gaining the same specs as the iPad Air 2 in a smaller package.

iPhone 6S and iPhone 6S Plus

And of course, there’s a new iPhone. The iPhone 6S (and iPhone 6S Plus) have some nice new features and according to Tim Cook: “The only thing that’s changed is everything, these are the most advanced smartphones in the world.”

The iPhone 6S Plus retains its 5.5-inch Retina display, but this time it’s covered by a new, even tougher glass, which Apple describes as the strongest in the industry. It will also feature 3D Touch, implementing a version of the Force Touch functionality that was first introduced with the Apple Watch and MacBook touchpads earlier this year.

You can use 3D Touch to get a “peek” at content in apps like email and then, if you keep holding, enter the particular message. 3D Touch allows you to press down on the iPhone’s screen to pull up new menus, activate shortcuts, and generally interact with the device in new ways. This has been woven in throughout the iOS interface and default apps to give extra contextual functionality tied to pressure detection. Apple’s Taptic Engine is also built into the phone to provide feedback.

Over all, this should be an interesting year for Apple with the iPad Pro, iOS 9, El Capitan, Apple TV 4 and the new iPhones.

How to Use Ghost as middleware in an express app


Ghost is a handy blog engine, I use Camel on this site and the Flybase Blog, but I use Ghost on a few other projects.

One feature that is handy is being able to install Ghost via npm and then use it through middleware in Express, this lets you run Ghost alongside your main Node.js app.

We’re going to set this up as a new express app, but you’ll see how to go about setting this up. We’ll set this up so that Ghost is accessed via /blog and everything else is accessed via your express app.

  1. Create a new app (or add ghost to your existing express app)
npm install express ghost
  1. Create a folder called ghost-app/ this will let us keep our ghost related content in one place, we only need one folder from Ghost and a config file.

  2. Copy the node_modules/ghost/content/ folder to your app’s folder as ghost-app/content/

  3. Copy the following ghost-app/config.js file, this is the default config.js file, with /blog/ added to the URLs. It is very important that these URLs point to /blog/ or where ever you decide to set up Ghost

var path = require('path'),

config = {
    // ### Production
    // When running Ghost in the wild, use the production environment.
    // Configure your URL and mail settings here
    production: {
        url: '',
        mail: {},
        database: {
            client: 'sqlite3',
            connection: {
                filename: path.join(__dirname, '/content/data/ghost.db')
            debug: false

        server: {
            host: '',
            port: '2368'

    // ### Development **(default)**
    development: {
        // The url to use when providing links to the site, E.g. in RSS and email.
        // Change this to your Ghost blog's published URL.
        url: 'http://localhost:2368/blog/',

        // Example mail config
        // Visit for instructions
        //  mail: {
        //      transport: 'SMTP',
        //      options: {
        //          service: 'Mailgun',
        //          auth: {
        //              user: '', // mailgun username
        //              pass: ''  // mailgun password
        //          }
        //      }
        //  },

        // #### Database
        // Ghost supports sqlite3 (default), MySQL & PostgreSQL
        database: {
            client: 'sqlite3',
            connection: {
                filename: path.join(__dirname, '/content/data/ghost-dev.db')
            debug: false
        // #### Server
        // Can be host & port (default), or socket
        server: {
            // Host to be passed to node's 'net.Server#listen()'
            host: '',
            // Port to be passed to node's 'net.Server#listen()', for iisnode set this to 'process.env.PORT'
            port: '2368'
        // #### Paths
        // Specify where your content directory lives
        paths: {
            contentPath: path.join(__dirname, '/content/')

    // **Developers only need to edit below here**

    // ### Testing
    // Used when developing Ghost to run tests and check the health of Ghost
    // Uses a different port number
    testing: {
        url: '',
        database: {
            client: 'sqlite3',
            connection: {
                filename: path.join(__dirname, '/content/data/ghost-test.db')
        server: {
            host: '',
            port: '2369'
        logging: false

    // ### Testing MySQL
    // Used by Travis - Automated testing run through GitHub
    'testing-mysql': {
        url: '',
        database: {
            client: 'mysql',
            connection: {
                host     : '',
                user     : 'root',
                password : '',
                database : 'ghost_testing',
                charset  : 'utf8'
        server: {
            host: '',
            port: '2369'
        logging: false

    // ### Testing pg
    // Used by Travis - Automated testing run through GitHub
    'testing-pg': {
        url: '',
        database: {
            client: 'pg',
            connection: {
                host     : '',
                user     : 'postgres',
                password : '',
                database : 'ghost_testing',
                charset  : 'utf8'
        server: {
            host: '',
            port: '2369'
        logging: false

module.exports = config;
  1. Now, we want to create ghost-app/ghost-in-the-middle.js:
var ghost = require( 'ghost' )

function processBuffer( buffer, app ){
	while( buffer.length ){
		var request = buffer.pop()
			app( request[0], request[1] )

function makeGhostMiddleware( options ){
	var requestBuffer = []
	var app = false

	ghost( options ).then( function( ghost ){
		app = ghost.rootApp
		processBuffer( requestBuffer, app )

	return function handleRequest( req, res ){
		if( !app ){
			requestBuffer.unshift( [req, res] )
		} else {
			app( req, res )

module.exports = makeGhostMiddleware
  1. Use the included index.js to see how to include Ghost
var express = require('express');
var path = require('path');
var ghost = require('./ghost-app/ghost-in-the-middle');

var app = express();
var parentApp = express();

app.get('/', function (req, res) {
  res.send('Hello World!');

app.use( '/blog', ghost({
	config: path.join(__dirname, 'ghost-app/config.js')
}) );

var server = app.listen(3000, function () {
	var host = server.address().address;
	var port = server.address().port;
	console.log('Example app listening at http://%s:%s', host, port);

You’ve now got Ghost running inside your express app via middleware, When you want to edit your ghost theme, you can do that via ghost-app/content, this lets you keep your ghost files separate from the rest of your app, you could also just include them in the root.

Ok, why not copy the entire ghost folder?

That’s a good question, and the answer is, you don’t need it. The full folder includes the Ghost core, which is included via node_modules/ and just isn’t needed, so all your need is config.js and content/ so I’ve found it easier to keep these in their own ghost-app/ folder and keep the other app related folders separate.

Your toolbelt


Every profession has a toolbelt, that set of tools they need to do their job and that has to be within reach at all times: writers have their pen and paper, chefs have their knives, carpenters have their actual tools.

And if you do DevOps, then your tools are usually on your computer, tablet, smart phone and sometimes your smart watch.

Our tools vary but all serve the purpose of keeping the servers running, keeping the developers happy, and even more importantly, keeping the clients happy.

Here’s a list of tools I use in my day to day DevOps work:

  • Operating Systems
    • Linux (RHEL, CentOS, Ubuntu, Debian)
    • Unix (Solaris, AIX, HP/UX, etc.)
    • Windows
    • Mac OS X
  • Infrastructure as a Service
    • Amazon Web Services
    • Rackspace
    • Digital Ocean
    • Azure
    • Heroku
  • Virtualization Platforms
    • VMware
    • KVM
    • VirtualBox
    • Vagrant
    • Kubernetes
    • Docker
  • Containerization Tools
    • LXC
    • Docker
  • Configuration Management
    • Ansible
    • Puppet
    • Chef
  • Test, Build and Deployment Systems
    • Travis CI
    • Circle CI
    • Jenkins
  • Web Servers
    • nginx
    • Apache
  • Databases
    • MongoDB
    • MySQL
    • PostgresSQL
    • Cassandra
    • Redis
  • Monitoring, Alerting, and Trending
    • New Relic
    • Nagios
    • Zabbix
    • Uptime Robot
    • PagerDuty
    • Push Over
    • Monit
  • Logging
    • PaperTrail
    • Loggly
    • Rtail
    • Sentry

This list will probably grow every other week, DevOps means staying on top of this growing stack of tools and using which ever tools help you get the job done more efficiently.