Buy Me a Coffee

Buy Me a Coffee!

Sunday, December 21, 2025

Plex for home video serving

 The first service I installed on my home server was Plex.  Back during the time of Blockbuster, we decided to purchase movies rather than rent them if there was a chance that we would want to watch them more than once.  We ended up with over 400, and have long ago stored them in books and thrown out the cases but it was still a lot of trouble to dig through them and find what we wanted to watch.  I wanted to rip the DVDs and eventually BluRays but didn't have the storage for them for a long time.  I eventually got an external drive of sufficient size and started ripping movies.  Eventually I found MakeMKV and purchased a license for it. I have been running Plex since 2020 and purchased a lifetime subscription in 2023, so it wasn't a new thing for me to have internally.  

I had been running in on my desktop with an external drive.  I have an Intel NUC that I tried hosting it on for a while, but it wasn't powerful enough to really do it justice.  I often ran into reboot issues due to patching, or I would shut down my machine at the end of the day and have to go and start it back when someone wanted to watch a move.  

Adding the Plex LXC service was super easy using the Proxmox VE Helper-Script to build and install the image.  After adding it, I only needed to mount my external drive and start serving movies.  I had set up 5 of my 6 2G drives as a RAID 0 and moved many of the movies there to increase .  When I lost a drive in the array last week, I replaced 2 of them with very large drives (18G and 22G) and pulled all of my movies onto one of them.  I repurposed the external drive as the large drive on one of my new cluster servers and have it mounted as a target for Proxmox Backup.

I don't have much more to say about running Plex locally, it doesn't require much maintenance.  I added the service to Observium to monitor it and I update the base operating system and run the update of Plex itself through its interface.  As I write this, I am now looking at scripts to automatically update the underlying images. ;-)

I do expose the UI in NextCloud, but we really only use it through our Rokus.  I also picked up a FireStick last month when they were on deep discount at Target.  I hadn't plugged it in until just now, and I haven't finished playing with it yet.  Plex is honestly one of the easiest home applications I am currently running and if you have a CD, DVD, or BluRay collection at home there is no good reason to not take the plunge.

Friday, December 19, 2025

What I am running at home

Since we moved from Brooklyn to Wilmington, I have enough room to start setting up a real home lab.   

Side note: I have had my R710 since 2018 (thank you TechMikeNY) but it hasn't had a real home where I could actually run it as a server for over 3 years. I initially purchased it when Magenic was getting deep into a Pivotal Cloud Foundry partnership so I could run CF locally. I overbought (High-End Dell PowerEdge R710 Server 2x 2.93Ghz X5670 6C 144GB 6x 2TB) but it was something I had been wanting to do for a while and I was able to run it in the Magenic offices in Manhattan. I got a 1/4 rack on wheels and had a great time with it until Magenic closed the office and I had to bring it home to a Manhattan apartment.

I have a 1GB Verizon FiOS connection running in and a semi-finished basement and a full sized room for my office.  With a door!  Anyway, let me do a quick inventory and I will try and come back and talk about each entry in more detail later.  Sharing is caring, and I do want to brag a bit about what I have going on.  

First, I choose Proxmox as my base system.  I know VMWare has ESXi as a free hypervisor and Microsoft still has Hyper-V Server 2019 available, but I wanted open source as well as free with a great UI.  I looked at Unraid as it has perpetual licensing and looks great, but I decided Proxmox VE was a better fit.

Here are the different computers I have running as part of my Proxmox cluster:

  • Dell Poweredge R710
  • Dell XPS 17 L702X
  • Dell Precision M4800
  • HP Omen 40L
  • Dell Alienware Aurora R5
I started out just running on the R710 (The Beast) but thought it would be fun to try clustering and, admittedly, things got a little bit out of hand.  The service that I am currently hosting are:
I have some Windows 11 and openSUSE desktops running in VMs, and use Veeam to backup our desktops to OpenMediaVault.

I have not moved to Ceph storage to allow for VM migrations yet, as it it honestly a bit daunting and I still have a lot of work to do with my standard services.

I will try and get back into blogging more and will dig into the individual pieces as I do.  For example, I have Ollama running locally on my desktop, in a VM with a PCI passthrough, and on The Beast using raw memory and CPU.  The VM and local are memory constrained by the video cards I have but the  raw CPU and memory instance is slow.  

Thanks for your interest!

Tuesday, May 31, 2022

Tool roundup

http://carnackeys.com/ is great utility for presenting on Windows. It shows your keystrokes so you don't have to talk through your shortcuts.


https://ko-fi.com/ is a site to monetize your site or blog.

https://github.com/NVlabs/ffhq-dataset is a dataset of high quality faces to be used for AI training.

https://www.youtube.com/watch?v=6Rxqk3Lcvrw is one of my favorite movie clips to use when explaining scope creep.

https://jamstack.org/ is an architectural style I am interested in learning more about.

https://hyper.is/ is an open source terminal.

https://umbraco.com/products/umbraco-cms/ is an open source CMS system built on .Net.

Learn how to branch using Git on this site https://learngitbranching.js.org/.

https://anuket.io/ is trying to build standards for cloud native networking through reference infrastructures and test suites.

https://www.joelonsoftware.com/2008/03/17/martian-headsets/ 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: https://devblogs.microsoft.com/dotnet/announcing-net-6-release-candidate-1/

.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>.web.core.windows.net 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 caffeinatedcreations.com 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 www.caffeinatedcreations.com 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 guestsite.z13.web.core.windows.net and click <save>

Then I go back to Azure Portal and click <save>
Now, I can see my site by going to www.caffeinatedcreations.com!  Well, not quite yet.  If you just put in the address, many browsers will try to go to http://www.caffeinatedcreations.com which will fail with an error message because HTTPS is required by default on our static site:
Going to https://www.caffeinatedcreations.com 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 https://guestsite.z13.web.core.windows.net/).  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.