All posts
GitHub Actions #3 Secrets, Variables, and Environments: secrets vs vars and Environment Approval Gates
The two channels for feeding secret and configuration values into workflows — secrets and vars — with the rule for choosing between them, and the priority across the organization, repository, and environment layers. We cover what log masking protects and why not to over-trust it, how environment protection rules put required reviewers and wait timers in front of deploys, and what the automatically issued GITHUB_TOKEN really is.
GitHub Actions #2 Core Syntax: Contexts, Expressions, if Conditions, and Passing Values
A systematic pass over workflow YAML syntax. We cover contexts like github, env, and steps along with expression syntax, if conditions with the success, failure, and always functions for running steps selectively, passing values between steps with GITHUB_OUTPUT, and wiring order and data between jobs with needs and outputs.
Why Processes Die of OOM with Memory to Spare: Overcommit, cgroups, the OOM Killer
Unraveling the paradox of processes dying of OOM while free shows memory remaining: how Linux overcommit promises memory and delivers it later, the difference between free and available and the page cache, the container-era OOM that kills against cgroup limits rather than the whole system (exit 137, OOMKilled), how oom_score picks the victim, confirming the cause of death with dmesg and kubectl, and designing limits and requests.
GitHub Actions #1 Anatomy of a Workflow: Events, Jobs, Runners, and Your First Run
Automating the tests and builds you have been repeating by hand on every push. We map out the five concepts that make up GitHub Actions — workflow, event, job, step, runner — write a first workflow that runs Python tests, and learn to read results in the Actions tab, add a status badge, survey the trigger events, and understand the runner free-tier basics.
NumPy Fundamentals: Why Arrays Beat Python Lists, and How to Use Them
NumPy, the foundation of Python data work, from first principles: the memory layout that makes Python lists inherently slow and how ndarray fixes it, vectorized operations that eliminate loops, the broadcasting rules that let differently-shaped arrays compute together, the trap of slices being views rather than copies, reading aggregations through the axis concept, and the cases where NumPy is the wrong tool.
Getting Started with Teams Bots: Where Bot Framework Ends and Graph API Begins
The building blocks of a conversational bot in Teams: why the Graph API alone cannot substitute for a bot (bot identity and application-permission limits), the bot architecture of an Azure Bot resource plus a messaging endpoint, proactive messages that reach users before they ever talk to the bot via conversation references and proactive installation, RSC permissions for reading channel messages without a mention, and Adaptive Cards — the road from notification bots to conversational ones.
Recovering a Deleted terraform.tfstate: Backup File, S3 Versioning, and Re-import in Order
Starting with the symptoms of a missing state file and why you must not apply in that condition. We walk the recovery paths in priority order — checking the local terraform.tfstate.backup, the commands to restore a previous version from S3 versioning, and the last-resort path of rebuilding state with import when no backup exists — then cover the backend settings that structurally prevent the same accident.
How to Use terraform import: Bringing Existing Resources into Code with import Blocks
The procedure for bringing console-created resources under Terraform management, based on import blocks. Where to find each resource type's import ID, how to generate a code draft with -generate-config-out, how to adjust the code until plan shows no changes, the differences from the old CLI command approach, and the order to follow when importing multiple resources at once.
Power Automate vs Graph API: Which One for Which Automation Job
Comparing the two roads to Microsoft 365 automation: what the low-code connector-assembly tool Power Automate does well versus calling the Graph API directly in code, Power Automate strengths in triggers, approval flows, and citizen development, its limits at volume, complexity, and version control, the hidden variables of premium connectors and licensing, and the practical division of labor for mixing both.
Automating Excel Reports with Microsoft Graph: Sessions, Tables, Chart Images
The Graph workbook API that reads and writes Excel files without opening them: the three session modes and what persistChanges means, eliminating the per-call file reopen cost, reading data with usedRange and appending rows through tables, creating charts and extracting them as images for reports, the delegated-permission-centric constraint peculiar to the Excel API and its practical workarounds, plus operational cautions like session expiry and retries.
Fixing the terraform state lock Error: Finding the Cause and When to Use force-unlock
Starting with how to read the Lock Info block in the "Error acquiring the state lock" message. We cover the check procedure that separates the normal case — a teammate or CI is mid-run — from the abnormal one where a crashed run left a stale lock, the conditions under which force-unlock is safe and why misusing it corrupts state, plus where to look when the lock lives in DynamoDB and the settings that prevent recurrence.
Terraform Operations #7 OpenTofu and Licensing: The BSL Switch, the IBM Acquisition, and How to Choose
We walk the timeline from the 2023 BSL license switch and the OpenTofu fork to the CNCF acceptance and the completed IBM acquisition of HashiCorp. We cover what the BSL actually prohibits and why it is irrelevant to most users, where the two tools have diverged, how to choose based on your situation and what to check before migrating — and close out the Terraform track with a note on the Associate certification.