Buy Me a Coffee

Buy Me a Coffee!

Tuesday, May 31, 2022

Tool roundup is great utility for presenting on Windows. It shows your keystrokes so you don't have to talk through your shortcuts. is a site to monetize your site or blog. is a dataset of high quality faces to be used for AI training. is one of my favorite movie clips to use when explaining scope creep. is an architectural style I am interested in learning more about. is an open source terminal. is an open source CMS system built on .Net.

Learn how to branch using Git on this site is trying to build standards for cloud native networking through reference infrastructures and test suites. is from a while ago, but the best article I have found to explain technical debt and the complexity of compatibility.

Monday, January 31, 2022

Writing a technical blog post

I recently told a colleague that “writing a 1000+ word article wasn’t hard, getting started was hard” and that he should “write about what he knows, or what he wants to learn about” so now I feel obligated to write about writing.  Writing a blog post is a lot like writing an essay. It has been years since my college English classes, but a quick Bing search about essays gives me the refresher I need.  I need to start with an introduction (this paragraph), follow it with a couple of main points (for me that is what you know and what you want to learn), and end with a conclusion.

Writing about something you know is something that you should do for a couple of different reasons.  The first reason is to help solidify the knowledge by forcing yourself to express it in a form that is accessible by an audience other than your peers. Providing an understandable context of how and why programmers approach problems in the way that we do has value.  The more the customers for our software know about what goes into creating it, the better able they are to provide meaningful feedback.  Writing about how and why you approach problems the way that you do forces you to examine your process so that you can replicate the successes and mitigate the failures.

Another reason to write about something you know is to provide insights that you have gained through the work that you have done for the various clients that you have worked for.  When siting down to write about software architecture, you are not writing it for others at your current or past projects, you are writing for those about to start similar projects.  You are writing about the lessons learned the hard way so that your peers can avoid making the same mistakes.  Software development is both an art and a science, and within either discipline there are forums for publishing successes and failures.  It is often more important to be honest about what didn’t work than it is to promote yourself by only reporting what succeeded.

One way that writing a short form article about something that you want to learn about helps is by forcing you to start with a SMART (Specific, Measurable, Attainable, Realistic, Time-bound) goal.  Unless you are planning on writing a book, the learning goal for an article needs to be specific and limited.  Writing an article on how to use a new language feature to implement a solution to an existing problem is a well sized example.  You can also write an article comparing the performance of various popular solutions to a simple problem.

Even though you define a goal/problem in your introduction, you shouldn’t measure your success by how close you come to solving it.  Measure your success by the existence of an article.  When you finish writing the article, you have either achieved your desired result or you have documented a method that does not work.  This allows success even if you don’t solve your problem, which is a great motivator to write more articles. 

You are a consultant or a developer and not a college professor, so your research needs to focus on attainable types goals.  How to solve a problem that you don’t know how to solve using a technology that you are already familiar with or solving a problem that you are very familiar with utilizing a new technology.  College professors and other researchers are charged with pushing the boundaries of human knowledge while you should be focused on expanding your own boundaries.

It is unrealistic for anyone to define the whole breadth and depth of a subject within 1000 words.  A short form article constrains you to focus on either a shallow depth and limited breadth or a deep dive into a specific portion.  A good example of limiting the breadth and depth of a subject would be a survey of the different networking options available when setting up a Kubernetes cluster.  

Limit myself to one week when writing about a subject you want to learn about.  This is long enough for you to do a couple of hour-long experimentation sessions and then replicate them.  If you work for a company that has an active developer community and you have not made any progress by day two you should ask for some guidance or a push in the right direction.  If you don’t have something available to you at work then join a local user’s group or find a similar community on one of the tech forums (StackOverflow or Reddit are great places to start).  Any topic that takes you longer than a week to research is something that you should probably invest in a course or book to learn.  Adjust your time limit as you write more and more articles because your optimum time might be different than mine.  

Finally, writing about a subject that you are learning about also helps you anchor the material in your mind.  Having to put the concepts into your own words in a way that will allow someone else to replicate your experience forces you to slow down and think about each step of the process.  When writing a learning article, think about building a VM with a vanilla OS to force yourself to consider each tool and step you take along the way.  You can use snapshots to allow you to roll the VM back to the starting state several times as you attempt to follow along with your written steps.  Assume nothing, and test each step with malicious ignorance.

Those are the types of blog posts that I write and the reasons behind them.  I have attempted to force different types of articles for different audiences in the past, but when I am doing something that isn’t natural for me then I tend to lack motivation.  My job is not to write articles, my job is to help write software to solve problems.  Writing blog posts like this one and the ones described above help me be a better communicator which helps me ensure that the solution we are implementing is solving the right problem.

Afterword: Ok, that is over my 1000-word goal, but that is not the entire writing process.  There are two important steps that I have not covered.  Editing and peer review.  It has taken me around 2 hours to write out my first draft of this article.  After I complete an article, I let it sit for a day or two and then come back and re-read it for content and clarity.  If it is an article that I am publishing on my own blog then I will upload it and schedule it to publish.  If it is an article that I am intending to publish in a different forum then after I have made my edits, I will send it out to a couple of peers to proof before publishing.

(Originally published elsewhere, at another time.  But since the original location no longer exists...)

Friday, September 17, 2021

.NET 6 is just over the horizon

 On September 14th, Microsoft announced the first 'go live' version of .NET 6:

.NET 6 not only introduces some new C# 10.0 language features, it also contains some interesting security updates and some optimizations for faster load times.  I can't wait to use it on a project, but for now I will just have to be content with .NET 5 for a while longer.

Monday, January 25, 2021

Adding a custom domain to a static site

(written on Feb 2nd and back published to Jan 25th)

 Now that we have our static site, it would be more convenient to use a custom domain than the <xxx>.<xxx> address that is provisioned by default.  There is a guide and we should be able to do it as our guest user, so log back into the portal using your guest account and click on the storage account under Recent resources

In the search box type custom and click on <custom domain>

Once there, you will be given a place to type in your custom domain and type in the domain name you are going to use.  I have been playing around with the domain for some time now and use it for experiments such as this.  I will talk about how to get a domain name in another article, but for now I am just going to type in into the domain name box and then in the section 1 above that box you need to highlight the address of the site and put it on your clipboard
Now, following the instructions you need to create a CNAME for your url and point it to the captured address.  For me, I do this in CloudFlare.  I host all of my DNS there, regardless of where I buy my domain name.  It is fast and convenient and free.  So, I set up a CNAME with the name www and paste in my site address of and click <save>

Then I go back to Azure Portal and click <save>
Now, I can see my site by going to!  Well, not quite yet.  If you just put in the address, many browsers will try to go to which will fail with an error message because HTTPS is required by default on our static site:
Going to is better, but you should (using a modern browser) be given some harsh warning like this
because the SSL certificate doesn't match the url you are using.  This is a GREAT THING!  Using Pale Moon, you can click through and see your site by clicking on <i understand the risks> and then on <add exception>
Uncheck the <permanently store this exception> and then on <confirm security exception> 
And you are in

But at what cost?  It is inconvenient.  What do we do to fix this?  Add our domain name to an SSL certificate and put it on the site.  We will work on that next time.

Sunday, January 24, 2021

Giving a guest user rights to create a static site

(written on Jan 31st and back published to Jan 24th)

We created a new external user, granted that user rights, and then that user deleted the resources it had rights to.  Now let's grant rights to create a specific resource type and see if we can get a new static site created and managed by our guest user.

So, log into the Azure Portal using the subscription owner and click on <all resources>

Click on the <add>
type storage account in the search box and click on <storage account>
Click on <create>
Then click on <create new> below the resource group and we will add a new one by naming it and clicking on <ok>
Now scroll down and type in the storage account name and click on <review + create>
Then click <create>
Click <go to resource>
Click on <access control (iam)>
Click <+ add> and <add role assignment>
Choose Contributor as the role and then click on your guest account and click <save>
Now log out of the portal and log back in using your guest account.  I am going to give PaleMoon a spin for this section.  Once you are logged in, click on <all resources>
Then click on your service account name
Type <static> in the search box and then click on <static website>
Click on <enabled>
Then type index.html in the Index document name and error.html in the Error document path and click <save> 
Note the url listed in the Primary endpoint so that we can use it later (mine is  You can click the 'stacked document' icon to have it copied to your clipboard, I did.
Now, click back to the base information for the resource using the name in the breadcrumb at the top
And open in Storage Explorer within your browser by clicking on <storage explorer (preview)> or if you have access to install software and want to use a local program you can click on <open in explorer> to launch it locally
Open up <blob containers> and <$web> and then click <upload>
Click on the folder icon
and then browse to the two html files we created much earlier, select them, and click <open>
Click <upload>
Once they finish it will look something like this
Open a new tab and confirm that your site is up and we are done!
Note that you are using https which means you are using a secure pipe between the server hosting your page and your browser.

Saturday, January 23, 2021

Accessing an Azure Function as a contributor

(Written on January 24th and posted back to the 23rd.  I am behind, but catching up!)

We have our new user assigned as a contributor on our Azure Function.  What can we do with it?  Log into the portal using the guest email address and click on you Azure Function under the Recent resources banner

Click on the <stop> button and then on <yes>
And the function stops.
No real surprise there. Now click on the elipses (the three dots) and then on <delete>
Type in the name of your function and click <delete>
And the function is gone, just like that.  Did you expect that?  A contributor has a lot of power.
It still shows up in our Recent resources but it is really gone.  Can we create a new one to put in it's place?  Click <+ create a resource>
Type function in the search box and click on <function app>
Click <create>
Looking good so far!  The dropdown for the resource groups is empty so click on <create new> and start typing in your new resource name and BAM! you are stopped cold
Surprised?  When we granted rights to this account, we only granted contributor rights to the Azure Function.  We didn't grant any global rights for the user.  In fact, click on home and then our <all resources>
And look at the juicy error we see
We don't even have enough rights to list the available resources!  Pretty good.

Friday, January 22, 2021

Logging in with our external user

Ok, we created our new email address and assigned it access to the resource.  Now we need to log into the email account and accept the access and see how it looks.

Log in my typing in your user name and password and clicking <enter>

Click on the mailbox icon in the top and on the email from Microsoft and click <accept invitation> in the mail body
This will open a new window where you will be asked to create a Microsoft identity for your new email address.  It will already have your email address, it will just ask you to add a password and click <next>
As an aside, I was surprised to see that the password has a maximum limit that I hit with my head.  If you don't hit this then you aren't trying hard enough on your passwords!
Once we create our account, we are emailed a verification code that we will need to enter and then click <finish>
The verification code comes in an email and is a one time use
Click <no> on the stay signed in 
Click the <accept> the permission notification
Then we start the MFA dance because our Azure Directory requires it.  Click <next>
Note, this is only enabling Multi-Factor Authentication on the Microsoft Identity portion of our new email address.  It doesn't keep our base email secure, and security is a chain where the weakest link exposes everything.  Ok, click on <i want to use a different authenticator app> 
Click <next>
Scan your QR code in Authy and click <next>
Enter the authentication code listed on Authy for the new account and click <next> (missing image)
Click on <done>
Enter your code and then click <verify>
Click <no> on the Stay signed in? screen
Decline the tour by clicking <maybe later>
Click on the hamburger in the top left and the <all resources>
But we don't see our resource?
What is going on?  Guess what, a new Azure Directory was created for our new account and we are in it by default.  We just need to change over to the one with the resource.  Click on the silhouette in the top right and <switch directory>
Close the recommendation window by clicking on the X in the top right
Then use the hamburger to get to <all resources> or just click it on the screen
And there is the Azure Function!
That was a long walk to get there, but next time we will see what a contributor has rights to do.

(This was created on 1-24 and back dated.  I have been working long weekends and getting behind.)