<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>blue42</title><link>https://blue42.net/</link><description>Recent content on blue42</description><generator>Hugo</generator><language>en-us</language><copyright>Luke Arntz</copyright><lastBuildDate>Wed, 23 Apr 2025 10:01:33 -0400</lastBuildDate><atom:link href="https://blue42.net/index.xml" rel="self" type="application/rss+xml"/><item><title>Debugging a Go Deadlock With Delve</title><link>https://blue42.net/code/go-deadlock-debug-delve/</link><pubDate>Tue, 22 Apr 2025 19:48:30 -0400</pubDate><guid>https://blue42.net/code/go-deadlock-debug-delve/</guid><description>&lt;p&gt;I often develop personal tooling for work so I don&amp;rsquo;t have to do repetitive tasks manually. It&amp;rsquo;s best to create shared tooling, but sometimes shared tooling grows out of personal tooling. I have a &lt;code&gt;toolbox&lt;/code&gt; repository with code that automates various troubleshooting and workaround tasks that fits into my personal workflow. This particular tool probably wouldn&amp;rsquo;t be used by anyone else, and because of that I haven&amp;rsquo;t taken the time to figure out why the applications hangs after running for long periods. Until now&amp;hellip;&lt;/p&gt;</description></item><item><title>Running Ollama models on a Radeon RX 5500</title><link>https://blue42.net/linux-ollama-radeon-rx5500/post/</link><pubDate>Thu, 23 Jan 2025 14:21:52 -0500</pubDate><guid>https://blue42.net/linux-ollama-radeon-rx5500/post/</guid><description>&lt;p&gt;I had an old Radeon RX 5500 sitting around and wanted to see if I could get ollama to use it. It is not &lt;a href="https://github.com/ollama/ollama/blob/main/docs/gpu.md"&gt;officially supported&lt;/a&gt;, but there is a way to get it working.&lt;/p&gt;
&lt;h2 id="setup"&gt;Setup&lt;/h2&gt;
&lt;p&gt;This was setup on a clean install of Fedora 41. I&amp;rsquo;m using Open WebUI to access the models, but will not go into detail on how that is setup nor how to install Fedora. Instead, I&amp;rsquo;ll explain how I got ollama using an officially unsupported Radeon RX 5500. This GPU only has 4Gi of RAM, but works pretty well with smaller models like &lt;code&gt;deepseek-r1 1b&lt;/code&gt;. Also, I&amp;rsquo;d like to point out that this setup does &lt;em&gt;not&lt;/em&gt; is not containerized. I&amp;rsquo;ve added the versions of all software involved below in the &lt;a href="#details"&gt;details&lt;/a&gt; section.&lt;/p&gt;</description></item><item><title>About Me</title><link>https://blue42.net/about/</link><pubDate>Tue, 14 Jan 2025 17:40:53 -0500</pubDate><guid>https://blue42.net/about/</guid><description>&lt;p&gt;My name is Luke. I&amp;rsquo;ve been working professionally with tech since 2001, and working as a Site Reliability Engineer for the past four years. Currently supporting a complex SaaS platform that runs in several regions on a few fairly large Kubernetes clusters.&lt;/p&gt;
&lt;p&gt;I have a few side projects I&amp;rsquo;ve been working. Hopefully will finish one or two in the near future.&lt;/p&gt;
&lt;p&gt;Tech I&amp;rsquo;m currently working with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;go&lt;/li&gt;
&lt;li&gt;python&lt;/li&gt;
&lt;li&gt;kubernetes&lt;/li&gt;
&lt;li&gt;terraform&lt;/li&gt;
&lt;li&gt;linux&lt;/li&gt;
&lt;li&gt;aws&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Current non-tech stuff I&amp;rsquo;m doing:&lt;/p&gt;</description></item><item><title>Linux Desktop Entry and Icons</title><link>https://blue42.net/linux/linux-desktop-entry-icons/post/</link><pubDate>Sat, 14 Dec 2024 18:26:13 -0500</pubDate><guid>https://blue42.net/linux/linux-desktop-entry-icons/post/</guid><description>&lt;p&gt;I&amp;rsquo;m not picky about terminals in general. I mostly want them to stay out of my way and be able to switch between light and dark themes with the system. I&amp;rsquo;d been using the standard Gnome Console, but started becoming annoyed with not being able to copy to my local clipboard from Neovim and Tmux on remote systems. Gnome Console does not support the &lt;a href="https://en.wikipedia.org/wiki/ANSI_escape_code#Operating_System_Command_sequences"&gt;&lt;code&gt;OSC-52&lt;/code&gt;&lt;/a&gt; escape sequence that can be used for remote copy from terminal applications that support it like &lt;a href="https://neovim.io/doc/user/provider.html#clipboard-osc52"&gt;Neovim&lt;/a&gt; and &lt;a href="https://github.com/tmux/tmux/wiki/Clipboard"&gt;Tmux&lt;/a&gt;. Becasue of that, I switched to &lt;a href="https://wezfurlong.org/wezterm/index.html"&gt;wezterm&lt;/a&gt; which works great for remote copy.&lt;/p&gt;</description></item><item><title>Terraform: Optional Nested Dynamic Blocks</title><link>https://blue42.net/code/terraform-nested-dynamic-conditional/post/</link><pubDate>Fri, 19 Jan 2024 13:21:40 -0500</pubDate><guid>https://blue42.net/code/terraform-nested-dynamic-conditional/post/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Recently, I was creating a terraform module that creates an S3 bucket. An S3 bucket can only have one &lt;code&gt;aws_s3_bucket_policy&lt;/code&gt;, and the module needed to include a default policy to force TLS v1.2. I also needed to be able to pass additional policy statements to the module which may or may not include a &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html"&gt;&lt;code&gt;condition&lt;/code&gt;&lt;/a&gt;. Unfortunately, there is not an obvious way to include the &lt;code&gt;condition&lt;/code&gt; &lt;em&gt;only&lt;/em&gt; when it is part of the policy.&lt;/p&gt;</description></item><item><title>Raspberry Pi Image Mount</title><link>https://blue42.net/linux/rpi4-image-prep/post/</link><pubDate>Thu, 28 Dec 2023 09:41:30 -0500</pubDate><guid>https://blue42.net/linux/rpi4-image-prep/post/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Wanted to write this up because it&amp;rsquo;s not something I do regularly, and I always have to lookup how to find the start of the root partition. I specially only do this for my Raspberry Pi&amp;rsquo;s, but this should work with any image that is configured similarly.&lt;/p&gt;
&lt;p&gt;The goal is to download an OS image, in this case Debian, and mount the image locally to add a public SSH key.&lt;/p&gt;</description></item><item><title>Vault CLI Authentication using OIDC</title><link>https://blue42.net/code/oidc-login-cli-vault/post/</link><pubDate>Mon, 27 Nov 2023 12:58:36 -0500</pubDate><guid>https://blue42.net/code/oidc-login-cli-vault/post/</guid><description>&lt;p&gt;The &lt;code&gt;vault-client-go&lt;/code&gt; SDK has some great examples, but doesn&amp;rsquo;t explicitly show how to perform OIDC authentication. This may have limited use cases, but it &lt;em&gt;is&lt;/em&gt; something I needed to do and wanted to write about it and hopefully save someone else some time figure out how to make this work.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;The first thing we need is a Vault server with the &lt;a href="https://developer.hashicorp.com/vault/docs/auth/jwt"&gt;JWT/OIDC auth method&lt;/a&gt; configured. During testing I used the &lt;a href="https://developer.hashicorp.com/vault/docs/auth/jwt/oidc-providers/google"&gt;google oidc-provider&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Load Balancing Algorithms</title><link>https://blue42.net/code/load-balancing-power-of-two/post/</link><pubDate>Thu, 24 Aug 2023 10:16:09 -0400</pubDate><guid>https://blue42.net/code/load-balancing-power-of-two/post/</guid><description>&lt;p&gt;I recently read &lt;a href="https://betterprogramming.pub/load-balancing-the-intuition-behind-the-power-of-two-random-choices-6de2e139ac2f"&gt;an article&lt;/a&gt; that was linked on hacker news about the power of two load balancing algorithm. This isn&amp;rsquo;t a new or complicated concept, but I&amp;rsquo;d never explored it and wanted to experiment with it a bit for fun.&lt;/p&gt;
&lt;p&gt;This is a very over simplified example, but it&amp;rsquo;s pretty cool nonetheless. I will be using balls and requests interchangeably in this post.&lt;/p&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Suppose you have 1 million ping-pong balls and 100 buckets. We want to distribute the ping-pong balls as evenly as possible. There are a couple simple approaches we could take. None of the approaches below take into account server load or currently open connections. These are all static or &amp;ldquo;dumb&amp;rdquo; load balancing algorithms.&lt;/p&gt;</description></item><item><title>EKS Addon Configuration via Terraform</title><link>https://blue42.net/code/eks-addon-configuration-terraform/post/</link><pubDate>Thu, 17 Aug 2023 11:47:05 -0400</pubDate><guid>https://blue42.net/code/eks-addon-configuration-terraform/post/</guid><description>&lt;h2 id="eks-addon-configuration-via-terraform"&gt;EKS Addon Configuration via Terraform&lt;/h2&gt;
&lt;p&gt;This is a quick overview of how to pass custom configuration values to EKS managed addons using Terraform.&lt;/p&gt;
&lt;h3 id="configuration-schema"&gt;Configuration Schema&lt;/h3&gt;
&lt;p&gt;Before you begin find the addon version you need and describe the available configuration options:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ aws eks describe-addon-versions --addon-name coredns --kubernetes-version 1.27 &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.addons[].addonVersions[] | select(.compatibilities[].defaultVersion == true) | .addonVersion&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v1.10.1-eksbuild.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ aws eks describe-addon-configuration --addon-name coredns --addon-version v1.10.1-eksbuild.1 &lt;span class="p"&gt;|&lt;/span&gt; jq -r .configurationSchema &lt;span class="p"&gt;|&lt;/span&gt; jq
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ref&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;#/definitions/Coredns&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$schema&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;http://json-schema.org/draft-06/schema#&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;definitions&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Coredns&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;additionalProperties&amp;#34;&lt;/span&gt;: false,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;affinity&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;affinity&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;nodeAffinity&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;requiredDuringSchedulingIgnoredDuringExecution&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;nodeSelectorTerms&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;matchExpressions&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;kubernetes.io/os&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;operator&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;In&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;values&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;linux&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;kubernetes.io/arch&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;operator&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;In&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;values&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;amd64&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;arm64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;podAntiAffinity&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;preferredDuringSchedulingIgnoredDuringExecution&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;podAffinityTerm&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;labelSelector&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;matchExpressions&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;k8s-app&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;operator&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;In&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;values&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;kube-dns&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;topologyKey&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;kubernetes.io/hostname&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;: &lt;span class="m"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Affinity of the coredns pods&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;null&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;computeType&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;corefile&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Entire corefile contents to use with installation&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;nodeSelector&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;additionalProperties&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;replicaCount&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;integer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;resources&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ref&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;#/definitions/Resources&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;tolerations&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;CriticalAddonsOnly&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;operator&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Exists&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;node-role.kubernetes.io/master&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;operator&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Tolerations of the coredns pod&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;items&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;array&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Coredns&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Limits&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;additionalProperties&amp;#34;&lt;/span&gt;: false,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;memory&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Limits&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Resources&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;additionalProperties&amp;#34;&lt;/span&gt;: false,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;limits&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ref&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;#/definitions/Limits&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;requests&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ref&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;#/definitions/Limits&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Resources&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="terraform-configuration"&gt;Terraform Configuration&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;configuration_values&lt;/code&gt; must be in json format. The easiest way to do this is to use the &lt;code&gt;jsonencode()&lt;/code&gt; function included with terraform.&lt;/p&gt;</description></item><item><title>Decrypting Laravel Encrypted Data</title><link>https://blue42.net/code/laravel-encrypter/post/</link><pubDate>Mon, 24 Jul 2023 09:43:50 -0400</pubDate><guid>https://blue42.net/code/laravel-encrypter/post/</guid><description>&lt;p&gt;I recently came across a base64 encoded json string that contained data that was encrypted by php&amp;rsquo;s Laravel framework. The json contained three keys, &lt;code&gt;iv&lt;/code&gt;, &lt;code&gt;value&lt;/code&gt;, and &lt;code&gt;mac&lt;/code&gt;. I hadn&amp;rsquo;t seen this before and wanted to learn more about what the data represented and how to decrypt it without using the Laravel framework.&lt;/p&gt;
&lt;p&gt;Based on the documentation I read, this functionality uses openssl and I worked backward from there.&lt;/p&gt;
&lt;p&gt;This post is an overview of what I learned.&lt;/p&gt;</description></item><item><title>Kubernetes Shell Exec All Containers</title><link>https://blue42.net/devops/2021/kubernetes-shell-exec-all-containers/</link><pubDate>Thu, 27 Jan 2022 11:35:34 -0500</pubDate><guid>https://blue42.net/devops/2021/kubernetes-shell-exec-all-containers/</guid><description>&lt;h2 id="kubernetes-shell-exec-all-containers"&gt;Kubernetes Shell Exec All Containers&lt;/h2&gt;
&lt;h3 id="fish-script-to-loop-through-all-pods"&gt;fish script to loop through all pods&lt;/h3&gt;
&lt;p&gt;This is not great, but a start. Does not take into account pods with multiple containers, and probably other failure cases.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; n in &lt;span class="o"&gt;(&lt;/span&gt;k get ns -o json &lt;span class="p"&gt;|&lt;/span&gt; jq -r .items&lt;span class="o"&gt;[]&lt;/span&gt;.metadata.name&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; p in &lt;span class="o"&gt;(&lt;/span&gt;k get pods -n &lt;span class="nv"&gt;$n&lt;/span&gt; -o json &lt;span class="p"&gt;|&lt;/span&gt; jq -r .items&lt;span class="o"&gt;[]&lt;/span&gt;.metadata.name&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt;: &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; k &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nv"&gt;$p&lt;/span&gt; -n &lt;span class="nv"&gt;$n&lt;/span&gt; -- ls /usr/bin/pkexec 2&amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; end
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Using traefik for ingress on a kind cluster</title><link>https://blue42.net/devops/2021/k8s-kind-traefik/</link><pubDate>Fri, 17 Dec 2021 17:27:23 -0500</pubDate><guid>https://blue42.net/devops/2021/k8s-kind-traefik/</guid><description>&lt;p&gt;I wasn&amp;rsquo;t able to find much information online on how to install and use &lt;a href="https://doc.traefik.io/traefik/providers/kubernetes-ingress/"&gt;traefik&lt;/a&gt; in a &lt;a href="https://kind.sigs.k8s.io/"&gt;kind cluster&lt;/a&gt; so decided to write a short post about how I got it working.&lt;/p&gt;
&lt;p&gt;Basically, it requires using setting the traefik service to &lt;code&gt;NodePort&lt;/code&gt; and the mapping the ports to the control-plane container. To force the traefik pod to run on the control-plane container [node] you have to add a node selector and toleration to the helm values file.&lt;/p&gt;</description></item><item><title>Rust Password Hashing with Argon2id and the Sodiumoxide Crate</title><link>https://blue42.net/code/rust/examples/sodiumoxide-password-hashing/post/</link><pubDate>Wed, 20 May 2020 07:50:17 -0400</pubDate><guid>https://blue42.net/code/rust/examples/sodiumoxide-password-hashing/post/</guid><description>&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;DISCLAIMER #1&lt;/strong&gt;: I am not a cryptography expert. I&amp;rsquo;m not even good at rust.
Please be diligent when handling other people&amp;rsquo;s private information. There
is a lot more detail and authoritative information in the
&lt;a href="#references"&gt;references&lt;/a&gt; section at the end of this post.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DISCLAIMER #2&lt;/strong&gt;: If you have the option using of an external authentication
provider that is probably better than building your own.&lt;/p&gt;
&lt;p&gt;Crypto can be confusing, and there are very few examples of how to use the
&lt;code&gt;sodiumoxide&lt;/code&gt; crate. I needed to store some password hashes, and originally
I was planning to use the &lt;code&gt;ring&lt;/code&gt; crate and pbkdf2, but was encouraged to
use sodiumoxide on the unofficial rust Discord channel.&lt;/p&gt;</description></item><item><title>Getting Started With The STM32 Nucleo-F302R8 and Rust</title><link>https://blue42.net/code/rust/examples/embedded/nucleo-f30248/getting-started/post/</link><pubDate>Thu, 14 May 2020 14:30:42 -0400</pubDate><guid>https://blue42.net/code/rust/examples/embedded/nucleo-f30248/getting-started/post/</guid><description>&lt;h1 id="rust-programming--st-nucleo-f302r8"&gt;Rust Programming &amp;amp; ST Nucleo-F302R8&lt;/h1&gt;
&lt;figure&gt;&lt;img src="../img/nucleo-f302r8-img.jpg"&gt;&lt;figcaption&gt;
 &lt;h4&gt;STM32 Nucleo-F302R8 development board with STM32F302R8 MCU&lt;/h4&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m new to rust and new to embedded programming. I wanted to document my
experience getting started. This started when I bought an Arduino kit to
do some projects with my family while we&amp;rsquo;re stuck inside avoiding the
pandemic.&lt;/p&gt;
&lt;p&gt;If you notice any incorrect information or ways to improve what I&amp;rsquo;ve done
here I would greatly appreciate the feedback!&lt;/p&gt;</description></item><item><title>Direct Link to VM in the vCenter HTML5 interface.</title><link>https://blue42.net/virtualization/create-direct-link-to-virtual-machine-vcenter-html5/post/</link><pubDate>Wed, 20 Nov 2019 08:41:20 -0500</pubDate><guid>https://blue42.net/virtualization/create-direct-link-to-virtual-machine-vcenter-html5/post/</guid><description>&lt;h1 id="why"&gt;Why&lt;/h1&gt;
&lt;p&gt;I find it useful when I generate automated reports to have a link directly to the virtual machine(s) in the report. The example below is written in C#, but the link format is the same regardless of way it is generated.&lt;/p&gt;
&lt;h1 id="link-structure-info"&gt;Link Structure Info&lt;/h1&gt;
&lt;p&gt;Link contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VM MoRef (value only)&lt;/li&gt;
&lt;li&gt;vCenter UUID&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="html-format"&gt;HTML Format&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://vcenter.megacorp.com/ui/#?extensionId=vsphere.core.vm.summary&amp;amp;objectId=urn:vmomi:VirtualMachine:vm-143:a198f2b8-3427-40f4-a4e1-93f6ee5c6999&amp;amp;navigator=vsphere.core.viTree.vmsAndTemplatesView"&gt;https://vcenter.megacorp.com/ui/#?extensionId=vsphere.core.vm.summary&amp;amp;objectId=urn:vmomi:VirtualMachine:vm-143:a198f2b8-3427-40f4-a4e1-93f6ee5c6999&amp;amp;navigator=vsphere.core.viTree.vmsAndTemplatesView&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="c-example"&gt;C# Example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Regex&lt;/span&gt; &lt;span class="n"&gt;serverFromURL&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Regex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;#34;(?&amp;#39;server&amp;#39;^https://\S+\.\S+\.\S+)/sdk&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Match&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serverFromURL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vimClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ServiceUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;lt;a href=\&amp;#34;{0}/ui/#?extensionId=vsphere.core.vm.summary&amp;amp;objectId=urn:vmomi:VirtualMachine:{1}:{2}&amp;amp;navigator=vsphere.core.viTree.vmsAndTemplatesView\&amp;#34;&amp;gt;{3}&amp;lt;/a&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;virtualMachine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MoRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vimClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ServiceContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;About&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;InstanceUuid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;virtualMachine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Named&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="reference"&gt;Reference&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.virtuallyghetto.com/2011/10/how-to-generate-vm-remote-console-url.html"&gt;https://www.virtuallyghetto.com/2011/10/how-to-generate-vm-remote-console-url.html&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Dotnet core and data protection encryption</title><link>https://blue42.net/code/dotnet-core-and-dataprotection-encryption/post/</link><pubDate>Wed, 20 Nov 2019 08:34:36 -0500</pubDate><guid>https://blue42.net/code/dotnet-core-and-dataprotection-encryption/post/</guid><description>&lt;h2 id="data-protection-and-dependency-injection"&gt;Data Protection and Dependency Injection&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Dependency_injection"&gt;Dependency injection&lt;/a&gt; is the process of passing an object to another object that &lt;em&gt;depends&lt;/em&gt; on the first object. In most examples using data protection you&amp;rsquo;ll find that they use dependency injection. I am using dotnet core to automate virtual machine deployments and was looking for a safe way to store credentials. PowerShell provides the &lt;code&gt;Import-CliXml/Export-CliXml&lt;/code&gt; cmdlets that can be used for this purpose, and here is how I recreated that functionality for use in my c# programs.&lt;/p&gt;</description></item><item><title>List AD group members when the group contains foreign security principals</title><link>https://blue42.net/code/use-powershell-to-get-ad-group-members-with-foreign-security-principals/post/</link><pubDate>Wed, 20 Nov 2019 08:26:39 -0500</pubDate><guid>https://blue42.net/code/use-powershell-to-get-ad-group-members-with-foreign-security-principals/post/</guid><description>&lt;h1 id="list-ad-group-members"&gt;List AD Group Members&lt;/h1&gt;
&lt;p&gt;Getting an active directory group&amp;rsquo;s member list is as simple as Get-ADGroupMember if the group only has members from the current domain. However, if you need to get group members for a group that has &lt;a href="https://social.technet.microsoft.com/wiki/contents/articles/51367.active-directory-foreign-security-principals-and-special-identities.aspx"&gt;foreign security principals&lt;/a&gt; (users from another domain) things get a bit more complicated. Even more so when some of those objects have been orphaned.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re lucky you&amp;rsquo;ll end up with a user list that contains SID&amp;rsquo;s from another domain mixed with users from the local domain. At other times, you may get an unspecified error.&lt;/p&gt;</description></item><item><title>How to do an offline install of remote server administration tools (RSAT) on Windows Server and Windows 10</title><link>https://blue42.net/windows/install-rsat-tools-windows-10-insider-preview/post/</link><pubDate>Wed, 20 Nov 2019 07:56:53 -0500</pubDate><guid>https://blue42.net/windows/install-rsat-tools-windows-10-insider-preview/post/</guid><description>&lt;h1 id="install-features-on-demand-offline-on-windows-server-and-windows-10"&gt;Install features on demand offline on Windows Server and Windows 10&lt;/h1&gt;
&lt;p&gt;This also works with the Insider Preview version.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download FoD ISO (I use &lt;a href="https://my.visualstudio.com/"&gt;my.visualstudio.com&lt;/a&gt;. I used the most recent version.&lt;/li&gt;
&lt;li&gt;Install using dism.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To perform the installation from the FOD ISO you must first mount the ISO. Then use the /source: option to the dism command. Note, the /source: option must be after the /add-capability option.&lt;/p&gt;
&lt;p&gt;If ISO is mounted on F: the commands below would install the DNS and Active Directory RSAT tools.&lt;/p&gt;</description></item><item><title>Powercli Script to Unmount and Detach Datastores</title><link>https://blue42.net/code/vmware-powercli-unmount-detach-datastores/</link><pubDate>Tue, 14 May 2019 11:47:47 -0400</pubDate><guid>https://blue42.net/code/vmware-powercli-unmount-detach-datastores/</guid><description>&lt;h1 id="overview"&gt;Overview&lt;/h1&gt;
&lt;p&gt;A storage migration is eventually going to get to a phase where the old datastores need to be unmounted and detached from hosts. I found &lt;a href="https://davidstamen.com/2015/09/14/using-powercli-to-detach-luns/"&gt;a script&lt;/a&gt; showing how to do this via PowerCLI, but I wanted to expand on it to better serve my use case.&lt;/p&gt;
&lt;p&gt;What I came up with is below and also on &lt;a href="https://github.com/larntz/PowerCLI/blob/master/Unmount-Datastores.ps1"&gt;my github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When running the script you must specify the vCenter name and the folder containing the datastores that will be unmounted. A regular expression is used to specify the names of the datastores you want to unmount. For example, &amp;ldquo;Datastore\d\d&amp;rdquo; would unmount datastores named DATASTORE01 and DATASTORE99, but not DMZ_STORAGE01 (the PowerShell -match operator is &lt;em&gt;not&lt;/em&gt; case sensitive). Also, the script will only work on datastores that have been put into maintenance mode.&lt;/p&gt;</description></item><item><title>Automatically Load Custom PowerShell Functions</title><link>https://blue42.net/code/automatically-load-custom-powershell-functions/</link><pubDate>Tue, 23 Apr 2019 14:17:06 -0400</pubDate><guid>https://blue42.net/code/automatically-load-custom-powershell-functions/</guid><description>&lt;h1 id="what-are-powershell-functions"&gt;What are PowerShell Functions&lt;/h1&gt;
&lt;p&gt;PowerShell functions are similar to scripts, but can be loaded into a PowerShell profile or manually when needed. Once loaded, the function can be run by merely typing the name. This differs from a ps1 script where you must specify the file path when executing.&lt;/p&gt;
&lt;p&gt;More detailed &lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions?view=powershell-6"&gt;information about PowerShell functions&lt;/a&gt; can be found on Microsoft&amp;rsquo;s site.&lt;/p&gt;
&lt;h1 id="loading-functions-from-files"&gt;Loading Functions From Files&lt;/h1&gt;
&lt;p&gt;Let&amp;rsquo;s say we have a really useful function that we&amp;rsquo;d like to save and load again in the future. We can save that function into a ps1 file and load it into our current scope by &lt;em&gt;dot sourcing&lt;/em&gt; the file.&lt;/p&gt;</description></item><item><title>Outlook 2016's Funky Portrait Orientation</title><link>https://blue42.net/windows/outlook-open-email-single-click/post/</link><pubDate>Thu, 28 Mar 2019 00:42:01 -0400</pubDate><guid>https://blue42.net/windows/outlook-open-email-single-click/post/</guid><description>&lt;p&gt;&lt;img src="../img/luke-arntz-full-desktop.png" alt="luke-arntz-full-desktop"&gt;&lt;/p&gt;
&lt;h1 id="windows-10-snap-window-feature"&gt;Windows 10 Snap Window Feature&lt;/h1&gt;
&lt;p&gt;I use MS Outlook and Windows 10 at work. I also use &lt;a href="https://wiki.archlinux.org/index.php/Comparison_of_Tiling_Window_Managers"&gt;Linux and a tiling window manager&lt;/a&gt; at home. I long for the day that Windows can manage windows in that way. It&amp;rsquo;s getting better though.&lt;/p&gt;
&lt;p&gt;I make use of the &lt;a href="https://support.microsoft.com/en-us/help/4027324/windows-10-snap-your-windows"&gt;windows-key snap window feature in Windows 10&lt;/a&gt; all day everyday (that I&amp;rsquo;m at work). It&amp;rsquo;s as close to a tiling window manager as MS Windows has ever been.&lt;/p&gt;</description></item><item><title>TP Link TL-WN725N USB WiFi Configuration in Linux</title><link>https://blue42.net/linux/wpa-supplicant-tp-link-wn725n/</link><pubDate>Mon, 25 Mar 2019 00:42:01 -0400</pubDate><guid>https://blue42.net/linux/wpa-supplicant-tp-link-wn725n/</guid><description>&lt;h1 id="overview"&gt;Overview&lt;/h1&gt;
&lt;p&gt;I like using an old fashioned desktop machine at home. It&amp;rsquo;s always on and acts as a hub machine, or &lt;em&gt;&amp;ldquo;server&amp;rdquo;&lt;/em&gt;, if you will. Unfortunately, my current home isn&amp;rsquo;t cabled with Ethernet, and I&amp;rsquo;ve recently rearranged furniture and needed a wireless card. We had a &lt;a href="https://www.tp-link.com/us/products/details/cat-5520_TL-WN725N.html"&gt;TP-Link TL-WN725N&lt;/a&gt; laying around and decided to use that.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m using &lt;a href="https://www.archlinux.org/"&gt;Arch Linux&lt;/a&gt; and &lt;a href="https://www.quora.com/What-is-meant-by-btw-I-use-arch"&gt;do all configuration from the command line&lt;/a&gt;. I found some conflicting information online about setting these devices up so I wanted to post my config in case it helps someone else.&lt;/p&gt;</description></item><item><title>Changing NTFS Security Permissions using PowerShell</title><link>https://blue42.net/windows/changing-ntfs-security-permissions-using-powershell/</link><pubDate>Sun, 17 Mar 2019 00:42:01 -0400</pubDate><guid>https://blue42.net/windows/changing-ntfs-security-permissions-using-powershell/</guid><description>&lt;h1 id="overview"&gt;Overview&lt;/h1&gt;
&lt;p&gt;Changing NTFS permissions with PowerShell saves a lot of time when you need to make changes to a large group of files or when it is required as part of a larger automation project. This article should help you understand everything you need to know to manipulate security permissions with PowerShell.&lt;/p&gt;
&lt;p&gt;When changing ownership of files or folders &lt;em&gt;you must&lt;/em&gt; run PowerShell as an Administrator. Everything here will work in Windows PowerShell 5, but not PowerShell 6 as of this writing &amp;ndash; specifically, the SetAccessControl() method does not exist in PowerShell 6.&lt;/p&gt;</description></item><item><title>Troubleshoot Active Directory Account Lockouts</title><link>https://blue42.net/windows/troubleshoot-active-directory-account-lockout/</link><pubDate>Mon, 26 Nov 2018 00:42:01 -0400</pubDate><guid>https://blue42.net/windows/troubleshoot-active-directory-account-lockout/</guid><description>&lt;p&gt;&lt;img src="https://blue42.net/img/troubleshoot-active-directory-account-lockout/george-becker-access-close-up-door.jpg" alt="George Becker Door Photograph"&gt;&lt;/p&gt;
&lt;h1 id="account-locked"&gt;Account Locked?&lt;/h1&gt;
&lt;p&gt;A good domain security policy is to expire passwords every 30-180 days. Another good security practice is to lockout an account after 3-5 failed logon attempts. This keeps an attacker from quickly trying to &amp;ldquo;brute force&amp;rdquo; a user&amp;rsquo;s password.&lt;/p&gt;
&lt;p&gt;This can also create a scenario where a cached credential causes a user account to be repeatedly locked after a password change. In this article I will explore simple steps to troubleshoot and fix this problem.&lt;/p&gt;</description></item><item><title>4 Things You Should Know About Jumbo Frames</title><link>https://blue42.net/networking/4-things-must-know-jumbo-frames/</link><pubDate>Thu, 13 Sep 2018 00:42:01 -0400</pubDate><guid>https://blue42.net/networking/4-things-must-know-jumbo-frames/</guid><description>&lt;p&gt;&lt;img src="https://blue42.net/img/jumbo-frames/featured.jpeg" alt="FEATURED"&gt;&lt;/p&gt;
&lt;h1 id="1-what-are-jumbo-frames"&gt;1. What are jumbo frames?&lt;/h1&gt;
&lt;p&gt;Some network devices allow the standard size of an Ethernet packet to be changed. By default each network packet can carry 1500 bytes of data (also referred to as the packet&amp;rsquo;s payload). Any payload larger than 1500 bytes sent over the network will be split into more than one packet. If we enable jumbo frames we reduce the number of packets sent over the network when sending large amounts of data.&lt;/p&gt;</description></item><item><title>Extending a VirtualBox Virtual Disk</title><link>https://blue42.net/virtualization/extend-virtualbox-virtual-disk-vboxmanage/</link><pubDate>Tue, 12 Dec 2017 00:42:01 -0400</pubDate><guid>https://blue42.net/virtualization/extend-virtualbox-virtual-disk-vboxmanage/</guid><description>&lt;h1 id="virtualbox"&gt;VirtualBox&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://www.virtualbox.org"&gt;VirtualBox is an open source virtualization product&lt;/a&gt; that allows you to run VMs on your desktop for free. It works extremely well and allows you to run almost every modern operating system.&lt;/p&gt;
&lt;p&gt;Unfortunately, it isn&amp;rsquo;t quite as polished as other products such as &lt;a href="https://www.vmware.com/products/workstation-pro.html"&gt;VMware Workstation&lt;/a&gt;. To make a virtual disk larger we need to power off our VM and go to the command line.&lt;/p&gt;
&lt;h1 id="prerequisites"&gt;Prerequisites&lt;/h1&gt;
&lt;p&gt;We will need &lt;a href="https://www.virtualbox.org/manual/ch08.html"&gt;VBoxManage&lt;/a&gt; to extend our disk. This program is installed when you install VirtualBox.&lt;/p&gt;</description></item><item><title>5 Steps to Extend a Linux LVM Volume</title><link>https://blue42.net/linux/5-steps-linux-lvm-extend-volume-no-reboot/</link><pubDate>Thu, 07 Dec 2017 00:42:01 -0400</pubDate><guid>https://blue42.net/linux/5-steps-linux-lvm-extend-volume-no-reboot/</guid><description>&lt;h1 id="overview"&gt;Overview&lt;/h1&gt;
&lt;p&gt;Virtualization makes it easy to add more disk capacity to a virtual machine. Extending a virtual disk in VMware will grant the VM access to more storage, but we still have to make that storage usable to the operating system.&lt;/p&gt;
&lt;p&gt;This post will explain the steps required to make this additional storage usable within a Linux virtual machine. These steps work with both CentOS7 and Ubuntu 16 and 17, and is done completely from the command line.&lt;/p&gt;</description></item><item><title>The Best CMD Shell, PowerShell, and SSH Client for Windows</title><link>https://blue42.net/windows/2017/march/best-cmd-shell-for-windows/</link><pubDate>Sat, 25 Mar 2017 00:42:01 -0400</pubDate><guid>https://blue42.net/windows/2017/march/best-cmd-shell-for-windows/</guid><description>&lt;p&gt;&lt;img src="https://blue42.net/img/2017/best-cmd-shell-for-windows/featured.jpeg" alt="FEATURED"&gt;&lt;/p&gt;
&lt;h1 id="we-deserve-better"&gt;We Deserve Better&lt;/h1&gt;
&lt;p&gt;When you work with Linux servers, routers, switches, virtualization hosts, and SANs you&amp;rsquo;ll find yourself using SSH often. When you also work with Windows Servers, Exchange, Active Directory, etc you&amp;rsquo;ll find yourself in PowerShell often. More often than not I find myself on a Windows machine working on all of the above, but if you&amp;rsquo;ve spent much time using a Linux desktop terminal you&amp;rsquo;ll understand why the Windows command shell is&amp;hellip; frustrating.&lt;/p&gt;</description></item><item><title>HowTo: Self Hosted WordPress on Ubuntu 16.04LTS</title><link>https://blue42.net/linux/2017/march/self-hosted-wordpress-ubuntu-1604lts/</link><pubDate>Fri, 17 Mar 2017 00:42:01 -0400</pubDate><guid>https://blue42.net/linux/2017/march/self-hosted-wordpress-ubuntu-1604lts/</guid><description>&lt;p&gt;&lt;img src="//img/self-hosted-wordpress-ubuntu/featured.jpeg" alt="FEATURED"&gt;&lt;/p&gt;
&lt;h1 id="self-hosted-wordpress-on-ubuntu-1604lts"&gt;Self-Hosted WordPress on Ubuntu 16.04LTS&lt;/h1&gt;
&lt;p&gt;There are a lot of good reasons to use a hosting provider for your website or blog. A hosting provider will give you a platform to host your site without the responsibility of maintaining a server or needing to know the low level configuration details of the server software and WordPress.&lt;/p&gt;
&lt;p&gt;But, if you&amp;rsquo;re a little bit technical, want to learn to be a little bit technical, or just want to get your site off the ground for free, self hosting on a VPS (virtual private server) is a great option. Both Google Cloud Platform (GCP) and Amazon Web Services (AWS) offer free servers for at least a year. Google recently added an Always Free option for a &lt;em&gt;small&lt;/em&gt; VPS.&lt;/p&gt;</description></item><item><title>The Linux TOP Command</title><link>https://blue42.net/linux/2017/january/linux-top-command/</link><pubDate>Mon, 30 Jan 2017 00:42:01 -0400</pubDate><guid>https://blue42.net/linux/2017/january/linux-top-command/</guid><description>&lt;h1 id="linux-top"&gt;LINUX TOP&lt;/h1&gt;
&lt;p&gt;The Linux TOP command provides valuable monitoring and troubleshooting information. However, there is a lot of information in a very condensed format and it can be tricky to sort through what is important and what isn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;This post was written using Ubuntu 16.04.2 LTS and TOP 3.3.10.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blue42.net/img/linux-top/top_capture.PNG" alt="TOP SCREENSHOT"&gt;&lt;/p&gt;
&lt;h2 id="the-top-of-top"&gt;THE TOP OF TOP&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-command" data-lang="command"&gt;1. top - 18:45:48 up 14 days, 2:31, 1 user, load average: 0.00, 0.00, 0.00
2. Tasks: 127 total, 1 running, 126 sleeping, 0 stopped, 0 zombie
3. %Cpu0 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0
4. KiB Mem : 1014372 total, 490596 free, 50532 used, 473244 buff/cache
5. KiB Swap: 0 total, 0 free, 0 used. 907684 avail Mem [
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The first few lines of output from TOP give you a system overview. It shows up time, users, load average, CPU and memory statistics.&lt;/p&gt;</description></item><item><title>QuickPost: What version of Ubuntu am I running?</title><link>https://blue42.net/linux/2017/january/ubuntu-lsb-release/</link><pubDate>Sat, 21 Jan 2017 00:42:01 -0400</pubDate><guid>https://blue42.net/linux/2017/january/ubuntu-lsb-release/</guid><description>&lt;p&gt;&lt;img src="https://blue42.net/img/lsb-release/ubuntu_orange_hex.png" alt="ubuntu_logo"&gt;&lt;/p&gt;
&lt;h1 id="using-lsb_release-to-display-the-running-ubuntu-version"&gt;USING &lt;code&gt;lsb_release&lt;/code&gt; TO DISPLAY THE RUNNING UBUNTU VERSION&lt;/h1&gt;
&lt;p&gt;This is a QuickPost™ (not really trademarked), and I&amp;rsquo;ll get to the point. To find out what version of Ubuntu a system is running use the command &lt;code&gt;lsb_release&lt;/code&gt;. This isn&amp;rsquo;t something you&amp;rsquo;ll need everyday, but when you do it&amp;rsquo;s good to know.&lt;/p&gt;
&lt;p&gt;There several options when running &lt;code&gt;lsb_release&lt;/code&gt;, but the two you&amp;rsquo;re most likely to find useful are &lt;code&gt;lsb_release -a&lt;/code&gt; - &lt;em&gt;show everything&lt;/em&gt;, and &lt;code&gt;lsb_release -r&lt;/code&gt; - &lt;em&gt;show only the release&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>DNS: How it Works</title><link>https://blue42.net/networking/2017/january/dns-how-it-works/</link><pubDate>Wed, 11 Jan 2017 00:42:01 -0400</pubDate><guid>https://blue42.net/networking/2017/january/dns-how-it-works/</guid><description>&lt;h1 id="what-is-dns"&gt;WHAT IS DNS&lt;/h1&gt;
&lt;p&gt;A Domain Name Service (DNS) is a critical service that everyone uses every time they surf the web. Before we get into the technical details let&amp;rsquo;s talk about telephone numbers.&lt;/p&gt;
&lt;h2 id="phone-book-analogy"&gt;PHONE BOOK ANALOGY&lt;/h2&gt;
&lt;p&gt;DNS is similar to a phone book. In the long, long ago when you needed to call someone and didn&amp;rsquo;t already know their number you had to look them up by name in a telephone book, see their phone number, and then make the call. If you needed to make a call to someone long distance then you had to call information and hope you could them enough information to find the person or business&amp;rsquo; number you needed.
Instead of carrying a phone book around all the time or calling information people used to have address books, black books, scraps of paper, or a number written in ink on their hand to keep frequently used numbers with them for easy access. As long as we have our local copy of the number we could stop at the next payphone we passed and call anyone we know without taking the time to look the number up in the city wide phone book.&lt;/p&gt;</description></item><item><title>NGINX, ALPN and HTTP/2 on CentOS7</title><link>https://blue42.net/linux/2016/december/nginx-http2-nlpn-openssl-compile/</link><pubDate>Wed, 14 Dec 2016 11:22:01 -0400</pubDate><guid>https://blue42.net/linux/2016/december/nginx-http2-nlpn-openssl-compile/</guid><description>&lt;h1 id="http2-on-centos7-with-nginx"&gt;HTTP/2 ON CENTOS7 WITH NGINX&lt;/h1&gt;
&lt;p&gt;You&amp;rsquo;ve probably heard about the fancy new lightning fast HTTP/2 protocol, right? Fortunately, the latest versions of NGINX support HTTP/2. Unfortunately, most distributions are still stuck on OpenSSL &amp;lt; 1.0.2.&lt;/p&gt;
&lt;p&gt;Versions of OpenSSL below 1.0.2 don&amp;rsquo;t support the new Application-Layer Protocol Negotition standard (ALPN) which means browsers must use Next Protocol Negotiation (NPN) to upgrade the connection to HTTP/2.&lt;/p&gt;
&lt;p&gt;&lt;img src="//img/nginx-http2/jackie-chan.png" alt="whaaaaat"&gt;&lt;/p&gt;
&lt;h2 id="but-what-does-this-mean-why-does-it-matter"&gt;BUT WHAT DOES THIS MEAN? WHY DOES IT MATTER?&lt;/h2&gt;
&lt;p&gt;This matters because Google Chrome will fall back to HTTP/1.1 if ALPN is not supported. Since most Linux distributions don&amp;rsquo;t officially support a version of OpenSSL that implements ALPN that means &lt;em&gt;something&lt;/em&gt; must be done to if we want to implement HTTP/2 properly.&lt;/p&gt;</description></item><item><title>Install certbot on Amazon Linux</title><link>https://blue42.net/linux/2016/december/certbot-amazon-linux/</link><pubDate>Tue, 13 Dec 2016 14:03:47 +0000</pubDate><guid>https://blue42.net/linux/2016/december/certbot-amazon-linux/</guid><description>&lt;h1 id="install-certbot"&gt;INSTALL CERTBOT&lt;/h1&gt;
&lt;h2 id="official-instructions-at-certbotefforg"&gt;(official instructions at &lt;a href="https://certbot.eff.org/"&gt;certbot.eff.org&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;There is no packaged version of certbot for Amazon Linux so we have to download and set it up manually. Running it the first time will install all dependencies and should then work to create and renew certificates. Unfortunately, the first run on Amazon Linux gives us and error instead of a working certbot. :(&lt;/p&gt;</description></item><item><title>SSL for Websites</title><link>https://blue42.net/networking/2016/november/ssl-for-websites/</link><pubDate>Fri, 18 Nov 2016 07:44:01 -0400</pubDate><guid>https://blue42.net/networking/2016/november/ssl-for-websites/</guid><description>&lt;h1 id="what-is-ssl"&gt;WHAT IS SSL?&lt;/h1&gt;
&lt;p&gt;SSL is short for &lt;em&gt;Secure Sockets Layer&lt;/em&gt; and provides a means to communicate securely from one device to another. The website server is identified by a certificate and uses a public and private key to create a secure connection between the client and server.&lt;/p&gt;</description></item></channel></rss>