Author: Matt

  • Using Architectural Decision Records

    Recently, I was exposed to Architectural Decision Records (ADRs) as a way to document software architecture decisions quickly and effectively. The more I’ve learned, the more I like.

    Building Evolutionary Architectures

    Architecture, software or otherwise, is typically a tedious and time-consuming process. We must design to meet existing requirements, but have to anticipate potential future requirements without creating an overly complex (i.e. expensive) system. This is typically accomplished through a variety of patterns which aim to decouple components and make them easily replaceable.

    Replace it?!? Everything ages, even software. If I have learned one thing, it is that the code you write today “should” not exist in its same form in the future. All code needs to change and evolve as the platforms and frameworks we use change and evolve. Building Evolutionary Architectures is a great read for any software engineer, but I would suggest it to be required reading for any software architect.

    How architecture is documented and communicated has evolved in the last 30 years. The IEEE published an excellent white paper outlining how early architecture practices have evolved into these ADRs.

    But what IS it?

    Architectural Decision Records (ADRs) are, quite simply, records of decisions made that affect the architecture of the system. ADRs are simple text documents with a concise format that anyone (architect, engineer, or otherwise) can consume quickly. ADRs are stored next to the code (in the same repository), so they are subject to the same peer review process. Additionally, ADRs add the ability to track decisions and changes over time.

    Let’s consider a simple example, taken straight from the adr-manager tool used to create ADRs in a GitHub repository. The context/problem is pretty simple:

    We want to record architectural decisions made in this project. Which format and structure should these records follow?

    The document then outlines some potential options for tracking architectural decisions. In the end, the document states that MADR 2.1.2 will be used, and outlines the rationale behind the decision.

    It may seem trivial, but putting this document in the repository, accessible to all, gives great visibility to the decision. Changes, if any, are subject to peer review.

    Now, in this case, say 6 months down the road the team decides that they hate MADR 2.1.2 and want to use Y-Statements instead. That’s easy: create a new ADR that supersedes the old one. In the new ADR, the same content should exist: what’s the problem, what are our options, and define the final decision and rationale. Link the two so that it’s easy to see related ADRs, and you are ready to go.

    Tools of the Trade

    There is an ADR GitHub organization that is focused on standardizing some of the nomenclature around ADRs. The page includes links to several articles and blog posts dedicated to describing ADRs and how to implement and use them within your organization. Additionally, the organization has started to collect and improve upon some of the tooling for supporting an ADR process. One that I found beneficial is ADR-Manager.

    ADR-Manager is a simple website that lets you interact with your GitHub repositories (using your own GitHub credentials) to create and edit ADRs. Through your browser, you connect to your repositories and view/edit ADR documents. It generates MADR-styled files within your repository which can be committed to branches with appropriate comments.

    Make it so…

    As I work to get my feet under me in my new role, the idea of starting to use ADRs has gained some traction. As we continue to scale, having these decision records readily available for new teams will be important to maintain consistency across the platform.

    As I continue to work through my home projects, I will use ADRs to document decisions I make in those projects. While no one may read them, it’s a good habit to build.

  • If there is a problem…

    My son’s broken Stanley handle led me down the path of designing and printing a new handle. Overkill? Probably. But fun nonetheless.

    What’d You Do?

    Whatd You Do Chris Farley GIF - Find & Share on GIPHY

    My son came home last week from school last week with a bit of a sob story. Someone knocked his Stanley Quencher 40 ounce Tumbler off his desk, and it landed in such a way that the handle broke off. It was not that the screws came loose: the handle mounts just busted off.

    It was a relatively new purchase, so I told him to contact Stanley about a warranty. To Stanley’s credit, they shipped him a new one, so he’s got a new one and can move on with his life. But now we have a perfectly functional Stanley with no handle. This felt like a perfect opportunity to design a new one!

    It’s Prototyping Time!

    I checked Grabcad.com for an existing model of the Stanley 40 ounce Quencher, but alas, there was not one. I also checked Thangs.com and Printables.com, but nothing popped up. So, I took a few measurements from the Stanley I had in hand and went about mocking up a quick model of the Stanley. It is not at all pretty, but it gives me the proper dimensions for my handle model. I left the handle off because, well, mine does not have the handle, hence the reason for my work.

    Bare Stanley Quencher – No Handle

    The design I had in mind is similar to some existing Yeti handles that I have seen. While the official Yeti ones have a single ring, because the Stanley is a not flared as it goes up, I wanted a double ring design to take advantage of the lower flare on the Stanley.

    With a double ring, I needed to break this out into a multi-part component in order to print it. In order to add some strength to the finished product, I added dovetails at the joints.

    I ended up with this:

    Stanley Handle Rings
    Stanley Handle
    Stanley Handle

    Off to the Printer!

    I am still mulling over purchasing a 3D printer, so for now, I rely on Pittsburgh3DPrints to have my prints completed. I sent my design over and had the print turned around in a few days. Normally I can just pick it up, but they are out of the shop this week, so I had to wait patiently for the USPS to deliver it.

    How did it turn out?

    Pretty much exactly as I had planned… Which isn’t always the case, but I do love it when a plan comes together.

    The dovetails joints are actually pretty tight on their own, but I’m going to glue them up just for added strength and removing the worry of it coming apart and losing pieces.

    Getting closer…

    As I design and print more, the list of “pros” continues to grow in the “should I buy a 3D printer” debate I am having with myself. My modeling is, right now, serviceable, but I am getting better with each tutorial and print. Perhaps one day I’ll convince myself to get my own printer.

  • Streamlining my WordPress Install

    My professional change served as a catalyst for some personal change. Nothing drastic, just messing with this site a little.

    New Look!

    I have been sitting on the Twenty Twenty-One theme for a few years now. When it comes to themes, I just want something that looks nice and is low maintenance, and it served its purpose well. I skipped Twenty Twenty-Two because, well, I did not really want to dig into changing it to my personal preference.

    The latest built-in theme, Twenty Twenty-Three, is nice and clean, and pretty close to what I was using in Twenty Twenty-One. I went ahead and activated that one, and chose the darker style to match my soul…. I am kidding. I appreciate a good dark theme, so you know my site will reflect that.

    New Plugins!

    From time to time, I will make sure that my plug-ins are updated and that the WordPress Site Health page does not have any unexpected warnings. This time around, I noticed that I had no caching detected.

    But, wait…. I have Redis Object Cache installed and running. And, literally, as soon as I read that plugin name, I realized that “object cache” is not the same as “browser cache.” So I started looking for a browser cache plugin.

    I landed on WP-Optimize from UpdraftPlus. The free version is sufficient for what I need, and the setup was very easy. I got the plugin installed, and just before I ran the optimization, I noticed the warning to backup the DB using UpdraftPlus. And that’s when I realized, my backup process was, well, non-existent.

    In the past, I have used the All-in-One WP Migration plugin to backup/restore. However, the free version is limited to a size that I have long surpassed, and there is no way that I saw to automate backups. Additionally, the “backups” are stored in the same storage location, so unless I manually grabbed them, they did not go offsite.

    UpdraftPlus provides scheduled backups as well as the ability to push those backups to external storage. Including, as luck would have it, an S3 bucket. So I was able to configure UpdraftPlus to push backups to a new bucket in my MinIO instance, which means I know have daily backups of this site…. It only took 2 years.

    With UpdraftPlus and WP-Optimize installed, I dropped the All-in-One WP Migration plugin.

    New Content?

    Nope…. Not yet, anyway. Over the past year, I have really tried to post every four days. While I do not always hit that, having deadlines pushed me to post more often than I have in the past. While I don’t have the capacity to increase the number of posts, I am targeting to add some variety to my posts. I have been leaning heavily towards technical posts, but there’s a lot of non-technical topics on which I can wax poetic… Or, more like, do a brain dump on…

  • Get to the point!

    Navigating to mattgerega.com used to take you to a small home page, from which you had to navigate to the recent posts or other pages.

    Some quick analysis of my page traffic indicated that, well, all of my traffic was going to the posts. As my wife would say, “Don’t bury the lead!” With that, I change my WordPress options to take visitors directly to the recent posts.

    For the two of us who visit other pages… my apologies.

  • One Task App to Rule them All!

    New job means new systems, which prompted me to reevaluate my task tracking.

    State of the Union

    For the last, oh, decade or more, I have been using the ClearContext Outlook plugin for task management built into Outlook. And I really like it. I have become proficient with the keyboard shortcuts that let me quickly review, file, and organize my emails. They “Email to Task and Appointment” feature is great to turn emails into tasks, and allows me to quickly follow the “Getting Things Done” methodology by David Allen.

    I use Gmail for personal emails, though, and I had no real drive to find a GTD pattern for Gmail. And then I changed jobs.

    Why Switch?

    I started using Microsoft To Do for personal tasks, displaying them on my office television via MagicMirror. However, as ClearContext was my muscle memory, I never switched over to using To Do for work tasks. So I had two areas where tasks were listed: In Microsoft To Do for personal tasks, and in Outlook for professional ones.

    My new company uses Google workplace. This change has driven two changes:

    1. Find a GTD workflow for Gmail to allow me to get to “zero inbox.”
    2. Find a Google Tasks module for Magic Mirror.

    Regarding #1, this will be a “trial and error” type of thing. I have started writing some filters and such, which should help with keeping a zero inbox.

    As for #2, well, it looks like it is time for some MagicMirror module work.

    MMM-GoogleTasks

    When I started looking, there were two MMM-GoogleTasks repositories in GitHub, both related to one another. I forked the most recently updated one and began poking around.

    This particular implementation allows you to show tasks from only one list in Google, and shows all tasks on that list. Microsoft To Do has the notion of a “planned” view which only shows non-completed Tasks with a due date. I contributed a change to MMM-MicrosoftToDo to allow for this view in that MagicMirror module, so I started down the path of updating MMM-GoogleTasks.

    I could not help but start to convert this project to Typescript, which means, most likely, it will never get merged back. However, I appreciate the ability to create Typescript modules and classes, but ultimately have things rollup into three files for the MagicMirror module system.

    So I got the planned view added to my fork of MMM-GoogleTasks. Now what? I have two Gmail accounts and my work account, and I would like to see tasks from all three of those accounts on my MagicMirror display. Unfortunately, I do not have a ton of time to refactor for multiple account support right now… so it made the issues list.

    First Impressions

    It has been about two weeks since I switched over. I am making strides in finding a pattern that works for me to keep me at zero inbox, both in my personal inbox as well as my professional one. I am sure I will run into some hiccups, but, for now, things look good.

  • A New Chapter

    After 16 years, it is time to make a change. With that change, a bit of self reflection never hurts.

    Getting here

    At this point, I have spent more time in corporate full time employment than any other aspect of my life. I started my first full-time, salaried role in November of 2002, which I suppose means that my corporate life is approaching its 21st birthday. Thankfully, drinking laws do not apply to corporate life.

    My time in software was marked by a relatively tumultuous start: I was at three different companies in my first 5 years. I grew quickly in those roles and quickly grew out of them. The summer of 2007, however, brought me to Four Rivers, which I really believe is where my career began.

    Why there? My previous positions taught me a lot about the basics of software engineering. I learned about the practical applications for the algorithms and patterns that I learned in school, as well as the realization that nothing I ever write will be good enough, even for me, and this idea of constant evolution and improvement must be baked in to software.

    Four Rivers, however, took the time to invest in me. They worked to teach me what it means to be a good manager, a good leader, and to be knowledgeable about the business side of software. The 7 years I spent with the leaders there taught me so much, and I am forever grateful for their mentorship and guidance.

    In 2014, Four Rivers was acquired by Accruent. I spent the next 9 years honing my skills across different platforms. I learned many new skills and worked for a number of different leaders. From each of those leaders, I gained new perspectives into how things can be done, and sometimes, things that don’t work.

    Time for a change

    At some point, I started to feel like I had stagnated, both in my own career growth as well as what I could contribute to the company. While my seniority said 16 years, the change at Accruent definitely made me feel as though I had been working for different companies.

    However, as Snake Plissken famously quotes, “the more things change, the more they stay the same.” Yes, it was Alphonse Karr who wrote it first, but it is more memorable to me when Kurt Russell grumbles it before (#spoileralert) shutting down the world. So I started to look around for opportunities for a change.

    Reaching for more

    I had several interviews over the span of a few months. The market is very weird right now, as it is very much a “hirers” market. There are a lot of folks applying for relatively few positions, so companies can be more selective in their process. In a few instances, I made it through some initial phase interviews only to be ghosted or simply sent a form email thanking me for my time.

    A short rant: your candidate’s time is just as valuable as your own. Please try to remember that as you go through your hiring process, as it speaks volumes about your attitude towards your employees.

    I had an opportunity to interview for a position at Aspire for a software architect role. I must say, I was very impressed from the initial meeting. Every interview or screening was not an interrogation, but rather, a discussion about what I have done in the past, the things the company was seeking, and whether my skills and experience aligned with their needs and goals. It reminded me of my own style of interview, and was a refreshing change of pace from some recent experiences.

    I ended up receiving and accepting an offer for the position at Aspire, and started earlier this week. Sure, I’ve only been here a week, but the culture and atmosphere is a refreshing change. The company and the team are actively growing, and I look forward to digging in and starting to contribute.

    Am I scared? Absolutely. I have spent the last 16 years building up knowledge, experience, and reputation with the team at Four Rivers/Accruent. Now, I am basically the new guy, something I haven’t been for a very long time. However, with that clean slate comes the opportunity to learn from a new group and contribute what I know to their success.

  • Prototype 1 – Printed!

    With a little help from the folks at Pittsburgh 3D Prints, my first 3D printed prototype is complete. I am fairly certain this will lead to a new hobby with some useful output.

    But first, the problem

    As I mentioned in an earlier post, I have started to dabble in 3D printing. This desire actually came out of two separate issues that I wanted to address.

    1. I need a case for the Shelly LED Controller.
    2. I need an outdoor mount for our UE Megaboom 3 speakers.

    For my first prototype, I picked the Shelly LED Controller case, since it is more pressing and probably the easier of the two.

    Why a Case?

    I moved my LED controllers to the Shelly LED controllers in June. For containment, the LED strips outside already had waterproof boxes, so putting the Shelly in there was quick and painless.

    However, the kids have LED strips in their room, and that presents a problem. The Mi-Light box is self-contained, and includes a power jack to plug in a 5.5mm barrel plug transformer. The Shelly, well, does not. So I need a solution to contain the Shelly and provide a plug.

    Design Time!

    After replacing the GPU in my laptop, Fusion 360 is running quite nicely. I was able to grab a model of the Shelly LED controller from Grabcad.com. From there, I sketched out a rough bottom shell, leaving enough room on one side for wire connections and on the other for a panel mount barrel jack. I added a small slot for the LED 5 wire flat, as well as retention tabs to keep the Shelly in place. I added two build outs to hold a few M2 threaded inserts.

    Finished Case Body

    For the top, I used the sweep function to create a lip profile that matches the inside of the case body. I added additional retention tabs that match three of the tabs on the bottom, as well as a small cube to hold the Shelly against the case bottom. A few small holes for the M2 screws, and I was ready to print a prototype.

    A little help?

    I do not yet have a 3D printer. I am absolutely interested, but want to make sure it is something that I will use long term, as it is an investment. Luckily, the Pittsburgh3DPrints.com shop is literally 2 miles from my house, and they gladly printed my prototype for a reasonable fee. I exported my components as mesh files and sent them over, and with a day or so, I had a prototype printed in PLA.

    Prototype with Shelly LED Controller
    Case with Lid

    An this is why we prototype. When I drew the lid on the case, I matched the profile exactly to the case body. The lack of any gap or margin is causing the top to bow in the middle, since the PLA is not so rigid that it will press into the case completely.

    I went back into Fusion 360 and added an offset face operation to the lip, pushing it back 0.2mm from the edge of the case body. This should give me sufficient gap to allow the lid to sit flush while still maintaining a tight fit.

    I’m currently waiting on my Amazon order so that I can install the barrel jack and threaded inserts to complete the prototype. While I don’t anticipate any issues, I want to make sure everything fits before I order two more cases in ABS.

    What’s next?

    I have always enjoyed making physical things. So much of my job is to create solutions in a virtual space, it is nice to actually be able to touch and feel something that I have created. 3D printing is an interesting juxtaposition of those two worlds: I spend time modeling virtually something that the printer turns into something physical.

    For now, I am going to attack a few outdoor mounts for our Megaboom speakers. From there, who knows.

  • A little maintenance task

    As I mentioned in my previous post, I ran into what I believe are some GPU issues with my Dell 7510. So, like any self-respecting nerd (is that an oxymoron?), I ordered a replacement part from parts-people.com and got to work.

    Prep Work

    As with most things these days, you can almost always find some instructions on the internet. I found a tutorial from UFixTek on YouTube that covers a full cleanup and re-paste. The only additional step in my repair was to replace the GPU with a new one.

    With that, I setup a workstation and got to it. Over the past few years I have acquired some tools that make this type of work super helpful:

    • Precision Screwdriver Set – I have an older version of this Husky set. I cannot tell you how many times it’s saved me when doing small electronics work.
    • Pry Tool Set – I ordered this set about 4 years ago, but it hasn’t changed much. The rollup case is nice.
    • Small Slotted screwdriver – The Husky set is great, but for screws that are deep set, sometimes you need a standard screwdriver. I honestly don’t remember where I got mine, it’s the red handled one in the photos below.
    • Exact-o Knife – Always handy.
    • Cutting/Work mat – I currently use a Fiskars cutting mat from Michaels. It protects the desktop and the piece, and the grid patter is nice for parts organization.
    • Compressed Air Duster – I LOVE this thing. I use it for any number of electronics cleaning tasks, including my keyboard. It’s also powerful enough to use as an inflator tool for small inflatables.
    • Rubbing alcohol for cleaning
    • Lint free paper towels
    • new GPU
    • Thermal Paste

    Teardown

    Following the tutorial, I started disassembly, being careful to organize the screws as I went along. I used a few small Post-It tags to label the screws in case I forgot. I removed the M.2 drive, although, in retrospect, I do not think it was necessary.

    Battery, hard drive, and cover removed

    Laptops have pretty tight tolerances and a number of ribbon cables to connect everything together. The tutorial breaks down where they are, but it’s important to keep those in mind as you tear down. If you miss disconnecting one, you run the risk of tearing it.

    Keyboard and palm rest removed

    Clean up!

    Once I got down to the heatsink assembly, I removed it (and the fans) from the laptop. I gave it the same scrubbing as shown in the tutorial, except I did not have to clean my old GPU since I was installing a new one. I cannot tell you how much thermal paste was on this. It was obscene.

    I took care to really clean out the fan assemblies, including the fins. There was about 5 years of dust built up in there, and there was a noticeable reduction in airflow. I’m sure this didn’t help my thermal issues.

    Re-paste and Re-assemble!

    With everything sufficiently cleaned up and blown out, I applied an appropriate amount of thermal paste to the GPU and CPU, put the heatsink assembly back, and reversed the process to re-assemble. Again, it’s important to make note of all the connections: missing a ribbon cable or connection here will lead to unnecessary disassembly just to get it hooked back up.

    And now, we test…

    “But does it work?” There’s only one way to find out. I turned it back on, and, well, the screen came up, so that is a victory. Although, there is an integrated graphics chip… so maybe not as big a victory as I would anticipate.

    Windows 10 booted fine, and before I plugged in additional displays, I check device manager. The card was detected and stated it was functioning correctly. I plugged in my external displays (one HDMI, one mini DisplayPort -> HDMI), and they detected normally and switched over.

    I fired up FurMark to run some GPU tests and see if the new AMD works. Now, I had used FurMark on the old GPU and was unable to lock up my laptop like Fusion 360 was doing. So, running FurMark again is not a sure test, but worth running anyway.

    One thing I immediately noticed is that FurMark was reporting GPU temperatures, something that was not happening with my old GPU. That’s a good sign, right? After letting FurMark run the stress test for a while, I figured it was time to fire up Fusion 360 and try to hang my laptop.

    As with FurMark, Fusion 360 didn’t always hang the laptop. There was no one action that caused it, although, orbiting objects quickly seemed to be a trigger that caused problems more often than not. So I opened a few images and orbited them. No issues.

    Victory?

    I hesitate to declare total victory here: the GPU issue was not consistent, which means all I really know is I am back to where I started. Without some “time under tension,” I’m going to be very wary as I dig into modeling and make sure I save often. But there is promise that the change was for the better. If nothing else, the laptop got a good cleaning that it desperately needed.

  • Tech Tip – Interacting with ETCD in Rancher Kubernetes Engine 2

    Since cycling my cluster nodes is a “fire script and wait” operation, I kicked one off today. I ended up running into an issue that required me to dig a bit into ETCD in RKE2, and could not find direct help, so this is as much my own reference as it is a guide for others.

    I broke it…

    When provisioning new machines, I still have some odd behaviors when it comes to IP address assignment. I do not set the IP address manually: I use a static MAC address on the VM and then create a fixed IP for that MAC address. About 90% of the time, that works great. Every so often, though, in the provisioning process, the VM picks up an IP address from the DHCP instead of the fixed IP, and that wrecks stuff, especially around ETCD.

    This happened today: In standing up a replacement, the new machine picked up a DHCP IP. Unfortunately, I didn’t remove the machine properly, which caused my ETCD cluster to still see the node as a member. When I deleted the node and tried to re-provision, I got ETCD errors because I was trying to add a node name that already exists.

    Getting in to ETCD

    RKE2’s docs are a little quiet on actually viewing what’s in ETCD. Through some googling, I figured out that I could use etcdctl to show and manipulate members, but I couldn’t figure out how to actually run the command.

    As it turns out, the easiest way to run it is to run it on one of the ETCD pods itself. I came across this bug report in RKE2 that indirectly showed me how to run etcdctl commands from my machine through the ETCD pods. The member list command is

    kubectl -n kube-system exec <etcd_pod_name> -- sh -c "ETCDCTL_ENDPOINTS='https://127.0.0.1:2379' ETCDCTL_CACERT='/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt' ETCDCTL_CERT='/var/lib/rancher/rke2/server/tls/etcd/server-client.crt' ETCDCTL_KEY='/var/lib/rancher/rke2/server/tls/etcd/server-client.key' ETCDCTL_API=3 etcdctl member list"

    Note all the credential setting via environment variables. In theory, I could “jump in” to the etcd pod using a simple sh command and run a session, but keeping it like this forces me to be judicious in my execution of etcdctl commands.

    I found the offending entry and removed it from the list, and was able to run my cycle script again and complete my updates.

  • Jumping in to 3D Design and Printing

    As I’ve been progressing through various projects at home, I have a few 3D printing projects that I would like to tackle. With that, I needed to learn how to design models to print. This has led me down a bit of a long road, and I’m still not done….

    What to use?

    A colleague of mine who does a fair amount of 3D printing suggested the personal use version of Autodesk’s Fusion360. With my home laptop running a pretty fresh version of Windows 11, I figured it would be worth a shot. He pointed me to a set of Youtube tutorials for learning Fusion360 in 30 Days, so I got started.

    I pretty promptly locked up my machine… In doing some simple rendering (no materials, no complex build/print patterns), my machine simply locked up into a lovely pinstripe pattern. This persisted after following all of Autodesk’s recommendations, including a fresh install of Fusion360.

    Downgrading!

    Knowing that some or all of the devices on the laptop may not have appropriate Windows 11 drivers, I made the decision to re-install Windows 10 and stay there. It’s a little painful, as I have gotten somewhat used to the quirks of 11, but I want to be able to draw!

    So I installed Windows 10 fresh, got all the latest updates (including the AMD Pro software), and tried Fusion360 again. I got paste where I locked up in Windows 11, and actually got to Day 8 of the tutorials. And then the lockups came back.

    A small hiccup on my part

    I may have gotten a little impatient, and simultaneously uninstalled the AMD drivers while installing some other drivers, and I pretty much made my machine unbootable… So, I am in the process of re-installing Windows 10 and applying all the latest updates.

    As part of this, however, I am going to take things a TOUCH slower. I had Fusion360 running pretty smoothly up until my Day 8 lesson, but I also installed Windows Subsystem Linux between my Day 7 and Day 8 lessons. And while I truly hope this isn’t the case, I am wondering if something in WSL is causing issues with Fusion360…

    So I’m going to take my machine back to the same state it was in, minus the WSL install, to see if I get the same lockups in Fusion360. I’ll let you know how it turns out!

    Update – 9/18/2023

    I got everything re-installed, including drivers for my GPU, but it is still locking up. However, there is some added information: I got it to lock up outside of Fusion360 in the same way.

    I searched a number of online forums, and the suggestions seem to center around a dying GPU… Doh! So, I have a few options:

    1. Build a new system….
    2. Fix this one.

    I do not like the idea of time/money spent on a new system, especially when the specs on this laptop are more than sufficient for what I need. I found a replacement GPU today for under $100, so it is on its way. I took a peek at the installation video and I am not looking forwards to a full disassemble, but it will allow me to clean out the drives, reset the heat sinks, and hopefully solve the GPU issue.