while(motivation <= 0)

My weekend with Claude
This weekend, after Anthropic told Lord Farquad to kick rocks, I decided to try out Claude Code Pro. Wow. I've been using a lot of Amazon Q integrated with VS Code, which was twice as productive as CoPilot. Claude Code is 3x more productive than Amazon Q. It's interesting how much further ahead Anthropic's native tools are when, under the hood, Amazon and Microsoft are both using Claude's models. Using Claude's code was like having a recently certified junior engineer at your disposal. It could use the CLI to query logs and process the results; it uses the CLI directly to implement fixes and diagnose errors. With Claude's help, I took an existing application and over the weekend rewrote it into a new, cheaper-to-maintain app.
my claude usage after a full weekend
Local AI disapointment and tight groupings
PyCharm now supports adding local models to its AI tooling. setup local ai
I gave it a try today with LM Studio and a 48GB Deepseek model. It looked promising at first, but it never finished any of the prompts.running model
My laptop should have the resources to run a bigger model, but it was quite slow with this model. In other news, after renting a Walther PDP compact with a nice Holosun optic, which was fine. I managed to get the tightest grouping at five yards that I’ve ever shot with my Glock.
best grouping I've shot in 700 rounds of 9mm with my Glock.
Finding the maximum bid for achiving a specific discount over retail

So this weekend, I set about solving a problem that was bothering me. When purchasing a pewpew at auction, what should the maximum bid be, assuming we want a specified percentage discount off the retail new price for a given item?

Building on an existing formula I had worked out to calculate the savings percent over retail, I started working backwards.

Assumptions

  • Auction items will require shipping
  • Auction items will include tax plus an auction fee
  • Auction items may or may not have shipping insurance
  • Auction items will have a credit card payment fee
  • Retail price will not include shipping
  • Average Sale price info available online won’t include shipping, insurance, or credit card fees.

Variables

a table of variables
With the variables defined, now we can work backwards and then solve for the bid. excel sheet formulas
Last but not least, while solving for B, I tried a number of AI assistants. The winner ended up being ChatGPT, which was able to isolate B on the left side of the equation.
max bid formula
Reflections on 2025

As I reflect on the absolute chaos that is 2025, I’m a bit taken aback by how much has changed this year compared to previous years. I lost a boss I liked, a gentleman who was the best engineer on my team, whom I thought would outlast me. The world has also been more chaotic than average. On the brighter side, I’m grateful for the new friends I’ve made this year.

For my midlife crisis, I’ve taken up shooting sports. When I was a kid, I was always shooting my bb/pellet guns, bows, and arrows. Even poked a few holes with arrows in my parents' aluminum siding. For me, shooting at the range has turned the volume down on a lot of my older vices, such as gaming.

2026 will be the year of Kubernetes for me at work. Here is hoping 2026 > 2025.

Hardware Upgrade and Proxmox 9.1
With the retirement of another data center stack, I had the opportunity to refresh a piece of iron. I ended up choosing to replace an R530 with eight 3.5-inch drives and the oldest IDRAc in my lab. Thankfully, this time the server arrived from FedEx with only slightly bent rails. I upgraded the server from Windows 2022 to 2025, played around with Windows for a few days, and then decided to try out Proxmox 9.1. Proxmox has come a long way since Proxmox seven. While trying to move virtual machines around after getting my NFS servers, I was seeing the strangest behavior. It turned out that I had plugged in an Ethernet 5e into a ten-gigabit Ethernet. Everything looked fine, but the connections were volatile. The next step in my virtualization adventure was to migrate and upgrade a licensed Windows 10 VM. Once my network situation was resolved, it was just a matter of time before I was able to offload the VM and its drive and get them on the new host. After some Windows updates, I set about getting it upgraded to Windows 11. The process involved:
  • Adding a virtual TPM
  • Adding a virtual EFI Disk
  • Switched the BIOS to OVMF
  • Used a win 11 usb drive, cleaned up some bad entries in the MBR
  • Repaired the MBR
  • Converted the disk to GPT using MBR2GPT
  • Ran the Windows 11 PC check and verified that everything is order
  • Upgraded to Windows 11
Fathers day weekend with OKTA
This Father's Day weekend, I decided to play around with OKTA as an identity provider for my various creations. I spent half a day messing with AI and the Okta SDK and getting virtually nowhere. After a break, I went back and started fresh the old-fashioned way, quickly made progress, found the system logs in Okta, and promptly was in business. My blog now supports logging in to the admin interface with OKTA. Today, I picked up where I had left off, retooled a bit of devops automation for my hosting environment, and started working on user authentication into OKTA from Python. Once again, today, Google was the most useful resource, and I found the documentation page I needed to authenticate a user against OKTA.

from getpass import getpass
import requests
import json
import os
import logging


logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
username = "colin@cmh.sh"
password = getpass()
session = requests.Session()
session.headers.update({
    'Accept': "application/json",
    'Content-Type': "application/json",
    'Cache-Control': "no-cache",
})



url_authn = f"{os.environ.get("OKTA_ORG_URL")}/api/v1/authn"
logger.info(f"auth URL: {url_authn}")
payload_authn = json.dumps({
    "username": username,
    "password": password,
    "options": {"warnBeforePasswordExpired": True,
                "multiOptionalFactorEnroll": True},
})
response = session.post(url_authn, data=payload_authn)
logger.info(f"auth response: {response.text}")
resp_obj = json.loads(response.text)
if resp_obj["status"] != "SUCCESS" and resp_obj["status"] != "MFA_REQUIRED":
    logger.error(f"auth response: {resp_obj["status"]}")
    raise "Login failed"
if resp_obj["status"] == "MFA_REQUIRED":
    factors = resp_obj["_embedded"]["factors"]
    logger.info(f"factors: {factors}")
    factorId = getpass(prompt="factor id: ")
    mfa_otp_url = f"{os.environ.get("OKTA_ORG_URL")}/api/v1/authn/factors/{factorId}/verify"
    #https://developer.okta.com/docs/reference/api/authn/#verify-totp-factor
    otp = getpass(prompt="OTP:")
    mfa_payload = json.dumps({
        "stateToken": resp_obj["stateToken"],
        "passCode": otp
    })
    logger.info(f"MFA URL: {mfa_otp_url}")
    mfa_resp = session.post(url=mfa_otp_url, data=mfa_payload)
    logger.info(f"mfa response: {mfa_resp.text}")
    resp_obj = json.loads(mfa_resp.text)
    if resp_obj["status"] != "SUCCESS":
        logger.error(f"mfa response: {resp_obj["status"]}")
        raise "MFA failed"
logger.info(f"Successfully logged into okta. sessionToken: {resp_obj['sessionToken']} userID: {resp_obj['_embedded']['user']['id']}")

The year is flying by
It’s been a minute. I started messing around with terraform and server-less tech to host my bs. What I’ve discovered is that for the cost of a nat-gateway I could just have a project box thats always-on. Even with the cost of storage, it’s still cheaper with Ris than a Nat-gateway and server-less tech. I haven’t spent much time on tech projects since my last post honestly though. I’ve mostly been playing R.E.P.O. with a team from Discord. So right now my online empire is still running on an ec2 in docker containers. This is quite cost efficient, but still requires regular maintenance. Going serverless scales better but is not cheaper on the onset. For my work I need to explore more use of terraform as it relates to EKS, but the EKS is a minimum of $70 a month for the control plane and I’ve heard estimates on reddit that it’s minimum footprint is around $400 a month which is WAY Over my $50/mo budget for my aws hosted bs. This weekend I did some house cleaning on my subnets and fixed some long standing issues. I then set about creating a health check lambda that can be used to check the health and access of my websites resources. I still need to integrate it into my existing lambda terraform project, but that will be for another weekend.
Fully automated K3S hosting
Adventures in K3S in 2025
Slick loading of environmental variables into bash
Adventures in NginX
New year new personal development
AWS Auto Scaling Groups
Post reinvent adventures
AWS Reinvent 2024 personal recap
AWS EventBridge debuging
AWS ECS Tasks remuxing mov to mp4
docker remuxing worker process
Projects for the upcoming Holiday break
Adventures in C++ SDK hell
Implementing WatchTower in python flask
looping through a csv 4 ways
Raphael web source update
Taxonomy, tagging, and topics oh my
secrets manager, sftp, plucking missing files out of two lists of files
multi server deployments, health checks, edit links oh my
Switching a git repo from https to ssh
bash vs sh
multi node flask web server
resizing images with python and opencv
Raphael gets threading for a flask web server
devops now
new blog engine now live
the end
Cheese on the bottom omlet and the end of an era
bulk comparing files by sha256
adding numbers with awk
Dynamic code generation to save time
A week of trial by fire
One Time secret clone and dockerization
Syncing data from the old blog to the new blog
flask templates and orm updates
Lego F1 Shadowbox Build
Raphael bot obs scene switching
Economics of transcription
Adventures in PHP
Social tooling
Raphael bot update
Twtich Raphael_bot
new year new data
terraform vs kubernetes an under the weather Saturday
Viral voice over
now with kekywords for seo
Chunky Cutting boards weekend 2
Chunky Cutting boards weekend 1
Thick cutting board planning
Hammer time
Adobe Fresco
adventures in base javascript and html
new login testing
wysiwyg test 1
admin now with banhammer
blog admin interface
2023 Year of the linux laptop
adventures in ceph
Hello World