All posts

GitHub Actions #3 Secrets, Variables, and Environments: secrets vs vars and Environment Approval Gates
5 min read

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
5 min read

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
5 min read

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
5 min read

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
6 min read

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
5 min read

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
5 min read

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
5 min read

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
4 min read

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
5 min read

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
4 min read

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
5 min read

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.