<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on Jamie Phillips</title><link>https://phillipsj.net/</link><description>Recent content in Home on Jamie Phillips</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://phillipsj.net/index.xml" rel="self" type="application/rss+xml"/><item><title>About</title><link>https://phillipsj.net/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://phillipsj.net/about/</guid><description>&lt;p&gt;Hello, my name is Jamie Phillips.&lt;/p&gt;
&lt;p&gt;I am a Staff Site Reliability Engineer, and I work remotely from East Tennessee. I have been programming professionally since 2007 after discovering software development in graduate school. My Geology degree has given me an appreciation for large systems and processes which has created keen interest in Solutions Architecture, DevOps, and the Cloud. During the day I work on Windows, but at night I am all about Linux.&lt;/p&gt;</description></item><item><title>Projects</title><link>https://phillipsj.net/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://phillipsj.net/projects/</guid><description>&lt;h2 id="cakenetlify"&gt;Cake.Netlify&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cake-contrib/Cake.Netlify"&gt;Source Code (cake-contrib/Cake.Netlify)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cake Addin for working with &lt;a href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="cakeftp"&gt;Cake.Ftp&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cake-contrib/Cake.Ftp"&gt;Source Code (cake-contrib/Cake.Ftp)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cake Addin for working with FTP.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="cakesquirrel"&gt;Cake.Squirrel&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cake-contrib/Cake.Squirrel"&gt;Source Code (cake-contrib/Cake.Squirrel)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cake Addin to support Squirrel.Windows&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="cakeapppackager"&gt;Cake.AppPackager&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cake-contrib/Cake.AppPackager"&gt;Source Code (cake-contrib/Cake.AppPackager)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cake Addin for creating UWP packages.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="cakexdttransform"&gt;Cake.XdtTransform&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cake-contrib/Cake.XdtTransform"&gt;Source Code (cake-contrib/Cake.XdtTransform)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cake Addin for performing XdtTransforms.&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="past-projects"&gt;&lt;em&gt;Past Projects&lt;/em&gt;&lt;/h1&gt;
&lt;hr&gt;
&lt;h2 id="authorize-net-html-helpers"&gt;Authorize .NET HTML Helpers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/phillipsj/authorize-net-helpers"&gt;Source Code (phillipsj/authorize-net-helpers)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="dillo"&gt;dillo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/phillipsj/dillo"&gt;Source Code (phillipsj/dillo)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ruby library for working with the City of Austin Data Portal (data.austintexas.gov)&lt;/p&gt;</description></item><item><title>Podcasts</title><link>https://phillipsj.net/podcasts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://phillipsj.net/podcasts/</guid><description>&lt;p&gt;Here is the list of podcasts that I have appeared on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtu.be/QH_OJhQfJhU?si=GHUlJSILJHMus23A"&gt;Difference Between Devops And SRE?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://podcasts.apple.com/us/podcast/014-multi-cloud-devops-and-automation/id1448194100?i=1000433956378"&gt;Multi-Cloud DevOps and Automation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dotnetrocks.com/details/1642"&gt;HashiCorp Packer with Jamie Phillips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://packetpushers.net/podcast/day-two-cloud-006-dealing-with-the-unknown-unknowns-of-building-cloud-applications/"&gt;Dealing With The Unknown Unknowns Of Building Cloud Applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crosscuttingconcerns.com/Podcast-115-Jamie-Phillips-Terraform"&gt;Jamie Phillips on Terraform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developeronfire.com/podcast/episode-393-jamie-phillips-setting-up-good-experiences"&gt;Jamie Phillips - Setting Up Good Experiences&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Talks</title><link>https://phillipsj.net/talks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://phillipsj.net/talks/</guid><description>&lt;p&gt;Here are the presentations that I have given. Links to the presentation and the video, if recorded, are provided.&lt;/p&gt;
&lt;h2 id="responsible-app-tailoring-creating-effective-architecture-with-seams"&gt;Responsible App Tailoring: Creating Effective Architecture with Seams&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2018 CodeStock&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe
 style='width: 100%; height: 500px;'
 frameborder='0' marginwidth='0' marginheight='0' scrolling='no'
 src='https://www.slideshare.net/slideshow/embed_code/key/9Xe5iscE5zwu45?startSlide=1'
 allowfullscreen webkitallowfullscreen mozallowfullscreen&gt;
&lt;/iframe&gt;
&lt;br/&gt;

&lt;h2 id="extending-the-net-cli"&gt;Extending the .NET CLI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2018 CodeStock&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe
 style='width: 100%; height: 500px;'
 frameborder='0' marginwidth='0' marginheight='0' scrolling='no'
 src='https://www.slideshare.net/slideshow/embed_code/key/M5Btyvj1lubsgR?startSlide=1'
 allowfullscreen webkitallowfullscreen mozallowfullscreen&gt;
&lt;/iframe&gt;
&lt;br/&gt;

&lt;h2 id="a-devops-story"&gt;A DevOps Story&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2017 Code PaLOUsa&lt;/li&gt;
&lt;li&gt;2017 CodeStock&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="putting-your-builds-to-work-for-you-a-piece-of-cake"&gt;Putting your builds to work for you, a piece of Cake!&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2017 DevSpace&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe
 style='width: 100%; height: 500px;'
 frameborder='0' marginwidth='0' marginheight='0' scrolling='no'
 src='https://www.slideshare.net/slideshow/embed_code/key/17JOyirNYOzbj?startSlide=1'
 allowfullscreen webkitallowfullscreen mozallowfullscreen&gt;
&lt;/iframe&gt;
&lt;br/&gt;

&lt;h2 id="putting-your-builds-to-work-for-you-a-piece-of-cake-1"&gt;Putting your builds to work for you, a piece of Cake!&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2017 CodeStock&lt;/li&gt;
&lt;li&gt;2016 CodeStock&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe
 style='width: 100%; height: 500px;'
 frameborder='0' marginwidth='0' marginheight='0' scrolling='no'
 src='https://www.slideshare.net/slideshow/embed_code/key/17JOyirNYOzbj?startSlide=1'
 allowfullscreen webkitallowfullscreen mozallowfullscreen&gt;
&lt;/iframe&gt;
&lt;br/&gt;

&lt;h2 id="up-for-grabs-contributing-to-open-source-projects"&gt;Up For Grabs: Contributing to Open Source Projects&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2017 Code PaLOUsa&lt;/li&gt;
&lt;li&gt;2015 CodeStock&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe
 style='width: 100%; height: 500px;'
 frameborder='0' marginwidth='0' marginheight='0' scrolling='no'
 src='https://www.slideshare.net/slideshow/embed_code/key/17JOyirNYOzbj?startSlide=1'
 allowfullscreen webkitallowfullscreen mozallowfullscreen&gt;
&lt;/iframe&gt;
&lt;br/&gt;

&lt;h2 id="profiling-python"&gt;Profiling Python&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2014 Esri Developer Summit&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/phillipsj/py-profilig-presentation-2014"&gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="using-sqlite-know-which-geometry-to-use"&gt;Using SQLite? Know which geometry to use?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2014 Esri Developer Summit&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/phillipsj/sqlite-presentation-2014"&gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Archives</title><link>https://phillipsj.net/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://phillipsj.net/archives/</guid><description/></item><item><title>My Custom AI Skills</title><link>https://phillipsj.net/posts/my-custom-ai-skills/</link><pubDate>Mon, 27 Jul 2026 17:21:24 -0400</pubDate><guid>https://phillipsj.net/posts/my-custom-ai-skills/</guid><description>&lt;p&gt;It’s funny that I struggled when I first started using AI to really lean into it. I was fine with the code completion, answering questions, searching the docs, etc. Then one day I realized that I could just have it create skills for me as I found things I repeatedly did. So here are a few examples of skills that I have made and what they could look like for you. These are not 100% my implementation but enough to give you a rough concept.&lt;/p&gt;</description></item><item><title>Uploading a CSV Workout to TrainingPeaks using AI</title><link>https://phillipsj.net/posts/uploading-a-csv-workout-to-training-peaks-using-ai/</link><pubDate>Sun, 26 Jul 2026 16:26:43 -0400</pubDate><guid>https://phillipsj.net/posts/uploading-a-csv-workout-to-training-peaks-using-ai/</guid><description>&lt;p&gt;I don&amp;rsquo;t discuss my enjoyment of cycling here much; however, it&amp;rsquo;s probably one of my favorite activities. My preference is mountain biking, but being on a bicycle of any kind creates a lot of joy for me. I have been doing training plans for about the last year, and I am using &lt;a href="https://www.trainingpeaks.com"&gt;TrainingPeaks&lt;/a&gt; to purchase the plans and track them. However, it seems that there isn&amp;rsquo;t an easy way as an &lt;code&gt;athlete&lt;/code&gt; user to be able to create plans and upload them. However, after having Claude take a strength routine that I wanted to incorporate, I discovered that there are several methods available that leverage some application APIs to enable you to upload a workout. The first step is to get the plan you want to create in a format that will allow it to be uploaded.&lt;/p&gt;</description></item><item><title>My Current AI Workflow</title><link>https://phillipsj.net/posts/my-current-ai-workflow/</link><pubDate>Tue, 21 Jul 2026 18:29:08 -0400</pubDate><guid>https://phillipsj.net/posts/my-current-ai-workflow/</guid><description>&lt;p&gt;First thing every morning, I open Claude Desktop, and I start off by brainstorming the three things I want to get done that day. I have been in that pattern for several years after having read &lt;a href="https://gettingresults.com"&gt;“Getting Results the Agile Way”&lt;/a&gt;.  After I list the three things I need done, I will look at email, Slack, etc., and see if there are any other tasks I need to add to my list. Then I ask Claude to create me a Jira issue for each task, then help me plan the task. I provide all the context that I think is required, then have it validate that it’s enough. That information gets added to the Jira task.&lt;/p&gt;</description></item><item><title>Stooge Moto Bar Review</title><link>https://phillipsj.net/posts/stooge-moto-bar-review/</link><pubDate>Sun, 05 Jul 2026 11:45:47 -0400</pubDate><guid>https://phillipsj.net/posts/stooge-moto-bar-review/</guid><description>&lt;p&gt;As I have started doing longer rides, I realized that I wasn&amp;rsquo;t as happy as I should be with my cockpit on my Trek Roscoe. I have been running the &lt;a href="https://www.pnwcomponents.com/collections/handlebars/products/range-handlebar-gen-4?variant=40010488152141"&gt;PNW Range Bar&lt;/a&gt; for a few years, which are more comfortable than the stock bar that came with the bike. I finally realized after reading this &lt;a href="https://meatengines.com/f/meatengines-ride-o-vision-about-%7C-the-stooge-moto-bar-review"&gt;post&lt;/a&gt; by Andrew Major that it was the change in sweep that made me like the Range bar. However, maybe ten degrees of backsweep just wasn&amp;rsquo;t enough for me. After more research on Reddit and MTBR, I decided to search for a bar with more backsweep. Here were the contenders, mostly taken from the post above and some of my own searching.&lt;/p&gt;</description></item><item><title>The AWS Rust SDK Experience</title><link>https://phillipsj.net/posts/the-aws-rust-sdk-experience/</link><pubDate>Sun, 28 Sep 2025 12:24:21 -0400</pubDate><guid>https://phillipsj.net/posts/the-aws-rust-sdk-experience/</guid><description>&lt;p&gt;I finally found the opportunity to use &lt;a href="https://rust-lang.org"&gt;Rust&lt;/a&gt; in a real application. I needed to create an &lt;a href="https://aws.amazon.com/lambda/"&gt;AWS Lambda&lt;/a&gt;, which wasn&amp;rsquo;t very complex, and AWS has a &lt;a href="https://aws.amazon.com/sdk-for-rust/"&gt;Rust SDK&lt;/a&gt;, so the stars aligned. I have been wanting to use Rust more over the years, and I can say that the experience has been great. The AWS SDK appears comprehensive and has many features I enjoyed using.&lt;/p&gt;
&lt;p&gt;One of the signatures for an EventBridge event is &lt;code&gt;EventBridge&amp;lt;T1 = Value&amp;gt;&lt;/code&gt;, which I like. The &lt;code&gt;T&lt;/code&gt; allows you to build a custom type using &lt;a href="https://serde.rs"&gt;serde&lt;/a&gt; to deserialize the detail property on the EventBridge JSON object. There are a few attributes you have to define, which I hope to cover in a future post, that make it a little easier.&lt;/p&gt;</description></item><item><title>It Doesn't Get Any Easier</title><link>https://phillipsj.net/posts/it-doesnt-get-any-easier/</link><pubDate>Wed, 20 Aug 2025 18:14:25 -0400</pubDate><guid>https://phillipsj.net/posts/it-doesnt-get-any-easier/</guid><description>&lt;p&gt;The title of this post says it all about the fields of software engineering, DevOps, and site reliability engineering. These fields don&amp;rsquo;t actually become any easier; they continually increase in complexity. This complexity can be due to increased needs, improper design, etc. We have all kinds of specialists in a specific area, as being a generalist is even more difficult. It&amp;rsquo;s funny how we specialize, but we keep these generic titles. I was reading some training books for cycling, and I came across the following quote attributed to &lt;a href="https://en.wikipedia.org/wiki/Greg_LeMond"&gt;Greg Lemond&lt;/a&gt;, the first and only American to win the Tour de France.&lt;/p&gt;</description></item><item><title>The Need for Planning</title><link>https://phillipsj.net/posts/the-need-for-planning/</link><pubDate>Mon, 04 Aug 2025 22:47:31 -0400</pubDate><guid>https://phillipsj.net/posts/the-need-for-planning/</guid><description>&lt;p&gt;I had a funny conversation today. We were chatting about AI agents and how people are using them. I brought up the incident that happened at &lt;a href="https://www.theregister.com/2025/07/21/replit_saastr_vibe_coding_incident/"&gt;Replit&lt;/a&gt; and what a few of us have been seeing, how a lot of people are using these agents. We slowly started discussing how AI agents require context and a plan to really produce a good solution. Then you slowly continue to prompt it to refine the solution. Of course, I couldn&amp;rsquo;t resist saying that &amp;ldquo;back in my day,&amp;rdquo; we performed planning, created some architecture diagrams that we refined as a team, then broke down the work to get started. I then proceeded to say that it made creating the solution much simpler, as it was just a matter of refining some details and executing. I find it super humorous that &amp;ldquo;old&amp;rdquo; things are being rediscovered as a necessary part of the process when using AI. What&amp;rsquo;s even funnier is that it was that long ago. As a profession, we have seemed to abandon the idea of doing a little bit of design, establishing a context, then refining it as we build. There is a rush to start slinging code, not solving the problem.&lt;/p&gt;</description></item><item><title>New Home Lab Part 3: Observability</title><link>https://phillipsj.net/posts/new-home-lab-part-3-observability/</link><pubDate>Sun, 02 Mar 2025 12:46:47 -0500</pubDate><guid>https://phillipsj.net/posts/new-home-lab-part-3-observability/</guid><description>&lt;p&gt;My new home lab is getting close to having the core setup complete. I want to run an observability platform in my home lab for learning so I took a brief hiatus on the home lab work to create two addons for MicroK8s. The first addon is one for &lt;a href="https://opentelemetry.io"&gt;OpenTelemetry&lt;/a&gt; and the other addon is for &lt;a href="https://openobserve.ai"&gt;OpenObserve&lt;/a&gt;. You can find these addons in my new addons repository &lt;a href="https://github.com/phillipsj/microk8s-addons"&gt;here&lt;/a&gt;. I showed how those are installed in the blog posts about each addon. I need to update my launch configuration to reflect these two new addons as part of the bootstrapping process.&lt;/p&gt;</description></item><item><title>OpenObserve Addon for Microk8s</title><link>https://phillipsj.net/posts/openobserve-addon-for-microk8s/</link><pubDate>Mon, 24 Feb 2025 21:29:01 -0500</pubDate><guid>https://phillipsj.net/posts/openobserve-addon-for-microk8s/</guid><description>&lt;p&gt;In a previous post, I mentioned the &lt;a href="https://github.com/phillipsj/microk8s-addons"&gt;addons repository&lt;/a&gt; that I had created for &lt;a href="https://microk8s.io"&gt;MicroK8s&lt;/a&gt;. There is the existing &lt;a href="https://opentelemetry.io/docs/platforms/kubernetes/helm/operator/"&gt;OpenTelemetry Operator&lt;/a&gt; addon and now there is a new addon for &lt;a href="https://openobserve.ai"&gt;OpenObserve&lt;/a&gt;. I had looked at a few options and decided to try this out as my observability platform. Let&amp;rsquo;s check out how to install it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ microk8s addons repo add phillipsj https://github.com/phillipsj/microk8s-addons --reference main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Cloning into &lt;span style="color:#4e9a06"&gt;&amp;#39;/var/snap/microk8s/common/addons/phillipsj&amp;#39;&lt;/span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;remote: Enumerating objects: 48, &lt;span style="color:#204a87;font-weight:bold"&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;remote: Counting objects: 100% &lt;span style="color:#ce5c00;font-weight:bold"&gt;(&lt;/span&gt;48/48&lt;span style="color:#ce5c00;font-weight:bold"&gt;)&lt;/span&gt;, &lt;span style="color:#204a87;font-weight:bold"&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;remote: Compressing objects: 100% &lt;span style="color:#ce5c00;font-weight:bold"&gt;(&lt;/span&gt;40/40&lt;span style="color:#ce5c00;font-weight:bold"&gt;)&lt;/span&gt;, &lt;span style="color:#204a87;font-weight:bold"&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;remote: Total &lt;span style="color:#0000cf;font-weight:bold"&gt;48&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;(&lt;/span&gt;delta 11&lt;span style="color:#ce5c00;font-weight:bold"&gt;)&lt;/span&gt;, reused &lt;span style="color:#0000cf;font-weight:bold"&gt;36&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;(&lt;/span&gt;delta 7&lt;span style="color:#ce5c00;font-weight:bold"&gt;)&lt;/span&gt;, pack-reused &lt;span style="color:#0000cf;font-weight:bold"&gt;0&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;(&lt;/span&gt;from 0&lt;span style="color:#ce5c00;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Unpacking objects: 100% &lt;span style="color:#ce5c00;font-weight:bold"&gt;(&lt;/span&gt;48/48&lt;span style="color:#ce5c00;font-weight:bold"&gt;)&lt;/span&gt;, 21.73 KiB &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; 1.81 MiB/s, &lt;span style="color:#204a87;font-weight:bold"&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then you can install the OpenTelemetry addon:&lt;/p&gt;</description></item><item><title>OpenTelemetry Operator Addon for MicroK8s</title><link>https://phillipsj.net/posts/opentelemetry-operator-addon-for-microk8s/</link><pubDate>Sun, 26 Jan 2025 22:51:30 -0500</pubDate><guid>https://phillipsj.net/posts/opentelemetry-operator-addon-for-microk8s/</guid><description>&lt;p&gt;As I have been working on setting up a home lab for Kubernetes for learning, I have settled on MicroK8s as my distribution of choice. It&amp;rsquo;s easy to install, fairly well supported and comes with lots of &lt;a href="https://microk8s.io/docs/addons"&gt;addons&lt;/a&gt;. Yes, many addons are just convenience methods for installing a Helm chart or manifest which I like. Since I plan to install &lt;a href="https://opentelemetry.io"&gt;OpenTelemetry&lt;/a&gt; on my cluster, I decided to create an addon. Canonical has good documentation and a template repository you can use, which is located &lt;a href="https://github.com/canonical/microk8s-addons-repo-template"&gt;here&lt;/a&gt;. I made myself a new repository from this template and dug into creating my first MicroK8s addon. You&amp;rsquo;re provided with the choice to write it using Bash or Python with utilities provided for each. I&amp;rsquo;m not the biggest fan of Bash so of course I chose Python. The Python approach allows the use of Requests and Click for your addon. PyTest is provided for testing that your addon works correctly. Overall, the experience has been good. I was able to get my addon created and tested with minimal effort. You can check out my &lt;a href="https://github.com/phillipsj/microk8s-addons"&gt;addon repository&lt;/a&gt; to check out what I have done. You may want to watch the repository if this interests you as I have a few more observability-related addons that I will be adding.&lt;/p&gt;</description></item><item><title>New Home Lab Part 2: MicroK8s</title><link>https://phillipsj.net/posts/new-home-lab-part-2-microk8s/</link><pubDate>Sat, 18 Jan 2025 18:11:38 -0500</pubDate><guid>https://phillipsj.net/posts/new-home-lab-part-2-microk8s/</guid><description>&lt;p&gt;My last post I had an outline of the steps I wanted to take. I completed all the hardware configuration and setup of Ubuntu. This leaves just getting &lt;a href="https://microk8s.io"&gt;MicroK8s&lt;/a&gt; installed and configured. I said that I was going to have automation of my cluster, and that is exactly how I set it up. I took a deep dive into &lt;a href="https://microk8s.io/docs/explain-launch-config"&gt;launch configurations&lt;/a&gt; which I successfully used to create my MicroK8s cluster. The only tricky part was figuring out how to pass arguments to addons like MetalLB, and it wasn&amp;rsquo;t that challenging. Here is how I set it up.&lt;/p&gt;</description></item><item><title>New Home Lab Part 1</title><link>https://phillipsj.net/posts/new-home-lab-part-1/</link><pubDate>Mon, 13 Jan 2025 19:29:48 -0500</pubDate><guid>https://phillipsj.net/posts/new-home-lab-part-1/</guid><description>&lt;p&gt;It’s time to get the home lab back up and running since I need an environment that I can use to do some learning. I’m focusing on getting a Kubernetes cluster up with all the tools that interest me. I want to be able to start simple and slowly build in more complexity. I also want maintenance to be straightforward. That said, I will use an Intel NUC with plenty of RAM and storage. I will be running Ubuntu 24.04 with automatic updates, and finally, I will be using &lt;a href="https://microk8s.io"&gt;MicroK8s&lt;/a&gt; for my Kubernetes distribution. This will take a little time to set up and configure like I want.&lt;/p&gt;</description></item><item><title>Kustomize for OTel Operator</title><link>https://phillipsj.net/posts/kustomize-for-otel-operator/</link><pubDate>Tue, 07 Jan 2025 20:43:35 -0500</pubDate><guid>https://phillipsj.net/posts/kustomize-for-otel-operator/</guid><description>&lt;p&gt;If you have been reading my blog for a while, you may already know that I&amp;rsquo;m not the biggest fan of &lt;a href="https://helm.sh"&gt;Helm&lt;/a&gt;. If you’re new here, hi, I&amp;rsquo;m not a fan of Helm. I feel it adds a lot of complexities that
are seldom worth it, and it&amp;rsquo;s hard to build a Helm chart well, note I said well. Many projects have started publishing manifests for their projects, and the &lt;a href="https://github.com/open-telemetry/opentelemetry-operator"&gt;OpenTelemetry Operator&lt;/a&gt; is one of them. You can find the manifest &lt;a href="https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml"&gt;here&lt;/a&gt;. There is also an artifact for the manifest also available.&lt;/p&gt;</description></item><item><title>Dusting Off the Cobwebs</title><link>https://phillipsj.net/posts/dusting-off-the-cobwebs/</link><pubDate>Thu, 02 Jan 2025 21:23:40 -0500</pubDate><guid>https://phillipsj.net/posts/dusting-off-the-cobwebs/</guid><description>&lt;p&gt;Just a quick post to say that after neglecting my blog for a while, I decided that I would dust off the cobwebs. I have
brought the blog up to the latest Hugo standards. I removed a few pages and made tweaks to a few others to remove some
warnings that were getting flagged when building.&lt;/p&gt;
&lt;p&gt;My blog is now ready for 2025.&lt;/p&gt;</description></item><item><title>Practice Like You Play</title><link>https://phillipsj.net/posts/practice-like-you-play/</link><pubDate>Tue, 17 Dec 2024 18:03:33 -0500</pubDate><guid>https://phillipsj.net/posts/practice-like-you-play/</guid><description>&lt;p&gt;I grew up playing football, and a consistent phrase I always heard was &lt;strong&gt;“practice like you play.”&lt;/strong&gt; There are several
different derivatives of this same phrase that have a similar meaning. This was told as a reminder that practicing was
preparation for game day and that if you didn’t practice well, you probably wouldn’t play well on game day. My experience
is that it’s true. If you didn’t focus on your assignments and know your plays, then you wouldn’t know those on game
day. Game day adds extra pressure, big crowds, and unknown opponents. All things that can make you easily distracted or
extra nervous which impacts your performance. The more you focused on things in practice, the easier it was to execute on
game day.&lt;/p&gt;</description></item><item><title>Review: Prompt Engineering for Generative AI</title><link>https://phillipsj.net/posts/review-prompt-engineering-for-generative-ai/</link><pubDate>Sun, 13 Oct 2024 22:14:11 -0400</pubDate><guid>https://phillipsj.net/posts/review-prompt-engineering-for-generative-ai/</guid><description>&lt;p&gt;There is a lot of hype around AI, specifically generative AI. I understand a lot of the concepts around ML, LLMs, and text analysis that I picked up through different parts of my education and career. I personally feel AI is a misnomer, but I&amp;rsquo;m digressing a little on the point. I wanted to get myself up to speed on prompt engineering techniques, so I can better understand how to leverage generative AI while coding and doing other daily tasks. I took a few free courses on &lt;a href="https://academy.jetbrains.com/"&gt;JetBrains Academy&lt;/a&gt; which really moved the needle for me using AI coding assistants. I learned a few basic concepts like one-shot, few-shot, and chain-of-thought prompting which made a huge difference in the code I was able to generate compared the zero-shot prompting that I was using before.&lt;/p&gt;</description></item><item><title>PSA: Use Linters for Everything</title><link>https://phillipsj.net/posts/psa-use-linters-for-everything/</link><pubDate>Fri, 20 Sep 2024 18:22:35 -0400</pubDate><guid>https://phillipsj.net/posts/psa-use-linters-for-everything/</guid><description>&lt;p&gt;This is a public service announcement. Please use linters if they’re available. Most things have linters available to check your code, YAML, Dockerfiles, Helm charts, Kubernetes manifests, Argo, etc. I think most people know about linters in the code space. Using tools like &lt;a href="https://github.com/astral-sh/ruff"&gt;Ruff&lt;/a&gt; or &lt;a href="https://pypi.org/project/pylint/"&gt;PyLint&lt;/a&gt; for Python, &lt;a href="https://github.com/jslint-org/jslint"&gt;JSLint&lt;/a&gt; for JavaScript, and &lt;a href="https://staticcheck.dev/"&gt;Staticcheck&lt;/a&gt; for Go are just a few that people may have used. Did you know there are linters built into many of the modern-day tools that people use? I&amp;rsquo;m sure you very well may, but let&amp;rsquo;s review a few that I’ve found are underutilized.&lt;/p&gt;</description></item><item><title>Finding the Latest Version When It's Not Easy Using Python</title><link>https://phillipsj.net/posts/finding-the-latest-version-when-its-not-easy-using-python/</link><pubDate>Sun, 15 Sep 2024 20:50:03 -0400</pubDate><guid>https://phillipsj.net/posts/finding-the-latest-version-when-its-not-easy-using-python/</guid><description>&lt;p&gt;Do you want to know a frustrating problem that I often face? I need to download some software as part of a pipeline that doesn&amp;rsquo;t have an easy way to download the latest version. This is often a challenging endeavor as many vendors don&amp;rsquo;t provide the latest tag to reference. I could probably have achieved this similarly to how it was done with this snippet of bash.&lt;/p&gt;
&lt;script
 src="https://gist.github.com/steinwaywhw/a4cd19cda655b8249d908261a62687f8.js"&gt;
&lt;/script&gt;
&lt;noscript&gt;
 &lt;p&gt;
 &lt;a href="https://gist.github.com/steinwaywhw/a4cd19cda655b8249d908261a62687f8"&gt;View this gist on GitHub&lt;/a&gt;
 &lt;/p&gt;</description></item><item><title>Thoughts on Devops and Platform Engineering</title><link>https://phillipsj.net/posts/thoughts-on-devops-and-platform-engineering/</link><pubDate>Sat, 07 Sep 2024 20:51:15 -0400</pubDate><guid>https://phillipsj.net/posts/thoughts-on-devops-and-platform-engineering/</guid><description>&lt;p&gt;I read a &lt;a href="https://www.linkedin.com/posts/bryan-finster_platform-engineering-is-dead-hear-me-activity-7235320270813609984-Nizw?utm_source=share&amp;amp;utm_medium=member_desktop"&gt;LinkedIn Post&lt;/a&gt; that got me thinking about solidifying my thoughts on the topic. I was excited about platform engineering for a short period, then I just wasn’t. Let me break this down as this also applies to a lot of DevOps processes. This is going to be a long post, so I will just provide a TLDR, but I think it deserves a full read.&lt;/p&gt;
&lt;h3 id="tldr"&gt;TLDR&lt;/h3&gt;
&lt;p&gt;I feel platform engineering is an unnecessary abstraction that is often brittle and stifles collaboration instead of fostering it. We have no shortage of tools, those tools just may lack easy onboarding or need bolstering to improve the experience of all users. We need composition, not inheritance. We need to have the Unix Philosophy.&lt;/p&gt;</description></item><item><title>Custom Tools: Assists</title><link>https://phillipsj.net/posts/custom-tools-assists/</link><pubDate>Wed, 04 Sep 2024 17:15:00 -0400</pubDate><guid>https://phillipsj.net/posts/custom-tools-assists/</guid><description>&lt;p&gt;I said in a &lt;a href="https://www.phillipsj.net/posts/cookiecutter-terraform/"&gt;previous post&lt;/a&gt; that I was going to be working on streamlining a lot of my personal processes and ways that I do things. One of the ways that I&amp;rsquo;m going to be achieving this is my working on my own custom CLI tool that packages of lots of the things that I find myself doing on a regular basis. With that said, I would like to introduce you all to &lt;a href="https://github.com/phillipsj/assists"&gt;Assists&lt;/a&gt;. It is a Python-based CLI
tool that I will be bundling up shortcuts and workflow items that I can share with everyone. It is currently published on &lt;a href="https://pypi.org/project/assists/"&gt;PyPI&lt;/a&gt; and my vision for how it will be consumed is using &lt;a href="https://github.com/pypa/pipx"&gt;pipx&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Optional Properties in Terraform</title><link>https://phillipsj.net/posts/optional-properties-in-terraform/</link><pubDate>Wed, 28 Aug 2024 18:29:51 -0400</pubDate><guid>https://phillipsj.net/posts/optional-properties-in-terraform/</guid><description>&lt;p&gt;I stumbled across an interesting issue this week, and I thought I would share. I needed to retrofit additional capability into a module without causing any changes. The Terraform would pass a map to the module and loop over it in a for each on a resource. There was a property that I wanted to see a value for only if that property existed in the object. The second item was to then use another map inside the object to only create a set of dynamic blocks if it existed. It was a fun little issue. I also learned how to use &lt;a href="https://developer.hashicorp.com/terraform/language/functions/try"&gt;&lt;code&gt;try&lt;/code&gt;&lt;/a&gt; which is a nice way to test if a value exists and if not set a default .Let me take you through it from a basic scenario to a more complex one.&lt;/p&gt;</description></item><item><title>Cookiecutter Terraform</title><link>https://phillipsj.net/posts/cookiecutter-terraform/</link><pubDate>Fri, 23 Aug 2024 21:25:09 -0400</pubDate><guid>https://phillipsj.net/posts/cookiecutter-terraform/</guid><description>&lt;p&gt;I have been wanting a more streamlined way to create my preferred style of creating a &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt; project.
My preferred style is very close to what is documented in the &lt;a href="https://developer.hashicorp.com/terraform/language/style#file-names"&gt;official docs&lt;/a&gt; with a few modifications around how environments and
backends are handled. I like to put as much configuration in source control and var files as possible. I strictly pass secrets
using environment variables. I’ve attempted to do this several times in the past, and I’ve finally just used a solution that
I’ve been considering for a while. It&amp;rsquo;s time to get it done, so I can start using it to speed up day-to-day tasks.&lt;/p&gt;</description></item><item><title>New Relic SQL Server Monitoring With gMSA</title><link>https://phillipsj.net/posts/new-relic-sql-server-monitoring-with-gmsa/</link><pubDate>Mon, 17 Jun 2024 20:13:05 -0400</pubDate><guid>https://phillipsj.net/posts/new-relic-sql-server-monitoring-with-gmsa/</guid><description>&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/windows-server/security/group-managed-service-accounts/group-managed-service-accounts-overview"&gt;Group managed service accounts&lt;/a&gt;,
called gMSA, are a great way to allow automated processes to access resources using a domain account without worry about
rotating passwords. One big issue with gMSA is that some software doesn&amp;rsquo;t work using it. I need to set the New Relic SQL
Server plugin to monitor SQL Server using a gMSA, which took a little digging to work out how to make that happen. The
existing documentation can be
found &lt;a href="https://docs.newrelic.com/docs/infrastructure/host-integrations/host-integrations-list/microsoft-sql/microsoft-sql-server-integration/"&gt;here&lt;/a&gt;.
That document covers using a domain account, a traditional domain account, not a gMSA. There are a few undocumented
tweaks needed to make this work. Let me walk you through it. Follow the documentation above until you configure
the &lt;code&gt;mssql-config.yml&lt;/code&gt; file. Once you are at that point, you can pick up here.&lt;/p&gt;</description></item><item><title>Adding a Certificate to the Java Keystore in a Container</title><link>https://phillipsj.net/posts/adding-a-certificate-to-the-java-keystore-in-a-container/</link><pubDate>Wed, 05 Jun 2024 20:25:00 -0400</pubDate><guid>https://phillipsj.net/posts/adding-a-certificate-to-the-java-keystore-in-a-container/</guid><description>&lt;p&gt;This was a fun little bit of knowledge to learn, as I haven&amp;rsquo;t worked with Java very much. I didn&amp;rsquo;t have a certificate
available that was required to be available to trust the endpoint that was being called. Normally, I would add
the certificate to the host, but it seems Java requires it to be added to the keystore. I also didn&amp;rsquo;t have the
certificate handy, so I needed to download the public version to add. After fully understanding the problem and a
little searching on the web, I found enough of the different pieces to get a solution.&lt;/p&gt;</description></item><item><title>Moving Data Stored in AWS S3</title><link>https://phillipsj.net/posts/moving-data-stored-in-aws-s3/</link><pubDate>Sun, 28 Jan 2024 12:49:18 -0500</pubDate><guid>https://phillipsj.net/posts/moving-data-stored-in-aws-s3/</guid><description>&lt;p&gt;If you have known me or have been following this blog for a while, you know that I&amp;rsquo;ve traditionally been much more Azure-focused.
While I have been more focused on Azure, that doesn&amp;rsquo;t mean that I don&amp;rsquo;t know or use other clouds. This may be an unpopular
opinion, but I feel that at the end of the day, all clouds are the same. They may have different names for things, but the majority
of the concepts are the same and are applicable. Enough of this, let&amp;rsquo;s get into discussing moving data around in S3.&lt;/p&gt;</description></item><item><title>Waiting for an OpenSearch Snapshot</title><link>https://phillipsj.net/posts/waiting-for-an-opensearch-snapshot/</link><pubDate>Sat, 27 Jan 2024 12:22:02 -0500</pubDate><guid>https://phillipsj.net/posts/waiting-for-an-opensearch-snapshot/</guid><description>&lt;p&gt;I ran into an interesting challenge while doing some automation tasks. Taking manual snapshots of &lt;a href="https://opensearch.org/"&gt;OpenSearch&lt;/a&gt;
is an interesting challenge that I just didn&amp;rsquo;t expect. Everything isn&amp;rsquo;t very clear and I learned a lot figuring this out. Given
that it was more challenging than expected I thought I would create a post to share what I discovered for future reference
for myself and everyone else that will come across this post.&lt;/p&gt;</description></item><item><title>Podcasts Now Listed</title><link>https://phillipsj.net/posts/podcasts-now-listed/</link><pubDate>Sun, 14 Jan 2024 15:22:11 -0500</pubDate><guid>https://phillipsj.net/posts/podcasts-now-listed/</guid><description>&lt;p&gt;I was asked if I had a list of all my podcasts appearences available. I have published a page on my blog &lt;a href="https://www.phillipsj.net/podcasts/"&gt;here&lt;/a&gt; if you are interested.&lt;/p&gt;
&lt;p&gt;Thanks,&lt;/p&gt;
&lt;p&gt;Jamie&lt;/p&gt;</description></item><item><title>Review: Pearl Izumi X-Alp Launch Flat</title><link>https://phillipsj.net/posts/review-pearl-izumi-x-alp-launch-flat/</link><pubDate>Thu, 04 Jan 2024 18:17:30 -0500</pubDate><guid>https://phillipsj.net/posts/review-pearl-izumi-x-alp-launch-flat/</guid><description>&lt;p&gt;I have kept this blog focused on tech for as long as I have had it. Like everyone else, I have hobbies outside of tech and often I&amp;rsquo;m looking for reviews on products that I can&amp;rsquo;t seem to find. I decided that I would write reviews of these products and post them myself to help others. Now that the lead-in is done, let&amp;rsquo;s get down to the review.&lt;/p&gt;
&lt;p&gt;I have been a long-time &lt;a href="https://www.adidas.com/us/five_ten-mountain_biking-shoes"&gt;Five Ten&lt;/a&gt; user way before the Adidas purchase. I have mainly used their Impact shoes. After many years what finally destroyed the first pair was that the soles started following off. I started using a new pair that I had and the same thing started happening within a couple of months. The grip on those shoes is fantastic, they just don&amp;rsquo;t seem to be holding up like I would expect. I decided that I would look at other flat-pedal shoes. There are a lot on the market such as &lt;a href="https://www.crankbrothers.com/collections/stamp-shoes"&gt;CrankBrothers Stamp&lt;/a&gt;,
&lt;a href="https://www.specialized.com/us/en/2fo-roost-flat--mountain-bike-shoes/p/187390"&gt;Specialized 2FO&lt;/a&gt;, &lt;a href="https://leatt.com/us/shop/mtb/sale/shoes?types_shoes_sole_type_in=Flat"&gt;Leatt&lt;/a&gt;,
&lt;a href="https://rideconcepts.com/collections/mens-shoes?filter.p.m.my_fields.pedal_type=Flat"&gt;Ride Concepts&lt;/a&gt;, &lt;a href="https://www.giro.com/p/latch-downhill-shoes/350060001200000001.html"&gt;Giro Latch&lt;/a&gt;,
&lt;a href="https://ride.shimano.com/collections/mountain?gclid=Cj0KCQiAj_CrBhD-ARIsAIiMxT__tHyNOsyfoa2HxG71FnrWLgYFPfr_530BdZWKd9wUkicRVLaVCN0aAjxLEALw_wcB&amp;amp;tw_campaign=19256298158&amp;amp;filter.p.m.custom.prd_cleat_type=FLAT"&gt;Shimano&lt;/a&gt;, and &lt;a href="https://www.pearlizumi.com/collections/mens-shoes#/filter:tags_sub_discipline:MTB"&gt;Pearl Izumi&lt;/a&gt; to name a few. Many of these don&amp;rsquo;t have good reviews or recent reviews, couple that with the fact that most local shops don&amp;rsquo;t carry many models, it&amp;rsquo;s hard to just order and hope they work out.&lt;/p&gt;</description></item><item><title>Learning and Growing in DevOps</title><link>https://phillipsj.net/posts/learning-and-growing-in-devops/</link><pubDate>Fri, 24 Nov 2023 14:16:06 -0500</pubDate><guid>https://phillipsj.net/posts/learning-and-growing-in-devops/</guid><description>&lt;p&gt;I have been seeing a lot of posts recently on &lt;a href="https://www.linkedin.com"&gt;LinkedIn&lt;/a&gt; lately titled something like &amp;ldquo;Skills needed for being a DevOps Engineer&amp;rdquo; or &amp;ldquo;How to become a DevOps expert&amp;rdquo;. Instead of responding to these posts, I decided I would just write a blog post to share my thoughts so I can reference it in the future. Let me start by saying that tools are not the most important thing to learn in DevOps, the most important thing to learn are concepts and the spirit. Patrick Debois posted &lt;a href="https://www.linkedin.com/posts/patrickdebois_my-current-definition-of-devops-everything-activity-6755909565658746880-odKR/"&gt;this&lt;/a&gt; a few years back with his current definition.&lt;/p&gt;</description></item><item><title>Odd Issue Using BytesIO With Boto3</title><link>https://phillipsj.net/posts/odd-issue-using-bytesio-with-boto3/</link><pubDate>Wed, 27 Sep 2023 20:16:51 -0400</pubDate><guid>https://phillipsj.net/posts/odd-issue-using-bytesio-with-boto3/</guid><description>&lt;p&gt;I&amp;rsquo;ve been trying to use more Python lately and I ran across an odd issue that I had to solve. I don&amp;rsquo;t know if it&amp;rsquo;s something that I&amp;rsquo;m doing incorrectly, a bug, or just a quirk.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hey this is Jamie from the future. I wasn&amp;rsquo;t doing it correctly. Anytime you want to read an IO
stream object in Python it&amp;rsquo;s always best practice to call seek and set it to the beginning or
just use the getvalue function.&lt;/p&gt;</description></item><item><title>DIY Azure PIM With Kubernetes and the Azure Operator</title><link>https://phillipsj.net/posts/diy-azure-pim-with-kubernetes-and-the-azure-operator/</link><pubDate>Wed, 20 Sep 2023 22:18:33 -0400</pubDate><guid>https://phillipsj.net/posts/diy-azure-pim-with-kubernetes-and-the-azure-operator/</guid><description>&lt;p&gt;I have been wanting to learn the &lt;a href="https://azure.github.io/azure-service-operator/"&gt;Azure Operator&lt;/a&gt; for about a year. I often find it difficult to spend the time to learn something unless I have a real-world problem to solve, or I just get curious. It seems that the time has finally come for me to dive into it. The problem to be solved has been something that our team has been discussing for some time. A self-service opportunity for getting temporary permissions, not just in one cloud but potentially in any cloud and Kubernetes. There is an &lt;a href="https://learn.microsoft.com/en-us/azure/active-directory/privileged-identity-management/pim-configure"&gt;Azure PIM&lt;/a&gt; for Azure that requires a specific licensing level, and it only works for Azure. There are similar solutions out there that can provide this type of functionality, however, as with all solutions, they come with their intricacies. We have been slowly moving to a more Kubernetes-focused workflow using tools like &lt;a href="https://argo-cd.readthedocs.io/en/stable/"&gt;ArgoCD&lt;/a&gt;, &lt;a href="https://argoproj.github.io/argo-workflows/"&gt;ArgoWorkflows&lt;/a&gt;, and &lt;a href="https://argoproj.github.io/rollouts/"&gt;ArgoRollouts&lt;/a&gt;. We also invest in many CNCF projects, as I&amp;rsquo;m sure many places do. With that, I thought that having a solution that was Kubernetes-based would be an interesting idea, so I decided to see if I could build a quick prototype using the Azure Operator and &lt;a href="https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/"&gt;CronJob&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Using Terraform Outputs in Powershell</title><link>https://phillipsj.net/posts/using-terraform-outputs-in-powershell/</link><pubDate>Mon, 17 Jul 2023 22:44:12 -0400</pubDate><guid>https://phillipsj.net/posts/using-terraform-outputs-in-powershell/</guid><description>&lt;p&gt;I have been using Terraform for more than five years, and in that time, I&amp;rsquo;ve never needed to consume outputs from executed Terraform until recently. It was a strange realization, and I found myself deciding the best way to do it. You may have noticed that I have been using &lt;a href="https://www.phillipsj.net/posts/terraform-as-a-dotnet-cli-tool/"&gt;Terraform with .NET&lt;/a&gt;, and I&amp;rsquo;ve also been using a project called &lt;a href="https://github.com/nightroman/Invoke-Build"&gt;Invoke-Build&lt;/a&gt; for my build scripting. I have found Invoke-Build and .NET tools an excellent combination for creating builds. It gives me that feeling of using Cake without using anything specifically bespoke. The scenario that led to the need was doing a deployment in Invoke-Build using the &lt;a href="https://learn.microsoft.com/en-us/powershell/azure/new-azureps-module-az?view=azps-10.1.0"&gt;Azure PowerShell&lt;/a&gt; modules and needing the name of the resource group and app service that was auto-generated in the Terraform code. Oddly enough, most of the time, naming for me has been something static passed in, not something auto-generated with a high degree of entropy. I discovered after some light research that the &lt;code&gt;terraform output&lt;/code&gt; command can return the current output of the Terraform run as JSON. I combined that with the &lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertfrom-json?view=powershell-7.3"&gt;&lt;code&gt;Convert-FromJson&lt;/code&gt;&lt;/a&gt; commandlet will return me the output as a PowerShell object. A PowerShell object makes it convenient for use in my deploy task within my build script. Let&amp;rsquo;s create an example to see it all together.&lt;/p&gt;</description></item><item><title>Azure DevOps, PATs, Git, and Terraform Modules</title><link>https://phillipsj.net/posts/ado-pats-git-and-terraform-modules/</link><pubDate>Sun, 09 Jul 2023 14:30:51 -0400</pubDate><guid>https://phillipsj.net/posts/ado-pats-git-and-terraform-modules/</guid><description>&lt;p&gt;I learned a new trick this past week. The context I learned this in is how to access Terraform modules stored in a &lt;a href="https://developer.hashicorp.com/terraform/language/modules/sources#generic-git-repository"&gt;git repository&lt;/a&gt;, specifically Azure DevOps, without needing to use SSH and an SSH key. The SSH approach works fine, but I struggle with enabling that approach in a CI/CD system. Having to store that SSH key and ensure that it&amp;rsquo;s correctly in each environment is often cumbersome compared to potential other methods. That&amp;rsquo;s where this new trick comes into play. After a quick web search, I found this &lt;a href="https://wahlnetwork.com/2020/08/11/using-private-git-repositories-as-terraform-modules/"&gt;blog post&lt;/a&gt;. Git has the ability in the config file to allow altering any URL. One of these capabilities is &lt;a href="https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf"&gt;insteadOf&lt;/a&gt;, which can replace the base URL with a different URL. That means you inject your personal access token, PAT, into the URL in your config while leaving the URL referenced in source control without it. There is also the ability to add &lt;a href="https://git-scm.com/docs/git-config#Documentation/git-config.txt-httpextraHeader"&gt;headers&lt;/a&gt; to any HTTP request needed. Substituting my base URL to include a PAT solved my issue. Let&amp;rsquo;s check out an example.&lt;/p&gt;</description></item><item><title>Terraform as a .NET CLI Tool</title><link>https://phillipsj.net/posts/terraform-as-a-dotnet-cli-tool/</link><pubDate>Fri, 30 Jun 2023 22:30:43 -0400</pubDate><guid>https://phillipsj.net/posts/terraform-as-a-dotnet-cli-tool/</guid><description>&lt;p&gt;I have been working on a project in my limited free time the last couple of weeks called &lt;a href="https://github.com/phillipsj/dotnet-terraform"&gt;dotnet-terraform&lt;/a&gt;. The project packages &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt; as a .NET CLI tool that will be available for Windows x64, Linux x64, Linux arm64, and MacOS arm64. I&amp;rsquo;m only supporting LTS versions of.NET and the platforms listed previously unless someone requests to support additional versions or platforms.&lt;/p&gt;
&lt;h2 id="why"&gt;Why&lt;/h2&gt;
&lt;p&gt;I created this project to solve two problems I was experiencing, and I hope this solves the same issues for you. The first issue is needing a simple and effective way to install Terraform on a target environment. I don&amp;rsquo;t like my logic tied up in platform-specific YAML steps since I can&amp;rsquo;t often run that locally. By wrapping Terraform as a .NET CLI tool, I can ensure that I can easily install Terraform locally. The second benefit is ensuring I always have the same version of Terraform that I used to write the infrastructure locally and on the build server. Installing Terraform as a &lt;a href="https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-tool-install#local-tools"&gt;local tool&lt;/a&gt; ensures I always have the correct version that a specific project requires.&lt;/p&gt;</description></item><item><title>Azure App Service Certificate and Terraform</title><link>https://phillipsj.net/posts/azure-app-service-certificate-and-terraform/</link><pubDate>Thu, 15 Jun 2023 21:24:53 -0400</pubDate><guid>https://phillipsj.net/posts/azure-app-service-certificate-and-terraform/</guid><description>&lt;p&gt;I recently ran across an interesting issue with using Terraform to load an existing SSL certificate located in a key vault not in the same subscription or resource group to an Azure App Service. Here is an example of what was being used.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-HCL" data-lang="HCL"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;resource&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;azurerm_app_service_certificate&amp;#34; &amp;#34;main&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; name&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;test-eus-cert&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; resource_group_name&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;azurerm_resource_group&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;main&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; location&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;azurerm_resource_group&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;main&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;location&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; key_vault_secret_id&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;&amp;lt;key vault secret id&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here is the error I was receiving.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Unable to determine the Resource ID for the Key Vault at URL...
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;p&gt;After some digging, I discovered this &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/issues/10824"&gt;GitHub issue&lt;/a&gt;. The issue is that how the &lt;a href="https://registry.terraform.io/providers/hashicorp/azurerm/3.61.0"&gt;AzureRM provider&lt;/a&gt; for Terraform works, it doesn&amp;rsquo;t pass the key vault ID along with the secret. This causes it to search in the resource group and subscription where the app service is located which isn&amp;rsquo;t the location of the key vault that I want to use. This could be fixed in the AzureRM provider as suggested in the issue it just hasn&amp;rsquo;t yet. The common solution to solve the issue is to load the certificate manually and then the Terraform can run and resolve everything once it has been configured. That isn&amp;rsquo;t great for automation as it requires that manual step to happen. I decided that I could work around this issue using just Terraform. Let&amp;rsquo;s see what I came up with.&lt;/p&gt;</description></item><item><title>End of the Silverblue Challenge</title><link>https://phillipsj.net/posts/end-of-the-silverblue-challenge/</link><pubDate>Sun, 11 Jun 2023 12:02:29 -0400</pubDate><guid>https://phillipsj.net/posts/end-of-the-silverblue-challenge/</guid><description>&lt;p&gt;I ended the two-month challenge a couple of weeks ago. I successfully used it for two months and I don&amp;rsquo;t have any complaints. Installing flatpaks for desktop applications was a breeze and leveraging toolboxes for working with CLI applications didn&amp;rsquo;t pose any significant issues. I guess the big question is, will I be sticking with it? The short answer is no, I won&amp;rsquo;t be. I like the concept of an immutable OS and I think that I want to see what some of these other projects are bringing to the table. I&amp;rsquo;m pretty excited about checking out &lt;a href="https://vanillaos.org/"&gt;VanillaOS&lt;/a&gt; and &lt;a href="https://microos.opensuse.org"&gt;openSUSE MicroOS Desktops&lt;/a&gt;. After having given Gnome another good attempt, I keep finding myself wanting KDE features and applications. There are just applications in the KDE space that I really enjoy and often they don&amp;rsquo;t feel the same on a Gnome desktop. With that said, I&amp;rsquo;m right now running on KDE Neon until I find a good KDE distro that I enjoy using.&lt;/p&gt;</description></item><item><title>Initial Silverblue Device and Blogging Setup</title><link>https://phillipsj.net/posts/initial-silverblue-device-and-blogging-setup/</link><pubDate>Mon, 03 Apr 2023 20:59:17 -0400</pubDate><guid>https://phillipsj.net/posts/initial-silverblue-device-and-blogging-setup/</guid><description>&lt;p&gt;It&amp;rsquo;s April and I&amp;rsquo;ve started my &lt;a href="https://silverblue.fedoraproject.org/"&gt;Silverblue&lt;/a&gt; journey. I picked a laptop to start as that allows me to chill on the couch and think about how I want to handle the setup. I will be using &lt;a href="https://www.ansible.com/"&gt;Ansible&lt;/a&gt; to do my installation of &lt;a href="https://flatpak.org/"&gt;Flatpaks&lt;/a&gt; and my &lt;a href="https://docs.fedoraproject.org/en-US/fedora-silverblue/toolbox/"&gt;Toolbox&lt;/a&gt; setups.&lt;/p&gt;
&lt;p&gt;The laptop that I&amp;rsquo;m using is an Asus Vivobook with a 12th Gen Intel i3-1220p and 12GB of RAM. Silverblue was installed flawlessly and has been working as expected. I haven&amp;rsquo;t noticed any strange behavior or negatives with the newer hardware. After getting Silverblue installed, I wanted to write this post and I had to set up my first toolbox. I&amp;rsquo;m going to use the default toolbox for my blogging activities. Let me take you through the setup.&lt;/p&gt;</description></item><item><title>Fedora Silverblue Two Month Challenge</title><link>https://phillipsj.net/posts/fedora-silverblue-two-month-challenge/</link><pubDate>Wed, 22 Mar 2023 21:25:17 -0400</pubDate><guid>https://phillipsj.net/posts/fedora-silverblue-two-month-challenge/</guid><description>&lt;p&gt;Starting in April I&amp;rsquo;m going to start a &lt;a href="https://silverblue.fedoraproject.org/"&gt;Fedora Silverblue&lt;/a&gt; challenge for two months. I&amp;rsquo;m going to do blogging, DevOps work, and .NET development using it. I&amp;rsquo;m going to have to put &lt;a href="https://flatpak.org/"&gt;Flatpak&lt;/a&gt; and &lt;a href="https://docs.fedoraproject.org/en-US/fedora-silverblue/toolbox/"&gt;Toolbox&lt;/a&gt; through the paces to see if I can make it work for me. As a daily driver doing normal tasks, I&amp;rsquo;m positive Silverblue is going to work great. It&amp;rsquo;s the other items that I&amp;rsquo;m not fully convinced will work. The plan is to blog two to three times a week throughout the challenge to share my findings and what I learn. I encourage anyone reading this to give it a too.&lt;/p&gt;</description></item><item><title>Query Loggly Events With .NET</title><link>https://phillipsj.net/posts/query-loggly-events-with-dotnet/</link><pubDate>Sun, 05 Mar 2023 21:30:18 -0500</pubDate><guid>https://phillipsj.net/posts/query-loggly-events-with-dotnet/</guid><description>&lt;p&gt;I haven&amp;rsquo;t done a lot of .NET development lately and I found this a fun little program to create. I needed to be able to query &lt;a href="https://www.loggly.com"&gt;Loggly&lt;/a&gt; to get a list of events. Loggly returns a max number of results, if your results are larger than that max then your results become paginated. Loggly paginates using a &lt;a href="https://jsonapi.org/"&gt;JSON API&lt;/a&gt; inspired next link. After a little research as to what the latest recommended approach is, I discovered &lt;a href="https://flurl.dev/"&gt;Flurl&lt;/a&gt;. Flurl is pretty cool and made this fairly easy to construct the URL cleverly. I also discovered &lt;a href="https://github.com/SaahilClaypool/PollyFlurl"&gt;PollyFlurl&lt;/a&gt; which provides a nice API around using Polly with Flurl. Okay, enough with the background info, let&amp;rsquo;s get into it.&lt;/p&gt;</description></item><item><title>SSH Key-Based Auth for Windows</title><link>https://phillipsj.net/posts/ssh-key-based-auth-for-windows/</link><pubDate>Mon, 30 Jan 2023 21:12:48 -0500</pubDate><guid>https://phillipsj.net/posts/ssh-key-based-auth-for-windows/</guid><description>&lt;p&gt;We often don&amp;rsquo;t think about setting up key-based authentication using SSH for Windows. It often comes in very handy for automation tasks and other headless use cases. After digging around, I discovered that it isn&amp;rsquo;t as straightforward as one would think. There are a couple of tweaks that need to be made outside of the documentation provided &lt;a href="https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement"&gt;here&lt;/a&gt;. One of the tweaks is to ensure that you enable public key authentication in the SSH config, the other one is that the administrators authorized keys is commented out as described &lt;a href="https://stackoverflow.com/a/50502015"&gt;here&lt;/a&gt; in step five.&lt;/p&gt;</description></item><item><title>Terraforming a Terraform Project</title><link>https://phillipsj.net/posts/terraforming-a-terraform-project/</link><pubDate>Thu, 01 Sep 2022 21:26:08 -0400</pubDate><guid>https://phillipsj.net/posts/terraforming-a-terraform-project/</guid><description>&lt;p&gt;I am back with another fun use of Terraform. I have this silly idea to bootstrap a Terraform project using Terraform. It&amp;rsquo;s a pretty interesting idea and these thought exercises push your understanding of what is possible. Let&amp;rsquo;s get into it.&lt;/p&gt;
&lt;h2 id="creating-the-project"&gt;Creating the project&lt;/h2&gt;
&lt;p&gt;I will be using the &lt;a href="https://registry.terraform.io/providers/hashicorp/local/latest/docs"&gt;local&lt;/a&gt; provider and HashiCorp&amp;rsquo;s recommended &lt;a href="https://www.terraform.io/language/modules/develop/structure"&gt;project structure&lt;/a&gt;. The first step is to add our provider.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-HCL" data-lang="HCL"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;terraform&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;required_providers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; local&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; source&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;hashicorp/local&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; version&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;2.2.3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;provider&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;local&amp;#34;&lt;/span&gt; {&lt;span style="color:#8f5902;font-style:italic"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8f5902;font-style:italic"&gt; # Configuration options
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we can create a variable that will define the path we want to use for our project.&lt;/p&gt;</description></item><item><title>Validating Variables in Terraform</title><link>https://phillipsj.net/posts/validating-variables-in-terraform/</link><pubDate>Tue, 30 Aug 2022 21:01:46 -0400</pubDate><guid>https://phillipsj.net/posts/validating-variables-in-terraform/</guid><description>&lt;p&gt;There are always new features being added to Terraform and a more recent set of features is the ability to put &lt;a href="https://www.terraform.io/language/expressions/custom-conditions#input-variable-validation"&gt;validations&lt;/a&gt; on your variables. I am going to add validation to my Terraform weather application called &lt;a href="https://www.phillipsj.net/posts/terra-weather-a-weather-app-using-terraform/"&gt;Terra Weather&lt;/a&gt;. I am going to put some constraints on the &lt;code&gt;zipcode&lt;/code&gt; variable to ensure that it is only a number and that it&amp;rsquo;s only five digits. This limits it to just the USA right now. Let&amp;rsquo;s get into it.&lt;/p&gt;</description></item><item><title>Terra Weather: A Weather App Using Terraform</title><link>https://phillipsj.net/posts/terra-weather-a-weather-app-using-terraform/</link><pubDate>Tue, 23 Aug 2022 22:41:37 -0400</pubDate><guid>https://phillipsj.net/posts/terra-weather-a-weather-app-using-terraform/</guid><description>&lt;p&gt;I finally feel like creating some content again. It&amp;rsquo;s good to want to do fun things with tools that you like working with. I had this idea to see if I could be a version of my weather app like I did in &lt;a href="https://www.phillipsj.net/posts/rusty-weather-my-first-rust-app/"&gt;Rust&lt;/a&gt; and &lt;a href="https://www.phillipsj.net/posts/go-weather-my-first-go-app/"&gt;Go&lt;/a&gt; using Terraform. I used the &lt;a href="https://registry.terraform.io/providers/hashicorp/http/latest/docs/data-sources/http"&gt;HTTP Provider&lt;/a&gt; along with &lt;a href="https://www.terraform.io/language/expressions/custom-conditions#preconditions-and-postconditions"&gt;post conditions&lt;/a&gt; to achieve it. I then used the &lt;a href="https://openweathermap.org/api"&gt;OpenWeatherMap API&lt;/a&gt; to get the weather. You will need to set up a straightforward API key. Let&amp;rsquo;s get into the Terraform.&lt;/p&gt;</description></item><item><title>Kubernetes, Windows, and Air-gapped Environments</title><link>https://phillipsj.net/posts/kubernetes-windows-and-air-gapped-environments/</link><pubDate>Thu, 18 Aug 2022 02:37:47 +0000</pubDate><guid>https://phillipsj.net/posts/kubernetes-windows-and-air-gapped-environments/</guid><description>&lt;p&gt;Air-gapped environments are always challenging to build solutions. Ensuring that you have all the dependencies documented and available is challenging enough for a simple application. More complex solutions like a container management platform for Kubernetes increases that challenge by 20-fold.&lt;/p&gt;
&lt;p&gt;You have to ensure that you have an OCI registry available, a certificate authority, and a list of images that both the platform and any applications are going to require. That gets even more complex if you have multiple architectures and/or multiple operating systems. That can easily grow your storage requirements and loading time exponentially. This challenge is further increased by having to get all the images on a disk to then get them inside the air-gapped environment. I am going to focus on what needs to be considered when preparing to support Windows in this scenario.&lt;/p&gt;</description></item><item><title>Sway Transforms the Pinebook Pro</title><link>https://phillipsj.net/posts/sway-transforms-the-pinebook-pro/</link><pubDate>Fri, 05 Aug 2022 20:30:38 -0400</pubDate><guid>https://phillipsj.net/posts/sway-transforms-the-pinebook-pro/</guid><description>&lt;p&gt;It has been a few months since I installed &lt;a href="https://manjaro.org/download/"&gt;Manjaro ARM Sway Edition&lt;/a&gt; on my &lt;a href="https://www.pine64.org/pinebook-pro/"&gt;Pinebook Pro&lt;/a&gt;. It has taken since then to really think about the experince. I don&amp;rsquo;t use my Pinebook Pro often and oddly enough, I am able to pick it up and remember how to use &lt;a href="https://swaywm.org/"&gt;Sway&lt;/a&gt;. I find Sway intuitive which was my largest concern trying to use it and that just isn&amp;rsquo;t the case. I have been able to consistently remmber what to do and how to use it. So I wouldn&amp;rsquo;t let the tiling aspect of Sway or i3 deter you from trying to use it.&lt;/p&gt;</description></item><item><title>I'm Enjoying .NET Once Again</title><link>https://phillipsj.net/posts/i-am-enjoying-dotnet-once-again/</link><pubDate>Tue, 28 Jun 2022 17:44:52 -0400</pubDate><guid>https://phillipsj.net/posts/i-am-enjoying-dotnet-once-again/</guid><description>&lt;p&gt;I recently started a &lt;a href="https://hackweek.opensuse.org/"&gt;SUSE Hack week&lt;/a&gt; project in .NET with a co-worker this week. This is the first serious .NET development that I&amp;rsquo;ve done in over a year and a half. I have been doing primarily Go development during that time which I found refreshing. Now with a little time away and doing this new project I realize that I enjoy using it once again. The language and the tooling have changed a lot in the last couple of years and lots of new features have been introduced that I am still getting used to. Namespacing, global using statements, nullable compiler flag, etc. are just a short list of the features that have been added. Overall, I like the changes and it has made it very refreshing.&lt;/p&gt;</description></item><item><title>Deserializing JSON or YAML With Rust</title><link>https://phillipsj.net/posts/deserializing-json-or-yaml-with-rust/</link><pubDate>Sun, 01 May 2022 21:05:52 -0400</pubDate><guid>https://phillipsj.net/posts/deserializing-json-or-yaml-with-rust/</guid><description>&lt;p&gt;It&amp;rsquo;s been almost a year since I have written any &lt;a href="https://www.rust-lang.org/"&gt;Rust&lt;/a&gt;. I am a little rusty, to say the least, and things have changed a little. I will say that every time I come back to a functional style of programming after being away it feels more natural. I wanted to know how to deserialize a JSON or YAML file. In Go, it would be pretty easy to do it with struct tags and an if check. I stumbled across the &lt;a href="https://crates.io/crates/serde"&gt;serde&lt;/a&gt; crate which provided the features I wanted. That crate allows you to easily deserialize almost any format into a struct. I created a simple test JSON and YAML file to deserialize.&lt;/p&gt;</description></item><item><title>Yes, you can unit test Helm Charts</title><link>https://phillipsj.net/posts/yes-you-can-unit-test-helm-charts/</link><pubDate>Mon, 28 Mar 2022 22:13:49 -0400</pubDate><guid>https://phillipsj.net/posts/yes-you-can-unit-test-helm-charts/</guid><description>&lt;p&gt;I have found creating &lt;a href="https://helm.sh/"&gt;Helm&lt;/a&gt; charts a challenge as it&amp;rsquo;s difficult to test as a chart gets more complex. Linting, packaging, etc. all help ease the pain and need to be used as part of a robust continuous integration, CI, process for maintaining charts. I wanted something more and started researching if it&amp;rsquo;s possible to unit test a Helm chart. After a little searching, I found &lt;a href="https://terratest.gruntwork.io/"&gt;Terratest&lt;/a&gt;, by the great people over at &lt;a href="https://gruntwork.io/"&gt;Gruntwork&lt;/a&gt;, actually has a module for Helm. I have heard of Terratest when unit testing Terraform so I had experience with it already. Terratest offers two scenarios for testing charts. The first option is to test the template generation, I think of these as unit tests, and the second option is integration testing that deploys to an actual Kubernetes cluster. Let&amp;rsquo;s set up a chart that is more complex than the basic example that is in the &lt;a href="https://github.com/gruntwork-io/terratest/blob/master/test/helm_basic_example_integration_test.go"&gt;GitHub repository&lt;/a&gt; that will detect the version of Kubernetes and install a specific version of the Nginx image. We will create some template tests and then create some integration tests using &lt;a href="https://kind.sigs.k8s.io/"&gt;kind&lt;/a&gt;. I will explain what is happening in the chart as we go. Let&amp;rsquo;s get started. The GitHub repository can be found &lt;a href="https://github.com/phillipsj/unit-testing-helm-charts"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Random Thoughts on Dev Processes</title><link>https://phillipsj.net/posts/random-thoughts-on-dev-processes/</link><pubDate>Sun, 27 Mar 2022 12:35:18 -0400</pubDate><guid>https://phillipsj.net/posts/random-thoughts-on-dev-processes/</guid><description>&lt;p&gt;&lt;em&gt;This post contains affiliate links. If you use these links to buy something I may earn a commission.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I was sitting around thinking today about why I have some of the practices and beliefs that I have about the development processes. Often these practices and beliefs don&amp;rsquo;t appear shared among others and I am always curious how I have developed these over my career. Some of these practices and beliefs are a result of my experiences over my career, others are related to the books that I have read on the topic of software development over the years. A few books I keep finding myself going back and reading again. I often discover that these ideas are in these books and that I must have passively absorbed these. One of these books is &lt;a href="https://bookshop.org/a/80833/9780321601919"&gt;Continuous Delivery&lt;/a&gt;, which is a great read on techniques and practices that can prevent or mitigate many of the issues we constantly struggle within the industry. Having automated tests, continuous integration, automated builds, automated deployments, and structured approaches to all activities ease so many burdens. All the stress, all the long nights trying to release, all hours doing manual steps can be reduced by many of the practices found in that book. Why do we struggle to accept or implement these practices? I can think fondly back on the times in my career when I worked on teams that embraced many of these and worked toward achieving as many of these as we can. We had fun, we had minimum stress, and we moved into a better way of working. That team, several years later, is leveraging many of the same systems we put in place to achieve the practices.&lt;/p&gt;</description></item><item><title>Hybrid Kubernetes Clusters Part 1</title><link>https://phillipsj.net/posts/hybrid-kubernetes-clusters-part-1/</link><pubDate>Tue, 22 Feb 2022 20:33:16 -0500</pubDate><guid>https://phillipsj.net/posts/hybrid-kubernetes-clusters-part-1/</guid><description>&lt;p&gt;There are tons of articles about all aspects of Kubernetes. The one area that I don&amp;rsquo;t feel gets enough coverage is all the considerations of the Kubernetes cluster that aren&amp;rsquo;t uniform in the cluster operating system or architecture. These clusters are what people have been calling &lt;code&gt;hybrid&lt;/code&gt; or &lt;code&gt;mixed workload&lt;/code&gt; clusters. I prefer the &lt;code&gt;hybrid&lt;/code&gt; designation. Let&amp;rsquo;s define a hybrid cluster.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hybrid Cluster&lt;/strong&gt;: A Kubernetes cluster that has nodes using multiple operating systems or architectures.&lt;/p&gt;</description></item><item><title>Setting Up Windows GMSA for Kubernetes</title><link>https://phillipsj.net/posts/setting-up-windows-gmsa-for-kubernetes/</link><pubDate>Sun, 13 Feb 2022 12:32:37 -0500</pubDate><guid>https://phillipsj.net/posts/setting-up-windows-gmsa-for-kubernetes/</guid><description>&lt;p&gt;Windows Active Directory provides a feature called &lt;a href="https://docs.microsoft.com/en-us/windows-server/security/group-managed-service-accounts/group-managed-service-accounts-overview"&gt;Group Managed Service Accounts&lt;/a&gt; which allows automatic password management for accounts that can be used by applications and other places where you don&amp;rsquo;t want to use a regular account. You can think of these like service principles in Azure or IAM roles in AWS. This setup can be tricky as it requires that you are using an Active Directory that supports GMSA and that you have it configured correctly. I highly recommend reading the &lt;a href="https://docs.microsoft.com/en-us/windows-server/security/group-managed-service-accounts/getting-started-with-group-managed-service-accounts"&gt;Getting Started with Group Managed Service Accounts&lt;/a&gt; page before proceeding. Actually, I would say read it a few times. Here is a high-level overview of what is required.&lt;/p&gt;</description></item><item><title>Using smtp4dev in Kubernetes for Email Testing</title><link>https://phillipsj.net/posts/using-smtp4dev-in-kubernetes-for-email-testing/</link><pubDate>Sun, 30 Jan 2022 12:59:07 -0500</pubDate><guid>https://phillipsj.net/posts/using-smtp4dev-in-kubernetes-for-email-testing/</guid><description>&lt;p&gt;Testing if your app is sending emails or notifications correctly is always challenging. I have witnessed and heard numerous stories over the years of accidents that mass email customers from a dev or a staging environment when doing testing. Now it&amp;rsquo;s easy to think that this can be avoided, everyone just wants to ensure that the actual SMTP code is working correctly due to its importance in any system. In the Windows and .NET space, I have been using the awesome &lt;a href="https://github.com/rnwood/smtp4dev"&gt;smtp4dev&lt;/a&gt; by &lt;a href="https://www.rnwood.co.uk"&gt;Rob Wood&lt;/a&gt; since it was originally released years ago. It allows you to run an SMTP server locally where you can send emails and then view those. The smtp4dev application was originally a Windows GUI app and then was moved to being a .NET Core application with a web UI. That migration allowed it to be used cross-platform on Linux, Windows, and Mac. It was also &lt;a href="https://github.com/rnwood/smtp4dev/wiki/Installation#how-to-run-smtp4dev-in-docker"&gt;containerized&lt;/a&gt;, so it can be run using Docker or even in Kubernetes.&lt;/p&gt;</description></item><item><title>How to Create a Sonobuoy Plugin</title><link>https://phillipsj.net/posts/how-to-create-a-sonobuoy-plugin/</link><pubDate>Thu, 27 Jan 2022 20:48:40 -0500</pubDate><guid>https://phillipsj.net/posts/how-to-create-a-sonobuoy-plugin/</guid><description>&lt;p&gt;Today we are going to learn how to create a &lt;a href="https://sonobuoy.io/docs/v0.56.0/plugins/"&gt;Sonobuoy plugin&lt;/a&gt;. Sonobuoy plugins are some metadata in the form of a YAML file that deploys a container that has the actual code that is responsible for executing the test or tests. Plugins come in two types, a daemonset or a job. We will be building a job plugin.&lt;/p&gt;
&lt;h2 id="description"&gt;Description&lt;/h2&gt;
&lt;p&gt;We will create a plugin that will deploy the &lt;a href="https://github.com/phillipsj/pstools"&gt;pstools&lt;/a&gt; container as a daemonset. This will ensure that it is deployed to every node in the cluster. This doesn&amp;rsquo;t seem like much a a test, except this is a mixed workload cluster running both Windows and Linux nodes. This will test that our container is compatible with all the nodes that we have in our cluster. I will be running my cluster using Rancher with a downstream cluster that is RKE2 v1.22.4 using Calico for CNI. My nodes will be openSUSE Leap 15.3 for the control plane, linux worker, and Windows 2019 for the other worker node. That&amp;rsquo;s it for the high level of what we are going to achieve.&lt;/p&gt;</description></item><item><title>Testing a Kubernetes Cluster with Sonobuoy</title><link>https://phillipsj.net/posts/testing-a-kubernetes-cluster-with-sonobuoy/</link><pubDate>Wed, 26 Jan 2022 20:23:44 -0500</pubDate><guid>https://phillipsj.net/posts/testing-a-kubernetes-cluster-with-sonobuoy/</guid><description>&lt;p&gt;If you are constantly building Kubernetes clusters as part of your job, you may want to consider bringing &lt;a href="https://sonobuoy.io"&gt;Sonobuoy&lt;/a&gt; into your workflow. It&amp;rsquo;s a good way to build out a standard suite of validation tests that can ensure that a cluster is configured in a standardized fashion. Sonobuoy has a concept called &lt;a href="https://sonobuoy.io/plugins/"&gt;plugins&lt;/a&gt;. They produce several that you can use to run things like upstream E2E tests, CIS Benchmarks, or RBAC auditing. In addition to these, you can also build your own custom plugins, which can use the language of your choice using the testing framework of your choice. Let&amp;rsquo;s find out what we can achieve using one of the included plugins and a custom plugin.&lt;/p&gt;</description></item><item><title>Proxmox Linux Templates</title><link>https://phillipsj.net/posts/proxmox-linux-templates/</link><pubDate>Thu, 20 Jan 2022 23:30:42 -0500</pubDate><guid>https://phillipsj.net/posts/proxmox-linux-templates/</guid><description>&lt;p&gt;Adding in virtualization to your workflows requires that you streamline steps as much as possible. Containers solved that for many types of work and there are still plenty of things that require dedicated VMs. As part of streamlining, creating templates for your VMs can make setup and any required bootstrapping easier than doing it from an ISO installation. Many Linux distros create cloud images that are small and provide a way to bootstrap that cloud image into a running VM efficiently. I have created a set of templates for several &lt;a href="https://www.opensuse.org"&gt;openSUSE&lt;/a&gt; flavors from Leap JeOS to MicroOS. The openSUSE JeOS images leverage the &lt;a href="https://github.com/openSUSE/jeos-firstboot"&gt;JeOS firstboot&lt;/a&gt; while the openSUSE &lt;a href="https://microos.opensuse.org"&gt;MicroOS&lt;/a&gt; flavors use &lt;a href="https://en.opensuse.org/Portal:MicroOS/Ignition"&gt;ignition&lt;/a&gt;. An item to note is that the OpenStack versions of the openSUSE images support &lt;a href="https://cloud-init.io"&gt;cloud-init&lt;/a&gt; which I have included just the Leap version to support if needed. Lastly, I also added an Ubuntu template that uses cloud-init. Here is the script that you can run on your Proxmox server to create these templates too.&lt;/p&gt;</description></item><item><title>openSUSE MicroOS, Ignition, and Proxmox</title><link>https://phillipsj.net/posts/opensuse-microos-ignition-and-proxmox/</link><pubDate>Sat, 15 Jan 2022 21:40:27 -0500</pubDate><guid>https://phillipsj.net/posts/opensuse-microos-ignition-and-proxmox/</guid><description>&lt;p&gt;I have been spending time to automate more of my workflows and I have turned my focus back to leveraging many of the &lt;a href="https://www.opensuse.org"&gt;openSUSE&lt;/a&gt; images along with &lt;a href="https://www.proxmox.com/en/proxmox-ve"&gt;Proxmox&lt;/a&gt;. After a little experimentation between the &lt;a href="https://en.opensuse.org/Portal:JeOS"&gt;JeOS&lt;/a&gt; and &lt;a href="https://microos.opensuse.org"&gt;MicroOS&lt;/a&gt; images, I have settled on the MicroOS images. They ship with the option to leverage &lt;a href="https://en.opensuse.org/Portal:MicroOS/Combustion"&gt;Combustion&lt;/a&gt; or &lt;a href="https://en.opensuse.org/Portal:MicroOS/Ignition"&gt;Ignition&lt;/a&gt; to bootstrap the images. After trying different techniques for a couple of days I just couldn&amp;rsquo;t get &lt;a href="https://cloud-init.io"&gt;cloud-init&lt;/a&gt; to function with Proxmox and the &lt;a href="https://www.openstack.org"&gt;OpenStack&lt;/a&gt; images produced by openSUSE. It would function just fine with other distros, or on other hyper-visors. Another advantage of working with MicroOS are the many advantages that it provides along with being immutable. I also started checking out the beta version of Leap MicroOS which is cool to see.&lt;/p&gt;</description></item><item><title>How to Use the Windows CSI Proxy and CSI SMB Driver for Kubernetes</title><link>https://phillipsj.net/posts/how-to-use-the-windows-csi-proxy-and-csi-smb-driver-for-kubernetes/</link><pubDate>Tue, 11 Jan 2022 21:05:26 -0500</pubDate><guid>https://phillipsj.net/posts/how-to-use-the-windows-csi-proxy-and-csi-smb-driver-for-kubernetes/</guid><description>&lt;p&gt;The Windows &lt;a href="https://github.com/kubernetes-csi/csi-proxy"&gt;CSI Proxy&lt;/a&gt; went GA in the last quarter of the 2021. The CSI Proxy provides a named pipe that can be mounted into a container running in Kubernetes that will allow that container to run storage commands on the Windows host. Linux doesn&amp;rsquo;t have this issue as containers can access the host directly when running as a priviledged container. Until &lt;a href="https://kubernetes.io/blog/2021/08/16/windows-hostprocess-containers/"&gt;HostProcess Containers&lt;/a&gt; progresses further and adoption increases this is a good solution to overcome that issue. I needed to create a test workload for verifying that CSI Proxy was working succesfully and I decided to do that workload without requiring running in a cloud environment. This meant that I needed to leverage a CSI driver that could be configured locally and that had CSI Proxy support. I decided that I would focus on the &lt;a href="https://github.com/kubernetes-csi/csi-driver-smb"&gt;CSI SMB Driver&lt;/a&gt; which provided many of the resources being used in this post.&lt;/p&gt;</description></item><item><title>2022 Predictions</title><link>https://phillipsj.net/posts/2022-predictions/</link><pubDate>Thu, 30 Dec 2021 14:00:52 -0500</pubDate><guid>https://phillipsj.net/posts/2022-predictions/</guid><description>&lt;p&gt;2021 was an awful year for me with my predictions and I&amp;rsquo;m not surprised as I made many that were inspirational. Let&amp;rsquo;s see what I have come up with for the next year.&lt;/p&gt;
&lt;h2 id="an-arm-competitor-for-the-m1"&gt;An ARM competitor for the M1&lt;/h2&gt;
&lt;p&gt;We have seen many ARM products and now Apple has proven without a doubt that a competitive platform can be built with the chips. There is going to have to be a manufacturer that decides to really develop their own ARM-based SoC to produce products that compete. I am going to be curious who does it.&lt;/p&gt;</description></item><item><title>2021 Predictions Review</title><link>https://phillipsj.net/posts/2021-predictions-review/</link><pubDate>Fri, 24 Dec 2021 11:38:57 -0500</pubDate><guid>https://phillipsj.net/posts/2021-predictions-review/</guid><description>&lt;p&gt;Time to review my &lt;a href="https://www.phillipsj.net/posts/2021-predictions/"&gt;2021 predictions post&lt;/a&gt;. This year I didn&amp;rsquo;t do well at all except where I partially got just one of them. Let&amp;rsquo;s get into it.&lt;/p&gt;
&lt;h2 id="microsoft-windows-desktop-environment-for-linux"&gt;Microsoft Windows Desktop Environment for Linux&lt;/h2&gt;
&lt;p&gt;Not much to say, if Microsoft had made one everyone would have known.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Score: 0&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="microsoft-open-sources-sql-server"&gt;Microsoft Open Sources SQL Server&lt;/h2&gt;
&lt;p&gt;I was sure we would have seen soemthing like this to answer some of the pressure. However, we didn&amp;rsquo;t.&lt;/p&gt;</description></item><item><title>Building Windows and Linux Containers with GitHub Actions</title><link>https://phillipsj.net/posts/building-windows-and-linux-containers-with-github-actions/</link><pubDate>Wed, 22 Dec 2021 21:09:42 -0500</pubDate><guid>https://phillipsj.net/posts/building-windows-and-linux-containers-with-github-actions/</guid><description>&lt;p&gt;I have been discussing &lt;a href="https://www.phillipsj.net/posts/how-to-install-modules-in-a-windows-powershell-core-container/"&gt;PowerShell modules in containers&lt;/a&gt; and building &lt;a href="https://www.phillipsj.net/posts/creating-a-multiplatform-powershell-core-app-container/"&gt;multiplatform&lt;/a&gt; containers in my last few posts. I want to follow up those posts with the &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt; that I created for the &lt;a href="https://github.com/phillipsj/pstools"&gt;pstools&lt;/a&gt; repository. I created two GH Actions, one called &lt;code&gt;CI&lt;/code&gt; for PRs and commits and one called &lt;code&gt;Publish&lt;/code&gt; that runs when a GitHub release is created. These actions leverage the matrix and strategy to configure agents for building Linux, Windows 2019, and Windows 2022 container images. The publish workflow differs just a little because it also pushes and generates a manifest.&lt;/p&gt;</description></item><item><title>Creating a Multiplatform Powershell Core App Container</title><link>https://phillipsj.net/posts/creating-a-multiplatform-powershell-core-app-container/</link><pubDate>Mon, 20 Dec 2021 16:16:43 -0500</pubDate><guid>https://phillipsj.net/posts/creating-a-multiplatform-powershell-core-app-container/</guid><description>&lt;p&gt;Having consistent tools makes debugging issues across Linux and Windows easier. PowerShell Core is that tool for the job, in my opinion. It can run on both Windows and Linux, which makes it a good candidate for building debugging tools, and keeping it all one thing reduces the cognitive overload.&lt;/p&gt;
&lt;p&gt;The PowerShell team produces Core images for Windows and Linux. There are only two tags that exist are multiplatform, which are LTS and Latest tags. Unfortunately, they use Server Core instead of Nano Server for the base, at least on Windows. I want the smallest possible images, which means using Nano Server requires a touch more setup on my side.&lt;/p&gt;</description></item><item><title>How to Install Modules in a Windows Powershell Core Container</title><link>https://phillipsj.net/posts/how-to-install-modules-in-a-windows-powershell-core-container/</link><pubDate>Sun, 19 Dec 2021 12:34:18 -0500</pubDate><guid>https://phillipsj.net/posts/how-to-install-modules-in-a-windows-powershell-core-container/</guid><description>&lt;p&gt;I ran into this issue where I was trying to containerize a small &lt;a href="https://www.phillipsj.net/posts/powershell-rest-api-with-polaris/"&gt;Polaris&lt;/a&gt; app for testing using the Nano Server PowerShell Core container. While performing the Docker build, I kept getting an &lt;code&gt;Access Denied&lt;/code&gt; error.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Step 3/6 : SHELL &lt;span style="color:#ce5c00;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;&amp;#34;pwsh&amp;#34;&lt;/span&gt;, &lt;span style="color:#4e9a06"&gt;&amp;#34;-Command&amp;#34;&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ---&amp;gt; Running in f8e2ee2c6efd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Removing intermediate container f8e2ee2c6efd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ---&amp;gt; 21cd481c5cdf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Step 4/6 : RUN Install-Module -Name Polaris -Scope CurrentUser -Force
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ---&amp;gt; Running in 162e6d8ae570
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Install-Package: Access is denied.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Removing intermediate container 162e6d8ae570
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ---&amp;gt; 237c5b4ff86a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Step 5/6 : COPY app.ps1 app.ps1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ---&amp;gt; 8ac6e117a58c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This works fine in the Linux containers; it just fails in Windows. I figured it must be using a different user, so I tried scoping it to the current user, which again worked on Linux and failed on Windows. I dug in and found the &lt;a href="https://github.com/PowerShell/PowerShell-Docker"&gt;Dockerfiles&lt;/a&gt; used to create the official images and found &lt;a href="https://github.com/PowerShell/PowerShell-Docker/blob/41c59e4b844cec8678df8118e231f8cd6e4188bd/release/7-1/nanoserver1809/docker/Dockerfile#L57-L69"&gt;this&lt;/a&gt;:&lt;/p&gt;</description></item><item><title>Building a Windows Server QCOW2 Image</title><link>https://phillipsj.net/posts/building-a-windows-server-qcow2-image/</link><pubDate>Mon, 06 Dec 2021 22:07:03 -0500</pubDate><guid>https://phillipsj.net/posts/building-a-windows-server-qcow2-image/</guid><description>&lt;p&gt;I finally made it to the task that I was trying my best to complete. The whole purpose of creating a &lt;a href="https://www.phillipsj.net/posts/opensuse-perfect-kvm-setup/"&gt;KVM setup with openSUSE&lt;/a&gt; and learning to &lt;a href="https://www.phillipsj.net/posts/terraform-with-libvirt-creating-a-single-node-rancher/"&gt;Terraform libvirt&lt;/a&gt; was to be able to create Windows Server nodes for testing all things Kubernetes and Windows. I did a &lt;a href="https://www.phillipsj.net/posts/developing-kubernetes-for-windows-requires-vms/"&gt;post&lt;/a&gt; discussing different options and trade-offs. The conclusion that I came to when it comes to my development workflow is to have as much local as possible. Creating resources in the cloud just takes too long for my personal needs. The last missing piece is getting a Windows Server QCOW2 image configured how I want it. That means having the following setup and configured:&lt;/p&gt;</description></item><item><title>Three Month ZSA Moonlander Review</title><link>https://phillipsj.net/posts/three-month-zsa-moonlander-review/</link><pubDate>Thu, 02 Dec 2021 21:55:55 -0500</pubDate><guid>https://phillipsj.net/posts/three-month-zsa-moonlander-review/</guid><description>&lt;p&gt;I said I would review the &lt;a href="https://www.zsa.io/moonlander/"&gt;ZSA Moonlander&lt;/a&gt; after I spent some time using it. My initial &lt;a href="https://www.phillipsj.net/posts/initial-zsa-moonlander-review/"&gt;review&lt;/a&gt; was four months ago, so I figured it was about time to post back my thoughts. I have what I think are the big questions that most would probably want to know, so I will do my best to cover those. The TLDR is that I am still using it daily and still enjoy it. Let&amp;rsquo;s dig in&lt;/p&gt;</description></item><item><title>Terraform with libvirt: Creating a single node Rancher</title><link>https://phillipsj.net/posts/terraform-with-libvirt-creating-a-single-node-rancher/</link><pubDate>Wed, 01 Dec 2021 22:28:13 -0500</pubDate><guid>https://phillipsj.net/posts/terraform-with-libvirt-creating-a-single-node-rancher/</guid><description>&lt;p&gt;Previously I discussed that I was starting to test &lt;a href="https://www.phillipsj.net/posts/opensuse-perfect-kvm-setup/"&gt;KVM on openSUSE&lt;/a&gt; in my homelab and this is a follow-up, and an introduction to using the &lt;a href="https://registry.terraform.io/providers/dmacvicar/libvirt/latest/docs"&gt;Terraform libvirt provider&lt;/a&gt;. I am enjoying using this provider, and I like how it feels to use it. I haven&amp;rsquo;t been using Terraform as heavily the last few months, and it feels good to be back using it in my workflow. In the repo, there are &lt;a href="https://github.com/dmacvicar/terraform-provider-libvirt/tree/main/examples/v0.13"&gt;examples&lt;/a&gt; in the repo on GitHub, which provide a basic overview of most of the features. In this post, I will cover one of the scenarios that I am using it to do, which is to create a single node Rancher server deployed using Docker.&lt;/p&gt;</description></item><item><title>Creating Windows Container Images Without Docker</title><link>https://phillipsj.net/posts/creating-windows-container-images-without-docker/</link><pubDate>Tue, 30 Nov 2021 20:15:32 -0400</pubDate><guid>https://phillipsj.net/posts/creating-windows-container-images-without-docker/</guid><description>&lt;p&gt;&lt;a href="https://github.com/google/go-containerregistry/tree/main/cmd/crane"&gt;Crane&lt;/a&gt; is a tool created by Google for working with images and registries. Crane has a lot of excellent functionality, and the one that is the most interesting is the &lt;a href="https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane_append.md"&gt;append&lt;/a&gt; command. With the append command, we can add a layer to a container image. This feature means that we can create a layer with our application and append it to an existing base image. What this does is allow us to create a container regardless of the OS or requiring Docker. Let&amp;rsquo;s see how that is accomplished by adding a .NET App to the ASP .NET Runtime Nano server 2022 image on a Linux workstation. You can install Crane as a binary or run:&lt;/p&gt;</description></item><item><title>openSUSE: The Perfect KVM Setup</title><link>https://phillipsj.net/posts/opensuse-perfect-kvm-setup/</link><pubDate>Mon, 29 Nov 2021 20:47:30 -0500</pubDate><guid>https://phillipsj.net/posts/opensuse-perfect-kvm-setup/</guid><description>&lt;p&gt;I have been using &lt;a href="https://get.opensuse.org/tumbleweed/"&gt;openSUSE Tumbleweed&lt;/a&gt; as my daily driver for a year and as the operating system for work for the last seven months. As far as my homelab goes, I have been bouncing around to different options, usually some form of Debian derivative, including running a &lt;a href="https://www.proxmox.com/en/proxmox-ve"&gt;Proxmox&lt;/a&gt; setup for running virtual machines. Along with running VMs for personal things, I tend to run many VMs for work. Some of those VMs run in Proxmox, others I leverage &lt;a href="https://www.vagrantup.com"&gt;Vagrant&lt;/a&gt; and &lt;a href="https://www.linux-kvm.org"&gt;KVM&lt;/a&gt; on my desktop for creating quick environments for testing code changes locally. This setup has served me well, and it&amp;rsquo;s time to evolve the setup for how I genuinely want to work. Proxmox is currently the weak link based on several items. The first issue is that DHCP for the Proxmox host has broken again, and I can&amp;rsquo;t seem to keep it working, meaning that I have to address my Proxmox host by IP address. The second issue is the GUI focus, which prevents me from really focusing on automation; instead, I have been relying on cloning VM templates in the GUI instead of concentrating on Terraform. The final issue is that it&amp;rsquo;s the last primary Debian-based system that I am managing.&lt;/p&gt;</description></item><item><title>Cross-Platform Go: Runtime Checks vs. Build Tags</title><link>https://phillipsj.net/posts/cross-platform-go-runtime-checks-vs-build-tags/</link><pubDate>Wed, 17 Nov 2021 20:40:17 -0500</pubDate><guid>https://phillipsj.net/posts/cross-platform-go-runtime-checks-vs-build-tags/</guid><description>&lt;p&gt;A large part of my job is to get various Go libraries and tools to work with Windows. As part of that process, I have developed a preference for dealing with platform-dependent items. Go has two common approaches that developers take, they either wrap that logic in an &amp;ldquo;if check&amp;rdquo; for the runtime, or they leverage build tags to compile the code required for that platform. Let&amp;rsquo;s examine some examples to see the different approaches before telling you which one I prefer and why.&lt;/p&gt;</description></item><item><title>Cross-Platform Go: File Paths</title><link>https://phillipsj.net/posts/cross-platform-go-file-paths/</link><pubDate>Tue, 02 Nov 2021 21:36:14 -0400</pubDate><guid>https://phillipsj.net/posts/cross-platform-go-file-paths/</guid><description>&lt;p&gt;I was fortunate enough to kick this week off with one heck of a bug. I discovered the bug last week, and on Friday, after an excellent debugging session with breakpoints and stepping into each call, I found the cause. That was a good way to head into the weekend, and I knew that I would have to determine a solution this week. The library that I discovered the issue was initially designed to run in the context of a Linux OS and Linux containers. Given that I was adapting this code to work on Windows shouldn&amp;rsquo;t have come as a surprise that I would run into an issue of some sort. This issue was pretty cool, so I thought I would share and write it up. I will do my best to describe the problem.&lt;/p&gt;</description></item><item><title>Running ASP Classic in a Windows Container</title><link>https://phillipsj.net/posts/running-asp-classic-in-a-windows-container/</link><pubDate>Sun, 31 Oct 2021 13:46:13 -0400</pubDate><guid>https://phillipsj.net/posts/running-asp-classic-in-a-windows-container/</guid><description>&lt;p&gt;This topic will hopefully be entertaining. People often ask, &amp;ldquo;Why Windows Containers?&amp;rdquo; often not realizing that there are many applications that can&amp;rsquo;t migrate to .NET 5 to be able to run on Linux or won&amp;rsquo;t be migrated to anything else. Some of these applications are .NET Full framework, and some are ASP Classic. Some depend on Windows-specific APIs. Many of these applications are often used internally within businesses to fill a need, and they have been working with minimal maintenance for years. Often it isn&amp;rsquo;t justifiable from a business perspective to rewrite or migrate away, leaving teams to keep them running as-is. Keeping these applications running comes the need to at least keep the platforms they are running on patched and modernized. Part of that strategy can be containerizing these applications, ensuring that you can develop, test, and patch more efficiently. With that introduction out of the way, let&amp;rsquo;s create an ASP Classic web page and containerize it.&lt;/p&gt;</description></item><item><title>Windows, curl, and Self-signed Certs</title><link>https://phillipsj.net/posts/windows-curl-and-self-signed-certs/</link><pubDate>Tue, 19 Oct 2021 21:11:35 -0400</pubDate><guid>https://phillipsj.net/posts/windows-curl-and-self-signed-certs/</guid><description>&lt;p&gt;Today was an exciting day that had some twists and turns. Given that many of the searches didn&amp;rsquo;t return good information, I decided to create a post. Let me set the stage for the issue I was working on.&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;Today, I was working on a script using PowerShell. The original script was written in Bash, and we needed the same script with feature parity for Windows. We decided a while back that we would try to make full use &lt;a href="https://curl.se"&gt;curl&lt;/a&gt; to keep with that parity and because it is an excellent way for downloading files compared to what ships with PowerShell. However, that is where the issue creeps up. Part of the process that I was working on checked to see if a self-signed cert was used. If so, then download it. Once that cert is downloaded, we use the &lt;code&gt;--cacert&lt;/code&gt; flag with our curl commands to validate our requests.&lt;/p&gt;</description></item><item><title>More Mage and Go: Awesome Mage Repo</title><link>https://phillipsj.net/posts/more-mage-and-go-awesome-mage-repo/</link><pubDate>Sun, 17 Oct 2021 20:50:09 -0400</pubDate><guid>https://phillipsj.net/posts/more-mage-and-go-awesome-mage-repo/</guid><description>&lt;p&gt;I got so wrapped up with &lt;a href="https://www.phillipsj.net/posts/building-go-projects-like-a-mage/"&gt;Mage&lt;/a&gt; and the &lt;a href="https://www.phillipsj.net/posts/mage-helpers-for-clean-go-builds/"&gt;helpers&lt;/a&gt; posts that I didn&amp;rsquo;t realize that an &lt;a href="https://github.com/magefile/awesome-mage"&gt;awesome mage&lt;/a&gt; repository already exists with an extensive list of helpers that are already available. It&amp;rsquo;s a pretty robust list that covers most of the common usages that would be needed. Let&amp;rsquo;s see what using the &lt;a href="https://github.com/mcandre/mage-extras"&gt;mage-extras&lt;/a&gt; helpers will do to our &lt;a href="https://github.com/phillipsj/mage-example"&gt;mage-example&lt;/a&gt; project.&lt;/p&gt;
&lt;h3 id="installing-mage-extras-helpers"&gt;Installing Mage Extras Helpers&lt;/h3&gt;
&lt;p&gt;We can install it using &lt;code&gt;go get&lt;/code&gt; in our project.&lt;/p&gt;</description></item><item><title>Mage Helpers for Clean Go Builds</title><link>https://phillipsj.net/posts/mage-helpers-for-clean-go-builds/</link><pubDate>Sat, 16 Oct 2021 14:41:23 -0400</pubDate><guid>https://phillipsj.net/posts/mage-helpers-for-clean-go-builds/</guid><description>&lt;p&gt;In my last &lt;a href="https://www.phillipsj.net/posts/building-go-projects-like-a-mage/"&gt;post&lt;/a&gt;, I discussed why one would consider using Mage. Those considerations are for cross-platform support and not relying on tools like cURL to be installed on the system. I had also discussed having the ability to wrap functionality up in packages to allow sharing and centralizing logic across your builds. This is also an opportunity that I feel that the &lt;a href="https://cakebuild.net"&gt;Cake&lt;/a&gt; project did really well, standardizing what they called &lt;em&gt;Addins&lt;/em&gt; to make consuming functionality clearer for consumers. Mage has similar concepts with their &lt;a href="https://magefile.org/libraries/"&gt;helpers&lt;/a&gt;. Mage ships with some of these included for things like removing and copying files. There is plenty of neat functionality in there to make it convenient and prevent you from having to write all of that Go code yourself. That concept can also be seen being expanded upon in the &lt;a href="https://github.com/gnormal/gnorm"&gt;Gnorm&lt;/a&gt; repo with the &lt;em&gt;mage_helpers.go&lt;/em&gt; file. I think that be can be extended even further into a concept like addins for Cake that I mentioned previously. Let&amp;rsquo;s see what they may look like.&lt;/p&gt;</description></item><item><title>Building Go Projects Like a Mage</title><link>https://phillipsj.net/posts/building-go-projects-like-a-mage/</link><pubDate>Thu, 14 Oct 2021 21:14:37 -0400</pubDate><guid>https://phillipsj.net/posts/building-go-projects-like-a-mage/</guid><description>&lt;p&gt;Working on cross-platform projects comes with a lot of challenges. Several things about Go can make that less difficult, like being able to target a different runtime and how you can create files for other runtimes to substitute platform-specific functions. These are excellent capabilities that I appreciate.&lt;/p&gt;
&lt;p&gt;I do find myself with an issue when it comes to build tooling. Many people reach for Make, Bash, or both. That&amp;rsquo;s fine on a Unix, Linux, or ARM system, yet those tools don&amp;rsquo;t work well when it comes to Windows. PowerShell is cross-platform and would be a good choice, yet it&amp;rsquo;s another language to learn.&lt;/p&gt;</description></item><item><title>Enabling Staticcheck in GoLand</title><link>https://phillipsj.net/posts/enabling-staticcheck-in-goland/</link><pubDate>Tue, 05 Oct 2021 21:45:38 -0400</pubDate><guid>https://phillipsj.net/posts/enabling-staticcheck-in-goland/</guid><description>&lt;p&gt;&lt;a href="https://staticcheck.io"&gt;Staticcheck&lt;/a&gt; is a linter for Go that does an excellent job of providing feedback where you can simplify your code or make it more idiomatic. It seems that the VSCode Go extension will install it by default, depending on how you perform the initial setup. If you are using GoLand, I haven&amp;rsquo;t seen it listed as an option out of the box. However, it is easy to enable yourself just like you would with &lt;em&gt;gofmt&lt;/em&gt; or &lt;em&gt;goimports&lt;/em&gt; as a file watcher. Let&amp;rsquo;s get started.&lt;/p&gt;</description></item><item><title>K3s: Enable NFS Storage</title><link>https://phillipsj.net/posts/k3s-enable-nfs-storage/</link><pubDate>Tue, 03 Aug 2021 20:40:26 -0400</pubDate><guid>https://phillipsj.net/posts/k3s-enable-nfs-storage/</guid><description>&lt;p&gt;Today, I had a few people ping me about someone who was frustrated configuring a &lt;a href="https://k3s.io/"&gt;K3s&lt;/a&gt; cluster to enable &lt;a href="https://kubernetes.io/docs/concepts/storage/storage-classes/#nfs"&gt;NFS&lt;/a&gt; storage provisioner. Out of the box, K3s ships with the &lt;a href="https://github.com/rancher/local-path-provisioner"&gt;local path&lt;/a&gt; storage provisioner, which uses storage local to the node. If you want storage that can be shared across multiple nodes if you are running them, you will need to use a different solution which the NFS storage provisioner is one of them. I like the aspects of the dynamic provisioning provided by &lt;a href="https://kubernetes.io/docs/concepts/storage/storage-classes"&gt;Storage Classes&lt;/a&gt; and how it describes the different storage options, so that is what the focus of this post will be. If you want to follow along, you will need a VM or a Raspberry PI running K3s and an &lt;a href="https://doc.opensuse.org/documentation/leap/reference/html/book-reference/cha-nfs.html"&gt;NFS server&lt;/a&gt; serving your storage. I will be building the K3s with a local VM running &lt;a href="https://get.opensuse.org"&gt;openSUSE&lt;/a&gt; Leap 15.3. This should work the same with other Linux operating systems. Let&amp;rsquo;s get started with installing K3s. I will be using my QNAP NAS as my NFS Server as it is convenient.&lt;/p&gt;</description></item><item><title>Initial ZSA Moonlander Review</title><link>https://phillipsj.net/posts/initial-zsa-moonlander-review/</link><pubDate>Fri, 30 Jul 2021 22:43:09 -0400</pubDate><guid>https://phillipsj.net/posts/initial-zsa-moonlander-review/</guid><description>&lt;p&gt;I have started searching for improvements to my work environment. I posted that I was trying an &lt;a href="https://www.phillipsj.net/posts/first-look-anker-ergo-mouse/"&gt;ergo mouse&lt;/a&gt; and one additional change I decided to make was a big one, I bought an ergo mechanical keyboard. I had looked at a few different options and decided that I wanted a split design. After careful research, countless youtube videos, and some personal recommendations, I landed on the &lt;a href="https://www.zsa.io/moonlander/"&gt;ZSA Moonlander&lt;/a&gt;. There are two color choices and a multitude of switches that I could choose from. I have been using a &lt;a href="https://www.daskeyboard.com/model-s-professional/"&gt;Das Keyboard Model S Professional&lt;/a&gt; with &lt;a href="https://www.cherrymx.de/en/mx-original/mx-blue.html"&gt;Cherry MX Blues&lt;/a&gt; since 2010 when I purchased the Das Keyboard. The Das Keyboard still functions as it did the day that I bought it. With only one minor tweak, I added some damper rings to reduce some of the clacking from bottoming out the keys. After using a mechanical keyboard, I can no longer use the average keyboard. My hands and fingers hurt after using a standard keyboard for just a couple of hours. That is why I knew that an ergo keyboard that I chose needed to have mechanical switches. I highly recommend anyone experiencing hand fatigue to give a mechanical keyboard a try. You can find some great deals out there to try without dropping a lot of money.&lt;/p&gt;</description></item><item><title>Harvester: Intro and Setup</title><link>https://phillipsj.net/posts/harvester-intro-and-setup/</link><pubDate>Thu, 22 Jul 2021 21:23:27 -0400</pubDate><guid>https://phillipsj.net/posts/harvester-intro-and-setup/</guid><description>&lt;p&gt;I mentioned about a month back that I was using &lt;a href="https://www.phillipsj.net/posts/harvester-running-in-the-home-lab/"&gt;Harvester in my home lab&lt;/a&gt;. I didn&amp;rsquo;t go into much detail, and this is the post to bring some more depth. We will cover what Harvester does, my hardware, installation, setup, and deploying your first virtual machine. Let&amp;rsquo;s get started.&lt;/p&gt;
&lt;h2 id="what-is-harvester"&gt;What is Harvester?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://harvesterhci.io/"&gt;Harvester&lt;/a&gt; is &lt;a href="https://rancher.com/"&gt;Rancher&amp;rsquo;s&lt;/a&gt; open-source answer to a hyper-converged infrastructure platform. As with most things Rancher is involved with, it is built on Kubernetes using tools like &lt;a href="https://kubevirt.io/"&gt;KubeVirt&lt;/a&gt;, and &lt;a href="https://rancher.com/products/longhorn/"&gt;Longhorn&lt;/a&gt;. KubeVirt is an interesting project that leverages &lt;a href="https://www.linux-kvm.org/page/Main_Page"&gt;KVM&lt;/a&gt; and &lt;a href="https://libvirt.org/"&gt;libvirt&lt;/a&gt; to allow running virtual machines inside of Kubernetes. This allows you to run both containers and VMs in your cluster. This will reduce operation overhead and provide consistency. This is all tried and tested technology combined to provide an open-source solution in this space.&lt;/p&gt;</description></item><item><title>First Look: Anker Ergo Mouse</title><link>https://phillipsj.net/posts/first-look-anker-ergo-mouse/</link><pubDate>Wed, 07 Jul 2021 21:24:52 -0400</pubDate><guid>https://phillipsj.net/posts/first-look-anker-ergo-mouse/</guid><description>&lt;p&gt;I have been looking at the gear that I use every day. I try to re-evaluate the equipment every couple of years to decide if I need or should make a change. Buying an office chair from a professional brand was the first big choice that I have made, and that was almost ten years ago. Ever since that decision, I have made purchases over the years to boost ergonomics or quality of life. Recently, I have decided to give my keyboard and mouse a review. I have been using a &lt;a href="https://www.logitech.com/en-us/products/mice/m510-wireless-mouse.910-001822.html?crid=7"&gt;Logitech M510&lt;/a&gt; for years. I have more expensive mice from them. However, I really like how it feels, and the weight is perfect for my preferences. Many of the ergonomic mice are very expensive, and since I didn&amp;rsquo;t know if I would like it, I decided to dip my toes in with a more economical but quality ergo mouse. After searching, I discovered that the &lt;a href="https://us.anker.com/products/a7852"&gt;Anker Vertical Mouse&lt;/a&gt; was reasonable. I have been impressed with the price and quality of Anker products owning several of them over the years. I felt confident that it would be a good experience.&lt;/p&gt;</description></item><item><title>How to Clean Your Intel NUC</title><link>https://phillipsj.net/posts/how-to-clean-your-intel-nuc/</link><pubDate>Sun, 04 Jul 2021 12:38:37 -0400</pubDate><guid>https://phillipsj.net/posts/how-to-clean-your-intel-nuc/</guid><description>&lt;p&gt;My new job has me relying a lot more on VMs, and I have had to do a little work on my homelab, so I could support running tools like &lt;a href="https://www.proxmox.com/en/proxmox-ve"&gt;Proxmox VE&lt;/a&gt; and &lt;a href="https://github.com/harvester/harvester"&gt;Harvester&lt;/a&gt;. I have been using most of my Intel NUCs for a few years, and I started noticing that they are noisier now. Given the noise, I decided to take them apart, clean out all the dust, then apply some new thermal paste. I recorded a temperature before I cleaned each one and a temperature post-cleaning. The dust removal and new thermal paste dropped temps on average roughly 7 degrees Celsius. That isn&amp;rsquo;t too shabby, and it decreased the overall fan noise. I decided to take some pictures of me cleaning my Intel NUC 8th Gen i5, model &lt;a href="https://www.intel.com/content/www/us/en/products/sku/126148/intel-nuc-kit-nuc8i5beh/specifications.html"&gt;NUC8i5BEK&lt;/a&gt;. The process is similar for others. Actually, the main difference is the heatsink fan and cooler. The rest is pretty much identical. If you have any questions about doing it, just reach out, and answer any questions. Here is the before temp.&lt;/p&gt;</description></item><item><title>Go for Line of Business: CSV Parsing</title><link>https://phillipsj.net/posts/go-for-line-of-business-csv-parsing/</link><pubDate>Fri, 11 Jun 2021 20:14:49 -0400</pubDate><guid>https://phillipsj.net/posts/go-for-line-of-business-csv-parsing/</guid><description>&lt;p&gt;I tossed out this idea last week about writing about using Go for line of business apps. I don&amp;rsquo;t do many business apps these days, yet the first ten years of my career were pretty much in that space. During that time, I built all kinds of interesting apps, from making crime maps to point-of-sale systems. Most of those applications used .NET, which is pretty standard in line of business applications. Some of these applications just created reports, and others processed various file formats for loading data, with that background, that lead me to think about how Go could be used for these situations and how that compares to using .NET to achieve that same goal. When I say how it compares, I mean how it feels to write the language and how the solutions look. The real goal is to take something I have done dozens of times and apply it to a new language I am learning. Finding the data shouldn&amp;rsquo;t be difficult, and we will use the &lt;a href="https://www.austintexas.gov/"&gt;City of Austin&amp;rsquo;s&lt;/a&gt; &lt;a href="https://data.austintexas.gov/"&gt;Open Data Portal&lt;/a&gt; to find some data. Funny enough, this was one of those projects that I worked on that created many simples apps for processing CSV files and uploading the data to this very portal.&lt;/p&gt;</description></item><item><title>Proxmox VE DHCP Issues</title><link>https://phillipsj.net/posts/proxmox-ve-dhcp-issues/</link><pubDate>Sun, 06 Jun 2021 16:23:01 -0400</pubDate><guid>https://phillipsj.net/posts/proxmox-ve-dhcp-issues/</guid><description>&lt;p&gt;I have been having some intermittent DHCP issues lately, some of it has specifically been related to the few Windows machines that I have. Other issues have been related to some different Linux distros. I decided that I would dig into these issues starting with the one that was the most frustrating which is my &lt;a href="https://www.proxmox.com/en/proxmox-ve"&gt;Proxmox VE&lt;/a&gt; server not being available via DNS. Interestingly enough, any VM being created on Proxmox was leveraging DHCP and I could resolve them by name. Proxmox is using debian based OS underneath so I started doing some searching focus on the host not resolving by name. Everything was pointing to the fact that the DHCP settings where not configured correctly. Running the following command highlighted the issue.&lt;/p&gt;</description></item><item><title>Developing Kubernetes for Windows Requires VMs</title><link>https://phillipsj.net/posts/developing-kubernetes-for-windows-requires-vms/</link><pubDate>Fri, 04 Jun 2021 21:35:14 -0400</pubDate><guid>https://phillipsj.net/posts/developing-kubernetes-for-windows-requires-vms/</guid><description>&lt;p&gt;It&amp;rsquo;s been exactly two months since I started working on a Kubernetes distribution as a member of the Windows team. It has presented some new challenges, with the most challenging coming down to testing. If you are working on Linux, you can nest k8s inside of k8s, use tools like &lt;a href="https://kind.sigs.k8s.io/"&gt;kind&lt;/a&gt;. When working on Windows, you will need a Linux control plane, and then you can configure a Windows node. Now you could leverage a container or WSL to host the control plane, then use your local machine as the Windows node. That approach risks your local machine getting misconfigured or corrupted. Having to reinstall Docker/Hyper-v when something goes wrong takes a lot of time. This work creates some interesting solutions that we are going to discuss.&lt;/p&gt;</description></item><item><title>Harvester Running in the Home Lab</title><link>https://phillipsj.net/posts/harvester-running-in-the-home-lab/</link><pubDate>Tue, 01 Jun 2021 22:50:26 -0400</pubDate><guid>https://phillipsj.net/posts/harvester-running-in-the-home-lab/</guid><description>&lt;p&gt;I have made several attempts at configuring a home lab over the years. I use it for a while, and then it sits there. Since I have started my new job, I have found an increasing need for it. The cloud is super convenient, yet nothing is faster than having servers locally. I have been using &lt;a href="https://www.vagrantup.com/"&gt;Vagrant&lt;/a&gt; with success, and I did have a &lt;a href="https://www.linux-kvm.org/page/Main_Page"&gt;KVM&lt;/a&gt; setup working. I have decided that I needed something a tad more than what KVM could provide. Given all of that, I decided that I would give &lt;a href="https://harvesterhci.io/"&gt;Harvester&lt;/a&gt; a spin, given it&amp;rsquo;s Kubernetes based.&lt;/p&gt;</description></item><item><title>Cake Addins Update</title><link>https://phillipsj.net/posts/cake-addins-update/</link><pubDate>Sun, 23 May 2021 21:13:57 -0400</pubDate><guid>https://phillipsj.net/posts/cake-addins-update/</guid><description>&lt;p&gt;I just wanted to post that all of my Cake Addins migrated out of the Cake Contrib organization on GitHub and are now back in my account. I will be making changes and maintenance a little every week, so please be patient as I get this worked out. I will detail out my plans below.&lt;/p&gt;
&lt;h2 id="immediate-changes"&gt;Immediate Changes&lt;/h2&gt;
&lt;p&gt;This migration occurred due to a change in the licensing and attribution of the projects. These changes occurred without any discussion with me, and I have worked through them with the team. With that said, the changes have not all been 100% remediated, and that will be my first order of business.&lt;/p&gt;</description></item><item><title>Terraform: Using Null and Dynamic Blocks with Azure VMs</title><link>https://phillipsj.net/posts/terraform-using-null-and-dynamic-blocks-with-azure-vms/</link><pubDate>Mon, 03 May 2021 21:20:47 -0400</pubDate><guid>https://phillipsj.net/posts/terraform-using-null-and-dynamic-blocks-with-azure-vms/</guid><description>&lt;p&gt;I have been doing some work creating a module for creating a Windows VM in Azure. I wanted the ability to allow the user to use the &lt;a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/windows_virtual_machine#source_image_id"&gt;source_image_id&lt;/a&gt; or &lt;a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/windows_virtual_machine#source_image_reference"&gt;source_image_reference&lt;/a&gt;. You can&amp;rsquo;t set both, so I needed a way to switch between the two different options. In Terraform 0.12, the &lt;a href="https://www.terraform.io/docs/language/expressions/types.html#null"&gt;null&lt;/a&gt; type was introduced. The &lt;em&gt;null&lt;/em&gt; type marks the property/attribute as being omitted or absent. If I set the variable&amp;rsquo;s default value for the &lt;em&gt;source_image_id&lt;/em&gt; to &lt;em&gt;null&lt;/em&gt;, it will be omitted if not set. Here is what that would look like used in a variable.&lt;/p&gt;</description></item><item><title>Chocotainer: Building Chocolatey Packages in a Container</title><link>https://phillipsj.net/posts/chocotainer-building-chocolatey-packages-in-a-container/</link><pubDate>Wed, 28 Apr 2021 22:31:13 -0400</pubDate><guid>https://phillipsj.net/posts/chocotainer-building-chocolatey-packages-in-a-container/</guid><description>&lt;p&gt;I am working on packaging an app for &lt;a href="https://chocolatey.org/"&gt;Chocolatey&lt;/a&gt;. I want to make it as simple as possible for my teammates who may not be familiar with building Chocolatey packages. I decided that creating a Dockerfile that installs Chocolatey, copies all the files necessary, then packs and pushes would be a nice approach. It saves them from having to install Chocolatey, and it keeps the entire environment clean and contained. Let&amp;rsquo;s walk through doing this together.&lt;/p&gt;</description></item><item><title>Using Packer to Create Docker Windows Image for Azure</title><link>https://phillipsj.net/posts/using-packer-to-create-docker-windows-image-for-azure/</link><pubDate>Mon, 26 Apr 2021 21:43:09 -0400</pubDate><guid>https://phillipsj.net/posts/using-packer-to-create-docker-windows-image-for-azure/</guid><description>&lt;p&gt;I need to have Docker installed on Windows Server 2019. There doesn&amp;rsquo;t appear to be one that exists in the Azure Marketplace that I could find. Bootstrapping the installation of Docker during VM creation takes some time and requires a reboot as part of the process. There are few solutions to accomplish that, so I decided to create a shared image using &lt;a href="https://www.packer.io/"&gt;Packer&lt;/a&gt;. Before we can dive into the Packer configuration, we need to create a resource group and shared image gallery. If you have existing ones that you would like to use, then substitute them.&lt;/p&gt;</description></item><item><title>Terraforming a Standalone Rancher Server on Azure</title><link>https://phillipsj.net/posts/terraforming-a-standalone-rancher-server-on-azure/</link><pubDate>Wed, 21 Apr 2021 21:42:03 -0400</pubDate><guid>https://phillipsj.net/posts/terraforming-a-standalone-rancher-server-on-azure/</guid><description>&lt;p&gt;I need to quickly stand up a standalone Rancher server for testing and troubleshooting in Azure. I have seen plenty of guides and Terraform doing this in AWS. I decided that I would create one.&lt;/p&gt;
&lt;h2 id="creating-the-terraform"&gt;Creating the Terraform&lt;/h2&gt;
&lt;p&gt;First, we add our providers.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-HCL" data-lang="HCL"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;terraform&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;required_providers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; azurerm&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; source&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;hashicorp/azurerm&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; version&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;2.56.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; tls&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; source&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;hashicorp/tls&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; version&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;3.1.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; local&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; source&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;hashicorp/local&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; version&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;2.1.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we can create our resource group, get our VM image, and create our &lt;a href="https://www.phillipsj.net/posts/generating-ssh-keys-with-terraform/"&gt;SSH key&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Synology RT2600AC and MR2200AC Review</title><link>https://phillipsj.net/posts/synology-rt2600ac-and-mr2200ac-review/</link><pubDate>Sat, 17 Apr 2021 19:10:58 -0400</pubDate><guid>https://phillipsj.net/posts/synology-rt2600ac-and-mr2200ac-review/</guid><description>&lt;p&gt;After close to four years of usage of my &lt;a href="https://www.phillipsj.net/posts/review-google-wifi/"&gt;Google Wifi&lt;/a&gt;, I have decided to move on. Part of the reason is performance, one part Google retiring the wifi app, and the other is that I didn&amp;rsquo;t want to give Google more data. I have narrowed it down to a few choices being Synology, TP-Link, or Ubiquiti. I had been on the fence about Ubiquiti after the past couple of years of news, and the most recent information removed them from consideration. I have been impressed by many Synology products, so I decided to give them a try. I will admit from a price perspective, and they are more expensive than what I could have done with TP-Link. I picked up the &lt;a href="https://www.synology.com/en-us/products/RT2600ac"&gt;Synology RT2600AC&lt;/a&gt; and the &lt;a href="https://www.synology.com/en-us/products/MR2200ac"&gt;Synology MR2200AC&lt;/a&gt; to build out a &amp;ldquo;mesh&amp;rdquo; wifi.&lt;/p&gt;</description></item><item><title>Go-Style Error Handling in .NET</title><link>https://phillipsj.net/posts/go-style-error-handling-in-dotnet/</link><pubDate>Fri, 02 Apr 2021 12:21:50 -0400</pubDate><guid>https://phillipsj.net/posts/go-style-error-handling-in-dotnet/</guid><description>&lt;p&gt;When I am learning something new, I like to compare and contrast that to something I know well. When it comes to programming languages, that would be C# for me. I have been learning Go, and I was curious what it could look like to apply the Go style of error handling in C#. In case you aren&amp;rsquo;t aware of the Go style, here is an example.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Go" data-lang="Go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;main&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;()&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;{&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;m&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;err&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;getMessage&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;&amp;#34;Jamie&amp;#34;&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;err&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;!=&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;{&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;fmt&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;Println&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;err&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;os&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;exit&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;()&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;fmt&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;Println&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;m&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;getMessage&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;n&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;m&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;err&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;error&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;{&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;fmt&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;Sprintln&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;&amp;#34;Hello %v!&amp;#34;&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;,&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt; &lt;/span&gt;&lt;span style="color:#000"&gt;n&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#f8f8f8"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Go has built-in support for returning multiple values, and you will see this pattern in most Go code. It is a different approach than what most do in C#. To replicate this style in C#, we will need to leverage tuples for the return type and use the destructuring syntax to keep it as close to Go as possible. Here is my take on that style in C#.&lt;/p&gt;</description></item><item><title>.NET Containers: Windows vs. Linux Part 2</title><link>https://phillipsj.net/posts/dotnet-containers-windows-vs-linux-part-2/</link><pubDate>Thu, 01 Apr 2021 21:15:27 -0400</pubDate><guid>https://phillipsj.net/posts/dotnet-containers-windows-vs-linux-part-2/</guid><description>&lt;p&gt;My &lt;a href="https://www.phillipsj.net/posts/dotnet-containers-windows-vs-linux-part-1/"&gt;previous&lt;/a&gt; post covered the developer experience. Now I am back looking at performance between Windows and Linux containers for a basic ASP .NET application. I will test the performance using a Python-based tool called &lt;a href="https://locust.io/"&gt;Locust&lt;/a&gt;. It seems much more approachable than something like JMeter or ApacheBench, and it looks fun to use. The methodology should look familiar. This test was having some fun and learning some new tools, so please read it with that in mind.&lt;/p&gt;</description></item><item><title>.NET Containers: Windows vs. Linux Part 1</title><link>https://phillipsj.net/posts/dotnet-containers-windows-vs-linux-part-1/</link><pubDate>Wed, 24 Mar 2021 21:15:27 -0400</pubDate><guid>https://phillipsj.net/posts/dotnet-containers-windows-vs-linux-part-1/</guid><description>&lt;p&gt;This topic will be at least two parts, with the first part focusing on the developer experience of the two different container options for .NET. I haven&amp;rsquo;t spent a lot of time looking at Windows containers for a couple of years. The biggest reason I have not spent much time with them was always due to the images&amp;rsquo; size. They always took longer to pull and deploy due to the size. I decided that I would like to look at the current state as a developer of the two different platforms. I am going to look at just two aspects, size and build time. These are two of the most significant factors from my point of view as a developer.&lt;/p&gt;</description></item><item><title>Fixie Tests With Nuke Lightweight Integrations</title><link>https://phillipsj.net/posts/fixie-tests-with-nuke-lightweight-integrations/</link><pubDate>Tue, 09 Mar 2021 20:27:49 -0500</pubDate><guid>https://phillipsj.net/posts/fixie-tests-with-nuke-lightweight-integrations/</guid><description>&lt;p&gt;I have been exploring &lt;a href="https://nuke.build"&gt;Nuke&lt;/a&gt; as a .NET build system. So far I am really enjoying using it and many of its concepts. One thing that Nuke doesn&amp;rsquo;t yet have support for is &lt;a href="https://fixie.github.io/"&gt;Fixie&lt;/a&gt;, a lightweight and conventioned driven testing framework. Nuke has this concept called &lt;a href="https://nuke.build/docs/authoring-builds/cli-tools.html#lightweight-integration"&gt;lightweight integration&lt;/a&gt; that allows you to define a few details as attributes that will configure a basic tool for you to use in your Build.cs. In the case of Fixie, those details are the package id and the package executable for the &lt;em&gt;Fixie.Console&lt;/em&gt; package. Once that has been configured, you will have a tool that you can pass arguments as a string. It is very basic and not as feature rich as an actual tool, just remember this is meant to be lightweight. Let&amp;rsquo;s jump in and see this in action.&lt;/p&gt;</description></item><item><title>Tests Next to Class Being Tested in .NET</title><link>https://phillipsj.net/posts/tests-next-to-class-being-tested-in-dotnet/</link><pubDate>Thu, 04 Mar 2021 19:56:54 -0500</pubDate><guid>https://phillipsj.net/posts/tests-next-to-class-being-tested-in-dotnet/</guid><description>&lt;p&gt;I am back with trying something new that again is common in Go and popular in JavaScript too. We will see what it would look like to have tests inside the same project next to the class.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s get started by creating a new .NET class library project.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ dotnet new classlib -n Calculator
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we need to remove the Class1.cs and create the Calculator.cs Our Calculator.cs is going to look like this.&lt;/p&gt;</description></item><item><title>Experimenting With .NET Unit Testing</title><link>https://phillipsj.net/posts/experimenting-with-dotnet-unit-testing/</link><pubDate>Wed, 03 Mar 2021 19:39:29 -0500</pubDate><guid>https://phillipsj.net/posts/experimenting-with-dotnet-unit-testing/</guid><description>&lt;p&gt;While learning more about Go, I have started finding a few interesting approaches that differ from the typical conventions seen in .NET. I decided that I would experiment around with some of these differences. Two approaches have interested me, and we are doing to discuss one of them in this post. That one approach has been how to run tests with multiple inputs. The approach with xUnit and many other frameworks look like below. You can also pull &lt;a href="https://github.com/phillipsj/dotnet-unit-testing-experiments"&gt;this&lt;/a&gt; GitHub repo with all the code and then more in it.&lt;/p&gt;</description></item><item><title>.NET Global Tools With .NET Snap</title><link>https://phillipsj.net/posts/dotnet-global-tools-with-dotnet-snap/</link><pubDate>Sat, 27 Feb 2021 20:29:21 -0500</pubDate><guid>https://phillipsj.net/posts/dotnet-global-tools-with-dotnet-snap/</guid><description>&lt;p&gt;I have started to work with .NET again after taking a break. As usual, I am running some form of Ubuntu, and I have run into an interesting issue. I have been using the snap package, and I kept getting an interesting error when executing global tools.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;A fatal error occurred. The required library libhostfxr.so could not be found.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;If this is a self-contained application, that library should exist in 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;If this is a framework-dependent application, install the runtime in the global location &lt;span style="color:#ce5c00;font-weight:bold"&gt;[&lt;/span&gt;/usr/share/dotnet&lt;span style="color:#ce5c00;font-weight:bold"&gt;]&lt;/span&gt; or use the DOTNET_ROOT environment variable to specify the runtime location or register the runtime location in &lt;span style="color:#ce5c00;font-weight:bold"&gt;[&lt;/span&gt;/etc/dotnet/install_location&lt;span style="color:#ce5c00;font-weight:bold"&gt;]&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To correct this issue, you need to define the location of the &lt;em&gt;DOTNET_ROOT&lt;/em&gt;. The snap package location doesn&amp;rsquo;t seem to be in the default resolver. You can do it like this; make sure to add it to your &lt;em&gt;.bashrc&lt;/em&gt; or &lt;em&gt;.profile&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Rust Is Calling</title><link>https://phillipsj.net/posts/rust-is-calling/</link><pubDate>Sat, 30 Jan 2021 20:31:00 -0500</pubDate><guid>https://phillipsj.net/posts/rust-is-calling/</guid><description>&lt;p&gt;I have had a pretty deep interest in Rust the last couple of years. I feel about Rust like I felt about Python twelve years ago. I didn&amp;rsquo;t dive into Python then like I probably should have, and I will not let this interest go unanswered. I am going to try my best to invest my time outside of Terraform in Rust. So many features of the language that intrigues me. I have also decided that I have three projects that I am going to embark on doing to completion. These three projects will all be in Rust. I need to learn about compilers for one of these projects, and the other will be diving into web development with Rust. Both of these should be fun in addition to a straightforward tool that I have planned in Rust. I can&amp;rsquo;t identify what catches my interest in Rust just yet. Hopefully, the more time I spend with it, I will determine why that is.&lt;/p&gt;</description></item><item><title>Kotlin Native on openSUSE Tumbleweed</title><link>https://phillipsj.net/posts/kotlin-native-on-opensuse-tumbleweed/</link><pubDate>Fri, 29 Jan 2021 21:38:57 -0500</pubDate><guid>https://phillipsj.net/posts/kotlin-native-on-opensuse-tumbleweed/</guid><description>&lt;p&gt;I have started diving deeper into &lt;a href="https://kotlinlang.org"&gt;Kotlin&lt;/a&gt; and doing a little tinkering with Kotlin Native. I am using IntelliJ to make it easy, and I ran into an issue. After creating a new Kotlin Native project using the IntelliJ wizard, the &lt;a href="https://kotlinlang.org/docs/tutorials/native/using-intellij-idea.html"&gt;tutorial&lt;/a&gt; I ran into a build error. Here is the error I was getting when trying to run or build the project.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After a quick search, it seems that &lt;em&gt;libtinfo.so.5&lt;/em&gt; is related to the ncurses5 library and needs to be installed. openSUSE Tumbleweed has ncurses6 installed by default. A quick search with zypper displays both installed and available packages.&lt;/p&gt;</description></item><item><title>Raspberry Pi 400 Initial Impressions</title><link>https://phillipsj.net/posts/raspberry-pi-400-initial-impressions/</link><pubDate>Thu, 28 Jan 2021 20:18:02 -0500</pubDate><guid>https://phillipsj.net/posts/raspberry-pi-400-initial-impressions/</guid><description>&lt;p&gt;My Raspberry Pi 400 finally arrived. After being on backorder, I canceled and reordered with &lt;a href="https://www.canakit.com/"&gt;CanaKit&lt;/a&gt;, and it came less than a week later. I highly recommend CanaKit as they have been solid when ordering compared to a lot of places. Where do I start? Here it is.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://phillipsj.net/images/other-posts/pi400.jpg" alt="Image of Raspberry Pi 400 Kit"&gt;&lt;/p&gt;
&lt;h2 id="packaging-and-presentation"&gt;Packaging and Presentation&lt;/h2&gt;
&lt;p&gt;The packaging was fantastic and reminded me a lot of Apple. Many brands are following the Apple approach to packaging. As soon as I opened the box, I was greeted by the Pi 400. Underneath that were the boxes containing the power supply and the mouse. There is also an HDMI cable and SD card with &lt;a href="https://www.raspberrypi.org/software/"&gt;Raspberry Pi OS&lt;/a&gt;. The composite material used for the keyboard and accessories feels well made. The mouse is excellent, in my opinion, and I enjoy using it. The smaller size of the keyboard is a little tough to get used to, and it too has a nice feel to the keys. Compared to the Pinebook Pro, the keyboard is much nicer, and I haven&amp;rsquo;t missed any keystrokes with it.&lt;/p&gt;</description></item><item><title>Generating SSH Keys With Terraform</title><link>https://phillipsj.net/posts/generating-ssh-keys-with-terraform/</link><pubDate>Wed, 27 Jan 2021 20:07:31 -0500</pubDate><guid>https://phillipsj.net/posts/generating-ssh-keys-with-terraform/</guid><description>&lt;p&gt;I have been learning lots of new things about Terraform. I have spent a lot of time in some odd crevices of the documentation and code, and I still keep finding cool new features. This functionality is provided with the &lt;a href="https://registry.terraform.io/providers/hashicorp/tls/latest"&gt;TLS&lt;/a&gt; provider. I will show you how to leverage the &lt;a href="https://registry.terraform.io/providers/hashicorp/tls/latest/docs/resources/private_key"&gt;tls_private_key&lt;/a&gt; resource to generate an SSH key and assign that key to a Linode server we will create. Let&amp;rsquo;s get into it.&lt;/p&gt;</description></item><item><title>Not Feeling It</title><link>https://phillipsj.net/posts/not-feeling-it/</link><pubDate>Tue, 26 Jan 2021 19:11:15 -0500</pubDate><guid>https://phillipsj.net/posts/not-feeling-it/</guid><description>&lt;p&gt;Sometimes you feel like doing something and sometimes you don&amp;rsquo;t. I am not feeling very motivated to blog today and that&amp;rsquo;s okay. I have a few different technical posts that I would like to do and I need to get back to working on my self-hosted setup running on LKE.&lt;/p&gt;
&lt;p&gt;Thanks for reading,&lt;/p&gt;
&lt;p&gt;Jamie&lt;/p&gt;</description></item><item><title>Cloud-Init With Terraform</title><link>https://phillipsj.net/posts/cloud-init-with-terraform/</link><pubDate>Mon, 25 Jan 2021 19:42:07 -0500</pubDate><guid>https://phillipsj.net/posts/cloud-init-with-terraform/</guid><description>&lt;p&gt;Did you know that you could use &lt;a href="https://cloud-init.io/"&gt;cloud-init&lt;/a&gt; with Terraform? I didn&amp;rsquo;t realize until recently. No, I am not talking about a template and passing it via user data, but defining a cloud-init template in Terraform. Let&amp;rsquo;s get into it.&lt;/p&gt;
&lt;h2 id="the-plan"&gt;The Plan&lt;/h2&gt;
&lt;p&gt;Pick your favorite cloud provider to try this, as all you need is a Linux VM. I will be using Azure to spin up an Ubuntu server and apply a cloud-init template. I will have cloud-init install the tool &lt;a href="https://httpie.io/"&gt;HTTPie&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Terraforming AWS IAM Policies</title><link>https://phillipsj.net/posts/terraforming-aws-iam-policies/</link><pubDate>Sun, 24 Jan 2021 16:48:16 -0500</pubDate><guid>https://phillipsj.net/posts/terraforming-aws-iam-policies/</guid><description>&lt;p&gt;Working with IAM policies and roles in AWS is often very trying. Writing all of that JSON is painful to me personally and doing the JSON inline when using Terraform is even more frustrating. This weekend, I found out that you can write IAM policies using a Terraform data resource that will then output the JSON so it can be consumed in a policy or role resource. I find that very exciting, so I thought I would share. Another benefit is that you will get some help writing the policy because of the Terraform objects.&lt;/p&gt;</description></item><item><title>openSUSE One Month Review</title><link>https://phillipsj.net/posts/opensuse-one-month-review/</link><pubDate>Sat, 23 Jan 2021 12:17:41 -0500</pubDate><guid>https://phillipsj.net/posts/opensuse-one-month-review/</guid><description>&lt;p&gt;I started my &lt;a href="https://www.phillipsj.net/posts/opensuse-for-a-month/"&gt;openSUSE for a month&lt;/a&gt; 34 days ago. I started with one system running openSUSE Tumbleweed, and now I have three systems running openSUSE, two running Tumbleweed, and one running Leap. I guess at this point, you have realized I am hooked. openSUSE has been a surprisingly good distribution regardless if choosing Leap or Tumbleweed. I haven&amp;rsquo;t had one single issue occur this entire time. Some items have required some additional configuration compared to Ubuntu, but not many more compared to Fedora. Let me break down my experiences so others can get an idea of the different areas I think are notable. Tumbleweed has easily been the best rolling distro experience that I have ever experienced.&lt;/p&gt;</description></item><item><title>There Is Enough Space for Everyone</title><link>https://phillipsj.net/posts/there-is-enough-space-for-everyone/</link><pubDate>Fri, 22 Jan 2021 20:24:52 -0500</pubDate><guid>https://phillipsj.net/posts/there-is-enough-space-for-everyone/</guid><description>&lt;p&gt;There is enough space for everyone. This needs to be said. I am tired of seeing communities and projects compete for what they perceive as limited resources. More people are getting into software development every day. All people need choice and room to decide what languages, frameworks, and tools they want to use. Naturally, the means that people prefer will rise to the top. Will these tools always be the most sound, the best technology, or the best user experience? We all know the answer, probably not. What I do know is that we still need the competition. The competition drives innovation and improvement. If that happens, then all the languages, frameworks, and tools will get better.&lt;/p&gt;</description></item><item><title>Creating a Miniflux Kubernetes Terraform Module</title><link>https://phillipsj.net/posts/creating-a-miniflux-kubernetes-terraform-module/</link><pubDate>Thu, 21 Jan 2021 14:56:34 -0500</pubDate><guid>https://phillipsj.net/posts/creating-a-miniflux-kubernetes-terraform-module/</guid><description>&lt;p&gt;I posted a few days ago that I thought that leveraging Terraform for creating Kubernetes resoures is under utilized. With that being repeated again, I decided that I would build a module for deploying &lt;a href="https://miniflux.app/"&gt;miniflux&lt;/a&gt; to my Linode k8s cluster.&lt;/p&gt;
&lt;h2 id="the-plan"&gt;The Plan&lt;/h2&gt;
&lt;p&gt;There are some examples for &lt;a href="https://miniflux.app/docs/installation.html#docker"&gt;Docker and Docker compose&lt;/a&gt; in the documentation that we will be using to get this up and running. The official image is using Alpine as the base and we will use the PostgreSQL Alpine base too for our database. I am not planning to actually provision any external storage for the PostgreSQL as making periodic backups should be sufficient for a personal feed reader. I do plan to put some resource limits in place too, just not immediately.&lt;/p&gt;</description></item><item><title>Migrating from Local State to Remote State in Terraform</title><link>https://phillipsj.net/posts/migrating-from-local-state-to-remote-state-in-terraform/</link><pubDate>Thu, 21 Jan 2021 09:27:28 -0500</pubDate><guid>https://phillipsj.net/posts/migrating-from-local-state-to-remote-state-in-terraform/</guid><description>&lt;p&gt;Today is my birthday, and I took the day off. It&amp;rsquo;s raining outside at the moment, so what&amp;rsquo;s better to do than getting some personal tech stuff handled and blog about it at the same time. Yesterday, I wrote this &lt;a href="https://www.phillipsj.net/posts/postgresql-backend-for-terraform/"&gt;post&lt;/a&gt; about the PostgreSQL backend for Terraform. Today, I will show how to take a local Terraform state and migrate that to a remote backend. If you are new to Terraform backends, you should hop over and check out my &lt;a href="https://www.phillipsj.net/posts/discussion-of-terraform-backends/"&gt;discussion&lt;/a&gt; of them. My preference and recommendation are to use a remote backend that supports locking, especially if working on a team.&lt;/p&gt;</description></item><item><title>PostgreSQL Backend for Terraform</title><link>https://phillipsj.net/posts/postgresql-backend-for-terraform/</link><pubDate>Wed, 20 Jan 2021 20:43:17 -0500</pubDate><guid>https://phillipsj.net/posts/postgresql-backend-for-terraform/</guid><description>&lt;p&gt;I have started configuring my Kubernetes cluster to begin doing some self-hosting of a few small services that I have determined to be critical and not something I want to depend on an external service. As part of that, I figured an &lt;a href="https://www.phillipsj.net/posts/terraforming-a-linode-kubernetes-cluster/"&gt;LKE cluster&lt;/a&gt; on Linode. I am using Terraform to do all of that configuration, and I decided that I need to use a remote backend for my Terraform state.&lt;/p&gt;</description></item><item><title>Pinebook Pro Hugo Performance Compared</title><link>https://phillipsj.net/posts/pinebook-pro-hugo-performance-compared/</link><pubDate>Tue, 19 Jan 2021 19:50:27 -0500</pubDate><guid>https://phillipsj.net/posts/pinebook-pro-hugo-performance-compared/</guid><description>&lt;p&gt;I decided to finally do a tiny little benchmark comparing my Pinebook Pro to the other three devices that I use regularly. The benchmark will be building my blog using Hugo v0.80.0 to see how they perform relative to each other. I use the following commit &lt;a href="https://gitlab.com/phillipsj/phillipsj/-/tree/a62eabffaac779b7b288144d9bfd02b8bb143e8a"&gt;a62eabffaac779b7b288144d9bfd02b8bb143e8a&lt;/a&gt; from my GitLab repo. Hugo builds 755 pages along with a couple of hundred alias and static files. The results are kind of interesting, and the difference was shocking and unexpected at the same time. Before I show the results, let&amp;rsquo;s talk about the machines that we will be comparing.&lt;/p&gt;</description></item><item><title>Observations of openSUSE Battery Life</title><link>https://phillipsj.net/posts/observations-of-opensuse-battery-life/</link><pubDate>Mon, 18 Jan 2021 19:44:55 -0500</pubDate><guid>https://phillipsj.net/posts/observations-of-opensuse-battery-life/</guid><description>&lt;p&gt;I sat down to write this post and didn&amp;rsquo;t realize that I had crossed the one month mark using openSUSE. That is a good sign, and the post for that is incoming. With that, I wanted to discuss my ad-hoc experience with battery life and openSUSE. I have been using Tumbleweed and Leap on two different laptops. One is an Asus Zenbook, and the other is a Thinkpad x260. Now I have run all kinds of distros on my Thinkpad, and the Zenbook that I received as a hand me down I have only experienced with Windows before openSUSE. What I have noticed is that battery life doesn&amp;rsquo;t seem to be as good as I would expect. I know that on the Thinkpad, running Leap, Ubuntu and Manjaro appears to have slightly better battery life. By marginally better, I feel that is probably half an hour difference. I haven&amp;rsquo;t had as much experience with the Zenbook; however, I think it behaves much like the Thinkpad. I will have to do some more formal testing or see if any known tweaks need to happen. If you happen to know of any, please reach out and tell me.&lt;/p&gt;</description></item><item><title>Dynamically Loaded Terraform Providers</title><link>https://phillipsj.net/posts/dynamically-loaded-terraform-providers/</link><pubDate>Sun, 17 Jan 2021 20:23:42 -0500</pubDate><guid>https://phillipsj.net/posts/dynamically-loaded-terraform-providers/</guid><description>&lt;p&gt;Typically, Terraform providers are loaded when Terraform executes. This means that your configuration for the provider has to be set before you run any Terraform command. There are some situations where you need information from your Terraform execution to configure a provider. This can be a challenge and not super obvious if you need to do it. Let&amp;rsquo;s dive into a scenario where this exists.&lt;/p&gt;
&lt;p&gt;As I mentioned in the introduction, you may need to get the configuration from executing Terraform to configure another provider. The case that immediately comes to mind for me is when working with Kubernetes. You use Terraform to create the Kubernetes cluster, and then you want to use the Kubernetes provider to bootstrap some manifests in your cluster. The problem is that you won&amp;rsquo;t have your &lt;em&gt;.kubeconfig&lt;/em&gt; until the creation of the cluster, so you can&amp;rsquo;t use the provider. This is where having the ability to load a provider during execution dynamically comes into play. Terraform will, in fact, allow you to pull the &lt;em&gt;.kubeconfig&lt;/em&gt; from your created cluster and use that in your Kubernetes provider. It just requires an odd implementation.&lt;/p&gt;</description></item><item><title>My Blog Has Moved to GitLab</title><link>https://phillipsj.net/posts/my-blog-has-moved-to-gitlab/</link><pubDate>Sat, 16 Jan 2021 12:50:22 -0500</pubDate><guid>https://phillipsj.net/posts/my-blog-has-moved-to-gitlab/</guid><description>&lt;p&gt;I have officially migrated the source code for this blog to GitLab. GitLab became the front runner in the migration because it supports signed commits just like GitHub does. I have been able to wire that up with Netlify seamlessly, and everything is working. The most challenging part was waiting on the import from GitLab to GitHub. GitLab has made that extremely easy to do, pick the repository and click on import. My issues migrated as part of that process, which is even nicer.&lt;/p&gt;</description></item><item><title>The Kubernetes Terraform Provider Is Often Overlooked</title><link>https://phillipsj.net/posts/the-kubernetes-terraform-provider-is-often-overlooked/</link><pubDate>Fri, 15 Jan 2021 19:14:40 -0500</pubDate><guid>https://phillipsj.net/posts/the-kubernetes-terraform-provider-is-often-overlooked/</guid><description>&lt;p&gt;I wrote a post title &lt;a href="https://www.phillipsj.net/posts/k8s-yaml-alternative-terraform/"&gt;K8s YAML Alternative: Terraform&lt;/a&gt; almost a year ago. That post explored using Terraform to create resources in Kubernetes instead of YAML manifests or other alternatives like Helm. In the last year, I haven&amp;rsquo;t seen many posts or articles about using Terraform to do it. I find that a little odd that it hasn&amp;rsquo;t gotten a more comprehensive adoption than what it appears to have. Helm has some advantages and challenges, with the biggest, in my opinion, being the templating system. Go templates aren&amp;rsquo;t that bad, just challenging to learn. Kustomize has come along and seems to be gaining a lot of adoption. The ability to write YAML manifests, then compose those together has a lot of advantages. These are good options depending on the tools that already exist in your stack. Many shops are leveraging Terraform to do infrastructure-as-code, which makes me wonder why they aren&amp;rsquo;t using Terraform for Kubernetes. The modularity that is provided by these other tools is also available in Terraform. The new HCL 2.0 syntax brings a lot of extra power to what one can achieve with Terraform. I am planning some posts to walk through setting up modules for a personal Kubernetes project. I will put those modules out on GitHub for others to consume and use them to compose new modules to build more complex modules. I genuinely believe that Terraform and modules can replace a large chunk of Helm&amp;rsquo;s functionality, and it will be friendlier to use than either it or Kustomize. I encourage you to read the post from last year to see what is possible.&lt;/p&gt;</description></item><item><title>openSUSE's Firewall and KDE Connect</title><link>https://phillipsj.net/posts/opensuses-firewall-and-kde-connect/</link><pubDate>Thu, 14 Jan 2021 20:33:47 -0500</pubDate><guid>https://phillipsj.net/posts/opensuses-firewall-and-kde-connect/</guid><description>&lt;p&gt;I have become a fan of KDE&amp;rsquo;s Plasma desktop and their awesome tool called &lt;a href="https://kdeconnect.kde.org/"&gt;KDE Connect&lt;/a&gt;. KDE Connect provides integration between the Plasma desktop and your smartphone. You pair your device running the KDE Connect mobile app with all your computers that run KDE Connect. It allows you to share links between browsers, SMS messages, clipboard sharing, control media, remote input, etc. There is a ton of functionality out of the box with plenty of extras that can be installed. The two features I use the most is the link and clipboard sharing, this allows me to send something to my phone when I need to go do something else and when I find a new piece of information, I can share it back to any of my connected computers.&lt;/p&gt;</description></item><item><title>Automation Empowers People Not Replaces</title><link>https://phillipsj.net/posts/automation-empowers-people-not-replaces/</link><pubDate>Wed, 13 Jan 2021 19:10:15 -0500</pubDate><guid>https://phillipsj.net/posts/automation-empowers-people-not-replaces/</guid><description>&lt;p&gt;I posted this on Twitter today. I genuinely believe that automation empowers people and doesn&amp;rsquo;t replace people. That is a significant concern with DevOps from many. The more automation that happens in a system, the more time that is freed. That time goes back to you or your team. A common complaint with teams is that they need more people or never have the time to improve their quality of life. Automating the more mundane tasks gives people more time to improve the work-life. It also gives back mental capacity. Not having to think about these tasks reduces that cognitive load to apply that to other problems or be more relaxed. Both outcomes are a big win for the mental health of a team.&lt;/p&gt;</description></item><item><title>Upgrading Hugo Version on Netlify</title><link>https://phillipsj.net/posts/upgrading-hugo-version-on-netlify/</link><pubDate>Tue, 12 Jan 2021 19:26:54 -0500</pubDate><guid>https://phillipsj.net/posts/upgrading-hugo-version-on-netlify/</guid><description>&lt;p&gt;I haven&amp;rsquo;t upgraded the version of Hugo that I am using to build my site on Netlify for a few versions. I decided today that I would perform some of this maintenance and bring you all along for the ride.&lt;/p&gt;
&lt;p&gt;In the repository for this blog, there is a &lt;em&gt;netlify.toml&lt;/em&gt; file used to define the configuration for Netlify. You can read more about this file &lt;a href="https://docs.netlify.com/configure-builds/file-based-configuration/"&gt;here&lt;/a&gt;. Here is mine.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-TOML" data-lang="TOML"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#000"&gt;build&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;publish&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;public&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;command&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;hugo --gc --minify&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#000"&gt;context&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;production&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;environment&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;HUGO_VERSION&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;0.75.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;HUGO_ENV&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;production&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;HUGO_ENABLEGITINFO&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#000"&gt;context&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;deploy-preview&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;environment&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;HUGO_VERSION&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;0.75.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;[[&lt;/span&gt;&lt;span style="color:#000"&gt;headers&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;for&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;rss.*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#000"&gt;headers&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;values&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;Content-Type&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;application/rss+xml; charset=UTF-8&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;[[&lt;/span&gt;&lt;span style="color:#000"&gt;headers&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;for&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;*.rss&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#000"&gt;headers&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;values&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;Content-Type&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;application/rss+xml; charset=UTF-8&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;[[&lt;/span&gt;&lt;span style="color:#000"&gt;redirects&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;from&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;/feed.rss&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;to&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;/posts/index.xml&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;status&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#0000cf;font-weight:bold"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;[[&lt;/span&gt;&lt;span style="color:#000"&gt;redirects&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;from&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;/atom.rss&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;to&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;/posts/index.xml&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;status&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#0000cf;font-weight:bold"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I don&amp;rsquo;t have much in this file. You can see on lines 6 and 11 that I define the version of Hugo to use for building both the production and preview environments. Hugo 0.75.1 is about three months old and is even behind what I use locally to test the site. Let&amp;rsquo;s check my local Hugo version.&lt;/p&gt;</description></item><item><title>Removing Google Analytics</title><link>https://phillipsj.net/posts/removing-google-analytics/</link><pubDate>Mon, 11 Jan 2021 19:33:39 -0500</pubDate><guid>https://phillipsj.net/posts/removing-google-analytics/</guid><description>&lt;p&gt;Today is the day that I am going to remove Google Analytics from my blog. I have had it enabled on my site since I first started blogging. While it is nice to have this metrics, there are tool feelings that I have about it. The first is that I want to respect people&amp;rsquo;s privacy. Until I can find a better method for getting only page view information without any other data then I don&amp;rsquo;t want it enabled. I also don&amp;rsquo;t want to provide Google any additional information than what they are able to already collect. I have researched a few alternatives, but I am not in any hurry.&lt;/p&gt;</description></item><item><title>openSUSE Leap Compared To openSUSE Tumbleweed</title><link>https://phillipsj.net/posts/opensuse-leap-compared-to-opensuse-tumbleweed/</link><pubDate>Sun, 10 Jan 2021 19:56:01 -0500</pubDate><guid>https://phillipsj.net/posts/opensuse-leap-compared-to-opensuse-tumbleweed/</guid><description>&lt;p&gt;I am getting closer to my month-long challenge of running some version of openSUSE. During this time, I have started to get a decent feel for each version as I use both daily. In my use, I have noticed that I am beginning to prefer Tumbleweed. Leap has been rock solid, and so has Tumbleweed. Leap doesn&amp;rsquo;t feel stale like Centos/RHEL or Debian. It feels more in line with Ubuntu as far as that fresh and stable feel. Updates work great with Leap as they have with Tumbleweed. Honestly, I haven&amp;rsquo;t experienced a single issue with either. The most significant difference is that Leap does tend to have just a touch older version of packages. Leap also seems to favor LTS versions of packages that, given its purpose, it&amp;rsquo;s not unexpected.&lt;/p&gt;</description></item><item><title>Review of Hotshot Racing</title><link>https://phillipsj.net/posts/review-of-hotshot-racing/</link><pubDate>Sat, 09 Jan 2021 13:33:15 -0500</pubDate><guid>https://phillipsj.net/posts/review-of-hotshot-racing/</guid><description>&lt;p&gt;Yesterday I made mention of &lt;a href="https://store.steampowered.com/app/609920/Hotshot_Racing/"&gt;Hotshot Racing&lt;/a&gt;. I decided that while I am trying to get in a better mental state, I would review the game. This game has been my favorite racing game since Gran Tourismo and Gran Tourismo 2 for the Playstation. It is just an arcade-style racing game, yet it has a lot of depth. There eight different characters that each have four cars. That is a total of 32 vehicles, and I feel that each handles differently, which is nice.&lt;/p&gt;</description></item><item><title>Mental Exhaustion</title><link>https://phillipsj.net/posts/mental-exhaustion/</link><pubDate>Fri, 08 Jan 2021 20:14:20 -0500</pubDate><guid>https://phillipsj.net/posts/mental-exhaustion/</guid><description>&lt;p&gt;I am mentally exhausted from this past week. It is even difficult sitting down and trying to write a post let alone all the other stuff that I have had to do this week. I challenged myself to write everyday so I am doing just that. I guess it&amp;rsquo;s better to get it down so when I look back at this post I will be able to recall what it was like. I have been finding video games enjoyable again, especially &lt;a href="https://store.steampowered.com/app/609920/Hotshot_Racing/"&gt;Hotshot Racing&lt;/a&gt;. It is a great arcade style racing game with a modern feel. I have been running it on openSUSE Tumbleweed via Proton without a single issue. Both the Logitech F310 and Playstation 4 Dual Shock controller work wonderfully. This has been the most enjoyment I have had from video games in years. This winter has turned out to be a difficult one so far and I am looking forward to the spring.&lt;/p&gt;</description></item><item><title>The OSS Journey So Far</title><link>https://phillipsj.net/posts/the-oss-journey-so-far/</link><pubDate>Thu, 07 Jan 2021 19:22:03 -0500</pubDate><guid>https://phillipsj.net/posts/the-oss-journey-so-far/</guid><description>&lt;p&gt;I started software development in 2007 with the .NET framework in Austin, TX. Little did I know at the time that it was located in a bubble that would heavily influence me. I got into open-source software shortly after that, not realizing that in 2010 &lt;a href="https://lostechies.github.io/fiesta/"&gt;Pablo&amp;rsquo;s Fiesta&lt;/a&gt; was there in that bubble too. Around that time, I started hearing about DevOps, again it was 2010 and in Austin, and that started driving my choices. GitHub was becoming a thing, so learning git moved up on the list, which brought more interest in Linux. GitHub was written in this thing called Ruby on Rails, and I started learning about that too. Shortly after, projects like Castle MonoRail and ASP .NET MVC began to come on my radar. Then ALT .NET was a thing, and we had projects like NancyFX, FubuMVC, etc. I was swimming in OSS and did not know what I was in the center of at that time.&lt;/p&gt;</description></item><item><title>Installing Node.js on openSUSE</title><link>https://phillipsj.net/posts/installing-nodejs-on-opensuse/</link><pubDate>Wed, 06 Jan 2021 19:05:41 -0500</pubDate><guid>https://phillipsj.net/posts/installing-nodejs-on-opensuse/</guid><description>&lt;p&gt;I have been slowly working through the setup on openSUSE, and now I need Node.js installed. A quick search using &lt;em&gt;zypper&lt;/em&gt; for &lt;em&gt;node&lt;/em&gt; produced a lot of results. All the LTS, Long Term Support, versions are available in the repositories by default, which is refreshing, including Leap. That isn&amp;rsquo;t always the case with Debian based systems, so I was surprised. I decided that I would install Node.js v14 as that is the latest LTS. I ran the following command.&lt;/p&gt;</description></item><item><title>Flatpak Without sudo on openSUSE</title><link>https://phillipsj.net/posts/flatpak-without-sudo-on-opensuse/</link><pubDate>Tue, 05 Jan 2021 20:05:43 -0500</pubDate><guid>https://phillipsj.net/posts/flatpak-without-sudo-on-opensuse/</guid><description>&lt;p&gt;I have been using Flatpak for the last few years. I have used it on numerous distros in that time, and openSUSE is the first time I ran into any quirks. It seems that on openSUSE, without an additional configuration, you have executed Flatpak commands with admin privileges. Searching didn&amp;rsquo;t turn up anything, so I opened YaST to check if a group was created for Flatpak that I wasn&amp;rsquo;t assigned. In YaST, that would be &lt;em&gt;Security and Users &amp;ndash;&amp;gt; User and Group Management&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>openSUSE, Samba, and the Firewall</title><link>https://phillipsj.net/posts/opensuse-samba-and-the-firewall/</link><pubDate>Mon, 04 Jan 2021 19:04:59 -0500</pubDate><guid>https://phillipsj.net/posts/opensuse-samba-and-the-firewall/</guid><description>&lt;p&gt;I have been using either openSUSE Leap 15.2 or Tumbleweed for the last couple of weeks. As I continue to learn the system, one item that I need to work is connecting to my NAS. All systems are different, yet most distros have this working out of the box; openSUSE just required a little configuration. After digging around, I realized that the firewall wasn&amp;rsquo;t allowing Samba traffic.&lt;/p&gt;
&lt;p&gt;Let me show you how to configure openSUSE to have it work.&lt;/p&gt;</description></item><item><title>Pull Requests and Code Reviews</title><link>https://phillipsj.net/posts/pull-requests-and-code-reviews/</link><pubDate>Sun, 03 Jan 2021 12:47:07 -0500</pubDate><guid>https://phillipsj.net/posts/pull-requests-and-code-reviews/</guid><description>&lt;p&gt;Pull requests, which I will be calling PRs, seem to be too controversial lately, so have code reviews. These two get lumped together because we typically see PRs required code reviews for approval. While these do tend to lumped together, they are, in fact, orthogonal concerns. You don&amp;rsquo;t have to have PRs to do code reviews, and you don&amp;rsquo;t have to have code reviews with your PRs. Let&amp;rsquo;s talk about each separately.&lt;/p&gt;</description></item><item><title>Terraforming a Linode Kubernetes Cluster</title><link>https://phillipsj.net/posts/terraforming-a-linode-kubernetes-cluster/</link><pubDate>Sat, 02 Jan 2021 12:35:36 -0500</pubDate><guid>https://phillipsj.net/posts/terraforming-a-linode-kubernetes-cluster/</guid><description>&lt;p&gt;I have been wanting to start self-hosting some services myself. I don&amp;rsquo;t mind paying for services if I know they will be around and respect my privacy. After a little research, I decided that I would host a Kubernetes cluster on either Linode or Digital Ocean because they offer some of the best pricing for what I need. After a little research, I decided that I would use Linode. I plan to host a single node cluster, which should cost be about ten dollars per month. Digital Ocean is the only other provider that can touch that price. That is a really small node, which will be enough to host the few things I need to at the moment. I can quickly scale up as needed.&lt;/p&gt;</description></item><item><title>Installing Go on openSUSE</title><link>https://phillipsj.net/posts/installing-go-on-opensuse/</link><pubDate>Fri, 01 Jan 2021 13:52:58 -0500</pubDate><guid>https://phillipsj.net/posts/installing-go-on-opensuse/</guid><description>&lt;p&gt;I have been using Go a lot lately. There are several open source projects that I want to be more involved with, and they all use Go. Since I have been using openSUSE, both Leap and Tumbleweed, I thought I would share how to get Go installed. The nice thing about the openSUSE packages for Go is that they include a script that will configure all the environment variables for you after a reboot. You can read more here on the &lt;a href="https://en.opensuse.org/SDB:Go"&gt;wiki&lt;/a&gt;. Let&amp;rsquo;s add the Go repository so we can install the packages.&lt;/p&gt;</description></item><item><title>Convert Compose Files to Kubernetes Manifests With Kompose</title><link>https://phillipsj.net/posts/convert-compose-files-to-kubernetes-manifests-with-kompose/</link><pubDate>Thu, 31 Dec 2020 12:54:14 -0500</pubDate><guid>https://phillipsj.net/posts/convert-compose-files-to-kubernetes-manifests-with-kompose/</guid><description>&lt;p&gt;A few posts back, I discussed creating a &lt;a href="https://www.phillipsj.net/posts/self-hosted-rss-using-miniflux/"&gt;compose&lt;/a&gt; file for Miniflux. I will deploy Miniflux to Kubernetes, and I could convert this to a Kubernetes manifest by hand. However, it&amp;rsquo;s been a while since I have given &lt;a href="https://kompose.io/"&gt;Kompose&lt;/a&gt; a spin in a year or so. I decided this would be an excellent time to give it a try again. Let&amp;rsquo;s get it installed so we can convert that Docker compose file.&lt;/p&gt;</description></item><item><title>The Phrase: You Don't Need It</title><link>https://phillipsj.net/posts/the-phrase-you-dont-need-it/</link><pubDate>Wed, 30 Dec 2020 20:20:09 -0500</pubDate><guid>https://phillipsj.net/posts/the-phrase-you-dont-need-it/</guid><description>&lt;p&gt;Isn&amp;rsquo;t it funny? We tell people what tech they need to use and what tech they don&amp;rsquo;t need to use. We don&amp;rsquo;t even know what problems they are trying to solve. The promotion of tech for universal application has been detrimental to many. On the other side, telling people, they don&amp;rsquo;t need something without context is just as bad. I agree that starting with a well-traveled path and building your way into more niche solutions is a safe way to approach many problems. You don&amp;rsquo;t often know as much about the situation when you start, and as you learn more, you refactor to these techniques. You may very well find that you didn&amp;rsquo;t need that piece of tech or approach. End the end, and it is all about delivering solutions and solving a problem for real users/customers. If you observe many patterns from computing history, you will see a lot of similarities to things today.&lt;/p&gt;</description></item><item><title>openSUSE Kubernetes Dev With kind</title><link>https://phillipsj.net/posts/opensuse-kubernetes-dev-with-kind/</link><pubDate>Tue, 29 Dec 2020 21:29:40 -0500</pubDate><guid>https://phillipsj.net/posts/opensuse-kubernetes-dev-with-kind/</guid><description>&lt;p&gt;Yesterday I discussed getting openSUSE configured for doing DevOps and Kubernetes work. I ended with settling on &lt;a href="https://kind.sigs.k8s.io/"&gt;kind&lt;/a&gt; as my solution for a local Kubernetes cluster. I have done a little research. It seems back in April, and there were some issues around kind and Btrfs, which has been closed with a fix. All that is left now is to create a cluster and deploy something to make sure that it works. Let&amp;rsquo;s jump in.&lt;/p&gt;</description></item><item><title>Configuring openSUSE for DevOps and Kubernetes</title><link>https://phillipsj.net/posts/configuring-opensuse-for-devops-and-kubernetes/</link><pubDate>Mon, 28 Dec 2020 20:11:26 -0500</pubDate><guid>https://phillipsj.net/posts/configuring-opensuse-for-devops-and-kubernetes/</guid><description>&lt;p&gt;I am always looking for newer ways to get a system configured for what I like to experiment with and write blog posts. I am in the process of getting openSUSE setup, so I thought I would bring everyone along for the journey. Here is the list of tools that I know that I need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Terraform&lt;/li&gt;
&lt;li&gt;Packer&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Docker-Compose&lt;/li&gt;
&lt;li&gt;kubectl&lt;/li&gt;
&lt;li&gt;Local K8s cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have already checked out what is available in the openSUSE repositories and openSUSE OBS. Unfortunately, most of these are just not immediately available, and the ones that may be in OBS are from individuals, which gives me a little pause. Let&amp;rsquo;s start with the native packages, and then we can jump into the other solution.&lt;/p&gt;</description></item><item><title>Self-Hosted RSS Using Miniflux</title><link>https://phillipsj.net/posts/self-hosted-rss-using-miniflux/</link><pubDate>Sun, 27 Dec 2020 20:07:12 -0500</pubDate><guid>https://phillipsj.net/posts/self-hosted-rss-using-miniflux/</guid><description>&lt;p&gt;I was all set to use TinyTinyRSS for my self-hosted RSS feed when someone messaged me on LinkedIn and suggest that I take a look at &lt;a href="https://github.com/miniflux/v2"&gt;Miniflux&lt;/a&gt;. I only gave Miniflux a passing glance because I wanted something that had a mobile app. After getting the message, I decided I would look closer at the project.&lt;/p&gt;
&lt;p&gt;Miniflux is in Go with the goal of being minimalistic. The UI is very basic yet is clear and concise. It doesn&amp;rsquo;t have much JavaScript, some ES6, yep no fancy libraries, to handle a few items, and it&amp;rsquo;s progressive, so it works well with mobile. It is backed by PostgreSQL, just like TinyTinyRSS is, and does come with the ability to do migrations. It has a heavy privacy focus by removing tracking pixels, playing YouTube videos directly, and pulling the original URLs instead of proxies like FeedBurner. Those are all cool features that also go along with my idea of self-hosting.&lt;/p&gt;</description></item><item><title>Rustup and Kate: All You Need for Rust Development</title><link>https://phillipsj.net/posts/rustup-and-kate-all-you-need-for-rust-development/</link><pubDate>Sat, 26 Dec 2020 19:07:12 -0500</pubDate><guid>https://phillipsj.net/posts/rustup-and-kate-all-you-need-for-rust-development/</guid><description>&lt;p&gt;I like working with Rust, and &lt;a href="https://rustup.rs/"&gt;rustup&lt;/a&gt; is one of those tools that make it enjoyable. Installing a single tool that helps you manage your Rust environment is fantastic, and it helps update it as you need. They did a great job of making it a cross-platform tool to keep it consistent. One of the other features of rustup is that you can install additional components like &lt;a href="https://github.com/rust-lang/rls"&gt;RLS&lt;/a&gt;, the Rust Language Server. RLS is an LSP, language server protocol, implementation for Rust used with many editors, even Kate. Kate is an official KDE application, so it should be available, if not already installed, on most Linux distros that have KDE available. It is one of my favorite text editors and is lightweight. I am going to walk you through getting RLS installed, and Kate configured to leverage it.&lt;/p&gt;</description></item><item><title>Steam on openSUSE Tumbleweed</title><link>https://phillipsj.net/posts/steam-on-opensuse-tumbleweed/</link><pubDate>Fri, 25 Dec 2020 12:00:07 -0500</pubDate><guid>https://phillipsj.net/posts/steam-on-opensuse-tumbleweed/</guid><description>&lt;p&gt;I have heard a lot about &lt;a href="https://store.steampowered.com/app/609920/Hotshot_Racing/"&gt;Hotshot Racing&lt;/a&gt; on the &lt;a href="https://ubuntupodcast.org/"&gt;Ubuntu Podcast&lt;/a&gt;, so I wanted to check it out. I had recently installed &lt;a href="https://www.phillipsj.net/posts/opensuse-tumbleweed-initial-thoughts/"&gt;openSUSE Tumbleweed&lt;/a&gt; on my desktop, and I was curious if setting up Steam would be challenging or not on it. I immediately decided to check the repositories by searching using zypper.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo zypper search steam
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;S &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; Name &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; Summary &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; Type
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---+-----------------------------+-------------------------------------------------------------+--------
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; bitlbee-steam &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; Steam protocol plugin &lt;span style="color:#204a87;font-weight:bold"&gt;for&lt;/span&gt; BitlBee &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; package
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; ca-certificates-steamtricks &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; Provides /etc/ssl/certs/ca-certificates.crt &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; package
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; libopenssl1_0_0-steam &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; Secure Sockets and Transport Layer Security &lt;span style="color:#204a87;font-weight:bold"&gt;for&lt;/span&gt; steam &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; package
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; libopenssl1_0_0-steam-32bit &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; Secure Sockets and Transport Layer Security &lt;span style="color:#204a87;font-weight:bold"&gt;for&lt;/span&gt; steam &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; package
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; libpurple-plugin-libsteam &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; Steam plugin &lt;span style="color:#204a87;font-weight:bold"&gt;for&lt;/span&gt; libpurple &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; package
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; pidgin-plugin-libsteam &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; Steam plugin &lt;span style="color:#204a87;font-weight:bold"&gt;for&lt;/span&gt; Pidgin &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; package
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; steam &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; Installer &lt;span style="color:#204a87;font-weight:bold"&gt;for&lt;/span&gt; Valve&lt;span style="color:#a40000"&gt;&amp;#39;&lt;/span&gt;s digital software distribution service &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; package
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; steam-devices &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; Device support &lt;span style="color:#204a87;font-weight:bold"&gt;for&lt;/span&gt; Steam-related hardware &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; package
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; steamcmd &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; Command-line version of the Steam client &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; package
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; steamtricks &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; Workarounds &lt;span style="color:#204a87;font-weight:bold"&gt;for&lt;/span&gt; problems with Steam on Linux &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; package
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; steamtricks-data &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; Steamtricks companion data repository &lt;span style="color:#000;font-weight:bold"&gt;|&lt;/span&gt; package
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I wasn&amp;rsquo;t too surprised that it was available and there are also some packages for devices and tricks. These two packages get installed when you install Steam. Now that I know it exists, I just ran the install command in zypper.&lt;/p&gt;</description></item><item><title>openSUSE Leap Initial Impressions</title><link>https://phillipsj.net/posts/opensuse-leap-initial-impressions/</link><pubDate>Thu, 24 Dec 2020 14:35:16 -0500</pubDate><guid>https://phillipsj.net/posts/opensuse-leap-initial-impressions/</guid><description>&lt;p&gt;I finally got openSUSE Leap installed on my Thinkpad. It is running kernel 5.3.18, which should be sufficient for this 4+-year-old Thinkpad. So far, all the hardware works as expected with no issues. Leap is the non-rolling release that tracks with SUSE Linux Enterprise Linux, SLES, and tends to touch on the older software and favors the LTS versions. Of course, I installed KDE Plasma as my desktop, which is version 5.18, the LTS version. While there a few small differences, the user avatar issue doesn&amp;rsquo;t exist, which is good to know. If there weren&amp;rsquo;t already a bug for it, I would file one as this narrows down the issue&amp;rsquo;s introductions. I again did the default filesystem configuration with Btrfs for my whole system. Performance has been acceptable, and I don&amp;rsquo;t seem to have this odd graphical glitch occurring on Kubuntu 20.10. The issue wasn&amp;rsquo;t consistent but did happen. I may have to see if Tumbleweed on this machine has the same problem.&lt;/p&gt;</description></item><item><title>openSUSE Tumbleweed Initial Thoughts</title><link>https://phillipsj.net/posts/opensuse-tumbleweed-initial-thoughts/</link><pubDate>Wed, 23 Dec 2020 20:46:19 -0500</pubDate><guid>https://phillipsj.net/posts/opensuse-tumbleweed-initial-thoughts/</guid><description>&lt;p&gt;I wrote a &lt;a href="https://www.phillipsj.net/posts/opensuse-for-a-month/"&gt;post&lt;/a&gt; a couple of days ago saying that I would use openSUSE for a month on my systems. I have installed Tumbleweed on my desktop, and so far, the experience has been okay. I was able to install media codecs with ease, and all the tools and languages that I use were in the repos with fresh new versions. It recognized all my hardware, and I am rocking the default Btrfs set up with the home being Btrfs too. I have run the update to a new snapshot, and that proved to work well also. That is the one different thing because you are running a distribution update to do updates to move to the new snapshot. When I first considered checking out Tumbleweed a few years ago, the docs weren&amp;rsquo;t as good as they are now.&lt;/p&gt;</description></item><item><title>Ubiquitous Tools: git</title><link>https://phillipsj.net/posts/ubiquitous-tools-git/</link><pubDate>Tue, 22 Dec 2020 21:28:43 -0500</pubDate><guid>https://phillipsj.net/posts/ubiquitous-tools-git/</guid><description>&lt;p&gt;I am tired of getting used to a tool to find that it isn&amp;rsquo;t supported cross-platform or cross-architectures. It&amp;rsquo;s just frustrating when you develop a workflow that involves a tool that doesn&amp;rsquo;t work everywhere you want or need it. That tool for me is GitKraken, one of the best GUI tools for working with git. It has so much functionality available and so quick to perform more complex tasks. However, GitKraken isn&amp;rsquo;t always available, like on ARM, or it is too intensive being electron-based to make sense in some environments. Given my current needs, I canceled my subscription. I have been a happy pro customer for around three years. Before that, I used SourceTree from Atlassian until I really increased my Linux usage, and they at the time didn&amp;rsquo;t have a Linux version, and they still don&amp;rsquo;t. You know what is available for every platform and architecture as a native tool, the git CLI. I started out learning git with just the CLI, and I have found it relaxing to be using it again. It&amp;rsquo;s simple, and it works. I can easily install it with the package manager, and I don&amp;rsquo;t have to worry about which desktop environment I am using either. Flatpaks and Snaps help with that last issue, yet that is just one more thing to learn about and manage.&lt;/p&gt;</description></item><item><title>openSUSE for a Month</title><link>https://phillipsj.net/posts/opensuse-for-a-month/</link><pubDate>Mon, 21 Dec 2020 22:09:39 -0500</pubDate><guid>https://phillipsj.net/posts/opensuse-for-a-month/</guid><description>&lt;p&gt;I found my home on KDE Plasma for the desktop environment, I still haven&amp;rsquo;t found my distro. I have enjoyed uisng Ubuntu/Debian based distros over the years, Fedora has been fine, and I have enjoyed Manjaro. One distro that I haven&amp;rsquo;t spent much time with has been openSUSE. openSUSE is a key distro in my opinion because it isn&amp;rsquo;t a derivative. They do a lot of things differently and I have heard some complaints, yet I don&amp;rsquo;t feel like they are alone. Ubuntu and Fedora both have their way of doing things with preferences that differ. Same could be said for Debian or any derivatives. openSUSE does offer a rolling distro called &lt;a href="https://software.opensuse.org/distributions/tumbleweed"&gt;Tumbleweed&lt;/a&gt; which operates a little differently relying on snapshots that execute as a distro upgrade command. The other offering is &lt;a href="https://software.opensuse.org/distributions/leap"&gt;Leap&lt;/a&gt; which is the more tradional style distro that keeps in sync with SUSE Linux Enterpise Server. There are a lot of unique features that I want to explore like the Open Build System, OpenQA, Kiwi, and YaST. The Open Build System is pretty cool as it builds packages for any linux distro and even supports container images. Kiwi is cool because you can use it to build VM and container images. Then there is the community aspect which feels healthy and positive.&lt;/p&gt;</description></item><item><title>Back to RSS</title><link>https://phillipsj.net/posts/back-to-rss/</link><pubDate>Sun, 20 Dec 2020 21:47:25 -0500</pubDate><guid>https://phillipsj.net/posts/back-to-rss/</guid><description>&lt;p&gt;I have decided to go back to consuming RSS feeds for information. I was a heavy user of Google Reader. Once it shut down, I moved over to the Digg Reader. When I say I was a heavy user, I would open the app every morning and check out what was on the list. I had that routine for a good seven years. After that, I ended up focusing more on getting that information on Twitter. The pandemic has made me realize what I have been feeling for the last couple of years. That the high-value conversations/discussions that I thought that I got out of social media and even attending conferences just wasn&amp;rsquo;t there. It feels strange to say that.&lt;/p&gt;</description></item><item><title>Supporting Restarts With Container-Based Apps</title><link>https://phillipsj.net/posts/supporting-restarts-with-container-based-apps/</link><pubDate>Sat, 19 Dec 2020 23:01:27 -0500</pubDate><guid>https://phillipsj.net/posts/supporting-restarts-with-container-based-apps/</guid><description>&lt;p&gt;This may seem like an odd conversation. Most applications have external dependencies, which end up being a data source of some sort, like a database. These applications will not function due to the database&amp;rsquo;s availability, which introduces concerns in a container world. Once upon a time, Docker compose supported having defined dependencies to ensure that containers start in a specific order. This feature would ensure that your database was created and healthy before starting the app container, connecting to that database. Removal of the feature happened because the current opinions have changed. That change was that apps should detect if the database is available or not and handle it. To understand how this impacts applications, we need to discuss what is available in tools like Docker and Kubernetes.&lt;/p&gt;</description></item><item><title>What I Like About Linux</title><link>https://phillipsj.net/posts/what-i-like-about-linux/</link><pubDate>Fri, 18 Dec 2020 22:55:02 -0500</pubDate><guid>https://phillipsj.net/posts/what-i-like-about-linux/</guid><description>&lt;p&gt;I have been using Linux for all of my personal computing for the last few years. Before that, I used Windows almost exclusively, and I never really got into the whole Apple ecosystem. I started reflecting on my Linux use lately and what I like about it compared to other operating systems. I haven&amp;rsquo;t distro hopped in a couple months, which is something else that has shaped my thinking. What I realized is just how much Linux gets out of your way. There are seamless updates, a powerful command line, and multiple powerful desktops. Tooling is readily available, and all the tools that I need are there. Docker and electron apps work way better on Linux. RAM usage has been much lower, too, compared to the same workloads on Windows. That is what I have found interesting. Linux just works for me, and I feel it will work for most people. You need to be smart about your hardware, and I would encourage research before purchasing to run Linux.&lt;/p&gt;</description></item><item><title>2021 Predictions</title><link>https://phillipsj.net/posts/2021-predictions/</link><pubDate>Thu, 17 Dec 2020 19:22:24 +0000</pubDate><guid>https://phillipsj.net/posts/2021-predictions/</guid><description>&lt;p&gt;2020 was a successful year for me with my predictions. I wasn&amp;rsquo;t into making them, yet I did, and it was a sweeping success. I decided to do it again for 2021, and I will be revisiting a 2019 prediction. Let&amp;rsquo;s dive in.&lt;/p&gt;
&lt;h2 id="microsoft-windows-desktop-environment-for-linux"&gt;Microsoft Windows Desktop Environment for Linux&lt;/h2&gt;
&lt;p&gt;That&amp;rsquo;s right, I predicted this one in 2019, and it didn&amp;rsquo;t happen. The first time I made this prediction, I expected that ARM would be a factor. I was two years ahead of ARM being a player in these type of decisions. Looks like Windows 10 ARM is really picking up traction with devices like the Surface X. With that said, both Edge and Teams shipped for Linux. Microsoft has large Linux package repositories and continues to ship products for it. I have read a few articles about 2021 and the introduction of Windows 10 X to compete with Chrome OS. While many think this won&amp;rsquo;t happen due to the investment, I still feel this will happen.&lt;/p&gt;</description></item><item><title>Current Interests December 2020</title><link>https://phillipsj.net/posts/current-interests-december-2020/</link><pubDate>Wed, 16 Dec 2020 21:05:09 -0500</pubDate><guid>https://phillipsj.net/posts/current-interests-december-2020/</guid><description>&lt;p&gt;I thought it would be fun to document what I find in tech that currently interests me. This way, I can look back and see the trajectory of my interests. I will break these into two categories, personal and professional. Personal interests may not have any bearing direct bearing on my career, while professional ones do.&lt;/p&gt;
&lt;h2 id="personal-interests"&gt;Personal Interests&lt;/h2&gt;
&lt;p&gt;I will start with my personal interests since I spend more time focusing on these. These are in no particular items. This will include languages, frameworks, and open source projects I would like to contribute.&lt;/p&gt;</description></item><item><title>An Approach to Deprecations in Terraform Modules</title><link>https://phillipsj.net/posts/an-approach-to-deprecations-in-terraform-modules/</link><pubDate>Tue, 15 Dec 2020 21:43:28 -0500</pubDate><guid>https://phillipsj.net/posts/an-approach-to-deprecations-in-terraform-modules/</guid><description>&lt;p&gt;Working with modules in Terraform can be challenging. Once a module is used by multiple teams or is published for public consumption, it becomes harder to change the module because those changes will have a larger ripple effect. One way these changes are mitigated is with the versioning of your modules. By versioning, users can choose to opt-in to updates that may cause breaking changes. These changes require manual verification and identification to make sure that it won&amp;rsquo;t impact you. There is an open &lt;a href="https://github.com/hashicorp/terraform/issues/5949"&gt;GitHub Issue&lt;/a&gt; suggesting to add a feature to allow designating deprecations so when you run a validate those, any changes that the module&amp;rsquo;s author has flagged will show up. This gives you a chance to catch those changes as part of your regular workflow. However, that issue has been open for over four years.&lt;/p&gt;</description></item><item><title>Basic Solutions</title><link>https://phillipsj.net/posts/basic-solutions/</link><pubDate>Mon, 14 Dec 2020 21:16:25 -0500</pubDate><guid>https://phillipsj.net/posts/basic-solutions/</guid><description>&lt;p&gt;By default, when I first started doing development, I picked the most basic solution that I could understand. That would be the solution that I would implement. There would be times that I would just keep at a problem until I put a solution in place. Those solutions are incredibly memorable, yet some of the most brittle solutions that I have ever created. As I grew in this career, I started reaching for more complex solutions to problems. These solutions would be using all the &amp;ldquo;proper&amp;rdquo; techniques and new technology of that time. I would look at them as these elegant and beautiful creations. With that shift in mentality, I grew out of touch with why I got started in the first place, helping people. Building solutions for myself is fun, just not as rewarding as actually solving problems for others. A majority of the time, a basic solution gets the user 80% to 90% of the way there. It is less difficult to maintain and support. Other team members can learn it quickly too.&lt;/p&gt;</description></item><item><title>How to Reconcile Configuration Drift in Terraform</title><link>https://phillipsj.net/posts/how-to-reconcile-configuration-drift-in-terraform/</link><pubDate>Sun, 13 Dec 2020 14:05:46 -0500</pubDate><guid>https://phillipsj.net/posts/how-to-reconcile-configuration-drift-in-terraform/</guid><description>&lt;p&gt;Configuration drift can be a big issue when managing systems. Small changes are made, and before anyone knows, the system is configured very differently than what was documented or discussed. Moving to configuration/infrastructure as code assists greatly with having systems configured slightly differently and provides a level of documentation that may not have existed. Some of these tools are stateless, while others maintain some form of state. Terraform is one of these tools that preserve the state of the successfully applied configuration. However, this doesn&amp;rsquo;t prevent changes from occurring outside of Terraform. The next time Terraform is executed, it will detect this drift and try to reconfigure the system to match the Terraform. This wouldn&amp;rsquo;t be an issue unless the manual change was required to fix a bug or an emergency tweak. The good thing is that Terraform offers the &lt;strong&gt;plan&lt;/strong&gt; command that will compare the state, code, and current configuration to determine what changes will be required. Let&amp;rsquo;s dive in and learn how to reconcile configuration drift with Terraform using the &lt;strong&gt;plan&lt;/strong&gt; command.&lt;/p&gt;</description></item><item><title>The Unix Philosophy Applied: New Tools</title><link>https://phillipsj.net/posts/the-unix-philosophy-applied-new-tools/</link><pubDate>Sat, 12 Dec 2020 22:37:48 -0500</pubDate><guid>https://phillipsj.net/posts/the-unix-philosophy-applied-new-tools/</guid><description>&lt;p&gt;I have been thinking about creating a new tool to solve a problem. I like to just let these ideas and the design just simmer while working through quick examples of solving specific problems. A new idea brings loads of excitement that sometimes carries you forward with the idea that may have a better alternative.&lt;/p&gt;
&lt;p&gt;Before I decided to start doing development, I got my copy of the book &lt;a href="https://www.amazon.com/Just-Fun-Story-Accidental-Revolutionary/dp/0066620732"&gt;Just for Fun&lt;/a&gt;. Linus starts talking about what made Unix attractive and impressive. Much of that starts resonating with me as I have been a massive fan of composability for years. Composability can help create orthogonality, which means that you can change one part without affecting other parts of your system. Since Unix tools are tools that perform a single function that can then be piped to another tool to compose a complex tool, any one of those tools can change and not impact others&amp;rsquo; functions. These concepts got me thinking about the tool that I was going to produce. I realized that I didn&amp;rsquo;t need to write a tool to perform what I wanted to do. I could easily compose a tool using a combination of grep, find, and xargs to achieve the same goal.&lt;/p&gt;</description></item><item><title>Parsing a .NET Solution File</title><link>https://phillipsj.net/posts/parsing-a-dotnet-solution-file/</link><pubDate>Fri, 11 Dec 2020 22:04:18 -0500</pubDate><guid>https://phillipsj.net/posts/parsing-a-dotnet-solution-file/</guid><description>&lt;p&gt;I asked on Twitter yesterday if anyone had any recommendations for parsing a .NET solution file. I got a few responses, and after a little additional research, I discovered that Microsoft ships a library that can do it. In &lt;a href="https://www.nuget.org/packages/Microsoft.Build/"&gt;Microsoft.Build&lt;/a&gt; NuGet package is the &lt;em&gt;Microsoft.Build.Construct&lt;/em&gt; namespace that has the &lt;em&gt;SolutionFile.Parse(string)&lt;/em&gt; method, which does precisely that. It is reasonably simple to use, and I have included a basic example.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;using&lt;/span&gt; &lt;span style="color:#000"&gt;System&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;using&lt;/span&gt; &lt;span style="color:#000"&gt;Microsoft.Build.Construct&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;namespace&lt;/span&gt; &lt;span style="color:#000"&gt;HelloWorld&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;class&lt;/span&gt; &lt;span style="color:#000"&gt;Program&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;static&lt;/span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;void&lt;/span&gt; &lt;span style="color:#000"&gt;Main&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;[]&lt;/span&gt; &lt;span style="color:#000"&gt;args&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;var&lt;/span&gt; &lt;span style="color:#000"&gt;solution&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#000"&gt;SolutionFile&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;Parse&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;&amp;#34;path to solution file&amp;#34;&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;foreach&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;var&lt;/span&gt; &lt;span style="color:#000"&gt;project&lt;/span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;in&lt;/span&gt; &lt;span style="color:#000"&gt;solution&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;ProjectsInOrder&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000"&gt;Console&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;WriteLine&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;$&amp;#34;{project.ProjectName} is of type: {project.ProjectType}&amp;#34;&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#000;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I learned something new to just solve a problem that I will post about soon.&lt;/p&gt;</description></item><item><title>Diagnostics Part 2</title><link>https://phillipsj.net/posts/diagnostics-part-2/</link><pubDate>Thu, 10 Dec 2020 21:51:34 -0500</pubDate><guid>https://phillipsj.net/posts/diagnostics-part-2/</guid><description>&lt;p&gt;In &lt;a href="https://www.phillipsj.net/posts/diagnostics-part-1/"&gt;part 1&lt;/a&gt;, I discussed two YouTube channels that I watched in which both creators had a routine for diagnosing problems. They both stick to the same basic formula regardless of the situation because when they didn&amp;rsquo;t, they spent time chasing a false lead to only find out it was something simple. As I said in the last post, this has me asking myself what my routine is.&lt;/p&gt;
&lt;p&gt;After doing this for 13+ years, I don&amp;rsquo;t think that I have a go-to routine to diagnose tech-related issues. I eventually check connectivity, permissions, configuration, etc. I just don&amp;rsquo;t review these in any particular order, and I usually dive into what my past experiences have told me is the issue. I think I am doing myself a disservice by not taking the time to determine what routine I want and codifying that. If I make myself a playbook with a checklist and run through a set of items consistently each time there is an issue, I would think the time to resolution will be much quicker. Even if it isn&amp;rsquo;t always faster, it will help get into a better mindset and build confidence. Let&amp;rsquo;s explore what this may look like.&lt;/p&gt;</description></item><item><title>Tainting Resources in Terraform</title><link>https://phillipsj.net/posts/tainting-resources-in-terraform/</link><pubDate>Wed, 09 Dec 2020 20:03:20 -0500</pubDate><guid>https://phillipsj.net/posts/tainting-resources-in-terraform/</guid><description>&lt;p&gt;I am back with another post on another Terraform command that you should know but will not use all that often. Much like the post on &lt;a href="https://www.phillipsj.net/posts/managing-individual-resources-in-terraform/"&gt;managing individual resources&lt;/a&gt;, we are going to learn about the &lt;a href="https://www.terraform.io/docs/commands/taint.html"&gt;taint&lt;/a&gt; command. This comes in handy when you need to force a resource to be destroyed and recreated instead of doing an in-place update. These issues typically occur when a specific change is not allowed without creating a new resource by the underlying platform, and the provider doesn&amp;rsquo;t really handle that scenario very well. If you tainted the resource, it would trigger a destroy, then recreate working around that limitation. Let&amp;rsquo;s jump into a real-world scenario that is a bizarre case, that if you work with Azure, you will run into it.&lt;/p&gt;</description></item><item><title>MS Developer Setup for Ubuntu 20.04</title><link>https://phillipsj.net/posts/ms-developer-setup-for-ubuntu-20-04/</link><pubDate>Tue, 08 Dec 2020 22:25:01 -0500</pubDate><guid>https://phillipsj.net/posts/ms-developer-setup-for-ubuntu-20-04/</guid><description>&lt;p&gt;Do you need to work with Microsoft related tech, but you want to run Ubuntu 20.04 or a flavor of 20.04? There are many steps to get all the software that you may need to work with .NET, PowerShell, or Azure. I decided to create a script that will install most Microsoft-related tools that you may need to do so. The one item that hasn&amp;rsquo;t yet been standardized like the other tools is Azure Data Studio, so it isn&amp;rsquo;t included. Here is the script, and it is in a &lt;a href="https://gist.github.com/phillipsj/535c633e2aa8137de3a8e3420356cb62"&gt;gist&lt;/a&gt; too.&lt;/p&gt;</description></item><item><title>Managing Individual Resources in Terraform</title><link>https://phillipsj.net/posts/managing-individual-resources-in-terraform/</link><pubDate>Mon, 07 Dec 2020 21:40:39 -0500</pubDate><guid>https://phillipsj.net/posts/managing-individual-resources-in-terraform/</guid><description>&lt;p&gt;There is some nuance in working with Terraform, and many of the commands support more advanced usage. Typically, we end up just using the commands without many options since they cover most of the use cases. There are those times when you need to be more granular when destroying and applying new resources. There are times when the change you want to make will fail due to an underlying platform limitation, so allowing the natural destroy and replace that Terraform performs may not work. In those cases, you may want to destroy a specific resource by hand, then just run the apply as usual. There are other times that you are building out some new capabilities, and you may not be able to only run the apply command generically because you may need to stage some data. In those cases, applying a single resource before applying everything may be required. With those set, let&amp;rsquo;s create some infrastructure and walk through just targeting individual resources for destroying and applying.&lt;/p&gt;</description></item><item><title>Value of Plain Text</title><link>https://phillipsj.net/posts/value-of-plain-text/</link><pubDate>Sun, 06 Dec 2020 22:16:54 -0500</pubDate><guid>https://phillipsj.net/posts/value-of-plain-text/</guid><description>&lt;p&gt;I was listening to a podcast today when one of the hosts said you could just set up your blog on Blogger. Some of the reasons were good reasons, such as not having to self-host. I immediately started wondering why a platform like Blogger or WordPress is often recommended and directly compared to self-hosting when static blog sites offer many advantages. Static sites can be hosted on many platforms like GitHub Pages, Netlify, or a cloud provider&amp;rsquo;s blob storage with little to no cost. The significant advantage there is that typically your data is just stored as plain text. I then realized that I have increasingly started to use more tools that focus on plain text. You are not locked into any specific vendor, and it can easily be manipulated or modified by almost all tools. Markdown, YAML, TOML, JSON, AscIIDoc, XML, and reStructured text all come to mind as popular plain text formats. Migrating markdown from one platform to another can be done with minimal effort and doesn&amp;rsquo;t require a database.&lt;/p&gt;</description></item><item><title>Renewed Focus on DevOps</title><link>https://phillipsj.net/posts/renewed-focus-on-devops/</link><pubDate>Sat, 05 Dec 2020 14:41:27 -0500</pubDate><guid>https://phillipsj.net/posts/renewed-focus-on-devops/</guid><description>&lt;p&gt;I would say the last couple of years, I haven&amp;rsquo;t had as much of an interest or focus on DevOps. I discovered the DevOps movement back in 2010, and it quickly developed into a focus and something that captivated me. The idea that building a culture where everyone is looking out for each other and streamlining processes with automation to deliver value quickly seemed revolutionary to me. Now I was early in my career at that point, and that pursuit provided a lot of drive. In 2018, I started to struggle with presentations and conversations on the topic. I think I reached burn out and I was growing frustrated with the same discussions concerning its effectiveness.&lt;/p&gt;</description></item><item><title>Thoughts on Git Policies</title><link>https://phillipsj.net/posts/thoughts-on-git-policies/</link><pubDate>Fri, 04 Dec 2020 21:02:59 -0500</pubDate><guid>https://phillipsj.net/posts/thoughts-on-git-policies/</guid><description>&lt;p&gt;I have had a few conversations on policies and the role they can play with git repositories. When I talk about policies, I am talking about GitHub&amp;rsquo;s status checks, Azure DevOps branch/pull requests policies or GitLab&amp;rsquo;s push rules. These are all implementations of ways to leverage tools to perform a gate to prevent code that doesn&amp;rsquo;t meet a standard from getting committed into your mainline branch. Here are some examples of using these types of gates.&lt;/p&gt;</description></item><item><title>Diagnostics Part 1</title><link>https://phillipsj.net/posts/diagnostics-part-1/</link><pubDate>Thu, 03 Dec 2020 18:02:22 -0500</pubDate><guid>https://phillipsj.net/posts/diagnostics-part-1/</guid><description>&lt;p&gt;I really enjoy working on mechanical things, especially things that run on gasoline. I have often felt that it was one of the reasons that I got into software development. I could tinker with things without all the grime and expense. I stepped away from doing as much of that as I have gotten older and would like to get more into it. YouTube has been great in that respect as I have found a couple of YouTube channels that I like to watch.&lt;/p&gt;</description></item><item><title>2020 Predictions Review</title><link>https://phillipsj.net/posts/2020-predictions-review/</link><pubDate>Wed, 02 Dec 2020 21:29:00 -0500</pubDate><guid>https://phillipsj.net/posts/2020-predictions-review/</guid><description>&lt;p&gt;My 2020 predictions &lt;a href="https://www.phillipsj.net/posts/2020-predictions/"&gt;post&lt;/a&gt; was made late in the year and without a lot of enthusiasm by me. I decided to check in on my predictions since the year is close to being done. Here are the predictions that I made so you don&amp;rsquo;t have to read the post.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More ARM-based laptops and desktops&lt;/li&gt;
&lt;li&gt;Microsoft starts focusing on GitHub and GitHub Actions over Azure DevOps&lt;/li&gt;
&lt;li&gt;Mozilla fades away&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I was personally shocked at the predictions I had made. I feel I nailed every one of these, even with the qualifications I included. Let&amp;rsquo;s jump in and review.&lt;/p&gt;</description></item><item><title>Hyper-V enhanced session with Kubuntu</title><link>https://phillipsj.net/posts/hyper-v-enhanced-session-with-kubuntu/</link><pubDate>Fri, 27 Nov 2020 20:44:27 +0000</pubDate><guid>https://phillipsj.net/posts/hyper-v-enhanced-session-with-kubuntu/</guid><description>&lt;h1 id="hyper-v-enhanced-session-with-kubuntu"&gt;Hyper-V enhanced session with Kubuntu&lt;/h1&gt;
&lt;p&gt;I did a previous post about doing this with &lt;a href="https://www.phillipsj.net/posts/hyper-v-enhanced-session-with-popos/"&gt;Pop!_OS&lt;/a&gt;, and now I am back doing this with Kubuntu 20.04. KDE has lots of advantages over GTK based desktop, with the biggest being the smaller memory footprint. KDE competes easily with Xfce from a memory standpoint. Just a note that I reused some screenshots from my previous post, so ignore the name and ISO selected.&lt;/p&gt;
&lt;p&gt;Here we go:&lt;/p&gt;</description></item><item><title>Creating Maps with Dash</title><link>https://phillipsj.net/posts/creating-maps-with-dash/</link><pubDate>Thu, 19 Nov 2020 19:27:00 -0500</pubDate><guid>https://phillipsj.net/posts/creating-maps-with-dash/</guid><description>&lt;p&gt;I originally got into software development through GIS and Geology, with my first job doing development was on a GIS development team. After leaving GIS back in 2014, I haven&amp;rsquo;t used much of that knowledge. Learning &lt;a href="https://dash.plotly.com/"&gt;Dash&lt;/a&gt; got me thinking if I could make a map with it, and of course, you can. I grabbed some USGS data on &lt;a href="https://certmapper.cr.usgs.gov/data/metadata_repository/geothermal/Identified%20Moderate%20and%20High%20Temperature%20Geothermal%20Systems%20of%20the%20Western%20United%20States%20including%20AK%20and%20HI.xml"&gt;Geothermal systems&lt;/a&gt;, which is available as a shapefile. I then used &lt;a href="https://www.qgis.org/en/site/"&gt;QGIS&lt;/a&gt; to export the data out as a CSV file. All the code and the data can be found in &lt;a href="https://github.com/phillipsj/dashmap"&gt;this&lt;/a&gt; GitHub repo.&lt;/p&gt;</description></item><item><title>Ask Jamie: Team DevOps Knowledge and Security</title><link>https://phillipsj.net/posts/ask-jamie-team-devops-knowledge-and-security/</link><pubDate>Wed, 18 Nov 2020 20:50:54 -0500</pubDate><guid>https://phillipsj.net/posts/ask-jamie-team-devops-knowledge-and-security/</guid><description>&lt;p&gt;I am back with another excellent set of questions on Twitter concerning team knowledge and security.&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;For smaller teams, how many devs should be knowledgeable about creating/managing DevOps processes? Also, where should SAST fit?&lt;/p&gt;&amp;mdash; Jeremy Sinclair #ฺNET (@sinclairinat0r) &lt;a href="https://x.com/sinclairinat0r/status/1322988042454503424?ref_src=twsrc%5Etfw"&gt;November 1, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.x.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;


&lt;p&gt;I have touched on these in a previous, just a little indirectly, and I will cover them more in-depth here.&lt;/p&gt;
&lt;h2 id="how-many-devs-on-a-team-should-be-knowledgeable-about-devops"&gt;How many devs on a team should be knowledgeable about DevOps?&lt;/h2&gt;
&lt;p&gt;I just sighed while writing this because you probably know I am going to say all team members. DevOps is about culture, and culture requires the whole team to participate. The more the group owns, the more they will be empowered to experiment and improve those processes. Not everyone on a team will be as interested in the same items, which means that more in-depth knowledge will be distributed among individuals. That is perfectly fine as long as most people will be able to troubleshoot and support the basics of the processes you have. Everyone should be able to fix a breaking build or deployment pipeline. Everyone should handle basic container builds or high-level infrastructure as code if you have those in place. Expecting everyone to handle intricate details of your CI server, infrastructure as code, or a tool like Docker is not realistic. Those require additional specialization that many devs may not have an interest in. It&amp;rsquo;s hard to keep up with languages or framework features, so a desire to add depth in DevOps processes may not be feasible. Keeping as much as you can in the documentation, doing reviews of these processes as a team, and pairing are great ways to increase comfort and build confidence.&lt;/p&gt;</description></item><item><title>PowerShell and Multi-Stage Container Builds</title><link>https://phillipsj.net/posts/powershell-and-multi-stage-container-builds/</link><pubDate>Tue, 17 Nov 2020 21:13:37 -0500</pubDate><guid>https://phillipsj.net/posts/powershell-and-multi-stage-container-builds/</guid><description>&lt;p&gt;Docker supports this concept of multi-stage builds. Multi-stage builds allow you to leverage an intermediate image that helps you to install development dependencies. Once you are through with those, you can copy any files to our final image to produce a container without those development dependencies. This makes a lot of sense when using a massive toolkit that requires 100s of megabytes or gigabytes, but the output is way less than that. The extra dependencies make your container larger and increase your attack surface from a security standpoint.&lt;/p&gt;</description></item><item><title>Ask Jamie: Team Function and Organization with DevOps</title><link>https://phillipsj.net/posts/ask-jamie-team-function-and-organization-with-devops/</link><pubDate>Wed, 11 Nov 2020 20:19:06 -0500</pubDate><guid>https://phillipsj.net/posts/ask-jamie-team-function-and-organization-with-devops/</guid><description>&lt;p&gt;I am back with another set of questions that were asked on Twitter. It has had a fantastic response and a bunch of questions to explore. I hope everyone is enjoying these as much as I am. Here is the next set.&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;How do you draw the lines? Vertical per functionality? If so, do you still keep horizontal teams for infrastructure stuff and tools? &lt;br&gt;How do you handle consistency vs. team independence? How far does a DevOps team can decide what they can do?&lt;br&gt;How do you turn around the naysayers?&lt;/p&gt;</description></item><item><title>Ask Jamie: Configuration, Infrastructure, and DevOps</title><link>https://phillipsj.net/posts/ask-jamie-configuration-infrastructure-and-devops/</link><pubDate>Tue, 03 Nov 2020 21:32:57 -0500</pubDate><guid>https://phillipsj.net/posts/ask-jamie-configuration-infrastructure-and-devops/</guid><description>&lt;p&gt;I am working through the next set of questions that I received on Twitter related to DevOps. I will have the questions and my response.&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;Config As Code vs. Infrastructure As Code&lt;br&gt;When is something in a deployment considered infrastructure vs configuration?&lt;/p&gt;&amp;mdash; Mötz Jensen (@splaxi) &lt;a href="https://x.com/splaxi/status/1322228031931506690?ref_src=twsrc%5Etfw"&gt;October 30, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.x.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;


&lt;p&gt;Here are my thoughts on that topic. In my opinion, infrastructure is what your application needs to run vs. configuration is how it needs to run. A database is an infrastructure item; the account to access the database is how it needs to connect. I am a big proponent of infrastructure as code, and I use Terraform to do that. I am also currently a fan of the workspace per environment with one set of Terraform templates. Those templates get configuration applied based on the environment/workspace. This is outlined at a high level &lt;a href="https://www.terraform.io/docs/cloud/guides/recommended-practices/part1.html#the-recommended-terraform-workspace-structure"&gt;here&lt;/a&gt;. This means that infrastructure configuration is used when the infrastructure is deployed, application configuration is applied when the application is deployed. I also like to store my infrastructure code with my application code in the same repository. Shared/Global resources are only referenced and not created there.&lt;/p&gt;</description></item><item><title>PowerShell and Containers</title><link>https://phillipsj.net/posts/powershell-and-containers/</link><pubDate>Mon, 02 Nov 2020 22:30:16 -0400</pubDate><guid>https://phillipsj.net/posts/powershell-and-containers/</guid><description>&lt;p&gt;Did you know that Microsoft published official container images for PowerShell? Those official images can be found &lt;a href="https://hub.docker.com/_/microsoft-powershell"&gt;here&lt;/a&gt;, and one cool thing to note is that there are even some ARM images. It is incredibly cool that these are provided as it makes shipping PowerShell tools simpler or hosting any PowerShell based script. I have two different use cases that I can demonstrate that make these pretty cool. The first demo is going to be using the Alpine image as the base image for building a container that hosts a &lt;a href="https://github.com/PowerShell/Polaris"&gt;Polaris&lt;/a&gt; based REST API, like I &lt;a href="https://www.phillipsj.net/posts/powershell-rest-api-with-polaris/"&gt;blogged&lt;/a&gt; about a few weeks ago. The second demo will be to host a PowerShell script that needs to run as a sidecar to a SQL Server container. Let&amp;rsquo;s dive into these demos.&lt;/p&gt;</description></item><item><title>Ask Jamie: Reducing Layers between Commit to Prod</title><link>https://phillipsj.net/posts/ask-jamie-reducing-layers-between-commit-to-production/</link><pubDate>Sat, 31 Oct 2020 12:42:59 -0400</pubDate><guid>https://phillipsj.net/posts/ask-jamie-reducing-layers-between-commit-to-production/</guid><description>&lt;p&gt;I posted a tweet on Twitter asking what people would like to know about DevOps and automation. I said I would share my experiences and opinions based on questions asked with a blog post. I had a few people ask outstanding questions, and this is one of many posts answering those questions.&lt;/p&gt;
&lt;p&gt;The first question asked was the following:&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;Getting companies to stop having so many layers between commit and deploy.&lt;/p&gt;</description></item><item><title>Poshpy: Easier PowerShelling from Python</title><link>https://phillipsj.net/posts/poshpy-easier-powershelling-from-python/</link><pubDate>Wed, 28 Oct 2020 14:21:30 -0400</pubDate><guid>https://phillipsj.net/posts/poshpy-easier-powershelling-from-python/</guid><description>&lt;p&gt;My recent post on &lt;a href="https://www.phillipsj.net/posts/executing-powershell-from-python/"&gt;executing PowerShell from Python&lt;/a&gt; has led me to create a Python package for making it even easier to execute PowerShell from Python. My package is called &lt;a href="https://pypi.org/project/poshpy/"&gt;poshpy&lt;/a&gt; and the source code is up on &lt;a href="https://github.com/blueghostlabs/poshpy"&gt;GitHub&lt;/a&gt;. I have started thinking about a roadmap of features that could be useful. One item that will be a focus was suggested on Reddit, which adds the ability to handle returned objects. I have a rough idea of that one that I hope to have it implemented shortly. If there is anything you would like to see, please open an issue on GitHub first before doing any work to discuss. Here is a short example of the current API, which may change or evolve over time.&lt;/p&gt;</description></item><item><title>Executing PowerShell from Python</title><link>https://phillipsj.net/posts/executing-powershell-from-python/</link><pubDate>Sun, 25 Oct 2020 19:51:56 -0400</pubDate><guid>https://phillipsj.net/posts/executing-powershell-from-python/</guid><description>&lt;p&gt;I have an experiment that I am working on and thought that leveraging Python would be fun. As part of that experiment, I would need to execute PowerShell from Python since only PowerShell cmdlets are available to do what I need. After a little research a week of letting it simmer, I was able to sit down the last night and work it out. Part of it is my unfamiliarity with Python for what I am doing, and the other part is just me not thinking about the problem holistically.&lt;/p&gt;</description></item><item><title>My Thoughts on Static Typing</title><link>https://phillipsj.net/posts/my-thoughts-on-static-typing/</link><pubDate>Sat, 24 Oct 2020 21:10:44 -0400</pubDate><guid>https://phillipsj.net/posts/my-thoughts-on-static-typing/</guid><description>&lt;p&gt;I haven&amp;rsquo;t done a post that doesn&amp;rsquo;t involve a lot of code in some time. I have had this idea in my head for a few months, and I have finally decided to write about it. I will focus on the areas that I know, yet this can be extrapolated across most languages and runtimes. There is this big debate about static typing vs. dynamic typing that keeps happening. Plenty of businesses have been successful in building their software with both styles of languages. Different languages optimize for different scenarios, and there are trade-offs for those optimizations. Ultimately, the language didn&amp;rsquo;t really matter. There has been research around typing and testing. It seems that most conclude there is possibly a small difference. Now I believe in testing, and I don&amp;rsquo;t have an issue with static typing. There are some cool things that you can do with a sound type system and compiler. The alternative is the cool stuff you can do with languages that are dynamically typed. You can really push Python, Ruby, or JavaScript to do some cool things, those things might not always be wise, yet the ability to be creative is there. So now I am at the crux of my argument, and here it is:&lt;/p&gt;</description></item><item><title>Simple APIs with Python and Flask</title><link>https://phillipsj.net/posts/simple-apis-with-python-and-flask/</link><pubDate>Sat, 24 Oct 2020 13:50:59 -0400</pubDate><guid>https://phillipsj.net/posts/simple-apis-with-python-and-flask/</guid><description>&lt;p&gt;My post on &lt;a href="https://www.phillipsj.net/posts/powershell-rest-api-with-polaris/"&gt;Polaris&lt;/a&gt; started out with me looking at building a simple REST API with Python. I had to pivot a little based on some other limitations, but I will revisit this now. Python is one of those languages that I can&amp;rsquo;t ever seem to use, yet I keep coming back to it. Maybe one of these days, I will get to use it more than I currently do. &lt;a href="https://flask.palletsprojects.com/en/1.1.x/"&gt;Flask&lt;/a&gt; keeps building apps simple, and I discovered this library called &lt;a href="https://flask-restful.readthedocs.io/en/latest/"&gt;Flask-RESTful&lt;/a&gt; that is really elegant. Unfortunately, there is a GitHub &lt;a href="https://github.com/flask-restful/flask-restful/issues/883"&gt;issue&lt;/a&gt;, where one of the developers suggests using &lt;a href="https://flask.palletsprojects.com/en/1.1.x/views/#method-based-dispatching"&gt;MethodViews&lt;/a&gt; in Flask instead. Given there hasn&amp;rsquo;t been a new release in some time, I thought it would be better to checkout MethodView.&lt;/p&gt;</description></item><item><title>PowerShell REST API with Polaris</title><link>https://phillipsj.net/posts/powershell-rest-api-with-polaris/</link><pubDate>Thu, 15 Oct 2020 21:00:32 -0400</pubDate><guid>https://phillipsj.net/posts/powershell-rest-api-with-polaris/</guid><description>&lt;p&gt;PowerShell is a fascinating language that can be used ubiquitously by someone who does system administration, DevOps, or other automation tasks. If the tooling you often work with had the support or only supports PowerShell, this can make it difficult if you needed to build a webhook or some other type of wrapper around that tooling. Fortunately, PowerShell does have a few different web frameworks that can be used to add that functionality and integrate with that tooling seamlessly. Now that we have covered what I see as the primary use case, we will build a REST API that implements GET, POST, PUT, and DELETE HTTP verbs all in PowerShell using the &lt;a href="https://github.com/PowerShell/Polaris"&gt;Polaris&lt;/a&gt; module. All of these modules will support all versions of PowerShell, including PowerShell Core running on macOS and Linux.&lt;/p&gt;</description></item><item><title>Creating an Express API using SQL Server</title><link>https://phillipsj.net/posts/creating-an-express-api-using-sql-server/</link><pubDate>Mon, 12 Oct 2020 21:32:48 -0400</pubDate><guid>https://phillipsj.net/posts/creating-an-express-api-using-sql-server/</guid><description>&lt;p&gt;The majority of my experience with JavaScript started in 2008 and slowly dwindled in 2015. I have tinkered with Node in the past but never tried building anything that retrieved data from a relational database. I am now working on an example application that is going to be written using &lt;a href="https://expressjs.com/"&gt;Express&lt;/a&gt; to create an API against an SQL Server using the &lt;a href="https://docs.microsoft.com/en-us/sql/samples/adventureworks-install-configure?view=sql-server-ver15&amp;amp;tabs=ssms"&gt;Adventure Works 2019&lt;/a&gt; database. I couldn&amp;rsquo;t find many examples to lean upon, and that is why I created this post. I initially thought I needed to use &lt;a href="https://github.com/tediousjs/tedious"&gt;tedious&lt;/a&gt;, which turned out to feel tedious to me, and then I discovered &lt;a href="https://github.com/tediousjs/node-mssql#readme"&gt;mssql&lt;/a&gt;, which has a better feel to me. There is support for &lt;a href="https://github.com/tediousjs/node-mssql#pool-management"&gt;Connection Pooling&lt;/a&gt;, and I leverage that in this example. I am using the global connection pool technique, so all queries will share the pool. I am still catching up on modern JavaScript and Node, so please send me any improvement you think I could make. Let&amp;rsquo;s jump into the code.&lt;/p&gt;</description></item><item><title>Using Fake With GitHub Actions</title><link>https://phillipsj.net/posts/using-fake-with-github-actions/</link><pubDate>Tue, 06 Oct 2020 19:57:44 -0400</pubDate><guid>https://phillipsj.net/posts/using-fake-with-github-actions/</guid><description>&lt;p&gt;I have been working on an F# project that I will be sharing soon. One of the tasks that I have left is setting up CI/CD for the application. Since I am using F#, the natural choice is to leverage &lt;a href="https://fake.build"&gt;Fake&lt;/a&gt;. Fake is a build tool that leverages F# to write your build scripts. Getting started is easy, and I would recommend installing it as a &lt;a href="https://docs.microsoft.com/en-us/dotnet/core/tools/local-tools-how-to-use"&gt;local tool&lt;/a&gt;. I will walk you through all the steps of creating an empty F# project, configuring Fake, and making your GitHub Actions YAML file.&lt;/p&gt;</description></item><item><title>Random things with Terraform</title><link>https://phillipsj.net/posts/random-things-with-terraform/</link><pubDate>Sat, 03 Oct 2020 14:18:49 -0400</pubDate><guid>https://phillipsj.net/posts/random-things-with-terraform/</guid><description>&lt;p&gt;Anytime you are creating resources, there is seems to always be a need to create a random id, string, etc. Fortunately, Terraform provides that ability with the &lt;a href="https://registry.terraform.io/providers/hashicorp/random/latest"&gt;random&lt;/a&gt; provider. I have found this really useful when making Terraform demonstration examples that I know many will reference. A vital feature of these resources is the &lt;strong&gt;keepers&lt;/strong&gt; functionality, which lets you trigger the resource to generate a new key when an additional value changes. Let&amp;rsquo;s dive in and take a tour of what is provided. To use the provider, you just need to add it to the providers&amp;rsquo; list in your Terraform 0.13 block.&lt;/p&gt;</description></item><item><title>Update: Easy Grafana on Azure</title><link>https://phillipsj.net/posts/update-easy-grafana-on-azure/</link><pubDate>Thu, 01 Oct 2020 19:49:16 -0400</pubDate><guid>https://phillipsj.net/posts/update-easy-grafana-on-azure/</guid><description>&lt;h1 id="update-easy-grafana-on-azure"&gt;Update: Easy Grafana on Azure&lt;/h1&gt;
&lt;p&gt;This post almost didn&amp;rsquo;t happen as I was ready to give up. A little over a year ago, I wrote a post called &lt;a href="https://www.phillipsj.net/posts/an-easy-grafana-setup-using-azure-app-service-for-linux/"&gt;An easy Grafana setup using Azure App Service for Linux&lt;/a&gt;. Since then, there have been a few changes that I needed to implement in the &lt;a href="https://github.com/BlueGhostLabs/grafana-container-on-azure"&gt;GitHub repository&lt;/a&gt; that I created. These changes have been general improvements. However, there was one major issue that has developed. I mounted Azure Blob storage to the container as the persistent storage for the database file and plugins in the previous post. Azure Blob storage shortly after was changed to a read-only storage option, and you can no longer use it to store your database file. That is a long story as to why that change came about. What happened was Microsoft released an update to the platform and changed the behavior of the mounted blob storage that caused files, like the SQLite database, to get deleted and recreated when the container was restarted. Due to the nature of the issue, that has now become a read-only storage option. This was discovered from a support request with Azure way back at this point. This now leaves the only easy option is to leverage Azure Files that are part of Azure Storage. Unfortunately, this &lt;a href="https://github.com/grafana/grafana/issues/20549#issuecomment-584857241"&gt;GitHub Issue&lt;/a&gt; outlines the next major issue, which is the journaling issue that is preventing SQLite from working correctly on an Azure file share. You can use the workaround listed through the links on that issue, and I feel that it just seems like a lot of extra work. So really, there are two options, run it in the container and configure backups or run a database as a service using Azure MySQL or Azure PostgreSQL. If you go the PostgreSQL, check the documentation &lt;a href="https://grafana.com/docs/grafana/latest/installation/requirements/#supported-databases"&gt;here&lt;/a&gt; to make sure you select a supported version.&lt;/p&gt;</description></item><item><title>Getting Started With SDKMAN!</title><link>https://phillipsj.net/posts/getting-started-with-sdkman/</link><pubDate>Sun, 07 Jun 2020 21:37:43 -0400</pubDate><guid>https://phillipsj.net/posts/getting-started-with-sdkman/</guid><description>&lt;p&gt;There are lots of ways on Linux to get JVM based runtimes and languages. Over the years, I have found &lt;a href="https://sdkman.io/"&gt;SDKMAN!&lt;/a&gt; to be one of the easiest ways to get all most all runtimes and languages based on the JVM. A significant advantage of tools like SDKMAN! is that it is a local user install and not a system-wide installation. Let&amp;rsquo;s get started by installing SDKMAN! following the instructions provided.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;Installation requires downloading a script from their site and piping it to Bash. As with any file you download from the internet, inspect it in the GitHub repository before running it on your system. One advantage of user-level tools is that they don&amp;rsquo;t require any superuser privileges. The official guide shows using &lt;em&gt;curl&lt;/em&gt; to retrieve the script. If you don&amp;rsquo;t have curl available, you will need to install it. I am running Ubuntu, and curl was required installation.&lt;/p&gt;</description></item><item><title>Install PowerShell on Fedora 32</title><link>https://phillipsj.net/posts/install-powershell-on-fedora-32/</link><pubDate>Wed, 20 May 2020 20:30:12 -0400</pubDate><guid>https://phillipsj.net/posts/install-powershell-on-fedora-32/</guid><description>&lt;p&gt;There are many ways to install &lt;a href="https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7"&gt;PowerShell&lt;/a&gt; on Linux. I usually install PowerShell as a snap package. Fedora doesn&amp;rsquo;t have snaps installed by default, so I figured I would use a different method. The available repositories are not updated for Fedora 32 but still may work. That leaves doing a binary archive installation or leveraging the global .NET Core tool. The binary method requires installing dependencies, and the global tool requires the installation of .NET Core. Considering the requirements are the .NET Core requirements, I think it would be best to install the .NET Core SDK, which will cover everything that is needed. If you want to know how to install .NET Core on Fedora 32, you can check out this &lt;a href="https://www.phillipsj.net/posts/install-dotnet-core-on-fedora-32/"&gt;post&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Install .NET Core on Fedora 32</title><link>https://phillipsj.net/posts/install-dotnet-core-on-fedora-32/</link><pubDate>Sun, 17 May 2020 22:09:20 -0400</pubDate><guid>https://phillipsj.net/posts/install-dotnet-core-on-fedora-32/</guid><description>&lt;p&gt;&lt;a href="https://fedoramagazine.org/announcing-fedora-32/"&gt;Fedora 32&lt;/a&gt; was released a few short weeks ago. In this latest release .NET Core 3.1 is being shipped in the official repositories. This package now makes it simpler to install than before. In this post, we will walk through installing .NET Core 3.1 and how to disable telemetry if you desire.&lt;/p&gt;
&lt;h2 id="disabling-telemetry"&gt;Disabling Telemetry&lt;/h2&gt;
&lt;p&gt;You can find out more about the &lt;a href="https://docs.microsoft.com/en-us/dotnet/core/tools/telemetry"&gt;telemtery&lt;/a&gt; collected here. You can &lt;a href="https://docs.microsoft.com/en-us/dotnet/core/tools/telemetry#how-to-opt-out"&gt;opt out&lt;/a&gt; by setting an environment variable. I am going to show you how to set it in your &lt;em&gt;.profile&lt;/em&gt;, so when you log in, it will set the environment variable for you.&lt;/p&gt;</description></item><item><title>Terraforming Grafana and Influx Data Source</title><link>https://phillipsj.net/posts/terraforming-grafana-influx-data-source/</link><pubDate>Sun, 10 May 2020 20:05:59 -0400</pubDate><guid>https://phillipsj.net/posts/terraforming-grafana-influx-data-source/</guid><description>&lt;p&gt;I have been using &lt;a href="https://grafana.com/"&gt;Grafana&lt;/a&gt; for a little over a year, but I haven&amp;rsquo;t had the chance to start using &lt;a href="https://grafana.com/"&gt;Terraform&lt;/a&gt; with it, so I decided to create a blog post to explore its use. After a quick look around the documentation, it currently allows uploading existing dashboards saved as JSON or creating folders, organizations, and data sources. Now it was a little disappointing about the dashboards, yet I can understand why. Being able to create folders, organizations, and data sources are still lovely as it gives a standard way to create data sources, especially when you need to create them consistently across environments, data centers, etc. If you don&amp;rsquo;t have a Grafana instance or &lt;a href="https://www.influxdata.com/"&gt;InfluxDB&lt;/a&gt; instance that you can use, read the next section that describes how to get both up and running with &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Introduction to Terraform Provisioners</title><link>https://phillipsj.net/posts/introduction-to-terraform-provisioners/</link><pubDate>Sun, 19 Apr 2020 19:28:37 -0400</pubDate><guid>https://phillipsj.net/posts/introduction-to-terraform-provisioners/</guid><description>&lt;p&gt;As you continue learning about Terraform, you will start hearing about &lt;a href="https://www.terraform.io/docs/provisioners/index.html"&gt;provisioners&lt;/a&gt;. Terraform provisioners can be created on any resource and provide a way to execute actions on local or remote machines. These give a hook to allow supplementing Terraform were a feature isn&amp;rsquo;t yet present or to extend the capabilities of Terraform. As the documentation points out, these are not &amp;ldquo;go-to&amp;rdquo; solutions as these don&amp;rsquo;t integrate with Terraform state. There are three categories for the default provisioners. Those categories are file operations, script execution, and configuration management/provisioning. Let&amp;rsquo;s get started discussing each of these.&lt;/p&gt;</description></item><item><title>Create an archive and upload it with Terraform</title><link>https://phillipsj.net/posts/create-an-archive-and-upload-it-with-terraform/</link><pubDate>Mon, 30 Mar 2020 20:10:27 -0400</pubDate><guid>https://phillipsj.net/posts/create-an-archive-and-upload-it-with-terraform/</guid><description>&lt;p&gt;Terraform is such a versatile tool and supports many features that are always fun to discover. Today we are going
to learn about the &lt;a href="https://www.terraform.io/docs/providers/archive/index.html"&gt;Archive provider&lt;/a&gt; and the &lt;a href="https://www.terraform.io/docs/provisioners/file.html"&gt;File provisioner&lt;/a&gt;.
The Archive provider allows you to create a zip file of a single file, a directory, or content generated withing your Terraform template.
The second feature we will be levarging is the file provisioner, which allows you to upload a file or directory to a remote
server using either SSH or Windows Remoting. The file provisioner will need to be used as a section within a resource. A
typical example would be to upload a file to a virtual machine resource. However, you can also leverage it with a
&lt;a href="https://www.terraform.io/docs/providers/null/resource.html"&gt;Null resource&lt;/a&gt;. A null resource is a last resort tool that I should
probably cover more in depth in a future blog post.&lt;/p&gt;</description></item><item><title>Yes, Terraform can do that: Docker</title><link>https://phillipsj.net/posts/yes-terraform-can-do-that-docker/</link><pubDate>Sat, 28 Mar 2020 22:14:52 -0400</pubDate><guid>https://phillipsj.net/posts/yes-terraform-can-do-that-docker/</guid><description>&lt;p&gt;Back with another post about something else you can use with Terraform, Docker. The &lt;a href="https://www.terraform.io/docs/providers/docker/index.html"&gt;Docker Provider&lt;/a&gt; can work with local and remote docker daemons. Here is a simple example that pulls the BusyBox image and creates a container
that executes the sleep command.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;provider&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;docker&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; host&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;tcp://127.0.0.1:2376/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;resource&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;docker_container&amp;#34; &amp;#34;tf&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; image&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;docker_image&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;busybox&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; name&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;tfdocker&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; command&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;&amp;#34;sleep&amp;#34;, &amp;#34;1000000&amp;#34;&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;resource&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;docker_image&amp;#34; &amp;#34;busybox&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt; name&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;&amp;#34;busybox:latest&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Save this as &lt;em&gt;docker.tf&lt;/em&gt;, and we will use it to create a Docker container.&lt;/p&gt;</description></item><item><title>Yes, Terraform can do that: SQL</title><link>https://phillipsj.net/posts/yes-terraform-can-do-that-sql/</link><pubDate>Sat, 14 Mar 2020 22:19:04 -0400</pubDate><guid>https://phillipsj.net/posts/yes-terraform-can-do-that-sql/</guid><description>&lt;p&gt;This post is going to be the first in a new collection of posts about what you can do with Terraform. I am continually learning about new things to use Terraform to accomplish. Most of these have naturally been things that I have needed to do that have helped me discover these options, and the others will be things that I just found interesting. Let&amp;rsquo;s start diving into Terraforming SQL.&lt;/p&gt;</description></item><item><title>Getting Data in Terraform</title><link>https://phillipsj.net/posts/getting-data-in-terraform/</link><pubDate>Mon, 09 Mar 2020 20:54:59 -0400</pubDate><guid>https://phillipsj.net/posts/getting-data-in-terraform/</guid><description>&lt;p&gt;After my post on &lt;a href="https://www.phillipsj.net/posts/discussion-of-terraform-backends/"&gt;discussing Terraform backends&lt;/a&gt;, someone asked if I could do a post on the topic of accessing data in your remote state. I thought that was an excellent idea, and here I am writing a post that will discuss that and access other data. Luckily in Terraform, both of those use the same concept, which is a &lt;a href="https://www.terraform.io/docs/configuration/data-sources.html"&gt;data source&lt;/a&gt;. A data source is a particular type of resource that can query external sources and return data. Most providers in Terraform have data sources that allow retrieving data from the target of the provider, and an example would be the data sources in the Azure Provider that allows querying an Azure subscription for all kinds of data about resources in Azure. Now let&amp;rsquo;s dive into the differences between data sources from providers and the one for the remote state.&lt;/p&gt;</description></item><item><title>Creating Kubectl Plugins With .NET</title><link>https://phillipsj.net/posts/creating-kubectl-plugins-with-dotnet/</link><pubDate>Sat, 07 Mar 2020 12:57:16 -0500</pubDate><guid>https://phillipsj.net/posts/creating-kubectl-plugins-with-dotnet/</guid><description>&lt;p&gt;&lt;a href="https://kubernetes.io/docs/reference/kubectl/overview/"&gt;Kubectl&lt;/a&gt; is the CLI tool for working with the &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt; API. &lt;a href="https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/"&gt;Kubectl plugins&lt;/a&gt; provide us a way to extend the Kubectl to include more complex commands or enhanced functionality. There are two requirements for creating a plugin, and the requirements are as follows.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Must be named &lt;strong&gt;kubectl-name&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Must be on your path.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I would guess that golang is one of the more popular choices for creating plugins. Any language that can create a single executable binary would be a great choice as it makes it easier to manage and distribute. Depending on the type of plugin you are developing, choosing a language that has a &lt;a href="https://kubernetes.io/docs/reference/using-api/client-libraries/"&gt;Kubernetes Client&lt;/a&gt; would be wise too. Traditionally, .NET isn&amp;rsquo;t a language that comes to mind when speaking about producing a single executable binary. As .NET Core has gained momentum, the ability has been introduced with the latest 3.1 release to support creating a single executable binary. In this post I will show you how to use .NET Core 3.1 to create a plugin for Kubectl. Let&amp;rsquo;s get started.&lt;/p&gt;</description></item><item><title>Go Weather: My First Go App</title><link>https://phillipsj.net/posts/go-weather-my-first-go-app/</link><pubDate>Fri, 06 Mar 2020 20:23:47 -0500</pubDate><guid>https://phillipsj.net/posts/go-weather-my-first-go-app/</guid><description>&lt;p&gt;About six months ago, I wrote this &lt;a href="https://www.phillipsj.net/posts/rusty-weather-my-first-rust-app/"&gt;post&lt;/a&gt; about writing an app in &lt;a href="https://www.rust-lang.org/"&gt;Rust&lt;/a&gt;. It was a Python app that I created as part of a training course. I keep getting pulled into projects that require knowledge of golang, so I decided to build an app that I understood my needs so it would be easier to grok. I am impressed by the fact that I only needed a single external dependency. I probably could have done it without it, but I liked it&amp;rsquo;s API, that library was &lt;a href="http://go-colly.org/"&gt;Colly&lt;/a&gt;. Here is the app.&lt;/p&gt;</description></item><item><title>Hadolint: Linting your Dockerfile</title><link>https://phillipsj.net/posts/hadolint-linting-your-dockerfile/</link><pubDate>Mon, 02 Mar 2020 21:30:30 -0500</pubDate><guid>https://phillipsj.net/posts/hadolint-linting-your-dockerfile/</guid><description>&lt;p&gt;Linters are commonly used in development to help teams detect programmatic and stylistic errors. &lt;a href="https://github.com/hadolint/hadolint"&gt;Hadolint&lt;/a&gt; is a linter created for Dockerfiles using &lt;a href="https://www.haskell.org/"&gt;Haskell&lt;/a&gt;. This tool validates against the &lt;a href="https://docs.docker.com/develop/develop-images/dockerfile_best-practices/"&gt;best practices&lt;/a&gt; outlined by Docker and takes a neat approach to parse the Dockerfile that you should checkout. It supports all major platforms, and this tutorial will be leveraging the container to perform the linting on an example Dockerfile. Let&amp;rsquo;s get started.&lt;/p&gt;
&lt;h2 id="the-dockerfile"&gt;The Dockerfile&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ touch Dockerfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s add the following to the file:&lt;/p&gt;</description></item><item><title>Discussion of Terraform Backends</title><link>https://phillipsj.net/posts/discussion-of-terraform-backends/</link><pubDate>Sun, 01 Mar 2020 20:34:27 -0500</pubDate><guid>https://phillipsj.net/posts/discussion-of-terraform-backends/</guid><description>&lt;p&gt;&lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt; is a tool for managing resources in a declarative fashion. One of the critical features of Terraform is drift detection, which is enabled by tracking state. To provide state in Terraform is a &lt;a href="https://www.terraform.io/docs/backends/index.html"&gt;backend&lt;/a&gt;. When first getting started, most people typically use the local state store. You will quickly outgrow a local state store, especially when you move your Terraform usage into a team environment and a CI/CD pipeline. Moving to a remote backend allows the state to be backed up, versioned, shared, locked, etc. These features grow valuable past a single user or a single system managed with Terraform. Once you start leveraging remote state, there are typically two big questions that arise.&lt;/p&gt;</description></item><item><title>.NET Method Caching</title><link>https://phillipsj.net/posts/dotnet-method-caching/</link><pubDate>Sat, 29 Feb 2020 21:05:50 -0500</pubDate><guid>https://phillipsj.net/posts/dotnet-method-caching/</guid><description>&lt;p&gt;I wrote a post a few months back on &lt;a href="https://www.phillipsj.net/posts/memoization-in-powershell/"&gt;memoization in Powershell&lt;/a&gt;. I decided to revisit what this looks like in .NET. In Python, it is supported out of the box. Python provides a &lt;a href="https://docs.python.org/3/library/functools.html#functools.lru_cache"&gt;LRU Cache&lt;/a&gt; decorator that lets you use memoization on any method. The code below is what memoization looks like using the decorator.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5c35cc;font-weight:bold"&gt;@lru_cache&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;maxsize&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;None&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#000"&gt;fibonacci&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;number&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#000"&gt;number&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#0000cf;font-weight:bold"&gt;2&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#000"&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#000"&gt;fibonacci&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;number&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;-&lt;/span&gt; &lt;span style="color:#0000cf;font-weight:bold"&gt;2&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;+&lt;/span&gt; &lt;span style="color:#000"&gt;fibonacci&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000"&gt;number&lt;/span&gt; &lt;span style="color:#ce5c00;font-weight:bold"&gt;-&lt;/span&gt; &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This code is also an excellent example of using aspect-oriented programming, abbreviated AOP. This capability got me thinking about what this would look like in .NET, specifically C#. The thought would be to leverage an attribute on a method that would implement the cache. AOP isn&amp;rsquo;t something readily available in .NET, so we are going to lean on the excellent &lt;a href="https://www.postsharp.net/"&gt;PostSharp&lt;/a&gt; library, which provides a cache attribute for us. Python and PowerShell both offer a simple way to time execution. In .NET, I think it is a more robust solution to leverage a tool like &lt;a href="https://benchmarkdotnet.org/"&gt;BenchmarkDotNet&lt;/a&gt;. Let&amp;rsquo;s create a new project and add our NuGet libraries.&lt;/p&gt;</description></item><item><title>NAS as a DB Server</title><link>https://phillipsj.net/posts/nas-as-a-db-server/</link><pubDate>Sat, 29 Feb 2020 12:26:39 -0500</pubDate><guid>https://phillipsj.net/posts/nas-as-a-db-server/</guid><description>&lt;p&gt;Someone had read this &lt;a href="https://www.phillipsj.net/posts/sql-server-on-qnap-nas/"&gt;post&lt;/a&gt; and asked if I thought a NAS would be a good choice for running an MS SQL and MySQL database for a Small Business. The short answer is yes; I actually do think that it would be a good use for a NAS. NASes are an expensive purchase and running a database on it for back-office applications or running a website with light traffic would get even more value out of it. There are a few caveats to specs when deciding to purchase a NAS to host a database.&lt;/p&gt;</description></item><item><title>I bought a Thinkpad</title><link>https://phillipsj.net/posts/i-bought-a-thinkpad/</link><pubDate>Fri, 28 Feb 2020 20:39:04 -0500</pubDate><guid>https://phillipsj.net/posts/i-bought-a-thinkpad/</guid><description>&lt;p&gt;My laptop was a Surface Pro 4, and I find the performance was sufficient for my needs. I wanted a Linux laptop, and I tried by installing Linux on my Surface. With the stock kernel, everything except touch worked and with the custom kernel even touch. I ran into one small issue that I wasn&amp;rsquo;t able to resolve, and that was with the wifi. Unpredictably the wifi would just cut-out, and I couldn&amp;rsquo;t recover it without rebooting. After struggling with that for a few weeks, I finally decided that I needed to purchase a laptop that I could run Linux and would be fully functional. There are plenty of excellent machines on the market that can run Linux, but I didn&amp;rsquo;t want to spend over a thousand dollars to make that happen. After listening to the &lt;a href="https://extras.show/34"&gt;Alan Pope&lt;/a&gt; episode on &lt;a href="https://extras.show/"&gt;Jupiter Extras&lt;/a&gt; about Thinkpads, I decided to do a little research. My Surface Pro 4 has a 6th gen Core i5 which I knew had plenty of horsepower for how I use it, so I decided that I would start looking at Thinkpads with at least the 6th gen processors. A nice feature of the Surface Pro 4 is portability, so I prioritized finding a Thinkpad X series instead of opting for the T series. I finally settled on finding a Thinkpad X260. It took a little searching, but I finally found one that I wanted to purchase, which was well under $200 US. I bought a 256GB SSD and a single 16GB stick DDR 2133MHz RAM. Upgrading was easy to perform and only took a few minutes to complete. One thing that may or may not be an issue is that the model I purchased came with a 720p TN screen. Thinkpads are extremely easy to work on, and parts are readily available. I used my model number to determine which screen I needed and ordered me a 720p IPS display. I could have gone with a 1080p, and I used the 720p display for a few days to determine if I would want to use a 1080p display on a 12.5&amp;quot; notebook, the answer was no. After everything, I have ended up with a premium laptop that is light, portable, and excellent performance for less than most Chromebooks. I have installed &lt;a href="https://kubuntu.org/"&gt;Kubuntu 19.10&lt;/a&gt; and couldn&amp;rsquo;t be happier. Everything on this laptop functions, and it even has a backlight keyboard.&lt;/p&gt;</description></item><item><title>K8s YAML Alternative: Python</title><link>https://phillipsj.net/posts/k8s-yaml-alternative-python/</link><pubDate>Thu, 27 Feb 2020 21:39:36 -0500</pubDate><guid>https://phillipsj.net/posts/k8s-yaml-alternative-python/</guid><description>&lt;p&gt;In a previous set of posts I have shown examples using &lt;a href="https://www.phillipsj.net/posts/k8s-yaml-alternative-json/"&gt;JSON&lt;/a&gt;, &lt;a href="https://www.phillipsj.net/posts/k8s-yaml-alternative-dotnet/"&gt;.NET&lt;/a&gt;, &lt;a href="https://www.phillipsj.net/posts/k8s-yaml-alternative-terraform/"&gt;Terraform&lt;/a&gt;, and &lt;a href="https://www.phillipsj.net/posts/k8s-yaml-alternative-java/"&gt;Java&lt;/a&gt; instead of YAML. This post is going to show another alternative using Python. I will be using the same Kubernetes object to allow comparison.&lt;/p&gt;
&lt;h2 id="yaml-object"&gt;YAML Object&lt;/h2&gt;
&lt;p&gt;We are going to create a busybox pod. This manifest isn&amp;rsquo;t a super simple example, nor is it a complex example. This manifest should allow demonstrating the differences. Here is the pod YAML.&lt;/p&gt;</description></item><item><title>K8s YAML Alternative: Java</title><link>https://phillipsj.net/posts/k8s-yaml-alternative-java/</link><pubDate>Mon, 17 Feb 2020 20:39:36 -0500</pubDate><guid>https://phillipsj.net/posts/k8s-yaml-alternative-java/</guid><description>&lt;p&gt;In a previous set of posts I have shown examples using &lt;a href="https://www.phillipsj.net/posts/k8s-yaml-alternative-json/"&gt;JSON&lt;/a&gt;, &lt;a href="https://www.phillipsj.net/posts/k8s-yaml-alternative-dotnet/"&gt;.NET&lt;/a&gt;, and &lt;a href="https://www.phillipsj.net/posts/k8s-yaml-alternative-terraform/"&gt;Terraform&lt;/a&gt; instead of YAML. This post is going to show another alternative using Java. I will be using the same Kubernetes object to allow comparison.&lt;/p&gt;
&lt;h2 id="yaml-object"&gt;YAML Object&lt;/h2&gt;
&lt;p&gt;We are going to create a busybox pod. This manifest isn&amp;rsquo;t a super simple example, nor is it a complex example. This manifest should allow demonstrating the differences. Here is the pod YAML.&lt;/p&gt;</description></item><item><title>K8s YAML Alternative: Terraform</title><link>https://phillipsj.net/posts/k8s-yaml-alternative-terraform/</link><pubDate>Sun, 16 Feb 2020 14:39:36 -0500</pubDate><guid>https://phillipsj.net/posts/k8s-yaml-alternative-terraform/</guid><description>&lt;p&gt;In a previous set of posts I have shown examples using &lt;a href="https://www.phillipsj.net/posts/k8s-yaml-alternative-json/"&gt;JSON&lt;/a&gt; and &lt;a href="https://www.phillipsj.net/posts/k8s-yaml-alternative-dotnet/"&gt;.NET&lt;/a&gt; instead of YAML. This post is going to show another alternative using Terraform. I will be using the same Kubernetes object to allow comparison.&lt;/p&gt;
&lt;h2 id="yaml-object"&gt;YAML Object&lt;/h2&gt;
&lt;p&gt;We are going to create a busybox pod. This manifest isn&amp;rsquo;t a super simple example, nor is it a complex example. This manifest should allow demonstrating the differences. Here is the pod YAML.&lt;/p&gt;</description></item><item><title>K8s YAML Alternative: .NET</title><link>https://phillipsj.net/posts/k8s-yaml-alternative-dotnet/</link><pubDate>Sat, 15 Feb 2020 21:39:36 -0500</pubDate><guid>https://phillipsj.net/posts/k8s-yaml-alternative-dotnet/</guid><description>&lt;p&gt;In a previous &lt;a href="https://www.phillipsj.net/posts/k8s-yaml-alternative-json/"&gt;post&lt;/a&gt; I showed how to use JSON instead of YAML. This post is going to show another alternative using .NET. This example will be displayed using both C# and F#. I will be using the same Kubernetes object to allow comparison.&lt;/p&gt;
&lt;h2 id="yaml-object"&gt;YAML Object&lt;/h2&gt;
&lt;p&gt;We are going to create a busybox pod. This manifest isn&amp;rsquo;t a super simple example, nor is it a complex example. This manifest should allow demonstrating the differences. Here is the pod YAML.&lt;/p&gt;</description></item><item><title>K8s YAML Alternative: JSON</title><link>https://phillipsj.net/posts/k8s-yaml-alternative-json/</link><pubDate>Thu, 13 Feb 2020 21:39:36 -0500</pubDate><guid>https://phillipsj.net/posts/k8s-yaml-alternative-json/</guid><description>&lt;p&gt;There seems to be a lot of dislike of YAML circling lately in tech social media channels. It wasn&amp;rsquo;t until I started using YAML regularly that I started enjoying it. The &lt;a href="https://linuxacademy.com/course/yaml-essentials/"&gt;YAML Essentials&lt;/a&gt; course on &lt;a href="https://linuxacademy.com"&gt;Linux Academy&lt;/a&gt; was the exposure that I needed to get me over that hump. The &lt;em&gt;aha moment&lt;/em&gt; for me was when I finally realized how it parses to JSON. After that, I had a much easier time creating it.&lt;/p&gt;</description></item><item><title>2020 Predictions</title><link>https://phillipsj.net/posts/2020-predictions/</link><pubDate>Sun, 02 Feb 2020 17:15:24 +0000</pubDate><guid>https://phillipsj.net/posts/2020-predictions/</guid><description>&lt;h1 id="2020-predictions"&gt;2020 Predictions&lt;/h1&gt;
&lt;p&gt;I made predictions last year, and I was debating if I wanted to do them again this year. As you can guess from this post, I decided to do it again. I have been struggling with coming up with stuff I would like to predict, but I think I have a few now.&lt;/p&gt;
&lt;h2 id="more-arm-based-laptops-and-desktops"&gt;More ARM-based laptops and desktops&lt;/h2&gt;
&lt;p&gt;That&amp;rsquo;s right, and I predict that ARM will gain more steam, and we will see new ARM laptops and an actual desktop ARM computer released. I am not counting single board computers or other similar devices. I am going to be more specific and say something like an Intel NUC or SFF (small form factor) device. A bonus prediction is that these will have 8GB of RAM. I have been impressed with my PineBook Pro, and you should check out my &lt;a href="https://www.youtube.com/channel/UCKGt52ca8BvLTgDP5KIKzCA"&gt;YouTube channel&lt;/a&gt; for the videos that I am doing with it.&lt;/p&gt;</description></item><item><title>2019 Predictions Review</title><link>https://phillipsj.net/posts/2019-predictions-review/</link><pubDate>Mon, 30 Dec 2019 21:23:03 -0500</pubDate><guid>https://phillipsj.net/posts/2019-predictions-review/</guid><description>&lt;p&gt;Last year I did my first &lt;a href="https://www.phillipsj.net/posts/2019-predictions/"&gt;post&lt;/a&gt; for my predictions for 2019. This will be my first review of my predictions. I am going to set some rules in this post about how I am going to count these predictions. If it partially happens, I will get half a point. If it actually happened, I will get a full point. This is all for fun, and the points are made up, but I still feel it is worth tracking. So what were my predictions?&lt;/p&gt;</description></item><item><title>SQL Server on Linux on Kubernetes Part 2</title><link>https://phillipsj.net/posts/sql-server-on-linux-on-kubernetes-part-2/</link><pubDate>Sat, 28 Dec 2019 22:36:26 -0500</pubDate><guid>https://phillipsj.net/posts/sql-server-on-linux-on-kubernetes-part-2/</guid><description>&lt;p&gt;This is part 2 of a series of posts about running SQL Server on Linux on Kubernetes. If you haven&amp;rsquo;t read &lt;a href="https://www.phillipsj.net/posts/sql-server-on-linux-on-kubernetes-part-1/"&gt;part 1&lt;/a&gt;, I will encourage you to start there as this builds upon the work that came before. In part 1, we were able to deploy SQL Server on Linux as a container running in a pod on Kubernetes. We exposed that pod with a service and connected to it using Azure Data Studio. However, we took a few shortcuts like not providing any persistent storage for our data, and we embedded our database password in our manifest file. In part 2, we are going to create persistent storage and configure a secret object to hold our database password.&lt;/p&gt;</description></item><item><title>SQL Server on Linux on Kubernetes: Part 1</title><link>https://phillipsj.net/posts/sql-server-on-linux-on-kubernetes-part-1/</link><pubDate>Fri, 27 Dec 2019 21:07:47 -0500</pubDate><guid>https://phillipsj.net/posts/sql-server-on-linux-on-kubernetes-part-1/</guid><description>&lt;p&gt;In this post, I am going to walk you through a basic deployment of SQL Server on Linux to Kubernetes. We will create two Kubernetes objects, a Pod and a Service to expose our SQL Server. Once it is running on our cluster, we will connect to it using Azure Data Studio. I am using Ubuntu 18.04 with MicroK8s as my Kubernetes cluster. Please read &lt;a href="https://www.phillipsj.net/posts/exploring-kubernetes-with-microk8s/"&gt;Exploring Kubernetes with MicroK8s&lt;/a&gt; and configure your MicroK8s as outlined in it. Note that this will not have persistent storage or proper secret management, and those will be something we will add in future posts.&lt;/p&gt;</description></item><item><title>My CKA Experience</title><link>https://phillipsj.net/posts/my-cka-experience/</link><pubDate>Thu, 26 Dec 2019 20:55:38 -0500</pubDate><guid>https://phillipsj.net/posts/my-cka-experience/</guid><description>&lt;p&gt;I just recently passed the &lt;a href="https://www.cncf.io/certification/cka/"&gt;Certified Kubernetes Administrator&lt;/a&gt; exam, and I want to share my experience and advice.&lt;/p&gt;
&lt;h3 id="experience"&gt;Experience&lt;/h3&gt;
&lt;p&gt;Overall, I felt the experience was perfectly fine. This isn&amp;rsquo;t the first time that I have taken a certification exam remotely. The preparation is the same as the others. Basically, clean your desk leaving only a single computer and screen visible. Place sheets over other things in the room like bookshelves. I route my cables for my webcam, so I rerouted those to have slack as you will need to be able to pan your area with your webcam. I will say that the actual exam was better than the two I had taken with PearsonVue. I will still do remote exams with PearsonVue, but this one was much smoother. There are a few simulators available on GitHub, and there is the one by &lt;a href="https://www.cncf.io/certification/cka/"&gt;Killer.sh&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Azure Image Builder</title><link>https://phillipsj.net/posts/azure-image-builder/</link><pubDate>Fri, 20 Dec 2019 16:40:41 -0500</pubDate><guid>https://phillipsj.net/posts/azure-image-builder/</guid><description>&lt;p&gt;&lt;img src="https://phillipsj.net/images/azure-image-builder/azureadvent.jpeg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Video is &lt;a href="https://youtu.be/moLoVIJgZ-g"&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/Pixel_Robots"&gt;@Pixel_Robots&lt;/a&gt; and &lt;a href="https://twitter.com/gregor_suttie"&gt;@gregor_suttie&lt;/a&gt; put together an &lt;a href="https://azureadventcalendar.com/"&gt;Azure Advent Calendar&lt;/a&gt; and I agreed to do a post and &lt;a href=""&gt;video&lt;/a&gt; on &lt;a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/image-builder-overview"&gt;Azure Image Builder&lt;/a&gt;. Azure Image Builder is Microsoft&amp;rsquo;s answer to providing a &amp;ldquo;native&amp;rdquo; way to build virtual machine images in Azure. It is powered by &lt;a href="https://www.packer.io/"&gt;Packer&lt;/a&gt; on the backend, but there are few nice features like the auto-deprovisioning and the handling of Windows restarts. If you are comfortable with creating ARM templates, then the syntax should help you feel at home.&lt;/p&gt;</description></item><item><title>Exploring Kubernetes With MicroK8s</title><link>https://phillipsj.net/posts/exploring-kubernetes-with-microk8s/</link><pubDate>Fri, 13 Dec 2019 21:15:46 -0500</pubDate><guid>https://phillipsj.net/posts/exploring-kubernetes-with-microk8s/</guid><description>&lt;p&gt;I am kicking off a new series of posts revolving around exploring &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt; by using &lt;a href="https://microk8s.io/"&gt;MicroK8s&lt;/a&gt;. MicroK8s is a certified Kubernetes distribution by &lt;a href="https://canonical.com/"&gt;Canonical&lt;/a&gt;, the creators of &lt;a href="https://ubuntu.com/"&gt;Ubuntu&lt;/a&gt; that provides a single package for installing a complete Kubernetes environment with an easy use set of commands for adding standard packages.&lt;/p&gt;
&lt;p&gt;You can run MicroK8s on Linux, Windows, or macOS, and there are instructions for doing so on the site. I am going to keep this simple and assume you are using one of the following.&lt;/p&gt;</description></item><item><title>Why I created my own Terraform extension</title><link>https://phillipsj.net/posts/why-i-created-my-own-terraform-extension/</link><pubDate>Wed, 11 Dec 2019 22:08:10 -0500</pubDate><guid>https://phillipsj.net/posts/why-i-created-my-own-terraform-extension/</guid><description>&lt;p&gt;It has been a little over a year ago since I released an Azure DevOps &lt;a href="https://marketplace.visualstudio.com/items?itemName=JamiePhillips.Terraform&amp;amp;ssr=false#overview"&gt;extension&lt;/a&gt; for Terraform to the Visual Studio Marketplace. Recently, someone asked why I chose to create my extension vs. using one of the existing extensions. It came down to three reasons: flexibility, control, and simplicity. Many of the other extensions work just fine, but the behavior was not what I wanted. I wanted an extension that installed Terraform and then would let me leverage the PowerShell task to perform all of my actual commands. The PowerShell task provided me the ultimate flexibility and control over how my Terraform commands were executed and allowed me to perform executions in specific folders and not all. Many of the other extensions have improved over the last year, but in general, I felt many were too UI driven and didn&amp;rsquo;t leverage Terraform&amp;rsquo;s ability to leverage environment variables. Some of the extensions that currently in the marketplace require installation of Terraform every single time a task executed, increasing the build times. This tells me that the extension isn&amp;rsquo;t leveraging the tool cache on the first run of the task. Other tasks have odd expectations for how the commands should be structured. Given this I decided to make my own extension, in reality I could and probably should have leveraged the &lt;a href="https://chocolatey.org/"&gt;Chocolatey&lt;/a&gt; task to install Terraform. This would be my recommendation solution to anyone that wants more control.&lt;/p&gt;</description></item><item><title>Azure Database for MySQL and Grafana</title><link>https://phillipsj.net/posts/azure-database-for-mysql-and-grafana/</link><pubDate>Tue, 08 Oct 2019 20:13:17 -0400</pubDate><guid>https://phillipsj.net/posts/azure-database-for-mysql-and-grafana/</guid><description>&lt;p&gt;I have done a previous &lt;a href="https://www.phillipsj.net/posts/an-easy-grafana-setup-using-azure-app-service-for-linux/"&gt;post&lt;/a&gt; about running the Grafana container on Azure App Service for Linux and hosting the SQLite database in Azure Blob Storage that mounts to the container. SQLite may not be what you are seeking, and if you would like to step up to a truly hosted database solution. You have two choices for Grafana, PostgreSQL, and MySQL. If you head over to the official Grafana docs about &lt;a href="https://grafana.com/docs/features/datasources/postgres/"&gt;PostgreSQL&lt;/a&gt; you will see a note at the top of the page saying that a bug prevents the usage of those specific versions of PostgreSQL. Let&amp;rsquo;s check this list against the Azure Database for PostgreSQL &lt;a href="https://docs.microsoft.com/en-us/azure/postgresql/concepts-supported-versions"&gt;supported versions&lt;/a&gt; page. The listed versions running in Azure are the ones Grafana says we cannot use. Not running a supported version of PostgreSQL makes it a natural choice if you want to keep it all in Azure, Azure Database for MySQL it is. We will use version 8 as it is supported. Let&amp;rsquo;s create our Azure Database for MySQL.&lt;/p&gt;</description></item><item><title>NPM install on Linux without sudo</title><link>https://phillipsj.net/posts/npm-install-on-linux-without-sudo/</link><pubDate>Mon, 23 Sep 2019 21:59:16 -0400</pubDate><guid>https://phillipsj.net/posts/npm-install-on-linux-without-sudo/</guid><description>&lt;p&gt;Requiring admin to install packages is one of the most frustrating things I have working on Linux. Its when I am using a tool that the package manager doesn&amp;rsquo;t automatically expect package installation in the user&amp;rsquo;s home directory. NPM does this when installing global tools, and here is the script I use to fix it. Luckily, &lt;a href="https://github.com/glenpike"&gt;Glen Pike&lt;/a&gt; has this script called &lt;a href="https://github.com/glenpike/npm-g_nosudo"&gt;npm-g_nosudo&lt;/a&gt; that configures NPM to use your home directory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;As with all scripts from the internet, please read it before running it. If you have questions, please ask someone to explain it to you.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Azure CLI on Manjaro</title><link>https://phillipsj.net/posts/azure-cli-on-manjaro/</link><pubDate>Sat, 21 Sep 2019 21:49:45 -0400</pubDate><guid>https://phillipsj.net/posts/azure-cli-on-manjaro/</guid><description>&lt;p&gt;I have decided to give &lt;a href="https://manjaro.org/"&gt;Manjaro&lt;/a&gt; Linux a couple of months as my daily driver distro to see how it works. I have only briefly tried it in the past, so this is my first time giving it any serious time. Along with a new distro comes getting all the tooling that I use regularly up and running. This post is going to cover how to get the [Azure CLI](Get started with Azure CLI | Microsoft Docs.html) installed. Microsoft primarily packages their tools for more mainstream distros like Ubuntu, RHEL, Fedora, and OpenSUSE. However, there is an option to install using an installation script which will be the option we will use, and you can find more &lt;a href="https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-linux?view=azure-cli-latest"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Wyam to Hugo</title><link>https://phillipsj.net/posts/wyam-to-hugo/</link><pubDate>Sat, 14 Sep 2019 13:52:17 -0400</pubDate><guid>https://phillipsj.net/posts/wyam-to-hugo/</guid><description>&lt;p&gt;I have been using Wyam as my static site generator for a little over two years. Recently, Wyam is morphing into a new software called &lt;a href="https://github.com/statiqdev/Framework"&gt;Statiq&lt;/a&gt; and with that change comes a change in the license. This license change prompted me to speed up the timing of the migration that I wanted to do to Hugo. With this migration, this removes the last thing that I use .NET for outside of my employment. This migration marks a significant milestone that I have wanted for some time. Let&amp;rsquo;s get into how to perform the migration.&lt;/p&gt;</description></item><item><title>Creating a desktop version of the Azure Portal with Nativefier</title><link>https://phillipsj.net/posts/creating-a-desktop-version-of-the-azure-portal-with-nativefier/</link><pubDate>Sun, 08 Sep 2019 14:04:57 +0000</pubDate><guid>https://phillipsj.net/posts/creating-a-desktop-version-of-the-azure-portal-with-nativefier/</guid><description>&lt;h1 id="creating-a-desktop-version-of-the-azure-portal-with-nativefier"&gt;Creating a desktop version of the Azure Portal with Nativefier&lt;/h1&gt;
&lt;p&gt;When I am busy throughout the day, I have tons of tabs open across multiple browsers. Since I am mainly working in the cloud, most of the applications I use are the browser. With so many tabs and browsers open, I will lose the tab that is running the Azure Portal, which increases the chance that I will have multiple tabs of it, creating even more difficult.&lt;/p&gt;</description></item><item><title>CLI Parsing with Rust</title><link>https://phillipsj.net/posts/cli-parsing-with-rust/</link><pubDate>Mon, 02 Sep 2019 10:18:11 +0000</pubDate><guid>https://phillipsj.net/posts/cli-parsing-with-rust/</guid><description>&lt;h1 id="cli-parsing-with-rust"&gt;CLI Parsing with Rust&lt;/h1&gt;
&lt;p&gt;Now that I have my previous F# code converted to Rust, it is time for me to start adding the new features and creating a CLI application. Besides deciding the command structure, there is the parsing that has to happen. Rust has a few things in the standard library to aid us in this, and it would be suitable for a small and basic CLI application. As the complexity increases, in this case, two primary commands with several subcommands, the standard library will start making it more difficult. After reviewing &lt;a href="https://crates.io/crates/structopt"&gt;StructOpt&lt;/a&gt; and &lt;a href="https://crates.io/crates/clap"&gt;clap&lt;/a&gt; I decided that I would roll with clap to get this app off the ground.&lt;/p&gt;</description></item><item><title>Converting F# to Rust: Remaining expressions and functions</title><link>https://phillipsj.net/posts/converting-fsharp-to-rust-remaining-expressions-and-functions/</link><pubDate>Sat, 31 Aug 2019 13:14:34 +0000</pubDate><guid>https://phillipsj.net/posts/converting-fsharp-to-rust-remaining-expressions-and-functions/</guid><description>&lt;h1 id="converting-f-to-rust-remaining-expressions-and-functions"&gt;Converting F# to Rust: Remaining expressions and functions&lt;/h1&gt;
&lt;p&gt;I am back with the final post on converting an existing F# app to Rust. The discriminated union is a crucial piece, and the last remaining part that will be difficult is the function that converts my data structure into a set of files and paths to create. Since the data structure lends itself to recursion, that is the essence of this last function. Before we dive into that function, let&amp;rsquo;s show the other pieces. I will use the heading to describe what is happening, and both code snippets are below. If you see anything, you would like to ask about don&amp;rsquo;t hesitate reach out to me.&lt;/p&gt;</description></item><item><title>Converting F# to Rust: Discriminated Unions</title><link>https://phillipsj.net/posts/converting-fsharp-to-rust-discriminated-unions/</link><pubDate>Wed, 28 Aug 2019 20:50:29 +0000</pubDate><guid>https://phillipsj.net/posts/converting-fsharp-to-rust-discriminated-unions/</guid><description>&lt;h1 id="converting-f-to-rust-discriminated-unions"&gt;Converting F# to Rust: Discriminated Unions&lt;/h1&gt;
&lt;p&gt;Almost a year ago, I created an application in F# that was a file structure generator. I created it in F# to get a better feel for functional, and it was a pretty cool project. My friend &lt;a href="http://blog.thesoftwarementor.com/"&gt;Cameron&lt;/a&gt; helped me design some of the parts. I never really finished the vision that I had for that project and to finish it, I am going to convert it from F# to Rust. It&amp;rsquo;s a simple project, but it should prove to be useful for myself and any others working with Terraform.&lt;/p&gt;</description></item><item><title>Infrastructure in C# using the Azure Management SDK</title><link>https://phillipsj.net/posts/infrastructure-in-csharp-using-the-azure-management-sdk/</link><pubDate>Tue, 27 Aug 2019 20:29:57 +0000</pubDate><guid>https://phillipsj.net/posts/infrastructure-in-csharp-using-the-azure-management-sdk/</guid><description>&lt;h1 id="infrastructure-in-c-using-the-azure-management-sdk"&gt;Infrastructure in C# using the Azure Management SDK&lt;/h1&gt;
&lt;p&gt;I have wanted to this post for some time, and I thought today would be the day. If you have been a reader of my blog, then you would know that I am an advocate of using alternatives to Azure ARM templates. My favorite tool is &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt;. However, I acknowledge that many people would like to use C# to manage their infrastructure as code. There are other solutions out there, and I would encourage that you give them all a try. I am going to demonstrate how you can leverage two NuGet packages so you can have basic management of your infrastructure as code with C#. The two libraries that I am going to use are the &lt;a href="https://github.com/Azure/azure-libraries-for-net#download"&gt;Azure Management SDK for .NET&lt;/a&gt; and &lt;a href="https://github.com/adamralph/bullseye"&gt;Bullseye&lt;/a&gt; for creating tasks to execute. This code will be a simple example, and we will have a solution with a web app project and an infrastructure project. We will create a resource group, app service plan, and app service to deploy our web app project.&lt;/p&gt;</description></item><item><title>Rusty Weather: My first Rust App</title><link>https://phillipsj.net/posts/rusty-weather-my-first-rust-app/</link><pubDate>Mon, 26 Aug 2019 20:58:40 +0000</pubDate><guid>https://phillipsj.net/posts/rusty-weather-my-first-rust-app/</guid><description>&lt;h1 id="rusty-weather-my-first-rust-app"&gt;Rusty Weather: My first Rust App&lt;/h1&gt;
&lt;p&gt;I have wanted to learn a new language and framework, as well as I, know C# and .NET for many years. I have dabbled in several different ones, but the only one that I seemed to come back to continually was Python. After trying all kinds of languages over the last couple years, I decided I would give &lt;a href="https://www.rust-lang.org/"&gt;Rust&lt;/a&gt; a try. I have only been a consumer of garbage collected runtimes, so I was a bit hesitant to give it a try. But I am finding that I have enough knowledge now that I am not intimidated by it. The safety of the language prevents me from getting myself in trouble, and I like the features that are from a more functional paradigm. It is also cross-platform and works equally well on Windows as it does Linux/macOS which is impressive. I will also go out on the limb and say that &lt;a href="https://doc.rust-lang.org/cargo/"&gt;Cargo&lt;/a&gt; is one of the best package management/build tools that I have used.&lt;/p&gt;</description></item><item><title>Hyper-V enhanced session with Pop!_OS</title><link>https://phillipsj.net/posts/hyper-v-enhanced-session-with-popos/</link><pubDate>Fri, 16 Aug 2019 15:44:27 +0000</pubDate><guid>https://phillipsj.net/posts/hyper-v-enhanced-session-with-popos/</guid><description>&lt;h1 id="hyper-v-enhanced-session-with-pop_os"&gt;Hyper-V enhanced session with Pop!_OS&lt;/h1&gt;
&lt;p&gt;It&amp;rsquo;s my day off, and I decided to have a little fun. I have been using the new Hyper-V enhanced session with Ubuntu since it is available in the image gallery. The enhanced session was announced back in &lt;a href="https://www.omgubuntu.co.uk/2018/09/hyper-v-ubuntu-1804-windows-integration"&gt;September 2018&lt;/a&gt;, and so far it is only available for Ubuntu and Arch. I have been trying out &lt;a href="https://system76.com/pop"&gt;Pop!_OS&lt;/a&gt; by &lt;a href="https://system76.com"&gt;System76&lt;/a&gt; lately, and it an Ubuntu derivative. I decided that I wanted to try to see if I could get the enhanced session to work with it too. Microsoft has a GitHub &lt;a href="https://github.com/microsoft/linux-vm-tools"&gt;repo&lt;/a&gt; with installation scripts for Ubuntu, we will modify the installation script to run on Pop!_OS 19.04.&lt;/p&gt;</description></item><item><title>Performing a Checksum check with PowerShell</title><link>https://phillipsj.net/posts/performing-a-checksum-check-with-powershell/</link><pubDate>Wed, 14 Aug 2019 20:44:36 +0000</pubDate><guid>https://phillipsj.net/posts/performing-a-checksum-check-with-powershell/</guid><description>&lt;h1 id="performing-a-checksum-check-with-powershell"&gt;Performing a Checksum check with PowerShell&lt;/h1&gt;
&lt;p&gt;I am a Linux distro hopper. I like to try out new Linux distros and see how well using PowerShell and .NET development work. However, there is a task that I always struggled to do on a Windows box, that task is to perform a checksum check any ISOs I download. On Linux it is pretty simple, you do the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sha256sum pop-os_19.04_amd64_intel_10.iso
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;7e228c2928a046b86b5da07f3aa628052dfe9b12fcbde24a3c50f84f06b84cec pop-os_19.04_amd64_intel_10.iso.iso
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So you compare that hash to the one on the website. You can even read from a file that is often available. However, I have never found an easy way to do this in Windows. It seems most people point you to a utility to download. I recently was searching the web and stumbled across the &lt;strong&gt;Get-FileHash&lt;/strong&gt; command in PowerShell. Guess what, that command does exactly what I want. Here is how I use it:&lt;/p&gt;</description></item><item><title>Code Gripe: Language Arguments</title><link>https://phillipsj.net/posts/code-gripe-language-arguments/</link><pubDate>Mon, 12 Aug 2019 20:38:50 +0000</pubDate><guid>https://phillipsj.net/posts/code-gripe-language-arguments/</guid><description>&lt;h1 id="code-gripe-language-arguments"&gt;Code Gripe: Language Arguments&lt;/h1&gt;
&lt;p&gt;You see this all over the internet; this language is better than this other language. Maybe it is because it is static vs. dynamic typing, or strong typing vs. weak typing, perhaps because it is more object-oriented or functional. Maybe its because it executes faster, produces smaller binaries, etc. I can keep adding to the list of reasons why one language may be considered better than another. I used to make similar arguments, and I still have strong preferences for specific languages and language features. However, I have realized that it doesn&amp;rsquo;t make a significant difference.&lt;/p&gt;</description></item><item><title>Managing multiple versions of Terraform with Chocolatey</title><link>https://phillipsj.net/posts/managing-multiple-versions-of-terraform-with-chocolatey/</link><pubDate>Thu, 01 Aug 2019 21:39:45 +0000</pubDate><guid>https://phillipsj.net/posts/managing-multiple-versions-of-terraform-with-chocolatey/</guid><description>&lt;h1 id="managing-multiple-versions-of-terraform-with-chocolatey"&gt;Managing multiple versions of Terraform with Chocolatey&lt;/h1&gt;
&lt;p&gt;Let&amp;rsquo;s install multiple versions of Terraform using the &lt;a href="https://chocolatey.org/docs/commandsinstall#examples"&gt;Side by Side&lt;/a&gt; installation feature of Chocolatey.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-PowerShell" data-lang="PowerShell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;$&lt;/span&gt; &lt;span style="color:#000"&gt;choco&lt;/span&gt; &lt;span style="color:#000"&gt;install&lt;/span&gt; &lt;span style="color:#000"&gt;terraform&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;-&lt;/span&gt;&lt;span style="color:#000"&gt;-version&lt;/span&gt; &lt;span style="color:#0000cf;font-weight:bold"&gt;0.12&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;5&lt;/span&gt; &lt;span style="color:#000"&gt;-my&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;$&lt;/span&gt; &lt;span style="color:#000"&gt;choco&lt;/span&gt; &lt;span style="color:#000"&gt;install&lt;/span&gt; &lt;span style="color:#000"&gt;terraform&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;-&lt;/span&gt;&lt;span style="color:#000"&gt;-version&lt;/span&gt; &lt;span style="color:#0000cf;font-weight:bold"&gt;0.11&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;14&lt;/span&gt; &lt;span style="color:#000"&gt;-my&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;$&lt;/span&gt; &lt;span style="color:#000"&gt;choco&lt;/span&gt; &lt;span style="color:#000"&gt;install&lt;/span&gt; &lt;span style="color:#000"&gt;terraform&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;-&lt;/span&gt;&lt;span style="color:#000"&gt;-version&lt;/span&gt; &lt;span style="color:#0000cf;font-weight:bold"&gt;0.11&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;9&lt;/span&gt; &lt;span style="color:#000"&gt;-my&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you look in the following directory, &lt;strong&gt;C:\ProgramData\chocolatey\lib&lt;/strong&gt;, you will see a folder for each version of Terraform installed. However, when you run the following command.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-PowerShell" data-lang="PowerShell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000;font-weight:bold"&gt;$&lt;/span&gt; &lt;span style="color:#000"&gt;terraform&lt;/span&gt; &lt;span style="color:#000;font-weight:bold"&gt;-&lt;/span&gt;&lt;span style="color:#000"&gt;-version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#000"&gt;Terraform&lt;/span&gt; &lt;span style="color:#000"&gt;v0&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;11&lt;/span&gt;&lt;span style="color:#000;font-weight:bold"&gt;.&lt;/span&gt;&lt;span style="color:#000"&gt;9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That should reflect the last version that we installed. Chocolatey uses this tool called &lt;a href="https://github.com/chocolatey/shimgen"&gt;ShimGen&lt;/a&gt; to generate a &amp;ldquo;symlink&amp;rdquo; to the version installed. We could leverage that tool to allow switching between multiple versions. However, it requires Administrator privileges to work. We are going to use a PowerShell alias for Terraform so when we enter a directory with a &lt;strong&gt;.terraform-version&lt;/strong&gt; file, and we will read the version number in that file an set the alias to that location. That filename follows the convention of the &lt;a href="https://github.com/tfutils/tfenv#terraform-version"&gt;tfenv&lt;/a&gt; project so you can be cross-platform with this workflow.&lt;/p&gt;</description></item><item><title>Using ILRepack with .NET Core SDK and .NET Standard</title><link>https://phillipsj.net/posts/using-ilrepack-with-dotnet-core-sdk-and-dotnet-standard/</link><pubDate>Thu, 01 Aug 2019 20:15:57 +0000</pubDate><guid>https://phillipsj.net/posts/using-ilrepack-with-dotnet-core-sdk-and-dotnet-standard/</guid><description>&lt;h1 id="using-ilrepack-with-net-core-sdk-and-net-standard"&gt;Using ILRepack with .NET Core SDK and .NET Standard&lt;/h1&gt;
&lt;p&gt;We used to think to have a package manager in .NET would solve all of our problems, then we ended up with NuGet dependency conflicts. We later discovered the witchcraft that is assembly binding redirects. I had experienced this issue in the past, but it has more personally impacted when I authored &lt;a href="https://github.com/cake-contrib/Cake.AzureStorage"&gt;Cake.AzureStorage&lt;/a&gt; which uses the Azure Storage SDK, which has a dependency on JSON .NET. Well, unfortunately for me, Cake and several other addins had a dependency on JSON .NET and it was a different version. The solution I had available at the time leveraged ILMerge to weave those libraries into mine with a private scope. This process altered the namespace of the classes in the dlls and injected those classes directly into my code. Now that the world is finally moving on to .NET Standard, ILMerge is no longer an option to achieve this functionality. Luckily for us, a new project called &lt;a href="https://github.com/gluck/il-repack"&gt;ILRepack&lt;/a&gt; has come along to enable IL weaving for .NET Core and .NET Standard.&lt;/p&gt;</description></item><item><title>Development in a Container</title><link>https://phillipsj.net/posts/development-in-a-container/</link><pubDate>Sat, 13 Jul 2019 12:00:03 +0000</pubDate><guid>https://phillipsj.net/posts/development-in-a-container/</guid><description>&lt;h1 id="development-in-a-container"&gt;Development in a Container&lt;/h1&gt;
&lt;p&gt;I have been a skeptic of using containers for local development until recently. I have been frustrated that some of my favorite Linux distributions make it challenging to do .NET Core development. Either packages are not available or other weird behaviors with global .NET Core tools have been present. I can provide two examples of odd behavior. The first example involves using .NET Core from as a snap. However, global tools seem to struggle to find the .NET Core runtime. The second example appears to be weird behavior involving installing packages that are global tools on Fedora. It will continuously error, then start working, I haven&amp;rsquo;t had the time to track that down, primarily when I use most of my free time trying to create content.&lt;/p&gt;</description></item><item><title>An easy Grafana setup using Azure App Service for Linux</title><link>https://phillipsj.net/posts/an-easy-grafana-setup-using-azure-app-service-for-linux/</link><pubDate>Thu, 04 Jul 2019 13:23:24 +0000</pubDate><guid>https://phillipsj.net/posts/an-easy-grafana-setup-using-azure-app-service-for-linux/</guid><description>&lt;h1 id="an-easy-grafana-setup-using-azure-app-service-for-linux"&gt;An easy Grafana setup using Azure App Service for Linux&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://grafana.com/"&gt;Grafana&lt;/a&gt; is an open source platform for creating dashboards and analyzing time-series data. Grafana is written in Go and provides a feature-rich platform for visualizing any time-series data from sources like Azure Monitor, Azure Application Insights, OpenTSDB, Prometheus, InfluxDB, and many more. It has a wealth of plugins to provide visualization and source enhancements. Grafana can be purchased through Grafana Cloud, or it can be self-hosted.&lt;/p&gt;</description></item><item><title>Using Azure Front Door with IdentityServer</title><link>https://phillipsj.net/posts/using-azure-front-door-with-identityserver/</link><pubDate>Tue, 02 Jul 2019 06:51:11 +0000</pubDate><guid>https://phillipsj.net/posts/using-azure-front-door-with-identityserver/</guid><description>&lt;h1 id="using-azure-front-door-with-identityserver"&gt;Using Azure Front Door with IdentityServer&lt;/h1&gt;
&lt;p&gt;In my &lt;a href="https://www.phillipsj.net/posts/using-azure-front-door-with-dotnet-core"&gt;previous post&lt;/a&gt;, I covered some of the changes you need to make to an ASP .NET Core application for all the X-Forwarded headers to be consumed correctly. In this post, we are going to discuss what needs to happen, so &lt;a href="https://identityserver.io/"&gt;IdentityServer&lt;/a&gt; works correctly behind Azure Front Door.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;When IdentityServer is running behind a load balancer or proxy the Discovery endpoint doesn&amp;rsquo;t return the correct URIs. The reason for this is because the hostname of the App Service or server that is running IdentityServer isn&amp;rsquo;t reporting the correct hostname received from the load balancer or proxy. You could easily use my last post and configure the ForwardedHeaders middleware, but that has security implications, and we are discussing IdentityServer. Fortunately, IdentityServer does provide a solution that allows you to configure the hostname to be a value that you set using the &lt;a href="http://docs.identityserver.io/en/latest/reference/options.html#identityserver-options"&gt;PublicOrigin&lt;/a&gt; property in the IdentityServerOptions, thus ignoring the real hostname. Since IdentityServer is not communicating in a way that this would cause an issue, it makes it a natural solution that avoids the potential security issues that may arise from the ForwardedHeaders configuration.&lt;/p&gt;</description></item><item><title>Using Azure Front Door with .NET Core</title><link>https://phillipsj.net/posts/using-azure-front-door-with-dotnet-core/</link><pubDate>Sun, 30 Jun 2019 20:42:34 +0000</pubDate><guid>https://phillipsj.net/posts/using-azure-front-door-with-dotnet-core/</guid><description>&lt;h1 id="using-azure-front-door-with-net-core"&gt;Using Azure Front Door with .NET Core&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/services/frontdoor/"&gt;Front Door&lt;/a&gt; is a new service offered by Azure that takes the concepts of an Application Gateway and combines it with the global capabilities of Traffic Manager. It is a &lt;a href="https://en.wikipedia.org/wiki/OSI_model#Layer_7:_Application_Layer"&gt;layer 7&lt;/a&gt; service that provides load balancing, routing, and a web application firewall distributed globally. By using a load balancer instead of a Traffic Manager, you can get near-instant failover to another node instead of waiting until the DNS failover takes place. It also takes the overhead of managing an Application Gateway per region and making sure you architect it correctly to handle disaster recovery, etc. Using Front Door with basic applications, especially applications that are not communicating with other sites, it pretty much works out of the box. However, things are different when you are operating across many applications and using identity management across those applications with something like &lt;a href="https://identityserver.io/"&gt;IdentityServer&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Memoization in PowerShell</title><link>https://phillipsj.net/posts/memoization-in-powershell/</link><pubDate>Mon, 03 Jun 2019 21:06:46 +0000</pubDate><guid>https://phillipsj.net/posts/memoization-in-powershell/</guid><description>&lt;h1 id="memoization-in-powershell"&gt;Memoization in PowerShell&lt;/h1&gt;
&lt;p&gt;I have been working on improving my Computer Science knowledge, it has grown over the years, and I know that improving it will help my imposter syndrome. With that said, I have been spending my time reading &lt;a href="https://amzn.to/317OnvR"&gt;Classic Computer Science Problems in Python&lt;/a&gt;, this is a fantastic book, and I am confirming what I do know and learning all kinds of new information. One of the first exercises is about recursion and how you can leverage memoization to save some calculation time. I find that I learn best by taking it and applying to other languages that I know, so I decided that applying it in PowerShell sounded like fun. The problem that you use recursion to solve is a Fibonacci calculator.&lt;/p&gt;</description></item><item><title>Create more resilient PowerShell scripts on Linux</title><link>https://phillipsj.net/posts/create-more-resilient-powershell-scripts-on-linux/</link><pubDate>Thu, 30 May 2019 21:51:39 +0000</pubDate><guid>https://phillipsj.net/posts/create-more-resilient-powershell-scripts-on-linux/</guid><description>&lt;h1 id="create-more-resilient-powershell-scripts-on-linux"&gt;Create more resilient PowerShell scripts on Linux&lt;/h1&gt;
&lt;p&gt;I had previously written this &lt;a href="https://www.phillipsj.net/posts/using-powershell-scripts-from-bash"&gt;post&lt;/a&gt; on how to execute PowerShell scripts from Bash. In that post, I discussed how to add the &lt;a href="https://en.wikipedia.org/wiki/Shebang_%28Unix%29"&gt;shebang&lt;/a&gt; at the start of your script that will be ignored on non-Linux systems, but on Linux systems, it will provide the path to the interpreter you want to use, in our case it would be PowerShell. Here is a simple example:&lt;/p&gt;</description></item><item><title>How To Configure an Alias for The .NET SDK Snap</title><link>https://phillipsj.net/posts/how-to-configure-an-alias-for-the-dotnet-sdk-snap/</link><pubDate>Mon, 27 May 2019 20:35:18 +0000</pubDate><guid>https://phillipsj.net/posts/how-to-configure-an-alias-for-the-dotnet-sdk-snap/</guid><description>&lt;h1 id="how-to-configure-an-alias-for-the-net-sdk-snap"&gt;How To Configure an Alias for The .NET SDK Snap&lt;/h1&gt;
&lt;h3 id="introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://docs.snapcraft.io/"&gt;Snaps&lt;/a&gt; are packages that allow easy, agnostic, and sandboxed installation of applications on Linux. This will enable you to be able to install the same app across any Linux distribution that supports Snap packages. To aid you in working with Microsoft applications, they have started creating Snaps for &lt;a href="https://snapcraft.io/powershell"&gt;PowerShell&lt;/a&gt;, &lt;a href="https://snapcraft.io/code"&gt;Visual Studio Code&lt;/a&gt;, and the &lt;a href="https://snapcraft.io/dotnet-sdk"&gt;.NET SDK&lt;/a&gt;. The PowerShell and Visual Studio Code Snaps operate as one would expect, however, the .NET SDK Snap doesn&amp;rsquo;t perform as you would expect. Due to the nature of the sandboxing technology used by Snaps, the commands for the application are structured as follows: &lt;strong&gt;application-name.command&lt;/strong&gt;. What this means is that to call the .NET SDK on the command line, you will need to execute the following command:&lt;/p&gt;</description></item><item><title>Getting Started with DevOps</title><link>https://phillipsj.net/posts/getting-started-with-devops/</link><pubDate>Sat, 27 Apr 2019 19:22:19 +0000</pubDate><guid>https://phillipsj.net/posts/getting-started-with-devops/</guid><description>&lt;h1 id="getting-started-with-devops"&gt;Getting Started with DevOps&lt;/h1&gt;
&lt;p&gt;I have had the privilege to speak about DevOps at several conferences over the years. I always seem to get asked this
one question, &amp;ldquo;How do I get started doing DevOps?&amp;rdquo;. That is still a great question, and I have found it hard to write
about it. Well, this is my first attempt at writing about it.&lt;/p&gt;
&lt;p&gt;DevOps is the union of development and operations, which means that both teams need to work together. It&amp;rsquo;s easy to say
that you need to work together and let&amp;rsquo;s face it, that doesn&amp;rsquo;t work unless you get to know each other. That is part 1 of
what I think it takes to get started doing DevOps, start getting to know the other teams. Go to lunch, hang out after
work, lend a helping hand on tasks, foster empathy between the teams. As the teams get to know each other the
conversations that will need to occur will happen naturally after the teams start respecting each other and growing
together.&lt;/p&gt;</description></item><item><title>YouTube Channel</title><link>https://phillipsj.net/posts/youtube-channel/</link><pubDate>Wed, 24 Apr 2019 20:18:48 +0000</pubDate><guid>https://phillipsj.net/posts/youtube-channel/</guid><description>&lt;h1 id="youtube-channel"&gt;YouTube Channel&lt;/h1&gt;
&lt;p&gt;I have been wanting to communicate some ideas that I have and start sharing information differently. I plan to continue blogging, but I wanted to start creating videos, so I started a &lt;a href="https://www.youtube.com/channel/UCKGt52ca8BvLTgDP5KIKzCA"&gt;YouTube channel&lt;/a&gt;. If you like what I have been doing here on this blog, please check out my channel. I have just started, and my primary focus right now is discussing topics and ideas around DevOps. I do plan to add some tutorials, but that is a few more videos down the road.&lt;/p&gt;</description></item><item><title>Intel NUCs for Development</title><link>https://phillipsj.net/posts/intel-nucs-for-development/</link><pubDate>Mon, 22 Apr 2019 21:45:31 +0000</pubDate><guid>https://phillipsj.net/posts/intel-nucs-for-development/</guid><description>&lt;h1 id="intel-nucs-for-development"&gt;Intel NUCs for Development&lt;/h1&gt;
&lt;p&gt;Intel has been creating these little machines called NUC, Next Unit of Computing, for more than a few years. I purchased my first one last year, the &lt;a href="https://ark.intel.com/content/www/us/en/ark/products/126137/intel-nuc-kit-nuc7pjyh.html"&gt;NUC7PJYH&lt;/a&gt;, which has the quad-core Pentium Silver. I built it out with 2x4GB 2400Mhz RAM and a 256GB Samsung 850 EVO only running various flavors of Linux. This little machine has been a dream, the small size combined with the rock solid support for Intel products in the Linux kernel has made it a pleasure to use to perform work. It has HDMI 2.0 and can drive my LG 34in Ultrawide 3840 x 1440 without any issue, all ports are USB 3.0, and a Thunderbolt port. It&amp;rsquo;s also very quiet and doesn&amp;rsquo;t produce any noise. I plan to take the NUC7PJYH and install a server Linux distro. I will configure it to be a TeamCity server as I want to be able to perform my own local builds. I will post back on that once I get completed.&lt;/p&gt;</description></item><item><title>Getting started using Azure AD Auth with an Azure SQL Database</title><link>https://phillipsj.net/posts/getting-started-using-azure-ad-auth-with-an-azure-sql-database/</link><pubDate>Mon, 25 Mar 2019 19:19:13 +0000</pubDate><guid>https://phillipsj.net/posts/getting-started-using-azure-ad-auth-with-an-azure-sql-database/</guid><description>&lt;h1 id="getting-started-using-azure-ad-auth-with-an-azure-sql-database"&gt;Getting started using Azure AD Auth with an Azure SQL Database&lt;/h1&gt;
&lt;p&gt;If you don&amp;rsquo;t know, you can use Azure Active Directory Authentication with Azure SQL Database. The &lt;a href="https://docs.microsoft.com/en-us/azure/sql-database/sql-database-control-access#authentication"&gt;documentation&lt;/a&gt; includes the basics, but I wanted to outline the steps and additional information that I have learned. You can connect using SQL Server Management Studio, Azure Data Studio, and SQL Server Data Tools if you use the AD with MFA options. Here are my recommendations for setup and some watch outs.&lt;/p&gt;</description></item><item><title>SQL Server on QNAP NAS</title><link>https://phillipsj.net/posts/sql-server-on-qnap-nas/</link><pubDate>Thu, 21 Mar 2019 20:16:43 +0000</pubDate><guid>https://phillipsj.net/posts/sql-server-on-qnap-nas/</guid><description>&lt;h1 id="sql-server-on-qnap-nas"&gt;SQL Server on QNAP NAS&lt;/h1&gt;
&lt;p&gt;I run an Intel NUC model NUC7PJYH as my desktop development environment using some Linux distro as my OS. I have been doing some tinkering using SQL Server on Linux, and by the time I spin up docker and the SQL Server container, it starts taking up some resources on my little NUC that I just don&amp;rsquo;t want to give up. I have a QNAP NAS sitting next to me that has an Intel processor and can run QNAP Container Station. I don&amp;rsquo;t use that NAS for much other than photos and some backups, so I am going to put it to work running a SQL Server on Linux container. Here is how I accomplished getting it to run.&lt;/p&gt;</description></item><item><title>Conventions used by Containers on Azure App Service</title><link>https://phillipsj.net/posts/conventions-used-by-containers-on-azure-app-service/</link><pubDate>Sat, 16 Mar 2019 19:50:54 +0000</pubDate><guid>https://phillipsj.net/posts/conventions-used-by-containers-on-azure-app-service/</guid><description>&lt;h1 id="conventions-used-by-containers-on-azure-app-service"&gt;Conventions used by Containers on Azure App Service&lt;/h1&gt;
&lt;p&gt;If you have been planning to use containers on Azure App Service, there are some conventions used that helps you get up and running. I have found that they are not all consolidated in one place and there isn&amp;rsquo;t any dedicate documentation for those conventions. I have seen they are sprinkled throughout the various docs, and this is an attempt to consolidate that information and learn all of the conventions myself.&lt;/p&gt;</description></item><item><title>Azure App Service settings from Azure DevOps</title><link>https://phillipsj.net/posts/azure-app-service-settings-from-azure-devops/</link><pubDate>Sat, 09 Mar 2019 18:05:34 +0000</pubDate><guid>https://phillipsj.net/posts/azure-app-service-settings-from-azure-devops/</guid><description>&lt;h1 id="azure-app-service-settings-from-azure-devops"&gt;Azure App Service settings from Azure DevOps&lt;/h1&gt;
&lt;p&gt;This post is an interesting post to be writing, something that would seem straight forward has turned out not to be or else I wouldn&amp;rsquo;t be writing about it. While trying to deploy a .NET full framework app to Azure App Service using Azure DevOps I needed to update a few app setting keys and a connection string. This task would seem to be something that would be straight forward, but it wasn&amp;rsquo;t. I am going to start with the hard lessons I learned first.&lt;/p&gt;</description></item><item><title>Deploying Dash to Azure without using Docker</title><link>https://phillipsj.net/posts/deploying-dash-to-azure-without-using-docker/</link><pubDate>Mon, 25 Feb 2019 20:42:09 +0000</pubDate><guid>https://phillipsj.net/posts/deploying-dash-to-azure-without-using-docker/</guid><description>&lt;h1 id="deploying-dash-to-azure-without-using-docker"&gt;Deploying Dash to Azure without using Docker&lt;/h1&gt;
&lt;p&gt;This post is the fourth post concerning Dash and the second post about deploying to Azure App Service. My previous Azure post has been popular, and I thought I was doing a disservice to Azure by using a container to deploy a Python application. Let&amp;rsquo;s get started by building our example application which, if you have read the other posts, will look super familiar.&lt;/p&gt;</description></item><item><title>Deploying Dash to Google App Engine</title><link>https://phillipsj.net/posts/deploying-dash-to-google-app-engine/</link><pubDate>Sat, 23 Feb 2019 21:38:43 +0000</pubDate><guid>https://phillipsj.net/posts/deploying-dash-to-google-app-engine/</guid><description>&lt;h1 id="deploying-dash-to-google-app-engine"&gt;Deploying Dash to Google App Engine&lt;/h1&gt;
&lt;p&gt;This post is the third post concerning Dash and rounds out the exercise of deploying a Dash app to three of the major cloud vendors. My previous posts on &lt;a href="https://www.phillipsj.net/posts/deploying-dash-to-azure-app-service"&gt;Azure&lt;/a&gt; and &lt;a href="https://www.phillipsj.net/posts/deploying-dash-to-elastic-beanstalk"&gt;AWS&lt;/a&gt; seem to have added a lot of value so doing one on Google App Engine just seemed like the natural progression. Let&amp;rsquo;s get started.&lt;/p&gt;
&lt;h2 id="step-1-create-dash-virtual-environment"&gt;Step 1: Create Dash Virtual Environment&lt;/h2&gt;
&lt;p&gt;As with any Python project, let&amp;rsquo;s create a virtual environment for our dash app. This tutorial will assume you are working on Ubuntu.&lt;/p&gt;</description></item><item><title>Terraform tips for Azure SQL DB</title><link>https://phillipsj.net/posts/terraform-tips-for-azure-sql-db/</link><pubDate>Thu, 21 Feb 2019 19:57:17 +0000</pubDate><guid>https://phillipsj.net/posts/terraform-tips-for-azure-sql-db/</guid><description>&lt;h1 id="terraform-tips-for-azure-sql-db"&gt;Terraform tips for Azure SQL DB&lt;/h1&gt;
&lt;p&gt;Here are a few specific tips for using Terraform with Azure SQL DB. Most of this is in the HashiCorp documentation, but it isn&amp;rsquo;t always obvious. Without any further discussion, let&amp;rsquo;s jump into these.&lt;/p&gt;
&lt;h2 id="1-allowing-azure-services"&gt;1. Allowing Azure Services&lt;/h2&gt;
&lt;p&gt;When using the Azure Portal, you have the option to enable allowing Azure Services access. Here is the location.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://phillipsj.net/images/other-posts/AllowAzureServices.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;However, Terraform doesn&amp;rsquo;t enable this feature by default which is great as it makes it something you have to define it explicitly. There is a note section located in the Terraform docs &lt;a href="https://www.terraform.io/docs/providers/azurerm/r/sql_firewall_rule.html#argument-reference"&gt;here&lt;/a&gt;. And this is what that will look like in Terraform.&lt;/p&gt;</description></item><item><title>Deploying Lucky via Docker</title><link>https://phillipsj.net/posts/deploying-lucky-via-docker/</link><pubDate>Sat, 16 Feb 2019 19:40:45 +0000</pubDate><guid>https://phillipsj.net/posts/deploying-lucky-via-docker/</guid><description>&lt;h1 id="deploying-lucky-via-docker"&gt;Deploying Lucky via Docker&lt;/h1&gt;
&lt;p&gt;In my last &lt;a href="https://www.phillipsj.net/posts/creating-a-dockerfile-for-lucky"&gt;post&lt;/a&gt; we created a Docker image for building Lucky or using it for doing local development. In this post, we are going to take it to the next step and use the image we created as part of a multi-stage build that will generate us a final container that we can use to deploy our Lucky application.&lt;/p&gt;
&lt;p&gt;I have pushed up my container to &lt;a href="https://hub.docker.com/r/blueghostlabs/lucky"&gt;Docker Hub&lt;/a&gt;, and you can use it if you want. I do plan on maintaining it, and if the project is interested, I would be more than happy to support that effort.&lt;/p&gt;</description></item><item><title>Creating a Dockerfile for Lucky</title><link>https://phillipsj.net/posts/creating-a-dockerfile-for-lucky/</link><pubDate>Thu, 14 Feb 2019 20:43:43 +0000</pubDate><guid>https://phillipsj.net/posts/creating-a-dockerfile-for-lucky/</guid><description>&lt;h1 id="creating-a-dockerfile-for-lucky"&gt;Creating a Dockerfile for Lucky&lt;/h1&gt;
&lt;p&gt;I&amp;rsquo;ve been learning both &lt;a href="https://luckyframework.org/"&gt;Lucky&lt;/a&gt; and &lt;a href="https://crystal-lang.org/"&gt;Crystal&lt;/a&gt;. One item that I always want to understand is what is the build and deployment process for a framework and language. That always ends up being the sticking point for me. If I can&amp;rsquo;t create a build pipeline with a little effort, then I am just not interested in working with it. While Lucky may seem a little complex, it isn&amp;rsquo;t actually too many steps.&lt;/p&gt;</description></item><item><title>Packaging .NET Core with Flatpak</title><link>https://phillipsj.net/posts/packaging-dotnet-core-with-flatpak/</link><pubDate>Sat, 09 Feb 2019 21:23:20 +0000</pubDate><guid>https://phillipsj.net/posts/packaging-dotnet-core-with-flatpak/</guid><description>&lt;h1 id="packaging-net-core-with-flatpak"&gt;Packaging .NET Core with Flatpak&lt;/h1&gt;
&lt;p&gt;Someone reminded me on Twitter that I mentioned covering how to package .NET Core applications using &lt;a href="https://flatpak.org/"&gt;Flatpak&lt;/a&gt; or &lt;a href="https://snapcraft.io/"&gt;Snaps&lt;/a&gt;. Here is a quick guide on how to create a Flatpak app with .NET Core. You will need to be on a Linux distribution that you can install the Flatpak tools. I am using an Ubuntu-based distro so that will be the steps that I show. Let&amp;rsquo;s jump in and get started.&lt;/p&gt;</description></item><item><title>Crystal on Azure App Service</title><link>https://phillipsj.net/posts/crystal-on-azure-app-service/</link><pubDate>Wed, 06 Feb 2019 21:48:49 +0000</pubDate><guid>https://phillipsj.net/posts/crystal-on-azure-app-service/</guid><description>&lt;h1 id="crystal-on-azure-app-service"&gt;Crystal on Azure App Service&lt;/h1&gt;
&lt;p&gt;I have been investigating new languages, and &lt;a href="https://crystal-lang.org/"&gt;Crystal&lt;/a&gt; caught my attention. I have always been a fan of Ruby. However, environment configuration has always been complicated, and I was running a lot of Windows at the time. I thought what better way to play around with the language than to create a simple web server and deploy it to my cloud, Azure. I am going to leave installation up to you, however, since I am using a Docker container, you don&amp;rsquo;t need to install anything if you don&amp;rsquo;t want to test it locally.&lt;/p&gt;</description></item><item><title>Applying Azure App Service extensions with ARM</title><link>https://phillipsj.net/posts/applying-azure-app-service-extensions-with-arm/</link><pubDate>Fri, 01 Feb 2019 22:09:21 +0000</pubDate><guid>https://phillipsj.net/posts/applying-azure-app-service-extensions-with-arm/</guid><description>&lt;h1 id="applying-azure-app-service-extensions-with-arm"&gt;Applying Azure App Service extensions with ARM&lt;/h1&gt;
&lt;p&gt;Running ASP .NET Core on Azure App Service is an exciting undertaking. By default as of this blog post is .NET Core 2.1. You can use extensions to upgrade to ASP .NET Core 2.2 or use the extension to achieve better Azure integration for your ASP .NET Core apps. These extensions are easy enough to apply from the portal, however, since I believe in infrastructure as code, let&amp;rsquo;s get down to business.&lt;/p&gt;</description></item><item><title>January Blog Stats</title><link>https://phillipsj.net/posts/january-blog-stats/</link><pubDate>Thu, 31 Jan 2019 21:06:26 +0000</pubDate><guid>https://phillipsj.net/posts/january-blog-stats/</guid><description>&lt;h1 id="january-blog-stats"&gt;January Blog Stats&lt;/h1&gt;
&lt;p&gt;This post is an unusual post for me, but I thought this month turned out to be an exciting month for my blog. I haven&amp;rsquo;t blogged much this month as I have been studying for my Azure Administrator Associate certification, which I passed, the 3+ hours every night for the last month has paid off. Funny enough, my blog has broken a new record for page views, topping over 3.2k views in a month, my previous best was around 2.5k. I am so grateful for everyone taking the time to visit and here are my top 10 posts by growth this month.&lt;/p&gt;</description></item><item><title>Buy me a coffee</title><link>https://phillipsj.net/posts/buy-me-a-coffee/</link><pubDate>Sun, 13 Jan 2019 21:59:39 +0000</pubDate><guid>https://phillipsj.net/posts/buy-me-a-coffee/</guid><description>&lt;h1 id="buy-me-a-coffee"&gt;Buy me a coffee&lt;/h1&gt;
&lt;p&gt;I have created a &lt;a href="https://www.buymeacoffee.com/aQPnJ73O8"&gt;Buy me a coffee&lt;/a&gt; site based on feedback. If you find any of my OSS projects or the content I create on my blog valuable, you now have an additional way to encourage me to continue with what I am doing. The interactions on Twitter, LinkedIn, GitHub, and in person are why I do this, and I enjoy every single one. A few have expressed wanting the ability to support these efforts financially. I previously had a Patreon page configured, but due to their policies, I have removed that page. I have set my page to take any charges out of the donations. I have also enabled one-time and monthly options.&lt;/p&gt;</description></item><item><title>2019 Predictions</title><link>https://phillipsj.net/posts/2019-predictions/</link><pubDate>Tue, 25 Dec 2018 22:22:24 +0000</pubDate><guid>https://phillipsj.net/posts/2019-predictions/</guid><description>&lt;h1 id="2019-predictions"&gt;2019 Predictions&lt;/h1&gt;
&lt;p&gt;I listen to a few podcasts that do predictions for next year, then at the end of every year, they reflect back on their predictions to see what happened. I decided that I wanted to get in on the action and I am going to try to do it too. For your entertainment, here are my 2019 predictions.&lt;/p&gt;
&lt;h2 id="microsoft-windows-desktop-environment-for-linux"&gt;Microsoft Windows Desktop Environment for Linux&lt;/h2&gt;
&lt;p&gt;That&amp;rsquo;s right, I predict that Microsoft will release a desktop environment for Linux that is a very close approximation to the Windows 10 desktop environment. With the changes to Edge and other moves that Microsoft has been making, I think this is a real possibility. Microsoft is about to surpass Windows sales with Azure sales, the effort in ARM, and the push to support many of their developer tools on Linx are large factors in this one. It will be cool to see what happens.&lt;/p&gt;</description></item><item><title>Terraforming Azure SQL Database</title><link>https://phillipsj.net/posts/terraforming-azure-sql-db/</link><pubDate>Mon, 10 Dec 2018 21:05:24 +0000</pubDate><guid>https://phillipsj.net/posts/terraforming-azure-sql-db/</guid><description>&lt;h1 id="terraforming-azure-sql-database"&gt;Terraforming Azure SQL Database&lt;/h1&gt;
&lt;p&gt;In this post, we are going to learn how to use &lt;a href="https://terraform.io"&gt;Terraform&lt;/a&gt; to create an Azure SQL Database and then extend the Terraform template to create a geo-replicated database and a failover group. Let&amp;rsquo;s get started.&lt;/p&gt;
&lt;h2 id="basic-azure-sql-database"&gt;Basic Azure SQL Database&lt;/h2&gt;
&lt;p&gt;First, we are going to create a basic Azure SQL Database template. The first step is to create our terraform file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ touch main.tf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now that we have our main.tf file, let&amp;rsquo;s start adding content. First, we need to add the Azure provider.&lt;/p&gt;</description></item><item><title>Azure ARM Template Tips</title><link>https://phillipsj.net/posts/azure-arm-template-tips/</link><pubDate>Thu, 06 Dec 2018 21:03:12 +0000</pubDate><guid>https://phillipsj.net/posts/azure-arm-template-tips/</guid><description>&lt;h1 id="azure-arm-template-tips"&gt;Azure ARM Template Tips&lt;/h1&gt;
&lt;p&gt;I have had a couple of fun days learning about Azure ARM templates. I learned Terraform without really giving ARM templates a chance and I can say without a doubt it was a solid decision. ARM templates have started growing on me what little I have had to do. Here are some of the items that I have learned about ARM templates that have been important for me to know.&lt;/p&gt;</description></item><item><title>Tips when using the Azure ARM resource in Terraform</title><link>https://phillipsj.net/posts/tips-when-using-the-azure-arm-resource-in-terraform/</link><pubDate>Wed, 05 Dec 2018 21:51:18 +0000</pubDate><guid>https://phillipsj.net/posts/tips-when-using-the-azure-arm-resource-in-terraform/</guid><description>&lt;h1 id="tips-when-using-the-azure-arm-resource-in-terraform"&gt;Tips when using the Azure ARM resource in Terraform&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://www.terraform.io"&gt;Terraform&lt;/a&gt; is a great tool, occasionally you will run into instances where what you are trying to do isn&amp;rsquo;t supported yet by the Azure provider. When a feature isn&amp;rsquo;t supported you can always fall back to using the &lt;a href="https://docs.microsoft.com/en-us/powershell/azure/overview?view=azurermps-6.13.0"&gt;PowerShell module&lt;/a&gt; or the &lt;a href="https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest"&gt;Azure CLI&lt;/a&gt; as I outlined in this &lt;a href="https://www.phillipsj.net/posts/how-to-handle-unsupported-azure-features-in-terraform"&gt;post&lt;/a&gt;. There are times that those options don&amp;rsquo;t really do what you are needed. When those cases arise, don&amp;rsquo;t forget that Terraform does have the &lt;a href="https://www.terraform.io/docs/providers/azurerm/r/template_deployment.html"&gt;Azure ARM Template Resource&lt;/a&gt; that can be used to execute an &lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-authoring-templates"&gt;ARM template&lt;/a&gt; that can do what you need. Using the template itself isn&amp;rsquo;t as bad if you are used to using or types of templates in Terraform. Here are a few tips and tricks that can help you have more success. All the code can be found in this &lt;a href="https://github.com/BlueGhostLabs/terraform-azure-samples"&gt;repo&lt;/a&gt; that I will be updating with more examples and modules as I have the time. The code of interest in that repo is located in the &lt;em&gt;tf-arm&lt;/em&gt; directory in the examples directory. Okay, let&amp;rsquo;s get started.&lt;/p&gt;</description></item><item><title>Deploying Dash to Azure App Service</title><link>https://phillipsj.net/posts/deploying-dash-to-azure-app-service/</link><pubDate>Fri, 30 Nov 2018 22:43:45 +0000</pubDate><guid>https://phillipsj.net/posts/deploying-dash-to-azure-app-service/</guid><description>&lt;h1 id="deploying-dash-to-azure-app-service"&gt;Deploying Dash to Azure App Service&lt;/h1&gt;
&lt;p&gt;Before I get started on how to deploy a Dash app to Azure App Service, I am going cover Dash. &lt;a href="https://plot.ly/products/dash/"&gt;Dash&lt;/a&gt; is a Python framework for building dashboards using &lt;a href="https://plot.ly/"&gt;Plotly&lt;/a&gt; for building your charts and graphs. Dash also uses &lt;a href="http://flask.pocoo.org/"&gt;Flask&lt;/a&gt; and &lt;a href="https://reactjs.org/"&gt;React&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Since Dash is based on Flask, we can use the standard Python Docker container and any Flask tutorial for Docker as a reference. That is one advantage that I will give to Azure is that it just uses standard container images.&lt;/p&gt;</description></item><item><title>Migrating away from Cake as my blog build tool</title><link>https://phillipsj.net/posts/migrating-away-from-cake-as-my-blog-build-tool/</link><pubDate>Sun, 25 Nov 2018 21:02:50 +0000</pubDate><guid>https://phillipsj.net/posts/migrating-away-from-cake-as-my-blog-build-tool/</guid><description>&lt;h1 id="migrating-away-from-cake-as-my-blog-build-tool"&gt;Migrating away from Cake as my blog build tool&lt;/h1&gt;
&lt;p&gt;I have been using &lt;a href="https://wyam.io/"&gt;Wyam&lt;/a&gt; as my blog engine for almost two years. As part of using Wyam, I have been using the awesome &lt;a href=""&gt;Cake.Wyam&lt;/a&gt; addin for building my blog. I have paired that along with a few other Cake addins to create a Cake build script that orchestrates my builds. With &lt;a href="https://wyam.io/blog/version-2.0"&gt;Wyam 2.0&lt;/a&gt; being released and the .NET Core global tool now existing I have decided that I am going to move to a much simpler build script. This post is going to serve as the guide to how I migrated away.&lt;/p&gt;</description></item><item><title>How to configure logging for Terraform</title><link>https://phillipsj.net/posts/how-to-configure-logging-for-terraform/</link><pubDate>Sun, 25 Nov 2018 20:52:26 +0000</pubDate><guid>https://phillipsj.net/posts/how-to-configure-logging-for-terraform/</guid><description>&lt;h1 id="how-to-configure-logging-for-terraform"&gt;How to configure logging for Terraform&lt;/h1&gt;
&lt;p&gt;I have been working with &lt;a href="https://www.terraform.io"&gt;Terraform&lt;/a&gt; extensively over the last year. I have slowly been gaining knowledge for working with it in various scenarios and I always discover something new buried in the documentation that I haven&amp;rsquo;t had the need to use or I just didn&amp;rsquo;t know it existed. There have been many times that I just used the error returned from the &lt;em&gt;plan&lt;/em&gt; or &lt;em&gt;apply&lt;/em&gt; step to figure out my issue, recently I have needed more info and found that I could have Terraform perform verbose logging that puts out way more information that makes it easier to debug my issue.&lt;/p&gt;</description></item><item><title>How to configure logging for Packer</title><link>https://phillipsj.net/posts/how-to-configure-logging-for-packer/</link><pubDate>Sun, 25 Nov 2018 13:05:53 +0000</pubDate><guid>https://phillipsj.net/posts/how-to-configure-logging-for-packer/</guid><description>&lt;h1 id="how-to-configure-logging-for-packer"&gt;How to configure logging for Packer&lt;/h1&gt;
&lt;p&gt;I have been working with &lt;a href="https://www.packer.io"&gt;Packer&lt;/a&gt; extensively over the last seven months. I have slowly been gaining knowledge for working with it in various scenarios and I always discover something new buried in the documentation that I haven&amp;rsquo;t had the need to use or I just didn&amp;rsquo;t know it existed. One of these newly discovered items is how logging works with Packer.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.packer.io/docs/other/debugging.html#debugging-packer"&gt;Logging&lt;/a&gt; info is inside of the debugging section and I would encourage you to turn it on when running locally as the information is valuable and more helpful than what is written out to the console. Below are the instructions for enabling the logging on both Windows and Linux.&lt;/p&gt;</description></item><item><title>Working with SQL Server on Linux for .NET Development</title><link>https://phillipsj.net/posts/working-with-sql-server-on-linux-for-dotnet-development/</link><pubDate>Thu, 08 Nov 2018 21:24:25 +0000</pubDate><guid>https://phillipsj.net/posts/working-with-sql-server-on-linux-for-dotnet-development/</guid><description>&lt;h1 id="working-with-sql-server-on-linux-for-net-development"&gt;Working with SQL Server on Linux for .NET Development&lt;/h1&gt;
&lt;p&gt;Being .NET developer I find myself working with &lt;a href="https://www.microsoft.com/en-us/sql-server/"&gt;SQL Server&lt;/a&gt; all the time, even though that seems to be slowly changing to &lt;a href="https://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt;. In the past, this would limit my ability to do full-time development on Linux because I would still need a Windows box to run SQL Server or use a hosted solution. This doesn&amp;rsquo;t work so well when you are doing development in your free time as it is cost prohibitive. Fortunately, Microsoft has released &lt;a href="https://www.microsoft.com/en-us/sql-server/sql-server-2017-linux"&gt;SQL Server for Linux&lt;/a&gt; just last year and at the same time started producing Docker containers for it. You can find the list of Docker containers &lt;a href="https://hub.docker.com/r/microsoft/mssql-server/"&gt;here&lt;/a&gt; all based on Ubuntu.&lt;/p&gt;</description></item><item><title>Tools for Creating Blog Posts</title><link>https://phillipsj.net/posts/tools-for-creating-blog-posts/</link><pubDate>Mon, 05 Nov 2018 20:06:36 +0000</pubDate><guid>https://phillipsj.net/posts/tools-for-creating-blog-posts/</guid><description>&lt;h1 id="tools-for-creating-blog-posts"&gt;Tools for Creating Blog Posts&lt;/h1&gt;
&lt;p&gt;While I am waiting for an answer from support about a blog post I am working on, I decided that I should write up a post about the tools that I use to create my posts. I do work, both on Windows and Linux, so there are a few differences in tools, but I keep the tooling really similar.&lt;/p&gt;
&lt;h2 id="screenshots"&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;I like to take all kinds of screenshots, so a tool that gives me the ability to select an area, a window, or full screen is nice. I also like my screenshot tool to be able to do some light editing and markup. This makes it quick to get what I need to be done.&lt;/p&gt;</description></item><item><title>Mounting Azure Blob Storage Locally</title><link>https://phillipsj.net/posts/mounting-azure-blob-storage-locally/</link><pubDate>Mon, 29 Oct 2018 21:14:11 +0000</pubDate><guid>https://phillipsj.net/posts/mounting-azure-blob-storage-locally/</guid><description>&lt;h1 id="mounting-azure-blob-storage-locally"&gt;Mounting Azure Blob Storage Locally&lt;/h1&gt;
&lt;p&gt;If you are using &lt;a href="https://azure.microsoft.com/en-us/services/storage/blobs/"&gt;Azure Blob Storage&lt;/a&gt; you know how frustrating it can be to push and pull down blobs when you are doing development or supporting a production issue. You could easily pull and push blobs with something like &lt;a href="https://azure.microsoft.com/en-us/features/storage-explorer/"&gt;Azure Storage Explorer&lt;/a&gt;, however, I am going to show you have to do that using &lt;a href="https://rclone.org/"&gt;Rclone&lt;/a&gt; since it makes the process much smoother with more rapid feedback. In a previous &lt;a href="https://www.phillipsj.net/posts/using-onedrive-with-linux"&gt;post&lt;/a&gt;, I covered how to install it on Ubuntu 18.04 so I will not be covering that. What I will be covering is how to configure it for mounting an Azure Blob Storage account on both Ubuntu, including other Linux distros, and Windows. Let&amp;rsquo;s get started.&lt;/p&gt;</description></item><item><title>Using OneDrive with Linux</title><link>https://phillipsj.net/posts/using-onedrive-with-linux/</link><pubDate>Fri, 26 Oct 2018 22:09:22 +0000</pubDate><guid>https://phillipsj.net/posts/using-onedrive-with-linux/</guid><description>&lt;h1 id="using-onedrive-with-linux"&gt;Using OneDrive with Linux&lt;/h1&gt;
&lt;p&gt;I am a big user of &lt;a href="https://onedrive.live.com/about/"&gt;OneDrive&lt;/a&gt;, primarily because of the amount of storage for the price. In the past I have used &lt;a href="https://www.google.com/drive/"&gt;Google Drive&lt;/a&gt;, then I started using &lt;a href="https://www.dropbox.com/"&gt;DropBox&lt;/a&gt; more. However, I have determined that OneDrive is the best solution for my needs. One big issue with many of these storage options is that DropBox is the only one with a native Linux client which is really unfortunate. That leaves me with using a non-official solution or switching to back to DropBox or just setting up my own &lt;a href="https://nextcloud.com/"&gt;NextCloud&lt;/a&gt;. Neither of those last two options are appealing to me right now, so let&amp;rsquo;s see what options we have.&lt;/p&gt;</description></item><item><title>.NET Core Development on Ubuntu 18.10</title><link>https://phillipsj.net/posts/dotnet-core-development-on-ubuntu-18-10/</link><pubDate>Wed, 24 Oct 2018 20:42:42 +0000</pubDate><guid>https://phillipsj.net/posts/dotnet-core-development-on-ubuntu-18-10/</guid><description>&lt;h1 id="net-core-development-on-ubuntu-1810"&gt;.NET Core Development on Ubuntu 18.10&lt;/h1&gt;
&lt;p&gt;I really enjoy using Linux and specifically Debian and Ubuntu based distributions. When I started hearing the positive feedback about &lt;a href="http://releases.ubuntu.com/18.10/"&gt;Ubuntu 18.10 Cosmic CuttleFish&lt;/a&gt;, I had to give it a try. Once I got it installed I will say that it is way more responsive than Ubuntu 18.04 and resource usage seems to be down. Visually, it is a stunning release with the new &lt;a href="https://github.com/ubuntu/yaru"&gt;Yaru&lt;/a&gt; theme. The main question I had was, will .NET Core install? This is a pretty fair question considering that most of the documentation on the site is written focus on the LTS releases of Ubuntu and I cannot blame them for that. So here we go, let&amp;rsquo;s see if we can get this to work.&lt;/p&gt;</description></item><item><title>Why use Packer</title><link>https://phillipsj.net/posts/why-use-packer/</link><pubDate>Wed, 24 Oct 2018 18:00:53 +0000</pubDate><guid>https://phillipsj.net/posts/why-use-packer/</guid><description>&lt;h1 id="why-use-packer"&gt;Why use Packer&lt;/h1&gt;
&lt;p&gt;I get asked this question a couple times every few months when I am talking about &lt;a href="https://www.packer.io/"&gt;Packer&lt;/a&gt;. Especially when it comes to using Packer in tandem with &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt;. Terraform allows you to use the provisioning mechanisms native to cloud providers like AWS User data or Azure script extensions. The question comes up that with these mechanisms in place, why would I want to go through the trouble of creating an image with Packer. That is a fair question and we are going to explore some items to consider when deciding if you need to pre-bake your image or provision it on the fly.&lt;/p&gt;</description></item><item><title>.NET Core Development on Elementary OS 5.0 Juno</title><link>https://phillipsj.net/posts/dotnet-core-development-on-elementary-os-5-juno/</link><pubDate>Mon, 22 Oct 2018 22:54:54 +0000</pubDate><guid>https://phillipsj.net/posts/dotnet-core-development-on-elementary-os-5-juno/</guid><description>&lt;h1 id="net-core-development-on-elementary-os-50-juno"&gt;.NET Core Development on Elementary OS 5.0 Juno&lt;/h1&gt;
&lt;p&gt;Someone mentioned &lt;a href="https://elementary.io/"&gt;Elementary OS&lt;/a&gt; and how you would set it up to do .NET Development. In the past it would have been a little more challenging, however it seems pretty straight forward with the Juno release. Let&amp;rsquo;s get started.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://phillipsj.net/images/elementary/Desktop.png" alt=""&gt;&lt;/p&gt;
&lt;h2 id="install-eddy"&gt;Install Eddy&lt;/h2&gt;
&lt;p&gt;We need to work with installing a few debian packages and elementary doesn&amp;rsquo;t come with a graphical debian package installation tool by default.&lt;/p&gt;</description></item><item><title>Bash to PowerShell: Simple Scripts</title><link>https://phillipsj.net/posts/bash-to-powershell-simple-scripts/</link><pubDate>Sun, 21 Oct 2018 21:50:21 +0000</pubDate><guid>https://phillipsj.net/posts/bash-to-powershell-simple-scripts/</guid><description>&lt;h1 id="bash-to-powershell-simple-scripts"&gt;Bash to PowerShell: Simple Scripts&lt;/h1&gt;
&lt;p&gt;I said in a previous post that I was going to cover how to convert Bash scripts to PowerShell. I am going to start with a few simple scripts and I will do another post with converting a more complex script. There is a GitHub repo called &lt;a href="https://github.com/ruanyf/simple-bash-scripts"&gt;Simple Bash Scripts&lt;/a&gt; and I will use some of these scripts as the example as most of these are pretty simple.&lt;/p&gt;</description></item><item><title>Integrating Packer into your Azure Pipeline</title><link>https://phillipsj.net/posts/integrating-packer-into-your-azure-pipeline/</link><pubDate>Wed, 17 Oct 2018 14:49:01 +0000</pubDate><guid>https://phillipsj.net/posts/integrating-packer-into-your-azure-pipeline/</guid><description>&lt;h1 id="integrating-packer-into-your-azure-pipeline"&gt;Integrating Packer into your Azure Pipeline&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://www.packer.io/"&gt;Packer&lt;/a&gt; is a tool created by &lt;a href="https://www.hashicorp.com/"&gt;HashiCorp&lt;/a&gt; that allows you to define virtual machine images as code. This allows repeatable bulding of these images and allows automation. Automating building these images allows turning over security updates to the build process which means that you can place Packer into a Deployment Pipeline and just schedule monthly image builds so your images are always fresh.&lt;/p&gt;
&lt;p&gt;I am going to walk you through integrating Packer into Azure Pipelines. I have a sample &lt;a href="https://github.com/phillipsj/packer-azuredevops-example"&gt;repository&lt;/a&gt; out on GitHub with a couple basic packer templates with how I like to organize these.&lt;/p&gt;</description></item><item><title>Creating a PowerShell profile on Linux</title><link>https://phillipsj.net/posts/creating-a-powershell-profile-on-linux/</link><pubDate>Tue, 16 Oct 2018 18:28:39 +0000</pubDate><guid>https://phillipsj.net/posts/creating-a-powershell-profile-on-linux/</guid><description>&lt;h1 id="creating-a-powershell-profile-on-linux"&gt;Creating a PowerShell profile on Linux&lt;/h1&gt;
&lt;p&gt;In the world of Linux your shell profile is extremely important. That is what is responsible for aliases, loading plugins, loading auto-completion, and any other specific settings that you need for your environment. PowerShell isn&amp;rsquo;t any different in those regards. This post is going to cover setting up a PowerShell profile and some functionality that will be nice to add to it.&lt;/p&gt;
&lt;h2 id="setting-up-a-powershell-profile"&gt;Setting up a PowerShell profile&lt;/h2&gt;
&lt;p&gt;PowerShell sets an environment variable called &lt;em&gt;$profile&lt;/em&gt; that has the location of your profile or the location that your profile will be stored. Your profile typically has the name of &lt;em&gt;Microsoft.PowerShell_profile.ps1&lt;/em&gt;. On Windows this is stored in the user&amp;rsquo;s &lt;em&gt;Document&lt;/em&gt; folder in a folder called &lt;em&gt;WindowsPowerShell&lt;/em&gt; and has the same name.&lt;/p&gt;</description></item><item><title>PowerShell and Bash Compatibility</title><link>https://phillipsj.net/posts/powershell-and-bash-compatibility/</link><pubDate>Tue, 16 Oct 2018 16:30:07 +0000</pubDate><guid>https://phillipsj.net/posts/powershell-and-bash-compatibility/</guid><description>&lt;h1 id="powershell-and-bash-compatibility"&gt;PowerShell and Bash Compatibility&lt;/h1&gt;
&lt;p&gt;Wow! I can&amp;rsquo;t believe that I just created a post with this title, times are truly changing. In my last couple posts I have been talking about using Make to create cross-platform builds, however, one key issue to contend with is that the shell environments are drastically different at times. How would it be possible to this if the environments are that different? I am going to answer that question in this post and discuss areas that are interchangeable between PowerShell and Bash.&lt;/p&gt;</description></item><item><title>You told me to use Make, but I'm on Windows</title><link>https://phillipsj.net/posts/you-told-me-to-use-make-but-im-on-windows/</link><pubDate>Mon, 15 Oct 2018 17:05:55 +0000</pubDate><guid>https://phillipsj.net/posts/you-told-me-to-use-make-but-im-on-windows/</guid><description>&lt;h1 id="you-told-me-to-use-make-but-im-on-windows"&gt;You told me to use Make, but I&amp;rsquo;m on Windows&lt;/h1&gt;
&lt;p&gt;In my &lt;a href="https://www.phillipsj.net/posts/building-dotnet-core-apps-old-school-with-make"&gt;last&lt;/a&gt; post, I showed you how to use Make to build .NET Core applications. Now you may be saying, hey what do I do on Windows. Well, I mentioned in my last post about &lt;em&gt;nmake&lt;/em&gt;, but I didn&amp;rsquo;t provide much detail other than a reference to the documentation. With that said, here is how you get started with nmake.&lt;/p&gt;</description></item><item><title>Building .NET Core apps old school with Make</title><link>https://phillipsj.net/posts/building-dotnet-core-apps-old-school-with-make/</link><pubDate>Sun, 14 Oct 2018 20:31:28 +0000</pubDate><guid>https://phillipsj.net/posts/building-dotnet-core-apps-old-school-with-make/</guid><description>&lt;h1 id="building-net-core-apps-old-school-with-make"&gt;Building .NET Core apps old school with Make&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://bit.ly/2FXluLS"&gt;Make&lt;/a&gt; is one of the OG build tools. Make was built by Stuart Feldman in 1976. Most tools in other languages riff on the name, that is how unknowingly ubiquitous it is. Makefiles are how you specificy builds for Make. Makefiles have a lot going for them, they are cross-platform with tools like &lt;a href="https://docs.microsoft.com/en-us/cpp/build/nmake-reference?view=vs-2017"&gt;nmake&lt;/a&gt;, they are simple, and there is a ton of info on how to create them. With all of that said, a Makefile, in my opinion, are really designed to work with CLI based toolings.&lt;/p&gt;</description></item><item><title>Warp: Single executable .NET Core app</title><link>https://phillipsj.net/posts/warp-single-executable-dotnet-core-app/</link><pubDate>Fri, 12 Oct 2018 18:25:41 +0000</pubDate><guid>https://phillipsj.net/posts/warp-single-executable-dotnet-core-app/</guid><description>&lt;h1 id="warp-single-executable-net-core-app"&gt;Warp: Single executable .NET Core app&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/dgiagio/warp"&gt;Warp&lt;/a&gt; is a pretty cool tool written in Rust that compresses a self-contained published .NET Core application into a single executable. When executing, it is unpacked into a local cache. This solves the deployment issue of self-contained deployments along with providing a really nice cross platform solution. Warp was written by &lt;a href="https://github.com/dgiagio"&gt;Diego Giagio&lt;/a&gt;. I decided that I wanted to give it a try and see just how it all works. The instructions on the GitHub page are nice. These instructions will be from installing Warp to creating an application and testing it. Let&amp;rsquo;s get started.&lt;/p&gt;</description></item><item><title>Installing Azure Storage Explorer on Linux</title><link>https://phillipsj.net/posts/installing-azure-storage-explorer-on-linux/</link><pubDate>Mon, 24 Sep 2018 16:19:29 +0000</pubDate><guid>https://phillipsj.net/posts/installing-azure-storage-explorer-on-linux/</guid><description>&lt;h1 id="installing-azure-storage-explorer-on-linux"&gt;Installing Azure Storage Explorer on Linux&lt;/h1&gt;
&lt;p&gt;You can download the Linux version of &lt;a href="https://azure.microsoft.com/en-us/features/storage-explorer/"&gt;Azure Storage Explorer&lt;/a&gt; from &lt;a href="https://go.microsoft.com/fwlink/?LinkId=722418&amp;amp;clcid=0x409"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo apt install build-essential libsecret-1-0 libgconf-2-4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After these are installed, you will need to make sure that you .NET Core 2.x installed on your system. Links here.&lt;/p&gt;
&lt;p&gt;After that, let&amp;rsquo;s untar Storage Explorer.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ mkdir StorageExplorer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ mv StorageExplorer-linux-x64.tar.gz StorageExplorer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#204a87"&gt;cd&lt;/span&gt; StorageExplorer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ tar -xvf StorageExplorer-linux-x64.tar.gz StorageExplorer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With it unpackaged, it should just run. Let&amp;rsquo;s start it from the commandline.&lt;/p&gt;</description></item><item><title>How to handle unsupported Azure features in Terraform</title><link>https://phillipsj.net/posts/how-to-handle-unsupported-azure-features-in-terraform/</link><pubDate>Sat, 22 Sep 2018 21:26:39 +0000</pubDate><guid>https://phillipsj.net/posts/how-to-handle-unsupported-azure-features-in-terraform/</guid><description>&lt;h1 id="how-to-hanlde-unsupported-azure-features-in-terraform"&gt;How to hanlde unsupported Azure features in Terraform&lt;/h1&gt;
&lt;p&gt;I am a big fan and user of &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt;. I have been using it for almost a year now with both Azure and AWS clouds. While it isn&amp;rsquo;t a &lt;em&gt;write once, run everywhere&lt;/em&gt; tool, it is a tool that provides a consistent workflow and language for creating infrastructure that is independent of a specific vendor. However, the one big issue with any &lt;em&gt;third-party&lt;/em&gt; tool is that new features may not always be available right away. With that said, Terraform had day zero support for both Kubernetes on Azure and Kubernetes on AWS, which I assume is because both Microsoft and Amazon worked closely with them to make sure it was possible.&lt;/p&gt;</description></item><item><title>Using PowerShell scripts from Bash</title><link>https://phillipsj.net/posts/using-powershell-scripts-from-bash/</link><pubDate>Sat, 22 Sep 2018 20:54:19 +0000</pubDate><guid>https://phillipsj.net/posts/using-powershell-scripts-from-bash/</guid><description>&lt;h1 id="using-powershell-scripts-from-bash"&gt;Using PowerShell scripts from Bash&lt;/h1&gt;
&lt;p&gt;This may seem like a funny post, but I really enjoy using PowerShell and Linux. If you are like me and like doing the same then maybe you will find this useful. I am going to show how you can make a PowerShell script executable directly from Bash.&lt;/p&gt;
&lt;p&gt;The first step is to make sure that you install PowerShell. Instructions can be found &lt;a href="https://github.com/powershell/powershell#get-powershell"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once you have PowerShell installed on your system, let&amp;rsquo;s create a PowerShell script. This is the PowerShell script I use to create draft blog posts. Please create this script and name is &lt;em&gt;New-Draft.ps1&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Installing Azure CLI on Linux Mint 19</title><link>https://phillipsj.net/posts/installing-azure-cli-on-linux-mint-19/</link><pubDate>Sat, 15 Sep 2018 21:22:03 +0000</pubDate><guid>https://phillipsj.net/posts/installing-azure-cli-on-linux-mint-19/</guid><description>&lt;h1 id="installing-azure-cli-on-linux-mint-19"&gt;Installing Azure CLI on Linux Mint 19&lt;/h1&gt;
&lt;p&gt;Installing the &lt;a href="https://docs.microsoft.com/en-us/cli/azure/?view=azure-cli-latest"&gt;Azure CLI&lt;/a&gt; on Linux Mint 19 isn&amp;rsquo;t much different that what is required for Ubuntu. The biggest difference of note is that the command &lt;em&gt;lsb_release -cs&lt;/em&gt; cannot be relied upon at all because it will not return an Ubuntu distro name, but a Linux Mint distro name. Start by modifying the directions found &lt;a href="https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-apt?view=azure-cli-latest"&gt;here&lt;/a&gt; to match what is below. Make sure to add the key in the directions above, if my previous blog post about [].NET tools on Linux Mint 19](&lt;a href="https://www.phillipsj.net/posts/linux-mint-19-and-dotnet-development"&gt;https://www.phillipsj.net/posts/linux-mint-19-and-dotnet-development&lt;/a&gt;) was followed, then adding the key isn&amp;rsquo;t necessary as it will already exist, that is the same if Visual Studio Code is already installed too.&lt;/p&gt;</description></item><item><title>Linux Installation Scripts for Packer and Terraform</title><link>https://phillipsj.net/posts/linux-installation-scripts-for-packer-and-terraform/</link><pubDate>Sat, 15 Sep 2018 09:56:14 +0000</pubDate><guid>https://phillipsj.net/posts/linux-installation-scripts-for-packer-and-terraform/</guid><description>&lt;h1 id="linux-installation-scripts-for-packer-and-terraform"&gt;Linux Installation Scripts for Packer and Terraform&lt;/h1&gt;
&lt;p&gt;I really enjoy using &lt;a href="https://www.packer.io/"&gt;Packer&lt;/a&gt; and &lt;a href="https://www.terraform.io"&gt;Terraform&lt;/a&gt; by &lt;a href="https://www.hashicorp.com/"&gt;HashiCorp&lt;/a&gt;. These tools have become an essential part of my day to day that I wouldn&amp;rsquo;t really know what to do without them. On Linux, most package managers, do not always seem to have the most up-to-date versions of these tools so I created a really simple script for installing each one.&lt;/p&gt;
&lt;p&gt;These are located in the following Gists and are simple to use.&lt;/p&gt;</description></item><item><title>Linux Mint 19 and .NET Development</title><link>https://phillipsj.net/posts/linux-mint-19-and-dotnet-development/</link><pubDate>Fri, 14 Sep 2018 19:55:22 +0000</pubDate><guid>https://phillipsj.net/posts/linux-mint-19-and-dotnet-development/</guid><description>&lt;h1 id="linux-mint-19-and-net-development"&gt;Linux Mint 19 and .NET Development&lt;/h1&gt;
&lt;p&gt;Setting up a new Linux environment and I decided to go with &lt;a href="https://blog.linuxmint.com/?p=3599"&gt;Linux Mint 19 Xfce Edition&lt;/a&gt;. I haven&amp;rsquo;t used Linux Mint in about 4 years, but I wanted to give it a try. Ubuntu 18.04 used well over 1GB of RAM just sitting idle, with Mint, I am around 500MB. So far I am really liking it, but I had a little trouble getting Docker, .NET Core, PowerShell, and GitKraken to either install or run correctly. Here are the steps I had to take.&lt;/p&gt;</description></item><item><title>Packer, Azure, and SQL Server</title><link>https://phillipsj.net/posts/packer-azure-and-sql-server/</link><pubDate>Mon, 27 Aug 2018 19:29:40 +0000</pubDate><guid>https://phillipsj.net/posts/packer-azure-and-sql-server/</guid><description>&lt;h1 id="packer-azure-and-sql-server"&gt;Packer, Azure, and SQL Server&lt;/h1&gt;
&lt;p&gt;I have been using &lt;a href="https://www.packer.io"&gt;Packer&lt;/a&gt;, by &lt;a href="https://www.hashicorp.com/"&gt;HashiCorp&lt;/a&gt;, for the last few months. I have used it starting with AWS and I am now using it with Azure. Packer is a great way to automate the creation of Virtual Machine images for your prefered cloud or hypervisor. Packer has a a few concepts, but the key ones are &lt;em&gt;builders&lt;/em&gt; and &lt;em&gt;provisioners&lt;/em&gt;. Builders are the target environments for your image output, like AMI, AzureRM, VMWare, VirtualBox, Docker, Digital Ocean, etc. and Provisioners are how you want configure/install software on the system. Examples of provisioners are Ansible, Chef, Shell, PowerShell, etc. I am planning a future post that is more in depth, but I wanted to cover an interesting discovery.&lt;/p&gt;</description></item><item><title>Sight-reading Code: Self-Contained Deployments</title><link>https://phillipsj.net/posts/sight-reading-code/</link><pubDate>Sun, 26 Aug 2018 21:01:57 +0000</pubDate><guid>https://phillipsj.net/posts/sight-reading-code/</guid><description>&lt;h1 id="sight-reading-code-self-contained-deployments"&gt;Sight-reading Code: Self-Contained Deployments&lt;/h1&gt;
&lt;p&gt;In the world of music there exists the concept called &lt;a href="https://en.wikipedia.org/wiki/Sight-reading"&gt;Sight-reading&lt;/a&gt;. Sight-reading is all about the ability to perform a piece of music upon first sight. without practice. Highly skilled musicians have this ability through their thousands of hours of practice, other musicians have this ability based on practice and experience. This skill is used when testing muscians for entry into music programs and when joining protestigous groups. Sight-reading requires musicians to have the ability to read several notes ahead of the current note that they are actually playing. Now imagine not only needing to read ahead to know what notes to play, but having to keep the timing of the existing note/notes that you are currently playing. This ability relies on experience, muscle memory, and short-term memory. To get better at sight-reading takes practice and experience with a wide range of musical styles. To get started, most start out using music that isn&amp;rsquo;t complicated and as the intuition grows they start increasing difficult of the music they are studying. Becoming a master at this is extremely difficult, however learning enough to be able to perform a basic piece of music is pretty quick. It is amazing what you are able to learn in a short amount of time, yet takes a life time to master.&lt;/p&gt;</description></item><item><title>My Journey Outside .NET</title><link>https://phillipsj.net/posts/my-journey-outside-dotnet/</link><pubDate>Sun, 29 Jul 2018 20:27:24 +0000</pubDate><guid>https://phillipsj.net/posts/my-journey-outside-dotnet/</guid><description>&lt;h1 id="my-journey-outside-net"&gt;My Journey Outside .NET&lt;/h1&gt;
&lt;p&gt;I have been asked to compare moving from a primarily Windows, Azure, .NET based day job to a Linux, AWS, Java based day job. With four months under my belt, I am ready to make my comparisons.&lt;/p&gt;
&lt;h2 id="windows-to-linux"&gt;Windows To Linux&lt;/h2&gt;
&lt;p&gt;I have been using Linux personally since about 2010. It wasn&amp;rsquo;t an unfamiliar move, but oike anything else, the more you use it in a professional capacity the more you learn about it. Overall, I thoroughly enjoyed it. My Linux knowledge has grown exponentially and I am way more comfortable now. I feel less challenged when I have to do low level configuration etc. With that said, the lack of non-web apps for MS Office, purchasing Hiri for a mail client, and lack of conferencing application support has been frustrating. LibreOffice is a great product, but it isn&amp;rsquo;t the same. Hiri is the only mail client that integrates with Exchange that I feel provides as close an experience to Outlook. Not having a native app and no meeting notifications would have been miserable. Luckily Zoom and Slack have apps for Linux, however Zoom was challenging at times.&lt;/p&gt;</description></item><item><title>Installing .NET Core 2.1 on Solus</title><link>https://phillipsj.net/posts/installing-dotnet-core-2-1-on-solus/</link><pubDate>Sun, 01 Jul 2018 19:13:37 +0000</pubDate><guid>https://phillipsj.net/posts/installing-dotnet-core-2-1-on-solus/</guid><description>&lt;h1 id="installing-net-core-21-on-solus"&gt;Installing .NET Core 2.1 on Solus&lt;/h1&gt;
&lt;p&gt;Apparently my previous &lt;a href="https://www.phillipsj.net/posts/dotnet-dev-solus"&gt;post&lt;/a&gt; was linked on &lt;a href=""&gt;Reddit&lt;/a&gt; and a user was having issues. Here is an update for getting .NET Core 2.1 running on Solus. Most of the dependencies that are needed for 2.1 to run are already installed, the only one not installed is &lt;em&gt;liblttng-ust&lt;/em&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;~$ sudo eopkg install liblttng-ust 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now let&amp;rsquo;s install 2.1.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;~$ curl -sSL -o dotnet.tar.gz https://download.microsoft.com/download/8/8/5/88544F33-836A-49A5-8B67-451C24709A8F/dotnet-sdk-2.1.300-linux-x64.tar.gz
~$ mkdir -p ~/dotnet &amp;amp;&amp;amp; tar zxf dotnet.tar.gz -C ~/dotnet
~$ export PATH=$PATH:$HOME/dotnet
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now run the following to see if it worked.&lt;/p&gt;</description></item><item><title>Running Falcon from a Windows Container</title><link>https://phillipsj.net/posts/running-falcon-from-a-windows-container/</link><pubDate>Tue, 26 Jun 2018 21:20:29 +0000</pubDate><guid>https://phillipsj.net/posts/running-falcon-from-a-windows-container/</guid><description>&lt;h1 id="running-falcon-from-a-windows-container"&gt;Running Falcon from a Windows Container&lt;/h1&gt;
&lt;p&gt;I haven&amp;rsquo;t shown much love for Windows lately, so I felt like doing a post about deploying a &lt;a href="https://github.com/falconry/falcon"&gt;Falcon&lt;/a&gt; app to a &lt;a href="https://docs.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core"&gt;Windows Server Core&lt;/a&gt; container. This should be pretty quick.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s build our Falcon app.&lt;/p&gt;
&lt;p&gt;Open a PowerShell and enter the following, I assume you have Python 3.6.x installed.&lt;/p&gt;
&lt;p&gt;Create your virtual environment first.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;~$ python -m venv ./venvs/falcon
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now activate it.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;~$ .\venvs\falcon\Scripts\Activate.ps1
(falcon) ~$
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Install Falcon and uWSGI into that virtual environment.&lt;/p&gt;</description></item><item><title>Creating an EKS tools image for your team</title><link>https://phillipsj.net/posts/creating-an-eks-tools-image-for-your-team/</link><pubDate>Wed, 20 Jun 2018 21:50:58 +0000</pubDate><guid>https://phillipsj.net/posts/creating-an-eks-tools-image-for-your-team/</guid><description>&lt;h1 id="creating-an-eks-tools-image-for-your-team"&gt;Creating an EKS tools image for your team&lt;/h1&gt;
&lt;p&gt;A couple weeks ago I posted this &lt;a href="https://www.phillipsj.net/posts/docker-base-image-for-eks-tools"&gt;post&lt;/a&gt; about creating a docker base image for working with EKS. I said I would follow up with how you would use this base image to build an image for your team to use. This is it.&lt;/p&gt;
&lt;p&gt;The cool thing about EKS is that it uses IAM and IAM roles to grant a user access to your Kubernetes cluster. Since it uses IAM your Kube config, along wth Heptio, it is super simple and can be shared among a team. Here is an example of what it typically looks like:&lt;/p&gt;</description></item><item><title>Azure SSO, AWS, and IAM Roles</title><link>https://phillipsj.net/posts/azure-sso-aws-and-iam-roles/</link><pubDate>Wed, 20 Jun 2018 21:50:31 +0000</pubDate><guid>https://phillipsj.net/posts/azure-sso-aws-and-iam-roles/</guid><description>&lt;h1 id="azure-sso-aws-and-iam-roles"&gt;Azure SSO, AWS, and IAM Roles&lt;/h1&gt;
&lt;p&gt;Did you know you could use Azure AD to SSO into your AWS accounts for your organization? Here is a &lt;a href="https://www.cloudreach.com/blog/multi-aws-account-federation-microsoft-azure-ad/"&gt;blog post&lt;/a&gt; that highlights how to wire it up. This works wonderfully for users that work in the AWS console. When you get into using EKS and you need access via tools like &lt;a href="https://kubernetes.io/docs/reference/kubectl/overview/"&gt;Kubectl&lt;/a&gt;, &lt;a href="https://helm.sh/"&gt;Helm&lt;/a&gt;, and the &lt;a href="https://aws.amazon.com/cli/"&gt;AWS CLI&lt;/a&gt; you will need command line credentials to allow you to assume the correct roles to perform you job.&lt;/p&gt;</description></item><item><title>Launch WSL from PowerShell</title><link>https://phillipsj.net/posts/launch-wsl-from-powershell/</link><pubDate>Tue, 19 Jun 2018 21:57:56 +0000</pubDate><guid>https://phillipsj.net/posts/launch-wsl-from-powershell/</guid><description>&lt;h1 id="launch-wsl-from-powershell"&gt;Launch WSL from PowerShell&lt;/h1&gt;
&lt;p&gt;Just wanted to do a quick post of something that I learned today. You don&amp;rsquo;t have to launch &lt;em&gt;Bash for Windows&lt;/em&gt; by clicking the icon or by pressing the start button and typing. You can just as easily run it from the command line.&lt;/p&gt;
&lt;p&gt;Open a PowerShell:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

Loading personal and system profiles took 652ms.
C:\Users\phillipsj&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Type &lt;em&gt;wsl&lt;/em&gt; and you should now be running &lt;em&gt;Bash&lt;/em&gt;:&lt;/p&gt;</description></item><item><title>Docker base image for EKS tools</title><link>https://phillipsj.net/posts/docker-base-image-for-eks-tools/</link><pubDate>Sun, 10 Jun 2018 22:51:45 +0000</pubDate><guid>https://phillipsj.net/posts/docker-base-image-for-eks-tools/</guid><description>&lt;h1 id="docker-base-image-for-eks-tools"&gt;Docker base image for EKS tools&lt;/h1&gt;
&lt;p&gt;I have an idea floating around to make working with EKS extremely easy withing a team. AWS uses the &lt;a href="https://github.com/heptio/authenticator"&gt;Heptio Authenticator&lt;/a&gt; to wire up your AWS Credentials and IAM roles with &lt;a href="https://kubernetes.io/docs/reference/kubectl/overview/"&gt;Kubectl&lt;/a&gt;. What makes this really cool is that the Kube config is extremely generic. This means that your team can share a single copy of the Kube config letting AWS determine permissions on your Kuberentes cluster.&lt;/p&gt;</description></item><item><title>AWS EKS and Kubernetes External DNS</title><link>https://phillipsj.net/posts/aws-eks-and-kubernetes-external-dns/</link><pubDate>Fri, 08 Jun 2018 20:46:32 +0000</pubDate><guid>https://phillipsj.net/posts/aws-eks-and-kubernetes-external-dns/</guid><description>&lt;h1 id="aws-eks-and-kubernetes-external-dns"&gt;AWS EKS and Kubernetes External DNS&lt;/h1&gt;
&lt;p&gt;I have been using the &lt;a href="https://github.com/kubernetes-incubator/external-dns"&gt;Kubernetes External DNS&lt;/a&gt; addon lately when building out my clsuters. It provides a nice way to get a friendly external DNS entry for your exposed services. The installation walks you through using it with &lt;a href="https://github.com/kubernetes/kops"&gt;KOPS&lt;/a&gt;. Now that &lt;a href="https://aws.amazon.com/eks/"&gt;EKS&lt;/a&gt; is GA, here is what is required to get it working correctly.&lt;/p&gt;
&lt;p&gt;The first step is to create a policy that can be attached to the IAM Role that gets created for your EKS nodes.&lt;/p&gt;</description></item><item><title>.NET Core Publishing: SCD and FDD</title><link>https://phillipsj.net/posts/dotnet-core-publishing-scd-and-fdd/</link><pubDate>Tue, 05 Jun 2018 22:47:08 +0000</pubDate><guid>https://phillipsj.net/posts/dotnet-core-publishing-scd-and-fdd/</guid><description>&lt;h1 id="net-core-publishing-scd-and-fdd"&gt;.NET Core Publishing: SCD and FDD&lt;/h1&gt;
&lt;p&gt;Today we are going to learn and discuss the two basic publishing options that are &lt;em&gt;out of the box&lt;/em&gt; with the .NET CLI. These two options are &lt;a href="https://docs.microsoft.com/en-us/dotnet/core/deploying/index#framework-dependent-deployments-fdd"&gt;Framework-dependent Deployments&lt;/a&gt;, known as &lt;strong&gt;FDD&lt;/strong&gt;, and &lt;a href="https://docs.microsoft.com/en-us/dotnet/core/deploying/index#self-contained-deployments-scd"&gt;Self-contained Deployments&lt;/a&gt;, known as &lt;strong&gt;SCD&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Here is the break down for how we are going to demonstrate the difference. We are going to build a simple .NET console application and then use Docker to demonstrate the behavior of FDD and SCD on Ubuntu Linux.&lt;/p&gt;</description></item><item><title>.NET Core: Application Publishing Overview</title><link>https://phillipsj.net/posts/dotnet-core-application-publishing-overview/</link><pubDate>Thu, 31 May 2018 21:18:34 +0000</pubDate><guid>https://phillipsj.net/posts/dotnet-core-application-publishing-overview/</guid><description>&lt;h1 id="net-core-application-publishing"&gt;.NET Core: Application Publishing&lt;/h1&gt;
&lt;p&gt;In this post I am not going to spend much time discussing publishing for Windows, there are a few options and most are understood. What I will be focusing on, as an overview, are publishing solutions that are for other platforms.&lt;/p&gt;
&lt;p&gt;When it comes to cross platform publishing there are a few options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Require .NET runtime to be installed. Then the user can just execute your app. This is called &lt;a href="https://docs.microsoft.com/en-us/dotnet/core/deploying/index#framework-dependent-deployments-fdd"&gt;Framework-dependent Deployments&lt;/a&gt; with the short hand &lt;em&gt;FDD&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Publish the runtime with your app, this creates a larger package and still may require dependencies to still be installed. This is called &lt;a href="https://docs.microsoft.com/en-us/dotnet/core/deploying/index#self-contained-deployments-scd"&gt;Self-contained Deployments&lt;/a&gt; with the short hand &lt;em&gt;SCD&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Native builds with &lt;a href="https://github.com/dotnet/corert"&gt;CoreRT&lt;/a&gt;. Now this option creates a native executable which is small and super fast because there is no JITing occurring. This requires building a specific executable for each OS platform.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When it comes to Linux you have a few additional options that alleviate issues with options 1 and 2. That would be using either &lt;a href="https://flatpak.org/"&gt;Flatpak&lt;/a&gt; or &lt;a href="https://snapcraft.io/"&gt;snap&lt;/a&gt; to package. Both of these options allow you to bundle all requirements including the runtime and any additional dependencies in an isolated package not effecting the user&amp;rsquo;s system. What is extremely nice about these options are users will not even know it is a .NET based application which may help with adoption.&lt;/p&gt;</description></item><item><title>OpenVPN Installation Script</title><link>https://phillipsj.net/posts/openvpn-installation-script/</link><pubDate>Thu, 24 May 2018 21:10:11 +0000</pubDate><guid>https://phillipsj.net/posts/openvpn-installation-script/</guid><description>&lt;h1 id="openvpn-installation-script"&gt;OpenVPN Installation Script&lt;/h1&gt;
&lt;h4 id="tldr-all-the-features-of-the-original-that-also-allows-passing-arguments-to-make-automation-easier-the-repo"&gt;TL;DR; All the features of the original that also allows passing arguments to make automation easier. The &lt;a href="https://github.com/phillipsj/OpenVPN-install"&gt;repo&lt;/a&gt;.&lt;/h4&gt;
&lt;p&gt;Recently I have had to work on installing and configuring a few OpenVPN servers. Since I needed to use OpenVPN, not OpenVPN access server, I started looking around the web to find a nice installation script that would make it easier and provide some guidance. After a little searching, I found this Github repo by Nyr called &lt;a href="https://github.com/Nyr/openvpn-install"&gt;openvpn-install&lt;/a&gt;. This script had a lot of nice features and provided a nice guided installation. After a couple more hours, I discovered this &lt;a href="https://github.com/Angristan/OpenVPN-install"&gt;fork&lt;/a&gt; by Angristan that had a few tweaks that did appear to improve upon the security of the installation. After spending some time testing it out, I decided that it was the method I wanted to use to perform my installations. One major flaw that I found in both of these installation scripts is that neither one had implemented any parameterized arguments.&lt;/p&gt;</description></item><item><title>Deploying Dash to Elastic Beanstalk</title><link>https://phillipsj.net/posts/deploying-dash-to-elastic-beanstalk/</link><pubDate>Thu, 17 May 2018 21:38:09 +0000</pubDate><guid>https://phillipsj.net/posts/deploying-dash-to-elastic-beanstalk/</guid><description>&lt;h1 id="deploying-dash-to-elastic-beanstalk"&gt;Deploying Dash to Elastic Beanstalk&lt;/h1&gt;
&lt;p&gt;Before I get started on how to deploy a Dash app to Elastic Beanstalk, I am going cover Dash. &lt;a href="https://plot.ly/products/dash/"&gt;Dash&lt;/a&gt; is a Python framework for building dashboards using &lt;a href="https://plot.ly/"&gt;Plotly&lt;/a&gt; for building your charts and graphs. Dash also uses &lt;a href="http://flask.pocoo.org/"&gt;Flask&lt;/a&gt; and &lt;a href="https://reactjs.org/"&gt;React&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Since Dash is based on Flask, we can use the Flask Elastic Beanstalk preconfigured Docker container &lt;a href="https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_dockerpreconfig.walkthrough.html"&gt;tutorial&lt;/a&gt; as a reference, which we will discover hides some key pieces of information that we will need.&lt;/p&gt;</description></item><item><title>CodeStock 2018</title><link>https://phillipsj.net/posts/codestock-2018/</link><pubDate>Wed, 02 May 2018 21:22:01 +0000</pubDate><guid>https://phillipsj.net/posts/codestock-2018/</guid><description>&lt;h1 id="codestock-2018"&gt;CodeStock 2018&lt;/h1&gt;
&lt;p&gt;CodeStock just keeps getting better. This was my fourth year attending and speaking and I had an excellent time. I was able to catch up with old friends and make new ones, the opening keynote by Paige Bailey and the closing keynote by David Neal were great. Both talks really bookended the conference very well. The session selection was great and there was a session for everyone that attended. Sessions had a nice blend and it was great to see a few more than usual on data science.&lt;/p&gt;</description></item><item><title>Removing Disqus</title><link>https://phillipsj.net/posts/removing-disqus/</link><pubDate>Sat, 17 Mar 2018 21:01:06 +0000</pubDate><guid>https://phillipsj.net/posts/removing-disqus/</guid><description>&lt;h1 id="removing-disqus"&gt;Removing Disqus&lt;/h1&gt;
&lt;p&gt;I apologize for the readers that used Disqus. I have discovered that it has a detrimental impact to my page speed. Please hit me up on Twitter until I discover an alternative.&lt;/p&gt;</description></item><item><title>Helpful Features</title><link>https://phillipsj.net/posts/helpful-features/</link><pubDate>Sat, 17 Mar 2018 20:30:37 +0000</pubDate><guid>https://phillipsj.net/posts/helpful-features/</guid><description>&lt;h1 id="helpful-features"&gt;Helpful Features&lt;/h1&gt;
&lt;p&gt;I have been learning other languages and frameworks. The frameworks that I have been learning are &lt;a href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt;, &lt;a href="https://grails.org/"&gt;Grails&lt;/a&gt;, and &lt;a href="https://projects.spring.io/spring-boot/"&gt;Spring Boot&lt;/a&gt;. Each of of these frameworks bring a few interesting features to the table. Some of those features have been borrowed from frameworks like &lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have been using ASP .NET MVC since the version 2.0 beta. It has come a long way, but it seems that it just doesn&amp;rsquo;t have some of these interesting features. I am going to highlight some of these features, I know some are trivial to implement, but I feel they would bring a lot to the table when rapid prototyping or introducing the framework to someone new.&lt;/p&gt;</description></item><item><title>JetBrains Toolbox on Solus</title><link>https://phillipsj.net/posts/jetbrains-toolbox-on-solus/</link><pubDate>Tue, 27 Feb 2018 21:54:10 +0000</pubDate><guid>https://phillipsj.net/posts/jetbrains-toolbox-on-solus/</guid><description>&lt;h1 id="jetbrains-toolbox-on-solus"&gt;JetBrains Toolbox on Solus&lt;/h1&gt;
&lt;p&gt;As it has been said before, I am a huge fan of &lt;a href="https://solus-project.com/"&gt;Solus&lt;/a&gt;. I believe it is a great project and solves a lot of the pains of other distros. In the Solus Software Center, under &lt;strong&gt;Third Party&lt;/strong&gt;, are several of the JetBrains apps. This is a nice feature, however, I find that using the &lt;a href="https://www.jetbrains.com/toolbox/app/"&gt;JetBrains Toolbox&lt;/a&gt; app easier to use and it makes sure that everything is always up-to-date and I can install any EAPs that I desire.&lt;/p&gt;</description></item><item><title>Cluster Decisions and Parts</title><link>https://phillipsj.net/posts/cluster-decisions-and-parts/</link><pubDate>Sun, 24 Dec 2017 13:17:56 +0000</pubDate><guid>https://phillipsj.net/posts/cluster-decisions-and-parts/</guid><description>&lt;h1 id="cluster-decisions-and-parts"&gt;Cluster Decisions and Parts&lt;/h1&gt;
&lt;p&gt;In my last post I outlined several decisions that I would need to make when deciding how to create my container cluster
using Raspberry Pis. Here are my the parts that I ordered and the all the decisions that I have finalized.&lt;/p&gt;
&lt;h2 id="parts-list"&gt;Parts List&lt;/h2&gt;
&lt;p&gt;I ordered everything from Amazon because of Prime and selection.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3 x &lt;a href="http://amzn.to/2C6i4DQ"&gt;Raspberry Pi 3 Model B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;3 x &lt;a href="http://amzn.to/2D61MaK"&gt;32GB Samsung EVO Select MicroSD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1 x &lt;a href="http://amzn.to/2BwTh8n"&gt;Anker PowerPort 6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1 x &lt;a href="http://amzn.to/2BwURXR"&gt;HobbyMate Nylon Standoff Spacers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1 x &lt;a href="http://amzn.to/2DG8569"&gt;Anker 8-in-1 USB 3.0 Card Reader&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are only a couple notable items in this list that I feel like I need to explain. The Anker PowerPort 6 is a heck
of a deal, not only does it deliver the power needed, can grow it my my cluster, but it also ships with six one foot
micro usb cables. That saves some money from other options. I also had to add the Anker USB card reader as my desktop
doesn&amp;rsquo;t have one and my Surface has it&amp;rsquo;s slot being used to expand my storage. I decided to not go with a fancy case
just yet, but if I do it will be this &lt;a href="http://amzn.to/2zpMTxU"&gt;one&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>The SDK Microsoft.NET.Sdk specified could not be found</title><link>https://phillipsj.net/posts/the-sdk-microsoft-net-sdk-specified-could-not-be-found/</link><pubDate>Tue, 19 Dec 2017 15:17:47 +0000</pubDate><guid>https://phillipsj.net/posts/the-sdk-microsoft-net-sdk-specified-could-not-be-found/</guid><description>&lt;h1 id="the-sdk-microsoftnetsdk-specified-could-not-be-found"&gt;The SDK Microsoft.NET.Sdk specified could not be found&lt;/h1&gt;
&lt;p&gt;Ah, the dreaded build error that I have been dealing with for sometime now. This was only affecting our .NET Core 2.0 projects. Then after a little more diligence today, I discovered this StackOverflow &lt;a href="https://stackoverflow.com/questions/46257393/msbuild-throws-error-the-sdk-microsoft-net-sdk-specified-could-not-be-found"&gt;post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It seems that if you had .NET Core 1.x installed first, then later installed 2.0, the &lt;em&gt;MSBuildSDKsPath&lt;/em&gt; system environment variable doesn&amp;rsquo;t get updated to point to the new 2.0 location.&lt;/p&gt;</description></item><item><title>Parts ordered for the Cluster</title><link>https://phillipsj.net/posts/parts-ordered-for-the-cluster/</link><pubDate>Tue, 19 Dec 2017 14:04:38 +0000</pubDate><guid>https://phillipsj.net/posts/parts-ordered-for-the-cluster/</guid><description>&lt;h1 id="parts-ordered-for-the-cluster"&gt;Parts ordered for the Cluster&lt;/h1&gt;
&lt;p&gt;I ordered the parts today that I want to use to build my cluster. Amazon sent a very encouraging email today with some
of the items being on sale and a large increase in rewards. I decided that there wouldn&amp;rsquo;t be a better time so I jumped.&lt;/p&gt;
&lt;p&gt;Here is what I ended up order.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3 x Raspberry Pi 3 Model B&lt;/li&gt;
&lt;li&gt;3 x Samsung MicroSD EVO 32GB&lt;/li&gt;
&lt;li&gt;Anker PowerPort 6 with 6-pack of 1ft Micro USB Cables&lt;/li&gt;
&lt;li&gt;HobbyMate 180Pcs M3 Nylon Standoffs&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="raspberry-pi-3-model-b"&gt;Raspberry Pi 3 Model B&lt;/h2&gt;
&lt;p&gt;I decided to go with the Pi 3 Model B. It wasn&amp;rsquo;t a large cost increase, but the processing and memory was, so I went
with the Pi 3 Model B.&lt;/p&gt;</description></item><item><title>Building a Container Cluster</title><link>https://phillipsj.net/posts/building-a-container-cluster/</link><pubDate>Mon, 18 Dec 2017 19:47:47 +0000</pubDate><guid>https://phillipsj.net/posts/building-a-container-cluster/</guid><description>&lt;h1 id="building-a-container-cluster"&gt;Building a Container Cluster&lt;/h1&gt;
&lt;p&gt;As part of my certification journey, I am going to need to setup a small networking lab. I could easily do this with
virtual machines, but that wouldn&amp;rsquo;t be as fun. So I am joining everyone else and I am going to build me a small
container cluster to play with. Lots of advantages to building one of these.&lt;/p&gt;
&lt;h3 id="advantages"&gt;Advantages&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Use Docker more&lt;/li&gt;
&lt;li&gt;Learn about Swarm or Kubernetes&lt;/li&gt;
&lt;li&gt;Learn about networking&lt;/li&gt;
&lt;li&gt;Play with tiny computers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can&amp;rsquo;t really think of any disadvantages to doing it. I do have a list of decisions to make. I am going to list them
out.&lt;/p&gt;</description></item><item><title>Getting my MSCE</title><link>https://phillipsj.net/posts/getting-my-msce/</link><pubDate>Sun, 17 Dec 2017 16:39:13 +0000</pubDate><guid>https://phillipsj.net/posts/getting-my-msce/</guid><description>&lt;h1 id="getting-my-msce"&gt;Getting my MSCE&lt;/h1&gt;
&lt;p&gt;I am gearing up to start my journey toward getting my MSCE in &lt;a href="https://www.microsoft.com/en-us/learning/mcse-cloud-platform-infrastructure.aspx"&gt;Cloud Platform and Infrastructure&lt;/a&gt;. I am planning to take a stranger approach. I have always wanted to grow my infrastructure and operations knowledge. I have been in the DevOps space, knowing enough operations to be effective at assisting an Ops team, but never knowing enough to be okay alone. With that said, I plan to get my &lt;a href="https://certification.comptia.org/certifications/network"&gt;Network+&lt;/a&gt; certification first as it will help with settings up VNETs in Azure. I few years ago I started studying for my &lt;a href="https://certification.comptia.org/certifications/linux"&gt;Linux+&lt;/a&gt; certification, but I never took the test. That previous studying has serendipitously set me up for the path that I am going to take.&lt;/p&gt;</description></item><item><title>Linux toolbox for .NET Development</title><link>https://phillipsj.net/posts/dotnet-dev-linux-toolbox/</link><pubDate>Sun, 17 Dec 2017 16:35:28 +0000</pubDate><guid>https://phillipsj.net/posts/dotnet-dev-linux-toolbox/</guid><description>&lt;h1 id="linux-toolbox-for-net-development"&gt;Linux toolbox for .NET Development&lt;/h1&gt;
&lt;p&gt;This is going to be my list of the tools that I setup when doing .NET development on Linux. I know my future self is going to reference this and I hope others find it useful.&lt;/p&gt;
&lt;h2 id="net-sdks"&gt;.NET SDKs&lt;/h2&gt;
&lt;p&gt;This is pretty easy, you need to have .NET core at a minimum. I do find having Mono installed is useful sometimes when a particular tool you need to use is not available on .NET core or you need to create a Mono/Xamarin app.&lt;/p&gt;</description></item><item><title>Year in Review: 2017</title><link>https://phillipsj.net/posts/year-in-review-2017/</link><pubDate>Sat, 16 Dec 2017 10:36:53 +0000</pubDate><guid>https://phillipsj.net/posts/year-in-review-2017/</guid><description>&lt;h1 id="year-in-review-2017"&gt;Year in Review: 2017&lt;/h1&gt;
&lt;p&gt;Going to out this here for myself and for anyone interested. It has been a crazy year both personally and professionally.&lt;/p&gt;
&lt;h2 id="first-child"&gt;First Child&lt;/h2&gt;
&lt;p&gt;In May, my wife and I had our first child. He has been such a great addition to the family and you just don&amp;rsquo;t realize how much you grow as a person when you have a child. The amount of work and lifestyle change is unreal.&lt;/p&gt;</description></item><item><title>Automating Azure</title><link>https://phillipsj.net/posts/automating-azure/</link><pubDate>Mon, 13 Nov 2017 15:34:38 +0000</pubDate><guid>https://phillipsj.net/posts/automating-azure/</guid><description>&lt;h1 id="automating-azure"&gt;Automating Azure&lt;/h1&gt;
&lt;p&gt;I have been recently experimenting with automating Azure using several tools. &lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-overview"&gt;Azure Resource Manager&lt;/a&gt;, &lt;a href="https://www.ansible.com/"&gt;Ansible&lt;/a&gt;, and &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="ansible"&gt;Ansible&lt;/h2&gt;
&lt;p&gt;We have started doing configuration management on my team using Ansible. Ansible does have support for Azure, but I was unable to find any Ansible modules for Azure PaaS services. This particular environment requires the creation of two Azure SQL databases, an Azure Service Bus, and a few other small PaaS services. It seems that Ansible does not currently support creating any of the PaaS services. There may be third party support, but nothing obvious was discovered in my searches.&lt;/p&gt;</description></item><item><title>Dapper Command-Query Separation</title><link>https://phillipsj.net/posts/dapper-command-query-separation/</link><pubDate>Sat, 11 Nov 2017 09:02:50 +0000</pubDate><guid>https://phillipsj.net/posts/dapper-command-query-separation/</guid><description>&lt;h1 id="dapper-command-query-separation"&gt;Dapper Command-Query Separation&lt;/h1&gt;
&lt;p&gt;I am still a big fan of &lt;a href="https://github.com/StackExchange/Dapper"&gt;Dapper&lt;/a&gt; and use it for most of my .NET projects that require database access. Over the years I have discovered that the repository pattern seldom meets my needs. Database queries and commands can get quite long and it makes it hard to find and reason about all that is happening in the repository class. After reading a blog post by Jimmy Bogard from several years ago, I picked up this pattern and started using it with Dapper.&lt;/p&gt;</description></item><item><title>How we Gitflow</title><link>https://phillipsj.net/posts/how-we-gitflow/</link><pubDate>Wed, 08 Nov 2017 20:59:00 +0000</pubDate><guid>https://phillipsj.net/posts/how-we-gitflow/</guid><description>&lt;h1 id="how-we-gitflow"&gt;How we Gitflow&lt;/h1&gt;
&lt;p&gt;This question came up in a Twitter discussion, it was about using gitflow. What a great opportunity to write a blog post.&lt;/p&gt;
&lt;p&gt;At work, we use gitflow for every size project, small to large. We have found it helps to keep a consistent workflow. We also have tied our semantic versioning into how we use gitflow, all of this is part of our CI/CD approach.&lt;/p&gt;
&lt;h2 id="our-gitflow-process"&gt;Our gitflow process&lt;/h2&gt;
&lt;p&gt;We typically start all projects by creating the initial repository, then once the repository has been cloned, we create a develop branch and push that back up.&lt;/p&gt;</description></item><item><title>Creating seams</title><link>https://phillipsj.net/posts/creating-seams/</link><pubDate>Mon, 30 Oct 2017 20:39:56 +0000</pubDate><guid>https://phillipsj.net/posts/creating-seams/</guid><description>&lt;h1 id="creating-seams"&gt;Creating seams&lt;/h1&gt;
&lt;p&gt;This is going to be a post about software architecture and design, the basic concept of how to allow for changes in your software or system. By creating these joints or seams you will be able to make changes easily.&lt;/p&gt;
&lt;p&gt;To get started, here is the definition of &lt;strong&gt;Seam&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;the joining of two pieces (as of cloth or leather) by sewing usually near the edge&lt;/li&gt;
&lt;li&gt;the space between adjacent planks or strakes of a ship&lt;/li&gt;
&lt;li&gt;line, groove, or ridge formed by the abutment of edges&lt;/li&gt;
&lt;li&gt;a weak or vulnerable area or gap found a seam
^^ Merriam-Webster&amp;rsquo;s&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;As you can tell, the fourth definition is the one that is what we are going to focus on. We want to put in a &lt;em&gt;weak&lt;/em&gt; spot in our systems that will allow us to be able to make alterations. This term was first introduced to me in the book, &lt;a href="http://amzn.to/2DHgA0L"&gt;&lt;em&gt;Working effectively with Legacy Code&lt;/em&gt;&lt;/a&gt; by &lt;a href="https://twitter.com/mfeathers"&gt;Michael Feathers&lt;/a&gt;&lt;/p&gt;</description></item><item><title>DevSpace Conference 2017</title><link>https://phillipsj.net/posts/devspace-conference-2017/</link><pubDate>Mon, 16 Oct 2017 19:12:01 +0000</pubDate><guid>https://phillipsj.net/posts/devspace-conference-2017/</guid><description>&lt;h1 id="devspace-conference-2017"&gt;DevSpace Conference 2017&lt;/h1&gt;
&lt;p&gt;This past weekend I attended and presented at my first &lt;a href="https://www.devspaceconf.com"&gt;DevSpace&lt;/a&gt;. I had the pleasure to present on one of my favorite topics, Cake! The conference is in the beautiful town of Huntsville, AL. There are plenty of activities for the family with the &lt;a href="https://www.rocketcenter.com/"&gt;Space Center&lt;/a&gt; being one of the primary. I haven&amp;rsquo;t been to Huntsville since middle school and it is amazing to see how the town has grown.&lt;/p&gt;</description></item><item><title>.NET Core on Solus</title><link>https://phillipsj.net/posts/dotnet-dev-solus/</link><pubDate>Wed, 13 Sep 2017 06:50:05 +0000</pubDate><guid>https://phillipsj.net/posts/dotnet-dev-solus/</guid><description>&lt;h1 id="net-core-on-solus"&gt;.NET Core on Solus&lt;/h1&gt;
&lt;p&gt;I have always liked and followed the &lt;a href="https://solus-project.com"&gt;Solus&lt;/a&gt; project. I have always liked anything &lt;a href="https://github.com/ikeydoherty"&gt;Ikey Doherty&lt;/a&gt; has been involved with dating back to his Linux Mint days.&lt;/p&gt;
&lt;p&gt;I decided I would do a full install on my extra machine and see what it has to offer. I have to say it is an amazing desktop environment and as it gains momentum it is going to really take footing.&lt;/p&gt;</description></item><item><title>PowerShell as default shell on Ubuntu</title><link>https://phillipsj.net/posts/powershell-as-default-shell-on-ubuntu/</link><pubDate>Fri, 28 Jul 2017 18:46:04 +0000</pubDate><guid>https://phillipsj.net/posts/powershell-as-default-shell-on-ubuntu/</guid><description>&lt;h1 id="powershell-as-default-shell-on-ubuntu"&gt;PowerShell as default shell on Ubuntu&lt;/h1&gt;
&lt;p&gt;Now that Microsoft are making its technologies Linux friendly, it is time for me to commit to using Linux even more. I really like PowerShell and I am tired of having to go back and forth between it and bash when switching. With that said, I decided I would just install PowerShell on my Ubuntu 16.04 box and make it my default shell.&lt;/p&gt;
&lt;h2 id="step-1-install-powershell"&gt;Step 1: Install PowerShell&lt;/h2&gt;
&lt;p&gt;To make PowerShell my default, I need to first have it installed. I followed the instructions outlined &lt;a href="https://github.com/PowerShell/PowerShell/blob/master/docs/installation/linux.md#ubuntu-1604"&gt;here&lt;/a&gt; which are really good and give you a step by step as to what is needed. &lt;em&gt;Note that you can also install using the &lt;a href="https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-beta.4/powershell_6.0.0-beta.4-1ubuntu1.16.04.1_amd64.deb"&gt;.deb package&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>.NET Core 2.0 Preview on Ubuntu</title><link>https://phillipsj.net/posts/dotnet-core-2-preview-on-ubuntu/</link><pubDate>Thu, 27 Jul 2017 19:48:13 +0000</pubDate><guid>https://phillipsj.net/posts/dotnet-core-2-preview-on-ubuntu/</guid><description>&lt;h1 id="net-core-20-preview-on-ubuntu"&gt;.NET Core 2.0 Preview on Ubuntu&lt;/h1&gt;
&lt;p&gt;I have wanted to play with the new .NET core 2.0 preview and I wanted to do it on Ubuntu 16.04. So I am going to walk you through how to install it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This post is intended to developers that are new to Ubuntu&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The first step is to have a working Ubuntu 16.04 system, this can be in the cloud, virtual, docker, or bare metal. Now that you have a working Ubuntu 16.04 system, lets follow the guide found &lt;a href="https://www.microsoft.com/net/core#linuxubuntu"&gt;here&lt;/a&gt;. This guide wants you to run the following commands:&lt;/p&gt;</description></item><item><title>Cake: Contributing to an Addin</title><link>https://phillipsj.net/posts/cake-contributing-to-an-addin/</link><pubDate>Wed, 05 Jul 2017 04:48:17 +0000</pubDate><guid>https://phillipsj.net/posts/cake-contributing-to-an-addin/</guid><description>&lt;h1 id="cake-contributing-to-an-addin"&gt;Cake: Contributing to an Addin&lt;/h1&gt;
&lt;p&gt;It feels good as an open source project creator when you get an issue opened in your GitHub repo. I received one earlier this week, when someone submitted an issue asking if support for &lt;a href="https://github.com/cake-contrib/Cake.Squirrel/issues/16"&gt;SyncReleases&lt;/a&gt; could be added to &lt;a href="https://github.com/cake-contrib/Cake.Squirrel"&gt;Cake.Squirrel&lt;/a&gt;. After a little discussion with the submitter, me asking if they would like to do the addition, we agreed it would be a little easier for me to do it.&lt;/p&gt;</description></item><item><title>Deploying Desktop Apps with ClickOnce, MSDeploy, and Cake</title><link>https://phillipsj.net/posts/deploying-desktop-apps-with-clickonce-msdeploy-and-cake/</link><pubDate>Thu, 15 Jun 2017 04:56:55 +0000</pubDate><guid>https://phillipsj.net/posts/deploying-desktop-apps-with-clickonce-msdeploy-and-cake/</guid><description>&lt;h1 id="deploying-desktop-apps-with-clickonce-msdeploy-and-cake"&gt;Deploying Desktop Apps with ClickOnce, MSDeploy, and Cake&lt;/h1&gt;
&lt;p&gt;I have been working on a project that has me automating the deployment of a desktop application. We serve this application using RemoteApp, but we would like to start offering both a RemoteApp version for remote employees and a ClickOnce version for employees that are on-premise. This particular application has been a thorn in my side, it is the last remaining application that we do not have a deployment pipeline configured.&lt;/p&gt;</description></item><item><title>Review: Google Wifi</title><link>https://phillipsj.net/posts/review-google-wifi/</link><pubDate>Sun, 04 Jun 2017 21:47:44 +0000</pubDate><guid>https://phillipsj.net/posts/review-google-wifi/</guid><description>&lt;h1 id="review-google-wifi"&gt;Review: Google Wifi&lt;/h1&gt;
&lt;p&gt;Mysteriously, my Asus NT-66R started dropping connections on the 2.4Ghz band. That was the only band that would reach the far side of our house. I have been frustrated for sometime because I could get signal one foot in the direction closer to the router, but it wouldn&amp;rsquo;t get any signal from my spot in the bed. It has been a great router and if you are the market for a router, I would highly recommend one from Asus.&lt;/p&gt;</description></item><item><title>DevOps a fad?</title><link>https://phillipsj.net/posts/devops-a-fad/</link><pubDate>Tue, 02 May 2017 20:55:38 +0000</pubDate><guid>https://phillipsj.net/posts/devops-a-fad/</guid><description>&lt;h1 id="devops-a-fad"&gt;DevOps a fad?&lt;/h1&gt;
&lt;p&gt;It may not be as evident with from most of my posts, but I have a huge proponent of DevOps. What I am a proponent for is the culture and practices, not any tools or methodologies. Needless to say, I was taken back from a co-worker who confidently declared DevOps as a fad. Tooling and methodology are truly just here for a season, but good solid team culture and practices promote a healthy ecosystem to deliver reliable services and software. There is nothing fad about it, it has been something that great teams or as some would say, &amp;ldquo;High Performing IT&amp;rdquo; have and continue to do. DevOps is a term that gives a broad sweeping term to encompass it all, to some that means tooling, others it means some methodology. I think that IT has reached the point that if you are not using orchestration and configuration management along with source control to manage it all you are having a hard time keeping pace with the demands of lower costs and faster turn around. Tooling like SaltStack, Chef, Puppet, Habitat, etc. all help to solve that solution, but without good team culture and practices, those tools can be misused and not provide the benefit that &amp;ldquo;DevOps&amp;rdquo; promises. If configuration isn&amp;rsquo;t documented and tracked then your change management isn&amp;rsquo;t managed, if orchestration isn&amp;rsquo;t used then that change isn&amp;rsquo;t consistently applied, if all of these items are not source controlled with controlled releases then all bets are off. In my experience, change management is a make or break part of the process. If you don&amp;rsquo;t know all your recent changes when an incident occurs, then you don&amp;rsquo;t have a place to start with your resolution. Source control is the running record of those changes which happens to record timestamp and the person making the change. If configuration can only come from source control to your orchestration tool, then the path to getting to production is closely guarded. This means with some confidence, what is in source control is exactly what is in production, now troubleshooting just got easier. I think many would not consider this a fad, just how it is done. I know from personal experience that once those pieces are in place, you don&amp;rsquo;t ask if anyone changed production. You look in source control, build server, and orchestration tool to see what was changed without any guess work. Simple as that.&lt;/p&gt;</description></item><item><title>Moving most of my Cake Addins</title><link>https://phillipsj.net/posts/moving-most-of-my-cake-addins/</link><pubDate>Sat, 29 Apr 2017 11:19:27 +0000</pubDate><guid>https://phillipsj.net/posts/moving-most-of-my-cake-addins/</guid><description>&lt;h1 id="moving-most-of-my-cake-addins"&gt;Moving most of my Cake Addins&lt;/h1&gt;
&lt;p&gt;I just wanted to post up that I will be moving a large majority of my Cake Addins into the &lt;a href="https://github.com/cake-contrib"&gt;Cake Contributions&lt;/a&gt; organization on GitHub. This is going to be both a great move for all consumers and for me. Moving to the organization takes all infrastructure management off me and also allows others to assist when I am not available.&lt;/p&gt;</description></item><item><title>Announcing Cake.Netlify</title><link>https://phillipsj.net/posts/announcing-cake-netlify/</link><pubDate>Sun, 23 Apr 2017 22:15:57 +0000</pubDate><guid>https://phillipsj.net/posts/announcing-cake-netlify/</guid><description>&lt;h1 id="announcing-cakenetlify"&gt;Announcing Cake.Netlify&lt;/h1&gt;
&lt;p&gt;Just published a new package called &lt;a href="https://www.nuget.org/packages/Cake.Netlify/"&gt;Cake.Netlfiy&lt;/a&gt;, which works with the great hosting over at &lt;a href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt;. Currently there is only support for deploying websites, but more functionality will be added as request or as PRs are submitted. Here is the link to the &lt;a href="https://github.com/phillipsj/Cake.Netlify"&gt;repo&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Cake.Netlify is working in beta</title><link>https://phillipsj.net/posts/cake-netlify-is-working-in-beta/</link><pubDate>Fri, 21 Apr 2017 22:11:51 +0000</pubDate><guid>https://phillipsj.net/posts/cake-netlify-is-working-in-beta/</guid><description>&lt;h1 id="cakenetlify-is-working-in-beta"&gt;Cake.Netlify is working in beta&lt;/h1&gt;
&lt;p&gt;This is a post to see if I have my Netlify Addin working for Cake.&lt;/p&gt;</description></item><item><title>Cake: A recipe for success!</title><link>https://phillipsj.net/posts/cake-a-recipe-for-success/</link><pubDate>Mon, 27 Mar 2017 07:26:42 +0000</pubDate><guid>https://phillipsj.net/posts/cake-a-recipe-for-success/</guid><description>&lt;h1 id="cake-a-recipe-for-success"&gt;Cake: A recipe for success!&lt;/h1&gt;
&lt;p&gt;I have recently started using &lt;a href="https://github.com/cake-contrib/Cake.Recipe"&gt;Cake.Recipe&lt;/a&gt; for the &lt;a href="https://github.com/RadioSystems/Cake.CsvHelper"&gt;Cake.CsvHelper&lt;/a&gt; project I have been creating at work. It has been a pleasure to use because I do not need to worry about writing a build script. I am going to walk you through the packaging conventions that are used.&lt;/p&gt;
&lt;h2 id="initial-configuration"&gt;Initial Configuration&lt;/h2&gt;
&lt;p&gt;You have to perform this initial configuration that it drives everything.&lt;/p&gt;
&lt;h2 id="environment-variables"&gt;Environment Variables&lt;/h2&gt;
&lt;p&gt;If an environment variable that is defined &lt;a href="https://cake-contrib.github.io/Cake.Recipe/docs/fundamentals/environment-variables"&gt;here&lt;/a&gt; is set, then the corresponding task that would use that will be executed. Pretty nifty and may be something that is easily missed.&lt;/p&gt;</description></item><item><title>Cake Crumbs of the Week #3</title><link>https://phillipsj.net/posts/cake-crumbs-of-the-week-third-edition/</link><pubDate>Tue, 21 Mar 2017 21:06:52 +0000</pubDate><guid>https://phillipsj.net/posts/cake-crumbs-of-the-week-third-edition/</guid><description>&lt;h1 id="cake-crumbs-of-the-week-3"&gt;Cake Crumbs of the Week #3&lt;/h1&gt;
&lt;p&gt;This is the third edition of my weekly series. Here are a few more tips.&lt;/p&gt;
&lt;h2 id="how-to-pin-your-cake-version"&gt;How to pin your Cake version&lt;/h2&gt;
&lt;p&gt;The bootstrapper for Cake will always download the latest and greatest version of Cake. Sometimes this is the behavior that you want and other times it isn&amp;rsquo;t. The general recommendation by the Cake team is to always pin your version in the &lt;strong&gt;pacakges.config&lt;/strong&gt; file located in the &lt;strong&gt;tools&lt;/strong&gt; directory. This can be found &lt;a href="http://cakebuild.net/docs/tutorials/getting-started"&gt;here&lt;/a&gt; in the project documentation.&lt;/p&gt;</description></item><item><title>Cake Crumbs of the Week #2</title><link>https://phillipsj.net/posts/cake-crumbs-of-the-week-second-edition/</link><pubDate>Sun, 05 Mar 2017 21:06:52 +0000</pubDate><guid>https://phillipsj.net/posts/cake-crumbs-of-the-week-second-edition/</guid><description>&lt;h1 id="cake-crumbs-of-the-week-2"&gt;Cake Crumbs of the Week #2&lt;/h1&gt;
&lt;p&gt;This is the second edition of my weekly series. Here are a few more tips.&lt;/p&gt;
&lt;h2 id="using-the-addin-directive-instead-of-tool-and-reference"&gt;Using the Addin directive instead of Tool and Reference.&lt;/h2&gt;
&lt;p&gt;I told you all that I would show you all and easier way that using the tool directive and reference. Here it is. just remember that it doesn&amp;rsquo;t work if the NuGet package doesn&amp;rsquo;t follow the appropriate format.&lt;/p&gt;
&lt;h3 id="before"&gt;Before&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#tool nuget:?package=AutoMapper
#reference &amp;#34;tools/AutoMapper/lib/net45/AutoMapper.dll&amp;#34;
using AutoMapper;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="after"&gt;After&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#addin nuget:?package=AutoMapper
using AutoMapper;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="using-csx-with-cake"&gt;Using CSX with Cake&lt;/h2&gt;
&lt;p&gt;Did you know that you can use can load CSX files into your Cake file. How you have to do is us th following:&lt;/p&gt;</description></item><item><title>Cake: More SFTP</title><link>https://phillipsj.net/posts/cake-more-sftp/</link><pubDate>Wed, 01 Mar 2017 21:59:22 +0000</pubDate><guid>https://phillipsj.net/posts/cake-more-sftp/</guid><description>&lt;h1 id="cake-more-sftp"&gt;Cake: More SFTP&lt;/h1&gt;
&lt;p&gt;I am back with more about SFTP usage from a Cake file. I have probably made this more difficult that needed, but I finally got a solution that I am happy with using. This solution involves using &lt;a href="https://winscp.net/eng/index.php"&gt;WinSCP&lt;/a&gt; and the project&amp;rsquo;s .NET wrapper.&lt;/p&gt;
&lt;h2 id="1-add-the-nuget-package-and-import-the-dll"&gt;1. Add the NuGet package and import the dll.&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s worth mentioning here that this is the only method in which this will work. The dll is not included in the correct NuGet folder since it isn&amp;rsquo;t placed into the &lt;em&gt;net45&lt;/em&gt; folder. This is also true for the SharpSSH package too.&lt;/p&gt;</description></item><item><title>Why you should be using Gitter</title><link>https://phillipsj.net/posts/why-you-should-be-using-gitter/</link><pubDate>Tue, 28 Feb 2017 18:17:53 +0000</pubDate><guid>https://phillipsj.net/posts/why-you-should-be-using-gitter/</guid><description>&lt;h1 id="why-you-should-be-using-gitter"&gt;Why you should be using Gitter&lt;/h1&gt;
&lt;p&gt;Over the last year and half, I have been increasing my involvement in open source. As part of that involvement, you really need to get plugged in to the community to effectively contribute. It helps you learn the &lt;em&gt;ethos&lt;/em&gt; of the project or projects and you start forming relationships that may turn into great, global, friendships. A fine example of that is the awesome &lt;a href="https://twitter.com/gep13/status/835539880914612224"&gt;baby gift&lt;/a&gt; sent by the &lt;a href="http://cakebuild.net/"&gt;Cake&lt;/a&gt; team to &lt;a href="http://www.gep13.co.uk/"&gt;Gary Park&lt;/a&gt;. These are the kinds of connections that can really help you grow and boost your career.&lt;/p&gt;</description></item><item><title>Cake: One way to SFTP</title><link>https://phillipsj.net/posts/cake-one-way-to-sftp/</link><pubDate>Mon, 27 Feb 2017 20:45:43 +0000</pubDate><guid>https://phillipsj.net/posts/cake-one-way-to-sftp/</guid><description>&lt;h1 id="cake-one-way-to-sftp"&gt;Cake: One way to SFTP&lt;/h1&gt;
&lt;p&gt;I am working on a project in which I need to SFTP a CSV file of data. I have been working on automating that task, more coming in a future post, with Cake and Jenkins. I am the author of &lt;a href="https://github.com/phillipsj/Cake.Ftp"&gt;Cake.Ftp&lt;/a&gt;, however SFTP isn&amp;rsquo;t currently supported in the .NET framework. This meant I needed to turn to other solutions. There are a few Cake Addins that could do what I need.&lt;/p&gt;</description></item><item><title>Cake Crumbs of the Week</title><link>https://phillipsj.net/posts/cake-crumbs-of-the-week/</link><pubDate>Sat, 25 Feb 2017 22:06:52 +0000</pubDate><guid>https://phillipsj.net/posts/cake-crumbs-of-the-week/</guid><description>&lt;h1 id="cake-crumbs-of-the-week"&gt;Cake Crumbs of the Week&lt;/h1&gt;
&lt;p&gt;I am starting a new series of posts called &lt;em&gt;Cake Crumbs&lt;/em&gt;. What I will be doing is sharing little bits of Cake goodness that I have discovered as I use Cake. Some of these items may be in the documentation, some may be obvious to others, and a few may be useful to you.&lt;/p&gt;
&lt;h2 id="using-a-local-file-based-nuget-source"&gt;Using a local, file based NuGet source&lt;/h2&gt;
&lt;p&gt;So you can use local NuGet sources both, UNC and full path with the &lt;em&gt;addin&lt;/em&gt; and &lt;em&gt;tool&lt;/em&gt; directives.&lt;/p&gt;</description></item><item><title>Cake: Developing Addins Part 5</title><link>https://phillipsj.net/posts/cake-developing-addins-part-5/</link><pubDate>Wed, 15 Feb 2017 09:45:30 +0000</pubDate><guid>https://phillipsj.net/posts/cake-developing-addins-part-5/</guid><description>&lt;h1 id="cake-developing-addins-part-5"&gt;Cake: Developing Addins Part 5&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-2"&gt;Part 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-3"&gt;Part 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-4"&gt;Part 4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After a little bit of deliberation I have finally finished the &lt;a href="https://github.com/phillipsj/Cake.Netlify"&gt;Cake.Netlify&lt;/a&gt; addin. I decided to only implement the &lt;em&gt;Deploy&lt;/em&gt; command as that is the command I am most interested in using. I ask that you go to the MyGet feed referenced in the GitHub repo and try out the beta version. If you have any suggestions or feedback, please submit an issue in the repo. I will work on making some more tweaks to the Cake file before I push to NuGet.&lt;/p&gt;</description></item><item><title>Azure: Deploying MkDocs to App Service</title><link>https://phillipsj.net/posts/azure-deploying-mkdocs-to-app-service/</link><pubDate>Mon, 13 Feb 2017 18:34:39 +0000</pubDate><guid>https://phillipsj.net/posts/azure-deploying-mkdocs-to-app-service/</guid><description>&lt;h1 id="azure-deploying-mkdocs-to-app-service"&gt;Azure: Deploying MkDocs to App Service&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://www.mkdocs.org/"&gt;MkDocs&lt;/a&gt; is an great tool to use to build project documentation. My team at work has been using it to create system documentation, consisting of user guides, features, etc. We may look to start using &lt;a href="https://wyam.io/"&gt;Wyam&lt;/a&gt; for this in the future, for now, MkDocs has served us and it works on Windows with minimum fuss. As with all of our newer sites, we are hosting on Azure using App Service, with the minimum amount of traffic our documentation receives, free or shared plans work the best.&lt;/p&gt;</description></item><item><title>Azure AD as I understand</title><link>https://phillipsj.net/posts/azure-ad-as-i-understand/</link><pubDate>Sun, 12 Feb 2017 20:54:37 +0000</pubDate><guid>https://phillipsj.net/posts/azure-ad-as-i-understand/</guid><description>&lt;h1 id="azure-ad-as-i-understand"&gt;Azure AD as I understand&lt;/h1&gt;
&lt;p&gt;Azure Active Directory is an awesome feature, it enables identity in the cloud, extensible, and allows for easier third-party integrations without exposing your internal systems. With that comes some very difficult to understand concepts that leads to much confusion. I am going to attempt to explain the relationship between Azure AD tenants, Azure subscriptions and Office 365. This explanation may not be 100% accurate or technically correct, but I wanted to share how I understand it which helps me perform my job duties.&lt;/p&gt;</description></item><item><title>Hudson Bay Start for Projects</title><link>https://phillipsj.net/posts/hudson-bay-start-for-projects/</link><pubDate>Mon, 30 Jan 2017 23:11:32 +0000</pubDate><guid>https://phillipsj.net/posts/hudson-bay-start-for-projects/</guid><description>&lt;h1 id="hudson-bay-start-for-projects"&gt;Hudson Bay Start for Projects&lt;/h1&gt;
&lt;p&gt;The Hudson Bay Trading Company had this practice called the &lt;a href="https://derivadow.com/2007/11/08/hudson-bay-start-reducing-project-risk/"&gt;Hudson Bay Start&lt;/a&gt;. This ensured that the trappers had the correct equipment before they entered the wilderness. I am a big fan of this approach to software development, I have worked on too many projects that didn&amp;rsquo;t realize that a firewall rule was needed, or that there wasn&amp;rsquo;t enough space on the existing VM cluster and that a new server needed ordered. These types of issues caused delays of weeks and in some cases months, if after creating the new project the team went through the exercise of trying to deploy the brand new application, a lot of these issues would have been discovered early enough in the project to either be corrected by go-live or to at least change expectations from the business.&lt;/p&gt;</description></item><item><title>Cake: Developing Addins Part 4</title><link>https://phillipsj.net/posts/cake-developing-addins-part-4/</link><pubDate>Sat, 28 Jan 2017 11:45:30 +0000</pubDate><guid>https://phillipsj.net/posts/cake-developing-addins-part-4/</guid><description>&lt;h1 id="cake-developing-addins-part-4"&gt;Cake: Developing Addins Part 4&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-2"&gt;Part 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-3"&gt;Part 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-5"&gt;Part 5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I wasn&amp;rsquo;t ready to give up on making existing Cake tooling work. I have been working on a project at work and I discovered &lt;a href="https://github.com/SharpeRAD/Cake.Powershell"&gt;Cake.Powershell&lt;/a&gt; and I figured I would give it a try.&lt;/p&gt;
&lt;p&gt;The first step would be to include the Cake.Powershell in the Cake file.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#addin nuget:?package=Cake.Powershell
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;With it added, I made a few tweaks to my &lt;em&gt;Netlify-Deploy&lt;/em&gt; task by adding the &lt;em&gt;StartPowershellScript&lt;/em&gt; command with the arguments I needed.&lt;/p&gt;</description></item><item><title>Cake: Developing Addins Part 3</title><link>https://phillipsj.net/posts/cake-developing-addins-part-3/</link><pubDate>Tue, 24 Jan 2017 20:51:30 +0000</pubDate><guid>https://phillipsj.net/posts/cake-developing-addins-part-3/</guid><description>&lt;h1 id="cake-developing-addins-part-3"&gt;Cake: Developing Addins Part 3&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-2"&gt;Part 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-4"&gt;Part 4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-5"&gt;Part 5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Back with another installment of my thought process. I have been thinking a little more about it before I get started on the actual addin, that I realized that I could put together a quick and dirty solution. I am going to use the &lt;a href="https://github.com/cake-contrib/Cake.Npm"&gt;Cake.Npm&lt;/a&gt; addin to do it. So here goes.&lt;/p&gt;
&lt;p&gt;The first step would be to include the Cake.Npm in the Cake file for this blog.&lt;/p&gt;</description></item><item><title>Cake: Developing Addins Part 2</title><link>https://phillipsj.net/posts/cake-developing-addins-part-2/</link><pubDate>Sun, 22 Jan 2017 15:47:05 +0000</pubDate><guid>https://phillipsj.net/posts/cake-developing-addins-part-2/</guid><description>&lt;h1 id="cake-developing-addins-part-2"&gt;Cake: Developing Addins Part 2&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-3"&gt;Part 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-4"&gt;Part 4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-5"&gt;Part 5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In part 1, I was struggling with how to implement the addin. I put forth a few options and I have taken a few days to think it over. During that time I reached out to a few people and had discussions about the two remaining options that I had. I have found it useful over my career to always discuss designs, implementations, and general issues with others, the collaboration always results in a better solution.&lt;/p&gt;</description></item><item><title>Cake: Developing Addins Part 1</title><link>https://phillipsj.net/posts/cake-developing-addins-part-1/</link><pubDate>Tue, 17 Jan 2017 00:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/cake-developing-addins-part-1/</guid><description>&lt;h1 id="cake-developing-addins-part-1"&gt;Cake: Developing Addins Part 1&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-2"&gt;Part 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-3"&gt;Part 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-4"&gt;Part 4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phillipsj.net/posts/cake-developing-addins-part-5"&gt;Part 5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I am kicking off a series of posts that will be a &lt;strong&gt;Play By Play&lt;/strong&gt; of my choices and decisions around how and when to create a Cake Addin. This will serve as a reference for me and hopefully someone will find it useful.&lt;/p&gt;
&lt;h2 id="should-i-create-an-addin"&gt;Should I create an Addin&lt;/h2&gt;
&lt;p&gt;I have recently switched my hosting to &lt;a href="https://www.netlify.com"&gt;Netlify&lt;/a&gt; and I have been extremely happy. I am currently using the Cake build script creating by &lt;a href="https://daveaglick.com/"&gt;Dave Glick&lt;/a&gt;. Here is the deployment code:&lt;/p&gt;</description></item><item><title>2016: Year In Review</title><link>https://phillipsj.net/posts/2016-year-in-review/</link><pubDate>Mon, 16 Jan 2017 00:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/2016-year-in-review/</guid><description>&lt;h1 id="2016-year-in-review"&gt;2016 Year In Review&lt;/h1&gt;
&lt;p&gt;Not something that I have done in the past, but I think it is something that I should start doing. It is also great to reflect back on the year and really see your journey.&lt;/p&gt;
&lt;h2 id="personal"&gt;Personal&lt;/h2&gt;
&lt;p&gt;Going to kick this off with what has happened personally. I have really stepped up in my OSS participation and have made several contributions to &lt;a href="http://cakebuild.net/"&gt;Cake&lt;/a&gt;. I have also been able to author my own projects, most being addins for Cake. I have had several opportunities present themselves this year and those opportunities are not yet fully realized.&lt;/p&gt;</description></item><item><title>Wyam: Improved Anchors</title><link>https://phillipsj.net/posts/wyam-improved-anchors/</link><pubDate>Thu, 12 Jan 2017 00:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/wyam-improved-anchors/</guid><description>&lt;p&gt;After reading another awesome &lt;a href="http://www.digitaltapestry.net/posts/wyam-anchors-and-code-copy"&gt;post&lt;/a&gt; by &lt;a href="http://www.digitaltapestry.net"&gt;wekempf&lt;/a&gt; mentions that the H1 tag in the header is getting the anchor added too. After a little peak at the documentation, all you need to do is add a CSS selector on the add method to limit it to all H1 tags in the content.&lt;/p&gt;
&lt;h3 id="original"&gt;Original&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;anchors.add();
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="improved"&gt;Improved&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;anchors.add(&amp;#39;#content &amp;gt; h1&amp;#39;); // Notice the CSS selector added here.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This a quick little tweak to correct the issue.&lt;/p&gt;</description></item><item><title>Wyam: Bootstrap Fun</title><link>https://phillipsj.net/posts/wyam-bootstrap-fun/</link><pubDate>Mon, 09 Jan 2017 00:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/wyam-bootstrap-fun/</guid><description>&lt;p&gt;After reading this great &lt;a href="http://www.digitaltapestry.net/posts/alerts-in-wyam"&gt;post&lt;/a&gt;
by &lt;a href="http://www.digitaltapestry.net"&gt;wekempf&lt;/a&gt; it made me think about block qoutes and how it can help me deliver a better
block qoute experience. &lt;a href="http://www.digitaltapestry.net"&gt;wekempf&lt;/a&gt; also posted an awesome cheatsheet
for &lt;a href="https://github.com/lunet-io/markdig/"&gt;Markdig&lt;/a&gt;, the markdown engine for
Wyam, &lt;a href="http://www.digitaltapestry.net/posts/markdig-cheat-sheet"&gt;here&lt;/a&gt;. Markdig provides a lot of additional functionaly
that is just nice to have, I am grateful someone documented it in an easy to understand format. So I decided to have a
little fun with block qoutes and a few other random bits.&lt;/p&gt;</description></item><item><title>Now using Wyam</title><link>https://phillipsj.net/posts/now-using-wyam/</link><pubDate>Mon, 02 Jan 2017 00:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/now-using-wyam/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR; Wyam is awesome and worth checking out.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When I first started blogging, I started using &lt;em&gt;Blogger&lt;/em&gt;. It was easy to get started and it was very popular and it wasn&amp;rsquo;t wordpress. After a few failed attempts and not being overly happy I started looking around at altertantives. In 2014 I started using a Python based static generator called &lt;a href="http://tinkerer.me"&gt;Tinkerer&lt;/a&gt; which is based on &lt;a href="http://www.sphinx-doc.org"&gt;Sphinx&lt;/a&gt;. After a few years of using Tinkerer, which I really enjoyed, the development started to slow down and it wasn&amp;rsquo;t very active. At that point, I switched to using &lt;a href="https://hexo.io/"&gt;Hexo&lt;/a&gt; and it has been enjoyable also. In that time frame I started participating in the &lt;a href="http://cakebuild.net/"&gt;Cake&lt;/a&gt; project and noticed they were using this this project called &lt;a href="https://wyam.io"&gt;Wyam&lt;/a&gt; to build their documents page. I didn&amp;rsquo;t give it much thought, but found it interesting. Finally, I decided to investigate Wyam as it is .NET based and it would be easy for me to modify if needed. Regardless to say, but after ~5hrs, I have been able to convert and deploy my whole site using it. I think it is a better implementation of the &lt;a href=""&gt;Clean Blog&lt;/a&gt; theme and I can use Markdown or Razor to create pages or posts.&lt;/p&gt;</description></item><item><title>Announcing Cake.Ftp</title><link>https://phillipsj.net/posts/announcing-cake-ftp/</link><pubDate>Sun, 18 Dec 2016 00:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/announcing-cake-ftp/</guid><description>&lt;p&gt;Just published a new package called &lt;a href="https://www.nuget.org/packages/Cake.Ftp/"&gt;Cake.Ftp&lt;/a&gt;. It is a very basic FTP client that allows you to upload or delete files in your Cake script. Please feel free to open an issue in the &lt;a href="https://github.com/phillipsj/Cake.Ftp"&gt;repo&lt;/a&gt; if there any features you would like to see added.&lt;/p&gt;</description></item><item><title>Cake.AppPackager</title><link>https://phillipsj.net/posts/cake-apppackager/</link><pubDate>Mon, 28 Nov 2016 19:42:21 +0000</pubDate><guid>https://phillipsj.net/posts/cake-apppackager/</guid><description>&lt;p&gt;Just published a new package called &lt;a href="https://www.nuget.org/packages/Cake.AppPackager/"&gt;Cake.AppPackager&lt;/a&gt;. It integrates &lt;a href="https://goo.gl/2g25OD"&gt;App Packager&lt;/a&gt; into the Cake pipeline so you can now create your Windows app packages using Cake.&lt;/p&gt;
&lt;p&gt;Still need to add additional unit tests. Please feel free to open an issue in the &lt;a href="https://github.com/phillipsj/Cake.AppPackager"&gt;repo&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Extending the Orchard Message Service</title><link>https://phillipsj.net/posts/extending-the-orchard-message-service/</link><pubDate>Thu, 25 Aug 2016 19:22:55 +0000</pubDate><guid>https://phillipsj.net/posts/extending-the-orchard-message-service/</guid><description>&lt;p&gt;This journey begin in a somewhat normal way. I needed to allow a user in our Orchard instance to submit a form that would send an email to our ticketing system. I know, no API exists for the ticketing system and I had to use an old school way. After getting the initial implementation, we discovered that the email that was being sent was HTML and that HTML was supported, but a bug fix required emails to be in plain text. Not only that, but the information that gets parsed has to be the first content in the email. I was hit by a double whammy, my email was HTML and the template that was getting applied to the email was our theme template. So couple different items came out of this.&lt;/p&gt;</description></item><item><title>Cake: Unit testing addins</title><link>https://phillipsj.net/posts/cake-unit-testing-addins/</link><pubDate>Sun, 07 Aug 2016 08:41:18 +0000</pubDate><guid>https://phillipsj.net/posts/cake-unit-testing-addins/</guid><description>&lt;p&gt;I am back with another confession to make, my &lt;a href=""&gt;Cake.XdtTransform&lt;/a&gt; project does not have any unit testing. So I decided this is a great opportunity to create a tutorial for unit testing a Cake addin.&lt;/p&gt;
&lt;h2 id="step-1-create-unit-test-project"&gt;Step 1: Create unit test project&lt;/h2&gt;
&lt;p&gt;Create a new &lt;em&gt;class library&lt;/em&gt; project named &lt;em&gt;Cake.XdtTransform.Tests&lt;/em&gt;, as part of our Cake.XdtTransform solution, and delete the Class1.cs file that is automatically created. The first item you will need is the &lt;em&gt;Cake.Testing&lt;/em&gt; Nuget package, so please install that into your &lt;em&gt;Cake.XdtTransform.Tests&lt;/em&gt; project. &lt;em&gt;Cake.Testing&lt;/em&gt; provides a nice set of fakes, fixtures, and extensions that can help with unit testing. At this point, you can pick your favorite unit testing frameworky, in this example we will create our unit tests using &lt;em&gt;Fixie&lt;/em&gt; and &lt;em&gt;Should&lt;/em&gt; for assertions, the Cake project uses &lt;em&gt;Xunit2&lt;/em&gt;. There are lots of examples in the source code. Start by creating a class called &lt;em&gt;XdtTransformationTests.cs&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Cake: Creating your first addin</title><link>https://phillipsj.net/posts/cake-creating-your-first-addin/</link><pubDate>Sun, 31 Jul 2016 15:22:46 +0000</pubDate><guid>https://phillipsj.net/posts/cake-creating-your-first-addin/</guid><description>&lt;p&gt;In this tutorial, I will be walking you through the basics of creating a Cake Addin. There are going to be assumptions that you know how to create a project using Visual Studio or your tool of choice. It also assumes you know how to use NuGet to install packages in your project. Let&amp;rsquo;s get started, we are going to create a really simple addin that gives you the ability to upload a file to an FTP site.&lt;/p&gt;</description></item><item><title>Using C# 6 features in Cake</title><link>https://phillipsj.net/posts/using-c-6-features-in-cake/</link><pubDate>Mon, 25 Jul 2016 21:47:22 +0000</pubDate><guid>https://phillipsj.net/posts/using-c-6-features-in-cake/</guid><description>&lt;p&gt;I like a lot of features available in C# 6, but my favorite is string interpolation. I think it makes aesthetically pleasing code, cleaner and more expressive.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;var name = &amp;#34;Dave&amp;#34;;

// String.Format example
var messageWithFormat = string.Format(&amp;#34;I&amp;#39;m sorry, {0} I&amp;#39;m afraid I can&amp;#39;t do that.&amp;#34;, name);

// String Interpolation
var messageWithInterpolation = $&amp;#34;I&amp;#39;m sorry, {name} I&amp;#39;m afraid I can&amp;#39;t do that.&amp;#34;;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;However, by default you cannot use string interpolation in your Cake file as those bits don&amp;rsquo;t come with Roslyn just yet. This is an extremely easy fix. All you need to do is pass the experimental flag.&lt;/p&gt;</description></item><item><title>Cake: Automating an existing project</title><link>https://phillipsj.net/posts/cake-automating-an-existing-project/</link><pubDate>Sun, 24 Jul 2016 15:22:36 +0000</pubDate><guid>https://phillipsj.net/posts/cake-automating-an-existing-project/</guid><description>&lt;p&gt;Hi, my name is Jamie and I am a &lt;a href="http://cakebuild.net/"&gt;Cake&lt;/a&gt; addin author that doesn&amp;rsquo;t build my addins using Cake. This seems kind of wrong too me and this is a bonus for you. I am going to walk you through how to use Cake to build your project, run your tests, create a &lt;a href="https://www.nuget.org/"&gt;NuGet&lt;/a&gt; package, then publish to NuGet. I am going to walk you through performing this for my &lt;a href="https://github.com/phillipsj/Cake.XdtTransform"&gt;Cake.XdtTransform&lt;/a&gt; project. The project is hosted on GitHub so you can see the final build. I am going to be using the wonderful extension created for &lt;a href="https://code.visualstudio.com/"&gt;VsCode&lt;/a&gt; and will be doing most of my work in it, I will discuss the alternatives if you are not using VsCode. If you are going to continue with VsCode, then I would install the Cake Extension that has been created.&lt;/p&gt;</description></item><item><title>Shockingly Sweet: Electron and Cake</title><link>https://phillipsj.net/posts/shockingly-sweet-electron-and-cake/</link><pubDate>Sat, 23 Jul 2016 22:48:40 +0000</pubDate><guid>https://phillipsj.net/posts/shockingly-sweet-electron-and-cake/</guid><description>&lt;p&gt;We have recently started using &lt;a href="http://electron.atom.io/"&gt;Electron&lt;/a&gt; for an application we have been developing. We have enjoyed the experience so much we have decided as a team that all desktop applications going forward will be Electron based. This is great as it keeps the web development skills sharp even when making a desktop application, plus it leverages our knowledge in web technologies and we don&amp;rsquo;t have to context switch.&lt;/p&gt;
&lt;p&gt;To keep the consistency with all our other projects we decided to use Cake to build our Electron applications. We use &lt;a href="https://github.com/electron-userland/electron-builder"&gt;electron-builder&lt;/a&gt; to perform the heavy lifting with a few NPM scripts. We then execute those NPM scripts using Cake. You can take a look at the complete solution &lt;a href="https://github.com/phillipsj/shockingly-sweet"&gt;here&lt;/a&gt;. Below I will walk you through the Cake file.&lt;/p&gt;</description></item><item><title>Learning Fixie and Should</title><link>https://phillipsj.net/posts/learning-fixie-and-should/</link><pubDate>Sat, 23 Jul 2016 10:22:51 +0000</pubDate><guid>https://phillipsj.net/posts/learning-fixie-and-should/</guid><description>&lt;p&gt;To be a good steward of my Cake.XdtTransform project, I decided that I needed to add some unit tests. With such a small project with very little functionality, I took it as an opportunity to learn a new tool. I have looked at the &lt;a href="http://fixie.github.io/"&gt;Fixie&lt;/a&gt; project a few times, but haven&amp;rsquo;t really given it much thought as I have the most experience with &lt;a href="http://nunit.org/"&gt;NUnit&lt;/a&gt; and &lt;a href="https://xunit.github.io/"&gt;xUnit&lt;/a&gt;. As with any new tool, I wanted to make sure it would work with my intended work flow and of course it does, as it is already in Cake.&lt;/p&gt;</description></item><item><title>Integrity Scan</title><link>https://phillipsj.net/posts/integrity-scan/</link><pubDate>Sun, 17 Jul 2016 19:40:02 +0000</pubDate><guid>https://phillipsj.net/posts/integrity-scan/</guid><description>&lt;p&gt;So I have recently been through a soft skills based training program at my current company. This coupled with the
business coach that the company provided has been a tremendous boost to me both professionally and personally. I have
grown so much over the last year and it is all finally starting to come together and I am learning to cope with
situations that I would never have dreamed I could handle. As part of this training I was provided a list of books that
one of th coaches thought would help polish some of my skills. One of those
was &lt;a href="https://www.amazon.com/gp/product/0425193373/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0425193373&amp;amp;linkCode=as2&amp;amp;tag=phillipsj05-20&amp;amp;linkId=3d65255df8db8e203a7d339ce5c7d25b"&gt;&amp;ldquo;Fierce Conversations&amp;rdquo;&lt;/a&gt;
by Susan Scott. I am not very far into the book and I have already found it very inspirational and as far as I am
concerned a must read by everyone. The book has some hard hitting stories of issues within companies that result from
the companies values not aligning with how they are acting. The same is also applied to you personally, if you are
acting in a way counter to your values then you have an integrity issue and you need to perform an &amp;ldquo;integrity scan&amp;rdquo;.
There is also a really interesting section
on &lt;a href="https://en.wikipedia.org/wiki/Psychoneuroimmunology"&gt;Psychoneuroimmunology&lt;/a&gt;, which is something I am going to need
to read more about, but the basic introduction is very interesting.&lt;/p&gt;</description></item><item><title>BunsenLabs, awesome continuation of a legacy</title><link>https://phillipsj.net/posts/bunsenlabs-awesome-continuation-of-a-legacy/</link><pubDate>Sat, 25 Jun 2016 21:50:23 +0000</pubDate><guid>https://phillipsj.net/posts/bunsenlabs-awesome-continuation-of-a-legacy/</guid><description>&lt;p&gt;So of all linux distributions that exist, by far my favorite has probably been CrunchBang linux. It is a distribution built on Debian with a wonderful window manager. CrunchBang used OpenBox and created a whole distro that was built around its speed an simplicity. However, as all good things it came to and end. Wanting to replace my slow Ubuntu VM, I went back to the CrunchBang website to see if anyone has picked up the project. No one has, but there has been a few continuation projects that popped up under a new name. Out of all of them, it is &lt;a href="https://www.bunsenlabs.org"&gt;BunsenLabs&lt;/a&gt; is my favorite. The installation is a breeze and configuration is smooth as butter.&lt;/p&gt;</description></item><item><title>XML Docs for Cake Addins</title><link>https://phillipsj.net/posts/xml-docs-for-cake-addins/</link><pubDate>Sat, 18 Jun 2016 09:59:28 +0000</pubDate><guid>https://phillipsj.net/posts/xml-docs-for-cake-addins/</guid><description>&lt;p&gt;As most that know me or have been following this blog, I absolutely love &lt;a href="http://cakebuild.net/"&gt;Cake&lt;/a&gt; build tools. To be a better steward in the community of the addins that I created and another that I help maintain, I updated the XML documentation and submitted a pull request to finally have these added to the Addins section of the Cake website.&lt;/p&gt;</description></item><item><title>Fun with Electron</title><link>https://phillipsj.net/posts/fun-with-electron/</link><pubDate>Fri, 13 May 2016 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/fun-with-electron/</guid><description>&lt;p&gt;So I have had the privilege to get to learn a little about &lt;a href="http://electron.atom.io/"&gt;Electron&lt;/a&gt;. My team inherited an app that was built using &lt;a href="http://appjs.com/"&gt;AppJS&lt;/a&gt;. Since that project is deprecated,we needed to move it to a new platform. I started looking around and decided to give Electron a try since I have been using &lt;a href="https://atom.io/"&gt;Atom&lt;/a&gt; and &lt;a href="https://code.visualstudio.com/"&gt;VSCode&lt;/a&gt;. Another great thing about Electron is that we can get to keep our deployment consistent since it also uses &lt;a href="https://github.com/Squirrel/Squirrel.Windows"&gt;Squirrel.Windows&lt;/a&gt; like we have started using for our other desktop apps. An added bonus is we can use &lt;a href="http://facebook.github.io/react/"&gt;React&lt;/a&gt; also.&lt;/p&gt;</description></item><item><title>JavaScript: The Orchard Way</title><link>https://phillipsj.net/posts/javascript-the-orchard-way/</link><pubDate>Fri, 18 Dec 2015 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/javascript-the-orchard-way/</guid><description>&lt;p&gt;So I have been attending the &lt;a href="http://www.orchardproject.net/discussions"&gt;Orchard community&lt;/a&gt; meetings since we started to use Orchard for our current project. Orchard is a great system that is very
moduler, with hooks and interfaces that can be overridden in a very easy way, once you learn it. So this past week, the discussion turned to what JavaScript framework should be used for Orchard core javascript needs. We all know that the conversation quickly went to &lt;a href="https://angularjs.org/"&gt;Angular&lt;/a&gt;. There were several other frameworks discussed, but the top two were clearly Angular and &lt;a href="http://facebook.github.io/react/"&gt;ReactJS&lt;/a&gt;. Then an interesting question surfaced from &lt;a href="http://weblogs.asp.net/bleroy"&gt;Bertrand&lt;/a&gt;, it was “Which one is the Orchard way?”. So I know that the Orchard
team has a very defined culture and I have heard that statement several times in the past, but it got me wondering if a blog post or any formal statement of “The Orchard Way” has been created. With that I stumbled on to a &lt;a href="https://weblogs.asp.net/bleroy/the-orchard-way"&gt;post&lt;/a&gt; by Bertrand that has the answer.&lt;/p&gt;</description></item><item><title>Cake.Squirrel</title><link>https://phillipsj.net/posts/cake-squirrel/</link><pubDate>Fri, 04 Dec 2015 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/cake-squirrel/</guid><description>&lt;p&gt;Just published a new package called &lt;a href="https://www.nuget.org/packages/Cake.Squirrel/"&gt;Cake.Squirrel&lt;/a&gt;. It integrates &lt;a href="https://github.com/Squirrel/Squirrel.Windows"&gt;Squirrel.Windows&lt;/a&gt; into the Cake pipeline so you can now create your Squirrel package using Cake.&lt;/p&gt;
&lt;p&gt;Still a little work left to do, I would like to add a fluent API, so keep checking back.&lt;/p&gt;</description></item><item><title>I like surprises, especially when Cake is involved!</title><link>https://phillipsj.net/posts/i-like-surprises-especially-when-cake-is-involved/</link><pubDate>Mon, 30 Nov 2015 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/i-like-surprises-especially-when-cake-is-involved/</guid><description>&lt;p&gt;So I was working today to consume a Cake addin that isn’t fully baked. It is an addin that we needed. So I cloned the repo and pushed a copy of the package to a &lt;a href="https://www.myget.org"&gt;MyGet.org&lt;/a&gt; to consume as part of our build. I added a custom NuGet.config file to my Cake tools directory, but Cake would not install the addin. So I just added it to the packages.config, still no dice. I had to use the older syntax:&lt;/p&gt;</description></item><item><title>Web Compiler with a side of Cake</title><link>https://phillipsj.net/posts/web-compiler-with-a-side-of-cake/</link><pubDate>Wed, 25 Nov 2015 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/web-compiler-with-a-side-of-cake/</guid><description>&lt;p&gt;My team has been using &lt;a href="http://facebook.github.io/react/"&gt;React&lt;/a&gt; to create any front-end components that need to be interactive. So far it has been a pleasant experience. We started using JSX for our HTML. However, now that we are nearing a production release we wanted to precompile the JSX. We had intially planned to use the &lt;a href="http://reactjs.net/"&gt;React.NET&lt;/a&gt; project, but the JSX support has been dropped in support of using &lt;a href="https://babeljs.io/"&gt;Babel&lt;/a&gt;. Babel’s documentation isn’t the best, so in looking for alternatives before diving in to Babel, I stumbled across &lt;a href="https://github.com/madskristensen/WebCompiler"&gt;Web Compiler&lt;/a&gt; by Mads Kristensen. It just so happens that there is a Visual Studio Extension for it and it will compile LESS, SASS, JSX, and CoffeeScript. Since we are planning to use SASS in the future this appeared to be a great option. The extension makes it easy to use as part of the IDE. There is also a nuget package for it that makes it easy to use with MSBUILD. Now that all of our needs are covered it is time to see if we can get it to work with Cake.&lt;/p&gt;</description></item><item><title>CodeMash 2015</title><link>https://phillipsj.net/posts/codemash-2015/</link><pubDate>Sun, 01 Nov 2015 00:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/codemash-2015/</guid><description>&lt;p&gt;I was lucky enough that my company sent me to &lt;a href="http://www.codemash.org/"&gt;CodeMash&lt;/a&gt;. CodeMash is a pretty awesome conference in Sandusky, OH at a huge indoor water park. There was lots of great content, events, and people. I really enjoyed getting to meet various developers, many of whom I have followed as they are developers that have been influential on my career either through there open source work and material that they have authored. Also I realize that I need to start trying to use social media more than I currently do, so know I can be found on Twitter &lt;a href="https://twitter.com/phillipsj73"&gt;@phillipsj73&lt;/a&gt;. I am planning to go to CodeMash 2016 and I hope meet even more new developers and reconnect with the developers that I had the pleasure to meet this year.&lt;/p&gt;</description></item><item><title>Cake.XdtTransform</title><link>https://phillipsj.net/posts/cake-xdttransform/</link><pubDate>Wed, 21 Oct 2015 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/cake-xdttransform/</guid><description>&lt;p&gt;As part of moving our Orchard build over to Cake, I was trying to find a good way to do the config transfomrs. Cake offers a pretty good XML transform methods, but I wanted a solution that used the XDT transform. A little quick googling and I stumbled across this Github &lt;a href="https://github.com/cake-build/cake/issues/321"&gt;issue&lt;/a&gt;, so with this post I created an addin that adds this functionality. Not realy a big deal, I didn’t think it was necessary to pull that into the core as it adds an extra dependency that is probably not really needed, but it is a nice to have. You can find it up on Nuget also.&lt;/p&gt;</description></item><item><title>Builds are better with Cake</title><link>https://phillipsj.net/posts/builds-are-better-with-cake/</link><pubDate>Sun, 18 Oct 2015 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/builds-are-better-with-cake/</guid><description>&lt;p&gt;As most of you know, my team has been using Orchard to build our next application. While we have found the majority of what Orchard has to offer great, there has been trouble with the build for Orchard. We decided it was time to create a different way to build Orchard that was easier for junior devs to understand and easier for us to consume.&lt;/p&gt;
&lt;p&gt;We narrowed it down to &lt;a href="https://github.com/psake/psake"&gt;Psake&lt;/a&gt;, &lt;a href="http://fsharp.github.io/FAKE/"&gt;Fake&lt;/a&gt;, or &lt;a href="http://cakebuild.net/"&gt;Cake&lt;/a&gt;, as these really don’t require anything special that isn’t already on our build servers. I have used tools like &lt;a href="http://albacorebuild.net/"&gt;Albacore&lt;/a&gt; in the past, but the extra dependency on Ruby was the deal breaker.&lt;/p&gt;</description></item><item><title>Orchard and Azure AD Woes!</title><link>https://phillipsj.net/posts/orchard-and-azure-ad-woes/</link><pubDate>Thu, 08 Oct 2015 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/orchard-and-azure-ad-woes/</guid><description>&lt;p&gt;So my team and I have been using Orchard CMS to build the next version of our product. Since we have been using Azure AD for authentication for our applicaions it only made sense to wire Orchard and Azure AD together. The typical way that it is suggested to be done is to Microsoft.Owin.Security.OpenIdConnect middleware.&lt;/p&gt;
&lt;p&gt;So we wired this up for Orchard, which was not a straight forward feat given the sparse documentation around OWIN integration. This all worked great locally and
on our dev server. We decided to finally push a versiont to Azure to work through our &lt;a href="http://www.stickyminds.com/article/hudsons-bay-start"&gt;Hudson Bay Start&lt;/a&gt;, it would be awful to be close to a deadline and find any suprises.&lt;/p&gt;</description></item><item><title>Contrib to Dynamic Forms Module</title><link>https://phillipsj.net/posts/contrib-to-dynamic-forms-module/</link><pubDate>Thu, 01 Oct 2015 00:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/contrib-to-dynamic-forms-module/</guid><description>&lt;p&gt;Orchard CMS has this really cool module called Dynamic Forms. It allows users to create forms that can create submissions, bind to content types, or tie into workflows. It is really powerful, but still a little rough around the edges. The new 1.9.2 release is going to provide lots of polish to this feature.&lt;/p&gt;
&lt;p&gt;One item I noticed today was that there are form fields for most types of inputs that you can create for content. However, there is not a form field for URLs. Probably not a big deal, however the particular reason that I am using Dynamic Forms is for a content type that does have a URL field and that input needs to be validated. So I quickly got in and got dirty. I created a URL form field and just finished my pull request. I hope it get accepted. If you would like to take a look you can hope over to my &lt;a href="https://github.com/phillipsj"&gt;github&lt;/a&gt; and take a look.&lt;/p&gt;</description></item><item><title>Orchard, Gulp, and VS2015 Build Errors</title><link>https://phillipsj.net/posts/orchard-gulp-and-vs2015-build-errors/</link><pubDate>Tue, 29 Sep 2015 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/orchard-gulp-and-vs2015-build-errors/</guid><description>&lt;p&gt;Recently, my team and I, have started using Visual Studio 2015 while working on our Orchard project. Orchard has started using Gulp to manage building some of the javascript used in the Layouts and Dynamic Forms modules. Since VS 2015 detects and automatically watches Gulp files, if you have a parameter set at the top of the Gulp file, node modules start automatically downloading and all JS
and CSS start getting processed. This is great, until you recieve the following error when publishing.&lt;/p&gt;</description></item><item><title>Orchard Layouts with JSON.NET</title><link>https://phillipsj.net/posts/orchard-layouts-with-json-net/</link><pubDate>Fri, 11 Sep 2015 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/orchard-layouts-with-json-net/</guid><description>&lt;p&gt;I have been developing a custom module that uses the Dynamic Forms module to programitically create a form. When creating a form you need to also create a layout. Below is an example from the PageCommands.cs in the Orchard Pages module for creating a layout.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;layout = 
 &amp;#34;{\&amp;#34;elements\&amp;#34;: [&amp;#34; +
 &amp;#34;{&amp;#34; +
 &amp;#34;\&amp;#34;typeName\&amp;#34;: \&amp;#34;Orchard.Layouts.Elements.Html\&amp;#34;,&amp;#34; +
 &amp;#34;\&amp;#34;data\&amp;#34;: \&amp;#34;Content=&amp;#34; + Encode(Text) + &amp;#34;\&amp;#34;&amp;#34; +
 &amp;#34;}&amp;#34; +
 &amp;#34;]}&amp;#34;;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This just looks unpleasing and error prone. I would like to look at creating something like &lt;a href="https://github.com/DarthFubuMVC/htmltags"&gt;HtmlTags&lt;/a&gt;, which would create a fluent and error free way to
build layouts. However, that is going to take a little effort to get figured out. Until then, I decided I would try to use &lt;a href="http://www.newtonsoft.com/json"&gt;JSON.NET&lt;/a&gt; to build the layout. I feel that
using the JSON.NET objects make it easier and less error prone to generate larger layouts.&lt;/p&gt;</description></item><item><title>First Orchard Pull Request</title><link>https://phillipsj.net/posts/first-orchard-pull-request/</link><pubDate>Wed, 09 Sep 2015 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/first-orchard-pull-request/</guid><description>&lt;p&gt;Lately my team and I have been working with &lt;a href="http://www.orchardproject.net/"&gt;Orchard&lt;/a&gt; CMS. We picked Orchard because we are .NET developers and Orchard provided such a great framework to start building our new system with that it put us months ahead. In addition we did need the capabilities provided by the CMS modules, but in reality Orchard could just have the CMS modules deactivated and still provide a great base.&lt;/p&gt;
&lt;p&gt;Now to my pull request. I just submitted a pull request to Orchard for documentation around the dynamic forms module. The documentation could use a little more work, but I at least wanted to get some of the basics in place. I just followed along with the previous custom forms module and the great &lt;a href="http://www.ideliverable.com/blog/customizing-user-registration-and-login-with-dynamic-forms-and-workflows"&gt;post&lt;/a&gt; on IDeliverable’s blog, the post is a little dated, but still a great refernce.&lt;/p&gt;</description></item><item><title>Bottom or Top Line Development</title><link>https://phillipsj.net/posts/bottom-or-top-line-development/</link><pubDate>Tue, 28 Jul 2015 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/bottom-or-top-line-development/</guid><description>&lt;p&gt;On my journey into management, I have picked up a copy of &lt;a href="https://pragprog.com/book/rdbcd/behind-closed-doors"&gt;Behind Closed Doors&lt;/a&gt; from the &lt;a href="https://pragprog.com"&gt;Pragmatic Bookshelf&lt;/a&gt;. I love their books and so far this one is shaping up to be a good one. Now to the point of this post, there is an aside in the book that discusses being a group that works directly on a product that
generates revenue or being a group that supports the company to sell the companies product. The difference being, one group generates top line, while the other group contributes to the bottom line. This is just one of those things that I didn’t see coming and it hurt. All I can think is WOW! I naturally think in the bottom line and since my first job was working in government, I am not surprised. All of my past development has been on products that support the business in their job, I have never actually worked on a product that was the business. Such a small aside, but it is so true. The focus of the aside is primarily focused on defining the mission on the group, but I think it is way deeper than that. I intrinsically find enjoyment on building products that enable others to perform their best. Maybe it is the maximizer in me, but I it just clicks. I find the idea of a software product intriguing, however I have made career choices that have not
lead down that road. When I originally moved into this position that I am in, I thought here is my chance to develop a product, but what I realize is that I am developing a product that helps the business deliver their products. Just WOW!&lt;/p&gt;</description></item><item><title>Moving into Management</title><link>https://phillipsj.net/posts/moving-into-management/</link><pubDate>Sun, 14 Jun 2015 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/moving-into-management/</guid><description>&lt;p&gt;I have finally made the move into management. As of this week I am now a manager of a small group. I still get to do development, but I get to help my teammates in a different capacity. It is a going to be a rocky ride for me personally and this past week is proof of that. I have tried to move into management in the past, but there was always a HR policy that penalized me because I didn’t have a related degree (local government), however reflecting on that now, I realize that I do not think I was really ready. Funny how a few more years of expereince changes everything. I do find that along with trying to meet the needs of my teammates, I am having to step up and be a product manager. We are an “agile” team and we have a product owner, but I am finding that a product manager is very different from a product owner. We need someone to create a product roadmap and focus on what is going to both challenge the team and drive the product forward. Also as a manager strategy is at a totally different level or maybe it is just me feeling that it is different. Hopefully, I will be able to start finding time to keep in a regular blogging rythm. I have lots of thoughts I want to share.&lt;/p&gt;</description></item><item><title>Two weeks with the Surface 3</title><link>https://phillipsj.net/posts/two-weeks-with-the-surface-3/</link><pubDate>Thu, 28 May 2015 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/two-weeks-with-the-surface-3/</guid><description>&lt;p&gt;I found myself needing a new computer and decided that I wanted an ultra portable device. After looking around and considering price, I decided that I wanted to give the Surface 3 a shot. I have been using cloud based development services like Cloud9 and I am finding I really like it so it wasn’t a big stretch. The primary focus of getting the Surface 3 was to have a device that allows me to take full advantage of OneNote so I could get better organized. So far the having the ability to actual write notes is awesome and works wonderfully. The TypeCover is the real deal and actually feels better than most keyboards that I have used. I am finding that using touch is natural, but I do catch myself getting frustrated with the trackpad, only to realize that I could have just used my finger.&lt;/p&gt;</description></item><item><title>Wow, lots of agile stuff</title><link>https://phillipsj.net/posts/wow-lots-of-agile-stuff/</link><pubDate>Wed, 13 May 2015 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/wow-lots-of-agile-stuff/</guid><description>&lt;p&gt;A couple of weeks after my last post about Software Faster, there seems to be lots of these posts popping up in my reader about agile. We may have reached this critical point in the agile movement were we are starting to realize that in the name of being agile we are being rigid. Here are the recent posts that jumped out at me.&lt;/p&gt;
&lt;h2 id="agile-results"&gt;Agile Results&lt;/h2&gt;
&lt;p&gt;This &lt;a href="http://blogs.msdn.com/b/jmeier/archive/2015/05/08/task-management-for-teams.aspx"&gt;post&lt;/a&gt; my J.D. Meier about “Task Management for Teams” is very interesting and I didn’t realize that “Agile Results” existed until this post. Funny thing about this method it is very similiar to what our team decided that we are going to report on. Ours are very business oriented and focused, but in general this is what we have been doing for well over nine months and the business is super happy and so is upper management as listing your “goals” aka Wins for each time box makes it clear what we are trying to do and if we got it done. I have purchased the &lt;a href="http://gettingresults.com/wiki/Main_Page"&gt;book&lt;/a&gt; and will do a full review shortly, but it looks like it is going to provide some additional techniques to tweak what we are already doing.&lt;/p&gt;</description></item><item><title>Inspiration, Software Faster</title><link>https://phillipsj.net/posts/inspiration-software-faster/</link><pubDate>Mon, 20 Apr 2015 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/inspiration-software-faster/</guid><description>&lt;p&gt;I typically listen to podcasts while I mow my yard. I find mowing relaxing and enjoy doing it myself. However, some of
the recent episodes of the podcasts that I like did not catch my interest, so I went digging through some archives. I
stumbled upon &lt;a href="http://www.dotnetrocks.com/"&gt;DotNetRocks&lt;/a&gt;
episode &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=1118"&gt;1118&lt;/a&gt; with &lt;a href="http://dannorth.net/"&gt;Dan North&lt;/a&gt;. All I can
say is wow, what an episode. I started out my career with the view point that I just needed to deliver software that
made peoples life better. I didn’t care about the craftsmanship, as long as it worked and people found it useful, I was
happy. Somewhere along the way I lost that, over my short eight year career I became to focused on writing “great”
software, that I lost my primary focus, which was writing software that delivered business value. So here is the email
that I sent my team today, you will notice lots of qoutes and paraphrasing
from that episode. I just wanted to share and hope others get back to what really matters, putting solutions in the
hands of people to improve their lives.&lt;/p&gt;</description></item><item><title>Static Blog Generators: I am on Cloud9</title><link>https://phillipsj.net/posts/static-blog-generators-i-am-on-cloud9/</link><pubDate>Sun, 12 Apr 2015 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/static-blog-generators-i-am-on-cloud9/</guid><description>&lt;p&gt;I am a big fan of using a static blog generator. I don’t have to worry, about security, database, or hosting. This blog is powered by &lt;a href="http://tinkerer.me/"&gt;Tinkerer&lt;/a&gt; which is an extension built on &lt;a href="http://sphinx-doc.org/"&gt;Sphinx&lt;/a&gt;, Sphinx is primarily used to create documentation for Python projects, but is really useful in general for lots of things.&lt;/p&gt;
&lt;p&gt;One issue I have come across with most static blog generators is that most have a depedency that doesn’t run well on windows, not a issue normally, but I have been moving back to the windows ecosystem lateley. Another complaint/issue is that you can’t just edit the blog without sitting at your computer or a computer you own.&lt;/p&gt;</description></item><item><title>Snap back to reality, oh, there goes the ORM</title><link>https://phillipsj.net/posts/snap-back-to-reality-oh-there-goes-the-orm/</link><pubDate>Thu, 09 Apr 2015 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/snap-back-to-reality-oh-there-goes-the-orm/</guid><description>&lt;p&gt;I find myself going down this rabbit hole every six months it seems. I get lured in by the promises of an ORM. First it was &lt;a href="http://www.castleproject.org/projects/activerecord/"&gt;Castle’s Active Record&lt;/a&gt;, then Linq2SQL, then Entity Framework, finally I settled on &lt;a href="http://nhibernate.info/"&gt;NHibernate&lt;/a&gt; as it worked better than others and I just liked the feel of it all. Then I discovered &lt;a href="https://github.com/StackExchange/dapper-dot-net"&gt;Dapper&lt;/a&gt;, oh how I really like Dapper. Dapper provides just enough abstraction to ADO .NET that I do not have to fiddle with data adapters or readers, or build commands. It provides all the power of SQL that I find that I need and all the object mapping I could want.&lt;/p&gt;</description></item><item><title>Authorize .NET Helpers</title><link>https://phillipsj.net/posts/authorize-net-helpers/</link><pubDate>Sat, 21 Mar 2015 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/authorize-net-helpers/</guid><description>&lt;p&gt;So I made this &lt;a href="http://www.phillipsj.net/blog/html/2015/02/26/authorize_net_dpm_helper.html"&gt;post&lt;/a&gt; a couple of weeks ago about how to wrap the Authorize.NET SDK into a better form to make it easier to integrate with ASP .NET MVC. So I decided to take it the next step and I created a NuGet &lt;a href="https://www.nuget.org/packages/AuthorizeNet.Helpers/"&gt;package&lt;/a&gt; for it, which can be found here. The &lt;a href="https://github.com/phillipsj/authorize-net-helpers"&gt;source code&lt;/a&gt; is up on GitHub under an Apache license. I have also hooked it up to &lt;a href="http://www.appveyor.com/"&gt;AppVeyor&lt;/a&gt; to build anything pushed to master and deploy the update to NuGet. AppVeyor is really cool and super easy to use. I have mostly used TeamCity and Jenkins, but many of these new services make it even easier. Hope everyone finds this useful, please feel free to open any issues for improvements or suggestions and I will try to make them. If you have anything you would like to contribute please let me know.&lt;/p&gt;</description></item><item><title>Authorize .NET DPM Helper</title><link>https://phillipsj.net/posts/authorize-net-dpm-helper/</link><pubDate>Thu, 26 Feb 2015 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/authorize-net-dpm-helper/</guid><description>&lt;p&gt;I recently started diving into learning about payment gateways and payment processing. This is a new area for me and there a lot to learn. After Authorize .NET was settled on as our payment gateway, I went about the task of learning their .NET SDK. There are way to many options and I do not understand the pros and cons of each method, but after reading their documentation I settled on using their Direct Post Method (DPM) as it limited our exposure to sensitive information and the featureset is perfect for what we are currently doing.&lt;/p&gt;</description></item><item><title>DapperExtensions Mapper to Dapper</title><link>https://phillipsj.net/posts/dapperextensions-mapper-to-dapper/</link><pubDate>Thu, 19 Feb 2015 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/dapperextensions-mapper-to-dapper/</guid><description>&lt;p&gt;I have used several of the differnet Object Relation Mappers (ORMs) out there and I find myself going back to &lt;a href="https://github.com/StackExchange/dapper-dot-net"&gt;Dapper&lt;/a&gt;. Dapper provides all the functionality that I find that I need and gives the the full power of the best DSL for working with a database, SQL. It is fast and lightweight. However, I do not know many peeps that want to waste there time writing the typical CRUD operations. Projects like &lt;a href="https://github.com/tmsmith/Dapper-Extensions"&gt;DapperExtensions&lt;/a&gt;, Dapper.Contrib, Dapper.Rainbow, and others, give users plenty of choices.&lt;/p&gt;</description></item><item><title>PyTennessee 2015</title><link>https://phillipsj.net/posts/pytennessee-2015/</link><pubDate>Mon, 09 Feb 2015 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/pytennessee-2015/</guid><description>&lt;p&gt;The second ever PyTennessee just wrapped up and I really enjoyed myself again. It is nice having a great conference to attend in Tennessee. The organizers topped themselves again this year. For the price this conferece is packed with great sessions and as a bonus the food was awesome, provided by &lt;a href="http://www.siftednashville.co/"&gt;sifted&lt;/a&gt;. I am just going to run through a couple of my favorites, but I really enjoyed all that I could attend.&lt;/p&gt;</description></item><item><title>Why I am not leaving .NET</title><link>https://phillipsj.net/posts/why-i-am-not-leaving-net/</link><pubDate>Sat, 17 Jan 2015 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/why-i-am-not-leaving-net/</guid><description>&lt;p&gt;This is going to be a long read, but something has just gotten me going today about making this post. I have actively been doing development for nine years. I started my development experience
learning VB .NET and VBA. I got my first job with doing .NET development with C#. I enjoyed my job very much even thought I was mostly frustrated with ASP .NET Web Forms. I finally discovered
ASP .NET MVC 2, which quickly got me interested in Ruby on Rails. I started playing with the magic of RoR and soon I was hooked in the community. All this time, Python was becoming a front runner as a replacement for VBA in the field of GIS which I was in. Of course this peeked my interest also. My horizons were widening, and I was learning a lot of stuff. Then, BAM!, I discovered open source software and libraries and was instantly hooked on the concept and ethos. I was experimenting with Linux and I was loving it. All of these changes were pushing me to leave .NET development and for the last three years I have been trying to just that.&lt;/p&gt;</description></item><item><title>Using Pods in Ember</title><link>https://phillipsj.net/posts/using-pods-in-ember/</link><pubDate>Wed, 07 Jan 2015 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/using-pods-in-ember/</guid><description>&lt;p&gt;When I first started using Ember-CLI I did not pods. Recently I started creating all new code usings pods. It was really weird at first to use them as the conventions seemed strange and confusing.
Items in the editor would show up with the same name and I couldn’t immediately find the file I was needing. However, as time has passed, I am really starting to like it and I am finding that the way it is organized really makes sense. I am finding files faster, I am not getting confused in Brackets as to which file I am editing. Configuring pods couldn’t be easier. Just follow the directions on the ember-cli site and if you want to fully commit then make sure to toggle the use by default settings.&lt;/p&gt;</description></item><item><title>Why I picked Ember</title><link>https://phillipsj.net/posts/why-i-picked-ember/</link><pubDate>Fri, 28 Nov 2014 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/why-i-picked-ember/</guid><description>&lt;p&gt;This is going to be long post, probably a ramble, about why I settled on Ember as the new age MV* framework I wanted to learn.&lt;/p&gt;
&lt;p&gt;When I first go started doing development, the ecosystem that I was working in was ASP .NET Web Forms. I learned to do all client-side interaction on the server and I always found myself struggling. Then along came the AJAX toolkit for ASP .NET, which enabled me to do cool things like auto update content areas without having to write any JavaScript or understand what was happening. Then as richer client experiences started gaining traction, my current team and I decided to go wtih Silverlight as most of us didn’t have large amounts of experience with JavaScript or Flex. Eventually, we ran into the issue that Flex and Silverlight are on the way out, so we decided to go JavaScript and started embracing jQuery and Dojo. jQuery because of its popularity and ease of use, Dojo becausee the GIS technology that we were using was built on top of Dojo. I left that job not to long after the transtion and found myself working on a project using ExtJS. As somewhat frustrating as it was, I really liked the framework and its implementation of a MVC style architecture. I was able to quickly convert a Flex application into a pure JavaScript application using ExtJS in a matter of weeks. In this same job, I also inherited support of a Dojo and Knockout application so I was exposed to the Knockout paradigm.&lt;/p&gt;</description></item><item><title>Review: ember-cli 101</title><link>https://phillipsj.net/posts/review-ember-cli-101/</link><pubDate>Sat, 22 Nov 2014 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/review-ember-cli-101/</guid><description>&lt;p&gt;I have posted a couple of times about my frustration using Ember. I was about two weeks in using EmberJS when I finally got to a point that I just did not know how to proceed. I was having difficulty connecting all the dots and embracing the “Ember Way”, which I feel is critical to really getting the most out of Ember.&lt;/p&gt;
&lt;p&gt;While beign frustrated I started looking for any material that could help me along. However, most materials are either older versions of Ember or do not use Ember CLI. Finally, I discoverd the book &lt;a href="https://leanpub.com/ember-cli-101"&gt;ember-cli 101&lt;/a&gt; by &lt;a href="http://blog.abuiles.com/"&gt;Adolfo Builes&lt;/a&gt;. I purchased the book and all I can say is, wow. This book really helped me and I was able to start connecting the dots that made Ember start clicking in my head. That is what has gotten my in this flury of blog posts about Ember, I somewhat get “it” now.&lt;/p&gt;</description></item><item><title>Ember-CLI and Google Maps</title><link>https://phillipsj.net/posts/ember-cli-and-google-maps/</link><pubDate>Wed, 19 Nov 2014 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/ember-cli-and-google-maps/</guid><description>&lt;p&gt;This evening I started working on a project that I realize Ember is the perfect
fit. The ability to create a custom data adapter to read from the Socrata Data Portal
solves some issues for me and ember data makes that easy. So I did a little search on
Ember Addons and found that there are several addons available. I picked &lt;a href="https://github.com/ember-admin/ember-cli-map"&gt;ember-google-map&lt;/a&gt;
since it seem to have the most features and appears very intuitve to use. Once I ran the npm command
to install it, I ran ember serve and bam. I was hit with the following error:&lt;/p&gt;</description></item><item><title>Moment.js and Ember-CLI</title><link>https://phillipsj.net/posts/moment-js-and-ember-cli/</link><pubDate>Wed, 19 Nov 2014 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/moment-js-and-ember-cli/</guid><description>&lt;p&gt;Moment.js is not inlcuded by default with Ember-CLI, so if you want to create a helper to generate beautifully formatted dates, then you need to make sure to install the ember-cli-addon for it.&lt;/p&gt;
&lt;p&gt;Here is the command:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ npm install --save-dev ember-cli-moment
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You will also have to update your jshintrc to inlcude “moment” in the predec section. However, I just discovered the ember-moment addon that creates helpers for you to use so you do not need to create your own.&lt;/p&gt;</description></item><item><title>Ember Helpers: Testing</title><link>https://phillipsj.net/posts/ember-helpers-testing/</link><pubDate>Mon, 17 Nov 2014 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/ember-helpers-testing/</guid><description>&lt;p&gt;Following up with my last post, I forgot to address one of the key development practices that I am finding that Ember makes extremely easy, testing. So I am going to show you how to test the helpers that were created in the previous post.&lt;/p&gt;
&lt;p&gt;In the previous post we ran the following command:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ ember g helper &amp;lt;helper name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This command generates both the helper and its corresponding test. Open the corresponding test file for the mailToLink helper. We are going to write a test that makes sure it generates the correct link.&lt;/p&gt;</description></item><item><title>Ember Frustration</title><link>https://phillipsj.net/posts/ember-frustration/</link><pubDate>Wed, 05 Nov 2014 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/ember-frustration/</guid><description>&lt;p&gt;Since yesterday’s post I have spent two full days of frustation while working on the Ember app that I am building. I am finding it very difficult to do what I would consider straight forward
things, such as searching and displaying an edit view. I know that that I am just not thinking the “Ember Way” and hopefully I can get on board before too long. I will say that I am still amazed
at how much of the application I have created by just defining models, routes, and templates. I think that I am super productive, just frustrated because it is not clicking. My biggest complaint goes back to what most projects end up doing, which is showing an example, but not in the context of how you would actually do it building an architected application.&lt;/p&gt;</description></item><item><title>Helpers in EmberJS</title><link>https://phillipsj.net/posts/helpers-in-emberjs/</link><pubDate>Tue, 04 Nov 2014 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/helpers-in-emberjs/</guid><description>&lt;p&gt;EmberJS uses Handlebars as its template engine. To extend it, you create what Ember calls helpers. There are several ways in Ember to tackle a problem, but some are more optimal than others.&lt;/p&gt;
&lt;p&gt;I needed to create tags that use the &lt;strong&gt;mailto&lt;/strong&gt; and **tel&amp;quot; attributes. So achieve this I created helpers so my templates are a little more semantic to read and understand what is happening.&lt;/p&gt;
&lt;p&gt;The first helper I created was a mailto helper. Using Ember-CLI is a nice way to get started. Remember that helpers kind of require a multipart name, so make sure not to create one with a single name as it tends to generate errors in EmberJS. Another tip is to make sure that you wrap your html tag in the Ember.Handlebars.SafeString method so it doesn’t escape the html when rendering.&lt;/p&gt;</description></item><item><title>New Project with EmberJS</title><link>https://phillipsj.net/posts/new-project-with-emberjs/</link><pubDate>Mon, 03 Nov 2014 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/new-project-with-emberjs/</guid><description>&lt;p&gt;We are starting to embark on changing a few applications at work to be more modern and to start using an API that we are developing.&lt;/p&gt;
&lt;p&gt;This left me with the descision as to which, if any javascript framework, we should use. I am most familiar with Dojo, ExtJS, and jQuery. I knew that Angular is the most popular at the moment, but
the directives kind of bother me and seems to muddy the water. This left me with wanting to try &lt;a href="http://emberjs.com/"&gt;EmberJS&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Book Club: Confident Ruby</title><link>https://phillipsj.net/posts/book-club-confident-ruby/</link><pubDate>Mon, 22 Sep 2014 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/book-club-confident-ruby/</guid><description>&lt;p&gt;I recently started ready the book “Confident Ruby” by Avdi Grimm. I have been a long time listener to the Ruby Rogues and I have been interested in this book for sometime. Since I started a new job and we didn’t have a book club, I thought this would be a good opportunity to be held accountable to read it.&lt;/p&gt;
&lt;p&gt;I like the idea of writing confident code in general. I find myself writing lots of null checks, try-catch blocks, etc. and I really do think it clutters up your code, decreases clarity, and minimizes the story that you are trying to tell. Since Ruby is a dynamic language and I primarily work in a static typed language, so you have to think about how some of the patterns in the book
are applied. I discovered if I think in terms of interfaces, then I can use “duck typing” like features. This makes me think about using more interfaces along my application boundary to ensure that objects meet the criteria that I need so I don’t have to type check.&lt;/p&gt;</description></item><item><title>Shinken Day One</title><link>https://phillipsj.net/posts/shinken-day-one/</link><pubDate>Mon, 08 Sep 2014 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/shinken-day-one/</guid><description>&lt;p&gt;I have been investigating monitoring tools to determine which one would best fit our skillsets and environment. While I was at the City of Austin, we used Nagios and I found it an awesome tool because of the alerting and alert escalation that was built in. &lt;a href="http://www.shinken-monitoring.org/"&gt;Shinken&lt;/a&gt; is a montioring framework written in Python with it’s heritage being Nagios. Since it is a Python based framework I thought what would be better to use.&lt;/p&gt;</description></item><item><title>Standing Desk</title><link>https://phillipsj.net/posts/standing-desk/</link><pubDate>Sun, 20 Jul 2014 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/standing-desk/</guid><description>&lt;p&gt;I have been wanting to try a standing desk for little over a year. I have been hesitant to make the commitment, but I have just completed three days with a standing desk and I will say it has been awesome. The first day I stood way too much, but then the last two days I feel I mixed it up just enough that I was not as tired and felt way better.&lt;/p&gt;</description></item><item><title>Legacy Code Challenges</title><link>https://phillipsj.net/posts/legacy-code-challenges/</link><pubDate>Fri, 11 Jul 2014 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/legacy-code-challenges/</guid><description>&lt;p&gt;In preparation for my new job, I started reading “Working Effectively with Legacy Code” by Micheal Feathers. So far I am finding the book really informative and definately openining my mind. I was just given a legacy project that currently needs some work. I have yet to start writing many tests, but I do have some in place. I look forward to trying many of these new techniques and I am finding that it is helping me learn more about design and design patterns. Hopefully I get more on role with blogging.&lt;/p&gt;</description></item><item><title>New Job</title><link>https://phillipsj.net/posts/new-job/</link><pubDate>Tue, 24 Jun 2014 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/new-job/</guid><description>&lt;p&gt;I started a new job a few weeks ago. I now have a title of Software Engineer which I feel is more expressive of what I feel that I do. The company is awesome and have been supportive of me. I also feel that everyone is just as excited as I am about being there. I have some new inspiration and I hope to introduce a few projects that will be useful for others. I may also migrate to a new domain that is a little more reflective since I am not doing much spatial development in my new position.&lt;/p&gt;</description></item><item><title>Copyright and Licensing</title><link>https://phillipsj.net/posts/copyright-and-licensing/</link><pubDate>Thu, 29 May 2014 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/copyright-and-licensing/</guid><description>&lt;p&gt;*Disclaimer: I am not a lawyer.&lt;/p&gt;
&lt;p&gt;Copyright and licensing are difficult to understand, but there are resources on the web that will at least ease the burden of understading. There is a site called &lt;a href="http://choosealicense.com/"&gt;ChooseALicense&lt;/a&gt; that can help with understanding open source licenses. This &lt;a href="http://www.smashingmagazine.com/2011/06/14/understanding-copyright-and-licenses/"&gt;article&lt;/a&gt; on SmashingMagazine also provides a nice overview of copyright and licensing.&lt;/p&gt;
&lt;p&gt;The importance of this is that developer and IT staff need to understand these to be effective at their job. As OSS becomes more prominent, it already is in my opinion, then understanding of these will only be in more demand. If you are thinking of open sourcing a project, please make sure to choose a license. If you do not choose a license then you still hold the copyright and you are not giving your users any protection. Another note to keep in mind is that a contributor agreement is nice to have to insure that any contributors give their copyright over to the project.
Apache license is great for this since it contains a contributor agreement.&lt;/p&gt;</description></item><item><title>Lots of dislike for Dojo</title><link>https://phillipsj.net/posts/lots-of-dislike-for-dojo/</link><pubDate>Fri, 16 May 2014 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/lots-of-dislike-for-dojo/</guid><description>&lt;p&gt;I have noticed recently that lots of people seem to really dislike Dojo. I have no clue as to why. Dojo was an early adopter of a lot of new techniques and technologies. I would agree Dojo has a steep learning curve and it is a large framework with lots of parts. Dijits are awesome and do provide a nice modular way to build parts of the application. The other big item in Dojo is that two of the default themes are accessible. I will agree it is a large enterprisey framework, but if you remove that it is not all that bad.&lt;/p&gt;</description></item><item><title>Why I dislike responsive design</title><link>https://phillipsj.net/posts/why-i-dislike-responsive-design/</link><pubDate>Thu, 15 May 2014 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/why-i-dislike-responsive-design/</guid><description>&lt;p&gt;Lately I have been working on a project that uses responsive design. Initial it sounded like a great opportunity as I have not had the privilege to work on a responsive website that is GIS based. While it has in fact been a great chance to learn, it has enlightened me to the pitfalls of responsive design. Issues such as, when I am on a desktop and minimize the browser it switches to the mobile friendly version, however I am still on a desktop. If you use feature detection along with screen size then you have a fairly decent combination that will help with the issue preventing desktop and laptop screen issues when the browser is minimized. But, this lead to the an even more complicated issue, we now have touch on desktop and laptops. Now the combo of feature detection and screen size collapses. And this issue is the failure of responsive design in my opinion. Why should users on desktop and laptops have to compromise and why do mobile users have to wait for downloading a whole website or put up with sub-optimal design. I am starting to think that you really need to build two apps, one optimized for desktops/laptops and one that is optimized for mobile. The big kicker is both should be touch friendly. I am glad that I realized this today and I am looking forward to applying this approach to any new sites I create.&lt;/p&gt;</description></item><item><title>Conventions and Standards</title><link>https://phillipsj.net/posts/conventions-and-standards/</link><pubDate>Wed, 14 May 2014 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/conventions-and-standards/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR; You should have a good reason not to follow conventions or standards.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is going to be a little ranty and I apologize for it. However, I feel it needs to be said, why do developers choose not to follow common conventions or standards? With tools like Yeoman why wouldn’t you use that to generate your project so you would have a conventional project layout. Why do developers not use the default ASP .NET MVC project conventions? Why do developers choose not to follow a standards guide for the code they write? I find this frustrating to work on these projects. In the last year I have encountered .NET projects that create their own config.xml file, why not use app.config/web.config? I can overlook the custom config.xml, but why must these developers insist on writing customer parsers instead of using the built-in serialization libraries?&lt;/p&gt;</description></item><item><title>Getting to know Dojo</title><link>https://phillipsj.net/posts/getting-to-know-dojo/</link><pubDate>Wed, 23 Apr 2014 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/getting-to-know-dojo/</guid><description>&lt;p&gt;I have been wanting to dive into Dojo for sometime, but I have always let the new fancy frameworks lure me away. I have a draft post about Angular gueued up right now, but I have been working with Dojo recently and it seems every time I work with it, I come across some feature that makes me think, WOW! Dojo has several features that everyone raves about in other frameworks. Dojo was one of
the first adopters of AMD, it has templates, a widget framework, charts, mobile ui, dijits, and the list can keep going. I am going to make it a point to learn Dojo since it is the backbone of Esri’s JavaScript API and it is unavoidable if you are doing Esri based GIS development. It also appears that Dojo is now starting to implement mapping based on OpenLayers.&lt;/p&gt;</description></item><item><title>Developer Practices</title><link>https://phillipsj.net/posts/developer-practices/</link><pubDate>Sat, 12 Apr 2014 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/developer-practices/</guid><description>&lt;p&gt;I stumbled across a blog &lt;a href="http://www.khebbie.dk/gist/9719703"&gt;post&lt;/a&gt; by Klaus Hebsgaard about “Practices of A Professional Developer”. I feel it summed up my feeling to a large degree about some core practices that are really above some of the other practices. Using several environments for testing and automation are a big key and both fall in line with coding standards. Standards transcend just the code and definitely are part of the other practices listed in the blog post. Automation enforces a standard way to build the software, if any of those standards are not followed then the automated builds and deployments will break. It also applies to environments, if your application is changed which prevents it from interacting with the environments in a standardized way then one of the environments will break. I have been discussing standards recently at work and I feel that it is well received by some and not by others. I am not talking about being really strict, but I am talking about standards when it comes to the basics or else you end up with the “It works on my machine” or just one developer that can actually make changes or do deployments. I have some more thoughts on this topic that hopefully I can materialize.&lt;/p&gt;</description></item><item><title>2014 Dev Summit Presentations</title><link>https://phillipsj.net/posts/2014-dev-summit-presentations/</link><pubDate>Wed, 26 Mar 2014 00:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/2014-dev-summit-presentations/</guid><description>&lt;p&gt;Updated my presentations page to include the titles and links to the presentations from the 2014 Esri Dev Summit. These presentations where recorded and I will update the page with the videos as soon as those are uploaded.&lt;/p&gt;</description></item><item><title>Esri Dev Summit Recap</title><link>https://phillipsj.net/posts/esri-dev-summit-recap/</link><pubDate>Mon, 17 Mar 2014 20:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/esri-dev-summit-recap/</guid><description>&lt;p&gt;I made it back from the Esri Dev Summit. Dodge ball did not work out so well as we went out in the second round. However, the &lt;a href="http://video.esri.com/watch/3223/social-coding-and-the-future-of-open-source"&gt;keynote&lt;/a&gt; by Chris Wanstrath was great and a keynote that was definately needed at an Esri conference.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://lh6.googleusercontent.com/gouchMtXggUNpI7SAQjGyIqIX47wtdIkApg4DtVk1zzA6c3NJz-TyuMZD-fVDWymfiQvq-7dprNSGI5M9V8Wvmylsjj43xSB-j8Y6F6DQQ-NXD6SMeB-qruWV2VqR0ItkFkn8hBiF29g1fUrcxbZ7aUTYdZzjA=w506-h750" alt="Jamie Phillips and Chris Wanstrath"&gt;&lt;/p&gt;
&lt;p&gt;My presentations went really well and both were well recieved.The highlight was when a member of the File Geodatabase API team, who also supports SQLite attended. It was great
having a member of a team to show interest in your presentation and participate in a Q&amp;amp;A session. Thanks to everyone who gave me feedback, it was appreciated. Also a big shout
out to Amy Niessen of Esri for coordinating all the user presentations.&lt;/p&gt;</description></item><item><title>Attended LOPSA Meetup</title><link>https://phillipsj.net/posts/attended-lopsa-meetup/</link><pubDate>Mon, 17 Mar 2014 00:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/attended-lopsa-meetup/</guid><description>&lt;p&gt;I attended my &lt;a href="http://lopsaetenn.org/"&gt;local&lt;/a&gt; &lt;a href="https://lopsa.org/"&gt;LOPSA&lt;/a&gt; meetup. The presentation for the night was about “Software-Defined Networking”. It was presented by Andy Cowell of the Scripps Network which owns HGTV and FoodNetwork to name a couple. With I had more developer focused meetups, but I think I will keep attending. Next meeting is about disaster recovery at the University of Tennessee.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://lh4.googleusercontent.com/-BaFLYqCWiGM/UyepHbwxd2I/AAAAAAAAAF4/nJQqhmMIhLo/w400-h225-no/LOPSAEastTN&amp;#43;-&amp;#43;2" alt="Google&amp;#43; LOPSA Meetup"&gt;&lt;/p&gt;</description></item><item><title>Repository Pattern with Postgres.py</title><link>https://phillipsj.net/posts/repository-pattern-with-postgres-py/</link><pubDate>Wed, 05 Mar 2014 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/repository-pattern-with-postgres-py/</guid><description>&lt;p&gt;At &lt;a href="http://www.pytennessee.org/"&gt;PyTennessee&lt;/a&gt; I attended a presentation about ‘Postgres.py’&lt;em&gt;. It is a nice simple interface. The presentation and one of the project creators was no other
than ‘Chad Whitacre’&lt;/em&gt;. If you haven’t met Chad Whitacre then you are missing out. He is a great example of someone who is truly an ambassador of the community. During the presentation
there were lots of discussion about accessing data and it seems there was a focus on using the ‘active record’_ pattern. However, I feel that the library would lend itself to the use of the &lt;a href="http://martinfowler.com/eaaCatalog/repository.html"&gt;repository&lt;/a&gt; pattern. Without any more here is the &lt;a href="https://gist.github.com/phillipsj/9367366"&gt;gist&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>PyTennessee 2014</title><link>https://phillipsj.net/posts/pytennessee-2014/</link><pubDate>Mon, 03 Mar 2014 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/pytennessee-2014/</guid><description>&lt;p&gt;I attended PyTennessee a couple of weeks ago. This is the fisrt one of what I hope is many. I took some photos of the talks that I attended. I meet some great folks while at the conference and a few key community members that I have been wanting to meet. We had the former and current chair for PyOhio there and I am looking to attend it in July. I took some photos of the event, but I am still learning to use tinkerer and I may need to submit a pull request to get this to work or create an extension.&lt;/p&gt;</description></item><item><title>Now using Tinkerer</title><link>https://phillipsj.net/posts/now-using-tinkerer/</link><pubDate>Sun, 23 Feb 2014 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/now-using-tinkerer/</guid><description>&lt;p&gt;I have finally moved my blog over from Blogger to using &lt;a href="http://tinkerer.me/"&gt;Tinkerer&lt;/a&gt; with hosting on Github Pages. I do not know if I am going to move over older posts or just make a clean cut and start fresh. Tinkerer is a project that using &lt;a href="http://sphinx-doc.org/"&gt;Sphinx&lt;/a&gt; as the backbone to build a static blogging framework. So far I really like it and it also helps me get more familiar with Sphinx and &lt;a href="http://docutils.sourceforge.net/rst.html"&gt;reStructeredText&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Esri Dev Summit</title><link>https://phillipsj.net/posts/esri-dev-summit/</link><pubDate>Mon, 10 Feb 2014 19:00:00 +0000</pubDate><guid>https://phillipsj.net/posts/esri-dev-summit/</guid><description>&lt;p&gt;I submitted two presentations to the Esri Developer Summit and luckily both presentations were accepted. I will post back when I know exactly when my presentations will occur.&lt;/p&gt;</description></item></channel></rss>