<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Mike&#39;s Blog</title>
        <link>https://mikerossiter.tech/</link>
        <description>Recent content on Mike&#39;s Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-gb</language>
        <lastBuildDate>Mon, 14 Sep 2026 14:10:39 +0100</lastBuildDate><atom:link href="https://mikerossiter.tech/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>The Platform Leverage Model</title>
        <link>https://mikerossiter.tech/posts/platform-leverage-model/</link>
        <pubDate>Mon, 14 Sep 2026 09:00:00 +0000</pubDate>
        
        <guid>https://mikerossiter.tech/posts/platform-leverage-model/</guid>
        <description>&lt;img src="https://mikerossiter.tech/plm-formula.webp" alt="Featured image of post The Platform Leverage Model" /&gt;&lt;p&gt;&lt;code&gt;Leverage = Reliability × [ Reach × Depth − ( Cognitive Load + Toil ) ]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;TLDR: That&amp;rsquo;s it! End of lecture.&lt;/p&gt;
&lt;p&gt;But seriously, this blog post is based on a talk I gave at Yorkshire DevOps in Leeds on 10 September 2026, but with the added bonus of less difficult questions at the end.&lt;/p&gt;
&lt;p&gt;The DevOps measuring tape was built for application teams what ship features although DORA&amp;rsquo;s 2025 report says AI only pays off on a solid platform, so DevOps is back in fashion. Yey! Take that nay-sayers.&lt;/p&gt;
&lt;p&gt;But! Yes another but. The point of a platform team is leverage: a few multiplying the many. Fournier and Nowland, in the O&amp;rsquo;Reilly &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.co.uk/dp/1098153642?tag=mikerossiter-21&#34; rel=&#34;sponsored noopener&#34; target=&#34;_blank&#34;&gt;Platform Engineering book&lt;/a&gt;, define the job as managing complexity to deliver leverage to the business. Four things go in, gated by a fifth.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://mikerossiter.tech/plm-formula.webp&#34;
    alt=&#34;The Platform Leverage Model as a formula: Leverage equals Reliability times the bracket of Reach times Depth minus the sum of Cognitive Load and Toil. Reach and Depth are green and marked grow, Cognitive Load and Toil are red and marked shrink, and Reliability from 0 to 1 is labelled the floor.&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;The model in all its glory.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;It&amp;rsquo;s written as a formula because the relationships are multiplicative and subtractive, not because you should put numbers in it. In my experience on infrastructure/platform/cloud/DevOps teams, they often feel neglected by the research and constantly playing catch up. I wanted to give the engineers a way to keep the work that they do relevant and provide benefit, that aligned with the research, back to the customer.&lt;/p&gt;
&lt;h2 id=&#34;explain-the-model-mike&#34;&gt;Explain the model, Mike
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Reach&lt;/strong&gt; is how many teams actually use the thing, and it only counts if they had a choice. Where use is mandated, reach is how many teams would still use it if the mandate were lifted. Teams building copies of work because your work is too slow is reach draining away.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Depth&lt;/strong&gt; is how much more a team can do because you exist. A new service that took six weeks now takes an afternoon, and when starting something costs almost nothing, people start ten times as many things. Multiply the two: if either is zero you have nothing.&lt;/p&gt;
&lt;p&gt;Then subtract the friction. &lt;strong&gt;Cognitive load&lt;/strong&gt; is what anyone has to hold in their head to get the thing done: the steps, forms and tickets for them, the tools, exceptions and &amp;ldquo;ask Dave&amp;rdquo; for us. Count the steps, don&amp;rsquo;t survey the feelings. &lt;strong&gt;Toil&lt;/strong&gt; is the repetitive work we do by hand on our own side. Google&amp;rsquo;s SRE rule: under half the team&amp;rsquo;s time, leaving at least half for building the things that get rid of it. If the thinking you cause and the toil you carry outweigh the value, the bracket goes negative and the platform is a net cost.&lt;/p&gt;
&lt;p&gt;Finally, multiply by &lt;strong&gt;reliability&lt;/strong&gt;, 0 to 1. Call it the base: everything else passes through it, so nothing above it can lift a platform nobody trusts. DORA&amp;rsquo;s 2024 report found teams using an internal platform got more done but had 14% more failed changes. A platform raises what&amp;rsquo;s possible and, but if you&amp;rsquo;re careless, weakens what&amp;rsquo;s underneath.&lt;/p&gt;
&lt;p&gt;Reliability multiplies rather than adds because it&amp;rsquo;s the one thing DORA doesn&amp;rsquo;t file with delivery. Its metrics measure how well teams ship code. Staying up was moved into a separate box labelled operational performance, and that box is our job.&lt;/p&gt;
&lt;h2 id=&#34;why-it-needed-writing-down&#34;&gt;Why it needed writing down
&lt;/h2&gt;&lt;p&gt;My master&amp;rsquo;s degree in DevOps sent me down the Accelerate and DORA rabbit hole. Rigorous and peer reviewed. Excellent. Then Forsgren moved on to SPACE, a framework for measuring developer productivity, and the focus shifted to developer experience alone. DevEx has a body of research behind it now. There is no PlatEx or OrgEx!&lt;/p&gt;
&lt;p&gt;The DORA website tells platform teams to use their same metrics to measure their own performance, alongside satisfaction and adoption surveys. But it&amp;rsquo;s a yardstick built for somebody else&amp;rsquo;s work.&lt;/p&gt;
&lt;p&gt;We appear in the research on bad days only as well! We are incident responders in a SPACE side-note and as capabilities other teams have in DORA&amp;rsquo;s catalogue. Nowhere do we appear as the people who build and maintain it. And the rulebooks we&amp;rsquo;re handed aren&amp;rsquo;t the same kind of thing. DORA and Accelerate are peer-reviewed research but the SRE book is Google describing Google. ITIL is a committee framework whose change advisory boards are directly contradicted by Accelerate.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://mikerossiter.tech/plm-waterline.webp&#34;
    alt=&#34;An org chart split by a waterline. Above the line, in the sun, sit the business, product teams and DevEx. Below the line sits the platform: infrastructure, networks, pipelines and legacy, marked here be dragons, or sharks.&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;The org chart as it sometimes feels!&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Slightly more kindly, Flow Engineering calls it a supportive value stream: further from the paying customer, and less measured. Team Topologies (a most excellent resource) draws the platform as a large bluey grey slab at the bottom but is the one of the few resources to apply some reasoning to how they are created and interact.&lt;/p&gt;
&lt;p&gt;Yet DORA&amp;rsquo;s advice is to shift down: move the platform out of developers&amp;rsquo; heads. DevEx then measures the developers&amp;rsquo; load going down but nobody measures where it went. &lt;a class=&#34;link&#34; href=&#34;https://platformengineering.org/blog/cognitive-load&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Paula Kennedy&lt;/a&gt; of Syntasso asked at PlatformCon 2022 whose load it is anyway, and warned that shifting all of it onto the platform team isn&amp;rsquo;t reducing it!&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-it&#34;&gt;How to use it
&lt;/h2&gt;&lt;figure&gt;&lt;img src=&#34;https://mikerossiter.tech/plm-two-altitudes.webp&#34;
    alt=&#34;Two stacked bands. The top band, Values, holds the Three Ways (Flow, Feedback, Findings) leading to CALMS (Culture, Automation, Lean, Measurement, Sharing). An arrow points down to the bottom band, the Platform Leverage Model, described as a way of thinking applied before and during the work.&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;The values say why we work this way. The model says what good looks like on the ticket in front of you.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Above the model sit the values: the Three Ways (flow, feedback and continual learning, which I file as findings so all three start with an F) and CALMS (culture, automation, lean, measurement, sharing). The model runs over the ticket in your hand and the work coming next. So, before touching a keyboard, you have five questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Who else is going to need this? (Reach)&lt;/li&gt;
&lt;li&gt;What will it let them do that they couldn&amp;rsquo;t before? (Depth)&lt;/li&gt;
&lt;li&gt;How much will anyone have to hold in their head, them or us? (Load)&lt;/li&gt;
&lt;li&gt;What&amp;rsquo;s left for us to do by hand next time? (Toil)&lt;/li&gt;
&lt;li&gt;Does it stay trustworthy? (Reliability)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Carry those and every ticket becomes proactive work. Also, another point to make is that this was all relevant to work being done for developers from the platform engineers perspective. But all of these should equally apply to how work affects the platform engineers themselves as well. Are we also reducing our own cognitive load by doing this? Are we reducing toil? Remember those batch scripts we used to write? We&amp;rsquo;ve always done this and the research tells us to trust those instincts.&lt;/p&gt;
&lt;h2 id=&#34;a-lens-not-a-target&#34;&gt;A lens, not a target
&lt;/h2&gt;&lt;p&gt;When a measure becomes a target, it stops being a good measure. Goodhart&amp;rsquo;s law. Chase a toil percentage and you&amp;rsquo;ll hit it without anything getting easier. Accelerate carries the same warning, via Deming: whenever there is fear, you get the wrong numbers.&lt;/p&gt;
&lt;p&gt;Nobody has published a tested measure for platform teams. I looked and there was fewer than a dozen proper studies, and the lack of a tested measure named as a major gap. This is a way of thinking, not an instrument. There&amp;rsquo;s still more work to be done in this field to bring it up to speed with DevEx. OrgEx perhaps?&lt;/p&gt;
&lt;h2 id=&#34;when-the-answer-is-we-need-a-platform&#34;&gt;When the answer is &amp;ldquo;we need a platform&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;When the model says the work isn&amp;rsquo;t moving anything, &amp;ldquo;we need a platform&amp;rdquo; is a useless sentence. Ask for one of these instead.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://mikerossiter.tech/plm-idp-ladder.webp&#34;
    alt=&#34;A six-rung ladder, thinnest first: 01 docs and runbooks (ask a person), 02 templates and modules (ask a template), 03 pipelines and policy (ask a pipeline), 04 self-service (ask a button), 05 platform as product (ask a product), 06 invisible platform (ask nothing). Side notes mark where Team Topologies and the CNCF, and Fournier and Nowland, each say a platform begins, and where DORA&amp;#39;s minimum viable platform sits.&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;The IDP ladder, thinnest first. Every rung counts as a platform.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Six shapes for an internal developer platform, thinnest first. The pattern is what you have to ask for: a person, then a template, then a pipeline, then a button, then a product, then nothing. Team Topologies and the CNCF count rung one, which can literally just be a wiki page. Fournier and Nowland draw the line at rung two: no software, no platform. DORA&amp;rsquo;s minimum viable platform is one golden path, which lands at rung three.&lt;/p&gt;
&lt;p&gt;Most estates I&amp;rsquo;ve worked on live on rungs one to three and do real leverage there. Every rung costs more to run, so climb when the rung you&amp;rsquo;re on keeps failing the five questions, not when the next one just looks impressive.&lt;/p&gt;
&lt;h2 id=&#34;a-quiet-day&#34;&gt;A quiet day
&lt;/h2&gt;&lt;p&gt;For us a good day is a quiet one. No incidents, and room to learn, maintain and build. Quiet isn&amp;rsquo;t idle. Quiet is winning!&lt;/p&gt;
&lt;p&gt;Every organisation has an infrastructure layer, whatever it calls it, and it deserves more than the research applies. Use the model as a start, or a basis for the actual work you/we/they deliver. Or even as a platform for your platform. Ahem.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This post contains affiliate links. As an Amazon Associate I earn from qualifying purchases. Thanks for your support.&lt;/em&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Take Us To Your Leader!</title>
        <link>https://mikerossiter.tech/posts/the-bottleneck-moved/</link>
        <pubDate>Fri, 24 Jul 2026 09:00:00 +0000</pubDate>
        
        <guid>https://mikerossiter.tech/posts/the-bottleneck-moved/</guid>
        <description>&lt;img src="https://mikerossiter.tech/robots.jpg" alt="Featured image of post Take Us To Your Leader!" /&gt;&lt;p&gt;Engineering teams are running a different operating model to before. It isn&amp;rsquo;t a bunch of engineers any more. It&amp;rsquo;s a bunch of engineers, each orchestrating a handful of agents. The tooling for this arrived faster than the thinking did, and now we&amp;rsquo;re all trying to catch up.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a summary of opinion pieces and academic studies into this brave new world, and where I think the gap still is:&lt;/p&gt;
&lt;h2 id=&#34;what-the-evidence-says&#34;&gt;What the evidence says
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://dora.dev/dora-report-2025/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DORA, State of AI-assisted Software Development 2025&lt;/a&gt;&lt;/strong&gt; — still the best-grounded starting point despite being from 2025. Nearly 5,000 respondents, and one finding that reframes everything: AI is an amplifier. It magnifies whatever your organisation already is. DORA identified seven capabilities that determine whether that amplification helps or hurts, and the platform one is still the greatest piece of guidance for AI readiness that I have seen anywhere ever — &lt;a class=&#34;link&#34; href=&#34;https://dora.dev/capabilities/platform-engineering/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;where internal platform quality is high, AI&amp;rsquo;s effect on organisational performance is strong and positive; where it&amp;rsquo;s low, the effect is negligible&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anthropic — the &lt;a class=&#34;link&#34; href=&#34;https://resources.anthropic.com/hubfs/2026%20Agentic%20Coding%20Trends%20Report.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;2026 Agentic Coding Trends Report&lt;/a&gt; and the &lt;a class=&#34;link&#34; href=&#34;https://code.claude.com/docs/en/agent-teams&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Claude Code documentation&lt;/a&gt;&lt;/strong&gt; — the vendor view (I count Claude as the incumbent in this case). Its Trend 2, &amp;ldquo;single agents evolve into coordinated teams&amp;rdquo;, predicts 2026 is the year the single chat thread gives way to one orchestrator coordinating specialised sub-agents — and it states that users require new skills in task decomposition, agent specialisation and coordination protocols, plus version control that can handle simultaneous agent-generated contributions. The docs then say that one human as &amp;ldquo;team lead&amp;rdquo; coordinating three to five agent teammates inside a single session, work sized so each teammate owns a different set of files because &amp;ldquo;two teammates editing the same file leads to overwrites&amp;rdquo; (for keeping sessions fully apart, they point to a separate technique, &lt;a class=&#34;link&#34; href=&#34;https://code.claude.com/docs/en/worktrees&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;git worktrees&lt;/a&gt;). All of it, though, is orchestration inside one owner&amp;rsquo;s control: one team per session, one developer, no sharing a team across sessions. The guidance for running an agent team is genuinely good. There is no guidance on a whole team of developers each running their own agentic robo squad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.faros.ai/research/ai-acceleration-whiplash&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Faros AI, The Acceleration Whiplash (2026)&lt;/a&gt;&lt;/strong&gt; — telemetry from 22,000 developers across more than 4,000 teams. Faros state that even though throughput genuinely rose, so did bugs per developer (up 54%), incidents per pull request (up 242.7%), median review time (up 441.5%), and pull requests merging with no review at all (up 31.3%)! Their direct challenge to DORA is that mature DevOps organisations showed the same degradation as everyone else — because their review processes were sized for a lower-throughput world. One caveat I have against their reactive piece to DORA&amp;rsquo;s approach is that the report doesn&amp;rsquo;t state how they ensure the teams were definitively &lt;strong&gt;&amp;ldquo;high-performing&amp;rdquo;&lt;/strong&gt;. Also &amp;ldquo;high DORA metrics&amp;rdquo; scores are not a thing. DORA metrics are not targets. I keep saying **&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Goodhart%27s_law&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this&lt;/a&gt;! That said, they clearly have uncovered an issue in delivery that is still yet to reveal itself. I think I may have some clue to it so keep reading.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://arxiv.org/abs/2602.07641&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HAIF: A Human–AI Integration Framework (Bara, Feb 2026)&lt;/a&gt;&lt;/strong&gt; — the most operationally useful thing I&amp;rsquo;ve read albeit from a post-deployment perspective. Four rules: every AI output has a named human owner, delegation is a governed and reversible decision, validation is budgeted capacity rather than an afterthought, and human competence is actively maintained through scheduled human-only work. It adds trust tiers where promotion is slow and evidence-based but demotion is instant and anyone can trigger it. Its review principle is three words: &lt;strong&gt;&amp;ldquo;Verify, don&amp;rsquo;t read.&amp;rdquo;&lt;/strong&gt; My reservation is that HAIF is output governance. It&amp;rsquo;s excellent at checking AI&amp;rsquo;s homework but doesn&amp;rsquo;t hit upon guidance and flow. It could even be argued that it hinders flow as we add extra process upon process. But it&amp;rsquo;s worth reading.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://kanbanzone.com/2026/agile-in-the-age-of-ai-why-teams-need-a-visual-board/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Agile in the Age of AI (Kanban Zone, June 2026)&lt;/a&gt;&lt;/strong&gt; — makes the case that our coordination rituals were tuned for human cadence, and argues for leaning harder on flow: visible work, WIP limits, explicit policies on what &amp;ldquo;good&amp;rdquo; means for generated output. It also contains the line I keep coming back to. Humans move from doing the work to deciding, guiding and validating it — and that is &amp;ldquo;not a reduction in importance, but an elevation of responsibility.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/where.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;where&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;where-are-you-now&#34;&gt;Where are you now&amp;hellip;
&lt;/h2&gt;&lt;p&gt;So I went looking again for guidance on the part I actually care about: a whole team using AI, not one developer with a fleet of agents. It still isn&amp;rsquo;t there. What&amp;rsquo;s online is impressive — orchestration tools like Claude Squad and Conductor, &amp;ldquo;living specs&amp;rdquo; that keep agents aligned, &lt;a class=&#34;link&#34; href=&#34;https://addyosmani.com/blog/code-agent-orchestra/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;branch isolation so parallel agents don&amp;rsquo;t collide&lt;/a&gt; — but every bit of it is engineer-centric. One person conducting many agents. None of it tells a delivery lead how to run a team of humans who each do this against the same trunk.&lt;/p&gt;
&lt;p&gt;Which lands me somewhere that might sound old-fashioned: the traditional team disciplines — DevOps and Agile — matter &lt;em&gt;more&lt;/em&gt; now, not less. The act of delegating work is the same act it always was. Story points may shrink and sprints get busier; teams may get smaller or their skills shift. But someone still has to own the boundaries, hold the intent, and make the calls no agent can be accountable for. That is delivery leadership and creativity, and no tool ships it.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s why I keep pushing back on treating agents as team members. They aren&amp;rsquo;t. They don&amp;rsquo;t self-organise, they can&amp;rsquo;t change their behaviour after a retro, and they can&amp;rsquo;t hold accountability. They are capable, fast, occasionally wrong tools working entirely at the direction of the engineers running them — and they break, drift, and get repriced or repositioned by vendors and by our own organisations on timelines nobody on the team controls.&lt;/p&gt;
&lt;p&gt;A lot of this was confirmed for me at an &lt;a class=&#34;link&#34; href=&#34;https://www.linkedin.com/posts/enablis-consulting_enabledday-enablis-ai-activity-7486018985029869570-OBRG&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&amp;ldquo;Enabled Day&amp;rdquo; at Enablis&lt;/a&gt;, where we were handed a brief and a single day to turn them into working apps with the help of our old buddy Claude and friends. Nothing highlights issues like a blank page and a deadline. And yes. My team won! Just like Spain.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/worldcup.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;worldcup&#34;
	
	
&gt;&lt;/p&gt;
&lt;hr&gt;
</description>
        </item>
        <item>
        <title>Are You Actually Ready for AI? Measure to Adopt</title>
        <link>https://mikerossiter.tech/posts/ai-readiness/</link>
        <pubDate>Fri, 17 Jul 2026 09:00:00 +0000</pubDate>
        
        <guid>https://mikerossiter.tech/posts/ai-readiness/</guid>
        <description>&lt;img src="https://mikerossiter.tech/ai-readiness-hero.png" alt="Featured image of post Are You Actually Ready for AI? Measure to Adopt" /&gt;&lt;h1 id=&#34;are-you-ready&#34;&gt;Are you ready?
&lt;/h1&gt;&lt;p&gt;Every organisation right now wants the same darn thing! To get AI into the hands of engineers and watch productivity climb. As it was put in a recent &lt;a class=&#34;link&#34; href=&#34;https://www.meetup.com/yorkshire-devops/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Yorkshire DevOps meetup&lt;/a&gt; - the managers want &amp;ldquo;AI AI AI&amp;rdquo;! But sometimes the engineers are pushing back. The pressure is real! But there is a hard truth buried in the research that most people skip past.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI does not fix a struggling team. It amplifies whatever is already there.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;See? That single line is the headline of the &lt;a class=&#34;link&#34; href=&#34;https://cloud.google.com/blog/products/ai-machine-learning/announcing-the-2025-dora-report&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;2025 DORA report&lt;/a&gt;, Google&amp;rsquo;s study of software delivery, based on roughly 5,000 respondents and over 100 hours of interviews. Really strong teams get stronger with AI. Teams with a weak foundation get faster at producing the wrong things, less safely. So before you buy Claude licences for everyone, you need to answer one question: &lt;em&gt;where does my team actually stand today?&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;the-uncomfortable-finding-speed-without-stability&#34;&gt;The uncomfortable finding: speed without stability
&lt;/h2&gt;&lt;p&gt;The 2025 DORA data shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;90%&lt;/strong&gt; of respondents now use AI at work, and &lt;strong&gt;over 80%&lt;/strong&gt; say it has boosted their productivity.&lt;/li&gt;
&lt;li&gt;Yet &lt;strong&gt;30%&lt;/strong&gt; still report little or no trust in AI-generated code.&lt;/li&gt;
&lt;li&gt;AI adoption shows a &lt;strong&gt;positive&lt;/strong&gt; relationship with throughput and product performance, but a &lt;strong&gt;negative&lt;/strong&gt; relationship with software delivery &lt;em&gt;stability&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Teams are shipping more, faster, and breaking more while they do it! The report shows that acceleration exposes weaknesses that were already there. If your automated testing is thin, your version control is loose, or your feedback loops are slow, AI will help you fail sooner. Which is ironically also a DevOps principle borrowed from &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.co.uk/s?k=Lean&amp;#43;Software&amp;#43;Development&amp;#43;Poppendieck&amp;amp;tag=mikerossiter-21&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Lean&lt;/a&gt; but we&amp;rsquo;re not going down that road today!&lt;/p&gt;
&lt;p&gt;In &lt;em&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.amazon.co.uk/s?k=The&amp;#43;DevOps&amp;#43;Handbook&amp;#43;Gene&amp;#43;Kim&amp;amp;tag=mikerossiter-21&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;The DevOps Handbook&lt;/a&gt;&lt;/em&gt;, the same argument is made about automation in general: automating a broken process only lets you make mistakes faster and more reliably. AI is automation in full beast mode, so the risk is larger, not smaller.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/amplifier.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;AI turns up whatever signal your team is already sending&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/ai-readiness-diagram.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;AI raises throughput but can lower stability without strong foundations&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;two-ways-to-get-your-baseline&#34;&gt;Two ways to get your baseline
&lt;/h2&gt;&lt;h3 id=&#34;1-the-dora-quick-check&#34;&gt;1. The DORA Quick Check
&lt;/h3&gt;&lt;p&gt;DORA publishes a free &lt;a class=&#34;link&#34; href=&#34;https://dora.dev/quickcheck/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick Check&lt;/a&gt; that scores your team on the four key delivery metrics (deployment frequency, lead time for changes, change failure rate, and failed-deployment recovery time) and shows how you compare to others. It takes a few minutes and gives you an immediate, industry-benchmarked read on your delivery performance. Start here if you want a fast, external reference point.&lt;/p&gt;
&lt;p&gt;Those four metrics are not arbitrary. They come out of the years of research written up in &lt;em&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.amazon.co.uk/s?k=Accelerate&amp;#43;Forsgren&amp;#43;Humble&amp;#43;Kim&amp;amp;tag=mikerossiter-21&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Accelerate&lt;/a&gt;&lt;/em&gt;, which found that these measures reliably separate high performers from the rest. That is the whole reason to start with them: they are the closest thing our industry has to an objective baseline.&lt;/p&gt;
&lt;h3 id=&#34;2-a-devops-maturity-model-my-tool&#34;&gt;2. A DevOps Maturity Model (my tool!)
&lt;/h3&gt;&lt;p&gt;The Quick Check tells you &lt;em&gt;how fast and safe&lt;/em&gt; your delivery is. It does not tell you &lt;em&gt;why&lt;/em&gt;, or what to fix first. That gap is exactly why I built the &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/devops-maturity-model/devops-maturity-model&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DevOps Maturity Model&lt;/a&gt; (DMM).&lt;/p&gt;
&lt;p&gt;The DMM is a small, self-hosted web tool that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scores your team across dimensions like Automation, Infrastructure and Culture&lt;/li&gt;
&lt;li&gt;Tracks your progress over time on a graph&lt;/li&gt;
&lt;li&gt;Generates the start of a gap-analysis report so you can plan improvements&lt;/li&gt;
&lt;li&gt;Is fully customisable to your team&amp;rsquo;s own language and priorities&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It runs locally via Docker or NPM, so your data stays with you, and it deliberately avoids the discouraging language of formal performance tiers. The point is to make even basic adoption feel like progress. I wrote about the thinking behind it in more detail in &lt;a class=&#34;link&#34; href=&#34;https://mikerossiter.tech/posts/devops-maturity-model/&#34; &gt;my DevOps Maturity Model post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One caveat! &lt;em&gt;Accelerate&lt;/em&gt; actually argues &lt;em&gt;against&lt;/em&gt; maturity models. Forsgren writes that &lt;em&gt;&amp;ldquo;maturity models are not the appropriate tool to use or mindset to have&amp;rdquo;&lt;/em&gt;, and recommend &lt;strong&gt;capability models&lt;/strong&gt; instead: multidimensional, outcome-focused, and never &amp;ldquo;finished&amp;rdquo;. I built the DMM anyway! The reason is practical. During my MSc research I could not find a single practising engineer who used capability modelling in the real world, whereas maturity models were something teams instantly recognised and would actually sit down and engage with. The DMM is my attempt to keep the approachability of a maturity model while still pointing people at the capabilities they need to improve.&lt;/p&gt;
&lt;p&gt;Used together, the Quick Check gives you the &lt;em&gt;outcome&lt;/em&gt; level and the DMM tells you &lt;em&gt;which practices&lt;/em&gt; to work on to move on. That is your readiness baseline.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/checklist.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;A readiness baseline comes from measuring outcomes and practices together&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;turning-the-baseline-into-an-action-list&#34;&gt;Turning the baseline into an action list
&lt;/h2&gt;&lt;p&gt;Your scores point at weak spots. Here is what to do about them. Most of this is ordinary good engineering, not AI.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Secure these foundations first.&lt;/strong&gt; These are the practices DORA&amp;rsquo;s research ties to high-performing teams, with fuller explanations at &lt;a class=&#34;link&#34; href=&#34;https://dora.dev/capabilities/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;dora.dev/capabilities&lt;/a&gt;. Treat the list as a checklist and score yourself honestly. Any item you cannot tick, AI will expose it! Not improve. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Version control&lt;/strong&gt; — every change to code and settings is recorded, and any of it can be undone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automated testing&lt;/strong&gt; — the system checks its own work on every change, so mistakes show up in minutes instead of reaching customers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fast feedback&lt;/strong&gt; — a broken change is flagged within minutes of being made, not days later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Small, frequent releases&lt;/strong&gt; — teams ship small changes often, rather than large risky ones now and then.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automated release and rollback&lt;/strong&gt; — putting a change live, and pulling it back out, is quick and routine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Independent teams&lt;/strong&gt; — a team can deliver its own work without waiting on several others.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Then two AI-specific moves:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Write and enforce an AI policy&lt;/strong&gt; — short, clear rules on what is allowed, what tools are available (via SSO) and block the rest at network level. AI-written code must be reviewed exactly like human-written code. A policy no one enforces is just a suggestion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Give AI your own context&lt;/strong&gt; — connect it to your codebase, documents, knowledge base and standards. Generic AI gives generic answers; your own context is where the value lies.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And one that never changes: &lt;strong&gt;product direction stays human.&lt;/strong&gt; AI speeds up building things. It does not tell you which things are worth building. Oh no no. That still comes from you and your users.&lt;/p&gt;
&lt;p&gt;None of this is really about AI anyway. Getting ready for AI and getting good at delivering software are the same job. Fix the weak spots you have flagged, and readiness follows.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;where-to-start&#34;&gt;Where to start?
&lt;/h2&gt;&lt;p&gt;If you take one thing from this, let it be the order of operations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Measure.&lt;/strong&gt; Run the &lt;a class=&#34;link&#34; href=&#34;https://dora.dev/quickcheck/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DORA Quick Check&lt;/a&gt; and a &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/devops-maturity-model/devops-maturity-model&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DevOps Maturity Model&lt;/a&gt; assessment. Get an honest baseline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Find your weakest foundation.&lt;/strong&gt; Usually it is testing, feedback speed, or coupling. Fix that before you scale AI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write the policy, connect the context, then roll out.&lt;/strong&gt; In that order.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;AI is not a shortcut past the hard work of good engineering. It is a multiplier on top of it. Measure first, and you will know whether that multiplier is working for you or against you.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;references-and-further-reading&#34;&gt;References and further reading
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2025 DORA Report&lt;/strong&gt; — Google Cloud, &lt;em&gt;Announcing the 2025 DORA Report&lt;/em&gt;. &lt;a class=&#34;link&#34; href=&#34;https://cloud.google.com/blog/products/ai-machine-learning/announcing-the-2025-dora-report&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;cloud.google.com&lt;/a&gt; and the full report at &lt;a class=&#34;link&#34; href=&#34;https://dora.dev/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;dora.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accelerate: The Science of Lean Software and DevOps&lt;/strong&gt; — Nicole Forsgren, Jez Humble, Gene Kim. &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.co.uk/s?k=Accelerate&amp;#43;Forsgren&amp;#43;Humble&amp;#43;Kim&amp;amp;tag=mikerossiter-21&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The DevOps Handbook&lt;/strong&gt; — Gene Kim, Jez Humble, Patrick Debois, John Willis. &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.co.uk/s?k=The&amp;#43;DevOps&amp;#43;Handbook&amp;#43;Gene&amp;#43;Kim&amp;amp;tag=mikerossiter-21&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wiring the Winning Organization&lt;/strong&gt; — Gene Kim, Steven J. Spear. &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.co.uk/s?k=Wiring&amp;#43;the&amp;#43;Winning&amp;#43;Organization&amp;#43;Gene&amp;#43;Kim&amp;amp;tag=mikerossiter-21&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous Delivery&lt;/strong&gt; — Jez Humble, David Farley. &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.co.uk/s?k=Continuous&amp;#43;Delivery&amp;#43;Humble&amp;#43;Farley&amp;amp;tag=mikerossiter-21&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team Topologies&lt;/strong&gt; — Matthew Skelton, Manuel Pais. &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.co.uk/s?k=Team&amp;#43;Topologies&amp;#43;Skelton&amp;#43;Pais&amp;amp;tag=mikerossiter-21&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platform Engineering&lt;/strong&gt; — Camille Fournier. &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.co.uk/s?k=Platform&amp;#43;Engineering&amp;#43;Camille&amp;#43;Fournier&amp;amp;tag=mikerossiter-21&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strategic Management of Technological Innovation&lt;/strong&gt; — Melissa A. Schilling. McGraw-Hill. &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.co.uk/s?k=Strategic&amp;#43;Management&amp;#43;Technological&amp;#43;Innovation&amp;#43;Schilling&amp;amp;tag=mikerossiter-21&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Amazon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DevOps Maturity Model (DMM)&lt;/strong&gt; — my open-source assessment tool: &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/devops-maturity-model/devops-maturity-model&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;gitlab.com/devops-maturity-model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DORA Quick Check&lt;/strong&gt; — &lt;a class=&#34;link&#34; href=&#34;https://dora.dev/quickcheck/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;dora.dev/quickcheck&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Cat and Mouse Game!</title>
        <link>https://mikerossiter.tech/posts/cat-and-mouse-game/</link>
        <pubDate>Thu, 03 Apr 2025 09:40:44 +0100</pubDate>
        
        <guid>https://mikerossiter.tech/posts/cat-and-mouse-game/</guid>
        <description>&lt;img src="https://mikerossiter.tech/catandmouse.png" alt="Featured image of post Cat and Mouse Game!" /&gt;&lt;h1 id=&#34;cat-and-mouse-game&#34;&gt;Cat and Mouse Game
&lt;/h1&gt;&lt;p&gt;A fun game I discovered on YouTube. It has elements of graph theory and algorithmic thinking but in essence its a &lt;strong&gt;chase and evade&lt;/strong&gt; type game that is super easy to grasp. I played this with my kids using cushions on the floor and they loved it. For all of ten minutes.&lt;/p&gt;
&lt;p&gt;Give it a go! I&amp;rsquo;ve added a score for the mouse so see how high you can get it. Sadly, there is no winning/prize involved!&lt;/p&gt;
&lt;div class=&#34;cat-mouse-game&#34;&gt;
&lt;style&gt;
  .cat-mouse-game {
    margin: 0;
    padding: 20px;
    font-family: sans-serif;
    display: flex;
    flex-direction: column;
    align-items: center;
  }
  .cat-mouse-game canvas {
    display: block;
    width: 100%;
    max-width: 600px;
    height: auto;
    touch-action: manipulation;
  }
  .cat-mouse-game .instructions {
    text-align: center;
    max-width: 500px;
    font-size: 14px;
    padding: 0 20px;
  }
  .cat-mouse-game .score {
    margin-bottom: 10px;
    font-size: 16px;
  }
&lt;/style&gt;
&lt;div class=&#34;score&#34; id=&#34;scoreDisplay&#34;&gt;Score: 0&lt;/div&gt;
&lt;canvas id=&#34;gameCanvas&#34; width=&#34;600&#34; height=&#34;600&#34;&gt;&lt;/canvas&gt;
&lt;div class=&#34;instructions&#34;&gt;
  &lt;p&gt;&lt;strong&gt;Instructions:&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;You are the mouse (blue). Click on a connected node to move.&lt;/p&gt;
  &lt;p&gt;The cat (red) will move after you and try to catch you.&lt;/p&gt;
  &lt;p&gt;If the cat lands on your node, the game resets and your score returns to 0.&lt;/p&gt;
  &lt;p&gt;You gain 1 point for every move you make without getting caught!&lt;/p&gt;
&lt;/div&gt;
&lt;script&gt;
const canvas = document.getElementById(&#39;gameCanvas&#39;);
canvas.width = 600;
canvas.height = 600;
const ctx = canvas.getContext(&#39;2d&#39;);
const scoreDisplay = document.getElementById(&#39;scoreDisplay&#39;);

const nodes = {
  center: { x: 300, y: 300 },
  top: { x: 300, y: 150 },
  bottomLeft: { x: 200, y: 450 },
  bottomRight: { x: 400, y: 450 },
  left: { x: 100, y: 300 },
  right: { x: 500, y: 300 }
};

const connectionLines = [
  [&#39;center&#39;, &#39;top&#39;],
  [&#39;center&#39;, &#39;bottomLeft&#39;],
  [&#39;center&#39;, &#39;bottomRight&#39;],
  [&#39;top&#39;, &#39;right&#39;],
  [&#39;right&#39;, &#39;bottomRight&#39;],
  [&#39;bottomRight&#39;, &#39;bottomLeft&#39;],
  [&#39;bottomLeft&#39;, &#39;left&#39;],
  [&#39;left&#39;, &#39;top&#39;]
];

let mouse = { node: &#39;right&#39; };
let cat = { node: &#39;center&#39; };
let score = 0;

function updateScoreDisplay() {
  scoreDisplay.textContent = `Score: ${score}`;
}

function resetGame() {
  resizeCanvasForDPR();

  const outerNodes = [&#39;top&#39;, &#39;bottomLeft&#39;, &#39;bottomRight&#39;, &#39;left&#39;, &#39;right&#39;];

  mouse.node = outerNodes[Math.floor(Math.random() * outerNodes.length)];

  const firstMoves = getValidMoves(mouse.node);
  const secondMoves = firstMoves.flatMap(n =&gt; getValidMoves(n));
  const possibleCats = secondMoves.filter(n =&gt; n !== mouse.node &amp;&amp; !firstMoves.includes(n));

  cat.node = possibleCats[Math.floor(Math.random() * possibleCats.length)] || &#39;center&#39;;

  score = 0;
  updateScoreDisplay();
  drawNodes();

  setTimeout(() =&gt; {
    moveCatTowardMouse();
    updateGame();
  }, 500);
}

function resizeCanvasForDPR() {
  const dpr = window.devicePixelRatio || 1;

  // Pick actual pixel size based on canvas container (max 600)
  const containerWidth = Math.min(canvas.parentElement.clientWidth, 600);
  const size = containerWidth;

  canvas.style.width = size + &#39;px&#39;;
  canvas.style.height = size + &#39;px&#39;;

  canvas.width = size * dpr;
  canvas.height = size * dpr;

  ctx.setTransform(1, 0, 0, 1, 0, 0);
  ctx.scale(dpr, dpr);

  updateNodePositions(size);
}


function getClickRadius() {
  return &#39;ontouchstart&#39; in window ? 25 : 15;
}

function updateNodePositions(size) {
  nodes.center = { x: size / 2, y: size / 2 };
  nodes.top = { x: size / 2, y: size * 0.25 };
  nodes.bottomLeft = { x: size * 0.33, y: size * 0.75 };
  nodes.bottomRight = { x: size * 0.66, y: size * 0.75 };
  nodes.left = { x: size * 0.15, y: size / 2 };
  nodes.right = { x: size * 0.85, y: size / 2 };
}

function drawNodes() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  connectionLines.forEach(([a, b]) =&gt; {
    const posA = nodes[a];
    const posB = nodes[b];
    ctx.beginPath();
    ctx.moveTo(posA.x, posA.y);
    ctx.lineTo(posB.x, posB.y);
    ctx.strokeStyle = &#39;#ccc&#39;;
    ctx.stroke();
  });

  Object.entries(nodes).forEach(([key, pos]) =&gt; {
    ctx.beginPath();
    ctx.arc(pos.x, pos.y, 10, 0, 2 * Math.PI);
    ctx.fillStyle = &#39;gray&#39;;
    ctx.fill();
  });

  const mousePos = nodes[mouse.node];
  ctx.beginPath();
  ctx.arc(mousePos.x, mousePos.y, 12, 0, 2 * Math.PI);
  ctx.fillStyle = &#39;blue&#39;;
  ctx.fill();

  const catPos = nodes[cat.node];
  ctx.beginPath();
  ctx.arc(catPos.x, catPos.y, 12, 0, 2 * Math.PI);
  ctx.fillStyle = &#39;red&#39;;
  ctx.fill();
}

function getValidMoves(node) {
  const moves = [];
  connectionLines.forEach(([a, b]) =&gt; {
    if (a === node) moves.push(b);
    else if (b === node) moves.push(a);
  });
  return moves;
}

function handleClick(e) {
  const rect = canvas.getBoundingClientRect();
  const x = e.clientX - rect.left;
  const y = e.clientY - rect.top;

  const clickedNode = Object.entries(nodes).find(([name, pos]) =&gt; {
    const dx = x - pos.x;
    const dy = y - pos.y;
    return Math.sqrt(dx * dx + dy * dy) &lt; getClickRadius();  
  });

  if (!clickedNode) return;

  const [clickedName] = clickedNode;
  const valid = getValidMoves(mouse.node);

  if (valid.includes(clickedName)) {
    mouse.node = clickedName;
    score++;
    updateScoreDisplay();
    updateGame(true);
  }
}

function moveCatTowardMouse() {
  const moves = getValidMoves(cat.node);

  if (moves.includes(mouse.node)) {
    cat.node = mouse.node;
  } else if (moves.length &gt; 0) {
    cat.node = moves[Math.floor(Math.random() * moves.length)];
  }
}

function isMouseTrapped() {
  const moves = getValidMoves(mouse.node);
  return moves.length === 1 &amp;&amp; moves[0] === &#39;center&#39; &amp;&amp; cat.node === &#39;center&#39;;
}

function updateGame(mouseMoved = false) {
  drawNodes();
  if (mouse.node === cat.node) {
    alert(`Final score: ${score}. Cat caught the mouse! Restarting game.`);
    resetGame();
  } else if (isMouseTrapped()) {
    alert(&#39;Mouse is trapped! Cat wins! Restarting game.&#39;);
    resetGame();
  } else if (mouseMoved) {
    setTimeout(() =&gt; {
      moveCatTowardMouse();
      updateGame();
    }, 500);
  }
}

canvas.addEventListener(&#39;click&#39;, handleClick);
canvas.addEventListener(&#39;touchstart&#39;, function(e) {
  // Prevent simulated mouse event
  e.preventDefault();
  const touch = e.touches[0];
  handleClick({ clientX: touch.clientX, clientY: touch.clientY });
}, { passive: false });

window.addEventListener(&#39;resize&#39;, () =&gt; {
  resetGame();
});

document.addEventListener(&#39;DOMContentLoaded&#39;, () =&gt; {
  resetGame(); // ✅ wait for layout before sizing canvas
});

&lt;/script&gt;
&lt;/div&gt;
</description>
        </item>
        <item>
        <title>Devops Maturity Model</title>
        <link>https://mikerossiter.tech/posts/devops-maturity-model/</link>
        <pubDate>Tue, 25 Mar 2025 10:48:43 +0000</pubDate>
        
        <guid>https://mikerossiter.tech/posts/devops-maturity-model/</guid>
        <description>&lt;img src="https://mikerossiter.tech/devops-drawing.png" alt="Featured image of post Devops Maturity Model" /&gt;&lt;h1 id=&#34;devops-maturity-model&#34;&gt;DevOps Maturity Model
&lt;/h1&gt;&lt;p&gt;Whether you&amp;rsquo;re just starting your DevOps journey or already deep into automation and delivery pipelines, it helps to know where you currently stand — and where you could go next.&lt;/p&gt;
&lt;p&gt;That’s why I created this &lt;strong&gt;DevOps Maturity Model&lt;/strong&gt; (or DMM for short), an open-source tool designed to help teams and organisations &lt;strong&gt;assess&lt;/strong&gt;, &lt;strong&gt;track&lt;/strong&gt;, and &lt;strong&gt;improve&lt;/strong&gt; their DevOps practices over time.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-so-what-is-it-then&#34;&gt;🚀 So What Is It Then?
&lt;/h2&gt;&lt;p&gt;The DMM is a simple web-based tool that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Helps you &lt;strong&gt;evaluate your DevOps capabilities&lt;/strong&gt; across multiple high level dimensions (like Automation, Infrastructure, Culture, etc.)&lt;/li&gt;
&lt;li&gt;Lets you &lt;strong&gt;visualise your progress&lt;/strong&gt; over time using a graph&lt;/li&gt;
&lt;li&gt;Generates the beginnings of a &lt;strong&gt;Gap Analysis Report&lt;/strong&gt; to help you plan improvements&lt;/li&gt;
&lt;li&gt;Is fully &lt;strong&gt;customisable&lt;/strong&gt; to match your team&amp;rsquo;s language, processes, or priorities&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;rsquo;s designed to run locally (via Docker or NPM with the source code), so that you stay in control of your data.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-why-did-i-make-it&#34;&gt;🎯 Why Did I Make It?
&lt;/h2&gt;&lt;p&gt;It was inspired by conversations I had at my organisation. I wanted to have a way to fill the gap between DevOps knowledge and understanding (e.g. Accelerate, DORA reports, DevOps Handbook, Phoenix Project etc) and what we think of as traditional DevOps tooling (Terraform, Jenkins, GitLab, GitHub, Kubernetes etc). This model does &lt;strong&gt;not&lt;/strong&gt; recommend any tooling. This is a tool to assist the user in forging communications with the wider team to produce a route to transformation aligning to DevOps principles. Additionally, I realised that most engineers are busy and have significant existing cognitive load - they might understand the requirements but fail to grasp the nuance and specifics of DevOps and need straightforward guidance. I also wanted to avoid and negative language associated with the foundation levels, such as is used in DORA&amp;rsquo;s performance levels, in order to encourage and promote even basic adoption of DevOps as a step in the right direction.&lt;/p&gt;
&lt;p&gt;Hence, I wanted something:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lightweight, portable and easy to present in workshops or retrospectives&lt;/li&gt;
&lt;li&gt;That I could tailor to different teams and contexts&lt;/li&gt;
&lt;li&gt;With enough structure to guide conversation, but not so rigid that it becomes prescriptive&lt;/li&gt;
&lt;li&gt;That was maintainable over time&lt;/li&gt;
&lt;li&gt;That incorporated visual elements to display results&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are many great frameworks that already exist out there, but I needed something that &lt;strong&gt;teams could own and evolve&lt;/strong&gt;, not just fill in once and forget. I chose to focus on how to apply real-world changes to a project so that they could set their goals on improving the key &lt;strong&gt;DORA&lt;/strong&gt; metrics.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-how-it-works&#34;&gt;🔍 How It Works
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Start with a DevOps survey&lt;/strong&gt; or quick value stream map of your project to get a baseline state.&lt;/li&gt;
&lt;li&gt;Go through the model and &lt;strong&gt;select your current level&lt;/strong&gt; for each subdimension (e.g. from “Foundational” to &amp;ldquo;Leading&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;Save your answers and generate the &lt;strong&gt;Gap Analysis Report&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use the report to plan small experiments — a &lt;strong&gt;Kata&lt;/strong&gt; or a &lt;strong&gt;PDCA cycle&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Revisit the model regularly to &lt;strong&gt;track improvements over time&lt;/strong&gt; and use the graph to see where you&amp;rsquo;re improving (or not!).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The tool gives you a visual representation of where you’re strong, where you can grow, and how things change sprint by sprint.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-customisable--developer-friendly&#34;&gt;🧩 Customisable &amp;amp; Developer-Friendly
&lt;/h2&gt;&lt;p&gt;It’s built with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node.js + Express backend&lt;/li&gt;
&lt;li&gt;HTML/CSS/JavaScript frontend&lt;/li&gt;
&lt;li&gt;SQLite database (lightweight and local)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The maturity dimensions are defined in a &lt;code&gt;dimensions.json&lt;/code&gt; file, so you can change the structure, labels, levels, and language to fit your team’s style.&lt;/p&gt;
&lt;p&gt;You can also run it locally using the Docker image, with a single command. No vendor lock-in. No SaaS required. Alternatively, run it in the cloud somewhere!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-try-it-out&#34;&gt;🛠️ Try It Out
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;View the repo: &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/devops-maturity-model/devops-maturity-model&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;DevOps Maturity Model on GitLab&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Run it with Docker:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run -d --name devops-maturity-model &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  -p 3131:3131 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  -v devops_data:/app/data &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  registry.gitlab.com/devops-maturity-model/devops-maturity-model:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-licensed-under-gpl-v3&#34;&gt;📝 Licensed Under GPL v3
&lt;/h2&gt;&lt;p&gt;This project is fully open source, licensed under the GNU General Public License v3.0. You&amp;rsquo;re free to use it, adapt it, and contribute back.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-and-finally&#34;&gt;🙏 And Finally
&lt;/h2&gt;&lt;p&gt;Thanks for reading this post. Please raise an issue if you have any problems with the model or feel free to &lt;a class=&#34;link&#34; href=&#34;https://mikerossiter.tech/contact/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;reach out&lt;/a&gt; if you find the model useful and want to ask me about it. Also, feel free to fork the model and customise it for your team or project.&lt;/p&gt;
&lt;p&gt;N.B. DevOps banner image drawn by my daughter!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Issues Setting up a Linux (Kali) VM in Azure with Terraform</title>
        <link>https://mikerossiter.tech/posts/linux-vm-azure-terraform/</link>
        <pubDate>Tue, 04 Mar 2025 13:14:50 +0000</pubDate>
        
        <guid>https://mikerossiter.tech/posts/linux-vm-azure-terraform/</guid>
        <description>&lt;img src="https://mikerossiter.tech/dragon.webp" alt="Featured image of post Issues Setting up a Linux (Kali) VM in Azure with Terraform" /&gt;&lt;h1 id=&#34;issues-setting-up-a-kali-linux-virtual-machine-in-azure-with-terraform&#34;&gt;Issues Setting up a Kali Linux Virtual Machine in Azure with Terraform
&lt;/h1&gt;&lt;p&gt;Just a quick post to show how I solved a few issues I had while trying to quickly provision a Kali Linux Virtual Machine in Azure with Terraform.&lt;/p&gt;
&lt;p&gt;A quick disclaimer, I am still quite new to Azure and I am having teething problems with work that I would have otherwise done very quickly in AWS. To begin here is some basic code to setup a Linux VM (I will leave out the extra details and allow you to decide upon SSH and password requirements for now):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;resource &amp;#34;azurerm_linux_virtual_machine&amp;#34; &amp;#34;kali_linux_vm&amp;#34; {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  name                = &amp;#34;kali-linux-vm&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  resource_group_name = azurerm_resource_group.example.name
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  location            = azurerm_resource_group.example.location
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  size                = &amp;#34;Standard_DS2_v2&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  admin_username      = &amp;#34;adminuser&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  network_interface_ids = [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    azurerm_network_interface.example.id,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  admin_ssh_key {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    username   = &amp;#34;adminuser&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    public_key = file(&amp;#34;~/.ssh/id_rsa.pub&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  os_disk {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    caching              = &amp;#34;ReadWrite&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    storage_account_type = &amp;#34;Standard_LRS&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  source_image_reference {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    publisher = &amp;#34;kali-linux&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    offer     = &amp;#34;kali&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    sku       = &amp;#34;kali-2024-2&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    version   = &amp;#34;latest&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  plan {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    name      = &amp;#34;kali-2024-2&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    publisher = &amp;#34;kali-linux&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    product   = &amp;#34;kali&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Very basic and very readable. &amp;ldquo;But Mike!&amp;rdquo; I hear you say, &amp;ldquo;The &lt;em&gt;&amp;ldquo;plan&amp;rdquo;&lt;/em&gt; isn&amp;rsquo;t on the example on the Terraform website! And where did you get all that amazing information?&amp;rdquo;. Very well observed, I shall respond. BASICALLY, my VM complained profusely if there wasn&amp;rsquo;t a plan block included. So I included it. And where did I get all that lovely information from? Well I had to tiptoe into the &lt;a class=&#34;link&#34; href=&#34;https://azuremarketplace.microsoft.com/en-gb/home&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;marketplace&lt;/a&gt;. That wonderful joint. And from there decided which image I would like to deploy. This time I chose Kali Linux. Aww, cute. You see, the values in Terraform need to exactly match the infrastructure in the marketplace. The next step is to use the Azure CLI to obtain a nice table of what is available to us.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;az vm image list --publisher kali-linux --all --output table
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;From here you will see a table that includes &lt;strong&gt;Architecture, Offer, Publisher, Sku, Urn and Version&lt;/strong&gt;. These match the source_image_reference requirements easily but not the plan.&lt;/p&gt;
&lt;p&gt;For the plan you want to match &lt;strong&gt;publisher = publisher, offer = product and sku = name&lt;/strong&gt;. See above Terraform for reference.&lt;/p&gt;
&lt;h2 id=&#34;why-do-we-need-a-plan-block&#34;&gt;Why Do We Need A Plan Block?
&lt;/h2&gt;&lt;p&gt;I don&amp;rsquo;t really know! ChatGPT says that some marketplace images are private and just do so deal with it 😎. You could probably check by running more elaborate CLI commands but no one needs that in their life.&lt;/p&gt;
&lt;h2 id=&#34;further-issues&#34;&gt;Further Issues
&lt;/h2&gt;&lt;p&gt;Upon Apply I also had an issue I didn&amp;rsquo;t expect and wasn&amp;rsquo;t recreatable within the portal if I created resources manually.&lt;/p&gt;
&lt;p&gt;What happened was I got this strange error, something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;unexpected status 400 (400 Bad Request) with error: ResourcePurchaseValidationFailed: User failed validation to purchase resources. Error message: &amp;#39;You have not accepted the legal terms on this subscription: &amp;#39;***&amp;#39; for this plan. Before the subscription can be used, you need to accept the legal terms of the image.&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So I tried shouting &amp;ldquo;I ACCEPT&amp;rdquo; at my machine but nothing happened. SO instead I decided to look into how to solve this issue, starting with Terraform.&lt;/p&gt;
&lt;p&gt;On the Terraform Registry there is a very vague &lt;a class=&#34;link&#34; href=&#34;https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/marketplace_agreement&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;agreement resource&lt;/a&gt; that says it works sometimes but not all the time. &amp;ldquo;Awesome&amp;rdquo; I thought!&lt;/p&gt;
&lt;p&gt;And as expected it didn&amp;rsquo;t work. It also didn&amp;rsquo;t work if I put a &lt;code&gt;depends_on&lt;/code&gt; statement in my vm code. At this point I did feel like throwing the towel in but I continued. This is what worked for me. And it&amp;rsquo;s more CLI work but hey there you go.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;az vm image terms accept --publisher kali-linux --offer kali --plan kali
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;az vm image terms show --publisher kali-linux --offer kali --plan kali
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The second command should display &lt;code&gt;&amp;quot;accepted&amp;quot;, true,&lt;/code&gt; in lovely readable json at the top of the result.&lt;/p&gt;
&lt;p&gt;Therefore I needed to accept the terms manually in the CLI before it could build the resource.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t like this! And if this works for you, I bet you won&amp;rsquo;t like it either! It should be acceptable in the pipeline or apply stage of your build but anyway. This worked for me. I have much more to learn but before I forgot all about this, I wanted to share my experience.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>VPC IP Address Selector</title>
        <link>https://mikerossiter.tech/posts/vpc-ip-address-selector/</link>
        <pubDate>Thu, 18 Jan 2024 13:28:39 +0000</pubDate>
        
        <guid>https://mikerossiter.tech/posts/vpc-ip-address-selector/</guid>
        <description>&lt;img src="https://mikerossiter.tech/ips.png" alt="Featured image of post VPC IP Address Selector" /&gt;&lt;h1 id=&#34;cidr-block-tool-for-vpc-ip-addresses&#34;&gt;CIDR block tool for VPC IP addresses
&lt;/h1&gt;&lt;p&gt;This tool will take an IP address written by yourself and the number of IP addresses you require for your VPC on AWS or other since this is not something you want to get wrong as you may need to migrate your resources later if you underestimate the number of IPs you need. It will then output the IP with the correct CIDR block and the IP range you will receive. Remember in AWS the first three addresses are reserved for the VPC router, DNS and future use and the final address is used as the broadcast address. Also, the amount of IP addresses that will be returned will be a close estimation of what you have requested so double check the range after entering the values. &lt;em&gt;ALSO, if you&amp;rsquo;re testing this out for use with a VPC in AWS then remember that you only have between /16 (65,536 IP addresses) to /28 (16 IP addresses)!&lt;/em&gt;&lt;/p&gt;
&lt;body&gt;
    &lt;label for=&#34;ipAddress&#34;&gt;IP Address:&lt;/label&gt;
    &lt;input type=&#34;text&#34; id=&#34;ipAddress&#34; placeholder=&#34;Enter the IP address&#34; value=&#34;10.0.0.0&#34;&gt;
    &lt;label for=&#34;numAddresses&#34;&gt;Number of IP Addresses:&lt;/label&gt;
    &lt;input type=&#34;number&#34; id=&#34;numAddresses&#34; placeholder=&#34;Enter the number of IP addresses&#34; value=&#34;100&#34;&gt;
    &lt;button onclick=&#34;calculateCIDR()&#34;&gt;Calculate CIDR Block&lt;/button&gt;
    &lt;p id=&#34;result&#34;&gt;&lt;/p&gt;
    &lt;p id=&#34;ipRange&#34;&gt;&lt;/p&gt;
    &lt;script src=&#34;https://mikerossiter.tech/js/ip-vpc.js&#34;&gt;&lt;/script&gt;
&lt;/body&gt;
</description>
        </item>
        <item>
        <title>DrawIO Diagrams for MSc Digital and Tech</title>
        <link>https://mikerossiter.tech/posts/drawio-diagrams-for-msc-digital-and-tech/</link>
        <pubDate>Mon, 18 Dec 2023 11:22:50 +0000</pubDate>
        
        <guid>https://mikerossiter.tech/posts/drawio-diagrams-for-msc-digital-and-tech/</guid>
        <description>&lt;img src="https://mikerossiter.tech/diagrams.png" alt="Featured image of post DrawIO Diagrams for MSc Digital and Tech" /&gt;&lt;h1 id=&#34;drawio-diagrams-for-the-msc-digital-and-tech-course&#34;&gt;DrawIO Diagrams for the MSc Digital and Tech course
&lt;/h1&gt;&lt;p&gt;The reason why my blog has been so quiet this year has been because I began a masters in digital and tech at the University of Northumbria earlier this year and also because ChatGPT came along and sort of ruined my fun a bit. Now most of my ideas for blog posts have become null and void! Anyway, I will persist and change my angle a bit to adapt to this new brave world of AI.&lt;/p&gt;
&lt;p&gt;Instead I thought I might share some of my creations! If you are reading this because you are also on the MSc in digital and tech then you have my sincere condolences&amp;hellip;&lt;/p&gt;
&lt;p&gt;Only kidding! It&amp;rsquo;s a great course but it has taken a lot out of me this year and I am writing this as I am in the swathes of Covid during Christmas and at the end of a long, long year. I do enjoy the academic writing despite it being twenty years since I last wrote anything vaguely academic. I have learnt so many academic frameworks and tools that are applicable to my line of work and are really helping me manage my workload and to understand how my job role as DevOps engineer came to exist.&lt;/p&gt;
&lt;p&gt;So in this article I thought I would share some of the diagrams I have created so far. I will try to keep them generic and feel free to amend them, although if you do use them I would love a credit!&lt;/p&gt;
&lt;p&gt;You will find them all at my repo at: &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/mikerossiter/draw-io-diagrams&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://gitlab.com/mikerossiter/draw-io-diagrams&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;So far I have examples of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gibb&amp;rsquo;s Reflective Framework&lt;/li&gt;
&lt;li&gt;Porter&amp;rsquo;s Five Force Model&lt;/li&gt;
&lt;li&gt;Stakeholder Analysis&lt;/li&gt;
&lt;li&gt;Chesborough Open Innovation Funnel&lt;/li&gt;
&lt;li&gt;Basic Balanced Scorecard (Not really a fan of this model but it might be useful to someone. I would edge toward the Agile version of the scorecard as suggested by Agile Strategy Management in the Digital Age by Wiraeus and Creelman)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most of which are visible in the mashed up header I&amp;rsquo;ve created!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>AWS Solutions Architect Associate Exam (CO3)</title>
        <link>https://mikerossiter.tech/posts/aws-solutions-architect-associate/</link>
        <pubDate>Sun, 29 Jan 2023 22:16:56 +0000</pubDate>
        
        <guid>https://mikerossiter.tech/posts/aws-solutions-architect-associate/</guid>
        <description>&lt;img src="https://mikerossiter.tech/aws-saa.png" alt="Featured image of post AWS Solutions Architect Associate Exam (CO3)" /&gt;&lt;h1 id=&#34;aws-solutions-architect-associate-exam&#34;&gt;AWS Solutions Architect Associate Exam
&lt;/h1&gt;&lt;p&gt;The AWS Solutions Architect exam is an intermediate exam in the programme of &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/certification/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AWS certifications&lt;/a&gt; and is arguably the most desired certificate of them all. Or at least to begin with. It is a great step on from the AWS Cloud Practitioner exam as well. It is very popular with people starting out in a career in IT but AWS does recommend some experience working with AWS before taking the exam. I would like to reiterate this advice too. Oh yes.&lt;/p&gt;
&lt;h2 id=&#34;studying&#34;&gt;Studying
&lt;/h2&gt;&lt;p&gt;I would be lying if I said I enjoyed the process of studying for this exam! On the one hand, I did learn an awful lot and more than I have ever had to learn for any exam, ever. But that said, the sheer volume of the material required for the exam meant I had to pretty much take the same A Cloud Guru course twice. Every course I found that covered the AWS SAA-CO3 seemed to last anywhere from 25 to 50 hours. I started studying back in September 2022 and had made it to half way through my first course when&amp;hellip;.. the exam changed! It moved from CO2 to CO3! And it was contained fairly big changes and additions too! This hindered my plan to take the exam in October/November but I ended up taking in December 2022 instead. So I urge you to check the certification website and make sure you plan your learning journey to exam timeline. &lt;em&gt;At this point in time I can tell you the the DevOps Pro exam is changing in March 2023 for example&lt;/em&gt;. But no biggy but it was a bit frustrating and I wished I had planned things better. Still, I studied on average from two hours to five hours a night, five nights a week, which is my usual sort of routine when I have an exam coming up.&lt;/p&gt;
&lt;h2 id=&#34;learning-material&#34;&gt;Learning material
&lt;/h2&gt;&lt;p&gt;Course wise I began by taking the &lt;a class=&#34;link&#34; href=&#34;https://acloudguru.com/course/aws-certified-solutions-architect-associate-saa-c03&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;A Cloud Guru SAA-CO3&lt;/a&gt; course which is around 45 hours long although this includes a rough estimate on each of the hands-on labs. I really like the hands-on labs that A Cloud Guru provide. They are top notch and really help but they could sometimes do with going into a bit more detail on occasion. They also had handy dots next to each new section when they made updates to the course and really useful summary videos. I would&amp;rsquo;ve preferred it if they could&amp;rsquo;ve stayed with the same instructor for the whole course but I still liked taking and it was generally very good.&lt;/p&gt;
&lt;p&gt;I also bought this book &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.co.uk/dp/1119982626?psc=1&amp;amp;ref=ppx_yo2ov_dt_b_product_details&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AWS Solutions Architect Associate Study Guide by Ben Piper&lt;/a&gt;. Twice in fact! For reasons mentioned earlier&amp;hellip;. I found this useful as I like to read as well as do and listen so added an extra dimension to my learning and I had no issues with the book at all. There are handy questions at the end of each section to test you and they are quite taxing but then so is the exam. More on that later.&lt;/p&gt;
&lt;p&gt;I also took some &lt;a class=&#34;link&#34; href=&#34;https://www.udemy.com/course/aws-certified-solutions-architect-associate-practice-tests-k/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Neal Davis Practise Exams&lt;/a&gt; from Udemy and the &lt;a class=&#34;link&#34; href=&#34;https://portal.tutorialsdojo.com/courses/aws-certified-solutions-architect-associate-practice-exams/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Tutorial Dojo&lt;/a&gt; practise tests by Jon Bonso which came highly recommended and which were very, very difficult to begin with and really did feel like the real thing.&lt;/p&gt;
&lt;h2 id=&#34;exam-experience&#34;&gt;Exam experience
&lt;/h2&gt;&lt;p&gt;This exam was the final death knell to my remote exam experience! I have done so many of these things and the last AWS one by Pearson Vue was the only one that didn&amp;rsquo;t have some kind of minor/major hiccup so I was hoping for a smooth experience. I hoped wrong! I had run the recommended tests. I was in a quiet meeting room in my place of work. I had no distractions. No work VPN. No problems. I even had an unlabelled bottle of water. I felt good. For goodness sake I even had my wife&amp;rsquo;s Windows 11 laptop! But hey ho I couldn&amp;rsquo;t get into the exam for love nor money. Not that I offered either. I got so far and the application would time out and fail. So I complained to Pearson Vue and they admitted that there was some kind of fault and I was due a refund. Frustrating but this led me to take the exam at a test center in Leeds. I tried to book a Pearson Vue exam but there were none available until Feb/March time so I opted for the a PSI centre in Leeds where I could take the exam in a few weeks in early December. It was a totaly breeze if slightly odd blast from the past being in a grey office in the centre of a city on a grey and very cold day in Yorkshire. I&amp;rsquo;m glad I took my coat. The staff were friendly even though it was minus 4 in the room. It was the usual set up of machines flanked by screens. The questions were VERY tough and much harder than expected. I did rattle through them though and did a lot of flagging. Questions that is. I went back over the flagged questions then bidded my farewells and was out in an hour and a half with about 40 minutes left I think. You get 130 minutes to take the exam.&lt;/p&gt;
&lt;p&gt;I received my result in about 24 hours time. I had a pass mark 80s and was very happy with the result. Hugely pleased and a big weight was lifted from my shoulders and I could safely return to reality armed with a wealth of information which was already making my job easier in terms of architecting for AWS.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not in a rush to take another AWS exam or any platform for that matter. I feel a bit odd paying so much to take an exam for a proprietary bit of kit that I have to pay to use that isn&amp;rsquo;t open source or that stands for the kinds of things that matter to me or that is such a behemoth in everybodys daily lives BUT that said it has been massively useful and beneficial to my role as a DevOps engineer. If I needed to use another platform I would still consider taking an exam as it&amp;rsquo;s a great way to get to grips with the service.&lt;/p&gt;
&lt;div data-iframe-width=&#34;150&#34; data-iframe-height=&#34;270&#34; data-share-badge-id=&#34;31d2f4be-de89-4a0a-944f-e4e2ed1f60a5&#34; data-share-badge-host=&#34;https://www.credly.com&#34;&gt;&lt;/div&gt;&lt;script type=&#34;text/javascript&#34; async src=&#34;//cdn.credly.com/assets/utilities/embed.js&#34;&gt;&lt;/script&gt;
</description>
        </item>
        <item>
        <title>How to View Your Public IP Address in the Command Line</title>
        <link>https://mikerossiter.tech/posts/how-to-view-your-ip-address-in-the-command-line/</link>
        <pubDate>Tue, 04 Oct 2022 10:27:19 +0100</pubDate>
        
        <guid>https://mikerossiter.tech/posts/how-to-view-your-ip-address-in-the-command-line/</guid>
        <description>&lt;img src="https://mikerossiter.tech/world.png" alt="Featured image of post How to View Your Public IP Address in the Command Line" /&gt;&lt;h1 id=&#34;how-to-view-your-public-ip-address-in-the-command-line&#34;&gt;How to View Your Public IP Address in the Command Line
&lt;/h1&gt;&lt;p&gt;This is a short post but I discovered a really handy API in a great website: &lt;a class=&#34;link&#34; href=&#34;https://www.myip.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MyIP.com&lt;/a&gt; No ads either. (&lt;em&gt;Noice!&lt;/em&gt;) It shows you your IP and some interesting stats too. I have utilised the API of the website to make this handy command because it isn&amp;rsquo;t often that straightforward and running &lt;code&gt;ip a&lt;/code&gt; or &lt;code&gt;ifconfig&lt;/code&gt; only shows you the addresses for what is happening locally. So the command I&amp;rsquo;m using is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -s https://api.myip.com | jq .ip | tr -d \&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Taking this apart, we can run the curl command and return some useful values in json format. Hence the inclusion of the &lt;code&gt;jq&lt;/code&gt; parse tool which pulls out only the IP address. Finally the &lt;code&gt;tr&lt;/code&gt; tool simply trims off the surrounding quotes which is nicer to look at and might make this command more useful in a script or something. I don&amp;rsquo;t know. Or whatever you want to use it for.&lt;/p&gt;
&lt;p&gt;So there you go! If this helped you too then you can help me stay awake by &lt;a class=&#34;link&#34; href=&#34;https://www.buymeacoffee.com/mikerossiter&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;buying me a coffee&lt;/a&gt;. Thanks!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Tutorial How to Use Gitlab Package Registry as a Helm Chart Repository</title>
        <link>https://mikerossiter.tech/posts/tutorial-how-to-use-gitlab-package-registry-as-a-helm-chart-repository/</link>
        <pubDate>Mon, 03 Oct 2022 12:12:30 +0100</pubDate>
        
        <guid>https://mikerossiter.tech/posts/tutorial-how-to-use-gitlab-package-registry-as-a-helm-chart-repository/</guid>
        <description>&lt;img src="https://mikerossiter.tech/helmandgitlab.png" alt="Featured image of post Tutorial How to Use Gitlab Package Registry as a Helm Chart Repository" /&gt;&lt;h1 id=&#34;how-to-use-gitlab-package-registry-as-a-helm-chart-repository-august-2022&#34;&gt;How to use Gitlab Package Registry as a Helm Chart Repository (August 2022)
&lt;/h1&gt;&lt;p&gt;I have seen a few blog posts cover this area but I had to make some minor changes in order to get the examples to work. Here is my edit. I have dated the title as I am under no illusion that things may change and features will be added as is so often the case. I have used a combination of steps produced here: &lt;a class=&#34;link&#34; href=&#34;https://docs.gitlab.com/ee/user/packages/helm_repository/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.gitlab.com/ee/user/packages/helm_repository/&lt;/a&gt; and from other sites. These steps are run from a Linux machine.&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites
&lt;/h2&gt;&lt;p&gt;For this tutorial you need to install:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Minikube&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Helm&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;and have a working &lt;a class=&#34;link&#34; href=&#34;https://www.gitlab.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitLab&lt;/a&gt; account.&lt;/p&gt;
&lt;h2 id=&#34;tutorial&#34;&gt;Tutorial
&lt;/h2&gt;&lt;p&gt;So first head towards a folder in your local terminal where you can create an example Helm project:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;helm create example
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will create a folder called “example” in the directory that you are in and within that directory will be all the requirements for a basic Helm deployment. Feel free to have a look around.&lt;/p&gt;
&lt;p&gt;Then create a new project in GitLab called “example”.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/repoblankproj.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Create Example Project&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Leave all the defaults as is for now. This is just a test.&lt;/p&gt;
&lt;p&gt;Then add your repo locally. This is the one that Helm will use to replicate your charts across your projects. For this you will need the Project ID from your project. This is located at the top of the page under the project title:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/repoexampleno.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Example project ID&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;You can click the clipboard image to the right of the ID to copy it to the clipboard.&lt;/p&gt;
&lt;p&gt;You will also need to create a Personal Access Token. To do this click on your little person icon in the top right of the screen and select Preferences.&lt;/p&gt;
&lt;p&gt;Then select Access Tokens on the left of the screen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/repoaccesstokens.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;GitLab access tokens&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Give your token a name (any will do), an expiration date and a scope of “api” or whatever you feel comfortable with. You might wish to use this token for other work. I don’t know. It’s your token.&lt;/p&gt;
&lt;p&gt;Don’t forget to copy the name of the token as this is now your password! Otherwise you will have to follow these steps again. Boring.&lt;/p&gt;
&lt;p&gt;Then run the Helm repo add command with this URL replacing the relevant fields such as username, password-token and project_ID:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;helm repo add --username &amp;lt;username&amp;gt; --password &amp;lt;password-token&amp;gt; example https://gitlab.com/api/v4/projects/&amp;lt;project ID&amp;gt;/packages/helm/stable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/repoadd.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Repo added&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Now move into the “example” folder in your terminal:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cd example
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Package the contents of the folder:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;helm&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now install the Chart Museum plugin to push the package to the registry. Don’t worry. This still sends your package to your GitLab repo and not someone elses! For some reason the builtin Helm push command didn’t work for me and required an &lt;strong&gt;OCI://&lt;/strong&gt; path. This command will copy your newly made Tarball of your Helm folder and put it in the package registry in your GitLab repo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;helm plugin install https://github.com/chartmuseum/helm-push.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;helm cm-push example-0.1.0.tgz example
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In your GitLab project window, head to Packages &amp;amp; Registries on the left hand side and select Package Registry. As if by magic, it should now be there.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/repopackageregistry.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Package added&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Now check your repo is installed and listed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;helm repo list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It should list the NAME example and URL that you passed earlier with the Helm repo add command.&lt;/p&gt;
&lt;p&gt;Start your local cluster:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;minikube start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Install your Helm chart:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;helm install example example/example
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check that the Helm chart has deployed.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;k get deploy -A
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;And so there it is! I really hope this has helped you. If you run into an issue then just let me know via the various social media icons beneath my avatar on the left. If this did help you then feel free to &lt;a class=&#34;link&#34; href=&#34;https://www.buymeacoffee.com/mikerossiter&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Buy Me A Coffee&lt;/a&gt;!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>How to Count Whitespace in the Terminal</title>
        <link>https://mikerossiter.tech/posts/how-to-count-whitespace-in-the-terminal/</link>
        <pubDate>Mon, 03 Oct 2022 11:44:03 +0100</pubDate>
        
        <guid>https://mikerossiter.tech/posts/how-to-count-whitespace-in-the-terminal/</guid>
        <description>&lt;img src="https://mikerossiter.tech/counting.png" alt="Featured image of post How to Count Whitespace in the Terminal" /&gt;&lt;h1 id=&#34;how-to-count-whitespace-in-the-terminal&#34;&gt;How to Count Whitespace in the Terminal
&lt;/h1&gt;&lt;p&gt;Just a quick post. I might update this later if I improve the content but for now I have found a quick way to reliably count whitespaces in text in the terminal.&lt;/p&gt;
&lt;p&gt;Initially I thought to &lt;code&gt;cat&lt;/code&gt; the contents of the file and use &lt;code&gt;tr&lt;/code&gt; to trim to just spaces and then to count the remaining space characters with &lt;code&gt;wc -m&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Annoyingly there is a new line included at the end which you can&amp;rsquo;t see but is still counted. Therefore I devised another way using &lt;code&gt;printf&lt;/code&gt; which, if you do any coding in C or the such like, you will be familiar with but you might not be aware that it works in the terminal too.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;printf &amp;#34;1 2 3 4&amp;#34; | tr -cd &amp;#39;[:space:]&amp;#39; | wc -m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Produces a result of &lt;code&gt;3&lt;/code&gt;. That&amp;rsquo;s we wanted and that&amp;rsquo;s what we got. It&amp;rsquo;ll do for now!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>How I Passed the Hashicorp Terraform Associate Exam</title>
        <link>https://mikerossiter.tech/posts/how-i-passed-the-hashicorp-terraform-associate-exam/</link>
        <pubDate>Fri, 30 Sep 2022 15:51:33 +0100</pubDate>
        
        <guid>https://mikerossiter.tech/posts/how-i-passed-the-hashicorp-terraform-associate-exam/</guid>
        <description>&lt;img src="https://mikerossiter.tech/tfassoc.png" alt="Featured image of post How I Passed the Hashicorp Terraform Associate Exam" /&gt;&lt;h1 id=&#34;how-i-passed-the-hashicorp-terraform-associate-exam&#34;&gt;How I Passed the Hashicorp Terraform Associate Exam
&lt;/h1&gt;&lt;p&gt;I recently passed the Hashicorp Terraform Associate exam and I&amp;rsquo;m over the moon!&lt;/p&gt;
&lt;p&gt;I think I was lulled into a false sense of security with this one having used Terraform for over 6 months before taking the exam. Lots of folk online were barking on about how easy it was. I didn&amp;rsquo;t think it was that easy personally! But here&amp;rsquo;s what I did to prepare:&lt;/p&gt;
&lt;p&gt;I took several courses. I&amp;rsquo;d already taken an introductory course in Terraform on &lt;a href=&#34;https://www.linkedin.com/learning&#34; target=&#34;_blank&#34; rel=&#34;noreferrer noopener&#34;&gt;LinkedIn Learning&lt;/a&gt; by Josh Samuelson which was a very good intro for a total beginner. Remember you will need to have some proficiency on the command line before you begin, ideally in Linux but Terraform will work on Mac or Windows.&lt;/p&gt;
&lt;p&gt;I also took the &lt;a href=&#34;https://acloudguru.com/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer noopener&#34;&gt;Cloud Guru &lt;/a&gt;Terraform Associate course but my favourite of all, which was the most detailed and most hands on was Ned Bellavance&amp;rsquo;s course on &lt;a href=&#34;https://www.pluralsight.com/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer noopener&#34; title=&#34;Pluralsight&#34;&gt;Pluralsight&lt;/a&gt;. The only downside was that it lacks the built-in labs that Cloud Guru applies. Nonetheless his two courses (Getting Started and Deep Dive) on Terraform were the most applicable to the exam. Please keep an eye on your account after destroying resources. I once left something on for a week after I thought I had destroyed it and it cost me quite a few quid!&lt;/p&gt;
&lt;p&gt;It really helps if you have hands on experience with Terraform otherwise so much of the exam won&amp;rsquo;t make sense and I don&amp;rsquo;t feel you could answer questions in a job interview succintly without having actually used it.&lt;/p&gt;
&lt;p&gt;I also paid for some mock exams on &lt;a href=&#34;https://www.udemy.com/course/terraform-associate-practice-exam/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer noopener&#34;&gt;Udemy&lt;/a&gt;. These were excellent and were very similar to the real exam in the way the questions were constructed.&lt;/p&gt;
&lt;h2 id=&#34;the-exam&#34;&gt;The Exam
&lt;/h2&gt;&lt;p&gt;The exam was a mixture of multiple choice questions, some of which had multiple answers and few true or false questions too. There was also a couple of &amp;ldquo;fill in the blank&amp;rdquo; type questions. I believe these have a variety of correct answers so no need to stress over that aspect particularly. There were 59 questions and the exam lasted 60 mins. I completed the exam in around 30 minutes and went back over the questions I had flagged that I wasn&amp;rsquo;t sure about. Many of the questions could be answered by eliminating daft answers that were incorrect.&lt;/p&gt;
&lt;p&gt;I would say that the questions were tricky and were worded in such a way as to try and catch you out. You should read and re-read the questions multiple times to be sure. In one particular question I thought the answer was repeated twice but I realised that I just hadn&amp;rsquo;t read the answers properly and was rushing a little bit too much.&lt;/p&gt;
&lt;h2 id=&#34;running-psi-secure-browser-on-linux&#34;&gt;Running PSI Secure Browser on Linux
&lt;/h2&gt;&lt;p&gt;This exam was an absolute nightmare to access as a Linux user. I don&amp;rsquo;t use Windows or Mac and neither do any of my colleagues. I did get the exam to work on Pop OS (Ubuntu 22.04 LTS) but I seriously suggest using a Windows or Mac laptop to take the exam which I really abhor doing. BUT between me and my great colleague Jake, we did get the exam to work and here&amp;rsquo;s how.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Firstly run the compatibility test to be sure you have the necessary requirements to take the exam.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Secondly, open FIREFOX.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thirdly, launch the exam after logging into the PSI dashboard from your email.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press the Launch exam button and wait for the plugin/extension to download. It might not work on the first try so be patient.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lastly, unpack the Tar file you have downloaded and the double click the binary that it unpacks.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That was enough for me to launch the PSI Secure Browser and start the exam. Everything else was fine as long as you have closed all applications first although I think the browser plugin does it for you. It won&amp;rsquo;t open Firefox or use Firefox so don&amp;rsquo;t worry.&lt;/p&gt;
&lt;p&gt;I thought this was a real shame and I didn&amp;rsquo;t have this issue with Pearson VUE when I took my AWS Cloud Practitioner exam in 2021.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>The Binary Unix Clock</title>
        <link>https://mikerossiter.tech/posts/the-binary-unix-clock/</link>
        <pubDate>Fri, 30 Sep 2022 10:44:14 +0100</pubDate>
        
        <guid>https://mikerossiter.tech/posts/the-binary-unix-clock/</guid>
        <description>&lt;img src="https://mikerossiter.tech/clock.png" alt="Featured image of post The Binary Unix Clock" /&gt;&lt;h1 id=&#34;the-binary-unix-clock&#34;&gt;The Binary Unix Clock
&lt;/h1&gt;&lt;p&gt;This is the time as your computer or device will see it. &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Unix_time&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;More info about Unix Time&lt;/a&gt;&lt;/p&gt;
&lt;body&gt;
&lt;style&gt;
body {
    background: #111111;
}
.clock {
    //position: absolute;
    //top: 50%;
    //left: 55%;
	//width: 11em;      
    //background-color: white;       
    //border: 2px solid black;      
    //padding: 10px;      
    word-wrap: break-word;   
    //transform: translateX(-50%) translateY(-50%);
    //color: #000000;
    //font-size: 2pt;
    font-family: &#39;Alegreya Sans SC&#39;, Arial, sans-serif;
    //letter-spacing: 7px;
	font-size:6vw
}
&lt;p&gt;&lt;/style&gt;&lt;/p&gt;
&lt;div id=&#34;DigitalCLOCK&#34; class=&#34;clock&#34; onload=&#34;showTime()&#34;&gt;&lt;/div&gt;
&lt;script&gt;
function showTime(){
    
  var s = (Math.round(Date.now() / 1000)).toString(2); 
    
  var time = s;
  document.getElementById(&#34;DigitalCLOCK&#34;).innerText = time;
    
  setTimeout(showTime, 1000);
    
}
 
showTime();
&lt;/script&gt;
&lt;/body&gt;</description>
        </item>
        <item>
        <title>Bored of Bash? Try Zsh</title>
        <link>https://mikerossiter.tech/posts/bored-of-bash-try-zsh/</link>
        <pubDate>Thu, 29 Sep 2022 08:29:13 +0100</pubDate>
        
        <guid>https://mikerossiter.tech/posts/bored-of-bash-try-zsh/</guid>
        <description>&lt;img src="https://mikerossiter.tech/zsh-header.jpg" alt="Featured image of post Bored of Bash? Try Zsh" /&gt;&lt;h1 id=&#34;bored-of-bash-try-zsh&#34;&gt;Bored of BASH? Try ZSH!
&lt;/h1&gt;&lt;p&gt;For years and years I used the standard Bash (Bourne Again shell) terminal and I still do as it is mostly the default shell but these days I tend to veer towards Zsh (Zee shell! or Zed shell if you&amp;rsquo;re me) for its sheer ease of customisation in the shape of various installable plugins. I was introduced to this by an awesome colleague of mine way back in 2021 and I haven&amp;rsquo;t looked back since. This is how I customise and use Zsh but there are hundreds of other ways to do the same thing. I hope this piques some interest for a few intermediate terminal users looking to nerdify their Linux environment.&lt;/p&gt;
&lt;h2 id=&#34;change-your-default-shell-to-zsh-or-any-other-shell-for-that-matter&#34;&gt;Change your default shell to Zsh (or any other shell for that matter)
&lt;/h2&gt;&lt;p&gt;This depends on your distribution of choice. You might want to leave this step til the end in case you decide you hate Zsh and never want to use it again. If you want to try out other shells available to you by your distribution (Ubuntu, Fedora, Debian, etc) then all you need to do is type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /etc/shells
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;into your terminal. If you type the name of the particular shell that you want to try into your terminal i.e.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zsh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then you are now using that shell. To exit just type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;exit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;ldquo;Are you really a Devops engineer???&amp;rdquo; I can hear you shouting. Honest I is. So here&amp;rsquo;s some cooler stuff.&lt;/p&gt;
&lt;p&gt;If you want the new shell (zsh in this case) to persist then you need to type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chsh -s /bin/zsh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I just realised that &lt;strong&gt;chsh&lt;/strong&gt; might need to be installed first so double check. If for whatever reason zsh is not installed then try the repository for your distro and have another crack at adding it. There are many ways to add the shell to your environment and this is just one. If you want to confirm which shell you are using as default then type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;echo $SHELL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You may have to log out and back in again to get the terminal to accept the new changes.&lt;/p&gt;
&lt;h2 id=&#34;install-oh-my-zsh&#34;&gt;Install Oh My Zsh
&lt;/h2&gt;&lt;p&gt;OK, so now you&amp;rsquo;re using Zsh and you think so what?&lt;/p&gt;
&lt;p&gt;Well this is the cool bit. There&amp;rsquo;s this plugin called &lt;a href=&#34;https://ohmyz.sh/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer noopener&#34;&gt;Oh My Zsh&lt;/a&gt; that I absolutely love. It makes configuration so much simpler and makes your terminal just look really awesome.&lt;/p&gt;
&lt;p&gt;There are clear instructions on how to install Oh-My-Zsh on their website or on their &lt;a href=&#34;https://github.com/ohmyzsh/ohmyzsh/wiki&#34;&gt;GitHub&lt;/a&gt; page but you can start by inputting:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;in order to install Oh-My-Zsh if you have Curl installed. You can do the same with Wget and instructions are available on the site.&lt;/p&gt;
&lt;h2 id=&#34;installing-the-powerlevel-10k-theme&#34;&gt;Installing the Powerlevel 10K theme
&lt;/h2&gt;&lt;p&gt;If you have read the Oh-My-Zsh website in detail by now, you will see that there are lots of awesome themes you can use and you might want to just stop there. I prefer to use the &lt;a href=&#34;https://github.com/romkatv/powerlevel10k&#34;&gt;Powerlevel10K&lt;/a&gt; theme. In order to use it you first need to install the &lt;a href=&#34;https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf&#34;&gt;MesloLGS NF Regular&lt;/a&gt; font. In Linux this is very easy. Download that font and open it and press &amp;lsquo;Install&amp;rsquo;. See? Told you. Again, instructions are on the Powerlevel10K link above. You might also have to change your font to Meslo NF Regular in your terminal emulator of choice. I choose: Terminator.&lt;/p&gt;
&lt;p&gt;To install the theme with Oh-My-Zsh installed all you need to do is type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;assuming you have git installed. If not consult your preferred repository in the usual manner but I assume you have the capacity to install Git and Curl by this point.&lt;/p&gt;
&lt;p&gt;Now to get the most out of Zsh then you need to edit your shiny .zshrc file located in your home or &amp;ldquo;~&amp;rdquo; directory. Type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ZSH_THEME=&amp;#34;powerlevel10k/powerlevel10k&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;at the head of your file using Vim or Nano and save and quit.&lt;/p&gt;
&lt;p&gt;Now in order to make your terminal look something like mine:&lt;/p&gt;
&lt;p&gt;![Cool looking terminal(/zsh-cli.png)&lt;/p&gt;
&lt;p&gt;you need to configure Powerlevel10K by typing in:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;p10k configure
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will give you a prompt with some questions about how cool to make your terminal prompt look. They are fairly straightforward. If the icons don&amp;rsquo;t appear just check that you have the Meslo font installed. Maybe exit and open the terminal again if it&amp;rsquo;s playing up. The Linux equivalent of turn it off and on.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/powerlevel.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Powerlevel Install&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Now you have your theme and your shell decided upon. It is time to make it do even cooler stuff. Yes that&amp;rsquo;s right. Now you can:&lt;/p&gt;
&lt;h2 id=&#34;install-plugins&#34;&gt;Install Plugins!
&lt;/h2&gt;&lt;p&gt;This is what separates the hipsters from the imposters(?). I couldn&amp;rsquo;t think of a better analogy, sorry.&lt;/p&gt;
&lt;p&gt;Anyway! There are a few other blogs and guides that show you these plugins and that is because they are super helpful, will increase your general workflow and make you look like a terminal wizard (Gandalf style beard = optional but preferred). We are talking &lt;a href=&#34;https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/INSTALL.md&#34; target=&#34;_blank&#34; rel=&#34;noreferrer noopener&#34;&gt;syntax highlighting&lt;/a&gt; and auto-suggestions! Yeah man!&lt;/p&gt;
&lt;p&gt;Syntax highlighting will show you when a command is not installed by making it red and by making a command that does work, green. Auto-suggestions will show you commands you have run in the past and you can save time by pressing the right arrow key to complete the text. For instance this grey section is the suggestion:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/suggestion.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Suggestion&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;And this shows the command that will fail:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/bad-zsh.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;BAD!&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;And this is when it works:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/suggest-works.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;GOOD!&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Simply clone these two repos to the required home location for Oh-My-Zsh:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/zsh-users/zsh-syntax-highlighting.git git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now you have cloned the repos for the plugins you need to enable them in your .zshrc file. Open the file and search for &amp;ldquo;plugins&amp;rdquo;. You should find a heading and a plugin in brackets. Edit this to look like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;plugins=(
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	zsh-syntax-highlighting
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	zsh-autosuggestions
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I have also added &amp;ldquo;git&amp;rdquo;, &amp;ldquo;kubectl&amp;rdquo;, &amp;ldquo;colored-man-pages&amp;rdquo; and &amp;ldquo;terraform&amp;rdquo; to this list among others. I think git is usually already included by default but you can find more plugins at the &lt;a href=&#34;https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins&#34; target=&#34;_blank&#34; rel=&#34;noreferrer noopener&#34;&gt;GitHub repo&lt;/a&gt; for Oh My Zsh plugins. Some of them are simple aliases for commands which I find really useful but others have more elaborate results.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;And away you go! Feel free to experiment with themes and plugins for Zsh to your heart&amp;rsquo;s content. I hope this helped. Feel free to comment, email or even &lt;a href=&#34;https://www.buymeacoffee.com/mikerossiter&#34; target=&#34;_blank&#34; rel=&#34;noreferrer noopener&#34;&gt;buy me a coffee&lt;/a&gt;! Thanks for reading!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>AWS Cloud Practitioner Exam</title>
        <link>https://mikerossiter.tech/posts/aws-cloud-practitioner-exam/</link>
        <pubDate>Tue, 27 Sep 2022 09:02:50 +0100</pubDate>
        
        <guid>https://mikerossiter.tech/posts/aws-cloud-practitioner-exam/</guid>
        <description>&lt;img src="https://mikerossiter.tech/awscloudprac.png" alt="Featured image of post AWS Cloud Practitioner Exam" /&gt;&lt;p&gt;&lt;em&gt;N.B. Correct as of 2021!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The AWS Cloud Practitioner is a foundational level exam that is important for an overview of AWS as a whole and arguably one of the most important exams you can take at the moment if you&amp;rsquo;re interested in a career in cloud engineering or devops. &lt;a href=&#34;https://aws.amazon.com/certification&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/certification&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://aws.amazon.com/certification&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I studied for this exam over six months ago and then was sidetracked by taking the Certified Kubernetes Administrator exam that I had to complete at the Linux Foundation. I finally completed the Cloud Practitioner exam recently and thought I&amp;rsquo;d share my path to passing the certification.&lt;/p&gt;
&lt;p&gt;Firstly, I took the AWS Cloud Practitioner Essentials course. It is a six-hour course that prepares you to take the exam and obtain the certification. It might have changed since I took it but only in terms of keeping up with the change in delivery of skills training at AWS and to add new features. I really, really liked this course. Along with Google, I think they deliver some of the best training I&amp;rsquo;ve seen. Along with this training I also took the LinkedIn Learning course &lt;strong&gt;Prepare for the AWS Certified Cloud Practitioner Exam&lt;/strong&gt; by Hiroko Nishimura. This was a really nice course and very well presented but was aimed at total beginners rather than people who are already working in IT. I also took Michael J. Shannon&amp;rsquo;s course on Percipio to prepare. His course was aimed a little better in my experience but I preferred the deliver style of Hiroko if I&amp;rsquo;m honest. Although if I&amp;rsquo;m honest I think the AWS course itself is still the best and contains more than enough information in order to pass the exam.&lt;/p&gt;
&lt;p&gt;BUT! I also viewed example questions on YouTube (you know how to use YouTube don&amp;rsquo;t you?) and bought the Udemy course by Neal Davis AWS Certified Cloud Practitioner 500 Practice Exam Questions. This was fantastic. I only had time to complete about 4 of the mock tests but not only do you get to review your answers at the end, he has provided lots of cheat sheets and information about the answers to help you revise. I would say the exams provided were harder than the real thing but not by very much. You really do need to know a fair bit of detail about the services provided by AWS to answer the questions. Particularly, deploying different types of software or migrating to the cloud etc.&lt;/p&gt;
&lt;p&gt;I took the exam with Pearson Vue having taken several exams at home before. I can truthfully say this was the best experience I have had. The mobile app was a bit funny about uploading the pictures of my workspace but that was all. I also had to borrow a family members laptop in order to take the exam as I don&amp;rsquo;t use Windows or MacOS. But the executable that Pearson Vue sent worked flawlessly and the instructions from Amazon also made sense to me. I checked in half and hour earlier and had my ID and work area ready to go. You have approximately 90 mins to complete the exam and it took me about 30 mins to finish. It is multiple choice unlike the practical LFCS or CKA exams and you can flag questions for review. I did this but I didn&amp;rsquo;t change anything in the end.&lt;/p&gt;
&lt;p&gt;The only odd thing I found was that the exam tells you whether you have passed or failed after a brief survey. And then it just closes the software… That&amp;rsquo;s it. No email or anything. Nothing to say that they&amp;rsquo;re not viewing you anymore. No goodbye!&lt;/p&gt;
&lt;p&gt;I received a digital Credly badge in an email the next day which was great because it put my mind at rest. I was checking the AWS account page for confirmation that I had passed and it almost looked as though the exam had never happened! Anyway, I still believe that this is a great exam to take if you&amp;rsquo;re looking to move into a career at a company that utilises cloud computing, which is basically every large business in the world at the moment. I chose this for work reasons. If you choose an exam make sure that it&amp;rsquo;s relevant to where your job is or might be i.e. Google or Azure are alternatives and have their own certifications available.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cloud.google.com/certification&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://cloud.google.com/certification&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://cloud.google.com/certification&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/en-us/learn/certifications/browse/?products=azure&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.microsoft.com/en-us/learn/certifications/browse/?products=azure&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.microsoft.com/en-us/learn/certifications/browse/?products=azure&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Basic Online Security for Non Techies</title>
        <link>https://mikerossiter.tech/posts/basic-online-security-for-non-techies/</link>
        <pubDate>Mon, 26 Sep 2022 11:27:49 +0100</pubDate>
        
        <guid>https://mikerossiter.tech/posts/basic-online-security-for-non-techies/</guid>
        <description>&lt;img src="https://mikerossiter.tech/cctv.png" alt="Featured image of post Basic Online Security for Non Techies" /&gt;&lt;h1 id=&#34;basic-online-security-for-non-techies&#34;&gt;Basic Online Security for Non-Techies!
&lt;/h1&gt;&lt;p&gt;Everyone is on the internet these days be it from their smart phone, TV, tablet or computer. Either at work or in their spare time.&lt;/p&gt;
&lt;p&gt;Most employees get a security course to go on when they start their jobs if they work for a large-ish company but the rest of us have to just cope with the ever changing risks of being connected online.&lt;/p&gt;
&lt;p&gt;So here is a super basic and, hopefully, down to earth guide to keeping yourself safe online.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with:&lt;/p&gt;
&lt;h2 id=&#34;passwords&#34;&gt;Passwords
&lt;/h2&gt;&lt;p&gt;In the year 2054 we will still be using passwords. I hope not! But no doubt we will!&lt;/p&gt;
&lt;p&gt;The current recommendation is to have &lt;strong&gt;three entirely unrelated words&lt;/strong&gt; separated by a random symbol and to include &lt;strong&gt;a number&lt;/strong&gt; somewhere. Where, exactly is up to you. You should not write this down. I know&amp;hellip; The best place to store your passwords is inside of some kind of well-established password manager like &lt;a href=&#34;https://bitwarden.com/&#34; title=&#34;BitWarden&#34;&gt;BitWarden&lt;/a&gt; or &lt;a href=&#34;https://keepassxc.org/&#34; title=&#34;KeePass&#34;&gt;KeePass&lt;/a&gt; which will store all of your passwords for you. If you have to write it down then please, please, please, please, please keep it in an extremely safe and unlikely place and not on a post-it note stuck to the monitor of your PC or under your mouse mat. If it&amp;rsquo;s there right now then throw it away! Literally, imagine it to be like your house key.&lt;/p&gt;
&lt;p&gt;Also, do you have a router to access the internet at home? I imagine you do. This is a bit more advanced, but I &lt;em&gt;highly&lt;/em&gt; recommend changing the password on that thing especially if it is very old, as there are tables of passwords for old routers floating about in the corners of the internet. This means someone else could use your internet for nefarious purposes if they really wanted to. Unlikely! But you never know. To change the password, look on the router itself or the manual that came with it, for instructions.&lt;/p&gt;
&lt;p&gt;Always lock your computer or mobile device with a passcode or password when you leave it unattended.&lt;/p&gt;
&lt;p&gt;Changing your password occasionally is always recommended especially when you think your account has be compromised. But if you aren&amp;rsquo;t taking steps to make your password secure in the first place then this is a pointless task. People will use computers to &lt;em&gt;crack&lt;/em&gt; your passwords or check against lists of commonly used passwords. If it is a single word and a number of up to 8 characters (as was suggested a decade ago) then this will be &lt;kbd&gt;crackable&lt;/kbd&gt; in no time at all. Test out some made up passwords here: &lt;a href=&#34;https://www.security.org/how-secure-is-my-password/&#34; title=&#34;Password checker&#34;&gt;Password Checker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One more thing to note. Most IT professionals use something called MFA or multi-factor authentication or sometimes just plain 2 factor authentication. This just means there is an extra layer to accessing a website or service. For instance, the service may text you or use an app with which you can copy a code from to prove that you are really you. This is a great step in adding an extra layer of security to your private information.&lt;/p&gt;
&lt;p&gt;OK. Now on to:&lt;/p&gt;
&lt;h2 id=&#34;emails&#34;&gt;Emails
&lt;/h2&gt;&lt;p&gt;Emails! We still use them. If we&amp;rsquo;re still using them in 2054 then blah, blah, blah.. Anyway, in case you don&amp;rsquo;t know, email is a super &lt;em&gt;insecure&lt;/em&gt; way to communicate. That&amp;rsquo;s right. Don&amp;rsquo;t trust emails. Full stop. Don&amp;rsquo;t open an email from someone you don&amp;rsquo;t know. Don&amp;rsquo;t open emails from people you think you know. And never click on links in emails from people you don&amp;rsquo;t know. Ever. When links in emails are used to scam you, this is referred to as &lt;strong&gt;Phishing.&lt;/strong&gt; If you are unsure then look at the email address that the message has come from to see if it looks unusual. If you have a preview mode on your email client (Gmail, Outlook) then you need to turn that off too. And preferably find a setting that stops images loading in emails too.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t or at least try not to send sensitive information over email. And report all suspicious emails. Even if they turn out to be legitimate, it pays to be suspicious and better safe than sorry. Usually there is a &lt;kbd&gt;report spam&lt;/kbd&gt; or &lt;kbd&gt;report junk&lt;/kbd&gt; button on your email somewhere that you can use. This will stop emails arriving from that address in the future.&lt;/p&gt;
&lt;p&gt;In the blue corner we have:&lt;/p&gt;
&lt;h2 id=&#34;text-messages-sms&#34;&gt;Text Messages (SMS)
&lt;/h2&gt;&lt;p&gt;The year is 2054 and we&amp;rsquo;re still using SMS text messages to communicate. enough already!&lt;/p&gt;
&lt;p&gt;Similarly to emails, don&amp;rsquo;t ever click on links in text messages. Don&amp;rsquo;t respond to messages from people you don&amp;rsquo;t know and don&amp;rsquo;t assume the text is from someone that they purport to be. They could be using a technique similar to Phishing known as &lt;strong&gt;Smishing.&lt;/strong&gt; If you know the person&amp;rsquo;s number, then call them directly to check if they are really texting you. Look at the language of the message. Does it sound like them? Are there any unusual mis-spellings? If you&amp;rsquo;re feeling unsure about a conversation that you are having with someone, be it in email, text or even on the phone, then just get in touch with someone you know to get a second opinion.&lt;/p&gt;
&lt;p&gt;Onward!&lt;/p&gt;
&lt;h2 id=&#34;social-media&#34;&gt;Social Media
&lt;/h2&gt;&lt;p&gt;A lot of us use social media to keep in touch with friends and family. We&amp;rsquo;re talking Facebook, Instagram, Twitter etc etc. If you are able to, ensure that your information is kept private and that any information that has to be public is of the bare minimum. If a website asks you for some detailed information about yourself then ask yourself if you really want to be handing that level of data over that particular organisation.&lt;/p&gt;
&lt;p&gt;Try your best to remain savvy and visit the &lt;strong&gt;security&lt;/strong&gt; section in the settings of any website you log in to to see if you can secure your data to a better extent. I would possibly get someone to assist you with this if possible.&lt;/p&gt;
&lt;p&gt;Remember, anything and everything you post online will exist permanently somewhere. If you want to share personal images or information, don&amp;rsquo;t rush into it and think twice before you share anything.&lt;/p&gt;
&lt;h2 id=&#34;anti-virusfirewalls&#34;&gt;Anti-Virus/Firewalls
&lt;/h2&gt;&lt;p&gt;These are handy but don&amp;rsquo;t put all your hopes and prayers into them. Anti-Virus software is just a list of nasty stuff (&lt;strong&gt;Malware/Spyware&lt;/strong&gt;) that it will try and notice if it were ever to land on your computer or mobile device. You can&amp;rsquo;t rely on it to stop everything. You have to be responsible yourself. Which is why I&amp;rsquo;m writing this guide. Also, some anti-virus software will drive you crazy with spam notifications and other such delights. So pick carefully. Some well known ones are Avast, Norton, BitDefender and AVG.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re reading this then you have heard of:&lt;/p&gt;
&lt;h2 id=&#34;web-browsers&#34;&gt;Web Browsers
&lt;/h2&gt;&lt;p&gt;Google Chrome and Bing are very popular browsers. Do you know you can add extensions to stop adverts? They are easy to add and there are many extensions that can stop websites spying on you too. You can install from the &lt;a href=&#34;https://chrome.google.com/webstore/category/extensions?hl=en-GB&#34; title=&#34;Google Extensions&#34;&gt;Google Extensions&lt;/a&gt; or &lt;a href=&#34;https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home&#34; title=&#34;Bing Web Add-Ons&#34;&gt;Bing Web Add-Ons&lt;/a&gt; web sites. Apps like Ghostery and AdBlock Plus are highly recommended.&lt;/p&gt;
&lt;p&gt;Remember that web browsers are a bit like operating systems on their own (Windows/Mac OS) so they are much more sophisticated than they used to be. Stay safe and only visit websites that are reputable and you are aware of. I can&amp;rsquo;t stress that enough.&lt;/p&gt;
&lt;p&gt;If you want to check the legitimacy of a website, something you can do to be sure is to click the address (maybe a couple of times on some browsers) and check that it starts with &lt;strong&gt;https://&lt;/strong&gt;. This will ensure that it has what is called an &lt;strong&gt;SSL&lt;/strong&gt; certificate and can be trusted for the most part. This is really important if you&amp;rsquo;re visiting a website like your bank or a shop.&lt;/p&gt;
&lt;h2 id=&#34;search-engines&#34;&gt;Search Engines
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://www.google.com/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer noopener&#34;&gt;Google&lt;/a&gt; is by far the most popular search engine probably followed by Microsoft&amp;rsquo;s &lt;a href=&#34;https://www.bing.com/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer noopener&#34;&gt;Bing&lt;/a&gt; but one thing to mention is that the top few results are usually adverts. Double check that the posts don&amp;rsquo;t have the work &lt;strong&gt;Ad&lt;/strong&gt; or &lt;strong&gt;Promoted&lt;/strong&gt; next to them. This also applies to posts on social media. In fact, misleading promoted posts on social media have caught out the most savvy people I know. So always think before you click. If it seems to good to be true, it probably is.&lt;/p&gt;
&lt;p&gt;If you would like to use a search engine that is a bit more friendly and less intrusive than Google I would suggest using &lt;a href=&#34;https://www.duckduckgo.com&#34; target=&#34;_blank&#34; rel=&#34;noreferrer noopener&#34;&gt;DuckDuckGo&lt;/a&gt;, &lt;a href=&#34;https://www.startpage.com/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer noopener&#34;&gt;StartPage&lt;/a&gt; or &lt;a href=&#34;https://search.brave.com/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer noopener&#34;&gt;Brave&lt;/a&gt; search. There are others but those are the most popular at the time of writing.&lt;/p&gt;
&lt;h2 id=&#34;files&#34;&gt;Files
&lt;/h2&gt;&lt;p&gt;Most people use Windows on their PCs or laptops (I don&amp;rsquo;t. I use Linux. More on that later!). Just one thing to note here. Don&amp;rsquo;t EVER open anything that ends in .&lt;strong&gt;exe&lt;/strong&gt; that has been sent to you. This is a program that will run on your computer. A picture usually ends in .&lt;strong&gt;jpg&lt;/strong&gt; and an audio file with .&lt;strong&gt;mp3&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;disposal&#34;&gt;Disposal
&lt;/h2&gt;&lt;p&gt;If you throw away a device or computer then ensure you have wiped the device thoroughly. You may need some assistance to do this but trust me. Hard drives, even &lt;em&gt;after&lt;/em&gt; deleting and formatting (clearing away) all the data, it can still be retrieved. It isn&amp;rsquo;t even very difficult. Take the hard drive out and keep it as a backup, if I were you.&lt;/p&gt;
&lt;h2 id=&#34;finally&#34;&gt;Finally
&lt;/h2&gt;&lt;p&gt;If you ever think you have been a victim of fraud or an attack on your personal data then contact &lt;a class=&#34;link&#34; href=&#34;https://www.actionfraud.police.uk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Action Fraud&lt;/a&gt; if you live in the UK. I can&amp;rsquo;t guarantee they will do anything but they need to be told or nothing will ever happen. At all.&lt;/p&gt;
&lt;p&gt;I really hope this guide has helped you. If it has then feel free to &lt;a class=&#34;link&#34; href=&#34;https://www.buymeacoffee.com/mikerossiter&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Buy Me A Coffee&lt;/a&gt; or if there&amp;rsquo;s anything you think I have left off or you want to know a bit more about something just let me know by clicking &lt;a class=&#34;link&#34; href=&#34;https://mikerossiter.tech/contact&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Tmux</title>
        <link>https://mikerossiter.tech/posts/tmux/</link>
        <pubDate>Mon, 26 Sep 2022 08:58:03 +0100</pubDate>
        
        <guid>https://mikerossiter.tech/posts/tmux/</guid>
        <description>&lt;img src="https://mikerossiter.tech/panes.png" alt="Featured image of post Tmux" /&gt;&lt;h1 id=&#34;tmux&#34;&gt;TMUX
&lt;/h1&gt;&lt;h2 id=&#34;split-your-terminal-screen-up&#34;&gt;Split your terminal screen up!
&lt;/h2&gt;&lt;p&gt;Here is my brief get up and go guide to Tmux. &lt;a class=&#34;link&#34; href=&#34;https://github.com/tmux/tmux&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Tmux&lt;/a&gt; is a great tool to use when you need multiple panes in the terminal and especially useful if you don&amp;rsquo;t have access to a GUI. You can also create sessions with Tmux to enter and exit different workspaces. It can be installed in the usual fashion (apt, pacman, dnf, snap even) on all Linux distros as it is widely used.&lt;/p&gt;
&lt;p&gt;Here is how Tmux appears:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://mikerossiter.tech/Tmux-sample.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Tmux hard at work&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Currently, I prefer to use &lt;a class=&#34;link&#34; href=&#34;https://terminator.readthedocs.io/en/latest/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Terminator&lt;/a&gt; on my distro of choice so I don&amp;rsquo;t use Tmux as much as I used to but nonetheless I still find myself using it regularly. Below are some of the commands you can use to create and use separate &lt;em&gt;panes&lt;/em&gt;. Preceding most commands is Ctrl+B. This is sometimes referred to as the prefix. It will initiate a mode that is followed by key inputs that can amend the current view:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Ctrl+B Shift+% - split pane vertically
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Ctrl+B Shift+&amp;#34; - split pane horizontally
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Ctrl+B then arrow to change pane
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Ctrl+B c - New window (number at bottom. Starts at 0)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Ctrl+B 0 - Go to window 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Ctrl+B 1 - Go to window 1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Ctrl+B z - Zoom window to fullscreen and back again
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type &amp;#34;exit&amp;#34; or Ctrl + D to close the current pane
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Sessions:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Ctrl+B d - Detach or leave session
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tmux ls - Summary of windows open in background
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tmux attach -t 0 - Attach to session (State is preserved)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tmux rename-session -t 0 git - Rename the session &amp;#39;git&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tmux kill-session -t git - Ends git session
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;One of the most useful commands is this:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Ctrl+B : set synchronize-panes on - Sync all panes 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This way you can enter text into all panes at once. Super handy!&lt;/p&gt;
&lt;p&gt;There is much more to Tmux. You can edit the config file in your home directory and use plugins. It is extremely versatile. I might follow this up soon. Some of my config dotfiles are available in my &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/mikerossiter/dotfiles&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitLab&lt;/a&gt; repo if you are interested in some examples of how I set up my terminal.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Contact</title>
        <link>https://mikerossiter.tech/contact/</link>
        <pubDate>Tue, 20 Sep 2022 14:00:22 +0100</pubDate>
        
        <guid>https://mikerossiter.tech/contact/</guid>
        <description>&lt;body&gt;
&lt;script src=&#34;https://kwesforms.com/v2/kwes-script.js&#34; defer&gt;&lt;/script&gt;
  &lt;form class=&#34;kwes-form&#34; action=&#34;https://kwesforms.com/api/foreign/forms/IdSbC2HRybyzvObe03AU&#34;&gt;
    &lt;label for=&#34;full-name&#34;&gt;Name: &lt;/label&gt;
    &lt;input type=&#34;text&#34; name=&#34;name&#34; id=&#34;full-name&#34; placeholder=&#34;Jimmy James&#34; rules=&#34;required&#34;&gt;&lt;p&gt;
    &lt;label for=&#34;email-address&#34;&gt;Email Address: &lt;/label&gt;
    &lt;input type=&#34;email&#34; name=&#34;_replyto&#34; id=&#34;email-address&#34; placeholder=&#34;person@place.com&#34; rules=&#34;required&#34;&gt;&lt;p&gt;
    &lt;label for=&#34;message&#34;&gt;Message: &lt;/label&gt;
    &lt;textarea rows=&#34;5&#34; name=&#34;message&#34; id=&#34;message&#34; placeholder=&#34;What&#39;s happening?&#34; rules=&#34;required&#34;&gt;&lt;/textarea&gt;&lt;p&gt;
    &lt;input type=&#34;submit&#34; value=&#34;Submit&#34;&gt;
  &lt;/form&gt;
&lt;/body&gt;
</description>
        </item>
        <item>
        <title>Beginner&#39;s Guide to Vim</title>
        <link>https://mikerossiter.tech/posts/beginners-guide-to-vim/</link>
        <pubDate>Tue, 20 Sep 2022 13:06:35 +0100</pubDate>
        
        <guid>https://mikerossiter.tech/posts/beginners-guide-to-vim/</guid>
        <description>&lt;img src="https://mikerossiter.tech/VIM.png" alt="Featured image of post Beginner&#39;s Guide to Vim" /&gt;&lt;h1 id=&#34;a-beginners-guide-to-vim&#34;&gt;A Beginner&amp;rsquo;s Guide To Vim
&lt;/h1&gt;&lt;p&gt;OK. Vim is my favourite text editor. I use IDEs in my job like VS Code but I often end up just using Vim in the command line as it&amp;rsquo;s where I&amp;rsquo;m most happy and everybody tells me that the Linux hipsters all use Vim exclusively and I want to join that club desperately.&lt;/p&gt;
&lt;p&gt;Jokes aside though I really do love Vim. BUT I&amp;rsquo;ve grown to love it. I think like everybody who&amp;rsquo;s followed a demo online where they&amp;rsquo;ve instructed you to type in &lt;code&gt;$ vi thisfile&lt;/code&gt; in the Terminal, have quickly found yourself Googling for &lt;code&gt;How to exit Vim&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So here is my entry level cheat sheet on using Vim to edit text files. It does so much more than just editing config files but I wanted to keep all the basic commands in one place for you (and myself probably) to check into now and again.&lt;/p&gt;
&lt;p&gt;First of all make sure you have &lt;code&gt;Vi Improved&lt;/code&gt; actually installed as some distros might have the older and simpler but not wiser version installed. Merely type &lt;code&gt;sudo apt install vim -y&lt;/code&gt; (Ubuntu/Zorin/Mint/Pop etc) or &lt;code&gt;sudo dnf install vim -y&lt;/code&gt; (Fedora/RHEL/Centos/Rocky) to ensure you have the up to date software. So far, so easy.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s say you need to create a brand new file in the folder you&amp;rsquo;re currently sat in called &lt;code&gt;test.txt&lt;/code&gt;. Just type &lt;code&gt;vi test.txt&lt;/code&gt; or &lt;code&gt;vim test.txt&lt;/code&gt;. Either will work just fine. I tend to write &lt;code&gt;vi&lt;/code&gt;. Now you are faced with a blank screen with tildes (&lt;code&gt;~&lt;/code&gt;) floating down the left hand side. Cool. Now what? Well you should be in typing mode AKA &lt;code&gt;Insert Mode&lt;/code&gt; as displayed at the bottom of the screen. Vim has two main modes. &lt;strong&gt;Insert&lt;/strong&gt; mode, that&amp;rsquo;s typing mode, and &lt;strong&gt;Command&lt;/strong&gt; mode which is a mode where you can do things in the built-in command line at the bottom of the screen. Type a load of nonsense. Now you want to save this nonsense to the file &lt;code&gt;test.txt&lt;/code&gt; and quit altogether. Press &lt;code&gt;Esc&lt;/code&gt; to go to the command mode we mentioned before and type &lt;code&gt;:wq&lt;/code&gt;. Yes you need to type the colon too. The &lt;code&gt;w&lt;/code&gt; is for &lt;code&gt;write&lt;/code&gt; or save and the &lt;code&gt;q&lt;/code&gt; is for….. yes you guessed it &lt;code&gt;quit&lt;/code&gt;. Now do a quick &lt;code&gt;ls&lt;/code&gt; to see if your file exists. Lo and behold you are a technical genius and will be forever known as Hackerman by your close friends and family. But that&amp;rsquo;s not all! Here are some useful commands for when you are editing files in Vim. N.B. Please note the colons aren&amp;rsquo;t to look pretty, you really do need to type a colon. P.S. Why is it called a colon? We need to change that.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Enter insert mode (Adding text) - i 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Replace text - r
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Escape insert mode and enter command mode (Panic button!) - Esc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Exit! (when you haven&amp;#39;t changed a thing) - :q
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Exit! (when you have changed something and don&amp;#39;t want to save) - :q!
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Save (but carry on editing) - :w
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Save and exit - :wq
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Search for text - /searchtermhere
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;After hitting enter, find next occurrence of search term - n
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Find next search term up instead of down - N
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Undo - u
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Redo - Ctrl+r
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Select command (will replace when pasting clipboard contents) - v
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Select line command - Shift + v
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Copy text - y
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Copy whole line - yy
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Paste - p
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Carriage return (Enters insert mode after pressing) - o
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Delete character - x
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Delete/Cut line - dd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Delete from cursor to end of word - dw
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Delete all text - :1,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Move to end of file - G
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Move to start of file - gg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Cursor to end of line - $ or End
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Cursor to start of line - 0 or Home
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;(If you have opened multiple files in a folder i.e. &amp;#34;$ vi *&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Move forward a file - :n
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Move backward a file - :N
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item>
        <item>
        <title>About Me</title>
        <link>https://mikerossiter.tech/about/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://mikerossiter.tech/about/</guid>
        <description>&lt;p&gt;Hi! My name is Mike and I am involved with DevOps during the day. I love open source software and in particular: Linux. I have used Linux as my daily driver since about 2013 and it has taken me on many adventures over the years! I also used to be a full-time musician and I enjoy writing and performing music in my spare time.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
