So, a combination of a short holiday and a new laptop have conspired to keep me away from my text editor for a short while. The holiday was a walking trip, carrying our own gear, along the coast of Scotland. It was truly fabulous, but already covered at length on my wife's blog so I'll not repeat her here. As for the new laptop, well.... there's nothing like a new machine to make you re-evaluate your working environment.

Continue reading

Welcome back! In Part 1, we got our server set up to build Archlinux machines. Now we need to configure Foreman to make use of it! Let's get started... UI configuration Operating System setupFirstly we need the Operation System. If you already have some Archlinux clients, this might already be done, but head over to the Operating System page: and either edit the existing Archlinux OS, or create a new one if need be:

Continue reading

The Foreman developers have just merged a small patch which allows the UI to detect and correctly display Archlinux hosts. This means it's now possible to configure Foreman to do automated installs of Archlinux, just as you would for Debian or RedHat. This makes me happy, as people who know me might guess! The problemThe thing is, Archlinux isn't easy to net-install. It pains me to say it (because I'm a big fan of Arch), but their approach to automated installs just doesn't fit with how super-smooth the rest of the distro is.

Continue reading

If (like me) you find yourself re-installing your machines a lot (and let's face it, that's what Foreman is for), then a package cache can save you a huge amount of data traffic. There are many ways to achieve this, but I'll describe how I'm using apt-cacher-ng to help me save data. Apt-cacher-ng is particularly helpful since it can support almost any OS - the documentation has instructions for Debian, Ubuntu, Fedora, CentOS, OpenSUSE, and even Archlinux.

Continue reading

Inaugral Post!

So it seems that finally started to have enough things to say to start a blog. My interest are varied, and I don't have enough material for a blog on a single one of them, so you're going to see blogs on topics like: Linux / DevOpsCooking / BakingWalkingPoliticsGenerally awesome things You'll also get anything else that pops into my head. I'll try to tag things properly, but no promises :)

Continue reading

Self-hosting Shiny - Notes from EdinbR /*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0a?b:0);return this.pushStack(c=0&&bc?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);ih;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.

Continue reading

Author's picture

Greg 'Gwmngilfen' Sutcliffe

Data scientist, sysadmin, developer, hacker, FOSS evangelist, privacy activist, baker, gamer, walker. I do stuff (more…)

Community Data Scientist

Scotland