<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Brian Mehrman</title>
    <link>http://brianmehrman.com/</link>
    <description>Recent content on Brian Mehrman</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 01 Jan 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="http://brianmehrman.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Diagram Builder</title>
      <link>http://brianmehrman.com/portfolio/diagram-builder/</link>
      <pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate>
      <guid>http://brianmehrman.com/portfolio/diagram-builder/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Diagram Builder is an open-source code visualization platform built to make large codebases navigable. It parses repositories into a dependency graph, renders them in both 2D and 3D layouts, and exports to multiple formats.&lt;/p&gt;
&lt;h2 id=&#34;what-it-does&#34;&gt;What It Does&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository parsing&lt;/strong&gt; — scans source files and builds a typed dependency graph of modules, classes, and functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2D and 3D layouts&lt;/strong&gt; — force-directed and radial-BFS algorithms render the graph at different levels of abstraction&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Semantic tiered views&lt;/strong&gt; — zoom from architecture-level down to individual module dependencies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Export&lt;/strong&gt; — outputs to JSON, SVG, and image formats for documentation and diagramming tools&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-it-was-built&#34;&gt;How It Was Built&lt;/h2&gt;
&lt;p&gt;Built using an agent-driven development workflow with Claude Code and the Anthropic SDK. Most of the core graph logic and Three.js rendering pipeline was developed through iterative agent sessions, with human oversight on architecture decisions and API design.&lt;/p&gt;</description>
    </item>
    <item>
      <title>On-Demand Kubernetes Test Environments</title>
      <link>http://brianmehrman.com/portfolio/kubernetes-test-environments/</link>
      <pubDate>Sat, 01 Apr 2023 00:00:00 +0000</pubDate>
      <guid>http://brianmehrman.com/portfolio/kubernetes-test-environments/</guid>
      <description>&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Basis Technologies ran shared long-lived integration environments. Engineers queued up, stepped on each other&amp;rsquo;s changes, and environment contention was a constant source of delays. Setting up a fresh environment could take days — sometimes weeks if infrastructure issues arose.&lt;/p&gt;
&lt;h2 id=&#34;the-solution&#34;&gt;The Solution&lt;/h2&gt;
&lt;p&gt;I designed and led the build of an on-demand full-stack environment system on AWS EKS. Each environment runs the full platform stack: application services, data warehouse, event streaming, and persistent storage.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Company-Wide CI/CD Pipeline Standard</title>
      <link>http://brianmehrman.com/portfolio/cicd-pipeline-standard/</link>
      <pubDate>Wed, 01 Jun 2022 00:00:00 +0000</pubDate>
      <guid>http://brianmehrman.com/portfolio/cicd-pipeline-standard/</guid>
      <description>&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Engineering teams at Basis were building and maintaining their own CI/CD pipelines independently. There was no standard. Pipelines varied in quality, lacked consistent artifact management, and created ongoing maintenance burden for each team.&lt;/p&gt;
&lt;h2 id=&#34;the-solution&#34;&gt;The Solution&lt;/h2&gt;
&lt;p&gt;I designed and authored the company-wide CI/CD pipeline standard — a 14-stage pipeline that became the default for all engineering services.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The 14-stage pipeline includes:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Source checkout&lt;/li&gt;
&lt;li&gt;Dependency installation&lt;/li&gt;
&lt;li&gt;Static analysis / linting&lt;/li&gt;
&lt;li&gt;Unit tests&lt;/li&gt;
&lt;li&gt;Integration test trigger&lt;/li&gt;
&lt;li&gt;Docker multi-stage build&lt;/li&gt;
&lt;li&gt;Image tagging (semantic versioning)&lt;/li&gt;
&lt;li&gt;Security scanning&lt;/li&gt;
&lt;li&gt;Artifact registry push&lt;/li&gt;
&lt;li&gt;Staging deploy&lt;/li&gt;
&lt;li&gt;Smoke tests&lt;/li&gt;
&lt;li&gt;Production deploy gate&lt;/li&gt;
&lt;li&gt;Production deploy&lt;/li&gt;
&lt;li&gt;Post-deploy verification&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Three deployment modes:&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ruby Code Blocks</title>
      <link>http://brianmehrman.com/blog/ruby-code-blocks/</link>
      <pubDate>Sun, 13 Jan 2019 00:00:00 -0500</pubDate>
      <guid>http://brianmehrman.com/blog/ruby-code-blocks/</guid>
      <description>&lt;h1 id=&#34;code-blocks&#34;&gt;Code Blocks&lt;/h1&gt;
&lt;p&gt;Ruby code blocks are from the closure family&lt;/p&gt;
&lt;p&gt;Ruby blocks are found throughout ruby. They are a powerful feature that allow
you to pass snippets of code to enumerable methods (e.g. each, select, detect)
as well as custom methods useing the yield keyword.&lt;/p&gt;
&lt;p&gt;Blocks are nothing new, they use the computer science concept called closures.
This concept was invented by Peter J. Landin in 1964. Closures were adopted by
a version of a Lisp called Scheme in 1975.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Postgresql Record Locking</title>
      <link>http://brianmehrman.com/blog/database-record-locking/</link>
      <pubDate>Sat, 23 Jun 2018 00:00:00 -0500</pubDate>
      <guid>http://brianmehrman.com/blog/database-record-locking/</guid>
      <description>&lt;h1 id=&#34;database-lock-modes&#34;&gt;Database Lock Modes&lt;/h1&gt;
&lt;p&gt;Postgresql provides different locking modes to control concurrency within the database.
Locks are automatically acquired by most Postgres commands to make sure tables are not
dropped or modified while a command is executed. Locks can also be acquired manually
for application level control.&lt;/p&gt;
&lt;p&gt;ActiveRecord provides the interface between the Rails application and the database.
Using ActiveRecord we can create these database level locks.&lt;/p&gt;
&lt;h2 id=&#34;setup&#34;&gt;Setup&lt;/h2&gt;
&lt;p&gt;For the examples in this post we will be using the following data setup with a new Rails application.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Optimistic vs Pessimistic Locking</title>
      <link>http://brianmehrman.com/blog/optimistic-vs-pessimistic-locking/</link>
      <pubDate>Tue, 29 May 2018 00:00:00 -0500</pubDate>
      <guid>http://brianmehrman.com/blog/optimistic-vs-pessimistic-locking/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Data integrity is at risk once two sessions begin to work on the same records…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Martin Fowler&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;optimistic-locking&#34;&gt;Optimistic Locking&lt;/h1&gt;
&lt;p&gt;Is a data access strategy where it is assumed that the chance of conflict between sessions is very low. Changes from one session are validated before being committed to the database.&lt;/p&gt;
&lt;h1 id=&#34;pessimistic-locking&#34;&gt;Pessimistic Locking&lt;/h1&gt;
&lt;p&gt;This an opposing data access strategy assumes that conflicts between sessions is highly likely. Conflicts are prevented by forcing all transactions to obtain a lock on the data (record or table) before it can start to use it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git Tips</title>
      <link>http://brianmehrman.com/blog/git-tips/</link>
      <pubDate>Tue, 06 Feb 2018 00:00:00 -0500</pubDate>
      <guid>http://brianmehrman.com/blog/git-tips/</guid>
      <description>&lt;h1 id=&#34;git&#34;&gt;Git&lt;/h1&gt;
&lt;p&gt;Git is a free version control system designed for both small and large projects.&lt;/p&gt;
&lt;h1 id=&#34;tips&#34;&gt;Tips&lt;/h1&gt;
&lt;h2 id=&#34;rebase&#34;&gt;Rebase&lt;/h2&gt;
&lt;p&gt;Whenever I am working on a project with other developers I find that I need to rebase
my feature branch with the common branch the rest of the team is using. This branch
is usually called &lt;code&gt;dev&lt;/code&gt; or &lt;code&gt;ci&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ git fetch
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To make sure I have the latest branches I run a &lt;code&gt;fetch&lt;/code&gt; to update all my local branches.&lt;/p&gt;</description>
    </item>
    <item>
      <title>class_eval vs define_method</title>
      <link>http://brianmehrman.com/blog/class-eval-vs-define-method/</link>
      <pubDate>Wed, 26 Apr 2017 00:00:00 -0500</pubDate>
      <guid>http://brianmehrman.com/blog/class-eval-vs-define-method/</guid>
      <description>&lt;h1 id=&#34;meta-programming&#34;&gt;Meta Programming&lt;/h1&gt;
&lt;p&gt;Having to write redundant methods can lead to hundreds of lines of code that can
be hard to maintain. Meta programming provides us with tools that allow us to write
code that writes its self.&lt;/p&gt;
&lt;h1 id=&#34;class-eval&#34;&gt;Class Eval&lt;/h1&gt;
&lt;p&gt;class_eval opens the class and adds the method to the class itself. While this takes
longer to define a method it puts the new method in the ancestor chain where it can
be accessed quicker than if you used define_method.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>http://brianmehrman.com/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>http://brianmehrman.com/about/</guid>
      <description>About Brian Mehrman — Platform Engineer, Architect, Mentor</description>
    </item>
    <item>
      <title>Resume</title>
      <link>http://brianmehrman.com/resume/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>http://brianmehrman.com/resume/</guid>
      <description>Resume — Brian Mehrman, Principal Software Engineer</description>
    </item>
  </channel>
</rss>
