<!DOCTYPE html><html lang="en"><head prefix="og: http://ogp.me/ns#"><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" /><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="dns-prefetch" href="//www.google-analytics.com"><title>Welcome to my site! &middot; Graham Walters</title><meta name="author" content="Graham Walters"> <!-- Open Graph data --><meta property="og:title" content="Welcome to my site!" /><meta property="og:type" content="article" /><meta property="og:url" content="https://grahamwalters.me/" /><meta property="og:description" content="" /><meta property="og:site_name" content="GrahamWalters.com" /> <script type="text/javascript"> if (navigator.userAgent.match(/IEMobile\/10\.0/)) { var msViewportStyle = document.createElement('style'); msViewportStyle.appendChild( document.createTextNode('@-ms-viewport{width:auto!important}') ); document.head.appendChild(msViewportStyle); } </script> <script type="text/javascript"> (function(window, document, undefined) { var searchRegExp = function(key) { key = encodeURIComponent(key).replace(/[\-\.\+\*]/g, '\\$&'); return new RegExp('(?:(?:^|.*;)\\s*' + key + '\\s*\\=\\s*([^;]*).*$)'); }; var setCookie = function(key, value, options) { key = encodeURIComponent(key) .replace(/[\-\.\+\*]/g, '\\$&'); var cookie = key +'='+ encodeURIComponent(value); if (options.expires) cookie += '; expires=' + options.expires; if (options.domain) cookie += '; domain=' + options.domain; if (options.path) cookie += '; path=' + options.path; if (options.secure) cookie += '; secure'; document.cookie = cookie; }; var cookies = { get: function(key) { var search = searchRegExp(key); return decodeURIComponent( document.cookie.replace(search, '$1') ) || null; }, set: function(key, value, options) { if (typeof options !== 'object') options = {}; setCookie(key, value, options); }, exists: function(key) { var search = searchRegExp(key); return search.test(document.cookie); }, remove: function(key, options) { if (!key || !this.exists(key)) return false; if (typeof options !== 'object') options = {}; options.expires = 'Thu, 01 Jan 1970 00:00:00 GMT'; setCookie(key, '', options); return !this.exists(key); }, }; window.cookies = cookies; })(this, this.document); /* * Retina Images Using Cookies */ if (window.devicePixelRatio > 1) { cookies.set('devicePixelRatio', 2, { path: '/' }); } </script> <!-- CSS --><link href="https://fonts.googleapis.com/css?family=PT+Sans" rel="stylesheet"><link href="/css/main.css" rel="stylesheet" > <script async src="//cdnjs.cloudflare.com/ajax/libs/trianglify/0.4.0/trianglify.min.js"></script></head><body> <script type="text/javascript"> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-41709707-1', 'auto'); ga('send', 'pageview'); </script> <button id="nav-toggle" class=""> <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 18 12" enable-background="new 0 0 18 12" xml:space="preserve"> <g> <rect width="18" height="2"/> <rect y="5" width="18" height="2"/> <rect y="10" width="18" height="2"/> </g> </svg> </button><div class="header "> <canvas id="headerCanvas"></canvas><div class="header-content"><h1 class="header-title"> <a href="/" title="Graham Walters" rel="home">Graham Walters</a></h1><p class="header-tagline">A wee site for the things I do</p></div><nav class="navigation"><ul><li><a href="/">Home</a></li><li><a href="/blog/">Blog</a></li><li><a href="/tutorials/">Tutorials</a></li><li><a href="/lab/">Lab</a></li><li><a href="/photography/">Photography</a></li><li><a href="/portfolio/">Portfolio</a></li></ul></nav></div><script> var header = document.getElementsByClassName('header')[0]; var toggle = document.getElementById('nav-toggle'); toggle.addEventListener('click', function() { header.classList.toggle('slide-out'); }); </script> <script>(function(window, document, undefined) { 'use strict'; var home = ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000']; var blog = ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529']; var lab = ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b']; var tutorials = ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d']; var photography = ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506']; /* jshint ignore:start */ var colors = home; /* jshint ignore:end */ function drawHeader() { var canvas = document.getElementById('headerCanvas'); var context = canvas.getContext('2d'); var header = document.getElementsByClassName('header')[0]; var devicePixelRatio = window.devicePixelRatio || 1, backingStoreRatio = context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1, ratio = devicePixelRatio / backingStoreRatio, cell_size = 75; canvas.width = header.clientWidth; canvas.height = header.clientHeight; /* upscale the canvas if the two ratios don't match */ if (devicePixelRatio !== backingStoreRatio) { canvas.width = ratio * canvas.width; canvas.height = ratio * canvas.height; cell_size = ratio * 100; /* now scale the context to counter the fact that we've manually scaled our canvas element */ context.scale(ratio, ratio); } var pattern = Trianglify({ width: canvas.width, height: canvas.height, cell_size: cell_size, variance: 0.87, x_colors: colors.slice(2) }); console.log(pattern.opts.x_colors); pattern.canvas(canvas); pattern = null; canvas = null; } var timeer; function resize() { clearTimeout(timeer); timeer = setTimeout(function() { drawHeader(); }, 100); } window.addEventListener('load', drawHeader); window.addEventListener('resize', resize, true); })(this, this.document); </script><div class="container "><article class="page"><header class="entry-header"><h1 class="entry-title">Welcome to my site!</h1></header><div class="entry-content"><p>I’m a BEng (Hons) Computing graduate from Edinburgh Napier University, currently working with Golang on the Ad Platform at Meredith Corporation. I enjoy working with the latest and greatest of technologies, with my current interests being Machine Learning, GraphQL, and WebRTC. The majority of my projects are written in Go or Node JS, but I often turn to Ruby on Rails for quick prototypes.</p><p>See my personal <a href="https://gitlab.com/GrahamWalters">Gitlab</a> and <a href="https://github.com/GrahamWalters">Github</a> profiles to see my latest Open Source contributions.</p><p>I’m a hard working team player, driven by the need to know more. You can find my CV <a href="/CV.pdf" target="_blank">here</a>, portfolio <a href="/portfolio/">here</a>, and LinkedIn <a href="https://www.linkedin.com/in/GrahamDWalters" target="_blank">here</a>.</p><h3 id="disclaimer">Disclaimer</h3><p>The views expressed on this weblog are mine alone and do not necessarily reflect the views of my employer.</p></div></article></div></body></html>
